2010年2月16日 #diary

マルチタッチがサポートされているマジックマウス、
ついに購入しました。
今のところはまだクリックとスクロールだけデフォルトで使えますが、
そのうちフルパワーを発揮したいと思います。



マルチタッチ以外でBluetoothが使えるのも私にとって大きなポイントです。
今はACアダブタ以外にMacに接続する線などがなくなり
整然とした感じです。
ちなみにクリーニングも大変便利になりそうです。
毛が立ってない布を使って表面を掃除できます。



あとはゲームでもマルチタッチが使えるなら最高。。。

以下写真を御覧下さい。
gallery link="file"

2010年2月15日 #seo

Question

If I have 3 websites, Is there a problem to cross link websites?

Answer by Google Webmaster Central

要はサイト間の"関連性"が一番大事です。
関連性があればOKで、なければ無意味って感じです。

「海外SEO情報ブログ」からの訳文

サイト同士に何らかの関連性があるかが問題だね。

1つがドライクリーニングのサイト、もう1つが古美術のサイト、もう1つが携帯レビューのサイトだとしたら、ページの下にリンクがあるのは奇妙だ。
漫画のサイトを見ていたのに、ページの最後に行ったら自動車保険やコーヒーテーブルのサイトへのリンクが突然出てくるのは、何にも関係がない。

「どのくらい関連性があるのか」をまず先に考えてほしい。

3つのサイトで相互リンクしてもたいした数じゃないから、大きな問題にはならないと思う。
でも、30サイト、300サイトでクロスリンクしていたら、「何の関係があるんだろうか」と一般のユーザーも競合も不思議に思うだろう。

紳士洋服・婦人洋服・子供洋服がクロスリンクしあうのは、関連があるから完全に理由がある。
同じ企業傘下にある会社同士も、正当な理由があるから問題があるとは思えない。
少ない数だったらまだいいかもしれないけど、サイトの規模が大きくなるに連れてページの下に大量のリンクが出現するのは良くないね。

2010年2月12日 #javascript

JavaをやってからJavascriptを触ったので、
Javascript変数にブロックレベルのスコープがないことにビックリしました。
if文ブロックか、forループブロックか関係なく、
function内に定義された変数は全て同じスコープ:functionのスコープになります。

例えば

function test(o) {
    var i = 0;                      // i is defined throughout function
    if (typeof o == "object") {
        var j = 0;                  // j is defined everywhere, not just block
        for(var k=0; k < 10; k++) { // k is defined everywhere, not just loop
            document.write(k);
        }
        document.write(k);          // k is still defined: prints 10
    }
    document.write(j);              // j is defined, but may not be initialized
}

変数kとjはそれぞれif文のブロック、forループのブロック内に定義されたが、
実はfunctionのスコープとなりfunction内ならどこでも参照できます。

これをしっかり理解しないと以下のようなミスが起こしやすいです。

var scope = "global";
function test() {
    alert(scope);         // Displays "undefined", not "global"
    var scope = "local";  // Variable initialized here, but defined everywhere
    alert(scope);         // Displays "local"
}

test();

一番目のalertは"global"だと思ったらこの記事を読む価値はあるでしょう。
一番目のalertは"undefined"を表示します。
なぜならさっき言ったように変数のスコープはfunction内に跨るのです。
varで宣言する位置、順番と関係ありません。

ここではfunction内で同じ名前でscopeという変数が宣言され、
"global"の値を持つグローバル変数は上書きされました。
そして一番目のalert時のscopeは初期化されていないため、undefinedとなってしまいます。

上記のコードを書き換えると以下と同じです。

function test() {
    var scope;       // Local variable is declared at the start of the function
    alert(scope);    // It exists here, but still has "undefined" value
    scope = "local"; // Now we initialize it and give it a value
    alert(scope);    // And here it has a value
}

誤解を招かないように変数の宣言はfunctionの先頭に置くのが大事ですね。

2010年2月 3日 #ruby

Rubyでは変数の型を宣言しないです。
そのため、オブジェクトは実際に何型かがわからない時が多いです。
オブジェクトのクラスを調べるには以下の三つの方法があります。

class

オブジェクトのクラスを調べられます。
返された結果はクラス名です。
例:

"文字列です。".class

出力結果:string

kind_of?

オブジェクトは特定のクラス又はそのサブクラスのインスタンスかどうかを調べられます。
モジュールに関しても、調べられます。
返された結果はtrue又はflaseです。
例:

"文字列です。".kind_of?(String)

出力結果:true

ちなみに、is_a?メソッドもあります。kind_of?の使い方と同じです。

instance_of?

オブジェクトは特定のクラスのインスタンスかどうかを調べられます。
kind_of?との区別は、サブクラスを含まらないことです。
つまり、kind_of?はサブクラスまで調べられますが、
instance_of?は特定のクラスだけ、サブクラスを調べられないです。
返された結果はtrue又はflaseです。
例:

"文字列です。".instance_of?(String)

出力結果:true

2010年1月29日 #javascript

window.open()で新規開いた小窓ウィンドウで親ウィンドウのdocumentを取得するには
下記のプロパティを使います。

window.opener.document

これで親ウィンドウの値を取得するだけではなく、
値を編集することもできます。

例えば下記のコードは親ウィンドwのフォーム内のテキストをAAAに変更します。
新規開いたページに記述します。

window.opener.document.FORM1.TEXT1.value = "AAA";

参考サイト

とほほのJavascriptレファレンス:ウィンドウオブジェクト

2010年1月27日 #seo

HTMLのheadセクションにはタイトルといろんなMetaタグが記述されているが、
その記述順番に気になったことはありますか?
そしてそれがどのような影響があるかぐぐってみました。

headセクション内のタグの記述順に特に決まりはないが、"charset"で示す文字コード指定のタグは、titleタグやmeta description/keywordsタグよりも先に記述することが推奨される。の中身がまさに、文字で書かれ、文字コード判定が必要だからです。

そういえばWordpressを使ってからこの辺全然気にしてないので
早速自分のサイトのheadセクションを確認しました。
下記のようなものです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Kinopyo Blog</title>

なるほど、、metaタグでcharsetがUTF-8になってるから
titleのところのシングルクォーテーションがUTF-8の#039になったわけですね。
考えてみれば当たり前のことだけれど。。。

参考サイト

MetaタグとTitleタグの位置関係について
ブラックなSEOで人生を失った悲惨な男の物語 など10記事(海外&国内SEO情報)

2010年1月26日 #rails

RAILS_ENV

現在動作している環境。開発終わって、テスト環境でテストしたい場合、この変数を修正すればOKです。
'development','test'または'production'があります。
 

RAILS_ROOT

ルートフォルダのパスです。

2010年1月24日 #seo

“wwwあり"か"wwwなし"はSEO的には優劣はありませんし、
どっちを使うかはたいてい各人の好き嫌いで決まっています。
例えばこのサイトの場合www.kinopyo.comとkinopyo.comで全部アクセスできますが、
私は"wwwあり"で正規化ています。
この正規化というのは非常に重要で、検索エンジンに対しての知らせです。
Googleのヘルプによると下記の解説になります。

使用するドメインとは、サイトのページをインデックスに登録する際に使用するドメインです。使用するドメインを http://www.example.com と指定すると、http://example.com の形式のリンクが検出された場合、Google ではそのリンクを http://www.example.com として処理します。また、検索結果に表示する URL は設定に基づいて決まります。

なので"wwwあり"と"wwwなし"が同じサイトであれば
正規化する必要があります。

正規化する方法

.htaccessが使える環境では.htaccessを下記のように設定
.htaccessファイルはサイトのルートディレクトリに置いてください。
例えばこのブログのURLはwww.kinopyo.com/blogになっていますが、
.htaccessファイルはwww.kinopyo.comのディレクトリに置いてあればOKです。
設定に基づいてリダイレクトします。

wwwありに統一

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

wwwなしに統一

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example\.com *NC*
RewriteRule ^(.# )$ http://example.com/$1 *R=301,L*

※”example.com”は自分のドメイン名に置き換えてください。

Googleウェブマスターツールでの設定

Googleウェブマスターツールは自分のサイトとGoogle検索の関係いついて
いろいろ設定できる支援ツールです。
ここでは自分が"www有り無し"をGoogleに伝えるための設定をします。
そうしないとGoogleは"www有り無し"をそれぞれ別のページへの異なる参照として処理されます。

Googleウェブマスターツール使うにはまずサイトを登録

サイトを正規化するためにはwwwありとwwwなしの両方を登録する必要があります。

Googleウェブマスターツール

Googleが提供するMetaデータをサイトのページに貼り付けることでサイトが確認されます。
(具体的な認証方法はGoogleのヘルプを見てください)

使用するドメイン

登録完了後はサイトを選択し、「サイト設定→設定→使用するドメイン」で
利用するドメイン、つまりwww有りなしを指定してください。

Googleウェブマスターツール

Wordpressお使いの方は注意を

Wordpressの「設定→一般」でサイトURLが正しく設定されるか確認してください。
もし.htaccessでは"wwwあり"で指定しWordpressでは"wwwなし"と指定した場合は
無限ループとなるため、サイトがエラーとなり表示できなくなります。
Wordpressの仕様は調べていないが、どうやらWordpressの設定によりリダイレクトするように見えます。

参考サイト

wwwあり/wwwなし、どちらを使用するか?

2010年1月24日 #rails

Railsのvalidateチェックはすばらしいです。
使いかた非常便利だし、機能が強いです。
それでは、一緒に見てみましょう。

validate

validateを使って、カスタマイズのvadidationチェックを定義できます。
例:

def validate
  errors.add(:content, "を入力してください") if content =~ /^(ここに感想を書いてください。|ここに感想を書いてください)$/
end

validates_acceptance_of

チェックボックスがチェックされたかを確認。
チェックされていない場合、エラーが起こリます。

validates_confirmation_of

再入力を確認します。
詳細の使い方は、「validates_confirmation_of の使い方」を参照してください。

validates_exclusion_of

指定した値に含まれていないかをチェックします。
例:

validates_exclusion_of :sex,:in => ['female','male']

validates_inclusion_of

指定した値に含まれているかをチェックします。
validates_exclusion_ofの逆です。
例:

validates_inclusion_of:sex, :in => ['female','male']

validates_format_of

正規表現を使って、値をチェックします。
例:

validates_format_of :code,:with => /^[0-9A-Za-z]/, :message =>"は半角英数字で入力してください。"

validates_length_of

値の長さをチェックします。
例:

validates_length_of :name, :maximum => 30

validates_numericality_of

値は数字かどうかをチェックします。数字ではない場合、エラーを表示します。
例:

validates_numericality_of :code

validates_presence_of

必須値のチェック。値が入力されていない場合、エラーを表示します。
例:

validates_presence_of :code

validates_uniqueness_of

値の重複チェック。DBに既に同じ値が存在した場合、エラーを表示します。
例:

validates_uniqueness_of :id

validates_size_of

validates_length_ofと同じ。

2010年1月23日 #rails

システムを作る時に、パスワードを2回入力してもらって、確認処理をおこなうことが多いですね。
そんなめんどな仕事には、Railsはvalidates_confirmation_of メソッドを用意してくれました。
それでは、使い方を見てみましょうか。

まず、モデルで以下のチェックを行います。

validates_confirmation_of :password  #カラム名
attr_accessor :password_confirmation #カラム名に_confirmation

そして、関連のビューで、以下の処理を書きます。

= password_field :user, :password
= password_field :user, :password_confirmation

これで、自動的に入力されたパスワードは同じかどういかを確認してくれます。

※attr_accessorは、再入力フィールドの値を保存するための仮想カラムです。