はじめに

IT系で仕事をしていて若い時にずっと読んでいた「Software Design」に寄稿する機会を得ました。 お世話になっているIBMの 北瀬さん(@kkitase)に監修していただきながらのお仕事でした。 それにしても非常に嬉しいです。 なにせインターネットが始まった頃の1995年頃からお世話になって読んでいた雑誌です。そんな雑誌に自分の書いた文章が載るとは思わなかった。編集長の 池本さん(@XR230) にお会いできたのも感激。

What’s SoftLayer ?

今回のテーマは、「SoftLayerを使ってみませんか?」という内容で全3回の連載となっています。

「ベアメタルクラウド」勢という括りでいいかは分からないけど物理(ベアメタル)サーバをクラウドで利用できるIBMのパブリッククラウドの使いこなしが話しのテーマです。昨年IBMは自社の持っていた SmaterCloud をやめて米SoftlayerTechnology.Incを買収しました。私自身はそのタイミングから少しつづ触ってきて今年になって本格的に使っているという感じです。

マニアックなクラウド環境

実際なんというかアバウトです。

当たり前なんですがベアメタルをオーダーした場合、仮に部品がない場合には仕様を満たす別のハードウェアが搭載されます。まあ変な話32GのSSDを注文したら1TのSSDが来たりします。HDDなんかは別にいいけどCPUとかだとライセンスの問題とかあって結構面倒な話にもなったりしていました。

このベアメタルサーバは、SoftLayerの代表的なサービスです。もちろん一般的なクラウド同様の仮想サーバも用意されています。ベアメタルはかなり自由に使うことが出来ます。その分、色々自分で面倒を見る必要があるのはオンプレで構築した時と同じですがESXiを導入できたり自社のデータセンターの代わりとして十分に使う事が出来る能力が有るのかなと思っています。

SoftLayerを何に使うかと考えた場合、もうここまで来るとすることは一つ(?)です。SoftLayerのクラウド基盤を使ってクラウドを作るのです。それはVMwareでも良いしOpenStackや最近はやりのDockerでも良いかもしれない。SoftLayerは純粋なIaaSをわずか4,5時間で用意してくれ今まで面倒だったストレージの障害対応や電源の問題とか場所の問題とかそういったことを全て解決してくれています。素にちかい環境で物理と仮想が手に入るので色々と何をしてみようかと夢が広がります。

残念なことにサイト全体を見渡しても通読できるマニュアルは見当たりません。情報が断片的に落ちているだけです。この状況で色々触っていくうちに少しづつ理解しつつあるかなというのが現状です。もうこの段階でかなりマニアックな領域になってきていますが。

SoftLayer + IBM への期待

インフラエンジニアの立場からSoftLayerが非常に興味深いものではありますがアプリケーション開発の観点からはミドルウェア的に利用できる各種のサービスが整っているほうが開発の効率をあげることにつながります。仮にスケーラブルなMySqlをSoftLayer上で構築するとしたらインフラ的には普通に重労働です。これでは意味が無いです。そういった意味でIBM BluMixの環境(こちらではスケーラブルなDBなどがすでにラインナップされている)とSoftLayerのインフラストラクチャーが上手く融合するとインフラ面でも開発面でも良い成果が出てきそうです。今後、クラウドのサービス展開としてPaaS,SaaS側への拡張が楽しみです。

あ、年内にTokyo DataCenter が出来る予定ですね。海外のJobサイトみるとSoftLayer,IBMでDataCenter Manager/Specialistの募集してますね〜

まとめ

どこまでSoftLayerの魅力を伝えるには力及ばずなのですが3回ほど連載の予定ですのでソフトウェアデザインを購入されてる際には一読してもらえると嬉しいです。

素早くDocker環境を用意する

普段から検証で利用したりしているクラウドのサービスに DigitalOcean というサービスがあります。 格安のSSD VPSとして有名ですが確かに安い、そして「早い」です。代替最小の構成で1〜2分でプロビジョニングされます。

