現在使っているRedmineは2.3だが、3にアップグレードしてみた。
結論はRedmine2対応のプラグインが3では対応でないことが多いので、アップグレードはもう少し待ったほうがいいかもしれない。

とりあえず、アップグレード手順だけまとめておく。
OSはUbuntu 14.04 LTSでウェブサーバーはapache2.4を使用。
アップグレード前にウェブサーバーを停止させておく。

次に、最新のredmine3をダウンロードする。
ちなみに、redmineは/optにインストールする。
古いredmineは/opt/redmine-2.3.1にインストールされているものとする。

Redmine2から3へ以下のファイルをコピーする。

使っているプラグインがある場合はRedmine3のpluginsディレクトリにコピーする。
ただし、3に対応していないプラグインはあきらめて移行しない。

セッショントークンを生成する。

DBマイグレーションを行う.

プラグインがある場合はプラグインのDBマイグレーションも行う。

キャッシュとセッションファイルをクリアしておく。

apacheを再起動する。

Redmineにブラウザでアクセスして、ちゃんと動作しているか確認する。




Atomのscriptにて、goのPATHが認識されなかったのですが、以下の方法で解決しました。

(エラー画面)

(対処法)
https://github.com/rgbkrk/atom-script/issues/181




Linuxで普通にext4などでパーティションを作成すると、後でディスク容量が不足した場合、サイズを大きくすることができない。
LVMは複数ディスクを束ねることによってディスクサイズの拡張、縮小を行うことができる技術である。

以下の手順は/varのファイルが圧迫してディスクがフルになりそうになったとき、/var以下を新たに追加したディスクに移す手順である。
(作業はシングルユーザーモードで行ったほうがいいでしょう。)

まず、物理ディスクを追加するか、VirtualBoxなどのVMの場合は仮想ディスクの追加を行う。

物理ディスク追加後、Linux上では以下のようなパーティションになるものとする。

デバイス 説明
/dev/sda1 Linux ルートパーティション
/dev/sda2 Linuxスワップ スワップ
/dev/system/var Linux LVM /varパーティション

新規に追加したディスクは/dev/sdbとして認識されるのでLVMパーティション/dev/system/varとして設定する。

1 追加したディスクにディスクラベルを作成する。

2 LVMコマンドをインストールする。

3 PV(Physical Volume)を作成する。

4 VG(Volume Group)をVG名 systemで作成する。

5 system VG上にLV(Logical Volume)をLV名 varで追加したディスクの容量いっぱいのサイズで作成する。

6 LVにext4ファイルシステムを作成する。

7 作成したLVパーティションをext4でフォーマットする。

8 /varに作成したLVMパーティションをマウントして、/var以下のファイルをコピーする。

9 UUIDを取得して、fstabにマウント情報を設定する。

再起動して追加したディスクがマウントされるか確認する。




巷ではDockerが話題になっているが、Cent OS7で導入されたsystemd-nrespownにも軽量コンテナを作成する機能がある。
ということで試してみた。

軽量コンテナを作成する前に、GrubのAudit機能をオフにする必要がある。
まず、/etc/grub.confファイルを以下のように編集する。

GRUB=CMDLINE_LINUXにaudit=0を追加する。
ファイル編集後以下のコマンドでGrubを再構成し、再起動する。

次に軽量コンテナディストリビューションを/srv/mycontainerに作成する。

/srv/mycontainerの軽量コンテナを起動し、パスワードを設定する。

軽量コンテナをデーモンモードで起動してみる。

軽量コンテナをサービスとしてsystemdに登録する。

サービスとして起動。

systemctl statusコマンドでコンテナ情報を表示する。

machinectl listコマンドで登録コンテナリストを表示する。




golangのフレームワークであるgobotを使えるようにする方法です。
golang自体はインストール済みであるものとします。

下記でバージョンを確認する。




Linux Mint 15でデスクトップ上でウィンドウを上の端っこまで移動させると勝手にウィンドウが最大化されるのがうざい。
(Windows7と同じデフォルトの動きになってるけど、そんなところは見習わなくてよろしい。)
ということで、これをディスエーブルする方法は以下の通り。

メニュー > 設定 > ウィンドウズマネージャー(詳細)を選択。

menu

「ウィンドウが画面端に移動された時自動的にタイル表示する」チェックボックスをはずす。

dialog

やっとうざいから解放された。




/etc/apt/sources.list.d/pgdg.listを以下の内容で作成する。

リポジトリサインキーのインポートを行う。

リポジトリインデックスを更新する。

PostgreSQLをインストールする。




最近Pythonをやりはじめていろいろコードを動かしてみた。

