GA

2021/12/14

jqの代わりにperlを使ったり、mysqlを使ったり(できなかった)

TL;DR

  • jq の記法が覚えられないので perl -MJSON で代用しています、というだけの記事です。

このエントリは Perl Advent Calendar 2021 の14日目の記事です。

サンプルJSONはテキトーに作ったやつ。

やりたくなるのはだいたいこんなやつ。

$ cat generated.json | jq '.[0].tags'   ### これが全要素ぶん欲しくなる
[
  "occaecat",
  "incididunt",
  "dolore",
  "reprehenderit",
  "officia",
  "cupidatat",
  "qui"
]

$ cat generated.json | jq '.[*].tags'   ### 違う
jq: error: syntax error, unexpected '*' (Unix shell quoting issues?) at <top-level>, line 1:
.[*].tags
jq: 1 compile error

$ cat generated.json | jq '.*.tags'   ### 違う
jq: error (at <stdin>:226): Cannot index array with string "tags"

jqは毎回ググらないといけないけど、perlなら手癖でサクっと書けて便利だね! というだけの話でした。

$ cat generated.json | perl -MJSON -E 'my $json= from_json(join("", <>)); foreach (@$json) { say join(", ", @{$_->{tags}}) }'
occaecat, incididunt, dolore, reprehenderit, officia, cupidatat, qui
veniam, minim, amet, anim, esse, consectetur, nisi
dolor, ipsum, dolor, id, voluptate, esse, minim
proident, sit, veniam, occaecat, mollit, do, reprehenderit
aliquip, mollit, magna, laboris, non, mollit, reprehenderit

で、手癖でサクっと書けるといえばMySQLな訳(?)で、MySQL 8.0には JSON_TABLE関数 があるので、ワンチャンワンライナーで書けるんじゃないかと。

$ mysql80 -e "SELECT * FROM JSON_TABLE('"$(cat generated.json)"', '\$[*]' COLUMNS(id TEXT PATH '$._id', tags JSON PATH '$.tags')) AS j;
..

エスケープが面倒くさくて挫折しました。

コマンドラインクライアント開いちゃえば(慣れるまでやれば)何とかなりそうな気はするんですが、おとなしくPerlを使いたいと思います。

