パカパカパカリンコタウン

黒歴史や生き恥を切り売り

Dropboxがインストールできなくなった話

Dropboxのローカル同期フォルダ内のファイルを開こうとしたところ、

パッケージの更新、依存関係、または競合の検証に失敗しました。

というエラーが出て、ファイルが開けなくなった。

Dropbox側の問題かと思い、一度アンインストール。


しかし、その後Dropboxを再インストールしようとしても、通常インストーラーでもオフラインインストーラーでも失敗した。

通常インストーラーでのメッセージ。

オフラインインストーラーのメッセージ

 

最初はDropboxの残骸が原因かと思い、念のためWindowsのシステムファイルチェックも試した。

DISM.exe /Online /Cleanup-image /Restorehealth
sfc /scannow

 

そのほか、Dropbox関連フォルダの退避や、DropboxUpdate関連のレジストリ削除も試したが改善せず。

ログを確認すると、Dropboxのインストーラー自体が単純に落ちているというより、Windows側のAppX/MSIX系のパッケージ処理で失敗しているように見えた。

最終的には、AppX関連サービスの状態確認と、Microsoft Storeのキャッシュリセットを実行した。

wsreset.exe

 

その後、Dropboxのインストールが成功した。

実際にはDropbox本体というより、Windows側のAppX/MSIX系のパッケージ管理まわりで詰まっていたっぽい。
そんなことが……。


なんか狐につままれる感があるのですが、とりあえず、私はこんなことが起きていました。
はえー

そして、ファイルも開けるようになりました。

芝公園の宝珠院、さんすくみのカエル、ヘビ、ナメクジを探した。

 

芝公園の宝珠院に行ってきました!

 

端っこに、気になるカエルの像が。

すごい存在感を放ってる。

 

 

なぜこんなところにと思ったら、

さんすくみの再現を境内でやっているとのこと。

 

確かにへびの絵馬みたいなのがある。

 

と思ったら下にありました。蛇の像。

 

とぐろの中に小さいヘビがいっぱいいて可愛い。

 

もう一つ、ナメクジがあるはずだと、地面に注目して境内を散策していたのですが、見当たらず、諦めかけた時に発見。

この石柱でした。

 

表面に描かれてる。

掘られてる。

てっきり、同じように像があると思ってたから、全然気づかなかった。

 

でも、これでさんすくみクリアです。

 

ついでに、

子育水子地蔵。

 

 

 

日本はちいかわに支配されつつある

 

 

 

 

 

 

 

 

 

 

ios26.3だと文字化けする。

Cordovaを勉強しようと、とりあえずシミュレータで動かせるようにしてみたところ。

テスト的に、ボタンを押すだけのものを作ったら文字化けした。

 

スクリプトと表示は以下

App.vue

<template>
  <div style="text-align: center; margin-top: 50px;">
    <h1>テストうおおお</h1>
    <button @click="onClick"><span>ボタン</span></button>
  </div>
</template>

<script setup>
const onClick = () => {
  alert('ボタンが押されました!')
}
</script>

 

 

 

原因としては、シミュレータの iOS 26.3のバグでした。

どうやらシステムで設定したフォントが日本語だと文字化けしてしまいます。

apple - systemで指定とかするとダメっぽい。

なので、フォントをこれを絶対使います!とするとちゃんと表示されました。

 

App.vue

<template>
  <div style="text-align: center; margin-top: 50px;">
    <h1>テストうおおお</h1>
    <button @click="onClick"><span>ボタン</span></button>
  </div>
</template>

<script setup>
const onClick = () => {
  alert('ボタンが押されました!')
}
</script>

<style scoped>
button {
  /* iOS文字化け回避フォント */
  font-family: "Helvetica Neue", "Helvetica", "Arial", "Lucida Grande", "Hiragino Sans", "Hiragino Kaku Gothic ProN", sans-serif !important;
}
</style>

 

 

 

 

 

検索したら、同じような話がいっぱい出てくる。

