Shell, Python, Perl, Sed & Awk Scripts

CotEditor.app 用の Syntax Colorings file を作成しましたので、宜しければどうぞ (遣り掛けの儘 出來上がってない ;-p)。

  • CSS-3.plist : CSS 2.1 は対応出来たと思うので CSS3 を追加中。@document を Outline Menu に丈け追加して Syntax の方を忘れてゐたので修正。
  • CSS-Balance.plist : 括弧の Balance を確認する為丈けのモノ。
  • ECMAScript.plist : ECMAScript
  • Ferite.plist : Ferite
  • Gawk.plist : @include, isarray, patsplit, FPAT, BEGINFILE, ENDFILE 等を追加。数値と文字の定義が同じになってたのを修正。括弧の Balance を考慮して Coloring してくれないので commands に括弧を含めない様に。 詳しい Manual は info gawk で読めます。
  • Gsed.plist : 詳しい Manual は info gsed で読めます。
  • HTML5.plist : 中身が HTML4 の儘、名前丈け HTML5 だったのですが、少し対応しました。
  • HyperCard.plist : HyperTalk を書く時には User { Command, Function } 名には lower_snake_case, 組み込みの物は CamelCase を使う様に心掛けてゐますので、それに合わせてあります。Keyword が Coloring されない場合は、初期設定: シンタックス: スタイルを選択: HyperCard: 編集 で該当項目の RE (Regular Expression) と IC (Ignore Case) に Check を入れてください。
  • Icon.plist : Icon
  • Lua.plist : Lua
  • Pascal.plist: Pascal Central
  • Perl5.plist : 「『コメント』の設定が空になってゐると『文字列』の Coloring が行われない」という Bug(?) が (v1.0.1 には) ある様なので修正。序でに特殊変数が多過ぎて重かったので削除、幾つか足りない Keyword を追加。
  • Python3.plist : Back Quote 文字列(使った事ないけど)が定義されてない上に、他の文字列の定義が機能してないので、正規表現をやめてみたら Ignore Case が設定出来ない。不便。
  • RSS2.0.plist : RSS 2.0 Specification (version 2.0.1)
  • TclTk.plist : Tcl/Tk
  • Whitespace.plist @2011-04-01 : Whitespace
  • Z-Shell.plist : Zsh - The Z Shell

File Name が Default の物と重複しない様に変更しました。

あと、 Plain Text でも URI 丈け色を付けたい時の其れ也にいい加減な Regexp: (?:ftps?|gopher|mailto|news|s?https?):[\x21\x23-\x3B\x3D\x3F-\x7E]+

足りない物は 踊るサボテン工房 | Mac | CotEditor のシンタックス定義 で、見付かるかも。

あれれ、何時の間にか 公式に Link されてゐました。出来損ないばっかりなのに、大丈夫でしょうか……。まぁ、使う側でどうにかして貰うしか仕方ないか。

~/Library/Application\ Support/TextWrangler/Unix\ Support/Unix\ Filters に在る Script が中々アレなので書き換えてみる事に。

#!/usr/bin/perl -w
use strict;
my %seen;
while (<>) {
    chomp;
    $seen{$_}++;
}
foreach (sort keys %seen) {
    print $_, "\n";
}

色々と冗長。Hash 名は default を使い、chomp をしなければ print丈けに、更に後置き記法を使って

#!/usr/bin/perl -w
use strict;
$_{$_}++ while <>;
print sort keys %_;

でも、これでも長過ぎる。普通は

#!/bin/sh
sort -u "$@"

こんだけで済む。というより何故こうしなかった?

#!/usr/bin/perl -w
my $i = 0;
while(<>)
{
    $i++;
    print sprintf("%4d: ",$i), $_;
}

全く必要ない変数を使ったりもあるけど、print sprintf てなんや!?

#!/usr/bin/perl -w
use strict;
printf "%4d: $_", $. while <>;

何故か Error になる……、変な Bug やねぇ。で、これも

#!/bin/sh
/usr/bin/nl -b t <"$@"
# or
cat -b "$@"

perl 使わんでしょう、普通。

#!/usr/bin/env python
import fileinput
import string
unshifted = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
shifted   = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'
rot13_table = string.maketrans(unshifted, shifted)
for my_line in fileinput.input():
    print string.translate(my_line, rot13_table),

冗長過ぎる。 unshifted って string.ascii_letters を態々手作業で生成してるし。

#!/usr/bin/env python
import fileinput
import string
a_m = string.ascii_lowercase[:13] + string.ascii_uppercase[:13]
n_z = string.ascii_lowercase[13:] + string.ascii_uppercase[13:]
for _ in fileinput.input():
    print string.translate(_, string.maketrans(a_m + n_z, n_z + a_m)),

書き換えてもやっぱり長い。ROT13 なんて態々 Python 持ち出す程の事ではない。

#!/bin/sh
/opt/local/bin/nkf -r "$@"
# or
tr a-zA-Z n-za-mN-ZA-M <"$@"

Sample Scripts

云々、別に此れと云って何も無いんでアレですが。

一應 shebang (Script の 1 行目) の記述を分けています。

Mac OS (Classic) 丈け
#! MacJGAwk
#! MacPerl
#! SedMac
#! perl
汎用
#!/opt/local/bin/* (MacPorts)
#!/usr/bin/env * (env 任せ。python では標準?)
#!/usr/bin/* (System Default)
#!/usr/local/bin/perl (多分 CGI 用)

Shell Script

Twitter に投稿された畫像丈け見るというのが、一寸丈け面倒臭いのでちょちょいとやっつけてみた(雜)。

