6月 042011
 

ネットワーク上から何かしらデータを持ってくる作業と言うのは時々出てくるわけだ。twitterクライアントにしてもQOAuthでOAuthはパスできたにせよ、そのURLからデータを持ってこないとAPIアクセスはできないわけで。

と言うわけでさくっとwgetのような感じでURLからもってこいやあ!ってな実装。

  1. QNetworkAccessManagerを用意します。
  2. QNetworkAccessManager::finished(QNetworkReply*)と言うシグナルと適当なスロットをconnect。
  3. QNetworkRequestを作ってQNetworkAccessManager::get()を叩く。
  4. スロットでQNetworkReply*をあされ!。

以上。

やることはQNetworkRequestを作って読み込み開始してあとはシグナル待ちだけで済むって言う。シンプルやなー。素敵。

QNetworkReply::readAll()でもってきたデータをQByteArrayで拾えたりします。QNetworkRequestにQOAuthで作ったtwitterのAPIに渡すURLを指定してやればあっさりAPIにアクセスできるのよ。

んで拾ってきたXMLを解析してprofile_image_urlを同じようにQNetworkAccessManager経由で取得してやると、

あっさりアイコン付きに。

余談。

profile_image_urlの表示にQGraphicsWebViewを使ったらどうなるのかな?、とか思ってやってみたのだけど、普通に表示されました。が、rotateしたときに画像は回転しているものの枠が残っちゃうのよね。なのでQImageで取得した上でQGraphicsPixmapItemに。

QGraphicsItemはQObjectじゃないよなー、どうやってQImageのやりとりしよっかなーとか考えたり。アイコン一つ表示させるためにわざわざ取得用クラスを作ったり、地味に手間かかったやんよー。

「そもそもなんでお前はそんなに回したいんだ?」って感じですが、なんでだろう。でもなんかQGraphicsViewを折角使ってるんだし拡縮したり回したりしたいじゃんよ!。

5月 212011
 

と言うわけで前にも言ったけどQOAuth使ってtwitterからXML取れてQDomDocument使ってtweetをクラスに放り込めたのであとはお好みのUI組み込むだけで俺仕様のtwitterクライアントのできあがりとなっちゃう。tweet自体をメモリに取り込んでるわけだからそこから検索するなりスコアリングするなり好きにできるのでもうつぶやきに埋もれて窒息することもないぜ!、とまではいかないけども。

で、UIの話。

普通にdesignerなんかでUI作ってもいいんだけど、折角ですからQGraphicsView使おうぜ!と言う方向でちと遊んでみる。

QGraphicsViewのいいところは通常のレイアウトを使ったWidgetの配置と違ってその自由度の高さってことになると思います。逆に言うと自由であるが故にぐちゃぐちゃにもなるって感じ。

線やテキストなんかをシーンに配置して、そのシーン(QGraphicsSceneかな)をQGraphicsViewに結びつけて表示、表示するオブジェクトに関してはQGraphicsItemと言う形でアクセスする、って感じなのですが、これがQWidgetも置くことができるわけで。アクセス方法がQGraphicsProxyWidgetってのになりますが。

ざっくりと表示例を上げると、

どーん。QLabelを使ったWidgetがscaleとrotateされてならんだりとか。

で、こいつらWidgetなので当然ボタンとかを配置して押すこともできたり。楽しいですよね。

ただ、回転なんかをかけ始めるとどうも動作が重く。そりゃそうだわなーと言う感じですが、assistantなんかを参照していただければ分かるのですが、QGLWidgetを使うこともできて、そっち使うと結構早いです。しかもQGraphicsView::setViewport()でQGLWidgetをnewして渡すだけ。

くるくる回したりズームさせたり。UI作りって楽しいですよねー。まあ、ほんと一歩間違えればぐっちゃぐちゃになるけどね!。

5月 192011
 

QDomDocumentのサンプルコードはQDomNode→QDomElementと変換してってコードになっとおけど、QDomElement::firstChild()じゃなくてもQDomElement::firstChildElement()なんて言うそのまんまの名前のものもあったりして。こりゃ使うっきゃない。どうしてもだらだらしがちだしね。

以前のQOAuth周りでゲットできたXMLをざざざーっと適当な構造体配列に突っ込む感じで。

ぶっちゃけOAuth経由でアクセスできて、XMLが取得さえできてしまえばあとは正直どうとでもなる。適当にメモリ上に格納できてしまえばあとは煮るなり焼くなり好きにした上でUIでもつけりゃtwitterクライアントのできあがり。まあ、投稿部分スルーしてるけどね。

