2015年10月19日月曜日

PHP vsprintf "Argument number must be greater than zero"

謎のエラーが出て悩んだのでメモします。

PHP 5.5.29 にてコマンドラインから下記のスクリプトを実行しました。

■ソース(vsprintf.php)
<?php
$format = '%$1s';
$args = array( 'test' );
echo vsprintf( $format, $args );
?>

■実行結果
[kiya@test ~]$ php vsprintf.php
PHP Warning:  vsprintf(): Argument number must be greater than zero in /var/www/mainecoon/bat/vsprintf.php on line 4
PHP Stack trace:
PHP   1. {main}() /var/www/mainecoon/bat/vsprintf.php:0
PHP   2. vsprintf() /var/www/mainecoon/bat/vsprintf.php:4

vsprintf()の引数は0個より多くないとダメだよと言っているようです???
引数は $format, $args と2つ指定しているので「なに!?」となるわけですが、このエラーは $format の書式が間違っているのが原因です…え~~~。

$format で指定している '%$1s' は '%1$s' の間違いでおかしな所に$が現れたのでエラーになったんです。

そう、これエラーメッセージが間違っているんです><;

う~ん、実際には可変引数を受け取ってメッセージを合成して出力する関数でこのエラーに遭遇しまして、$formatの書式ははなから疑っていなかったため、結構な時間悩んでしまいました…

2015年9月30日水曜日

FREETEL priori2 LTE (FT151A) の USBドライバー

クライアント様がターゲット端末として priori2 を選択されたので実機デバッグをしようとしました。
3G専用の FT142Aは何もせずに使えましたが FT151Aは USBドライバーのインストール方法がわからずあれこれ調べたのでメモ書きします。

■参考サイト
http://pieceofnostalgy.blogspot.jp/2015/03/android-studioadb.html
※参考サイトというかここに書かれていた通りにすればOK
  1. 「設定」→「端末情報」を開き一番下の「ビルド番号」連打して「開発者」になる
  2. 「設定」→「開発者向けオプション」を開き「ON」にする
  3. USBケーブルでPCと接続
  4. ドライバーインストールでエラーになる
  5. PCのデバイスマネージャーを開き黄色い!マークの付いた「ADB interface」を右クリックして「プロパティ」を開く
  6. 「詳細」タブの「プロパティ」を「ハードウェアID」として「値」欄をメモ。私はコピペで秀丸へ
  7. Android SDK がインストールしてあるフォルダの下の 「extras\google\usb_driver\android_winusb.inf」を開く

    私の場合は下記でした。
    F:\ProgramFiles\Android\sdk\extras\google\usb_driver\android_winusb.inf
  8. [Google.NTamd64]セクションの末尾に上記でメモしたハードウェアIDを追加

    私の場合は下記を追加
    ;priori2 LTE FT151A
    %SingleAdbInterface%    = USB_Install, USB\VID_05C6&PID_9039
    %CompositeAdbInterface%  = USB_Install, USB\VID_05C6&PID_9039&MI_01
    
  9. デバイスマネージャにて5.のデバイスを右クリックして「ドライバー ソフトウェアの更新」を開く
  10. 7.のフォルダーを選択してドライバーをインストール

2015年9月10日木曜日

vim で改行時の自動コメントアウトを無効にする

ググるといろいろ出てきます。
下記の2つのページを参考に自分設定をしたので覚え書き。

■vim で改行での自動コメントアウトを無効にする
http://easyramble.com/disable-vim-auto-comment.html

■Vimで改行時の自動コメントアウトを無効化
http://qiita.com/necojackarc/items/1f997481764ed42023a7

  1.  vim を起動する
  2.  :set runtimepath? runtimepath=~/.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim74,/usr/share/vim/vimfiles/after,~/.vim/after
  3.  # vi /usr/share/vim/vimfiles/after/plugin/common-settings.vim
  4.  au FileType * setlocal formatoptions-=ro を追加

これで全ユーザー、全ファイルタイプで「小さな親切、大きなお世話」をしなくなります。

2015年8月12日水曜日

Androidアプリにて自身のIPアドレスを取得

Android アプリを作っていて、環境による接続不良の原因を簡単に調べたいと思いアプリに自身のIP表示機能を実装しようと思いました。

自身のIP取得方法をGoogle先生に聞いてみるとあれこれ出てくるのですがどうもうまく動きません。

調べてみると InetAddressUtils.isIPv4Address() が "192.168.0.100" に対して false を返してくる…

これじゃァ駄目だ…

他の方法もいくつかあったのですがなんか書かれていることと結果が微妙に違っていたりするので適当に自分で作ってみました。

public String getLocalIpAddress() {
    String ip = null;
    try {
        // インターフェースを列挙
        Enumeration<networkinterface> en = NetworkInterface.getNetworkInterfaces();
        while ( (ip == null) && en.hasMoreElements() ) {
            // インターフェースオブジェクトを取得
            NetworkInterface ni = en.nextElement();

            // このインターフェースのアドレスを列挙
            Enumeration<inetaddress> ei = ni.getInetAddresses();
            while (ei.hasMoreElements()) {
                // アドレスを取得
                InetAddress ia = ei.nextElement();

                // IPv4でなければ無視
                if ( !(ia instanceof java.net.Inet4Address) ) {
                    continue;
                }
                // ループバックアドレスは無視
                if ( ia.isLoopbackAddress() ) {
                    continue;
                }

                // IPアドレスを取得
                ip = ia.getHostAddress();
                break;
            }
        }
    } catch (Exception ex) {
        Log.e("getLocalIpAddress: ", ex.toString());
    }

    return ip;
}

取得したInetAddress オブジェクトのクラスをチェックするというヤクザな方法なので、あまり参考にはならないかもしれません^^;