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

土曜日, 10月 03, 2009

[Android] BlueLoggerを公開しました

まだまだお恥ずかしいレベルですが、AndroidでBluetooth通信を使って疑似的に「すれちがい通信」ぽいことを行うアプリを作ってADC2に出していたので、マーケットにも公開してみました(もちろんScalaで書いています)。


Twitter連携としては「すれちがったー」さんが抜群のバランス感なのでアレですが、一応Twidroidを入れてあると連携してTweetも打てます。

ただ、、いかんせんHT-03A同士で実験をしていないので、、お互いうまく発見できるか分かりません。。が。ぜひ使えたら、また使えなかったりバグっていたら教えて下さい!

月曜日, 8月 17, 2009

[Scala] AndroidのHandlerとか

Scalaでのコーディングにおいては、特別な処理をしないならopsfutureメソッドで別スレッドで処理を実行、結果は(Android的に正しく)Handlerのpostでメインスレッドに戻すのが正解な気がしています。

、、と思っていたのですが、(futureで作ったかにかかわらないと思うけど)スレッド側でExceptionしててもログに出ない様子?

日曜日, 8月 09, 2009

[Scala] UriMatcher

ScalaでAndroidプログラミングをして、UriMatcherのmatchメソッドが使えず困った。
結局、matchが予約語だからバッククオート(`)で括ればOKでした。

ふつう、URLのマッチをとってそれを(Scalaだから)さらにmatchでcaseしてゆく、、ので確かに、書きながらややこしいなぁ、とは思っていましたが。

今はAndroid的売り(だと思う)ContentProviderを作ろうとしておりハマり中。マニフェストへ記述したら、なぜかClassNotFoundといわれてアプリごと起動不能に。。

日曜日, 7月 19, 2009

[Scala] JavaからScalaを

JavaからScalaで作ったクラスを使うサンプル。簡単すぎてか、以外にサンプルが無かったので載せてみる。
konpyuta:~/work/j2s asummer$ cat javaMain.java 
class javaMain {
public static void main(String[] args){
scalaConv objScala = new scalaConv(args[0]);
System.out.println(objScala.getResult());
System.out.println(objScala);
}
}
konpyuta:~/work/j2s asummer$ cat scalaConv.scala
class scalaConv(tmpStr:String){
val tmpPre = "xxx>";
def getResult = {
tmpPre + tmpStr;
}
override def toString = {
tmpPre + tmpStr;
}
}
konpyuta:~/work/j2s asummer$ javac javaMain.java
konpyuta:~/work/j2s asummer$ scalac scalaConv.scala
konpyuta:~/work/j2s asummer$ java -cp ~/work/scala/lib/scala-library.jar:. javaMain test
xxx>test
xxx>test
konpyuta:~/work/j2s asummer$
おもいきりシームレス。

火曜日, 7月 14, 2009

[Scala] HT-03AのUSB接続…

HT-03AをPCにUSBでつなげる際、普通にやるディスクドライブとして自動認識されてしまい、少しはまります。こんな時は、Android開発者MLに流れていたメッセージを参考に、
 ・レジストリを消して
 ・端末で"設定>アプリケーション>開発>デバッグ"をONに
することで、無事SDK(r2)のUSBドライバにて接続し、デバイス番号が確認できるところまで進みました。でも、もしかすると初めて端末を接続する前に、端末のデバッグをONにしておけばよかったのかも、と思います。

火曜日, 7月 07, 2009

[Scala] Androidアプリ!(センサーの実験など)

せっかくAndroid端末をGDDでもらったので、yamashitaさんのアプリを以下改造しました。
・せっかくなので売りのセンサーを使って(これは元から)
・自前式では動きが気に食わなかったので物理エンジンを入れて
・最近お気に入りのScalaで焼き直し
・SDKも1.5にして
そして、せっかくなので(汚いソースままですが)公開しておこうと思います(MoveCircle)。

物理エンジンはAPEある程度Androidに移植されていた(testape2d.zip)ので取り込んでいます)。

でも、SDK1.5のセンサーって、今はシミュレータで実験できないんですね(シミュレータといってもライブラリを入れるタイプで、そのライブラリが1.1仕様ママ)。実機じゃないとテストできないってちょっと。。

木曜日, 6月 25, 2009

[Scala] RichString!

動作は遅いのかもしれませんが、
      val tmpStr:String = '^'+args(0)+".*";
val objStr = tmpStr.r;
println(aryTmp.filter{w => {
w match {
case objStr() => { true;}
case _ => { false; }
}
}}(0));
というのが、一行で書けるScalaのRichStringは、やはり魅力です。
      println(aryTmp.filter{x => x.startsWith(args(0))});
特に意識せずに使う文字列型がコレ、というのはしかし、考えようによってはやり過ぎですが。。まぁLLと捉えればまったくありかと。

追伸:
 きちんとsplitなんかもあって。本当にLL感覚でいけて嬉しいです。

日曜日, 6月 21, 2009

[Scala] GAE/JのMemcacheサービス

Scalaで、なぜかGAE/JのMemcacheサービスをJCacheを経由して使う方法が分からない。
直接APIを使ってよいなら下のソースな感じで大丈夫なのだけど。
import com.google.appengine.api.memcache._

class memcached {
val cache:MemcacheService = MemcacheServiceFactory.getMemcacheService();

def setValue(strKey:String,strValue:String) = {
cache.put(strKey,strValue);
}

def getValue(strKey:String):String = {
cache.get(strKey).asInstanceOf[String];
}

}

JCache経由にしようとしたら、出てしまうエラー。Kってjava.util.MapのKっぽいんだけど解決方法が分からない。。
 ~snip~
[scalac] D:\work\workspace\test\src\com\digipepper\memcached.scala:51: error:
type mismatch;
[scalac] found : String
[scalac] required: K
[scalac] cache.put(key, value);
[scalac] ^
 ~snip~
お分かりの方は是非コメントください。一部ではGAE/JをPythonで使うべきかJavaで使うべきか、から発展した大変な議論が巻き起こったようですが、私はのんびりとScalaでがんばります。

土曜日, 6月 20, 2009

[Scala] GAE/JのMailサービス

本文は普通に日本語文章を与えたらOK。サブジェクトだけ自分でいじることにしました。
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

class sendmail(strFrom:String) {

var props:Properties = new Properties();
var session:Session = Session.getDefaultInstance(props, null);

def send(strTo:String, strSubject:String, strBody:String) {
try {
var msg:Message = new MimeMessage(session);
msg.setFrom(new InternetAddress(strFrom));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(strTo, "Mr. User"));

msg.setSubject(MimeUtility.encodeText(strSubject,"iso-2022-jp","B"));
msg.setText(strBody+"\n");

Transport.send(msg);

} catch {
case e:AddressException => printf("Exp_A(%s)\n", e.getMessage)
case e:MessagingException => printf("Exp_B(%s)\n", e.getMessage)
case e => e.printStackTrace
}
}
}
エラー処理とかとても適当ですが、何かの参考に。

[Scala] Eclipse+GAE/Jで最初にやること

GoogleAppEngineのアプリをEclipse+Scalaで開発するとき、ScalaとGAEのアドオンを入れた最初の状態では、GAEのEnhancerが失敗する(ファイルを保存する度にコンソールで「エンハンスするクラスファイルが見つからない/CLASSPATH変えろ」と言われ続ける)。
そんなときには、"eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.1.v200905131143\appengine-java-sdk-1.2.1\lib\tools\orm"など、GAEのプラグイン内のライブラリフォルダにScalaのライブラリを入れておくことで解決できます。

日曜日, 5月 31, 2009

[Scala] GAE/JでJDO!

GoogleAppEngine/Javaではディスクが無いことからJDO/JPAでのデータ保存が必須です。

これをピュアScalaで(Javaクラスを使わず)やっている例題scalagaeを見つけたのだが、うまく動かず苦労。

原因は「java.lang.VerifyError」が出てしまうことだったのだが、これはJDO実装であるDataNucleusのバグである様子。v1.1.3に入れ替えたら無事に動きました。
具体的には、D:\appengine-java-sdk-1.2.1\lib\tools\ormにあるdatanucleus-enancer-1.1.0.jarが悪いのでdatanucleus-enhancer-1.1.3.jarに入れ替えます。

あと、コマンドラインからGAEにuploadするとき、app_idはscalagae\WEB-INF\appengine-web.xmlに書かれるので、適宜書き換えましょう。

土曜日, 5月 30, 2009

[Scala] GAE/J上でコンパイル!?

GAE/J上でコンパイル、JDOでバイトコードを保存、それを引き出して実行する、という機構を作ろうプロジェクトを見つけた。動くのかな。

金曜日, 5月 29, 2009

[Scala] PulpCore!

Javaの2DレンダライブラリであるPlupCoreのScala版があった。何故ソース的に焼き直したのかまったく不明。。

日曜日, 5月 17, 2009

[Lift] より簡素に!

Liftの勉強をしてます。Webなフレームワークって便利ですね。
snippetで多用するbindについて、The Loopさんを参考に確認を。

まず、以下の書き方がサンプル的に分かりやすいモノ。

VIEW:
    <lift:helloDB.tstForm form="post">
    <testBox:lines>Lines</testBox:lines>
    <testBox:desc>To Do</testBox:desc>
    <testBox:submit>submit</testBox:submit>
    </lift:helloDB.tstForm>
SNIPPET:
    def tstForm(argForm: NodeSeq) = {
// とりあえずモデルオブジェクトを作成(!)
val hellom = HelloModel.create;

// 入力を受け取り保存するかを判断
def checkAndSave(): Unit = hellom.validate match {
// S.noticeでに値を出力
case Nil => hellom.save ; S.notice("Added "+hellom.desc)
case xs => S.error(xs) ; S.mapSnippet("helloDB.tstForm", doForm)
// S.redirectTo("/")は不要
// →何にせよ最後にdoFormしているから(再描画される)
}

// テンプレートへバインドする関数
def doForm(argForm: NodeSeq) = {
bind("testBox", argForm,
//"lines" -> toShow.toString,
"lines" -> toShow, // toShowでXMLを返すようにするから
"desc" -> hellom.desc.toForm,
"submit" -> submit("SAVE", checkAndSave)); // ボタンもタグ必要
}

// バインド実行(上の関数を)
doForm(argForm);
}

で、これをより簡単に書くと(HTML的な変更点はlabelで囲むこと)。

VIEW:
    <lift:helloDB.tstForm form="post">
    <testBox:lines>Lines</testBox:lines>
    <label for="desc">
        <testBox:desc>To Do</testBox:desc>
    </label>
    <testBox:submit>submit</testBox:submit>
    </lift:helloDB.tstForm>
SNIPPET:
    def tstForm(argForm: NodeSeq): NodeSeq = {
val hellom = HelloModel.create;

bind("testBox",argForm,
"lines" -> toShow, // toShowでXMLを返すようにするから
"desc" -> SHtml.text(hellom.desc, hellom.desc(_)), // descカラムへ書込み
"submit" -> SHtml.submit("SAVE", hellom.save)
)
}

なるほどー。かっこいい。

月曜日, 5月 04, 2009

[Scala] DynamicVariableとは

ScalaでDSLということで、DynamicVariableについて勉強中。あの記事においては、大体以下の流れであろうと思う。

DynamicVariableのインスタンスであるoutは、withValueメソッドの引数で与えられたインスタンスを示すようになる(そのインスタンスに成り代わってしまうイメージ)
・だから、outさんは共に与えられたパスでファイルを開いた_outさんになってしまう
・そして、その与えられたブロック内で呼ばれたwriteメソッドは、オーバライドされたout.value.writeであるので、結局_outさんが書く事になる

うーん。分かったような、分からんような。。withValueメソッドがset(そしてvalueがget)に相当していることは分かった。

なお、ここでwriteが書かれているような、メソッドに渡されるブロック(=クロージャ?/この表現も間違いな気がします)は、マニュアルではthunkとなっていた。

金曜日, 5月 01, 2009

[Lift] 作ってゆく流れは

基本的には以下流れ(yoroyoroさんライブコーディング資料から)。

0.コアとなるデータモデルを定義(MappedLongIndexとかをextendsする)
1.そのデータを記入するためのテンプレートを作成(webapp以下)
2.そのテンプレートで使うsnippetを作成(=入力フォーム)
3.それをBootにPath登録(メニュー化+ACL)
4.見るページのテンプレートを作る
5.そこで必要となるsnippetを作る
6.それをBootにPath登録

1,2,3と4,5,6みたいに、テンプレート作ってsnippet当ててBootに入れる。

追伸:
Liftはやっぱり大きめですね。
sweetというScalaで書かれたフレームワークもあるようで。。

水曜日, 4月 29, 2009

[Scala] jettyが止まらない!?(netbeans)

ScalaのサポートはEclipseのpluginよりnetbeansのそれのほうが優れている(v6.5.1で見たとき)。
が、netbeansでlift開発をするとき、起動したjettyを落とすことができない、、と思っていたら、やはりissueとして登録されており、暫定対処もある様子なのでメモ。
http://wiki.netbeans.org/TaT_ShutdownJettyStartedByMavenUsingNB

via kwout

土曜日, 4月 25, 2009

[Scala] システムトレイで

システムトレイにアイコンを表示して、さらにメッセージボックスに日本語を出す実験。

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import javax.imageio.ImageIO;

object Alarm2 {
var clockImage:Image = ImageIO.read(new File("clock.png"));
var alarmImage:Image = ImageIO.read(new File("alarm.png"));;
var icon:TrayIcon = new TrayIcon(clockImage);

var alarmTime:Date = new Date();

def main(args : Array[String]){
var tray:SystemTray = SystemTray.getSystemTray();

var menu:PopupMenu = new PopupMenu();
var item:MenuItem = new MenuItem("表示");
item.addActionListener(new ActionListener() {
def actionPerformed(event:ActionEvent):Unit = {
icon.displayMessage("Alarm", "メッセージ!", TrayIcon.MessageType.INFO);
println("message was displayed.");
}
});
menu.add(item);
item = new MenuItem("終了");
item.addActionListener(new ActionListener() {
def actionPerformed(event:ActionEvent):Unit = {
System.exit(0);
}
});
menu.add(item);

icon = new TrayIcon(clockImage, "アラーム", menu);
icon.setImage(alarmImage);

tray.add(icon);
}
}

じゃじゃ馬さんを参考に。ちなみに画像も使わせて頂きました(*)。

日曜日, 4月 19, 2009

[Scala] NB6.7とScala

v6.5ではmavenとの連携が悪い(環境変数を渡せない)ので、まだβではあるがv6.7へ移行。
当初Scalaプラグインが動かず困っていたが、暫定対応版(!?)を発見。

updates.xml.gzはダウンロードするものではなく、NetBeansのツール>プラグイン>設定>追加、で足して使う(使用可能なプラグインにScalaが出てくる)。

今のところv6.5でやれていたメソッド補完などは無事に動いている(Jettyが止まらない現象は(ある意味当然)v6.7にしても出続けているのでかっこ悪いがカスタムターゲットでjetty:stopする作戦をまま踏襲)。

土曜日, 4月 18, 2009

[Lift] JavaRebelを使う

Liftのアプリに対しても、コンテナをTomcatにすれば、今はやりの(?)JavaRebelを使ってホットデプロイを実現できるらしい。
http://wiki.liftweb.net/index.php?title=JavaRebel#Tomcat

via kwout

これで開発生産性(この単語は意味を持たなくなってきたけど)はあがりそうです、、、が、よく見るとJavaRebelって商用なんですね。残念。。。

補足:
日本の方が、thick4というのを開発中な様子。