犬ターネット

Archive : 2018年04月

いつものお願いします

近所にイタリアンのお店がある。こじんまりとしていて落ち着いた雰囲気で値段も手ごろでスタッフも感じがよい。かれこれ7年くらい通っている。

ここのお店でワインを頼むとマスターがボトルを何本か持ってきて「これはタンニンがどうのこうの、こっちは柑橘系の飲み口でかすかになんたらのニュアンスがどうたら」って1本ずつ説明してくれるんだけど、俺はバカ舌だからワインを飲んでも「甘い」「酸っぱい」くらいしかわからないしタンニンとかニュアンスとか言われてもよくわかんねえ…と毎回遠い目をしながら説明を聞いており、恥ずかしさと申し訳なさを感じていた。

そんな中、そのお店でたまたま勧められたワイン、自然派って言うカテゴリーのワインなんだけど、独特な風味があって複雑というか雑味というか…、日本酒でいうとにごり酒的な、ビールでいうとIPA的な、音楽でいうとプログレ的な、前衛?異端?違うかも、でもそんな感じで、バカ舌の俺でも飲んだ瞬間「あ、これは普通のワインじゃねえ」とわかった。うまい。

とにかくその「ワインらしからぬワイン」が気に入ってしまって、お店に行く度に頼んでいたところ、ある日「今日は自然派の赤と白両方ありますよ、どちらにします?」と説明をすっとばしてくれるようになった。最近では「いつものでいいですか?」と聞かれるから、はい、いつものでお願いしますって答えるようになった。わお、これって常連ぽいじゃん。ついに俺も「いつものお願いします」が言えるようになった。ヤッホーイ!

「いつものお願いします」なんて台詞はドラマかマンガの中だけの世界だと思っていたし、仮に言えたとしてもなんか生意気いってんなこいつとか思われそうだけど、40歳を越えてようやく「いつもの」が言えるようになった。まだ少し恥ずかしさもあるけれど。あぁ、自然派ワイン飲みたくなってきた。


MySQL で SSL 接続

MySQL をアップデートしたのでついでに SSL 接続も有効にしてみる。超簡単。

まず mysql_ssl_rsa_setup を実行して各種鍵を生成する。

cd /var/lib/mysql
mysql_ssl_rsa_setup
chown mysql:mysql *.pem

次に SSL 接続用のユーザを作成。いつもの CREATE USER ... 構文に require SSL をつけるだけ。これで準備完了。

mysql -u root -p

> CREATE USER 'ssldbuser'@"localhost" IDENTIFIED BY "ssldbuserpassword" require SSL;
> GRANT ALL PRIVILEGES ON *.* TO ssldbuser@"localhost";

通常ログインすると以下のように拒否される。

mysql -u ssldbuser -p

ERROR 1045 (28000): Access denied for user 'ssldbuser'@'localhost' (using password: YES)

--ssl-mode=REQUIRE をつければOK。

mysql -u ssldbuser -p --ssl-mode=REQUIRE

MySQL 5.7 → MySQL 8.0 に更新した&メモ

MySQL 5.7.22 → MySQL 8.0.11 にアップデートしたときのメモ。OS は CentOS 7、MySQL は yum で入れている。

まずはバックアップ用の dump ファイルを作成。失敗したら 5.7 を再インストールしてこのファイルからリストアする(何度も失敗した…)。

mysqldump --all-databases -u root -p > dump_all

次に mysql を停止。

systemctl stop mysqld

mysql のレポジトリの参照先を変更する。まずはどのリポジトリが有効になっているか確認。

yum repolist all | grep mysql
…
mysql55-community/x86_64           MySQL 5.5 Community Server       無効
mysql55-community-source           MySQL 5.5 Community Server - Sou 無効
mysql56-community/x86_64           MySQL 5.6 Community Server       無効
mysql56-community-source           MySQL 5.6 Community Server - Sou 無効
!mysql57-community/x86_64          MySQL 5.7 Community Server       有効:    267
mysql57-community-source           MySQL 5.7 Community Server - Sou 無効
mysql80-community/x86_64           MySQL 8.0 Community Server       無効
mysql80-community-source           MySQL 8.0 Community Server - Sou 無効

