頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Macで一太郎のjtdファイルを見る

町内会関連で引き継いだUSBメモリ内に拡張子がjtdのファイルがあってなんだ?と思ったら一太郎のファイルらしい。
なんとかMacで見られないものか(編集はできなくてもいいから)と調べるとこんな記事が↓

Mac上でWindowsのアプリを動かしてみよう!(Boot Campは使いたくない人必見!) | アップル大好きmaroのブログ

これを参考にPlay on Macをダウンロード(妙に時間がかかった)。
XQuartzもインストール。他にもいろいろあったが指示通り。
一太郎ビューアも公式からダウンロード。

すんなりとインストールできたわけじゃないけど、もがいてたらやっと起動した。

Play on Mac
↑ここで一太郎ビューア2014を選択し、実行すると、、、

Wineエクスプローラ

↑Wine エクスプローラなるものが起動し、目当てのjtdファイルを選択すれば見ることができた!



(備考)
High Sierra 10.13.4
Play on Mac 4.2.12
一太郎ビューア 24.0.1.0


SCNPhysicsHingeJointで謎の誤差

SceneKitで作る振り子

↑SceneKitでこういう振り子を作るのに、振り子のオブジェクト(ここでは直方体)を空間にSCNPhysicsHingeJointで固定している(横の支柱は今回は物理演算には関係のない飾り)。

この時のコードはこんな感じ↓
{
        SCNVector3 xAxis = SCNVector3Make(1.0 , 0.0 , 0.0);
        SCNVector3 anchor = SCNVector3Make(0.0, pendulumHeight/2.0, 0.0);
        SCNPhysicsHingeJoint *hingeJoint = [SCNPhysicsHingeJoint jointWithBody:pendulumNode.physicsBody axis:xAxis anchor:anchor];
        [mainScene.physicsWorld addBehavior:hingeJoint];
}
これでx軸方向のベクトルを中心に回転するjointが設定できる。振り子にトルクをかければちゃんと振り子のように動く。
ここまではいいんだけど、この時振り子の位置を確認すると、なんだかよくわからない誤差がある。

SCNNodeオブジェクトの位置・姿勢が取得できない
なおこういう場合、位置は↑のように pendulumNode.presentationNode から得る。

上のコードで pendulumHeight=2.0 、回転軸の高さがy=0なら初期の静止した状態の高さyは-1.0のはずが -1.014 とかになってしまう???

なんや、その誤差は?

振り子の付け根部分のずれ

↑本来なら棒の端と板の端は同じのはずが、確かにずれてる。

以前使ってたBulletという物理エンジンのことを思い出すと、まあこういうジョイント部分もオブジェクト同士(今回はオブジェクトと空間だけど)がかっちりくっついてるかというとそうでもなく、力をかければちょっとは離れる、といった計算になることも多分ある気がする。
もしかしてSCNPhysicsHingeJointに”固さ”というかそういうパラメータがあるのかな、と思ったけどリファレンスを見る限りなさそう。
オブジェクトの重さで重力方向に下がってしまっているのか?と思い質量を変えてみたけど、この値に変化はなし。
うーん、なんだろうなと思って重力加速度をゼロにしたら誤差はなくなった!
よくわからないけど、なんかそういう仕様になっているようだ。

深く考えるのはよそう、だってSceneKitだもの(みつを)。


SCNNodeオブジェクトの位置・姿勢が取得できない

倒立振子

↑強化学習やってみようかな、と思ってSceneKitでこういう振り子を作ったんだ。いわゆる倒立振子をやろうとしてる。”とうりつしんし”と読むとかどこかで見た気がするが真偽不明。

最初はクリックなりを検出して振り子にトルクを与えて、、、てな感じで動作確認してたんだけど、動いている振り子の位置、姿勢が取得できない、という状況にはまった。
SCNNodeオブジェクトをnodeとすればその位置、姿勢は
node.position
node.orientation
で取得できるやん?
それが振り子をいくら動かしても値が変化しないのよ。

scenekit - Getting an SCNPhysicsVehicle's Position - Stack Overflow

↑いろいろ調べてようやくたどり着いたのがこちら。
確かに presentationNode を使うといけた。
物理エンジンを使った場合にはそういうことらしい。


macOSでテキストファイルの読み込み、保存ができない

macOSアプリでテキストファイルを保存しようとしたらファイルの有無は教えてくれるんだけど、読み書きができない。

Error Domain=NSCocoaErrorDomain Code=257 "The file “status.txt” couldn’t be opened because you don’t have permission to view it."

みたいな警告が出る。
ちなみにファイルの有無の確認はこんなの↓
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    if ([fileManager fileExistsAtPath:filePath]) {
        // the file exists

    } else {
        // not exist
}
読み込むのはこんなの↓
{
    NSError *error = nil;
    NSString *content = [NSString stringWithContentsOfFile:filePath
                                                  encoding:NSUTF8StringEncoding
                                                     error:&error];
}
エラーメッセージにpermissionがどうのとあるのでpermissionの変更をしてもダメでどういうことやねんと悩んでいたんだけど、、、

Xcodeのサンドボックス設定

↑結局、サンドボックスをオフにする、でいけた。確かデフォルトでオンになっていたと思う。
ただしmacOSアプリではリリースするのにはサンドボックスを使うのが必須だったような気がするが。今回はリリース目的ではないのでこれでよしとしよう。


MPSCNNConvolutionのイニシャライズができない

APPLE公式のサンプルコードでMPSCNNHelloWorldってiOSデバイスでMNISTができるのがある。
ところが最新のサンプル(残念ながらSwiftのみ)をダウンロードしてきても、SlimMPSCNNConvolutionクラスで親クラス(MPSCNNConvolution)のイニシャライザ部分で

Cannot invoke 'MPSCNNConvolution.init' with an argument list of type '(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>, flags: MPSCNNConvolutionFlags)'

ってエラーでビルドさえできない。
以前ダウンロードしてたObjective-C用のでも

No visible @interface for 'MPSCNNConvolution' declares the selector 'initWithDevice:convolutionDescriptor:kernelWeights:biasTerms:flags:'

そんなイニシャライザはねえよ!ってエラーで同じくビルドもできない。

リファレンスにはdeprecatedとなっているが代わりにこうしろってのもよくわからないし、ヘッダーに書いてるメソッド(initWithDevice:weights:)も動きそうにない。

dev cenのフォーラムを見ると、この4月の始め頃から同じように困っている人のコメントがあった。
それに対し、すでにバグレポートを出したよ、なんてリプライもあったんだけど、そんなの待ってられないなあ?
と思ってたらAPIとしてはもうないけどメソッドとしてはまだあるのでselector使ったらいいよ、って記述が。

なんだかよくわかんないけど、試してみた。ただselectorって引数をたくさんとれないので面倒だけどNSInvocationとか使う。

{
//    self = [super initWithDevice:device
//           convolutionDescriptor:convDesc
//                   kernelWeights:weightP
//                       biasTerms:biasP
//                           flags:MPSCNNConvolutionFlagsNone];
//    ↑もとがこれ

    
    NSInvocation *invocation;
    NSMethodSignature *signature;
    SEL argSelector =  @selector(initWithDevice:convolutionDescriptor:kernelWeights:biasTerms:flags:);

    MPSCNNConvolution *cnnc = [MPSCNNConvolution alloc];
    
    signature = [self methodSignatureForSelector:argSelector];
    invocation = [NSInvocation invocationWithMethodSignature:signature];
    [invocation setTarget:cnnc];
    [invocation setSelector:argSelector];
    NSUInteger n = 0;
    
    [invocation setArgument:&device atIndex:2];
    [invocation setArgument:&convDesc atIndex:3];
    [invocation setArgument:&weightP atIndex:4];
    [invocation setArgument:&biasP atIndex:5];
    [invocation setArgument:&n atIndex:6];

    [invocation invoke];
    
    //返り値を得る
    [invocation getReturnValue:(void*)&cnnc];
    self = (SlimMPSCNNConvolution *)cnnc;
}
もともとのメソッドの最後の引数のMPSCNNConvolutionFlagsNoneもdeprecatedだし、もともとこれしかなかったやつでもとの値もゼロなのでそれを入れてる。
とりあえずこれで動いた!!!



おまけ。
MPSCNNConvolutionDescriptorの
cnnConvolutionDescriptorWithKernelWidth:kernelHeight:inputFeatureChannels:outputFeatureChannels:neuronFilter:
ってメソッドもdeprecatedだけど、現在そのままでも警告はでるけど動いてくれる。
cnnConvolutionDescriptorWithKernelWidth:kernelHeight:inputFeatureChannels:outputFeatureChannels:
ってのがiOS11.0から使えるみたいなので、こっちを使うと警告は消えた。
ただ最後のneuronFilter:で渡していた項目見ると重要だろ?と思うんだがそのままでも動いてる。なんでや?!
でも気持ち悪いのでちゃんと設定しておく。
もともとのコードでは活性化関数にReLUを使うって指定してる。
なのでこんな感じにしといた。
{
    MPSCNNConvolutionDescriptor *convDesc = …

    MPSNNNeuronDescriptor *fusedNeuronDescriptor =[MPSNNNeuronDescriptor new];
    fusedNeuronDescriptor.neuronType = MPSCNNNeuronTypeReLU;
    fusedNeuronDescriptor.a = 0.0;
    convDesc.fusedNeuronDescriptor = fusedNeuronDescriptor;
}




Xcode 9.3
iOS 11.3.1




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad