プロトタイピング=試作品の制作を気軽に始めてみよう!

プロトタイピング=試作品の制作を気軽に始めてみよう!

JavaScript学習に役立つお話がありました。 「プロトタイピング」でプログラムを試作する練習について紹介されています。 www.webprofessional.jp (前回に引き続き、今回もこのお話から学んでみたいと思います。) jsstudy.hatenablog.com アプリ作成の進め方として、以下の手順が紹介されています。 最初に基本を身に着けよう 計画を立てる コード無しで書いていく 小さな部分に分けて製作する 各パーツを結合する 実験とテスト 外部の助けを求める コードのリファクタリング(再構築) 試行錯誤の重要性 現実には、プロジェクトは完璧なコードをガンガン書くことではな…

TypeScriptの総称型(Generic Type)

TypeScriptの総称型(Generic Type)

JavaScript学習のついでに、TypeScriptも学んでみます。 今日は、TypeScriptの「総称型」という機能について調べてみました。 総称型とは? 総称型の仕組み 型引数とは? 型の情報(種類)を入れておく変数 用語 総称型とオーバーロードの違い (1)似た機能の関数がバラバラに用意されている状態 (2)引数を使って似た機能をまとめた関数 (3)引数のデータ型が違うけど、機能が似ている関数 (4)「Any型」で全部の型を引き受けられる関数 (5)オーバーロードで型チェックを実現した関数 オーバーロード(多重定義)とは? シグネチャーとは? (6)総称型でオーバーロードした関数を…

JavaScriptでmacOSを自動操作できるJXA

JavaScriptでmacOSを自動操作できるJXA

JavaScriptに、ちょっと便利な用途がありました! Macには、操作を自動化できるAppleScriptという道具が用意されています。 このAppleScriptの代わりに、JavaScriptも使えるようになっていました。 JavaScript for Automation (JXA)とは? qiita.com AppleScriptの代わりにJavaScriptを使えるようになってました。 Yosemiteからの新機能だそうです。 JXAとも呼ばれています。 そもそも、AppleScriptって何? AppleScript - Wikipedia AppleScript(アップルスク…

Windows Subsystem for Linux上でphp-fpmを動かしてみた

Windows Subsystem for Linux上でphp-fpmを動かしてみた

最近のWindows 10にはLinuxバイナリをそのまま動かすような仕組みが導入されています。これは Windows Subsystem for Linux (WSL) とか Bash on Ubuntu on Windows (BoW) などと呼ばれているもので、VM実行でなくWindowsネイティブでLinuxを動かすという意欲的な取り組みです。


この環境で最新版のPHPをソースコードからビルドし、アプリケーションサーバとして動作させてみました。


本稿執筆時点(2017年5月)ではWSL自体がまだ不安定な印象ですが、nginx+php-fpmを動作させることができました。以下はWindowsのlocalhost 80番ポートでPHPが動作している証拠画像です。「System」欄のunameの表示にMicrosoftという文字列が入っているのがオシャレですね。


f:id:hnw:20170502120845p:image


以下、WSL上でnginx+php-fpmを動かすまでの手順を紹介します。


WSLのセットアップ

Bash on Ubuntu on Windows - Installation Guide」に従ってセットアップします。


PHPのビルド

まずはWSL上でPHPをビルドしてみましょう。


コンパイル済みバイナリをaptでインストールしてもいいのですが、普通にビルドできる程度にWSLが安定してるのかな?という興味から自前ビルドしてみました。


まずは必要パッケージをインストールします。


$ sudo apt update
$ sudo apt install build-essential libxml2-dev zlib1g-dev libcurl4-openssl-dev \
    libjpeg62-dev libpng12-dev libmcrypt-dev libreadline-dev libtidy-dev \
    libxslt1-dev libssl-dev libbz2-dev git autoconf

今回はphpenv+php-buildでPHPをビルドします。


$ curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
$ mkdir $HOME/.phpenv/plugins
$ cd $HOME/.phpenv/plugins
$ git clone https://github.com/php-build/php-build.git

下記の内容を .bashrc に追記してシェルを再起動します。


PATH=$HOME/.phpenv/bin:$PATH
eval "$(phpenv init -)"

あとはphpenv経由でPHPをビルドするだけです。


$ PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.1.4

ビルドにはかなり時間がかかるので注意してください。筆者の手元のマシン(Thinkpad X260、Intel Core i7 2.5GHz)で30分以上かかりました。同じビルドが12インチMacBook(Early 2016、Intel Core m5 1.2GHz)で10分を切ることを考えると、まだお仕事で使えるレベルではない印象です。今後のパフォーマンスチューニングに期待しましょう。


ちょっと遅いことを除けば、ビルド自体は正常に終了します。ここまでは普通のLinuxと大差ありません。


nginx+php-fpmの設定

つぎに、nginxをaptでインストールします。


$ sudo apt install nginx

設定ファイル /etc/nginx/sites-enabled/default の設定のうち、下記部分のコメントアウトを外して有効化します。


        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass 127.0.0.1:9000;
        }

nginxを再起動します。


$ sudo service nginx restart

php-fpmの方はデフォルトの設定ファイルをコピーしてそのまま使います。


$ cd $HOME/.phpenv/versions/7.1.4/etc/
$ cp php-fpm.conf.default php-fpm.conf
$ cp php-fpm.d/www.conf.default php-fpm.d/www.conf

下記コマンドでphp-fpmを起動します。


$ $HOME/.phpenv/versions/7.1.4/sbin/php-fpm

ここで /var/www/phpinfo.php などを設置すれば、nginx経由でphp-fpmを利用することができます。


