忍者ブログ
Since 14.Jan.2009:08:29 プログラミングと絵のブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


*
そういえば*って配列に変えるんじゃなくて
引数を多重代入するための表記か。

p *3..5 == p(3, 4, 5)
p [3, 4, 5] == p([3, 4, 5])

なんだね
まぁ解決してよかった
PR

今日は初めてるびまゴルフに挑戦してみた

問題はるびまゴルフ第6回から、


seq という Unix コマンドがあります。このコマンドを使うと、数値を2つ引数にして、その間にある数を出力することができます。例えば 3 と 5 を引数として実行すると

% seq 3 5
3
4
5
というような実行結果になります。

今回はこのコマンドを実装してみて下さい。入力はコンマで区切られて標準入力から与えられるものとします。例えば

3,5
という入力に対して

3
4
5
と出力するようにして下さい。例えば

a,b=gets.split(',').map{|v|v.to_i}
a.upto(b){|i|puts i}
というようなコードと同じ出力が得られるようにして下さい。パーは 50Bytes とします。

また余力があれば、入力が

3 5
と空白区切りで与えられる場合、 seq のように引数として与えられる場合、つまり ARGV を使う場合も考えてみて下さい。





自分の解答


  1. gets=~/,/;puts ($`.to_i..$'.to_i).to_a #38Bytes

  2. gets=~/\s/;puts ($`.to_i..$'.to_i).to_a #39Bytes

  3. a,b=$*;puts (a..b).to_a #23Bytes



この3つ。
とりあえず1時間くらい頑張ってみたけどここまでだった。
とりあえずパーはクリアしたけど



添削タイム

終わった後、他の人のを見てみると、
(a..b).to_a => *a..b
にすると、3問とも6Bytes減らせるらしい。

あと1,2番はなんかうまく動かないからto_iメソッド使ってたんだけど、
getsで受け取ったら"3,5\n"になって、改行が入るみたい。
gets.chopで改行を取り除くとto_iがいらなくなって、

gets.chop=~/,/;puts *$`..$'
の27Bytes。
空白区切りなら28Bytes。

修正は↓の人を参考
http://rubyist.g.hatena.ne.jp/edvakf/20090702/1246522250

最後の詰めが甘かったw
方向性は合ってたんだけどなぁ・・・
次回はもっとがんばります。

evalとか使ってる人もいた。


  1. p *(eval"Range.new "+gets)

  2. eval"p *%d..%d"%gets.split



両方とも26Bytes。
evalは未だに良く分からん
文字列を動的にプログラムとして認識するんだっけか

てか何で
p [3,4,5]
#=> [3,4,5]
なのに、
p *3..5
#=> 3
4
5
なんだ。謎すぐる・・・
*はto_aとは微妙に違うということか・・・

今日はRuby色々触ってみた
もっと変なことできると良いんだけど

とりあえず会社のデータが別サーバな上にShift_Jisという絶望的な状態だった
ということでNet::HTTPとHpricot使って、
データ取得してから整形しようと思った次第。

まぁ失敗したけど
ちょっとアルゴリズムが悪かった
ループしまくりだったし
よし、明日できることは明日やろう


require 'net/http'

http = Net::HTTP.new("www.example.com")*1
http.start do |w|
puts w.get("/sample.html").body*2
end


これが基本形
*1でNet::HTTPにドメイン渡した状態でインスタンスを生成、
*2でNet::HTTPインスタンスを使ってgetメソッドでRequest
返り値からbodyで文字列取り出して出力。

body使わないとNet::HTTPインスタンスが帰ってくるみたい。

ちなみにpostも使える。
postの場合はパラメータ文字列(?以降)を第2引数に。
普通にパラなしで渡すときはgetしか使えない
なぜならpostは引数2つ強制だから

Javaの勉強を始め…ようと思った
疲れたので諦めてJRubyの勉強に切り替えました

よく考えたらJavaみたいな使いにくい言語に用ないし
用あるのは超豊富なライブラリだけだし
ライブラリならJRubyからでも使えるし

てかこないだ会社で受けたJSP/Servletの講習が
何故かサクラエディタで行われたせいでJavaトラウマなんだが

Javaみたいな冗長言語をIDE使わずにやるなんて…耐えられない
てか正直Eclipseも使いにくくてあんま効率化されなかった
補完機能[^ ]だし
自分としては[\t]希望

でも一応Helloくらいはやったから書いておくことにする


public class Hello {
  public static void main(String args[]) {
    System.out.println("Hello, World!");
  }
}


以上。

なんかCSSのDMLでRubyで実装されたSassってのがあるらしい
今日は早速触ってみた

まずは説明とか。
SassはSyntactically Awesome StyleSheetsの略で
「かっこいい構文のスタイルシート」らしい
CodingEdgeの記事に書いてあった。

→ Coding Edge - @IT SassでCSSの弱点を克服しよう

基本文法は、
  • ネストで親子関係を表す
  • 「&」が親セレクタ
  • 「:」は後じゃなく先につける
  • 「;」はいらない
  • 「-」のついた属性はネストで繋げてちょっと省略可能
  • 定数が使える
  • 色、文字列(単位)、数字の演算が可能
  • グループ化して複数の場所に埋め込める(Mixins)
この辺が基本か? 使い方はRubyGemsを使って gem install haml でおk hamlの中に入ってるのでこれでインストール可能 コマンドラインで sass -v って打ち込んでhamlのバージョンが出れば成功 Sassは「.sass」の拡張子で保存して、 sass input.sass output.css でコンパイルしたらCSSが生成される Ruby on RailsでSassを使うには、 コマンドラインで haml --rails xxxx/xxxx/xxx/xxx とするとSassがプラグインとしてインストールされる config/environment.rbで一番下に Sass::Plugin.options[:style] = :compressed で、CSSの出力形式を指定。 出力形式はファイルサイズが大きくて可読性が高い順に 大 <- :expanded, :nested, :compact, :compressed <- 小 基本的に読むのはSass形式で十分だし、 CSSファイルは実行時にしか必要ないから:compressedでおk :compressedだともはや人間が読むもんじゃないです ファイルサイズ小さいけど プラグインとしてインストールすると、 public/stylesheets/xxx.css が呼ばれたときに public/stylesheets/sass/xxx.sass が自動でコンパイルされて、CSSファイルになる RailsじゃなくてもMixinsや定数が使えるCSSってことで普通に優秀。 コンパイルが面倒ですがまぁそれはスクリプトでも組めばいいし

renderは部分テンプレートを読み込んで
出力の一部を別ファイルで作れるメソッドのこと。

基本的にViewはrender_to_stringと同じで文字列が作られる
Controllerはよく分からん

実はRails2.3で少し書くのが楽になった

Rails 2.3
  render @todo
  render @todos

Rails 2.2以前
  render :partial => 'todo', :object => @todo
  render :partial => 'todo', :collection => @todos

この二つが同じ意味。
元々:collectionはpartialの指定と、
ファイル内で使う変数名(collectionの単数形)を統一しないと機能しないから
当然といえば当然の修正

上のはどちらも コントローラ名/_todo.html.erbが呼ばれる
部分テンプレートにしたいファイルは「_」を付けると覚えておけばおk

ただし、:partialの指定と同じ名前にしておくのが無難
そして単数形にしておくと更に無難

ちなみに:collectionを渡すとeachみたいに使える

:locals => {symbol => object, ...}だとシンボルで指定した変数名に
値を入れて、部分テンプレートのファイル内で使用できる

:localsとか:objectで渡すと1回分だけ出力される


RJSについて

renderとは違うけどこっちも似たようなもんだから

RJSは.js.rjsという拡張子のファイルで使う記述方法
pageオブジェクトを使ってDOM操作ができる。

使い方は、scaffoldしたときにできるコントローラの一部を
使いたいアクションのところだけ

respond_to do |format|
  format.html
  format.xml { render :xml => @todos }
  format.js  <- ココを追加!
end

みたいにformat.jsを追加する
そうすると、そのアクションと同名の、例えばindexアクションなら、
index.js.rjsファイルが呼ばれる

RJSファイルの中ではpageオブジェクトを使って

page[:DOMのid名].replace_html "Hello, World!"

とすると指定したIDのDOM要素を入れ替えることができる
これはprototype.jsの$()メソッドを使用。

page.select("セレクタ"). ...

ならCSSのセレクタと同じ表記でDOMを指定することも可能
これはprototype.jsの$$()メソッド。

replace_htmlやinsert_htmlの引数は文字列だけでなく
ハッシュでオプションを与えることもできて、
renderみたいに

... .replace_html :url => todo

とすると、指定したDOM要素の中身が詳細画面になる
URLでいえば コントローラ名/todo.id かな

link_to_remoteで呼べば勝手にrjsファイルがデフォルトで呼ばれて、
画面遷移もなくすことができてウマウマです

今日はたくさん勉強した。

Ajax周りとプラグインを中心に。

まずAjaxの準備は
使用したいcontrollerのlayoutの
<% stylesheet_link_tag 'scaffold' %>の下に

<% javascript_include_tag :defaults %>

と記述。
これでprototype.jsその他全部で5つのライブラリが読み込まれる

Ajaxの基本はリンクを作るlink_to_remoteと
フォームを作るremote_form_for
引数はほとんど同じ。

link_to_remoteの第一引数はaタグ内の文字列
remote_form_forの第一引数は関連付けるオブジェクト。

第二引数は
:update => が結果を出力するID

:url => がリクエストを送るURLで、
:url => {:action => create}みたいにハッシュで渡したり、
:url => categoryみたいにインスタンス渡してIDで移動したり

あとは全部javascriptのコードを渡して、
:success => ""とか
:failure => ""とか

第三引数はlink_to_remoteならaタグの属性、
remote_form_forはブロック

link_to_remoteはhrefの初期値が#になってるから、
第三引数に{:href => url_for("URLと同じ")}あたりを書いておくと
javascript切ってる人にも見れます

とりあえずAjaxで画面遷移なしでcreateしたいなら

<% remote_form_for @todo, :update => 'todos',
  :url => {:action => 'create'},
  :success => "reset()" do |f| %>

  <%= f.error_messages %>

  <%= f.text_field :body %>
  <%= f.submit 'Create'  %>

<% end %>

かなあとは配置するactionに
@todo = Todo.new
を追加。
細かいところはまた今度やろうかな

Rails で一番楽しい scaffold と migrate をまだ書いてなかった

漏れが Rails をはじめたきっかけですよ

漏れって何。 => me

scaffold は「すきゃふぉーるど」と読む

簡単なビューとコントローラとモデルを自動的に作ってくれる便利な奴隷

もしくは友達。ボールも友達。


ちなみにこの日記書いてる途中でパソコン一回落ちたよ!

でも Google Chrome のおかげで書いてる日記のデータまで復元できたよ!

Google Chrome 万歳

何気に便利な機能を知った水曜日。

でも心臓に悪いからできれば使いたくないよ


さて。

では早速始めよう


今回使用する環境は

OS = Windows 7 beta1 Ruby version="1.8.6" Ruby Gems vesion="1.3.2" Ruby on Rails version="2.2.2" DB = SQLite3 (Rails 2.0.2 以降のデフォルト)
インストールがまだな人は→ここ←を参照 そして今回作成するアプリの完成図 じゃあコマンドラインで打ち込んでみよう
c:\> rails sample c:\> cd sample c:\sample> ruby script/generate scaffold sample text:string number:integer body:text c:\sample> rake db:migrate c:\sample> ruby script/server
一行目は Rails のプロジェクトを作成するコマンド Rails コマンドにパスさえ通っていればどこのフォルダで使ってもおk One-click ruby installer を使ってインストールしていれば大丈夫 二行目では cd (change directory ) でフォルダを移動して、 三行目でついに scaffold 登場 ruby コマンドで script/generate を起動して引数は scaffold sample -*省略- sample が作成するテーブルの単数形 自動で複数形になって samples テーブルを作成するための migrate ファイルを作ってくれる text:stringとかはテーブルのカラム情報で、 「名前:型」と書く 四行目では ちなみに MySQL の時は先に rake db:create しないと怒られます SQLite3 はファイルでDB情報を管理してくれているおかげで DBを作成する必要がないのが良いね ファイルは作成したプロジェクトの db フォルダに自動で作成 五行目でデフォルトの WEBrick というサーバを起動 じゃあ完成したサイトに行ってみよう → http://localhost:3000/samples ← ここまで来たら上の画面が見れるよ 上の画像ではもうデータを入れてあります あなたも New Article からデータを入れてみよう rails __ の時点で違う名前を使って作った人 そしてアクセスできないって人は localhost:3000 にアクセスしてみよう Rails のページが表示されたなら複数形が間違ってる可能性を疑うべきです あと rails test とかで作ったときも不具合が出たりします 最初はやっぱりそのまま打ち込んでみるのが一番かも? 次回はコードリーディングか 今回作ったサイトの拡張方法紹介でもしようかな?

今日はRubyでカレンダーを出力しようと思う

出力形式はブログみたいな横一直線型。

数字だけ出力したら地味で寂しかったので無意味に曜日も付けてます

逆に密度が高くなって見づらい;;

でもめげずに載せる

Calenderクラス calender.rb
class Calender require 'date' # *1 def initialize end def disp_month(month = Date.today.month) year = Date.today.year disp(year, month) end def disp_year(year = Date.today.year) 1.upto(12) do |month| disp(year, month) end end def disp(year, month) last_day = Date.new(year, month, -1) # *2 tmp1, tmp2 = [], [] week = %w|Su Mo Tu We Th Fr Sa| puts last_day.strftime("%Y %B") # *3 1.upto(last_day.day) do |day| tmp1 << week[Date.new(year, month, day).wday] # *4 tmp2 << "%2d" % day # *5 end puts tmp1.join(" ") # *6 puts tmp2.join(" ") end end
*1 .. Dateクラスを使うためにライブラリを読みます *2 .. 月の最終日を取得します(-1は一周回って最終日になってくれます) *3 .. 日付を strftime で整形して出力します ( %Y は年, %B は月 ) *4 .. Date#wday 日付の週を 0 - 6 で取り出して配列に入れています (それを使って事前に作ったweek配列から曜日を取り出します) *5 .. "%2d" % day は day を %2d( 整数二桁右詰め )に整形します *6 .. Array#join は指定した文字で配列を結合して文字列にしてくれます 使用方法 main.rb
require 'calender' c = Calender.new c.disp_month(4) c.disp_year(2002) c.disp(1999, 7)
まぁお察しのとおりスゴイ地味 でもまぁ・・・基本的にサーバサイドで使うなら CSS でデザイン面は補助できるからいいのさ ちなみに今回参考にさせていただいたサイト様は↓
gan2のRuby勉強日記 2008-01-04 カレンダー生成 :

まずは Ruby セットアップの覚え書きから

使用環境

Windows XP SP2 || Vista SP1 || 7 beta1

用意するもの ( for x86 Windows )

◇ One-Click Ruby Installer ( ruby186-26.exe) : http://rubyforge.org/frs/?group_id=167 ◇ SQLite3 ( sqlitedll-3_6_10.zip ) : http://www.sqlite.org/download.html ◇ Windows標準のコマンドプロンプト

One-Click Ruby Installer

Ruby と RubyGems が詰まったインストーラ
RubyGems を使用して色々インストールできます
1. ダウンロードした ruby186-26.exe を起動
2. [ Next > ] → [ I Agree ] → [ Next > ]
3. インストール先を指定して [ Next > ]
( システムドライブ直下。フォルダ名は c:\Ruby とか )

SQLite3

SQLite3はID, passwordが使用できない、ファイル型の簡易DBです
Rails2.0.2以降の標準DBとなっているので、勉強用に適しています
実際に使用する場合には MySQL などを使用すると良いかと
1. ダウンロードした sqlitedll-x_x_x.zip を解凍
2. 解凍された sqlitedll-x_x_x フォルダ内のファイルを system32 フォルダに移動
( たぶん c:\WINDOWS\system32 )
3. 以上。

コマンドプロンプト

1| C:\> gem update --system
2| C:\> gem install --include-dependencies
3| C:\> gem -v
# => 1.3.1
4| C:\> rails -v
# => Rails 2.2.2
5| C:\> gem install --version=1.2.3

		# => xxxxx はプロンプトからの出力
※C言語のコンパイラがある場合は5行目の --version=1.2.3 が必要なくなります
今回は以上

  HOME  
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
ブログ内検索
プロフィール
HN:
uguisu_an
年齢:
34
性別:
男性
誕生日:
1989/08/20
自己紹介:
基本的にテキトー
最新コメント
[10/01 くゆる]
[09/21 uguisu_an]
[09/17 mayigo]
[07/17 uguisu_an]
[07/15 shinh]
最新トラックバック
アクセス解析
フリーエリア
P R
忍者ブログ [PR]