ハードウェア構成法のレポートについて

ハードウェア構成法のレポート(VHDLでコラッツの問題を計算する)の出題があまりにも雑で、課題の内容より環境構築のほうがよほど大変という感じだったので一応引き継ぎ書類みたいな感じでやりかたを書きます(が、僕自身の理解が不十分なのを隠す気がないため、一部雑なところがあります)。対象はubuntuですがインストールが終わって以降の話はwindowsでも使えるでしょう。Quartusのバージョンは18.1です。また、もっといいやり方があるものもあるかもしれませんが、あの課題をやるにあたってはソフトウェアに関してそこまで体系化された知識は必要ないので、とりあえずこうやればできたというものを書きます。

 

・準備

intelFPGAのQuartus Prime Lite Edition(version 17.1)をUbuntu16.04(on Virtualbox)にインストールする - k0b0's record. にあるとおり、

libxft2:i386 libxext6:i386 libncurses5:i386

この3つを入れます。サイトによってはもっと大量に列挙されていたりしますがこの3つの依存関係で全部入る説も見た気がします。

 

・ダウンロード

Quartus Prime Lite Edition(一式ファイル)をダウンロードします。なんか会員登録が必要と言われたのでしました。

 

・インストール

インストールはそれほど難しくないです。ModelSimが選択されているか確認しましょう。Starter Editionでいいです(そうじゃないとお金がかかります)。デバイスはCyclone Vだけでいいんじゃないでしょうか。これで必要容量が12GBくらいです。インストール先についてはデフォルトのままホームディレクトリに入れました。

 

・起動

~/intelFPGA_lite/18.1/quartus/bin/quartus

みたいなやつを実行するとQuartusが起動します。

 

・Modelsimの起動

Modelsimの実行ファイルの実体は

~/intelFPGA_lite/18.1/modelsim_ase/linuxaloem/vsim

です。これを端末から起動しようとすると、

Fatal: Read failure in vlm process

みたいなエラーが出ます。これはfreetypeのバージョン違いのエラーだそうです。Ubuntu16.04 64-bitで、Quartus II 13.1からModel-sim - Moiz's journalとかに書いてあります。しかしせっかくubuntuなのでこんなふうにわざわざコンパイルしなくても、http://ftp.riken.go.jp/Linux/ubuntu/pool/main/f/freetype/みたいなubuntuのミラーに行って、欲しいバージョンのパッケージをダウンロードして必要ファイルだけ取り出せばいいです。バージョンは2.5.0-2より新しいと駄目らしいのでlibfreetype6_2.4.8-1ubuntu2.6_i386.debあたりにして、インストールするのではなくアーカイブマネージャーで開き、data.tar.gzの/./usr/lib/i386-linux-gnu/の中の2つの.soファイルだけをどこか(/path/to/libraryとします)にコピーします。

そして、export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH

としてからvsimを実行します。今度は起動するはずです。うまく行かなければ

Altera Design Software - ArchWikiあたりが頼りになるかもしれません。

 

スクリプトからのModelSimの起動

ModelSimがとりあえず起動することを確認したら、~/intelFPGA_lite/18.1/modelsim_ase/bin/vsimを実行して起動するか確認します。本来はここから起動することが想定されています。Quartusもここを見に行くようです(~/intelFPGA_lite/18.1/modelsim_ase/linuxaloem/を見に行くような設定に元々はなっていますが(Tools -> Options -> EDA Tool Options)、~/intelFPGA_lite/18.1/modelsim_ase/bin/に変えないと動きません)。僕の場合は./../linux_rh60/vsimが見つかりませんと言われました。確かにそんなフォルダはないので、~/intelFPGA_lite/18.1/modelsim_ase/bin/vsimを編集し、linux_rh60となっている部分をlinux(あるいはlinuxaloem(シンボリックリンクなのでどっちでも変わらない))に変えます。すると当然ながら再びfreetypeのエラーが出るので、~/intelFPGA_lite/18.1/modelsim_ase/bin/vsimの下のほうにあるexec(が2つ入ったif文)の直前にexport LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATHと書きます。今度こそ起動します。

 

・プロジェクトを作成

Working directory(とは名ばかりで実際はプロジェクトディレクトリ)がデフォルトではQuartusのインストールディレクトリになってて普通に頭おかしいので、空のフォルダを作ってそこを指定しましょう。あと、なんか上の方で単に"ModelSim"と言っていますが、どうやらこいつはプロジェクト作成時の設定にある"ModelSim"と"ModelSim-Altera"のうち"Modelsim-Altera"に該当するらしいので気をつけましょう("ModelSim"を使う設定にすると、「あなたがModelSimとして指定したこの実行ファイルはModelSim-Alteraのようですが…」みたいに言われる)。

VHDLファイルを追加するときは、File->New...から作って編集し、Save As...でプロジェクトディレクトリの中に保存します。プロジェクトのファイル一覧は左上のProject NavigatorからFilesを選択すると見られます。

プロジェクトに関する設定はAssignmentsにあります。トップレベルエンティティはデフォルトではプロジェクト名と同じですが変えたいときとかはここから設定します。

 

VHDLを書く

先輩の解答例GitHub - dmingn/HW_report_2017とか、先生の解答例とか、Tutorials for VHDLとかを読んでがんばりました。一応本を買わなくてもなんとかなりました。先輩の解答例がちょっとこみいっている感じだったので、RAM使う以外の工夫を何もしていない、比較的単純な解答例を作ってみました。8041クロックかかります。

GitHub - ge9/collatz

何故かQuartusで日本語入力ができないため、心もとない英語でコメントを書きました。VHDL以外にも、プロジェクトの設定画面なども見比べてお使いください。

recordは構造体です。variableは使わなくてもできたのでよく理解してないです。同時処理文と順次処理文みたいなのが結構本質的っぽかったので調べました。

 

・テストベンチについて

