mabulog

このブログは、mabuの平凡な日常を淡々と描く物です。 過度な期待はしないでください。 あと、部屋は明るくして、 モニターから3メートルは離れて見やがってください。

「AutoScroller」を作りました。

FireFox用WebExtension「AutoScroller」を作りました。
このAdd-onは自動で画面スクロールしてくれるAdd-onとなります。

github.com AutoScroller :: Firefox 向けアドオン

経緯

FireFox57 で旧式のAdd-onが利用できなくなりますが、
未だに多くのAdd-onがFireFox57対応出来ていないのが現状です。
正確には私が使用している多機能なAdd-onはそもそも実装困難な状況だと思われます。
はてな民である私としては非常に残念ではあったのですが、
はてなブックマークも同様にサイドバー廃止などを余儀なくしていました。

bookmark.hatenastaff.com

ただ、はてなブックマークのサイドバーがなくなった事を
嘆くだけでは何も解決しない上にエンジニアとして情けないと思い、
何か作ろうと思いました。

なぜ、自動スクロールなのか?

MacFireFoxにはおそらく自動スクロールという機能はありません。
他のアプリを駆使する事で実現は可能かと思われますが、
もともとAdd-onを使用しており、またこれぐらいなら出来るだろうという事で作ってみました。

開発過程

だいたいの手順は公式ガイドと公式GitHubリポジトリを見て適当に作ればだいたいなんとかなりました。

developer.mozilla.org github.com

まとめ

このAdd-onのおかげで私のネットサーフィン生活が快適になりそうで、 作ってよかったという思いしかありません。

github.com

「extension-phpdoc」を作りました。

extension-phpdocというライブラリを作成しました。
PHPのextensionに実装されている組み込みクラスと同等のダミークラスを集めたライブラリとなっています。

github.com

けいい

PHPの開発現場ではcomposerが当たり前となり、クラスのプロパティの調査、関数のオプションの確認といったライブラリの調査力が最近は求められています。
そんな中、組み込みクラスは実態がC言語からコンパイルされた成果物のみで普段の調査力とは違った労力が必要となり改善策を常々模索していました。
PHPStormには組み込みクラスを参照する機能があるという事を7月から働きだした新しい職場で教えて頂き驚きました。
Vim+ctagsには到底出来ない芸当です。
詳細を確認するとphpdoc用にダミーファイルを用意しているようでした。
私は先日Universal Ctagsのチームにジョインした事もあり、 PHPStormをリスペクト&インスパイアした組み込みクラスのダミークラス集を作ろうと考えたのが本ライブラリ開発の始まりでした。

インスールほうほう

本ライブラリは特性上組み込みクラスと競合します。そのため、グローバルインストール必須です。
グローバルインストールされたライブラリをプロジェクトから呼んでいるプロジェクトはインストール非推奨です。

$ composer global require kazuakim/extension-phpdoc

りようほうほう

私はVimで開発をしているのですが、グローバルインストールされたライブラリ用のタグファイルを生成し、
プロジェクト用のタグファイルとセットでVimに読み込ませています。
そうする事で自然なタグジャンプが可能となり、更に開発が加速します。
例でVimを上げましたが、グローバルインストールされたライブラリからphpdocを取得する方法を提供しているエディタ、IDEであれば利用できる事を想定しています。

こんご

開発している最中は機械的PHPマニュアルを読みながら実装を進めていましたが、
その際にPHP本体にあるクラスをオーバーライドしているクラスが散見されました。
そのような場合にタグジャンプではどちらにジャンプするか候補の選定が発生し、
条件が整っている場合には期待したクラスにジャンプできますが、大体はどのファイルにジャンプするかユーザに選択するようにインターフェースが表示されます。
自然な調査をサポートする本ライブラリとしてはあまり嬉しくない結果です。
そこである程度利用者が増えた場合にはオーガナイゼーション化して、クラスファイルをextension単位で分割したいと考えています。

また、PHPマニュアルのみ対応している状況のため、その他の組み込みクラスも随時対応していきたいと考えています。

PHP: MongoDB\Driver\Exception\InvalidArgumentException - Manual

まとめ

開発をすすめる上で調査力を向上したい方に広く使ってもらえたら、幸いです。
一旦PHPマニュアルをほぼ網羅出来たと思うので、ベータ版としてリリースしました。
もし、すでに同様のライブラリがありましたら、ご連絡して頂けると私が救われるので早めに教えて頂けると助かります。
また、応援して頂ける方は本ページのはてブまたはGitHubのスターをお待ちしています。

