カテゴリー別アーカイブ: Programming

Vagrantでwordpress

目的:オンラインのWordpressがクラックされた時に速やかに復旧したい
副目的:何度でも気軽に環境再構築したい

Vagrantをインストール。現時点ではv.1.7.2
VirtualBoxをインストール。現時点ではv4.3.6

$ sudo vagrant plugin install sahara

saharaのインストールでエラーが出たのでこちらにしたがって

$ xcode-select --install
$ sudo xcodebuild -license
$ sudo vagrant plugin install sahara
$ vagrant box add --name CentOS-6.6-x86_64-minimal-ja-20150531 ~/centos66-20150531.box
$ cd ~/SaitoToshiki.com
$ mkdir centos66
$ cd centos66/
$ vagrant init
$ vi Vagrantfile

作成されたVagrantfileの内容を下記に書き変える

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "CentOS-6.6-x86_64-minimal-ja-20150531"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision "shell", inline: <<-SHELL
    yum -y update --enablerepo=rpmforge,epel,remi,remi-php55
    yum -y install --enablerepo=remi,remi-php55 httpd mysql-server php php-mysql php-mbstring php-gd phpMyAdmin gd-last ImageMagick-last
    cd /var/www/html
    curl -LO http://ja.wordpress.org/latest-ja.tar.gz
    tar xvzf latest-ja.tar.gz
    cd /var/www/html/wordpress/
    cp wp-config-sample.php wp-config.php
    chown -R apache:apache /var/www/html/wordpress
    chkconfig mysqld on
    service mysqld start
  SHELL
end

実際には作ってあったファイルをコピー

$ cp ../centos66/Vagrantfile .
$ vagrant up

一気にインストールされて感動。
ここでsnapshotを取り、設定を開始

$ vagrant sandbox on
$ vagrant ssh
[vagrant@centos66 ~]$ mysql_secure_installation

最初のパスワード入力は不要。途中rootのパスワードだけ設定して、後はひたすらEnterをおす。パスワードを”123ABC”としたとすると下記の様にデータベースを作成し、suでスーパーユーザーになって設定ファイルを作る。

[vagrant@centos66 ~]$ mysql -u root -p123ABC
mysql> create database wordpress;
mysql> grant all privileges on wordpress.* to wordpress@localhost identified by 'wordpress';
mysql> quit;
[vagrant@centos66 ~]$ su -
[root@centos66 ~]# vi /var/www/html/wordpress/wp-config.php
[root@centos66 ~]# vi /etc/httpd/conf.d/wordpress.conf
[root@centos66 ~]# vi /etc/httpd/conf.d/phpMyAdmin.conf

wp-config.phpのID/PWは全て’wordpress’に。

wordpress.confは下記の内容をペースト

<Directory /var/www/html/wordpress>
  AllowOverride ALL
</Directory>

phpMyAdmin.confは最初から2つのDeny from Allをコメントアウト

[root@centos66 ~]# chkconfig httpd on
[root@centos66 ~]# service httpd start

http://192.168.33.10/wordpress/
にアクセスするとインストーラが起動、指示通り入力したらインストール完了

http://192.168.33.10/phpmyadmin/
root,123ABCでログイン

全てのテーブルを選んで削除
インポート を選んでwordpressをphpMyAdminよりバックアップしてあったDBファイル、xxx.sql.zip(463kB)を選んでインポート
wp_options > siteurlとhome を’http://192.168.33.10/wordpress’に変更

Appearances > ThemesのテーマをTwenty Fourteenにする
これで昔のエントリーを見ることが出来るようになる

幅がやけに狭いので子テーマ(style.css, functions.php)を作成して横幅いっぱいに使うようにする。

[root@centos66 ~]# cd /var/www/html/wordpress/wp-content/themes/
[root@centos66 themes]# mkdir twentyfourteen-child
[root@centos66 twentyfourteen-child]# vi style.css
[root@centos66 twentyfourteen-child]# vi functions.php

style.css

/*
 Theme Name:     Twenty Fourteen Child
 Description:    Make use of full width page templates in the Twenty Fourteen theme
 Author:         Toshiki I. Saito
 Author URI:     http://www.saitotoshiki.com
 Template:       twentyfourteen
 Version:        1.0
*/

.site-content .entry-header,
.site-content .entry-content,
.site-content .entry-summary,
.site-content .entry-meta,
.page-content {
	margin: 0 auto;
	max-width: 100%;
}

.full-width .site-content .page .entry-header,
.full-width .site-content .page .entry-content,
.full-width .site-content .page .entry-summary,
.full-width .site-content .page .entry-meta {
        max-width: 100%;
}

.post-navigation,
.image-navigation {
        margin: 24px auto 48px;
        max-width: 100%;
        padding: 0 10px;
}

.archive-header,
.page-header {
        margin: 24px auto;
        max-width: 100%;
}

.contributor-info {
        margin: 0 auto;
        max-width: 100%;
}

.comments-area {
        margin: 48px auto;
        max-width: 100%;
        padding: 0 10px;
}

/*This section sets page to 100% width */
.site {
	background-color: #fff;
	max-width: 100%;
	position: relative;
}

/*This section sets page header to 100% width */
.site-header {
	background-color: #000;
	max-width: 100%;
	position: relative;
	width: 100%;
	z-index: 4;
}

functions.php

<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
}

テーマからTwenty Fourteen Childを選んで終了!

CentOS minimalのVagrant Box

目的:Vagrantで使うminimalなvagrant boxを自分で準備したい
参考リンク:CentOS 6.5 x86_64 minimalのVagrant boxを作ってみた

MacBook Pro (Retina, 15-inch, Late 2013), OS X Yosemite Version 10.10.3
Vagrantをインストール。現時点ではv.1.7.2
VirtualBoxをインストール。現時点ではv4.3.22

CentOS公式サイトよりCentOS 7ではなく枯れているCentOS 6.6を選択。リンクを辿ってCentOS-6.6-x86_64-minimal.iso (383MB) をdownload

仮想マシンの作成

Virtual Boxを起動
Machine > New… をメニューから選択。以下(default)と記載のある部分はそのまま

Name: CentOS66
Type: Linux (default)
Version: Red Hat (64bit) (default)

Memory Size: 1024MB

Creat a virtual hard drive now (default)
VDI (default)
Dynamically allocated (default)
8GB (default)

Start アイコンをクリック
ダウンロードしたCentOS-6.6-x86_64-minimal.isoを指定

Install or upgrade an existing system (default)
Skip (media test)
* skipしないとisoファイルがejectされた状態になる。その場合isoファイルを右下のアイコンからmountしなおせばOK

インストール中の表示言語を選択:Japanese (日本語)を選択
このシステム用の適切なキーボードを選択:英語(アメリカ合衆国)を選択(使っているキーボードが英語版のため)
* キーボードの選択を誤った場合は後からここに沿って
vi /etc/sysconfig/keyboard して

KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"

KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"

に変更

基本ストレージデバイス (default)
アラートが出たら「はい。含まれていません。どのようなデータであっても破壊して下さい」を選択
ホスト名:centos66
アジア/東京 (default)
rootパスワード:[大切なので忘れないように]
「すべての領域を選択する」を選択
アラートが出たら「変更をディスクに書き込む(W)」を選択
インストールが終了するので、指示通り再起動し、rootでログイン

ネットワークの有効化

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
- ONBOOT=no
+ ONBOOT=yes
# reboot

Mac(ホスト)から操作可能に

一時的にsshでホストコンピュータからログイン出来るようにする
Machine > Settings… をメニューから選択
Networkをクリック
Adapter 1 (default)
Port Forwardingをクリック
右上の+アイコンをクリック
Host Port 2222, Guest Port 22のみを入力、警告メッセージがでるがそのままOKをクリック

Macのターミナル(Terminal or iTerm2)を開いてsshでログイン

$ ssh localhost -p 2222 -l root

確認メッセージがでるのでyesとタイプして進め、先ほどのrootのログインパスワードでログイン

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): そのようなファイルやディレクトリはありません
[root@centos66 ~]#

と表示される。後々メッセージが文字化けするのでロケールファイルの設定をする。

[root@centos66 ~]# vi /etc/sysconfig/i18n
#locale
LC_CTYPE="ja_JP.utf8"
LANG=ja_JP.utf8
LC_CTYPE=ja_JP.utf8
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"

を追加

[root@centos66 ~]# reboot

yumリポジトリ登録、Vagrantユーザー作成、ssh設定

[root@centos66 ~]# curl -L -O http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@centos66 ~]# curl -L -O http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@centos66 ~]# curl -L -O http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
[root@centos66 ~]# rpm -ivh epel-release-6-8.noarch.rpm rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm remi-release-6.rpm
[root@centos66 ~]# useradd -m vagrant
[root@centos66 ~]# passwd vagrant
* パスワードを決めてを入力
[root@centos66 ~]# mkdir /home/vagrant/.ssh
[root@centos66 ~]# chmod 700 /home/vagrant/.ssh
[root@centos66 ~]# cd /home/vagrant/.ssh
[root@centos66 .ssh]# curl -k -L -o authorized_keys 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub'
[root@centos66 .ssh]# chmod 600 /home/vagrant/.ssh/authorized_keys
[root@centos66 .ssh]# chown -R vagrant.vagrant /home/vagrant/.ssh
[root@centos66 .ssh]# visudo
- Defaults requiretty
+ # Defaults requiretty
- # %wheel ALL=(ALL) NOPASSWD: ALL
+ vagrant ALL=(ALL) NOPASSWD: ALL
[root@centos66 .ssh]# su - vagrant
[vagrant@centos66 ~]$ sudo ls /root

必要なアップデート、インストール、設定

[vagrant@centos66 ~]$ exit
[root@centos66 .ssh]# cd
[root@centos66 ~]# yum -y update
[root@centos66 ~]# reboot

[root@centos66 ~]# yum -y groupinstall "Development Tools"
[root@centos66 ~]# yum -y install man man-pages-ja
[root@centos66 ~]# yum -y remove git-1.7.1-3.el6_4.1.x86_64 perl-Git-1.7.1-3.el6_4.1.noarch
[root@centos66 ~]# yum -y --enablerepo=rpmforge-extras install git
[root@centos66 ~]# vi /etc/sysconfig/selinux
- SELINUX=enforcing
+ SELINUX=disabled
[root@centos66 ~]# service iptables stop
[root@centos66 ~]# service ip6tables stop
[root@centos66 ~]# chkconfig iptables off
[root@centos66 ~]# chkconfig ip6tables off

VirtualBox Guest Additionsインストール

Devices > Insert Guest Additions CD image … をメニューから選択

[root@centos66 ~]# mkdir /media/cdrom
[root@centos66 ~]# mount -r /dev/cdrom /media/cdrom
[root@centos66 ~]# sh /media/cdrom/VBoxLinuxAdditions.run
[root@centos66 ~]# umount /media/cdrom

Devices > CD/DVD Devices > Remove disk from virtual drive をメニューから選択

ネットワークデバイスエラー回避

[root@centos66 ~]# rm /etc/udev/rules.d/70-persistent-net.rules
[root@centos66 ~]# rm -rf /dev/.udev/
[root@centos66 ~]# rm /lib/udev/rules.d/75-persistent-net-generator.rules

box作成のための最適化

[root@centos66 ~]# yum clean all
[root@centos66 ~]# dd if=/dev/zero of=/EMPTY bs=1M
[root@centos66 ~]# rm -f /EMPTY
[root@centos66 ~]# shutdown -h now

Mac(ホスト)からの接続設定を削除

Devices > Network > Network Settings… を選択
Adaptor 1の Port Forwardingをクリック
作成した項目をクリックしてDelキーを押して削除。その後下部のOKボタンを押す。
設定画面のOKボタンを押す。
以上でboxの作成準備が完了。

Boxの作成と使用

$ vagrant package --base CentOS66 --output centos66-20150531.box

Boxのサイズは458MB

VagrantにBoxを登録

$ vagrant box add --name CentOS-6.6-x86_64-minimal-ja-20150531 centos66-20150531.box
$ vagrant box list
CentOS-6.6-x86_64-minimal-ja-20150531 (virtualbox, 0)

Vagrantで使えるか確認

$ vagrant init CentOS-6.6-x86_64-minimal-ja-20150531
$ vagrant up
$ vagrant ssh

終了!

Mac VMware Fusion – CentOS 6.3にAlfresco最速構築(35分)

目的:文書管理システムとしてのAlfrescoを試す環境を作る。
副目的1:何度でも気軽に環境再構築したい

背景:通常の共有フォルダで複数の人が文書をやり取りする際にどれが最新バージョンか分からなくなったり、不用意に文書が移動・削除される可能性があるが、いつ何が起きたか分かりづらい。削除や移動の履歴も取れるように文書のバージョン管理をしたい。代表的なものはMicrosoft SharePointだがベンダーロックインされたくないのでオープンソースを探してみたところAlfrescoコミュニティーバージョンが一番良さそう。先ずは使い勝手を試すために仮想環境に設定。

Mac上のVMWare FusionにCentOS 6.3 + Alfresco Community 4.2bをインストールするまで。

VMWare Version, 5.0.1
CentOS 6.3 64bit版
Alfresco Community, Version 4.2b

さあ、どれぐらい時間がかかるか。

先ず、CentOSをダウンロード。フルパッケージは合計5.4GBと大きいので、200MBと一番小さくて済むネットインストール版をダウンロード
http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/6.3/isos/x86_64/