まさかios側の問題だったとは・・・

しかも26.4にてサイレントで修正された模様。

所詮日本語なんて極東の文字なんだなというのを思い知らされる・・・

 

qiita.com

 

 

plat.io

 

 

 

ゆるゆる八丈島旅行の記録。

行ってきました八丈島。

 

 

 

おじゃりやれ!

空港に、おじゃりやれの文字がいっぱいあって圧が強かった。

 

道にヤシの木的なのがある。

植生が完全に南国って感じ。

東京とは思えなくて面白い。

 

2025年10月に大きな台風被害があったとのことで、通行止めになっているところもあった。

ですが、見た感じかなり復旧していてお疲れ様ですと言いたい。

 

猫🐈

 

大里の玉石垣

「大里の玉石垣」に来ました。

本当に綺麗なところでした。

 

 

「流刑人がおにぎり1個と交換で石を運んだ」という話もあって面白い……と思ったら、
歴史民俗資料館のサイトでは「昭和40年代ごろの離島ブーム時に創作されたともいわれる」と書かれていて、ややこしいってなっている

 

 

無電柱化が進められてるらしい。

 

玉石がちょこちょこ崩れているところあった。

台風の影響だろうか?

玉石垣は足掛けやすそうだから、悪ガキ小学生時代の私なら登ってたと思う。

でも、崩れる危険性を考えると登るのは絶対ダメなやつですね。

 

優婆夷宝明神社

八丈島の総鎮守、つまり島全体を守る中心的な神社とされる場所。

この神社も玉石垣で囲われていて綺麗。

 

 

由緒書き

 

 

手水屋

 

本殿

 

 

紙垂と小さい恵比寿様

 

裏手

 

 

八丈ピーコック

ぼろぼろで渋い佇まいだった。

 

 

大坂

名前の通り、大きな坂。

ここはかつて島最大の交通の難所だったそうです。納得。

めっちゃ長い坂でした。

 

 

大坂夕照

大坂の頂上付近です。

景色がとても良かった。

 

砲台跡

大坂の頂上のトンネル付近に謎の穴があった。

後で戦時中の砲台の跡だとわかった。

 

 

人捨て穴

樫立の看板を山側に行くと人捨て穴にいきます。

 

道の脇を見るとアシタバが生えてて、流石特産品ってなった。

 

人捨て穴の看板。

桜綺麗。

 

この坂道を登れば見えてきます。

 

途中の道

 

意外と小さいし、横長。

 

お地蔵さんが一個あるだけでした。

お茶がいっぱいお供えられてた。

 

捨てられた人が、ここで生きていけたとは思えないな。

 

 

銀河荘

ここにお泊りしました。

 

すごく眺めがよかった

 

八丈島の猫学イベント

2月22日の八丈島のイベント行ってきました。

こういうイベント初めてだったのですが、楽しかった。ご飯も用意されてるし、公開録音もあるし、参加型で探検やディベートや飲み会やらがあって、わちゃわちゃできて良い経験でした。

 

これが出てきた食べ物。



 

 

youtu.be

 

youtu.be

 

 

昭和10年頃、中ノ郷にて赤ん坊がいなくなる事件があったという話が以下のサイトで確認できる。

 

お婆さんが子供の頃、(昭和10年頃)中ノ郷の集落から、生まれたばかりの赤子がいなくなる事件があったそうです。

この赤ん坊はそのテッチメに連れて行かれたとか、お乳をもらっていたとか言われたそうです。

ranyuen.com

 

この話は「八丈島の猫学」同じ話が書かれていていたのですが、微妙に違うところがあった。

引用すると以下と書かれてた。

男の子にどうやってここに来たかと聞くと「おんぶさって来た」、何を食べていたと聞くと、うどんだったと言う。

山猫が子供を連れ去りミミズでも食べさせていたのだろうか。

 

お乳がうどん(実態はミミズ)に変わっている。

このことを作者のえいこばさんに、「お乳とかうどんとか食べたものに揺れがありますけど、いろんな説があったりするのですか?」と尋ねてみました。

 

「猫のお乳だけじゃ赤子が生きてけないでしょ。想像力を働かせなさい」と言われた。

質問の答えになってねぇよ!と思ったが、こうやって伝わっていくときに、その人の感覚も混ざるのも民話かと思い、「なるほどです~。」と返しておきました。

 

他の面白かったもの

足場を石で高くしている建物。

これ、今の建築基準だとダメだから、リフォームとかあったらなくなるから、今でしか見れないものだそうです。

 

この藍ヶ江漁港の近くにあった鳥居が面白かった。

パイプでできている。

潮風で劣化しない。とてもいい。

 



 

 

 

clusterにVRChatで使っているミルティナちゃんをアップロードしようとして手こずったメモ

私は普段VRChatでミルティナちゃんをケモ改変して使ってます。

このたび、clusterに出向く用事ができたので、アバターアップロードのためVRM化をしてたのですが、

VRMにしてアップロードしてみると・・・

失敗!!

 

ポリゴン数はまぁオーバーしているだろうなと思っていましたが、

morphTargetっていうのはなんぞやと。

Blenderでいうシェイプキー、UnityでいうBlendShape相当のものとのこと。

 

booth.pm

 

ミルティナちゃんは表情調整シェイプキーだけでも、658種類あるからそれでオーバーじゃん!

 

 

教えてもらった方法としては、こちら。

 

AAO: Avatar Optimizer

https://vpm.anatawa12.com/avatar-optimizer/ja/#installation

 

 

アバターのオブジェクトにAddComponentから、「AAOTraceAndOptimize」をアタッチして、

ModularAvatarのManualBakeAvatarを押せば

なんか色々統合されたのができている!


なんかBlendShapesも減って、統合??されたものになってる!

すごい!

 

AAO Trace and OptimizeつけてModularAvatarのManual Bake Avatarすれば、いろいろ適応されたアバターが別で出来上がるの知らなかった・・・

 

そしてポリゴンを減らすのは、服や靴をはぎ取って対応しました。

悲しいね。でもケモだから靴は履いてなくてもいいよね。

 

この生成されたアバターをVRMでエクスポートして、

clusterにアップロード!!

 

できた!

なんか表示されている画像がぐちゃぐちゃ!!

 

 

でも一応ちゃんとVRで動かした感じ大丈夫そう。

 

余談ですが、BlendShapesを削除できるの知らなかったので、教えてもらうまではChatGPTに削除するスクリプト作らせてそれで対処してました。

 

以下がBlendShapesを削除するスクリプト。

 

using UnityEditor;
using UnityEngine;

public static class RemoveBlendShapesByPrefix
{
    // 削除したい先頭文字列。大文字小文字は無視します。
    private static readonly string[] RemovePrefixes =
    {
        "tongue",
        "brow",
        "shrink",
        "mouth",
        "tooth",
        "pupil",
        "eye_under",
        "eyebrow",
    };

