Above & Beyond

日々のアウトプット記録

02/18~02/24 参加予定の勉強会など

予定表

今週の参加予定を書いておきます。

f:id:kabukawa:20190215201127j:plain:w300

日付 時刻 イベント ハッシュタグ
02/18(月) 19:00〜21:30 freelance-jp.connpass.com #ウェブマスターオフィスアワー
02/19(火) 19:00〜21:30 k8sjp.connpass.com #k8sjp
02/20(水) 19:00〜22:00 pwanight.connpass.com #pwanight
02/21(木) 18:30〜22:00 sios.connpass.com #sios_tech
02/22(金) 19:00〜21:30 japan-d2.connpass.com #jddstudy
02/23(土) 12:30〜18:00 sqlserver.connpass.com #JSSUG #SQLServer
02/24(日) - なし

コメント

今週は月曜日に抜歯予定なので、またもやヘロヘロになりながらの参加になりそうですが、頑張りたいと思います。

みんなのPython勉強会#42

02/13(水) は「みんなのPython勉強会#42」に参加してきました。

startpython.connpass.com

f:id:kabukawa:20190210102539p:plain:w300

会場は 新虎通りCORE 5Fカンファレンスホール。 株式会社クリーク・アンド・リバー / 株式会社リーディング・エッジ さんの新しいオフィスにある会場です。 以前半蔵門に会場が有ったときには何度か参加しているのですが、会場が変わってからははじめての参加です。

f:id:kabukawa:20190213184318j:plain:w300f:id:kabukawa:20190213184316j:plain:w300 f:id:kabukawa:20190213185013j:plain:w600


目次


みんなのPython勉強会 とは

グループの概要には「Pythonでスタートする人たちの集い」として以下のようなことが掲げられています。

「みんなのPython勉強会」では、Pythonを中心としてプログラミングを仕事、研究、趣味など様々なシーンに生かす方法を一緒に学びます。 プログラマ、WEBエンジニアに限らず、初心者からマスターまで様々なレベルの、いろいろな分野の人が集まるので、「みんな」の勉強会です。

言語自体というよりは、それを使って何をするかという人向けの勉強会という感じでしょうか。 とはいえ、スタートには「初めて」という意味も含まれているので初心者向けのセッションもありますし、結構対象が幅広いですし、内容も多岐にわたっている勉強会だと思います。


何故参加したか

Pythonの勉強会の中では割と初心者向けの内容も多く、参加しやすい雰囲気というのが良いなと思っています。 実は人生で初めてLTをしたのがこの勉強会です。機材トラブルでうまく行かなかったというのも今となっては良い思い出です(笑)


内容

今回はPandasの使い方、ブロックチェーンビッグデータ処理基盤の3本のセッションがありました。 セッションの種類が本当に多岐にわたっていて、Pythonの広がりを感じますね。 (個人的にはもう少し絞って深くやってもらえたほうが嬉しいですけど)


pandasの全体像を知る

辻真吾(Start Python Club)さん

www.tsjshg.info

Pythonのデータ処理では当たり前のように使われるPandasについてのセッション。 Jupyter NotebookでPandasの使い方を一つ一つ確認していく流れになっていて、とてもわかり易かったです。

セッションで使われた .ipynb ファイルは以下の場所に公開されています。

http://www.tsjshg.info/Stapy20190213_Tsuji.ipynb

自分のPCにはPythonの実行環境がなくて動かせない、と諦めている方はこちらの記事を参考にしてください。

kabukawa.hatenablog.jp

個人メモ:

  • 使い方としてはRのdata.frameに似ている感覚
  • Jupyter Notebookで実演しながら進めるのはわかりやすくて良い
  • いろいろ1つのパッケージで出来すぎて、何でもこれだけで完結できそう(R でいう dplyr 見たな感じ?)
  • Excelファイルの読み書きは便利そう

質問にあった「Excelはセル結合していると、どのセルのデータが読まれるのか分からない」はVBAでやっても同じなので「だからExcelは〇〇」みたいな話には違和感が。「仕事ではじめる機械学習」にも出てきますが、Excelでできるならそれでやればいいし、何でもかんでもPythonでというのはどうなのかなと。

仕事ではじめる機械学習

仕事ではじめる機械学習

もう一つの質問にあった、Jupyter Notebookで開発はありか?という話。個人的にはJupyter Notebookで色々できちゃうけど開発に使うには向かないと思ってます。例外処理やエラーハンドリング、ロギングなど、システムにするために必要な機能を実装してテストするというのは、Jupyter Notebookだと逆にやりづらい。大体の機能をJupyter Notebookで実装したら、それを .py に出力して、そこに必要な処理を肉付けしたりリファクタリングしていく、というのが現実解なんじゃないかと。あくまで個人の意見ですが。


暗号通貨にまつわる課題のデータサイエンス的解決へ向けて

原利英(株式会社AndGo・代表取締役CEO)さん

[資料は公開されたら追記します]

ビットコインを例に、暗号通貨にまつわる課題についてのセッション。

個人メモ:

ビットコイン

  • それ自身のアドレスを署名鍵で暗号化したもの。
  • 署名を書き換えることで所有者が変わる

ブロックチェーン

  • 取引の記録
  • 公開されており、だれでもチェックできる

www.blockchain.com

ウォレットは大きく3つに分かれる

  • Log-in Wallets
  • Client Wallets
  • Hardware Wallets

Log-in Wallets の問題

  • 自分の手元に署名鍵が無いので、クラックされると簡単に盗まれてしまう。
  • 実際、そういう事件が起きているのは記憶に新しい

