ホーム ブログ ページ 57

MyISAMテーブル(Sennaを使った全文検索など)を利用している場合にテストでこけた場合の対処法

0

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

ご無沙汰しています。KBMJのプログラマのx5rです。

今回は、MySQL+Sennaを利用したプロジェクトでrspecでテストを実行したところ、エラーが発生したため、その対処法を書いてみます。

環境

  • OS : Mac OS X 10.5.8
  • Rails : 2.2.3
  • MySQL : mysql5 @5.0.45_0+innodb+senna+server+utf8(MacPorts)

対象となるテーブルのマイグレーションは


class CreateSearches < ActiveRecord::Migration
  def self.up
    create_table :searches, :options => "ENGINE = MYISAM" do |t|
      t.text     :description
      t.timestamps
    end
    add_index :searches, [:description], :fulltext => true
  end

  def self.down
    drop_table :searches
  end
end

だいたいこんな感じです。(この記事用に想定しているテーブルです。実際にこのテーブルでは試してません.)

今回のプロジェクトでMySQL+Sennaによる全文検索テーブルを利用しているのですが、いざrspecでテストを流してみると以下のようなエラーが発生しました。(実際にこのテーブルでは試してません.)


$ rake spec
rake aborted!
Mysql::Error: The used table type doesn't support FULLTEXT indexes: CREATE FULLTEXT INDEX  `index_searches_on_description`  ON searches (`description`)

(See full trace by running task with --trace)

原因は、まだ開発初期段階でmigrationファイルがいたずらに増えるのがイヤで


$rake db:migrate:reset RAILS_ENV=test

などでテーブルを再生成していたのですが、このrakeコマンドはテーブルのスキーマ情報をダンプ、ロードして作り直しているのですが、その際にテーブルのengineを意識して作り直していないことです。

したがって、ダンプする際に、engineオプションも吐き出すようにすれば良さそうです。

そこで力技ですが、以下のパッチ的なものを書いてみました。
今のところうまく通っています。

要は30〜33行目でengineタイプがMyISAMの時にその情報もダンプに出力するように、activerecord-2.2.3/lib/active_record/schema_dumper.rbのtableメソッドを書き直しているだけです。

このファイルをconfig/initializers直下におけば、毎回ロードされて、正しくテーブルが作り直され、spec(テスト)が通るようになります。
全文検索云々ではなく、MyIASMを利用している環境でエラーが発生している場合は、お試しください。

そもそも、この状況って皆さんは遭遇してなかったりしないのですかね?
バグじゃないのかと思ったりしたのですが。。。
もし、この状況について、他に簡単な方法などをご存知の方やそもそも私の認識が間違っていましたら、ご連絡いただければと思います。

Solaris10でパッケージ管理

0

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

Solaris10自身でも従来のpkgaddなどによるパッケージ管理は健在なのですが、Sun自身がサポートしているソフトウェア以外のものを使いたくなった場合や、個別にパッケージを導入するのは以外と不便です。Linuxではyumやaptがありますが、Solaris10はそういうの無いんでしょうか?

と思ったらありました。pkgutilといいます。

これをインストールする事で様々なパッケージが利用できるようになります。

基本的な使い方は以下の通りです。

パッケージ情報の取得・更新# pkgutil -U
インストール可能なパッケージの一覧表示# pkgutil -a
インストール可能なパッケージの説明表示# pkgutil -D
インストール可能なパッケージの検索# pkgutil -D キーワード
インストール済みパッケージとカタログのバージョン比較# pkgutil -c
パッケージのインストール# pkgutil -i ソフトウェア名
インストール済みパッケージのアップグレード# pkgutil -u
インストール済みパッケージのアップグレード(確認省略)# pkgutil -f -u
インストール済みパッケージの削除# pkgutil -r ソフトウェア名

Rakeタスクを追加する

0

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

こんにちは。T氏です。

今日は自作のRakeタスクを追加する方法をご紹介します。

Rakeタスクを追加するには、まず [RAILS_ROOT]/lib/tasks にsample.rakeファイルを作成します。

ファイルの中身の記述に関しては、

desc “説明文”

task “実行タスク名” do … end または => [“Rakeコマンド”]

の2つをワンセットで書けばタスクが追加されます。

