読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

ホンダS660の販売台数推移

データは一般社団法人 全国軽自動車協会連合会 - 統計から

年月 販売台数
2015年3月 19
2015年4月 1411
2015年5月 807
2015年6月 1095
2015年7月 1155
2015年8月 858
2015年9月 1144
2015年10月 1019
2015年11月 949
2015年12月 839
2016年1月 993
2016年2月 949
2016年3月 1318
2016年4月 930
2016年5月 855
2016年6月 1037
2016年7月 902
2016年8月 556
2016年9月 935
2016年10月 953
2016年11月 531
2016年12月 339
2017年1月 367
2017年2月 348
2017年3月 493

f:id:tohokuaiki:20170427174615p:plain

累計20802台
今年に入ってから完全に一回りしたって感じだな。

CentOS6で起動時にfsckが走って起動できない

ファイルシステムにエラーが出て起動しない。

起動中にfsckが走って、最後に

unexpected inconsistency run fsck manually

って出てダメになってしまう。

シングルユーザーモードで入ってルートマウントを解除して手動でfsckを掛けろということらしい。その手動までいけない。

grubの起動画面で、起動オプションに 「fastboot」「single」を追加する。

これで起さっきのところはすっ飛ばして起動して…と思ったらswapの有効化のところで止まってる。

なんかダメなんか…これ。

って思ったら、さくらVPSのサポートに書いてあった。。。

help.sakura.ad.jp

以下の editモード に変更した状態で 『 console=tty0 console=ttyS0,115200n8r crashkernel=auto 』の文字をバックスペースキーで削除し、 『半角スペース』と『半角数字の1』を入力して、キーボードの「Enter」キーを押して editモード を終了します。

罠といえば、このオプションの行が長くて2画面(しかも横スクロール)あるから最後までちゃんと消すことかな。

あとはfsckを掛ける

www.drk7.jp にあったように、fsckを掛ける。

/etc/fstab見るとext4で、デバイスはdfコマンドで/dev/vda3だったので

# fsck -t ext4 /dev/vda3

でひたすらYキーを押す。修行である。

Magento2.1をComposerを使ってインストールする

普通にZIP持ってきてインストールする方法はこちらなのですが、せっかくなのでComposer使ってやってみましょう。アップデートとかあった際にupdateコマンド一発で何とかしてくれそうですしね。 magento.flatz.jp

環境設定

普通に、Ubuntu16.04を使ってインストール

PHP

$php -v
PHP 7.0.15-0ubuntu0.16.04.4 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.15-0ubuntu0.16.04.4, Copyright (c) 1999-2017, by Zend Technologies

追加モジュール

apt-get install -y php7.0-curl php7.0-dev php7.0-gd  php7.0-intl php7.0-mcrypt php7.0-mbstring php7.0-mysql php7.0-xml php7.0-soap php7.0-xsl php7.0-zip php7.0-json

php.iniに設定値追加

date.timezone = 'Asia/Tokyo'
memory_limit = 2048M
upload_max_filesize = 200M
post_max_size = 200M
allow_url_fopen = Off

これくらいかな。。

allow_url_fopen = Off はダメだった。Extensionをインストールする時にエラー出された。

MySQL

5.7をインストール

mysql> select @@version;
+-------------------------+
| @@version               |
+-------------------------+
| 5.7.17-0ubuntu0.16.04.1 |
+-------------------------+

/etc/mysql/mysql.conf.d/mysqld.cnf を編集

character-set-server=utf8
max_allowed_packet      = 128M
innodb_buffer_pool_size = 512M
innodb_log_file_size=128M

インストール作業

こちらの記事にしたがって、インストール開始。 devdocs.magento.com

Composerのインストール

なんとなくこれはapt-getではなくユーザー権限で。

~/bin$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.4.1) successfully installed to: /home/magento/bin/composer.phar
Use it: php composer.phar


~/bin$ ln -s composer.phar composer

.bashrcに

export PATH=$PATH:~/bin

Magentoのインストール

DocumentRootを作成し、https://account.magento.com/customer/account/create/ で作成したアカウントでcreate-projectする。 以下ではwwwディレクトリにMagentoをインストールする場合。

$ composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition www

    Authentication required (repo.magento.com):
      Username: xxxxxxxxxxxxxxxxxxxxxx
      Password:

この時、UsernameとPasswordを求められる。これは https://account.magento.com/customer/account/create/ のUsernameとPasswordではない。

Magento.comのアカウントページ > Marketplace > My Access Keys > Magento2の箇所から作成したPublicKeyとPrivateKeyのキーペアをUsername/Passwordとして入力する。

結構時間かかるけど、あとはComposerがインストールを進めてくれる。

ファイルのパーミション変更

Apacheがファイルを書き込んだりできるように、インストール作業を行ったユーザーをApache実行権限グループに入れ、そのグループに書き込み権限を与える。

