tawara's blog

雑記。個人の見解です。

「プロを目指す人のためのRuby入門」 第4章を読んだ

一度も読み通していなかったので、読み返す。だいぶ理解できるようになっている。よかった。

##ブロックについて

arrays = [1, 2, 3, 4]
hoge = []
arrays.each do |n|
  hoge << n * 2 if n % 2 == 0
end

hoge #=> [4, 8]

ブロックはメソッドの引数として渡すことのできる処理のかたまりです。ブロック内で記述した処理は必要に応じてメソッドから呼び出される。

なのでこの場合、eachメソッドにブロック(do - endの部分)を渡しているということになる。 eachは配列の要素を順番に取り出し、ブロックパラメーター(n)に渡す。取り出した要素をどう扱うのかはブロックに記述することができる。 偶数であれば、二倍にしてhoge配列に加える、という処理をブロックに書くことができ、配列のそれぞれをその条件文に通すことができるというわけだ。

##with_index便利そう

each_with_indexは0からだけど、with_indexなら開始番号を任意に決められる。

irb(main):004:0> int = [1,2,3,4]
irb(main):005:1* int.each.with_index(1) do |n, i|
irb(main):006:1*   p "#{i}番目は#{n}です"
irb(main):007:0> end
"1番目は1です"
"2番目は2です"                                                                  
"3番目は3です"                                                                  
"4番目は4です"  

## Enumerableモジュール

ArrayもRangeもEnumeratorもEnumerableモジュールをincludeしているので、Enumerableモジュールのメソッドが利用できる。 Ruby逆引きハンドブックによれば、「Enumerable」は配列を一般化したもの、らしい。

amzn.to

「死刑にいたる病」を読んだ

悲鳴なような文章、という文章がよかった。主人公が自らの家庭事情を一気に文章にしたためる場面だ。体の内側から溢れ出す怒りや悲しみを推進力に、荒々しく言葉を叩きつけて文章を書いているさまが想像出来る。

 

死刑判決を待つ史上最大の連続殺人犯からの手紙を大学生の主人公が受け取ることから物語がはじまる。連続殺人犯はティーンエイジャーの少年少女を周期的に、一定期間拷問後に殺害する秩序型のサイコパスだが、成人した女性を乱暴に殺害した1件も彼の犯行と立件されていた。あれはボクじゃない、真相を解明してほしい、と殺人犯に言われた主人公は、高校生活で挫折を味わい、周囲に見捨てられている自分に優しい彼の言葉につられて調査に出かける。

 

 

果たして最後の犯行は彼ではないのか?そうであれば真犯人はだれだ?そして殺人犯の本当の目的とは?

 

 

このあたりの問題の真相を知りたくて読者は読み進めることになる。実際すいすいと読めた。

 

 

本書のテーマのひとつはマインドコントロールだ。殺人犯は刑務所のなかから人間を動かす。それも服従させられた人達が自ら進んで服従するように準備をしている。そのせいで、自分の意思で選んだ、とみせかけられている判断の醜悪な結果の責任を負い、罪悪感に苦しむことになる。卑劣な行為だと思う。

 

 

ただ相手を自分の意のままに動かすこと、しかもそれを相手が自ら望むように仕込むこと、それ自体の心地良さは理解できる。それがただ自己の醜い欲求のみを満たす場合は悪となるのだろうと思う。このテーマは中村文則「掏摸」とかで言及されていたと思う。

 

一方でHUNTER × HUNTERのジンも「獲物が予想通りに動くことこそ、ハンター冥利につきる」と言っていた気がするので、ようは、その能力の使い方なのかと思う。プロダクト開発も小説書くのも、受け手をそれとなくある場所まで導く行為なのだから。

 

amzn.to

 

(了)

 

 

 

 

 

 

ONE PIECE FILM REDを見た

www.onepiece-film.jp

朝9時の時間から映画を見て来た。シャンクスの戦闘シーンが見れて満足した。かつてのキャラクターたちのその後がいろんなカットでちらりと映っていて、懐かしい気持ちになれた。

 

歌が映画を構成する最大の要素なのだけれど、Adoの歌声はその期待を十二分に応えていた。劇中歌の多い映画に体が慣れてないせいか、歌が来ると、またか、と思ってしまったけれど、歌がはじまってしまえば彼女の歌に引き込まれてしまう。力強い歌声に胸ぐらをつかまれている感じだ。すさまじい。

 

