Twitterでふぁぼったものをひたすら試します

genericsとassociated typeとduck typing(とSwift)

いつもこの辺の話を忘れちゃうのでメモ。

Why does Go not have generic types?

github.com

Goに総称型がないっていうネタと議論を永遠に続けるために導入してないんじゃ

理由はFrequently Asked Questions (FAQ) - The Go Programming Languageにある通りだが、厄介なのはissueで延々と議論を続けているところである。やっぱり議論がしたいだけなのでは。

もう少しまとまった説明がproposal/15292-generics.md at master · golang/proposal · GitHubにあるのでこっちを読んだ方が幸せ。そこでは

Generics affect the whole standard library. It is desirable to have the standard library make effective use of generics. Every existing package should be reconsidered to see whether it would benefit from using generics.

などいろいろなことが述べられている。

Swiftの標準ライブラリが1番associated typeの恩恵を受けている気がする。ていうかもはや奴がgeneric protocolを使う姿を想像できない。

golangGenerics と私」

mattn.kaoriya.net

まあこれ自体は置いといて、Swiftには数値関係のprotocolがたくさんある。なんなら Numeric という例で出てきたものと同じ名のprotocolまであるがどうか。

Swift標準ライブラリにはprotocolで構成される巨大な継承ツリーがある。その中から数値型を抜粋するとだいたいこうなる:

f:id:S_Shimotori:20170802214546p:plain

Swiftの数値型の元締めが問題の Numeric である*1Numeric は二項演算能力(ただし和差積のみ)を指す。名前が一致しているしこいつが全部解決しそうしない。
なぜなら NumericSelf 同士の、つまり同型同士の二項演算能力を指すからである。 Int / UInt / Float / Double のごった煮の和は管轄外。

演算子システムもしっかり型を限定してくれる Self 先生も好きです(ほんと)

Int / UInt / Float / DoubleMyNumber を実装するのがだるいなら Numeric 1人に実装すれば解決するしない。宣言済みのprotocolに後から別のprotocolを継承することはできない。mattn氏の例と同様に全ての数値型で実装する必要がある。頑張りましょう。

Java の Generics にもの思い - QiitaJavaでは <T extends Number> を利用しているが、Javaの数値参照型の元締め Number

抽象クラスNumberは、プリミティブ型byte、double、float、int、long、およびshortに変換可能な数値を表すプラットフォーム・クラスのスーパークラスです。

で我らが Numeric とは別物である。よってこのJavaの例をそのままSwift語に書き換えてもうまくいかない。

Number (Java Platform SE 8)

Swift: Why Associated Types?

www.russbishop.net

Russ Bishop氏はAppleの中の人らしい。

記事は2015年のもの。現在の Collection が持つassociatedtypeは

  • associatedtype IndexDistance = Int
  • associatedtype Iterator = IndexingIterator<Self>
  • associatedtype SubSequence
  • associatedtype Indices

である。いずれにしてもこれを総称型パラメータでやったらヤバイよねっていう話。 https://github.com/apple/swift/blob/781f6326bd9932356086874baa12c812d100565e/stdlib/public/core/Collection.swift

Scalaはtraitでもgenericsとabstract typeを両方使えるので、この記事はOdersky大先生のScalaインタビューを引用している。こちらでもパラメータ数の爆発の可能性が欠点として挙げられている。

The Purpose of Scala's Type System

You could parameterize class Animal with the kind of food it eats. But in practice, when you do that with many different things, it leads to an explosion of parameters, and usually, what’s more, in bounds of parameters.

Introducing Abstract Base Classes

www.python.org

29.7. abc — 抽象基底クラス — Python 3.6.1 ドキュメント

Pythonは基本的にはduck typingなのだがAbstract Base Classesなるものが存在している。記事の最後ではABCとduck typing、generic function、interfaceとの比較がされている。

Python 3.4.0 の新機能 (3) - Single-dispatch generic functions - Qiita

JavaScalaC#ジェネリクス機能比較表

kmizu.hatenablog.com

よっしゃ!Swiftも参戦だ!

