Emacs Lispで解く月刊少女野崎くんED「ウラオモテ・フォーチュン」

Emacs Lispで解く月刊少女野崎くんED「ウラオモテ・フォーチュン」

今期オススメのアニメのひとつである「月刊少女野崎くん」、ED曲の「ウラオモテ・フォーチュン」には以下のフレーズが出てきます。

キライの ハンタイの ハンタイの ハンタイの ハンタイの  
そのさらにハンタイの
キモチを伝えるのって 何だか難しい

ぐぬぬ、まるでバカボンのパパ話法(「賛成のハンタイなのだ」)です。これではスキなのかキライなのかよく分かりません。

ここはひとつ、Emacs Lispでスキなのかキライなのかはっきりさせてみましょう。
Emacsのscratchバッファ(lisp-interaction-modeなバッファならどれでもOKです)で以下を実行してみます。

(setq キライの nil)

(defun ハンタイの(p) (not p))
(defun そのさらにハンタイの(p) (not p))
(defun キモチを伝えるのって(p) (if p 'スキ 'キライ))
(defun 何だか難しい(p) p)

(何だか難しい
 (キモチを伝えるのって
  (そのさらにハンタイの
   (ハンタイの
    (ハンタイの
     (ハンタイの
      (ハンタイの キライの)))))))
スキ

無事に「スキ」というお返事(?)が得られました。

が、曲のラストでさらに苛烈なフレーズが出てきます。

キライの 
ハンタイの ハンタイの ハンタイの ハンタイの ハンタイの ハンタイの 
ハンタイは?

これはいけません。スキなのかキライなのか考えているうちに曲が終わってしまいます。これもEmacs Lispで解いてみましょう。

(setq キライの nil)

(defun ハンタイの(p) (not p))
(defun ハンタイは?(p) (if (not p) 'スキ 'キライ))

(ハンタイは?
 (ハンタイの
  (ハンタイの
   (ハンタイの
    (ハンタイの
     (ハンタイの
      (ハンタイの キライの)))))))
スキ

こちらも無事に「スキ」というお返事が得られました。

まとめ

月刊少女野崎くんED曲の「ウラオモテ・フォーチュン」をEmacs Lispで解いてみました。『(キライの (ハンタイの (ハンタイの ...)))』のように、歌詞の並び通りにしたかったのですが、実際は単語の順番をひっくり返しての処理になり、日本語は後置演算子なのか……と変なことに気がついてしまいました。

Fedora20をインストールしてみた

Fedora20をインストールしてみた

Fedora20の環境を用意する必要があったので、インストール後の設定手順をまとめてみました。

sshログインのみで使用する形態を想定しているため、GUIの設定は行わず、インストール後に最低限の設定をするだけの手順になっています。

インストールCD-ROMの入手

今回は以下のURLからネットワークインストール用のCD-ROMをダウンロードしました。インストール作業中に出てくる「ベース環境」の画面で「最小限のインストール」を選択すると、(CentOSでいうところの)minimalインストールになるようです。

インストール後の作業

不要なサービスの停止

必要に応じて不要なサービスを停止します。CentOS環境のようなchkconfigかと思っていたのですが、initデーモンがsystemdに置き換えられたため、コマンド自体が変わっていました。

systemdではsystemctlコマンドを使用しており、以下はchkconfigとのコマンド対応表です。

サービスの
一覧表示
CentOSの場合chkconfig --list
Fedora20の場合systemctl list-unit-files
現在有効に
なっている
サービスの
一覧表示
CentOSの場合chkconfig --list | grep 3:on
Fedora20の場合systemctl list-unit-files | grep enabled
サービスの
有効化
CentOSの場合chkconfig sshd on
Fedora20の場合systemctl enable sshd.service
サービスの
無効化
CentOSの場合chkconfig sshd off
Fedora20の場合systemctl disable sshd.service

ネットワークの設定

ネットワークまわりの設定はこれまでの方法(CentOS等の設定方法)と変わりないようです。

# diff -u /etc/sysconfig/network.orig /etc/sysconfig/network
--- /etc/sysconfig/network.orig 2014-06-26 16:56:00.223810936 +0900
+++ /etc/sysconfig/network      2014-06-26 17:02:09.848893449 +0900
@@ -1 +1,4 @@
 # Created by anaconda
+
+NETWORKING="yes"
+GATEWAY="192.168.0.1"

ただし、NICのデバイス名がeth0等ではなく、p2p1といった名前になっています。

# diff -u /etc/sysconfig/network-scripts/ifcfg-p2p1.orig /etc/sysconfig/network-scripts/ifcfg-p2p1
--- /etc/sysconfig/network-scripts/ifcfg-p2p1.orig      2014-06-26 16:38:20.626798779 +0900
+++ /etc/sysconfig/network-scripts/ifcfg-p2p1   2014-06-26 16:54:57.349810215 +0900
@@ -1,5 +1,7 @@
 TYPE="Ethernet"
-BOOTPROTO="dhcp"
+BOOTPROTO="none"
+IPADDR0="192.168.0.225"
+PREFIX0="24"
 DEFROUTE="yes"
 IPV4_FAILURE_FATAL="no"
 IPV6INIT="yes"

ホスト名の設定

ホスト名は/etc/hostnameに記載します。CentOS等では/etc/sysconfig/networkにHOSTNAME="..."な形式で設定していたのですが、これもFedora20では設定方法がかわったのでしょうか?(まだ調査しきれていないです...)

# cat vmfedora20 > /etc/hostname

