KotlinでJacksonを使ってJSONをMapに変換する

Javaのように簡単にはできなかった。仕方ないので下記のようにして回してMapに格納するのが良さそうだ。

jacksonObjectMapper().readTree("""{"text1":"hoge","text2":"hoge"}""").fields().forEach {
println(it.key)
println(it.value)
}

MySQLでSELECT結果をINSERTする

INSERTする場合

INSERT INTO table_name (column_1, column_2) SELECT 1, 2;

無ければINSERTするする場合

REPLACE INTO table_name (column_1, column_2) SELECT 1, 2;

valuesが不要なのがポイント。いつも書いてしまってsyntax errorになってしまう。

MySQLのSELECT結果(サブクエリ)でUPDATEをする

f:id:setouchinatsu:20190404165012p:plain:w200

UPDATE時のテーブル定義に使用するテーブルを並べて使うことができる。結果下記のようなSQLが書ける。

UPDATE
category,
(
SELECT item.category_id, COUNT(*) AS num
FROM category LEFT JOIN item ON category.id = item.category_id
GROUP BY relation.tag_host_id
) AS items
SET category.item_count = items.num
WHERE category.id = items.category_id

カテゴリに属する商品数を計算するのにSQLで1分かかる。全体のキャッシュを取るのもアホらしいし、バッチでカテゴリのカラムに商品数を格納することにした。UPDATEも入るので2分くらいかかった。これを一時間に一度実行できればと思う。

WebpackでCSSのbackgroundにSVGをdata形式で埋め込む

Sassで下記のように定義しておきコンパイルすると

background-image: url('../file/logo.svg');

下記のようにするには

background-image: url("data:image/svg+xml,...");

svg-url-loaderを使うのが良い。yarn add -D svg-url-loaderとしてインストールした後、webpack.config.jsに下記のように定義するだけ。

module: {
rules: [
{ test: /\.svg$/, use: ['svg-url-loader']}
]
}

svg-inline-loaderとurl-loaderを組み合わせたりいろいろしたが、こいつが一番簡単だと教えてくれたのは @am_ さんのこの記事でした。死ぬほど助かった。これで早く帰れる。

単に手動でbase64エンコードしておけばいいだろうし、他の人が引き継いだ時はむしろ手動でエンコードしたものを入れておいたほうが長らくメンテナンスできる(経験上フロント系はJavaなどに比べるとどれだけしっかりやっても不安定になってしまう)と思うが、自分が楽なように作っておくのが一番楽。

Webpack で Module not found: Error: Can't resolve './urls' と出る場合の解決策

このようなエラーが出るがエラーの箇所がライブラリ内であった。

$ yarn run webpack -w
yarn run v1.6.0
(node:10439) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
warning package.json: No license field
$ '/hoge/node_modules/.bin/webpack' -w
Webpack is watching the files…
Hash: 19fdbed237e35dbec338
Version: webpack 4.8.3
Time: 2207ms
Built at: 2018/05/22 11:14:55
Asset      Size   Chunks             Chunk Names
example.js  26.2 KiB  example  [emitted]  example
Entrypoint example = example.js
[./node_modules/css-loader/index.js!./node_modules/sass-loader/lib/loader.js!./src/css/example.scss] ./node_modules/css-loader!./node_modules/sass-loader/lib/loader.js!./src/css/example.scss 2.71 KiB {example} [built]
[./src/css/example.scss] 1.2 KiB {example} [built]
[./src/file/logo.svg] 796 bytes {example} [built]
[./src/js/example.ts] 2.58 KiB {example} [built]
+ 3 hidden modules
ERROR in ./node_modules/style-loader/lib/addStyles.js
Module not found: Error: Can't resolve './urls' in '/hoge/node_modules/style-loader/lib'
 @ ./node_modules/style-loader/lib/addStyles.js 64:14-31
 @ ./src/css/example.scss
 @ ./src/js/example.ts

style-loaderのバグだと思ったらそうではなかった。issuecomment-335952390が参考になった。私は全ファイルをTypeScriptで書いていたので.jsをresolveに使っていなかったが、ライブラリは.jsファイルを使っているので、webpack.config.jsでは.jsを入れなければいけないようだ。

resolve: {
extensions: [
'.ts', '.js'
]
}

style-loaderを使う場合はresolveに.jsを入れるということか。

node-sass でOS X 64-bit with Unsupported runtimeと言われた時の対策

下記のようなエラーが出た

$ node-sass
/usr/local/lib/node_modules/node-sass/lib/binding.js:13
throw new Error(errors.unsupportedEnvironment());
^
Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (64)
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v4.5.0
at module.exports (/usr/local/lib/node_modules/node-sass/lib/binding.js:13:13)
at Object.<anonymous> (/usr/local/lib/node_modules/node-sass/lib/index.js:14:35)
at Module._compile (internal/modules/cjs/loader.js:678:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:689:10)
at Module.load (internal/modules/cjs/loader.js:589:32)
at tryModuleLoad (internal/modules/cjs/loader.js:528:12)
at Function.Module._load (internal/modules/cjs/loader.js:520:3)
at Module.require (internal/modules/cjs/loader.js:626:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/usr/local/lib/node_modules/node-sass/bin/node-sass:11:10)

一度アンインストールしてから

npm uninstall -g node-sass

再度インストールしたら行けた

npm install -g node-sass