Do You PHP はてな このページをアンテナに追加 RSSフィード Twitter

2016-04-25

[]BluetoothHHKB Professionalが到着!

PFUダイレクトAmazonショップで予約していたBluetoothHHKB Professionalが無事到着しました。

購入したのは英語配列(PD-KB600B)です。

プチ開封の儀

到着した荷物の箱を開けると。。。おおお、これですよこれ。予約特典(先着)のスマートケースも付いてきました。

f:id:shimooka:20160425113414j:image

化粧箱。

f:id:shimooka:20160425113759j:image

箱は重要じゃない、中身が大事です。今回初めて「墨」を購入しましたがダークグレーというか意外と黒くないんですね。

f:id:shimooka:20160425113832j:image

会社で使ってる初代HHKB Professional(PD-KB300)と並べたところ。初代はもう白色と言うより蛍光灯焼けしてクリーム色になってますけど(涙)

f:id:shimooka:20160425113856j:image

ちょっとタイピングしたところ、初代と比べてかなり「カチャカチャ感」がないです。あと、タッチがちょっと軽くなってる気がします。Professional2からそうなんでしょうか。。。

環境設定

普段DELL製ノートPC+Windows7(64Bit版)+初代HHKB Professional+トリニティーワークス社のUSJP Proという組み合わせで使ってます。

USJP Proでやってることは

  • キーボード配列変換(106→101)
  • CapsLockとctrlキーの入れ替え(ノートPC側も含む)

の2つなのですが、今回購入したHHKBも含めて

  • 初代HHKBも今までどおり使える
  • BluetoothHHKBも初代と同様に使える
  • ノートPCのCapsLockはctrlキーと入れ替え

という環境にしたいので、USJP Proをやめてレジストリを直接いじることにしました。

キーボード配列変換

使用するキーボード毎に106(ノートPCのキーボード)と101(HHKB×2)を切り替える必要があります。ググってみたところ、HID毎に設定を上書きできることが分かったので早速実施。手順は以下のエントリを参考にしました。

(1)まずは、デバイスマネージャで2台分のHHKBハードウェアIDをそれぞれ確認。必要であればベースコンテナーIDも。

f:id:shimooka:20160425151351p:image

(2)レジストリエディタを使って、それぞれの所定の場所にKeyboardTypeOverride、KeyboardSubtypeOverrideを追加

f:id:shimooka:20160425151830p:image

CapsLockとctrlキーのキーマッピング変更

こちらもググるといろいろ情報が出てきますが、よく考えるとCapsLockキーがctrlキーになれば要件は満たせるわけで入れ替える必要がない事に気づきました。ということで、以下のサイトを参考にレジストリを変更。

実際には、コピペでregファイルを作って実行しました。

f:id:shimooka:20160425171042p:image

OS再起動して動作確認

レジストリを変更したらWindows再起動。ノートPC・初代HHKBBluetoothHHKBでそれぞれ動作確認し、問題がないことを確認しました。

まとめ

今日のお昼ごろから使ってますが、ようやくキーボード周りのケーブルが無くなって手元がすっきりしました。「カチャカチャ感」がないのが気になります(汗)が、まあそのうち慣れるでしょう。

f:id:shimooka:20160425171424j:image

後でAndroid端末にも繋げてみるか。。。

2016-04-12

[]ついにHHKBBluetooth版が発売!

ずーっと「あれば良いのに」と思っていたHHKB Bluetooth版がPFUから発売されることになったようです!

発売日は2016/04/22。PFUダイレクトAmazonショップで予約受付中です。

今のところ、色は墨のみ。英語配列・無刻印・日本語配列の3タイプ。

速攻で予約しました。当然、英語配列です。到着が楽しみ!:-)

2016-03-03

[]Motorola Moto 360(1st Gen)にAndroid 6.0.1が降ってきた

久々のエントリですが、PHPネタではありません。

2nd Genがリリースされて陽の目が当たらなくなったMoto 360(1st Gen)ですが、TaskerAutoVoiceAutoWearのゴールデンコンビのおかげで個人的にはまだまだ現役です。以前よりも付ける時間が長くなり、仕事中はほぼつけっぱなしです。リューズ取れちゃったけど。。。

で、今朝もいつも通り腕につけてふと見ると、おや?Moto360のようすが・・・

f:id:shimooka:20160303121411p:image

カードを開いてみると。。。

f:id:shimooka:20160303121412p:image

おお!jugglyさんでアップデートされるらしいとあったけど半信半疑でした。ごめんなさい(汗)

会社に到着後、アップデートを実行。

f:id:shimooka:20160303114137j:image

f:id:shimooka:20160303114554j:image

待つこと5分。無事、Android 6.0.1(MEC23I)になりました。

ちょっといじってみるとメニューがちょっと変わったっぽいのでまとめておきます。

手首のジェスチャー

設定アプリから表示されるメニューに「操作」としてまとめられたようです。

f:id:shimooka:20160303130911p:image

ここに手首の操作の有効無効のスイッチがあります。また、チュートリアルを起動して一通りジェスチャーを確認できます。

f:id:shimooka:20160303130910p:image

にしても、腕を上げにやるのって結構難しくないのかな。。。

権限管理

新しく「権限」メニューが追加されています。

f:id:shimooka:20160303130908p:image

開いてみると、インストールされているアプリの一覧が表示されます。

f:id:shimooka:20160303130907p:image

アプリを選択すると権限の一覧が表示されるので、ここで権限の有効無効の切り替えを行えるようです。

f:id:shimooka:20160303130909p:image

2015-11-10

[]USB接続&フルHDモバイルディスプレイASUS MB169B+を買った

皆さんどんな環境で開発してます?

ノートPC単体?自作デスクトップデュアルディスプレイ?もしかして3枚?4枚?外部キーボード

自分の会社での環境は、15インチノートPC+お古のCinemaディスプレイデュアルディスプレイHHKBな感じです。片方のディスプレイターミナルエディタブラウザの開発ツールを開いてゴリゴリやって、もう片方にブラウザを広げっぱなしにして動作確認する感じにしてます。

で、諸々の事情で平日に自宅作業することがあるんですが、

  • 家にはホコリをかぶった17インチCRTしかない
  • まさか、リビングに持ってきて使うのもどうよ
  • 高さが全然違うし。。。

という状況なのでノートPC単体で使ってました。でも、ウィンドウが重なってしまって確認したい情報を同時に見られないのはさすがに効率が悪い。悪すぎる。

ということで、前から気になっていたASUS MB169B+を思い切って購入。

Amazonでちょうど3万円ぐらい。

ついでに、スタンドも購入。こっちは安いので充分。

ASUSの製品ページには本体800gとありますが、持った感じはそれよりも軽く感じます。15インチのタブレットからバッテリー抜いたような感じです。

PCとの接続はUSBなので超簡単。電源もUSBから供給なので余計なコード類はありません。PC側のUSBポート挿せばディスプレイドライバーがインストールされ、再起動したら何事もなかったようにデュアルディスプレイ化完了。

f:id:shimooka:20151110134646p:image

嫁さんが使っているMacBook AirでもASUSのサイトからディスプレイドライバーをダウンロードしてインストールすれば問題なく認識されました。

自分のノートPCに繋いだらこんな感じです。

f:id:shimooka:20151110114213j:image

f:id:shimooka:20151110114236j:image

使用感ですが、15.6インチワイドということもあり正面に据えるとちょうどいいサイズです。輝度は左側にボタンがあるのでそれで調整可能。淡い色の表現に難があるかな?という感じですが、コードを書く分にはあまり問題にはならないかと思います。

やっぱデュアルディスプレイ良いですね。これならもっと早く買っといても良かったかも。

2015-07-29

[]PHP 7 Compatibility Checker(php7cc)を触ってみた

