jq でJSON を整形

本家 Tutorial : https://stedolan.github.io/jq/tutorial/

わかりやすい紹介 : https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

inotify-tools の分かり易い説明 : https://qiita.com/stc1988/items/464410382f8425681c20

アプリケーションのログがJSONテキストで、フィールドを分けて、データベースのテーブルに追加できるスクリプトを作りました。
MySQL 5.7 から、JSON型が提供されたので、整形しないでそのまま追加すれば使えますが、抽出のSQLに慣れてなく、列で分けた方が視認性良いのでそうしてます。

[ 大まかな流れ ]

1) ログは逐次出力されるので、inotify で更新を待ち受け
2) ログの行が追加された時点で、発火
3) 最終行を取得して、sedとかgawkで変換
4) jqで各列値を取得
5) SQL文に整形して、INSERTコマンドを渡しテーブルに追加

[ コード例 ]


#!/bin/bash

### NextCloud log add to my table log ###

# $1 : SiteName (end part of URI) 
# required package: inotify-tools

## --------- const ------------- ##

FIELD_ARRAY=(reqId level time remoteAddr user app method url message userAgent version,)
INSSQL="INSERT INTO log_use (NM_SITE,"

INTERVAL_COMMIT=10         # 一括した時スキップするので
# in order to avoid 
# should write notify result to file. and check row count by wc. and write SQL script file

## ----------------------------- ##

nmsite=$1

watch_file=/home/ncdata/${nmsite}/nextcloud.log
#events=(-e CREATE -e MODIFY -e MOVED_TO)

cnt=0
argsql=""
cmdpost="";
while inotifywait -e MODIFY ${watch_file}; do
  row=`tail -n 1 ${watch_file}`
  echo ${row}
  echo "------------------------------------------------------------"

  # execute jq #
  #echo ${row} | jq
  
  #echo "-- method"
  #echo ${row} | jq -r '.method'
  let cnt++
  echo ${cnt}

  echo "-- SQL"
  cursql=${INSSQL}
  # Field part # 
  for fld in ${FIELD_ARRAY[@]}; do
    cursql=${cursql}${fld}","
  done
  cursql=${cursql}") VALUES ("
  cursql=`echo ${cursql} | sed 's/,,//g'`

  # Value part #
  cursql=${cursql}"'"${nmsite}"',"
  for fld in ${FIELD_ARRAY[@]}; do
    nmfld=`echo ${fld} | sed 's/,//'`
    curval=`echo ${row} | jq ."${nmfld}"`

    if [ ${nmfld} = "time" ]; then
      curval=`echo ${curval} | sed 's/\+[0-9][0-9]:[0-9][0-9]//'`
    fi

    cursql=${cursql}${curval}","
  done
  cursql=${cursql}");"
  cursql=`echo ${cursql} | sed 's/,);/);\n/g'`
  #cursql=`echo -e $cursql"\n"`
  #echo ${cursql}


  argsql=${argsql}${cursql}

  # Execute command #
  if [ ${cnt} -eq ${INTERVAL_COMMIT} ]; then
    #cmdpost=${CMD_SQL}${argsql}"'"
    echo ${argsql} > ${INSSQL_FILENAME}

    ## debug
    tmcur=`date "+%Y%m%d-%H%M%S"`
    #cp ${INSSQL_FILENAME} ${INSSQL_FILENAME}"."${tmcur}

    echo `ls -l ${INSSQL_FILENAME}`
    cmdpost=${CMD_SQL}${INSSQL_FILENAME}
    echo "-- MySQL shell command"
    #echo ${cmdpost}
    #`${cmdpost}`      ???????????? script incorrect

    # Write MySQL database #
    mysql -u???? -p????????? mytable < ${INSSQL_FILENAME}

    argsql=""
    echo "" > ${INSSQL_FILENAME}
    cnt=0
  fi


done

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