以前上げたQOAuthのんと組み合わせれば簡単なコマンドライン型クライアントとかならさくっと作れるんじゃないでしょうか。俺は作りませんけどね。

しかしtwitterの吐くXML、status毎にuser情報持ってたりとかしていやに長い。できるだけ一回のアクセスで情報を流すって工夫だとは思うんだけど、RT元とRT自体の情報を1つのstatusが持ってたりとかするのね。いいのか悪いのかは分からんなあ。まあ取り込んで解析さえしてしまえば同じっちゃあそうだけど。

さて。

例によってかいつまむよー。ちょっとだらだら長いよー。

Continue reading »

3月 262011
 

例によってぬっぽりかいつまむ。

 

 

 

    QOAuth::Interface qoauth;
    qoauth.setConsumerKey(NOPTTER_CONSUMER_KEY);
    qoauth.setConsumerSecret(NOPTTER_CONSUMER_SECRET);
    QOAuth::ParamMap map;
    QByteArray url = "http://api.twitter.com/1/statuses/home_timeline.xml";
    QByteArray attr = qoauth.createParametersString(url,
                                                      QOAuth::GET,
                                                      config.value("token").toByteArray(),
                                                      config.value("secret").toByteArray(),
                                                      QOAuth::HMAC_SHA1,
                                                      map,QOAuth::ParseForInlineQuery);
    qDebug() << url.append(attr);

 

 

urlをwgetでもするとごにょごにょ…。

 

3月 102011
 

前置きもなくいきなりかいつまみます。

 

 

    QTextStream in(stdin);
    QTextStream out(stdout);
    QOAuth::Interface qoauth;
    qoauth.setConsumerKey("貴様のConsumerKey");
    qoauth.setConsumerSecret("貴様のConsumerSecret");
    QOAuth::ParamMap reply = qoauth.requestToken( "http://twitter.com/oauth/request_token",
                                                 QOAuth::GET,QOAuth::HMAC_SHA1);
    QByteArray token;
    QByteArray tokenSecret;
    if (qoauth.error() == QOAuth::NoError) {
        token = reply.value( QOAuth::tokenParameterName() );
        tokenSecret = reply.value( QOAuth::tokenSecretParameterName() );
    } else return 1;
    out << "url: http://twitter.com/oauth/authorize?oauth_token=" << token << endl;
    out << "input pin: " << endl;
    QString pin;
    in >> pin;
    QOAuth::ParamMap map;
    map.insert("oauth_verifier",pin.toAscii());
    reply = qoauth.accessToken("http://twitter.com/oauth/access_token",QOAuth::POST,token,
                               tokenSecret,QOAuth::HMAC_SHA1,map );
    if (qoauth.error() == QOAuth::NoError) {
        token = reply.value( QOAuth::tokenParameterName() );
        tokenSecret = reply.value( QOAuth::tokenSecretParameterName() );
        out << "token: " << token << endl;
        out << "tokenSecret: " << tokenSecret << endl;
    } else {
        qDebug() << qoauth.error();
    }

 

 

こんな感じ。

requestTimeoutが短いと失敗すると言う罠にずっぽりはまったりとかね。

3月 042011
 

ほんと久々にコード書いてupしました。

くだらない俺仕様プログラムですが、興味のある方はお試し下さい。随所に手抜きが見られるいつものTAMクオリティですが。

 

nopview

 

ちとこまけえ話をしますと、テーマとしてはgwenviewよりも簡単にタグが付けられて、画像をフルスクリーンにできて、片手で操作できる。これです。

後は、ディレクトリ管理から解放される、かな。

この手のカタログ管理ソフトって結構あるような気もします。digikamなんかもそうかな。

 

余談。

最初はnepomukを使ったKDEアプリケーションになる予定でした。でしたが、速度的な問題で我慢できなくなりました。

あと、nepomukを使ってしまうとタグが全体に筒抜けになるので他人にタグを見られるとすげえ恥ずかしいんじゃないかと言うのもあったり(性癖的な意味で)。

 

あと、カタログデータはメモリにがっつり持ち込むのでそれなりにメモリを食いますがスワップ発生しない限りはそこそこの速度で動きます。テストは1万枚以上の画像ファイル使ってやっとりますのでそのへんは確実です。でもメモリもりもり食うけどね。

 

実はWindowsでもコンパイルできますが…既に幾つか問題を見つけております。ですが、スルーで。

