ひらい ぶらり Hi-Library

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

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開いてたらリロード

Scootman S8 と V6 レビュー

Scootman V6 を愛用して1年とちょい位通勤に使っていたのだけれども、いい感じにトラックにドツかれて公道はしれなくなったので修理に出すことに。 結果、修理に出すまでの間に充電を怠っていたのが災いして、バッテリーがおしゃかに。その他の修理費用を合計するといい感じにお値段になってしまった。 そんな中、修理を依頼してScootmanJapanは諸々コミコミで値段を抑えたS8のオファーを出してくれたのでそれに乗っかることに。 バッテリーが空輸できないので船便になったり、クリスマスや年末年始で関税で止まったり、運送業者と連絡がつかず通関後のステータスが不明になりましたがようやく届きました。

AK-1がな!

AK-1とは、ScootmanのOEM元のマシンで、CHANSONという会社が製造している。 それのエンブレムとステッカーを差し替えて日本向きにはScootman S8として売ってるわけなんですが おもくそ CHANSON AK-1 ってエンブレムのままでした。

まぁ、走行には影響ないのでいいんですけど。 バッテリーが不良なのか、最高速度が20km/hしかでてないのは困ってます。 リチウムイオンバッテリーは活性化させる必要がないし、ギア(単純な速度制限機能?)による変速も一定の割合で減速してるので、なんかどこかに抵抗が挟まてってる感じ。 最高速度30km/hの原付きにスピードリミッターが付いてる気もしないし、原因はなんじゃろ・・・。 追記:スピードリミッターがついていたので、ニッパーで切ったら30km/h弱でるようになりました。ただ30km/hはでないんだよなぁ・・・( ˘ω˘)

そんなわけで、V6とS8両方に乗ってみて、せっかくなのでそれぞれ所感をば。

V6

タイヤ:S8に比べると太め。安定感あり。 ハンドル:折りたたみ時に真横にするため、90度まで曲がる。狭い場所だとこのありえない角度のハンドリングが便利だったりする。 足置き:かなり後方にあるので、ちょっと変な角度で乗ることになる 折りたたみ:手動。自立するけど、ちょっとぶつかったり強風で倒れかねないレベルの安定感。 充電:取り外し不可。折りたたみ時充電不可。 全長:S8よりは短い。 ミラー:しょぼい。調整し辛い。ネジで止まっているため、転倒でもしようものなら1撃でネジ穴が馬鹿になる。 ナンバープレート:よく緩む。一回走行中に外れたことに気づかずナンバーをなくした。 見た目:不思議 鍵:物理+リモコン

という感じで、不満点はいろいろあったけど便利は便利でした。

S8

タイヤ:細くなった。怖い。 ハンドル:45度くらいまで?90度曲がらなくなった。普通になったといえば普通になった。 足置き:いい感じの場所にある。 折りたたみ:自動。安定感あり。ただし、うるさいし遅い。当然バッテリーが装着されてないと折り畳めない。そして折りたたむとバッテリーは外せない。手動でよかったんだけどなぁ。 充電:取り外し可。ただし、フックの部分がしょぼいのでそのうち折れそう。折りたたみ中は充電も取り外しもできない。不便。 全長:V6より少し長くなった。ハンドル幅も長くなったので、運転中はいいけどしまうとき邪魔。 ミラー:いい感じ。調整しやすい。 ナンバープレート:きちんとロックできるようになった。安心。 見た目:オサレ 鍵:リモコンのみ

とまぁ、改善された点もあったけど、そのままでよかったのに・・・という点も変わってしまった感じ。 目下最高速度が20km/hというのが不具合なのかどうかが一番の問題。 自転車に抜かれる悲しさ。 バッテリー外せる!これで置き場所が選べる! と思ったけど、これが電動自電車のように気軽に外せる感じではなく、結構慎重かつ力を込める必要があるので結構だるい。 あとほんとタイヤ細い。怖い。 なにより、物理キーが無くなってしまったので、電源を切る度に「ピュイピュイ!」ってけたたましい音がなる。 近所迷惑なので勘弁してほしい。

設定ボタンとギア変更ボタンを同時に長押しすると謎のモードに入って項目が20個位変更できたけど、マニュアルがないと何の項目なのかわからない。 いじりたい気持ちでいっぱいだけど壊すのもあれなので現在検討中。

3週間で届く、と言われたものが2ヶ月近くかかったり、ScootmanじゃなくてAK-1だったり、関税のことが後出しだったりと 丁寧ではあったけど対応がガバガバだった。 おかしな点を聞けばきちんと対応策を教えてくれるけど最初からやっておいてほしかった感はある。 市場の価格よりは遥かに安いオファーだったので仕方ないといえば仕方ない。

おわり

Illustraorで出力したSVGがTCPDFでスタイルが正しく反映されない

おはよーこんちわーこんばんわーおやすみーおきてー! しんばしです。

結論:出力時に「スタイル属性」を指定して、インラインでスタイル属性を埋め込めばよさそう

以下経過

タイトルの通り、Illustraorで出力されたSVGをTCPDFでPDFに埋め込んだところ 「画像が潰れて、全部真っ黒になっちゃうんだけど」 とのこと。 調べてみたトコロ、パスは正しく出力されているので、どうもスタイルが反映されずに白色の指定が無視されてしまって真っ黒になっている模様。

手持ちの「Graphics」で貰ったSVGを再出力したところ正しくPDFに埋め込まれたので、2つのSVGを比較したところ

  • 失敗する方のSVG
    • style要素でcssが指定され、classで参照していた
  • 成功する方のSVG
    • 各要素にインラインでcssが指定されていた

という違いを発見。どうもTCPDFはclassの参照がうまくできていないっぽい

そんなわけで、Illustraorでどんな設定にしているのか見てみた。 スタイルの項目をみたところ「スタイル要素」になっていて、ここを「スタイル属性」に変えるとインラインで出力される模様。

以上。とてもニッチな内容でした。