タグ「役立ちツール」が付けられているもの

Google App Engine 上で動く CMS を動かしてみる。 Google とは暫定和解。

Eclipse + PyDev を使う。

1.前提

1.1 App Engine Site Creator の入手

http://code.google.com/p/app-engine-site-creator/ から、app-engine-site-creator_1.1.1.zip  をダウンロードして解凍しとく。

1.2 Google App Engine にアプリケーションを作成

参照

2.Google App Engine Project の作成

2.1 新規プロジェクト ~ PyDev Google App Engine Project を作成

appeng_site_cre01

2.2 Project 名を決める

appeng_site_cre02

2.2 Google App Engine SDK のパスを指定

appeng_site_cre03

2.3 アプリケーションIDを指定し、Empty テンプレートを指定し、プロジェクトを作成

appeng_site_cre04

2.4 PyDev プロジェクトのソースフォルダに、解凍した、App Site Creator のファイル群をコピー

appeng_site_cre05

2.5 app.yaml の application に、GAEのアプリケーション名を設定

appeng_site_cre10

2.6 ローカル環境で起動してみる

コンテキストメニューから、Debug As - PyDev : Google App Run

appeng_site_cre06

起動したっぽい

appeng_site_cre07 

2.7 GAE へデプロイ

コンテキストメニューから、PyDev : Google App Engine

appeng_site_cre08

appcfg.py update をコマンドラインからではなく、PyDev上からできるようになった。便利

appeng_site_cre09

2.8 動きました。

めでたし。

appeng_site_cre11

appeng_site_cre14

3.問題への対処

3.1 日本語が表示できるように

こちらのサイト(App Engine Site Creator 日本語化 | マルコ式ネット白書)を参考に

/views/admin.py

page.content = request.POST['editorHtml']

page.content = unicode(request.POST['editorHtml'],'utf-8')

3.2 ロゴの画像が表示されない

/templates/themes/nautica05/base.html

2カ所

<img src="images/logo.gif" alt=""/>

<img src="/static/images/logo.png" alt=""/>

3.3 dojo のスクリプトエラー

dojo 1.2.3 が利用可能なようだが、1.2.0 のバグ?か、IE8 だと、スクリプトエラーが出る。

以下の箇所を1.2.0 → 1.2 (おそらく最新なんだろう)で、解消。 /static ディレクトリにダウンロードして取り込んでもよいかも。

/templates/admin

  • edit_page.html
  • edit_user.html
  • index.html
src="http://ajax.googleapis.com/ajax/libs/dojo/1.2.0/dojo/dojo.xd.js"

src="http://ajax.googleapis.com/ajax/libs/dojo/1.2/dojo/dojo.xd.js"

 

いじょ。

ちとわかりづらく、毎回軽く悩むのでメモしておく。

1.設定 - 共通設定 の 「強調キーワード」タブから、「セット追加」 で、 Python を追加

sakura_py01

2. そのタブの下部の、「インポート」を選択し、keyword フォルダから、「python_2.5.kwd」を選択

sakura_py02 

3. 設定 - タイプ別設定の、強調キーワードに 「Python」が出現するので、後は通常通りカラー設定を行う。

sakura_py03

いじょ。

google-code-prettify はブログなどにコードを記述するときに、言語に合わせてコードのシンタックスハイライトをおこなってくれるJavaScriptライブラリ。

ここからダウンロードしたファイルを解凍し、prettify.js および prettify.css を読み込み、prettyPrint() を body のonloadなどから呼び出すことで、pre タグに prettyprint クラスを指定したコードがシンタックスハイライトされる。どんな言語かはスクリプトが判定してくれる。

   <script type="text/javascript" src="/jslib/prettify.js"></script> 
   <link href="/jslib/prettify.css" rel="stylesheet" type="text/css"/>
</head>
<body onload="prettyPrint()">

               :
