タグ

ブックマーク / www.greptips.com (13)

  • シェルスクリプトでSQLのJOIN結合やGROUP BYを実現する - grep Tips *

    はじめに シェルスクリプトでSQLJOINを実現する方法について、王道のjoinコマンドと、awkを使った方法をそれぞれ考えてみる。 またSQLのGROUP BYもawkで実現してみる。 前提 今回使用するデータとして、以下の商品マスタと注文トランザクションを用意する。 # products(pid, pname, price)表 $ cat products p1 pencil 100 p2 pen 200 p3 eraser 150 # orders(oid, pid(FK(products.pid), cnt)表 $ cat orders o1 p1 3 o1 p2 2 o2 p1 3 o2 p3 1 joinコマンドでJOIN SQLJOINと同等の働きをするコマンドがその名の通りjoinコマンドである。 SELECT oid, pid, pname, cnt FROM pro

    シェルスクリプトでSQLのJOIN結合やGROUP BYを実現する - grep Tips *
    katsush
    katsush 2022/02/10
  • Linuxでのファイルの入れ替え(mvコマンド vs cpコマンド) - grep Tips *

    ファイル入れ替えにおいてmvは使用してはいけない サーバにローカル端末で更新した設定ファイル等をアップしてからmvで所定のファイルに移動させると、権限や所有者が変わってしまうことがある。 cpコマンドを--preserveオプションや--no-preserveオプションをつけずに実行し、上書きすると、timestampは更新されるものの、権限や所有者は元のファイルのまま保たれる。 つまり、ファイル入れ替えにおいてmvは使用してはいけない。 サンプルを用いてmv, cpをファイルの入れ替えでどのように使うべきか、また、なぜ権限等が変わってしまうのかを記載する。 mvではなくcpを使う /usr/local/bin/test.shを~/test.shと入れ替える、という例を題にmvではなくcpを使う方法を書く。 ORIGINAL=/usr/local/bin/test.sh UPDATED=~

    Linuxでのファイルの入れ替え(mvコマンド vs cpコマンド) - grep Tips *
    katsush
    katsush 2022/02/10
  • Spring BootのPageableで一定量以上のoffsetや意図しないSortを防ぐ - grep Tips *

    動作確認環境 Java 11 Spring Boot 2.5.5 一定量以上のoffsetや意図しないSortによる問題 一定量以上のoffset Spring Bootによるpage, sizeへの制限 Spring BootのPageableをControllerの引数にセットすればpage, size等のクエリパラメータを解釈してPageableにセットしてくれる。 OutOfMemoryを防ぐために、Spring Bootのデフォルト設定でsizeに2,000件以上設定しても2,000件になるようになっている(docs.spring.ioか日語訳spring.pleiades.ioのspring.data.web.pageable.max-page-sizeを参照)。つまりPageableの1ページの件数はセーフガードが入ってる。 しかしpageには上限の設定がない。確かにJav

    Spring BootのPageableで一定量以上のoffsetや意図しないSortを防ぐ - grep Tips *
  • Spring BootからRedisを使うときはGenericJackson2JsonRedisSerializerでJSONとオブジェクトをマッピングする - grep Tips *

    環境 Java 17 Spring Boot 2.6.0 Jackson 2.13.0 Redis 6 関連 Spring SecurityでREST API + JSONによる認証を行う(Session/Cookie + Redis編) ※SessionにRedisを用いる場合も同様にGenericJackson2JsonRedisSerializerを使う。こちらにSession用の設定を記載している。 Spring BootからRedisを使う JdkSerializationRedisSerializer Spring BootからRedisを使うときは、標準ではJdkSerializationRedisSerializerがシリアライズ・デシリアライズで利用される。implements Serializableをクラスに設定する必要があり、当然シリアライズできないフィールドを持つ

    Spring BootからRedisを使うときはGenericJackson2JsonRedisSerializerでJSONとオブジェクトをマッピングする - grep Tips *
    katsush
    katsush 2022/01/10
  • wc -lでは文末に改行がないファイルの行数を正しく数えられない - grep Tips *

    最後に改行がある場合は以下の通り問題ない。 $ printf 'test\ntest\n' test test $ printf 'test\ntest\n' | wc -l 2 wc -lは改行の数を数えるため、最後に改行がないと当の行数より1少ない数を返してしまう。 $ printf 'test\ntest' test test$ $ printf 'test\ntest' | wc -l 1 対策としては、grep -c ''で空文字に合致する行数を求めることで代用したり、awkのENDとNRを活用したり、sedの現在の行数を出力する=と最終行$を活用したりする方法がある。 $ printf 'test\ntest' | grep -c '' 2 $ printf 'test\ntest' | awk 'END{print NR}' 2 $ printf 'test\ntest'

    wc -lでは文末に改行がないファイルの行数を正しく数えられない - grep Tips *
  • gzip圧縮率を確認する方法 - grep Tips *

    標準出力をgzipしてファイルを保存している場合など、元のファイルのサイズがわからないときに、伸長して圧縮率を確認したいときがある。 gzip -l, gzip --listを使うと説明されることが多いが、gzip -lには以下のバグがあるため利用しないほうがいい。 gzip 形式では、入力サイズは 2^32 の余りで表現されるため、 --list オプション による表示では、圧縮前のファイルが 4GB 以上の場合、圧縮前のサイズや圧縮率が 正しく表示されない。 引用元: https://linuxjm.osdn.jp/html/GNU_gzip/man1/gzip.1.html 実際に伸長するとDISK容量が足りなくなるおそれがあるので、標準出力に伸長して、wc -cに流すことでバイト数を取得する。 標準出力に伸長する方法は以下の通り3つほどある。下に行くほどおすすめ。gzipではcom

    gzip圧縮率を確認する方法 - grep Tips *
    katsush
    katsush 2021/11/16
  • Fluentdの監視 - grep Tips *

    Fluentdの監視項目 Fluentdの監視をしたい項目は四つ。 port監視 バッファーに蓄積されているキューの数が上限に達していないか バッファーに蓄積されている合計サイズが上限に達していないか 再送を試みた回数が上限に達していないか 1のport監視はTCP通信であればZabbixの「シンプルチェック」で簡単に確認できる。 net.tcp.service[tcp,,24224] in_monitor_agentプラグイン 2, 3, 4を監視する方法として、in_monitor_agentプラグインを使用する。 https://docs.fluentd.org/v1.0/articles/in_monitor_agent 以下のようなsyslogからAmazon CloudWatch Logsにログを転送する設定があるとする。 <source> @type syslog port

    Fluentdの監視 - grep Tips *
  • Jinja2のWhitespace Controlを理解して、きれいなファイルを出力する - grep Tips *

    Jinja2のWhitespace Control Python 3.6.5 Jinja 2.10 Jinja2でforやifを使ってテンプレートを書くと、出力される文字列に空行が多く入ってしまう。これはforやifのみが書いてある行にある改行も出力されてしまうから。 Jinja2にはWhitespace Controlという機能があり、この出力を制御できる。 Whitespace Controlでは+と-記号を使うのだが、空行削除の目的では-をforやifにつける。e.g. {%- if ... %} -をつける場所は4か所あり、どこにつけるかによって挙動が変わる。具体的に出力を見るほうが理解しやすいため、4か所それぞれに-をつけて出力を見ていく。 for文でのWhitespace Control挙動確認 用意したのは以下の通り何も設定しない場合と4パターン。 #!/usr/bin/en

    Jinja2のWhitespace Controlを理解して、きれいなファイルを出力する - grep Tips *
  • grepとhead, tailは一緒に使うべきではない - grep Tips *

    はじめに grepしてファイルから条件に合致する行を抜き出したいが、はじめから数行だけでいい場合や、うしろから数行だけでいい場合、安易にgrepとheadもしくはtailを組み合わせてはいけない。 headの代わり 例えば、次のようなコマンドを書いた場合、sample.txt全部をgrepで処理してから、結果の最初の1行を返すことになるので、sample.txtが大きなファイルだと時間がかかる。 grep sample_cond sample.txt | head -1 grepには-m NUM, --max-count=NUMオプションがあり、マッチした行数が NUM に達したら、ファイルの読み込みを中止することができる。適切なコマンドは以下になる。 grep -m 1 sample_cond sample.txt tailの代わり うしろから数行だけを取得する場合は、少しテクニックが必

    grepとhead, tailは一緒に使うべきではない - grep Tips *
    katsush
    katsush 2021/11/16
  • ON DUPLICATE KEY UPDATEをAUTO_INCREMENTのテーブルには発行しない方がいい - grep Tips *

    AUTO_INCREMENTはINSERTするたびにカウントアップして発番してくれるが、ON DUPLICATE KEY UPDATEを使用してINSERTではなく既存行のUPDATEになった場合もカウントアップされてしまう。実際にINSERTしている行数はたいしたことがないのに、ON DUPLICATE KEY UPDATEされる回数が多いせいで、AUTO_INCREMENT値が大きくなってしまい、INTなどの比較的小さい型にしていた場合にAUTO_INCREMENTが上限値に達してしまう。 以下のテーブルをもとにINSERTされていないのにAUTO_INCREMENT値が増えていることを実際に確認する。 mysql> CREATE TABLE on_dup_autoinc (id INT AUTO_INCREMENT PRIMARY KEY, ukey CHAR(1) UNIQUE K

    ON DUPLICATE KEY UPDATEをAUTO_INCREMENTのテーブルには発行しない方がいい - grep Tips *
    katsush
    katsush 2021/11/16
  • jqでJSONの深い階層を気にせずにアクセスする - grep Tips *

    JSONの深い階層にある値を取るには JSONの深い階層にある値を取ろうとすると、第一階層から順にパス式を記載しなければならない。アドホックな対応で長いパス式を書くのは面倒くさいので、いきなり深い階層のkeyを指定してvalueを取得する方法を書く。 以下のJSONを例にする {"level1key":{"level2key":{"level3key":{"level4key":"level4value"}}}} このJSONからlevel4keyのvalueを取得するには、 jqでlevel4keyにたどり着くまでのパス式を書く必要がある。 $ jq ".level1key.level2key.level3key.level4key" <<< '{"level1key":{"level2key":{"level3key":{"level4key":"level4value"}}}}' "

    jqでJSONの深い階層を気にせずにアクセスする - grep Tips *
    katsush
    katsush 2021/08/21
  • Spring Bootの@Componentと@Beanの違い - grep Tips *

    まずは結論から SpringのDIコンテナに管理してもらいたいクラスが、自分で作成しているクラスなのか、それとも外部のライブラリ(サードパーティのライブラリ)のクラスなのかによって、@Componentを使うか@Beanを使うか変わる。 @Componentとは @Compnentは、Spring BootでWebのMVCアプリを作成するときに使用する@Controller, @Service, @Repositoryと同様に、SpringのDIコンテナに管理させて@AutowireなどでDIできるようにしたいクラスにつける。 @Controller等はMVCの文脈上で特化したクラスにつけられるのに対して、@Componentはそれら以外の特化していないクラス全般に付与するだけで、基的には同じ。 @Beanとは @Beanも同様にSpringのDIコンテナに管理させたいものにつける点は同

    Spring Bootの@Componentと@Beanの違い - grep Tips *
  • Elasticsearchのmatchとmatch_phraseの違い - grep Tips *

    Elasticsearchで全文検索する際にmatchとmatch_phraseの違いがはっきり身についていないのでまとめてみる。 version: Elasticsearch 7.5 matchクエリ matchクエリを使うといわゆる曖昧検索ができる。matchクエリに渡した文字列はanalyzeされてから検索に使用される。 例えばtitleというフィールドに「2021年春に発売される新着の特集!!NEW!!」という文字を保存していたとして、「2021春」で検索できるかどうかを考えてみる。 GET sample-index/_search { "query": { "match": { "title": "2021春" } } } 解析されたクエリはORで検索される indexをkuromojiで形態素解析されるように設定したので、「2021春」は「2021」と「春」に形態素解析される

    Elasticsearchのmatchとmatch_phraseの違い - grep Tips *
  • 1