docker-composeでwordpressをローカルに最速リストア(22分,Windows)

データのバックアップ

wordpress.sql(SQLダンプファイル)はBackWPupのプラグインの1クリックバックアップで、wp-contentフォルダはftpなどでローカルの適当な所に取得しておく。(4分)

PS C:\Users\tosh> cd .\Downloads\
PS C:\Users\tosh\Downloads> ls
    ディレクトリ: C:\Users\tosh\Downloads
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/02/18     14:16                wp-content
-a----       2018/02/18     14:13        1337244 wordpress.sql

Docker for Windowsのインストール

Install Docker for Windows | Docker Documentation
よりdockerをインストールする。一度ログアウトさせられ、更に再起動する。(6分)

docker-compose.ymlの作成

[windows]キー+[R]にて”powershell”と入力し、powershellを起動する。ローカル環境用のフォルダを作成する。下記では”aronaswp”だが、フォルダ名は何でもOK。

PS C:\Users\tosh\Downloads> cd ..
PS C:\Users\tosh> mkdir aronaswp/db-data
PS C:\Users\tosh> cd aronaswp
PS C:\Users\tosh\aronaswp> ni -type file docker-compose.yml
PS C:\Users\tosh\aronaswp> ii docker-compose.yml

ノートパッドでdocker-compose.ymlを開き、下記をコピペして保存。(2分)

version: "2"
services:
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=root
    volumes:
      - db-data:/var/lib/mysql
      - ./db-data:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - 3306:80

  wordpress:
    image: wordpress:latest
    ports:
      - 8888:80
    depends_on:
      - mysql
    links:
      - mysql
      - phpmyadmin
    environment:
      - WORDPRESS_DB_HOST=mysql:3306
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=wp_user
      - WORDPRESS_DB_PASSWORD=root
    volumes:
      - ./wp:/var/www/html/
    restart: always

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 8080:80
    volumes:
      - /sessions
    restart: always

volumes:
  db-data:
    driver: local

ローカル環境の立ち上げ

フォルダを開いてwordpress.sqlを移動する

PS C:\Users\tosh\aronaswp> cp ..\Downloads\wordpress.sql .\db-data\
PS C:\Users\tosh\aronaswp> tree . /f
フォルダー パスの一覧
ボリューム シリアル番号は 00000028 AE0F:1A50 です
C:\USERS\TOSH\ARONASWP
│  docker-compose.yml
│
└─db-data
        wordpress.sql

docker-composeを走らせる

PS C:\Users\tosh\aronaswp> docker-compose up -d

途中でcドライブをシェアしますか、Firewallでのアクセス許可しますか、など質問が来るので全てyesと答える(4分)
下記のエラーが出る場合にはDockerでpullやrunを行ったときイメージダウンロードができなくなった問題の解決法 – 佐藤の屋敷に沿って、DNSサーバーを固定すると上手くいく。

PS C:\Users\tosh\aronaswp> docker-compose up -d
Pulling mysql (mysql:latest)...
ERROR: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

メディアファイル・テーマ・プラグインなどのリストア

wp-contentフォルダを上記のwpフォルダ内にコピーする。(1分)

PS C:\Users\tosh\aronaswp> cp ..\Downloads\wp-content\ .\wp\

ドメイン名の書き換え

「WordPress の引越し – WordPress Codex 日本語版」にて推奨されている「WordPressデータベース用検索と置換スクリプト」を下記よりダウンロード
Database Search and Replace Script in PHP | interconnect/it
下記のように”wp”フォルダの直下に解凍してできた”Search-Replace-DB-master”フォルダを移動する。

PS C:\Users\tosh\aronaswp> cp ..\Downloads\Search-Replace-DB-3-1-0-emaildownloads\Search-Replace-DB-master\ .\wp\

http://localhost:8888/Search-Replace-DB-master/にアクセスする。

元のドメインが”example.com”で”WordPress”というサブディレクトリにインストールされていた場合は
replace [example.com/WordPress] with [localhost:8888]と指定して、[live run]をクリックして変換。更に
replace [example.com] with [localhost:8888]と指定して、[live run]をクリックして変換。
ルートディレクトリにインストールされていた場合は2つ目の変換だけでOK(5分)

これでhttp://localhost:8888/にリストア完了。ここまで合計22分。
* Macでの同じ操作。

docker-composeでwordpressをローカルに最速リストア(15分,Mac)

データのバックアップ

wordpress.sql(SQLダンプファイル)とwp-contentフォルダをサーバーよりローカルの適当な所にコピーする
wordpress.sqlはBackWPupプラグインの1クリックバックアップで、wp-contentフォルダはftpなどで取得しておく。(1分)

Docker for Macのインストール

Install Docker for Mac | Docker Documentation
dockerを起動。初回のみMacのログインパスワードを聞かれる(1分)

docker-compose.ymlの作成

「docker-composeで作るWordpress環境 – Qiita」を参考にテキストエディタでdocker-compose.ymlを下記のように作成する。(1分)

version: "2"
services:
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=root
    volumes:
      - db-data:/var/lib/mysql
      - ./db-data:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - 3306:80

  wordpress:
    image: wordpress:latest
    ports:
      - 8888:80
    depends_on:
      - mysql
    links:
      - mysql
      - phpmyadmin
    environment:
      - WORDPRESS_DB_HOST=mysql:3306
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=wp_user
      - WORDPRESS_DB_PASSWORD=root
    volumes:
      - ./wp:/var/www/html/
    restart: always

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 8080:80
    volumes:
      - /sessions
    restart: always

volumes:
  db-data:
    driver: local

ローカル環境の立ち上げ

ローカル環境用のフォルダを作成する。下記では”aronaswp”だが、フォルダ名は何でもOK。

$ mkdir aronaswp
$ mkdir aronaswp/db-data

wordpress.sqlとdocker-compose.ymlをコピー又は移動する。下記のようになるはず。

$ tree aronaswp
aronaswp/
├── db-data
│   └── wordpress.sql
└── docker-compose.yml

ローカル環境用のフォルダに移動して、docker-composeを走らせる

$ cd aronaswp
$ docker-compose up -d

コンパイルが終わって立ち上がると下記のようにフォルダが出来ている。(6分)

$ tree . -L 2
.
├── db-data
│   └── wordpress.sql
├── docker-compose.yml
└── wp
    ├── index.php
    ├── license.txt
    ├── readme.html
    ├── wp-activate.php
    ├── wp-admin
    ├── wp-blog-header.php
    ├── wp-comments-post.php
    ├── wp-config-sample.php
    ├── wp-config.php
    ├── wp-content
    ├── wp-cron.php
    ├── wp-includes
    ├── wp-links-opml.php
    ├── wp-load.php
    ├── wp-login.php
    ├── wp-mail.php
    ├── wp-settings.php
    ├── wp-signup.php
    ├── wp-trackback.php
    └── xmlrpc.php

メディアファイル・テーマ・プラグインなどのリストア

wp-contentフォルダを上記のwpフォルダ内に上書きコピーする。(1分)

ドメイン名の書き換え

「WordPress の引越し – WordPress Codex 日本語版」にて推奨されている「WordPressデータベース用検索と置換スクリプト」を下記よりダウンロード
Database Search and Replace Script in PHP | interconnect/it
下記のように”wp”フォルダの直下に解凍した”Search-Replace-DB-master”フォルダを移動する。

aronaswp
├── db-data
│   └── wordpress.sql
├── docker-compose.yml
└── wp
    ├── Search-Replace-DB-master
    ├── index.php
    ├── license.txt
(以下略)

http://localhost:8888/Search-Replace-DB-master/にアクセス

元のドメインが”example.com”だった場合は上記のように変換先を”localhost:8888″に指定して、”live run”をクリックして変換。
元のwordpressがサブディレクトリ”path”にインストールされていた場合は下記のように先にpath付きで置換した後に、上記のようにドメインのみの部分を置換する。(5分)

http://localhost:8888/にリストア完了。ここまで合計15分。

確認・その他

http://localhost:8888/wp-admin
でダッシュボードに入って、プラグインを有効化したり、アップデートがあれば行う。
ローカルの環境(buildしたcontainer)を保存したままサービス停止するのは

$ docker-compose down

やり直すためにbuildしたcontainerを停止した上に削除するには

$ docker-compose down -v

バックグラウンド(daemon)ではなく、ログを出力させながらdocker-composeさせるには

$ docker-compose up

http://localhost:8080でphpMyAdminにてDB内容の確認可能。
treeコマンドは必要あればhomebrewでインストール

$ brew install tree

以上。

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!

ベアフットランニング(裸足ランニング)

きっかけ

先ずは強く印象に残ったビデオを2つ。合計13分です。オリンピックチャンピオンのDibabaさんの走りは本当に美しいですね。

Tirunesh Dibaba

このビデオの右上の”More Info”という所をクリックしてみて下さい。彼女は17才まで裸足でレースに出ていたと書かれています。

Lee Saxby

私はこのビデオにかなりショックを受けた。
モデルにランナーではなく普通の人を使っているのも良い感じ。改善点が明確に分かる。よく見ると骨盤も立っている、無理に意識しなくてもスクワットをやる過程で体が覚えるのだろうか。

腰椎分離症と腰椎ヘルニア持ちで、両膝合計3本の靭帯が伸びている。右肩は脱臼後スムーズに回らず、首から肩にかけて神経痛が走ることがある。ところが人との出会いから昨年11月より週に2回ほど走るようになった。古怪我多く、スポーツはしていても持久走は最も苦手で嫌いだった自分が、である。指導者のおかげで到底無理と思っていた10km程度をそれなりに走ることができるようになったが、それでも膝と腰は傷みがち。

そこで上記のビデオに出会い、DibabaさんはMidfoot strike(踵着地ではなく、踵より前方部分で着地していること)だけど、上級者向けで自分には関係無いだろうと思っていたことが不意に自分にも関係あることに思えてきた。

多分裸足走りで最も有名なBarefoot Tedは何を試しても膝が痛み、やけになって靴を脱いで走ったら痛みが無く走れて驚いた。そこから始まったという話のこの本はベストセラーになっている。


BORN TO RUN 走るために生まれた
~ウルトラランナーVS人類最強の”走る民族”

クリストファー・マクドゥーガル (著), 近藤 隆文 (翻訳)


科学的裏付け

科学的な裏付けはNatureという有名誌に載ったハーバード大学教授の論文が常に引用されています。ここのWebsiteによくまとまっておりNatureの原文もPDFで読めます。

Professor Daniel Lieberman

Lee Saxby
ま、理論はさておき、自分は2つ目のビデオで紹介されたLee Saxbyの指導が自分には直感的に正しいと感じられた。

一般人ではなくランナーがLee Saxbyの指導を受けた場合

どうだろうか。beforeも良いランニングに見えるが、afterは明らかに違っている。走りの専門の人が見たらどう思うのだろうか、興味深い。

プロの指導者に聞いたところ、上級者はそもそも殆どがMidfoot strikeになっている(踵着地の人はいない)が、それでも裸足ランニングでアキレス腱炎、ふくらはぎの故障、足底の炎症で故障する人がいるとのこと。つまり早いランナーなりの強力な足の負荷に足底・アキレス腱・ふくらはぎは耐えられないことがあるというわけである。ランナー用のシューズで成長期を過ごしたために、成長期後の裸足トレーニングは過負荷になるのだろうか。

靴選び

とにかく自分の体で実験したくなった。ではどの靴を買うか、私は今、週2-3回走ることを初めて半年、10kmを1キロ5分40秒ぐらいで月間50-100kmを走る初心者ランナーである。今だったこう買うなと思われる順に並べてみた。要は従来のランニングシューズからの移行がしやすい順という意味である。Nike Free or Atlas Instinct → New Balance Minimus → Vivo Barefoot → Vibram 5 fingers → Sandals!
こんな順ではなかろうか。
All Aboutの谷中 博史さんが概説をしてくれています。

とにかくかなりの長距離を走り込んでいる人の長期モニタリングレポートが一番参考になる。そんなものを集めてみた。

Nike Free Run+


ナイキ フリーラン+3
NIKE FREE RUN +3


ファースト・インプレッション

4ヶ月、400マイル(640km)走破後のレポート

Nike FreeはMinimal ShoesやBarefoot runningとは異なると思いますが、そこに移行するまでのステップとしては良いかと。Midfoot Strikeを意識して走ると、踵のクッションの高さが邪魔になることがよく分かる。要はハイヒールを履いて走っているような感覚になり、かかとが引っかかる感じがする。その点がどうかなと。でもこのビデオの人はべた褒めです。

Altra Instinct

■1万円以上ご購入で送料無料■【ALTRA/アルトラ】 THE INSTINCT (教本代含む)
アルトラ・インスティンクト
ALTRA INSTINCT


1年以上の走り見込み後のレポート

このビデオの作者はBarefootというかMidfoot Strikeへの移行の方法について非常に詳しく語っている。右上のMore Infoから他のビデオも見てもらえると参考になる。
恐らくこの靴がTransitionには最適に思える。特に長距離を走る人には。つま先からヒールまでのソールの厚みが一定。コアなお店が扱ってますね。

