2013/06/23

ライフゲーム

以前も何度か書いたことがある。

以前書いたやつはすべてのセルを何度もなめてた。プログラミング・セミナーでは生きてるセルだけに注目する方法が載ってたので、それっぽいのを書いてみた。

ソースはこちら。

左の終端は右の終端と、上の終端は下の終端とつながるようにした。こういうのをトーラスと言うんですってね。

ところで、こういう↓マジキチレベルのライフゲーム

ハッシュライフってやつなのかな?

アルゴリズムの筋がよく了解され、確かに素晴らしいとわかっていても、つまらない字句の誤りでなんとなく全体の信用が落ちるから怖い。プログラミング・セミナー P.175

2013/06/22

Re: Unicodeで遊ぶ

Unicodeには、Ⓐ、ⓐなどといったマル付きの英文字があるみたいなので、英文字列を入力するとマル付き文字に変換する簡単なスクリプトを作ってみました。
というのを見かけたので、試しにGaucheで。
(use srfi-13)
(use srfi-14)
(define (ab->maru str)
(string-map
(^c (let1 i (char->integer c)
(integer->char
(cond ((char-set-contains? #[a-z] c)
(+ (- i (char->integer #\a)) #x24d0))
((char-set-contains? #[A-Z] c)
(+ (- i (char->integer #\A)) #x24b6))
(else i)))))
str))
(print (ab->maru "Masahide Maehara"))
;; => Ⓜⓐⓢⓐⓗⓘⓓⓔ Ⓜⓐⓔⓗⓐⓡⓐ
view raw ab2maru.scm hosted with ❤ by GitHub

2013/06/21

AndroidからSSHトンネリングでWindowsリモートデスクトップ

先日こんなこと言ってたけど、
リモートデスクトップ自体もandroidからやるという話。
ほんで、普通にRDPするんは怖いちゅーこっでConnectBotのポート転送機能をつこてRDPしたろ言う話やな。やってみたらあっけなくて驚き。便利!なのか? しばらく使っていたら携帯がすごくあったかいナリ///

 

Windows と linux 間でリモートデスクトップ

WindowsからWindowsのリモートデスクトップは標準のmstscでいい。LinuxからWindowsはvinagreでいい。

WindowsからLinuxもmstscでやりたかったら?VNC?と思ったらLinux側で準備してればmstscでいいのね。

% sudo apt-get install xrdp

追記

androidからはConnectBotとRemote RDP Liteで。

Wake on LAN と Shutdown

起動の方はいいんだけど、
リモートデスクトップでつながないと電源を落とせないというのも大変なので、調べてみたらsambaが入ってればこんなことできるのね。
net rpc shutdown -I ip_address -U username%password
余談だけど、ウチの会社ではWOLパケットを投げつけるのに、同僚が書いたGaucheスクリプトを使っていたけど、wakeonlanっていうそのものズバリなコマンドがあることを今日知った。
% wakeonlan -i 192.168.0.30 00:E0:81:20:E0:11

2013/06/18

shellでmarquee

HTMLにmarqueeってタグありますよね。

HTMLにmarqueeってタグありますよね。

shellにそういうコマンドないのかなーと思って探したけど見当たらなかったのでgaucheで書いてみた。gaucheのversionは以下の通り。ただテキストが右から左へ流れるだけのしょうもないコマンドができた。

% gosh -V
Gauche scheme shell, version 0.9.4_pre3 [utf-8,pthreads], x86_64-unknown-linux-gnu

使い方は

% marquee hoge
とか
% cat message.txt | marquee
などすればOK。終了はCtrl-C。

-rオプションで左から右へ。alternateオプションは作るつもりだったけど疲れたので作らず放置。helpはいつも英語で書くけど英語全然わからん。

% marquee -h
usage: marquee [option] ... input
 options:
   h|help           print this help
   a|alternate      move from side to side
   s|scrollamount   milliseconds of scrolling speed (default: 100)
   r|reverse        move to right

デカ文字を流したければbannerコマンドとかfigletコマンドの結果を投げつけて下さい。

ソースは以下の通り。なんかごちゃごちゃしてしまったけど動いてるのでこれでいいや。

#!/usr/local/bin/gosh
(use gauche.parseopt)
(use gauche.process)
(use srfi-1)
(use srfi-13)
(define (usage cmd)
(print "usage: " cmd " [option] ... input")
(print " options:")
(print " h|help print this help")
(print " a|alternate move from side to side") ; not implemented
(print " s|scrollamount milliseconds of scrolling speed (default: 100)")
(print " r|reverse move to right")
(exit))
(define (get-tput-val . args)
(process-output->string `(tput ,@args)))
(define (tput . args)
(run-process `(tput ,@args)))
(define (return-to-top)
(tput 'cup 0 0))
(define (sleep-milliseconds n)
(sys-nanosleep (* n 1000000)))
(define (with-full-screen thunk)
(dynamic-wind
(^ _ (tput 'civis)(tput 'clear))
thunk
(^ _ (tput 'cnorm))))
(define (fill-list ls len var)
(if (<= len (length ls))
ls
(append ls (list-tabulate (- len (length ls)) (^ _ var)))))
(define (string-pad-both/index str len index reverse?)
(if reverse?
(string-pad-right (string-pad str (- len index)) len)
(string-pad (string-pad-right str (- len index)) len)))
(define (make-marquee-printer messages reverse? alternate?)
(let* ((cols (x->integer (get-tput-val 'cols)))
(lines (x->integer (get-tput-val 'lines)))
(msg-max-width (apply max (map string-length messages)))
(msg-width (max cols msg-max-width))
(messages (take messages (min lines (length messages)))))
(let1 i 0
(^ _ (let* ((pudder (cut string-pad-both/index <>
msg-width (- msg-width i) reverse?))
(padded (map pudder messages))
(cutter (cut string-take <>
(if (< cols msg-width)
cols
msg-width)))
(cutted (map cutter padded))
(msg (apply string-append
(intersperse (string #\newline) cutted))))
(print msg)
(if (< i (+ msg-width msg-max-width))
(inc! i)
(set! i 0)))))))
(define (main args)
(let-args (cdr args)
((help "h|help" => (cut usage (car args)))
(alternate "a|alternate")
(scrollamount "s|scrollamount=i" 100)
(reverse "r|reverse")
(else (opt . _)
(print "Unknown option : " opt)
(usage (car args)))
. rest)
(set-signal-handler! SIGINT (^ _ (exit)))
(let1 messages (if (null? rest)
(port->string-list (current-input-port))
(call-with-input-string (car rest) port->string-list))
(with-full-screen
(^ _ (let1 murquee (make-marquee-printer messages reverse alternate)
(while #t
(return-to-top)
(murquee)
(flush)
(sleep-milliseconds scrollamount))))))))
view raw marquee.scm hosted with ❤ by GitHub

2013/06/15

捨てアド

サービスは継続したいけど通知メールとか広告メールがうざいサービス。メールを受け取らない設定にしてもメールが来るサービス。受け取らない設定ができないメール配信があるサービス。うざい。ので、メールアドレスを変えるなど。

文字列をbyte単位でぶった切る

Gaucheで。こんな感じでいいのかなー。

#!/usr/local/bin/gosh
(use gauche.parseopt)
(use gauche.uvector)
(use srfi-13)
(define (usage cmd)
(print "usage: " cmd " [option ...] string length")
(print " options:")
(print " h|help print this help")
(print " r|rest print rest string")
(exit))
(define (string-take-byte str n)
(call-with-input-string str
(^p (let rec ((i n)(acc '()))
(if (zero? i)
(u8vector->string (list->u8vector (reverse acc)))
(rec (- i 1)(cons (read-byte p) acc)))))))
(define (string-split-byte str n)
(let1 taken (string-incomplete->complete (string-take-byte str n) :omit)
(values taken (string-drop str (string-length taken)))))
(define (main args)
(let-args (cdr args)
((help "h|help" => (cut usage (car args)))
(rest "r|rest")
(else (opt . _)
(print "Unknown option : " opt)
(usage (car args)))
. rest-args)
(if (or (null? rest-args)
(null? (cdr rest-args)))
(usage (car args))
(let* ((str (car rest-args))
(bytes (clamp (x->integer (cadr rest-args))
0
(u8vector-length (string->u8vector str)))))
(receive (taken tail)
(string-split-byte str bytes)
(display (if rest tail taken)))))))

モバイルバッテリー買った

しばらく前にGalaxy S2からGalaxy S3aに変えたんだけど、バッテリーがガンガン減る。S2のときはCyanogenModにしていたことと、Titanium Backupでいろいろ停止してたからあんなにバッテリーの持ちがよかったのか?それともLTEはバッテリーの減りがすごいってのは本当なのか?それともS3aのせいか?ていうかなんでS4じゃなくてS3a買ってんの?

よくわからんが、関東に出張している時にバッテリーが切れると詰む。電車の乗り換えがハードモード過ぎるので携帯の乗り換え案内アプリが見れないとゲームオーバー。

ということでこの辺↓を参考に買ってみた。

小さくていい感じだ。

ちなみにうちの上司は携帯のバッテリーをもうひとつ買って財布に入れている。


追記

おぉ・・・、これいいな

2013/06/13

筋肉の儚さ

1年半くらい続けていた筋トレを辞めてしまって3ヶ月ほど経った。そろそろ再開しなくては、と昨日から再開。取りあえず腕立て20回やったら筋肉痛に。筋トレを続けている時は毎日腕立て100回しても筋肉痛にならないのに、しばらく間があいたらこれだよ。あーあー諸行無常。



Asterisk関連

社内で使うことになったのでメモ。調べてみたら思った以上に面白くって楽しみ。

参考にしてるとこと、これから読んでみようと思ってるものをごちゃごちゃと書きだす。

本家とかwikiとか

導入事例とかニュースとか

連載的なもの

Raspberry Pi

ひかり電話

設定とかその他

追加

追記

SF小説のまとめみたいなやつのまとめ

たまにSF買って読むのでこういうのありがたい。

Windowsでバッチファイルを書くときのなんたらかんたら

参考になったので書いておく。

結構書く機会があんのよ。

VirtualBoxをサービス化する

ってので今日ハマった。結局iniファイル中の記述のcase sensitive問題だった。エラーメッセージ大事。もうちょっと親切なエラーメッセージで世界が輝きますように。

2013/06/11

cygwinからC#のプロジェクトをbuild

会社のPCはWindowsなのでcygwinを入れている。gitもcygwinから使っている。1年以上TortoiseGitを使っていたけど、バージョンアップのたびにバグや不安定さに悩まされたのでアンインストールした。
git pullした後にrebuildすることが多いんだけど、そのためにわざわざVSを起動するのが面倒。ということでコマンドでrebuildできたら楽なのでshell scriptを書いた。
#!/bin/sh
SLN_NAME=""
while getopts vVn OPT
do
case $OPT in
"v" | "V" ) VERBOSE="TRUE"
shift
;;
"n" ) NO_COLOR="TRUE"
shift
;;
esac
done
if [ "$#" -eq 0 ] ; then
DIR_PATH=`realpath .`
DIR_NAME=`basename $DIR_PATH`
SLN_NAME="$DIR_NAME"".sln"
else
SLN_NAME="$1"
fi
DEVENV="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 14.0/Common7/IDE/devenv.com"
console_printer ()
{
if [ "$VERBOSE" = "TRUE" ] ; then
nkf
else
nkf | grep '===' | sed \
-e 's/=//g' \
-e 's/^.*: /【/' \
-e 's/、/】 【/g' \
-e 's/ $/】/' ;
fi
}
coloring ()
{
if [ "$NO_COLOR" = "TRUE" ] ; then
cat -
else
sed \
-e 's/正常終了/\x1b\[32;01;1m正常終了\x1b\[m/' \
-e 's/失敗/\x1b\[31;01;1m失敗\x1b\[m/' \
-e 's/スキップ/\x1b\[33;01;1mスキップ\x1b\[m/' \
-e 's/更新不要/\x1b\[36;01;1m更新不要\x1b\[m/' ;
fi
}
echo -ne 'clean\t\t'
"$DEVENV" /clean release $SLN_NAME | console_printer | coloring
echo -ne 'rebuild\t\t'
"$DEVENV" /rebuild release $SLN_NAME | console_printer | coloring
echo -ne 'build\t\t'
"$DEVENV" /build release $SLN_NAME | console_printer | coloring
exit
if [ "$VERBOSE" = "TRUE" ] ; then
"$DEVENV" /clean release $SLN_NAME | nkf
"$DEVENV" /rebuild release $SLN_NAME | nkf
"$DEVENV" /build release $SLN_NAME | nkf
else
"$DEVENV" /clean release $SLN_NAME | nkf | egrep '(===|---)' | sed -e 's/========== //g' -e 's/: /\t【/g' -e 's/、/】 【/g' -e 's/$/】/g' -e 's/開始.*$/開始/g'
"$DEVENV" /rebuild release $SLN_NAME | nkf | egrep '(===|---)' | sed -e 's/========== //g' -e 's/: /\t【/g' -e 's/、/】 【/g' -e 's/$/】/g' -e 's/開始.*$/開始/g'
"$DEVENV" /build release $SLN_NAME | nkf | egrep '(===|---)' | sed -e 's/========== //g' -e 's/: /\t\t【/g' -e 's/、/】 【/g' -e 's/$/】/g' -e 's/開始.*$/開始/g'
fi
view raw rebuild.sh hosted with ❤ by GitHub
でもgistをよく見たら微妙に似たようなのあった。
#!/bin/sh
DEVENV_PATH="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/devenv.com"
# get last argument
SLN_PATH=`eval echo '$'{$#}`
SLN_PATH_DOS=`cygpath -d "$SLN_PATH"`
"$DEVENV_PATH" ${@:1:`expr $# - 1`} "$SLN_PATH_DOS" | nkf
view raw devenv.sh hosted with ❤ by GitHub
% devenv /rebuild release ~/hoge.sln
view raw gistfile1.txt hosted with ❤ by GitHub


git logのフォーマット


最近tigも使ってるけど、やっぱりgit logってやることが多いので。
git config --global alias.his "log --pretty='format:%C(yellow)%h%Creset %C(magenta)%<(22,trunc)%cd%Creset %><(11,trunc)%C(black bold)%ar%Creset | %Cgreen%<(10)%an%Creset | %<(130,trunc)%s %Cred%<(45,trunc)%d%Creset' --date=iso --all -n 15"
view raw git-log-format hosted with ❤ by GitHub
でもaliasはhis...。

androidから会社のPCを起動してssh越しにリモートデスクトップ

必要なもの

  • 外からsshでログインできる社内のサーバー
ちなみにうちの会社のSSHはcygwinで動いてます(笑)

方法

まずはリモートデスクトップ接続する会社のPCを起動。うちの場合は同僚がwolパケットを投げつけるGaucheスクリプトを書いてくれているのでそれを使っている。serverにsshでログインしてそのスクリプトを叩くだけなのでandoroidからでもいける。connectbotとかで。
次にsshトンネリング。
% ssh valvallow@server -L 12345:192.168.1.42:3389 -N
Windowsの場合、mysysgitなんかを入れてればmsysgitのbinの中にsshがあるので、下記のようなbatを作っとくと良い。
C:\msysgit\msysgit\bin\ssh valvallow@server -L 12345:192.168.1.6:3389 -N
ほんでリモートデスクトップ接続。windowsからならmstsc。ubuntuとかならvinagreとかからlocalhost:12345に接続で完了。

追記