2019年7月22日月曜日

MySQL 自動バックアップ

MySQLバックアップの忘備録

1.バックアップ用シェル

#!/bin/sh

# Set mask for other user cann't read
#umask 077

# backup file
# Retention period
period=31

# directory for backup files
dirpath='/home/pi/backup/mysql'

# backup file naming
filename=`/bin/date +%y%m%d%H`

# excute
/usr/bin/mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=xxxxx| /bin/gzip > $dirpath/$filename.sql.gz
#/usr/bin/mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=xxxxx > /tmp/filename.sql

/bin/cp $dirpath/$filename.sql.gz $dirpath/today

# delete old backup files
oldfile=`/bin/date --date "$period days ago" +%y%m%d%H`
/bin/rm -f $dirpath/$oldfile.sql.gz

2.crontabの設定

0 2 * * *  /home/pi/prj/sql/mysql_backup.sh > /tmp/cron-bk.stdout 2 > /tmp/cron-bk.stderr || [ $? -eq 1 ]
15 12 * * *  /home/pi/prj/sql/mysql_backup.sh > /tmp/cron-bk.stdout 2 > /tmp/cron-bk.stderr || [ $? -eq 1 ]

Peace!!

2019年7月15日月曜日

テスト用DBを一発で初期化するbash

自分の忘備録

開発しているときは、テスト用DBを繰返し初期化する。
そのシェル。でも、僕以外にはほとんど利用価値はないかも、、、
ポイントは、DBにインポートするデータを集めたdirectoryを指定し
その中から、ファイル名だけを抽出してDB登録するシェルに渡す処理かも

自分用だから、説明はなし。

Peace!!

#!/bin/bash

# テスト用データのディレクトリー
files="../../data/*"
fileary=()
dirary=()

DB=DB名称
USER=ユーザ名
PW=パスワード

# DBのデータを削除して初期化する
mysql -u$USER $DB -p$PW << EOS
truncate hd;
truncate seibans;
update counters set value=0 where name='seibans';
EOS


for filepath in $files; do
    if [ -f $filepath ] ; then
        fileary+=("$filepath")
    elif [ -d $filepath ] ; then
        dirary+=("$filepath")
    fi
done

#echo "ファイル一覧"
for i in ${fileary[@]}; do
    qq=$i
    # pathを削除
    qqq="${qq##*/}"
    # ファイル名の拡張子を取る
    FILE=${qqq%.*}
    # テストデータDB登録
    ./reg.sh $FILE
done

#echo "ディレクトリ一覧"
#for i in ${dirary[@]}; do
#    echo $i
#done

2019年7月13日土曜日

Android studio 小ネタ

Android studio の備忘録、特に小ネタ
メモ代わりに追加していきます。

(1)既存のProject/Packageを利用して新しいPackageのProjectを作る


(2)既存のProjectを、OneDriveにコピーして利用する

Android Studioで開いて、build > Clean Project
そのまますると、スマフォへのインストール時に、古いWindows Pathを使おうとする。
そのエラーでインストールできなかったけど、このを実行したあとはインストールできた。コンソールに出るメッセージでも変わった事は確認できた。
これで、OneDriveを介して複数のPC間でプロジェクトを共有可能となった。
便利便利 (^^)/

Peace!!


2019年7月12日金曜日

Firebase ML KitのSample Package名を、新たなPackage名に変更する

あくまでも、忘備録

何を言っているかというと、、、まぁ、うまく伝えられないので、、、
簡単にいうと自分のPackage名(com.futureagri. )にしたい。
com.google.firebase.samples.apps.mlkit というながーいPackage名
それに、google さんのsamplesと入るのは、嫌だなぁ

Firebaseのプロジェクトもっており、アプリの登録もできるている事



ベタベタだけど、、、

(1) Package 名を決める
com.futureagri.app.xxx.hd
その名前で、Firebaseにアプリの登録を済ませる。

(2)ソースコードの修正
quickstart-android\mlkit\app\src\main\java\com\google\firebase\samples\apps\mlkit
のmlkitをコピーする。
この中にあるソースコードのPackage名を変更する。

com.google.firebase.samples.apps.mlkit を
com.futureagri.app.xxx.hd  に変更する。

(3) Android Studioで新規プロジェクトを作る
Start a new Android Studio project  を選び
Activityは、Add No Activity
次の画面にPackageの情報を入れれば取り合えず終わり。
Package名で指定したディレクトリーができている。

