読者です 読者をやめる 読者になる 読者になる

たいちょーの雑記

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

CPUが出来た

習慣化しないとマズい

CPU_final1
↓↑
CPU_final2

三日に一度ぐらいとは

ご利用は計画的に

ソフトウェア開発の現場でデスマーチになるなんて言うのはよーく聞く話で
www.itmedia.co.jp

それについての講義もあるわけですが
どういうスカポンタンがやったら納期遅れになるのっておもってましたよ

あるいは

Twitterで締め切りに追われるクリエイターさん達が死を呟いているのを見て
どういうスケジュールならこうなるのっておもってましたよ

なるね

なんていうかデスマーチになりかけたよ

どういう道のりを歩んだか

僕のチームは僕含めて4人でした。
命令セットが公開されてはいスタートって言われたのが10月の半ばでした。
その日に決まったことといえば
 「パターソン&ヘネシーの本で題材になっていたMIPSアーキテクチャに命令セットが似ているから、それ真似よう」
ということだけでした。

滑り出しが悪かったからかしばらくメンバー間であまり情報交換などがありませんでした。
必須仕様などの理解も全員が出来ていなかったし、そもそもMIPSのRTLがなぜああなっているのかについて解っていない感もありました。

やべえ と思ったので僕が主導してRTL設計を進めていました。しかし今思えばここの時点で僕が結構しくじっていました。
というのも

  • なぜ僕がこういう設計をしたのかメンバーに理解させきれてない。
  • 僕がメンバーに解ったかどうかについて聞いてない。

などですかね。まぁほかにもあるかもしれませんが・・・・

これがどういうことになるかというと

最初があんまりわからない→次もちょっとわからない→わからない→わからない→・・・・→無
オートマトンの状態遷移図で書くとこうです
CPU_final3

解らない状態でVerilogに手を出しても1ミリも設計はすすみません。
実際、わかっている僕(設計に自信なし)がほとんどのモジュールを書きました。

他のメンバーには書いてあるモジュールについてテストをしてもらうように頼んでいました。
しかし自分がやった方がはやいということになりがちでした。

他人の時間を拘束することの難しさ

そいつにはそいつの集中力とかやる気が満ち溢れる時間が違うし、バイトとかもあるだろうし
自分のやってほしいことをその人にやらせる強制力というか支配力?なんて言ったいいのか

結果はすぐ帰ってこないしデバッグは自分でもできるし、そっちの方が速い→自分でやる
まぁそうするとメンバーは余計わからなくなるわけですが。

指定問題を解くために

指定問題が3問ありました。
簡単に言うと

  • 20000=n(n+1)/2を求める問題
  • 最小値探す奴
  • 選択ソート

これらを解く必要がありました。この内、最小値と選択ソートは同一の問題であるとして特化した設計にしました。
どうするかというと 問題を解くための命令を追加してしまう です。

幸い命令セットに予約されていたのは14個で、オペコードは4bitだったので2つ空きがありました。やったぜ

なので、総和とnを求める命令とSTするたびに二つ目のデータメモリにも格納していって選択ソートする命令を追加しました。
これによって圧倒的速さで問題を解けました。

Quartusは敵か味方か

RTL図をもとにゴリゴリつないでいってIverilogのシミュレーションを一通り終わらせたところで、Quartusでボードに焼くためにAnalysisさせました
https://www.altera.co.jp/products/design-software/fpga-design/quartus-prime/what-s-new.htmlwww.altera.co.jp

CPU_final4

ボードで動かせるような構成になっていれば
CPU_final5
という表示が出ますが最初から出るわけもなくここが一番しんどかったです。

なによりボードによるループ回数の制限が苦しかったです。

for (i = 0; i<index-1; i++) begin 
    min=subDM[i];k=i;
    for (j = i + 1; j<index; j++) begin
        if (!Order) begin //昇順
            if (subDM[j]<min) begin 
                min=subDM[j];k=j; 
            end  
        end else begin //降順
            if (subDM[j]>min) begin
                min=subDM[j];k=j; 
            end 
        end 
    end
    subDM[i]<=subDM[k];
    subDM[k]<=subDM[i];
end

まぁこれはよく見る選択ソートの簡単なコードです。言語はVerilogですがCとよく似ているので読めるかと思います。
一見ダメそうなところのない普通のコードですがQuartusはこれにNOを突き付けました。

だめなところ
- ++(インクリメント) - forの条件式に変数index - 配列の参照外になりそうもない配列へのアクセス

それぞれのダメなところは以下のように書き換えねばなりません。

i=i+1
for(i=0;i<32;i=i+1)
if(j<SUBDMMAXSIZE) begin min=subDM[j];k=j; end

特に二つ目のforの条件のところはかなり厳しいです。

今回はボードの制限なのかforwhileでループできる上限は250回まででした。
indexは配列の長さで決まるので何ループするのか わからない これがダメなようです。
初期値が何で``いくつずつ足されて``いつ終わるのかいつも確実でないといけないわけです。

これがきっつい、ループ回数が明確でないといけないので定数を入れるしかありません。
しかしループはあるところで終わってほしい・・・
そこで僕が取った行動は

begin : LOOP
    for(i=0;i<32;i=i+1) begin
        if(i==index)begin
            disable LOOP
        end
    end
end

ifforbreakする意味の解らない方法です。
これのおかげでエラーは消えましたが別の問題が・・・・

