スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Git に再入門してみる(2)

あとでかきますー。
スポンサーサイト

Git に再入門してみる(1)

ついさっき、うっかり git reset --hard HEAD してしまって泣いたのでGitを勉強しなおしてみる。

たぶん、いろいろ間違ってるので見つけた方はご指摘よろしくです。
あと、こことかのほうがよくまとまってる。


【0】Gitとは?

詳しくは Wikipedia とか他のサイトを見ればいいと思うが、いわゆるバージョン管理システム

他のバージョン管理システムとしてはSubversionとかCVSとかあるらしいが、にわかな俺は使ったことない。

とにかく、バージョン管理システムというと、「げ、コードいじってたら動かなくなった……!」などという場合に以前のバージョンにサクッと戻せるツール。
他にも、みんなで分担してコードを書き進めていく時とかに便利。

使い始めたら、Gitなしではコード書けない。


【1】作業ツリー、ステージングエリア、リポジトリ

用語のおはなし。

《作業ツリー》
普段、コードを書いたり設定ファイルをいじったりするところ。

Gitを使ってない場合、コードが置かれている環境は1つだが、Gitだとbranchという機能によって、複数の作業ツリーを並行的に使える。

正直、初めはよくわからないので、作業用ディレクトリのようなものだと考えれば良いと思う。

A という branch の a.txt というファイルには変更を加えずに、B という branch の a.txt に変更を加えて動作を確認した後、それを A という branch に適用したり、丸ごと捨ててしまったりできる。


《ステージングエリア》
作業ツリーで行った変更は最終的にはリポジトリに反映するんだが、その前に変更を仮確定するところ。
別名をインデックスというらしいが、そう呼んでいる人は見たことがない。

作業ツリーからステージングエリアにファイルを追加することを「ステージする」とかいう。


《リポジトリ》
最終的に、全ての変更を保存する場所。レポジトリと言ったりもする。
apt-get とかでプログラムをインストールするときに参照するリポジトリとは別物なので、混乱しないように。

ステージングエリアの変更をリポジトリに適用することを「コミットする」という。


【2】Gitを使った作業の流れ

ざくっと書くとこんな感じ。

作業ツリーでファイルを追加・編集する。
 ↓
編集した結果をステージングエリアに加える。
 ↓
変更をリポジトリにコミットする。


【3】Gitのインストール

Ubuntu 12.04(Quantal)だと、

$ sudo apt-get install git

で入ります。

他のOSは知りません。
ggrks。


【4】Gitのセットアップ

いかにGitが便利とはいえ、コンピュータの中の全ファイルを追跡してたら死ぬので、Gitでバージョン管理する際には対象ディレクトリを指定する必要があります。

hoge ディレクトリ以下を追跡する場合、

$ cd hoge
$ git init

とします。

これで、hoge ディレクトリ以下のファイルの変更が追跡されるようになり、Gitによるバージョン管理の準備が整いました。

ちなみに、gitによるバージョン管理をやめる場合は、git init したディレクトリにある .git ディレクトリを削除するだけです。

$ cd hoge
$ rm -r .git




続きます=>「Gitに再入門してみる(2)」





Git入門の良書。
たぶん、このブログの1000倍わかりやすい。

Ruby で引数によって生成するインスタンスを変更する

ファイルの処理をしていると、ファイル形式によって生成するインスタンスのクラスを変えたいことがあります。

利用例としてはこんなイメージ。 ただ、ここで、 とすると、initializeメソッドは値を返さないので、Orderクラスのインスタンスがorderに格納されてしまいます。

したがって、以下のように振り分けます。 なんのことはない、クラスメソッドの定義を行なっているだけですが、自分が結構な時間ハマったのでメモとして。

ここで、Orderクラスのサブクラスにはポリモーフィズムが適用されている前提である事は言うまでもない。

Ubuntu からネットワークプリンタに接続する

タイトルの通り、Ubuntuからネットワークプリンタに接続する方法のメモ。

【0】環境
Ubuntu 12.04 Precise
Brother HL-5350DN

【1】参考サイト

参考:いつか、そのとき、あの場所で。

【実行結果抜粋】

$ sudo bash linux-brjprinter-installer-1.0.4-1 HL-5350DN

以下のパッケージが見付かりました。
hl5350dnlpr-2.0.3-1.i386.deb
cupswrapperHL5350DN-2.0.4-1.i386.deb
インストールしますか? [y/N] ->y

Device URIを指定しますか? [y/N] ->y

0: beh
1: ipps
2: ipp
3: https
4: socket
5: scsi
6: ipp14
7: lpd
8: smb
9: http
10: hp
11: hpfax
12 (I): IPアドレスの指定
使用するDevice URIの番号を選択してください。 -> 12

ご使用のプリンタ/MFCのIPアドレスを指定してください。-> 192.168.1.250

lpadmin -p HL5350DN -v socket://192.168.1.250 -E
テスト印刷を実行しますか? [y/N] ->y

wait 5s.
lpr -P HL5350DN /usr/share/cups/data/testprint

SF未来モック論、あるいは、単なる自己正当化

最近、強く思うこと。

「SF作家が未来を描き、技術者がそれを形にする」

言い換えれば、

「技術はまず2次元で作られて、それから3次元に引きずり降ろされる」


たぶん、アトムやドラえもんやガンダムやスターウォーズがなかったら今の世界はない。

ぼんやりとした理想を作品という形で具体的なイメージにすることによって、そこに向かって進んでいける気がする。

そう考えると、SFは将来作る製品のモックみたいなものだと思う。

そして、この指針は論文とかじゃなく、やっぱりエンターテインメントじゃないとダメなんだとも思う。

創業時のDropBoxが自社のサービスの利点をいくら説明して回っても価値を認めてもらえなかったけど、「DropBoxを使うとこんなことができるよ!」っていうPVを発表したら一気に受け入れられた、みたいな。



まあ、エヴァや攻殻機動隊みたいなUIを作りたいなーってだけなんですけど。

git rm を一括処理する。

Gitで新しく追加されたファイルは

$ git add .

で簡単にステージに追加できます。

しかし、削除したファイルをステージから削除するのは1個ずつやらないといけない。
しかも、ファイルが削除されてしまっているので、ターミナルのファイル名補完が働かないという罠。

というわけで、仕方なく一部手打ちで

$ git rm app/controller/user*

とかしてたんですが、めんどくさくなったので、git statusの結果から一括削除することに。

$ git status | grep -e deleted: | sed -e "s/#\t*deleted: *//g" | xargs git rm


これでステージからの一括削除ができます。
ただし、Gitのバージョンが違ったりすると、正規表現が一致しなくなるかも知れないので、そのあたりは自己責任で。


【補足:簡単な説明】
git status で変更があったファイル一覧を出力し、パイプでgrepに投げます。

grep は受け取った文字列から、ステージから削除したいファイル名が含まれる行、すなわち、「deleted:」が含まれる行を抽出し、sedに投げます。

sed はファイル名以外の部分を削除します(Gitのバージョンが変わると、ここが一番弱い)。

最後に、xargsでsedの出力を受け取って、それぞれに対して git rm します。