ではsample.rakeファイルにタスクを書いてみます。内容は下記になります。

それぞれ、hello world!と表示するコマンド、db:drop,db:createを実行するコマンド、db:migrate,db:fixtures:loadを実行するタスクとなります。

# [RAILS_ROOT]/lib/tasks/sample.rake

# rake hello_world
desc "print hello world!" # description.
task "hello_world" do # rake task name.
   p "hello world!" # print "hello world!"
end

namespace :sample do
  # rake sample:drop_and_create
  desc "drop and create db task."
  task "drop_and_create" => ["db:drop", "db:create"]

  # rake sample:migrate_and_fixtures
  desc "migrate and fixtures load task."
  task "migrate_and_fixtures" => ["db:migrate","db:fixtures:load"]
end

では、実際に追加されているか試してみましょう。

$ rake --task
(省略...)
rake hello_world                                      # print hello world!
(省略...)
rake sample:drop_and_create                   # drop and create db task.
rake sample:migrate_and_fixtures             # migrate and fixtures load task.
$ rake hello_world
"hello world!"

Rakeタスクが追加されている事、実行された事が確認できましたでしょうか。

皆さんも是非お試し下さい。

多対多の関係について

0

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

海です。

railsのテーブルの多対多の関係について参考資料がすでに十分だと思いますけど、

ここで初心者向けにもう一度まとめます。

◆多対多の関係というのは

例えば、管理サイトのアカウントを作成して、そのアカウントは権限機能を持っています。

持っている権限機能によりアカウントができる操作も異なります。

アカウントテーブル(account.rb)と権限機能テーブル(function.rb)は多対多の関係です。

多対多の関係では、上記図のように結びついているように扱えますが、実際には結合テーブル(account_functions)が必要になります。

◆多対多の関係の使用について

モデル:

account.rbには has_and_belongs_to_many :funtions

function.rbには has_and_belongs_to_many :accounts

また、account.rbには下記のように追加

  def chang_functions(selected_functions)
    function_ids = selected_functions.keys.collect {|key| key.to_i}
    self.functions = Function.find(function_ids)
  end

コントローラ:

二郎というアカウントを作成するとき、下記のように使用すれば、

二郎のデータをaccountsテーブルに挿入される同時、

二郎が持っている3つ権限機能もaccount_functionsテーブルに挿入されます。

@account= Account.new(params[:account])

if @account.save
      @account.chang_functions(params[:functions] || {})
      flash[:notice] = “データが保存しました。”
      redirect_to :action => :index
else
      #エラーがある場合

         :
end

簡単な説明ですが、ご参考になれれば。。。。。。。。…

dRubyについて

0

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

こんにちわ。wryyyです。

久しぶりのブログ更新です。

さて、今回はRubyのメソッドを拡張したdRubyについて書いていきたいと思います。

【dRubyとは何か?】

Rubyのメソッド呼び出しを拡張し、ネットワーク越しにメソッド呼び出しを行なえるようにするライブラリです。

【Hello, dRuby】

では、実際に「習うより慣れろ!」ということで、早速「Hello, dRuby」を印字するプログラムを見ていきましょう。

※実際の動作確認ではターミナルを2つ使用します。

<ターミナル1>
#server.rb require 'drb/drb' class Puts def initialize(stream=$stdout) @stream = stream end def puts(str) @stream.puts(str) end end uri = ARGV.shift DRb.start_service(uri, Puts.new) puts DRb.uri sleep

上記プログラムは、サーバとなります。

サーバを起動させてみます。

ruby puts.rb druby://localhost:12345

続いてクライアント側で実験をしていきたいと思います。

<ターミナル2>
irb irb(main):001:0> require 'drb/drb' => true

irbからまず始めにdrbをrequireします。続いて

irb(main):002:0> there = DRbObject.new_with_uri('druby://localhost:12345') 
=> #

DRbObject.new_with_uri はURIを指定してオブジェクトの参照を返します。

引数にはサーバ側で指定したURIを指定します

irb(main):003:0> there.puts('Hello, World.') 
=> nil

putsでサーバ側に「Hello, World」を入力しました。

サーバ側で「Hello, World」が入力されているか確認してみましょう。

<クライアント1>
druby://localhost:12345
Hello, World.

