2017年12月15日金曜日

ウェブページのSEO対策ガイドライン by Google

google-seo-guidebookGoogle先生が検索エンジン最適化(SEO)対策のためのスターターガイドを更新したので覚書。

ウェブサイトを見ただけだと、これらに対応しているかが分かりづらい。

しかもサイトを作る人(開発者)が意識してないと、後で対応するのが大変。

後々人を雇ったときのためにSEOチェックリストを作った方がよさそう。


< Related Posts >

2017年12月10日日曜日

Titanium SDK 7.0.0.GAとAndroid NDKはAndroid Studio経由に切り替え

axway-titaniumAxway Titanium SDKが7.0.0になってAndroid NDK r16に対応したということでアップデートしたときの覚書。

環境: macOS Sierra v10.12.6, JDK 1.8.0_131, Android Studio 3.0.1


参考



1.Android Studio経由でNDKをインストール

Android Studioを起動して、SDK Toolsの中にあるNDKをインストール。

インストールされた場所
/Applications/android-sdk-macosx/ndk-bundle/

環境変数は指定しなくてもいいのかな?と思いコメントアウトしてみる(昔は必要だった)。
$ less .bash_profile

# Android SDK, NDK
export ANDROID_HOME=/Applications/android-sdk-macosx
#export ANDROID_NDK=/Applications/android-ndk-r12b




2.Androidモジュールをビルド

arm64に対応したらしいので、公式サイトを参考にmanifestを変更。

ビルド実行
$ appc run p android --build-only

エラー

[ERROR] There is discrepancy between the architectures specified in module manifest and compiled binary.
[ERROR] Architectures in manifest: arm64-v8a,armeabi-v7a,x86
[ERROR] Compiled binary architectures: armeabi-v7a,x86
[ERROR] Please update manifest to match module binary architectures.


新しいモジュールを作成したらビルド成功したので、コードの中に64bit対応していないものをimportしているからだと思う。



< Related Posts >

2017年12月7日木曜日

FoundationのBlock GridをBootstrapで使う

block-grid前に調べたCSSフレームワーク「Foundation」のBlock GridをBootstrapで使いたくなったので調査したときの覚書。

環境: Bootstrap v3.3.7


参考


GitHub Gistで公開されているのが使いやすかった。

画像サムネイル+タイトルをいい感じに並べるのに便利。


< Related Posts >

2017年12月4日月曜日

CSSフレームワーク「Foundation」

zurb-foundation今のところBootstrap v3を便利に使っているけども、「Foundation」というCSSフレームワークを知らなかったので調査したときの覚書。


参考


Foundationの理解(Bootstrap v3との比較)


今までの資産を捨ててまでFoundationに切り替える理由はなさそうだけど、公式サイトのShowcaseはデザインの勉強になる。


< Related Posts >

2017年11月24日金曜日

株式会社の法人決算。初めての決算を自分でやってみた。

company-period法人決算の方法を調査したときの覚書。

環境: 株式会社、埼玉県川口市、一人社長、9月末決算、一年目、MFクラウド会計



1.提出書類の確認。決算の概要把握

各管轄から封筒が送られてくる。

県税事務所は送られて来なかった。。。本社移転届も出しているのになぜ?。。。と思ったら市役所からの書類に同封されていた。


【税務署】法人税

  • 法人事業概況説明書(OCR)
    全力法人税で出力したものを手書き入力
  • 確定申告書(OCR)
    全力法人税で出力したものを手書き入力
    1枚目と2枚目に押印が必要
  • その他「全力法人税」で作成した申告書と勘定科目内訳書
  • 決算報告書
    MFクラウド会計から出力


【県税事務所】法人事業税

  • 申告書送付先カード
    全力法人税で出力したものを手書き入力
  • 欠損金額等及び災害損失金の控除明細書
    全力法人税で出力

郵送の場合、送付先カードは切り取って、一番上のだけ送る。受付印が欲しい場合は返送封筒を同封すれば送り返してくれるらしい。


【市役所】法人市民税

  • 申告書(戸田市)
    全力法人税で出力したものを手書き入力
  • 申告書(川口市)
    全力法人税で出力したものを手書き入力

今年度は5月に本社移転したので、戸田市と川口市に分割して納付する。

<月割りの計算方法>

当社の場合は10/3に設立しているので、11/3で1ヵ月。

5/9に本社移転しているので、10/3~5/3までの7ヶ月分を戸田市に払う。

5/9~9/9までの4ヶ月分を川口市に払う。



2.書類準備

決算報告書はMFクラウド会計から出力するだけでOK。

申告書がめんどくさい。

全力法人税という申告書を自動作成してくれるクラウドサービスがいいらしい。

登録無料、印刷時に料金が発生。初年度19,800円


案内に従って入力していく。2時間ぐらい掛かった気がする。

MFクラウド会計のデータを取り込んだときに変換した勘定科目

  • 未払給与 → 未払金
  • 保証金 → 前払費用


完了後に印刷。

。。。埋まっている値が正しいのか分からない。。。



3.税理士の方に確認してもらう

さいたま起業家協議会の税理士の方に簡単に確認頂いた。

いろいろと参考になる意見を聞けた。

仕訳などMFクラウドで修正。一括編集機能があって助かった。


全力法人税で出力し直し。「取り込みデータ一括削除」してからでないと重複する。



4.提出しに行く

書類に不備があるか不安だったので、それぞれ直接行って提出してきた。

税務署で相談する場合は予約が必要。とりあえず提出して不備があれば連絡くれるらしい。

川口県税事務所の管轄だったけど、さいたま県税事務所に行ってしまった。

書類は問題なく受け取ってくれた。

税金の納付は帰りに銀行へ寄って振り込み。


