October 27, 2012

backbone.js関係のソースリンクメモ


jQuery(最新版)
http://code.jquery.com/jquery-latest.min.js
http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js


jQuery(バージョン指定)
http://code.jquery.com/jquery-[version].min.js
http://ajax.googleapis.com/ajax/libs/jquery/[version]/jquery.min.js


underscore.js(GitHub)
https://github.com/documentcloud/underscore

backbone.js(GitHub)
https://github.com/documentcloud/backbone

HTML Escape Helper(Chrome拡張)が便利。

ブログにサンプルのHTMLコードを書く時は、一旦、適当なエスケープサービスサイトに行ってエスケープしてから貼り付けて書いていました。
これが非常に面倒でうんざりしてきたので、Chromeの拡張を探したら、有りました。

HTML Escape Helper
https://chrome.google.com/webstore/detail/html-escape-helper/jbecnlhnhpflhdghljloofiahhdidngj

とても便利です。感謝。
逆変換と、タブの  x 4変換が出来ると最高だなー。

backbone.jsでTwitter Bootstrapのdropdown-menuのclickを監視してclickされたliの属性を取得する

メモ。

HTML
<ul class="dropdown-menu">
    <li id="id_xxx">xxx</li>
    <li id="id_yyy">yyy</li>
    <li id="id_zzz">zzz</li>
</ul>

View(backbone)
events:
{
    "click .dropdown-menu li" : "click",
},

//略

click: function(e)
{
    console.log($(e.target).attr("id"));
},

October 21, 2012

FuelPHPのoilが喋りました!!

ホントですw
MAC OS X Mountain Lionで確認しました。
(後半に書きますが、oilが喋るのはMACのみだと思います。)

試しに
--
php oil r yahman --speak
--
としてみて下さい。
(tasks/yahman.phpは存在しない状態で実行して下さいね。)


ソースを確認したところ
packages/oil/classes/command.php
\Cli::option('speak') and `say --voice="Trinoids" "{$e->getMessage()}"`;
が犯人ですw


この愛らしく(?)無駄(!?)な機能は、1.0には無く、1.1で備わったみたいです。
https://github.com/fuel/oil/commit/d783136dc8c7add1b61fbb0cb84156a9cb577d8e
ググってもあまり情報が出てこなかったので、放置されていたのでしょうか。。。


`say --voice="Trinoids" "yahman"`;
とかすれば、意図的に喋らせることが出来ます。


このsayコマンド、MACのコマンドなんですね。

前述の"Trinoids"は声の種類を指定していて、他にもありますね。


ブラウザが急に喋り出して止め方がわからずパニックにさせられるアレですかね??


仕掛けがわかれば大したことはないですし、何の役にも立ちませんが(笑)、
こういった遊び心はイーんじゃないでしょうか。

あと、コントローラとかでやっても喋りませんので、
無駄に企んだりしないようにw


P.S.
oilのhelpを見ると、-tでも喋るとありますが、実際には喋りません。
報告くらいはすべきだろうか。。。

October 15, 2012

さくらインターネットの共用サーバにFuelPHPのoilコマンドをインストールする

さくらインターネットの共用サーバにoilコマンドをインストール出来ました。
以下を参考にさせて頂きました。
さくらインターネットで FuelPHP をインストールするには?


共用サーバなので
http://press.nekoget.com/fuelphp_doc/index.html
のように
$ curl get.fuelphp.com/oil | sh
としても、パーミッションの関係で失敗するので、少し遠回りする必要があります。

以下がその方法になります。
尚、~/.cshrcや~/.profileで~/local/bin/にパスを通してある前提です。



(1) 移動
--
%cd ~/local/bin/
--



(2) ~/local/bin/oilとしてDL
--
%curl get.fuelphp.com/oil > oil
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   244  100   244    0     0    364      0 --:--:-- --:--:-- --:--:--   518
--



(3) ~/local/bin/oilを編集
* bashのパスを変更。
* PREFIXを修正。
* sudoの記述を削除。

以下、diffです。
--
%diff oil.org oil
1c1
< #!/bin/bash
---
> #!/usr/local/bin/bash
3c3
< PREFIX="/usr/bin/"
---
> PREFIX="/home/[username]/local/bin/"
6,7c6,7
< sudo sh -c "curl --silent http://get.fuelphp.com/installer.sh > ${PREFIX}oil"
< sudo chmod +x ${PREFIX}oil
---
> sh -c "curl --silent http://get.fuelphp.com/installer.sh > ${PREFIX}oil"
> chmod +x ${PREFIX}oil
--



(4) ~/local/bin/oilに実行権限を与えて、実行
--
%chmod +x oil
%./oil
--



(5) 再度、~/local/bin/oilを編集
* bashのパスを変更。

以下、diffです。
--
%diff oil.org oil
1c1
< #!/bin/bash
---
> #!/usr/local/bin/bash
--



(6) 好きな場所に移動してoil create xxxする
--
%cd ~/xxx/yyy
%oil create fuelphp
Cloning into './fuelphp'...
remote: Counting objects: 14421, done.
remote: Compressing objects: 100% (5009/5009), done.
remote: Total 14421 (delta 9810), reused 13585 (delta 9179)
Receiving objects: 100% (14421/14421), 2.20 MiB | 643 KiB/s, done.
Resolving deltas: 100% (9810/9810), done.
Submodule 'docs' (git://github.com/fuel/docs.git) registered for path 'docs'
Submodule 'fuel/core' (git://github.com/fuel/core.git) registered for path 'fuel/core'
Submodule 'fuel/packages/auth' (git://github.com/fuel/auth.git) registered for path 'fuel/packages/auth'
Submodule 'fuel/packages/email' (git://github.com/fuel/email.git) registered for path 'fuel/packages/email'
Submodule 'fuel/packages/oil' (git://github.com/fuel/oil.git) registered for path 'fuel/packages/oil'
Submodule 'fuel/packages/orm' (git://github.com/fuel/orm.git) registered for path 'fuel/packages/orm'
Submodule 'fuel/packages/parser' (git://github.com/fuel/parser.git) registered for path 'fuel/packages/parser'
Cloning into 'docs'...
remote: Counting objects: 7747, done.
remote: Compressing objects: 100% (2740/2740), done.
remote: Total 7747 (delta 5252), reused 7282 (delta 4874)
Receiving objects: 100% (7747/7747), 2.26 MiB | 729 KiB/s, done.
Resolving deltas: 100% (5252/5252), done.
Submodule path 'docs': checked out 'dfe62191224b794010e15d1ccf464f2597e3102c'
Cloning into 'fuel/core'...
remote: Counting objects: 24248, done.
remote: Compressing objects: 100% (7339/7339), done.
remote: Total 24248 (delta 16925), reused 23655 (delta 16381)
Receiving objects: 100% (24248/24248), 3.77 MiB | 730 KiB/s, done.
Resolving deltas: 100% (16925/16925), done.
Submodule path 'fuel/core': checked out '61ef4c098485035f4d625d87238e4d408dfa59e5'
Cloning into 'fuel/packages/auth'...
remote: Counting objects: 621, done.
remote: Compressing objects: 100% (410/410), done.
remote: Total 621 (delta 278), reused 549 (delta 211)
Receiving objects: 100% (621/621), 74.91 KiB | 80 KiB/s, done.
Resolving deltas: 100% (278/278), done.
Submodule path 'fuel/packages/auth': checked out 'd5c78ff7e3b1698334747587505d79baf59a3158'
Cloning into 'fuel/packages/email'...
remote: Counting objects: 426, done.
remote: Compressing objects: 100% (250/250), done.
remote: Total 426 (delta 175), reused 414 (delta 164)
Receiving objects: 100% (426/426), 58.61 KiB, done.
Resolving deltas: 100% (175/175), done.
Submodule path 'fuel/packages/email': checked out '6a38100229aa02c905d143c200a0dac5184a174e'
Cloning into 'fuel/packages/oil'...
remote: Counting objects: 1207, done.
remote: Compressing objects: 100% (494/494), done.
remote: Total 1207 (delta 695), reused 1180 (delta 674)
Receiving objects: 100% (1207/1207), 151.56 KiB | 174 KiB/s, done.
Resolving deltas: 100% (695/695), done.
Submodule path 'fuel/packages/oil': checked out 'e0947076c4058104f92d8465ccb82d2ac93f6b72'
Cloning into 'fuel/packages/orm'...
remote: Counting objects: 14665, done.
remote: Compressing objects: 100% (4426/4426), done.
remote: Total 14665 (delta 10152), reused 14514 (delta 10018)
Receiving objects: 100% (14665/14665), 2.10 MiB | 661 KiB/s, done.
Resolving deltas: 100% (10152/10152), done.
Submodule path 'fuel/packages/orm': checked out '42a37ce5d639bc6485b907764280dca3285a2bf9'
Cloning into 'fuel/packages/parser'...
remote: Counting objects: 764, done.
remote: Compressing objects: 100% (368/368), done.
remote: Total 764 (delta 384), reused 710 (delta 334)
Receiving objects: 100% (764/764), 128.80 KiB | 80 KiB/s, done.
Resolving deltas: 100% (384/384), done.
Submodule path 'fuel/packages/parser': checked out 'f85eafe3ed198bf51feb7c3c1c7116aa3a77ea24'
Made writable: /home/xxx/yyy/fuelphp/fuel/app/cache
Made writable: /home/xxx/yyy/fuelphp/fuel/app/logs
Made writable: /home/xxx/yyy/fuelphp/fuel/app/tmp
Made writable: /home/xxx/yyy/fuelphp/fuel/app/config
--

FuelPHPのORMでconditionsを持ったRelationの書き方。

FuelPHPではORMモデルでテーブル間のリレーションを設定出来ます。
例えば
Model_Parent(parentsテーブル)とModel_Child(childrenテーブル)が1:N。
parents.id = children.parent_id。
として
children.gender = 'male' のカラムのみをcreated_atの昇順で取得する$_has_many。
children.gender = 'female'のカラムのみをcreated_atの昇順で取得する$_has_many。
を設定する場合、以下の書き方になります。
(order_byはascの場合、KeyのみでもOKです。)
protected static $_has_many = array(
    'children_male' => array(
        'key_from' => 'id',
        'model_to' => 'Model_Child',
        'key_to' => 'parent_id',
        'cascade_save' => true,
        'cascade_delete' => true,
        'conditions' => array(
            'where' => array(array('gender', '=', 'male')),
            'order_by' => array('created_at' => 'asc'),
        ),
    ),
    'children_female' => array(
        'key_from' => 'id',
        'model_to' => 'Model_Child',
        'key_to' => 'parent_id',
        'cascade_save' => true,
        'cascade_delete' => true,
        'conditions' => array(
            'where' => array(array('gender', '=', 'female')),
            'order_by' => array('created_at' => 'asc'),
        ),
    ),
);
参考:

使い方は、以下の通りです。
$parent = Model_Parent::find($parent_id);
$children_male = $parent->children_male;
$children_female = $parent->children_female;

FuelPHPでUndefined class constant 'MYSQL_ATTR_COMPRESS'

メモです。


FuelPHPで以下のエラーが出たら
ErrorException [ Error ]: Undefined class constant 'MYSQL_ATTR_COMPRESS'

config/db.phpのconnection設定に
--
'compress' => false,
--
を追加。


環境:
FuelPHP(1.3)

参考:


P.S.
ついでにQiitaのFuelPHPタグのフィードを購読するようにしました。
http://qiita.com/tags/FuelPHP/feed.atom

October 8, 2012

do.comは便利かも

do.comというタスク管理サービスを知りました。
https://do.com/

プロジェクト単位でのタスク管理が可能なサービスです。
今のところ、無料で使えるようです。

大分類としてグループがあります。グループは複数作成可能です。
また、グループの中に複数のプロジェクト、複数のタスクを作成可能です。

タスクは、プロジェクトに属しても属さなくても良いみたいです。
なので、グループのみに依存していて、プロジェクトには依存しない。
みたいなタスクが作れます。

共同作業者は、グループ単位とプロジェクト単位で、それぞれ設定可能なようです。

タスクには添付ファイルを付けられます。
面白いのが、Googleドライブ内のファイルを添付出来る点です。
その際、Google側での認証が必要なのですが、
けっこう色々な権限を許可しなければなりませんでした。

なので、メインのGoogleアカウントとサブのGoogleアカウントで
Googleドライブ内の特定のディレクトリを共有。
サブのアカウントでdo.comと連携。の形にしてみました。

これで、do.com側がアクセスできるのはサブのアカウント。
ドキュメントの編集はメインのアカウントでも可能。となります。

ただ、やり取りのサクサク感はchatworkに軍配有りな印象。
do.comは、とりあえず一人で使い込んでみよう。。。

October 4, 2012

FuelPHPのFormatクラスのCSVで囲い文字をダブルクォートでは無くす方法(configファイル未使用)

以下、FuelPHP 1.3で確認しています。

囲い文字という表現が正しいかはさて置き、FuelPHPのFormatクラスは、
CSVの各値がダブルクォートで囲まれている事を前提にしています。

参考:
FuelPHP の Format クラスは CSV が「"」で囲まれることを前提にしている

ソースを見てみると、以下のConfig値が有りました。
* format.csv.newline
* format.csv.delimiter
* format.csv.enclosure
* format.csv.escape
* format.csv.regex_newline

囲い文字のダブルクォートはformat.csv.enclosureになります。

アプリ側で
Config::set('format.csv.enclosure', '')
しても、反応はありませんでした。

理由は、Format::_init()でConfig::load('format', true)している部分です。
アプリ側でsetした値が飛んでしまいます。

app/configディレクトリにformat.phpを置いても良いのですが、
どうも気が進まなかったので、以下の方法で半ば強引にねじ伏せてみました。

(1)
アプリ側でConfig::load('format'true)する。

(2)
アプリ側でConfig::set('format.csv.enclosure', '')する。

(3)
普通にFormatクラスを使う。
ex). $data = Format::forge($data, 'csv')->to_array();

これでOKです。

ポイントは
Config::load($file, $group = null, $reload = false, $overwrite = false)
の$overwriteはfalseがデフォルトである部分です。

アプリ側で先にConfig::load('format'true)して
Format::_init()でのConfig::load('format'true)を無効化する感じです。

--

2012/10/06 追記
$overwriteじゃなくて$reloadかも。

MantisBTのファイルアップロードで関係している値

php.ini:
upload_max_filesize
post_max_size

config_inc.php(MantisBT):
$g_max_file_size

保存先がDB(MySQL)なら、さらに以下。

my.cnf:
max_allowed_packet

max_allowed_packetにほんの少しハマってしまいました。。。
要注意。