ScientificLinux6.3でUnixBenchをインストールする

ちょっとめんどくさかったのでメモ。

$ sudo yum -y install perl-devel perl-CPAN perl-Time-HiRes
$ wget http://byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz
$ tar zxvf unixbench-5.1.2.tar.gz 
$ cd unixbench-5.1.2
$ vi Makefile

makefileのグラフィック周りをコメントアウトする。diffは次の通り。

46c46
< GRAPHIC_TESTS = defined
---
> # GRAPHIC_TESTS = defined
106,110c106,110
< ifdef GRAPHIC_TESTS
< GRAPHIC_BINS = $(PROGDIR)/ubgears
< else
< GRAPHIC_BINS =
< endif
---
> #ifdef GRAPHIC_TESTS
> #GRAPHIC_BINS = $(PROGDIR)/ubgears
> #else
> #GRAPHIC_BINS =
> #endif
118c118
<       $(PROGDIR)/fstime $(PROGDIR)/whetstone-double $(GRAPHIC_BINS)
---
>       $(PROGDIR)/fstime $(PROGDIR)/whetstone-double 

修正が完了したらmakeしてみる

$ make

実行はRunスクリプトで。

$ ./Run

うまく動けば成功です。

MacOS X + brewでImageMagickとRMagickをインストール

久々にセットアップしたらハマったのでメモ。

$ brew install -f imagemagick --disable-openmp
$ gem install rmagick
.
.
.
checking for Ruby version >= 1.8.5... yes
checking for /usr/local/bin/gcc-4.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
/usr/local/bin/Magick-config: line 41: pkg-config: command not found
/usr/local/bin/Magick-config: line 47: pkg-config: command not found
/usr/local/bin/Magick-config: line 50: pkg-config: command not found
/usr/local/bin/Magick-config: line 53: pkg-config: command not found
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

「pkg-config: command not found」が出たらpkg-configを入れる。

$ brew install pkg-config

もう一度RMagickを入れてみる。

$ gem install rmagick
.
.
.
ld: file not found: /usr/local/lib/libltdl.7.dylib for architecture x86_64
collect2: ld returned 1 exit status
make: *** [RMagick2.bundle] Error 1

「ld: file not found: /usr/local/lib/libltdl.7.dylib for architecture x86_64」とか表示されたらlibtoolをインストール。

$ brew install libtool

もう一度インストールしてみる

$ gem install rmagick
Building native extensions.  This could take a while...
Successfully installed rmagick-2.13.2
1 gem installed
Installing ri documentation for rmagick-2.13.2...
Installing RDoc documentation for rmagick-2.13.2...

うまくいきました。

私がRubyをインストールしたとき確認すること

rbenvやrvmでRubyをインストールしたときはirbを起動して次のチェックを行います。

↑キーを押してみる

readlineが正しく組み込まれていないとキーヒストリーが効きません。

require 'openssl'

opensslが正しく組み込まれていないとhttpsで通信する時にハマります。

require 'zlib'

zlibが正しく組み込まれていないと、いたるところでハマります。それはもう困ります。

require 'psych'

psychがrequireできないときはYAMLを扱うことができません。きっとRailsで困るでしょう。


うまく動作していないときはOSに必要なライブラリをインストールしてRubyの再コンパイルを行います。
他にも私はこんなチェックをしてるって人がいれば教えて下さい。

東京Ruby会議10に参加してきた

2013年1月13日〜14日に開催された東京Ruby会議10に参加してきました。
場所は千葉市美浜文化ホール。中国地方に住んでると、東京、埼玉、千葉、神奈川への出張はまとめて「東京に行ってくる」って言うしあんまり細かいことは気にしません!

以下は気になったセッションのメモです。

Rubyと過ごした半年間(井原正博氏)

クックパッド株式会社で新しいサービスを立ち上げた時のお話でした。初めてのRailsプロジェクトに挑むにあたりCode SchoolRailsCastsで学習をしたそうです。
一人でCIやPull Requestを送ったり「Rubyの世界で良き住人になりたい」という気持ちでコードを書いているそうです。

