夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

Competitive Programming on Smart Device

0. はじめに

どーもこんにちは。touyouです。
この記事は Competitive Programming Advent Calendar Div2012 の21日目の記事です。希望は特にしてませんが偶然にも誕生日一ヶ月後を担当させていただく次第になりました。
 
さて、今回のテーマは題名の通り「スマートフォン、タブレットでの競技プログラミング」です。結構最近のエントリにProject EulerAndroidでやるという似たようなものがあるのですが、それからiPadを手にいれたり(通称iPad模試で某進から搾取しました( ̄^ ̄)ゞ)WalkmanAndroidが4.0にアップデートしたりしたので今回はそれの強化拡張版のようなかたちでお送りしたいと思います。
(特殊顔文字使いまくってるのでご注意)
last modified: 2012/12/20
 

1. Androidで競技プログラミング

ではまず最初にAndroidから。
 
今回は家にタブレット(Garaxy Tab)があったりしますが、一応自分のものだけでやるということで、Project Euler編に引き続き最近Android4.0への大アップデートがあったWalkman Zに登場してもらいたいと思います(◕ฺ∀◕ฺ)
 

 

どーん!!!Android4.0きれいパシャッ! Σp[【◎】]ω・´)

 

ではまずなんですか、アプリ紹介かな。

 

f:id:touyou1121:20121220183611p:plain

 

ProgrammingでPlay Store検索するとこんな風にいっぱい出てくる世の中(たぶん有料とかでコンパイラもあるはず…)ですが使うのはSL4A(ここでAndroid4.0の非対応に気づく←)

 

Σ( ̄ロ ̄lll) ガビーン

 

というわけでみなさん、Android2.xでやりましょう。

 

๑゜д˚๑

 

とりあえずここまで来てしまったのでSL4Aの簡単な解説を…。

 

これは正式名称がScripting Layer for Androidという公式の(?)プロジェクトです。各種スクリプト言語の実行がAndroid上で行えるようにするツールです。

使える言語はPython,Beanshell,Lua,Perl,Rhinoです。とりあえずCodeforces,AtCoderや、自分の環境で実行するタイプのコンテストならなんなくできますね。

 

あとエディタもろもろは前の記事を参考にしてもらえると助かります。。。

いやまさかできなくなってるとは思わなかった…。

 

とりあえず残りはiPad編でお楽しみください(適当だなぁ…)

last modified: 2012/12/20

 

2.iPadでプログラミング

 

はい、というわけで、最近手に入れたiPadですね。

カメラがiPadしかないのでとりあえずパッケージ撮ったやつ

 

f:id:touyou1121:20121207200940j:plain

 

どーんƪ(Ơ̴̴̴̴̴̴͡.̮Ơ̴̴͡)ʃ

 

てかいらなくない?とか言ってはいけない←

とりあえずこっちは下準備してきましたよー(╹◡╹)

 

f:id:touyou1121:20121220191638p:plain

 

-C++JavaPython、CoffeeScriptのコンパイラ

-C++などのリファレンス

-エディタ

です。

ぶっちゃけコンパイラにエディタもくっついているんでエディタいらないです。

 

