2018年 07月の投稿を表示しています

MySQL (MariaDB) のスローログを出す設定をする

インデックスつかってる?やばない?みたいなクエリを調べたいので、スローログで出せた気がするなあ、ってメモ。

スローログに関する設定の確認

> show variables like '%slow%';
+---------------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name       | Value                                                                                                        |
+---------------------+--------------------------------------------------------------------------------------------------------------+
| log_slow_filter     | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
| log_slow_queries    | OFF                                                                                                          |
| log_slow_rate_limit | 1                                                                                                            |
| log_slow_verbosity  |                                                                                                              |
| slow_launch_time    | 2                                                                                                            |
| slow_query_log      | OFF                                                                                                          |
| slow_query_log_file | 522d4fac608d-slow.log                                                                                        |
+---------------------+--------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
> show variables like '%long%';
+---------------------------------------------------+-----------+
| Variable_name                                     | Value     |
+---------------------------------------------------+-----------+
| deadlock_search_depth_long                        | 15        |
| deadlock_timeout_long                             | 50000000  |
| long_query_time                                   | 10.000000 |
| max_long_data_size                                | 1048576   |
| performance_schema_events_waits_history_long_size | 10000     |
+---------------------------------------------------+-----------+
5 rows in set (0.00 sec)
> show variables like '%log_queries%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF    |
+-------------------------------+-------+
1 row in set (0.00 sec)
> show variables like '%output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)

log_slow_queries と slow_query_log がいてオッ?と思ったが slow_query_log を使うのが正しいらしい。

profiling - Mysql: What is the difference between "slow_query_log" vs "log_slow_queries" - Stack Overflow

 

その他の設定値はフィーリングで大丈夫(ダメ)
このあたりで説明は補完できる。

MySQL :: MySQL 5.7 Reference Manual :: 5.1.7 Server System Variables

スローログの設定と動作確認

set global slow_query_log = ON;
set global long_query_time = 1;
set global log_queries_not_using_indexes = ON;
set global log_output = 'TABLE';

log_output を TABLE にすると mysql.slow_log テーブルに出る FILE にするとファイルに出る。

まずは TABLE にした場合

> use hoge;
> select * from users where nanika_id = 1;

> use mysql;
> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)

> select * from slow_log;
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+-----------------------------------------+
| start_time                 | user_host                 | query_time      | lock_time       | rows_sent | rows_examined | db   | last_insert_id | insert_id | server_id | sql_text                                |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+-----------------------------------------+
| 2018-07-19 05:08:05.999111 | root[root] @ localhost [] | 00:00:00.003893 | 00:00:00.002550 |         0 |             0 | hoge |              0 |         0 |         0 | select * from users where nanika_id = 1 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+-----------------------------------------+
1 row in set (0.00 sec)

> use hoge;
> explain select * from users where nanika_id = 1;
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | users | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

次に FILE の場合。

$ pwd

/var/lib/mysql


$ tail 522d4fac608d-slow.log

# Time: 180719  5:33:26
# User@Host: root[root] @ localhost []
# Thread_id: 3  Schema: hoge  QC_hit: No
# Query_time: 0.000337  Lock_time: 0.000141  Rows_sent: 0  Rows_examined: 0
SET timestamp=1531978406;
select * from users where nanika_id = 1;

slow_query_log_file で指定した場所に出る /var/log/mysql/... みたいな指定をする必要がありそう。

インデックスを使用していないクエリも出してくれる、便利。

そのほか

set global しただけだと mysql サーバーを終了したときに設定が消えてしまうので、必要に応じて my.cnf に記載。

[mysqld]
slow_query_log=ON
long_query_time=1
log_queries_not_using_indexes=ON
log_output=FILE
slow_query_log_file=hogehoge-slow.log
$ echo 'show variables like "%slow%";' | mysql

Variable_name	Value
log_slow_filter	admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
log_slow_queries	ON
log_slow_rate_limit	1
log_slow_verbosity
slow_launch_time	2
slow_query_log	ON
slow_query_log_file	hogehoge-slow.log

大丈夫そう。

工業的 Minecraft プレイ日記 #16 / ネザースターを手軽に集めるよ

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


デデン。
Ender IO の強化黒曜石はウィザーの爆発にも耐性があるので、これで囲めばよし。気を付けることとして、角になる部分は爆発がすり抜けるので、例えば回収用のバキュームチェストとかをおくとぶっ壊れる。とりあえずは半分手動なので後で考える。

中には Draconic Evolution の Mob Grinder 。これはウィザーの爆発耐性があるのはもちろん、電力を使うことで一撃でウィザーすら倒してしまうやばいやつ。