ifが増えすぎた

ifが増えるとどうなるかっていうと、回路が複雑で大きくなります。当然です。

result=Rd_data+disp4;

CPU_final6

if(add)begin
    result=Rd_data+disp4;
end else begin
    result=Rd_data-disp4;
end

CPU_final7

まあこういうことです。

3つ目の対策と合わせるとif文がINF個になってしまいました。
指定されたQuartusのバージョンが9.1(32bit)ということもあって、Analysisが全く終わりませんでした。なくなくリジェクト

データメモリの初期化がうまくいかない

FPGAボードに割り当てた回路のリセットボタンを押したときに、データメモリの中の初期値を設定してくれるものがあります。
初期値はMIF(Memory Initialize File)という形式で記述されて、ビルド時にそれが読み込まれます。
しかし、これがうまくいかない。

具体的には データメモリの1番地だけがボードごとに値が変わる のである。

いみわかんないw

指定問題の中にはデータメモリの中から最小値を見つけるようにというものがあったんですが
この1番地が勝手に変わる問題のせいで 最小値がボードごとに変わる。

他ゼミにも聞いたところ同じような現象が起こっており、Quartusのバージョンを15にすると直ったという。

はいもうね現行バージョン16なのに9.1使えって何事よって思ってたんですけど。
こういうこと起こるんですよ。課題渡す前に自分たちで一度やってほしいですね。まぁ無茶でしょうけど・・・

ボード手前まで来てQuartusにいじめられる世界。
焼いてもいじめられる世界。
FPGAは難しい・・・

結果は

追加命令のおかげで問1である総和の問題は超高速で解けました。
他が1200クロックぐらいかかって居るところを13クロックで終了させました。

問2に関してもデータメモリの初期化不良を除けば解けていました。
これも250クロック以上かかっているところを109クロックで終わらせました。

しかし教授陣には難色を示されました。いままで命令を追加されるなんて言うことが無かったみたいで、扱いに困っていましたね。
まぁプロジェクト概要にも追加しちゃダメって書いてなかったので僕の勝ちです。

普通に勝負していたら他ゼミにたぶん負けていた気がします。みるのはクロック数だけらしいので・・・

今回のプロジェクトは本当に力になった気がします。それはVerilogFPGAの知識だけでなくメンバーとどう連携を取っていくかなども含めてです。
来年はこれをもとに卒論…頑張りたいですね。

今年中にできてないことを集めて

BGMは"日本中の不思議を集めて"で

どうもメリー大晦日
とうとう今年も終わるんですねーーー

やれそうでウッフン やれなさそでウッフン

さて隊長たくさんやりたいことがあります。例えば

  • Xamarin
  • ゼノンを210lvに
  • バイトを始める
  • ゲームを完成させる
  • 超能力を獲得する

まぁまぁこんなもんでしょうか、まだあるんですが

やりたいこと と言っているあたり やれていない ということが普通の読解力のある人ならわかるでしょう。

やりたいと思ったのにはそれなりに理由があるとおもいます。
やれてないということはその理由を 忘れている ということだと思うので書き出して来年には忘れずに挑戦できるようにしたいです。

Xamarin

www.xamarin.com
なんでこれをやりたいと思ったのかっていうのは夏に参加したインターンでの出来事からです。
5日間でデザイン通りのAndroidアプリを作成するモノでした。
これの参加が決まっとき「Unityでええやろw」と馬鹿にしていました。

しかし初日に刈り取られました。なめてた

ざっとどんなものかっていうとアニメーションするカレンダーだったんですがこれがなかなか複雑なアニメーションをしていました。

Unityはわりとその辺の処理が得意であったのでなんとか見てくれを完成させたとき気づいたんです。

カレンダーも手作りじゃね・・・?

Unityにはカレンダーをぽいっと生成するようなものはありません(AssetStoreさがせばあるか?)
つまりデザイン通りのカレンダーをオブジェクトを並べて作らなければなりません。
祝日は文字を赤くしないとダメですし、うるう年なんかの計算と処理も自力です。

ばーかw

それと見えてないオブジェクトの処理をしないようにしても、完成した見てくれを10年分並べただけで Unityがこわれた(固まった)のでアプローチもダメみたいですね
なので毎回の進捗報告会でなんとか笑いを取るしかありませんでした。とれてたか問題もありますが・・・

なので最後の発表会でXamarinでの開発を志しました。
しかしいまはVerilogHDLに追われています。

ゼノンを210lvに

Vアップデートで五次転職が実装されました。

maplestory.nexon.net

強そうなスキルとかがいっぱい追加されるのでコアが増える206lvとリンクスキルレベルが3になる210lvまで頑張ろうと思いました。

まぁいまは201lvなわけですが。
なんでれれりんぐできてないのかっていうと、リゼロイベントとメガバーニングイベントでゼノン以外をプレイしてる時間が長かったからですねーーーーーーー

リゼロのときに作った火毒魔がゼノンより火力出てるんじゃないかってことで一瞬ハマってましたが、スタンスが無さ過ぎてゼノンに戻ってきました。
メガスマッシャーもかっこいいのでこれから目標を212lvにあげてがんばりたいです。

バイトを始める

むり

ゲームを完成させる

前回の記事でかいた Azuh.exe ですが完成してないです。完成させたいです。

xztaityozx.hatenablog.com

超能力を獲得する

いつも思っていました。出かけるときに一瞬で目的地に着いたり、空を飛んでいけたらと。 kotoshi1

いつも思っていました。うるさいことを言うやつを一撃で黙らせるパワーがあればと。
kotoshi2

いつも思っていました。ニュースなどで報道される紛争地域に介入して一人で無双して解決したいと。
kotoshi3

いつも思っていました。こういった力を得るにはどうしたらいいのかと。
kotoshi4

これはえらく長いこと思っていることで、いろいろ調べていますが 超能力 と呼ばれるものを持つ人はマンガやアニメにしか出てこず、現実にそういう を持った人はいませんでした。
なら最初の人になる
まだ手に入れることができていませんが、ぼくの挑戦は終わりません

まとめ

なんだよこの記事

来年はもっとましなこと書けるようにしたい

Azuh.exeってゲームを作った

結構長いことやってた

去る11月に所属している部活でコンテストが開かれました。みんなそれぞれ作品を作って発表していました。
もちろん僕もそれにだいたい参加しています。

その時ぼくが発表したゲームをそろそろ公開したと思います。
別に温めてたとかじゃなくて単に忘れてただけなんですが・・・

ゲームの名は。

azuhexe1
Azuh.exe Unlimited World
です

CAPC〇Mの〇ックマンエグゼのオマージュです。
Unityで作ってます。

Azuh.exeってなんだよ

Azuhは厨二病が治っておらず日々妄想を膨らましていた時にできたネットナビです。
azuhexe3
名前に特に意味はなく、パスワード生成器で4文字出力したら出てきたのでそれにしました。

以前の記事でも出てきたかと思いますね。

xztaityozx.hatenablog.com

Unlimited Worldってなんだよ

このゲームは開発中にいろいろあってストーリーのあるゲームとしませんでした。
流行りのオープンワールドゲームなのでUnlimitedということですね。

DLはここから

1drv.ms
zipアーカイブです。
解凍したらReadmeみたいなのが二つとゲーム本体とぼくが暇なときにしこしこ書いていたAzuhのストーリーが入っています。
起動するときは画面サイズを16:9にするといい感じになります。

ゲームはこんなかんじだよ

azuhexe2

こういう感じで導入が始まります。

azuhexe3

十字キーを使って8方向に移動できます。
オープンワールドを謳っているので狭い世界から飛び出しましょう。

azuhexe4

はい

azuhexe5

メニュー画面も用意しましたぜ。
といってもほとんどの機能がなくて出来るのはチップフォルダの編集だけです。

azuhexe6
azuhexe7

この辺のアニメーションは結構頑張ってるので見てやってほしい

戦闘もできます。

azuhexe8

部内コンでは言い忘れてましたが、プログラムアドバンスも使えます。

azuhexe9

個性豊かなウイルスたちがいます(全4体10種)

azuhexe10

ホントに目的がなく、無限空間を歩くだけですがたまーにこんなのがあったりするので探してみてね

azuhexe11

挙動が変

反省してます。
アニメーションの管理が思ったより難しいですね~~・・・
その辺とかのバグ修正もしたかったんですけど色々忙しくて、自分の中から消え去らないうちに公開だけしとこうと思って

また時間が取れたらなんとか完成させたいです。Azuhに対する愛着もあるので

それでは良い 無限空間 を!

世界一わかりやすい絶対パス

世界一は盛り過ぎた

みなさんcdx使ってますか。ぼくは使ってます。

xztaityozx.hatenablog.com

パスって見づらい

Linux上で作業をしていてたまに思うことがありません?僕は思います。
例えば
no1path1
こういうの

これってまだ見やすい方ですけど、長くなってくると意味わかんなくなるよね
それに同じ色だからどこが/なのか分かりにくいし正直長いパスでも後ろいくつかでわかるし
no1path2

お得意のシェルスクリプト

こういうのってcdxのときみたくggったら出てきそうなんですけど・・・
自分で作ればシェル芸人パワー上がるしいいよね

まずはパスの一番最後の要素 つまり

/home/taityo/testdir/dir
                     ↑これとか
/home/taityo/testdir/item.txt
                     ↑これ

これに対して色を付けてやります。
こいつは目的の場所、もしくは目的のファイルであるので目立つ方がいいですね。

#!/bin/bash

path=$1

bpath=${path##*/} #最後尾
fpath=${path%/*}  #その前

out_path=""

bpath="\e[1;33m$bpath\e[0;39m"

out_path="$fpath/$bpath"
echo -e  $out_path

\e[1;33m$fpath\e[0;39mは端末の出力に色を付けるものです。この場合だと黄色の太文字になりますね。echo 色付けとかでggるとでてきまする。
本当はsedとかawkとか使って一撃でやりたかったんですけど・・・
出力はこんなかんじ
no1path3
いいねいいね。

次は最後の要素から上二つまでのディレクトリに別の色をつけます。まぁ同じようにやってもいいんですが ダセー ので配列に展開してしまいましょう

#!/bin/bash

path=$1
arr=(`echo $path|tr -s '/' '  '`) #配列に展開
path_range=${#arr[@]}#要素をカウント

out_path=""

bpath="\e[1;33m${arr[`echo $path_range - 1 | bc`]}\e[0;39m"#最後の要素
bbpath="\e[1;36m${arr[`echo $path_range - 3|bc`]}\e[0;39m/\e[1;36m${arr[`echo $path_range - 2|bc`]}\e[0;39m"
echo -e $bbpath/$bpath

こっちのがいいですね~
ちょっとインデックス計算のところが変なことになってますが・・・
bcコマンドは文字列を計算式として計算してくれる(日本語が下手)コマンドです
exprより使い勝手がいいのでよく使います。

出力は
no1path4

今度は/home/から下3つまでの要素を省略しましょう。
パスが長くなるとターミナルを占領してしまって目がおかしくなるのでね
no1path5

省略する場合パスの要素が6個以上必要ですね~。

#!/bin/bash

path=$1
arr=(`echo $path|tr -s '/' '  '`)
path_range=${#arr[@]}

if [ $path_range -le 2 ]; then #パスが短かった時
    echo -e "/${arr[0]}/\e[1;33m${arr[1]}\e[0;39m"
    exit;
fi

out_path=""

bpath="\e[1;33m${arr[`echo $path_range - 1 | bc`]}\e[0;39m"
bbpath="\e[1;36m${arr[`echo $path_range - 3|bc`]}\e[0;39m/\e[1;36m${arr[`echo $path_range - 2|bc`]}\e[0;39m"
if [ $path_range -ge 6 ]; then
        bbpath="home\e[0;39m/.../$bbpath"
else
        path_range=`echo $path_range - 4|bc`
        while [ $path_range -ge 0 ]; do
                bbpath="${arr[$path_range]}/$bbpath"
                path_range=`echo $path_range - 1|bc`
        done
fi
echo -e /$bbpath/$bpath

こんなかんじになるよ
no1path6
例が悪いから良くなった感があんまないな・・・

で?

これどこでつかうんだ?

一応これを~/.bashrcとかに書いておけばパスを呼び出すときとかに通してやれば綺麗になりますよ!
no1path7

快適な パスライフ を!

CPUの設計をしてて思うこと

進捗がやばい

OIT Advent Calendar 2016は無事全部全部埋まったようですね!

www.adventar.org

最初は僕と主催者だけだったので冷ついてましたがよかったです。

さて
CPU設計プロジェクトの進捗がやばいです。
どうヤバいかっていうと初期設計の段階で欠陥が見つかりました(最近)

納期は1月の半ばということでまだ一か月あるんですが・・・

地獄を見そう

諸先輩方が口をそろえて「地獄を見た」と言っていたのですが、隊長これを大げさだと思っていました。
しかし最近大げさでなさそうなのがチラリズムしてまいりました。

この間中間報告会があったのですが、そこで「中旬にはシミュレーションしておきたい」と言ったものの全くできておりません。

HAHAHA

とはいえ

内部の配線名とか決めた設計図は完成しているし、モジュールも実はほとんど書き終わってて
ステージを記述すれば全体が組みあがりそうなんです(テストが終わってるとは言わない)

ボードで動くところまでなんとか行きたいですね。がんばります。

じゃあはやくやれよ

課題とか就活関係イベとかであまり時間がないのが苦しいです。
いや、ポケモンする時間を削ればいいんですがね(くいしんぼうカビゴンはやく出来て)

これを書いている時間もモジュールを書けばいいんですが、やる気が出ないのはなんでなんでしょうね・・・!

最強のcdコマンドを目指して

cdで無限の可能性を

集え!OITer!!! OIT Advent Calender 2016!!!!

この記事は、 OIT Advent Calendar 2016の5日目の記事です。

5日目の今日も隊長がお送りします。


皆さんcdコマンド使ってますか。
cmdにもシェルにもふつーにありますよね。
lsとかとならんでめちゃ使うコマンドの一つだと思います。

よく使うのでcdは快適であってほしいです。
lsコマンドはオプションが沢山あり、よく使うls -aとかls -lなんかはエイリアス登録して使ってる人も多いんじゃないですか?
しかしcdmanを見ると・・・

http://ss64.com/bash/cd.htmlss64.com

オプションが二つしかありません。(そのうち一つはデフォルトでON)

これってこれ以上快適にできないってことじゃん!!!!

そうです。

ぼくのかんがえたさいきょうのcdこまんど その名は cdx

  • 履歴がある
  • 表示がカッコいい
  • ブックマークがある
  • ディレクトリが無かったら作るか訊く
  • ひとつ前にいたディレクトリにすぐもどれる
  • 探し物してるときに自動でlsしてくれる

_人人人人人人人人人人人人_
> そんなんありません! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

(たぶん)

なら自分でつくろうか

cdコマンドだけでも全く問題はないんですが
僕みたいに車輪の再発明をした後、その車輪にスパイクとか発光するやつとかをつけちゃうような奴はこういうことが大好きです。
まぁcdxみたいなのはないと思うので車輪の再発明にあたるかは微妙ですが・・・


(2016/12/05 13:55 追記)cdxみたいなのありました・・・!こっちのがすごそうです! qiita.com (追記終わり)


車輪の再発明(しゃりんのさいはつめい、英: reinventing the wheel)は、車輪を題材にした慣用句であり、世界中で使われている。「広く受け入れられ確立されている技術や解決法を知らずに(または意図的に無視して)、同様のものを再び一から作ること」を意味する。 -車輪の再発明 Wikipedia

使う言語はbashです。

履歴機能

まずは cdx に履歴を付けます。
履歴はいつでも参照できて、番号指定でそこへ移動できるようにします。
パスをどこかファイルへechoしておいてそれを読み出すようにします。

if [ $cdx_option == "-h" ]; then
    line=$2
    if [ "$line" == "" ]; then
            line=`cat ~/.cdx_history|wc -l`
            lineStart=`echo $line - 10|bc`
        if [ $lineStart -lt 1 ]; then
            lineStart=1
        fi
        cat -n ~/.cdx_history|sed -n "$lineStart,${line}p"
        cd_flag=0
    elif [ $line == "clear" ]; then
        echo "" > ~/.cdx_history
    else
        change_to=`cat ~/.cdx_history | sed -n "$line,${line}p"`
    fi
fi
###中略###
#cdするまえに
echo `pwd` >> ~/.cdx_history

実はC#Jsonを使って書いたんですけど思いのほか長くなってしまった・・・のでやめました・・・。
これで~/.cdx_historyにどんどん履歴がたまっていきます。

cdx.sh -h 1

とすると履歴ファイルの1行目へ移動します。

cdx.sh -h

とだけ打ち込むと最新の履歴10件を表示して終了します。
無限に履歴をため込むのでときどきcdx -h clearとしてやるといいですね。
cdx5
(エンコードの調子が悪い)

表示をかっこよくする

ぼくはまだ中二病を卒業できてないところがあるので表示がカッコいいとテンションが上がります。
なのでcdした後に単に移動先のディレクトリをpwdするだけじゃなくて色々表示しちゃいます。

if [ $cd_flag = 1 ]; then
    bef_dir=`pwd`
    cd $change_to > /dev/null
    if [ $? = 1 ]; then
        echo -e -n "${change_to}\nが見つかりませんでした。\n作ろうか?(y/n):"
        read ans
        if [ $ans == 'y' ]; then
            mkdir $change_to
            cd $change_to > /dev/null
        fi
    else
        echo -e "  ${clr_Black}--> ${clr_main}cdx ${clr_Black}: ${clr_green}$bef_dir${clr_Black} ->>>${clr_green} `pwd`${clr_reset} "
    fi
fi

さっきの部分のelse側はcdに成功した場合に通りますのでそこでカッコイイ表示を出してやります。
これがカッコよく感じるかは個人差があるのであれですが・・・

ブックマーク機能

次はブックマークを作ります。
いつもアクセスするディレクトリとかにはできるだけ短いキーストロークで移動したいもんです。
たとえば

cdx 0 #ブックマークの0番目に移動

とこんな具合に

まずブックマークは ~/.bashrcに記述するようにします。
こんな感じで

#~/.bashrc 
#cdx bookmark
export cdx_bookmark=("ブックマーク0" "ブックマーク1")

環境変数cdx_bookmarkを作成してそこにブックマークしておきたいディレクトリを記述します。

次にcdx.shにこれを読み出してインデックス通りに移動するように追記します。

#!/bin/bash

## cdx is hyper cd command

##color setting
clr_error="\e[1;31m"
clr_main="\e[1;35m"

cdx_bm_arg=$1
cd_flag=1
change_to=$HOME

if expr "$cdx_bm_arg" : "[0-9]+" > /dev/null  ; then
        if [ $cdx_bm_arg -ge ${#cdx_bookmark[@]} ] || [ $cdx_bm_arg -lt 0 ]; then
                echo -e "${clr_error}[ブックマークの範囲外です]"
                cd_flag=0
        fi
        #読み出し
        change_to=${cdx_bookmark[$cdx_bm_arg]}
else
        #引数のところへcd
        change_to=$cdx_bm_arg
fi

if [ $cd_flag = 1 ]; then
        cd $change_to > /dev/null
fi

これで. ./cdx.sh 0とかするとcdx_bookmarkの0番目を読み出してcdできるようになります。
でもこれだけだとなんか寂しいのでもう少し拡張します。

#!/bin/bash

#cdxの補完
_cdx_complete(){
    case $2 in
    [0-9]* )
        COMPREPLY=( `echo "${cdx_bookmark[$2]}"` )
        ;;
    *)
        ;;
    esac
}
complete -d -F _cdx_complete cdx

これは cdx の補完を行う記述です。Tabキー押したら発動するあれです。
cdx 0 としたとき 0 の部分に実際のパスを展開してくれます。
cdx1
こんな感じで
※書いただけでは使えません。

さらに 一時ブックマーク みたいなのも作りましょう。

$cdx_option=$1
if [ $cdx_option == "bm" ]; then
        export CDX_TMP_BM=`pwd`
        echo -e "${clr_green}Temporary BookMark${clr_Black} <-- ${clr_green}`pwd`"
        cd_flag=0
fi
if [ $cdx_option == "b" ]; then
        change_to=$CDX_TMP_BM
        cd_flag=1
fi

こうすると「きょうの作業ディレクトリはね~ここなの!」とcdx bmしてやれば
どこかに移動しててもcdx bですぐに戻れます。
cdx3

移動先のディレクトリが無かったら作るか訊く

これできたら結構うれしいですよね?
cdコマンドが「そのようなファイルやディレクトリはありません(冷酷)」とか言ってくると
無いんじゃなくてつくるんだよ!って感じます。
それでは

if [ $cd_flag = 1 ]; then
    cd $change_to > /dev/null
    if [ $? = 1 ]; then
        echo -e -n "${change_to}\nが見つかりませんでした。\n作ろうか?(y/n):"
        read ans
        if [ $ans == 'y' ]; then
            mkdir $change_to
            cd $change_to > /dev/null
        fi
    fi
fi

cdx.shの最後のif文の中をこういう風に変えます。
読んだら分かりますがcdに失敗したら訊いて作って移動します。great
cdx4

ひとつ前にいたディレクトリにすぐもどれる

pushdpopdというコマンドがあるのを知ってますか?
これpush,popってところから想像つくと思うんですけど、移動するときにスタックにパスを残しておけるんです。
なのでpopdを使えば一瞬でひとつ前のディレクトリに移動できるわけです。

しかし
みなさんここでお手元のキーボードをご覧ください。
無い方のために画像用意しました。
keyboard
試しにpopdって打ち込んでみてください。

やりました?

結構キーストローク長くないですか??え?そうでもない?
ならpushdはどうですか?

うん長いね?
それにディレクトリ変えたいだけなのにいくつもコマンドあるとか無くない?

なのでcdxに含んでしまいましょう。
といってもさっきまでのスクリプト内のcdpushdに変えて、popdcdx -pという形で呼び出せるようにするだけです。

if [ $cdx_option == "-p" ]; then
    bef_dir=`pwd`
    popd
    if [ $? = 1 ]; then
        echo -e "  ${clr_Black}--> ${clr_main}cdx ${clr_Black}: ${clr_green}$bef_dir${clr_Black} ->>>${clr_green} `pwd`${clr_reset} "
    fi
    cd_flag=0
fi

正直cdx -pってpopdよりなげーじゃんって思ってますけどいいんです。
ひとつにまとまっている。これが重要です。

そしてこれpopdってコマンドラインから打ち込んでもちゃんとひとつ前のディレクトリに移動できます。(当然だけど)

探し物してるときに自動でlsしてくれる

皆さんLinux上で探し物するときcdlscdlscdls→・・・ってしません?。僕はします。
探し物をしているときっていうのはcdlsというステップを踏みます。踏め!
なので何回目か以降はcdxが自動的にlsしてくれるようにします。
さて、探し物しているかどうかをcdxは判断しないとダメなんですが・・・それには~/.bash_historyを使います。

history -a
line=`cat ~/.bash_history|wc -l`
lineStart=`echo $line - 6|bc`
if [ $lineStart -lt 1 ]; then
    lineStart=1
fi
if [ `cat ~/.bash_history|sed -n "$lineStart,${line}p"|grep "ls"|wc -l` -ge 2 ]; then
    echo -e "${clr_main}探し物ですか?${clr_reset}"
    ls -la
fi

pushdに成功した後のelseにこれを突っ込みました。
まず、~/.bash_historyを更新します。その次に~/.bash_historyの下から6行を見てlsが2つ以上あればls -laを実行します。
なんだかハイテクですよね。
cdx6
(エンコードの調子わる)

作ったコマンドを使えるようにする

このままでは呼び出すときに

. [cdx.shまでのパス] [もろもろの引数]

としないと使えません。
cd系のコマンドをスクリプト内で使ってもスクリプト内しかディレクトリが変わらないのでsource(略系は .)コマンドで反映するようにします。
でもこれ 明らかに面倒

なので~/.bashrcをごにゃごにゃします。

#~/.bashrc

cdx()
{
    . [cdx.shまでのパス] $@
}
. [complete.shまでのパス]

関数として定義してやればいいのです。
さらにcomplete.shも同時にsourceしてやれば補完ができるように!

うーんgreat

最後に

いかがでしたか?cdx、魅力的なコマンドになったと思いませんか?
今回ぼくはcdxをこの記事に合わせて作り直しました。(作り直す前のはここ
結構気に入っててふつーに使ってます。みんなも使ってくれたらうれしいです。

一応オプションのこととかまとめておきます。

オプション 引数 説明
-p なし popdが呼ばれる
-h なし 最新の移動履歴10件が表示される
-h 番号 番号の履歴へpushdする
なし なし $HOMEへpushdする
なし パス パスへpushdする
b なし 一時ブックマークへ飛ぶ
bm なし カレントディレクトリを一時ブックマークする
なし 番号 ブックマークを読みだしてpushdする

シェルスクリプトはかなり自由なのでホントいろいろできます。既存のコマンドもこうすればよりよくなります。
それに書き方も単純です。型がないですし楽です。Cが書けてggれる人なら簡単に書けますYO!

今回作ったcdxコマンドはここにあります。ぷるりくもお待ちしてる。
github.com
適当にgit cloneしたりzipとかでもってきて↑のように~/.bashrcをごにゃごにゃすれば使えるようになります。

それでは良いcdxライフを!

ふざけた環境からとびだせ!

ふざけた環境からとびだせ!

集え!OITer!!! OIT Advent Calender 2016!!!!

この記事は、 OIT Advent Calendar 2016の1日目の記事です。


12月1日 初日の今日は僕、たいちょーがお送りします。
さっきカレンダーの登録件数をみたら、がら空きでしたが大丈夫でしょうか・・・!?


先ずは自己紹介を

コピペがやりたい

初Advent・・・ども・・・
俺みたいに色んなエディタに手だしてる浮気野郎、他に、いますかっていねーか、はは

今日の友達の会話
あの実装カッコいい、とか あのIDEほしい とか
ま、それが普通ですわな

かたや俺はUnityのコンソール見て、呟くんすわ
NullReferenceExpression. (ソースコードが)こわれてる?それ、いつものことね。

好きな言語 C#bash
使ってるエディタ VIMとVisualStudio系 (emacsはNO)

なんつってる間に22:30っすよ(笑) あ~あ、早寝は健康の秘訣ね、これ


真面目に

あいこん
隊長 (@xztaityozx_001)と申します。たいちょー でもいいです。
ほかには 社長 とか 団長 とか呼ばれたことがありますね。まぁなんでもいいです。

朝滅茶苦茶早く学校に行き、誰もいない教室でニヤニヤするのが得意です。
趣味はプリキュアとどうしようもないシェルスクリプトを書くことです。
Unityでどうしようもないゲームも作りました。

OITのHxSという部活に所属してます。部員総数に対してアクティブがかなり少ない という涙を堪えきれない部活ですが、結構僕は好きです。 ↑にある作品はここで作ったものです。遊んでみて

MapleStoryを10年ぐらいやってます。今はリブート鯖でゼノンと火毒魔してます(xz機刃隊長zxに友録ヨロw)
他にはロックマンエグゼとかポケモンが好きです。


そろそろ本題

今回は初Advent Calender参加ということで、そもそもAdvent Calenderってなに?という所から始めるんです

Advent Calender は、クリスマスまでの期間に日数を数えるために使用されるカレンダーである。
Adventの期間(イエス・キリストの降誕を待ち望む期間)に窓を毎日ひとつずつ開けていくカレンダーである。
すべての窓を開け終わるとクリスマスを迎えたことになる。
--Wikipedia アドベントカレンダー

へー、もとはキリスト教関連のイベントなんですね~
もっとも古いものは1903年ごろに作られたようなので、100年以上も続く人気(?)の習慣なんですねぇ
まぁ20年間独りぼっちの僕には クリスマス なんてものはただただ寒い日なだけですが。

それと同記事にぼくのようなプログラマの端くれとかが思いつくAdvent Calenderについての記述もありました。

インターネット上などで、アドベントカレンダーに見立てて12月に一人、または複数人で毎日記事を投稿していくという企画がある。 特にプログラミングに関連するアドベントカレンダーの企画が近年多数行われている。 複数人実施の場合は、カレンダーを管理するサイトを軸にある程度の範囲(プログラミング言語や使用する技術など) を決めて参加者を募り、順に投稿を行うというスタイルが多い。 参加者が多い場合、クリスマスを超えて12月の終わりやそれ以上続くこともあり、1年続いた例もある。

ggったときによく見かけるQiitaで毎年開催しているのはこれにあたるようですね。
参加してみたいな~。bashのAdvent Calenderとかないかな。

OITでやるなら

OITらしいこと書きたい

うれしいことにまだいっぱい空きがあるようなのでネタが尽きぬ限りOITerに関すること書かせてもらいます。
既に登録されている方々からOITerなら感じている不平不満や満足していることなどをこれから12月25日までねっとり書いていただけることでしょう。

あ、もちろんOITじゃないことも書きます。というかそっちのが多いんじゃないかな・・・???

そんな中僕が書くのは

ふざけた環境からとびだせ!

演習室の環境が ひどい というのは意識の高いOITerなら一度は感じることでしょう。
例えば今現在(2016/12/01)なら

  • 容量がUbuntuは500MB Windowsは300MBしかない

    • 市販のUSBメモリに負けるレベルだけど生徒数が多いので仕方ないな
    • なんかもっとあるって話を誰かに聴いた気がせんでもない
    • でもfirefoxのキャッシュだけでパンパン丸になるのは笑う
  • sudoさんが使えない

    • 学生にsudoさん与えるわけには!って感じだろうけどね~~~
  • Ubuntuのバージョンが古い

    • そろそろサポート終了ですよそれ
  • 起動するときたまにKarnel Panicする

  • windows側の起動がぐぅ遅い

    • セキュアブートきってんだろこれ
  • 持参PCから印刷機にジョブ発行できない

    • winの起動が遅いから印刷するまで時間かかる
  • キーボードの足がなくなってる

    • 消耗品なんだからすり減ったら入れ替えてくれ~~~
    • 足立てない人は関係ない
  • winは起動ごとに設定が消える

    • 壁紙とかはしかたないけどマウスの設定が戻るのはホント勘弁
  • C#する環境がない

    • mcsもmonoもはいってへんがな。やる気を出せ
  • ログインシェルがtcsh

    • bashにしようよ  いやtcshでもいいんだけどさ
  • winのときにメモ帳を使うようにおすすめされる

    • これはやばいとおもいます。

まだ いろいろありますけど特にぼくがしんどいと思っているのはtmuxscreenといったコマンドがないことです。

https://tmux.github.io/tmux.github.io

www.gnu.org

これがあるとないとで端末がどう違うかというと
terminal1
これが
terminal2
こうなるんです(背景のリゼちゃんはついてきません)

これ右は皆さん使っているVimで左は作業用のターミナルなんです
つまり コードを書くことコンパイルや実行などの作業 をする ターミナルを分けたまま 一つのウインドウで完結させられるんです!!
geditやemacsを教えられた通りに使っていればコードを書くときに

  • 課題のページ
  • ターミナル
  • エディタ

とウインドウを出してるでしょう
そして「 やったぁ~~こーどかけたぁ~~ 」といっていちいちフォーカスをマウスでターミナルに移すのです。

そーんなのはい・や・だ!

コーディング中は極力キーボードから手を放したくない系の僕はマウスなんていうものに触りたくないです。
え?じゃあAlt+Tab使えって・・・????

terminal3

どっちやねん!!!!

はーもう・・・
でもtmuxならこんな煩わしいことないです。でも演習室の環境には入ってない
演習室の環境ってしんどい・・・!

ならどうするか

演習室を無理やり快適する これに尽きる
演習室にいながら演習室を飛び出すことができるというライフハックならぬ 演習室ハック をご紹介します。

ターミナルとかそのへん

実はさっき見せたリゼちゃんが背景になっている奴は4日目の人のサーバにログインしています。
もちろん演習室からもログインできます。
しかもsudoさんつかえるし、容量も500MBの何倍だよって感じです。
まじありがとう

サーバの方

そんなサーバなんて貸してくれる友達いないよー><って方は有料で借りましょう。
レンタルサーバとかでggればすぐ見つかるでしょう。

借りたくないよー><って方は作りましょう。
ラズパイがあれば十分なのが作れると思います。(熱がやばい?)
www.raspberrypi.org

IPアドレスやポート番号が取得できたらいつでも簡単に接続できるようにスクリプトを書いておきましょう。

#!/bin/bash

ssh [IPアドレスとかホスト名] -l [ユーザー名] -p ポート番号

これを書いといてドーンとスクリプト実行すればいいです。
さらに

#!/bin/bash

dst=$2 #コピー先
src=$1 #コピー元
shift;shift
opt="$@" #オプション

scp $opt -P [ポート番号] [ユーザ名]@[IPアドレスとかホスト名]:$src $dst 

こういうのも用意しておけばサーバからすぐにファイルを引っこ抜けます。
使うときは

./pull.sh [コピー元] [コピー先] [オプション]

ってやります。

クライアントの方

RLoginというターミナルソフトをお勧めします。

http://nanno.dip.jp/softlib/man/rlogin/nanno.dip.jp

演習室のWinにはTeraTermが入っていますがこっちの方が使いやすいです。

  • 背景が設定できる
  • 画面をスプリットできる
  • USBにいれて持ち運べる
  • 選択するだけでコピーできる

いろいろあるんですがそれはggって
特に3つ目の 持ち運べる というのはかなり点が大きいです。
zipを解凍するとexeファイルが一つだけぽーんとあるだけなので楽々です(鍵も持ち歩かないとですが・・・)

その他の問題を解決しようか

ほかの問題の解決法を隊長的に解決してみました。

キーボード問題

keyboard1
これが問題なんですから、ここに消しゴムを挟めばいいです。
keyboard2
圧倒的

winのときにメモ帳を使うようにおすすめされる問題

code.visualstudio.com
VSCodeをローカルかUSBに入れるといいと思います。
ローカル(Zドライブ)に入れた場合はパンッパンになります。(経験済)
VSCodeはとても便利ですが、Zドライブ以外が初期化されちゃうので設定とか拡張機能がクリアクリーンされるのでつらいところ、あります。

もしくはgvimをportable gitと一緒に使うのがいいと思います。
www.kaoriya.net
github.com
演習室のWinにGitが入っていればportable gitはいらなかったんですが・・・

家PCをつけっぱにする人はTeamViewerのPortable版をUSBとかに入れて使うのもいいと思いますYO。
www.teamviewer.com
こうすれば家の環境がそのまま使えるわけですから楽ちんですわな。

なんにせよ「 メモ帳 」はダメです。

(windows側の起動がぐぅ遅い + 持参PCから印刷機にジョブ発行できない)問題

この二つの問題が組み合わさると
レポート印刷したいだけなのに死ぬほど待たされる
というせっかちなOITerなら耐えられない問題が発生します。

しかしプリンタの 文書印刷 機能を使えばPCを立ち上げずUSBから直接印刷できます!!
wow
しかし、USBをスキャンしてもwordファイルは検出されません!
boo
何回かやってみたところ、画像やテキストファイルは 検出されてます。pdfもできるのかな?
なんかdocxは見つかりませんでした。文書印刷 #とは
なのでwordを画像データにしておけばPCを立ち上げずに印刷できますね!
docx→pdf→pngという変換行程ですかね!

ログインシェルがtcsh

や、まぁこれはbashzshじゃないと死んじゃう人向けなんですけど。
ていうかそんな人はこれぐらい解決してるでしょぐらいなんですけど。
~/.cshrc

bash

を追記するだけです。

まとめ

演習室に文句を言っても仕方ないです。僕らの学費はキーボードではなく電飾やそうめんになることの方が多いですから。
ですので自分から自分の使いやすい環境を構築する必要があります。
emacsやgeditでもカスタマイズすることで驚くほどコーディングスピードが上がります。(たぶん)
不便に思っていることとかはggればだいたい同じように感じてる人がいて、嬉しいことにだいたいそれは解決されてます。

この記事では起動が遅いなどは解決できませんが、これを読んで少しでも快適な演習タイムがすごせることを願っています。