本を読む

読書やコンピュータなどに関するメモ

bash 4.4の新機能リストを訳してみた

 bash 4.4がリリースされたので、NEWSファイル(新機能リスト)からbash 4.4の新機能の部分を訳してみました。

Bash on Ubuntu on WindowsでPandocを動かすには

 Windows 10のAnniversary Updateで、Windowsカーネルに皮をかぶせてLinuxユーザーランドを動かすWindows Subsystem for Linux(WSL)と、WSLを使ったUbuntu環境のBash on Ubuntu on Windowsが入りました(β版)。

 Ubuntuのパッケージがそのままインストールするということで、汎用ドキュメント変換ツールのPandocをインストールしてみました。

$ sudo apt-get install pandoc

 カーネル的には入出力ぐらいで、そんな難しいシステムコールは使ってないだろうと思ったら、システムコールが足りないとエラーに。

$ pandoc foo.md -t html -o foo.html
pandoc: timer_create: Function not implemented

 検索してみると、この件は公式でもissueが立ってました(timer_create not implemented! · Issue #307 · Microsoft/BashOnWindows)。PandocはHaskellで書かれていて、GHCコンパイラーでコンパイルされたHaskellプログラムはデフォルトでインターバルタイマーを使うそうです。スレッド(ユーザースレッド)の実装に使うんだとか。

 これを回避するには、GHCのRTS(runtime system)オプションで「-V0」を指定してインターバルタイマーをオフにします(上記issueをもとに検証)。

$ pandoc +RTS -V0 -RTS foo.md -t html -o foo.html

 RTSオプションは環境変数GHCRTSで指定することもできます。

$ export GHCRTS=-V0
$ pandoc foo.md -t html -o foo.html

追記(2017.2.11):

Windows 10のビルド14986で対応したとのこと。

EmacsでMarkdown中のコードブロックを畳む

 EmacsでMarkdownを編集するとき、outline-modeでセクションを畳むと同じような感じで、ファイル中のコードブロックをすべて畳んで不可視にするのは、こんな感じでいいかな。outline-minor-modeと併用するのを想定。

 表示を消すのが目的というより、search-invisiblenilにしてコードブロックを置換対象から外すのが目的。たとえば、“,”を“、”に置換するときとか。

Ubuntu UnityのAlt-Tabに「デスクトップの表示」が含まれないようにする

 自分用メモ。

 UbuntuのUnity UIでは、Alt-Tabでアプリを切り替えるときに、「デスクトップの表示」(全ウィンドウを最小化する)も含まれる。誤ってこれを選ぶと、元に戻すのに少し手間がかかってしまう。どうせCtrl-Super-Dで同じことができるので、「デスクトップの表示」を含まないように設定を変更したい。

 Unity Tweak Toolで設定できるけど、Unity Tweak Toolをインストールしなくても、dconfを直接いじって設定できた。

$ dconf write /org/compiz/profiles/unity/plugins/unityshell/disable-show-desktop true

 Ubuntu 15.10とUbuntu 14.04 LTSで確認。

情報を“聴く”のに使っているAndroidアプリ

 最近、電車やバスなどに乗っているときに、スマートフォンから音声で情報を聴くようになりました。主に、本やスマートフォンを見続けて目が疲れるのを防ぐためです。また、公園をウォーキングするときなどにも聴いています。

 ひとまず現時点で私が情報を聴くのに使っているスマホアプリをまとめておきます。いろいろなアプリを比較して選んだわけではなく、よさそうなものをインストールして今のところ便利に使っているというところです。

 なお、私はAndroidユーザーなので、以下すべてAndroidアプリです(iOS版があるものもあります)。また、どこでも聴けるように、オフラインで聴くもの縛りで選んでいます。

ポッドキャストを聴く:Pocket Casts

Google play Pocket Casts
Pocket Casts
制作: Shifty Jelly
評価: 4.6 / 5段階中
価格: ¥399 (2016/1/10 時点)
posted by: AndroidHTML v3.1

 ポッドキャストはPocket Castsで聴いています。最近のバージョンでは番組ごとに再生スピードなどの設定が持てるようになっているので、たとえば「音質のいい日本語番組は3.0倍速で、そうでない日本語番組は2.6倍で、英語番組は等速で」といった聴き方ができます。また、複数端末の同期機能などもあります。なお、有償アプリです。

音声ファイルの番組を聴く:Audipo

Google play Audipo (音楽プレーヤー 倍速再生 耳コピ リスニング
Audipo (音楽プレーヤー 倍速再生 耳コピ リスニング
制作: Lapis Apps
評価: 4.4 / 5段階中
価格: 無料 (2016/1/10 時点)
posted by: AndroidHTML v3.1

 ポッドキャストの過去回など、音声ファイルで用意された番組には、Audipoを使っています。最大の特徴は、何行にもわたるシークバーで、この長さを使って任意の場所にジャンプしやすくなっています。もちろん、再生速度もいろいろ選べます。

“あとで読む”した記事を聴く:Pocket + TTS

Google play Pocket
Pocket
制作: Read It Later
評価: 4.5 / 5段階中
価格: 無料 (2016/1/10 時点)
posted by: AndroidHTML v3.1

 “あとで読む”アプリの定番であるPocketは、私も愛用しています。このPocketには「聞く(TTS)」という機能があり、テキストを音声で読み上げてくれます。読み上げに向いたエントリーは限られますが、耳で聴くのも便利なものです。

そのほかのテキストを聴く:Fadosh

Google play Fadosh
Fadosh
制作: IItel Soft
評価: 3.9 / 5段階中
価格: 無料 (2016/1/10 時点)
posted by: AndroidHTML v3.1

 メールマガジンなど、Pocketに入れられないテキストもあります。また、Pocketに入れてもうまく記事ビューにならないエントリーもあります。そうしたものは、いちどテキストファイルにしてから、Fadoshで読み上げて聴いています。もともと青空文庫向けなので、青空文庫フォーマットのテキストを食わせられます。読み上げ時に、正規表現で読み方を指定する機能などもあります(この機能はまだ使ったことはありませんが)。

cowsayのマルチバイト対応パッチがDebian・Ubutuに採用された

 cowsayというのは、端末上でアスキーアートの牛さん(またはほかのキャラクター)にフキダシでしゃべらせるコマンドです。

$ cowsay Hello
 _______
< Hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

 ただ、マルチバイト文字をしゃべらせると、文字のサイズとフキダシのサイズが合わなくなるという問題がありました。よくある、文字列のバイト数=端末のカラム幅と仮定していることが原因なわけですが。

 Google Plusでその話が出ていたので簡単なパッチを書いたところ、Kenichiro MATOHARAさんがDeibanのBTS(bug tracking system)に報告してくれて、採用されました。

 Debianの次期バージョンDebian stretchのcowsayと、Ubuntuの次期バージョンUbuntu 16.04 LTSのcowsayにはすでに入っているようです。

$ cowsay めでたしめでたし
 __________________
< めでたしめでたし >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

 ちなみにそのパッチはこれ(↓)。基本的にlength()をText::CharWidthのmbswidth()に置きかえているだけです。Text::CharWidth(Debianパッケージではlibtext-charwidth-perl)は、debconf-i18nも利用しているパッケージなので、入っていることが多いと思います。

bashは環境変数をどう管理しているか

 質問自体は識者の方々が答えているので略として、bashが環境変数をどう管理しているかについて私がコメントした内容を改めてまとめておきます。

  • bashは起動時に、環境変数の内容から、グローバル変数shell_variablesで指すハッシュ表を作る
  • 以後はシ‌​ェル変数(環境変数を含む)はそのハッシュ表で管理する
  • exportを実行すると、そのハッシュ表のエントリーにatt_exported属性が付く
  • それと並行して、グローバル変数export_e‌​nvが管理されている
  • 外部コマンドの実行時などに、export_envの内容が、shell_variablesをもとに更新される
  • execveシステムコールには、このexport_envが渡さ‌れる

試す

 「Big Sky :: 別のプロセスの動的な環境変数を盗み取る」のスクリプトを、bashに特化してちょっと変更して、試してみます。基本的には対象をexport_envに変えただけです(あとヒアドキュメントのクォートと、/bin/sh対応)。

#!/bin/sh
if [ "x$2" = "x" ]; then
  GREP=cat
else
  GREP="grep ^$2="
fi

gdb -q --silent -p $1 <<'EOF' | grep XXXXXXX | cut -c9- | $GREP
set $i=0
while (1)
  set $r=*((char**)export_env+$i)
  if ($r == 0)
    loop_break
  end
  printf "\nXXXXXXX %s\n", $r
  set $i++
end
EOF

 まずexportを実行しただけの状態でスクリプトを実行しても、何も表示されません。

bashは環境変数をどう管理しているか:実験1

 なにか外部コマンドを実行した後でスクリプトを実行すると、環境変数が表示されます。

bashは環境変数をどう管理しているか:実験2

«  | HOME |  »

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad