Code Monkey home page Code Monkey logo

ares's Issues

Implement iterator for SQLiteStmt

Now SQLiteStmt class provides step() which is simple wrapper of raw sqlite3_step().
This interface is quite C-like dirty one. Code shown below is better.

for(SQLiteStmt::iterator itr=stmt.begin(); itr != stmt.end(); ++itr)
{
  std::cout << static_cast<int>(*itr) << std::endl;
}

-Iterator is Input Iterator.
-NULL checking is needed.

GUIのtoolkitの確認

aresで用いる程度のコントロールがGTKとWindows双方でうまく動作することを確認してから用いたい。
現時点ではwxWidgetsが有力候補なので、サンプルプログラムをLinux, Windowsでビルドしてみよう。

Linux

Ubuntu 11.10 oneiricでデフォルトのサンプルは無事動作した。日本語も入力できるようだ。

Windows

未確認。VC++2010で確認すべき。

三島会社と本州の乗り継ぎに対応

三島会社と本州の乗り継ぎに対応する。
本四備讃線では加算運賃が発生するので #4 も解決する必要があるが、このIssue自体では取り扱わない。

文字コードをしっかりする。

API

APIで受け渡しに使う際の文字コードを何にするかは重大な問題。

  • UTF-8をchar / std::stringで。
  • ワイド文字列をwchar_t / std::wstringで。

    実行環境への依存

  • SQLiteはUTF-8かUTF-16を選ばないといけない。
  • LinuxはよくあるロケールではUTF-8だがもちろんEUC-JPの人もいる。ワイド文字列はUTF-32らしい。
  • WindowsはデフォルトはShift_JISで、ワイド文字列がUTF-16である。
    一言で言うと普通の文字列もワイド文字列もSQLiteに渡すには本来使えないし使うべきではない。

    実装の都合

    文字の長さを取得するためにワイド文字列に変換をする所が1箇所あるが、ここも方策はいくつかある。
  • libiconvやcodecvtなどを使って適切にUTF-8をUCS-4などの文字数一定の文字列に変換する。
  • 直接文字数を計る。簡単に調べられる可能性がある。
    また、C++11(C++0x)からはu8""リテラルがあるので、UTF-8は扱いやすい気がする。
    ただ、UTF-16もリテラルがあり扱い易いことと、UTF-16のほうが却ってサイズが小さくなるかもしれないこと(日本語が多いから)を考えるとUTF-16を使うのもいいかもしれない。

CDatabaseはget_company_and_kiloでキロではなく起点・終点を返す

なぜ実際の営業キロではなく両端駅の営業キロを返すべきかというと、運賃計算キロはそれぞれ駅の営業キロに1.1倍して四捨五入して決定されているからだ。つまり区間のキロに1.1倍するのはお門違いという訳である。
これをreal, fake(営業キロと擬制キロ)を両方もたせ、CKiloでも両方持たせることにした。しかし、CKiloの内部実装でどう持とうが勝手だが、CKiloのインターフェースとしてrealとfakeを両方入力させるのは冗長である。

特定の経路に対する特例

#4 と違って特定の経路、つまり複数の区間に亙る運賃の特例がある場合に対応する。

顕著な例では特定運賃である。

左カラムの選択が重い

キーボードで下を連打すると重い。
駅名表示を「キーだけ入れて動的に表示」に切り替えすべき

運賃体系の見せ方・APIでの返し方

運賃の基本は大人片道。これに小人・学割というオプションがつきうる。
さらに、往復割引や周遊きっぷアプローチ券という割引も生じうる。
ただし、これらは大人片道運賃にのみ依存するので、

class CFare {
   int fare;
};

にいろんなメンバ関数を実装していく?

wxAres運賃計算機能

とりあえずルートをたどっていけば運賃が計算できる機能を付ける。

検索APIのアーキテクチャ修正

CDatabaseクラスのアーキテクチャの修正が必須かもしれない。
毎回std::vector<>を作って返すのはパフォーマンス面で明らかに無視できない。
const std::vector<>&を返すように修正して、内部ではデータの変更がないことは明らかなわけでキャッシュしてしまえばいいと思う(キャッシュのあるなしはifdefなりなんなりでスイッチしたほうがいいかもしれない)

SQLの駅結合度付ビュー

CREATE VIEW station_kilo
   AS SELECT * FROM (SELECT station.*,count(*) AS jointcount
                          FROM station NATURAL JOIN kilo GROUP BY kilo.stationid)
                      NATURAL JOIN kilo;

というViewを現在与えているが、さらにNATURAL JOIN lineしてしまったほうが多分使い勝手はいい(それほど良くなるか?というのは置いておいて。)
しかし、自分のThinkPad X40で実行した時には付け加えた時の実行時間の遅さは半端無かった。今自分の手元のマシンで試してみると一瞬で出てきたのだが、これは再考の余地があるかもしれない(例えばたまたま重いプログラムが裏で走ってたとか)。
実際に後で実機で試して見るべき。

sqlite3_wrapperのiterator実装を見直す

#1 に関連した内容だが、SQLiteStmtで構成する prepared statement と、実際の実行結果は異なるべきかもしれない。

typedef SQLiteResult * iterator; //! 嘘だけどそういう感じ。
SQLite db(":memory:");
db.execute("CREATE TABLE ...");
SQLiteStmt stmt("SELECT * FROM ...");
stmt.bind(1, ...);
for(iterator res = stmt.execute(); res; ++res)
{
   std::cout << (*res)[0] << (*res)["id"] << std::endl;
}

つまりイテレータじゃないんじゃね、というわけ。
イテレータという以上は「ポインタのような何か指し示すもの」を*演算子でデリファレンスすることで値が取れないといけない。
しかし、カラムの集合[5, 8, "foo", "bar", -5]みたいなものが取れるべき値なわけで…

googletestに変更するか

cppunitよりgoogletestの方がいいかもしれない。

まずcppunitはテストメソッドの自動追加とかもしてくれない。一方googletestは自動で追加してくれる。(そういうマクロなんだろうけど)
他の機能はよくわかってない。

特定都区市内制度

特定都区市内制度に対応する。

概要

  • 出発駅から着駅に対応する中心駅、もしくは出発駅に対応する中心駅から着駅までが一定キロを超えると適用される。
  • 一旦特定都区市内を出てもう一度その特定都区市内を通過する時は適用されない。
    • でも東京都区内-東京都区内の切符は正解らしい。

問題点

だいたいの特定都区市内はある駅から中心駅までの経路は一意に特定できるけど、東京都区内ではそうは行かない。

C++03版の実装をしてみる

文字通り。boostを使った代替実装を作っておかないと互換性的にまずい気がする。
もちろん自分はコマンドラインを使って、他人に公開するのはwebでもいいんだけど。

ただし、UTF-8リテラルが無いのでUTF-8を使うのが厳しい。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.