読者です 読者をやめる 読者になる 読者になる

ビットコイン・ブロックチェーン技術ブログ|合同会社ジャノム

ビットコイン・ブロックチェーン専門企業からの目線で、最新技術を一般の方に分かりやすく解説します

木更津高専にてビットコインに関する特別講義を行いました

f:id:mhyuga:20170120125007j:plain

こんにちは。合同会社ジャノム代表の日向です。 だいぶ寒くなってきましたね。

暗号通貨・ビットコインの活動に積極的に参加されている方には様々な年齢層がいるわけですが、 若い方だとまだ高校生くらいの方もいます。

そんな中、とある暗号通貨コミュニティで知り合い仲良くなった方から「自分の通う高専(木更津高専)で特別講義を開催して欲しい」というオファーをいただきました。 講演料等はいただけないという話でしたが、将来有望な若い方にビットコインの仕組みに触れてもらい興味を持ってもらうことで、 まだまだ未熟な暗号通貨コミュニティに少しでも貢献できればという思いから快諾させていただきました。

そして昨日の2017年1月19日(木)に講義を行ってきましたので、その時に利用しましたスライドを公開いたします。

全体としては二部構成となっており、前半でビットコインの基本的な仕組みを解説した後、後半では最近の動向としてどのような技術が開発・研究されているのかというのを技術的な詳細を避けつつ俯瞰するという内容としました。

入学試験の関係で学校はお休みだったにもかかわらず、30名近い方に聴講いただきました。 また参加された生徒さんも意欲的で様々な質問をしていただきまして、こちらとしても刺激になり非常に有意義な時間となりました。

投稿の先頭に掲載した写真は当日の様子になります。 事前に用意したレジュメを見ながら熱心に聴講されているのが分かりますね ^^

最後に、この機会を与えていただいた方々に感謝申し上げます。 ありがとうございました。

P.S.

弊社では暗号通貨やビットコインの技術に関する講演、コンサルティング、技術提供などを随時受け付けております。 興味のある方は弊社ホームページよりお問い合わせください!

ブロックチェーン大学校の出張講義(於:株式会社オウケイウェイヴ様)を行いました

f:id:mhyuga:20161202210703j:plain

久しぶりの更新となります。代表の日向です。

実はここ二ヶ月ほどあるお仕事を受けましてかなり忙しくしておりまたが、ようやく落ち着きましたので本ブログにて報告いたします。

ご存じの方も多いかと思いますが、ブロックチェーン推進協会 (通称:BCCC) とビットバンク株式会社が主催している「ブロックチェーン大学校」と呼ばれる教育プログラムがあります。 これは内容としては、米 Blockchain University でかつて Ryan 氏 (現 Yours CEO) が作成しましたスライド資料に基づいておりまして、 ビットコインで使われている技術やプロトコル仕様・最新の BIP (Bitcoin Improvement Proposal) などをかなり詳細に教えるといったものとなっております。

こちらの講義はもともとは BCCC 加盟企業様から広く生徒を募集して Jonathan Underwood (通称:木ノ下じょな) 氏を講師として開催していたのですが、 今回は株式会社オウケイウェイヴ様 (名証セントレックス 3808) より「社内の全エンジニアおよび、 その他希望者あわせて約50名に対して講義をして欲しい」とのご要望を受けまして、 今回は特別にオウケイウェイヴ様のオフィスに出向きまして出張講義という形で開催させていただきました。 (オウケイウェイヴ様発表資料)

講義の様子は日本経済新聞にも掲載されたようです。 こちらの写真に映っている、前でマイクを持って喋ってるのは僕です ^^*1

10月〜11月にかけて約二ヶ月間、全8回の講義を毎週行わせていただきました。 勉強会などで話させてもらったことは過去にも何回もあるのですが、 このような連続講義は初めての経験でしたのでなかなか大変でしたが非常に良い経験になりました。 また受講された方にはエンジニアではない方も何割かいらっしゃったのですが非常に意欲的に受講していただき、 毎回出題させていただいた課題にも精力的に挑んでいただきましてこちらとしても大変刺激になりました。

ちなみに記事の冒頭に掲載しました写真は、最終回の講義終了後に受講者の方やブロックチェーン大学校の関係者で記念撮影を行ったものです。 残念ながら何人か欠席された方がいらっしゃいまして全員は映っていないのですが、ご覧のようにたくさんの方に受講していただきました。

