RubyでEnumerableを条件Xを満たすものと満たさないものに排他的に分けたいんだけど
どうするのがいいんでしょうか。
メモリとかパフォーマンスとかそういうのはあんまり気にしない前提です。
以下のサンプルコードでは対象のEnumerableは変数 arr
に代入されているものとし、条件Xを満たすかどうかのメソッドは foo?(x)
という名前であるとします*1。
普通に書く
a = arr.select { |e| foo?(e) } b = arr.select { |e| !foo?(e) }
排他的に分けたいのにブロックが2回書かれている。
条件に変更があった場合の変更漏れ、うっかり !
つけ忘れるなどのミスをやりそう。微妙。
selectとrejectする
a = arr.select { |e| foo?(e) } b = arr.reject { |e| foo?(e) }
おんなじブロックを使うからまだミスが減る気はする。が、微差だろう。
引き算する
a = arr.select { |e| foo?(e) }
b = arr - a
排他的っぽい。割とよい
まとめてみる
tmp = arr.group_by { |e| foo?(e) } a = tmp[true] b = tmp[false]
hash[true]
がそこはかとなくキモい気がする……。
調べてみる
a, b = arr.partition { |e| foo?(e) }
普通にあった*2
参考: https://docs.ruby-lang.org/ja/latest/class/Enumerable.html#I_PARTITION
結論
リファレンス見ろ
--pathつきでbundleしたときのGemfile内でrequireすると指定したpathからロードしようとしてくる
背景
やんごとなき事情によりGemfile内で色々することになり*1そのためのgemを作って使うことになった。 ローカルではうまくいったけどCI環境にいれてみるとどーもうまくいかない。
事象その1
状況
# Gemfile source "https://rubygems.org" require 'awesome_gem'
$ bundle # 詳細わすれたけどそんなgemねえ系のエラー
解決策
先にグローバルにgem installしておけばいいんじゃね?
$ gem install awsome_gem $ bundle # => OK
事象その2
状況
Gemfileは同じ。
$ gem install awsome_gem $ bundle install --path vendor/bundle # 詳細わすれたけどそんなgemねえ系のエラー
--path
を指定するとまたもrequireでコケる
これはなぜかというと、--path
オプションを指定した場合、Gemfileを読み込む時点でrequireでロードするパスがオプションの値になってるっぽい。
だからグローバルにインストールしておいてもそれをrequireしてくることができない
解決策
$ mkdir tmp $ cd tmp $ echo <<EOS > Gemfile source "https://rubygems.org" gem 'awesome_gem' EOS $ bundle install --path ../vendor/bundle $ cd ../ $ rm -rf tmp $ bundle install --path vendor/bundle
要は別Gemfileでvendor/bundleに突っ込んでおけばよい。
こんなことでハマる人、たぶんそうそういないと思うけどメモ。
*1:いいプラクティスではない気がしている
自宅の無線LAN環境について
最初に言い訳しておくとNW全然詳しくないので嘘を書いているかもしれませんし、これは日記なので解決したとかそういう話ではないです。
ウチの無線LAN環境には不満がある。長く繋いでると、ときどき「新しいコネクションが張れなくなる」気がする。
いま言っている事象は具体的には、skypeなどの通話は途切れずそのまま続行できるが、その間に新しくwebページを開くとかgit pushするとかの操作をするとNWにつながりません的なエラーを吐く。ブラウザの場合、大体DNSでの解決に失敗しましたと出るがDNSの問題ではなさそうだ。
macの上のバーにある無線LAN状況を示すやつだと、バリ4*1で、ちゃんと接続していることになっている。しかし上述の状態になる。謎い。
電器屋のおねーさんに相談したら「それ老朽化っすよ老朽化。無線LANルータ側の受信部が老朽化してそういうことになります。新しいのどっすか」という返答だった。ふーん、ありがとうございますと思いながらその日は帰って、ラズパイを新しい無線LANルータにしてみることで様子をみてみた。
結果、ラズパイのNWは非常に安定していて、何の問題もなく使えたので確かにこれはどうも無線LANルータ本体の問題なのかもしんないっすねえという気持ちが高まっていた。
というわけで家人に買い替えどうすかと聞いてみたところたぶん変えてから1年経ってないとのこと。うーん、じゃあ老朽化じゃないんか?というかそもそも俺と同じ事象起きてる?と聞くと全然起きてないっていう話に。えー、みんな我慢強いなって思ってたら俺だけかよ。受信部の老朽化なら全員に影響ありそうなんだけどそこんところどーなんすか。
うーん、まあとりあえず今のがどんくらい古いのか調べてみますか、と思って型番検索して某ねだん.com見てたら、クチコミでファームウェア品評会してる人が。はー、熱心な方ですね。中の人か?
と、ここでファームウェアアップデート、全然してなくね?と気づく。
調べてみたら現行は1.xでどーも2.x系が出てるっぽい。よっしゃこれはあげてみるしかありませんねと思ってあげてみたのがついさっき。うまくいくといいなあ。
そういえば無線LANの設定画面が見たいからIP調べたくて、 arp -a
したIP全部調べてみたけど出てこなかった。
BUFFALO製品はStationRadarなるスマホアプリでLAN内の製品調べられるみたいだからこれつかってみたらさっきの一覧にはないIPで出てきた。ふーん。
そんでファームウェアアップデートした後にもっかい arp -a
叩いたら出てくるようになった。なんでやねん。
*1:たぶんこれ白黒で電波の強さを示してると思っているけど合ってますか?
2016年を振り返って
定量的な振り返りとしてGitHubの草を置いてみる。
合計: 5319 contributions
定性的な振り返りとして隔月のことを思い出して適当に書く。
1月
昨年の11月末で前職をやめて、今の職場に入りました。
前まで ASP.NET Web Form
をやってたけど Ruby + Rails + MySQLという感じになって何がなんだかわからない感じで過ごしていた記憶があります。
とりあえずギョーム的にも最初のほうは暇だったのでわかるようになるまでひたすら rails new
してました。そしたらなんとなくRailsの気持ちがわかるようになっていまもなんとなく使ってます。たぶん結局3週間で7回くらいやってる。
2月
どう書くが復活したので参加。ここからなるだけ参加するようにしている。
気が向いて西日暮里.rbに初参加したのがこの月だったと思う。場所は五反田っていう西日暮里の外れのほう*1でした。
2016年の隠れ目標としてどっかのコミュニティに参加して活動するというのがあって、それで選んだのが西日暮里.rbでした。
この後開催されることになる「オブジェクト指向設計実践ガイド読書会」などの企画もあって、適当に参加した割に当たりだったなと思っています。どう書くのときに声を書けて頂いたmtsmfmさんに感謝。
3月
副業が始まったのがたぶんこのくらい。
書いたことのないphpを使って、顔も知らないチャットとかでの連絡も出来ない前任者が書いたコードを、使ったことないフレームワークに載せ替える、という仕事でした。
しかもコード読んでおかしくね?って思って仕様書見ると仕様と全然違うとかあったりして笑う。笑いながらいっぱい直しました。
サービスとして2つのシステムがあってそのうちの片方を担当してました。JSONうけとってなんやかんやして返す、っていうプロトコルだったのだけど、実際に疎通確認ほとんどしないままがーっと作ってからえいやでくっつけて動いたのがほんとよかった。状態少ないシステムだったからなんとかなったけどこれ状態多かったら死んでたね。もうちょいインクリメンタルにやっておくべきだったねと反省した*2
直前でがっちゃんこした割にはその後のバグも少なく、実際リリースした後のバグもそこそこ少なく抑えてきているはず。これはほんとチームメンバーに恵まれたからだと思う。ありがとうございます。
4月
たぶん本業でCrystalのCLI書いてたのがこの時期くらい。Crystalを業務で書いてる人、世界に何人いるんだろうなって思いながら書いてた。
5, 6, 7月
たぶんJSONAPI::Resourcesとかの勉強してました。たぶん。あんまり記憶にない。
忘れてたけどたぶんこのあたりにGitHubパーカー買ってるのでmmyojiさんと初めて会ったりしてるはず。
8月
ブログから察するにCI環境ととのえるべ、っていってShippableつかってみてこれでよさそうだねってなったときかな。さっきから記憶じゃなくてブログ記事に頼ってることに気づいたので来年はもうちょいブログ書いたほうがよさそうだぞ。
Shippableの記事は例えばCI環境のマシン自体が殺された場合全然キャッシュ効かねえとかそういうのがあってまためんどくさい感じがあるのでまだ実は全然プロジェクトで使ってません。すみませんすみません
9月
4月頃に作ってたCrystalのCLIをRubyで書き直してた。Crystalを業務で書いてた人、まあそこそこいるかもだけどそれをRubyで書き直してるのたぶんあんまりいないだろうなって思いながらやってた。
10月
謎。完全に空白。
末にオブジェクト指向設計実践ガイドの読書会をやっていてよかった。
これは来年にたぶん最後の9章やると思うのでちゃんと出席して終わりたい。7,8章のところ参加できなかったのが悔やまれる。
あとたぶん3, 4月に書いた副業のコードをリファクタし始めたのもこの頃だと思う。過去の自分のコードに向き合うのはだいぶつらいことを再確認した。
11月
近況っていうエントリがあったからヒントになるかなって思って覗いたらだらだら漫画の感想書いてるだけで過去の自分に殺意が湧いた。
それはそれとしてここに書いてあるように青春のアフターが最高で、ひたすら最高なので是非陰キャラオタク系男子には読んで頂きたい。あの Rebuild.fm でも紹介されてましたよ!!!*3
高校時代の友人にあったらCOBOL使いからWEB系jserに転身してたのでテンションがあがってLINEbot作ろうって話になった。
結局bot作成はbot作るぞってのじゃなくてサービスがあってそれの一つのUIとしてbotがあるっていう形式じゃないとつらいよねって話になってbot作成の気持ちは消えてしまったわけだけどLINEbotの作成に役立ちそうな画面は作りました。まだカルーセルとか対応してないですけどふつーの動作確認には使えると思います。
書いてなかったけどShinjuku.rbにいってLTしてきました。初LTでした。
喋り慣れてる感じがしますねって言われてのはたぶんどう書くのおかげです。ありがとうございます。
12月
「ECS使うべECS!」っていって色々調べものしてたらよくわかんないまま死んだ。今も死んでいる。つらい。
インフラ関連について気軽に聞ける人がいないのは結構困っていて、まあ、一言で言うとマジで困っている。
さすがにそろそろディープラーニングやっておくか、と思って始めた。たぶんいま半分くらいなんだけど楽しい。年末年始の間に終わらせたい。
来年のこと
- もうちょっと定量的に計測できる指標を増やしたい
- ブログもうちょっと書こう
- 特に業務で何やってたのか謎な期間が多い
*1:西日暮里.rbの開催地は全て西日暮里ということになります
*2:とはいえ実際痛い目見てないので本当に反省できてるのかはあやしい
*3: Rebuild: Aftershow 167: Fishing, Cooking and Camping (mirakui) なおmiyagawaさんは全然興味なさそうだった
西日暮里.rb x Shinjuku.rb Extreme Fish Bowl に参加してきました
参加してきました。楽しかったです。
雑にExtreme Fishbowlについて説明すると、集団の中の2人がペアプロして、残りが野次って、というのをずっと繰り返す感じです。 主に野次の担当をしました。
よかった
- みんなのターミナル捌きが見れた
- といっても環境自体はmtsmfmさんのなのでみんなちょっとずつ苦戦してたけど
- これは後で直すとかいいながらgit commitする姿が見れた
- こうやって技術的負債が生まれるんだなって思った
- これは時間制限5分を徹底したせいで、ひどいときはシンタックスエラーでコミットされてて面白かった
- 負債の返却もガンガン進んでよかった
- これ消しましょう → 2クラスくらい消える
- 言葉に対する認識の違いがおもったよりもあることがわかってよかった
- マーク派 vs suit派
- 英語的にはsuitなんだけど知らん人が結構いた
- Deckっていったとき山札なのかトランプ1組なのか
- このクラスの責任はどこまでなのよ問題
- 結局神クラスが誕生した
- マーク派 vs suit派
つらかった
- 英字キーボード
- 僕JIS配列なんで死んだ
- Enterのだいぶ上のほうを叩いてるのでずっとバクスラ連打してた
- 僕「アンスコどこ!?」
- 僕「クォートどこ!?!?」
- 僕「コロンどこ!?!?!?」
C-[
でEscを打とうとしても[
の位置が違ってなんもできなかった- つらい
まとめ
お祭りとしてはオススメです。