どうでしょう?サーバ側で「Hello, World」が確認できたでしょうか?

お分かりの通り、dRubyはクライアント側からサーバ側のメソッドを読み出し、サーバ側で処理を行わせることができるのです。

ここまでのやり方ですと、クライアント側はirbで実行させましたが

rubyのスクリプトを書いて実行させることも、もちろんできます。

#client.rb
require 'drb/drb'

uri = ARGV.shift
there = DRbObject.new_with_uri(uri)
there.puts('Hello, World')

上記スクリプトはirbで以前に打ったものとほぼ一緒ですね。

実際にclient.rbを実行させてみましょう。

<ターミナル2>
ruby client.rb druby://localhost:12345
<ターミナル1>
Hello, World

と表示されるはずです。

このようにサーバとクライアントを分けて、ネットワーク越しにメソッドを呼び出し

処理を行えます。

ここまで、単純な形でしたが、これ以外にもスレッド処理等複雑な処理も

行えますので、お試しください。

PostgreSQLで正規表現にマッチした文字の抽出

0

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

PostgreSQLでも正規表現を使える、なんてことできるんですよねっ
ってわけで、今回はそれを踏まえて正規表現にマッチした文字列を抽出しようと思います。
なんてこたぁない。

SELECT
  SUBSTRING(mobile_email FROM '(docomo|softbank|ezweb)') AS carrier2
, carrier
FROM
   users
;

これで、あるテーブルを用意し、実行結果をみると、

 carrier2 | carrier  
----------+----------
 docomo   | DoCoMo
 docomo   | DoCoMo
 ezweb    | au
 softbank | SoftBank
 softbank | SoftBank
 ezweb    | au
 docomo   | DoCoMo
 docomo   | DoCoMo

のように並びました。
上記のSQLでは、携帯のメールアドレスからdocomo、softbank、ezwebのいずれかにマッチした かどうかを見て、()内の正規表現にマッチしている文字列を記憶して、carrier2として取得しています。

これ、実は、登録されているキャリアとメールアドレスのドメインの整合性がとれているかどうかをチェックしようと思って作ってみました。

上記の内容がわかりにくいでしょうか?
Rubyで書いたら

/(docomo|softbank|ezweb)/ =~ mobile_email
p $1

といったところでしょうか。
これならピンときました?

WEBサイトのコンバージョンを増やす方法

0

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

こんにちは。アクセス解析チームの大山です。

サイトのコンバージョン数を上げるための施策として思いつくのは
リスティング広告の出稿・SEO業者に外部SEO依頼し、
まずは流入数を伸ばすことが一般的ではないでしょうか。


これらの施策の効果は非常に高く、優良なユーザーを引き込むことができるため
コンバージョンが上がる可能性の高い施策となります。

しかし、継続して効果を得るためにはそれなりの費用が発生します。

「費用対効果はできるだけ高いほうがいい。
  費用はあまりかけたくない」

これを解決するためには、サイト内の改善に目を向けることにあります。


たとえば、ECサイトの内部を大きく分けると「流入」「回遊」「カート内送客」「コンバージョン」と見ることができます。
これらを訪問者数の遷移で図化してみました。
流入からの直帰率、コンテンツからの回遊からの離脱、カート内総客からの離脱を得て、最終的なコンバージョンはどれほどなのかが一目でわかります。

図1


冒頭で述べた通り、リスティング広告の出稿・SEO業者に外部SEOの依頼をすることは流入が増加し、
コンバージョンを上げるきっかけにもなるでしょう。
しかし、流入が増えるのと同時に、目的の異なるユーザーまで引き込んでしまう可能性があります。
リスティング広告であれば優良なユーザーの引き込む以上に無駄クリック分の費用が発生し、直帰率・離脱率は悪化。
流入、回遊、カート内送客での遷移確立を引き上げる施策が必要となり、最終的に費用が多くかかってしまうこともあります。

図2


このような事態を防ぐには、まずはサイト内改善から確実に行うことが大切です。
アクセス解析を行い、数値を元にサイト内の問題点を洗い出します。
例えば、「回遊」部分に問題があり、改善部分を特定できれば、
少ない修正で離脱を減らしコンバージョンを伸ばすことも可能となります。

図3