mysql80 23> SET @j := '[ { "_id": "61b8175f0e474cbda9cfe8ce", "index": 0, "guid": "a50ab0a0-7053-4473-b211-062232793c5c", "isActive": true, "balance": "$1,446.15", "picture": "http://placehold.it/32x32", "age": 26, "eyeColor": "brown", "name": "Galloway Mueller", "gender": "male", "company": "LUDAK", "email": "gallowaymueller@ludak.com", "phone": "+1 (953) 468-2935", "address": "587 Bank Street, Savannah, Delaware, 3971", "about": "Lorem irure reprehenderit pariatur et voluptate. Consectetur aute deserunt ex deserunt pariatur minim sit fugiat elit minim. Ullamco excepteur magna aliquip do ad aliqua.\\r\\n", "registered": "2017-09-08T10:09:10 -09:00", "latitude": 36.049314, "longitude": 94.927171, "tags": [ "occaecat", "incididunt", "dolore", "reprehenderit", "officia", "cupidatat", "qui" ], "friends": [ { "id": 0, "name": "Abigail Odonnell" }, { "id": 1, "name": "Shelton Rosales" }, { "id": 2, "name": "Marisa Robertson" } ], "greeting": "Hello, Galloway Mueller! You have 2 unread messages.", "favoriteFruit": "banana" }, { "_id": "61b8175f8eea11b2daa74ccd", "index": 1, "guid": "2db0dfc9-6e52-4d27-88ad-736e31637b11", "isActive": false, "balance": "$2,183.95", "picture": "http://placehold.it/32x32", "age": 35, "eyeColor": "green", "name": "Herrera Leblanc", "gender": "male", "company": "ZOLAR", "email": "herreraleblanc@zolar.com", "phone": "+1 (910) 438-3490", "address": "774 Woods Place, Dodge, Indiana, 4704", "about": "Tempor dolor magna ex cupidatat ad Lorem. Non ullamco excepteur ullamco do qui sit tempor adipisicing velit aliquip ea ea cillum. Quis duis non ea dolor. Labore aute do Lorem do pariatur cillum excepteur eu.\\r\\n", "registered": "2014-03-21T02:23:45 -09:00", "latitude": 18.114458, "longitude": -150.106866, "tags": [ "veniam", "minim", "amet", "anim", "esse", "consectetur", "nisi" ], "friends": [ { "id": 0, "name": "Tami Vinson" }, { "id": 1, "name": "Greta Aguilar" }, { "id": 2, "name": "Tabitha Kramer" } ], "greeting": "Hello, Herrera Leblanc! You have 7 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "61b8175f50ab99cf353821e4", "index": 2, "guid": "58a3b7b3-f690-4bd8-9e45-b25fc2820bfc", "isActive": false, "balance": "$2,769.89", "picture": "http://placehold.it/32x32", "age": 40, "eyeColor": "brown", "name": "Leonard Morin", "gender": "male", "company": "QUOTEZART", "email": "leonardmorin@quotezart.com", "phone": "+1 (991) 497-3228", "address": "867 Polar Street, Thomasville, Idaho, 4492", "about": "Duis consequat exercitation sint non in culpa adipisicing aute ut adipisicing sunt labore consectetur nisi. Adipisicing nostrud enim elit magna amet excepteur veniam consequat nisi minim. Velit laborum aute aute enim duis veniam.\\r\\n", "registered": "2014-03-08T04:09:22 -09:00", "latitude": -75.02935, "longitude": 143.205584, "tags": [ "dolor", "ipsum", "dolor", "id", "voluptate", "esse", "minim" ], "friends": [ { "id": 0, "name": "Browning Pena" }, { "id": 1, "name": "Shelby Oconnor" }, { "id": 2, "name": "Stark Peck" } ], "greeting": "Hello, Leonard Morin! You have 1 unread messages.", "favoriteFruit": "banana" }, { "_id": "61b8175fb7c793f4cce77035", "index": 3, "guid": "ebb5a062-9f91-44a3-a035-d3705a408bc4", "isActive": false, "balance": "$3,895.62", "picture": "http://placehold.it/32x32", "age": 25, "eyeColor": "green", "name": "Inez Prince", "gender": "female", "company": "RUGSTARS", "email": "inezprince@rugstars.com", "phone": "+1 (909) 410-3299", "address": "580 Preston Court, Coyote, District Of Columbia, 6172", "about": "Sunt adipisicing est excepteur exercitation ea. Aliqua et eu aliqua officia sunt. Aute dolore elit elit adipisicing mollit non. Officia ea commodo tempor eiusmod. Do sint officia eu nostrud ex. Duis excepteur eiusmod amet excepteur ad. Incididunt deserunt ut velit officia aliquip ullamco elit.\\r\\n", "registered": "2021-06-06T03:53:17 -09:00", "latitude": 53.834649, "longitude": 46.190966, "tags": [ "proident", "sit", "veniam", "occaecat", "mollit", "do", "reprehenderit" ], "friends": [ { "id": 0, "name": "Forbes Chavez" }, { "id": 1, "name": "Marietta Edwards" }, { "id": 2, "name": "Leann Williams" } ], "greeting": "Hello, Inez Prince! You have 5 unread messages.", "favoriteFruit": "strawberry" }, { "_id": "61b8175fc39c6d3d5f37a882", "index": 4, "guid": "cddcaa87-8807-4601-95d7-85c10bcdcf19", "isActive": false, "balance": "$2,724.38", "picture": "http://placehold.it/32x32", "age": 32, "eyeColor": "blue", "name": "Cannon Bullock", "gender": "male", "company": "EMTRAK", "email": "cannonbullock@emtrak.com", "phone": "+1 (876) 596-2034", "address": "820 Vandam Street, Naomi, Arizona, 1294", "about": "Irure laboris et labore irure Lorem consequat consequat nostrud ad incididunt et Lorem. Incididunt id ipsum mollit do proident. Ipsum exercitation eiusmod et proident occaecat qui est tempor quis aliquip fugiat consectetur. Excepteur exercitation laborum duis occaecat qui ad ut in laboris in elit officia. Magna consectetur proident deserunt minim. Exercitation labore ullamco cupidatat officia cupidatat. Laboris id elit aliquip et laboris nostrud ullamco.\\r\\n", "registered": "2016-05-13T04:25:45 -09:00", "latitude": -50.009625, "longitude": -38.790491, "tags": [ "aliquip", "mollit", "magna", "laboris", "non", "mollit", "reprehenderit" ], "friends": [ { "id": 0, "name": "Bradshaw Barr" }, { "id": 1, "name": "Meredith Donovan" }, { "id": 2, "name": "Lester Carter" } ], "greeting": "Hello, Cannon Bullock! You have 8 unread messages.", "favoriteFruit": "apple" } ]';  -- \r\nを\\r\\nにエスケープする必要がある…
Query OK, 0 rows affected (0.00 sec)

