2015年10月16日金曜日

jquery.lazyload.jsを使ってみた(画像の遅延読み込み)

こんにちは開発者のKです。

スマートフォンでWebページを閲覧する機会が増えた昨今、比較的貧弱な3G回線でもスムーズに閲覧できるように
サーバへのリクエスト数やダウンロードするリソースの容量はなるべく抑えたいですよね。

通常ページ容量の大半を占めるのは画像だと思いますので、その一つの解決策として画像の遅延読み込みを実装したjqueryのプラグイン「jquery.lazyload.js」を使ってみましたので所感を述べたいと思います。

遅延読み込みについて

通常ブラウザはHTMLを1行目から順に解析していき、imgタグやcssのbackgroudで指定された画像を発見した際、即時画像のダウンロードを開始します。
画像の遅延読み込みとは、この読み込みタイミングを遅延させ、ページを一度表示し終わった後に非同期でダウンロードしようというものです。
ブラウザの表示領域は限られていますから、表示領域の外にある画像は、あとから読み込んでも影響は少ないよね、という考え方です。
これにより、最初にページ読み込みが完了までのページ容量を削減し、表示速度の高速化が期待できます。


使い方

簡単な使い方は以下の通りです。
  1. jquery本体とlazyloadを読み込みます。
  2. 遅延読み込みさせたいimgタグにlazyクラスを付与します。このクラス名は任意に変更可能です。srcには仮で表示させる画像を指定しておき、data-originalに本来表示させる画像のURLを指定します。
  3. step2で付与したlazyクラスを持つ要素に対して、lazyloadを実行します。その際、様々なオプションを渡すことができます。










lazyloadのオプション

ソースを見ると、lazyloadには様々なオプションがありますが、公式ドキュメントなどでもあまり触れられていないので、紹介したいと思います。

threshold

thresholdで指定したピクセル数より下にある画像を読み込み対象とすることができます。
デフォルト値は0なので、描画領域に入った際に読み込み開始しますが、例えばスマートフォンで縦にスクロールしていくリストページを考えた時、640としておけば次の1スクロール分も事前に読み込んでおくことができます。

failure_limit

一度読み込み対象となったが、何らかの理由により読み込み完了していない画像を、何回まで再読み込みを試みるかを指定します。
コードを読んだだけで実際に試していないので、間違っていたらすみません。

event

読み込み対象を検知するイベントを指定します。デフォルトはscrollなので、ページスクロールの度に読み込み対象を再走査します。
ここにはカスタムイベントを指定することも可能で、例えばスワイプによるカルーセルUIを実装したプラグインと組み合わせて、スワイプの度に再走査をかけることも可能です。
※jqueryカスタムイベントの発火はtrigger('event_name')で行えます。

effect

遅延読み込み後に画像を表示する際の効果を指定します。デフォルトのshowはただ表示するだけですが、
fadeInとすると、アニメーションでリッチに表示することができます。

container

遅延読み込みを行う範囲を指定します。デフォルトはwindowオブジェクトなので、ページ全体となります。
特定のdivタグ内に限定したい場合などに使えると思います。

data-attribute

imgタグのdata属性の名前を変更できます。デフォルトはサンプルの通りdata-originalですが、他ライブラリとの名前の衝突などで変更したい場合に役立ちます。

skip_invisible

trueを指定すると、対象の画像が可視状態でない場合(display: noneなど)は読み込みがスキップされます。

appear

対象の画像が描画領域に入った際に(threshold含む)実行されるコールバックメソッドを登録できます。
第一引数には遅延読み込み前の要素数、第二引数にはオプション(lazyloadで渡したものとデフォルト値がマージされたもの)が渡されます。
一覧ページにおいて、画像以外にもtwitter, Facebookボタンの様な通信を要するウィジェットが実装されているケースがあるかと思います。
そんな時にページ表示時にまとめて初期化するのではなく、個別に初期化処理を走らせれば、より初回表示時のコストを削減できますね。
イメージ:
$('img.lazy').lazyload({
    appear: function (left, settings) {
        // ツイートボタンも遅延読み込み
        (typeof twttr !== 'undefined') && twttr.widgets.load();
    }
});

load

appearと似ており、対象の画像が読み込み完了した際に実行されるコールバックメソッドを登録できます。

placeholder

画像が遅延読み込みされるまでに表示する仮画像を指定します。
デフォルトではグレーの画像となっていますが、任意の画像に差し替えることができます。
元のimgタグのsrcに指定しても同じ挙動となります。


遅延読み込みはSEO的に良くない?

こんな記事がありました。
最近ではGoogleのクローラもJavascriptを実行できるようですが、遅延読み込みのトリガーの実装方法によっては、クローラに画像が認識してもらえないケースがあるとのことです。
ユーザの入力を起点(スクロール等)とする場合、クローラは再現できないようですね。

実際にFetch as Googleしてみて何かわかったらまた記事にしたいと思います。


