sinatraのサンプルコード

http://www.sinatrarb.com/intro-jp.html
How to: Return JSON from Sinatra - Nathan Hoad

シンプルさを追求した感じのライブラリ。
"SinatraRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSLです。"ですって。

以下サンプル。

# -*- encoding: utf-8 -*-
#JsonPrinter.rb
#実行>ruby -rubygems JsonPrinter.rb

require 'sinatra'
require 'json'		#json出力用gem

#他にpost等のメソッドも用意されている
#ローカルで動かす際はlocalhost:4567/here.jsonで見る
get '/here.json' do
	
	#文字コード指定してやらないと日本語が化ける
	content_type :json, :charset => 'utf-8'
	
	#to_jsonでjsonへ変換
	{ :landmark => "スタート地点", :x => "0", :y => "0"}.to_json
end

なんだコレはと言われたら

地図ですと答える。まあまだ途中なので…。

ruboto IRB入れるとIS06上でスクリプト書いて実行できて楽しいです。持ち運ぶキーボード買おうかな。

# encoding: UTF-8
require 'java'

class MapMaker
	
	def initialize(x_max = 10, y_max = 10,
		geo=["土", "水"])
		
		@geo = geo
		@x_max = x_max
		@y_max = y_max
		@result = []
	end
	
	attr_accessor :geo, :result
	
	def decide_geo		
		@x_max.times {|i|
			y_ary=[]
			@y_max.times {|j|
				y_ary << @geo[rand(@geo.size)]
			}
			@result << y_ary
		}
		return @result
	end
end

mm = MapMaker.new(10,10,['水','土',])
result = mm.decide_geo

result.each{|e|
	java.lang.System.out.println(e)
}
土土土水土土土土土土
土水土水水水土水水水
土土土土土水水水水水
土水土土土土土水水土
土土水土水土水土水土
土土水土水水土水水土
土土土土土水水水水水
水水水水水水土土土土
土水土水土土土水土土
土土水水水土土土土土

pikで別バージョンのRubyを取ってくる

一部訂正。p302やp330の指定をしなかった(330を入れた)場合に、自分の環境ではirbやrubygemが動作しなかった。302を指定して入れた場合には動作したのでひとまず302を入れるようにコマンドも修正。

pikのコマンドメモ。ローカルに無いバージョンを取ってくる所で若干詰まったので。
pikはWin上でJrubyIronRubyやバージョン別のRubyを使い分けるためのツール。

::自分の環境で実行した際のバージョン
pik 0.2.8

::既にローカルにある物を登録
pik add C:\jruby-1.5.6\bin

::インストール可能なRubyの一覧を見る
pik ls -r -V

::まだローカルにないバージョンを取ってくる
pik install ruby -v 1.8.7-p302

任意の大きさのPNGを円で埋める

rubyでSVGファイルを生成するの続き
本当は六角形を出力したいんですが、ひとまず円で使い方を覚えるなど。

使用例

幅、高さ、ファイル名

F:\dev\ruby>ruby write_svg.rb 800 600 100 maru.png
[-30, -100]
[56, -150]
[142, -100]
[228, -150]
[314, -100]
[400, -150]
[486, -100]
[572, -150]
[658, -100]
[744, -150]
[830, -100]
[916, -150]

中身

require 'cairo'

format = Cairo::FORMAT_ARGB32
width = ARGV[0].to_i	#横幅
height = ARGV[1].to_i	#上下

diameter = ARGV[2].to_i
radius = diameter / 2		#半径

#sufaceとcの生成
surface = Cairo::ImageSurface.new(format, width, height)
#surface = Cairo::SVGSurface.new("hex.svg", width, height)
#SVG開くよりPNGを開く方が早いので…。今は許せSVG
c = Cairo::Context.new(surface)

c.set_source_rgb(1, 1, 1)
c.rectangle(0, 0, width, height)
c.fill

#使用色指定。黒
c.set_source_rgb(0, 0, 0)

#中央まで移動
x = width / 2
y = height / 2

while 0 - radius < y
	y -= diameter
#	p [x,y]
end
y_min = y

while 0 - radius < x
	x -= (diameter*0.86).to_i
#	p [x, y]
end

col_count = 0
while x < width + radius
	while y < width + radius
		c.circle(x, y, radius)
		c.close_path
		c.stroke
		y += diameter
#		p [x, y]
	end
	y = y_min
	y -= radius if col_count.odd?	#2列に1列ずらす
	x += (diameter*0.86).to_i
	p [x, y]
	
	col_count += 1	#列番号管理用
end
surface.write_to_png(ARGV[3])

結果

rubyでSVGファイルを生成する

前振り

xml - Ruby Support for SVG - Stack Overflow 「RubySVG使うためのライブラリ無いの」「Cairoはどうよ」とかいうやり取りだと思われる。