中にソウルサンドと顔を並べて、スポーンしたのを確認して距離を取り。中に入るようの隙間から爆発ダメージを若干受けてますが、、
ちなみにこれ強化黒曜石の裏にいるとダメージがないけど、爆発のエフェクトとノックバックはでるのね。

そうして一瞬のうちにウィザーは Mob Grinder によって倒されました。

半分手動ではあるが、倒すのは一瞬で便利なのですぐネザースターが集まった。

Extra Utilities 2 の Mecanisl User で設置も自動化できたものの、これは爆発耐性がないので、空高くに設置、落ちてきたウィザーを Mob Grinder で倒し Ender IO の XP Vacuum と Vacuum Chest でドロップも回収できるようになったのでした。あとは爆発や叫び声がうるさいので Extra Utilities 2 の Sound Muffler をつけて静かになった。
 

つづく。

日本語の折り返しを正規表現で解決する mikan.js を PHP に書き換えた

できたものがこちらです

作った背景

日本語の折り返しが中途半端になってつらい!機械学習で改善するぞ!という話が過去にありました。
google/budou: Budou is an automatic organizer tool for beautiful line breaking in CJK (Chinese Japanese and Korean).

それからしばらくして、いやいや機械学習じゃなくてもいいのでは?というものが出てきました。
mikan.js : 機械学習なしで、日本語の単語の改行を処理するライブラリを書いた

これって別に JS で表示するときにアレコレしなくても、普段のサーバサイドでいい感じにしてもいいのでは??と思い PHP に移植してみた次第です。

移植する流れ

元のコードを眺めて、同じような処理に書き換えていく簡単なおしごと。
幸いにも、そこまで難しいロジックでは無いので、動作をみながら書き換えていきました。

正規表現のあたりだけ、言語の違いでちょっと詰まったので、ドキュメントを見ながら動作を見ながら随時書き換えていくようなコツコツ作業でした。

言語の書き換え、双方の言語について理解が深まるのでオススメです。

工業的 Minecraft プレイ日記 #15 / 小話:空を飛んだりゾンビ発電した

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Ender IO で Simple ではない Sag Mill を作った。どこかで拾ったコンデンサをつけておいた、めっちゃ性能出る。

いらないアイテムもぼちぼち出てくるのでゴミ箱を作った。オブザーバーをつなげてガシャガシャやるので MOD なしでもできる。

と思ったけど Thermal Expansion に消滅器があった。動力も不要で稼働できるので、これに Mekanism のパイプつかってアイテムを流すだけで十分だった。

そうこうしてだいぶ素材も必要十分になってきたので Mekanism のジェットパックを作った。水素を充填し、消費することで飛んでいける。エンドの探索はもちろん、ホバーモードもあるので空中作業もはかどりそう。とはいえ水素残量を気にする必要があるので、無理はできない。
というか空飛ぶなら Extra Utilities 2 の Angel Ring のほう無限に飛べるし楽なのでは、とあとあと気づいたのだった。

Ender IO の電動スポナーはゾンビピッグマンとウィザースケルトンをそれぞれの間しばらく稼働したのであった。ゾンビピッグマンは金塊とゾンビ肉用に、ウィザースケルトンは頭の回収に。

Ender IO のゾンビ発電を作ってみた。主要な電力線との接続に Ender IO のケーブルを使ってみたけどこれ便利だな、置き換えるまである。

エンダーパールも集まってきたのでエンドポータルを探しに行った。結構遠い、、ので Mekanism のテレポーターを用意した。電力すごい使うっぽいけど有り余ってきてるので大丈夫。ただ、両方のチャンクが読み込めていないと飛べないようで、向こう側にチャンクローダー置いておかないとだめかも。

手元にも充電できるように Mekanism のワイヤレスチャージャーを作った。手元に何か持っておく必要がないので便利。

Mekanism の火炎放射器を作り Ender IO の Grains of Infinity を大量に回収できるようにした。 Extra Utilities 2 の Mechanical User なんかで自動化できるかなあと思ったけど、なんかうまくいかなかったんだよなあ。

あとは Mekanism の鉱石統合器。これは鉱石辞書で同名になるようなものを変換できる。レシピは概ね互換性があるので、具体的に使う場面は少ない。Storage Drawers のあちこちにナゲットが散らばってしまっていたので、気づいたときに変換する用。

つづく。

工業的 Minecraft プレイ日記 #14 / 核融合反応炉を使った発電

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Mekanism もいよいよ終盤戦な雰囲気が出てきました。これまで作ってなかった素材と機械を順番に作っていきます。