Hardware Wallets と Client Wallets の問題

  • ハードウェア信じて良いのか問題
  • 壊れたときにバックアップどうするか問題
  • アプリ偽物問題

ビットコインとかブロックチェーンって面白いと思う。 表で騒がれている投機的な感じとは異なって、裏側は結構ガチな技術で実装されているし、真剣に取り組まれている。 今はまだブームが続いていて投機的な動きがまだまだ強いけど、このあとどうなっていくのかは気になる。 注目していく必要のある分野だなと思った。


Big Dataで価値を生み出すためのSmall Trial & Method

河野晋策、内田臣了(株式会社リクルートテクノロジーズ)さん

www.slideshare.net

昨年の台風で流会になった時に予定されていたセッションの再演(?)。 リクルートテクノロジーズさんの持つデータ分析基盤について。 実は他の勉強会でリクルートライフスタイルさんでも同じようにデータ分析基盤を持っていて活用をされているという話を何度か聞いていたので、それとの違い(あるいは同じもの?)が分かっていません。構成とか、使っている技術は似ていると思うのですが。

個人メモ:

分析基盤

  • 行動ログ
  • 共通横断基盤
  • カスタマー >集 め る>動 か す>結 ぶ<動 か す<集 め る< クライアント
  • データドリブンな意思決定

機械学習によるレコメンドの改善(ゼクシィ縁結び)

ビッグデータを扱う案件であっても 1つ1つ 小さな分析・検証の積み重である 」

レコメンド

  • おすすめ順はユーザー プロフィール内容や行動に基づき スコアを算出しランキング
  • お客様 出会いに大きく影響を与えるため非常に重要な役割

f:id:kabukawa:20190217151811p:plain:w500

f:id:kabukawa:20190217151840p:plain:w500

分析

  • Google BigQueryとJupyter Notebookによる分析
  • 主要なデータ(個人情報除く) Google BigQuery上に格納
  • おすすめ順の変更は「直感ではなく必ずデータに基づいて行う」
  • データ分析ハッカソン

recruit-tech.co.jp

実装

  • マイクロサービス化による高速リリース
  • 検索エンジンレコメンドAPI 定義
  • バックエンドから検索エンジンに 直接クエリを投げるのではなく、 おすすめ順ロジックを適用する機能をAPIとして切り出し
    • デプロイ 規模を小さくしてコスト・リスクを軽減
      • ロジック 適用・切り戻しが容易
      • 万が一 障害時、切り離しが容易 直接検索エンジンにリクエストする経路も用意
    • レコメンド定義をJSONファイルに切り出し
      • 誰でも容易にロジックを変更可能
      • エンジニアに依頼せずとも企画者が直接定義を編集できる

検証

  • A/Bテストによる効果検証
  • Redashを介したBigQueryクエリ共有

まとめ

  • 小さく作って小さく試しながら堅実にレコメンド機能を磨き込んでいる
  • 速く作るために各工程で コストを小さくし 改善サイクルを高速に回す仕組みを整えている

参考情報

recruit-tech.co.jp


機械学習による不正行為、規約違反などの検知

f:id:kabukawa:20190217152040p:plain:w500

f:id:kabukawa:20190217152101p:plain:w500

  • 問題を明確化(どこまで、何を、どうやって効果を評価)
  • データ分析
    • 可視化、統計的検定
    • MLで不正行為、規約違反などの検知をできないか?
  • モデル選定、チューニング
    • 単純なモデルから始める
    • パラメータチューニング、アンサンブル学習
  • システム設計
    • MVPで始める
    • 運用・拡張性
    • Feasibility Study
  • 機械学習施策の提案まで

f:id:kabukawa:20190217152130p:plain:w500

  • 既に手順化されているものも多いので、それらを変更する工数を最小化しつつ効果を狙う
  • ユーザーと検証をしながら開発
  • 結果を元に起案、リリースに向けた動きへ

f:id:kabukawa:20190217152147p:plain:w500

追加部分の内容に関する参考情報

recruit-tech.co.jp


懇親会

懇親会は隣りにあるカフェスペースで行われました。名物の生ビールサーバーによる生ビースの提供も健在。 懇親会の最中にLTというのも相変わらず盛況で、聞いてなさそうだけどみんなちゃんと聞いている。 ネットワーキングも活発で、とても充実した懇親会だったと思います。 これはこの勉強会が有料(1000円)なので無料飯目当ての人が来ないというのも大きいかもしれません。

f:id:kabukawa:20190213210707j:plain:w600

f:id:kabukawa:20190213210730j:plain:w300f:id:kabukawa:20190213210841j:plain:w300

お話をしてくれた皆様、ありがとうございます!


まとめ

久しぶりの参加でしたが、相変わらずの盛況ぶりで楽しく参加することができました。 講演者、スタッフ、参加者の皆様、ありがとうございました!

公開されている Jupyter Notebook のファイルを Google Colaboratory で動かす

02/13(水)に参加した「みんなのPython勉強会#42」で、Jupyter Notebookを使って実際にコードを動かしていくセッションがありました。

セッション中のツイートでこんな声があったので、「それ、PC無くてもスマフォでできるよ!」と思って書き始めたのがこのエントリです。

もっとも、ガッツリ仕事で使うのには向かないと思いますので、その点はご注意を。

f:id:kabukawa:20190214192205p:plain:w400


目次


Google Colaboratoryとは

