2025年2月23日日曜日

podcast & mp4ファイルプレイヤー

おーい!クラウド聞けよー!ということでTBSラジオ「ハライチのターン!」をradikoプレミアム(を録音したやつ)とpodcastで聴いている。テレワークや通勤中に聞いているが、問題がいくつかある。

  • できれば交互に放送回とアフタートークを聞きたいが切り替えが面倒
  • 録音ファイルとpodcastのボリュームが合ってない
  • テレワーク中電話がかかってきたりしたらすぐに止めたい(マウスカーソルをボタンに合わせたり、Fnキーを押しながら~とかは煩わしい)
  • pauseした後、次に起動したら続きから聞きたい
  • 車の中で通勤中に聞きたい(androidで動いてほしい)

これを解決できるちょうどいいアプリがあるか探してみたが、当然というかこんなニッチなものは見つからない。

仕方ないので、windowsとandroidの両対応が将来的に計画されていたtauriで(当時 tauri1.0)ハライチのターン!用プレイヤーを作ってみようとした。

  https://github.com/tthogehoge/TurnPlayerTauri

 


podcastのURLの取得方法はよくわからないが、https://note.com/toru_a/n/nbc260312bdfbを参考にやってみたら取得できた。

 ファイルとpodcastでpodcastの方がボリュームが小さい問題は、とりあえず右下のボリュームで、ファイルの方のボリュームを下げることにした。本当はreplaygainみたいなことをやってボリュームを均一化したかったができなかった。

 F1キーですぐに停止、F2キーで再生する。とにかくF1を押せば止まるようにしたかった。逆にwindows全体でF1/F2キーが効かなくなるが、これを動かすためだけのPCで動かしているので問題ない。

tauri2.0に移行してandroid用にもビルドできるようにはなったが、webviewの問題なのか、androidだとm4aファイルがどうしても再生できなかった(再生できるファイルもある。録音ソフトの問題かもしれない)。mp4ファイルをいろいろいじったりすれば何とかwebviewでも再生できそうだったが、ファイルアクセスの権限が分からな過ぎて断念。 android用は別で作ることにした。(書けたら書く)

 android用はさておき、とりあえず自分が使う分には問題ないものができた。細かい部分は結構苦労したが、割とすぐ使えるものができて最近のweb技術はすごいなーと思ったりした。ただ、作法が分からな過ぎて専門でやっている人から見ると内部は無茶苦茶になっている気がする。

2018年3月22日木曜日

Tカード

クレジット付きTカードが期限切れになって、新しいカードが送られてきた。
日ごろから同じIDにポイントがたまるTカードが2枚あればいいのになーと思ってたんで、古いクレジットカードを2枚目のTカードとして使えるか試してみた。
何食わぬ顔でコンビニで出してみたんだがダメだった。
Tカードにも期限が設定されていたようだ。残念。

2017年2月26日日曜日

ハードディスク換装 ubuntu

ハードディスクがなんかエラーを吐きはじめた


[ 1641.504719] ata1.00: exception Emask 0x0 SAct 0x7fff SErr 0x0 action 0x0
[ 1641.504722] ata1.00: irq_stat 0x40000008
[ 1641.504724] ata1.00: failed command: READ FPDMA QUEUED
[ 1641.504727] ata1.00: cmd 60/08:08:30:50:65/00:00:5c:00:00/40 tag 1 ncq 4096 in
                        res 41/40:08:30:50:65/00:00:5c:00:00/00 Emask 0x409 (media error)
[ 1641.504728] ata1.00: status: { DRDY ERR }
[ 1641.504729] ata1.00: error: { UNC }
[ 1641.538356] ata1.00: configured for UDMA/133
[ 1641.538375] sd 0:0:0:0: [sda] tag#1 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 1641.538378] sd 0:0:0:0: [sda] tag#1 Sense Key : Medium Error [current] [descriptor]
[ 1641.538380] sd 0:0:0:0: [sda] tag#1 Add. Sense: Unrecovered read error - auto reallocate failed
[ 1641.538382] sd 0:0:0:0: [sda] tag#1 CDB: Read(10) 28 00 5c 65 50 30 00 00 08 00
[ 1641.538384] blk_update_request: I/O error, dev sda, sector 1550143536
[ 1641.538396] ata1: EH complete
ta