CentOS-6.3-x86_64-etinstall.iso      06-Jul-2012 19:14  200M

これをダウンロード(30秒)

VMWare Fusionを起動し、ファイル > 新規作成…を選択して新たなVirtual Machineを作成
“ディスクを使用せずに実行”を選択
“ディスクまたはディスクイメージを選択…”をクリック
先程ダウンロードした”CentOS-6.3-x86_64-netinstall.iso”を選択
Linux, CentOS(64ビット)を選択
ファイル名はそのまま

起動したらそのままReturm
メディアのテスト→スキップ(カーソルキーとReturnキーで選択・決定)
言語選択→英語のままでOK(日本語選んでもどのみち日本語表示されない)
キーボード→US(キーボードが日本語版の人はJP106を選択)
インストール方法→URL
IPの設定→そのまま
URLの入力→

ftp://ftp.riken.jp/Linux/centos/6.3/os/x86_64/

と頑張って打ち込む
基本ストレージデバイス
上書きの確認画面で「はい。含まれていません。どのようなデータであっても破棄してください。」を選択
ホスト名→そのまま
タイムゾーンの設定画面→そのまま
rootのパスワード→自分なりに決めて入力する。弱いパスワードの場合は注意されるが無視。
パーティション設定画面→「Use All Space」を選択
フォーマット確認画面→「Write changes to disk」を選択
インストール構成の選択画面→デフォルトのまま(Minimal)→ここで5分程かかる
CentOSのインストールの完了。「再起動」のボタンをクリックし再起動
再起動終了。ここまで11分。

ここから先は日本語表示させたり、コピペが出来るようにするためにMacのTerminalからCent OSにtelnet接続できるようにする。
後でwgetも必要なのでtelnet-serverとwgetをインストール

yum -y install telnet-server wget

インストール直後はサービスが無効。その箇所を解除するため disable = yesをnoに書き換える。
(viエディタの使い方:閲覧モードでのhjklキーがそれぞれ←↓↑→というカーソル移動。xでカーソル場所の一文字削除。iで挿入モードに入って文字を打ち込み、ESCで挿入モードを抜けて:wqでファイル更新(w)、終了(q))

vi /etc/xinetd.d/telnet
- disable = yes
+ disable = no

ユーザーを作成し、パスワードを設定してメモしておく(ここでは仮にtoshというユーザー名にする)。更に外からアクセスできるように(NATなので大丈夫でしょう)。

useradd tosh
passwd tosh
chkconfig --level 2345 iptables off

ifconfigで表示されるip addressをメモ(仮に172.16.203.128だったとする)し、システムをアップデート(ここで3分ほどかかる)。

ifconfig
yum -y update

カーネルもupdateされるので再起動

reboot

MacのTerminalを起動し、先程作ったユーザー名(ここではtosh)で先程メモしたアドレス(ここでは172.16.203.128)に接続しPasswordを聞かれるので先程passwdで作ったパスワードを入力。

telnet -8 -l tosh 172.16.203.128

これでMacのTerminal上で操作できるのでコピぺもし放題、日本語も正常に表示される。
下記をそのままTerminalにコピペすれば上手く行くはずです。TABキーを使った文字補完を上手く使えば長いファイル名も楽です。
例えばchmod +x aと打ってTABキーを押せば後は補完されます。
su -でルートに入り、Alfrescoのインストーラをダウンロードし、実行権限を与え、実行します。

[tosh@localhost ~]$ su -
Password: 
[root@localhost src]# wget http://dl.alfresco.com/release/community/build-04480/alfresco-community-4.2.b-installer-linux-x64.bin
[root@localhost src]# chmod +x alfresco-community-4.2.b-installer-linux-x64.bin 
[root@localhost src]# ./alfresco-community-4.2.b-installer-linux-x64.bin

Alfrescoのインストールが始まります。
インストール言語の選択→[6]日本語を選択, 6を押してEnter
メモリが足りないと出てくるが無視して[Enter]
インストールの種類→[1]簡易を選択, 1を押してEnter
インストール先フォルダ→デフォルトのまま
管理者パスワード→設定してメモしておく
サービスとしてインストール→yを押してEnter
続けますか→yを押してEnter

ここで7分ぐらいかかる。100%に達してから結構待たされるのでゆっくり待つ

ブラウザから先程ifconfigでメモしたCentOSのipアドレスにポート番号8080でshareフォルダに

http://172.16.203.128:8080/share

としてアクセス。
初回アクセス時は何故かえらく待たされる(5分!)
ログイン画面が出れば成功!

以上35分!

ログイン画面が出るのでadminと入力し
先程設定したパスワードでログイン

出来上がったVirtual Machineのサイズは4.67GB

日本語の書籍はあまり見当たらず。

オープンソース徹底活用 Alfrescoによるドキュメント管理入門

奥野 章人 (著)

参考:文書管理システムとして使うのに必要な使い方。
1. ユーザーとグループの設定方法
2. 文書を入れておくフォルダーの2つの設定方法(レポジトリとサイト)
3. デスクトップに読み取り専用の共有フォルダとして表示する方法(FTPとCIFS/SMB)
4. Alfresco上のバージョン管理されたファイルを直接Word, Excel, Powerpointで読み書きする(オンライン編集機能)
5. メール送信設定

Good Luck!

Googleドキュメントの定時バックアップ

Googleドキュメントの履歴機能は便利なのですが、やはり手元にファイルのバックアップとして定期的な保存が必要だったりします。

フリーウェアのみで特定のGoogleドキュメントを日付をつけた任意のファイル名で自分のコンピュータに毎日バックアップ取ることにします。

元のファイル名が「Mouse Inventory」だとすると2012.3.4→120304, 2012.3.5→120305と、
120304 mouse inventory.xls
120305 mouse inventory.xls
のような感じでファイルが溜まっていくようにします。

Macで行いましたが、Windows/Linuxでも同様に出来るはずです。

GoogleCLというフリーウェアがあり、これでコマンドラインからグーグルの各種サービスにアクセス出来るようになります。
それを使って特定のファイルを日付を付けてダウンロードするスクリプトを作り、
それを/etc/periodic/daily/というフォルダに入れるというのが概要になります。

まず、Pythonのバージョンが2.5以上であることをターミナルを起動して確認

YourMac:~ tosh$ python -V
Python 2.7.1

GData 2.0.14 (2.0.15や16は相性悪し)とGoogleCLをインストール
sudoコマンドで聞かれるパスワードはMacへのログインパスワードを入力します。パスワードを設定していない場合はsudoは使えません。