PythonもRubyと同様スレッド機能を持っていて、1プロセスで並列処理ができるようになっている。
PythonスレッドはOSのネイティブスレッドを使用しているみたいだが、スレッドのいいところはOSが変わってもスクリプトがちゃんと動くことだ。

ただ、複数スレッドが同じリソースをつかみにいくときに競合がおこったりデータを壊したりすることがあるので排他制御ロックを使って防ぐ。
以下はスレッドを使った数をカウントするプログラム。

import _thread as thread, time

def counter(myId, count):
    for i in range(count):
        time.sleep(1)
        mutex.acquire()
        print('[%s] => %s' % (myId,i))
        mutex.release()

mutex = thread.allocate_lock()
for i in range(5):
    thread.start_new_thread(counter, (i,5))

time.sleep(6)
print('Main thread exiting.')

1行目のimport _threadで_threadパッケージを読み込む。
10行目のthread.allocate_lock()で排他制御用のロックを取得する。
11-12行目でスレッドを5つ生成してそれぞれのスレッドでcounter関数を実行する。
counter関数の中の4行目のforループで数字をカウントしているが、6行目のmutex.acquire()で排他制御ロックを取得して他のスレッドを待たせる。
7行目のカウント数を出力したのちにmutex.release()でロックを解放する。
ロックが解放されると、他の待たされているスレッドがロックを獲得し同じ処理を実行する。
実行結果は以下のようになる。

$ python thread-counter-mutex.py
[1] => 0
[3] => 0
[0] => 0
[2] => 0
[4] => 0
[1] => 1
[3] => 1
[2] => 1
[0] => 1
[4] => 1
[1] => 2
[0] => 2
[2] => 2
[3] => 2
[4] => 2
[3] => 3
[4] => 3
[2] => 3
[1] => 3
[0] => 3
[4] => 4
[3] => 4
[2] => 4
[0] => 4
[1] => 4
Main thread exiting.




Railsの開発ではgemを使わないと何もできないが、ふとgemってどう作るんだろうという疑問がいまさらわいてきた。
ということで自分でgemパッケージを作ってみた。
gemを作るためのnewgemという便利なものがあったのでそれを利用してみた。

1 newgemのインストール
まずはnewgemをインストールする。

$ gem install rubyforge
$ gem install newgem

2 ひな形の作成と編集
newgemコマンドを発行して作成するgem(mygemtest)のひな形ファイルを生成する。

$ newgem mygemtest -T rspec
      create  lib/mygemtest
      create  script
      create  History.txt
      create  Rakefile
      create  README.rdoc
      create  PostInstall.txt
      create  lib/mygemtest.rb
  dependency  install_rspec
      create    spec
      create    tasks
      create    spec/mygemtest_spec.rb
      create    spec/spec.opts
      create    spec/spec_helper.rb
      create    tasks/rspec.rake
  dependency  install_rubigen_scripts
      exists    script
      create    script/generate
      create    script/destroy
      create  script/console
      create  Manifest.txt
      readme  readme

“-T rspec”でテストフレームワークとしてRSpecを指定している。

Rakefileのself.developerの”FIXME”の部分を変更する。

$hoe = Hoe.spec 'mygemtest' do
  self.developer 'anthony', 'anthony@abc.com'   self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required

README.rdocの”FIX”の部分を変更する。

= mygemtest

* http://github.com/#{github_username}/#{project_name}

== DESCRIPTION:

FIX (describe your package)

== FEATURES/PROBLEMS:

* FIX (list of features or problems)

== SYNOPSIS:

  FIX (code sample of usage)

== REQUIREMENTS:

* FIX (list of requirements)

== INSTALL:

* FIX (sudo gem install, anything else)

== LICENSE:

(The MIT License)

3 ライブラリコードの追加
lib/mygemtestにライブラリコードとしてmyclass.rbを以下の内容で作成する。

module MyGemTest
  class MyClass
    def initialize
        puts "Initialized Done !!"
    end
   end
end

4 パッケージ作成
gemパッケージを作成する。
Manifest.txtに作成したmyclass.rbのパスを追加しておく。
これをしておかないとgemファイルに作成したライブラリコードが含まれない。
(これで1時間くらい悩んだ orz)

History.txt
Manifest.txt
PostInstall.txt
README.rdoc
Rakefile
lib/mygemtest.rb
lib/mygemtest/myclass.rb <- 追加
script/console
script/destroy
script/generate
spec/mygemtest_spec.rb
spec/spec.opts
spec/spec_helper.rb
tasks/rspec.rake

gemファイル生成を以下のファイルで行う。

 $ rake package 