アニメの鬼気迫る戦闘シーンで作画が劇画チックになる、というか白黒の揺れる線になることがある。あれが好きだ。日本文化なのかなーとか思ってしまうし、それをいいなーと思う自分の中にその土壌があるのかもなーと思う。

 

ワンピース作者のキャラ造形の種類の豊富さにはいつも驚かされてしまう。かわいい、カッコいい、渋い、気持ち悪いまで網羅したラインナップに、物語が進むにつれて新しいキャラが登場する。ストーリーテラーとしてやはり才能があるのだろうな。

 

津田洋次郎の演技も見ものだった。深みがある、という浅い表現しかできないが、とにかく情感豊かな声の聴き心地がよかった。ウタの声優さんも、感情が切り替わるシーンなどいいなーと思った。

 

(了)

 

 

Re: Re: はてブロの「読者になる」にハマってる - たわらの雑記

ブログ記事に反応してもらえた。現実空間で会ったことがない人とやりとり?することはあまり経験がないので、素直にうれしい。 インターネットすごい。タイトルは模倣した。

blog.kyanny.me

## きっかけ

いっとき会社を辞めて小説を書いていたこともあり(新人賞に応募して落選した)、書くことで物事がクリアになっていく経験している。村上春樹の影響もあると思うが、書くことこそ思考だと思っている。人生の方針に迷い、悩み疲れた最後に白い紙にボールペンで文章を書いたことも無数にある。書くことこそ思考なのだ(もっと大事なのは推敲だとも思っている)。

書くことの重要性は認識していたものの、ときどき日記をnotionにまとめたりnoteに書く程度であり、習慣にはしていなかった。というか習慣にした結果具体的に自分がどう変質するのか、がよくわかっていなかった。

そんなときに読んだのがFindyのこちらの記事だ。

engineer-lab.findy-code.io

とりわけキャリアの選択において「(思考|志向)を言語化する」習慣が大いに役立ちました

という一文には感銘を受けた。どういう論理か正確に思い出せないのだが、記事を読み終わった瞬間に、ああブログを書こうと思った。そういう直感的なものを体ぜんたいで受け止めた気がした。ときどきこういう感覚を得られるのは生きている楽しみだと思う。(この楽しみについても文章を書きながら思いついたので、やはり書くことは大切だ。)

全体的に読みやすい文章だった。きっとたくさん文章を書いている人なのだろう、と思ったのでいくつかブログ記事を読んだ。

blog.kyanny.me

繋がらないけど発信だけしてる、それが許されるからブログがいいんだ

この記事を読んで、直感はおそらく正しい、そしてブログを書くのは はてな にしようと思った。noteは候補にあったが、個人的に人通りが多い場所にいるような気がして気が引けてしまう。はてな のほうが放課後の教室のように個人的で自由な空間に感じる。もちろん私の個人的な感覚に過ぎない。

何が言いたいかというと、はてなブログを書くきっかけにもなったし、購読しているブログの著者に反応がもらえてうれしい、ということだ。

## 書く習慣

どうやって書くことを習慣にしているのか、という問いに反応してもらえた。

「書かないと(書いて頭の外に出さないと)不快」なので、基本的に可処分時間を奪い合う他の行動よりも優先度が高い。

同じく不快に感じているが、行動にしていなかったのでこれから習慣にしていきたい。

メモツールの類はそれなりにこだわりがあって色々使ってきたりしているが、ブログネタについては「ブログの下書き」をメモがわりにしている。走り書き・単語レベルのメモや草稿など、とにかく後で続きを書くのに十分なだけの内容を書いて下書き保存しておく。メモツールとかタスク管理ツールとか、別の場所に整理して置くよりも、結局同じ場所(はてなブログアプリならアプリからアクセスできる場所)に置いておくのが一番自然に思い出せる・存在を意識でき、かつノイズやプレッシャーにならない、というのが長年の経験から得たベストプラクティス。

なるほどその手があったか。これは真似していきたい。scrapboxに#ブログネタとして貯める方法を実行したがすぐに面倒になってやめてしまった。気になるネタがあれば、下書きにメモしておけばいいのか。

8万字くらいの小説を書いたときは、毎朝書いていた。時間と文字数を記録し、スプレッドシートにまとめていた。分速何文字書いたか、1週間で何文字書けたか、などだ。ヘミングウェイが執筆した文字数を記録していたことに倣った。これは確かに効果はあった。昨日よりは少しでも物語を進めよう、というモチベーションにもなった。同じことをブログでしてもあまり効果はなさそう。

