野心 米 睡眠 鉄分 

securityとかに興味があります 笑

自分が触れてきた技術の変遷

まあ、色々やってみたわけです。中途半端野郎じゃないかと思うかもだけどそんなにマイナーでもないと思うんだ。今日はざっくりと触れてきたこととかについて書こうと思う。全部じゃないよ。

 

17歳くらいの時にrubyに触れたのが最初だったと思う。その時は訳もわからず写経してたし楽しいとかはわかんなかった。でも情報系に進むきっかけになったからこれはでかい経験だったんだよな。

 

数年してまた技術やる波が戻ってきた。最初はRSA暗号pythonで実装するっていうのをやったと思う。スクリプト言語の良さを知って入力すればでてくるので計算とか扱うにはいいね!って思った。それでスクリプトをかく何かみたいなやつに魅力を覚えた。

 

最初はだからcryptoでCTF入門したんだけどだんだん難しい問題が解けなくなってきて嫌になった時にpwnの存在を先輩のおかげで知った。ゲームみたいで楽しいですよ的な言葉に惹かれてやったけど最初は知識がなくて「なんだこれ。よくわからないな」という感覚になってた。これも途中でやめるのかなっておもてたけど学校でコンピュータアーキテクチャとかをかなりちゃんとやったのもあって「知識を持っとくだけじゃ意味ないし活かしたいな」みたいなことを思ったのが実は1番のモチベ。やっていくうちになんとなくコツがわかってきてkusanokさんの本とか読んで典型的な攻略方法が洗練されているジャンルだなくらいは思えるようになった。revはよくわかんないんだけど分野的には近いからpwn同様、ビギナーズ数問くらいは解けるかもしれないし解けないかもしれないって感じ。初心者本数冊は完走してます。

 

ここでseccamp2021を受講したんだけどここで大きく方針が変わってきた。「Exploit系のことができればいいやー」って思ってDトラックとかCトラックとかを受講したんだけどなかなかリアルワールドの解析ってしんどいんだなみたいな感覚を持った。Ghidraとかその他ツール群を本格的に使いこなせたらめちゃくちゃ楽しいのかなーって指をくわえてたのを覚えてる。今ではCTFで簡易的な利用はするくらいには使えますけど当時初心者だったもんで...。(昔、5年前くらいのCTF本や参考解説ではIDAを使うのが主流だったと思うけど今はGhidraだよなあ) Dトラックでやった機械学習系もそれそのものに対する内容よりかは機械学習を実際に使って何かする(例:XSSの摘発とか) の方が面白いだろうっていう結論になった。

 

ここでわかったこととしては「自分は脅威解析は遊びでCTFの問題を解くくらいには好きかもだけど仕事にするのは違うな」ということでした。終了後、俺って何になろうかみたいなことを考えていたら秋にmini campというのがあってそこで「コンテナ」の内容のことをやったんですよね。

 

これすごいよくてこれでwebサービスの基盤とかに興味を持てた。資料めちゃくちゃ充実してたし今でも読んでます。実際、このレイヤはちょい低めだしrevとかの分野にも通じるところがある。

 

これで、webアプリケーションのことに興味持って自分で色々やり始めた。ぶっちゃけ、初手コンテナからwebに興味持つのってかなり珍しいと思う。

 

まあ、とりあえずもの作ってみましょうかってなって大昔にやってたhtmlとかcssをテンプレートにガシガシ書きながら感覚を戻す?をやったりフロントの機能をjsで書き、バックエンドを最初はFirebaseに丸投げしてたんだけど、過程で徐々にフレームワークの力を借りるべくVueを触ってみたり、バックエンドも一部の機能を切り離していきたいと考えてphpを少し学んでやって移植してみたりしました。今はバックエンド書くならgo言語を主流にしていこうとしています。会社のプロダクトがgoなんでね...。goをやっていき!

 

これで次はwebセキュリティーまわりが気になり始めました。web(CTF)に関する過去資料がネットにたくさんあるのでいろいろ読んでいっているわけですがいかんせん、攻撃の種類も情報量も多いなあwebはという感じ。CTFの問題もその場でできるかみたいなところが大きいです。これと決まったやりかたがあるのは少なくwebが本格的にできる人は相当な問題数をこなしてるなというのが所感ですが多分当たってます。(他の分野もたくさんといたもん勝ちだけどwebは特にそうだろうという話) CTFにおけるwebに関しては解釈をするのに必要な基本的な知識とよく出題される問題形式の簡単な解法くらいは一通り学習しているつもりです。

 

しかし、最近のwebサービスというのはモダンな技術、アーキテクチャが使われているため、CTFで出題されるような問題はほとんど対処済みで少し違うことや対策をリアルワールドでは求められます。代表的な例としてはクラウドとかですかね。

 

実際の開発現場ではどのようになっているかが気になったため、モダンな技術で爆速開発してる会社にjoinしてプロダクトを見させてもらって勉強をしています。まだ、右も左もわかんない感じですけどアプリケーションがたっているAWSやコンテナ周りのこと、プロダクトで使われているgoに対する理解やアーキテクチャドメインの理解など1つ1つ積み上げてやる。これでホワイトボックスの視点からバグや脆弱性、修正した方がいい項目に対してissue立てたり、小規模な機能の開発にjoinしたりできるようになっていくのが現在の目標です。

 

長くなった。

 

紆余曲折マンかもだけどたくさん触れないと自分がやりたいことなんてわかんないと思う。まあ、自分がたくさん触れるきっかけになったのは大学でかなり幅広く知識を入れさせてもらったのもあるな。一般的な学生は知識入れておしまいかもだけど自分は興味出たらちょっとでもいいからいじってみたい人なので、たくさんトリガーになった。今はセキュきゃん受講して1年立ったけど、あそこでやってたことと全く違うことやってるよ。でも寄り道悪くないけどあまり中途半端になりすぎるのもよくないしその辺のバランスって難しいね。

 

 

思い出せる限りこんなことやった

 脆弱性報告, xss

 FPGAで加算機/減算機作った

 学習でうんとかかんとか

 スクレイピングでうんとかかんとか

 ++++++;

   色々 すぐには思い出せん

 

 

終わり

COVID-19に感染しましたのでアドバイスとか

東京に長期間滞在し、やられました。ついに俺の打席が回ってきました。あるあるのシチュエーションだと思います。

 

8/15-8/20 人間であふれかえる千代田区とかにいました。感染もらった場所の予測としては、会食を毎日やっていたのが説としては濃厚かな?そこかも知れないしそうじゃないかもしれない。時差別での移動などは心掛けていた。東京に行ったが特に知り合いとエンカするとかはなかった。

 

なのでかかるときはかかります。どんなに注意していてもかかります。というか生きてたらいつかかかると思います。なので日ごろからの対策に加えてかかったときに耐えれる体力を作っておくことが必要です。勿論、ワクチンを打ったり事前にできそうなことは全部やっておくといいでしょう。

 

症状

8/20は38.8度くらいの熱で1日倒。夕方に何とか手に入れた解熱剤で熱が下がったので助かりました。このへんまでで苦しい症状の山場は越えた感じかな。8/22くらいから咳がでるようになった。完全に治ったと思ったら8/26くらいに味覚と嗅覚を失いました。28日に味覚が復活。まだ、完全に嗅覚が復活していない。(そろそろ耳鼻科に行ってみようかな

 

学んだ教訓

[特に重要] とにかく熱が出たら解熱剤をすぐにのめ。体温が高いまま放置しておくことは自殺行為です。この状態の時に手元に解熱剤がなかったのがかなり不安でした。頭痛をとおりこして頭が割れそうな感覚があったのでこのままおかしくなるかと思った。特にこの病気は長期間高熱が続くと脳がやられる感覚があるのでしっかり熱を下げることで正常な思考を取り戻せるようにしてください。

 

ゼリーなどはとてもいい。初期のとき、とくに飯を食べることができないのでゼリー系が大活躍します。

 

医療機関がすぐに見つかったらlucky。ある程度自分で薬とかストックしておいたほうがよさそう。とにかく解熱剤だ。

 

所属している学校や保健所への連絡を忘れない。

 

まとめ

療養で10日間という貴重な時間が潰れます。感染対策はしっかりしていきましょう。

医療機関はあてになりません。自然治癒できる体力が一番大事かもしれない。

10日間、すべてを全停止することによって見えてくる世界があります。俺はよく日々を生きていた...あなたもよく人生をがんばっています。

駆け出しエンジニアと繋がりたい✨笑

あ、2022/8/15から東京の会社に入社します。ざっくりいうと事業会社でセキュリティーをします。でも事業会社=プロダクト作ってる会社なんでセキュリティーばっかりってこともないです。開発もします。モダンな技術を使っていて勢いもあっていい環境そうだなって思ってます。(短期のインターンも受け入れしているようなところ) そして自分の興味範囲のことができそう... 

 

どんなことするかは明確に明示はできないですがseccampで例えるならWebのトラックに1番近いかな?しかし、アプリケーションを動かしてるコンテナとかは実際低いレイヤですしそういう部分に対策を仕掛けていくとなると低いレイヤにも知見が必要です。検出とかちょっとしたツールに機械学習を使うなんてこともあるでしょう。Webから低レイヤまでの技術屋さんって横断した幅広い領域の知識が求められますもんね。そういう時代。

 

学部3年も折り返しの夏休みで残り少ない?学生時代、自分の好きな/やりたい技術とか趣味もやっていきたいと思うわけですが、こういう形で実際に現場で色々やれるのはとても貴重と思うのでちゃんと軸足を置いて、感謝してやっていきたいです。CTFもっとやりたい。高度資格とかも必要に応じてやりたいしなあ。

 

ということで東京に頻繁にいるとおもいます。

 

また進展があったらブログに書いていきたい。技術のアウトプット量少ないの自覚してるのでその方法も考えていかないとね。それでは。

機械学習システムへの侵入

自分がセキュキャンで学んでいた講師たちが書いているブログがあるのでこれを全部読んだ。

論文紹介と書いてあるところは飛ばしながらまずは「AIセキュリティ超入門」とかいてあるところから順番に読んだ。下が1話のリンク

 

jpsec.ai

第1回:イントロダクション – AIをとりまく環境とセキュリティ –
第2回:AIを騙す攻撃 – 敵対的サンプル –
第3回:AIを乗っ取る攻撃 – 学習データ汚染 –
第4回:AIのプライバシー侵害 – メンバーシップ推論 –
第5回:AIの推論ロジックを改ざんする攻撃 – ノード注入 –
第6回:AIシステムへの侵入 – 機械学習フレームワークの悪用 –
第7回:AIの身辺調査 – AIに対するOSINT –
第8回:セキュアなAIを開発するには? – 国内外のガイドライン

ここからは論文の紹介と将来的によんだほうがいいやつのリンク。

 

jpsec.ai

jpsec.ai

jpsec.ai

jpsec.ai

jpsec.ai

jpsec.ai

jpsec.ai

 

ここまで紹介したが最近僕はこのテーマ、真面目にやってない。やってたのはせいぜい3ヶ月くらいだったかな。離れた理由としては機械学習について扱っているうちに機械学習そのものよりも機械学習をツールとして他の領域の脆弱性探したりの方がいいと思ったから。その意識に変わったきっかけとしては「セキュリティーエンジニアのための機械学習/ AI技術によるセキュリティー対策入門」を読んだからだと思う。

 

www.oreilly.co.jp

 

まあ、やってみ?いい本。

 

 

1桁加減算カリキュレータの作成 

何かしらのシステムを作ってそれを早く動かしたい!!という野望を持った時、どういう発想があるだろうって気になっていた時がありました。私はシステムの基盤そのものを早くしたいと思いますね。もちろんデータ構造やそれに伴って勉強しなければならないアルゴリズムの観点というのは非常に重要です。それはソフトウェアとしての対策。めちゃくちゃ重要です。ではハードウェアからのアプローチってなんだろうと思って作ったものがこれです。脆弱性についてもより低いところではソフトウェアレベルでもハードウェアレベルでも対策をしないといけない(*1)のでそのアプローチの視点を増やすためにこういったことを勉強の一環で開発していました。 

------------------------------------------------------------------------------------------------

実機で実際に動いたのを確認済みです。最後に最終結果として写真貼っておきます。 

 

作成の手順 (Github)より 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator  

 

全体としてどういうシステムを作りたいのかについて共有します。 

 

 

SEG_1_OUTとSEG_SEL_1はSEG_A~SEG_Dを、SEG_2_OUTとSEG_SEL_2はSEG_E~SEG_Hをそれぞれ制御できるように配置する。LEDの割り当て配置と表示の例(3) 

 

  • さらに7セグの表示器と制御論についてもう少し補足 

7セグメントLEDはダイナミック方式で制御される。出力データをセレクタで切り替えて表示する。出力データはSEG_1_OUT、セレクタ信号はSEG_SEL_1OK 

 

 

上のハード設計を踏まえて 

SEG_SEL_1 = 1110 (E) -> SEG_1_OUTはSEG_Aで表示 

SEG_SEL_1 = 1101 (D) -> SEG_1_OUTはSEG_Bで表示 

SEG_SEL_1 = 1011 (B) -> SEG_1_OUTはSEG_Cで表示 

SEG_SEL_1 = 0111 (7) -> SEG_1_OUTはSEG_Dで表示 

SEG_SEL_2 = 1110 (E) -> SEG_2_OUTはSEG_Eで表示 

SEG_SEL_2 = 1101 (D) ->SEG_2_OUTはSEG_Fで表示 

SEG_SEL_2 = 1011 (B) ->SEG_2_OUTはSEG_Gで表示 

SEG_SEL_2 = 0111 (7) ->SEG_2_OUTはSEG_Hで表示 

の、ような表示を高速切り替えできるようにし全てのLEDに対して割り当てを行う。 

 

  1. Halfadder

1ビット(A,B) の加算を行い,和(Y) と上位への桁上げ信号キャリー(CO) を出力する回路を書いてやる極めてシンプルな加算回路のコンポーネント 

 

Github 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/halfadder.v  

なぜかわからないけどCoqとして読まれている。実機上では正しく動作が確認できたので問題なし。証拠写真 

 

 

テストベンチ::Github 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_halfadder.v  

transcript上での動作確認が取れた 

 

雑に感じたこととしては1step == 1psに相当すると予想。そして$finishというタスクが実行されプログラムが終了。$monitorでは書式と変数を指定しておりこれはC++の出力ストリームと非常に似ていると感じた。しかしこの1行によって何度も文字が出力されていることから、$monitorは変数の変化を検出するたびに実行でうまく動かしているのではないかということだ。 

 

  1. 2. Fulladder

bitの被加数A, 加数B, 下位桁からのキャリーCINの加算を行い,和(SUM) と上位への桁上げ信号キャリー(COUT) を出力。フルアダーは2個のハーフアダーと,1個のORゲートで構成。⏬構成図と対応表 

 

みたままの割り当てをしてやれば良い Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/full-adder.v  

 

テスト 

テストベンチ::Github 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_fulladder.v  

transcript 桁上げ対応がちゃんとできていることがわかる。 

ただしい挙動を得ることができた 

 

ソースコードについて A,B,SUM は4ビット指定している。それを出力するコードをモジュール内に書いた。テストベンチについてテスト入出力の信号を4ビット幅でとって タイムステップを50でとることによってタイムステップごとに a, b の値を変化させてシュミレーションすることによってテストを行うことができた。 

 

 

  1. 3. four (4) bit ripple carry adder

3個のフルアダー(FA1FA3) と1個のハーフアダー(HA0) を図のように接続すると4ビット2進加算器(ripple4adder)ができる。これはいわゆる構造記述の一環で今までに書いてきたものを部品としてみることによって部品として扱うことができるのでそれらを定義通りに組み合わせるにはどうすれば良いのかを考える。 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/ripple4adder.v  

 

テストについてもここで提示する。Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_ripple4adder.v  

 

テスト結果 

加算結果が16を超えない範囲では出力SUMが正しい数値を表示していることが分かる。これらの組み合わせではcarry0を出力していた。6+14, 13+9など合計が16を超えるとcarry信号が1となりsumに何かしらの信号が確認できるのでO K 

 

 

  1. BCD adder & BCD hosei6 module

これには前提としてBCD符号についての理解が必要。10-16にはA-Fが割り当てられることになるがS0110 = 610 を加えて補正するとこれが1の桁になる)つまり下記の表のように補正する必要性がある。 

 

