raspberry piのarchlinuxarmでpkgfileが出来ない

症状

    # sudo pkgfile --update
    :: Updating 5 repos...
    warning: download failed: http://mirror.archlinuxarm.org/armv6l/core/core.files [HTTP 404]
    error: failed to update repo: core
    warning: download failed: http://mirror.archlinuxarm.org/armv6l/extra/extra.files [HTTP 404]
    error: failed to update repo: extra
    warning: download failed: http://mirror.archlinuxarm.org/armv6l/community/community.files [HTTP 404]
    error: failed to update repo: community

取得しにいってるURLの中にあるアーキテクチャ
armv6l
になっているが
armv6hでなければならない
/etc/pacman.confのArchitectureにもarmv6hとなっている

解決方法

https://github.com/archlinuxarm/PKGBUILDs/issues/704
ここでも報告されてるけどこの通りにする
このurlは/etc/pacman.d/mirrorlistの中で定義されていて
$archの文字列が置換されているがpacmanだと
先ほど書いた/etc/pacman.confで定義されている文字列が入るが
pkgfileはuname -mで返ってくる値が入る、これがarmv6lになってる
これはもうどうしようもないのでカーネルコンパイル時のバージョンをいじるか
pkgfileの仕様を変えてしまうか
変数を止めて定数に変えるしかないので手軽な最後のやつをする
/etc/pacman.d/mirrorlistを開いて

    Server = http://mirror.archlinuxarm.org/$arch/$repo

    Server = http://mirror.archlinuxarm.org/armv6h/$repo

にする

パソコンが死んだからraspberry piを買った

前書き

archlinuxを使い慣れてるし、過去に用意してるPKGBUILDを使いたいのでosはarchlinuxarmを選択
とりあえず次のパソコンを買うまでの間、そんなに期待しないデスクトップ用途で使うようにセットアップしていく
設定ファイルは事前に用意済みだとして書いているので完全な俺個人向けのメモ色が強いので注意

用意したもの

raspberry pi type B
32GBのSDカード sandisk extreme pro (一番速そうなの選んだ)
セルフパワーのUSBハブ elecomのU2H-EG4SBK (ACアダプタがついてて見た目がかっこいいの選んだ)
わざわざ買ったのはこの3点、後は既に家にあったもの

HDMI対応モニターとHDMIケーブル
LANケーブル
SDカードライター
MicroUSBのオスの充電器 (スマホの奴でいい)
USBキーボード
USBマウス
SDカードにOSを書き加えるためのパソコン

やったこと

ddなどをしてSDカードに書き込んだら
さっそくraspberry piを起動する

書き込んだimgファイルは2gbほどしかなく割当られてない領域があると思うのでここを参考にしながらパーティションをいじる
http://jan.alphadev.net/post/53594241659/growing-the-rpi-root-partition

それが終えたらアップデートをするためネットワークに繋ぐが
いきなり無線は面倒なので有線を使うため
LANケーブル指すと勝手に繋がって外にpingが打てたので

    # pacman -Syu

でアップデート

    # pacman -S base-devel

でmakepkgするのに必要なやつの導入

この間、時間がかかるのでalt+f2などを押して端末を切り替えてユーザーの追加や必要ならばswapの設定をしておくのがおすすめ

とりあえず再起動

キーボードがUSで今後に支障をきたすので

    # loadkeys jp106

/etc/vconsole.confに

    KEYMAP=jp106

base-develを入れたらsudoも入っていると思うがsudoの追加

    # pacman -S sudo

次にwheelグループのユーザがsudo使えるようにする

    # visudo

エディタが開くので以下の行を探す

    #%wheel ALL=(ALL) ALL

これの先頭の#を消して以下のようにアンコメント

    %wheel ALL=(ALL) ALL

普段使うユーザーの追加 (noterは使用するユーザー名に置き換えてください)

    # useradd -m -G wheel noter

今作ったユーザーにパスワードつける

    # passwd noter

パスワードを二回入力

今作ったユーザーでログインするため

    # exit

でログアウト

そしてさっき作ったユーザーでログイン

色々するのにほしい最低限の奴をインストール

    # pacman -S zsh tmux git vim

こんな設定も何もしてない環境は辛いので自分用のdotfilesの導入
とりあえず保存先作る

    % mkdir -p ~/misc/dev/git

移動する

    % cd ~/misc/dev/git