Googleの提供するPython実行環境です。
Googleアカウントを持っていれば、ブラウザだけで使えます。(実行環境はGoogle Cloudに作られる)
しかも、無料です。
他にも、Google ドライブをマウントできたり、GPU(!?)が使えたりします。

  • PC手元にないんだけどスマフォからPythonコード動かして試したい
  • Pythonを勉強するために手軽に始めたいんだけど環境を作るのが面倒
  • ハンズオンやりたいんだけど環境がバラバラだと意図しないトラブルがあるので面倒

等の場合に便利だと思います。

Google Colaboratoryは Jupyter Notebookからフォーク、つまり派生したものなので、Jupyter Notebookのファイルが読み込めます。
既存のファイルがあったり、公開されているものをトレースしたい場合にも便利に使えると思います。


公開されているノートブックを読み込む

公開されている .ipynb 形式のファイルが有れば、それをGoogleドライブにアップロードすることで Google Colaboratory に読み込むことができます。


.ipynb 形式のファイルを用意

今回のきっかけになったセッションでは、.ipynb 形式のファイルが公開されていますので、それをまずダウンロードします。

http://www.tsjshg.info/Stapy20190213_Tsuji.ipynb


Google Colaboratory を開く

次に、Google Colaboratory を開きます。

colab.research.google.com


ファイルのアップロード

こんな感じの画面が表示されると思いますので、画面上の方にあるタブ部分で ">" (赤枠部分)をタッチして右側に隠れているタブを表示します。
右端まで行くと「アップロードタブ」(赤枠)が表示されるので、タッチします。

f:id:kabukawa:20190214182946j:plain:h500 f:id:kabukawa:20190214183036j:plain:h500

ファイルのアップロード画面が表示されますので、先程ダウンロードした .ipynb ファイルを指定してアップロードを行います。

f:id:kabukawa:20190214183347j:plain:h500

なお、アップロードされたファイルはGoogleドライブに保存されますので、Googleドライブの共有機能を使って他のユーザーとファイルを共有することもできます。


Python実行環境起動待ち

ファイルが読み込まれると、バックグラウンドでPython実行用の仮想マシンGoogle Cloud側に起動します。
起動するまでは画面上部に「接続中」(赤枠)と表示されます。
仮想マシンが起動して、Pythonが実行できるようになると、「接続済み」に変わります。

f:id:kabukawa:20190214183537j:plain:h500 f:id:kabukawa:20190214183713j:plain:h500


コード編集/実行

あとはコードのセル部分を表示して、実行や編集の操作を行います。
画面で赤枠で囲ってある部分をタッチすると実行ボタンが表示され、青枠で囲ってある部分をタッチするとコードの編集ができます。

f:id:kabukawa:20190214183817j:plain

実行ボタンが表示されたところ。
左上にあるハンバーガーメニュー(〓 みたいな表示のボタン)をタッチすれば、ファイルの保存や一括実行等ができます。

f:id:kabukawa:20190214183942j:plain:h500 f:id:kabukawa:20190214184622j:plain:h500

コードの編集は、スマフォのソフトウェアキーボードだと厳しいところはあると思いますが、 どうしても快適にコードを書きたければBluetoothキーボードを接続して使えばいいと思います。
結構コンパクトなキーボードが販売されていますし、PCと違って持ち込みで問題にされる可能性は低いのではないでしょうか。


その他

Googleドライブをマウント

Google Colaboratory はGoogleドライブにファイルを保存できると同時に、Google Colaboratory からGoogleドライブをマウントできます。
こんなコードをセルで実行すると、一時的にマウントするためのコードを要求する画面と、ログインしてコードを得るためのリンクが画面上に表示されるます。

from google.colab import drive
drive.mount('/content/drive')

ログイン後に表示されるコードを先程のコード入力画面に入力すると、ドライブのファイルが Google Colaboratory 直接参照できるようになります。
これは例えば、ドライブに置いてあるサイズの大きなファイルやExcelファイルなどを読み込みたいという場合に便利に使うことができるのではないでしょうか。
但し、Googleドライブには容量制限があるので、それを超えないように注意しておく必要があります。(有料で追加は可能ですけど)


コマンドの実行

Google Colaboratory のバックエンドでPythonを動かすための仮想マシンが起動している、ということを上の方で書きました。
ということは Linuxコマンドを使えるということでもあります。試しに、セル上で "!cat /etc/os-release" を実行してみたらこんな結果が表示されました。

NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Ubuntu 18.04 LTSが動いている事がわかります。
gitも使えますしローカルディスクの割当もあるので、GitHubからコードやデータをチェックアウトしてきて使うとかも可能。
巨大なファイルは事前にGoogleドライブに置いておけば使うのも簡単ですね。


注意点

Google Colaboratory は無料で使えるのですが、実行できる時間に制限があります。

以下の条件に引っかかると、バックエンドで動作している仮想マシンがシャットダウンされてしまいます。

  • 最大12h経過
  • なにも実行されていない状態、または実行中でもブラウザでタブが開かれていない状態で90分経過

.ipynb ファイルはGoogleドライブに保存されているのですが、仮想マシンがシャットダウンされると処理途中だったモデルやそこまでの実行結果を保存していたメモリ、環境変数などが消えてしまします。この点は注意が必要です。(僕が仕事で使うのには向かないと考える理由の一つです)


おわりに

