Competitive Programming on Smart Device
0. はじめに
1. Androidで競技プログラミング
どーん!!!Android4.0きれいパシャッ! Σp[【◎】]ω・´)
ではまずなんですか、アプリ紹介かな。
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しかないのでとりあえずパッケージ撮ったやつ
どーんƪ(Ơ̴̴̴̴̴̴͡.̮Ơ̴̴͡)ʃ
てかいらなくない?とか言ってはいけない←
とりあえずこっちは下準備してきましたよー(╹◡╹)
-C++、Java、Python、CoffeeScriptのコンパイラ
-C++などのリファレンス
-エディタ
です。
ぶっちゃけコンパイラにエディタもくっついているんでエディタいらないです。
これで言語も一気に増えて、一気にコーディングしやすくなって、TopCoder以外のほとんどの競技プログラミングができますね(∩´∀`)∩ワーイ
しかもDropboxとかを導入しておけばパソコンとの同期も簡単ですね(最低でも16GBはあるので余裕)
とりあえず今回入れてみたアプリは…
このようにエディタとの複合型で、コンパイルから実行まで全て出来ます。
上のと同じ作者のアプリです。他にこのシリーズではPerl、C#などもあります。
今度は中国人、リファレンスもついている模様。
モード画面うつしたのであとは画像で機能を把握してくださいw
これはリファレンスです。
C言語の他iOS APIとEvernote APIのリファレンスもついています。正直なんでこの取り合せなのかは謎。
intで調べてみたらいっぱい出てきました。
多機能エディタです。
正直よくわからん。多分コンパイラ付属の使うのが無難かも…?
以上とりあえずアプリ紹介だけです。よく考えたらそこまで難しいことなかったので内容薄くなってしまいましたがいかがでしたでしょうか?
普通の競技プログラミングに飽きてきた人はたまにはSmart Deviceで競技プログラミング、試してみてくださいねʕ·ᴥ·ʔノ
p.s. いわゆる「地球滅亡の日」を迎えたらしいですね、TopCoderのArenaがLoadingになったままかたまって僕のSRM出場を阻止していたり色々と不吉なことが起こりそうな予感がしますね(しない←)
断念…残った謎
結局これをつかっても思い通りのものがつくれませんでしたので、今回これを使ってみての感想。
まず、Parcelableでやりたいことをもう一度振り返ってみましょう。
ParcelableとはオブジェクトをIntentで送れるようになり、また、アクティビティがバックグラウンドに入った時にデータを保持しておけるようにするものでした。
で、僕が今回やりたかったことは…
「オブジェクトの配列を複数アクティビティで共有する」
ということ。
Parcelableなオブジェクトの配列はこれまたParcelableで管理しなければならないというのはこの前の記事で書いたとおりだと思いますが、単純にかんがえればこのようにして実現したオブジェクトの配列をIntentで受け渡すと僕のやりたかったことはできそうでした。多分。
まずそこで立ちはだかったのが4つのアクティビティをいかにして自由にいききできるようにするか。
デザイン的にリストビューもあるのでボタンを全部に配置することはできませんので、まずTabViewで試していました。まぁこれは当然Intentを飛ばせないので死。
つづいてメニューからIntentを飛ばすということをやってみました。
すると・・・
ぬるぽいんた〜えくせぷしょん
ちょっと調べるとParcelableなクラスの初期化をしっかりしてないことがわかり修正したのですが…
ぬるぽいんた〜えくせぷしょん
しょうがないのでそのオブジェクトをつかうすべてのところでnullの例外を弾いたらなんとかエラーは出ないようになったのですが、オブジェクトをつかうところを全て飛ばすことになりデータが処理できず…
さんざん悩みましたが、結局デスクトップアプリケーションで同じことを実現することにしました。
Java難しいよ〜(/_;)
う〜ん、結局どこが悪かったのかはわからなかったのですが、まぁしょうがないですね。
皆さんも気をつけてください。というかあまり僕と同じ事をしている人をネットで見ないので…
あ、あともし上で述べたことを実現するなんかうまい方法を知っていたら教えてください。
Parcelable
ドキュメント豊富なんであんまり説明はしませんが…
とりあえず今作ってるアプリでサンプルコードとします。
package jp.touyoubuntu.materica;これがとりあえずC++の構造体的な役割をもつ、んで
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.CreatorCREATOR
= 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;
}
}
package jp.touyoubuntu.materica;これで上記のクラスのデータを配列で管理します。
import java.util.ArrayList;
import android.os.Parcel;
import android.os.Parcelable;
public class AllMatData implements Parcelable {
private ArrayListmatList;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeTypedList(matList);
}
public static final Parcelable.CreatorCREATOR
= 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(ArrayListmatList) {
this.matList = matList;
}
}
あとは外部クラスでtxtとかにデータセーブしてごにょごにょって感じかな。
これ知ったことで大分このアプリも実現可能になってきた感じ。
あ、詳細はまぁ一応学校の宿題の一貫として作ってるので作り終えてから発表します。
余裕があったらアプリ甲子園に応募するかもしれない
追記:クラス名のせいで表示バグってるかも?
D2Q開発記[12/19]
とりあえずこれまでの経過←
①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 ListdataLoad(Context context, String FileName) {
String res = contextReadFile(context, FileName);
String[] resAry = res.split("\n");
ListresAry2 = new ArrayList ();
for (int i=0; ireturn resAry2;
}
public static void dataSave(Context context, Listdata, String FileName) {
StringBuffer sb = new StringBuffer();
for (int i=0; isb.append((String)data.get(i));
}
contextWriteFile(context,sb.toString(),FileName);
}
}
一応説明といいますか、軽く言うと、仕組み的にはファイルに改行で区切ってデータを溜め込んでおき、それをこれらの関数で分割したり、結合して書き込んだりと・・・まぁ簡単ですねw
Listにして返された配列の一つ一つの要素は何らかの形式で区切られた、問題と答えの塊です。
②問題出題システム
出題システムは、主に次の二つを候補に上げています。
- 問題→答えモードと、答え→問題モードを用意する
- 問題→答え、答え→問題をランダムに織り交ぜて出題する
Facebook クライアント開発記#01
FacebookでAndroidアプリのネタ募集したら結局集まったのがこれだけだったので(´・ω・`)
というわけで製作開始致しました!
どうせなら昆布員に手伝ってもらおうかな(笑)
まぁゴタゴタしたことはさておき、今日はとりあえず調査とSDKのインストール、そしてプロジェクトの作成までやりました。
そこらへんの手順はコチラを参照してください。
そろそろ無駄に入門記事を増やすのも非生産的だと思ってきたのでw
というわけでとりあえず上のサンプルは実装しました。
当面の目標は公式クライアントです。今回の要望は既存のクライアントへの不満が主ですので、とりあえずは既存のものに追いつかなければ超えるも何もあったもんではありませんので。
もう一つIBMのサイトもあるのですが、こちらのサンプルはApacheライセンス付きの上、自分の書いたコードにねじ込むとエラーが出たりするのでとりあえず理論的なことを学ぶだけに留めておこうと思います。
完成したら他のアプリと同様このサイトに挙げる予定ですので、楽しみにしていてくださいね。
それではノシ