やさしいRails勉強会@東京のつづけ方(takkanm氏)

Rails勉強会@東京という勉強会を継続してきた経験を聞かせて頂きました。私も岡山Ruby/Ruby on Rails勉強会を運営していますが「続けること自体が目的になっている」と感じる時が時々あります。もっと緩い集まりがしたいのですが、車社会の田舎では都市部のようにビール片手に平日の夜モクモク会の開催は難しいです。他の地方都市の人達はどうやって勉強会を開くモチベーションを維持してるのかな?
takkanmさんはテーマはその日に決めて、そのテーマについてみんなで話し合っているそうです。準備する側も手間がかからないし、情報が欲しくてやってきている参加者も的確に欲しい情報が得られて非常に良い方法だと思いました。

プログラミング未経験なんて怖くない!(田垣亜季氏)

永和システムマネジメントに入社したプログラミング未経験者がどうやって日々を乗り越えていっているかというお話。「コピペできそうな箇所を探す」っていうのはあまり公に言うことはないけど、まぁ、みんなやってますよね。参考にしたソースをしっかり理解出来ればいいのではないでしょうか。他のプロジェクトのソースコードも読むようにしているのは素晴らしいと思いました。

The Everything Machine(中村 涼氏)

プログラミング初心者は何をやればいいのか分からない。そんな人は日々の雑多な仕事をRubyにさせてみてはどうかというお話。赤外線コントロールを利用して起床時間に部屋中の電気を付けたり、夜帰宅したら寒いので位置情報を取得してエアコンを操作したり、新作アニメのチェックをするためにしょぼいカレンダーからTV番組表を取得したり様々なRubyの使い方を提示していました。Webサービス以外にもちょっとしたことで使うことができるのがRubyのいいところですよね。

Distributed Build with Jenkins(西川茂伸氏)

札幌Ruby会議でもお会いした西川さんのJenkinsのお話。私も仕事ではJenkinsを使って分散テストを行なっています。Jenkinsは比較的簡単に分散処理ができるので便利ですね。Jobにラベルをつけることで環境ごとに分けてビルドできるのは参考になりました。

Padrino in Production(塩谷 啓氏)

Padrino(ぱっどりーの)について実際のサービスの事例をあげて説明してくださいました。「SinatraでDBを使うならRailsでいいじゃん」と個人的には思っていたのですがサブアプリを作ることができるのが便利そうですね。用途が合えば使ってみたいと思いました。

Ruby会議

†練馬で開催されたThe Ruby会議の闇が再び...†

軽量Rubyで実現する柔軟なルータ -SEILへの軽量Rubyの組み込み-(曽我部 崇氏)

IIJではルータも製作しているらしいです。そのルータの中にmRubyを入れてみたお話でした。
アプリケーションエンジニアは「組込は自分とは関係ない」と思いがちだけどapacheのmod_mrubyやiOSのアプリが開発できるMobiRubyは使ってみて欲しいとのことでした。

Fluentd: The ruby-based middleware across the world(田籠聡氏)

様々なログを集約、管理することができるFluentdというソフトウェアのお話でした。Pluginが豊富で保存と分析が同時に出来るのがメリットだそうです。nginxやrailsRDBMSから出てくる大量のログをうまく活用できず困ってたのでFluentdは段階的にでも導入してみようと思いました。

Sole Rubyist's Fight(yaotti)

Qiita Kobitoの開発者のお話。一人ぼっちだと技術情報が入ってこない、ディスカッションができない、コードレビューできない。ではやる気で解決できるかというとムラがあるのでやる気は信用できない。では、勝手に意識が高まっていく仕組みがあるとどうか。

Codetriage.com

http://www.codetriage.com
登録してるGithubプロジェクトのissueが飛んでくる。私も登録してみました。

Starseeker.so

http://starseeker.so
フォローしてるプログラマがつけたスターの情報が飛んでくる。

