猫の手も借したい

暇を極めた時に更新します

【Linux】左右Alt空打ちでIME切り替え

私はCtrl+SpaceでIMEを切り替える人間ですが、クラスメートが日本語配列キーボードの「変換」「無変換」でIMEを切り替えているのを見かけてよさげだったので真似してみました。

Mac日本語配列では「英数」「かな」でIMEを切り替えられるようなのでそれを再現してるみたいです。

ただし、私は英字配列ユーザなので変換無変換キーはありません。代わりにSpace左右のAltを使うことにしました。

Fcitxの設定

Fcitxを導入してある環境であれば同様に適用できます。 このメニューは、"拡張オプションの表示"にチェックを入れると表示されます。 f:id:akkisino02:20171014210557p:plain

この設定では左AltでIMEオフ、右AltでIMEオンに設定しています。

Windowsで設定している情報を見ていると、装飾キーオンリーでIME切り替えの設定が出来ない故に"F13"など別のキーを割り当ててそれでIMEを切り替えていることが多いみたいです。 これではそのキーがAltではなくなるので、Altを使用するショートカットが全滅です。 Alt系にはAlt+TABなど、ショートカットが多いためこれでは不便です。

対して、Fcitxでは修飾キーオンリーで設定できます。この設定ではAltキーをAltキーのまま使うのでショートカットに影響を与えません。Alt空打ちで発火するショートカットを設定していたらさすがに被るとはおもいますが。

感想

切り替えがトグルで はなくなることで、癖にさえしてしまえば「文字打つ→英語入力になってた→消してIME切り替える→文字打ち直す」ということがなくなります。結構やるので作業効率には影響が大きそうです。 また、出力を伴うプログラムのコーディングをしているとどうしても日本語と英語を切り替えることが多いので、ワンタッチで切り替えられるのはかなり便利です。

Twitterが凍結されたのでヤケになってXiaomi Mi Notebook Air 13.3を買った

先々週の火曜日にTwitterのアカウントが凍結されました。
10:30ごろのツイートが取得できているのでおそらくそれ以降です。

Twitterルールに違反したとのことですが特に記憶にないので、異議申し立てをしました。帰ってきた返事がこれです。


お前の会社大丈夫か…
読めないのでもう一度異議申し立てしましたが同じように読めなかったので諦めました。

6年目に入ったアカウントがいきなり凍結されて解除も希望なしとくると結構つらいものがありますが、これ以上なんかしても無駄そうです。


凍結されるとUserStreamが読み込めなくなり、Postができなくなり、私のアカウントで取得していたコンシューマキー・コンシューマシークレットが全部死にました。厳しい。
結局、開発用途に持っていた(@akkisino102)に移行したのでフォローしてくださいはーと。

Xiaomi Mi Notebook Air 13.3

そんなこんなでメンがヘラっていたらGearBestがXiaomi Mi Notebook Air(長いので以下Xiaomi Air)のフラッシュセール中でした。
以前にも書いたとおり、学校から支給されている開発マシンに不満しかなかったので買い換える予定だったのですが非常にいいタイミングです。

macbook 2017への買い替えも検討していましたが、概ねいい感じなのにどうにもあのペチペチしたキーボードが好きになれず、別にLinux入れるからmacOSである理由もないしなあといった理由でいくつかマシンを検討。
Xiaomi Airはその候補の一つです。

かなり上の方の候補だったので買いました。DHLを指定して、届くまで14日。



箱は3重。



かなりアッポーを意識しているのがわかります。



めっちゃくちゃいい感じです。

スペック

CPU Core i5-7200U
GPU MX150
RAM 8GB
SSD NVMe 256GB (+ M.2 SATA 256GB増設)
解像度 FullHD


特筆すべきは独立GPUが搭載されていること、SSDが増設可能なことでしょうか。
コーディングするには必要十分な性能があります。

モニタがグレアなところはちょっと気になっていますが、非常にきれいです。13.3インチマシンでFullHDというのも適正な解像度だと思います。
また、想像してた以上にスピーカーの音質もよく、結構いい感じです。
独立GPUについては、全く期待していなかったのですがわりかしいい仕事します。いくつか試しましたがそこそこの設定で快適にゲームできました。ただし、薄型である以上負荷がかかっているとGPUのある左上がかなり熱くなりますがまあノートだしそんなもんでしょう。



