Ubuntuでzipを展開した時の文字化けを回避する

※2017年5月24日、バージョンアップ。

Windowsで内部に日本語を含むzipファイルを作成して、それをWindows以外のOSで解凍すると文字化けする、という話はMacユーザーやLinuxユーザーの間では広く知られていると思われる面倒くさいバグなのだが、今回その文字化けを何とかしてみようと思い、Nautilus用のスクリプトを作成してみた。
何で既に回避策が存在するのにそんなもの作ろうと思ったのか、という点についても一応下の方に書いておく。

スクリプトのダウンロードとインストール

まず以下のリンクをクリックするなどしてunarなどをインストールする。
apt:unar
apt:unrar
apt:p7zip-full

#コマンドを使う場合はこうする
sudo apt install -y unar unrar p7zip-full 

次に端末(gnome-terminal)を起動して、以下のコマンドを実行する。

cd ~/.local/share/nautilus/scripts/ && wget https://sicklylife.jp/tool/zip_mojibake_kaihi && chmod +x zip_mojibake_kaihi && mv zip_mojibake_kaihi zipを展開する\(文字化け回避\) && cd - 

するとファイル(Nautilus)の右クリックメニューにスクリプト > zipを展開する(文字化け回避)というメニューが追加されるので、zipファイルを右クリックしてそれをクリックすると、Windowsで作成したzipが文字化けすることなく展開される。
f:id:sicklylife:20170503125543p:plain

スクリプトを作った理由

Ubuntuでのzipの文字化け対策と言えば、Ubuntu Japanese Teamの日本語Remixを使うか、Ubuntu Japanese Teamのppaを使う方法が一般的だと思われるのだが、現在私が使用しているUbuntu GNOME 17.04 + Nautilus 3.24.1では以前と仕様が変わったらしく、Ubuntu Japanese Teamの文字化け回避策 (/etc/profile.d/unzip-default-charset.sh) を適用しても文字化けが直らないようになってしまっている。
f:id:sicklylife:20170503130159p:plain
Nautilus 3.24.1では↑このスクショのようにExtract Here(ここに展開する)がデフォルトになって、zip/7z/xzなどの圧縮ファイルをダブルクリックするとその場に展開されるようになり、しかも関連付けを変更しても反映されないという糞仕様になってしまっている。
file-rollerを起動してzipを開いて展開すれば(文字化け回避策を適用していれば)文字化けせずに展開されるが、いちいちfile-rollerを起動するのも面倒だし、右クリックからサクッと展開したかったのでスクリプト化してみた。来年のLTSまでに修正されるといいなぁ。

↓以下はスクリプトの中身。

#!/bin/bash
# unarでアーカイブを展開
#
# バージョン: 0.0.2
# ライセンス: GPLv2
# 作者      : Sickly Life
# 日時      : 2017年5月24日
# 備考      : unarだと文字化けが直らない場合があったのでunzipを使うように修正。
#             パスワードには未対応。
#             7zファイルは7zコマンドで展開するようにしているが、ほぼ未テスト。
# 参考      : shとbashでの変数内の文字列置換など - ろば電子が詰まっている (http://d.hatena.ne.jp/ozuma/20130928/1380380390)

RMFILE=/tmp/file.YcZCaYDRKQm3us9fFyTBphd9zYeycwRKFPKGCPvMSNejW4rF2EYaHKEiTAkhDmcjTWSaXxQtBh8AFrhXPNqiVcx8vJrZFZGR2kXosxGsWqdHPfLhMmhoj2f9QVS2ByLCWkkAQgtx3pR3oQXyTkZQc79Cg2uCVcYQ6Bx4CGCiczoEQrWsQe6kDeYoHPKoRww4kMPYpAxe*
TMPFILE=/tmp/file.YcZCaYDRKQm3us9fFyTBphd9zYeycwRKFPKGCPvMSNejW4rF2EYaHKEiTAkhDmcjTWSaXxQtBh8AFrhXPNqiVcx8vJrZFZGR2kXosxGsWqdHPfLhMmhoj2f9QVS2ByLCWkkAQgtx3pR3oQXyTkZQc79Cg2uCVcYQ6Bx4CGCiczoEQrWsQe6kDeYoHPKoRww4kMPYpAxe.$$
UNZIP_LOG_FILE=/tmp/file.YcZCaYDRKQm3us9fFyTBphd9zYeycwRKFPKGCPvMSNejW4rF2EYaHKEiTAkhDmcjTWSaXxQtBh8AFrhXPNqiVcx8vJrZFZGR2kXosxGsWqdHPfLhMmhoj2f9QVS2ByLCWkkAQgtx3pR3oQXyTkZQc79Cg2uCVcYQ6Bx4CGCiczoEQrWsQe6kDeYoHPKoRww4kMPYpAxe.unzip