遷移途中で取りこぼしの少ないサイトであるからこそ、リスティングやSEOにより流入数が増えた際に本当の効果が生まれると考えています。

部屋が汚いのに意中の人を連れてくるなんてこと、もったいないと思いませんか?
せっかく連れてくるのであれば、最善の状態でお迎えしましょう。

そうすることでより確実な売上を上げる確立はアップするのではないでしょうか。

■バックナンバー・‥‥━━★

■アクセス解析関連記事・‥‥━━★

PostgreSQLでクロス集計

0

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

こんにちは、sasimiです。
ユーザの属性情報を分析したい、という場合がよくあります。
例えば、キャリア毎に男性と女性の割合を表示したい、など。
そんな場合には、クロス集計が便利です。

 キャリア | 男性 | 女性 
----------+------+------
 au    |      |    
 softbank |      |    
 docomo   |     |    

こんな風に集計した結果を表示することを目指します。

まずはデータを用意しましょう

test=# create table users ( carrier varchar(10), sex varchar(1), created_at timestamp default now());  
test=# insert into users (carrier, sex) values ('docomo', 'm');
test=# insert into users (carrier, sex) values ('docomo', 'f');
test=# insert into users (carrier, sex) values ('docomo', 'f');
test=# insert into users (carrier, sex) values ('au', 'm');
test=# insert into users (carrier, sex) values ('softbank', 'm');

では、早速、クロス集計をしてみたいと思います。

SELECT
  carrier as キャリア
, sum(case when sex='m' then 1 else 0 end) as 男性
, sum(case when sex='f' then 1 else 0 end) as 女性
FROM
  users
GROUP BY
  carrier;

実行結果は

 キャリア | 男性 | 女性 
------------+------+------
 au            |    1   |    0
 softbank |    1  |    0
 docomo  |    1  |    2

これで目的どおりのものを表示できました。
さて、Excelなどでピボットテーブルなんて便利な機能がありますよね。
項目を入れ替えたりすると集計しなおす便利な機能です。
では、性別とキャリアを入れ替えてみましょう。

SELECT
  case when sex='m' then '男性'
       when sex='f' then '女性'
       end as 性別
, sum(case when carrier='docomo' then 1 else 0 end) as ドコモ
, sum(case when carrier='au' then 1 else 0 end) as au
, sum(case when carrier='softbank' then 1 else 0 end) as ソフトバンク
FROM
  users
GROUP BY
  sex;

ちょっとだけ、表示をわかりやすくするために、性別カラムで男性、女性と表示するようにしました。

 性別 | ドコモ | au | ソフトバンク 
------+--------+----+--------------
 男性 |      1   |  1   |            1
 女性 |      2   |  0   |            0

いかがでしょうか?
クロス集計は集計するときに便利な機能です。 是非、利用してみてください。

Rails のエラーページから問題のファイルを1クリックで開く for Windows

0

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

Rails のエラーページにはありがたいことにスタックトレースが表示されていますが、どうせならそこに書かれたファイル名をクリックするだけでエディタが開くようにしてしまおうという作戦です。

手順は以下の3ステップです 。

  1. スタックトレース中のパスをうさんくさい URL にリンクさせる
  2. うさんくさい URL を使ってエディタを起動できるようにする
  3. うさんくさい URL のプロトコルを扱えるよう Windows に教えてやる

スタックトレース中のパスをうさんくさい URL にリンクさせる

Greasemonkey を使って app/ で始まっている文字列をファイルパスとみなし、リンクを作ります。

editor という勝手に決めたプロトコルを使って、editor:///エラーが/発生した/ファイル.rb?行番号 というようなうさんくさい URL にリンクしてやります。

// ==UserScript==
// @name           rails trace: link to editor
// @namespace      http://userscripts.org/users/59751
// @include        http://colinux:3000/*
// ==/UserScript==

(function() {
  if (document.title != "Action Controller: Exception caught") return;
  var railsRoot = document.body.innerHTML.match(/RAILS_ROOT: ([^\s&]+)/)[1];
  if (!railsRoot) return;
  // samba のマウントポイントに合わせて書き換える
  railsRoot = railsRoot.replace('/home/sugimoto', '/l');
  var pattern = /(app\/[^:]+):(\d+)/g;
  document.body.innerHTML = document.body.innerHTML.replace(pattern, function(all, path, line) {
    var fullPath = railsRoot + "/" + path;
    return '&a href="editor://'+fullPath+'?'+line+'">'+all+'&/a>';
  })
})()