再起動したらinitramfsで止まる。
とりあえずここを参考にfsckでbadblockを避けるようにする。(sda6がroot)

(initramfs)$ fsck -t -y -f -c /dev/sda6
(initramfs)$ reboot

とりあえず起動はするようになったが寿命だろう。
(seagate2TBだ。もっと前に買ったHGSTのはまだ大丈夫そう。新しい奴もHGSTのやつにしたかったが大容量のものは売ってなかった。仕方ないのでWD)
動いているうちに何とかしたい。再インストールしようかとも思ったが、いろいろカスタマイズしているので、もう一度やるのはめんどくさい。
新しいハードディスクをつなげてパーティション分けてコピーする。
/bootと/を分けてないので分けている人は注意。

パーティションを分ける


fdisk /dev/sdb

g create a new empty GPT partition table
DOSパーティションタイプは古いらしい。GPTとかいうやつにしてみる。
n add a new partition
swapとrootを作る
→間違いだった。UEFIでブートできるようにgrub用領域とかESP領域とかを作る必要があったようだ。(参照リンク
t change a partition type
swapはタイプを変更しておく
w write table to disk and exit
書き込む

フォーマット

mkswap /dev/sdb1
mkfs.ext4 /dev/sdb2

適当にマウントしてコピーする。


tar cSpf - . | tar xpf - -C /mnt/dst/

(linuxを2つ入れていたので壊れてない方から実行した。
ない場合はCD起動とかrsyncで--one-file-systemでコピーとかしたらいいはず)

rootのマウント先を変えておく


UUIDをチェック

$ ls -l /dev/disk/by-uuid/
合計 0
lrwxrwxrwx 1 root root 10  2月 26 02:35 6b0b30e8-略 -> ../../sda1
lrwxrwxrwx 1 root root 10  2月 26 03:53 8e7422d4-略 -> ../../sdb1
lrwxrwxrwx 1 root root 10  2月 26 02:35 97ecc96f-略 -> ../../sdb2
lrwxrwxrwx 1 root root 10  2月 26 02:35 d227743f-略 -> ../../sda6

コピー先のfstabを編集してチェックしたUUIDを置き換えたい先のUUIDに書き換える
# / was on /dev/sda6 during installation
UUID=d227743f-略 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda1 during installation
UUID=6b0b30e8-略 none            swap    sw              0       0
↓みたいに変える
# / was on /dev/sda6 during installation
UUID=97ecc96f-略 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda1 during installation
UUID=8e7422d4-略 none            swap    sw              0       0

次はgrubをなんとかしたい


新しい方で起動させ、そっちの方からgrubを入れる方針
update-grub2を実行すると自動的に他にインストールされているディストリを探してセットしてくれる

$ sudo update-grub2
Generating grub configuration file ...
Linux イメージを見つけました: /boot/vmlinuz-4.4.0-64-generic
Found initrd image: /boot/initrd.img-4.4.0-64-generic
Linux イメージを見つけました: /boot/vmlinuz-4.4.0-63-generic
Found initrd image: /boot/initrd.img-4.4.0-63-generic
Linux イメージを見つけました: /boot/vmlinuz-4.4.0-53-generic
Found initrd image: /boot/initrd.img-4.4.0-53-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Found Ubuntu 16.04.1 LTS (16.04) on /dev/sda5
Found Ubuntu 16.04.1 LTS (16.04) on /dev/sdb2  <== 新しいやつ

再起動して新しいやつから起動
起動したかと思ったが、root=UUID=のところが新しいUUIDに変わってなかった。
ただのコピーである/boot/grub/grub.cfgから拾ってきているからだろう。
eキーを押して手作業でUUIDのところを変更してctrl-xで起動する。

linux   /boot/vmlinuz-4.4.0-53-generic root=UUID=d227743f-略 ro  quiet splash $vt_handoff
起動したらそっちでgrubをインストールする。

$ sudo grub-install /dev/sdb
grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible.
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
grub-install: エラー: will not proceed with blocklists.

エラーがでてインストールできなかった。まずい。
以下回復作業を色々試行錯誤。

どうやらGPTにしたのでUEFI用の何かをやらないといけなかったようだ。
UEFIでブートできるようにESP領域とやらを作る必要があるらしい。
また、grub用の領域も必要らしい。

いったん旧OSで起動し、ここを参考にgdiskでswapを削除、grub用の領域とESP領域とを作成。

1: サイズ2M, タイプ EF02(BIOS boot partition)
2: サイズ+512M, タイプ EF00(EFI System)
6: サイズは残りを割り当てる, タイプ Linux swap

パーティションIDがずれるのでsを押してsort
sdb2とかの番号が変わるので、うっかり防止のため再起動
mkswapをやり直し、UUIDが変わるのでfdiskを再編集した。

$ sudo grub-install /dev/sdb 

で、BIOSの設定を変えて再起動し確認する。
一度パーティションIDをsortする前にgrub-installしてその後sortしたら
grubのrescueで止まってしまったが、もう一度grub-installしたらOKだった。
最後、ここを参考にして、壊れているパッケージをチェックした。

$ sudo debsums_init
$ sudo debsums -cs
見つかったパッケージを
$ sudo apt install --reinstall 見つかったパッケージ

一応これでOKのはず。

2016年9月10日土曜日

flash player 23 beta for linux

今はpipelightを使ってflashの最新を使っている。
http://tthhfugapiyo.blogspot.jp/2015/07/pipelight.html

どうやらversion23からlinux版が復活しそうなようだ。(2ch情報)
pipelightは結構クラッシュするし起動が遅いので、早速移行してみる。

1.ダウンロード

http://labs.adobe.com/downloads/flashplayer.html
linux版64bitを取ってくる。

libflashplayer.so

2.有効化

pipelightを無効にして、~/.mozilla/pluginsに置いたが、古い方を優先してしまっている模様。
firefoxの設定で片方無効化しようとしても、両方無効化されてしまう。(同じプラグイン名だから?)
しょうが無いので以下にaptで入れたもの(というかaptで入れたinstallerが取ってきたもの?)
が置いてあるので、置き換えた。

/usr/lib/flashplugin-installer
動かしてみたら意外と普通に動いている。

3.デュアルディスプレイの問題

デュアルディスプレイの片面でフルスクリーンにしておき、もう片面で作業しようとすると、
フルスクリーンが解除されてしまう。
対応方法を探した。 ↓
http://www.webupd8.org/2012/10/ubuntu-multi-monitor-tweaks-full-screen.html

とりあえず読んでみて簡単そうなのは、libflashplugin.soをバイナリエディタで編集し、
_NET_ACTIVE_WINDOWを別の文字に置き換える
(_AET_ACTIVE_WINDOWとか)という方法。
やってみたらうまく行った。

付録:vimでバイナリエディタ

簡単なバイナリ編集くらいはvimでやりたいので調べてみた。↓
http://d.hatena.ne.jp/rdera/20081022/1224682665

やってみたが、エラーコードみたいなの(bash  command not found endifみたいな感じ)
で置き換えられてデータが飛んでしまう。うまく動いてないようだ。

とりあえず:help hex-editingを読んでちょっと修正。

augroup BinaryXXD
  autocmd!
  autocmd BufReadPre  *.bin let &binary =1
  autocmd BufReadPost * if &binary | silent %!xxd -g 1
  autocmd BufReadPost * set ft=xxd | endif
  autocmd BufWritePre * if &binary | %!xxd -r
  autocmd BufWritePre * endif
  autocmd BufWritePost * if &binary | silent %!xxd -g 1
  autocmd BufWritePost * set nomod | endif
augroup END

2016年8月16日火曜日

GnuCashで日本の株とか


素晴らしい物を作っている人がいたので使い方をメモっておく。

http://liosk.blog103.fc2.com/blog-entry-185.html
http://liosk.blog103.fc2.com/blog-entry-204.html
日本の株価とかがgnucashで取って来ることができる。

最新は↓にあるようだ。
https://github.com/LiosK/Finance--Quote--YahooJapan

インストール方法も書いてあるけど、
ユーザの環境変数をいじらないと行けないので、
どっちかというと古いやり方の方が好み。
よって以下のようにした。


1. GnuCash / Finance::Quoteインストール


# apt install gnucash

(libfinance-quote-perlは勝手に入るようだ。)

2. Finance::Quote::YahooJapanインストール


↓でインストール先を調べておく。
$ dpkg -L libfinance-quote-perl

必要なファイルはYahooJapan.pmだけのようなので、ダウンロードして以下に置く。

/usr/share/perl5/Finance/Quote/YahooJapan.pm

で、これが読み込まれるように/usr/share/perl5/Finance/Quote.pmの184行目あたり、
YahooJapanを追加する。

             Yahoo::USA YahooYQL ZA_UnitTrusts YahooJapan/; }

