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()失敗');
}
$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,
onload="window.top.location='http://(親windowの検索結果のURL)#'+document.body.scrollHeight;"これにより、親windowのURLの末尾にiframe内のコンテンツの高さを表すhashが付く。
var var googleSearchFrameWidth = 800; //これは既存のコードこれにより、デフォルトの高さが1210pxになり、検索結果の下端が切れなくなる。
var googleSearchFrameHeight = 1210; //これを追加する
__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"
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)" />
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 -->
<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'" />
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
[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 = [普通は使わない]
//例:Railsによる更新タイムスタンプ付与への対応
.search(/\.png$/) → .search(/\.png(\?[0-9]+)?$/)
class BaseModel < ActiveRecord::Baseただし最新のRailsではDeprecation::warnの対象?
ActiveRecord::Errors.default_error_messages[:invalid] = _("がおかしいよ!")
ActiveRecord::Errors.default_error_messages[:empty] = _("を入力してね!")
・
・
end
<%= render :partial => "msg", :object => "データ", :locals => {:name => "他のデータ"} %>
<%= render :partial => "msg", :collection => ["データ1", "データ2"] %>
#_msg.html.erb
<%= msg %> <= ここにデータが入っている
<%= name %> <= :localsで渡したデータは指定した名前の変数に入っている。
Try using highslide-full.js instead of highslide-with-html.js.
# 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%; }
<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>
<%
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) %>
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 %>
<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>
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 ]
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
#例
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 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/'
<?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>
rake aborted!そこで、PHP5.2のフォルダからlibmysql.dllをコピーしてきてRubyのbinフォルダに入れると解消した
Mysql::Error: Commands out of sync; you can't run this command now: SHOW TABLES
<?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>';
<?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>';
//例上記の変換は、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]=~_ _+"
ローカル コンピュータ の Apache2 サービスを開始できません。原因は存在しないextensionをロードする設定になっていることだった。
エラー 1067: プロセスを途中で強制終了しました。
date.timezone = Asia/Tokyo上記設定をしてあげたら無事動くようになった。
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}
<?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);
}
}
store-passwords = noパスワードだけでなく、なるべく保存される情報を無くしたいなら、auth-credsをnoにする。
store-auth-creds = no
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);
積んでる本などを紹介するためのサービス @tnd 本の名前 #感想 で紹介できます 中の人@ina_ani参考:つんどいったー - 積んでるモノを **かるーく** 紹介
今売れている本をつぶやきます。売れ筋Books隊の隊長です。
今売れている単行本をつぶやきます。
今売れている文庫をつぶやきます。
今売れている新書をつぶやきます。
今売れているマンガをつぶやきます。
ジュンク堂書店池袋本店6Fコンピュータ書の最新情報をお届けします
amazon.co.jp 本のベストセラーの順位変動をお知らせします。ある本の最高位が更新されたときと、一定期間ランキングを維持している場合にお知らせしています。参考:Amazonベストセラーを教えてくれるTwitterBotをGAE/Jで作りましたぞ - やればできる子の日記
@yonda4 書名、で読んだ本やマンガを教えてください。読書の記録を取るサービスです。参考:twitterで読書記録。読んだ4!
非公認わんこ(bot)。オンライン書店ビーケーワンの売れ線(ディリーランキング)をつぶやいてます。※botだけどたくさんフォローしてる...