mysql57-community が有効になっているので yum-config-manager を使って mysql80-community に変更。

yum-config-manager --disable mysql57-community
yum-config-manager --enable mysql80-community
yum repolist all | grep mysql
…
mysql55-community/x86_64           MySQL 5.5 Community Server       無効
mysql55-community-source           MySQL 5.5 Community Server - Sou 無効
mysql56-community/x86_64           MySQL 5.6 Community Server       無効
mysql56-community-source           MySQL 5.6 Community Server - Sou 無効
!mysql57-community/x86_64          MySQL 5.7 Community Server       無効
mysql57-community-source           MySQL 5.7 Community Server - Sou 無効
mysql80-community/x86_64           MySQL 8.0 Community Server       有効:     17
mysql80-community-source           MySQL 8.0 Community Server - Sou 無効

そして更新。

yum update

更新完了したら mysql を起動し、mysql_upgrade を実行。

systemctl start mysqld
mysql_upgrade -u root -p

アップグレードが正常完了して一般ユーザで接続して正常にクエリ実行できればOK。

[追記:2018/10/22]
ちなみに、マイナーバージョンアップデート時も mysql_upgrade を実行したほうがよさそう。8.0.12 → 8.0.13 にアップデートしたら以下エラーログが出力されていた。 mysql_upgrade で解決。

[ERROR] [MY-013142] [Server] Column count of mysql.user is wrong. Expected 50, found 49. Created with MySQL 80012, now running 80013. Please use mysql_upgrade to fix this error.

PHP から接続してみたところ、以下エラーが発生した。

SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developers

明示的に文字コードを設定してあげないとダメっぽい。/etc/my.cnf に以下2行を追加。

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4

mysql再起動後に再度接続したら今度は以下のエラーが発生。

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

旧mysqlと新mysqlで認証方式が異なるためのエラーになってしまうみたい(参考)。/etc/my.cnf に以下を追加して認証方式を mysql_native_password に設定。

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
default_authentication_plugin=mysql_native_password

mysql再起動後、PHPから正常に接続できたことを確認。ふう。


余談。上記で

collation-server = utf8mb4_unicode_ci

を設定しているけれど、この設定ではSQLを投げたときに「バンド」「ハント」を区別しないため検索結果がおかしくなる。きちんと区別するためには以下を設定したほうがよい(参考:MySQLの文字コードとCollation)。

collation-server = utf8mb4_general_ci

追記:日本語環境であれば、ひらがなカタカナを区別できる以下を使ったほうがよい(参考)。

collation-server = utf8mb4_ja_0900_as_cs_ks

余談。8.0 からクエリキャッシュがなくなった。

MySQL 8.0 : クエリーキャッシュのサポート終了 | Yakst

そのため、/etc/my.cnfquery_cache_type=1 などと書いてあると以下のようなエラーが出て MySQL が起動しないので注意。

[ERROR] [MY-011071] [Server] unknown variable 'query_cache_type=1'

拘束、ダメージ、ジャンク、コピーバンド

週末の日記。

土曜

夕方から保護者会。年度初めの保護者会は総会も兼ねているから長時間拘束される。3時間床に座っていたら腰にきた。もっと短縮できないかなあ。事前にレジュメを配って当日は各内容について反対がなければ承認、という形にすれば10分くらいで終わる気がする。あー腰が痛い。

日曜

フルマラソンから1週間、足の痛みもほとんど治まったから久々にランニングをしてみたら、1キロも走らないうちに右ヒザに痛みが…。全然走ることができなかったから50分ほどウォーキングをしてから帰宅。自分が思っている以上にマラソンのダメージが体に残っているみたい。しばらくランニングは控えよう…。

夕方から妻と娘がでかけてしまい久々にひとり。ひとりといえばジャンクな夕食。ということで100円のカップラーメンとスーパーで買ってきたあんドーナツを食べた。うまい。ひとりのときは食事ではなくエサって感じ。お腹が満たされればなんでもいい。

6月にコピーバンドでライブをやることになった。コピーバンドは見た目が重要だからもうちょっとスリムになろうと思う。ということで今日からライブまで間食禁止&筋トレ。まずはスクワット20回+腕立て伏せ20回から。5キロくらい痩せたらいいな。そんでペトロールズの人↓みたいになるぞ。


MySQL の FULLTEXT インデックスを使ってブログの全文検索を作った

ブログの全文検索を作った↓

実装は MySQL の FULLTEXT インデックスを利用。現時点では全エントリー合わせても1400件弱だし LIKE 検索でもよさそうだけど勉強がてら作ってみた。以下作るまでの手順。


このサイトのブログテーブルは以下のような構成になっている。

CREATE TABLE entry (
  id int(11) PRIMARY KEY,
  title text,
  contents text,
  created datetime,
  ... 

通常は同じテーブルに FULLTEXT インデックスカラムを追加するようだけど、検索用のテーブルは別にしたほうが将来的に管理が楽そうだから新たに検索用テーブルを作った↓

create table entry_search (
  id INT(11) PRIMARY KEY,
  title text,
  contents text,
  FULLTEXT (title,contents) WITH PARSER ngram
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

その後、元のテーブルから検索用テーブルへデータインポートする簡単なプログラムを作って実行。ざっくり以下のような感じ。これでデータ作成完了。

次に検索。検索は以下のようなSQLを実行する必要がある。

SELECT id,title
FROM entry_search
WHERE MATCH(title, contents) AGAINST ('ラーメン' IN BOOLEAN MODE)

検索モードは IN NATURAL LANGUAGE MODEIN BOOLEAN MODE の2種類があるけれど、BOOLEAN MODE のほうが検索結果が正確になる。

BOOLEAN MODE では検索演算子が使えるから、例えば ラーメン 値段 で検索したら +ラーメン +値段 のように AND 演算子を追加して検索を行いたい。しかし、PDO::bindValue を使うと意図した結果にならなかった。仕方がないので PDO::quote を使ってクオートした文字列をSQL文に直接を埋め込むという問題ありな手法にしている…。この辺りみんなどのように実装しているんだろう…。

とりあえずしばらく様子見。


検索時の単語の最小長を設定するには /etc/my.cnf に以下を記述後、mysqld を再起動する(参考)。

innodb_ft_min_token_size = 1

NGINX Unit (PHP) を起動するまでメモ

NGINX Unit が正式リリースされたので ドキュメント を読みながら PHP を動作させるまでのメモ。環境は CentOS 7。

まずは /etc/yum.repos.d/unit.repo を以下の内容で作成。

[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

yum install unit unit-php を実行してインストール。

確認用PHPファイル /home/mgng/www_unit/index.php を以下内容で作成。

<?php phpinfo();

設定ファイル /etc/unit/unit.conf を以下の内容で作成。

{
  "listeners": {
    "*:8300": {
      "application": "unittest"
    }
  },

  "applications": {
    "unittest": {
      "type": "php",
      "processes": 20,
      "user": "mgng",
      "group": "mgng",
      "root": "/home/mgng/www_unit",
      "index": "index.php"
    }
  }
}

以下コマンドで起動。CentOS 7 なので systemctl を使うべきだろうけれど、loadconfig の指定ってどうやるんだろう。

service unit start
service unit loadconfig /etc/unit/unit.conf

http://localhost:8300/ アクセスで phpinfo が表示されればOK。現時点ではPHP5.4。現時点で PHP 7 を使うにはソースからビルドするしかなさそう。


人生初フルマラソン

土曜日に人生初フルマラソンしてきた。場所は戸田にある彩湖。いろいろ箇条書き。

  • 40キロくらい余裕だろと思っていたんだけど考えが甘すぎた
  • 15キロを超えたあたりで右ヒザが痛くなりペースダウン
  • それでも最初の20キロはがんばって走ったけれど、残りの20キロはほぼ歩き
  • ヒザが痛すぎてリタイヤしようと思ったけれど、給水所のドリンクと食べ物が超充実していて(次の周でおにぎり食べるまで頑張ろう)(次の周でグレープフルーツ食べるまで頑張ろう)というのがモチベーションになった
  • コーラがうますぎた
  • グレープフルーツがうますぎた。累計5個くらい食べた
  • 坂道むかつく
  • マンホールのちょっとした凹凸むかつく
  • 足だけじゃなくて腕も疲れる。指先の毛細血管?がピリピリしていた
  • 30キロくらいからおばあちゃんランナーと併走していた。おばあちゃんがペースメーカーだった。おばあちゃんありがとう
  • 足裏で地面を蹴るのを意識したらヒザの痛みが軽くなった
  • 足裏を使いすぎてふくらはぎがパンパンになったから今度は太ももの筋肉を意識して走った
  • 足を動かす行為に頭を使うのってなんか変な感覚だった
  • 歩いてもヒザの痛みは消えないし走りだすのが億劫になるだけ、ということに35キロくらいで気づいた。それ以降はとにかく歩かないようがんばった
  • 残り1周になって思ったのは「はやく帰りたい」

もともとはバンドのために始めたランニングだったけれど、3年の時を経てフルマラソンに辿り着いてしまった。人生どう転ぶかわかない。マラソン自体は全然楽しくなかったしつらかったんだけど、体を痛めつけるとどうなるかってのがよくわかったし、目標タイムには届かなかったけれど完走できたのは自信につながった。いい経験ができたと思う。

が、しばらくマラソンはいいや…。


左足に違和感

ちょっと調子にのって10キロランニングを繰り返していたら左ひざに痛みと左太もも裏あたりに張りが。ちょっと痛いから変な歩き方をしていたら今度はでん部らへんにも張りが…。踏んだり蹴ったり…。

明日は人生初フルマラソン。こんなんで大丈夫だろうか。ストレッチしてはやく寝よう。目標は完走。無理はしない。


会社のエレベーター

会社が入っている雑居ビルにはエレベータが2基あるんだけど、オンボロのせいか月に2回くらいメンテがはいって使えないことがある。いい加減どうにかなんないかなあと思っていたら、ようやく本腰挙げて改修工事を始めるらしい。

まずは外見からってことで今は壁をはがしている最中なんだけれど、なんかかっこいいからこのままでいいのでは。コンクリートの十字架。


プログラムの価格

友人・知人からプログラミングについての相談や開発を頼まれることがあって(ありがたいです)、その場合は基本タダで対応する。

自分のスキルアップにつながるし、友人知人はお客さんと違って正直なレスポンスがもらえて嬉しいし。あと友人からお金はとれないよな。

ただ、正式な仕事として依頼した場合にどの程度のお金が発生するかってのは、今後伝えていこうかなと思っている。アウトソーシングしたときにすごく高くてびっくりする場合もあるし、安く安く請け負っていくと価格破壊がおきてこの業界で生きていくのが辛くなりそうだから。


gracenote API に繋がらなくなったときに行う手段

以下を行う。

以下、上記手順に辿り着くまでのメモ。


gracenote API から以下メッセージが返されるようになった。

GCSP: Hello error: [130] Please contact Gracenote ODP JP 数字 [Name: 名前] [App: APP名] support.

これ、去年も喰らったから新しくアカウント取り直して別アプリで登録しなしたんだけど、今年も喰らってしまった。

規約上、アプリの有効期限は登録後から1年間。その前に延長申請を行わなければいけないんだけど、どこから申請するのかさっぱりわからない。gracenote に直接問い合わせても「サポートフォーラムから申請してください」という返事だけ。そのサポートフォーラムの URL がわかんねえんだよ!!!!

ふと迷惑メールフォルダを確認すると、先月末に Gracenote から以下のメールが来ていた。あぶねー、もうちょっとで消えるところだった…。

If you would like to continue using our APIs in your app, please take a moment and visit https://developer.gracenote.com/gracenote-developer-license-renewal-form and login to your developer account, where you will find a license renewal form to extend your license for free.

とりあえず上記フォームから延長申請をお願いした。大丈夫だろうか…。

大丈夫だった!1日くらい経ったらちゃんと使えるようになっていた!よかったー


PHP の COM クラスを使って PowerPoint ファイルのスライドに文字列を挿入するサンプル

Windows 環境の PHP で COM を使えば、Word, Excel, PowerPoint なんかを操作できることができる。試しに PowerPoint の各スライドに文字列を挿入するコードを書いてみた。

https://gist.github.com/mgng/75ee5753d6c5b38adcc585f6ed7c1d60

もとのファイルが これ、プログラム実行後のファイルが これ。どちらもPDFにしてある。

基本的には MSDN からメソッドやプロパティを探して PHP のコードに置き換えていけば動く。ただし定数はPHP側では未定義なので、直接数値指定するしかない(msoTextOrientationHorizontal → 1 とか)。


週末の日記(スタジオとリメンバーミー)

週末の日記。

土曜

久々の mugbum スタジオ。

今回の練習からクリックを導入。今まで雰囲気で演奏してた部分が全然合ってないことがわかりめちゃくちゃいい練習になった。最終目標はクリックなしでも脳内クリックが鳴ること。そしたら前ノリ・後ノリ・リタルダンド・アッチェレランドとかスムーズに理解できるかもしれない。四十路にして意識高い目標ができた。がんばろう。

スタジオのホワイトボードに各楽曲のテンポをメモっていたんだけど、テンポ表記って8分音符じゃなくて4分音符では…ははは…。

mugbum とは別バンドの練習もした。こっちのバンドではギターに専念。エフェクターが結構多め。ワウがあるとついつい踏んじゃってよくない…、でも楽しい。

練習後はみんなで世界の山ちゃん。いい一日だった。

日曜

娘と映画「リメンバーミー」を観にいった。最後らへんは涙がとまらなかった。映画館を出た後も思い出しては泣くを繰り返した。娘に「パパすげー感動したわ、泣いたよ」と話したら娘も「わたしも涙出た。感動したよね」とのこと。娘が映画を観て泣くのは初めて?な気がする。

昔は感動して泣くことが恥ずかしいものだと思っていたんだけど、もう我慢しないでバンバン泣くことに決めた。いい映画だったなあ。

その後はハンバーガーを食べ、本屋をのぞき、服屋をひやかして帰宅。これはもうほとんどデートだと思った。娘超かわいい。いつまでパパに付き合ってくれるだろうか。いい一日だった。


iPhone でマルチトラックレコーディングできたらいいのに

iPhone にマルチケーブルを繋げられて、GarageBand でマルチトラックレコーディングができるようになったらいいなあ。iPad だとできたりしないかな。


調べたら、GarageBand側は対応しているらしい!!

複数のオーディオトラックに録音する, GarageBand ヘルプ

iPhoneにくっつけるオーディオインターフェースが複数チャンネルさせるものがあればイケるのでは!!!


iPhone, IPad に繋げて使えるオーディオインターフェースを見つけた。値段は30,000円弱、これがあればいける…か?

Steinberg 6 x 4 USB 2.0 オーディオインターフェース UR44


柔軟剤の香りがキツい

会社の後輩の服から香る柔軟剤のニオイがキツい。柔軟剤じゃなくてアロマジュエルみたいに敢えてニオイをつけるやつかもしれない(※過去にアロマジュエルの試供品を使ったことがあるんだけど、とにかく臭くて何度も洗いなおした。3日くらい臭かった)。とにかくキツい。気持ち悪くなる。通路をはさんで隣の隣の席に座っていて3,4メートルくらいは離れているのにこっちまで匂って、否、臭ってくる。彼の周りに座っている人たちは平気なのだろうか?

家族や親友であれば「ちょっとキツくない?」とか言えるんだけど、会社の後輩だしズケズケ言ってモラハラだとかなったら嫌だし。ニオイ問題ってどうやって解決していいかわからん。匿名で手紙でも書いて彼のデスクの上に置いておこうか、面と向かって言えないからメールでこっそり伝えようか…、うぅぅぅ