珍しくPHPネタを連投してます;-)

β2がリリースされてだいぶ実体が見えてきたPHP7ですが、PHP5.xから多くの改良、機能の追加・非推奨化・廃止、また仕様変更が含まれています。既存のコードがPHP7で動作するかどうかを

で、既存のコードがPHP7で動作するかどうかをチェックするツールがGitHubで公開されていましたので、ちょっと触ってみました。

php7cc is a command line tool designed to make migration from PHP 5.3-5.6 to PHP 7 easier. It searches for potentially troublesome statements in existing code and generates reports containing file names, line numbers and short problem descriptions. It does not automatically fix code to work with the new PHP version.

sstalle/php7cc

Introductionにもあるとおり、あくまでlintのような"コードチェッカー"であり、コードを修正してくれるツールではありません。また、PHP7はまだ開発中なのですべての変更点を洗い出せるわけではないことに注意です。

環境

  • CentOS6.4
  • PHP5.6.11

インストール

README.mdのInstallationに書かれているとおり、composer経由でインストールします。

$ PATH=/usr/local/lib/php56/bin:$PATH php ./composer.phar create-project sstalle/php7cc php7cc --stability=dev
        :
Writing lock file
Generating autoload files
Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]? n
$ 

インストールの最後にVCSの履歴を削除するかどうかを聞かれます。ここで"no"としておけば、今後git pullで更新できるようになるようです。

チェック対象のPHPスクリプト

PHP7.0.0β2に含まれているUPGRADINGファイルに記載されているコードを使ってチェック用のスクリプト(UPGRADING.php)を作ってみました。

<?php
/**
 * @see https://raw.githubusercontent.com/php/php-src/php-7.0.0beta2/UPGRADING
 */

/**
 * Indirect variable, property and method references are now interpreted with
 * left-to-right semantics. Some examples:
 */
$$foo['bar']['baz']; // interpreted as ($$foo)['bar']['baz']
$foo->$bar['baz'];   // interpreted as ($foo->$bar)['baz']
$foo->$bar['baz'](); // interpreted as ($foo->$bar)['baz']()
Foo::$bar['baz']();  // interpreted as (Foo::$bar)['baz']()


/**
 * The global keyword now only accepts simple variables. Instead of
 */
global $$foo->bar;


/**
 * Parentheses around variables or function calls no longer have any influence
 * on behavior. For example the following code, where the result of a function
 * call is passed to a by-reference function
 */
function getArray() { return [1, 2, 3]; }

$last = array_pop(getArray());
// Strict Standards: Only variables should be passed by reference
$last = array_pop((getArray()));
// Strict Standards: Only variables should be passed by reference


/**
 * Array elements or object properties that are automatically created during
 * by-reference assignments will now result in a different order.
 */
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
    :

全体はGistにありますので参照してみてください。

実行してみる

インストール後に生成されるphp7ccディレクトリ直下にbinディレクトリがあり、その中にあるphp7cc.phpファイルを実行します。引数PHPスクリプトを含むパスもしくはファイル名を指定します。パスを指定した場合は、第2引数拡張子(カンマ区切りで複数指定可能)できます。

$ PATH=/usr/local/lib/php56/bin:$PATH php ./php7cc/bin/php7cc.php ./UPGRADING.php

File: ./UPGRADING.php
Line 7. Indirect variable, property or method access: /**
 * Indirect variable, property and method references are now interpreted with
 * left-to-right semantics. Some examples:
 */
${$foo['bar']['baz']};
Line 8. Indirect variable, property or method access: // interpreted as ($$foo)['bar']['baz']
$foo->{$bar['baz']};
Line 9. Indirect variable, property or method access: // interpreted as ($foo->$bar)['baz']
$foo->{$bar['baz']}();
Line 10. Indirect variable, property or method access: // interpreted as ($foo->$bar)['baz']()
Foo::$bar['baz']();
Line 16. Complex variable without curly braces in global keyword: // interpreted as (Foo::$bar)['baz']()
/**
 * The global keyword now only accepts simple variables. Instead of
 */
