ごらくらいふ

プログラミングしたりゲームしたり

C95出ます

あー12月なにも書いてないな。書くことねーかなー。 とか思ってたけど完全に書けるネタ手元にあるじゃん、じぶん。

C95に参加します。

コミックマーケット95 三日目 12/31 (月) 東4 ラ 20a サークル名「やものや道場」で参加します。

Webカタログはこちら

https://webcatalog.circle.ms/Circle/14217506

頒布情報

アイドルマスターシンデレラガールズ 脇山珠美ちゃんメインのイラスト本「喜楽画帳」を発行します。 価格は300円を予定。

www.pixiv.net

雑感

前回は抽選漏れしたし、実績不明瞭で今回も抽選漏れっしょーなんて感覚でいたら当選しちゃって驚いた。 入稿にあたっても、印刷所どうしよっかなーなんて考えてるうちにあれよあれよと営業日が消滅していって焦る焦る。

さてさて初のサークル参加。楽しみだなぁ。

いやぁ、ごらくらいふの名にふさわしい娯楽でしょう。これは。

DeployGate-CLIのカレントユーザー切り替えコマンドを作った

はい。作りました。

github.com

自分が、個人だったり所属コミュニティに応じてDeployGateアカウントが複数存在するので、 いわゆる誤爆をやらかしてしまう危険がある。

deploygate-cliは設定ファイルとしてアクセストークンをぽんっと置いてあるので、 アカウント毎にバックアップを取っておいて、状況に応じて復元することでカレントユーザーを切り替えることができた。

補完関数むずかしい

コマンドに併せて補完関数を作った。

github.com

横着して補完関数のドキュメント見ずに着手して、余計なことしてちょっとハマった。

  • readonly DG_ROOT="$HOME/.dg"の内容が空になる
    • readonlyのオプションが良くなかったのか、DG_ROOTの内容が空になってしまって話が進まなくなってしまった。
    • 行頭に#compdefしか書いていないので、zshとして振る舞っていたと考えて良い。readonly...bashだけのものだった?
      • zshにとって見れば「突然見知らぬコマンド叩きよったぞこのスクリプト」といった状況だったりして。
参考リンク

lsコマンドで更新日時順に表示するには -t オプションをつける

更新日時順に一覧を出したいときにパッとわからなかったので備忘録。

結論

$ ls -t

で更新日時順に表示される。(新しいものほど先)

バリエーション

リスト表示かつ、古いものから先に表示する。

$ ls -ltr

直近更新の数件だけ見たい時に tail コマンドと合わせて使うといい感じ。

iOSシミュレーター内のアプリケーションコンテナはUUIDが振り直される

経緯

  • アプリケーションそのままに、アプリケーションコンテナ(以下、コンテナ)内のリソースを弄って確認したい時があった。
  • macの都合で作業中断する必要があり、 pwdで出したパスを書き残して再起動した。
  • 再起動後、そのパスめがけて cdをかけるも見つからないとエラー。

原因

シミュレーター内の各コンテナを確認したところ、アプリケーションごとのUUIDが変更されていることがわかった。

対策

シミュレーターのパスは変わらないので、コンテナの中にマーカーを残しておくのがいいと思う。

touch marker_000

cd /Users/${username}/Library/Developer/CoreSimulator/Devices/${simulatorID}/data/Containers/Data/Application
find . -name marker_000

なんでだろう

  • アプリケーションコンテナのIDが振り直されなかったら、他のアプリケーションからの介入ができてしまうかもしれないから?

PS4に外付けSSDぶっこんだよ

ロード時間がかなり改善された。もう導入してから1ヶ月は経つかな。

もとは↓の記事で書いたように換装した2TBのHDDをつかってた。

yajamon.hatenablog.com

ベンチマークってほどじゃないけど、FF15を起動してからLoad savedata が完了するまで、HDD時代は 1分30秒くらいだったのだけど、 外付けSSDにしたら 30秒で終わった。

この数字だけだとまー所詮1分じゃん、ってなわけだけど、ペルソナ5とかマップ間のロードがすごいスムーズなのね。 ローディング中、主人公の顔が回る回数激減。すげー早い。快適性が高まりすぎる。