今まで意味不明だった税金のことが分かってきた。


< Related Posts >

2017年11月15日水曜日

【WordPress】管理画面のメニューなどカスタマイズ

wordpress_admin-customize特定のユーザーがログインしたときに投稿一覧を表示して、不要なメニューは非表示にしたいと調査したときの覚書。

環境: WordPress 4.8.3, PHP 7.0.25



1.左のメニューから不要なものを非表示

参考

admin_initに下記のような処理をフックする。

// ダッシュボードのアクセスは投稿一覧へ
if ('/wp-admin/index.php' == $_SERVER['SCRIPT_NAME']) {
     wp_redirect(admin_url( 'edit.php' ));
     return;
}

// メニューを非表示にする
remove_menu_page( 'index.php' );
remove_menu_page( 'edit-comments.php' );
remove_menu_page( 'upload.php' );
remove_menu_page( 'profile.php' );
remove_menu_page( 'tools.php' );

// アップデートのメッセージを非表示にする
remove_action( 'admin_notices', 'update_nag', 3 );

// 左のメニューにログアウトボタンを表示
global $menu;
$menu[] = [__('Logout'), 'read', wp_logout_url()];




2.上のadmin_barも不要なメニューを非表示

参考

admin_bar_menuに下記のような処理をフックする。実行する優先順位を下げないとwp-logoとか消えなかった。

function hoge_admin_bar_menu( $wp_admin_bar ) {
     $wp_admin_bar->remove_node('updates');
     $wp_admin_bar->remove_node('wp-logo');
     $wp_admin_bar->remove_node('comments');
     $wp_admin_bar->remove_node('new-content');
     $wp_admin_bar->remove_node('my-account');
}
add_action('admin_bar_menu', 'hoge_admin_bar_menu', 999);


あとは「特定ユーザーのみ」という処理は必要。


< Related Posts >

2017年11月7日火曜日

一人社長の給与(役員報酬)を変更

yen-up起業して1年が経ち、事業も軌道に乗ってきたので、自分の給与(役員報酬)を変更しようとしたときの覚書。

環境: 一人社長、9月末決算、15日締め当月25日払い


参考サイト



1.取締役会議事録作成

参考サイトのテンプレートの必要箇所に記入して終了。

捺印済みをスキャンして印刷。日本年金機構へ提出用。



2.日本年金機構に月額変更届を提出

月額変更届の提出は2月以降でよかった。

日本年金機構ホームページに従って書類を準備。

「タ」と「チ」に変更後の月額報酬額を書いた。


提出書類

  • 被保険者報酬月額変更届
  • 取締役会議事録の写し
  • 源泉徴収簿(改定月の前の月分)
    MFクラウド給与の「帳票一覧→源泉徴収簿」で出力


間違いがあるか心配だったので窓口に行ってみてもらった。

川口市の場合は浦和年金事務所


確認したこと

  • 変更届は支払った直近3ヵ月の給与を記入するので、私の場合は11月、12月、1月の実績を記入する。
  • 改定年月は平成30年2月。
  • 「タ」と「チ」は未記入。
  • 提出は1月25日以降でよい。
  • 改定年月から60日遅延してなければ、取締役会議事録の写しと源泉徴収簿はいらない。
  • 変更額が小さいならば、そもそも変更届もいらない。私の場合は5等級変わるので必要。

7月に提出する算定基礎届で保険料は決まるので、変更届の重要性は低い。提出したときの覚書。



3.MFクラウド給与の設定変更

従業員情報から役員報酬を変更。

健康保険/厚生年金保険を変更したら保険料が変わるので、これは多分来年変更する。



< Related Posts >

2017年11月6日月曜日

PHPExcelの後継ライブラリPhpSpreadsheet

phpexcel_phpspreadsheetPHPExcelの後継ライブラリを見つけたので覚書。

PHP7に対応していて、今風の作りになっているので流行りそう。

2017/08/17にβ版がリリースされている。そのうちGAがリリースされると思う。

PDF出力にも(TCPDFなどの外部ライブラリで)対応しているみたいなので、帳票を出力する仕組みの有力候補になると思う。


< Related Posts >

2017年11月5日日曜日

KotlinでiOS開発は出来るのか調査

kotlin_xcode最近Axway Appcelerator Titaniumで開発し続けることに不安を感じていて、KotlinでiOS開発は出来るのかと調べたときの覚書。

Kotlinはクロスプラットフォーム開発に力を入れていて、iOSの公式サポートを発表した。


お正月休みに試せるような状況だと嬉しいな。


< Related Posts >

2017年10月2日月曜日

JPドメインの指定事業者変更とドメイン名移転の違い

domain-transferOCNで管理していたドメインをValue-Domainへドメイン移管したときの覚書。

移管したドメインはor.jp(属性型ドメイン)。

OCNのサイトでは「指定事業者変更」と「ドメイン名移転」がある。

その違いは何?と思って調べてみると下記サイトの説明が分かりやすかった。

JPドメインの管理方法に沿った言い方をしているらしい。

要するに

指定事業者変更

ドメインレジストラの変更。

今のレジストラから登録者情報は削除

ドメイン名変更

特定のドメインだけ他のレジストラに移管する。

今のドメインレジストラに登録者情報を残したまま



< 2017/10/12 Modified >

OCNの「Bizメール&ウェブ ビジネス」を契約しているクライアントのDNSを変更してMXレコードは以前のままに設定しているのにメールが送受信できなくなった。

原因は、オプションでメールのウイルスチェック機能を契約しているから。そうするとMXレコードは下記のサーバーを指定している。

mwbgw2.ocn.ad.jp.
mwbgw1.ocn.ad.jp.

