HENkakuリリースされたのでPSVitaでHello Worldする

もうhenkaku.xyz行ったらそれだけでぜーんぶ完了しちゃって一瞬にして終了しちゃうので、自分でビルドしてHello Worldしてみるか~というお話。

https://henkaku.xyz/developer/を参考に!

 

あんまり多くをインストールしてないArchLinuxで実験。

取り敢えず環境構築。

cmakeが必要らしいのでまずそれをインストールしてから。

$ sudo pacman -S cmake
$ git clone https://github.com/vitadev/vdpm
$ cd vdpm
$ ./bootstrap-vitasdk.sh

パーミッション周りでめちゃエラー出てたっぽい。

bootstrap-vitasdk.shの中を見ると、/usr/local/vitasdkを$USER:$USERにchownするコマンドがあったぽいけど、$USERなグループってあったか?usersじゃない?

というわけで手作業で実行しリベンジ

$ sudo chown tea:users /usr/local/vitasdk
$ ./bootstrap-vitasdk.sh
$ export VITASDK=/usr/local/vitasdk
$ export PATH=$VITASDK/bin:$PATH
$ ./install-all.sh

インストールできたっぽいのでサンプルソースをパクってきてビルドする

$ cd ~
$ git clone https://github.com/vitasdk/samples
$ cd samples/hello_world/src
$ arm-vita-eabi-gcc -c -o main.obj main.c
$ arm-vita-eabi-gcc -Wl,-q -o homebrew.elf main.obj
$ vita-elf-create homebrew.elf homebrew.velf
$ vita-make-fself homebrew.velf eboot.bin

出力されたeboot.binをvpkに放り込めよって書いてあったけど、既存のvpkにアーカイブマネージャで突っ込むのじゃ流石にダメだったので、vita-pack-vpkを使う

こちらでバイナリが拾えそうだったので使わせていただく。libzip.so.4がないよと怒られたのでlibzipのインストールも。

$ unzip vita-pack-vpk.zip
$ chmod +x ./vita-pack-vpk
$ ./vita-pack-vpk
./vita-pack-vpk: error while loading shared libraries: libzip.so.4: cannot open shared object file: No such file or directory
$ sudo pacman -S libzip
$ ./vita-pack-vpk
Usage:
/home/tea/vita-pack-vpk [OPTIONS] output.vpk
-s, --sfo=param.sfo    sets the param.sfo file
-b, --eboot=eboot.bin    sets the eboot.bin file
-a, --add src=dst    adds the file src to the vpk as dst
-h, --help    displays this help and exit
$ alias vita-pack-vpk=/home/tea/vita-pack-vpk
$ cd samples/hello_world
$ vita-pack-vpk -b ./src/eboot.bin out.vpk
.sfo file missing.

sfoファイルがないとダメらしい。それらしくつくってリベンジ。

$ vita-mksfoex -s TITLE_ID=XXXX00001 "hello world" param.sfo
$ vita-pack-vpk -s ./param.sfo -b ./src/eboot.bin out.vpk

エラー出なかったのでこれをFTP経由でVitaに放り込んで、あとは通常のvpkと同じようにインストール。

 

バブルできた

バブルできた

 

 

LiveAreaもできる

LiveAreaもできる

 

ちなみに、今回使ったソースコードは、

#include <psp2/kernel/processmgr.h>
#include <stdio.h>

int main(int argc, char *argv[]){
printf("Hello World!\n");
sceKernelExitProcess(0);
return 0;
]

みたいな感じ。(サンプルそのまんま)

標準出力にHello Worldしたそのすぐ後にはもう終わりそうな行があるし、次の行にはreturnなので、つまりPSVita側で実行したらおおよそ何も見えずに終了してしまうのであった。

forで10000回くらい回せば見れるでしょ~とか思ってやり直してみたんだけど、時間が長くなっただけで画面には何もうつらなかった。アプリケーション起動しても標準出力は見えないんかなぁ。

 