こういったサービスを使ってモチベーションを維持しているそうです。

ブログのススメ(前島真一氏)

おもしろwebサービス開発日記」のwillnetさんの発表でした。
日本語の技術系ブログが少ない。ニッチなキーワードをぐぐってもひっかからない。日本語でググりたい。
ひょっとしてBlogを更新するエネルギーがTwitterにそそがれているのではという興味深い内容。
Blogを書くと知識的にもう一歩を踏み出せるし、あやふやなところをはっきりさせる事ができる。また、わからなかったことをBlogに書くとアドバイスが貰え知り合いも増え、知識的&社会的にメリットが大きい。
モチベーションを保つには、書きかけの内容でもうpすることが大切。それが嫌であればメモ用blogを作るのも良いとのこと。
StatsWidgetというiPhoneアプリを使ってアクセス数をチェックする楽しみもあるとのことでした。

大雪で中止

2日目は関東では記録的な雪が降ったため14時過ぎで中断となってしまいました。残念でしたが参加者の安全を第一に考えた主催者の判断は正しいと思います。

次はThe Ruby会議でお会いしましょう!

Bluetoothスピーカーでプチノイズを無くす方法

自宅でmacbookを使うときはBluetoothスピーカーで音楽を聞いています。

Creative T12 Wireless デスクトップ ステレオワイヤレス スピーカーシステム Bluetooth SP-T12W

Creative T12 Wireless デスクトップ ステレオワイヤレス スピーカーシステム Bluetooth SP-T12W

概ね満足していたのですが時々聞こえるプチノイズが気になっていました。
このノイズはBluetoothAudioAgentの設定を変更すると軽減できるようです。

Pref Setterを入手

次のページでPref Setterというplistファイルを調整することができるソフトを入手しインストールします。
http://www.nightproductions.net/prefsetter.html

Bluetoothをoffにする

画面右上のメニューから「Bluetoothを切にする」を選択します。

Pref SetterでBluetoothAudioAgentを設定

検索窓にBluetoothAudioAgentと入力して設定を開きます。
Apple Bitpool Min とApple Initial Bitpool を40に設定します。

設定が完了したら⌘+qで設定を保存して終了しましょう。

再接続

Bluetoothスピーカーを再接続してみましょう。プチノイズが消えたらラッキーです。

acts_as_paranoid + ユニークインデックス

Railsで論理削除を行うときはacts_as_paranoidを使用するのが一般的です。
Model側でvalidates_uniqueness_of_without_deletedを使用するとユニーク制限をかけることができますが、DB側でユニーク制限をかけようとすると問題が発生します。

  # schema.rb
  create_table "customers", :force => true do |t|
    t.string   "code", :null => false
    t.datetime "deleted_at"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
  add_index "customers", ["code", "deleted_at"], :name => "customers_idx01", :unique => true

一見正しそうですがnullはユニーク制限の対象外となり次のようなレコードが入ってしまいます。

|code|deleted_at|
|001| NULL|
|001| NULL|

こういう時はindexにwhere条件を指定して直接DBに設定しましょう。

class AddIndexCodeToCustomers < ActiveRecord::Migration
  def self.up
    sql = 'create unique index customers_idx01 on customers (code) where deleted_at is null;'
    ActiveRecord::Base.connection.execute(sql)
  end

  def self.down
    remove_index :customers, :name => :customers_idx01
  end
end

procedureを使用してDBの操作を行うとRailsのModelを経由しないのでバリデーションが行われません。そういった場合はDB側でもチェックを行いたいですね。

CoffeeScriptオンリーでWebアプリを作ってみた

この記事は大都会岡山 Advent Calendar 2012向けに書いたものです。

昨日の@ore_publicさんの記事は読みましたか!?さすが僕らのリーダーやで。