このサーバーはウイルスチェック用らしく、メインのAレコードを参照して、それが配送先と違うとエラーになる。

つまりホームページを別サーバーで運用して、メールだけOCNを使うということができない。サポートに問い合わせてもサービスの仕様で、ウイルスチェック機能を解約するしかないらしい。

仕方がないから、とりあえずAレコードを元のサーバーに戻した。

メールアカウントが多いとメールサーバーを変更するのにパワーがいる。しかも、そういった組織だと年間10万弱はたいした金額ではない。

さくらのメールボックスを使えばウイルスチェック込みで年間1,029円なのに。。。



< Related Posts >

2017年9月25日月曜日

埼玉県武蔵浦和の法律事務所

advice仕事を進めていく中で「揉めそうな予感」がピンと来たので、さいたま起業家協議会で知り合った弁護士の方に相談したときの覚書。

お世話になった法律事務所はこちら。


今まで交わした契約書はネットのサンプルを元に作成した自作。

契約書内のダメな部分を指摘され、かなり焦った。

書きづらいことは「誠実協議」の部分で何とかなると思っていたけど全く意味ないらしい。

第9条(誠実協議)

本契約に定めのない事項および疑義については、甲乙協議の上、誠意をもって処理するものとする。

「契約書なんて関係ないよ。揉めるなんてプロジェクト管理が出来てない証拠」と思っていた自分が恥ずかしい。

でも、このタイミングで相談できたのは本当に良かったと思い直すことにした。

全部話せる弁護士の先生に会えたのは大きい。

2017年8月17日木曜日

プレゼン環境:ノートPC+Android vs iPad + VGAアダプタ

presentation_android-ios今度「起業体験」をテーマにプレゼンするので、スマートな方法を調べたときの覚書。

環境: Windows 10 Pro, MS PowerPoint 2016, Android 7.0, iPad Pro 9.7


いろいろ調べて2つに絞った。



方法①:ノートPC + Android

