_onichannn

【Vim】複数の先頭行に文字を挿入する。

例えば大量の行をコメントアウトしたい場合。

1, [Ctrl + V]で矩形選択モードへ。

2, [Shift + G]で最終行まで選択。

3, [I]でインサートモードへ移行。

4, 「#」を入力。

5, [esc]でインサートモードを抜ければ完了。

これは簡単。めっちゃ便利。

 

【Symfony2】のHTTPキャッシュを有効にする方法。

とても簡単。

まずはapp.phpの下記2行のコメントアウトを外す。

require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppCache($kernel);

んでコントローラーで下記のようにレスポンスを返す。

$response = new Response();
$response = $this->render('HogeFugaBundle:Default:index.html.twig');
$response->setPublic();
$response->setSharedMaxAge(300);

return $response;

以上、完了!
これだけで組み込みリバースプロキシの共有キャッシュが動作するなんて素敵過ぎる。

下記スライドにわかりやすく纏められてます。(感謝!)

http://www.slideshare.net/hidenorigoto/symfony2http-cache-reverse-proxy

 

【Angular.js】のSEO対策。

angular製のアプリをgoogleに正しく取得してもらうためには、下記記事の通り、ヘッダー内に多少の細工を施す必要がある。

まずは、このページがダイナミックアプリケーションであることを伝えるために、下記metaタグを追加する。

<meta name="fragment" content="!">

次にJavascriptnのwindowオブジェクトに下記変数を定義。

window.prerenderReady = false;

最後にビューのレンダリングが完了した際に上記変数をtrueにしてやる。

window.prerenderReady = true;

window.prerenderReadyに関しては記述の必要性に関して下記のページが参考になる。

http://scotch.io/tutorials/javascript/angularjs-seo-with-prerender-io

window.prerenderReadyのセクションに

There is a high probability that you will not need to include this snippet, but the option is there if you need it.

のような記述が見受けられる。
これは「この記述は必要じゃない可能性が高いけれども、もし必要であるならばオプションとして用意されているよ」って意味なのかな?
兎に角これで動的なタイトルであっても、Google先生は正しく補足してくれるようになる模様。
今後も要調査項目かな。

 

【HTML】 はどちらを書けばいいのか。

http://stackoverflow.com/questions/4696499/meta-charset-utf-8-vs-meta-http-equiv-content-type

答えはHTML5であれば前者(短い方)を使うべきとされている。とのこと。

更なる詳細はググろう。

 

【bootstrap3】リスト要素のスタイルを全て無効にするクラス。

を見つけたのでメモ。

<ul class="list-unstyled">
    <li>...</li>
</ul>

これでリストのstyleが全て無効になる。

 

【Symfony2/Doctrine2】Many-to-Manyのテーブルでリレーションテーブル内をカウントしたい場合。

例えば、記事とカテゴリがあって、カテゴリの数が多い順でカウント、ソートしたい場合のDQLは下記の通りになる。

$dql = "select
            c.id,
            c.name,
            count(c.id) as cnt
        from
            HogeFugaBundle:Categories as c
        join
            c.articles as a
        where
            c.status = 1
        group by
            c.id
        order by
            cnt desc
";

DQLでのjoinのやり方は面白いね。

 

【Angular.js】keypressイベントを拾う。

いちいちビューから$eventを渡して判定処理をかくのもダサいので、ディレクティブで定義されてるものを見つけてきた。

app.directive('ngEnter', function () {
    return function (scope, element, attrs) {
        element.bind("keydown keypress", function (event) {
            if(event.which === 13) {
                scope.$apply(function (){
                    scope.$eval(attrs.ngEnter);
                });

                event.preventDefault();
            }
        });
    };
});

ビューでこう使う。

<div>
    <input type="text" ng-enter="doSomething()">    
</div>

うん。これは便利。

 

【Angular.js】ビュー変更(ルーティング切り替え)時のベストプラクティス。

HTML5モードと非HTML5モードの自動切り替えをAngular側にやってもらうためにも、aタグにリンクを埋め込むのではなく、$locationサービスを用いてルーティング変更を行うべき。

下記例。

コントローラー側に下記のようなメソッドを定義。

$scope.changeView = function(view){
    $location.path(view);
}

ビュー側から下記のようにして移動先のロケーションパスを渡せばOK。

<button ng-click="changeView('/about')">ほげ</button>

といった感じ。