ちなみに、ばっちりMakefile用意して貰えてるので、vita-pack-vpkの導入さえ出来ていれば全自動でイケる。

UbuntuでSSDをSecureEraseする

RAID環境にArchLinuxのインストール

順番が前後したけど、これやる前に、SSDをSecureEraseしたんですよね。で、まぁSecureEraseってやる度にどうやるのかわかんなくて、ふわふわ調べてやってて、毎度困り果てながら最終的になんとか遂行するみたいな状態。

困るのはたいてい、

・SecureEraseするためのソフトウェアが起動しない

・Not frozenに出来ない

のところ。Parted Magicが起動しないとかHDDErase起動するためのDOS環境が作れないとか、クッソ面倒に生きてた。クッソ面倒なんで結論だけ。

 

Core i7 870 + ASRock P67 Transformer構成で、Ubuntu 14.04.3をUSBメモリから起動して、terminalからhdparmコマンドを使った。

 

hdparm -I /dev/sdaみたいな感じで状態を確認する。最後の方にある「not enabled」と「frozen」をそれぞれいじる。まずはfrozenを解除。

これはもういつものやつ。SATAケーブルなり電源ケーブルなりを抜き差しする。いつものやつっていうかこれ毎度毎度めちゃくちゃこえーんだよな。

あと# echo -n mem > /sys/power/stateでPCをスタンバイに入れて復帰っていう手もあるみたい。

もう一度hdparm -I /dev/sdaで見ると、うまく行ってれば「not frozen」になっているはず。

次にディスクにパスワードを設定する(SecureEraseを実行すると解除されるものなのでてきとうに決める)。ただしパスワード設定したまま再起動等するとディスクアクセス出来なくなる模様なので以下のように解除する。master passwordはList of hard disk ata master passwords – I SEE 0XDEAD DISKSあたりを参考に。

//パスワードの設定
# hdparm --user-master u --security-set-pass PASSWORD /dev/sda

//master passwordによるパスワードの解除
# hdparm --user-master m --security-unlock MASTER_PASSWORD /dev/sda
# hdparm --user-master m --security-disable MASTER_PASSWORD /dev/sda

うまく設定できると、hdparm -I /dev/sdaの出力が変化して「enabled」になる。

 

つまり、not enabledがenabledになっている事、frozenがnot frozenになっている事を確認した後、SecureEraseを実行する。

# hdparm --user-master u --security-erase PASSWORD /dev/sda

ちなみにhdparm -I /dev/sdaの出力にsupported: enhanced eraseがある場合、Enhanced SecureEraseが可能なので、–security-erase-enhancedみたいな感じに差し替えてみよう。

最終的にまたhdparm -I /dev/sdaの出力が「not enabled」に戻っていることを確認して作業完了。

RAID環境にArchLinuxのインストール

普通にArchLinuxをインストールしようと思うと、「真面目にパーティション切らなきゃなぁ…」「そのためにどういう構成にするのか検討しないと…」とか思うのでまぁ問題ないといえば問題ない。

しかし例えばAntergosを使う場合には、cnchiというグラフィカルで大変簡単なインストーラがついてくる。これだとウィザードに従ってぽいぽい進めていけば、それだけでインストールが完了してしまうとかいう状況。

ArchLinuxを使いたいけどInstallBattleは面倒だなという場合には、大変重宝するのだけど、細かいことを意識しないまま作業を進められてしまうので、困ることもある。

というわけで、今回はそういうお話。

 

ちなみに構成はCore i7 870 + ASRock P67 Transformerに16GBくらいRAM載せてGTX750Tiぶっさした感じ(元メインマシン)。ここにCrucial C300 64GBを2つのせて、マザーボードで
RAID組んでる。OSから見たらただの1つのストレージデバイスに見えていると思い込んでいた(OSよりも下のレイヤーとして独立していると思い込んでいた)のが失敗で、実際にはOSに「ここでこんな感じでアレイ組んでますよー」と教えてあげる必要があったみたい。