(4) 編集したソースコードをコピー
上記で出来たディレクトリーに(2)で編集したソースコードを入れる。

(5) いろいろなファイルのコピー
元々のmlkitのモノが使える。package名に対応した変更は必要。
ただし、mlkitのモノをそのまま全部入れない。
AndroidManifest.xml、\res以下のリソースファイルを確認しながら内容や、ファイルをコピーした。

(6) Android Studio立上げ
syncやBuildなどを行う。エラーがでてくるのでよく見ると、
比較的容易に集積できる。
build.gradle は2つあるが、それぞれの確認も必要です。

ここは少し時間がかった。エラー修正を少し繰り返し30分程度試行錯誤。

(7)BuildとInstall
数回繰り返して、Android デバイスにインストール。
File > Invalidate Cashes /Restart.... も行い。
Buildしなおして、OK

obsolete とwarningがでるけど、、、なんでだろう?

packageを変える方法は、他にもWebに載っているので、、、

これで、楽しい事がいろいろできる。(^^)/

Peace!!


2019年7月11日木曜日

MariaDB 思いっきりドーンとtable 作成


#!/bin/bash

DB=DB名
USER=ユーザ名
PW=パスワード

#CLMS1="tana, date, hinc, kata, katad"
#select count(*) from $TBL1 where $1 like "$2";
#select $CLMS1 from $TBL1 where $1 like "$2";
#show columns from zaiko;

mysql -u$USER $DB -p$PW << EOS
create table counters (name char(16), value int);
create table seibans (
seiban_id int,
seiban char(8),
seiban_name varchar(120),
hd_kpn int,
hd_end_id char(5),
hd_end_at char(14),
person_id char(5),
create_at char(14));
create table units (part_number int,rev_cnt int,hinc char(32),hink char(3),updata_header_count int,update_data_count int,drawing_name char(30),parts_numbers int,effect_records int,model_name varchar(120),unit_name varchar(120),model_code char(12),target_roth char(10),drawing_number_old char(30),quantity int,approval_id char(5),approval_at char(14),update_design_id char(5),update_design_at char(14),drawer_id char(5),update_drawing_at char(14),start_at char(14),end_at char(14),disabled_at char(14),regist_id char(5),regist_at char(14),update_id char(5),update_at char(14),delete_id char(5),delete_at char(14));
create table hd (
seiban char(8),
seiban_id int,
pos int,
update_info varchar(120),
code char(10),
layout_no varchar(120),
sharp varchar(6),
name varchar(120),
kata varchar(120),
spec varchar(120),
maker varchar(60),
members int,
total_members int,
payout_flag char(1),
remarks varchar(120),
update_reason varchar(120),
del_flag char(1),
kpn int,
tana char(32),
part_number int,
hinc char(32),
hink char(3),
regist_id char(5),
regist_at char(14));
insert into counters values('payouts', 0);
insert into counters values('seibans', 0);

EOS

Peace!!



unit 無い場合 changed 190722


#!/bin/bash

DB=DB名
USER=ユーザ名
PW=パスワード

#CLMS1="tana, date, hinc, kata, katad"
#select count(*) from $TBL1 where $1 like "$2";
#select $CLMS1 from $TBL1 where $1 like "$2";
#show columns from zaiko;

mysql -u$USER $DB -p$PW << EOS
drop table counters, seibans, hd;
create table counters (name char(16), value int);
create table seibans (
seiban_id int,
seiban char(8),
seiban_name varchar(120),
hd_kpn int,
hd_quantity int,
hd_dest char(64),
hd_fjkn char(4),
hd_end_id char(5),
hd_end_at char(14),
person_id int,
create_at char(14));
create table hd (
seiban char(8),
seiban_id int,
pos int,
update_info varchar(120),
code char(10),
layout_no varchar(120),
sharp varchar(6),
name varchar(120),
kata varchar(120),
spec varchar(120),
maker varchar(60),
members int,
total_members int,
payout_flag char(1),
remarks varchar(120),
update_reason varchar(120),
del_flag char(1),
kpn int,
tana char(32),
part_number int,
hinc char(32),
hink char(3),
regist_id char(5),
regist_at char(14),
regist_end_at char(14));
insert into counters values('payouts', 1);
insert into counters values('seibans', 1);
EOS



