2017年3月23日木曜日

CentOS7向けにwkhtmltopdfをソースからビルド

wkhtmltopdfYUM経由でインストールしたwkhtmltopdfがよく分からないエラーを吐くので最新版(0.12.4)をビルドしたときの覚書。

環境: CentOS 7

よく分からないエラー

/usr/bin/xvfb-run: line 181: 21759 Segmentation fault      DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 2>&1

 

目次

  1. YUMバージョンをアンインストール
  2. Git cloneしてコンパイル
  3. インストール
  4. YUMバージョン(0.12.1)と比較して変わったところ
  5. 本番環境へインストール

 


1.YUMバージョンをアンインストール

今のバージョンを確認
# wkhtmltopdf --version

wkhtmltopdf 0.12.1

アンインストール
# yum remove wkhtmltopdf

 


2.Git cloneしてコンパイル

公式サイトを参考に

コンパイラ(開発ツール)をインストール
# yum groupinstall 'Development Tools'

GitHubからダウンロードする。ユーザーのホームディレクトリじゃないとコンパイル時にエラーになるらしい。
# cd
# git clone --recursive https://github.com/wkhtmltopdf/wkhtmltopdf.git

5分ぐらい掛かった。

今の最新バージョン0.12.4をチェックアウト
# cd wkhtmltopdf/
# git tag
# git checkout 0.12.4

セットアップ(?)
# sudo scripts/build.py setup-schroot-centos7

エラー。CentOSのオプションはなくなったらしい。

再度ビルド実行
# scripts/build.py posix-local -clean

エラー

Basic XLib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /root/wkhtmltopdf/qt/mkspecs/linux-g++.

Qtに関連するライブラリが必要らしい。

YUMレポジトリからそれらしいのをインストール
# yum search qt
# yum install qt-devel qt-x11

再度ビルド実行
# scripts/build.py posix-local -clean

エラー

OpenSSL support cannot be enabled due to functionality tests!

OpenSSL系のビルドツールをインストール
# yum install openssl-devel

再度ビルド実行
# scripts/build.py posix-local -clean

エラー

fatal error: png.h: No such file or directory

fatal error: jpeglib.h: No such file or directory

pngとjpegのライブラリをインストール
# yum install libpng-devel libjpeg-turbo-devel

再度ビルド実行
# scripts/build.py posix-local -clean

大量のWarningが出て心配になる。

結構な時間が掛かる。

バイナリがstatic-build/posix-local/フォルダに出力される。

動作確認
# static-build/posix-local/wkhtmltox-0.12.4/bin/wkhtmltopdf https://dksg.co.jp test.pdf

 


3.インストール

コンパイルしたファイルを/usr/local/にコピー
# cp -r static-build/posix-local/wkhtmltox-0.12.4/* /usr/local/

/usr/local/libはデフォルトで未登録なので、読み込むように設定して再読込。
# echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
# ldconfig

ライブラリが読み込まれているか確認
# ldconfig -v | grep libwk

動作確認
# /usr/local/bin/wkhtmltopdf http://dksg.co.jp test.pdf

 


4.YUMバージョン(0.12.1)と比較して変わったところ

試してみて気付いたところ

  • xvfb-runが必要なくなった
  • 「--viewport-size」が使えるようになった
  • bootstrap3のnav-justifiedが潰れる(多分バグ)

 


5.本番環境へインストール

ビルドしたときにtar.xzが作られているので、これを本番サーバーへコピーする。

解凍
# tar -xvf wkhtmltox-0.12.4_local-vm-centos7.dksg.jp.tar.xz

/usr/local/にコピー
# /bin/cp -r wkhtmltox-0.12.4/* /usr/local/

ライブラリの登録と読み込み → 確認
# echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
# ldconfig
# ldconfig -v

動作確認
# /usr/local/bin/wkhtmltopdf http://dksg.co.jp test.pdf

システム上で確認出来たらYUMバージョンをアンインストール
# yum remove wkhtmltopdf

 

これで様子を見る。

 

< Related Posts >

2017年3月21日火曜日

Google Analytics認定資格を取得

google-analytics_certificationGoogle Analytics認定資格を取得したときの覚書。

参考サイト

Googleアナリティクスアカデミーの動画はほとんど英語なので、理解するのに時間がかかるかも。

 

Googleアナリティクスとは?を確認するのに有用な公式動画

 

用語集