シェフの気まぐれテストベンチ~NativeLink イリュージョン~ | マクニカオンラインサービスあたりを参照してテストベンチを設定します。参考サイトでは.vtという拡張子のファイルを指定していますが、VHDLなら.vhdになります(本来は.vhtにするのが正しいらしい)。ちなみに"Top level module in test bench"をわざと間違えて指定すると、ModelSimが起動したときに自動でシミュレーションが始まってしまうことがなくなり、一旦停止して最初からやり直す手間が省けたので、自分はそうしていました。僕のさっきの解答例はそうなっています。ModelSimの画面が起動したらcollatz_testbenchをダブルクリックすればいいです。

テストベンチをトップレベルエンティティにするとクロックのあたりでなんかエラー(wait statement must contain condition clause with until keyword)が出るのでだめです。理由は知りません。

 

・component宣言について

VHDLで下位ブロックを呼び出す2つの方法 - Qiitaに書いてあります。いちいちcomponent宣言のためにentity宣言をコピペするのはやっぱり美しくない気がしたので2つめの方法にしました。デメリットも一応あるらしいですが。

workというのは特殊な識別子で、現在のプロジェクトを指すらしいです。

 

・RAMについて

IP Catalogを表示してBasic Functions->On Chip MemoryからRAM:1-PORTみたいなやつを選ぶとウィザードが出てきます。僕は2-PORTも使う羽目になりました。メモリの仕様に関しては生成される.vhdファイルの中身を見ればわかります。

 

・タイミング解析

タイミング解析シリーズ 2 『 SDCファイルってなに?』に従って.sdcファイルを設定します。get_portsにはトップレベルエンティティのportを指定します。

 

コンパイル・シミュレーション

コンパイルすると結果のファイルに使用エレメントとか周波数が書いてあります(解答例参照)またTools->Run Simulation Tool->RTL SimulationからModelSimでシミュレートできます。Waveを見ながらデバッグしたりします。Wave->Format->Radix->Unsignedすると10進で表示されて見やすいです。

あと、Quartus側でご丁寧にModelsim-Alteraの/home/user/intelFPGA_lite/19.1/modelsim_ase/bin/

【Minecraft】天空TTと金リンゴから村人を作る(ポーション不要)

Minecraftにおいて後半戦(ネザーとか)を優位にすすめるためにはやはり村人の存在が不可欠です。僕が友達とやっているマルチサーバーではこの農場↓

www.youtube.comを導入して大量の作物を貯め、司書や武器鍛冶なども揃えたので、10分もあればノックバックII・ダメージ増加V・耐久力III・範囲ダメージ増加III・ドロップ増加III・火属性II・修繕のダイヤモンドの剣が1つ作れるくらいになりましたが、そこまでしなくても(ここまで不必要な自慢でした)村人がいればいちいちダイヤを取ってこなくてもダイヤの斧とか剣とかが使えてとても便利です。

しかしながら、遺憾なことに、Minecraftというゲームでは、「いくら探しても村がない」という場合があります。いや、本当にいくら探しても無いはずはないんですが、遠くまで知らない土地を冒険するのは(特にシングルプレイだと)鬱になりがちで僕は嫌いです。じゃあどうするかというと、村人を作ってしまおう、というのが今回の記事の目的です。

村が無さすぎて鬱になってGoogle先生を頼った人なら、村人ゾンビに弱化のスプラッシュポーションを投げたあと金のリンゴを与えれば村人へと治療できることは知っていることでしょう。ウィッチが弱化のポーションを投げるのを利用する方法を知っている人もいるかもしれません。しかしそれらを見て多くの人はこう思ったはずです―こんなのがうまくいくほど運が良ければ村なんてとっくに見つけてる、と。

今回紹介する方法はウィッチと村人ゾンビを利用しますが、きわめて安全性・確実性が高くなっています。多少の待ち時間などはありますが、現に僕はサバイバルでこれを4回やって一度も失敗(死亡・ロスト)しませんでした。必要なものは記事タイトルにある2つだけ、つまり

・天空TT

・金リンゴ

です(普通は村人を増殖させたいかと思うので、金リンゴは2個必要です)。天空TTは天空トラップタワー改!落下効率が10%向上しアイテム輸送も改善されました | nishiのマインクラフト攻略を想定していますが、小さい穴からウィッチ・村人ゾンビを含むMobが落ちてくるものであれば何でもいいです。

金リンゴについては、頑張って金インゴット16個(村人二人分)集めてください。天空TTは村人製造以外にもいろいろと用途があることですし、多少大変ですが作ってください。

さて、まず天空TTの下の方をこのように改造します。ガラスは見やすさのために使っているので丸石などでも大丈夫です。

f:id:turgenev:20190207205807p:plain

石ハーフがあるところが天空TTのmobが落下してくる場所です。無色のガラスブロックは今は置かなくていいです。ここがプレイヤーが立ってmobを処理している位置です。

ボートはトラップドアがあるほうを向いて設置します。だいたいブロックの中央にあればいいです(今気づいたのですが処理層の中からボートのあたりが見えてしまっており危険なのでそこは塞いでおいてください)。トラップドアの近くの穴は構造が見えにくくて申し訳ありませんが、深さ1マスです(下にブロックがあります)。

設備ができたら、次は村人ゾンビを捕獲します(上の画像はすでに捕獲・隔離が完了した状態です)。

TT使用中に、村人ゾンビが処理層にいることを確認したら、mobが落下してくる穴のどこかを途中で塞ぎ(作業中クリーパーに見られたりしないよう注意!)、新たにmobが処理層に落ちてこないようにします。そして、F3+Bで当たり判定を表示し、(なぎ払い攻撃)ではなく斧などで丁寧に一匹ずつ不要なmobを除去します。完全に場所が重なってしまっていたら雪玉を投げたり釣り竿で引っ張ったりして分離しましょう。

村人ゾンビだけになったらさきほどの無色のガラスを設置し、石ハーフを一旦全て壊します。すると村人ゾンビは下に落ち、水流に流されて、ボートに乗ります。

f:id:turgenev:20190207211500p:plain

次はウィッチ捕獲です。

再び石ハーフを設置してさきほど塞いだ場所を開け、今度はウィッチだけがいる状態にして、石ハーフを壊してボートに乗せます。ウィッチは体力値が多く、自然回復するので、ウィッチが落ちてきたのを確認して穴を塞いだら、あとは剣で攻撃していればウィッチだけが生き残るでしょう。

f:id:turgenev:20190207213458p:plain

こうなります。これでキャラクターは揃ったので、金リンゴを持って、トラップドアの奥からボートに近づきます。回り込むときにウィッチの攻撃には気をつけてください。適宜防護壁などを作ることを勧めます(もしプレイヤーが落下死したら二人ともデスポーンしてしまいます)。

f:id:turgenev:20190207213848p:plain

トラップドアのおかげで、この位置ならウィッチに気づかれません。

さて、いよいよクライマックスです。穴の中に入ります。

f:id:turgenev:20190207214132p:plain

村人ゾンビのむこうにいるウィッチが攻撃してきます。ちなみにあまりに前に行くとゾンビに殴られるので注意。ウィッチは最初は毒ばっかり投げてきますが、こっちの体力がハート4つ以下になると…

f:id:turgenev:20190207214355p:plain

きました!弱化です。この画像はリンゴを与えてしまったあとですが、右上のマークが弱化のマークなので覚えておいてください。これが出たら、ゾンビを右クリックして、持っていた金リンゴを与えます。赤いパーティクルが出て治療が開始したのを確認し、穴から出て後ろに下がります。ウィッチの攻撃で治療が中断されることはないのでそんなに急がなくて大丈夫です。治療が完了するまで、ゾンビがデスポーンしない距離でゆっくり待ちましょう。

f:id:turgenev:20190207215411p:plain

おめでとうございます。どうやら村人の治療ではゾンビがデスポーンして村人が新たにスポーンするらしく、ボートに乗っている順番が逆になります。ウィッチの処理は弓矢でいいと思いますが、誤射などを避けたければ、(治療の完了を待ってから)128マス以上離れてウィッチだけデスポーンさせればいいでしょう。

以上で完了です。乗せたmobを絶対に動かさないというボートの特性を活かしてなかなか完成度の高い装置になったかなと思っています。村がなくて困っている人の助けになれれば幸いです。

Surface Pro 4でlubuntu 18.04を使う

Surface Pro 4にlubuntu18.04を導入して、できるだけ快適に使えるようにするまでを紹介します。

lubuntuを入れる理由は、たまにlinuxを使いたい場合があること、ベースであるubuntuの情報が豊富なこと、動作速度と使いやすさのバランスがいいこと、などです。ディスク・メモリに余裕があるならLinuxMintがいいんですがメモリが4GBくらいであればlubuntuがいいと個人的には思います。今回使うSurfacePro4はメモリ8GBですが、温度が上がるのとSSDの容量が心配だったためlubuntuにしました。

(追記)BitLockerでCドライブを暗号化している(Microsoft側の推奨のため、したつもりがなくてもなっている場合が多そうです)場合は必ず前もって回復キーをどこか(該当のWindowsを起動していなくても見られる場所)にバックアップしておいてください。でないとLinuxのインストール後にWindowsが起動できなくなり、再インストールする羽目になります。参考→Windows 10 Proでディアルブート環境を作るときにはBitLockerの回復キーを控えておこう - Qiitaなど

自分の場合はBitLockerが無効になっていたようなので(後述のようにインストール後に有効にした)幸いこの罠にはハマりませんでしたが危ないところでした。

(以上追記)

インストール

結構いろいろな記事で解説されており、そのとおりにやったらうまく行ったのでリンクを載せます。他の項目でも、他に詳しい記事があればそっちを紹介して済ませることにします。

Surface Pro 4にUbuntu 16.04 LTSを導入する - Qiita - 情報が新しく、基本はこれに従えばいいと思います。Surface Pro3から4の間でも状況は変わっており、セキュアブートを無効にしなくてもMicrosoft & 3rd Party CAというオプションにするとubuntuが正しく動作するようになったようです。タイプカバーが何もしなくても正しく動作するというのも半信半疑でしたがちゃんと動いて驚きました。

Ubuntu1610OnSurfacePro4 - Debian UnstableでGO! - こちらはやや情報が古く、いろいろと面倒事を強いられている感じです。基本的にこういうことはしなくてもできましたが、唯一冒頭に書いてある「premature end of file...」には悩まされました。isoの直接コピーだとか、NTFSじゃなくてFAT32でやるとか、そもそもパーティションテーブルをGPTにしてみるとか、色々やりましたがうまく行きませんでした。結局、すでにデスクトップPCにインストールしてあったlinux mintの「USB イメージライタ」でやったらうまく行きました。理由はわかりません。

パッチのインストール

このままでもタイプカバーは正しく動くのですが、タッチは機能しなかったので、GitHub - jakeday/linux-surface: Linux Kernel for Surface Devicesをインストールします。lubuntuならDownloads for ubuntu based distrosってところからダウンロードすればできるはずです(あまり記憶にないので多分すんなり行ったんじゃないかと…)。「Signing the kernel for Secure Boot」の設定はしたほうがいいです(しないとdpkgでパッケージをインストールするたびにエラーが出てイライラします(それ以外にあまり問題はないです))。

高DPI設定

SurfacePro4のディスプレイは解像度が高く、あらゆるものが小さくて見にくいので、~/.Xresourcesに

Xft.dpi: 192

のように書き込んでログインし直します。数値が大きければ大きいほど文字も大きくなります。これで、フォントなど拡大縮小が効くものは大抵正しく表示されます。アプリケーションによってはこれでもうまく行かないので、そのときはHiDPI - ArchWikiを参照してください。また、Fontforgeなどがそうでしたが(

Support for High-DPI display · Issue #2483 · fontforge/fontforge · GitHub

)、個別のソフト内の設定で変えられる場合もあるので調べてみてください。Windowsの「システム(拡張)」的な万能薬は無いようです。

