投稿

2月, 2017の投稿を表示しています

Gmail APIでシステムとGmail(G Suite)を連携【調査編】

イメージ
POP3とSMTPを使うのは面白くないので、API経由でGmailを利用したらメールを削除することなくシステムと連携できると思い、試したときの覚書。公式サイトを参考にGmail API | Google Developers目次APIの使用制限 システム用アカウントをGoogle Apps(G Suite)に追加 Server-to-Serverのサービスアカウントを作成 PHPサンプルを試す ウェブアプリケーションのOAuth2.0で認証1.APIの使用制限APIの使用制限がある。1日10億Quota Unit。メソッドごとに消費ユニットが違う。例えばメール送信は100ユニット消費する。一秒間に250ユニットの制限がある。同時に3つ以上送信しようとすると制限に引っかかる。詳しくは公式サイトで。Usage Limits | Gmail API | Google Developersメール送信はローカルのPostfixに任せた方がいいかもしれない。クライアントライブラリが未成熟(?)PHPはベータ版Getting Started | API Client Library for PHP (Beta) | Google DevelopersNode.jsはまだアルファ版Node.js Quickstart | Gmail API | Google DevelopersGitHub | google/google-api-nodejs-client: Google's officially supported Node.js client library for accessing Google APIs.2.システム用アカウントをGoogle Apps(G Suite)に追加 やろうと思っていることの概要。 システム専用のアカウントを作って、そのアカウント宛てに届いたメールを順次処理していく。 処理が終わったら「既読」ラベルを付けてアーカイブ。 Node.jsはアルファ版なのでWordPressのプラグインとしてPHPで開発することにした。 3.Server-to-Serverのサービスアカウントを作成 システム専用アカウントでGoogle Developer Consoleにアクセスして、API Keyを生成する。 公式サイトを参考に U…

【PHP】composerをインストールして依存関係管理