ノートPC(Let's Note)にVGA出力があるので、普通にパワーポイントで表示しつつ、Androidの「Office Remote」アプリを使ってスライドをリモートコントロールする。

追加購入費用:1,190円(ノートPCのBluetoothが壊れているから)
Amazon | 【Newiy Start】Bluetooth4.0 USBアダプタ EDR/LE(省エネ) Windows10 apt-X対応 CSRスタック付属 ブルートゥース ドングル (抓み型) | Bluetoothアダプタ | パソコン・周辺機器 通販

メリット

  • 歩き回りながらプレゼンできる
  • PCの前にいけばパワーポイントのフル機能を使える


デメリット

  • 途中で電話が掛かってきたらビクッてなる
    → 設定で対応可能
  • ノートPCが重い




方法②:iPad + VGAアダプタ

iPadにPowerPointアプリをインストールして、iCloud経由で共有したpptxを開く。

Keynoteアプリも試してみたけど、フォントや縦書きなど再現できなかったので諦めた。ちなみにKeynoteだとiPhoneでリモート操作できる機能がある。

追加購入費用:5,616円
Lightning - VGAアダプタ - Apple(日本)


メリット

  • 軽い
    → iPadはいつも持ち歩いているのでVGAアダプタだけでいい


デメリット

  • スライド操作するときにはiPadの前にいる必要あり
  • 経過時間が見れない
  • 特殊フォントが反映されない



iPadでやろうと思ったけど、現地のプロジェクタに繋ぐとノートPCと縮尺が違う。

自分の番になったらプロジェクタの調整をしないといけなくなるので、結局他の人との共有PCにパワーポイントのデータをコピーしてやった。

2017年7月24日月曜日

社会保険の算定基礎届を指定会場で提出

social-insurance日本年金機構から算定基礎届に関する書類が届いたので対応したときの覚書。

通常は郵送で提出するらしいけど、今回調査対象になったので指定日時に指定会場で提出して下さいと通知が入ってた。起業初年度だから選ばれた?

環境: 従業員一人(一人社長)


目次

  1. 算定基礎届の概要
  2. 被保険者報酬月額算定基礎届の記入
  3. 被保険者報酬月額算定基礎届 総括表の記入
  4. 被保険者報酬月額算定基礎届 総括付随表の記入
  5. 提出書類準備
  6. 会場で提出



1.算定基礎届の概要

毎月給与から天引きする社会保険料を決定するために4月、5月、6月の給与所得を申請する。そのための申請書類が「算定基礎届」。

期限:7月10日

今回は7月19日に指定会場で手渡し。



2.被保険者報酬月額算定基礎届の記入

MFクラウド給与の「社会保険事務(β)」→「定時決定」から計算開始を実施したら画面に表示される値を用紙に記入。

固定給なので特に難しいところはない。



3.被保険者報酬月額算定基礎届 総括表の記入

記載例に従って記入。

一人社長で手当てもボーナスもないので特に迷うところはない。



4.被保険者報酬月額算定基礎届 総括付随表の記入

記入。もう何を書いたのか覚えていない。

スキャンして保存しておけばよかった。



5.提出書類準備

用意した書類など

  • 被保険者報酬月額算定基礎届、総括表、総括付随表
  • 平成29年1月から現在までの賃金台帳
    MFクラウド給与の帳票一覧→賃金台帳から印刷
  • 社会保険関係書類
    日本年金機構から送られてきた通知書
  • 所得税徴収高計算書
    この時点で支払期限日(7/10)過ぎているのに気付いた
  • 事業主印鑑(訂正するときに必要)



6.会場で提出

指定日時の20分前に到着したけど、担当者が空いていたのですぐに案内された。

書類をチェックしてもらって足りない箇所を記入。

本社移転して事業所番号が変わっていたので、その場で修正。

所得税徴収高計算書に関してはMFクラウド給与から出力した書類を見せるだけで特に何も言われなかった。

(この後川口税務署に行って所得税納付済み)


記入ミスの不安がなく提出できたので良かった。

来年も会場で手渡ししたいくらい。


< Related Posts >

2017年7月21日金曜日

法人として住民税の特別徴収を納付する

tax起業して初めて特別徴収を納めたときの覚書。

環境: 従業員一人(一人社長)


目次

  1. 市役所から「特別徴収のしおり」が届く
  2. 銀行で振込手続き
  3. 特別徴収を自動引き落としにしたい




1.市役所から「特別徴収のしおり」が届く

私が住んでいる蓮田市から「特別徴収のしおり」が届いた。

法人として6月給与から天引きで住民税を預かり、蓮田市に納付しなければならない(特別徴収)。

ペイジーを試したかったけど、蓮田市は対応していない。

一緒に送られてきた「特別徴収納入書」を銀行に持っていき払うしかない。




2.銀行で振込手続き

申込用紙に記入して振込手続き。

手持ちがなくても法人口座から引き落とすことができる。(口座がある銀行窓口の場合)



3.特別徴収を自動引き落としにしたい

毎月銀行に行くのは面倒なので自動引き落とし出来ないか調べると、特別徴収の場合はできない。

従業員が自分で納付する普通徴収はできる。

だから毎月銀行に行かなければならない。

納期の特例を申請すれば年2回で済む。



< Related Posts >

2017年7月14日金曜日

Windows10からスキャンできない(Canon MF222dw)

windows_printerスキャンしようとしたら出来なくなっていたので調べたときの覚書。

環境: Windows 10 64bit, Canon MF222dw, Canon MF Toolbox 4.9.1.1.mf17

いつものように「Canon MF Toolbox」を開いてスキャンしようとしたら下記エラー。

スキャナー本体と通信できません。
ケーブルが外れているか、電源が入っていない可能性があります。
スキャナー本体の状態を確認してから、実行しなおしてください。
スキャナードライバーを終了します。

普通にプリントは出来る。

Google先生に聞いてみたらここに答えが。

Windowsストアにある「Windows スキャン」を使うと出来る。

デスクトップにショートカットを作成。


ちなみにこれを知る前に下記サイトを参考に設定を変えてる。この設定は必要ないと思う。


Canon MF Toolboxはアンインストールした。

Canon MF Network Scan Utility 64bitもDisabledにした。


< Related Posts >

2017年7月4日火曜日

certbotでSSL化してあるサイトを別サーバーに移行

server-changecertbot(Let's Encrypt)を使って無料SSL(https)化してあるサイトを別サーバーに移行したときの覚書。本番環境なのでユーザーに気付かせないようにやる。

環境: CentOS7, certbot 0.14.1, nginx 1.12.0


手順一覧

  1. tarアーカイブしたソースを移行先にコピー
  2. データベースをExport&Import
  3. 移行元の秘密鍵と著名済み証明書をコピー、nginxのconf設定
  4. ローカルマシンのhostsファイルに移行先のIPアドレスと記述して動作確認
  5. ドメインレジストラでDNS変更
  6. 移行先サーバーでcertbotコマンドから取得し直し
  7. 移行元サーバーからデータを削除



3.移行元の秘密鍵と著名済み証明書をコピー、nginxのconf設定

移行元から秘密鍵と証明書をコピーするところのコマンド。

【移行先サーバー】

# cd /etc/nginx/
# mkdir ssl.d
# cd ssl.d/
# vi hoge.co.jp.fullchain.pem
# vi hoge.co.jp.privkey.pem

# cd ../conf.d/
# less hoge.conf

server {
     listen       80;
     server_name  hoge.co.jp;
     return 301 https://hoge.co.jp$request_uri;

    #root    /home/httpd/hoge-hp/wordpress;

    # WordPress Setting
     #include conf.d/global/wordpress_restrictions.conf;
     #include conf.d/global/wordpress_dev.conf;
     #include conf.d/global/wordpress_live.conf;
}

server {
     listen       443 ssl;
     server_name  hoge.co.jp;

    root /home/httpd/hoge-hp/wordpress;


     # Gzip
     include conf.d/global/gzip.conf;

    # WordPress Setting
     include conf.d/global/wordpress_restrictions.conf;
     #include conf.d/global/wordpress_dev.conf;
     include conf.d/global/wordpress_live.conf;

    # SSL
     include conf.d/global/ssl.conf;
     #ssl_certificate      /etc/letsencrypt/live/hoge.co.jp/fullchain.pem;
     #ssl_certificate_key  /etc/letsencrypt/live/hoge.co.jp/privkey.pem;
     ssl_certificate      /etc/nginx/ssl.d/hoge.co.jp.fullchain.pem;
     ssl_certificate_key  /etc/nginx/ssl.d/hoge.co.jp.privkey.pem;
}

確認してnginx再読み込み
# nginx -t
# systemctl reload nginx



6.移行先サーバーでcertbotコマンドから取得し直し

DNSを変更して設定がインターネットに反映されたらcertbotで取得し直す。certbotで複数回失敗すると、しばらくコマンドを受け付けないので、十分DNSが浸透してからやった方がいい。

# certbot certonly --webroot -w /home/httpd/hoge-hp/wordpress/ -d hoge.co.jp

確認
# ls /etc/letsencrypt/live/hoge.co.jp

confファイルを書き換え
# less /etc/nginx/conf.d/hoge.conf

# SSL
include conf.d/global/ssl.conf;
ssl_certificate      /etc/letsencrypt/live/hoge.co.jp/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/hoge.co.jp/privkey.pem;
#ssl_certificate      /etc/nginx/ssl.d/hoge.co.jp.fullchain.pem;
#ssl_certificate_key  /etc/nginx/ssl.d/hoge.co.jp.privkey.pem;

確認して再読み込み
# nginx -t
# systemctl reload nginx

cronにcertbot renewが登録されているか確認
# less /etc/cron.d/certbot



7.移行元サーバーからデータを削除

削除するもの

  • nginxのconfファイル
  • プロジェクトフォルダ(ソースコード)
  • データベース

certbotからドメインを削除
# certbot delete



< Related Posts >

2017年6月26日月曜日

【CentOS7】開発用仮想マシンに設定するsmb.conf

samba_settingHyper-V上にある仮想マシンのSamba設定ファイルsmb.confの覚書。

環境: CentOS7, Samba 4.4.4

全文はGistに置いた。

今まで使ってたのからoplocksの設定を追記している。

確認してsamba再起動するコマンド
# testparm

[global]
         server string = Samba %v
         workgroup = VM
         log file = /var/log/samba/log.%m
         max log size = 50
         disable spoolss = Yes
         printcap name = /dev/null
         guest account = node
         map to guest = Bad User
         security = USER
         idmap config * : backend = tdb
         level2 oplocks = No
         oplocks = No
         guest ok = Yes
         hosts allow = 127. 192.168.


[opt]
         comment = Option Directory
         path = /opt
         read only = No


[httpd]
         comment = httpd
         path = /home/httpd
         read only = No


# systemctl restart smb
# systemctl restart nmb


< Related Posts >

2017年6月19日月曜日

PhpStormが固まる

phpstorm-warning他のアプリから戻ってくるとPhpStormが固まるので調査した覚書。

環境: Windows 10 Pro 1703, Java SE 8  Update 131, PhpStorm 2017.1.4


直るまでのログ

  • PhpStorm起動後、File → Invalidate Caches / Restart...してみる。
  • Event Viewerでエラーが出てないかチェック
  • Google日本語入力とJavaの相性が悪い時がある。
    → Microsoft IMEを使うようにしても固まる
  • Java SEを最新にしてみる。
  • でも最近のPhpStorm 64bit版はJREをバンドルしていて、そちらを使うので最新のJava SEをインストールしても意味ない。
    → Help → Aboutで使っているJREのバージョンを確認できる。
  • 公式サイトを参考に使用するJava Runtimeを変更できるかもしれない。
    Selecting the JDK version the IDE will run under | IDEs Support (IntelliJ Platform) | JetBrains
    → これは結局試してない
  • 特定のプロジェクトの特定の場所にカーソルを持ってくると固まる気がする。
  • .ideaを削除
  • 「そんなバカな」と思いつつ、固まる場所のコードを全部削除してFile → Invalidate Caches / Restart...する。
  • 念のためPCを再起動して、お茶を飲みながら頭を冷やす。
  • それでも再発するため、PhpStorm 2017.2 EAPをインストール。
    PhpStorm Blog | Tips & tricks, news, how-to’s


これで直った。

PhpStormのバグだったみたい。


< Related Posts >

2017年6月15日木曜日

Gitリポジトリをコピーして別リポジトリとしてプッシュ

git_copy新しくホームページを作成するときに既存リポジトリからコピーして、新しくプロジェクトを作成したときの覚書。

環境: CentOS 7.3, git 2.13.1.394.g41dd433


参考サイト


コピー元のリポジトリを別名フォルダにcloneする。
$ cd /home/httpd/
$ git clone git@gitlab.com:dksg-websites/hoge-hp.git new-project
$ cd new-project

今のリモートoriginを確認して、新しいアドレスに変更(GitLabで新しいプロジェクトは事前に作っておく)
$ git remote -v
$ git remote set-url origin git@gitlab.com:dksg-websites/new-project.git
$ git remote -v

全部プッシュ
$ git push origin --all

過去のコミットログも含めて登録されるので、過去ログがいらない場合は参考サイトのようにやれば出来るかもしれない。

サブモジュールがある場合はinitする。
$ git submodule init
$ git submodule update
$ cd wordpress/wp-content/plugins/dksg-utility/
$ git checkout master
$ git pull


< 2017/10/02 Modified >
使わないサブモジュールを削除するとき
$ git submodule deinit wordpress/wp-content/plugins/enews/
$ git rm wordpress/wp-content/plugins/enews/


< Related Posts >

2017年6月4日日曜日

本社移転手続き(同管轄)。戸田市→川口市

本社を移転したときに行った手続きの覚書。

環境: 埼玉県戸田市から川口市への移転。同一管轄法務局。従業員なし(1人社長)


参考にしたサイト


目次

  1. 郵便局への転送手続き
  2. 法務局で株式会社本店移転登記申請書の提出。
  3. 法人クレジットカードの登録住所変更
  4. 銀行へ移転届け
  5. 税務署へ届け出
  6. 県税務署へ届け出
  7. 市役所(転出と転入)へ届け出
  8. 年金事務所へ届け出
  9. その他届け出



1.郵便局への転送手続き

郵便局が提供している「e転居」で登録してみた。

法人名で申請した。

申請から3日後以降から転送可能なため、必要なら事前に登録しておいた方がいい。



2.法務局で本店移転登記(同管轄)

ウェブサービス「会社設立ひとりでできるもん」を利用すると5400円で提出書類を作成できるということで使ってみた。

手順通りに必要事項を入力してPDFをダウンロード。

さいたま地方法務局(与野本町駅)へ行って、登録免許税3万円を購入/貼り付け、あとは受付に出すだけ。

11日(木)に提出して22日(月)の午前中に登記完了予定。



3.法人クレジットカードの登録住所変更

eオリコにログインして「お客さま情報変更」を見ると、個人の住所となってた。

明細書の電話番号に電話して住所変更した。



4.銀行へ移転届け

三菱東京UFJ銀行西川口支店ではウェブで変更出来ない。

住所変更だけなら登記簿謄本はいらなかった。



5.税務署へ届け出

e-Taxで申請しようとIEでログイン(Google Chromeでは表示できない)

ウェブ版では対応してなかった。。。

提出書類を国税庁のページからダウンロード。

異動届出書はそのままPDFに入力できる形式になっているので、入力して印刷すると楽。

「給与支払事務所等の開設・移転・廃止の届出書」はパスワードがかかっていてPDF上で入力できない。印刷→スキャンしてPDF上で入力した。

入力方法はこちらを参考に

管轄の税務署は西川口から川口に変更になった。

提出先は移転前の西川口税務署だけでいい。

郵送で提出。



6.県税務署へ届け出

埼玉県に対しての移転届。

エクセルをダウンロードして入力して印刷。

【添付書類】

  • 登記簿謄本(履歴事項全部証明書)のコピー

提出先は川口県税務署

郵送で提出。



7.市役所(転出と転入)へ届け出

移転元の戸田市に転出(廃止)届、移転先の川口市に転入(設置)届け

【添付書類(転入側だけ)】

  • 登記簿謄本(履歴事項全部証明書)のコピー
  • 定款のコピー

郵送で提出。



8.年金事務所へ届け出

年金事務所が同じ管轄内か管轄外かを調べる。

管轄内の浦和年金事務所だったので、管轄内用の変更届を提出する。

【添付書類】

  • 登記簿謄本のコピー

提出しに行ったらポストがあったので投函した。



9.その他届け出

下記変更届を出した。自分用メモ。

  • さいたま起業家協議会:変更届を送付
  • Toones:ウェブサイトからサポートへ住所変更の連絡
  • 市役所:住民税を特別徴収するので従業員の住んでいる市役所に移転届を提出


< Related Posts >

2017年4月17日月曜日

yum updateがエラーで失敗する

yum_updateyum updateをしたらエラーになったので対処しているときの覚書。なぜか開発サーバーでは成功する。

環境: CentOS7, YUM 3.4.3

エラー
# yum update

読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 370, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 179, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 573, in doCommands
    return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)
  File "/usr/share/yum-cli/yumcommands.py", line 504, in doCommand
    ret = base.updatePkgs(extcmds, update_to=(basecmd == 'update-to'))
  File "/usr/share/yum-cli/cli.py", line 1025, in updatePkgs
    self.update()
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 5114, in update
    updates = self.up.getUpdatesTuples()
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 1093, in <lambda>
    up = property(fget=lambda self: self._getUpdates(),
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 838, in _getUpdates
    self._up = rpmUtils.updates.Updates(self.rpmdb.simplePkgList(), self.pkgSack.simplePkgList())
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 1074, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 778, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.7/site-packages/yum/repos.py", line 347, in populateSack
    self.doSetup()
  File "/usr/lib/python2.7/site-packages/yum/repos.py", line 158, in doSetup
    self.ayum.plugins.run('postreposetup')
  File "/usr/lib/python2.7/site-packages/yum/plugins.py", line 188, in run
    func(conduitcls(self, self.base, conf, **kwargs))
  File "/usr/lib/yum-plugins/fastestmirror.py", line 202, in postreposetup_hook
    all_urls = FastestMirror(all_urls).get_mirrorlist()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 369, in get_mirrorlist
    self._poll_mirrors()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 413, in _poll_mirrors
    pollThread.start()
  File "/usr/lib64/python2.7/threading.py", line 746, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

「yum clean all」を試してもダメ。

検索してみると下記サイトが参考になった。

fastestmirrorを無効にする。
# less /etc/yum/pluginconf.d/fastestmirror.conf

[main]
enabled=0

これでyum updateすると成功。

 

< Related Posts >

2017年4月3日月曜日

Google検索とアプリを紐付けるApp Indexing(ディープリンク)を設定(書きかけ)

search_appGoogle検索結果にアプリがあることを通知するディープリンクを設定したときの覚書。

公式サイトの手順が分かりやすい。

 

目次

  1. Google Search Consoleにアプリを追加
  2. サイトと関連付ける
  3. 「Fetch as Google」を実行
  4. アプリ内のページをインデックスに登録する(未実装)

 


1.Google Search Consoleにアプリを追加

公式ヘルプを参考にSearch Consoleにアプリを追加

同じアカウントでアプリを管理しているので、追加自体はすぐに完了する。

 


2.サイトと関連付ける

メッセージにある「検索パフォーマンスを改善できます」から「ウェブサイトと関連付ける」をクリックして、ランディングページを関連付けた。

 


3.「Fetch as Google」を実行

ディープリンクは設定してないけど、Fetch as Googleを試してみた。

英語版で実行すると「一部完了」。

一覧を取得するURLで「リソースが取得できませんでした」とエラーが出た。APIがアプリからのリクエストしか許可しない処理があるので、それが影響したのかもしれない。

日本語版で実行すると「内部エラー」。

この状態でも3日後に「検索アナリティクス」にはデータが表示されるようになった。

 


4.アプリ内のページをインデックスに登録する(未実装)

アプリがAppcelerator Titaniumで作っているので、これに手を付けれていない。

実装したら追記予定。

 

< Related Posts >

2017年4月1日土曜日

サイトのスピードテストと画像を最適化してスコアを上げる

制作したホームページのサイトスピードを計測したときの覚書。

環境: CentOS 7

 


1.サイトのスコアを計測

最近公開されたGoogle先生のテストツール

image

前からあるこちらのツールの方がより具体的な修正方法を提示してくれるので分かりやすい。

image

 


2.画像の最適化

Google先生の提案に従って画像を圧縮してみる。詳しくは公式サイトで。

CentOS7にjpegtranをインストール
# yum install libjpeg-turbo-utils

バージョンの確認
$ jpegtran -v

libjpeg-turbo version 1.2.90 (build 20140610)

ヘルプの確認
$ jpegtran -h

使ってみる。
# jpegtran -copy none -optimize -progressive -outfile key-visual_mini.jpg key-visual.jpg

640KBが635KBになっただけ。あまり効果がなさそうなので他の画像はそのままにした。

画像を切り出すときに使っていたGIMPがうまいこと圧縮してくれたのかもしれない。

 

< Related Posts >

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 >

2017年2月28日火曜日

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

gmail-accessPOP3とSMTPを使うのは面白くないので、API経由でGmailを利用したらメールを削除することなくシステムと連携できると思い、試したときの覚書。

公式サイトを参考に

 

目次

  1. APIの使用制限
  2. システム用アカウントをGoogle Apps(G Suite)に追加
  3. Server-to-Serverのサービスアカウントを作成
  4. PHPサンプルを試す
  5. ウェブアプリケーションのOAuth2.0で認証

 


1.APIの使用制限

APIの使用制限がある。1日10億Quota Unit。メソッドごとに消費ユニットが違う。例えばメール送信は100ユニット消費する。

一秒間に250ユニットの制限がある。同時に3つ以上送信しようとすると制限に引っかかる。詳しくは公式サイトで。

メール送信はローカルのPostfixに任せた方がいいかもしれない。

 

クライアントライブラリが未成熟(?)

PHPはベータ版

Node.jsはまだアルファ版

 


2.システム用アカウントをGoogle Apps(G Suite)に追加

やろうと思っていることの概要。

システム専用のアカウントを作って、そのアカウント宛てに届いたメールを順次処理していく。

処理が終わったら「既読」ラベルを付けてアーカイブ。

Node.jsはアルファ版なのでWordPressのプラグインとしてPHPで開発することにした。

 


3.Server-to-Serverのサービスアカウントを作成

システム専用アカウントでGoogle Developer Consoleにアクセスして、API Keyを生成する。

公式サイトを参考に

簡単な手順

  1. Gmail APIを有効にする(プロジェクトの作成)
  2. 認証情報を生成
    「役割」はよく分からないので「ログ書き込み」を選択
  3. キー情報のファイルがダウンロードされる

 


4.PHPサンプルを試す

GitHubからPHP用のクライアントライブラリをダウンロードする。

Releasesに置いてあるのは依存関係も含んでいるので、そのまま解凍すれば使える。

今のバージョンはv2.1.1

公式サイトのサンプルをGmail API用に変更して実行しても「アクセストークンがない」と怒られる。

"error": "unauthorized_client",
"error_description": "Client is unauthorized to retrieve access tokens using this method."

クライアントライブラリが自動でアクセストークンを取得すると思ったら違った。

よく分からないので「サービスアカウントキー」での認証は諦め。

前にやったことのある「ウェブアプリケーション」の認証方式で実装することにした。

 


5.ウェブアプリケーションのOAuth2.0で認証

公式サイトと前の記事を参考に。あとクライアントライブラリの仕様が変わってる。

 

スコープの設定メモ。

google-api-php-client\vendor\google\apiclient-services\src\Google\Service\Gmail.php
の最初の方にconstされている。

 

部下がこれやろうとしてたら「PHPMailerを使ってPOP3とSMTPでいいじゃん」というのは間違いない。

 

< Related Posts >

2017年2月27日月曜日

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

php_composerGoogle先生の巨大ライブラリをリポジトリにコミットしたくなかったので、composerをインストールしたときの覚書。

環境: CentOS 7, PHP 7.0.16

 

参考サイト

 

目次

  1. composerとは
  2. YUM経由でインストール
  3. composerを使ってライブラリをインストール

 


1.composerとは

PHPの依存関係管理ツール。Node.jsのNPMやRubyのBundlerを参考にしている。

composer installするとcomposer.jsonを参照して「vendor」ディレクトリにライブラリがインストールされる。

composer.lockというファイルがあるとそちらを参照してそのバージョンをインストールするので、作った人と同じ環境を構築できる。

WordPressのプラグインみたいに別ディレクトリに設置してほしい場合も対応可能。

 


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を使ってライブラリをインストール

インストールするライブラリはこちら。

今回WordPressプラグインの中で使う。
$ cd /path/to/wordpress/wp-content/plugins/hoge/

対話形式でcomposer.jsonを作ってみる。
$ composer init

{
    "name": "dksg/hoge",
    "type": "wordpress-plugin",
    "license": "MIT"
}

項目の意味はあとで公式ドキュメントを読む。

ライブラリインストール
$ composer require google/apiclient:^2.0

vendorディレクトリにライブラリがダウンロードされた。

.gitignoreでコミットしないようにする。
$ vi .gitignore

vendor/

 

ひとまず環境が整った。

 

< Related Posts >

2017年2月15日水曜日

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

ie8_picture作ったサイトを念のためIE8で確認したら画像が表示されないので対応したときの覚書。

環境: Bootstrap 3.3.7, WordPress 4.7.2

 


1.【準備編】Windows7 + IE8の環境を作る(Hyper-V)

公式サイトでIE8を搭載した仮想マシンがダウンロードできる。

認証が必要。デスクトップに書いてあるのでそのまま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]-->

ie8.cssはこんな感じ。

.img-responsive {
    /* img tag disappear in IE8 when using display:table */
    display: block;
}

あとの細かいところは気にしない。

 

< Related Posts >

2017年2月14日火曜日

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

wordpress_redirectionWordPressでホームページを作成しているときの覚書。

環境: 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 ($post_type == 'post' ||
        $post_type == 'attachment') {
        if (isset($wp_post_types[$post_type]->public)) {
            $wp_post_types[$post_type]->public = is_user_logged_in();
        }
    }
}
add_action('registered_post_type', 'my_registered_post_type');