新しいLinuxの教科書 [ 三宅英明 ]
価格:2970円(税込、送料無料) (2023/1/20時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

UNIXという考え方—その設計思想と哲学
価格:2485円(税込、送料無料) (2023/1/29時点)

I/T系業界 バズワードとその本音

I/T業界は、うまく利用者をだまして、ファンを引き寄せ、洗脳化して収益を上げる習慣が昔からあると思います。
心地よいカタカナ英語をはやらせることが、その手段のひとつと思います。

[ ユーザーエクスペリエンスを喚起 ]
平たく直言すれば、ただの洗脳化と思います。

[ アベイラビリティゾーン ]
ちゃんと、日本語にして、適用可能領域 にしておけ

[ マーケットプレース ]
売り場、販売場所でよかろう

[ インストールメディア ]
導入媒体

[ コマンド ライン パラメーター ]
端末入力引数

[ エラー ]
例外

[ ステータス ]
状態

[ フェーズ ]
段階

[ デフォルト ]
既定

[ ローカライズ ]
他言語国際化だが、米国中心を基準とした、いなかが他国になってるので、そのまま使うのは日本人としては抵抗あります。

[ サインアップ、サインイン ]
最近、ログインからこの表現に変わってきていて、ログオン、ログインとの違いはっきり説明しろ、と思う。ログオンはマイクロソフト語なので、管理人はログインに統一。これからは、利用者認証に変えようと思う今日この頃。

[ ミッションクリティカル ]

高等学校卒業程度の人だったら、意味わかると思いますが、ちゃんと業務重要必要性度とかに変えておけと思う。

[ オーバーヘッド]
間接的処理に付帯する避けること出来ない負荷

難解IT略語がはびこる7つの理由

IT用語の漢字化希望

jQuery-ui テーマの動的変更

1)  JSPの自作カスタムタグを使った select を使う


<%@ taglib uri="/WEB-INF/htmythema.tld" prefix="MyThema" %>

2) 1) を使いたいところに配置


// マイテーマ選択用 //
      var themasel = "<MyThema:mythema realdir='' themaval='<%=cfg.getSeltheme()%>' />";

          // == 生成完了した時 == //
          gridComplete: function () {

      var THEMA_DIV = "<div style='float:right' id='mythemadiv'></div>";    

            // マイテーマ選択用 //
            $("#t_others").append(THEMA_DIV);
            $('#mythemadiv').html("MyTheme " + themasel);
            // テーマ変更 => リロード //
            $('#themasel').on('change', function () {
              $('#thmnm').val($(this).val());
              $('#thmchgform').submit();
            });

    <%-- テーマ変更用 --%>
    <%--<MyThema:mythema realdir="" themaval="<%=cfg.getSeltheme()%>"/>--%>
    <form id="thmchgform" method="post" action="export.jsp">
      <input type="hidden" name="thmchg" value="yes" />
      <input type="hidden" name="thmnm" id="thmnm" value="" />
    </form> 

3) 変更リクエストのactionは自ページで、変更内容はクッキーとセッションにセット (どっち使っても良いが、実際はセッションを使ってる)


  // テーマ変更で来た場合 //
  if (request.getParameter("thmchg") != null) {

    //  セッションに格納 //
    String thmnm = request.getParameter("thmnm");
    cfg.setSeltheme(thmnm);

    // クッキーに保存 //
    Cookie cookie = new Cookie("thema", thmnm);
    cookie.setMaxAge(60 * 24 * 60 * 60); //有効期間を60日間に設定
    response.addCookie(cookie);

  }

[ 画面例 ]

jQuery-ui テーマの設定と読込

[ 設定と読込 ]

    1. データベースにマスタを用意

CREATE TABLE `m_themacol` (
	`NM_THEMA` VARCHAR(20) NOT NULL COMMENT 'テーマ名',
	`NM_MENUCOL` VARCHAR(7) NOT NULL DEFAULT '' COMMENT 'メニュー背景色',
	`IS_DARKTHEME` TINYINT(4) NOT NULL DEFAULT '0',
	`TM_ADD` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '追加時刻',
	`TM_UPDT` DATETIME NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '最終更新時刻',
	PRIMARY KEY (`NM_THEMA`)
)
COMMENT='jQueryUIテーマ別色設定'
COLLATE='sjis_japanese_ci'
ENGINE=InnoDB
;
  1. Startupのサーブレットでデータベースを読込、public static な変数に格納
  2. JSPで読込み、pageContextに格納
  3. スタイルシートのファイル名またはディレクトリ名のテーマ名部分を、pageContextの変数にする

