Recently in programming Category

 WHATWGでHTML5仕様がLast Callになった。徐々にではあるが、Web Application が普及する環境が整いつつある。(どうもW3Cは聞いていなかったらしく、ちょっと揉めそうな感じみたいだが。)

 さて、以前もここで書いたとおりHTML5はそれまでの文書の構造化に加え、振る舞いの要素の追加が行われており、スクリプト言語のインターフェースも規定されている。このスクリプト言語は仕様の上では指定されているわけではないが、事実上JavaScriptだろう。ということでそろそろちゃんとJavaScriptを書けるようにならなきゃいかんのかなぁ。ということで、まずはクロージャーからやってみた。

<html lang="ja">
<head>
  <title>Closure Test</title>
  <meta http-equiv="Content-Type" content="text/plain;charset=UTF-8">
</head>

<body onload="onLoad()">
<script type="text/javascript">
var countUp;

function makefunc()
{
    var x=0;
    return function(){return x++;};
}

function onLoad()
{
    countUp = makefunc();
    window.setInterval(onTimer, 100);
}

function onTimer()
{
    document.getElementById('count').innerHTML = countUp();
}

</script>

<div id="count"></div>
</body>
</html>

 このコードは、100ms毎にカウントアップして表示するもの。makefuncがカウントアップする関数オブジェクトを作り、onloadハンドラでグローバル変数countupに保存しておく。それを100ms毎に呼び出している。実行すると下のようになる。

久しぶりにshell (bash) script。一つのデータが一行ごとに並んでいるファイルから必要な部分を取り出すスクリプト。今回はbashの組み込み関数である getopts を使ってみた。

#!/bin/bash
#
# clip.sh -f FROM -t TO FILE
#

while getopts "f:t:" i;do
	case $i in
		f) FROM=$OPTARG;; # Time From
		t) TO=$OPTARG;;   # Time To
	esac
done

shift $(($OPTIND - 1))
FILE=$1

LINES=`wc --line $FILE | cut -d " " -f 1`
FLINE=`grep -n $FROM $FILE | cut -d : -f 1 | head -n 1`
TLINE=`grep -n $TO $FILE | cut -d : -f 1 | head -n 1`

if [ $FLINE -ge $TLINE ]; then
	TMP=$FLINE;
	FLINE=$TLINE;
	TLINE=$TMP;	
fi

HEAD=$(($TLINE-$FLINE))
TAIL=$(($LINES-$FLINE+1))

tail -n $TAIL $FILE | head -n $HEAD

 たとえばこのようなファイルがあるとすると

11:00:17 24.93 72.9
11:00:17 24.94 72.8
11:00:17 24.94 72.7
11:00:18 24.95 72.4
11:00:19 24.96 72.1
11:00:20 24.97 71.9
11:00:21 24.97 71.8
11:00:22 24.98 71.7
11:00:23 24.99 71.4
11:00:24 25.00 71.2
....

このファイルをdata.txtというファイル名として、この中から12:00:00から13:00:00まで取り出したいとすると、

$ clip.sh -f 12:00:00 -t 13:00:00 data.txt

とすれば標準出力に出力される。

 ふ、例によって誰もついて来れまい。あ、ぴらふとCZDの二氏は除く。ってかこのくらいのコマンドは、textutilあたりにありそう。良い解法があればコメントよろ。

 前回の記事haveの指摘に従い、参照渡しをやめてヴェクタを返す関数にしてみた。

std::vector<string> 
slice(const std::string source, const std::string dem)
{
  std::string::size_type i1 = 0;
  std::string::size_type i2 = source.find(dem);
  std::vector<string> retval;

  if(std::string::npos == i2)
    return retval;

  std::string s = source + dem;

  do{
    retval.push_back(s.substr(i1, i2-i1));
    i1 = i2+1;
  }while(std::string::npos != (i2 = s.find(dem, i1)));

  return retval;
}

 ちょっと効率は落ちたが、Atomicになったので前回のコードにくらべ、マルチスレッドプログラミングで安全に使えるようになった。

Thanks! nice comment > Have

C++を書いていて、JavaのSttringTokenizerのようなことをやりたいことがある。C++標準ライブラリだけで書いてみた。

void slice(const std::string source, 
	   const std::string dem, 
	   std::vector<std::string> *retval)
{
  std::string::size_type i1 = 0;
  std::string::size_type i2 = source.find(dem);

  if(std::string::npos == i2)
    return;

  std::string s = source + dem;

  do{
    retval->push_back(s.substr(i1, i2-i1));
    i1 = i2+1;
  }while(std::string::npos != (i2 = s.find(dem, i1)));
}

 この関数は、sourceで指定した文字列をdemで指定した文字で切り分けて、切り分けた結果をretvalで指定したヴェクタに格納ものである。テストしてみると。


using namespace std;

int main(void)
{
  string source = 
    "DCV_,___,___,-00.0073E-3,DCV_,___,___,+00.000E-3,6247865";

  vector<string> vec;
  vec.clear();

  slice(source, ",", &vec);
  if(vec.empty()){
    cout<< "not found"<< endl;
    return -1;
  }

  cout<< vec[3]<< " "<< vec[7]<< endl;
  return 0;
}


$ ./a.out
-00.0073E-3 +00.000E-3

 ちゃんと値は切り出せている。listに結果を格納するようにすれば、もっとStringTokenizerっぽくなるかな。

久しぶりScheme

| | TrackBacks (0)
PHOTO: On Lisp Cover

 久しぶりにschemeでコードを書いてみた。実用のコードでは初かな。処理系はGaucheで、標準入力から数値を入力して標準偏差を計算するコード。

(define (ave-list lst)
  (/ (fold + 0 lst) (length lst)))

(define (var lst)
  (let ((ave (ave-list lst)))
    (/ (fold + 0 
	     (map (lambda (x) (* x x)) 
		  (map (lambda (x) (- x ave)) lst)))
       (length lst))))

(define (sd lst)
  (sqrt (var lst)))

(display (sd 
	  (map string->number (port->string-list 
			       (current-input-port)))))

リストを修正するコードの連鎖と高階関数。この感覚がLISPっぽい。

 新しいカメラは届きました。

2009-06-06 追記
 はぁ?LET?とか言われそうなので(誰に?)、LETなしバージョンは、sdをこうすれば良い。


(define (var lst)
  ((lambda (ave)
    (/ (fold + 0
	     (map (lambda (x) (expt x 2))
		  (map (lambda (x) (- x ave)) lst)))
       (length lst)))
   (ave-list lst)))

もう誰もついてきてないか....
あと写真を追加しました。

PHOTO: Ear Phone

 Microsoft Speech APIを触ってみた。.NETだとすごく簡単だった。Hello Worldは以下のとおり。Microsoft Windows XP上で、Microsoft Speech SDK 5.1をインストールし、Visual C# 2005 Express Editionで作成した。最初に参照設定で、"Microsoft Speech Object Library"を追加すること。
 このコードは、インストールされているすべてのVoiceで"It's fine today"と発音する。

using System;
using System.Collections.Generic;
using System.Text;
using SpeechLib;

namespace TTSTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SpVoice voice = new SpVoice();
            ISpeechObjectTokens token = voice.GetVoices("", "");
            for (int i = 0; i < token.Count; i++)
            {
                voice.Voice = token.Item(i);
                Console.WriteLine(token.Item(i).GetDescription(0));
                voice.Speak("it's fine today", SpeechVoiceSpeakFlags.SVSFlagsAsync);
            }
            while (voice.Status.RunningState == SpeechRunState.SRSEIsSpeaking) ;
        }
    }
}

今月からJava読書会に参加する予定だ。課題図書はJavaネットワークプログラミングの神髄である。予習課題が出ているので早速やってみた。

PHOTO:Clock

 めずらしく技術的な話である。おそらくnoisefactoryの常連読者の皆様のほとんどが興味がないと思われる。気にしないように。

 naoya氏のblogエントリLinux のスリープ処理、タイマ処理の詳細を見るにインスパイアされて、Linuxのシステムコールgettimeofday(2)がマイクロ秒の精度がある理由を調べてみた。 ナゼこんなことに興味があるかというと、時刻を監理しているticsという変数は、(デフォルトでは)4ms毎に更新される。 にもかかわらず、gettimeofdayがその1000倍以上の精度を持っているのは非常に不思議だ。

ハード屋なのかソフト屋なのか学者なのかよくわからない人代表としては、ハード側から攻めて見る事にした。 そもそもCPUにはclockというピンがあり、CPUのペリフェラルにはタイマカウンタがある。 詳細Linuxカーネルの6章によると、tsc(Time Stamp Counter)というカウンタがあるという。おそらくここに到達するだろうということで lxrで追って見る事にした。この記事では、Linux 2.6.11 i386のソースを用いることにする。

About Me

中尾 圭佐(chomy)
千葉県船橋市在住のモノクロ写真に目覚めた研究者。
Twitter ID: jm6xxu
Skype: chomy

My Tweets

jm6xxu: @mehori 了解しました。当選した場合、一括してお引き受けいたします。Google Docで論文まで書かれるということで、そこまで使えるようになりましたか。私もそろそろAnnual Reportを書かなければならないので、試してみることにします。

jm6xxu: @mehori Making TeX Work ください。TeXを廃止されて次は何を使われるのですか?

jm6xxu: これより帰宅。どうやら雨になったようだ。でも気温2℃って.... > RJTT 091400Z 34021KT 6000 -RA FEW008 SCT012 BKN020 02/01 Q1008 RMK 1ST008 4SC012 6SC020 A2979 P/FR

jm6xxu: むう。雪が積もってきた。予報では雪がやんでも未明まで雷を伴った雨とのこと。雨にしろ雪にしろ水分は大量に供給されるということか。 とにかく早く帰るべく、努力する。

jm6xxu: @henrich ども。 @jm6xxu 乙。

About this Archive

This page is a archive of recent entries in the programming category.

photograph is the previous category.

Find recent content on the main index or look in the archives to find all content.

Powered by Movable Type 4.261