ブロックチェーン大学校は来年以降も継続的に開催していく予定となっておりますので、ご興味のある方はぜひご参加ください。 かなり濃い内容となっており正直なところ難易度は高いですが、これほど集中的にビットコインの知識を蓄えられる機会は正直なかなかないと思います。 また今回までの講義内容に対していただいたご意見を生かしまして、来年以降はより進化したカリキュラムを提供させていただけるよう準備中ですのでご期待いただければと思います。

最後に、長い間お付き合いいただきました株式会社オウケイウェイヴの皆様に改めて感謝の意を表させていただきます。 ありがとうございました!

*1:なお、記事本文の記述と写真が若干ちぐはぐのようです

Wercker + Gulp + EJS + Amazon S3 + GitHub + CloudFlare で作る!完全自動化・月額1円ウェブサイト

こんにちは。代表の日向です。

会社ウェブサイトを表題にある様々なサービスを組み合わせ、ソースコードから自動的にビルド&デプロイを行い、 超低コストでホスティングできる仕組みを作りましたので、だいたいどんな感じで作ったのかというレポートを掲載します。

はじめに

突然ですが、みなさんはスタティックな(サーバ側の処理がほとんど発生しない)ウェブサイトを作る時、何を使っているでしょうか?

一般的にはレンタルサーバを使ったり、Wordpressホスティングサービスを使ったりすることが多いと思いますが、 どうせサーバ側の処理なんて要らないのにわざわざ高い月額費用を払ってサーバを借りるのは非常に馬鹿らしいですし、 OS や Wordpress のバージョンを上げたりなんだりと日々のメンテナンスも結構煩わしかったりしますよね。

ですので、なるべくコスト(金銭的コスト・人的コストの両方)をかけずにスタティックなウェブサイトを構築できる方法を密かに模索しています。 ページ数の少ないシンプルなウェブサイトを作る場合には GitHub Pages を使うのが個人的にはかなりイケていると思っていて、 当社ウェブサイトも実は GitHub Pages を使って構築していたのですが、ソースコードの後処理的なことができず不便だったため、 タイトルにあるように最新(?)のサービスを組み合わせてそれっぽい仕組みを作ってリニューアルしてみました。 本記事ではその取り組みについて紹介させていただきます。

GitHub にプッシュするだけで、ヘッダやフッタを自動的にページに挿入して公開してくれますので非常に便利です! このページを参考に、ぜひあなたのウェブサイトも自動化してみましょう!

経緯

当社ウェブサイト (https://janom.co.jp/) は GitHub Pages を使って構築していたのですが、 GitHub にあげたソースコードがそのまま HTTP(S) で見えるようになるという仕組みのため、 例えば「ソースコードに後処理をかけて別ファイルのヘッダ・フッタファイルを統合して HTML ファイルを生成する」といったことができないという難点があります。

ですのでいままではシングル・ページ・アプリケーションのような構成にしてすべてのページを無理やり一つの HTML ファイルに突っ込んでいたのですが、 ページ数やコンテンツ量が増えるにつれて厳しくなってきました。

「もうこれ……管理……無理……」という状況になりましたので、GitHub Pages を諦めてなるべく低コストかつ全自動ですべて処理されるようにしよう、 ということで今回の仕組みづくりに至りました。

やりたいこと

以下を目指します。

設定手順

さすがに使ったものをすべて事細かく書いていくとキリがありませんので、今回作った仕組みの概略を示します。

重要な部分のみを記しており、これがすべてではありませんので、 より詳細な情報についてはソースコード等をご確認ください。

リポジトリディレクトリ構成

Gulpによる自動化

Gulp は Node.js で書かれたビルドシステムです。 非同期に複数の処理を同時に走らせられることや、プラグインが多数用意されており、複雑な処理 (例えばソースコードをminifyしたり、ソースコードの変更を監視し自動リビルドしたり) が一発で実行できるなどの特徴があり、非常に便利です。

ビルドステップや具体的な実行内容はすべてリポジトリのルートディレクトリにある gulpfile.js に記載してありますので、 詳細についてはこちらを見てもらうとして、ここでは今回作った Gulp タスクの一覧を載せるだけにとどめます。

  • commit-hash - gitの最新コミットIDを取得
  • dist-clean - クリーンアップ処理
  • ビルド関連
    • dist-copy - 後処理の必要のない画像ファイルや各種データファイルをコピー
    • dist-ejs - EJSテンプレートファイルの処理
    • dist-js - JavaScriptソースコードを一つのファイルに固めてminifyする
    • dist-css - CSSソースコードを一つのファイルに固めてminifyする
  • デバッグ
    • watch - ソースコードの変更を監視し、変更が検知された場合に自動リビルドを行う
    • connect - 開発中の内容を見るためのテスト用サーバの立ち上げスクリプト

Werckerによる自動ビルド・デプロイ

Wercker は Travis CI のような CI サービスですが、GitHub や Bitbucket のプライベートリポジトリでも無料で使えるのが大きな特徴の一つとなっています。 (※なお、そのかわり無料アカウントでは同時ビルド数が2までに制限されており、この制限を撤廃するのに料金が発生するようです)

ウェブから GitHub との連携と利用するリポジトリの選択を行ったら、 あとは基本的にはリポジトリのルートディレクトリにある wercker.yml という YAML ファイルに実行したい処理を記述するだけです。

Wercker では前述の gulp によるビルド処理を走らせた後、Amazon S3 にアップロードする処理を走らせるようにしています。

実際の設定ファイルの内容はリポジトリを見てください……といいたいところですが、極めて短く記述できましたので全文を載せます。

box: nodesource/trusty
build:
  steps:
    - npm-install
    - hgen/gulp:
        tasks: dist-clean
    - hgen/gulp:
        tasks: dist
deploy:
  steps:
    - s3sync:
        key_id: $AWS_ACCESS_KEY_ID
        key_secret: $AWS_SECRET_ACCESS_KEY
        bucket_url: $AWS_BUCKET_URL
        source_dir: dist/

これだけです。超簡単です。

Amazon S3 の設定

Amazon S3 のいわゆる静的ウェブサイトホスティング機能を利用します。 詳しい設定方法についてはネット上にいくらでも転がっていますので省略します。

設定が終わったら、利用するバケットにアクセスできる IAM ユーザを作り、アクセスキー等を Wercker のウェブ UI から指定します。

具体的には環境変数として以下の三つを定義します。

  • AWS_ACCESS_KEY_ID - IAMのアクセスキー
  • AWS_SECRET_ACCESS_KEY - IAMのシークレットキー
  • AWS_BUCKET_URL - バケットのURL。s3://BUCKET_NAME のように先頭に s3:// をつける必要があります

CloudFlareで簡易SSL

CloudFlare はリバースプロキシ動作をする CDN サービスです。

……が、今回は CDN としてではなく、CloudFlare の提供する無料 SSL 機能の利用を目的としています。 Let's encrypt などの無料の SSL 発行サービスもありますが、結局サーバが必要となってしまいますので、 Amazon S3 とユーザの間に CloudFlare を噛ませることでウェブサイトの SSL 化を行います。

設定方法等はいくらでも転がっているようですので省略します。

動作確認

もろもろ設定ができたら動作確認を行います。

GitHub にプッシュを行うと自動的に Wercker でのビルド&デプロイ作業が進行するはずです。

f:id:mhyuga:20160819144355p:plain

上の図のようになれば成功です。 URL を叩いてみて正しく反映されているか確認しましょう。

これで、GitHub にプッシュするだけで自動的にビルド&デプロイが行われるようになりました!

月額費用

最後に月額費用を試算してみましょう。

まず、利用している外部サービスは GitHub、Wercker、Amazon S3、CloudFlare といったところですが、 Amazon S3 以外はすべて無料プランですので料金は一切発生しません。

Amazon S3 の利用料金はというと、執筆時点(2016年8月19日)で東京リージョンでは

  • ストレージ利用料金 - $0.033 / GB / month
  • リクエスト料金 - $0.0037 / 10,000リクエスト
  • 転送料金 - 1GBまで無料

です。

それぞれ直近一ヶ月の実績をもとに計算をしてみると、

{\displaystyle
\$ 0.033 \times 0.02 \text{GB} + \$ 0.0037 \times \frac{5000}{10000} + \$ 0 = \$ 0.00251
}

となり、月額約0.25円という試算となります。 そんなにアクセスがないというのもあると思いますが、なんか1円切ってますね()

さいごに

スタティックなウェブサイトを作る賢い方法は他にもたくさんありますし、運営者や開発者の趣味(プログラミング言語の趣向等)によってもやりやすい方法は異なるでしょうから、 必ずしもこの記事の方法が最適とは限らないでしょう。 しかしながら、この記事をお読みいただき「あぁ、確かにそういう方法もあるのか!」という発見が少しでもあれば幸いに思います。

ぜひこれを機に色々な方法を試していただければと思います。 逆に、「こんな方法もあるよ」というのがありましたらコメント欄等から教えていただけますと非常に助かります。

【設定メモ】ローカルDNSサーバ構築

↓の投稿でローカル向けに固定IPアドレスを配る仕組みを作ったのですが、いちいちIPアドレスは覚えていられませんので、ローカル向けのDNSサーバを構築しました。

blog.janom.co.jp

目標とか

  • BINDを使う
  • DDNSを用いて、DHCPサーバから自動的にDNSレコードを更新するようにする
  • ローカルのホスト名以外のリクエストの処理はルータへ投げる
  • 正引き・逆引き、ともにできるようにする

設定手順

BIND のインストール

何はともあれ、BINDをインストールしましょう。

$ sudo apt install bind9

動作設定

/etc/bind/named.conf.options を編集します。

@@ -10,15 +10,18 @@
        // Uncomment the following block, and insert the addresses replacing 
        // the all-0's placeholder.
 
-       // forwarders {
-       //      0.0.0.0;
-       // };
+       forwarders {
+               192.168.0.1;  # ルータのアドレスを指定する
+       };
+       forward only;  # デフォルトではフォワード先(ルータ)で名前解決に失敗した場合、再帰問い合わせを行って自力での解決を試みるが、これを行わないようにする(フォワードのみ)
 
        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
-       dnssec-validation auto;
+       dnssec-validation no;  # ルータがDNSSECに対応しておらずエラーになるため、DNSSECを無効にする。
                               # フォワード先が DNSSEC に対応していれば (ちなみに Google の 8.8.4.4, 8.8.8.8 は対応している) この設定は不要
 
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };

ゾーン設定

ゾーンファイルを置くためのディレクトリ (/etc/bind/zones) をあらかじめ作っておきます。

$ cd /etc/bind
$ sudo mkdir zones

↓DDNSを利用する場合、ゾーンファイルと同じディレクトリにジャーナルファイル(?)が `bind` ユーザにより作成されるため、書き込めるように設定をする
$ sudo chown root:bind zones
$ sudo chmod g+w zones

ゾーンファイル指定

/etc/bind/named.conf.local にゾーンファイルの在り処を指定します。

# 正引き
zone "office.janom.co.jp" {
        type master;
        file "/etc/bind/zones/office.janom.co.jp";  # ゾーンの設定ファイルの場所
        allow-update {
                127.0.0.1;  # DDNSによるアップデートを許可するホストのIPアドレス。ここではローカルホストのみを指定する
        };
};
# 逆引き
zone "0.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/zones/0.168.192.in-addr.arpa";
        allow-update {
                127.0.0.1;
        };
};

正引きゾーンファイル

/etc/bind/zones/office.janom.co.jp に正引き用のゾーンファイルを以下のように作ります。

$TTL 3600       ; 1 hour
office.janom.co.jp      IN SOA  gw1.office.janom.co.jp. info.janom.co.jp. (
                                2016081513 ; serial
                                3600       ; refresh (1 hour)
                                600        ; retry (10 minutes)
                                604800     ; expire (1 week)
                                3600       ; minimum (1 hour)
                                )
                        NS      gw1.office.janom.co.jp.
gw1                     A       192.168.0.2

逆引きゾーンファイル

同様に逆引き用のゾーンファイルを /etc/bind/zones/0.168.192.in-addr.arpa に作っていきます。

$TTL 3600       ; 1 hour
0.168.192.in-addr.arpa IN SOA  gw1.office.janom.co.jp. info.janom.co.jp. (
                                2016081509 ; serial
                                3600       ; refresh (1 hour)
                                600        ; retry (10 minutes)
                                604800     ; expire (1 week)
                                3600       ; minimum (1 hour)
                                )
                        NS      gw1.office.janom.co.jp.
2                       PTR     gw1.office.janom.co.jp.

DHCPサーバ設定

次に、クライアントがネットワークに接続した際に自動的にDDNSの設定がされるよう、DHCPサーバの設定を編集します。 本番マシンではDDNSの設定以外も一部いじってありますが、その部分は今回の記事とは関係ないので省略しています。

