2010-12-08

Basic Design Patterns on Racket



今日でRacket(Scheme)授業の最後のLabが終了。最後のLabの内容は、基本のデザインパターンの復習。具体的には、「基礎のfunctionがしっかり書けていれば、例示されたComposing functionsは動くはずだよね?」という内容。なので、Composing functionsが正しく動かせるように、テストもコメントも含めてbasic functionsを書いていく作業を3時間弱ひたすらやってました。

最終的な成果はこんな感じです。そして、実際のソースコードはコチラ(Plain textではないので、開くにはDr. RacketなどのIDEが必要)。MapやFilterの基礎的な振る舞いが分かるかと思います。

参考になれば幸い。

2010-12-03

How to Select a Course




留学センターから近況報告書の期限が迫っているとの連絡があり、今つらつらと近況報告書を書いています。

この報告書の中には、自由記入欄なる箇所があって、そこで大学の授業選択の仕方について書いていたら、少しエッセイっぽくなってしまいました。そこそこ一般的なことをせっかく書いたのに、留学センターの人達と未来の交換留学生達にしか読まれないと思うと癪だったので、その一部をブログの方にも転載します。何かの参考になれば幸い。

----- 以下、転載 -----

Illinois州の中では、Knox CollegeとMonmouth Collegeでリベラルアーツカレッジの雌雄を競っているらしいが、いずれにせよトップランクの大学ではないので注意すべき。もし留学する理由が勉学に励むことであれば、下記に記すTIPS(授業、学生、生活)を考慮しておくと役に立つと思う。

まず、授業の質が教授によって異なることを留意する必要がある。上述の「履修科目と授業について」の説明欄でも述べているとおり、全ての教授が熱心に授業に取り組んでいるわけではない。また、一回の交換留学では、たかだか2学期分の講義(約8講義)しか履修できない。数少ない履修授業が、質の低い教授による質の低い授業だったのでは、実のある留学生活になるわけがない。そのため、留学先で意義のある授業を取るためには、質の高い教授を自分で見定める必要がある。

教授を見定める方法として、シラバス、ウェブ、対談の3つの方法がある。1つはシラバスから判断することである。熱心な教授であるほど、シラバスに授業方針、授業内容、今後出される全ての課題・プロジェクトなどの情報を詳細に記す傾向がある。シラバスの内容が手抜きであったり、今後どのように授業が進められるかイメージしづらいシラバスであったりした場合は、教授および授業の質を疑ったほうが良い。

一方で、シラバスだけでなく、Publicationやウェブ上の情報も、教授の質を判断する良い材料となる。理工学系の教授であれば、Microsoft Academic Searchが役に立つ。教授の名前を入力することで、その教授が過去に発表した論文と、そのCitationの数が分かる。もし教授の論文のCitationの数が少なかった場合は、少なくともトップレベルの教育は受けていないと考えてよい。また、RateMyProfessorというサイトで、各大学の教授を任意の学生が評価しているので、学生の視点から見た教授像を把握することができる。今期の教授について言えば、事実にかなり即している情報が載っていたので、全く信用できない情報ではないと思う。また、大学のHPから教授のページに探したりGoogleで検索したりして、その教授の詳細な経歴(学歴と職歴)を調べても良い。いずれの方法でも、教授の素性が全く掴めなかった場合、教授の質を強く疑ったほうが良い。(言い換えれば、全く話題に上がらないほど実績の無い、名ばかりの教授である可能性が高い。)

ここまでの全てのプロセスを経ると、だいぶ情報が集まっていると思うが、しかし、意思決定に必要な最後の判断材料は、自分と教授とのフィーリングである。どんな教授でも、メールで問い合わせれば、大抵の場合、授業の内容について対談の場を設けてくれる。それまでに授業に関する情報が集め終わっていることに越したことは無いが、そうでなくとも、その教授による授業を学びたいかどうか、個人的な価値観で判断することは可能なはずである。例えば、授業に関する内容のOpen-ended Questionや、履修を考えている動機を投げかけ、教授のスタンスや主張の立て方を見ることで、その教授の能力を知ることができる。そして、その教授の能力や話し方を観察し、自分自身が納得できるのであれば、その教授の授業を是非履修するべきだろう。

個人的な仮説だが、トップレベルの大学から離れれば離れるほど、その大学内にいる優秀な教授の割合が少なくなっているのではないかと思う。しかし、トップレベルの大学であろうとなかろうと、授業はたった1人の教授によって行われる。したがって、教授が十分に優秀であれば、大学によらず、十分に質の良い授業を履修できるはずだ。例えば、Vrije Universiteit Amsterdamは世界中で有名な大学とは言えないが、しかし、その大学にいるAndrew S. Tanenbaum教授の教え子達は、コンピュータサイエンスの分野で十分な成果を出している。せっかくの留学の機会を、少なくとも自分自身が納得のできる形で終わらせたいのであれば、熟慮を重ねた授業選択が不可欠ではないかと思う。

(以下は、留学先の大学における具体的な内容なので省略。)

----- ここまで -----

2010-12-01

Scheme Invader

一日遅れで、こちらも12月1日になりました。あと半月ばかりで夢の日本食にありつけるかと思うと、涙が止まりません。

Twitterでちょろっと叫んだような気がしますが、今日を持ってRacket (Scheme)の授業のFinal Projectが終わりました。作った作品は簡単なSpace Invaderです。Schemeで作ったのでタイトルはScheme Invaderにしました。で、せっかく作ったので、前回のVirtual ZooのようにYouTubeにアップロードしてみました。興味があれば是非見てください。




また、例によってソースコード一式はGitHubにアップされてます。ただ、Racketファイルはplain textではないので、DrRacketなどのソフトウェアで開かないとソースコードは見れないので注意してください。

2010-11-03

Virtual Zoo

以前の記事で少し述べてましたが、今週はRacket(Scheme)を使ったVirtual Zoo Projectもなんとか完成したので、連投します。

Virtual Zooとは、簡単なReal-timeペット飼育ゲームです。死に行く運命の亀さんと犬さん、そして無意味に画面を縦横無尽に飛び回るホタルを、Virtual Zooの中でどれだけ生かすことが出来るかを競います。「どれだけ生かすことができるか」と釘打ったものの、スコア機能を付け忘れたので記録することは出来ませんし、競うことも出来ません。また、DrRacketというRacket専用IDEが無いとゲームを動かせません。

これでただプログラムを公開しただけだと流石につまらないので、実際に動いてる画面をYouTubeにアップしました。参考程度にドゾ。


そんなゲームで大丈夫か?
大丈夫だ、問題ない。

以上、一発ネタでした。ごめんなさい。

- Project Description
- Racket Program (pdf)
- Virtual Zoo on GitHub




Design Portfolio




先週のProcess Simulatorに引き続き、今週はLayout & Designという授業のDesign Portfolio Projectの締め切りでした。Presentation ZenおよびZen Designを通してDesignに興味が湧いていたのがきっかけで、留学先でこの授業を取っています。学部時代にはDesignの授業なんて一切取ってなかったので、かなり新鮮な内容が盛りだくさんで面白いです。とりあえず分かったことは、プログラムを書くのと同様に、よりよいDesignについて考え始めると結構な量の脳内乳酸が発生するということです。


さて、Projectの話に戻すと、Design Portfolio Projectでは次の3つの作品を作りました。

- Flyer Ads
- Logo
- CD Package

使用したソフトはAdobe PhotoShop / InDesign / Illustrator / DreamWeaverの4つです。PhotoShopやInDesign, DreamWeaverは今までの経験と知識でなんとか使えそうではありますが、Illustratorだけは、自称絵の才能の無い人間としては四苦八苦の連続です。しかも未だに手応えが全くありません。そして上達する気配もありません。今までイラストから逃げ続けてきたツケが帰ってきた感じです。ただ、イラストが出来るようになると、個人のプロジェクトで出来る幅が結構広がるので、この機になんとか、少なくとも平均レベルぐらいまでには上げておきたいです。


なお、Design Portfolioで作った作品は次のページにて公開しています。
興味があれば覗いてみてください。

http://www.dcl.info.waseda.ac.jp/~y_yasukawa/design/index.htm

2010-10-22

Process Simulator



どうも、最近Blogの更新がご無沙汰でしたが、ちゃんと生きてます。最近、こっちの大学のOSの授業で、Simulation Exercises for Operating Systemなる面白い課題が出されたので、Process Simulatorなる作品を作りました。今回は、その公開を兼ねて投稿しています。

Process Simulatorとは、OS内のプロセスマネジメントをシミュレートするシステムです。このシステムでは、複数のプロセスが1つのCPUをどのように共有しているかを、1 clockずつ追うことができます。

各プロセスは、簡易プログラムを読み込み、そのプログラムの指示通りの計算を行います。例えば、あるプロセスが、簡易プログラム内の"B"というinstructionを実行すると、そのプロセスはRunning状態からBlocked状態に遷移します。Blocked状態に遷移したプロセスは、任意のタイミングで、Blocked状態からReady状態に遷移させることができます。

各プロセスの状態はScheduling時に影響を受けます。例えば、実行中のプロセスがPreemptedされたり、Quantumを使いきったりした場合、Ready状態のプロセスリストの中にある1つのプロセスをRunning状態に遷移させます。なお、このときのリストのアルゴリズムは、FIFO Queueです。

... (中略) ...

とまぁ、触りの部分だけちょっと説明しましたが、詳細はREADMEにばっちり書いてあるので、続きに興味のある方は下記のREADMEを読んでください。

例によって、今回もプログラム一式丸ごとGitHubの下記URLにアップロードしています。

          http://github.com/yasulab/process-simulator

GitでCloneする場合は、こんな感じでcloneできます。

          $ clone git://github.com/yasulab/process-simulator.git

なお、Mainプログラムはココから参照できます。


‥‥リファクタリング?
大丈夫だ、問題ない。


以上です。

ちなみに、来週までにVirtual Zooなる作品をSchemeで作る予定なので、ちゃんと期日までに完成していれば、来週はVirtual Zooを投稿しようと思ってます。

ではでは。




README
=======


*************************
***Process Simulator***
*************************
Author: Yohei Yasukawa
Date: 10/20/2010


Index
1. What's Process Simulator?
1.1 Command Format
1.2 Instruction Format
1.3 Scheduling Policy
1.4 Synchronizing Organization
1.5 Reference
2. How to run Process Simulator
3. Existing Problems
4. How to get latest codes
5. Sample Output


1. What's Process Simulator?
============================
This program simulates how proceses run on a CPU,
in order to understand how processes share the CPU.
It includes essentail organizations in operating systems,
such as Process and Scheduling.


1.1 Command Format
------------------
To use this simulator, you need to know some commands for handling a world of ProcessSimulator.
After starting the simulator, the input shell are appeared.
When the simulator needs inputs, you can type the following commands:

    Q: End of one unit of time
       - CPU consumes 1 instruction from programs, and execute it.
    U: Unblock the first simulated process in blocked queue
       - If there is a blocked process, move its state from Blocked to Ready.
    P: Print the current state of the system.
       - The state include PC, PID, PPID, Priority, Value, Time, etc.
    T: Terminate the system after printing the current state.
       - The printing is same as 'P' command.

*1 The capital or not does not matter (q, u, p, and t are also accepted).
*2 You can read the command description above when you type 'help'.


1.2  Instruction Format
-----------------------
When you type Q command, 1 instruction in a special program is executed.
The instruction has several types which include:
  
    S n: Set the value of integer variable to n, where n is an integer.
    A n: Add n to the value of the integer variable, where n is an integer.
    D n: Substract n from the value of the integer variable, where n is an integer.
    B: Block this simulated process.
    E: Terminate this simulated process.
    F n: Create a new simulated process. The new simulated process is an exact copy of
       the parent simulated process. The new simulated process executes from the instruction
immediately after this instruction, while the parent simulated process continues its
execution n instructions after the next instruction.
    R filename: Replace the program of the simulated process with the program in the file
       filename, and set program counter to the first instruction of this new program.

An example of a program for a simulated is as follows:
  
       S 1000
       A 19
       A 20
       D 53
       A 55
       F 1
       R file_a
       F 1
       R file_b
       F 1
       R file_c
       F 1
       R file_d
       F 1
       R file_e
       E    


1.3 Scheduling Policy
---------------------
When the simulator has more than 1 process,
processes share a CPU by the scheduling policy.

The scheduling policy used in the simulator is FIFO Queue with priority.
When context swiching happens, the process in the Ready State queue is dequeued.
Then, the process is assigned to the CPU, and it can use CPU for some ticks.
The tick the process can use is determined by the priority. The relationship
between priority and ticks are:

Priority | Quantum(ticks)
  0 |    1
  1 |    2
  2 |    4
  3 |    8

If the process are preemted by B instruction, or uses all its quantum,
the context switching happens again, and the next process in the queue will be assigned.


1.4 Synchronizing Organization
------------------------------
Process Simulation issues 2 main processes, Commander and Process Manager process.
Commander process waits a command from users, and if received it,
the process immediately sends it to Process Manager process.
Similarly, Process Manager process reports the state of processes by issueing
Reporter process. So, to communicate between processes properly,
we need synchronizing organization.

Although sleep() is famous for synchronizing, Process Simulater
synchronizes by using pipe(), which is one of the experimental challenges in this program.
The pipe synchronization is that one process sleeps on a piped file descriptor,
and another process executes particular instructions, and then, closethe piped
file descriptor. So, the sleeping process notices that the file descriptor are
no longer used, and then it stops sleeping and executes the next instruction.
As a result, pipe serves as a synchronizing organization.

You can read the specific code of the organization in main.c program.
The codes have a comment like "Pipe Synchronization".



1.5 Reference
-------------
For futher information, please read the "spec.pdf" file.



2. How to run Process Simulator?
=============================
To run the simulator, you need the following envrionment.
   - GCC version 4.2.1 (GCC version 4.* will be also satisfied.)
   - Linux (Debian is recommended, but any distritbutions should be okay.)

If you are satisfied with the environment,
you can run the simulator by typing following commands in your terminal.

   $ make clean
   $ make
   $ make run

In default configuration, 'init.prog' are read as an initial program to start.
If you want to read other program instead, please type the following command in your terminal.

   $ ./ProcessSimulator INIT_PROGRAM_NAME

Then, the targeted program determined by the command line arguemnt is read as an initial program.
The program name does not need to have ".prog" extention.



3. Existing Problems
-------------------------
In Process Simulator ver 1.0, the following problems were discovered.
Part of or all of them will be fixed in the next update.

- 1. Problem occurs when the program does not end with E instruction.
- 2. Over maximum number of process(256) stops the system.
- 3. Over maximum number of instructions in a program(64) stops the system.
- 4. Over maximum number of inputs(256) stops the system.


4. How to get latest code
-------------------------
If you would like to use latest version of Process Simulater,
please visit the following website.

    http://github.com/yasulab/process-simulator

Or, please clone the code by typing the following command.

    $ git clone git://github.com/yasulab/process-simulator.git

To clone the code, you need to install Git in advance.

Git - Fast Version Control System
http://git-scm.com/


