OANDAのREST APIでサブアカウントを作ると新サブアカウントで旧アクセストークンが使えない。


OANDAで「サブアカウント」を作成して、新しいサブアカウントのアカウントIDでAPIをたたくと、

CODE 4
The access token provided does not allow this request to be made

というエラーでアクセストークンが使えないことがある。

この場合は、アクセストークンを再発行するとメインアカウントもサブアカウントも同一のアクセストークンで認証できるようになる。

単純に再発行するだけでおk。

備忘録として。

ランサムウェア「WannaCry」についてWindowsユーザが対応しなくちゃいけないことを要約するよ


その1:つまりどういうこと?

ランサムウェア「WannaCry」がなんなのか、についてはここでは説明をハショルよ。詳しくは自分でしらべてね。ここでは、極悪ウィルスが蔓延しててチョー・ヤヴァイ程度に思っててね。

ランサムウェア「WannaCry」の対応するにはマイクロソフトのセキュリティアップデート「MS17-010:Microsoft Windows SMB サーバー用のセキュリティ更新プログラム (4013389)」が適用されていないとヤヴァイいのね。

参考:【マイクロソフト本家】
マイクロソフト セキュリティ情報 MS17-010 – 緊急
https://technet.microsoft.com/ja-jp/library/security/ms17-010.aspx

その2:アタシのPCはどうなのよ?

自身のPCに「MS17-010」が入っているかは以下のコマンドで確認できるよ。

コマンドプロンプトを開いて(Windowsキー+R → 「cmd」って打てば起動するよ)以下のコマンドを実行してみる。

Windows 7の場合
(以下のいずれか)

wmic qfe list | find "KB4012212"
wmic qfe list | find "KB4012215"
wmic qfe list | find "KB4015549"
wmic qfe list | find "KB4019264"

Windows8.1 の場合
(以下のいずれか)

wmic qfe list | find "KB4012213"
wmic qfe list | find "KB4012216"
wmic qfe list | find "KB4015550"
wmic qfe list | find "KB4019215"

Windows XP or Windows8 の場合

wmic qfe list | find "KB4012598"

Windows Vista の場合

wmic qfe list | find "KB4012598"

このコマンドを実行してみて「なにも表示されない or なにも反応しない」場合はキミのPCに「MS17-010」は入っていないよ。逆に何か反応したら入ってるから大丈夫だよ。

Windows Updateをしっかりやっていても前述コマンドを実行してもなにもが出てこないことがあるよ。この場合、対応する必要がないか対応する必要があるのかウィルスに感染してみないとわからないよ。だったら対応しといたほうがいいよね。ってことで次のステップへGOだよ。

そのほかのOSについては↓の参考URLをみてね。

参考:【マイクロソフト本家】
[WannaCrypt] MS17-010 の適用状況の確認方法について (WSUS)
https://blogs.technet.microsoft.com/jpwsus/2017/05/15/wannacrypt-ms17-010-%E3%81%AE%E9%81%A9%E7%94%A8%E7%8A%B6%E6%B3%81%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

その3:具体的になにすればいいのよ?

「MS17-010」が入っていなければ以下からダウンロードしてインストールしてね。

開くといろいろなダウンロードがあるけど基本的に自分のOSに合致するものをダウンロードして実行すればおk。

Windows 7 の場合
http://www.catalog.update.microsoft.com/search.aspx?q=4012212

Windows XP or Windows8 の場合
http://www.catalog.update.microsoft.com/search.aspx?q=4012598

Windows8.1 の場合
http://www.catalog.update.microsoft.com/search.aspx?q=4012213

Windows Vista の場合
http://www.catalog.update.microsoft.com/search.aspx?q=4012598

以上。

エイスースのモバイルノート「ASUS Vivobook E200HA」を2年弱使って見えたメリットとデメリット


少し前に【これは絶対に買い】エイスースのモバイルノート 11.6型ディスプレイ ASUS VivoBook E200HA を3か月ほど使ったのでその感想とレビューという記事を書いた。そこからしばらくたって、いまでも愛機として使用しているエイスースのモバイルノート「ASUS VivoBook E200HA」を再レビューしてみたいと思う。

