読書「回転木馬のデッド・ヒート」

村上春樹の短編集 / 1985年10月09日発行

収録

  1. レーダーホーゼン
  2. タクシーに乗った男
  3. プールサイド
  4. 今は亡き王女のための
  5. 嘔吐1979
  6. 雨やどり
  7. 野球場
  8. ハンティング・ナイフ

エピソード 話者が女性 話者が男性 話中に男性側の不貞・情欲がある 食事を吐く
レーダーホーゼン
タクシーに乗った男
プールサイド
今は亡き王女のための
嘔吐1979
雨やどり
野球場
ハンティング・ナイフ

Git で Emoji Prefix に関してのメモ

はじめに

Git リポジトリに Emoji Prefix のコミットテンプレートを設定してみる。

Emoji Prefix を導入するメリットは

  • 絵文字とコミットが対になるので、コミットの役割が明確になる
    • バグ修正+リファクタリング+機能追加。。。など本来分割すべきコミットがごちゃごちゃ一緒になることを防げる
  • コミットログのプレフィックスに絵文字がつくため、ログの可視性が上がる
  • 明るい絵文字を使うとプロジェクトが殺伐としづらくなる作用

コミットテンプレートを用意する

今回は以下のコミットテンプレートを用意した。

commit-template.txt

# EMOJI PREFIX
# 🆙 : Version up
# ⚡️ : Add major feature.
# ✨ : Add feature.
# ♻️ : Refactoring
# 🔧 : Improve Performance
# 🐛 : Fix Bug
# 🧹 : Remove unsed feature / resource.
# 🎨 : Update resources.

リポジトリにコミットテンプレートを設定する

# config にテンプレートを設定する
$ git config --local commit.template commit-template.txt

# テンプレートが設定されているかを確認する
$ git config --local commit.template
commit-template.txt  # 問題なく設定されていた

リポジトリにテンプレートを設定する。ここでは対象範囲を local にしている。

  • config の対象範囲は以下になる。
    • local : リポジトリ単位
    • global : ユーザー単位
    • system : すべて

コミットテンプレートが設定されているか確認

$ git commit

をすると、下のようにテンプレートが表示されたので OK

f:id:daisuke-t-jp:20190824103753p:plain:w500

  • TODO
    • GitHub Desktop からコミットテンプレート使うには?

今回テストに使ったリポジトリ

参考

Android Q is Android 10.

Android は今まで菓子の名前を使っていたが、それをやめるようだ。


First, we’re changing the way we name our releases. Our engineering team has always used internal code names for each version, based off of tasty treats, or desserts, in alphabetical order. This naming tradition has become a fun part of the release each year externally, too. But we’ve heard feedback over the years that the names weren’t always understood by everyone in the global community.

  • リリースの命名方法を変更する。
  • 従来はアルファベット順で「お菓子」「デザート」に基づいた名前にしていた。
    • この命名に関しての伝統も楽しめる部分があった。
  • しかし
    • グローバルコミュニティ全員が名前を理解している訳ではないというフィードバックがあった。

For example, L and R are not distinguishable when spoken in some languages. So when some people heard us say Android Lollipop out loud, it wasn’t intuitively clear that it referred to the version after KitKat. It’s even harder for new Android users, who are unfamiliar with the naming convention, to understand if their phone is running the latest version. We also know that pies are not a dessert in some places, and that marshmallows, while delicious, are not a popular treat in many parts of the world.

  • 一部の言語では L と R の発音の区別がつかない
  • 命名規則に慣れていないユーザが Androidバイスのバージョンを特定することが困難
  • Pie(パイ)は地域によっては「デザート」ではない
  • マシュマロはおいしいが、世界中でポピュラーなお菓子とは言えない

As a global operating system, it’s important that these names are clear and relatable for everyone in the world. So, this next release of Android will simply use the version number and be called Android 10. We think this change helps make release names simpler and more intuitive for our global community. And while there were many tempting “Q” desserts out there, we think that at version 10 and 2.5 billion active devices, it was time to make this change.

  • グローバルな OS は名前が明確であり、世界中の全ての人に関連していることが重要である。
  • したがって Android の次のバージョンは Android 10 と呼ぶ。
  • これによりグローバルコミュニティにおいても、名前がよりシンプルに、直感的になる。

LicensePlist を導入し、アプリで使用している OSS のライセンスを表示する

LicensePlist を使うと

  • iOS アプリに依存している OSS のライセンス表記をまとめることができる
  • CocoaPods も Carthage どちらも対応している

これを試してみる。

セットアップ

Homebrew 経由で LicensePlist をインストールする。

$ brew install mono0926/license-plist/license-plist


プロジェクトにルートに CarfilePodfile を配置する。 プロジェクトルートで LicensePlist を実行する。

$ license-plist 

成功すると com.mono0926.LicensePlist.Output フォルダが生成される。

原理的にはこれを Settings.bundle 直下にコピーすれば iOS の設定アプリ内で、使用している OSS ライセンスが表示されるようになる。

次に Integrate 継続的に Settings.bundle に LicensePlist の成果物ができるように Xcode の RunScript に以下を追加する。