イメージ
Google先生の巨大ライブラリをリポジトリにコミットしたくなかったので、composerをインストールしたときの覚書。環境: CentOS 7, PHP 7.0.16参考サイトIntroduction - Composercomposer 導入をまじめに考える - Qiita目次composerとは YUM経由でインストール composerを使ってライブラリをインストール1.composerとはPHPの依存関係管理ツール。Node.jsのNPMやRubyのBundlerを参考にしている。composer installするとcomposer.jsonを参照して「vendor」ディレクトリにライブラリがインストールされる。composer.lockというファイルがあるとそちらを参照してそのバージョンをインストールするので、作った人と同じ環境を構築できる。WordPressのプラグインみたいに別ディレクトリに設置してほしい場合も対応可能。GitHub | composer/installers: A Multi-Framework Composer Library Installer2.YUM経由でインストールremiリポジトリにあった。バージョンは1.3.2
# yum install composer依存関係で結構な数のライブラリがインストールされる。確認
# composer --versionDo not run Composer as root/super user! See https://getcomposer.org/root for details
Composer version 1.3.2 2017-01-27 18:23:413.composerを使ってライブラリをインストールインストールするライブラリはこちら。GitHub | google/google-api-php-client: A PHP client library for accessing Google APIs今回WordPressプラグインの中で使う。
$ cd /path/to/wordpress/wp-content/plugins/hoge/対話形式でcomposer.jsonを作ってみる。
$ composer init{
    "name": &…

Twitter Bootstrap利用サイトでIE8だとimgが表示されない

イメージ
作ったサイトを念のためIE8で確認したら画像が表示されないので対応したときの覚書。環境: Bootstrap 3.3.7, WordPress 4.7.21.【準備編】Windows7 + IE8の環境を作る(Hyper-V)公式サイトでIE8を搭載した仮想マシンがダウンロードできる。Microsoft Edge Developer website - Microsoft Edge Development認証が必要。デスクトップに書いてあるのでそのままcmdで叩く。2.IE8だけ読み込むCSSを用意試した結果表示されない原因はdisplay: tableを指定していたから。画像は基本的に中央揃えにしたかったので、次のように設定していた(lessを使ってる)。.img-responsive {
    &:extend(.img-responsive all);
    display: table;
    margin: 0 auto;
}他のに影響与えないでIE8のみに対応したかったので、IE8だけ読み込むCSSを用意して、そちらで対応することにした。bootstrapを使うときにお約束の記述に追記(WordPressの関数を使ってる)。<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<link rel='stylesheet' href='<?php echo get_template_directory_uri();?>/assets/css/ie8.css' type='text/css' />
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif…

WordPressで非公開(private)にした投稿はリダイレクトしないようにする

イメージ
WordPressでホームページを作成しているときの覚書。環境: PHP 7.0.15, WordPress 4.7.2「お問い合わせ」ページから送信した内容を非公開の投稿として保存していた。そして気付いた。http://hoge.com/?p=20とPost IDを付けるとhttp://hoge.com/鈴木太郎/に変換(リダイレクト)される。これはパーマリンクの設定を「/%postname%/」にしておいて、氏名とかを記事のタイトルとして保存した場合に発生する。Contact Form 7を使っていれば発生しない(と思う)。少なくとも検索エンジンにキャッシュされると困るのでリダイレクトしないように設定した。このp=20がなかった(is_404)時に鈴木太郎に変換している関数は
/wp-includes/canonical.phpのredirect_canonical()下記のようにpost_typeで判定してる箇所(117行あたり)があったので$post_type_obj = get_post_type_object($redirect_post->post_type);
if ( $post_type_obj->public && 'auto-draft' != $redirect_post->post_status ) {
    $redirect_url = get_permalink($redirect_post);
    $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );
}「post」タイプは公開しないので、全てリダイレクトしないようにフックを仕込むfunction my_registered_post_type($post_type) {
    global $wp_post_types;    if ($…

WordPressがBlankだったりトップにリダイレクトするのをデバッグ

イメージ
久しぶりにWordPressの奥深くを潜っているときの覚書。WordPressは何がどの順番で実行するのか分かりにくいのでハマると長い。環境: PHP 7.0.15, WordPress 4.7.21.確認すること自分用チェックリストサーバーにエラーログが出力されているかどうか
# less /var/log/nginx/error.logwp_loadedにフックして読み込みが完了しているかどうか確認
参考:Plugin API/Action Reference/wp loaded | WordPress Codextemplate-loader.phpの$templateをデバッグ出力してテーマのどのファイルを読み込もうとしているか確認
参考:Template Hierarchy | Theme Developer Handbook | WordPress Developer ResourcesWordPressの内部で使っている「name」「year」などの名前でPOSTすると動作がおかしくなる
参考:Class Reference/WP Query | WordPress Codex存在しない関数を実行してエラーを起こして読み込まれた順番を確認。要xdebug2.xdebugのインストール手順YUM経由でインストール
# yum install php-pecl-xdebug
# systemctl status php-fpmphp infoを見て確認
# php -i | grep xdebug< Related Posts >XdebugをInstallしてError時の呼び出し履歴を表示XHProf + XHGuiをInstallしてPHPの実行結果を監視、解析する[WordPress]Themeのどの名前のFileが読み込まれるか理解する

Bootstrap3のWEBページを印刷してもいい感じに

イメージ
wkhtmltopdfでHTMLをPDF化しているときの覚書。今までウェブサイトを印刷したときのことは全く考慮してなかった。Bootstrapのデフォルト機能にお任せだったけれど、印刷しても出来るだけ読みやすくなるようにしてみた。環境: Bootstrap 3.3.7, less 2.7.21.印刷したときの横幅Bootstrapの場合、印刷するとExtra small devices(.col-xs-)が適用される。Grid System | Bootstrapこれは横幅が約547pxになるから。<計算方法>A4縦サイズの横幅は210mm
印刷するときのデフォルトマージンが約10mm
画面解像度が72dpi
1インチ=25.4mm、1mm=0.04インチA4の表示領域:210mm - (10mm x 2) = 190mm
mmをinchに変換:190mm x 0.04inch = 7.6inch
inchをpxに変換:7.6inch x 72dpi = 547.2px
2.Bootstrapで印刷用CSSまずはBootstrapのprint.lessをimportしない。替わりに下記CSSを読み込むと、small device(.col-sm-)が適用されたレイアウトに出来る。Render Bootstrap as "small" layout when printing | Gistこれをlessで表現すると@media print {
  .make-grid(sm);
}Bootstrapのgrid.lessを参照。あとの細かい箇所は必要なときに追加していく。@media screen {}も有用。< Related Posts >PHPでPDF生成するためにwkhtmltopdfをインストールPHPでPDF生成する方法を調査PhpStormのファイル監視機能でLESSをCSSにコンパイル

PHPでPDF生成するためにwkhtmltopdfをインストール

イメージ
HTMLからPDFを生成するコマンドラインツールwkhtmltopdfをインストールしたときの覚書。環境: CentOS 7 x86_64目次YUM経由でインストール 日本語フォントをインストール PHPシェルから実行 PHP-FPMから実行するとエラー(2017/02/06 追記)1.YUM経由でインストールEPELリポジトリにあったのでそちらを使う。
# yum search wkhtmltopdf
# yum info wkhtmltopdfVersion     : 0.12.1
Repo        : epel/x86_64
# yum install wkhtmltopdf試してみる
# wkhtmltopdf http://dksg.co.jp test.pdfエラーwkhtmltopdf: cannot connect to X server下記QAを参考にした。xserver - wkhtmltopdf: cannot connect to X server - Stack Overflowwkhtmltopdf: cannot connect to X server · Issue #180 · pdfkit/pdfkitwkhtmltopdf: cannot connect to X server (SOLVED) | Google グループ# yum search xvfb
# yum install xorg-x11-server-Xvfb再度試す。
# xvfb-run /usr/bin/wkhtmltopdf http://dksg.co.jp test.pdf成功したけど、日本語が表示されない。2.日本語フォントをインストールインストールされているフォント一覧を表示
# fc-listGoogle先生が公開しているNoto Sans CJK JPを使う。公式サイトで「Japanese」と検索Google Noto FontsHow to install fonts – Google Noto Fontsダウンロードと解凍
# cd /usr/share/fonts/
# curl -O https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
# mkd…

PHPでPDF生成する方法を調査

イメージ
ユーザーが入力したデータを帳票にして送信する仕組みを作っているときの覚書。8年ぐらい前にも調査した続編。有力候補たち名称説明TCPDF

公式サイトPHPライブラリ。
サンプルが充実していて使い方も簡単。迷ったらこれ。wkhtmltopdf

公式サイトWebKit HTML to PDF
ウェブサイトをPDF化してくれるコマンドラインツール。
要インストールなため自サーバーが必要。
HTMLでレイアウトを生成しておけばPDFに変換できるので楽。プレビュー → ダウンロード時にコマンド実行するだけ。
PHPから利用するためのライブラリもある。Google Drive
(Google Sheets)

開発者向けサイトGoogle Driveにスプレッドシートを作っておいて、
コピー → セルに値を挿入 → PDFに変換ダウンロード
というアイデア。
エクセルにも変換できるし応用がきく。学習コストは高め。
他のサービスに依存するのでAPI仕様変更とかが恐い。容量制限もあるので注意。Google Drive APIを試したいけど、API利用規約とかも考えるとリスクが高い。Google Developers Japan: Google API 利用規約の変更についてTCPDFは何度も使っていて面白くないので、wkhtmltopdfを試してみる予定。
< 2017/02/07 追記 >
wkhtmltopdfを実装してみた感想。PHPからwkhtmltopdfをexecで呼び出して、渡すURLも自分自身のPDF用HTMLを動的に生成するPHPアドレスにした。wkhtmltopdfが一度に複数呼び出されると処理が追いつかずタイムアウトする。これを安定運用するにはwkhtmltopdfに渡すのは動的PHPではなくローカルのHTMLとして事前に出力しておくwkhtmltopdfを複数起動しないようにキュー管理する自前で実装するのではなくて、URLからPDF作成サービスがあるのでそちらを利用するやっぱりTCPDFにする帳票のフォーマットが決まっているなら、テンプレートを読み込んで流し込む方がいい。今試そうと思っているアイデアはHTMLをテキストでデータベースに保存して、生成したPDFもBlob型でデータベースに保存する方法。実行中かどうかはシェルコマンドで判定する。HTML(PHP)で作成したのがそのま…