RAID環境にインストールする場合、mdadmに何か喋らせたりしないといけないみたいなんだけど、全然意識しないままインストール作業終わらせちゃって、インストールも出来てブートローダも起動するけどなんだか見つけてくれない状態。具体的にはこんな感じ。

starting version 230
ERROR: resume: hibernation device ‘UUID=xxxx’ not found
ERROR: device ‘UUID=xxxx’ not found. skipping fsck.
ERROR: Unable to find root device ‘UUID=xxxx’.
You are being dropped to a recovery shell
Type ‘exit’ to try and continue booting
sh: can’t access tty: job control turned off
[rootfs ]# _

はい、完全にストレージを見失っております。

 

必ずインストールのときにパーティション構成を理解しておく。サイズから予想することも出来なくもないけど。今回は、

/dev/md126p1→/boot
/dev/md126p2→/
/dev/md126p5→swap

という構成(RAMが16GBもあるしswap不要じゃない?というのはAntergosのcnchiに言ってくれ)。

さて、AntergosのLiveCDから起動(今回はUSBメモリ使ったけど別になんでもいい、とにかくArchLinuxのLive環境が起き上がればそれで十分)して作業する。

RAIDにArchLinuxをインストール – RAID – ArchWikiをパクるだけ。

まずストレージのマウントを済ませる。(まだarch-chrootしてはいけない)

# mount /dev/md126p2 /mnt
# mount /dev/md126p1 /mnt/boot

mdadm.confを更新する。その後一応もくろみ通りの状態になっているか確認する。

# mdadm --detail --scan >> /mnt/etc/mdadm.conf
# vi /mnt/etc/mdadm.conf

chrootしてmdadmフックをmkinitcpio.confに追加する

# arch-chroot /mnt
# vi /etc/mkinitcpio.conf
HOOKS="base udev autodetect modconf block mdadm_udev keyboard keymap resume filesystems fsck"
# mkinitcpio -p linux

ArchWikiのブートローダーの設定の項目はやらなくても起動しました。

 

あとどうでもいいけどママンにのっかってるNICが死んでて全然繋がらなくて2時間くらい悩んだ。以前ママンのNIC死んだからって追加でNIC放り込んでたのすっかり忘れてたぜ

指紋認証を使う

使っているノートPCであるVPCS14AFJ、ふとlsusbの結果を眺めていると、

Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 007: ID 0489:e00f Foxconn / Hon Hai Foxconn T77H114 BCM2070 [Single-Chip Bluetooth 2.1 + EDR Adapter]
Bus 001 Device 006: ID 8086:0186 Intel Corp. WiMAX Connection 2400m
Bus 001 Device 005: ID 054c:02e1 Sony Corp. FeliCa S330 [PaSoRi]
Bus 001 Device 004: ID 04f2:b1dc Chicony Electronics Co., Ltd
Bus 001 Device 003: ID 147e:1001 Upek TCS5B Fingerprint sensor
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bluetoothはちらちら使うし、FeliCa S330もなんとなく使える。WiMAXは回線契約が無いので試しようもない。あと用途がさっとわかるもので使っていないのは、指紋認証のセンサーだ。

取り敢えず「Linux 147e:1001 Upek TCS5B Fingerprint」とかでぐぐると使用事例と共にarchwikiがヒット。

https://wiki.archlinuxjp.org/index.php/Fingerprint-gui

結局archwikiの内容をそのまま操作しただけで使えるようになった。取り敢えずsudoとlightdmで有効にしておけばかなり利便性は確保できるでしょう。

パスワードの入力と指紋の読み取りと、併用して使えるのが良い。手袋をしている、指が油まみれ(そもそもパソコン触るなよ)等の事情で指紋の読み取りが出来ないときに従来通りパスワードでも認証出来る。