    [MenuItem("Tools/Avatar/Remove BlendShapes By Prefix From Selected")]
    private static void Remove()
    {
        var go = Selection.activeGameObject;
        if (go == null)
        {
            Debug.LogError("SkinnedMeshRenderer が付いたオブジェクトを選択してください。");
            return;
        }

        var smr = go.GetComponent<SkinnedMeshRenderer>();
        if (smr == null || smr.sharedMesh == null)
        {
            Debug.LogError("選択中オブジェクトに SkinnedMeshRenderer / sharedMesh がありません。");
            return;
        }

        var src = smr.sharedMesh;
        var dst = Object.Instantiate(src);
        dst.name = src.name + "_RemovedSelectedBlendShapes";

        int vertexCount = src.vertexCount;

        var deltaVertices = new Vector3[vertexCount];
        var deltaNormals = new Vector3[vertexCount];
        var deltaTangents = new Vector3[vertexCount];

        dst.ClearBlendShapes();

        int kept = 0;
        int removed = 0;

        for (int shapeIndex = 0; shapeIndex < src.blendShapeCount; shapeIndex++)
        {
            string shapeName = src.GetBlendShapeName(shapeIndex);

            if (ShouldRemove(shapeName))
            {
                Debug.Log($"Remove BlendShape: {shapeName}");
                removed++;
                continue;
            }

            int frameCount = src.GetBlendShapeFrameCount(shapeIndex);

            for (int frameIndex = 0; frameIndex < frameCount; frameIndex++)
            {
                float frameWeight = src.GetBlendShapeFrameWeight(shapeIndex, frameIndex);

                src.GetBlendShapeFrameVertices(
                    shapeIndex,
                    frameIndex,
                    deltaVertices,
                    deltaNormals,
                    deltaTangents
                );

                dst.AddBlendShapeFrame(
                    shapeName,
                    frameWeight,
                    deltaVertices,
                    deltaNormals,
                    deltaTangents
                );
            }

            kept++;
        }

        string path = EditorUtility.SaveFilePanelInProject(
            "Save Mesh Without Selected BlendShapes",
            dst.name + ".asset",
            "asset",
            "保存先を選んでください"
        );

        if (string.IsNullOrEmpty(path))
        {
            Object.DestroyImmediate(dst);
            return;
        }

        AssetDatabase.CreateAsset(dst, path);
        AssetDatabase.SaveAssets();

        Undo.RecordObject(smr, "Remove BlendShapes By Prefix");
        smr.sharedMesh = dst;
        EditorUtility.SetDirty(smr);

        Debug.Log($"BlendShape削除完了: mesh={src.name}, kept={kept}, removed={removed}, before={src.blendShapeCount}, after={dst.blendShapeCount}");
        Debug.Log($"Saved: {path}");
    }

    private static bool ShouldRemove(string shapeName)
    {
        string lower = shapeName.ToLowerInvariant();

        foreach (string prefix in RemovePrefixes)
        {
            if (lower.StartsWith(prefix.ToLowerInvariant()))
            {
                return true;
            }
        }

        return false;
    }
}

 

 

あとポリゴンを減らすスクリプト

 

using UnityEditor;
using UnityEngine;
using UnityMeshSimplifier;

public static class SimplifySelectedSkinnedMesh
{
    // 0.85 = 15%くらい削る目安。まずは弱め推奨。
    private const float Quality = 0.85f;

    [MenuItem("Tools/Avatar/Simplify Selected SkinnedMesh")]
    private static void Simplify()
    {
        var go = Selection.activeGameObject;
        if (go == null)
        {
            Debug.LogError("SkinnedMeshRenderer が付いたオブジェクトを選択してください。");
            return;
        }

        var smr = go.GetComponent<SkinnedMeshRenderer>();
        if (smr == null || smr.sharedMesh == null)
        {
            Debug.LogError("選択中オブジェクトに SkinnedMeshRenderer / sharedMesh がありません。");
            return;
        }

        var src = smr.sharedMesh;

        Debug.Log($"Before: {src.name}, triangles={GetTriangleCount(src)}, blendShapes={src.blendShapeCount}");

        var simplifier = new MeshSimplifier();
        simplifier.Initialize(src);

        // 穴あき防止寄りの設定
        var options = SimplificationOptions.Default;
        options.PreserveBorderEdges = true;
        options.PreserveUVSeamEdges = true;
        options.PreserveUVFoldoverEdges = true;
        simplifier.SimplificationOptions = options;

        simplifier.SimplifyMesh(Quality);

        var dst = simplifier.ToMesh();
        dst.name = src.name + "_Simplified_" + Mathf.RoundToInt(Quality * 100);

        string path = EditorUtility.SaveFilePanelInProject(
            "Save Simplified Mesh",
            dst.name + ".asset",
            "asset",
            "保存先を選んでください"
        );

        if (string.IsNullOrEmpty(path))
        {
            Object.DestroyImmediate(dst);
            return;
        }

        AssetDatabase.CreateAsset(dst, path);
        AssetDatabase.SaveAssets();

        Undo.RecordObject(smr, "Replace Skinned Mesh");
        smr.sharedMesh = dst;
        EditorUtility.SetDirty(smr);

        Debug.Log($"After: {dst.name}, triangles={GetTriangleCount(dst)}, blendShapes={dst.blendShapeCount}");
        Debug.Log($"Simplified mesh saved: {path}");
    }

