Rails 3.2 partialに関数を渡し、処理してもらう。

繰り返しが必要な部分をpartialにしてしまいたくなるときがあると思います。

<% @products.each do | product | %>
<%= render ‘product’ %>
<% end %>

こうすると partialをproducts分だけ読み込むので、処理が遅くなるときがあります。
ですからこのようなループはpartialの中に入れてしまい、元の配列を渡すようにしています。

<%= render ‘products’ , products: @products %>

そしてpartialの内部で

<% products.each do |product| %>

<% end %>

こうすればpartialの中でループが行われるので、呼び出されるのは一度だけです。
ところがこのループの中で、それぞれのproductに対し処理を入れたいときがあります。

例えば管理者用の製品一覧画面と、ユーザー用の製品一覧画面があったとします。
管理者用の画面にはすべての製品を表示し、
ユーザー用の製品一覧画面にはプロダクトオブジェクトに公開のフラグが立っているもののみを表示したいとします。
※そもそもこの場合はコントローラー+モデルで配列自体を変更すると思いますが、あくまで例です。。

その場合、lambdaを利用してpartialに匿名関数を変数として渡す方法があります。

■管理者用のpartial呼び出し

<%= render ‘products’, products: @products,
lambda_publish: lambda{| product | true }
%>

■ユーザー用
<%= render ‘products’, products: @products,
lambda_publish: lambda{| product | product.publish?}
%>

■partial側

<% products.each do |product| %>
<% if lambda_publish.call(product) %>
..
<% end %>
<% end %>

この方法のメリットとしては、partial側を簡潔にすることができる点にあります。

他にヘルパーを使うことが一般的だと思いますが、そうするとcase-when文が登場したりしてヘルパーが太っていきます。

javascriptでよく関数を引数に渡すことがあると思いますが、それと似たような感じで使えるのでとても重宝しています。

 

Facebookページとは?を説明するときに自分なりの回答を考えてみた。

■このような記事を書いた経緯

時々、あまりインターネットに触れる機会のない人にプライベートでも仕事でも出会います。
そして、私がインターネット屋さんだと知るとFacebookって何?とよく聞かれます。
都度、うまく回答できないので一度自分なりの説明を書こうと思ったわけです。いまさらですが。

■Facebookページとは

まずFacebookから説明します。
※わかりやすさを重視しておりますので厳密に正しいかはご容赦ください。
FacebookとはSNSというサービスのひとつです。
SNSというのはユーザー登録をしたもの同士が
さまざまなコミュニケーションを取れるインターネット上のサービスになります。

具体的にどのようなことをするのかというと
日記のようなものを書くことになります。
日記というとある程度長い文章を想像しますが、たいていは短いコメントのようなものになります。

それらを書いているだけでではただの日記ですが、
友達※1の書いたものが
※1:「友達になろう」→「いいですよ」としたユーザー同士です。実際の友達とは意味がちょっと違います。
自分のページに表示されますので、
友達が書いていることを見ることができます。
それに対しコメントを書いたり「いいね」ボタンを押したりすることで、
「この人がコメントしましたよ」とか「いいねと言ってますよ」と通知されます。

そうやって日常思っていることを公開・共有することで、
思いがけないところからの反応があり、コミュニケーションを増大させます。
この増大は楽しいものです。煩わしくて嫌いな人もいるかもしれません。

よく企業ホームページなどで「いいね」と書かれたボタンを見ることがあると思いますが、
あれをFacebookにログインした状態で押すと、
自分がそのページを「いいね」と言っているという内容の投稿をすることになり、
友達にそれを伝えることになります。

つまり「いいね」と言うと同時に「(友達に)いいですよ」といっていることになります。
企業側から見るとそれはよい広告になるわけです。

さてFacebookページですが、これはFacebook上に作られるページです。
個人ユーザーになるとその人のホームページのようなページが作られるのですが、
それの企業や団体などの「人でない者」版であると思ってください。
一見するとそのページは(Facebook上での)企業ホームページのようにも見せることができます。

機能としては個人のものとそれほど変わらないのですが、
Facebookページ自体にはユーザーが「いいね」 をすることができます。

