Freebsdのpkgで複数のリポジトリを参照する方法
pkgを利用するときに、quarterlyリポジトリよりも新しいpkgが欲しい時があります。
その場合、まずlatestのリポジトリを探して、無かったらportsで自力インストールするような運用手順にして
できるだけpkgでシステムを構成できるようにすると、余計なビルド作業を極力減らせて便利なので
pkgが複数のリポジトリを参照できるように設定を行います。
使用環境とデフォルトのpkg設定
quarterlyが標準のリポジトリに設定されている。
$ freebsd-version 10.2-RELEASE-p14 $ cat /etc/pkg/FreeBSD.conf # $FreeBSD: releng/10.2/etc/pkg/FreeBSD.conf 285830 2015-07-23 23:31:40Z gjb $ # # To disable this repository, instead of modifying or removing this file, # create a /usr/local/etc/pkg/repos/FreeBSD.conf file: # # mkdir -p /usr/local/etc/pkg/repos # echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf # FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly", mirror_type: "srv", signature_type: "fingerprints", fingerprints: "/usr/share/keys/pkg", enabled: yes }
ここに
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
と書いてありますので、/usr/localの下にディレクトリを掘ります。
$ mkdir -p /usr/local/etc/pkg/repos $ echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
標準の設定を無効化する設定ができました。
/usr/localの下にquarterlyを参照する設定、latestを参照する設定をそれぞれ追加します。
すると、/usr/local/etc/pkg/repos以下には下記の3つの設定ファイルが設置されます。
$ cat /usr/local/etc/pkg/repos/FreeBSD.conf FreeBSD: { enabled: no } $ cat /usr/local/etc/pkg/repos/latest.conf latest: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest", mirror_type: "srv", signature_type: "fingerprints", fingerprints: "/usr/share/keys/pkg", enabled: yes, priority: 10 } $ cat /usr/local/etc/pkg/repos/quarterly.conf quarterly: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly", mirror_type: "srv", signature_type: "fingerprints", fingerprints: "/usr/share/keys/pkg", enabled: yes, priority: 0 }
これでpkg updateすれば複数のリポジトリがアップデートするのが確認できると思います。
pkg install時は-rで明示的にリポジトリを指定しないと
リポジトリのpriorityと無関係に新しいバージョンが優先的にインストールされてしまうという微妙な仕様なので、この辺りは今後改善してほしいですね。
Fedora Core 12 にCUDAプログラミング環境構築メモ
NEC Express5800/110Gdにグラフィックボードを増設してCUDAプログラミング環境を構築した。
NEC Express5800/110Gdはサーバ機なので
PCI-Express x16が使えずPCI-Express x1に対応したグラフィックボードが必要だったが
nvidia製のGeforce 210を積んでいて
お手軽にCUDAプログラミングを始めるのにちょうどいいと思いこれを選んだ。
ELSA ビデオカードELSA GLADIAC 210 LP x1 512MB GD210-512ERLP1
OSは普段FreeBSDを使っているので、そのまま使おうかと思ったが
あとでめんどくさそうなので結局Fedoraにした。
グラフィックボードを差したら、最初に起動したときにBIOSすら起動せず
マザーボードからピッピッピとビープ音が聞こえてきたのだが
PCI-Express ポートの2つめに挿し直したらうまくBIOSが起動するのを確認できた。
なんでだろ?
起動したfedoraはx86_64版の12で、gnomeデスクトップにfirefoxをいれてある
そのままnvidiaのサイトに行ってドライバをダウンロードする
ドライバの検索ページで
製品のタイプ:GeForce
製品シリーズ:GeForce 200 Series
製品ファミリー:GeForce210
オペレーティングシステム: Linux 64-bit
言語:Japanese
を選択して検索して
NVIDIA-Linux-x86_64-190.53-pkg2.runを/usr/local/src以下に保存する
http://www.nvidia.co.jp/object/linux_display_amd64_190.53_jp.html
次にCUDA関連のソフトもダウンロードする
http://www.nvidia.co.jp/object/cuda_get_jp.html
ここで
オペレーションシステム:Linux64ビット
Linux版:Fedora 10
を選択して
最新のCUDA2.3の
1. CUDAドライバ
2. CUDAツールキット
3. CUDA SDKコードサンプル
の3つを落とした。
(1.CUDAドライバは最新のNVIDIAのLinux用ドライバの190.53を落としていたので実際には不要だった)
これも/usr/local/srcに保存した。
ドライバのインストールはxの停止した環境で行わなければならないため
/etc/inittabを編集してランレベルを5から3にしてrebootしてから行う。
ドライバのインストールは
sudo sh NVIDIA-Linux-x86_64-190.53-pkg2.run
とするとインストールがはじまる
途中で32bit版OpenGLライブラリをいれるかと聞かれたが、とりあえずYesとしておいた。
CUDAドライバは上記ドライバの一部としてインストール済みのようなので飛ばして
CUDAツールキットのインストールを行った
sudo sh cudatoolkit_2.3_linux_64_fedora10.run
途中pathを打つように言われるが、defaultで良いので何も記入せずにEnterを押した。
最後にCUDA SDKのインストールを行った
SDKは~/以下にインストールされるようなので
自分のhomeディレクトリにインストールされるように
sudoをつけないことにした
sh cudasdk_2.3_linux.run
これも途中pathを打つように言われるが、defaultで良いので何も記入せずにEnterを押した。
ひととおりインストールが終わったら最後にPATHを通す
.bashrcに
export PATH=$PATH:/usr/local/cuda/bin export LD_LINKLIBRALY=/usr/local/cuda/lib64
を記載した。
最後にcudaでhello worldを行った
cd ~ mkdir -p work/cuda
で作業ディレクトリを作って
hello.cuに
#include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; }
これをnvccでコンパイルして
nvcc hello.cu
a.outが出力されるので
./a.out
これでhello world!がでるはず
ここで、a.outがエラーを出てしまう場合は
LD_LINKLIBLALY_PATHを/usr/local/cuda/libなどと
間違えていないか確認したほうがよいだろう
(最初間違えてエラーが出てしまった、自分の環境にあわせて設定すればよさそう)
ここまでくれば、あとは自由にCUDAプログラミングができるはず。
railsでPaperclipを使ってみる
PaperclipはRailsで画像を扱うためのプラグインです。
http://www.thoughtbot.com/projects/paperclip/
Railsで画像を扱うプラグインにはattachment_fuなどがあるのですが
attachment_fuでは画像を取り扱うために専用のモデルを必要としているのですが
こちらは専用のモデルが必要がなく、自分で定義するモデルに自由に画像を取り込めるようです。
さっそく使ってみる。
プラグインのインストール
script/plugin install git://github.com/thoughtbot/paperclip.git
とりあえずrdocを読んでみる
less vendor/plugins/paperclip/README.rdoc
色々書いてあるが押さえておきたいのは画像の保存場所に関しての説明
画像の保存場所はモデルに追加するオプションで指定するか
:path
デフォルト設定にまかせてpubulic/system以下の下記のパスに保存させることができる。
:rails_root/public/system/:attachment/:id/:style/:basename.:extension
Imageモデルを作成してみる。その際、様々なモデルに関連付けできるようにしておく
$ script/generate model Image type:sting parent_type:string parent_id:integer image_file_name:string image_content_type:string image_file_size:integer image_updated_at:datetime #長いので途中で改行してます
こんな感じのマイグレーションファイルができる
class CreateImages < ActiveRecord::Migration def self.up create_table :images do |t| t.sting :type t.string :parent_type t.integer :parent_id t.string :image_file_name t.string :image_content_type t.integer :image_file_size t.datetime :image_updated_at t.timestamps end end def self.down drop_table :images end end
次にモデルを書き換える
class Image < ActiveRecord::Base belongs_to :parent, :polymorphic => true # Paperclip has_attached_file :image, :styles => { :medium => "250x250>", # >はリサイズ :thumb => "100x100#" # #はトリミング }, # :url => "/store/:attachment/:id/:style/:basename.:extension", # 表示用url # :path => ":rails_root/public/store/:attachment/:id/:style/:basename.:extension" # 画像保存path # 拡張子の制限 validates_attachment_content_type :image, :content_type => ['image/jpg', 'image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png'], :message => "JPG, GIF, PNGのみアップロードできます" # ファイルサイズ制限 validates_attachment_size :image, :less_than => 2.megabytes, :message => "ファイルサイズが大きすぎます(最大 :max バイトまで)" end
次にエントリーモデルの作成
class Entry < ActiveRecord::Base has_many :images, :as => :parent, :dependent => :destroy end
parentでポリモーフィック関連させる。
次にmodels/image/entry_image.rbを作成
class Image::EntryImage < Image end
あとはビューとコントローラをちょいちょいと修正する
コントローラ
class EntriesController < ApplicationController #その他省略 # POST /entries # POST /entries.xml def create @entry = Entry.new(params[:entry]) @image = Image::EntryImage.new(params[:image]) respond_to do |format| if @entry.save @entry.images << @image # 追加 flash[:notice] = 'Entry was successfully created.' # format.html { redirect_to(@entry) } format.html { redirect_to('/') } format.xml { render :xml => @entry, :status => :created, :location => @entry } else format.html { render :action => "new" } format.xml { render :xml => @entry.errors, :status => :unprocessable_entity } end end end # その他省略 end
投稿画面のview
multipartをtrueにして投稿できるようにする
<h1>新規投稿</h1> <% form_for(@entry, {}, { :html => { :multipart => true } }) do |f| %> <%= f.error_messages %> <p> <%= f.label '題名' %><br /> <%= f.text_field :title %> </p> <p> <%= f.label '本文' %><br /> <%= f.text_area :body %> </p> <p> <%= file_field :image, :image %> </p> <p> <%= f.submit '投稿' %> </p> <% end %>
閲覧ページのビュー
コントローラで@entry取得したら
こんな感じに記述すればいい
modelの中でdelegateしてあるからimage.urlとスマートな呼び出し方ができる
<p> <b>Photos:</b> <%- @entry.images.each do |image| -%> <%= image_tag image.url %> <%= image_tag image.url(:medium) %> <%= image_tag image.url(:thumb) %> <%- end -%> </p>
こんなかんじで動作確認してみたところ無事動きました。
参考
http://d.hatena.ne.jp/hichiriki/20081130
http://d.hatena.ne.jp/lov2much/20090105/1231173820
macportsでruby19があたらしくなっていたよ
macportsのチェックをしていたらruby19が新しくなっていたので更新
$ port search ruby19 ruby19 @1.9.1-p0 (lang, ruby) Powerful and clean object-oriented scripting language cod-no-macbook:~ cod$ sudo port install ruby19