brand new note

インフラエンジニアを目指す大学院生のメモ

今日の小ネタ 180728

本日の気づきシリーズとか作ったら軽いネタも気軽にアウトプットできるのではという目論見です。自分のブログですし。

thunderbirdの小ネタ

  • メールのアーカイブは受信トレイでメールをクリックしてAキー。作ったフォルダには分類できないけど大事なメールが来た時に使う。

  • メール送信時の表の作成について。中に文字を打ってる間にセルの大きさが自動で調整されていくので、勝手にきれいな表が作れるしエクセルみたいにセルを引っ張らなくて済む。これ知らなくて3分くらい引っ張ってた。


エンジニアさんのブログを発見した

ブロックチェーンエンジニアとして生きる - ブロックチェーン,エンジニア,ビットコイン,Bitcoin,イーサリアム,Ethereum,暗号通貨,仮想通貨,DApps

ブログは質より量派の方がいらっしゃったようで少し安心。。。どうでもいいけどこのwordpressのテーマ持ってます、使いやすいんですよね


椅子でできる筋トレについて

【オフィス&自宅で】イスを使った20種類の筋トレメニューで引き締める! | 【舞筋道-maikindo-】ダンス×筋トレ×ダイエット

体力を戻すために運動はしたいけど進捗も出したい。器具買うほど筋トレは興味ない。気分が乗った時だけでいい…という方におすすめ。最後のほうはオフィスでやっちゃだめ。


pseudoの意味は「疑似」とか「偽」

読み方:pseudo: UNIX/Linuxの部屋

すーど、とか、しゅーど、とかいうらしい。pseudo terminal は「疑似端末」っていう意味。linuxいじってるとよく見るんだけど???ってなることがよくあるので。


BGPツールキット

Hurricane Electric BGP Toolkit

自分がアクセスしているプロバイダのASがいくつなのかとかが分かります。逆にAS番号から企業を検索することもできます。ピアリングの状態も確認できるのでネットワーク勉強してる人は見ていて楽しいと思います。


ps aux したときの [hogehoge/0] って何

タイトルを迷って非常に抽象的にしてしまいましたが、CLIが固まってしまってデバッグしてた時の調べものです。

カーネルスレッド

[hogehoge/0]のように[]で囲われたプロセスはカーネルスレッドと呼ばれます。

カーネルスレッドとは - Linuxの備忘録とか・・・(目次へ)

f:id:frazz:20180512182616p:plain

カーネルスレッドの役割はワークキュー、メモリの回収、ソフト割込みなどで、カーネルの動作を補助するものになっています。ここでカーネル起動時にinit (process ID 1)が生成されると、それを親にして子プロセスが生成される。。。という話あたりもしたかったのですが、こちらに詳細があります。気が向いたら追記します。

カーネルスレッド生成&ユーザーモードプロセス生成 - Qiita

で、カーネルスレッドとユーザプロセス、psコマンドで両方見ることができるのはなぜかというと、スケジューリングの観点から見たときカーネルスレッドもプロセスも同じ手順(do_fork関数)で生成されるからなんですね。


ただ違いももちろんあって、一般的なプロセスは生成されるときに一定のメモリ量を割り当てられるので、メモリの限界が来ない限り同時にたくさんのプロセスを抱えることができます。それに対しカーネルスレッドも同時にたくさん動作することは可能なのですが、その上限はハードウェアのメモリ量ではありません。「カーネルスレッドを動かすプロセスに割り当てられたメモリ量」です。

なので、リソース確認用コマンドで確認してもメモリがいっぱいになっていないのに動作が重くなる、あるいはロードアベレージが高くなる場合はカーネルスレッドが乱立しているかもしれません。その場合のデバッグはケースバイケースなんでしょうけど、自分が躓いたときは一緒に動いている他のサーバがトリガーになってました。nfsの挙動がおかしくなっているのをdmesgコマンドで見つけた感じです。

なかみ

まだ整合性に欠ける表現があります。

  • [events]

非同期実行の必要がある低レベルの要求を処理するメカニズム

  • [kintegrityd]

ワークキュー?ブロックデバイスに誤りがないかチェック

  • [kblockd]