SELinuxの無効化

SELinuxは無効化しておきます(ごめんなさい...)。

# diff -u /etc/selinux/config.orig /etc/selinux/config
--- /etc/selinux/config.orig    2014-06-26 17:04:15.353965308 +0900
+++ /etc/selinux/config 2014-06-26 17:04:42.989963918 +0900
@@ -4,7 +4,7 @@
 #     enforcing - SELinux security policy is enforced.
 #     permissive - SELinux prints warnings instead of enforcing.
 #     disabled - No SELinux policy is loaded.
-SELINUX=enforcing
+SELINUX=disabled
 # SELINUXTYPE= can take one of these three values:
 #     targeted - Targeted processes are protected,
 #     minimum - Modification of targeted policy. Only selected processes are protected.

起動時のログをコンソールに出力させる(grub.cfgの設定)

OS起動時のグラフィカルな起動画面もよいのですが、起動時のログがコンソールに出力されないと不安になるので、ログが出力されるよう設定します。

以下のdiffではちょっと分かりにくいですが、"rhgb quiet"というオプションを除去しているだけです。

# diff -u /boot/grub2/grub.cfg.orig /boot/grub2/grub.cfg
--- /boot/grub2/grub.cfg.orig   2014-06-26 16:59:24.535293206 +0900
+++ /boot/grub2/grub.cfg        2014-06-26 17:00:01.614295112 +0900
@@ -72,7 +72,7 @@
        else
          search --no-floppy --fs-uuid --set=root 6b176d94-7c9a-4ff7-a007-51d0cd40ccaa
        fi
-       linux   /boot/vmlinuz-3.14.8-200.fc20.x86_64 root=UUID=6b176d94-7c9a-4ff7-a007-51d0cd40ccaa ro vconsole.font=latarcyrheb-sun16  rhgb quiet LANG=ja_JP.UTF-8
+       linux   /boot/vmlinuz-3.14.8-200.fc20.x86_64 root=UUID=6b176d94-7c9a-4ff7-a007-51d0cd40ccaa ro vconsole.font=latarcyrheb-sun16  LANG=ja_JP.UTF-8
        initrd /boot/initramfs-3.14.8-200.fc20.x86_64.img
 }
 menuentry 'Fedora, with Linux 0-rescue-78fd1bcdf2504b058f547faf585019df' --class fedora --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-0-rescue-78fd1bcdf2504b058f547faf585019df-advanced-6b176d94-7c9a-4ff7-a007-51d0cd40ccaa' {

yum update

ここまでで一旦OSを再起動し、IPアドレスが付与されているか等の確認を行ってからyum updateを実行します。

# yum -y update

sudo設定について

Fedora20ではminimalインストールでもsudoがインストールされています。また、wheelグループがsudoできるよう設定されており、visudoで改めて設定する必要はありませんでした。

ユーザの追加

一般ユーザを追加します。sudoできるようにしたいので、セカンダリグループとしてwheelを指定します。

# useradd -g users -G wheel -m -s /bin/bash fpig
# passwd fpig

これでインストール後の設定は一通り完了です。後はsshでログインし、パッケージの追加等で生活環境を整えていきます。

まとめ

Fedora20のインストール後の設定手順をまとめてみました。initデーモンがsystemdに置き換えられた点がCentOSとの大きな違いでした。サービスの有効・無効を切り替えるコマンドもchkconfigからsystemctlになっており、当面はコマンドを調べながらの利用になりそうです。

第1回Webスクレイピング勉強会@東京に参加してきました

第1回Webスクレイピング勉強会@東京に参加してきました

第1回Webスクレイピング勉強会@東京に参加してきました。

シェルスクリプトでスクフェス(スクレイピングフェスティバル)」というタイトルで、シェルスクリプトによるWebスクレイピングの方法について発表してきました。

発表スライドのURLは以下になります。

第2回Webスクレイピング勉強会@東京の開催も決定しており、次回も楽しみです。

補足事項

発表スライド内のスクレイピング手順例は、とある新聞社のデータに対するものです。

勉強会での発表時は今現在のスクレイピング手順を説明していましたが、Web上に公開している発表スライドについては、古いデータ(HTML内のフォーマットが少し異なっている)に対するスクレイピング手順に差し替えています。

Security Casual Talks 2014#2(すみだセキュリティ勉強会)に参加してきました

Security Casual Talks 2014#2(すみだセキュリティ勉強会)に参加してきました

Security Casual Talks 2014#2(すみだセキュリティ勉強会)に参加してきました。

勉強会参加者のツイートは、ハッシュタグ#sumida_secにて参照できます。

以下は勉強会のメモです。私が間違って理解したままメモを書いている箇所もあるかと思いますので、その点にご留意ください。 また、カッコ書きした項目は私の感想・意見となっています。

無線LANデンパゆんゆん観察