みてもらうとわかりますが、最小モデル(512M Memory, 1Core , 2OG SSD)で $0.007/hr($5/month) です。HighPerformanceの最小構成(16GB Memory,8Core,160GB SSD)で $0.238/hr($160/mo) となっています。さっと検証をしたい程度1日程度であれば非常に安く利用することが出来ます。

はじめに

現在(2014/08/09)、$10分のクーポンがあるので更に利用が便利になります。すでにアカウントがある人はポータル画面の左メニューBillingから右上のManage Paymentを選択ししたのPromo Codeに入力をします。

  • CODE:SHIPITFAST10

もしアカウントがまだの場合には、こちらのリンクからはじめてもらえると私が嬉しいです。

使い方

ポータルから作るのは非常に簡単ですが実際にDocker利用したいと思うとコマンドラインからすると思われるのでここではVagrantを利用してサーバのデプロイをしたいと思います。

すでにVagrantの環境は入っているものとします。(まだの方は色々ぐぐってみてください) 以前に入れたままの人はバージョンアップがされているので実行しておきましょう。

古いバージョンではUsername,APIキーと言う形式でしたが現在はToken形式で利用することになります。ポータルからトークンは発行することが出来ます。

$ vagrant plugin install vagrant-digitalocean

実際のVagrantfileのサンプルを以下に載せておきます。

Vagrantfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -*- mode: ruby -*-
# vi: set ft=ruby :
# vagrant up --provider=digital_ocean --provision

Vagrant.configure('2') do |config|
  config.vm.hostname              = 'docker01'

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = '~/.ssh/admin'
    override.vm.box               = 'digital_ocean'
    override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
    provider.token                = 'TOKEN'
    provider.image                = 'Docker 1.1.2 on Ubuntu 14.04'
    provider.region               = 'LON1'
    provider.size                 = '512MB'
    provider.ca_path              = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt'
    provider.ssh_key_name         = 'admin'
  end

end

1分で起動が売りなのですが上記の設定で「46秒!」で起動してきます(ポータル上に表示されている時間) 起動は普段通り、$ vagrant up --provider=digital_ocean --provision で行うことが出来ます。

接続して確認してみます。

$ vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-24-generic x86_64)

* Documentation:  https://help.ubuntu.com/

System information as of Sat Aug  9 16:55:12 EDT 2014

System load:  0.2               Processes:              76
Usage of /:   8.0% of 19.56GB   Users logged in:        0
Memory usage: 13%               IP address for eth0:    178.62.17.227
Swap usage:   0%                IP address for docker0: 172.17.42.1

Graph this data and manage this system at:
  https://landscape.canonical.com/

Last login: Tue Aug  5 15:18:31 2014 from 162.243.14.86
root@docker01:~# docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070

Dockerが動いている状態になっていますね!

まとめ

というわけでわずか1分で環境が用意することが出来ました。 実際に利用してみると便利さがわかります。開発環境で使う分には十分ですね。というかローカルの環境でVirtualBoxで起動する時間以下でネット上にサーバが構築されるとか結構感動です。

プライベートレポジトリを併用して使えば必要なときに使うという使い方が出来て非常に便利です。Vagrant経由で実行することでAnsibleなどを併用すればその辺りもある程度自動化出来ますね。

これは何?

github上で見つけた ObjectStorageにバックアップをするためのスクリプト。 メジャーなIaaS環境では結構ObjectStorageがサポートされているし、値段的にも非常に安いのでObjectStorageにデータバックアップを取る手法を持っていたほうがいいですね。

  • Whole file delta backups - only changed/new files are uploaded saving you time/bandwidth.
  • Retention policies - deleted/updated files are kept for any desired length of time. These can also be disabled.
  • Threaded - Copying can always be the longest part, so backups are done in the background as file comparisions are being performed.
  • MD5 support - Swift automatically sets a default hash (md5) for every object. We support file comparisions using this hash instead of time/size variance.
  • Open source - MIT licensed (as is the object storage library).