ただし、この設定だと1秒に1回下記のエラーが出続けます。getsockopt(2) の実装がまだ不完全のようですね。


[01-May-2017 20:06:06] ERROR: failed to retrieve TCP_INFO for socket: Protocol not available (92)
[01-May-2017 20:06:07] ERROR: failed to retrieve TCP_INFO for socket: Protocol not available (92)
[01-May-2017 20:06:08] ERROR: failed to retrieve TCP_INFO for socket: Protocol not available (92)

TCPでのプロセス間通信に問題があるならunix domain socketにすればいいじゃない、と考えてunix domain socketも試してみたのですが、phpinfo() の結果が途中で切れてしまうようです。こちらも実装が不完全なようで、16KB超のデータがうまく扱えないとか、そんな制限がありそうな挙動に見えました。TCPの方がまだ安定している状況だといえるでしょう。


まとめ

WSLはまだbeta版なので過度の期待をする方が悪いと言えばそうなのですが、まだ性能が出なかったり未実装のシステムコールもあったりで、お仕事で使えるようになる日は遠いかな、という印象を持ちました。


とはいえ、長期的に期待できる技術なのは間違いないところでしょう。さらなる安定と正式リリースが待ち遠しいですね。

オブジェクト指向の用語「プロパティ」「メソッド」

オブジェクト指向の用語「プロパティ」「メソッド」

JavaScriptの勉強をしていて、説明の順番を変えた方がいいかも?と思われる箇所がありました。 →「オブジェクト」という仕組みと、その用語についてです。 jsstudy.hatenablog.com windowやdocumentなど、すべてのオブジェクトは、メソッド以外に「プロパティ」を持っています。 オブジェクトのプロパティとは、そのオブジェクトの状態を表すものです。 「オブジェクト」「プロパティー」「メソッド」…英語の専門用語がいきなりたくさん出てくると、訳が分からなくなるかも!? JavaScriptの教材を作る場合、 先に、データ構造(変数、定数、配列など)の話を出す。 次に、オ…

オブジェクト指向って便利なの?

オブジェクト指向って便利なの?

プログラミングのやり方って、いろんな方法が考えられてきました。 何かを作るとき、ゼロから作るのは大変だけど、先人の努力や工夫を拝借して作ると、その分だけ楽ができますね! プログラミングのやり方はまだまだ発展途上=改善の余地があるんだろうけど、現状はどうなっているのでしょうか? shokuren.hateblo.jp オブジェクト指向のやってることはわかるけど、説明してる人の何が言いたいのかはわからん 疑問が2つ。 一人で作ってて、小規模な案件なら、むしろ書く量が増えて面倒だったりしません? なので、そうしないほうがいいこともある?というのが一つ。 腕が上がるとor効率化を図るといつの間にかオブ…

JavaScriptで継承を使わないプログラミングスタイル

JavaScriptで継承を使わないプログラミングスタイル

JavaScriptでは「継承による差分プログラミング」はモダンではない、という意見がありました。 なるほど、「継承による差分プログラミング」を使わないスタイルもあるんですね?(参考になります) jsstudy.hatenablog.com オブジェクト指向って便利なの? - JavaScript勉強会 うへええええ継承による差分プログラミングとか現代に言わないでくれよ。しかも「JSはプロトタイプベースのOOP」を初めとして間違いが多いぞ 2017/03/27 09:42 b.hatena.ne.jp (1) 継承による差分プログラミングは、現代では廃れた古い手法? (2) JavaScrip…

JavaScriptはプロトタイプベースのオブジェクト指向プログラミング言語ではない!?

JavaScriptはプロトタイプベースのオブジェクト指向プログラミング言語ではない!?

先日のブログ記事に、たくさんのブックマークをいただきました。 どうもありがとうございます★★★ jsstudy.hatenablog.com ブックマークのコメントで、こんな意見がありました。 オブジェクト指向って便利なの? - JavaScript勉強会 うへええええ継承による差分プログラミングとか現代に言わないでくれよ。しかも「JSはプロトタイプベースのOOP」を初めとして間違いが多いぞ 2017/03/27 09:42 なるほど、そういう見方もあるんですね?(参考になります) (1) 継承による差分プログラミングは、現代では廃れた古い手法? (2) JavaScriptはプロトタイプベー…

プログラミング学習で擬似コードを活用しよう!

プログラミング学習で擬似コードを活用しよう!

JavaScript学習に役立つお話がありました。 「擬似コード」でロジックを書き出す練習について紹介されています。 www.webprofessional.jp JavaScriptに限らず、プログラミングの基本を学んだら何か動くモノ(プライベートプロジェクト)を作ってみたくなります。でも実際にどうやって進めたらいいのでしょうか? 現実には、プロジェクトは完璧なコードをガンガン書くことではなく、たくさんの試行錯誤とリファレンスを幾度も参照して少しずつできあがるものなのです。 アプリ作成の進め方として、以下の手順が紹介されています。 最初に基本を身に着けよう 計画を立てる コード無しで書いてい…

リファクタリング=読みやすいプログラムを書こう!

リファクタリング=読みやすいプログラムを書こう!

JavaScript学習に役立つお話がありました。 「リファクタリング」でプログラムを改善する練習について紹介されています。 www.webprofessional.jp (前回に引き続き、今回もこのお話から学んでみたいと思います。) jsstudy.hatenablog.com アプリ作成の進め方として、以下の手順が紹介されています。 最初に基本を身に着けよう 計画を立てる コード無しで書いていく 小さな部分に分けて製作する 各パーツを結合する 実験とテスト 外部の助けを求める コードのリファクタリング(再構築) リファクタリングとは? reの意味 - 英和辞典 Weblio辞書 re‐ 【…

– PR –
– PR –