CRYPT+YOU,UNDERSTAND TODAY!

  • 発表者は@inaz2さん
  • 資料は以下のURLで公開されています

  • 代表的な現代暗号(RSA,AES,RC4あたり)について、アルゴリズムや使い方も交えた簡単な紹介

  • 換字式暗号
    • 文字、ブロック単位でずらす暗号で、古典暗号のひとつ
      • 「いくつずらしたか」が暗号鍵になる
    • (古典暗号、現代暗号という区分が存在するみたいです)
    • 換字式暗号の例としてはシーザー暗号がある
    • NSAの採用担当者のツイートを例にした換字式暗号の解読デモ
  • xorスクランブルの復元
    • (写真フイルムのネガポジ変換みたいなイメージ、反転→反転で元のデータに戻る)
  • RC4(Rivest Cipher 4)
    • 共通鍵暗号方式のうち、ストリーム暗号と呼ばれるもの
    • 鍵から特定のアルゴリズムに従って擬似乱数を作り、1byteずつのXORで暗号化・復号化する
    • RC4のバイアス問題
      • RC4が生成する擬似乱数列はあまりよろしくなく、2byte目が「0」になる確率はほかの値の2倍になっている
      • (これは実際に自分の手で試してみたい)
  • AES(Advanced Encryption Standard)
    • 共通鍵暗号方式のうち、ブロック暗号と呼ばれるもの
    • 入力は128bit固定で、鍵長は126,192,256bitから選択する
    • 128bitじゃない平分の時は、128bitのブロック毎に処理する。
      • 128bitの倍数にならない場合、不足分はパディングする
      • このブロックの処理方法を「暗号利用モード」と呼ぶ
      • 暗号利用モードのひとつにECB(Electronic Codebook)モードがある
        • 常に同じ暗号化結果が得られる→同じ平分のブロックが同じ結果になる、という欠点がある
        • AESに限らず、ブロック暗号でECBは利用せず、CBC(Cipher Block Chaining)等の他のモードを使う方がよい
          • CBCモード
            • 一つ前の暗号分を事前にXORで混ぜる
            • 最初のブロックはランダムな初期化ベクトル(IV)を混ぜる
  • RSA
$ openssl genrsa 192 | openssl rsa -modulus
...
Modulus=AAAA
$ msieve -e -v AAA
  • 実際に鍵長を指定するときは、2048bitよりも大きい長さを用いるほうがよい
  • RSAによる暗号化・復号化は処理(計算)が重いので、主に鍵共有、デジタル署名に使われる(「ハイブリッド暗号方式」と呼ばれる)

  • DH(Diffee-Hellman key exchange)鍵交換

    • RSAでAESの共有鍵を共有→データ通信という場面で、誰かが通信データ(AESで暗号化されたデータ)を全部集めており、かつRSA秘密鍵が盗まれてしまったら?
      • 鍵共有時のデータが復号化できるため、共通鍵がバレる→これまでのデータが全て復号化されてしまう可能性がある
    • DH鍵交換を用いると、共有鍵のデータを送受信せずとも鍵を共有できる
      • (なので、RSA秘密鍵が盗まれたとしても、送受信されていない共有鍵はバレない→データの復号化は不可能、という理解でよいのかな?)
    • DH鍵交換じたいは正確に言うと暗号ではなく、鍵共有プロトコルと呼ばれるもののひとつ
    • 特にセッション毎に鍵を換える場合DHE(Ephemeral)と呼ぶ。また、この鍵管理の概念を"PERFECT FORWARD SECURECY"と呼ぶ。
  • TSL/SSL暗号化スイートの読み方

    • TSL/SSLで使用する暗号の組み合わせを「暗号化スイート」と呼ぶ
    • 例として暗号化スイートが"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"の場合、以下の意味になる
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
鍵共有                 → ECDHE
通信相手の認証         → RSA
データそのものの暗号化 → AES_128_CBC
メッセージの改竄見地   → SHA1

Metasploitでペネトレーションテスト

まとめ

Security Casual Talks 2014#2(すみだセキュリティ勉強会)のメモをまとめてみました。正直、スライドが公開されているのでメモをまとめる必要性は低いと思っていました。しかし、自分の理解をメモにまとめるのだと考えると、スライドを見返したりする必要があり、なかなか勉強になります。

暗号の話は学生時代に習った内容の復習的なところが多いものの、すっかり忘れていたりする項目もありました。今回の勉強会を元に知識をキャッチアップできればと思います。

BaaS(Backend as a Service)勉強会に参加してきました

BaaS(Backend as a Service)勉強会に参加してきました

BaaS(Backend as a Service)勉強会に参加してきました。

勉強会の参加者のツイート内容は#BaaS (Backend as a Service) 勉強会のつぶやきログにてまとめられています。

以下のメモについては私のメモをまとめただけなので、内容に間違いがある可能性にご留意ください。

そもそもBaaSとは?(予習)

初めて聞くキーワードに関する勉強会の場合、予習しておかないとメモをまとめるのに苦労するため、あらかじめBaaSについて簡単に調べてみました。

BaaSとは

アピアリーズさんのBaaSとはの解説を引用すると、「モバイルアプリサービスの運用に必要な汎用的なサーバ機能を提供するクラウドサービスの一形態です。」とのこと。

  • モバイルアプリの開発はデバイス側(フロント側)、サーバサイド側、サーバの構築がセットになっている。
  • デバイス側で完結するアプリは殆ど例を見なくなっている。
  • モバイルアプリのサーバ構築では、以下の2点に頭を悩ませることになる。
    • スケーラビリティ
    • アイドルコスト(遊休コスト)

スケーラビリティとアイドルコスト

  • 自前でのハードウェア確保の場合
    • スケールアップの度にサービス停止が発生する。
    • 場合によっては新しいサーバへデータを移行する必要がある。
  • スケールアップの面倒がないように、始めから高性能なサーバを用意すると、今度はサーバが遊んでいる(アイドルコストが大きい)状態になってしまう。
  • スケールアウトの場合、入念な設計と高度なサーバ管理技術が必要であり、実施は容易ではない。

