閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

JupyterLabでPHPをやる

GitHub - jupyterlab/jupyterlab: JupyterLab computational environment.

なんかPython以外にRとかも使えるらしい、というので見てみたら大体の言語に対応していた。

Jupyter kernels · jupyter/jupyter Wiki · GitHub

PHPも選べるなら結構いいかも、とJupyter-PHPを入れてみた。上記サイトにはIPHPというのも上がっているけどGitHub見たらJupyter-PHPの方がナウいよとあったのでこっちで。

GitHub - Litipk/Jupyter-PHP: A PHP Kernel for Jupyter
Jupyter-PHP's Installer by Litipk

インストーラもあるし手順も書いてあるのだけど、ZMQってなんやねんとなったのでメモ。

  • PHPをインストール(XAMPP入れていたのでこれをそのまま使った)
  • Composerをインストール。WindowsなのでComposer-Setup.exeを実行するだけ
  • PHP-ZMQWindows向けDLLをダウンロード
    • php.exeと同じフォルダにlibzmq.dllをコピー
    • php/extフォルダにphp_zmq.dllをコピー
    • php.iniに"extension=zmq"を追加
  • jupyter-php-installer.pharをダウンロードして"php jupyter-php-installer.phar install"を実行
    • ComposerやPHP-ZMQがないとここでコケる
  • 成功したらjupyter labでJupyterLabを起動するとKernelの選択肢にPHPが追加されている

f:id:wata_d:20180411142417p:plain

ちょっとしたプログラムを実行結果を確認しながら書けるの、とても便利です。REPLでもいいんだけどこっちの方がトライアンドエラーがやりやすい気がします。

PHPでChart.js

Web API的なアレで、DBから取ってきたデータをChart.jsで描画しようと思ったのだけどJSON書いてるとなんか混乱してきたので、APIが返すJSONをそのままChart.jsの形式にしてしまった。あんまり良くない気もするけど、どうなんだろなぁ。

最初C#で書いていたのだけど色々あってPHPASP.NETはまったく触ったことなかったのだけれど、ほとんどコードを書かずに済むのでこっちも楽そうです。

こういうクラスを作ってから

 // sample.php
<?php
 $chart = new Chart("bar");
 $chart->data->labels = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
 $ds = new DataSet();
 for ($i = 0; $i < 12; $i++) $ds->data[] = rand(0, 100);
 $chart->data->addDataSet($ds);
 echo json_encode($chart);
?>

こんなページを作って

 <!DOCTYPE html>
 <html>
 <head>
     <script src="Chart.bundle.min.js"></script>
     <script>
        window.onload = function() {
            // $.getJSON('sample.php') ...
            const xhr = new XMLHttpRequest();
            xhr.open('GET', 'sample.php', true);
            xhr.responseType = 'json';
            xhr.onload = function(e) {
                var ctx = document.getElementById('canvas').getContext('2d');
                new Chart(ctx, xhr.response);
            }
            xhr.send();
        }
    </script>
 </head> 
 <body>
     <canvas width="500" height="500" class="chartjs-render-monitor" id="canvas"></canvas>
 </body> 
 </html>

というような感じでそのまま突っ込むとチャートが出てきます。

Chart.jsはコールバック関数を設定することもできますが、PHPJSONを組み立てちゃうとそのあたりが利用できないのが結構大きなデメリットでしょうか。

window.onload = function() {
    // $.getJSON('sample.php') ...
    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'sample.php', true);
    xhr.responseType = 'json';
    xhr.onload = function(e) {
        var ctx = document.getElementById('canvas').getContext('2d');
        var data = xhr.response;
        var scales = {xAxes: [{
            type: 'category',
            ticks: {
                maxRotation: 0,
                callback: function(value, index, values) { return [value, (index+1) + "月"]; }
            }
        }]};
        data.options["scales"] = scales;
        new Chart(ctx, data);
    }
    xhr.send();
 }

みたいな感じで無理矢理追加することはできますが…。

JavaScriptで任意の文字列をクリップボードにコピーしたい(Chrome)

document.execCommand('copy') でブラウザで選択している文字列をコピーできるらしい。

