2016年12月4日日曜日

Raspberry Pi に無線LANの子機を買った


買ってからしばらくは有線でPCで接続して、ブリッジで誤魔化していたのですが、無線の方が机周りがごちゃごちゃしなくていいなと思ったので、無線に移行することにしました。

購入したのはELECOM WDC-150SU2MBKです。800円くらいで買えました。もう少し安いのがあったのですが、消費電力との兼ね合いも考えてこちらを選びました。

USBに差し込んで起動。まずは有線でsshでログインしようとするも、ブリッジ接続がうまく動いてくれずにログインできない状態に。かなり困ったのですが、手元にHDMI接続ディスプレイの環境とマウスがあったので、起動確認のためにそのあたりを挿しました。

GUIで動くのも分かり、また購入した無線LAN子機が家の電波をつかんでいることは確認できたので、適当なドキュメントを開きまくってコピペで無線LANのパスワードを突っ込んだところネットワークに入ることに成功しました。キーボードなんて要らなかった。

ネットワーク上に現れたら改めてsshでログイン。リモート接続の為のxrdpを入れたり、apache入れたりして、自宅サーバもどきは無事完成といったところです。

2016年11月11日金曜日

NTEmacs25.1をビルドした


前回からどうにか回避を考えたのですが、結局思いつかなかったので自分でビルドすることにしました。


今まで

  • NTEmacs25.1(簡易IME対応版)を利用させてもらっている(配布元)
  • インラインでの日本語入力時に、変換確定前後で文字の大きさが異なり、上下するのが気になる  
  • 更に24.5(gnupack)で使っていたinit.elの一部がエラーになる(w32-ime-initializeなど)
  • M-x describe-functionから見てみると、w32-ime.elやw32fns.cが無いことがわかる
  • 調べると、それらを生成しそうなパッチを発見、環境を作って当ててみることに
     

目標

  •  NTEmacs25.1 64bit 日本語インライン入力対応版を作成する

参考にしたもの


MSYS2のインストール 

まずは環境としてMSYS2のインストールを行います。はじめはMinGW-w64をインストールしてからMSYSをインストールしていたのですが、pacmanが使いたかったので初めからやり直しました。minGWをインストールしただけではlsが使えないというのが分かったのはよかったのですが。
使用バージョンは2.6.0だと思います。


 MSYS2の設定に関しては、環境変数HOMEが別のソフトに取られてしまっていたのと、CygwinのHOMEと合わせたかったので、msys2_shell.cmdとmingw64.iniでHOMEの設定。また、HOMEを共有しつつ.bashrcを別々に使いたかったので識別用の変数も設定しました。あとはminGWにパスを通すくらいです。

Cygwinで使っているPATHと分けたかったのと、環境変数PATHが長く変なところで誤動作を起こしたら嫌なので、そうならないようにいじったつもりです。minGW32は使う気がなかったので触りませんでした。


sys2_shell.cmd(追加行)
   set HOME=C:\(ホーム)
   set TERM=msys
   set CHECKTERM=MSYS


mingw64.ini(追加行)
   HOME=C:\(ホーム)
   CHECKTERM=MSYS

.bashrc
   if [[ $CHECKTERM = MSYS ] ] ; then
      echo "Loading .bashrc_sys..."
      source ~/.bashrc_msys
   else
      echo "Loading .bashrc_min..."
      source ~/.bashrc_min
   fi

  .bashrc_msys(一部)
   export TERM=msys
   export LS_COLORS="no=00:fi=00:di=01;36:ln=01;34"
   alias ls='ls -F --color=auto'

   export PATH=$PATH:/c/mingw-w64/usr/bin
   #これがないと動かない

   # -------------------------------------------------------------
   local_ver=`uname '-s' '-r' '-m' '-o'`
   echo "uname -srmo ->  $local_ver"
   cd ~


パッケージのインストールはこちらを参考にmsys2_shell.cmdから
   pacman -S base-devel \
   mingw-w64-x86_64-toolchain \
   mingw-w64-x86_64-xpm-nox \
   mingw-w64-x86_64-libtiff \
   mingw-w64-x86_64-giflib \
   mingw-w64-x86_64-libpng \
   mingw-w64-x86_64-libjpeg-turbo \
   mingw-w64-x86_64-librsvg \
   mingw-w64-x86_64-libxml2 \
   mingw-w64-x86_64-gnutls

