install(1)コマンドが便利だった件
はじめに
install(1)
という、cp
とmkdir
とchmod
を同時に行うような便利コマンドがあることを知りました。
(忘れちゃいましたが、何かのMakefileを見ているときに存在に気付きました)
これを使うと、プロビジョニングなどのスクリプトが簡潔に書けるようになりそうです。
……というわけで使い方のメモがてらまとめてみます。
manの内容まとめ
install
はBSD版とGNU版があるようですが、ここではGNU版について書きます。
BSD版ではいくつかのオプションが使用できません。(-D
はなかったと思う)
ちなみにmacの場合は標準でBSD版のinstall
が入っており、Coreutilsを入れるとGNU版のinstall
が使えるようになります。
4種類の使い方
install [OPTION]... [-T] SOURCE DEST
SOURCE
をDEST
にコピーする。-T
を付けると、DEST
をファイルとして扱う
install [OPTION]... SOURCE... DIRECTORY
- 複数の
SOURCE
ファイルをDIRECTORY
ディレクトリへコピーする
- 複数の
install [OPTION]... -t DIRECTORY SOURCE...
- 複数の
SOURCE
ファイルをDIRECTORY
ディレクトリへコピーする
- 複数の
install [OPTION]... -d DIRECTORY...
- ディレクトリを作成する(複数可)
その他のオプション(良さげなのを抜粋)
-D
- コピー先のディレクトリが存在しない場合、ディレクトリを作成する
mkdir -p
みたいな感じ
-o 所有者
- コピー先の所有者を変更する
chown
みたいな感じ
-g グループ
- コピー先の所有グループを変更する
chown
みたいな感じ
-m パーミッション
- コピー先のパーミッションを変更する
chmod
みたいな感じ
-S SUFFIX
- コピー先が上書きになる場合、ファイル名の最後に
SUFFIX
を付けてバックアップする
- コピー先が上書きになる場合、ファイル名の最後に
-Z
- コピー先のSELinuxセキュリティコンテキストを設定する
- (※マニアックかよ)
使用例
authorized_keysのセットアップ
今までこう書いていたものが…
mkdir /home/hoge/.ssh chmod 700 /home/hoge/.ssh cp authorized_keys /home/hoge/.ssh/authorized_keys chmod 600 /home/hoge/.ssh/authorized_keys chown -R hoge:hoge /home/hoge/.ssh
こう書けます。
install -o hoge -g hoge -m 700 -d /home/hoge/.ssh install -o hoge -g hoge -m 600 authorized_keys /home/hoge/.ssh/authorized_keys
すっきりしましたね!
まとめ
なぜ今までこんな便利なものに今まで気付かなかったのか……
第26回シェル芸勉強会 大阪サテライト」レポート
12/25(日)に東京で行われた「jus共催 第8回初心者の方角に向いて講師が喋るシェル勉強会(初心者向けとは言ってない)/第26回シェル芸勉強会及びエクシェル芸勉強会」について、今回も大阪でサテライトしました!
※すみません、年末年始忙しすぎ&インフルエンザでレポートがめっちゃ遅れました……
イベント情報
東京(本家)
- 問題:【問題のみ】第26回シェル芸勉強会及びエクシェル芸勉強会 – 上田ブログ
- 模範解答付き:【問題と解答】第26回シェル芸勉強会及びエクシェル芸勉強会 – 上田ブログ
- togetter:jus共催 第8回初心者の方角に向いて講師が喋るシェル勉強会(初心者向けとは言ってない)/第26回シェル芸勉強会及びエクシェル芸勉強会 - Togetterまとめ
今回も、大阪(私達)と、福岡でサテライト会場がありました。
大阪サテライト
福岡サテライト
atnd.org ぱぴろん(@papiron)さんによるまとめ papiro.hatenablog.jp
大阪サテライトレポート
会場のようす
午前
今回、午前の部は私用で欠席していたので、午前の内容については他の方のレポを見てくださいです。
おひる
昼休みから参加しました。大阪サテライトでは、@t_motookaさんによって、「CVE番号クイズ」「バイナリを詠む会」「エクシェル芸の予習」などがゲリラ実行されました。
特にエクシェル芸の予習は、午後の部の問題を特に当たって非常に役立ちました。ありがとうございます!
CVE番号クイズが始まる大阪 #シェル芸
— くんすと (@kunst1080) 2016年12月25日
バイナリチラ見せツールで、まったりとバイナリを詠む会が開催されている。。。 https://t.co/SwOfzt3Br5 #シェル芸
— nmrmsys (@nmrmsys) 2016年12月25日
大阪では急遽 @t_motooka さんを講師に、Excelのファイルフォーマットについての予習始まりましたw #シェル芸 #大阪会場
— くんすと (@kunst1080) 2016年12月25日
sheet1のセル一覧 #シェル芸
— T.Motooka (@t_motooka) 2016年12月25日
$ unzip -p test1.xlsx xl/worksheets/sheet1.xml | sed 's/<\/c>/<\/c>@/g' | sed 's/<c/@<c/g' | tr '@' '\n' | grep '^<c'
Excelに同じ文字列をたくさん書く時、セル参照を使うより直接同じ文字列をコピペするほうがコストが小さい #シェル芸 #大阪会場
— くんすと (@kunst1080) 2016年12月25日
大阪サテライト、エクシェル芸の予習をした上での学び
— T.Motooka (@t_motooka) 2016年12月25日
・同じ文字列を複数のセルに突っ込むと、文字列は再利用される
・"=A1" のように文字列セルを参照すると、計算結果がキャッシュされるのでファイル上では再利用されないことになる(冗長なデータになる)#シェル芸
午後
エクシェル芸(泡を吹いて死亡
あまりにもえげつないから、今回はシェルスクリプトOK! #シェル芸
— T.Motooka (@t_motooka) 2016年12月25日
今日は本当に死にました。 #シェル芸
— Ryuichi Ueda (@ryuichiueda) 2016年12月25日
※詳細はtogetterの方を参照です。
LTのようす
いつもな感じのやばい大阪勢のLTです。今回はUstreamで配信もして頂けました!(録画はナシです)
#シェル芸 #大阪会場 本日のLTは配信されます!!
— くんすと (@kunst1080) 2016年12月25日
フェンリルさんありがとうございます!!!!
nmrmsys(@nmrmsys) さん 「Excelでもコマンド実行がしたい!」
いつもの「ExSQell」のお話ですね。今回は新機能として「セル範囲リダイレクト」が追加されたようです。リポジトリはこちら → GitHub - mikkun/gnucash-util-jp: 日本の商慣習下でGnuCashを使うためのツール
AWS EC2 上の実行結果をローカルの Excel シート上に持ち帰ってくる技術! #シェル芸 #大阪
— T.Motooka (@t_motooka) 2016年12月25日
くんすと(@kunst1080) 「Hyper™でエキサイティングなシェル芸ライフ」
Hyperというターミナルエミュレータを使って楽しくシェル芸しましょう、という話です。Hyperの公式サイトはこちら → Hyper™
— so (@3socha) 2016年12月25日
ハイパーパワープラスつよそうw #シェル芸
— nmrmsys (@nmrmsys) 2016年12月25日
so(@3socha) さん 「FUSE で繋がる世界」
FUSEを使ってGoogleカレンダーのファイルシステムを実装したという話です。予定を探すときにfindとかgrepとかが使えて便利そう!
GmailFS 気になるw #シェル芸
— nmrmsys (@nmrmsys) 2016年12月25日
シェル芸人御用達のスケジューラw #シェル芸
— nmrmsys (@nmrmsys) 2016年12月25日
CLIからGoogleカレンダーを検索・参照 #シェル芸 #大阪 pic.twitter.com/TjmFINCsNf
— くんすと (@kunst1080) 2016年12月25日
このときTweetした意味不明の仕組みが、実際に実装されたという変態(褒め言葉)的なお話! #シェル芸https://t.co/se4PANzeDl
— T.Motooka (@t_motooka) 2016年12月25日
FUSEでキミだけのオリジナルファイルシステムを作ろう! #シェル芸
— nmrmsys (@nmrmsys) 2016年12月25日
MSR(@msr386) さん 「漢字バナー芸」
toliet(1)で、漢字を表示するために漢字フォントを作るという話です。実際の手順の説明と、デモを見せて頂きました。
つよい #シェル芸 #大阪 pic.twitter.com/JopzquJeCu
— くんすと (@kunst1080) 2016年12月25日
makefont.c を追加して CJK 統合漢字エリアを追加して libcaca をビルド、ライブラリをインストールして、toilet コマンドの表現力を上げる努力#シェル芸 #大阪
— so (@3socha) 2016年12月25日
手軽に漢字バナー芸
— 日柳 光久 (@mikkun_jp) 2016年12月25日
printf "<?xml version='1.0' encoding='UTF-8'?>\n<svg><text font-size='28'>漢字OK</text></svg>" | convert - pbm:- | pbmtoascii#シェル芸 pic.twitter.com/LRVvFcxEjT
社畜(9か月)(@null_ref_eng) さん 「画面を(^o^)/で埋め尽くす謎のワンライナー」 ※延長線
LTで発表したワンライナーです echo "___\\\\(^o^)/___オワタ___" | sed ':a;p;s/\(.\)\(.*\)/\2\1/;/^a/!b a' | xargs -I{} toilet -F border --gay {} #シェル芸 #大阪
— 社畜(9か月)@ぬるり (@null_ref_eng) 2016年12月25日
滅茶苦茶面白いことをされていたので、半ば強引に発表していただきましたw 無理言ってすみませんでした…
大阪参加者が凄いバナー芸を隠し持っていたのが発覚したのでLT再開w #シェル芸
— T.Motooka (@t_motooka) 2016年12月25日
やばい #シェル芸 #大阪 pic.twitter.com/XGIJjyuFTj
— くんすと (@kunst1080) 2016年12月25日
#シェル芸 #大阪 pic.twitter.com/dOTg1EVa8W
— くんすと (@kunst1080) 2016年12月25日
今回も面白いLTをたくさん発表していただいてありがとうございました!! 次回もモリモリ発表してくださいねっ!
まとめ
上田会長、東京・福岡・大阪の皆様、お疲れ様でした。
フェンリル様、会場使わせて下さってありがとうございました!
次回もまたよろしくお願いします!!
JavaScriptのsetTimeoutが使いにくいのでヘルパーを書こうという話
第一引数に関数が来てるのが使いにくさの原因なので、引数の順番をひっくりかえしたヘルパーを作成します。
function delay(time, func) { setTimeout(func, time); }
こうしておくと、こんなコードが
setTimeout(function() { console.log("hoge"); }, 1000);
こう書けます。
delay(1000, function() { console.log("hoge"); });
補足
ちなみにCoffeeScriptで書くと
delay = (time, func) -> setTimeout(func, time) delay 1000, -> console.log "hoge"
となって見やすいです。
FreeBSDでDockerやってみた
この記事はFreeBSD Advent Calendar 2016の23日目の記事として公開されました。
はじめに
数年前まで私は、FreeBSDだいすきおじさんでした。Jailで仮想環境をたくさん作ったり、flavourを作ったり、flavourを管理するツールを作ったり*1、ワンライナーでインストールしたり*2……など、充実したFreeBSDライフを楽しんでいました。 しかし、Dockerという非常に便利なツールが現れました。DockerはLinuxでしか動作しませんが、非常にパワフルで簡単で、そして何より実用的でした。私はFreeBSDというOSが大好きではありましたが、その便利さには抗えず、結果的にFreeBSDから離れることとなってしまいました。。。
しかし、そう。今ではFreeBSDでもDockerは動くらしいのです。 (Docker - FreeBSD Wiki)
その答えを求め我々は南米へ……は飛ばずに、検証してみようと思います。
環境のセットアップ
仮想環境でFreeBSDを起動
2015年6月時点ではFreeBSD 11-CURRENT
が推奨されていたようですが、今では11.0-RELEASE
がリリースされていますので、こちらで検証します。
最近は仮想環境にHyper-Vを使っているので、今回はHyper-v用のVHDファイルをダウンロードしてきてそのまま利用することにします。
$ curl -LO ftp://ftp2.jp.freebsd.org/pub/FreeBSD/releases/VM-IMAGES/11.0-RELEASE/amd64/Latest/FreeBSD-11.0-RELEASE-amd64.vhd.xz
$ 7z x FreeBSD-11.0-RELEASE-amd64.vhd.xz
VHDファイルが解凍できたので、適当にHyper-Vへインポートします。
SSHサーバの起動
とりあえずネットワークにはDHCPを使うようにして、sshdを起動します。
最近は直接/etc/rc.conf
を編集するのではなく、sysrc
コマンドを使うものらしいです。
$ sysrc sshd_enable="YES" $ sysrc ifconfig_hn0="DHCP"
あとは/etc/sshd/sshd_conf
などを適当に設定してsshdを起動します。
sshでログインしましょう。
Dockerのインストール
公式サイトの内容(https://wiki.freebsd.org/Docker)に沿って進めます。
zfsの準備
$ kldload zfs $ kldstat $ dd if=/dev/zero of=/usr/local/dockerfs bs=1024K count=4000 $ zpool create -f zroot /usr/local/dockerfs $ zpool list $ zfs list $ zfs create -o mountpoint=/usr/docker zroot/docker $ zfs list
結果
※再マウントするときはzfs mount zroot/docker
Dockerをセットアップ
Dockerのインストール
$ pkg install docker-freebsd ca_root_nss
Bash利用のためにfdデバイスを作成
$ echo ' fdesc /dev/fd fdescfs rw 0 0' >> /etc/fstab $ mount -t fdescfs fdesc /dev/fd
Dockerをサービス登録&起動
$ sysrc docker_enable="YES" $ service docker start
dockerのバージョン確認
$ docker version
Docker動かしてみる
Ubuntu
ひとまずUbuntuを。
$ docker search ubuntu
$ docker pull ubuntu
$ docker run ubuntu uname -a
いろいろ遊んでみます。
$ docker run -it ubuntu bash
$ apt update
apt update
がエラーになる……
CentOS
そして、公式にも書いてあるCentOSを。
$ docker search centos
$ docker pull centos:6 $ docker run centos uname -a
いろいろ遊んでみます。
$ docker run -it centos:6 bash
$ echo nameserver 8.8.8.8 >> /etc/resolv.conf $ yum update $ yum install -y bc $ echo 9 + 7 | bc
FreeBSD
なぜかFreeBSDのコンテナもある
$ docker search freebsd
$ docker pull lexaguskov/freebsd
$ docker run lexaguskov/freebsd uname -a
いろいろ遊んでみます。
$ docker run -it lexaguskov/freebsd tcsh
$ echo nameserver 8.8.8.8 >> /etc/resolv.conf $ pkg update $ pkg install -y sl $ sl
Jenkins
遊んでばかりでもアレなので、最後にJenkinsの公式イメージをホストしてみます。
$ docker search jenkins
$ docker pull jenkins:alpine $ docker run -p 8080:8080 jenkins:alpine
ああああああああ………もうちょい勉強が必要ですね。。。
参考URL
リファクタリングのための回帰テストをシェルスクリプトでさくっと書こう
この記事はShell Script Advent Calendar 2016の20日目の記事として公開されました。
昨日は@MasWagさんの「Tech Hack: 最近見た不思議なシェルスクリプトを直してみた」でした。 シェルスクリプトは「知ってる・知らない」で長さもわかりやすさも全然違ってしまうということがよくわかる記事でした。
また、
良く考えてみて下さい。ただ再帰的に処理をするためだけにわざわざ気合を入れてawkでパースする必要があるなら誰かが便利な道具を作っているはずです。
ということを書かれていますが、こういう考え方は非常に重要だと私も思っています。
はじめに
ここでは、シェルスクリプトを使った、WEBアプリケーションのリファクタリング時の回帰テストについて書きます。 シチュエーションとしては以下の様なものを想定しています。
- 対象は、サーバサイドレンダリングを扱うWEBアプリケーション
- 言語は特に問わない(JavaでもPHPでもrubyでも、テンプレートエンジンを使っているものは何にでも適用可)
- バックエンド処理のリファクタリングをしている
- リファクタリング作業によって、バックエンドの処理は効率化するが、フロントエンドには全く影響を与えたくない
こういったときに、想定外の変更をしてしまっていないか、コードを修正しながら対応前後の画面を目で見て確認するか、Seleniumなどを使って自動テストを行うかと思います。しかしここでシェルスクリプトを書くことによって、フロントエンドに影響を全く与えないこと、与えたとしてもどんな影響を与えたのかということが簡単にわかるようになります。
用意するもの
- 変更前のWEBアプリケーションの実行環境
- 変更後(開発中)のWEBアプリケーションの実行環境
どうやって?
簡単です。両方のWEBアプリケーションに対して、curl
してdiff
します。
簡単なスクリプトですが、ざっくりこんな感じです。
#!/bin/sh curl http://対応前のWEBアプリケーション/hogehoge > before.html curl http://対応後のWEBアプリケーション/hogehoge > after.html echo ---------- diff before.html after.html ---------- diff before.html after.html
後はログイン処理を挟み込むなり、いろんなページを列挙するなりしてアレンジすれば、自分だけの最強のインテグレーションテストシェルスクリプトが完成します。 もちろんGETだけではなくPOSTで検証することもできるので、いろいろやってみるといいと思います。
実際に自分が仕事で使っているものでは、ログインしたり登録処理をしてみたり……なんていうものもありますが、その辺りは環境ごとに違うコードになるかと思います。
短いですがこの辺で。アイデアだけ投げつけて終了です。
次は@nmrmsysさんです。いつもLTで発表されているアレの話かな???
第8回大阪Jenkins勉強会へ行ってきました
一般&LTで参加してきました。 さらりとまとめます。
イベント情報
- 2016/12/10 (土) 14:00~17:00 (18:00)
- 第8回大阪Jenkins勉強会 - connpass
本編
なが~いお付き合い Jenkins おじさん - 僕と会社と Jenkins
- 発表者: @srz_zumixさん
- 資料: なが~いお付き合い Jenkins おじさん - 僕と会社と Jenkins
個人開発での利用、会社での利用のお話が聞けました。
「iutest が利用しているサービス」のページがとても参考になりそうです。
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜
- 発表者: @kazuhito_mさん
- 資料: JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
www.slideshare.net
たくさん笑わせていただきました。
「わかる」「それな」「うんうん」っていう感じの感想です。
最後の
「JenkinsとDocker」ってどうなんすかね?良い感じです?
知らんけど、オレは使うよ!
このスタンスは凄く良いと思ったし好きですね!
組み込みソフト開発(カーナビ)とJenkinsの活用について、あとAGLについて
- 発表者: 日下部雄一さん
AGL(Automotive Grade Linux)に関する発表でした。
AGLについては本当に何も知らなかったので、食い入るように聴いていました。 物理層に近い方の業界でも使われてるという話、非常に興味深いです。
LT
Jenkinsでやってみてよかったこと・やめておいたほうが良かったこと
- 発表者: @kunst1080
- 資料: 第8回大阪jenkins勉強会LT Jenkinsでやってみてよかったこと・やめておいたほうが良かったこと
www.slideshare.net
自分で使っていく中で得たグッドノウハウ・バッドノウハウを共有しました。
本番DBとテストDBのスキーマ比較はマジ便利なのでオススメです。
何を血迷ったか発表時間が5分のところを勘違いして15分用の資料を作ってきてしまって駆け足で喋り倒して10分で終わらせました(超過
第8回大阪Jenkins勉強会LT: iOS vs CI
- 発表者: @Posaune さん
- 資料: 第8回大阪Jenkins勉強会LT: iOS vs CI
www.slideshare.net
フォントがゴジラ……
MEMO
※他の方のLTはタイトルをちゃんと控えてなかったので資料が公開されてきたら追記しますね。
ビルドが進む度にゴジラが近づいてくるやつ面白かったですw
ビルドにもライブ感はだいじ!
sshでログインせずにknown_hostsを登録する方法
ホスト名example.com
へsshするためのknown_hostsレコードの登録方法は以下の通り。
ssh-keygen -R example.com ssh-keyscan -H example.com >> ~/.ssh/known_hosts
ssh-keygen -R <ホスト名>
で、~/.ssh/known_hosts
からそのホスト名のエントリを削除できます。ssh-keyscan -H <ホスト名>
で、known_hosts
用にハッシュ化したホスト名のデータを出力できます。
こうやって登録しておくと、sshで初めてログインするときでもAre you sure you want to continue connecting (yes/no)?
とか言われません。
蛇足
ちなみにこれをワンライナーにすると以下の通り。
echo example.com | while read L; do ssh-keygen -R $L; ssh-keyscan -H $L >> ~/.ssh/known_hosts; done
または
echo example.com | xargs -I@ echo "ssh-keygen -R @; ssh-keyscan -H @ >> ~/.ssh/known_hosts" | sh
以上。
参考
man ssh-keyscan
man ssh-keygen