投稿

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 Developers Node.jsはまだアルファ版 Node.js Quickstart | Gmail API | Google Developers GitHub | 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のサービスアカウントを作成 システム専用アカウントでG

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

イメージ
Google先生の巨大ライブラリをリポジトリにコミットしたくなかったので、composerをインストールしたときの覚書。 環境: CentOS 7, PHP 7.0.16   参考サイト Introduction - Composer composer 導入をまじめに考える - 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 Installer   2.YUM経由でインストール remiリポジトリにあった。バージョンは1.3.2 # yum install composer 依存関係で結構な数のライブラリがインストールされる。 確認 # composer --version Do not run Composer as root/super user! See https://getcomposer.org/root for details Composer version 1.3.2 2017-01-27 18:23:41   3.composerを使ってライブラリをインストール インストールするライブラリはこちら。 GitHub | google/google-api-php-client: A PHP client library for accessing Google APIs 今回WordPressプラグインの中で使う。 $ cd /path/to/wordpress/wp-content/plugi

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

イメージ
作ったサイトを念のためIE8で確認したら画像が表示されないので対応したときの覚書。 環境: Bootstrap 3.3.7, WordPress 4.7.2   1.【準備編】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/res

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_t

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

イメージ
久しぶりにWordPressの奥深くを潜っているときの覚書。WordPressは何がどの順番で実行するのか分かりにくいのでハマると長い。 環境: PHP 7.0.15, WordPress 4.7.2   1.確認すること 自分用チェックリスト サーバーにエラーログが出力されているかどうか # less /var/log/nginx/error.log wp_loadedにフックして読み込みが完了しているかどうか確認 参考: Plugin API/Action Reference/wp loaded | WordPress Codex template-loader.phpの$templateをデバッグ出力してテーマのどのファイルを読み込もうとしているか確認 参考: Template Hierarchy | Theme Developer Handbook | WordPress Developer Resources WordPressの内部で使っている「name」「year」などの名前でPOSTすると動作がおかしくなる 参考: Class Reference/WP Query | WordPress Codex 存在しない関数を実行してエラーを起こして読み込まれた順番を確認。要xdebug   2.xdebugのインストール手順 YUM経由でインストール # yum install php-pecl-xdebug # systemctl status php-fpm php 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.2   1.印刷したときの横幅 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 wkhtmltopdf Version     : 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 Overflow wkhtmltopdf: cannot connect to X server · Issue #180 · pdfkit/pdfkit wkhtmltopdf: 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-list Google先生が公開しているNoto Sans CJK JPを使う。公式サイトで「Japanese」と検索 Google Noto Fonts How to install fonts – Google Noto Fonts ダウンロードと解凍 # cd /usr/share/fonts/ # curl -O https

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をテキストでデータベースに