コンピュータやソフトウェアのあれこれ@道民(&元道民)
Archive for 12月, 2010
twitter道民部2010忘年会に行った
12月 19th
twitter道民部2010忘年会に行った
楽しかったです.1 次会に 40 人もいると話せない人の方が多いですね.僕はそれでもいいと思っています.
ポインタのポインタ
12月 19th
みなさん、お待ちかね!
#include <stdio.h>
void setMessage(const char **ppDst, const char *pMessage)
{
*ppDst = pMessage;
}
int main(int argc, char *argv[])
{
const char messageHello[] = "hello.";
const char messageBye[] = "bye.";
const char *p = messageHello;
printf( "p = %s\n", p );
setMessage( &p, messageBye );
printf( "p = %s\n", p );
return 0;
}
実行結果
p = hello.
p = bye.
今日は、ポインタのポインタだよ。
&pは、アドレスが格納された変数のアドレスを表してるよ。
setMessageの中では、最初の引数に*を付けると、
引数に格納されているアドレスをたどってポインタを書き換えることが出来るよ。
もう1つの引数で、そのポインタを書き換えているね。
少しややっこしいかもしれないけど、
ポインタっていうのは、アドレスが格納された変数ということを思い出せば、
きっと理解できるから、ゆっくり考えてね。
2次元配列とポインタ
12月 18th
今日は息抜きだよ!
#include <stdio.h>
int main(int argc, char *argv[])
{
char strings[3][4] = {
{ 'a', 'b', 'c', '\0' },
{ 'd', 'e', 'f', '\0' },
{ 'g', 'h', 'i', '\0' }
};
printf( "strings[0] = %s\n", strings[0] );
printf( "strings[1] = %s\n", strings[1] );
printf( "strings[2] = %s\n", strings[2] );
return 0;
}
実行結果
strings[0] = abc
strings[1] = def
strings[2] = ghi
こうすれば、文字列の配列を表現できるよ。
今日は簡単だったね。
[Java札幌][TDD][Planet] プレTDD BootCamp札幌を開催しました
12月 18th
IT勉強会カレンダー(北海道フィルタ適用版)を作る
12月 18th
やりたいこと
- IT勉強会カレンダーから北海道に関連する情報だけを抜き出す
- 抜き出したイベントを別のカレンダーにインポートできるようにする
使ったもの
- icalendarライブラリ
- open-uri
- Ruby逆引きレシピ
- icalendar
- ファイル操作
ソース
STEP1 iCalendarライブラリでicalファイルを作ってみる
require 'rubygems'
require 'icalendar'
// 日本語を取り扱うので必要
$KCODE = 'u'
// 新しいカレンダーを作る
cal = Icalendar::Calendar.new
// 新しいイベントを作る
event = Icalendar::Event.new
event.dtstart = Date.new(2010,12,18)
event.dtend = Date.new(2010,12,18)
event.summary = '道民部忘年会'
// カレンダーにイベントを追加する
cal.add_event(event)
// ファイルに出力する
output_file = File.open("sample.ical", "w")
output_file.write(cal.to_ical)
output_file.close
日本語とソースコードで言ってることが全く同じですね。
作ったicalファイルはちゃんとGoogleCalendarにインポートできました!
STEP2 GoogleCalendarのical形式ファイルから北海道に関連するイベントだけを抜き出す
require 'rubygems'
require 'icalendar'
require 'open-uri'
$KCODE = 'u'
hokkaido_cal = Icalendar::Calendar.new
open('http://www.google.com/calendar/ical/fvijvohm91uifvd9hratehf65k%40group.calendar.google.com/public/basic.ics') {|f|
cal = Icalendar.parse(f).first
cal.events.each { |event|
if event.summary.match("北海道") and Date::today <= event.dtstart then
hokkaido_cal.add_event(event)
end
}
}
output = File.open("HokkaidoIT.ical", "w")
output.write(hokkaido_cal.to_ical)
output.close
実行
IT勉強会カレンダーのicalファイルのサイズがでかいのでちょっと時間がかかりましたが
無事にファイルができました!
個人カレンダーにインポートして使っています!
これからやりたいこと
- 差分だけ取得したいなぁ
- さらに、それを自動化したいなぁ
- 決まったカレンダーに同期させたいなぁ
差分の取得ができるようになったら、インポートしたカレンダーを公開して
北海道の勉強会情報をもっとわかりやすく共有できたらな、と思う。
翔泳社
売り上げランキング: 67909
カレー南
12月 18th
Posted from Sapporo, Hokkaido Prefecture, Japan.
社員食堂で。
午前中から雪が降ってる。一気に冬景色になった。
今日は同友会マルチメディア研究会の忘年会。
カレー南
12月 17th
Posted from Sapporo, Hokkaido Prefecture, Japan.
社員食堂で。
人生の先輩であり、友人の森川氏の巷論。
最近よくこの辺の話を飲みながらしていて、概ね意見は一致している。
僕が思うのはこれにもう一つ、地域の小売業の方やサービス業者側も地域の人が満足感を得られるものを提供するべく最大限の努力が必要だと思う。買う側も売る側もお互いに支えあっているという意識が必要で、互いに汗をかく必要がある。
そうでなければ買う側が一方的に支えているという意識が働いてしまい、不満が募る気がする。
更には域内循環、域内再投資、このわかりやすそうでわかりにくい 言葉を説く人間が必要だと思う。それは偉い先生や学者ではなく、求心力があり、かつ、地域に生きる人間だと思う。
2次元配列
12月 17th
2次元配列の正体は?
#include <stdio.h>
int main(int argc, char *argv[])
{
char matrix[3][2] = { {0, 1}, {2, 3}, {4, 5} };
printf( "--- value ---\n" );
printf( "matrix[0][0] = %d\n", matrix[0][0] );
printf( "matrix[0][1] = %d\n", matrix[0][1] );
printf( "matrix[1][0] = %d\n", matrix[1][0] );
printf( "matrix[1][1] = %d\n", matrix[1][1] );
printf( "matrix[2][0] = %d\n", matrix[2][0] );
printf( "matrix[2][1] = %d\n", matrix[2][1] );
printf( "--- address ---\n" );
printf( "matrix = %016lX\n", (unsigned long)matrix );
printf( "matrix[0] = %016lX\n", (unsigned long)(matrix[0]) );
printf( "&(matrix[0][0]) = %016lX\n", (unsigned long)&(matrix[0][0]) );
printf( "&(matrix[0][1]) = %016lX\n", (unsigned long)&(matrix[0][1]) );
printf( "matrix[1] = %016lX\n", (unsigned long)(matrix[1]) );
printf( "&(matrix[1][0]) = %016lX\n", (unsigned long)&(matrix[1][0]) );
printf( "&(matrix[1][1]) = %016lX\n", (unsigned long)&(matrix[1][1]) );
printf( "matrix[2] = %016lX\n", (unsigned long)(matrix[2]) );
printf( "&(matrix[2][0]) = %016lX\n", (unsigned long)&(matrix[2][0]) );
printf( "&(matrix[2][1]) = %016lX\n", (unsigned long)&(matrix[2][1]) );
return 0;
}
実行結果
--- value ---
matrix[0][0] = 0
matrix[0][1] = 1
matrix[1][0] = 2
matrix[1][1] = 3
matrix[2][0] = 4
matrix[2][1] = 5
--- address ---
matrix = 00007FFF5FBFF900
matrix[0] = 00007FFF5FBFF900
&(matrix[0][0]) = 00007FFF5FBFF900
&(matrix[0][1]) = 00007FFF5FBFF901
matrix[1] = 00007FFF5FBFF902
&(matrix[1][0]) = 00007FFF5FBFF902
&(matrix[1][1]) = 00007FFF5FBFF903
matrix[2] = 00007FFF5FBFF904
&(matrix[2][0]) = 00007FFF5FBFF904
&(matrix[2][1]) = 00007FFF5FBFF905
値の取得は簡単だね。値を格納するのも同じだよ。
アドレスをよーく見てね、すべて連続してるよ。
実は、1次元の配列なんだけど、
ヒトが指定した2つ添字からどの変数が該当するかを、
Cコンパイラさんが計算してくれてるよ。
今回も添字を指定しないで取得できるアドレスと、
最初の変数のアドレスは一緒だね。
添字を1つだけ指定したときのアドレスは、
2つ目に[0]を指定したときの変数と同じアドレスだね。
2次元配列もアドレスを格納した変数は存在しないよ。
行列や表を表現するのに、2次元配列は使えそうだね。
const
12月 16th
constを使いこなそう!
#include <stdio.h>
int main(int argc, char *argv[])
{
char abc[] = "abc";
const char *p1 = abc;
char * const p2 = abc;
printf( "p1 = %s\n", p1 );
p1++;
printf( "p1 = %s\n", p1 );
p1++;
printf( "p1 = %s\n", p1 );
printf( "p2 = %s\n", p2 );
// p2++; error: increment of read-only variable ‘p2’
p1 = abc;
// p1[0] = 'd'; error: assignment of read-only location
printf( "p1 = %s\n", p1 );
// p2 = abc; error: assignment of read-only variable ‘p2’
p2[0] = 'd';
p2[1] = 'e';
p2[2] = 'f';
printf( "p2 = %s\n", p2 );
printf( "abc[] = %s\n", abc );
return 0;
}
実行結果
p1 = abc
p1 = bc
p1 = c
p2 = abc
p1 = abc
p2 = def
abc[] = def
constの位置によって意味が変わるよ!
ポインタに*を付けると、値を書き換えられるの覚えているかな?
constがchar *に掛かっていると、
値の書き換えをCコンパイラさんが監視してくれるよ。
p2は、char *ではなくて、p2にconstが掛かっているね。
これだと、p2そのものを変更出来ないようにCコンパイラさんが監視してくれるよ。
でも、p2を使って値の書き換えは出来ちゃうから、
こういう使い方はあまりしないよ。
p1は、途中で配列の先頭アドレスを代入出来るけど、
p2は、constで監視されているのも確認してね。
関数の引数でポインタを受け取るときに、
このポインタを使って書き換えは行わないよって宣言するのに、
constはよく使われるよ。
前回のソースコードをもう一度、確認してみてね!
Twitter User Streams APIを「より一層」使ってみる
12月 16th
User Streams APIも、基本的には通常のAPIとほぼ同じデータが取得出来ます。そのデータをイベント毎に分岐する方法について@kei_sさんからnotwifeのmessage.rbをポインタとして教えてもらいました。皆さんnotwife使ってますかー超便利っすよーTwitter+Smartphoneな方は是非使うと良いです。
さて、上記の通りmessage.rbを参考にすると、イベント的には以下の分岐になるようです。
[text]がある→Tweetなので、GETしてきたJSONデータをParseした結果のHashから上記の値があるかどうかを探せば良い訳ですね。ただし、friendsが何なのかわからなかったのと、block/unblockがうまく取れませんでした。この辺は検討課題だな。
[text]+[retweeted_status]がある→ReTweet
[event]="list_member_added"→Listに追加
[event]="list_member_removed"→リストから除外
[event]="follow"→Followされた
[event]="favorite"→Favされた
[event]="unfavorite"→Fav外された
[event]="list_created"→リスト作った
[event]="list_updated"→リストがアップデートされた
[event]="list_destroyed"→リストが削除された
[event]="block"→ブロックされた
[event]="unblock"→ブロック解除された
[friends]→※なんだこれ。
[delete]がある→Delete
[direct_message]がある→Direct Message
#!/usr/bin/ruby -Ku実行した結果はこんな感じ。
require 'rubygems'
require 'oauth'
require 'net/https'
require 'json'
# 自分のアカウント名
myname = "smokeymonkey"
# OAuth 認証データ
CONSUMER_KEY = "HOGEHOGE"
CONSUMER_SECRET = "HOGEHOGE"
ACCESS_TOKEN = "HOGEHOGE"
ACCESS_TOKEN_SECRET = "HOGEHOGE"
consumer = OAuth::Consumer.new(
CONSUMER_KEY,
CONSUMER_SECRET,
:site => 'http://twitter.com'
)
token = OAuth::AccessToken.new(
consumer,
ACCESS_TOKEN,
ACCESS_TOKEN_SECRET
)
# http://dev.twitter.com/pages/user_streams
uri = URI.parse('https://userstream.twitter.com/2/user.json')
begin
# userstreamにはSSLでアクセスする
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5
# ルートCA証明書をダウンロードしてきて指定
https.ca_file = './ca.cer'
https.start do |https|
req = Net::HTTP::Get.new(uri.request_uri)
req.oauth!(https, consumer, token)
https.request(req) do |res|
res.read_body do |chunk|
# chunked = falseなら例外を発生
raise 'Response is not chunked' unless res.chunked?
# JSONのパースに失敗したらスキップして次へ
status = JSON.parse(chunk) rescue next
# イベントによる分岐
if status['text'] then
if status['retweeted_status']
puts "**RTed @#{status['user']['screen_name']}: #{status['text']}"
else
puts "@#{status['user']['screen_name']}: #{status['text']}"
end
elsif status['direct_message'] then
puts " ## DM ## @#{status['direct_message']['sender']['screen_name']} sent you!"
elsif "#{status['event']}" then
case "#{status['event']}"
when 'list_member_added'
puts " ## Added list->@#{status['source']['screen_name']}:[#{status['target_object']['slug']}]"
when 'list_member_removed'
puts " ## Removed list->@#{status['source']['screen_name']}:[#{status['target_object']['slug']}]"
when 'follow'
if "#{status['target']['screen_name']}" == myname then
puts " ## Following you by-> " + "@#{status['source']['screen_name']} !"
end
when 'favorite'
puts " ## Fav ## @#{status['source']['screen_name']} faved @#{status['target_object']['user']['screen_name']}: #{status['target_object']['text']}"
when 'unfavorite'
puts " ## Unfav ## @#{status['source']['screen_name']} unfaved @#{status['target_object']['user']['screen_name']}: #{status['target_object']['text']}"
end
else
next
end
end
end
end
rescue
print "RuntimeError: ", $!, "\n";
end
## Fav ## @dabesa faved @smokeymonkey: @tuka 当日盛り上げて!より便利になりました。これデュアルディスプレイに最大化して表示させときたい。
## Unfav ## @dabesa unfaved @smokeymonkey: @tuka 当日盛り上げて!
## Following you by-> @dabesa !
## Added list->@dabesa:[hoge]
## Removed list->@dabesa:[hoge]
## DM ## @dabesa sent you!
**RTed @dabesa: RT @dabesa: RTのテストー
@dabesa 喋ってみる!
翔泳社
売り上げランキング: 94811