YourMac:~ tosh$ mkdir src
YourMac:~ tosh$ cd src/
YourMac:src tosh$ curl -O http://gdata-python-client.googlecode.com/files/gdata-2.0.14.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1828k  100 1828k    0     0   745k      0  0:00:02  0:00:02 --:--:--  886k
YourMac:src tosh$ tar xzvf gdata-2.0.14.tar.gz
x gdata-2.0.14/
...
x gdata-2.0.14/MANIFEST
YourMac:src tosh$ cd gdata-2.0.14
YourMac:gdata-2.0.14 tosh$ sudo python setup.py install
Password:
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: 
...
Writing /Library/Python/2.7/site-packages/gdata-2.0.14-py2.7.egg-info
YourMac:gdata-2.0.14 tosh$ cd ~/src
YourMac:src tosh$ curl -O http://googlecl.googlecode.com/files/googlecl-0.9.13.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 85690  100 85690    0     0  64726      0  0:00:01  0:00:01 --:--:-- 92637
YourMac:src tosh$ tar xzvf googlecl-0.9.13.tar.gz
x googlecl-0.9.13/
…
x googlecl-0.9.13/PKG-INFO
YourMac:src tosh$ cd googlecl-0.9.13
YourMac:googlecl-0.9.13 tosh$ sudo python setup.py install
running install
…
Finished processing dependencies for googlecl==0.9.13

これでソフトのインストールは終わり。後はGoogleへの認証のみ。これも対話式なので指示通りに入れていけばOK。
色々なGoogleのサービスへのアクセスができる。ここではyoutubeにアップロードしたリストを取得してみる。

YourMac:googlecl-0.9.13 tosh$ cd
YourMac:~ tosh$ google youtube list
Please specify user: toshiki.saito           
Please log in and/or grant access via your browser at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=4%2FA62soD028vPKHABqZA9GVQ&hd=default then hit enter.
2011 Athletic Festival,http://www.youtube.com/watch?v=hZSplbQ&feature=youtube_gdata
...
1st concert,http://www.youtube.com/watch?v=AxFNTaw&feature=youtube_gdata

次にGoogleドキュメントへのアクセスを試みる。Googleドキュメントのファイル一覧を取得してみる。指示通りにGoogleアカウントのユーザー名とパスワードを入れるとブラウザが開くので指示通りに表示された確認コード(Verification Code)を入力すると、一覧が表示される。

YourMac:~ tosh$ google docs list
Please specify user: toshiki.saito
Please log in and/or grant access at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=4%2FF9R8_nT7ulks0qGomLkhe3-&hd=default

Please enter the verification code on the success page: 3egM-DKMKArS8FQbB3
Ptosh SOP Clerk DM,https://docs.google.com/document/d/1Wx7sAik8lOAGrLMsQa-A-Tt2DTPUHPLLBiFCY/edit
...
Otsuka 2006,https://docs.google.com/Doc?docid=0AfBu_SyaL1DWYWg4bjliZ2NrNmDQ4anBocG5od2M

次に任意のファイルをダウンロードしてみる。–titleでファイル名を指定します。正規表現でまとめて複数ファイルをダウンロードすることも可能です。

YourMac:~ tosh$ google docs get --title "Mouse Inventory"
Please specify dest: test123
Downloading Mouse Inventory to test123.xls

指定しないとこのように対話式に保存ファイル名を要求される。Googleドキュメント上の「Mouse Inventory」というファイルをDocuments(書類)フォルダの中のBACKUPS/Mouse Inventoryというフォルダの中に日付を付けて「120305 mouse inventory.xls」こんな感じのファイル名で毎日バックアップさせます。–destで保存先を指定します。

YourMac:~ tosh$ google docs get --title "Mouse Inventory" --dest "$HOME/Documents/BACKUPS/Mouse Inventory/`date +%y%m%d` mouse inventory"
Downloading Mouse Inventory to /Users/tosh/Documents/BACKUPS/Mouse Inventory/120305 mouse inventory.xls

``で囲まれた部分はシェルで実行された結果をファイル名に文字列として反映させることができます。

YourMac:~ tosh$ date +%y%m%d
120305
YourMac:~ tosh$ date +%Y%m%d
20120305
YourMac:~ tosh$ date +%H%M
1600

思い通りにファイル名を指定して目的のフォルダにダウンロードできたことを確認したら、シェルスクリプトの実行ファイルにします。ターミナルのVimかTextEdit(フォーマット→プレーンテキストを忘れずに)で下記のようなテキストファイルを作ります。backupMouseInventory.shというファイル名にしました。拡張子は「.sh」である必要があります。1行目はおまじないですが、必要ですので加えて下さい。最終的にはroot権限で実行するので、”$HOME”は”/Users/tosh”とフルパスに変更します。またroot権限ではパスが通っていないので、/usr/local/bin/googleとフルパスで記載します。

#!/bin/sh
/usr/local/bin/google docs get --title "Mouse Inventory" --dest "/Users/tosh/Documents/BACKUPS/Mouse Inventory/`date +%y%m%d` mouse inventory"

ちゃんとできているか確認し実行属性を与え、実行できるかどうか確認します。パスが通っていないことあるので、ファイル名の前に「./」を付けてあるいはフルパスでファイルを指定して実行してみます。

YourMac:ScriptsMac tosh$ cat backupMouseInventory.sh 
#!/bin/sh
/usr/local/bin/google docs get --title "Mouse Inventory" --dest "/Users/tosh/Documents/BACKUPS/Mouse Inventory/`date +%y%m%d` mouse inventory"
YourMac:ScriptsMac tosh$ chmod 777 backupMouseInventory.sh 
YourMac:ScriptsMac tosh$ ./backupMouseInventory.sh 
Downloading Mouse Inventory to /Users/tosh/Documents/BACKUPS/Mouse Inventory/120305 mouse inventory.xls

上手くダウンロードされることが確認できたら、/etc/periodic/daily/にコピーまたは移動します。sudo periodic dailyとして、ファイルのダウンロードがされることを確認します。

YourMac:ScriptsMac tosh$ sudo cp backupMouseInventory.sh /etc/periodic/daily/
YourMac:~ tosh$ sudo periodic daily

ここまで上手く行ったらRoot権限でGoogleへの認証を取っておきます。
まずMacのRootアカウントを有効化します。
http://support.apple.com/kb/HT1528?viewlocale=ja_JP
上記で行なったことと同じことをRoot権限で行います。

YourMac:~ tosh$ login
login: root
Password:
Last login: Wed Mar  7 09:53:46 on console
YourMac:~ root# google docs list
Please specify user: toshiki.saito
0:123: execution error: An error of type -10810 has occurred. (-10810)
Please log in and/or grant access at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=4%2FsxerBjcxdfsUhtM4vN&hd=default
Please enter the verification code on the success page: FLehmasdfaserersgk2Xy3w

毎日早朝(3:15am)にバックアップが取られるようになりました。時間はlaunchdで設定されています。