Shell scripts for MariaDB


1.mariaDBをログインしないでShell Scriptで使う例


#!/bin/bash

# variable check
if [ $# -ne 2 ]; then
    echo -n "Usage: "
    echo -n `basename $0`
    echo  " target-clolumn target-word"
    exit 1
fi

DB=データベース名
USER=ユーザ
PW=パスワード
TBL1=テーブル名
#CLMS1="tana, date, hinc, kata, katad"
CLMS1="tana, hinc, kata, katad"

mysql -u $USER -p$PW $DB << EOS
#select count(*) from $TBL1 where $1 like "$2";
select $CLMS1 from $TBL1 where $1 like "$2";
#show columns from zaiko;
EOS

上記を呼び出して使うShell Script

#!/bin/bash

DT=`cat ./target1.txt`
while read line
do
    #echo -------------------------------------------------
    tt=$line
    echo ">>> $tt"
    ./slct01.sh kata $tt
    #echo $line
done << FILE
$DT
FILE

2.バックアップ用のShell script

#!/bin/sh
# Set mask for other user cann't read
umask 077

# backup file
# Retention period
period=31

# directory for backup files
dirpath='/home/pi/backup/mysql'

# backup file naming
filename=`date +%y%m%d`

#DB=データベース名
USER=ユーザ
PW=パスワード

# excute
mysqldump --opt --all-databases --events --default-character-set=binary -u$USER --password=$PW | gzip > $dirpath/$filename.sql.gz

# delete old backup files
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz

3.テストデータを insert する時の例

例は、2つのテーブルにテスト用の値を設定している。
テーブルのデータを削除するのは、

truncate seibans;
truncate  counters;

#!/bin/bash

DB=データベース名
USER=ユーザ
PW=パスワード
TBL1=seibans
TBL2=counters

# 配列宣言(-a)
declare -a sbn=()
# 初期化
declare -a sbn=("11111-11" "12345-76" "88888-99" "12345-56" "12345-89" "99999-00" "12345-66" "19625-01" "12345-67" "19625-02")

i=0
j=0
for e in ${sbn[@]}; do
    #echo "sbn[$i] = ${e}"
    let i++
    let j++
    aa=`date '+%s' | awk '{print strftime("%Y%m%d%H%M%S", $1)}'`
mysql -u $USER -p$PW $DB << EOS
insert into $TBL1 values ($j, '${e}', '${e}', 0, '11111', '$aa', '11111', '$aa');
EOS
done

mysql -u $USER -p$PW $DB << EOS
insert into $TBL2 values ('payouts', 1);
insert into $TBL2 values ("seibans", 1);
EOS

Peace!!

MyLife

僕の趣味は、こんな感じ、、、
この為に、働いているのだぁ、、、はず (^^)
Kayak, Climbing, Music, Skateboard, Airplane

Kayak

いきててよかった。良い子は真似しないようにね。

ハンドロール

2019年 春遠征

古い写真

2014/9 奈良吉 増水

Climbing

前穂高岳登頂(徳沢ー奥又白池泊ーA沢ー前穂高岳)

僕が前穂高岳に登った理由など、、、(^^)

Music

Please wait!!

Skateboard

Please Wait!!

Air Plane

Soon!!

Peace!!

Robotics

僕が開発してるロボットについて、要素技術も含めてまとめ?
いえ、自分の整理用

1.開発ポリシー、概要

自律搬送クローラロボットの開発情報のまとめページ

2013年に最初に書いたロボットの 考え方
基本は変わっていません。

2.RDCS


3.要素技術

3.1 SLAM関係
Raspberry Piで、低コスト Lidar SLAMTEC RPLIDAR A2 を使う

3.2 OpenCV


An Installation of OpenCV4 on Raspberry Pi 3B+ & 4B

Java がインストールされている事が前提。

LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1.2.0 python3


Peace!!

はじめに、、、再出発

再出発します。。。

2019国際ロボット展に出展するので、、、
超バタバタ、、、

少しづつ書きます。



昔の "はじめに" は  こちら

Peace!!

Install

インストール関連をまとめました。

1. Lighttpd

インストールShell

2. MySQL ans MariaDB

Raspberry Pi に インストール

X. 本を書いたときのインストール関連

こちら、、、

Peace!!

Raspberry Piで製造業向け業務システム開発

主に製造業の業務システムをRaspberry Piを使って開発しています。
それに関係する情報をまとめている

<特徴>
・倉庫管理、製造現場への払いだしをAIAGVを活用し統合的に行うシステムです。
・生産管理システムと連動し、実棚管理を行います。在庫評価シミレーションも行えます。
・各種伝票、倉庫内の部品のシールをスマフォ上でAIを使った自動認識し他システムと連します。
     受注管理システムへの手入力
     従来の棚卸(棚卸表→EXCEL→システム取込み)工程を無くします。
・倉庫管理(受入れ、入出庫:棚管理、製造計画に基づいた払出し)をAIを搭載したスマフォを使って効率的に行います。
AGVとの連携も行い、複数の払出を同時に行います。
・払出し、出庫は最小経路を算出し、スマフォに画面に表示、もしくはAGVのコンソールに表示します。
・電脳(株式会社エクサ)と連携可能です。
・サーバはRaspberry Piを業務システム用にハードウェア面を補強し活用しています。それにより圧倒的なコストパフォーマンスを実現します。

こんな感じかなぁ(笑)
以下は、その為の要素技術の忘備録、、、

1.MariaDB

コマンドをまとめた
テスト用DBを初期化し作成するシェル
      開発中は、繰り返し使うので便利
shell script で MariaDBにアクセスする
mysqlでインポートしたDBのユーザのパスワード再設定

MariaDB 思いっきりドーンと シェルでtable 作成

2.Android

僕的には超重要 AsyncTaskによるDB非同期処理をListenerを使ってクラス化
重要 Android 非同期処理でサーバサービスを利用する
Android Studioの小ネタ
mlkit#901をシンプルに動かすためのメモ
mlkit#901 シンプルに動かす 変更編
mlkitのPackageを変える(意外と手間)

3. lighttpd

インストール

4. Oracle

SQL*Plusをバッチで自動実行させる為にMinGW環境でsql文を自動生成する

Peace!!

MariaDB memo

開発で、日常的に使うのでメモ

2019-07-10-raspbian-buster-lite より
インストールは、mysql-server ではできない。
sudo apt-get -y install mariadb-server

status;  で表示される情報
mariadb  Ver 15.1 Distrib 10.1.38-MariaDB, for debian-linux-gnueabihf (armv7l) using readline 5.2


(1) 検索について

結局大事なのは検索で、メモとして追加
NULL 検索をするとKeyも無視するらしいので、NULLを使ってはならない。

棚番号にXXXXが入って無く、かつdataに20%の値が設定されている。
select tana,hinc from zaiko where tana != "XXXX" and date like '20%';

カラムをグレイヴ アクセントで囲み検索条件をシングルクォーテーション
select count(*) from zaiko
where `tana` like '%CHC%' and `data` like '20%';


(2) Login

mariadb -uroot db -pxxxxx
mariadb -uroot -p -h ホスト名


(3) DB処理

select * from zaiko;
select * from zaiko where id = 10;
select * from zaiko where hinc like('% style="font-size: 10pt;"%');
insert into counters values('payouts', 0);
insert into counters values('seibans', 0);i
nsert into users (name) values ('かばかば');
insert into user (id, name) values (2, 'kaba');
insert into profiles (name) select users from users where users.id = 1;
update users set name='kayak', status=3 where id=1;
delete from wakuwaku where kimoti like "waku%" and fuku <> "hadaka";

・例)検索してREPLACEで置換
update ship set post_kayakp = replace(post_content, 'style="font-size: 12pt;"', '') where kayak like('% style="font-size: 12pt;"%');


(4) DB import export


・import
入力ファイルはテーブル名
mysqlimport -uthn -pxxxxux --fields-terminated-by="|" 
 --lines-terminated-by="\n" --local test /home/pi/tmp/t1.csv
test.t1: Records: 21  Deleted: 0  Skipped: 0  Warnings: 0

mysqldump -uuser  -p -t database table1 table2 ... > backup-file.sql

DBの場合
mysql -uuser -p database < backup-file.sql

・export
出力先は/tmpにしないとエラーになる。
DB名test, DB内にはtable名t1のみ、結果は  /tmp/t1.txt  となっている。
sudo rm /tmp/t*; mysqldump -uroot -pxxxxx --tab=/tmp  
 --fields-terminated-by='|' test

・コマンドライン
load data local infile “./test.csv” into table t1
 fields terminated by “,” lines terminated by “\r\n”;
出力先は/tmpにしないとエラーになる。
select * fromt1 into outfile ‘/tmp/te.csv’ 
 fields terminated by ‘|’ lines terminated by ‘\n’;


(5) DB, Table 作成、管理


・DB作成
create database DB名称;

・DB削除
drop database DB名称;

・例)DB作成とテーブル作成
create database wm;
create table wm.zaiko(hinc CHAR(32),
 hin CHAR(35),
 kazu int(6),
 hink CHAR(3),
 kata CHAR(200),
 hin2 VARCHAR(300),
 tana CHAR(32),
 yearin char(4),
 monthin char(2),
 date char(14),
 koushin datetime,
 other VARCHAR(256)
);
Query OK, 0 rows affected (5.89 sec)