使い方

gitからソースを取得する

1
2
3
$ git cline https://github.com/softlayer/softlayer-object-storage-backup.git
$ sudo pip install softlayer-object-storage
$ sudo pip install slbackup

設定の実施

1
$ ./slbackup.py --example > ~/.slbackup

設定ファイルの中に、username, apikey を設定します。またObjectStorageのどのデータセンターを利用するかも指定することが出来ます。

カレントディレクトリ以下をtestというコンテナに格納するのは以下のコマンドで実施できます。

1
$ ./slbackup.py -s ./ -o test

まとめ

機能的に変更分のみ、マルチスレッド対応なのでPerformanceも期待できるのだろうか。実際の運用を想定すると、(a) Restore (b) 履歴(世代)管理 (c) 圧縮 などの機能があると嬉しいですね。日本語のファイルなどはそのまま ObjectStorageに入れると文字コードなど問題ですこし不安です。とは言えこのスクリプトは簡単にバックアップを実現するという意味で現在全く利用していないユーザなどには良いと思います。

何が出来るの?

Ansible 1.7 より 外部インベントリ(Dynamic Inventory)に SoftLayerのプラグインがCommitされていました。外部インベントリとして利用できるため Ansible の hosts を記載しなくても動的に SoftLayerの管理ポータル上からサーバのリスト等が取得できるはずです。どのような感じで利用できるのか試してみます。

準備

古いバージョンの場合には Ansible 1.7 にアップデートします。今回はUbuntu上の環境でpipで過去のバージョンを導入している場合です。

1
$ sudo pip install ansible --upgrade

不勉強なので分かっていないですが pip で入れると pluginが入らないので(何かどこかに入るのかもしれませんが)自分でダウンロードしておきます。

1
2
3
4
$ git clone https://github.com/ansible/ansible.git
$ cd ansible/plugins/inventory
$ ls -l softlayer.py
-rwxrwxr-x 1 vagrant vagrant 6112 Aug  8 03:03 softlayer.py

また、SoftLayer CLIが利用可能になっている必要があるので導入をしておきます。

1
2
$ sudo pip install softlayer
$ sl config setup

SoftLayerの管理ポータルから、USER名、APIキーを控えておきセットアップします。slコマンドが利用できるようになっている必要があります。

プラグインの実行