用語 説明
セグメント アクセスを特定の条件で絞り込みカテゴリー分けする機能。
セグメントについて - アナリティクス ヘルプ
ディメンション データの属性。データの性質。セッションなどのアクセスそのものではなく「どんな」アクセスか。
例)市区町村、ブラウザ、言語
ディメンションと指標 - アナリティクス ヘルプ
マルチチャンネルレポート コンバージョン(CV)に至るまでの経路には、複数の接点(チャンネル:有料検索やディスプレイ広告など)があり、ユーザーはどのようなチェンネルを参照したかを解析
マルチチャネルについて - アナリティクス ヘルプ
アトリビューションモデル コンバージョン(CV)に至るまでの経路で、それぞれの経路がどの程度貢献したかを重み付けするルールセット
アトリビューション モデルの概要 - アナリティクス ヘルプ
アシストコンバージョン コンバージョン(CV)に至るまでの経路上の各接点
チャネルの貢献度を分析する - アナリティクス ヘルプ

Measurement Protocol

Google Analyticsへデータを送信するルールセット。ウェブやアプリ以外のSDKが提供されていない環境でも、このルールに従えばデータを収集することが可能。
Measurement Protocol - アナリティクス ヘルプ
テスト
(ウェブテスト)
A/Bテストを行う機能。テスト用ページを作成しておいて、指定した割合で訪問者にテストページを表示できる。
ウェブテストのメリット - アナリティクス ヘルプ
リマーケティング ユーザーリスト コンバージョンを達成する見込みが高く、再度アプローチしたいユーザー一覧。
AdWordsと連携前提。
Analyticsでユーザーリストを作成しておくと、AdWordsのターゲティングユーザーリストに表示される。
この機能に対応したAdWordsキャンペーンタイプを選択する必要がある。
リマーケティングの設定について - AdWords ヘルプ
ソリューションギャラリー セグメントなどの設定データをインポートできるツール。
他のアカウント(サイト)で作ったセグメント設定を共有するのに有用

 

試験自体は調べながら受験できるので難しくはない。失敗しても7日後に再挑戦できるので、自信を持って回答を選べるまで調べてから次へいくようにした方が勉強になると思う。

 

< Related Posts >

2017年3月20日月曜日

GoogleアナリティクスからGoogleタグマネージャに切り替え

google-tag-managerGoogleタグマネージャを使うと、Google AnalyticsやAdWordsのコンバージョンスクリプトをいちいち埋め込まずに管理できる。

最近は使いやすくなって本番運用に活用できる。

詳しくは公式サイトで。

 

出来ること

  • 任意のスクリプト(タグ)を任意のタイミング(トリガー)で実行することが出来る
  • トリガーを設定するときにCSSセレクタで指定できるので、IDがついてない要素もコードを修正せずにトリガーに出来る
  • プレビュー機能でどのトリガーが実行されたか分かる

 

特に便利だと思ったところ

  • 静的なリンクもコードを修正せずにGoogle Analyticsのイベントを発生させることが出来るから、特定要素のクリック数も簡単に計測可能。
  • プレビュー機能が素晴らしい

 

これからはGoogleタグマネージャを埋め込んでおけば間違いない。

 

< Related Posts >

2017年3月17日金曜日

【PHP】BMP画像をJpeg形式とWebP形式に変換

bmp_convert-to_jpeg_webpAndroidアプリから送信された画像がBMP形式なので、サーバー側でJPEGとWebPに変換したときの覚書。

環境: CentOS 7, PHP 7.0.16

 

目次

  1. AndroidとiOSのWebP対応状況
  2. サーバー環境の確認
  3. PHPのImagickを使って変換

 


1.AndroidとiOSのWebP対応状況

Androidは4.0以上でWebPに対応している。

iOSはiOS 10のSafariで対応しているが、アプリで表示させるためには別途ライブラリが必要。

iOSはjpeg、Androidはwebpを表示することにした。

 


2.サーバー環境の確認

YUM経由でImageMagickは前にインストールしてあったので、バージョンと対応フォーマットの確認
# convert --version

Version: ImageMagick 6.9.8-0 Q16 x86_64 2017-03-12

# convert -list format

WEBP* WEBP      rw-   WebP Image Format (libwebp 0.3.0[0201])

PHPから利用するためのimagickライブラリがあるか確認
# php -i | grep imagick

imagick module version => 3.4.3

 


3.PHPのImagickを使って変換

BMPからJPEGに変換するサンプルコード

$info = pathinfo($path);

$image = new \Imagick($path);
$image->setImageFormat('jpeg');
// Save as progressive jpeg
$image->setInterlaceScheme(\Imagick::INTERLACE_PLANE);
$image->setImageCompressionQuality(80);

$result_path = $info['dirname'] . '/' . $info['filename'] . '.jpg';
$image->writeImage($result_path);
$image->clear();
$image->destroy();

 

WebPに変換するサンプルコード

$info = pathinfo($path);

$image = new \Imagick($path);
$image->setImageFormat('webp');
$image->setImageCompressionQuality(80);

