Linux環境でAndroidアプリを利用できるShashlikを試す

Linuxデスクトップ環境でAndroidアプリを利用できるShashlikを試してみました.
Shashlikを導入してAndroidパッケージの.apkを導入すると通常のLinuxアプリケーションのように呼び出せるというものです.
ただし,.apkはx86サポートのものでないといけないようです.
現在は0.9.1が最新で,Kubuntu(KDE Plasma 5)向けとなっています.

以下はShashlikを使ってFlappy Birdが動いている動画です.

Shashlikの導入

今は.debが配布されているのでこれをダウンロードして導入します.入手場所は以下のページから.140MBと結構大きいです.

$ wget http://static.davidedmundson.co.uk/shashlik/shashlik_0.9.1.deb
$ sudo dpkg -i shashlik_0.9.1.deb

/opt/shashlik以下に導入されます.qemuで動くみたいですね.

$ dpkg -L shashlik
/.
/opt
/opt/shashlik
/opt/shashlik/android
/opt/shashlik/android/emulator-user.ini
/opt/shashlik/android/system
/opt/shashlik/android/system/build.prop
/opt/shashlik/android/config.ini
/opt/shashlik/android/kernel-qemu
/opt/shashlik/android/system.img
/opt/shashlik/android/ramdisk.img
/opt/shashlik/android/userdata.img
/opt/shashlik/bin
/opt/shashlik/bin/aapt
/opt/shashlik/bin/ddms
/opt/shashlik/bin/shashlik-install
/opt/shashlik/bin/bios.bin
/opt/shashlik/bin/constants.py
/opt/shashlik/bin/shashlik-run
/opt/shashlik/bin/adb
/opt/shashlik/bin/vgabios-cirrus.bin
/opt/shashlik/bin/emulator64-x86
/opt/shashlik/data
/opt/shashlik/data/shashlik-apps.directory
/opt/shashlik/data/shashlik.png
/opt/shashlik/lib
/opt/shashlik/lib/libc++.so
/opt/shashlik/lib64
/opt/shashlik/lib64/lib64GLES_V2_translator.so
/opt/shashlik/lib64/lib64EGL_translator.so
/opt/shashlik/lib64/lib64OpenglRender.so
/opt/shashlik/lib64/libGLES_V2_translator.so
/opt/shashlik/lib64/lib64GLES_CM_translator.so
/opt/shashlik/lib64/libGLES_CM_translator.so
/opt/shashlik/lib64/libEGL_translator.so
/opt/shashlik/lib64/libut_rendercontrol_dec.so
/opt/shashlik/lib64/libOpenglRender.so

Androidアプリのパッケージを入手

Shashlikの上で動かすAndroidアプリのパッケージを入手します.

Once installed grab any Android application package (APK) from the net.
For example our favourite app, Flappy Bird, can be found here: http://beste-apps.chip.de/android/app/flappy-bird-apk-android-app,cxo.66885070/

ということでここからFlappy Birdを入手しました.

Androidアプリの導入

shashlik-installコマンドを使ってAndroidアプリを導入します.

$ /opt/shashlik/bin/shashlik-install ~/Downloads/com.dotgears.flappybird.apk
Successfully installed Flappy Bird
Connecting to deprecated signal QDBusConnectionInterface::serviceOwnerChanged(QString,QString,QString)
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
kbuildsycoca4 running...
kbuildsycoca4(19354) VFolderMenu::loadDoc: Parse error in  "/home/mk/.config/menus/applications-merged/xdg-desktop-menu-dummy.menu" , line  1 , col  1 :  "unexpected end of file"
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
Successfully installed Flappy Bird

20160222_17:02:57-19417
これでKDE Plasma 5環境ならスタートメニューに登録されるはずです.

ちなみに,x86じゃない.apkを導入しようとするとこんな感じで怒られました.
20160222_18:02:13-5944

Androidアプリの起動

KDE Plasma 5環境ならスタートメニューに登録されているはずですが,今の環境はawesomeなのでメニューに出てきません.
コマンドラインから起動します.

$ /opt/shashlik/bin/shashlik-run com.dotgears.flappybird FlappyBirds

起動にはそこそこ時間がかかります.

20160222_18:02:35-30707
20160222_18:02:52-31990
20160222_18:02:15-344

起動した後はもたつきなどもなく普通に動く感じです.
ただ,真っ黒な画面のままで起動に失敗することがあります.起動が速くなって安定して動くようになるととても便利そうです.

しかし問題は.apkの入手先ですね.PlayStoreが使えないと苦労しそうです.


Linux Mintのisoファイル改竄と改竄の確認方法


うわぁ……
怖すぎる.

2/20に入手した人はisoファイルを削除.もしOS導入済みの人はネットワークから遮断して必要なデータがあればバックアップの上初期化して導入しなおし(勿論再度入手しなおしたisoファイルで),メールやWebサービス等を利用していたならそちらのパスワード等の変更もとのこと.

入手したisoファイルの確認方法がMD5の方法しか書かれていませんね.
署名ファイルはないのでしょうか?

ftp siteを覗いてみると,

$ w3m -dump http://mirrors.kernel.org/linuxmint/stable/17.3/
Index of /linuxmint/stable/17.3/
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
../
linuxmint-17.3-cinnamon-32bit.iso                  30-Nov-2015 10:14      1G
linuxmint-17.3-cinnamon-64bit.iso                  28-Nov-2015 18:18      1G
linuxmint-17.3-cinnamon-nocodecs-32bit.iso         30-Nov-2015 21:06      1G
linuxmint-17.3-cinnamon-nocodecs-64bit.iso         30-Nov-2015 18:10      1G
linuxmint-17.3-cinnamon-oem-64bit.iso              01-Dec-2015 09:31      2G
linuxmint-17.3-kde-32bit.iso                       05-Jan-2016 22:57      2G
linuxmint-17.3-kde-64bit.iso                       05-Jan-2016 21:26      2G
linuxmint-17.3-mate-32bit.iso                      30-Nov-2015 10:31      1G
linuxmint-17.3-mate-64bit.iso                      28-Nov-2015 18:19      2G
linuxmint-17.3-mate-nocodecs-32bit.iso             01-Dec-2015 02:43      1G
linuxmint-17.3-mate-nocodecs-64bit.iso             01-Dec-2015 01:01      2G
linuxmint-17.3-mate-oem-64bit.iso                  01-Dec-2015 10:42      2G
linuxmint-17.3-xfce-32bit.iso                      05-Jan-2016 16:41      1G
linuxmint-17.3-xfce-64bit.iso                      05-Jan-2016 15:48      1G
md5sum.txt                                         06-Jan-2016 16:00     958
sha256sum.txt                                      06-Jan-2016 16:03    1406
sha256sum.txt.gpg                                  06-Jan-2016 16:09     181
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

sha256sum.txt.gpgはあるよう.恐らくsha256sum.txtへの署名ですね.これを入手して確認してみます.

先ずはファイルの入手

$ wget http://mirrors.kernel.org/linuxmint/stable/17.3/sha256sum.txt wget http://mirrors.kernel.org/linuxmint/stable/17.3/sha256sum.txt.gpg

署名を確認してみると,DSA鍵ID 0FF405B2で署名されているよう.

$ gpg --verify sha256sum.txt.gpg sha256sum.txt
gpg: 2016年01月07日 01時06分20秒 JSTにDSA鍵ID 0FF405B2で施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません

鍵サーバから鍵を検索してインポートします.

$ gpg --search-keys 0FF405B2
gpg: "0FF405B2"をhkpサーバkeys.gnupg.netから検索
(1)     Clement Lefebvre (Linux Mint Package Repository v1) <root@linuxmint.co
          1024 bit DSA key 0FF405B2, 作成: 2009-04-29
Keys 1-1 of 1 for "0FF405B2".  番号(s)、N)次、またはQ)中止を入力してください >1
gpg: 鍵0FF405B2をhkpからサーバkeys.gnupg.netに要求
gpg: 鍵0FF405B2: 公開鍵"Clement Lefebvre (Linux Mint Package Repository v1) <root@linuxmint.com>"をインポートしました
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:  15  署名:  52  信用: 0-, 0q, 0n, 0m, 0f, 15u
gpg: 深さ: 1  有効性:  52  署名:  59  信用: 52-, 0q, 0n, 0m, 0f, 0u
gpg: 次回の信用データベース検査は、2018-07-07です
gpg:           処理数の合計: 1
gpg:             インポート: 1

署名を検証すると,DSA鍵ID 0FF405B2で署名された鍵ということがわかります.
※ちなみにこの鍵IDと鍵指紋の確認もしたいのですが,その情報の載っているであろうlinuxmintのsiteは今落ちているようで未確認です.

$ gpg --verify sha256sum.txt.gpg sha256sum.txt
gpg: 2016年01月07日 01時06分20秒 JSTにDSA鍵ID 0FF405B2で施された署名
gpg: "Clement Lefebvre (Linux Mint Package Repository v1) <root@linuxmint.com>"からの正しい署名
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガー・プリント: E1A3 8B8F 1446 75D0 60EA  666F 3EE6 7F3D 0FF4 05B2

チェックサムファイルの署名が正しいことが確認できたら,isoファイルのチェックサムを確認します.これでダウンロードされたisoファイルが正しくダウンロードされたことがわかります.
今回はisoファイルは1つしか入手していません.
入手したlinuxmint-17.3-xfce-32bit.isoの確認が行われ,完了と言われています.

$ ls linuxmint*.iso
linuxmint-17.3-xfce-32bit.iso
$ sha256sum -c sha256sum.txt
sha256sum: linuxmint-17.3-cinnamon-32bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-cinnamon-32bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-cinnamon-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-cinnamon-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-mate-32bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-mate-32bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-mate-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-mate-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-cinnamon-nocodecs-32bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-cinnamon-nocodecs-32bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-cinnamon-nocodecs-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-cinnamon-nocodecs-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-mate-nocodecs-32bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-mate-nocodecs-32bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-mate-nocodecs-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-mate-nocodecs-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-cinnamon-oem-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-cinnamon-oem-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-mate-oem-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-mate-oem-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-kde-32bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-kde-32bit.iso: オープンまたは読み込みに失敗しました
sha256sum: linuxmint-17.3-kde-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-kde-64bit.iso: オープンまたは読み込みに失敗しました
linuxmint-17.3-xfce-32bit.iso: 完了
sha256sum: linuxmint-17.3-xfce-64bit.iso: そのようなファイルやディレクトリはありません
linuxmint-17.3-xfce-64bit.iso: オープンまたは読み込みに失敗しました
sha256sum: 警告: 一覧にある 13 個のファイルが読み込めませんでした
 

ちなみにダウンロードが途中で終了してしまったり何らかの理由で壊れてしまった場合などは以下のように失敗と言われます.

$ echo 'a'>> linuxmint-17.3-xfce-32bit.iso
$ sha256sum -c sha256sum.txt
  :
linuxmint-17.3-xfce-32bit.iso: 失敗
  :
sha256sum: 警告: 1 個の計算したチェックサムが一致しませんでした

このあたりのことは以下のページの説明が解りやすいと思います.

<追記>
フォーラムもやられてるらしいです……

</追記>

cronに特化したPodcastアグリゲータ/ダウンローダのpodgetを試す

先日試したpodracerは何気に10年前のソフトでメンテナンスもされていないし,起動中に強制終了するとゴミが残って次から起動しなくなったりとかとか結構不満点が出てきました.

今は前処理を以下のようにして,

if [ $(pgrep podracer) ] ; then
  echo 'running podracer.'
  exit -1
fi
 
echo run podracer
if [ -f ~/.podracer/tempsub ] ; then
  rm ~/.podracer/tempsub
  echo 'rm tempsub'
fi

プレイリストもこんな感じで別に作ってます.

cd ~/podcasts
PODCASTLIST=($(cd ~/podcasts ; find . -mmin -$LISTTIME -type f -print0 | xargs -0n1 file | grep -i audio | cut -f1 -d:))
if [ ${#PODCASTLIST[@]} -eq 0 ] ; then
  echo 'podcast not found.'
  exit -1;
fi
 
echo num = ${#PODCASTLIST[@]}
ls -1tr ${PODCASTLIST[@]} > ~/podcasts/todayspodcast.m3u

後者はDebianの方にはバグ報告をしていますが音沙汰がない感じです.

他にないかなーと探して(apt-cache search podcast)podgetというものを見つけました.

$ apt show podget | grep -A99 Description:
 
Description: cron 用に最適化された Podcast アグリゲータ/ダウンローダ
 Podget はシンプルな podcast アグリゲータであり、定期的なバックグランドジョブ
 (すなわち cron) として起動するために最適化されています。RSS および XML フィード
 からの podcast のダウンロード、ファイルをソートしてフォルダやカテゴリごとに格納、
 iTunes PCAST ファイルおよび OPML リストからの URL のインポート、M3U および ASX
 プレイリストの自動生成、そして古くなったファイルの自動クリーンアップのサポート
 が特徴です。また、MS Windows サーバ上にホストされた podcast の UTF-16 自動変換も
 特徴です。
 podget を一旦起動すると、ユーザ設定ファイルを $HOME/.podget にインストール
 しますので、そのファイルをカスタマイズできます。

cronに特化していて便利そうなので試してみます.

導入

Debian stretch testing/Rasbian jessie/Ubuntu 14.04 で確認しました.

$ sudo apt install podget

初期化

$ podget -h
 
Usage /usr/bin/podget [options]
 
    -c --config <FILE>           Name of configuration file.
    -C --cleanup                 Skip downloading and only run cleanup loop.
    --cleanup_simulate           Skip downloading and simulate running
                                 cleanup loop.
                                 Display files to be deleted.
    --cleanup_days               Number of days to retain files.  Anything
                                 older will be removed.
    -d --dir_config <DIRECTORY>  Directory that configuration files are
                                 stored in.
    -f --force                   Force download of items from each feed even
                                 if they have already been downloaded.
    --import_opml <FILE or URL>  Import servers from OPML file or
                                 HTTP/FTP URL.
    --import_pcast <FILE or URL> Import servers from iTunes PCAST file or
                                 HTTP/FTP URL.
    -l --library <DIRECTORY>     Directory to store downloaded files in.
    -p --playlist-asx            In addition to the default M3U playlist,
                                 create an ASX Playlist.
    -r --recent <count>          Download only the <count> newest items from
                                 each feed.
    --serverlist <list>          Serverlist to use.
    -s --silent                  Run silently (for cron jobs).
    --verbosity <LEVEL>          Set verbosity level (0-4).
    -v                           Set verbosity to level 1.
    -vv                          Set verbosity to level 2.
    -vvv                         Set verbosity to level 3.
    -vvvv                        Set verbosity to level 4.
    -h --help                    Display help.

初回起動時に設定ファイルなどが作成されます.引数無しで実行すると初期設定の中のpodcastをダウンロードするので--cleanup_simulateオプションを付けて実行すると良さそうです.
設定ファイルは規定値では~/.podget以下に作成されます.

$ podget --cleanup_simulate
$ ls -lA ~/.podget
合計 8
-rw-rw-r-- 1 mk mk 3652  2月 19 05:34 podgetrc
-rw-rw-r-- 1 mk mk 1131  2月 19 05:34 serverlist
  • podgetrc : 設定ファイル
  • serverlist : podcastのリスト

設定ファイルの用意

お好みで設定ファイルの~/podgetrcを編集します.私は以下の辺りを書き換えました.

ログファイルを有効に

# Directory to store logs in
dir_log=/home/mk/POD/LOG

プレイリストの年月日の形式を書き換え

# Date format for new playlist names
date_format=+%Y-%m-%d

Podcastの取得数を3つに

# Most Recent
# 0  == download all new items.
# 1+ == download only the <count> most recent
most_recent=3

サーバリストの作成

取得するPodcastを~/.podget/serverlistに書いていきます.

書式はスペース区切りで

URL カテゴリー 番組名

になっています.podgetを実行した時に
カテゴリー/番組名/番組というふうにディレクトリが掘られます.
具体的にはこんな感じで書いていきます.

http://feeds.feedburner.com/weblogs/csc tech 電脳空間カウボーイズ
http://feeds.backspace.fm/backspacefm tech backspace.fm
http://www.joqr.co.jp/science-podcast/index.xml science 日立ハイテクプレゼンツ 大村正樹のサイエンスキッズ
http://www.tbsradio.jp/life/rss.xml etc 文化系トークラジオ Life
http://www.tbsradio.jp/cycle-r/index.xml bike ミラクル・サイクル・ライフ
http://sokoani.com/feed anime そこあに
  :

他のアプリケーションらの移行でOPMLファイルのエクスポートが可能な場合はそのファイルやURLを元にインポートできるようです.※未確認

$ podget --import_opml <FILE or URL>

若しくはPCAST形式(iTunes向け?)も同様に利用できるようです.※未確認

$ podget --import_pcast <FILE or URL>

OPML書き出しの機能もあります.但しこの機能は
Ubuntu 14.04の0.6.9にはなく,
Rasbian jessieの0.7.3,
Debian stretchの0.7.9には存在しました.

$ podget --export_opml /tmp/podcast.opml
podget
 
Session file not found.  Creating podget.22189 .
 
Export serverlist to OPML file: /tmp/podcast.opml
 
Closing session and removing lock file.
$ head /tmp/podcast.opml
<?xml version="1.0" encoding="utf-8" ?>
<opml version="1.0">
<head/>
<body>
<outline text="tech"><outline text="電脳空間カウボーイズ" type="rss" xmlUrl="http://feeds.feedburner.com/weblogs/csc" /></outline>
<outline text="tech"><outline text="backspace.fm" type="rss" xmlUrl="http://feeds.backspace.fm/backspacefm" /></outline>
<outline text="science"><outline text="日立ハイテクプレゼンツ 大村正樹のサイエンスキッズ" type="rss" xmlUrl="http://www.joqr.co.jp/science-podcast/index.xml" /></outline>
<outline text="etc"><outline text="文化系トークラジオ Life" type="rss" xmlUrl="http://www.tbsradio.jp/life/rss.xml" /></outline>
<outline text="bike"><outline text="ミラクル・サイクル・ライフ" type="rss" xmlUrl="http://www.tbsradio.jp/cycle-r/index.xml" /></outline>
<outline text="anime"><outline text="そこあに" type="rss" xmlUrl="http://sokoani.com/feed" /></outline>

実行

とりあえず引数無しで実行することでPodcastが取得できます.

$ podget
-------------------------------------------------
Category: anime         Name: そこあに
Downloading feed index from http://sokoani.com/feed
2016-02-19 07:37:15 URL:http://sokoani.com/feed [673868] -> "-" [1]
 
Downloading 0_s413.mp3 from http://sokoani.com/podpress_trac/feed/9818/0/
 :
 :

Podcastは規定値では~/POD以下にカテゴリ/番組名/番組ファイルの形で保存されます.

$ find ~/POD -type f | tail -3
/home/mk/POD/etc/JUNK 伊集院光 深夜の馬鹿力/files_20160216.mp3
/home/mk/POD/etc/JUNK 伊集院光 深夜の馬鹿力/files_20160202.mp3
/home/mk/POD/etc/JUNK 伊集院光 深夜の馬鹿力/files_20160209.mp3

また,~/POD/*.m3uとステプレイリストも作成されます.これは実行単位で作られるのかな?

$ ls -l ~/POD/*.m3u
-rw-rw-r-- 1 mk mk  946  2月 19 07:14 /home/mk/POD/New-2016-02-19.m3u
-rw-rw-r-- 1 mk mk 1924  2月 19 07:50 /home/mk/POD/New-2016-02-19.r2.m3u

うまく動作するようなら-sオプションを付けてcronに登録してあげると良さそうです.以下の例では毎時3分にpodgetを実行しています.

$ crontab -e
$ crontab -l | tail -2
# get podcast
3 * * * *       podget -s

podracerはPodcastを番組関係なく実行日のディレクトリに保存されてPodcast番組を探したりするのに不便でしたがpodgetだとカテゴリと番組でディレクトリが分かれるので便利です.
しばらく併用してみようと思います.

鹿児島Linux勉強会 2016.02 -02/20(土)鹿児島市-

20160216_21:02:28-3740

12月ぶりに開催されます.
会場はコワーキングスペースのTenonさん.
時間は16:00〜18:50です.

Tenonさんには電源,Wi-Fi,フリードリンクがあります.
※会場代として500円必要になります.

私は早めに行ってワンデイパス(700~1000円)で作業していると思います.
参加してみたい方は以下のページから申し込むか,

鹿児島らぐのMLでその旨メールしてみて下さい.

私はPodcast配信サーバの話をしようかと思っています.

絵文字を入力する-Mozc&emojione-picker-

Linux環境での絵文字入力方法です.新しい方法を知ったので紹介してみます.

Mozc利用

これまではこの方法を使っていました.Mozcの設定で「Unicode 6 絵文字変換」にチェックを付けると利用できるようになります.

20160216_23:02:52-2121

「えもじ」とか「ねこ」とか入力して変換出来ます.

20160217_07:02:28-3105

辞書に登録することも出来ます.

20160217_07:02:07-5247

emojione-picker for Ubuntu

今回知ったUbuntu向けの絵文字ピッカーです.実行するとタスクバーに常駐して入力したい絵文字を選んでクリックするとその絵文字がクリップボードにコピーされるのでクリップボード貼り付けで入力できます.

20160217_07:02:45-12768

チキンがクリップボードにコピーされたところ.

20160217_07:02:11-16960

いちいちメニューを辿るのは面倒ですが,Recentに最近使った絵文字が入るのでよく使うものはここからアクセスできます.

20160217_07:02:42-17641

Debian stretch testing への導入例

Ubuntu用ですがstretchにも入りました.ちなみにパッケージ化して導入しなくてもとりあえず動かすだけならgit cloneした後cd emojione-picker-ubuntu ; ./emojione-pickerとかでも動きました.

$ sudo apt install equivsequivs gir1.2-rsvg-2.0
$ git clone https://github.com/gentakojima/emojione-picker-ubuntu.git
$ cd emojione-picker-ubuntu
$ equivs-build debian_package.ctl
$ sudo dpkg -i emojione-picker_0.1_all.deb

という感じでLinux環境でも結構快適に絵文字が入力できるようになってきました.しかし絵文字は楽しいのですが環境によって見え方が大幅に変わるので意図したように伝わっているかとかが不安でもあります…….

絵文字を入力する-Mozc&emojione-picker-

Linux環境での絵文字入力方法です.新しい方法を知ったので紹介してみます.

Mozc利用

これまではこの方法を使っていました.Mozcの設定で「Unicode 6 絵文字変換」にチェックを付けると利用できるようになります.

20160216_23:02:52-2121

「えもじ」とか「ねこ」とか入力して変換出来ます.

20160217_07:02:28-3105

辞書に登録することも出来ます.

20160217_07:02:07-5247

emojione-picker for Ubuntu

今回知ったUbuntu向けの絵文字ピッカーです.実行するとタスクバーに常駐して入力したい絵文字を選んでクリックするとその絵文字がクリップボードにコピーされるのでクリップボード貼り付けで入力できます.

20160217_07:02:45-12768

チキンがクリップボードにコピーされたところ.

20160217_07:02:11-16960

いちいちメニューを辿るのは面倒ですが,Recentに最近使った絵文字が入るのでよく使うものはここからアクセスできます.

20160217_07:02:42-17641

Debian stretch testing への導入例

Ubuntu用ですがstretchにも入りました.ちなみにパッケージ化して導入しなくてもとりあえず動かすだけならgit cloneした後cd emojione-picker-ubuntu ; ./emojione-pickerとかでも動きました.

$ sudo apt install equivsequivs gir1.2-rsvg-2.0
$ git clone https://github.com/gentakojima/emojione-picker-ubuntu.git
$ cd emojione-picker-ubuntu
$ equivs-build debian_package.ctl
$ sudo dpkg -i emojione-picker_0.1_all.deb

という感じでLinux環境でも結構快適に絵文字が入力できるようになってきました.しかし絵文字は楽しいのですが環境によって見え方が大幅に変わるので意図したように伝わっているかとかが不安でもあります…….

GNU Coreutils 8.25でlsの出力が変わったのを試してみる

DebuanのMLで知ったのですが,Coreutils 8.25lsの出力結果が変わっています.

この変更はlsコマンドを使ったscriptなどが影響を受けそうと思ったのですが端末でのみの変更のようで一安心.
Debian stretch testingでちょっと試しに動かしてみました.
Debian jessie/Ubuntu 14.04以降も同じ手順で行けると思います.

開発環境の導入

$ sudo apt install build-essential
$ sudo apt build-dep coreutils

Coreutils 8.25の入手と署名確認

$ wget ftp://ftp.gnu.org/gnu/coreutils/coreutils-8.25.tar.xz ftp://ftp.gnu.org/gnu/coreutils/coreutils-8.25.tar.xz.sig
$ gpg --verify coreutils-8.25.tar.xz.sig
gpg: 署名されたデータが'coreutils-8.25.tar.xz'にあると想定します
gpg: 2016年01月20日 20時17分46秒 JSTにRSA鍵ID 306037D9で施された署名
gpg: "Pádraig Brady <P@draigBrady.com>"からの正しい署名
gpg:                 別名"Pádraig Brady <pixelbeat@gnu.org>"
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガー・プリント: 6C37 DC12 121A 5006 BC1D  B804 DF6F D971 3060 37D9

展開とビルド

$ tar xf coreutils-8.25.tar.xz
$ cd coreutils-8.25
$ ./configure --prefix=$HOME/usr/local
$ make

端末でのlsの動作比較

今パスの通っているのは8.24で,src/ls8.25

$ ls --version
ls (GNU coreutils) 8.24
Copyright (C) 2015 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 
作者 Richard M. Stallman および David MacKenzie。
$ src/ls --version
ls (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 
Written by Richard M. Stallman and David MacKenzie.

スペースの含まれたファイルを作成してlsを実行すると8.25のlsでは'で括られる.

$ touch /tmp/hoge\ fuga
$ ls /tmp/hoge\ fuga
/tmp/hoge fuga
$ src/ls /tmp/hoge\ fuga
'/tmp/hoge fuga'

日本語は大丈夫だが,エスケープの必要な文字も括られる.

$ touch /tmp/日本語 /tmp/エスケープの必要な記号\?
$ src/ls /tmp/日本語 /tmp/他の記号\?
'/tmp/他の記号?'  /tmp/日本語

パイプでの動作確認

パイプを通るとこれまでどおりの動作

$ src/ls /tmp/hoge\ fuga | cat
/tmp/hoge fuga

なので,xargsなどで処理したい場合はこれまでどおり

$ src/ls /tmp/hoge\ fuga | xargs cat
cat: /tmp/hoge: そのようなファイルやディレクトリはありません
cat: fuga: そのようなファイルやディレクトリはありません
$ src/ls /tmp/hoge\ fuga | xargs -I{} cat "{}"

回避方法x3

$ src/ls --quoting-style=literal /tmp/hoge\ fuga /tmp/エスケープの必要な記号\?
/tmp/hoge fuga  /tmp/エスケープの必要な記号?
$ src/ls -N /tmp/hoge\ fuga /tmp/エスケープの必要な記号\?
/tmp/hoge fuga  /tmp/エスケープの必要な記号?
$ QUOTING_STYLE=literal src/ls /tmp/hoge\ fuga /tmp/エスケープの必要な記号\?
/tmp/hoge fuga  /tmp/エスケープの必要な記号?

ということでとりあえずこれまでと同じ動作をさせたい場合はQUOTING_STYLE=literalを設定したりls -Naliasを設定しておくといいみたいです.

$ echo 'export QUOTING_STYLE=literal' >> ~/.bashrc

or

$ echo "alias ls='ls -N'" >> ~/.bashrc~/.bashrc

#ところでCoreutils 8.25でまたコマンドが一つ増えていました.今回は覚えやすいけど

** New commands

base32 is added to complement the existing base64 command,
and encodes and decodes printable text as per RFC 4648.

<追記>

DebianではSeverity: serious(重要度:深刻)となってsidの8.25-2no_ls_quoting.patchが入ってrevertされたようです.

$ bin/ls --version|head -1
ls (GNU coreutils) 8.25
$ bin/ls /tmp/hoge\ fuga 
/tmp/hoge fuga
$ cat patches/no_ls_quoting.patch
Description: revert inconsistent ls quoting
 This is a revert of upstream commit 109b9220cead6e979d22d16327c4d9f8350431cc.
 Info changed to reflect current upstream intentions.
 
Bug-Debian: https://bugs.debian.org/813164
 
--- coreutils-8.25.orig/NEWS
+++ coreutils-8.25/NEWS
@@ -71,9 +71,6 @@ GNU coreutils NEWS
   df now prefers sources towards the root of a device when
   eliding duplicate bind mounted entries.
 
-  ls now quotes file names unambiguously and appropriate for use in a shell,
-  when outputting to a terminal.
-
   join, sort, uniq with --zero-terminated, now treat '\n' as a field delimiter.
 
 ** Improvements
--- coreutils-8.25.orig/doc/coreutils.texi
+++ coreutils-8.25/doc/coreutils.texi
@@ -7750,8 +7750,8 @@ this"} in the default C locale.  This lo
 
 You can specify the default value of the @option{--quoting-style} option
 with the environment variable @env{QUOTING_STYLE}@.  If that environment
-variable is not set, the default value is @samp{shell-escape} when the
-output is a terminal, and @samp{literal} otherwise.
+variable is not set, the default value is @samp{literal}, but this
+default may change to @samp{shell-escape} in a future version of this package.
 
 @item --show-control-chars
 @opindex --show-control-chars
--- coreutils-8.25.orig/src/ls.c
+++ coreutils-8.25/src/ls.c
@@ -1581,7 +1581,6 @@ decode_switches (int argc, char **argv)
       if (isatty (STDOUT_FILENO))
         {
           format = many_per_line;
-          set_quoting_style (NULL, shell_escape_quoting_style);
           /* See description of qmark_funny_chars, above.  */
           qmark_funny_chars = true;
         }

</追記>

gdm3とlightdmでログイン時にユーザを表示しないようにする

gdm3

先ずはgdm3から.
環境は,Debian stretch testing gdm3 3.18.0-2です.

/etc/gdm3/greeter.dconf-defaultsを編集して,[org/gnome/login-screen]セクションのdisable-user-list=trueのコメントを外して有効にする.

[org/gnome/login-screen]
disable-user-list=true

その後gdm3を再起動.

$ sudo systemctl stop gdm
$ sudo systemctl start gdm

#初め/etc/gdm3/greeter.dconf-defaultsはテンプレートなのかと思って/etc/gdm3/greeter.dconfにコピーして編集して反映されないなーとやっていましたorz

LightDM

LightDMの場合.
環境は,Debian stretch testing lightdm 1.16.6-1です.

/etc/lightdm/lightdm.conf[LightDM]セクションのgreeter-hide-users=trueのコメントを外して有効にする.

greeter-hide-users=true

--show-configオプションで設定が確認できます.

$ /usr/sbin/lightdm --show-config
[Seat:*]
A  greeter-session=lightdm-greeter
A  greeter-hide-users=true
A  session-wrapper=/etc/X11/Xsession
B  user-session=kde-plasma-kf5
[LightDM]
C  greeter-hide-users=True
C  allow-guest=False
[XDMCPServer]
C  enabled=true
Sources:
A  /usr/share/lightdm/lightdm.conf.d/01_debian.conf
B  /usr/share/lightdm/lightdm.conf.d/40-kde-plasma-kf5.conf
C  /etc/lightdm/lightdm.conf

その後LightDMの再起動.

$ sudo systemctl stop lightdm
$ sudo systemctl start lightdm

ディスプレイマネージャの切り替え

dpkg-reconfigureに導入済みのディスプレイマネージャのパッケージ名(どれでも)を付けて起動すると,導入済みのディプレイマネージャから選択できます.

$ sudo dpkg-reconfigure gdm3
┌─────────────────────────────────────────────────────────────────────┤ gdm3 を設定しています ├─────────────────────────────────────────────────────────────────────┐  
│ ディスプレイマネージャとは、X Window System 上でのグラフィカルなログイン機能を提供するものです。                                                                  │  
│                                                                                                                                                                   │  
│ ひとつの X サーバを管理できるのはひとつのディスプレイマネージャだけですが、ディスプレイマネージャパッケージが複数インストールされています。どのディスプレイマネ   │  
│ ージャをデフォルトで起動させるか選択して下さい。                                                                                                                  │  
│                                                                                                                                                                   │  
│ 異なるサーバを担当するように設定すれば、複数のディスプレイサーバは同時に動作できます。そのようにするには、/etc/init.d にある各ディスプレイマネージャの初期化スク  │  
│ リプトを編集し、デフォルトディスプレイマネージャのチェックを無効にして下さい。                                                                                    │  
│                                                                                                                                                                   │  
│ デフォルトのディスプレイマネージャ:                                                                                                                               │  
│                                                                                                                                                                   │  
│                                                                              gdm3                                                                                 │  
│                                                                              lightdm                                                                              │  
│                                                                              sddm                                                                                 │  
│                                                                                                                                                                   │  
│                                                                                                                                                                   │  
│                                                                              <了解>                                                                               │  
│                                                                                                                                                                   │  
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘  

GNU coreutilsのmktempを試す

あるscriptを見ていたらmktempというコマンドを見かけました.GNU coreutilsの中の1つのようです.ユニークなテンポラリファイルやディレクトリが作成できるようです.

同じようなことをやるのにこれまではこんな感じで年月日やエポックにPIDを付けたりしてました><

$ TMP_FILE=`date +hoge-%F_%T-$$`
$ touch $TMP_FILE
$ ls -l $TMP_FILE
-rw-r--r-- 1 mk mk 0  2月 14 18:37 hoge-2016-02-14_18:36:59-13299
$ TMP_FILE=`date +hoge-%s-$$`
$ touch $TMP_FILE
$ ls -l $TMP_FILE
-rw-r--r-- 1 mk mk 0  2月 14 18:50 hoge-1455443448-13299

mktempの場合は規定値で10桁のランダムな文字が付くようです.更にファイル存在チェックもしているので衝突も起こらないという感じみたいです.

$ mktemp
/tmp/tmp.E66dzdpxMa
$ ls -l /tmp/tmp.E66dzdpxMa
-rw------- 1 mk mk 0  2月 14 18:25 /tmp/tmp.E66dzdpxMa

-dオプションでディレクトリが作成できます.

$ mktemp -d
/tmp/tmp.EFmqt7L0nY
$ ls -la /tmp/tmp.EFmqt7L0nY
合計 0
drwx------ 1 mk   mk      0  2月 14 18:27 .
drwxrwxrwt 1 root root 2920  2月 14 18:27 ..

ファイル名のテンプレートもカスタマイズできます.Xがランダム部になります.3文字以上無いと怒られます.
ランダム部のX部分が複数あると最後尾がランダムになるようです

$ mktemp XXX
zfG
$ mktemp XX
mktemp: テンプレート `hoge-XX' に含まれている X の数が少なすぎます
$ mktemp hoge-XXX
hoge-60h
$ mktemp hoge-XXXXXXXXXXXXXXXXXXXXXXXXXXXX
hoge-26CXkffROkyzwuUhej3Lza4KcdbC
$ mktemp XXX-XXX
XXX-m01
$ mktemp XXX-XXX-XXX
XXX-XXX-wqd

拡張子の指定は--suffixかテンプレートで指定できます.

$ mktemp --suffix=.log hoge-XXXX
hoge-LqWm.log
$ mktemp hoge-XXXX.log
hoge-lxtg.log

-uオプションでドライランです.でも存在チェックのタイミングがずれるのでこのファイル名を使うのは安全ではありません.

$ mktemp -u
/tmp/tmp.hdiPeJef1s
$ ls -l /tmp/tmp.hdiPeJef1s
ls: /tmp/tmp.hdiPeJef1s にアクセスできません: そのようなファイルやディレクトリはありません

-pオプションで作成されるディレクトリの変更が出来ます.(規定値は/tmp)
存在しないディレクトリを指定すると怒られるようです.

$ mktemp -p $HOME/tmp
/home/mk/tmp/tmp.dlx75Z6Wyn
$ mktemp -p `mktemp -u -d -p $HOME/tmp`
mktemp: テンプレート `/home/mk/tmp/tmp.jhGdkmp5SG/tmp.XXXXXXXXXX' からファイルを作成できません: そのようなファイルやディレクトリはありません

mktemp(3)もあるよう.

詳細はman mktemp, info mktempを.

しかしGNU coreutilsみたいな基本的なコマンドでさえ知らない使い方のわからないコマンドが結構あるのでダメですねorz
調べなければ……

$ dpkg -L coreutils | grep bin/
/usr/sbin/chroot
/usr/bin/hostid
/usr/bin/link
/usr/bin/printf
/usr/bin/truncate
/usr/bin/pr
/usr/bin/sha1sum
/usr/bin/nice
/usr/bin/tee
/usr/bin/realpath
/usr/bin/tac
/usr/bin/printenv
/usr/bin/arch
/usr/bin/logname
/usr/bin/sha384sum
/usr/bin/fold
/usr/bin/users
/usr/bin/yes
/usr/bin/paste
/usr/bin/factor
/usr/bin/pathchk
/usr/bin/basename
/usr/bin/dircolors
/usr/bin/du
/usr/bin/shuf
/usr/bin/sha224sum
/usr/bin/head
/usr/bin/tty
/usr/bin/join
/usr/bin/test
/usr/bin/runcon
/usr/bin/base64
/usr/bin/sha512sum
/usr/bin/id
/usr/bin/dirname
/usr/bin/numfmt
/usr/bin/nl
/usr/bin/install
/usr/bin/split
/usr/bin/od
/usr/bin/groups
/usr/bin/env
/usr/bin/tr
/usr/bin/comm
/usr/bin/md5sum
/usr/bin/nproc
/usr/bin/pinky
/usr/bin/uniq
/usr/bin/ptx
/usr/bin/sha256sum
/usr/bin/cksum
/usr/bin/who
/usr/bin/cut
/usr/bin/[
/usr/bin/csplit
/usr/bin/expand
/usr/bin/unexpand
/usr/bin/seq
/usr/bin/stdbuf
/usr/bin/unlink
/usr/bin/chcon
/usr/bin/timeout
/usr/bin/tsort
/usr/bin/expr
/usr/bin/stat
/usr/bin/tail
/usr/bin/mkfifo
/usr/bin/sort
/usr/bin/nohup
/usr/bin/fmt
/usr/bin/whoami
/usr/bin/sum
/usr/bin/wc
/usr/bin/shred
/bin/cp
/bin/dd
/bin/false
/bin/readlink
/bin/echo
/bin/vdir
/bin/mknod
/bin/rm
/bin/df
/bin/rmdir
/bin/sleep
/bin/true
/bin/date
/bin/stty
/bin/ln
/bin/mktemp
/bin/cat
/bin/ls
/bin/uname
/bin/chmod
/bin/touch
/bin/mv
/bin/sync
/bin/mkdir
/bin/dir
/bin/chgrp
/bin/chown
/bin/pwd
/usr/bin/md5sum.textutils

翻訳メモリのために.moから.poを作ったメモ

20160216_06:02:28-15473

久々に翻訳をしようと思い立ちました.そこで翻訳メモリを作ると楽が出来るはずと既存の翻訳ファイルを突っ込んだメモです.

Debianパッケージで導入された.moを一括で.poに変換

ここでは/usr/share/locale/ja/LC_MESSAGES/*.moを利用しています.Debian/Ubuntu系なら同じでしょう.

$ export TMP=$(mktemp -d)
$ echo $TMP
/tmp/tmp.3ARspdBIMI
$ ls -1 /usr/share/locale/ja/LC_MESSAGES/ | egrep \.mo$ | xargs -n1 -I{} msgunfmt /usr/share/locale/ja/LC_MESSAGES/{} -o $TMP/{}.po

色々なソースを置いてあるディレクトリ以下からja.poをコピー

これは私がここに置いてるからというだけです.やらなくていいです.

$ find ~/src -iname "ja.po" | xargs -n1 -I{} cp {} $TMP

Poeditを起動して読み込む

  • 「編集(E)」->「設定(P)」
  • 「翻訳メモリ」タブ
  • 「ファイルから学習…」ボタンを押して用意した.poを読み込む.

20160216_06:02:02-14632

20160216_06:02:30-14314

20160216_06:02:38-14388

20160216_06:02:51-13986

翻訳メモリを使う

Poeditで翻訳対象の.poを読み込んで

  • 「カタログ(A)」->「翻訳メモリを使って未翻訳項目を埋める…(T)」

20160216_06:02:48-22901

20160216_06:02:53-22974

20160216_02:02:16-28154

20160216_06:02:12-25100

翻訳の提案も出てきます.

大助かりです :)
#でもきっともっといい方法がある気がする.