事前に用意してたdotfilesを落としてくる

    % glt clone https://github.com/silenvx/dotfiles.git

各自のdotfiles用bootstrapの実行

    % ./dotfiles/setsym.sh -i

zshの設定を入れたのでログインシェルを変える

    % chsh -s /bin/zsh

exitでリログイン

作業しやすいようにtmuxを立ち上げる

    % tmux -2 -u

guiの導入、デスクトップ環境にはawesomeを選択、端末はxterm

    % pacman -S xorg-xinit xorg-server  awesome xterm xf86-video-fbdev xorg-apps

このまま起動しても日本語フォントがないので
yaourtの導入とフォントの導入をするのだがその過程でメモリが足らないと起こられるので先にswapを作る

    # dd if=/dev/zero of=/var/swap bs=1M count=1024
    # mkswap /var/swap
    # swapon /var/swap

後は再起動しても使われるように
/etc/fstabに

    /var/swap swap swap defaults 0 0

これを追記しておく

aurからttf-rictyを導入したいので楽するためにyaourtをいれる

    # pacman -S yaourt

rictyをいれる

    % yaourt -S ttf-ricty

ここでかなり時間かかるので可能なら他のパソコンでパッケージ作った方がいい

alsamixserを使いたいので

    # pacman -S alsa-utils

imをいれるがその前に/tmpが足らなくなるのでtmpfsを使うのやめる

    # systemctl mask tmp.mount

そして再起動

    % reboot

imにはmozc-utを選択、ibusでは使わないのでuimのみで使うように
途中でPKGBUILDを編集したがraspberry pi上でコンパイルに1日以上かかったので注意

    % yaourt -S mozc-ut