Archで見た流れだ…とか思いながら眺めてました。特に失敗もなくラッキー。


Emacsソース入手


Emacsのソースはftp://ftp.ring.gr.jp/pub/GNU/emacs/からemacs-25.1.tar.gzを入手、解凍しました。また、使いたいパッチをここからタウンロードして、HOME/emacs-25.1に。
設定したHOMEに突っ込んだ上で、ここからminGW64.exeを起動。

この後は、
cd HOME/emacs-25.1
./autogen.sh
PKG_CONFIG_PATH=/mingw64/lib/pkgconfig  ./configure --prefix=/c/<checkout-dir> --without-imagemagick
 patch -b -p0 < emacs-25.1-w32-ime.diff
2016/11/10時点で、patchはエラーなく終了。

(一度patchの中を微妙に改行してしまったりしたようで、エラー祭りになりました。わけわからなくなったらtarまで戻るという…)


このあたりがすんだら
make
make install prefix=/c/インストールしたい先

なおインストール先ですが/c/gnupack-xxxx/app/emacsなど、emacsディレクトリを作って指定しないといきなりbinやshareが突っ込まれて大変になります。


問題がなければ、prefixで指定した先にemacsのファイルが作られていると思うので、emacs.exeが入っているディレクトリに必要なdllを突っ込みます。
横着して簡易IME版に入っていたdll全部持ってきたら怒られました。


差分はこんな感じです。



ビルドしたもの




 ビルドしていないもの





もともと文字の大きさや行間変更すれば対応できるじゃないか言えばそうなのですが、自力でパッチ当ててビルドの体験ができたので良かったと思います。
あとパッチ当てたついてに日本語変換で時々落ちる現象が止まればいいとか考えてます。


あと全く関係ない問題点

  •  MSYS2で十字キーとbackspaceとdeleteの挙動がおかしい
  • 十字キーは表示がおかしい、backspaceは見た目消えていないけど処理的には消えている?


2016年11月4日金曜日

NTEmacsを25.1にしたい


Emacsがメジャーアップデートしてからちょっと経ちますが、今更やる気になったので24.5からアップデートを試みました。
といっても、NTEmacsを落としてきてemacsディレクトリを既存のものと入れ替える程度のことしか行っていないのですが。

日本語の未確定文字が、編集行内に収まるように初めから設定されているのは非常にありがたいのですが、どうも25.1だと未確定文字と確定後の文字の大きさがずれているようで、入力毎に上下に動いてしまうのが気になっています。前は違和感はなかったので、どこかで設定できるのかなと思いたいです。

後は、もともとinit.elに書いていたw32-ime-initializeが聞かなくなっているようでした。
w32-ime.elがNTEmacs25.1には存在しないようで、24.5から抜いて突っ込んだりしたのですが、get-ime-mode関数が存在しないということでまたエラーを返されました。こちらはw32fns.cに存在している(らしい)のですが、確認できず。

get-ime-modeは、IMEの起動状態に応じてt,nilを返すだけだったので、無理矢理init.elに

(defun get-ime-mode()
    t )

とかアホなことを書いてエラー回避したのですが、そうするとウィンドウ左下に出している[Aa][J ]などのIMEの状態表示が[J ]で固定されてしまいました。IMEのON/OFFはうまく行っているので、入力システムには関係ないのかと思いつつ、結局元に戻しています。
(入力に影響がないのなら奇数回偶数回押されたらとも思ったのですが、バッファ移動した場合のことを考えてやめました)

公開されているパッチの中身をみるとget-ime-modeなどの問題は一気に解決しそうだなと思うのですが、ビルドの環境を整えるのもなと止まっています。

25.1からの新機能のdynamic moduleだとかで無理矢理get-ime-modeもどきをつくるか、IMEの状態表示を諦めるか、そもそもw32-ime-initializeをしないか…どうしましょうか。
(なおw32-ime-initializeをしなくても日本語入力は可能ですが、この場合もIME状態表示を諦めることになるようです)

25.1でinit.el編集していたのですが、自動でelispのガイドを出すようになってて読めない身としては大変助かりました。可能ならアップデートしたいのだけど…難しい。




2016年10月25日火曜日

SNP-7が使える軸を考えている

どこでも書ける信頼性とインク切れの時はぱったり出なくなる潔さが好きで、長らく三菱のパワータンクを使っています。
スマートシリーズはグリップの加工も好みで良いのですが、いかんせん軸の上部が割れやすいのが残念。さすがにノックの弾みでパーツが飛んでいくようになってきたので、そろそろ軸も替え時かなと。

どうせならハイグレードモデルを買おうかと検討してたのですが、あれの替え芯がSNP-07じゃなくてSJP-07だということを知って、家の替え芯ストック的に今回は見送りに(よく考えれば太さ的に同じ芯なわけなかった)。


ピュアモルトが互換軸と聞いて調べたらこっちもSJPの方ですし、SNP芯を受け入れてくれる軸はないのでしょうか。形状的に期待できないか。

財布の問題が無ければ「ピュアモルト+SJP替え芯+パワータンクスマートシリーズ本体」か「パワータンクハイグレード+パワータンクスマートシリーズ」と買って、外出用と自宅の机に転がす用に分けてストックの替え芯を使いつつ丈夫な軸を使うというのに。






2016年9月12日月曜日

Edk2とCygwin

UEFIshellで動くものを作ってみたいと思って、とりあえずedk2を落としました。サンプルがビルド出来れば良いかと思ってGetting started見ながら進めています。

cygwinで扱われることも想定しているらしく、きちんとsetup.exeで引っ張ってくるべきパッケージが説明されていたので、その通りに用意しました。

次にedksetup.shですが、何故かWORKSPACE、EDK_TOOLS_PATH、CONF_PATHの全てを設定した表示を出しておいて出来てなかったので
export WORKSPACE=/top/edk2-master
みたいな形で、表示されたものを手動で打ち直しました。

buildもそのままでは使えなかったので、
BaseTools/bin/Cygwin~/build -p AppPkg/AppPkg.dsc
で実行。動きはしましたがbuild.pyで「Failed to start command」エラーが出て停止。

Visual studioのnmake.exeの設定がおかしいようで、program folder(x86)を探して欲しいのにx86じゃない方を探しに行ったり、14.0をインストールしてるのに違う番号を指してしまっているのが原因のようでした。これは64bit環境なのにVSは32bit版インストールしてる自分が悪いような気もしますが。

build.pyでエラーなので
/BaseTools/source/Python/build/build.py
を訂正すれば済むだろうと思って見てたのですが思いの外長くて一旦諦めました。

(batファイルの方を眺めるとこっちの方にCygwinという単語が見えるし、shを使うこと自体が間違ってたのかもしれません。)

2016年9月11日日曜日

最近


  • pebble買ったのに環境整えてチュートリアル半分くらいで投げています。
  • Love2dを触りたくてluaを勉強しています。ガバガバでも通ってしまうことが多くて結構怖いです。出来れば9月中に完成させたいと思っているけれど、果たしてモチベーションを維持できるのか。
  • 適当に買った本を積みまくっています。OS自作本はきっと今後もお世話になるような気がしたので図書館借りをやめて購入しました。コンビニ受取が腰に来そうでやや不安。
  • 家のNASが不安定で監視したいけどやり方が思いつかずにいます。ラズパイと死にかけのネットブックで何とかなってもらえないかな。
  • PSPが完全に動かなくなる前に自作のプログラムを突っ込んで実機で遊ぶ体験をしたい。昔C言語で作れるというのを見た気がするから、ハードルはそこまで高くなさそうに感じるけれど、実際はどうなんでしょう。
  • ArchLinuxが楽しい。仮想環境に何度もインストールしているから手間自体はかからなくなったけれど、いまいちどのコマンドがどの設定を変えているのかが分からないのが悔しい。
  • Emacsのスクロールが重い。滑らかに動くパッケージを入れたけれど、マウスのホイールスクロールとは相性が悪いようで面倒。

