何度やっても同じ

ただの日記

CentOS7でNginxでWordPressあとPHP5と7切り替え

qiita.com

PHPバージョンの切り替えについては、だいたいこのサイトで。

worklog.be

Nginx+WordPressの設定はこちらで。

nginxはデフォでユーザnginxで実行されていて、それはいいのだけど、php-fpmはユーザapacheで実行されてしまうので、nginxに統一したい。phpバージョンによってphp-fpmの設定ファイルが特定の場所にあったりなかったりした。ともかくこのなかの実行ユーザと実行グループを変えればOK。

# php5.6のはここにあり、
$ ll -i /opt/remi/php56/root/etc/php-fpm.d          
total 20
256069 -rw-r--r-- 1 root root 19220 Sep 27 00:19 www.conf

# ここにもある
# inode番号は同じだけどリンク数1になっててよくわからん
$ ll -i /etc/opt/remi/php56/php-fpm.d          
total 20
256069 -rw-r--r-- 1 root root 19220 Sep 27 00:19 www.conf

# php7.4はこれがない
$ ll -i /opt/remi/php74/root/etc/php-fpm.d   
ls: cannot access /opt/remi/php74/root/etc/php-fpm.d: No such file or directory

# こっちはある
$ ll -i /etc/opt/remi/php74/php-fpm.d
total 20
509458 -rw-r--r-- 1 root root 19552 Sep 27 00:38 www.conf

ついでに大変個人的なメモで、wp-include/rewrite.phpの172行目と211行目コメントアウトglobal $wp_rewrite が存在しない。コメントアウトしたせいで一部URLが正しく表示されない模様。

外部にメール送信できるようPostfix設定

saslauthd設定

/etc/sysconfig/saslauthd

/etc/shadow を利用した認証方法に変更

# MECH=pam
MECH=shadow

再起動してOSユーザ名とパスを使って動作確認。

$ service saslauthd restart
$ testsaslauthd -u user -p pass
0: OK "Success."

postfix設定

/etc/postfix/master.cf

submissionサービスをsasl認証つきで利用

submission inet n       -       n       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

/etc/postfix/main.cf

sasl認証済のユーザは任意の宛先へ送信可能とする

http://www.aconus.com/~oyaji/bbs/wforum.cgi?mode=allread&pastlog=0012&no=7547&page=120&act=past

smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

さいきどう。

$ service postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]

送信確認

事前にユーザ名とパスワードをbase64化しておく。

# echoは末尾に改行をつけて出力する。-n は改行をつけないオプション
$ echo -n user | base64
USERBASE64=
$ echo -n pass | base64
PASSBASE64=

プロトコル直利用でメール送信。

$ telnet localhost 587
EHLO example.com
250-example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

AUTH LOGIN
334 VXNlcm5hbWU6
USERBASE64=
334 UGFzc3dvcmQ6
PASSBASE64=
235 2.7.0 Authentication successful

MAIL FROM: user@example.com
250 2.1.0 Ok

RCPT TO: mymailaddress@x.com
250 2.1.5 Ok

DATA
354 End data with <CR><LF>.<CR><LF>
hello! hello!

.

TLS設定

あとでやる。

support.plesk.com

scala-sshでscp

github.com

PublicKeyLoginはデフォルトで ~/.ssh/id_rsa~/.ssh/id_dsa秘密鍵として使う。のだけど、環境によるのだろうか、"~" がユーザのホームディレクトリとして展開されないので、鍵は自分でちゃんとフルパスを指定。

val host = "xxx.example.com"
val home = System.getProperty("user.home")

SSH(host, HostConfig(
  PublicKeyLogin("xfan", s"$home/.ssh/id_rsa"),
  hostKeyVerifier = HostKeyVerifiers.DontVerif,
)) { client =>
  client.upload(s"$home/images/neko.jpg", "/tmp") match {
    case Success(_) => // nothing to do
    case Failure(e) => throw e
  }
}