github.com

ついき

PHPStormにあるんだからプロジェクトを漁るべきでした。
教えて頂き最高に便利なプロジェクトがありました。 本開発は一旦終了です。

github.com

"MySQL 5.7 初心者向けセミナー"に参加した(後半)

レプリケーション

資料

高可用性構成

重要なのはSlaveはバックアップではないという事です。MasterでDROPしたらSlaveにも伝搬するため、バックアップとしては使えません。 また、マルチソースレプリケーションはn台マスターから、n台のスレーブに反映できます。

レプリケーションの仕組み

MasterDBのbinary logをSlaveサーバに送る、Slaveサーバはrelay_logで受け取り、 relay_logからSlaveDBに反映する。

バイナリログの種類

  • SBR(Statement Based Replication)

SQLとPositionが格納されています。
そのため、SYSDATE()など実行タイミングに依存するSQLレプリケーションに使えません。
ちなみにNOW()とはじめ書いていたが、あれは勘違いでした。資料でもNOW()とは書かれていません。
NOW()の実行結果をバイナリにログに保存しているため、SlaveDBで再度実行される事はありません。 yoku0825.blogspot.jp

  • RBR(Row Based Replication)

変更された結果とPosition情報をバイナリログに書き込んでいます。
そのため、UPDATE文でWHEREをつけずに100万行更新した場合に、差分も確保する必要があるため変更前と変更後の200万行分のバイナリログが生成されます。SBRSQLを出力しているだけのため、1行で済みます。
Position情報を含んでいるという事を失念していましたが、MBRやその他の処理を行う上でPosition情報を更新しないと、障害になるわけで大変重要な事を記載漏れしていました。

  • MBR(Mixed Based Replication)

RBRとSBRを状況に応じて切り替えます。
MySQL 5.1.12以降は、デフォルトで採用されています。

5.1系の5.1.12~5.1.28の間だけがbinlog_format=MIXEDがデフォルトでした(5.1のGAは5.1.30なので、GA期間はずっとSTATEMENT) それ以外は5.6とそれ以前でSTATEMENT, 5.7とそれ以降でROWがデフォルトです。
詳しくは追記参照

時間ができた際には切り替え条件を調べたいと思います。

レプリケーション種類

非同期レプリケーションはコミットで返しつつ、裏でレプリケーションを実施します。

relay_logに入れてからコミットします。 言い換えるとrelay_logからSlaveDBには"まだ"反映されていないため、障害発生時に差分が発生する可能性があります。

GTID

MySQL5.6で追加された機能で今後主流になるかもな機能です。
まだ、理解が浅いので実際にサーバを立てる事で理解が進むんじゃないかなと思ってます。
障害発生時にmaster昇格する際にPOSITIONの状況を見て、昇格するGTID(サーバ)を指定する運用になるそうです。
リストア後にはスレーブのauto.cnfを削除します。これはmasterのUUIDが変わるためです。

物理のフルバックアップからリストアした時に、auto.cnfを削除します。 これは既存のスレーブと同じserver_uuid(auto.cnfに保管される)が指定されるのを防ぐためです。
追記参照です。

GTIDが有効な場合にはsql_slave_skip_counterはサポートされませんが、
代替手段があるため、過去やらかした私としては大変ホッとしました。

資料にはそれ以外にも設定情報などが記載されていますが、
これは実際に構築してみないとピンとこなそうなため、今回は割愛。

「mysqlnd_ms」なるエクステンション情報を得たのだけど、PHP7対応がなされていなそうだったのでフィードバックをしました。

まとめ

レプリケーションの設定方法とポイントを学べたのが大変ためになりました。 また、今回のセミナーはOracle様から直接教えて頂き、初心者がDB構築し、レプリケーションの設定まで出来るようになるというとても素晴らしいセミナーでした。インフラエンジニアもさることながら、MySQLを操作する人も積極的に受けた方が良いのではと思いました。

追記

yoku0825さんにアドバイスを頂き、ブログを修正しました。 圧倒的感謝🙇

"MySQL 5.7 初心者向けセミナー"に参加した(前半)

普段はVimPHPJavaScriptSQLで戯れる日々を送っている私ではありますが、MySQLサーバ構築はyumやhomebrewなどで最低限の環境を構築した事しかありませんでした。MySQLサーバを構築する上で気をつけるポイントとレプリケーションの設定などが学べるという事で、「MySQL 5.7 初心者向けセミナー」にエントリーしました。

会場

大変きれいなフロアで電源・Wifiがある環境ですごく快適でした。

インストール、アーキテクチャ基礎編

資料

背景

DBの普及度ランキングはOracleMySQLがダントツで1、2位の人気を誇っているとの事です。マルチプラットフォームである事とダウンロードからデータベース起動まで15分以内に完了するという運用の容易性から2番目に人気なDBとしての強みだそうです。今回のセミナーの題材であるレプリケーションは3.23とだいぶ前に追加されています。その後、多々吸収合併が行われ、現在のOracle様で落ち着いたとの事です。当時は開発が止まるのではという心配があったのですがドンドン開発が進み現在8.0.1がリリースされています。

6,7が飛ばされた理由でとりわけ6が飛ばされた理由がとてもしっくり来ました。

リリースフロー

大きく分けて3フェーズとなります。

  • DMR:開発途上版(年2,3回リリース)
  • RC:リリース候補
  • GA:製品版

その他に実験的な機能追加バージョンがあります。

  • Lab Releases:評価されるとDMRに取り込まれる。

種類

MySQLにはサポートが受けられる商用版とコミュニティ版があるのは知っていましたが、商用版のライセンス周りでGPLでなくなるという所も重要なポイントなんだろうなと感じました。また、MySQL自体の製品にも種類がありMySQL ServerとMySQL Clusterは別商品で、「18.1.5 InnoDB を使用した MySQL Server と MySQL Clusterの比較」が参考になりそうです。まず第1に違うのはストレージエンジンが違います。この時点で私はMySQL Clusterを利用できる自信がなくなりました。そのくらいInnoDBは素晴らしいストレージエンジンだと思います。MySQL Clusterは障害耐性が高いらしいです。

インストール方法

インストールフローは非常にシンプルだった印象があり、私の認識とも大きく差異はありませんでした。インストール後はシステム変数(my.cnf, my.ini)を設定する必要があります。これはMySQLのデフォルト値の設定はあまり細かく設定されていないため、各サービスの想定に合わせて適当に設定する必要があるためです。 my.cnf以外にもコネクション中に一時的な設定変更(SET [GLOBAL|SESSION])が可能です。設定変更の中には再起動が不要なもの、必要なものがあります。 また、パスワード検証プラグインはデフォルトで有効となっている場合があり(yum, rpm, etc)、特殊記号などが必須となているなどセキュリティレベル高めです。

tarでのインストール方法も手順としてありました。 ステーブル版であれば不要だと思われるため、パッチ適用とかを想定した場合に覚えておいた方が良いのかもしれません。

資料にはシステム変数について触れていたのであとで確認します。 注意すべきシステム変数は特に違和感はありませんでしたが、設定しないと警告が出るシステム変数は注意が必要そうな雰囲気でした。 explicit_defaults_for_timestampをtrueに設定すると更新処理が自動で設定されるようですが、このシステム変数自体非推奨との事でこれに頼る思想のシステムは改修しておいた方が良さそうです。 これは先日調べて知った「MySQL5.6.5からDATETIME型で行生成時刻と更新時刻を自動でセットすることができるようになりましたよ」を使うべきところなんだと思われます。 secure_file_privはよく話題になるセキュリティホールになるポイントだからOFFがいいと思います。特定ディレクトリのみ読み込み可でも良いのかもしれませんが、運用経験がないためピンときませんでした。 また、log_errorを設定しないと初期パスワードがコンソールに出力されるため、流れてしまうという悲劇がありえます、こわいですね。

バイナリログは更新処理時のみ記録されるが、デフォルトでログ出力されてないない事が注意との事、後半のレプリケーション編にも影響し、 必ず設定した方が良さそうな感じを受けました。

アーキテクチャ基礎、操作例

クライアントプログラムに5.7.8からmysqlpumpが追加されました。 mysqlpumpはmysqldumpの後継的な位置づけで、使用条件が若干あり、(過去に作られ)廃れた機能の一部を廃止したとの事。 私はサーバサイドのアプリエンジニアなのでmysqldumpはよく使うため、だいぶ衝撃的でした。 mysqlpumpはあとで調べて別途使用方法はまとめて、積極的煽っていきたいと思います。 youku0825さんの記事が参考になりそう(参考になる)ので、ここにメモを残します。 yoku0825.blogspot.jp yoku0825.blogspot.jp

mysqlimportはすごく便利だと隣の席のイケメンに教えてもらったので、積極的に使っていきたいです。 使い方は自分なりにまとめたので、いいかな(割愛)。 github.com

