2009年11月28日土曜日

Google Closure Toolsについて

参考ページ(Getting Started with the Closure Library)
closure-library - Revision 9: /trunk/closure/goog/demos

スクリプトをheadタグ内に書くとエラーが出る。

エラーが出る場合
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>Google Closure Tools Sample</title>
  <script src="closure-library-read-only/closure/goog/base.js"></script>
  <script type="text/javascript">
    //ライブラリの読み込み
    goog.require("goog.events");
    goog.require('goog.dom');
    
    //イベントリスナーの追加
    goog.events.listen(document.getElementById("btn"), "click", sayHi);                   
    
    function sayHi() {
      var newHeader = goog.dom.createDom('h1', {'style': 'background-color:#EEE'},
        'Hello world!');
      goog.dom.appendChild(document.body, newHeader);
    }
  </script>
  </head>
  <body>
    <input type="button" id="btn" value="push" />
  </body>
</html>

エラーなしに実行できる場合
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title>Google Closure Tools Sample</title>
<script src="closure-library-read-only/closure/goog/base.js"></script>
<script type="text/javascript">
  //ライブラリの読み込み
  goog.require("goog.events");
  goog.require('goog.dom');
</script>
</head>
<body>
  <input type="button" id="btn" value="push" />
</body>
<script>
  //イベントリスナーの追加
  goog.events.listen(document.getElementById("btn"), "click", sayHi);                   

  function sayHi() {
    var newHeader = goog.dom.createDom('h1', {'style': 'background-color:#EEE'},
      'Hello world!');
    goog.dom.appendChild(document.body, newHeader);
  }
</script>
</html>

2009年11月24日火曜日

Google app engine(python)で同名のパラメータを受け取り、配列として処理する。

参考ページ

main.py
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class Sender(webapp.RequestHandler):
  def get(self):
    self.response.out.write(
    """
    <html>
      <body>
        <form action="/receive" method="get">
          <input type="checkbox" name="ch" value="checkbox1">
          <input type="checkbox" name="ch" value="check2">
          <input type="checkbox" name="ch" value="ch3">
          
          <input type="submit" value="push" />
        </form>
      </body>
    </html>
    """
    )
class Receiver(webapp.RequestHandler):
  def get(self):
    arr = self.request.GET.getall("ch")
    for s in arr:
      self.response.out.write(s)
    
