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

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


なんか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ってことで普通に優秀。 コンパイルが面倒ですがまぁそれはスクリプトでも組めばいいし
PR

録りだめしてたアニメを地道に見たり見なかったり
とりあえず今期のと前期からの続きは

  • けいおん!
  • 鋼の錬金術師2009
  • マリー&ガリー
  • 鋼殻のレギオス
  • ハヤテのごとく!
  • タユタマ
は見てる 特にけいおん!は珍しく毎週定期で視聴中 他は貯まったのをたまに消化 今日は見てなかった咲 -Saki-を。 友達はあんま良くないって言ってたけど 面白いと思ふ でもたまにビカビカ光って「何アニメー!?」って感じも まぁああいう謎なテンションは好きですよ

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

[1] [2] [3] [4] [5] [6] [7] [8
«  Back :   HOME   : Next  »
カレンダー
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]