ジェネリックなクラス
class MyList<T> {}
ジェネリックなメソッド
func id<T>(arg: T) -> T { return arg }
型パラメータの上限
func max<T: Comparable>(a: T, b: T) -> T {
    return a < b ? b : a
}
型パラメータの下限

なくない?

型パラメータの推論
id(arg: "foo")  // "foo"
全ての型のサブタイプ(ScalaにおけるNothing)

こいつもなくない?

scala.Nothingは何のためにあるのか - kmizuの日記

definition-site variance

記憶にない

use-site variance

記憶にございません

実行時における型パラメータの扱い

(実行時のことは知らん)

型パラメータをnewする

え、無理でしょ( error: non-nominal type 'T' does not support explicit initialization )

Nominal and Structural Type Systems - soutaroブログ
Swiftに息づくstructural types(構造的型) - Qiita

同じジェネリッククラスを複数同時に継承する

多重継承はダメだし総称型protocolなんて概念はこの世には存在しない

同じ名前で型パラメータの個数が異なるジェネリッククラスを複数作成する

同じ型と認識されるので無理( error: invalid redeclaration of 'Tuple' )

高階のジェネリクス(Type Constructor Polymorphism)

何これ。

「filterを実装しておけばrejectが勝手に出来上がってる」みたいなやり方はよくあるが。

ジェネリックな型エイリアス
typealias StringDictionary<T> = Dictionary<String, T>

let d: StringDictionary<Int> = ["x": 50, "y": 100]

まとめ

みんな違ってみんないい

*1:Strideableも全員に該当する性質だが、こいつはUnsafePointer軍団も監督しているので数値限定ではない。NSNumberもFoundationの子なので違う。

iOSDC Japan 2017に色々応募した

わたしは!女性登壇数と学生登壇数を増やすまで!トークに募集するのをやめないっ!

気になるものがあったらツイートしたりブクマしたりしてください。

【LT】学生が勉強会のドアを叩いて、その後

学生が勉強会のドアを叩いて、その後 | iOSDC Japan 2017

このエントリーをはてなブックマークに追加

就職活動とかいうただストレスが溜まっていくイベントを、
「勉強会で出会った人たちはみんな優しくて楽しそうにしてたから大丈夫!」
という謎理論で耐えた話をします。

女性は出産でブランクがあるから教職か薬剤師か士業にしとけって父親からの意見にも動じない。やりたいからやる。OK?
(興味があるならいいんだけど、ない分野に行ってどうするんだ……)

【15min】今こそテストの気持ちを考える

今こそテストの気持ちを考える | iOSDC Japan 2017

このエントリーをはてなブックマークに追加

勉強会に参加してわかったのは、「意外とみんなテストを書いてない」ということです。 テストフレームワークAppleドキュメントがあんなに理念と利点を語っても、カンファレンスのたびに誰かがテストの話をしても、懇親会で誰かが「自分はテストを書いてない」って言う。間違いない。

xUnitフレームワークの祖は「25%〜50%はテストに費やせ」って言ってるんだけどね。まあ工数足りないしね。

テストを想定して設計や実装をしないとあとあと時間が取れてもテストしにくくて萎えるので、テストの理論をやります。というか私が懇親会でテストの話をしたいのでテストの話を提供します。銀の弾丸の話をしても「自分はテストを書いてないから関係ない」ってなったら悲しいし。

【LT】ARC vs. GC?ARC in GC

ARC vs. GC?ARC in GC? | iOSDC Japan 2017

このエントリーをはてなブックマークに追加

みんな strong weak の話ばかりしてGCの話をあまり聞かないので、ARCとGCの話をします。その上でSwift4の新しいメモリ管理の話もします。

「SwiftはGCを採用してない」って発言するとGC警察に捕まるので、ちゃんと「世代別GC etc.を採用してない」とか正しく発言しましょう。

【LT】郵便屋さんの演算子

郵便屋さんの演算子 | iOSDC Japan 2017

このエントリーをはてなブックマークに追加