grubのカスタマイズ

必要はないのですが、やるなら最初のうちにやったほうがいいと思います(ミスって全てを吹っ飛ばすのが怖いので)。GRUB/ヒントとテクニック - ArchWikiこんな感じで、テーマ設定が書かれたファイル名を指定します。テーマは調べたらたくさん出てきますが、古いのだとリンク切れのものばかりでした。また、画像ファイル部分はあとから差し替えればいいので、けっこう簡単にカスタマイズできて楽しいです。

画面の明るさ

/sys/class/backlightを編集します。また、Ctrl+F10とCtrl+F11でそれぞれ暗く、明るくできます。

画面の明るさの設定は電源設定にある場合のほうが多いです。

Cドライブのマウント

Bitlockerを有効にしている場合の話をします。有効にしていない場合については試していませんが、以下の記述において、dislocker-fuseコマンドは全て無視し、/media/bitlocker/dislocker-fileの部分をすべて/dev/nvme0n1p3のように直接Windowsが入っているパーティションを指定するように置き換えればできるかと思います。

Bitlockerを使う場合は、BitLockerで暗号化されたストレージをLinuxでマウントするためのdislocker – guro_chanの手帳 だいたいこのとおりですが、この方式だと一旦復号したのをファイルに書き出して静的にマウントするようなので、(事実上)readonlyになります。直接的にパーティションを読み書きしたい場合がほとんどだと思うので、dislocker-fuseコマンドを使います。また、自分の環境ではCan't access Windows drive: “Windows is hibernated, refused to mount” - Unix & Linux Stack Exchangeこれと同じ状況になったので、そこに書いてある解決策に従います。具体的なコマンドは次のようになります。(nvme0n1p3)

$ sudo dislocker-fuse -V /dev/nvme0n1p3 --recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /media/bitlocker
$ sudo ntfs-3g -o remove_hiberfile /media/bitlocker/dislocker-file /media/win

また、/etc/fstabには、

/dev/nvme0n1p3     /media/bitlocker     fuse.dislocker recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx 0 0

/media/bitlocker/dislocker-file   /media/win ntfs-3g rw,nofail,remove_hiberfile 0  2

と、二行に分けて記載します。 

また、Bitlockerを有効にしたあとにWindowsを起動したら再起動ループにハマりました。解決法はこちらです→Stop a BitLocker boot loop - Windows 10 - Spiceworks

 

また、もちろんWindowsの「高速スタートアップ」はoffにしておくべきです。そして、なぜかoffにしても高速スタートアップのような挙動をしたので、Windows側で、シャットダウン時に実行するコマンドに完全シャットダウン(shutdown /s /f /t 0)を追加しました。

Windowsが強制終了するなど正しくシャットダウンされなかった場合はこれでもマウントできないので、ntfsfixというコマンドを使います(本来は一旦windowsを起動してから再起動するのが筋ですが…)。これはfstabには書けないのでどっかのシェルスクリプトに書いておいて必要なときのみ起動します。こんな感じになります。

sudo ntfsfix /media/bitlocker/dislocker-file
sudo mount -t ntfs-3g /media/bitlocker/dislocker-file /media/win -o rw,nofail,remove_hiberfile

 なお、僕はWindows側でCドライブに"!"アイコンがついていて見栄えが良くないためBitlockerを有効にしましたが、回復キーはLinuxに平文で保存されているのでセキュリティ的には全く意味ないです。

その他の設定

Ubuntu 18.10をインストールした直後に行う設定 & インストールするソフトにいろいろ書いてあります。『デスクトップ』『音楽』などの日本語フォルダー名を英語表記にするマルチブート環境や仮想マシン上のWindowsの時計がズレるのを防ぐあたりは定番ですね。これもやるなら早いうちのほうが楽でしょう。

キーボード配列

戻る・進むで右Alt+←→を個人的によく使うのですが、右Altがうまく機能しませんでした。キー配列の変更はxmodmapを使うものがよく出てきますが、最近はX KeyBoard extension - ArchWikiのように/etc/X11/xorg.conf.d/のルールとして設定するほうが推奨されているようです。今回の場合、90-custom-kbd.confというような名前のファイルにSection "InputClass"
     Identifier "keyboard defaults"
     MatchIsKeyboard "on"
     Option "XKbOptions" "lv3:ralt_alt"
EndSection

と書いておきます。

スクロールの向き

これも.Xmodmapに書き込む方法がよく出てきますが、一部アプリケーションには反映されなかった記憶があります。Xfce タッチバッドのスクロール方向の設定 - QiitaのようにSynclientを使ったほうがいいです。設定を永続化するには、Synaptics タッチパッド - ArchWikiに書いてあるとおり、これもやはり/etc/X11/xorg.conf.d/の中にファイルを作ってそこに書きます。シェルスクリプトにsynclientのコマンドを書いて、スタートメニューの「LXSessionのデフォルトのアプリケーション」から自動起動に登録してもいいのですが、カバーを閉じたとき(後述します)にリセットされてしまうのでxorg.conf.dを使ったほうがいいです。

タッチパネルが反応しなくなる問題

Minecraftで猛スピードで交易して画面をタッチしまくっているとたまにタッチが効かなくなることがありました。その時はhttps://github.com/jakeday/linux-surface/issues/55に記載の通り、

rmmod intel_ipts

modprobe intel_ipts

とすれば治ります。いちいち打つのは面倒なのでキーボードショートカットにしたいのですが、root権限がいるので、https://askubuntu.com/questions/821919/how-do-i-add-sudo-commands-to-a-keyboard-shortcut を参考に、root権限無しで実行できる特例としてシェルスクリプトを作り、これをホットキーに登録しておきます。

ブルーライトカット

Linuxでブルーライトカット - turgenev’s blogに書いたとおりです。

カバーを閉じたときの動作

これ以降は、自分がやった限りあまりうまく行かなかったものが並んでいます。