@@ -10,18 +10,19 @@
 # attempt to do a DNS update when a lease is confirmed. We default to the
 # behavior of the version 2 packages ('none', since DHCP v2 didn't
 # have support for DDNS.)
-ddns-update-style none;
+ddns-update-style interim;  # DNSのアップデートを行うように指示。モードがいくつかありそうな雰囲気だが、いまのところ(古いdhcpd用の "ad-hoc" を除けば)"interim" しかない
+update-static-leases on;  # リースを更新した際にもDNSをアップデートするようにする(デフォルトでは新規割当 or 割当解除時のみ)
 
 # option definitions common to all supported networks...
-option domain-name "example.org";
-option domain-name-servers ns1.example.org, ns2.example.org;
+option domain-name "office.janom.co.jp";
+option domain-name-servers 192.168.0.2;  # DNSサーバのIPアドレスを指定する
 
 default-lease-time 600;
 max-lease-time 7200;
 
@@ -30,6 +31,72 @@
 # No service will be given on this subnet, but declaring it helps the 
 # DHCP server to understand the network topology.
 
+zone office.janom.co.jp. {
+       primary 127.0.0.1;  # 正引き用のDNSホストを指定する
+}
+zone 0.168.192.in-addr.arpa. {
+       primary 127.0.0.1;  # 逆引き用のDNSホストを指定する
+}
+
+# Network Devices.
+host router1 {
+       hardware ethernet 12:34:56:78:90:ab;
+       fixed-address 192.168.0.1;
+       ddns-hostname "router1";  # ホスト名を指定する。ここで指定しない場合には、クライアントから渡されるホスト名が代わりに利用されることになる
+}
+host gw1 {
+       hardware ethernet ab:90:78:56:34:12;
+       fixed-address 192.168.0.2;
+       ddns-hostname "gw1";
+}
 #subnet 10.152.187.0 netmask 255.255.255.0 {
 #}

動作確認

以上で設定は終わりで、最後に必要なサーバ類の再起動 and/or リロードをすれば完了です。

動作ログは /var/log/syslog に吐き出されます。 新しくクライアントが接続すると、以下のようなログが吐かれるはずです。

Aug 16 09:59:04 gw1 dhcpd: DHCPREQUEST for 192.168.0.100 from 12:34:56:78:90:ab via eth0
Aug 16 09:59:04 gw1 dhcpd: DHCPACK on 192.168.0.100 to 12:34:56:78:90:ab via eth0
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone 'office.janom.co.jp/IN': update unsuccessful: pc1.office.janom.co.jp: 'name not in use' prerequisite not satisfied (YXDOMAIN)
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone 'office.janom.co.jp/IN': deleting rrset at 'pc1.office.janom.co.jp' A
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone 'office.janom.co.jp/IN': adding an RR at 'pc1.office.janom.co.jp' A
Aug 16 09:59:04 gw1 dhcpd: Added new forward map from pc1.office.janom.co.jp to 192.168.0.100
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone '0.168.192.in-addr.arpa/IN': deleting rrset at '100.0.168.192.in-addr.arpa' PTR
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone '0.168.192.in-addr.arpa/IN': adding an RR at '100.0.168.192.in-addr.arpa' PTR
Aug 16 09:59:04 gw1 dhcpd: Added reverse map from 100.0.168.192.in-addr.arpa. to pc1.office.janom.co.jp

次に、実際に正引き・逆引きができるか確認してみましょう。

まずは正引き。

$ dig pc1.office.janom.co.jp 

; <<>> DiG 9.10.3-P4-Ubuntu <<>> pc1.office.janom.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15143
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;pc1.office.janom.co.jp.    IN  A

;; ANSWER SECTION:
pc1.office.janom.co.jp. 300 IN  A   192.168.0.100

;; AUTHORITY SECTION:
office.janom.co.jp. 3600    IN  NS  gw1.office.janom.co.jp.

;; ADDITIONAL SECTION:
gw1.office.janom.co.jp. 3600    IN  A   192.168.0.2

;; Query time: 1 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Tue Aug 16 10:08:44 JST 2016
;; MSG SIZE  rcvd: 102

次に逆引き。

$ dig -x 192.168.0.100 

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -x 192.168.0.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1929
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.0.168.192.in-addr.arpa.    IN  PTR