Apache実行権限ユーザーの確認

レンタルサーバーなどでsuExecしてればApache実行=ファイルオーナーなので、ファイルのパーミションは問題ないのだけど、そうでないときはこの手の変更を行う。

$ ps auwx|grep apache
root       305  0.0  0.8 411924 36220 ?        Ss   14:35   0:00 /usr/sbin/apache2 -k start
www-data   384  0.0  0.4 412776 18800 ?        S    14:40   0:00 /usr/sbin/apache2 -k start
...


$ groups www-data
www-data : www-data

ということで、Apacheを実行しているwww-dataユーザーのグループであるwww-dataグループにインストールを実行したアカウントを入れる。

# usermod -g www-data magento
# groups magento
magento : www-data adm cdrom sudo dip plugdev lpadmin sambashare
対象ファイルにGroup書き込みができる設定を行う

対象となるのは以下の5つ * vendor * app/etc * pub/static * pub/media * var

$ find var vendor pub/static pub/media app/etc -type f |xargs -I{} chmod g+w {}
$ find var vendor pub/static pub/media app/etc -type d |xargs -I{} chmod g+ws {}

ファイルグループをApache実行グループに変更し、magentoコマンドに実行権限を付与。

chown -R :www-data . 
chmod u+x bin/magento

インストールセットアップ

webからとコマンドラインからセットアップするのと2つあるみたい。

コマンドラインから

Webブラウザから

webからの方が簡単かな。

JavaScriptのEvent Listener付与時に即時実行する方法

どっちがいいんだろう?

$=jQuery;
// 1
$('#f').on('click x', function(e){
    alert('do');
})).trigger('x');

// 2
$('#f').on('click', (function(){
    var f = function(){ alert('do'); };
    f.call();
    return f;
});

なんかほかにもあったような気がする。

Smartyを使ったPHPアプリケーションをgettextで国際化する

普通にpoeditとgettextで行けるでしょ、って思ったらそうでもなかったということで。

potファイルの作成

gettextは、「ソースコード」→「.potファイル」→「.poファイル」→「.moファイル」となり最終的には.moファイルを使う。

.potファイルができれば.moファイルはpoeditで作れる。ソースコードから.potを作るにはxgettextを使う。その辺りは下記のエントリ参照。

atyks.hateblo.jp

ただ、このxgettextはPHPやC、Javaなどのプログラミング言語のgettext用のキーワードを抜き出しているのだけど当然その中にPHP-Smartyは含まれていないのである。今時のフレームワークPHPをテンプレートとして使うものなら問題ないのだけど、LaravelなんかのBladeテンプレートもさてどうするんだろうという感じである。

同じことを考えてる人はいるもので・・・

正規表現Smartyテンプレートから抜き出すかなぁ・・・と考えてたんだけどこんなのを見つけた。

github.com

ということで取り組んでみる。

手順

Smartyにおけるgettextの適用

こんな感じ。Smartyブロックで囲む。

<{t}>This is English sentence.<{/t}>

<{t 1=$user_name}>You are Login as %1.<{/t}>

このSmartyブロックは、smarty-gettextにblock.t.phpというファイルがあるので、Smartyプラグインディレクトリにコピーしておく。

Smartyファイルからのpot作成

Smartyテンプレート内に前述のようにgettextを適用したら、smarty-gettextにあるスクリプト、tsmarty2c.phpを使う。

このファイルのSmartyの「デリミタ」「gettext用ブロックプラグイン」「テンプレート拡張子」を自分が使っているものに変更する。

<?php
// smarty open tag
$ldq = preg_quote('<{');

// smarty close tag
$rdq = preg_quote('}>');

// smarty command
$cmd = preg_quote('t');

// extensions of smarty files, used when going through a directory
$extensions = array('html');

対象となるディレクトリやファイルを指定してpotを作成する。対象が複数ある場合は引数をどんどんと伸ばしていく。

php tsmarty2c.php -o smarty.pot target/smarty/template/directory target/smarty/template/file1.tpl target/smarty/template/file2.tpl

PHPスクリプトからもpot作成

対象となるPHPスクリプトの一覧をtarget_phpfile.listにfind使って書き出して、xgettextコマンドの実行。

xgettext --language=PHP --from-code=utf-8 -f target_phpfile.list --keyword=__ -o php.pot

作った2つのpotを結合

Smarty由来のpotと、PHPスクリプト由来のpotを合体。

msgcat smarty.pot php.pot > php_smarty.pot

2回目からは、翻訳があるpoと結合してから

既に翻訳を始めていながら、新しくsmartyテンプレートやPHPプログラムが追加になった場合は、既に翻訳済みのpoと合体させる。

msgmerge php_smarty_prevous.po new_version.pot -o php_smarty.po

これでSmartyPHPで共通の.po/.moを使ったgettextの活用ができるようになる。