$result_path = $info['dirname'] . '/' . $info['filename'] . '.webp';
$image->writeImage($result_path);
$image->clear();
$image->destroy();

 

Androidアプリで画像を表示するのが段違いに速くなった。iOSだとBMPでも表示が速かったので気付くのが遅れた。

アプリはこちら。

 

< Related Posts >

2017年3月13日月曜日

マーケティングは学問。本から学んだ広告コピーの基礎

book_inspirationAmazonのKindle Unlimitedで読んだ本がとても有用だったので、忘れないための覚書。

読んだ本はこちら。

用語

用語 説明
USP
Unique Selling Proposition
競合優位性。
競合と比較した”価値”をどう最大化するかが重要
タグライン 商品の価値が最大化されるような定義付け。
常に商品と一緒に表示する。
誰もが分かるシンプルな表現で。
キャッチコピー タグラインに誘導するためのコピー。
ターゲットの共感を得る表現。
「不満のMAX」か「気持ちよさのMAX」を描く
AIDMAの法則 広告を見てから購買に至るまでの流れ
1.Attention
2.Interest
3.Desire
4.Memory
5.Action
ダイレクト(ウェブ)広告の場合はMemoryがない
アウトバウンド 企業からターゲットにアプローチすること
インバウンド ターゲットから企業にアプローチすること。
これを「見つける」ことがマーケティング。「作って」はダメ。
クロージングコピー その場での決断を促すための提案

 

ウェブサイトを作った際の自分用チェック項目。本と無関係のもある

  • 競合をしっかりと調べUSPが明確か
  • タグラインがモノとヒトとの関係を新たに創造しているか。ターゲットの心を揺さぶる表現になっているか
  • ターゲットの視点で作られているか
  • ユーザーの利益が明確か。推測させるのはダメ。一瞬で理解できるように
  • AIDMAの流れになっているか
  • クロージングコピーが出来ているか
  • シンプルに。無駄に長くないか

 

< Related Posts >

2017年3月7日火曜日

WordPress記事を投稿時にNginxのキャッシュを削除

nginx_wordpress_rsycleWordPressから任意のタイミングでNginxのfastcgi cacheを削除したいと調査したときの覚書。

環境: CentOS 7, Nginx 1.10.3, PHP 7.0.16, WordPress 4.7.2

 


1.Nginxキャッシュについて調査

WordPressにはこれを実現してくれるプラグインがある。

ソースを見たけれど正直何をやっているのか分からない。

ちゃんとNginxのキャッシュの仕組みを理解しないといけないかもと思い、参考になりそうな記事を読む。

 


2.Nginxの「fastcgi_cache_purge」モジュール

WordPress公式のNginxキャッシュ設定にクリアする記述があった。

location ~ /purge(/.*) {
  # Uncomment the following two lines to allow purge only from the webserver
  #allow 127.0.0.1;
  #deny all;

  fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}

これを実行するには「fastcgi_cache_purge」というNginxモジュールが必要らしい。

インストールされているか確認
# nginx -V

nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

インストールされていない。

ソースからビルドする必要あるらしい。

ビルドした人の記事。

YUM管理からは出したくないので、さっきのPHPから直接キャッシュ削除する方法を試してみることにした。

 


3.PHPから直接削除(unlink)する

下記記事のPHPコードを参考に指定URLのキャッシュを直接削除するプログラムを書いた。

あとはsave_postにフックして実行するだけ。

やってみたら意外にあっけなく出来た。

プログラムで管理できるのは汎用性があってやりやすい。

 

< Related Posts >

2017年3月3日金曜日

Gmail検索クエリとGmail APIと一緒に使うPHPライブラリ

search-gmailGmail API経由でメール一覧を取得しているときの覚書。

環境:CentOS 7, PHP 7.0.16

メールを取得する際に設定する検索クエリの参考サイト。

 

日付の降順で取得したかったけど今のところ出来ないので、スレッド単位で取得して処理をしていく。

ドキュメントに書いてないことはライブラリのソースを読んだ方が早い。

 

メッセージはraw形式で取得してPHPライブラリでパースした方が開発し易い。

送信するときはPHPMailerでメールオブジェクトを作って、getSentMIMEMessageしたデータを(base64UrlEncodeして)setRawすると開発しやすかった。

 

< Related Posts >

2017年3月1日水曜日

PHP Standards Recommendations:PHPコーディング規約

coding-standardcomposerのauto-loadingの仕組みを見ていて、名前空間やファイル名の付け方を統一しようと思ったときの覚書。

PHP Framework Interop Group(PHP-FIG)というグループがPSRという規約をまとめてくれている。

さくっと理解するのはこちらのスライドが参考になった。

 

個人的にWordPressを使うことが多いけど、WordPressはインデントがタブだったり独自路線が強い。

 

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives