ホーム ブログ ページ 66

リファラでアクセス制限をしてみた。(apache)

0

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

こんにちはカツオです。

入社してもう2ヶ月経とうとしています。

早い。

毎日怒られてます。

今日は 

rubyとはちょっと違うのですが

本日はリファラーによるアクセス制限について紹介します。

仮にbookmarks.hahaha.co.jpというサイトを

リファラを使って制御したいと思います。 

まず設定を書くhttp.confファイルを探します。

/usr/local/apache2/conf/httpd.conf

とかにあることが多いんじゃないでしょうか

そのファイルを開くと

VirtualHostとか色々設定してあるところのなかに 

<Location />
    SetEnvIf Referer "^http://bookmarks.hahaha.co.jp" check
    Order allow,deny
    Allow from all
    Deny from env=check
</Location>

と書き足してください。

これによってサイトの全ページにおいて

bookmarks.hahaha.co.jpからのアクセスを禁止しています。

赤字を自分が制御したいサイトのURLを書いてください。

自分はこれでアクセスは制御できるかなーと思ったら

なんでかわからないけど

普通にアクセスしたときにスタイルシート等が適応されなくて、

レイアウトが崩れてしまいました。 

仕方がないので、
パブリックに対してアクセスする権利を与えました。
これがなくて僕の環境では画像とCSSが表示されなかったです。
        ↓

<Directory /home/testtest/public>
     Order allow,deny
       Allow from all
       Options None
       AllowOverride None
</Directory>

これでちゃんと表示するようになりました。

色々設定してみたんですが

自分がやったときネット調べながらやっても

なぜか上手くいかなかくて

今回ロケーションで設定したのですが

もっといい方法はあるかもしれませんね。

あったら教えてください。

ではでは

また。 

Rubyでどう書く?:Rubyで特定URLの画像パス一覧を表示する

0

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

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

Rubyでどう書く?:Rubyで特定URLの画像パス一覧を表示する  牧野裕之(KBMJ)

第3回目のテーマはRubyである特定のURL上にある画像パス一覧を表示する方法について解説したいと思います。

問題

 あるWebサイトをブックマークする際に、そのURLで表示されている画像の一覧から1つの画像を選択した上でブックマークしたいという要望を受け取ったとします。

 そこで、画像選択用のサムネイル表示のために、URL上に表示されている画像URLの一覧を配列として提供したいのですが、どのようなメソッドで提供すべきでしょうか?

 ここでは、ごく簡単ではありますが正規表現を使って画像URL一覧の取得を行ってみます。

仕様

・画像ファイルは「jpg, jpeg, gif, bmp, png」を取得する
・URIスキームが「http」の場合のみ画像を取得する

回答例