あとはgnucashを起動したら読み込まれているので、↓のやり方で使える。
http://liosk.blog103.fc2.com/blog-entry-185.html

2016年8月6日土曜日

apache2のuserdirとsuEXEC


Ubuntu 16.04 LTSを新たに入れたところsuphpはすでに無くなっていたようだ。興味がなくなったのでやめるっぽい。(勘弁してくれ)
ずっとアップグレードで運用していたのでわからなかった。
以前やっていた方法ではダメなのでepgrec再構築を兼ねてメモを残す。

userdir上でphpをユーザ権限で動かそうとして色々やってみたがどうにもならん。意味不明すぎる。
仕方ないのでvirtualhostで動かした。

方針

1. virtualhostを新たに定義、使いたいユーザだけSuexecUserGroupで実行ユーザを決める。
2. ユーザ用のcgi-binを用意、phpのラッパーを置く
3. phpをそのラッパーで開く

インストール


apache2
apache2-suexec-custom


(libapache2-mod-suphpはお亡くなりになったらしい)
mysql-server
php
php-cgi
php-mbstring
phpmyadmin

virtualhost

/etc/apache2/sites-available/001-user.confを作る

# conf-enabled/serve-cgi-bin.confがベース -------- ①
<IfModule mod_alias.c>
    <IfModule mod_cgi.c>
        Define ENABLE_USR_LIB_CGI_BIN
    </IfModule>

    <IfModule mod_cgid.c>
        Define ENABLE_USR_LIB_CGI_BIN
    </IfModule>




    <IfDefine ENABLE_USR_LIB_CGI_BIN>
        # ユーザごとのcgi-binをつくる
        ScriptAliasMatch ^/~(.*)/cgi-bin/(.*) "/home/$1/cgi-bin/$2"
        <Directory "/home/*/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +FollowSymlinks
            Require all granted
        </Directory>
    </IfDefine>