Google Colaboratory、いかがでしょうか?
個人的にはとても便利で良いサービスだと思います。
正式なサービスとして誰にでも進められるものではないかもしれませんが、Pythonを始めたいけどどこから始めればいいかわからないという場合には使ってみ価値はあると思います。 ということで、興味を持った人は使ってみてもらえると嬉しいです!

Delphiが24周年だそうで

今日はデブサミに行くつもりだったけど、体調が優れずに行けなかったのでブログを書きます。

f:id:kabukawa:20190214133441p:plain:w400


目次


テーマ

テーマは、Delphiが24周年。エンバカデロ社からのメールに以下のようなメッセージが書かれていまして、じゃぁ自分の思い出でも書いてみるかと思って書き始めました。

Windows 10、macOS 10.14、iOS 12Android 9など、最新プラットフォームに対応したDelphi / C++Builder / RAD Studio 10.3。2月14日は、そのDelphiが「Software Development Conference 95 West」で発表された日です。

なんで書こうかと思ったか? それはDelphiが自分が購入したはじめてのコンパイラだったからです。


Delphi is 何?

とはいえ、Delphi と言われてもよく知らない、という人も今は多いと思うので、そのあたりを少し。

画面イメージを見てもらったほうが早いと思うので、貼っておきます。

f:id:kabukawa:20190214134927p:plain:w600

WinWorld: Borland Delphi 2.x

Windows95の頃の製品なので、見た目は懐かしさ満載ですが、UI自体は今の開発ツールとあまり変わらないですよね。 フォームと呼ばれるウィンドウにコンポーネントと呼ばれる部品をポトリペタリして処理をそのイベントのハンドラに記述していくスタイルは、当時としては画期的なものでした。当時、同じようなスタイルで開発をするツールとしてはVisualBasicが既にありましたが、コンポーネントの豊富さ、ネイティブコードコンパイルなど、VisualBasicには無い魅力に溢れていて、当時は結構な人気ツールでした。

詳しく知りたい人はWikipediaをどうぞ。

ja.wikipedia.org


なんでDelphiを買ったか

当時は会社で仕事を初めて4年目くらい。SESで客先に常駐して仕事をしていたので、開発に使える技術はそこにあるものだけでした。 自分の場合はVisualBasic。でも、それだけをやっていても面白くない、ぶっちゃけ飽きていたんですね。

で、なにか新しいことを始めてみたいなぁと思っていたところに、Delphiっちゅう新しい統合開発環境が発売されていて結構良いらしいなんてことを、雑誌の記事で知りました。じゃぁ、そんなに高くもなさそう(当時3万円くらいだったような気がする)なので、買って使ってみるか、と。

今は多くの言語のコンパイラは無償で手に入るようになっているので、コンパイラ(と開発環境)に何万円も払うというのには違和感があるかもしれませんが、当時はコンパイラが必要なら買うのが当たり前でした。(UNIXは除きますよ。あくまでWindowsでの話です)

コンポーネントの豊富さ、ネイティブコードコンパイルあたりはVisualBasicには無いものでしたし、コンポーネントで最新のWIndowsUIを簡単に実現できたりするところは、明らかに楽しい。買ってから暫くはめちゃツボにハマりました。


Delphiのすごかったところ

じゃぁ、なんで楽しいと感じたか?個人的にはこんなところだったと思っています。

後者は今ならGitHubで公開とか普通に行われていることですが、前者は今でもやっているツールはあまり見かけたことが無い気がします。 (オープンソースの製品を除く)


ライブラリ(VCL)のソースが付属

一番安いエディション(学習用)には付属していなかったのですが、それ以上のエディションにはコンポーネントのソースが付属していました。つまり、画面の構成部品であるボタンやリストボックス、メニューと言ったもののソース(実際にはWindowsのWin32 APIで提供されていたもののラッパー)が購入した人の手元にあるわけです。

つまりこれは

ということですね。 自分はそこまでのスキルが無かったので拡張はできなかったのですが、この特徴がその後のDelphiの隆盛を支えていたのは間違いないと思っています。

ちなみに、VCLはVisual Compornent Libraryの略ですが、GUIの部品じゃないといけないわけではなく、画面表示のないものもコンポーネントとして作成できます。例えばDB接続などがそれに当たります。


各自が作ったコンポーネントを公開して利用

当時はWindows95等の普及でインターネットは使われ始めていたものの、GitHubはまだありませんでした。 プログラミングに関する情報などの多くは、Nifty Serveなどのパソコン通信のフォーラム上で活発にやり取りされていた時代です。 自分でインターネット上でサイトを作ったり、パソコン通信のライブラリ上で公開されていました。

今ならソースやバイナリをGitHubなどから取ってきて使うのは普通ですが、当時はそうではなかったので結構新鮮でした。

で、その結果何が起こったかというと、そうしたコンポーネントを使ったソフトウェアが沢山作られるようになりました。 かなりたくさんのフリーウェアが作られましたし、今でも作られています。

個人的にコンポーネントで一番すごいなと思ったのは、TEditor です。 いわゆるテキストエディタの編集部分の機能をもつコンポーネントです。 このコンポーネントをフォームにポトリペタリして、少しコードを書くだけでテキストエディタが作れる。 当時はこれを使ったテキストエディタがメチャクチャ沢山公開されていました。

他にも、オリジナルのVCLには無いけど、あったら便利なのにという機能がコンポーネントとして沢山公開されています。


その後

自分のDelphiブームは2年位で終わりました。何故かと言うと、その後の仕事でC++を使うことになり、DelphiからC++ Builderに乗り換えたからです。 C++ BuilderというのはDelphiプログラミング言語C++に置き換えた製品です。