では全体としてどのような概略図になるのだろうか。以下である。 

 

dummyはハーフアダーの桁上げ信号と接続されていることから桁あふれを表す信号線。3ビットの出力を設けてやりさらにdummyを設けることによって補正結果の調整に使うことを想定している。ここでは前に書いたhalf adderとfull adderを接続することによって計算している。 

 

大きくテーマに分けると「桁上げ検出」「6補正」を先ほど作ったモジュールに噛み合わせれば作成できそうな目算がたった。では順番に処理の過程を見ていくことにする。 

 

「桁上げ検出」 

and演算とor演算をしているところが桁上げ検出である。それがcarry detect。加算されて出てきた結果を入力側に渡してk1とk2のand演算k3とk4のand演算を割り当てる。そして一番重要なのがdetect= (an1 || an2) || k5の部分だがそこでは論理条件を考えることによって桁上げの検出をしている。 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/carrydetect.v  

 

「6補正」 

16進数で表現されてしまうため補正を行う必要があってこの補正方法として表現数の差である6を加算結果にもう一度加算することで強制的に桁をあふれさせ0~9の表現のみを使用できる仕組みをうまく利用することによって桁の処理をする。2進数の加算をして得た結果と桁上げ判定後の結果を入力信号として受け渡すことでつなげている。 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/hosei6.v  

 

