JAVA クラス指定デバッグ出力メソッド

デバッグする時、NetBeansのデバッグで止めてチェックしたりするのが、じゃまくさく、時間かかるので、止めてみて終了させる必要ない場合用に、System.out.println() で見れるようにしてます。

[ 出力例 ]

===============================
Class : vesselsch.Polygon
——————————-
lats : [D@de31cc6
lons : [D@2cdf0ade
polynm : null
latsList : null
lonsList : null
id_poly : 0
nm_poly : 謎の海域ふな
cd_unlo : JPFNB
tp_poly : OT
nm_route :
cnt_corner : 0
latmid : 0.0
lonmid : 0.0
m_depth : 0.0
===============================

配列型がとれてないので、改良予定

[ クラス例 ]


package vesselsch;

import java.util.ArrayList;
import java.util.Arrays;


/**
 * GoogleMap 多角形型
 * @author 田中尚
 */
public class Polygon {
  
  private double[] lats;      // 座標緯度
  private double[] lons;      // 座標経度
  private String polynm;
  
  private ArrayList<Double> latsList = null;    // 未使用
  private ArrayList<Double> lonsList = null;    // 未使用
  
  private int id_poly;
  private String nm_poly;
  private String cd_unlo;
  private String tp_poly;
  private String nm_route;
  
  private short cnt_corner;
  private double latmid;
  private double lonmid;
  
  private float m_depth;       // 水深

[ 埋め込み例 ]

JSONリクエストのセット状況


    // JSONデコードはリフレクションで行う // 
    PolygonDtl POD = new PolygonDtl();
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    Type type = new TypeToken<PolygonDtl>() {
    }.getType();
    POD = gson.fromJson(jsn, type);

    // Javascriptで"が消せないので //
    //POD.setCd_facil(POD.getCd_facil().replaceAll("\"", ""));
    if (POD.getCd_facil() != null) {
      if (POD.getCd_facil().equals("")) {
        POD.setCd_facil("ZZZZZ");
      }
      else {
        POD.setCd_facil(POD.getCd_facil().substring(0, 5));
      }
    }

    // -- debug
    MyBatisParent mb = new MyBatisParent();
    mb.printFieldValueList(POD);

MySQL CSV文字列位置指定取得

よく使うので、関数にしてます。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_csv_idxtxt_int`(
	`src` varchar(300),
	`idx` smallint

)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'CSV列指定位置取得'
begin

declare rtnvalcsv int;

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(src, ',', idx), ',', -1) INTO rtnvalcsv;

return rtnvalcsv;

end

MySQL 日付指定年齢関数

誕生年月日を渡せば、今日の年齢を返します。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_age_by_birthdate`(
	`bdate` date

)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '日付値指定年齢取得スカラー関数'
begin
  declare agetoday int;
  select year(current_date) - year(bdate) - (right(current_date, 5) < right(bdate, 5)) into agetoday;
  return agetoday;
  
end

DATE型値をキャストなしで部分文字列取得できます。

下は今日以外を指定した年齢取得


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_age_by_birthdate_tgtdt`(
	`bdate` date,
	`tgtdt` date
)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '日付値指定年齢取得スカラー関数'
begin
  declare agetoday int;
  select year(tgtdt) - year(bdate) - (right(tgtdt, 5) < right(bdate, 5)) into agetoday;
  return agetoday;
  
end

[ 利用場面 ]

MySQL 記号除去関数

各社から提供されるデータの船名を結合させて処理する時、船名内の記号、スペースの扱いがまちまちで、使えないので作ってみました。
正規表現使えば、すっきりして、新規出現にも対応できると思いますが、今のところ支障なく使えてるので、不都合に遭遇したら、作り変えます。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_extract_symbol`(
	`src` varchar(250)

)
RETURNS varchar(250) CHARSET utf8
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '記号除去関数'
begin

return
replace(replace(replace(replace(replace(replace(replace(src, ' ', ''), '*', ''), '.', ''), '-', ''), ',', ''), '(', ''), ')', '');

end

MySQL 言語指定曜日スカラー関数

昔、MySQLで初めて作った、ユーザー定義関数です。
言語を付け足していけば、拡張できます。RETURNS の CHARSET は必要に応じて変更してください。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_dofwtxt`(
	`idx` tinyint,
	`langcd` varchar(4)

)
RETURNS varchar(20) CHARSET sjis
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '言語指定曜日文字列スカラー関数'
begin
  declare res varchar(12);
  
  if (langcd = 'jp') THEN
  	select 
  	  case (idx)
  	  when 2 then '月'
  	  when 3 then '火'
  	  when 4 then '水'
  	  when 5 then '木'
  	  when 6 then '金'
  	  when 7 then '土'
  	  when 1 then '日'
  		end as restxt into res;
  
  END IF;
  
  if (langcd = 'jpp') THEN
  	select 
  	  case (idx)
  	  when 2 then '(月)'
  	  when 3 then '(火)'
  	  when 4 then '(水)'
  	  when 5 then '(木)'
  	  when 6 then '(金)'
  	  when 7 then '(土)'
  	  when 1 then '(日)'
  		end as restxt into res;
  
  END IF; 
	
  if (langcd = 'ens') THEN
  	select 
  	  case (idx)
  	  when 2 then 'Mon'
  	  when 3 then 'Tue'
  	  when 4 then 'Wed'
  	  when 5 then 'Thu'
  	  when 6 then 'Fri'
  	  when 7 then 'Sat'
  	  when 1 then 'Sun'
  		end as restxt into res;
  
  END IF; 
	
  if (langcd = 'cnp') THEN
  	select 
  	  case (idx)
  	  when 2 then '(星期一)'
  	  when 3 then '(星期二)'
  	  when 4 then '(星期三)'
  	  when 5 then '(星期四)'
  	  when 6 then '(星期五)'
  	  when 7 then '(星期六)'
  	  when 1 then '(星期天)'
  		end as restxt into res;
  
  END IF;  		 	
	 
  
  return res;
end

Firebird の特徴

Firebird 日本ではあまり使われてませんが、海外ではMySQL, PostgreSQL と同じ位使われ、三大OSSデータベースのひとつと言われてます。
特徴、列挙すると、

1) 管理が少なく、ほっておいても雑草のようにちゃんと動く
2) プアな環境でも動き、ハードコスト、利用コストを抑えられる
3) 一通りの機能は揃っていて、他DBからの移行も容易
4) トリガ、ストアド、ストアド導出テーブル、ユーザー定義関数、揃っていて海外ではスモールオラクルと言われてる
5) データベース毎にファイルが1個で管理しやすい
6) Windowsでも使いやすい
7) SQLが標準に近く、くせが少ない
8) サーバー用のsuper serverと組込用のclassic server に別れ、組込用途で使いやすい
9) 文字コードの対応が豊富
10) インストール容量が小さく、すぐに準備出来る
11) 自作UDFを組み込める
12) 日本語の情報は少ないが、外国語のは多く、ロシア語、ポルトガル語、インドネシア語の情報が多い
13) IDEが豊富にあり、好みで選べる
14) コマンドラインの isql で mysql, psql と同等の事が出来、ステータス確認用SQLも普通に揃ってる
15) チューニング項目が少なく、何もしなくても高パフォーマンスが得られる

本家 Home : https://firebirdsql.org/

IBPhoenix : https://www.ibphoenix.com/

Wikipedia : https://ja.wikipedia.org/wiki/Firebird

日本ユーザー会 : http://tech.firebird.gr.jp/firebird/index.php?firebird_xsite=0

キムラデービーブログ : http://blog.kimuradb.com/

sqlite3 基本コマンドのまとめ

.table : テーブルの一覧


sqlite> .table
log_apacheaccess  log_df            log_jstat         log_rsyncbackup 
log_apachests     log_dircntsz      log_loadave       log_rxtx        
log_cpu           log_free          log_ping          log_videoupload 

.schema : 指定したテーブルの show create table


sqlite> .schema log_free
CREATE TABLE "log_free" ("tm" timestamp NOT NULL ,"used" integer NOT NULL ,"free" integer NOT NULL );
CREATE UNIQUE INDEX log_free_tm on log_free(tm);

.exit : 終了

.quit : 終了

.show Shell設定状態表示


sqlite> .show
     echo: off
  explain: off
  headers: off
     mode: list
nullvalue: ""
   output: stdout
separator: "|"
    stats: off
    width: 
sqlite> 

.database : 使用中のデータベースを表示


seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /home/sqlite/logs                                         

.help : ヘルプを表示


.backup ?DB? FILE      Backup DB (default "main") to FILE
.bail ON|OFF           Stop after hitting an error.  Default OFF
.databases             List names and files of attached databases
.dump ?TABLE? ...      Dump the database in an SQL text format
                         If TABLE specified, only dump tables matching
                         LIKE pattern TABLE.
.echo ON|OFF           Turn command echo on or off
.exit                  Exit this program
.explain ?ON|OFF?      Turn output mode suitable for EXPLAIN on or off.
                         With no args, it turns EXPLAIN on.
.header(s) ON|OFF      Turn display of headers on or off
.help                  Show this message
.import FILE TABLE     Import data from FILE into TABLE
.indices ?TABLE?       Show names of all indices
                         If TABLE specified, only show indices for tables
                         matching LIKE pattern TABLE.
.load FILE ?ENTRY?     Load an extension library
.log FILE|off          Turn logging on or off.  FILE can be stderr/stdout
.mode MODE ?TABLE?     Set output mode where MODE is one of:
                         csv      Comma-separated values
                         column   Left-aligned columns.  (See .width)
                         html     HTML <table> code
                         insert   SQL insert statements for TABLE
                         line     One value per line
                         list     Values delimited by .separator string
                         tabs     Tab-separated values
                         tcl      TCL list elements
.nullvalue STRING      Use STRING in place of NULL values
.output FILENAME       Send output to FILENAME
.output stdout         Send output to the screen
.print STRING...       Print literal STRING
.prompt MAIN CONTINUE  Replace the standard prompts
.quit                  Exit this program
.read FILENAME         Execute SQL in FILENAME
.restore ?DB? FILE     Restore content of DB (default "main") from FILE
.schema ?TABLE?        Show the CREATE statements
                         If TABLE specified, only show tables matching
                         LIKE pattern TABLE.
.separator STRING      Change separator used by output mode and .import
.show                  Show the current values for various settings
.stats ON|OFF          Turn stats on or off
.tables ?TABLE?        List names of tables
                         If TABLE specified, only list tables matching
                         LIKE pattern TABLE.
.timeout MS            Try opening locked tables for MS milliseconds
.trace FILE|off        Output each SQL statement as it is run
.vfsname ?AUX?         Print the name of the VFS stack
.width NUM1 NUM2 ...   Set column widths for "column" mode
.timer ON|OFF          Turn the CPU timer measurement on or off

詳しくは : https://qiita.com/sotetsuk/items/cd2aeae4ba7e72faad47

Tomcat 他ユーザー所有のディレクトリにファイルが書き込めない時の対応

Tomcat9 からTomcatが他ユーザーのディレクトリにデフォルトでファイル書込み出来なくなってるので、startup.shを変更してます。
書込みパーミッションのマスクを外す


export UMASK="0022"

Linux ファイル権限について : https://qiita.com/shisama/items/5f4c4fa768642aad9e06

Tomcat ヒープメモリの設定

 

 

setenv.sh に記述

[root@???? ????]# lv setenv.sh

#JAVA_OPTS="-Xms4096m -Xmx8192m -XX:MaxPermSize=4096m -verbose:gc -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true"
CATALINA_OPTS="-Xms6144m -Xmx6144m -XX:PermSize=2048m -XX:MaxPermSize=4096m -XX:-UseGCOverheadLimit -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true"

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

Tomcatハンドブック
価格:5170円(税込、送料無料) (2023/1/11時点)

楽天で購入

 

 

JAVA jps jstat の利用と応用

1) jps コマンドで、今動いてるJAVAのプロセスを確認

2) jstat で Javaのメモリ使用状況を確認

3) メモリ使用状況のログ追加と、警告メール配信

[ ログテーブルのスキーマ ]


sqlite> .schema log_jstat
CREATE TABLE log_jstat (
tm timestamp not null,
pid integer not null,
pnm text not null,
S0C real not null, 
S1C real not null,
S0U real not null,
S1U real not null,

EC real not null,
EU real not null,
OC real not null,
OU real not null,
ttlCapM integer not null default 0, 
ttlUseM integer not null default 0,
ttlRT   integer not null default 0);
CREATE INDEX log_jstat_tm on log_jstat (tm);
CREATE TRIGGER log_jstat_ai after insert on log_jstat for each row
begin
update log_jstat
set
ttlCapM = cast((S0C + S1C + EC + OC) / 1024 as int),
ttlUseM = cast((S0U + S1U + EU + OU) / 1024 as int),
ttlRT = cast((S0U + S1U + EU + OU) / (S0C + S1C + EC + OC) * 100 as int)
where
tm > current_date || ' 00:00:00';
end;
sqlite> 

[ Shellコードサンプル ]


#! /bin/bash

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

TMP_OUT_FILENAME_JPS=/home/sqlite/sql/jps.txt
TMP_OUT_FILENAME_JSTL=/home/sqlite/sql/jstl.txt

SQL_OUT_FILENAME=/home/sqlite/sql/tmp_jstl_add.sql
DBNAME=/home/sqlite/logs
INSERT_DML="insert into log_jstat (tm, pid, pnm, S0C,S1C,S0U, S1U, EC, EU, OC, OU) values (datetime('now','localtime'), "
echo $INSERT_DML

LAST_URATIO_SQL="SELECT mount, uratio FROM log_df ORDER BY tm DESC LIMIT 0, 3;"
LAST_URATIO_SQL_FILENAME=/home/sqlite/sql/lastgcratio.sql

GC_OUT_TEXTFILENAME=/home/ApacheDoc/APIStatus/tmpgcres.txt

LAST_URATIO_RES_FILENAME=/home/sqlite/sql/lastdf.txt
LAST_URATIO_RES_FILENAME2=/home/sqlite/sql/lastdf2.txt

WARN_TEMPLATE_FILENAME=/home/ssmtptxt/dfwarn.txt
WARN_TMP_FILENAME=/home/ssmtptxt/tmp_dfwarn.txt
WARN_TMP_FILENAME2=/home/ssmtptxt/tmp_dfwarn2.txt

MAX_ALLOWED=89

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

fmtnow=`date +%Y-%m-%d' '%H:%M:%S -d today`
echo "------------------- "$fmtnow" -------------------"

/usr/bin/jps | grep Bootstrap > ${TMP_OUT_FILENAME_JPS}
cat ${TMP_OUT_FILENAME_JPS}

#exit 0

# Write temporaly SQL file ##

echo -n > ${SQL_OUT_FILENAME}

pid=""
pnm=""
jstatres=""
inssql=""
cat ${TMP_OUT_FILENAME_JPS} | while read line
do
  pid=`echo ${line} | gawk '{print $1}'`
  pnm=`echo ${line} | gawk '{print $2}' | sed -e 's/^/"/' -e 's/$/"/'`
  echo ${pid} ${pnm} 

  jstatres=`jstat -gc ${pid} | grep -v S0C | gawk '{print $1","$2","$3","$4","$5","$6","$7","$8}'`
  #echo ${jstatres} 
  inssql=${INSERT_DML}${pid}","${pnm}","${jstatres}");"


  echo ${inssql} >> ${SQL_OUT_FILENAME}
done

cat ${SQL_OUT_FILENAME}
#exit 0


# Write sqlite database #
/usr/bin/sqlite3 ${DBNAME} < ${SQL_OUT_FILENAME}


# Output last res by sqlite (uratio updated by trigger) #
/usr/bin/sqlite3 $DBNAME < ${LAST_URATIO_SQL_FILENAME} > ${GC_OUT_TEXTFILENAME}

exit 0

echo "--- each uratio ---"
#cat ${LAST_URATIO_RES_FILENAME}
#cat ${LAST_URATIO_RES_FILENAME} | sed -e 's/|/;/g'  > ${LAST_URATIO_RES_FILENAME2}
#exit 0

# Loop and send a mail #
tmpmp=""
tmprt=0
wrntxt=""
wrncnt=0
while read line
do
  #echo ${line}

  tmpmp=`echo ${line} | gawk -F"|"  '{print $1}'`
  tmprt=`echo ${line} | gawk  -F"|" '{print $2}'`
  echo ${tmpmp}":"${tmprt}

  if [ ${tmprt} -gt ${MAX_ALLOWED} ]; then
    wrntxt=${wrntxt}${tmpmp}":"${tmprt}"%zzzzz"
    #wrntxt=`echo -e ${wrntxt}${tmpmp}" : "${tmprt}"%  \n"`
    #wrntxt=`echo ""${wrntxt}`
    let wrncnt++
  fi

done < ${LAST_URATIO_RES_FILENAME}

# send a mail by ssmtp #
if [ $[wrncnt] -gt 0 ]; then
  cp ${WARN_TEMPLATE_FILENAME} ${WARN_TMP_FILENAME}
  echo ${wrntxt} >> ${WARN_TMP_FILENAME}
  cat ${WARN_TMP_FILENAME} | sed 's/zzzzz/\n/g' > ${WARN_TMP_FILENAME2}

  echo "" >> ${WARN_TMP_FILENAME}
  echo "Issued Time : "`date`  >> ${WARN_TMP_FILENAME}

  /usr/sbin/ssmtp -t < ${WARN_TMP_FILENAME2}
fi

echo "------------------------------------------------"



4) cronにセットしてスケジュール実行


## Intervaled jstat log add ##
1,21,41 * * * * root /home/sh/jstatcheck.sh >> /home/Log/last_jstatlogadd.log 2>&1

5) メモリ使用状況ログをページで表示