rm -f $RMFILE

trap 'kill $(jobs -p); zenity --text-info --filename=$TMPFILE --title=展開終了 --width=600 --height=400; rm -f $TMPFILE; kill $$' EXIT
trap 'kill $(jobs -p); zenity --text-info --filename=$TMPFILE --title=展開終了 --width=600 --height=400; rm -f $TMPFILE; kill $$' ERR

if [ $# -gt 100 ]; then
    echo "ファイルの数が多すぎます。一度に展開できるファイル数の上限は100です。" &>> "$TMPFILE"
    exit 0
else
    declare -i num=$((100/$#))
fi

declare -i count=0

for arg
do
    name="${arg%.*}"
    ext="${arg##*.}"

    if [ "${ext,,}" = 'zip' ]; then
        unzip -Z -- "$arg" &>> "$UNZIP_LOG_FILE"
        grep 'number of entries: 1' "$UNZIP_LOG_FILE"; result=$?
        if [ "$result" = 0 ]; then
            truncate -s 0 "$UNZIP_LOG_FILE"
            unzip -o -O sjis -- "$arg" &>> "$TMPFILE"
        else
            sed -n '3p' "$UNZIP_LOG_FILE" | grep -E '^d'; result=$?
            if [ "$result" = 0 ]; then
                truncate -s 0 "$UNZIP_LOG_FILE"
                unzip -o -O sjis -- "$arg" &>> "$TMPFILE"
            else
                truncate -s 0 "$UNZIP_LOG_FILE"
                unzip -o -d "$name" -O sjis -- "$arg" &>> "$TMPFILE"
            fi
        fi
    elif [ "${ext,,}" = 'rar' ]; then
        unrar x -v -- "$arg" &>> "$TMPFILE"
    elif [ "${ext,,}" = '7z' ]; then
        7z x -- "$arg" &>> "$TMPFILE"
    else
        unar -- "$arg" &>> "$TMPFILE"
    fi

    echo >> $TMPFILE
    # unrar & unar
    sed -i "/... OK.\$/d" "$TMPFILE"
    # unrar
    sed -i "/All OK\$/d" "$TMPFILE"
    # unzip
    sed -i "/^   creating: /d" "$TMPFILE"
    sed -i "/^  inflating: /d" "$TMPFILE"

    count=$(($count+$num))
    echo "$count"
done | \
zenity \
    --progress \
    --title="展開" \
    --text="ファイルを展開中..." \
    --percentage=0 \
    --auto-close \
    --auto-kill

exit 0
#!/bin/bash
# unarでアーカイブを展開
#
# バージョン: 0.0.1
# ライセンス: GPLv2
# 作者      : Sickly Life
# 日時      : 2017年5月3日
# 参考      : shとbashでの変数内の文字列置換など - ろば電子が詰まっている (http://d.hatena.ne.jp/ozuma/20130928/1380380390)

RMFILE=/tmp/unar.YcZCaYDRKQm3us9fFyTBphd9zYeycwRKFPKGCPvMSNejW4rF2EYaHKEiTAkhDmcjTWSaXxQtBh8AFrhXPNqiVcx8vJrZFZGR2kXosxGsWqdHPfLhMmhoj2f9QVS2ByLCWkkAQgtx3pR3oQXyTkZQc79Cg2uCVcYQ6Bx4CGCiczoEQrWsQe6kDeYoHPKoRww4kMPYpAxe*
TMPFILE=/tmp/unar.YcZCaYDRKQm3us9fFyTBphd9zYeycwRKFPKGCPvMSNejW4rF2EYaHKEiTAkhDmcjTWSaXxQtBh8AFrhXPNqiVcx8vJrZFZGR2kXosxGsWqdHPfLhMmhoj2f9QVS2ByLCWkkAQgtx3pR3oQXyTkZQc79Cg2uCVcYQ6Bx4CGCiczoEQrWsQe6kDeYoHPKoRww4kMPYpAxe.$$

rm -f $RMFILE

trap 'kill $(jobs -p); zenity --text-info --filename=$TMPFILE --title=展開終了 --width=600 --height=400; rm -f $TMPFILE; kill $$' EXIT
trap 'kill $(jobs -p); zenity --text-info --filename=$TMPFILE --title=展開終了 --width=600 --height=400; rm -f $TMPFILE; kill $$' ERR

declare -i num=$((100/$#))
declare -i count=0

for arg
do
    ext="${arg##*.}"

    if [$ext = "rar"]; then
        unrar xv -- "$arg" &>> $TMPFILE
    else
        unar -- "$arg" &>> $TMPFILE
    fi

    echo >> $TMPFILE
    sed -i "/... OK.\$/d" $TMPFILE
    count=$(($count+$num))
    echo $count
done | \
zenity \
    --progress \
    --title="展開" \
    --text="ファイルを展開中..." \
    --percentage=0 \
    --auto-close \
    --auto-kill

exit 0

UbuntuでGNOME 3(GNOME Shell)を使ってみた

※2017年4月17日、追記。

将来に備えてUbuntu GNOME 17.04に移行してみたので、Ubuntu Unityユーザーが初めてまともにGNOME 3(GNOME Shell)を使った感想を書いてみる。

遅い

なんか動作が遅い。ワークスペースの切り替えすら遅い。Impatience拡張機能で速度上げないと辛いというか、上げてもUnity(Compiz)みたいなサクサク感が無い。モッサリ。

特にアクティビティ画面の表示が遅い。Impatienceをオンにしてもまだ遅い。これが最も気になり、致命的だと思った欠陥。Unity 7ではスケール(アプリのウィンドウを並べて表示する機能)をよく利用していたのだが、その類似機能であるアクティビティ画面は正直使ってて苛つくレベルの遅さ。マジもっさり。

アクティビティ画面はUnityのDashの同類でもあるのだが、Dashより重い。Dashも最初の頃はもっさりだったが16.04ではかなり改善されていて、それに比べるとアクティビティ画面は遅すぎてムカつくレベル。ただDashと違ってちゃんと日本語入力が出来る点は良い。Dashは日本語入力が出来なくなることが割と頻繁にあったので。

またアクティビティ画面は、Unityのワークスペースの一覧表示(Super + S)の同等機能も備えているのだが、遅いので使いづらい。

※2017年4月17日。アニメーションを無効にしたらマシになった。Super + Aがほぼ一瞬で表示され、ワークスペースもサクサク切り替わる。ただそれでもアクティビティ画面は若干遅い。

初期設定がクソ

Unityもそうだったけど、初期設定をクソにしなきゃいけないルールでもあるのだろうか?GNOME Tweak Toolで設定変更して初めて使い物になる。Dash to dock、Dash to Panel、Impatience、Topicons plus、この辺の機能はデフォで欲しい、マジで。

細かい設定が出来ない

Unity(Compiz)は割と色々できたんだが。

Alt + Tabがアプリケーション単位での切り替え

Unityでもそうだったけど、Unityと違ってこちらは完全にアプリ単位での切り替え。(UnityはAlt + Tabを一回押した段階では直前のウィンドウとの切り替えで、二回目からアプリ単位での切り替えになるという謎仕様だった。)

ただ、こちらはデフォではすべてのワークスペースのアプリが切り替え対象なのが微妙。この辺は個人の好みだろうけど、自分は現在のワークスペースの分だけ切り替えたい派なので、設定を変更して対応。

Alt + 半角/全角で同一アプリの切り替え

プレビューの表示位置がちょっと下すぎる気はする

タイトルバーが太い

タイトルバーがツールバーと一体になっているのは良いのだけど、FirefoxとかLeafpadとか、タイトルバーにタイトルしか表示されないものは、もうちょっと細くしてほしいなと思った。確か設定ファイル弄って細くできるはずなのでそのうちやる。

日本語入力を切り替えるとトップバーのアイコンがちょっと動く

Workspace indicatorをオンにすると、IMEのアイコンの左側にワークスペース切り替え器が表示されるのだが、それが日本語入力を切り替えると微妙に左右に動く。これはGNOME ShellのテーマをArc-Darkに変更することで対応。

日本語入力の変換候補が表示されなくなることがある

こうなったら再起動しないと駄目。

グローバル入力メソッドを無効に出来ない

IBusの設定(ibus-setup)で「すべてのアプリケーション間で同じ入力メソッドを共有する」のチェックを外しても設定が反映されない。GNOMEのバグかは不明。我慢できなかったらfcitxに変える予定。

不安定

昨日インストールしてから4回クラッシュ(ウィンドウ装飾が表示されなくなってGNOME Shellが再起動)し、1回フリーズ(キー入力を受け付けなくなり、マウスでの操作も出来ず、リセットボタンで再起動)。

クラッシュはGNOME Shellの拡張機能を弄ってる最中に起こったのでまぁともかく、フリーズはここ最近は経験していなかったし、テキストファイルをエディターで編集している最中に起こったのでちょっと焦った。

ただGNOMEのせいなのかどうかは分からんので何とも言えない。

まとめ

思っていた以上に微妙だった。とにかくモッサリなのが辛い。Unity廃止で喜んでいた人たちはこれを望んでいたわけ?

UbuntuがUnity8への移行を断念したらしい件

Unity 8は開発が進んでなくて「これ絶対18.04に間に合わんだろ」と思っていたので案の定と言うか…

個人的にUnityは、Ubuntu 12.04の頃のUnity 5は正直クソだと感じていたのだけれども、16.04のUnity 7はそんなに嫌いじゃないので、無くなってしまうのはちょっと残念な気もする。

ブコメとか見ると喜んでいる人の方が多そうだけど、移行先のGNOMEもUnity 7と似たような使用感だし評判はあまり良くないので、朗報と言って良いのだろうかねぇ。

国内記事

海外記事

Adobe製フリーフォント「源ノ明朝」とGoogle製フリーフォント「Noto Serif CJK」が公開

明朝体のフォントが公開されたらしい。

7ウェイトが用意されていて良さげ。
ダウンロードページは以下。

Ubuntu 16.04と17.04にGShutdownをインストールする

GShutdownを日本語化して、Ubuntu Unity環境でシャットダウンや再起動が出来ないバグを修正してみた件。

GShutdownとは

GShutdownはデスクトップLinuxで動作するGUIのシャットダウンタイマーアプリです。

インストール方法

ここからdebファイルをダウンロードしてダブルクリックしてインストールするか、端末で以下のコマンドを実行します。

sudo add-apt-repository ppa:sicklylife/ppa 
sudo apt update 
sudo apt install gshutdown 

起動方法

Dashから普通に起動できます(管理者権限で起動 しなくても 動作します)。

備考

  • カスタムコマンドでサスペンドやハイバネートを利用したい場合はこちらのページを参考に。
  • このアプリはタイトルバーの✕ボタンをクリックしても終了しません。終了するにはメニューバーの「ファイル」 → 「終了」をクリックする必要があります。
  • 通知領域にアイコンが表示されません。
  • オプションの「通知を表示する時間をカスタマイズ」は動作しません。アプリが強制終了します。

Ubuntu 16.04にQWinFFをインストールする

QWinFFというLinuxWindowsで動作するアプリがあるのだが、

↑この記事や公式サイトに書かれているppaにはUbuntu 15.10までのパッケージしかなく、Ubuntu 16.04にインストールするには自分でビルドしなければならない状態だったので、何となくSickly Life PPAにUbuntu 16.04用のパッケージをアップロードしてみた。

端末で、

sudo add-apt-repository ppa:sicklylife/ppa 
sudo apt update 
sudo apt install qwinff 

と実行すればQWinFF 0.2.1がインストールされる。

Ubuntu 16.04でUbuntu Softwareがまともに動かなくなってしまった時の対処法

いつの間にかUbuntu Softwareを起動すると アプリケーションが見つかりません と表示されて何も表示されなくなってしまった。

端末から起動しても特にエラーメッセージの類は表示されず、どうしたものかとググってみたところ、以下のページが見つかった。

↑このページ内にあったコマンドを参考にして端末で、

sudo apt purge gnome-software gnome-software-common ubuntu-software 
sudo apt install ubuntu-software gnome-software* 
sudo appstreamcli refresh --force --verbose 
sudo rm -r /var/cache/app-info && sudo appstreamcli refresh --force --verbose 
killall gnome-software ; gnome-software --verbose | tee /tmp/gnome-software.log 

と実行した所、Ubuntu Softwareが正常に動作してアプリの一覧が表示されるようになった。