ダウンロード

うさんくさい URL を使ってエディタを起動できるようにする

editor URL にアクセスした時に実行するプログラムを作ります。せっかくなので Ruby で作ってみましょう。

#!/usr/bin/env ruby

require 'uri'
u = URI.parse(ARGV[0])
# Cygwin パスから Windows パスに変換。
# Cygwin を使用していない場合は適当に読み替えてください。
path = `cygpath -w "#{u.path}"`.chomp
system('C:/app/xyzzy/xyzzycli.exe "%s" -go %s' % [path, u.query])

うさんくさい URL のプロトコルを扱えるようWindows に教えてやる

これだけだとリンクをつついても、editor というプロトコルはどのプログラムにも関連づけられておらず…… と言われて悲しい思いをするだけなので、レジストリに以下のエントリを追加してやります。

[HKEY_CLASSES_ROOT\editor]
@="URL:editor Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\editor\DefaultIcon]
@="\"C:\\app\\xyzzy\\xyzzy.exe\",0"

[HKEY_CLASSES_ROOT\editor\shell]

[HKEY_CLASSES_ROOT\editor\shell\open]

[HKEY_CLASSES_ROOT\editor\shell\open\command]
@="\"C:\\cygwin\\bin\\ruby\" \"C:\\home\\sugimoto\\bin\\run-editor.rb\" \"%1\""

ダウンロード

ファイルを開けば上記内容を追加できますが、内容は環境に合わせて変更してください。

おめでとうございます

リンクをつつくと……

エディタが開く!

chmodでファイルのパーミッションを再帰的に変更する

0

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

chmodは、ファイルのパーミッションを変更するコマンドです。
このchmodで、特定ファイルのみ再帰的にパーミッションを変更する方法を説明します。

そもそもオプションで
 -R
 ディレクトリやそこに含まれるもののアクセス権を再帰的に変更する。
というそれっぽいものがあるのですが、このオプションはディレクトリに含まれるすべてのファイル、
サブディレクトリのパーミッションを変更するため、あまり使えません。

chmodで再帰的にファイルのパーミッションを変更するには、以下のようにします。
find ./ -type f -print | xargs chmod 644

特定のファイルのみ、の場合はこのようになります。
find ./ -name *.rhtml -type f -print | xargs chmod 644
(ほかにも色々方法はあるようです)

JavaScriptでRubyのsend的なことをしてみる

0

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

 こんにちは。

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

 今回はRubyの開発で僕がよく使うsend的なことをJavaScriptでやる方法を紹介したいと思います。

 早速サンプルコードを紹介します。

01 <html>
02 <head>
03 <%= javascript_include_tag 'prototype' %>
04 <%= javascript_tag %Q{
05 var testObj = {
06 a: function (){
07 alert('a called!');
08 },
09
10 b: function (){
11 alert('b called!');
12 }
13 }
14
15 function execute(event){
16 testObj[$F(Event.element(event))]();
17 }
18 }%>
19 </head>
20 <body>
21 <from>
22 <%= radio_button_tag 'funcName', 'a', true, :id => 'funcNameA' %>a
23 <%= radio_button_tag 'funcName', 'b', false, :id => 'funcNameB' %>b
24 <%= javascript_tag %Q{
25 Event.observe('funcNameA', 'click', execute);
26 Event.observe('funcNameB', 'click', execute);
27 }%>
28 </form>
29 </body>
30 </html>

 一応Railsエンジニアなので、コードがRailsなのはご容赦ください。

 肝心のところは、16行目の

testObj[$F(Event.element(event))]();

の部分ですね。

 サンプルは、ラジオボタンの値の取得処理でゴチャっとなってますが、

testObj[実行したい関数名]();

ということです。

 まあ、testObj[実行したい関数名].call()でも同様なことができるんですけどね。試しにcall使わない方法をやってみたらできたので、こっちを紹介させていただきました。もちろん引数がある関数に引数を渡すこともできます。

 ちなみに、IE7,IE8,Firefox3,Firefox3.5でのみ確認しています。もしかしたら、ブラウザによっては使えないかもしれません。もし、動作確認していただけたならコメントでお知らせしていただければと思います。

 それでは。