global ${$foo->bar};
Line 37. Possible array element creation during by-reference assignment: $array['a'] =& $array['b'];
Line 53. Empty list assignment: /**
 * Empty list() assignments are no longer allowed. As such all of the following
 * are invalid:
 */
list();
Line 54. Empty list assignment: list(, , );
Line 55. Empty list assignment: list();
Line 99. Possible adding to array on the last iteration of a by-reference foreach loop: $array[1] = 1;
Line 109. Duplicate function parameter name "unused": public function foo($a, $b, $unused, $unused)
{
}
Line 122. Function argument(s) returned by "func_get_arg" might have been modified: func_get_arg(0);
Line 142. Invalid octal literal 0781: 7;
Line 172. String containing number in hexadecimal notation: '0x123';
Line 173. String containing number in hexadecimal notation: '0x123';
Line 174. String containing number in hexadecimal notation: '0xe';
Line 174. String containing number in hexadecimal notation: '0x1';
Line 176. String containing number in hexadecimal notation: '0x1';
Line 184. String containing number in hexadecimal notation: '0xffff';
Line 197. Unicode codepoint escaping "\u{xyz}" in a string: '\\u{xyz}';

Checked 1 file(s) in 0.048255 second(s)
$ 

用意したPHPスクリプトのすべてではないですが、結構いい感じにチェックできているんじゃないでしょうか?

ちょっとだけ深堀り

PHPスクリプトの解析にはPHP Parserが使われています。php7cc側では、PhpParser\NodeVisitorAbstractクラスを継承したAbstractVisitorクラスが用意されており、それを継承した各Visitorクラスで「何をチェックするか」が実装されています。

たとえば、func_get_arg/func_get_args関数戻り値の変更に対するチェッカー(php7cc/src/NodeVisitor/FuncGetArgsVisitor.php)は次のような感じです。

<?php

namespace Sstalle\php7cc\NodeVisitor;

use PhpParser\Node;
use Sstalle\php7cc\Helper\NodeHelper;

class FuncGetArgsVisitor extends AbstractVisitor
{

    public function enterNode(Node $node)
    {
        if (!NodeHelper::isFunctionCallByStaticName($node)) {
            return;
        }

        /** @var Node\Expr\FuncCall $node */
        $functionName = $node->name->toString();
        if ($functionName == 'func_get_arg' || $functionName == 'func_get_args') {
            $this->addContextMessage(
                sprintf('Function argument(s) returned by "%s" might have been modified', $functionName),
                $node
            );
        }
    }
}

まとめ

今年中には正式リリースされる感じのPHP7ですが、こういうツールを上手く使って楽に移行をしたいですね(希望的観測)。。。(汗)

というか、サードパーティ製の拡張モジュールが対応してくれるのか不安だなぁ。。。

2015-07-24

[]GoPHP7とGoPHP7-ext

何だかGoPHP5を思い出しますが、すでにGoPHP7のサイトがあるようです。

TOPページにはリリースバージョンが表示されるだけでリンクも何もないんですが。。。

で、各種拡張モジュールのPHP7への対応状況をまとめた情報も公開されています。

ここの「Catalog」タブをクリックすると、対応状況一覧へのリンクが現れます。

これを見てみると、コアモジュールはかなりの割合でPHP7に対応しているようです。一方で、Xdebugmemcached、runkitなどのサードパーティ製モジュールはまだまだのようですね。

とりあえず、ssh2とyaml拡張モジュールについてはPHP7.0.0β2との組み合わせで問題なくbuildできることを確認しました。

2015-05-21

[]Motorola Moto 360を買った

すでに1ヶ月前になりますが、MotorolaMoto 360を購入しました。

f:id:shimooka:20150521122355j:image

注文から届くまで

購入先はネットのコンビニAmazon.comです。「.co.jp」ではなく「.com」ですが、日本への発送も対応しています。

Motorola Moto 360 - Light Metal, 23mm, Smart Watch

f:id:shimooka:20150508120845j:image

値段は本体+送料+税で256.29USD(31,983円)。

バンドは23mmのメタルバンド(Light Metal)を選択。レザーバンドは昔夏場にひどく肌が荒れたことがあって、それ以来敬遠しています。また、18mmバンドではなくなぜ23mmにしたか?なんですが、18mmバンドと比較して注文時点で60USDも値段に差があるとさすがに厳しいです(汗)

f:id:shimooka:20150521122407j:image

注文から到着までの流れですが、

  • 注文:2015/04/14
  • 発送:2015/04/15
  • 到着:2015/04/18

と言った具合で、思ったよりも全然早く到着しました。ただし、発送先の氏名が何故かメールアドレスになってしまっていたため、入管で1〜2日ほど止まっていたっぽいです(泣)

で、荷物はこんな感じ。Amazon.comのダンボールに入って到着。

f:id:shimooka:20150418102122j:image

化粧箱はこんな感じです。

f:id:shimooka:20150418102814j:image

到着が揃うよう、保護フィルムとQi充電パッドも別途注文しておきました。

f:id:shimooka:20150418102841j:image

開封の儀

開封の儀は。。。写真を撮ってあったんですが見つからないのでこちらを参照してください;-)

Moto360日本購入レビュー。初期設定方法やバッテリーの持ちなどの使用感。

保護フィルムの貼り付け

ディスプレイ面が割れるとどうしようもないので、とりあえず高硬度のガラスフィルムを選択しました。

0.3mmとは言うものの、思ったよりも厚みがありました。まあ、Moto 360自体が思ったより厚みがあるので誤差範囲でしょう。貼り付けはスマートフォンと同様ですが、フィルムが円形なので位置合わせはそこまで難しくなかったです。

Moto 360のセットアップ

セットアップについても先ほどのサイトに詳しく書いてありますが、ハマる点としては

  • Android端末側にAndroidWearアプリインストールする必要がある
  • ペアリング完了後の処理に結構時間がかかるので、充電してからセットアップした方が良いかも(20〜30%ぐらいしか電池残量がなかった)

の2点です。

OSアップデート

セットアップが終わったら、OSを最新版に更新。つい先日Android Wear 5.1.1へのアップデートが始まりましたが購入当時では5.0.2がリリースされていました。

アップデートは、Moto 360側のメニューの

設定→端末情報→システムアップデート

から行います。アップデート後のソフトウェアバージョンが更新されていれば成功です。

f:id:shimooka:20150521130759p:image

で、通常はあまりないとは思いますが、Adblock Plus for Android等の広告フィルタAndroid FirewallなどのiptablesアプリををAndroid端末にインストールしている場合、アップデートファイルをダウンロードできない場合があります(というか、ハマった)ので、ダウンロードできない場合は

$ adb logcat

などでAndroid端末のログを確認してみてください。

開発者向けオプションメニューの有効化

Android端末をそれなりに使ってる人にはピンと来ると思いますが、Android Wearにも開発者向けオプションメニューがあり、有効にするとBluetooth経由でのadbデバッグなどが可能になります。

有効化する手順もAndroid端末と同様、端末情報メニューにある「ビルド番号」を連続タップするというものです。

f:id:shimooka:20150521130757p:image

メタルバンドの長さ調整

メタルバンドの長さですが、個人的には若干長めだったので、ヨドバシアキバの3Fにある時計修理コーナーでやってもらいました。所要時間は約10分で500円程度でした。一瞬、工具を買って自分でやろうかと思ったんですが、頻繁に調整するものでもないし素直に時計屋さんでやってもらった方が良いと思います。

インストールしているWearアプリ