プレビューで使うかもしれないので、ログインしているユーザーには許可するようにしてある。

WordPressをフレームワーク的に使うことが多いので気付いて良かった。

 

< Related Posts >

2017年2月8日水曜日

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

wordpress_search久しぶりにWordPressの奥深くを潜っているときの覚書。WordPressは何がどの順番で実行するのか分かりにくいのでハマると長い。

環境: PHP 7.0.15, WordPress 4.7.2

 


1.確認すること

自分用チェックリスト

  1. サーバーにエラーログが出力されているかどうか
    # less /var/log/nginx/error.log
  2. wp_loadedにフックして読み込みが完了しているかどうか確認
    参考:Plugin API/Action Reference/wp loaded | WordPress Codex
  3. template-loader.phpの$templateをデバッグ出力してテーマのどのファイルを読み込もうとしているか確認
    参考:Template Hierarchy | Theme Developer Handbook | WordPress Developer Resources
  4. WordPressの内部で使っている「name」「year」などの名前でPOSTすると動作がおかしくなる
    参考:Class Reference/WP Query | WordPress Codex
  5. 存在しない関数を実行してエラーを起こして読み込まれた順番を確認。要xdebug

 


2.xdebugのインストール手順

YUM経由でインストール
# yum install php-pecl-xdebug
# systemctl status php-fpm