今までの学校マシンで使っていたSSDをそのまま増設しました。Kubuntuが入っていたSSDなので普通に移行できています。
もともと刺さっていたSSDを初期化してWindows10Educationをインストール、Grub経由でデュアルブートにしています。
まだ数日しかつかってませんが、コーディングする上ではかなりいい感じです。やっぱFullHDあると一度に見えるコード量が増えて効率がよくなりますね。
モニタがきれいで音もいいとゲームしていても結構楽しいです。このマシンでDQXやってます。

デザイン、性能、使い勝手すべて含めてかなり満足な買い物でした。

Linuxでプロキシをパッと切り替えられるスクリプトを書いた

学内LANからWANに接続しようとすると、間にプロキシが入ります。

普通にブラウジングするくらいならブラウザ側で自動検出できるのでいいのですが、Linuxユーザはいちいち設定を書き換えないと学内からaptが使えなかったりと不具合があって面倒です。

.bashrcに設定を書いてコメントアウトしたりして切り替えていましたが、それもなんかめんどうになってきたので一括でやってくれるスクリプトを作りました。
Ruby 2.4.1 p111で動作確認しています。

#! /usr/bin/env ruby
# coding: utf-8

# プロキシの設定
PROXY = 'http://proxy.example.com:port/'

# 各種pathを取得するクラス
class GetPath
    def home
        ENV['HOME']
    end
    def bashrc
        "#{home}/.bashrc"
    end
end

# プロキシを切り替えるクラス
class SwitchProxy
    def initialize(bashrc_path)
        @bashrc_path = bashrc_path
        @bashrc = File.open(bashrc_path, 'r') { |f| f.read }
        @buffer = String.new
        $script_dir = File.expand_path(File.dirname($0))
        @backup_path = "#{$script_dir}/backup"
    end
    def backup
        File.open(@backup_path, 'w') { |f| f.puts(@bashrc)}
    end
    def write # @bufferの中身を.bashrcに上書きするメソッド
        File.open(@bashrc_path, 'w') { |f| f.puts(@buffer)}
    end
    def clean
        backup
        @bashrc.each_line do |l|
            unless l =~ /(_proxy|_PROXY)/
                @buffer += l
            end
        end
        write
    end
    def off # .bashrcからプロキシの設定がある行を削除するメソッド
        clean
        settings = <<~EOS
                  export http_proxy=
                  export HTTP_PROXY=
                  export https_proxy=
                  export HTTPS_PROXY=
                  export ftp_proxy=
                  export FTP_PROXY=
                  EOS
        @buffer += settings
        write
    end
    def on # .bashrcにプロキシの設定を書き込むメソッド
        clean
        settings = <<~EOS
                  export http_proxy=#{PROXY}
                  export HTTP_PROXY=#{PROXY}
                  export https_proxy=#{PROXY}
                  export HTTPS_PROXY=#{PROXY}
                  export ftp_proxy=#{PROXY}
                  export FTP_PROXY=#{PROXY}
                  EOS
        @buffer += settings
        write
    end
    def rescue # 保持してるバックアップに戻すメソッド なんかあったとき用
        @backup = File.open(@backup_path, 'r') { |f| f.read }
        File.open(@bashrc_path, 'w') { |f| f.puts(@backup) }
    end
end


if PROXY == 'http://proxy.example.com:port/'
    puts 'you should be change proxy setting. please overwrite this scripts 5th line.'
    exit(0)
end

get_path = GetPath.new
switch = SwitchProxy.new(get_path.bashrc)

case ARGV[0]
when 'on'
    switch.on
when 'off'
    switch.off
when 'rescue'
    switch.rescue
else
    puts "arg: 'on','off' or 'rescue'"
    exit(0)
end


5行目を書き換えてスクリプトの設定をします。
実行権限を与えて適当なディレクトリに置いてください。おすすめはパスの通ってるディレクトリです。
ただし、レスキュー用にスクリプトと同じディレクトリにバックアップを1つだけ作成します。最初からいい感じにディレクトリ作っておくといいと思います。

最後にsource ~/.bashrcしたいのですが、色々試してもスクリプト内からする方法がわかりませんでした。うまく反映されなかったりする。
このスクリプトでプロ棋士を切り替えたあとにsource ~/.bashrcするなりターミナルを開き直すなりして対応してください。


