コピペコードで快適生活

明日使えるソースを自分のために

初めの方のシェル芸勉強会メモ

初めの方の問題見たらとてもピュアだった。

2012年10月27日 Hbstudy#38

ファイルの一括変換

# カレントディレクトリの中から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

Uspstudy20121208qonly

条件でデータを抽出

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するので)

ndenvを使ってNode.jsをインストールする

ずっとnvm使っていたのだけど、プロジェクトディレクトリ移動するたびに手動でバージョン切り替えるのがさすがに辛くなってきたので、ndenvに乗り換えました。

インストール

# clone
git clone https://github.com/riywo/ndenv ~/.ndenv

# パスを通す
続きを読む

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は先に削除しておく