GUIの開発方法はそのままに言語だけC++、ということでGUIアプリケーションをC++で書く時の生産性をメチャクチャ上げてくれました。 当時のWindows上でのC++でのGUI開発は、マイクロソフト社のVisual C/C++でVisualと言いつつコード中心で開発していくものしか無かったので、Delphiと同様にポトリペタリしてイベントハンドラを実装していくスタイルでの開発ができたのはすごく良かった。Delphiで作られた沢山のコンポーネントがほぼそのまま使えるのも魅力的でした。

Delphiは個人的な趣味でしたが、C++は仕事で使っていたこともあり、その後5年位はずっとC++ Builderを使っていました。自分の勉強を兼ねて、現場でC++ Builderの勉強会をやっていたのもいい思い出です。更にいうとその後でJBuilderという言語をJavaに置き換えた製品も仕事で使うことになりまして、この頃はBorland漬けでしたね。自腹でBorland が企業向けに開いていた Borland Conferenceというイベントにも自腹で参加してました。(企業担当者向けということもあり、確か参加費は数万円だった記憶ががが)


そして今

Borlandは時代の変化に対応して会社名をInpriseに変えたり、Borlandに戻したりしながら変わっていきました。 Delphi等の開発ツールはCode Gearという会社に切り出され、その後エンバカデロ社に買収されました。そしてそのエンバカデロ社は今はIdera社の傘下。 ツールの名前もRAD Studioという名前になり、DephiとC++Builderの統合やWindows以外のプラットフォームの開発にも使えるように進化していくことになります。

時代は変わっていくものですが、こうやって振り返ってみると24年という月日は長かったなぁ、なんてことを思いました。

もし、このエントリを読んで、DelphiC++ Builderに興味を持った人がいたら、今は無料で使える Community Editionというのが提供されているので、取り敢えず使ってみるのも良いかと思います。

www.embarcadero.com

www.embarcadero.com

楽しいプログラミングができるようになると良いですね!

NGINX MeetUp Tokyo #2

02/12(火) は「NGINX MeetUp Tokyo #2」に参加してきました。

nginx-mj.connpass.com

f:id:kabukawa:20190210100817p:plain

会場は サイオステクノロジー さん。

f:id:kabukawa:20190212163407j:plain:w600 f:id:kabukawa:20190212163400j:plain:w215f:id:kabukawa:20190212164836j:plain:w385


目次


NGINX MeetUp Tokyo とは

グループの概要から引用します。

日本のNGINXユーザー、また関心をお持ちの方に向けてNGINX, Inc. CTO / Igor Sysoevを 招きNGINX最新情報をお届けします

NGINXとは

nginxというのは何か?公式サイトから引用すると

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.
nginx [engine x]は、元々Igor Sysoevによって書かれた、HTTPおよびリバースプロキシサーバー、メールプロキシサーバー、および一般的なTCP / UDPプロキシサーバーです。

nginx.org

ソースとドキュメンテーションは2条項BSD風ライセンスの下で配布されています。

2月7日には東京オフィスも解説されました。日本でのサポートも更に手厚くなりそうですね!

www.nginx.co.jp


何故参加したか

元々以前の仕事で少しだけ使っていたこともあり、興味があったというのもありますが、 直接的にはJapan Container Days でブースを出されていて、そのつながりでイベントを知って参加することになりました。


タイムテーブル

時間 内容
16:30~ 受付
17:00~17:05 オープニング
17:05~17:50 セッション1 NGINX update

① NGINX OSS と Unit
 講師:NGINX, Inc. CTO / Igor Sysoev
 *逐次通訳付き

② NGINX Plus
 講師:NGINX K.K. テクニカルソリューションアーキテクト 鈴木孝彰
17:50~18:15 セッション2 NGINX Unit デモ

 講師:NGINX K.K. テクニカルソリューションアーキテクト 田辺茂也
18:15~18:30 ライトニングトーク (5分×3名 15分)
18:30~19:15 懇親会

内容

少し緊張した感じの中で始まりました。

f:id:kabukawa:20190212170043j:plain:w400

ただ、こういうMeetupの存在や内容について知ってもらうことでコミュニティの輪も広がると思いますので、次回参加するときはもう少しツイートなどもしていきたいなと思いました。

参加者へのノベルティの数々。

f:id:kabukawa:20190212163217j:plain:w600 f:id:kabukawa:20190212165056j:plain:w385f:id:kabukawa:20190212163253j:plain:w215


NGINX update

NGINXの Igor Sysoev さんは、創設者でありCTO。


NGINX OSS と Unit

NGINX, Inc. CTO / Igor Sysoev さん

[資料は公開されたら追記します]

f:id:kabukawa:20190212170437j:plain:w300

個人メモ:

新しいプロジェクトNGINX Unit

  • 開発を開始しているがかなり前が、本格的に開発し始めたのは2年前

アプリを実行できるプラットフォーム

  • PythonPHP、Go、PerlRuby、Node.jsの6言語サポート。Javaはもうすぐ
  • LinuxFreeBSDMacOSSolarisで動作。
  • コンフィグレーションファイルは存在しない。JSONのRESTFulAPIで行う。
  • ダイナミックに再設定可能。全体だけでなく部分的な変更も可能。

NGINX Unitの履歴

  • 2017/9月に最初のβバージョン公開
  • 2018年4月に正式版公開
  • 2019年2月に1.7.1を公開
  • オープンソースでApache2.0ライセンス

アーキテクチャ

