ものづくりブログ

ゼロからスタートして何かを作って世に出すまでのことを書くブログです.

vimの導入方法(Mac編)

こんにちは。

前回は私がvimを導入した理由について書きました。
では実際にvimの導入をしていきましょう、と言いたいところですが、実はMacには最初からvimがインストールされています。

試しに使ってみましょう。

ターミナルを開いて、以下のコマンドを入力します。
(ターミナルの場所がわからなければ画面右上のspotlightで"ターミナル"と検索してみてください。)

vim test.txt

すると以下の様な画面が開いたと思います。
これがvimです。ここにテキストを入力していきます。

f:id:daisukekmr:20160118000423p:plain
図1. vimを開いた画面

ターミナルで入力したコマンドについて解説していきます。

f:id:daisukekmr:20160118001010p:plain
図2. vim起動のコマンド解説

vimと入力することでvimを起動することができます。
そのあと半角スペースを空けてファイル名を入力すると、開くファイル名を指定することができます。
今いるフォルダにそのファイル名がなければ、新規で作成されます。



さて、もう最初からvim入ってるならなんでこんなエントリー書いたんだよと言われそうですが、Macに最初から入っているvimクリップボードが使えないため、URLをブラウザから持ってきたりするのが非常に面倒です。そこで新しいvimをインストールします[1]。

brew update
brew install vim

これでvimをインストール

sudo mv /usr/bin/vim /usr/bin/old_vim

今インストールされているvimを新しく作成したold_vimというディレクトリに移動します。

sudo ln /usr/local/Cellar/vim/7.4.161/bin/vim /usr/bin/

そして先ほどインストールしたvimに置き換えます。



クリップボード機能をONにするには、vimの設定ファイルを作成し、そこに設定を記入する必要があります。
手順は以下のとおりです。

まずはcdコマンドでルートディレクトリ(一番上の階層のディレクトリ)に移動します。
cd

ここで、以下のコマンドでvimを使用して.vimrcというファイルを開きます。「.」で始まるディレクトリやファイル名は隠しディレクトリや隠しファイルという意味です。
vim .vimrc

今まで.vimrcを触ったことがなければ白紙の状態だと思いますので、そこに以下の一行を加えます。

set clipboard+=unnamed

ちなみに文字入力をするには"i"キーで文字入力モードに移行します。
そして入力がおわったら"esc”キーで文字入力モードから抜けます。
編集が終わったら":wq"とタイプして"Enter"でvimを終了します。

丁寧に1手順ずつ解説すると、

vim .vimrc
"i"キー押下
set clipboard+=unnamed と入力
"esc"キー押下
":wq"と入力し、”Enter"キー押下

以上です。これでクリップボードが使用可能になったはずです。
次回は具体的なvimの使い方について書いていきます。