php infoを見て確認
# php -i | grep xdebug

 

< Related Posts >

2017年2月6日月曜日

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

bootstrap_printwkhtmltopdfでHTMLをPDF化しているときの覚書。

今までウェブサイトを印刷したときのことは全く考慮してなかった。Bootstrapのデフォルト機能にお任せだったけれど、印刷しても出来るだけ読みやすくなるようにしてみた。

環境: Bootstrap 3.3.7, less 2.7.2

 


1.印刷したときの横幅

Bootstrapの場合、印刷するとExtra small devices(.col-xs-)が適用される。

これは横幅が約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-)が適用されたレイアウトに出来る。

これをlessで表現すると

@media print {
  .make-grid(sm);
}

Bootstrapのgrid.lessを参照。

あとの細かい箇所は必要なときに追加していく。

@media screen {}

も有用。

 

< Related Posts >

2017年2月3日金曜日

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

wkhtmltopdf_centos7HTMLからPDFを生成するコマンドラインツールwkhtmltopdfをインストールしたときの覚書。

環境: CentOS 7 x86_64

 

目次

  1. YUM経由でインストール
  2. 日本語フォントをインストール
  3. PHPシェルから実行
  4. 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を参考にした。

# 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」と検索

ダウンロードと解凍
# cd /usr/share/fonts/
# curl -O https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
# mkdir NotoSansCJKjp
# unzip -d NotoSansCJKjp/ NotoSansCJKjp-hinted.zip

