<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>エスキュービズム ラボ Blog</title>
	<atom:link href="http://labs.s-cubism.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.s-cubism.com/blog</link>
	<description>エンジニアの活動報告などなど</description>
	<pubDate>Sun, 29 Aug 2010 08:41:13 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>ja</language>
			<item>
		<title>screenとは？【初心者入門編】</title>
		<link>http://labs.s-cubism.com/blog/2010/08/28/203/</link>
		<comments>http://labs.s-cubism.com/blog/2010/08/28/203/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 07:13:25 +0000</pubDate>
		<dc:creator>ishii</dc:creator>
		
		<category><![CDATA[アプリ]]></category>

		<category><![CDATA[サーバ構築]]></category>

		<category><![CDATA[command]]></category>

		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=203</guid>
		<description><![CDATA[
screen とは、1つのターミナル内に、
複数の擬似ウィンドウを開くことが出来るようにするソフトウェアです。
歴史ある技術ですので、ほぼどのLinux環境にも使えて、動作も安定、
設定・操作も手軽で済むため、多くのエンジニアに重宝されています。
ターミナル用のソフトですが、サーバへインストールするものです。
今更の内容ですが、復習も兼ねてまとめてみることにしました。
ちなみに、タイトルに「初心者入門編」と書いていますが、
少なくとも自分は2年間、この内容だけで便利に使えています。
（まー、自分はかなり開発環境に無神経な方ですが）


　
screenの特徴・長所


擬似ウィンドウ（スクリーン）を開いて、複数SSHセッションを平行して操作できる。
サーバへインストールすれば、どのターミナルからも使える。
インストール・設定は超簡単。
ターミナルソフトを落としても、SSHセッションを維持してくれる機能がある。


　
インストール

例えば、CentOS の場合は

# yum install screen

・・・だけ！楽っ！　ヽ(´ー`)ﾉ
　
他の環境でも同じようなもので、
普通のLinux環境なら、パッケージ管理ソフトで簡単に入ります。
また、ソースを取得して、ホームディレクトリ以下へインストールしても使えるので、
共有環境でも安心して力を発揮できます。
設定については、まずは不要です。
そのままお使いいただけます。

　
screenの基本操作

1. screenの開始

$ screen

これで、スクリーンを1つ開いて、新しいSSHセッションが立ち上がりました。
再度、screen を打つともうひとつ開き、exit でひとつのスクリーンを閉じます。
これらの開いたスクリーンそれぞれで、SSHを平行操作することが出来ます。
2. screenコマンドを使う
スクリーン上では、通常のSSHセッションと同じ操作を行えます。
ただ、スクリーンの切り替えなどの操作を行う場合のために、特別なコマンドが用意されています。
デフォルトだと、Ctrl + A で、このキーを押した後に特定のキーを押すことで、
各種操作を行うことができます。
以下は代表的なコマンドです。

c = 画面を増やす（screenと打ったときと同じ）
w = 画面一覧を表示
n = 次の画面へ切替
p = 前の画面へ切替
K = ひとつのスクリーンを強制終了
l = 画面再描画
d = デタッチ


　
.screenrc の設定

screenの設定ファイルは .screenrc です。
一旦スクリーン状態を終了して、ホームディレクトリ以下に以下の
.screenrc ファイルを作ってみてください。

# screenコマンドモードに入るキーの変更
escape ^Zz

# ステータスラインの表示
hardstatus alwayslastline "[%02c] %0`%-w%{=b bw}%n %t%{-}%+w %= %?%{=brw}%2`%{-} %?%1`&#8221;

これで再度スクリーン状態になると、先の Ctrl + A が Ctrl + Z に変わっています。
また、ターミナルの下に、画面一覧と現在の画面を示す
ステータスラインが表示されているはずです。
他にも多くの設定がありますが、とりあえずはこれだけで充分だと思います。

　
セッション維持機能

全てのスクリーンを exit で閉じると終了しますが、デタッチ（screenコマンドキー + d）を行うと、
ターミナルを落としても、スクリーン上のSSHセッションを立ち上げっぱなしにすることができます。
また、普通にターミナルソフトを閉じても、セッションが残っています。
用途としては、
突然の停電やブレーカー落ちの時も作業状態がそのまま残っているので安心、とか、
会社でやり残した作業を家で再開するときに楽、とか、
バッチスクリプトを掛けっぱなしにして寝る時も楽、とかです。
セッションの復活や一覧の操作は以下です。

$ [...]]]></description>
			<content:encoded><![CDATA[<div>
<strong>screen</strong> とは、1つのターミナル内に、<br />
複数の擬似ウィンドウを開くことが出来るようにするソフトウェアです。</p>
<p>歴史ある技術ですので、ほぼどのLinux環境にも使えて、動作も安定、<br />
設定・操作も手軽で済むため、多くのエンジニアに重宝されています。<br />
ターミナル用のソフトですが、サーバへインストールするものです。</p>
<p>今更の内容ですが、復習も兼ねてまとめてみることにしました。</p>
<p>ちなみに、タイトルに「初心者入門編」と書いていますが、<br />
少なくとも自分は2年間、この内容だけで便利に使えています。<br />
（まー、自分はかなり開発環境に無神経な方ですが）
</p></div>
<p><span id="more-203"></span></p>
<p>　</p>
<h3 style="font-weight:bold;">screenの特徴・長所</h3>
<div>
<ul>
<li>擬似ウィンドウ（スクリーン）を開いて、複数SSHセッションを平行して操作できる。</li>
<li>サーバへインストールすれば、どのターミナルからも使える。</li>
<li>インストール・設定は超簡単。</li>
<li>ターミナルソフトを落としても、SSHセッションを維持してくれる機能がある。</li>
</ul>
</div>
<p>　</p>
<h3 style="font-weight:bold;">インストール</h3>
<div>
例えば、CentOS の場合は</p>
<pre>
# yum install screen
</pre>
<p>・・・だけ！楽っ！　ヽ(´ー`)ﾉ</p>
<p>　<br />
他の環境でも同じようなもので、<br />
普通のLinux環境なら、パッケージ管理ソフトで簡単に入ります。</p>
<p>また、ソースを取得して、ホームディレクトリ以下へインストールしても使えるので、<br />
共有環境でも安心して力を発揮できます。</p>
<p>設定については、まずは<strong>不要</strong>です。<br />
そのままお使いいただけます。
</div>
<p>　</p>
<h3 style="font-weight:bold;">screenの基本操作</h3>
<div>
<strong>1. screenの開始</strong></p>
<pre>
$ screen
</pre>
<p>これで、スクリーンを1つ開いて、新しいSSHセッションが立ち上がりました。<br />
再度、screen を打つともうひとつ開き、exit でひとつのスクリーンを閉じます。<br />
これらの開いたスクリーンそれぞれで、SSHを平行操作することが出来ます。</p>
<p><strong>2. screenコマンドを使う</strong><br />
スクリーン上では、通常のSSHセッションと同じ操作を行えます。<br />
ただ、スクリーンの切り替えなどの操作を行う場合のために、特別なコマンドが用意されています。<br />
デフォルトだと、<strong>Ctrl + A</strong> で、このキーを押した後に特定のキーを押すことで、<br />
各種操作を行うことができます。</p>
<p>以下は代表的なコマンドです。</p>
<pre>
c = 画面を増やす（screenと打ったときと同じ）
w = 画面一覧を表示
n = 次の画面へ切替
p = 前の画面へ切替
K = ひとつのスクリーンを強制終了
l = 画面再描画
d = デタッチ
</pre>
</div>
<p>　</p>
<h3 style="font-weight:bold;">.screenrc の設定</h3>
<div>
screenの設定ファイルは <strong>.screenrc</strong> です。<br />
一旦スクリーン状態を終了して、ホームディレクトリ以下に以下の<br />
.screenrc ファイルを作ってみてください。</p>
<pre>
# screenコマンドモードに入るキーの変更
escape ^Zz

# ステータスラインの表示
hardstatus alwayslastline "[%02c] %0`%-w%{=b bw}%n %t%{-}%+w %= %?%{=brw}%2`%{-} %?%1`&#8221;
</pre>
<p>これで再度スクリーン状態になると、先の Ctrl + A が <strong>Ctrl + Z</strong> に変わっています。<br />
また、ターミナルの下に、画面一覧と現在の画面を示す<br />
ステータスラインが表示されているはずです。<br />
他にも多くの設定がありますが、とりあえずはこれだけで充分だと思います。
</div>
<p>　</p>
<h3 style="font-weight:bold;">セッション維持機能</h3>
<div>
全てのスクリーンを exit で閉じると終了しますが、デタッチ（<strong>screenコマンドキー + d</strong>）を行うと、<br />
ターミナルを落としても、スクリーン上のSSHセッションを立ち上げっぱなしにすることができます。<br />
また、普通にターミナルソフトを閉じても、セッションが残っています。</p>
<p>用途としては、<br />
突然の停電やブレーカー落ちの時も作業状態がそのまま残っているので安心、とか、<br />
会社でやり残した作業を家で再開するときに楽、とか、<br />
バッチスクリプトを掛けっぱなしにして寝る時も楽、とかです。</p>
<p>セッションの復活や一覧の操作は以下です。</p>
<pre>
$ screen -R
　→セッションの復活
$ screen -list
　→残っているセッションの一覧
$ screen -x
　→セッションの復活、その2
　　すみません、詳細不明ですが、ルータが再起動してIPが変わった後などは、
　　-R だと復活できないので、このコマンドで復活しています。
　　復活しても、しばらく後に繋がらなくなるので、一旦作業状況を整理して終了した方がいいです。
</pre>
</div>
<p>　</p>
<h3 style="font-weight:bold;">以上</h3>
<div>
今更感のある内容ですが、ローカルPCがメインの開発環境の方などは、<br />
あまりご存知ない内容だと感じたので、書いてみました。</p>
<p>なんで、そんなことが出来るんだろう？という点まで考える人は若干不安だと思いますが、<br />
とにかく、<strong>敷居は低い</strong>し、経験上<strong>動作も安定</strong>しているので、<br />
とりあえず使ってみてもいいのではないでしょうか？</p>
<p>　<br />
　<br />
　<br />
・・・ちなみに、<br />
「Poderosaとか使えばいいんじゃね？」という質問に対しては、<br />
「まぁ、そうなんだけどね」という回答に・・・否定はできない・・・。（←台無し）
</div>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/08/28/203/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google App EngineでTwitterを活用する</title>
		<link>http://labs.s-cubism.com/blog/2010/08/24/202/</link>
		<comments>http://labs.s-cubism.com/blog/2010/08/24/202/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 13:11:55 +0000</pubDate>
		<dc:creator>hosoda</dc:creator>
		
		<category><![CDATA[アプリ]]></category>

		<category><![CDATA[ビジネス]]></category>

		<category><![CDATA[告知]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=202</guid>
		<description><![CDATA[今回は、Google App Engine (GAE) でTwitter上のデータを集約するRSSリーダーのようなアプリを作りたいと思います。
解説する内容は以下になります。

Google App Engine (GAE) の利用方法
Twitter API の利用方法
ツイートの集積と簡単な未読・既読処理

&#160;

１． Google App Engine (GAE) の利用方法
&#160;
GAEの利用
GAEはGoogleが提供するクラウドインフラです。 制約はありますが、ウェブサービスを作ることができます。URL フェッチやクーロンタスク も可能です。
なんといっても、無料で始めることができます。規模の原理が効いているので、通常のサーバーよりもコストが低くなります。
GAEを始めるには、http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.htmlのチュートリアルを一通りこなすのがよいでしょう。
&#160;
web2pyの利用
GAEをより手軽に利用するために，ここではweb2pyフレームワークを利用します。
web2pyの特徴はGAE上&#8221;でも&#8221;動くことです。GAEのバックエンドは特殊な分散ストレージになっており、通常のデータベースとは異なります。JOIN句や、特異性の低い条件式、集計関数も利用できず、ソートや範囲選択にも制限があります。これらの制約を守る必要がありますが、web2pyを利用すると、同じコードで通常のサーバーと同時に、GAE上でも動かすことができます。
wab2pyはもともと大学での教育用として開発されていることもあり、習得が容易です。http://www.scribd.com/doc/12288297/Web2py-vs-Othersや、http://web2py.com/examples/default/examplesにある例題をみれば、簡潔に記述できるのが分かるかと思います。
セットアップは、http://www.web2py.com/examples/default/downloadから、ソースコードをダウンロードするだけです。
開発サーバーの起動は、ソースディレクトリに行き，&#8221;python web2py.py -a password&#8221; とコマンドを打ちます。 http://127.0.0.1：8000を開くと、最初はデモアプリケーションが表示されます。/admin/default/indexにアクセスすると管理画面が表示されます(管理画面はローカルホストからか、SSLを通してのみしか閲覧できません)。
自分のアプリケーションを作るには、&#8221;python web2py.py -S myapp&#8221;とコマンドを打ちます。/myapp/default/indexにアクセスすると、最初はデモアプリケーションと同様の画面が表示されます。
&#160;
GAEへのデプロイ
まずは、GAEの開発サーバー上で、web2pyのアプリケーションを動かしてみましょう。GAEのSDKのディレクトリに行き、&#8221;python dev_appserver.py /path/to/web2py&#8221;とコマンドを打ちます。ここで、一通り、動作確認を行ないます。このとき、利用したデータベース・クエリの中で、GAE上で必要なインデックスの定義は、index.yamlファイルに自動的に書き込まれます。
web2pyのソースディレクトリのトップには、app.yamlというファイルがあります。ここに、https://appengine.google.com/で登録したアプリケーションのIDを設定します。また、余計なファイルやディレクトリがある場合は、このファイルにて、あらかじめ指定しておきます。
最後に、&#8221;python appcfg.py update /path/to/web2py&#8221;とコマンドを打って、web2pyのソースコードをGAEにアップします。
http://myappid.appspot.com/myapp/&#8230;にアクセスすると、開発サーバーと同様の画面が表示されます。なお、本番サーバでのエラーは、ダッシュボードのログ(https://appengine.google.com/logs?&#38;app_id=myappid)に記録されます。

２． Twitter APIの利用方法
&#160;
Twitter APIの利用制限
Twitter APIには、匿名リクエストがIP 毎に1時間に150 回までという制約があります。GAE上でTwitter APIを叩くことはできますが、GAEではIP を共有利用しているので、すぐにその制約にひっかかてしまいます。
そこで、OAuth認証というものを利用します。これにより、IP制約がなくなります。また、利用数は1 時間に350回までになり、Twitterにログインした状態と同じことができるようになります。
&#160;
OAuth認証の設定
&#160;
１．Twitterにてアプリケーションの登録 
OAuth認証を利用可能にするために、APIを利用するアプリケーションの登録をまず行ないます。登録は、https://twitter.com/appsから行ないます(参考)。幾つかの設定項目がありますが、基本的には、適当なアプリ名を登録するだけです (なお、ここでは説明のため，Application Typeは、&#8221;認証後、指定URLにリダイレクトしない&#8221;Clientに設定しておきます)。
登録後、Cunsumer Token (&#8221;consumer key&#8221;と&#8221;consumer secret&#8221;というパスワード文字列)が取得できるので、これをメモってください。
&#160;
２．Access Tokenの取得
OAuth認証でAPIを叩くときは、ユーザー・アカウント毎に&#8221;Access Token&#8221;という鍵が必要です。
自分のアカウントだけを利用する場合は、http://dev.twitter.com/apps/から自分のアプリケーションを選択し、&#8221;My Access Token&#8221;というリンクを開くと、Access Tokenを取得することができます。
それ以外の場合は、少し複雑な手順を踏みます。ここでは、Twitter APIのPython ラッパーであるtweepyを利用して説明します。

手順１　Consumer [...]]]></description>
			<content:encoded><![CDATA[<p>今回は、Google App Engine (GAE) でTwitter上のデータを集約するRSSリーダーのようなアプリを作りたいと思います。</p>
<p>解説する内容は以下になります。</p>
<ol>
<li>Google App Engine (GAE) の利用方法</li>
<li>Twitter API の利用方法</li>
<li>ツイートの集積と簡単な未読・既読処理</li>
</ol>
<p>&nbsp;<br />
<span id="more-202"></span></p>
<h2><strong>１． Google App Engine (GAE) の利用方法</strong></h2>
<p>&nbsp;<br />
<strong>GAEの利用</strong></p>
<p>GAEはGoogleが提供するクラウドインフラです。 制約はありますが、ウェブサービスを作ることができます。URL フェッチやクーロンタスク も可能です。</p>
<p>なんといっても、無料で始めることができます。規模の原理が効いているので、通常のサーバーよりもコストが低くなります。</p>
<p>GAEを始めるには、<a href="http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html">http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html</a>のチュートリアルを一通りこなすのがよいでしょう。<br />
&nbsp;<br />
<strong>web2pyの利用</strong></p>
<p>GAEをより手軽に利用するために，ここでは<a href="http://www.web2py.com/">web2pyフレームワーク</a>を利用します。</p>
<p>web2pyの特徴はGAE上&#8221;でも&#8221;動くことです。GAEのバックエンドは特殊な分散ストレージになっており、通常のデータベースとは異なります。JOIN句や、特異性の低い条件式、集計関数も利用できず、ソートや範囲選択にも制限があります。これらの制約を守る必要がありますが、web2pyを利用すると、同じコードで通常のサーバーと同時に、GAE上でも動かすことができます。</p>
<p>wab2pyはもともと大学での教育用として開発されていることもあり、習得が容易です。<a href="http://www.scribd.com/doc/12288297/Web2py-vs-Others">http://www.scribd.com/doc/12288297/Web2py-vs-Others</a>や、<a href="http://web2py.com/examples/default/examples">http://web2py.com/examples/default/examples</a>にある例題をみれば、簡潔に記述できるのが分かるかと思います。</p>
<p>セットアップは、<a href="http://www.web2py.com/examples/default/download">http://www.web2py.com/examples/default/download</a>から、ソースコードをダウンロードするだけです。</p>
<p>開発サーバーの起動は、ソースディレクトリに行き，&#8221;python web2py.py -a password&#8221; とコマンドを打ちます。 http://127.0.0.1：8000を開くと、最初はデモアプリケーションが表示されます。/admin/default/indexにアクセスすると管理画面が表示されます(管理画面はローカルホストからか、SSLを通してのみしか閲覧できません)。</p>
<p>自分のアプリケーションを作るには、&#8221;python web2py.py -S myapp&#8221;とコマンドを打ちます。/myapp/default/indexにアクセスすると、最初はデモアプリケーションと同様の画面が表示されます。<br />
&nbsp;<br />
<strong>GAEへのデプロイ</strong></p>
<p>まずは、GAEの開発サーバー上で、web2pyのアプリケーションを動かしてみましょう。GAEのSDKのディレクトリに行き、&#8221;python dev_appserver.py /path/to/web2py&#8221;とコマンドを打ちます。ここで、一通り、動作確認を行ないます。このとき、利用したデータベース・クエリの中で、GAE上で必要なインデックスの定義は、index.yamlファイルに自動的に書き込まれます。</p>
<p>web2pyのソースディレクトリのトップには、app.yamlというファイルがあります。ここに、<a href="https://appengine.google.com/">https://appengine.google.com/</a>で登録したアプリケーションのIDを設定します。また、余計なファイルやディレクトリがある場合は、このファイルにて、あらかじめ指定しておきます。</p>
<p>最後に、&#8221;python appcfg.py update /path/to/web2py&#8221;とコマンドを打って、web2pyのソースコードをGAEにアップします。</p>
<p>http://myappid.appspot.com/myapp/&#8230;にアクセスすると、開発サーバーと同様の画面が表示されます。なお、本番サーバでのエラーは、ダッシュボードのログ(https://appengine.google.com/logs?&amp;app_id=myappid)に記録されます。<br />
<br/></p>
<h2><strong>２． Twitter APIの利用方法</strong></h2>
<p>&nbsp;<br />
<strong>Twitter APIの利用制限</strong></p>
<p><a href="http://dev.twitter.com/doc">Twitter API</a>には、匿名リクエストがIP 毎に1時間に150 回までという制約があります。GAE上でTwitter APIを叩くことはできますが、GAEではIP を共有利用しているので、すぐにその制約にひっかかてしまいます。</p>
<p>そこで、<a href="http://ja.wikipedia.org/wiki/OAuth">OAuth認証</a>というものを利用します。これにより、IP制約がなくなります。また、利用数は1 時間に350回までになり、Twitterにログインした状態と同じことができるようになります。<br />
&nbsp;<br />
<strong>OAuth認証の設定</strong><br />
&nbsp;<br />
<em>１．Twitterにてアプリケーションの登録 </em></p>
<p>OAuth認証を利用可能にするために、APIを利用するアプリケーションの登録をまず行ないます。登録は、<a href="https://twitter.com/apps">https://twitter.com/apps</a>から行ないます(<a href="http://www.msng.info/archives/2010/01/twitter_api_oauth_with_php.php">参考</a>)。幾つかの設定項目がありますが、基本的には、適当なアプリ名を登録するだけです (なお、ここでは説明のため，Application Typeは、&#8221;認証後、指定URLにリダイレクトしない&#8221;Clientに設定しておきます)。</p>
<p>登録後、Cunsumer Token (&#8221;consumer key&#8221;と&#8221;consumer secret&#8221;というパスワード文字列)が取得できるので、これをメモってください。<br />
&nbsp;<br />
<em>２．Access Tokenの取得</em></p>
<p>OAuth認証でAPIを叩くときは、ユーザー・アカウント毎に&#8221;Access Token&#8221;という鍵が必要です。</p>
<p>自分のアカウントだけを利用する場合は、http://dev.twitter.com/apps/から自分のアプリケーションを選択し、&#8221;My Access Token&#8221;というリンクを開くと、Access Tokenを取得することができます。</p>
<p>それ以外の場合は、少し複雑な手順を踏みます。ここでは、Twitter APIのPython ラッパーである<a href="http://joshthecoder.github.com/tweepy/docs/index.html">tweepy</a>を利用して説明します。</p>
<blockquote><p>
<strong>手順１　Consumer Token　から auth オブジェクトを作成 ：</strong><br />
import tweepy<br />
auth = tweepy.OAuthHandler(consumer_key, consumer_secret )</p>
<p><strong><br />
手順2　Redirect URL と Request Token を取得 ：</strong><br />
redirect_url = auth.get_authorization_url()<br />
request_key = auth.request_token.key<br />
request_secret = auth.request_token.secret<br />
→ これらの出力をメモ<br />
&nbsp;</p>
<p><strong>手順３　取得した Redirect URL を （twitter にログインした状態で）開く ：</strong><br />
→ アクセス権を承認する<br />
→ 7 桁の数字が表示されるので、 これもメモ<br />
（Twitterのアプリケーションの設定で&#8221;Application Type&#8221;をBrowserにすると、<br />
承認後、Callbak URL にリダイレクトされる）<br />
&nbsp;</p>
<p><strong>手順4　Access Token の取得 ：</strong><br />
auth.set_request_token(request_key, request_secret )<br />
auth.get_access_token(verifier_digits ) # verifier_digitsは取得した７桁の数字<br />
access_key = auth.access_token.key<br />
access_secret = auth.access_token.secret<br />
→ これらの出力をメモ
</p></blockquote>
<p>&nbsp;<br />
<em>３．APIの利用</em></p>
<p>取得したConsumer Tokenと、Access Tokenを用いてTwitter APIを利用します。ここでは、tweepyライブラリを利用します。</p>
<blockquote><p>
import tweepy<br />
auth = tweepy.OAuthHandler(consumer_key, consumer_secret )<br />
auth.set_access_token(access_key, access_secret ) # これで API が利用可能に<br />
api = tweepy.API(auth)<br />
&nbsp;<br />
# 公開タイムラインを取得してみる<br />
public_tweets = api.public_timeline()<br />
for tweet in public_tweets:<br />
&nbsp;&nbsp;&nbsp;&nbsp;print(tweet.text)
</p></blockquote>
<p><br/></p>
<h2><strong>３．ツイートの集積と 簡単な未読・既読処理</strong></h2>
<p>&nbsp;<br />
<strong>tweepyライブラリのweb2pyへのインポート</strong></p>
<p>tweepyライブラリのソースディレクトリをweb2pyのソースディレクトリにあるsite-packages以下に保存します。jsonモジュールへのパスが通ってない場合、tweepyライブラリのtweepy/utils.pyにあるimport_simplejsonの関数を編集し、gluon.contrib.simplejsonをインポートするようにしてください。<br />
&nbsp;<br />
<strong>ツイートモデルの定義</strong><br />
applications/myapp/models/db.pyを以下のように編集し、簡単なツイートモデルを定義します。ちょっとした応用として、未読既読の設定ができるようにもしてみます。</p>
<blockquote><p>
&#8230;<br />
db.define_table(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8217;tweet&#8217;, #データベースのテーブル(GAEではKind)名<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field(&#8217;uuid&#8217;, &#8216;integer&#8217;),  #ツイートID<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field(&#8217;tweeted_at&#8217;, &#8216;datetime&#8217;), #ツイート時刻<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field(&#8217;content&#8217;, &#8217;string&#8217;), #ツイート本文<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field(&#8217;user_name&#8217;, &#8217;string&#8217;),  #ユーザーの名前<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field(&#8217;user_image&#8217;, &#8217;string&#8217;), #ユーザーの画像<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field(&#8217;read_flg&#8217;, &#8216;boolean&#8217;, default=False),  #未読・既読の設定<br />
))
</p></blockquote>
<p>&nbsp;<br />
<strong>ツイートの集積</strong></p>
<p>あるツイートID以降の上限何件まで取得するAPIを用い、そのAPIを一定間隔で叩きます。<br />
最後に取得したツイートIDを記録しておけば、重複して取得することを防ぐことができます。</p>
<p>一連の処理は、applications/myapp/controllers/default.pyの中で、aggregate_tweets()という関数を定義し、ロジックを書き込んでいきます。</p>
<p>まず、APIを叩いてツイートを取得するコードは以下のようになります。</p>
<blockquote><p>
tweets = api.home_timeline(since_id, count=COUNT)
</p></blockquote>
<p>次に、最後に取得したツイートID（since_id）の取得＆保存は、ここではキャッシュを利用して行ってみます。web2pyの開発環境の場合はメモリが、GAEの場合はmemcacheがキャッシュのバックエンドになります。現時点では仕様が異なる部分があるので、少し条件分岐を行います。</p>
<blockquote><p>
# 最後に取得したツイートIDの取得<br />
if request.env.web2py_runtime_gae: # GAEの場合<br />
&nbsp;&nbsp;&nbsp;&nbsp;since_id = cache.ram.get(&#8217;home_since_id&#8217;)<br />
else: # 開発環境の場合<br />
&nbsp;&nbsp;&nbsp;&nbsp;since_id = cache.ram(&#8217;home_since_id&#8217;, lambda: &#8216;0&#8242;, EXPIRE)<br />
since_id = long(since_id) if since_id else None<br />
&nbsp;<br />
# ツイートの取得<br />
tweets = api.home_timeline(since_id, count=COUNT)<br />
&nbsp;<br />
# 最後に取得したツイートIDの保存<br />
new_since_id = str(tweets[0].id) if tweets else str(since_id)<br />
if request.env.web2py_runtime_gae: # GAEの場合<br />
&nbsp;&nbsp;&nbsp;&nbsp;cache.ram.set(&#8217;home_since_id&#8217;, new_since_id, EXPIRE)<br />
else: # 開発環境の場合<br />
&nbsp;&nbsp;&nbsp;&nbsp;cache.ram.clear(&#8217;home_since_id&#8217;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;cache.ram(&#8217;home_since_id&#8217;, lambda: new_since_id, EXPIRE)
</p></blockquote>
<p>続いて、データベースへの保存は以下のように行ないます。</p>
<blockquote><p>
for tweet in tweets:<br />
&nbsp;&nbsp;&nbsp;&nbsp;db.tweet.insert(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uuid=tweet.id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_name=tweet.user.screen_name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_name=tweet.user.profile_image_url,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=tweet.text,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tweeted_at=tweet.created_at,<br />
&nbsp;&nbsp;&nbsp;&nbsp;)
</p></blockquote>
<p>上記のコードを書いたら、myapp/default/aggregate_tweetsのアドレスを叩いてみてください。<br />
aggregate_tweets関数が実行されます。管理画面からデータベースを見てみると、ツイートが保存されているはずです。</p>
<p>APIを一定間隔で叩くには、GAEの場合，<a href="http://code.google.com/intl/ja/appengine/docs/python/config/cron.html">Cronサービス</a>を利用します。その他の場合は，web2pyのcron機能も利用することができます。</p>
<p>&nbsp;<br />
<strong>ツイートの表示</strong></p>
<p>今度は、applications/myapp/controllers/default.pyの中で、read_tweets()という関数を定義し、未読のツイートを表示させてみます。表示後は、既読に設定することも行ってみます。</p>
<blockquote><p>
# 未読ツイートの取得(上限0～20、ツイート時刻の降順で)<br />
tweets = db(db.tweet.read_flg==False<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;).select(limitby=(0, 20), orderby=~db.tweet.tweeted_at)<br />
&nbsp;<br />
#未読を既読に設定<br />
for tweet in tweets:<br />
&nbsp;&nbsp;&nbsp;&nbsp;tweet.update_record(read_flg=True)<br />
&nbsp;<br />
#ビューのテンプレートにコンテキストを渡す<br />
return dict(tweets=tweets)
</p></blockquote>
<p>ここで、未読ツイートの取得の際に、read_flgによる絞り込みと、tweeted_atによるソートを行なっている点に注意してください。通常のデータベースではこのようなクエリはすぐに実行できますが、GAE上では特定のインデックスを貼らないといけません。GAEの開発サーバーで、一旦、このクエリを実行しておき、設定ファイルに必要なインデックスを書き込ませておきましょう。</p>
<p>出来上がったら、myapp/default/read_tweetsを開いてみてください。未読ツイートが上限20件で表示されます。</p>
<p>&nbsp;<br />
<strong>GAE+Twitterの可能性</strong></p>
<p>以上で簡単なツイートリーダーの説明は終わりです。<br />
けっこう、手軽？に作ることができたのではないでしょうか。</p>
<p>もっと発展させれば、次のような実装も可能になると考えられます。</p>
<ul>
<li>ユーザー毎に未読数・既読数の表示 </li>
<li>メンションやリツイートなどに関する詳細分析 </li>
<li>頻出単語の算出 </li>
<li>個人の嗜好を反映したツイートの分類</li>
</ul>
<p>GAE+Twitterには、新しい可能性がありそうです。</p>
<p>ぜひ、何かチャレンジしてみてはいかがでしょうか？</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/08/24/202/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Androidって美味しい？</title>
		<link>http://labs.s-cubism.com/blog/2010/08/02/201/</link>
		<comments>http://labs.s-cubism.com/blog/2010/08/02/201/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 08:42:14 +0000</pubDate>
		<dc:creator>nobuaki.morikawa</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=201</guid>
		<description><![CDATA[そもそもAndroidって何？

スマートフォンやタブレットなどをメインターゲットとして開発されたLinuxベースのモバイル用オープンソースオペレーティングシステム、ミドルウェア、主要なアプリケーションからなるソフトウェアスタックパッケージを基にしたプラットフォームである。(wikipediaより引用)

Androidのアプリを開発！


楽しそう！
自分の欲しいアプリを自作できる！
人の役に立てる！
稼ぐ！（*´д｀*）(Androidアプリで月の売上が116万円の人も)

アプリを作るにはどうすれば？

開発言語：JDK5以上
開発OS：Windows、Mac OS X、Ubuntu
開発環境：Eclipse3.5(または3.4)、Android SDK

Javaを知ってればイケんじゃん！
環境構築！

Android SDKのインストール
JDKのインストール
Eclipseのインストール
Eclipseの設定
エミュレータの作成と起動

Android SDKのインストール

Android開発者向けのサイトからSDKをダウンロード
ダウンロードしたZIPを解凍
解凍したフォルダを任意の場所へコピー
コピーしたフォルダへパスを通す

JDKのインストール

OracleのサイトからJDK6をダウンロード
ダウンロードしたEXEファイルを実行して画面に従ってインストール

Eclipseのインストール

日本語が好きなら日本語化されたEclipse (Pleiades(プレアデス))をダウンロード
ダウンロードしたZIPを解凍
解凍したフォルダを任意の場所にコピー

Eclipseの設定

Eclipseを起動して、メニューのヘルプの新規ソフトウェアのインストールよりADTプラグインをインストール
設定画面でインストールしたAndroid SDKのパスを登録する

エミュレータの作成と起動

Eclipseのメニューのウィンドウ「Android SDK and AVD Manager」で「Virtual Device」を追加
起動ボタンを押すと！

とりあえずサンプル
Android SDKのサンプルをコンパイルしてみる

新規プロジェクトで「Android Project」を選択
外部ソースからプロジェクトを作成を選択して、ロケーションをAndroid SDKのサンプルのフォルダ指定

これでキミもAndroidに夢中だ！！
]]></description>
			<content:encoded><![CDATA[<p><strong>そもそもAndroidって何？</strong></p>
<ul>
<li>スマートフォンやタブレットなどをメインターゲットとして開発されたLinuxベースのモバイル用オープンソースオペレーティングシステム、ミドルウェア、主要なアプリケーションからなるソフトウェアスタックパッケージを基にしたプラットフォームである。(wikipediaより引用)</li>
</ul>
<p><strong>Androidのアプリを開発！</strong><br />
<span id="more-201"></span></p>
<ul>
<li>楽しそう！</li>
<li>自分の欲しいアプリを自作できる！</li>
<li>人の役に立てる！</li>
<li>稼ぐ！（*´д｀*）(Androidアプリで月の売上が116万円の人も)</li>
</ul>
<p><strong>アプリを作るにはどうすれば？</strong></p>
<ul>
<li>開発言語：JDK5以上</li>
<li>開発OS：Windows、Mac OS X、Ubuntu</li>
<li>開発環境：Eclipse3.5(または3.4)、Android SDK</li>
</ul>
<p style="text-align: center;"><strong>Javaを知ってればイケんじゃん！</strong></p>
<p style="text-align: left;"><strong>環境構築！</strong></p>
<ol>
<li>Android SDKのインストール</li>
<li>JDKのインストール</li>
<li>Eclipseのインストール</li>
<li>Eclipseの設定</li>
<li>エミュレータの作成と起動</li>
</ol>
<p><strong>Android SDKのインストール</strong></p>
<ol>
<li>Android開発者向けのサイトからSDKをダウンロード</li>
<li>ダウンロードしたZIPを解凍</li>
<li>解凍したフォルダを任意の場所へコピー</li>
<li>コピーしたフォルダへパスを通す</li>
</ol>
<p><strong>JDKのインストール</strong></p>
<ol>
<li>OracleのサイトからJDK6をダウンロード</li>
<li>ダウンロードしたEXEファイルを実行して画面に従ってインストール</li>
</ol>
<p><strong>Eclipseのインストール</strong></p>
<ol>
<li>日本語が好きなら日本語化されたEclipse (Pleiades(プレアデス))をダウンロード</li>
<li>ダウンロードしたZIPを解凍</li>
<li>解凍したフォルダを任意の場所にコピー</li>
</ol>
<p><strong>Eclipseの設定</strong></p>
<ol>
<li>Eclipseを起動して、メニューのヘルプの新規ソフトウェアのインストールよりADTプラグインをインストール</li>
<li>設定画面でインストールしたAndroid SDKのパスを登録する</li>
</ol>
<p><strong>エミュレータの作成と起動</strong></p>
<ol>
<li>Eclipseのメニューのウィンドウ「Android SDK and AVD Manager」で「Virtual Device」を追加</li>
<li>起動ボタンを押すと！</li>
</ol>
<p><strong>とりあえずサンプル</strong><br />
Android SDKのサンプルをコンパイルしてみる</p>
<ol>
<li>新規プロジェクトで「Android Project」を選択</li>
<li>外部ソースからプロジェクトを作成を選択して、ロケーションをAndroid SDKのサンプルのフォルダ指定</li>
</ol>
<p><strong>これでキミもAndroidに夢中だ！！</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/08/02/201/feed/</wfw:commentRss>
		</item>
		<item>
		<title>「htmlSql」を…</title>
		<link>http://labs.s-cubism.com/blog/2010/07/26/200/</link>
		<comments>http://labs.s-cubism.com/blog/2010/07/26/200/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 12:39:39 +0000</pubDate>
		<dc:creator>t.ogawa</dc:creator>
		
		<category><![CDATA[告知]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=200</guid>
		<description><![CDATA[「HTMLをDBの如く使える凄いライブラリ」をコチラの記事ではCakePHPで使われてたので、
少しズラして同じPHPのフレームワークであるsymfonyで使ってみました。

というワケでsymfony上で使うまでの手順は概ねこんなところです。
置くだけで呼んでくれたので非常に楽でした。

【手順１】
コチラで取得して解凍します。
【手順２】
「htmlsql.class.php」「snoopy.class.php」の２つを、
symfonyプロジェクト内の「lib/」に配置します。
【手順３】
任意のアクションクラス内で実行するよう記述します。
なおwhere句の各条件はhtmlsql内でevalされますので、
変数や関数などは展開，実行されないよう記述してください。
//インスタンス生成
$htmlsql = new htmlsql();	//	←配置しただけでそのまま呼べます
//キーワード「s-cubism」のgoogle検索結果上位100件のリンク先URL
$keyword = &#8220;s-cubism&#8221;;
$num = 100;
$url = &#8220;http://www.google.co.jp/search?q=&#8221;.$keyword.&#8221;&#038;num=&#8221;.$num;
$htmlsql->connect( &#8216;url&#8217;, $url ) or die( $htmlsql->error );
//「全てのaタグ」の中で―――
//「class属性値がl」「href属性値にgoogleを含まない」「href属性値がhttp://で始まる」
//を満たすものから「属性値href」を取得
$query = &#8221;;
$query .= &#8217;select &#8216;;
$query .= &#8216;href &#8216;;
$query .= &#8216;from &#8216;;
$query .= &#8216;a &#8216;;
$query .= &#8216;where &#8216;;
$query .= &#8216;$class==&#8221;l&#8221; &#8216;;
$query .= &#8216;and &#8216;;
$query .= &#8216;!preg_match(&#8221;/.*google.*/&#8221;,$href)  &#8216;;
$query .= &#8216;and &#8216;;
$query .= &#8216;preg_match(&#8221;/^http:\/\//&#8221;,$href) &#8216;;
$htmlsql->query( $query ) or die( $htmlsql->error [...]]]></description>
			<content:encoded><![CDATA[<p>「HTMLをDBの如く使える凄いライブラリ」を<a href="http://builder.japan.zdnet.com/member/u333174/blog/2010/07/11/entry_27041038/" target="_blank">コチラ</a>の記事ではCakePHPで使われてたので、<br />
少しズラして同じPHPのフレームワークであるsymfonyで使ってみました。
</p>
<p>というワケでsymfony上で使うまでの手順は概ねこんなところです。<br />
置くだけで呼んでくれたので非常に楽でした。</p>
<p><span id="more-200"></span></p>
<p>【手順１】<br />
<a href="http://www.jonasjohn.de/lab/htmlsql.htm" target="_blank">コチラ</a>で取得して解凍します。</p>
<p>【手順２】<br />
「htmlsql.class.php」「snoopy.class.php」の２つを、<br />
symfonyプロジェクト内の「lib/」に配置します。</p>
<p>【手順３】<br />
任意のアクションクラス内で実行するよう記述します。<br />
なおwhere句の各条件はhtmlsql内でevalされますので、<br />
変数や関数などは展開，実行されないよう記述してください。</p>
<blockquote><p>//インスタンス生成<br />
$htmlsql = new htmlsql();	//	←配置しただけでそのまま呼べます<br />
//キーワード「s-cubism」のgoogle検索結果上位100件のリンク先URL<br />
$keyword = &#8220;s-cubism&#8221;;<br />
$num = 100;<br />
$url = &#8220;http://www.google.co.jp/search?q=&#8221;.$keyword.&#8221;&#038;num=&#8221;.$num;<br />
$htmlsql->connect( &#8216;url&#8217;, $url ) or die( $htmlsql->error );<br />
//「全てのaタグ」の中で―――<br />
//「class属性値がl」「href属性値にgoogleを含まない」「href属性値がhttp://で始まる」<br />
//を満たすものから「属性値href」を取得<br />
$query = &#8221;;<br />
$query .= &#8217;select &#8216;;<br />
$query .= &#8216;href &#8216;;<br />
$query .= &#8216;from &#8216;;<br />
$query .= &#8216;a &#8216;;<br />
$query .= &#8216;where &#8216;;<br />
$query .= &#8216;$class==&#8221;l&#8221; &#8216;;<br />
$query .= &#8216;and &#8216;;<br />
$query .= &#8216;!preg_match(&#8221;/.*google.*/&#8221;,$href)  &#8216;;<br />
$query .= &#8216;and &#8216;;<br />
$query .= &#8216;preg_match(&#8221;/^http:\/\//&#8221;,$href) &#8216;;<br />
$htmlsql->query( $query ) or die( $htmlsql->error );<br />
//配列形式で頂きます<br />
$this->data = $htmlsql->fetch_array(); </p></blockquote>
<p>【手順４】<br />
ビューテンプレート内で表示。</p>
<blockquote><p>&lt;div&gt;<br />
&lt;ul&gt;<br />
&lt;?PHP foreach( $data as $dt ): ?&gt;<br />
&lt;li&gt;&lt;?PHP echo $dt['href']; ?&gt;&lt;/li&gt;<br />
&lt;?PHP endforeach; ?&gt;<br />
&lt;/ul&gt;<br />
&lt;/div&gt;</p></blockquote>
<p>実際に表示される結果につきましてはご想像の通りかとは思いますが、<br />
よろしければお試しくださいｗ</p>
<p>用途や機能にもよりますが「軽く」使ってみた感覚としては、<br />
その辺のhtml,xmlパーサに比べて非常に楽だと思います。<br />
手順３の辺りに記述しましたが、where句の各条件は内部でeval実行されるため、<br />
phpで許容される記述である必要がありますが、<br />
それゆえに評価用関数など自由にカスタマイズできそうです。<br />
（ライセンスもBSDらしいので気軽に手を入れたりして使っても問題なさそ）</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/07/26/200/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHPerの為のMongoDB入門</title>
		<link>http://labs.s-cubism.com/blog/2010/07/20/199/</link>
		<comments>http://labs.s-cubism.com/blog/2010/07/20/199/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 09:22:49 +0000</pubDate>
		<dc:creator>kimoto</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[php db NoSQL MongoDB PHPer 入門]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=199</guid>
		<description><![CDATA[最近巷でよく聞くNoSQL(Not Only SQL)
試してみたくてPHPから簡単に使えるものはないものか・・・と色々探した結果たどり着いたのがMongoDBでした。
今回はインストールから、簡単に使ってみるところまで紹介します

[MongoDBとは？]
http://ja.wikipedia.org/wiki/MongoDB
[インストール方法]
1.yumにリポジトリを追加する
$ vim /etc/yum.repos.d/10gen.repo
下記を記入
[10gen]
name=10gen Repository
baseurl=http://downloads.mongodb.org/distros/centos/5.4/os/$basearch/
gpgcheck=0
enabled=1
2.MongoDBのインストール
リポジトリを追加したのでinstallするだけ
$ yum -y install mongo-stable*
ちゃんとインストールできたか確認しましょう
$ mongod &#8211;version
下記のような結果が返ってきます
db version v1.4.4, pdfile version 4.5
Tue Jul 20 16:50:24 git version: 9dcac11bd72c7cb34ca278313f033efcdd4908eb

3.MongoDBの起動
yumで入れたので起動もごくごく普通に起動できます
$ /etc/init.d/mongod start

4.PHPのモジュールを追加する
PHPerとしてはここからが本題、mongoモジュールはpeclに用意されているのでpeclコマンドを使います
pecl install mongo
peclコマンドが使えないって場合はphp-pearがモジュールにあるか確認しましょう（結構はまった）
peclでインストールしたときのお約束
vi /etc/php.d/mongo.ini
以下を書き込みます
extension=mongo.so
確認
php -m
mongoが追加されてない場合はhttpdを再起動して確認してください。
これで使う準備は出来ました。
[簡単な使い方]
extensionの有無を確認する
if (!extension_loaded(&#8217;mongo&#8217;)) die (&#8217;Mongoがインストールされてないよ&#8217;);
接続する
$mongo = new Mongo(&#8217;mongodb://localhost:27017&#8242;);
コネクションを確認する
if (!$mongo-&#62;connected) die(&#8217;接続されてません！&#8217;);
使うdatabaseを選択
$db = $mongo-&#62;selectDB( &#8220;testdb&#8221; );
使うtableを選択(mongoではtableのことをcollectionと呼ぶ)
$col = $db-&#62;selectCollection( &#8220;testcollection&#8221; );
insert
$col-&#62;insert( $data );
select
$cursor = $col-&#62;find();
foreach ($cursor as $id =&#62;$obj) {
var_dump( $obj [...]]]></description>
			<content:encoded><![CDATA[<p>最近巷でよく聞くNoSQL(Not Only SQL)</p>
<p>試してみたくてPHPから簡単に使えるものはないものか・・・と色々探した結果たどり着いたのがMongoDBでした。</p>
<p>今回はインストールから、簡単に使ってみるところまで紹介します</p>
<p><span id="more-199"></span></p>
<h2>[MongoDBとは？]</h2>
<p><a href="http://ja.wikipedia.org/wiki/MongoDB">http://ja.wikipedia.org/wiki/MongoDB</a></p>
<h2>[インストール方法]</h2>
<h3>1.yumにリポジトリを追加する</h3>
<blockquote><p>$ vim /etc/yum.repos.d/10gen.repo</p></blockquote>
<p>下記を記入</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">[10gen]</span></p>
<p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">name=10gen Repository</span></p>
<p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">baseurl=http://downloads.mongodb.org/distros/centos/5.4/os/$basearch/</span></p>
<p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">gpgcheck=0</span></p>
<p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">enabled=1</span></p></blockquote>
<h3>2.MongoDBのインストール</h3>
<p>リポジトリを追加したのでinstallするだけ</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; font-weight: normal; line-height: 18px; font-size: 12px; white-space: pre;">$ yum -y install mongo-stable*</span></p></blockquote>
<p>ちゃんとインストールできたか確認しましょう</p>
<blockquote><p>$ mongod &#8211;version</p></blockquote>
<p>下記のような結果が返ってきます</p>
<blockquote><p>db version v1.4.4, pdfile version 4.5</p>
<p>Tue Jul 20 16:50:24 git version: 9dcac11bd72c7cb34ca278313f033efcdd4908eb</p></blockquote>
<div>
<h3>3.MongoDBの起動</h3>
<p>yumで入れたので起動もごくごく普通に起動できます</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; font-weight: normal; line-height: 18px; font-size: 12px; white-space: pre;">$ /etc/init.d/mongod start</span></p></blockquote>
</div>
<h3>4.PHPのモジュールを追加する</h3>
<p>PHPerとしてはここからが本題、mongoモジュールはpeclに用意されているのでpeclコマンドを使います</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">pecl install mongo</span></p></blockquote>
<p>peclコマンドが使えないって場合はphp-pearがモジュールにあるか確認しましょう（結構はまった）</p>
<p>peclでインストールしたときのお約束</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">vi /etc/php.d/mongo.ini</span></p></blockquote>
<p>以下を書き込みます</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">extension=mongo.so</span></p></blockquote>
<p>確認</p>
<blockquote><p><span style="font-family: 'Courier New', monospace; line-height: 18px; font-size: 12px; white-space: pre;">php -m</span></p></blockquote>
<p>mongoが追加されてない場合はhttpdを再起動して確認してください。</p>
<p>これで使う準備は出来ました。</p>
<h2>[簡単な使い方]</h2>
<p>extensionの有無を確認する</p>
<blockquote><p>if (!extension_loaded(&#8217;mongo&#8217;)) die (&#8217;Mongoがインストールされてないよ&#8217;);</p></blockquote>
<p>接続する</p>
<blockquote><p>$mongo = new Mongo(&#8217;mongodb://localhost:27017&#8242;);</p></blockquote>
<p>コネクションを確認する</p>
<blockquote><p>if (!$mongo-&gt;connected) die(&#8217;接続されてません！&#8217;);</p></blockquote>
<p>使うdatabaseを選択</p>
<blockquote><p>$db = $mongo-&gt;selectDB( &#8220;testdb&#8221; );</p></blockquote>
<p>使うtableを選択(mongoではtableのことをcollectionと呼ぶ)</p>
<blockquote><p>$col = $db-&gt;selectCollection( &#8220;testcollection&#8221; );</p></blockquote>
<p>insert</p>
<blockquote><p>$col-&gt;insert( $data );</p></blockquote>
<p>select</p>
<blockquote><p>$cursor = $col-&gt;find();</p>
<p>foreach ($cursor as $id =&gt;$obj) {</p>
<p>var_dump( $obj );</p>
<p>}</p></blockquote>
<p>こんな感じでMySQL等とほぼ同じ感覚でデータを操作することが出来ます。</p>
<p>かなり駆け足でしたがMongoDBの入門でした。</p>
<p>最近ではこれをデフォルトとするフレームワークも誕生していますし一度試してみてはいかがでしょうか？</p>
<p>参考URL</p>
<p>http://d.hatena.ne.jp/ja9/20100707/1278495362</p>
<p>http://d.hatena.ne.jp/nazone/20091126/p1</p>
<p>http://labs.unoh.net/2010/07/hellolithium.html</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/07/20/199/feed/</wfw:commentRss>
		</item>
		<item>
		<title>HTML5はじめました</title>
		<link>http://labs.s-cubism.com/blog/2010/07/12/198/</link>
		<comments>http://labs.s-cubism.com/blog/2010/07/12/198/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 04:23:05 +0000</pubDate>
		<dc:creator>iwakawa</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=198</guid>
		<description><![CDATA[Flush等に頼らずともリッチな表現や高機能なアプリケーションを実現可能なHTML5が注目されています。
これまでのHTMLと比較すると、より文脈の構造化を表現するための要素や、グラフィック・オーディオなどのマルチメディア処理を実現する要素が追加されています。
というわけで、今回のラボブログのテーマはHTML5です。特に筆者が注目している、canvas要素を試してみました。

早速canvas要素を使ってみましょう。下記がcanvasタグの簡単な例です。
&#60;canvas id=&#8221;main_canvas&#8221; width=&#8221;400&#8243; height=&#8221;300&#8243;&#62;
canvasをサポートするブラウザをご利用ください。
&#60;/canvas&#62;
canvasの中に記述した文字はcanvas非対応ブラウザでのみ表示されます。JavaScriptを使ってcanvas要素にアクセスし、グラフィックコンテキスト（そのキャンバスに対応するペンのようなもの）を取得します。
var canvas = document.getElementById("main_canvas");
var context = canvas.getContext("2d");
このコンテキストオブジェクトを使って、図形を描画します。基本的な流れは下記の通りです。

スタイルを設定する(fillStyleフィールド, strokeStyleフィールド)。
描画の経路を開始する(beginPath())。
描画の経路を設定する(点移動:moveTo(), 直線:lineTo(), 円弧:arc())。
必要であれば、経路を閉じる(closePath())。
描画する（塗りつぶす：fill()、線を描く：draw()）

丸を描くサンプルを以下に示します。
function drawFrame(){
	var canvas = document.getElementById("canvas2");
	if (canvas.getContext) {
		var x = Math.floor(400 * Math.random());
		var y = Math.floor(300 * Math.random());
		var context = canvas.getContext("2d");
		var r = Math.floor(255*Math.random());
		var g = Math.floor(255*Math.random());
		var b = Math.floor(255*Math.random());
		var a = getTransparency();
		context.fillStyle = "rgba(255,255,255, "+a+")";
        	context.fillRect(0,0,400,300);
		context.fillStyle [...]]]></description>
			<content:encoded><![CDATA[<p>Flush等に頼らずともリッチな表現や高機能なアプリケーションを実現可能なHTML5が注目されています。</p>
<p>これまでのHTMLと比較すると、より文脈の構造化を表現するための要素や、グラフィック・オーディオなどのマルチメディア処理を実現する要素が追加されています。</p>
<p>というわけで、今回のラボブログのテーマはHTML5です。特に筆者が注目している、canvas要素を試してみました。<br />
<span id="more-198"></span><br />
早速canvas要素を使ってみましょう。下記がcanvasタグの簡単な例です。</p>
<p>&lt;canvas id=&#8221;main_canvas&#8221; width=&#8221;400&#8243; height=&#8221;300&#8243;&gt;</p>
<p>canvasをサポートするブラウザをご利用ください。</p>
<p>&lt;/canvas&gt;</p>
<p>canvasの中に記述した文字はcanvas非対応ブラウザでのみ表示されます。JavaScriptを使ってcanvas要素にアクセスし、グラフィックコンテキスト（そのキャンバスに対応するペンのようなもの）を取得します。</p>
<pre>var canvas = document.getElementById("main_canvas");
var context = canvas.getContext("2d");</pre>
<p>このコンテキストオブジェクトを使って、図形を描画します。基本的な流れは下記の通りです。</p>
<ol>
<li>スタイルを設定する(fillStyleフィールド, strokeStyleフィールド)。</li>
<li>描画の経路を開始する(beginPath())。</li>
<li>描画の経路を設定する(点移動:moveTo(), 直線:lineTo(), 円弧:arc())。</li>
<li>必要であれば、経路を閉じる(closePath())。</li>
<li>描画する（塗りつぶす：fill()、線を描く：draw()）</li>
</ol>
<p>丸を描くサンプルを以下に示します。</p>
<pre>function drawFrame(){
	var canvas = document.getElementById("canvas2");
	if (canvas.getContext) {
		var x = Math.floor(400 * Math.random());
		var y = Math.floor(300 * Math.random());
		var context = canvas.getContext("2d");
		var r = Math.floor(255*Math.random());
		var g = Math.floor(255*Math.random());
		var b = Math.floor(255*Math.random());
		var a = getTransparency();
		context.fillStyle = "rgba(255,255,255, "+a+")";
        	context.fillRect(0,0,400,300);
		context.fillStyle = "rgb("+r+","+g+","+b+")";
		context.beginPath();
		context.arc(x,y,40,0,Math.PI*2,true);
        	context.fill();
	}
}
function getTransparency(){
	var control = document.getElementById("transparency");
	return control.value / 100;
}</pre>
<p>ここから実際にサンプルのHTMLとJavaScriptを貼り付けています。「このブラウザはcanvasをサポートしていません」と<br />
メッセージが表示されている場合はブラウザがcanvasをサポートしていません。</p>
<p>現行のFirefox, Chrome, Safari等のブラウザではこのサンプルが表示可能ですが、残念ながらIE8においてはcanvasはサポートされておらず、表示できません。</p>
<p><script type="application/x-javascript"><!--
function startAnim(){
	setInterval("drawFrame()",10);
}
function drawFrame(){
	var canvas = document.getElementById("main_canvas");
	if (canvas.getContext) {
		var x = Math.floor(400 * Math.random());
		var y = Math.floor(300 * Math.random());
		var context = canvas.getContext("2d");
		var r = Math.floor(255*Math.random());
		var g = Math.floor(255*Math.random());
		var b = Math.floor(255*Math.random());
	var a = getTransparency();
		context.fillStyle = "rgba(255,255,255, "+a+")";
        	context.fillRect(0,0,400,300);
		context.fillStyle = "rgb("+r+","+g+","+b+")";
		context.beginPath();
		context.arc(x,y,40,0,Math.PI*2,true);
        	context.fill();
	}
}
function getTransparency(){
	var control = document.getElementById("transparency");
	return control.value / 100;
}
// --></script></p>
<p><canvas id="main_canvas" width="400" height="300">このブラウザはキャンバスをサポートしていません</canvas></p>
<input onclick="drawFrame()" type="button" value="drawFrame()" />
<p>このボタンを押すと、drawFrameを実行します。はじめに背景を塗りつぶし、ランダムな箇所に丸を描きます。</p>
<p>なお、背景の透明度は下記のrangeフォームで選べるようにしてあります。</p>
<p>updateの透明度：</p>
<input id="transparency" type="range" value="100" />
<p>なお、この処理を一定間隔で行うとアニメーションが実現できます。</p>
<pre>function startAnim(){
	setInterval("drawFrame()",10);
}</pre>
<p></p>
<input onclick="startAnim()" type="button" value="startAnim()" />
<p>このボタンを押すとアニメーションを開始します。</p>
<p>JavaScriptで記述するので、フォームとの親和性が良いのも開発者にとっては魅力的です。比較的自由なレイアウトで、簡単にインタラクティブなコンテンツを作成できます。この面白さを一度味わってみてはいかがでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/07/12/198/feed/</wfw:commentRss>
		</item>
		<item>
		<title>10年間経ったスゴさを感じさせないCGに注目♪  『トイ・ストーリー3』</title>
		<link>http://labs.s-cubism.com/blog/2010/07/08/193/</link>
		<comments>http://labs.s-cubism.com/blog/2010/07/08/193/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 12:40:32 +0000</pubDate>
		<dc:creator>みー</dc:creator>
		
		<category><![CDATA[告知]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=193</guid>
		<description><![CDATA[
アジャイルメディア・ネットワークさんが主催した、&#8221;今を生きるヒントがいっぱい&#8221;『トイ・ストーリー3』試写会に参加してきたので、ラボブログ・イレギュラー編としてお伝えします。
（ネタバレなし）
といっても、映画の&#8221;ストーリー&#8221;は一切書かないのでネタバレなどはありません。
僕自身、年間数十本は映画館で観ている大の映画好きですが、事前に情報をたくさん聞いちゃうのが好きではないのと、文字でこのお話（トイ・ストーリー）の素晴らしさを伝えるのは困難だと思うので。

 
 
で、やはりここは「3Dコンピュータグラフィックス」に着目しよう。

Pixarは元々映画制作会社ではなく、CGの研究者達が「いつかはCGだけで自分達の長編作品を」という夢を抱いて立ち上げた会社でした。ハードウェアを売ってみたり、ジョージ・ルーカスと一緒にやってみたり、スティーブ・ジョブズに救われてみたり、ディズニーと契約したりと今の成功に到るまで波乱万丈な歴史を持っている会社です。
試写会でも「なぜ、本編の前に短編CGがあるのですか？」と質問された方がいましたが、元々は逆で様々な理由から「短編CG」を作っていた会社です。技術研究の目的だったり、プロモーションの目的だったり。
だから今でも Pixar は短編CGを大事にしていて、常に短編と長編がセットになっているのはこうした歴史があるからです。

短編CGを作っていた理由としては、お金の問題や技術的な制約が挙げられます。
昔は、1枚のCGを作成するのに膨大な計算時間が必要でした。映画は1秒間に24フレーム（テレビは約30フレーム）必要なので、長編の作品を作ろと思うと絶望的な時間が必要だったのです。
だから、トイ・ストーリー1作目の企画を提案したとき「CGだけで長編作品など作れるわけない」と言われていました。
そんなトイ・ストーリー1作目が公開されたのは1995年、実に今から15年前です。
この間、CGの技術は飛躍的に進化しました。
短編CGは、家電量販店で売られているパソコンでも作れるような時代です（内容はともかく）。
当然、Pixarのトイ・ストーリー制作陣の知識やノウハウ、技術力、ハードウェアも当時とは比べものにならないでしょう。
と・こ・ろ・が、試写会を観た方でこうした「技術の進化」に気を取られた方はほとんどいないのではないでしょうか？
おそらく2作を並べて同時に観れば、気づく点があるかもしれません。
CGオタクな僕としては、特に背景だけを注目すれば技術の進化に感嘆してしまうのですが、意識して観ない限りは「CGすげ～」なんて気づきません。
ここに Pixar のこの作品に対しての「想い」を感じました。

技術を観て欲しいのではなく、ストーリーを観て欲しい。
前2作品を観たみんなにまた「トイ・ストーリー」の世界に戻ってきて欲しい。

よくハリウッド映画では、2作目、3作目は映像の派手さ・技術の進化をウリにすることが多いですが、トイ・ストーリーはそれが全くありません。

ぜひ皆さんも、トイ・ストーリーの「ストーリー」を楽しんでもらいたいなと思いました。
僕は、次は映画館で「あの動きすげ～！」「あの影付けはさすが！」「あれだけ大量のデータを計算できるのはハンパない！」とPixarのCG技術に興奮してこようと思います ^-^


]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-medium wp-image-194" title="トイ・ストーリー3" src="http://labs.s-cubism.com/blog/wp-content/uploads/2010/07/e38388e382a4efbc93_e383ade382b4-252x300.jpg" alt="" width="252" height="300" /></p>
<p>アジャイルメディア・ネットワークさんが主催した、&#8221;今を生きるヒントがいっぱい&#8221;『トイ・ストーリー3』試写会に参加してきたので、ラボブログ・イレギュラー編としてお伝えします。</p>
<p>（ネタバレなし）<br />
といっても、映画の&#8221;ストーリー&#8221;は一切書かないのでネタバレなどはありません。</p>
<p>僕自身、年間数十本は映画館で観ている大の映画好きですが、事前に情報をたくさん聞いちゃうのが好きではないのと、文字でこのお話（トイ・ストーリー）の素晴らしさを伝えるのは困難だと思うので。</p>
<p><span id="more-193"></span></p>
<p> </p>
<p> </p>
<p>で、やはりここは「3Dコンピュータグラフィックス」に着目しよう。</p>
<p style="text-align: center;"><img class="alignnone size-medium wp-image-195 aligncenter" title="試写会会場" src="http://labs.s-cubism.com/blog/wp-content/uploads/2010/07/e58699e79c9f1-300x225.jpg" alt="" width="300" height="225" /></p>
<p>Pixarは元々映画制作会社ではなく、CGの研究者達が「いつかはCGだけで自分達の長編作品を」という夢を抱いて立ち上げた会社でした。ハードウェアを売ってみたり、ジョージ・ルーカスと一緒にやってみたり、スティーブ・ジョブズに救われてみたり、ディズニーと契約したりと今の成功に到るまで波乱万丈な歴史を持っている会社です。</p>
<p>試写会でも「なぜ、本編の前に短編CGがあるのですか？」と質問された方がいましたが、元々は逆で様々な理由から「短編CG」を作っていた会社です。技術研究の目的だったり、プロモーションの目的だったり。<br />
だから今でも Pixar は短編CGを大事にしていて、常に短編と長編がセットになっているのはこうした歴史があるからです。</p>
<p style="text-align: center;"><img class="alignnone size-medium wp-image-196 aligncenter" title="トイ・ストーリー3" src="http://labs.s-cubism.com/blog/wp-content/uploads/2010/07/e58699e79c9f2-300x225.jpg" alt="" width="300" height="225" /></p>
<p>短編CGを作っていた理由としては、お金の問題や技術的な制約が挙げられます。<br />
昔は、1枚のCGを作成するのに膨大な計算時間が必要でした。映画は1秒間に24フレーム（テレビは約30フレーム）必要なので、長編の作品を作ろと思うと絶望的な時間が必要だったのです。<br />
だから、トイ・ストーリー1作目の企画を提案したとき「CGだけで長編作品など作れるわけない」と言われていました。</p>
<p>そんなトイ・ストーリー1作目が公開されたのは1995年、実に今から15年前です。</p>
<p>この間、CGの技術は飛躍的に進化しました。<br />
短編CGは、家電量販店で売られているパソコンでも作れるような時代です（内容はともかく）。</p>
<p>当然、Pixarのトイ・ストーリー制作陣の知識やノウハウ、技術力、ハードウェアも当時とは比べものにならないでしょう。</p>
<p>と・こ・ろ・が、試写会を観た方でこうした「技術の進化」に気を取られた方はほとんどいないのではないでしょうか？<br />
おそらく2作を並べて同時に観れば、気づく点があるかもしれません。<br />
CGオタクな僕としては、特に背景だけを注目すれば技術の進化に感嘆してしまうのですが、意識して観ない限りは「CGすげ～」なんて気づきません。</p>
<p>ここに Pixar のこの作品に対しての「想い」を感じました。</p>
<ul>
<li>技術を観て欲しいのではなく、ストーリーを観て欲しい。</li>
<li>前2作品を観たみんなにまた「トイ・ストーリー」の世界に戻ってきて欲しい。</li>
</ul>
<p>よくハリウッド映画では、2作目、3作目は映像の派手さ・技術の進化をウリにすることが多いですが、トイ・ストーリーはそれが全くありません。</p>
<p style="text-align: center;"><img class="alignnone size-medium wp-image-197 aligncenter" title="トイ・ストーリー3" src="http://labs.s-cubism.com/blog/wp-content/uploads/2010/07/e3808ee38388e382a4e383bbe382b9e38388e383bce383aae383bcefbc93e3808fe383a1e382a4e383b3_copyright-300x168.jpg" alt="" width="300" height="168" /></p>
<p>ぜひ皆さんも、トイ・ストーリーの「ストーリー」を楽しんでもらいたいなと思いました。</p>
<p>僕は、次は映画館で「あの動きすげ～！」「あの影付けはさすが！」「あれだけ大量のデータを計算できるのはハンパない！」とPixarのCG技術に興奮してこようと思います ^-^</p>
<p>
<script type="text/javascript" charset="utf-8" src="http://agilemedia.jp/report/20100707_01/review_157.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/07/08/193/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ロジカルライティング？？</title>
		<link>http://labs.s-cubism.com/blog/2010/07/05/192/</link>
		<comments>http://labs.s-cubism.com/blog/2010/07/05/192/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 11:42:27 +0000</pubDate>
		<dc:creator>murase</dc:creator>
		
		<category><![CDATA[ビジネス]]></category>

		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=192</guid>
		<description><![CDATA[今回は「ロジカルライティング」について書きたいと思います。
みなさんは「ロジカルライティング」という言葉を聞いたことがありますか？
なんだか取っつきにくい印象を受けるかもしれませんが、要は「読み手に伝わりやすい文章を書く」ということです。
ではどうすれば伝わりやすい文章を書くことができるのかについて、何点かポイントを絞ってご紹介したいと思います。


まず初めに何について書くのかを述べる
これから何の話をするのか、ということを最初に述べておきます。
そうすることで、読み手がその後の話の展開を何かしら予想できるため、それが土台となって読み手が理解するのを助けてくれます。
当たり前に聞こえるかもしれませんが、とても大切なことです。
段落を分けて書く
これも基本ですね。
単純に読みやすくなるだけでなく、書かれている情報同士の関係性（親子であったり、並列であったり）がわかりやすくなるため、読み手の理解の助けとなります。
段落分けがなく書き連ねられた文章では、書き手の一番いいたいこと、読んで欲しい点がどこにあるかがぼやけてしまいます。
１つの文には１つのことだけを書く
これは、意外とできていない方が多いのではないでしょうか。
段落分けをしないのと同じで、１つの文に色々なことを詰め込んでしまうと、やはり言いたいことの焦点がぼけてしまいます。
また、１つの文では１つのことだけを書き、文と文との間をきちんと接続語でつなぐことで、情報と情報の関係性が明確になります。

だいぶポイントを絞りましたが、この3点を意識するだけでも、だいぶ読みやすい文章を書くことができるのではないでしょうか。
そしてこの書き方、たとえ普段日本語のドキュメントを書く機会がないという方でも活用できる場面があります。
それは、メールやはたまたプログラムソース（！）を書く際です。
プログラムソースを例にとって先ほどの3点を言い換えてみましょう。

まず何をするモジュールであるのかを書く
適度にメソッドを分割する。
１つの行には１つの処理だけを書く。

いかがでしょうか。
これであなたも明日から可読性の高いソースコードを書くことができる！・・・かもしれません。
]]></description>
			<content:encoded><![CDATA[<p>今回は「ロジカルライティング」について書きたいと思います。</p>
<p>みなさんは「ロジカルライティング」という言葉を聞いたことがありますか？<br />
なんだか取っつきにくい印象を受けるかもしれませんが、要は「読み手に伝わりやすい文章を書く」ということです。</p>
<p>ではどうすれば伝わりやすい文章を書くことができるのかについて、何点かポイントを絞ってご紹介したいと思います。</p>
<p><span id="more-192"></span></p>
<ol>
<li>まず初めに何について書くのかを述べる</li>
<p>これから何の話をするのか、ということを最初に述べておきます。<br />
そうすることで、読み手がその後の話の展開を何かしら予想できるため、それが土台となって読み手が理解するのを助けてくれます。</p>
<p>当たり前に聞こえるかもしれませんが、とても大切なことです。</p>
<li>段落を分けて書く</li>
<p>これも基本ですね。</p>
<p>単純に読みやすくなるだけでなく、書かれている情報同士の関係性（親子であったり、並列であったり）がわかりやすくなるため、読み手の理解の助けとなります。<br />
段落分けがなく書き連ねられた文章では、書き手の一番いいたいこと、読んで欲しい点がどこにあるかがぼやけてしまいます。</p>
<li>１つの文には１つのことだけを書く</li>
<p>これは、意外とできていない方が多いのではないでしょうか。</p>
<p>段落分けをしないのと同じで、１つの文に色々なことを詰め込んでしまうと、やはり言いたいことの焦点がぼけてしまいます。<br />
また、１つの文では１つのことだけを書き、文と文との間をきちんと接続語でつなぐことで、情報と情報の関係性が明確になります。</p>
</ol>
<p>だいぶポイントを絞りましたが、この3点を意識するだけでも、だいぶ読みやすい文章を書くことができるのではないでしょうか。</p>
<p>そしてこの書き方、たとえ普段日本語のドキュメントを書く機会がないという方でも活用できる場面があります。</p>
<p>それは、メールやはたまたプログラムソース（！）を書く際です。</p>
<p>プログラムソースを例にとって先ほどの3点を言い換えてみましょう。</p>
<ol>
<li>まず何をするモジュールであるのかを書く</li>
<li>適度にメソッドを分割する。</li>
<li>１つの行には１つの処理だけを書く。</li>
</ol>
<p>いかがでしょうか。</p>
<p>これであなたも明日から可読性の高いソースコードを書くことができる！・・・かもしれません。</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/07/05/192/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Perlのいいとこ・いくないとこ</title>
		<link>http://labs.s-cubism.com/blog/2010/07/01/191/</link>
		<comments>http://labs.s-cubism.com/blog/2010/07/01/191/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 17:10:08 +0000</pubDate>
		<dc:creator>yoshiyuki.meguro</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=191</guid>
		<description><![CDATA[今回は、皆様が嫌いなPerlについて触れてみます。
と言っても技術的なことには触れずに、Perlを使うにあたっての
（自分が使ってて感じた）メリット・デメリットをあげてみました。

Perlのいいとこ
■テキスト処理に強い
これは、Perlで書くとよくわかりますが、正規表現を記述するときには非常に楽です。
正規表現にマッチさせる演算子（=~）の存在とパターンマッチ演算子（m//）のおかげで
簡潔に記述できます。
こういったところがテキスト処理に強いなどと言われる理由の1つかなと思います。
■大抵のLinuxディストリビューションに標準でインストールされている
Linuxファウンデーションによって策定されるLinuxの標準仕様のLSB（Linux Standart Base）に
PerlとPythonが入っています。（2008年2月 LSB3.2）
自分でよく使うような汎用的なスクリプトを、大体のLinux環境に持っていってもすぐ動く（セットアップなしで）
のは、非常に楽チンです。
グルー言語としては、標準でインストールされているのを期待してもよいのは助かります。（これはPythonもですが）
■モジュールが豊富（CPANの存在）
これが実は1番のメリットかもしれません。
Perlでは、CPANというサイトから他の開発者が開発したモジュールをダウンロードして利用できます。
新しい機能や概念等が誕生するとすぐに対応したモジュールが登録されます。
何かしたいと思ったときには、まずCPANを検索してみるといいでしょう。
ちなみにPerl5.8までPerlにはswitch文が存在しませんでしたが、それすらモジュールで実装しちゃいます。
（このモジュールは5.8から標準モジュールとなっている）。
そういった意味では、try-catchもモジュールを使用しないと使えません。
Perlのそういうところ大好きです。
■TMTOWTDI
&#8220;There&#8217;s More Than One Way To Do It.&#8221; の略で、「やり方はひとつじゃない」。
ある処理を実現するのに、自分のやりやすい（わかりやすい）書き方で記述できます。
Perlのいくないとこ
■TMTOWTDI
いいところでも出たTMTOWTDIは、デメリットにもなります。
決まりきった処理に対して書く人によって記述が違うため、自分と違う記述をされると
一瞬「？」が浮かびます。
■保守性
Perlはデフォルト変数や、TMTOWTDIという考え方、funny文字や省略記法によって
気をつけて書かないと自分でもまったく読めないソースになり得ます。
それを、他人が保守するとなると・・・・恐ろしいです。
以上、Perlについて簡単に触れてみました。
自分の仕事を楽にするためのスクリプトなど、使い道はいっぱいあると思います。
みなさん、是非Perlを使ってみてください。
]]></description>
			<content:encoded><![CDATA[<p>今回は、皆様が嫌いなPerlについて触れてみます。</p>
<p>と言っても技術的なことには触れずに、Perlを使うにあたっての</p>
<p>（自分が使ってて感じた）メリット・デメリットをあげてみました。</p>
<hr /><span id="more-191"></span></p>
<h2 style="text-align: center;"><em>Perlのいいとこ</em></h2>
<p><strong>■テキスト処理に強い</strong></p>
<p>これは、Perlで書くとよくわかりますが、正規表現を記述するときには非常に楽です。</p>
<p>正規表現にマッチさせる演算子（=~）の存在とパターンマッチ演算子（m//）のおかげで</p>
<p>簡潔に記述できます。</p>
<p>こういったところがテキスト処理に強いなどと言われる理由の1つかなと思います。</p>
<p><strong>■大抵のLinuxディストリビューションに標準でインストールされている</strong></p>
<p>Linuxファウンデーションによって策定されるLinuxの標準仕様のLSB（Linux Standart Base）に</p>
<p>PerlとPythonが入っています。（2008年2月 LSB3.2）</p>
<p>自分でよく使うような汎用的なスクリプトを、大体のLinux環境に持っていってもすぐ動く（セットアップなしで）</p>
<p>のは、非常に楽チンです。</p>
<p>グルー言語としては、標準でインストールされているのを期待してもよいのは助かります。（これはPythonもですが）</p>
<p><strong>■モジュールが豊富（CPANの存在）</strong></p>
<p>これが実は1番のメリットかもしれません。</p>
<p>Perlでは、CPANというサイトから他の開発者が開発したモジュールをダウンロードして利用できます。</p>
<p>新しい機能や概念等が誕生するとすぐに対応したモジュールが登録されます。</p>
<p>何かしたいと思ったときには、まずCPANを検索してみるといいでしょう。</p>
<p>ちなみにPerl5.8までPerlにはswitch文が存在しませんでしたが、それすらモジュールで実装しちゃいます。</p>
<p>（このモジュールは5.8から標準モジュールとなっている）。</p>
<p>そういった意味では、try-catchもモジュールを使用しないと使えません。</p>
<p>Perlのそういうところ大好きです。</p>
<p><strong>■TMTOWTDI</strong></p>
<p>&#8220;There&#8217;s More Than One Way To Do It.&#8221; の略で、「やり方はひとつじゃない」。</p>
<p>ある処理を実現するのに、自分のやりやすい（わかりやすい）書き方で記述できます。</p>
<h2 style="text-align: center;"><em>Perlのいくないとこ</em></h2>
<p><strong>■TMTOWTDI</strong></p>
<p>いいところでも出たTMTOWTDIは、デメリットにもなります。</p>
<p>決まりきった処理に対して書く人によって記述が違うため、自分と違う記述をされると</p>
<p>一瞬「？」が浮かびます。</p>
<p><strong>■保守性</strong></p>
<p>Perlはデフォルト変数や、TMTOWTDIという考え方、funny文字や省略記法によって</p>
<p>気をつけて書かないと自分でもまったく読めないソースになり得ます。</p>
<p>それを、他人が保守するとなると・・・・恐ろしいです。</p>
<hr />以上、Perlについて簡単に触れてみました。</p>
<p>自分の仕事を楽にするためのスクリプトなど、使い道はいっぱいあると思います。</p>
<p>みなさん、是非Perlを使ってみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/07/01/191/feed/</wfw:commentRss>
		</item>
		<item>
		<title>今度の「3D」波の大きさは、どれぐらい？！ （Nintendo 3DS発表に想う）</title>
		<link>http://labs.s-cubism.com/blog/2010/06/21/188/</link>
		<comments>http://labs.s-cubism.com/blog/2010/06/21/188/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 08:50:26 +0000</pubDate>
		<dc:creator>みー</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://labs.s-cubism.com/blog/?p=188</guid>
		<description><![CDATA[日経ＭＪが先週発表した2010年上期（1～6月）のＭＪヒット商品番付で横綱に選出され、任天堂の新しい携帯型ゲーム機でも採用された今話題のキーワードと言えば…
そう、今週のテーマは「3D」です。下の画像は Nintendo 3DS ですが…

「3D」といっても範囲が広いですね。
ちょっと前に「んんん？」とギモンに思ったニュースがあったんですが、「あのトイ・ストーリーが3Dアニメに！」なったそうです。
トイ・ストーリー3の公開はもうすぐですね、楽しみです。
けど「あれ？今までは3Dじゃなかったの？」と思いません？
どうやら最近話題の「3D」というのは、3次元コンピュータグラフィックスのことではなく、視覚的に立体的に感じられる技術のことを言うみたいです。
昨年話題になった「アバター」という映画では特別なメガネをかけることによって3次元に見せていましたが、Nintendo 3DSでは裸眼でも立体的に見えるらしいですね。
「2次元の紙面上で3次元の話題はムズカシイ！」という Nintendo 3DS の凄さを伝えるのに苦戦していた記者のコメントが印象に残ってます。

で、今回取り上げる「3D」は残念ながら昔ながらの3Dです。3次元コンピュータグラフィックス（3D-CG）の方。
以降、3Dと書いたら、3D-CGのことだと思ってください。
2D と 3D の違いはどこにあるかと言うと、形を作った &#8220;後の行程&#8221; が存在すること。
2D の場合は、写真を加工したり、イラストを書いたりした時点でCGとして完成です。
ところが、3D の場合は、何か立体を作っただけではCGになりません。
どこから光が当たるのか、どの角度から見るのか、影は付けるのか、反射はあるのか、奥行きはどこまで見えるのか、とにかく様々なことを設定しなければいけません。
複雑な設定をすればするほど、計算時間もかかります。
この手順を大まかな流れを示すとこんな感じ。

★立体作成（モデリングと呼びます）
↓
★環境設定（シーン設定などと呼ばれます）
↓
★設定に基づいて計算（レンダリングと呼びます）

10年ぐらい前、2000年頃はシーンを設定してレンダリングして最終的な CG を作成するソフトは非常に高価で、1枚作成するのにも時間がかかりました。
しか～し、様々な技術が進歩して、ブラウザ上でもリアルタイムで 3D を表現できる手段も出てきています。
その中で1つ、FLASHで 3D を扱う方法をご紹介しようと思います。
厳密には、ActionScriptを使ってプログラミングして、swf形式で出力する方法です。
Flash Player 10 の目玉として、3D機能が加わりました。ただ、色々と評価や評判を見ているとまだまだ試験的な雰囲気なようです。
けど、前から ActionScript 用の 3Dライブラリ はいくつか公開されており、実用上で全く問題ない完成度のものもいくつかあります。
今後はActionScriptに取り込まれた3D機能も発展すると思いますが、まだ外部ライブラリを使った方が良さそうな感じです。
3Dライブラリで一番メジャーなのは Papervision3D でしょうか？
デモはオフィシャルサイトを…と言いたいところなんですが、ちょっと重いんですよね。
ライブラリの完成度は高いのにサイトの作りがイマイチなのが損してるなと思うけど、国内の情報量も考えて、まずは Papervision3D を試してみるのはオススメです。
■ Papervision3D 公式サイト
http://www.papervision3d.org/
（頑張って待っていると、迫力ある3Dが出てきます）
では、早速具体的なコードに入りましょう、、、と、
書きたいキモチがいっぱいなのですが、紙面の都合上、本を紹介して終わりにしたいと思います ^-^;
Papervision3Dではじめる Flash3Dアニメーション
Flash3Dコンテンツ制作のためのPapervision3D入門 (XK BOOKS for developers)
上記の2冊ですが、大きな特徴として BasicView（Papervision3Dのクラス名） の扱いが違います。
3Dは冒頭に書いたようにカメラやシーンなどの初期設定をしないといけないのですが、これらお決まりの処理をまとめてやってくれるのが BasicView というクラスです。BasicViewを使うとスッキリ書けるのですが、逆に言えば内部的に何をやっているのか理解しづらいとも言えます。デザイナー寄りな方には「Papervision3D入門」、プログラマまたは理系な方には「Flash3Dアニメーション」がオススメです。
僕個人的な感想としては、最初「Papervision3D入門」を読んで概要が把握できたけど、もう少し深い理解をしたいなと思って「Flash3Dアニメーション」を購入。期待通りでした。
「Papervision3D入門」の方はカラーで、いくつか活用例も載っているので本をパラパラとめくりながらイメージしたい方には良さそうです。という点でもデザイナー寄りな方向けですね。










ところで3Dブーム、どうなんでしょうね？
僕自身は「3Dの時代が来た」という波を、大小あるとはいえ、発生しては消えていくのを何度も見てきたので今回も話題先行で終わっちゃうんじゃないのかなぁと思ってしまいますが…
とりあえず、Nintendo 3DSを早く観てみたいです！
]]></description>
			<content:encoded><![CDATA[<p>日経ＭＪが先週発表した2010年上期（1～6月）のＭＪヒット商品番付で横綱に選出され、任天堂の新しい携帯型ゲーム機でも採用された今話題のキーワードと言えば…</p>
<p>そう、今週のテーマは「3D」です。下の画像は Nintendo 3DS ですが…</p>
<p><img class="alignnone size-medium wp-image-190" title="3ds" src="http://labs.s-cubism.com/blog/wp-content/uploads/2010/06/3ds1.jpg" alt="" width="233" height="208" /></p>
<p>「3D」といっても範囲が広いですね。</p>
<p>ちょっと前に「んんん？」とギモンに思ったニュースがあったんですが、「あのトイ・ストーリーが3Dアニメに！」なったそうです。<br />
トイ・ストーリー3の公開はもうすぐですね、楽しみです。<br />
けど「あれ？今までは3Dじゃなかったの？」と思いません？</p>
<p>どうやら最近話題の「3D」というのは、3次元コンピュータグラフィックスのことではなく、視覚的に立体的に感じられる技術のことを言うみたいです。</p>
<p>昨年話題になった「アバター」という映画では特別なメガネをかけることによって3次元に見せていましたが、Nintendo 3DSでは裸眼でも立体的に見えるらしいですね。<br />
「2次元の紙面上で3次元の話題はムズカシイ！」という Nintendo 3DS の凄さを伝えるのに苦戦していた記者のコメントが印象に残ってます。</p>
<p><span id="more-188"></span><br />
で、今回取り上げる「3D」は残念ながら昔ながらの3Dです。3次元コンピュータグラフィックス（3D-CG）の方。<br />
以降、3Dと書いたら、3D-CGのことだと思ってください。</p>
<p>2D と 3D の違いはどこにあるかと言うと、形を作った &#8220;後の行程&#8221; が存在すること。</p>
<p>2D の場合は、写真を加工したり、イラストを書いたりした時点でCGとして完成です。</p>
<p>ところが、3D の場合は、何か立体を作っただけではCGになりません。<br />
どこから光が当たるのか、どの角度から見るのか、影は付けるのか、反射はあるのか、奥行きはどこまで見えるのか、とにかく様々なことを設定しなければいけません。<br />
複雑な設定をすればするほど、計算時間もかかります。</p>
<p>この手順を大まかな流れを示すとこんな感じ。</p>
<div style="margin-left:30px;">
★立体作成（モデリングと呼びます）<br />
↓<br />
★環境設定（シーン設定などと呼ばれます）<br />
↓<br />
★設定に基づいて計算（レンダリングと呼びます）
</div>
<p>10年ぐらい前、2000年頃はシーンを設定してレンダリングして最終的な CG を作成するソフトは非常に高価で、1枚作成するのにも時間がかかりました。</p>
<p>しか～し、様々な技術が進歩して、ブラウザ上でもリアルタイムで 3D を表現できる手段も出てきています。</p>
<p>その中で1つ、FLASHで 3D を扱う方法をご紹介しようと思います。<br />
厳密には、ActionScriptを使ってプログラミングして、swf形式で出力する方法です。</p>
<p>Flash Player 10 の目玉として、3D機能が加わりました。ただ、色々と評価や評判を見ているとまだまだ試験的な雰囲気なようです。</p>
<p>けど、前から ActionScript 用の 3Dライブラリ はいくつか公開されており、実用上で全く問題ない完成度のものもいくつかあります。<br />
今後はActionScriptに取り込まれた3D機能も発展すると思いますが、まだ外部ライブラリを使った方が良さそうな感じです。</p>
<p>3Dライブラリで一番メジャーなのは Papervision3D でしょうか？<br />
デモはオフィシャルサイトを…と言いたいところなんですが、ちょっと重いんですよね。<br />
ライブラリの完成度は高いのにサイトの作りがイマイチなのが損してるなと思うけど、国内の情報量も考えて、まずは Papervision3D を試してみるのはオススメです。</p>
<p>■ Papervision3D 公式サイト<br />
<a title="Papervision3D" href="http://www.papervision3d.org/" target="_blank">http://www.papervision3d.org/</a><br />
（頑張って待っていると、迫力ある3Dが出てきます）</p>
<p>では、早速具体的なコードに入りましょう、、、と、<br />
書きたいキモチがいっぱいなのですが、紙面の都合上、本を紹介して終わりにしたいと思います ^-^;</p>
<p><a href="http://www.amazon.co.jp/gp/product/4774139378?ie=UTF8&#038;tag=scubism-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4774139378" target="_blank">Papervision3Dではじめる Flash3Dアニメーション</a><img src="http://www.assoc-amazon.jp/e/ir?t=scubism-22&#038;l=as2&#038;o=9&#038;a=4774139378" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><br />
<a href="http://www.amazon.co.jp/gp/product/476780924X?ie=UTF8&#038;tag=scubism-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=476780924X" target="_blank">Flash3Dコンテンツ制作のためのPapervision3D入門 (XK BOOKS for developers)</a><img src="http://www.assoc-amazon.jp/e/ir?t=scubism-22&#038;l=as2&#038;o=9&#038;a=476780924X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>上記の2冊ですが、大きな特徴として BasicView（Papervision3Dのクラス名） の扱いが違います。<br />
3Dは冒頭に書いたようにカメラやシーンなどの初期設定をしないといけないのですが、これらお決まりの処理をまとめてやってくれるのが BasicView というクラスです。BasicViewを使うとスッキリ書けるのですが、逆に言えば内部的に何をやっているのか理解しづらいとも言えます。デザイナー寄りな方には「Papervision3D入門」、プログラマまたは理系な方には「Flash3Dアニメーション」がオススメです。</p>
<p>僕個人的な感想としては、最初「Papervision3D入門」を読んで概要が把握できたけど、もう少し深い理解をしたいなと思って「Flash3Dアニメーション」を購入。期待通りでした。<br />
「Papervision3D入門」の方はカラーで、いくつか活用例も載っているので本をパラパラとめくりながらイメージしたい方には良さそうです。という点でもデザイナー寄りな方向けですね。</p>
<table width="90%">
<tr>
<td width="45%">
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=scubism-22&#038;o=9&#038;p=8&#038;l=as1&#038;asins=476780924X&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</td>
<td width="45%">
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=scubism-22&#038;o=9&#038;p=8&#038;l=as1&#038;asins=4774139378&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</td>
</tr>
</table>
<p>ところで3Dブーム、どうなんでしょうね？</p>
<p>僕自身は「3Dの時代が来た」という波を、大小あるとはいえ、発生しては消えていくのを何度も見てきたので今回も話題先行で終わっちゃうんじゃないのかなぁと思ってしまいますが…</p>
<p>とりあえず、Nintendo 3DSを早く観てみたいです！</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.s-cubism.com/blog/2010/06/21/188/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