いい買い物したわ感ですよ。

以下に買った商品貼っておく。自分の環境ではいい感じに動いた。

トラブルシューティング

PS4に繋いでUSB3.0対応ストレージとして認識されない事象があった。 ケース側の接触不良だったようで、ケーブルとケースを「しっかり刺した」くらい刺さないといかんかったよ。

アルミケース良いよアルミケース。

SanDisk 内蔵SSD 2.5インチ/1TB/SSD Ultra 3D/SATA3.0/3年保証/SDSSDH3-1T00-J25

SanDisk 内蔵SSD 2.5インチ/1TB/SSD Ultra 3D/SATA3.0/3年保証/SDSSDH3-1T00-J25

ほんと、SSDの速度には抗えない魅力があるよ。うん。

権限のクリーンなURL, タイトルコピー系chrome拡張を作った。

はい。

や、職場で「ガバガバ権限まじでやめて」って言われたので「じゃーもう自作しますわ」ってなってやりました。

久しぶりに作って頭の体操になった感じする。

chrome.google.com

「このサイトを共有したい」そう思ったときにタイトルとリンクが一度にコピーできると便利です。

この拡張は権限がクリーンであることを特徴としています。

"アクセスしたウェブサイト上にある自分の全データの読み取りと変更"を必要としません。 この権限ができることは広く、セキュリティ管理の都合から拡張を手放すよう指導されることもあります。

この権限問題を解消すべく、不安のない拡張を作りたいという思いから、この拡張は作られました。

ポップアップを開いた時点でクリップボードにコピーをしに行くので、拡張機能を起動するショートカットを登録するのがおすすめ。自分はcmd+Shift+Cにしてる。 設定はchrome://extensions/shortcutsにて。

コードはGitHubにあります。

github.com

完全に自分が必要なフォーマット${title}\n${url}だけの状態で公開してるので、Markdown用のやつがほしいとかあると、オプションページを作る動機になる。donate枠とか作れるし。

Pull-Requestお待ちしてます。

あとはぺろっとほしいものリストでも貼っておきますね。 https://www.amazon.co.jp/gp/registry/wishlist/10FZP34Z9U32Q

URLConnectionの通信をURLSessionに書き換えた

NSURLConnectionがiOS 9.0でDeprecatedになってから時間も経ち、もうiOS 12が出る時勢にNSURLSessionへの書き換え事案が発生した。

感想

NSURLConnectionDataDelegateとNSURLSessionDataDelegateの互換性はわりと確保されていて助かった。 なぜかcompletionHandlerにわたす引数の順序が変わってたけど。

NSURLConnectionにおけるdidFinishLoadingとdidFailWithErrorが、 didCompleteWithErrorにまとまったので、errorをちゃんと確認しないといけないのが「あーそうですかぁ」という感じ。

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    if (error) {
        // connection:didFailWithError: 相当の処理
        return;
    }
    // connectionDidFinishLoading: 相当の処理
}

だいたいどんなことをしたか。

サブスレッドでNSURLConnectionを動かすために、NSRunLoopとwhileを組み合わせて待機させていた。 また、そのサブスレッドの中で同期的な動きをするところに依存していた。

これをNSURLSessionに書き換えるとき、RunLoopを使う必要がないので、NSConditionでwaitをかけて再現した。

// before
- (void) download:(NSURLRequest *)request {
    // befor
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    while(!self.completed && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) ;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    self.completed = YES;
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    self.completed = YES;
}
// after
- (void) download:(NSURLRequest *)request {
    NSURLSessionConfiguration *configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration;
    self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    self.task = [self.session dataTaskWithRequest:request];
    [self.task resume];
    
    [self.condition lock];
    [self.condition wait];
    [self.condiiton unlock];
    self.condition = nil;
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    [self.condition lock];
    [self.condition signal];
    [self.condition unlock];
}

delegateQueuenilを与えているのはどこでもいいから他のスレッドで処理してもらうため。 後続処理のwaitによってsessionを作るスレッドはスリープしてしまう。