結論から言えば、あまり評価は変わっていない。ただ致命的だった点もいくつか出てきた。そこをお読みいただき、ご自身が購入される際の参考にしていただければと思う。

処理速度について

使う人によるかもしれないが処理速度は圧倒的に非力だ。「3万以下のノートに処理速度期待するんじゃねぇ」というご意見はもっともだ。だけど開発環境やゲームなどは動かなくても仕方がないと割り切れるのだけど、メールソフトの「Thunderbird」は動いてほしかった。ちなみにこの「Thunderbird」を起動すると10分近くPCがフリーズする。その間なにもできない。ちゃんと返ってくるので待てばよいのだが「Thunderbird」が起動しているとメモリを1.5GBほど喰われるので他の作業が一切できない。したがって「Thunderbird」は落とすしかない。次のメールチェックのために10分フリーズ・・・この繰り返しは正直しんどい。まぁこのThunderbirdは「重い」で悪名高いのでPCのせいではないのだけれど。

HDD容量について

実はE200HAを一年間使っていてHDD容量の少なさが一番致命的だった。32GBのeMMCが入っているのだけど、なんとWindowsだけで20GB喰うのだ。残り12GB弱しかない。そこにスワップ領域(ページファイル)を2GBほど積むと残り10GB弱。オフィスは2GB喰うので残り8GB弱。他のアプリを最小限にしても、ChromeやらDropboxなどアプリが勝手に作るキャッシュデータやらなにやらで5GBほどか直ぐにうまり残り3GBとなる。これらのファイルはMicroSDで増設したドライブには移動できないファイル達だ。正直これはしんどい。贅沢は言わない、あと10GBでいいからプライマリドライブの容量が増やせないものかと切に願うばかりだ。

画面の小ささについて

これも使う人による。俺はノートPCの小さな画面でも苦なく仕事できる人間なので全く問題なかった。要は慣れの問題だ。この「E200HA」で普通にPHPのコーディング作業をしていたし「MySQL Workbench」などでDBの開発もしていた。WordやExcelでのドキュメント作業も問題なく。何度も言うが、要は慣れの問題だ。

画面の小ささと言えば、本体も小さい。これはデメリットのようでメリットにもなる。俺のように外でPCを使うことが多い人間は、PCを広げるデスクサイズを選べない。しかも最近の有名なカフェ(タリーズとか。スタバはなんかキライ。)はデスクサイズが猫の額ほどしかない(まぁ当然っちゃぁ当然か)。その状況でこの機体の小ささがモノを言う。PCとマウスとマグカップが小さいデスクにちょうど入る。これはありがたい。

バッテリーの持ちについて

この「E200HA」が手放せない大きな理由の一つが「バッテリーの持ちが驚異的」という点だ。2年弱使っていても実感10時間は普通に持つ。メイン機の横で待機状態&たまに確認程度なら普通に12時間は余裕で持つ。これは正直驚異的だ。外出勤務の合間にカフェの電源コンセントのある席を探して彷徨う必要もなければ、充電のためのACアダプタを持ち歩く必要もない。これは非常にありがたい。

重量について

この「E200HA」が手放せない大きな理由のもう一つがこの「重量」だ。ガチで1kgを切る重量はカバンの重量も軽くしてくれる。加えて前述の通りACアダプタも無しだ。さらにカバンが軽くなる。

代替候補機について

もし買い替えるとすると、「E200HA」の後継機(というか同等機?)である「R209HA」でもよいのだけど、バッテリの持ち時間を多少妥協して「Dell Inspiron 11 3000」にするか、金をもう少し出して「Lenovo YOGA 710」にするかは盛大に悩むと思う。

以上、軽量サブノートor軽量モバイルノートの購入を検討されている方の参考になれば幸だ。

一定期間の日付で集計するSQLの例(例えば「現在値と過去25日間の平均値や標準偏差と比べた結果がほしい」のような場合)


仕事上で一定期間ごとの集計をするSQLを作る必要があったのでご紹介。お役に立てれば。

たとえば 日時(time)、と値(value)という2フィールドを持つテーブルがあったとする。これを当該日付の値と、当該日付から過去25日の平均値を同時に出したい場合(過去25日間の平均値と比べられる結果がほしい)、以下のようにすれば求められる。

SELECT
    A.time --日時
    A.value, -- 現在値
    AVG(B.value), -- 平均値
    STDDEV(B.value) -- 標準偏差値
FROM table_name A
INNER JOIN table_name B -- 同じテーブルをJOINする
ON
    --過去の日時のものを範囲を持たせてJOINの条件とする
    B.time BETWEEN (A.time - INTERVAL 25 DAY) AND A.time
;

まぁSQLを見てもらえればわかると思うけど簡単に解説すると、同じテーブルを結合していて、結合の際に結合条件であるtimeフィールドに幅を持たせて結合させている点がポイントだ。

これを使えば、わざわざスクリプトなどでループをまわしながら計算させなくとも、SQL一発で結果が得られる。

なお、このSQLはMySQL用なのでほかのDBMSでどうやるかは自分でしらべてくれろ。INTERVALのやり方だったりJOIN句の書き方だったりに違いがあるだけで基本的なアイディアは使えると思う。

月単位で集計、とか、年単位で集計、などはほかにいろいろ紹介しているページはあったものの、過去25日間の平均値(や標準偏差など)と現在値の比較を一発のSQLで実行する方法が探しても無かったので書いてみた。

PCでスマフォをUSB充電したら仕事をクビになった


まず俺の話ではなく全く関係ない人間の話なんだけど、注意喚起としてメールが回ってきた。
その話聞いてちょっと違うんじゃない?と思ったのでちょっと書いてみる。

そのクビになった技術者がいる現場では、どうやらPCにスマフォをつなげてはいけないというルールになっていたそうで、それを破ってPCのUSB端子でスマフォを充電しちゃってた。それがみつかってクビになったらしい。ルールを破ったのだからクビになっても仕方がない。それは正論。でもね、ちょっとまって。二つの観点からちょっと違うんじゃない?と思ったことがあるので順に書いてみるよ。

まず「セキュリティルール」という観点から。

セキュリティルールってのは「守る」ためにある。つまり、まっとうに働く人(社員やパートナー含め)を守り、企業の情報(=企業の資産)を守りるためにあるわけで、人間を罰するためのものじゃない。言い換えると、セキュリティルールってのは「ルールを守らせる」のが目的ではなく、被害を防ぐことが目的なわけだ。今回の件では、ルール違反は見つかったが、本来の目的は侵されていない。つまり、「被害は無かった」わけ。でも被害が発生する可能性のあるセキュリティルール上の違反が見つかった。しかも、過失はあるが、故意でルール違反を犯したわけでもない(「普段の癖でやっちゃった」らしい、それもちょっとアホすぎるけど)。それをいきなり当事者をクビにして「ハイ終わり」ってのはセキュリティ運用上どうなのかなと思った。

セキュリティルールってのは状況に応じてどんどん変更されるべきものだ。守るべき対象がどんどん変わっていくのでルールも変わっていく。さらにルール上の問題が見つかったらそれに合わせてルールを変えるか運用を変えていく。今回の件で言えば、ルール違反が発生して、それが重大な問題であると認識したのであれば、ルールを変更するか、運用を変えるべきじゃないのか?(=技術的な対策を打つ、なども含め)

ルール違反者を見つけ出し、それを切り捨てて、それでセキュリティが守られると思っているようならそれは大きな間違いだ。現状でルール違反者が発生する可能性があって、それが重大な損害の発生につながる可能性がある判断したのであれば(重大な問題が発生すると判断したからクビにしたんだよね)、次のルール違反者が出現する可能性も十分にあり、それが損害に発展する可能性も十分にある。それってまったくセキュリティリスクをケアできていないよね。

もうひとつは「雇用者(=管理者)」という観点。

損害が発生していない過失を見つけたからといってその過失者をクビにするのは雇用者としてどおなのかなとも思う。企業活動上でヒューマンエラーなんていたるところで起こっている。例えば、メンドくさくて手順通りにやらなかった、でも問題はなかった。これと今回の「PCでスマフォ充電しちゃった」問題と何が違うの?前者はお説教ですんで、後者はクビなわけ?