カーネルのブロックI/Oタスク

  • [watchdog]

時間ごとに監視するやつ、途切れたらアラートを上げる

  • [stopper]

カーネルマイグレーションスレッドともよばれる

  • [ksoftirqd]

ソフトウェア割込みが高いと実行される

  • [xfsなんとかd]

"xfsファイルシステムは処理効率のための動作タイミングを正確に制御する必要があるカーネル機能の一つである" とりあえずxfsはファイルシステム

  • [rpciod]

NFSと関係があるらしい

パケットを投げるプログラムを拾ってきた

くそみたいな記事しか生み出せない罪悪感のおかげで実装ベースの思考回路に変わり始めています。しかしながら毎度のごとくやる気が尽きたところまでしか書けませんので、随時追記していきます。

githubから拾ってきたコード

適当なプログラムやアプリ開発を一からやってみようとしたのですが、過去に何度も挫折してるので作戦変更。自分の専門分野が絡んでて、かつ他人が書いたプログラムを教材にした方が深みが出るかな...という結論に達したので、一ヶ月前に読むのを諦めたソケットプログラムのソースを引っ張ってきました。

GitHub - rbaron/raw_tcp_socket: An exercise about working with raw sockets under GNU/Linux

実行して満足して終わっちゃったんですよ。くそでしょ。

実行結果

[root@ikeda raw_tcp_socket]# ./raw_tcp_socket 
IP header checksum: 40710


TCP Checksum: 14092
Success! Sent 50 bytes.
SEQ guess: 1138083241

とりあえず分かってること

パケットを50バイト送信してるプログラムですね。ばっと読んだ感じ、Cなのでメモリをいじったりしてた気がします。プログラム内にバイト指定する為の何かがある。

分からなかったところ

今後1記事書きます。これを読んでるところ。IP チェックサムの秘密

  • winsock.h

windowsのソケットプログラミング用ライブラリ。

  • pragma

プラグマを使用すると、コンパイル内容を詳細に渡って制御できるらしい。

  • dstatで見ると92バイト送ってるんだけど

プログラムを実行するだけで出現してしまうオーバーヘッドなのかもしれない(予想)。

書き換えてみる

  • 100バイト送るにはどうしたらいいのか?

  • インターフェースを指定するには?

おもうこと

実装ベースにした途端「知ってることをしゃべれる喜び」が「作れる喜び」にグレードアップするんですね。そうなると今までパケットの作りとか気にしてなかったのにちゃんと調べるようになるし、解析ツールの必要性を感じるし、プログラムやリソースの出力結果が不本意なものになってもそれが楽しい。ずっとこれが今まで苦しかったんですけど、色々考えて少しでも多く前進できる頭にしていきたいと思います。

テレメトリネットワークって何

janogで聞いたキーワードの調べ物。

テレメトリ

tele:遠隔地、metering:計測、つまり自分がそこに居なくても遠隔地からデータを自動で収集してくれる様なシステムのことを一般にテレメトリングシステムと言います。ネットワークにもこの「遠隔地の情報を収集」の考え方を使おうというアイデアから生まれた言葉です。わりと新しい言葉で、実際どういうことって聞かれると自分もなかなか説明できませんのでまとめておきます。。。

これまでスイッチ、ルータ、AP等の機器情報は個別に管理されていました。しかしシステムやアプリケーションの複雑化、クラウド技術の進展に伴い、これらの監視データを管理用ノードで一括管理できる仕組みの開発が進んでいます。

何が新しいのか

Telemetryを実現することにより最終的なゴールとしては、「データセンターの投資を保護し最大化」することです。

Telemetryによるクラウド型ネットワークの可視化 - LTN Blog 〜 Lenovo Technology Network 〜

こちらの記事が分かりやすかったです。「遠隔地の」「様々なネットワーク機器を」「全部まとめて」というテーマでならこれまでにもさまざまな監視ツールは開発されていました。しかしクラウドが浸透してきた現在では、企業ごとに個別に構築したネットワークを監視するといった形態は減少しており、DC向けの大規模な監視が必要です。

