2013/04/24

[Backbone.js] イベント関連で起きやすいメモリリーク

Backbone.jsを使っていて起きやすい問題ってのを紹介してくれている記事があった。 その中で、頻繁に起きてしまいそうなメモリリークの問題。 onを使ってview側でmodelのchangeイベントをbindしていると、viewを削除した後でもイベント経由でmodelからviewへの参照が残ってしまうらしく、メモリが解放されない。
var MyView = Backbone.View.extend({
	initialize: function(){
		this.model.on('change', this.render, this);
	},
	render: function(){
		//render処理
	}
});
viewをremoveした際に自動で参照を解除するにはonではなくlistenToに変更するとよい。
initialize: function() {
	this.listenTo(this.model, 'change', this.render);
}
違いはイベントをひもづけているのがmodel->viewからview->modelへ変わったこと。 なのでviewを削除すればview->modelへの参照も自動でなくなり、メモリも解放される。 参考Avoiding Common Backbone.js Pitfalls

2013/04/03

[Backbone.js] 自分で作ったイベントをViewとCollection(またはModel)で連携させたい

「次を読む」ボタンを押すとAJAXで次のリスト一覧を取得する。 アンド、取得し終わったらさらに次のページがあるのかどうかチェックして、なかったら「次を読む」ボタンを非表示にするってのをやった。 まずはCollection側で独自イベント登録
var MyList = Backbone.Collection.extend({
 initialize: function(){
  //自分独自のイベントフックを登録
  this.on('nothingNext', this.myEvent)
 },
 load: function(){
  //何かを読み込む処理
  if(次のページがなかったら){
   //自分で作ったイベントを起動
   this.trigger('nothingNext');
  }
 },
 myEvent: function(){
  console.log('俺独自のイベントだ');
 }
});
var mylist = new MyList();
Viewも独自イベントに連動させる
var Btn = Backbon.View.extend({
 collection: MyList,
 initialize: function(){
  //collectionの独自イベントが起動した時に一緒に動かしたいメソッドを登録
  this.collection.on('nothingNext', hideMe);
 },
 hideMe: function(){
  this.$el.hide();
 }
});
CollectionをModelに変えてもできる

2013/03/26

MySQLでエラー [Incorrect string value]


ブログシステムのメール投稿機能でエラー。
MySQLエラー [Incorrect string value]
文字コードの問題って話が多いけど、今回は違った。

本文に絵文字が入っていたため。

ガラケー時代はほとんど起きなかった問題。
スマートフォンになって多様になったなー。

PHPの場合、変換不能な文字は削除する関数があったはず。
文字コードを一度変換してから、最初の文字コードに戻すって処理をすればエラーになるような文字は削除される。

前に対処したはずだったんだけど…
新しい問題かも。


--add 2013.4.24
iPhoneの「メッセージ」(吹き出しアイコンの方)で写真とタイトルのみで送信すると、メールのbodyが画像のデータだけになっていた。
そういう状況を想定していなかったので、画像のbase64データをテキストとして処理しようとしてしまっていたらしい。

今までの機種だと、メールの本文なくても空っぽのプレーンテキスト枠があったんだけど、iphoneだとそれもなくなってた。

2013/03/08

compass使ってたらsingle-transitionでエラーになった


Undefined mixin single-transitionとかなんとか、そんなエラー。
結論だけかくと、バージョンアップしたら治った。

調べてたら、「2つ同時にcompass watchしてたせいだったっぽいよ」って言ってた人もいたので、そういう場合もあるのかも。

2013/03/04

[WordPress] functions.phpに入れていたら少し楽になる関数

WordPressでimgタグを書くのが面倒
<img alt="sample" height="100" src="<?php echo 'TEMPLATE_DIR' . '/sample.jpg' ?>" width="100" />
functions.phpに下を追加
define('DIR', get_bloginfo( 'template_directory' ));
/* imgタグを返す */
function img_tag($file, $alt = '', $opt = array()){
  //ディレクトリ名は自分の環境に合わせて
        $path = DIR . '/images/' . $file;
        if(!empty($alt)){
                $opt['alt'] = $alt;
        }
        $etc = '';
        foreach($opt as $key => $value){
    //引数のデータをそのまま属性に追加している。
    //必要だったら値のチェックをしましょう
                $etc .= ' ' . $key . '="' . $value . '" ';
        }

        $path = sprintf('',
                $path,
                $etc
        );

        echo $path;
}
使い方
<?php
img_tag ('sample.jpg', 'alt属性', array('width' =>100, 'height' => 100)) ?>
//省略も可
//<img class="php" code="" src="テンプレまでのパス/images/sample.jpg'>
少しだけimgタグを書くのが楽になると思うんだけどどうだろう? cssを追加するのも少しだけ楽になる↓ 配列で渡せるようにしてもいいかも
function css_tag($file){
    echo sprintf('',
            DIR . '/stylesheets/' . $file
    );
}
まあ、他のフレームワークのパクリなんだけどね

2013/02/22

[Rails] Windowsでgem install libv8がエラーになる


Railsを使ってサイトをつくった。
メインはMacで開発してるんだけど、場合によってWindowsで開発する時もあった。
管理はgitでやっていて、Windowsでgit pullして最新版を表示!と思ったらエラー。
libv8が入んないからbundel installしろとのこと

やってみた。
がインストール時にエラー
gem install libv8しろとのこと

やってみた
がやっぱりインストール時にエラー

情報を求めては苦手な英語サイトをさまよい、解決法を色々試したがダメ…

数時間まよった挙句…
「なんかWindowsにはlibv8入れる必要ないらしいよ!」
とのこと。
ハハハ。

Gemfileもgitで管理してたから、Windowsでもそれに合わせようとしてたみたい…
こういう場合どうするんだろ?
.gitignoreで除外するのも困るしな
と思いながらよく見たらあった…

gem 'therubyracer', :platforms => :ruby
↑これがコメントアウトされてた。
自分で
gem 'therubyracer'
部分だけ追加してた…


参考サイト
http://www.ruby-forum.com/topic/4398451(英語)
http://stackoverflow.com/questions/6356450/therubyracer-gem-on-windows(英語)

2013/02/12

[MooTools] アニメーション中にIE7でエラーが起きる


IE7はサポート対象外だったこともあり、大した調査はしていないが、一応報告
MooToolsのTweenでtransitionをback:outにしていたら、恐らくアニメーションで変更する値の計算部分でエラーが起きたらしく、アニメーションの途中でいきなり止まってしまう問題があった。
起きていたのはIE7だけ。
今回はtransitionの種類を変更するだけで良かったので、原因は調べてない。
もし理由が判明しないけどtweenあたりでエラーが出る場合は試してみては。