2010年06月03日 linux-2.6.35-rc1 for zaurus(SL-C760) [長年日記]
_ linux-2.6.35-rc1 for zaurus(SL-C760)
Debian(lenny) for ARM on zaurus(SL-C760)のカーネルを2.6.35-rc1にバージョンアップ。
zaurus専用のタッチスクリーンドライバ(corgi_ts)は宣言通りに削除されていているのだが、期待していた汎用のタッチスクリーンドライバ(ADS7846)のブルブル動作は改善せずX-(。
でもレジューム動作は[PowerOn]スイッチだけで可能になっていた(^O^)/。
_ apache 2.2.15 on myh.no-ip.org(Libretto100)
このブログをホストしているサーバ(Libretto100)のapacheを(ようやく重い腰を上げ...)1.3.41から2.2.15にバージョンアップ。
.htaccessによる
XBitHack on
が有効にならない(SSIが動かない)こと以外は、おおむね順調に移行できたよう。
2010年06月10日 Slackware-13.1 日本語キーボード [長年日記]
_ Slackware-13.1 日本語キーボード
Slackware-13.1をインストールする機会があった。一番最近インストールしたのはSlackware-12.2だった。
いつもどうりにインストールは進んだのだが、xorgの設定で手こずった。どうしても日本語キーボードに設定できない。
今までなら、xorg.confでXkbModelとXkbLayoutあたりを設定すれば済んでいたのだが、どうやら今回は事情が違うよう。
よくは分からないが、最近のLinuxでは入力イベントをさばく機構がevdevとhaldという物の連係プレーになっているらしく、そのため昔のやりかたは一部通用しなくなっている。
Google先生にお尋ねすること数時間、以下の方法が見えてきた。
.xinitrcなどからコマンドで設定する方法
setxkbmap -rules evdev -model jp106 -layout jp
xorg.confで設定する方法
以下を突っ込んでおくと、従来通りXkbModelとXkbLayoutで設定できる。
Section "ServerFlags"
Option "AllowEmptyInput" "false"
Option "AutoAddDevices" "false"
Option "AutoEnableDevices" "false
EndSection
10-keymap.fdiによる方法
cp /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi /etc/hal/fdi/policy/
した後、/etc/hal/fdi/policy/10-keymap.fdiを
<merge key="input.xkb.layout" type="string">us</merge>
↓ 変更
<merge key="input.xkb.layout" type="string">jp</merge>
した後、haldを(めんどくさければマシンごと)再起動する。
この3つの方法は、後の方法ほど真っ当な方法らしいのだが、今回は従来通りにxorg.confで設定できるように、2番目の方法を採用した。なお、2番目の方法は上記の10-keymap.fdiの中にコメントとしてアドバイスされていた。
2010年06月11日 Google カレンダーをJAVAで操作する [長年日記]
_ Google カレンダーをJAVAで操作する
Googleカレンダーをjavaで操作する仕事を依頼されそうになった。慌てて調べてみた。すごく苦労した。なのでまとめておく。
CalendarTest.java
//
// GoogleCalendar操作実験プログラム by m-ito
//
// 「わし、くらうどになるねん」
//
// Download : gdata-samples.java-1.41.3.zip from http://code.google.com/p/gdata-java-client/
//
// CLASSPATH=.;
// C:\Program Files\Java\jre1.6.0_02\lib\ext\QTJava.zip;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-client-1.0.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-client-meta-1.0.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-calendar-2.0.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-calendar-meta-2.0.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-maps-2.0.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-maps-meta-2.0.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\deps\google-collect-1.0-rc1.jar;
// C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\deps\jsr305.jar
//
// Compile : javac -encoding utf-8 CalendarTest.java
//
// Usage : java CalendarTest Googleのアカウント パスワード
//
import com.google.gdata.client.*;
import com.google.gdata.client.calendar.*;
import com.google.gdata.data.*;
import com.google.gdata.data.acl.*;
import com.google.gdata.data.calendar.*;
import com.google.gdata.data.extensions.*;
import com.google.gdata.util.*;
import java.net.*;
import java.io.*;
import java.util.List;
public class CalendarTest {
public static void main(String[] args) throws Exception {
//============================================================
// プロキシーの設定
//============================================================
System.setProperty("http.proxyHost", "192.168.0.100");
System.setProperty("http.proxyPort", "8080");
System.setProperty("https.proxyHost", "192.168.0.100");
System.setProperty("https.proxyPort", "8080");
//============================================================
// カレンダーサービスオブジェクト作成
// o この親玉オブジェクトを介してGoogleCalendarを操作していく
// o 引数はオブジェクトを識別するための(?)任意文字列
//============================================================
CalendarService myService = new CalendarService("Sample-Service-Name");
//============================================================
// ログイン処理
//============================================================
String account = args[0]; // 1個目の引数
String password = args[1]; // 2個目の引数
myService.setUserCredentials(account, password);
//============================================================
// アクセスするURLオブジェクトの作成
// o 操作対象や、希望する機能ごとにいろんなURLが定められているみたい
// o とりあえず個人のカレンダーに登録されたイベントを操作する場合はこのURL
//============================================================
// URL postUrl = new URL("http://www.google.com/calendar/feeds/カレンダーID/private/full");
// o カレンダーIDがdefaultの場合はアカウントを指定したのと同じ
//
URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/private/full");
//============================================================
// 全件のイベントを取得
//============================================================
System.out.println("===== 全件のイベントを取得 =====");
//
// イベントオブジェクトを作成
// o カレンダー上の全イベント情報を持つオブジェクト
//
CalendarEventFeed myFeed1 = myService.getFeed(feedUrl, CalendarEventFeed.class);
//
// 全イベントをイベントエントリオブジェクトのリスト形式で取得
//
List<CalendarEventEntry> feeds1 = myFeed1.getEntries();
//
// 個々のイベントエントリオブジェクトから項目を取り出して表示
//
for (CalendarEventEntry entry1 : feeds1) {
System.out.println(entry1.getTitle().getPlainText() + "|"
+ entry1.getTextContent().getContent().getPlainText() + "|"
+ entry1.getTimes().get(0).getStartTime().toString() + "|"
+ entry1.getTimes().get(0).getEndTime().toString());
}
//============================================================
// 開始日時、終了日時を指定してイベントを取得
//============================================================
System.out.println("===== 開始日時、終了日時を指定してイベントを取得 =====");
//
// カレンダー問い合わせオブジェクト作成
// o 問合せ条件を設定するためのオブジェクト
//
CalendarQuery myQuery2 = new CalendarQuery(feedUrl);
//
// 問合せ条件(開始日時下限〜上限)設定
// o yyyy-mm-ddThh:mm:ss.mmm+09:00
// - yyyy : 西暦年
// - mm : 月
// - dd : 日
// - T : 固定値(?)
// - hh : 時
// - mm : 分
// - ss : 秒
// - mmm : マイクロ秒
// - +09:00 : 固定値(グリニッジ標準時 + 09:00 = 日本標準時間)
//
myQuery2.setMinimumStartTime(DateTime.parseDateTime("2010-05-01T00:00:00.000+09:00"));
myQuery2.setMaximumStartTime(DateTime.parseDateTime("2010-05-15T23:59:59.999+09:00"));
//
// 問合せを実行し、イベントオブジェクトを得る
// o 問合せ結果の全イベント情報を持つオブジェクト
//
CalendarEventFeed ResultsFeed2 = myService.query(myQuery2, CalendarEventFeed.class);
//
// 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
//
List<CalendarEventEntry> feeds2 = ResultsFeed2.getEntries();
//
// 個々のイベントエントリオブジェクトから項目を取り出して表示
//
for (CalendarEventEntry entry2 : feeds2) {
System.out.println(entry2.getTitle().getPlainText() + "|"
+ entry2.getTextContent().getContent().getPlainText() + "|"
+ entry2.getTimes().get(0).getStartTime().toString() + "|"
+ entry2.getTimes().get(0).getEndTime().toString());
}
//============================================================
// 全文検索でイベントを取得
// o 時に曖昧な結果を返す(日本語を含む場合?は使えないと思っ
// ておいたほうが...)
//============================================================
System.out.println("===== 全文検索でイベントを取得 =====");
//
// カレンダー問い合わせオブジェクト作成
// o 問合せ条件を設定するためのオブジェクト
//
CalendarQuery myQuery3 = new CalendarQuery(feedUrl);
//
// 問合せ条件(全文検索文字列)設定
//
myQuery3.setFullTextQuery("NW");
//
// 問合せ条件(何件目から結果を受け取るか)設定
//
myQuery3.setStartIndex(1);
//
// 問合せ条件(最大何件結果を受け取るか)設定
//
myQuery3.setMaxResults(3);
//
// 問合せを実行し、イベントオブジェクトを得る
// o 問合せ結果の全イベント情報を持つオブジェクト
//
CalendarEventFeed ResultsFeed3 = myService.query(myQuery3, CalendarEventFeed.class);
//
// 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
//
List<CalendarEventEntry> feeds3 = ResultsFeed3.getEntries();
//
// 個々のイベントエントリオブジェクトから項目を取り出して表示
//
for (CalendarEventEntry entry3 : feeds3) {
System.out.println(entry3.getTitle().getPlainText() + "|"
+ entry3.getTextContent().getContent().getPlainText() + "|"
+ entry3.getTimes().get(0).getStartTime().toString() + "|"
+ entry3.getTimes().get(0).getEndTime().toString());
}
//============================================================
// イベントを追加
//============================================================
System.out.println("===== イベントを追加 =====");
//
// 追加用のイベントエントリオブジェクトを作成
//
CalendarEventEntry myEntry = new CalendarEventEntry();
//
// 追加用のイベントエントリオブジェクトにタイトル設定
//
myEntry.setTitle(new PlainTextConstruct("秘密3"));
//
// 追加用のイベントエントリオブジェクトに本文設定
//
myEntry.setContent(new PlainTextConstruct("ないしょだよーん3"));
//
// 日時オブジェクトに開始日時設定
//
DateTime startTime = DateTime.parseDateTime("2010-06-30T08:45:00.000+09:00");
//
// 日時オブジェクトに終了日時設定
//
DateTime endTime = DateTime.parseDateTime("2010-06-30T17:15:00.000+09:00");
//
// 何時オブジェクト作成
//
When eventTimes = new When();
//
// 何時オブジェクトに開始日時、終了日時設定
//
eventTimes.setStartTime(startTime);
eventTimes.setEndTime(endTime);
//
// 追加用のイベントエントリオブジェクトに何時オブジェクト(開始日時、終了日時)追加
//
myEntry.addTime(eventTimes);
//
// 追加実行
//
CalendarEventEntry insertedEntry = myService.insert(feedUrl, myEntry);
//============================================================
// イベントを更新
//============================================================
System.out.println("===== イベントを更新 =====");
//
// カレンダー問い合わせオブジェクト作成
// o 問合せ条件を設定するためのオブジェクト
//
CalendarQuery myQuery4 = new CalendarQuery(feedUrl);
//
// 問合せ条件(開始日時下限〜上限)設定
//
myQuery4.setMinimumStartTime(DateTime.parseDateTime("2010-06-30T08:45:00.000+09:00"));
myQuery4.setMinimumStartTime(DateTime.parseDateTime("2010-06-30T08:45:00.999+09:00"));
//
// 問合せを実行し、イベントオブジェクトを得る
// o 問合せ結果の全イベント情報を持つオブジェクト
//
CalendarEventFeed ResultsFeed4 = myService.query(myQuery4, CalendarEventFeed.class);
//
// 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
//
List<CalendarEventEntry> feeds4 = ResultsFeed4.getEntries();
//
// 個々のイベントエントリオブジェクトから項目を取り出して更新
//
for (CalendarEventEntry entry4 : feeds4) {
System.out.println("今から修正するイベント : "
+ entry4.getTitle().getPlainText() + "|"
+ entry4.getTextContent().getContent().getPlainText() + "|"
+ entry4.getTimes().get(0).getStartTime().toString() + "|"
+ entry4.getTimes().get(0).getEndTime().toString());
//
// イベントエントリオブジェクト中のタイトルと本文を修正
// o 開始日時、終了日時の修正はできないみたい
//
entry4.setTitle(new PlainTextConstruct("すっごい秘密3"));
entry4.setContent(new PlainTextConstruct("絶対ないしょだよーん3"));
//
// 検索&修正したイベントエントリオブジェクトから更新用のURLオブジェクトを生成
//
URL editUrl = new URL(entry4.getEditLink().getHref());
//
// 更新実行
//
CalendarEventEntry updatedEntry = (CalendarEventEntry)myService.update(editUrl, entry4);
}
//============================================================
// イベントを削除
//============================================================
System.out.println("===== イベントを削除 =====");
//
// カレンダー問い合わせオブジェクト作成
// o 問合せ条件を設定するためのオブジェクト
//
CalendarQuery myQuery5 = new CalendarQuery(feedUrl);
//
// 問合せ条件(開始日時下限〜上限)設定
//
myQuery5.setMinimumStartTime(DateTime.parseDateTime("2010-06-30T08:45:00.000+09:00"));
myQuery5.setMaximumStartTime(DateTime.parseDateTime("2010-06-30T17:15:00.999+09:00"));
//
// 問合せを実行し、イベントオブジェクトを得る
// o 問合せ結果の全イベント情報を持つオブジェクト
//
CalendarEventFeed ResultsFeed5 = myService.query(myQuery5, CalendarEventFeed.class);
//
// 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
//
List<CalendarEventEntry> feeds5 = ResultsFeed5.getEntries();
//
// 個々のイベントエントリオブジェクトを削除
//
for (CalendarEventEntry entry5 : feeds5) {
System.out.println("今から削除するイベント : "
+ entry5.getTitle().getPlainText() + "|"
+ entry5.getTextContent().getContent().getPlainText() + "|"
+ entry5.getTimes().get(0).getStartTime().toString() + "|"
+ entry5.getTimes().get(0).getEndTime().toString());
//
// 検索したイベントエントリオブジェクトから削除用のURLオブジェクトを生成
//
URL deleteUrl = new URL(entry5.getEditLink().getHref());
//
// 削除用のURLオブジェクトから削除用イベントエントリオブジェクトを作成
//
CalendarEventEntry delentry = myService.getEntry(deleteUrl, CalendarEventEntry.class);
//
// 削除実行
//
delentry.delete();
}
}
}
結局その案件は無くなった:(