</IfModule>

<VirtualHost *:80>
    # 000-default.confとuserdir.confがベース
    DocumentRoot /var/www/html
    ServerName hogehoge # サーバ名
    SuexecUserGroup user1 user1 # suexecで動かすユーザ
    UserDir public_html
    UserDir disabled root

    # 000-default.confとuserdir.confがベース
    <Directory /home/user1/public_html>
        AllowOverride All
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI FollowSymLinks
        <Limit GET POST OPTIONS>
            Require all granted
        </Limit>
        <LimitExcept GET POST OPTIONS>
            Require all denied
        </LimitExcept>
    </Directory>
</VirtualHost>



※/etc/hostsにサーバ名を書いて、それでアクセスする


userdir.confを編集

virtualhostの設定と重複するので、userdir.confの方のuserdirを無効にする。

/etc/apache2/mods-enabled/userdir.conf を編集
<IfModule mod_userdir.c>
    UserDir public_html
    UserDir disabled root user1 #ユーザを無効にする。


suexec


suexecを有効にする。
a2enmod suexec
 suexecでphpを実行する。ユーザディレクトリごとにphpをおいてそれを実行することで、phpをユーザ権限で動作させる。
/etc/apache2/suexec/www-dataを以下のように設定

/home
public_html
①で設定したcgi-binにphpのラッパーを置く
・実行権限をつける
・他ユーザからの書き込みアクセスはNG: chmod g-w

cat php
#!/usr/bin/php-cgi

.htaccess

AddHandler cgi-script .cgi
AddHandler php-script .php
Action php-script /~user1/cgi-bin/php


a2ensite 001-user
a2enmod userdir
a2enmod actions
a2enmod auth_digest


いろいろ試行錯誤しすぎて漏れがあるかもしれない

2016年7月20日水曜日

ScanSnap iX100 on Ubuntu Linux 16.04 (wine)その2

前回の結果、とりあえずScanSnap Managerをwineで起動するところまでは出来た。
でも、ものすごく読み取りが遅くて実用に耐えない。しかも3枚までしか取れない。
何が問題で遅くなっているのか見てみようと思った。

遅い原因を探す(DEBUGフラグ)


https://wiki.winehq.org/Debug_Channels
を参考にデバッグフラグをつけて動かしてみた。
 +relay,+snoop

OKなとき、↓のInitializeのCALLで色々やったあと、RETで戻ってくる。
808373:0038:CALL PfuSsImgCtl.SsICSRGBInitialize(<unknown, check return>) ret=060bc073
808395:0038:RET  PfuSsImgCtl.SsICSRGBInitialize(060f023c "ScanSnap iX100") retval=00000000 ret=060bc073

NGのとき、戻ってこない。
これは、以下で戻ってこないのが原因っぽい(SsICSRGBInitializeの中で呼んでいる)
003b:Call mscms.OpenColorProfileA(001c3c58,00000001,00000001,00000003) ret=037211bb

OKの場合は、以下のような感じで、
ReadFileしたあと、FreeHeapして戻ってくるだけ





2025424 0038:Call KERNEL32.ReadFile(00000294,0c522540,00000c48,0cf0ee18,00000000) ret=7c56bb29
2025425 0038:Ret  KERNEL32.ReadFile() retval=00000001 ret=7c56bb29
2025426 0038:Call ntdll.RtlFreeHeap(00110000,00000000,0c4f51c8) ret=7c56c102
2025427 0038:Ret  ntdll.RtlFreeHeap() retval=00000001 ret=7c56c102
2025428 0038:Ret  mscms.OpenColorProfileA() retval=00000002 ret=037211bb


なのだが、NGの時は、スレッド0038はしばらく止まったあと以下のような感じでタイムアウトになる。
ロックしたまま開放されないのが原因であって、処理が遅いわけじゃないようだ。



2443843 0039:Call KERNEL32.Sleep(00000014) ret=00d7d00e
2443844 err:ntdll:RtlpWaitForCriticalSection section 0x7c575640 "handle.c: mscms_handle_cs" wait timed out in thread 003b, blocked by 0038, retrying (60 sec)
2443845 0039:Ret  KERNEL32.Sleep() retval=00000000 ret=00d7d00e

遅い原因を探す(printfデバッグ)


wineの最新をgit pullしてきて、dlls/mscms/handle.cで
mscms_handle_csの操作している前後に以下のような感じでprintfを入れて見てみる。

243     printf("%s:%d\n", __FILE__, __LINE__);
244     EnterCriticalSection( &mscms_handle_cs );
245     printf("%s:%d\n", __FILE__, __LINE__);

見てみようとしたら、動くようになってしまった。
printfの有無で動きが変わるので、タイミング的な問題のようだ。
根本的には何にも解決してないが、動くので良しとする。
(追記:やっぱり動かない。何が影響したのかわからない。)

カスタムwineをplayonlinuxで使う


wineのprefixをplayonlinuxのバイナリ置き場にする。
./configure --prefix=/home/****/.PlayOnLinux/wine/linux-x86/1-custom

あとはmake && make install


その他


これを調べてる最中にScanSnap Cloudってのがあることを知った。
これだと、PCなくてもiX100だけでキャプチャできるので、
linuxで動かすためにそこまで苦労する必要無かったかも。

でも、PCを介さず自動なのでレシートとか名刺がバラバラにJPGにされたりする。
ある程度制御したい場合はPCで使えたほうが便利。
なのでLinuxで動かすことに意味がなかったわけではない。(強がり)

あとは電波感度が良ければいいんだが。

追記


追記1:
やっぱり動かない。何が影響したのかわからない。
ログからすると、以下の2つの処理が遅いようだ。
P2ICRPPR.P2iGetDocPosMulti
P2IERASECLRBDR.P2iEraseClrBdr


2862806 1942566.330:003a:CALL P2ICRPPR.P2iGetDocPosMulti(<unknown, check return>
) ret=034b2c0f
3082841 1942605.508:003a:RET  P2ICRPPR.P2iGetDocPosMulti(0dd2cc6c,0dd2cca0,00000
000,00000000,0dd2d150) retval=00000000 ret=034b2c0f

3130018 1942619.899:003a:CALL P2IERASECLRBDR.P2iEraseClrBdr(<unknown, check retu
rn>) ret=034b37e6
3398921 1942702.424:003a:RET  P2IERASECLRBDR.P2iEraseClrBdr(0dd2cca0,0dd2cd9c,00
000000) retval=00000000 ret=034b37e6

追記2:
どうも使うwineをバージョン上げたりして変更したらしばらく使えるような感じがある。