2月 252011
 

久々におじさん大興奮です。

AndroidアプリがQtで書けるのよ。そらもうね。

とりあえずざっくり試す方法だけ書いておきますね。環境はkubuntu10.10でございます。


 

とりあえずこちらをざざっと見て頂いて

もしもEclipseでのAndroid開発環境が既に構成されているのであればそのまま流用できますんでおすすめです。

されてませんーって方は、まあ今後するかもしれないのであればこの機会にやっちまえ。色んなサイトで日本語でどうすればいいか説明されております。

あと、ndk必須。ndkは入れてないなーと言う方は貰ってきておいて下さい。

頂いてくるもの。

こちらが本体。そしてこちらがministroっつーAndroid向けQtをダウンロードしてくれる素晴らしいアプリ。実機やエミュレータで動かすにしてもAndroid向けQtをインストールする必要がありますから両方セットで。

用意が終わったら実行属性つけて起動。インストーラに従って叩き込みましょう。

そしておもむろに全裸になった後(靴下除く)、正座して”/opt/necessitas/QtCreator/bin/qtcreator”(標準)を叩きます。

Creatorきたこれ。

因みに既にCreator使ってて環境がまざっちゃうと困るよーと言う方も、とりあえず別環境として動くようです。安心ですね。

早速wktkしつつツール→オプションを叩くと、見慣れない「Android」の文字が。

ヤーッ!。

なにはともあれsdkとndkとtoolchainを指定してあげて下さい。antはapt-get installしてあれば空白でもおkです。

AVD Managerのところは1個用意しときましょう。Eclipseで使っていたものがあればそれでもいいかな。

次、Android用Qt4を使うように指定します。

ヤェーッ!。

いやっほう、これでとりあえずおkです。

早速なんかサンプルを読み込ませてコンパイルしてみましょう。どきどきですね。

Android向けQtを指定するのを忘れずに。

ビルド設定は特に触らなくてもいいかな。シャドウビルドだけ外してみます。

ターゲットはAndroid-8に。デフォでAndroid-3になってますがうまくコンパイルできず。

デプロイ設定は一番下のを選んで、ダウンロードしておいたministroのapkを指定してやりましょう。

さてビルド。

うまく通れば実行ボタンで仮想マシンまで起動します。ministroが動いて初回にめきめきとQtライブラリを拾ってきます。気長に待ちます。

因みに実機向けだとmarketに既にministro上がっているようで。

きたああーーー!!!。

因みに日本語は入力できません。残念。こんどコード覗いてみよう。


さてざっくり(ほんとざっくりだな)でしたが、要はこれQt向けのコードをネイティブでコンパイルしてライブラリ化しjni経由で起動してる様子なのですが、まあそう考えれば速度的には全く問題ないレベルなんじゃなかろうかと予想。まだあんま触ってないから分からないけどね。

気になるのはメモリの食い具合なんだけどね。とりあえず実機にもってった感想ではえらいことにはなってない様子ではあったけど…まだわかんないね。

UIはX版なのかな。Androidに合わせてってわけでは無い感じ。それでも、WindowsやX向けのQtのコードをAndroid向けにそのままコンパイルできるインパクトはでかいな。

2月 142011
 

KDEを入れたらまずnepomukを止める!、なんて人もいるやも知れませんが、それはちょっと悲しいぜ。

nepomukを使うことでKDEはタグとかレーティングとかを手に入れることができます。しかもそれが、dolphinなんかでそのまま使えてしまう。

ただ、いまいち対応したソフトが少ないなーと言う気もします。ざっと見たところではdolphin、gwenviewとかでしょうか。ただ、やってることはKIO経由なので実は対応しているしていないに限らずKDEのアプリケーションなら全体的に使えんこともない、と言うことにもなりますな。

てなわけで、ざざっとコード的な話とか。

 

 


 

タグとかを付ける話から。

nepomuk自体は色々複雑なしくみだったりしよるんやも知れませんが、ファイルなんかに追加情報を付けるのは至って簡単です。

#include <KDE/Nepomuk/Resource>
#include <KDE/Nepomuk/Tag>
{
    Nepomuk::Resource r("/file/name.txt");
    Nepomuk::Tag tag("ぶにぶに");
    r.addTag(tag);
}

 

とまあ、こんな感じ。簡単です。タグ以外にもsetAnnotationやらsetRatingなんてのがあります。簡単ですよね?。

 


 

次。読み出し。

