たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

第32回シェル芸勉強会大阪サテライトに参加した

正規表現ムズい

2017年12月2日に開催された第32回シェル芸勉強会の大阪サテライトに参加してきたのでその時の感想と自分の解答を日記します
techplay.jp

午前中

perl正規表現第3回目
「はあ今日ここでぼくの命の輝きも終わりかあ」と会場ついたときには思いましたが、講師の方がすごくわかりやすく教えてくれたので延命できた
perl正規表現がDFSで実装されてるので遅いという話はとてもおもしろかった

その他も強力な正規表現のオンパレードで確かにこれを習得すればシェル芸力が跳ね上がりそう...(永遠に無理)

午後

「今回の問題はヤバい」とTwitterで見ていたのでめっちゃくちゃ身構えて行きましたがいつもより時間内に解けた問題が多かったのでうれC
問題と想定解答は以下にあるよ
【問題と解答】jus共催 第32回全くインスタ映えしないシェル芸勉強会

Q1

echoされた10までの数字列に含まれない奴を歯抜けにして縦に出力する問題。のっけからパズル

僕の答え

echo 14679|grep -o .|diff - <(seq 1 10) -y|awk '{print $1}'|tr -d '>'

diff-yで左右にどーんとすればいいかなーと思って素直に
競プロでいう「はい」って感じの解法だった。はい

Q2

Q1の出力で歯抜けになっているところをa,b,c....と埋めていく問題

僕の答え

echo 14679|grep -o .|comm - <(seq 1 9)|cut -f3|awk 'BEGIN{c=97}{if($1==""){printf "%c\n",c++}else{print $1}}'

前問の答え合わせのときに知ったcommコマンドを使ってみた。diffの表示がわかりやすい版見たいな感じだ
問題の解答はawkprintfaから順番に出していくだけになった。awkゴリゴリ
これも割とやさしい

Q3

/etc/servicesから素数TCPポート番号をもつサービスだけ取り出す問題。でたよ素数
シェル芸で素数といえばfactorを使って素因数分解の結果を得た後、awkでフィールド数を数える方法があまりにも有名

#素数だろうか?
echo 17 | factor | awk 'NF==2{print}'

これを使ってポート番号が素数かどうか判定してechoすれば良さそうということで以下が僕の答え

僕の答え

cat /etc/services | grep /tcp|awk '{print $1" "$2}'|sed 's|/tcp||g'|while read L;do x=$(echo $L|awk '{print $2}'); [ "$(echo $x|factor|awk 'NF==2{print}')" != "" ] && echo "$L"; done|awk '{print $1}'

うーんゴリゴリwhile read LINE;
後で気づいたけどreadは二つでもフィールドを読めるのでx=の部分はいらなかった

Q4

入力

136
725
948

9
7
4
1
2
8
3
5
6

に変換する問題。読解がちょっと難しいけど、9から斜めに出力していくということ

僕の答え

頭のいい解答が思いつかなかったのでちょっとセコい方法で

cat ./nums.txt |xargs|tr -d ' '|python -c "x=input();l=[6,3,7,0,4,8,1,5,2];
for i in l:
    print(x[i])
"

3x3の入力をxargstrで1列に整形してから6,3,7,0,4,8,1,5,2の順番に出力した出力自体は何でもよかったけどpythonを使った
ワンラインじゃないけど....いいでしょたぶん....
こんなんじゃなく賢いやり方をみると「ほぉぉ〜〜」ってなるのがシェル芸勉強会のおもしろい所の1つだとおもいます

Q5

テキストファイルからウムラウトだけを抽出する問題。なんやこれ....
ちなみにウムラウトってのは文字の上に点々がついてるアレ
時間内に解けたのはここまで

僕の答え

cat ./umlaut.txt |xargs|tr -d ' '|csharp -e 'foreach(var c in Console.ReadLine().Where(x=>x>=196&&x<12450)) Console.WriteLine(c)'

ウッ...!C#!方針としてはアスキーコードを見てある範囲内ならウムラウトだとするようにしたWhereで削ってWriteLineするだけ
csharpコマンド楽しいのでぜひインストールしよう

Q6

誰かのTwitterをターゲットにして新しい投稿がある度に端末上に「んほぉ!」と出力する問題。なんやこれ....なんやこれ...
曰く急に生徒がこなくなったときこれがあれば生きてるかどうか分かるらしい...ホンマか

この問題は時間内に解けなかったので解答はなし。w3mですくれいぴんぐ?して総ツイート数を比較するらしい
wgetで同じことしようとしてたがうまく抽出できず...!無念!!

Q7

縮小をする画像処理アルゴリズムワンライナー化問題。普通にスマートなやり方はない
C#でゴリゴリやればできると思うけどめっちゃ長くなって読みにくいしバグらせるしモウダメ...となってるうちに時間切れ

Q8

満身創痍で挑むラスト問題はカタカナや漢字が行頭にくるようなワンライナーを考える問題。
ただし「シェル芸」みたいなものは1つの単語としてカウントすること。なんやのこれ...

午前中に覚えたperl正規表現\p{Hiragana}\p{Han}\p{Katakana}を使ってやるだけかと思ったが「シェル芸」を一塊にできず時間切れ。なんやこれ

LT

今回もLTまで参加させてもらった。毎回「ほえ〜〜〜」となる話とかが多くて楽しい

発表者の紹介とかは上のYoutubeにお任せします★

一番目はinterdiffというコマンドの紹介
最初はdiffのバイナリのdiffをとる話なのかと思って「何を言ってるんだ...」と思ったけどそうじゃなくてよかった。まともな人でよかった
diffの意味分からん表示じゃなくてわかりやすくdiffをとってくれるのですごい便利という話だった

二番目は僕
bindを使って危険シェル芸をするはなしをした


難読化のつもりで始めたけどそうならなかったのでこうなった(?)

三番目は非公開でとのことだったので詳細は話せないけどふとした瞬間にシェル芸を発動できる素敵な話だった
次のLTでは準備万端でお話ししていただけるらしいので超楽しみだ

四番目はsedで寿司を回すお話だった
何が起きているのか分からなかったけどsedマスターの発表者が解説してくれたのでわかった(わからない)
sedってすごいなあ...という気持ちで支配されたLTだった

まとめ

今回もはちゃめちゃでおもしろかった。シェル芸自体は去年の今頃に存在を知り、今年の6月ごろに勉強会に初参加させていただいた新参者なのでまだまだ精進するぞと言う気持ち

また機会があれば参加したいな〜と思っています。よろしくお願いいたします。

お前らのWSLはそれじゃダメだ

OIT Advent Calendar 2017!!!

この記事は、 OIT Advent Calendar 2017の1日目の記事です
adventar.org

わーいあどべんとだー

OIT Advent Calendar が今年もやってきた!
募集を観測してから1秒でアクセスし1秒1日目に予約してやったぜ

因みに去年も1日目だったんですよ~
adventar.org

ていうかもう12月?はやくない?

本題

Bash on Windowsが2016年の4月に来たときめちゃくちゃ嬉しかったことを覚えています

それからしばらく経った2017年の10月末にWindows10のFall Creators Updateがきました。BoWの名称はWindows Subsystem for Linux(WSL)へと変わり、正式版になったことでWindows上でシェル芸をするときの選択肢が増えましたね。非常に嬉しいです

自分はSurface3を持ち運び用にしてますが容量の都合とかでデュアルブートするのしんどいし、なによりWSLは破壊してもすぐなおせるところがいいですよね!最高!

でも

ターミナルエミュレータがイケてない

BoWだった時も思ってたんですけどぉ…Windows環境ってぇ…
ほんッとターミナルがイケてない!

イケてない

  • イケてないお前らのWSL
    omaerawls

僕は違いますよ! - イケてるぼくのWSL
bokunowls
やった~~~~~かっこいい~~~~~WSLしゅき~~~~!

もうひとつ mate-on-wsl
Ubuntu MATE on WSL
同じやり方でmate-sessionだって起動する

DEほどの機能がいらなければawesomeみたいなウインドウマネージャーを起動すればいいね awesome-on-wsl

これで楽しいWSL生活!

環境構築

材料

  • Fall Updateした後のWindows10
    • めっちゃじかんかかった
  • Windows向けX server
    • 今回はVcXsrvを使用。Xmingがいいならそっちでもいいけど解説はないよ
  • WSL
    • ストアから落とそう
  • ggる力
    • 目の前の箱はおもちゃか?

VcXsrvのインストール

sourceforge.net
特にインストールするときにggった覚えがないのでポチポチでインストールできるハズ・・・

WSLの用意

OpenSUSEとかもあるけど今回は普通にUbuntuを使う
Microsoft StoreでUbuntuと検索すればすぐ出てくるからインストールする

終わればスタートの最近追加されたものの項目にUbuntuが出てくるだろうからそれをクリック。みつからないならCortanaにUbuntuどこですかって聞こう
whereisubuntu

クリックしたらインストールの続きが始まるので少し待つ、それが終わるとユーザー名とパスワードを聞かれるので入力。好きなのでいいと思うよ

少し上のお前らのWSLになったら 定番のアップデートをする

sudo apt update && sudo apt upgrade -y

思ったより時間はかからないと思うぜ!

この先は自分の好きなように選んでほしい、DEやWMはいらんから端末だけほしい!とかDEごとほしい!とか自分のニーズに合わせてインストールしよう。全部やると時間かかるよ

日本語化

WSLになってからデフォだとえいごだからJP語にする。したい人はしたらいいぼくはする

sudo apt install language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8

端末だけ使う

インストール

好きな端末を選べばいいと思うけど、ここではgnome-teminalをインストールする

sudo apt install -y gnome-terminal uim-fep uim-anthy dbus-x11

(2017/12/07 誤字ってたので修正)

gnome-terminalと一緒にuimをインストールして日本語入力できるようにする
日本語入力する予定がないならuim系はインストールしなくてもOK
dbus-x11は・・・知らん・・・ないと動かなかった
ここが結構時間かかるので気長に待ちましょう

終わったらuimの設定を書く

cat << EOF > ~/.uim
(define default-im-name 'anthy)
(define-key generic-on-key? '("<Control> "))
(define-key generic-off-key? '("<Control> "))
EOF

これでgnome-terminalを使っているときに、Ctrl+Spaceで日本語入力の切り替えができるようになった
もしここを変えたいとかなら<Control>の部分を書き換えればOK!
一応情報置いときますね
github.com

もしかしたらXMODIFIRESを設定しないとダメかもしれない

export XMODIFIRES=@im=uim

自分の場合はしなくもOKだった。これってxtermとかだといるのかな?

起動テスト

とりあえず起動するか確かめる

  • VcXsrvの起動
    • CortanaにVcXsrvどこですかって聞いて起動する
    • タスクトレイに下図赤丸のアイコンがあればOK!
      • vcxsrv
  • gnome-terminalの設定
    • 下のようなコマンドを入力する
export DISPLAY=:0.0
gnome-terminal -e uim-fep
#上がダメなら
dbus-launch gnome-terminal -e uim-fep
#それでもだめなら
sudo service dbus start && dbus-launch gnome-terminal -e uim-fep

たいていの場合1つ目で起動する・・・dbusを感覚で使っているので細かいことは解らないけどserviceの起動まではしなくていいはず

ちょっと待つと起動すると思う

起動したら

毎回起動時にexportするのはだるいので少しVBとPSスクリプトを書くと楽になると思う

  • wsl-terminal.vbs
Set ws = CreateObject("Wscript.Shell")
ws.run "powershell -NoProfile -ExecutionPolicy Unrestricted .\launch.ps1",0,false
  • launch.ps1
ubuntu.exe -c "gnome-terminal --display=:0.0 -e uim-fep"

ファイル名なんかは適当でいいけど 「同じ場所に置くこと」「vbsの方に書いてあるps1ファイルの名前」 だけは気を付けること
二つ作るのはめんどい!って人はVBの方に纏めちゃってもいいんじゃないかなpowershell -c 'command'みたいな感じに

作ったら vbsの ショートカットを作る
vbsshortcuts

これをWindowsC:\Users\USER\AppData\Roaming\Microsoft\Windows\スタートメニュー\プログラムに置く! これでスタートメニューに登録されるので、ピン止めするなりすれば起動が簡単になるよ

後はショートカットのアイコンをIconfinderなんなりから探してきて
www.iconfinder.com

ショートカットのプロパティのアイコンの変更から好きなアイコンを選べば素敵な環境の出来上がり!やったね
term-icon

ここでショートカットにショートカットキーを割り当てておけばいつものようにCtrl+Alt+Tで起動できてワクワクドキドキ

あとは好みで配色を変えて楽しんでね
github.com

同じやり方で別の端末をインストールすれば、↑のコマンド群のgnome-terminalの部分を置き換えると同じように起動すると思う
因みに自分はTilixが好き
gnunn1.github.io

DEを起動したい

DEってのはDesktop EnvironmentのことつまりUnityとかKDEみたいなデスクトップ環境。どうでもいいけどenvironmentってスペル難しい

先に行っておくとDEはちょっと不安定で、フルパワーで使えなかったりTabBackSpaceを押すとたまに爆発(後述)したりするから注意。とはいえVMじゃない?のにVM感?が味わえて楽しいのでオヌヌメ
当然DE内ならGTKとかのテーマも使えるから
Windowsの見た目、嫌いじゃないけど飽きたよ」
という人にもオヌヌメ

それじゃあ自分の好きなDEを選んでやってみよう。今回はMATEデスクトップをインストールする
ubuntu-mate.org

インストール
sudo apt install mate-desktop-environment-extras ubuntu-mate-core ubuntu-mate-desktop -y

さすがにDEともなるとインストールに時間がかかる。それを見越して軽量なMATEにしたけどうむむという感じ
もしかすると単純にmase-sessionを起動するだけならmate-desktopをインストールするだけでいいの・・・・かなあ?
上のコマンドだけしか試したことがないので是非いろいろ試して教えてほしい

起動テスト
  • VcXsrvの起動
    • CortanaにXLaunchどこですかって聞いて起動する。アイコンがVcXsrvと同じなのでちょいとややこしい
    • 下図3枚のように設定して
    • xlaunch-1
    • xlaunch-2
    • xlaunch-3
    • 完了を押す。ここでコンフィグを保存しておけばこの設定でVcXsrvを起動するショートカットみたいなのが作れるので毎回設定しなくてよくなる。
      • ぼくは保存してるけど毎回設定して起動してる・・・もうだめかもしれない
    • タスクトレイに下図赤丸のアイコンがあればOK!
      • vcxsrv
  • mate-sessionの起動
export DISPLAY=:0.0
mate-session

めっちゃログが流れた後VcXsrvにMATEデスクトップが表示される。エラーも表示される
mate-error

きみはほうこくしてもほうこくしなくてもいいぞ。ぼくはしない

起動したら

terminalだけのときと同じように起動スクリプトを作っておけば楽になる
ほぼおんなじで二度手間だけど

  • mate-on-wsl.vbs
Set ws = CreateObject("Wscript.Shell")
ws.run "powershell -NoProfile -ExecutionPolicy Unrestricted .\launch-mate.ps1",0,false
  • launch-mate.ps1
ubuntu.exe -c "mate-session --display=:0.0"

後の手順はterminalのときと同じ、DEの方はテーマを変えたりするだけ、どこまでできるかわからないけど大抵のことはできると思う

備考
  • 日本語入力
    • 日本語環境に設定しててもMozcが最初からないので自力でMozcを入れるかuim-fepで代用するといいよ。僕は後者
  • ターミナルTabBackSpaceを押すと画面がちらつく
    • どんまいです。ぼくもよくわからないけど何度かVcXsrvごと再起動するとなおる
    • タイミング的に音の鳴るときな気がするからターミナルのベルを切ると発生しないかもしれない。自分はこうしてからあんまり遭遇してない

ウィンドウマネージャーを起動する

WMだけを起動する場合もDEとほぼ同じ・・・というか同じ手順をすればいいよ
これは結構安定しているのかも

ここではawesomeをインストールする

awesome wm

github.com
いわゆるウインドウマネージャーってやつ。Archとか使ってる人がよくこういうのを色々試してる印象

awesome は設定範囲が広い、X の次世代型ウィンドウマネージャです。非常に高速に動作で、拡張性があり、GNU GPLv2 でライセンスされています。 Arch Wiki

らしい。次世代型かぁ・・・!惹かれますね

インストール

もちろんaptでインストールできるんですが、このUbuntuは16.04なのでawesomeのバージョンがちょっとふるい(v3.5.9)
最新はv4.2なのでそっちをインストールしたいなあ・・・
github.com
というかこれが使いたい

ビルドしてもいいんですが面倒なのでaptにまかせたいな~~とlaunchpad探してたら
launchpad.net

ありました
手順は書いてあるので二度手間ですがコピペ用にどうぞ?

sudo add-apt-repository ppa:klaus-vormweg/awesome  &&  sudo apt update  && sudo apt install -y awesome

インストールが終わったらDEのときと同じ設定でVcXsrvを起動してから

export DISPLAY=:0.0
awesome
#もしくは
awesome --display=:0.0

で起動します

GTK Themeを適用したい

これは主にターミナルだけのやつ
ここまで僕のやることを素直に受け入れてきた人はおそらくウインドウのタイトルバーがWindowsのままだったり、Defaultの色が白背景だったりでちょっとイケてない(白背景をDisってるわけじゃない)
じつはVcXsrvみたいなXserverを使った場合でも有志が作ったGTK Themeを適用出来たりできなかったりする
GTK2.0なのかGTK3.0なのか、タイトルバーを上書きしてるのかとかで適用範囲は変わる・・・と思う
この辺の難しいことは解らないので誰か教えてほしいかも

自分の場合は先述のようにTilixを使ってるのでGTK+ 3のテーマなら使える
Tilixはタイトルバーを上書きしてるのでそこもThemeの適用範囲になる。やったね

というわけで目指すのはこれ
gtkthemetilix

好きなテーマを探す

たぶんgnome-lookで探すのがいい。というかここしかしらない
www.gnome-look.orghttps://www.gnome-look.org/browse/cat/135

ぼくはこれ
github.com
別にOSXが好きとかじゃないけど、黒系ならカッコいいし、人気だし、使いたくなるからこれを使ってる。後インストールが楽

テーマをインストールする

基本的にはダウンロードしてきたやつを/usr/share/themes/に置けばOKのはずなんだけど上手くいったためしがないんだ・・・ごめんよ
OSX-Arcのように丁寧にパッケージが用意されてるならそれ展開すればいいでしょう
以下はその手順

mkdir ~/tmp && cd tmp
wget https://github.com/LinxGem33/OSX-Arc-Darker/releases/download/v1.4.5/osx-arc-collection_1.4.5_amd64.deb
sudo dpkg --install ./osx-arc-collection_1.4.5_amd64.deb && rm ./osx-arc-collection_1.4.5_amd64.deb

テーマを適用してアプリケーションを起動する

developer.gnome.orghttps://developer.gnome.org/gtk3/stable/gtk-running.html
ここみたらどうやらGTK+3だとGTK_THEMEに適用したいテーマ名を書くだけで良しなにしてくれるらしきことが書いてあった
なので

GTK_THEME=OSX-Arc-Shadow tilix

とすればテーマが適用されてTilixが起動する
テーマの名前は/usr/share/themes/lsすればわかるよ

GTK2だと~/.gtkrc-2.0を書く必要がある
テーマだけをあてるなら

echo 'gtk-theme-name="BlackMATE"' > ~/.gtkrc-2.0 #BlackMATEのところに好きなテーマの名前を書く

としたあと

mate-terminal

すればOK、たぶんタイトルバーはWindowsのままだと思うけどドロップダウンメニューとかはテーマが適用されてるはず
gtkthemetilix
こんな感じになってるんじゃないかな?

タイトルバーに関しては適用される方がいいのかは正直解らない、Tilixはタイトルバーが上書きされて見た目はハッピーだけど最大化ボタンが死ぬので大きくするときが面倒になる

それと一応.gtkrc-2.0でフォントの設定とかもできるけどその辺はここでは書かない・・・(ggって)

解像度とか

なんか少しぼやけるときは下記を参考にDPI設定をするといいかもしれない
qiita.com
surface3ではぼやけてたからDPI設定したら綺麗になった(というより見た目が小さくなった)

WindowsLinuxを同時に使いたいなら

WindowsLinuxを同じPCで共存させる方法ってのは、マシンスペックに余裕のある人はVM、HDDに余裕のある人ならデュアルブートとかだったけど、そのどちらもないSurface3だとこのWSLはすごくありがたい、ubuntu側からならwindows見えるし

他にもwubiuefiを使って簡単にデュアルブートしたりとか、X2GoつかったりDockerコンテナにSSHしてX11フォワーディングするとかいろいろあるので試したいなあって思ってます
github.com
www.youtube.com
qiita.com

まとめ

正直なところライトな使い方をするならcmdとかpowershellから使うだけでいい。けどtmuxとかマルチバイトでずれたりするしイケてないよねってことでこれをしばらく試していた(Fall Update以降はcmdでもずれなくなった・・・?)

参考になる記事が沢山あったので色々試してたらDEまで起動してちょっとびっくりしたし、いかに自分がLinuxを雰囲気で使ってるのかっていうのも解った。雰囲気じゃなくて完璧に使えるようになるのはむり・・・あきらめたくないけどむり

自分はgnome-terminalが起動した時点で「勝った!」と思ったのでこれ以上のことをあんまり調べていないんですが・・・
win
飛び跳ねながらいろいろ設定してたらだんだん重くなってきてsurfaceではpowerline-daemon起動してても重いという状況なのでちょっと整理したいな~なんて

自分はこういう設定で運用してるよ!とかGoodな情報があればぜひ教えてもらいたいです

それではよいWSLライフを

参考

mjhd.hatenablog.com
www.hiroom2.com
Arch Linux JP Project
qiita.com

僕的SystemVerilogメモ

絶望の証

何も見えない

進捗は出ないけど知見が増えたので SystemVerilogが一ミリもわからない人向け

Queueは論理合成できない

module Test();
    byte q[$]; //<--できない
    
    initial begin
        q.push_back(12); //<--できない
    end
endmodule

SystemVerilogのQueueはQueueというより双方向Queueで、C++の感覚で使えるので便利だと思ってわくわくしてたけど現行のQuartus Prime 17.0でも論理合成できない。

同じくわくわくしてた連想配列も論理合成できない

//KeyがbyteでValueがintの連想配列
int dic[byte]; // <--できない

structとenumは論理合成できる

でもstructとenumは論理合成できる。enumは値に名前を付けれて便利 enumはデータ型を指定できる。以下はbyteを指定した例

typedef enum byte {TINO=0,KOKOA=1,RIZE=2} RABBITHOUSE;

enum のあとを省略すると32bit?(たぶんint)になる。
さらに代入を省略すると0からの連番になる、先頭に値を 指定するとそこからの連番になる

//zero=0から始まる連番が順番に割り当てになる
typedef enum {zero,one,two,three,four} num;

SystemVerilogのenumはスコープがない・・・というか全部グローバルに宣言される感じ
なので使うときは名前をそのまま書けば使える

typedef enum byte {TINO=3,KOKOA,RIZE} RABITHOUSE;

initial begin
    $display("Data : ",KOKOA); //<-- Data : 4って出力される
end

名前が一緒だったら既にあるっておこられる

typedef enum {TINO} TINOCHAN;
typedef enum {TINO,KOKOA,RIZE} RABBITHOUSE; //<--既にTINOが定義されてるので死ぬ

structも使える

typedef struct packed {
    byte x;
    byte y;
} Vector2;

Vector2 pos; //<--宣言するときはこう

byte tmp=pos.x; //<--xを読み出したいときはこう

初期化?もC++みたいにかける。

Vector2 pos={8'h01,8'h02}; //<-- xに1 yに2

pragma once

インクルードするときC言語みたいに多重定義すると死ぬ
これを書いてる間にSystemVerilogにはC++みたいにpragma onceを指定すれば1度だけインクルードされて多重定義を防げる

//test.sv
`pragma once
module test();
    dark zone
endmodule

//second.sv
`include "test.sv"
modeule second();
    second dark zone
endmodule

//top.sv
`include "test.sv"
`include "second.sv"
module top();
    天衣無縫
endmodule

test.svpragma onceがないとsecond.svの解析中に多重定義で死亡する

これを見つけるまではifdef-else define -endifでやってた。バカス

2017年11月15日追記

なんかやっぱりpragma once はダメだったのでこれは無かったことに
僕が見たのは幻覚か

一回だけいんくるするならやっぱりifdefを使う

`ifdef REG_ONCE
`else
`define REG_ONCE

module register();
endmodule

`endif

これでめでたく解決!(長くてめんどい)

automatic

SystemVerilogは急に変数を宣言できない。回路はstaticだから
変数宣言するならModuleの先頭かinitialブロックの中でしかできない。Moduleの先頭で宣言するとstaticな変数になる。アクセスはModule内ならどこからでもできる しかしコードを書いてると急に変数を宣言したくなるでしょ
そういう時はautomaticキーワードを使えば動的な変数が定義できる

module test();
    byte abc;//<--これはstatic test内ならどこからでもアクセスできる
    
    initial begin
        byte k; //<--initialの中ではOKでもスコープはこのブロックの中だけ
    end
    
    function void abc();
        byte abc=0; //<--これはダメ
        automatic byte edf=0; //<--これはOK
        edf=123; //なんか処理かく
        automatic byte cc=0; //<--これはダメ、automaticをつかって宣言しても結局スコープの先頭でしかできない        
    endfunction

    //automaticを使わないといけないのはtaskやalwaysも
endmodule

変数の種類

japan.xilinx.comhttps://japan.xilinx.com/support/answers/51327.html
ここが詳しい

書いててたまに不便だと思うのがbyteとかが符号付きなところ
二進数世界なのに符号付とかいみわかんなくない?でもプログラム書くとき的には普通じゃないってなってて板挟み

符号なしの多bit幅型を使うときはlogic[15:0]とかって書けば16bitの型が書けるけどこれはいちいち面倒なのでよく使うのはtypedefすればいいと思う

//16bit型
typedef logic[15:0] d_byte;
//ちなみにunsignedを付ければ符号なしにできる
typedef byte unsigned ubyte;

typedefはmoduleの外とかでもできるから全体的によく使うやつとかは別ファイルにまとめて使うときにincludeすると便利かもね。

interface

よく使うポートとかをまとめられる神機能。しかも論理合成できる よくわかんないだろうから例

interface clk_rst;
    bit clk;
    bit rst;
endinterface

module top(clk_rst c);
        // ↑こんな風にclkとrstをまとめられる
    
    always @(posedge c.clk) begin //<--アクセスはstructを同じようにやる
    
    end
endmodule

fork-joinブロック

taskをforkできる sites.google.com
ここが詳しい

eventforeverと組み合わせるとalwaysの代わりが作れるけどこのfork-joinブロックは論理合成できない残念!

これが役に立つと個人的に思うのはテストベンチでクロックを無限に出したいとき

module TB();
    bit clk,rst,endofrun;
    Test test(.*);
    
    task clkgen();
        while(!endofrun)begin
            #50 clk<=0;
            #50 clk<=1;
        end
    endtask
    
    initial begin
        fork begin
            clkgen();
        join_none
        
        //~~~なんか処理
    end
endmodule

このテクニックはネットのどこかで見たから使ってる。どこだったか忘れたので出典はかけない・・・ごめんなさい

まだ何個かある気がするけど思い出すも書くのも疲れたのでここまで
気が向いたらまた書くかもしれないし、マサカリもお願いしたい

cdx アップデート 2.1

cdxアップデート2.1

ついこないだ2.0を出したんですけど思うところあって2.1つくりました

github.com

Python3での書き直し

殆どのスクリプトをPython3で書き直し、分割しました
これにより動作にPython3が必要になりました
必要なパッケージはビルトインだけです

Fish shellに対応

bashだけでなくfish shellに対応しました

config.fishに以下を書き込めば使えるはずです

. /path/to/cdx/sh/func.fish
CDX_DEFAULT_OPTS=すきなオプション(空可)
CDX_DIR="/path/to/cdx"
CDX_FUZZY_COMMAND=いつもつかってるインタラクティブフィルター

変数の追加

CDX_DIR # cdxのディレクトリ

cdxに必要な環境変数

の三つです

–fuzzyの削除

–fuzzyオプションを削除しました
インタラクティブフィルターを使わない利用は無いと感じたからです

ディレクトリファジー検索文字を変更

(良い日本語が思いつかない)
これまでは

cdx ../**
cdx ~/**

とするとパスを展開してディレクトリのリストをインタラクティブフィルターに渡していましたがこれを

cdx ../--
cdx ~/--

に変更しました
理由は~/**だとカレントのファイルがリストアップされて引数に時に面倒だったからです

helpの書き換え

–fuzzyの削除があったためhelpを書き換えました

雑記

fishの文法がかなりつらくいままでのbashシェルスクリプトではうんともすんとも言いませんでした

例えばカレントにあるディレクトリにfzfを使って移動するとき
bashでは以下のように書けば動作しますが

pushd $(ls -l|grep '^d'|awk '{print $NF}'|fzf)

fishでは同じようにプロセス置換を使って書いても動作しません

pushd (ls -l|grep '^d'|awk '{print $NF}'|fzf)

()の中でfzfのようなツールを起動しても利用することができませんでした

解決策としては

ls -l|grep '^d'|awk '{print $NF}'|fzf|read dist;
pushd $dist

としました(bashではこれは使えませんでした)

本当はスクリプトからコマンドを吐いてプロセス置換とかで実装しようと思っていたのですが、細かな文法の違いや上記のことからめちゃくちゃしんどかったです

お布団

ぬくぬく

バイノーラル録音さいこう

昨日の夜お布団に入りながらある音声作品を聞いていました
お布団が擬人化していろいろする〜といった内容で、キャストも好きな方だったので楽しんで聞けました
僕は右耳が 敏感 なので添い寝パートとかはすごく良かったですね

いつも使っているお布団

一通り聞き終わって感想を一人で思っていたとき、ふと自分の使っているお布団のことも考えました
ぼくがいつも使っているこのお布団はもう20年ほど、つまり物心がつく以前から使い続けています
夏の暑い日も、冬の寒い日も春、秋の花粉症の時期も必ず肌に触れる部分はこのお布団でした

おかげで中の綿はボロボロだし、真っ白だった外側のカバーもなんか色ついてきたし、匂いもとても他人にかがせられるような匂いではないです(僕この全部に安心します)
よく「枕が変わると眠れない」とかいいますが僕の場合は「布団が変わると眠れない」です
大学に進学するとき家を出なければだったのですがその時も持って行ったほどです
だからいつまでも使えるように干したり、綿を詰め替えたりの手入れをきちんとやっていつまでも使えるようにって思っています

何が言いたいか

人間誰しも自分が安心できるサンクチュアリを持っているはずです
ぼくの場合はこのお布団にくるまれている時なわけですが、そのサンクチュアリが擬人化してお話出来たら
買い物いけたら、添い寝できたらどんだけ最高だよと

20年も使われたお布団は一体どんな見た目でどんなしゃべり方をするんだろーなーとか思いながら昨日は寝ました

それだけです

cdコマンドのwrapperを自分のためだけに作った

といってもだいぶ前からあるんだけどね

既存のコマンドをシェルスクリプトで魔改装するの最高

cdのwrapperと言えばenhancdとかfishzがありますね github.com
github.com

実は僕もcdxという同じようなコマンドを作っていて、それは2016年の年末にここでも紹介しました
xztaityozx.hatenablog.com

そもそもcdxは快適にcdしたいと思い、ggる前にシェルスクリプトを書き始めたのが最初でした。このときにちゃんとggってればenhancdに出会えたでしょう
そしてなぜenhancdの存在を知ってもなお自前のものを使っていたのか、それは単なる愛着にすぎません

2016年の段階ではenhancdzcdxが勝る点が無かったんですが、「自分のつくったものだし・・・」と思ってメンテをしてきました
そしてenhancdなどにインスパイアされたりして、いくつか機能を付け、自分なりに使いやすくしたので公開しようと思います(それでもenhancdを上回ることはできないでしょう たぶん)

cdx

logo

(ぼくはこういうデザインが好きです)

github.com

README.mdにもつらい英語と日本語でいろいろ書いていますがここでも

デモ

demo

cdxの主な機能は以下です

  • 移動履歴からcdできる
  • ブックマークからcdできる
  • enhancdのようにfzfpecoを使ってファジーサーチできる
  • ~/.ssh/configを読んでsshログインできる
  • 移動先ディレクトリが無いときは作ってから移動できる

などです。全部あんなこといいなできたらいいなで実装したものです

動作環境

bashシェルスクリプトなのでbashを使っている人向けです
普通のシェルスクリプトならそうではないのですがcdxsourceコマンドでcdを反映するのでzshfishでは使えないと思います・・・
改良したいですね

あとはpecoとか`fzfみたいなインタラクティブフィルターがあるともっといいと思います。

github.com
github.com

インストール

git clone https://github.com/xztaityozx/cdx
cd cdx
./install.sh

使い方

cdx [OPTION] PATH

使い方はcdとほぼ同じです。cdよりはオプションの数が多いです

オプション

cdxではいくつかオプションを用意しています。これによって機能のオンオフができます

Option Action
–help ヘルプを表示します
–fuzzy パスの補完や履歴、ブックマークの取得にfzfpecoのようなファジー検索ツールを使用します。使用するツールはCDX_FUZZY_COMMAND変数へ書き込む必要があります
–cd cdxではデフォルトでpushdコマンドを使うようにしていますがこれをcdに置き換えます
–ls cdした後に自動的にlsコマンドを実行します
-h 履歴からcdします。これには–fuzzyオプションが必要です
-b ブックマークからcdします。これには–fuzzyオプションが必要です
+b カレントディレクトリをブックマークに追加します
-p cdpushdの代わりにpopdを実行します
–automake 移動先が見つからなかったとき自動的にディレクトリを作りcdします
–make 移動先が見つからなかったときにディレクトリを作ってもいいか尋ねます
ssh cdxsshを許可します。これをオンにして~/.ssh/configにあるホスト名を与えるとsshログインを試みます。もし同じ名前のディレクトリがある場合はcdが優先されます

これらのオプションを毎回つけるのは面倒だと思ったのでCDX_DEFAULT_OPTS変数に書いてあるオプションをcdxが自動的にオプションに加えるようにしました(fzfの真似をしました)

例) --ssh --fuzzy --makeを毎回オンにしてfzfを使いたい場合~/.bashrc

CDX_DEFAULT_OPTS="--ssh --fuzzy --make"
CDX_FUZZY_COMMAND="fzf"

と書けばいいです

-hと-bオプション

この二つのオプションはそれぞれ履歴とブックマークからのcdをするコマンドですが、インストールを手順通りにやっていればタブでの補完でもファジーサーチが起動するようになっています
タブ補完ではもう一つ。パスの最後が/**となっているときもタブで。それまでのパス以下をリストアップしファジーサーチが起動します

cdx -h <TAB> #履歴オープン
cdx -b <TAB> #ブックマークオープン
cdx /home/hoge/huga/** <TAB> #~/hoge/huga以下に対してしてファジーサーチが起動

sshオプション

sshオプションを有効にしたときはcdxsshログインができるようになります
例えば~/.ssh/config

Host abc
    HostName xxx.xxx.xxx.xxx
    User user
    Port xx

だとすると

cdx --ssh abc

とすると~/.ssh/configの情報を使ってsshログインを試みます。もし同じ名前のディレクトリがある場合は 移動の方を優先 します。

このオプションの実装はシェルスクリプト内で~/.ssh/config内に登録されたHost名かどうかを確かめた後

ssh [HostName]

を実行しているのです。~/.ssh/configの設定をよくする人は使い勝手は同じに感じることができると思います

実はこのオプションの導入をするかどうかは考えました
ディレクトリを移動するcdxコマンド」を考えたときsshログインまでカバーするのはやりすぎだと思いました。
しかし「移動を簡単にするcdxコマンド」として考えたときsshログインもまた移動なのかなと思いました

とか何とか言ってますが一つにまとめられて個人的には満足しています

終わりに

enhancdはすごいです。next generation を謳っているだけはあります。cdxenhancdほど複雑な実装をしていません。コマンドの本体もcdx.shだけで完結しています。
cdxではcdした後にどこに移動したかが目でよくわかるような表示をしています。これは結構見やすくカッコいいと思っています。ただしターミナルの配色によっては見えづらいかもしれません・・・(cdx_echo.shをいじってください)

カッコいい見た目とかブックマークとかsshしたいという人はぜひ使ってもらえたらと思います

BashとかからLINQ使いたくてShelLINQってコマンド作った

BashとかからLINQ使いたくてShelLINQってコマンド作った

ウヒャァ使いやすい

LINQすき

コマンドラインでの作業をしているとき、シェルスクリプトを書いているときに突然LINQが使いたくなる人に向けて作ったコマンドです
docs.microsoft.com

似たような機能を持つ既存のものとしてはawkdatamashがあります
https://ja.wikipedia.org/wiki/AWKja.wikipedia.org
https://www.gnu.org/software/datamash/www.gnu.org

正直awkで十分にできますがぼくはLINQのが使いたかったのです

ShelLINQ

logo

github.com

インストールのしかた

git cloneしてやるだけです

git clone https://github.com/xztaityozx/shellinq
./shellinq/install.sh

aliasを貼ったり補完スクリプトbashrcに書き込むスクリプトを同梱してるので実行すれば使えるようになります

つかいかた

GitHubのREADME.mdと同じことを書くのでそっち見てもらってもいいです

shellinq [TYPEs] [method query] ... [-o [FORMAT]]

[TYPEs]は入力データの型です。int型の場合は[int]と指定します。指定しない場合はint,double,stringのどれかからShelLINQが予想します。
ls -lコマンドのように複数のカラムがある場合は[type1,type2,...,typeN]というように順番に指定します。これも指定しない場合はShelLINQがすべて予想します。

[method query]はクエリ部分です。methodにはSelectWhereのようにLINQが提供するメソッド名を指定します。Qにはメソッドに与える引数部分を指定します。
例えば

Where (x => x% 2 == 0)

where 'x => x% 2 == 0'

と書きます。
queryではawkのようにカラムの指定に$が使えます。
例えばwhere '$1%2==0'と書けばShelLINQはwhere '_=>_%2==0'と解釈します。
$0を使うとすべてのカラムが指定できます。

[-o [FORMAT]]は出力フォーマットをC#のコードで指定するときに使います。 具体的には処理されたデータを使ったforeachループのブロック部を指定します。
取り出されたアイテムは変数itemに格納されているのでそれを使用するといいでしょう。

Input

% seq 30|shellinq select '$1%2==0' -o 'Console.WriteLine(item?"even":"odd");'

output

odd
even
odd
even
.
.
.

デモ

3の倍数を抽出

seq 30 | shellinq where '$1%3==0'

demo1

3の倍数を抽出して30加算

seq 30 | shellinq where '$1%3==0' select '$1+30'

demo2

ls -lの出力を複数カラム纏めて出力

ls -l | sed '1d' | shellinq select 'new Tuple<string,int>($1,$5)'

demo3

これから

複数カラムを選択する場合が今のところかなり面倒なので何とかしたいと思っています

ls -l | sed '1d' | shellinq select '$1,$5'

ぐらいで書けると楽にできそうです

あとは入力をファイル指定出来るようにもしたいですね

雑記

ここからは雑記です
もともと雑記ですけど・・・

実装

ShelLINQは受け取ったクエリと標準入力を元に C#のソースコードを吐き出してmcsでビルド しています
なので処理の実態部分はC#です
それゆえにawk比べると速度はあまり出ません

ソースコードの生成には主に置換を使っています
例えば$1は内部クラスのメンバ変数Item1に置換されます
クエリ内に$1が表れるとItem1に置換されメソッドチェーンに連結されます
なので複雑なコードには対処できないと思います・・・(スイマセン)

C#であるためデータのに注意する必要があります
デモ3のようにstringintと書いてやらないとエラーで死にます
この辺は今後の改良で対処したいと思っています

出力について

上記まででわかる通り置換によってソースコードを作っているため期待通りの出力が得られないことがあると思います

例えばGroupByメソッドを使う場合です
img1

期待しているのと違う出力のほうが出がちです
Selectなどでうまく書いてやる必要がありますがここはLINQの知識が必要なので頑張らないとダメです
この辺の解決のために-oオプションを付けていますがstring.Joinなどで結合するようにすることを予定しています

まとめ

正直LINQが書けて超楽しいです
やることはawkで済む場合のことが多いですけど
良かったらみんなさんも使ってみてください

それではいいShelLINQライフを!