多言語化の方法

[ 基本的方法 ]

  1. データベースにマスタを用意
  2. JSPでデータベースのデータを読込、Javascriptの連想配列になった文字列を、pageContext に格納
  3. pageContext の連想配列を const した変数に格納
  4. 3. を jQuery の text, html に入れて表示。jqGridの場合は、constな変数に格納して使う
  5. 2.により、言語変更は、コード簡潔化の為、ページの再読込を必要とする

jqGrid colModel, colNames (JSONファイル読込)

列数が多かったり、複雑な設定の colModel の場合、ページと同じファイルに記述すると、長くわかりにくくメンテナンス性低下なので、JSONファイルを読み込んでます。

[ コード例 ]


  // 一覧表のcolModelをファイルから読み込む //
  $.ajaxSetup({async: false});     // <== 非同期を解除
  var shipmentColmodel;
  var tmpname;
  $.getJSON("shipment.json", function (json) {
    shipmentColmodel = json;
    var len = json.length;
    for (var i = 0; i < len; i++) {
      tmpname = shipmentColmodel[i]['name'];

      // ローカルストレージに保存した列幅にする //
      if (name_widthMap[tmpname]) {
        shipmentColmodel[i]['width'] = name_widthMap[tmpname];
      }

    }
  });
  $.ajaxSetup({async: true});   // <== 非同期に戻す

[ JSONファイル例 ]

— 省略 —

sqlite3 出来ないことのまとめ


本家リンク

直ぐに使えて、ちょっとしたデータ管理には便利な sqlite ですが、他のデータベースと同じように使うには無理で、機能がない部分が多いです。

  1. 認証がなく、ユーザーがない
  2. 他ホストからの接続ができない
  3. 同時多数接続大量処理 (テーブルがロックして更新出来ないことがある)
  4. CURRENT_TIMESTAMP がないので、関数を使う
  5. 列の削除ができない (ALTER TABLE tablename DROP columnname)
  6. ストアドプロシージャーがない (トリガーはある)
  7. 文字長がない (文字列型は全部 Text にする)
  8. 数値型が少ない (INTEGER, REAL, NUMERIC だけ)
  9. TRANCATE TABLE
  10. LEFT OUTER JOIN
  11. ALL, ANY

 

2019年 日本バドミントン

画像

< MS >

桃田健斗、今年も大活躍を期待してます。

 

< WS >

ちまたでは、奥原希望、山口茜の期待感大ですが、高橋沙也加と大堀彩に期待してます。どちらも左で長身、シングルスでは絶対優位です。

   

 

< MD >

遠藤/渡辺 (日本ユニシス) と、園田/嘉村 (トナミ運輸) の首位争いが今年も続くでしょう。

< WD >

福島/廣田 と 高橋/松友 の熾烈な首位争いに、昨年世界選手権制覇の 永原/松本 が参戦。春から始まる、五輪レースのポイント争いに一喜一憂することになるでしょう。(開催国枠とランキング枠の関係、何組出れるかわかってませんが)

2019年第2週 BWF WD ランキング

< XD >

昨年の日本人全英初制覇以来、一気に急浮上、東野有紗のど迫力ジャンプスマッシュが炸裂して、今年は世界ランキング1位をキープするでしょう

< M Team >

< W Team >

大隈重信 : 政治

政治は、学問や科学ではない。術である。人の心を知るという術なのです。
人の心を察する ーこう言うと悪くすると陰険らしくも聞こえるがそうではない。他人の苦は自己の苦しみであるという、ここの道場から多数の幸福が得られてよい政治が生まれるのです。