また、CPU負荷はfingerprint-helperというプロセスが1%か2%程度食べるだけなので、非常に軽い。

ちなみに、読み取りに失敗するとか、登録されてない指を読み取らせるとかしても、通常のパスワード入力ミスの時とは違い、失敗したよタイムアウトはない。すぐさま読み取りにリベンジ出来る。

特に難しい事なく出来た。よかったよかった。

 

指紋認証リーダーって高いんだな。ノートPCにビルトインだったから気にしてなかったけど。

最近更新されたファイルを検索する

なにかチャレンジしようとしてパッケージをモリモリインストールしたりゴリゴリビルドしたりしたはいいけど、諦めたか成功したかともかく、元の状態に戻したいと思った時、システムに対してどんな変更を加えたのかはっきり覚えてある事もあれば、曖昧になってしまっている事もある。

パッケージマネージャで管理されていれば、記憶の片隅にあるパッケージ名からなんとなく削除をすればいいけれど、そうでない時、ないしパッケージ名が記憶の片隅にすらなかった時、困る。

という訳で、最近更新されたファイルを検索すれば良い。

find /path/to/find -type f -mmin -10

これで10分以内に更新されたファイルが検索される。ちなみに-10でなく+10にすると、10分以内に更新されていないものを検索する。便利に活用できそう。

この検索結果からうまく導き出せれば、曖昧になっていた変更点も探し出せるでしょう。

SQLでデータベースとそれへのユーザを追加する

データベースの追加と、そのデータベースにアクセスさせるためのユーザを追加する。

table見たり、情報拾ってきたり、更新したり削除したりは、割と頻繁に使うからなんとなく覚えてるんだけど、データベースの作成等は頻度が低くて絶対に忘れるので、メモ。

 

$ mysql -u root -p
create database DB_NAME;
grant all privileges DB_NAME.* to USER_NAME@'HOSTNAME' identified by 'USER_PW';
flush privileges;
quit;

これで一連の流れはお終い。rootでログインすんのかよとかそういう話は置いといて。大文字小文字もやりやすいようにやるってスタンスなんでそれも置いといて。

createで作成、grantで新しいユーザに権限を与えて、flushで情報をリロードさせると。

例えばnew_dbっていう名前のデータベースを作って、ローカルにいるユーザ名tea・パスワードtea_pwを使うとすると、

$ mysql -u root -p
create database new_db;
grant all privileges new_db.* to tea@'localhost' identified by 'tea_pw';
flush privileges;
quit;

みたいな感じですかね。例示する必要あったか?

fcitxを使う(Qt5製アプリケーションでだけ使えない話)

Qt4製アプリケーションとかその他アプリケーションでは正常に動作していて、問題なく入力出来ているんだけど、Qt5製アプリケーション(例えば、Qt Creatorとか)で日本語に入力切り替えできない(というかfcitxが動いてないっぽい?)という状態。

まぁ結局ArchWikiのFcitxのとこに載ってたしそれ見ればいいんだけど、これ

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

多くの情報源はこれを.bashrcに書けとか書いてあって、でも

.bashrcはインタラクティブなbashセッションを初期化するときに使われます。インタラクティブでないセッションやXセッションの初期化では用いられません。

だそうなので、.bashrcに書いた場合は、bashからQt Creatorを起動した場合にのみこれが有効となって、fcitxが正常に呼び出せる。

というわけで、今回は~/.xprofileに三行を書いて一件落着。

Qt4製アプリケーションとか、その他のアプリケーションでは普通に使えていたのは何故なんでしょうとは思うけど、まぁ使えるようになったしいっかな〜

ノートPCの初期化作業

ノートPCのストレージが壊れたで書いたように、SSDのSecureEraseとシステムの再インストールを敢行する事にした。

その手順の記録。

 

まずはSecureErase

基本的に、「SecureEraseするドライブはセカンドドライブであること」という記述のページばかり見つかる。以前やった時はシステムドライブであってもUSBブートとかでできたような…