#!/usr/bin/env zsh
[ $# -gt 0 ] || { echo "Usage: $0:t https://twitter.com/{*ID*}"; exit; }
for u in "$@";
do
    u=${u#*twitter.com/}; u=${u%%/*};
    curl -sSL "https://twitter.com/$u/media" | tr '"' '\n' | grep 'pbs\.twimg\.com/media/' | sed 's/:[a-z]*$//';
done |
sort -u |
while read u; do curl -L $u\:orig -o $u:t; done;

んで、畫像が Instagram のだと更に面倒臭い。

#!/usr/bin/env zsh
[ $# -gt 0 ] || { echo "Usage: $0:t https://twitter.com/{*ID*}"; exit; }
for u in "$@";
do
    u=${u#*twitter.com/}; u=${u%%/*};
    curl -sSL "https://twitter.com/$u" | tr -s '"' '\n' | grep 'instagram\.com/p/';
done |
sort -u |
while read u;
do
    curl -sSL "$u" | grep _sharedData | tr -s ',' '\n' | grep '\(display\|video\)_url' | tr -s '"' '\n' | grep '_n\.';
done |
sed 's/\\u0026/\&/g' |
sort -u |
while read u; do curl -L $u -o ${u%\?*}; done;

Instagram の方の Account から取ってくる丈けなら簡単になるかと思ったら、まぁそんなでもないけど。

#!/usr/bin/env zsh
[ $# -gt 0 ] || { echo "Usage: $0:t https://www.instagram.com/{*OWNER_USERNAME*}/"; exit; }
for u in "$@";
do
    u=${u#*instagram.com/}; u=${u%%/*};
    curl -sSL "https://www.instagram.com/$u/" | grep _sharedData |
    perl -ple 's/^.*?"shortcode":[[:blank:]]*"//; s/"shortcode":[[:blank:]]*"/\n/g; s/",.*$//gm' |
    while read id;
    do
        curl -sSL https://www.instagram.com/p/$id/ | grep _sharedData | tr ',' '\n' |
        grep '\(display\|video\)_url' | tr -s '"' '\n' | grep '_n\.';
    done;
done |
sed 's/\\u0026/\&/g' |
sort -u |
while read u; do curl -L $u -o ${u%\?*}; done;

らじる★らじる NHKネットラジオ

識別信号 で地方局を選択出来る様になってゐたので変更。

あと、録音して聞けない儘だと何の番組だったか判らなくなってきたので File name に文字列を追加出来る様にも。

9月に入った途端、以前の Stream が使えなくなりましたが、だらだらと作業してたら対応出来たのが今頃に。

#!/usr/bin/env zsh
[ $# -gt 1 ] || {
    echo "Usage: $0:t (r1|r2|fm) MINUTES [bk(osaka)|ck(nagoya)|fk(hiroshima)|
        hk(sendai)|ik(sapporo)|lk(fukuoka)|zk(matsuyama)|ak(tokyo)]? [TITLE]?";
    exit;
}
case ${1:l} in
(r2)                X=( 511929 ak );;
(r1) case ${3:l} in
    (bk|osaka)      X=( 512291 bk );;
    (ck|nagoya)     X=( 512072 ck );;
    (fk|hiroshima)  X=( 512086 fk );;
    (hk|sendai)     X=( 512075 hk );;
    (ik|sapporo)    X=( 512098 ik );;
    (lk|fukuoka)    X=( 512088 lk );;
    (zk|matsuyama)  X=( 512103 zk );;
    (ak|tokyo|*)    X=( 511633 ak );;
    esac;;
(fm|*) case ${3:l} in
    (bk|osaka)      X=( 512070 bk );;
    (ck|nagoya)     X=( 512074 ck );;
    (fk|hiroshima)  X=( 512087 fk );;
    (hk|sendai)     X=( 512076 hk );;
    (ik|sapporo)    X=( 512100 ik );;
    (lk|fukuoka)    X=( 512097 lk );;
    (zk|matsuyama)  X=( 512106 zk );;
    (ak|tokyo|*)    X=( 512290 ak );;
    esac;;
esac;
ffmpeg -i http://nhkradio$X[2]${1:l}-i.akamaihd.net/hls/live/$X[1]/1-${1:l}/1-${1:l}-01.m3u8 \
    -bsf:a aac_adtstoasc -c copy -t $[60 * $2] $(date +%F-%H%M%S)-nhk-$1-$3-$4.m4a;

らじらー! サンデー を osaka で録音すると 24〜5分で 403 Forbidden になり、接続が切れます。何故かは分かりません。osaka 以外では問題ない様です。と、思ってゐたら matsuyama, hiroshima でも 途中で切れてゐました。常に複数の局を記録する様にしてゐたのに、結局聞く事が出来ませんでした。迚も嫌な気持ちにはなりました。

ffplay に変更すると単に聴く丈けにも出来る筈。

( Simul Radio | CSRA ) 用も作成。Port number が在ると mimms は上手く扱えない様なので ffmpeg に割り振る様にしてみた。

-codec copy Option を付けるのを忘れてゐたので追加。

/bin/shbash でない場合も、 dash で実行できる様には修正しました。なので ash でも大丈夫なのかな? sh でも大丈夫な筈ですが、どうなのでしょう?

参考: Bashism

#!/bin/sh
[ $# -gt 1 ] || {
    echo "Usage: $(basename $0) STATION-NAME MINUTES [TITLE]?
Station Name:
北海道: sankakuyama | fmjaga | fmwing | FmKushiro | fmwappy | fm837 | radioniseko |
        iruka | radiokaros | fmapple(765fm) | eniwa | otaru | shiroishi |
  東北: radiomorioka | radio3 | fmmotcom | seawave(fm-iwaki) | aizu | yutopia | yokote | miyako |
        ishinomaki | baywave | fmizumi | ringo | natori | minamisoma | kocofm | rikutakata |
        odagaisama | aozora | kamaishi | befm | kiritampo | cassiopeia(779.jp) | taihaku |
  信越: kento | karuizawa | sakudaira | azumino |
  関東: palulun | flower-tv(fm767) | smile | shonanbeachfma | radioshonan | redswave | tsukuba |
        tachikawa | kawasaki | kiryu.fm | totsuka | FmSalus | chofu | maebashi | katsushika |
        fmsagami | rainbowtown | kaon | radiocity(chuo_fm) | takahagi | kawaguchi | fmuu | hitachi |
  東海: portwave(cty-fm) | ciao | mid-fm761 | FmOkazaki | toyota(loveat) | suzuka | izunokuni |
  北陸: fmn1 | harbor779 | radiomyu |
  近畿: tanba(fukuchiyama) | fmyy | FmMiki | hirakata | genki | FmTanabe | jungle | banban |
        beachstation | minoh | yesfm | KyotoLivingFM | aiai | hasimoto | radiocafe | tango |
        fmmoov | radiosweet | fm805(tanba.info) | honey | radiomixkyoto |
  中国: darazfm |
  四国: takamatsu | B-FM791 | fmsun |
  九州: sunshinefm | amami | shimabara | fm-kitaq | starcorn | comiten | hibiki | nobeoka | ginga |
  沖縄: nirai | fmishigaki | fm-uruma | fm21 | lequio | toyomi |
        okiradi | nanjo | motob | kumejima | ginowan | ginowancity ";
    exit;
}
case $1 in
(fmishigaki)
    HOST=118.21.140.45/Push1 ;;
(darazfm)
    HOST=121.1.145.25:8080/streaming.asf ;;
(fmsagami)
    HOST=122.29.249.8/fmsagami_simul ;;
(765fm|fmapple)
    HOST=202.241.170.47:8080 ;;
(FmSalus)
    HOST=210.253.220.164 ;;
(fukuchiyama|fm-tanba|tanba)
    HOST=211.1.40.29/tanba ;;
(fmn1)
    HOST=android.fmn1.jp/live/ ;;
(flower|flower-tv|fm767)
    HOST=flower-tv.net/simul ;;
(fmwappy)
    HOST=fmwappy.aa0.netvolante.jp:8080 ;;
(CFM779|cassiopeia)
    HOST=netradio.fm779.live-on.net:10779/779 ;;
(maebashi)
    HOST=radio.maebashi.fm:8080/mwave ;;
(radioniseko|sankakuyama)
    HOST=wm2.hvc.co.jp/$1 ;;
(ciao|fmjaga|fmwing|radio3|radiomorioka|radioshonan|shonanbeachfm|shonanbeachfma|sunshinefm)
    HOST=simul.freebit.net/$1 ;;
(B-FM791|FmKushiro|FmMiki|FmOkazaki|FmTanabe|KyotoLivingFM|fm837|kiryu.fm|mid-fm761)
    HOST=simuledge.shibapon.net/$1 ;;
(comiten|fm-kitaq|fmlive)
    HOST=st1.shimabara.jp/$1 ;;
(shimabara)
    HOST=st1.shimabara.jp/fmlive ;;
(aiai|amami|aozora|azumino|fm-uruma|iruka|kamaishi|kaon|kento|nanjo\
|okiradi|radiocity|redswave|rockets785|sakudaira|sakudaira|smile|starcorn)
    HOST=hdv.nkansai.tv/$1 ;;
(baywave|fmizumi|fmmotcom|fmyy|hasimoto|ishinomaki|karuizawa|kocofm|minamisoma\
|miyako|motob|natori|odagaisama|radiokaros|rikutakata|ringo|seawave|toyomi)
    HOST=hdv2.nkansai.tv/$1 ;;
(aizu|banban|befm|chofu|hibiki|jungle|katsushika|kawasaki|kiritampo|kumejima|nirai\
|radiocafe|rainbowtown|tachikawa|takahagi|totsuka|toyota|yesfm|yokote|yutopia)
    HOST=hdv3.nkansai.tv/$1 ;;
(beachstation|eniwa|fm21|fmmoov|fmsun|fmuu|hirakata|izunokuni|kawaguchi\
|lequio|nobeoka|palulun|portwave|radiomyu|suzuka|takamatsu|tango|tsukuba)
    HOST=hdv4.nkansai.tv/$1 ;;
(fm805|genki|ginga|ginowan|ginowancity|hitachi|honey|minoh|otaru|radiomixkyoto|radiosweet|shiroishi|taihaku)
    HOST=hdv5.nkansai.tv/$1 ;;
(harbor779)
    open 'http://www.web-services.jp/harbor779/dewplayer-mini.swf?mp3=http://211.11.77.51:8000/;stream.nsv&autostart=1';
    exit;;
(*)
    echo not implement;
    exit ;;
esac;
case $HOST in
(*:*)
    ffmpeg -i mmsh://$HOST -t $((60 * $2)) -c:a copy $(date +%F-%H%M%S)-$1-$3.wma;;
(*)
    mimms -t $2 mms://$HOST $(date +%F-%H%M%S)-$1-$3.wma;;
esac;

JCBA も書いておく。

追記1: JCBA のは Audio Track が MP3 なので ffmpeg 等での抽出時に判るように file name に追加してみた。

追記2: 2015年7月に配信方式が變更されてゐましたが、やっとこさ對應出來ました。

追記3: MP3 Streaming に変更されました。

#!/bin/sh
[ $# -gt 1 ] || {
    echo "Usage: $(basename $0) STATION-NUNBER MINUITES [TITLE]?
Station Nunber:
北海道: [001:はな] [002:もえる] [003:Airてっし]
東北:
 青森: [004:アップルウェーブ]
 岩手: [005:ONE]
 山形: [006:モンスター] [007:NCV] [008:い〜じゃん おらんだ] [009:ハーバー]
 福島: [010:ポコ] [013:きたかた]
 宮城: [011:いわぬま] [012:H@!]
関東:
 神奈川: [014:湘南ナパサ] [015:ブルー湘南] [016:鎌倉] [017:おだわら] [018:湘南マジックウェイブ] [096:やまと]
 埼玉: [019:チャッピー]
 千葉: [020:うらら] [021:かずさ] [022:成田]
 茨城: [023:だいご] [024:かしま]
 山梨: [025:甲府] [026:ふじやま] [027:ふじごこ] [028:高崎]
 群馬: [029:太郎] [030:OZE]
 東京: [031:西東京] [032:むさしの] [033:えどがわ]
信越:
 新潟: [052:しばた] [053:ながおか] [054:ゆきぐに] [094:KENTO] [095:J上越]
 長野: [055:LCV] [056:いいだ]
東海:
 静岡: [034:Haro!] [035:IS] [036:g-sky 76.5] [037:富士山GOGO] [038:ボイスキュー] [039:マリンパル] [040:Hi!] [041:f] [042:COAST-76.7MHz]
 岐阜: [043:PiPi] [044:わっち] [045:Hits]
 愛知: [046:United North] [047:SANQ] [048:i-wave] [049:ななみ]
 三重: [050:いなBee] [051:なばり]
北陸:
 富山: [057:富山シティ] [059:となみ] [058:たかおか]
 石川: [060:ななお] [061:かなざわ] [062:こまつ]
近畿:
 滋賀: [063:草津]
 京都: [064:いかる] [065:うじ] [066:まいづる]
 大阪: [067:ちゃお] [068:うめだ Be Happy! 789] [069:HANAKO 82.4MHz]
 兵庫: [070:ハッピーいたみ] [071:ハミング宝塚] [072:さくら]
 奈良: [073:ならどっと] [074:ハイホー] [097:五條]
 和歌山: [075:バナナ]
中国:
 広島: [078:BINGO] [081:おのみち] [082:ちゅーピー] [083:はつかいち]
 岡山: [079:モモ] [080:くらしき]
 山口: [084:COME ON!] [085:しゅうなん]
四国:
 愛媛: [076:バリバリ] [077:がいや]
九州:
 福岡: [086:八女] [093:Dreams]
 大分: [088:ゆふいん] [089:NOAS]
 熊本: [090:Kappa] [091:791]
 佐賀: [092:からつ]";
    exit;
}
ffmpeg -i http://musicbird.leanstream.co/JCB$1-MP3 -t $((60 * $2)) -c copy $(date +%F-%H%M%S)-$1-$3.mp3;
[ $? -lt 2 ] && exit;
ffmpeg -i http://musicbird.leanstream.co/JCB$1-MP3 -t $((60 * $2)) -c copy $(date +%F-%H%M%S)-$1-$3.mp3;

番號で選局した方が置き換えたりする處理が要らないので、やっぱりそうする亊に。全てコミュニティFM局の名前なので番號の横に付いてる名前から { FM, エフエム, えふえむ, ラジオ, ラヂオ, レディオ } 等を取っ拂いました。

文化放送:超!A&GgetfmsListHD.php の中身(XML) を見て <cryptography>true</cryptography> でない <server>/<app>/<stream> に Access してみたら聞けた。でも icraft.fc.llnwd.net の方は Error になって解らない侭。

追記: 映像付きの放送もあるので、記録する際に Video Track を削除したら駄目でした。

#!/usr/bin/env zsh
[ $# -gt 0 ] || { echo "Usage: $0:t MINUITES [TITLE]?"; exit; }
for sd pp in {2,2} {2,1} {1,2} {1,1};
do
    ffmpeg -i rtmp://fms-base${sd}.mitene.ad.jp/agqr/aandg${pp} -c copy -t $((60 * $1)) $(date +%F-%H%M%S)-agqr-$2.mp4;
    [ $? -lt 2 ] && exit;
done

WREP-codec copy を使って Error が出ない拡張子が、今の処 aac/adts しか見つからないけど、保存後に m4a とかに変換しても QuickTime Player で開く事も出来ないし。VLC と ffplay でしか聞けないのは一寸面倒臭いんで、仕方なく適当な Format に変換してみた。元 Source の Bitrate は 48kbps 程度ですが MP3 だと最低限 96k 程度無いと音質が酷くなるので、そういう設定に。まぁ、でも MP3 の音質上げたいなら WAVE で保存して LAME の最適な設定を探せばいいのか。

#!/bin/sh
[ $# -gt 0 ] || { echo "Usage: $(basename $0) MINUITES [TITLE]?"; exit; }
ffmpeg -i http://139.99.4.27/stream -c:a libvorbis -b:a 96k -t $((60 * $1)) $(date +%F-%H%M%S)-wrep-$2.ogg;
# or
ffmpeg -i http://139.99.4.27/stream -c:a libmp3lame -b:a 96k -t $((60 * $1)) $(date +%F-%H%M%S)-wrep-$2.mp3;

Radiko は色々と情報が多いので検索すればどうにかなる筈。

追記: なんと Soundflower という Audio 出力を入力に向けてくれる System Extension があるので、何でも Browser で再生する丈けで好みの Applicaton で録音できる樣です。解決策って意外な處にあるなぁ。

VLC でも ストリーム/エクスポートウィザード shift+command+W で簡單に保存出來るみたい。變換し乍ら保存も出來るし。

「ついっぷる」、10月でサービスを終了 と云う事で、そういえば何か Shell Script 書いてたな…と思って探したら 日々の CSS & Shell Script に画像 Get 用のが在りました。今でも使える様ですので其の儘放置ですが、手元の Bookmarks (7 matches) を確認すると、最新のモノでも 2015年でした。

FgG presents 小松未可子と優木かなの★★★★★★ を月毎に Get して Extract する。番組が終わってしまったので、もう出してもいいかなと思いまして。

#!/usr/bin/env zsh
[ $# -ne 0 ] || { echo "Usage: $0:t YYYY MM monthly(s)."; exit; }
for y m in "$@";
do
    curl -L http://www.joqr.co.jp/fgg/$y/$m/ | grep 'javascript:player' | tr -s '"'"'" '\n' | grep fgg;
done |
while read i;
do
    u=$(curl -L http://www.joqr.net/fgg/player/$i.html | grep '<iframe' | cut -d '/' -f 6 | cut -d '?' -f 1);
    f="${i[4,7]}-${i[8,9]}-${i[10,11]} $u";
    ffmpeg -i "http://media01.storage-dag.iijgio.com/joqr1134_fivestars/$u.flv" -vn -c:a copy "$f.mp3";
    id3v2 -D "$f.mp3";
done

NHK-BS1 の NFL の放送豫定を得る爲に、2012年以前は HTML から必要な部分丈け拔き出して Plain Text に變換する結構グチャグチャな Shell Script を書いてゐたのですが、2013年から JavaScript を使う方法に變更されたので結構簡單なモノに書き直せました。

#!/bin/sh
curl -O 'http://www1.nhk.or.jp/sports2/onair/onair[1-4].js';
cat onair[1-4].js | tr -s '][' ' ' | gsed -n ' # \t を tab character に置き換えれば sed でも OK.
/"time_s":/ h;
/"time_e":/ H;
/:"nfl"/, /"biko":/ {
    /"ttl":/ H;
    /"biko":/ {
        H; x;
        /対/ ! d;
        /"biko":""/ ! s/"ttl":"NFL・[^"]*",//g;
        s/"biko"://g; s/"time_s"://g; s/"ttl"://g;
        s/[ ]*【解説】.*//; s/「.*」「//; s/「//g; s/」//g;
        s/[,"\t]//g; s/[[:space:]]*$//g; s/\n\n*/\t/g;
        s/\ttime_e:/ - /g;
        p;
    }
}' >> onair.txt;

何故だか On Air が近付くと Title のチーム名から都市名が削られるので、備考欄と入れ替える處理を追加/修正しました。

變な重複がある記述に變わってゐたので、對應出來る樣に變更しました ;-(

何故だか On Air が近付く迄 Title の都市名が削られるので、備考欄と入れ替える處理を修正しました ;-(

擴張子が .js になってゐますが、多分 .json と同じ亊だと思うので、其れ用の Library 等を使えばもっと簡單でしょうね。

jot で GNU seq を適当に実装 が私のと書き方が違ったので自分のを晒します。酷いけど。

function seq() {
    while getopts b:f:p:s:w:cnr o; do case $o in
    *) echo options were not implemented.; return;;
    esac; done;
    case $# in
    3) jot $2 $1 $3 ;;
    2) jot $2 $1 ;;
    *) jot $@ ;;
    esac;
}

seq を真面目に実装してみる は酷くないんだと思う。多分。

Terminal で扱った File を Finder で表示したい場合が面倒臭いと云う事で、最初に思い付いた方法がこんなの。

function revealfinder() {
    for i in "$@"; do
        osascript -e 'tell application "Finder" to reveal "'$(
            [ $i[1] = '/' ] || echo -n $PWD/
        )$i'" as POSIX file'
    done
}

でも、pathname から basename 丈け消して open ./foo/ ../bar/baz/qux/ みたいなのを普段から頻繁にやってゐたので個人的には此の方がしっくりくる。

function reveal() { open "$@:h" }

まぁ、挙動が若干違うので使い分けてもいいかも。

つい氣の迷いで FFmpeg を install してしまったのでw, ffmpeg -formats してみたら TwinVQ が Decode 出來る亊に氣づいた。知らんかった。んで、十何年か前に kant さんに戴いた *.vqf を convert した。まぁ、直接 MP3 なんかにしてもよかったけど、一應 Audacity で状態を確認したかったので Apple Lossless にしてみた。最初はこんな感じ…。

for i in */*.vqf; do ffmpeg -i "$i" -c:a alac "$i:r.m4a"; done

で、Audacity で開いてみたら 無音部分の Level が中心から ちょい ズレとる。理由は解らんかったが Sample Rate が 22050 Hz の File だったので 44100 Hz に Resample する樣に變えてみたら…

for i in */*.vqf; do ffmpeg -i "$i" -c:a alac -ar 44100 "$i:r.m4a"; done

問題なくなった。これで漸く MidRadioPlayer.app が捨てられるなぁ。

v1.2 で Option の指定方法に若干變更がありました。 Video and Audio file format conversion 邊りに Sample が色々あるので參考迄に。

v1.0 で、又 configure 出來なくなりました。

% sudo port configure ffmpeg
--->  Computing dependencies for ffmpeg
--->  Fetching distfiles for ffmpeg
--->  Verifying checksum(s) for ffmpeg
--->  Extracting ffmpeg
--->  Configuring ffmpeg
Error: org.macports.configure for port ffmpeg returned: configure failure: command execution failed
Please see the log file for port ffmpeg for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_multimedia_ffmpeg/ffmpeg/main.log
To report a bug, follow the instructions in the guide:
    http://guide.macports.org/#project.tickets
Error: Processing of port ffmpeg failed

log を見ると libmodplug が(有るのに)無いとか云って Error にされてゐます。取り敢えず Portfile の libmodplug を外すと install 出來ました。特に困らないので別にいいかなと思いまして。

depends_lib \
        :
#               port:libmodplug \
configure.args \
        :
#       --enable-libmodplug \

てな感じに書き換える script 書いたけど、こういうのって Install 時に引数で指定する丈けで良い筈ですよね(恥)

#!/bin/sh
sed -i.bak '
    /port:libmodplug/,/^$/ {
        /port:libmodplug/ { s/^ /#/; h; d; }
        /^$/ { x; p; g; }
    }
    /--enable-libmodplug/ s/^ /#/;
' /opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/multimedia/ffmpeg/Portfile

CotEditor の Shell Script の Syntax Colorings は Z-Shell 用 としては少な過ぎるので、追加する爲に commands や keywords を拔き出してみた。

ls /bin /usr/bin | grep -v '[/.]' > commands.txt
info zshbuiltins | awk -v RS='' '/^       [a-z]/{print $1}' | sort -u >> commands.txt
while read s; do which $s | grep '[a-z]: shell reserved' | cut -d : -f 1; done <<<$(
info zshmisc | awk '/COMPLEX/, /ALTERNATE/ {
if (/^       [^ A-Z]/) for (i = 1; i <= NF; i++) print $i;
}' | sort -u) > keywords.txt

この後は、XML の儘では編集しにくそうなので Shell Script.plist を ASCII Property List File で保存した物に追加してから編集してみた。

for i in commands keywords; do awk 'BEGIN{print "'$i'Array = ("} END{print ");"}
{printf "{beginString = \"%s\"; },", $1}' <$i.txt >>Shell\ Script.plist; done

此の儘で CotEditor を起動してみるとか plutil -convert xml1 Shell\ Script.plist で終わっても良いけど、念の爲 Property List Editor で開いて確認してみた處、regularExpression の値が Class: String, Value: 1 になってゐたので Class: Boolean, Value: Yes に修正して終わり。結果 XML の儘の方が手間が掛からなかった。

と、ここ迄やってみて必要以上に手間掛けてる氣がしてきた。もっと簡單な方法がありそう。

追記: TextWrangler.app/Contents/Resources/Unix Shell Keywords.txt からパクってきたら簡單やったかも。それでも足らんけど。

FizzBuzz Test で檢索すると Perl, Python, Ruby, Erlang, Haskell, JavaScript 邊りが多いので ABC, AWK, AppleScript, Basic, Bourne Shell Script, Ferite, HyperTalk, Icon, Lua, Pascal, Tcl 等で書いてみました

まぁ、はっきり言って下手糞です。普段よく使ってゐる Perl, Python あたり迄はスラスラ出てきたのですが、其の後は思考停止してしまって、その言語らしさが全然ありません。

古い StuffIt Archive の日本語 File name が OS X Finder 上で化け化けになった時の對處方法。

#!/bin/sh
for i in "$@";
do
    mv -v -- "$i" "$( echo $i |
        iconv -f UTF8-MAC -t MACROMAN |
        iconv -f SJIS -t UTF-8 )";
done
mojibake-fix.sh Archive?folder/*

此處數年の懸案であった手持ちの畫像 Files の Optimize に取りかかりました。

先づ Terminal の入力で手拔きする爲に擴張子を Lowercase にしました。

#!/usr/bin/env zsh
[ $# -gt 1 ] || { echo "Usage: $0:t -[ul] <files...>"; exit; }
while getopts ul c; do shift $[ $OPTIND - 1 ]; done;
for i in "$@";
do
    x=$i:e;
    case $c in
        (u) [ $x != $x:u ] && x=$x:u ;;
        (l) [ $x != $x:l ] && x=$x:l ;;
    esac;
    mv -v -- "$i" "$i:r.$x";
done
cd Pictures
change-extension-case.zsh -l **/*.(JPEG|JPG|JFIF|PNG|GIF|PICT|PCT|TIFF|TIF)

zsh でない Unixシェル の場合は ** が使えないので find が面倒な亊に。

find . \( -iname '*.JPG' -or -iname '*.PNG' -or -iname '*.GIF' -or \
    -iname '*.TIFF' -or -iname '*.PICT' \) \
    -exec change-extension-case.zsh -l {} \; ;

PngCrush, OptiPNG で PNG file を Optimize するのは簡單なので……

optipng -fix -i0 -preserve -q -strip all -- **/*.png
pngcrush -fix -ow -q -rem allb -- **/*.png

jpegtran で JPEG file を Optimize するのも簡畧化出來る樣にして……

#!/bin/sh
[ $# -ne 0 ] || set *.jpg;
for jpg in "$@";
do
    tran=$jpg.$$;
    cp -- "$jpg" "$tran";
    jpegtran -optimize -progressive -copy none -outfile "$jpg" "$tran";
    rm -v -- "$tran";
done

大量に處理してみましたが、 失敗は在りませんでした path name が - (Hyphen) で始まる時に失敗しますね。 ./ を付けるとかで囘避出來ますが

jpegtran は MacMiNT 環境でも使えるので System 6, 7 でも便利。

jpegtran.sh **/*.jpg

GIF Animation も Optimize したいのですが、既に GIFmation, GIF Builder, A Smaller GIF, で弄くり倒した後なので、殆ど效果が無くてやゝがっかり氣味。 でも、まぁ Terminal でちょちょっとする丈けなので手間要らずではある。 少し位 File size が増える亊が在っても平氣なら (Total では減る筈)……

gifsicle --no-interlace --no-comments --careful -b -O2 -V -- **/*.gif;

PICT (Vector) file を PDF にする要領で……

pict2pdf **/*.(pict|pct)

TIFF, PICT (Pixmap) file 等を PNG にしてしまう。

#!/usr/bin/env zsh
for pix in "$@";
do
    png=$pix:r.png;
    sips -s format png --out "$png" "$pix";
    optipng -fix -i0 -q -- "$png";
done

sips も path name が - (Hyphen) で始まる時の囘避方法が無いです。

pict2png.sh **/*.(pict|pct|tiff|tif)

どうでもいいけど PICT の擴張子を .pic にしてる人もゐますが、それだと 違う format も在って紛らわしいので、私は使いません。

んで、 Optimize したら Zftp Function で、 お氣樂極樂 put.

zfopen host user password
zfcd directory
zfput -r **/*.(gif|png|jpg)
zfclose

zftp functions を使うには .zshrc 等に以下を追加します。

autoload -U zfinit
zfinit

詳しくは man zshzftpsys を讀んでみて下さい。

MacPorts で fortune を Install したのですが、

port search fortune
fortune        games/fortune  6.2.0-RELEASE Infamous electronic fortune-cookie generator
sudo port install fortune

英語の file ばかりで樂しくありません。

ls /opt/local/share/games/fortune
fortunes        fortunes2       limerick        murphy-o.dat    zippy
fortunes-o      fortunes2-o     limerick.dat    murphy.dat      zippy.dat
fortunes-o.dat  fortunes2-o.dat murphy          startrek
fortunes.dat    fortunes2.dat   murphy-o        startrek.dat

なにか好いのは無いかと探して、 人名を冠したソフトウェア開発の19の法則, アーゴの法則, トリビアの泉 パーフェクトデータベース, ガセビアの沼 データベース, 世界傑作格言集豆知識 で作ってみました。

#!/bin/sh
for i in "$@"
do
    if [ $LANG = 'ja_JP.EUC' ];
    then
        iconv -f UTF-8 -t EUCJP $i.txt >$i;
    else
        cp $i{.txt,};
    fi;
    strfile $i;
    sudo install -m 0644 $i{,.dat} /opt/local/share/games/fortune/;
done
set 19laws argo gasebase trivia knowledge;
fortune.sh "$@";
echo "[ -x /opt/local/bin/fortune ] && fortune $@;" >>.zlogin

HTML, XHTML

HUNDOSHI-EDIT (Carbon/Mac OS X) と Shell Script で XHTML, RSS2.0 が ある程度 樂に書ける Scripts

Shell Script が使える Text Editor は他に CotEditor.app 等がありますが、今の処 HUNDOSHI-EDIT 用丈けです。

csh は使いませんので、動作確認はご自分でどうぞ。

環境変数 LANG の設定に因っては日本語の処理が正しく出来ない場合があります。そんな時は Script 内で LANG=C とか LANG=ja_JP.UTF-8 等に設定して上手くいく方法を探してみてください。

HUNDOSHI-EDIT で HTML Tidy

Terminal 起動してても面倒ぃ時 (って結構あるんで)。

#!/bin/sh
/opt/local/bin/tidy -w -q -c -raw \
    --drop-proprietary-attributes y \
    --enclose-block-text y \
    --enclose-text y \
    --join-classes y \
    --merge-divs n \
    --merge-spans y \
    --quote-marks y \
    --sort-attributes alpha \
    --tidy-mark n "$1" >"$2"

HTML Tidy Configuration Options Quick Reference

HUNDOSHI-EDIT でも Another HTML-lint

Terminal 起動してなくて面倒ぃ時 (ってあんまり無いけど)。

#!/bin/sh
cat "$1" >"$2"                                  # 内容を書き戻す
echo '<!--' >>"$2"                              # 念の爲 Comment にしておく
/usr/local/bin/htmllint -igncharset "$1" >>"$2" # charset は無視する.
echo '-->' >>"$2"

Another HTML-lint : How to use htmllint

HUNDOSHI-EDIT (Classic/Mac OS 9) と JGAwk MacHTML, XHTML を書く爲の Scripts

HUNDOSHI-EDIT (と King's Edit) 用。jgawk 2.15.2+1.0+1.2.5 で Dialog が出せる亊を前提にしてゐます。Classic/Mac OS 9 と書いてゐても、私の環境は System 7.5.5 と Mac OS 8.1 なので、其れ以外ではどうなんだか……?

冗長部分を簡潔にしました (2003-02-17)。

jgawk の Stack Size を變更する必要があります。

Customize jgawk 2.15.2+1.0+1.2.5

割り當てメモリは 少し大きめに設定した方が安定して實行出來る様です。 私は 1024 KB にしてゐますが、通常 Error は出て居りませぬ。

調子に乗って HUNDOSHI-EDIT 用の XHTML Script をだらだらと長い物に書き換えたら、 Stack Size が足りなくなってしまいました。ResEdit 等で 48 K ($0000C000) とか 64 K ($00010000) にすると大丈夫。

出力 Window の位置、サイズや Font 設定等はCoOpResource で設定出來ます。 Default では ASLFont に設定されていますので、使ってゐない場合は變更必須と云えるでしょう。 但し、實際の COLS, ROWS は環境設定に依存しますので、起動して Environment を確認しましょう。

File name に = が含まれると Error になります (引数での代入として処理される) ので、 CGI 經由で Get した場合の File name 等は特に注意しませう。

其の他の Files

HTML 雛型

SchaftEdit Menu 定義 File

  • SchaftEdit:Menus:*.def Files; v1.2.4b9.1 (68K) 以外では動作確認してません。

AppleWorks6-J, ClarisWorks4-J の HTML Translator 定義 Resource

DTD Module の平坦化

Sed & Awk References

Sed & Awk References
正規表現メモ
Regular Expression (Riue ちゃんの正規表現講座)
Awk
Gawk
Japan GNU AWK Users Club
The GAWK 2.15.6 Manual - Table of Contents
The GAWK 3.0.4 Manual - Table of Contents
Manpage of GAWK
Manpage of IGAWK
AWKとは
AWKの第一歩
JGAwk for Macintosh (archive.org)
Computers: Programming: Languages: Awk (dmoztools.net)
comp.lang.awk FAQ
news:comp.lang.awk
news:fj.comp.lang.awk
Sed
GNU sed
sed.sf.net - The SED $HOME
SED Lecture
sedは日暮れて
Manpage of SED (JM)
Sed - An Introduction and Tutorial
sedで使用できる正規表現演算子
SedMac (archive.org)
sedsed
Computers: Software: Editors: SED (dmoztools.net)
sed FAQ, version 014

HTML References

SGML
DocBook
DocBook + OpenJadeでw3c準拠のHTML作成を目指す
SGMLで文書管理
sf's SGML Page
SGML reference information for HTML (ja)
SGML: A Technology for Fulltext Database (Part 1)
Miura Jun (SGML,XML,...)
Designing document type definition (DTD) in SGML/XML
HTML
W3C HTML Validation Service
HTML5 Validators
(X)HTML5 Validator
Safari Tidy plugin
HTML Validator for Firefox and Mozilla
Another HTML-Lint
older Another HTML-Lint
Clean up your Web pages with HTML TIDY
HTML tidy service
HTML Tidy Online
HTML Tidy Project
Tidybot
HTML TIDY でウェブページを磨き上げる
Balthisar Tidy - For Mac OS X
Tidy For Mac OS
BBEdit Plug-In Library (BareBones)
HTML-LINT RANKING Front Page
XHTML 2
XHTML 1.1
Studying XML for beginners
XHTML 1.0
XHTML Mobile Profile and CSS Reference
Openwave Developer Network - Tools & SDK
HTML 5.1
HTML 5
HTML5.JP - 次世代HTML標準 HTML5情報サイト
HTML5 における HTML4 からの変更点
ISO/IEC 15445:2000
HTML 4.01
鳩丸ブラウザー
のけぞる本・一般編 - 文法の部 @ 鳩丸
HTML 3.2
HTML 3.2 リファレンス仕様書
CSS
CSS - MDC Doc Center
Safari Developer Library
Webkit CSS Properties
CSS - W3C Wiki
CSS Mobile Profile
CSS Style Attributes
ToyFish.Net
CSS Validator
CSS1 テストスイート 日本語版
Accessibility Features of CSS 日本語版
using CSS1 with HTML
CSS3 (current)
CSS3 Module Status - CSS3.Info
Translations of the CSS3 modules
Web関連技術の仕様書邦訳
CSS3 WD Japanese Translation
ウェブスタンダードの研究
CSS2
Full property table of CSS 2.1
Translations of the CSS2 Recommendation
Web関連技術の仕様書邦訳
Cascading Style Sheets, Level 2
CSS1
Translations of the CSS1 Recommendation
Cascading Style Sheets, Level 1
XSL
XSL-FO 2.0
XSL-FO 1.1
XSL-FO 1.0
XSLT
XSLT 2.0
XSLT 1.0
XSL Transformations (XSLT) Version 1.0
XSL Transformations (XSLT) in Mozilla
XPath
XPath 2.0
XPath 1.0
XML パス言語 (XPath) Version 1.0
XML Path Language (XPath) バージョン 1.0
misc
WebPlatform Docs
W3Cの仕様書等の文書の日本語訳集
ミケネコの htaccess リファレンス
ハッカーになろう
ようこそ地獄のHTMLページへ
ダサいホームページ作成マニュアル凝縮版
Another HTML-lint Statistics
The Trap of Web Design
Docutils
Accessibility
Getting Started: Making a Web Site Accessible 日本語版
「バリアフリーの扉」アクセシビリティ・センター
Lynx でダメにならないページを作るには
テキストブラウザにも優しい HTML 文書の作成方法
デザイン
Viewability
Viewable With Any Browser
Viewable With Any Browser (JP)
See web pages with w3m

Python & MacPython

若しも、現在 Python を使うかどうか迷ってゐたら、Perl, Python, Ruby の比較 を讀むとよいかも。

普段使いの Script を纏めてある Directory に対して 2to3-2.6, 2to3-3.0 を実行してみたら両方同じで殆ど print, urllib の置き換え丈けでした。 只、一寸気になる点があります。

Python 2.6.2 の raw_input() では、何もしなくても Unicode に対応出来てゐました。

python2.6
Python 2.6.2 (r262:71600, Jun 17 2009, 14:15:09) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
def raw_print():
    print '?',
    print raw_input()

raw_print()
? \343\201\213\343\201\227\343\201\223
かしこ

これが Python 3.0.1 の input() では、何か Error を吐きよるんですゎ。

参考: Python 3: 第 1 回 何が新しいのか

python3.0
Python 3.0.1 (r301:69556, Jun 28 2009, 16:11:52) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
def raw_print():
    print('?', end=' ')
    print(input())

raw_print()
? \343\201\202\343\201\273\343\203\274
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in raw_print
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

で、環境変数 LANG に何も設定してゐなかったので、設定してみた処……

参考: Python3.0 で マルチバイト文字を print したらエラーになった - Heavens hell

export LANG=ja_JP.UTF-8
python3.0
Python 3.0.1 (r301:69556, Jun 28 2009, 16:11:52) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
def raw_print():
    print('?', end=' ')
    print(input())

raw_print()
? \343\343\343
あほー

今度は入力した文字が變になってる……。まぁ此れは Terminal か gettext の問題かも知れんし、別に困らんし。未だ調べてないけど。

python 3.3.0 で試してみたら、Script File なら難なく實行出來るのに Terminal で 入力すると全く日本語入力出來ない状態に。環境変数なのかな?

zsh のせいかもと思って /bin/zsh (v4.2.3) から /opt/local/bin/zsh (v5.0.0) に變えてみたけど關係なかった。云々…。

まぁ、其れ以前に、未だ私の腦みそは Python 1.5 の儘なので、2.* の變更すら掴み切れてないんですが。

序でに str の事も: Python2 の str は死んだ - atsuoishimoto の日記

可成りどうでもいい MacPython Tips

MacOS.SetCreatorAndType(pathname, creator, type)
macfs.FSSpec(pathname).SetCreatorType(creator, type) より Smart でせう。
unexpandtabs()
L[-1] でなくて pop()append() でもよかったんですが、MacMiNT の python が v1.3 なもんで。
def unexpandtabs(s, tabstop=8):
    import re, string, struct
    spaces = re.compile('\x20+$')
    L = list(struct.unpack((str(tabstop) + 's') * int(len(s) / tabstop) +
        str(len(s) % tabstop) + 's', s))
    for i in range(len(L) - 1):
        L[i] = spaces.sub('\t', L[i])
    if L[-1] == ' ' * tabstop:
        L[-1] = '\t'
    return string.join(L, '')

Python References

Python
Python.ORG
Python Insider
Python Insider JA
Python-Mode
Guido van Rossum
Python Japan User's Group
JapaneseCodecs (python.jp)
JapaneseCodecs & kanjilib (asahi-net)
Mark Lutz
comp.lang.python Newsgroup FAQs
news:comp.lang.python
MacPython
MacPython
MacPython についてのページ(よ)
Computers: Systems: Apple: Macintosh: Development: Languages: Python (dmoztools.net)
Tools
PyChecker
Divmod : PyFlakes
Pylint
NkfPython - Ma2
PythonCard
Grail
Alice99
Documents
Python Enhancement Proposals (PEPs)
Python Style Guide
PEP 8 を翻訳しました - methaneのブログ : https://dl.dropboxusercontent.com/u/555254/pep-0008.ja.html
PEP 8 -- Style Guide for Python Code
pep8 - Python style guide checker
Python 和訳ドキュメント
Python 関連文書
Learn Python The Hard Way
BASIC to Python | ROX Desktop
ニシキヘビを飼おう
Pythonで日本語を使う - Pythonのお勉強
グイド・ヴァンロッサム氏へのインタビュー
Python と Lisp の関係について
The Python Paradox
Lisp プログラマのための Python 入門
PHP 開発者のための Python の基本
On Python
モンティ・パイソンとハッカー文化 . .
Computers: Programming: Languages: Python (dmoztools.net)
ABC References
A Short Introduction to the ABC Language
プログラミング言語 ABC
ABC Programmers Handbook
ABC (programming language) - Wikipedia
Computers: Programming: Languages: ABC (dmoztools.net)

Perl

Perltidy を使ってみました。

Perltidy には Preset された Option が幾つか用意されてゐますが、 -pbp, --perl-best-practices は私の好みに合いません。 -gnu, --gnu-style は大体良い感じなのですが、少し気に食わない処が在ります……、残念。 仕方ないので設定 File を作りました。

-t      # --tabs    tab を使う
-et=8   # --entab-leading-whitespace=   tab に置き換える space の数
-i=8    # --indent-columns=             indent 幅
-ci=8   # --continuation-indentation=   次の行に続く場合の indent 幅
-l=0    # --maximum-line-length=        行の最大文字数 0=maximum
-bl     # --opening-brace-on-new-line   (Block 始まりの) curly brace を次の行に置く
-bt=2   # --brace-tightness=[0,1,2]             brace 前後の空白の扱い
-pt=2   # --paren-tightness=[0,1,2]             paren 前後の空白の扱い
-sbt=2  # --square-bracket-tightness=[0,1,2]    bracket 前後の空白の扱い
-nsfs   # --nospace-for-semicolon       semicolon の前に space を置かない

要は indent に space は使わない、条件文の桁は一々揃えない、です。元々 Python 的な Style が好みなのかも。

Install は MacPorts に任せましたが、勿論 CPAN でもよいです。

sudo port install p5-perl-tidy
#   or
sudo cpan -i Perl::Tidy

HUNDOSHI-EDIT からも使える様にしました。

#!/bin/sh
/opt/local/bin/perltidy -t -et=8 -ci=8 -i=8 -l=0 -bl -bt=2 -pt=2 -sbt=2 -nsfs <"$1" >"$2"

MacMiNT の /mac/perl/crtype を書き換えてみた

# usage: perl crtype <file...>
# tell what kind of end of line convention is used.
while ($file = shift(@ARGV)) {
    last unless open(F, "<$file");
    binmode(F);
    while (1) {
        $type = "Unknown";
        last unless read(F, $buf, 1024);
        $type = "DOS";
        last if $buf =~ "\r\n";
        $type = "Mac";
        last if $buf =~ "\r";
        $type = "UNIX";
        last if $buf =~ "\n";
    }
    print "'$file': $type\n";
    close(F);
}

少々諄い処を書き換えて使ってゐます。Mac OS X でも使えます (でも普段は file command を使いますが…;-p)。

#!/usr/bin/perl
# for perl4
@ARGV || die <<".";
Usage: $0 <file...>
    tell what kind of end of line convention is used.
.
while (defined($_{file} = shift @ARGV))
{
    last unless open _, $_{file};
    binmode _;
    while (read _, $_, 1024)
    {
        last if $_{type} = /\x0D\x0A/ ? "DOS" : /\x0D/ ? "Mac" : /\x0A/ ? "unix" : 0;
    }
    close _;
    print "---> $_{file}: ", ($_{type} || "Unknown"), "\n";
}

序でなので……

Mac OS X 用に /bin/crlf も perl で書いてみた

#!/usr/bin/perl -s
require 5.000;
use strict;
use vars qw{$d $m $u};
$/ = $d ? "\x0D\x0A" : $m ? "\x0D" : $u ? "\x0A" : "";
$/ or die "Usage: $0 -[dmu] <files...>
    -d: to DOS  Carriage Return and Line Feed.
    -m: to Mac  Carriage Return.
    -u: to unix Line Feed.
";
$\ = undef;
while (defined($_{arg} = shift @ARGV))
{
    $_{bak} = "$_{arg}.$$";
    rename $_{arg}, $_{bak} or die;
    open I, "< $_{bak}" or die; binmode I;
    open O, "> $_{arg}" or die; binmode O;
    while (read I, $_, 1024) #buff
    {
        substr($_, -1, 1) eq "\x0D" and read I, $_{crlf}, 1 and $_ .= $_{crlf}; #crlf
        s#\x0D+\x0A+|\x0D|\x0A#$/#g;
        print O;
    }
    close I;
    close O;
    undef %_;
}
#buff
一応 MacMiNT でも使える様に Memory ケチってますので、適当に。
#crlf
読み込み時に CR と LF の間で分けてしまった場合の割り切った(?)対処。

HTML Tidy を Install してゐれば、 tab2space に同じ機能がありますが。

en dash と em dash の扱い

ダッシュ (記号), ハイフンマイナス を參考に { x815C (em dash), x817C (en dash) } ⇔ { --, - } の入れ替えをするデタラメな處理を書いてみた。

perl -pe '(s/―/--/g, s/−/-/g) or (s/--/―/g, s/-/−/g)' <"$1" >"$2"

今の処、其れ也に使い道が在るけど、その内行き詰まりそうな雰囲気も…。

MacPerl Relics

jperl.pod に書いてある通り -b Switch 附きにして Normal Perl Compatible で MacJPerl に Syntax Check... させたら Type 2 Error で落ちた。

#! perl -bw
no I18N::Japanese;
use LWP::Simple;

それにしても JPerl には苦勞させられるというか LWP::Simple で getprint するだけの亊が出來ないとはどういふ亊でしょう。 しかも no I18N::Japanese しても根本的に無理という。

#! perl -w
no I18N::Japanese;
use LWP::Simple;
getprint("http://also.as/hanaden");
# Unrecognized character \342.
File ':MacJPerl 5.2.0r4 J2:lib:HTML:Entities.pm'; Line 102
# BEGIN failed--compilation aborted.
File ':MacJPerl 5.2.0r4 J2:lib:HTML:HeadParser.pm'; Line 75
# BEGIN failed--compilation aborted.
File ':MacJPerl 5.2.0r4 J2:lib:LWP:UserAgent.pm'; Line 118
# BEGIN failed--compilation aborted.

Mac OS 8.1 が意味不明で不可解な Timing で突然死するので、 System 7.5.5 に downgrade した煽りを喰って、 MacPerl も 5.2.0r4 に戻しました。 まぁ、5.6.1r1 は起動に問題が在ったので構わないんですが、ちょと寂しい。

Aozora Bunko の Text から Ruby を Remove する

#!/usr/bin/perl
#This is "RubyCutter" Progarm.
#Version 2.1
#Prgram by Banshodo
#Copyright 2001-2007, Banshodo
$/ = "\/";
$* = 1;
while (<>) {
open(STDOUT, ">$ARGV-n.txt") unless -e "$ARGV-n.txt";
&MacPerl'SetFileInfo('JEDT', 'TEXT', "$ARGV-n.txt");
    $_ =~ s/《[^》]*》//g;
    $_ =~ s/|//g;
    chop;
    print $_;
}
  • どうでもいいけど jperl script なのに #!/usr/bin/perl って違和感ない ?
  • Input Record Separator を Slash にする意味って ?? しかも態々 Double Quote 文字列にして Escape して。
  • 既に MacJPerl4 が入手困難なのに、いまどき $* = 1 にする意味が ???
  • 態々自前で File の処理しなくても -i Option で済ませれば ????
  • Default 値 $_ を使う場合は、便利な省略形があるのに……。
  • 何故 chop (Slash 削除) する ?????

MacJPerl で遣るなら、これでいいんでは ?

#! MacJPerl -00pi.bak
s/|?([^|《》]+)《[^《》]+》/$1/gs;

MacPerl でも動く様にするにはこんな感じかなぁ……。

#! MacPerl -00pi.bak
s/\x81\x62//g;
s/\x81\x73.*?\x81\x74//g;

序でに HTML 版の Ruby Text を Tag に置き換える Script.

#! MacJPerl -00pi.bak
s#<!--R-->([^()]+)(([^()]+))#<ruby>$1<rp>(</rp><rt>$2</rt><rp>)</rp></ruby>#g;

Mac OS X では encoding Pragma か Encode.pm を使えばよさそう。

use utf8;
use encoding 'shiftjis';

MacJPerl を MacPerl Folder に追加

MacJPerl の Site に Fixed MacPerl Window Title Font Bashing Bug と書いてありますが、他の部分で EnBug してゐるみたいです。やっぱり 「不必要な日本語化は BUG を増やす」というのは、思ひ込みだけではないですね。 まぁ、最近は jgawk や sed-ja の速い版 程度だと考える亊にしてます。

MacPerl は使用後に Finder が落ちる、MacJPerl は使用中に MacJPerl 自身が落ちる、と云う亊が多い樣です。

ぁ、因みに MacPerl Folder に MacJPerl の以下の File を追加 / Merge して使ってゐます。

  • MacJPerl (APPL, McJP)
  • MacJPerl English (rsrc, RSED)
  • MacJPerl Extension (Folder)
  • :lib:I18N:Japanese.pm (TEXT, McJP)

MacPerl Extensions Folder は元々同じ名前なので、どちらか一方しか使えないのですが Droplet は分けて使いたいので MacJPerl Application 本體の Data fork を書き換えて使い分けてゐます。68K 環境の場合は DATA Resource です。

:lib: 内の { CommConnect.pl, FileCopy.pl, FindFolder.pl } は XCMD/XFCN が含まれますが、其れ以外の Library は Resource Fork を削除すると Disk Space を節約できます。まぁ、Perl4 Library を引き摺ってる間 (5.004_02 迄?) 丈けですが。

Jcode.pm を MacPerl 5.2.0r4 と MacJPerl 5.2.0r4 J2 に Install

Jcode.pm の Archive に含まれる mac_install.pl は上手く Install 出來ません。

# Ok. I'll install files in HDD:MacPerl:site_perl: folder.
# Installing Jcode.pm to HDD:MacPerl:site_perl:Jcode.pm.
# Installing :Jcode:Constants.pm to HDD:MacPerl:<em class="point">site_perlJcode</em>:Constants.pm.
mkdir HDD:MacPerl:<em class="point">site_perlJcode</em>
# Installing :Jcode:H2Z.pm to HDD:MacPerl:site_perlJcode:H2Z.pm.
# Installing :Jcode:Tr.pm to HDD:MacPerl:site_perlJcode:Tr.pm.
# Installing :Jcode:Unicode:Constants.pm to HDD:MacPerl:site_perlJcode:Unicode:Constants.pm.
mkdir HDD:MacPerl:site_perlJcode:Unicode
# Installing :Jcode:Unicode:NoXS.pm to HDD:MacPerl:site_perlJcode:Unicode:NoXS.pm.
# All scripts are installed successfully

トホホ、Jcode.pm 以外は:site_perlJcode:に Install されてしまいましたが、これは簡單に修正できます。

- $dst =~ s/:://og;
+ $dst =~ tr/:/:/s;

多分 Mac の::..だと勘違いされてゐると思うのですが、これは當然 /../に當るものなので colon を削除してしまったら駄目です。

私の環境ではちゃんと Install 出來るようになりました。

# Ok. I'll install files in HDD:MacPerl:site_perl: folder.
# Installing Jcode.pm to HDD:MacPerl:site_perl:Jcode.pm.
# Installing :Jcode:Constants.pm to HDD:MacPerl:site_perl:Jcode:Constants.pm.
# Installing :Jcode:H2Z.pm to HDD:MacPerl:site_perl:Jcode:H2Z.pm.
# Installing :Jcode:Tr.pm to HDD:MacPerl:site_perl:Jcode:Tr.pm.
# Installing :Jcode:Unicode:Constants.pm to HDD:MacPerl:site_perl:Jcode:Unicode:Constants.pm.
# Installing :Jcode:Unicode:NoXS.pm to HDD:MacPerl:site_perl:Jcode:Unicode:NoXS.pm.
# All scripts are installed successfully

Text::Tabs をちょびっと變更

MacJPerl で no I18N::Japanese; しても unexpand() が正しく動作しませんでしたので、ちょっと變えてみました。

@e = split(/(.{$tabstop})/,$line,-1);

というのがどうも問題の様なので . で match する曖昧な方法をやめて unpack() してみました。

@e = unpack("a$tabstop" x int(length($line) / $tabstop) . "a*", $line);

Unicode とか EUC だと 餘計に Bug ったかもしれません。

Another HTML-Lint に 出力先を追加

Another HTML-Lint は迚も便利で有難いのですが、標準出力を利用しているので (MPW ではない) MacPerl では澤山 Error が出ると Report が何處かに消えて失くなってしまいます。 落ちる時もあるし……

open _, ">:htmllint.log" or die;
select _;

こんな感じでhtmllintDroplet の exit() より手前 (であれば何處でもよい) に追加すると File に記録されます。

何時終わったのか判らなくなるので、末尾に何か工夫したり しなかったりすれば一寸好い感じになるでせう。

$^O eq 'darwin' ? system(<<".") : print "\a"; # beep
osascript -e 'set volume output volume 25';
say 'Another HTML lint completed.';
osascript -e 'set volume output volume 50';
.

weblint で遊ぼ

Another HTML-lint の元になった weblint と云う物がございまして、まぁ HTML 2.0 丈け一寸調べられる程度ですが、 Mac 版 (macjweblint 97-0.12) は strict でないので(トホホ) jweblint-1.020 の unix 版をちょいと書き換えてから Droplet にしましょう。

diff -u weblint{.bak,}
--- weblint.bak
+++ weblint
@@ -15,12 +15,12 @@
 #
 $VERSION        = '1.020';
-($PROGRAM       = $0) =~ s@.*/@@;
-@TMPDIR_OPTIONS = ('/usr/tmp', '/tmp', '/var/tmp', '/temp');
-$TMPDIR         = &PickTmpdir(@TMPDIR_OPTIONS);
+$PROGRAM        = (split /:/, $0)[-1];
+@TMPDIR_OPTIONS = ($ENV{TMPDIR});
+$TMPDIR         = $ENV{TMPDIR};
 $SITE_DIR       = '';
-$USER_RCFILE    = $ENV{'WEBLINTRC'} || "$ENV{'HOME'}/.weblintrc";
-$SITE_RCFILE    = $SITE_DIR . '/global.weblintrc' if $SITE_DIR;
+$USER_RCFILE    = $ENV{WEBLINTRC} || "$ENV{HOME}:weblint.rc" || 'weblint.rc';
+$SITE_RCFILE    = $SITE_DIR . ':global.weblintrc' if $SITE_DIR;
 #------------------------------------------------------------------------
 # $version - the string which is displayed with -v or -version
@@ -71,7 +71,8 @@
    http://www.cre.canon.co.uk/~neilb/weblint/todo/
 EofToDo
-*WARNING = *STDOUT;
+open(LOG, ">:weblint.log") || die;
+*WARNING = *LOG; # *STDOUT;
 # obsolete tags
 $obsoleteTags = 'PLAINTEXT|XMP|LISTING';

Shuck で日本語を

ゃゃ、Shuck が劇的に改善されてゐましたね、萬歳!!

MacPerl に 付いてくる POD readerShuckは Default では Font が Geneva や Times に爲っていて、折角 和譯 Pod に入れ替えても讀めません。

どうやって Font を變更するのかと思ったら、 TEXT/styl Resource を變更することで反映されるようになっています。 氣が利いてますね :c)

で、早速色々變更してみました。

shuck font

やってみると、何故か上手くいく場合とそうでない場合とがあるのですが、 その理由というか原因がいま一つ掴めません。 ID: 128, 129, 130 の Font を揃えてstylResource の Size が揃ってゐるかどうかが、上手くいく Point の樣です。

しかし、どうも安定しないと思いませんか? 割り當てメモリを増やしても、何だか判らないタイミングでコケる事があります。 でも、私の環境ではWINDResource の Auto Position... を Stagger から None にすると安定しました。ついでに大きくして讀み易くなったし :c) 困ってる場合は試してみてはどうでしょうか。

Perl References

Perl
Perl programming documentation - perldoc.perl.org
perldoc.jp
The CPAN Search - search.cpan.org
MetaCPAN Search - search.metacpan.org
The BackPan
Larry Wall
インタビュー:Perl開発者ラリー・ウォール
Randal L. Schwartz
スクリプティング言語資料室(仮)
perlstyle - perldoc.perl.org
perlstyle - Perl スタイルガイド - perldoc.jp
Computers: Programming: Languages: Perl (dmoztools.net)
World: Japanese: コンピュータ: プログラミング: 言語: Perl (dmoztools.net)
Newbie
Perlクイズ
サンプルコードによるPerl入門
comp.lang.perl.misc Newsgroup FAQs
news:comp.lang.perl.misc
news:fj.comp.lang.perl
news:japan.comp.lang.perl
CGI
CGI.pm
The cgi-lib.pl Home Page
cgiwrap
CGI Programming FAQ
Perl の数値変換
CGI Page
CGIプログラムの改良案
MacPerl
The MacPerl Pages
MacPerl FAQ (cfcl.com)
MacPerl: Power and Ease
MacPerl Development
Project: cpan-mac Module (5.2.0r4)
use MacPerl; (Shuck 1.7.0 final)
perlDoc.app (perl POD reader for OS X)
MacPerl (http, ring, CPAN)
MacPerl (ftp, dti, CPAN)
ScriptWeb
MacJPerl, Jcode
MacJPerl
Text::Iconv
Jcode.pm
Jcode
jacode
jcode.pl (ftp, iij)
jcode.pl の私的な解説書
アイヌ語ローマ字カナ変換プログラム

Books

初めての Perl (SOFT BANK, 第4刷, ¥2,900)
私の最初の (1996-08-12 購入) Perl 参考書は、Perl 4 向けで赤い方 でした。懇切丁寧に教へて貰えるので Perl に限らず、Programming 初心者にとって迚も有難い本です。
で全面改訂となり更に充實してゐる様で、併せて読んでみたいです。
プログラミング Perl 第2版 (O'Reilly Japan, 第7刷, ¥4,900)
4 年半振り (2001/01/21 購入) に追加した新しい参考書は、 寢床で読むと迚も楽しいのですが、重いので持ち歩くと云う亊は無いです。
いつになったら プログラミング Perl 第3版 vol.1 & プログラミング Perl 第3版 vol.2 に買い替えられるんでしょうか……。或いは Perl クイック リファレンス の方がいいかなぁ……。
初めての Python (O'Reilly Japan, 初版, 第1刷, ¥3,800)
あぁー、評判通り Sample Script が少なくて理解し辛いですが、まぁ、他の言語の經驗が在れば其れ爲りになんとか飲み込めるんでないかと。v1.5.2 ベースですんで、さらっと讀めば良いだらうし。
初めての Python 第3版 になっとるよぉ。 Python 3000 対応。
Python プログラミング (O'Reilly Japan, 初版, 第1刷, ¥5,200)
ううむ、しまった Python クイックリファレンス を買うべきだった。古いし解らんし (汗)、v1.3 とか謂われてもなぁ……。
Python クックブック 第2版 が結構 評判良い 様です。
Python チュートリアル 第2版 と云う Guido van Rossum の著書が出てます。