電気羊の執務室

魔法を作る仕事をしています。

NASのハードドライブを交換しました

NASに異変が

会社のNASが、週末から異常にスループットが悪くなりました。
残容量がほとんどなかったため、ゴミ箱の削除などしてご機嫌を取りましたが、日曜日にとうとう、HDDが4本中1本クラッシュしました。

さっそく換装用のHDDを手配し、届いたのがついさっきです。
つつがなく交換したので、その顛末を記録しておきます。

スペック

NASの型番は、Synology RS812+です。

4年前に導入した機械で、ネットでは詳細なオンラインマニュアルが見つかりません。 販売元に電話で問い合わせて、作業手順を聞きました。

ホットスワップ

販売元が調べてくれたところでは、 RS812+はホットスワップに対応している機器なので、電源が入ったままHDDを抜き、Webの管理画面から再構成すると復旧できるとの事でした。

がちょーんとディスクを抜き、ネジで新しいディスクを付け直し、再度挿入します。

Web画面から、『ストレージマネージャ』→ ボリューム1 → 管理を選び、修復ボタンを押すと、再構成が始まりました。

Alt text

今回感じたこと

当たり前ですが、RAIDは大事です。Synology Hybrid RAIDという構成ですが、要はRAID5+αです。

壊れるまでは、RAIDの良さは知識として知っていました。 しかし、実際に壊れてみると、RAIDってありがたいものですね。

家のNASも冗長化しようか・・と思いました。
Synologyには、AmazonS3と連携する機能があるので、クラウドと併用もいいかも知れません。

メールマガジンを始めました

今日から、メールマガジンを始めます。

プログラミングは、これからの日本を救う切り札になると思います。 なぜなら、人口が減っていく日本の未来で、機械に仕事をやらせるのは、経済発展のキーファクターになるからです。

これは、僕がプログラミングを教える理由の最重要ポイントなので、
繰り返し話します。

さて、メールマガジンをやるからには、 プログラミングを覚えるとうまく行く事や、 勉強の挫折を防ぐポイント、速く書ける方法などについて、 お話しできればと思います。

たまに、聞きたい内容について、アンケートも取る予定です。 以下のフォームから、購読してください。

メールアドレス
ニックネーム

あなたのポケットに僕の言葉をお届けできるのを、楽しみにしています。

集まる集客(R)セミナーに参加しました!

こんにちは。

セミナーを受けたので、内容を思い出しがてらシェアします。

駆け出し講師の憂鬱

僕はいま、Udemyというサイトで、プログラミング講師をやっています。
https://www.udemy.com/quick-csharp/?couponCode=FB-SHARE

理由は、このような事です。

IT技術で立ち遅れた日本は、このままだと無残に衰退し、犯罪率が上がって荒廃します。

子供達に美しい国を渡すためには、退廃を食い止める必要があります。

人口が減ってゆく日本が国力を回復するには、機械を飼い慣らして仕事をさせる必要があります。 そのため、プログラマーがこれから必須なのです。

そして今、それを世に広めるためにどうするか、という事を学んでいます。

世に広めるための、ひと通りのアクションは理解できました。
しかし、パーツ同士がバラバラです。
全体としてまとまっていません。

部品たちがパチっとハマりそうなのに、いまいちハマっていない。
そんな感覚です。

それを組み立てるため、先人の門を叩くことにしました。

先人との邂逅

教えていただいたのは、長瀬葉弓先生です。

コンサルタントとして偉業を成された方です。

グループ形式だったのですが、僕が個人的に知りたいことを聞き倒しました。
皆さんのお時間をお借りした事に感謝します。

気付き

僕のプログラミング講座は、できたばかりで、まだまだ全然伝えたい事に追いついていません。 しかし、今日のセミナーの中で、見えた事や気づいた事が多くありました。

  • いま僕がアプローチしている事は、全体としては間違っていない
  • しかし、とりあえずやるのはダメ。しっかりシミュレーションする
  • メルマガは、読者がいなくてもまず書く
  • 記録に残す事が大事。記録は、その時の出来事がそっくり再現できるのが理想

さっそく今日から、メルマガを書く練習を始めたいと思います。

勉強会をおすすめしたい方は・・・

今、起業がブームになっています。 僕もそうですが、色んな方が色んなことを始めていますね。

そんな中で、長瀬先生のセミナーをおすすめしたいのは、
次のような方です。

  • 人の役に立てたい技術や知識がある方
  • 現実を直視して、足りない部分を鍛錬できる方
  • 未来の自分を見て成長できる方

長瀬先生と2ショット

長瀬先生の講座について

長瀬先生の開講される、 『集まる集客カスタマーメイクサークル構築講座』は、 残念ながら、追加開催の予定はないそうです。

しかし、無料電子書籍で、学ぶことが可能です。 こちらからダウンロードできます。 「30分で学ぶ集まる集客®」 https://www.active-note.jp/archives/6559?kns

SQLでもう一歩頑張るのが大事?

SQLの重要性

昨年から、販売管理の基幹システムをリプレースしています。
稼動状態までは来ていますが、現場からは、
『昔使えていた便利な機能がなくなった! 』 という不満も受けています。

新システムの機能拡張については、 SQL Serverのユーザー定義関数として表現すると、 カスタマイズの工数が少なく済むようにできています。

そこで、現在までに、約10画面ていど、SQLだけで書きました。 C#で書いた画面も5~6画面あります。

そこで気づいた事があります。

業務システムは、SQLでいろいろできると、そこから先が楽じゃないでしょうか。

SQLでやると楽な理由

1.移植性が高い

社内のイントラ環境のDBサーバーに、データ抽出用のSQLを書くとします。 SQL(ユーザー定義関数)で書いてしまえば、 モバイル向けに、DBをWebにレプリケーションしたとしても、
リモートDBに同じ関数をコピーすることで、ほぼ無加工で移植できます。

2.最適化されてて速い

サーバー側で最適化した実行プランで動くので、 モバイルアプリ化した時の事など考えると、端末側で計算させるより、
サーバーでやるほうがうまく行きそうです。

3.意外と表現力がある

でもSQLでやれる事に限界があるし・・・と思っていましたが、
基本的なデータ加工なら、標準SQLでできることがわかりました。

SQLのデータ加工

Grouping演算子

例えば、SQLには、Grouping演算子というものがあります。

これは、データの最後に集計行を足してくれるというものです。 ユーザー定義関数の最後に集計行をINSERT、という事もやってきましたが、 これを使いこなせれば、1つのSQLでできるので、
表現力が上がりそうです。

Pivot/Unpivot

データの縦持ち/横持ちを変換するキーワードです。

データの最適化は、使う時に縦横を変換する前提で成り立つので、 SQLだけで目的の形まで簡単に戻ると、楽ができそうです。

特に縦横変換をアプリでやろうとすると、
毎回少しは面倒なはずなので、PIVOT句で解決できれば、
工数削減効果が大きそうな気がします。

Chefのリポジトリ構成

chefの構成について

今回、DigitalOceanに仮想マシンを作り、 Angular.jsでサイトを作りたいです。 そのために、Vagrant+chefで構成管理をします。

毎度の事ですが、今回も失敗記です。

環境構築ふたたび

1年近く放っておいたので、Rubyアプリの常として、 バージョンは上がり、環境は崩れていました。

rbenvからの入れなおしになり、 net-sshがRuby2.0以降を指定するため、 ついでにRubyのバージョンも2.2.2に上げることに。

chefはchefDKに

こないだインストールした気もしますが、 chefDKをダウンロードして実行。

  • chefDKを入れた時のお約束 – .zprofileに、export PATH=/opt/chefdk/bin:$PATHを追加
  • berkshelfが見つからない – stackOverflowのフォーラムを見て解決。最終的に、berkshelfはchefDKの組み込みgemを使うことに。

knife soloはおさらば

Unable to activate knife-solo-0.5.1, because net-ssh-3.0.2 conflicts with net-ssh