フォントをインストールして確認
# fc-cache -fv
# fc-list

zipファイルは削除
# rm NotoSansCJKjp-hinted.zip

試す
# xvfb-run /usr/bin/wkhtmltopdf http://dksg.co.jp test.pdf

日本語が表示された。

基本は画面を印刷をした状態のCSSが適用される(@media printが適用される)。

詳しいオプションはヘルプを参照。
# wkhtmltopdf -H

レスポンシブデザインの横幅を変えようと下記コマンドを試してみたけど変わらない。最新にすると可能かもしれない。
# xvfb-run /usr/bin/wkhtmltopdf --dpi 200 --viewport-size 1280x1024 http://dksg.co.jp test.pdf
# xvfb-run --server-args="-screen 0 1024x768x24" /usr/bin/wkhtmltopdf --use-xserver http://dksg.co.jp test.pdf

 


3.PHPシェルから実行

PHPから実行するラッパークラスがある。

内部的にproc_openして、いい感じに実行結果を返してくれるみたい。

今回複雑なパラメータを渡す予定はないのでPHP標準のexecを利用することにした。

 

PHPから実行すると日本語が表示されない。

確認方法(rootユーザーでnginxユーザーとして実行するコマンド)
# sudo -u nginx /usr/bin/xvfb-run /usr/bin/wkhtmltopdf 'http://dksg.co.jp' 'test.pdf'

フォントがあるか確認
# sudo -u nginx fc-list

よく分からないので、WEBフォントを使うことにした。

Early AccessじゃなくなってもいいようにNoto Sansも一応追加しておいた。

<link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet" />
<link href="https://fonts.googleapis.com/earlyaccess/notosansjapanese.css" rel="stylesheet" />

css

body, table {
    font-family: "Noto Sans JP","Noto Sans Japanese","Noto Sans",sans-serif;
}

 


4.PHP-FPMから実行するとエラー(2017/02/06 追記)

実装後にexecするとエラー

which: no xauth in ((null))
xvfb-run: error: xauth command not found

下記サイトを参考に

php.iniを編集して対応する。コメントを外すだけ。
# less /etc/php-fpm.d/www.conf

env[PATH] = /usr/local/bin:/usr/bin:/bin

再起動
# systemctl restart php-fpm

動くようになったけども重すぎてタイムアウトする。

大人しくTCPDFにすれば良かったと思いながらも別プロセスでPDFを生成するように処理を変える。

 

< Related Posts >

2017年2月2日木曜日

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

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利用規約とかも考えるとリスクが高い。

 

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)で作成したのがそのままPDFに出来るのは本当に楽。開発も修正も。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives