スポンサーサイト

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

MacOSでRuby用開発環境整備

MACとRuby初心者が、MacOS上に主にEmacsを中心としたRuby用開発環境を整備した時のメモ(記憶が不確かで不正確な記述があるのでご容赦を!)。Windows上でMinGWとEmacs環境でもかなりいろんな問題に遭遇したが、Macでも実は結構いろんな問題があるみたい(Windows上での経験も多少は役に立っているみたいだが)。

【環境】
●MacOS:Yosemite(10.10.3)
●Emacs:24.3.1
●Ruby:2.0.0

【参考にさせて頂いたURL】
ruby-modeで{}を入力しようとするとSymbol’s value as variable is void: last-command-charと怒られるのを解決する
Macでバックスラッシュを入力する方法について
Emacsの「Dired」で拡張子を積極活用
GNUPLOTのインストールと設定

【設定メモランダム】
●{}の入力ができないので、ruby−mode.elの更新
{}を入力する際に「Symbol’s value as variable is void: last-command-char」とエラーが出て{}を入力することができない。対応版のruby−mode.elを下記のURLよりダウンロードして更新。

http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-mode.el?revision=40401&view=markup

無事に入力できるようになった。

●Macでバックスラッシュを入力
.emacsまたはinit.elに下記を追加

;; \の代わりにバックスラッシュを入力する
(define-key global-map [?¥] [?\\])


●Diredからアプリを起動する
.emacsまたはinit.elに下記を追加。M−!でアプリを起動可能。

;; diredで該当ファイルを選択して、'!'を実行
(setq dired-load-hook '(lambda () (load "dired-x")))
(setq dired-guess-shell-alist-user
'(("\\.\\(ppt\\|PPT\\|pptx\\|PPTX\\)\\'" "open -a 'Microsoft PowerPoint'")
("\\.\\(xls\\|XLS\\|xlsx\\|XLSX\\|xlsm\\|XLSM\\)\\'" "open -a 'Microsoft Excel'")
("\\.\\(jpg\\|JPG\\|png\\|PNG\\|pdf\\|PDF\\)\\'" "qlmanage -p")
("\\.\\(html\\|HTML\\|hml\\|HML\\)\\'" "open -a Safari")
("\\.\\(m4a\\|mp3\\|wav\\)\\'" "afplay -q 1 * &")))


●Rubyパッケージの追加インストール
・YARDでRubyドキュメント自動生成
DoxygenのRuby版はまだ正式にリリースされていないみたいなので、実績のあるYARDをインストールしてドキュメントを自動生成。
Rubyによる単体テストとカバレッジ計測:simplecov、rspec
;sudo gem install yard
sudo gem install simplecov #以前インストール済み
sudo gem install rspec #以前インストール済み


●rubydbによるソースコードデバッグ
Emacs上でrubydbを使ってソースコードデバッグしようとする、下記の問題が発生。

M−x rubydb: ruby hello.rb


Ruby debugger opens on kernel_require.rb not file specified

何もしないと、kernel_require.rbファイルにブレークが設定されてしまうので、下記のコマンドでデバッグ対象のソースコードに強制的にブレークを設定

b hello.rb:1


あとは、通常のデバッグ方法でデバッグ可能。

●gnuplot
Pythonで利用していたMatplotlib相当の環境として、Gnuplotをインストール(こちらはこちらで実績がかなりあるそう。GnuplotはPythonからも利用可能みたいなので、そのうち確認してみようとは思っているが、、)。

sudo port install gnuplot
sudo gem instal gnuplot


グラフのラベルなどに日本語を使いたいので、日本語フォントに以下のようなシンボリックリンスを作成する(gunuplotは日本語のファイル名は扱えないみたい)。

sudo ln -s /Library/Fonts/"ヒラギノ明朝 Pro W3.otf" /Library/Fonts/HiraMinPro-W3.otf


#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require "rubygems"
require "gnuplot"

