何度やっても同じ

ただの日記

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用)

gitのコミットメッセージでハッシュ記号 # をつかう

GitHubのIssue番号をコミットメッセージに含めようとすると # 以降がコメントになって消えてしまう。 git config でコメント記号を変える。

git config core.commentChar ";"

Mac(Mojave)にjava6と7と8をインストール

お仕事の都合でJava 6と7と8をインストール。

support.apple.com

Java6はこれ、しかたない。7と8はhomebrewで。AdoptOpenJDKでいこうと思ったけれどJava7はなかったので7はZuluのをインストール

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk8

$ brew tap homebrew/cask-versions
$ brew cask install zulu7

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
    1.8.0_222, x86_64:  "AdoptOpenJDK 8"    /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
    1.7.0_232-zulu-7.31.0.5, x86_64:    "Zulu 7"    /Library/Java/JavaVirtualMachines/zulu-7.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:   "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
$ java -version
openjdk version "1.7.0_232"
OpenJDK Runtime Environment (Zulu 7.31.0.5-CA-macosx) (build 1.7.0_232-b6)
OpenJDK 64-Bit Server VM (Zulu 7.31.0.5-CA-macosx) (build 24.232-b6, mixed mode)

CSSのfont-familyに長いこと悩んで最近こうなった

ヒラギノ角ゴとメイリオの並び順については、Macメイリオがインストールされている場合よりも、Windowsヒラギノがインストールされている場合のほうが結果が悲惨、ということもあり、メイリオを先にもってくるケースが多いらしい(下記URL参照)。自分も基本的にはこんな感じでフォント指定していた。

http://loconet.web2.jp/blog/archives/2007/02/cssfontfamily.html
http://webbingstudio.com/weblog/think/entry-137.html

ところが、いつだったか、ここはてなブログソースコードを眺めていて、こんな記述に気付いた。

if (~navigator.userAgent.indexOf('Mac OS X')) {
  document.write('<style type="text/css">html, body { font-family: \x27Helvetica\x27, \x27Arial\x27, \x27ヒラギノ角ゴ Pro W3\x27, \x27Hiragino Kaku Gothic Pro\x27, sans-serif; } </style>');
} else {
  document.write('<style type="text/css">html, body { font-family: \x27Helvetica\x27, \x27Arial\x27, \x27メイリオ\x27, \x27Meiryo\x27, \x27MS PGothic\x27, sans-serif; } </style>');
}

JavaScriptでOSを判別してフォントを選択してます。「おー」と思って、その後はこれをパクっていた。

技術的な内容の文章を書く場合は、日本語の文章中に現れる英単語は等幅にしたいので、HelveticaとかArialのところはTwitter Bootstrapのcode要素のスタイルをパクってMonaco, Menlo, Consolas, 'Courier New' と並べることがよくあった。


そして最近、@font-face の local() とかいうのを知って、あーこれ便利だなと。@font-face はWebフォントのために使うものというイメージしかもっていなかったけれど、ローカルにある複数フォントに優先度つけた上でそれに名前をつける、ような使い方ができるとのこと。ユニコードの範囲でフォントを分けることもできるらしい。

@font-face {
  font-family: OreOreFont;
  src:
    local('メイリオ'),
    local('Meiryo'),
    local('ヒラギノ角ゴ Pro W3'),
    local('Hiragino Kaku Gothic Pro'),
    local('MS PGothic'),
    local(sans-serif);
}

@font-face {
  font-family: OreOreFont;
  src:
    local('Monaco'),
    local('Menlo'),
    local('Consolas'),    
    local('Courier New'),
    local('Courier'),
    local(monospace);
  unicode-range: U+0000-007F;
}

html,body {
  font-family: OreOreFont;
}

OSを判別できるわけではないので、ヒラギノメイリオの並び順問題を解決できるわけではないけれど、どこかのサーバに自分専用CSSを置いていくつかフォントを定義しておけばコピペせずに使いまわせるので、便利。並び順はもうどうでもよくなってきた。必要ならこれとJavaScriptによるOS判別を併用することもできるし。メイリオが嫌いなマカーはメイリオいれなきゃいいいいよね。