chefDKの最新環境では、net-sshはv3.0.2必須。 2.9.4も、別途インストールはされている。 しかし、knife soloのどこかで、net-sshは2.7~3.0を指定されている。 3.0.2をアンインストールすると『knife-soloはnet-ssh3.0.2必須!』と怒られ。

Gemfileとかに器用な事を書いて切り抜けられる技量がないので、 この矛盾を解消できなかった。

よって、knife soloはあきらめました。

knife zeroで行きましょう

この時点で3日め。 knife zeroで環境構築。

chefリポジトリは、新しく作るの辛かったので、前回作りまくったchef-repoにシンボリックリンクを張り、vagrant-digitaloceanフォルダ-> chef-repoフォルダの構成に。

しかし、chefプロビジョンは、vagrantフォルダからchef-repoフォルダに移動しないとうまく行きません。 面倒だし、できれば1ノード1フォルダで完結するような管理がしたいです。

chefリポジトリは、githubから

ローカルのcookbookはコピーと割り切り、 github上のchef-repoフォルダを、各ノードのディレクトリに展開すると、 使い回しもでき、環境を濁らせないのでよいのでしょうか。

Packer_esx

Packerで、Windowsの仮想マシンをESX上に生成

以前の記事でも紹介しましたが、 PackerでWindowsゲストの仮想マシンを、VMWare ESXサーバ上に 直接生成するやり方を模索しています。

ここで作るのは実行中の仮想マシンで、boxファイルではありません。

いくつかの壁があるので、ひとつひとつ確認してみましょう。

1.output_directoryを指定してはいけない

ローカルでboxファイルを構築する場合には、 output_directoryを指定するのが常ですが、 ESXサーバー上でビルドする際には、output_directoryを指定すると、 vmxファイルが参照できなくなってしまいます。

そのため、output_directoryは指定しません。

2.仮想マシンのバージョンを指定する

使用中のESXサーバーは、無償バージョンです。 そのため、仮想マシンのバージョンは、すべて8を使用しています。

これをPackerでビルドする際、以下のように項目を指定します。

1
2
3
"vmx_data": {
  "virtualHW.version": "8"
}

サーバー上のファイアウォール設定

ESXサーバーが、ゲストマシンへのSSH接続を受け入れないと、 失敗してしまいます。

そこで、サーバーのファイアウォールを設定します。

詳細は、以下を参照。 VMWare公式記事

VNCの設定

Raspberry Piをchefでcookするまでのあれこれ

raspberry piで遊びたい

raspberry piが好きです。 計測器を付けて遊ぶほか、AirPlayのサーバーにするなど、 いろいろと遊びたい事があります。

遊ぶにあたって、chefで設定できるようにしておくと、 安心して壊すことができますね。

それでは、raspberry piにchefを導入するまでの ワークフローを紹介しましょう。

まずはこのページを参照

今回参考にしたページを紹介します。 ChefでRaspberry Piをセットアップする

やりたい事は違えど、大まかな流れは、上記のページの通りです。

  1. Vagrantで仮想環境を用意
  2. chefのセットアップ
  3. Cookbookの作成とテスト(ServerSpecを使用)
  4. 本物のRaspberryPiを環境構築

ワークフロー通りにやっていく中で、 いろいろと調べ事をしたので、その足あとを追ってゆきましょう。

1.Vagrantで仮想環境を用意

まず、Vagrantの環境構築について。
この記事執筆時点ではすでに終わっていますので、
まだの方は、仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成するなどを参考にしてください。

余談

Vagrantについて思うところ。
仮想環境は長いことVMWareでやってきたので、
仮想マシンを本番環境として使う場合は、
VMWareが慣れてて楽だなぁと思っています。

しかし、実機の本番環境の練習台としての仮想マシンは、
VirtualBoxでやるのがよさそうです。

メリットは、いくつもあります。

  • VirtualBoxなら無償
  • Saharaプラグインが使える
  • 仮想マシンからのBox構築が可能

最後はともかく、無償でしかもやり直しができるのは、
練習台としてはメリットが大きいと思います。

閑話休題

今回は、仮想環境の用意には、参照記事のおすすめに従い、 これを使いました。