そういえば、WEB+DB PRESSのVol.78の特集記事「DMM.com開発ノウハウ大公開」でもDMM.comさんのサーバ機器の変遷(サーバラックの追加・増設やデータセンターの移行)が解説されていました。

これらの問題への解決方法としてクラウドサービスがあり、その一つとしてBaaSがある、という話のようです。

○aaS

また、BaaS以外にも○aaSと名前のつくサービスがあり、以下のような分類となっています。

図で表現すると、利用者側から見た○aaSの分類は以下のようになります。

f:id:furandon_pig:20140604213403p:plain

これらを踏まえてBaaS勉強会に参加してみました。

HTML5 Japan Cupについて

  • 発表者は白石俊平(html5j管理人)さん。
  • 発表スライドは以下のURLで公開されています。
  • html5jについて
    • 「日本が、世界のWebシーンをリードする存在になる。」を目標に掲げている。
    • わりと規模が大きくなってきた。
    • html5jのサブコミュニティ→14個くらいある。
  • 現在開催中のHTML5 Japan Cup 2014のお話。
    • Webデザイナー/Webエンジニア向けの、クリエイティブコンテスト。
    • HTML5 Japan Cup 2014のすごいところ。
      • 賞金すごい
      • 賞(と提供企業→42団体)すごい
      • 会社が開発者にコンタクトを取りたがっている→お仕事につながるかも、とのこと
    • 盛り上がる(希望)
    • 6/30まで作品製作期間、この間に作品をどんどん投稿して欲しいとのこと

HTML5開発者にとってのBaaS活用のメリット

  • 発表者は安藤幸央さん
    • そもそもBaaSとはどのようなものか?
    • サーバサイド開発用の言語が苦手な方でも、BaaSならサーバ機能を使った アプリを作れる!
  • 発表スライドは以下のURLで公開されています
  • BaaSの中にはサービスの中にはMBaaSに特化したものもある,
  • クラウドサービスを実際の天候に見立てた場合、晴れだけでなく、雨の日もある。これを避ける「傘」がBaaSであると考えている
  • 例えばfacebookのようなサービスをつくろうと考えた場合
    • フロントエンドだけでなく、サーバも作り込む必要がある(フロント-サーバの連系)
      • フロントは自分たちで作成し、バックエンドは既存のものを組み合わせて使おう、という考え
  • サービスを作る際に必要な機能
    • 認証、データの保存・管理、プッシュ・メール通知、アクセス解析SNS連系、課金、etc...
    • 基本的には定番の機能で、その都度(定番の機能を)作り直す形になる
      • バグ回避の観点からも、既存の実装済み機能を使いまわす方がよい
  • facebookとParse
    • 最近のBaaS関連のニュースで大きかったトピック
    • facebookが"Parse"というBaaSの会社を約84億円で買収した
    • 無料+使いやすくしたために、買収後の利用者が10倍になった
  • BaaS活用の観点
    • スピード、(人的)リソース、コスト、の3つが重要
    • スマホアプリ開発時の割合
      • 開発する前に設計
      • 開発→サーバ、クライアントの開発割合は50%/50%
      • BaaSを使うとクライアント側の開発に集中できる
  • BaaSの利用が向く開発
    • 開発エンジニアが少ない場合
    • バックエンドエンジニアのリソースが割けない場合
    • 一人で開発する場合
  • BaaSの利用が向かない場合
    • 開発メンバが多い場合orスキルの高いメンバが多い場合はBaaS不要
    • バックエンドエンジニアのリソースが確保できる場合
    • 一般的な機能の組み合わせでできるサービスを構築する場合
      • (BaaSを使うまでもない、という話?)
  • Instagramの開発エピソード(BaaSが無かった頃のサービス開発エピソード)
    • Instagramはクライアントサイド畑のエンジニアが2人で開発したサービス
    • そのため、サーバ側は手さぐりで作っていた
    • 最初の日に25000人が登録、一気に大量に使われるようになった
      • favicon.icoをサーバに置かなかったことで、「faviconが無い」というログで溢れかえってしまった
      • こういう失敗が無いようにBaaSを活用すればよいと考えている
  • 最適なBaaSを選択
    • BaaSベンダを選ぶ際の基準に関する話
    • (発表者のスライド(38枚目)を見てもらった方が良いかも...)
  • BaaSのデメリット
    • セキュリティ→ベンダが対応してくれる
    • ベンダロックイン→二つのサービスにまたがって動作させる、OSSのBaaSを活用
    • ダウンタイム→あきらめと、落ちる前提でサービスを企画する
    • テスト切り分け
    • 価格設定
    • 機能が足りない

現役BaaS開発者パネルディスカッション

  • モデレータは冨田慎一(株式会社マッシュマトリックス)さん
  • BaaS開発者として以下の方々が登壇されていました(敬称略)
    • 荒川義弘(株式会社アピアリーズ)さん
    • 石塚進(Kii株式会社)さん
    • 野田雄也(ニフティ株式会社)さん

各社のBaaSの特徴紹介の後、モデレータの方から出されたテーマを元にBaaS開発者の方が話すという内容でした。その後、参加者からの質疑応答タイムとなっていました。

モデレータの方から出されたテーマを元にBaaS開発者の方が話した内容

  • (テーマその1.)日本のBaaS市場、これから伸びてゆく?盛り上がってゆく?そして、ぶっちゃけ儲かっている?

    • アピアリーズさん
      • IIJさんと提携してからお問い合わせをいただくようになったので、勝手に盛り上がっていると考えている。
      • まだ儲かっているとこまでは行っていない。
    • Kii株式会社さん
      • 日本で盛り上がっているかと言われるとまだまだ
      • ただ、隠れて興味を持っている人・会社は多いようで、しずかに注目されていると思う
      • 儲けはまだまだだが、これからだぞというかんじ
    • ニフティ株式会社さん
      • 儲けはまだまだ
      • イベントに出典して問い合わせをいただいているので、企画で盛り上がってきていると思う。
      • 具体的なお問い合わせも多くなっており、(BaaSの盛り上がりは)これからだと思っている
  • (テーマその2.)海外のBaaSベンダーは40社以上あり乱立している。大手の会社もBaaSやろうとしており、海外勢をどう考えている?海外と自分たちのBaaSベンダの違いは何であると考えているか?

    • アピアリーズさん
      • 海外/国内の違い→日本語対応、サポート。
      • 日本国内でワンストップになるのが強みだと考えている。
    • Kii株式会社さん
      • モバイルでもローカルに特化するのも意味があると考えている。
      • マルチサイト対応しているので、日本で作って中国に持っていけるのは自分たちの強みだと考えている。
    • ニフティ株式会社さん
      • 一番大きいのはサポートが日本であること。
      • 企業で使おうと思うと早い時間で日本語でレスポンスがあるのはかなりのメリットと考える。
      • (データセンタが日本にあるので)レイテンシが低いのもポイント
        • が、海外からのレイテンシが大きくなるという逆の見方もあるとのこと
  • (テーマその3.)HTML5jカップでBaaSのからみで→MBaaSでモバイル、ネイティブアプリ/Webアプリという文脈でモバイルに限らずWebアプリを考えたときにBaaS利用はありえる?BaaS利用でHTML5はこれからどうなる?

    • アピアリーズさん
      • WebアプリでBaaSは十分にアリだと考えている。
      • アプリKeyが無くてもOKにしている、WebアプリとBaaSは親和性が高いと考えている。
    • Kii株式会社さん
      • アリだと思う。元々BaaSに'M'が付くのはMobile(の開発)が特殊だったから
      • Ruby on RailsとかはBaaSで置き換えてもよいのではと考えている。
      • ネイティブ/Webアプリの文脈→前者はbaaSある。
      • WebアプリはBaaSが取りに行ってないし、やろうという人もいない。我々としても後者にチャレンジしたいと考えている。
    • ニフティ株式会社さん
      • JavaScript SDKでキー書き出す。
      • セキュリティはsignatureチェック、機能制限をかけようという考えている。
      • PhoneGap→ブラウザオンリーでアプリが作成できるという開発環境。ライトなアプリはこれで十分。
  • (テーマその4.)今回の参加者からアンケートを取ったらサーバ系の人が多い。インフラ/DB/ミドルの構成教えて

    • アピアリーズさん
      • 概ねJavaで作っている。場合によってPHP,JavaScript
      • 基盤はIIJさんのGioクラウドを使わせていただいている。
      • DBまわりはメインでMongoDB。
    • Kii株式会社さん
      • 基本的にインフラはAWS、中国だけ別。
      • メインはJavaPython,NodeJS、ストレージは普通のRDBだったりMongoDBだったり。
      • ロックインされたくないので差し替え可能なように作っている。
    • ニフティ株式会社さん
      • IaaSはニフティクラウド
      • 開発言語はかなりの部分がJava
      • ミドルDBはMongoDB。
      • 他社様の構成も弊社と似ているのではと考えている。
  • (テーマその5.)言ってみればBaaSってサーバエンジニアをいらなくする技術なのでは?そう考えた時にサーバエンジニアのキャリアパスは?

    • アピアリーズさん
      • BaaSが出てきてサーバエンジニアがいらなくなることは無いと思う。
      • ラッキングやスイッチング部分では不要。構成を考える部分では必要。
      • BaaSでも通信、トランザクション、想定される負荷の検討しだいでは(レイヤが変わってくるけど)必要だと思う。
    • Kii株式会社さん
      • 今後はバックエンドとフロントエンドエンジニアは分かれてゆくと思っている。
      • AWSで同じ話が出ている。
      • オンプレミスデプロイや他サーバとの連系を考えるとサーバエンジニアはこれからも必要。
      • シビアなビジネスロジックやパフォーマンスが要求されるようなコストが厳しい場面ではサーバエンジニアが必要だと思う。
    • ニフティ株式会社さん
      • なくならないと思う。
      • BaaSを選ぶのはフロントエンドの人だけでなく、backendの人が逆にBaaSを選択してあげても良いと思う。
      • フロント側の知識を得ればフルスタックエンジニアに一歩近づく。サーバの知識は無駄にならない。
      • ゲーム系の顧客では(パフォーマンスの観点から)BaaS使わない顧客も多い。