参考文献
[1]MacVimでHomebrewを使ってクリップボード連携を有効にする(http://qiita.com/shoma2da/items/92ea8badcd4655b6106c)

通好み(らしい)テキストエディタvimについて

こんにちは。

最近ちょっと作りたいものがあり、プログラミングの勉強を再開しています。
そろそろちゃんとテキストエディタを何にするか考えようということで色々と調べたところ、
以下の2個が候補に上がりました。

vim
atom

atomGUIベースで直感的に使いやすいのと、開発したのがGithubなのでGithubとの連携などがしやすいようです。ただし少し重いとのこと。

vimGUIではなくコマンドで操作するもの、ということ。ちょっとわかりづらいと思うので例を挙げると、コピペなどの時にテキストの範囲を指定するのもキーボードでvを押してから矢印キーなどで移動することで行い、yを押してコピー、pでペースト、といったように、マウスやトラックパッドを一切使わずにキーボードで指令を入力することで実行するというものです。

結果として私は後者のvimを選んだのですが、その理由は以下の様なものです。

  • マウス使うよりコマンドの方が最終的に作業が早くなりそう
  • プログラミングだとターミナルで色々と操作することが多いので、ターミナル上で動くvimが便利そう
  • なんか通っぽい

お察しの通り最後のが一番の決め手となりました。ちなみに作業中の画面がこんな感じです。

f:id:daisukekmr:20160112181705p:plain
図1 vimを使っている画面(左のウィンドウ)

というわけで次回以降本題に入っていきます。vimのインストールから使い方まで書いていきます。使い方に関しては、新たに便利な使い方が見つかる度に加筆修正していきます。辞書的に使っていただいて、わからないことがあればコメントなどで質問していただければと思います。

ビットコインのことはこれだけ読んでればとりあえずOK、という記事

f:id:daisukekmr:20151129193429j:plain

こんにちは。

もう最近は一時期ほどその名を聞かなくなったビットコインですが、未だにちょこちょことWEB上のニュースなどでは見かけたりします。将来主流となるのか、それとも廃れていくのかは誰にもわかりませんが、この仕組を理解すると、現行の国家が発行する通貨の弱点の多くを克服している画期的なものであることがわかりますので、是非この機会に上辺だけでも理解していただき、皆さんが明日からドヤ顔する役に立てばこの記事を書いたかいがあるというものです。


さて、ビットコインはその知名度の割に中身が多くの人に理解されていない言葉だと思います。私はそれが、「管理者がいない」とか、「高性能なコンピュータで常に採掘されている」とかそういった断片的な情報が理解を妨げているためだと感じています。そこで、詳細な仕組みは別として、概要を理解するためにはどのような説明をするべきなのか考えてみました。そして、2つのキーワードさえ押さえておけば理解できるということに気が付きました。

その2つのキーワードが、”公開鍵暗号”と”ブロックチェーン”です。

逆に言うとこの2つを理解せずにビットコインを理解することは不可能なので、この2つについては少し文章の量を割いて説明したいと思います。ちなみにこれらはビットコインだけでなく現代社会の様々な場面で活用されている、または活用されうる非常に重要な技術なので、教養として覚えておいても損はありません。


キーワード1. 公開鍵暗号

公開鍵暗号というのは、暗号の1種です。
対義語は秘密鍵暗号です。

はじめに昔ながらの暗号を見てみましょう。例えば以下の様な暗号化された文字列を解読してみます。

KCOCUVWFGPV

これをアルファベット順に2文字ずつ前に戻すと、以下のようになります。

IAMASTUDENT

すなわち、

I am a student.

です。ちなみに暗号文ではスペースが非常に大きなヒントになるので、スペースを除いてやり取りすることがほとんどです。

このとき、x文字だけアルファベット順にずらすというのがこの暗号の方式と呼ばれ、特にこの方式の暗号はシーザー暗号と呼ばれます。昔カエサル(シーザー)が利用していたのがその由来です。
そして、何文字ずらすかを表す”2”というのが鍵と呼ばれます。

もう少し複雑な暗号を見てみましょう。

ACTOGEMFLBH

これを以下のように”SCHOOL”という鍵を当て、図1のような方陣で一番上の行が鍵の文字の列で暗号文の文字がある行の一番左の文字を書き出していきます。例えば鍵の1文字目Sが1番上の行にある列で、暗号文の1文字目Aがある行の一番左の文字を探すとIが出てきます。

S C H O O L S C H O O
A C T O G E M F L B H
I


f:id:daisukekmr:20151123225547p:plain
図1 ヴィジュネル方陣

このように暗号文を解いていくと、以下のような文字列が出てきます。

IAMASTUDENT

この暗号方式は考案者の名前からヴィジュネル暗号と呼ばれ、この時の鍵は”SCHOOL”です。

今挙げた2例では、”2”や”SCHOOL”という鍵が暗号化の鍵となり、また暗号を解くための鍵にもなっています。この鍵は暗号をやりとりする当事者間にのみ共有され、これが第3者の漏れれば簡単に解読されてしまうということがわかります。このように、暗号化の鍵を秘密にすることで成立する暗号を、秘密鍵暗号と呼びます。


一方で、鍵を公開してしまう暗号を公開鍵暗号と言います。鍵を公開してしまっては誰でもその鍵を使えてしまうのに何が暗号なんだ?と思われるかもしれませんね。
公開鍵暗号が暗号として成立する理由は、暗号化するための鍵と暗号を解読するための鍵が別であり、公開するのは暗号化する鍵のみであるということです。解読するための鍵は自分だけの秘密にしておくので、自分以外に暗号が解読される心配はありません。
なぜこんなことをする必要があるの?と思われるかもしれませんが、これはセキュリティの観点から、非常に大きな革命的な進歩だったのです。

実は秘密鍵暗号の重大な欠点として、鍵の受け渡しが必要であることが挙げられます。暗号文の送信者と受信者は常に今どの鍵が使われているかを共有しておく必要があります。また、1個の鍵を何日も使っていれば、誰かに解読されてしまう可能性が高くなるため、通常は毎日のように鍵を変えることが求められます。つまり定期的に鍵を受け渡しする必要があるのですが、そのタイミングがスパイにとっては情報を盗む絶好のチャンスだったのです。一方で公開鍵暗号では暗号化の鍵は誰でも見られるように公開されていますし、復号化の鍵は一切誰にも渡す必要が無いので、解読用の鍵の漏洩リスクが圧倒的に下がります。

ちなみにどのような仕組みで公開鍵暗号方式で暗号化/復号化がなされるのかということに関しては、理解のためにそこそこ数学的な知識が必要になるのでここでは割愛します。興味のある方はこの記事末尾の参考文献の[1]や[2]なんかを参照してみてください。
簡単に触れておくと、コンピュータが非常に苦手とする演算である、素因数分解というものを利用したものが知られています。例えば22という数字を素因数分解すると2と11になります。すなわちこれ以上割り切れないまで割ることを素因数分解というのです。2と11から22という数字は掛け算をするだけですぐに出てきますが、22から2と11を出す素因数分解をコンピュータは非常に苦手としています。これを利用して、2と11を復号化のための秘密鍵として自分で持っておいて、22を暗号化鍵として公開してしまうのです。もちろんこのくらいのケタであればコンピュータも簡単に素因数分解ができますが、例えば何万ケタ×何万ケタのような数字の素因数分解ともなるとかなりの時間を要します。ちなみに現代のインターネットなどで利用されている暗号を最新のスーパーコンピュータで解読しようとすると、宇宙の寿命よりも長い時間がかかるそうです。ほぼほぼ解けないと思って間違い無さそうですよね。


さて、ここまでそこそこの文量を割いて公開鍵暗号について説明してきました。これがビットコインにどのように関係するのでしょうか。
ビットコインはその名が示すとおり、お金です。ただもう一つ意味があって、そのお金を取引するための決済システムをも指しています。決済システムというのは、日本円で例えるならAさんの銀行口座からBさんの銀行口座に振り込むといったお金のやりとりを行うための仕組みのことですね。
ビットコインにも口座があります。その口座には番号が振られているのですが、普通の銀行口座と違う点は自分用の番号と他人に公開する用の番号がある点です。自分の口座から誰かに振り込む時は自分用の番号が必要です。そして、自分の口座に誰かから振り込んでもらう時は他人に公開する用の番号を使います。
この自分専用の番号と他人に公開する用の番号って何かに似ていますよね?そうです。ビットコインはここで公開鍵暗号の仕組みを使っているのです。かつては機密情報のやり取りのために発明された暗号が、まさか決済システムになってしまうなんて、感動すら覚えませんか?

ところで、公開鍵暗号の中には特別な性質を持ったものがあります。それは、復号化用の鍵で暗号化すると、その暗号では暗号化用の鍵が復号化用の鍵になるという性質です(図2)。

f:id:daisukekmr:20151124011458p:plain
図2 公開鍵と秘密鍵の関係

この性質を利用したのが電子署名と言われる技術です。もし私が、自分で作成した公開鍵暗号の復号化用の鍵(自分用の鍵)で自分の文書を暗号化して公開すると、それを解読するにはそれと対になっている、公開されている暗号化用の鍵が必要ということになります。すなわち、その暗号化鍵で解読することができれば、その文書が私によって公開されたものであるという証拠になるのです。そしてその証拠は公開鍵によって確かめられるので、誰でもが自分で確かめることが出来るのです。その点は本人確認のために筆跡鑑定などが必要な普通の署名よりも優れた点です。

なぜこの話をしたのかというと、この性質はビットコインになくてはならないものだからです。
先ほど私は自分の口座から他人に振り込む時は自分用の番号を使用すると書きました。その時、受け取る側からするとそれが本当にその人から送金されたものかどうかを見極める術が必要です。それが、この復号化鍵で暗号化した文字列を復号化するのに暗号化鍵が必要、という性質によってもたらされるのです。
実際に取引の例を見てみましょう。

1. AさんがBのさんに1BTC(ビットコイン)を送金しようとしています。
2. その情報をAさんは自分用の番号で送金情報を暗号化し、Bさんの公開用番号宛に振込みました。
3. BさんはAさんから送られてきた送金情報をAさんの公開用番号で復号化してみたところ、無事復号化できたので、これはたしかにAさんからの送金だと確認できました。
4. Aさんの口座から1BTCが減り、Bさんの口座に1BTCが増えました。

このように、ビットコイン公開鍵暗号の暗号送受信という面と、電子署名という面の双方を利用した仕組みなのです。

これでビットコイン公開鍵暗号技術をどのように使用しているかということはほとんど説明ができたのですが、あと1点だけ説明する必要があります。それはどのように口座を作るかということです。普通の銀行であれば口座の管理者である銀行に申し込んで、口座を作ってもらい、口座番号が発行されます。でもビットコインの場合、誰でも好きなときに勝手に口座を作って良いのです。自分用の口座番号を一定のルールにしたがって作ってしまえば、それに伴い公開用の口座番号は決まりますので、それを世の中に公開するだけです。あとはその公開用口座番号にビットコインが振り込まれれば、あとはその口座から他の口座に振り込むことができるのは自分用の番号を知っているあなただけなので、実質的に勝手に作った口座が世の中に認められた公式の口座という扱いになるのです。このことが、ビットコインには中央管理者が存在しないと言われる理由の一つです。


キーワード2. ブロックチェーン

これまでにビットコインでどのように口座が作成され、口座間のビットコインのやり取りがなされるかを、公開鍵暗号というキーワードを使って説明してきました。

それでは、どの口座にいくら入っているか、というのはどのように管理されているのでしょうか?

例によって普通の銀行の例で考えてみましょう。
銀行の口座にいくら入っているかは、言うまでもなく銀行のシステムで管理されています。
例えばA銀行の口座を持っていたとして、その口座の残高を管理しているのはA銀行ですから、別のB銀行はその残高を知りたい場合は、A銀行に問い合わせる必要があります。
口座の名義人がその金額を知りたいときは、ATMで残高確認をしたり、通帳に記帳したり、オンラインバンキングサービスを利用してPCやスマホから確認したりします。

ではビットコインの場合はどうなのかを見てみましょう。
先に書いたとおり、ビットコインの口座はルールに則ってさえいれば誰でも勝手に作って良いのでした。
そして、その口座に送金するときは、公開鍵暗号の仕組みを使って公開用の口座番号に振り込み、逆にその口座から別の口座に振り込む場合は、自分用の秘密の口座番号を使って振り込むのでした。
ではその振り込んだという記録はどこにするのでしょうか?
実はこれが非常に重要なポイントです。
ビットコインでは、こういった取引履歴を、インターネット上の複数の端末が全員で持つのです。
すなわち、ビットコインの歴史が始まった2009年から今までの全ての取引履歴を誰でも閲覧/所有することが可能ということです。
そのようにしてどの口座からどの口座へ振り込みが行われたかという全ての履歴が明らかになることで、どの口座にいくらビットコインが入っているかが明らかになるのです。
単一の管理者が口座の残高の管理を行う従来の仕組みに比べて、圧倒的に改ざんが難しいことがわかると思います。
例えばこの履歴を持つ端末が世界中に数千万あれば、その中の数個の端末のデータを改ざんしたところですぐに不正がバレてしまうためです。

では、取引も口座作成と同じように勝手に行って良いのかといえばそんなことはありません。
例えば残高を超えるような送金はできないような仕組みが必要です。
そこで、ビットコインでは取引の承認を行うことになっています。では、誰がいつ承認を行うのか。この取引承認の権利の争奪戦が、ビットコインの非常に面白いポイントのひとつです。
ビットコインでは10分に一度この取引承認の機会が訪れるようになっています。
その度に、取引承認を行いたい人はあるクイズ大会に参加します。
クイズの内容は、複雑な暗号を解読するようなもので、人間の力ではとても不可能で、高性能なコンピュータが演算しています。
これに最初に正解したコンピュータが、その時の取引の承認を行う権限を持ちます。
承認が行われると、規定のビットコインが承認者に与えられます。
これを俗に”採掘”と呼んでいます。当然ですが、本当に鉱山で掘り出すようなことはしません。この暗号解読クイズに挑戦し、最初に回答することでビットコインを得ることを”採掘”と呼ぶのです。

ちなみに、10分に1回なのに回答が早い者勝ちってどういうことなの?と思われたかもしれません。当然ですよね。1分で回答されたり、回答に20分かかったりすればこの10分に1度というリズムが崩れてしまいますからね。
実は10分というのは決められている制限時間などではなく、その時に参加しているコンピュータの数とそれらの演算能力で大体10分位で解読されるであろう問題が出題されるような仕組みになっているのです。
つまり、参加者数が多くなればなるほど、また参加する端末の性能が上がれば上がるほど、問題が難しくなっていくのです。この高難度化が進めば、ある時コンピュータを動かすための電気代が、得られるビットコインによる収益を上回ることになります。すでに現在ではその状態になってきており、先進国より電気代の安い途上国のほうが採掘が盛んに行われています。現在一番参加しているコンピュータ数が多いのは中国です。

さて、このようにおおよそ10分に1回のクイズ大会の度に取引の承認が行われることがわかりました。このようにビットコインの世界では10分毎にあらたに通帳のページが増えていくように取引履歴が増えていきます。この1ページにあたるひとかたまりを、ブロックと呼んでいます。このように、情報をブロックという単位で管理し、その連続データを複数の参加者で所有し、誤りや不正を監視しあうシステムを、ブロックチェーンと呼んでいるのです。


まとめ

いかがでしたでしょうか。公開鍵暗号とブロックチェーンというキーワードを使ってビットコインについて説明してきました。
他にも送金手数料はないの?あるとすれば何に使われているの?とか、そもそもビットコインを採掘したりブロックを記録するシステムは誰が作ってるの?とか、取引承認が全く同時に行われた場合どうなるの?とか、説明できていないことはたくさんあります。でもビットコインが大体どういうものなのかはおわかりいただけたのではないでしょうか。
この仕組みを理解すると、ビットコインは国がどれだけ規制しようとしても口座の凍結や資産の差し押さえなどができないことや、誰がどの口座を持っているかを調べる方法も限られることがわかります。
このことは危険と考えるか、安全と考えるか、また社会にとって良いことと考えるか悪いことと考えるか。それは考える人の立場や信条にもよることです。世の中では賛否両論、様々な意見が飛び交っていますが、それらに流されるのではなく、自分でちゃんと考えたいものです。



参考文献
[1]暗号解読
[2]猿にもわかるRSA暗号(http://www.maitou.gr.jp/rsa/)
[3]誰も教えてくれないけれど、これを読めば分かるビットコインの仕組みと可能性(http://jp.techcrunch.com/2015/03/31/bitcoin-essay/)