プレイスホルダの扱いがちょっと楽になる@PHP

0

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

■プレースホルダ

SQL文作成時に、 実行時に値が決まる部分を「?」に置き換えて、

「?」に当てはめたい値を変数とか配列で指定します。

そうすると、SQLインジェクション対策のためのエスケープ処理を自動で行ってくれます。

————————————

 $id = 6; $sql = select * from t_bbs where id = ?;

 query($sql, $id);

————————————

「?」のところに「6」が入ります。 プレースホルダの使い方はこんな感じです。さくっといきます。

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

プレースホルダは代入する数だけ「?」を適切な箇所に用意する必要があります。

例えば、上記の例を少し複雑にして、 複数のid値と一致したものをt_bbsから取得したいとします。

id値の数が固定なら頑張って下記のようにできますが・・・ スマートではありません・・・

$sql = select * from t_bbses where id = ? or id = ? or id = ?;

そこで、複数のid値を配列に格納して、かつその格納した数だけ「?」を生成してあげましょう。

$id = array(1,2,3); $holder = implode(‘, ‘, array_fill(0, count($id), ‘?’));

count()で配列の中身の数を取得し、

array_fill()により、0番目から配列の中身の数だけ「?」を挿入します。

implode()により、「?」と「?」の間に「,」を挿入します。

そうすると、出来上がりは、$holder = (?, ?, ?)となります。

$sql = select * from t_bbses where id IN ($holder); query($sql, $id); IN句を使ってまとめてあげると、すっきりしたSQL文の完成です!

【テーマ: 背景に透過PNGを使ってデザインの幅を広げる】

0

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

【テーマ: 背景に透過PNGを使ってデザインの幅を広げる】

【使用するモノ: Photoshop css javascript】

それでは早速やってみます。

(1)headerにてalphafilter.jsを読み込みます。

(2)該当のdivに、class=”alphafilter”を付与します。

(3)つぎにcssにて、該当のIDにスタイルシートを指定します。

#base_cont {
width:890px;
margin: 0 auto;
padding: 0 10px;
text-align: left;
background: url(../images/common/parts/bg-wra.png) repeat-y left top;
}
その後、IE6用に指定。
* html #base_cont { /* for ie6 */
width:890px;
margin: 0 auto;
padding: 0 10px;
text-align: left;
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader (src=”../images/common/parts/bg-wra.png”, sizingMethod=”image”);
}

以上、「背景に透過PNGを使ってデザインの幅を広げる」でした。

が、ほかのjavascriptで動かなくなるものが発生する時があるので、使用するときはよほど必要な時のみにしたほうがいいと思われます。

rubyでパスワードを自動生成するプログラムの紹介

0

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

こんにちは、KBMJの中平@railsエンジニアです。

今回はrubyでパスワード生成する方法を書きたいと思います。

これは、私がユーザー登録のプログラム作成時などで、自動的にランダムな文字列のパスワードを生成する際に使っているrubyのパスワード生成コードを紹介いたします。

みなさんの参考になれば幸いです。

rubyのソースコードは以下になります。
  pass_size = 12
  a = (‘a’..’z’).to_a + (‘A’..’Z’).to_a + (‘0’..’9′).to_a
  password = Array.new(pass_size){a[rand(a.size)]}.join

簡単にソースコード説明いたしますと

まず、パスワード生成に使用する文字を配列に格納します。(今回は英数字)

それを、パスワード登録で必要な文字数分(ここでは12文字)配列からランダムに一文字ずつ取得し、

別配列に入れた後、 それを文字列に変換しているだけの単純なプログラムになります。

パスワード生成はいろいろやり方はあると思いますが、

これはrubyでの一例になりますので、参考にしていただければと思います。

ActiveRecordでupdated_atを更新せずにテーブルを更新させる

0

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

こんにちは。KBMJの本多です。

今回はテーブルの更新日付を変更することなくテーブルの中身を変更する方法を紹介します。やり方は以下の通り。

例:)変更するテーブル名が「tables」、Model名が「Table」の場合