オブジェクト指向の練習がてら意識して書いてみたけどべつにそこまでしなくて普通にスクリプト書いても良かった。

バカラックサーバの導入

ラックサーバーを導入しました。

メタルラック

どちらかというとバラックサーバーですが、どちらにしてもバカラックサーバーです。


このメタルラックはダイソーで売っていたものを使っているので、支柱4本、板2枚、留具2セットでなんと864円というお手頃価格。
当初の目的であったATXケースからの省スペース化がうまいこと成功した上にもう一つメリットがあります。

めちゃくちゃ冷える

f:id:akkisino02:20170907214045p:plain

冷えます。バカみたいに冷えます。


メンテしやすくなったし基盤がいつも見えてめっちゃいい感じです。おすすめはしません。

1デスクトップ1アプリのすゝめ (KDE Plasma編)

まだまだKDE Plasmaの日本語の情報が少ない(つーかほぼない)のが現状です。
Linuxユーザならそのくらい英語を読むか自力でなんとかしろといった感じではありますが、そこがLinuxへの敷居を高めている一員でもあるのかなと思っているので情報をまとめておきます。実際日本語のコミュニティが栄えているUbuntuなんかはやっぱりユーザが多いようです。

ちなみにUbuntuのメイン環境は17.10からGnomeに戻るようですが、KDE Plasmaも非常に優秀で美しい環境ですのでユーザが増えることを願っています。

仮想デスクトップ

Windows10から仮想デスクトップが追加されたことで、その機能の便利さに惚れた方も少なくないのでは。
macや大抵のLinuxデスクトップ環境では昔から同等の機能がありました。非常に便利なので公式で実装されていなかったWindowsでも再現できる拡張アプリケーションがあったくらいです。

具体的には、デスクトップ画面を複数用意して切り替えられる機能 で良いのでは。
1ワークスペースで作業することと比較して、「ウィンドウがわちゃわちゃしない」というメリットがあります。
これは非常に大きく、効率的にウィンドウをワークスペースに割り当てることで目的のアプリにストレスなくアクセスすることができるのです。
また、余計なものが視界に映らないので作業に集中することができます。

1デスクトップ1アプリ

ここからは私の提唱する仮想デスクトップの使い方です。と言ってもとっくの昔に誰かもう思いついてるんだろうけど。

色々な人の使い方を調べていると、大体が「仕事用にメールとブラウザとOffice!、趣味はこっち!」とか用途で分けている気がします。
それだと結局ウィンドウがわちゃわちゃしてきちゃったりして面倒なのと、私はスイッチのオンオフが下手なので結局それぞれ開いたままブラウザ足しちゃったり作業しちゃったりして意味がなくなることが多いです。

どうやったらうまいことデスクトップ活用できるかなあと思って情報収集しつつぼけーっと考えてた結果以下の感じに落ち着きました。


1. 同じアプリは同じデスクトップ 違うアプリは違うワークスペースを徹底する (ファイラーは別)
2. でも起動するたび移動させるの面倒なので勝手に決めたワークスペースで開くようにしてほしい
3. 頻繁に使うアプリはそれでまとめとけばいいよね

の三点をモットーに運用しています。


まずは、大前提として適当にデスクトップの数を確保します。常用してるアプリ群+1くらいあればよさげです。
KDE Plasmaではシステム設定>デスクトップの挙動>仮想デスクトップから設定できます。
f:id:akkisino02:20170903221123p:plain

次にデスクトップ切り替えのショートカットを登録します。
f:id:akkisino02:20170903221413p:plain
このあたりは好みの範囲ですが、私はCtrl + F1〜F0で直接そのデスクトップにジャンプ、Ctrl + Allowで隣接デスクトップへ移動にしています。

その他、エフェクトなどの設定もここから変更できます。


次に、指定のアプリを指定のデスクトップで開くように設定します。
システム設定>ウィンドウの操作>ウィンドウルールより変更できます。
f:id:akkisino02:20170903221958p:plain
ここでデスクトップを指定することにより、そのアプリはそのデスクトップで開く、というルールを設定できます。その他細かいカスタムが聞くのでいじりたい方は各自参照してみてください。


