無題 @ はてな このページをアンテナに追加 RSSフィード

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |

2007-10-12

WEB API

使えそうなもの

最寄り駅を取得する
wikipediaの記事を取得する
流行の言葉を取得する
ブログの本文を抽出する
飲食店情報を取得する
天気予報を取得する
ふたりの相性を占う
今日の運勢を取得する
ミニブログfeecleのヒトコトやコメントを取得する

ミニブログ Feecle[フィークル] “みんな、今なにしてる?” という Twitter のよーなサービスがあるよーである。文章が短いので、おしゃべりしやすい。

OKWaveの質問データを検索する
連想検索エンジンreflexa(リフレクサ)の機能をWebサービス上から利用する
最新記事を追いかける
大手レストランサイト、ぐるなびの情報を取得する
指定ワードと組み合わせて使われる関連語を取得できる
はてなダイアリーのキーワードと関連するキーワードを取得する

日本語系

日本語の文を単位(形態素)に分割、認定する
日本語文を形態素に分割し、品詞、読みがなの付与、統計情報を取得する

こちらはyahoo研究所作成のもの。

文章からキーワードを抜き出す

参考

boost/pythonによるRSSの取得

C++XMLを扱うには結構な労力が必要だったので、なら試しにと、boost/pythonを使うことにしました。pythonのfeedparserでRSSパースし、キーワードc++に渡すプログラムです。

下のプログラムではkizapiのきざしランキング上位30位のRSSを取得し、ランダムに出力します。

#include <stdio.h>
#include <stdlib.h>
#include <tcl.h>
#include <Python.h>
#include <boost/python.hpp>
#include <time.h>

using namespace boost::python;

int main()
{
   char CODES[256];
   char* wadai;
   int random;

   srand((unsigned) time(NULL));

   try{
      Py_Initialize();

      object main_module((handle<>(borrowed( PyImport_AddModule("__main__"))) ));
      object main_namespace = main_module.attr("__dict__");

      random = rand() % 30;

      sprintf(CODES,
         "import feedparser\n"
         "rss = feedparser.parse('http://kizasi.jp/kizapi.py?type=rank')\n"
         "topic = rss.entries[%d].title.encode('utf-8')\n", random);
      handle<>ignored(PyRun_String(CODES, Py_file_input, main_namespace.ptr(), main_namespace.ptr()));

      wadai= extract<char*>(main_namespace["topic"]);
      printf("wadai%d=%s\n", random, wadai);

      Py_Finalize();
   }
   catch(error_already_set&){
      PyErr_Print();
   }

   return 0;
}

wiimote de uchiwa

D

この作品は、近年の電力不足と無駄に配られている"うちわ"に対するアンチテーゼです。

エアコン増などの理由で電力不足が深刻となっているところに「エアコンの電源を入れる時は、同時に扇風機を使おう」なんてCMが流れるこの時代。それなら扇風機を使わずに家に余っているうちわを使ってさらに省エネを目指せば電力会社も大助かりです。

また、家族がすれ違うことが多い現状、うちわで扇ぎ扇がれるというような光景はなかなか見れなくなっています。そんな中で、「扇ぐ喜び―扇がれる幸せ」を感じることができるようにするためにはどうすればよいか。その解決策として離れていても相手を感じることが可能な「wiimoteによるうちわのリモートコントロール」を提案致します。ネットワーク越しに動作可能にし、wiimoteの扇ぎとうちわの扇ぎを同調させることで、ネットワークのあちら側の人と「扇ぐ喜び―扇がれる幸せ」を共有できればどんなに楽しいことでしょう。。。


まあ、ネタですので話半分でお願いします(笑

下のプログラムを応用して作りました。加速度センサの値をリアルタイムで計測して仰がせるほうがよりリアルになりますよね。

これからはネットワーク越しで利用可能なように改良していきます。

Linuxでwiimoteを使う。

サンプルをすこしいじって、ドラムをたたくように振るとランブルするプログラムを作成。

Debiansid)使用。

windowsより扱いやすい感じです。



test.c

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <cwiid.h>

#define toggle_bit(bf,b)   \
      (bf) = ((bf) & b)    \
          ? ((bf) & ~(b))  \
          : ((bf) | (b))

void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode);

cwiid_err_t err;
void err(cwiid_wiimote_t *wiimote, const char *s, va_list ap)
{
   if (wiimote) printf("%d:", cwiid_get_id(wiimote));
   else printf("-1:");
   vprintf(s, ap);
   printf("\n");
}

int main(int argc, char *argv[])
{
   cwiid_wiimote_t *wiimote;  // wiimote handle
   struct cwiid_state state;  // wiimote state
   bdaddr_t bdaddr;           // bluetooth device address
   unsigned char mesg = 0;
   unsigned char led_state = 0;
   unsigned char rpt_mode = 0;
   unsigned char rumble = 0;
   int beat = 0;
   int cnt = 0;

   cwiid_set_err(err);

   /* Connect to address given on command-line, if present */
   if(argc > 1){
      str2ba(argv[1], &bdaddr);
   }
   else{
      bdaddr = *BDADDR_ANY;
   }

   /* Connect to the wiimote */
   printf("Put Wiimote in discoverable mode now (press 1+2)...\n");
   if(!(wiimote = cwiid_open(&bdaddr, 0))){
      fprintf(stderr, "Unable to connect to wiimote\n");
      exit(EXIT_FAILURE);
   }

   printf("### beatbox ###\n");

   /* set ACC rpt mode */
   toggle_bit(rpt_mode, CWIID_RPT_ACC);
   set_rpt_mode(wiimote, rpt_mode);

   while(1){
      /* get acc state */
      if (cwiid_get_state(wiimote, &state)) {
         fprintf(stderr, "Error getting state\n");
      }

      if(beat==0 && state.acc[CWIID_Z]>200){
         printf("beat %d!!\n", cnt++);
         beat = 1;
         /* rumble 100ms */
         toggle_bit(rumble, 1);
         if (cwiid_set_rumble(wiimote, rumble)) {
            fprintf(stderr, "Error setting rumble\n");
         }
         if (cwiid_set_led(wiimote, 0x0f)) {
            fprintf(stderr, "Error setting LEDs \n");
         }

         usleep(100000);
         toggle_bit(rumble, 1);
         if (cwiid_set_rumble(wiimote, rumble)) {
            fprintf(stderr, "Error setting rumble\n");
         }
         if (cwiid_set_led(wiimote, 0x00)) {
            fprintf(stderr, "Error setting LEDs \n");
         }
      }
      if(beat==1 && state.acc[CWIID_Z]<140){
         beat = 0;
      }
      usleep(1000);
   }

   if(cwiid_close(wiimote)){
      fprintf(stderr, "Error on wiimote disconnect\n");
      exit(EXIT_FAILURE);
   }

   exit(EXIT_SUCCESS);
}

void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode)
{
   if(cwiid_set_rpt_mode(wiimote, rpt_mode)){
      fprintf(stderr, "Error setting report mode\n");
   }
}

Makefile

SOURCES = test

LDLIBS += -lcwiid

$(SOURCES): $(SOURCES).c
   $(CC) $< $(LDLIBS) -o $@
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |