Google App Engineで日本語を使う

日本語を有効にする
Google App Engineのソースコードに日本語を記述すると、下記のようなエラーが表示されます。Google App Engine Launcherでは正常に動作してしまうので、はまりどころです。

: Non-ASCII character 'x93' in file /base/data/home/apps/mikahosi-1/1.338233447893773564/helloworld.py on line 11, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details (helloworld.py, line 11)

日本語で動作させるためには、下記の一行をソースコードの先頭に記述します。

# -*- coding:utf-8 -*- 

UTF-8以外の日本語コードはGoogle App Engine RuntimeとPythonの都合で通らないらしいです。
またPythonで日本語定数文字列を記述するには下記のように先頭にuを追加する必要があります。

text = u"日本語を出力"

Google App EngineをDeployしてみる

Google App EngineにApplicationを作る
最初にGoogle App EngineにApplicationを作成します。Google App Engine LauncherのDashbordボタンをクリックしてGoogle App EngineのWEBサイトを開きます。
AppEngine1
Preiewの画面からCreate An Applicationをクリックして新規にアプリケーションを作成します。この時に指定するApplication Identifierは、ApplicationのNameと一致している必要があります。このアプリケーションの例ではmikahosi-1となります。Application Titleも必ず入力しなくてはなりませんが、こちらは任意の文字列で構いません。
Google App EngineにDeployする
Google AccountからApplicationを作成したら、Google App Engine LauncherのDeployボタンをクリックします。下図のログオン画面が表示されますので、ログオンアカウントパスワードを入力してログインします。ここで項目名がmailとなっていますが、指定するのはメールアドレスではありません。Googleのアカウント名(Google Mailと@より前の部分)を入力します。メールアドレスを指定するとログインできません。
AppEngine2
初めて使用する場合には、CAPTCHA認証を要求される場合があります。その場合にはDeployment To Googleのコンソール表示にURLを表示します。ブラウザで指定されたURLに接続して、CAPTCHA認証を行ってください。
AppEngine3
以上で無事にGoogle App Engineに作成したアプリケーションをアップロードできたはずです。Google App EngineのWEBサイトにて割り当てられたURLに接続してみてください。
ちなみに作成した掲示板サンプルは下記のURLにアップロードしてあります。
http://mikahosi-1.appspot.com/

DataStoreを使ってみる

オブジェクト指向データベース(ODBMS)
クラウド独特のデータストアを使う前に、オブジェクト指向データベース(ODBMS)について知っていると入りやすい。
ODBMSは1980年代後半から、1990年代前半にかけて、様々なオブジェクト指向開発の試行錯誤と研究の中で生まれ、そして殆ど実用される事無く消えつつあった技術です。要は「オブジェクト指向分析の中で表現したデータクラスを、データクラスのままストレージに格納して扱えば、オブジェクトをそのまま表現できて扱いやすいんじゃね?」という発想でした。それまでのストレージはRDBMSに代表される表形式の物で、そこにデータクラスを格納するには非効率な変換処理(ORマッピング)が必要だったのです。
でもODBMSという試みはあまり上手くいきませんでした。ODBMSはリソースを大量に消費するとか、検索が遅いと言った、実装上の問題を抱えている事が多かったのです。その試みはORDBMSやORマッピングやLINQなどとして現在も続いています。そしてクラウドもODBMSを実現するための一つの答えになるものと私は思っています。
初期のODBMSで問題となっていたリソースの消費は、クラウドが安価なリソースを提供することで解決されました。RDBMSとは全く異なるパラダイムの上に成り立っているので、当初は混乱するかもしれません。ですがODBMSはオブジェクト指向開発の効率を大きく高め得るものです。積極的に取り組んでいく価値は高いと思っています。
DataStoreの定義
データの定義は簡単です。以下のようなクラスを定義するだけです。”text”、”date”がメンバ変数です。この二つの値がDataStoreに保存されます。

class GuestComment(db.Model):
text = db.StringProperty(required=True)
date = db.DateTimeProperty(required=True)

データを保存したいときには、クラスメンバのput()を呼び出します。データを読み出す場合はall()で全データを読み出せます。

class MainPage(webapp.RequestHandler):
def post(self):
text = cgi.escape(self.request.get("content"))
text = text.replace("rn", "<br>")
text = text.replace("r", "<br>")
text = text.replace("n", "<br>")
if len(text) > 0:
com = GuestComment(text=text,date = datetime.datetime.now())
com.put()
self.makeHtml()
def get(self):
self.makeHtml()
def makeHtml(self):
self.response.out.write("""
<html>
<body>
<form action="/" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>""")
comList = GuestComment.all()
for com in comList:
self.response.out.write('Wrote Date : ')
self.response.out.write(com.date)
self.response.out.write("<br>")
self.response.out.write(com.text)
self.response.out.write("<br>")
self.response.out.write('<hr>')
self.response.out.write('</body></html>')

一部のデータだけを読み出したい場合や、並び順を入れ替えて読み出したい場合にはGQLで指定します。RDBMSで使用するSELECT文とほぼ同様の物なので、すぐに理解できると思います。

comList = GuestComment.gql(“ORDER BY date DESC”)

RDBMSのようにリンクを指定するにはどうするのかって?そこがODBMS独特の部分です。例えばユーザーに関するデータを掲示板への書き込みと同時に保存したい場合、そこにはユーザーを表すクラスへの参照を保存する事になります。ReferencePropertyメンバを使って以下のように記述します。

class UserData(db.Model):
name = db.StringProperty()
age  = db.IntegerProperty()
class GuestComment(db.Model):
text = db.StringProperty(required=True)
date = db.DateTimeProperty(required=True)
user = db.ReferenceProperty(UserData)

Google App Engineを始めてみる

取り急ぎ環境を作るよ
PyThonのインストール
Python Japan Users GroupのホームページからWindows用のインストールパッケージをダウンロードしてこよう。とくに何も注意する事はない。インストーラ付きのものをダウンロードして、何も考えずに実行するだけでおkです。
Eclipseのインストール
EclipsePyDevを用意します。Eclipseは言わずと知れた汎用統合開発環境です。Java用、C++用などから適当なパッケージをダウンロードして来てください。私はJavaも使うかもしれないので、Eclipse IDE for Java Developersを選択しました。インストーラなどは付属していません。ダウンロードしたZipファイルを適当なフォルダに回答したら、Eclipse.exeを起動します。
PyDevのインストールは少々独特です。EclipseのメニューからHelp→Install New Softwareを選択します。
appenginesetup1
上図が表示されたら”Add…”を選択して、NameにPyDev、Locationにhttp://pydev.org/updatesと入力してOKしてください。下図のように表示されるので、導入するPluginを選択したら、Nextで先に進んでインストールしてください。
appenginesetup2
AppAngineのインストール
Google App EngineからApp Engineをダウンロードしてきます。インストーラが付属しているので、何も考えずに導入してください。
Hello Worldを作るよ
新規プロジェクトの作成
EclipseのメニューからFile→New→Projectを選択すると、WizardにPyDev Google App Engineが追加されている。それを選択してプロジェクトを新規に作成しよう。
appenginesetup3
Project NameはHelloGoogleとしてみる。
appenginesetup4
Google App Engineのインストール先を入力する必要があるので、入力してあげる。
appenginesetup5
最後にテンプレートを選択しよう。
appenginesetup6
とりあえず動かしてみるよ
index.yamlと言うファイルが必要ですが、何故か自動では作られませんでした。自分で作成しましょう。中身はこれだけです。

indexes:
# AUTOGENERATED

スタートメニューに登録されている”Google App Engine Launcher”を起動しましょう。
最初の一回目は環境設定が必要です。メニューからEdit→Prefrencesを選択してください。下図のようにPythonのインタプリタのパスと、Google App Engine SDKのインストール先パスを指定してください。
appenginesetup7
次にメニューからFile→Add Existing Applicationを選びます。Application Pathに先ほど新規に作成したProjectのパスを指定してOKボタンをクリックします。これでプロジェクトが追加されます。追加したプロジェクトを選択して”Run”ボタンをクリックした後、”Browse”ボタンをクリックしてみましょう。
うん動いたっぽい。
何もしてないから当然だよね。次はデータストアにでもアクセスしてみるよ。

アンテナの設置方法を考えてみた。

ベランダの設置場所を考えてみた。

自宅のベランダは手すりの直上には屋根が張り出していなくて上が空いている。それを活用してベランダの手すりにアンテナを固定して、ベランダの内側にアンテナを立てようと思う。アンテナの重量を手すりだけではなく、ベランダの床でも受けているので重量的には問題ないと思う。

