diary

I like Hatena Star with a text selection.

2020-01-09

Pixel 3が昨晩から充電が全然されなくなってしまったので、修理依頼を出した。 直近で出かける予定はないし、少し不便だけどあまり困らなさそう。

SMSを受け取れないのは少し困るかもしれない。

買って1年以上経っているのでGoogleの保証が受けられなくて代理店になってしまうのが悲しい


github.com

I18n-tasksを見ていたら、いらなさそうなコードが見つかったので消した。

なお、背後にはI18n-tasksからhighlineを消したいという野望がある。とりあえず雑なPRを出して様子見をしている。 https://github.com/pocke/i18n-tasks/commit/479a137fd6e49491c3fcb8f087a035d653be14a0 パッチはあるのだけど、理由が弱いかなあと思って一旦pending。

highlineを使ってRainbowを消すこともできると思うのだけど、それはあまり意味がない(どうせRuboCopが依存しているので)から、まあhighlineを消したいなあ。


github.com

なんか気になったのでRuby 2.7のkeyword argument対応をした。

I18n.t('foo.bar', option)がダメで、I18n.t('foo.bar', **option)にしなきゃいけないのに結構ハマった。

これRails appでハマる人多そうだなあ しばらく考えていたら、次のようなコードが原因でI18n.tが問題だと中々気がつけずにいたということに気がついた。

capture_stderr do
  I18n.t('foo.bar', option)
end

capture_stderrメソッドがstderrを文字列にしてしまうので警告は画面に表示されなくて、2.7では何も起きなくて2.8では突然死ぬ、みたいな地獄ができていた。 しかもI18n.tはrest引数を受け取って無視するので、I18n.t('foo.bar', option)は2.8では素通りしてしまう(単にoptionがrestに吸収されて無視される)という極悪ぶり。 https://github.com/ruby-i18n/i18n/commit/5eeaad7fb35f9a30f654e3bdeb6933daa7fd421d#diff-14d9864ac07456d554843dc2a3b174a4R179

コケていたのは次のテストでした。

https://github.com/glebm/i18n-tasks/blob/4fd3251f6096b5763becefbc93ed849e9c7a92bf/spec/i18n_tasks_spec.rb#L52-L60


github.com

メソッド呼び出しの最後にcurly braces付きのHashリテラルが付いていると怒るCopを消したいという気持ちを表明した。 以前から嫌いだったのだけど、消せる口実ができて気分がいい。

とはいえ正しい方向に矯正するCopが欲しいような気がしていて、そこはrubocop-typedとかでなんとかできないだろうかと考えていたりする。


github.com

rubygemsのドキュメントを読んでいたら不思議なことになっているのを見つけたので報告した。

2020-01-08

github.com

RuboCopのNode PatternからinspireされたAST検索ライブラリ。CLIも付いている。 gem名がffastで若干混乱しそう


github.com

ruby_hl_lvar.vim にPRをもらっていたのだけど、最近使ってなくてレビューする気力がないので誰かレビューしてほしいなとruby-jpでお願いしてみた。 気力が出たら自分でレビューするつもり


github.com

Hashの型を書いた。それなりに量があったけど、むずかしさはあまりなかったと思う。まあもっと型が高機能だったらuntypedになっているところに型をつけられるような気はする。


github.com

るりまのタイトルタグが冗長だなーと思っていたので、短くするPRを出してみた。


最近try toとtry -ingがどっちがどっちだか覚えられたので、次はconfusingとconfusedがどっちがどっちだか覚えられるようになりたい


型があれば hash[:a][:b][:c] をdigに置き換えるCopがfalse positiveなしに書けるじゃんと思っていたのだけど、いざdigの型をつけようとしてみると (*untyped) -> untyped にしかできなくて、digを使うと型が弱くなってしまう…

昨日の自分のruby-jpの発言から。 今のRBSの表現力だと、階層が複数になると型が表現できなくてつらそう。(K) -> V | (*untyped) -> untypedまでは書けるけど、digでキーが1つの場合ってあんまりないだろうしなあ。


github.com

Hashの型をつける時に、CONTRIBUTING.mdを読んでてすこし混乱したところがあったので直した。 ついでにtypoもあったので直している。 インデント直すPRのついでにやってしまえば良かったけど、その時にはまだ気がついていなかったのであった


スペックは低くて良いので24時間動かし続けるサーバーが欲しい。ラズベリーパイを買おうかなあ。 ちょっと調べたけどどこで買ったらいいのか全然分からなかった

