1 | 2 | 3 | 4 | 5 |最初 次ページ >>
2011年05月16日(月) 09時37分31秒

ブログ更新停止のお知らせ

テーマ:総合
このブログをご覧になっている皆さま、いつもありがとうございます。
この度このブログを更新停止をすることにしました。

さまざまなソーシャルツールが増えている中であまりマメじゃない性格上いろなツールを使いこなせないので、Facebookを通じて皆さまと接点を持ってまいりたいとおもっております。

実際最近はほとんど更新しておらず、ご迷惑をおかけしておりました。

ひとまず、バックアップもかねて今までのエントリーは残しておく予定です。

これからもよろしくお願いいたします!
2010年08月05日(木) 01時06分34秒

パフォーマンス

テーマ:総合


うちのモバイル名人が、あるキャンペーンでくじのようなものを実装していた。

重みランダム選択にしたいという話をしていたのを聞いて、なんとなく気になったのでググってみた。

「重みをつけてランダムに選択する方法」というブログを発見。

記事の最後に参照しているが、「Aのdを二回読みより Bのdの一回読みの方が効率よい」というロジックを紹介していて、その1回読みのアルゴリズム自体はとても面白いと感じたが、本当にパフォーマンスが高いか疑問を感じて整理してみた。


実測しみたところ結果はやっぱり逆だった。
1000件程度のデータから重みをつけてランダムに選択する場合はAのほうが1.5倍程度効率よかった。


まず確かにループの回数は、Aは1.5倍程度Bより多い。

Aは1回目のループは1000回、2回目のループは平均500回まわる。
Bはループが1000回まわる。


ところがループ内の一回ごとのコストをざっくり測定すると以下のとおり。
Aの一回目のループ:13(秒/1000万回)
Aの二回目のループ:16(秒/1000万回)
Bのループ:64(秒/1000万回)


乱数発生処理は処理コストが高く、ループ内で呼び出さないほうがいいのだろう。


簡単にAよりもパフォーマンスを上げたければ、Aのループ処理を分解して、重みの合計値計算は1回のみ実行し、その値を使いまわすのがいい。実際のこの処理方法はAの2倍、Bの4倍のパフォーマンスがでた。


まとめると、当たり前のことだがパフォーマンスの改善に大事なこと。
(1) ある一点の最適化ではなくすべてのの処理を一つ一つのコストを見極めること
(2)とにかく実データを使いベンチマークすること。



「重みをつけてランダムに選択する方法」

http://ameblo.jp/316228/entry-10510330311.html

A

def choice(d):
    s = 0
    for k, v in d.items():
        s += v
    rnd = random.randrange(s)
    for k, v in d.items():
        s += v
        if rand < s:
            return k

B

def choice(d):
    s = 0
    for k, v in d.items():
        s += v
        if random.randrange(s) < v:
            n = k
    return n
2010年07月29日(木) 17時25分58秒

コンパイラ・コンパイラ SableCC チュートリアル

テーマ:総合

簡単なコンパイラを作る用事があり、手作業で字句・構文・意味解析をするか、コンパイラコンパイラを使うか検討してみた。

JavaCCはあんまりイケていないと常々思っていて、今までは同様なケースの場合は、手作業で書いていただが、イケてるコンパイラコンパイラ(SableCC)を発見。

いけてる点は以下。

  • LR
  • 文法定義とプログラムの完全切り分け
  • 外部ライブラリなしで単独で動く

sablecc-4.0-beta2をさっそく使ってみた。

ところが、公式サイトでもネットでもほとんど3.xか2.xの情報。かつ構文定義の構文が3.0と4.0でかな~り違う。

ということで、誰かの役に立つかもしれないので、作ったサンプルを公開してみる。

Excelの計算式のようなことができる行計算言語の実装

  • 優先順位つき四則演算
  • かっこ対応
  • 定数
  • 簡単な関数実装

念のため、2.xの情報をお読みの上、以下はお読みください。
http://shylips.at.infoseek.co.jp/2002/seminar/sablecc/

まず、言語定義(calc.sablecc)

/*
* The grammer of the excel-like caliculation language
*/
Language calc;
Lexer
number = digit+;
ident = alpha (alpha | digit)*;
alpha = 'A'..'Z';
digit = '0'..'9';
blank = ' '+;
mul = '*';
add = '+';
sub = '-';
div = '/';
Token
number, ident, mul, add, div, sub;
Ignored blank;
Parser
expression =
{value:} value |
{add:} expression [op:]add expression |
{mul:} expression [op:]mul expression |
{div:} expression [op:]div expression |
{sub:} expression [op:]sub expression |
{function:} function
;
Priority
Left mul , div;
Left add , sub;
function =
{void:} ident '(' ')' |
{args:} ident '(' args ')';
args = {normal:} expression |
{additional:} expression additional_args;
additional_args = ',' expression | ',' expression additional_args;
value =
{number:} number |
{const:} ident |
{expression:} '(' expression ')' ;

次に、Interpreter.javaの実装

import language_calc.*;
import java.util.*;
public class Interpreter extends Walker
{
private final Stack<Object> stack = new Stack<Object>();
private final Map<String,Integer> consts = new HashMap<String,Integer>();
private final Map<String,Function> functions = new HashMap<String,Function>();
/**
* Add Demo constant variables and functions.
*/
public Interpreter() {
consts.put("ZERO", 0);
consts.put("ONE", 1);
consts.put("TWO", 2);
consts.put("THREE",3);
functions.put("SUM",new Sum());
functions.put("AVG",new Avg());
}
public void calc(Node tree)
{
tree.apply(this);
System.out.println("RESULT:" + pop());
}
private void pushFunctionCall(String ident)
{
stack.push(new FunctionCall(ident));
System.out.println("> (function)" + ident);
}
private boolean isFunctionCall()
{
return stack.peek() instanceof FunctionCall;
}
private String popFunctionCall()
{
final String ident = ((FunctionCall)stack.pop()).ident;
System.out.println("< (function)" + ident);
return ident;
}


private void push(int i)
{
stack.push(new Integer(i));
System.out.println("> (int)" + i);
}

private int pop() {
int i = ((Integer)stack.pop());
System.out.println("< (int)" + i);
return i;
}
private void callFunction()
{
ArrayList<Integer> args = new ArrayList<Integer>();
for (;;) {
if (isFunctionCall()) {
String ident = popFunctionCall();
Function function = functions.get(ident);
push(function.function(args));
break;
} else {
args.add(pop());
}
}
}

@Override public void caseFunction_Void(NFunction_Void node)
{
pushFunctionCall(node.get_Ident().getText());
defaultCase(node);
callFunction();
}
@Override public void caseFunction_Args(NFunction_Args node)
{
pushFunctionCall(node.get_Ident().getText());
defaultCase(node);
callFunction();
}
@Override public void caseNumber(NNumber node)
{
defaultCase(node);
push(Integer.parseInt(node.getText()));
}
@Override public void caseValue_Const(NValue_Const node)
{
defaultCase(node);
push(consts.get(node.get_Ident().getText()));
}
@Override public void caseExpression_Add(NExpression_Add node)
{
defaultCase(node);
push(pop() + pop());
}
@Override public void caseExpression_Sub(NExpression_Sub node)
{
defaultCase(node);
final int r = pop();
final int l = pop();
push(l - r);
}
@Override public void caseExpression_Mul(NExpression_Mul node)
{
defaultCase(node);
final int r = pop();
final int l = pop();
push(l * r);
}
@Override public void caseExpression_Div(NExpression_Div node)
{
defaultCase(node);
final int r = pop();
final int l = pop();
push(l / r);
}
@Override public void defaultCase(Node node)
{
System.out.println("CASE" + ts(node));
node.applyOnChildren(this);
}
@Override public void defaultOut(Node node)
{
System.out.println("OUT" + ts(node));
}
@Override public void defaultIn(Node node)
{
System.out.println("IN" + ts(node));
}
public static String ts(final Node node)
{
return "\"" + node.getText() + "\" " + node.getType() + " @(" + node.getLine() + "," + node.getPos() + ")";
}
}
interface Function
{
public int function(List<Integer> args);
}
class Sum implements Function
{
public int function(List<Integer> args)
{
int sum = 0;
for (final int n : args) {
sum += n;
}
return sum;
}
}
class Avg implements Function
{
public int function(List<Integer> args)
{
int sum = 0;
for (final int n : args) {
sum += n;
}
return sum / args.size();
}
}
class FunctionCall
{
public final String ident;
public FunctionCall(final String ident) { this.ident = ident; }
}

次に、サンプルの計算式

3 * (SUM(ONE,TWO,THREE) * AVG(1,2,3))

次に、ビルド&実行

rmdir /S /Q language_calc
java -jar sablecc.jar -v calc.sablecc
@IF ERRORLEVEL 1 GOTO ERROR
javac *.java
@IF ERRORLEVEL 1 GOTO ERROR
java -cp . Test test.calc
GOTO END
:ERROR
:END
2010年06月13日(日) 16時28分50秒

Android インストール後の作業メモ

テーマ:総合
Android SDKを再インストールしてはまったので。


ユーザ名が日本語の場合、Vistaだとユーザプロファイルに日本語名が含まれてしまうので、デバイス作成後に以下の作業をする。

(1) ユーザプロファイルのシンボリックリンクの作成(これは1回やれば以後不要)
cd %USERPROFILE%\..\
mklinkd /D "motoyasu_yamada" "山田 元康"

(2) デバイス作成のたびに
%USERPROFILE%\.android\avd\<デバイス名>.ini ファイルを以下のように修正
[前] path=C:\Users\山田 元康\.android\avd\<デバイス名>.avd
[後] path=C:\Users\motoyasu_yamada\.android\avd\<デバイス名>.avd
2010年05月27日(木) 17時40分07秒

技術者としての誓い(ドラフト)

テーマ:総合
今日ある原稿を書いていて「エンジニアにも倫理観が必要だ」と書いたあとに、ヒポクラテスの誓いが頭によぎった。

なんとなくしか知らなかったので一度詳しくしらべてみた。また、技術者向けの同様のものはないかと調べてみたら、あるにはあった。

そこで、自分自身も技術者として誓いを立ててみた。

私個人的な技術者としての誓い。





  • 1) 技術を教えてくれた師や学んだ情報源を、実の親のように敬い、自らの財産を分け与えて、必要ある時には助ける。
  • 2) 技術を学ぼうとするものに対して、彼らが学ばんとすれば報酬なしにこの術を教える。
  • 3) 著作や講義その他あらゆる方法で、技術の知識とあわせてこの誓いを分かち与えること。
  • 4) 技術により、善たることを実現するように努める。
  • 5) 自身の能力と判断に従って、顧客や雇用者の長期および短期的な合法的利益、目的、指示、注文に適う方法を選択し、長期的にも短期的にも害と知る方法を決して選択しない。
  • 6) 技術によって、社会やある範囲の人に少なからぬ害になることを、技術者が知っている場合、すべての人々に適切な情報を与え、その人々が危険について合意するかしないかを十分確認できる機会を設け、またその害が避けられるように努める。
  • 7) 技術を知らない人に対して、知らないことをいいことに、騙す・誤魔化すようなことはしてはならない。知らない人にでも理解できるような適切な情報を与えるよう努める。
  • 8) 自分が知りえた機密情報・個人情報等一切の情報の秘密を遵守する。





ちなみに・・・

ヒポクラテスの誓いとは?




  • この医術を教えてくれた師を実の親のように敬い、自らの財産を分け与えて、必要ある時には助ける。
  • 師の子孫を自身の兄弟のように見て、彼らが学ばんとすれば報酬なしにこの術を教える。
  • 著作や講義その他あらゆる方法で、医術の知識を師や自らの息子、また、医の規則に則って誓約で結ばれている弟子達に分かち与え、それ以外の誰にも与えない。
  • 自身の能力と判断に従って、患者に利すると思う治療法を選択し、害と知る治療法を決して選択しない。
  • 依頼されても人を殺す薬を与えない。
  • 同様に婦人を流産させる道具を与えない。
  • 生涯を純粋と神聖を貫き、医術を行う。
  • 膀胱結石に截石術を施行はせず、それを生業とする者に委せる。
  • どんな家を訪れる時もそこの自由人と奴隷の相違を問わず、不正を犯すことなく、医術を行う。
  • 医に関するか否かに関わらず、他人の生活についての秘密を遵守する。


http://ja.wikipedia.org/wiki/...



「誇り高い技術者になろう―工学倫理ノススメ」



元書籍: http://www.amazon.co.jp/...
元サイト:http://dole.moe-nifty.com/...



  • 指針1.一般の害になることを技術者が知っている場合、そのような方法で行為しない

  • 指針2.一般の利益に反する害が避けられる種類のものであれば、それを避けるように努める

  • 指針3.技術的な作業によって、ある範囲の人々に少なからぬ危険が及ぶ場合、そのすべての人々に適切な情報を与え、その人々が危険について合意するかしないかを十分確認できる機会を設ける

  • 指針4.自分の能力の及ぶかぎり、自分の雇用者や顧客の合法的利益、目的、指示、注文に適うように行為する





2010年03月27日(土) 16時47分03秒

FizzBuzz&素数 C/C++/Java/PHP/Perl/Ruby/Python

テーマ:総合

C言語 FizzBuzz


http://ideone.com/HYdOge4a
memcpy以外一切ライブラリを使わない。

C++ FizzBuzz


http://ideone.com/UUk9HKLv
テンプレート使ってみた。

Java FizzBuzz


http://ideone.com/vCM0GN6H

PHP FizzBuzz


http://ideone.com/t2fjARCA
無理やりにHTML(笑)



ここから先はほとんど書いたことがない言語さん。

Perl FizzBuzz


http://ideone.com/4etwbrOG
FizzBuzzぐらいだと PHPとの違いは、elseif ⇒ elsif くらいだな。

Perl 素数


ほとんど書いたことないのでついでに素数も。
http://ideone.com/xuDTulKy

Ruby FizzBuzz


http://ideone.com/d5O6UjS4

Python FizzBuzz&素数


http://ideone.com/lXpYCT6p
2010年03月13日(土) 18時59分21秒

FizzBuzz 8086アセンブラー言語 ~ MASM

テーマ:総合
動作確認していない&出力はVRAMに直接書き込むというへなちょこ版~(涙)


CODE SEGMENT

; registers:
; bx is the loop counter from 1 to 100.
; di is the address to writer the output.
START:
org 100h
mov bx 1
mov di VRAM

; ax,dx are used tp 'div'
FZBZ:
mov ax bx
div 15
cmp dx 0
jpnz FZBZ1

SCOPY 8 FIZZBUZZ

jp FZBZE

FZBZ1:
mov ax bx
div 3
cmp dx 0
jpnz FZBZ2

SCOPY 4 FIZZ

jp FZBZE

FZBZ2:
mov ax bx
div 5
cmp dx 0
jpnz FZBZ3

SCOPY 4 BUZZ

jp FZBZE

FZBZ3:
mov ax bx

FZBZ4:
div 10
add dx '0'
mov byte ptr [di] dx
inc di
cmp ax 0
jpnz FZBZ4

FZBZE:
cmp bx 100
jpz EXIT

mov byte ptr [di] ' '
inc di

inc bx
jp FZBZ

EXIT:
int 21h

;
SCOPY MACRO LEN LABEL
mov si LABEL
mov cx LEN
cld
rep movsb
ret
ENDM

CODE ENDS

DATA SEGMENT
FIZZBUZZ db 'FizzBuzz'
FIZZ db 'Fizz'
BUZZ db 'Buzz'
DATA ENDS



所要時間 1時間超くらい
2010年03月13日(土) 15時38分02秒

Forth版 FizzBuzz

テーマ:総合


: main 1 BEGIN DUP fzbz 1 + DUP 100 = UNTIL ;

: fzbz
DUP DUP
3 mod 0 = IF 1 ELSE 0 ENDIF
swap
5 mod 0 = IF 2 ELSE 0 ENDIF
+
CASE
0 OF . ENDOF
1 OF nip ." Fizz" ENDOF
2 OF nip ." Buzz" ENDOF
3 OF nip ." FizzBuzz" ENDOF
ENDCASE
." "
;



所要時間: 1時間
2010年03月12日(金) 19時42分24秒

Prolongに挑戦してみた!! ~ FizzBuzz

テーマ:総合

main :- i(1,100).

i(X,E):- X =< E,fb(X),X1 is X + 1,i(X1,E).

fb(X) :- (X mod 15) =:= 0,!,write('FizzBuzz ').
fb(X) :- (X mod 3) =:= 0,!,write('Fizz ').
fb(X) :- (X mod 5) =:= 0,!,write('Buzz ').
fb(X) :- write(X),write(' ').


Haskellより難いような~

所要時間:30分

参考図書:http://ja.wikipedia.org/wiki/Prolog
2010年02月19日(金) 14時25分35秒

一昨日書いたへなちょこコード

テーマ:総合

-- FizzBuzz
module Main where

main = putStrLn (fzbz 10000)
fzbz limit = itr 1
where itr n | n <= limit = (tos n) ++ " " ++ itr (n+1)
| otherwise = "";
tos n | (mod n 3 == 0) && (mod n 5 == 0) = "FizzBuzz"
| mod n 3 == 0 = "Fizz"
| mod n 5 == 0 = "Buzz"
| otherwise = show n



module Main where

main = print (primes 2000)

primes n | n == 1 = []
| n == 2 = [2]
| otherwise = if isprime
then preprimes ++ [n]
else preprimes
where preprimes = primes (n-1)
isprime = itr 0
itr i | (length preprimes) <= i = True
| mod n (preprimes !! i) == 0 = False
| otherwise = itr (i+1)


Amebaおすすめキーワード

    1 | 2 | 3 | 4 | 5 |最初 次ページ >>
    アメーバに会員登録して、ブログをつくろう! powered by Ameba (アメーバ)|ブログを中心とした登録無料サイト