Antena1

問題は横方向の揺れで、フェンスに固定してある支持金具の間隔は20cm程度しか取れない。下部分には滑り止めにゴムなどを置くつもりだが、はたして重量とゴムで上手く止まってくれるだろうか?屋根付近でもう一点固定を考えたほうが良いかもしれないが、雨どいが邪魔になるので上手い方法が思いつかない。

Antena2

当面は調整したりする可能性も高いので、ポールを使わずに、ベランダのフェンスに直接GPアンテナを固定する予定。

縮尺が可笑しいのは御愛嬌ってことで・・・

アンテナの取り付け

1.設置する場所
1.1.交信状況への影響
1.1.1.地上から出来るだけ高くする
アンテナの高さは給電点が地上から何メートルの位置にあるかで判断します。全長3mのグランドプレーンアンテナを、高さ10mに設置しなたら、先端は13mもの高さになるわけです。
見通しで交信可能な距離はアンテナの高さに比例して伸びていきます。地球が球状なので理論上の距離は4.12*(sqrt(h1[m])+sqrt(h2[m]))[Km]であらわす事が出来ます。h1とh2は送信側と受信側のアンテナの高さで、sqrtはその平方根を意味します。双方のアンテナの高さが10mの場合には26Km程度になります。平方根に比例すると言う事は、アンテナの高さを二倍にしても、1.5倍前後にしかなりません。高ければ高いほど遠くに届きますが、むやみに高くしてもコストばかり高くなってメリットが薄れてしまいます。
一般的な二階建て家屋の屋根の高さが6~7m程度ですから、これに遮られない10m程度の高さがあれば当面は十分ではないかと思います。10mの次に目標を定めるとしたら、杉などの樹木の高さを超える20mでしょうか。しかし一般家庭で20mの高さを超えるアンテナを設置するためには、タワーなどの専用の設備が必要になり敷居が高くなります。
1.1.2.建造物から出来るだけ離す
アンテナの周辺に金属や壁などがあると、アンテナがその影響を受けて特性が変わってしまいます。周辺に壁などがあると、共振する周波数がずれてしまったり、指向性が狂ってしまうのです。そこで出来るだけ壁などの構造物から離して設置する必要があります。
1.1.2.無線機から出来るだけ近くする
無線機から遠く離れると、アンテナ線の引き回しが長くなり、交信状態が悪くなります。高利得のアンテナケーブルを使用する事によって改善できますが、出来る限り無線機の近くのほうが良いのです。
1.2.作業のしやすさ
ここまで話をすると、TVアンテナと同じように屋根に屋根馬を乗せて、そこから高くポールを伸ばして設置するのが一番よさそうに思えてきますが、ちょっと待ってください。
アンテナは設置してお終いではなくて、その後に調整などの作業をおこなう必要があるのです。たとえばグランドプレーンアンテナなどは使用する周波数に合わせて、ラジアルの長さを変えながらSWRが最低になるように微調整するように作られています。
一般家庭の屋根の上は安全に作業をおこなえるように考慮された作りにはなっていません。高所での作業には落下の危険が付きまといますが、一般的な屋根には落下を防ぐための仕組みが一切用意されていないのです。頻繁に上り下りを繰り返しながら調整作業やメンテナンスをおこなうには、あまりにリスクが高くなります。
ベランダからポールを上げたり、外壁面からポールを上げたりと、あるいは庭の一角に設置するなど、安全にアンテナのメンテナンスをおこなえる設置場所を検討してください。
144MHz以上の周波数に対応したアンテナは、共振周波数を合わせるための調整の必要の無いものが大多数ですので、屋根上でも問題は少ないかもしれませんけどね。
2.安全のための配慮
2.1.倒壊などの防止
倒壊や落下を防止するためにアンテナは確実に固定しましょう。固定しているつもりで、アンテナが風で揺れているようでは駄目です。揺れた状態が続くと蓄積疲労で破損を起こしやすくなります。また揺れていると交信状態も安定しません。確実に固定しましょう。
ポールの材質には様々な物がありますが、ステンレスを用いるのが一番確実です。アルミ製のポールは軽くて扱いやすいのですが、アルミには負荷が限界を超えると折れると言う特徴があります。定期的なチェックを怠ると一気に破壊が進んで大きな事故になりかねません。アルミなら曲がるので外見上も異常を発見しやすく、また限界を超えた場合も一気に破損する事は少ないはずです。
2.2.アンテナ保険
万が一にアンテナが倒壊した場合に備えてアンテナ保険に入りましょう。
住宅の上に倒れたなら家屋の破損だけの話ですが、それでも数百万の支出になります。道路上などに倒壊して人身事故に発展したり、送電線上に倒壊して広域に停電を起こしたりすれば、被害額が負担できない額に上る可能性もあります。自身の責任としてアンテナ保険には確実に入るようにしましょう。
3.SWRの調整の仕方
3.1.ケーブルの長さ
適当な長さのケーブルを使用するとSWRが下がりません。ケーブルの長さは使用する波長の半分の長さの整数倍にします。正確には短縮率をかけて、((300/周波数)*短縮率)/2であらわされる長さの整数倍です。短縮率は0.8前後の事がおおいです。
50Mhz帯の場合は中心周波数の51Mhzを用いて計算して4.7mとなります。140Mhz帯の場合は145MHzを用いて計算して0.82m、433Mhz帯の場合は435Mhzを用いて計算して0.27mの整数倍です。50/140/433のマルチバンドの場合は5mの倍数のケーブルを用いれば、どの周波数でもSWRはほぼ妥当な値になります。
7Mhz帯の場合は17mの倍数になりますが、50Mhz帯の4.7mの倍数とほぼ一致するのは51mと極端にながくなってしまいます。7Mhzと50Mhzのマルチバンドの場合には、ケーブルの長さを整数倍にするのではなく、アンテナチューナなどを挿入する必要が出てきます。
3.2.アンテナのSWR
市販のグランドプレーンアンテナなどの場合には、無調整で上げてもほぼ適当なSWRになるように設定したうえで発売されています。ただし50Mhz帯でFMを使うのであれば、中央の51Mhzに合わせて調整するよりも、51.5Mhzに合わせて調整したほうが良く交信できることになります。この場合SWR計を繋いで、アンテナのエレメント長を調整して目的周波数でSWRが最低になるように合わせます。