プラグインを単体で実行してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ ./softlayer.py --list
{
  "_meta": {
    "hostvars": {
      "119.81.131.10": {
        "datacenter": {
          "id": 352494,
          "longName": "Hong Kong 2",
          "name": "hkg02"
        },
        "domain": "niandc.co.jp",
        "fullyQualifiedDomainName": "kensyu05.niandc.co.jp",
        "globalIdentifier": "461a86f4-3e4f-4b78-90df-9207d2337ee4",
        "hostname": "kensyu05",
        "id": 5509848,
        "maxCpu": 1,
        "maxMemory": 1024,
        "powerState": {
          "keyName": "RUNNING",
          "name": "Running"
        },
        "primaryBackendIpAddress": "10.x.x.x",
        "primaryIpAddress": "119.81.x.x",
        "status": {
          "keyName": "ACTIVE",
          "name": "Active"
        }
      },

という形でホストの情報が出てくるとともに以下のグルーピングでもJSONが返ってきています。

  • cpu_“数”
  • datacenter_“DC名”
  • “HOSTNAME”
  • “HOSTNAME”.”DOMAINNAME”>
  • hardware
  • virtual
  • memory_“サイズ”
  • “DOMAINNAME”

などです。これらはいずれも

1
2
3
4
5
6
 "datacenter_sng01": [
    "119.81.xx.x",
    "119.81.xx.x",
    "119.81.xx.x",
    "119.81.xx.x"
  ],

のような形でIPアドレスが応答されます。

使ってみる

先ほどのJSON形式が渡されるためどうもIPアドレスで sshの設定が必要になりそうです。したがって ~/.ssh/confg内にてIPアドレスでログイン出来るように設定しておきます。パスワードありで接続する場合、-kまたは--ask-pass --ask-sudo-passなどを引数につけます。

1
2
3
4
5
6
ansible -i `pwd`/softlayer.py docker02 -u root -m ping -k
SSH password:
119.81.x.x | success >> {
    "changed": false,
    "ping": "pong"
}

このようにPingが実行できました。同様に alldatacenter_hkg02 等の括りで制御する事が出来ます。

Tips

常にこの softlayer.py を指定するには

  • softlayer.py を /etc/ansible/hostsに上書き
  • 環境変数ANSIBLE_HOSTSに softlayer.py を指定

の2通りの方法があります。

まとめ

台数が多くなると便利な Ansible の External Inventory ですが、SoftLayerのプラグインが出ていることでより簡単に利用することが出来るように成りました。 データセンター単位やドメイン単位で変更が発生する際などは特に便利そうですね。

iTermを利用していて「Treat ambiguous-width characters as double width」をONにしているとTmux+Powerlineのステータスがズレてしまう問題がありました。 チェックをOFFにしていると問題がないのですが日本語を多様していることもありググってみました。

  • http://ta.ps.st/d/1350718711.html

こちらは少し古いのですがこれで解消が出来ました。

Tmux1.9に対してのpatch形式にしたのをgistにあげておきます。

さて、tmuxはhomebrewで導入しているのでこちらから修正して導入できるようにしておきます。brewコマンドはsourceからのコンパイルする際にpatchなどの適応ができるので追記してみます。

1
$ brew edit tmux

これで以下のように修正します。

1
2
3
4
5
6
7
8
9
10
11
23   depends_on 'pkg-config' => :build
24   depends_on 'libevent'
25
26   def patches
27     [
28         "https://gist.githubusercontent.com/tokida/997cf6b608d93ccbefef/raw/63219743ec84b255a975f230593895dbdad9f364/tmux_utf8.patch"
29     ]
30   end
31
32   def install
33     system "sh", "autogen.sh" if build.head?

先ほどのパッチを指定しておきます。

1
brew install --build-from-source tmux

上記のコマンドオプションを実行することによりsourceからリビルドされます。 最近これでズレまくって嫌になっていたのですがまたtmuxに戻って見たいと思います。

Goal

個人用のメーリングリストを構築する

Install

はじめに

個人で安く抑えたい場合には digital Ocean (https://www.digitalocean.com/pricing/) が快適で結構オススメです。$5/moで1core,521MB,20GB(SSD Disk),1T Transferなのでメーリングリスト等の簡易な用途であれば十分にこなしてくれそうです。今回はこれ意外にもOwnCloudなどを入れたかったのでSoftLayer (http://www.softlayer.com) のCloud Compute Instanceで利用してみました。一番安いノードで$25/moで 1core,1GB,25Gですね、すこし高いです。

ドメイン名

メーリングリストを始めるためにあたり今回は独自ドメインが欲しかったので色々あるので安いところから購入するのが良いかと思います。注意が必要なのはドメインを取得すると利用者の住所などの情報がwhoisで公開されるのですがこれをレジストラの業者が代行して表示してくれるサービスがあります。この対象となるドメインが業者により異なるので気をつけましょう。

DNSへの登録

SoftLayerのDNSサービスがありますのでこちらを利用していきます。ドメイン業者側のコントロールパネルなどの設定でNSを以下の2つに変更します。

  • ns1.softlayer.com
  • ns2.softlayer.com

すこし待てばSoftlayer側のDNS登録画面で登録した情報が利用されます。 次に、Softlayer側で構築するサーバを登録します。ネットワーク設定の画面でドメイン名(mailabcd.net)と対象となるサーバのIPアドレス(119.81.xxx.xx1)を入れると自動で幾つかの値がセットされます。不要な項目を消して消して置けば良いと思います。TTLは短くしておけば最初に伝搬されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ORIGIN mailabcd.net.
$TTL 900
@ IN SOA ns1.softlayer.com. support.softlayer.com. (
                       2014070307        ; Serial
                       7200              ; Refresh
                       600               ; Retry
                       1728000           ; Expire
                       43200)            ; Minimum

@                      900      IN NS    ns1.softlayer.com.
@                      900      IN NS    ns2.softlayer.com.

@                      900      IN MX 10 study.mailabcd.net.

@                      900      IN A     119.81.xxx.xx1
mail                   86400    IN A     119.81.xxx.xx1
study                  86400    IN A     119.81.xxx.xx1

こんな感じにしておきます。感覚的に結構はやく名前の情報は反映される印象。 これで準備は出来たので導入をしていきたいと思います。

Install

一度にmailman入れるとすこし変だったので一つづつ入れていきます。

Postfix

1
$ apt-get install postfix

導入時にConfigureで幾つか聞かれるので回答してします。 また設定は /etc/postfix/main.cf になります。

  1. General type : Internet Site
  2. Site Name : mailabcd.net
  3. 設定ファイルは以下の様になります。ただし alias_maps で指定している /var/lib/mailman/data/aliases はmailman導入後に出来るため現時点ではエラーになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = study.mailabcd.net
alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mailabcd.net, study.mailabcd.net, localhost.mailabcd.net, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
owner_request_special = no
unknown_local_recipient_reject_code = 550

fcgiwrap

cgiを動かす必要がありますが今回はnginx経由で使うために fcgiwrap を利用します。

1
$ apt-get install fcgiwrap

サービスとして動作します

1
2
3
$ service fcgiwrap start
$ ps -ef | grep fcgiwrap
www-data 10577     1  0 Jul03 ?        00:00:00 /usr/sbin/fcgiwrap -f

Mailman

本命のmailmanを導入します。日本語がオカシイという情報がネットで見られましたが特に問題はなさそうに見えます。

1
2
$ apt-get install mailman
$ dpkg-reconfigure mailman

なぜか日本語が導入されませんので導入したら再構成します。その際に[ja]を選択します。

導入後の手順で check_perms をしている事がありますが今回は利用しません。特に問題なく使えるようです。

管理用パスワードの変更

1
2
3
4
$ mmsitepass
New site password:
Again to confirm password:
Password changed.

設定は /etc/mailman/mm_cfg.py で行います。 変更を行ったところだけピックアップして書いておきます。

1
2
3
4
5
6
MAILMAN_SITE_LIST = 'mailman'
DEFAULT_EMAIL_HOST = 'mailabcd.net'
EFAULT_URL_HOST   = 'mailabcd.net'
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
DEFAULT_SERVER_LANGUAGE = 'ja'
MTA='Postfix'

実際にはMTAの箇所をコメントアウトしただけかな。

1
2
3
4
$ newlist mailman
Enter the email of the person running the list: hogehoge@gmail.com
Initial mailman password:
Hit enter to notify mailman owner...

これを実行するとaliasesも変更される

1
2
3
# ls -l /var/lib/mailman/data/aliases*
-rw-rw---- 1 root list  1132 Jul  3 20:44 /var/lib/mailman/data/aliases
-rw-r----- 1 root list 12288 Jul  3 20:44 /var/lib/mailman/data/aliases.db

Postfixとmailmanを起動します。

1
2
$ service postfix start
$ service mailman start

エラーなどがある場合には、 /var/log/配下を確認します。

Nginx

最後にフロントエンドになるnginxを導入します

1
$ apt-get install nginx

設定ファイルを修正します。/etc/nginx/fastcgi_paramsに以下の行をコメントアウト

1
#fastcgi_param SCRIPT_FILENAME $request_filename;

一応WebサイトになってしまうのでRootのファイルを/var/www/mailabc.org/webにおけるようにディレクトリを作っておきます。

次に/etc/nginx/site-available/mailabcd.net.vhostにファイルを作る。また有効にするために /etc/nginx/sites-enabled/mailabcd.netにシンボリックリンクを作っておきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server {
       listen 80;
       server_name mailabcd.net;
       root /var/www/mailabcd.net/web;
       if ($http_host != "mailabcd.net") {
                 rewrite ^ http://mailabcd.net$request_uri permanent;
       }
       index index.php index.html;
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
       location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
       }
       # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
       location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
       }
       location /cgi-bin/mailman {
               root /usr/lib/;
               fastcgi_split_path_info (^/cgi-bin/mailman/[^/]*)(.*)$;
               include /etc/nginx/fastcgi_params;
               fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               fastcgi_param PATH_INFO $fastcgi_path_info;
               fastcgi_pass unix:/var/run/fcgiwrap.socket;
        }
        location /images/mailman {
               alias /usr/share/images/mailman;
        }
        location /pipermail {
               alias /var/lib/mailman/archives/public;
               autoindex on;
        }
}

以下でい起動します

1
$ service nginx start 

使ってみる

サイトへは http://mailabcd.net/cgi-bin/mailman/admin でアクセス可能です。 その後は画面をみて利用する事ができるかと思います。

ハマった点

  • Gmailはメーリングリストへ投稿され記事(正確にはMessage-idが同じ記事)をリジェクト刷るようですね。したがってGmailから送信するとメーリングリストに投稿された後の記事が届かない感じになって動いてない〜って成りました。 強制的にSource変更して書き換えている人もいました my poc kt: Gmail でメーリングリストのメールが弾かれる件を自己環境だけでもとりあえず対処してみた
  • MX レコードが自動で mail.mailabcd.net に記載されていたけどホスト名を study.mailabcd.net にしていたのでスパム扱いされてメールがgoogleからRejectされて悩んだ。
  • メーリングリストのドメインを @study.mailabcd.net から @mailabcd.net に後でで変えたら動作が?な箇所もあり結局再導入した(SoftLayerの場合にはOSReloadすれば5分もいらずに初期化される)

まとめ

久しぶりにメーリングリストとか入れるとハマりました。Facebookとか色々共有するツールはあるのですがメールはほぼどの端末でも環境でも使えるのが良いですね。

Amazon Web Service の Daas である「Workspaces」を利用していて日本語の切替にハマったので設定方法を書いておきます。

Goal

日本語の切替が出来る

How to

英語版Windows2008R2でできてるWorkspacesですが日本語の切替が上手くないです。 日本語キーボードをどうしても理解しないためのような気もしますがこの段階では不便すぎるので以下のように設定をします。

ポイントとしては、「日本語」環境と「英語」環境を切り替えるということです。 これで「詳細なキー設定」で定義されている「入力言語のホットキー」で切り替えることが出来ます。 そして、今回の場合は「Google日本語入力」に関しては「あ」(日本語)の状態にしておくと切り替えた時に「あ」になっています。

右下のタスクバーとしての動作は JP <-> EN の切り替えになります。

まとめ

Workspacesが発表されたのは去年のRe:Invent2013でしたね。もうRe:Invent2014の申し込みが始まったことを考えると早いものです。 Workspacesの日本語がらみの問題は「東京リージョン」が出てくる段階で解決しておいて欲しいですね。そもそも東京リージョンは日本語版を入れておいて欲しいところです。とは言え、今の段階でも速度的な事が要件を満たせるのであれば十分に使える感じです。 後は、日本語キーボードが認識しないのはどうにかして欲しいところです。

追記(2014/06/19)

日本語JPにてIMEを、Google日本語変換を選択していました。日本語の変換は「設定」で制御できるようです。今回はMacbookから利用しているのですが「英数」「かな」キーを押しても何も反応をしないことからWorkspcaceクライアントの制御の問題かなと思い始めました。とりあえず現時点では日本語入力はすこし面倒な感じですね。

Goal

先日Dockerのサイトを見ているとgithubにリンクが張ってありたどっていってmkdocsというMarkdown形式の文章を整形するツールが有ることを知りました。結構良さそうな感じなので使ってみました。

Howto

早速入れてみます。環境は MacOS 10.9 となります。

1
$ sudo pip install mkdocs

導入はこれで終わりです。 使い方も簡単で、文章(Markdown)を整形するフォルダを用意します。そのフォルダの中で処理を進めていきます。最終的には mkdocs buildコマンドで 静的なサイトを作ることが出来ます。

ディレクトリ構成として

1
2
3
4
5
mkdocs.yml
docs/
	index.md
	about.md
	abcd01.md

という構成です。mkdocs.ymlに構成を書いていきます。

構成ファイル mkdocs.yml

単純な形のサンプル。

1
2
3
4
5
site_name: MkLorum
pages:
- [index.md, Home]
- [about.md, About]
theme: readthedocs

もう少し設定する場合には、Configuration - MkDocs を参考にします。

プレビュー機能

プレビュー機能としてmkdocsでローカルにHTTPで起動する事が出来ます。実行後、http://local.host:8000 で接続してみるとかっこいい画面で表示されているのがわかります。

1
$ mkdocs serve

images

のような形で出力されます。

ビルド作業

問題なければ最後に静的ファイルを作成します

1
$ mkdocs build

これでローカルの ./site 以下にファイル群が作られます。

使いこなし

これらのソースをgitで管理するには echo ¥'site/¥' >> .gitignor で site/ を除いた形で作ると良いです。 出来上がったファイル群は静的なHTMLファイルなので github page とか amazon s3なんかにUpしておければ使い勝手の良いサイトができる事に成ります。

まとめ

すごく簡単に綺麗にマニュアルサイトとかが作ることが出来ます。すでにmarkdownの文章があれば見せ方としてWebサイトのように構築することが出来るので機会があれば積極的に使っていきたい。それにしても便利んだな。

Goal

仮想ホスト環境で運用していると、ローカルのIPアドレス:ポート番号(今回のケースでは http://localhost:10000 )がURLに入ってしまっていることがあります。多分理由は場所場所で絶対パスで入ってしまうせいだと思います。 仮想ホストでNginxなどでリバースプロキシしていると別の名前でアクセスすることになり問題になってしまいます。

今回導入した、アバター画像をローカルで利用できる(標準だと gavatar に取りに行ってしまう)プラグインでも同様の問題で画像が表示されない問題がありました。

修正

プラグインの中で plugin/redmine_local_avatars/lib/application_helper_avatar_patch.rb の中を修正します。

1
image_url = url_for :only_path => true, :controller => 'account', :action => 'get_avatar', :id => user

上記の url_foronly_path => falseonly_path =>trueへ変更させます。 これで相対パスになるので画像が表示されます。

まとめ

仮想ホストで使うのってそれほど変わっているわけではないと思うのでこの問題はローカルな問題なんですかね? もともとonly_pathがfalseで指定されている所見ると理由があるのかもしれません。 とりあえずおっさんの画像が表示されるようになったのでので気分が落ち着いたわ。

Goal

Redmine のプラグインの削除

Howto

先日からどうしてもDocker-Redmineの環境でうまく動かないPluginがあり何度もいじっていてキチンとプラグインを消すやり方を知らかなかったのでメモして置きます

1
$ rake redmine:plugins:migrate  NAME=hogehoge VERSION=0 RAILS_ENV=production

その後、実態であるフィアルを rm -rf <REDMINE>/plugin/hogehoge すれば良いです。