ラベル Squeak の投稿を表示しています。 すべての投稿を表示
ラベル Squeak の投稿を表示しています。 すべての投稿を表示

2010年7月31日土曜日

[Squeak] ボゴソート?

同僚にボゴソートというのいうソート?があるのを聞いたので,作ってみた.
説明を受けた通りに実装したみた.

合っているのかよくわからない・・・.
最悪計算量,無限大ってどうなんでしょうね.

Transcript clear.
x := 10.
box := Array new:x.
1 to:x do:[:v | box at:v put: (1 to: 100) atRandom].
box do:[:v |Transcript show:v; show:Character space. ].
Transcript cr.
c := 1.
counter := 1.
[box size = counter] whileFalse:[
  counter := 1.
  box := box shuffle.
  2 to: box size do:[:i | 
    ((box at: i -1) < (box at: i) )
         ifTrue:[ counter := counter + 1]
  ].
 c := c + 1.
].

box do:[:v |Transcript show:v; show:Character space. ].
Transcript cr;show:'loop counter='; show:c; cr.

ソートとよべるのか? これは,奇跡を待つだけのソートだと思う.

2010年7月26日月曜日

[Smalltalk] Smalltalkの虎の巻

sumimさんがSmalltalkのチートシートを書かれたようです.
個人的には,読む価値がかなりある記事だと思います.

話題の Big Scripting Languages チートシートの Smalltalk の空欄を埋めてみた - Smalltalkのtは小文字です

http://d.hatena.ne.jp/sumim/20100726/p1
http://d.hatena.ne.jp/sumim/20100727/p1

最初見たとき,ちょっと感動しちゃった.

タイトルを虎の巻にしたのは,Eclipseの日本語ローカライズが「チートシート」を「虎の巻」と訳していたからw

[Squeak][Objective-C] へっぽこSqueak SmalltalkユーザによるSqueak Smalltalkで考えるObjective-C その1

私はinputはしてもoutputをあまりしてこなかったので,文章を書くのが下手.
未だに知識がしっかりつかないのは,outputがきちんとできないため.

ということで,需要があるかわかりませんが,へっぽこSqueak SmalltalkユーザによるSqueak Smalltalkで考えるObjective-Cを書いてみます(おそらく大学の身内しか必要ないだろう).

でも,時間がないので,テキトーなメモです.

Hello World

Squeak Smalltalk
Transcript cr; show:'Hello World'.

Objective-C
// file name   ->  test.m
#import<foundation/foundation.h>
int main(void){
  NSLog(@"Hello World");
  return 0;
}

実行方法
Squeak Smalltalk
"Workspaceに記述し,do it"

Objective-C

端末で以下のような方法でコンパイル
$ gcc -framework Foundation  test.m


リテラル
Objective-CはC言語のリテラルが使えます.

コメント
Squeak Smalltalk
ダブルクオーテーションで囲みます.

Objective-C
// または,/* ・・・*/ です.




Squeak Smalltalk
全てオブジェクトとして扱います.

Objective-C
Cの基本データ型の数値とNSNumberクラスのインスタンスがある.
NSIntegerは普通のintまたはlong.


NSNumber *number = [NSNumber numberWithFloat: 1.0];

文字列

Squeak Smalltalk
シングルクオーテーションで囲みます.
'文字列です'

Objective-C
C言語の文字列以外に,NSStringのインスタンスの文字列があります.

ダブルクオーテーションで囲み,先頭に@を付けます.
@"文字列です"

代入
Squeak Smalltalk
 :=

Objective-C
=

文末
Squeak Smalltalk
."ピリオド"

Objective-C
; //セミコロン

メッセージ式

Squeak Smalltalk
'Ringo no Tane' size. "文字列の長さを求める"

Objective-C
[ ] で囲むことにより,メッセージが送信できます.Objective-Cにはメッセージ式による優先順位がない.優先順位は括弧の付け方で決定される.
[@"Ringo no Tane" length]; //文字列の長さを求める

算術演算

Squeak Smalltalk
Smalltalkでは,メッセージ式の優先順位で計算をする.

Objective-C
C言語と同様な優先順位で行なわれる.

カスケード

Squeak Smalltalk
; "セミコロン"


"カスケードなし"
Transcript cr.
Transcript show:'Hello'.

"カスケードあり"
Transcript cr; show:'Hello'.

Objective-C
存在しません.

ブール値

Squeak Smalltalk
true "真,Trueクラスのインスタンス"
false "偽,Falseクラスのインスタンス"
nil "不定"

Objective-C
Bool型はブール値を扱うための方
YES //真を表す定数 0でない値
NO //偽を表す定数 0
nil //nullのオブジェクトを示す.nilはid型の空ポインタ.値は0.

制御構造

if

Squeak Smalltalk
if文はありませんが,ifに相当するメソッドが実装されています.

1 > 0 ifTrue:[  Transcript show:'Ha Ha Ha!!'; cr. ].
Objective-C

if(1 > 0){
  printf("Ha ha Ha!\n");
}

while

Squeak Smalltalk
i := 0.
[i<4] whileTrue:[ Transcript cr;show:'hoge'. i := i + 1. ].

Objective-C
int i = 0;
while(i<4){
  printf("hoge\n");
}

for

Squeak Smalltalk
for文のように振る舞うto:, to:do:, to:by:do:があります.


1 to: by:1 10 do:[:v | Transcript cr;show:v ].

Objective-C

int i;
for(i=1; i<11; i=i+1){
  printf("%d",i);
}
SmalltalkのイテレータとObjective-C高速列挙
別の時に説明します.

switch

Squeak Smalltalkにはありません.
余談,SmallTalk R4.1 http://smalltalk.smalltalk-users.jp/ ならあります.

Objective-C
略します.


次回は,クラス定義について書こうと思います.

2010年7月25日日曜日

[Squeak][VisualWorks] fold:

相変わらず,どうでもいいこと書きます.

http://lists.gforge.inria.fr/pipermail/pharo-project/2010-July/029669.html

fold:

foldと言われると,Squeakでは,inject:into:がすぐに思いつく.

#(1 2 3) inject:0 into:[:v1 v2 | v1 + v2 ].

Haskellでは
foldl (+) 0 [1, 2, 3]
Schemeでは
(fold + 0 '(1 2 3))

私のような初心者プログラマーは,初期値を考えるのが大変なので,ついつい,以下のようなコードを書いてしまいそうになってしまう.
array := Array with: 1 with: 2 with:3.
x := array first.
xs := array allButFirst.
xs inject:x into:[:v1 :v2 | v1 + v2 ].

このプログラムでは,allButFirstで,新たに配列を生成しているので,非効率.
やはり,きちんと初期値を決めなければなりません.

一方,Schemeでは,
gosh> (define array '(1 2 3))
gosh> (fold + (car array) (cdr array))
6

cdrは新たにリストを作成しているわけではないので,心配ありません.

それなら,初期値を考えていれればいいと言われる方もいると思いますが,これが意外と難しい.
例えば,配列の中から最大値を求めるのをinject:into:を書こうと思うと・・・.

array := Array with:-10 with:2 with:100.
array inject:  Float infinity negated into:[:v1 :v2 | v1 max: v2 ].
この場合は,マイナス無限大を初期値にする.


ちなみにVisualWorksでは,SequenceableCollection>>fold: が実装されている(さすが!).

array := Array with:1 with:2 with:3.
array fold:[:v1 :v2 | v1 + v2 ].

実装方法は,以下の通り.
SequenceableCollection>>fold: 
 | size nextValue |
 (size := self size) = 0 ifTrue: [^self emptyCollectionError].
  nextValue := self at: 1.
  2 to: size do:
  [:i | nextValue := binaryBlock value: nextValue value: (self at: i)].
  ^nextValue

先ほど,プログラムも簡単にかけます.

array := Array with:-10 with:2 with:100.
array fold:[:v1 :v2 | v1 max: v2 ].

ただし,SequenceableCollection>>fold: では,空のコレクションが与えられると,エラーになるので,注意が必要.エラーを発生させたくないなら,inject:into:を使うべき.
#() inject: 0 into:[:v1 :v2 | v1 + v2 ] "0が,かえってくる"

gosh> (fold +  0 '())
0

ふー,つかれた.

素人の意見としては,fold:が実装されるのは賛成.
みなさんはどう思われますか?



さらに,どうてもいいこと.

今回のでVisualWorksすごい!ってと思いましたが,Squeakユーザなので,操作がなかなか慣れない.

もともとHaskell,Schemeは,ほどんと書けなかったのですが,さらに書けなくなりましたorz

やっぱりReal Worldを購入すべきなのだろう.
英語本はもっているけど,読む時間がかかるので,やっぱり翻訳版を購入しようかな(でも高い・・・).
学生の頃に,翻訳本が出るとは思わなかったので,ついつい買ってしまった.

プログラミング言語の本を献本でもらえる人っていいなって思うけど,感想書くのが大変そう・・・.

2010年7月22日木曜日

[Squeak] クイックソート その2

前回のクイックソートをSqueak 4.1以前のSqueakでも実行できるように変更してみました.

相変わらず,コストは無視しています.

quickSort := [:array  |
 | x xs left right |
 array isEmpty ifTrue:[ array ] ifFalse:[
 x := array first.
 xs := array allButFirst.
 left := xs select:[:v | v < x].
 right := xs select:[:v | v >= x].
  (quickSort  copy fixTemps value: left),(Array with:x), (quickSort copy fixTemps value:right )]].

quickSort copy fixTemps value: #(30 10 20 40 80 60) .


やっぱりSqueak 4.1がいい!

[Squeak] クイックソート

Squeakのブロックの使い方の例として.クイックソートを考えてみた.

コストは気にせず書くと,Haskellっぽく記述できます.

Squeak 4.1以前のSqueakだと以下のプログラムは実行できません.

quickSort := [:array |
| x xs left right |
array isEmpty ifTrue:[ array ] ifFalse:[
x := array first.
xs := array allButFirst.
left := xs select:[:v | v < x].
 right := xs select:[:v | v >= x].
(quickSort value: left ),{x}, (quickSort value:right )]].

quickSort value: #(30 10 20 40 80 60).
ここでのポイントは,ブロック内リターンを使わないこと.
ブロックは最後に評価したオブジェクトの返り値がかえるので,それを利用すること.


2010年7月19日月曜日

iSqueakを動かしてみる

iPhoneやiPad上で動かせるSqueakとしてiSqueakというのがあります.

そのためのコードを作者であるJohn M McIntoshさんが公開してくださっています.
John M McIntoshさんに感謝です.

http://isqueak.org/HomePage

このiSqueakのVMを利用してEtoysのイメージを動かしているのが,先日公開されました.



このソースはBert Freudenbergさんが公開してくれています.こちらでは,キーボード入力ができるようになっています.マルチタッチも可能.

ということで試してみました.
きちんと利用できるのにするためには.少し手間がかかったので,ここに記録しておきます.

いろいろと間違っていたらすみません.

必要なもの

  • Mac(intel + Snow Leopard )
  • Xcode(iPhone開発環境が含まれているのもの)
  • iSqueakのソースコード
  • PharoV10.sources.zip(iPadでEtoysを動かさないなら必要ない)
  • iPadでEtoysを動かすためのソースコード(キーボード入力を可能にする人)
  • Etoys(Etoys-To-Go4-Final.zip)
  • iPhone Developer Program(実機で動かしたい場合には必要です.1ライセンスで100台まで動かすことが可能なので,私に連絡していただけたら,一部の方だけなら・・・.)
  • iPhoneまたはiPad(実機で動かしたい場合には必要です)
  • あとは根性w?
まずは,iSqueakのソースコードをダウンロードしましょう.Subversionで公開されているので,保存したいディレクトリに移動して,ターミナルで以下のように入力します.

$ svn co http://squeak.org/svn/squeak/trunk/
$ svn co http://squeakvm.org/svn/squeak/trunk/

続いてPharoV10.sources.zipをダウンロードします.

http://www.pharo-project.org/pharo-download

PharoV10.sources.zipを解凍して,PharoV10.sourcesをtrunk/platforms/iOS/vm/iPhone/ に入れます.

trunk/platforms/unix/plugins/SocketPlugin/sqUnixSocket.cを以下のように編集します.

82行目
# include <netinet/udp.h>

以下のように変更します.

# ifndef TARGET_OS_IS_IPHONE
# include <netinet/udp.h>
#endif

ダウンロードしたiSqueak内のSqueakPureObjc.xcodeprojをダブルクリックをします(trunk/platforms/iOS/vm/ 内にあります).
「ビルドと実行」をします.問題があったら大変なので,まずはシミュレータを使って実行しましょう.

続いて,iPadでEtoysを動かしてみたいと思います.Xcodeを開いてる場合,終了します.

以下のアドレスから,Etoys4iPad-VM.zip,touchHand-bf.1.cs,touchSensor-bf.1.csをダウンロードします.

Bert Freudenbergさんに感謝

http://lists.squeakland.org/pipermail/etoys-dev/2010-June/005098.html

touchHand-bf.1.cs,touchSensor-bf.1.csは,拡張子をcsファイルとしてダウンロードしてください.

Etoys4iPad-VM.zipを解凍して,Etoys4iPad-VMディレクトリのplatforms/Mac\ OSObjC/vm/iPhone/Classes の中にあるファイルをtrunk/platforms/iOS/vm/iPhone/Classesにコピーします.


続いて,Etoys-To-Go4-Final.zipをダウンロードします.

http://www.squeakland.org/download/

Etoys-To-Go4-Final.zipを解凍しましょう.Etoys-To-Go 4.appで右クリックをして「パッケージ内容を表示」を選択します.

Contents/Resourcesからetoys.image,etoys.changes,EtoysV4.sources,fontsディレクトリをtrunk/platforms/iOS/vm/iPhone にコピーをします.

コピーしたetoys.imageをEtoys-To-Go 4.appにドラッグして起動します.
起動したら,日本語フォントを導入するかは任意です.

touchHand-bf.1.cs,touchSensor-bf.1.csをWorld内にドラッグをして読み込ませます.

etoys.imageでワークスペースを開く方法がわからなかったので,Etoysのライセンス表示で開かれるWorkspaceを利用して以下のプログラムを実行.

TouchCmdMorph new openInWorld.

表示されたMoprhは好きな一に移動させておきます.
変更内容を保存します.etoys.imageだとどのように保存するかわからないので,Workspaceで以下のコードを実行.

Smalltalk snapshot: true andQuit: true.

終了したら,コピーしたfontsディレクトリは削除しても構いません.

Xcodeを開きます.etoys.image,etoys.changes,EtoysV4.sourcesをXcodeの左側に表示されているResourcesフォルダにドロップします.

Xcodeで「プロジェクト」—「アクティブターゲット"SqueakNoOGLIPhone"を編集」を選び,「ビルド」のタブを選択します.

GCC 4.2 - プリプロセスのプリプロセッサマクロにISQUEAK_SOURCES="PharoV10"とISQUEAK_IMAGE="iPhone"を追加します.
動作させるイメージはetoys.imageですけど,追加しないと動作しません.
ここまでが終わったら,ビルドと実行をしましょう.最初はシミュレータを使ってビルドすることをおすすめします.

起動すると,画面がおかしいので,command + ← をして画面を横にします.
横になるときちんと表示されます.

command + → で画面を縦にするとキーボードが表示されます.
仕様で画面を縦にしないと表示されません.

TouchCmdMorphを押しながら,pなどをするとprint itができます.



素敵ですね!!
よかったらお試しあれ.

私は,iPadを3.2.1にアップデートしてしまったので,iPadインストールができない状態ですorz

iOS 4.1 betaには対応しているけど,3.2.1には対応していないのはどうなんだろう・・・.
Xcode早くアップデートして欲しい.

さすがに,ここまで書くと疲れる.



ビルドしてきちんと動作しない場合は,Xcodeで「キャッシュを空」にして「全てのターゲットをクリーニング」しましょう.
他にもいったんXcodeを終了して,再度ビルドをしてみるのもいいかもしれません.

2010年7月17日土曜日

[Squeak] Squeak SmalltalkのwhileTrue: 謎だ

Squeakでいろいろ探索していたら,whileTrue:が謎.

BlockContextを読んでいたけど,Squeak 4.1だからBlockClosureだw
BlockClosure>>whileTrue: aBlock 
"Ordinarily compiled in-line, and therefore not overridable.
This is in case the message is sent to other than a literal block.
Evaluate the argument, aBlock, as long as the value of the receiver is true."

^ [self value] whileTrue: [aBlock value]

いったいどうなっているんだろう.英語がわからないオバカだけど,インライン展開しているとこと?
どんな?

何かすごい寂しい気分になった.


2010年6月23日水曜日

[Squeak] Cog VM

Squeak Smalltalkの高性能VMが公開されました.
Teleplace社,ありがとうございます!!!!

いろいろと既にすばらしい記事が公開されているので,ここではその記事のリンクをまとめておきます.


Teleplace Cog VMs are now available
http://lists.squeakfoundation.org/pipermail/squeak-dev/2010-June/151422.html

[OOPL] Cog VM リリース記念: Squeak、Ruby、Python を恒例のフィボナッチベンチで戦わせてみる
http://d.hatena.ne.jp/sumim/20100621

Mac OS X用のCroquet Cog VMをビルドする方法
http://d.hatena.ne.jp/nqthm/20100623/p1

Squeak4.1のイメージをMacのCogで起動する方法
http://d.hatena.ne.jp/nqthm/20100623/p2

2010年3月19日金曜日

[Squeak] Seaside 3.0 セッションの設定

Seaside 3.0のセッションをCookieベースにする方法や,セッションの有効時間の方法についてメモします.
セッションの有効時間の方法は本当にこれでいいのか微妙です.

2.8系
initialize
"self initialize"
| app |
app := self registerAsApplication:'sas'.
app preferenceAt: #useSessionCookie put:true.
app preferenceAt: #sessionExpirySeconds put: 3600.
^application


3.0系
initialize
"SASFComponent initialize" 
|app|
app := WAAdmin register: (self asApplicationAt: 'sas').
app preferenceAt: #useCookies put: true.
app cache expiryPolicy configuration at: #cacheTimeout put: 3600.


一時変数appに格納されるのは,WARegistryクラスを継承したWAApplicationのインスタンスです.

3.0系でも,WAComponent>>(class)registerAsApplication: があるので,アプリケーションの登録方法は従来通りできますが,別の方法もあるようなので,メモしておきました.

2010年3月17日水曜日

Seaside 3.0 レスポンス

Seaside 3.0のレスポンスに関するメモ.
SVGのXML情報を返すための方法.
(さらにattachmentWithFileName: を使ってファイルとして返すのもいいと思う)
慣れないとな.

2.8系
renderContentOn:html
self session returnResponse: (WAResponse new
contentType: 'text/xml';
nextPutAll: self makeSVG;
yourself)


3.0系
renderContentOn: html
self requestContext respond: [:response |
response
initializeOn: self makeSVG ;
contentType: 'text/xml']


Seaside 3.0を使ってみた感想

12月にSmalltalkの勉強会でSeaside 3.0の紹介を聞きましたが,ようやく自分でもSeaside 3.0を使うことに.

学内のWeb APを作るのにSeaside 3.0で作っています.
SeasideでWeb APを作る理由としては,ポータブルな開発環境で,バックアップが楽であり,そしてイメージを起動すれば,すぐにWeb APが起動できるところ.
(でも,一番の理由は作りやすいから! デバックが楽ですからね)

基本的なところは,今までと同じですが,変更点が多いと思った.
その中でも,Ajaxのフレームワークが充実したので,うれしい.

今回から
self requestContext

というのが導入されたみたい?
そのため,レスポンス周辺のコードを変更しないといけなかったので,ちょっと大変です.

self session returnResponse: 

で返す方法は好きだったのに.


Seasideでは,何故iframeしかコンポーネントの埋め込みができないんだろう.
objectタグでコンポーネントの埋め込みも有効にしたほうがいいと思う(するべきだと思う).
XHTMLではiframeタグは禁止されているのに,何故なんでしょうね.
そのため,自分は使うときは,WAIframeTagを参考にWAObjectTagを改良してしまう.

それにしてもSeasideに慣れていると他のWeb Frameworkでの開発方法を忘れてしまいそうになるので,怖い.

2010年3月14日日曜日

Smalltalk ML集

SmalltalkのMLをこのページにまとめてみる.
載せるべきものがありましたら,コメントしてください.

Squeak-ja
http://www.smalltalk.jp/mailman/listinfo/squeak-ja

Squeak-dev
http://lists.squeakfoundation.org/mailman/listinfo/squeak-dev

Pharo-users
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users

GemStone Seaside beta
http://seaside.gemstone.com/mailman/listinfo/beta


2010年3月9日火曜日

デザインパターンについて

超素人プログラマーから素人プログラマーになったと思う最近,Objective-Cのドキュメントを読んでいたら,デザインパターンの用語が登場してきて,さぁ大変.

何かいいものがないかと思っていたら,sumimさんの日記(日記というのは失礼ですね.プログラミング言語参考サイト)を思い出す.

http://d.hatena.ne.jp/sumim/20100115

The Design Patterns Smalltalk Companion (Software Patterns Series)が紹介されていた.

昔,Seasideを勉強する際に梅澤さんに紹介されて,購入したのはいいのですが,当時はまだわからないところだらけでした(すみません,梅澤さん).
今ならきっと分かるはず.



2010年1月6日水曜日

[Ruby][Squeak] ベキ乗

言語によって違うので,意外に忘れてしまうベキ乗.
調べたのでメモ.

Ruby
>> 2**32
=> 4294967296


Squeak
2 raisedTo: 32
=> 4294967296



2009年12月28日月曜日

[Squeak]Fizz-Buzz問題

(超)初心者プログラマー(学生)です,はい・・・.

Fizz-Buzz問題をやってみました.あっている?あってなかったらどうしよう.
Squeakで書いてみました.
間違っていたら教えてください.

Squeakの剰余を思い出すのに苦労しましたが,2分以内にかけました.
(1to:100) do:[:v|
Transcript cr;show:v;show:':'.
(v\\3) = 0 ifTrue:[ Transcript show:'Fizz' ].
(v\\5) = 0 ifTrue:[ Transcript show:'Buzz' ].
].



実行結果.
あっていますよね.心配になってくる.
1:
2:
3:Fizz
4:
5:Buzz
6:Fizz
7:
8:
9:Fizz
10:Buzz
11:
12:Fizz
13:
14:
15:FizzBuzz
16:
17:
18:Fizz
19:
20:Buzz
21:Fizz
22:
23:
24:Fizz
25:Buzz
26:
27:Fizz
28:
29:
30:FizzBuzz
31:
32:
33:Fizz
34:
35:Buzz
36:Fizz
37:
38:
39:Fizz
40:Buzz
41:
42:Fizz
43:
44:
45:FizzBuzz
46:
47:
48:Fizz
49:
50:Buzz
51:Fizz
52:
53:
54:Fizz
55:Buzz
56:
57:Fizz
58:
59:
60:FizzBuzz
61:
62:
63:Fizz
64:
65:Buzz
66:Fizz
67:
68:
69:Fizz
70:Buzz
71:
72:Fizz
73:
74:
75:FizzBuzz
76:
77:
78:Fizz
79:
80:Buzz
81:Fizz
82:
83:
84:Fizz
85:Buzz
86:
87:Fizz
88:
89:
90:FizzBuzz
91:
92:
93:Fizz
94:
95:Buzz
96:Fizz
97:
98:
99:Fizz
100:Buzz


どうしてプログラマに・・・プログラムが書けないのか?

2009年11月27日金曜日

MacPortsをインストールしたら

Macを使いたくて購入し,開発環境のXCodeをインストールし,MacPortsをインストールしたのはいいのだが,どうもMacPortの使い方が分からない人が多いらしい.

細かいMacPortsの紹介は別のサイトにすばらしい記事があるので,そちらにまかせます.
MacPortsとは - MacWiki

最近はMacPortsのインストーラが用意されているので,そちらを使うといいでしょう.

インストーラでインストールをしたら,MacPortsを以下のコマンドアップデートしましょう.
sudo port -d selfupdate


あとは,MacPortsのコマンド表をみて,いろいろとやってみてください.
MacPortのコマンド - トウヨウリンゴ

すごい雑な書き方で,すみません.

MacPorts

2009年11月18日水曜日

[Squeak] タプルを作る

Squeakでタプルを作ってみる.

#(1 2) with:#(3 4) collect:[:v1 :v2 | Array with:v1 with:v2].
 ==> #(#(1 3) #(2 4))


タプルを作る際には,同じ要素数のCollectionでなければならない.

こんなもの必要ではないと思われるかもしれないですが,タプルを作る際に,レシーバの要素数にあわせてタプルを作成するのも考えてみました.
x := #(1 2 ).
y := #(4 5 6).
result := x species new: x size.
1 to: x size do:[:index | result at: index put:
([:v1 :v2 | Array with:v1 with:v2]
value: (x at: index)
value: (y at: index))].
^ result.
==> #(#(1 3) #(2 4))

2009年10月17日土曜日

[Squeak] Google APIを使って翻訳をしてみる

SqueakでURIエンコード等が分かったので,Goole APIで提供されている翻訳機能を活用してみます.

以下のコードを使うために,JSON for Squeakが必要です.
JSON for Squeak
http://www.squeaksource.com/JSON/



"原文"
source := '私は林檎が好きです.'.

"翻訳して欲しい言語"
to := 'en'.

"URIエンコード"
source := source encodeForHTTP.

"原文が何語なのかを調べる"
uri := 'http://ajax.googleapis.com/ajax/services/language/detect'.
result := (HTTPClient httpGet:uri,'?v=1.0&q=',source).
from := (( Json readFrom: result ) at:'responseData') at:'language'.

"原文を翻訳する"
uri := 'http://ajax.googleapis.com/ajax/services/language/translate'.
result := (HTTPClient httpGet:uri,'?v=1.0&q=',source,'&langpair=',from,'%7C',to).
(( Json readFrom: result ) at:'responseData') at:'translatedText'.

==> 'I like an apple.'



驚いたのは,原文が何語か調べる機能まで用意されているところ.
さすがGoogleですね.
時間があったときに,Squeakのツールとして使えるようにしたいと思います.
(いつになることやら)

Google AJAX Language API

[Squeak] URIエンコードとデコード

SqueakでURIエンコードとデコードをおこなってみる.

RubyだとURIクラスを使っておこないますが,SqueakだとStringクラスにエンコード等をおこなうmethodが実装されています.

まずはエンコード.

'あ い' encodeForHTTP. ==> '%E3%81%82%E3%80%80%E3%81%84'



エンコードした文字をデコード.

'%E3%81%82%E3%80%80%E3%81%84' unescapePercentsWithTextEncoding:'utf8'. ==> 'あ い'



エンコードのmethod名に対して,デコードがちょっと分かりにくいかったので,探索するのに苦労しました.