周波数ごとの特徴 その3(長波/1.2Hhz/マイクロ波)

・140Khz
2009年から新たにアマチュア無線で使用することが認められた周波数帯です。地表波を使って交信をおこないますので、十分な出力があれば数百Kmの範囲で交信可能です。
歴史が浅いので市販の機器はほとんどありません。日本では長波帯を音声放送には長く使ってきませんでした。そのため商用目的でも、国内での利用実績もほとんどありません。国内では航空機や船舶の測位システムに使われている周波数帯です。
一般に周波数が高くなるほど機器を作成するのが難しくなります。無線機を自作したい人にとっての登竜門に良い周波数と思います。
・1.2GHz
周波数帯としてはUHFに分類されています。最近になって1.2Ghzに対応した無線機が安価に提供されるようになったため、注目を受けている周波数帯です。見通し距離で交信をおこなう事が出来ます。わずかでも障害物が存在すると反射/減衰してしまうために伝搬しません。
小型のアンテナでも十分な利得を得られます。リピータを用いれば交信距離を延ばすこともできます。
・2.4Ghz/5.6GHz/10.1Ghz
見通し距離で交信をおこなう事が出来ます。わずかでも障害物が存在すると反射/減衰してしまうために伝搬しません。市販の機器もないため、一部で実験的に交信している以外には殆ど使われていない周波数帯です。

周波数ごとの特徴 その2(HF/50Mhz)

・3.5Mhz/3.8Mhz帯
国内外の遠距離交信に良くつかわれる周波数帯です。電離層反射の効率が7Mhzよりも劣り、また空電ノイズも多いため、四級アマチュア無線で運用可能な10Wでは十分に交信できないようです。
アンテナは比較的小さなグランドプレーンでも5m~7m程度になるために場所を選びます。磁界型ループアンテナや、EHアンテナといった小型のアンテナも出てきたため敷居は下がりつつあります。
・7Mhz帯/21Mhz帯
国内外の遠距離交信に良くつかわれる周波数帯です。電離反射を利用しやすく、終日長距離での安定した通信を期待する事ができます。
アンテナは比較的小さなグランドプレーンでも5m~7m程度になるために場所を選びます。磁界型ループアンテナや、EHアンテナといった小型のアンテナも出てきたため敷居は下がりつつあります。
・28Mhz帯/50Mhz帯
通常は100Km程度の見通し距離のは良いで交信をおこなえます。太陽活動が活発な時期や、スポラディックE層が発生した時には国内外との遠距離交信をおこなえます。とくに50Mhz帯はラジオバンドなど、様々な気象条件の影響で異常伝搬をおこしやすいです。
アンテナはグランドプレーンで3m~6m程度になり、アンテナ設置の敷居が低いです。またハンディ機やモービル機でも対応機種があります。
比較的に低い初期投資で遠距離通信を見込める事から、初級者が始めるには都合のよい周波数帯と思います。

開局目指して資材調達中・・・

まだ従免も届いていないけど、開局目指して機器を収集中。
全部ヤフオクで中古や処分品を調達。
ハンディ機:IC-S7Dss ¥15,000也
144Mhz/430Mhz帯に使用。出力は6W。
数回しか使っていなかったという代物。外観などほぼ新品。
固定機:TS-680V ¥20,000也
HF~50Mhz帯、当面はアンテナの関係で50Mhzだけの運用になる予定。出力は10W。
完動品・・・のはず。写真を見ている限りは綺麗。まだ手元に届いていないけど・・・
アンテナ:GHX-510 ¥10,000也
50MHz/144MHz/430MHzマルチバンドグランドプレーン。新品♪
屋根馬にのってるVHFアンテナの所にくっつける予定。
地上高は10mくらいかな?
電源:ALINCO EPA-45 ¥1,000也
電源容量が間に合うかちょっと不安ではあるけど、TS-680Vの定格が4.5Aなんでギリギリ間に合うはず。
とりあえず、こんな構成でスタートをきろうと思う。
ケーブルやら、コネクタやら、ハンドマイクやら、細かいものも後日調達しなくちゃね。

周波数ごとの特徴 その1(VHF/UHF)

・144Mhz
基本的に見通せる距離内で交信可能です。アンテナの設置状況にもよるけれど半径20Km程度が限界。山腹など条件の良い場所なら100Kmでも交信可能です。
とても静かで、都市部で無い限り交信局はほとんどありません。
・430Mhz
基本的に見通せる距離内で交信可能です。アンテナの設置状況にもよるけれど半径20Km程度が限界。山腹など条件の良い場所なら100Kmでも交信可能です。ここまでは144Mhzと同じです。
430Mhz帯にはレピータが配置されており、ハンディ機の標準アンテナでもレピータを経由することで20~40Km程度の範囲で交信が可能になります。筑波山レピータ(標高870m)とか、赤城山レピータ(標高1820m)といった、非常に高い場所に設置された広域レピータを経由した場合100Km以上離れた局との交信も可能になります。
トラック運転手など、レピータを経由した移動局による交信が活発に行われています。
WIRES-II
レピータ間をインターネットを経由してつなげることで、広域通信を可能にしたシステムです。有志が設置したWIRESレピータ局からインターネットを経由して、遠隔地にある別のレピータ局へと中継する事ができます。
WIRES-IIのレピータ利用するには、DTMF信号を発信できる50Mhz/144Mhz/430Mhz/1200Mhz帯の無線機と、WEB上でWIRESレピータ局を探すためにインターネットに接続できる環境が必要です。
D-STAR
デジタル変調無線を使用し、レピータ間をインターネットを経由してつなげることで、広域通信を可能にしたシステムです。有志が設置したD-STARリピータ局からインターネットを経由して、遠隔地にある別のリピータ局へと中継する事ができます。D-STAR局同士でデジタル無線を使って接続したり、通常のレピータ経由の通信と同じようにインターネットを経由せずに接続する事もできます。
D-STARを利用するにはD-STAR対応の無線機を購入したうえで、D-STARのユーザ登録を行う必要があります。現状ではICOMからしか発売されていません。
エコーリンク
無線局同士をインターネットを経由してつなげることで、広域通信を可能にしたシステムです。パソコンからインターネットを経由して、遠隔地にあるリンク局から電波を発信する事ができます。リンク局や無線機を使わずにパソコン同士で交信をしたり、無線→リンク局→インターネット→リンク局→無線といった交信も可能です。
エコーリンクを利用するにはパソコンが必要です。エコーリンクソフトウェアをインストールすることで利用できます。パソコンと一般的な無線機だけでリンク局を設置する事ができるので、リンク局開設の敷居も低いです。