このLTを聞くとなんの文字を演算子定義に使えるのかわかるようになります。せっかくなので面白い名前の演算子でも考えましょう。ちなみに演算子定義がわかると変数名定義のルールもわかります。

サンプル問題

第1問!演算子定義に使えるのはどれで使えないのはどれ?→ ▶️ 🐶

このへんの公式ドキュメントが間違ってたのでこの間フィードバックから修正依頼出した。ほめてほめて。

本音

早稲田生だけチケット無料でずるいから私も登壇して無料チケット取りたい
いやほら、どっかの企業さんが負担してくれるって話もあるけど私首都圏住みだし登壇した方が有意義じゃん?

技術書典2に初参加した

初めて参加するイベントの運営の手伝いをやりました。

あらすじ

🐑「(訳あり風に)4月9日暇ですか?」
私「えーっと何か予定入ってたっけ、手帳を見てみないと……」

f:id:S_Shimotori:20170410164938j:plain

私「なるほどだなあ」
私「初参加ですが頑張ります」

やったこと

  • 椅子並べた
  • 机並べた
  • ダンボール箱運んだ
  • 雨ダァ…終ワッタァ……雨ノ日ニ外ニ並ンデイタダク最悪ノぱたーん…

戦利品

フロッピーディスク煎餅

私はぎりぎりフロッピーディスクがわかる世代である。我が家に初めて来たデジカメはSDカードではなくFDに記録するデジカメだったし、高校の家庭科の授業では個人データの保存先がFDだった。

みんなにとってFDってなんなんだ。

食べないと湿気るよねぇ、もったいないなあ。

Swift + Xcode + ScreenSaverFramework でつくるMac向けスクリーンセーバー作成本

こいつの設定がいるっぽい。あとはInfo.plistのPrincipal classが合っているかどうかかな?
f:id:S_Shimotori:20170410175923p:plain

画像を使おうと思ったが、デバッグ時に Bundle.main.resourcePath
/Applications/System Preferences.app/Contents/Resources
を指していたり本番時に /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/Resources
を指していたりとカオスだったので諦めた。

f:id:S_Shimotori:20170411000727p:plain

仕方ないのでCIFilterが毎回画像を生成してる。。

github.com

Unicodeポスター

貼るところがないことはわかっていた。でも買うしかなかった。

f:id:S_Shimotori:20170411140804j:plainf:id:S_Shimotori:20170411140817j:plain

誰もちゃんと教えてくれなかったUSB充電の歴史 / 誰もちゃんと教えてくれなかったUSB充電の中身

読み物。

なんと各国でのUSBの規格の歴史まで書いてあった。後者は簡単な回路が書いてあって目が潰れた。
type A〜Cが存在するくらいの知識しかなかったけど、これを読んでちょっと詳しくなった気がする。

鯨と蜂蜜

honeypot on Docker。
セキュリティとかインフラのことはちっともわからないけど、Dockerなら文字情報だしわかりやすいかなって。
最後には実際にAWSで2週間やってみたときの状況についてのお話が載っていて、それも面白かった。

Swiftの3大プロトコルを眺める

熊谷さんがgistに投稿するたびに自動で原稿吐いて冊子にまとまるシステム欲しくない?
Swift TweetsでSwift Standard Libraryの話する予定なのでこれで予習してる。

技術書典スタッフ

私以外にも何人か応援に来ている人がいた。


Swiftは扱いがあったので岸川さんは泣いてなかったと思う(?)

3週連続で西新宿に行ってきた #tryswiftconf #droidkaigi #落し物

学生なので春休みを満喫している。今はM1なので、長期休みも実質あと

  • 2017年春
  • 2017年夏 修論中間発表
  • 2018年春

2回を残すのみとなった。家族からは残り少ない長期休暇で旅行にでも行ったらどうかと言われた。

でも西新宿が私を呼んでいるんだ。
実際1ヶ月のうちの1/4をカンファレンスで消費するってバイトしてない研究もしてない感あるし春休みでしょ。

try! Swift

www.tryswift.co