2016年8月7日日曜日

Win10AnniversaryでPebbleSDKが動く



Win10提供一周年記念のアップデート「Anniversary」では、「Bash on Ubuntu on Windows」が搭載されてBashが動くようになりました。



Ubuntuっぽいものが動いてくれるのであれば、Pebbleの開発環境も動いてくれるのではないかと思って、公式サイトのLinux版のインストールの説明に沿って環境を作ってみました。

Linuxのインストール用のコマンドは全て通り、プロジェクトの生成とビルドも出来ました。

但し、Wi-fi経由で実機にデータを転送して実行するという機能と、QEMUのエミュレータでの実行は今のところ駄目なようです。

Wi-fiの方は、DevModeをオンにしてIPアドレスを指定しても[Errno 22]が出てしまいダメでした。
エミュレータ実行の方は、エミュレータ側からの信号待ちでループして先に進まなくなっているようでした。ホストとゲストの通信がうまく行っていないことが原因ではないかと思います。ネットワーク周りはまだ不完全という状態のようですし。


今のところは、/mnt/c/User/USRNAME/Dropboxにビルドしたものをコピーするようにして、iPhoneのDropbox経由でpebbleに送るようにしています。

CygwinでSDK整えようとして失敗していたので、このタイミングでのリリースは非常にありがたかったですね。


2016年5月1日日曜日

Del.icio.usからブックマークデータをエクスポートする

4/20くらいからソーシャルブックマークサービス「Delicious」にアクセスできなくなる事態が続いており、結構参っていました。
どうやらドメインが「Delicious.com」から「Del.icio.us」に変更になったようで、その過程でアクセス不能になっていたのでしょう。

ただ、その前からちょくちょくアクセス不能の自体が頻発していたので、とりあえずバックアップとしてブックマークデータをエクスポートすることに。

新ドメインの方では今のところ(4/30)エクスポートする為のページへのリンクがありません。
ただ旧ドメインの方では「https://delicious.com/settings/bookmarks/export」 で飛べていたので、同様に予めログインを済ませた状態で「https://del.icio.us/settings/bookmarks/export」と打ったところ無事飛べました。

エクスポートの形式はHTML一択になります。タイトルとURLと合わせて保存しておいたメモが出力されているので、そのままでも使えなくはないです。
日付が残らないのが惜しいけれど、出力できただけ充分か。

2016年4月20日水曜日

TiddlyWiki5導入メモと隠しTiddlerの場所



メインはEvernoteなのですが、見た目が面白そうだったのでとりあえず導入しました。

TiddlyWikiはローカルで作成できるWikiです。リンクを貼るのも検索するのも可能で、かつPCに1ファイル作って管理するので、持ち運びにも便利です。
TiddlyWiki5はTiddlyWikiの中での最新版に当たるようです(前のTiddlyWikiはTiddlyWiki Classicと区別される)。

使い方は簡単で、始めは公式サイトの指示に従って(Firefoxユーザーは必要なアドオンをインストールしたうえで)htmlを落としてきます。これを適当な位置において開き、出てくるダイアログに対して許可を選択すると、タイトル編集画面が表示されるので、適当に決めます。もちろん後から変更可能。その後は、ネットで「TiddlyWiki5 日本語化」で検索して、日本語設定へ。


 TiddlyWikiの高度な設定は、あらかじめ用意されている特殊な記事で行うようです(例えばタイトルの変更は、実際にはSiteTitleという記事の本文を変更している)。

これらの特殊な記事は、記事タイトルが「$:/」で始まっており、一部のものを除いては少しわかりにくい位置に存在しています。

恐らくレイアウトを変更していなければ、wikiタイトルの下にある「表示中」「最近の更新」「ツール」「詳しく」というタブがあるので、そこから「詳しく」-「隠し」を選択すると一覧が出てきます。

2016年4月10日日曜日

Bluetoothの接続デバイスを取得する(c++)

※素人のメモ書きです、ご注意ください。

Bluetoothの信号を受け取ってみるのを目標に、今回はまず一覧取得まで作ってみた(コードはGistに投げました)。