require 'open-uri' 
require 'resolv-replace'
require 'timeout'
class ImageUrl
# 特定のURL上の画像パス一覧を取得する
def self.get_image_urls(url)
begin
timeout(1) {
begin
uri = URI(url)
if uri.scheme == "http" #httpsでは画像を取ってこない。
tmp_images = uri.read.scan(/img.+src=[\"|\']?([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:@&=\$\,\%\#]+\.(jpg|jpeg|png|gif|bmp))/i)
images = []
tmp_images.each { |img| images << URI.join(url, img[0]) }
images.uniq
end
rescue => exception
case exception
when OpenURI::HTTPError # 404エラー
puts "ページが見つかりません。"
when URI::InvalidURIError # 入力エラー
puts "URLが入力されていません。"
# 他にもエラークラス別に処理を加えるなら以下のように追加
# when エラークラス名
# エラー時の処理
else # その他のエラー
puts exception.to_s + "(#{exception.class})"
end
end
}
rescue TimeoutError
# Timeout時の処理
puts "読み込みに時間がかかりすぎたため、処理を終了しました。"
end
end
end
image_urls = ImageUrl.get_image_urls(ARGV[0])
puts image_urls

 試しにYahoo!JAPANから画像URL一覧を取得してみましょう。

ruby image_url.rb "http://yahoo.co.jp/" 

 本記事を執筆時点では、実行結果は以下のようになります。

http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/top/sp/cgrade/logo.gif
http://k.yimg.jp/images/top/searchbox/s_p.gif
http://k.yimg.jp/images/new.gif
http://k.yimg.jp/images/top/calender.gif
http://k.yimg.jp/images/top/sp/cgrade/icon_point.gif
http://k.yimg.jp/images/top/sp/cgrade/icon_login.gif
http://k.yimg.jp/images/premium/top2/cam_searchpoint_50x50_01.gif
http://k.yimg.jp/images/top/sp/qr.gif
http://k.yimg.jp/images/top/sp/cgrade/dot.gif
http://k.yimg.jp/images/mlb/y_top/matsuzaka_02.jpg

解説

 本サンプルプログラムでは、以下の順序で処理を実行しています。

1.URL読み込み

 ruby1.8.2からは、URI.parse(“http://…”)をURI(“http://…”)と書けるようになっているため、後者の書き方に合わせました。

2.URIスキーム判定

 URIスキームがhttpの場合のみ画像を抽出したいので、判定文を加えました。open-uriはSSLで自己証明証を使用しているURLにはアクセスできないため、残念ながらhttpsは該当URIスキームからは外しました。

3.読み込んだソースから正規表現で画像URI抽出

 正規表現により正しい画像URLのみを抽出します。

4.重複削除し、値を返す

 URLによっては同じ画像を何度も呼んでいる場合があるので、Array#uniqで画像パスの重複したものを削除した後に、値を返します。

 また、本プログラム作成時に以下の二点に気を付けました。

1.正規表現にオプション「i」をつける

 読み込むソースによっては、タグ・属性・拡張子が大文字で記述されている可能性があるので、大文字小文字を無視するオプションが必要になります。

2.エラー(URL未入力、404、タイムアウト)への対処

 例として、URLの入力が無かった場合、404レスポンスが返ってきた場合、タイムアウトの場合の三通りについて、個別の対応ができるように記述しました。ここでは、TimeoutErrorはStandardErrorのサブクラスではないため、rescueの際にはクラス名を明記しておく必要があることに注意してください。

 個人的な感想ですが、以下の点について工夫を加えれば本プログラムが改善できそうだと思いました。

1.画像URL取得に用いる正規表現

 よりスマートな正規表現に書き換えれば、理解しやすく変更も加えやすくなると思います(正直なところ、あまりきれいな正規表現では無いと思っています。申し訳ありません)。

2.CSS(スタイルシート)に記述されている画像URLの取得

 本サンプルプログラムでは、CSSに記述されている画像URLの取得までは網羅していません。

3.エラー処理

 本プログラムではエラーの種類による分岐までに留めていて、実際の処理に関しては記述しませんでした。要件によって、処理を書き加えるとよいでしょう。

4.httpsへの対応

 httpsのページであっても画像が取得できるように変えたほうが、本プログラムをより多くのページで利用できるでしょう。net/httpsを用いれば実現可能なようです。

最後に――

 簡単な問題・例文ではありましたが、いかがでしたでしょうか。

 本記事では、あるWebサイト上で用いられている画像のURL一覧を取得するという題目でご説明させていただきました。拙作ではありますが、少しでも皆さんのRubyへの理解の助けになれば幸いです。

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

postgresでのユーザ権限付与(psql, grant)

0

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

おはようございます。tacchiです。

今日は、postgresでの権限付与について、話したいと思います。
スキーマ単位で権限付与できず、テーブル毎に権限付与しなきゃならないので、テーブル数が増えている場合のDBにユーザ作成して権限付与するのが面倒になってきますよね。
テーブルリストを作成してそのリストに対して、同じgrant文を流すスクリプトを組んだので、良ければ使ってみて下さい。
## grant.sh
#!/bin/sh

DBNAME=${1:?”enter dbname”}
DB_USERNAME=${2:?”enter db username”}
CREATE_USERNAME=${3:?”enter create username”}
COMMAND=${4:?”enter select or ‘select,update’ or ‘select,update,delete’ …”}

# –共通関数定義–
LIST=/tmp/table.lst

psql -U ${DB_USERNAME} -d ${DBNAME} -c “select relname from pg_class where relkind=’r’ and relnamespace=(select oid from pg_namespace where nspname=’public’ order by relpages desc);” -t -A > ${LIST}

# コマンド実行
while read line
do
echo psql -U ${DB_USERNAME} -d ${DBNAME} -c \”grant ${COMMAND} on $line to ${CREATE_USERNAME}\;\”
psql -U ${DB_USERNAME} -d ${DBNAME} -c “grant ${COMMAND} on $line to ${CREATE_USERNAME};”
done < ${LIST}

# listファイル削除
rm -f ${LIST}

exit 0

使い方

./grant.sh dbname db_username create_username ‘select’
./grant.sh dbname db_username create_username ‘select,update,delete’

う。。。 インデントが崩れてる。。。

railsの実行モードの設定 RAILS_ENV

0

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

おひさしぶりです。

初心者カツオです。

以前業務でとあるサイトの本番反映をしていたときに

ものすごい初歩的なのですがrailsの実行モードで

ひっかかったことがあります。

業務で本番サーバーにアップした後

maigrationしようとおもったけど

なぜかテーブルできない

[kbmj@cms tset]$ rake db:migrate(in /var/cms/test)
Rails Error: Unable to access log file. Please ensure that /var/cms/test/config/../log/development.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.

 

chmodとか書いてあるし

あぁ権限がないのかな?

と思ってsudoをつけてもなぜかテーブルがつくれない

 [kbmj@cms1 test]$ sudo rake db:migrate(in /var/cms/test)rake aborted!
No such file or directory - /tmp/mysql.sock

タイム連打も試してみたけど

ファミコンじゃないし意味がない(嘘)

で、ひとしきり焦った後

なんのことはなかったのが

railsではアプリケーションを動かすときに実行モードを指定するんだ。

ということなわけですね。

[kbmj@cms1 test]$ sudo rake db:migrate RAILS_ENV=production
(in /var/cms/test)== AddRecordToTestPages: migrating =======================================
== AddRecordToTestPages: migrated (0.0480s) ==============================

本番環境はたいていproductionモードで実行しているはずなのですが

実行モードのデフォルトは”development”モードなので

RAILS_ENV=production

ってな具合に指定してあげなければいけないのですねー

いやはや日々精進しなければ。

ドロップダウンに簡単にオートコンプリート機能を追加する方法

0

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

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 今回は少し毛色を変えてAjaxな話題です。

 ライブラリを使って既存のドロップダウンに簡単にオートコンプリート(入力したテキストで始まる候補だけリストに表示させる)機能を追加する方法を紹介したいと思います。

 ライブラリはExt(今回のバージョンは2.1)を使います。

 今回読み込む必要があるのは、ext-base.js,ext-all.js,ext-all.css,xtheme-gray.css,combo.css、画像はExtのソースファイルのresources/images/default/layoutとresources/images/default/formを[DocumentRoot]/stylesheets/images/defaultへ配置しました。

 ドロップダウンは以下とすると <select id=”prefectures”>

<option value=”1″>北海道</option>
<option value=”2″>青森県</option>
<option value=”3″>岩手県</option>
<option value=”4″>宮城県</option>
・・・
<option value=”46″>鹿児島県</option>
<option value=”47″>沖縄県</option></select>

以下のコードを追加します。 (transformにドロップダウンのidを指定すればよい)<script type=”text/javascript”>
//<![CDATA[

function init(){
var converted = new Ext.form.ComboBox({
typeAhead: true,
triggerAction: ‘all’,
transform:’prefectures’,
width:135,
forceSelection:true});}
Ext.EventManager.on(window, ‘load’, init);

//]]>
</script>

 以上が、ドロップダウンにオートコンプリート機能が追加する手順です。

 とても簡単ですよね。

 導入するチャンスがあったなら是非試してみてください。

 Let’s ajax! 

Vimの自動補完

0

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

こんにちはメガネです。初です。 

今回はVimで開発していく上で便利な自動補完機能について触れてみようと思います。

自動補完機能とは、たとえばrと打つと下のように保管候補が表示されます。

test

Vimとは

http://ja.wikipedia.org/wiki/Vim

今回はLinux環境での設定で話して行きます。

ホームディレクトリに.vimというディレクトリ、その下にpluginというディレクトリを作成して

移動します。

 $ mkdir -p .vim/plugin

 $ cd .vim/plugin

移動できたらautocomplpop.vimをダウンロードします。

 $ wget http://www.vim.org/scripts/download_script.php?src_id=8656

ホームディレクトリに移動します。

 $ cd

 $ vim .vimrc

autocmd FileType ruby :set dictionary=/usr/share/vim/vim71/syntax/ruby.vim

上のコードを追加してください

これで拡張子が.rb,.rhtmlが自動的に補完されます。

監視ツールcactiについて

0

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

こんにちわ marumoru です。

今回監視ツールとしてcactiのインストールについてご紹介します。

サーバ監視をWEBブラウザで視覚的(グラフ等)にて確認できるものです。

他の監視ツールに比べると拡張性が優れているかと思います。

が、他監視ツールより初期導入がちょっとだけ大変かもしれません。

動かす為に必要なもの

Apache       1.3以降
PHP        4.1以降(4.3.6以降を推奨)
RRDTool     1.0.49以降
MySQL      3.23以降(4.0.20d以降を推奨)→別DBにできないことはない
Net-SNMP     最新版がなるべくよい

cactiをCentOS5にインストール

前提としてApache,PHPはインストール済みとします・・・・。yum –enablerepo=rpmforge install cacti

MySQLにcacti用のデータベースを作成mysqladmin -u root -p create cacti
mysql -u root -p cacti < /var/www/cacti/cacti.sql
mysql -u root -p mysql
GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY ‘cactiuser’;
flush privileges;

他PCからの閲覧を許可する場合には、以下を変更vi /etc/httpd/conf.d/cacti.conf
Alias /cacti/ /var/www/cacti/
<Directory /var/www/cacti/>
        DirectoryIndex index.php
        Options -Indexes
        AllowOverride all
        order deny,allow
        deny from all
        allow from 127.0.0.1
        allow from  XXX.XXX.XXX.XXX        許可したいIP追加
        AddType application/x-httpd-php .php
        php_flag magic_quotes_gpc on
        php_flag track_vars on
</Directory>

cacti側へMySQL設定を反映/var/www/cacti/include/config.php

→作成したDBにアクセスできるように編集する

WEBブラウザで設定

http://(インストールしたサーバアドレス)/cacti/ にブラウザアクセス
NEXT >>を選択
NEW Install >>を選択
SNMP Utility Version    NET-SNMP 5.x
RRDTool Utility Version    RRDTool 1.2.x を選択
FINISHをクリック

ログインしてみる http://(インストールしたサーバアドレス)/cacti/index.php 

ログイン画面にて、admin/adminを入力

パスワード変更を要求してくるので新パスワードを入力

これで、監視サーバの設定は完了です。

→yumでインストールした場合には、データ収集のcronは設定済みとなります。 /etc/cron.d/cacti
 */5 * * * *     cacti   php /var/www/cacti/poller.php &>/dev/null

Patchやプラグイン等により色々と拡張可能ですので

今回は、最低限のインストール方法でしたが 

次回は、patchやプラグイン追加と監視先サーバへのSNMPインストールを紹介できればと思います。 

サーバ監視ソフトウェア「ganglia」を使ってみる

0

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

こんにちわ、uです。

最近、社内で良い監視ツールが無いか色々試しています。

先日、その一つとしてgangliaというサーバ監視ソフトウェアを

試しに入れてみましたので簡易的ですが、インストールメモを残しときます。

■導入環境 

OS: 64bit Centos 5.1

■Installation
184 yum -y –enablerepo=rpmforge install rrdtool perl-rrdtool
186 cd /usr/local/src/
187 rpmbuild –rebuild ganglia-3.0.7-1.src.rpm
188 yum -y –enablerepo=rpmforge install libpng-devel libart_lgpl-devel rrdtool-devel freetype-devel
189 rpmbuild –rebuild ganglia-3.0.7-1.src.rpm
190 cd /usr/src/redhat/RPMS/x86_64/
191 rpm -vhi ganglia-gmetad-3.0.7-1.x86_64.rpm
192 rpm -vhi ganglia-gmond-3.0.7-1.x86_64.rpm
194 cd /usr/local/src/
195 rpm -vhi ganglia-web-3.0.7-1.noarch.rpm


■gmetadの起動
185 vim /etc/gmetad.conf
setuid_username “apache”
186 chown apache.apache /var/lib/ganglia/rrds
187 service gmetad stop
188 service gmetad start
190 service gmetad status
191 telnet localhost 8651

■gmondの起動
193 echo “any net 224.0.0.0/4 dev eth0” >> /etc/sysconfig/static-routes
195 /etc/init.d/network restart
196 netstat -rn
201 cp /etc/gmond.conf /etc/gmond.conf.org
202 vim /etc/gmond.conf
# 編集内容は以下参照
http://www.thinkit.co.jp/cert/article/0611/13/1/code4.htm
203 service gmond start
204 service gmond status
205 telnet localhost 8649

■gangliaの確認
http://localhost/ganglia
 

■参考文献

  • http://www.thinkit.co.jp/free/article/0611/13/1/ 

■感想

yumコマンドで一発終了というのは無理ですが、そんなに躓かずにインストールが出来ました。 

参考文献に書いてある通り、例えば100台のサーバのロード値だけをグラフに表したい等、複数台のサーバの特定の値を一度に表示させる時は非常に便利です。

ただし、ざっと使ってみた感じでは、先日の記事munin程の詳細な情報は取得できないみたいです。 

一長一短ですね。

Rubyでどう書く?:RubyでPDF履歴書を作成する

0

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

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

Rubyでどう書く?:RubyでPDF履歴書を作成する   高倉利明(KBMJ)

第2回目のテーマは「RubyでPDF文書を作成する」と題しまして、RubyでPDFの文書を作成する方法について解説したいと思います。

 問題

 Webアプリケーションを開発していると、「PDF文書を作成してほしい」との要望をクライアントから頂くことがあります。しかし、Rubyの実際のサービスでPDFを出力しているものはあまりありませんでした。

 ここでは以前、私が行った開発を元にノウハウを紹介したいと思います。

仕様

  • Ruby on Railsを使用(実際に必要になるケースはRoRプロジェクトがほとんどと考えました)
  • Rfpdfプラグインを使用(インストール方法はRoR Wiki 翻訳 Wiki – Rfpdfを参照)
  • 出力するフォーマットは図1のイメージ

図1 イメージ画像 図1 イメージ画像

回答例

class Resume

  class << self
    # PDF出力メソッド
    def output
      pdf = Pdf.new(“高倉 利明”, “タカクラ トシアキ”)
      file = File.open(“C:\\resume.pdf”, “wb”)
      file.write(pdf.generate)
    end
  end

  # pdf作成クラス
  class Pdf

    IC_SJIS = Iconv.new(‘SJIS’, ‘UTF-8’)

    def initialize(name, kana)
      # 出力データ
      @name, @kana = name, kana
      # マージン
      @lm, @tm = 10, 10
      # 基本となる罫線の横、縦サイズ
      @width, @height = 120, 20

      @pdf = FPDF.new
      @pdf.extend(PDF_Japanese)
      @pdf.AddSJISFont
    end

    # PDF(バイナリデータ)を作成
    def generate
      @pdf.SetMargins(@lm, @tm)
      @pdf.AddPage
      drow_format(@lm, @tm)
      drow_data(@lm, @tm)
      return @pdf.Output
    end

    # フォーマット描画
    def drow_format(left, top)
      @pdf.SetXY(left, top)
      setBoldLine
      @pdf.Cell(@width, @height, ”, 1)
      @pdf.SetXY(left, top)
      setThinLine

      # 氏名(フリガナ)欄
      @pdf.SetXY(left, top)
      @pdf.SetFont(‘SJIS’,”, 8)
      @pdf.Cell(20, 5, ic(‘フリガナ ’), ‘B’, 0)
      @pdf.Cell(@width – 20, 5, ”, ‘B’, 1)

      # 氏名欄
      y = @pdf.GetY
      setBoldLine
      @pdf.Cell(@width, 15, ”, ‘B’, 0)
      @pdf.SetXY(left, y)
      @pdf.SetFont(‘SJIS’,”, 8)
      @pdf.Cell(20, 5, ic(‘氏名 ’), 0, 2)
      @pdf.Cell(20, 10, ”, 0, 0)
      @pdf.SetXY(left + 20, y)
      @pdf.Cell(@width – 20, 15, ”, 0, 1)
    end

    # データ描画
    def drow_data(left, top)
      @pdf.SetXY(left, top)
      write_string(left + 25, top + 3, 10, @kana)
      write_string(left + 25, top + 13, 14, @name)
    end

    def write_string(left, top, font_size, string)
      @pdf.SetXY(left, top)
      @pdf.SetFont(‘SJIS’,”, font_size)
      @pdf.Write(0, ic(string))
    end

    def setBoldLine
      @pdf.SetLineWidth(0.3)
    end

    def setThinLine
      @pdf.SetLineWidth(0.1)
    end

    def ic(str)
      IC_SJIS.iconv(str)
    end

  end
end

 本ソースをresume.rbとしてRoRプロジェクトののmodelディレクトリに配置し、以下のコマンドを実行することで「C:\resume.pdf」で出力されます。ruby script/runner Resume.output

解説

本サンプルでは、

  1. マージン、枠の縦横サイズの初期化「initialize」「generate」
  2. 罫線などのフォーマットを描画「drow_format」
  3. 各項目の値を描画「drow_data」

 というステップにわけて処理をしています。

 RFPDFライブラリを使用する場合は、

  1. FPDF.newでオブジェクト生成
  2. 日本語が扱えるようにextendやAddSJISFontメソッドで指定
  3. AddPageメソッドでページを追加
  4. ページに表示する内容を描画
    • 座標:SetXY、SetX、SetY、GetX、GetYなどを利用
    • 文字フォント:SetFontで指定
    • 罫線サイズ:SetLineWidthで指定
    • 罫線:Cellメソッドで描画(第三引数に文字列を指定することで、同時に文字の描画も可能)
    • 文字:Writeメソッドで描画
  5. Outputメソッドでバイナリを出力

 という流れとなります。

 日本語を出力する際は、Iconvを使用してSJISに変換しています(ソースをUTF8で書いているため)。

 なお、RFPDFの詳しい使用方法は、FPDFのWebサイト「FPDF」を参考にしてください。

最後に──

 駆け足で説明しましたが、いかがだったでしょうか?

 実際のところ、RFPDFは1年近く更新されておらず、また日本語を扱う上でまだバグが見られるのが現状です。

 また、罫線などの枠線をプログラムで引いている関係上、直観的ではない作りになってしまうのが欠点です。

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

clearfixでfloat解除

0

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

こんにちは。
最近Rubyをあんまり触ってないmaiです。

あんまり触ってなくて、Rubyについてあまり語れるほどのことが無いので、
今日はstylesheetのちょっと役立つTipsをご紹介。

cssでfloatを使うと、画像やらボックスやらが親要素からはみ出しちゃうことがあります。
これを解消するには、親要素を閉じる前にfloatをclearで解除すればいいのですが、
空divでclearさせるのは無駄なソースだし美しくない。
そんな美学か美意識を持ってる人にお役立ちなのがclearfixというテクニックです。

———————————–
以下のclearfixはFirefox3でうまくいかないことがあります。
Firefox3にも対応したバージョンは
clearfix for Firefox3」で。
———————————–

御託を並べても仕方が無いので、さっくりとcssをご紹介。

.clearfix:after {
content: “.”;
display: block;
height: 0;
clear: both;
visibility: hidden;
}
 .clearfix {display: inline-block;}

このclearfixを、親要素に適用します。

<div id=”main” class=”clearfix”>
<p style=”float:left”>左の要素</p>
<p style=”float:right”>右の要素</p>
</div>

こんなカンジ。
これでid mainのdivは二つのpを内包しているように振るまいます。
空divをかかなくてよくなるので、ソース上ちょっとスッキリするのもいいところ。

もともと、floatは通常の流れから切り離された浮動体なので、
親要素がfloatしている要素の高さを考慮しなくなるのは仕様上正しいことなんですが、
レイアウトを組む身としては、clearfixがなくても、
floatしている要素の高さも認識してほしいなぁと思わないでもないです。

ちなみに、clearfixについては以下のサイトも参考になります。

 clearfixの決定版を作る -モダンブラウザ編-

SELinux無効にしてみる

0

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

SELinuxとはセキュアOSと呼ばれるものの一種。
簡単な解説は、はてなダイアリー。↓
http://d.hatena.ne.jp/keyword/SELinux

サーバーのセキュリティー的には素敵なSELinuxも、サーバー初心者にとっては、
アプリの起動を妨げたり、妨げたり、妨げたり・・・と少々ハードルの高いお方です。
というわけで、今回はSELinuxにおとなしくしていただこうと思います。環境はCeontOS5です。
rootユーザーで以下を行います。

とりあえずSELinuxの現状を把握します
# getenforce
Enforcing

Enforcingというものが出力された場合、SELinuxは有効になっています。
ちなみに、SELinuxには次の3つのモードがあります。

    * disableモード:SELinuxを完全に無効にする。
    * enforcingモード:ポリシーに違反するアクセスに対し、ログに書き出して拒否する。
    * permissiveモード:ポリシーに違反するアクセスに対し、ログに書き出して許可する。

とりあえず、今回はSELinuxを完全無効にしたいと思います。

SELinux完全無効化
/etc/sysconfig/selinuxというファイルを編集します。

# vi /etc/sysconfig/selinux

ファイルの中身はこんな感じです。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing – SELinux security policy is enforced.
#       permissive – SELinux prints warnings instead of enforcing.
#       disabled – SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted – Only targeted network daemons are protected.
#       strict – Full SELinux protection.
SELINUXTYPE=targeted

6行目をSELINUX=disabledと変更します。

変更後はこんな感じになります。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing – SELinux security policy is enforced.
#       permissive – SELinux prints warnings instead of enforcing.
#       disabled – SELinux is fully disabled.
SELINUX=disabled   #ここを変更しました
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted – Only targeted network daemons are protected.
#       strict – Full SELinux protection.
SELINUXTYPE=targeted

これで次回、システムを起動したとき、SELinuxは無効となります。

システム再起動# reboot

ちなみに、selinuxファイルの編集をしくじると、システム再起動時にカーネルパニックが起こり、
OSの再インストールという悲劇が起こりかねません。
編集するときはご注意ください。

Rubyのソースコードから HTML Helpを生成してみよう!

0

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

こんにちは!
井上 清晃(saronpasu)です。

今回は、RDocについてご紹介します。
RDocについて簡単に説明すると、『Rubyのソースコードから説明書を生成してくれる』というものです。

1. RDocにできること

RDocは、Rubyのソースコードに書いてあるコメントやクラス定義から、
ドキュメントを生成してくれる便利なツールです。
RDocでは次の出力フォーマットに対応しています。

・HTML ドキュメント
Railsなどを触っている方は、もう既にご覧になっているのではないでしょうか?
おなじみの、フレームで区切られたAPIリファレンスのページがあります。
あれがまさに、ソースコードを元に、RDocで生成されたものです。

・HTML Help ドキュメント
Windowsユーザのみなさんは見慣れている、Helpファイルです。
Rubyのソースコードを元に、HTML Help形式のドキュメントを生成することができます。
他にも、

・XML ドキュメント や
・クラス図(jpg/gif/png) などの出力もサポートしていますが、これらについては、今回は割愛します。

2. SampleProject を用意してみよう

さて、それではまず 任意のプロジェクトとして、 SampleProjectというもののドキュメントを生成してみましょうか。

SampleProjectのファイル構成
 sample_project/
  Rakefile
  README
  test/*.rb
  lib/*.rb
  main.rb

ざっと、こんな構成になっていると仮定しましょう。

このスクリプトは、 main.rb に記述されている Mainというクラスを基本的に扱うものとします。
そして、main.rb は、lib/以下の.rbファイルをrequire()して動作しているものとしましょう。

#!/usr/bin/ruby -Ku
require ‘lib/hoge.rb’
require ‘lib/fuga.rb’

#
#*MainClass
#  UTF-8で MainClass の使い方を書いています。
#
class Main
  def initialize
    #ここに処理をかくよ
  end
end

3. RDocで HTMLドキュメントを生成してみよう

さて、早速 RDocでソースコードから HTMLドキュメントを生成してみましょう。
$ rdoc -c utf-8 -m Main -t SampleProject -f html lib main.rb

コマンドの内容を説明します。

 -c: 文字コードの設定です。今回は UTF-8で記述しているのでそのように指定しました
 -m: 生成するドキュメントのトップページに表示するクラス(またはモジュール)です。今回は Mainクラスを指定しました。
 -t: 生成するドキュメントのタイトルです。今回は SampleProject と指定しました
 -f: 生成するドキュメントの形式を指定します。今回は HTML で出力するように指定しました
 最後に、引数としてソースコードの場所を指定します。testとかは読ませたくないので、今回は libディレクトリと main.rbを指定しました。


こうすると、sample_project/配下に docというディレクトリが生成されて、そこに index.htmlという HTMLドキュメントが生成されます。

生成されたHTMLドキュメント

4. RDocで HTML Help ドキュメントを生成してみよう

それでは、次に HTML Help ドキュメントを生成してみましょう。

先ほどの SampleProject から、HTML Helpを生成します。

$ rdoc -c utf-8 -m Main -t SampleProject -f chm lib main.rb

そうすると・・・

Generating CHM…

.chm output generation requires that Microsoft’s Html Help
Workshop is installed. RDoc looks for it in:

    c:/Program Files/HTML Help Workshop/hhc.exe

You can download a copy for free from:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp

というようなメッセージが表示されました。

5. HTML Helpの生成に必要な、 『HTML Help Workshop』をインストールしよう

騙していたわけではありませんが、実は HTML Helpを生成するためには Microsoft HTML Help WorkShop が必要なのです。

というわけで、 Microsoft HTML Help WorkShopをインストールしましょう。

2008.04.30 現在、「HTML Help WorkShop」 は、「Office 2003 Edition リソースキット」として配布されています。
次の URLから 「Office 2003 Edition リソースキット」を取得しましょう。

http://www.microsoft.com/japan/office/ork/2003/tools/BoxA02.htm

ork.exeをインストールすると、 C:\Program Files\ORKTOOLS\ORK11\TOOLS\HTML Help Workshop に、HTMLHELP.EXEが展開されています。
今度は、この HTMLHELP.EXE を展開すると、 C:\Program Files\HTML Help Workshop\hhc.exe が展開されます。

6. 改めて、HTML Help ドキュメントを生成してみよう

これで準備は整いました。
改めて、RDocの生成コマンドを実行しましょう。

$ rdoc -c utf-8 -m Main -t SampleProject -f chm lib main.rb



これでようやく、 sample_project/doc/rdoc.chm が生成されました。
これを開くと、 HTML Helpとしてドキュメントを見る事ができますね。

生成されたHTML Helpドキュメント

インターネット経由で APIリファレンスを見るのも良いですが、どうしてもインターネットに接続できない場合や
自分で書いたRubyプログラムにドキュメントを付けたい場合なんかにはRDocは重宝します。



普段から RDocを生成することを意識してコメントを書いていると、自然と綺麗なコメントが書けるようになるかもしれませんね。

IEでダイジェスト認証をかけるとエラーになった。

0

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

こんにちはひさしぶりに書きます。

今日は新人プログラマーカツオがはまったdigest認証にまつわるIEのエラーについて書きます。

 自分が担当しているプロジェクトで管理画面に

DIGEST認証をかけることになりました。

ということで頑張って書けたんですけど

FIREFOXだと普通にDigest認証がかかっているのに

どうゆうわけかIEだと認証がかからないわけです。

400 Bad Requestがでました。

ログをみたらこんな感じ

Tue Apr 15 11:19:59 2008] [error] [client xxx.xxx.xxx.xxx] Digest: uri mismatch 
- </admin/tour> does not match request-uri </admin/tour?page=1>  

 何やら調べてみたら

 IE6以前のバージョンでdigest認証を利用するとAuthorizationヘッダの,uri に ?以降のパラメータが含まれずHTTP400のエラーがでてるみたいです。

IEのバグだそうです。IE7では改善されているようですが。

そんなわけで

 <Location /admin>    AuthType Digest 
    AuthName "Enter ID and Password"
    AuthDigestProvider file
    AuthUserFile conf/xxx/.htdadmin
    require valid-user
    BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
  </Location> 

と赤字で書いたところをダイジェスト認証に書いてあげれば

強制的に回避してくれるみたいですよ。

ちょっと自分のメモ書きみたいになってしまいましたが

文章苦手なので許してくださいませ。

ではではまた。

muninのインストール 〜監視ツールって〜

0

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

こんばんわtacchiです。
今まで監視は、nagiosやmrtgを使ってましたが、監視方法の見直しということで色々な監視ツールを試してます。その中で、自分が担当したmuninについて語りたいと思います。

muninをCentOS5にインストール

難しいのかなと思ってたら、凄く簡単でした。

ほとんどの監視ツールの場合、サーバ・クライアントの関係で設定していきます。muninもそれと同じです。

ではまず、監視サーバにインストールしてみましょう!

rpmforgeを利用して、muninをインストールします。

yum –enablerepo=rpmforge install munin munin-node

apache Aliasの設定

apacheのconf以下に作成されるmunin.confに以下の設定をします。※自分が入れた環境だと/etc/httpd/conf.d/munin.confAlias /munin/ /var/www/html/munin/

muninが作成するHTMLの格納ディレクトリの権限変更

chown -R munin:munin /var/www/html/munin

監視するサーバの情報を設定する

/etc/munin/munin.confに以下を追加
[localhost]
address 127.0.0.1
use_node_name yes

クライアントのプロセス起動ユーザ/グループを設定

/etc/munin/munin-node.confに以下を設定user root → user munin

group root → group munin

クライアントのプロセス起動

/etc/init.d/munin start

まとめ

次回は、同ネットワーク内の別サーバの監視設定を書きたいと思います。
mrtgよりインストールが簡単で、グラフが充実してました。。。

Postgres8_3⇔8_1の性能比較してみました

0

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

こんにちは marumoruです。

一部で(自分の周りのみ?)賑わっているPostgres8.3

気が付いたら、Postgres8.1系で止まっていた自分がいましたので

バージョンアップしてみました。

その時の8.1系との性能比較調査を報告しますー。

検証項目

1.pgbenchを使ったtps値比較

2.pgbenchを使ったHOT機能の動作調査

検証端末

OS:Linux Debian
CPU:Pentium4 2.6GHz
メモリ:1GHz

前提

スケーリングファクターを25で設定(250万件のデータ数)
各結果値については、それぞれの条件で10回行い、その平均値を算出
tps値(※)については、including connections establishing の値を取得
設定ファイルについては、ほぼデフォルト値を使用する。  テスト1(pgbenchを使ったtps値比較)

①クライアント数によるtpsの変化調査

pgbench -c XX -t 100 -s 25 pgbench_test

XXの数値を 1~100までのtps値の結果を測定 

結果値

c値    postgres 8.1.4    postgres 8.3.1
  1     228.6493           243.420941
 10    140.781838        236.452233
 50    112.203988        151.948232
100    106.594831        129.845791

★8.1より明らかにtps値が高く

  クライアント値に伴っての値の下がり幅が低いのが分かります。 

②トランザクション数によるtpsの変化調査

pgbench -c 10 -t XX -s 25 pgbench_test

XXの数値を 10~1000までのtps値の結果を測定

結果値

t値    postgres 8.1.4    postgres 8.3.1
  10    452.462072         368.715249
 100    151.04483         328.353416
 500    112.203988         202.543517
1000    104.065397         165.649611

★クライアント値の場合と同様に

  トランザクション値に伴う下がり幅が低いことが分かります。

  このことから、負荷が上がった場合のふんばり具合が向上しているのかな

テスト2(pgbenchを使ったHOT機能の動作調査)

各バージョン毎にpgbenchを実行し、そのデータサイズの結果を取得 

①8.1.4

調査用のデータベースを作成し、以下のpgbenchを実行

pgbench -i -s 10 hot_test

データ投入直後のデータサイズ 

accounts テーブル

SELECT pg_size_pretty(pg_relation_size(‘accounts’));

 pg_size_pretty

—————-

 128 MB

PostgreSQLの物理的なテーブルサイズと有効・無効領域を調べる

SELECT * FROM pgstattuple(‘accounts’);

-[ RECORD 1 ]——+———-

dead_tuple_percent   | 0     <– 不要領域

下のコマンドより、データ更新を行う 

pgbench -c 10 -t 10000 hot_test 

データ更新後のデータサイズ

accounts テーブル

SELECT pg_size_pretty(pg_relation_size(‘accounts’));

 pg_size_pretty

—————-

 141 MB  <– 13MB増加

PostgreSQLの物理的なテーブルサイズと有効・無効領域を調べる

SELECT * FROM pgstattuple(‘accounts’);

-[ RECORD 1 ]——+———-

dead_tuple_percent   | 8.66  <– 不要領域

②8.3.1

8.1.4と同様に調査用のデータベースを作成し、以下のpgbenchを実行

pgbench -i -s 10 -F 90 hot_test 

( ※ FILLFACTORを「90」に設定) 

データ投入直後のデータサイズ 

accounts テーブル

SELECT pg_size_pretty(pg_relation_size(‘accounts’));

 pg_size_pretty

—————-

 137 MB

PostgreSQLの物理的なテーブルサイズと有効・無効領域を調べる

SELECT * FROM pgstattuple(‘accounts’);

-[ RECORD 1 ]——+———-

dead_tuple_percent   | 0  <– 不要領域

以下のコマンドより、データ更新

pgbench -c 10 -t 10000 hot_test 

データ更新後のデータサイズ

accounts テーブル

SELECT pg_size_pretty(pg_relation_size(‘accounts’));

 pg_size_pretty

—————-

 137 MB  <– 増減なし

PostgreSQLの物理的なテーブルサイズと有効・無効領域を調べる

SELECT * FROM pgstattuple(‘accounts’);

-[ RECORD 1 ]——+———-

dead_tuple_percent   | 1.48  <– 不要領域

★FILLFACTORの設定により初期時のデータサイズは、8.3.1の方が高い

  結果となっていますが、更新後のデータサイズが、8.3.1では増減がないことが分かる。不要領域についても数値を見れば明らかな結果ですね。

すげー8.3

Rubyでどう書く?:連続した数列を範囲形式にまとめたい

0

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

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

Rubyでどう書く?:連続した数列を範囲形式にまとめたい   三浦義太郎(KBMJ)

「連続した数列を範囲形式にまとめたい」と題しまして、並んだ数字を確認用にわかりやすくする為に、ソートされた数字の列をハイフンで繋ぐ方法を解説したいと思います。

問題

 並んだ数字を確認用にわかりやすくする為に、ソートされた数字の列をハイフンで繋ぐにはどうすればよいでしょうか?

 数列は見づらいものです。ただ数字を並べているだけでは、ソートしてもどの数字が抜けているかを判断するために、順に目で追ってチェックする必要があります。

 ruby ではそういった配列をわかりやすく表現する為に「1…3」と表現する方法が用意されているのですが、利用者は、「1 2 3 5」というような数字の羅列を入れてくるかもしれません。さて、rubyでこれらをハイフンで繋ぐためにはどのように処理する必要があるでしょうか。

仕様

  • 数値は、半角スペースで区切られた文字列で渡されます。
  • 続いている部分は、最初の数値と最後の数値を-(ハイフン)で繋いだ表記にします。
  • 連続が1回の場合(前の数も後ろの数も連続でない)は、-(ハイフン)では繋ぎません。
  • 出力は、「,」(カンマ)と半角スペースで区切られた文字列でなければなりません。

  • “1 2 3” => “1-3.”
  • “1 2 3 5 7 8” => “1-3, 5, 7-8.”
  • “1 3 4 5 7” => “1, 3-5, 7.”

回答例

a = $*[0].split(‘ ‘).map{|i|i.to_i}+[nil]
i = a[0]
p a.inject([a[0].to_s]){|r, v|
  if i != v
   r << r.pop + “-#{i-1}” if 2 <= i – r.last.to_i
   break r unless v
   i = v
   r << i.to_s
  end
 i +=1
 r
}.join(‘, ‘)+’.’

判 定用の変数を配列の値と違うものになるまで増分していき、連続を判定しています。連続でなくなった段階で配列の値を出力用の配列と判定用の変数に入れて 同様の処理を繰り返していきます。判定用の変数の値と出力用の配列の最後の値(連続開始の値)の差が2以上の場合に「-[数字]」の文字列を追加します。

  • $*にはコマンドライン引数の値の配列が入ります。
  • injectは以前のブロックの実行結果を引数と受け取って順次処理していくことができる関数です。あまり使われていないようですが、結構便利な関数です。

p [1,2,3,4,5].inject(0) {|result, item| result + item } => 15

 ほかによい方法があればコメントしてみてください。 (コメントはこちら

docomo の罠

0

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

こんばんは、O2です。

モバイルサイトを作っていて、疑問に思っていたことが遂に解決したのでちょっぴり紹介

ドコモで読み込み直後に、下キーを押していると、なぜか「止まる」

しばらくすると、「進む」という現象が出ていたので、きっとドコモの仕様なんだと思っていました。

ところが

イメージタグで、<IMG SRC=”ファイル名”> とだけ書くと、その直前でスクロールが止まってしまう事が解りました。

解決方法は、width と height を指定することでした(TωT)ウルウル

携帯サイトなので、width だけは記述してたんですけどね( ̄へ ̄|||)

イメージが読み込み完了するまで、スクロールしないんですよ。

ローカルで動画変換をする方法

0

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

こんにちは。mimiです!

携帯サイトの開発において、動画をキャリア別に変換する作業が発生すると思いますが、
今回は、ローカル環境で、携帯向け動画を変換する方法を紹介したいと思います。

★環境
Windows XP

★インストール

携帯動画変換君
http://www.forest.impress.co.jp/lib/home/ktai/ktaipic/keitaidouga.html

これをインストールすると、動画変換用フリーソフトFFmpegも一緒にインストールされます。
これで動くのであれば、問題ありません。

ただし、落とし穴。


Unknown codec ‘libfaac’
Unknown codec ‘libamr_nb’

のようなエラーが出たら、注意が必要です。

もともとついてくるFFmpegでは、-acodec libfaac、-acodec libamr_nbが対応していません。
これらを使いたい場合には、
リビジョン9260以降のFFmpegに入れ替える必要があります。

新しいFfmpegをダウンロードしたら、ffmpeg.exeとpthreadGC2.dllを
携帯動画変換君の3GP_Converter034フォルダ→coresフォルダ内に貼り付ければ、OK。

以上で、エラーは回避されます。

どうぞお試しを。

rake db:migrate すると undefined method `last’ for {}:Hash と出る

0

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

こんにちは。mugiです。今回もエラー系です。

ある日、某サーバで rake db:migrate を実行したら、

rake aborted!
undefined method `last’ for {}:Hash

エラーが出ました。 

どうやらrakeのバージョンが上がりすぎているらしいです。

gem list rake 

*** LOCAL GEMS ***

rake (0.8.1, 0.7.3, 0.7.1)

0.8.1を消します。

gem uninstall rake –version 0.8.1 

gem list rake

*** LOCAL GEMS ***

rake (0.7.3, 0.7.1)

消えました。これで rake db:migrate できるようになります。

MySQL最大バッファサイズの設定

0

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

こんにちはoneafter999です。

今回はMySQLの最大バッファサイズの設定方法をご紹介します。

はじめに

MySQLでデータ量の大きいダンプファイルなどをリストアしようとする時、
MySQLのメモリ割り当て量が小さいとエラーがでてしまう場合があります。
その場合MySQLの最大バッファサイズを増やすことが必要です。

my.cnfで設定

/etc/my.cnfのmax_allowed_packetを任意の値に設定します。
※my.cnfの場所は環境によって異なる場合があります

setコマンドで設定

何らかの原因でmy.cnfが無い、
または一時的にメモリ割り当てを増やしたいなどの場合は、
MySQLコマンドのset max_allowed_packetを使うと便利です。

MySQLにログインし、


mysql> set global max_allowed_packet = 10484736;

と入力します。
この例だと大体10Mに設定されます。
このset max_allowed_packetコマンドで設定したメモリ量は、
次の再起動まで有効となります。

確認

では次にちゃんと設定が反映されているか確認してみましょう。


mysql> show variables

でMySQLの設定一覧が表示されます。
その中で、
| max_allowed_packet              | 10484736
などのように、自分が設定した値が反映されていればOKです。

railsのand/orを使った機能

0

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

railsのコーディング時にちょっと使える初心者向けのtipsです。

andやorを使って、if文や代入文を効率的に使いましょう。

仮に 

@user = User.find(:first, :conditions => [“id = ?”, params[:user_id]])

if @user.name.blank?

  render :text => “ユーザー名が空白です”

end 

というようなプログラムがあったとします。

 このままだと、params[:user_id]にuserと一致するデータがない場合、

@userがなくて、エラーが発生してしまいます。

というわけで

if @user and @user.name.blank?

とすると、@userがnilの場合、andの前で既にnilになっているので、

後部の式が評価されません。

こういう風に、and/orは慣れるとプログラムの効率があがります。

というわけで、もうちょっと詳しく解説してきます。

andの機能は、左辺を評価して、結果が真だったときは右辺の値を評価し、

右辺の値を返します。

 true and true #=> true

 true and false #=> false

実は、これは、右辺の値を返しているのです。

 true and 1 #=> 1

 1 and true #=> true

 左の方がnil,falseでなければ、右の値を帰すため、 

    @name = @user and @user.name

という使い方もできます。

    andの演算子の優先順位の関係で&&にする必要があります。

     @name = @user && @user.name

この場合、@userがnilの場合には@nameにはnilが入り、

@userがある場合は@user.nameを代入する事になります。

そして、この逆の性質として、orがあります。

 1 or 2 #=> 1

 false or 2 #=> 2

 false or false #=> false

 これを利用すると、名前がないときには、名無しと代入する方法が

作れます。

 @name = @name or “名無し”

 @name = @name || “名無し” 

 @nameがnilでない場合は、@nameがそのまま保存され、@name がないときだけ”名無し”が登録されます。

 or は||として書くことができ、演算子として上の式省略すると

 @name ||= “名無し”

 ともかけます。

railsだと

 @use_id = params[:user_id] || @login_user.id

と、する事で、userの指定があれば、そのuser_idで検索し、

いなければlogin_userのidで検索するという構文をかけます。

 if params[:user_id]

   @user_id = params[:user_id]

 else

   @user_id = @login_user.id

 end

みたいに書くよりは簡略化できます。

3項演算子の

  @user_id = params[:user_id] ? params[:user_id] : @login_user.id

よりも効果的です。

普通に and / or を使える様になると細かい所で便利なので、ぜひ覚えましょう。

最近人気な記事