カテゴリ: Computer, Database, MySQL, Google, GMail, Google Calendar, Google Docs, Google Maps, Google Notebook, Google Reader, Google Search, Google Talk, Google Webmaster Tools, iGoogle, Remember The Milk, Internet, Blogging, Browsers, Firefox, Internet Explorer, Django, MochiKit, Pylons, Web Services, SOAP, WSDL, XML-RPC, Linux, Debian, Red Hat, Ubuntu, Mobile, OLPC, Open Source, Programming, Javascript, AJAX, JSON, PHP, Python, XML, SCM, CVS, git, Mercurial, SVN, Server Hosting, Social Networking, Facebook, Mixi, Windows, Zoho, Zoho Creator, Zoho DB & Reports
feedparserで、media コンテンツを取る
2008/11/24 @ 21:12feedparserで、どうやってビデオを取れるかをずっと悩みましたけど、今日少しだけ、進展した。問題の核心はyoutubeや、vimeoは Yahoo! RSS モジュールを使って、RSS拡張ネームスペースにデータを入れている。この拡張データの処理はfeedparserが中途半端でやってる。見てみよう。
YoutubeのGDATA APIで取ったデータはこうなる
| ... | |
| <entry> | |
| <id>http://gdata.youtube.com/feeds/api/videos/R3orQKBxiEg</id> | |
| <published>2008-07-17T23:58:51.000Z</published> | |
| <updated>2008-11-24T02:32:25.000Z</updated> | |
| ... | |
| <title type="text">Official Watchmen Trailer</title> | |
| <content type="text">Title speaks for itself | |
| so people don't have to keep answerin | |
| the name of the song is: | |
| smashing pumpkins- the beginning is the end is the beginning</content> | |
| ... | |
| <author> | |
| <name>Garrettheparrot</name> | |
| <uri>http://gdata.youtube.com/feeds/api/users/garrettheparrot</uri> | |
| </author> | |
| <media:group> | |
| <media:title type="plain">Official Watchmen Trailer</media:title> | |
| <media:description type="plain">Title speaks for itself | |
| so people don't have to keep answerin | |
| the name of the song is: | |
| smashing pumpkins- the beginning is the end is the beginning</media:description> | |
| <media:keywords>2009, Comic, Men, Movie, Watch, Watches, Who</media:keywords> | |
| <yt:duration seconds="140"/> | |
| <media:category label="Film & Animation" scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Film</media:category> | |
| <media:content url="http://www.youtube.com/v/R3orQKBxiEg&f=gdata_user_favorites" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="140" yt:format="5"/> | |
| <media:content url="rtsp://rtsp2.youtube.com/CjALENy73wIaJwlIiHGgQCt6RxMYDSANFEgGUhRnZGF0YV91c2VyX2Zhdm9yaXRlcww=/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="140" yt:format="1"/> | |
| <media:content url="rtsp://rtsp2.youtube.com/CjALENy73wIaJwlIiHGgQCt6RxMYESARFEgGUhRnZGF0YV91c2VyX2Zhdm9yaXRlcww=/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="140" yt:format="6"/> | |
| <media:thumbnail url="http://i.ytimg.com/vi/R3orQKBxiEg/2.jpg" height="97" width="130" time="00:01:10"/> | |
| <media:thumbnail url="http://i.ytimg.com/vi/R3orQKBxiEg/1.jpg" height="97" width="130" time="00:00:35"/> | |
| <media:thumbnail url="http://i.ytimg.com/vi/R3orQKBxiEg/3.jpg" height="97" width="130" time="00:01:45"/> | |
| <media:thumbnail url="http://i.ytimg.com/vi/R3orQKBxiEg/0.jpg" height="240" width="320" time="00:01:10"/> | |
| <media:player url="http://www.youtube.com/watch?v=R3orQKBxiEg"/> | |
| </media:group> | |
| ... | |
| </entry> | |
| ... |
media という名前空間の下に結構データが入ってる。なのに、feedparserはちょっとしか取らない。
| >>> d = feedparser.parse("http://gdata.youtube.com/feeds/api/users/IanLewisInJapan/favorites") | |
| >>> e = d['entries'][0] | |
| >>> filter(lambda x: x.startswith('media_'), e.keys()) | |
| ['media_category', 'media_player', 'media_group', 'media_keywords', 'media_description', 'media_content', 'media_thumbnail'] | |
| >>> e['media_content'] | |
| u'' | |
| >>> e['media_thumbnail'] | |
| u'' | |
| >>> e['media_player'] | |
| u'' | |
| >>> e['media_description'] | |
| u'Last.fm/presents Yellow Magic Orchestra Interview at Royal Festival Hall in London.\nCheck out http://www.last.fm/Presents to find out about all of our other interviews or upcoming/past events.' | |
| >>> |
ビデオのURLはどこかにない。原因はfeedparserの拡張ネームスペース処理に入ってるけども、一言いうと、<media:content>というタグの属性は取れてない。こう見たら、どうやって、とれるかを調べたら、unknown_starttag()というメソッドの中にこのコードを見つけた。
feedparser.py
| ... | |
| # call special handler (if defined) or default handler | |
| methodname = '_start_' + prefix + suffix | |
| try: | |
| method = getattr(self, methodname) | |
| return method(attrsD) | |
| except AttributeError: | |
| return self.push(prefix + suffix, 1) | |
| ... |
じゃ、XMLを解析するときに、タグを見つけたら、unknown_starttag()という関数が実行されて、タグの名前に一致するメソッドがあれば、実行する処理やってる。それで、start_media_content()というメソッドがあれば実行してくれるわけだね。でも、どうやって、パーサークラスに付けるのか。feedparserは_StrictFeedParserというクラスを名前で使ってるから、自分が作ったクラスを_ScrictFeedParserと交換。
| feedparser._StrictFeedParser_old = feedparser._StrictFeedParser | |
| class DlifeFeedParser(feedparser._StrictFeedParser_old): | |
| | |
| def _start_media_content(self, attrsD): | |
| self.entries[-1]['media_content_attrs'] = copy.deepcopy(attrsD) | |
| feedparser._StrictFeedParser = DlifeFeedParser |
それで、またparse()を実行すると、
| >>> import feedparser | |
| >>> import copy | |
| >>> feedparser._StrictFeedParser_old = feedparser._StrictFeedParser | |
| >>> class DlifeFeedParser(feedparser._StrictFeedParser_old): | |
| ... | |
| ... def _start_media_content(self, attrsD): | |
| ... self.entries[-1]['media_content_attrs'] = copy.deepcopy(attrsD) | |
| ... return self.push('media_content', 1) | |
| ... | |
| >>> feedparser._StrictFeedParser = DlifeFeedParser | |
| >>> d = feedparser.parse("http://gdata.youtube.com/feeds/api/users/IanLewisInJapan/favorites") | |
| >>> filter(lambda x: x.startswith("media_"), d['entries'][0].keys()) | |
| ['media_category', 'media_player', 'media_group', 'media_content_attrs', 'media_keywords', 'media_description', 'media_content', 'media_thumbnail'] | |
| >>> d['entries'][0]['media_content_attrs'] | |
| ['medium', 'format', 'url', 'expression', 'duration', 'type', 'yt:format'] |
それで、media:contentの属性を取れた。 media:groupの下にcontentが複数ある場合もあるから、もうちょっとまとめないといけないけど、やり方が少し分かってきた。
Django サイトマップ フレームワーク
2008/11/18 @ 21:51Django sitemap frameworkを使うのが簡単過ぎる。下記のようにサイトマップクラスを作って、urls.pyに登録するだけ。サイトマップに載るURLを取るのに、サイトマップフレームワークが自分が作ったクラスのitems()を呼び出して、アイテムのget_absolute_url()を順番に呼び出す感じ。
models.py
| from django.db import models | |
| ... | |
| class Entry(models.Model): | |
| ... | |
| @permalink | |
| def get_absolute_url(self): | |
| return ... | |
| ... |
sitemap.py
| from django.contrib.sitemaps import Sitemap | |
| from mysite.blog.models import Entry | |
| from django.contrib.sitemaps import Sitemap | |
| from mysite.blog.models import Entry | |
| class BlogSitemap(Sitemap): | |
| priority = 0.5 | |
| def items(self): | |
| return Entry.objects.filter(is_draft=False) | |
| def lastmod(self, obj): | |
| return obj.pub_date | |
| # changefreq can be callable too | |
| def changefreq(self, obj): | |
| return "daily" if obj.comments_open() else "never" |
urls.py
| from mysite.blog.sitemap import BlogSitemap | |
| ... | |
| sitemaps = { | |
| "blog": BlogSitemap | |
| } | |
| (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) | |
| ... |
サイトマップインデクスも作れる。GoogleのURL 50,000件の制限があるため、サイトマップをPagenatorで自動的にURLを振り分けてくれる。urls.pyをこう変えるだけ
| from mysite.blog.sitemap import BlogSitemap | |
| ... | |
| sitemaps = { | |
| "blog": BlogSitemap | |
| } | |
| (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}), | |
| (r'^sitemap-(?P&amp;lt;section&amp;gt;.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps':sitemaps}) | |
| ... |
素敵だな。
後、サイトのコンテンツが変更された時、Googleが新しいコンテンツをインデクスするために ping_googleというmanage.pyコマンドが用意してある。
python manage.py ping_googleでも、他の検索エンジンが同じようなサービスがあるのに、ping_googleしかないので、上記のようなコマンドをいくつも作っていた。
Python温泉
2008/10/27 @ 16:31先週末、 Python温泉第4回に行ってきました。Python温泉は金土日なんですけど、前回と同じく土日、1泊にやってきました。今回は集中できたけど、前回より友達つくりや、会話ができてなかったという感覚だった。いろいろ寂しかった。でも、ビープラウドのid:tokibitoさんと、jQuery Internalsのdata()関数の実装や、feedparserや, Djangoの話をして、少し仲良くなった。ブログに俺について何も書いてくれなかったけど ^^;
Python温泉参加者のブログにまとめ(id:voluntasのまとめ, id:tokibitoのまとめ)が多いから、
まとめ:
- すぐ転職がばれた
- FriendFeedや、sweetcronみたいなlifestreamをdjangoで頑張って作った。(dlife)
- 温泉一人で入って寂しかった。
- id:tokibitoさんにjQuery Internalsのdata()関数を紹介
- いつも土日で来るから、自己紹介に出ないので、誰が誰か分からなくなっちゃう ( 俺のせい? )
- feedparserを分かりやすくすぐ使えるから感動。しかし、写真、ビデオの処理悩み中
- ブログを見てくれて、リンクする人が以外に少ない。( 何も書いてないからかな?^^; )
- 夕食の時間の抽選で、アクセンス・テクノロジーの増田さん(id:whosaysni)から、Python シャツを頂きました!!
- 駅から、一人で帰って寂しかった。
ウェブホスティング移動
2008/10/13 @ 13:02最近PythonやDjangoの開発をだんだんやっていてる僕が、このサイトを新しいウェブホスティングプロバイダーに移動することにした。 今は Haswebという安いプロバイダーなんですけど、Pythonにあまり相性がよくないので、Pythonアプリをサーバーに動かすのが難しすぎる。 簡単なPython cgiを対応してるだけで、コンパイルもできないから、Pure Pythonライブラリしかインストールできない。 なので、PylonsがおすすめしてるWebfactionに移動することにした。 Django,Pylonsに結構やさしくて、ライブラリをコンパイルできるから、使いやすいと思ってる。 それで、このサイトでいろいろなPythonウェブアプリをだんだん作っていきたいと思ってる。
Python Planet Japan 登場!!
2008/07/16 @ 03:53
今日、Python温泉に参加したメンバーたちや、Pythonが好きな皆様のブログポストを集めるPlanetホームページがあれば、いいなということで、作ってみました。
では、Planet Python Japanを登場します。
Pythonが好きな皆様へ、Python Planet Japanのメンバー募集中です。Pythonテーマなんですということで、ウェブ系や、IT系のボスとでも、おっけですけど、Pythonに関するポストを作るようにしましょう。応募の方は RSSフィードのURLを頂ければいいと思います。
よろしくです。
Javascript インタープリター
2008/07/08 @ 22:58JSON schema proposalの実装した典型的javascript validatorを試してみとうと思って、Pythonのインタラクティブシェルみたいなjavascriptインタラクティブ インタープリターを使いたいとさらに思って、以前に使ってたBobさんのMochikit インタープリターをまた取り出した。
このインタープリターは Mochikitのいじりにすごくよかったけど、一般的なjavascriptをいろいろ試してみたいから、一般urlからインポートできるように、簡単な関数を作った。importjs(url)でどこからでも、javascriptをインポートして、インタラクティブシェルで直接触るようになった。コードは以下のよう
| function (jssource) { | |
| importdiv = DIV(); | |
| importdiv.innerHTML = "Importing " + jssource + " <script type='text/javascript' src='" + jssource + "'></script>"; | |
| writeln(importdiv); | |
| } |
僕の修正したバージョンはこちら
結局、json schema validatorを試してみたら、うまく動かなかった。
| test = "blah"; | |
| schema={"type": "integer"}; | |
| JSONSchema.validate(test,schema).valid |
という風に入力しても、true が出た。orz
昨日、Google Developer Day 2008に行ってきました。キーノットスピーチは Google I/O と全く同じだと思いますが (プレゼンのスライドは翻訳したそのまま)、Googleのデベロッパー向けの将来的なブランが発表された。
Keynote
コンピュータの世界では、Accessability と Computing Power を同時にうまく使えるように、Client、Connectability、Cloud、三つの課題を目指すそうです。
Clientって言えば、ウェブブラウザです。リッチ アプリケーションを作れるために、ブラウザの機能を広げることを目指す。例えば、ブラウザでデータを保存し、アプリケーションを速くできるように、Google Gearsや、いろなプラグインを作成する予定だそうです。
Connectabilityというのは、インターネットのアクセスがよくできることです。これはソフトウエアだけで解決できない問題と思いますけど、皆さんが平等にアクセスできるように、ISP連携して、電波スタンダードをオープンにして、モバイルプラットフォーム (Android) を作成中です。
Cloudというのは、上に述べたComputing Powerです。Googleのサーバー、データセンターをアクセスし、コンピューターのパワーを使えるように appengine を作成して、改善していくらしい。
Appengine Hackathon
午後はAppengine Hackathonに参加しました。Developer Dayの前の連絡にて、日本語で行うと思ったら、全部英語になってしまいました。私はかまいませんが、他の日本人デベロッパーにはかわいそうな気持ち。さすがGoogleはイベントでワイヤレスアクセスを用意して、テクニカルな準備がいいけども、人間の関係の部分がちょっと不足だったと思った。
最初は Brett Slatkinがappengineの開発環境のプレゼンをしてくれて、それから、コディング、それから、最後に作ったアプリケーションを発表した。皆さんのデベロッパーから、結構いいアイデアが出てきました。最初の発表したのは、アメリカのGoogleのデベロッパーの一人。「僕が軽く作って全然よくないものですが。。」って言ったら、RSSフィードを読んで、それで、DBに入れ込んで、それから、コメントを投稿できる結構いいアプリケーションを発表した。Memcacheの対応もできたらしい。さすがGoogle エンジニアだと思った。
参加したデベロッパーからのアプリケーションは、つぶやきに写真をつけるアプリケーションや、ソーシャルブックマークアプリケーションや、djangoの翻訳ファイル作成アプリケーションが含まれた。
僕も一応、ローカルで動いたフォームメーカーのアプリケーションを発表したんだけど、すごく緊張してて、意味がなかなか分からなかった人もいったかもしれない。
宴会
Google Developer Dayの終了後、Appengineセッションに参加したデベロッパーと一緒に宴会。たくさんの人の名刺を貰って、僕自身の名刺がなくなってしまった。それでも、皆さんと皆ですごく楽しめて、大満足だった。家に戻ったら、a2cさんや、山下英孝さんや、松尾貴史さんや、Google Developer Day サポーター ページに載った人が多かったと気づいた。こんな素晴らしいデベロッパーなのに接することができたなんて本当によかったと思った。今度を本当に楽しみにしている。
モバイルサイトで Google Analytics
2008/05/29 @ 16:46会社のモバイルサイトで、Google Analyticsのトラッキングを導入した。Google Analyticsはブラウザーでいろな情報を集めてGoogleサーバに送るものなので、トラッキングをするには Javascriptが必要な部分がある。しかし、モバイルや、携帯は Javascriptに徐々に対応しようとしてると思うけど、現在はほとんど対応してない。なので、サーバ側でトラッキングするほうが標準。他の携帯向けのサイトもあるけども、そのサイトは大体、そのサイトのurlをお客さんに渡して、それで、お客さんがそのサイトに行ってトラッキングデータを記載して、それから、自分のサイトにリダイレクトするやつだから、嫌な部分がたくさんある。
一つははお客さんに自分のサイトじゃなくて、別のサイトの変なurlを渡すから、お客さんに嫌な気分をかける。二つ目はサイトに入る後にサイトの中にどんなページを見に行ってるかがトラッキングできない。もっとあるけど、結局はGoogle Analyticsにした。
具体的に、Peter van der Graffっていう人のブログから、PHPコードを写したけど、Peterさんの目的は僕の目的と違うらしい。彼は RSS とか、ファイルダウンロードのトラッキングをする前提で、コードを書きましたから、携帯機種や、セッションや、ユーザ変数を記載してなかった。なので、Peterさんのコードを以下のコードに書き直した。セッションを渡して、USER_AGENTというHTTPヘーダを送る携帯の機種とかもちゃんと転送するようにした。
| $var_utmac=MOBILE_GOOGLE_ANALYTICS_CODE; //enter the new urchin code | |
| $var_utmhn=WEB_DOMAIN; //enter your domain | |
| $var_utmn=rand(1000000000,9999999999);//random request number | |
| $var_cookie=$session; //cookie number | |
| $var_random=rand(1000000000,2147483647); //number under 2147483647 | |
| $var_today=time(); //today | |
| $var_referer=$_SERVER['HTTP_REFERER']; //referer url | |
| $var_uservar=$storeinfo['storeid']; //enter your own user defined variable | |
| $var_utmp=$_SERVER['REQUEST_URI']; // request uri | |
| $urchinUrl='http://www.google-analytics.com/__utm.gif?utmwv=1&utmn='.$var_utmn.'&utmsr=-&utmsc=-&utmul=-&utmje=0&utmfl=-&utmdt=-&utmhn='.$var_utmhn.'&utmr='.$var_referer.'&utmp='.$var_utmp.'&utmac='.$var_utmac.'&utmcc=__utma%3D'.$var_cookie.'.'.$var_random.'.'.$var_today.'.'.$var_today.'.'.$var_today.'.2%3B%2B__utmb%3D'.$var_cookie.'%3B%2B__utmc%3D'.$var_cookie.'%3B%2B__utmz%3D'.$var_cookie.'.'.$var_today.'.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B__utmv%3D'.$var_cookie.'.'.$var_uservar.'%3B'; | |
| $header = ''; | |
| //Set the language to that of the client so analytics can track it. | |
| if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { | |
| $header = 'Accept-language: '.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'\r\n'; | |
| } | |
| //Set the user agent to that of the client so analytics can track it. | |
| if (!empty($_SERVER['HTTP_USER_AGENT'])) { | |
| $header = 'User-Agent: '.$_SERVER['HTTP_USER_AGENT'].'\r\n'; | |
| } | |
| $opts = array( | |
| 'http'=>array( | |
| 'method'=>'GET', | |
| 'header'=>$header | |
| ) | |
| ); | |
| $handle = fopen($urchinUrl, 'r', false, stream_context_create($opts)); | |
| $test = fgets($handle); | |
| fclose($handle); |
あまり仕事に関係ないけど、僕の能力を広げるように、Googleサービスや、APIを勉強しようと思ってるので、一応、この間、Google Developer Day 2008に参加するように登録した。日本のGoogleオフィスに行くことは三回目になる。
今回、Google Appengineの「コード ラボ」(Hackathon)に参加する。AppengineはGoogleサーバで、大規模ウェブアプリケーションエンジン。Appengine APIで、アプリケーションを簡単に書ける上に、Googleの分散型のサーバや、ネットワーク線を使えるようになるから、もし、このアプリケーションが人気になるとしたら、パフォーマンス的な部分に心配しなくてもいいのは、大きいなポイント。
スケジュールを見ると結構長いけど、Developer Dayの前に、Hackathonの時間を効率的に使うように、Appengineを勉強し、サンプルアプリケーションを作ってみようと思う。人気になりそうなアイデアがあまりないけど、次世代のアプリケーションの作り方を理解するのにいいかもしれない。
OSC2008
2008/03/03 @ 10:453/1 (土)、OSPNの東京オープンソースカンファレンスに参加しました。2/29~3/1 行ったけど、僕は土曜日だけ参加したました。東京に来てから、多少のイベントに参加したことがあるけど、カンファレンスとして初めてでした。
僕が参加したセッションを省略します。他の解説はこちらと、こちら。
- 10:15~11:00 最近のRuby: 2008春
SumiTomohikoのブログはよりいい省略が書いてると思うが、Ruby 1.9の一番面白い機能はエンコーディング対応だと印象されました。pythonみたいにソースファイルの上にエンコーディング定義コメントを入れられる。# -*- coding: <encoding name> -*-
Ruby 1.9 Railsサポートはまだまだ出てきてるみたいです。
- 13:00~13:45 デスクトップ・デベロッパー・ミーティング
このミーティングはLinuxのデスクトップを仕事できるパソコンとして使うには、何が不足かとか、どこが使いにくいっていう話をしました。
- 14:00~14:45 KDE4.0が実現する新しいデスクトップについて
KDE4.0の機能、デザインとかの省略でした。KDE4.0が一応、Window, Mac, Linuxで動けるようになる。実際に使えるかわからないけど、どのOSでも動けることに向かってるみたい。そのために新しい抽象化ライブラリを開発しています。後、新しいローカルサーチエンジンを組み込めるみたい。
僕はGnomeのほうが好きと思うけど、技術的にKDEのほうができてるなと思っていました。
- 15:15~16:00 Debian Package ハンズオン
自分の手でDebian パッケージを作ろう!っていうセッションでした。ハンズオンセッションは、技術的な問題が発生するのは普通にあるけど、割とスムーズに終わりました。普通の開発をやってる僕が初めてDebianのパッケージを作りました。今から、ちょくちょくやると思ってる。
オープンソースカンファレンス
2008/03/02 @ 02:04新しいノートパソコン
2008/01/26 @ 16:14お正月の休みのちょっと前、新しいノートパソコンを買いました。在庫がなかったから、今まで、製造していたみたいで、買ってから、ほぼ一ヶ月かかりました けど、昨日、僕の家に届きました。買ったのは Lonovo Thinkpad (IBMのパソコンの営業部は中国にLenovo会社に買収されたから、現在、Lenovo Thinkpadと言います)。クリスマスセールで、3万円くらい安く買えて、さらに無料、1GBメモリが付きました (標準1GB, 全2GB)。スペック(仕様) は Intel Core Duo T7500、メモリ2GB、HD160GB. 届いたら、すぐ同じサイズのボックスが二つあるって気づいた。一つの荷物が十分だと思ったのに。何で二つあるんだろう? |
| あ、2番目のボックスは追加メモリが入ってる。なるほど。。。。ええ? 何でこんなちっちゃいものはこんなでかいボックスに入ってるの?!?!もったいない!!! この小さいボックスをこのままに送って貰ったらいいのに。追加メモリはパソコンに組み込んでないから、僕は実装しないわけにはいけなくなった。ま、簡単に入れられるから、いいや。ボックスも使いそうだし。 |
じゃ、早速、パソコンをボートしました。あら、、Windows Vistaは質問をちょくちょくしてから、Windows Vistaの上にいろいろな重いソフトが搭載されてたから、先ずソフトをいっぱい消しました。Norton Securityとか。あら、僕の彼女はこのブログ読んでるよね ^^; (彼女はNorton Security電話対応やってる)。でも、それでも、Vistaはハードディスクを常に使ってるっと気づきました。ハードディスクのインディケータが眩しいくらい光ってる。何で!?! って思ったら、サーチ (検索)のサービスがファイルのインデックスを作ってたと解った。調べたら、別のサービスもハードディスクをちょくちょく使うから、(Super Fetch, Windows Search) コントロールパネルで、無効にしました。ふ~、ハードディスクのインディケータがやっと暗くなった。 |
次は、リナックスをインストール。X61は、小さくて、CDドライブないから、外部ドライブ使わないと、OSインストールするのは大変。だから、今日、僕の会社の社長が外部CDドライブを貸してくれて、Ubuntuをインストールしました。インストールはスムーズにできたし、Vistaより、速い。やっぱりリナックスがインストールされて、安心だね。![]()
新しいiGoogleテーマ
2008/01/18 @ 17:18数日前に、新しいiGoogleテーマはリーリスされました。テーマの新しいAPIもリーリスしたそうです。このAPIで誰でもiGoogleのテーマを作ることができるって言ってるだけど、iGoogleに自分でアップできるわけじゃないみたい。テストインタフェースでテストし、Googleに送ってGoogleの編集者が確認してから、リーリスしてくれる過程になってるらしい。もし、コードをうまく書いてなく、デザインもあまりよくない場合、拒否するかもしれない。 自分のテーマを自由に使えないから、ちょっと面倒くさいと思うけど、僕はiGoogleのテーマを作りたいわけじゃないから、いいや。
| 新しいテーマの中で、僕が一番好きなのは John Maedaさんの"Simple is Complex"っていうテーマ. MIT Media Labで働いてる学者で、結構有名なアーティスト. Ted という学会の講義を見たことがあって、彼のスタイルが好きだった。多くの芸術品はちょっと常套表現があるけどね。 |
![]() | Yves Behar の "Earth-light" っていうテーマも好きだった。太陽の現在の位置は表示されるテーマだ。でも、僕が使ったときに太陽に位置が違った。日本にいる僕から見ると、-9時間か、+15時間くらいの違いがある。+15時間は日本と、作者の住んでる、Googleの本社にあるカルフォルニアの時差なんて怪しい。違うタイムゾーンにテストしてなかったかい? |
Python Unconference Tokyo 1
2007/12/13 @ 11:07
昨日、Python Unconference Tokyo 1 というPython勉強会に参加しました。今回は初めてでしたけど、Triax という会社の開発責任者がPylonsというウェブフレームワークについて提出してくださいました。PylonsはPythonで書かれてるWSGIに対応するウェブフレームワークです。Pylonsでいろいろなライブラリを連携して、SQLAlchemyや SQLObject、どのデータベースエンジンを使うにかからず、開発をスムーズにできます。
実は、僕は今年の前半にPylonsを試してみた。複数のデータベースを同時に接続するのが難しくて、会社の人の中Pythonが詳しい人は僕しかいなくて、辞めましたけど、WSGI仕様がすごく面白くて、Pylonsのメリットがよくわかった。
勉強会の後、近い居酒屋で、宴会に参加しました。皆さんと飲食しながら、Pythonについて楽しく話すことができました。できれば、また今度、行きたいと思っています。
PyJUGの皆さん、お疲れ様でした。
携帯プログラミングの注意すること
2007/11/08 @ 19:16皆さんはご存知だろうが、携帯はパソコンの機能の部分集合に対応しています。メーカーや、プロバイダによって、対応する部分は変わりますけども、多くの携帯を対応するように注意しないといけないことです。携帯サイトを開発する私は注意するのをよく忘れる。ですから、今までの経験に従って、注意する部分を記録したいと思っています。
第一: エンコーディングについて
最近でた携帯ブラウザはUTF-8や、ShiftJISや、EUCJPや、ISO-2022-JPや、日本語の多くのエンコディングを対応するけども、ShiftJISしか対応していない携帯もあります。古い携帯はShiftJISだけを対応するものはあるけど、EUCJPや、ISO-2022-JPだけを対応する携帯はほとんどないと言います。古い携帯上で、UTF-8のサイトに行けば、文字化けになります。ですから、古い携帯も新しい携帯も対応するには、ShiftJISじゃないHTMLを出すことを注意するべし。
HTMLではShiftJISしかサポートしていない携帯は多いけども、メールの方はISO-2022-JPを使うべし。
第二:テーブルについて
HTMLのテーブルを対応しな携帯もありますので、テーブルを使わないようにするべし。<br>や、<center>や、もっと基本的なレイアウトを作ったほうが良い。
第三:Cookie(クッキー)について
ログインや、認証するには、クッキーはよく使われてるけども、携帯ブラウザ設定によって クッキーを許可してない場合もよくあります。一般的なユーザーはクッキーに詳しくないので、ちゃんと説明を書いて、クッキーを許可するかどうかをチェックするべし。
DOCOMO(FOMA)のI-Modeの携帯は大体クッキーを対応していません。従って、DOCOMOの携帯を対応するには、クッキーが許可しなくても、作動できる認証方法を作るべし。基本的には、二つのオプションがある。1.ログインセッションをURLに乗せる。2.携帯製造番号を使う。
ログインセッションをURLに伸せばクッキーがなくても、別のサイトに行かない限り、セッションデータを使えます。一方、別のサイトに行ったり、ブラウザを終了したり、すれば、セッションデータが無くなります。
製造番号の送信することを対応してない携帯がありますし、ユーザーさんに説明しないといけない部分もありますし、製造番号はクッキーと大体同じように問題が起こると思います。
第四: 画像について
PNGをサポートしない携帯もあります。JPG、GIF, BMPを使うべし。
Google マップ交通情報が登場!!
2007/08/09 @ 13:00
いよいよ、Googleマップで路線情報が登場! こと機能を結構待ってましたけど、やっと来ました!
元々、Google Transitがありましたけど、交通データが間違えたりしたことあるから(僕は電車に間に合わない結果)、Yahoo路線情報のほうがぜんぜんよかったけど、Googleが交通データを改善したみたいで、僕が気に入るGoogleを使うため、Yahooをやっと辞められる (ソフトバンク携帯で、Yahoo乗り換えのほうが便利かもしれないけど)。 飛行機も登場だし、新幹線も登場だし、旅行とかと計画にすごく便利になってる。
後、検索条件を変更する部分で、交通時間とか、飛行機を使うかどうかとか、を設定できます。Yahooと同じ風に、出発時間か、到着時間の条件を選ばれるし、すごく便利と思う。しかも、Googleは仕事の後よく酔っ払うサラリーマンにいい機能が付いています。出発時間と到着時間を選ばれる上に、最後の電車を検索できます。
いつも困るサラリーマンにすごく助かる機能かも。![]()
和暦は面倒くさい
2007/06/29 @ 11:59今、ソフト会社で働いていて、最近、和暦の問題が出てきました。和暦の年は天皇の時代の名前と、天皇が皇位を継承した年から、何年が立ったかから成っている。例えば、今年は「平成19年」。
今の仕事のプロジェクトでは、顧客の情報を入力する部分があって、顧客の誕生日を含めている。それで、和暦の年を入力できるように作っているから、和暦の細かい部分まで、気になっている。パソコン自体の時計の構成は絶対西暦だから、和暦のデータを西暦データに変換したり、西暦データを和暦データに変換したり、しないといけません。
和暦についてもうちょっと深く考えると、和暦の時代は天皇が死亡して、新しい皇位を継承した年に変わるから、その年は以前の天皇の時代に、次の天皇の時代にもある。例えば、昭和64年 = 平成1年。でも、平成は皇位を継承した日から始まるけど、昭和時代は天皇の死亡した日に終わらない。昭和時代はその年の12月31日に終了だ。つまり、さっきにに述べたことはちゃんと正確じゃない。昭和64年 = 平成1年だけど、明仁天皇が継承した日から、12月31日までの間だけだ。ようするに、平成1年1月8日に生まれた人は平成1年に生まれたけど、平成1年1月7日に生まれた人は平成1年に生まれたと正確に言えません。その人の誕生日は昭和64年1月7日に生まれたと言います。逆にその1月8日に生まれた人は平成1年1月8日に生まれたか、昭和64年1月8日に生まれたか、両方正しく言える。
まあ、和暦を対応するソフトは普段、そんなにうまくいかないと思うけど、和暦の日付を処理するのは確かに面倒。
パソコン故障気味
2007/06/12 @ 00:27最近、俺のパソコンはおかしくなった。なけかというと、2週間の間に1回、2回のクラッシュで始まったんだけど、先週末から、2時間毎に、僕のUbuntuシステムがクラッシュすることになった。この問題が広がった以降、立ち上げてから、大丈夫ようにするけど、数時間後、デスクトップで使ってるプロクラムは次々にクラッシュしっちゃって、画面がフリーズするんだ。
何でだろう?って思って、すぐ「メモリが壊れてる」、「CPUが過熱してる」っていう思いが出てくる。それで、memtestっていうメモリの調子を確認するプログラムで夜中ずっと実行したんだ。でも、エラーが1個も出てこなかった。
そして、今日、prime95っていうCPUをテストするプログラムを2時間にやったんだけど、合格結果。
残ってるのは、ハードディスク、ソフト。。。くらいです。
俺はパソコン人間なんで、何で俺のパソコンは調子悪いのかがわからないなんて面倒。まだ調査中。
日本の携帯でGmail
2006/12/15 @ 01:17![]() |
2年間にGmailを自分のメールとして使ってた。でも、日本に来た前、インターネットを見える携帯を持ってなかった。だから、携帯で、Gmailをチェックできることで、喜んだ。
しかし、自分の携帯で、まったく動かない。実は、Googleのサービスは普通の携帯検索しか全部動かない。Gmailも、Google リーダーも、ログインの問題で、携帯のブラウザーのCookieっていう機能は有効されてないっていうエラーが出てくる。ブラウザーのCookieは有効されてるから、原因は自分に不思議だ。ミクシィに携帯でログインするのは絶対問題ない。
この問題の可能な解決をインターネットで探してて、サイトを少なく見つけたんだけど、何も解決されてない。このサイトはログインが失敗する可能性があるので、もう一度ログインしないといけない時があるっと説明してるけど、自分はもう一回ログインすると同じ結果になる。
使えない原因はなんなんだろうな~ Googleはまだ日本の携帯をサポートしてないし、たぶん、こんな問題で、日本人はYahooのほうを使うんだろうね。
L と R
2006/08/06 @ 10:05最近ってさ、英語の単語で、Lのかわいりに、Rって書いちゃうようになった。Rが正確って知ってるのに、Frashcardとかって書いちゃう。なんだああああ! 何の習慣だ!!みたいなー。 英語は母語なのにさーー
でも、
Dvorakのキーボードを使ってる。で、Dvorakのキーボードでは、LはRの隣にあるわけかな。






