sinatraのサンプルコード
http://www.sinatrarb.com/intro-jp.html
How to: Return JSON from Sinatra - Nathan Hoad
シンプルさを追求した感じのライブラリ。
"SinatraはRubyで下記のような最小労力で手早くウェブアプリケーションを作成するための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上でJruby、IronRubyやバージョン別の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ファイルを生成する
前振り
- Windows XP SP3
- ruby 1.9.2p0 (2010-08-18) [i386-mingw32]
xml - Ruby Support for SVG - Stack Overflow 「RubyでSVG使うためのライブラリ無いの」「Cairoはどうよ」とかいうやり取りだと思われる。
For Windows user:
% gem install cairo --platform x86-mingw32
Ruby bindings
本題
=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 …(略)