ましてや、監視ができてもそこから分析までやってくれるツールというのはそう多くありません。つまり現在ではそのあたりの技術開発がホットだということなんですね。(自分ももっとこの辺の技術を詰めて行かないといけないんですね)

クラウドを使うメリットはインフラ部分の管理を投げられるといったものの他に、コストやサービスのスケールに応じた柔軟なリソースの拡大、縮小ができる点にあります。つまり、「アクセスが来そうな予兆を捉えたら障害が発生する前にサーバリソースを自動で拡大する」みたいなことができたら便利だな、とか思うわけです。

監視したデータを分析して適切な動作をする、までやる、という一つの例ですね。調べた感じシステムリソースの将来予測をするAIはちらほら出てきているようです。研究分野とかぶっててめっちゃ焦る

なるほど

ずっとがむしゃらに気になるものを勉強してたんですけど、どうも今まで自分の現実からかけ離れたすごい人達がこういうシステムを作ってるんだ、という気持ちが拭えなくて。でも自分もネットワークをちょっと組んでみて監視ツールとかを入れて、いまこうなってんのかーみたいなこと言ってニヤニヤできるくらいにならないとヤバイなと思いました。

こういうのは周りの仲間がやってないこともないんですけど、理解が浅いと自分で手を動かす理由がハッキリしてくれないんですよね。(だから浅い記事しか書けないんですね。。。)企業さんがやってるホットな部分を追うのは「イメージを作る」という意味で専門書を読むのと同じくらい大事だということが分かりました。いわば両輪ですね。

実現するための技術

監視のみの場合と違って、実際に分析するにはDBとそれなりのストレージ、あとはそもそも分析に対応した機器が必要です。CISCOやARISTAは既に分析ツールを一式出しているとのことです。

ここにシステムの実装に関するスライドを貼っておきますが正直理解が追いついてません。ここまででなくても近いうちにおうちでネットワーク機器の情報を収集するシステムは作りたいですね、esxiとzabbixくらいはやりたい。

Linuxシステムコール基本リファレンスを読む

はい、買ってきました。最近ブックオフと図書館ばかり使ってたので本屋で新書を手にすると気分いいですね。あまりリファレンスをガッツリ読むのも時間効率が悪いんですが、勉強の仕方も分からないのでひたすら順番に疑問をメモしながら読み始めてます。なんも分かんないので目次の時点で80個くらい感想が出てきてます。

f:id:frazz:20180506195822j:plainf:id:frazz:20180506195552p:plain


OS理論の入り口によさそう

linuxシステムコールの説明といえばその一言に尽きますが、システム内部をプロセス、ファイル入出力、メモリ関連、時刻関連などのパーツに分解し章立てしており、その中でどのようなシステムコールが存在し、それぞれがどのように動作するのかを説明しています。

詳しく言うと、本の前半はそもそもシステムコールがなんなのかの説明と、範囲の広くて重要な「プロセスの話」「ファイル入出力の話」でほぼ埋まっています。逆にそれ以外の機能については覚える量が少ないので後半に回ってるんだな、というイメージです。

最後の方では実際のシステムコールを用いて、簡易的なコマンドの実装を行うことができます。もちろんC言語でです。

カーネルやりたいとか、OSの中身を知りたいとかいう場合には興味深い書籍なのではないかと思います。(もちろん他の書籍とも併読された方が用語の理解は進むと思いますが...)

実は「30日でできるOS自作入門」(でしたっけ?)があったら欲しかったな。。。と思って本屋を眺めていたんですが、こちらもOS理論の入り口を見るためには良い(何より新しい)書籍かなと思って手に取った次第です。


straceしながら横に本を置く

買った後から気付いたんですけど、これがなかなか勉強になります。順番に読んでもボリュームが大きいので、個人的にはstraceしながら本を横に置いて勉強するのと、最後のコマンド実装を最初のほうでやっちゃうのがおすすめです。いかに簡単に手を動かすかがとっかかりとしては重要かもしれません。

straceはコマンドを指定して、中でどんなシステムコールが使われているかを見るコマンドです。いわばコマンドの解剖です。例えばnetstatコマンドが内部的にどう動いているか、解剖結果をファイルに書き込んでみましょう。

strace -o nets.txt netstat -s
more nets.txt


execve("/usr/bin/netstat", ["netstat", "-s"], [/* 48 vars */]) = 0
brk(NULL)                               = 0x555d7f954000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f56204a1000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=81583, ...}) = 0
mmap(NULL, 81583, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f562048d000
close(3)                                = 0
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300j\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=155744, ...}) = 0
mmap(NULL, 2255216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f562005a000


なんか出てきますね。読むと、一番最初に書かれているのがexecve()システムコールです。これは指定したプログラムを実行するシステムコールなので、まず最初に /usr/bin/netstat を開いてnetstat -s を実行してるのかーとかが分かるわけです。

次にbrk()システムコールが使われていますね。ここではヒープ領域の割当が行われています。自分も勉強中なんで曖昧ですけど、おそらく「netstatを実行するのに必要と思われるメモリ領域をオーバーしちゃったらこのメモリアドレスから使い始めてくださいね」って言ってます。たぶん。

要するに、このわけのわからない出力がこの本さえあれば大体読めるようになるんですよ。それはもう深海生物の生態を観察するような気分になれますよ。


簡易的なコマンドの実装が可能

重ね重ねになりますが、本の最後にはシステムコールを使ってコマンドを簡易的に実装することができる章が設けられています。もちろんそれもC言語なので、学校でプログラムの基礎をやったとか、linuxチョットデキルとか、そういう自分みたいな立場の人にはちょうどいいと思います。

ここではソースについては公開しませんが、簡易echoコマンドとかを実際に写してみるとけっこう理解が深まりますね。writeシステムコールでechoするためにどうコードを書いたらいいかとか、printfがバッファ付き関数といわれる所以とか、ひとつでもやるだけでそういうのがちゃんと分かります。

amazonでも買えます

Linuxシステムコール基本リファレンス ──OSを知る突破口 (WEB+DB PRESS plus)

Linuxシステムコール基本リファレンス ──OSを知る突破口 (WEB+DB PRESS plus)

そもそもがちょっと難しいテーマなのであれですが、linuxの基本とCの基本のところが読み書きできて、疑問をひたすら書き起こしながら読むのであれば、けっこうわかりやすいと思います。PCの中身が気になる方、ぜひどうでしょう。

Linuxでブログを書くときに使う画像編集技術

linuxで画像編集する方法ですが、windowsを使う時とはアプリもいろいろ違うので、自分である程度調べないとうまくいきません。普段こんなことしてるよっていうだけの記事ですが参考になれば。

windowsのPCやスマホとの画像データ共有

スマホで撮った絵や写真、PCで撮ったスクリーンショットを全部共有するのにクラウドを使ってます。個人的にはMicrosoft OneDriveを使います。過去に書いた記事があるので詳しくはそちらを見ていただければと思います。

Microsoft OneDriveを使ってみる - brand new note


スクリーンショットの取得

みんな使ってるんでしょうけど、linuxでスクショを撮るときはgimpを使います。そういえば最近アップデートが入ったらしいですね。スクショについては作業中のウィンドウを指定する、画面全体を指定する、選択した範囲を指定する、という3つの方法がありますが、だいたい操作は同じです。で保存する時はエクスポート。このへんの詳細は現在でもこの記事が参考になります。

CentOS7でGIMPを使ってスクリーンショットを保存したり編集したりする - いろいろやってみるにっき


画像データを縮小して軽くする

スマホで撮影した写真をそのままブログにアップロードすると、1枚3MBとかいっちゃうんですね。そんなに高画質ででかくなくてもいいよ、今月のアップロード量の制限に引っかかるし大したもの映ってないし。。。画像を縮小したいけどgimpじゃめんどい。

という悩みにはimagemagickが有効です、コマンドラインで画像編集ができます。自分はこの記事を読んでインストールしました。

CentOSにImageMagickをインストールする - Qiita

で、自分の場合スマホで撮影した写真は2976x3968になります。つまり3:4です。なのでこの比率を守りつつ、適当に縮小するコマンドを打てばいいわけですね。例を出すとこんな感じ。

convert IMG_20180501_151903.jpg  -resize 303x404 shoten3.jpg

convertコマンドで変換前の画像を指定、resizeオプションを指定してサイズを調整、別の名前で保存。変換前の画像と変換後の画像、convertコマンドなら両方残ります。

f:id:frazz:20180505201644p:plain

ちなみにコマンドで画像を表示するにはeog(eye of GNOME)コマンドを使います。この絵からちゃんとリサイズされた状態で保存できていることがお分かり頂けるかと思います。

それだけ

分かれば大したことないですが一応記事にしてみました。普段使いのlinux、初期投資こそありますがそこから先はなんでも色々勉強になるのでオススメです。


日本語入力についてざっくり調べてみる

普段CentOSでslack使って色々メモしてると、windowsIME(input method editor)に比べてありえないくらい変換ミスが多いんですね。そんな漢字の使い方しねえだろみたいなのが未だにゴロゴロしてて、中身どうなってんだと。もっとましにならんのかと。あんまり実装力はないけどさすがにこれは困るなあと。というわけで純粋に日本語入力を支える技術が気になって、とっかかりの部分を調べることにしました。


日本語入力技術の祖は40年前

www.toshiba-clip.com

www.atok.com

世界初の日本語入力対応ワープロが登場したのは40年ほど前。「JW-10」は事務机ほどの筐体で、当時の価格で630万円。当時はそもそも漢字を専用システムの画面に出力するための研究もしなければならず、日本語入力の開発は困難を極めたそうです。英語と違うので同音異義語をひとつひとつ辞書データに登録しなければならないし、最適な用語に一発で変換する為の技術開発はそこから何年もかけて行われたものなのです。


本もあるっぽい

日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

実装に向けた本ではないんですがこんなのもあるようで。2012年の本ですが、評価を見る限り流行の機械学習の入門としても良さそうです。とはいえ中身は結構難しいので読むには多少の数学力が必要です。


キーワード

そもそもなんですが、IMEの開発や変換機能というのは自然言語処理技術の応用なんだそうです。そういえば、ここ数年はスマホだけでなくPCでも予測入力機能が使いやすくなってきましたよね。あれはクラウドからネットの流行語なんかを拾ってくる技術と組み合わせることによって行われるものです。時代の波に合わせて様々な技術が組み合わされてより便利に、しかしより複雑になっているんだなあという印象を受けます。

また、現在自然言語に関する研究の最先端でホットな部分は翻訳機能で、来る東京オリンピックに向けた翻訳技術の改善が進められているようです。調べてて出てきたキーワードがこんな感じ。

自分のCentOSの変換機能の中がどうなっているのか確かめたかっただけなのに、世界は広いですね。なんだか無知すぎてだいぶしんどい。。。

Linuxの日本語入力の実装

本題に戻ります。日本語入力の実装に関する記事が全然見つからない。linuxの日本語入力の設定方法に関する記事はいくらでも出てくるのに。。。

...などと考えてたんですが、結局聞いたことのある単語をふわっとしか理解していなかったのが良くなかったみたいです。

このへんの記事が参考になりそうですね。

そもそも日本語入力を支えている技術には大きく「インプットメソッド」と「変換ツール」の2つがあります。インプットメソッドというのは、文字の種類が多すぎてキーボードが足りない現象を打破するために作られたものです。例えば「sa」って入力したら「さ」になる、これがインプットメソッドの仕事。ツールで言うとibusとかfcitxとかです。で、これだとひらがなしか打てないので入力を変換ツールに渡します。ここで「さ」が「差」になる。これをやってるのがmozcとかkkcとかAnthyです。

f:id:frazz:20180504180100j:plain

恥ずかしながら動けばいいやの精神でやってて、ここが頭の中でぐちゃぐちゃだったんでちょっとすっきりしました。自分の環境ではibusとkkcが使われています。変換ソフトの変遷については上のページにスライドが載せられていますので、そちらが参考になります。

で、実装の部分についてはここを参考にすればいいんだなということが分かりました。はあーなんでここまで来るのにこんなに時間かかっちゃったんだろ。奥が深いですね。