読者です 読者をやめる 読者になる 読者になる

labunix's blog

labunixのラボUnix

OSS-DB Goldの例題、OSSDB道場コラム取得のワンライナー

■OSS-DB Goldの例題、コラム取得のワンライナー
 以下の改良版

 ■OSS-DB Goldの例題をダウンロードして一ファイルにまとめるワンライナー
 http://labunix.hateblo.jp/?page=1411910051

$ BASE="http://www.oss-db.jp/measures/"; \
  for target in \
    sample_gold_management.shtml \
    sample_gold_monitoring.shtml \
    sample_gold_performance.shtml \
  ;do \
    wget -O - "${BASE}${target}" 2>/dev/null | \
    # Q.で始まる例題ページを取得 \
    # ただし、コメントにある存在しないリンクは除外 \
    grep "<em>Q." | lv -s | grep -v "★★" | awk -F\" '{print $2}'
  done | \
    for list in `xargs`;do \
      # .shtml を .txt に変換して保存 \
      w3m -dump "${BASE}${list}" | grep -v "  English\|ブックマークに登録\|Silver出題範囲\|Gold出題範囲" \
        > `echo "$list" | sed s/".shtml"/".txt"/`; \
  done; \
  for next in gold_sample*.txt;do \
    # page break \
    for n in `seq 1 80`;do echo -n "#";done;echo; \
    # all line \
    TOTAL=`wc -l "$next" | awk '{print $1}'`; \
    # header \
    HEAD=`nl -ba "${next}" | \
      grep "HOME" | \
      awk '{if($1>0&&$1<30){print $1+0}}'`; \
    # footer \
    TAIL=`nl -ba "${next}" | \
      grep "受験対策\$" | \
      awk '{if($1>20&&$1<125){print $1}}' | awk '{print $1+0}'`; \
    # main \
    tail -n "$((${TOTAL}-${HEAD}-1))" "${next}" | \
      head -n "$((${TAIL}-${HEAD}-2))"
    # for Check \
    echo "TOTAL=${TOTAL},HEAD=${HEAD}+1,TAIL=${TAIL},THIS=$((${TAIL}-${HEAD}-2))" >&2; \
  done > ossdb_gold.log
TOTAL=194,HEAD=26+1,TAIL=95,THIS=67
TOTAL=178,HEAD=26+1,TAIL=79,THIS=51
TOTAL=180,HEAD=26+1,TAIL=81,THIS=53
TOTAL=170,HEAD=26+1,TAIL=71,THIS=43
TOTAL=180,HEAD=26+1,TAIL=81,THIS=53
TOTAL=223,HEAD=26+1,TAIL=124,THIS=96
TOTAL=212,HEAD=26+1,TAIL=113,THIS=85
TOTAL=211,HEAD=26+1,TAIL=112,THIS=84
TOTAL=177,HEAD=26+1,TAIL=78,THIS=50
TOTAL=220,HEAD=26+1,TAIL=121,THIS=93
TOTAL=206,HEAD=26+1,TAIL=107,THIS=79
TOTAL=192,HEAD=26+1,TAIL=93,THIS=65
TOTAL=211,HEAD=26+1,TAIL=112,THIS=84
TOTAL=201,HEAD=26+1,TAIL=102,THIS=74
TOTAL=198,HEAD=26+1,TAIL=99,THIS=71
TOTAL=166,HEAD=26+1,TAIL=67,THIS=39
TOTAL=171,HEAD=26+1,TAIL=72,THIS=44
TOTAL=174,HEAD=26+1,TAIL=75,THIS=47
TOTAL=175,HEAD=26+1,TAIL=76,THIS=48
TOTAL=172,HEAD=26+1,TAIL=73,THIS=45
TOTAL=171,HEAD=26+1,TAIL=72,THIS=44
TOTAL=174,HEAD=26+1,TAIL=75,THIS=47
TOTAL=168,HEAD=26+1,TAIL=69,THIS=41
TOTAL=173,HEAD=26+1,TAIL=74,THIS=461473行

