けけずんセルフハッキング

エンジニアっぽい雰囲気を醸しだしているかのようなブログです!

「黒い画面おきなわ #1 初心者歓迎!」を開催した

先日、沖縄でゆるく勉強をやっていくグループ でじぴよ 初の主催イベント「黒い画面おきなわ #1 初心者歓迎!」を開催した。 概要、目的、登壇内容は下記のリンク先に書いてるので参照よろしく。

dejipiyo.connpass.com

ちなみに当日のTwitterのまとめはコチラ。

togetter.com

元々は身内数名で開催してピザ食べつつお酒飲みながらワイワイ楽しもうぜ、という気持ちで開いたイベント。 ノリで connpass でイベント立ててみたところ、当日に22人の方が参加してくれることになった。

当日はピザのLサイズを三枚注文して菓子類とお酒を少し多めに買いデプロイしたものの、明らかに足りてなさそうな雰囲気だったのでピザを更に二枚追加して注文した。 勉強会で追いピザとか初めてだぞ...。

f:id:kkznch:20200129215834j:plain
黒い画面おきなわ乾杯中

この人数のイベント開催するのが初めてだったので最初は不安だったが、みんな凄く楽しそうだったので本当に良かった。 また開いてほしいという声もあったので、次回も機会を見て開催したい。

f:id:kkznch:20200129222432j:plain
黒い画面おきなわ説明中

一緒に企画運営してくれたnanamicronnとおでんさんにも深く感謝、ありがとう。

/bin/sync でメモリ上のデータをディスクに書き込む

はじめに

よく分からんコマンド調べてみようシリーズ。 経緯はこちら。

kkznch.hatenablog.com

今回は /bin/sync について。

/bin/sync

mac でメモリを解放する際に使ったコマンド...と思っていたがそれは purge の方だった。 こいつは一体なんなんだ。

では man sync したときの DESCRIPTION の内容。

The sync utility can be called to ensure that all disk writes have been completed before the processor is halted in a way not suitably done by shutdown(8). Generally, it is preferable to use shutdown(8) to shut down the system, as they may perform additional actions such as resynchronizing the hardware clock and flushing internal caches before performing a final sync.

shutdown などでシステムを停止する前に、ディスクへの書き込みをする際に使用される、なんとなく分かる。 実行してみようと思ったけどどう確認すればいいんだろうか。

/bin/sync 実行してみる

とりあえず実行する。

$ sync

何も起きない。 何かしら書き込みの処理を走らせて、そのあとに sync の処理を走らせるとよさそう。

/proc/meminfo の Dirty という項目がディスクへの書き込み待ちメモリサイズを表しているらしく、dd で書き込みながら Dirty を見ればいけると思ったが、どうやら mac にはそもそも /proc/meminfo なるファイルは存在しない。 vm_stat というコマンドで同様の内容を見ることができるらしいが、 /proc/meminfo の Dirty に対応する項目がどれか分からなかった。

というわけで今回は諦めて Linux仮想マシン上で sync を試すことに。 sync の動作的には UnixLinux も同じだと思うからいいよね。

まずメモリを監視するコンソールと、ディスクへの書き込みを行うためのコンソールの二つを立ち上げる。 メモリ監視するコンソールでは以下のように watchgrep を組み合わせて Dirty を見続ける。

$ watch grep -e Dirty /proc/meminfo

Dirty:                 0 kB

つづいてディスクへの書き込みを行うコンソールで以下のコマンドを実行する。

$ dd if=/dev/zero of=test bs=1M count=1024

するとメモリサイズが一時的に増加した後、数百 kB に落ち着く。 このときに以下のように sync を実行すると、Dirty のメモリサイズが数 kB まで減少する。

$ sync

dd で書き出した後にメモリに数百 kB ほど残ったデータは果たして何なのかは分からない。 sync を実行してもメモリに数 kB 残ったので、こいつも何なのかは分からない。

そして今回思ったことは、Swap や Cache, Paging などメモリ周りの知識が曖昧だなということ。 もっと勉強してからこのコマンドに臨もう思う...。

参考リンク

qiita.com

archive.linux.or.jp

yomon.hatenablog.com

teratail.com

/bin/expr で式を評価する

はじめに

よく分からんコマンド調べてみようシリーズ。 経緯はこちら。

kkznch.hatenablog.com

今回は /bin/expr について。

/bin/expr

shell script の中で使ったことがある気がする。 しかしどういうときに使ったか記憶は定かではない。

こちら man expr したときの DESCRIPTION の内容。

The expr utility evaluates expression and writes the result on standard output.

式を評価して標準出力に書き出すと。 使ってみないと何なのか分からん。

/bin/expr 実行してみる

それっぽいものを入力してみる。

$ expr 1 + 1
2

