ホーム ブログ ページ 64

ページ内リンクの設定方法 ruby on rails

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちはカツオです。

今日はrailsでのページ内リンクの記述方法を紹介します。
ページ内リンクとはアンカーをおいて
それを目印として、ページ内の文字や、場所にリンクさせ、ジャンプすることができます。


■link_toでの記述方法

<%= link_to “文字”,:controller=>”hoge”,:action=>”foo”,:anchor => ‘mejirushi’ %>




これでページ内のリンクであらかじめ
<a name=”mejirushi”>文字</a>
などと設定しておけばその場所にジャンプすることができます。

link_to のオプションとしてstyleを指定する。

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうも、バッチです。

昨日に引き続きlink_toで使うオプションを紹介します。

本日はstyleです。

styleといえばスタイルシートのことですが、

link_toに指定することで、 直接読み込むことができます。

書き方は、

<%= link_to “リンク”, {:controller => ‘hoge’, :action => ‘hoge’}, :style=>”color:red;” %> 

などという感じです。

link_toの外で<span>などで色指定などを適用しようとしても、

出力されるHTML上適用されません。 

ですが、この方法でやれば直接リンク色やフォントサイズなどを変えることが可能です。

スタイルシートを外部指定できないモバイルサイトなどには役に立つと思います。

アンカーの使用方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうも、新人のバッチです。

本日は、Railsのlink_toでアンカーを使う方法を説明します。

アンカーとはおもにページ内リンクで使われる#のことですね。

普通にlink_to内に書いた場合は、#が変換されたりなどし

うまく使えませんが、 :anchor => ‘表示場所’  で画面

遷移後にページ内リンクなどが行えるようになります。

<%= link_to “ページ移動”,{ :controller => “hoge”, :action => “hoge”, :anchor => ‘目的地’} %>

というような書き方で使用することができます。…

Rubyの継承について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうもメガネです。10回目です。

今回もRubyのオブジェクト指向について説明します。 前回はクラスの定義の仕方、メソッドの定義の仕方、インスタンスの作成などを説明しました。 今回は継承について説明します。継承とは元のクラスの変更を行わずに新しいメソッドや元のメソッドをカスタマイズできる便利な機能です。
説明では親のクラスをスーパークラス、子のクラスをサブクラスとします。
class Parent
  def initialize(myname)
   @name=myname
  end
  def helloworld
   print “Hello, World I am “,@name,”\n”
  end
end

Class Child < Parent
end

こうやって定義することによって

parent = Parent.new(“hoge”)
parent.helloworld   #Hello, World I am hogeが出力
child = Child.new(“hoge”)
child.helloworld      #Hello, World I am hogeが出力

サブクラスはスーパークラスのメソッドを定義しなくても使えます。
次にオーバーライドしてみます。オーバーライドとはメソッドを変更することです。
Class Child < Parent
  def helloworld
   print “I am”,@name,”\n”
  end    
end

parent = Parent.new(“hoge”)
parent.helloworld
child = Child.new(“hoge”)
child.helloworld

スーパクラスにあるメソッドをサブクラスで定義すると変更できます。こうすることによってスーパークラスのメソッドに手を加えずに変更できるので便利です。

parent = Parent.new(“hoge”)
parent.helloworld   #Hello, World I am hogeが出力
child = Child.new(“hoge”)
child.helloworld      #I am hogeが出力

今日はここまで

Ruby on RailsとFlash(ActionScript)のXML連携

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

二回目の記事投稿となります。新人エンジニアの はる です。

Ruby on RailsとFlashの連携方法はいくつかありますが、
今回は、Ruby on RailsとFlash(ActionScript)のXML連携について書いてみたいと思います。

Rails側とFlash側の作業は、

[Rails]REXMLを使用してxmlを生成する。
[Flash]XML.loadメソッドを使用して、xmlを読み込む。

となります。

[Rails]

XMLを生成するためにREXMLを使用します。

REXMLについては脆弱性が発表がされておりますので、本サイト内の記事

REXMLの脆弱性」を参照し、脆弱性対策を行ってから使用して下さい。

まず、Rails側でXMLを生成します。

#Rails XML生成メソッド