    private static int GetTriangleCount(Mesh mesh)
    {
        int count = 0;
        for (int i = 0; i < mesh.subMeshCount; i++)
        {
            count += mesh.GetTriangles(i).Length / 3;
        }
        return count;
    }
}

 

 

cordova-android 14でcordova-plugin-firebasexを入れたらCrashlyticsでビルドエラーになった話

cordova-android: 10.0.0 → 14.0.0
android API レベル 35
の環境でCordova-plugin-firebasexを入れてビルドしたら以下のエラー

 

FAILURE: Build completed with 2 failures.

1: Task failed with an exception.
-----------
* Where:
Script ‘パス/platforms/android/cordova-plugin-firebasex-crashlytics/dev-build.gradle' line: 17

* What went wrong:
A problem occurred evaluating script.
> Failed to apply plugin class 'com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsPlugin'.
   > Could not create plugin of type 'CrashlyticsPlugin'.
      > Could not generate a decorated class for type CrashlyticsPlugin.
         > com/android/build/api/variant/ApplicationAndroidComponentsExtension

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
A problem occurred configuring project ':app'.
> com.android.builder.errors.EvalIssueException: Android Gradle Plugin: project ':app' does not specify `compileSdk` in build.gradle (/パス/platforms/android/app/build.gradle).

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
==============================================================================

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.14.2/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

 

 

ログを見る限り、cordova-plugin-firebasex 経由で入る Crashlytics 周りの Gradle 設定が、今回の cordova-android 14 / API 35 の環境とうまく噛み合っていないようでした。

自分の環境では Crashlytics は不要で、必要だったのは Analytics とプッシュ通知だけでした。

そのため、cordova-plugin-firebasex をそのまま入れるのではなく、必要な FirebaseX 系プラグインだけを個別に入れる形にしました。

 

とりあえずfirebasexは削除
cordova plugin rm cordova-plugin-firebasex

土台を入れる
cordova plugin add cordova-plugin-firebasex-core
Analyticsを入れる
cordova plugin add cordova-plugin-firebasex-analytics
プッシュ通知を入れる
cordova plugin add cordova-plugin-firebasex-messaging

 

これで、自分の環境ではビルドが通るようになりました。

Crashlyticsを使わない場合は、cordova-plugin-firebasex をまとめて入れるより、必要な機能だけを個別に追加した方が安全そうです。

unable to build chain to self-signed root for signerでビルド出来なかったメモ

Xcodeでビルドしようとしてエラー

ログを掻い摘むと以下、

 

Warning: unable to build chain to self-signed root for signer ”iPhone Developer: 署名者情報”
パス/Frameworks/FirebaseCore.framework: errSecInternalComponent
Command PhaseScriptExecution failed with a nonzero exit code

 

 

「unable to build chain to self-signed root for signer」
これを直訳すると
証明書から、自己署名ルート証明書までのチェーン(繋がり)を構築できません

つまり、中間証明書が必要とのことでした。

「キーチェーンアクセス」で証明書の詳細を見ると部署にG3とあります。

 


そのため、以下から「Worldwide Developer Relations - G3 (Expiring 02/20/2030 00:00:00 UTC)」をダウンロードして入れるとちゃんと動くようになりました。

www.apple.com

 

余談:良かれと思って、「この証明書を使用するとき」の欄を「常に信頼」にしてたら同じエラーが出続けた。
システムデフォルトにする必要があるとのこと。

stackoverflow.com