table = Table.find(:first, (中略))
(tableの中身を修正)
table.record_timestamps = false ←※
table.save

一括で変更する場合は

tables = Table.find(:all, (中略))
tables.each do |table|
  (tableの中身を修正)
  table.record_timestamps = false ←※
  table.save
end

このように、データの保存前におまじないをかけるだけです。
バッチ等でテーブル内のデータを修正したいけど、更新日付を変えたくない時に使ってみてください。

GOOD RAILS!!

mongrelのinstallと設定と起動の方法

0

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

ども、rick No.15です。
今回はmongrelの
・install方法
・設定方法
・起動方法
・停止方法
なんかを紹介します。

mongrel install

$ gem install mongrel
$ gem install daemons
$ gem install mongrel_cluster

mongrel設定

$ vim config/mongrel_cluster.yml
——————————
# portの数を変えたいときは
user: test
cwd: /var/www/test # ソースの場所
port: “3000” # ここでportの番号を変更する
environment: production
group: test
pid_file: log/mongrel.pid
servers: 5 # ここでportの数を変更する
—————————————

起動

$ mongrel_rails cluster::start

停止

$ mongrel_rails cluster::stop

再起動

$ mongrel_rails cluster::restart

mongrelの数が一個だけでいい場合は
$ ruby script/server
———————————————————————————————-
./script/../config/boot.rb:26:Warning: Gem::SourceIndex#search support for String patterns is deprecated
=> Booting Mongrel (use ‘script/server webrick’ to force WEBrick)
=> Rails application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment…
———————————————————————————————-

と起動すればOK
webrick (毎回設定ファイルを再読込み)で起動したい場合は
$ ruby script/server webrick
———————————
=> Booting WEBrick…
~
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with –help for options
[2009-10-22 12:11:34] INFO WEBrick 1.3.1
[2009-10-22 12:11:34] INFO ruby 1.8.6 (2008-08-11) [universal-darwin9.0]
[2009-10-22 12:11:34] INFO WEBrick::HTTPServer#start: pid=684 port=3000
———————————

と起動すればOK
以上〜。

SQLiteの使い方

0

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

Rails2系からはデフォルトのデータベースになっている SQLiteについてです。 MySQLやPostgreSQLとはちょっと扱いが違います

SQLiteは常駐しているわけではなくファイル単位でデータを管理しています。 1ファイル1データベースでアプリケーションに組み込む形で使います。 起動は以下のコマンドでできます

sqlite3 dbname.db

dbファイルが存在しなければ新規に作成されます。 プロンプトがsqliteになるとSQL文が使えます。 以下はSQLite特有のドットコマンドになります。 ヘルプを見る

.help

利用しているデータベースのパスを表示

.databases

現在のデータベースのテーブル一覧

.tables

現在の設定を表示

.show

プロンプトの表示を変更(デフォルトはsqlite)

.prompt

Flashの変更の反映がうまくいかない時

0

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

サイトを作っていると、画像を変更したのに変更が反映されない!という事態に遭遇したことがある人も多いはず…。

その場合あわてずに更新ボタンを押せば大抵が解決したかと思います。

しかしFlashの場合は更新ボタンでは解決しないこともあるのです。

ネットワークの環境によってすぐに変更が反映される場合もあれば、されない場合もあります。

弊社からはすぐに確認が出来てしまうため、クライアント様から「変更が反映されていない」と連絡があって初めて気が付くということも…。

まずはキャッシュをクリアすれば解決します。

開発中などはそれでも問題はありませんが(少々手間ですが)本番運用に入るとそういうわけにもいきません。

(エンドユーザー様に「サイトの閲覧の際にはキャッシュをクリアしてください」なんてサイトはありませんよね…)

ファイル名を変更するという解決方法もありますが、 しかし運用上ファイル名を変更したくない場合もあるかと思います。

その場合便利なのがパラメーターです。

Flashファイル名の後に「?」とお好きな数値を付ければ、キャッシュを使用しないでフラッシュを読み込んでくれます。

そのフラッシュの利用箇所が一ヶ所なら、「hoge.swf?0123」といった感じ呼び出せばOK。

フラッシュを変更したら呼び出し元のタグを「hoge.swf?3210」のように変更してください。

