ラベル linux の投稿を表示しています。 すべての投稿を表示
ラベル linux の投稿を表示しています。 すべての投稿を表示

2016/02/03

FactoryGirlを使用したDeviseのテストでLinuxとMacでのテスト結果が異なった話

tail -f pinzo.log: Deviseの有効期限設定をテストする で書いた有効期限検証のコードで不思議な事が起こった。Macでは正常にパスするのだが、Amazon Linux上ではパスしない。

ミニマムなコードで示すとこんな感じ

で、こんなデバッグコードを仕込んで実行してみた

Macで実行するとこんな感じ

[test-code][sent_at] to_s: 2016-02-01 23:51:31 +0900, to_i: 1454338291, usec: 197593, subsec: 197593/1000000
[test-code][added]   to_s: 2016-02-11 23:51:31 +0900, to_i: 1456930291, usec: 197593, subsec: 197593/1000000
[devise][now]     to_s: 2016-02-11 23:51:31 +0900, to_i: 1456930291, usec: 197593, subsec: 197593/1000000
[devise][sent_at] to_s: 2016-02-01 23:51:31 +0900, to_i: 1454338291, usec: 197593, subsec: 197593/1000000
[devise][added]   to_s: 2016-02-11 23:51:31 +0900, to_i: 1456930291, usec: 197593, subsec: 197593/1000000
[devise] now > added: false
[devise] now.subsec > added.subsec: false

Amazon Linuxで実行するとこんな感じ

[test-code][sent_at] to_s: 2016-02-01 23:53:20 +0900, to_i: 1454338400, usec: 369658, subsec: 369658841/1000000000
[test-code][added]   to_s: 2016-02-11 23:53:20 +0900, to_i: 1456930400, usec: 369658, subsec: 369658841/1000000000
[devise][now]     to_s: 2016-02-11 23:53:20 +0900, to_i: 1456930400, usec: 369658, subsec: 369658841/1000000000
[devise][sent_at] to_s: 2016-02-01 23:53:20 +0900, to_i: 1454338400, usec: 369658, subsec: 184829/500000
[devise][added]   to_s: 2016-02-11 23:53:20 +0900, to_i: 1456930400, usec: 369658, subsec: 184829/500000
[devise] now > added: true
[devise] now.subsec > added.subsec: true

usecまでは同じなのだが、subsec をみると Amazon Linux では、桁落ちが発生している。

ためしにそれぞれで Time.now.subsec としてみる。

# mac
$ ruby -e 'puts Time.now.subsec'
276987/1000000

# Amazon Linux
$ ruby -e 'puts Time.now.subsec'
704462593/1000000000

つまりこういうことが起こっている

  1. OSにより Time#subsec が返す精度が異なる
  2. FactoryGirlが create で返すのは、コードで指定された値を格納したオブジェクトであり、DBに登録後取得したものではないので confirmation_sent_at はそのままの精度である。つまり、スタブで突っ込んでいるのは元の精度
  3. DB(sqlite)に格納するとき、DBの型に合わせて精度の桁落ちが発生する
  4. 実際に処理されるときは、DBから取得したデータなので桁落ちが発生したデータになる
  5. DB格納前の元の精度の値と、DBから取得した桁落ちした値を比較しているため期限を超えたことになってしまう
  6. Mac上ではたまたま、Time#subsecの精度がsqliteの精度と同じだったため桁落ちが発生せず正常に動作する

これを避けるためには、スタブに突っ込む値をDBから取得したものにすれば良さそうだ。たとえばこんな感じ

ちなみに Mac でも、桁落ちを引き起こすことは可能で、こんな感じで usec を超えた範囲を指定すれば桁落ちさせられる。

あー疲れた、腹減った

2012/05/12

Ubuntu 12.04 に色々とアプリケーションをインストールした

Ubuntu 12.04 にいつもの環境を整えた。

環境系

# 日本語ディレクトリを英語に
$ LANG=C xdg-user-dirs-gtk-update

# aptitude はデフォルトではインストールされていない
$ sudo apt-get aptitude

# システムをアップデート
$ sudo aptitude update
$ sudo aptitude full-upgrade

# screen も入ってなかった
$ sudo aptitude install -y screen

# 日本語入力はmozc
$ sudo aptitude install -y ibus-mozc

# 日本語のほうがありがたい
$ sudo aptitude install -y manpages-ja

