2016/07/27

Mac OSX karabiner のリモートデスクトップ接続で IMEオンオフ

Mac OSX + karabiner でリモートデスクトップ接続する時に、無理矢理JISキー対応を利用していて、IMEのオンオフをキー割り当てしていなかったが、利用頻度が上がったのでIMEのオンオフを「かな」に持ってきた

無理矢理JISキー対応では、HOMEキーに割り当て(コメントアウトしてある)を行っているが、私の接続する端末は、時々私が実環境を使うため、HOMEキーがIME切り替えになっていると都合が悪いのです。また、その環境では「カタカナ」キーのみでIMEのオンオフする変更も行っています。
ということで「かな」キー→「カタカナ」キーを行おうと「カタカナ」キーのコードを調べましたが、載ってな〜い。ので「全角半角」キーにしてみた
実際は ALT と組み合わせないと IMEのオンオフが効かなかったので、それとコピペもついでに

private.xml に
<symbol_map name="RDC_VK_ZENHAN" type="KeyCode" value="0x32">

    <!-- カナキーで全角半角 -->
        <autogen>__KeyToKey__ KeyCode::JIS_KANA, KeyCode::RDC_VK_ZENHAN, ModifierFlag::OPTION_L</autogen>

    <!-- コピペなど -->
        <autogen>__KeyToKey__ KeyCode::X, VK_COMMAND, KeyCode::X, VK_CONTROL</autogen>
        <autogen>__KeyToKey__ KeyCode::C, VK_COMMAND, KeyCode::C, VK_CONTROL</autogen>
        <autogen>__KeyToKey__ KeyCode::V, VK_COMMAND, KeyCode::V, VK_CONTROL</autogen>
        <autogen>__KeyToKey__ KeyCode::Z, VK_COMMAND, KeyCode::Z, VK_CONTROL</autogen>
なんかを加えます

コピペは、ネットワークが遅いと、Winキー が先に処理されて、その後 C が押されたりするので環境によっては微妙です

ところで、リモートデスクトップの新しいバージョンで JISキー問題が解決されているという事ですが、うちでは karabiner をオフにすると、記号が相変わらずずれるんですが...

2016/07/24

moto 360 2nd gen. のペア設定

一部の wearアプリで時計側に表示されない問題が有り、リセット(ペア解除)を行い、再度ペア設定を行おうとして、ハマったのでメモ

先に結論
Android Wearの「ペア設定」より先に Bluetoothの「ペアリング」を行うと、Android Wearの「ペア設定」ができなくなります
「ペア」の文言がわかりにくいですが、

Android Wear「ペア設定」= Bluetoothペアリング + Android Wearアプリとの同期

という事らしく、Bluetoothのみでペアリングをしてしまうとウォッチが探せなくなるようです。
また、上記の状態で、スマホ側のBluetoothペアリングを解除しても、ウォッチ側のペアリングが残っている限り、Android Wearからのペア設定は不能になるので、ウィッチ側のペア解除=ウォッチの初期化 が必要となります。

2016/07/19

moto 360 2nd gen を使ってみて(更新)

moto 360 2nd gen. を購入

42mm のシルバー/コニャック が何故か国内で売ってないので、米国Amazonで注文
普通便で 7/4深夜注文 → 7/12 到着(着予定は25日)

セットアップの前に、まずは充電と、充電器に乗せたら起動。充電=電源オン というタイプのデバイスらしい
なので、先に Android 端末へ Android Wear アプリ を入れておきましょう

moto 360 の同期していますやアップデートが変に長かったりしますが、気長に待ちましょう
ワケワカになった時は、moto 360 の設定から「スマートフォンとのペア設定解除」で初期化して、最初からやり直すのが吉
Android Wear アプリを開いて、左上に「Moto 360 接続済み」となればOK
ペア設定でうまくいかない編

常に時計を表示しない設定(moto 360側)を利用できます(手首をひねると点く)が、充電器に乗っている間は、画面が表示されたままになります。

電池持ち
全く利用なし(スマホとの接続有り)で 3~5%/9時間 くらい、常に表示しない設定+ポツポツ通知受けで 20%/9時間 くらいなので、私の使い方では2日もつかな。毎日充電すると思うけど

焼きつき
moto 360 は液晶なので、有機ELに比べて焼きつきは起こりにくいですが、バックライト寿命を考えると、充電台に載せる前にシアターモードにしておくとよいです。
シアターモードは、上部から下ろしたメニューで選択するか、リューズをダブルクリックします。(復帰はリューズをクリック)

充電と発熱
充電中は本体なのかQi側なのか、かなり発熱します。
夏場は充電終了後もQiによる熱が伝わって、高い温度のままになります。35℃以上では充電が中断する。や、熱により液晶ムラが起こるというのをネットで見かけました。

また、接続するACアダプタの出力が大きいとQi側の発熱が大きく、上記の35℃規制にかかり、全く充電が進まないようです。純正と同じ容量(5V 550mAh)のACアダプタを利用しましょう

充電が完了しても、Qiの特性上?発熱は続くため、私はスイッチやタイマーを利用して、充電が終わる頃に給電を停止しています

更に、moto 360 2nd は、ベルト取り付け部が背面よりもせり出しているため、通常のQi充電器に乗せると隙間ができうまく充電できません。症状としては充電と充電異常を繰り返して、異常に発熱します。
※初代 moto 360 は、背面が平面で通常の Qi が使える
純正と同じ形状の Qi と純正と同じ出力のACアダプタを利用すべきです。
(別の場所でも充電するため、形状が同じ互換充電台を購入しましたが、問題なく使用できています)

ベルトのシミ
コニャック色なので、汗をかいたり濡れたりするとシミになります → 解決可
乾くと消えると思っていたら乾いてもシミのままでしたが、調べるとこの種類のバンドは、染色が馴染んでいない状態で濡れると、濡れたところだけ色がしみだしてしまうそうです。
バンドだけを外して、水を張った洗面器に3分程度つけ、タオル等(色落ちしてもいいもの)で押さえて表面の水分を拭き取った後、非陰干しにするとシミ(のようなもの)がなくなりました。
最初、こわごわと1分くらい漬けたら、全くシミが取れませんでしたので、状況により時間を変えてみましょう


定番っぽいアプリ
ポケット電卓 - ウォッチ画面で使える電卓
カレンダー表示アプリ - 多数あるので好きなのを(インストールしたら、いきなり moto 360 が再起動するのもあった)
WearTasker - Tasker のタスクを呼び出したり、ウォッチ側へ通知を表示させられる
Feel The Wear - Notifications - 任意アプリの通知をウォッチのバイブでお知らせ(有料版はバイブパターンを作成できるらしい)
Moto Body - 歩数・心拍数等から、運動量を記録したい方


個人的に楽しめそうなのは、WearTasker (他にも同様のあり) Tasker のタスクを呼び出せるので、moto 360 からスマホのマナーモードを切り替えたりも出来、プラグインを通じて Taskerからウォッチへ通知を表示することも可能です
この手のアプリは、使用前に Tasker で外部からの接続を許可する必要があります
あとは、スマホ側アプリで使いたいタスクを選択→ウォッチ側に同じ一覧が表示され、タップすると実行されるという具合です。moto 360 のキャプチャ(実際は丸いです)

上記の WearTasker の無料版は登録できるタスクが3つまでに制限されていて、課金してしばらくすると(Google認証)制限が解除されます(課金は150円弱くらい)

ウォッチの画面キャプチャは、Android Wear アプリのメニューに「ウェアラブルで画面ショットを撮る」というのがあります。10~20秒するとスマホ側に通知され、何かのアプリへ渡して保存という流れです。

【追記】
WearTasker をアンインストールして、再インストールすると Watch側に表示されなくなる場合があります。アンインストールしてそれぞれを再起動しろと FAQ にかいてありましたが、それでも症状が改善されないため、アンインストールして2~3日放置してから、再インストールして正常になりました。


2016/07/13

Amazon.com からの配送日数

Amazon.com から普通便(723JPY)で 7/4に注文 → (7/25到着予定) → 7/12到着

高い特急便で5日程度と聞いていたが、普通便でも8日で到着
着予定を長く取って、特急便へ誘導しようとしているのだろうか
最終配達者は佐川さんでした

2016/07/12

Outlook.com のPOP3認証エラー(Gmailで)

最近 Gmailでエラーがなんとかと表示が出ていたので、確認したら hotmail.com(Outlook.com)のPOP3認証エラーが出てた
Outlook.com のリニューアルにともなって、POP3認証のデフォルトがオフになったのね
地味な嫌がらせか、Outlook.com アプリの出来が良いとのウワサもあるので、そっちを使えということだろうか


BitTorrentSync の最小化起動

BitTorrent Sync のバージョン1系統(XP, Vistaで使用)を自動起動させる

1系統は自動起動に難があるらしく、自動起動しない事が時々発生
ということで、スタートアップへ登録

そのまま登録しても GUI(Web)が起動してしまうので、タスクトレイのみで起動するため /minimized オプションを付加する

BTSync.exe /minimized

どっかに記載されていた /S オプションではタスクトレイのみの起動にはなりませんでした〜

2016/07/08

kobo touch でフォルダ分け

最近、移動が多いため kobo touch を引っ張り出してきて使っているが、フォルダ分けができない
そーゆーのは「コレクション」というので行うようです(階層構造はできません)
フォルダというよりラベルに近く、一つの書籍を複数のコレクションへ登録できます。

が、作成作業は本体で行うため、トロい、トロすぎます
暇な時にぼちぼちやるしかないです
それと、有名な作者名くらいかな漢字変換に入れておいてほしい
(野村と打って、野村證券とか要りません、野村胡堂とかいれといて)

2016/07/07

さくらのレンタルサーバーで、実行ファイル添付のメールを削除(その3 完結)

その1, その2 につづいて、実行ファイルチェックをチェックします

その2までで、あとはphpでメールを分解して終了コードに何を渡すかだけなので、もっとよいコードがあると思いますが、最終形 の exemail.php です

<?php
 // エラー表示
 // ini_set('display_errors', 1);

 // ブロックする拡張子
 $match_ext = array( 'com',
      'bat',
      'hta',
      'js',
      'docm',
      'scr',
      'dmg',
      'exe');

 // タイムゾーンとPEARのパス
 date_default_timezone_set('Asia/Tokyo');
 set_include_path("/PEARスクリプトの場所/PEAR");

 // PEAR
 require_once("Mail.php");
 require_once("Mail/mimeDecode.php");

 // メール取得
 $data = file_get_contents("php://stdin"); // 標準入力から
 // $data = file_get_contents("/スクリプトの場所/exemail.eml"); // ファイルから(Webでテストする場合)

 // メール読み込み
 $params['input'] = $data;
 $params['include_bodies'] = true;
 $params['decode_bodies']  = true;
 $params['decode_headers'] = true;
 $params['crlf'] = "\r\n"; 

 // 判定
 $maildata = Mail_mimeDecode::decode($params);
 if( matchExeAttach($maildata) ){
  // echo "1";
  exit(1);
 }else{
  // echo "0";
  exit(0);
 }

// -------------------------------

// メールデータのチェック
function matchExeAttach($maildata){

 if( strtolower($maildata->ctype_primary) === "multipart" && is_array($maildata->parts) ){
  foreach($maildata->parts as $part){
   if( matchExeAttach($part) ){
    return true;
   }
  }
 }else{
  if( is_array($maildata->ctype_parameters) && array_key_exists('name', $maildata->ctype_parameters) ){
   $filename = $maildata->ctype_parameters['name'];

   if( in_array(strtolower(pathinfo($filename, PATHINFO_EXTENSION)), $GLOBALS['match_ext']) ){
    return true;
   }elseif( strcasecmp(pathinfo($filename, PATHINFO_EXTENSION), 'zip') == 0 ){
    // zipファイルは、一時フォルダを作成してその中に保存
    $zipdir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tmp_' . strval(time()) . '_' . strval(rand(1000, 9999));
    mkdir($zipdir);

    $zipfilename = $zipdir . DIRECTORY_SEPARATOR . 'tmp_' . strval(time()) . '_' . strval(rand(1000, 9999)) . '.zip';
    if( file_put_contents($zipfilename, $maildata->body) !== false ){
     if( matchExeZip($zipfilename) ){
      remove_directory($zipdir);
      return true;
     }else{
      remove_directory($zipdir);
     }
    }
   }
  }
 }

 return false;
}