これも要は書き出しと同じことです。

 

#include <KDE/Nepomuk/Resource>
#include <KDE/Nepomuk/Tag>
{
    Nepomuk::Resource r("/file/name.txt");
    QListIterator<Nepomuk::Tag> tags(r.tags());
    while(tags.hasNext()) qDebug() << tags.next().genericLabel();
}

とまあ、こんな感じ。ファイルが特定されているのであればこうやって読み出したり書き込んだりできます。

 


 

ではファイルが特定されていない場合はどうなのか。

例えば「ぶにぶに」タグが付いているファイルどこにあるの?と言うのを探し出したいとか言う場合。ぶっちゃけこの用途が最も多いと思うのですが。

このページの「Query Examples」ってとこにいろいろと細かく書いてあるのですが、これだけ見ると「え?ややこしくね?」と言う話にもなろうかと。だがしかし、最後の方を見ていただければ。要はKIO経由なわけでございます。

実際にdolphin(konquerorでもいいよ)で「nepomuksearch:」から始まるURLを叩いてただければ同じことができるわけです。Nepomuk::Queryでそれら検索用のクエリを作って.toSearchUrl()で検索クエリを含むURLを出せば…と言う話。

だから最初に言った「KIO経由なのでKDEアプリケーションなら…」と言う話になるわけです。

試しにkwriteなんかのファイルを開くダイアログでファイル名なんかに「nepomuksearch://?query=hasTag:ぶにぶに」なんて叩いてやると、実はちゃんと「ぶにぶに」タグの付いたファイルリストが出ます。

…っと、query=でやるのは時代遅れで最近はsparqlっつーSQLみたいなのを使うのが主流のようですが。「nepomuksearch:/?sparql=select ?r where {?r nao:hasTag <nepomuk:/ぶにぶに>}」とかになるようです。

 


 

とまあ、意外に使うのは簡単だと思います。もしもKDEアプリケーションを作る予定があるのであれば、ちょっとこの辺も考慮してnepomuk対応を実装しちゃったりするとかっこいいんじゃないかな?なんて思う次第ですよ。

てか日本語の資料がほとんどないのよね。

 

 

10月 182010
 

Maverickで入ってきたutouch。マルチタッチとかジェスチャとかなんかそんな感じのもの。
ざっと手順。

  1. geis_init()で初期化してインスタンスゲッツ。
  2. geis_input_devices()でデバイス周りのコールバックをセット。
  3. geis_subscribe()で監視するジェスチャとコールバックをセット。
  4. geis_event_dispatch()をイベントループにぷちこんで準備完了。
  5. 終わりはgeis_finish()で賢者タイム。

んでコールバックに送られるジェスチャはTapやDrag、RotateにPinch等々。それぞれにGeisGestureAttrの配列が渡されてそっから値を取り出していく感じ。シンプルですね。

指が触れてから完全に離れるまでが1つのジェスチャと取られるわけで、最初に触れたところがstart、途中の動作がupdate、最後がfinishつうコールバックになると。わかりやすいと言えばわかりやすいですね。実装もそんなに難しくないです。

で。

感想としてはシンプルで分かりやすくていいなーと言う反面、やや面倒くさいなーと言うのもあったりとか。start/update/finishのコールバックが別々なのは何かしら意味があるのかなと思ったり。ある意味startやfinishもupdateと言えなくもないような気もします。

こいつを使ってガリガリとgtkやQt使ってプログラム書いていくのもいいのですが、正直なところツールキット上での対応があると楽だよねこれ。QtにはQGestureEventなんてクラスも既にあるわけで、普通にタッチイベントを処理できるようになると楽しそうです。既存のプログラムのタッチ対応なんかも楽だろうしね。

さて。

で、マルチタッチに対応して何が面白いのー?って根本的な話なわけですが、正直俺も当初は疑問でございました。小型デバイスならまだしも、ノート型とかでマルチタッチとか誰得…と思ってたわけです。画像ビューアとか以外に使い道思いつかない的なね。

ところが冷静に考えてみたら、ソフトウエアキーボードとかでこれその性能を発揮するんじゃないの?と思ったり。マウスのようなシングルポイントでは不可能な「キーリリース前のキープレス」を正しく認識してくれるようなものができる気がします。アニメとかでぺぺぺぺっと画面をキーボードのように叩いてる感じで。

問題は対応するデバイスを用意しないといけないとこでしょうか。開発やるにしても試すにしても。まあそれは何でも同じですが。