6月6日は誕生日だった。

去年は歳を重ねたことについて、なんかいろいろと思うところあったんだけど、ここ数ヶ月でなんか公私共にいろいろとあって何も思うところがなかった。なんか脳みそが働かない感じがして、現在のこととか将来のこととか全然考えなかった。脳みそが働かない感じがするのは、ぐぐったところストレス/初期の鬱/脱水が原因であるという情報が出てきて、どれも心当たりある〜って感じだった。

なんかダラダラと書き始めてたんだけど、ネガティブな内容しか出てこねえわ!つって消した。

最近はFortniteとDbDをPS4でやってる。LoLSplatoon2にハマってた時期に一切やってなかったド下手だったのがドクソ下手になってARAMを時々やるくらいになってしまった。それ以外の時間というかゲームやる時間の倍くらいは首痛くて横たわってる。横たわってるときに本でも読みたいんだけど、首が終わってると全く頭に入らないのでどうにかなってほしい。首痛いのは、病院変えたら筋弛緩薬とかボルタレンとかを貰えて、だいぶましになったので薬はすごい。

今年のメインミッションは「MBPを買い換える」で、サブミッションは「ゲーミングPCを買う」。

そんな感じで誕生日プレゼントください!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

http://amzn.asia/fTKvuY0

Swift で値クラス的なのを実現したい!

Swift で API/DB から取得した値の ID 型指定はたぶん通常 StringInt などを指定するのが一般的なのかな?と思う。 メソッド等に ID を渡すときに、プリミティブ型だと渡したい ID を取り違えたときにスッとコンパイル通ってしまって困る。

Scala には値クラスっていうのが存在して、ある型に別名を付けて、それと区別するみたいなことが出来る(理解が曖昧かつ雑)。

値クラスと汎用トレイト | Scala Documentation

要は、以下のようなことがしたい。

struct UserID: AnyVal {
  let value: String
}
struct MediaID: AnyVal {
  let value: String
}

var userID = "1234"
let mediaID = "4321"

// ↓ここでコンパイルエラーが出て欲しい
userID = mediaID

なんかそういうことするの難しそうで、とりあえずメソッド等の定義に使えればいいやということで、typealias でお茶を濁していた。

だけどメソッドの引数に指定した UserID にミスって MediaID を渡してしまってもコンパイル通ってしまう。 テストも人間が書くものなので100%信用できるわけではない。

ということで、いろいろ調べてそれっぽいことが出来そうなコードを書いてみた。 さっきそれっぽいところまで行ったので、まだ開発中のアプリで使ったりはしていない。

struct UserID: ExpressibleByStringLiteral, CustomStringConvertible, CustomDebugStringConvertible, RawRepresentable, Hashable, Equatable, Codable {
    private(set) var rawValue: String

    var description: String { return rawValue }
    var debugDescription: String { return "\(String(describing: type(of: self)))(\(rawValue))" }

    init(stringLiteral value: String) {
        self.rawValue = value
    }

    init?(rawValue: String) {
        self.rawValue = rawValue
    }
}

struct MediaID: ExpressibleByStringLiteral, CustomStringConvertible, CustomDebugStringConvertible, RawRepresentable, Hashable, Equatable, Codable {
    private(set) var rawValue: String

    var description: String { return rawValue }
    var debugDescription: String { return "\(String(describing: type(of: self)))(\(rawValue))" }

    init(stringLiteral value: String) {
        self.rawValue = value
    }

    init?(rawValue: String) {
        self.rawValue = rawValue
    }
}

var userID: UserID = "1"
print(userID) // => 1

userID = "2"
print(userID) // => 2
print(userID.debugDescription) // => UserID(2)

// ↓Error🎉
// let mediaID: MediaID = "2"
// userID = mediaID

print(userID == "0") // => false
print(userID == "1") // => false
print(userID == "2") // => true

let string: String = userID.rawValue
print(string) // => 2

// Equatable 追加すれば以下も可能
// print(userID == UserID(rawValue: "2")) // => true

一応出来たぞ〜〜〜って感じでこれ以上書くことが無いんだけど、いい方法知ってたりしたら教えてください!!!!!!!!!!!!!!!!!!!!!!