かんたん。

IntelliJ IDEAでコードスタイルの設定

Preferences -> Editor -> Scala

とりあえず初期状態から下記のあたりを変更した。メソッド定義が長いときに引数を改行したら ( に整列するのは許せない。

Spaces -> Other -> New line after annotations ✓
Wrapping and Braces -> Keep when reformatting -> Simple blocks in one line ✓
Wrapping and Braces -> Keep when reformatting -> Simple methods in one line ✓
Wrapping and Braces -> Keep when reformatting -> Simple one-line lambdas in arg list ✓
Wrapping and Braces -> Method declaration parameters [Wrap if long]
Wrapping and Braces -> Method declaration parameters -> Align when multiline □
Wrapping and Braces -> Method declaration parameters -> New line after '(' ✓
Wrapping and Braces -> Method declaration parameters -> Place ')' on new line ✓
Wrapping and Braces -> Chained method calls [Chop down if long]

Javaの正規表現で \p{Han} がPatternSyntaxException

Java8と9で確認した。それ以降のバージョンでは確認していない。

Pattern p = Pattern.compile("\\p{Han}+");
Matcher m = p.matcher("吾輩は猫である");

while (m.find()) {
  System.out.println("matched: " + m.group());
}

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown character property name {Han} near index 6
\p{Han}+

こうなる。

https://github.com/Engelberg/instaparse/issues/106#issuecomment-127065635 のコメントによると、次のように書けばOK。UnicodeブロックとUnicodeスクリプトとで書き方が違うらしい。

Pattern p = Pattern.compile("\\p{script=Han}+");

結果。

matched: 吾輩
matched: 猫

エラーはこれで解決なのだけど、先のコメントと同じページに次のような記述があるので、\{script=Han} が、これらのブロックの文字すべてにマッチするのかどうか、確認してみた。

    (* Same as Han but without IDC *)
    L = CJK | CJKA | CJKB | CJKC | CJKD | CJKE | CJKRS | KR | CJKSP | CJKS | ECJKLM | CJKCo | CJKCI | CJKCF | CJKCIS
    (* IDC are excluded from this *)
    Han = L | IDC

    (* Blocks follow *)
    CJK =     #'[\u4e00-\u9fff]'
    CJKA =    #'[\u3400-\u4dbf]'
    CJKB =    #'[\u20000-\u2a6df]'
    CJKC =    #'[\u2a700-\u2b73f]'
    CJKD =    #'[\u2b740-\u2B81F]'
    CJKE =    #'[\u2b820-\u2ceaf]'
    CJKRS =   #'[\u2e80-\u2eff]'
    KR =      #'[\u2f00-\u2fdf]'
    IDC =     #'[\u2ff0-\u2fff]'
    CJKSP =   #'[\u3000-\u303f]'
    CJKS =    #'[\u31c0-\u31ef]'
    ECJKLM =  #'[\u3200-\u32ff]'
    CJKCo =   #'[\u3300-\u33ff]'
    CJKCI =   #'[\uf900-\ufaff]'
    CJKCF =   #'[\ufe30-\ufe4f]'
    CJKCIS =  #'[\u2f800-\u2fa1f]'

各ブロックから表示できそうな文字を選んで並べてマッチさせてみる。文字はCyber Librarianで探した。

    String chars = String.join("", new String[] {
      "\u4e00",
      "\u3400",
      "\ud840", "\udc0b", // "\u2000b",
      "\ud869", "\udfdd", // "\u2a7dd",
      "\ud86d", "\udf46", // "\u2b746",
      "\ud86e", "\udcb8", // "\u2b8b8",
      "\u2e80",
      "\u2f00",
      "\u2ff0",
      "\u3000",
      "\u31c0",
      "\u3200",
      "\u3300",
      "\uf900",
      "\ufe30",
      "\ud87e", "\udc04", // "\u2f804",
    });
    System.out.println(chars);

    Pattern p = Pattern.compile("\\p{script=Han}+");
    Matcher m = p.matcher(chars);

    while (m.find()) {
      System.out.println("matched: " + m.group());
    }

その結果。

一㐀𠀋𪟝𫝆𫢸⺀⼀⿰ ㇀㈀㌀豈︰你
matched: 一㐀𠀋𪟝𫝆
matched: ⺀⼀
matched: 豈
matched: 你

CJK統合漢字拡張E(CJKE)、漢字構成記述文字(IDC)、CJKの記号及び句読点(CJKSP)、CJKの筆画(CJKS)、囲みCJK文字・月(ECJKLM)、CJK互換用文字(CJKCo)、CJK互換形(CJKCF)はマッチしない模様。見た感じ、普通に考えて漢字でないブロックを除外しているようではある。CJK統合漢字拡張Eは漢字だけど、このブロック自体がJava8ではサポートされていないようなので、仕方ない。

一応、自分で正規表現にすべてのUnicodeブロック(拡張Eを除く)からなる文字クラスを定義してマッチさせてみた。

    String[] props = {
      "\\p{InCJKUnifiedIdeographs}",                // CJK    [\u4e00-\u9fff]
      "\\p{InCJKUnifiedIdeographsExtensionA}",      // CJKA   [\u3400-\u4dbf]
      "\\p{InCJKUnifiedIdeographsExtensionB}",      // CJKB   [\u20000-\u2a6df]
      "\\p{InCJKUnifiedIdeographsExtensionC}",      // CJKC   [\u2a700-\u2b73f]
      "\\p{InCJKUnifiedIdeographsExtensionD}",      // CJKD   [\u2b740-\u2B81F]
      // "\\p{InCJKUnifiedIdeographsExtensionE}",   // CJKE   [\u2b820-\u2ceaf] ない
      "\\p{InCJKRadicalsSupplement}",               // CJKRS  [\u2e80-\u2eff]
      "\\p{InKangxiRadicals}",                      // KR     [\u2f00-\u2fdf]
      "\\p{InIdeographicDescriptionCharacters}",    // IDC    [\u2ff0-\u2fff]
      "\\p{InCJKSymbolsandPunctuation}",            // CJKSP  [\u3000-\u303f]
      "\\p{InCJKStrokes}",                          // CJKS   [\u31c0-\u31ef]
      "\\p{InEnclosedCJKLettersandMonths}",         // ECJKLM [\u3200-\u32ff]
      "\\p{InCJKCompatibility}",                    // CJKCo  [\u3300-\u33ff]
      "\\p{InCJKCompatibilityIdeographs}",          // CJKCI  [\uf900-\ufaff]
      "\\p{InCJKCompatibilityForms}",               // CJKCF  [\ufe30-\ufe4f]
      "\\p{InCJKCompatibilityIdeographsSupplement}" // CJKCIS [\u2f800-\u2fa1f]
    };

    String chars = String.join("", new String[] {
      "\u4e00",
      "\u3400",
      "\ud840", "\udc0b", // "\u2000b",
      "\ud869", "\udfdd", // "\u2a7dd",
      "\ud86d", "\udf46", // "\u2b746",
      "\ud86e", "\udcb8", // "\u2b8b8",
      "\u2e80",
      "\u2f00",
      "\u2ff0",
      "\u3000",
      "\u31c0",
      "\u3200",
      "\u3300",
      "\uf900",
      "\ufe30",
      "\ud87e", "\udc04", // "\u2f804",
    });
    System.out.println(chars);

    Pattern p = Pattern.compile("[" + String.join("", props) + "]+");
    Matcher m = p.matcher(chars);

    while (m.find()) {
      System.out.println("matched: " + m.group());
    }

結果。拡張E以外マッチ。

一㐀𠀋𪟝𫝆𫢸⺀⼀⿰ ㇀㈀㌀豈︰你
matched: 一㐀𠀋𪟝𫝆
matched: ⺀⼀⿰ ㇀㈀㌀豈︰你

サロゲートペアはJavaScriptで雑なコード書いてつくりました。

const toSurrogatePair = function(ch) {
  const x = ch - 0x10000
  return [
    Math.floor(x / 0x400) + 0xD800,
    x % 0x400 + 0xDC00
  ].map(c => `\\u${c.toString(16)}`)
}

[
  0x2000b,
  0x2a7dd,
  0x2b746,
  0x2b8b8,
  0x2f802,
].forEach(c => {
  const p = toSurrogatePair(c)
  console.log(`"${p[0]}", "${p[1]}", // ${c.toString(16)}`)
})

phpbrewでphpインストール

Mac, Mojave.

https://github.com/phpbrew/phpbrew/wiki/Requirement にある手順

xcode-select --install
brew install automake autoconf curl pcre bison re2c mhash libtool icu4c gettext jpeg openssl libxml2 mcrypt gmp libevent
brew link icu4c
brew link --force openssl
brew link --force libxml2

のうち下3つはできないしやらないで、代わりにパス通しておく。それ以外は公式に記載のとおり進めた。

export PATH="/usr/local/opt/icu4c/bin:/usr/local/opt/icu4c/sbin:$PATH"
export PATH="/usr/local/opt/openssl/bin:$PATH"
export PATH="/usr/local/opt/libxml2/bin:$PATH"

今回はPHP5.xが必要だったので、インストールしようとしてみると、まだ必要なライブラリがいくつか足りないらしくエラーでる。

$ phpbrew install 5.6.40 +default
...(略)
checking for BZip2 support... yes
checking for BZip2 in default path... not found
configure: error: Please reinstall the BZip2 distribution

checking for cURL support... yes
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
    easy.h should be in <curl-dir>/include/curl/

いくつかライブラリ追加と、インストール時にパス指定し、やりなおしてインストール成功。

$ brew install zlib bzip2 libiconv curl
$ phpbrew install 5.6.40 +default +bz2="$(brew --prefix bzip2)" +zlib="$(brew --prefix zlib)" +curl="$(brew --prefix curl)"

(略)
Enjoy!

$ phpbrew use php-5.6.40
$ php -v
PHP 5.6.40 (cli) (built: Aug 25 2019 17:25:10) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

バッテリー膨張で修理にだしたMacbook Proが返ってきた

バッテリーが膨張して平らなテーブルに置いてもPCの中央部分が接地してガタつくので、修理に出した。

最初の電話サポートでは情報をもらえず後でわかったことなのだけれど、修理の際、Apple直か正規サービスプロバイダかで、料金がちがう。プロバイダのほうは、プロバイダが独自に修理費用を上乗せすることが認められているらしい。今回のバッテリー交換は、Apple直で19,800円。うちの近くのプロバイダだと29,000円。わざわざ行ったプロバイダだったけどお断りした。Appleストアは近くにないけれど、配送修理がある。郵送料は往復とも無料、というか修理代金に含まれているそう。プロバイダで点検してもらったことで、バッテリー膨張以外に大きな問題はないことは確定していたので、事前見積もりが変動する可能性も低い。

ついでに、これはプロバイダでの点検で教えてもらったことなのだけれど、一部微妙に剥がれていたディスプレイのコーティング、これについては購入から4年のサポート期間があるということで、ギリギリ期間内。バッテリー交換のついでに無料修理してもらった。

16日(金)電話サポートで修理依頼、17日(土)集荷、23日(金)返却。うち修理工場から遠いので片道1日ずつは余計にかかってそう。バッテリーの保証はこれから1年。

キーボードをブラックアウトステッカーで無刻印化していたのだけど、バッテリーと一体型ということで一緒に交換されて新品になってしまった。もう一回買おうかな。

ブラックアウトステッカー for Mac 15mm(MBA/MBP~2015 JIS用)

ブラックアウトステッカー for Mac 15mm(MBA/MBP~2015 JIS用)