通信プロトコル

基本的にはTCP/IPだけ覚えておけば良いけど、自分で小さなサービスを立ち上げる際には、 WebとDBが共存する形にすると思うので、その場合にはソケット接続にしたいと思いました。

デモ

tarからのデモを実演して頂いた。 DBを作るとディレクトリができ、テーブルを作成するとそのテーブルのエンジンに合わせて拡張子が設定されたファイルが作成されていた。 また、information_schemaはviewなので、/var/lib/mysql の下にディレクトリはないとの事で、なるほど度が高かったです。

クラスタインデックスも教えてもらい、 主キーのリーフノードにデータが格納されいているため、リーフが特定できた段階でデータフェッチが完了しているとの事。 セカンダリインデックスはBツリーを辿って主キーを特定して、主キーからデータを取得する。 ここで何気なく気になった事をつぶやいたら、youku0825さんに教えて頂き、スッキリ度が高かったです。

バイナリ?ログファイルは2ファイルを交互に使われます。 そのため、ファイルサイズが小さいと片方を消費後、もう片方に切り替えそちらもすぐに消費されてしまう。 すると前のファイルに切り替えるのだけど、relay_logへの反映などの処理完了に間に合わないなどの障害がありうるとの事、。

まとめ

レプリケーション編もあるので、一旦ここで〆。

FTP, SFTP, FTPS adn SCP Clients by PHP

bardicheというPHPプラグインを作り始めた。 きっかけはawesomeに無い事に気づいたからだ。 最近のトレンドなどにはめっぽう疎いが最新の機能を知るという意味も込めて、 率先して意味もなく最新の機能を投入した。

インターフェースを共通化させて、引数で処理を分岐している部分が、 PHPのインターフェースと相反するため、ココらへんは要修正項目で今後も改修したいと思う。

#vimconf2015 に参加した

vimconfへ先日行ってきました。会場は去年同様にmixiさんです。

f:id:kazuomabuo:20141109091952p:plain

スタッフ参加

今回はスタッフ参加で途中ピザを受け取りに行ってきました。 道中は高低差が多く、ピザが滑り落ちそうになるなどあまり速度が出せず、 行きで使ったルートがあまりにも台車には不向きだったため、帰りは別ルートで帰るなどありましたが、 無事配達できたので良かったです。

セッション

去年と違い発表している内容がある程度わかるようになった気がしました。 これは1年間、Vimに関しての情報追い、勉強してきたおかげだと思います。

@kamichidu さんのlibcall呼び出しは全く知らなかったので、 ユースケースが発生したら積極的に活用したいと思いました。

@lambdalisue さんのvim-gitaが良さそうだでした。 vim-fugitiveを入れてもステータスバーにどのブランチで開発しているか確認するためにしか利用していなかったため、だいぶ前に削除してしまい、それっきりでした。 vim-gitaに乗り換えるにあたってポイントは一度起動したVimは閉じない運用が必須な印象でした。(ターミナル運用を想定)
私はある程度できたらVimを閉じてUndo履歴を整理しているのですが、":h clear-undo"にある設定をvimrcに設定し、 また1つVimを閉じる必要がなくなりました。Vimshell, Vimfilerを入れて本格的にVimを閉じなくなるにはまだまだ時間がかかりそう。

突然ですが、ここでvimconf中に質問したアンケートの結果発表。 結果では必要なときに立ち上げる人が7割近くもあり、とても興味深い結果となりました。

最近、JavaScriptの気運が高まってきたのでとてもタイムリーな感じで、 @yoshiko_pg さんのフロントエンド目線からのスライドがすごく勉強になりました。 エディタの使い分けは必要だと思いますが、emmetをフル活用してその他のPluginでよしなに使いこなしてベースを作る速さはヤバかったです。

Vim

vimconf2015の日も開催した毎週土曜日のVimrc読書会を除いて最近、Vim活ができていなかったので、 GitHubで管理しているhombrew-macvimの(野良)formulaをTravisCIに対応させました。 設定方法をネットで調べながら、適時修正して無事にテストが通りました。

Attended "次世代 Web カンファレンス"

次世代 Web カンファレンスに行ってきました。
当日は河合塾の模試が会場である法政大学の1,2Fであり、他所では情報技術者試験もありで、
TwitterのTLが面白い感じに流れてました。

以下、カンファレンスのセッションメモの雑書き。

f:id:kazuomabuo:20151018230352p:plain

Accessibility

メタデータを改良し、ブラウザ等に解釈しやすいようにする「マシンリーダブル」、コンテンツ自体の色を反転するボタン、文字サイズの切替をするボタンなど、人が解釈しやすいようにする「ヒューマンリーダブル」という2種類の考え方。
ユーザがブラウザの機能を理解しているならば、文字サイズ切替ボタンは本来は不要ではあるが、モバイルサイトでは拡大を禁止するなどあるため、一概にボタンが不要とは言いきれないのも実情。

健常者である事を前提としたAccessibility。
わりとよくあるのは健常者で更に"日本語を理解できる人"を前提という問題がある。これに関してはどこまで許容するかで開発コストが肥大化するので、大変かなぁと思いました。

Googleで商品を検索すると価格まで出るのはメタデータのおかげという話。
スクレイピングで価格情報を取得する場合には、ページ内にある複数の料金情報から該当するものが判断できないため、メタデータに価格情報を埋め込む事でGoogleに理解できるようにしてあるとの事。

所感、マシンリーダブルの発展をすごく感じたし、もう少し理解を深める必要があるかなと感じた。

JS Next

ES6を利用している登壇者だが、IE8(ES3)は実際問題捨てられないという過去の精算ができていない感じから始まったセッション。
後半で出てきたが、BabelはES6からES5にトランスレータと出来るものらしい(名前は知ってたよ、名前は)。
ESはドンドン先に進んでいくが、ブラウザが追いついていない。その差分をBabelで吸収する形で今後も活用される存在になるだろうとの事。

ESの仕様はふんわり決まっていて、明確に決まっていないとの事。

"scriptタグは複数書ける"×"+attributeが複数ある"問題。
複数のJSが共通するJSをimportしている場合に、attributeが異なると問題が発生する。個人的にはimport方法のルールを共通するJS側で制御するのがいいんじゃないかという気がする。

TypeScirptでは型定義が出来るとの事(JS界隈わからなす)。
PHP7でも型宣言(関数の引数と返戻値)出来るので、やっぱり型大事、絶対。型宣言が良いのはエディタ(IDE)が理解しやすい事で、言われてみればという感じだった。

Standardization

@ourmaninjapan さんから言語の壁からの「そもそも英語が読み辛い」。@lef さんからIETFは章組立にルールがなく、とても読み辛い。@azu_re さんからES5の仕様書はWordだったという事に驚きました。全体的に保守的で昔のフォーマットを引きずっているが、GitHubを使ったりと変わりだしたとの事。
標準仕様を策定するにあたり、negotiationがとても重要、自分よりもその規格で詳しい(偉い人)に一人づつ勝っていき提案を通すのが、すごく生々しかった。

今のウェブはレンダリングエンジンにベッタリのため、実装は楽だが、
少しの事をやるにもレンダリングエンジンがフルフルについてくるのが問題である。

HTTP2

HTTP2はブラウザに対応してもらう事が待たれるとの事。
FireFoxは優秀、ChromeFireFoxに負けないために対応するだろうとの事。IEについては残念至極らしい。

並列に送る処理の中で優先順位という考え方があるが、「Priorityが銀の弾丸」だとは思わない方がいいとの事。

HTTPS(TLS)時代におけるTCPの負荷が高まる中で、TCPコネクションを束ね、HTTP2のメリットの高速化をはかるとの事。
特にGoogleTwitterなどの高負荷サイトで最高のエクスペリエンスを味わえると。

Monitoring

監視とは障害の検知だけでなく、将来を見据えたシステムの最適化などのために必要。
監視の間隔が1分でもスパイク見逃す時があるので辛い時もある。
インフラエンジニアが少ないので、ミドルウェアを大量に入れると手がまわらないので、
少ないミドルウェアを秘伝のタレで良しなにこなすのは知見というか、すごい。
最近のスタートアップは最初からMackerel、DataDogなどの監視SaaSを活用する傾向との事。
秘伝のタレを作る前から監視をしっかり+インフラエンジニアが少なく、サーバ/ネットワーク設定に人をさいている場合に良さそう。

RDSのようなマネージッドサービスが増えた反面、ブラックボックスが増えた。
ただ、全体的には負荷の軽減方向に寄せたい(切実。

感想

名前を知っているだけの知識が多く、全体的に初めての情報が多かった。
ココらへんは情報追ってるだけではわからない部分も多々あり、
アプリ開発をしている自分としてはJSの理解をもう少し深めたいかなという思いがある。