・例)テーブル作成
cretat table t1(id int, name varchar(128), atr varchar(128));
  `id` int(11) default null,
  `name` varchar(128) default null,
  `atr` varchar(128) default null,
  `txt1` varchar(128) default null,
  `txt2` varchar(128) default null
) engine=InnoDB default charset=utf8mb4;

・テーブル確認
describe t1; 

・プライマリーキーの追加
alter table テーブル名 add primary key (カラム名);

・カラム名と型を変更
alter table `posts` change column `txt` `caption` varchar(255);

カラムの名前だけを変更する場合でも、上記のように型指定が必要
not null制約を追加する場合です。カラム名の制約を追加

alter table `posts` change column `txt` `caption` varchar(255) not null;

・カラムの型を変える
alter table `comments` modify column `post_id` bigint not null;

・カラム追加
alter tableとADDを使用してカラムを追加。
after 指定でpasswordカラムの後ろに、kayak_idカラムが追加
先頭に追加する時は、first  を指定する。

alter table users add kayak_id int(11) default null;
alter table users add kayak_id int(11) default null after password;
alter table users add kayak_id int(11) default null first;
alter table t1 addtxt2 varchar(128);
alter table t2 addtxt1 varchar(128) after txt1;
alter table seibans add fjkn char(4) after hd_kpn;
alter table hd add payout_flag char(7) after total_members;

・カラム削除
alter table hd drop payout_flag;

・テーブル内のデータを削除する。データだけの削除。
truncate t1;

・テーブルを消す
mariadb -uuser database -p 
drop table if exsts table1, table2,,,,;


(6) Utility


status;
show databases;
show columns from zaiko;
select count(*) from zaiko;
select version();
show variables;
show variables like "char%";
show variables like 'slow%';

use mysql;
select * from user;


(7) ユーザ管理


・ユーザー確認
select user from mysql.user;

・ユーザ追加とパスワード設定
create user 'ユーザ名'@'localhost' identified by 'ここにパスワード';
create user 'kayak'@'localhost' identified by 'password';

・ユーザーのパスワードを変更
set password for kayak@localhost=password( 'kayakPassword' );

・ユーザーを削除
drop user ユーザー名@ホスト名;

・ユーザー権限を確認
show grants for wordpress@localhost;
show grants for 'kayak'@'%';

・権限を追加 
grant all privileges on DB名.テーブル名 to 'ユーザ名'@'localhost';
mariadb 10.1.37では、上記のDB名.テーブル名は、シングルコーテーションで
囲むとエラーになる。従って、下記のようにする。
grant all privileges on TESTDB.* to 'user'@'localhost';

grant select on `kayakdb`.`users` to 'kayak'@'%'
grant file on *.* to kayak@localhost;

まとめると、、、
・グローバルレベル.sql
全DBの全テーブルに対して、与える権限を与える
grant 与える権限 on *.* to user名;

・データベースレベル.sql
指定したDB名の全テーブルに与える権限を与える
grant 与える権限 on DB名.* to user名;

・テーブルレベル.sql
指定したDB名の指定したテーブル名に与える権限を与える
grant 与える権限 on DB名.テーブル名 to user名;

・変更を反映さえる
flush privileges;


(8)開発環境を作る


sudo apt-get install default-libmysqlclient-dev
gcc slct01.c -o slct01 -lmysqlclient -L/usr/lib/arm-linux-gnueabihf

libmariadbclient-dev は、必要無いのかしら、、、


 Peace!!