Array.prototype.reduceの使い方

(前回の内容も踏まえて)そうか、こういう使い方もできるのか。

 

今回はJavascriptだけど。

今まで上のようなやりかたで書いていて、 最初に空のオブジェクトを宣言するのが嫌だったんだけど、reduce使えばよかったのか。

var hash = {};
["a", "b", "c", "d"].forEach((v)=>{
  hash[v] = v.toUpperCase();
});
 
console.dir(hash);
// => { a: 'A', b: 'B', c: 'C', d: 'D' }
 
var hash = ["a", "b", "c", "d"].reduce((obj, v)=>{
  obj[v] = v.toUpperCase();
  return obj;
}, {})
 
console.dir(hash);
// => { a: 'A', b: 'B', c: 'C', d: 'D' }

Hamamatsu.rb #88

ということで昨日はHamamatsu.rb #88。
今回は「プロを目指す人のためのRuby入門」の4章の中盤まで。内容としては配列の処理とかブロックの使い方とか。
 
RGB変換メソッドの例題で、injectを使って文字列を結合するやり方はすごい洒落てるな〜と思った。
とりあえず自分が本を見ずに書いたコードが↓
mapで処理した結果をjoinで結合するというやつ。
"#" + [r, g, b].map{|v| v.to_s(16).rjust(2, "0") }.join
 
こちらが本に載っているコード。
文字列の結合にinjectを使うのは目からウロコ。injectって数値計算くらいにしか使いみち無いものだとばっかり思ってたので。
[r, g, b].inject("#"){|ret, v| ret + v.to_s(16).rjust(2, "0") }
 
 
些末なことだけど、他の言語も同時に扱っていると配列操作のメソッドとかで混乱しがちだよねという話をしたり。 
Array#push だと Array.prototype.push() とごっちゃになるから、Array#<< を使ったほうが良いかもね、とか。
あと、pushと<<の細かな違いなどを知ることができてよかった(受け取ることのできる引数の数が違うらしい)
 
何名か初参加の方がいたんだけど、そのうち2名がWebサービスを開発していてそのデモを見せてくれた。熱い。
いずれもRailsで開発してるとのこと。
 

Hamamatsu.rb #87

「プロを目指す人のためのRuby入門」読書会の2回め。
今回は参加者10名。
 
思ったより予習してきた人が少なかったかな!
とはいえ、メタプロ読書会のときも自分は全く予習復習してなかったので偉そうなことは言えない。
自分は前日に1時間くらいでササッと読んで、気になった点のメモをまとめて、あとは
オマケとしてGuardでMinitestの実行を自動化する設定を作って今回に臨んだ(けっこうしっかりやってるのでは?)
 
参加者が多いと自分では知らず知らずのうちに読み流していた箇所への疑問質問がでるのが良い。
Minitestでfailした際の出力結果のこの行はどういう意味なのか?とか、何故"疑似変数”と呼ばれているのだろう?とか。
全員で「う〜ん、、多分こんな理由?」的なことを言いながら頭を捻るのは楽しい。
 
あと、前回のKPTで書いたコードを共有する場所があると良いよね、という話があったので
Gistのコードを共有するための簡単なWebアプリをFirebase + Nuxt + Herokuで作ったものを紹介した。
 
 
これは↓の記事を参考にFirebaseを使った認証の勉強も兼ね作ってみたもの。
 
ほぼほぼ写経で、特にVuexfireを使っている箇所は自分ではまだあまり理解できていない。
それに、結局コードを共有するのにはSlack使ったほうが圧倒的に見やすいことがわかり、ボツネタとしている。
まぁNuxtで作ったアプリのHerokuへのデプロイの仕方がわかったので良し。
 

ノンデザイナーズ・デザインブック

こういうキャンペーンの仕方はすきじゃないなぁ。

#ノンデザ20周年

Hamamatsu.rb #86

Hamamatsu.rb #86、
今回は「プロを目指す人のためのRuby入門(通称チェリー本)」の読書会。
 
読書会形式でやるのは数年ぶりということでどういう形で進めていこうか全くノープランだったのだけど、
いろいろアドバイスをもらった結果、数項分(2.1.1 ~ 2.1.2とか)を黙読、その後意見交換という形式で進めていった。
著者の伊藤さんがFacebookでシェアしてくれたおかげで参加者も多かったし、意見交換のフェーズでは初心者から経験者まで発言が沢山あってかなり盛り上がったので良かった良かった。
 
 
チェリー本は"こういう書き方もできるけど一般的にはそうしない” と明言してくれるのが良い。
郷に入ってはというわけではないけど、例えば変数のネーミングルールとか、
Rubyistミームを押さえておくとおおよそ初心者から脱却した雰囲気のコードになるんじゃないかと思う。
 
と、偉そうなことを言いつつ。僕も雰囲気でRubyを書いているので
「あー、そーゆーことね、完全に理解した(←わかってない)」的な話題があったのは内緒だ。
 
 
マニアックな話題で盛り上がるのも面白いし、それで会場全体がガヤガヤしてるだけで全員の満足度がアガっているような錯覚に陥るのだけど、
実際のところはどうだったんだろう。
今回は初心者の方も多かったのでしっかり感想を聞いておくべきだった。これは次回への課題かな。
ほか、電子版だとページ番号がわかりづらいという意見があったので、発言するときに該当の箇所を明示する等、ある程度の運用ルールを定めつつやっていこう。
 
あと、例題を解いたコードを共有したいという意見もあって、これはどうしようかな。とりあえずgistに上げてURLを共有すればいいかな。
GoogleDocs上でコードを貼り付ければそれで事足りる気もするけど。
 
 
そういえば、聞いてみたけど結局これといった解決策がなかった話題を思い出した。
例えば以下のようなメソッドがあったとき、
 
def country_name id
  if id == "JPN"
    "Japan"
  end
end
 
このコードでは、”JPN"以外のidを渡した場合にはnilが返ってくるわけだけど、
以下のようにelseでブランクを返したりしない?って話。
 
def country_name id
  if id == "JPN"
    “Japan
  else
    ""
  end
end
 
最初のコードだとメソッドチェインしたときにnilでエラーになる。
 
pry(main)> country_name("JPN").length                                               
=> 5
 
pry(main)> country_name("JOR").length                                               
NoMethodError: undefined method `length' for nil:NilClass
 
この場合、country_nameといういかにもな名称なのできちんと文字列を返すほうが親切だよねとも言えるし、
(省略しているけど)どの条件にも合致しない=渡したidが不正、ということでエラーになるというのも正しい気がしてくる。
悩ましい・・・。

スマートスピーカー Hack Day in 浜松

先日、「スマートスピーカー hack day in 浜松」という仰々しいタイトルの勉強会を開催した。
内容はGoogle HomeAmazon Echoのそれぞれのスキル開発のハンズオンで、僕はAmazon Echoのハンズオンを担当。
 
持ち時間90分ということで、かなり駆け足で話していったので全員がゴールまで辿り着けたのかどうか怪しい。
そこは完全にこちら責任なので申し訳ないです。
ハンズオン資料はちゃんと作ったので、後はそれ見ながら進めていただければ・・・
 
Alexa開発辛いなと思ったのは、やはりAWSの知識が多少なりともないと混乱する、ということ。
まぁそりゃそうだわな、という話だけどLambda・Cloud9・IAM等の色々なサービスを行ったり来たりするのでそれぞれがなんのためのサービスか
理解していないと作業の内容がわからないし、知らない間に課金されている、ということになりがち。
そういう意味では初心者向けの内容では無かったなぁ。せめてアカウント登録は事前にやっておいてもらうべきだった。
 
 
こういう勉強会を開催するとだいたいほとんどが見知った顔ばかりになるのだけど、今回は半分くらい初めて見る方が来ていた感じ。
スマートスピーカーがテーマだったのが良かったんだと思う。
募集期間を眺めにしていたのも効いていたかも。
 
あと、Echo Spotをもっている方が居て羨ましかったw もっと色々見せてもらえば良かったな。
(てかEcho Showの日本発売はよ)

Hamamatsu.rb#85

Hamamatsu.rb #85を開催した。
今回は今後数回に渡って開催する読書会で使う参考書選び。

何人かが本を持参してくれたけど、「プロを目指す人のRuby」と「オブジェクト指向設計実践ガイド」が数冊ダブったのには笑った。
最終的には「プロを目指す人のRuby」に決定。

良い悪いという話ではなく、本の冒頭でもそういう人向けと書かれているので当然なのだけど、
たまに使い捨てのスクリプトRubyを書く程度の人には向かないよねという意見もあった。確かにそうだなーと思いつつも、
自分としてはRubyコミュニティを名乗っている以上、Rubyistの一般的なレベルに参加者のRuby力を底上げしていきたい気持ちがある。
だから「Rubyならこう書く」というTipsが網羅されている「プロを目指す人のRuby」は最適と感じたわけです。

読書会という体だけど、座って本を読んでるだけだと眠くなるので
(白状すると、最初にメタプログラミングRuby読書会をやっていたときは何度か寝落ちした)
多少は実際にコードを書いてみるという時間も挟んでいきたい。
その点でもサンプルコードが沢山載っているので良い課題図書かなと。