application = webapp.WSGIApplication([
  ("/receive", Receiver),
  ("/", Sender)
], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

2009年11月22日日曜日

PDFをGoogle Docsで開く、Chromiumの拡張機能を作る。

参考ページ

ChromiumでPDFをどうやって開くか分からなかったので、作ったんですがAdobe Readerより軽くていい。Linux版のAdobe Readerは重すぎてやってられない。

manifest.json
{
  "name": "OpenPDF",
  "version": "0.1",
   "content_scripts": [ {
      "js": [ "background.js" ],
      "matches": [ "http://*/*", "https://*/*" ]
   } ],
  "description": "Open PDF by Google Docs",
  "background_page": "background.html",
  "permissions": ["tabs", "http://*/*", "https://*/*" ]
}
background.js
var op = {//OpenPdf
 init: function()
 {
   var anchors = document.getElementsByTagName("a");
   for(var i = 0;i < anchors.length;i++){
     if(anchors[i].href.indexOf(".pdf")!=-1 || anchors[i].href.indexOf(".PDF")!=-1){
       var link = 'http://docs.google.com/viewer?url='+anchors[i].href;
       anchors[i].href = link;
     }
   }
 }
}
op.init();//Entry Point
background.html
<html>
<head>

</head>
<body>
background
</body>
</html>

Google app engine(python)でアップローダーを作る。

参考ページ

全体的に参考ページを真似した。読んでて感動した。すごいお方もいるんだなぁ…

解決できなかったこと:
日本語のファイル名ではエラーが出る。
# -*- coding : utf-8 -*-

from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import users

class FileStore(db.Model):
  #ほとんど使ってません。
  name = db.StringProperty()
  
  body = db.BlobProperty()
  
  mime = db.StringProperty()
  
  size = db.IntegerProperty()
  
  time = db.DateTimeProperty(auto_now_add=True)
  
  download_count = db.IntegerProperty()

class RenderMainPage(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    if user:
      self.response.out.write(
      """
      <html>
        <body>
          <div style="border-bottom: 1px dotted gray;">
            <nobr>
              <b>%(nickname)s</b>
              <a href='%(logout_url)s'>logout</a>
              <a href='/alldelete'>All Delete</a>
            </nobr>
          </div>
          <br>
          <div style="background-color: #ece8e3;border: 1px dotted #82c78e;padding: 3px;">
            <h4>upload</h4>
              <form action='/upload' method='post' enctype='multipart/form-data'>
                password: <input type='text' name="admin_pass" /><br>
                <input type='file' name="file" />
                <input type="submit" value="upload" />
              </form>
          </div>
          <br>
          <div style="background-color: #efebe7;padding: 3px;">
            <h3 style="text-align: center;">download</h3>
          <br>
      """ %{"nickname": user.nickname(),
            "logout_url": users.create_logout_url("/")})
    
      files = db.GqlQuery("SELECT * FROM FileStore"+
                          " ORDER BY time DESC")
      if not files:
        self.response.out.write("not upload file")
        return
      else:
        for file_data in files:
          if file_data.name:
            self.response.out.write(
            """
              <a href='/download?key=%(key)s'>%(name)s</a><br>
            """ %{"key": str(file_data.key()),
                  "name": file_data.name
                  })
      self.response.out.write(
      """
         </div>
        </body>
      </html>
      """)
    else:
      self.response.out.write(
      """
      <html>
        <body>
          <a href='%s'>Sign In</a>
        </body>
      </html>
      """ % users.create_login_url("/"))

class Uploader(webapp.RequestHandler):
  def post(self):
    if self.request.get("admin_pass") == "xxxxxxxx":#自分以外アップロードできません。
      file_data = self.request.get("file")
      upf = self.request.body_file.vars["file"]# omit upload file
      _file = FileStore()
      
      _file.name = upf.filename
      _file.body = db.Blob(file_data)
      _file.mime = upf.headers["content-type"]
      _file.size = len(_file.body)
      _file.download_count = 0
      _file.put()
      
      self.redirect("../")
    else:
      self.redirect("../")
      
class Downloader(webapp.RequestHandler):#知識がない分、ここが一番参考になった。
  def get(self):
    _file = FileStore.get(self.request.get("key"))
    #アップローダを作るとき重要となる部分.
    self.response.headers["Content-Type"] = "application/octet-stream"#このContent-Typeが必要。
    content_disposition = 'attachment; filename="%s"' % str(_file.name)
    self.response.headers["Content-Disposition"] = content_disposition #これも必須
      
    self.response.out.write(_file.body) #バイナリの書き出し

class AllDelete(webapp.RequestHandler):#テストを手っ取り早くするためもの。データストアを全削除する。
  def get(self):
    file_list = db.GqlQuery("SELECT * FROM FileStore")
    for _file in file_list:
      _file.delete()
      
    self.redirect("../")  
    
application = webapp.WSGIApplication([
  ("/", RenderMainPage),
  ("/upload", Uploader),
  ("/download", Downloader),
  ("/alldelete", AllDelete)
], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

2009年11月21日土曜日

Google App Engine(python)でUserAgentを取得する方法

参考ページ

webobのRequestオブジェクトに関して調べた。

サンプルコード
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class Receiver(webapp.RequestHandler):
  def get(self):
    self.response.out.write(
    """
    <html>
      <body>
        <b>%s</b>
      </body>
    </html>
    """ % self.request.user_agent)
    
    
application = webapp.WSGIApplication([
  ("/", Receiver)
], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

http://localhost:8080/にアクセスすると表示される

ChromeOSを試す

ビルドしようとしたら"mbr.image"が作成されず、OSが起動できないというエラーで挫折した。

TechCrunchでBitTorrentでVirtualBox用のvmdkファイルを配布しているという記事を見つけたので、それをダウンロードしてVirtualBox OSEで試した。

感想としては、起動の早い「ウェブブラウザ」だった。

確かにウェブアプリケーションで多くのことをまかなうというのは効率的かもしれないけど、もっとクライアント側のアプリケーションを強化しないと、さすがに自由度が低すぎるんじゃないだろうかと思った。

追記:
ビルドの参考にしたサイト

ビルド中に各項目でかかった大まかな時間。
 6:30 gclient sync開始
 6:55 終了
 6:58 ./make_local_repo.sh開始
 7:30 終了
 7:31 ./make_chroot.sh開始
 7:40 終了
 7:50 ./build_platform_packages.sh開始
 7:57 終了
 7:59./build_kernal.sh開始
 8:31 終了
 8:33 ./build_image.sh開始
 8:37 終了

unzipで文字化けが起こらないように解凍する

$ unzip -hでヘルプを参照

1回ためして起こらなかっただけなので、絶対というわけではないが
$ unzip -O sjis ****.zip
で、オプションなしでは文字化けを起こしたファイルを起こさず解凍できた。

2009年11月20日金曜日

Chrome OSの初プレビューを動画で見る

Google OS Fast Boot
Demonstration Google Chrome OS
Video demo of Google Chrome OS, Taken At Mountain View Debut

「Google OS Fast Boot」 はChrome OSの起動が従来のOSと比較してどう違うかを説明している。終盤にちょっとだけ実際の起動場面を見ることができる。

「Demonstration Google Chrome OS」 は実際にChrome OSを動かしつつ説明している。「Video demo of Google Chrome OS, Taken At Mountain View Debut」 は起動している場面と前フリで開発者がいろいろ話している場面を見れる。

英語なので雰囲気でしか分からない。

2009年11月17日火曜日

google app engine(python)のfavicon.icoについて

参考ページ


- url: /favicon.ico
  static_files: favicon.png
  upload: favicon.ico


拡張子を.icoに設定する必要はない。

ubuntu 9.10でgoogle app engine(python)の開発を行う。

python2.5のインストール
$ sudo apt-get install python2.5

テスト:
ディレクトリに移動
$ cd google_appengine/demos

サーバー起動:
$ python2.5 ../dev_appserver.py guestbook/

たぶん動く。

google-app-engine-samplesのサンプルを参考にできる。

2009年11月15日日曜日

HTML, CSSに関する学んだことは一つにまとめようと思う。

タイトルの横にあるやつを作る(HTML)
IT戦記さんのCSSをWebInspectorで解析した。
div{
border-left: 0.4em solid #F90;
padding-top: 15px;
/* padding-topで大きさを調節 */
}
h3{
}
<body>
<div>
<h3>参考ページ</h3>
</div>
</body>


個人的に好きなボーダーのCSS
reference page(WebInspector)
border-color: #BABABA;
border-style: dotted;
border-width: 2px 0px;

コマンドに関して

参考ページ

下位ディレクトリもまとめて作成する
$ mkdir -p ***
下位ディレクトリもまとめて削除する
$ rmdir -p ***

2009年11月6日金曜日

ubuntu 9.10でマウスでワークスペースを切り替える

参考ページ1
参考ページ2

$ sudo apt-get install compizconfig-settings-manager


[システム] → [設定] → [CompizConfig設定マネージャ]

[ビューボートスイッチャー] → [デスクトップ上でのビューポート切り替え]
  次へ移動 Button4
前へ移動 Button5
に設定する。

2009年11月4日水曜日

Ubuntu 9.10にChromiumをインストールする

/etc/apt/sources.listに追記
$ echo "deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main" >> /etc/apt/sources.list
$ echo "deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu karmic main" >> /etc/apt/sources.list

ubuntu 9.10以降ならこんな感じでやってもいいらしい。
#after ubuntu 9.10
$ sudo add-apt-repository ppa:chromium-daily

アップデート
$ sudo apt-get update

chromium, WebInspectorのインストールと日本語化を同時にやる
$ sudo apt-get install chromium-browser chromium-browser-l10n chromium-browser-inspector

Ubuntu Netbook Remix(UNR) 9.10の無線LAN使用について

参考ページ

インストールしただけではなぜか無線LANのドライバが入っておらず、インストールもできなかった。

参考ページを参考にして
$ sudo apt-get install bcmwl-kernel-source (元々、インストールされていなかったので)

[システム] → [ハードウェア・ドライバ]で 「STA」の方を選択して有功にして再起動

なぜか、プロキシで接続にしておかないと無線LANがつながらないので
[システム] → [ネットワークのプロキシ] で 「マニュアルでプロキシの設定を行う」をクリック

ディスプレイ上のアイコンをクリックしてアクセスポイントを選択してつなげる

追記:我が家にルータがやってきてからプロキシにしておかなくてもつながるようになった。