def get_xml
  xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><data />\n"
  doc = REXML::Document.new( xmlString )
  #items
  items = REXML::Element.new("items", doc.root)
  i = 0
  10.times do
    item = REXML::Element.new("item", items)
    title = REXML::Element.new("title", item)
    title.text = "タイトル#{i}"
    value = REXML::Element.new("value", item)
    value.text = "hoge#{i}"
    i += 1
  end
  send_data doc.to_s, :type => 'text/xml', :filename => 'doruby.xml'
end

#doruby.xml

<?xml version='1.0' encoding='UTF-8'?>
<data>
<items>
  <item>
    <title>タイトル0</title>
    <value>hoge0</value>
  </item>
  <item>
    <title>タイトル1</title>
    <value>hoge1</value>
  </item>
  <item>
    <title>タイトル2</title>
    <value>hoge2</value>
  </item>

  ・・・(中略)・・・

  <item>
    <title>タイトル9</title>
    <value>hoge9</value>
  </item>
</items>
</data>

Rails側でのXML生成の作業は以上です。

次にFlash側でXMLを読み込みます。

[Flash(ActionScript)]

loadData(http://localhost:3000/"controller名"/get_xml);
//loadData("doruby.xml");

function loadData(filename) {
  xmlData = new XML();
  xmlData.ignoreWhite = true;
  xmlData.onLoad = loadingDone;
  xmlData.load(filename);
}

function loadingDone() {
  getData(xmlData);
  _root.nextFrame();
}

function getData(node) {
  items = node.firstChild.childNodes[0];
  _root._items = new Array();

  for (var i = 0; i<items.childNodes.length; i++) {
    _root._items[i] = new Object();
    for (var j = 0; j<items.childNodes[i].childNodes.length; j++) {
      node = items.childNodes[i].childNodes[j];
      if (node.nodeName == "title") {
        _root._items[i].title = node.firstChild;
      } else if (node.nodeName == "value") {
        _root._items[i].value = node.firstChild;
      }
    }
  }
}

_root._items[i].titleにアイテムのタイトル、_root._items[i].valueにアイテムの値を格納しています。

きちんと読み込まれているかどうか確認するには

下記のtraceアクション等でFlashの出力ウィンドウ上から確認できます。

for (var i = 0; i<_root._items.length; i++) {
  trace("_root._items["+i+"].title = "+_root._items[i].title);
  trace("_root._items["+i+"].value = "+_root._items[i].value);
}

以上、Ruby on RailsとFlash(ActionAcript)のXML連携について、ご紹介させていただきました。

次回は、Flash(ActionAcript)の”LoadVars.sendAndLoadメソッド”を使用した

Ruby on RailsとFlashの連携について書きたいと思います。

Linux便利コマンド ~履歴検索~

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、oneafter999です。
今回は、Linuxのちょっと便利なコマンドをご紹介します。

踏み台サーバを介してローカルセグメントに入る時など、IPアドレス入りのSSHをいちいち入力するのは非常に面倒なものです。
また直近の履歴は[↑]で表示されますが、それでもなかなか目当てのコマンドはみつからない・・・。
そんな時便利なのが、Ctrl + Rコマンドです。
このコマンドは入力後、目当てのコマンドの一部を入力することで、過去コマンドの中から候補を表示してくれるコマンドです。

使用例

test@TEST1:~$ Ctrl + R
(reverse-i-search)`’:
※↑で「ss」と入力
(reverse-i-search)`ss’: ssh test@192.168.3.100
表示された候補が違う場合、Ctrl + Rで次の候補を表示することができます。
また、やっぱり履歴検索をやめたい場合は、Ctrl + Cでキャンセルが可能です。

便利なのはもちろんのこと、ちょっとかっこいい点も見逃せません!

文字列の一部を置換したい

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

初めましてこんばんわ、トマトです。

まだまだひよっこな私ですが、日々Ruby on Railsに悪戦苦闘しております。

さて、今回は何かとよく使われる、

文字列の一部を置換するメソッドをご紹介したいと思います。

○gsubメソッド

このメソッドは引数を2つとります。

第1引数では正規表現を使って置換したい部分のパターンを指定し、

第2引数では第1引数のパターンでマッチした部分と入れ替える文字列を指定します。

 文字列.gsub(/マッチさせたいパターン/,'置換したい文字列')

。。。とまぁ、言葉で表すとわかりづらいので

実際に使ってみましょう。

str = "red$blue$$green$$$yellow$$$$pink"
p str.gsub(/\$+/,' ')

# 出力結果
# "red blue green yellow pink"

このように置換することができるんですね。

実用的な使い方の例としては、場合によって”http”と”https”とで出し分ける際に

img = "http://tomato.com/product/img/tomato.jpg"
my_img = ""
if flg==1
   my_img = img.gsub(/\^http/,'https')
else
   my_img = img
end

上のように記述をすれば、簡単です。

○subメソッドとの違い

gsubメソッドとすごくよく似ているメソッドがsubメソッドです。

名前がそっくりならば、機能もやっぱりそっくりです。

ためしに使い比べてみましょう。

img = "http://tomato.com/product/img/tomato.jpg"

p img.gsub(/tomato/,'banana')
# gsub出力結果
# "http://banana.com/product/img/banana.jpg"

p img.sub(/tomato/,'banana')
# sub出力結果
# "http://banana.com/product/img/tomato.jpg"

よく見てみるとgsubメソッドでは、”tomato” にマッチした部分

すべてを置換しているのに対して、

subメソッドでは最初の”tomato”にマッチした部分のみ

置換しているのがわかります。

要するに

○gsubメソッド=すべて置換する

○subメソッド=先頭だけ置換する

ということなのです。

○gsub!、sub!メソッド

gsubとsubメソッドに”!”のついたこのメソッド。

これもちょっと使ってみましょう。

img = "http://tomato.com/product/img/tomato.jpg"
img.gsub(/tomato/,'banana')
p img
# gsub出力結果
# "http://tomato.com/product/img/tomato.jpg"

img.gsub!(/tomato/,'banana')
p img
# gsub!出力結果
# "http://banana.com/product/img/banana.jpg"

subメソッドやgsubメソッドでは置換後の文字列を

その都度生成して返しているのに対して、

sub!メソッドやgsub!メソッドを使うと文字列自体を変更してしまうので、

使用する際には注意が必要です。

やけに長くなりましたが、以上文字列置換メソッドの紹介でした。

また次回お会いしましょう。

file_fieldで画像をアップ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

http://d.hatena.ne.jp/zenpou/:titileにて公開した記事を公開します。

railsで、Resourceというmodelに画像を保存する時、

new_fileというメソッドを使ってデータを保存する様につくったんですが、

そういうとき、file_field :record, :resourceのデータを受け取っても

そのまま代入できないので、その問題に対する対処です。

  alias :resource_old= :resource=
  define_method("resource=") do | value |
    if value.class == ActionController::UploadedTempfile
      resource = Resource.new_file(value, value.original_filename)
      self.send :resource_old= , resource
    elsif value.class == Resource
      self.send :resource_old= , value
    else
      nil
    end
  end

model側からbelongs_toでresourceに連携した後に定義される代入を

オーバーライドしてます。

こうするとパラメータの中身をそのまま出せるので非常に楽です。

背景透過に対応するシム技法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

初めまして。新人エンジニアの はる です。

社内では主にRuby on Rails と Flash をいじっています。

今回は、「透過に対応するシム技法」についてご紹介します。

Q:シム技法とは?

例えば、FlashをWEBページの上に重ねて表示(WEBページの1つ上のレイヤーに
Flashを表示するイメージ)する場合、IE6ではセレクトボックスが最前面に表示
されてしまいます。


HTMLのレイヤー構造を指定する方法としては、通常、CSSのz-indexプロパティを
使用しますが、IE6のSELECT要素にはz-indexを指定することが出来ません。
これはIE6において、SELECT要素がウィンドウコントロールとして扱われている
ために起こる現象です。


対策としては、iframe要素をSELECT要素の上に重ね、さらにiframeの上にFlashを
重ねることで、SELECT要素が最前面に表示されなくなります。
これを「シム技法」といいます。

さて、ここからが本題です。

シム技法を用いて背景が透明のFlashを表示したい場合を考えます。

iframeにはallowtransparency属性があり、

allowtransparency="true" ・・・背景を透過にする
allowtransparency="false" ・・・背景を透過にしない(初期値)

と定義されています。

しかし、背景を透過させるためにtrueを指定した場合、iframeの背景が透過されても

シムとして使用することができません。また、flaseを指定した場合は、シムとして

使用することはできるものの透過されません。

つまり、このままでは背景が透明のFlashをシム技法で表示することができない

ということになります。

これを解決するためには、iframeに少し珍しいstyle指定を行います。

<iframe frameborder="0" scrolling="no" style="filter:alpha(opacity=1);">

CSSのfilterプロパティはIE(Win)の独自プロパティであり、主に文字や画像を装飾

するために用いられます。上記のstyle指定では、不透明度を1%に指定することで

“ほぼ”透明のシムとして使用することができます。

filterプロパティは、IE独自の機能ですが、そもそもシム技法を使用しなければならない

ブラウザもIE6以下のみですので、IE6以外では表示しないよう切り分けることをお勧め

します。

また、FlashとFlashが重なるページの場合、Flashを表示しているobjectタグに、

以下の指定を行う必要があります。

<param name="wmode" value="transparent" />
<embed ...wmode="transparent" ... />

上記の指定をしていない場合、FlashがHTMLのレイヤー構造を理解することが

できませんので、ご注意下さい。

以上、長文になりましたが「透過に対応するシム技法」についてご紹介させていただきました。

次回は「Ruby on Rails と Flash の連携方法」について触れてみたいと思います。

Rubyのクラス

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうもメガネです。9回目です。
今回はRubyのクラスについて説明します。
Rubyはオブジェクト指向言語なのでオブジェクトを使えるようになると便利です。
Class名は大文字で始めなければいけません。
Class Test
end
次はメソッドの定義の仕方です
Class Test
  def helloworld
   print “Hello, World\n”
  end
end
次にインスタンスの作成です。
test = Test.new
p test.helloworld
Hello, World #出力される
次にコンストラクタについて説明します。
コンストラクタは便利なのでぜひ使ってみてください。
class Test
  def initialize(myname)
   @name=myname
  end
  def helloworld
   print “Hello, World I am”,@name,”\n”
  end
end
インスタンスの作成
test = Test.new(“hoge”)
p test.helloworld
Hello, World I am hoge #出力される
コンストラクタを使わない場合
class Test
  def name(myname)
   @name=myname
  end
  def helloworld
   print “Hello, World I am”,@name,”\n”
  end
end
インスタンスの作成
test = Test.new
test.name(“hoge”)
p test.helloworld
Hello, World I am hoge #出力される
見て分かるようにコンストラクタを使うとインスタンスの作成と処理を一度に行えます。
今日はここまで

CSSハック〜モダンブラウザ(IE、Safari)編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。maiです。

web標準化の波のおかげで、時代はcssレイアウト。

でもcssってブラウザごとにズレたりするのが困りものですよね。

そんなときにブラウザを限定してcssを適用するハックをご紹介します。

ちなみに、Firefoxが一番仕様に近い動作をするので、

cssを書くときはまずFirefoxで確認しながら書きます。

そのためFirefox向けのハックは基本やりません。

 Safari向け

html*セレクタ { /* for safari */ プロパティ:値; }

Safari 2.x系

html:first-child セレクタ { /* for safari2.0 */ プロパティ:値; }

 IE向け

IE6

* html セレクタ { /* for ie6 */ プロパティ:値; }

IE7

*:first-child+html セレクタ { /* for ie7 */ プロパティ:値; }

記述する順番は以下の通り。

1.Firefoxに適用するデフォルトの指定

2.Safariに適用する指定→Safari2に適用する指定

3.IEに適用する指定(順番はどっちでも)

IE系はどっちも同じ指定をすることが多いですが、

* html セレクタ, *:first-child+html セレクタ { /* for ie */ プロパティ:値; }

という書き方はできないので注意です。

apacheの構文チェックをしよう。

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、タジです。

今回はapacheの構文チェックについてです。

 apacheを起動しようとしたらSyntax Errorが出て起動しない・・・なんて経験はないでしょうか。

自宅サーバやテストサーバならまだ良いですが、そうでなければ大変なことになります。

Syntax Errorは、Configファイルの文法や構文が間違っているため読み込めない、というエラーです。

つまりこれを事前に確認できれば良いわけですね!

apacheの構文チェックは起動スクリプトにオプションをつけるだけです。

/usr/localの下にapache2が入っている場合は

/usr/local/apache2/bin/apachectl -t

と打てば構文チェックができます。

 また、/etc/init.d/ の下にシンボリックリンクが貼られている場合は、

/etc/init.d/apache2 -t

という感じでもOKです。

apacheのConfigファイルはhttpd.confというファイルなので、これを書き換えたときは必ずチェックするようにしましょう。

 では、また次回。

railsの開発用サーバを使ってみよう。

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、タジです。

今回はrailsに用意された開発中のアプリケーションを実際に動かすためのスクリプトである、script/serverについてです。

 このスクリプトを使うと非常に簡単にアプリの動作を確認できます。また、Webサーバも立ち上げてくれるので、ブラウザからも確認ができます。

起動も簡単で、起動したいプロジェクトのディレクトリで

ruby script/server

と打つだけです。

特に何も設定していない場合は、railsに付属しているWebサーバであるWEBrickを起動します。

起動後は、

http:localhost:3000

にアクセスすることで、ブラウザから動作確認ができます。

3000というのは使用するポート番号で、これを変更すれば複数立ち上げることもできます。

ruby script/server –port=3001

と打てばlocalhostの3001番で起動するという感じです。

今回はここまでです。

それではまた次回。

macユーザーのための便利なエクセル(excel 2004)ショートカット集

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちはカツオです。 今日は自分が会社に入ってから覚えた ショートカット (for mac)を書こうと思います。

役に立つと思う順に書きますね。   

コピー  
command + c

切り取り  
command + x

貼付け  
command + v

エクセルの書式設定ダイアログを開く
command + 1   

セル内で改行  
command + option +enter

選択しているセルを再編集  
control + u

セルの削除  
control + k

セルの追加  
control + i

選択しているセルの数値と値の削除

control + b

選択セル位置と同じ列で直前の値をコピーして入力  
control + d

選択セル位置と同じ行で直前の値をコピーして入力  
control + r

選択セル位置の列をすべて選択
control + スペース

選択セル位置の行をすべて選択  
shift + スペース

保存
command + s

名前を付けて保存   
command + shift + s    

現在の日付   
control+;(セミコロン)

現在の時刻
control + :(コロン)   

左揃え
command + L    

中央揃え
command + E    

右揃え
command + R    
   
macユーザーは エクセルでセル内改行とか絶対つまづきますよね。
あとセルで再編集はとても便利ですね。   
また覚えたら追加していきますね。 ではでは  

rakeをバージョン指定して実行してみる~undefined method `last’ for {}:Hash~

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ローカル環境で rake db:migrate をしようとしたら
rake aborted! undefined method `last’ for {}:Hash残念でたまりません。

ググってみると
rake db:migrate すると undefined method `last’ for {}:Hash と出る
↑では新しいバージョンを削除することでエラーを解消しています。

とりあえず今回は、rakeのバージョンを指定して実行してみようと思います。

rake _0.7.3_ db:migrate
これでOKのようです。

partialについて

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうも。

昨日に続いて、バッチです。

本日はpartialについて簡単に説明します。

partialは部分的に別のファイルを挿入することができます。

前回のlayoutに続いて、メニューやヘッダーフッターに使用する ことが多いと思います。

使い方は、まずpartialファイルを作ります。 ファイル名は少し特殊で、

_hoge.rhtm

というようにファイル名の最初にアンダースコアがつきます。

作ったpartialファイルを挿入するには、

<% render :partial => “hoge” %>

と書きます。

この部分にpartialファイルの中身が挿入されるわけです。

編集する機会が多かったりする部分は、partialでまとめておくと

一気に変更できますね。 

Railsのlayoutファイルについて

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうも。

新人のバッチです。

本日はRailsのlayoutファイルについて簡単に説明します。

RailsでlayoutとはHTMLでいうフレームみたいなもので、

同じデザインをいくつものファイルで共有する際に用います。

layoutファイルはviewフォルダ内のlayoutsフォルダに置きます。

使用するにはcontrollerの最初に、使用するlayoutファイルを記述します。

 layout ‘hoge’

また、一つのファイルのみに適用する場合は、

 layout ‘hoge’ :only => :アクション名

適用しないファイルを定める場合は、

 layout ‘hoge’ :except => :アクション名

で設定できます。

設定ができたらlayoutファイル内の、

 <%= yield %>

と書かれている部分に各アクションの内容が挿入されます。

linux locateコマンドについて

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今日はlocateコマンドについて

簡単に説明します。 

ファイルを検索したいけど findじゃ時間がかかるし、

重たいって時に locateコマンドが役に立ちます。

locateコマンドでは

ファイル名やディレクトリ名から、

あらかじめ作成してあるデータベースから パスを高速検索することができます。

$ locate ファイル名(ディレクトリ名等)

で一瞬でパスが検索できます。

しかし、もしファイルを検索して

warning: locate: warning: database /var/lib/slocate/slocate.db’ is more than 8 days old

等とwarningがでてしまったら、

それはDBの更新が8日以上してないってことなのです。

その場合、DBの更新が必要です。

DBの更新のコマンドは

$updatedb

で対応できます。

たくさんファイルとかディレクトリとかじゃんじゃん探しちゃってください。

Rubyの例外処理

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どーもメガネです。7回目です。今回はRubyの例外処理について説明します。
例外とはプログラムの実行中にエラーが発生すると例外が発生します。例外が発生するとプログラムの実行は中断し例外を探します。
要するに、何か問題が発生した場合に“エラー”ではなく、“エラーみたいですよ”と報告し、その報告を受け取って何かしらの処置をするのが「例外処理」です。で、ここでいう“報告”が「例外」で、“報告する行為”を“「例外」を投げる”といいます。

簡単に書くと

1,例外処理を使わない処理  
if a() == false  
    エラー処理        
end               
if b() == false   
    エラー処理
end
if c() == false
    エラー処理
end

2,例外処理を使った処理
begin
    a()
    b()
    c()
rescue
    エラー処理
end

これで例外処理が便利だということが分かったと思います。

ではさっそく書き方を説明します。

begin
    例外が起こる可能性のある処理
rescue
    例外が起こった場合の処理
end

またrescueのあとに変数名を指定することで例外オブジェクトを得ることができます。

begin
    例外が起こる可能性のある処理
rescue => 例外オブジェクトが代入される変数
    例外が起こった場合の処理
end

ほかの言語を知っている方であればtry~catchと使い方は変わりません。
以上です。

Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

KBMJがZDnetで連載している記事を紹介します。コメントなどありましたらそちらでお願いします。

Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション 佐藤伸吾(KBMJ)

今回はRubyCocoaとMac OS XのフレームワークであるCore Animationを使って、お手軽にアニメーションを作成してみましょう。

問題

RubyCocoaは、Mac OS XのCocoaオブジェクトをRubyスクリプトからRubyオブジェクトとして扱うための、Ruby用ライブラリとフレームワークです。RubyCocoaを用いれば、RubyでCocoaアプリケーションを記述することができるのです。

 Core AnimationはMax OS Xのフレームワークで、その利点は手軽さにあります。普通にアニメーションプログラミングを行おうとすると、時間軸管理、非同期な描画スレッド、パフォーマンスの向上など、考慮すべき点があまりにも多すぎます。

 しかし、Core Animationを用いれば、面倒な部分はOSに任せて、自分の実現したいことに集中できるのです。

 今回はRubyCocoaとMac OS XのフレームワークであるCore Animationを使って、お手軽にアニメーションを作成してみましょう。

回答例

 AppController.rbを作成し、以下のように記述します。

require ‘osx/cocoa’
OSX.require_framework ‘QuartzCore’

class AppController < OSX::NSObject
ib_outlet :window
ib_outlet :view
ib_action :pressPosition
ib_action :pressRotation
ib_action :pressSepia
ib_action :pressBloom
ib_action :pressHole
ib_action :pressZoom
ib_action :pressHalftone

def awakeFromNib
bitmapImage = OSX::NSBitmapImageRep.imageRepWithContentsOfFile_(‘/Users/ssato/Pictures/ruby.png’)
image = bitmapImage.CGImage()

layer = OSX::CALayer.layer()
layer.contents = image
layer.frame = OSX::CGRectMake(0,0,995/4,996/4)

black=OSX::CGColorCreateGenericRGB(0,0, 0,1.0)
backgroundLayer=OSX::CALayer.layer()
backgroundLayer.backgroundColor=black

backgroundLayer.addSublayer_(layer)

@view.setLayer_(backgroundLayer)
@view.setWantsLayer_(true)
end
def pressPosition(sender)
animation = OSX::CABasicAnimation.animationWithKeyPath_(‘position’)
animation.duration = 1.0

layer = @view.layer.sublayers.objectAtIndex_(0)
position = layer.position
animation.fromValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))
position.x += 256;
position.y += 160;
animation.toValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))
animation.autoreverses = true
animation.repeatCount = 4
layer.addAnimation_forKey_(animation, ‘positionAnimation’)
end
def pressRotation(sender)
animation = OSX::CABasicAnimation.animationWithKeyPath_(‘transform’)
animation.duration = 0.5
animation.autoreverses = true
animation.repeatCount = 4
transform = OSX::CATransform3DIdentity
animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)
transform = OSX::CATransform3DMakeRotation(Math::PI, 0, 1.0, 0)
transform.m34 = 1.0 / -420.0
animation.toValue = OSX::NSValue.valueWithCATransform3D(transform)
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.addAnimation_forKey_(animation, ‘transformAnimation’)
end
def pressSepia(sender)
filter = OSX::CIFilter.filterWithName_(‘CISepiaTone’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.name = ‘sepiaFilter’
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
def pressBloom(sender)
filter2 = OSX::CIFilter.filterWithName_(‘CIBloom’)
filter2.setDefaults
filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(0.0), ‘inputIntensity’)
filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(5.0), ‘inputRadius’)
filter2.setName_(‘bloomFilter’)

layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter2))

pluseAnimation = OSX::CABasicAnimation.animation
pluseAnimation.keyPath = ‘filters.bloomFilter.inputIntensity’
pluseAnimation.fromValue = OSX::NSNumber.numberWithFloat_(0.0)
pluseAnimation.toValue = OSX::NSNumber.numberWithFloat_(1.5*2)
pluseAnimation.duration = 1.0
pluseAnimation.repeatCount = 4
pluseAnimation.autoreverses = true
layer.addAnimation_forKey_(pluseAnimation, ‘bloom’)
end
def pressHole(sender)
filter = OSX::CIFilter.filterWithName_(‘CIHoleDistortion’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
def pressZoom(sender)
filter = OSX::CIFilter.filterWithName_(‘CIZoomBlur’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
def pressHalftone(sender)
filter = OSX::CIFilter.filterWithName_(‘CICMYKHalftone’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
end

Interface Builderで画像1のようにコンポーネントを配置します。

画像1

画像1

NSObjectを追加して、ClassにAppcontrollerを指定します(画像2)。

画像2

画像2

OutletsとActionsのConnectionを画像3のように設定します。

画像3

画像3

実行結果

Positionボタンを押すと、画像が斜めに移動します(画像4)。

画像4

画像4

Rotationボタンを押すと画像が回転し、Sepiaをクリックすると画像がセピア色になります(画像5)。

画像5

画像5

同様に、Bloomは画像が光り輝き(画像6)、Holeは画像に穴が空きます(画像7)。Zoomボタンはズームエフェクト(画像8)で、Halftoneはハーフトーンフィルタです(画像9)。

画像6

画像6

画像7

画像7

画像9

画像8

画像9

画像9

解説

共通部分

Core Animationを使用するためにフレームワークを設定します。

OSX.require_framework ‘QuartzCore’

AppControllerからviewにアクセスするためのアウトレットを宣言します。

ib_outlet :view

ib_action :pressPosition
ib_action :pressRotation
ib_action :pressSepia
ib_action :pressBloom
ib_action :pressHole
ib_action :pressZoom
ib_action :pressHalftone

pressPosition部分

アクションを宣言し、ボタンが押された時の処理として登録できるようにします。

layerオブジェクトを作成します。Core Animationではレイヤーを基本単位としてアニメーションを実行します。

layer = OSX::CALayer.layer()

backgroundLayerの下にlayerをぶら下げます。

backgroundLayer=OSX::CALayer.layer()
backgroundLayer.addSublayer_(layer)

viewの描画内容としてbackgroundLayerを設定する。

@view.setLayer_(backgroundLayer)
@view.setWantsLayer_(true)

アニメーション化するレイヤプロパティのキーパスを指定して、CABasicAnimationのインスタンスを作成します。

animation = OSX::CABasicAnimation.animationWithKeyPath_(‘position’)

再生時間を1秒に設定します。

animation.duration = 1.0

アニメーションの開始位置を指定します。

animation.fromValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))

アニメーションの終了位置を指定します。

position.x += 256;
position.y += 160;
animation.toValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))

繰り返しアニメーションされるように設定します。

animation.autoreverses = true
animation.repeatCount = 4

layerにアニメーションを設定します。

layer.addAnimation_forKey_(animation, ‘positionAnimation’)

pressRotation部分

単位行列を取得します。

transform = OSX::CATransform3DIdentity

アニメーション開始時の変換行列を設定します。

animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)
animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)

回転行列を取得します。

transform = OSX::CATransform3DMakeRotation(Math::PI, 0, 1.0, 0)

 pressSepia部分

セピア調フィルタを作成する。

filter = OSX::CIFilter.filterWithName_(‘CISepiaTone’)

フィルタの入力値をデフォルト値に初期化する。

filter.setDefaults()

layerにfilterを設定する。

layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))

pressBloom部分

Bloomフィルタを作成する。このフィルタはエッジをソフト化し、輝きを画像に適用します。

filter2 = OSX::CIFilter.filterWithName_(‘CIBloom’)

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値であるinputIntensityを0.0に設定する。

filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(0.0), ‘inputIntensity’)

フィルタ処理の対象となる領域の半径を指定する値であるinputRadiusを5.0に設定する。

filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(5.0), ‘inputRadius’)

フィルタに名前を設定する。この名前は後でアニメーション設定する時に必要となる。

filter2.setName_(‘bloomFilter’)

アニメーション化する属性を指定する。

pluseAnimation.keyPath = ‘filters.bloomFilter.inputIntensity’

inputIntensityの開始値と終了値を指定する。

pluseAnimation.fromValue = OSX::NSNumber.numberWithFloat_(0.0)
pluseAnimation.toValue = OSX::NSNumber.numberWithFloat_(1.5*2)

pressHole部分

穴歪みフィルタを作成する。

filter = OSX::CIFilter.filterWithName_(‘CIHoleDistortion’)

pressZoom部分

カメラをズームしたようなエフェクトをシミュレートするズームブラーを作成する。

filter = OSX::CIFilter.filterWithName_(‘CIZoomBlur’)

pressHalftone部分

ハーフトーン表現を行うフィルタを作成する。

filter = OSX::CIFilter.filterWithName_(‘CICMYKHalftone’)

最後に

駆け足で説明しましたが、いかがだったでしょうか?RubyCocoaを使うと、RubyからMac OS Xのリッチなフレームワークを使うことができます。

もっと良い方法があれば、コメントやbuilderブログなどで是非教えていただきたいと思います。

ntpをインストールする

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちはmugiです。

今回はCentOS5.2にntpをインストールします。 

ntpのインストール 

# yum -y install ntp

ntpの設定

# vi /etc/ntp.conf

ファイル内に「server *.*.*.*.*」のような記述があるかと思いますので、そこに同期させたいntpサーバを記述します。保存して閉じます。

時刻合わせ(ntpdは同期をとるサーバとあまりにも時刻がずれていると同期がとれないことがあるため) 

# ntpdate server *.*.*.*.*

起動

# /etc/init.d/ntpd start 

自動起動をONにする

# chkconfig ntpd on

サーバが起動したとき自動でntpdが起動するようになります。

同期がとれているか確認 

# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

* server *.*.*.*.* .GPS.            *    *   *  ***    *.***  -*****.  **.***

 LOCAL(0)        .LOCL.          ** l   **   **  ***    *.***    *.***   *.***

同期したいサーバの頭に*がついていればOKです。

(表示されるまで設定して10分くらいかかるようです)

最近人気な記事