crates.ioのTravisCIバッジはtravis-ci".com"じゃなくてtravis-ci".org"なので気をつけよ
はまりました
要点
- TravisCIにはtravis.comとtravis.orgの二つドメインがある
- Cargo.toml
[badges] travis-ci
でcrate.ioに貼れるバッジはtravis.orgのステータスをみてる - .orgから.comに移行予定らしい The Travis CI Blog: Announcing support for open source projects on travis-ci.com
- 両方でログインできてもそれぞれ別のアカウント(別のユーザーid)扱いっぽい
- なので両者で設定は同期されない。もしテストコードに環境変数呼んでるやつがあれば、.comと.orgの両方で設定しておかないと片方こけてるかもしれない
passしてるのにcrates.ioのバッジはまっかなときはtravis-ci.org
のほうを確かめよう
詳細は割愛しますが、「歴史的な理由」です。GitHubでパブリックなレポジトリは.orgで、プライベートなレポジトリは.comという振り分けでした。近いうちに統合されます。
— Travis CI (@travisci) 2018年10月1日
余談
数日前Rustのライブラリを公開した際に嵌った。
crates.ioでパッケージを検索すると、なじみのステータスバッジが貼ってあるクレートをみれると思う。
あれはCargo.tomlで指定することで表示することができる。
こんな風に書く。
[badges] travis-ci = { repository = "totechite/annict-rs" }
ブランチも指定できるけど何も書かないとmasterになる。
バッジの他にもキーワードだったりカテゴリを指定できる。書いておくと見つけてもらいやすくなるかもしれない
The Manifest Format - The Cargo Book
RustでオレオレMarkdownパーサーつくった
MarkdownのString与えるとそれっぽいHTMLのStringを吐くライブラリです。
せつめい
CommonMarkの仕様を見ながらよく使いそうな機能をかいつまんで実装した。
オレオレとあるのはこの仕様を網羅してないからだ。なんか細かい挙動の仕様は気にせずつくったので、多分いじわるな書き方されるとうまくパースできない気がする。
それでも# 見出し
や- リスト
、[リンク]: URL "title"
、![画像](URL)
やコードブロックなどのよく使いそうな機能はそろったのでノリで公開してみた。
そんな雑な出来だけど、アピールポイントを挙げるとするなら、Rustが公式提供しているRegexを除けば外部ライブラリを使用していないので軽量なことかなと思う。
振り返りと反省
雰囲気としては、
markdownテキスト
↓
字句解析
↓
なんか中間表現的なやつ
↓
構文解析
↓
HTML
って感じです。パーサー書くのこれが初めてなので分からないけど割とオーソドックスな構成なんじゃないだろうか。
出力フォーマットが現状HTMLだけなのでわざわざ中間表現にするうま味が薄いように思えたけど、字句解析のコードと構文解析のコードをすっぱり分けることができたのでやった価値はある気がする。
字句解析のコードは、字ではなく行単位で舐めていくなんとも雑な実装になっており、素直に1charづつ進め先読みをしながらtokenizeしたほうが良かった気もする。なぜならその方がカッコいいから。
字句を消費する関数と字句解析を実行する関数のガワが完成した後は、その中に字句の種類を判別するコードを継ぎ足していく段階となる。やってることは正規表現ゲーなので、あまり見栄えのよいコードではない。
きっかけとか一区切りついての感想
最近Rustの勉強しはじめ、はやく慣れたいのでなんか書きたいというのがモチベーションにあり、去年buildersconというカンファレンスではてなのエンジニアさんが話していたGoで書かれた軽量マークアップ言語パーサーのセッションを思い出して、おもしろそうだったのでチャレンジした。実際パーサを書くのはおもしろかった。
先述したセッションのなかでもお話されているが、パーサーは構文機能をちょこちょこ継ぎ足していくことでつくっていくのだけど、
個々の機能は少量の記述で済むので継続しやすく、なにより成果が目に見えやすいのでやる気の維持で悩むことはなかった。
今みるとスピーカーの方は入門としてJSONのパーサーを薦めていたがすっかり忘れてた。次はJSONパーサー書いてみたいね。
勉強したこと
パーサー書くのこれが初めてなので、世界観理解するためにOreillyの言語実装パターン―コンパイラ技術によるテキスト処理から言語実装までって本をよんで勉強した。
はじめに、括弧と文字列だけの単純な構造をしたテキストのパーサーをつくっていく章があり、それが雰囲気をつかむことにとても役立った。
サンプルコードはJavaでかかれていて、Javaはまともに書いたことがなかったけど、ちょっと難しい機能(アノテーションとか)は使ってないやさしいコードだったので割と読めた。
僕はちなみに、ホイホイと技術書買えるお金もないので、学校の図書館でそれ借りたのだけど返却をせかされて、結局その序盤のページしかまともに読んでない。
それでも雰囲気はつかめた気はしたので、この本はすごいためになった。(小並感)
言語実装パターン ―コンパイラ技術によるテキスト処理から言語実装まで
- 作者: Terence Parr,中田育男,伊藤真浩
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/12/24
- メディア: 大型本
- 購入: 5人 クリック: 333回
- この商品を含むブログ (13件) を見る
collect()とか::<T>構文とか
collect()
はイテレータを指定のコレクション型にキャストするメソッド
利用場面はこんな感じだと思う
//処理をして再びコレクションとして扱う let v = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9]; let closure = ここで処理内容は重要ではない ; let result: Vec<u8> = v.iter().map(&closure).collect(); //Rangeから数値のベクタをつくる let result :Vec<u8> = (0..10).collect();
collect()
を使うときはなんらかの形で型を明示しなければいけない。*1
先のコードでは変数に型アノテーションを付与したが、別の方法もある。
Rustでは::<T>
という構文で戻り値の型を指定することができる。turbofishっていう構文らしい
例えば先のコードはこんな風に書ける
let result = v.iter().map(&closure).collect::<Vec<u8>>();
collect()
にかぎらず他のメソッドでも同様に使えるようだ
let v = Vec::<i32>::new(); let x = "42".parse::<i32>(); assert_eq!(42, x.unwrap())
なんだか引数のように型を指定できて、僕はこちらも好きです
勉強したサイト
Rust の turbofish と GHC 8 の Type Application ― または我々は如何にして多相な関数を単相化するか - ryota-ka's blog
ジェネリクスとturbofishの公式doc、旧版だけどわかりやすかった
Generics - The Rust Programming Language
現行の第2版
B - Operators and Symbols - The Rust Programming Language
イテレータの要素をフィルタリングして返すやつ
イテレータの中から条件にマッチする要素をフィルタリングして、別のイテレータオブジェクトにつめこみたいとき
Rubyではselect
というメソッドをつかって簡単に書くことができる
array = [1, 2, 3, 4, 5, 6, 7, 8, 9] a_result = array.select { |n| n%3 == 0 } a_result == [3, 6, 9] // => true hash = {apple: 2, banana: 1, orange: 4} h_result = hash.select { |k, v| v > 3 } h_result == {orange: 4} // => true
イテレータの要素をクロージャの引数に渡し、戻り値が真だった時の要素をつめたオブジェクトを返している
Rustではfilter()
という名前で実装されている
引数でクロージャをとり、イテレータを返すメソッドだ
use std::collections::HashMap; //連想配列は標準ライブラリで提供されてるのでrequireする let v = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9]; let v_result: Vec<u8> = v.iter().filter(|&x| x % 3u8 == 0).cloned().collect(); assert_eq!(vec![3, 6, 9], v_result); let hash: HashMap<&str, i8> = [("apple", 2), ("banana", 1), ("orange", 4) ].iter().cloned().collect(); let h_result: HashMap<_, _> = hash.iter().filter(|(&k, &v)| v > 3).collect(); assert_eq!("orange".to_string(), h_result.keys().nth(0).unwrap().to_string());
Rubyと似た構文だったのでとっつきやすかった。
webpackとvue-loader v15ではまって解決した
webpack4+Vue単一ファイルコンポーネント+Babelの記事を参考にしたらはまった
最新版で学ぶwebpack 4入門 - BabelでES2018環境の構築(React, Vue, Three.js, jQueryのサンプル付き) - ICS MEDIA
結論からいうとvue-loaderのv15以上を扱う場合、以下の記述が必要だったらしい。
// webpack.config.js const VueLoaderPlugin = require('vue-loader/lib/plugin') module.exports = { // ... plugins: [ new VueLoaderPlugin() ] }
https://vue-loader.vuejs.org/migrating.html#a-plugin-is-now-required
記事はvue-loaderがv14のときの情報なので、それをそのままコピペするとこけて死ぬ。
これで解決した。やったぜ
builderscon tokyo 2017
はじめに
今回でカンファレンス参加はCEDEC2016に次いで2回目となる。
催しが終わってからゆっくり書くつもりだったけど、
東京から大阪へのトンボ返りや少し早めの盆を迎えるなど忙しい日が連日ありクタクタで書く元気がなかった。
閉幕してから既に4日経っており今更感甚だしいが思い出しながら書いていきたい。
私のbuilderscon tokyo 2017
4日と5日の両日参加した。
一日目
まず初っ端にあった、Javascriptを使ったマルチプラットフォームに向けたデスクトップアプリ開発のセッションにとても興味を引かれた。
nodeとelectronのライブコーディングが行われた。electronの具体例としてVScodeのベースとなったmonacoを元にオリジナルエディタを作るというもので、chromiumを利用したその開発速度に驚かされた。
nodeしゅごい
話は変わるけどFCMを使ってwebPushを作ろうと思い最近node勉強し始めたところだったので、node学習のいいモチベーションになった。
今やってるの一段落したら自分もelectron触ってみたいと思う。
二日目
実は寝坊して昼の部からしか行けなかった。
しかしbuildersconのHPを覗いてみるとどうやら録画が見れるらしい。落ち着いたらゆっくり見てみたい。
型を意識したPHPアプリケーション開発というセッションのPHPの型の言語仕様の話が面白かった。
例えば100 + '30YEN'
という式の返り値、
RubyやPythonでは型不一致エラーとなり、JSだと10030YEN
と暗黙の型変換によりint値100がStringと評価され文字結合される。
だけれどPHPの場合、型の不一致が認識されると文字列の頭から数字がないか探して、見つかった数字を数値として評価し置き換える仕様だそうで、つまり暗黙の型変換が行われることで返り値は130
となるらしい。
そんな言語仕様の背景もあり、PHPは型がないと思われがちだが、こちら側で型の厳格さを設定できるのでそうでもないぞとのことだった。
今まで触れてこなかったけどPHP面白いかもしれない。
まとめ
まとめるほどの内容は書いてないけど
buildersconのテーマは「知らなかった、を聞く」とされていて、まさにそんな感じで新しい発見ばかりの楽しい2日間となった。
またカンファレンスの参加は2度目だがこういった催しの魅力をさらに知ることができて良かったと思う。またどこかで開催されたら行きたいな。
心構え的なアレ
自己発信する習慣をつけたかったのでブログ始めてみた。
実はアカウントは2年前に既につくってあったのだが何故当時始めなかったのかは忘れた。
勢いで垢つくったがどうせ書くことないしいいやみたいな感じだったのだろう。多分
ここでは学習中のプログラミング関連の話や趣味の話について書いていきたいと思う。
学んだ内容を文字に起こすことは理解度合いが如実に現れるので、ここに記すことで自分は何がわからないのか整理がつき今後の課題がみえればいいなと
普段教本を読んで写経して分かった気になっている節があるので、この試みはそれへの対策になると期待している。
後々勉強も兼ねてどっかのサーバーインスタンス借りてサイト作ることも検討してる。
どうもサイトジェネレータとかいうくっそ便利なプログラムがあるらしい。それ使えば楽勝やろと踏んでいるがどうなるやら