$ wc -l ossdb_gold.log 
1473 ossdb_gold.log

■24問

$ grep "^##*\$" ossdb_gold.log  | wc -l
24

■問題数以上の重複行

$ sort ossdb_gold.log | uniq -c | sort -nr | awk '($1>=24){print}'
    420 
     2624 例題
     24 ※この例題は実際のOSS-DB技術者認定試験とは異なります。
     24 ################################################################################
     24     ませんのでご了解ください。
     24   • 採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
     24   • 今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい
     24   • その他の例題解説
     24   • ご質問・ご意見はこちら
     24   • ※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えでき

■ページ区切りの前後で集計。

$ grep -4 "^##*\$" ossdb_gold.log | grep -v "^$\|^\-\-\$" | grep ^G | \
    sort | uniq -c | awk '{sum+=$1;print};END{print "合計:"sum}'
      1 Goldの例題解説「パフォーマンスチューニング - チューニングの実施」
      1 Goldの例題解説「パフォーマンスチューニング - ディスクI/Oの分散」
      1 Goldの例題解説「パフォーマンスチューニング - 性能に関するパラメータ」
      1 Goldの例題解説「パフォーマンスチューニング - 性能に関係するパラメータ(ロック管
      1 Goldの例題解説「パフォーマンスチューニング - 性能に関係するパラメータ」
      1 Goldの例題解説「運用管理 - データベースの構造(プロセス構造)
      1 Goldの例題解説「運用管理 - データベースの構造」
      2 Goldの例題解説「運用管理 - データベースサーバ構築」
      1 Goldの例題解説「運用管理 - ホットスタンバイ運用」
      1 Goldの例題解説「運用管理 - 運用管理コマンド全般 - PITR」
      3 Goldの例題解説「運用管理 - 運用管理用コマンド全般」
      1 Goldの例題解説「性能監視 - oid2name」
      1 Goldの例題解説「性能監視 - pg_locks」
      2 Goldの例題解説「性能監視 - アクセス統計情報、関連パラメータ」
      2 Goldの例題解説「性能監視 - アクセス統計情報」
      3 Goldの例題解説「性能監視 - クエリ実行計画」
      1 Goldの例題解説「性能監視 - テーブル/カラム統計情報」
合計:24
■出題範囲別

$ grep -4 "^##*\$" ossdb_gold.log | grep -v "^$\|^\-\-\$" | grep ^G | \
    awk '{print $1}' | \
    sed s/"Goldの例題 解説「"//g | sort | uniq -c  | \
    awk '{sum+=$1;print};END{print "合計:"sum}'
      5 パフォーマンスチューニング
      9 運用管理
     10 性能監視
合計:24

■残るのはtxtのみ。

$ ls gold_sample_1* | column -c 80
gold_sample_111115_01.txt	gold_sample_130807_01.txt
gold_sample_111130_01.txt	gold_sample_130807_02.txt
gold_sample_111227_01.txt	gold_sample_130910_01.txt
gold_sample_120210_01.txt	gold_sample_140307_01.txt
gold_sample_120210_02.txt	gold_sample_140307_02.txt
gold_sample_120314_01.txt	gold_sample_140417_01.txt
gold_sample_130401_01.txt	gold_sample_140417_02.txt
gold_sample_130402_01.txt	gold_sample_140530_01.txt
gold_sample_130510_02.txt	gold_sample_140702_01.txt
gold_sample_130619_01.txt	gold_sample_140702_02.txt
gold_sample_130704_01.txt	gold_sample_140812_03.txt
gold_sample_130704_02.txt	gold_sample_140812_04.txt

■OSS-DB道場の「オススメ!OSSB-DB情報」解説を取得する。

$ BASE="http://www.oss-db.jp/measures/"; \
  for n in `seq -w 01 20`;do \
    w3m -dump ${BASE}dojo_${n}.shtml | grep -v "ブックマークに登録" > dojo_${n}.txt; \
  done; \
  for next in dojo_*.txt;do \
    # page break \
    for n in `seq 1 80`;do echo -n "#";done;echo; \
    # all line \
    TOTAL=`wc -l "$next" | awk '{print $1}'`; \
    # header \
    HEAD=`nl -ba "${next}" | \
      grep "認定教材" | \
      head -n 1 | awk '{if($1>0){print $1+0}}'`; \
    # footer \
    TAIL=`nl -ba "${next}" | \
      grep "OSS-DB道場に戻る" | \
      tail -n 2 | awk '{if($1>20&&$1){print $1}}' | awk '{print $1+0}'`; \
    # main \
    tail -n "$((${TOTAL}-${HEAD}-1))" "${next}" | \
      head -n "$((${TAIL}-${HEAD}-2))"
    # for Check \
    echo "TOTAL=${TOTAL},HEAD=${HEAD}+1,TAIL=${TAIL},THIS=$((${TAIL}-${HEAD}-2))" >&2; \
  done > ossdb_dojo.log
TOTAL=215,HEAD=24+1,TAIL=111,THIS=85
TOTAL=201,HEAD=24+1,TAIL=97,THIS=71
TOTAL=182,HEAD=24+1,TAIL=78,THIS=52
TOTAL=232,HEAD=24+1,TAIL=128,THIS=102
TOTAL=209,HEAD=24+1,TAIL=105,THIS=79
TOTAL=214,HEAD=24+1,TAIL=110,THIS=84
TOTAL=201,HEAD=24+1,TAIL=97,THIS=71
TOTAL=261,HEAD=24+1,TAIL=157,THIS=131
TOTAL=221,HEAD=24+1,TAIL=117,THIS=91
TOTAL=223,HEAD=24+1,TAIL=119,THIS=93
TOTAL=206,HEAD=24+1,TAIL=102,THIS=76
TOTAL=196,HEAD=24+1,TAIL=92,THIS=66
TOTAL=306,HEAD=24+1,TAIL=202,THIS=176
TOTAL=208,HEAD=24+1,TAIL=104,THIS=78
TOTAL=215,HEAD=24+1,TAIL=111,THIS=85
TOTAL=224,HEAD=24+1,TAIL=120,THIS=94
TOTAL=228,HEAD=24+1,TAIL=124,THIS=98
TOTAL=191,HEAD=24+1,TAIL=87,THIS=61
TOTAL=183,HEAD=24+1,TAIL=79,THIS=53
TOTAL=262,HEAD=24+1,TAIL=158,THIS=132

■行数

$ wc -l ossdb_dojo.log | awk '{print $1,"行"}'
1798 行

■コラム数

$ grep "^##*\$" ossdb_dojo.log  | wc -l | echo " `xargs` "20 回

■コラム数以上の重複行は、各コラムの区切りのみ。

$ sort ossdb_dojo.log | uniq -c | sort -nr | awk '($1>=20){print}'
    320 
     20 ################################################################################

■見出しのリスト

$ grep -A 10 "^##*\$" ossdb_dojo.log | grep "^" | awk '{print $0};END{print "合計:"NR}'1回 トランザクションについて
第2回 文字列リテラル
第3回 SQL と引用符
第4回 バックアップとリストア、リカバリ
第5回 データ型
第6回 シーケンス
第7回 テキストファイル(CSVなど)の入出力
第8回 NULLって何?
第9回 SELECT 文の FROM 句の省略
第10回 レプリケーションについて(その1)11回 レプリケーションについて(その2)12回 デッドロックについて
第13回 表別名と列別名
第14回 トランザクションログ
第15回 スキーマ
第16回 権限管理
第17回 日付の計算
第18回 データベースクラスタ
第19回 SELECT文のLIMITとOFFSET
第20回 RDBMSの種類によるUPDATE文の仕様の違い
合計:20

■OSS-DB道場の「OSS-DB入門」解説を取得する。
 ※画像を取得しないので、読み物だけで良いという人向け。

$ BASE="http://www.oss-db.jp/measures/"; \
  for n in `seq -w 01 12`;do \
    w3m -dump ${BASE}dojo_info_${n}.shtml | grep -v "ブックマークに登録" > dojo_info_${n}.txt; \
  done; \
  for next in dojo_info_*.txt;do \
    # page break \
    for n in `seq 1 80`;do echo -n "#";done;echo; \
    # all line \
    TOTAL=`wc -l "$next" | awk '{print $1}'`; \
    # header \
    HEAD=`nl -ba "${next}" | \
      grep "認定教材" | \
      head -n 1 | awk '{if($1>0){print $1+0}}'`; \
    # footer \
    TAIL=`nl -ba "${next}" | \
      grep "OSS-DB道場に戻る" | \
      tail -n 2 | awk '{if($1>20&&$1){print $1}}' | awk '{print $1+0}'`; \
    # main \
    tail -n "$((${TOTAL}-${HEAD}-1))" "${next}" | \
      head -n "$((${TAIL}-${HEAD}-2))"
    # for Check \
    echo "TOTAL=${TOTAL},HEAD=${HEAD}+1,TAIL=${TAIL},THIS=$((${TAIL}-${HEAD}-2))" >&2; \
  done > ossdb_dojo_info.log
TOTAL=311,HEAD=24+1,TAIL=207,THIS=181
TOTAL=359,HEAD=24+1,TAIL=255,THIS=229
TOTAL=348,HEAD=24+1,TAIL=244,THIS=218
TOTAL=386,HEAD=24+1,TAIL=282,THIS=256
TOTAL=395,HEAD=24+1,TAIL=291,THIS=265
TOTAL=461,HEAD=24+1,TAIL=357,THIS=331
TOTAL=344,HEAD=24+1,TAIL=240,THIS=214
TOTAL=376,HEAD=24+1,TAIL=272,THIS=246
TOTAL=363,HEAD=24+1,TAIL=259,THIS=233
TOTAL=395,HEAD=24+1,TAIL=291,THIS=265
TOTAL=324,HEAD=24+1,TAIL=220,THIS=194
TOTAL=383,HEAD=24+1,TAIL=279,THIS=253

■行数

$ wc -l ossdb_dojo_info.log | awk '{print $1"行"}'
2897行

■コラム数

$ grep "^##*\$" ossdb_dojo_info.log | awk 'END{print NR"回"}'
12回

■重複行

$ sort ossdb_dojo_info.log | uniq -c | awk '($1>=12){print}'
    805 
     12 ################################################################################
     12 2002年にオークニーを設立し、代表取締役に就任。マッピング・ GIS・LBS・ITS関連プ
     12 Geospatial財団日本支部の代表者を務めるなど、FOSS4G(オープンソース地理空間ソフ
     12 OSS-DB入門
     1712 アドバイザー:
     12 トウェア)の普及活動に取り組んでいる。
     12 ピング』(Tyler Mitchell原著;オライリー・ジャパン発行)の翻訳、Open Source
     12 ロジェクトのビジネスコンサルティングを経て、現在は会社経営の傍ら、『入門Webマッ
     12 監修:
     12 執筆:
     12 森亮氏 株式会社オークニー代表取締役(LPI-Japanビジネスパートナー)

■コラムの目次

$ grep -A 7 "^##*\$" ossdb_dojo_info.log | grep "^" | awk '{print $0};END{print "合計:"NR}'1回 PostgreSQLのインストール
第2回 ユーザ管理とセキュリティ
第3回 データベースとテーブルの作成
第4回 データベースの正規化
第5回 SQL基礎I
第6回 SQL基礎II
第7回 トランザクション
第8回 バックアップ・リストア
第9回 パフォーマンス・チューニング(前編)10回 パフォーマンス・チューニング(後編)11回 Webアプリケーションとの連携(前編)12回 Webアプリケーションとの連携(後編)
合計:12