2015-01-31

Google Play ミュージック: ライブラリからの削除・アルバム内の曲順

Google Playミュージックのバージョン5.7.1788Q.1634597を使っているのだが, ライブラリ関連の処理がだめ:-(

アルバム内の再生順序の設定が明示されていないが, 試行錯誤で方法を見つけた. また, 一度ライブラリに登録してしまうと, ライブラリから消すのがたいへんだ.

アルバム内の曲順

アルバム内の曲順は, 以下のキーの優先順位でソートされるらしい.
  1. ID3TAGのトラック番号
  2. ID3TAGのタイトル
  3. もしID3TAGが付いていなければ, ファイル名
じつは, トラックとトラックの間が不連続で変だなと思っていた. 曲順がばらばらになっていることに気づいた. トラック番号をつければ良いだけだった. それにしても, なんでタイトルでソートしたんだろう? タイトルが曲順になっていることって殆ど無いと思うのだが. ファイル名をもう1つ上にしてほしい.

アルバムやファイルの削除

アルバムや曲を削除するには, 以下の方法をとる. ファイルを消しても, ライブラリにデータが残っていて, タップすると「リクエストされたトラックを再生できませんでした」と出る.
  1. ファイルを削除する (AndExplorerなどをつかう)
  2. 端末を再起動
また, [設定][アプリケーション][Google Playミュージック] から, [強制停止], [データを削除] を試したが, 一度ライブラリに登録されると消えない.

ファイルのID3TAGを編集した場合, 一度ファイルを削除して, 端末を再起動し, ファイルを追加し直す必要がある.

2015-01-30

Linux上で注釈を書けるPDFビュワー

Lifehackerに, OkularというPDFビュワーが紹介されているのを見つけた. 注釈の表示もできて便利だ. 見やすさでは Adobe reader にはかなわないが...

2015-01-29

RHEL7: pdftops が両面印刷できないPSを生成する

RHEL6 では,
$ lpr a.pdf
$ pdftops a.pdf -| lpr
によってPDFを印刷できた. しかし, RHEL7でこの方法を使うと, 印刷はできるものの, 両面に設定しても, 片面で印刷されてしまう. どうやら, 出力されるPSの上の方に, pdfSetupPaper というマクロがあるのだが, この実装が悪いらしい. 1ページごとにページサイズを設定するのだが, ページサイズが設定されるとプリンタが両面印刷せずに排紙してしまうようだ.

もうすぐパッチが適用されると思うのだが, 待ちきれなかったので, 自分でビルドしてしまった.

対処1: sedでページを設定する pdfSetupPaper を除去する. 以下のコマンドを pdftops と lpr の間にいれる.

sed -e "s/ pdfSetupPaper/ pop pop/"

Popplerのバグジラで議論されているが, そのパッチを適用する. 他にもいろいろなパッチが出ていたのだが, pdfSetupPaper のパッチだけにした.

$ yumdownloader --source poppler
$ rpm -ivh poppler-0.22.5-6.el7.src.rpm
$ cd ~/rpmbuild/SOURCES/
$ wget -O poppler-pdfSetupPaper.patch https://bugs.freedesktop.org/attachment.cgi?id=91005
$ cd ../SPECS/
$ vim poppler.spec
$ rpmbuild -ba poppler.spec
$ cd ..
$ sudo rpm -Uvh RPM/x86_64/poppler*.rpm

以下にspecファイルの更箇所を示す.

--- poppler-orig.spec 2014-02-15 01:11:43.000000000 +0900
+++ poppler.spec 2015-01-31 00:08:23.569595075 +0900
@@ -1,7 +1,7 @@
 Summary: PDF rendering library
 Name: poppler
 Version: 0.22.5
-Release: 6%{?dist}
+Release: 6%{?dist}a
 License: (GPLv2 or GPLv3) and GPLv2+ and LGPLv2+ and MIT
 Group: Development/Libraries
 URL:     http://poppler.freedesktop.org/
@@ -16,6 +16,9 @@
 # https://bugzilla.redhat.com/show_bug.cgi?id=1053616
 Patch2:  poppler-0.22.5-rotated-words-selection.patch
 
+# https://bugs.freedesktop.org/attachment.cgi?id=91005
+Patch3: poppler-pdfSetupPaper.patch
+
 Requires: poppler-data >= 0.4.0
 BuildRequires: automake libtool
 BuildRequires: gettext-devel
@@ -134,6 +137,7 @@
 %patch0 -p1 -b .CVE-2013-4473
 %patch1 -p1 -b .CVE-2013-4474
 %patch2 -p1 -b .rotated-word-selection
+%patch3 -p1 -b .duplex
 
 iconv -f iso-8859-1 -t utf-8 < "utils/pdftohtml.1" > "utils/pdftohtml.1.utf8"
 mv "utils/pdftohtml.1.utf8" "utils/pdftohtml.1"
@@ -256,3 +260,6 @@
 
 
 %changelog
+* Thu Jan 1 2015 My Name  - 0.22.5-6a
+- pdfSetupPaper macro modified
+

2015-01-28

GHOST 脆弱性のセキュリティアップデート後に

今回の脆弱性は, gethostbyname に見つかって, 任意のコードが実行される可能性があるというもの. glibcのアップデートが必要なのだけれど, アップデートの後, この共有オブジェクトをリンクしているサービスすべてを再起動しないといけない.

一番安全なのは, OSを再起動することなのだけれど, そう簡単にOSすべてを再起動するわけにはいかない場合もあるだろう. こういうとき, 古い (削除済みの) 共有オブジェクトをリンクしているプロセスを探すことができると便利である.

以前にも記事を書いたが, 再掲する. RHEL 5, 6, 7 では, 以下のようなコマンドで, 探すことができる.

sudo sh -c 'grep "\.so.*deleted" /proc/*/maps' | cut -f3 -d/ | xargs ps
/proc/*/mapsにマッピングの状況 (共有オブジェクトやその他いろいろ) が出てくるので, この中で, deleted とラベルがついたものを探す. ただ, 拡張子「.so」がついたものだけを探さないと, 誤検出してしまう.

dvips -> ps2pdf を使うと, GNUplot のタイトルがPDFに設定される

GNUplotが出力するEPSからSDictを削除するには, 以下のようにする.
$ sed -i '/^SDict begin \[$/,/^end$/d' *.eps
このページを参考にした: gnuplot breaks LaTeX PDF title (SOLVED)

2015-01-26

アクセス先でフィッシング行為を検出しました

Chromeでフィッシングサイトにアクセスしてみたら, こういう表示がでた. その上, フォームを送信するたびにこの表示. Firefoxも同じような振る舞い.

こういうサイトには, ランダムなIDやパスワードをいれて送信しておけば良いだろうと思う. 以下のようにしてフィッシングの警告を解除する.

  • Firefoxの場合, 設定のセキュリティタブにある「攻撃/偽装サイトとして報告されているサイトをブロックする」のチェックを外す.
  • Google Chromeの場合, 設定のプライバシーにある「フィッシングや不正なソフトからの保護を有効にする」のチェックを外す.

gnome-terminal から他のターミナルを開くと変な文字が表示される

xfce4-terminal をつかってみると, 「[user@host1 ~]$ 」とプロンプトがでるはずなのに, 以下のように余分なものがついた.
 ]7;file://host1.example.com/home/user[user@host1 ~]$ 
$ ssh localhost で出なくなったので, なにかの環境変数が悪さをしていると疑われる.

結局のところ, VTE_VERSION=3406 という環境変数が問題だった. xfce4-terminal を gnome-terminal から起動していて, そのとき紛れ込んでいた.

2015-01-22

latexdiff におけるプリアンブルの処理

LaTeX の差分を LaTeX のフォーマットで作成ツールとして, latexdiff というものがある. これをつかっていて気づいたのだが, プリアンブルはマークアップされないらしい. 著者の部分を変更したら, 以下のように, 変更後だけが残されて, 変更前のものはコメントアウトされてしまった.
%DIF 52c52
%DIF <  Old
%DIF -------
    New %DIF > 
%DIF -------
このサイトで質問が出ていて, この回答の一つによると, GNU Wdiffを使うと良いらしい.

2015-01-21

F-05D android 4.0.3 root化の可能性

2014年4月にアップデートされたV13R42Cで, 万歩計の脆弱性によるroot化ができなくなった. ところで, 先月に脆弱性が公開された. root権限で任意のコードを実行できるらしいので, root化の可能性が見えてきたが, だれかためさないかな...

2015-01-20

LaTeX: 外部のリファレンス

LaTeX にて, 他のソースファイルにつけたラベルを参照したい場合がある. このような場合, xr (eXternal References) というパッケージを使うと良い.
例えば, 論文のリプライレターにおいて, 「X.X節にXXXを追記しました」などと書く場合, 本文にかいたlabelを参照した方が間違いを減らせるだろう. 章構成の変更 (章を追加するなど) が予定されている場合でも安心である.

以下に例を示す.
ファイル aaa.tex に以下のように記載があったとする.

\section{Experimental setup} \label{sec:setup}
これを, ファイル別のソースファイルから参照する場合, 以下のように書く.
% プリアンブル
\usepackage{xr}
\externaldocument{aaa}
...
% 本文
In Sect.~\ref{sec:setup}, ...
\externaldocumentはプリアンブル (\begin{document}の前) に書く必要があるらしい.

無料のインターネットFAXを試してみた

Android や iPhone は電話回線につながるので, アプリで, 携帯電話回線を通してFAXを送れたら良いのにと思うことがある. 同じ事を考える人もいるのだが, そういうアプリは見つからない.

代わりに, インターネットFAXというのが普及していることがわかった. これなら, PCからFAXを送れるようなので, 携帯電話を使うより便利かな...

PamFax というサービスを使ってみた. カード情報などを入れることなく, FAXを送ることができた. 初期登録からFAX送信完了まで8分くらい. カード情報を入れなくて良いので安心. A4を1ページ送ろうとしたら「$0.07」とでてきて慌てたが, 初期登録で$0.33分使えるようになっていて, 結局は無料だった. たくさん送るなら, クレジットカード決済が必要らしい.

coreutils の hostid

Coreutils に hostid というコマンドがついている. ホスト毎に固有の32ビット識別子を表示するらしい.

この識別子をどのように計算しているのだろうと思い, ソースを見てみた.
下記のように gethostid の返り値を表示するだけ.

  id = gethostid ();
  id &= 0xffffffff;
  printf ("%08x\n", id);
それで, gethostid はなんだろうとマニュアルを見ると, 「通常は gethostbyname により返されるローカルマシンの Internet アドレスが代わりに使用され...」と書いてあり, 「バグ: 識別子が世界中で一意であることを保証することはできない」とも書いてある.

結局のところ, ローカルIPアドレスを16進数で表示するだけ.

2015-01-19

ATQの結果を日時でソートする

Linux では, 指定した日時に処理を行う機能を atd というサービスが提供している. このジョブ一覧を表示するのが atq だが, 出力順がソートされていない. 例えば, 以下のように表示される.
$ atq
169     2015-02-28 20:23 a hoge
205     2015-01-19 22:00 a hoge
189     2019-02-06 00:13 a hoge
188     2015-11-06 00:12 a hoge
201     2015-01-26 16:00 a hoge
185     2015-09-30 18:54 a hoge
197     2015-01-20 16:00 a hoge
199     2015-01-22 16:00 a hoge
165     2015-01-29 12:59 a hoge
200     2015-02-16 18:31 a hoge
これを日付順にソートするには, 第2列をキーとしてソートすれば良いので, 以下のように sort -k2 へパイプする.
$ atq | sort -k2
205     2015-01-19 22:00 a hoge
197     2015-01-20 16:00 a hoge
199     2015-01-22 16:00 a hoge
201     2015-01-26 16:00 a hoge
165     2015-01-29 12:59 a hoge
200     2015-02-16 18:31 a hoge
169     2015-02-28 20:23 a hoge
185     2015-09-30 18:54 a hoge
188     2015-11-06 00:12 a hoge
189     2019-02-06 00:13 a hoge

MF8350Cdn でスキャンしてもファイルがみつからない

MF8350CdnというCanonの複合機でUSBメモリにスキャンすると, 「SCAN0005.pdfに保存しました」といったメッセージが出るのに, PCで確認するとなにも保存されていないという事態になった. 結局のところ, 原因がわかった.

以下の方法で, たぶん, 再現できる.

  1. パーティションを切らずにUSBメモリ全体をフォーマット
    # mkfs.vfat /dev/sdg
  2. パーティションテーブルを作って, パーティションを切る fdisk /dev/sdg で, 以下のようなパーティションテーブルを作る.
    # fdisk -l /dev/sdg
    Disk /dev/sdg: 65 MB, 65536000 bytes, 128000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x13e15d3c
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdg1            2048      127999       62976    b  W95 FAT32
    
    
  3. パーティション1をフォーマット
    # mkfs.vfat /dev/sdg1
  4. MF8350Cdnでスキャンする.
上記のような操作をすると, sdg1 ではなく, sdg にファイルシステムがあると勘違いして, スキャンデータをsdgに書き込むらしい. パーティションテーブルを読まずに, FATのテーブルのマジック「EB xx 90」を探しているだけなのだろう.

以下の方法で, 正しく, sdg1 にスキャンデータを書き込むようになった.

  1. USBメモリの前の方にゼロを書き込む
    # dd if=/dev/zero of=/dev/sdg bs=32768 count=512
  2. パーティションテーブルを切る
    # fdisk /dev/sdg
  3. フォーマットする
    # mkfs.vfat /dev/sdg1

なお, photorec を使うと, sdg に書き込まれていたファイルを取り出すことができた.

  1. # dd if=/dev/sdg >/tmp/b.img
  2. $ photorec /tmp/b.img
  3. PhotoRec の中で, 以下のように Whole disk を指定する.
    Disk /tmp/b.img - 65 MB / 62 MiB (RO)
    
         Partition         Start        End    Size in sectors
    >     Unknown         0   0  1  1015   2 26     128000 [Whole disk]
        P FAT16           0   0  1  1015   2 26     128000 [NO NAME]
    

このプリンタ以外に, オシロスコープでも同様の現象が起こっていた気がするので, 多くの組み込みシステムで同様の処理が行われているのだろう.

2015-01-16

GITレポジトリをウェブ (HTTPやFTP) で公開する

GITのレポジトリをウェブサイト (HTTPやFTP) で公開することができる. リードオンリーでクローンしてもらうことができる.

レポジトリをウェブからアクセスできるように ~/public_html/下などに置き,

$ git update-server-info
を行えばよい.

2015-01-14

メールサーバからの応答: XX is not yet authorized to deliver mail

あるメーリングリストに投稿しようとしたら, なかなか届かない. メールサーバからの配送で以下のように詰まっていた.
$ mailq 
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
xxxxxxxxx      1522 Wed Jan 14 xx:xx:xx  hoge@example.net
(host mx.example.com[xx.xx.xx.xx] said: 451-xx.xx.xx.xx is not yet authorized to deliver  mail from 451- to . Please 451 try later. (in reply to RCPT TO command))
                                         ml1@lists.examplle.com

このページに書かれているグレーリストの実装とかに引っかかっているのかもしれない. よくわからないが, もう一度試すように, キューをフラッシュしたら送れた.
$ postqueue -f
(一般ユーザでフラッシュできたのはなぜ?)

2015-01-13

lpr: 'application/postscript' はサポートされていない形式です!

CUPS は Unix/Linux で使われる印刷サービスなのだけれど, たまに設定ファイルが書き換わって印刷できなくなることがある.
/var/log/cups/access_log
Print-Job client-error-document-format-not-supported
と出力され, lpr コマンドを使うと
lpr: 'application/postscript' はサポートされていない形式です!
というエラーが出ることがある.
なぜか, PS も PDF も受け付けない:-(

/etc/cups/printers.conf に, 以下の3行を追記する. 追記する場所は, <Printer> または <DefaultPrinter></Printer> の間. 複数のプリンタを設定している場合, それぞれに追記.
追記するとき, 一度 CUPS を停止させておく.

$ sudo service cups stop
$ sudoedit /etc/cups/printers.conf
$ sudo service cups start

2015-01-08

NFS上のホームディレクトリへの大量のアクセス

研究室でNFS上のホームディレクトリを置いていると, 動作速度の点で問題が起こることがある. その一例を紹介する.

NFSサーバへあるクライアントからのアクセスが集中している. サーバ上で例えば以下のコマンドにより, どのクライアントからのアクセスが多いかを調べられる.

 $ netstat -t 1 | grep nfs 

そのクライントへログインして top を実行すると, gvfsd-metadata のCPU使用率が高いことが分かった.

対策はまだわかっていないが, ひとまず killall gvfsd-metadata でその場をしのいだ.

CentOS 6 plus で Intel NIC が使用できなくなる

CentOS 6 を使用していると, 以下のエラーが出て, NICが使用できなくなることがある. CentOS plus の kernel-2.6.32-431.el6.centos.plus.x86_64 などのカーネルを使用していると起こり, 本家の Redhat Enterprise Linux 6 では起こらないらしい.
e1000e 0000:03:00.0: eth0: Reset adapter unexpectedly
e1000e 0000:03:00.0: eth0: Timesync Tx Control register not set as expected

以下のコマンドで, centosplus を無効にして kernel をアップデートすればよい.

$ sudo yum --disablerepo=centosplus update 'kernel*'
もし, centosplus から最新のカーネルをインストールしていたら, バージョン番号を添えて yum install をすればよかったかな.
$ sudo yum install kernel-2.6.32-504.3.3.el6.x86_64

2015-01-07

FFmpeg により Windows デスクトップを録画する

UScreenCapture というソフトを使うと, デスクトップの画像を取得することができる. これと FFmpeg を組み合わせると, デスクトップを録画できるようになっている. FFserver と組み合わせれば配信もできる.
  1. UScreenCapture をインストール
    http://www.videohelp.com/tools/UScreenCapture からダウンロードし, (私の使用した環境は64ビットなので) UScreenCapture (x64).msi をインストールする.
  2. FFmpeg をダウンロードし展開
    https://www.ffmpeg.org/download.html から FFmpeg の最新版のWindows Buildをダウンロードし適当な場所に展開する. bin\ffmpeg.exeにパスを通す.
  3. ファイルに保存する.
    ffmpeg -f dshow -i video=UScreenCapture -vf "crop=640:480:1728:0" a.flv
    一部の領域だけを切り取ることもでき, 上記の crop=640:480:1728:0 の数字はそれぞれ 幅:高:Xオフセット:Yオフセット である. デスクトップ全体を録画するなら, 「-vf "..."」を書かない.

その他

  • 以下のコマンドで, dshow の入力一覧を出力できる. そこに USceenCapture が出てこれば, UScreenCapture のインストールはOK.
    ffmpeg -list_devices true -f dshow -i dummy
    このページがソース.
  • FFmpeg は 7z 形式だが, その展開には, Linux では p7zip を使う.