と思って探していると、HDDeraseというソフトを使えという記事を見つけた。

しかしHDDeraseをインストールしたUSBスティックから起動できない。デスクトップPCなら動くみたいなので、ノートだからみたいなアレかなと

設定項目の存在しないカスタムBIOS割りと心の底からやめて欲しい(そこが原因なのかは知らんけど)

しょうがないのでデスクトップPCにSSD接続してHDDerase使うか~~と思ったけど、どうせデスクトップPCに接続するならIntel SSD Toolbox使えばええやろ(今回のSSDはIntel SSD 520シリーズなのだ)、という感じで作業した。

とにかく、

・素直にセカンドドライブとして接続する

・メーカー謹製のソフトウェアを使う

・電源サイクルとかいうヤバそうな所業も怖がらずやる

という感じで。

 

さてSSDの初期化が完了したら、次はシステムのインストールだ。AntergosはGUIインストーラを提供していて、細かいことは全部コイツがやってくれる(だからAntergos使ってる)

特に困ることはないだろうという事で全部割愛()

今までやってきたカスタマイズは全部初期化されているけど、必要なカスタマイズは必要になったときにやるでしょうという事で。

ただ、デフォのままだと数字と記号が表示されなかったのでこれは困った(何かの設定が変なのかと思って設定項目いじろうにも歯抜けしまくりで何も読めない感じ)けれど、ttf-miguとかttf-koruriとかをてきとうに放り込んだら見えるようになった。よかったよかった

 

 

前の環境の感覚で操作するといろいろ勝手が違いそうなので、そのへんが多少憂鬱ではあるけど、ドットファイルを引っ張ってくるだけで状態をそのまま移行できるシステムは非常に楽で良いですね

 

何の知見も存在しないゴミ記事になってしまった…

 

 

 

 

ArchLinuxでBrotherのHL-L2300を使う

BrotherのHL-L2300というレーザープリンタを衝動買いした。

何故買った

小型のプリンタが安く欲しいなと思って(狙っていたのはCanonのiP2700。3000〜4000円くらいで売ってる)ヨドバシに向かった結果、思ったより小さくない事、もっと小さいのを狙うとモバイルプリンタという括りになって、お値段が一気に2万円オーバーになること(予算は殆ど無い)がわかった。

小型、安価といのは店員さんも苦笑の要求の高さだったのだ。

で、どれくらいの頻度で印刷するの?と言われて、3ヶ月に一度、良くても月イチくらいですかね〜とか言ったら、それならレーザープリンタの方が良いんじゃないですかね、と。

インクジェットだと使用間隔が開くとインク詰まりで死ぬので頻繁に印刷するのでなければなんとかかんとか(よくわかってない)

で、もう小型も諦めていたので、この際買っちまうか、みたいな謎のノリで、大して小型でもなく、当初の予算からしたら圧倒的高価となるレーザープリンタを買ってしまったのだ。

 

使う

さて、買ったのはいいんだけど、Linux使いの常として、デバドラの提供具合が不安な訳だ。Brother公式からは.rpmと.debしか拾えなくて、ArchLinuxでどう使うっていうのはなんだか面倒そう。

aurを漁っていたらやっぱりあった、それらしいもの。brother-brgenml1だ。コメントに、

Works also for the Brother HL-L2300D.

とかいうのもついていて、今回買ったのはHL-L2300でDついてないけど、まぁ似たようなもんでしょ〜とか言って取り敢えずこれをインストール。

CUPSのWebインターフェースからでは、追加画面でうまくいかなかった(追加→プリンタ選択→認識されてるHL-L2300を選ぶ→各種情報入力→待つ→エラーが発生しました。エラーメッセージは「成功しました」)ので、コマンドラインから。

 

使えるようにする作業