try! iOSではないかというツッコミがあまりにも多すぎて面白かったけど気にしないことにする。昨年の「あまりにも早く申し込んだ結果学割ではなく早割を買ってしまって数万払った」という武勇伝を反省し、ちゃんと学割を買って参加。

デレステ廃課金Pを見てもわかる通り、大学生はプログラミングでお金を稼いでいるので自腹早割でも問題ないのである。
金を浮かせて技術書を買うべきなので学割は大事。

iOS(UIKit)は正直あんまり興味がないし、そっちの話はiOSDCで聞けばいいので、目玉はやはりSwift語の発表とサーバサイドSwift。

ちなみに復習進捗状況:

  • サーバサイド関係: Swift3.1待ち。出たら開発再開する。
  • テスト関係: 同上
  • 標準ライブラリ関係: まずは全体図をつかもうと思ってgraphvizで継承関係を描いてみた。

qiita.com

f:id:S_Shimotori:20170314162203p:plain

画像サイズは5MBくらい。エッジが密集していてComparableとEquatableが大人気ということしかわからないので、今はノードの位置の調整と、どの子に注目して見ていくか考え中。

DroidKaigi

droidkaigi.github.io

今年もスタッフをやった。基本的にはご飯配布等をしつつ、時々司会をやって発表を聴講。しかしAndroidの知識がないままこの1年を過ごしたので何もわからない。React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るかなんかはiOSの話も出てきたのでなんとなくわかったけど。

Android関係の面白そうな本をここにメモしておく。

あと1冊忘れた。思い出したら書き足す。来年はこれを読み、実機も買って万全の態勢で臨みたい。

落し物

DroidKaigi会場に研究室の鍵を落とした。

3月10日(金)…
お昼過ぎ: 落とす。
21時頃: スタッフが新宿東口の交番に落し物を預ける。

3月11日(土)…
お昼過ぎ: 落としたことに気づく。落し物リストに鍵を発見。

3月13日(月)…
午前: 西新宿にある新宿警察署に行く。届いていないと言われる。遺失物の届出のみ済ます。
午後: 大学事務に鍵記載の番号を問い合わせる。

3月14日(火)…
午後: 落し物の特徴欄の更新のため西新宿へ向かう。道中、大学側から「落し物をした連絡が来ているので新宿署に行け」というメールが送られてくる。拾得物番号とハンコと身分証を見せて回収する。

2回も余分に西新宿に行くはめになった。みなさん落し物には気をつけましょう。

後の春休みはSwiftをやって暮らすつもり。

DroidKaigi直前のCONBUさんにお邪魔してきた

しもとり「そうだ、ここにAP実物あるんだし、今のうちにこのiPhoneで接続してみよう」
CONBUさん達「こいつDroidKaigiから来たって名乗ったくせにiPhone使ってるぞ?」
しもとり「^^;」

学校から借りたNexusくん、そろそろ返却しなきゃいけないので厳しい。

DroidKaigi

droidkaigi.github.io
今年もやるよ。会場はtry! Swiftと違うベルサール新宿だよ。

最近いろんなイベントがベルサールを使っているので、世界が住友不動産色に見えてきてない。

CONBUさん

CONBU - COnference Network BUilders :: ホーム
カンファレンスのページにこの方々が載っていると快適なネット環境が期待出来る。

何で行ったの?

インフラもネット敷設も何もわからないので、一目見て見聞を広めてきた。

先輩同輩後輩各位は、貧弱ネット環境管理に苦心した懐かしい日を、
前研究室助教大先輩様は、ルーターの設定方法がわからなくてわめいていた私を助けたことを思い出すことだと思う。
(どっちも家庭用)

自宅(実家)のネット環境も父親が管理しているので、契約周りもよくわかってない。

DroidKaigi準備中!

f:id:S_Shimotori:20170223234157j:plain
奥の平たくて四角いのがアクセスポイントで、手前がルーターで、その左がスイッチらしい。私がわかるのはよく天井に張り付いてるアクセスポイントまでだった。もうだめだ。