# シェルは zsh
$ sudo aptitude install -y zsh

# vim 必須
$ sudo aptitude install -y vim-nox vim-gnome

# lv 使う
$ sudo aptitude install -y lv

アプリケーション

# Google Chrome と Dropbox は本家からインストールする

# コマンドラインランチャ。これがあれば左側のいらない
$ sudo aptitude install -y gnome-do

# F12でターミナルが降りてくる。とても便利。zsh を使う際、bash をかませる必要がなくなった
$ sudo aptitude install -y guake

開発環境

# 開発するならこれは必須
$ sudo aptitude install -y build-essential

# webサーバは無難にapache
$ sudo aptitude install -y apache2

# DB は PostgreSQL(バージョンが9.1.3になってる)
$ sudo aptitude install -y postgresql libpq-dev pgadmin3

# Subversion から git に完全移行中なのであえて Subversion は入れない
$ sudo aptitude install -y git-core

# ライブラリのインストール(zlib1g-dev とか libssl-dev はすでに入ってたけど一応)
$ sudo aptitude install -y zlib1g-dev libssl-dev libreadline-dev libxslt-dev libxml2-dev libyaml-dev libsqlite3-dev

# rbenv を github から取得
$ mkdir ~/git_repos
$ cd ~/git_repos
$ git clone git://github.com/sstephenson/rbenv.git
$ cd ~
$ ln -s git_repos/rbenv .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .zshrc
$ echo 'eval "$(rbenv init -)"' >> .zshrc
$ source .zshrc

# ruby-build を github から取得
$ cd git_repos
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo sh install.sh

# 最新バージョンを確認して、最新をインストールして、使用するように設定する
$ rbenv install
$ rbenv install 1.9.3-p194
$ rbenv rehash
$ rbenv global 1.9.3-p194
Ruby on Rails 3.2 を Ubuntu にインストールする手順をかなり丁寧に説明してみました - Rails 雑感 - Ruby on Rails with OIAXとかを参照すると rbenv は apt で入れられるようになったみたいだが、自分の環境だとダメだった。
インストールはできるが、rbenv global しても /usr/bin/ruby が居座り続ける。
apt から rbenv をインストールすると ruby1.9.1(実体はruby1.9.3-p0)もインストールされる。
これが /usr/bin/ruby の実体になるので、rbenv global してから ruby -v すると、ruby1.9.3-p0 のまま。
ruby1.9.1 パッケージを削除しようとすると rbenv が依存しているため rbenv が動かなくなる。
どうにもならないので、全部削除して rbenv を github から取ってきたらうまくいった。

2012/05/11

Ubuntu 12.04 に行ったキーボード関連の設定

Ubuntu 12.04 をインストールしてまずキーボード関連の設定を行った。

CapslockをCtrlに

右上から[システム設定]を選択
[ユーザー向け]→[キーボードレイアウト]を選択
オプションをクリック
[Caps Lock キーの動作]を展開
[デフォルト]から[Caps Lock を追加の Control にするが・・・]に変更

ibus-mozcをインストール

# aptitude はデフォルトでは入ってなかった
$ sudo apt-get install -y aptitude

# aptitude で update
$ sudo aptitude update

# ibus-mozc をインストール
$ sudo aptitude install -y ibus-mozc

日本語設定

Dashをibusで検索。キーボード・インプットメソッドを立ち上げる
[一般]タブの[キーボードショートカット]→[切り替え]から余計なものを削除しAlt+graveだけにする。
削除は右の[...]ボタンからどうぞ。
[インプットメソッド]タブを表示
Mozcだけ使用するように設定

ところが...

Alt+grave しても日本語が入力できない。
Alt+Tab のようなウィンドウ選択になる。
どうやら既に Alt+grave がなにかのショートカットになっているみたい。
ぐぐってみると Gnome3における日本語入力設定 - サトルサトラレ in Boston に解決策があった。
また右上から[システム設定]を立ち上げて、今度は[ハードウェア]→[キーボード]を選択
[ショートカット]タブを表示して、左側のリストから[ナビゲーション]を選択。
どうやらこれの[ひとつのアプリケーション内のウィンドウを切り替える]が Alt+grave になっているらしい。
見た目は無効だけど、割り当てられているらしい。
これに適当に別のショートカットを割り当てる。
割り当てるには選択して割り当てたいショートカットを押せばOK。
さらに Back Space で再度無効にする
これで無事 Alt+grave で日本語が入力できるようになった。
こんなん完璧にトラップじゃねーか!

VMWare Player に Ubuntu 12.04 をインストールした

Ubuntu 12.04 LTS Desktop 日本語 Remix CD がリリースされていたので、開発環境を構築するために VMWare Player にインストールした。

CDイメージのダウンロード

Ubuntuの日本語環境 | Ubuntu Japanese Team から iso ファイルをダウンロード。
32bitしかないのね、まあいいか。

VMWare Playerで仮想マシンの作成

通常のインストールと同様にするため、OSは後からインストールする。
ゲストOSはLinux、バージョンはもちろんUbuntu
仮想マシンの名前と置き場を指定。データ置き場が E ドライブなので、デフォルトから変更した。
長く使う予定なのでファイルのサイズを100G、移動とか後の管理がしやすいのでファイルは分割する。
後からでもできるけど、この段階でカスタマイズする。
メモリは4G。Ubuntu 12.04はデフォルトでPAEが有効になっているから3G以上指定しても無駄にならないよ。
プロセッサはとりあえず2つ使う。本格的に開発するようになったら4にするかも。
仮想マシンを再生したら自動的にインストールが始まるように、ISOイメージファイルをダウンロードしたISOファイルに指定しておく。
作成完了。仮想マシンを再生したらインストール始まります。

Ubuntu 12.04 のインストール

新規作成のVMで試すのは時間の無駄かなということでいきなりインストール。
「インストール中にアップデートをダウンロードする」と「サードパーティのソフトウェアをインストールする」にチェックして続ける。
専用領域なんだしおまかせで。
ドライブを選択。一つしかないけどね。
インストール始まりました。
地域を選択。最初から Tokyo になっているので問題なし。
ちなみに下に表示されているファイルのコピーはバックグラウンドで別スレッドで動いてる。
キーボードのレイアウトを選択。デフォルトでは日本語キーボードになっているけど、自分が使用しているのは英語キーボードなので、英語(US)を選択。
自分のユーザーを作成。名前・マシン名・ユーザー名・パスワードを入力。
自動的にログインはしない。毎回パスワード入力するほうがセキュリティ的に安心できる。
残りのインストールが始まる。
インストールが完了した、簡単だね。再起動します。
ログイン画面が表示された。後はログインして好きなように使いましょう

感想

  • インストールは相変わらず簡単。基本的にポチポチしてれば大丈夫
  • フォントとか画面描画とか綺麗になってる
  • VMWare でもデスクトップ効果が有効になったのか、guakeの透過が可能になってたり、gnome-doのスキンが変更できたり実機へのインストールと見た目も変わらん
  • メニューが大幅に変わったので慣れるまで使いにくいかも、最初の環境設定がやりにくくてしゃーない
  • Dashは便利。というか最初はDashか右上のシステム設定でなんとかするしかない
  • アプリの一覧とかアクセスしにくくなった。カテゴリで絞り込むのも手間かかる。まあgnome-doあるので問題ないけど
  • より一般ユーザー向けになった印象

2010/05/23

CentOS 5.4 で 英語キーボードを使い、CapsLock を Ctrl にする

前回は Windows7 と Ubuntu 10.04 で英語キーボードに変更し、CapsLock を Ctrl に変えたけど、今度は CentOS で同じ事をしよう。
ただし、これはサーバマシンなので GUI なし。
既に root になっている前提。

まずは英語キーボードに変更しよう。
# vi /etc/sysconfig/keyboard
で、KEYTABLE="jp106" になっているのを KEYTABLE="us" にする。
これだけ。

次は、CapsLock を Ctrl に変えよう。
# cd /lib/kbd/keymaps/i386/qwerty
# cp us.map.gz us.map.original.gz
# gzip -d us.map.gz
# vi us.map
で、keycode 58 = Caps_Lock を keycode 58 = Control とする。
そして、us.map.gz を作る。
# gzip us.map

あとは再起動すれば完了。
ちなみに日本語キーボードで CapsLock を Ctrl にしたい場合は、us.map.gz じゃなく jp106.map.gz に対して同じことすればいい。
ようするに /etc/sysconfig/keyboard の KEYTABLE の値に対応したファイルってことですね。

2010/05/19

Linux Mint9 が出たらしい

Linux Mint 9 “Isadora” released!