YourMac:LaunchDaemons tosh$ cat /System/Library/LaunchDaemons/com.apple.periodic-daily.plist 
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">


	Label
	com.apple.periodic-daily
	ProgramArguments
	
		/usr/sbin/periodic
		daily
	
	LowPriorityIO
	
	Nice
	1
	StartCalendarInterval
	
		Hour
		3
		Minute
		15
	
	AbandonProcessGroup
	


最初スクリプトファイルの中でフルパスを指定しなかったら、上手く動いていなかった。ログをみると下記のようになっていたので、絶対パス指定とした。

YourMac:~ tosh$ tail -n 100 /var/log/daily.out
...
/etc/periodic/daily/backupMouseInventory.sh: line 2: google: command not found
-- End of daily output --
zp8497586rq

Rubyで満年齢、満月齢を(ExcelのDatedif)

年齢の「○歳○ヶ月○日」、つまり「何年何ヶ月と何日がカレンダー通りに経ったか」という計算を考えてみます。

年齢の定義
前日の夜中の12時とのこと。2月29日生まれの人は翌年2月28日24時、つまり3月1日0時に年齢が一つ上がることになる。誕生日は3月1日になるのですね。

閏年の定義
通常使われている西暦はグレゴリオ暦であり、
西暦年が4で割り切れる年は閏年
ただし、西暦年が100で割り切れる年は平年
ただし、西暦年が400で割り切れる年は閏年
という規則とのこと

生年月日から満年齢を計算する際、単純に引いて365で割ると閏年分が狂います。

rubyで試してみます

irb
>> require 'date'

例えば1998年3月1日生まれの人は1999年2月28日には

>> (Date.new(1999,2,28) - Date.new(1998,3,1)).to_i
=> 364 #365で割ると1未満で満0年

となり、閏年を挟まない場合は0歳で合いますが、1999年3月1日生まれの人は2000年2月29日には

>> (Date.new(2000,2,29) - Date.new(1999,3,1)).to_i
=> 365 #365で割ると1以上になり満1才と誤ってしまう

となってしまい、2000年3月1日の前日に1才になってしまいます。

普通に考えると閏年を規定する関数が必要ですが、賢い人はいるもので下記のように一旦数値化することにより閏年に無関係に正確に満年齢計算が可能になります。
つまり19990301と20000229という数値にして引き算をするというものです。10000で割ると満年齢が整数値として取得できます。
(2000229-19990301)÷10000=0.9928 → 満0年

>> y = (Date.new(2000,2,29).strftime('%Y%m%d').to_i - Date.new(1999,3,1).strftime('%Y%m%d').to_i)/10000
=> 0 #満0年
>> y = (Date.new(1999,2,28).strftime('%Y%m%d').to_i - Date.new(1998,3,1).strftime('%Y%m%d').to_i)/10000
=> 0 #満0年
>> y = (Date.new(2000,3,1).strftime('%Y%m%d').to_i - Date.new(1999,3,1).strftime('%Y%m%d').to_i)/10000
=> 1 #満1年

小児科領域の場合、1才未満の月齢計算も必要になります。これも満月齢という考え方で良いようです。8月31日生まれの人は10月1日に1ヶ月齢になります。
これも単純に30で割ったりすると実際には1ヶ月は28日〜31日までバラツキがあるのでおかしいことになります。

>> (Date.new(1999,3,1) - Date.new(1999,2,1)).to_i
=> 28 #満1ヶ月だが30で割ると1未満に

しかしこれもstrftime.to_iを使った数値化をよく見ると、万の桁のくり下がりは必ず12、つまり1年=12ヶ月なので月齢は下記のように計算できます。

>> m = (Date.new(1999,3,1).strftime('%m%d').to_i - Date.new(1999,2,1).strftime('%m%d').to_i)/100
=> 1
>> m<0 ? m+12 : m
=> 1 #満1ヶ月

>> m = (Date.new(2000,2,1).strftime('%m%d').to_i - Date.new(1999,11,1).strftime('%m%d').to_i)/100
=> -9
>> m<0 ? m+12 : m
=> 3 #満3ヶ月

>> m = (Date.new(2000,1,31).strftime('%m%d').to_i - Date.new(1999,11,1).strftime('%m%d').to_i)/100
=> -10
>> m<0 ? m+12 : m
=> 2 #満2ヶ月

同じ原理で満年齢、満月齢が分かったところで端数の日数が分かるか、つまり「何年何ヶ月と何日がカレンダー通りに経ったか」という問に答えようとします。

末日の日付が起算日の日付と一緒かより大きい場合は単純に日付を引くだけです。起算日の日付の方が大きい時が問題になります。起算日より満年月を足した年月日を末日より引く操作が必要になります。

先ず満年月をきちんと足せるかどうかを確認

>> (Date.new(1999,1,31) >> 1).to_s #満1ヶ月後
=> "1999-02-28"
>> (Date.new(1999,1,31) >> 1+12*1).to_s #満1年1ヶ月後
=> "2000-02-29"
>> (Date.new(2000,2,29) >> 12*1).to_s #満1年後
=> "2001-02-28"

と大丈夫そう。

>> y = (Date.new(2004,3,12).strftime('%Y%m%d').to_i - Date.new(2000,10,20).strftime('%Y%m%d').to_i)/10000
=> 3 #満3年
>> m = (Date.new(2004,3,12).strftime('%m%d').to_i - Date.new(2000,10,20).strftime('%m%d').to_i)/100
=> -8
>> m = m<0 ? m+12 : m
=> 4 #満2ヶ月
>> d = Date.new(2004,3,12).day - Date.new(2000,10,20).day
=> -10
>> d = (d<0 ? Date.new(2004,3,12) - (Date.new(2000,10,20) >> y*12+m) : d).to_i
=> 21 #端数の日数は21日

メソッド(関数)を書いてみました。

datedif.rb

require 'date'
#
#= DATEDIF function in Excel
#
#Authors::   Toshiki I. Saito
#Version::   1.0 2011-09-08 tosh
#License::   The MIT License
#--
# starting: Starting date
# ending: Ending date
# Interval: Meaning; Description
# y: Years; Complete calendar years between the dates.
# m: Months; Complete calendar months between the dates.
# d: Days; Number of days between the dates.
# ym: Months Excluding Years; Complete calendar months 
#     between the dates as if they were of the same year.
# yd: Days Excluding Years; Complete calendar days 
#     between the dates as if they were of the same year.
# md: Days Excluding Years And Months; Complete calendar days 
#     between the dates as if they were of the same month and same year.
#++
def datedif(starting, ending, interval)
  if ending < starting then false
  else
    interval = interval.downcase
    years = (ending.strftime('%Y%m%d').to_i - starting.strftime('%Y%m%d').to_i)/10000.to_i
    months = (ending.strftime('%m%d').to_i - starting.strftime('%m%d').to_i)/100.to_i
    months = months<0 ? months+12 : months
    days = ending.day - starting.day
    case interval
      when 'y' then years
      when 'm' then years*12 + months
      when 'd' then (ending - starting).to_i
      when 'ym' then months
      when 'yd' then (ending - (starting >> 12*years)).to_i
      when 'md' then (days<0 ? ending - (starting >> 12*years+months) : days).to_i
      else false
    end
  end
