■4月13日、渋谷でシェル芸勉強会に参加していないのに解いてみた。
USP友の会「4月13日、渋谷でシェル芸勉強会」の予習をしたい方向け
http://d.hatena.ne.jp/labunix/20130325
20130413シェル芸勉強会スライド
http://www.slideshare.net/ryuichiueda/20130406-18763665
■AWKユーザ会のスライドでは、以下の3つがポイント。
・「xargs」に「-PN」でもできるけど、
「-P0 -n1」を渡して並列を強制するといいよというお話。
・HTMLのヘッダのサイズを参考に分割取得しましょう。
・calコマンドのカレンダーを土日祝日で色をつけましょう。
USP 友の会 LT 資料 20130413
http://fr.slideshare.net/HirofumiSaito/usp-lt-20130413
■上記の「2つ目」を攻撃に利用したのが「Apache Killer」でした。
1つめの並列は面白いけど、私は使いません。
3つめは私の場合、GoogleカレンダーをExchange経由でiPodTouchに同期しているので、
デフォルトのカレンダーで充分だったりします。
Lenny 侵入検知システムsnortでApachekillerを検出
http://d.hatena.ne.jp/labunix/20110917
■1問目は会長の趣味ですね。
通常は以下になるはずですが。。。
$ echo "my.favorite.jk/index.cgi#jk,会長のブログ
index.cgi.com/index.cgi?p=index.cgi,aho" | \
awk -F\, '{print "<a href=\""$1"\">"$2"</a>"}' | sed s%/"index.cgi\|#jk"%%g
<a href="my.favorite.jk">会長のブログ</a>
<a href="index.cgi.com?p=index.cgi">aho</a>
問題通りにやると以下ですか。。。
$ echo "my.favorite.jk/index.cgi#jk,会長のブログ
index.cgi.com/index.cgi?p=index.cgi,aho" | \
awk -F\, '{print "<a href=\""$1"\">"$2"</a>"}' | sed s/index.cgi//
<a href="my.favorite.jk/#jk">会長のブログ</a>
<a href=".com/index.cgi?p=index.cgi">aho</a>
■2問目は難しく考えない方向で。。。
$ echo '
<a href="http://www.aho.com">
アホどっと混む
</a>
<a href="#top">トップへ</a>
<a href="http://www.jk.jp">"JK"</a>' | grep href | awk -F\" '($2>="http*") {print $2}'
http://www.aho.com
http://www.jk.jp
■3問目は整形と言うからにはこうなんでしょうね。。。
$ echo '
<table>
<tr>
<td>a</td><td>b</td>
</tr>
</table>' | \
sed s/"^ *\|\t"//g | sed s%"</td>"%"&\n"%g | grep -v "^\$" | \
sed s/"<td>"/"\t&"/g | \
sed s%"<table>"%"<html><head><title>hoge</title></head><body>\n&"% | \
sed s%"</table>"%"&\n</body>\n</html>"%
<html><head><title>hoge</title></head><body>
<table>
<tr>
<td>a</td>
<td>b</td>
</tr>
</table>
</body>
</html>
■4問目は更新時間も分かるといいですね。。。
$ w3m -dump http://yahoo.co.jp | grep "・\|更新" | awk '{print $1}'
16時20分更新
・首相、硫黄島の遺骨収集視察
・お堀泳ぎ皇居侵入男2人逮捕
・美術品守る「猫警備員」称賛
・仏で「大物ギャング」が脱獄
・2歳王者ロゴタイプが皐月賞V
・ウッズ「失格騒動」も動じず
・引退続々フィギュアの未来は
・「5分アニメ」急増の理由写
■同様の問いとしては以下のようなものがあります。
bashで人気言語アンケートサイトの結果をcsvに変換してみる
http://d.hatena.ne.jp/labunix/20120324
$ w3m -dump 'http://news.ycombinator.com/item?id=3746692' | \
grep -B 1 "[0-9] points\$" | sed s/"^ *\|\[grayarrow\] \| points"//g | \
sed s/" "/"__"/g | \
for list in `xargs`;do echo -ne "\"$list\",";done | \
sed s/"[0-9]\","/"&\n"/g | sed s/",\$"//g | sed s/"__"/" "/g | \
sort -t\" -k 4 -nr | head -10 | nl | sed s/"^ *"//g | sed s/"\t"/","/g
1,"Python","3059"
2,"Ruby","1724"
3,"JavaScript","1418"
4,"C","972"
5,"C#","831"
6,"PHP","668"
7,"Java","553"
8,"C++","533"
9,"Haskell","519"
10,"Clojure","462"
Distrowatchから過去6ヶ月のディストリビューションの人気Top100を一覧する。
http://labunix.hateblo.jp/entry/20130402/1364902833
$ w3m -t 1 -dump_source http://distrowatch.com/ 2>&1 | \
grep -A 1000 ">Page Hit Ranking<" | \
grep -B 1000 '<\/table>' | \
w3m -T text/html -dump | \
grep -A 101 " Rank " | \
awk '{print $1","$2}' | \
grep ^[R0-9] | head -10
Rank,Distribution
1,Mint
2,Mageia
3,Ubuntu
4,Fedora
5,Debian
6,openSUSE
7,Arch
8,PCLinuxOS
9,Puppy
■5問目は入力が面倒。。。
$ echo '我々はシェル芸人だ。' | w3m -T text/html -dump
我々はシェル芸人だ。
$ cat test.pl
use utf8;
$in = '我々は宇宙人だ' ;
$in =~ s/(.)/'&#'.ord($1).';'/eg;
print $in, "\n";
$ perl test.pl
我々は宇宙人だ
$ echo "我々は宇宙人だ" | w3m -T text/html -dump
我々は宇宙人だ
$ sed -i s/"宇宙人"/"シェル芸人"/ test.pl
$ cat test.pl
use utf8;
$in = '我々はシェル芸人だ' ;
$in =~ s/(.)/'&#'.ord($1).';'/eg;
print $in, "\n";
$ perl test.pl
我々はシェル芸人だ
$ perl test.pl | w3m -T text/html -dump
我々はシェル芸人だ
■6問目は、うーん、CGIを準備するのが面倒くさいが、
たまたま(?)localhostだけで待ちうける「bash cgi」があった。
githubにも置いてある。
SquidGuardのクエリを受け取るbash/CGI
http://d.hatena.ne.jp/labunix/20120827
$ netstat -an | grep "\:80 "
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN
$ grep "redirect.*localhost" /etc/squid/squidGuard.conf | sed s/"^ *\|^\t*"//g
redirect http://localhost/cgi-bin/squidGuard.cgi?url=%u&clientaddr=%a
■debianのapach2のcgiディレクトリのデフォルトは以下。
$ grep cgi /etc/apache2/sites-available/default
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
$ ls /usr/lib/cgi-bin/
squidGuard.cgi
■以下のようにする。
$ echo '#!/bin/bash -xv
echo "Content-type: text/htm"
echo ""
echo "あなたのポストしたデータは"
dd bs=$CONTENT_LENGTH
echo ""
echo "です。"
exit 0
' | sudo tee /usr/lib/cgi-bin/hoge.cgi
echo "Content-type: text/htm"
echo ""
echo "あなたのポストしたデータは"
dd bs=$CONTENT_LENGTH
echo ""
echo "です。"
exit 0
$ sudo chmod 755 /usr/lib/cgi-bin/hoge.cgi
$ curl --data a="こんにちは世界" "http://localhost/cgi-bin/hoge.cgi"
あなたのポストしたデータは
a=こんにちは世界
です。
■問題7は、本日の最高気温の取得ということで、gooから。
$ w3m -dump "http://weather.goo.ne.jp/area/4410.html" 2>&1 | \
grep "最高気温" | awk '{print $2"度"}'
21度
■問題8は画像の取得。
ごめん。画像要らないw。。。
「xargs echo | nkf -f50」を「xargs wget」すると良いです。
$ curl -L "http://yahoo.co.jp/hl" 2>/dev/null | nkf | \
sed s/"<"/"\n&"/g | sed s/">"/"&\n"/g | \
grep -i 'img.*src' | sed s/".*src=\""//g | sed s/"\".*"//g | \
sort -u | xargs echo | nkf -f50
http://k.yimg.jp/images/clear.gif http://k.yimg.jp/
images/games/2.0/images/recommend/2012/1114_05.jpg
http://k.yimg.jp/images/games/2.0/images/recommend/
2012/1213_02.jpg http://k.yimg.jp/images/games/2.0/
images/recommend/2013/0315_02.jpg http://k.yimg.jp/
images/games/2.0/images/recommend/2013/0315_03.jpg
http://k.yimg.jp/images/icon/photo.gif http://k.yimg.
jp/images/new2.gif http://k.yimg.jp/images/premium/
contents/pc/v1/campaign/softbank/2013/spring/images/
0328/mac_50x50.gif http://k.yimg.jp/images/sicons/
box16.gif http://k.yimg.jp/images/sicons/ybm161.gif
http://k.yimg.jp/images/top/calender2.gif http://k.
yimg.jp/images/top/mail1.gif http://k.yimg.jp/images/
top/sp/cgrade/icon_login.gif http://k.yimg.jp/images/
top/sp/cgrade/icon_point.gif http://k.yimg.jp/images/
top/sp/cgrade/icon_premium.gif http://k.yimg.jp/images/
top/sp/cgrade/info_btn.gif http://k.yimg.jp/images/
top/sp/cgrade/logo5.gif http://news.c.yimg.jp/images/
topics/20130414-00000030-jijp-000-view.jpg
■私からは以下のようにするのが実用的かな。。。
以下は「apt-get」で取得できるのだけど。。。
「sort -u」の後に「xargs wget」に渡す。
ローカルでDebianのドキュメントを閲覧する方法
http://d.hatena.ne.jp/labunix/20101113
$ wget -O - "http://www.debian.org/doc/maint-guide/index.ja.html" 2>/dev/null | \
sed s/"<"/"\n&"/g | sed s/">"/"&\n"/g | \
awk -F\" '{print $2}' | sed s/"#.*"//g | \
grep '\.html' | sort -u | \
sed s%^%"http://www.debian.org/doc/maint-guide/"%g
http://www.debian.org/doc/maint-guide/advanced.ja.html
http://www.debian.org/doc/maint-guide/build.ja.html
http://www.debian.org/doc/maint-guide/checkit.ja.html
http://www.debian.org/doc/maint-guide/dother.ja.html
http://www.debian.org/doc/maint-guide/dreq.ja.html
http://www.debian.org/doc/maint-guide/first.ja.html
http://www.debian.org/doc/maint-guide/modify.ja.html
http://www.debian.org/doc/maint-guide/start.ja.html
http://www.debian.org/doc/maint-guide/update.ja.html
http://www.debian.org/doc/maint-guide/upload.ja.html
■問題9はクローリング
「苦労人ing」とはまた別のお話。
これも要らないので、答えのまま+標準出力に流しておしまい。
$ wget -O - -r http://yahoo.co.jp 2>/dev/null | w3m -dump -T text/html
■10問目が無いので、私からは以下を試してもらいたい。
wgetとcurlでWinXP+IE8でアクセスしているように見せかける。
http://labunix.hateblo.jp/entry/20130404/1365085284