質疑応答

  • Q1.BaaSを使ってmobile appを作ることを考えたとき、どういうアプリがBaaSに向いていると思いますか?

    • アピアリーズさん
      • 弊社のBaaSではキャンペーンアプリが多いという歴史があり、短期間、低コストであった。
      • ヘビーなアクセスがあるようなゲームは自前のインフラとか考慮したりする必要があるので向いてないと思う。
    • Kii株式会社さん
      • 我々が色々な企業さんと話すと、いろいろなジャンルに向いていると思う。
      • BaaSはテクニカルじゃない部分がある。
      • アプリを複数持つとバックエンドを共通化したくなる。
      • そのため、アプリではなく業務として共通化したいのでは。
    • ニフティ株式会社さん
      • 私もなんでもできると思っている。
      • IaaSと同じでun-controllableなものをどうするかという点ではBaaSも同じ。
      • un-controllableな箇所を許容できるならもつ、そうでないなら持たない。
  • Q2.将来どこで他社と差別化(機能、料金とか)を図ろうと考えていますか?

    • Kii株式会社さん
      • 弊社はマルチサイト、海外展開が差別科要因だと思っている。
      • 機能で差別化は難しい。使ってもらわないと差別化にならないから。
      • 開発者の不満感に反応して(機能が)進化してゆくと思う。
      • どのBaaSを選ぶかはぶっちゃけ好みだと思う。使って行くことで自然にノウハウがたまると思う
    • アピアリーズさん
      • 正直BaaSは汎用的な機能を安価に使えるように、が出所なので差別化難しいと考える。
      • IIJのお客様から業務系アプリのお話をいただくことが多い。
      • 今後の展開は汎用機能突き進む側とエンタープライズ向け特価の2つを進めると思う。
      • エンタープライズ向けが差別かの点だと考えている
    • ニフティ株式会社さん
      • 差別化難しいよね。
      • (弊社の場合)IaaSから持っているのは強みだと思う。
      • スマホアプリのノウハウを持っている会社との連合軍で進められるのが強みだと考えている。
  • Q3.(Kii株式会社さんはオンプレを提供しているが)なぜオンプレしようと思ったのですか?また、他の会社はオンプレやる予定はありますか?

    • アピアリーズさん
      • オンプレはOEMで提供を検討している会社が数社ある。
    • Kii株式会社さん
      • オンプレに踏み切った理由→エンプラ向けの需要があるから。
      • 米国のBaaS業者もエンプラに行っている。
      • 既にあるエンプラ(MEEP)を喰いに行っている。
    • ニフティ株式会社さん
      • オンプレの話は問い合わせが多々ある。エンプラ系で多い。
      • が、現状はできていない。検討は引き続き行っており、うまい方法があるか考えている。

飛び入りLT

質疑応答の後、自作BaaSサービスを作成された方の飛び入りLTがありました。福岡からの参加(!)とのことでした。

  • 発表者は@nobkzさん
  • Milkcocoaという自作BaaSサービスの紹介
    • エンドユーザがWebアプリを作れないか!という観点で作成した
  • あわせてflowerというグラフィカル言語の紹介
    • Raspberry Piの上でも稼働するようです

まとめ

BaaS勉強会のメモをまとめてみました。今回は予習をしていったので楽にメモをまとめられると考えていたのですが、やはり四苦八苦してしまいました。メモを取りながら話のつながりをリアルタイムにまとめあげるという要領のよさが必要そうです...。

第1回SoftLayer勉強会に参加してきました

第1回SoftLayer勉強会に参加してきました

第1回SoftLayer勉強会が開催されたので参加してきました。

勉強会の告知ページの写真がラウドパークを彷彿とさせる感じだったので、Tシャツにジーンズという風貌で参加したところ、ほとんどの参加者が背広!まるで衣替えの日に一人だけ冬服で登校した中学生のような気分になってしまいました...(クラウド系の勉強会は背広の人が多い傾向があるようです)。

以下は勉強会のメモですが、クラウドまわりの知識に疎いので私の理解に間違いがある可能性にご留意ください。

SoftLayer Introduction

  • 発表者は@urasakoさん
    • 今回の勉強会の企画を行った方
  • (まずそもそも)クラウドってなに?

  • SoftLayerについて

    • SoftLayerはIaaS(Cloud Infrastructure as a Service)を提供する
    • 米国、アジア、ヨーロッパ合わせて13のデータセンタがある
    • SoftLayerの利用形態
      • server
      • storage
        • Object Storage
          • OpenStack swiftベースのオブジェクトストレージを持っている
        • SAN(Storage Area Network)
        • NAS(Network Attached Storage)
        • CDN(Contents Delivery Network)
        • QuantaStor
    • SoftLayerのWebポータルサイト上で世界中のリージョンが見える
    • CDN単独の提供も可能
    • Automation & API
      • Auto-scaling機構はないけれどAPIで操作できる
  • SoftLayerに関する日本語の資料について

  • SoftLayerユーザ会について

    • 日本SoftLayerユーザ会(JSLUG)が発足!
    • 今後のSoftLayer関連の勉強会、イベント
      • SoftLayer勉強会 in Hokkkaido(2014/06/12)
      • SoftLayer Night Hands-on
        • 2014/06/20
        • 2014/06/24
        • 2014/07/01(予定)
        • 2014/08/01(予定)
      • JTF(06/22)で'Hands-on
      • 第2回SoftLayer勉強会(2014/07/25)

Email Delivery on Email

  • 発表者は@nakansukeさん
  • SoftLayerとSendGridの話
  • SendGridとは

    • SoftLayerとSendGridの関係
      • SendGridはSoftLayerで動いている
      • "Built on SOftLayer,"
    • 2011年6月にSoftLayerとSendGridはパートナーに
    • SendGridのVP ofProduct&MarketingがもとSoftLayer
    • Email Infurastracture as a Service(仮)
    • ヘッダを見るとSendGridから来ていることが分かる
    • 発表者はSendGridに関わるようになってから、届くメールヘッダを見る癖がついたとのこと
    • SoftLayerからメールを送るときは実質SendGrid一択!
      • 通数で料金が決まる
  • メールについて改めて復習

    • 日本語ではメールに依らないメッセージサービスが多いため、メールはオワコンと考える人が多いようだ
    • また、スパムのイメージも強い?
    • しかし、海外ではコミュニケーションツールの一つとして活用されている
      • 加えて、HTMLメールが良く利用される
        • 日本国内ではテキストメールがメイン
  • メールの到達性について

    • 約20%のメールは届かない
      • ISPのスパム対策で正常な配信が困難になる
      • メールサーバの設定だけでなく、「到達性を高める」取り組みも必要
      • 時にはインフラ面での対応も必要になる
        • 社内LANから(スパムの踏み台等で)外部に変なメールを出すのを事前に阻止する等
        • スパム送信PCを放置したままにすると、ISPブラックリスト入り→メールの正常な配信が困難という状況になる
  • 構造計画研究所について