引き続き、文章を書き続けていきたい。

(了)

ネストしたhashのvalueを加工する

弊社には技術に関する質問チャンネルがある。Ruby力がないため恥をしのんで質問したら、たくさんの知見を含む回答がもらえたので、忘れないように書いておく。

## 問題

一番深いhashのvalueを[]で囲った文字列にしたい。

irb(main):015:1* hash = {3=>{0=>"テキスト"},
irb(main):016:1*  4=>{0=>"5"},
irb(main):017:1*  5=>{0=>"tawara@example.com"},
irb(main):018:1*  6=>{0=>"2022-08-01"},
irb(main):019:1*  7=>{0=>"テキストエリア"},
irb(main):020:1*  8=>{0=>"ruby"},
irb(main):021:1*  9=>{0=>"ウルトラマン|ゼットン|ゴジラ"},
irb(main):022:1*  10=>{0=>"オードリー"},
irb(main):023:1*  11=>{0=>"ラジオ"},
irb(main):024:1*  12=>{0=>"ポム", 1=>"リト", 2=>"ナガシマ"},
irb(main):025:1*  13=>{0=>"hoge", 3=>"huga", 4=>"hoo"},
irb(main):026:1*  14=>{0=>"大三元|四暗刻", 3=>"小四喜|大四喜", 4=>"地和|天和"},
irb(main):027:0>  15=>{0=>"雑種"}}

irb(main):029:0> hash
=>
{3=>{0=>"[テキスト]"},
 4=>{0=>"[5]"},
 5=>{0=>"[tawara@example.com]"},
 6=>{0=>"[2022-08-01]"},
 7=>{0=>"[テキストエリア]"},
 8=>{0=>"[ruby]"},
 9=>{0=>"[ウルトラマン|ゼットン|ゴジラ]"},
 10=>{0=>"[オードリー]"},
 11=>{0=>"[ラジオ]"},
 12=>{0=>"[ポム]", 1=>"[リト]", 2=>"[ナガシマ]"},
 13=>{0=>"[hoge]", 3=>"[huga]", 4=>"[hoo]"},
 14=>{0=>"[大三元|四暗刻]", 3=>"[小四喜|大四喜]", 4=>"[地和|天和]"},
 15=>{0=>"[雑種]"}}

## 回答1

hash を配列[k,v]に変換、vをさらに[kk, vv]に変換する処理のなかでvvに[]をつけてからhashに戻し、さらにhashに戻すやり方。

irb(main):032:0> hash.map{ |k, v| [k, v.map{ |kk, vv| [kk, "[#{vv}]"] }.to_h] }.to_h
=>
{3=>{0=>"[テキスト]"},
 4=>{0=>"[5]"},
 5=>{0=>"[tawara@example.com]"},
 6=>{0=>"[2022-08-01]"},
 7=>{0=>"[テキストエリア]"},
 8=>{0=>"[ruby]"},
 9=>{0=>"[ウルトラマン|ゼットン|ゴジラ]"},
 10=>{0=>"[オードリー]"},
 11=>{0=>"[ラジオ]"},
 12=>{0=>"[ポム]", 1=>"[リト]", 2=>"[ナガシマ]"},
 13=>{0=>"[hoge]", 3=>"[huga]", 4=>"[hoo]"},
 14=>{0=>"[大三元|四暗刻]", 3=>"[小四喜|大四喜]", 4=>"[地和|天和]"},
 15=>{0=>"[雑種]"}}

## 回答2

rails6で追加された #deep_transform_valuesメソッドを使う。めっちゃわかりやすい。

https://api.rubyonrails.org/classes/Hash.html#method-i-deep_transform_values

irb(main):033:0> hash.deep_transform_values { |v| "[#{v}]" }
=>
{3=>{0=>"[テキスト]"},
 4=>{0=>"[5]"},
 5=>{0=>"[tawara@example.com]"},
 6=>{0=>"[2022-08-01]"},
 7=>{0=>"[テキストエリア]"},
 8=>{0=>"[ruby]"},
 9=>{0=>"[ウルトラマン|ゼットン|ゴジラ]"},
 10=>{0=>"[オードリー]"},
 11=>{0=>"[ラジオ]"},
 12=>{0=>"[ポム]", 1=>"[リト]", 2=>"[ナガシマ]"},
 13=>{0=>"[hoge]", 3=>"[huga]", 4=>"[hoo]"},
 14=>{0=>"[大三元|四暗刻]", 3=>"[小四喜|大四喜]", 4=>"[地和|天和]"},
 15=>{0=>"[雑種]"}}