5. Sample Output
----------------
This section explains how Process Simulator runs with an example.
We use init.prog and calc.prog as example programs.

NOTE:
init.prog and calc.prog are as follows:

init.prog:
 1: F 1
 2: R calc.prog
 3: E

calc.prog:
 1: S 1000
 2: A 20
 3: D 25
 4: A 35
 5: D 30
 6: E

To make a long behavior short,
the following is the process from start to end of the execution.

Tick | Process ID | Instruction | Memo
1.     pid=0:      F 1  pid=1 is created (Start from 2nd tick).
2.     pid=1:       R calc.prog
3.     pid=0:    E  pid=0's turn around time is 3 ticks. (3-0=3)
4.     pid=1:    S 1000
5.     pid=1:    A 20
6.     pid=1:    D 25
7.     pid=1:    A 35
8.     pid=1:    D 30
9.     pid=1:    E  pid=1's turn around time is 7 ticks. (9-2=7)

So, Average Turn Around time is 5 ticks.

The following is the output that
you can see when you actually run.

OUTPUT:
/Users/yohei/os-project% make
gcc -c main.c
gcc -o ProcessSimulator main.o
/Users/yohei/os-project% make run
make
gcc -o ProcessSimulator main.o
./ProcessSimulator init.prog
> q
> Command = q
End of one unit of time.
Instruction = 'F 1'
Create 1 new simulated process(es).
Created a process(pid=1).
Quantum was expired, so assign the first process in the que to CPU.
Pid(0)'s priority class was raised to 1.
New process was assigned to CPU.
Swithed: cpu(0) <--> pid(1)

> q
Command = q
End of one unit of time.
Instruction = 'R calc.prog'
Replace the program of the simulated process with the program in the file 'calc.prog'.
Quantum was expired, so assign the first process in the que to CPU.
Pid(1)'s priority class was raised to 1.
New process was assigned to CPU.
Swithed: cpu(1) <--> pid(0)

> q
Command = q
End of one unit of time.
Instruction = 'E'
Terminate this simulated process.
pid=0 is Terminated.
There are no process running, so assign the first process in the queue to CPU.
New process was assigned to CPU.
Assigned: cpu <--- pcbTable[1]

> q
Command = q
End of one unit of time.
Instruction = 'S 1000'
Set the value of the integer variable to 1000.
CPU value: 0 -> 1000
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'A 20'
Add 20 to the value of the integer variable.
CPU value: 1000 -> 1020
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'D 25'
Substract 25 from the value of the integer variable.
CPU value: 1020 -> 995
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'A 35'
Add 35 to the value of the integer variable.
CPU value: 995 -> 1030
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'D 30'
Substract 30 from the value of the integer variable.
CPU value: 1030 -> 1000
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'E'
Terminate this simulated process.
pid=1 is Terminated.
Program was successfully executed.

=== RESULT ===
*********************************************
The current system state is as follows:
*********************************************
CURRENT TIME: 9
AVERAGE TURN AROUND TIME: 5.000000.

RUNNING PROCESS:
queue is empty

BLOCKED PROCESSES:
Queue of blocked processes:
queue is empty

PROCESSES READY TO EXECUTE:
Queue of processes with priority 0:
queue is empty
Queue of processes with priority 1:
queue is empty
Queue of processes with priority 2:
queue is empty
Queue of processes with priority 3:
queue is empty
=== END OF SYSTEM ===

2010-09-24

How to Setup Ubuntu Server on Rackspace




Rackspace上にUbuntuサーバを作る度に、iptables設定やssh portの番号を変更するやり方を忘れてしまい、右往左往してしまうので、ちょっと今回のサーバ立て直しを機にメモをしときます。もし同じような境遇の人がいたら参考にしてください。

The following instructions are my memos for initial setup Ubuntu 10.04 server on Rackspace. After initializing, I often change my port number, because servers on Rackspace are often attacked by the port scan, so I recommend to change your port no. as soon as possible after your initializations.


Setup Ubuntu Server
================
0. Any information on Ubuntu 10.04 Server can be found in the following page.
http://cloudservers.rackspacecloud.com/index.php/Ubuntu_10.04_LTS_(Lucid)

1. Follow the articles to setup.
http://cloudservers.rackspacecloud.com/index.php/Ubuntu_-_Setup

2. Change your port number to make your server secure.
# emacs /etc/ssh/sshd_config

     # What ports, IPs and protocols we listen for
     #Port 22     <--- Comment out
     Port 12345 <--- Change port number as you wish

# /etc/init.d/ssh restart
# iptables -I INPUT -p tcp -m tcp --dport 12345 --syn -j ACCEPT
# /etc/init.d/ssh restart
# iptables-save > /etc/iptables.rules

3. Try to login the server from your computer.

$ ssh -p 12345 YOUR_UBUNTU_SERVER

If you can login your server, it's done.
Your server is now able to avoid from the port scan attack



Option: For Printing Japanese
=========================
$ apt-get install language-pack-ja
$ dpkg-reconfigure locales
$ update-locale LANG=ja_JP.UTF-8

Option: Print error message in English

# echo 'export LC_MESSAGES="en_US.UTF-8"' >> ~/.profile


References:
1. LANDISK HACKING DIARY
2. Ubuntuでロケール(ja_JP.eucjp)追加, なんとなくメモ

2010-09-19

アカウント名変更のお知らせ




twitterではちょろっとつぶやきましたが、次の理由から、アカウント名、およびそれに伴うURL名等を一斉に変更しました。

- 1. yasu_ninety9って読み方が分かりづらい。-> 覚えにくい
- 2. そもそも文字列が長い。-> twitterだと致命的
- 3. 日本語で4文字だと覚えやすい、らしい。(友人談)

お手数をおかけしてしまい申し訳ありませんが、もしリンクなど張っていた場合は、再度張り直して頂けると幸いです。なお、主な変更点は次の通りです。

- Twitter: @yasu_ninety9 -> @yasulab
- Web: http://www.arukou.sakura.ne.jp/yasulab/ -> http://www.yasulab.com/
- Blog: http://yasu1987.blogspot.com/ -> http://yasulab.blogspot.com/



留学生活も、もうそろそろで1ヶ月。ぼちぼち授業および課題の内容も高度になってきました。”徹夜なんて絶対したくない”と頑なに決意したものの、意外と慣れればどうにかなるもんです。いや、それでも出来ればしたくないものですが。

唯一の心のよりどころである少年ジャンプも、アメリカだと月刊少年ジャンプになるらしく、しかもブリーチとかNarutoとか一部の漫画しか載っていない。当然セリフは英語で、しかも価格は日本の2倍以上。これなんてイジメorz。マンガオンラインのさらなる発展を心から心から応援しています。

2010-09-09

OAuth on Simple Twitter Bot




僕は直前になるまで、というか、実際に仕様変更されるまで気付かなかったわけですが、今月の頭からTwitterのBasic認証が使えなくなったそうですね。従って、Basic認証を用いてTwitterのAPIを使用しているBot達は、仕様変更の日を境に、屍と化してしまっているそうです。

僕が作ったtango! botなども同様に、Basic認証を利用していたので、屍と化してしまいました。ですが、tango! botにザオリクを唱えて欲しい(?)というご要望に応えまして、先週末にOAuth認証システムを実装しました。

で、せっかく実装したので、Simple Twitter Botを例にとって僕の実装例を次の場所に置いておきます。参考になるかどうかは甚だ疑問ではありますが、もし何かの参考になれたら幸いです。



*main.py(要約)
#!/usr/bin/env python
#! -*- coding: utf-8 -*-

from appengine_twitter import AppEngineTwitter
from basehandler import BaseHandler, h
import twitter
import sys, os, pickle
from oauthtwitter import *

# User Setting and Run Twitter Bot
#debug_flag = True
debug_flag = False
MAX_LEN = 140
SEARCH_TERM = u'"hogehoge" OR foobar'
CONSUMER_KEY    = "???"
CONSUMER_SECRET = "???"
KEY_FILE_API    = "api_key.dat"
KEY_FILE_TWITTER = "twitter_key.dat"
BOT_USERNAME = "YOUR_BOT_NAME"
BOT_PASSWORD = "???"

def oauth_twitter():
   access_token = pickle.load(file(KEY_FILE_API))
   return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
                                                                      
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None

   self._urllib = urllib2
   self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)

def run(name, pswd, search_term):
   acc_token = pickle.load(file(KEY_FILE_API))
   gae_twitter = AppEngineTwitter()   
   gae_twitter.set_oauth(CONSUMER_KEY,
                         CONSUMER_SECRET,
                         acc_token.key,
                         acc_token.secret)

   results = gae_twitter.search(search_term.encode('utf8'), {'rpp': 20})
   api = oauth_twitter() 
   escape_user_list = []
   escape_user_list.append(name)
   
   # Get most corrently tweeted tweet
   status = api.GetUserTimeline()
   
   for s in status:
      if s.text.startswith("RT"):
         recent_tweet = s.text
         break
      else:
         print "The following tweet would be posted by hand, so skipped it."
         print "Tweet: " + s.text.encode('utf8')
         print
      
   print "Recent Tweet: "+recent_tweet.encode('utf8')
   print

   # Search Most Recent Tweet
   results.reverse()
   flag_enable = 0
   for i,result in enumerate(results):
      rt = "RT [at]" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      
      if flag_enable:
         print "I am going to tweet the tweet above."
         """
         Retweet and exit
         """
         print "I have re-tweeted: "+rt.encode('utf8')
         print "Result of my re-tweeting: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()
               
      if recent_tweet.replace("@", "[at]") == rt.replace("@", "[at]"):
         flag_enable = 1

   if flag_enable:
      print "There are no tweet found that I should tweet."
      exit()
   print
   print "There are no tweets recently tweeted, so tweet the oldest tweet."
   print

   for i,result in enumerate(results):  
      rt = "RT [at]" + result['from_user']  + " " + result['text']  
      rt_len = len(rt)

      print "I am going to tweet the tweet above."
      """
      Retweet and exit
      """
      print "I have tweeted: "+rt.encode('utf8')
      print "Result of my re-tweeting: " + str(gae_twitter.update(rt.encode('utf8')))
      exit()

# overriding API __init__
twitter.Api.__init__ = twitter_api_init_gae

# Start to run
run(BOT_USERNAME, BOT_PASSWORD, SEARCH_TERM)




*使い方(READMEから一部引用)
This bot runs in the following ways.

1. Search tweets using 'search_term' in Twitter.

2. Re-tweet the tweets.


HOW TO SETUP:
1. Register your OAuth client on Twitter
URL: http://twitter.com/oauth_clients
* you MUST choose 'client' for Simple Twitter Bot.

2. Run 'python register_pin.py' and
use CONSUMER_KEY and CONSUMER_SECRET you got from the registeration.

3. Change setting variables(e.g. CONSUMER_KEY, CONSUMER_SECRET) in main.py

4. Run Google App Engine dev_server and visit the following URL
URL: http://localhost:8080/cron/update
* If you finish all of your setting, set debug_flag in main.py off.

5. Done!

Enjoy developing your own twitter bot!

*他、ソースコード一式

*使ったもの
- App Engine Twitter
- python-twitter
- oauth-python-twitter
- Google App Engine

*参考にさせて頂いたサイト

2010-09-01

Background ver. 03







そろそろプロフィールが古くなってきたので更新。


----------------------------- 
Index 
・今 
・学部時代にやってきたこと 
・身を置いている所 
・目標 
・成果 
・告知 
・その他 
----------------------------- 
※2010年09月01日更新 


【今】 
・VMMでOSを並列に動かしたときに発生するLock-holder Preemptionについて研究中. 
・Monmouth College, Illinois, USに留学中. CS+Designの授業を取って創造力を研磨中. 
・航空業界におけるITベンチャー企業を発起中. 


【学部時代にやってきたこと】 
『IAESTE国際インターンシップ』 
2009年度のIAESTE派遣生として, チェコ共和国のプラハで2ヶ月間働いてきました. 現地の会社でやっていたことは, "Alvila"というOpen Source Softwareプロジェクトの立ち上げです. 詳細は下記のURLを御参考に. また, 現地での就労以外にも, 世界中の技術系の学生とフットサルしたり, カヌーしたり, 政治の議論したり, パブに行ったりと, 池に入ったり, 古城の屋上で寝たりなどなど, かなり面白い生活が送れました. おかげさまで, 世界中どこいっても(特に, EUあたりなら)宿代が浮かせることが出来そう. ああ, あと, 正直ね, ドイツ人はかわいいと思うんだよ. http://yasulab.blogspot.com/2009/10/alvila-opensource-software-project.html 

『自作OSの制作』 
企画:yasu_ninety9 
開発:yasu_ninety9 
広報:yasu_ninety9 
オレオレ詐欺です。昨今、一部の人たちに大変有名な、はりぼてOSの拡張を行いました。目的は、自作OS入門の読者向けに拡張例を提示することで、これから拡張する人を応援すること。ひいては、OS学習者および開発者が増えることを期待しています。したがって、ただ拡張結果を配布するだけではなく、「どうやって拡張したのか?」「どういった開発計画を立てたのか?」といったドキュメントも多くは配布しています。詳細は下記URLにて公開中。 http://www.arukou.sakura.ne.jp/yasulab/os/ 