企業活動上、ヒューマンエラーが発見された場合には原因を明らかにして今後ヒューマンエラーが起こらないようになにかしらの「対策を打つ」というのが常識だ。そこには、ヒューマンエラーを起こした人間を罰する、というのは含まれない(別途で損害賠償という責任追及手段をとる場合はあるけど)。一般的な常識と今回の問題を照らし合わせれば、うっかり「PCのUSB端子でスマフォを充電」しちゃわないように対策を講じるか、うっかり「PCのUSB端子でスマフォを充電」しても問題ないようにするのが順当な考え方だ。逆に「PCのUSB端子でスマフォを充電」しちゃった人間をクビにするのはちょっと常識から外れている。

ってな感じで、「PCのUSB端子でスマフォを充電したらクビになっちった、テヘペロ」的なメールにとっても違和感だらけだったので書きなぐってみました。お粗末。

Javascriptで有効桁数○桁以下’切り捨て’のサンプルコードつくってみた


とあるシステム開発中に「有効桁数○桁にして、かつ有効桁数以下を四捨五入じゃなくて切り捨てにしたい」という要望をもらったのね。

ほんでPHP+AJAXでの開発だったので、JavaScriptで対応してまえ、とおもったのだけど、有効桁数以下四捨五入のtoPrecision()というメソッドあるけど有効桁数以下切り捨てというメソッドはない。

Google先生にいろいろお聞きしたのだけど、どうもよさげなアイディアがない、ってことで、つくりましたよ。

さぁどうぞ。

/*
 * 有効桁数以下切り捨て
 * number : 対象数値
 * digit : 有効桁数
*/
function toPrecitionFloor (number, digit) {
    //number=0だとループしちゃうからちゃんとキャッチしてあげてね
    var pow = 0;
    do {
        if ( String( Math.floor( number* Math.pow(10,pow) ) ).length < digit) {
            pow++;
        } else {
            break;
        }
    } while (true);
    return Math.floor( number * Math.pow(10,pow) ) / Math.pow(10,pow);
}

処理をざっくり言うと、小数点位置をずらしながら有効桁数の位置(=以下切り捨ての位置)を調査して、「小数点以下第n位以下を切り捨て」のアイディアに乗せてみた。

厳密に有効数字と違う値が帰ってこないじゃんコレ?馬鹿なの?っていう突っ込みはナシで。そこまでの厳格なものじゃないのであしからず。厳格にしたいならご自分でどうぞ。

「バグのないプログラムを書け」はできるんじゃない?


プログラムのわからないえらい人「バグのないプログラムを書くことはできないのか?難しいかもしれないが、十分に気を付けていれば防げるのではないか?」にどう返したらいいのかわからない

http://anond.hatelabo.jp/20170214114736

バグは人のミスなんだから、理屈的には正しいような気がする

だけど未だかつて人類はこれを達成できていないという観測的事実がある、何故そうなるのかを説明することは可能だろうか

ふと思ったんだけど、この増田さんが言われた「バグのないプログラムを書け」はできるんじゃない?

ゼロにはできないけど、限りなくバグの少ないシステムは作れると思うよ。理論的にはね。

でもね、問題がある。

「バグが限りなく少ないプログラムを書く」ためには膨大なコストと時間がかかる。

システム構築ってのは必ず予算と工期が決まっている。

だから100万円でシステムをつくるのに、1000万円かけて「バグが限りなく少ないプログラム」は作れないし、1ヵ月の工期に1年もかけていられない。

100万円のシステムを1ヵ月で作るのに1000万円かけて1年もの時間を費やしていいのなら「バグが限りなく少ないプログラム」は作れるんじゃないかな。

その「プログラムのわからないエロい人」に言ってみたらいいよ。「予算と工期を最低でも10倍用意したらできるかもよ」と。加えて「それでもやるか?」と。

それでもゼロにはならないから、世の中のシステム障害ってのものが後を絶たないのだけどね。

WordPressカスタム投稿プラグイン「Toolset Types」がプラグインディレクトリから消えている


カスタム投稿用プラグイン「Toolset Types」がWordpressのプラグインディレクトリ(プラグインリポジトリ)から消えているようです(2016年11月7日現在)。どうやら技術的な問題と規約上の問題があるらしく、技術的な問題は解決したものの規約上の問題が依然残っているとのことです。開発元もWordpressリポジトリへの復帰を望むべく、鋭意努力はしているが、べつの方法での配布も検討しているとのことです。「Toolset Types」をご利用の方は公式ページ(英語)をチェックされることをお勧めいたします。

Toolset Types 公式:
https://wp-types.com/blog/

Google Chromeでは javascript の window.close() で自分自身を消すことができない?効かない?


表題の件、javascriptのwindow.close()について、いろいろとテストをしてみた。

結論から言うと、Google Chromeでは javascript の window.close() で自分自身を消すことができないです。効かないです、ハイ。

忙しい人や、とりあえず結果だけ知りたい人は別に以下読まなくてもいいんじゃね?以下は「できない」ことを検証しただけだから。

さてさて、
以下のような簡単なコードを書いてみてテストしてみる。

sample1.htm

<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<script>
$(function(){
    $(document).on("click","#close_window",function(){
        //自分自身を閉じる
        window.close();
    });
});
</script>
<button id="close_window">Close Window</button>
</body>
</html>

↑のHTMLファイルを作りChromeブラウザの「お気に入り」から(URLアドレス欄にパスを張り付けてもおなじ)「sample1.htm」を表示させてボタン「Close Window」を押すと、

Scripts may close only the windows that were opened by it.

というエラーが出て画面を閉じることができない。
一方で、「sample1.htm」のファイルを「ファイルの右クリック→プログラムから開く→Google Chrome」とすると
あら不思議、さっきまでウンともスンとも言わなかったのに見事にタブが消えるじゃありませんか。

もうちょっとツッコんでテストしてみる。

以下の2つのファイルを作ってみる。

sample2.htm

<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<script>
$(function(){
    var childWindow;
    $(document).on("click","#open_child_window",function(){
        //別窓でsample3.htmを開く
        childWindow = window.open("./sample3.htm","window_close_2","_blank");
    });
    $(document).on("click","#close_child_window",function(){
        //別窓で開いたsample3.htmを閉じる
        childWindow.close();
    });
});
</script>
<button id="open_child_window">Open Child Window</button>
<button id="close_child_window">Close Child Window</button>
</body>
</html>

sample3.htm

<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<script>
$(function(){
    $(document).on("click","#im_close",function(){
        //自分自身を閉じる
        window.close();
    });
    $(document).on("click","#close_parent",function(){
        //自分自身開いた親を閉じる
        window.opener.close();
    });
});
</script>
<button id="im_close">Im Close</button>
<button id="close_parent">Close Parent Window</button>
</body>
</html>

例ごとく、Chromeの「お気に入り」から「sample2.htm」を開く。
ボタン「Open Child Window」を押すと普通に別窓で「sample3.htm」が開く。
別窓「sample3.htm」のボタン「Im Close」を押すと、別窓「sample3.htm」が普通に消えてくれる。
これは問題ないようだ。

もう一つのボタン「Close Parent Window」を押すと、これは効かない。
案の定、「Scripts may close only the windows that were opened by it.」だ。
さて、前の実験と同じく、「sample2.htm」を「ファイルの右クリック→プログラムから開く→Google Chrome」とすると
あら不思議、「Close Parent Window」も動作して「sample2.htm」が表示されているタブもスコッと消える。

最後にもう一つテスト。
以下の二つのファイルをつくる。

sample4.htm

<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<script>
$(function(){
    $(document).on("click","#move_next",function(){
        //sample4.htmに画面移動する
        location.href="sample5.htm";
    });
});
</script>
<button id="move_next">Move Next</button>
</body>
</html>

sample5.htm

<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
$(function(){
    //即座に自分自身を閉じる
    window.close();
});
</script>
<span>ほげほげ!!</span>
</body>
</html>

