genericsとassociated typeとduck typing(とSwift)
いつもこの辺の話を忘れちゃうのでメモ。
Why does Go not have generic types?
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を使う姿を想像できない。
「golang と Generics と私」
まあこれ自体は置いといて、Swiftには数値関係のprotocolがたくさんある。なんなら Numeric
という例で出てきたものと同じ名のprotocolまであるがどうか。
Swift標準ライブラリにはprotocolで構成される巨大な継承ツリーがある。その中から数値型を抜粋するとだいたいこうなる:
Swiftの数値型の元締めが問題の Numeric
である*1。 Numeric
は二項演算能力(ただし和差積のみ)を指す。名前が一致しているしこいつが全部解決しそうしない。
なぜなら Numeric
は Self
同士の、つまり同型同士の二項演算能力を指すからである。 Int
/ UInt
/ Float
/ Double
のごった煮の和は管轄外。
演算子システムもしっかり型を限定してくれる Self
先生も好きです(ほんと)
全 Int
/ UInt
/ Float
/ Double
で MyNumber
を実装するのがだるいなら Numeric
1人に実装すれば解決するしない。宣言済みのprotocolに後から別のprotocolを継承することはできない。mattn氏の例と同様に全ての数値型で実装する必要がある。頑張りましょう。
Java の Generics にもの思い - QiitaのJavaでは <T extends Number>
を利用しているが、Javaの数値参照型の元締め Number
は
抽象クラスNumberは、プリミティブ型byte、double、float、int、long、およびshortに変換可能な数値を表すプラットフォーム・クラスのスーパークラスです。
で我らが Numeric
とは別物である。よってこのJavaの例をそのままSwift語に書き換えてもうまくいかない。
Swift: Why Associated Types?
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
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
JavaとScalaとC#のジェネリクス機能比較表
よっしゃ!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】郵便屋さんの演算子
このLTを聞くとなんの文字を演算子定義に使えるのかわかるようになります。せっかくなので面白い名前の演算子でも考えましょう。ちなみに演算子定義がわかると変数名定義のルールもわかります。
サンプル問題
第1問!演算子定義に使えるのはどれで使えないのはどれ?→ ▶️
🐶
⏰
このへんの公式ドキュメントが間違ってたのでこの間フィードバックから修正依頼出した。ほめてほめて。
本音
早稲田生だけチケット無料でずるいから私も登壇して無料チケット取りたい
いやほら、どっかの企業さんが負担してくれるって話もあるけど私首都圏住みだし登壇した方が有意義じゃん?
技術書典2に初参加した
初めて参加するイベントの運営の手伝いをやりました。
あらすじ
🐑「(訳あり風に)4月9日暇ですか?」
私「えーっと何か予定入ってたっけ、手帳を見てみないと……」
私「なるほどだなあ」
私「初参加ですが頑張ります」
やったこと
- 椅子並べた
- 机並べた
- ダンボール箱運んだ
- 雨ダァ…終ワッタァ……雨ノ日ニ外ニ並ンデイタダク最悪ノぱたーん…
戦利品
フロッピーディスク煎餅
私はぎりぎりフロッピーディスクがわかる世代である。我が家に初めて来たデジカメはSDカードではなくFDに記録するデジカメだったし、高校の家庭科の授業では個人データの保存先がFDだった。
みんなにとってFDってなんなんだ。
食べないと湿気るよねぇ、もったいないなあ。
「#技術書典」はどんな様子なのでしょうか?https://t.co/ByTZf7t31w
— Twitter モーメント (@momentsjapan) April 9, 2017
Swift + Xcode + ScreenSaverFramework でつくるMac向けスクリーンセーバー作成本
こいつの設定がいるっぽい。あとはInfo.plistのPrincipal classが合っているかどうかかな?
画像を使おうと思ったが、デバッグ時に Bundle.main.resourcePath
が
/Applications/System Preferences.app/Contents/Resources
を指していたり本番時に
/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/Resources
を指していたりとカオスだったので諦めた。
仕方ないのでCIFilterが毎回画像を生成してる。。
Unicodeポスター
貼るところがないことはわかっていた。でも買うしかなかった。
誰もちゃんと教えてくれなかったUSB充電の歴史 / 誰もちゃんと教えてくれなかったUSB充電の中身
読み物。
なんと各国でのUSBの規格の歴史まで書いてあった。後者は簡単な回路が書いてあって目が潰れた。
type A〜Cが存在するくらいの知識しかなかったけど、これを読んでちょっと詳しくなった気がする。
鯨と蜂蜜
honeypot on Docker。
セキュリティとかインフラのことはちっともわからないけど、Dockerなら文字情報だしわかりやすいかなって。
最後には実際にAWSで2週間やってみたときの状況についてのお話が載っていて、それも面白かった。
Swiftの3大プロトコルを眺める
熊谷さんがgistに投稿するたびに自動で原稿吐いて冊子にまとまるシステム欲しくない?
Swift TweetsでSwift Standard Libraryの話する予定なのでこれで予習してる。
技術書典スタッフ
私以外にも何人か応援に来ている人がいた。
3400名の来場者は本当にすごい。
— Taisuke OE (@OE_uia) April 9, 2017
そしてまさかのScala本なしでブワッ(';ω;`)となったので、Scalaクラスタの方誰か・・・
俺「#技術書展 行きたい」
— 都元ダイスケ🍅 (@daisuke_m) April 9, 2017
嫁「なにそれ」
俺「技術書のコミケみたいなもん」
嫁「Scala × Javaとか?」
俺「」
Swiftは扱いがあったので岸川さんは泣いてなかったと思う(?)
3週連続で西新宿に行ってきた #tryswiftconf #droidkaigi #落し物
学生なので春休みを満喫している。今はM1なので、長期休みも実質あと
- 2017年春
2017年夏修論中間発表- 2018年春
2回を残すのみとなった。家族からは残り少ない長期休暇で旅行にでも行ったらどうかと言われた。
でも西新宿が私を呼んでいるんだ。
実際1ヶ月のうちの1/4をカンファレンスで消費するってバイトしてない研究もしてない感あるし春休みでしょ。
try! Swift
try! iOSではないかというツッコミがあまりにも多すぎて面白かったけど気にしないことにする。昨年の「あまりにも早く申し込んだ結果学割ではなく早割を買ってしまって数万払った」という武勇伝を反省し、ちゃんと学割を買って参加。
デレステ廃課金Pを見てもわかる通り、大学生はプログラミングでお金を稼いでいるので自腹早割でも問題ないのである。
金を浮かせて技術書を買うべきなので学割は大事。
iOS(UIKit)は正直あんまり興味がないし、そっちの話はiOSDCで聞けばいいので、目玉はやはりSwift語の発表とサーバサイドSwift。
ちなみに復習進捗状況:
- サーバサイド関係: Swift3.1待ち。出たら開発再開する。
- テスト関係: 同上
- 標準ライブラリ関係: まずは全体図をつかもうと思ってgraphvizで継承関係を描いてみた。
画像サイズは5MBくらい。エッジが密集していてComparableとEquatableが大人気ということしかわからないので、今はノードの位置の調整と、どの子に注目して見ていくか考え中。
DroidKaigi
今年もスタッフをやった。基本的にはご飯配布等をしつつ、時々司会をやって発表を聴講。しかしAndroidの知識がないままこの1年を過ごしたので何もわからない。React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るかなんかはiOSの話も出てきたのでなんとなくわかったけど。
Android関係の面白そうな本をここにメモしておく。
Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)
- 作者: 有野和真
- 出版社/メーカー: 技術評論社
- 発売日: 2017/03/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
あと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準備中!
奥の平たくて四角いのがアクセスポイントで、手前がルーターで、その左がスイッチらしい。私がわかるのはよく天井に張り付いてるアクセスポイントまでだった。もうだめだ。
試しにネットサーフィンやらSSHやらしてみたら爆速。目の前にAPがあるという理想的な環境とはいえ、普段貧弱な環境で息苦しい私にとっては感動を覚える速さだった。
DroidKaigiネットワークスポンサーはSansanさまとリクルートライフスタイルさまです。ありがとうございます!
CONBUさんオススメ資料
本としてはなかなかまとまってないらしい。
- CONBUの無線LAN構築術―カンファレンスネットワークの作り方:特集|gihyo.jp … 技術評論社
- enukane (naoya Kaneko) · GitHub
- Internet Week 2016 T15 Wi-Fi"再"入門 見えない電波を知識で見抜く~社会的課題も交えて~
知識皆無の私にとって最大の驚きは、監視のためにさくらクラウドを噛ませているところ。機材(物理)を設置して終わりかと思ってた。クラウド時代のネットワーク敷設にはクラウドを使うらしい。
このネットワーク機能のクラウド化とは,DHCPサーバ,DNSサーバ,ルータ機能などを,さくらインターネット上のクラウドに構築し,すべての機能をさくらインターネット経由で行ってしまおうというものです。
クラウドなら私も触ることがあるし、知っておいたほうが面白いかなと思ったけど、この辺りはやはり実機での知識があればわかるそうだ。やはりこの辺の知識が私には足りていない……。どうやって構築してるんだろう。
その他聞いたこと
何でもかんでもペラペラしゃべったらこわそうだからこのへんでやめとこw
いや〜残念だなこんなにわくわくしたのをな〜〜
「ケーブルは踏まれたり挟まれたりで傷みやすく、調子悪くなってないか丹念に調べるよりは使い捨てたほうが楽」っていうのはカンファレンスらしい事情だなって思った。
CONBUさんの次回作
お忙しいところありがとうございました。お邪魔しました!
Swift雑記 in 2016 winter
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実装
Pythonのrangeの実装(Objects/rangeobject.c)を読んだ - Qiitaので、Swiftの方も目を通してみた。
swift/Range.swift.gyb at master · apple/swift · GitHub
PythonがCでゴリゴリやっているのに対し、SwiftはSwiftで実装している。向こうはCという関係上 PyLong
と long
をさまよっていた。こっちはそういう話ではなく、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は引数も戻り値も明確で軟弱な私にはありがたい。軟弱すぎる?ダメ?
懺悔
ここだけの話(じゃない)んですけど、
株式会社コンセプトっていうと通じないんですけど、ぬる安全の話の発端の集団って説明すると通じるの便利すぎてやめられない。ごめんなさい。
次回予告
LTで抽選に登録してます!どきどき。もし通ったら型とかFPの話になると思う。
来年も勉強頑張るぞ。
2016ねん
エンジニアになりたい女学生さん
はーい
雇って!
最近悔しかったこと
某コンテストの女子学生参加者1人。自分が予選通過していれば2人だったかも。
某大学対抗コンテストの女子学生参加者が女子大オンリー。自分が参加していれば集合写真が「男男男」「男男男」「男男女」「男男男」「女女女」「男男男」「男男男」「男男男」だったかも。
……なんて、
自分が参加しようというほどの実力と積極性とコミュニケーション能力がないので、おうちのこたつでみかん食べる。完。
でもちょっとだけ悔しい。
最近ちょっと考えさせられたこと
かたやこっちは「情報系女子は足りないんだから1人たりともドロップアウトしないように丁寧な教育をしてほしい」とか外から言われるわけで、ホント立場によって見方が全然違う。こういう話題は時代・校風・分野によって全然議論がかみ合わなくなりやすい。
— 1T0T akay uki (@1T0T) November 30, 2016
最近冬ごもりに買ったもの
- ラズパイ……防犯カメラ作る。
- ネコタコ*1の大量のTシャツとパーカー……割引アンド送料無料で買うしかなかった。
- Slack靴下……まだ届いてない。なんとかしてクリスマスツリーに設置したい。
- 型システム入門……高いので借りた。むずかしそう。
積みではない。積みでは。
最近の妄想
交通費と宿泊費に旅行代全部つぎ込んで、いい旅館でもくもく合宿する。観光はしない。
高校のオタク系同級生あたりだったらなんでもあり創作合宿できそうな気がするけど、ダメだったら1人でも行く。
1人で部屋泊まると高いので誰か助けて。
大学にはもくもくする/創作する系の友達がいない。プログラミングの授業の時に全力で救ってそういう方向に引きずればよかったのだろうか。今になってはよくわからない。
え?友達ならちゃんと救え?いや、なんか、その、うん、課題さえ終わればいいかなみたいなのあるじゃん、みんな授業を経るごとにプログラミング嫌いになってくし。情報系なのに。
今年始めた言語
- Kotlin
- Python
せっかくその言語を書くからにはその言語の長所とか特徴にノッて書きたいと思ってる。
その点Pythonはよくわからない。私がPythonを書くと、Pythonの長所特徴じゃなくてNumPyの長所特徴に乗っかって書いてるだけになってしまう。「Pythonが使われるのはPythonそのものが目的じゃなくてNumPyでしょ?w」みたいな。
Pythonらしさってなんだろう。難しい。インデントと文末のコロンじゃなくてだな。Cythonチューニングマスターとかになればいいのかな。うーん。
Kotlinはモバイル以外にもまともに使えるという点でSwiftの1000000000倍くらいえらい。
最近の疑問
暗黒美夢王さんや江添亮さんタイプの女性エンジニアが存在するか否か(伝われ)
当面の目標
内定
まとめ
技術に関するものであれば言語・ジャンル・内容は問いません。
技術に関するもの書いたっけ
*1:親命名・例の""ヤツ""