Gnuplot.open do |gp|
Gnuplot::Plot.new( gp ) do |plot|
# plot.title 'test'
# plot.ylabel 'Y座標'
# plot.xlabel 'xlabel'
=begin # 複数行コメント(非推奨)
フォント名には日本語は使えないので/Library/Fontsに
シンボリックリンクを作成して利用
$ sudo ln -s /Library/Fonts/"ヒラギノ明朝 Pro W3.otf" /Library/Fonts/HiraMinPro-W3.otf
=end
plot.set 'title "日本語ラベル付きグラフ" font "HiraMinPro-W3,14"'
plot.set 'xlabel "X座標" font "HiraMinPro-W3,14"'
plot.set 'ylabel "Y座標" font "HiraMinPro-W3,14"'

x = (-100..100).collect {|v| v.to_f}
y = (-100..100).collect {|v| v.to_f ** 2}

plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
ds.with = "lines"
ds.notitle
end
end
end


Gnuplotでの日本語ラベル例
Gnuplot.png

RubyのO/RマッパActiveRecord

PythonのO/RマッパのSQLAlchemyでの試作「PythonとSQLAlchemy」同様に、
RubyのActiveRecord(Railsからではなく単体で利用)とSQLiteでDBをアクセス。

Railsの基本方針の「convention over configuration」(設定より規約:日本語訳は?。コーディング規約による設定的なイメージが強いのだが、、、)に従って、主キーは自分で記述する必要がなかったり、テーブル名は複数形でレコードは単数形をつかったりで、慣れれば便利なんだろうけど、最初は結構、戸惑う独特のルールがあるみたい。

ちなみに、Familyの複数形はFamilysではなく、Familiesでないと正しく動作しないので、きちんと内部では英語の複数形を判別しているみたい。難しい単語を使うと日本人には正しく動作しない場面がでてきそうな予感もするが、英語にあまり自信のない自分だけに当てはまる杞憂なのかもしれない(;^^)

【環境】
●Ruby:2.0.0
●ActiveRecord:4.2.1
●SQLite3:1.3.7(今回明示的にはインストールはしていない。なぜか入っていた?)

【参考にさせて頂いたURL】
ActiveRecord + SQLite3 を使う
Simple Ruby ActiveRecord Example
Active Record Associations
 関連について詳細な記載があり。


#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
STDOUT.sync = true

require 'active_record'

ActiveRecord::Base.logger = Logger.new(STDERR)

ActiveRecord::Base.establish_connection(
adapter: "sqlite3",
database: ":memory:"
)

# スキーマの設定
class InitialSchema < ActiveRecord::Migration
def self.up
create_table :families do |table|
table.string :name
table.string :address
end

create_table :members do |table|
table.integer :family_id
table.string :first_name
table.integer :age
end
end
def self.down
drop_table :families
drop_table :members
end
end

class Family < ActiveRecord::Base
has_many :members
end

class Member < ActiveRecord::Base
has_one :family # 通常の関連?
#belongs_to :family # 集約相当?
end

# マイグレーション
InitialSchema.migrate(:up)

family = Family.create(:name => '佐藤', :address => '神奈川')

family.members.create(:first_name => '太郎', :age => 43)
family.members.create(:first_name => '花子', :age => 40)
family.members.create(:first_name => '一郎', :age => 18)
family.members.create(:first_name => '次郎', :age => 16)

family = Family.create(:name => '田中', :address => '東京')
family.members.create(:first_name => '智', :age => 25)
family.members.create(:first_name => '恵子', :age => 22)


puts Family.find(1).members.length
puts Family.find(2).members.length

puts Family.find_by_name('佐藤').address
puts Member.find_by_first_name('一郎').age


実行結果

== InitialSchema: migrating ==================================================
-- create_table(:families)
D, [2015-04-18T21:53:02.446507 #4171] DEBUG -- : (0.5ms) CREATE TABLE "families" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "address" varchar)
-> 0.0015s
-- create_table(:members)
D, [2015-04-18T21:53:02.447346 #4171] DEBUG -- : (0.2ms) CREATE TABLE "members" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "family_id" integer, "first_name" varchar, "age" integer)
-> 0.0007s
== InitialSchema: migrated (0.0024s) =========================================

D, [2015-04-18T21:53:02.456525 #4171] DEBUG -- : (0.1ms) begin transaction
D, [2015-04-18T21:53:02.461487 #4171] DEBUG -- : SQL (0.2ms) INSERT INTO "families" ("name", "address") VALUES (?, ?) [["name", "\u4F50\u85E4"], ["address", "\u795E\u5948\u5DDD"]]
D, [2015-04-18T21:53:02.461922 #4171] DEBUG -- : (0.0ms) commit transaction
D, [2015-04-18T21:53:02.471976 #4171] DEBUG -- : (0.0ms) begin transaction
D, [2015-04-18T21:53:02.513544 #4171] DEBUG -- : SQL (0.2ms) INSERT INTO "members" ("first_name", "age", "family_id") VALUES (?, ?, ?) [["first_name", "\u592A\u90CE"], ["age", 43], ["family_id", 1]]
D, [2015-04-18T21:53:02.514617 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.514920 #4171] DEBUG -- : (0.1ms) begin transaction
D, [2015-04-18T21:53:02.516111 #4171] DEBUG -- : SQL (0.1ms) INSERT INTO "members" ("first_name", "age", "family_id") VALUES (?, ?, ?) [["first_name", "\u82B1\u5B50"], ["age", 40], ["family_id", 1]]
D, [2015-04-18T21:53:02.516441 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.516603 #4171] DEBUG -- : (0.0ms) begin transaction
D, [2015-04-18T21:53:02.517343 #4171] DEBUG -- : SQL (0.0ms) INSERT INTO "members" ("first_name", "age", "family_id") VALUES (?, ?, ?) [["first_name", "\u4E00\u90CE"], ["age", 18], ["family_id", 1]]
D, [2015-04-18T21:53:02.574280 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.574618 #4171] DEBUG -- : (0.1ms) begin transaction
D, [2015-04-18T21:53:02.576011 #4171] DEBUG -- : SQL (0.1ms) INSERT INTO "members" ("first_name", "age", "family_id") VALUES (?, ?, ?) [["first_name", "\u6B21\u90CE"], ["age", 16], ["family_id", 1]]
D, [2015-04-18T21:53:02.576489 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.577120 #4171] DEBUG -- : (0.1ms) begin transaction
D, [2015-04-18T21:53:02.578011 #4171] DEBUG -- : SQL (0.1ms) INSERT INTO "families" ("name", "address") VALUES (?, ?) [["name", "\u7530\u4E2D"], ["address", "\u6771\u4EAC"]]
D, [2015-04-18T21:53:02.578450 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.579189 #4171] DEBUG -- : (0.1ms) begin transaction
D, [2015-04-18T21:53:02.658750 #4171] DEBUG -- : SQL (0.1ms) INSERT INTO "members" ("first_name", "age", "family_id") VALUES (?, ?, ?) [["first_name", "\u667A"], ["age", 25], ["family_id", 2]]
D, [2015-04-18T21:53:02.659323 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.659616 #4171] DEBUG -- : (0.1ms) begin transaction
D, [2015-04-18T21:53:02.660798 #4171] DEBUG -- : SQL (0.1ms) INSERT INTO "members" ("first_name", "age", "family_id") VALUES (?, ?, ?) [["first_name", "\u6075\u5B50"], ["age", 22], ["family_id", 2]]
D, [2015-04-18T21:53:02.661247 #4171] DEBUG -- : (0.1ms) commit transaction
D, [2015-04-18T21:53:02.669642 #4171] DEBUG -- : Family Load (0.2ms) SELECT "families".* FROM "families" WHERE "families"."id" = ? LIMIT 1 [["id", 1]]
D, [2015-04-18T21:53:02.671256 #4171] DEBUG -- : Member Load (0.2ms) SELECT "members".* FROM "members" WHERE "members"."family_id" = ? [["family_id", 1]]
4
D, [2015-04-18T21:53:02.740485 #4171] DEBUG -- : Family Load (0.1ms) SELECT "families".* FROM "families" WHERE "families"."id" = ? LIMIT 1 [["id", 2]]
D, [2015-04-18T21:53:02.741415 #4171] DEBUG -- : Member Load (0.1ms) SELECT "members".* FROM "members" WHERE "members"."family_id" = ? [["family_id", 2]]
2
D, [2015-04-18T21:53:02.743134 #4171] DEBUG -- : Family Load (0.2ms) SELECT "families".* FROM "families" WHERE "families"."name" = ? LIMIT 1 [["name", "\u4F50\u85E4"]]
神奈川
D, [2015-04-18T21:53:02.744618 #4171] DEBUG -- : Member Load (0.2ms) SELECT "members".* FROM "members" WHERE "members"."first_name" = ? LIMIT 1 [["first_name", "\u4E00\u90CE"]]
18

Rubyでコマンド引数処理

Ruby初心者が、以前Pythonで作成した Pythonでコマンド引数処理 相当のことをRubyで試作してみた。

【環境】
MacOS:Yosemite: 10.10.3
Ruby:2.0.0

【参考にさせて頂いたURL】
Rubyでコマンドライン引数を解析する
RubyのOptionParserの底力を知る

サンプルプログラム:log.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
STDOUT.sync = true

require 'optparse'
require 'logger'

# コマンドライン引数を解析してハッシュにして返す
option = {}
# ディフォールト値の設定
option[:file] = 'sample.log'
option[:level] = 2 # Logger:WARN

OptionParser.new do |opt|
Version = "0.0.1"
# オプション
opt.on('-f', '--file [LOG_FILE]', 'ログファイル名') {|v| option[:file] = v}
# 選択
opt.on('-l', '--level [LEVEL]', '0|1|2|3|4', 'ログレベル 0:DEBUG|1:INFO|2:WARN|3:ERROR|4:FATAL') {|v| option[:level] = v.to_i}
opt.parse!(ARGV)
end

log_file = option[:file]
log_level = option[:level]

## ファイルに出力する
log = Logger.new(log_file)

log.debug("This is debug message")
log.info("This is information message")
log.warn("This is warning message")

console = Logger.new(STDOUT)
console.level = log_level

console.debug("DEBUG:デバッグ用")
console.info("INFO:情報表示")
console.warn("WARN:やべかも")
console.error("ERROR:やべぇ!")
console.fatal("FATAL:超やべえ")


実行結果

$ $ ruby log.rb -v
log 0.0.1
$ ruby log.rb --help
Usage: log [options]
-f, --file [LOG_FILE] ログファイル名
-l, --level [LEVEL] 0|1|2|3|4
ログレベル 0:DEBUG|1:INFO|2:WARN|3:ERROR|4:FATAL
$ ruby log.rb -l 1
I, [2015-04-18T15:31:53.679222 #3657] INFO -- : INFO:情報表示
W, [2015-04-18T15:31:53.679274 #3657] WARN -- : WARN:やべかも
E, [2015-04-18T15:31:53.679319 #3657] ERROR -- : ERROR:やべぇ!
F, [2015-04-18T15:31:53.679366 #3657] FATAL -- : FATAL:超やべえ

初めてのMac:環境整備

ずっと、Windowsユーザだったが、年末にノートブックとしてMacBook Airを新に購入。以下、ジョブズの熱い思いを感じながら無事に開梱式を済ました後、なんとか一通りきるようにした初期インストールメモ。

【環境】
●MacBook Air: Intel Core i5、13インチ, SSD 256GB
●OS:Yosemite: OSX10.10
・Yosemiteは結構評判悪いので、こわごわ最新のOSXにバージョンアップ。とりあえず、何事もなく動作
●参考書
・「Mac大全 (100%ムックシリーズ)」 ムック – 2014/10/28
 何分Mac初めてなので、基礎中の基礎から簡単に説明されている本書を一通り読んで、環境を整備

【システム環境設定】
●ファンクションキー
・日本語入力の時にいちいちFnキーを押さなくても良いように、以下をチェック
「システム環境設定」→「キーボード」→「F1、F2などのすべてのキーを標準のファンクションとして使用」
●CapsとControlキーの変更
・Emacsを標準エディタとして使うため、「システム環境設定」→「キーボード」→「修飾キー」でCapsとControlキーを交換
●TimeMachine:標準のバックアップ環境
●キーチェーンアクセス
・パスワード管理に標準アプリを利用。秘密メモで独自のパスワードも管理できてとても便利。ただ、Windowsでは当然のごとくつかえないので、仕方なく従来のパスワード付きのExcelファイルも共用。「1Password」という定番クラウドソフトもあるそうだが、しばらくは上記で様子見。

【基本操作方法:Tips】
●右マウスメニューの表示方法:2本指でタップ
●画面全体のスクルール:3本指でスワイプ
●Spotlight:標準のアプリランチャ
・標準ではEmacsのControl−Spaceとバッティングするので、「システム環境設定」→「キーボード」→「ショートカット」→「Spotlight」で起動用のショートカットを変更

【定番ソフトのインストール】
XtraFinder
 Finderがすごく使いやすくなった(Windowsでは以前より QTTabbar をExploreにインストールして使用中)。隠しファイルの表示をさせることも可能。
Chrome
 MacにChromeをインストールしてGoogleアカウントにログインすると、いろんなパスワードがGoogleに記憶されていることがわかり、セキュリティ的に再検討する必要性を改めて認識
AppCleaner:アプリのアンインストールを実施してくれる無料アプリ
 アプリの実行ファイル以外の関連ファイル(ライブラリのApplication Support, Preferencesあたりの関連ファイルは自分で削除する必要あり)を検索して、削除することが可能
●Emacs-24.3.1
Emacs24のインストールと新機能」に紹介されていた MacEmacs JP Emacs24-with-inline-patch バイナリ をインストール。設定は、Linux版のinit.elを元に若干修正。
●その他
・VirtualBox:Macでの無料の仮想環境:Linuxをインストール
・Xcode:開発環境
・SourceTree:Gitフロントエンド
・FreeMind:マインドマップ
・Astah Community: UML設計ツール
・Skype
・Line
・CloverDiary:Mac定番の日記ソフト
・LibreOffice:MS−Officeとの互換性ソフト
 操作性、互換性などの問題で予想以上に難航。iWorksの互換性も踏まえて、MS−Office買うかどうか思案中。


Mac大全 (100%ムックシリーズ)Mac大全 (100%ムックシリーズ)
(2014/10/28)
不明

商品詳細を見る

Windows 8.1でブラウザが繋がらない

今年の夏頃から、Windows 8.1 のマシンで急にThunderbirdでメールが
受信できたり、できなかったりして、プロバイダに相談しても拉致上がらず、
しかたなくWindows Liveメールにメーラを変えてみても、症状はあまり改善されず、
受信できたり、できなかったりの状態が続いていた。

そうこうするうちに、Chromeが不安定になって、挙句の果ては、どのWebにも
アクセスできない症状が発生。Firefoxに変えても、こちらも不安定で、
何度か使っているうちに、最新のChromeもFirefoxもどのWebにもアクセスできない
状態が発生。唯一Internet Explore(IE)だけがまともに動作していたので
しばらく、IEを使っていた(Webにアクセスできないと仕事にもならないので、仕事が
別の理由で進まないことも相まって、結構、ピリピリしていた)。

一番怪しそうなセキュリティソフトのノートンを一時的に停止しても改善されず、
IPV6をオフにしてみても改善されず、半ば諦めムードだったが、偶然、下記のURLで

Windows 8.1 PCでWebブラウザでインターネット接続できない!

同じような現象が報告されていて、ノートンのInternet Securityを再インストール
されたら、もとに戻ったという記事を発見。自分も早々試したところ、今のところ、
全てが元に戻って、メーラもChromeも快適に動作中。

上記情報を公開して頂いた方に感謝するとともに、復活したPCに嬉しさ半分で、
PCの立ち上げを何度も実施したり、ThunderbirdやChrome、Firefoxを
再インストールしたり、調査に費やして無駄にしてしまった時間に少しばかり
腹立たしさを覚えしまった。

自分のネットに対する知識不足は棚に上げていますが、、、(;^^)。
プロフィール

Author:Zaike Yuki
オブジェクト指向、C++/Java、Python、Eclipse、Android、等に興味を持つソフトウェアエンジニア

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

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