「いいね」をしたユーザーに対し(友達とは別に)更新情報を通知することができるわけです、
つまりFacobookページに「いいね」をするということは、
「(友達に)いいですよ」といっていると同時に
「更新情報を見たいですよ」といっていることになります。

Ruby on Rails 3.2 Arel + Postgresql のgroup – having節でエラー

やりたかったのは人物の検索結果を出すことです。
検索条件として、例えば男性で、東京在住であるというような、その人物の「属性」でand検索するというものになります。

いきさつははしょりますが、簡単に言うとsqliteでの開発段階でgroup having節を使っていた部分が、postgresqlに変更してからエラーがでたということが発端になります。

postgresqlでは

must appear in the GROUP BY clause or be used in an aggregate function

というエラーがでて、目的のことをやるには一旦select文を分割せねばならないようでした。

SQLを直接書けばそれ自体は難しくないのですが、なんとかArelをできるだけ活用してできないものかと試行錯誤しました。

ハードルはどのようにサブクエリをarelで組み立てるのかということ。

この問題に関してはこちらの記事が参考になりました。

まず、クラスにたいしarel_tableメソッドでArel::Tableクラスのインスタンスを取り出します。
※pattributes_peopleテーブルに対しPattributePersonクラスです。察しの通り、これはPersonとPattributeクラスの関連クラス

sub = PattributePerson.arel_table

次に条件のひとつとして使用するArel::Attributes::Attributeクラスのインスタンスを作成します
※pattributes は[‘1′,’2’,…] のような属性のIDが入った配列です。
AND検索なのでinにしたいところですが、ここでは一旦in_anyで該当する行をすべて取り出しておきます。

attr = sub[:pattribute_id].in_any(pattributes)

最後にサブクエリの本体となるArel::SelectManagerクラスのインスタンスを取り出します。