end
>> require 'datedif'
=> true
>> today = Date.today
=> #
>> bd = Date.new(1969,3,13)
=> #
>> print 'Your age: '+datedif(bd,today,'y').to_s+' years '+datedif(bd,today,'ym').to_s+' months '+datedif(bd,today,'md').to_s+' days.'
Your age: 42 years 5 months 26 days.=> nil
>> print '今日で'+datedif(bd,today,'y').to_s+'歳'+datedif(bd,today,'ym').to_s+'ヶ月'+datedif(bd,today,'md').to_s+'日です。'
今日で42歳5ヶ月26日です。=> nil

とりあえず動いている様子。

こんな面倒な年齢の「○歳○ヶ月○日」や在職期間の「○年○ヶ月○日」といった表示の計算がExcelではDatedifという簡単な式として定義されています。さっすがExcelですね。、、と思いきや結構バグだらけな様子。確かに手元にあるExcell 2002(Windows)でも

=DATEDIF("2003/10/31","2003/11/10","md") → 10 #本当は10日間。これは合っている。
=DATEDIF("2003/10/31","2003/12/10","md") → 9  #本当は10日間。間違い。
=DATEDIF("2008/4/30","2009/3/1","md") → -1 #マ、マイナス?

>> datedif(Date.new(2003,10,31), Date.new(2003,12,10),'md')
=> 10 #合っている
>> datedif(Date.new(2008,4,30), Date.new(2009,3,1),'md')
=> 1 #合っている

ここにバグが良くまとまっているが結構きている。おかしいのはMDとYDなので実害が少ないということで放置なのだろうか。

ちなみにExcelのdatedifの引数に上記のメソッドは合わせました。

DATEDIF(開始日,終了日,単位)
この日から(開始日)
この日までを(終了日)
この単位で(単位)
単位:
"Y"	指定した期間の年数(満年数)を表示
"M"	指定した期間の月数(満月数)を表示
"D"	指定した期間の日数(満日数)を表示
"YM"	指定した期間の1年に満たない月数を表示
"MD"	指定した期間の1ヶ月に満たない日数を表示
"YD"	指定した期間の1年に満たない日数を表示
例:=DATEDIF("1999/3/1","2000/2/29","YM") → 11

VBのdatediffというのはExcelのdatedifとは異なり、「満年齢、満月齢、端数の日数」という計算は出来ない。

それ以上の間隔 Interval が DateInterval.Year に設定されていると、戻り値は単純に Date1 の年と Date2 の年から求められます。同様に、DateInterval.Month の戻り値は、引数の年と月の部分から求められ、DateInterval.Quarter の戻り値は、2 つの日付を含む四半期から求められます。たとえば、12 月 31 日と翌年の 1 月 1 日を比較する場合、差は 1 日ですが、DateDiff は DateInterval.Year、DateInterval.Quarter、DateInterval.Month に対して 1 を返します。

記載されています。

Google Spreadsheetにもdatedif関数は実装されていませんでした。

PerlにはTimeDate->delta_days, TimeDate->delta_monthsという実装があり、端数の日付取得もできるようです。

年齢以外の応用には「期間の定義」自体が色々あるようで慎重になったほうが良いようです。

Mac VMware Fusion – CentOS 5.5にRails最速構築(35分)

目的:Minimum CentOS 5.5上にRails構築し、MacのTerminalで全部操作可能に
副目的1:実際の運用に近い環境で構築したい
副目的2:何度でも気軽に環境再構築したい

“//”に続く部分はコメントです。それ以外の部分を実際に操作する。
CentOS 5.5を以下を参考にminimum install
http://isoredirect.centos.org/centos/5/isos/i386/
image fileの1のみisoイメージをダウンロード(624MBなので早い)
2010.12.24時点では下記が最新
http://ftp.riken.jp/Linux/centos/5.5/isos/i386/CentOS-5.5-i386-bin-1of7.iso

VMware Fusionを起動して

File > New...
Click 'Continue without disc'
Select 'Use operating system installation disc image file'
Click 'Continue'
Click 'Continue'
Unselect 'Use Easy Install' //Easy installとやらは使わない
Click 'Continue'
Click 'Finish'
Click 'Save'
Type 'linux text ' //別にGUIでやっても構わない。 以下←↓↑→とスペースキーで選択,[return]で決定
Select 'Skip'
Select 'OK'
Select 'OK'
Select 'OK'
Select 'Yes'
Select 'Remove all partition on....'
Select 'OK'
Select 'Yes'
Select 'No'
Select 'Yes' // eth0
Select 'Active on boot' 'Enable IPv4 support'
Select 'OK'
Select 'OK' //DHCP
Select 'OK'
Select 'Asia/Tokyo'
Select 'OK'
Type in root password
Unselect all
Select 'Customize software selection'
Select 'OK'
Unselect all //少しでも残っているとDisk 1以外のinstallerが必要になり面倒
Select 'OK'
Select 'OK' //log. 186 packages 387MB
Select 'Reboot'
//Network Adaptorはセキュリティ確保のためNAT接続としておく(window右下<…>アイコン)
//CentOS 5.5インストール終了、ここまで約10分経過

rootでログイン
先ずはMacのTerminalから操作できるように設定
参考:http://kajuhome.com/telnet.shtml

#telnet-serverインストール (sshは設定面倒...)
yum -y install telnet-server
#telnetがらみの設定ファイルを書き換える
#viはhjklで←↓↑→,iでinsert,aでappend,xで削除,ESCで抜け,ZZで保存終了
#下記、文頭に"-"がついている行を削除して "+"の行を追加
#hostのMacからだけアクセスできるように。確認するにはMacのTerminalでifconfigを。
#通常はCentOSのipアドレスの末尾の数字が1になるだけ。
vi /etc/hosts.allow
+ in.telnetd : 192.168.210.1
vi /etc/hosts.deny
+ in.telnetd : ALL
vi /etc/xinetd.d/telnet
- disable = yes
+ disable = no
#TelnetでMacから接続出来るように
/etc/init.d/xinetd restart
/etc/init.d/iptables stop
#Macのログインで使っているユーザー名を追加。toshはあくまで例です。
useradd tosh
#そのユーザー名のpasswordを設定。
passwd tosh
#ifconfigにてCentOSのip address(inet addr)をメモる。以下192.168.210.131だったとする
ifconfig
exit
//約15分経過

ここからはMacのTerminalで操作。コピペ出来るようになり楽チン。
後はMacで下記のコマンドをTerminalへ一行ずつコピペ。質問には全て’y’ (yes)で返答。