Surfaceのタイプカバーを閉じると画面が暗くなり、開けても反応しなくなってしまいます。本当は、ハイバーネーションかサスペンドが正しく動作すればよいのですが、まずサスペンドはjakedayのページでも動かないと明言されています。ハイバーネートは、(swapfile、grubなどを適切に設定した上で)uswsuspのs2diskコマンドを使ったら、一応できました。しかし再起動後はWi-Fiやタッチが動作しないなど、使い物になりません。systemctlコマンドを使うやり方もうまく行きませんでした(Hibernate doesn't turn off completely computer surface Pro4 · Issue #378 · jakeday/linux-surface · GitHubのようになる)。

とりあえず、Windowsの癖で蓋を閉じたときにそのまま使えなくなってしまうのは困るので、蓋を閉じても何も起こらない(ディスプレイもオンのまま)ようにします。power management - How can I tell Ubuntu to do nothing when I close my laptop lid? - Ask Ubuntuに記載の通り、Upower.confのIgnoreLidをtrueにしました。僕の環境だとlogind.confのHandleLidSwitch=ignoreだけではうまく行きませんでした。

その上で、acpidを利用し、カバー(lid)を閉じるとディスプレイがオフになるようにします。/etc/acpi/eventsフォルダの中に、lm_lid(適当でいいです)というファイルを作成し、

event=button/lid LID close
action=/etc/acpi/lid.sh

のように書き込みます。そして、/etc/acpi/lid.shの中には

#!/bin/sh

export DISPLAY=:0
xset dpms force off

のように書いておきます。また、

#!/bin/sh
xhost si:localuser:root

と書いたスクリプト自動起動に登録しておきます。

こうしておくことで、rootがローカルユーザーのディスプレイを認識できるようになります。

また、このままだと何故か最初の一回しか動作しませんでした。色々と調べると、カーネルパラメータにbutton.lid_init_state=ignoreを追加すれば良いということがわかりました。GRUB_CMDLINE_LINUXに追記してgrub2-updateします。なお、蓋を開けたイベントも検出できるのですがタイミングがおかしかったので使っていません。/proc/acpi/button/lid/LID0/stateの中身は正しく更新されているようなので、開けたときにどうしても自動で電源がonになってほしい場合は、closeのイベントを検出した時点からそのファイルを監視し始め、openになったらつけるようにすればできるでしょう(本来はkernelの機能から直接的にできてほしいのですが…)。僕は、どうせwindowsでもつかないんだからということでやっていません。

電源ボタンの動作

デフォルトでは、ログアウトや再起動などいくつかのオプションを聞いてくる画面になります。これもwindowsに慣れた感覚ではあまり使い勝手が良くないです。このボタンの動作はホットキーのところで定義されているのでそれをいじります(acpidで検出することも可能ですが)。理想としてはここにハイバーネートのコマンドを指定したいところですが、前述の通りうまくいかないので、やはり「xset dpms force off」を使います。ただしこれをそのまま指定すると、ボタンを離したタイミングに反応してディスプレイが再びonになってしまうため、sleep 1したあとにこれが実行されるよう、シェルスクリプトに書いてそれを登録します。

ウインドウのリサイズ

デフォルトのままではウインドウの端の「当たり判定」が狭すぎて、ものすごく注意深くカーソルを動かさないとリサイズできません。これはlubuntuというかLXDEの問題です。一応Size of grab area for resizing window in lubuntu - Ask Ubuntuという解決策っぽいものがありますがこれだと見た目まで太くなってしまいます。代わりに、Alt+右ドラッグで端を持っていなくてもリサイズできるようなのでこれで我慢しました。

おわりに

Surfaceでlubuntuをただ使うだけなら簡単ですが、Windowsと変わりない使い心地を追求するのはけっこう骨が折れます。Archwikiは相変わらず頼りになりますが、それ以上の日本語の情報はほとんど無いですし、ブログに書くくらいのモチベーションがないとやってられません。せっかく書いたので、特にハイバーネートあたりに関して解決策などあればコメントいただけると嬉しいです。質問とかでもいいです。

また、lubuntu18.10からはLXDEでなくLXQtになったようで、ここに書いたうちいくつかはもしかしたら用無しになるのかもしれません…

放出音と入破音のやりかた

はじめに

最近手軽なウケ狙いとして両唇入破音(りょうしんにゅうはおん)(後述)という子音がとても有能であることに気づきました。みんなにもやって欲しくていろいろと手探りでやり方を説明してみているのですが、あんまりできる人が増えませんでした。ネットで調べても、まともなやり方(調音方法)の解説がほとんどなかったため、自分で書いてみようと思った次第です。

放出音・入破音とは?

冒頭でも述べたように、子音の一種です。ただし、我々が比較的よく使う言語、すなわち日本語・英語・中国語・フランス語・ドイツ語・ロシア語などに存在する子音とは大きく異なる点があります。それは、この両者が「非肺臓気流機構の子音」であるということです。意味は文字通り、肺から出た空気を使わないで発音する子音、といったところです。

子音 - Wikipediaの一番下の表を見てみましょう。左側に「肺臓気流」の表があり、普通我々が使っている子音はたいていそっち側のものだけです。例えばそこにある「p」だったら両方の唇で破裂を起こして発音しています。それがこの表の見方です。正式な名前は「無声両唇破裂音」と言います(有声ならbですね)。巻き舌しても「キャー」とか叫んでも「シーッ」と口に手を当ててもそんなもの所詮は肺臓気流音、この表の域を出ないわけです。

その右側にある「非肺臓気流」の表。今回の我々の相手はこの表の中にいます。冒頭の「両唇入破音」は両方の唇を使う入破音ということになります。ちなみに吸着音はキスとか舌打ちといった類の音で、なんか発音していて楽しくないので今回は扱いません。いつも使っている子音と根本的に調音方法の異なる放出音・入破音を、一体どうすれば発音できるのか、これから詳しく見ていきます。

声門を閉じる

放出音・入破音を発音できるようになるためにはまずこの「声門を閉じる」ということを理解し、習得する必要があります。と言っても別に難しいことではなく、声門というのは実は声帯とほとんど同じ意味(場所)です。さらに、今(この文章を読む時)まで生きていて一度も声門を閉じたことがない人などいないと思います。あくまでそれを意識的にやってはいないというだけです。

声門の場所はすなわち声帯の場所です。我々が「のど」と認識できる一番奥にあります。試しに「あ」と何回か言ってみてください。「あ」の音が出る直前に、そのあたりで何か閉じたものが開く感覚があるはずです。それが声門です。実は、この閉じていた声門が開く音は子音として「声門閉鎖音(声門破裂音)」という名前が与えられています。つまり我々は普段「あ」の母音だけを出しているつもりでもその直前には声門閉鎖音という子音が入っているのです。ハワイ語などでは声門閉鎖音の有無で単語の意味が変わったりするらしいです。難しそうですね。

声門がどこかわかったら、この声門閉鎖音を練習しましょう。「あ」を何回か発音すると声門は開閉を繰り返します。このスピードをだんだん上げていきます。変な笑い声に聞こえるくらいまで行けば十分だと思います。出来たら今度は唇を「ふ」を発音するときくらいの形にして、「あ」を言わず(声帯を振動させず)に声門閉鎖音だけを素早く発音してみましょう。唇が声門が開いたときの息の勢いで揺れていれば正しくできていると思います。これも速くできるに越したことはないと思うので練習しましょう。

ちなみに声門閉鎖音の身近な応用としては口笛があります。口笛が吹ける人は口笛で同じ音を伸ばしながら声門閉鎖音を発音してみましょう。音が切れて聞こえると思います。通常の管楽器ではタンギングといってtの音、つまり舌と歯茎の閉鎖で音を切りますが、口笛はそれだと音が出にくいので代わりに声門閉鎖を使うことになります。

ところで、声門を閉じると全く呼吸ができなくなります。声門は気管のすぐ上にあり、そこを閉じてしまえば肺から鼻・口への空気の通り道は完全に塞がれます。そして、放出音・入破音は肺から出た空気を使ってはいけない音です。つまり、それらを発音する間は声門を閉じておかなければならないのです(入破音は厳密には違いますが)。

ここまで理解したら、いよいよ放出音・入破音の調音に進みましょう。

放出音

音として聞こえ方が面白いのは入破音で、そちら目当ての読者のほうが多い気がしますが、個人的には入破音より放出音のほうがはるかに簡単で、しかも入破音へのよい導入になると思うので先に解説します。少なくとも僕は、放出音はWikipediaの解説を見て発音例を聞いて1分練習するだけでできるようになりましたが、入破音は発音例を繰り返し聞いたり息を前向きに破裂させないようにひたすら頑張ったりして、満足にできるまで1時間くらいかかった記憶があります。入破音はできるが放出音ができないという声もネット上で見かけましたがおそらく少数派だと思います。

放出音 - Wikipediaによれば、「放出音は、調音点声門の二カ所で閉鎖を作って空気を閉じこめたのち、声門を上げて口腔内の気圧を上げると、外との気圧差で調音点での閉鎖が開放され、中から弱い外向きの気流が作り出されることによって発音される。」だそうです。全くその通り、完全に正しい解説なのですが、これだけ読んでできる人はこんなブログは読まないと思うのでもう少し丁寧に説明します。

まず、イメージをつかむため、両唇放出音 - Wikipedia と 歯茎放出音 - Wikipedia の発音例を聞いてみてください。記号の見た目通りpやtみたいな音だな、と思った人が多いと思います。実際、放出音の発音の過程は普通の閉鎖音(破裂音)とほとんど同じです。違いはただ一つ、破裂を起こすのに使っている息が肺から来ているかどうか、です。

普通のpを発音するときは声門を開けた状態で唇を閉じ、肺からの息の圧力に唇が耐えているのを開放することで「パッ」という破裂音が出ます。この「圧力」というのが放出音・入破音を攻略する大きなカギになります。

放出音では、声門を閉じた状態、すなわち全く肺からの息が出ない状態で、声門より上(口に近い側)の空間だけを使ってこの圧力差をどうにかして作り出し、(声門を閉じたまま)破裂音を出さなければなりません(なお、続けて母音を出すためにはそのあとで声門を開けなければならないので、母音を後に付ける場合は必ずさっきのWikipediaの発音例のように「プ あー」のような聞こえ方になります)。この「どうにかして」の部分が、多くの人が放出音を発音しようとしてつまずいている部分だと思われます。上のWikipediaの「声門を上げて」の記述がそれですね。

これが簡単にできるかどうかは個人差があると思います。おそらく「声門を閉じたままどうにかして口の中の気圧を上げろ」と言われただけでできる人や発音例を聞いただけでできる人もいると思いますが、そうでない人向けにこの記事を書いているので頑張って解説します。ただし僕自身ここはあまり苦労せずできてしまったので役立つアドバイスができないかもしれません。一番重要なところなんですが…申し訳ありません。

まず絶対に守ってほしいのは、意地でも声門を開けないことです。声門を開けてしまっては放出音の発音はできません。声門を閉じたまま唇を開閉するなど複雑な動きをしてみて、その間声門が閉じていることを確かめてください。あとは、あなたがもし男性ならば、放出音の発音時に声門の位置が喉仏で分かるので、喉仏を上げるよう努力するというのもいいと思います。あとはひたすら発音例を聞いて頑張ってください。

なんとなくできるようになったら、勢いよく、強い音が出せるようにすることも大切です。放出音で強い音が出ないようではおそらく入破音は発音できません。頑張って喉頭(喉仏)を鍛えましょう。鍛えるといったものの僕は特に鍛えていたわけでもないのに発音できるので、コツをつかむということが大事なんだと思います。毎日発音してだんだんうまくなるとかそういうものではない気がします。

ちなみに放出音を持つ代表的な言語としてはグルジア語が挙げられます。ქართული←こんな感じで文字がかわいいことで有名な言語です。

入破音

では、いよいよ最難関である入破音に挑んでいきましょう。入破音 - Wikipedia によれば調音方法は

喉頭より上部の調音点で閉鎖を作り、声門は声帯が振動可能な状態にする。喉頭を急激に押し下げると口腔内の気圧が低下し、声門の下の空気が上向きに流れ出て声帯を振動させる。同時に外との気圧差がある状態で調音点の閉鎖が開放され、外から弱い内向きの気流が作り出される。

ちょっと何言ってるのかわからない感じですが、合ってます。慣れるとこれだけのことを何も考えず一瞬でできるようになりますが、はっきりいって入破音の発音は相当難しいです。そして、発音例がこちら。両唇入破音 - Wikipedia 変な音ですね。最初聞いたときは結構な衝撃でした。パキスタンのシンド語やアフリカの諸言語で用いられるほか、ベトナム語などでも話者によっては出るようです。そういう音をウケ狙いとして使っていいのかどうかはよくわかりませんが…

さて、先ほど放出音の項で「圧力」がカギになる、と述べました。入破音の難しさは、この「圧力」の使い方が日本語・英語などにあるどの子音とも異なっていることにあります。普通のt,p,d,bなどの子音や放出音は全て口の内側の圧力が高まったのが解放されて破裂音が鳴ります。しかしなんと入破音では、口の内側のほうが圧力が低く、それを解放することにより外から空気が入ることで破裂音が出るのです。こんな発音、一体どうやって思いついたんでしょうか…

口の中の圧力を下げる、しかも非肺臓気流ですから、できることはただ一つ。放出音とは逆に、喉頭を下げて声門より上の部分の空間を広げるしかありません。また、放出音は発音する間は完全に声門が閉じていましたが、入破音ではそうではありません。発音例を聞いてみるとそれがよくわかります。ただし、外側から空気を入れようと思って息を肺で吸ってしまうのはダメです。正確には、Wikipediaにも記載の通り、喉頭を下げるときに声門が少し開き、そこから音が出始めるのですが、そんなことをごちゃごちゃ考えてもたぶん入破音はできませんし、考えなくてもできると思います。唯一、重要なポイントは、「喉頭急激に押し下げる」という部分です。急激でないとうまく入破音は発音できませんし、逆に急激に押し下げられさえすれば声帯が震え、自然なタイミングで声が出ます。放出音では、ゆっくり喉頭を上げていって空気をためてから破裂させても音は出ますが、入破音はそれと違い、ゆっくり喉頭を下げて圧力差を作っても自然な発音はできません(おそらく、Wikipediaに控えめに書いてある「無声の入破音」というのが出ているのではないかと思います)。

喉頭急激に押し下げる

まずは、唇の閉鎖などは後回しにして、この訓練をしましょう。これができれば入破音まであと一歩です。

放出音が正しくできていれば、喉頭を上に動かすことはできるようになっているはずです。では、口を閉じて、通常の状態から放出音を発音する直前の状態まで喉頭を上げ、そのあと再び通常の状態に戻してみましょう。上げた状態から戻したので、喉頭は下がっているはずです。これを何度か繰り返し、喉頭が上下する感覚をつかみましょう。それができたら今度は、口を閉じたままで、通常の状態から喉頭をさらに下げてみてください。舌の付け根が下に引っ張られて息苦しい感じになればOKです。

次に、それを急激にやってみてください。とにかく勢いが大事です。「ン」という短い音がして、その直後に喉の奥から空気のかたまりが上がってくる感じがあれば大丈夫です。「ン」の長さができるだけ短く、鋭い音になるように練習してみてください。この鋭さが入破音の成功率と完成度を左右します。

仕上げ

喉頭を急激に下げられるようになったら、唇だけを閉じて(「バ」をいうような状態にして)先ほどの「ン」の音を出そうとしてみて、「ン」の音が出た直後に唇を解放すれば、両唇入破音が発音できるはずです。あとはWikipediaの発音例と聞き比べながら、だんだん「直後」のタイミングを洗練させていきましょう。

終わりに

以上で解説は終わりです。できるまでの過程や大変さは人それぞれだと思いますし、どこかで詰まってしまう人もいると思うので、なにかわからない点などあればどうぞ遠慮なくコメントでお伝えください。

Windowsでsshpassっぽいことをする

最近、Windows上のVS Codesshサーバー上のプログラムを編集・実行したいということがありました。編集に関してはVS Codeにliximomo.sftpという拡張機能があり、セーブしたときに自動でアップロードしてくれます。ちなみにsshpassと記事タイトルについていることからわかるように今回は公開鍵が使えない状況なのですがこの拡張機能はちゃんとパスワードも自動で入力してくれます。また、コンパイル・実行に関しても、Linuxなら、VS Codeの統合ターミナルでsshpassを打てばできます。ただし、Windowsだと、sshpassコマンドはありません。そこで、以下のようにいろいろ試してみました。

・MSYS2のpacmansshとsshpassを入れる

cygwinsshを入れ、sshpassをビルド

cygwinでexpectを入れ、パスワード入力させる

・パイプ(|)やリダイレクト(<)を使ってファイルや標準入力からパスワード入力させる

全部ダメでした(パスワードを要求されてしまう)。おそらくlinuxWindowsではパスワードをコンソール画面で入力させる仕様の何かが違うんでしょう。

諦めかけていましたが、そもそもopenssh系を使わない方法で探してみたところ、PuTTYに付属しているplinkコマンドで同じことができました。

plink.exe -load server1 -l username -pw password

こんな感じで、server1というサーバー設定(設定データはPuTTYGUI画面で作れます)を、パスワードとユーザー名を指定して読み込んで接続してくれます。

12/01追記:このままだとログインした先のLinuxでlsとかを実行したときの文字の色が反映されなかったのでANSICONをインストールしたらうまくいきました。先ほどのコマンド全体をansiconの引数として("ansicon.exe "の後に付けて)実行すればよいです。また、コマンド履歴(↑↓キーで最近使ったコマンドを自動入力できるやつ)が使えないようです。悲しいです。

12/03追記:Windows Subsystem for Linuxでsshpassをインストールしたら普通にできました。悲しいです。

Linuxでブルーライトカット その2

以前、Linuxでブルーライトカット - turgenev’s blog を書いたときの僕は、xgamma -bgamma 0.7で満足していたようですが、冷静に考えてこれ、ちょっと青い部分がほとんど青くなくなっただけで、めちゃめちゃ青い部分(白い部分など)はそのままなので、やっぱり不満になってきました。

Windowsで出来てるみたいに画面全体が黄色っぽくなる感じでブルーライトを減らしたい。ということで再挑戦しました。

そもそもそういうことがLinuxの機能でできるのかどうかという疑問もありましたが、以前の記事でも言及したRedshiftは起動するとちゃんと画面全体が赤っぽくなります。どうやったらこれができるんだろう、と考えたときにまず思いつくのはソースコードを見ることです。しかし色温度を変更していそうな部分をざっとみても比較的コードの量が多く、そもそも慣れないことなので断念しました。

そこで思いついたのが、もうRedshiftのソースコードはそのまま使ってパラメータだけ変えてビルドしよう、ということです。OSSなので気兼ねなくこういうことができていいですね。

Releases · jonls/redshift · GitHub

からソースコードをダウンロードし、colorramp.cに列挙してある色温度のパラメーターの3700K(なんとなく選んだ)の部分だけを変えて、もともとRGBがそれぞれ1.00000000, 0.80053332, 0.58884417だったのを1.00000000, 0.90053332, 0.58884417に変更し、より「ブルーライトカット」に近い値にしました。あとはCONTRIBUTING.mdに従い、必要なライブラリなどを入れてビルド。普通はrandrモードで動作してるっぽかったのでその関係のもの(libxcbとlibxcb-randrの-devパッケージ)は指示に従って入れました。また./configureのオプションには--enable-randrをつけます。

さて、無事ビルドが終わったら、3700Kを指定されたときだけブルーライトカットっぽくなるredshiftの実行ファイルができているので、あとは~/.config/redshift.confを作成(編集)し

[redshift]
temp-day=3700
temp-night=3700
transition=1
gamma=1.0:1.0:1.0
location-provider=manual
adjustment-method=randr

; The location provider and adjustment method settings
; are in their own sections.
[manual]
lat=35.0
lon=140.0

などと書いておけばredshiftをいつ起動しても(昼夜にかかわらず)ブルーライトカットしてくれます。

redshiftの実行ファイルと同じディレクトリにシェルスクリプトを作成し

#!/bin/sh
cd `dirname $0`
./redshift -x
./redshift -o

などと書き込んでおけば、これを実行するだけで、既に起動していたredshiftなどによる補正をリセットし、ブルーライトカットの状態になります。

このシェルスクリプトへショートカットをlxshortcutで作成し、ついでにログオン時の自動実行にも登録しておきました。

快適です。

Minecraft:松(Spruce)の巨木のシンプルで便利な植林場

※1.15から木が成長時に水流を置き換えるようになったので動作しなくなりました。かわりにはしごを使いましょう(やや速度は落ちます。)

 

作り方を一言でいうと、苗木から2マス南側か東側に離れたところに上空(40ブロック程度)から水を流す。これだけです。

f:id:turgenev:20180625202449p:plainf:id:turgenev:20180625202526p:plain

 

 

この位置にブロックがあっても木の成長は妨げられませんが、そこに葉が生成されなくなります。なので、水流は葉の中を貫通し、上まで登れる状態になります。

また、松の巨木の頂上の1マスまたは2マス下(画像では2マス下ですね)には必ず、幹を取り囲む形状の8個の葉が生成されます。というわけで、水流を登ってこの葉のところで出れば、松の巨木を上から伐採することができます。どんな高さでもです(松の木の高さは最大でも30ブロック程度なので上空40ブロック程度に水を配置しました)。

松の巨木は大量の原木が取れ、枝が生成されず、苗木の回収率もかなり高い(たまに非常に葉が少ない木もありますが)ため、骨粉による自動化などを行わない小規模な植林場には最も向いている木と言えるでしょう……ただし、ストレスなく伐採できるのであれば。

実際には、松の木は高さが15~30程度と幅があり、単純に足場を作って上から伐採するのは難があります。かと言って螺旋伐採するのは、いちいちマウスの角度を変えて登っていってまた切りながら降りなければならず、ストレスが溜まります。そこで、どんな高さに生えても速やかに頂上にたどり着ける方法として思いついたのがこれでした(水流を登る速度は意外と速いです)。また、水流一つだけなら葉の量が大きく減ることはなく、苗木の収量も十分確保できます。ちなみに自分は拠点付近に4本分の植林場を作りました。石の斧で伐採していて速度が遅いので、2本切ってる間に1本生えるくらいのペースにはなっている気がします。個人的にはかなり満足です。

水が南側または東側となっているのは、2x2の松は北西の苗木を中心とした5x5(x(木の高さ+2)だったかな)の空間が空いていれば成長するからです。木の南側・東側なら苗木から一マス開けておけば大丈夫なんです。

同じことをジャングルの巨木でやろうとすると、枝が水流を置き換えてしまう場合があります。ただしこちらは頂上の葉が平たく、常に同じ形なので、もっと離れた場所に水流を配置することができます。ジャングルの木の枝はそれほど長くならないので、(ちゃんと試していませんが)同じようなものが作れるはずです。ただし上から切るにしても枝の伐採は面倒なので松をお勧めします。

 

余談ですが、水流は周り4マスに一つでも不透明ブロックがあると登るのがかなり遅くなります(1.13からはあまり差がなくなりました)。mobは周りに不透明ブロックがない水流は登れますが、一つでもあると登れません(1.13ではわずかに速度が落ちるものの、登れるようになりました)。