『Web Applicationの開発&発表@Yahoo! Japan』 
僕とイギリス留学中の友達を中核にして、コツコツ開発してきたweb application ”tango!”をyahoo! Japanで発表しました。僕ら以外にも、色々な方々が開発およびデザインに参加してくれました。手伝ってくれた皆Thanks!しかしながら、結果から言えばyahoo! japanでの発表では入賞できませんでした。原因は明らかに僕のプレゼン力不足。生まれてきてごめんなs(ry。いやいや、でも"tango!"はまだまだ発展途上ッスよ!プレゼンの失敗など次で挽回すれば良いのさ!Googleさんが提供するGWT on GAEという素晴らしい開発環境も整ったことだし、tango!もこの流れに便乗して進化する次第であります! 
本家:http://www.arukou.sakura.ne.jp/yasulab/tango/ (準備中) 
Twitter: http://twitter.com/tango_bot 
* tango! on Twitterの方が現在盛り上がっています。 

『TOSHIBA summer internship(R&D), 予備校@AGOS』 
夏といえばsummer internshipの季節!2008年度の夏も例外なく就業してきました。 
平日:TOSHIBAのsolution部門で新技術の調査・開発。 
週末:予備校@AGOSでTOEFLのR/LとWritingの勉強 + そこそこ重いassignments / week。 
結論:死亡フラグ。 

『Berlitz pronounciationの修了』 
得たモノ:何度発音のテストをしても講師には"Almost"と言われ続けることに対する忍耐力。 
分かったこと:素直にアメリカ語学留学しとけばよかったorz。一人でひたすら勉強するのは自分の性に合わないらしい。 

『早大山岳アルコウ会HP & データベース"WAK DB"の作成』 
joomlaとDBQで作りました。CMSだと制作が楽!2008年4月現在、β版のため、正式な運用には至っていないけど、1,2年後には立派なDBになっていて欲しいな。 
WAK database(仮) http://www.arukou.sakura.ne.jp/component/option,com_dbquery/Itemid,28/ 

『アジア大学ビジネスアイデアコンテスト』 
2007年3月に北京大学で行なわれた 
"2007 KT&G Asian Students' Venture Forum 
-Business Idea Contest-"に第3位入賞。チームメンバーは当時全員1年生。何故かみんな怒Sか度Mな人だった。そんな両極端な6人で結成されたチームの成果。みんな凄い奴らだ。同期だし、俺も負けてらんないわ。あと、シンガポール人は頭良すぎ! http://asiansvf.com/ 

『第1回 日韓学生未来会議 企画・運営・指揮』 
2007年2月の大企画。途中から組織に加わったんだけど、なんか気付いたら色々やってました。人生初の大企画&運営でした。今は他の事をやっていて、あまり顔を出せないけど、今の自分が積極的に行動できるのは、この会議をやり通したからなんだろうな、と思う。後輩達が受け継いで繋いでいく第2回以降の会議にwktk。 http://www.jksff.org/ 

『フランス語学留学』 
2007年2月からフランスでフランス語勉強してました。フランス蝶最高!でもフライト時間長すぎだよワトソン君!今でもフランス語は大好きだし、もっと使えるようになりたいけど、最近は英語に若干浮気気味だったり。とりあえず、パリ近郊はお腹いっぱいだから南仏に行ってみたい! 

『Internship -擬似プロジェクト-』 
2007年9月に大阪まで行ってシステム開発の擬似プロジェクトに挑戦した。擬似プロジェクトでは、2年生のくせに何故か3,4年生のメンバー率いて頑張っとりました。最後まで自分のことを上級生だと思ってた人は数知れず。年齢詐称乙。しかし、結果は惨敗。工程管理とスケジュール管理でヘマを犯しました。おかげでシステム設計書とマニュアルが納品できなかった。すごく・・・悔しいです・・・。が、学んだことも多い。とりあえず、中小SIerでは働きたくないな、と思いました。 

『南アルプス縦走』 
2007年8月、頼れるメンバーと南アルプスの上から下まで長期縦走しました。でも2006年8月も南アルプスを上から下まで長期縦走してたから、実は今回で2回目。ただし、今回はスタート地点が北岳→仙丈ケ岳に、ゴール地点が椹島→畑薙ダムにグレードアップしており、距離と山中拍数が結構伸びてます。結果的には、泊数は12泊13日ぐらいだったかな(多分)。予備日も使う予定だったんだけど、メンバーの体力が皆キモ過ぎるレベルで結局一日も停滞しなかった。あ~、でも最近は山に登ってないな。おかげさまでメトボリックなお腹と化しました。 


【身を置いてる所】 
日韓「JKSFF」執行部広報OB 
山岳「早大山岳アルコウ会」 
BC「ドリーマーズ」 
FC「FCアトレティコ・ラッセーラ」創設者&幹事 
地域「地域スポネット『すぱんく』」スタッフ 
BC「『すぱんく』スポーツ開放」管理人代理 
BC「clubジョーダイ君」 
英語サークル「WRESS」 


【でっかい目標】 
・ネオNEET 

【最近の大目標】 
・TOEFL ibt 100点以上。 
・GRE ???点以上(未定)。 
・留学先でReferenceを貰えるだけの功績を残すこと。 

【他最近の目標】 
・英語で不自由なくdiscussion出来る 
・GPAをもっと高くする 

【最近の成果】 
・サーバ構築が出来るようになったような気がする。 
・WindowsからLinuxへ移行。が、その後Macに心変わり 
・基本情報技術者合格 

----- 以下、壮大な蛇足 ----- 

【告知1】 
現在FC『アトレティコ・ラッセーラ』の代表やっとります。入部からマッチメイク、宣伝・告知等など興味がありましたらお気軽にお尋ね下さい。 
HP→http://www.geocities.jp/atletico_l/ 
Mixi→http://mixi.jp/view_community.pl?id=1946980 
SNS→http://soccersns.jp/team/1884/ 


【告知2】 
『北区立赤羽中学校体育館バスケット開放参加者募集』 
現在、東京都北区立赤羽中学校体育館の夜間バスケット開放を行っております。で、僕がその管理人だったりします。 

興味のある方はコチラ↓。 
質問等は僕に直接メッセージでも可。 

「赤羽中学校バスケットボール開放」 http://mixi.jp/view_community.pl?id=1947170 


【告知3】 
『地域スポネット「すぱんく」の参加者募集』 
僕の地元である東京都北区には「すぱんく」という地域スポーツネットワークの団体があります。「すぱんく」では学校や公立の施設を利用して、住民の皆様に文化的な活動や健康的なスポーツ活動を楽しんでいただく「場」を提供しています。 

現在はサッカー、フットサル、バスケットボール、バトミントン、卓球、ダンスなどの種目を取り扱っているので、興味のある方、体を動かしてみたいと思っている方、是非お気軽にお尋ねください。 

公式web→http://www.web-spank.com/ 
Mixi→http://mixi.jp/view_community.pl?id=1942881 



【趣味】 
自分が聴いてる曲の紹介とか音楽観とか色々書いてあります。まぁどんな曲を聴いてるかってのは参加してるコミュニティ見てくれても分かうわ何するんだやm… 

あと、音ゲー全般(特にドラムマニア)が得意だったりします。 


【生息地】 
『Cafe Miyama』 
十中八九来ればいます。教科書やらPCやらプリントやら色んなものを散らかして勉強してます。そんな明らかに邪魔でしかない僕にも優しいMiyamaの店員には、きっとインテルはいってるに違いない。 


【注意】 
ログイン時間が『5分以内』になっていることが多いと思いますが、それは暇なんじゃなくて忙しい最中でもMixiを見るという心の余裕を常に持たせて、自分n(ry 


【思考回路】 
好奇心>>>>>(越えられない壁)>>>>>羞恥心


【座右の銘】 
    かけてよし! 
     (゚Д゚ ):. _  
    r'⌒と、j   ヽ 
    ノ ,.ィ'  `ヽ. / 
  /       i!./ 
 (_,.         // 
 く.,_`^''ー-、_,,..ノ/ 
    

  かぶってよし! 
    /(*゚Д゚)  
    / :::У~ヽ 
   (__ノ、__) 


  まるまってよし! 
     '⌒⌒'⌒ヽ   
   (゚Д゚* ),__) 


    お布団サイコー!! 
      ( ゚∀゚ ):. _  
     r'⌒と、j   ヽ 
    ノ ,.ィ'  `ヽ. / 
   /       i!./ 
    (_,.         // 
  く.,_`^''ー-、_,,..ノ/ 



どうみてもモフモフです。 
本当にありがとうございました。

2010-07-18

言葉は躍る。 tango! on Twitter



先日投稿したSimple Twitter Botの開発経験を踏まえて、2年前に開発していたweb application"tango!"を、Twitter用に移植したアプリケーション「tango! bot」を開発致しました。

タイトルにもあるように、tango! botのコンセプトは
「言葉は躍る。」です。
このコンセプトを土台に、次の2つの機能をtango! botに実装致しました。

1. 定期的にランダムな単語の群れをつぶやく

この機能は、tango!の元々のアイデアである

"思考に行き詰った時、何か考えもしないようなひらめきが欲しい時、地球の裏側からやってきたような言葉のカケラ達があなたの創造力をかき立てます。"

を、twitterで実現したものです。あなたの創造力をかき立てるため、tango! botは言葉のカケラ達を次々とつぶやいていきます。

"金鈴 青天白日 入獄 演者 病原・病源 満杯 必殺技 飯店 気孔 oboe 導く 麻布 放送衛星 買い戻し 活きる"


2. お題が出されたら、そのお題を用いた単語をつぶやく

この機能は、tango!の構想に新たに取り入れた新機能です。お題を頂いたとき、そのお題を用いた奇妙な単語たちを生成し、つぶやいた方に向かってtango! botがリプライします。

お題は、次のように出題することができます。

     "@tango_bot 言葉"

すると、数分後に、次のような言葉のカケラ達が返ってきます。

     "@username 海浜言葉 実の父言葉 綿言葉 えいさあ言葉 親犬言葉 騒ぎ言葉 和ます言葉 講演会言葉"

ただ、この機能は現在開発中の機能なので、うまく動かないことがあります。そのときは、'今日のtango_botが不機嫌だったんだなぁ'と思って、ご容赦して頂けると幸いです。

以上がtango! botの概要です。
これらの機能を用いて、皆さんの創造力が、より掻き立てられることを切に願います。

tango! bot URL: http://twitter.com/tango_bot

開発:@yasulab
企画構想:@Migihiza



追記1:
@Migihizaが彼のブログにて、tango! botの具体的な利用方法について解説しています。面白い使い方を思案しているので、是非一度訪れてみてください。


追記2:
tango! botのソースコードはGithubにて公開致しました。次のURLからアクセスするこどができます。

     http://github.com/yasulab

Gitを使っている方は、次のコマンドでcloneすることができます。

     git clone git://github.com/yasulab/tango-bot.git

なお、なるべく早くtango! botを公開したかった(というか週末中に完成させたかった)ので、リファクタリングなどは完全に後回しにしています。従って、現状のソースコードはかなり汚いです。余裕があるときに、コードを書き直すつもりです。多分。。。

2010-06-28

Simple Twitter Bot on Google App Engine




久々の更新です。mixiやtwitterなどで既につぶやきましたが、先週の週末に衝動的にtwitter botを作ってしまいました。このBotは次のように振る舞います。

1. Twitter上のつぶやきの中から、任意の単語が含まれるtweetを集める。

2. そのtweetをRe-tweetする。

以上です。
実際には例外処理などの細かな処理も含まれていますが、大まかな振る舞いは上述の通りです。この一連の処理を、cronを用いて1時間毎に1回実行します。

下記に、実際のコードの一部(main.py)を引用します。
Twitter Bot作成の参考になれたら幸いです。

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

from appengine_twitter import AppEngineTwitter
from basehandler import BaseHandler, h
import twitter
 
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None

   self._urllib = urllib2
   self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)

def run(name, pswd, search_term):
   gae_twitter = AppEngineTwitter(name, pswd)
   results = gae_twitter.search(search_term.encode('utf8'), {'rpp': 20})
   api = twitter.Api(username=bot_username, password=bot_password)

   # Get most corrently tweeted tweet
   status = api.GetUserTimeline()
   
   for s in status:
      if s.text.startswith("RT"):
         recent_tweet = s.text
         break
      else:
         print "The following tweet would be posted by hand, so skipped it."
         print "Tweet: " + s.text.encode('utf8')
         print
      
   print "Recent Tweet: "+recent_tweet.encode('utf8')
   print

   # Search Most Recent Tweet
   results.reverse()
   flag_enable = 0
   for i,result in enumerate(results):
      rt = "RT @" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      if flag_enable and result['from_user'] != bot_username and rt_len < max_len :
         """
         Retweet and exit
         """
         print "Re-tweet: "+rt.encode('utf8')
         print "Re-tweet Result: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()
               
      if recent_tweet == rt:
         flag_enable = 1

   if flag_enable:
      print "There are no tweet found that I should tweet."
      exit()
      
   print "There are no tweets recently tweeted, so tweet the oldest tweet
   for i,result in enumerate(results):
      rt = "RT @" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      if result['from_user'] != bot_username and rt_len < max_len:
         """                                                                    
         Retweet and exit                                                       
         """
         print "Re-tweet: "+rt.encode('utf8')
         print "Re-tweet Result: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()

# overriding API __init__                                                       
twitter.Api.__init__ = twitter_api_init_gae

# User Setting and Run Twitter Bot                                              
bot_username = 'CafeMiyamaBot'
bot_password = '???'
max_len = 140
search_term = u'Cafe Miyama'
run(bot_username, bot_password, search_term)

なお、上述のコードには、cronの設定などは含まれていません。
詳細な振る舞いおよび設定を知りたい方は、下記のコマンドでcloneしてください。

     $ git clone git://github.com/yasulab/Simple-Twitter-Bot.git

もしくは、下記のGithubレポジトリに直接アクセスしてください。

     http://github.com/yasulab/Simple-Twitter-Bot

bot_usernameとbot_passwordの内容を別のtwitterアカウントに書き換えて、お手持ちのGoogle App EngineのアカウントにdeployするとTwitter Botが動くと思います。加えて、search_termを任意の単語に書き換えれば、オリジナルTwitter Botの出来上がりです。


参考にさせて頂いたサイトおよびコード:
1. Python Twitter, Google Code
http://code.google.com/p/python-twitter/

2. Google App Engineで手軽にTwitterアプリを作成!
http://0-oo.net/sbox/python-box/appengine-twitter

2010-05-24

NHK白熱教室 - 第4回「この土地は誰のもの?」ノート




そろそろ、ノート取らないと全然内容が理解できなくなってきそうなので、メモを取り始めました。が、メモを取ってもやっぱし分からないところは分からない。実際、納得できない主張や理論については全て疑問形の文としてメモしていたのですが、いざ自分の取ったメモを読み返してみると、疑問文が多すぎるw。真面目に理解しようとしたら、ちゃんとReading Listも読まないとマズいですね。本業の方のReading Listも溜まっているので、そこまで読む気には中々なれませんが。。。

参考:
第4回「この土地は誰のもの?」, NHK白熱教室



Lecture 7: 土地略奪に正義はあるか
===============================
ジョン・ロック
ーリバタリアンの味方
ーー例え民主的に選ばれた政府であっても、犯せない権利がある
ーーーe.g. 生命/自由/財産に対する自然権
ー財産権
ーー政治以前のものである=自然権である
ーーー政府が存在する前から存在するもの
ー法律が出来る前の状態/法律が出来る前の状態を考えるー>自然状態(=自由な状態)
ーー人間は自由で平等ー>階層は存在しない。王や農民などはダメ
ーーただし、自由≠好き勝手
ーー自然状態でも法律が存在する。ー>自然法
ー自然法によって制約される行動とは?
ーー自然権を手放したり、取り上げたりすること
ーーーe.g. 生命/財産の権利
ーー自分を奴隷にすることもできない??? -> 完全なリバタリアンではない。

2つの答え:
ー1. 生命/財産は自分のものではない。神の創造物???
ーー神なんているの?信じていない人はどうするの?
ーー自由≠好き勝手でないと説いた。矛盾してない???
ーーー不可譲。e.g. 航空券は譲渡できない。
ーーー誰かのものではない。
ーーーcf. アメリカ独立宣言
ーーー不可譲の権利:自然状態から持っている権利。
ーー財産の場合は?
ーーー政府が無くても私有財産が存在するのか?
ーーーその人の中では存在している???
ーー私有財産についてはリバタリアンの考え方と同じだが、他は違う。

エイズの薬の特許の話:
ー医薬に関しては、特許を尊重しなければ、色々な人が助かる?
ー作り出すための研究開発のコスト/モチベーションは?
ーこのとき、私有財産権はどうなる???

ネイティブアメリカンの話:
ーアメリカの入植者がネイティブアメリカンから略奪した行為の正当化である?
ーー証拠はない。また、統治時は戦争状態だから、状況が違う。双方の同意が無い。
ーーロックの理論によれば、ネイティブアメリカンは既に土地を占有していた。ただし、主張はしていなかった。

政府のあり方:
ー私的所有権は絶対化される。政府もその権利を犯せない。
ーしかし権利が絶対化されることは政府によって定義される。

ー2.  ???
ーー???
ーー???



Lecture 8: 社会に入る「同意」
============================
同意なしで私有財産権を持つことは可能か?
ー例外:他者のために、充分なリソースがある場合に限り、ロックの理論は適用される。
ー同意とは?
ーーe.g. くじ引きに同意/殺害に対する同意
ーー正当な政府の基礎は同意にある?

同位に基づいて設立された政府には、何ができるのか?
ー復習:自然状態とは?
ーーなぜ政府など作ったのか?
ーー自然状態の不都合な点
ーーーe.g. 誰もが自然法を実行できる/誰もが執行者である
ーーーーe.g. 泥棒を勝手に処罰できる
ーー人は、自分が判事になると我を忘れる?
ーーー行き過ぎた侵略/行き過ぎた処罰->いずれは、不可譲の権利を享受出来なくなる。
ーー人は、戦いを仕掛けてくる人を処罰出来るー>力と暴力の世界
ーー人は、故にそういった世界から離れたくなる。ー>同意
ーー他の皆に同意をする。
ーーー他の皆:協定や社会契約に参加したい全ての人々
ーーーマジョリティが決めたことに、皆従う。
ーーーvs. 自然権との兼ね合い。
ーーーー疑問:多数はどれほどの力を持てるのか?

少数派に課税することはなぜダメと思われるのか?
ー自然権を侵害することになるから

社会に入る理由=自然権を守りたいから?
ー所有権は””コミュニティの法”によって制定される。
ー所有権は政府が定義するもの?
ー多数派の同意で決まる?
ー財産権も含まれる?
ー財産を恣意的に取り上げることは違法。
ーしかし、何を持って財産とみなすか/財産を取り上げたとみなすか?
ーーそれは、政府が定義していいの?
ーー定義して良いのならば、同意の果たすやることは大きいー>大きな政府が必要?

社会に参加することに同意したのか?
ー祖先が社会に参加することに同意した?
ー同意はサインではない?暗黙的に同意が有効である?
ー捕まらなければ税を払わない?

徴兵制や生命に対する権利:
ー不可譲の権利は持っているが、放棄する権利は持っていない
ー同意する際に権利を放棄することが出来ないから、政府は制限できない。
ーーもし放棄がゆるされないのならば、なぜ徴兵制のような生命を脅かすことを強制出きるのか?
ー人の権利を恣意的に犯すのはダメだが、法律を通して無作為に選ぶのは良いのか?
ーー恣意的でなければ、例えば、人の生命の権利を犯すことは許されるのか?

ロックは想像上の世界について理論を展開させていたわけではない。
ー当時の現実世界の現状を見て、理論を展開させたかもしれない。
ーー???

次回:
ー同意は、どのような働きをもたらすのか?
ー同意の限界とは?

まとめ:
ー多数派が権利を侵害することは許されない?
ー政府は法律という形で課税?

2010-05-23

Google Sitesのページを移行する方法



最近、Google Appsが提供しているサービスの1つ"Google Sites"をよく使わせて頂いています。結構便利で、ページの複製やテンプレートの作成が出来るだけで無く、Google DocsやGoogle Calendarの内容をウェブサイトに表示させることも出来ます。特に、Google Docsで1つのまとまった情報をファイルとして作成し、Google Sitesで各ファイルを整理することで、肥大化していく情報量を短時間でスッキリさせることができるので、思考を整理するツールとして中々の優れものだと個人的には感じています。


今日は、このGoogle Sitesで複数のドメインを所持しているとき、ドメイン間でウェブサイトを移行する(より正確には、複製する)方法について記します。例えば、"aaa.net"のwikiページを, "bbb.net"に移行させる場合は、次の方法で移行することができます。

1. Google Appsのページから"aaa.net"にログインし、Google Sitesのページに飛ぶ。

2. 移行させたいページ(今回はwikiページ)に飛ぶ。

3. 右上の"More actions"をクリックし、"Share this sites" をクリック。

4. "bbb.net"のユーザを、"as owners"として招待する。
※もし他ドメインのユーザを招待できないように設定している場合は、その設定を解除しておく必要があります。

5. "Sign out"をクリックし、ログアウトする。

6. ログイン画面が表示されたら、左下部にある"Sign in with a different account"をクリック。

7. "Enter your email address:"に"USERNAME@bbb.net"を入力し、ログインする。
※URLに"aaa.net"が含まれていて、ログインユーザに"bbb.net"が含まれていたら成功。

8. 再度wikiページに飛び、"More actions" -> "Manage site"をクリック

9. 左中央にある"General"をクリックし、ページ下部の"Copy this site"をクリック

10. 任意のサイト名とURLの設置場所を指定し、"Copy site"をクリックして終了。
※成功していたら、"bbb.net"のGoogle Sitesに, "aaa.net"のwikiサイトが複製されているはずです。"aaa.net"のwikiページが不要である場合は、"Delete Page"でそのページを削除することができます。


以上です。



参考にさせて頂いた資料:
Moving a Google Site out of an Educational Domain



オマケ:
どうやら2009年にGoogle Sites APIsというサービスが発表され、2010年現在Google Labsで鋭意開発中のようです。上記の一連の動作を数クリックで出来るアプリとかあると便利かもですね。

2010-05-18

Hackbench on xv6



Xv6[1] is a pretty good material for OS learners, but one thing I am concerned is that how I benchmark xv6 after I developed or changed it. For example, xv6 has really simple scheduling algorithm that we easily understand, so that it may be a good idea to develop  scheduling algorithm to improve xv6 performance. However, one problem I met was how should I benchmark it? Therefore, I have modified 'hackbench.c', one of the simple benchmarking program, and now it can run on xv6. So, if you need to benchmark your implementations like me, you can download xv6 with hackbench by typing the following command:

     $ git clone git://github.com/yasulab/hackbench-on-xv6.git

Or, you can directly download it from

     http://github.com/yasulab/hackbench-on-xv6

That's it.
Enjoy xv6 life!

[1] en.wikipedia.org/wiki/Xv6

IAESTE研修報告資料




先日投稿したOpentrackerや, 以前から使用していたGoogle Analyticsの解析結果を見ていると, どうやらこのBlogを訪れる人の約20-30%は, IAESTE関係の情報を探す目的で, このBlogに来ているようです.

そこで, 以前僕がIAESTE研修報告会で発表した内容を, Slide Shareにアップロードして置きました. Web上には, IAESTEに関するテキスト情報が既に十分載っていると思うので, メディアファイル中心の資料構成になっています. IAESTEへの応募を検討している人や, IAESTE派遣生で研修期間中の仕事や生活が未だよくイメージできていない人にとって, 何かの役に立てば幸いです.


※フルスクリーンで見たい場合は, "presentations"をクリック後,
スライド右下にある"full"ボタンをクリックして下さい.

また, より具体的な仕事内容や, イベント内容を知りたい方は, 次のバックナンバーを参照して下さい. 僕の今までに投稿した記事の中で, IAESTEに関する記事の一覧となっています.

"IAESTE"のラベルが付いた投稿記事一覧
yasulab.blogspot.com/search/label/IAESTE

なお、2010年度の説明会等の日程は以下の通りだそうです。色々な大学で説明会が開かれるので、ちょっとでも興味がある方は参加してみると良いと思います。ちなみに、津田塾@5/24(月)と早稲田@5/25(火)は僕が研修報告をする予定になっています。

以下、告知文からの引用
----------------------------------------------------------------------------

こんにちは!
私は今、「IAESTE」という理系の国際インターンシップを支援する団体の学生ボランティアをしています。 この度、IAESTE国際インターンシップ説明会を行うことになったので、この場を借りて広報させていただきます!

IAESTE(イアエステ)は、理工農薬系の学生を対象とした、海外へのインターンシップを支援している国際非営利団体です。 世界約5000社の企業の後援をもとに約80カ国が加盟し、これまで30万人近い学生に国際インターンシップの場を提供しています。 日本では文部科学省を主管官庁とする社団法人として活動しています。

IAESTE国際インターンシップでは、社会の一員として企業や大学の職務に携わることによって、責任感や協調性を身につけ、知識や技術を高めることができます。 さらにインターンシップを海外で行うことによって、語学力も磨くことができます。 また留学とは違い、IAESTEインターンシップでは給与が支給されます! 研修先によって違いはありますが、生活費の大半はその給料でまかなえるため、他の多くの留学プログラムと比べて経済的負担が少なく済みます。

研修中は、現地のIAESTE学生委員からサポートを受けることができます。 そして現地の学生ならびに世界各国から集まる志の高い研修生たちと交流することができます! 研修期間は原則として8~52週間です。多くの研修は夏季休暇を利用した8~14週間で行われています。

以下、説明会の詳細です。
******************************
IAESTE国際インターンシップ説明会

日時:2010年5月29日(土)12:15~13:30
場所:早稲田大学西早稲田キャンパス
55号館1階大会議室
※参加費無料、服装自由、予約不要、入退場自由です。

<タイムテーブル>
11:45~     受付開始
12:15~12:35  IAESTE説明
12:35~13:30  派遣生OB・OGによる研修報告

他に学内説明会;
2011年度IAESTE国際インターンシップに関する説明会を下記のとおり開催いたしますので、お近くの会場へぜひご来場ください。いずれも参加費は無料です。


お茶の水女子大学

5月26日(水) 12:30~13:00 理学部1号館 415教室


慶應義塾大学

5月14日(金) 12:15~13:00 矢上キャンパス ディスカッションスペース 43

5月19日(水) 12:15~13:00 矢上キャンパス ディスカッションスペース 54


上智大学

5月11日(火) 12:30~13:30 1-206


津田塾大学

5月24日(月) 12:10~12:55 小平キャンパス 1112教室

5月25日(火) 12:10~12:55 小平キャンパス 1112教室

5月26日(水) 12:10~12:55 小平キャンパス 1112教室


東京大学

5月18日(火) 12:10~ 本郷キャンパス工学部2号館 電気系会議室3

5月21日(金) 12:10~ 本郷キャンパス工学部2号館 電気系会議室3


東京工業大学

5月19日(水) 12:30~ 大岡山地区南4号室2階 S423教室


東京農工大学(海外派遣留学説明会内で実施)

5月12日(水) 12:10~12:50 工学部13号館5階 505教室

5月26日(水) 12:10~12:50 農学部本館2階 21教室


東京理科大学

5月27日(木) 18:00~ 神楽坂校舎 344教室

6月3日(木) 18:00~ 野田キャンパス講義棟K503

6月7日(月) 18:00~ 九段校舎 KS102


早稲田大学

5月25日(火) 12:20~13:00 西早稲田キャンパス62号館 1階中会議室

******************************

その他詳細情報は、
http://iaeste-tlsc.jpn.org/haken/ 
http://iaeste-tlsc.jpn.org/mhaken/ 
に掲載しています。
何かご不明な点がございましたら、お気軽にお問い合せ下さい。
お問い合せ:TLSC@iaeste.or.jp
長文を読んで下さり、ありがとうございます。
少しでも興味のある方は、ぜひご参加ください!

----------------------------------------------------------------------------

2010-05-17

Opentracker Screenshots

Google Anlyticsよりもリアルタイム性があり、また高精度なデータ解析を行ってくれるという噂のOpentrackerを試してみました。

今日Opentrackerに登録したばかりなのに、既に結果が反映されているところをみると、やはり噂どおりの優れたリアルタイム性を備えているようです。加えて、少なくともGoogle Analyticsで抽出できる情報は、全て網羅しているようです。

以下は、Opentrackerのスクリーンショットです。特徴的なページを中心に撮影しましたが、まだまだ色々な機能がありそうです。ワクテカ。何か面白い機能が見つかったら、別途報告します。




Summary Trend


Online & Recent Visitors


Source Overview


Visitors by Search Term


Bounce Rate


Browsers


Hourly Trends


Operating System


Most Popular Pages

2010-04-23

Share folders with VMware Player between Linux(Host) and Windows(Guest)




図. 画面左がDebian(Host), 画面右がWindows(Guest)

先日ちょろっとtweetしましたが、IEがどうしても必要になってしまったので、仮想マシン上でWindowsを動かせるようにしました。で、今後のためにも、とりあえずLinux, Windows間の共有フォルダは必要だなぁと考え、設定してみました。以下は、その過程のメモです。

*古いバージョンのVMware playerでは、Samba等を使わなければ共有できないようですが、僕がインストールしたVMware player 3.0.1では、特に何もインストールしなくても共有出来ました。

なお、Host/Guest OS等の環境は以下の通りです。

Host: Debian 5.0 (lenny)
Guest: Windows XP SP3
VMware player ver. : 3.0.1 



共有フォルダの設定方法メモ
======================
(0. VMware playerとWindows OSのisoを手に入れて、動かせる状態にします。)

詳細は省きますが、もし以下のようなエラーメッセージが出たら、以下のコマンドで解決できます。

ERROR: modinfo: could not find module vmmon
ERROR: modinfo: could not find module vmnet
ERROR: modinfo: could not find module vmblock
(...以下省略)


     $ sudo aptitude install build-essential linux-headers-($uname -r)
※ "uname -r"で出力される値を上記コマンドの末尾に加えます。




     $ sudo /usr/bin/vmware-modconfig --console --install-all
もっと詳細な情報はコチラ



1. File -> 設定 -> Download All Components Nowを押して、最新の状態にする。

2. VM -> settings -> Options ->Shared Foldersに行き、Folder Sharingの設定を"Always enabled"にする。

3. "Map as a network drive in Windows guests"にチェックを入れる。

4. 同画面の"Folders"の設定で、"Add..."をクリック

5. 適当な名前(e.g. share)と、共有したいフォルダを指定し、"OK"をクリック。

※ VMware player側から書き込みをしたければ、Enabledのみチェックする。

6. "Save"をクリック。

7. Windowsを起動して"マイ ネットワーク"のネットワークドライブに指定したフォルダがあれば成功です。

※ もしかしたら、"ネットワークに接続している UPnPデバイスのアイコンを表示する"をクリックしないと、共有フォルダが表示されないかもしれません。




P.S.
デスク上の透過性(?)が向上しました。
x2xと組み合わせる事で、3 Screens(左から順にDebian on core i7, Debian on Inspiron, Windows on core i7) + 1 device(Inspironに付属してるデバイス)を実現。オンデマンドシステムのようなIEじゃないと使えないシステムは仮想化Windowsで対応しつつ、それ以外の処理はLinuxで作業してる図。


VMware Player 3.0.1では、OS間のマウスポインタをデフォルトで共有しているので、x2xと組み合わせるとLaptop/Windows間もサクサク動きます。ただ、当然ですが、Clip Board Bufferなどは、Guest/Host間でしか共有していないので、例えばcore i7上でコピーした情報は、GuestであろうがHostであろうが、Laptop上にペーストすることができません。さて、どうしたものかなー。