以上でデスクトップの最適化は終了ですが、もう一つおすすめの設定があります。
f:id:akkisino02:20170903222255p:plain
「ウィンドウを並べて表示(すべてのデスクトップ)」を押しやすいキーにアサインしておくことで、すべてのデスクトップのウィンドウを一覧表示でき、感覚的に必要なデスクトップに飛ぶことができます。結構便利です。
f:id:akkisino02:20170903222738p:plain



これで結構快適に作業できるようになります。作業領域の不足しがちなフルHDないノートPCを使っている方におすすめです。
また、以上の通りKDE Plasmaはかなり自由度の高いデスクトップ環境です。興味を持った方はぜひ触ってみてください。

Windows To Goで仮想マシンを殺せ

電車に揺られつつなので軽くまとめます。
進学してから1h30mも電車に乗ることがなくなったので久々の長旅で不安です。


現在の学校用マシンが紆余曲折あってLinux(Kubuntu)+VM上のWindows10 Eduになったことを以前の記事で投稿しました。

経緯

コーディングの実習は開発環境が動けばいいのでOSを問わないことと、Officeは使えないと厳しいのでVMで補うといった趣旨のことを書きましたが、状況が変わりました。

詳細は伏せますが出場する大会の都合でWindows向けでしか用意されていないツールを使う必要が発生したのです。
もちろんVMでも動くは動くのですが、
いわゆるプログラミング用のツールなので要求リソースが多めであり所詮第7世代のi3での仮想環境は厳しいものがある点と、
使用するコンピュータとのやりとりにVMでは不都合がある点で不満を感じます。

正直その"ツール"や"コンピュータ"が死ぬほど使えない仕様なのでいささか不本意ではありますがネイティブのWindows環境が欲しくなってしまいました。

Windows To Goという選択肢

Windows8の頃からですかね。USBドライブにWindowsをインストールする事によって自分の環境を文字通りモバイルできる技術があります。
自前のマシンを持ち運ばずに客先や派遣先で用意されたデバイスで普段の環境やツール群を再現できる画期的な発想です。

Linuxの世界ではUSBメモリへのネイティブインストールは当たり前のことでしたが、ややファッティなWindowsでも実用化されているのが驚きです。


さて、ここでネックになるのが使用できるUSBドライブです。
正式にサポートされているUSBドライブは馬鹿高く(64gbで一本5万とかします)、現実的ではありません。5万あればそこそこのノート買えますからね。

というわけでHDD/SSDで作成することにします。
サポート外になりますが、いわゆる外付けSSDで作成することができます。

学校がケチった...否、毎日背負って登校する学生の負担への配慮で軽量化された我がマシンからはディスクドライブが抜かれているのでそこにマウンタを噛ませてSSDを入れていましたが、最近ATAのエラーが出るようになりました。安物のマウンタを使っているのでこれが逝かれたのでしょうが、確率でエマージェンシーモードで上がるのも困り物なのでコイツを抜いて使うことにしました。

なお、USB2.0SATA変換アダプタを噛ませています。

Windows To Goドライブの作成

Windows To GoはWindows10 Enterprise及びEducationで作成出来ます。
確かに作成ツールが入っているのでEducationでも作成できるのですが、実際に書き込めるのはEnterpriseのイメージだけのようです。
サポートページでもEducationが書き込めるように読めたのですが実際は弾かれてしまいました。

しゃーないのでdismで強引に焼き込みます。
ちなみにdismを使えば本来作成できないUSBフラッシュメモリでの作成も可能なようです。寿命を著しく縮める上に実用に耐えうるかは知りませんが。


まずパーティションを切ります。
私は深く考えたくないのでBoot用に350MB、残り235GBを丸々システム用にしました。後から必要に応じて縮めます。

diskpartを使ってフォーマットしましたが、別にディスクの管理でもいいと思います。
フォーマット形式は
Boot: FAT32
システム: NTFS
とします。


次に、Windowsのインストールイメージをマウントし、source/install.wimをdismを使いシステムパーティションに展開します。Windows10 Education x64で2.0接続のSSDに20分くらいかかりました。


あとはBootパーティション
システムパーティション:\Windows\System32\bcdboot システムパーティション:\Windows /l ja-JP /s Bootパーティション: /f ALL
で書き込めば終了です。