New Balance Minimus


ニューバランス ミニマス アウトドア MT20
New Balance Minimus



ショップの人が色々と試した経緯を話している。

BROOKS PURE CONNECTもウルトラマラソンなど長距離トレーニング用として褒めていますが、New BalanceのMT20はべた褒めで2足持っているとのこと。ミニマスMT20についてはAll Aboutの谷中 博史さんが良いレビューをしてくれています。

Vivobarefoot


ヴィヴォ ベアフット ネオ
Vivo Barefoot Neo



ヴィヴォ ベアフット エヴォ II
Vivo Barefoot EVO II




Saxbyが良いとビデオの中で話していて$160のものが4,000円代で通常配送無料・30日間返品送料無料というのに惹かれて両モデルを取り寄せてみた。色合いは好きなモノが無かったが、履き心地は明らかにNeoの方が良かったので、そちらに。部屋の中では気づかなかったが、外に出てびっくり。本当にクッションも何も無いように感じた。説明書ではインソールはなるべく取ったほうが良いと書かれていたが、無しではとんでもないという感じ。まずは用心深く足が壊れないように、足底・アキレス・ふくらはぎをトレーニングしようと思う。いきなりやりすぎた感アリアリ。先ずはAltraかNike Freeを購入すべきだったと思う。ま、買ってしまったので、取り敢えずはこれでしばらく試してみる。

今、2回Vivo Barefootで1〜4kmほどジョギング程度の走りをしたが、あっという間にふくらはぎが痛くなった。いわゆる使っていなかった部分の筋トレ後と全く同じ感覚の痛みである。走っていても足底・アキレス腱・ふくらはぎに非常に強い負荷がかかっているのが分かる。要はそこでクッションを効かせて、膝・腰を守っているのだろうか。気長にゆっくり試してみます。

Vibram FiveFingers


ビブラムファイブフィンガーズ
Vibram FiveFingers



こちらなどなど、Vibram FiveFingersに関する情報はググると結構出てきます。極めて好評ですが、この形状は趣味を選ぶかと。

Luna Sandals


ルナ サンダル
Luna Sandals



実際に上記のBorn to Runに出てくる、アフリカの伝説のスーパー長距離ランナー民族はサンダルで走るらしい。で、それをBarefoot Tedがアメリカで商品化したものがこのサンダル。これで走れるようになったらずいぶん楽しいだろうなと思ってしまった。これまたコアなお店で取り扱っているようだが、オンラインで簡単に取り寄せることもできる。自作キットだとか惹かれるものがある。実際にこのサンダルでフルマラソンを3時間程度で走っている日本人もいたりして、世の中広い。下記も有名なランナーですが、格好良いと思うのは私だけでしょうか。歩くのではなくこれでフルマラソンやらトレイルランニングやらガンガン走っています。

手作りワラーチ
で、究極はキットを用いない完全自作。それを木村東吉さんが公開されている。東急ハンズで全て揃うと記載されていたが、オンラインで全て揃うことも確認してしまった。もしゴム系の接着剤があるのであれば、紐も最初は適当なものを使えば良いし多分大切なのはソールだけ。1,260円x2の3,000円弱で自作できてしまう。


同様の作り方で最もシンプルなものはInvisible Shoesのこの動画が分かりやすい。
結局の所、Vibramのソールに穴を空けて紐を通すだけ。これがInvisible Shoes。ルナサンダルとか手作りワラーチはクッション剤を上に張り合わせているだけ。いや、行き着くところまで行ってしまいましたね。実際走るのにはこれらのサンダルで構わなかったりするのかも知れません。

成長期の子どもたち

で、これは自分のことよりも子供の足の方が大事なのではないかと思い、靴をチェックしてみた。幸いなことに3歳の子の靴は800円で靴底もペラペラだった。7歳の子の靴も面白いことにクッション性が強い”駿足”より靴底がペラペラで柔らかい方を本人が選んで履いていた。10歳の子の靴は良かれと思って買っていたレディースの本格派ランニングシューズであった、、、。幸いNike Free Run 2+のレディースで定価12,000円のものが4,000円代と格安だったので子供の靴としては高いが購入した。本人はいたって気に入っている。成長期の子どもたちにはなるべく裸足に近い状態で過ごさせようと思った次第。
WMNS NIKE FREE RUN+ 2 SHIELD gry/yel 【ウィメンズ ナイキ フリー ラン 2 シールド ランニング】
ウィメンズ ナイキ フリー ラン 2 シールド ランニング
WMNS NIKE FREE RUN+ 2 SHIELD gry/yel

更に調べたい人へ

ミニマルシューズ
VIVOBAREFOOT
VIBRAM fivefingers
Altra
NEW BALACE
MERRELL
NIKE
BROOKS
Inov-8
Soft Star Shoes
Leming Footwear
Somnio
Skora
Feelmax
Nimbletoes
ZEMGEATR

サンダル
Luna Sandals
Invisible Shoes
Bedrock Sandals
Unshoes Minimal Footwear
Branca Barefoot

Enjoy injury-free running!

日本人の知らない環境問題

特に環境問題に興味があったわけでもなかった。本の題名を見れば固い内容が推測される。

ただ好感の持てるブロガーの友人の著書ということで何気なくポチっといったところ、これが大当たりであった。日本全体を覆うの閉塞感は何とかならないのか、勉強に明け暮れる小学生を見ながら次世代に必要な教育を本当に施しているのだろうかと考えるとき、、、そんな全く関係なさそうなテーマに本書はどんどん絡んでいった。

本丸の環境問題についてはここ名古屋でCOP10なるものが開かれ、当時その意義についてググってみたものの今一つ合点が行かなかったが、この本を読んで非常に良く分かった。

出だしは面白いものの、半分ぐらいまでは環境問題についての歴史と概要が淡々と書かれている。力を抜いて取り敢えず読み進めると、本の真ん中辺りからドンドン面白くなっていく。国連が政治の場としてまたそこで働く著者の実体験として生々しく描写され、最後には魅力的な日本人の紹介と素晴らしいあとがきが待っている。

環境庁勤務後、国連関連機関で働き現職。しかし大賀さんはその固い肩書とは対照的なおおらかな文章の中で、時間的、空間的に遠く大きな視点で物事を捉えているのが分かる。かと言って理想を机上で語るのではなく現実主義者として現場に赴き働き続けている。私は書物を通じて著者の人柄に惹かれたのかも知れない。

★★★★★

p.116 「国連とはコミュニケーションとネゴシエーションとロビーイングの塊だ」先般、とある大学で話をしたとき、一人の女子学生が私の仕事の中身をまとめてこう言ったが、かなり的を射た言い方だと思う。厳正粛々と執り行われる重々しいフォーマルと、ルールも形式もないインフォーマルが巧みに組み合わされて使い分けられる空間を、それぞれの思惑を抱えた世界中の国の代表者が入り乱れる。このなかで事務局は言われたことを淡々と執行するだけのウラカタに徹しながら、交渉の実質的な誘導にも走る。

p.117 美辞麗句の会議ばかり開いていて、国際社会の支援を本当に必要としている人達は置き去りにされているのでは、とよく言われる。しかし、武力を伴わずに国際合意を取り付けるには、会議はいまの国際社会が使えるたった一つの方法だ。そして、いいか悪いかを別として、会議を開くのが国連の仕事なのだ。

p.135 ー 日本人ひとりでケニア北部へ
「マダム、ほんとに行ってきたの?ひょぇーっ、タフだね!」(ケニア人のツアー・ドライバー)
「本当に行ったんですか、一人で?懲罰ものですね」(日本大使館の人)
私がナイロビからトゥルカナ湖畔を経て、八日間かけてケニアの北部地域を一回りしてきたことを伝えたとき、言われた言葉だ。

p.152 ー ケニアのマザー・テレサ
ここで、政府や国連の枠組みを離れ、開発のためにユニークな取り組みをしている個性豊かな二人の日本人を紹介したい。
菊本照子さんは、ナイロビ郊外の孤児院「希望の家(マトマイニ・チルドレンズ・ホーム)」の院長だ。

p.159 菊本さんは、ケニアの子どもたちは目がキラキラかがやいていてかわいい、といった言い方はけっしてしない。そのかわりこういう。「自分の可能性を伸ばすチャンスをつかみたい、そのためには、こわかろうがなんだろうが外に出ていく。それは人間が本来持っているものであり、そのような人間の本質的なものが、ケニアの子どもたちの場合、目に見えるようにはっきりと表れているだけだ」と。

p.161 ー 100万人の父
佐藤芳之さんは、ケニア有数の食品加工会社「ケニア・ナッツ」をつくった人だ。

p.163 ただし佐藤さんは、無理をしてがまんし怒りをこらえているわけではない。何があってもへこたれない、という根性物語とも異なる。肩肘を張らずに機が熟するのを待つ。チャンスが来たら確実にそれをつかむ。問題が次々と起こるからこそ、それを解決しながら進んでいくのがやりがいだ。

p.167 しかし、一般にケニア人は、差し出されたものは喜んで受け入れるだろうが、それは、ありがたい施しをおしいただいて受け取るという受動的なものではないと思う。むしろそれは、自分が生きるうえで役に立つものをつかみ取っていくという能動的な態度だ。まだ取れると思えば感謝するどころかもっと求めるだろうし、求めても与えられないとわかったら、なんとかして奪おうと考えるかもしれない。そのような事態に直面したら、はたして私たちは、小さな優しさだけで太刀打ちできるのだろうか。
この意味で、「ケニアが好きだから」という漠然とした愛着と、困っている人たちを助けたいというささやかな正義感だけでは、ケニアの大地に根を下ろして何十年も暮らすことはできないと思う。

p.169 ただ、ケニアとかかわって23年になる私はこう思う。そんな日本人のうちわずかでもいいから、心の隅に押し込めてきた好奇心に素直になって、もうちょっと元気を出してみるのも悪くないかもしれない、と考える人がでてくればいい、と。

zp8497586rq

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

マラソンは毎日走っても完走できない

マラソンは毎日走っても完走できない
―「ゆっくり」「速く」「長く」で目指す42.195キロ (角川SSC新書)

小出 義雄


こんな本を読む時が来るとは。出会いに感謝。良い本だった。肥満で走ることさえままならない状態からフルマラソンまでの道筋がコンパクトに面白く具体的にまとめられている。著者はQちゃんことオリンピックで金メダルをとった高橋尚子さんを育てた名物監督の小出さん。そういえばオリンピック直前に出版された本のあとがきが優勝したオリンピックのレース展開と酷似していて驚愕したのを良く覚えている。教えるのが上手な人は文章構成能力も高いのかなと思った次第。以下備忘録。

p.14 ひとつは、特に太っている人やランニングビギナーに向けた「体の準備」について。

p.18 ウォーキングメニュー

p.28 1週間に1日は「脚つくり」をする
出来れば1週間で3日は練習日がほしい
土曜日 20分ウォーミングアップ、全力1キロ、5分ジョギング、全力1キロ(、クールダウン)
日曜日 90分ジョギング
月曜日 20分ジョギング
水or木曜日 20分ジョギング

p.35 きつい練習をした翌日は、足を完全に休めるよりも軽めの練習をしたほうが疲労もほどよく取れて、脚つくりも進んでいくのです。

p.40 人間の体は、どんなに鍛えた筋肉も、1週間も使わなかったら2分の1まで衰えてしまう。心肺機能も刺激を与えなければ、2週間でなにもやっていないのと同じ状態になってしまう。トップアスリートだって、1ヶ月も運動をしなければ「ただの人」です。
 練習は続けなければ意味がありません。続けるためには頑張り過ぎないこと。その意識がないと長くは続きません。

p.48 姿勢の良いフォームを心がけるポイントは、頭のてっぺんが真上に引っ張られているイメージを持つこと。

p.49 おへそを前に出すように意識して走ってみると、脚が自然と前にでて、ふっと体が進みます。

p.78 目線は3メートル先へ

p.83 脈拍で練習量を調整する。「138ー(年齢÷2)=目標心拍数(ジョギングのペース)」
POLARハートレートモニターの説明書より
              20才   40才
最大心拍数(HRmax)       200     180
高強度(80-90%)       160-180   144-162  最大運動能力を高めます
中強度(70-80%)       140-160   126-144  有酸素運動能力を高めます

p.86 練習日誌をつける

p.99 インターバル走を使った練習で、もっとも短時間で効果的に負荷をかけられる方法が、坂道インターバル走です。
坂の下がスタート地点。まずは、上りを「全力」で走る。そして坂を上りきったらUターンして「ジョギング」で下りてくる。これで1せっと。坂を下りきってスタート地点に戻ったら、休むことなくまた「全力」で上っていく・・・。
この上り下りを、自分の走力に合わせて繰返します。正直言って、かなりきつい。100メートルの坂なら10本、200メートル以上の坂なら5〜10本程度。それくらいが、効果的に筋肉を鍛える本数の目安でしょう。

p.110 練習スケジュールを組む(具体的な長期スケジュールが記載されている)

★★★★★

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という実装があり、端数の日付取得もできるようです。

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