2020-01-07

https://github.com/rubocop-hq/rubocop-performance/pull/92#issuecomment-571467024

RuboCop Performanceで気になったところをコメントした。


るりまレビュー会

てぃーびーさんのTracePointのPRをマージして回っていた。 今日は眠いので進捗少なめ。


るりまでHash[]に渡す値の中間値が分からなくて、読んでいてむずかしかったので直した。

github.com

合わせて、Hash[]に渡せる引数の説明が足りていなさそうだったのでIssueを立てた。 あんまりちゃんと調査していないのでPRにはできていない。

github.com

Hash#to_procの説明がちょっと少なすぎるなと思ったので追記した。

github.com


Hashの型をつけていて、Hash#default_proc=to_procを持つオブジェクトも受け取るのを知った。 なにかおもしろいのがないかなと考えていたのだけど、:keyを渡すとvalueからkeyを参照できるHashができておもしろそう。

h = {a: 1, b: 42}
h.default_proc = :key
p h[:a] # => 1
p h[42] # => :b

家のスピーカーで出てこない音があるなと思って色々見ていたら、延長ケーブルが死んでいることが分かったので買い直した。 ガヴリールドロップキックを聴いているとわかりやすい。


気に入っていたヘアオイルがディスコンになったぽくて悲しい。別の製品を探すかあ……


Hashの型を書いていて、Hash#transform_keysがHashを引数として受け取るけどドキュメントも書かれてなくてなんだこれは…?と思っていたら、Ruby 2.8からの新機能だったみたい。 https://bugs.ruby-lang.org/issues/16274

ドキュメントコメントを足すPRをruby/rubyに投げておくと良いかな。

ruby-signatureでは型のバージョンは2.8でいいんだっけ、明日調べて型を書く。

2020-01-06

昨日も書いたけど、労働組合の本を読み始めようとした。ただ選んだ本は労働組合の事例集という感じだったので最初だけ読んでやめた。 まあKindle Unlimitedだったし、そんなものかという感じ。


とりあえず読む本が欲しくなったので石油の本を読んだ。 ただ、これも筆者の推測が多分に含まれているように思えてあまり好きではない。 こういう陰謀論が好きな人もいるのだろうけど、私はまだ陰謀論がどの程度正しいかどうか判断できるだけの基礎知識をつけたい段階なので、事実が書かれている本を読みたい。

結局、世界は「石油」で動いている

結局、世界は「石油」で動いている

まあ新書に期待するのが間違っているのだろうな


hash[:key1][:key2]をdigに書き換えるcopを考えていたら、ruby-signatureのHashの型にdigが定義されていないことに気がついた。というかだいぶ足りない。 Hashを全部巻き取るのはわりかし大変そうな気がする。


そろそろこの日記のpublishを自動化したい


RubyJavaScriptで、String#splitにlimitを渡した時の挙動が異なることを知った。

Rubyの例:

'hoge hoge fuga'.split(' ', 2) # => ["hoge", "hoge fuga"]

JavaScriptの例:

"hoge hoge fuga".split(' ' , 2) // => [ 'hoge', 'hoge' ]

ようするに、limit数以上のseparatorが存在した時の挙動が異なる。Rubyの挙動に慣れていたからJavaScriptの挙動は新鮮だった。

実際問題としてどっちが便利なのだろうか。私がsplitにlimitを渡すときはlimit以上のseparatorが来ることはないこととして使うことが多いような気がする。つまりどっちでもいい


github.com

Markdown (少なくともGFM)では、順序付きリストの中に順序なしリストを入れる時に4 spaces indentが必要。 なんかよくわからないけどインデントされないときはスペースを増やすとだいたいうまく行くというhackがある。


github.com

Hashの型が欲しくなったので型付けしている。

2020-01-05

昨日はrubocop-typedのネタ探しをしていた。 rubocop-railsのIssueを一通りさらったらそこそこの収穫があった。 既存のCopのfalse positiveを潰す方向がやりやすいかなあ。

ただ、Steepで型をどう取ってくるかがまだ良くわかっていないのでそのへんを見る必要がある。 RubyKaigiのCfPには出せないかなあ、微妙…


憲法入門を読み終わった。 Kindle Unlimitedに入っていたので。

https://www.amazon.co.jp/dp/B0764T452V

こういう話が何もわからないまま生きてきたので、少しずつ知識をinputしている。

次は労働組合についての本を読むつもり。あんまりいい感じの本がKindleで見つからないのが残念。 色んな本を読んでいると、労働組合って労働者を守るためとは言え技術の発展を妨げている邪魔者にしか見えないので気になってきた。


github.com

なんかコメントされてた。 すっかり忘れていたけど思ったよりしっかりIssueを書いていて過去の自分はえらい。


現代魔女の就職事情 を読んだ。微妙… https://scrapbox.io/pocke-sub/%E7%8F%BE%E4%BB%A3%E9%AD%94%E5%A5%B3%E3%81%AE%E5%B0%B1%E8%81%B7%E4%BA%8B%E6%83%85


天体戦士サンレッドNを読んだ。5円で買えてすごい。 ドンキがあって安心した(ドンキは好きではないが)


冬休みだしまあ休むのも良い良いなと思って、今日はほとんどコードを書かずに漫画を読んでいた。

2020-01-03

朝どれのRubyで昨日の分の日記をpublishしようとしたらNokogiriのエラーが出た。 とりあえずgem install nokogiriしなおしたら動いた。

/home/pocke/.rbenv/versions/trunk/bin/ruby: symbol lookup error: /home/pocke/.rbenv/versions/trunk/lib/ruby/gems/2.8.0/gems/nokogiri-1.10.7/lib/nokogiri/nokogiri.so: undefined symbol: rb_empty_keyword_given_p

昨日からゆるゆりを見ながら作業している。

「あかりうすしお大好き」の回、狂気を感じてしまってすこしにがて


るりまでコメントしたPRを、自分で直してマージしていっている。

https://github.com/rurema/doctree/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+involves%3Apocke

とかから自分がコメントしたやつを探している

今日は気分が乗ったのでるりまのPRを沢山マージした。 TracePoint周りを見ているのだけど、バージョン差が多くて安定したexampleを書くのが少し大変そう。 まあある程度安定させつつ最新版で動けばいいかなぐらいの気持ち。


ruby-signatureで、あるクラスにincludeされることを目的としたmoduleってどう型を定義したら良いのだろう。

module M
  def print_request
    p request
  end
end

class ApplicationController
  include M
end

このケースではMはrequestメソッドが定義されていないからSteepではNoMethodErrorになってしまうのだけど、実際はApplicationControllerincludeされるから問題がない。 「このモジュールはこのクラスにincludeされる(or このinterfaceを持つクラスにincludeされる)」ことを前提として書けたら便利そう。あるのかな


ruby-signatureのstdlib-testが死んでいるのでなんとかしたい、けど何も分からなかった。 ruby-jpのtypesチャンネルにつぶやいた進捗をこちらにもぺたり。

ruby-sigatureのstdlib_testをRuby 3対応させるのが無理なのではという気がしています。 https://github.com/ruby/ruby/commit/beae6cbf0fd8b6619e5212552de98022d4c4d4d4 でキーワード引数分離がmasterに入ったんですが、これによって rake stdlib_testがコケるようになっています(今までも警告が出ていたのだけど) これを倒すにはhookをRuby 3 keyword対応させなきゃいけないのだけど、ちょっと試してみた感じ何も分からんになっています。

https://gist.github.com/pocke/780ccfe41fbd03bfd2bb93c3a7c5ec36 こんな感じでparametersを見てキーワード引数を持っているかどうかで分岐をさせてみるのを試したんですが、C実装のメソッドはキーワード引数があってもrestとしか言ってこなくて負けました。

そのあとmameさんにProc#ruby2_keywordsが入っているのを教えてもらって、それを使ったらうまくいった。

github.com


IFTTTで自分のTwitterのツイートとfavをSlackに流すのを始めてみた。 まだデータがたまっていないので便利かどうかはよくわからない。

IFTTTのUIがわけわからなすぎて大変だった。Zapierの方がわかりやすいなあ。


↑でも言ったのだけど、Ruby 3 keyword argumentがmasterに入って色々壊れそう。 https://ruby-trunk-changes.hatenablog.com/entry/ruby_trunk_changes_20200103

masterを常用するのは大変ですなあ


__builtin系でparameters情報が増えていそうで便利。

master

irb(main):001:0> TracePoint.method(:trace).parameters
=> [[:rest, :events]]

2.6

irb(main):001:0> TracePoint.method(:trace).parameters
=> [[:rest]]