SoftLayer x Bit-isle = ? Bit-isleが提供するハイブリッドクラウドソリューション

  • 発表者は成迫剛志さん

  • ビットアイル総合研究所

  • OpenStackに強く(ノウハウがある、という意味で)、所内の一定数の人にはOpenStackの研修を受けてもらっているとのこと

  • SoftLayerの色

    • SoftLayerのデータセンターではラックの配線をキレイに色分けしているという話
    • 緑色は管理ネットワーク(1本)
    • 青色はプライベートネットワーク(2本)
    • 赤はパブリックネットワーク(2本)
  • 5本×3種類のネットワーク構成になっている
  • ラックは最初にきっちり配置し、後から追加・変更しないため、配線がキレイに揃っている

  • SoftLayerのプライベートネットワーク活用例

    • ビットアイルのデータセンターとSoftLayer間のプライベートネットワークの活用例
    • ビットアイルデータセンター側にDBやioDriveなどの高速IOサーバーを用意し、SoftLayerとはBI Direct Accessで接続することでIOのレイテンシ低減

    • インターネットを介さない社内LAN/WANとの直接接続

      • WANのプライベートネットワークからビットアイルのデータセンターに接続し、そこからSoftLayerのプライベートネットワークに接続するような構成
      • セキュリティの観点から「インターネットは経由したくない」というケースに対応
      • 各拠点システムDBを集約してBI/データウェアハウスを構築
        • こちらもWANのプライベートネットワーク→ビットアイルのデータセンター→SoftLayerという構成
        • DBのリモートレプリケーション先をビットアイルのデータセンターにする
      • x86サーバとのハイブリッド構成
    • SoftLayerが提供するインターネットを介さないプライベートネットワークを活用する話
      • 国際回線費用の大幅な削減になるとのこと

LT:今さらでも聞きたいSoftLayer network〜VLANとVPNを何とかしたい〜

  • 発表者は新島智之さん
  • 利用者の観点からのSoftLayerネットワーク構成に関する話
  • SoftLayer上に最初のサーバを作成した段階で、パブリック/プライベートVLANが作成される
    • IPは利用者側では付けられない
    • パブリックVLANには119.x.45.74/29のサブネットが割り当てられる
    • プライベートVLANには10.x.158.2/26のサブネットが割り当てられる
  • サーバの数が増えてゆくと、自動的にサブネットが追加される
  • Portable IPを使うと、VLANで使えるサブネットを追加できる
    • 例えば、119.x.63.2/29(パブリックVLAN)、10.x.172.2/26(プライベートVLAN)のようなサブネットを追加できる
    • 追加したサブネットはAliasで設定する仕組みのため、別のサーバに移動できる(IPアドレスの割り当てを動的に変更できる)
  • VLAN間のルーティング
    • VLAN spanningという機能をONにすることで、VLAN間のルーティングが行えるようになる
    • 異なるデータセンターのVLAN間もルーティング可能
  • 複数VLANとの通信
    • Trank portを利用することで、複数のVLANと接続できる
    • 最初のVLANはnative VLANとして扱われ、追加したVLANはtag VLANとして扱われる

コマンドラインで始めるSoftLayer

  • 発表者は@lyumeiさん
  • RESTでSoftLayerを操作する話
  • curlでのREST API呼び出し例
    • SL_USERNAME,SL_API_KEYはあらかじめ環境変数として値を設定しておく
$ curl "https://${SL_USERNAME}:${SL_API_KEY}@api.softlayer.com/rest/v3/SoftLayer_Account.xml?objectMask=fitstName;lastName;id"

(以降にXMLが続く)

LT:ベアメタルサーバを作ってみた

  • (集中力が途切れてしまってメモを取らずに話を聞くだけになっていました...)

LT: Riak on SoftLayer

  • (こちらも話を聞くだけになっていました...)
  • 発表者は@monmondawaさん
  • 分散データベースriakの話

まとめ

第1回SoftLayer勉強会の参加メモをまとめてみました。SoftLayerって何?という状態で参加していたので、後から自分が読み返しても分かるようにメモをまとめるのが大変でした。初めて参加する勉強会には予習が必要だと痛感しました。SoftLayerは興味を惹かれるので、第2回も参加してみようと思います。

更新履歴

  • 「メールの到達性について」の項目で説明と逆の意味にとれる文章になっていたのを修正しました。(5/27)

ご注文はうさぎですか?第7羽からインスパイアを受けてHTML5で「ごちうさパズル」を作ってみた

ご注文はうさぎですか?第7羽からインスパイアを受けてHTML5で「ごちうさパズル」を作ってみた

ごちうさパズル

ご注文はうさぎですか?の第7羽Call Me Sister.のストーリー中で、ココアがパズルを完成させてしまうというエピソードがありました。

このエピソードからインスパイアを受け、「ごちうさパズル」を作ってみました。