試しにネットサーフィンやらSSHやらしてみたら爆速。目の前にAPがあるという理想的な環境とはいえ、普段貧弱な環境で息苦しい私にとっては感動を覚える速さだった。

DroidKaigiネットワークスポンサーはSansanさまとリクルートライフスタイルさまです。ありがとうございます!

CONBUさんオススメ資料

本としてはなかなかまとまってないらしい。

知識皆無の私にとって最大の驚きは、監視のためにさくらクラウドを噛ませているところ。機材(物理)を設置して終わりかと思ってた。クラウド時代のネットワーク敷設にはクラウドを使うらしい。

1,000人超の大規模開発者イベント「YAPC::Asia Tokyo 2013」を支えたネットワークインフラ構築の舞台裏~プロフェッショナルのボランタリーが生み出したチカラ|gihyo.jp … 技術評論社

このネットワーク機能のクラウド化とは,DHCPサーバ,DNSサーバ,ルータ機能などを,さくらインターネット上のクラウドに構築し,すべての機能をさくらインターネット経由で行ってしまおうというものです。

クラウドなら私も触ることがあるし、知っておいたほうが面白いかなと思ったけど、この辺りはやはり実機での知識があればわかるそうだ。やはりこの辺の知識が私には足りていない……。どうやって構築してるんだろう。

その他聞いたこと

何でもかんでもペラペラしゃべったらこわそうだからこのへんでやめとこw
いや〜残念だなこんなにわくわくしたのをな〜〜

「ケーブルは踏まれたり挟まれたりで傷みやすく、調子悪くなってないか丹念に調べるよりは使い捨てたほうが楽」っていうのはカンファレンスらしい事情だなって思った。

CONBUさんの次回作

www.elixirconf.jp

お忙しいところありがとうございました。お邪魔しました!

Swift雑記 in 2016 winter

qiita.com

iOSから解き放たれてpureなSwiftを書きたい、しかも誰も書いたことがない題材で!
→その頃たまたま触っていたipythonの存在に気づく、当然誰もSwift kernelは書いてない(それplaygroundでよくね?)
→やはり難易度が高かったので適当にごまかすカレンダー

ipython

IPython kernels for other languages · ipython/ipython Wiki · GitHubに各言語のkernelが書いてある

この辺が参考になりそう
Making kernels for IPython — IPython 3.2.1 documentation
Making kernels for Jupyter — jupyter_client 5.0.0.dev documentation
Creating Language Kernels for IPython - Andrew Gibiansky

シンプルで参考になりそうなやつ:
GitHub - dsblank/simple_kernel: A small, simple kernel example for IPython
これを読んでいた。C#でいけるならSwiftにもチャンスあるでしょ!(?)

SwiftはCLionで書ける

CLionにのみSwiftプラグインが存在する。IntelliJ IDEAにはない。AppCodeは確かに書けるけどあれはiOS

Swift plugin for CLion | CLion Blog
ちょうど去年の今頃の記事だ。
でも別にSPMで持ってきた定義とリンクさせてくれるわけじゃないので微妙。

ZeroMQ for SPM

存在していることにびっくり。
GitHub - Zewo/ZeroMQ: ZeroMQ for Swift

SPMって相変わらずブランチ最新が取れないので、ライブラリによっては「最新は対応してるけどまだバージョンタグきってない」の状態でそのままじゃ取れない時がある。(だよね?)

Cのヘッダファイル

SPMでとってくるテクニックがあったのだが、今は使えない気がする。
Ship C code with swift packages using swift package manager – ankit.imにも書いてある公式ドキュメントは消されてしまった。

つらすぎ。

Range実装

Pythonrangeの実装(Objects/rangeobject.c)を読んだ - Qiitaので、Swiftの方も目を通してみた。

swift/Range.swift.gyb at master · apple/swift · GitHub
PythonがCでゴリゴリやっているのに対し、SwiftはSwiftで実装している。向こうはCという関係上 PyLonglong をさまよっていた。こっちはそういう話ではなく、Swift 3のRange徹底解説 - Qiitaにもあるような開区間だの Int 刻みだのの次元の話をしている。

