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が起動するのを確認できた。
なんでだろ?


起動したfedorax86_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ドライバは最新のNVIDIALinux用ドライバの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