For Windows user:

% gem install cairo --platform x86-mingw32

Ruby bindings

Rubyist Magazine - cairo: 2 次元画像描画ライブラリ

本題

るびまのサンプルをSVG向けのちょろっと変更した物

=begin
るびまの日の丸描画サンプルをSVG形式での保存に変更してみた
基本的な流れはほとんど同じ。素晴らしい
http://jp.rubyist.net/magazine/?0019-cairo
=end
require 'cairo'

#format = Cairo::FORMAT_ARGB32
width = 300
height = 200
radius = height / 3

#保存ファイル名を含めたsufeceとcontextの生成
surface = Cairo::SVGSurface.new("hoge.svg", width, height)
#surface = Cairo::ImageSurface.new(format, width, height)
context = Cairo::Context.new(surface)

#背景の白
context.set_source_rgb(1, 1, 1)
context.rectangle(0, 0, width, height)
context.fill

context.set_source_rgb(1, 0, 0)
context.arc(width / 2, height / 2, radius, 0, 2 * Math::PI)
context.fill

#SVGだと順次保存されるので必要ない
#surface.write_to_png("hinomaru.png")

地名抽出のコード

都道府県、市町村区の名前をDBへのデータを使った物は上げてなかった気がするので一応。ちなみに、下記のコードの時点ではSQLite内のデータを使用しているが、先に書いた項目名-地名の一覧表示をするSQLではMySQL内に入れたデータを使っている。

require 'rubygems'
require 'mysql'
require 'sqlite3'

#sqliteで地名準備
db_location = "AAcode.sqlite"

#地名と行政区分コードの一覧
sqlite = SQLite3::Database.new(db_location)
sqlite.results_as_hash = true #添字にカラム名を使えるようにする

sql = "SELECT \"tiiki-code\" AS \"tiiki-code\", \"ken-name\" AS \"ken-name\",
    \"sityouson-name1\" AS \"name1\", \"sityouson-name3\" AS \"name3\"
FROM \"aacode\""

loc_names = sqlite.query(sql)

#mysqlのdbを開く
hostname = "localhost"
user = "root"
password = "*****"
dbname = "yokai_wiki"

#yokai_wikiの本文テーブルを見る
mysql = Mysql::new(hostname, user, password, dbname)
res = mysql.query("select old_id, old_text from yokai_wiki.text")

puts "old_id,aac"

#本文中の都道府県名検索
res.each do |wiki_row|
  search_word = "string"
  
  #地名を回す
  loc_names.each do |name|
    search_word = ""
    
    #検索すべき地名の決定
    if name["name3"] != nil           
      search_word = name["name3"]     #name3に地名がある場合
    elsif name["name1"] != nil
      search_word = name["name1"]     #name1に地名がある場合。3との違いがよく分からない。
    else
      search_word = name["ken-name"]  #都道府県自体を示すRowだった場合
    end
    
    #本文中に地名があるか探す
    if wiki_row[1].to_s.include?(search_word)
      #出力する
      print search_word
      puts "#{wiki_row[0]},#{name["tiiki-code"]}" #CSVの一行として出力
    end
    
  end
  
  loc_names.reset  #loc_namesのカーソルリセット
  
end

mysql.close #DB接続を閉じて終了する

項目名から本文に含む地名

それなりに形になってきた妖怪地図の地図データ作成の続き。Rubyで本文データ中の地名を抽出してCSV化、MySQLのテーブルに収めたのを項目名と突き合わせる。

SQL

select page_title, `ken-name`, `tiiki-code`, `sityouson-name1`, `sityouson-name3`, old_id 
from yokai_wiki.aacode, yokai_wiki.location_names, yokai_wiki.revision, yokai_wiki.page
where aac = `tiiki-code` and old_id = rev_text_id and rev_id = page_latest

結果の一部

抽出対象にするページ選定が大雑把なので手塚治虫とか「妖怪そのもの」ではない項目も相当数混じってますが、ひとまず地名の抽出はきちんとできている模様。

page_title	ken-name	tiiki-code	sityouson-name1	sityouson-name3	old_id	
手塚治虫	東京都	13000			31161681	
手塚治虫	東京都	13101		千代田区	31161681	
手塚治虫	東京都	13104		新宿区	31161681	
手塚治虫	東京都	13116		豊島区	31161681	
…(中略)…
ツチノコ	北海道	1000			30367417	
ツチノコ	山形県	6000			30367417	
ツチノコ	山形県	6360	最上郡		30367417	
ツチノコ	山形県	6365	最上郡	大蔵村	30367417	
ツチノコ	茨城県	8000			30367417	
ツチノコ	茨城県	8203		土浦市	30367417	
ツチノコ	千葉県	12000			30367417	
…(略)