あちこちで紹介されているものから個人的な好みまで、有料・無料問わずいくつか入れてあります。

  • Wear Mini Launcher
    • スワイプするとアプリドロワーを表示するアプリ。何でこの機能が標準でないのか不明なぐらい必須アプリAndroid Wear 5.1.1から機能的に追加されるらしい。また、Androidのクイック設定パネルのようにWi-FiテザリングのON/OFF、ボリューム調整などのメニューもある。
  • Slumber for Android Wear
    • 必須アプリ。充電中にスクリーンをオフにするアプリMoto 360は充電中にスクリーンオフにならず、これによるディスプレイの焼き付きが問題となっている(いた?)模様。対策としてScreen Off Wearがよく紹介されているが、現時点でGooglePlayでは公開されていないためこちらで代用。機能的には必要十分。
  • Feel The Wear
  • Wear Battery Stats
    • Android Wearのバッテリー残量を表示するアプリAndroid端末側だけではなく、Android Wear側でもグラフを表示できる。確認したところ、だいたい1時間あたり3〜6%ぐらいのバッテリー消費ペースなので、通常なら朝から夜まではバッテリーが保つ計算。ただし、Moto 360側で設定変更などをガシガシやっているとあっという間にバッテリーがなくなるので、予備のQi充電器を職場に用意するなどの対策は必要。

f:id:shimooka:20150521133958p:image

今のWatch Face

Watch Face - Minimal & Elegantを使ってます。

f:id:shimooka:20150521122416j:image

時間ごとに背景のグラデーションを変更できるのと、Little Worldsというちょっとした画像を表示できディスプレイ下のデッドスペースをうまく目立たなくさせられるのがポイント。アナログ時計じゃないので視認性はあまり良くないですが、かなりシンプルで個人的には好みです。

f:id:shimooka:20150521130758p:image

1ヶ月使ってみてどうだったか?

主に平日に朝から晩まで付けてみた感想です。

  • メタルバンドはいい感じのズッシリ感。今では、これぐらい太めのメタルバンドでも意外と良いんじゃないか?という感じ。
  • セットアップ後に操作チュートリアルがあるんだけど、あれだけで操作を覚えられる人いるのかな?最初は結構「あれ?あれれ?」な感じで操作してましたが、だいたいがタップ/ロングタップ/上下左右へのスワイプのどれかなので「あとは身体で覚えろ」的な感じがする。
  • 携帯を見なくても、手元で通知が判る&内容を確認できるのは非常に良い
  • 音声による操作は意外と認識精度が高くて便利。ただし、「腕時計に向かっていきなり話しかける」というシチュエーションは日本人にとってはハードルが高い(と思う)。
  • 手元でAndroid端末の操作(テザリングとか)ができるアプリインストールしておくと良い
  • Watch Faceを自分好みに変更できるが、種類がホントに多すぎて迷う
  • アプリによっては通知が鬱陶しいほど来るので、通知ブロックをうまく使う必要がある
  • Bluetoothの接続距離が思ったより狭いので、Android端末との接続が意外と切れる
  • Fitness機能はあまり意識してません。たまに心拍数を計るぐらいかなぁ。。。

まとめ

Androidガジェット」ということで遅ればせながら飛びついてみた感満載なわけですが、個人的には買って損はなかったかな?と思います。

ガジェットっぽくないデザインも良いし、当初予想していた通り通知機能に関しては非常に便利です。ただ、単なる「通知専用ガジェット」ならコストパフォーマンスが見合わないですかね。また、今のところAndroid端末との連携がほぼ前提になっているので、Android Wear側からAndroid側を操作できるといろいろと助かる場面が増える感じはしますが、これらもキラーアプリ/コンテンツにはなり得ないような気がします。

まあ、ここでウダウダ書かなくても皆さん何か別の「圧倒的に便利なこと」を模索してるんだろうし、これからどうなっていくかを焦らず見て行きましょうかね。何かアイデアを思いついたらWearアプリも作ってみたいし:-)

あ、あとAndroid Wear 5.1.1には期待してますよ!(が、まだ降って来てない)