「ほっ」と。キャンペーン

とりとめのないことを書いております。
by tempurature
カテゴリ
全体
プログラミング
scheme
verilog
未分類
以前の記事
2016年 04月
2016年 03月
2016年 02月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 03月
お気に入りブログ
PHPで競技プログラミング
メモ帳
最新のトラックバック
ライフログ
検索
タグ
人気ジャンル
ブログパーツ
最新の記事
情報処理技術者試験 お疲れ様..
at 2016-04-17 18:55
基本情報技術者試験 平成27..
at 2016-04-14 04:48
基本情報技術者試験 平成27..
at 2016-04-13 23:03
苦い薬(ハーブ、サプリメント..
at 2016-04-09 14:03
「おバカ度チェックリスト」を..
at 2016-03-24 09:54
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧
<   2015年 09月 ( 9 )   > この月の画像一覧
Microsoftのサインイン画面が表示されない
Internet Explorerのインターネットオプションで、セキュリティ設定を強化するとこのような現象が発生します。

https://login.live.comだけ信頼済みサイトに追加してもうまくいきませんでした。サインインのページで右クリックメニューから「ソースの表示」を選択、参照しているhttpsのドメインを確認して追加します。私の場合はhttps://auth.gfx.msを追加することで問題が解決しました。

<2015.10.4 追記>
Microsoftなどのサービス事業者は、サーバーの管理業務を外部委託しているらしく、上記の方法でセキュリティを確保しようとすると、信頼するサイトの数が何十個にもなってしまうということがありました。


[PR]
by tempurature | 2015-09-30 00:03
【決定版】どうしてracketは流行らないのか?
一重にライセンス形態に問題があると思います。

Racket : LGPL
Clojure : Eclipse Public License
Gauche : BSD License

LGPLで商業製品をリリースするのはGPLほどではありませんが、あまり良い選択肢とはいえないかもしれません。
(そこら辺の事情は「LGPL 商用」で検索すると詳しく書いてあります)

RacketはグラフィックやWeb系のライブラリが充実しているので、非常に使いやすいですが、これらはLGPLのライブラリを援用しているためと推測できます。したがって、例えばracketのBSD実装をするのは意外にハードルが高いように思います。

なので開発環境が貧弱でもClojureやGaucheがもてはやされるのではないかと考えるのです。


[PR]
by tempurature | 2015-09-28 00:23 | scheme
exciteブログ用にソースコードを整形するスクリプト
以前sedで作ったソースコード整形スクリプトをperl, awk, racketでも作ってみました。

<github>

$ wc *
19 36 275 decorate.awk
17 36 305 decorate.pl
37 78 704 decorate.rkts
12 32 221 decorate.sh
31 77 739 decorate2.rkts
116 259 2244 合計

1行ずつ置換するだけであればsedが12行で一番コード効率が高いことがわかります。

次点として、LLであるperlが17行、awkが19行と言った感じでした。
pythonだともう少し短くできるか検討しましたが、やることが単純すぎるので、perlとさして変わらないだろうと感じました。

racketでも2パターン書いてみましたが、それぞれ37行, 31行といった感じでsedやLL言語に比べてコード効率が劣ってしまいました。perlでいうところのwhile (<STDIN>)イディオムと、破壊的代入をせずに順次処理を簡素化するイディオムを手続きとして別途記述する必要があったためです。あと標準入出力と文字列処理のライブラリがLL言語に比べていけてないということもあるのかもしれません。


これらの試みをした理由の一つとしては、sed+pipeの組み合わせでもっと重い処理をさせたとき、プロセスを一度にたくさん立ち上げることのボトルネックが見えてきたので、それを順次処理に置き換えられないかということでした。

<pipeの正しい使い方:プロセス生成時間が見えない>
cat [input-file] \
| (重い処理1) \
| (重い処理2) \
| (重い処理3) \
| cat

<pipeの間違った使い方:プロセス生成時間が効いてくる>
cat [input-file] \
| (軽い処理1) \
...
| (軽い処理1000) \
| cat

その意味で、perlを使えばあまりコード効率を下げずにプロセスを使わないスクリプトが書けるということが分かりました。awkも不慣れながら書いてみましたが、文字列の区切りとしてシングルクオート(')が使えないなど、古いだけあって洗練されてない感じがありました。


racketをperlの代わりに使った時にメリットはあるかということですが、racketを起動するコストはDrRacketほどではありませんが0.3秒ほどで、perlなどとは比べ物にならない遅さでした。また、racoでコンパイルしてから実行してもperlほどには速くなりませんでしたが、体感速度は上がりました。

$ time (decorate.sh tmp.txt > tmp)
( decorate.sh tmp.txt > tmp; ) 0.01s user 0.03s system 85% cpu 0.053 total
$ time (cat tmp.txt | decorate.pl > tmp)
( cat tmp.txt | decorate.pl > tmp; ) 0.03s user 0.00s system 120% cpu 0.025 total
$ time (cat tmp.txt | decorate.awk > tmp)
( cat tmp.txt | decorate.awk > tmp; ) 0.01s user 0.00s system 50% cpu 0.030 total
$ time (cat tmp.txt | decorate.rkts > tmp)
( cat tmp.txt | decorate.rkts > tmp; ) 0.00s user 0.01s system 4% cpu 0.328 total
$ time (cat tmp.txt | decorate2.rkts > tmp)
( cat tmp.txt | decorate2.rkts > tmp; ) 0.00s user 0.03s system 8% cpu 0.343 total
$ raco exe decorate.rkts
$ raco exe decorate2.rkts
$ time (cat tmp.txt | decorate.exe > tmp)
( cat tmp.txt | decorate.exe > tmp; ) 0.00s user 0.01s system 7% cpu 0.188 total
$ time (cat tmp.txt | decorate2.exe > tmp)
( cat tmp.txt | decorate2.exe > tmp; ) 0.01s user 0.01s system 16% cpu 0.180 total

racketの場合、LL言語のイディオムには乏しかったのですが、10行程でそれらの文法を記述できたのでプログラムの規模が大きい場合は得しそうな気はします。

ただし、文法やイディオムによる制約が緩いので、その分可読性を落としている気がします。つまり、読むコード読むコード構造が違うという感じです。


[PR]
by tempurature | 2015-09-21 01:21 | プログラミング
【racket】Cygwinでracketを実行する方法
1. DrRacketのインストールディレクトリを確認します。

デフォルトでは、C:\Program Files\Racketになっているはずです。

2. Cygwin上の認識名を確認します。

Cygwinでは、C:\は/cygdrive/c/というパスなので、
C:\Program Files\Racketというパスは、/cygdrive/c/Program Files/Racketになります。実際にCygwinのターミナルでDrRacketのパスまでたどってみます。
Program Filesのように半角スペースが入っているディレクトリ名は、シングルスペース(')かダブルスペース(")でくくります。

$ cd /cygdrive/c
$ cd 'Program Files'
$ cd Racket
$ pwd
/cygdrive/c/Program Files/Racket
$ ls
collects          mred-text.exe   plt-r6rs.exe              share
doc               mzc.exe         plt-web-server.exe        slatex.exe
DrRacket.exe      mzpp.exe        Racket Documentation.exe  Slideshow.exe
etc               mzscheme.exe    Racket.exe                swindle.exe
GRacket.exe       mztext.exe      raco.exe                  Uninstall.exe
gracket-text.exe  pdf-slatex.exe  README.txt
include           PLT Games.exe   scribble.exe
lib               plt-r5rs.exe    setup-plt.exe

3. /usr/local/binにRacket.exe, DrRacket.exe, raco.exeのシンボリックリンクを張ります。

$ ln -s '/cygdrive/c/Program Files/Racket/Racket.exe' /usr/local/bin/racket
$ ln -s '/cygdrive/c/Program Files/Racket/DrRacket.exe' /usr/local/bin/drracket
$ ln -s '/cygdrive/c/Program Files/Racket/raco.exe' /usr/local/bin/raco
$ ls /usr/local/bin
drracket racket raco

4. /usr/local/binにパスが通っていることを確認します。

$ perl -e 'if (":$ARGV[0]:" =~ m|:/usr/local/bin/{0,1}:|) {print "OK\n";}' $PATH
OK

手順は以上です。


Cygwinでracketを使うメリットとしては、racketスクリプトがあります。
racketスクリプトは、拡張子が.rktsで、次のようにshebangを書きます。

#!/usr/local/bin/racket

shebangを半角スペースを含むパスに適用するとうまく行かないのですが、上記の方法ではうまく行きます。


[PR]
by tempurature | 2015-09-20 18:30 | scheme
【racket】中居のミになる図書館で紹介されていたソウルナンバーを求める関数
簡単そうなので作ってみました。2時間かかって夜更かしになってしまったので、少し後悔してます。

#lang racket

(define (substring-all str)
  (map (lambda (i) (substring str i (add1 i))) (range (string-length str))))
(define (str-sum str)
  (apply + (map string->number (substring-all str))))
(define (accumulate enough? go-next init)
  (if (enough? init) init (accumulate enough? go-next (go-next init))))

(define (solve-soul-number date)
  (let* ((r (regexp-match #px"([0-9]{4})\\/([0-9]{1,2})\\/([0-9]{1,2})" date))
         (s (apply + (map str-sum (rest r)))))
    (accumulate (lambda (n) (< n 10))
                (lambda (n) (str-sum (number->string n)))
                s)))


[PR]
by tempurature | 2015-09-16 01:06 | scheme
【Linux】テキストファイルを繰り返して出力する
テキスト処理の性能評価のため、10行程度のテキストファイルを10000回繰り返して表示させたいと思いました。catやsedでできるかなと思いましたが、そのようなオプションはなさげ。

ただ、which repeatと入力すると、そういうコマンドがあるっぽい。

$ which repeat
repeat: shell reserved word

(※もともとcsh系のコマンドらしく、bashでは使えません。zshでは使えます)

さっそく使ってみることに。

$ cat AtoZ
A
(略)
Z
$ wc AtoZ
26 26 52 AtoZ
$ repeat 10 cat AtoZ > tmp
$ wc tmp
26 26 52 tmp

おかしいなぁ もしかしてtmpが10回ファイルオープンしているとか

$ (repeat 10 cat AtoZ) > tmp
$ wc tmp
260 260 520 tmp

うまくいきました。

ところが、この時点で、なんか動作がもっさりしています。なので

$ time (repeat 10 cat AtoZ) > tmp
( repeat 10; do; cat AtoZ; done; ) > tmp 0.04s user 0.01s system 70% cpu 0.085 total
$ time (repeat 1000 cat AtoZ) > tmp
( repeat 1000; do; cat AtoZ; done; ) > tmp 1.48s user 3.86s system 80% cpu 6.638 total

1000回の繰り返しで6.6秒もかかっています(Cygwinでの実行結果です)。

しばらく考えて、繰り返した回数だけcatのプロセスを生成していることに気が付きました。根本的すぎて嫌になります。

catに代わる繰り返し出力用コマンドを作ってみました。

$ cat dog
#!/usr/bin/python

# dog command --- concatnate standard input repeatedly
# cat [file] | dog [num]

import sys

text = sys.stdin.read()
for i in range(int(sys.argv[1])):
print text,

dogを実行した結果、物凄く早く終わりました。

$ time (cat AtoZ | dog 1000) > tmp
( cat AtoZ | dog 1000; ) > tmp 0.03s user 0.01s system 78% cpu 0.058 total

dogでは標準入力しか受け付けず、しかもプログラム内のバッファに一度ためてから出力するので、長大な標準入力は受け付けられません。長大なファイルを入力する場合はプロセス生成時間よりもファイルアクセス時間のほうが長いのでrepeatを使ってくださいということです。


[PR]
by tempurature | 2015-09-12 22:57 | プログラミング
【Linux】現在のシェルを調べる方法
csh, bash, zshなどを併用している時、現在のシェルがどれなのかを知りたくなると思います。

ドットファイルを自由に書き換えて良いのであれば、以下のやり方が一番単純だと思います。

.cshrcに次の一文を書く

set CURRENT=csh

.bashrcに次の一文を書く

CURRENT=bash

.zshrcに次の一文を書く

CURRENT=zsh


現在のシェルを知りたくなった時に、次のコマンドを入力します。

echo $CURRENT


<出力例>

$ csh
% echo $CURRENT
csh

$ bash

$ echo $CURRENT
bash

$ zsh

$ echo $CURRENT
zsh


[PR]
by tempurature | 2015-09-12 15:36 | プログラミング
シェルスクリプトの関数を他のスクリプトで使いたいときは?
シェルスクリプト内でsourceすればいいです。

スクリプト内で、

foo.sh

と書くことは、他の言語ではsystem("foo.sh")とかに相当します。

source foo.sh

と書くことは、他の言語ではinclude foo.shとかに相当します。

また、コンソール画面上でシェルスクリプトの関数を使いたい時もsourceすれば使えますし、.bashrcなどに書いた関数はコンソール上で使用できます。

$ tail -4 .bashrc
function greet {
echo "Hello, everyone!"
}

$ bash

$ greet
Hello, everyone!


[PR]
by tempurature | 2015-09-12 14:25 | プログラミング
chromeリモートデスクトップでアンダーバー(_)を入力する方法
(※2015.10.3 修正 UWSCはnortonで脅威と認識されてしまうので、UWSCを使用する方法は削除させていただきました)

Windows8.1のIMEでは「あんだー」を変換すると「_」を入力することができました。
私の場合は、さらに単語「_」を読み「あ」で登録しています。

[PR]
by tempurature | 2015-09-11 22:37