なるほど、test コマンドみたいに条件を判定するとかそういう意味の評価と思っていたら、式を評価するってそのまんまの意味らしい。 数字と演算子の間には半角スペースを入れないとエラーになるので注意が必要っぽい。

ちなみにexpr の計算結果を変数に格納したい場合は以下のようにすると良さげ。

$ result=$(expr 1 + 2 + 3)
$ echo ${result}
6

$( ... ) はコマンド置換(Command substitution)といって括弧で括られた中のコマンドを実行してその出力を返すことができ、上記ではこれを利用して計算結果を result という変数に格納している。

/bin/expr の終了ステータスについて

以下の記事で expr の終了ステータスについて面白いことが書いてあった。 暇な人は見てね。

qiita.com

/bin/ln でリンクを作る

はじめに

よく分からんコマンド調べてみようシリーズ。 経緯はこちら。

kkznch.hatenablog.com

今回は /bin/ln について。

/bin/ln

/bn/ln はフォルダやファイルへのリンクを作成する。 リンクにはハードリンクとシンボリックリンクの二種類のリンクがあり、以下のリンク先で分かりやすく解説している。

qiita.com

こちら man ln したときの DESCRIPTION の内容。

The ln utility creates a new directory entry (linked file) which has the same modes as the original file. It is useful for maintaining multiple copies of a file in many places at once without using up storage for the copies''; instead, a linkpoints'' to the original copy. There are two types of links; hard links and symbolic links. How a link ``points'' to a file is one of the differences between a hard and symbolic link

同じ内容のファイルを大量にコピーするとストレージを無駄に食ってしまうので、そういうときはリンクして参照させるほうがよいと。 自分が ln を使うときはストレージの容量うんぬんは気にしたことがなくて、設定ファイルとか複数の場所で共有したいものをリンクさせて使っていた。

ちなみに /bin/ln/bin/link は同じコマンド。

/bin/ln 実行してみる

さっきの記事とほぼ同じことを自分で手を動かしてやってみる。

まずは origin というファイルを作り、i ノード番号を確認する。

$ ls -li
total 4
3149196 -rw-r--r--    1 root     root            21 Jan 15 08:36 origin

i ノード番号は 3149196 らしい。

ハードリンク作る

下記のコマンドでハードリンクを作る。

$ ln origin hard_link

ls で確認する。

$ ls -li
total 8
3149196 -rw-r--r--    2 root     root            21 Jan 15 08:36 hard_link
3149196 -rw-r--r--    2 root     root            21 Jan 15 08:36 origin

おー、i ノード番号が同じになった。

シンボリックリンクを作る

$ ln -s origin sym_link

ls で確認する。

$ ls -li
total 8
3149196 -rwx------    2 root     root            21 Jan 15 08:36 origin
3149197 lrwxrwxrwx    1 root     root             6 Jan 15 08:54 sym_link -> origin

i ノード番号が異なり、リンク先が origin となっているリンクが作成されたのが分かる。

補足として、このとき以下のようにリンクの権限を変更しようとすると、リンク自体ではなくリンク先の権限が変更される。

$ chmod 700 sym_link
$ ls -li
total 8
3149196 -rwx------    2 root     root            21 Jan 15 08:36 origin
3149197 lrwxrwxrwx    1 root     root             6 Jan 15 08:54 sym_link -> origin

リンクの削除について

リンクを削除するときに rm コマンドでやってしまいがち、というか rm 以外で消した記憶ない。 いちおう unlink というコマンドがあるらしいので、リンクを削除する場合は unlink コマンドを使う方がよさそう。

あと昔にリンク元がフォルダかそうでないかでリンクを削除する際にハマった記憶があるけど、何だったか忘れた。 思い出したら書く。

「すらすらと手が動くようになる SQL書き方ドリル」の付録にある SQUAT がエラーで起動しない

概要

初心に返って「すらすらと手が動くようになる SQL書き方ドリル」で SQL の勉強しようと思い付録の SQUAT を起動しようとすると、エラーが出て起動しなかった。

そのときのエラー内容と解決方法を書いておく。

環境

  • macOS Catalina (Version 10.15.2)
  • Javaのバージョンは以下の通り
$ java --version
openjdk 12.0.1 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)

エラー内容と原因

付録では起動時には予め用意されたスクリプトを実行するだけでよいと書いてあるのだが、スクリプトだと出力が /dev/null に向いており原因が特定できないため、スクリプト中のコマンドをそのまま実行した。 すると以下のエラーが出力される。

$ java -cp data:squat.jar jp.towersquest.squat.Main
(略)
Exception in thread "main" org.seasar.framework.exception.InvocationTargetRuntimeException: [ESSR0043]The target which jp.towersquest.squat.gettext.impl.GettextResourceImpl invoked is illegal, because java.util.MissingResourceException: Can't find bundle for base name jp.towersquest.squat.gettext.gettext, locale en_JP
(略)

言語設定が en_JP となっており、それが見つかっていない模様。 よく考えると自分の PC の言語設定が英語、ロケールが日本になっているので en_JP を探しにいったのかもしれない。

解決方法

というわけで、Java 実行時にオプションとして言語設定のオプションを指定してあげるだけで SQUAT が起動した。 コマンドは以下の通り。

$ java -Duser.language=ja -Duser.country=JP -cp data:squat.jar jp.towersquest.squat.Main

これでうまく動いてくれた、やったぜ。

/bin/stty で端末設定を設定 or 表示する

はじめに

よく分からんコマンド調べてみようシリーズ。 経緯はこちら。

kkznch.hatenablog.com

今回は /bin/stty について。

/bin/stty

確実に一回も実行したことないであろうコマンド。 stty だからコンソールに関連するコマンドかな。

こちら man stty したときの DESCRIPTION の内容。

The stty utility sets or reports on terminal characteristics for the device that is its standard input. If no options or operands are specified, it reports the settings of a subset of characteristics as well as additional ones if they differ from their default values. Otherwise it modifies the terminal state according to the specified arguments. Some combinations of arguments are mutually exclusive on some terminal types.

標準入力であるデバイスの端末特性を設定したり表示したりする、何を言っているのかよく分からない。

とりあえず実行して動きを見る。

/bin/stty 実行してみる

よし何が起きるのか分からんけど実行する。

$ /bin/stty
speed 38400 baud;
lflags: echoe echok echoke echoctl pendin
iflags: iutf8
oflags: -oxtabs
cflags: cs8 -parenb
erase
^H

実行したけど何が起きたのか分からなかった。 端末の転送速度とか特殊文字に関する設定が出力されてるだけかな。

linuxjm.osdn.jp

ここを見るに、文字を削除したときやプロセスをkillしたときの表示形式などが出力されてるっぽい。 ほぼ触ることがなさそうなコマンドだ...。

ちなみにコンソールの表示がおかしくなったときは stty の設定がおかしくなってる可能性があるので、以下のコマンドを実行して stty の設定を初期化してあげるとよいらしい。

$ stty sane

qiita.com

/bin/dd でデータをブロック単位でコピーする

はじめに

よく分からんコマンド調べてみようシリーズ。 経緯はこちら。

kkznch.hatenablog.com

今回は /bin/dd について。

/bin/dd

Linux の iso イメージを USB フラッシュメモリに書き込む際に使った記憶がある。 それ以外で使った記憶がない。

なんかディスクに書き込んでるんだろうな〜というぐらいの認識だった。 こちら man dd したときの DESCRIPTION の内容。

The dd utility copies the standard input to the standard output. Input data is read and written in 512-byte blocks. If input reads are short, input from multiple reads are aggregated to form the output block. When finished, dd displays the number of complete and partial input and output blocks and truncated input records to the standard error output.

標準入力を標準出力にブロック単位でコピーするらしい。 だいたい認識通りだった。

オプションで入力元や出力先、入出力のブロック単位を変更できる。

/bin/dd と /bin/cp の違いは?

他サイトからの引用。

dd コマンドは入力から出力へデータをコピーするコマンドである。cp コマンドはファイルからファイルにコピーするだけであるが、dd コマンドはファイルからデバイス、デバイスからファイル、デバイスからデバイスへのコピーも可能なため、ディスクのバックアップやダンプにも使用できる。

x68000.q-e-d.net

dd コマンドはファイルシステム上のファイルだけでなく、ブロックデバイスに直接アクセスできます。

teratail.com

/bin/dd はデバイスにごそっと出力、 /bin/cp はファイルのコピー、なるほど。

/bin/dd 実行してみる

基本的な構文はこれ。 細かいオプションはマニュアルを読もう。

$ /bin/dd if=入力元 of=出力先

if で入力元、 of で出力先を指定する。 どちらもデバイスまたはファイルを指定できる。 なお if を指定しない場合は標準入力が入力元、 of を指定しない場合は標準出力が出力先になる。

試しにファイルを対象に dd 実行してみる。

$ /bin/dd if=hoge.txt of=fuga.txt
0+1 records in
0+1 records out
15 bytes transferred in 0.000072 secs (208326 bytes/sec)

$ diff -s hoge.txt fuga.txt
Files hoge.txt and fuga.txt are identical

dd で hoge.txt から fuga.txt をコピーして、diff でファイルの内容が同一であることが確認できた。 ただファイルのパーミッションやタイムスタンプまではコピーされないっぽい。

注意点

出力先にデバイスを指定するとそのまま書き込まれちゃうので、実行する際は注意が必要かも。 他サイトでも危険とか書いてるとこあるし。

news.mynavi.jp