任意の文字列を含む要素をでっち上げて一時的に選択してあげれば良いのかな?

var r = document.createRange();
var text = document.createTextNode("コピーしたい文字列");
r.selectNode(document.body.appendChild(text)); // body直下に突っ込んで
window.getSelection().addRange(r); // 選択して
document.execCommand('copy'); // コピー
text.remove(); // お役御免

雑だけど自分用ツール内ではこれでいいかな…。

LINQPadでグラフを描く

なんとなくLINQPadのサイト見たら最新のベータ版でChart()という拡張メソッドが追加されたみたい。

コレクションなどに生えるもので、System.Windows.Forms.DataVisualization.Charting.Chartの生成を一気に行ってくれる模様。Dump()するとそのままチャートが出てきます。

f:id:wata_d:20180319125711p:plain

お手軽だけどもうちょっと短くできそう。DumpChartの方が便利そう? 自分で作るのもアリかなぁ。

ケーブルテレビ屋さんにGoogle Home Miniをもらった

Miniなら今は3000円くらいになってるみたいだけど、わざわざ買うほどでもないかなぁと思っていたところにキャンペーンとかで頂きました。せっかくなのでセットアップして置いてみた。寝起きに目を開けたくないけど時間を確認したいという時に「ねぇGoogle、今何時?」と聞けるようになったのは有り難い(地味)。あんまり応用が思いつかないので他にニュースを聞く以外で使えるかは不明。リモコンとしても使えるみたいだけど声より手の方が早いし。…なんか、あまりプログラマに向いてない性格だな。

ついでにSTBやモデムも交換してもらった。BDレコーダー経由でテレビを見ていたけど、新しいSTBは1TB分録画もできるのでHDD尽きたレコーダーからこちらメインに乗り換えよう。

ネット回線もそこそこ速くなったし、これがきっかけで部屋も少し片付いたし割と良い1年の始まりになった気がします。って、もう3月なの……?

動画サイトの切り替え

バンダイチャンネルとdTVを解約してNetflixニコニコアニメチャンネルに加入した。ニコニコは、ほら、ニコ厨なんで…。

あとAmazonプレミアム、あまり使えてないんだけどなんとなく入っていて、これでAmazonプライムビデオも利用できるので現在お金払っているのはこの3種類ですかね。どれも大体内容はかぶっているけど、たまに独占配信とかあるので絞れなかったり。地上波でやっているのはテレビで見られるんだからそっち見ろって話なんですが、出先で見るのに一番手軽なのはやっぱりネット配信なので。日付変わる前には寝ているので深夜アニメをリアルタイムに見る選択肢も基本的にないんですよねぇ。

バンダイチャンネルは日本のサービスにしては(?)解約が非常にスムーズで良かったです。こういうサービスはまた戻ってこようかなという気になれますね。

ランチコースはいいぞ

「一人フレンチ」の楽しさを知ると人生は愉快になるかもしれない……西新宿の老舗での実例 - ぐるなび みんなのごはん

イタリアンやフレンチのお店ではお昼でも結構コースをやっているけど、ランチだと一人・予約無しでも問題無いところが多いので最近よく行きます。エンゲル係数なんか知るか、いつまで生きられるかわからないんだから好きな物を食べるんだよ!

まあランチなので1200~2500円くらい、いいところでも5000円とかで言うほど高くもないです。昔は肉か魚かと言えば肉を選んでいましたが、こういうところの魚料理はおいしくて最近は魚を選ぶことが多いです。寿司とか刺身もいいけど、白身魚のソテーとかちょううまい。

難点があるとすればメイン料理が目当てでも「パスタ」or「パスタ+メイン」みたいなお店が結構多いこと。小食且つ食事制限もあると、パスタ抜きも提供してほしいなあ…と思うことがあります。それでもコンディションを整えて全部入りを食べ、且つ週明けの血液検査もスルーできるかゲームもたまにやりますが。今はわりと常食食べても誤魔化せているけれど、年取っても同じようにできるかわからないし、より小食進みそうな気もするので、食に関してはいまのうちに楽しんでおきたいところ。