Ubuntu 派生のディストリである Linux Mint の最新版がリリースされた。
きれいで Ubuntu よりちょっと使いやすくなってる。
でも、リポジトリが重い(通信遅い)と思う(Mint全般)
空いた時間に VMWare に入れてみましょ。

2010/01/21

ubuntu-desktop-ja が入らない

入らないっていうか見つからない。

wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
sudo wget https://www.ubuntulinux.jp/sources.list.d/karmic.list -O /etc/apt/sources.list.d/ubuntu-ja.list
sudo apt-get update
これやっても、ubuntu-desktop-ja が見つからない。
apt-get update は問題なく終了している。
うーむ・・・・

2010/01/20

Mint7 → Mint8 へ

Dell inspiron mini 9 の Mint7 (Gloria) を Mint8 (Helena) へアップグレードしたときのメモ。

mini9 はいつもはクリ―インストールするのだが、なんでこんなことしたかというと、mini9 に直接 Mint8 をインストールしたら無線LANが認識しなかったから。
どうやら Min8 (というか Ubuntu9.10)には Broadcom のプロプライエタリドライバが入ってないらしい。
Mint7 (Ubuntu9.04) には入っているので、そこからアップグレードしようというわけ。

手順は http://www.linuxmint.com/blog/?p=1144 の Upgrading graphically (easier) を参照。というかこのまんま。
  1. sudo apt-get install mint-upgrade-tool-main でアップグレードツールをインストール
  2. メニューのシステム管理に Upgrade to Linux Mint 8 の項目が増えているので、これを実行
  3. あとは基本的におまかせ
  4. 途中で幾度となく「設定ファイルを置き換えていいか?」と問われるので、置換をクリック
  5. すべてインストールが終わったら再起動
  6. 若干古めかしい UI で表示されるので、壁紙とテーマを Mint8 のものへ

以上で完了した。
公式 blog の手順にあるけど、やらなくて良かった項目がいくつかあるが環境によるのだろうか?
Mint7 時代に sudo apt-get install mysql-server でインストールしていたからか、自動的に MySQL が 5.0 から 5.1 に更新された。
クリーンインストールと同じ環境にしたかったので、ちょうどよかったが人によっては注意が必要かも。
あと、いろんなところに英語の部分が目立つ。これは、Mint7 のときに ubuntu-desktop-ja を入れなかったからか?

個人的には Ubuntu より Mint の方がおススメだな。
  • Ubuntu はパネルが上下に出るが、Mint は下にひとつ
    ネットブックなどでは画面が広く使いやすい。
  • すべてのメニューがスタートメニューに集約されている。
    1 と合わせて、より Windows に近いので、初心者向け
  • デフォルトのテーマや壁紙が綺麗
    Ubuntu の茶色はどうも・・・・
  • 中身は Ubuntu + α
    Ubuntu よりも更にインストール直後の状態でできることが増えてる。そして、ほんとにほとんど Ubuntu なので、トラブルなどは Ubuntu 向け情報がそのまま使える。

このまま Ubuntu に寄り添って進んでほしいな。独自進化を遂げるようになったら Ubuntu に戻ろう。

2010/01/13

guake で zsh を使いたい場合

vmware player 上の mint8 の設定をちまちまと行う。
sudo apt-get install -y build-esseintial zsh zsh-doc zsh-dev lv manpages-ja
sudo apt-get install -y vim-nox vim-gnome
sudo apt-get install -y ssh apache2 subversion git-core git-doc
sudo apt-get install -y mysql-server mysql-client mysql-admin mysql-query-browser libmysqlclient-dev
sudo apt-get install -y sun-java6-jdk sun-java6-doc sun-java6-fonts scala scala-doc
sudo apt-get install -y ruby irb rake rdoc ruby-dev libmysql-ruby libopenssl-ruby
sudo apt-get install -y filezilla guake jd
sudo gem install -y wirble refe vim-ruby rails mysql jrails haml

まあ、こんな感じ。
guake がよさげだったので初めて導入してみた。
しかし、F12 を押しても一瞬それらしいものが現れてすぐ消える。
どうも zsh はうまく動かないようだ。
しょうがないので、guake では bash を使用することにした。
で、おもむろに screen とすると、zsh が立ち上がるじゃないか(ログインシェルが zsh だから当然か)
で、guake も正常動作している模様。
なるほど、しょせんエミュレータだもんな。
というわけで guake 上で zsh を使いたい場合は、screen をかませればいいようだ。