この時、PKGBUILDの編集でarchにarmv6hを足す必要あり
vimで置換するなら
:%s/^ *arch=(/arch=('armv6h' /g
が楽
ほんとにコンパイルに時間がかかったのでクロスコンパイル推奨
できない人はバイナリパッケージ置いとくので使ってください
https://github.com/silenvx/mozc-ut-armv6h
ここに置いてる*.pkg.tar.xzを落としてきて、pacman -U *.pkg.tar.xzで入れたらいいです
ただ、ライセンス的にどうなんだろ?

この時まだlocaleを設定してないと思うので、やらないとmozcが動かないので
/etc/locale.genを開いて
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8の好きな方、もしくは両方をアンコメントしておいてから

    # locale-gen

後は起動時に勝手に環境変数LANGにこのどっちかが入ってるように
/etc/locale.confを開いて
LANG=en_US.UTF-8
LANG=ja_JP.UTF-8を書いておいて再起動

後は、なんだか黒い枠が画面にあったので
http://abc001.blog.so-net.ne.jp/2012-08-19
これすればよい

最後にtimezoneを合していなかったので

    # timedatectl set-timezone Asia/Tokyo

こうすれば日本時間に合わせられる
とりあえずこの記事で書くのはここまで、終わり

後書き

cpuがarmだからflashが動かないんだよなあ…
なんだか1年ぐらい前の状況に戻ってしまった気がする
1080pの動画はomxplayerっていうraspberry pigpu向けのソフトを使えば
コマ落ちなしで見れたが、使い慣れてるmplayerを使いたい…どうすればいいんだ

linuxでマイクと静止画をニコ生で流す

前書き

サイレントバイオリンを始めたので知り合いに聞いてもらう時に
ニコ生で配信できたら便利だと思った
別にニコ生じゃなくてもrtmpプロトコルで普通に送るやつならできると思うけどエラー処理を書き換えないとダメ

やり方

まずはニコニコ生放送を放送開始してから
放送画面の下にある、放送内容を変更するツール画面にて
外部ツール配信のタブを表示したのちに

この画像の緑色で囲っている箇所の
URL: を第1引数に
Stream: を第2引数にして
https://raw.github.com/silenvx/bin/master/nico_live.sh
このシェルスクリプトを実行するだけです
するとffmpeg経由で送信されます
音声の入力デバイスが複数ある場合などによっては
このシェルスクリプト内の -i hw:0を書き換える必要があるかもしれないです

とりあえず実際に放送する前に

        -f flv "$1/$2 flashver=FMLE/3.0\20(compatible;\20FMSc/1.0) swfUrl=$2"

これをtest.mp4などに書き換えて、問題なく録画可能か確認してから放送することを勧める

放送される静止画は

    video_image="`dirname $0`/logo_soundonly.png"

このようになっているので各自書き換えてください
このまま使うと、この実行ファイルがあるとこと同じ階層にある
logo_soundonly.pngというファイル名が流れます

後書き

ffmpegがエラー吐いてうまく行かないから2chで聞いたんだが未だに何が原因かわからん
とりあえずparse関連っぽい

はてなダイアリーの記事編集画面のリンク元の検索エンジンに書いてあるリンクなしのリンクを表示する

前書き

編集画面にいけばわかると思いますが、なんて検索したかわかる奴があるんですが
(refererのurlのqのパラメータがリンクの文字になっている)
qのパラメータがないとリンクに使われている文字がなくなってしまって
いちいちソースを見ないとリンクがわからなくなってしまっていては困る
ということでリンクの文字をurlに変えて表示させます
javascriptを使えばできる気がするので書いたことなかったですが書いたので
変なところがあったら申し訳ないです

やり方

firefoxの場合はこれをbookmarkに貼り付けて編集画面で実行するだけ

javascript:(function(){ var i,l=document.links.length; for(i=0;i<l;i++){ if(document.links[i].text==''){ document.links[i].text=document.links[i]; } } })();

ただ、画像がリンクになっていてリンクのテキストが設定されてない場合も対象になっちゃうので修正案募集中です

何してるか解説 (javascript書き始めて数時間の人が書いてるのであってるかは知らん、c言語かける人向け)

ソースコードを整形したもの

(function(){
    var i,l=document.links.length;
    for(i=0;i<l;i++){
        if(document.links[i].text==''){
            document.links[i].text=document.links[i];
        }
    }
})();
  1 (function(){
  8 })();

まだよくわかってないけど全部ローカル変数として扱えるらしい
詳しくはここ参照
http://d.hatena.ne.jp/sandai/20110824/p1

  2     var i,l=document.links.length;

変数の宣言、document.links.lengthにはwebページのリンク総数が入ってる

  3     for(i=0;i<l;i++){
  7     }

リンク分総当りで行くのでループさせる

  4         if(document.links[i].text==''){
  6         }

document.links[i].textって配列でそれぞれのリンクに使われてるテキストが取得できる
この場合、何も書いてない奴がほしいのでNULLと同じ奴をヒットさせてる

  5             document.links[i].text=document.links[i];

document.links[i]って配列でそれぞれのリンクのhrefを取得できる
それをリンクに使われてるテキストに代入して書き換えてるだけ

後書き

javascriptを書ける人から見たら記事を書く必要性があったのか疑問に思われそう
c言語とほとんど変わらないから取得方法を調べる以外は余裕だった

zip内のファイルを片っ端からmplayerに送るシェルスクリプト書いた

前書き

本当はmplayerでzip内のファイルを再生できるようにpatchを書こうと
ソースコードを眺めていたが面倒くさくなってシェルでなら前から再生できてたし
シェルスクリプトで書いたらなんかもう満足した
気が向いたらpatch書く
デメリットはcacheの領域超えたら再生できないこととか再生時間がどれだけあるかわからないとか色々ある
そういうわけなんで名前付きパイプなんて使わずにram disk上にファイル作成した方がいいと思います

本編と解説 (最初の2行以降は読まなくていいです)

https://raw2.github.com/silenvx/bin/master/z2m.sh
ここに置いてある。zipファイルを引数にして使う

短いとアレなんでシェルスクリプト書けない人のために何やってるか書くほどではないが書く
もしかしたら嘘書いているかもしれない

この記事書いた時のソースコード全体

#!/bin/sh
# zipの中にあるファイルを片っ端からmplayerに渡すプログラム

if [ -f "$1" ];then
    pipe=`mktemp -u`
    trap "rm \"${pipe}\";exit 1" 1 2 3 9 15

    mkfifo "${pipe}"||{ echo 'error: mkfifo';exit 1; }
    IFS=$'\n'
    for zipInFile in `zipinfo -1 "${1}"|sed -e 's/\[/\\\\\[/g' -e 's/\]/\\\\\]/g'` ;do
        echo " --- staring: ${zipInFile}"
        unzip -p "${1}" "${zipInFile}" > "${pipe}" &
        mplayer "${pipe}"
    done
    rm "${pipe}"
else
    echo "not found: $1"
    exit 1
fi
      1 #!/bin/sh

スクリプトの1行目はどこそこに置いてあるプログラムの引数として実行しますって意味
この場合/bin/sh z2m.shとして実行される
#!がマジックナンバー

      2 # zipの中にあるファイルを片っ端からmplayerに渡すプログラム

ただのコメント

      4 if [ -f "$1" ];then
     ()
     16 else
     17     echo "not found: $1"
     18     exit 1
     19 fi

ファイルが存在してるかどうか判定してる
なかったら何もできないのでエラー表示して終了
ifは引数に書いてるコマンドが0かそれ以外か見てる。0ならthen、それ以外ならelseに飛ぶ
[に-fオプションをつけるとその後ろにあるファイル名が存在するかどうかで戻り値を変える、あれば0
変数に使ってる$1はシェルスクリプトに使われた第1引数が入ってる
この場合 z2m.sh hoge.zipとかって使われることを想定しているからhoge.zipが入ってる
exitはプログラムの終了、その引数の数字はシェルスクリプト自体の戻り値、1は基本的にはエラーに使う

      5     pipe=`mktemp -u`

pipe変数にmktempコマンドの標準出力を入れてる
``で囲うことで中身のコマンドの標準出力に置き換えることができる
mktempは一時ファイルを作成するコマンド、-uオプションをつけると作った振りをして他とかぶらない名前だけ標準出力される
作ったファイルが消せなくなると困るのでpipe変数に入れてます

      6     trap "rm \"${pipe}\";exit 1" 1 2 3 9 15

Ctrl+Cとかされて途中終了されてしまうとゴミファイルが残ってしまうのでそういうコマンドを感知したら
プログラムが終了する前に消すように命じてる
trapの第1引数は実行するコマンド、第2引数以降はシグナルを指定する
シグナルってのはkillコマンドでプログラムに送るアレ
それぞれの数字の意味は各自調べてください、覚えてないです
rmは引数にあるファイルの削除

      8     mkfifo "${pipe}"||{ echo 'error: mkfifo';exit 1; }

名前付きパイプを作成して、失敗したらエラー表示して終了してる
mkfifoは名前付きパイプっていうファイルを作成できる
これは普通のパイプのファイル版と思ってもらっていい
ファイルのようにパイプが使えるけど何で直接mplayerに渡さないかというとそうするとCUIでのキー操作を受け付けなくなるから
途中に書いてる||はmkfifoの戻り値が0以外だったら次に書いてるコマンドを実行してくれって意味
echoは引数に書いてる文字列の標準出力を行う
これまた途中に書いてる;は次に実行するコマンドを1行で書く時に間に挟む
なんで{}で囲ってるかというと、どっかで||の後ろは1つしかコマンドが実行されないとかどっかで見た気がするから
こうすることで1つまとめにできる

      9     IFS=$'\n'
     10     for zipInFile in `zipinfo -1 "${1}"|sed -e 's/\[/\\\\\[/g' -e 's/\]/\\\\\]/g'` ;do
    ()
     14     done

IFS変数は区切り文字を入れるとforなどで勝手にその文字で区切って別けてくれる
ここでは改行だけ区切り文字にしたいから$'\n'を代入してる、この文字列で改行を指定できる
forは繰り返しを行いたい時に書く
第1引数に第2引数から得た文字列をIFS変数を参考に区切ってループしていく
全部区切り終えたらループからは脱出する
zipinfoは引数に指定されたzipファイルの情報を出力するプログラム
オプションで-1を指定するとファイル名が1行ずつ表示される
これをsedっていう置換プログラムに送ってる
この後使うunzipは[や]の文字が正規表現として扱われてしまうのでエスケープするようにしてる
sedの-eオプションはこの後正規表現を書きますよという意味
''で囲まれてる文字列は、そのままの意味なんで勝手に解釈しないでくれって意味
ようはエスケープじゃないしスペースは引数の区切り文字じゃないよって言ってる
最初に書かれてるsは置換します
その後の/はこれから書く時は区切り文字は/ですって言ってる
\[は置換前の文字で[が正規表現に使われてるので\を使ってエスケープしてる
\\\\\[は置換後の文字で\も書きたいならエスケープする必要があるので\\と書いてる、ようは\\[って書いてあって
\が1個多いのは変数の中身を出す時も勝手にエスケープされちゃうから1個多く書いてる
最後のgは対象の文字列は全てs(置換)するという意味
その次の-e以降も同じ
最後に書いてある;doとdoneはfor文はdoから始まってdoneで終わる必要があるから書いてある

     11         echo " --- staring: ${zipInFile}"

どのファイルを解凍して再生するかわかるように出力してる

     12         unzip -p "${1}" "${zipInFile}" > "${pipe}" &

unzipに-pオプションを足すと標準出力に解凍するファイルが出力される
1つ目の引数は対象のzipファイル
2つ目の引数はそのzipファイルの中身のpathを指定して、解凍するファイルを選んでる
その後に書いてる>は標準出力を書き込むためのものでその後に書いてる名前付きパイプに上書きしている
最後の&はバックグラウンドで実行している、つまり終了を待たずに次にコマンドに以降できる

     13         mplayer "${pipe}"

名前付きパイプをmplayerで再生してる

    15     rm "${pipe}"

正常終了前にちゃんと消しておく

linux版firefoxでshockwaveを使う

前書き

http://askubuntu.com/questions/48140/compatible-version-of-adobe-shockwave-player
ここに書いてあることをそのままするだけですが
shockwaveのexe版だとなぜかインストールできなかったのでそれを混じりながら書く
ちなみにこれをするとlinuxfirefoxの中にwine上のfirefoxを埋め込んで表示する

やり方

wineでfirefoxを導入
最新版のwin版は
http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US/
多分この辺りにあるのでそこからダウンロードして

    % wine 'Firefox Setup 26.0.exe'

こんな感じでインストールして色々ウィンドウが出るので初回起動もしておく

次にshockwavemsi版をインストールする
http://www.adobe.com/products/shockwaveplayer/shwv_distribution3.html
ここにリンクがあると思う
今だと http://www.adobe.com/go/sw_msi_installer
ここからリダイレクトされるところにある
ダウンロードしたら http://appdb.winehq.org/objectManager.php?sClass=version&iId=20531&iTestingId=60908
ここに書かれてる方法を参考に

    %  msiexec /i sw_msi_installer

こんな感じでインストール可能、言わずもがなsw_msi_installerはダウンロードしたファイル

最後にmozpluggerを導入する
archlinuxの場合はaurにあるので

    % yaourt -S mozplugger

これで導入可能だけどメッセージに

    ~/.mozilla/firefox/<profile-dir>/pluginreg.dat

こんなのを削除せよと出てると思うから指示に従ってpluginreg.datを削除
後はshockwaveっぽい拡張子の埋め込みの時に勝手に動くように
/etc/mozpluggerrcの最後に

    application/x-director: dir,dcr,dxr,cst,cct,cxt,w3d,fgd,swa: Macromedia Director file
            swallow(firefox.exe) fill stream: wine "C:\\Program Files\\Mozilla Firefox\\firefox.exe" -chrome "$file"

これを追加してから実際にできてるか
http://www.adobe.com/shockwave/welcome/
ここを開いて確認して終了

ホームディレクトリ構成を晒してみる

構成

    ~
    ├tmp
    ├bin
    └misc
      ├tmp
      ├download
      ├music
      └dev
        ├tmp
        ├srv
        ├git
        └各言語名

役割

~/tmp

終わったらすぐ消すようなファイルの置き場所 (気軽にrm -rf ./*ができる)
解凍する時とかソースみたいだけの場合は主にここ

~/bin

他人からパクってきたプログラム置き場

~/misc

ホームディレクトリがごちゃごちゃしているのは嫌だったのでここにまとめてる
名前の由来はgentoo使ってた時にパッケージのカテゴリにmiscが使われてたから

~/misc/tmp

終わってもすぐには消さないようなファイルの置き場所 (気軽にrm -rf ./*ができない)
はてなダイアリーの記事を書く時はここに保存してる

~/misc/download

ダウンロード先
不要のものとそうでないものが、ごちゃごちゃしてしまって分からなくなってしまったらrenameして新たに作りなおす

~/misc/music

音楽の置き場所
アーティスト名/cd/毎に別けてるけど複数のアーティストがいたりするから実際は整理できてない

~/misc/dev

開発関係

~/misc/dev/tmp

試しに書いて放置する時の置き場所
ほぼ~/tmpで済ませてるから出番ほぼなし

~/misc/dev/srv

サーバの開発関連

~/misc/dev/git

gitで管理するファイル、dotfilesや~/binに置くような自作スクリプトもここにある

~/misc/dev/各言語名

どれにも属さないような、とりあえず置いときたい奴、例えば履歴書とか