初回起動時はOSの環境構築が走り、次の再起動でマシンのドライバなどの構築が走り、その次の再起動からまともに使えるようになります。

所感

正直驚きです。SSDとはいえ、USB2.0接続のストレージでいっさいストレスを感じなく自然にWindowsが動きます。
大会の為に構築しましたが正直VMから完全に移項してもいいくらいです。つーかそのうちします。

難点として思いつくのはアクセスランプが常時チカチカしててうっとうしいことと変換アダプタが抜き身なので死ぬほど熱いことくらいですかね。
2.0でも不満を感じませんが一応マシン側が全ポート3.0なので、3.0対応のまともなケースとアダプタを買うことにします。



慣れた環境をどのマシンでも再現できるのは非常に魅力があります。家でも学校でも全く同じ環境で使えるだけでかなりの恩恵がありますし今後のWindows環境はこれに一本化しそうです。

Ubuntu 17.04においてのハイバネートについて

正確にはKubuntu 17.04環境で行いましたが、他のUbuntuフレーバーでもさして変わらないと思います。

前回、Kubuntu 17.04を導入した際になかなかハイバネートを有効にできず、日本語の資料も見当たらなかったので共有します。私が見つけられなかっただけかもしれませんが。
akkisino02.hatenablog.com



ハイバネートはWindowsで言う休止状態です。
RAMの中身を補助記憶装置に書き出すことによって、スリープとは違い作業状況を維持しながら完全に電源を落とすことができます。
Linuxでは、SWAP領域にRAMの中身を書き出します。

Ubuntu 17.04からSWAPの扱いが変わった

基本的にパーティション切りを手動でやってたので気づきませんでしたが、Ubuntu 17.04からはSWAP領域を持たないようです。Kubuntu 17.04を自動でインストールさせたらハイバネートに入れずビビリました。

では、SWAPがなくなったかと言うとそういうわけでもなく、/swapfileというファイルとしてSWAPファイルを持つようになりました。


現在割り振られているSWAP領域はswaponコマンドで確認できます。

$ swapon -s

恐らくですが、大抵の場合は2GBが割り振られているはずです。
補助記憶の空き容量の5%、もしくは2GB のどちらか小さいほうが採用されるようです。

ハイバネートを使えるようにする

SWAPファイル自体がハイバネートに適していないようです。
詳しくは調べていないのでわかりませんが、今までSWAP領域を使ってきているのでそのほうがわかりやすいし移行することにしました。
いつぞやのバージョンからUbuntu自体がハイバネートを隠すようになったのでそれでも問題ないのかもしれませんが、ハイバネートを利用したいユーザにとってこれは深刻です。


そのため一番最初にSWAP領域を確保する必要があります。
適当なユーティリティでSWAP用に領域を確保し、ファイルシステムLinux swapを指定してください。この際、実メモリより大きい領域を確保することが必要です。
また、手動インストールの場合はそもそもインストール時点でSWAP領域を確保して置くことでこの手順はスキップできます。


次に、fstabにSWAP領域をマウントする記述を追加します。

UUID=SWAP領域のUUID    none    swap    sw    0    0

この時点で/swapfileの記述をコメントアウトしました。


再起動します。カーネルパニックが起これば記述が間違えているのでコンソールから書き直してください。
起動すれば、再度swaponで正しくスワップ領域が追加されていることを確認します。
ちなみに不要なので/swapfileはここで削除しました。

$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb3                               partition       8912892 0       -1

これで、ハイバネートができるようになったと言いたいところですが、まだハイバネートに入ったきり復帰できません。ただのエクストリームなシャットダウンです。


次は/etc/default/grubを書き換えます。

# この行を編集
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=SWAP領域のUUID"

# 編集を適用
$ sudo update-grub


ではここまで来たら正常にハイバネートできるか試してみましょう。

$ sudo pm-hibernate

しばらくしてから電源が完全に落ち、再度起動した際に作業状態が維持されていれば成功です。


正常にハイバネートができればメニューにハイバネートのエントリを追加します。
/etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pklaを以下の内容で作成してください。

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes


再起動します。

$ sudo shutdown -r now

以上でKubuntu 17.04でハイバネートできるようになりました。
そろそろKubuntu 17.10が出る頃ですが、きっと大きくは変わらないと信じています。きっと。