ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

Mac移行アシスタントを使って移行したらネットに繋がらなくなった時の対処

※ ESETが原因の場合の話になります。ESETをインストールしていない人は原因が違うので別の記事を探しに行ったほうがよいです。

Mac移行アシスタントを使ってMacを移行したところ、移行後のPCでESETを起動したら「Rosetteをインストールしろ」と怒られる。 インストールしようとしたところ「インターネットに接続されていません。やり直してください」と怒られる。

但しインターネットに接続できない原因はESETなので、アンインストール使用にもアンインストーラーにもRosetteが必要という始末。 一見詰んだように見えますが、一応回避できます。

  1. 一旦ログアウトないし再起動する
  2. ESETは起動せずに設定を開く
  3. ネットワーク > VPNとフィルタ > フィルタとプロキシ と進み、ESET Firewall、ESET Network... を両方無効にする
  4. コマンドでRosetteをインストール(この時点でESETを起動して、GUIでrosetteをインストールしても多分問題ない)
  5. ESETを起動し、権限周りを設定して再起動

と言った手順になります。 移行元のPCからESETをアンインストールして再度移行をやり直す、といった形で解決している記事も見かけましたが 数時間待つのも苦痛なので上記方法を試してみると良いかもしれないです。

Mac移行アシスタントを使って移行したらネットに繋がらなくなった時の対処

※ ESETが原因の場合の話になります。ESETをインストールしていない人は原因が違うので別の記事を探しに行ったほうがよいです。

Mac移行アシスタントを使ってMacを移行したところ、移行後のPCでESETを起動したら「Rosetteをインストールしろ」と怒られる。 インストールしようとしたところ「インターネットに接続されていません。やり直してください」と怒られる。

但しインターネットに接続できない原因はESETなので、アンインストールしようにもアンインストーラーにもRosetteが必要という始末。 一見詰んだように見えますが、一応回避できます。

  1. 一旦ログアウトないし再起動する
  2. ESETは起動せずに設定を開く
  3. ネットワーク > VPNとフィルタ > フィルタとプロキシ と進み、ESET Firewall、ESET Network... を両方無効にする
  4. コマンドでRosetteをインストール(GUIでもいけるかもしれない)
  5. ESETを起動し、権限周りを設定して再起動

と言った手順になります。 移行元のPCからESETをアンインストールして再度移行をやり直す、といった形で解決している記事も見かけましたが 数時間待つのも苦痛なので上記方法を試してみると良いかもしれないです。

MySQL ShellでダンプされたデータをMySQLにロードするときに頻繁にロック待ちのタイムアウトが発生する場合の対策

MySQLのデータをダンプして、別のMySQLサーバーに移す機会が合ったので、MySQL Shellの機能を使ったところインポート時に度々エラーで止まってしまったため備忘録として記録。 8スレッドで並行処理をしていたところ、70%くらい終わったところで下記エラーが頻発

scheme@tablename@17.tsv.zst: MySQL Error 1205 (HY000): Lock wait timeout exceeded; try restarting transaction: LOAD DATA LOCAL INFILE ~~~~

なんぞロックする要素なんかあるのか?と思っていたものの、スレッドが一つでも止まると一旦各スレッドの処理が完了すると全てが止まってしまうので放置できなくて困る。 というわけでエラーが起きるのは決まって特定のテーブルだったので、それらの共通項目を洗い出してみる。

  • 200万レコード以上あるでかいテーブル
  • 複合ユニークインデックスがある

なんとなく察せられる。 ノリノリで8スレッドで走らせていたが

  • 終盤はでかいテーブルだけが残るので、同一テーブルに複数スレッドで処理をしようとする
  • 複合ユニークインデックスがあるので、各スレッドは同一テーブルの別のスレッドの処理が終わるまで待つ必要がある
  • タイムアウトする

というオチ。 なので、該当するようなテーブルが存在する場合は

  • エラーが出るまでは複数スレッドで並行処理
  • エラーが出始めたらスレッド数を減らす or 諦めて1にする
  • 放置する

という形で対応しました。

PHPSpreadSheet で getRowIterator, getCellIterator を使って getFormattedValue で値を取得すると Formatted されない

結論: getCell()->getFormattedValue() を使う場合は、すぐ使う。Cellを変数に格納してから、別のCellを getCell() してしまうと、Formatのデータは一番最後に呼び出されたCellのものになる。

業務ツールでありがちな、Excelからデータをインポートするみたいな機能を作っている時に困った現象が起きた。
日付の値をCellから取得したいのだけど、書式的には yyyy年mm月 みたいな書式や yyyy年mm月dd日 みたいな書式の両方が入ってくる。
そのため Date::excelToDateTimeObject() で取ってしまうと、必ず日付まで入ってしまうため、月のみのセルなのか日まで入っているセルなのかの区別がつかない。
getFormattedValue() を使えば、書式を反映したデータが取れるはずだけども、getRowIterator() , getCellIterator() を使って取得すると書式が無視される…。

調べて見ると、getRowIterator() 経由で取得したCellの getStyle()->getNumberFormat()->getFormatCode() の結果は全て 一般 になってしまっている。
普通に getCell()getFormatCode() を使用した場合は、セルに指定された書式が入っている。
ReadersetDataOnly(false) にしてもだめ( ˘ω˘).

getRowIterator() を使うのをやめ、getHighestDataRow() で最終行を取得し for で回しながら getCell() を使って見たがだめ。
どうやら、Format情報は最後に呼び出されたCellのものが使用されるっぽい。

<?php

$cell1 = $sheet->getCell('A1'); // Format → テキスト
$cell2 = $sheet->getCell('B1'); // Format → 日付

$cell1->getFormattedValue(); // 日付フォーマット扱い
$cell2->getFormattedValue(); // 日付フォーマット扱い

みたいになる。悲しい。
そんなわけで、Formatを適用した値が欲しい場合は、getCellIterator()rangeToArray() を使ってはいけない。ゴリゴリ書くしかない。

Nginx で URL が長いとERR_CONNECTION_CLOSED になる対策

414 URL Too Long じゃなくて、接続が切られてしまう場合はおそらくhttp2が有効になっている。

Chrome とかだと 「このサイトにアクセスできません」「 xxx.com により途中で接続が切断されました。」みたいな表示になる場合は http2_max_field_size とか http2_max_header_size の上限に引っかかている。 そんなわけで、server ディレクティブ で上限を引き上げれば解決。

    http2_max_field_size 16k;
    http2_max_header_size 32k;

みたいな感じに引き上げる。 POSTにすればいいじゃない、と思うけど大人の事情でどうしても長いURLをGETで受けたいときとかもある・・・はず。

エレコムの5ボタンマウスをMacで使う

マジックトラックパッドやら色々つかって一周回って安物5ボタンマウスにもどってきました。 エレコムのマウスには「エレコム マウスアシスタント」というユーティリティがあり、これで5つあるボタンに機能を割り当てられます。 親指の位置に当たる、ボタン4,ボタン5にはブラウザの「戻る」と「進む」を割り当てたのですが、これが上手く動作しない。

Cmd+[ と Cmd+] を割り当てようとしているのが Cmd + / Cmd + [ と割り当てられてしまっているようだ。

あー・・・JISキーボードが前提なのかぁ・・・

ということで、任意キーを割り当てるようにして、ボタン4に Cmd + @、ボタン5に Cmd + [ を割り当てることで解決。 英字キーボードでもちゃんと対応してほしいなぁ

Trelloが日本語変換確定のEnterでカードが作成されてしまう対策

※ 2019/05/10 追記 直ったようです

原因はよくわかっていないけれど、MacWebKit系のブラウザで表題のような現象が起きている。
(つまりChromeSafariFirefoxなら平気)
デスクトップアプリ も大丈夫なようです。コメントで教えていただきました。(2019/05/08追記)
※ デスクトップアプリも同様の現象が発生するようになってしまったようです・・・。
正確にはカードが作成されるのではなく、Enterイベントが発火してしまうっぽい。詳細画面のタイトルや、チェックリストアイテム欄とかでも同様のことが起きる。(なぜかチェックリスト作成では平気)
underscore.js のイベントのうち、いくつかをremoveしてみると発生しないので該当のイベントだけ消してみようかとしたけど別なところでやっぱり不具合が起きるので断念。
結局、window.keydown で 日本語入力のキーコード(229)の場合は全てのイベントを殺すことで回避するというパワープレイで解決(?)。
userscriptでやろうとしたら、該当ページのjqueryオブジェクトやイベントにアクセス出来なかったので、tampermonkey経由で実行。

一応手順を残しておくけれども、もし使う人がいたらゴリゴリのパワープレイなので自己責任でお願いいたします。
(Trello側の修正が入ったら、このScriptは無効にすることをおすすめします)

  1. tampermonkeyをダウンロード
    chrome.google.com
  2. 以下のスクリプトを追加
// ==UserScript==
// @name         FixTrello
// @namespace    http://shinbashi.hatenablog.com/
// @version      0.1
// @description  Fix trello enter bug
// @author       shinbashi
// @include    https://trello.com/*
// @grant        none
// ==/UserScript==

$(function(){
    window.addEventListener('keydown', (e) => {
        if (e.keyCode === 229) {
            e.stopPropagation();
            e.preventDefault();
        }
    }, true);
});

3 Trello開いてたらリロード