スポンサーサイト

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

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の設定ページからプリンタを追加するだけ!
カレンダー
09 | 2012/10 | 11
- 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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。