エアギア再読した

エアギアを土日で1巻から最終巻まで再読した。

化物語のコミカライズを大暮維人が担当するってことで Twitter でもフォローしてる人たちが色々言っていた。

大暮維人の作品はどちらかと言うと「面白くない」とか「セリフ付きの画集」とか言う人の方が多いように見える。

正直、僕も「エアギアや天上天下を通しで見て面白いか」というところは自信を持って面白いと言えなくて、連載当時もあんま深く考えずに刹那的に楽しんでいた。カズかっけ〜とか俵文七かっけ〜〜とか。

連載でエアギア最終話読んだときは「よく分からん」って感想で、コミック最終巻でも「よく分からんけどエモい」みたいな感想だったことをさっき思い出した。

エアギアの連載終わってから5年以上経って、その後も色々漫画やらなんやらを嗜んで、多少目が肥えた(かもしれない)今読んだらどう感じるんだろう?もしかしたら全然面白くないじゃんってなったりするのかな?って思って読んでみることにした。

再読前は「俺は好きだけど、もし人に勧めるとしたらベヒーモス編まで」って感じで、再読後は「俺はめちゃくちゃ好きだけど、もし人に勧めるとしたらやっぱりベヒーモス編までかな」って感じだった。画集として読むなら天上天下のほうが描き方をいろいろ試している様子があって面白いと思う。

たぶんコミックだと10巻くらいまで。それ以降は、人を選ぶと思う。

以下はネタバレとかあるかもしれない感想文。

続きを読む

iOS アプリの言語設定をコードで変える

調べてる途中で必要なくなって中途半端な感じだけど備忘録的な。

システムの言語設定とかが UserDefaults に渡されて、NSLocalizedString とかはそれを見て返す言語を変えてるらしかった。 以下のように言語とかロケール系の設定を上書きすると、次回起動時から上書きした設定が使用される。 3つ上書きしてるけど、最低限どれを変えれば良いのかとかは調べてない。 userDefaults.synchronize() した後に NSLocalizedString 読んでも上書き前のものが返ってきてた。

let userDefaults = UserDefaults.standard
let identifier = "ja-JP"
userDefaults.set([identifier], forKey: "AppleLanguages")
userDefaults.set([identifier], forKey: "NSLanguages")
userDefaults.set(identifier, forKey: "AppleLocale")
userDefaults.synchronize()

参考

GitHub - trailblazr/LocaleOverrider: Demonstrator how to override the apps locale in case you need to provide fast Locale switching.

2017年振り返り

今年の抱負は無事達成しなかった。

今年は転職したくらいしかこれと言ったイベントが無かった気がする。

あと筋トレを習慣付けた。

そろそろ健康に気をつけたい気がする。

今年お世話になった方々や仲良くしてくださった方々ありがとうございました。来年もよろしければよろしくお願いします。

2017年買ってよかったものまとめ

まだ買って1ヶ月とかそのくらいなんだけど、良かった。

歯に当ててスーッてするだけで手で磨くよりきれいになる。

ここ数年は自宅で仕事してて、出勤してるときは出かける前に歯磨きしてたけど、自宅だと歯磨きするタイミングを固定するのが難しくて、だいぶサボってしまって、今まで虫歯なったことなかったのに虫歯になった。

幸い(?)親知らずだけちょっと痛いなーくらいで、抜いて済んだので歯を大切にする。

5000円しないのでもっと早く買えばよかったって思った。

めっちゃ良くて、街をドライブしてるだけで楽しい。

前作はお前本当にハッカーなんか??みたいな感じだったけど、今作はドローンとかラジコンとかを上手いこと使いながらクリアしていく感じで楽しかった。ラジコンとドローンから爆弾落とせるやつ取ると一気に難易度下がっちゃうからデッドセック気分を味わいたい人は取らないほうがいいかも。

あと前作は、パトカーの前でスピード出したり逆走してるだけで追われる上に、カーチェイスの難易度が高すぎてグエーって感じだったけど、今作は銃出したり轢いたりとかしなければ見逃してくれる。