ここまでできたら次はそれら3つのコンポーネントを繋いで本格的にシステムを組み上げていく作業。新しいモジュールを立ててそこに書き込むことで接続した。 

 

それがBCDTOP 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/BCDTOP.v  

無事、f0-f4ワイヤ線を結合することができました。 

 

それではテストプログラムを書いて挙動の確認をしてみる。 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_BCDTOP.v  

 

結果的にこうなりました。 



補正検出回路では4bitの加算で桁あふれが発生した場合と結果のbitから10以上であることを検出した場合に信号が1になっている。つまり桁上げとして正しくないところに1を出すことができているのでその他正常に動作しているものと合わせ、うまく動作できた。 

 

  1. 5. six (6) bit add-subtract circuit

したの図の部分を主に作成する。4までで全体制御は書くことができたのでここからは実際に入力された信号に対する過減算装置を記述する。以下の手順で作成して実機に反映させるまでのステップを踏んだ。 

 

 

(1) 減算モジュールの設計 

4bitの入力A,Bの減算結果を6bitのSUB_DATAへ出力する回路を設計する。減算は入力Bの2の補数を生成しその数とAを足し合わせることによって実現する。 

イメージ図はこんな感じ 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/sub.v  

 

 

(2) 加算モジュールの設計 

4bit加算器を実装するFPGAの仕様に合わせて改良したものを使用する。 

イメージ図はこんな感じ 



Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/add.v  

 

 

(3) 1桁加減算トップモジュールの設計 

設計した計算モジュールとあらかじめ用意されたコントロールモジュールを組み合わせてトップモジュールを設計する。 

イメージ図はこんな感じ 

 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/calc_one_top.v  

 

LEDへの出力の受け渡しと配線->controllerで制御部分の実装。インスタンス部分では.CLK(CLK)などの部分が続くがこれはテンキーへの制御受け渡しをしている部分で非常に核となる重要な実装箇所 

 

(4) トップモジュールのテストベンチの設計 

モジュールの動作確認するためのテストベンチを設計する。検証する計算は1+2, 5-9, 9+8, 6-6でやった。 

3で作ったものに対するテストベンチを作成する。以下の様な実装をした。 

Github:: 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_calc_one.v  

 

クロック信号、リセット信号、Key dataの呼び出しをすることにSEG_1_OUTはSEG_Cで表示、SEG_SEL_1 = 0111 (7) のときSEG_1_OUTはSEG_Dで表示する必要があるのでこれに従った実装をすることである。出力はLED に渡してやる。次にトップのモジュールを呼び出す。これは動作指定したものをテストで呼び出す作用を測っている。次にalways文でシグナル生成をしてタイムステップを踏む。ここでのポイントは7セグメントLEDはダイナミック方式での制御であるため出力データをセレクタで切り替えて出力しないといけない点である。つまり例を示すとSEG_SEL_1 = 1110 (E) のときSEG_1_OUTはSEG_Aで表示、SEG_SEL_1 = 1101 (D) のときSEG_1_OUTはSEG_Bで表示、SEG_SEL_1 = 1011 (B) のときといった感じである。その際のテンキーの受け渡しのルールはFPGAの仕様に基ついて以下のルールを守って行う。 

 

テンキーの割り当てについて 

  1. キーデータ,ボタンデータは押していない状態では"1"が出力されている。押すと"0"が出力される。キー,ボタンについては”0” が有効データ 
  1. リセットボタンを押すとRST_X信号が"0" になる。離すと"1" になる。
  2. テンキーデータは,14ビットの信号PSW[13:0] にセットされる。
  3. あるキーを押したとき,対応するPSW [X]の値が"0" になる

 

(5) シミュレーションで波形が正しいことを確認したらQuartus を起動しVerilogコンパイル、ピンのアサインを行ってFPGAにプログラムを書き込む。実機での動作確認 

 

その結果 

完成しました。 

 

コラム      (追加の実装          -もっと高速でより速いFPGA実装への探求- ) 

先ほど示したsubの改良論理回路設計に伴う変更コードを作成した。改良点としては最下位bitの加算にFulladderを用いているところである。これによってセレクタ信号が1の時に「A_DATA + B_DATA + 1」のような演算ができることによって少し機能性の上がった回路設計になったのではないか?とおもう。ソースコード、およびテストのソースコードについて載せておく 

 

ソースコード 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/andandsub.v  

テストのソースコード 

https://github.com/ultrasupara-jump/One-digit-add_subtract-calculator/blob/main/work/src/test_andandsub.v  

技育博2022に参加した

渋谷で学生IT団体が集まるらしいっすよ。そう聞いた自分は交通費も出るらしいし顔出してみるかくらいの感覚で応募フォームを書いたの思い出しました。

 

じっさい参加してみるとTwitterなどのSNSで見たことのある人がたくさんいておーってなりました。新規の方も含め、あってくださった方本当にありがとうございました。

 

また企業と会えるというのが魅力的でした。自分たちはコロナ時代の学生なので学科内でのつながりが希薄なのはもちろん、企業なんてかなり遠い存在にすら感じていました。しかし実際は就職活動は迫ってくるものだしそういった意味で企業のことを知ることは非常に重要です。学生が企業のことが遠い存在になったならその逆もまたありそうで企業も学生のことを知る機会が減ったのではないでしょうか。企業にとっても新卒採用など、かなり重要な部分でこういったマッチングがあると企業側も意欲的な学生と会えるのでお互いにWinWinですね。

 

RiSTのブースにはたくさんの企業、学生団体の方がお越しくださいました。今一度厚く御礼申し上げます。お話しできた企業さんや団体の方へ今後団体のほうからご連絡させていただく場合がありますのでその際はよろしくお願いします。また、逆にLT会のようなライトなものから勉強会、CTF主催などの件でのDMは大歓迎です。ぜひうちの団体のTwitterまでご連絡お待ちしています。(@realRiST)

 

今回このような素晴らしいイベントを開催してくださった運営の皆さんには感謝でいっぱいです。今後ともよろしくお願いします。短いですが参加記です。

 

 

Linuxコマンドチートシート for RiST

Linuxコマンドについて初回の活動でRiST団体長(@Lion_rion_rits)から話があったと思います。今回は自分でも見ながら動かすことができるようにちょっとしたまとめサイトを作ってみました。これを参考にCUIでコマンドを打ち込んで慣れていきましょう!!!!!

 

file: ファイルの中身をみてなんとなくなんのファイルか言い当てるコマンド

linuxjm.osdn.jp

 

cp : ファイルディレクトリをコピーする
基本的な使い方
コピー先の末尾に/をつけると,そのディレクトリの中にコピーするという意味になります.そうでない場合でも,その名前のディレクトリが存在する時はそのディレクトリの中にコピーされます.

$ cp [コピーするファイルのパス] [コピー先のファイルやディレクトリのパス]
$ cp -r [コピーするディレクトリのパス] [コピー先のディレクトリのパス]


例---------------------------------------------------------------
カレントディレクトリの中のa.cというファイルをappというディレクトリの中にコピーする
$ cp a.c app/
$ cp a.c app/a.c
カレントディレクトリの中のa.cというファイルをのコピーをb.cという名前で作成する
$ cp a.c b.c
ルートディレクトリの中のetcというディレクトリの中のhostsというファイルをカレントディレクトリにコピーする
$ cp /etc/hosts ./

 

 

ls: 今いるディレクトリ(フォルダ)または指定したディレクトリ(フォルダ)に置かれているファイルの名前を列挙する。オプションをつけると追加でいろんな情報を表示できる 。

オプションをつけるとどうなるか

ls  -l ディレクトリ内のファイルの詳細情報がリストで表示,更新日付とか
 ls -a すべてのファイルを表示
 ls -al すべてのファイルをリスト表示

linuxjm.osdn.jp 
pwd:  自分が今どこのディレクトリにいるか表示(print working directory)

 

echo: 引数に渡した文字列をそっくりそのまま出力する 

 echo <abc> シェルにabcと文字列が表示

linuxjm.osdn.jp

 

 

cat :引数に渡したファイル名のファイルの中身を出力する。複数のファイルを指定すると順番に並べて表示する

 cat <ファイル名> ファイルを連結してスタンサードアウトプット(シェル上に)にプリント

linuxjm.osdn.jp

 