1
2
3
$ git clone https://github.com/nickhutchinson/raspberry-devbox raspberry_pi
$ cd rasbperry_pi
$ vagrant up

2.chefのセットアップ

お約束通りにやりました。

1
2
3
$ vagrant ssh-config --host vm-raspberry_pi >> ~/.ssh/config
$ knife solo init chef-repo
$ knife solo prepare vm-raspberry_pi

ローカルマシン側のsshの設定を、ここでvagrantがやってくれるのって、 非常にありがたい事ですね。
実機の環境構築では、1行目にあたる部分を自分でごにょごにょします。

3.Cookbookの作成とテスト(ServerSpecを使用)

ここの基本の考えかたは、参照記事 の3. クックブックの作成とテストを参照して下さい。

引用:

書いたクックブックを実行する前にVagrantをサンドボックスモードにしておく。
こうすると、失敗したときに実行した部分だけやり直すこと(ロールバック)ができる。
サンドボックスモードにするためにはsaharaというVagrantのプラグインが必要なのでインストールしておく。

サンドボックスモードをオンにしてクックブックを実行したあと、本当に期待した通りに環境構築できたかどうかをServerspecを使ってテストする。 Serverspecにはいくつかテストを実行する方法があるようだけど、今回はSSHでログインしてテストを実行する形式を採った。 テストを通らなかった場合は、saharaを使ってロールバックしてやり直す。
テストが通った場合は、saharaを使って変更を確定させる(コミット)。

これをサイクルさせながら、どんどんクックブックを追加していく。以上をコマンドで表すとこんな感じ。

1
2
3
4
5
6
7
8
$ knife cookbook create ruby -o site-cookbooks
$ vi site-cookbooks/ruby/recipes/default.rb
$ vi nodes/vm-raspberry_pi.json
$ vi spec/vm-raspberry_pi/ruby_spec.rb
$ vagrant sandbox on
$ knife solo cook vm-raspberry_pi
$ rspec
$ vagrant sandbox commit

(引用終わり)

ここで書いたレシピの内容や困り事については、
別の記事で紹介します。

とにかく上記の流れが参考になりまくったので、 ここに記すことにしました。

4. 本物のRaspberryPiを環境構築

引用:

仮想環境での環境構築が完了したら、いよいよ本物のRaspberry Piにクックブックを適用する。
そのためにはnodes以下に本物用の設定を追加するだけでいい。

1
2
$ vi nodes/raspberry_pi.json
$ knife solo cook raspberry_pi

(引用終わり)

基本の流れは、上記の通りです。 本番環境を作る上でも、sshの設定など、多少の試行錯誤があったので、 別の記事で書きます。

仮想マシン構築自動化ツールのまとめ

はじめに

3月から、仮想マシン構築を自動化しようとして、 色々もがいてみました。 早いもので、もう3ヶ月も経つんですね。

当初、いろいろ疑問が多かった中で、 『情報が少ないので、とにかく触って掴もう』 というアプローチでやってきました。

ある程度わかってきたので、まとめていこうと思います。

DevOpsツールについて

仮想マシン構築の自動化など、コード化されたインフラを、 DevOpsと呼ぶようですね。

これをやるのに、よくおすすめされる構成が、 Vagrant+Chef+BerkshelfでVirtualBoxノードを作ろう! ですね。

参考資料: あとでまとめる

Packer,Vagrant,Chef,Berkshelfの違いは?

記事を読みながら、何がなんだかよく分からなかったのが、 各ツールの違いです。

ここでは、各ツールの違いをまとめてみます。 うまく伝わるかはわかりませんが・・・

Packer:無から仮想マシンファイルを作る

Packerは、OSイメージや既存の仮想マシンの『ファイル』から、 boxや仮想マシンノードの『ファイル』を作るアプリ。

  • 設定ファイル:
    • 入力ファイル(OSのISOファイル、仮想マシンのファイル)
    • 設定用jsonファイル(OS,バージョンごとに用意)
  • 実行対象:ローカルマシン、クラウドサービス
  • 出力:ファイル(vagrant用boxファイル、仮想マシンのファイル)

