自分に必要なのはこれだけかな。
select * from spatial_ref_sys where srid in (4301, 4326)
結果を要約すると、
4301 → Tokyo (いわゆる日本測地系。日本の地図でけっこう使われている)
4326 → WGS 84 (いわゆる世界測地系。Google Maps等で使われている)
参考:Bubble://ちずろぐ/別巻/ SRIDList
僕らはプールの底を歩き続ける。まるで自分の影とダンスを踊るように。
自分に必要なのはこれだけかな。
select * from spatial_ref_sys where srid in (4301, 4326)
4301 → Tokyo (いわゆる日本測地系。日本の地図でけっこう使われている)
4326 → WGS 84 (いわゆる世界測地系。Google Maps等で使われている)
参考になったリンクや、後で見るかもしれないリンクの集。それに加えて気づいたことのメモ。
+proj=longlat +ellps=bessel +no_defs
+proj=longlat +ellps=bessel +towgs84=-147.54,507.26,680.47,0,0,0,0 +no_defs
とりあえずよく使いそうな機能はこんなとこか。
楕円書いたりいろいろできるみたいだけど、使うかな?
四隅を角丸にしたいかも...
<?php
$string = 'こんにちはこんにちは!';
$fontSize = 12;
$padSize = 10;
$angle = 0; //角度を指定できる
$fontPath = 'C:/WINDOWS/Fonts/MSGOTHIC.TTC'; //Windowsの場合
try {
//文字列の大きさを取得 http://jp2.php.net/imageTtfBBox
$box = imageTtfBBox($fontSize, $angle, $fontPath, $string);
if ($box === false) {
throw new Exception('imageTtfBBox()失敗');
}
$boxWidth = abs($box[2] - $box[0]);
$boxHeight = abs($box[7] - $box[1]);
//キャンバス生成 http://jp2.php.net/imageCreateTrueColor
$width = $boxWidth + $padSize * 2;
$height = $boxHeight + $padSize * 2;
$img = imageCreateTrueColor($width, $height);
if ($img === false) {
throw new Exception('imageCreateTrueColor()失敗');
}
//背景色と文字色をそれぞれ造る
// http://jp2.php.net/imageColorAllocate
// http://jp2.php.net/imageColorAllocateAlpha (透過の場合)
$red = 0xFF;
$green = 0x00;
$blue = 0x00;
$bgColor = imageColorAllocate($img, $red, $green, $blue);
if ($bgColor === false) {
throw new Exception('imageColorAllocate()失敗');
}
$red = 0xFF;
$green = 0xFF;
$blue = 0xFF;
$alpha = 20; //0~127。127は完全に透明
$textColor = imageColorAllocateAlpha($img, $red, $green, $blue, $alpha);
if ($textColor === false) {
throw new Exception('imageColorAllocate()失敗');
}
//キャンバスに色を塗る http://jp2.php.net/imageFill
$startX = 0;
$startY = 0;
if (!imageFill($img, $startX, $startY, $bgColor)) {
throw new Exception('imageFill()失敗');
}
//文字を書く http://jp2.php.net/imageTtfText
$startX = $padSize;
$startY = $boxHeight + $padSize; //左下の座標を指定する
if (!imageTtfText($img, $fontSize, $angle, $startX, $startY, $textColor, $fontPath, $string)) {
throw new Exception('imageChar()失敗');
}
//出力(第2引数にファイルパスを渡すとファイルに保存する)
$type = 'gif';
header('Content-type: image/' . $type);
switch ($type) {
case 'gif': // http://jp2.php.net/imageGif
$result = imageGif($img);
break;
case 'jpeg': // http://jp2.php.net/imageJpeg
$quality = 100; //0~100。大きいほど高品質。デフォルトは75
$result = imageJpeg($img, null, $quality);
break;
case 'png': // http://jp2.php.net/imagePng
$quality = 0; //0~9。小さいほど高品質
$result = imagePng($img, null, $quality);
break;
}
if (!$result) {
throw new Exception('出力失敗');
}
} catch (Exception $e) {
header('Content-type: text/html');
echo $e->getMessage();
}
//後始末 http://jp2.php.net/imageDestroy
if ($img && !imageDestroy($img)) {
throw new Exception('imageDestroy()失敗');
}
列挙しようかと思ったがけっこうありそうなので、とりあえず思いついたものだけメモ。
V2になくてV3にあるもの
tags: api, compare, google-maps 0 コメント
現時点での調査メモ。
実際に使うなら、最新情報の確認および問い合わせをした方がよい。
公式紹介ページ
1. Googleの紹介ページ
Google Maps API Premier - データを視覚化
2. ゼンリンによる紹介ページ(概要)
法人向けサービス:Google Maps API Premier | ゼンリンデータコム
3. ゼンリンによる紹介サイト(詳細)
プレミアについて/Googleマップの商用サービス GoogleMapsAPIプレミア
参考になるのは3番。
プレミアを使うことの主なメリット
tags: google, google-maps, map, price 0 コメント
手順をメモしたがメモする程でもなかった。
tags: git, install, tortoise-git, windows 0 コメント
PHP5.3で実験。
何気なくsort()を使うと、意外と意外な結果になるので注意。
$before = array('Google', 'apple', '+11112', 1112, '112', 12, '0', -1);
$array = $before;
sort($array);
foreach ($array as $val) echo $val . ', ';
//sort()の第2引数のデフォルトはSORT_REGULAR
//文字列は大文字優先
//今回のように数値と文字列が混在するとおかしくなる?
// => -1, 0, 112, Google, apple, 12, 1112, +11112,
echo '<hr />';
$array = $before;
sort($array, SORT_NUMERIC);
foreach ($array as $val) echo $val . ', ';
//数値としてソート
//文字列は大文字・小文字を無視したソートで、ゼロの前になるようだ
// => -1, apple, Google, 0, 12, 112, 1112, +11112,
echo '<hr />';
$array = $before;
sort($array, SORT_STRING);
foreach ($array as $val) echo $val . ', ';
//文字列としてソート
//記号、数字、文字列(大文字優先)の順
//数字は数値ではなく文字列としてソートされる
// => +11112, -1, 0, 1112, 112, 12, Google, apple,
echo '<hr />';
$array = $before;
sort($array, SORT_LOCALE_STRING);
foreach ($array as $val) echo $val . ', ';
//localeごとのソート(今回の環境ではSORT_STRINGと同じだった)
// => +11112, -1, 0, 1112, 112, 12, Google, apple,
echo '<hr />';
$array = $before;
natsort($array);
foreach ($array as $val) echo $val . ', ';
//「自然順アルゴリズム」
//人間がやったらまあこうするだろうという感じか
//記号、数値、文字列の順
//数値は文字列ではなく数値としてソートされるのがSORT_STRINGとの違い
// => +11112, -1, 0, 12, 112, 1112, Google, apple,
echo '<hr />';
$array = $before;
natcasesort($array);
foreach ($array as $val) echo $val . ', ';
//「自然順アルゴリズム」、かつ大文字小文字を区別しない
// => +11112, -1, 0, 12, 112, 1112, apple, Google,
(2010/09/02:情報が古くなっていたので全面的に改定)
Google Codeにあるもの(全て英語)
Google Maps JavaScript API V2 Reference - Google Maps JavaScript API V2 - Google Code
tags: api, google, google-maps, image, javascript, library, map, reference 0 コメント
検索向けAdSenseによるサイト内検索で、IE以外だと検索結果の下端が切れてしまう問題について。
【発生条件】
検索結果を自分のサイト内に表示する場合に起きる。
広告を右のみにした場合に起きた。広告を他の位置にしたら起きないかも。
Firefox(3.5)、Google Chrome(4)、Safari(4 Windows版)で発生を確認した。
【現象】
検索結果の内容に関わらず、検索結果を表示するiframe(JavaScript http://www.google.com/afsonline/show_afs_search.js により生成される)の高さが常に1200pxになる。
その結果、検索結果が少ない場合は検索結果とフッターの間に大きな空白ができる。反対に検索結果が多い場合、検索結果の下端に表示されるページ番号の表示が途中で切れてしまったり表示されなくなってしまう。(実際にはframeの外側にあり、かつframeのスクロールバーが非表示になっているので隠れているだけだが。)
IEの場合、iframe内の検索結果のHTMLのbody要素に、onloadで下記のようなJavaScriptを実行している。
onload="window.top.location='http://(親windowの検索結果のURL)#'+document.body.scrollHeight;"これにより、親windowのURLの末尾にiframe内のコンテンツの高さを表すhashが付く。
var var googleSearchFrameWidth = 800; //これは既存のコードこれにより、デフォルトの高さが1210pxになり、検索結果の下端が切れなくなる。
var googleSearchFrameHeight = 1210; //これを追加する
はまったのでメモ。最初からリファレンスや参考サイトを見ながらやれば書いてあったんだろうけど。
CakePHPで単数と複数で異なる翻訳を付けようとした。
__n(' person', ' people', $count);poファイルも書いた。
msgid " person"
msgid_plural " people"
msgstr[0] "人"
msgstr[1] "人"
Warning (2): strlen() expects parameter 1 to be string, array given ...
if (is_array($trans)) {strlen()に配列を渡しているようだ。
if (isset($trans[$plurals])) {
$trans = $trans[$plurals];
}
}
if (strlen($trans)) {
$singular = $trans;
return $singular;
}
if (strpos($header, "plurals=3")) {
if (strpos($header, "100!=11")) {
if (strpos($header, "10<=4")) {
return $n % 10 === 1 && $n % 100 !== 11 ? 0 : (略)
nplurals=INTEGER;plural=EXPRESSION;ん?さっきのif文の条件と似ても似つかない。
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"まさにこれだ。
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
PHPでFatal Errorが発生すると以降の処理が実行されない。
かつ、try/catchやset_error_handler()ではFatal Errorを捕まえられない。
なので通常は、Fatal Errorが起きたときの詳しい状況はログに残らない。
(例えばエラーが起きたPHPのファイル名はログに残るが、それを呼び出した側のPHP名や、データの状況は分からない。)
しかし、register_shutdown_function()を使えばエラーが起きたときの状況をログに残せる。
register_shutdown_function('shutdownHandler');
function shutdownHandler(){
$error = error_get_last();
if ($error['type']) { //エラーの場合のみ
error_log(...); //必要な情報を書き出す。
}
}
register_shutdown_function('shutdownHandler');これだとExceptionが拾えない?
function shutdownHandler(){
$error = error_get_last();
if ($error['type'] == E_ERROR) {
error_log(...); //必要な情報を書き出す。
}
}
半分にするならこんな感じ。
<img src="test.jpg" alt="test" onload="this.width /= 2" />
<img src="test.jpg" alt="test" onload="this.width = Math.min(this.width, 100)" />
tags: image, javascript 0 コメント
CakePHPでは、コントローラでlayoutを指定すれば任意のlayoutを使うことができる。
通常layoutは自分で用意するが(たいていはdefalut.ctp)、いくつか組み込みのlayoutが用意されている。
それぞれどんな出力になるか試してみた。
なお、以下のサンプルで使っているviewの中身は下記の通り。
test
test
<!-- 1.7983s -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">詳細はよく分からないが、何かFlashのために便利なものなのだろう、きっと。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>foo</title>
<style><!--
P { text-align:center; font:bold 1.1em sans-serif }
A { color:#444; text-decoration:none }
A:HOVER { text-decoration: underline; color:#44E }
--></style>
</head>
<body>
<p><a href="/test/bar">foo</a></p>
</body>
</html><!-- 1.6536s -->
動的にsrc属性の値を変えた時、かつ変更前と変更後のsrc属性の値が同じ場合にonloadが実行されるかどうかが違う。
IE(7)、Firefox(3.5)ではonloadが実行されたが、Safari(4)では実行されなかった。
テスト用コード
<img src="test.jpg" alt="test"
onload="alert('Loaded!')"
onclick="this.src = 'test.jpg'" />
<img src="test.jpg" alt="test"
onload="alert('Loaded!')"
onclick="this.src = 'test2.jpg'" />
tags: image, javascript, onload, safari, web-browser 0 コメント
【CSS】
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/autocomplete/assets/skins/sam/autocomplete.css" />
【JavaScript】
<script type="text/javascript" src="http://yui.yahooapis.com/combo?2.8.0r4/build/yahoo-dom-event/yahoo-dom-event.js&2.8.0r4/build/animation/animation-min.js&2.8.0r4/build/datasource/datasource-min.js&2.8.0r4/build/autocomplete/autocomplete-min.js"></script>
<script type="text/javascript">
new YAHOO.widget.AutoComplete(
"myInput",
"myContainer",
new YAHOO.util.LocalDataSource(["とうきょう", "とちぎ", "とやま"]),
{useShadow: true} //AutoCompleteに影を表示
);
</script>
【HTML】
<div style="width:15em">
<input id="myInput" type="text">
<div id="myContainer"></div>
</div>
参考:YUI 2: AutoComplete
tags: javascript, sample, ui, yui 0 コメント
Rails2.3で試した。
必要最低限の要素のみ。
config/routes.rb
map.connect "sitemap.xml", :controller => :test, :action => :sitemap
class TestController < ApplicationController
def sitemap
# サイトマップとして送信したいページのURL生成に必要な情報を取得する
@members = Member.find(:all)
@entries = Entry.find(:all)
headers["Content-Type"] = "text/xml; charset=utf-8"
respond_to do |format|
format.xml {render :layout => false}
end
end
end
xml.instruct!「http://」から始まるフルなURLにするために「:only_path => false」を付けている。
xml.urlset(:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9") do
# トップページ
xml.url do
xml.loc(url_for(:controller => :top, :only_path => false))
end
# 個別のページ
@members.each do |member|
xml.url do
xml.loc(url_for(:controller => :members, :action => :show, :id => member.id, :only_path => false))
end
end
・
・
・
end
# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
# User-Agent: *
# Disallow: /
Sitemap: http://www.example.com/sitemap.xml
CSSフレームワークのYAMLとページ内ポップアップライブラリのHighslide JSを併用したら、IEで見た場合のみHighslideの表示がおかしくなった。
参考情報を探したが、ドイツ語しか見つからない...
下記はGoogle Analyticsの携帯向け(公式Beta版)による統計を元にしているが、説明については推測で補完している部分もあるので注意。
主な解析出来ること
以下はサーバ側でPHPを使っている場合。それ以外(ASP.NET、Java/JSP、Perl)は試してないが、おそらく同様だと思う。
tags: google-analytics, mobile, php 0 コメント
こんな感じ?
PHP5.3の場合だが、5.2でもそんなに違いはないと思う。(mbstring.http_output_conv_mimetypeくらい?)
実際に使う場合は必要に応じて要調査。
[mbstring]
; language for internal character representation.
; http://php.net/mbstring.language
mbstring.language = [(2010/04/26訂正)Japaneseだとmb_send_mail()でメールの文字コードがjisになる。また、文字コード検出順で"auto"を使う場合にもこの設定が必要]
; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
; http://php.net/mbstring.internal-encoding
mbstring.internal_encoding = [mbstring系関数で使われるデフォルトの文字コード]
; http input encoding.
; http://php.net/mbstring.http-input
mbstring.http_input = [入力データを自動で文字コード変換する場合の変換元の文字コード]
; http output encoding. mb_output_handler must be
; registered as output buffer to function
; http://php.net/mbstring.http-output
mbstring.http_output = [ob_start('mb_output_handler')した場合の変換先の文字コード]
; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
; http://php.net/mbstring.encoding-translation
mbstring.encoding_translation = [入力データを自動で文字コード変換するかどうか]
; automatic encoding detection order.
; auto means
; http://php.net/mbstring.detect-order
mbstring.detect_order = [(2010/04/26訂正)変換元文字コードをautoにした場合一部の関数での文字コード検出の優先順位]
; substitute_character used when character cannot be converted
; one from another
; http://php.net/mbstring.substitute-character
mbstring.substitute_character = [文字コード変換できなかった文字の代替文字]
; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
; http://php.net/mbstring.func-overload
mbstring.func_overload = [非mbstring系の関数のうちどれをmbstring系の関数で上書きするか]
; enable strict encoding detection.
mbstring.strict_detection = [文字コード変換時に厳密なチェックを行うかどうか]
; This directive specifies the regex pattern of content types for which mb_output_handler()
; is activated.
; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml)
mbstring.http_output_conv_mimetype = [mb_output_handler()関数が呼び出された場合に使うContent-Typeの正規表現パターンらしい]
; Allows to set script encoding. Only affects if PHP is compiled with --enable-zend-multibyte
; Default: ""
;mbstring.script_encoding = [普通は使わない]
IE6では透過PNGが透過しない。それを無理やり透過させてしまうJavaScriptライブラリを調べたメモ。
//例:Railsによる更新タイムスタンプ付与への対応
.search(/\.png$/) → .search(/\.png(\?[0-9]+)?$/)
RailsでActiveRecordのValidationによって生成されるエラーメッセージを翻訳するためのメモ。
方法その1:I18nを使う
所定のYAMLに翻訳部分を記述しておく方法。現在はこれが一番スマートなようだ。
(フィールド名とその後のメッセージの間に半角スペースが入ってしまう?)
参考:
Rails 2.2.2でエラーメッセージを日本語化する。|WEBデザイン Tips
Rails 2.2 の ActiveRecord::Validations#add のソースコードを読む - Ruby on Rails 研究 - Ruby on Rails with OIAX
方法その2:GetTextを使う
ActiveRecord::Errorsのdefault_error_messagesをゴリゴリ書き換える方法。
例えば、基本となるModelを作ってその中でメッセージをセットし、他のモデルはそれを継承する方法でもよいと思う。
class BaseModel < ActiveRecord::Baseただし最新のRailsではDeprecation::warnの対象?
ActiveRecord::Errors.default_error_messages[:invalid] = _("がおかしいよ!")
ActiveRecord::Errors.default_error_messages[:empty] = _("を入力してね!")
・
・
end
tags: active-record, gettext, i18n, rails, ruby, validation 0 コメント
RailsのViewで部分テンプレートであるpartialを呼び出す場合、呼び出し時に :object または :collection と :locals を渡すことができる。
<%= render :partial => "msg", :object => "データ", :locals => {:name => "他のデータ"} %>
<%= render :partial => "msg", :collection => ["データ1", "データ2"] %>
#_msg.html.erb
<%= msg %> <= ここにデータが入っている
<%= name %> <= :localsで渡したデータは指定した名前の変数に入っている。
Highslide JSは普通のリンクだけでなく、Image Mapのリンクでもページ内ポップアップができる。
しかし、IEで表示した場合、Image Mapのリンクをクリックすると下記の現象が起きる場合がある。
Try using highslide-full.js instead of highslide-with-html.js.
tags: highslide, ie, javascript, library 0 コメント
Firefoxの起動や終了にやたらと時間がかかる原因の1つは、Firefoxの内部データを保存しているDBの1つであるplaces.sqliteが肥大化することらしい。
Firefoxの終了が遅くなると、終了してから起動しようとすると「Firefoxは起動しています」とか言われて起動できないこともよくある。
で、そのplaces.sqliteをVACUUMするアドオンが相次いでリリースされている。
Vacuum Places :: Firefox Add-ons
tags: extensions, firefox, sqlite, tuning 0 コメント
いくつかプラグインがあるが、acts_as_taggable_on_steroidsが一番人気のようだ。
acts_as_taggable_on_steroidsの使い方は、acts_as_taggable_on_steroidsの使い方まとめ - ひげろぐが参考になる。
acts_as_taggable_on_steroidsのインストール元については、Railsのtagプラグイン「acts_as_taggable_on_steroids」がgithubに行ってた - 常識という迷信にあるとおり、現在はgithubにあるのが最新のようだ。
上記の参考サイトではacts_as_taggable_on_steroidsの機能をフルに使っているが、タグクラウドを表示したいだけなら下記だけでOK。
# tag_sample.rb
class TagSample
attr_accessor :count, :label
end
# FooController.rb
# 実際にはDBから取得したデータとかをループで処理するだろうけど
tag1 = TagSample.new
tag1.count = 10
tag1.label = "ラベル1"
tag2 = TagSample.new
tag2.count = 20
tag2.label = "ラベル2"
@tags = [tag1, tag2]
# foo_helper.rb
module FooHelper
include TagsHelper
end
<!-- foo/bar.html.erb -->
<% tag_cloud(@tags, ["tag-s", "tag-m", "tag-l"]) do |tag, css| %>
<%= link_to(h(tag.label), {:action=> :tags, :id => tag.label}, :class => css) %>
<% end %>
a.tag-s { font-size: 80%; }
a.tag-l { font-size: 150%; }
Railsで特定のページだけにCSSファイルを追加する方法を見て知った。これは便利。
application.html.erb等で、 yieldにパラメータを指定すればOK。
<html>
<head>
<title>テスト</title>
<%= yield :head %>
</head>
<body>
<%= yield %>
<%= yield :foot %>
</body>
</html>
<h1>head and foot</h1>
<% content_for :head do %>
<%= stylesheet_link_tag "foo" %>
<% end %>
<% content_for :foot do %>
<%= javascript_include_tag "bar" %>
<% end %>
<html>
<head>
<title>テスト</title>
<link href="/stylesheets/foo.css?1345990170" media="screen" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>head and foot</h1>
<script src="/javascripts/bar.js?1350833305" type="text/javascript"></script>
</body>
</html>
tags: css, javascript, rails, ruby 0 コメント
Rails2.3で日付選択ヘルパー(select_date)を使うためのメモ。
オプションとして指定できるものはこんな感じのようだ。
<%
options = {
:prefix => 'payday', # field名のprefix
:order => [:month, :year, :day], # 表示順
:date_separator => '/', # 項目間の区切り
:prompt => true, # 選択リストの一番上の表示について。個別の指定も可
:include_blank => true, # 選択リストの一番上のブランクにする
:use_month_numbers => true, # 月を数字で表す
# 選択可能な年の範囲を指定
:start_year => Date.today.year,
:end_year => Date.today.year + 1,
# 非表示にする
:discard_year => true,
:discard_month => true,
:discard_day => true
}
html_options = {} # ?
%>
<%= select_date(Date.today + 2.days, options, html_options) %>
AtcitveFormはテーブルに紐付かないモデルを使って入力フォームを作るためのプラグイン。
データの入れ物とvalidationを担う。
「ActiveForm」という名前のプラグインは複数あるので注意。
Gemでインストールすると、module版のActiveFormがインストールされるが、よく分からなかったのでパス。
どうやら「RealityForge」で公開されたActiveFormが主流のようだ。
最新版?:
maciej's active_form at master - GitHub
使い方:
RailsのActiveFormの使い方 - 京の路
Ruby on Rails プラグイン まとめ wiki - active_formプラグイン
るびすけの開発日記 ~Ruby on Rails~ - IT業界のための転職サイト -
Rails2.2以降ではエラーが発生する。
undefined method `self_and_descendants_from_active_record' for Xxx:Class
#コントローラ
class SearchController < ApplicationController
def index
@search = Search.new(params[:search])
if params[:search]
@search.valid?
end
end
end
#モデル
require 'active_form'
class Search < ActiveForm
attr_accessor :tag
validates_presence_of :tag
validates_length_of :tag, :maximum => 3
def validate
# カスタム入力チェックはここで
end
end
<!-- ビュー -->
<% form_for(:search, @search) do |f| %>
<%= error_messages_for :search, "tag" %>
<%= f.text_field "tag" %>
<% end %>
日本の場合はlocaleは"ja"とシンプルなので分かりやすいが、例えばイギリスだと"en-GB"か"en_GB"か"en-gb"か"en_gb"か?
Yahooイギリス版を見てみると、"en-GB"になっていた。(Yahoo! UK & Ireland)
でも台湾版だと"zh-tw"と小文字になっている。(Yahoo!奇摩)
とりあえずアンダーバー(アンダースコア)でなくハイフンというのは分かったが、大文字小文字の使い分け方は分からない。
文字コード指定の場合と同様にどっちでも良さそうな気がするけど、結局はブラウザ等の挙動に依存する。
各国・各地域のYahoo等のメジャーなサイトに合わせておくのが無難だと思う。
JavaScriptで画像を定期的に入れ替え。かつエフェクト効果を付けたい。
コマンド一発で済みそうなのを軽く探してみたけど、要件を満たすライブラリが見つからなかった。で、自分で書いたらこうなった。
諸事情によりprototype.js系にした。
需要はありそうだと思ったけど、そうでもないのかな?
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.2/scriptaculous.js"></script>
<script type="text/javascript">
var urls = ["foo.jpg", "bar.gif"]
var i = 0;
Event.observe(window, "load", function() {
var img = $("img");
setInterval(function() {
img.visualEffect("Fade", {duration: 1});
setTimeout(function() {
img.src = urls[i];
i++;
if (i == urls.length) {
i = 0;
}
img.visualEffect("Appear", {duration: 1});
}, 1500);
}, 4000);
}, true);
</script>
tags: image, javascript, prototype.js, script.aculo.us 0 コメント
レアなケースだろうけど一応メモ。
(参考:RailsでGetText)
Rails のためのものぐさな Web アプリケーションの国際化手法 - 川o・-・)<2nd lifeが参考になる。
ただしGetText 2.0からはenvironment.rbで読み込むgemが変わったので注意。
config.gem "locale_rails"
config.gem "gettext_activerecord"
config.gem "gettext_rails"
config.frameworks -= [ :active_record, :action_mailer ]
localeActiveRecordは使わないのでgettext_activerecordは入れなかった。
locale_rails
gettext
gettext_rails
ruby server/script
↓
.../lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method': undefined method `create!' for class `ActionMailer::Base' (NameError)
config.frameworks -= [ :active_record, :action_mailer ]
↓
config.frameworks -= [ :active_record ]
参照系しか試してない。
下記の例では、MemberというActiveResourceをリスト表示したり詳細表示したりするControllerについて、RSpecでテストする。
(参考:ActiveResource の使い方(前編) : Rails 同士で通信する - WebOS Goodies ※「ユニットテスト」の項。RSpecではないけど。)
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
require 'active_resource/http_mock'
describe MembersController do
before do
@member = {:id => 1, :name => 'foo'}
@members = [@member]
@header = Member.connection.__send__(:build_request_headers, {}, :get)
ActiveResource::HttpMock.respond_to do |mock|
mock.get '/members.xml', @header, @members.to_xml(:root => 'members')
mock.get '/members/1.xml', @header, @member.to_xml(:root => 'member')
end
end
#後は普通にケースを書く
#(略)
end
mock.get '/members.xml?q=keyword', @header, @members.to_xml(:root => 'members')
before doActiveResourceでもActiveRecordでもModelであることには違いがないから、ただMockを使えば良いだけだった。
@member = mock_model(Member)
Member.should_receive(:find).with(:all).and_return(@member)
get 'index'
end
RSpecはDSLなので、決め事を覚えないと使いこなせない。
よく使うことになるであろう、参考リンクを列挙しておく。
前処理、後処理
#例
response.should render_template('members/index')
#例
member = mock_model(Member)
member.stub!(:id).and_return(100)
member.id.should == 100 # => これはOK(Green)だが...
#Viewで「link_to('link', member)」している部分をテスト
response.should have_tag('a[href=?]', '/members/100') # => これはNG(Red)になる
#調べてみると、内部的なIDが使われたようで、「/members/1001」というパスになっていた
member = mock_model(Member, :id => 100)
やったことのメモ。
インストール
gemでRSpecをインストール(もしかして不要?)
gem install rspec
gem install rspec-rails(rspec_railsだと見つからない)
ruby script/generate rspec
ruby script/generate rspec_model Member
ruby script/spec spec/models/member_spec.rbまたは
rake spec:modelsなどなど。(参考:RSpec on Rails でインストールされる rake タスク)
.../spec/spec_helper.rb:16: undefined method `use_transactional_fixtures=' for #<Spec::Runner::Configuration:0x1234567> (NoMethodError)上記のソース(spec/spec_helper.rb)にはこう書いてある。
# If you're not using ActiveRecord you should remove these書いてあるとおり、この3行を削除したら無事動いた。
# lines, delete config/database.yml and disable :active_record
# in your config/boot.rb
config.use_transactional_fixtures = true
config.use_instantiated_fixtures = false
config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
基本:
ActiveResourceでいろんなAPIを叩いてみる。標的はHotpepper API - 富士山は世界遺産
発行されるURLと拡張子について:
天使やカイザーと呼ばれて: ActiveResourceで拡張子なしのURIを発行する方法
応用編:
ActiveResource の使い方(前編) : Rails 同士で通信する - WebOS Goodies
ActiveResource の使い方(中編) : メソッドの詳細 - WebOS Goodies
(後編は? 2009/09/17追記:公開された↓)
ActiveResource の使い方(後編) : 一般の Web API にアクセスする - WebOS Goodies
ActiveResourceのバグ?
[PATCH] ActiveResource find(:all) method returns "NoMethodError: undefined method `collect!'... - lambda {|diary| lambda { diary.succ! } }.call(hatena)
取得するXMLがn件のデータを包含する要素を持つ形の場合、包含する要素に属性type="array"が無いと「collect!メソッドが無いよ!」というエラーが発生する問題。
たとえばこれだとエラーになる。(n件のmemberを、membersという要素で包含している。)
<?xml version="1.0" encoding="UTF-8"?>
<menbers>
<member>
<id>1</id>
<id>name</id>
</member>
</menbers>
<?xml version="1.0" encoding="UTF-8"?>
<menbers type="array">
<member>
<id>1</id>
<id>name</id>
</member>
</menbers>
しばらく離れていたらすっかり忘れてる。
調査したことのメモ。
微妙に仕様変わってる。
基礎:ActiveRecordを使ってみる « UK STUDIO
検索して見つからない場合の戻り値:ActiveRecord find時の戻り - 忘れやすいのでメモ - Yahoo!ブログ
(検索方法によってnilだったり空の配列だったり、例外が投げられたり)
find_first()とfind_all()は無くなった:同じくActiveRecord find時の戻り - 忘れやすいのでメモ - Yahoo!ブログ
最大値等のSQLでいう集約関数:RDBMSの集約関数の結果をActiveRecordで取得する方法 - 森薫の日記
ランダムに1件取り出す:
そんな悲しい目をしないで » Blog Archive » Rails ActiveRecord でランダムにレコードを取得する方法
Mysql で、ランダムにレコードを取り出す方法 - kaeruspoon
(RAND()を使う方法は行数と同じだけRNAD()を実行するわけだから、行数が多い場合はしんどそう)
find_by_xxx()とfind_all_by_xxxについて:ActiveRecordで検索-find_by_* - うなの日記
tags: active-record, db, rails, ruby 0 コメント
メモ。
概要:Ruby on Rails : migration 機能でデータベーススキーマを変更する - WebOS Goodies
詳細:Ruby on Rails : migration 機能リファレンス - WebOS Goodies
データ型について等:FFTT : RailsのMigration
MySQLの数値型の:limitについて、上記参考サイトでは桁数を指定するように書いてあるが、手元のRails2.3.3ではバイト数を指定するようだ。
なのでbigintの場合は :limit => 8 にする。
参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.2 数値タイプ
備忘録として。
前提として、以前Railsを試したことがあるので、下記は事前にインストール済みだった。
rake aborted!そこで、PHP5.2のフォルダからlibmysql.dllをコピーしてきてRubyのbinフォルダに入れると解消した
Mysql::Error: Commands out of sync; you can't run this command now: SHOW TABLES
On2 VP3
星の数1~5個(または0~5個)で評価すること(以下レーティングと言う)は、たいていの場合うまく機能していない。
うまく機能しない原因
Google Maps APIは基本的にJavaScriptから呼び出すが、ジオコーディング(住所等から緯度経度を求めること)についてはJavaScript以外からでもRESTに取得できる。
PHPで呼び出す場合の例。
APIキーはJavaScriptの場合と違ってドメインごとに取得する必要は無いようだ。(どこかのドメイン用に取得したキーを使える。)
<?php
$apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$place = '京都';
$url = 'http://maps.google.com/maps/geo?';
$params = array(
'q' => $place,
'key' => $apiKey,
'sensor' => 'false',
'output' => 'json',
);
$results = json_decode(file_get_contents($url . http_build_query($params)));
echo '<pre>';
var_dump($results);
var_dump($http_response_header);
echo '</pre>';
tags: api, geo-coding, google-maps, json, map, php 0 コメント
OAuthの仕様を理解するための調査のメモなど。
Twitterで他人のつぶやき(Tweet)を再POST(ReTweet)する「RT」。人によって書き方がいろいろ。
基本形
一番多数派のかたち(何かのツールによるもの?)
RT @xxx: XXXXXX
@リプライの後ににコロンを付けない
RT @xxx XXXXXX
RTにコロンを付ける
RT: @xxx XXXXXX
両方コロンを付ける
RT: @xxx: XXXXXX
コロンの後にスペースを入れない
RT @xxx:XXXXXX
コロンの前にもスペースを入れる(以前@geekpageさんがやってた)
RT : @xxx: XXXXXX
小文字で書く
rt @xxx XXXXXX
@リプライを入れない
RT XXXXXX
応用編
RTにコメントを付ける
YYYYYY RT @xxx XXXXXX
コメントを後ろに付ける(海外のユーザーに多い気がする)
RT @xxx XXXXXX << YYYYYY
RTをさらにRTする際に、RTした人にも@リプライする
RT @yyy RT @xxx XXXXXX
RTをさらにRTする際に、RTした人は後ろに書く
RT @xxx XXXXXX (via @yyy)
コメントはRTの後とか@リプライの後とかに入れる人もいる。
参考:RT - Twitter Search
例えばこんな感じ。
<?php
$url = 'http://search.twitter.com/search.json';
$params = http_build_query(array('q' => 'なう', 'lang' => 'ja', 'rpp' => 3));
$results = json_decode(file_get_contents("$url?$params"));
echo '<pre>';
var_dump($results);
var_dump($http_response_header);
echo '</pre>';
(2013/5/19 変更:rawurlencode()はRFC3986なのにRFC1738と書いてたので訂正。)
まずはurlencode()とrawurlencode()を比較。
//例上記の変換は、PHP5.2までのrawurlencode()にも使える。
function encodeAlongRFC1738($str) {
return strtr($str, array('%7E' => '~', '+' => '%20'));
}
echo encodeAlongRFC1738(http_build_query($arr));
元の文字
"~_ _+"
urlencode()の場合
変換結果
"%7E_+_%2B"
urldecode()すると
"~_ _+"
rawurldecode()すると(正しくデコードできない)
"~_+_+"
rawurlencode()の場合(PHP 5.2)
変換結果
"%7E_%20_%2B"
urldecode()すると
"~_ _+"
rawurldecode()すると
"~_ _+"
rawurlencode()の場合(PHP 5.3)
変換結果
"~_%20_%2B"
urldecode()すると
"~_ _+"
rawurldecode()すると
"~_ _+"
urlencode() + encodeAlongRFC1738()の場合
変換結果
"~_%20_%2B"
urldecode()すると
"~_ _+"
rawurldecode()すると
"~_ _+"
元の配列
array("test[0]" => "~_ _+")
http_build_query()の場合
変換結果
"test%5B0%5D=%7E_+_%2B"
urldecode()すると
"test[0]=~_ _+"
rawurldecode()すると(正しくデコードできない)
"test[0]=~_+_+"
http_build_query() + encodeAlongRFC1738()の場合
変換結果
"test%5B0%5D=~_%20_%2B"
urldecode()すると
"test[0]=~_ _+"
rawurldecode()すると
"test[0]=~_ _+"
手元のPHP5.3.0で発現。もしかしたら5.2では起こらないかも。
下記は「0 == 'A'」を評価する際にPHP内部で行われていることの推測。
Windows上のPHPを5.2から5.3にバージョンアップしたら動かなくなった時にやったこと。
(自分の環境での解決策のメモ)
トラブル1:Apacheを起動する時に下記のようなエラーが出て起動できない
ローカル コンピュータ の Apache2 サービスを開始できません。原因は存在しないextensionをロードする設定になっていることだった。
エラー 1067: プロセスを途中で強制終了しました。
date.timezone = Asia/Tokyo上記設定をしてあげたら無事動くようになった。
Windows上のPython2.5のPytyon Shellで確認した。
こんなclassがあったとする。
class Test(object):
def foo(self):
return [self.bar(), self.bar({'buz': 10})]
def bar(self, p={'buz': 1}):
p['buz'] += 1
return p
>>> Test().foo()
[{'buz': 2}, {'buz': 11}]
>>> Test().foo()
[{'buz': 3}, {'buz': 11}]
def test(foo={'bar': 1}):
foo['bar'] += 1
return foo
>>> test()引数を付けた時だけ別になっている。
{'bar': 2}
>>> test()
{'bar': 3}
>>> test({'bar': 10})
{'bar': 11}
>>> test()
{'bar': 4}
CakePHPでユニットテストする場合、標準ではPHPUnitではなくSimpleTestを使う。
1. ダウンロード
SimpleTestはDownloading SimpleTestからtar.gzをダウンロードできる。
(なぜかSoureceForgeの方からはtar.gzがダウンロードできなかった。どうでもいいが上記のページには"... from SourceForget.net ..."と書いてある。ソースのことなど忘れたい...とか?)
2. セットアップ
基本的にCakePHP1.2の本家のリファレンスに沿って進めればセットアップできる。
3. setUp, tearDown
SimpleTestではxUnitと同様にsetUp() tearDown()が使えて、さらにそれに加えていろいろなタイミングで呼ばれるfunctionがあるらしい。
参考:CakePHPでSimpleTest その2 TestSuiteの動きをモデルのテストケースのスケルトンで確認 | ねねとまつの小部屋
<?php
//app/tests/cases/models/member.test.phpの例
App::import('Model', 'Member');
class MemberTestCase extends CakeTestCase {
function setUp() {
$this->Member =& ClassRegistry::init('Member');
}
function testHoge() {
$result = $this->Member->hoge('foo');
$expected = array('baz' => 'bar');
$this->assertIdentical($result, $expected);
}
}
<?php
class MembersControllerTest extends CakeTestCase {
function startCase() {
echo '<h1>テストケースを開始します</h1>';
}
function endCase() {
echo '<h1>テストケースを終了します</h1>';
}
function startTest($method) {
echo '<h3>メソッド「' . $method . '」を開始します</h3>';
}
function endTest($method) {
echo '<hr />';
}
//普通に呼び出す
function testIndex() {
$result = $this->testAction('/');
}
//レンダリングしたHTMLを取得する
function testIndexGetRenderedHtml() {
$result = $this->testAction('/', array('return' => 'render'));
//表示して確認
debug(htmlentities($result));
}
//コントローラ内でセットしたデータを取得する
function testIndexGetViewVars() {
$result = $this->testAction('/', array('return' => 'vars'));
$this->assertIdentical($result['fuga'], 'honyarara');
//表示して確認
debug($result);
}
}
Linuxでsvnを使うと、デフォルトではSubversionサーバへの接続設定がパスワードも含めて全て平文で記録される。
rootに丸見えで気持ち悪い場合もある。
これをやめさせるには、ファイル ~/.subversion/config を編集し、パスワードを保存しないようにする。
store-passwords = noパスワードだけでなく、なるべく保存される情報を無くしたいなら、auth-credsをnoにする。
store-auth-creds = no
tags: chrome, download, extensions, install 2 コメント
CMANのサイトリニューアルのご案内によると、無料でサイトを監視してくれるサービスをリニューアルするらしい。
微妙なバージョンアップだが、無料で続けるそうだ。頑張って欲しい。
RSS/ATOMフィードを取得して、それをTwitterにPOSTしてくれるサービスの比較。
twitterfeed
PHP5.3ではE_ALLにE_DEPREATEDが含まれるので、こんなエラーが出まくる。
PHP Deprecated: Assigning the return value of new by reference is deprecated in ...
if (isset($config['debug'])) {
if ($_this->debug) {
error_reporting(E_ALL);
//この下のIF文を追加する
if (error_reporting() > 6143) {
error_reporting(E_ALL & ~E_DEPRECATED);
}
php_value error_reporting 22527
error_reporting(E_ALL);(追記終わり)
//この下のIF文を追加する
if (error_reporting() > 6143) {
error_reporting(E_ALL & ~E_DEPRECATED);
}
set_time_limit(0);
Firefox3.0から3.5にUpdateしたら、全てのタブを閉じたときにFirefoxのWindow自体も閉じるようになってしまった。
(タブバーは常に表示するようにしている。)
これでは使いにくいので調べた。
Closing the only tab closes the windowにあるとおり、about:configで browser.tabs.closeWindowWithLastTab をfalseにすると、3.0までと同じように空のタブを残してくれるようになった。
どうも3.5がBeta版の時から論議が交わされてきた設定らしく、同じように不満を持つ人も少なくないようだ。
tags: about-config, firefox, setting, tab 0 コメント
本に関連するPOSTをしているTwitterアカウント(Botまたはユーザー)のリスト。
tnd (tnd)
積んでる本などを紹介するためのサービス @tnd 本の名前 #感想 で紹介できます 中の人@ina_ani参考:つんどいったー - 積んでるモノを **かるーく** 紹介
今売れている本をつぶやきます。売れ筋Books隊の隊長です。
今売れている単行本をつぶやきます。
今売れている文庫をつぶやきます。
今売れている新書をつぶやきます。
今売れているマンガをつぶやきます。
ジュンク堂書店池袋本店6Fコンピュータ書の最新情報をお届けします
amazon.co.jp 本のベストセラーの順位変動をお知らせします。ある本の最高位が更新されたときと、一定期間ランキングを維持している場合にお知らせしています。参考:Amazonベストセラーを教えてくれるTwitterBotをGAE/Jで作りましたぞ - やればできる子の日記
@yonda4 書名、で読んだ本やマンガを教えてください。読書の記録を取るサービスです。参考:twitterで読書記録。読んだ4!
非公認わんこ(bot)。オンライン書店ビーケーワンの売れ線(ディリーランキング)をつぶやいてます。※botだけどたくさんフォローしてる...
経験上、学んだSEOのコツ。