pkgディレクトリにmygemtest-0.0.1.gemというファイルができているので、ちゃんと動作するかgemファイルをインストールしてみる。

 $ sudo gem install -l mygemtest-0.0.1.gem 
 PostInstall.txt 
 Successfully installed mygemtest-0.0.1 1 gem installed 
 Installing ri documentation for mygemtest-0.0.1... Building YARD (yri) index for mygemtest-0.0.1... 
 Installing RDoc documentation for mygemtest-0.0.1... 

irbで動作確認をする。

 $ irb 
irb(main):001:0> require "mygemtest/myclass"
irb(main):003:0> a = MyGemTest::MyClass.new
Initialized done !!
=> #

初期化メソッドが呼ばれていれば正しくインストールされている。

5 コマンドをgemに追加
gemパッケージにはライブラリコードだけでなくコマンドも追加できる。
以下のコマンドでコマンド用の雛形を生成する。

 $ ./script/generate executable mygemtest
    create  bin
      exists  lib/mygemtest
      create  bin/mygemtest
      create  lib/mygemtest/cli.rb
      exists  spec
      create  spec/mygemtest_cli_spec.rb

lib/mygemtest/cli.rbというファイルが生成されているので下のソースの39行目以降にコマンドのコードを書く。

require 'optparse'

module Mygemtest
  class CLI
    def self.execute(stdout, arguments=[])

      # NOTE: the option -p/--path= is given as an example, and should be replaced in your application.

      options = {
        :path     => '~'
      }
      mandatory_options = %w(  )

      parser = OptionParser.new do |opts|
        opts.banner = <<-BANNER.gsub(/^          /,'')
          This application is wonderful because...

          Usage: #{File.basename($0)} [options]

          Options are:
        BANNER
        opts.separator ""
        opts.on("-p", "--path PATH", String,
                "This is a sample message.",
                "For multiple lines, add more strings.",
                "Default: ~") { |arg| options[:path] = arg }
        opts.on("-h", "--help",
                "Show this help message.") { stdout.puts opts; exit }
        opts.parse!(arguments)

        if mandatory_options && mandatory_options.find { |option| options[option.to_sym].nil? }
          stdout.puts opts; exit
        end
      end

      path = options[:path]

      # do stuff ここにコードを追加
      stdout.puts "コマンド動いたよ!"
    end
  end
end

Manifest.txtにcli.rbのパスを追加。

History.txt
Manifest.txt
PostInstall.txt
README.rdoc
Rakefile
lib/mygemtest.rb
lib/mygemtest/cli.rb  <- 追加
lib/mygemtest/myclass.rb
script/console
script/destroy
script/generate
spec/mygemtest_spec.rb
spec/spec.opts
spec/spec_helper.rb
tasks/rspec.rake

再度、rake packageでgemパッケージを作りなおして再インストールすればコマンドが使えるようになる。
newgemの解説がいまいちちゃんとしたものがなかったので結構試行錯誤してしまったが、これだけおさえておけば普通に使う分には十分でしょう。
後、テストコードの書き方とか気が向いたら書くかも。

参考URL: gemパッケージの作り方




サーバーの構成管理ツールChefを試しに使ってみる。

Chefの設定ファイルを生成するための以下のコマンドで雛形をダウンロードする。

git clone git://github.com/opscode/chef-repo.git

chef-repoというディレクトリができるので、cdでディレクトリに移動して以下のコマンドを実行する。

$ rake new_cookbook COOKBOOK=test

testというディレクトリが生成されて、その中にChef設定ファイルのひな形が生成される。

test/templates/defaultにcdしてtest.conf.erbというファイルを作成して、内容は適当な文字列(例えばhogehoge)を入力しておく。

次にtest/recipes/default.rbにどんな設定ファイルを生成するかを以下のように記述する。

template "/tmp/test.conf" do
  owner "root"
  group "root"
  mode "0644"
end

これは/tmp/test.confというファイルをオーナーroot、グループroot、モードrw-r–r–で作成するという意味。

そして、chef-soloコマンドで設定通り実行されるか確認する。
chef-soloコマンドを動かすために~/.chef/solo.rbファイルを以下の内容で作成。

file_cache_path "/tmp/chef-solo"
cookbook_path "~/chef-repo/cookbooks"
role_path "~/chef-repo/roles"
log_level :debug

次に実行内容を記述した~/.chef/chef.jsonを作成。

"run_list": [
       "recipe[test]"
]

この例はCookbook “test”のレシピを実行するよう指定している。

chef-soloでsolo.rbとchef.jsonを指定して実行してみる。

$ sudo chef-solo -c ~/.chef/solo.rb -j ~/.chef/chef.json

/tmpにtest.confが作成されて、内容がtest.conf.erbに記述した内容になっていれば正常に動作している。

参考記事: Chefでサーバ管理を楽チンにしよう