tktechblog

日々の開発学習の進捗確認とテクノロジーに関して考えたことをまとめます(ブロックチェーン学習中)

2018_02_24 CUIでの画像の取り扱い

今日はUbuntuCUIを使って画像をダウンロードしたかったのでやってみました。

画像のダウンロード

wget + 画像ファイル(----.jpg/---.png)

画像の表示

  • eog+ファイル名
  • display+ファイル名

でいけるらしいが

display: unable to open X server `' @ error/display.c/DisplayImageCommand/426.

謎のエラーが出て進まない

2018_2_23テストに関して

TDDのサイクル

  1. 次の目標を考える
  2. その目標を示すテストを書く
  3. そのテストを実行して失敗させる(Red)
  4. 目的のコードを書く
  5. 2で書いたテストを成功させる(Green)
  6. テストが通るママでリファクタリングを行う(Refactor)
  7. 1-6を繰り返す

リファクタリングがあとでやるtodoリストにいきがち

どう行った順番でテストメソッドを書くか

TDDのスキル

  • 問題を小さく分割する
  • 歩幅を調節する
    • テスト→仮実装→三角測量→実装(テストのテストをやる場合。)
    • テスト→仮実装→実装
    • テスト→明白な実装
  • テストの構造化とリファクタリング(テストの抽象度を同質化させて係数を可能な限り減らしていく。)

初期で考えること。

  • メソッド名
  • クラス名
  • 変数
  • mutation testing
  • 三角測量:トライアングルテスト。他の数字で試す。
  • 明白な実装
  • Todoリストがないと後任の人がイメージできない。仕様がイメージできるようなテストコードを書いておく。

  • 参考 https://dev.classmethod.jp/study_meeting/read/what-tdd/

2018_02_22 直近でやりたいこと

大きな目標を達成するときに、目標達成に対して最適な資源配分をすることはかなり重要だとおもう。その中で人間の構成要素の中で何に気を払うべきなのかを考えてみました。

目標

やはりゴール地点を明確にすることが必要なのではないのかと思います。
具体的に設定するとは、

上記のようなものです。

今の自分に関して言えば一年後にアメリカやエストニアのような海外でエンジニアとしてきちんと活躍することが目標です。そのためにその達成にはどのような要素が必要か。それらをきちんと要素分解して決めたところからブレイクダウンして日々の行動計画に落とし込むことが必要なのではないのかと感じました。

方法としては人生において達成したい100のリスト見たいのを作ると100の達成目標のうちに被ってるものなどはどうせたくさんあるし、やりたいことを100出せばきっとその中に自分の本当にやりたいことがあると思うので、登るべき山(自分のやりたいこと。達成したい目標)が見つかったら、その登り方(起業、就職、フリーランス)などを自分自身で考えたり、計画して、それを期間設定などを設けて実行して、修正してのPDCAサイクルを全力で回し続ければ良いのではないのかと考えています。

心・技・体

やはり心技体全てにおいてしっかりした人間であるべきなので、この三要素にはきちんと気を払うべきだなあと感じました。一つ一つ考えて行くことができればと思います。

おそらく精神的にどうあるべきかとか、哲学的なものとかメンタル的なものでしょうか。正直細かいことはよくわかっていません。とりあえず、毎日自分の思考をまとめて、事前に出した目標に対して、現状何が問題なのか?とかどうすれば目標達成に近づけるのか?今より良い方法がないのか?など問い続けることが必要だと今は認識しています。

あとはストレスになりそうな複数回繰り返される単純作業に関しては常にどう仕組み化できるかを考えて実践に移すことが必要なのではないかと感じています。そして必要な要素に関してはサブスクリプションクラウドソーシングなどを利用し、自分にとって本質的に価値のあることにのみ集中できる環境を常に作れるように取り組んでいければと感じています。

  1. プログラミング能力
    これはどういうものなのかというとおそらく設計能力、実装能力、運用能力の全てだと思います。そこらへんは海外のエンジニアがどのようにして今のポジションについたのか、どのような実績や経歴を持っているのかをきちんとみてそこから逆算して計画を立てることができれば良いなあと感じています。本質的なwebとはなんたるものか、データ構造やアルゴリズムなどどの言語選択をしてもコアになるような部分に時間を避ければと感じています。機械学習などにも気を払えればと感じているので、数学や統計、pythonなども少しずつ学んでいければと感じています。

  2. 英語力
    僕の場合、プログラミング能力の方がプライオリティはかなり高いですが、やはり英語力も必要かと思います。私自身、初めてアメリカに住んだ時など、初めの何ヶ月かはコミュニケーションが日本のようにうまくいかなかったためストレスに感じることもありました。それが業務によって生活のほとんどを満たすものになる場合、自分の好き嫌いで行動できるようなものではありません。そのため、ストレスにならないように、かつ業務において通用する英語力を事前に習得できればと思います。ジョブインタビューやコーディングテストも英語で行われますし。

  3. 事業を作る力(お金を稼ぐ力。価値を作る力)
    これは僕自身の今年の目標としてはかなり大きなものだと感じています。世の中に存在する自分がとくべき正しい問いを導き出してその問題解決をして価値提供をしてマネタイズにまで繋げる力がエンジニアとして生きていく上でも、起業する上でも、国内だけでなく海外でも活躍したいと考える上でも全てに重要な要素であると感じているためです。自分自身の人生において有限な時間というリソースをどのような問題解決に配分するかということはかなり重要な意思決定であると感じているためです。何か大きなことを成し遂げようと考えているなら、人生のうちでもっとも頭を使って、体を動かして全力でハードワークに耐えうる期間というのは10年-15年くらいしかないのではと感じています。

やはり体は資本であると思います。食事、運動、睡眠の全方位に気を払って常に最高のパフォーマンスを出せるようにヘルスケアに努めることが必要であると勝手に感じています。具体的には運動に関してはジムの利用。食事に関しては、健康に気を使って野菜や、タンパク質を取るために肉や魚、自炊をするなどで気を払うこと。睡眠に関しては今までずっと寝袋で寝てたので、良いマットと良いまくらなど良さげな寝具を一度試してみたいなと感じています。

衣食住に関して

人間の生活を成り立たせる要素として衣食住という観点からみられることも多いです。それぞれに気を払うことができればと感じています。

正直なところそこまでこだわりはないのですが、ボロボロになってしまった靴と鞄をとりあえず買い替えたいです。

肉と魚と野菜。外食するときも栄養のバランスには気を使いたいです。なるべく自炊するようにしたい。

あとは、作業場所に近い環境に住居を置くことによって移動時間のコストを減らせるようにしたいなあと感じています。開発環境を整えたい。キーボード、数枚のディスプレイ。今のデスクトップを活かすための環境作り。机と椅子。色々と頭に入れて最高の住環境を構築したい。外部の作業スペースとジムに関しては収入と支出の量に応じて考えたいです。

大前流「自分を変革する」3つの方法

1つ目は時間配分を変えること。2つ目は住む場所を変えること。3つ目は付き合う人を変えること。

president.jp

時間配分を変える

朝起きる時間を変えて朝型人間になる。そこで朝のうちに作業をしたり運動をしたりして生産性を高めまくるなど。夜は早く帰ってくる。英語学習に時間を割く。読書に時間を割く。ものを考えることに時間を割く。など生産的なことに時間を避けるようにしたいなあと感じています。

住む場所を変える

住む場所を変えることによって通勤時間を削減する。それによって朝使える時間を増やして他に時間を当てる。夜遅く作業をしても電車を気にしなくても良い。住む街を変えることによって新しい刺激をえる。住む場所を変えたり、家賃を高めることによって自分にプレッシャーを与えるなど新しく前に踏み出すために何らかの工夫ができれば良いなあとは感じたりしています。

付き合う人を変える。

これは結構重要なことだと思っていて、dropboxの創業者の人も言っていたように、自分の身の回りの五人の平均値が自分を形作るという話は正しいなあと感じています。周りが自堕落な人ばかりに囲まれていたらそういう人間になる可能性も高まるし、周りに意識が高かったり、きちんとアウトプットを出し続けていたり、実績を出し続けているような人との関わりが多ければ、その分だけ学習の機会が増えるので自分の成長につながるのではないのかと感じたりもしています。もちろん、一番重要なのは自分がどうあるべきかということなのですが。それにしても環境要因というのはかなりでかいと思います。

2018_02_19目標を達成するための計画(Plan to achieve the goal)

目標を立てる=達成できる計画

  1. 計画する
    • 目標を達成するためのもの
    • いつまでに何々を達成するかを明確化する。
  2. 目標までの距離を測定する
    • 現在地から目標までのギャップをきちんと認識すること
    • アウトプットをして課題を知る
  3. 現在地と目標を埋める方法の立案
    • 自分がどうして目標にたどり着かなかったのを洗い出す。
    • 一体何ができなかったのか。それを埋めるためには何が必要なのかを考える。
    • 問題点の認識を明確化する。そこに対しての課題解決の方法を考え行動する。
  4. やるべきことを割り当てる
    • ある期間の中でやるべきことを優先順位を持って割り当てる。
  5. やるべき事をより細かく割り当てる。
    • 週ごとなど細かい単位で計画を立てる。
    • 今日やるべき事をきちんと達成する。
    • やりたい事をやる。

これで目標を達成できなかったらまた1に戻る。

上記を前提に、自分が日々の生活の中で活かしたい事

  • 紙と電子データを使い分ける。

紙ベースでの計画

  1. イデアは紙に書き出す。
  2. 紙の手帳でアイデア出しと進捗の管理と大まかな予定管理をする。
  3. 手帳の上でPDCAを回す。

電子ベース

  1. google calendarで大まかな進捗管理
  2. ガントチャートで開発計画の管理。trelloなど。
  3. kgi/kpi/kdi/todoなどはwunderlistを使ったり、スプレッドシートなどで管理する。

2018_02_18時代性に適った生き方(make something people want)

airbnb/uber source:http://blogs.edf.org/energyexchange/files/2015/06/Airbnb_Uber.jpg

最近、よく時代性に適った生き方。
具体的にいうと、自分の生きている時代においてどのような行動を取ることが将来の期待値を高めるのかということについてよく考えます。

市場性とは需要と供給のバランスで変わってきます。それゆえ、みんながやっていないけどみんなが求めている事を追求することこそが生存戦略とも言えます。

最近動向が注視されるもの

  • 暗号通貨市場のトレード情報
  • ブロックチェーン技術(BTC/BCH/ETH/ETCやRipple/monaなどや周辺技術)
  • youtubeに関連するもの(virtual youtuber/youtuberや広告)
  • 分散型メディア
  • XR(VR/AR/MR)やAI/ML/DL
    などが注目を浴びていると思います。

それゆえ、そういった時代の変化を求め多くの人が情報をかき集めます。アプリケーションを触ったりするし、取引の手段を調べたりするし、このあと値上がりしそうなファンダメンタル、テクニカル分析の材料を求めるし、XR/blockchain/AI/Iotなどがどのように未来を変化させるのかみんなが興味をもち、先行情報を取得し、少しでも良いポジションを取ろうとみんなが躍起になっています。

最近考えること

さて、この時代においてどのように価値を生み出そうかと私は毎日思案しています。

結論として、周りに先んじて初見では訳がわからないけど積み上げたのちに数年後に突如として存在感と需要を満たすようなプロダクト、情報サービスを生み出すこと。ある小さな市場における先行情報を取得し、特定の業界に調査を始めようと考えたときに真っ先に頭に浮かぶような人間になることを目標とします。

昔誰かが言ってたような気がしますが、価値の源泉は人の求める数。誰かが良いと思わないとそこに価値は存在しないらしいです。

Ycombinator創業者のポールグレアムも言ってましたが
Paul Graham
source:https://futurestartup.com/wp-content/uploads/2012/08/PaulGraham-290x290.png:image=https://futurestartup.com/wp-content/uploads/2012/08/PaulGraham-290x290.png

make something people want(人の欲しがるものを産み出せ)
というように、ある特定の市場で生きて行くためには具体的な手法はなんでも良いので

とにかく

  • 世の中の課題を見つける。この時代において困っていることは何か?
  • 今の時代にある技術やものを使って過去から続く解決を諦めていたような問題解決の方法は何なのか?

考え続けること。そして行動すること。やり抜くこと。がとても重要なのだと思います。

やりきることの重要性

こんなこと言ってはいますが、本当に大変なのは考えること、発言することよりもそれを実現するところまでPDCAを回し続け、結果を出すまでやりきることです。やりきれず結果の出ない努力には何の意味もありません。結果の出ないプロセスにも何の意味もありません。結果が出て初めて、それまでかけてきた時間、数多くの失敗などが初めて意味のあるものになると思います。

いつかは結果が出るというスタンス

この努力を続けていればいつかは結果を出せるだろうという楽観的なスタンスが世の中に存在します。

ichiro suzuki
source:https://full-count.jp/wp-content/uploads/2015/05/20150507_ichiro-560x373.jpg

かつてイチローさんが何かのラジオかテレビでのインタビューで話しているのを見たのですが、努力を続けていれば結果はいつか出るみたいなスタンスは自分には合わないと話しているのを聞きました。

具体的には努力を続けていればいつかは結果を出せるという考え方は今現在結果を出すという問題から目を背けているのと同じだと思う。という趣旨のものでした。

この話を聞いて「あぁ、確かにそうだよなあ」と思いました。

  • 長期的な目標があるからこの努力を何となく続けていつかは結果が出るでしょみたいな今目の前にある課題を軽く扱うスタンス

  • 長期的な目標、今年は何をやる、半年後には何をする。三ヶ月後には何をする。今月には何を達成したいから今週中には何々を達成するために今日はこの問題を解決すると計画を立て、自分の立てた目標設定、問題解決に真剣に向き合うもの

両者を比較した場合、一日にしてみればそんなには差はないかもしれないけど、それが一週間、一ヶ月、半年、一年、数年と積み重ねたものでは一生埋まらないほどの差が出ると思いました。

だからこそ、結果はいつか出るものではなく、今出すものだと考えることが本気の失敗につながり、その問題解決を毎日積み重ねるからこそ成功に繋がるんだろうなあと感じました。

詰まる所、世の中で何かしら大きな成果を果たした人々を見渡すと、何か目標を達成する可能性を最大化させる方法は、人生において自分自身が設定した目標の負荷、その問題に向けて思考した量と質、要するに問題解決の質と量に起因するものだと個人的には感じています。

言うは易し行うは難し

とはいえ、言うは易し行うは難しなので、

  • きちんとこの時代性にかなった問題解決の手法、人の求める価値を産出する方法、その課題解決をお金を払ってでも欲しいと言うクオリティまで磨き上げること
  • そのチャーンレートを極限まで下げ継続的な利用にまで繋げること。それをブログを書くなり、プロダクトをリリースするなり、OSSに関わる。

などいろんなやり方で追求し実現していけたらと思っています。

  

これから学んでいきたいこと(what I want to do)

エンジニアとして成長して行く上で、どうしても根本的なところを抑えていかないと成長が止まるということを最近痛感してきている。そのために基本的な部分からきちんと抑えて行こうと思う。

インプット

結構色々なチャネルがあると思いますが、世の中で優秀と言われているエンジニアの方々はすべからく大量のインプットと良質なインプット、一次情報を取ることを怠っていないような気がします。

  • 開発者ブログ
  • はてブ
  • qiita
  • medium
  • 書籍
  • githubのコードリーディング
  • podcast
  • documentを読み込む
  • RSSにまとめた情報
  • twitter
  • forum などからとりあえず取れるだけ取って、そこから取捨選択して質に転化させていければなと思っています。

アウトプット

これも結構あると思っていて、やはり楽しいとおもって熱中できるものと、短期的にはつまらないけど、長期的な目標に向けて身につけておかなくてはいけない要素も存在すると思っています。最近すごく感じることは全ての行動をアウトプット前提とした方が、初めは多くの時間を奪われますが、長期間定着するスキル習得や指数関数的な成長に繋がると思っています。

今年挑戦したい事

  • LTへの積極的参加
  • 技術ブログ or Medium or Qiita
  • OSS Contribution
  • プロダクトリリースからDevOps
  • ハッカソン etc...

blockchainを学んで

ブロックチェーンを学んでいて強く感じたことがある。

  • 目で追ったインプットは結局本質的な情報、要素を判別しにくい。
  • ビジネスサイドだけで追う訂正的な情報だけでは、理解に乏しい。定着率が低い。

そこでここ数日やっていてこれは良いなと感じることがあった。

  • インプットはサブスクリプションのメディアなどを使ったり、feedlyなどを使って効率化する。
    →インプット経路の仕組み化をする。

  • アウトプットベースで手を動かして通した疑問点を深掘りして行くスタイルを取る。 →これが一番技術的なコアに近づき、定着率も深く、全体的な概念を理解した上でどういった用途で使われるのか、その実現可能性や現状の技術的な発展状態というものを理解できるように感じた。

  • ただ、新技術は情報が少なくやはり大変。。。 →日本人でも結構手を動かしてブログなどに残しているケースが多い。 →迷ったら、チュートリアルgithubなどを読み込む。 →軽いものはqiitaやググるかstackoverflowなどで解決。

  • 基本的に新技術は相談できる相手はいないので、自分自身でアルゴリズムを思考し、構築する能力がかなり大きく必要。 規格も決まっていないのでエラーも多い。 →自分自身がOSSに参加し、issue発見やcontributeをして成長するのがベスト。

  • とにかく手を動かして、その上で批評なり、さらなるアイデアなりを出して、とにかく実装ベースで物事を考えるようにする。 ニュースサイトのような二次的なものではなくて、自分でしっかりと手を動かしてアウトプットベースで物事を考えたい。

Write code every dayを意識して行く。時間の7〜8割くらいはコーディングにかけられるように意識して取り組んでいきたい。