これで言語も一気に増えて、一気にコーディングしやすくなって、TopCoder以外のほとんどの競技プログラミングができますね(∩´∀`)∩ワーイ

しかもDropboxとかを導入しておけばパソコンとの同期も簡単ですね(最低でも16GBはあるので余裕)

 

とりあえず今回入れてみたアプリは…

 

C++ Programming Language

f:id:touyou1121:20121220205509p:plain

このようにエディタとの複合型で、コンパイルから実行まで全て出来ます。

Java Programming Language

上のと同じ作者のアプリです。他にこのシリーズではPerlC#などもあります。

f:id:touyou1121:20121220205650p:plain

python-Programming language

今度は中国人、リファレンスもついている模様。

f:id:touyou1121:20121220205751p:plain

モード画面うつしたのであとは画像で機能を把握してくださいw

プログラミング辞書 FastReference

f:id:touyou1121:20121220205908p:plain

これはリファレンスです。

C言語の他iOS APIとEvernote APIのリファレンスもついています。正直なんでこの取り合せなのかは謎。

intで調べてみたらいっぱい出てきました。

iEditor - Text テキスト編集ツール

多機能エディタです。

f:id:touyou1121:20121220210055p:plain

正直よくわからん。多分コンパイラ付属の使うのが無難かも…?

 

以上とりあえずアプリ紹介だけです。よく考えたらそこまで難しいことなかったので内容薄くなってしまいましたがいかがでしたでしょうか?

 

普通の競技プログラミングに飽きてきた人はたまにはSmart Deviceで競技プログラミング、試してみてくださいねʕ·ᴥ·ʔノ

 

p.s. いわゆる「地球滅亡の日」を迎えたらしいですね、TopCoderのArenaがLoadingになったままかたまって僕のSRM出場を阻止していたり色々と不吉なことが起こりそうな予感がしますね(しない←)

断念…残った謎

先日Parcelableを紹介したのですが・・・

結局これをつかっても思い通りのものがつくれませんでしたので、今回これを使ってみての感想。

まず、Parcelableでやりたいことをもう一度振り返ってみましょう。
ParcelableとはオブジェクトをIntentで送れるようになり、また、アクティビティがバックグラウンドに入った時にデータを保持しておけるようにするものでした。

で、僕が今回やりたかったことは…
「オブジェクトの配列を複数アクティビティで共有する」
ということ。

Parcelableなオブジェクトの配列はこれまたParcelableで管理しなければならないというのはこの前の記事で書いたとおりだと思いますが、単純にかんがえればこのようにして実現したオブジェクトの配列をIntentで受け渡すと僕のやりたかったことはできそうでした。多分。

まずそこで立ちはだかったのが4つのアクティビティをいかにして自由にいききできるようにするか。

デザイン的にリストビューもあるのでボタンを全部に配置することはできませんので、まずTabViewで試していました。まぁこれは当然Intentを飛ばせないので死。
つづいてメニューからIntentを飛ばすということをやってみました。

すると・・・

ぬるぽいんた〜えくせぷしょん

ちょっと調べるとParcelableなクラスの初期化をしっかりしてないことがわかり修正したのですが…

ぬるぽいんた〜えくせぷしょん

しょうがないのでそのオブジェクトをつかうすべてのところでnullの例外を弾いたらなんとかエラーは出ないようになったのですが、オブジェクトをつかうところを全て飛ばすことになりデータが処理できず…


さんざん悩みましたが、結局デスクトップアプリケーションで同じことを実現することにしました。

Java難しいよ〜(/_;)



う〜ん、結局どこが悪かったのかはわからなかったのですが、まぁしょうがないですね。
皆さんも気をつけてください。というかあまり僕と同じ事をしている人をネットで見ないので…

あ、あともし上で述べたことを実現するなんかうまい方法を知っていたら教えてください。

Parcelable

Androidで独自クラスでデータ管理する方法見つけた~

ドキュメント豊富なんであんまり説明はしませんが…






とりあえず今作ってるアプリでサンプルコードとします。



package jp.touyoubuntu.materica;

import android.os.Parcel;
import android.os.Parcelable;

public class MatData implements Parcelable {
private String name;
private int amt;
private boolean[] iscons;

@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeString(name);
out.writeInt(amt);
out.writeBooleanArray(iscons);
}
public static final Parcelable.Creator CREATOR
= new Parcelable.Creator() {
public MatData createFromParcel(Parcel in) {
return new MatData(in);
}

public MatData[] newArray(int size) {
return new MatData[size];
}
};

private MatData(Parcel in) {
name = in.readString();
amt = in.readInt();
in.readBooleanArray(iscons);
}

public MatData(String name, int amt, boolean[] iscons) {
this.name = name;
this.amt = amt;
this.iscons = iscons;
}
}
これがとりあえずC++の構造体的な役割をもつ、んで
package jp.touyoubuntu.materica;

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class AllMatData implements Parcelable {

private ArrayList matList;

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel out, int flag) {
out.writeTypedList(matList);
}

public static final Parcelable.Creator CREATOR
= new Parcelable.Creator() {
public AllMatData createFromParcel(Parcel in) {
return new AllMatData(in);
}

public AllMatData[] newArray(int size) {
return new AllMatData[size];
}
};

private AllMatData(Parcel in) {
matList = in.createTypedArrayList(MatData.CREATOR);
}
public AllMatData(ArrayList matList) {
this.matList = matList;
}
}
これで上記のクラスのデータを配列で管理します。
あとは外部クラスでtxtとかにデータセーブしてごにょごにょって感じかな。


これ知ったことで大分このアプリも実現可能になってきた感じ。


あ、詳細はまぁ一応学校の宿題の一貫として作ってるので作り終えてから発表します。

余裕があったらアプリ甲子園に応募するかもしれない

追記:クラス名のせいで表示バグってるかも?

D2Q開発記[12/19]

ライナーレイアウト、辞書追加の詳細なUIなどなかなかに開発が進みませんが・・・

とりあえずこれまでの経過←




①FileManagerクラス
これに関してはだいぶ前に作っていましたが、こんな感じ。

一応アプリの内部構造なども考慮して色々試行錯誤を・・・

public class FileManager {
/* コンテキストでファイル入出力 */
public static void contextWriteFile(Context context,String sData, String sFileName) {
byte[] byArrData = sData.getBytes();
OutputStream outputStreamObj=null;

try {
//Contextから出力ストリーム取得
outputStreamObj=context.openFileOutput(sFileName,Context.MODE_PRIVATE);
//出力ストリームにデータを出力
outputStreamObj.write(byArrData,0,byArrData.length);
} catch (Exception e) {
Log.d("testWriteFile", e.getMessage());
} finally{
try {
if (outputStreamObj!=null) outputStreamObj.close();
} catch (Exception e2) {
Log.d("testWriteFile", e2.getMessage());
}
}
}
public static String contextReadFile(Context context, String sFileName) {
byte[] byArrData;
int iSize;
byte[] byArrTempData=new byte[128];
InputStream inputStreamObj=null;
ByteArrayOutputStream byteArrayOutputStreamObj=null;
try {
//Contextから入力ストリームの取得
inputStreamObj=context.openFileInput(sFileName);
byteArrayOutputStreamObj=new ByteArrayOutputStream();
//ファイルからbyte配列に読み込み、さらにそれをByteArrayOutputStreamに追加していく
while (true) {
iSize=inputStreamObj.read(byArrTempData);
if (iSize<=0) break;
byteArrayOutputStreamObj.write(byArrTempData,0,iSize);
}
//ByteArrayOutputStreamからbyte配列に変換
byArrData = byteArrayOutputStreamObj.toByteArray();
} catch (Exception e) {
Log.d("testReadFile", e.getMessage());
return "";
} finally{
try {
if (inputStreamObj!=null) inputStreamObj.close();
if (byteArrayOutputStreamObj!=null) byteArrayOutputStreamObj.close();
} catch (Exception e2) {
Log.d("testReadFile", e2.getMessage());
}
}
return new String(byArrData);
}
/* ここまで */
public static List dataLoad(Context context, String FileName) {
String res = contextReadFile(context, FileName);
String[] resAry = res.split("\n");
List resAry2 = new ArrayList();
for (int i=0; i return resAry2;
}
public static void dataSave(Context context, List data, String FileName) {
StringBuffer sb = new StringBuffer();
for (int i=0; i sb.append((String)data.get(i));
}
contextWriteFile(context,sb.toString(),FileName);
}
}

一応説明といいますか、軽く言うと、仕組み的にはファイルに改行で区切ってデータを溜め込んでおき、それをこれらの関数で分割したり、結合して書き込んだりと・・・まぁ簡単ですねw

Listにして返された配列の一つ一つの要素は何らかの形式で区切られた、問題と答えの塊です。

②問題出題システム
出題システムは、主に次の二つを候補に上げています。

  1. 問題→答えモードと、答え→問題モードを用意する
  2. 問題→答え、答え→問題をランダムに織り交ぜて出題する
現実的にも、効果的にも2の方がよさそうですが一応検討。
その上で採点、出題する問題、形式なども考慮してみました。

採点は何点か用意して間違える度に減らしていくようにしてみればいいでしょう。
出題する問題はできるだけ、間違った回数の多い問題、あるいは正解した回数の少ない問題を優先で出せるように。
形式は、一応筆記にするつもりですが、英語の日本訳など微妙な表現の違いでバツにしてしまうことになるので日本語を答えるようなところでは選択問題にできればと考えています。



以上です。
頑張ります♪

とりあえずこのあとは精進(`・ω・´)

Facebook クライアント開発記#01

その名のとおりです

FacebookAndroidアプリのネタ募集したら結局集まったのがこれだけだったので(´・ω・`)


というわけで製作開始致しました!
どうせなら昆布員に手伝ってもらおうかな(笑)

まぁゴタゴタしたことはさておき、今日はとりあえず調査とSDKのインストール、そしてプロジェクトの作成までやりました。

そこらへんの手順はコチラを参照してください。
そろそろ無駄に入門記事を増やすのも非生産的だと思ってきたのでw

というわけでとりあえず上のサンプルは実装しました。
当面の目標は公式クライアントです。今回の要望は既存のクライアントへの不満が主ですので、とりあえずは既存のものに追いつかなければ超えるも何もあったもんではありませんので。

もう一つIBMのサイトもあるのですが、こちらのサンプルはApacheライセンス付きの上、自分の書いたコードにねじ込むとエラーが出たりするのでとりあえず理論的なことを学ぶだけに留めておこうと思います。

完成したら他のアプリと同様このサイトに挙げる予定ですので、楽しみにしていてくださいね。
それではノシ