猫の手も借したい

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

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が出る頃ですが、きっと大きくは変わらないと信じています。きっと。

Windows10とLinuxの共存を諦めた話(妥協編)

相性問題というものがあります。あの人は苦手、あの人は得意じゃない。何があったわけではないけどうまくいかない。
人間100人いれば100人性格が違うので当然のことではあります。重要なのは、その相性の悪さをどう補うか、どう解決するかのほうです。

ちなみにWindows10とLinuxの相性が悪いという話です。


以前ZorinOSとWindows10をデュアルブートで運用している話を書きましたが、
akkisino02.hatenablog.com
程なくしてハイバネートから復帰できないことが判明しました。

Windows側でハイバネートすると次回起動時に100%ディスクチェックが走り保存してあった作業は死亡、Zorinはそもそもハイバネートに入れないという有様。
Windows10では確か1時間半だかスリープが続くと自動でハイバネートに移行するハイブリッドスリープみたいな機能が実装されているので、なんかしらんが蓋閉じといたら全部吹き飛んでたみたいなことが相次ぎました。冗談キツい。

えにばーさりーあっぷでーととかいうデメリットしかなかった更新がデュアルブート環境に大打撃を与えたらしく、まともに動くものも動かなくなってきてる気がします。

GRUBを書き換えたら一時改善されるもまたすぐ同じ症状が現れるし、ハイバネートできないと死んでしまうので泣く泣くWindows10とBash on Ubuntuのみでがんばってました。

Windows10が飛んだ

やはりWindowsメインだとストレスを感じるので、もうハイバネートを諦めてLinuxいれようかなあとパーティションを切ってるときに悲劇が起こった...
CSMモードに切り替えて立ち上げるやつを試そうとGpartedでC:ドライブの左側をつめて隙間を作ってる最中にサスペンドに入り二度と戻ってきませんでした。アーメン。
もういい機会なのでLinux一本で行くか!となった瞬間です。


Windowsが飛んだことによって、及びLinux一本で運用するに当たって、次の問題があります。
・学校ライセンス系のソフトが含まれるのでWindowsリカバリは職員室でしかできない
MOSの授業があるのでWord Excel 及び市販の模試ソフト(当然Windows用)が動く必要がある
・その他授業の進行についていける必要がある


まず一点目、リカバリが自力でできないことについて(支給時点に戻せない)はImagineのWindowsEducationがあるのでなんとかなります。VisualStudioなどもImagineからDLできるので問題ありません。一部どうしても手に入らないソフトがありますが、そのあたりは教員に泣きついてなんとかします。

二点目のOfficeについて。
これは致命的です。互換系Officeに関しては全くと言っていいほど信用してませんし、そもそもMOSに対応できません。今後レポートを書いたりパワポを触る機会は少なくないはずなのでMS純正Officeが使えないことにはかなりの問題があります。自分だけが互換Officeでやってくなんてわがままが通用するはずもないのでここはなんとかして解決する必要があります。

三点目について。
基本的には各言語の開発環境があればなんとかなるのでOSは問わないはずです。VSについても前述の通りImagineから落とせます。

VMという着地点

といってもメインで使うのはLinuxなのでWindows10側をVMに入れることにしました。
すれば純Linux環境で運用できるのでWindows10のブートローダーと喧嘩することもないし、起動時にOSを選ぶ必要もないし、細かいところを気にする必要がなくなります。

というわけで

OSは悩み抜いてKubuntu17.04を入れました。最近のKDEはかなりおしゃれ。
VMVM ware Playerで、Windows10EduとOfficeのみインストールしてスナップショットを保存、今後必要に応じて触ります。

ハイバネートで難航

Windowsを意識する必要もないし面倒だからオートでインストールさせるかあ!と丸投げしたところハイバネートできませんでした。なんでやねん。
どうやらUbuntu17.04系ではSWAP領域を確保せず、/swapfileにSWAPファイルで確保する方針になったようです。知らなかった。
この/swapfileが何故かデフォルトで2GBしかなく、当然RAM8のこのマシンではハイバネートすることもできず電源メニューにも表示されないという。14.10だかなんだかからハイバネートしにくくなってるしさせたくないんですかね。

この問題は紆余曲折あって解決しましたが、資料が少なくて困ったので別で記事にします。


結局入学から3ヶ月で支給時の面影もない位にシステムが変わりましたが物理的にもいじってるのでもう何も気にしないことにします。
VMWindowsを動かしてるとRAMが物足りなくなってくるので増設しようか悩み手。ていうかもうMacbookがほしい。

ASUS 2 in 1 T90chiを入手した

ASUSの読み、私はASUS派です。


最近家の近く(といっても徒歩30分くらい)に大型BOOK OFFの複合店みたいなやつがあることを知って行ってみました。(それまでは電車で何駅か移動してた)
何気なしに中古タブレットをみてたら、ASUS T90chiが2万ちょいで画面もきれいだったのでついつい購入。財布が空だったので最寄りのスーパーまで金を降ろしに死ぬ気で走った。今思えば別に走る必要はなかった。
背面に目立つ縦傷があるけどまあ中古だし、下手にきれいで気を使って使うよりは遠慮なくモバイルできるのでむしろいい。


VAIO Pの後継とまで言われているド変態2in1タブレットのT90chiは前々からかなり欲しかったのでめちゃくちゃ嬉しい。道中が山なりな坂道でしかも舗装がガタガタだったのでクロスバイクくんからダイレクトに振動が来てしんどかった以外は最高の日曜日になりました。



まだ1日しか触ってないけど以下感想。

・さすがASUSだ!俺たちにできないことを堂々とやってのける!そこに痺れる!憧れるゥ!
・X205TAもそうだったけどアホみたいにバッテリが持つ。中古だからそれなりに劣化してるだろうに平気で一日持つ。
・やっぱりキーボードがあるって素敵。というかあまりタブレットとして使う気がない。
・でも電子書籍読みたいときにスッとはずせるのは最高。教科書もPDF化した教科あるし。
・ゲームはあんまする予定ないけどZ3775だからそれなりにはできそう。
・8.9インチノート最高。

Win8.1モデルだったのでとりあえずそのまま一日持ち歩いてみたけどスマホいらないかもしれない。完全にテザリング用ホストだった。
うちの学校はImagineが使えるので帰宅してからWindows10Educationを入れた。そこまで派手なことはしないと思うので、AtomとRubyMINEくらいを入れて基本ノート取りと思いついたときにコードをスケッチする程度のマシンにしたい。実習のない日はこれを持って登校する予定。



しばらく使ってみてそのうちまとめます。