f:id:kabukawa:20190213092946j:plain:w500

  • NGINX Unitのプロセスは main、controller、router に分かれている。

Controllerプロセス

  • RESTFul API経由でコンフィグレーションを取り扱う
  • 設定のコピーを読み込んで起動する
  • セキュリティ的な理由で

    • コンフィグレーションファイルは利用を推奨しない
    • 再起動時の設定用に用意されているもの
    • 空の状態からRESTFul API経由で更新していくことを推奨。
    • RESTFul API経由で設定が更新されると上書きされる
    • 非特権ユーザーで起動
    • UNIX ドメインソケットからしか接続できない
  • JSONで設定

    • JSONは便利だがコメントを入れられないなど不便なところもある
    • なので、別のDSLで書いて、それをJSONに変換するなどの工夫をしたほうが良い
  • curlなどのコマンドからRESTFul APIを呼び出してコンフィグレーションを反映/確認などを行うことができる

f:id:kabukawa:20190213093710j:plain:w500

  • ストレージへの反映(SSL認証鍵)もREST API経由で更新

Routerプロセス

  • ほとんどのアプリケーションの処理を行う
  • アプリケーションワーカープロセスにリクエストを転送したりクライアントとの接続をしたりする
  • 非特権ユーザーで処理を行う
  • いくつかのワーカースレッドを持っている
  • それぞれのスレッドがepoll/kqueueインターフェースを持っているの
  • 複数の処理を同時に処理を行うことができる

なぜこのようなアーキテクチャにしたか?

NGINXでは

  • NGINXでは共有ストレージを処理(キャッシュ)しなければならない
  • 共有メモリで処理していたが、この形で処理をするのは安全ではない
  • 例えば一つの共有メモリがログアクセスをしていて問題が起きた場合、他のプロセスが止まってしまう
  • このようなケースで信頼できるソリューションがないので、注意深くプログラミングをしなければならなくなってしまう。
  • マルチスレッドにすることでスレッドセーフにできる。
  • 2000年代の初めではLinuxBSD系ではスレッドに対するサポートが弱かったが今は違う。
  • 今はNGINXでもマルチスレッドでオフロードできるが、NGINX Unitとは少し違う。

NGINX Unitでは

  • NGINXのコンフィグレーションプロセスは1つのコンフィグレーションしか対応できない
  • NGINXのワーカープロセスはコンフィグレーションが変更されたときに古いものを削除して置き換える
  • NGINX Unitの方は複数のコンフィグレーションに対応している
  • 構成変更をした場合、更新前と後のものを認識している
  • Routerの中では複数のバージョンが存在し、それらはリクエストごとに別のものとして存在
  • 古いものは処理が終わるまではそれが使われるが、次からは新しい世代のコンフィグレーションで対応する
  • バインドされているリクエストが無くなった時点でそのバージョンが削除される
  • こうすることでメモリを有効利用できるようになる

アーキテクチャを変えた理由

  • NGINXは17年前に開発が始まったが、その頃は頻繁なコンフィグレーションの更新は想定されていなかった。
  • 今はクラウド環境では頻繁な更新が当たり前になってきたので、それに対応する必要がある。
  • それぞれの設定のたびにワーカープロセスが増えるのでメモリ使用量も増えてしまう。
  • NGINX Unitのやり方を適用することでメモリの利用効率を改善できる。

mainプロセス

  • どのポートもListenしない。
  • 特権ユーザーで起動
  • 非特権ユーザーでも起動は可能だが、ControllerやRouterのプロセスで起動/再起動するので特権ユーザーで起草する必要がある
  • リスナーソケットにBINDするためにも特権が必要
  • 一般ユーザーが見えないログファイルの作成などにも特権が必要
  • ログ作成はmainプロセスが担う
  • Controllerが443ポートをBINDしなければならないときRouterからmainにリクエストが転送され、処理される。
  • Logも同様

Applicationプロセス

  • Dropin置換で使用する場合アプリケーションの変更は不要
  • GoとNode.jsではちょっと変更が必要
    • Go
      • import "nginx/unit" して http.ListenAndServe() の代わりに unit.ListenAndServe0 を使う必要がある
    • Node.js
      • http = require ("http") の代わりに http = require ("unit-http") を使う必要がある
    • Unit固有のモジュールはフォールバックHTTP処理を提供するため、GoおよびNode.jsアプリケーションはUnitなしでスタンドアロンで実行可能

NGINX Unitのユニークなところ

  • 違うバージョンの言語も使う(共存する)ことができる
  • コンフィグレーションでバージョンを指定して別々の言語バージョンのまま動かすことができる
  • Controllerのコンフィグレーションでバージョン指定をできる。
  • バージョン指定がない場合は、NGINX Unitが最新バージョンを判断して使用する。

  • mainプロセスがアプリケーションを実行するときに必要なバージョンを見つけて起動する

  • アプリケーションをアップグレードするときに便利な機能。
  • データ転送にUNIX domainソケットペア、共有メモリセグメントを使う。
  • 共有メモリの使い方はNGINXとはちょっと異なる。
  • 安全上の理由で共有メモリの数を増やせない時に複雑な動きになる

Unitでの共有メモリ

  • オンデマンドで作成
  • 共有メモリとそれぞれのワーカープロセスを繋ぐ部分で使われている。
  • 個別部分での接続に使われているので、全体で一つの共有メモリにはなっていない。
  • 共有メモリが信頼できないものかもしれない場合に、通常の共有メモリの使い方だと全体が落ちてしまう。
  • Unitの共有メモリの使い方であれば、その部分だけを落とせばいいので、全体が落ちるようなことは防ぐことができる。

まとめ

NGINX Unitとは


NGINX Plus

NGINX K.K. テクニカルソリューションアーキテクト 鈴木孝彰 さん

[資料は公開されたら追記します]

f:id:kabukawa:20190212180305j:plain:w300

個人メモ:

NGINX Plus

f:id:kabukawa:20190213095721j:plain:w500

NGINX Plus利用されているソリューション例

f:id:kabukawa:20190213095420j:plain:w500

  • HTTP/2
  • TLS 1.3サポート
  • 0-RTT

利用している環境のデモ

f:id:kabukawa:20190213100031j:plain:w300f:id:kabukawa:20190213100049j:plain:w300

ロードバランシング

  • 最小タイム(Plusのみ)
  • 多段のロードバランスもできるようになっている

f:id:kabukawa:20190213100150j:plain:w500

Stickyセッション(セッション固定)サポート

f:id:kabukawa:20190213100413j:plain:w500

利用している環境のデモ

f:id:kabukawa:20190213100443j:plain:w500

冗長構成サポート

  • アクティブ/スタンバイ

f:id:kabukawa:20190213100717j:plain:w500

ハードウェアからソフトウェアへ

  • F5とかを使っている場合に置き換え候補に

API Gatewayとして利用することも可能

f:id:kabukawa:20190213100857j:plain:w500

Kubernetes環境でもIngressコントローラーとしてNGINXを使える

f:id:kabukawa:20190213101233j:plain:w500

OpenShift環境でも同様に使える

NGINX WAF機能

  • レイヤ7の攻撃保護
  • パフォーマンスが2倍
  • IP reputation

f:id:kabukawa:20190213101302j:plain:w500

  • 各種LinuxなどのOS環境、Dockerlコンテナでも利用可能
  • クラウドの従量課金環境でも利用可能

f:id:kabukawa:20190213101445j:plain:w500


NGINX Unit デモ

NGINX K.K. テクニカルソリューションアーキテクト 田辺茂也 さん

[資料は公開されたら追記します]

f:id:kabukawa:20190212182821j:plain:w300 写真左の方

個人メモ:

Dockerhubにイメージがあるのですぐに試すことができる

hub.docker.com

NGINX Unitに設定を反映したりするデモを実施。

コンテナを起動した時の docker ps

f:id:kabukawa:20190213102010j:plain:w500

設定反映

f:id:kabukawa:20190213102259j:plain:w500

設定反映後

f:id:kabukawa:20190213102415j:plain:w500


LT:Nginx Cache Delete API

Yuki Iwamoto さん

[資料は公開されたら追記します]

f:id:kabukawa:20190212182943j:plain:w300

  • 部分的なNGINXのキャッシュ削除をしたかったので作った

f:id:kabukawa:20190213102444j:plain:w500

  • NGNIXのキャッシュはMD5ではッシュされたファイル名で保持されているので、それを探して削除すればOKなのでは?

  • Luaを使うといい感じでNGINXの処理を書くことができる

懇親会

腰痛がひどくて早々に退散しましたが、皆さん熱心に講演者や他の参加者の方と話をされていたのが印象的でした。

f:id:kabukawa:20190212184200j:plain:h400


まとめ

NGINXのオリジナルの開発者であり、NGINX社のCTOでもある Igor Sysoev さんの話を聞けたのはとても良かったです。 予定時間をかなりオーバーして話をされていましたが、アーキテクチャの話やNGINX本体との違いなど、とても興味深く聞くことができました。 また、NGINX Unitについても、ちょっと試してみたいなという気持ちになりました。

せっかくの内容だったので、もう少し外部への発信(ツイートなど)も行われるといいのに勿体無いと思ったのも確か。 このブログを読んで、興味を持って参加する人が増えてくれるといいなと思いました。

次回もできれば参加したいな、と思いました。 講演者、スタッフ、参加者の皆様、ありがとうございました!

PC復活

なんとか使えるところまで復活したので、手順とハマりどころを書いておきます。

f:id:kabukawa:20190209205706p:plain:w300


目次


1. 事前準備

1.1. PCのリカバリディスク

工場出荷時の状態に戻すために必要。 Windows 7のときに作成しておいたもの。もう使うことはないと思っていたが、必要なものは忘れた頃に必要になるという感じで「マーフィーの法則かよ!」という感じ。 取っておいてよかったバックアップ。

なお、工場出荷時の状態ではOSはWindows 7 Professionalだが、一旦そのままにする。 いきなりWindows 10 をインストールしてもデジタル認証なので問題ないと思うが、初期セットアップされていたもののうち、Power DVDと関連ソフトウェアは使うことがある(無いとDVDに焼いたりできなくなる)ので、このように選択。

1.2. Windows10のインストールディスク

マイクロソフトのサイトからイメージをダウンロードしてDVDに焼くもしくはUSBメモリにイメージ転送する。 (OSのインストールイメージが公開されている。いい時代だ)

www.microsoft.com

今回は去年のリカバリのときに使ったディスクがあるので、それを利用しようとした。 (結果的には使えなかったのだが、それは後述)

DVDは焼いたら消せないので、USBメモリを使いたかったけど、結果的には不要だった。(でもUSBメモリは買った)

1.3. 交換用ドライブ

交換用ドライブはこれを購入。

ケーブルの取り回しと電源の関係で、5インチベイに取り付けたかったので、スペーサも購入。