man: マニュアルページを表示する。引数に渡したコマンドのヘルプを読む事ができる。

 man <コマンド名> コマンド名の情報,詳細

linuxjm.osdn.jp

 

 

touch: ファイルの更新日時を更新する。ファイルがなかったら作る(この用途で使われる事が多い) 

touch <ファイル名> ファイルの更新日時がいじれる(書き換えないで),存在しないファイルを指定⇒新規作成

linuxjm.osdn.jp

 

 

mv: ファイルの名前を変更する。パスを指定するとファイルが置かれているディレクトリを変える事もできる。 

 

基本的な使い方
移動先の末尾に/をつけると,そのディレクトリの中に移動するという意味になります.そうでない場合でも,その名前のディレクトリが存在する時はそのディレクトリの中に移動されます.


$ mv [移動するファイルやディレクトリのパス] [移動先のファイルやディレクトリのパス]

mv ../<directory>/<filename> ./    directoryにfilenameを移動する


カレントディレクトリの中のa.cというファイルをappというディレクトリの中に移動する
$ mv a.c app/
$ mv a.c app/a.c


カレントディレクトリの中のa.cというファイルをb.cという名前に変更する
$ mv a.c b.c


ルートディレクトリの中のetcというディレクトリの中のhostsというファイルをカレントディレクトリに移動する
$ mv /etc/hosts 

linuxjm.osdn.jp

 

 

`hoge` `fuga` ` piyo` `foo ``bar ``moo` ... : [* メタ構文変数]。好きなものを指定して良い事を明らかにするために使われる「特別な意味が全くない事を表す」ための名前。サンプルプログラムなどによく現れる

 

 

cd: 別のディレクトリに移動する。シェルには「今いるディレクトリ(カレントディレクトリ)」というものがあり、ディレクトリ名を指定せずにtouch ファイル名などした時にファイルはカレントディレクトリに作成される。cdはカレントディレクトリを変更する。全てのディレクトリの中には` . `と` .. `という特別なディレクトリが存在する。.はそのディレクトリ自体を表し、..はそのディレクトリの1つ上のディレクトリを表す。例えば `cd .. `を実行すると1つ上のディレクトリに移動する事ができる。 

 

 

tree: 現在のディレクトリ、または指定したディレクトリから下にあるファイルを下のディレクトリの中身も含めて階層的にいい感じで表示する 

linuxjm.osdn.jp

 

 

ps: 起動中のプロセスの一覧を表示する。 

実行可能バイナリ(アプリケーション)を起動すると「プロセス」が誕生する。アプリケーションが終了するまでの間「プロセス」が存在する

linuxjm.osdn.jp

 

 

PID: プロセスID。プロセスには1つ1つを識別するためのIDが与えられる

 

 

sleep: 引数で指定した秒数待つ。

 

`&& `でコマンドを複数並べて実行すると「`&&`の左のコマンドが成功したら右のコマンドを実行する」という意味になる。& でコマンドを複数並べて実行すると「&の左のコマンドを実行するのと同時に右のコマンドも実行する」という意味になる。右側はなくてもいい。& でコマンドを繋いだ場合、右側のコマンドが完了したら次のコマンドを受け付ける状態になる。例えば、 sleep 5 & すると「5秒間寝ておいて、俺は待たずに戻るけど」という意味になる

 

linuxjm.osdn.jp

 

 

kill: 指定したプロセスIDのプロセスにシグナルを送る。デフォルトではTERM(プロセスを終了してください)を送る

linuxjm.osdn.jp

 

procfs: Linuxで使える擬似ファイルシステムの1つ。今存在するプロセスの詳細がディレクトリわけされてまるでファイルのように読めるようになっている。通常は/procにマウントされている。歴史的な理由からプロセスと関係ないのにここにぶら下がってる情報が色々あるけど気にしないように。/proc以下から見た環境変数はプロセス毎に異なっている事がある。

 

tail: ファイルの最後数行を表示する。-fをつけると最後まで表示した後さらに追記されるまで待つようになる

 

head : ファイルの先頭数行を表示する

 

init : linuxカーネルは起動するととりあえず`init`という名前のプロセスを起動しようとする。全てのサービスやログインの待機はinitから実行される。プロセスには親子関係(どのプロセスが、どのプロセスを起動した)があって、initはもっとも根元でシステム起動時に上がってくるサービスなどを起動する役割と、「親プロセスが先に死んでしまった子プロセス」の片付けを担う。ブートローダLinuxカーネルを起動する、Linuxカーネルはinitを起動する。initがgettyを実行する->gettyがloginを実行する->loginがシェルを実行する、という流れなので、login時点ですでにinitは起動していて、initは2重に起動しようとすると失敗するようになっている。

 