<pre class="prettyprint">
#include <stdio.h>
/* Convert temperature Celsius to Fahrenheit
F = 9/5 * C + 32 */
int main()
{
             :

 

以下、適当なコードで実際にやってみる。SQLやさすがにCOBOLは対応してないか・・・

C

#include <stdio.h>
/* Convert temperature Celsius to Fahrenheit
   F = 9/5 * C + 32 */
int main()
{
  int celsius;  int fahren;  int lower;  int upper;  int step;
  lower = 0;     /* lower limit of temperature */  
  upper = 300;   /* upper limit of temperature */
  step  = 20;

  celsius = lower;
  while (celsius <= upper) {
    fahren = celsius  * 9 / 5 + 32;
    printf("%d\t%d\n", celsius, fahren);
    celsius = celsius + step;
  }
}

C++

#include <iostream>

using namespace std;

void sort();

// ポインタパラメータを宣言
void order(int*, int*);

int main() 
{
    sort();
}

void sort() 
{
    int nums[] = { 2, 34, 656, 767, 893, 123, 5, 7, 892, 4, 6, 81, 1134, 56, 3 };
    int len = sizeof(nums) / sizeof(nums[0]);

    for (int i=0; i<len; i++) {
        for (int j=i; j<len; j++) {
            // 引数としてアドレスを渡す
            order(&nums[i], &nums[j]);        
        }
    }
    for (int i=0; i<len; i++) {
        cout << nums[i] << endl;
    }
}
 
void order(int* n, int* m)
{
    int tmp;
    // ポインタを間接参照する
    if (*n > *m) {
        tmp = *n;
        *n  = *m;
        *m  = tmp;
    } 
}

Java

package innerclass;

public class InnerClassTest3 {
    private int memberInt = 123;
    private Object obj;
    public void testMethodLocalInnerClass() {
        int       localInt = 456;
        final int finalInt = 789;
        
        class MethodInner {
            void printInt() {
                // (1) Outerクラスのメンバにアクセス可能
                System.out.println("Member :" + memberInt);
                // (2) ローカル変数にはアクセスできない
                //     インナークラスはヒープに置かれるため、メソッドから抜けるとスタックにアクセスできなくなる
             // System.out.println("Local  :" + localInt);
                // (3) final なローカル変数にはアクセスできる
                System.out.println("Final  :" + finalInt);
            }
            public String toString() {
                return "MethodInner";
            }
        }
        
        MethodInner mi = new MethodInner();
        mi.printInt();
        obj = mi;
    }
    
    public static void main(String[] args) {
        InnerClassTest3 me = new InnerClassTest3();
        me.testMethodLocalInnerClass();
        // (4) メソッドを抜けても生存している
        System.out.println(me.obj.toString());
    }
}

Javascript

function printMapKey() {
    // 配列は、連想配列として利用できる
    var map = new Object(); // new Array() でもよい(注1)
    map["a"] = 1;
    map["b"] = 2;
    map["c"] = 3;
  
    // 配列のキーを取り出す
    for (var k in map) {
        alert(k);
    }
    
    // キーで値を取得 (1 を表示)
    alert(map["a"]);
    
    // プロパティとして値を取得 (4 を表示)
    alert(map.a + map.c);
}

Perl

open IN, "<c:\\test.java";
open OUT, ">c:\\test.html";

print OUT "<style>";
print OUT ".kwd{ color:blue;font-weight:bold; }";
print OUT ".cmt{ color:green; }";
print OUT ".lin{ color:#808080; }";
print OUT ".lit{ color:#00ffff; }";
print OUT ".code{ background-color:#efefff;border:1px solid lightgrey;font-family:monospace; }";
print OUT "</style>";

print OUT "<div class='code'>";
$c = 1;
$isCmt = 0;
while ( $line = <IN> ) {
    
    $line =~ s/\s*$//;
    
    $line =~ s/(&)/&amp;/g;
    $line =~ s/(<)/&lt;/g;
    $line =~ s/(>)/&gt;/g;
    $line =~ s/([ ])/&nbsp;/g;
    $line =~ s/(\t)/&nbsp;&nbsp;&nbsp;&nbsp;/g;

    if ($line =~ /(\/\*)/) {
        $line =~ s/(\/\*)/<span class='cmt'>\1/;
        $isCmt = 1;
    }
    
    if ($isCmt) {
        if ($line =~ /(\*\/)/) {
            $line =~ s/(\*\/)/\1<\/span>/;
            $isCmt = 0;
        }
    } else {
        $line =~ s/(\bString\b|\babstract\b|\bcontinue\b|\bfor\b|\bnew\b|\bswitch\b|\bassert\b|\bdefault\b|\bif\b|\bpackage\b|\bsynchronized\b|\bboolean\b|\bdo\b|\bgoto\b|\bprivate\b|\bthis\b|\bbreak\b|\bdouble\b|\bimplements\b|\bprotected\b|\bthrow\b|\bbyte\b|\belse\b|\bimport\b|\bpublic\b|\bthrows\b|\bcase\b|\benum\b|\binstanceof\b|\breturn\b|\btransient\b|\bcatch\b|\bextends\b|\bint\b|\bshort\b|\btry\b|\bchar\b|\bfinal\b|\binterface\b|\bstatic\b|\bvoid\b|\bclass\b|\bfinally\b|\blong\b|\bstrictfp\b|\bvolatile\b|\bconst\b|\bfloat\b|\bnative\b|\bsuper\b|\bwhile\b)/<span class='kwd'>\1<\/span>/g;
        $line =~ s/(\/\/.*)/<span class='cmt'>\1<\/span>/g;
    }
    printf(OUT "<span class='lin'>%04d:</span> $line<br/>\n", $c);

    $c++;
}
print OUT "</div>";
close IN;
close OUT;

Python

import os
import pprint

# ディレクトリを走査し、階層構造を持ったリストを生成
def trav(path, fn=''):
  l = []
  l.append(fn)
  d = os.path.join(path,fn)
  if os.path.isdir(d):
    for f in os.listdir(d):
      l.append(trav(d,f))
  return l

l = trav('C:\\', 'Python25')

# 階層構造を持ったリストを出力
pprint.pprint(l, indent=4, width=80)

Ruby

def greeting time
  msg = ''
  if time < 12
    msg = 'good moring.'
  else
    if time == 12 
      msg = 'good afternoon.'
    else
      msg = 'good evening.'
    end
  end
  msg #メソッドからの返り値は単純にメソッドの最後の行の値
end

puts greeting(21)

VBScript

Dim reg     As Object
Dim matches As Object
Dim match   As Object
Dim value   As String '解析する文字列

Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "^[ ]+([0-9A-Z@]+).*[ ]FOUND[ ].*"
'reg.Global = True '/g オプションを指定する
Set matches = reg.Execute(value)

If matches.Count > 0 Then
    ' 一致情報のコレクション
    For Each match In matches   
        Debug.Print match.FirstIndex
        Debug.Print match.Value
    Next
    
    Set match = matches(0)
    ' 一致グループ
    Debug.Print match.SubMatches(0)
End If

SQL

SLECT *
FROM test1 A
WHERE EXSISTS (
        SELECT name
        FROM   test3 B
        WHERE B.id = A.id
      )

COBOL

EVALUATE TOKUTEN
  WHEN 80 THROUGH 100
    MOVE "A" TO GRADE
  WHEN 60 THROUGH 79
    MOVE "B" TO GRADE
  WHEN 50 THROUGH 59
    MOVE "C" TO GRADE
  WHEN OTHER
    MOVE "D" TO GRADE
END-EVALUATE

Fedora Live USB を作成

なんか急にUSB Linux を作りたくなったので、USBメモリを探す。AmazonでBUFFALO 8Gメモリが、1700円くらい。安っ。電気屋で、8Gの価格帯をざっと見たら、3000円弱だったのに。しかも、1500円以上なんで送料もかからん。ぽちっとなしました。楽天で検索したら、だいたい送料別だったからね。

このページをみながら、作成するも、起動しない・・・ 8Gだったんで、FAT32でフォーマットしたんだけど、FAT16でないとダメなのか?

などと、なんどもなんども fdiskを繰り返すも、一向に起動せず。

HPのUSB起動フォーマットツールなんかも試したり。でもダメ。

家族サービスの合間をぬっての作業なんで、あんまり時間がないんだよ~

ちゃっちゃと動いちゃってよ~

なんてちょっとあせりつつ、購入したメモリは、USBブート対応していないんじゃないか?とかおもって、ググるとこんな記述が。なんと、購入したメモリは、USBブート対応していないのか!

安物買いの銭失いとはまさにこのことかよと、デスクトップマシンに差し込んで起動してみたら、何の問題もなく起動するではないですか。

結局、BIOS設定の勘違い。ブート順に、USB Floppy と USB HD 見たいなのがあって、USB Floppy だとおもってたら、 USB HD として認識されるようで。

あっさり動いちゃいました。

手順はこちら

Linuxで作成したので、大まかには以下の手順。というか、これですべてか。

  1. USBメモリをVFATでフォーマット ( fdisk でブートマークをつける )
  2. ISOイメージをダウンロード
  3. livecd-tools をインストール ( yum install livecd-tools )
  4. イメージをコピー ( データ永続化を行う例 : livecd-iso-to-disk --overlay-size-mb 2047 ./F10-i686-Live.iso /dev/sdb1 )

 このツールを使えば、Windowsからも簡単にできそう。

IMAGE_500

で、こいつは、レスキュー用途以外にどんな使い道があるのかな~

Windows Live Writer

今日このあたりの記事を見た。

Movable Type で、ブログ書くのも結構面倒くさいなぁと思ってたので、ネーミングに違和感を感じつつ、Microsoft の Writer という、ブログ編集ツールを導入してみる。

 ここをみると、Movable Type のユーザプロファイルの、Webサービスのパスワードを設定する必要があるみたいなので、設定し、インストールを行った。(日本語化はされてました)

mt_wtr02

いまいま、このページを編集しているところ。

mt_wtr04

やっぱり、専用のソフトは便利だ。

だけど、これになれちゃうと、場所とマシンを選ぶんだよな~。漫画喫茶からとかは使えないしね。

しばらく使ってみよう。

ついにって、もうきてしばらくたってるけど、

goobletb.jpg

FireFox 用 Googleツールバーのブックマーク機能!!

ロケーションフリー(?)で、お気に入りを管理できてとっても便利。
しばらくIE用のツールバーにしかこの機能がなかったので、その間は、FireFoxでインターネッツして、気に入ったサイトは、新たにIEで開きなおして、Googleツールバーでブックマークするという、なんだかなぁなことをしていました。

どういう風に便利かというと、

・ 自宅、仕事場、マンが喫茶で同じブックマークを共有できる。
・ ブックマークをラベルで管理できる。
 
こんな感じで、ひとつのサイトをいろんなカテゴリに紐つけられます。
goobletb3.jpg
・ 検索ボックスに、ブックマークの内容が表示されます。
こんな感じで、ブックマークを簡単に検索してくれます。
goobletb2.jpg
まだの方は、ぜひ使ってみてください。