こちらのページを参考に、C++で作成。変更したのはwcoutとendlをそれぞれstd::wcout,std::endlにして#include<iostream>を追加したくらい。


基本的には、
  1. radio側の情報取得用配列(para_radio)を用意し初期化
  2. radio側ではHANDLEを作成、BluetoothFindFirstRadioでPC側の持っているBTH機器の位置(?)を構造体に送る(findで成功失敗を確認)
  3. 成功した場合、BluetoothGetRadioInfoでPC側の機器情報を用意した配列(info)に送る
  4. 機器名出力、BluetoothFindNextRadioで次のBTH機器を確認、あれば3へ
  5. device側の情報取得用配列(para_dev)を用意し、情報取得のためのフラグ設定を行う
  6. BluetoothFindFirstDeviceで情報を取得する
  7. 機器名出力後、BluetoothFindNextDeviceで次の機器を確認、あれば6へ
(5に関して、設定毎でどのように結果が変わるのかが気になったので、書いたコードではループしています)

HANDLE型のradioは、FILEみたいな振る舞いをするものかと思ったけれど、device側ではHANDLE型は使われていない。radio側とdevice側で扱う関数は、似ているけれど部分で違うようです。

  
visual studioで、構造体名などで右クリックで定義が見られることを知ったので、ヘッダファイルの見方も慣れていきたいと思いつつ。


--

 構造体BLUETOOTH_DEVICE_SEARCH_PARAMSに関して、

定義では

    BOOL    fReturnAuthenticated;   //  IN  return authenticated devices
    BOOL    fReturnRemembered;      //  IN  return remembered devices
    BOOL    fReturnUnknown;         //  IN  return unknown devices
    BOOL    fReturnConnected;       //  IN  return connected devices

    BOOL    fIssueInquiry;          //  IN  issue a new inquiry
    UCHAR   cTimeoutMultiplier;     //  IN  timeout for the inquiry

    HANDLE  hRadio;                 //  IN  handle to radio to enumerate - NULL == all radios will be searched