ちなみにRuby3ならhash.deep_transform_values { "[#{_1}]" }と書ける。引数が少なくておしゃれ。

## 回答3

ruby2.4から追加された#transform_valuesメソッドを見つけたので、こうも書ける。

irb(main):034:1* hash.values.each do |v|
irb(main):035:1*   v.transform_values{|vv| "[#{vv}]"}
irb(main):036:0> end
=>
[{0=>"テキスト"},
 {0=>"5"},
 {0=>"tawara@example.com"},
 {0=>"2022-08-01"},
 {0=>"テキストエリア"},
 {0=>"ruby"},
 {0=>"ウルトラマン|ゼットン|ゴジラ"},
 {0=>"オードリー"},
 {0=>"ラジオ"},
 {0=>"ポム", 1=>"リト", 2=>"ナガシマ"},
 {0=>"hoge", 3=>"huga", 4=>"hoo"},
 {0=>"大三元|四暗刻", 3=>"小四喜|大四喜", 4=>"地和|天和"},
 {0=>"雑種"}]

やまびこのように知見が返ってくるのは組織で働く喜びですね。

(了)

データ加工能力が課題

「結局のところ、webアプリはデータをユーザーフレンドリーに加工・出力するだけ」という言葉を強いエンジニアの口から聞いたことがある。 一理あると思う。だからこそ入力されるデータこそに価値がある、ともいえる。

でエンジニアとしてはデータの加工能力が大事になるわけだが、いまの自分にとってはこれが課題だ。

このテーブルにあるこのカラムの値が同じレコードの場合は、CSVに格納する値をまとめて'[A|B]'のようにしてくれ、などの仕様があったりする。 RailsActiveRecordのクエリを使って何とかデータを引き出して、Rubyのメソッドを使って加工する能力が求められる。 Railsの方はなんとかなる(groupの使い方がまだ腹落ちしていないけれど)が、Rubyの方がまだたどたどしい。 配列なら何とかやりようはあるのだけれど、配列じゃ難しいときがある。

このようなときは方針がいくつか挙がるけれど、その方針の採択にも同じく迷う。

  1. 実はActiveRecordでもっと求める形に近いデータを用意できる
  2. hashを上手く使う

今日のタスクは2が有力な気がしている。なので明日ゴニョゴニョしてみる予定。

いっとき競プロに挑戦した経験があるが、それが役立つことはある。flattanで配列のネストをなくしたり、concatで配列をくっつけたりと。 少しだけでもかじっていてよかったと思う。

モデルメソッドまたはインスタンスメソッドが適しているのか、というのも迷う。何が基準なんだろうか。 N+1は意識しているけど、パフォーマンスの基準の手持ちもない。

これはおそらく教科書となるコードのストック不足なのかと考えている。 有名なgemとかを読んで美しいコードを見とく・写経したほうがよいかもしれない。

あとは実地で訓練して、PRレビューで指摘してもらうとかかな。

(了)

振り返りについて

1日の振り返りをする時間を設けたい。

 

何をしたのか、どう思ったのか、課題は何か、ネクストアクションは何か、良かったこと・悪かったこと、などなど。

 

時間があれば新しい知識を求めて乱読したりweb記事を漁ったりしている。これが何となく気持ち悪い。シャワーを浴びてるみたいに、その時は気持ちいいのだけれど、知識が排水溝に流れている感じがする。

 

言葉にして固めてストックしたいところだが、果たしてそれが有益なのかとも疑ってしまう。そしてまた新しい記事や乱読に走ってしまう。

 

振り返る時間があれば新しい知識の獲得、という風になっているのは、振り返りによるメリットを見いだせていないからだろう。

 

ひとつにはストックした知識を読み返す機会がないからだ。ブログ記事とか書いてる人は書いた記事とか読み返すのだろうか?というかストックした記事・知識の振り返りも仕組み化しているのだろうか。

 

何事もやりっ放しにしてしまうので、やる・振り返るという習慣を身につけたい。唯一振り返りまくったのは小説を書いたときだけかもしれない。推敲しまくったからな、、、

 

(了)