プログラミング初学者に伝えたい汎用的なデバッグ技法
プログラミング初学者はその知識量が少ないために、様々なところで躓きます。
訳のわからないエラーメッセージに遭遇し、ネットで調べてもさっぱり分からずに途方に暮れてしまいます。そして試行錯誤するも進んでいるの更に悪化してるのかも分からずに、ストレスがたまります。誰しもこのような経験を乗り越えて詳しくなって行くと思いますが、とりわけ初学者は原因の分からない問題に対処するノウハウが蓄積されていないのが、躓きの原因かと思います。
そこで、時間はかかりますが、原因が全く分からない問題に対処していける一つの手法を紹介します。
ここで取り上げるケースは、以下の前提に基づきます。
- トラブルの原因箇所は1つだけとするが原因は全く不明
- 同じコードであればいつ実行しても同じ結果を返すとする(実行タイミングによる結果の変動はない)
- 開発中のプロダクトを想定し、短期間で何度でも実行できる。
- フロントエンド、バックエンド、プログラミング言語などは問わない
オススメのデバッグ方法
以下の3ステップです。
- 動く状態、またはHelloworldなど自分が理解できる動く小さなコードまで戻る
- そこから少しづつコード変更を加えていき、動いていた最終の状態と、動かなくなった最小の変更が何かを知る。
- 「動いていたこの最終の状態から、この変更を加えたら動かなくなりました。」と、先輩や詳しい人に聞いて助言を求める。
動く状態まで戻る。これが全てなのですが、まずは自分の期待通りに動かせる最小、または最初の状態に戻ります。
リポジトリで管理していれば、最後に動作したコードにチェックアウトするがよいです。新しいライブラリやフレームワークを試しているのであれば、それが動作する最小のHelloWorldコードを実行するところまで戻ります。意外に気づくことがあるのですが、最小の動くコードに戻したと思ったらまだ対象のエラーに遭遇していて、エラーの箇所が調べていたところと全然異なっていたということもあります。
想定どおりに動かせる(コントロールできる)ところまで戻ることで精神的な余裕も生まれます。
この方法は限定した状況でのみ使える地味な方法ですが、確実に一歩一歩すすめますので、お試しください。
ブロックチェーンをゲームで使う意義
先日の マイクリハッカソン でゲームにブロックチェーンを組み込む意義みたいな話が出て、その内容が興味深かったのでメモしておきます。
なぜブロックチェーンでゲームを作るのか
以下に内容はパブリックブロックチェーンを想定しています。
主な理由として以下の2点が考えられます。
永続性
プログラムが正常に動いてさえいれば、仮に運営がメンテナンスを放棄してしまったとしても、ゲーム自体は維持されます。人気のあるゲームが運営の金銭的な理由によってサービス停止されたり、一部のニッチ層だけが楽しんでいるゲームが維持できなくなり、停止するなどの事例はいままで起こっていますが、それが防げる可能性があり、ユーザのコミュニティで維持されることが期待できます。MMOのエミュ鯖が近いイメージです。
公正性
ブロックチェーン内の情報は誰もが閲覧できるので、その途中経過に不正がないことを証明でき、改ざんも防げます。またイーサリアムのようなコントラクトをブロックチェーンで管理することで、どのような処理が実行されるかも公開され、透過性を保つことができます。
またデメリットや、課題として、以下が挙げられます
複雑な処理ができない
現在のイーサリアムの仕組みでは、計算量がコストに結びつくため、複雑な処理をするほど費用がかかってしまうゲームになります。現時点ではこの計算コストが安くないため、ゲームの処理をブロックチェーン上で実行できたとしても、ごく単純な処理に限られてしまいます。その単純な処理だけでは、どうしても単調なゲームになりがちで、ゲームそのものの面白さを表現することが、ブロックチェーンを使わない従来のゲームに比べて難しいと考えられます。
改変の難しさ
ブロックチェーン状のプログラムや処理結果は改ざんが難しいという利点がある一方で、既存のプログラムをアップデートしたり、不具合を修正したりすることが従来よりも難しいと考えられます。この辺りは新たな方法が色々提案されていて、模索中の状態のようです。
ランダム性などのゲーム性の担保
プログラムが誰もが見れるというのは公正性を保てるという利点がある一方で、乱数の生成など、内容が見られてしまうことによって都合がよくない場合があります。乱数のアルゴリズムが分かれば、それを解析して有利な結果を得ることが可能になってしまいます。十分にランダムな乱数を得るためには計算量も大きくなってコストも上がってしまうというジレンマがあります。
所感まとめ
ゲームはブロックチェーンの適用例となる良い例かと思いますが、解消すべき課題はまだまだあるのかと思っています。ブロックチェーンを使用してプログラムを組むと、従来までのセオリーが通用しない部分があり、そのあたりがまだまだ発展途上なのかなと感じています。
マイクリハッカソンに参加しました
以下のハッカソンイベントに参加してきました。 www.mchhackathon.com
このゲームは多少知っていたのと、ブロックチェーンについて多少なりともキャッチアップできないかと思い、参加しました。
場所は HushHub さんのコワーキングスペースです。
以下やった内容をメモっておきます。
09:30 集合
10:00 開始。
ルール説明、スポンサーからのコメント、API解説など
11:00 チーム分け
最初からグループで来ている人も結構居ましたが、今回は知り合い2名+あらたに2名の計5名でグループを組むことに。
その後ハッカソン開始。 もともとイーサリアムネットワーク上で何ができるのかや、マイクリは何がイーサリアムチェーン上で管理されているのか、何がサイドチェーンなのか 確認、議論など。
11:00 - 15:00 何を作るか議論。
アセットをレンタルできるシステム案が有力で、実装可能かどうかを検討しました。
いろいろ話しているうちに、以下のような話になりました。
- アセットを貸して返すということを実現するために、アセットを将来送るというコントラクトの実現が難しい
- 借りている側がアセットを他に送ってしまい、持ち逃げされる可能性が残る
- マイクリの仕組み上、アセットを使うにはイーサリアムネットワーク -> マイクリのサイドチェーンに送らないと遊べないので、イーサリアムネットワーク上にとどめておけない。
- アセットを借りている側がアセットの価値同等もしくはそれ以上のイーサリアムを供託するという質屋モデルでなら実現可能。
- 借りたアセットを返さないと供託金が没収される。
- ただしそれだと少ない金額でレンタルしたいという要望は満たせないし、買ってからすぐ売るということとあまり変わりがない。
借りてちゃんと返したということを記録を評価として用いて、評価の良い人は供託金を少なくするシステムはどうだろうという 話も出て、それなら実現はできそうだがハッカソンネタとしてはあまり面白くないので、結局取り下げ。
他に出てきた代替案としては、今はアセット <=> イーサリアムの交換はできるが、アセット <=> アセットの交換をする仕組みがないので、 アセット同士を交換する仕組みをやってみようということに。さらに今までの掲示板モデルではなく、 チャットルーム形式で交渉できるような仕組みにしようということで、着手開始。
15:00 - 17:00 ようやく開発開始。
自分ともう1名でとりあえずバックエンドをペアプロ形式で準備。チャットルーム作成なのでSocket.io(websocket) を使うことに。 残り3名で コントラクト開発、自分のイーサアドレスからMetamask経由でアセット情報取得方法を調査。 フロントエンド・画面は... 空いた人がやることになりました。
17:00 - 21:00 開発継続..終わらず。
チャットルームの雰囲気ができたが、コントラクト側が難しそうなので、フロントエンドの準備も自分+もう1名で着手。 静的ファイルでよかったが、axiosやCSSフレームワークをさくっと入れたかったので、nuxt.jsを使用。
結局フロントとバックエンドのつなぎこみも不十分で、さらにコントラクトのつなぎ込みもできないまま、 タイムアップに。
21:00 開発した内容の発表
所感
結局発表時までに十分に動くものがデモできなかったのは残念で、 分かっていたことですが、ブロックチェーンに関する理解が不十分だったため、着手まで時間を要してしまい、 十分な開発時間を確保できませんでした。
また、今思うとデモで重要なポイントであるフロントエンド画面をおろそかにしてしまったのもあまりよくなかったなぁと思いました。 このあたりは残り時間の兼ね合いで注力すべきポイントをもっと絞るべきでしたね。 もっとフロントの実装を早くできるようになりたいところです。
即席で作成したグループでしたが終始良い雰囲気で開発できたのは良かったです。 とても疲れますが、良い勉強になったと思いました。
追記
マイクリハッカソン 表彰式で、CryptSpells賞をいただきました。 プロダクト自体はあまり作りきれなかったのですが、提案内容や背景に共感いただけたとのことでした。感謝です。
CryptShellの限定アセットがもらえるとのことです。
Ruby 2.6.3 がリリースされました
Ruby 2.6.3がリリースされて、rbenvからもインストールできるようになりました。
新元号が対応したみたいなので、試してみました。
インストール(rbenvで)
ruby-buildのアップデート $ cd /usr/local/rbenv/plugins/ruby-build/ $ git pull $ rbenv install -l | fgrep 2.6.3 ~ 2.6.3 $ rbenv install 2.6.3 $ rbenv global 2.6.3 $ rbenv rehash $ ruby -v ~ ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
Version 2.6.3!!!
ためす
和暦にからむメソッドとして、Dateクラスの jisx0301
を叩いてみます。
$ irb $ require "date" $ Date.new(2019, 4, 30).jisx0301 => "H31.04.30" $ Date.new(2019, 5, 1).jisx0301 => "R01.05.01"
令和元年!!!
以上です。久々の更新でこんなネタでいいんだろうか..
"ビットコインは終わった" という言説について
仮想通貨関連の話題として、 ビットコインは終わった
という言説、主張をたまに見かけます。
そしてビットコインが2017年に加熱する以前から仮想通貨、ブロックチェーンに興味をもって触っていた人にとって見れば、
その言説に何か違和感を感じるような人もいるかと思います。
そこでビットコインは何が終わった、何が終わっていないのか、を考えてみました。
ビットコイン終わった
派の主張
ビットコインが「終わった」という主張の例として、書籍 After Bitcoinを挙げてみます。 この本の帯には、こう書かれています。
ビットコインは「終わった」。 ブロックチェーンは「これから本番」。
この本は2017年10月に発行されており、その時はちょうどビットコインの価格が1BTC70万程度の時期でした。 そのあと2017年12月の1BTC200万を突破する直前の時期で、ビットコインはバブルなのかという声が聞こえる一方で、 ビットコインやアルトコインが軒並み値上がりしている時期でした。
この高騰の渦の中で、ビットコインが決済システムとして以下の欠点があることを冷静に指摘しています。
- 脆弱性: ビットコインを管理するシステムが脆弱であり、保管も課題があるため、流出のリスクが伴う
- 偏在性: クジラと呼ばれる大口保有者が全体の大半を保有している
- 非通貨: 通貨としてビットコインを使用しているユーザはごくわずか
- 投機性: 投機的な価格変動があまりに激しい
- 集中性: 前取引の大半が中国元を占める
- 崩壊性: 半減期によるマイニング報酬の減少や、政府の介入リスクが伴う
上記のように、通貨、決済システムとして弱点があり、使えるレベルではないのでは、という主張を行っています。
実際、2018年度には投機熱がかなり高まったため、2017年12月には1BTC230万円超えを記録したものの、現在は約1BTC40万円ほどで、約6分の1ほどに下落しています。
ビットコイン終わっていない
派の主張
ビットコインはもともと サトシ・ナカモト氏の論文 で中央管理者が不在の状況で不可逆な価値の取引を実現するシステム として提唱され、現在のビットコインはそれを実現しています。
ビットコインが稼働し始めてから現在に至るまで、この 管理者不在で価値の取引を実現する
という目的は達成されており、欠陥が見つかったわけではありません。
むしろこれだけ多くの人に注目を集めた状態でも、仕組みそのものに欠陥が見つからなかったことは、よりこの仕組みが強固なものと証明されたという考え方もできるかもしれません。
またビットコインは一種の "価値の保存形態" としての地位を確立しており、いわゆる金に近いような性質を持ちます。 金は希少であり、金属的に特殊な性質も持つものとして、中央銀行の情勢の影響を受けにくい資産として認識されていますが、ビットコインも発行量が限定されており、 数学的に特殊な性質持つものとして扱うことができます。この管理者不在で価値を保てるという仕組みが一定程度認められているため、資産としても価値があるとも言えます。
2018年度に下落自体は確かに起こりましたが、2017年1月の1BTC15万に比べてれば、現在はそれよりも遥かに高く、単純に投機熱が高まって冷めただけのこととも見えます。
両者の主張まとめ
とりあえず私が思う両者の主張を書いてみましたが、2017年度の加熱期以前から興味を持っている方は、後者よりなのではないでしょうか。
ビットコイン終わったと思っている人は、ビットコインが現在の金融システムをすげ替えてしまう素晴らしい仕組みで、もっとビットコインによる決済が身近になると 考えていた人が、それが当面実現されないと感じたのではと考えます。After Bitcoinの著者もビットコインはそんな優れた決済システムではないよと指摘しており、その意味で "終わった" という言葉を使用しているのかと推察します。
その一方で、もともと管理者不在の価値の取引の仕組みとして着目している人にとっては、現在は一歩一歩課題をクリアしている段階で、外野が勝手に夢見て幻滅しているのは構わないが、 本質は何も終わっていない、と考えてるのかなと思います。