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

tohokuaikiのチラシの裏

技術的ネタとか。

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

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で国際化する

php

普通に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の活用ができるようになる。

PHPのsetlocaleまとめ

php

前2つのエントリでハマりまくったPHPのsetlocaleのまとめ。*1

Apache CLIの共通の認識

  • $locale -a を行って表示されないロケールは(つまりOSで有効化されてないロケール)setlocale()しても無効である。
  • ただし、言語パック(debianだとtask-japaneseパッケージなど)を入れる必要は無い。
  • LC_MESSAGESディレクトリを置くフォルダ名は、文字コードが必要ない。付けてはいけない。(×:ja_JP.UTF8 〇:ja_JP)
  • setlocale()第二引数で設定するロケールは、$locale -a の中にあるもので一致してなければならない。locale -a の中に、"ja_JP.utf8"があった場合"ja_JP"はN.G
  • setlocale()の第二引数内の「utf8」は、文字表記の揺れを認める。UTF8/UTF-8/utf8/utf-8/UtF-8などは全て許容される。

CLIの場合のsetlocale

  • CLIでのsetlocale()の第二引数は環境変数$LANGUAGEで上書きされる。$LANGUAGEが無い場合は、$LANGで上書きされる
  • この2つの環境変数が無い場合に第二引数の環境変数が評価される。

*1:そもそもロケールがen_USしか入ってないdebianだからっていうのでハマったのであるが