mysql80 23> SELECT * FROM JSON_TABLE(@j, '$[*]' COLUMNS(id TEXT PATH '$._id', tags JSON PATH '$.tags')) AS j;
+--------------------------+--------------------------------------------------------------------------------------+
| id                       | tags                                                                                 |
+--------------------------+--------------------------------------------------------------------------------------+
| 61b8175f0e474cbda9cfe8ce | ["occaecat", "incididunt", "dolore", "reprehenderit", "officia", "cupidatat", "qui"] |
| 61b8175f8eea11b2daa74ccd | ["veniam", "minim", "amet", "anim", "esse", "consectetur", "nisi"]                   |
| 61b8175f50ab99cf353821e4 | ["dolor", "ipsum", "dolor", "id", "voluptate", "esse", "minim"]                      |
| 61b8175fb7c793f4cce77035 | ["proident", "sit", "veniam", "occaecat", "mollit", "do", "reprehenderit"]           |
| 61b8175fc39c6d3d5f37a882 | ["aliquip", "mollit", "magna", "laboris", "non", "mollit", "reprehenderit"]          |
+--------------------------+--------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

明日はまだ決まっていません!

Perl Advent Calendar 2021

2021/12/08

今度はConoHa 1GBの上でMariaDBをビルドする

このエントリは ConoHa Advent Calendar 2021MySQL Advent Calendar 2021 の8日目の記事です。

昨日は @diglateam3 さんの えっ!?ConoHaでVRコンテンツを!? 〜 A-Frameで手軽に始めるWebXR@hamchance0215 さんの MySQLの行ロックを図解 でした。


そういえばもう10.0以来、MariaDBをソースビルドしてないんじゃないかなという気になったので、ふと思うままにビルドしてみることにしました。

最近はMroongaストレージエンジンが鬼門だという噂を聞いて、そういえば10.0の時もあったなあとか思い出したんですが、最近のバージョンだとどの Mroonga が同梱されてるのか更新されてなかったりするのかしら。

About Mroonga - MariaDB Knowledge Base

取り敢えず逝ってみよう。

ConoHa 1GBのVPSをCentOS Stream 8でポチ。

CentOS Stream 8は一応一通りのバージョンでサポートされていそう。

OS Compatibility — MariaDB Enterprise Documentation


取り敢えず10.6の最新版。


$ wget https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-10.6.5/source/mariadb-10.6.5.tar.gz

$ tar xf mariadb-10.6.5.tar.gz

$ cd mariadb-10.6.5/

$ cmake .

-bash: cmake: command not found

いきなり忘れていた。

$ sudo dnf install -y cmake gcc gcc-c++
$ cmake .
..
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake/Modules/FindCurses.cmake:268 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/readline.cmake:55 (FIND_PACKAGE)
  cmake/readline.cmake:185 (FIND_CURSES)
  CMakeLists.txt:384 (MYSQL_CHECK_READLINE)

..

おお、 -DWITH_BOOST 要らないのか。ちょっと新鮮。

$ sudo dnf install -y ncurses-devel
$ rm CMakeCache.txt
$ cmake .
..
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find GnuTLS (missing: GNUTLS_LIBRARY GNUTLS_INCLUDE_DIR)
  (Required is at least version "3.3.24")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake/Modules/FindGnuTLS.cmake:68 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  libmariadb/CMakeLists.txt:326 (FIND_PACKAGE)

..

OpenSSLではなくGnuTLSを要求された。

$ sudo dnf install -y gnutls-devel

$ cmake .
..

$ time make
..
real    97m11.810s
user    85m56.911s
sys     7m46.945s

あれ、超あっさり終わった…。

ついでに、現在開発版の10.8

$ wget https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-10.7.1/source/mariadb-10.7.1.tar.gz
$ tar xf mariadb-10.7.1.tar.gz
$ cd mariadb-10.7.1/
$ cmake .
..

$ time make
..
real    100m15.233s
user    88m40.496s
sys     7m59.481s

超あっさりビルドできた…

$ du -sh ~/mariadb-10.?.?
6.5G    /home/yoku0825/mariadb-10.6.5
6.6G    /home/yoku0825/mariadb-10.7.1

ビルド済のサイズは5.7以上8.0未満といった感じ

5.3G    mysql-5.7.36/

19G     mysql-8.0.27/

というか噂に聞いていたよりLinuxだからかあっさりビルドできてしまった…。

明日は @hironobu_s さんと @tkooler_lufar さんです!

2021/12/03

Perlで作られたMySQL用の何かについて

この記事は Perl Advent Calendar 2021MySQL Advent Calendar 2021 の3日目の記事です。

Perl Advent Calendar 2021 の1日目2日目が @hkoba さんのいい話だった流れを遮って、突然のユルいプログラム紹介です。

MySQL Advent Calendar 2021 の2日目は @meijik さんでした。


俺はMySQLが好きでPerlも好きなので、MySQL関連の何かがPerlで書かれているとちょっと嬉しくなります。

Perlはそんなに得意ではないですが、MySQLに絡んでいれば大体何となくわかるものです。 innotop がそれを教えてくれました(俺が %hash=(); @hash{"hoge", "fuga"}= qw{ a b } の記法を知ったのはinnotopが使っていたからです… )

逆に、Perlは読めるけどMySQLはちょっと……な人も、Perlを取っ掛かりにMySQLに興味を持ってもらえたらうれしいなあと思います。

というわけで、俺が知っている限りのMySQL && Perlなものをユルく紹介だけしていきます。

innotop

  • topライクに SHOW PROCESSLISTSHOW ENGINE INNODB STATUS をリアルタイム表示するためのプログラム
  • 最近 myStatusgo に頼ることが多いけれど、細やかに見るなら俺はやっぱりinnotopが好き

percona-toolkit

  • Perlのみならず、一部Goとかシェルスクリプトも混じっている
  • 有名どころのpt-query-digestやpt-online-schema-changeはPerl
  • libの下を見るとヒャーってなるけど、binの下のはファットパックされてるので読むならbinの下のを直接読むのが良い気がする

MHA for MySQL

  • もうメンテはされていないけれど、有名なあのアレ
  • 「一番進んでいるレプリカからリレーログを引っこ抜いて他に適用するなんてどうやってやってんだろう」がわかる、Perlが読めれば

MMM for MySQL

  • もうメンテはされていない、古いあのアレ

MySQLTuner

  • 一部に根強い人気のアレ。ちゃんとメンテされている。
  • 「この値を調整しろというのはいいけど、どこから算出したのそれ?」がわかる、Perlが読めれば

mysqldumpslow

  • 公式パッケージに付属しているあのアレ
  • 実はPerl製だったんです

MySQL::Sandbox

  • dbdeployer の前身、俺はこっちの方が好き(Perlだから)
  • ただまあもう乗り換え時かな…

Test::mysqld

  • そもそもPerlのテストスクリプト内でクリーンなmysqldを起動するためのものだからちょっと番外風味
  • 趣味のスクリプト をテストするのにとても助かっています

他にもあったら教えてください!

明日は @mackee_w さんと @tom_bo さんです!

あsあ

2021/12/01

ConoHaの上でひたすらMySQLをビルドする 2021

このエントリは ConoHa Advent Calendar 2021 と MySQL Advent Calendar 2021 の1日目の記事です。

ついに6回目を迎えた、「定点観測っぽく1GBのVPSでひたすらビルドするシリーズ」、最近のMySQLのビルドにはパワーが必要ですね。


今年はビルド用のVPSを起動するタイミングでCentOS Stream 9が選べたのでそれを選択。


$ cat /etc/centos-release

CentOS Stream release 9

MySQL 5.6はEOLになったので、5.7と8.0のみ。

まずはMySQL 5.7から。

$ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.36.tar.gz
$ tar xf mysql-boost-5.7.36.tar.gz

$ cd mysql-5.7.36/

$ cmake .

-bash: cmake: command not found

cmakeが無かったのでインストール。

CentOS Stream 8がどうだったか全く忘れたけど、もう cmake だけでもちゃんと cmake3 がインストールされてくれるのね。

$ sudo dnf install -y cmake
$ cmake .
..
CMake Error at CMakeLists.txt:146 (PROJECT):
  No CMAKE_C_COMPILER could be found.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.

CMake Error at CMakeLists.txt:146 (PROJECT):
  No CMAKE_CXX_COMPILER could be found.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.

..

gccも入り用だった。

$ sudo dnf install -y gcc gcc-c++
$ cmake .
..
CMake Error at cmake/boost.cmake:88 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

  This CMake script will look for boost in <directory>.  If it is not there,
  it will download and unpack it (in that directory) for you.

..

-DWITH_BOOST=./boost つけ忘れてた。もう一度。

$ cmake -DWITH_BOOST=./boost .

..
Cannot find appropriate system libraries for WITH_SSL=system.
Make sure you have specified a supported SSL version.
Valid options are :
system (use the OS openssl library),
yes (synonym for system),
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:63 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:280 (FATAL_SSL_NOT_FOUND_ERROR)
  CMakeLists.txt:568 (MYSQL_CHECK_SSL)

..

そういえばデフォルトでOpenSSLを使ったSSLを有効にしようとするようになったのであった。

$ sudo dnf install -y openssl-devel

$ cmake -DWITH_BOOST=./boost .

..
Cannot find appropriate system libraries for WITH_SSL=system.
Make sure you have specified a supported SSL version.
Valid options are :
system (use the OS openssl library),
yes (synonym for system),
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:63 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:280 (FATAL_SSL_NOT_FOUND_ERROR)
  CMakeLists.txt:568 (MYSQL_CHECK_SSL)

..

あれまた同じエラー出た。

CMakeCache.txtクリアしないといけなかったかな。

$ rm CMakeCache.txt

$ cmake -DWITH_BOOST=./boost .
..
Cannot find appropriate system libraries for WITH_SSL=system.
Make sure you have specified a supported SSL version.
Valid options are :
system (use the OS openssl library),
yes (synonym for system),
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:63 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:280 (FATAL_SSL_NOT_FOUND_ERROR)
  CMakeLists.txt:568 (MYSQL_CHECK_SSL)

..

違った。

なんかどうも このへん とかを見る限り、OpenSSLのヘッダの書き方とか変わって認識できてないんじゃないか疑惑。

openssl-devel-1.0.2k-21.el7_9.x86_64
/usr/include/openssl/opensslv.h
# define OPENSSL_VERSION_NUMBER  0x100020bfL

vs.

openssl-devel-3.0.0-3.el9.x86_64
/usr/include/openssl/opensslv.h
# define OPENSSL_VERSION_NUMBER          \
    ( (OPENSSL_VERSION_MAJOR<<28)        \
      |(OPENSSL_VERSION_MINOR<<20)       \
      |(OPENSSL_VERSION_PATCH<<4)        \
      |_OPENSSL_VERSION_PRE_RELEASE )

サポートされていないんだろうな、とそっと閉じてCentOS Stream 8でやることを決意。
(そもそもMySQL 5.7はRHEL系の8.xでもサポートされていない MySQL :: Supported Platforms: MySQL Database )


ではやりなおし。

$ cat /etc/centos-release
CentOS Stream release 8

$ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.36.tar.gz
$ tar xf mysql-boost-5.7.36.tar.gz

$ cd mysql-5.7.36/

$ sudo dnf install -y cmake gcc gcc-c++ openssl-devel

$ cmake -DWITH_BOOST=./boost .
..
-- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:71 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:105 (FIND_CURSES)
  cmake/readline.cmake:198 (MYSQL_USE_BUNDLED_EDITLINE)
  CMakeLists.txt:570 (MYSQL_CHECK_EDITLINE)

ああ、いつもの ncurses-devel 入れ忘れた。

$ sudo dnf install -y ncurses-devel

$ rm CMakeCache.txt

$ cmake -DWITH_BOOST=./boost .
..
--   Package 'libtirpc', required by 'virtual:world', not found
CMake Error at cmake/rpc.cmake:76 (MESSAGE):
  Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc
Call Stack (most recent call first):
  rapid/plugin/group_replication/configure.cmake:60 (MYSQL_CHECK_RPC)
  rapid/plugin/group_replication/CMakeLists.txt:25 (INCLUDE)

おととし も引っかかったやつ。

PowerToolsリポジトリが全部小文字になってたのに数分溶かす。

$ sudo dnf --enablerepo=powertools install -y rpcgen libtirpc-devel

$ cmake -DWITH_BOOST=./boost .

$ time make
..
real    62m14.359s
user    49m11.136s
sys     5m38.007s

1時間ちょい。こんなもんだったっけかあ。


MySQL 8.0、インソースビルドのためのcmakeオプションつけて。

$ sudo dnf install --enablerepo=powertools -y cmake gcc gcc-c++ openssl-devel ncurses-devel  rpcgen libtirpc-devel

$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.27.tar.gz
$ tar xf mysql-boost-8.0.27.tar.gz
$ cd mysql-8.0.27
$ cmake -DWITH_BOOST=./boost -DFORCE_INSOURCE_BUILD=1 .
..
CMake Warning at CMakeLists.txt:349 (MESSAGE):
  You need to install the required packages:

   yum install gcc-toolset-10-gcc gcc-toolset-10-gcc-c++ gcc-toolset-10-binutils

..

お、devtoolsetってgcc-toolsetに改名したのか、と思いながらインストール。

$ sudo dnf install -y gcc-toolset-10-gcc gcc-toolset-10-gcc-c++ gcc-toolset-10-binutils

$ cmake -DWITH_BOOST=./boost -DFORCE_INSOURCE_BUILD=1 .

$ time make

..
[ 54%] Linking CXX shared library library_output_directory/libserver_unittest_library.so
/opt/rh/gcc-toolset-10/root/usr/bin/ld: error: library_output_directory/libserver_unittest_library.so(.debug_info) is too large (0x1caaed01 bytes)
collect2: fatal error: ld terminated with signal 9 [Killed]
compilation terminated.
make[2]: *** [CMakeFiles/server_unittest_library.dir/build.make:183: library_output_directory/libserver_unittest_library.so] Error 1
make[2]: *** Deleting file 'library_output_directory/libserver_unittest_library.so'
make[1]: *** [CMakeFiles/Makefile2:4481: CMakeFiles/server_unittest_library.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

real    223m36.642s
user    152m41.797s
sys     18m1.107s

Σ(゚д゚lll) 落ちた

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          808Mi       684Mi        49Mi       0.0Ki        74Mi        26Mi
Swap:         2.0Gi       1.9Gi       107Mi

swap 2GBでも足りないなんて、もう1GBで戦える時代じゃないんですかね……どうするか…(普段使いのところはswap 4GB使ってまだMySQLをビルドしてはいるが)

2021/10/05

PHPカンファレンス2021に参加しました…のポエム

PHP Conference Japan 2021 に参加しました。


参加といっても家族との兼ね合いだったりで、正直「自分のセッション以外はほぼほぼ不参加」でした(´・ω・`)


「オンラインxx」の「xx」が終わった瞬間に現実(?)に引き戻される感があるので、来年はオフラインでやれる状態になっていると良いですね。。


----


最初は応募しよう応募しようと思いつつ、 転職 もしたばっかで案外忙しい…と諦めていたんですが、アディショナルタイムのツイートを見ていてもたってもいられなくなり、結局応募しました。



俺がしゃべれることといえば当然MySQLの話しかないわけですが、ここしばらく(?)「俺がWebApp開発しているような人に伝えられることって何だろう」と考えて(かつ、現実的に俺がちゃんと資料を作れる範囲で)これにしようと決めました。



ちなみに「もうギリギリ」は応募締め切りギリギリ(アディショナルタイム期間だったので)ってことです。


31もスターをいただけて、無事採択されました。

つけていただいた皆様、ありがとうございます。





ところがどっこい(?) ふと気になるセッションを見つけます。




Σ(゚д゚lll) ダダ被りの予感!?




ちなみに、出来上がったのは発表前日の10/2(土)だったので、まみーさんにはドラフトしか見てもらっていません(それも9/30(木) だった。まみーさんのは先に見せてもらってた…

なお、途中で気が変わった(?)のか、スローログの話は結局しませんでした。でもEXPLAINとインデックスに絞ったおかげで、MySQLとPHPのいい感じの話になれたな、と結果オーライな気がしています。


出来上がりはこんな感じです。



モノは 日々の覚書: サイボウズさんの開運研修(データベース)で話してきました の時の「MySQLとインデックスと私」をもうちょっと(?)カジュアルにしたものです。


カバリングインデックスやネクストキーロックの話題を捨てて、その分「PHPのサンプルコードっぽいものでインデックスの刈り込み方をイメージしてもらえる」ようにしています。


前日までは130ページ以上あった(練習問題があと3パターンくらいあった)んですが、到底時間に収まらなかったので最後のリハーサルで切り詰めました。ぴったり60分でした。よかった。


ご笑覧いただければ幸いです!

2021/10/04

LEFT JOINのONに書くかWHEREに書くかで結果セットが変わるやつのサンプル

TL;DR

  • リテラルと比較する条件のこと
    • INNER JOINならONでもWHEREでもどっちでも同じ結果になる、マッチしない行は影も形も出てこない
    • OUTER JOINならONに書いた時は「それにマッチしなければNULL詰めの行が返る」、WHEREに書いた場合は「それにマッチしない行は表示されない(= INNER JOINと一緒)」
  • LEFT JOINの左右どちらのテーブルでもこうなるのはちょっと面白い(?)
    • ゆっくり考えればわかるんだけど、2度見してしまった。。

CREATE TABLE t1 (num int);
INSERT INTO t1 VALUES (1), (2), (3);

-- INNER JOIN で WHERE
SELECT * FROM t1 JOIN t1 AS t2
ON t1.num = t2.num
WHERE t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- INNER JOIN で ON
SELECT * FROM t1 JOIN t1 AS t2
ON t1.num = t2.num AND t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- LEFT JOIN の右側で WHERE
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num
WHERE t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- LEFT JOIN の右側で ON
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num AND t2.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    2 | NULL |
|    3 |    3 |
+------+------+
3 rows in set (0.00 sec)

-- LEFT JOIN の左側で WHERE
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num
WHERE t1.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    3 |    3 |
+------+------+
2 rows in set (0.00 sec)

-- LEFT JOIN の左側で ON
SELECT * FROM t1 LEFT JOIN t1 AS t2
ON t1.num = t2.num AND t1.num IN (1, 3);
+------+------+
| num  | num  |
+------+------+
|    1 |    1 |
|    2 | NULL |
|    3 |    3 |
+------+------+
3 rows in set (0.00 sec)