Since 14.Jan.2009:08:29
プログラミングと絵のブログ
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
なんかCSSのDMLでRubyで実装されたSassってのがあるらしい 今日は早速触ってみた まずは説明とか。 SassはSyntactically Awesome StyleSheetsの略で 「かっこいい構文のスタイルシート」らしい CodingEdgeの記事に書いてあった。 → Coding Edge - @IT SassでCSSの弱点を克服しよう 基本文法は、
- ネストで親子関係を表す
- 「&」が親セレクタ
- 「:」は後じゃなく先につける
- 「;」はいらない
- 「-」のついた属性はネストで繋げてちょっと省略可能
- 定数が使える
- 色、文字列(単位)、数字の演算が可能
- グループ化して複数の場所に埋め込める(Mixins)
PR
録りだめしてたアニメを地道に見たり見なかったり とりあえず今期のと前期からの続きは
- けいおん!
- 鋼の錬金術師2009
- マリー&ガリー
- 鋼殻のレギオス
- ハヤテのごとく!
- タユタマ
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 を追加。 細かいところはまた今度やろうかな
マクロについては Cみたいにdefine宣言でマクロの設定が可能 具体的には -define(ERLANG, "Programming language Erlang"). -define(MACRO1(X, Y), {a, X, b, Y}). 2行目みたいに関数も使える 使うときは?を付けて?ERLANGとすると その部分が文字列"Programming language Erlang"に置換される ?MACRO1("Erlang", 163)は {a, "Erlang", b, 163}というタプルになる タプルはなんかListみたいなやつ 何が違うかは知らん あとErlangで特殊なのはリスト内包表記とか? [処理 || パターン <- リスト, 条件]. リストを1つずつ条件に照らし合わせて パターンマッチさせて それを一番左ので処理してリストとして出力する 例えば List = [{male, mash}, {female, seila}, {male, gaia}, {male, ortega}]. List2 = [{man, X} || {male, X} <- List]. ならListの中でタプルの1つ目がmaleのアイテムを処理する List2は[{man, mash}, {man, gaia}, {man, ortega}]となる この辺はちょっと説明しにくい 今回は条件省いたけど 普通に比較演算子とか関数使って条件に合わせたものだけ 処理したり、処理のところに関数使ったりもできる X*2で2倍にしてから返したりね
無名関数は fun(X) -> X*2 end. とfunを関数名にして.の代わりにendで終了を示す また、戻り値または引数に関数を使う関数を高階関数という 無名関数の中でも使えて、 戻り値に関数を返すときは Add = fun(X) -> (fun(Y) -> X + Y end) end. として、 Add5 = Add(5). Add5(7). #=> 12 みたいに値を設定して使うことができる 上ではXを5として、とにかくなんにでも5を足すAdd5を作ってみた 次に、比較演算子は =:= /= =/= が珍しい =:=は==と同じだけど型変換をしない =/=は/=と同じだけど型変換をしない Erlangでは!=の代わりに/=を使う つまりnot equal 3 == 3.0 #=> true 3 =:= 3.0 #=> false 上の例なら分かりやすいかな?
けっこう重要なこと書き忘れてたけど Erlangは最適化が必要なくなるように変数への代入が1回限り 2回目入れようとしたら これは変数の束縛というらしい 正しくは=は代入の演算子ではなく、 パターンマッチ用の演算子で RubyみたいにListから複数の変数に多重代入とかも可能 関数の引数みたいに[H | T]でListの最初の要素(ヘッド)を 取り出したりとかもできるよ ちなみにヘッドだけ取り出すときはTはいらない いらない変数は_で現すか、_を付けて_Tと現す こうすると関数の中で使わなくても警告が出ない 使うか使わないか分からなければ_を付けとくといいかも ちなみに_は特殊な変数で束縛されない でも取り出すこともできない 「束縛」という意味は下を見ると分かるかも? Var1 = 5 #=> 5 Var1 = 14 #=> エラー Var1 = 5 #=> 5 束縛されてない変数に=を使うと変数が5に束縛される 違うものを入れようとするとエラーが出るけど 同じものを=で繋ぐと比較が行われるだけ エラーにはならない これは他の言語やってると珍しいね
Erlangではfor文が使えないようです(! よって別に関数を作って再帰処理します まぁ不便というよりは ループの中身は別関数に分けるのが元々推奨されてるし 再帰処理のベタなプログラムといえば 階乗と相場が決まっているのでErlangで階乗のプログラム -module(factorial). -export([start/1]). start(N) when is_integer(N) -> factorial(N, 1). factorial(0, Res) -> Res; factorial(N, Res) -> factorial(N-1, Res*N). 以上 最初の2行は前の記事を見てもらうとして 4行目のwhen is_integer(N)は前に言ったガードというもの これに一致したときだけ処理をする is_integer(N)はもちろん整数かどうかの判定です 1つ目のfactorialは0になったらResを返す 2つ目のfactorialはNを1ずつ減らして Resに今のNを掛けていく関数 いちいち引数に前のループの結果を渡しているのは、 前の結果を保持する必要がなくするため Erlangでは末尾再帰 (再帰に処理を渡した後、渡す側の関数でもう処理がない再帰) にすれば、渡す側の関数は破棄されるので 引数に渡しておけば前の分のメモリ保持が必要ないから 必要最低限のメモリで再帰処理ができるらしいよ まぁループないといってもmapとかforeachとかで Listは簡単に処理できるからほとんど ループなんて使わなくても処理できるけどね
まずはHello, Worldから 正直erlコマンドでBEAMっていう対話式のインタプリタに入って io:format("Hello, World.~n"). で終わりなんだけど せっかくなのでコンパイルできるファイルにしてみる -module(hello). -export([hello/0]). hello() -> io:format("Hello, World.~n"). 以上 -module(hello).がモジュール名の宣言 これはファイルをhello.erlにしないとダメ つまりモジュール名とファイル名は統一する 他の言語と違ってイニシャルは小文字 大文字にするのは変数のみ -exportは他の言語で言えばスコープをpublicにするのと同義 []がListで、配列みたいなもん helloが関数名、0が引数の数 Erlangはオーバーロードを使える上に 引数の数が違ったら同じ名前の関数でも 完全に違うものとして扱われるから引数の数の指定が必要らしい hello() ->が関数の記述の開始 io:format()はioモジュールのformat関数を呼ぶ Erlangでは\nの代わりに~nで改行 ~sとか~pとか使って埋め込みもできます そのときは io:format("~p is ~p", ["Erlang", "Good"]). でListを与えて置き換え ちなみに.が関数の終了 複数行に渡るときは最終行だけ.であとは,で区切る オーバーロードの時は.の代わりに;を使う 例えば add({add, X, Y}) -> Z = X + Y, Z; add({mul, X, Y}) -> X * Y. {}で囲んだのはタプルといって、Listとは微妙に違うみたい どこが違うかは知らん add, mulは変数ではない イニシャルが大文字じゃないし これはAtomといって、Rubyとかのシンボルみたいなものかな 文字列みたいにそのまま渡せる 大文字を使いたかったら'Add'って感じに''で囲む 文字列は""しか使えない Erlangの場合、引数の受け取りはパターンマッチで行う [H | T]とするとListを最初の要素とその他で分けて受け取れるし つまり上記の例のようにパターンマッチで分岐させることもできる よってErlangではif文をあまり使わないらしい ガードっていう条件まで付けれるし 同じパターンで違うガードの関数が増えるとcase文を使う
VirtualBoxにUbuntu 8.04を入れてErlangをインストールしてみた 前からUbuntuは入れてあったのだけど 最初はWindowsで普通にErlangやってた でも途中でUbuntuがあったのを思い出して せっかくだからUbuntuでやろうと思った 正直EmacsとかVimとか使ったことないから Linuxでやる必要性は感じないけど たまにはLinux系のエディタも使いたい なんかデキる人みたいだし キーボードだけで操作できるようになったら効率あがるし まぁとにかくインストールしたわけです 最初は一気に飛ばすタイプなので書くことがいっぱい 次に続くw
カレンダー
10 | 2024/11 | 12 |
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 |
ブログ内検索
プロフィール
HN:
uguisu_an
年齢:
35
性別:
男性
誕生日:
1989/08/20
自己紹介:
基本的にテキトー
カテゴリー
最新記事
(10/30)
(08/12)
(08/12)
(07/05)
(06/29)
最新コメント
[10/01 くゆる]
[09/21 uguisu_an]
[09/17 mayigo]
[07/17 uguisu_an]
[07/15 shinh]
最新トラックバック
アクセス解析
フリーエリア
P R