主人公(マーカス)と仲間(レンチ)の掛け合いがオタクの会話って感じで面白い。DLC もまだ1個しかやってないけど面白い。

買ったの去年だけど去年のに書いてなかったので2017年買ってよかったものになった。

室内用ゴミ袋 10L 半透明 25枚入 Y18C

室内用ゴミ袋 10L 半透明 25枚入 Y18C

スーパーとかコンビニの袋使ってたんだけど、惣菜とかで済ますこと多くなると枯渇するので買った。

ゴミ捨て放題になって良い。

頭痛首こり肩こり腰痛に良い。

首のヘルニアになって、寒くなってくると辛い日が増えるのでこれを肩に貼るだけでだいぶ楽になる。

防寒としても良くて、出かける前に腰に1枚貼っとくと、そんなに着込まなくても暑いくらいになって良い。

簡単に言ってしまうと軽めのストレッチ本なんだけど、全身まんべんなくストレッチするポーズ(?)が書かれてて良かった。

大量にあって難しいので、全身ストレッチみたいなやつと、首とか肩のやつをやってる。

効果があるのかは分からないけど、効果あるような気がするからやってる。

プリズナー・トレーニング 圧倒的な強さを手に入れる究極の自重筋トレ

プリズナー・トレーニング 圧倒的な強さを手に入れる究極の自重筋トレ

獄中で囚人が行うトレーニングについて書いた本。

プリズナー・トレーニング 圧倒的な強さを手に入れる究極の自重筋トレ 読んだ - 銀の人のメモ帳

前にブログに書いた。

めちゃくちゃ簡単なところから始まるので、運動不足な状態で始めるのに良かった。あと自重筋トレの本なので、出不精に最適。

めちゃくちゃ簡単がどのくらい簡単かというと、壁の前に立って、壁に手をついて、その状態で腕立てやるところから始まる。

今のところ見た目で分かるほどの変化は出てないけど、2ヶ月くらい続けられてるんで引き続きやっていく。

家で懸垂する場所が無いから買った。

頑丈な突っ張り棒って感じのやつなんだけど、ぶら下がってもびくともしなくて凄い。

囚人筋トレの本の表紙が刃牙の作者で、今までネタっぽい画像は知ってたけど読んだことなかったら読んだらめちゃくちゃ面白くて一気に読んだ。

ネタっぽい画像をTwitterで時々見かけてたので、楽しんでる人もネタとして楽しんでるのかと思ってたんだけど、ネタじゃなく面白いというか、ネタとして見かける画像も通しで読むと普通のコマで刃牙おもしろ〜〜〜〜〜ってなった。

第四部が連載中で、第三部のラストがだいぶ良かった。

強くなりてえ……ってなった。

あと、囚人筋トレの本の後に刃牙読んだから、ビスケット・オリバ出てきたとき囚人筋トレ本の表紙じゃん!ってなった。


去年書いたらインスタントコーヒーとか知り合いが買ってたりしたので今年も書いてみた。

2016年買ってよかったものまとめ - 銀の人のメモ帳

「既存のプロジェクトを XcodeGen に移行する」という文章をQiitaに投稿した

qiita.com

XcodeGen 少し前に知って良さそうって思ったんだけど、そのときはドキュメントが充実していなかったのかドキュメントの存在を見落としていたのか分からないけど導入見送って、最近になってまた少し話題になってたから見てみたらドキュメントしっかり存在してたので移行した。

XcodeGen 話題にはなっていたけど、何がいいとか、リリースされてるアプリの設定ファイルとかはあるものの、じゃあ実際に使い始めるぞ!って感じになるような日本語の情報が皆無だったので書いた。

移行するぞ!って作業し始めると、本当に一通りの設定を yaml に書けたのか不安になり、生成されるプロジェクトとの差分見ても diff がやばくて分からんしで、うむ〜って感じだった。

xcconfig-extractor というツールを教えてもらったらシュッと移行終わった。

qiita.com

xcconfig に大体の設定を書いておけば XcodeGen 捨てるぞ!ってなったときに捨てるコスト下がるし、XcodeGen 使わない場合も設定変えたときの diff が見やすくなって良いなって思った。