2013年6月1日土曜日

Bootstrapのcarouselをつかってみる その2 使ってみる

というわけでBootstrapのcarouselを実際に使ってみましょうというやつです。

の冒頭のサンプル

<div id="myCarousel" class="carousel slide">
  <ol class="carousel-indicators">
    <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
    <li data-target="#myCarousel" data-slide-to="1"></li>
    <li data-target="#myCarousel" data-slide-to="2"></li>
  </ol>
  <!-- Carousel items -->
  <div class="carousel-inner">
    <div class="active item">…</div>
    <div class="item">…</div>
    <div class="item">…</div>
  </div>
  <!-- Carousel nav -->
  <a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>
  <a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>
</div>


を使ってみます。
で、実際に使ってみたんですがこんなカンジになりました。

右上の○をクリックすると各ページに移動して、左右の△をクリックすると次/前ページ移動になります。 これとさっきのソースを照らし合わせてみてみると以下のカンジです。 #ソースに解説をつけただけです。
<!-- carousel全体のdiv --!>
<!-- class属性にcarouselとslideを指定する必要がある --!>
<div id="myCarousel" class="carousel slide">
  <!-- 右上のページ指定移動リンク -->

  <!-- carousel-indicators のclass指定で ○が横に並ぶのを実現(実際にはcssがやってくれる) -->
  <ol class="carousel-indicators">
    <!-- 右上の○の1つ1つ data-slide-to で移動先スライドを指定 -->
    <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
    <li data-target="#myCarousel" data-slide-to="1"></li>
    <li data-target="#myCarousel" data-slide-to="2"></li>
  </ol>
  <!-- Carousel items -->

  <!-- 表示する写真たち carousel-innerをclassに指定するとスライドセットとして認識される -->
  <div class="carousel-inner">
    <!-- … という部分にはimgタグ等で写真を表示する -->
    <div class="active item">…</div>
    <div class="item">…</div>
    <div class="item">…</div>
  </div>
  <!-- Carousel nav -->

  <!-- ページめくりボタン -->
  <!-- classにcarousel-control left(right)と指定してdata-slide にprev(next)を指定すると機能する --!>
  <a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>
  <a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>
</div>
うむ、簡単だ。

carouselは使ったカンジのメモとしては以下のようなものがあります。