これも同じように「お気に入り」からと「右クリック→プログラムから開く」で試してみると、
「お気に入り」のほうは「sample5.htm」が表示されたまま止まり、
「Scripts may close only the windows that were opened by it.」となるが、
「右クリック」のほうは「sample5.htm」が表示された瞬間に消える。

結論としては・・・・

  • Google Chromeでは親タブ、親ウィンドウをJavascriptから(window.close()で)閉じることはできない。
  • ただし、window.openで開いた子ウィンドであれば自分自身からでも親からでも閉じることができる。
  • もちろん子ウィンドウから親ウィンドウは消すことはできない。

WEBサイトやWEBサービスを作るうえで、
「ファイルの右クリック→プログラムから開く→Google Chrome」なんてやるわけないから、
実質のところGoogle Chromeでは親画面(=初期表示ウィンドウや初期表示タブ)はスクリプトから消すことはできないようだ。
まぁ考えてみればセキュリティ的にもUI的にもいきなり画面が消えるなんてことはNGだからっちゅうことかしらね。
ってことで、この記事を書くきっかけとなった「URL直打ちされてタブ画面として開かれてしまった画面を別ウィンドウに移動させる」という課題は頓挫いたしましたとさ、チャンチャン。

ちなみにIEでは自分自身をWindow.close()で消すことができます。ただ、「消していいですか?」的なダイアログがでるので、どっちみにユーザのクリック動作が必要になるけど。自動的にスコっとウィンドウやタブを落とすのはできないのね。

PHPの開発環境にVisual Studio Codeがいい感じ


PHPの開発環境でよさげなエディタがないものかずっと調査していたのですが、
どうやらMicrosoftが作ったフリーのコーディングエディタである「Visual Studio Code」なるものがよさそう。
無料だし。なんせ無料だし。

Micorosoft Visual Studio Code
https://www.visualstudio.com/ja-jp/products/code-vs.aspx

んで、早速触ってみましたよ。

ちなみに、我が家の開発PCは基本的に外に持ち出すことを前提としておりまして、軽量コンパクトなノートPCが開発環境になっております。つまり非力なのです。だからEcripsなんて動かすだけでもCPUとメモリから煙が出そうな重厚なものは不可なのです。

ということで、我が家で一番非力なマシンであるASUS E200HAにVisual Studio Codeをインストールしてみました。

結論として・・・・

結構いけるじゃないの!!
ちょっとモッサリしてるケド。

さすがマイクロソフトのVisual Studioの名を冠しているだけあって、超IDEライク!!
テキストエディタな感じが一切しない!!
だから開発してる気分がモリモリですよ!!
ちょっとモッサリしてるケド。

デフォルトのデザインがいい感じじゃないの!!
ちょっとモッサリしてるケド。

コードの自動補完(スニペット:Snippets)とかIDEライクに効いてくれて、しかもjson形式で設定できるから、メンドクサイUIでちまちま設定する必要もないし!!
ちょっとモッサリしてるケド。

コードハイライトもデフォルトで効いててくれて、とくに設定をイジル必要もなくデフォルトで使えちゃうレベルです。
ちょっとモッサリしてるケド。

Gitなんかもデフォルトで使えちゃうんですよぉぉ!!
Gitなんて使ってないけどね。
あと、ちょっとモッサリしてるケド。

ちなみに、ちょっと古いけど、この↓サイトなどで

Visual Studio Codeの謎ペインの仕様はユーザ離れを起こす原因となり得そうな件
http://www.bunkei-programmer.net/entry/2015/11/25/190000

「純粋なタブの概念ではなく、横にしか分割できないペインが恐ろしく使いにくい」

とおっしゃられていたので、どうにかしてタブウィンドウで開けないものか触っていたらなんとも簡単にできたよ。

左ファイルツリーのファイルをダブルクリックすればタブウィンドウで開くじゃないの。

ってことでVisual Studio Code で複数ファイルをタブウィンドウで開きたい場合はダブルクリックすればいいよ。問題解決。

しばらくVisual Studio Code使ってPHP開発してみようかとおもってますよ。