何かを学ぶには、実際に作ってみるのが近道だということ。
僕は、大学生時代に、細胞というものに不思議な魅力を感じた。
所属していた学科は電気電子工学科。分解したテレビラジオの集積回路に興味を示すならまだしも、僕はなぜか、生物の細胞に興味を示した。
当初、農学部で生物を学んでいる友人がいたのも影響の一つだろうし、高校時代に好きだった化学が生物の現象を手ほどきする道具の一つだったこともあると思う。
とにかく、細胞、とりわけ、細胞分裂に必須なDNAとDNAからタンパク質が合成されるプロセスに興味を示した。
僕が興味を示したあとに取る行動は1つ。ひたすら検索をかけて、複数の情報媒体から様々な観点からの説明を読み漁った。
生物の知識は、大学の一般教養の授業で、種の起源を刊行したダーウィンみたいな風貌の教授による高校生物の解説だけであった。
まぁ、DNAがA,T,G,Cの4種類の塩基から構成されていて、ワトソン・クリックがX線解析により解明したように二重螺旋構造をしているという情報、相補性という性質で、各塩基には結合することができるペアがあることなどは、それでも理解できた。
DNAからmRNAと呼ばれる物質に情報が転写されて、その組み合わせ(コドン)によって、アミノ酸が決まる仕組みがあった。アミノ酸列はそのままタンパク質になる。DNAというコードからアミノ酸列という情報をデコードしているわけだ。
別に、暗号化する対象はアミノ酸列じゃなくてもいいのでは?
アミノ酸列とコドンの関係も生物と同じじゃなくてもいいよね、ランダムに与えればいいのでは?なんてことを考えてから、
まず、A,T,G,Cをランダムに出力するプログラムを書いた。
次に、それを相補性にしたがって反転させるプログラム、mRNAに変換するプログラム、
mRNAをコドンに従ってアミノ酸に変換するプログラムを書いた。
開始コドン、と終止コドンと呼ばれるコドンを目印に、ランダムに与えられたDNAの文字列をパーサーよろしく、アミノ酸列に変換するプログラムを書いた。DNAの塩基配列全てに情報があるわけではなく、情報がない部分を切り落としてからアミノ酸への翻訳を行うらしい。これを模擬するプログラムをできるだけ忠実に作成した。
コドンとアミノ酸の関係を鍵として外部から与えてやるとDNAをアミノ酸列に変換するデコーダーの出来上がり。
暗号化はこの逆のプロセスを辿ればいい。アミノ酸列を与えて、規則に従ってDNAに変換して行くだけ。
あとは、一般化していく。コドンで定義されているアミノ酸は20種類ある。これを10進数の数列に対応させていけば、どんなデータでもアミノ酸列に変換することができ、DNAに変換することができるようになる。
これをコードに書き起こして暗号化に利用できるのではないか、ということを学生時代の僕は示唆した。
(社会人になってから、コードを掘り起こし、忘れかけていた仕組みを思い出し、colabratoryで動くようにした)
暗号化スクリプトを書くうちにDNAからタンパク質への翻訳プロセスに詳しくなったし、pythonでバイナリデータを作成するにはどうすればいいか、classの切り分け方はどうするべきか、などいろいろ考えるきっかけになった。
このスクリプトが暗号化に本当に役に立つのかは正直どうでも良い。
何かを作ることで、得られるものは多いということに気づけたのが1番の収穫である。
github.com
update & upgrade
僕の基本的な考え方を整理しておこうかなぁと思う。
ひとつは、基本的に人間は、update可能だという考え方である。
得意不得意はあるにせよ、できるようになりたいと心から願い、努力すればある程度はできるようになるはずだ、と考えている。
僕は身に付けるスキルを、ソフトウェアに喩えることがある。そして、スキルを身に付けるということは、スキルというソフトウェアを脳というコンピュータにインストールすることだと思っている。
ここでソフトウェアをインストールするときに気にしないといけないものがある。WindowsとかMacとかandroidとかiosとか呼ばれるもの、つまりOSだ。
OS: Operation Softwareは、pcやスマホの上でアプリやソフトウェアを動かすために必要な基本的な役割を担っているものだ。このOSがあるおかげで、複数の処理を同時に実行できたり、印刷ボタンを押すだけでプリンターで印刷することができる。
とにかく、重要なソフトウェアだ。
人間の脳をコンピュータと見立てたときにも、恐らくOSのようなものがやっぱりあるんだと思う。人間の脳に対してのコンピュータのOSに値するものが何かをはっきりとは言えないが、その人の基本的な思想とか、行動指針のようなものだと思う。
で、androidに4.0とか9.0とかバージョンがあるように、きっと脳に搭載されているOSにもバージョンがあるのだろう。バージョンアップを重ねる度に省電力になったり、UIデザインが変わったり、できることが増えるように、きっと人間のOSもバージョンアップでできることが増えるのだろう。ただ、僕はOSのアップデートはあくまでもマインドのアップデートだと考えている。そして、あるソフトウェアをインストールできるかどうかは、OSのバージョンがそれに対応しているかにかかってると思う。
同じノウハウやスキルを教えてもすぐに身に付けられる人となかなか身に付けられない人がいたり、ある人は情報商材で人生を変えることができたが、情報商材にお金を費やすだけでなにも変わらなかった人が、いたりするのは、すべてOSのバージョン、セルフイメージとかマインドとかが足らない状況でノウハウとかテクニックを求めてしまった人達が後者になってしまうのではないだろうか。
だから、僕はスキルの習得よりもしっかりしたマインドの構築に重点を置いている。自分が成長できそうな人や環境に身をおいて、今までやったことがないことに積極的に取り組んでいるつもりだ。
その過程で、既に自分よりもバージョンが高い人の考え方とか視点とかを学ぶ。そして近づくように努力する。
本を読んだり情報商材に手を出したりもする。本も情報商材もわりと当たり前のことを伝え方を変えて、まとめていることがほとんどなので、数をこなすことよりも、質の高いものを選ぶべきだと思う。
特に情報商材は、下手をすると時間とお金の無駄になりかねないので慎重に選んでいる。
まぁ、そんなわけで、スキルを身に付けたいときは、マインドのアップデートをしてから、だと思う。その目標達成に十分なマインドを持っていさえすれば、どんな目標もスキルも身に付けられるのではないか、と思いながら日々を過ごしている。まだまだ、理想には程遠いのだが……
GW
新入社員として初めての大型連休、それがゴールデンウィーク。
よりによって今年のゴールデンウィークは10連休。
やっと、会社や一人暮らしになれてきたところで、もういちど、学生に戻ったかのような生活を強いられる。
月曜日に、火曜日に、お昼すぎまで寝ていても、一日中アニメを見ていることさえできてしまう、恐ろしい期間である。
せめて、1日でも出社させていただけないものか。すべてリセットされてしまいそうで怖い、ひよっこエンジニアなのだった。
ところで、昨日私は、
codevs.jpというオンラインのイベントにエントリーをした。
このイベントは、リクルート主催の、ゲームAIを作り、参加者全員と競い合うというエンジニアのためのイベントである。
今回のゲームは、いわゆるオチゲーで、ぷよぷよのようなものが題材であった。
コンテスト全体のルール、ゲームAI開発兼オンライン対戦用のクライアントソフトの取扱説明書、ゲームのルールが提供されている。
また、Python,Ruby, C#, C++, Javaなどの言語で書かれたサンプルプログラムが提供される。
参加者はこのプログラムに手を加え、ゲームAIを強くするためのロジックを実装することになる。
まあ、現在のところ、どうすれば強くすることができるのか、のアイデアが全く思いつかず、ほぼ詰んでしまっているのだが、
5月10日の予選期間いっぱいまでせいぜいあがくことにする。
ひよっこ、の悩み事。
3週間前に社会人になったばかりの、ひよっこエンジニアには悩みもいくつかある。
エンジニアとしても未熟だが、一人暮らしも始めて1ヶ月程度の、超一人暮らし初心者でもある。
現在の一番の悩み事は、床で寝落ちして、朝まで部屋の明かりが付いたまま過ごしてしまうというものがある。
朝まで、床で寝るということがどれほど体に悪いかを挙げてみる。
まず、床で寝るときに布団で普段寝るときよりは姿勢が整ってないことが挙げられる。
すごい体勢で寝てしまったり、起きてから床の固さゆえのだるさを体感してしまったりする。照明は付いたままなので、眠りの質も悪く、寝た気がしないのである。そのため、途中で目覚めてしまう。その後、布団で寝直すともれなく起床時刻が後退し、朝が忙しくなるのだ。
もう1つ重大な問題がある。
寝落ちしてしまったときが、入浴前であったら、朝起きてからシャワーを浴びる必要が発生することである。ただでさえ、慣れない自炊で朝食をつくり、台所を片付けて、ゴミをまとめて捨てに行くなどの家事等で、朝の時間なんて一瞬で過ぎ去る。そこに、例え5分であってもシャワータイムが発生してしまえば、家を出発する時刻まであっという間である。
というわけで、寝不足気味にはなるし、起床する時刻が遅くなり、シャワーに時間が取られ、遅刻リスクが高まるため、寝落ちは絶対に避けないといけないのである。
そこで、ひよっこエンジニアは考えた。
就寝時刻を決めて、その時間までに寝るまえに行う処理が行われなかったら、
寝落ちした、と判定する仕組みをつくればいいと。
ぼくはAmazonのAWS IoT エンタープライズボタンなるものを1つ所持している。
これは、Amazonのwebサービスと連携して、ボタンを押すとなにかが起きる、を実現できるIoTグッズである。
現在、このボタンで起床時刻と就寝時刻、朝の出発時刻の3つの時刻を管理している。ボタンを押すと、AWS lambdaで設定した関数が実行され、Googleスプレッドシートに時刻とボタン操作の種類が記録される。
シングルクリックで、就寝
ダブルクリックで、起床
ロングクリックで、出発
といった次第である。
導入が長くなってしまったが、これで就寝時刻の管理をしているので、このボタン操作が寝るまえに行われなかったら、
「こいつ、寝落ちしたな」
ってわかる仕組みだ。
寝落ち判定を行うためには、就寝時刻の打刻を行う期限の時刻を決めなければならない。
だいたい寝落ちした時に目覚めるのは3時頃で、布団で寝てるときの平均的な就寝時刻は1時から2時くらいなので、2時までに打刻がされなかったら寝落ち判定すればいいと思われる。
さて、問題はどうやって寝落ちしたやつを叩き起こしてあげるか、である。
まだ、考えがまとまっていないので、続きはまた明日。
コードの共有の仕方を試してるんだけど、ちっとも反映されない、わけわからん。
ひよっこ、日記を書く。
社会人になって、早くも3週間が過ぎた。
エンジニアは、成長するためにアウトプットが欠かせないということをなんとなく感じ始めてきた頃でもある。それは先輩方がぼくら、ひよっこに研修をしてくれているときにも感じた。
1年前に研修を受ける立場だった人達がひよっこに、仕事上必要な技術を分かりやすくスライドにまとめて、ひよっこの純粋な、でも曖昧だったり、マニアックな質問に答えながら、講義と演習のカリキュラムをこなしていく。
人に教えるには自分がよく理解していないと無理な話であり、ぼくは純粋に先輩方を尊敬した。来年は、これを自分達がやるのか、と思うと正直怖い。
先日参加した技術同人イベント、技術書典6でもさまざまな技術書やつづけるための技術の本やアウトプットすることをオススメする本が多く存在していて、アウトプットの大切さを感じつつある。
いや、アウトプットの大切さは、すでに研究室生活の中で学んではいた。ただ、アウトプットから逃げてきた、それだけである。
社会人になり、ひよっこエンジニアになった今、少しずつ、アウトプットに慣れて、成長するためにアウトプットをしていこうと思う。しばらくは日記という形で、たまに技術の話ができるようになればいいかな、と思っている。
これは、歩き始めたばかりのひよっこエンジニアが立派な、にわとりエンジニアに進化する過程の記録である。