#まずCentOSのipアドレスに先ほど設定したユーザーのpasswordでログイン
telnet 192.168.210.131
#ルート権限に。suの後の"-"の入力大切。CentOSのルートパスワードを入力。
su -
#システムをアップデート
yum -y update
#NATなのでfirewallをoffにして、Macのターミナルから常にアクセスできるようにする。
#HostのMac以外からはpingも通らなかったので大丈夫かと
chkconfig --level 2345 iptables off
#kernelもアップデートされるので
reboot
#再起動後もう一度telnet, su
#今度は"-8"という8bitオプションを付けて起動。
#これで実際にプログラミング時に必要な日本語入力が出来るようになる。
telnet -8 192.168.210.131
su -
#makeコマンド使えるように、また後々色々足りないと怒られないようにするために次をインストール
yum -y groupinstall base 'Development Libraries'
#ruby, sqlite3, rubygemsはyumやgemでインストール出来ないので個別にコンパイル
#wgetはダウンロードに, gccはコンパイルに必要
yum -y install wget gcc
#約25分経過

rubyのインストール

#~/srcなどソースを置く場所を指定。どこでもOK。面倒なので~にしている。
cd
wget ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p302.tar.gz
tar xzvf ruby-1.8.7-p302.tar.gz
cd ruby-1.8.7-p302
./configure --prefix=/usr
make && make install
ruby -v
#ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-linux]と表示されればOK

sqliteのインストール
“sqlite3-ruby only supports sqlite3 versions 3.6.16+”との事なのでyumでは取れない
参考:http://blog.crm.co.jp/2010/08/centos_redmine_100_rc_7.html

cd
wget http://www.sqlite.org/sqlite-autoconf-3070400.tar.gz
tar xzf sqlite-autoconf-3070400.tar.gz
cd sqlite-autoconf-3070400
./configure --prefix=/usr
make && make install
sqlite3 -version
#3.7.4と表示されればOK

RubyGemsのインストール

cd
wget http://rubyforge.org/frs/download.php/70696/rubygems-1.3.7.tgz
tar xzf rubygems-1.3.7.tgz
cd rubygems-1.3.7
ruby setup.rb
gem -v
#1.3.7と表示されればOK

Railsのインストール

gem install rails --version 2.3.8 --include-dependencies
#結構時間掛かる。フリーズしていないので待つ。version 3以降でOKの場合は"--version 2.3.8"の記載不要。
rails -v
#Rails 2.3.8と表示されればOK
gem install sqlite3-ruby
#rootではなく通常ユーザー(この場合tosh)に戻る
exit
#ここまで約35分

以上でRailsインストール終了!
CentOS 5.5のイメージのダウンロード開始からここまで実測35分で終了した。
途中でVirtual Machine > Snapshots > Take Snapshots… でイメージを保存しておいても良いかも知れない。

ここからは現在最も良いと思われるRails入門書に沿ってRails勉強可能!
この本ではRails 3は対応していないので、上記の通りRails 2.3.8をインストールした次第。
Head First Rails ―頭とからだで覚えるRailsの基本

この本の7頁からに従って

rails tickets
cd tickets
ruby script/server

Mac側のブラウザでCentOS on VMware上のRailsを表示

http://192.168.210.131:3000 //CentOSのipアドレスを指定。ポートはデフォルトで3000番

にて

Welcome aboard
You’re riding Ruby on Rails!

が表示され

About your application’s environment

というところをクリックしてエラーがでなければ成功!

ちなみにRuby入門書で現在最適なのはこれ。
初めてのRuby
Enjoy!

子供(小学生)がプログラミングを学ぶには

小学生にプログラミングに興味を覚えてもらい、遊び感覚であっても汎用性のある学習が出来る教育プランを考えてみた。

【背景】

小学生にとっては子供同士で遊ぶこと(人間関係の実感の第一歩!)、基礎体力、音楽(個人的趣味ですが、、)が一番大切なのではと考えている。周囲の子供が小学校低学年から、塾に行きまくっているのを驚いている。しかし、それだけ学習に時間を費やすなら、プログラミングに触れる機会があっても良いのでは。

一般的な小学校の授業でカバーされていないが大切な教育分野の一つにプログラミングがあると思われる。

これは今後数十年、日本で必要とされる頭脳労働のニーズが先ず間違い無く統計処理を必ず伴う分野であり、恐らく次世代を担う子供たちに必須の技能になるかと思われるから。自分の周りで言えば、Genome Project(ゲノムDNAの解析)に大陸を超えてリクルートされた科学者は自然言語の解析をしていた。両方共「情報」を扱う仕事であり、プログラミングの基礎は必須である。私の本職の一部である分子生物学が今明らかにピークを越し、システムバイオロジー的な考え方が生命科学の理解には必要。医学は生命科学に直結し、この停滞した経済の中、ITと医療産業だけは高齢化と相まって、日本国内で圧倒的な右肩上がりの分野になっている。また、この高齢化に対応する医療という分野では日本は宿命的に世界の先駆けにならざるを得ないが、それは成功すれば長期的に武器になる可能性がある。「膨大な情報をどう意味のある形にするか?」その考え方を身につける日本人が増えることは、日本が世界で生き延びるための頭脳労働の鍵の一つに思える。

小学校中高学年ぐらいからプログラミングに触らせる機会を設けて、興味を持った子にはどんどん機会を与えて良いのではないだろうか。ゲーム機よりもハマれば面白い分野である。

子供に対しての教育は「最低限の基礎知識を与えつつ動機付けをする」ことに尽きるように思える。つまり、「やりたい」と思える機会を与えること。 「やりたい」と思えるためには「それで何が出来るのか」がイメージ出来て「自分でもできそう」と感じることが大切。小学生に対してこの目的を達成することが、この教育プランの目的である。

四則演算が何とかなり始めるのが小学校3−4年。その辺りを対象に。

【プログラミング教育プランの私案】

小学4年ぐらいまで:Scratch
引数と戻り値の概念が明確でないが、オブジェクト指向になっている

次のステップ:Ruby + Shoes + Ruby/SDL
やはり小学校高学年程度では目に見えたり耳に聞こえたりすることが大切に思える
ここではObject Oriented Programing(OOP)Classについて学ぶ。ついでに実用の面ではMVCについて

次のステップ:Assembler
ここではサンプルコードを書くぐらいで良いのでは。マシン語とアセンブラレベルでのCPUの挙動を何となく頭に入れる。要はポインタの概念が当たり前になるため。

次のステップ:C
何はともあれ、ここが原点。ここでメモリ管理についてを習得する。

ここまで来ればあとはC++Object-CなどOOPへの移行はRubyでの経験が生きるだろうし、Web方面に走ればPHPが楽だったり、SQL言語が必須になるだろう。Googleのプラットフォームを使いたければPythonNoSQLについて学ぶだろうし、Javaへの移行もCとRubyを習っていれば大丈夫でしょう。いずれにせよ子供は「やりたい!」と思えば後は勝手に本やWebを漁って自分で学習する。

【補遺】

私は職業プログラマでないし、実際に動くコードを書いて利用しているのはMS-DOSのバッチプログラム、PHP+HTML+JavaScript+CSS+MySQLのWebプログラム程度である。上記プランは主にWeb上で言語仕様と周辺状況を勉強してサンプルコードを書いたぐらいで得た感覚より作成したものである。本来は国が教育プログラムに上げるべきだろうが、早くて数年、遅くて数十年公的なカリキュラムに取り入れられるまでにかかるだろう。それまでは、プライベートの機関、あるいは親がそのレールをある程度引いてあげる必要がある。

実際にScratch, Rubyで興味が湧いた子は他のLightweight Languages (Ruby, Python, PHP, Javascript)やJavaなどをいじりながらCに触れることになりタイミングとしては良いように思うがどうだろうか。

将来的にプログラマーを増やすことが大切だとは感じていない。但し、プログラミングが理解できるSE的な思考回路を持った人材は豊富に必要だと思われる。官僚が分子生物学を理解していないために、日本はかなり国益を損じたと感じているが、同じことがプログラミングにおいて起きやしないか多少心配である。プログラマー、教育者、その他の方々から忌憚ない御意見を伺えれば幸いである。

【次のステップ】

小学生向けの高品質のサンプルプログラムとチュートリアル、つまり「教科書」が欲しい。誰がどこで作るインセンティブがあるだろうか。

【参考】

Scratch: MITで考案された。日本の文科省が今年プログラミンという形でウェブアプリとしてパクったが、英語に馴染めるなら最初からScratchの方が良いし、コンテンツも充実している。
スクラッチアイデアブック―ゲームで遊ぶな、ゲームを作ろう! ゼロから学ぶスクラッチプログラミング

Ruby: 日本人である まつもと ゆきひろ さんにより開発され、世界的に評価を浴びている 。OOPが自然に身につく上、何と言うかバランスが美しい。
初めてのRuby

Shoes: RubyでのGUI(Graphic User Interface)プログラミング環境。Shoesはマイナーだと思われるし、まだ実際に使用していないので合間を見てやってみようかと思っている。四則演算ぎりぎりの子供に対してScratchの次のステップとしての提供物が難しい。

Ruby/SDL: RubyからSDLを利用できるようにするため、つまりゲームなどを作るためのライブラリ。Shoesよりはこちらの方が小学生には受けそうだが、どうだろうか。ここで速度が欲しくなり、Cに興味を持ってもらえれば思惑通りだが。次のシステムをインストールすれば、テキストファイルを一枚書き換えるだけで簡単にプログラムを作成し、実行ファイルの形で他の人に配布できます(Windows版Mac版)。

Object Oriented Programing (OOP): ググッてください。分かる人には一行で説明できますが、分からない人への一行はひたすら抽象的な無意味な文になります。一般性が高く、早めに身につけて良い概念だと思え、Rubyというのは自然にそのような考え方をしやすくなる言語に思えます。

MVC (Model-View-Controller): プログラムをModel, View, Controllerという3パートに分けて考え、構築する概念。

Assembler: Assemblerレベルよりももっと原始的なレベルにまで話は落とせると思うが、Cのポインタを理解すれば、それより下部構造に関してはUserではなく、コンピュータの専門家に任せるか必要な際に学べば良いと思います。ここでは義務教育に将来的に取り入れられても良いような教育プランに関して考えています。

C: この言語を素通りは出来ないと思われる。Assemblerというコンピュータに理解しやすく、人間にはまるで理解しにくい言語から、一歩人間側に寄り添った言語。それ故、OS(UNIX)や上記の様々なコンピュータ言語(Ruby, PHP)など、基礎的なプログラムのかなりがこのC言語で記載されている。
やさしいC 第3版 [やさしいシリーズ]

インド: 小学校低学年からパソコンを使い始め、小学校の高学年(12歳)になると、プログラミングが出来るようになる。

zp8497586rq

無料のサーバー・ドメイン、Top Free Webhosting | Lifehacker

Top Free Webhosting | Lifehacker

実際に運用する上で私なら一番気になるのが、1.強制広告(Forced Ads)と2.強制契約解除(Inactivity limit)。

以前紹介したPandela.comなども良いのだが、1カ月おきに一々アカウントの継続を申請しないといけないのが鬱陶しい。

この中で広告なし、かつ使わなくても契約が自動的に解除されない(少なくともその記載が無いもの)のものを探してみた。
AWARDSPACE.COM

これしか無い。で、スペックを見ると
AWARDSPACE.COM – SPEC

とまあまあ。MySQLが10MBというのが気になるぐらいでWord Pressを軽くSetupするには良いサイトに思えた。

無料のドメインはxxx.awardspace.comというものが作れる。つまりxxxの部分に自分の好きな文字を入れることができる。

index.htmlをWeb上だけでゴチョゴチョっといじくれるのが便利だったりする。

下記を表示させるまで5~10分ほどで完了
http://tosh.awardspace.com/

File ManagerもFTPの設定も簡単。どうでしょうか、テストサイトなどに。

広告無しの無料サーバー&サブドメイン(free server and domain)

以前登録していた無料サーバー(150MB)+無料サブドメインが閉じていたが、新規登録も含めて先ほど再開。無料版はまた閉じるかもしれないので、興味のある人はお早めに。特にテスト用ドメイン+サーバーや手軽な広告無し無料サーバーを探している人にお勧めです。

右下の「Sign up for a free hosting account…」から登録して見てください。なんの制約も無くいきなり使えます。インターフェースも洗練されていて、ローカルファイルのアップロードも簡単です。

Affordable Web Hosting By Pandela.com – Free Domain For Life

フリーでもEmail, Perl, PHP5, MySQLとかなりいけてます。XREAは50MBで広告あり。こちらは150MBで広告無し。結構良いかと。

Pandela.com – Premium VS Free Web Hosting

登録後、ログインし

MAIN MENU > Domain manager > Add subdomain

drop down menuで自分の気に入ったドメインとサブドメイン名の欄に何か好きな文字列を入れます。
5個まで自分の好きなサブドメインが登録できます。

次にVeiw subdomainsをクリックし、ファイルをアップロードしたいサブドメイン名の右横のMenuをクリックします。出てきたポップアップメニューからManage Filesをクリックします。(エラーメッセージがでることがありますが、エラーメッセージ中のGo Backをクリックするとファイルマネージャーになります。)後は自分のサブドメイン名のフォルダに好きなhtmlファイルなり何なりコンテンツをアップロードするだけです。

追記2007.7.6:
Pandela.comは1カ月おきに一々Loginしてアカウントの継続宣言をしないといけない。これは面倒。その点でこちらの方がお勧め。