// zipファイルのチェック
function matchExeZip($zipfilename){
 try{
  $zip = new ZipArchive();
  if( $zip->open($zipfilename) ){
   for ($i=0; $i < $zip->numFiles; $i++) {
    $filepath = $zip->getNameIndex($i);
   
    if( strcasecmp(pathinfo($filepath, PATHINFO_EXTENSION), 'zip') == 0 ){
     // zipにzipが含まれる場合・展開して再帰
     $zip->extractTo(pathinfo($zipfilename, PATHINFO_DIRNAME), array($filepath));
      if( matchExeZip(pathinfo($zipfilename, PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR . $filepath) ){
       return true;
      }
    }else{
     if( in_array(strtolower(pathinfo($filepath, PATHINFO_EXTENSION)), $GLOBALS['match_ext']) ){
      return true;
     }
    }
   }
  }
 }catch (Exception $e){
  return false;
 }
 return false;
}


// ディレクトリ(中身も)削除
function remove_directory($dir) {
 if ($handle = opendir("$dir")) {
  while (false !== ($item = readdir($handle))) {
   if ($item != "." && $item != "..") {
    if (is_dir("$dir/$item")) {
     remove_directory("$dir/$item");
    } else {
     unlink("$dir/$item");
    }
   }
  }
  closedir($handle);
  rmdir($dir);
 }
}

?>
Mail_mimeDecode へ入れたデータのマルチパートからファイル名を取得します。
zipは、一時ディレクトリを作成して、そこへ展開、中身のチェックを行います。
一時ディレクトリを利用するのは、zipが入れ子になっているパターンが考えられ、ZipArchive はパスごと展開されるため、ひとつのディレクトリに押し込みたいのが理由です。
remove_directory はどっかのサンプルそのまま

最後に、非常に大きなメールでサーバ負荷が上がらないように .mailfilter へサイズ指定もしておくとよいです
if ( $SIZE < 1024000 )
{
 `/usr/local/bin/php /スクリプトの場所/exemail.php`
 if ( $RETURNCODE == 1 )
 {
  to "maildir/.Trash/"
 }
}

【追記】
.mailfilter は、Webコントロールパネルからホワイトリストやブラックリストを追加すると上記スクリプト記述部分に余分なダブルコーテーションが入ったりしますので、追加後は必ず修正しましょう

さくらのレンタルサーバーで、実行ファイル添付のメールを削除(その2)

その1(pearインストール、phpと.mailfilterの動作確認)の続きです

その1の動作チェックで保存した、実行型ファイルを添付したメールのソースファイル(下記では exemail.eml)を利用して Webから基本的なエラーやPEARの利用可を確認しておきます

exemail.php を下記のように書き換えて、Webから開いてみます
<?php
 // エラー表示
 ini_set('display_errors', 1);

 // タイムゾーンとPEARのパス
 date_default_timezone_set('Asia/Tokyo');
 set_include_path("/PEARスクリプトの場所/PEAR");

 // PEAR
 require_once("Mail.php");
 require_once("Mail/mimeDecode.php");

 // メール取得
 // $data = file_get_contents("php://stdin");
 // file_put_contents("/スクリプトの場所/exemail.eml", $data);
 $data = file_get_contents("/スクリプトの場所/exemail.eml"); // メール着信の代わり

 // メール読み込み
 $params['input'] = $data;
 $params['include_bodies'] = true;
 $params['decode_bodies']  = true;
 $params['decode_headers'] = true;
 $params['crlf'] = "\r\n"; 

 $maildata = Mail_mimeDecode::decode($params);

 echo "ok";
 exit(1);
?>

上記の解説

// エラー表示
エラーの可視化

// タイムゾーンとPEARのパス
php.ini の設定と重複していますが .mailfilter からの呼び出しには php.iniの情報が使われないようすなので、個別に記載

// PEAR
ライブラリの読み込み

// メール取得
stdinからメールを読み込む代わりに、その1で保存しておいたファイルを取り込みます

// メール読み込み
PEARへメールを読み込ませます
include_bodies, decode_bodies, decode_headers をtrueにします
※デコード類trueは、非ascii 添付ファイル名の解析に必要

作成した exemail.php を Webから開いて、エラーなどを潰していきます
エラーや警告が無く、ok と表示されれば、順調です

ここまでくれば、メールの添付をチェックして、exitで0(実行添付なし)か1(実行添付あり)を返すだけ

その3(完結)へつづく

さくらのレンタルサーバーで、実行ファイル添付のメールを削除(その1)

さくらのレンタルサーバーで、ウィルスチェックを有効にしても、実行型ファイル、特にzipでくるんだメールが次々と入ってくる。最近は javaの脆弱性を突いた .js ファイルも大量に入ってくる。
Gmailみたいに、実行型ファイルはNGなフィルタがそのうち提供されるかもしれないが、待ってられない

ということで、実行型ファイルが添付されたメールを振り落とす計画

ざっくりした構成は maildrop の .mailfilter から 実行型ファイルの添付を判断する phpスクリプトを呼び出して、その結果(リターンコード)からゴミ箱行きとする。です
spamフィルタのように、ヘッダ記載を追加する方法も、基本的な流れは同じです→こちらの記事で動作の違いを確認してます

まずは、下準備から

PEARの導入
php からメールをバラす必要があるので 面倒ですがお決まりな PEARライブラリを導入します
(一度入れておけば、メール関連の楽しみが増えるのでここはガマン)
基本的な導入方法は、こちらにとても詳しく記載されています

  1. go-pear.php を置いて、Webから開く→自分でダウンロードしてくる
  2. さくらのコンパネから php.ini へパスなどを追記(timezoneもいれておくとよい)
  3. go-pear.php から追加パッケージをインストール

今回は、Mail/mimeDecode.php を使うので Mail_Mime と Mail_mimeDecode のパッケージを追加でインストールしておきます


.mailfilter と phpの動きを確認
メール着信時の動作ということで、デリケートな作業になるため、.mailfilter と php の連携を予め確認しておきます
まずは、下記のような exemail.php を作成して適当な場所へ置きます
<?php
 // ini_set('display_errors', 1);

 $data = file_get_contents("php://stdin");
 file_put_contents("/スクリプトの場所/exemail.eml", $data); // メールソースをファイルに保存

 exit(1);
?>

次に さくらの MailBox/アカウント ディレクトリにある .mailfilter を編集します
.mailfilter が存在しない場合は、そのメールの受信拒否リスト等を登録すると作成されます

.mailfilter へ 下記を追加します
`/usr/local/bin/php /スクリプトの場所/exemail.php`
if ( $RETURNCODE == 1 )
{
 to "maildir/.Trash/"
}

先ほどの exemail.php を呼び出して、リターンコードが 1 の場合、ゴミ箱行きという意味です
.mailfilter は、改行コードがLF、スクリプトを囲むコーテーションが &H60 であることに注意!
(改行コードや文字コードの判別が可能なエディタを利用するとよいです - わたしは sakuraエディタ)

上記の設置後、メールを着信させてみて、exemail.php の場所に exemail.eml が作成され、メールがゴミ箱行きになっていれば、つかみはOKです

exemail.eml を適当な名前に変更して、実行ファイルや実行ファイル入りzipを添付したメールを何通か送って、メールのソースファイルを作成しておきましょう、後々のテストで利用します。

【追記】
.mailfilter は、Webコントロールパネルからホワイトリストやブラックリストを追加すると上記スクリプト記述部分に余分なダブルコーテーションが入ったりしますので、追加後は必ず修正しましょう


その2へつづく

2016/07/06

maildrop の .mailfilter で php 実行の種類

maildrop の .mailfilter で php 実行させた時のあれこれメモ
さくらのレンタルサーバーのメールで、独自のフィルタを作成するにあたって、php の実行方法による動作の違い

xfilter で php スクリプトを呼び出した場合

.mailfilter
xfilter "/usr/local/bin/php /home/HOHOHO/www/FUFUFU/test.php"
if ($RETURNCODE == 1)
{
 to "maildir/.Trash/"
}

test.php
<?php
 $data = file_get_contents("php://stdin");
 file_put_contents("php://stdout", $data);
 // exit(1);
 return 1;
?>

結果
  • php で return 1; も exit(1); も $RETURNCODE へ値が反映されない(常に0)
  • stdout を行わないとメールが消失する(stdin → stdout をセットで利用)
    echoで出力してもok
  • stdout で出力した結果(メールソース)がその後利用される → ヘッダに結果を残すなど
  • exit(1); を使うと stdout が動作していない様子 → メールが消失する

シングルクォーテーション(&H60) で php スクリプトを呼び出した場合

.mailfilter
`/usr/local/bin/php /home/HOHOHO/www/FUFUFU/test.php`
if ($RETURNCODE == 1)
{
 to "maildir/.Trash/"
}

test.php
<?php
 $data = file_get_contents("php://stdin");
 // file_put_contents("php://stdout", $data);
 exit(1);
?>

結果
  • php で return 1; は $RETURNCODE へ値が反映されない
  • php で exit(1); は $RETURNCODE へ値が反映される
  • stdout を行う必要はない(出力しても無視される)



呼び出し方法による、用途の違い

xfilter
メールソース(ヘッダ追記など)を書き換えて、ヘッダになにか残したりする場合は xfilter を利用
その名の通り、フィルターなので stdout や echo でメール内容を出力しなければ、データが消失します
プログラムが異常終了した場合、メールが到着しない可能性がある

シングルクォーテーション
メールソースを変更する必要がなく、メール内容や着信イベントでプログラムを動作させ、結果の終了コードで分岐を行ったり、プログラムから別のメールを送信するなどの用途
stdin でメールソースを受け取るが、stdout は不要(出力しても無視される)
プログラムが異常終了しても、メールが到着するため比較的安全


2016/07/05

Word から Google Drive へ保存で「ファイル アクセス権のエラーのため保存できません。」

Word から Google Drive へ保存で「ファイル アクセス権のエラーのため保存できません。」と頻繁に出て鬱陶しい



ファイル → オプション で、バックグラウンド保存をオフにする

大きいファイルでなければ、遅いと感じるほどではないと思います(昔はバックグランド保存なんてなかったし)

ファイル保存のプライオリティが低くて、ダラダラと保存している間に Google Drive の更新イベントが発生してしまうのでしょう。ファイルをロックしてしまう Google Drive もどうかと思いますが。

2016/07/03

Galaxy S7 edge + Camera Zoom FX でカメラ無音化

Galaxy S7 edge + Camera Zoom FX でカメラ無音化

標準の設定だと SILENT CAMERA をオンにしても無音化されない
(設定の Silent Shutter Strategy を変更しても同じ)

設定から Use Camera2 API をオン + SILENT CAMERA をオンで無音化が可能になる

2016/07/02

OneNote for Android へサインイン出来ない(解決)

Evernote 値上げにともなって、ポイントが残っている間に OneNote にも慣れておこうと Android の OneNote へサインインしようとしたが、サインインできない
状況を把握
アカウント
  • デスクトップOSで確認して有効

Android の MS-Office系アプリケーションのサインイン状況
  • Word → NG
  • Excel → OK
  • OneDrive → OK
  • OneNote → NG
Wordについても、OneNoteと同じ状況であるため WordからOffice情報のリセット(この端末のログイン情報など)を行い、Wordへ再度サインインする
※この項目は Excelにも存在するので、そちらで行っても同じと思われます


Wordでサインイン後、OneNoteを起動すると無事サインイン状態で実行されました

2016/07/01

T-01C rooted を完全初期化

root取った状態で放置されていた T-01C を完全初期化のメモ

データの初期化
  1. Up + Camera + 電源 → Factory data reset
システムの初期化
  1. 富士通のサイトからファイル(T01C_TO_SP_FY1.zip - 約268MB)を取得
  2. 上記 zip ファイルを解凍(prg/T01C_TO_SP_FY1.enc)し、prgフォルダごとmicroSDへ入れる → T-01Cへ装着
  3. Up + Camera + 電源 → System update