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

山本ゆうごブログ

山本ゆうごの仕事メモ

osxにphp7.1をインストール

brew でインストールできる。

$ brew search php7

これで、php7.0と7.1の両方があることが分かる(2017/02/17現在)。

んで、php7.1の方が速いらしいので、それを入れる。すると、php5.6とコンフリクトしているから、php5.6をunlinkしろと言われる。素直にunlink。unlink はアンインストールではないのであまりためらわずに。

==> Installing php71 from homebrew/php
Error: Cannot install homebrew/php/php71 because conflicting formulae are installed.

  php56: because different php versions install the same binaries.

Please `brew unlink php56` before continuing.

あれためて、インストール

$ brew install php71

すると、こんなインストールログ。

The php.ini file can be found in:
    /usr/local/etc/php/7.1/php.ini

✩✩✩✩ Extensions ✩✩✩✩

If you are having issues with custom extension compiling, ensure that
you are using the brew version, by placing /usr/local/bin before /usr/sbin in your PATH:

      PATH="/usr/local/bin:$PATH"

PHP71 Extensions will always be compiled against this PHP. Please install them
using --without-homebrew-php to enable compiling against system PHP.

✩✩✩✩ PHP CLI ✩✩✩✩

If you wish to swap the PHP you use on the command line, you should add the following to ~/.bashrc,
~/.zshrc, ~/.profile or your shell's equivalent configuration file:

      export PATH="$(brew --prefix homebrew/php/php71)/bin:$PATH"

✩✩✩✩ FPM ✩✩✩✩

To launch php-fpm on startup:
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php71/homebrew.mxcl.php71.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php71.plist

The control script is located at /usr/local/opt/php71/sbin/php71-fpm

OS X 10.8 and newer come with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:

  PATH="/usr/local/sbin:$PATH"

You may also need to edit the plist to use the correct "UserName".

Please note that the plist was called 'homebrew-php.josegonzalez.php71.plist' in old versions
of this formula.

With the release of macOS Sierra the Apache module is now not built by default. If you want to build it on your system
you have to install php with the --with-httpd24 option. See  brew options php71  for more details.

To have launchd start homebrew/php/php71 now and restart at login:
  brew services start homebrew/php/php71
==> Summary
🍺  /usr/local/Cellar/php71/7.1.1_12: 344 files, 39.7M

php.ini の場所とか、新しくなってるので要注意。PHP-FPMもデフォルトで面倒みてくれている。いよいよ、PHPApacheの付属のものではなく、自立し始めている感。とはいえ、直近ではまだまだApacheもつかいますと。Apache向けのモジュールはどこにあるかなぁと思って、探すとない。インストールログをあらためてみると、

With the release of macOS Sierra the Apache module is now not built by default

って思いっきり書いてある。

なので、オプションを付けて再インストール。install ではなく reinsall ね。

$ brew install php71 --with-httpd24 

するとこんなインストールログ。Apacheモジュールも入ってるっぽい。

To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php7_module    /usr/local/opt/php71/libexec/apache2/libphp7.so
    
    <FilesMatch .php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

Finally, check DirectoryIndex includes index.php
    DirectoryIndex index.php index.html

The php.ini file can be found in:
    /usr/local/etc/php/7.1/php.ini

✩✩✩✩ Extensions ✩✩✩✩

If you are having issues with custom extension compiling, ensure that
you are using the brew version, by placing /usr/local/bin before /usr/sbin in your PATH:

      PATH="/usr/local/bin:$PATH"

PHP71 Extensions will always be compiled against this PHP. Please install them
using --without-homebrew-php to enable compiling against system PHP.

✩✩✩✩ PHP CLI ✩✩✩✩

If you wish to swap the PHP you use on the command line, you should add the following to ~/.bashrc,
~/.zshrc, ~/.profile or your shell's equivalent configuration file:

      export PATH="$(brew --prefix homebrew/php/php71)/bin:$PATH"

✩✩✩✩ FPM ✩✩✩✩

To launch php-fpm on startup:
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php71/homebrew.mxcl.php71.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php71.plist

The control script is located at /usr/local/opt/php71/sbin/php71-fpm

OS X 10.8 and newer come with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:

  PATH="/usr/local/sbin:$PATH"

You may also need to edit the plist to use the correct "UserName".

Please note that the plist was called 'homebrew-php.josegonzalez.php71.plist' in old versions
of this formula.

With the release of macOS Sierra the Apache module is now not built by default. If you want to build it on your system
you have to install php with the --with-httpd24 option. See  brew options php71  for more details.

To have launchd start homebrew/php/php71 now and restart at login:
  brew services start homebrew/php/php71
==> Summary
🍺  /usr/local/Cellar/php71/7.1.1_12: 345 files, 50.9M, built in 11 minutes 32 seconds

最初に書かれている、

To enable PHP in Apache add the following to httpd.conf and restart Apache:

の通りに、httpd.confを編集しようと、/etc/apache2/httpd.conf を編集しても反映されない。おっかしいなぁと思って、以下のコマンドをたたいてみた。

$ which httpd
/usr/local/bin/httpd

てことなので、/usr/local/etc/apache2/2.4/httpd.conf を編集して無事完了。

メール添付が生き残る道

ビジネス用途でのメールって、何かと添付ファイルをつけたがる。本文に書けばいいことまでメール添付にしたがる。zipにパスワードつけてまで暗号化したがる。

ということで、ダメなITの代名詞っぽい添付ファイルだが、以下の点で用途が残りそう。

セキュアなファイル送信

今どきのGoogleやMSのメールシステムは、送受信が暗号化されている。だからセキュア。

DropBoxやGoogleDriveは、「インターネットに公開しちゃう」リスクがあるけど、メールの受信箱はそうそう公開されない。ということでセキュアなファイル送信の仕組みとしてはまだまだ残りそう。

履歴付きのファイル送信

ちゃんとした会社ってメールのログをとってる。だから誰がいつ送ってきたかってのが辿りやすい。直筆の手紙ほどではないにせよ、履歴がとれている。複数サーバで辻褄もあわせれるから証拠能力が高い。

スマホでファイルの受け取る手段

スマホだと、PCと違って、ブラウザからファイルダウンロードしてフォルダ管理してってことがすごく面倒。だけどメールならどんなファイルでも添付で受け取れる。その後プレビューできるかどうかは、スマホ次第だけど、PDFの添付くらいは見れちゃう。さらにそのメールを転送すれば、スマホからどこかしらにファイルを送信もできる。

機械が受け取る手段としての添付

ガラケー時代のブログも添付ファイルで画像を送っていた。システムもメールの添付ファイルくらいは別にパースできちゃう。

下手すりゃローカルファイルより検索性が高い

お行儀よくないのだけれど、メールの方が時期とメールアドレスで添付ファイルが探しやすいということがある。gmailなら添付ファイルの中まで検索してくれる。まぁ便利。

リードオンリー

メール添付は編集できないのが面倒なのだが、リードオンリーという価値はある。ローカルファイルに置いたあとにリードオンリーにするのって結構面倒。

migration がそんなにありがたくない

RailsというかActiveRecordというか、今どきのモダンなORマッパーには、migrationという仕組みがある。

データベースのテーブル定義を、sql文で作るのではなく、プログラミング言語で定義できる。select や updateがRubyでできるなら、create tableやalter tableもRubyで書いちゃえばいいじゃないという発想。しかも履歴管理ができるから、戻すことも可能。これはユートピア

しかしながらどうも言うほど登場シーンがない。以下のようなケース。

既にテーブルがある

100%Rails完結するならいいんだけど、Javaのシステムが使ってるテーブルの管理画面をRailsで作るとかって、全然ありえる話。その場合って、もうmigration が要らないのです。「有るべき姿」ではないのだが、RDBが事実上のインターフェースファイルみたいになって、サブシステム同士を結びつけているケースもある。ActiveRecordeのモデルの裏方ではなく、もはやRDBがインターフェース。思想としては間違いなんだろうけど、RailsSQLのどっちが「世界共通言語?」って問いに対しては、SQLが勝ってしまう。

デプロイのタイミングと、alter table のタイミングが違う

Rubyのソースで一括管理すると、ソースのリリースとテーブル定義の変更が、「せーの」でできて、超美しいように見える。だけど本番ではなかなかそういうことしない。DBの定義ってソースのリリースよりも前に、テーブル定義をかえーの、ちょっとしたデータ変換をおこないーの、旧ソースでも新ソースでもどっちでも行ける状態にして、新ソースをドーンとリリースという形が多い。

結局ゴリゴリに直でDBをメンテすることになる。

テーブル定義は地味にエンジン依存が激しい

「utf8mb4 migration」 とかでググるといっぱい事例が出てくるんだけど、DBが定義する新しい目(といってもかなり前から実装されているmysqlの型)が、migratiion には長らく対応していなかった。ORマッパーそのものがDBエンジン依存を排除できるのがいいのところなのだが、実際には4バイトUTF8もネット上ではちらほら居ている。いわゆるUNICODE絵文字が保存したかったら、migration 使えない。

大人の読書感想文

Twitter上では時々読書感想文について言及されているのを見かける。読書感想文があるから本がキライになるのだとか、読書感想文で求められていることがわからないとか、基本的には「読み」「書き」の両面で、学校教育に対して不満を持ってる人が多い印象を受ける。

読書感想文のコツみたいなのも流れてはくるが、そのコツにしたがって作られた読書感想文のサンプルをなかなかみない。

大人になって読書感想文を書くとどうなるのかということを実験してみたいと思う。

あたし彼女を読んで

山本ゆうご

ケータイ小説というジャンルがある。ガラケーの時代に流行した。ケータイで書いてケータイで読むというスタイルだ。書き手も読み手も若い。「あたし彼女」は、第3回日本ケータイ小説大賞の大賞をとった作品だ。ケータ小説ブームの終盤である2008年の作品であり集大成といえるだろう。

ケータイ小説は、ちゃんとした小説に比べると、書き手もプロではないことも多く、日本語としてなりたってない点も多い。そもそもケータイのメールやブログでコミュニケーションをとっている延長線上なのだから、無理に小説の体裁を取る必要もない。しかしそれが通じるのは、ケータイでのコミュニケーションが読み書きの中心である若い女性のコミュニティでのみ通じることであり、部外者からは煙たがられている存在だと認識していた。本書もその一つとして色物扱いで読んでみた。想定通り書き出しから作者の知的レベルの低さを感じる。

まず、文章としてなりたってない。文節という概念さえない。「あたし」「アキ」「彼氏?」「まぁ」「当たり前に」「いる」「てか」「いないわけないじゃん」「みたいな」。この調子で文章が進む。小説として読もうとする人を遠ざけている。ケータイ小説という特性上、私小説の体裁が多いのだが、作者の知的レベルさえ疑いたくなる。こうやって、この小説は読者に不快感を与えながら進んでいく。

ケータイ小説と言えば、女子高生くらいが主人公であることも多いのだが、本作品の場合、主人公は23歳の女性であるというところも痛々しい。単に不快な言葉遣いをするというだけでなく、「23歳にもなって」この精神年齢であるということが恐ろしいのである。

基本的には、この知的レベルの低い主人公アキのモノローグで小説は進んでいく。バカなことばかりしている主人公を読者は蔑んで読み進めていく。しかし、アキはある日恋をする。恋をして初めて自分の感情を言葉として出すようにある。そこで初めて、アキの言葉づかいが変わり、この小説自体の文体が変わる。

やられた。

ケータイ小説特有の不自由な日本語」という世間からの印象を逆手にとって、作者も主人公も蔑まれるポジションからスタートするという「演出」だったのだ。携帯小説の歴史の中では一回しか使えない手法だろう。

気がつくと、知的レベルの低い主人公が恋を通じて成長するというストーリーに引き込まれている。主人公のアキは料理だってできなくても作りたいと思えるようなってる。何よりも自分の感情を表現しようとしている。マイナスからのスタートだが、成長しようとする人を相手に私達は応援はせずにはいられない。本作品をまとめてしまうと、下の下の女の子が下の上になるだけのサクセスストーリーなのだが、世界の中のその小さな出来事を部外者である私達が心から応援できるような構成になっている。

アルジャーノンに花束をという小説がある。知的障害をもつ主人公の日記で物語が進んでいく。この作品も、主人公の知的レベルがそのまま日記の文体に現れることで、読者を引き込んでいく。後から見れば、そういう手法を使っているだけなのだが、ケータイ小説という分野で出会ったことで大きく足元を救われた気分だった。

ケータイ小説ブームのピーク時には書店の文芸ランキングの大半がケータイ小説の書籍化であり、横組み左開きの小説が書店にも並んでいた。今では一時のブームは過ぎ去ったが、書き手と読み手が満足する形で売られてはいる。ケータイ小説特有の文体もこなれてきて、読者に驚きを与えるということもなくなってしまった。もはやそういうライトな小説として世間に受け入れられたと言ってもいい。その中で「あたし彼女」は、ケータイ小説という分野が世間には完全には認められてなかった時代のマイルストンとして記録していい。歴史として読んでおくべきだと思う。

最強のフィールド内改行

フィールド内改行って何?

CSVファイルを作っていて悩ましいのが、フィールド内改行。

例えばこんなの

"ユーザーID","ニックネーム","プロフィール"
"tomo1215","ともちゃん","趣味はたべあるき。カワイイもの大好き"
"btspen03","あきちゃん","とにかくBTS大好き
2001line"

3行目の「あきちゃん」のプロフィールがやっかい。プロフィールの中に改行が入ってるから。

CSVの仕様としてはどうよ?

CSVの仕様としては、ダブルクォーテーションで囲まれていれば改行が入っていてもいい。いいんだけど、パースする方がちょっと大変。

エクセルは LF

エクセルはずるいことに、レコード区切はCRLFにしていて、フィールド内改行はLFにしている。だから文字コードレベルでは区別ができる。がしかし、テキストファイルで改行コードが混在するのってめちゃくちゃ面倒。超しんどい。エディタで開いて保存しなおしたらなら、どっちかに統一されかねない。

ファイルメーカーは垂直タブ

垂直タブ(0x0B)というASCIIコードの制御文字がある。エディタによっては、反転したKみたいな化け方をする。Macで昔から有名なファイルメーカーは、垂直タブでフィールド内改行を表現するので、非常にテキストファイルのやりとりがしやすかった。

ただ、この垂直タブ、今ではマイナー。XMLの中にはデータとして保持できなくて、XMLパーサーがエラーを吐いちゃう。超残念。「垂直タブ」って名前からしてフィールド内改行に使っても良い気がする。

完全に独自の文字にしちゃうという案

フィールド内デリミタとして登場しがちなパイプ「|」

そもそも、CSVがカンマ区切であり、フィールド内に何らかのデリミタを用意したいとうケースは有る。よく見るのはパイプ「|」。ただ、ユーザーがパイプを使いたくなったらどうするんだ?って疑問は出て来る。

ユニコード絵文字としてのリターン記号 「⏎」

https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E8%A8%98%E5%8F%B7

TwitterAPIのレスポンスを見ていると、改行コードがCRLFではなく⏎となってるケースがあった。他にもmysqlのフロントエンドツールであるSequelproも、一覧での表示には改行を「⏎」で表現していた。表示上は一行にしたいけど、改行があることを示すときには便利。普段のテキストの中にも出てこなさそう。

デメリットとしては、ASCIIコードにも、SJISにも存在しないのでSJISファイルには保存できない。そしてエクセル向けCSVのデフォルトがSJISなので、エクセル向けのCSVには使いづらい。厳密にはUNICODECSVはエクセル向けに作れるんだけど、取扱が難しい。

ASCII制御記号の中から頑張って探す

垂直タブは、XMLの世界からは葬り去られた制御記号だが、まだ生き残ってる制御記号はある。 例えば、0xA0 (NBSP) が存在する。ASCII制御記号でもあるし、SJISでも存在できる。htmlエンティティとして(&#nbsp;)としても書ける。これもユーザーは入力しない。ただ、普通のスペースとパット見区別できない。見えないというのはかなり厄介。

キリル文字から探す

SJISで存在している、目で見える、めったに使わないということで言えば、キリル文字がある。 「ろしあ」で検索すると候補が出て来る。そして私が新人時代に現場で使っていたフィルド内改行がは「Я」。ヤァと呼ぶらしい。「ロシア文字のRの反対のやつ」と声に出しやすい。「ロシア語の本を作るとき苦労するじゃないですか!」って話もありそうだが、たぶんそのときには、JISのキリル文字は使わないだろう。

キリル文字JIS X 0208にも定義されているので、SJIS以外のインフラ、例えばIBMメインフレームとかでも使える。オフコンでも使えるので、めちゃくちゃ守備範囲は広い。日本国内に限れば万人にやさしい。

個人的な勝手にフィールド内改行代替記号ランキング

  1. Я
  2. 垂直タブ(過去お世話になった)
  3. パイプ(|)
  4. おとなしく、普通の改行で正しくCSVパーサーを使う

以下選外 * nbsp (見えない) * LF (見えないしエディタが混乱する)

接続元のドメイン名×メソッドでアクセス制限するのが楽で効果的

攻撃者が捕まるケース

相変わらずセキュリティの問題は出てきていますが、その犯人ってあっけなく捕まったり捕まらなかったり。一方で携帯で匿名掲示板に殺害予告を書くとあっけなく逮捕されてる。これは、接続元のIPアドレスが分かれば、携帯電話会社に警察が問い合わせて契約者を特定できてしまうため。

携帯電話って比較的本人確認が厳格なので、すぐに足がつく。なので、本当に攻撃をしている人達って、日本の通信会社を使わない。IPアドレスで言えば中国が多い。

じゃぁ接続元を日本に絞ればいいじゃない

日本のIPアドレスはだいたいわかる。そして、.htaccessみたいなところに書いておけばいい。 日本[jp]に割り当てられたIPアドレスの一覧 : ipv4.fetus.jp

ただしこの制限をそのまま入れちゃうと、たまに不便。AndoridのChromeとかは、Googleのプロキシを通してアクセスすることで、通信量を節約している。そうなると接続ができない。ちなみにこの制限で私個人も、GyaOとかスカパーのサービスに接続できなくて苦労した。ただし、それくらい乱暴だけどよく使われている手法ではある。

さらにGoogleクローラーは許可したかったりする。

じゃぁ中国と北朝鮮のみを制限すればいいじゃない

そういうフィルタもある。 krfilter : ipv4.fetus.jp

ただし、.htaccessレベルでドーンと制限しちゃうと、「中国からは拒否してるよ!」ってことが攻撃者にバレちゃう。対策練られやすい。

Location × メソッド × ドメインで絞る

例えば、WordPressではadminのディレクトリは、自分しかアクセスしないのなら、自分が契約しているプロバイダのみに絞る。自分が接続しているプロバイダのドメインは、確認くんとかで見れる。

確認くん

私は今、Biglobeでアクセスしているので、mesh.ad.jp のみを許可すればいい。ドメイン別に許可を与えるのは昔ながらのApacheの機能でもできる。

ミケネコの htaccess リファレンス

固定IPアドレスがあるといいのだけれど、そこまで厳密でなくても、プロバイダ外からのアクセスを防止するだけでも1000倍リスクは減る。

また、ドメインでの制限を加えると、IPアドレスからドメイン逆引きするので、パフォーマンスが落ちる。だからログインにつかうようなPOSTメソッドだけに絞るといいでしょう。ログインが高速である必要はない。あと、攻撃者のIPアドレスって、ドメイン名を持ってないことが多いので、逆引きに時間がかかる。攻撃者のみに嫌がらせもできて一石二鳥。

アプリレイヤーでカバーする方法

Webサーバ自体にドメインの逆引きをやらせるのってインフラ面ではハードルが高かったりする。ログイン周りが一番狙われやすいので、ログインの直前に接続元のチェックを入れるという方法もある。IPアドレスPHPでは、$_SERVER['REMOTE_ADDR']で取得可能。

<?php
echo gethostbyaddr("60.237.175.89"); // => flh1aef089.tky.mesh.ad.jp
require 'resolv'
r =  Resolv::DNS.new(:nameserver => ['8.8.8.8'])
p r.getname("202.225.233.218").to_s # "FLH1Amj218.tky.mesh.ad.jp

これで、ドメインが絞れる。docomoからのアクセスがいいなら、「spmode.ne.jp」で絞ったりする。

大半の日本のプロバイダは、.jpで終わるから、それで判断してもいいけど、ソフトバンクはbbtech.netだったりするので面倒。

アプリレイヤーで、接続元ドメインを把握できれば、ユーザが別プロバイダからログインした時に強く警告を出すというようなことも可能。

まとめ

セキュリティに絶対はないので「何桁リスクを減らせるか」を考える。鍵をガチガチにかけると一般ユーザも不便になる。一方で監視カメラは一発目の犯罪の防止はできないが、「足が付きやすい」ことから、抑止にはなる。ピッキングは防げないけど、ドアにカメラがあるとかなりハードルが高い。

Gmailで水平線<hr>を挿入する方法

そう言えば、gmailで水平線ってどうやって入れるんだろうと思って検索すると、こうなる。

oshiete.goo.ne.jp

  • 教えてgooの検索結果とそのコピーサイトで占められる
  • 回答は「何が仰りたいのかよくわかりませんでした。」
  • それがベストアンサー

上からクリックしていくと、このゴミみたいなベストアンサーが続くのでイライラする。

これが正解。

  • gmailの編集画面はhtmlの直接編集はできない
  • しかし、ブラウザでレンダリング済みの画面からのコピー&ペーストは可能
  • どこかしらのサイトから、水平線をコピー&ペーストで可能
  • 手元のPC上でHTMLファイル作って、ブラウザで開いた結果をコピ&ペーストで実現可能
  • 他にも、テーブルでもコピペすれば表現可能