Vagrant:仮想マシンを実行・廃棄する

Vagrantは、仮想マシンのひな形(boxと呼ばれる)から、 実際に動く仮想マシン(ノードと呼ばれる)を作るアプリ。 実行した際に、マシンが動作を開始するのが特徴。

  • 設定ファイル:
    • boxファイル
    • Vagrantfile(各ノードの設定内容を記述)
  • 実行対象:ローカルマシン、クラウドサービス
  • 出力:
    • 実行中の仮想マシン
    • boxファイル(packageコマンドを使用したとき)

Chef:実行中のマシンに設定を行う

Chefは、実行中の仮想マシンや物理マシンに対し、 インストールや環境設定作業を自動化するアプリ。

Cookbookと呼ばれるパッケージを指定すると、 OSの差異をChefが吸収し、OSに適したコマンドで プロビジョン(環境設定や、アプリのインストールなど)してくれる。

設定対象のマシンは、仮想マシンでも物理マシンでもOKだし、 ローカルでもリモートでもOK。

  • 設定ファイル: *Chefリポジトリ(kitchenとも呼ばれるファイルセット)
    kitchen(ここでは一部のみ)
      |- cookbooks(各設定内容をアプリごと、ジャンルごとにまとめておく)
      |- nodes(設定対象のノードと、そのノードにどんな設定を行うかを記述) 
  • 実行対象:実行中のマシン
  • 出力:実行中のマシンに設定が完了した状態

chef-soloとknife-solo

ローカルの場合はchef solo、リモートの場合はknife soloの コマンドで設定を行う。

Berkshelf:ChefのCookbook管理を便利にする

Chefを使う際、Berkshelfを併用することで、 Cookbookの管理が便利になる(RubyのGemのようなもの)

  • 設定ファイル:Berksfile
  • 実行対象:Chefリポジトリ(=kitchen)
  • 出力:整理済のChefリポジトリ

まとめ

  • Packer
    • 仮想マシンの実行ファイルを作る
    • マシンの起動はインストール時のみ(電源OFFで終わる)
    • マシンを継続的に実行する事はできない
  • Vagrant
    • 仮想マシンの起動・終了などを制御する
    • 必ず仮想マシンのひな形(box)が必要
    • OSインストールから実行することはできない
  • Chef
    • マシンの設定を自動で行う
    • 仮想マシンに限らず設定可能
    • マシンが起動している事が条件
    • マシンの起動自体を行うことはできない

流れとしては、こんな感じです。

  1. Packerで仮想マシンを生成
  2. Vagrantで仮想マシンを実行
  3. Chefでツールのインストール、設定など

VMWare ESXiホストへ、Windows7マシンをPackerで作る

今回は、VMWare ESXiのホストマシンに、 Packerを使用してWindows7のゲストマシンを導入する方法を紹介します。

今回の構成

構成図

Packerを使う理由

ゲストマシンの立ち上げは、 ESXiから直接やるよりも、 ツール経由でやるほうが後々便利です。

Packerは、『Vagrantで扱えるVMのひな形(boxファイル)を作るツール』です。 最終的には、Vagrantなどでサーバーインスタンスを次々と 作る予定ですが、そのためには最初のひな形をどうにか作る必要があります。

Linuxなどは、boxファイルが多数公開されていて、 ダウンロードして使う事ができますが、Windowsはライセンスの関係で、 公開されているものがありません。自分で作るしかないわけです。

VirtualBox使いには、vagrant packageというコマンドで、 動いているインスタンスからひな形を作ってしまう手がありますが、 VMWare使いは、手で作らなくてはなりません。

ESXiホストに、ユーザーを追加する

作業用のmacで動くPackerで、ネットワーク上のVMWare ESXiにリモート接続します。 デフォルトでは、rootでSSHログインできません。 ここは真っ当に、別ユーザーを追加することにします。

以下の2点を確認します。 * 作業用WindowsのvSphereクライアントからESXiホストを参照し、『ローカルユーザーおよびグループ』タブから、ユーザーを追加します。 * 『権限』タブから、新規ユーザーに権限を付与します。ここでは、管理者権限を付与しました。

ESXiホストのSSHを有効化する

まず、VMWare ESXホストでSSH通信を有効化します。 ホストにログインし、コンソールから、以下のふたつの項目を選びます。

Troubleshooting Options -> - Enable ESXi Shell - Enabe SSH

ホストにSSHログインし、GuestIPHackを有効化する

SSHが有効になったら、作業用macから以下のコマンドでESXホストにログインします。 ssh (新規ユーザー)@ESXホストのアドレス

パスワードを入力し、ログインできたら、以下のコマンドを入力します。

esxcli system settings advanced set -o /Net/GuestIPHack -i 1

エラーなく完了したら、exitコマンドでSSHを抜けます。

Packer用のビルドファイルを作成

Packerを実行するためのファイルを作成します。 ここでは、先人の記述してくれたjsonファイルを、 ありがたく使わせていただく事にします。

git clone https://github.com/misheska/basebox-packer template/windows7ディレクトリから、 ここではwin7x86-pro.jsonを選択します。 インストーラのパスなどを実際のものに置き換えた後、以下のコマンドで内容を確認します。

packer validate vmware_win7.json

エラーが出なければ、以下のコマンドでビルドを行います。

packer build vmware_win7.json

1回失敗するごとに、OSインストール分の時間がかかるので、 小さな修正が一番つらい。 がんばりましょう。

Active_scaffoldが調子いい

ActiveScaffoldとは

Railsアプリでは、CRUD操作(登録・修正・表示・削除)を 一気に作ってくれる、Scaffoldという機能があります。 が、あまり実用的ではない、という定評で、 便利な機能にもかかわらず、それほど使われていません。

そこでActiveScaffoldです。 ActiveScaffoldでは、ごく少ない操作で、 かなりそれっぽい画面を自動生成してしまいます。

使い方

  1. gemで導入
  2. javascriptテンプレートにrequireを書く
  3. stylesheetテンプレートにrequireを書く
  4. 生成したいエンティティを記述する
  5. routesファイルにひとこと書く

1.gemで導入

Gemfileに、以下の通り記述します。 gem install active_scaffold

関係ないですが、僕は最近、もっぱらskip_bundleオプション付きでプロジェクトを作り、
後からプロジェクト内のvendor/bundle配下にgemをインストールするのが、
全体の環境を壊さなくていいなぁとお気に入りです。

2. javascriptテンプレートにrequireを書く

ファイルイメージ

app/assets/javascripts/application.js を開きます。 ファイルの末尾に、requireを記述したブロックがあるので、 以下の通り追記します。

//= require active_scaffold

コメントアウトした感じの見た目で構いません。 追加したイメージ

3. stylesheetテンプレートにrequireを書く

stylesheetテンプレートはこれ

app/assets/stylesheets/application.css を開きます。 ファイルの末尾に、requireを記述したブロックがあるので、 以下の通り追記します。

*= require active_scaffold

これも、コメントアウトした感じの見た目で構いません。

追加したイメージ

4.生成したいエンティティを記述する

エンティティを、ActiveScaffoldを使って、 モデルとコントローラとビューを一気に生成します。 例えば、以下のように記述します。

rails g active_scaffold work_kind name:string

5.routesファイルにひとこと書く

最後に、config/routesファイルに、以下のように書きます。 resources :work_kinds do as_routes end

これで、Railsアプリ上では、このように表示されるはずです。

画面表示

間違えるとどうなるか?

ちなみに、requireの記述を間違えると、
それぞれ特有の動作をします。

stylesheetの記述をミスると、白い背景に文字だけの、 シンプルな画面になります。

stylesheetの記述をミスった感じ

javascriptの記述をミスると、リンクをクリックしても動作しなくなります。 ajaxの非同期処理が帰ってこれなくなるのでしょうか。 『新しいウィンドウで開く』などすると、別窓では表示されるようです。

これは?と思った時は、記述を見なおしてくださいね。当たり前か。