1.4. データバックアップ

基本的にはクラウド(Google Driveなど)に保存しているが、サイズの大きなものなどは別ドライブにコピーして保存。 ソフトウェアは再インストールをしなければならないが、データが消えなければ大した問題ではない。

2. ドライブ交換

使っているのがHPのPavilion HPE PC h8-1180jp/CT というやつ。

support.hp.com

ミニタワー筐体なんだけど、結構中身はギッシリ。ドライブを外すのも結構めんどい。 でも、外したら壊れたドライブと入れ替えるだけなので、やること自身は結構簡単。

2.1. 交換手順

  1. 筐体から電源、ディスプレイ、LAN、キーボードなどのケーブルを外す
  2. 取り敢えず10秒以上放置(念の為)
  3. 筐体を開けて、ドライブベイを取り出す
  4. 壊れたHDDのSATA電源ケーブルを取り外し
  5. 壊れたHDDを取り外し
  6. SSDをスペーサに取り付け
  7. SSDを取り付け
  8. SSDSATA電源ケーブルを取り付け
  9. ドライブベイを元にに戻して、筐体を閉じる
  10. 筐体に電源、ディスプレイ、LAN、キーボードなどのケーブルを取り付け
  11. 起動してBIOS画面表示
  12. SSDが認識されていることを確認して、BIOS画面を保存して終了

2.2. ハマりどころ

  • SSDが最初認識されなかったこと。
  • SATAのケーブルが奥まで刺さっていなかったみたい。
  • 刺しなおして再度確認したら無事に認識された。

3. Windows7 リカバリ

DVD(3枚)からSSDへのデータコピーに時間がかかるけど、コピー後のインストールはサクサク進む。 ちなみに、Windows Updateは大量すぎて地獄。

3.1. リカバリ手順

  1. 起動ドライブの優先順位をDVDドライブを先頭にしておく
  2. リカバリディスクをDVDドライブに入れて起動
  3. リカバリをするか確認画面が出るので、「工場出荷時の状態に初期化」を選んでリカバリ実行
  4. ひたすら待つ
  5. リカバリが終わったらDVDをドライブから取り出して再起動
  6. Windows7のインストールと初期インストールソフトウェアの展開が実行される
    ドライブがSSDになっているので再起動もインストールもめちゃ速い。
  7. インストールが終わったら取り敢えずWindows Update実行
  8. ひたすら待つ

3.2. ハマりどころ

  • 手違いでWindows Update中に電源断をしてしまい、それが原因で以降のWindows Updateがエラーが取れない状態に。
  • キャッシュ消したりして何度かチャレンジしたけど、結局うまく行かず。
  • 仕方がないのでリカバリから再度実行した(SSD上にイメージが転送されているので、Windows Update以外は結構あっという間に終わる)

4. Windows 10へのアップグレード

DVDに焼いたイメージを使ってアップグレードを試みたが、イメージが古いから最新版でやり直せと言われる始末。 結論としては、アップグレード用のツールを使うことでDVDに焼くまでもなくインターネットから直接アップグレードできる。 なんてこったい。

4.1. アップグレード手順

www.microsoft.com

  1. 上記のページから「ツールを今すぐダウンロード」ボタンでインストール用のツールをダウンロード
  2. ツールを実行
  3. ライセンス条項に同意するか聞かれるので、内容を読んで納得した上で「同意する」ボタンをクリック
  4. 「このPCを今すぐアップグレードする」という項目を選択して「次へ」
  5. 移行するデータやプログラムの確認が出るので、内容を確認してアップグレードを実行
  6. ひたすら待つ
  7. インストールが終わると再起動して、Windows10が起動する

4.2. ハマりどころ

  • Windows7の時にちゃんとWindows Updateで最新化しておかないとインストールエラーになることがある
  • インストール時にライセンス番号を聞かれるが、すでに該当のPCはデジタル認証済みなのでライセンス番号の入力無しで突破
  • Microsoftアカウントのユーザーでログインし直し(これをしないとWIndows10のデジタル認証が有効にならない)

5. インストール/アンインストールしたソフトウェア

5.1. アンインストールしたソフトウェア

  • HPの管理用ソフトウェア関連(Windows10上では起動しなくなっているので削除)
  • Symantec Antivirus 試用版(Windows10上では起動しなくなっているので削除)

5.2. インストールしたソフトウェア

壁紙はこの写真にした。。。

まとめ

SSDになったことでかなり快適になりました。 古いPCなのでSSDの性能を活かしきれていないけど、まぁそれは仕方ない。

f:id:kabukawa:20190212121450p:plain

シーケンシャルリードとライドが5倍、ランダムのリードとライトは30倍から400倍。 音も静かになったし、取り敢えず満足です。

02/11~02/17 参加予定の勉強会など

予定表

今週の参加予定を書いておきます。

f:id:kabukawa:20190210100451p:plain:w300

日付 時刻 イベント ハッシュタグ
02/11(月) - なし
02/12(火) 17:00〜19:30 nginx-mj.connpass.com #NGINX #NGINXPlus
02/13(水) 19:00〜21:00 startpython.connpass.com #stapy
02/14(木) 10:00〜18:45 event.shoeisha.jp
02/15(金) - なし
02/16(土) - なし
02/17(日) - なし

コメント

今週は月曜日が祝日なのに加えて、金曜から旅行に行くので勉強会/イベントへの参加は3回と少なめです。 体調をここで回復して元のペースに戻したいですね。