とあったが、実際にどうなるのか気になったのでfReturnUnknownとfReturnConnectedのみ確認しました(他はすべてTRUE)。
windows側のBluetooth設定で「BSHSBE21(ペアリング済)」「iphone(ペアリング可能」「不明なデバイス」の3つが表示されている状態での実行結果です。

 

fReturnUnknownはTRUEにすると「名前の取得に失敗していても表示」、fReturnConnectedは「ペアリング済のみ表示」になるようです。



Cortanaをコマンドラインから呼び出す

※素人のメモ書きですのでご注意願います。

--
(2016/10/27追記)
どのタイミングからか不明ですが、build 14393時点でCortanaの呼び出しショートカットが「WINキー+SHIFT+c」に変更になってました。コードのみ修正しました。


--

win10搭載のCortanaに関して、「コルタナさん」と口で言うのは格好良くない気がしたので別の方法で呼び出すことにした。

最初はwin10の資料を探せばCortanaを呼び出すAPIくらいすぐ出るだろうと踏んだが、英語資料が読めず断念。

ブラウザから呼び出せるschemeがあるということは公式サイト内の「コルタナを起動する」リンクから見つけられたが、入力後すぐに音声待ち状態にはならなかったので不採用。
(ちなみにschemeは ms-cortana://)

色々調べた結果、「WINキー+c」「WINキー+SHIFT+c」 のショートカットでCortanaが呼び出せることが分かったのでキー入力を送るプログラムを書くことにした。


--

まず思いついたのは、VBScriptの利用。メモ帳で書いて拡張子を「.vbs」にすれば完成するので手軽。詳しくはないけれど、SendKeysの使い方も入力キーを書いてやるだけだったので。

set obj =CreateObject("WScript.shell")
obj.SendKeys "^{ESC}"


winキーの指定方法がMSDNになかったけれど、「WINキーはCtrl+ESCで代用可能」とあったのでこのように書いた。しかし、これではうまくいかない。どうやら「Ctrl+ESC」の組み合わせは「WINキー」ではなく「スタートメニューを表示する」だけの組み合わせのようだった。
結局SendKeysでWINキーの指定方法が見つけられなかったので、この方法は諦めた。

--

次にSendInput(参考:MSDN)を使用する案が出てきたので、ほとんど書いたことがないC++で挑戦。普段はC言語かつemacsでコード書いてcygwin+gccなので、Visual Studioの使い方から分からないという事態に。

「プロジェクトを新規作成」から「Visual C++ - Win32コンソールアプリケーション」で作成。コードはこちらを参考にさせてもらいつつ作成。





(おそらく初歩的なミスなのだろうが、includeの順をwindows.h,stdafx.hにしていたせいで「No target architecture」が出て大変だった)

LPINPUT構造体に関してまともに情報を見つけられなかったのが悔しい。こういうのは定義を見にいけば良いのだろうか。

見た範囲だと
  • type - キーボード入力ならINPUT_KEYBOARD,マウス入力ならINPUT_MOUSEになる
  • ki - (おそらく)Keyboard Inputの略,マウス入力を作るならmiになるっぽい
  • wVK - WORD型(16bits?)でのキーコード指定、0~255までで指定できる(参考)
  • wScan - 不明
  • dwFlags - 0だとキーを押すイベント、KEYEVENTF_KEYUPだと指定キーを放すイベント
  • time - 不明
となりそう。


 SendInput自体は、
  • SendInput(回数,キーイベントの配列(LPINPUT),配列の大きさ)
なので分かりやすい。

とりあえず、
  1. lpkeyの値を変更してWINキー押下の情報を作る
  2. SendInputでWINキー押下するという情報を送る
  3. lpkeyの値を変更してCキー押下の情報を作る
  4. SendInputでC押下するという情報を送る
  5. lpkeyのdwFlagsのみ変更してCキー開放の情報を作る
  6. SendInputでC開放の情報を送る
  7. lpkeyの残りをWINキー用に書き換えてWINキー開放の情報を作る
  8.  SendInputで投げる
という手順で「WINキー+c」が完成。

後はこれをVisual Studioの上部にある「ローカルWindowsデバッガー」を押して走らせて、問題が無ければ、横の「Debug」を「Release」に変えて、もう一度「ローカルWindowsデバッガー」を押すとexeを作ってくれる。
作成場所は出力ウィンドウの「出力元」を見ればパスが出ているが、多分「ソリューションエクスプローラー」を右クリックして「エクスプローラでフォルダを開く」を選んだ方が早いと思う。

完成のexeを実行して問題が無ければ、後はコマンドプロンプトのパスが通るところに置くなり、aliasでパスを指定しておけば、コマンドラインからCortanaを呼び出せるようになる。

とりあえずcygwinのconfig.iniにcortanaというコマンド名でaliasを書いている。設定はしたが全く実用性はなさそう。


--

(C++の方法で出来たので試してはいないけれど、SendInputがどこかのdllで設定されているならrundll32.exeでコマンドプロンプトから直接実行できるのではという方法もあった。
仕組みが全く分からない上に情報がぼんやりしすぎてて博打感が怖い)



--
追記: Cortanaの音声受付に成功して、結果が返ってからアクティブがCygwinに返ってこないのが気になっている。気が向いたら直す。

2016年1月23日土曜日

raspberry pi買った

(2016/01/23時点の内容です)

raspberry pi 2 type Bを買った。
GPIOの意味も分からない初心者が買って何とかなるのかと思いつつ。

使いこなせたら楽しいかなと考えての購入なので、「**を作りたい」というモチベーションが無いのが不安。


Amazonでケース付き本体を6000円前後、mircoSDをPCショップで800円。
ACアダプタやUSBケーブルは、LANケーブルは手元にあったので、スターターセットみたいなものは選ばなかった。

一通り揃えてから、キーボード無しでネット接続出来るのかという疑問が湧いたけど、外付けキーボードを買っても置き場に困る気がしたので、まずはそのままやってみる事にした。

OSインストールは、winPCからraspianのイメージをSDに焼いて利用。
とりあえずそのまま有線LANを繋いで電源を投入したところ、動いてるっぽくなったので数分おいてからPCでssh接続、無事成功。

とりあえず分かりやすく何か喋るようなプログラム作ってみようかな。