if [ $CONFIGURATION = "Debug" ]; then
/usr/local/bin/license-plist --output-path $PRODUCT_NAME/Settings.bundle
fi

これでビルドごとにプロジェクトルートの下の $PRODUCT_NAME フォルダ下の Settings.bundle 内に LicensePlist の成果物ができるようになる。

最後に Settings.bundle 内の Root.plist を下のようにする。これをしないと、設定アプリ内にライセンス一覧の陸ができないことに注意。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
    <dict>
      <key>Type</key>
      <string>PSChildPaneSpecifier</string>
      <key>Title</key>
      <string>Licenses</string>
      <key>File</key>
      <string>com.mono0926.LicensePlist</string>
    </dict>
  </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

結果のスクリーンショット

f:id:daisuke-t-jp:20190823134151p:plain:w300 f:id:daisuke-t-jp:20190823134154p:plain:w300

サンプル

今回試した LicensePlist を使用したサンプルは GitHub にある。

注意点

  • LicensePlist は GitHub API を使用しているため、API 制限により時々失敗するかもしれない。その場合は license-plist コマンドにトークンを --github-token で指定すると良い。
  • Settings.bundle はあるが、設定画面に反映されない場合
    • アプリを再インストールしてみる
    • iOS を再起動してみる
    • .bundle がターゲットに含まれるかを確認する(プロジェクトのツリーにはあるが、ビルドに含まれていないと反映されない)

xxHash v0.7.1 リリース

https://github.com/Cyan4973/xxHash/releases/tag/v0.7.1

2019/8/15 にリリースされた xxHash v0.7.1 についてメモする

リリースノートを見る

このリリースは XXH3 に対しての多くのユーザフィードバックに基づいた大きな更新が入っている。

XXH3 はまだ実験段階であることに注意。安定するまでには、少なくとも2つのリリースの間、安定した状態を維持する必要がある。

そのほか一般的な改善

気になる点

  • XXH3 はまだ実験段階であり、v0.7.0 と v0.7.1 のハッシュ値には互換性がない
  • XXH3 にストリーミングが実装された

HEIC を JPEG に一括変換する

macOS であれば 下のように sips コマンドを使って HEIC -> JPEG 変換ができる

$ sips --setProperty format jpeg PIC.HEIC --out PIC.jpg


ただし、ファイル数が多いと一括で変換したくなるので Python スクリプトを作った。(内部で sipsを使用しているので macOS 専用)

使い方は下のリポジトリを clone してきて

$ git clone https://github.com/daisuke-t-jp/heic2jpg.git


以下のように HEIC があるフォルダを指定して実行。

$ python3 heic2jpg.py <HEIC があるフォルダのパス>


スクリプトが完了すると指定したフォルダの中に jpg フォルダができていて、その中に JPEG ファイルが入っている。

おわり

iOS アプリで「Zip ファイルをダウンロード→Zip 展開→展開されたファイルをアプリ内で使用」までを試す

はじめに

iOS で Zip を展開する - daisuke-t-jp's blog で Zip アーカイブの展開(UnZip)の方法を書いたので、これを発展させて

  1. Zip をサーバからダウンロード
  2. アプリ内で Zip を展開
  3. 展開したデータをアプリで使用

というユースケースを試したので、それについて記録する。

リポジトリ

実際にアプリを実行して試せるプロジェクトは 以下の GitHub リポジトリにある。

このアプリの流れは以下である。

  1. Download ボタンをタッチする
  2. GitHub リポジトリにある Zip ファイルをダウンロードする
  3. SSZipArchive で Zip を展開する
  4. 展開したフォルダの中にある画像(melon.png, lemon.png)を UIImageView に貼り付け

ポイント

全体的にリポジトリで確認できるが、重要そうなポイントをいくつか抜粋する。

ダウンロードの開始

ファイルのダウンロードは URLSessionDownloadTask で実現した。

ダウンロード開始までの流れは以下になる。

  1. URLSessionConfiguration でセッション構成を設定する
  2. URLSessionConfiguration を元に URLSession を作成する
  3. URLSession から URLSessionDownloadTask を取得し、ダウンロードを開始する。

ダウンロード開始後の流れ

  1. URLSessionDownloadDelegate の urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) メソッドでダウンロードの進捗がデリゲートに通知される。
    • ??% 完了のような表示に使用できるデータが得られる
  2. URLSessionDownloadDelegate の urlSession(_:downloadTask:didFinishDownloadingTo:) メソッドでダウンロードの完了がデリゲートに通知される。
    • ダウンロード先のパスが引数にくるので、このタイミングでファイルに対しての操作(Zip の展開など)ができる
  3. URLSessionTaskDelegate の urlSession(_:task:didCompleteWithError:) メソッドでセッションタスクの完了がデリゲートに通知される。

URLSession で扱えるプロトコル

おわり

そのほか

  • Objective-C だと NSURLSession だが Swift だと NS がなく URLSession であることに気をつけたい
    • 時代の流れを感じる
  • ちなみにアップロードの場合はこちらを使用する → URLSessionUploadTask

以上