もし呼び出し箇所が複数個なら、数時の部分をjavascriptなどでランダム(またはアクセス日付)を付けるように指定しておけば意識することなくフラッシュの変更が出来ます。…

SQL関数coalesceの使い方と読み方

0

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

こんにちは。KBMJの佐藤です。

今回はSQLのcoalesceという関数の使い方と読み方について解説します。

coalesceとは何か?

coalesce は、与えられた引数のうち、NULLでない最初の引数を返してくれます。データを表示する目的で取り出すシチュエーションなどで、NULL値の代わりにデフォルト値を使っている場合に便利です。CASE や NULLIF などを用いても同様の効果が得られますが、coalesce() を使えば、より完結に記述することができます。といっても実際に使ってみないとイメージがわかないと思いますので、以下、実験してみます。

coalesce実験用テーブル・レコード

以下のようなテーブル・レコードを用意しました。

SELECT c1, c2, c3 FROM test1s;
 c1  |   c2   |   c3   
-----+--------+--------
 AAA | BBB    | CCC
 DDD | (null) | FFF
 GGG | HHH    | (null)
(3 rows)

coalesceを使ってみる

では先ほど用意したテーブルに対して、coalesceを使ったSELECT文を発行してみましょう。

SELECT c1, COALESCE(c2, 'QQQ') AS c2, COALESCE(c3, 'QQQ') AS c3 FROM test1s;
 c1  | c2  | c3  
-----+-----+-----
 AAA | BBB | CCC
 DDD | QQQ | FFF
 GGG | HHH | QQQ
(3 rows)

NULL だった場所が QQQ に置き換えられていますね。

coalesceの読み方

coalesceの読み方はカタカナで書くと「コウアレス」に近いようです。

ではまた。

PostgreSQLでの正規表現検索

0

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

こんにちは、cloverです!

先日仕事で、ドコモのシークレットコードに対応する作業があったのですが、その際「電話番号(11ケタ)+シークレットコード(4ケタ)@ドコモ」の4ケタの部分以外の部分のマッチングが必要になりました。

LIKE検索では難しいかなぁと思って先輩に聞いてみたら、何とPostgreSQLには正規表現でのマッチングが出来るとのこと。

というわけで、ちょっと調べてみました~例えば、「090123456781234@ドコモ」というメールアドレスがあって、「09012345678xxxx@ドコモ(xxxxの部分は数値であれば何でもよい)」という条件で、マッチするデータがあるかを調べようとしたとき、
PostgreSQLでは「~(チルダ)」を用いて、正規表現検索を行います。

以下のような感じになります。

select count(*) from users where mobile_email ~ ‘09012345678[0-9]{4}@ドコモ’;

もちろんこれはRailsのfind文などでも使えるので、

User.find(:first, :conditions => [“mobile_email ~ ?”, ”09012345678[0-9]{4}@ドコモ’])

となります。

「\d(数値)や\w(英数字)」などの表現の書き方はまたちょっと違うみたいなので、そのあたりも駆使して使ってみたいと思います☆

透過PNGを使ったボタンの作成

0

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

透過PNGを使って色違いのグラデーションのついたボタンを作る方法を紹介します。
まず、Photoshop等でボタンの大きさに合わせて黒から透明のグラデーションをかけたものを作成します。

(レイヤーの不透明度を50%ほどにし、切り出す幅は横方向にリピートさせるため1pxにします)

そして、以下のように記述します。

XHTML

<a href=”#” class=”button1″>ボタン</a>
<a href=”#” class=”button2″>ボタン</a>
<a href=”#” class=”button3″>ボタン</a>

CSS

 .button1{
  background:url(button.png) #310202 repeat-x left bottom;
  color:#fff;
  padding:10px 20px;
  border :solid 1px;
}

.button2{
  background:url(button.png) #00074D repeat-x left bottom;
  color:#fff;
  padding:10px 20px;
  border :solid 1px;
}

.button3{
  background:url(button.png) #004D02 repeat-x left bottom;
  color:#fff;
  padding:10px 20px;
  border :solid 1px;
}

で表示させると

色違いのグラデーションがかかったボタンの完成。

背景色を変更するだけで簡単に色違いのボタンが作れます。

※IE6では透過PNG画像に対応していない為、別途対策が必要です。

最近人気な記事