電気羊の執務室

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

SQL ServerにはMergeがある

SQL ServerでInsert or Update

今回、会社のデータ処理で、
SQL Serverを使って、データが存在していれば更新、
なければ追加、という処理をする必要がありました。

例によってGoogle先生に聞くと、 『SQL Serverには、Merge文があるんだよ』というお告げを受けました。

構文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MERGE INTO test_tableA AS A
    USING test_tableB AS B
    ON
    (
       A.no = B.no
    )
    WHEN MATCHED THEN
        UPDATE SET
             name = B.name
            ,age = B.age
    WHEN NOT MATCHED THEN
        INSERT (no,name,age)
        VALUES
        (
             B.no
            ,B.name
            ,B.age
        )
;

暗記できる気はしないので、いつか同じ事をやる時は、
このエントリーを見返すと思います。

参考資料

https://lightgauge.net/database/sqlserver/2446/#MERGE1SQLOK

サーバーを作り直す時、known_hostsをメンテする

さくらのVPSを作りなおした

さくらのVPSを借りていますが、新しいプロジェクトを 作るに当たって、itamaeでサーバーをいじっています。

8月ごろに一度立てたサーバーですが、 サービスを追加して、構成も変更したかったので、 いったん壊して作りなおす事にしました。
# itamaeで試行錯誤した過程が残ってしまうのも嫌だな・・・と
# 冪等性がてきとーです。

で、SSHが失敗する

最初に立ててた時も、SSHエラーを見た記憶があります。 しかし、何で出るのか忘れてしまったので、またGoogle先生のお世話に。

sshでサーバーに接続できないエラーめも-OS再インストール後【GMO】

ああ、SSHのknown_hostsに、サーバーの情報が残ってると食い違うんでした。 known_hostsから、VPSサーバーのIPを持つ1行を削除し、うまく行きました。

同じような事で困っている人に、今日のまとめです。
サーバーを壊した時は、known_hostsをメンテする。

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でツールのインストール、設定など