上にも書きましたが、sedの正規表現の部分が一番弱いので、変更に対して強い正規表現に書き換える必要がありますが、面倒なので困ってから書きk(ry

Ruby UTF-8 から Shift_JIS(Windows-31j) へ変換するときにエラー

残念ながら、世の中はWindowsを中心に回っているため、CSVをやりとりするときには、文字コードをShiftJISにすることが求められたりします。


RubyプログラムをLinuxで書いていると文字コードは基本的にUTF8になるので、文字コード変換をする必要が出てくるわけですが、kconvやString#encode(Ruby 1.9以降)を使ってSJISに変換する際にエラーを吐かれる文字がいくつかあります。

詳しくは、下記の参考ページに書かれていますが、全角チルダ(ウェーブダッシュ,wave-dash)やハイフン(hyphen)、セントやポンドなどの記号が当てはまります。
文字コードで言うと、U+301C、U+2212、U+00A2、U+00A3、U+00AC、U+2014、U+2016あたりですね。

参考:マニアックなプログラミング備忘録「文字化けについて」


というわけで、文字列をkconvやString#encodeに投げる前に、これらの文字をSJISに変換できるようにするメソッドを作ってみました。
# メソッドの命名難しいorz

String#exchangeでは、「変換したいSJIS非互換文字」と「変換先のSJIS互換文字」の文字コードをそれぞれ"U+XXXX"の形で引数として受け取って、String#to_codeとInteger#chrを用いて文字に変換し、String#gsubでレシーバに含まれる全ての非互換文字を互換文字に置換します。

String#to_codeでは、"U+XXXX"という形の文字コードの16進数部分XXXXを10進数として取り出して返しています。

String#sjisableでは、それぞれの非互換文字を順に置換しているだけです。


実際の使い方としてはこんな感じです。


やっつけですが、動くのでよしとしましょう。

【追記】
String#exchangeはハッシュで と書いたほうがキレイなのか? とも思いましたが、どっちのほうがいいんですかね……。

Ubuntu 12.04 に Wine をインストール

Ubuntu上でExcelを動かしたくなったので、Wineを入れてみる。

【0】環境
・Ubuntu 12.04


【1】Wineのインストール

Wineはいつものapt-getで入れられます――そう、Ubuntuならね。

$ sudo apt-get install wine


下記のパッケージがインストールされます。

cabextract fonts-droid fonts-horai-umefont gnome-exe-thumbnailer icoutils libcapi20-3 libmpg123-0 libodbc1 libopenal-data libopenal1 libpam-winbind odbcinst odbcinst1debian2 ttf-droid ttf-mscorefonts-installer ttf-umefont unixodbc unrar winbind wine-gecko1.4 wine1.4 wine1.4-common wine1.4-i386 winetricks



Ubuntu で市販DVDを再生

【環境】
Ubuntu 12.04 Precise

Ubuntuで市販のDVDを再生しようとすると、権限がないみたいな感じで怒られます。

これを回避するためには、

$ sudo /usr/share/doc/libdvdread4/install-css.sh


これでOKです。

参考:ニャンコぱぱのひなたぼっこ「ubuntu 12.04 市販DVDの再生方法」


また、DVDをISO化する際にはBraseroからDVDのコピーを選択し、出力先をイメージファイルにすればサクッとISO化できます。

CarrierWave を使って Rails で画像をアップロード

Railsで画像等のファイルをアップロードして扱うために、CarrierWaveとRMagickを使ってみます。


【0】概要

GitHub:CarrierWave
特徴:篳篥日記「[Rails] file_column から CarrierWave へ (序)」

特に2つ目のページがよくまとまってます。


【1】環境

OS:Ubuntu 12.04 (Precise)
Ruby:1.9.3-p194
Rails:3.2.0


【2】CarrierWaveのインストール・使い方

参考サイト:GEEKZ「Railsでcarrierwaveを使って画像ファイルのアップロード」

基本的に上記サイトに従ってインストールを進めていきます。

$ bundle install


CarrierWaveを使うためには、アップロード用のクラスを作成します。
ここでは、画像アップロード用のImageクラスを作ります。

$ rails generate uploader image

上記のコマンドを実行すると、rails_root/app/uploaders/image_uploader.rb が作成されます。

続いて、このクラスを利用するクラスを設定します。

Userクラスにプロフィール画像を設定すると仮定すると、

$ rails generate scaffold User name:string image:string

このクラスに以下の内容を追記します。

さらに、アップロードを行うためにviewを編集します。
アップロードした画像は以下のようにして表示できます。


【3】CarrierWaveの設定いろいろ

CarrierWave の設定をいじるには、作成したアップロード用のクラスを編集します。

保存方法(ファイル保存、DBにbinaryで保存など)

以下のようにして、保存先をいろいろ設定できます。
上記の設定でファイルに保存されます。
他の方法はググってください

アップロードされたファイルの保存先(ファイルとして保存の場合)

store_dir メソッドを編集することによって、ファイルの保存先ディレクトリを指定できます。 public/ 以下の上記設定ディレクトリに保存されます。
上記の場合だと、rails_root/public/uploads/user/1/hoge.jpg とかそんな感じ。

ちなみに、ファイル名はアップロードされたファイル名のままです。


【4】RMagickのインストール・使い方

上記のサイトには apt-get で RMagick に必要な ImageMagick を入れられるとありますが、Ubuntu 12.04 では Can't find Magick-config とか言われて入れられません。

というわけで、別の方法で入れます。

参考サイト:Qiita「Ubuntu12.04でimage-magickとrmagickを入れる」

apt-get ではなく、aptitude で入れます。

$ sudo aptitude install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev


RMagick を入れます。

$ bundle install

RMagick を有効にするには、利用するアップロードクラスの以下の行のコメントアウトを外します。
アップロードされた画像に対してサムネイルを自動作成するには、次のように記載します。 これで、画像ファイルがアップロードされたときに、100px×100px以内に縮小されたファイルが保存されます。

ファイル名は「thumb_元々のファイル名」になります。

ちなみに、表示するときは、 で表示できます。

Rails model 階層化

Railsのモデルを自己階層化(?)したい場合――といってもたぶん伝わらないと思いますが、つまり、こういうこと↓

├机 ─デスク
├椅子┬スツール
│  └座椅子
└布団


階層の数が決まってれば、階層数だけテーブルとモデルを作ってリレーション設定してもいいんですが、スケーラビリティ的にあまり嬉しくない。
どうせ複数階層対応するなら、無限階層まで対応したい。

というわけで、CategoryモデルからCategoryモデルにリレーションを張って、自己階層化(?)したいわけです。


イメージとしてはこうですね↓

rails_root/app/model/category.rb
class Category < ActiveRecord::Base
belongs_to :category
has_many :categories
end

とはいえ、これだと動きません。


こういう状況を扱う方法はリファレンス本にも載っていなくて、必死にググった結果、見つけたのが下のページ。あなたが神か。

参考:日本の天ぷら情報「Railsで階層構造のデータを自力で扱う」

しかし、神も全能ではないらしく、うまく行かない点がいくつかあったので、そのあたりを書いておきます。

ちなみに、リンク先にもありますが、こういうデータ構造を「隣接リストモデル」とかって言うらしいです。ほへぇー。


【0】とりあえず、環境

Rails:3.2.0


【1】テスト用のアプリケーションの作成

テスト用のアプリケーションを作成します。

$ rails new tree_test
$ cd tree_test/
$ rails generate scaffold category name:string parent_id:integer
$ rake db:migrate



モデルを編集します。

rails_root/app/models/category.rb
class Category < ActiveRecord::Base
belongs_to :parent, class_name: Category, foreign_key: "parent_id"
has_many :children, class_name: Category, foreign_key: "parent_id"
end


これで、@category.name するのと同じように @category.parent.name したりできるようになります。

あと、@category.children.each とか。


ちなみに、冒頭の
├机 ─デスク
├椅子┬スツール
│  └座椅子
└布団
をこのモデルで表すと、
| id | name   | parent_id |
| 1 | 机    | nil |
| 2 | 椅子   | nil |
| 3 | 布団   | nil |
| 4 | デスク  | 1     |
| 5 | スツール | 2     |
| 6 | 座椅子  | 2     |
な感じになります。

Ubuntu 12.04 で CUPS を使ってプリンタサーバー

Ubuntu 12.04でCUPSを使ってプリンタサーバー(プリントサーバー?)の設定をします。

使用するプリンタはBrotherのDCP-7040。

プリンタサーバー自体の設定は簡単でしたが、プリンタドライバを入れるのにちょっとだけ苦労しました。


【1】CUPSのインストール・設定

プリンタサーバーとして使うCUPSをインストールします。

$ sudo apt-get install cups



CUPSは管理用のWebページを使って設定するのですが、デフォルトではCUPSサーバーが入っているマシンからしかそのページにアクセスできません。

というわけで、LAN内の他のPCからもアクセスできるように設定ファイルを書き換えます。

/etc/cups/cupsd.conf
Listen 631

# Restrict access to the server...
<Location />
Order allow,deny
Allow @LOCAL
</Location>

# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow @LOCAL
</Location>


これでLAN内のPCからもアクセスできるようになっているハズなので、CUPSを再起動。

$ sudo service cups restart



ブラウザから「serveradress:631」を叩いてCUPSの管理画面が表示されればOKです。


【2】Brother DCP-7040用ドライバのインストール

次に、CUPSの設定ページでプリンタの追加・設定を行なっていくのですが、俺が使っているプリンタ(DCP-7040)のドライバがない!

ダメ元でDCP-7045のドライバで設定してテストページの印刷をしてみたところ、真っ白な紙がエンドレスで排出されてくるという不具合が発生w


というわけで、おとなしく正規のドライバを入れていきます。

ドライバのダウンロード及びインストールの説明ページはこちら
http://welcome.solutions.brother.com/bsc/public_s/id/linux/en/download_prn.html
http://welcome.solutions.brother.com/bsc/public_s/id/linux/en/instruction_prn1a.html


基本的には上記の説明ページに書かれている通りに進めていけばOKです。


まず、ドライバのパッケージ(LPRとcupswrapperの両方)を落としてきてCUPSサーバーのテキトーなディレクトリに置きます。
(方法は何でもいいと思いますが、俺はブラウザからローカルのGUIマシンに落として、scpでサーバーに送りました)


次にドライバを置いたディレクトリに移動して、dpkgコマンドでインストールします。

$ sudo dpkg -i --force-all brdcp7040lpr-2.0.2-1.i386.deb
$ sudo dpkg -i --force-all cupswrapperDCP7040-2.0.2-1.i386.deb


無事入ったかどうか確認。

$ dpkg -l | grep Brother
ii brdcp7040lpr:i386 2.0.2-1 Brother DCP-7040 LPR driver
ii cupswrapperdcp7040:i386 2.0.2-1 Brother DCP7040 CUPS wrapper driver



こんな感じで出力されれば大丈夫です。

あとはCUPSの設定ページからプリンタを追加するだけ!

Ruby 標準CSVライブラリ ダブルクォーテーション

RubyのCSV標準ライブラリを出力する際に、項目をダブルクォーテーション(")で囲みたくなったときの方法。

こんなふうにハッシュで「:force_quotes => true」指定してあげるといけます。


巷では遅い遅いと言われている標準ライブラリのCSV。
たしかに遅いです。

ただ、fasterCSVとかではパースできないCSV(カラムに改行を含むデータとか)もパースしてくれるので、個人的には大好きです。便利に使わせてもらってます。

全てのCSVがきちんと書かれていれば、このライブラリも、もっと速く動くように作れるんですけどね。

Capistrano を使って Rails アプリケーションをデプロイする際に、Whenever も更新する

タイトルの通りですが、caistranoでcap deployしたときにwheneverも同時更新したい。

このときの設定方法。
初めは task を設定したりしてたんですが、その方法だと、デプロイするたびにcrontabの記載内容が増えていくという致命的な欠点が……w

参考サイト:CapistranoでWhenever|ひげろぐ

Rails デプロイ capistrano

Railsで作ったアプリケーションをデプロイしようとしたところ、いくつかエラーが発生したので記録を残しておく。


【1】Host key verification failed.

まずは、吐かれたエラー。長い。

$ cap deploy:migrations

** [host :: err] Host key verification failed.
** [ms0 :: err] fatal: The remote end hung up unexpectedly
command finished in 562ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'if [ -d /home/user/host/shared/cached-copy ]; then cd /home/user/host/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard 18a1963df4f7e782b882abd949f2bf1984a7dbfa && git clean -q -d -x -f; else git clone -q user@host:git/application.git /home/user/host/shared/cached-copy && cd /home/user/host/shared/cached-copy && git checkout -q -b deploy 18a1963df4f7e782b882abd949f2bf1984a7dbfa; fi'" on host


Host Keyがどーのとか言われているが、SSH接続できることは既に確認済み。

というわけで、いろいろ調べた結果、Gitサーバーとデプロイ先が同じ時に発生するエラーらしいことが判明。

config/deploy.rbをいじります。

【訂正前】
set :deploy_via, :remote_cache

【訂正後】
set :deploy_via, :copy



【2】Could not find i18n-0.6.0 in any of the sources

*** [err :: ms0] rake aborted!
*** [err :: ms0] Could not find i18n-0.6.0 in any of the sources
*** [err :: ms0]
*** [err :: ms0] (See full trace by running task with --trace)
command finished in 862ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/user/host/releases/20120928063350 && rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on host


別に国際化対応するほど立派なアプリケーションは作っていないので、i18nなんて使っていないにもかかわらず、i18nがないとか言われる。

i18nを入れたみたりいろいろした結果、以下の方法で解決。

config/deploy.rb
require 'bundler/capistrano'



【3】Access denied for user

*** [err :: ms0] rake aborted!
*** [err :: ms0] Access denied for user 'user'@'localhost' (using password: YES)
*** [err :: ms0]
*** [err :: ms0] Tasks: TOP => environment
*** [err :: ms0] (See full trace by running task with --trace)
command finished in 6407ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/user/host/releases/20120928064326 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on host



パーミッションとか言われて戸惑いましたが、冷静に考えると、デプロイ先のサーバーでデータベースの設定をしていないことに気づきました。

というわけで、

$ sudo mysql -u root -p
Enter password:
mysql> create database rails_production;
mysql> grant all privileges on rails_production.* to 'user'@'localhost' identified by 'password';
mysql> exit;


このあたりのユーザー名等はconfig/database.ymlに揃えれば大丈夫です。



以上3点のエラーをくぐり抜けた結果、無事デプロイすることができました。

Apache HTTP Server の設定いろいろ。

Apacheまわりのよくやる設定・ハマリどころ。

【環境】
Ubuntu 11.10
Apavhe 2.2.20

【目次】
1. LISTENするポートを設定する
2. Ubuntuのポートを開ける
3. ポート番号ごとに表示するページを変える


【1】LISTENするポートを設定する

Ubuntu上のapacheでListenするポートを設定するためには、/etc/apache2/ports.confを編集します。
Listen    80
Listen 8080

原則として上記の設定でOKですが、設定後、Apacheを再起動して、ポートを調べます。

$ sudo service apache2 restart
$ netstat -tan


このときに、
tcp6    0    0 :::80      :::*    LISTEN     
tcp6 0 0 :::8080 :::* LISTEN
となっていた場合、IPv4ではなく、IPv6でListenしてしまっているので、設定ファイルの記述を
Listen    0.0.0.0:80
Listen 0.0.0.0:8080
に書き換えます。

apacheを再起動して、
tcp    0    0    0.0.0.0:8080    0.0.0.0:*    LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
となっていればOKです。


【2】Ubuntuのポートを開ける

Ubuntuのポート設定はufw(Ubuntu Fire Wall)で行えます。

8080番のポートを開けたい場合は

$ sudo ufw allow 8080

でサクッと開けられます。

また、ufwで開けたポートの確認は

$ sudo ufw status

で行えます。

Status: active

To Action From
-- ------ ----
80 ALLOW Anywhere
8080 ALLOW Anywhere
80 ALLOW Anywhere (v6)
8080 ALLOW Anywhere (v6)


もし、Statusがactiveでない場合は、

$ sudo ufw enable

で有効にできます。

※ SSH等でリモート接続している場合は接続に使っているポート(SSHは22番)を開けてからactiveにしないと、接続できなくなります。


【3】ポート番号ごとに表示するページを変える

クライアントからのリクエスト内容によって表示するページを変えるためには、バーチャルホストを使います。

外部向けのサーバーではHTTPヘッダに含まれるドメイン名によって、レスポンスを切り替えますが、DNSが無いローカルネットワークではこの方法が使えません。

というわけで、内部向けなので、「このページにはこのポート使ってアクセスしてね」という運用でやりすごせるだろうという考えのもとに、ポート番号で振り分けます。

/etc/apache2/ports.confに以下の内容を追記。

NameVirtualHost *:8080

<VirtualHost *:8080>
DocumentRoot /var/www/pukiwiki
</VirtualHost>

この場合、8080番ポートにHTTPリクエストが飛んできた場合、/var/www/pukiwikiの内容を表示します。

これを使えば、単一のサーバーで複数のサービスを提供できます。


【4】その他

Google先生に教えてもらった内容を寄せ集めた程度の知識なので、内容の信憑性に関してはごにょごにょ……。
間違い等があればご指摘お願いします。

Rails で MySQL に fixture を load すると文字化けする。

【環境】
Ruby: 1.9.3
Rails: 3.2.0
MySQL: 5.5

【0】問題

RailsでSQLite3を使って開発を進め、本番環境に移行しようと、production環境でのデータベースをMySQLに設定しました。

アプリケーションが正常に動作するかどうか確かめるために

$ rake db:fixtures:load RAILS_ENV="product"

して、フィクスチャデータを読み込んでみたところ、読み込み自体には成功したものの、フィクスチャデータ中の日本語がことごとく「?」になるという自体に。


【1】原因

いろいろ調べてみたところ、DBの文字コードに起因する問題っぽいことが判明。

【development】

$ rake db:carset
#=> UTF-8


【production】

$ rake db:carset RAILS_ENV="production"
# => latin1


つまり、SQLite3はUTF-8だが、MySQLはLatin-1で構成されている。

データベースの文字コードをUTF-8にして作成しなおせば解決しそう。


【2】解決法 => MySQLのデフォルト文字コード設定

Ubuntu では MySQL の設定ファイルは /etc/mysql/my.cnf にあります。

このファイルの [client], [mysqld] ブロックそれぞれに以下の行を追記します。

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

(※ 古いMySQLは[mysqld]もdefault-character-set=utf8)

設定を有効にするために、MySQLを再起動。

$ sudo services mysql restart

これで、MySQLのデフォルト文字コードがUTF-8になります。

$ rake db:carset RAILS_ENV="production"
# => latin1
$ mysql -u root -p
Enter password: ********

mysql> status
--------------
mysql Ver 14.14 Distrib 5.5.24, for debian-linux-gnu (i686) using readline 6.2

Server version: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
--------------



DBを作りなおしてから、フィクスチャをロードしなおしたところ、アプリケーション側の表示も正常になっていました。


【3】結論

世界はUTF-8で廻れ!

Ruby RVM インストールエラー

RVMでRubyを入れたら、エラー。

It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NameError)
uninitialized constant Gem::Commands::InstallCommand



この状態でgem list --localしてみると、gemがひとつも入っていない。

とりあえず、言われたとおりにlibyamlとzlibを入れて、Rubyを再インストール。

$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libyaml-dev
$ rvm remove 1.9.3
$ rvm install 1.9.3



あとは、ここを参考に進めればおkです。

Rails で has_secure_password を設定したときのパスワード認証

以前、書いたことがあるにも関わらず、すっかり忘れていたのでメモ。

app/models/user.rbにhas_secure_passwordを設定すると、パスワードがdigestとして保存されたり、editするときにconfirmが入ったりと、いろいろ便利になります。

しかし、digestとして保存されるため、ユーザーが入力したパスワードと保存されているパスワード(のdigest)が等しいのかを直接比較することができません。

というわけで、そんな場合の比較方法。

authenticateメソッドを使って比較します。
ちなみに、戻り値(返り値)について。
authenticateメソッドは引数がレシーバのパスワードと一致した場合にレシーバを返し、一致しなかった場合にfalseを返します。

Amazon MWS リクエストを拒否された

AmazonMWSにリクエストを投げた結果、こんなエラーを返される。
【原因】
RubyのNet::HTTPでリクエストを投げていたのだが、リクエストURLを'/'としていた。 クエリを投げないといけないので、'/?AccessId=hoge...'のようにする必要がある。
カレンダー
06 | 2017/07 | 08
- - - - - - 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 - - - - -
検索フォーム
カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QR
リンク
アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。