select_manager = sub.project(table[:person_id]).where(attr).group(:person_id).having(“COUNT(person_id) >= #{pattributes.length}”)

→pattribute_idがpattributeのリストに一致するものすべてを取り出しておいて、person_idが重複しないように圧縮します。
そのときperson_idがpattributesの数分だけあるもののみ取り出しています。つまり、pattributeが全部該当した者=ANDと同じ。

これを他のArel::Tableでくっつけてひとつの条件(Arel::Attributes::Attributeクラスのインスタンス)を作成します。

person_table = Person.arel_table
attr2 = person_table[:id].in(select_manager)

 あとはこのままpeopleとして取得するなり、他の条件と結合するなりできます。

@result = Person.includes(:user)
@result.where(attr2)

group節がサブクエリになったことでエラーは出なくなりました。

jquery UI jQuery UI – v1.8.23 Dialogの画面スクロールに固定させる

jquery UI の Dialogは基本的にDialogの箱を position: absolute にしている。

スクロールするとダイアログはそのまま置いていかれ、画面の外にいってしまう。

それが困るので、画面に固定させる方法を色々試してみました。

最も簡単な方法が position: fixedにする方法です。

[javascript]

box = dialog.parent() //dialogはdialog()メソッドを呼んだ後のjqueryオブジェクト
box.css({position: ‘fixed’})
[/javascript]

しかし、これだとリサイズした際にjquery UIがpositionをabsoluteに戻してしまうらしく、バグが起きました。
というわけでリサイズした後に再度position: fixedに戻してやることで対応しました。

[javascript]
function fix(){
box = dialog.parent()
if(box.css(‘position’) == ‘absolute’){
top = parseInt(box.css(‘top’)) – $(window).scrollTop()
left = parseInt(box.css(‘left’)) – $(window).scrollLeft()
box.css({position: ‘fixed’, top: top + ‘px’, left: left + ‘px’})
}
}
fix()
dialog.on(‘dialogresizestop’) = function(e){
fix()
}
[/javascript]

ポイントはposition: absoluteと position: fixedではleftおよびtopが
相対値と絶対値という違いがあるのでwindowのスクロールポジションから補正してあげることです。

この記事は jquery UI -v 1.8.23にて検証したものです。
それ以外のバージョンでは状況が違う可能性があります。

ruby 1.9 hashの組み合わせ

ハッシュに含まれる要素に対しすべての組み合わせを試すコード
例えばA,B,Cというものがあった場合にAB, AC, BC を 作成します。

[ror]
def test
original = {A: ‘a’, B: ‘b’, C: ‘c’}
copied = original.dup
a = []
original.each do | key1, val1 |
copied.delete(key1)
copied.each do | key2, val2 |
a << [key1, key2] #something code
end
end
a
end[/ror]

パパ会なるもの作りました。

息子がもう2歳になりました。

保育園の送迎をするなかで感じるのはお父さん達が多いこと。

最近では送りも迎えもしているのですが、
半分とはいかないまでも、近い割合でお父さん達に出会います。

保育園に通っているということは、シングルか、もしくは両方とも働いている家庭なわけです。
共働きの家庭にとって母親だけが子供の面倒をみるという価値観がそもそも無いのかもしれません。

主婦もまだまだ多く、 やはり母親にしかできない役割も多いですから
行政や企業が提供しているコミュニティも母親主体のものがほとんどです。

それでも日本各地でで「パパ会」「イクメン会」なるものがあるらしく、
なかなか楽しいようでして、それで私も作ることにしたんです。

じゃあ集まって何するかという部分ですが、とりあえず子供をつれてみんなで遊ぼうということになってます。

もうすこし人が集まれば育児のプロなんかをよんでセミナーをひらいたり、
行政と協力したりしてイベントをしたりすることで、横のつながりを強化し、
地域のより強いコミュニティーの構築を目指します。
また、せっかく父親が子供を連れて行くということにしたので、
フリーになったお母さんにもママ会をひらいてもらうことにしました。

男ばかりが 子供をつれて集まっている状況はなんだか面白そうではないでしょうか。

リンク:横浜パパ会 http://papakai.dyo.jp/

RubyMine: 空になってしまったファイルを元にもどす(復元)ことができた件

最近RubyMineを使っているのですが、

作業中にノートPCの電源をうっかり電池切れさせてしまいました。

電源をつないで再開してみるとWindowsが再起動状態に。。

 

やばいなー、と思いつつRubyMineを立ち上げると、

3時間くらい作業したjsファイルが空に!

 

落胆と焦りを落ち着かせ、なんとかなるはずだと言い聞かせて

いろいろ試したところ。ファイルを復元することができました。

 

Projectタブで復元したいファイルを右クリック>

Local History > Show History

 

これで自動的に保存されていたファイルの履歴が出てきます。

※たぶん初期設定でその量やタイミングが設定できるはず。

 

履歴から壊れる前のものを選択してコピペ。

ほっ

PR会社のおこなっていること

最近参加している経営者の会で、PR会社の社長さんにお話を伺ってきました。

PR会社という広告代理店とは違う、比較的新しい業態が数年前から盛んに行われているようです。
私も何冊か以前に本を読んだことがあったのですが、その頃はまだPRという業態が発展段階のような印象でした。
インターネットの発展で混沌としていたのもあります。バイラルなどのワードが懐かしいですね。

さて、お話を伺ったのはVectorという会社の子会社の社長さんになります。
あまり詳しいお話はドコまで書いていいものかわかりませんので書けません。

PR会社は下記のようなことを行うそうです。

・質の良い情報を作る
・それを広告としてではなく、メディアの本題(たとえばニュース)として取り上げてもらう

質の良い情報を作るという工程ではいろいろなケースがあるようでして、
場合によっては商品を作ったりもするそうです。
たとえばブランド力があり、類似する商品との比較情報を作ってみたり、商品の効果・効能などを立証したりするみたいです。

■いいところだなと感じた点
・メディア(テレビ番組やニュースサイトなどいろいろ)の運営側にしてみれば、勝手に記事をつくってくれる。
・広告主にとっては自分の商品がよりよく消費者に伝わる → 売れる
・ 消費者にとっては質のよい情報が得られる。

■一人の消費者として感じること
何が良いものなのか、自分にとって役に立つものは何か、必要なものは何か、
多かれ少なかれ、それを日々判断しなくてはなりません。

影響力のある人物に「良い」と言わせたり、ブログに書かせたり、
口コミを操作していったりすることも現実的にはあるようです。

広告と違うのはそれらの情報のどれが操作されたもので、どれがそうでないのかがわからない点にあります。
また操作された情報であるからといって、それを信じた消費者に対し良い影響を与えることが多いという点も注意すべきところです。

どうしたって情報収集やその判断のためにメディアを活用しなければならず、
どんなに拒んだところで何かしらの影響は受けてしまうのでしょうが、
私はだれかに操作されるのが好きではないので、
ひねくれているといわれようがなるべくそのような影響を受けないようにしています。

ただ、何かを買うとき、あー操作されちゃってるかもしれないなと思ってしまうのがちょっと、うん、なんとなく。

Illustrator:角を丸くするメモ

出っ張った角を丸くしたい半径=A
引っ込んだ角を丸くしたい半径=B

アウトライン後のフォントを選択>

1: 効果>パス>パスのオフセット>オフセットを-A(マイナスAの半径)で入力・角の形状、マイター>OK>
2: 効果>パス>パスのオフセット(警告が出たら「適用」)>オフセットをA+B(AとBを足したプラスの半径)で入力・角の形状、ラウンド>OK>
3: 効果>パス>パスのオフセット(警告が出たら「適用」)>オフセットを-B(マイナスBの半径)で入力・角の形状、ラウンド>OK>オブジェクト>
4: アピアランスを分割。

売掛金の踏み倒しに出会い、逆に損害賠償で訴えられるカモ

昨年の暮れからちょうど仕事も減ってきたのもあって、念願だった自社独自のアプリケーションについて開発することに主にして仕事をしてきました。

それでも新規の案件もちらほらと受け、昔からのお客様の更新や相談などの仕事をし、ここ一年は売り上げは激減したものの充実は変わらず、ただひたすら与えていただいた仕事と自ら作った使命を行ったりきたりしながらお仕事してきました。

原宿でレンタルドレスを経営している会社の社長さんと出会ったのはちょうどそのころで、売り上げが激減しているという共感と彼の夢の話も手伝って、赤字覚悟で受けたのがホームページのリニューアルでした。

予算があまりないとのことでしたが、100万円だけ準備してもらえるように約束し、オンラインレンタルのシステム・コンテンツの整理と再構築・リデザインを請け負いました。
オンラインショップと違うのはいずれその商品は戻ってくる点で、既存のオンラインショップシステムでまかなうことができません。
また、単純にレンタルするシステムではなくトータルコーディネートの機能も必要で、商品の組み合わせによるオーダーや、ショップにいるスタイリストとやり取りできる機能も必要でした。

およそ4ヶ月(構想2ヶ月、実装2ヶ月)かけてそれらのシステムを構築し、前ホームページのコンテンツもリデザインと再構築を済ませ、リニューアルを完了しました。
いざ商品の撮影とデータの入力の段階になった頃、不穏な空気が漂い始めました。

 

商品撮影のレクチャーをして、データ入力のフォーマットを渡し、それらをもとに弊社で初期設定をする手はずでした。ご請求してもかまわないとの連絡を受けて請求書をお出ししました。
金額は100万円と仮払いしていた写真素材代やドメイン代などを足したものです。

私としてはシステムが稼動すれば売れそうだという自信がありました。恩恵はその後のバージョンアップや更新などで享受しようと考えており、社長にもそうしたいと伝えてありました。

「ご請求金額はすべて月末に振り込みますよ」との連絡がありました。ですが実際には10万円が振り込まれていました。

あれ、桁を間違えたのかな、きっとそうだ、それから仮払いの分も忘れているのかな、と気楽に考えて問い合わせたところ、「ちょっと手元にお金が用意できず、来週にはすべて振り込みます」とのこと。

そうか、そういうこともあるのかな。と一時的なものと思って気にも留めず、引き続き残りの仕事をしていました。

約束の日時に口座を確認すると今度は20万円が振り込まれていました。

なんだかこれはおかしいぞ。そこで初めていやな予感がしました。

 

それからたびたびそのような、「いついつ振り込みます」「振り込まれてません」を繰り返し、なんだか不安な気持ちを抱えつつ、メンテナンスやサポートを数ヶ月続けました。
6月ぐらいだったと思いますが、どこかで区切りをつけないとと思って話し合いました。

サーバーは稼動させておいて、お振込みいただくまでサポートはしなくてもよいとし、9月の末までを期限としました。
そして仮にそれを過ぎた場合はサーバーも落とし、今後引き続き一緒に仕事をしていくことは難しくなると伝えました。

知る限りで先方の事情をお話しすると、震災以来売り上げが激減し、打開策としてのオンラインレンタルでした。翌年になっても売り上げは改善されず、システム構築をはじめてからも予想よりも売り上げが上がらなかったようです。
最終的な話し合いをした時点では、銀行融資を申請しており、9月末が融資がおりると銀行担当者から伝えられていた期限で、 それ以外にもいくつかの売掛金があったようで、弊社に支払う意思も根拠もあるように見えました。

9月末の段階になって心配になり、電話を何度か入れてもつながらず、不穏な空気を再び感じた私はメールをしました。
内容は「9月末までの支払いは大丈夫か」という確認と、「もしだめな可能性があるのであれば、うちのサーバーは約束どおり止めなければならないので新しいサーバーを用意して引継ぎを今からしておかないと」という忠告でした。

これに対しても連絡はなく、予想通り振込みもされておらず、10月に入ってからやっと電話がつながったので問いただしたところ、「お金がない」「連絡をしなかったのは結果がすべてだから」と言います。
ああいよいよ追い詰められているなと感じました。

目当ての融資がおりるのが2週間くらいのびた。それで払う。
というので、約束の期限をすこし延長しました。
この時点でもう一緒にお仕事するのは難しかったので、新しいサーバーを用意しておくことを薦めました。

期日近くなってどうやら融資はおりないことがわかり、うちにも払えないとの連絡がありました。

いよいよサーバーをとめて、終わりにするしかないです。

問題になったのは旧サイトをどうするかという点でした。旧サイトはレンタルサーバーで稼動していましたが更新時期が来たので、うちのサーバーを一時的につかうことにしました。コンテンツを移し、それはそれでまだ稼働中でした。

 

約束の時間になっても相変わらず新しいサーバーを用意していないようで、サーバーをとめられると彼らは非常に困る状態であるのはわかっていましたが、何度もコレを繰り返してましたのでもうストップしないと収集がつかないと考えました。
予定通りサーバーを停止する旨ををメールで伝え、実行しました。金曜日のことです。
あんなにがんばったのにな。と、虚無感と落胆の週末を向かえました。
先方にも 結局何にも残らなかったわけです。

 

いよいよ売掛金が焦げ付いたと思った私は弁護士に回収できる可能性があるかを相談しましたが、
金額が少ないので、回収出来たとしても手元にはあまり残らないという現実がありました。
なにより時間がかかります。 こんなことに時間をかけるぐらいなら損切りをして自分のやるべきことをするほうがよいと考え、訴えることを断念しました。

ただ、一応払うつもりがまだあるのかを確認したところ予想していない返答が帰ってきました。
弊社を訴えるというのです。
サーバーをとめたことによる損害賠償だそうです。

どうやら週末の間ホームページが非表示になったことによる損害で、悪意のある故意だというのです。
驚きでした。たしかにストップしたのは故意ですし、損害があるのはわかってましたが、こちらで対応する義務はないとおもってました。
忠告してましたし、準備期間も十分あったはずです。

「すでに弁護士に相談してある。書類が届く。今後は弁護士を通して話してほしい。」と、いよいよきな臭くなります。

数日たっても書類が届くことが無かったので、先方の弁護士に連絡するとまだ正式なオファーを受けてないので受ければ書類は出すことになるとのことでした。

 

現在は不審が落胆に変わり、憤りが反省に代わっています。

いまさらなのかもしれませんが、もっと人を見る目と会社のリスク管理の能力を養わなくてはなりません。
抱えているものが少ないことに甘えていました。もっと厳しくあるべきです。

今思い返せば彼にはルーズなところがありました。

・時間をめったに守らない
・会議の内容を次の時には忘れていることが多い
・過去にあった人とのトラブル話が絶えない

など。これだけあって信用してしまう自分がどうかしてると思います。
未だに決して彼は悪人ではないと思うのですが、ルーズであるとはいえそうです。

なんらかの形でこの出来事を消化しなくてはならないのですが、
これから自分発信のビジネスを始めようとする時にこのような経験をしてよかったと思っています。
まぁ本当に訴えられたらお話は続いてしまうのですが。。