system: 指定した引数で子プロセスを作る。子プロセスが終了するまで親プロセスは停止する

 

clear: 現在のターミナルに表示されているものを消すコマンド。typoして`Command Not Found`と言われたりした恥ずかしい履歴をとっさに隠すのによく使う。消す方法はターミナルの実装によりけりで、実は画面サイズ分スクロールしているだけのこともある

 

random_device: ランダムな値ツクール


mt19937: ランダムな値フヤース 


uniform_int_distribution: ランダムな値の範囲シボール

 

------------------Linuxコマンド、それぞれの名前の由来--------------------------

`ls = list`
`ln = link`
`mv = move`
`cd = change directory`
`cat = catenate || concatenate`
`cp = copy`
`rm = remove`
`mkdir = make directory`
`rmdir = remove directory`
`chown = change owner`
`chmod = change mode`
`tac = catの逆コマンド(ファイルを逆から出力)`
`grep = "g/RE/p" || globally search a regular expression and print`
`ping = 潜水艦などで使われるアクティブソナーの発する音波`
`sh = shell`
`bash = Bourne again shell`
`su = substitute user || switch user || super user`
`sudo = substitute user do || switch user do || super user do`
`vi = visual`
`sed = stream editor` 入力(ストリーム)に対して編集を行う
`uniq = unique`
`awk = Aho, Weinberger, Kernighan` 開発者3人の名前
`man = manual`
`pwd = print working directory`
`bg = background`
`fg = foreground`
`ps = process status`
`du = disk usage`
`df = disk free`
`dd = IBMの汎用機のJCLのDD文`
`passwd = password`
`tar = tape archive`
`wall = write to all users`
`xargs = execute arguments`
`eval = evaluate`
`uname = UNIX name`
`tr = translate`(変換する)

`/bin = binary`
`/sbin = system binary || static linked binary`
`/usr = user`
`/var = variable`
`/lib = library`
`/tmp = temporary`
`/opt = optional` 追加インストールしたアプリケーションなどを配置(ユーザー各自のオプション)
`/dev = device`
`/etc = etcetera`(その他) 設定ファイルが置かれる
`/proc = process`
`/sys = system`
`.so = shared object`
`.a = archive`

`tty = teletypewriter` (参考:https://e-words.jp/w/TTY.html)
`stdin = standard input` 標準入力
`rc = run command` 例 .bashrc
`dmesg = display message`
`nl = number line`
`od = octal dump`
`cpio = copy input output`
`tee = 標準出力からファイル出力をT字のように分岐させるから。`
`ldd = list dynamic dependencies`
`ld = link editor || LoaD`
`curl = client for URL`
`wget = Web get`
`spool = データを一時的に貯めておく場所`
`chage = change password age`
`wc = word count`(オプション:-c=char型, -w=words, -l=lines)

`netstat = network statistics`(ネットワークの統計情報)
`ss = socket statistics`(ソケットの統計情報)
`tc = trafic control`
`lsof = list open files`
`dig = domain information groper`(※grope=手探りする)
`nslookup = name server lookup`
`getent = get entries`

`head = 頭`
`tail = 尾`
`rev = reverse`

`fdisk = format disk`
`cfdisk = curses format disk`
`gdisk = GPT fdisk`
`parted = partition editor?`
`fsck = file system check`
`tune2fs = tune file ext2 file system parameters?`
`etc/mtab = mounted file system table`
`etc/fstab = file system table`

 

-------------コンパイラのやかましさを指定するオプション----------------------

-Wall: コードの怪しいところ全部指摘して 
-Wextra: おせっかいかもしれないような指摘も全部して
-S: gccやclangにこのオプションをつけると実行可能バイナリを生成する代わりにアセンブリを出力する
-O0 -O1 -O2 -O3: 最適化のかかり具合を調節するオプション。数字が大きいほど豪快な最適化がかかる。アセンブリを読む時は小さい数字にしておいた方がC++ソースコードとの対応がわかりやすいアセンブリが出てくる。
-g : コンパイル時に指定する事で、生成される実行可能バイナリに「今実行しているところがソースコードのどこに対応するか」等の情報が埋め込まれる。