USP友の会、4月13日、渋谷でシェル芸勉強会に参加していないのに解い

413日、渋谷でシェル芸勉強会に参加していないのに解いてみた。

 USP友の会「413日、渋谷でシェル芸勉強会」の予習をしたい方向け
 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/201109171問目は会長の趣味ですね。

 通常は以下になるはずですが。。。

$ 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}'
1620分更新
・首相、硫黄島の遺骨収集視察
・お堀泳ぎ皇居侵入男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 '&#25105;&#12293;&#12399;&#12471;&#12455;&#12523;&#33464;&#20154;&#12384;&#12290;' | w3m -T text/html -dump
我々はシェル芸人だ。

$ cat test.pl
#!//usr/bin/perl
use utf8;
$in = '我々は宇宙人だ' ;
$in =~ s/(.)/'&#'.ord($1).';'/eg;
print $in, "\n";

$ perl test.pl
&#25105;&#12293;&#12399;&#23431;&#23449;&#20154;&#12384;

$ echo "&#25105;&#12293;&#12399;&#23431;&#23449;&#20154;&#12384;" | w3m -T text/html -dump
我々は宇宙人だ

$ sed -i s/"宇宙人"/"シェル芸人"/ test.pl
$ cat test.pl
#!//usr/bin/perl
use utf8;
$in = '我々はシェル芸人だ' ;
$in =~ s/(.)/'&#'.ord($1).';'/eg;
print $in, "\n";

$ perl test.pl
&#25105;&#12293;&#12399;&#12471;&#12455;&#12523;&#33464;&#20154;&#12384;

$ 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
#!/bin/bash -xv

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