ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

SoftwareDesign 7月号復習

はじめに

読んだので気になった部分をメモ。

特集:理論&応用でシェル力の幅を広げる

第1章 シェル初心者から中級者への次に一歩

パイプやリダイレクトの話が中心でした。が、論理演算の&&と||はあらためてなるほどと思いました。

よく見りゃ当たり前なんですが、&&は両方真でないとtrueにならない、だから前コマンドが失敗したときは次のコマンドは実行されない。前コマンドが成功したとき"だけ"後コマンドが実行されるわけですね。

そして||は前コマンドが成功した場合は全体として真になるので、後コマンドは実行されない。つまり前コマンドが失敗したときのみ後コマンドが実行されます。

よく考えればそうなんだけど、なるほどなぁと感心しました。

ちなみに僕は普段fishを使ってるんですが&&使えません。

第2章 シェルスクリプト初心者から中級者への次の一歩

タイトル同じやん。

シェル哲学についてですね。

  1. 成否は終了ステータスで返す
  2. 成功したときは何も表示しない
  3. 失敗したときは静かなエラー
  4. エラーは標準エラー出力に出力する
  5. フィルタとパイプを意識する
  6. bashに依存しているのに#!/bin/shと書かない

特に6は僕も最近引っかかったので明示的に#!/bin/bashと書くようにしています。

ただ、失敗したときは静かなエラー、例としてcpで存在しないファイルをしていしたときの「No such file or directory」をあげていますが、例えばgitなんかはコマンド間違いのときていねいに「もしかしてこれじゃない?」と教えてくれたり「たぶんpullしないといけないよ」って言ってくれますよね。コマンドを組み合わせて使うことを考えるとエラーは静かな方がいいかもしれませんが、親切なのも助かりますね。

第3章 しくみを知れば、bashは怖くない

bashはシェルの一種。そしてシェルはOSを操作するためのベースのインターフェイスだということを体感するために、phpインタラクティブモードをデフォルトシェルにしてみるお話。

ただのプログラミング言語の一種なんだよーということをわかってもらう記事ですね。

ビルトインコマンドと外部コマンドの違いを確認しておきます。

whichやpwdは外部コマンドで、cdはビルトインコマンドのようです。

vagrant@docker:~$ which cd
vagrant@docker:~$ which which
/usr/bin/which
vagrant@docker:~$ which pwd
/bin/pwd

typeで確認できます。

vagrant@docker:~$ type cd
cd is a shell builtin
vagrant@docker:~$ type pwd
pwd is a shell builtin
vagrant@docker:~$ type which
which is hashed (/usr/bin/which)

pwdはどっちやねん。

vagrant@docker:~$ help
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

 job_spec [&]                                                   history [-c] [-d offset] [n] or history -anrw [filename] or>
 (( expression ))                                               if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS;>
 . filename [arguments]                                         jobs [-lnprs] [jobspec ...] or jobs -x command [args]
 :                                                              kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... >
 [ arg... ]                                                     let arg [arg ...]
 [[ expression ]]                                               local [option] name[=value] ...
 alias [-p] [name[=value] ... ]                                 logout [n]
 bg [job_spec ...]                                              mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C >
 bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u nam>  popd [-n] [+N | -N]
 break [n]                                                      printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]                              pushd [-n] [+N | -N | dir]
 caller [expr]                                                  pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac     read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N>
 cd [-L|[-P [-e]] [-@]] [dir]                                   readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [->
 command [-pVv] command [arg ...]                               readonly [-aAf] [name[=value] ...] or readonly -p
 compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action]>  select NAME [in WORDS ... ;] do COMMANDS; done
 compopt [-o|+o option] [-DE] [name ...]                        set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
 continue [n]                                                   shift [n]
 coproc [NAME] command [redirections]                           shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilnrtux] [-p] [name[=value] ...]                source filename [arguments]
 dirs [-clpv] [+N] [-N]                                         suspend [-f]
 disown [-h] [-ar] [jobspec ...]                                test [expr]
 echo [-neE] [arg ...]                                          time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [name ...]                   times
 eval [arg ...]                                                 trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [arguments ...]] [redirection >  true
 exit [n]                                                       type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] or export -p                   typeset [-aAfFgilrtux] [-p] name[=value] ...
 false                                                          ulimit [-SHabcdefilmnpqrstuvxT] [limit]
 fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [comm>  umask [-p] [-S] [mode]
 fg [job_spec]                                                  unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMANDS; done                   unset [-f] [-v] [-n] [name ...]
 for (( exp1; exp2; exp3 )); do COMMANDS; done                  until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name () { COMMANDS ; }         variables - Names and meanings of some shell variables
 getopts optstring name [arg]                                   wait [-n] [id ...]
 hash [-lr] [-p pathname] [-dt] [name ...]                      while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]                                      { COMMANDS ; }

helpで表示されるものがビルトインコマンドなんですね。

ビルトインコマンドはbashから直接実行されていることをpsで確かめています。

第4章 じつはこんな機能があった!bashの新機能、便利機能

bashのバージョンとか全然意識してないですね。vagrantで作ったubuntuで確認してみます。

vagrant@docker:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
vagrant@docker:~$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

4.3.48です。2016年9月に4.4がリリースされたと書かれていますね。

|&で標準出力と標準エラー出力をまとめてパイプに出せるのは使いそうです。shoptで有効にできるglobster、failglob、autocdは何でしょうか。

globsterは*以下をすべて再帰マッチする。autocdはディレクトリ名を入力したときcdの引数とみなす、faillobはパターンマッチしなかったときに失敗とみなす。

他にもいろいろあるみたいで、別の機会に見ておきたい。

コプロセス

絶対子プロセスだと思った。co-process。ざっくりいうとコマンドを立ち上がりっぱなしにする、サーバ化するもののようです。coprocコマンドで検索したほうがでますね。ループでなんども同じコマンドを実行するときに検討できる機能とのこと。使わないだろうな。。。

参考

第5章 意外と使える!? Bash on Ubuntu on Windows

Windows10の機能であるbash on windowsについて。仕事ではWindows10なんですがこの機能使えないんですよね。プライベートだとmacなので、もちろん使わない。記事によるとだいたいのことが問題なくできる、とのことです。

ハッシュ関数を使いこなしていますか?後編

ハッシュアルゴリズムの安全性指標を復習しておきましょう。

衝突困難性

同じハッシュ値を持つ2つのデータを見つけることが難しいという性質

原像計算困難性

ハッシュ値から元のデータを算出することが難しいという性質

第2原像計算困難性

あるデータがあったときに、そのデータのハッシュ値と同じハッシュ値を持つほかのデータを見つけることが難しいという性質

また、データベースのキーからハッシュでurlを生成するときの注意はなるほどと思いました。キーをハッシュ化しているということは、連番になっているので、1つわかれば全てのキーが推測可能になります。対策として、ソルトを足してやることが大切です。

また、パスワードに関しては、ソルトを使ったとして「よく使われるパスワード」であれば同じハッシュ値が生成されてしまいます。このときはユーザ名など、キー固有の値をソルトに使うことで推測を困難にさせることができます。

レッドハット系ソフトウェア最新解説 コンテナを使ってみよう

Red Hat Summit2017が7月にあり、OpenShiftが注目を浴びたとのこと。OpenShiftとは?

Docker、kubernetesの上にのるコンテナプラットフォームのようです。

http://jp-redhat.com/openeye_online/column/omizo/4093/

おわりに

雑誌ははやく読んで、インプットの入り口にしないといけない。買うはいいけどためがちなのではやめの消化を今後も心がけたい。