スライドショーの全体幅を調整するには?
大外のdiv(#myCarousel)にwidthを設定すればいい

自動スライドショーを止めるには?
大外のdiv(#myCarousel)に data attribute形式で指定
以下の感じ
data-interval="false"
ちなみに指定されない場合のデフォルトは多分5000ミリ秒になってるんだと思う(感覚)

サイズの違う画像をめくろうとするとどうなる?
大外のdiv(#)で指定したwidthに収まるようにリサイズされた
恐らくwidth,heightのうちオーバーする方に勝手にリサイズされるのだろう(多分divのフツーの挙動)

ページめくり画像ってどうしてるんだ?
『>』っていう文字を装飾しているようだ
なーる

右上の○○○は画像に引きずられて移動するの?
しない
CSSで
position: absolute;
top: 15px;
right: 15px;
と指定されてる

ちなみにposition: absolute;は
親要素が position:static のときはウィンドウの左上、親要素が position:static 以外の時は親要素の左上を基準位置とし、top, left あるいは right, bottom で指定されたオフセットの絶対位置に表示します。
らしいので、この場合は親divがposition:relative; なので親要素の左上が基準位置になっている

これモーダルダイアログ化できる?
(かなり簡単に)できた
ダマされたと思ってモーダルのデモコードのbodyの部分にcarouselのコードを挿入してみなさい


と言ったところでcarouselはこんなもんで(簡単なので)
それではまた次回までごきげんよう。

2013年5月31日金曜日

Bootstrapのcarouselをつかってみる その1 マニュアル確認

だいぶ間が空いてました
すいません

で、今回から2回ぐらいでBootstrapのcarouselの使い方を見ていきます。
carouselというのはあれです。
写真とかをプレビューしてページ送りするようなやつです。

まずものは
にあります。
ちなみになんでコレがcarouselなんだ? と思った人は英語の辞書でcarouselを引いてみましょう。
carousel というのはおなじみスペースアルクで引いてくると
  1. 〔遊園地の〕回転木馬◆【同】merry-go-round
  2. 〔空港などの〕回転式コンベヤー
  3. 〔書店などの〕回転式棚
  4. 〔中世の騎士の〕馬上試合
というカンジなので、くるくる回って見えるものが変わるというのを表現しているのでしょう。
#まあ、ものを見れば一発でわかります。

で、チョット翻訳してみます。
#わかりにくいんで翻訳は青文字にしておきます。
#あと、()で囲まれているのは本文には無いけど、意味が通りやすいようにワタクシが補足した部分です。


Carousel bootstrap-carousel.js

Example carousel

The slideshow below shows a generic plugin and component for cycling through elements like a carousel.
は(ほぼ訳すまでもないですが)

(Bootstrap carouselは)カルーセルみたいに回転するスライドショーのプラグインとコンポーネントです

というかんじですね。
#全然関係ないですがカルーセルとセガールってちょっとにてますね。


Usage

Via data attributes

Use data attributes to easily control the position of the carousel. data-slide accepts the keywords prev or next, which alters the slide position relative to it's current position. Alternatively, use data-slide-to to pass a raw slide index to the carousel data-slide-to="2", which jump's the slide position to a particular index beginning with 0.

データ属性でカルーセルを使う場合。

データ属性でカルーセルを使えば位置を簡単にコントロールできます。
data-slide属性にはpref/nextを設定でき、スライドめくり(次のスライド/前のスライド)という操作を実現できます。
(exampleにあるようにリンクなどに追加すると、そのリンククリックでスライドめくりができるようになるということです。)
スライドめくりのもう一つの方法としてdata-slide-to属性でスライドのページ数を指定する方法があります。スライドのインデックスは0から始まります。

次、JavaScriptの方

Via JavaScript

Call carousel manually with:
  1. $('.carousel').carousel()

Options

Options can be passed via data attributes or JavaScriptz. For data attributes, append the option name to data-, as indata-interval="".
Nametypedefaultdescription
intervalnumber5000The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.
pausestring"hover"Pauses the cycling of the carousel on mouseenter and resumes the cycling of the carousel on mouseleave.

JavaScriptで実現する場合は
$('.carousel').carousel();
で初期化します。
(おなじみですが $('.carousel')の部分は要素抽出セレクタなので対象が指定できるならidでもいいんでしょう)

初期化の際のオプションとしては以下があります。
データ属性で実現する場合はprefixとして data- をつけたデータ属性をcarouselのコンポーネントに記述します。
(ようはcarouselの大元のdivにdata-pause="hover" とか書くということです)

オプション
interval 自動でページめくりされる時の間隔(おそらく単位はミリ秒)
pause マウスオーバーで自動めくりを停止しマウスリリースで自動めくりを再開する(と書いてあるのだが、hover→unhoverはいがいの切替セットはどうするのだろうか…)

といったあたりで大体翻訳を終わりにします。
後書いてあるのは各メソッドについて(初期化/ページめくり/停止)なのでサンプルを見ていけばわかるでしょう、ということです。

というわけで今回はここまで。

2013年3月22日金曜日

Macでフォルダの名前を変更する

Windowsで言うところの『フォルダ左クリックしてF2』でフォルダ名変更状態に入るあれです。
今までは
フォルダ右クリック➡プロパティ的なの➡フォルダ名の部分を編集
でいちいちやってた。

で、さすがにめんどくなったのでgoogle先生で
『mac フォルダ名 変更 ショートカット』
とか検索してみると、
『フォルダを右クリックした状態(アイコン反転した状態)でEnter押せばいいよ』
って出てきた。

ハハハ こやつめ
さすがにそんな簡単なはずあるまい

………
……

できちゃったよ…
以下のカンジ。


右クリックとかで選択状態にしてEnterを押すと

編集状態に


編集してフォーカスを外したりすると

編集終了

早くググっておけばよかったーーー

2013年3月3日日曜日

Twitterのbootstrapを使ってみるその2 ~使ってみる~

というわけで前回の続きをやっていきます。

今回やるのは
  1. 挙動制御はデータの属性ではなくJavaScript制御にしたい
  2. モーダル起動のフォームがリンクになっているのでボタンにしたい。
  3. モーダルの中身を修正したい
  4. ボタンのテキストを変えたい
というできる人なら速攻でできそうなヤツです。
でもワタクシはできる人ではないので少しずつ見ていきます。

JavaScriptで動かす場合は、



コントローラフォーム(『押したときにモーダルを立ち上げようとするボタンとかリンク』のこと)のclickイベントをハンドリングして、modal('show');
を呼び出すとモーダルが立ち上がる、という感じなので以下のコードになりました。

htmlのほう
    
    
  
  
  


クリックイベントでモーダルを立ち上げるJavaScriptは以下のカンジ
#ムロンreadyイベント中にハンドリングしている


    // イベント詳細ボタンが押されたらモーダル立ち上げ
    $("#button-showmodal").click(function(){
        // HTMLで定義したtestModalをセレクトしてモーダルメソッドを呼び出し
        $("#testModal").modal('show');
    });


ソースコメントにも記載したけど、モーダルを表示させる際のポイントは以下のカンジ

  • アンカー(a)からボタン(button)に変える際にはボタンのclickイベントハンドリング用にidを加えておく(とやりやすい)
  • 不要属性(data-attributeでmodalを制御する用)のhrefとdata-toggleは消す
  • ボタンのクリックイベントでmodal('show'); をモーダルのdivに対して呼び出す
で、モーダルの中身を記述する際のポイントは下記

  • モーダルの中身はヘッダー/ボディ/フッターというおなじみの3パーツで構成されている
  • class属性にmodal-headerとか指定することでモーダルのheaderとして表示される(bootstrapのJavaScriptとCSSに『これはmodalのヘッダーだよ』と伝えることができる)
  • モーダルを閉じるコントローラにはdata-dismiss="modal"を指定することでモーダルを閉じる機能を追加できる(と思われる)

モーダルが3部構成することだけわかっていれば、あとはその各パーツに好きなHTML書けば好きなように表示できるはずだ。

というわけで今回は一旦以上。
次回はajaxのmodalだ。

2013年2月28日木曜日

Twitterのbootstrapを使ってみるその1 ~マニュアル読み~

witter bootstrapのモーダルを使おうというはなし。
英語のマニュアルを難なく読める人なら困らんでしょうが、ワタクシの用に困る人もいるかも知れないので、導入メモを書いておきます。
全三回くらいで以下の流れで掲載します(予定です)。
  1. マニュアルをよむ
  2. とりあえずつかってみる
  3. カスタマイズしてみる
というわけで今回はマニュアルを読むはなし。

まず、オフィシャルのマニュアル。
ココにサンプルも使い方もあるので、正直このとおりにやればまず大丈夫なはずなので、『なんだ これがあれば大丈夫だ』と言う人はココで読むのをやめて美味しいビールでも飲みに行くのが良いと考えます。

続けます。
で、マニュアルこの部分の構成は。
Modals bootstrap-modal.js
Excample
     static example
     live demo
Usage
     Via data attribute
     Via JavaScript
     Options 
Methods
Events

となっているので(エキサイト)邦訳すると以下
『モーダル ~bootstrap-modal.jsで実現するエレガントなモーダル~』
サンプル
     静的なサンプル(ソースと静的な画面表示を見せるよ)
     ライブデモ(動きのあるデモを見せるよ しかもソース付きだ)
使い方
     (HTMLの各フォームの)属性で実現する場合
     JavaScriptで実現する場合
     オプション
(このモーダルを利用する際のJavaScriptの)メソッド
(このモーダルで発生する)イベント

の感じになる。

さしあたり動かして気分良くなりたいので、以下のソース

Launch demo modal





を貼りつけてみる。


で表示してみると以下のような感じ。(青字の説明はコッチで入れた) 
#ムロンbootstrap.js(全部入り)とかbootstrap.cssはインクルード済の実験画面



うむ、コレだけでもだいぶいいな、と思いつつ以下の修正をしたい。
  1. 挙動制御はデータの属性ではなくJavaScript制御にしたい
  2. モーダル起動のフォームがリンクになっているのでボタンにしたい。
  3. モーダルの中身を修正したい
  4. ボタンのテキストを変えたい
  5. ajax通信でフォームを投稿したい
というわけでやっていくことにする。
#5以外はだいたいだいじょうぶなはず。

1. 挙動制御をデータの属性ではなくJavaScript制御にする。
まあ気分的な問題もあるのですが、属性でやられると『なんでこうなるんだっけ?』になったり、『間に処理挟みたいんだけど…』とかになったりするので、やっておきます。

そのためには以下を確認しておきましょう。
  • JavaScriptでモーダルを実現する方法(やりたいことなので)
  • データ属性でモーダルを実現する方法(現在の状態から何を消せばいいかを明らかにするため)
【JavaScriptでモーダルを実現する方法
マニュアルに
とありますので、訳すまでも無いけど以下の感じ。
『1行のJavaScriptでモーダルメソッドをid="myModal"に対して呼び出しましょう。』
うむ、これはあれだ、下手に翻訳するよりコードを見せた方が早いというやつだ。
要は、『モーダルとして使用するdivのidを指定してjQueryオブジェクトを取得して、モーダルメソッドを呼びなさい』、だね。
#多分特定(セレクタで一意に抽出)出来るなら id じゃなくclassとかでもいいんだと思うけど、まあidセレクタが無難でしょう。

あとこれdivじゃなくてspanとかformとかで出来るのか気になるけど、それはまた機会があったら実験して見ることにしよう。
#全体を囲ってCSSのdisplay:noneを適用できるのが、多分divだけなのでdivなんだと思うけど。

データ属性でモーダルを実現する方法
マニュアルに


とあるので、さっきのよりは訳しがいがあるので訳してみると以下の感じ。
JavaScriptを使わずにモーダルを有効にする場合、コントローラ要素(ボタンとか)に data-toggle="modal" という属性を追加します。
さらにターゲットのモーダルを指定するのには以下のどちらかの属性を追加します。
  • data-target="#foo"
  • href="#foo"
なのでコントローラ(モーダルを立ち上げるボタンとか)側にdata-toggle と [data-target="{モーダルのdivのid}" or href="{モーダルのdivのid}"]
を指定すればいいらしい。なーる。

あとはモーダルに対するオプションについて

という感じなのでついでに邦訳してみると以下の感じ。

オプション
オプションはデータ属性またはJavaScriptで指定することができます。
データ属性で指定する場合は data-{属性名} のようにして指定します。
レとしてbackdropオプションを指定するのであれば data-backdrop="" という形式でコントローラ要素に追加します。

backdropオプション
⇒ よくわからんが、多分『trueを指定するとモーダルの背景クリック時にモーダルを閉じる、さもなくば閉じない(なにも起きない)、そしてdefaultはtrue』ということだと思う。
あれ? 
さっきのお試し画像の青字で『周囲はグレーアウトされてて操作できない』って書いてなかったっけ?
うん、試してみたらできた、ゴメン。大人はウソツキではないのです、間違いを犯すだけなのです。

keybordオプション
⇒escキーでモーダルを閉じる、defaultはtrue。

showオプション
⇒初期化時にモーダルを開くか、defaultはtrue。これはよくわからん。初期化=画面描画ならいきなり立ち上がるってこと? でもその挙動はしていないので、『modalメソッドの呼出=初期化』でありそのmodalメソッドの呼出時に起動するかどうか、ということだろうか。
うーん。
remote
⇒リモートurlを指定すると、jQueryでajax通信をして取得できた中身を.modal-bodyに展開する。ベンリ。そしてなぜこれをtabAPIでやってくれない。

というあたりで今回はコレぐらいにします。
マニュアルの残りは
  • Method
  • Event
なのでやりながら見ていくとして、次回は実際に動かしたり、自分用のモーダルを作ったりしてみます。

2013年2月20日水曜日

Rubyのeachの中でインデックス番号を扱う

よくあるネタ。
知らない人(というかチョット前の自分)はこんなふうに書いてるはず。
i = 0
goldsaints.each do |goldsaint|
    # ここは第2の宮 そしておれはカプリコーンのアルデバランだ のようなメッセージを出力する
    p 'ここは第' + (i + 1).to_s + 'の宮 そしておれは' + goldsaint.asterism + 'の' + goldsain.name + 'だ'
    # (エレガントでない)インデックスインクリメント
    i++
end

しかしいつものことだけど、『外側でローカル変数を宣言して中でインクリメントして…』的なやり方は実にださい、しかしeachはベンリなので使いたい、とかいう流れになる。
# javaでも拡張forループはベンリだけどindexが必要になる場合は普通のforループとか使ってた。

で『rubyならそのへん上手くやってくれるんじゃない?』と思い先生に『ruby each index』とか聞いてみたところ、『each_with_index』なるメソッドがあるらしい。

うむ、コレを使えばブロックの変数宣言のところで
|element, i| 的にして中でiが使えるらしい。
となるとさっきのコードは

goldsaints.each_with_index do |goldsaint, i|
    # ここは第2の宮 そしておれはカプリコーンのアルデバランだ のようなメッセージを出力する
    p 'ここは第' + (i + 1).to_s + 'の宮 そしておれは' + goldsaint.asterism + 'の' + goldsain.name + 'だ'
end
となる。
ちょっとエレガントになった、しめしめ。

2013年2月14日木曜日

railsでDBのトリガーっぽいことをやる

やりたい事は以下の
『モデルAを作成(DBにレコードを登録)した際に、別のモデルも登録する』
みたいなの。

抽象的に書くと分からんので具体例にすると『全種類合わせた商品購入履歴を登録する』みたいなやつ。
例としては、ぶき・ぼうぐ・どうぐの購入履歴テーブルがあった時に、全部の購入履歴をと管理するようなテーブルを同時に用意しておくみたいなやつ。

こんなもん『SQL結合すれば専用テーブル作らんでもいいだろ』というはなしもあるのですが、以下のメリットがあるので作ることにしました。

  • 複雑なSQLを書かなくてて済む
  • 履歴⇒履歴詳細データという辿り方が簡単にできる(前購入履歴には各履歴への参照キーを持たせる想定)


よくある話なのでWeb上にもそこら中に情報が載ってますが、備忘録として書いておきます。
#railsはモデルの関連性が簡単にかけるのでこの手の話はすぐできる。
#あと、そもそももっと上手くやる方法があるのかもしれん風来のシレン。

整理すると

  • やりたいこと:あるレコード新規登録時に別のテーブルにもレコードを登録するようにする
  • 実現の基本方針:(きっと)railsのActiveRecordにはいい感じのメソッドがあるのでそれでやる


で、以下のようにした。
# 武器購入履歴モデル
class BukiKounyuRireki < ActiveRecord::Base
  # 以下の情報を持つ
  # 購入した武器のID
  # 購入者の名前
  # 個数
  attr_accessible :buki_id, :user_id, :count

  # レコード登録時に発動するコールバックafter_createメソッドを定義
  # |record| は登録した元レコードの中身が入っている
  after_create {|record|
    # 前購入履歴テーブルにレコード(購入者、武器購入履歴ID[武器IDではない],購入物タイプ)を登録する
    AllRireki.create user_id: record.userid, rireki_primary_id: record.id, item_type: 1
  }
end

サマリーすると、

  • after_createメソッドを使って定義します
  • フック元のレコードはafter_create のブロック内で宣言した第一引数として使用できます(正確な説明ではない可能性が高い…)

ということです。

↑のモデル関連だとあんまり力を発揮しませんが、履歴の幅を広げて、
どんな道具を使ったか記録したい
誰と話したか記録したい
とか言うように、元履歴のテーブルの構造がバラバラになれば今回のようなモデル(全履歴管理モデル)がパワーを発揮してくる(とおもう)。