水 + 水素 + バイオ燃料 → [加圧反応室] → 基質 + エチレンガス
エチレンガス → [回転式流体凝縮器:濃縮] → 液体エチレン
液体エチレン + 酸素 + 基質 → [加圧反応室] → HDPE ペレット + 酸素
HDPE ペレット → [クラフト] → HDPE シート
HDPE シート + 他素材 → [クラフト] → 太陽中性子反応器

塩水 → [加温蒸発プラント] → 液体リチウム
液体リチウム → [回転式流体凝縮器:気化] → リチウムガス
リチウムガス → [太陽中性子反応器] → 三重水素

水源 → [電動ポンプ + フィルタアップグレード] → 重水
重水 → [電解分離機] → 重水素

三重水素 + 重水素 → [化学混成機] → D-T 燃料



D-T 燃料を直接でもいいですし、三重水素 + 重水素 でも良いので、燃料を核反応融合炉に搬入しておきます。
これで核反応融合炉、それ自体の準備は整いました。

核反応融合炉を起動するには 1GJ のレーザーと、点火用のフーラムが必要です。レーザー増幅器で溜めることができるので、これで 1GJ 溜まるまで待ちます。フーラムには D-T 燃料を入れます。
あとは諸々のケーブルがちゃんとつながっていることを確認(特に電力)

そして起動・・・!

するとものすごい勢いで電気が流れてくるので、無駄にならないよう真っ先に各種機械とケーブルをアップグレードしつつ、もう一つインダクションマトリクスを作りました。こっちは再点火時のレーザー用の電力を確保しておくものです。

こうして電力問題は解決されたのでした。

なお配線をすべて地下にしたのでえらいこっちゃになりました。
あとあと分かったのですが EnderIO のケーブルを使うと 1 マスにエネルギーとアイテムと液体を一緒にできるのでスペースがスッキリします。さらに Mekanism のケーブルと異なり、中身が見えないので動作も軽量なようです。容量的には Mekanism よりも少し劣りますが、それで困るときは直列で配置しすぎているはずで、それ以上の拡張も見込めないので、早々に並列な配列にしていく必要があるはずです。

ちなみに紹介してなかったですが
リチウムガス → [化学結晶化装置] → リチウムの粉
とリチウムの粉が作れて、これを使ってインダクションマトリクスを作っていきましたので、先にリチウムは生産できていました。
工業的 Minecraft プレイ日記 #13 / デジタルマイナーで鉱石採掘の自動化 | ごみばこいん Blog

つづく。

工業的 Minecraft プレイ日記 #13 / デジタルマイナーで鉱石採掘の自動化

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Mekanism にはデジタルマイナーという機械があり、Buildcraft のクァーリーなんかと違って更地にするわけではなく、自動で鉱石(というか指定したもの)だけを掘ることができます。さらに、シルクタッチで採掘することができたり、掘っただけでは空間になってモンスターがスポーンしてしまうのを防ぐために、そこを丸石で埋める設定にもできます。

ということで丸石製造も始めました。
こちらは Extra Utilities 2 の Mechanical Miner を使います(紛らわしい)これは目の前を掘ってくれるやつです。掘ったものは適当に吐き出されるので Storage Drawers で同じく Extra Utilities 2 の圧縮丸石にしておきます。

拠点近くばかり掘っても限界がすぐ来るので、遠くの土地でひたすら掘ってもらえるように Mekanism の量子もつれ転送機も作りました。
これは電気、アイテム、液体、ガスなどなど Mekanism で扱えるものはすべて遠くに転送できるすごいやつです。

しばらく動かしてみて気づいたのですが、どうやら丸石で埋めることが出来ていないようでした。設定の問題か搬入の問題か…。
まあ遠くの土地なので、拠点からはスポーン範囲外ですし、放置でいいか。

そして、いざ動かし始めると、電力が足りなくなってきていることに気づきました。タイミングよく全設備が同時に稼働するとかなり消費されるので、在庫がすぐ空っぽになってしまいます。とはいえ全設備が常時稼働し続けるわけでもないので、余剰電力をできるだけさらに貯められるように、今後の発電機にも対応するべくインダクションマトリクスも作りました。

ミニマムで作っても 1GJ も入るので、一気に技術革新した感じがあります。

つづく。

工業的 Minecraft プレイ日記 #12 / Mekanism の鉱石 4 倍化ラインを作る

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


ある程度電力や素材が安定してきたので、さらなる機械を作っていくため、鉱石をもっと効率的に生産できるようにします。

4 倍化ラインでは 3 倍化ラインに加えてさらに、塩水と塩素、そしてそれらからできる塩化水素という中間素材が必要になります。この塩化水素を化学注入室によって、鉱石に注入し、そこから 3 倍化ラインの処理をしていくことで 4 倍化ラインが出来上がります。

3 倍化ラインの記事はこちら。
工業的 Minecraft プレイ日記 #8 / Mekanism の鉱石 3 倍化ラインを作る | ごみばこいん Blog

加温蒸発濃縮プラントを作ります。あとで気づいたのですが、これ昔の作り方だそうです(wiki みてね)太陽光パネルはなくてもいいのと、つけても電気の出力はまったく内側に向ける必要はありません。
Mekanism のコンフィギュレーターで液体パイプのところをカチカチやると入力と出力を切り替えられるので、適当に設定します。

横の黒い大きなやつは Mekanism のダイナミックタンクです。かなりの量の液体をためられます。

加温蒸発濃縮プラントに水をポンプで搬入し、プラントへ太陽光の力か別途熱を伝えることで温まり、塩水が生成されていきます。バルブをつけて、抵抗型発熱器をつけたらいいかと思うのですが、ちょっとよくわかりませんでした。
とりあえずできているのでOK。

ついでなので、水と溶岩も貯めるようにしました。
奥に見える機械はまたあとで紹介します。

溶岩は Thermal Expansion の溶岩るつぼで生成しています。ネザーラックをガンガン放り込んで溶岩をガンガン作ります。

いっぱいになったダイナミックタンクを見たらこれくらいの量が入っているそうです。水はポンプから無限に吸い上げられるので別にいれなくてもいいとは思うのですが、ポンプも速度の上限があるので、まあ、まあ。

これらを電解分離機と化学注入機にかけて素材を作ります。鉱石倍化ラインを使っていないとき、電力が余るのでその分で素材を作って置けるよう、ガスタンクを置いておいてます。

従来の 3 倍化ラインまでパイプをひっぱって 4 倍化ラインになりました。

ある程度の余剰鉱石が出来てきたのでさらに機械をアップグレードしました。

そうこうしているとさらに電力が足りなくなってきたので……

つづく。

工業的 Minecraft プレイ日記 #11 / 小話Redstone Clock とそのほかいくつか

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Tinkers Construct の溶かした金属を流すのに Extra Utilities 2 の Redstone Clock が使えるなあと思ったのでやってみた。Tinkers I/O がそれっぽいこと出来そうかな?と思ってたけどこっちのほうが作るのも早く、期待通り動いてくれたのでこれでいいや。

そろそろ鉱石掘りも資源が集まってきて、アレヤコレヤと製錬するものが増えてきた。
ということで Mekanism の機械をアップグレードして、並列に製錬できるようにした。
まずは基本アップグレードで 3 並列。

充電するようなもの特にないんだけど、チャージパッドを作ってみた。

生肉を干せるラックがあったので作って試してみた。革ができる。

サトウキビを自動化した。何かと使うので…。
とはいえオブザーバーとピストンという工業化 mod としてはあるまじき行為。まあ、まあ。

Thermal Expansion の誘導加熱炉を作った。合金とかできる。

とかやっていたら発電量が足りなくなったので、風力発電を増やし、エネルギーキューブも増設。

つづく。

工業的 Minecraft プレイ日記 #10 / Ender IO の電動スポナー

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


EnderIOの環境では、通常のスポナーを壊すと、壊れたスポナーとしてドロップします。
そこへ、モブの魂を入れるビンを作って、Soul Binderを使って好きなモブのスポナーにすることができます。

で、食糧難になっていたので、鶏肉を量産することにしました。

こんな感じで電力を与えると自動でスポーンするようになりました。

で、柵で囲って鳥まみれにしようと思ったのですが、どうやらスポーンできる上限があるようで、一定数以上は無理でした。

ので、貯めるのをあきらめて、水流で流し、ExtraUtilitiesのスパイクで倒すことにします。
鳥肉の備蓄が十分になれば、遠距離攻撃のない歩行系のモブ、ウィザースケルトンなどに入れ替える予定です。

つづく。

工業的 Minecraft プレイ日記 #9 / Ender IO の経験値銀行を作る

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


Simple でよいので Alloy Smelter と Sag Mill を作って色々素材を投下すると出来上がります。


できました。

右クリックするとメニューが出てきて、ポチポチして経験値を出し入れすることができます。
ほかにも Mekanism や EnderIO のパイプで液体としてを搬入出することも可能です。

これでこまめに出し入れしたら、事故死で経験値を失うこともなくなって素敵!

つづく。

1 2