メモを揉め

お勉強の覚書。

swift_combination を Swift 3.0 に対応させました

Xcode 8.0 がリリースされていたので早速インストールして Swift 3.0 を試してみた。
拙作のライブラリ swift_combination を開いてみると既存のコードを Swift 3.0 のシンタックスにコンバートするか聞かれたので、とりあえずつっこんでみる。

memowomome.hatenablog.com

下のコードは配列の長さを指定して 0 で埋めるという処理だが、微妙に API の名前が変わってたりした。

var indices = [Int](count: length, repeatedValue: 0) // before
var indices = [Int](repeating: 0, count: length)     // after

もう一箇所は for in を使ってる箇所で enumerateenumerated に変更されている。

for (i, slct) in unselected.enumerate() { // before
  ...
}
for (i, slct) in unselected.enumerated() { // after
  ...
}

細かい API の変更は全部これで直してくれるっぽい。

手動で直した箇所

ビルドしてみると以下の2点で警告が出た。

第一引数をラベル無し引数で渡す場合は明示的に指定する必要がある

Swift 3.0 では基本的に引数のラベルは省略しない事になったらしい。

let combos = combination([0, 1, 2], length: 2)      // before
let combos = combination(arr: [0, 1, 2], length: 2) // after

ライブラリはこれに合わせて全部ラベル付きで呼び出すように修正したけど、ラベルを省略したコードをそのまま動かしたい場合は、関数定義の引数ラベルの前に _ を付ければ一応オッケーらしい。

public func combination<T>(arr:[T], length:Int? = nil) -> [[T]] {   // before
  ...
}
public func combination<T>(_ arr:[T], length:Int? = nil) -> [[T]] { // after
  ...
}

関数の戻り値を使用しない場合は明示的に指定する必要がある

関数定義の方で戻り値を指定している場合、それを使わないと警告が出る。
_ = myFunc() のように _ への代入を書くか、関数定義の上に @discardableResult を付けることで警告を消すことができた。

_combination(arr: arr, length: _len){ ret.append($0) }     // 警告が出る
_ = _combination(arr: arr, length: _len){ ret.append($0) } // 警告が消える

@discardableResult // これがあれば戻り値を破棄出来る
internal func _combination<T>(arr:[T], length:Int, process:([T]) -> ()) -> [T] {
  ...
}

とりあえず @discardableResult を関数定義に付ける方向で対応することにした。

プログラミングにおける略称のベストプラクティス(を誰か教えてください)

XML, DOM, JSON, APIなどの略称を変数の命名等で使う時のフォーマット統一したい(して欲しい)。

XMLHttpRequest

XML

Extensible Markup Language(エクステンシブル マークアップ ランゲージ)
ウィキペディア: Extensible Markup Language

Http

Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロトコル、略称 HTTP)
ウィキペディア: Hypertext Transfer Protocol

Request

XMLだけ全部大文字、(略称)(略称)(単語)の組み合わせ。

DOMContentLoaded

そもそもイベントタイプって全部小文字やなかったんかいというツッコミを入れつつ。

DOM

Document Object Model (DOM)
ウィキペディア: Document Object Model

ContentLoaded

はいはいなるほど、頭文字の略称だけは全て大文字にするっていうパターンね、だんだん見えてきたよ。
組み合わせは(略称)(単語)(単語)。

jsonFlickerApi

flickrAPIJSONPで使うときに呼び出される関数の名前
なんと固定。
任意の名前を指定できない。

これは、メソッド名だから頭文字の略称はすべて小文字にするのか、ふむふむ。
Apiは略称だけど普通にキャメルケース。

toJSON

と思ったらそうでもないんだねえぇ〜、JSONは全部大文字なんだねえぇ〜。

こんな感じなので自分で命名する時も迷う。
ちゃんとした命名規則欲しい。

snake_caseだといいなと思ったけど、そういう問題じゃないっぽい。
railsにはActionModel::Serializers::Xmlというモジュールと、ActiveSupport::XmlMini_Nokogiri::Nokogiri::XMLというモジュールが存在する(Dashで見ただけですが)。
何か法則があるのかも知れないけど分からない。

個人的に略称は大文字か小文字どちらかに統一したいという欲求はある。 クラス、定数なら大文字、インスタンス、変数やメソッドなら小文字で全部書きたい。

結局どうするのがいいんでしょうね

みたいに書くのが一番規則性が保たれるような気がしている今日このごろ。

LightTableのプラグインを手動でアップデートする方法

LightTableは下記のディレクトリに各プラグインのフォルダが置いてある。(OS Xの場合)*1

~/Library/Application\ Support/LightTable/plugins/

ここにプラグインリポジトリをクローンして、LightTableを再起動すればアップデートは完了する。

下はRuby Instareplをアップデートする際の例。

$ cd ~/Library/Application\ Support/LightTable/plugins/
$ git clone https://github.com/existentialmutt/lt-ruby.git

ついでにフォルダの名前をlt-rubyからRuby Instareplに変更しておく。
これは、他のプラグインもフォルダの名前がプラグイン名と同じになっていることに習ってそうしているが、必要かどうかは定かで無い。

プラグインリポジトリの場所はプラグインマネージャで確認できる。
具体的にはsourceというボタンを押すと、リポジトリのURLをブラウザで開いてくれる。

蛇足っち

最近プラグインの更新が無いなあ、無さ過ぎるなあとは思っていた。
やっぱり更新に失敗していた。

Rubyのプラグインがいまいち調子悪いので重い腰を上げて調べてみた。
(具体的には[]Array.newを使って配列を作ると、エラーになる症状があった)

以下はchangelogより一部抜粋、

* CHANGED: Remove plugin server and use Github as the plugin-metadata repository (ibdknox)

Remove plugin serverって書いてありますね。
代わりにGithubのplugin-metadataリポジトリを使います、というように解釈した。

プラグインマネージャーを使ってインストールすること自体は出来ていたのでまったく使えなくなった訳じゃ無さそうだし、、、
とにかく、良くわからないけどplugin-metadataリポジトリを見に行ってみた。

リポジトリにはズラっとプラグインの名前のフォルダが並んでいる、どうやらここでプラグインをホストしているっぽい。

Ruby Instareplのフォルダを見てみると、なんと0.0.15までリリースされている。
自分のLightTableのプラグインの更新は0.0.9で止まっていたので、明らかに更新の通知がうまく取れていない。

バージョニングの並びを辞書順で、

0.0.1
0.0.10
0.0.11
0.0.12
0.0.13
0.0.14
0.0.15
0.0.2
0.0.3
0.0.4
0.0.5
0.0.6
0.0.7
0.0.8
0.0.9

こう解釈してしまっていると思われる。

そういえば、以前長さが1000の配列をコンソールに出力した際にも辞書順で整列されていた。
light table console

Ruby Instareplのバージョニングの方法が悪いのか、プラグイン管理の仕方にバグがあるのか分からないけど、どうやらこれは手動で入れるしか無さそうだ。

自分の場合、LightTableを再インストールした際、プラグインマネージャの表示するプラグインのバージョンが下がった様な気はしていた。

プラグインマネージャがうまく最新版を取ってこれないので、手動でクローンしてあげたら上手くいった。
まあ根本的な解決にはなってないので、いい方法を知っていたら教えてください、よろしくお願いします。

*1:他の環境は見てないので分からないが、いわゆるユーザーディレクトリ下にあると思われる。