ぬる安全問題、そして型

議論を読んでいて、なくても平気という人がそこそこいた。みんなぬるぽとか型の間違いをしないのだなあ、いつも間違える私とは違うと驚いた。

型といえば、
Pythonなんか書いた日には生産性がわるい。pandas.DataFrame — pandas 0.19.1 documentationのいう array-like が、ビルトインのlist以外にNumPyのarrayを含むかどうかがぱっと見でわからないのはしんどい。どこまでがarray-likeでそうじゃないんだ。ListProtocol(仮名)準拠のものならなんでも、とかそういう書き方をしてほしい。
PHPも同様。PHP: date_parse - Manualとか、 array を返すと言っておきながら失敗時に FALSE を返すとも言っている。
とかいう文句を私はずっと言っているので、こういうらくちんな言語を書くのに向いてない。

その点Swift Standard Library | Apple Developer Documentationは引数も戻り値も明確で軟弱な私にはありがたい。軟弱すぎる?ダメ?

懺悔

ここだけの話(じゃない)んですけど、
株式会社コンセプトっていうと通じないんですけど、ぬる安全の話の発端の集団って説明すると通じるの便利すぎてやめられない。ごめんなさい。

次回予告

Swift Tweets

LTで抽選に登録してます!どきどき。もし通ったら型とかFPの話になると思う。
来年も勉強頑張るぞ。

2016ねん

qiita.com

エンジニアになりたい女学生さん

はーい

雇って!

最近悔しかったこと

某コンテストの女子学生参加者1人。自分が予選通過していれば2人だったかも。
某大学対抗コンテストの女子学生参加者が女子大オンリー。自分が参加していれば集合写真が「男男男」「男男男」「男男」「男男男」「女女女」「男男男」「男男男」「男男男」だったかも。

……なんて、
自分が参加しようというほどの実力と積極性とコミュニケーション能力がないので、おうちのこたつでみかん食べる。完。

でもちょっとだけ悔しい。

最近ちょっと考えさせられたこと

最近冬ごもりに買ったもの

  • ラズパイ……防犯カメラ作る。
  • ネコタコ*1の大量のTシャツとパーカー……割引アンド送料無料で買うしかなかった。
  • Slack靴下……まだ届いてない。なんとかしてクリスマスツリーに設置したい。
  • 型システム入門……高いので借りた。むずかしそう。

積みではない。積みでは。

最近の妄想

交通費と宿泊費に旅行代全部つぎ込んで、いい旅館でもくもく合宿する。観光はしない。
高校のオタク系同級生あたりだったらなんでもあり創作合宿できそうな気がするけど、ダメだったら1人でも行く。
1人で部屋泊まると高いので誰か助けて。

大学にはもくもくする/創作する系の友達がいない。プログラミングの授業の時に全力で救ってそういう方向に引きずればよかったのだろうか。今になってはよくわからない。
え?友達ならちゃんと救え?いや、なんか、その、うん、課題さえ終わればいいかなみたいなのあるじゃん、みんな授業を経るごとにプログラミング嫌いになってくし。情報系なのに。

今年始めた言語

せっかくその言語を書くからにはその言語の長所とか特徴にノッて書きたいと思ってる。

その点Pythonはよくわからない。私がPythonを書くと、Pythonの長所特徴じゃなくてNumPyの長所特徴に乗っかって書いてるだけになってしまう。「Pythonが使われるのはPythonそのものが目的じゃなくてNumPyでしょ?w」みたいな。
Pythonらしさってなんだろう。難しい。インデントと文末のコロンじゃなくてだな。Cythonチューニングマスターとかになればいいのかな。うーん。

Kotlinはモバイル以外にもまともに使えるという点でSwiftの1000000000倍くらいえらい。

最近の疑問

暗黒美夢王さんや江添亮さんタイプの女性エンジニアが存在するか否か(伝われ)

当面の目標

内定

まとめ

技術に関するものであれば言語・ジャンル・内容は問いません。

技術に関するもの書いたっけ

*1:親命名・例の""ヤツ""