;; ANSWER SECTION:
100.0.168.192.in-addr.arpa. 300 IN  PTR pc1.office.janom.co.jp.

;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 3600    IN  NS  gw1.office.janom.co.jp.

;; ADDITIONAL SECTION:
gw1.office.janom.co.jp. 3600    IN  A   192.168.0.2

;; Query time: 4 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Tue Aug 16 10:08:34 JST 2016
;; MSG SIZE  rcvd: 127

このように無事に引けていればOKです。

これで例えばプリンタのウェブ管理画面に接続したい場合には、IPアドレスを直打ちするかわりに http://printer1.office.janom.co.jp/ へのアクセスで閲覧できます。 さらにDNSサフィックスが指定されいていますので、省略形の http://printer1/ でもアクセスできて非常にラクチンです♪

【設定メモ】Raspberry Pi 互換機 + Ubuntu + ISC DHCP を使ってIPアドレスの固定割当をする

文京区の新オフィスにインターネット回線が 8月13日(土)に漸く*1 開通したので、 社内ネットワークに接続する機器の管理の一環として、IPアドレスDHCPで自動的に割り当てるように設定したので、その時のメモです。

前提等

ルータの機能を使わない理由

インターネットに接続するため (PPPoE) に使っているNEC製のルータにDHCP機能がありますのでこれを利用しても良かったのですが、以下のような理由から断念しました。

  • 固定割当が20台までしか登録できない
  • 固定割当未登録機器に対するリース範囲と、登録済み機器の割当範囲を分けれない

二番目については、例えば固定割当未登録機器のリース範囲を 192.168.0.1 - 192.168.0.100 とした場合、 IPアドレス 192.168.0.110 に固定割当することが出来ない、ということです。 そうすると、割当しようとしたIPアドレスが既に他の機器で使われていて「うわぁ、まじか。。。」となってしまう可能性があります。

Raspberry Pi 互換機

中華製でラズパイと比べて値段も機能もいい感じのシングルボードコンピュータ(SBC)が手元にありましたので、今回はそれを使いました。

Orange Pi - Orange Pi Plus

その名もオレンジ・パイです!(ラズベリーじゃなくてw)

お値段39ドルでラズパイと変わらないのですが、ギガビットイーサ対応・オンボードの8GBフラッシュメモリがあるためSDカード不要・WiFiつき(これは Raspberry Pi 3 にもありますが)と、優れものです。

以前輸入した際に Ubuntu をインストールし、基本的な設定は終わらせていますので初期セットアップ手順は省略します。(といっても、Raspberry Pi とほぼ一緒ですが)

なお、以下の手順は Raspberry Pi でも同じ……というか Debian/Ubuntu なマシンならほぼ一緒だと思いますので、デバイス固有の情報は適宜読み換えてもらえればどの環境でもいけるでしょう。

設定手順

DHCP サーバのインストール

DHCP サーバの実装にはいくつか種類があるようですが、今回は ISC DHCP という実装を利用します。 APT でインストールできます。

$ sudo apt install isc-dhcp-server

設定ファイル編集

設定ファイルはお約束通り /etc/dhcp/dhcpd.conf にありますので、これを編集していきます。 セキュリティの関係上、一部省略 and/or マスクしている部分がありますが、概ねこんな感じです。

@@ -13,15 +13,15 @@
 ddns-update-style none;
 
 # option definitions common to all supported networks...
-option domain-name "example.org";
-option domain-name-servers ns1.example.org, ns2.example.org;
+option domain-name "office.janom.co.jp";
+option domain-name-servers 192.168.0.1, 8.8.4.4, 8.8.8.8;  # DNSサーバのアドレス。普通はルータのアドレスと一緒
 
 default-lease-time 600;
 max-lease-time 7200;
 
 # If this DHCP server is the official DHCP server for the local
 # network, the authoritative directive should be uncommented.
-#authoritative;
+authoritative;
 
 # Use this to send dhcp log messages to a different log file (you also
 # have to hack syslog.conf to complete the redirection).
@@ -30,6 +30,60 @@
 # No service will be given on this subnet, but declaring it helps the 
 # DHCP server to understand the network topology.
 