$ yaourt -S brother-brgenml1
$ sudo lpinfo -v | grep HL-L2300
direct usb://Brother/HL-L2300%20series?serial=Exxxxxxxxxxxxxx
$ sudo lpadmin -p HL-L2300 -E -v usb://Brother/HL-L2300%20series?serial=Exxxxxxxxxxxxxx -P /usr/share/cups/model/brother-BrGenML1-cups-en.ppd

これに成功するとプリンタ一覧に表示されるようになったので、テストページ印刷して、動作確認。このモデルはカラープリンタではないので、テストページがちょっと味気ないけど、まぁいいか。

 

そのた

初期装備トナーは600枚くらい印刷出来そうな分量らしい。本来のトナーカートリッジはTN-28Jという奴で、2600枚とか。でもぶっちゃけ自分のような使い方で600枚を使い切るのもいつになるんだって感じだろうしなーとは。

文字を沢山読む時、PCモニタで表示するより、プリントアウトした方が読みやすいっていうのはあるので(解像度と光の強さの問題かな?)、ちょっと長めの文章とか、ちょいちょい印刷しちゃおうかなって気持ちになるくらいには喜んでいる。だって印刷めっちゃはえーし。ランニングコストはそう高く無いし(公式によると3円/枚くらいだそうな)。

消費電力は最大で400Wくらいあるみたいで、スタンバイでも50Wくらい食べるみたい。スリープ中は0.7Wでスリープからの復帰に10秒もかからないとか言ってるからデフォでスリープみたいな運用になるだろうけど、スタンバイ50Wは思ったより食べるなーみたいな印象。家にもともとあったCanonの複合機、MG5130は印刷時で20W未満だそうで、この大電力消費はレーザーだししょうがないなーみたいな感じ。

宅内鯖に接続してプリントサーバにするのもいーなーみたいに思っている。ノートで作業しててもデスクトップで作業してても同じように印刷出来るとなると、そりゃ便利だろうよって感じだし。

ちなみにそもそもなんで小型が欲しかったのかっていうと、持ち運びたかったからであって、このサイズ・重量ともなると、持ち運びは正直絶望的。何のために買ったんだ…。

/usr/lib/yaourt/util.sh: 190 行: 9616 Illegal instruction

$ yaourt -Syua
:: パッケージデータベースの同期中...
core は最新です
extra は最新です
community は最新です
multilib は最新です
antergos は最新です
/usr/lib/yaourt/util.sh: 190 行: 9672 Illegal instruction (コアダンプ) package-query "${PKGQUERY_C_ARG[@]}" "$@"

これをなんとかしましょうって話。

てきとうにぐぐったらそれらしいものを発見した。

そもそも/usr/lib/yaourt/util.shの190行目付近には何があるのかというと、

$ sed -n 185,195p /usr/lib/yaourt/util.sh
}

# programs call with command line options
pacman_parse() { LC_ALL=C pacman "${PACMAN_C_ARG[@]}" --color never "$@"; }
pacman_out() { $PACMAN "${PACMAN_C_ARG[@]}" "${PACMAN_O_ARG[@]}" "$@"; }
pkgquery() { package-query "${PKGQUERY_C_ARG[@]}" "$@"; }
y_makepkg() { $MAKEPKG "${MAKEPKG_ARG[@]}" "$@"; }
curl_fetch() { curl "${CURL_C_ARG[@]}" "$@"; }

# Run editor
# Usage: run_editor ($file, $default_answer)

190行目というとpkgquery()の行で、やはりpackage_queryが何かおかしいのかねという事(?)

ちなみにpackage_queryは

Query ALPM and AUR

という事で、ALPM/AURから検索してくれる奴っぽい。yaourtが検索部分を任せてるパッケージなのかな?

 

上記それらしいものに従って操作したらなんだか解決した。

$ sudo pacman -Rdd package-query
$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/package-query.tar.gz
$ tar -zxvf package-query.tar.gz
$ cd package-query
$ makepkg -sri
$ yaourt -Syua