2015年10月15日木曜日

Googleアナリティクスのカスタムキャンペーンとは

こんにちわ山田です。

グーグルアナリティクスにてアクセスの解析に欲しい機能がありました。
リファラーのない、広告やメルマガからの流入を測定する方法です。
調べてまとめてみました。
目的のURLのクエリストリングに計測パラメータを付けることにより実現します。

■グーグルから便利なURL生成ページがあります
https://support.google.com/analytics/answer/1033867?hl=ja


パラメータ 対応するディメンション 設定する項目 必須/オプション
utm_source 参照元 媒体名を指定 必須
utm_medium メディア 広告の種類を指定 必須
utm_campaign キャンペーン 広告のキャンペーン名を指定 必須
utm_term キーワード 広告のキーワードを指定 オプション
utm_content 広告のコンテンツ 広告の種別などを指定 オプション

パラメータは複数あり、上記の3つは必須です。
こんな感じのURLが生成されます。
http://stpsysdev.blogspot.jp/2015/10/google.html?utm_source=twitter&utm_medium=social&utm_campaign=campaign201510

パラメータに悩んだら、下の2個目のリンクがケーススタディ集にまとめてあるので必見です。


Google アナリティクスで広告からのアクセスを計測する方法


【まとめ】Googleアナリティクスのカスタムキャンペーンのケーススタディ

■作成したコードをGAから確認する方法

GAの
集客>キャンペーン>すべてのキャンペーン
と開いていけばアクセスしたセッション数がわかります。

私の場合は、複数のURLに同じキャンペーンコードを仕込むことを考えているので
さらに「ランディング ページ」の表示項目だしてあげてどのページが見られているか確認することができます。

2015年10月14日水曜日

知っておくと便利なURLスキーム

こんにちは山田です。

本日はブラウザから「地図を見るボタン」を選択した際に、地図アプリが立ち上がり、指定した位置を開く
という物を作っている時に気づいたことのお話しです。

URLスキーム?? という謎の言葉が何度が飛び交いました。
ということで調べてみました。

URLスキームとは?

たとえば↓のものです。
http://maps.apple.com/maps?q=渋谷駅

先頭は地図のアプリを開くことを指しており、
q命令らしく
q以降で命令の内容を指定しています。

つまり、地図のアプリケーションを起動⇒渋谷で検索

という流れになります。

参考までに詳しく乗っているリンク先に記載されている情報を転載させていただきます。めもめお、、、
表:「マップ」のURLスキームで使用できるおもなパラメーター

パラメーター     内容
q     検索キーワードを指定する(緯度/経度も指定可)
ll     緯度/経度をカンマ(,)区切りで指定する
spn     表示距離を指定する
t     表示モードを指定する(m:標準、k:航空写真、h:地図+写真)
z     表示サイズを指定する
saddr     経路検索用の出発地を指定する
daddr     経路検索用の目的地を指定する


iPhone/iPad標準「マップ」と「Google Maps」、どちらを選ぶべき?

知っておくとiPhoneをもっと便利に使える「URLスキーム」とは?

2015年10月13日火曜日

~正規表現を使って文字列を取得してみる~

始めまして、開発者のⅠです。
日々の開発で経験したことなど、色々と書かせていただきますので宜しくお願い致します。

さて、今回は正規表現を用いて文字列を取得する方法について書いてみたいと思います。
正規表現については、どこかで耳にしたことがあると思います。それをここで全て説明するのは難しいので省略いたしますが、一言でいうと「抽象的な文字列の表現」と言えます。

※参考URL:http://www.mnet.ne.jp/~nakama/

この正規表現を利用して、例文から条件と合致する文字列を取得してみたいと思います。
正規表現を使って日付と曜日を取得してみましょう。

-----------------------------------------------------------------------
string sentence = "2015年10月13日火曜日, 天気は晴れです, 今日の最高気温は24℃です ";

Regex regDate = new Regex("(2015).*(曜日)");
Match s_date = regDate.Match(sentence);
string test = (string) s_date.Value;
------------------------------------------------------------------------

これで、変数 test に「2015年10月13日火曜日」が入っていれば成功です!

今回はここまでです。

また次回、お会いしましょう。









2015年10月9日金曜日

SQL 算術オーバーフロー エラー

「expression をデータ型 datetime に変換中に、算術オーバーフロー エラーが発生しました。」

こんにちはYです。
クエリを実行中、上記のエラーが発生してちょっと調べてみました。


declare @datetimedisp datetime
set @datetimedisp = 20160101

select
    *
from
    mst_table
where
  1 = 1


どうやら、int型の20160101をdatetime型に暗黙的キャストをSQLServerが行っていたらしく、
キャストの失敗が原因でこのようなエラーが起きていたのだとわかりました。

正しくは 「2016-01-01」または「2016-01-01 00:00:00」と代入するのが正しいようです。
久しぶりに触って忘れていたことでした。