+subnet 192.168.0.0 netmask 255.255.255.0 {  # ネットワーク範囲を指定する
+       range 192.168.0.100 192.168.0.199;  # 未登録デバイスが接続された場合に割り当てられるIPアドレスの範囲
+       option routers 192.168.0.1;  # デフォルト・ゲートウェイ
+}
+
+# Network Devices.
+host router1 {  # ホスト名「router1」の設定
+       hardware ethernet 12:34:56:78:90:ab;  # MACアドレスを指定する
+       fixed-address 192.168.0.1;  # 割り当てたいIPアドレス
+}

(以下、同様に host 設定を記入していく)

 #subnet 10.152.187.0 netmask 255.255.255.0 {
 #}

続いて ISC DHCP サーバが有効となるインタフェースを /etc/default/isc-dhcp-server から指定します。 ここでは eth0 を指定しています。

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0"

DHCPサーバの固定IPアドレス設定

DHCPサーバ自体に対してもDHCPを使って固定IPアドレスをアサインすることも出来なくないようですが、 DHCPサーバが(設定ミス等で)うまく立ち上がらなかった場合にネットワークが繋がらなくなってしまったりといろいろと不都合があるようなので、 設定ファイルをいじってDHCPサーバ本体に固定アドレスを割り当てます。

お約束通り /etc/network/interfaces を編集しましょう。

# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.0.2
        netmask 255.255.255.0
        gateway 192.168.0.1
        dns-search office.janom.co.jp

ルータのDHCP機能の停止

ルータのDHCP機能が有効になっていると競合してしまいますので、こちらはOFFにしましょう。 ルータの説明書等を見ながら機能を停止してください。

再起動

最後にDHCPサーバのOSを再起動します。 OSごと再起動する必要はないのかもしれませんが、念の為OSごと再起動しておきます。

必要に応じてルータやネットワークに接続する機器も再起動してください。

動作確認

接続してみる

適当なデバイス(スマホ・PC)で接続してみて、設定ファイルに書かれた通りのIPアドレスが割り当てられれば成功です。 うまく行かない場合には、記入したMACアドレスが間違っていないか、DHCPサーバは正しく起動しているか、他のDHCPがネットワーク上で稼働していないかなどを確認してください。

サーバ動作ログ

サーバの動作ログは /var/log/syslog に吐き出されます。

$ sudo cat /var/log/syslog | grep dhcpd | less

などして確認できます。

リースログ

IPアドレスのリースログは /var/lib/dhcp/dhcpd.leases にあります。 含まれるのは自動割当により割り当てられたもののみで、固定割当をしたものは含まれないようです。

未登録の機器を接続した場合にはこのログに割り当てられたIPアドレスMACアドレスが書かれますので、これをみながら設定を編集しましょう。

終わりに

さて、これで固定IPアドレスの割当設定はできたわけですが、いちいちIPアドレスなんて覚えていられないので、いずれローカル向けのDNSサーバをBINDで構築しようと思います。

他にもゲスト用のWiFiとかも置きたいですね……。

*1:紆余曲折あり、物件の契約から1ヶ月半かかりました……。

スマート・コントラクトのデータ容量を劇的に改善する革新的な技術『マークル化抽象構文木』の解説講義を開催します

こんにちは。代表の日向です。

既にいくつかのSNSで告知しております通り、今週末の 2016年8月19日(金)に技術アドバイザも務めさせていただいております株式会社ブロックチェーンハブ様にて講義を行います。

今回ご紹介するのは今年になって議論され始めたばかりの非常に新しい技術となりますので、日本語は愚か英語でもまだあまり情報のないものとなっております。 また Bitcoin のみならず、Ethereum のスマート・コントラクト等にも応用可能な非常に汎用性のある技術となっておりますので、ぜひこの機会にお知りいただければと思います。

ご興味とお時間がありましたら奮ってご参加ください。

詳細およびお申し込みについては【こちらのページ】からお願いします。

開催に先立ちまして、講義内容を紹介するべく当日利用するスライドをいくつか紹介させていただきます。 なお、内容は一部変更になる可能性がございますので予めご了承ください。

f:id:mhyuga:20160813125546p:plain f:id:mhyuga:20160813125613p:plain f:id:mhyuga:20160813125620p:plain f:id:mhyuga:20160813125622p:plain f:id:mhyuga:20160813125625p:plain

ブログ、はじめました

こんにちは。 合同会社ジャノム代表の日向です。

この度、弊社の活動や、暗号通貨を中心とする技術情報を発信することを目的としてブログを開設いたしました。 みなさま、何卒温かい目で見守っていただければと思います。

今後ともよろしくお願いいたします。