初めの方のシェル芸勉強会メモ
初めの方の問題見たらとてもピュアだった。
ファイルの一括変換
# カレントディレクトリの中からUtilの文字をHogeに変えてDesktopに保存する。 # ※basenameはディレクトリ名を除外したファイル名を返すコマンド grep -r "Util" ./. 2> /dev/null | gsed 's/:..*$//' | while read f; do gsed 's/Util/Hoge/' $f> ~/Desktop/$(basename $f); done
集計
# 数値範囲でグルーピングして集計する cat /dev/urandom | gtr -dc 0-9 | fold -w 2 | gsed 's/^0//' | head -n 100000 > ages cat ages | gawk '{print int($1 / 10)}' | sort -n | uniq -c | gawk '{print $2*10"-"$2*10+9,$1}' 0-9 9961 10-19 9805 20-29 9813 30-39 10137 40-49 10026 50-59 10198 60-69 10144 70-79 9888 80-89 10025 90-99 10003
条件でデータを抽出
cat hoge a 12 a 13 b 13 a 432 b 111 b 43 cat hoge | gawk '{if(a[$1] < $2){a[$1] = $2}}END{for(i in a){print i, a[i]}}' # awkで配列の中身を出力 for(i in array) { print i, a[i] }
条件でデータを集計
cat num2 a 1 b 2 3 4 a 5 6 b 7 8 9 10 cat num2 | gawk '{for(i=2; i<=NF; i++){a[$1]+=$i}}END{for(i in a){print i,a[i]}}' a 12 b 43
曜日ごとの集計
01/01の曜日を各年ごとに集計
seq 1990 2020 | gawk '{print $1 "0101"}' | while read i; do gdate -d $i '+%w'; done | sort | uniq -c | gawk '{print $2, $1}' # 曜日を算出(0が日曜日) gdate -d YYYYMMDD '+%w'
ファイルの比較
# file2から、file1にない要素を取り出す diff <(sort file1.txt) <(sort file2.txt) | grep '>' | gsed -e 's/> //' # 標準入力同士の diff diff <(command1) <(command2)
RubyのThreadメモ
まずは超簡単なところから。
n = 1 # この記述に至った時点で非同期で実行開始される t1 = Thread.new do puts "t1 start" puts "t1 n is #{n}" n = 2 sleep 5 puts "t1 end" end t2 = Thread.new do puts "t2 start" sleep 5 puts "t2 n is #{n}" # => 2 スレッド間で変数は共有される puts "t2 end" end # joinメソッドを呼ぶと、 # スレッドの処理が終了するまで以下の処理が実行されない t1.join t2.join
ActiveSupport::CallbacksでRubyクラスにコールバックを差し込む
ActiveRecordじゃなくてもコールバックは使えるんやで。
class Article include ActiveSupport::Callbacks define_callbacks :before_submit set_callback :before_submit, :before, :validation def validation puts 'Check!!!' end def submit puts 'SubmitStart' run_callbacks :before_submit do puts 'Submitting....' end puts "SubmitEnd" end end Article.new.submit # SubmitStart # Check!!! # Submitting.... # SubmitEnd
第37回シェル芸勉強会メモ
https://b.ueda.tech/?post=20180901_shellgei_37 にて学んだことメモ。
Q1
FizzBuzzのアニメーション
seq 100 | gsed '0~3s/.*/Fizz/;0~5s/.*/Buzz/;0~15s/.*/FizzBuzz/' | # 0~3s みたいな書き方で3行ごとに置換を行う gawk '{printf("%08s\n", $1)}' | # 8桁で右揃えにする while read line; do clear; echo $line; sleep 0.5; done # でもこれだと右揃え表示されない...
Q2
echo ' /\' | sed ':a p;s@ /@/ @;b a' | head -n 4 | sed '$a ̄ ̄ ̄ ̄' | sed '3s;/ ;/ 👁 ;'
sedで何やっているのかわからないので、プロに教えていただいた。
# aコマンドで指定行のあとに文字列を差し込める。 # $a だと最終行に差し込む echo "hoge" | gsed '1a\fuga' hoge fuga # sの後につけた文字がデリミタになる # @を使った例 echo '//' | gsed 's@/@pp/@' pp// # sedで無限ループ # :aはラベル pは出力 # s@hoge@hogehoge@ で 置換(デリミタを@にしている) # bはラベルジャンプの意味。なので、b a でaラベルへジャンプ echo "hoge" | gsed ':a p;s@hoge@hogehoge@;b a' | head -n 5 hoge hogehoge hogehogehoge hogehogehogehoge hogehogehogehogehoge # 3sとやると3行目だけ置換する echo "hoge" | gsed ':a p;s@hoge@hogehoge@;b a' | head -n 5 | gsed "3s/hoge/fuga/g" hoge hogehoge fugafugafuga hogehogehogehoge hogehogehogehogehoge
Q3
3桁の中に同じ数がなく、各桁を足すと15になる数字。ゼロは含まない。
これは簡単。
seq -w 999 | grep -v "0" | gawk -v FS="" '($1!=$2 && $2!=$3 && $1 + $2 + $3 == 15){print $1$2$3}'
補足
seq -w 999 # これでゼロパディングできる gawk -v FS="" {} # これで1文字ごとに区切れる。
ActiveRecordのafter_commitが発火するとき発火しないとき
発火する
・なにも変更せずにsaveしても発火する(select文しかないtransactionでcommitがされるため)
・destroyで発火する。self.destroyed?はtrue, self.reloadでActiveRecord::RecordNotFound
・soft_destroyでも発火する。self.soft_destroyed?はtrue (kakurenbo-puti使用時)
・他のafter_commitがこけても発火する。
発火しない
・update_columnでは発火しない(トランザクションはっていないからcommitもない)
・validationエラー時はひっかからない(commitじゃなくてrollbackするので)
・DBエラー(unique制限)でrollbackしたときは発火しない(commitじゃなくてrollbackするので)
Homebrewのコマンドメモ
ちゃんとわかっていない感あったのでメモ。
## インストールされたformulaの一覧 brew list ## アンインストール brew uninstall FORMULA_NAME ## 更新のあるformulaを見る brew outdated ## 古いバージョンのformulaを削除 brew cleanup brew cleanup -n # 何が消されるのか一覧を表示する。 ## brew本体のアップデート brew update ## formulaのアップデート brew upgrade FORMULA_NAME ## formulaの情報見る brew info FORMULA_NAME ## tap(追加)したリポジトリの一覧 brew tap ## tapする/外す brew tap ユーザー名/リポジトリ名 brew untap ユーザー名/リポジトリ名 # このリポジトリでインストールしたformulaは先に削除しておく