さて私、RailsからRubyを始めたワリにはCSSとかJavaScriptとか苦手で、あまり関わらないように生きてきました。しかし、CoffeeScriptの登場で大量のfunctionや"{}"や";"を使わずともJavaScriptを書くことができる時代になりました。ステキ。せっかく時代がこちらへ歩み寄ってきてるのだから、なにか作ってみることにしました。

お題はLuckOfWiseさんが会社の飲み会用に作ってたAndroidアプリを真似てみることに。車輪の再発明はムダじゃない!モチベーションが大切です。

できた。
http://tomikuji.herokuapp.comで使うことができます。ソースはgithubに置いてます。
オータムジャンボ宝くじの番号を入力すると当たりの可能性が表示されます。会社で共同購入したくじをみんなで開封するときに使うと楽しいです。

Rails

普通にRails new tomikujiして空のcontrollerを作っただけです。今回は動作確認やCoffeeScriptコンパイルするのがRailsの役目です。
コントローラとビューはこんな感じ

├── controllers
│   ├── application_controller.rb
│   └── main_controller.rb
└── views
    ├── layouts
    │   └── application.html.erb
    └── main
          └── index.html.erb

CoffeeScript

前方一致で当たりの可能性を表示するロジックはちょっと工夫してみました。

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

$(document).ready ->
  if Modernizr.touch
    $(".key").bind 'touchend', (event) ->
      btnClick($(@).text())
  else
    $(".key").click ->
      btnClick($(@).text())

  setTimeout("scrollTo(0,1)",100)

# 当たり番号
hits =
  "1等" : "187077"
  "2等" : "179409"
  "3等" : "119658"
  "4等" : "....30"
  "5等" : ".....9"

# 表示処理
btnClick = (number) ->
  if number == "clear"
    $("#number").text("")
    $("#message").text("")
  else
    score = $("#number").text() + number
    if score.length <= 6
      $("#number").text(score)
      showResult(score)

# 結果表示
showResult = (score) ->
  message = ""
  for key, value of hits
    diff = value.slice(0, score.length)
    if score.match(new RegExp("^#{diff}"))
      message = message + key
  if message == ""
    $("#message").text("残念!")
  else
    $("#message").text("#{message}の可能性があります")

初めはスマートフォン用もclickイベントを使ってたんですが、処理速度がメチャクチャ遅かったんですよね。なので、touchイベントに変えました。clickイベントを使うかtouchイベントを使うかの判断はModernizrを使ってみました。

css

普通のブラウザ用とスマホ用の2つを用意して画面の幅によって切り替えてみました。レスポンシブデザインとかやってみたかったの。

<head>
  <title>富くじ</title>
  <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.9.0/build/base/base-min.css">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" />
  <%= stylesheet_link_tag    "application", :media => "screen and (min-width: 641px)" %>
  <%= stylesheet_link_tag    "application_small", :media => "screen and (max-width: 640px)" %>
  <%= javascript_include_tag "application" %>
  <%= javascript_include_tag "http://modernizr.com/downloads/modernizr.js" %>
  <%= csrf_meta_tags %>
</head>

通常は複数のscssファイルが1つに統合されてしまうのですがマニフェストファイルを編集して2つに分けています。

stylesheets/
├── application.css
├── application_small.css
├── main.css.scss
└── small.css.scss

app/assets/stylesheets/application.cssにmain.css.scssを読み込むように設定

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the top of the
 * compiled file, but it's generally better to create a new file per style scope.
 *
 *= require_self
 *= require main.css.scss
 */

app/assets/stylesheets/application_small.cssにsmall.css.scssを読み込むように設定

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the top of the
 * compiled file, but it's generally better to create a new file per style scope.
 *
 *= require_self
 *= require small.css.scss
 */

あとはconfig/environments/production.rbに明示的にプリコンパイルするcssファイルを記述します。

  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
  config.assets.precompile += %w( application_small.css )

こんな感じでCoffeeScriptを使ってWebアプリを作ることができました。ちょっとしたアプリならクライアントだけで実現できるのがいいですね。
さて、明日はハカセのアイコンでお馴染みのにゃーさんです。お楽しみに!