タグ

ブックマーク / hnw.hatenablog.com (19)

  • go-shellwordsでUnixシェル的なものを実装した - hnwの日記

    私はSlackの入力テキストに対応して外部コマンドを起動するbotをGoで自作しています。このbotに最近「&&」などUnixシェルの演算子を部分的に実装したのですが、その際go-shellwordsが便利だったという話を紹介します。 私の作っているSlack botの簡単な紹介 私の作っているSlack botは入力テキストのパターンマッチを行い対応する外部コマンドを実行するようなものです。実行例を下記に示します。 自作Slack botの実行例 この例では銀行サイトから情報取得するNode.jsスクリプト2つ(口座振替照会、残高照会)を連続で実行して銀行引落に必要な残高があるかを確認しています。 go-shellwordsとは go-shellwordsはmattnさん作のGoライブラリで、コマンドライン文字列を受け取ってコマンド引数の配列を返すようなものです。 Goのexec.Com

    go-shellwordsでUnixシェル的なものを実装した - hnwの日記
    atm_09_td
    atm_09_td 2021/01/18
  • Mackerelで家庭内ネットストーカーシステムを作ってみた - hnwの日記

    エントリはMackerel Advent Calendar 2017の23日目の記事です。 自宅の無線LANの利用状況をMackerelで監視するようにしたところ、予想以上にキモい仕組みができました。たとえば、家族の誰か(正確には誰かのスマートフォン)が外出するとSlackに通知を飛ばすことができます。 同じことをしている人は多くないと思うので、その知見を紹介します。 システム概要 まずは我が家のネットワーク構成を紹介します。 インターネットに接続しているブロードバンドルータがあり、無線経由でスマートフォンやPCがぶら下がっているような、ごく普通のネットワーク構成です。唯一変わっている点は、ブロードバンドルータ上でLinuxおよびMackerelエージェントが動いていることでしょう。 このルータの詳細は稿では省きますが*1、ザックリ言うとRaspberry Pi 3を無線LANアクセス

    Mackerelで家庭内ネットストーカーシステムを作ってみた - hnwの日記
  • MySQLのFLOAT型を使う理由が見つからない件 - hnwの日記

    MySQLのデータ型としてFLOAT型という型があるのですが、これを採用するのは混乱の元ではないか?と感じたので、その詳細を紹介します。 そもそもこの話のきっかけは「MySQLで6桁までの小数点を丸めずに扱うならFLOAT型を使うべき理由」という記事が目に止まったことです。それなりに人気を集めている記事のようですが、私の読んだ限りではFLOAT型を使うだけの根拠が文中から読み取れず、さらに類似する一次情報や英語記事が全く見つからなかったので、真偽が怪しい情報だと感じました。 その後、MySQL上で実験したりCソースコードを読んでみたりした結果、私の得た結論は真逆のものになりました。MySQL警察の方や浮動小数点数警察の方、追試や反論など頂けると助かります。 MySQLのFLOAT型とは MySQLのFLOAT型は原則としてIEEE754浮動小数点数単精度型(32bit)で実現されます*1。

    MySQLのFLOAT型を使う理由が見つからない件 - hnwの日記
  • 江戸前セキュリティ勉強会でgithub.comの弱い鍵を探す話をしました - hnwの日記

    先週1/24(土)に江戸前セキュリティ勉強会で「偶然にも500万個のSSH公開鍵を手に入れた俺たちは」というタイトルでLT発表してきました。以下が発表資料です。 このプレゼン資料はLT用に圧縮して作ったので、わかりにくい部分があったかもしれません。そこで、Q&A形式で補足を書いてみました。 「多数の公開鍵から共通の素因数を探す攻撃はSSHユーザー鍵についても現実的脅威なのか?」 結論から言うと、SSHユーザー鍵に限れば脅威でないというのが個人的な考えです。 今回、論文「Mining Your Ps and Qs: Detection of Widespread Weak Keys in Network Devices」(PDF)を参考に多数のRSA公開鍵から最大公約数を求めるような攻撃をSSHユーザー鍵について試してみました。元論文では、この攻撃はSSHホスト鍵とSSL証明書に対して行われ

    江戸前セキュリティ勉強会でgithub.comの弱い鍵を探す話をしました - hnwの日記
  • Javaで書かれたPHP処理系のJPHPが高速だった - hnwの日記

    JPHPというJavaで書かれたPHP処理系があります。これは2013年10月にはじまった新しいプロジェクトで、大半をメイン開発者一人で開発しているようですが、既に一定以上の完成度です。また、内部的にはPHPファイルを解釈して直接Javaバイトコードにコンパイルしており、かなり高速なPHP処理系になっています。 他のPHP処理系と異なり、既存のPHPコードをWebサーバ上で動かすことを重視していないようにも見えますが、興味深いプロジェクトですので紹介します。 JPHPを動かしてみる さっそくJPHPを試してみましょう。現時点ではGitHubからソースコードを持ってきてビルドする必要があります。JDK7以上が必要ですので注意してください。JPHPのドキュメント「Getting Started」の通り、次のようにしてJPHPがビルドできます。 $ git clone https://githu

    Javaで書かれたPHP処理系のJPHPが高速だった - hnwの日記
  • PHPのJava実装であるQuercusをCLIで動かしてみた - hnwの日記

    今日は有名PHP実装の一つであるQuercusを紹介します。これはJavaサーブレットコンテナResinを開発しているCaucho社が開発しているもので、当然のことながらJava環境で動作します。既存のPHPコードを動かすのにJava環境のノウハウや資産が生かせれば良いところ取りができるわけで、野心的なプロジェクトだと言えるでしょう。前回記事「MacOSX上で.NET環境向けPHPコンパイラPhalangerを動かしてみた」で紹介したPhalangerと似た発想ですね。 今回はコマンドラインからQuercus単体で使ってみました。いちいちアプリケーションサーバをセットアップしなくても気軽に試せるのは嬉しいところです。 QuercusをCLIから動かす Quercusには「com.caucho.quercus.CliQuercus」というコマンドラインインターフェース用のクラスが提供されてい

    PHPのJava実装であるQuercusをCLIで動かしてみた - hnwの日記
  • MacOSX上で.NET環境向けPHPコンパイラPhalangerを動かしてみた - hnwの日記

    (1/7 追記)ベンチマークテスト結果が不正確だったので、再測定して書き直しました。以前の記事よりもPHPの結果が良くなっています。 あけましておめでとうございます。このたび、gihyo.jpの新春特別企画として記事「PHP処理系の未来」を寄稿いたしました。HHVMとPHP7を絡めて最近のPHPの動向を紹介するような内容になっていますので、是非ご覧くださいませ。 この記事を書くにあたり、HHVM以外にも有望なPHP処理系があるかどうかを調べていました。その結果、HHVMほどではないにせよ実用レベルに近いPHP処理系が複数あることがわかりました。 そうした実装のうち、今回は.NET FrameworkおよびMono環境で動くPHPコンパイラPhalangerを紹介します。PhalangerはC#で書かれており、PHPソースコードから.NETアセンブリを出力します。Windows上では家PH

    MacOSX上で.NET環境向けPHPコンパイラPhalangerを動かしてみた - hnwの日記
  • PHP7はなぜ速いのか(zval編) - hnwの日記

    この記事はPHP Advent Calendar 2014の7日目です。 僕は先日のPHPカンファレンス2014でPHP7に関するLTをしました(参照:「PHPNGの動向」)。ただ、時間が限られていたこともあり、あまり踏み込んだ内容には触れませんでした。 稿ではLTの内容から深掘りし、zvalという内部的な構造体がどう変わるのか、性能面のメリットにフォーカスして解説してみます。 PHPをとりまく状況 まず最近のPHPの話題をおさらいしておきましょう。 これまでPHPには実用レベルの別実装が存在しない状態が続いていましたが、HHVMの登場で状況が変わってきました。HHVMはFacebookが開発しているPHP実行環境で、PHPより高速で互換性も高いのが特徴です。Facebookで実際に利用されているだけでなく、他の企業でも商用サービスで利用する事例が増えてきています。 そんな中、2014年

    PHP7はなぜ速いのか(zval編) - hnwの日記
  • PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記

    PHPの==は両辺を適当に型キャストしてから比較するような演算子です。この型キャストの規則は難解すぎる上にドキュメントも不十分なため、PHPプログラマでも完璧に理解している人はほとんど居ないくらいの印象です。バグの原因になりかねないため、なるべく==を使わないようにしているPHPプログラマも多いはずです。 ところで、この==演算子の挙動がPHP 5.4.4から変更されていることはあまり知られていません。稿ではこの内容を紹介します。 Bug #54547 の騒動 まずはこの仕様変更の経緯を紹介します。 2年ほど昔、Hacker Newsで2^63付近の整数に対応する文字列をPHPで比較したときの挙動がおかしいというスレッドが盛り上がったことがありました。具体的には、PHPでは「'9223372036854775807' == '9223372036854775808'」がtrueになるとい

    PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記
  • 平方数かどうかを高速に判定する方法 - hnwの日記

    平方数とは、ある整数の平方(=二乗)であるような整数のことを言います。つまり、0,1,4,9,16,...が平方数ということになります。 ところで、与えられた整数が平方数かどうかを判定するにはどうすれば良いでしょうか。与えられた整数の平方根の小数点以下を切り捨て、それを二乗して元の数になるかどうか、というのがすぐ思いつく実装です。 <?php function is_square($n) { $sqrt = floor(sqrt($n)); return ($sqrt*$sqrt == $n); } しかし、平方根の計算は比較的重い処理です。もっと高速化する方法は無いのでしょうか。 多倍長整数演算ライブラリGNU MPには平方数かどうかを判定するmpz_perfect_square_p関数が存在します(PHPでもgmp_perfect_square関数として利用できます)。稿ではこの実装

    平方数かどうかを高速に判定する方法 - hnwの日記
  • Emacs起動時に自分好みのelispを自動的にインストールする - hnwの日記

    (2015/04/27追記)Emacs24.4付属のpackage.elでは「野良elispをpackage-installする」が動かなくなっていました。中の人が想定してない使い方で頑張るより、必要なものはMELPAにぶっこんでいくスタイルの方が正しい気がしますね…。 自宅と会社など、複数環境でEmacsを使っていると全環境を同じ状態に保つのは意外と手間がかかります。GitHubなどを利用してinit.elを共有すればそれなりに同じ状態にできますが、完全に同じ状態にしようと思うとelispのインストール状態も共有する必要があり、これが案外面倒だったりします*1。 そこで、init.el内に自分が必要なパッケージ名を列挙しておいて、起動時にインストールされていないパッケージがあったらpackage.elでインストールする仕組みを導入しました。さらに、URLで指定されたelispをpacka

    Emacs起動時に自分好みのelispを自動的にインストールする - hnwの日記
  • Emacsで一度開いたファイルのカーソル位置を覚えておく - hnwの日記

    タイトルの通りなんですが、init.elに下記のように書くと一度開いたファイルのカーソル位置を記憶し、再度開いたときに元のカーソル位置を復元してくれます。 ;; 以前開いたファイルを再度開いたとき、元のカーソル位置を復元する ;; http://www.emacswiki.org/emacs/SavePlace (when (require 'saveplace nil t) (setq-default save-place t) (setq save-place-file "~/.emacs.d/saved-places")) それ便利なの?と思う人もいると思いますが、一週間前の作業の続きをやるような場合は便利です。普段はどうでもいい機能ですが、邪魔にはならないのでトータルではメリットの方が大きいと感じています。 session.elを使っているときはデフォルトがこういう挙動だったんです

    Emacsで一度開いたファイルのカーソル位置を覚えておく - hnwの日記
  • hardlink.pyを使ったらディスクの空き容量が劇的に増えた - hnwの日記

    ノートPCを使っているとディスクの空き容量が不足してくることがありますよね。僕の場合、$HOME/src/php以下にPHP 5.0.0から5.5.5まで88バージョンのPHPのソースコードを展開しているのですが、このサイズが約8.9GiB、約110万ファイルと恐ろしい量であることがわかりました。 そこで、この全ファイルに対してhardlink.pyを適用してみたところ、7.7GiBほど空き容量が増えました。稿ではこのhardlink.pyについて紹介します。 hardlink.pyとは hardlink.pyは、同じファイルを見つけてhardlinkにしてくれるPythonスクリプトです。同じファイルが多ければ多いほどディスクの空き容量を節約できるというわけです。 同じファイルと見なす条件はオプション指定で変更できますが、僕は「ファイルの中身とオーナーとパーミッションが完全一致、ただし

    hardlink.pyを使ったらディスクの空き容量が劇的に増えた - hnwの日記
  • ワンライナーのためのPHPコマンドラインオプション - hnwの日記

    ワンライナー(1行スクリプト)の代名詞と言えばPerlでしょう*1。Perlにはワンライナー向けのコマンドラインオプションが多数用意されています。中でも-neオプションや-peオプションは強力で、入力行ごとの処理をループを使わずに簡潔に記述できます。Perlのワンライナー向けコマンドラインオプションの一部はRubyにも輸入されており、Rubyプログラマもワンライナーを書くことが多いように見えます。 それに比べるとPHPはワンライナーが書きにくい印象があるのではないでしょうか。僕もそう思っていましたが、実はPHP5.0.0からワンライナー向けのコマンドラインオプションが追加されています。それが今回紹介する-R、-F、-B、-Eです。 -Rオプション、-Fオプション -Rというのは、標準入力を1行ごとに順に処理するオプションです。例を見てみましょう。 $ ls bin/php-* bin/ph

    ワンライナーのためのPHPコマンドラインオプション - hnwの日記
  • HerokuのBuildpackを利用してmbstringが有効なPHPサーバを立ててみた - hnwの日記

    HerokuといえばRubyのPaaSという印象が強いのは僕だけでしょうか。しかし、Herokuの現在の最新環境であるCedarでは下記の7つのプラットフォームをサポートしているんだそうです。(出典:The Celadon Cedar Stack | Heroku Dev Center) Clojure Facebook Java, Spring or Play Node.js Python or Django Ruby or Rails Scala このうちFacebookだけが異彩を放っているんですが、説明を読んでみるとFacebookアプリに特化したもののようで、バックエンドの言語としてはRuby, Node.js, Python, PHPが使えるらしいです。(出典:Getting Started with Your Facebook App on Heroku | Heroku D

    HerokuのBuildpackを利用してmbstringが有効なPHPサーバを立ててみた - hnwの日記
  • WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記

    新年あけましておめでとうございます。今年もボチボチやっていきます。 稿ではPHP製のWebスクレイピングライブラリGoutteを紹介します。 Goutte(グット)とは Goutteは必要十分な機能を持ったWebスクレイピングライブラリです。そもそもWebスクレイピングというのは、外部Webページから必要なデータを取ってくるくらいの意味です。つまり、GoutteはWebスクレイピングを簡単に行う道具だと考えればいいでしょう。 具体的には、GoutteはWebクローラとHTMLパーサを組み合わせたようなものです。Cookieやフォームの扱いなどWebブラウザとしての機能は一通り揃っていますし、CSS風の要素指定もできるなど、機能面では他のライブラリと遜色ないように感じます。 さらに僕個人がGoutteに期待している点は、安定性とロングサポートです。Goutteは主要機能をSymfony2お

    WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記
  • 浮動小数点数の丸め処理を見比べてみる - hnwの日記

    各種プログラミング言語には、切り上げ・切り捨て・四捨五入など浮動小数点数を丸める関数が何種類もあります。こうした丸め処理を利用する際、「ceilとfloorどっちがどっちだっけ?」「マイナスの数が来た時の挙動って大丈夫なんだっけ?」などと不安になることはないでしょうか。 僕が丸め関数を使うときは、バグが無いかどうか他の場所以上に警戒します。というのも、これらの関数は境界値ピッタリだった場合の挙動とマイナスの数に対する挙動がそれぞれ違っており、勘違いや考え漏れから境界値バグを作り込みやすいためです。僕と同じ感覚の人も多いのではないでしょうか。 稿では、こうした関数の挙動が一目でわかる便利なグラフを紹介します。このグラフは『WEB+DB PRESS Vol.57』に掲載いただいた僕の記事「PHP転ばぬ先の杖 第2回 数値の正しい扱い方 ― 浮動小数点数、巨大な整数」でも紹介したものです。以下

    浮動小数点数の丸め処理を見比べてみる - hnwの日記
  • 第4回Symfony2勉強会でLT発表してきました - hnwの日記

    去る6月4日、第4回Symfony2勉強会でLT発表してきました。以下が発表資料です。 発表資料:「PHPUnitのMockObjectの紹介」(slideshare版)(PDF版) 僕だけSymfony2と何の関係があるの?という感じのタイトルでしたが、案外好評だったように思います。懇親会でも何人かに声をかけて頂いて、このあたりの話題は結構ニーズがあるんだなーと感じました。 スタブとモックの違いについては伝えるのが難しいかと思っていたのですが、伝わったよ、と言ってくれた人がいて、安心しました。ちなみに文中で触れているMatrin Fowlerのブログ記事は下記です。 「Mocks Aren't Stubs」 発表中、Martin Fowlerはモックによるテストに懐疑的なようだ、という話を紹介しました。もう少し詳しく紹介すると、モックで「ふるまい」のテストを書くためには、どう実装するか

    第4回Symfony2勉強会でLT発表してきました - hnwの日記
  • GitHubへpull requestする際のベストプラクティス - hnwの日記

    みなさん、Git使ってますか?僕はまだメインのVCSがSubversionなのもあって、なかなか慣れません。せっかくGitを使っているのに、ちょっと不便なSubversionくらいの位置づけです。でも、同じような理解度の人って多いんじゃないでしょうか。 一方で、最近はGitHub管理のオープンソースプロジェクトが増えてきました。バグレポートを送るにしてもpull request*1が前提のような空気があり、Git初心者には少し敷居が高い印象があります。 そんな僕も先日初pull requestをしてみたんですが、色々な失敗の積み重ねで残念なpull requestになってしまいました。その反省を元に、稿ではpull requestする際のベストプラクティスを紹介します。これは「Git Workflow」をベースにコマンド例などを加筆したものです。 概要 pull requestする際は、

    GitHubへpull requestする際のベストプラクティス - hnwの日記
  • 1