あそびかた

選択した分割数(ピースの数)に応じて画像がパズルのピース毎にシャッフルされます。最大で81ピースまで選べるようにしてあります。ごちうさ本編中では4000ピースのパズルだったので、81ピースはだいぶ少ないですが、なかなか没頭できます。

解くのが面倒になった時は"RESET"ボタンを押すとパズルが元に戻ります。

ごちうさパズルの実装

パズルのエピソードを観た時、HTML5で実装できそうだと思い立ったのですが、実装で地味にハマるところが多かったです。

パズルのピースをシャッフルする際の乱数データの取得方法

パズルのピースをシャッフルする際、乱数を使ってデータをシャッフルしています。パズルのピースは重複しないため、値が重複しないように乱数値をあつめる必要があります。かなり昔のI/Oというコンピュータ雑誌に「重複しない乱数列を得る方法」的な投稿コラムがあったのですが、当時はその原理を理解できませんでした。

が、実際には難しい話ではなく、以下の方法で実現できます。

  • あらかじめ配列に値を入れておく(等差数列でOK)
  • 乱数の値を取得し、配列のインデックスとする(乱数の範囲は0〜(配列のサイズ-1))
  • インデックスが指す値を配列の末尾の値と入れ替える
  • 乱数の範囲を1減らす
  • 乱数の範囲が0より大きい間、処理を繰り返す

JavaScriptによるサンプルは以下のようになります。

var value_list = new Array(10000);

// あらかじめ配列に値を入れておく
for (var i = 0; i < value_list.length; i++) {
    value_list[i] = i;
}

var range = value_list.length - 1;
do {
    // 乱数の値を取得し、配列のインデックスとする
    var index = ~~(Math.random() * range);

    // インデックスが指す値を配列の末尾の値と入れ替える
    var tmp = value_list[index];
    value_list[index] = value_list[range];
    value_list[range] = tmp;

    // 乱数の範囲を減らす
    range--;
} while (0 < range);  // 乱数の範囲が0より大きい間、処理を繰り返す

for (var i = 0; i < value_list.length; i++) {
    console.log(value_list[i]);
}

上記のサンプルを試してみます。配列の中身を一行毎出力しており、単に行数をカウントした値とsort,uniqで重複する値を除去した行数の値が同じであることから、重複しない値であることが分かります。動作環境はNetBSD-6.1-i386です。

$ node sample.js | wc -l
   10000
$ node sample.js | sort | uniq | wc -l
   10000

値もシャッフルされています。

$ node sample.js | head
2537
6218
7624
7580
692
4295
2508
6329
1150
4781

Pemtium M 1GHz,データの件数1万件の場合で0.4秒程度の処理時間です。

$ time (node sample.js 2>&1 > /dev/null)

real    0m0.499s
user    0m0.462s
sys     0m0.020s

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 9
model name      : Intel(R) Pentium(R) M processor 1000MHz
stepping        : 5
cpu MHz         : 996.80
fdiv_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 tm

参考までに、取得した乱数値が重複していないか逐一確認する処理方法の場合と比較してみます。30秒程度かかっており、こちらはオススメできない方法となっています。

$ cat sample-bad.js
var value_list = new Array(10000);

for (var i = 0; i < value_list.length; i++) {
    var index;

    // 配列の値が初期値(-1)でない間繰り返す
    do {
        // 乱数の値を取得し、配列のインデックスとする
        index = ~~(Math.random() * value_list.length);
    } while (value_list.indexOf(index) != -1);

    value_list[i] = index;
}

for (var i = 0; i < value_list.length; i++) {
    console.log(value_list[i]);
}
$ time (node sample-bad.js 2>&1 > /dev/null)

real    0m31.960s
user    0m30.481s
sys     0m0.040s

HTML5 Canvasと画像サイズの関係

ごちうさパズルではピースの数を選択できるようにしています。そのため、画像の幅・高さと1ピースあたりの幅・高さが割りきれないことがあり、ピースを並べて行った結果、Canvasや画像のサイズをわずかにはみ出してしまうことがあります。

今回のケースで考えると、画像サイズは600x600で、パズルのピースはNxNとしており、49pcs(7x7)と81pcs(9x9)の場合に幅・高さが割りきれない値になります。当初、単純に四捨五入(Math.round())する方法をとったのですが、Firefoxでは動作するもSafariではおかしなピースが描画されるという、ブラウザの挙動の違いにハマってしまいました。

$ node
> 600/2
300
> 600/3
200
> 600/4
150
> 600/5
120
> 600/6
100
> 600/7
85.71428571428571
> 600/8
75
> 600/9
66.66666666666667

結果、割りきれないケースの場合は、扱う画像の範囲を少し小さく扱うことで対応しました。

> 600/9
66.66666666666667
> 66*9
594        /* 594pxを画像の幅・高さとする */

Canvas.strokeStyle()の設定

これは私がCanvasの仕様を把握できていなかっただけなのですが、Canvas.strokeStyle()などでストロークの色を変更すると、既に描画したストロークの色も一緒に変更されるようです(Firefoxでしか確認してないので、他のブラウザだと違うかもしれません)。描画したデータについても、内部的には状態を保持しているようです。

まとめ

ご注文はうさぎですか?第7羽のエピソードを元に「ごちうさパズル」を作ってみました。HTML Canvasまわりではブラウザ毎の挙動の微妙な違いにハマってしまいました。Canvasまわりは私の理解が追いついていないところもあり、もう少し調べてみようと思います。