ESP32のRoverのDevkitじゃないやつ。でWioLTEコントローラーを作りました。
RoverのDevkitじゃないやつはこれね。(笑)

参考までにピン配置の代わりとして
左右に裏の画像をくっつけております。
電池で動かしたいので電流測定結果。
リレーON時 150mA
WIO-LTEを外した場合 70mA
リレーOFF時 2mA
ESP32も外した場合 2mA
つまり、3.3Vを作るために使用している3端子レギュレーターですが、
これだけで2mA消費しているってことです。
低損失三端子レギュレーター 3.3V1A BA033CC0T
[BA033CC0T]
データシートによるとバイアス電流が標準2.5mA、最大5mAってなってて、
データシートの測定環境がTa=25℃、Vctrl=5V、Io=500mAとなっており、
ま、2mAぐらいは妥当な数字として。結構消費電力多いね。
違うレギュレーター使えば、半分以下にできそうですね。
WioLTEは気難しくて、少しでも電圧が電流が足りないと、ちゃんと動いてもらえません。
もしかしたら、回路の接点の抵抗とか考慮すると、5.1VのACアダプタを用意した方が良いのかもです。
回路

WioLTEの復習と省電力モードのテスト。
WioLTEを使用して色々記事を書いておりましたが、
こんかい、またもや、LTEで電波飛ばしたい人が現れまして、
またまた。バッテリ駆動のIoTの記憶を呼び起こして、
WioLTEの基礎データを取っていきたいと思います。
過去記事:https://search.ameba.jp/search/entry/WIO.html?aid=fc2miha
とりあえず、環境を作成していきます。
https://ameblo.jp/fc2miha/entry-12833772932.html
なんか若干異なるけど、大体そのままいけます。
前の記事では結局、リレーでWioLTE自体の電源をON/OFFして
待機時のWioLTEの電源をゼロにするっていう解決策を取りました。
今回改めて取り組むにあたり、WioLTE単体で最大限の省電力という所を見極めたいと思います。
普通にsimのAPNとかユーザとかパスワードが判らないので、EnableとHttpGetをやらずに、
それ以外を実施して、delayになった時の電流を見たいと思います。
Wio.Init()
Wio.PowerSupplyLTE(true)
Wio.TurnOnOrReset()
Wio.Activate(APN, USERNAME, PASSWORD)×
HttpGet×
Wio.TurnOff()
Wio.PowerSupplyLTE(false)
Wio.Sleep()
delay(INTERVAL) ←ここの電流をみます。
そうすると、delayの開始時に130mA、数秒後90mAぐらいに落ち着きます。
ここまでが普通の使い方であります。
それ以上やろうと思うと外部接続回路が必要になる模様。
参考 https://technologicaladvance.blog.fc2.com/blog-entry-158.html
なので、今回も前回と同じ様にリレーにてWioLTEの電源をON/OFFする方式で行きたいと思います。
構成
センサー---ESP32---WioLTE
の構成にしたいと思っております。
OracleVirtualBoxでNW接続でブリッジ接続にすると、OracleLinuxが起動しないので、NATでポートフォワーディングした。話
最近oracleに取りつかれております。
本日はOracle様のOracleLinuxでコマンド試したくて、
VirtualBoxを起動したのですがなんと起動しなく。。。
前の記事でOracleぶっ壊したときに、Program Files配下のOracleのディレクトリを全部消すという
ハイレベルな解決方法を取ったため、VirtualBoxも一緒にぶっ飛んだみたいでした。
で、とりあえず、再インストール後、前にインストールしておいたOracleLinuxを起動してみるのだが、
なぜか起動せず。
なので、OracleLinuxをVirtualBoxにインストール。
普通にインストール出来て、ネットにもつながり、
コマンドの確認もできたので良かったのだけど、
LinuxにはTeratermから接続したく。
OracleLinuxにはsshとか入っていることを確認しつつ、接続するが、
VirtualBoxのネットワークの割り当てがNATのためか、
TeratermさんからOracleLinuxに割り当てられている10.0.2.15には接続できず。
pingも飛ばず。
VirtualBoxのネットワークの割り当てをブリッジにすれば、ホストを飛び越えて、
家庭用ルーターからIPもらってきてくれるはずなので
ホストの割り当てられている192.168.x.xと同じセグメントになるので、
何も考えなくても大丈夫なはずだったのだけど。
今度は、VirtualBox内でOracleLinuxを起動すると起動の途中でエラーになって止まる。
色々条件を変えて、何度もやったけど、
ダメで、
色々調べた。
結局NATに戻してポートフォワーディングの設定がある事に気づき。
以下のようにしたら、Teratermからは127.0.0.1でポート8022にすれば、sshで接続できました。
ネットワークの設定

ポートフォワーディングをクリック

で、ホストポート、ゲストポートを入れて。
teratermから127.0.0.1で8022ポートへ接続
oracleのDB移行案件にてDBの静止点を作れているか?確認するために、
exportしたデータの比較を行って、
同じなら静止しているね。
みたいな検証をしたいと考えたが。結果失敗のようでしたな記事。メモメモ
■前に作成した、oracleにsqlplusでログイン
sqlplus sys@orcl as sysdba
■expdpするにはディレクトリ指定が必要。
CREATE DIRECTORY DIR1 as 'C:¥tmp';
SELECT * FROM ALL_DIRECTORIES where DIRECTORY_NAME='DIR1';
■expdpコマンド打つには普通のユーザーが必要。
CREATE USER miha identified by Mxxxxx1
grant connect to miha;
grant ALL PRIVILEGES TO miha;
GRANT READ ON DIRECTORY DIR1 TO miha;
GRANT WRITE ON DIRECTORY DIR1 TO miha;
■普通のユーザーでログイン確認
sqlplus miha/MXXXXX1@orcl
■テーブル作ってインサート
CREATE TABLE t1 ( k1 VARCHAR2(10) NOT NULL, k2 VARCHAR2(50), k3 NUMBER(1,0) ) ;
INSERT INTO t1 ( k1, k2, k3) VALUES ( 'tokyo', 'sibuya', 1) ;
INSERT INTO t1 ( k1, k2, k3) VALUES ( 'aomori', 'hirosaki', 1) ;
■export
expdp miha/MXXXXX1@orcl tables=t1 directory=DIR1 content=data_only dumpfile=data.dmp logfile=data.log
これは2回行ってmaeとatoに出力されたdmpをコピー
■fcで比較
fc /B moto¥DATA.DMP ato¥DATA.DMP
全く異なるなー
って事で失敗

exportのデータ構造わかんないけど、タイムスタンプとか入っているのかなー
JMeterメモ
■jmeterのインストール
参考:https://qiita.com/shotets/items/d553d7be0d407a9a9a53
①javaランタイムが必要になりますので、以下のページから
https://www.java.com/ja/download/manual.jsp
Windows用のやつをダウンロードしてきます。
②jre-8u361-windows-x64.exe がダウンロードされたので、
これを実行します。
③jmeterをダウンロードします。
以下のページから
https://jmeter.apache.org/download_jmeter.cgi
apache-jmeter-5.5.zip を ダウンロードしてきます。
④jmeterはインストール不要で、適当な位置に配置します。
自分の場合はc:¥jmeterをディレクトリ作成して
C:¥jmeter¥apache-jmeter-5.5に展開しました。
⑤あと、さまよっていた夢の中でプラグインマネージャーなるものをインストールしたけど
なんの役に立っているのかわかんない。
https://jmeter-plugins.org/install/Install/
から
plugins-manager.jarをダウンロードして、
C:¥jmeter¥apache-jmeter-5.5¥lib¥extへ追加
■基本的使い方
参考:https://tech-blog.rakus.co.jp/entry/2017/08/24/111332
①起動
binの中の jmeter.bat を起動するとよい。

②スレッドグループを追加
TestPlanを右クリック→Add→Threads→ThreadGroup

ThreadPropertyの所がポイント
Number of Threads(users):単純に何ユーザーが同時に実行しているのか?10人なら10と入れておく
Rump-up period(second):指定された秒数でNumber of Threadが実行される
Loop Count:上記のセットの乗数
10人のユーザーがいて、その10人が10秒でそれぞれ1回づつアクセスするとした場合、
10と10と指定しておくと約1秒に1回アクセスされる。
Loopは繰り返し数ではなくて、上記のセットを何倍にして実行するかです。
例えば、同じように10人10秒としてLoopを10にした場合、
1秒間に10アクセスになり、合計では10秒間で100アクセスとなります。
③httpリクエストの追加
Thread-group→Add→Samplar→HTTP Request

④HTTP Requestの設定
Server Name : www.yahoo.co.jp
Path : /

下のほうのパラメーターは今回使わないが、addで追加可能
⑤リスナーの追加
TestPlan→Add→Listner→View Result in Table

⑥実行
View Result in Tableをクリックしておいて
上の三角をクリック

ThreadNameに表示されるThreadGroup1-1の部分初めの1は1固定ですね。
二つ目のはuserです。
Loopの数を大きくすると同じセットのがたくさん出るようになります。
■CLIモード
(NON GUI モード)
jmeterで試験を行う場合はGUIでやると、メモリが足りなくなったり、パソコンが死んだりするそうなので、
GUIでの実行を書いておきます。
c:
cd ¥jmeter
apache-jmeter-5.5¥bin¥jmeter -n -t test.jmx -l log.jtl -H my.proxy.server -P 8000
apache-jmeter-5.5¥bin¥jmeter -n -t test.jmx -l log.jtl
実行例...
C:¥jmeter>apache-jmeter-5.5¥bin¥jmeter -n -t Plan.jmx -l log.jtl
Creating summariser <summary>
Created the tree successfully using Plan.jmx
Starting standalone test @ April 15, 2023 10:31:24 AM JST (1681522284500)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 6 in 00:00:05 = 1.1/s Avg: 321 Min: 126 Max: 974 Err: 0 (0.00%) Active: 1 Started: 6 Finished: 5
summary + 4 in 00:00:04 = 1.0/s Avg: 241 Min: 180 Max: 290 Err: 0 (0.00%) Active: 0 Started: 10 Finished: 10
summary = 10 in 00:00:09 = 1.1/s Avg: 289 Min: 126 Max: 974 Err: 0 (0.00%)
Tidying up ... @ April 15, 2023 10:31:34 AM JST (1681522294096)
... end of run
C:¥jmeter>
■実行結果の見方
GUIの場合は自動的に画面に表示されるので良いんですが、CLIで実行した場合には読み込まねばならぬ。
というわけです。
view result in tableにてfile nameを指定するところありますが、この右側にbrowseボタンを押して
ファイルを指定して読み込みます。
なぜかRequestのほかにRequest-0とRequest-1が追加されているのは何?リクエストが3倍になっているぞ。
なんで?
これは課題ですかね。
■実行結果の見方(統計情報)
TestPlan→Add→Listner→SummaryReport

追加したら、SummaryReportが表示されるので、
上の実行結果と同じでfile nameを指定するところありますが、この右側にbrowseボタンを押して
ファイルを指定して読み込みます。
すると統計情報として平均バイト数、最少、最大、エラー率等が表示されます。

上の実行結果と同じで謎のRequest-0とRequest-1が追加がLabel追加されていて、全体として3倍になりますね。
■テストシナリオの記録
普通にブラウザーから操作して、その時に発出されるhttpまたはhttpsでのやり取りを記録する事ができる。
その仕掛けとしては、jmeterがproxyとして動作して、webサーバーとやり取りしたデータを全部記録する方法が取られる。
本来の流れ
chrome→webサーバ
chrome←webサーバ
jmeterのproxyが間に入ると、
chrome→jmeter(proxy)→webサーバ
chrome←jmeter(proxy)←webサーバ
となり、間の通信を記録する事が可能になる。
こうする事で記録した通信を再生することで、実際のブラウザーの操作を同じになるって訳ですね。
なんだけど、末端のブラウザーとhttpsで通信する場合にサーバの証明書がちゃんとしてないとブラウザ側でエラーにしたりとかするので、
jmeterで使う証明書を入れとく必要があるんですね。
■証明書をインストールする。
参考:https://blackbird-blog.com/jmeter-https-scenario
jmeterで使える証明書をインストールしないとなので、
bin配下の ApacheJMeterTemporaryRootCA.crt をダブルクリックして証明書をインストールします。

証明書をインストール→現在のユーザー→信頼されたルート証明機関と選択しつつ次へ次へはいOKと肯定して進む。

証明書は1週間しか使えないらしいが、だめになったらもう一回やればいいらしい。
■テストシナリオ作成
参考:https://blackbird-blog.com/jmeter-02
上のほうで説明したThreadGroupを作成することろまでは同じ。
①シンプルコントローラーを追加(これに記録される)
ThreadGroup→Add→LogicController→SimpleController

②HTTPプロキシサーバーを追加
TestPlan→NonTest Elements→HTTP(S) Test Script Recorder

③HTTP(S) Test Script Recorderの設定。
TargetControllerの設定で上記で追加したSimpleControllerを指定する。

④Proxyの起動。
HTTP(S) Test Script Recorderの画面からstartをクリック
⑤ブラウザー
ブラウザーのproxy設定を変更
chromeであれば、右上の点三つから設定→システム→パソコンのプロキシ設定を開く
手動プロキシセットアップ
オン
プロキシIPアドレスに127.0.0.1
ポートに8888
保存

⑥シナリオ操作
例としてyahooで天気を見る操作を実施してみたが、
SimpleControllerの中に沢山のhttpRequestが自動で作成されていた。
⑦Proxyの停止。
HTTP(S) Test Script Recorderの画面からstopをクリック
⑧ブラウザーのproxy設定を戻しておく。
でないとインターネット見れないので。戻しておく。
⑨記録された中で余計なものを削除。
パソコン全体のhttp(s)の通信の記録をとっているので、
目的以外のページへのアクセスもされているので、
SimpleControllerのHTTPRequestで不要なものを削除する。

⑩テストシナリオ実行
上記と同じ手順でテーブル形式表示のリスナーを追加して
TestPlan→Add→Listner→View Result in Table
上の三角で実行すると
View Result in Tableに結果が表示されます。
Oracle再インストール
Oracleインストールしていろいろやってましたが、
なんか、startupの関係で、
コマンドを打ってもダメで、
色々やってたら、sqlplusでログインできなくなってしまいました。
がーーん
と言う訳で、再インストールの記事です。
普通に前と同じ手順でやってもダメで。
setup.exeを動かしてもう既に入っているのでダメよ。
みたいにメッセージが出ちゃったので・・・
それならと、アンインストールの手順探してやるも、
もう既にあっちこっち壊れているみたいで動かず。
仕方が無いので多少強引な方法でやってみました。
再インストールの場合
oracleと名前がついているプロセスをタスクマネージャーから全部削除
c:¥program files¥oracle配下を削除
前にインストールしていたoracleのファイルを削除
あ、PCの再起動もしました。
以下のHPからOracle Database 19c をダウンロード
https://www.oracle.com/jp/database/technologies/oracle-database-software-download.html
解凍して以下のように配置
c:¥DB
+--- WINDOWS.X64_193000_db_home
WINDOWS.X64_193000_db_homeの中のsetup.exeを起動
デフォルトで進める
途中パスワードを入れて、プラガブルデータベースの指定を外す。←これ重要。

■最後まで行ったら
sqlplus sys@orcl as sysdba
■テーブル作成
CREATE TABLE t1 ( k1 VARCHAR2(10) NOT NULL, k2 VARCHAR2(50), k3 NUMBER(1,0) ) ;
■挿入
INSERT INTO t1 ( k1, k2, k3) VALUES ( 'tokyo', 'sibuya', 1) ;
■コミット
commit work;
■select
select * from t1;
■外から実行してみる
sqlplus sys/MXXXXX1@orcl as sysdba @count.sql
よしよし、プラガブルの色々めんどくさいのはやらなくてもよくなったっぽい。
Oracleでジョブスケジューラーの使い方
自動実行。それはコンピューターの使命みたいな所があり、
Windowsならタスクスケジューラー、Linuxならcrontab
そして、Oracleならジョブスケジューラーとなるわけだが、
自分的にOracleとはあまりかかわらないように生きてきたし、
これからもその様に生きていきたい。
とか、思ったりするが、仕事でOracle技術者がおらん、人が足らん。
そんなこんなで今日も土曜なのにOracleと戦います。
さて、
ジョブスケジューラーだけど、追加すると実行できるわけだが、
単に追加しただけではダメっぽいです。
追加して、有効化する必要がある。
今日はジョブの 追加、有効化、無効化、削除のやりかたをここにメモして行きます。
ちなみに、以下の例はsqlplusで実行することが可能です。
あ、それと、スケジュールとジョブを別々に追加する方法もあるっぽいですが、
そんなめんどっちー事しないで、ここでは、ジョブの追加&スケジュールの
追加を一緒にやっております。
■ジョブの追加
ジョブの名前はTESTとしてやっていきます。
実行するコマンドは job_actionで指定。
job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' の部分。
ジョブは定期的に実行されるのでその実行間隔や時間を指定できます。
repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0' )
この場合は毎日11時53分0秒に実行される。
他にも毎週、毎月、毎年などあり。
FREQ=DAILY;
FREQ=WEEKLY;BYDAY=MON
FREQ=MONTHLY;BYMONTHDAY=15;
FREQ=YEARLY;
さらに、スケジュールする範囲の開始日と終了日を指定できたりするみたいだ。
SQL> BEGIN dbms_scheduler.create_job('"TEST"', job_type=>'PLSQL_BLOCK', job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' ,start_date=>systimestamp, repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0' );COMMIT;END;
/
上のスラッシュ入れないと実行されない。
これって、なんなん?
で、追加されたものを確認。
SQL> select job_name,state from all_scheduler_jobs;
JOB_NAME
--------------------------------------------------------------------------------
STATE
----------------------------------------
TEST
DISABLED
↑無効化の状態で追加されている。
ちなみに、この後の有効化も一行で行う場合は, enabled=>TRUE の部分を
追加するとよろしい。
※
SQL> BEGIN dbms_scheduler.create_job('"TEST"', job_type=>'PLSQL_BLOCK', job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' ,start_date=>systimestamp, repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0', enabled=>TRUE );COMMIT;END;
■ジョブの有効化
SQL> BEGIN DBMS_SCHEDULER.ENABLE('TEST'); END;
/
確認コマンド
SQL> select job_name,state from all_scheduler_jobs;
JOB_NAME
--------------------------------------------------------------------------------
STATE
----------------------------------------
TEST
SCHEDULED
↑有効化された。
この状態で定期的にコマンドが動きます。
■ジョブの無効化
無効化/有効化はジョブを削除しないで、
無効化することで、定期メンテの時とか
ジョブの動作を一時的に停止することが可能で、
メンテが終わってから有効化するなどの使用方法が可能ですね。
SQL> BEGIN DBMS_SCHEDULER.DISABLE('TEST'); END;
/
確認コマンド
SQL> select job_name,state from all_scheduler_jobs;
JOB_NAME
--------------------------------------------------------------------------------
STATE
----------------------------------------
TEST
DISABLED
↑無効化された。
■ジョブの削除
SQL> BEGIN DBMS_SCHEDULER.DROP_JOB('TEST'); END;
/
確認コマンド
SQL> select job_name,state from all_scheduler_jobs;
レコードが選択されませんでした。
↑無くなっとる。
■sqlコマンドを連続で流す方法
知らなかった。こんな簡単だなんて。
テキストファイルにコマンドを連続でずらずらーっと書いておいて。
例...
sql.sqlファイル
BEGIN DBMS_SCHEDULER.DROP_JOB('TEST'); END;
/
BEGIN dbms_scheduler.create_job('"TEST"', job_type=>'PLSQL_BLOCK', job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' ,start_date=>systimestamp, repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0', enabled=>TRUE );COMMIT;END;
/
select job_name,state from all_scheduler_jobs;
で、sqlplusのプロンプトで@sql.sqlとする。
SQL> @C:¥sql.sql
PL/SQLプロシージャが正常に完了しました。
PL/SQLプロシージャが正常に完了しました。
JOB_NAME
--------------------------------------------------------------------------------
STATE
----------------------------------------
TEST
SCHEDULED
SQL>
これは便利。
■コマンドラインからファイル実行
その他にもsqlplusを起動するときにsqlファイルを指定する方法もある。
C:¥>sqlplus miha/MXXXXX1@orclpdb @sql.sql
SQL*Plus: Release 19.0.0.0.0 - Production on 土 3月 11 12:40:00 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
最終正常ログイン時間: 土 3月 11 2023 12:37:21 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
PL/SQLプロシージャが正常に完了しました。
PL/SQLプロシージャが正常に完了しました。
JOB_NAME
--------------------------------------------------------------------------------
STATE
----------------------------------------
TEST
SCHEDULED
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
C:¥>
↑sqlファイルの最後にquitを書いておくと自動的にsqlplusが終了されてコマンドプロンプトに戻る
JUGEMテーマ:電子工作
RTC8564をESP32のmicropythonで使う
ESP32のRTCをそのまま使った場合、電源引っこ抜くと
時刻忘れてしまうので、外部のRTCが必要になる場合がある。
□回路

SCLとSDAをつなぐだけ
□ソース説明
・初期化
ピンの22,27でi2c通信します。
I2C_ADDR_RTC8564NB = 0x51
pin22 = machine.Pin(22, machine.Pin.IN, machine.Pin.PULL_UP)
pin27 = machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)
i2cbus = SoftI2C(scl=pin22, sda=pin27, freq=100000)
・ESP32のRTCから読んで8564へ書き込み
setDatetimeESP32toRTC()
・8564のRTCから読んでからESPへ書き込み
setDatetimeRTCtoESP32()
・8564のRTCから読んで表示
buf = makeDatetimeStrRTC()
print("8564 time ="+buf)
□ソース
from machine import SoftI2C, Pin
import utime
import machine
import time
import struct
#
# 変数
#
I2C_ADDR_RTC8564NB = 0x51
pin22 = machine.Pin(22, machine.Pin.IN, machine.Pin.PULL_UP)
pin27 = machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)
i2cbus = SoftI2C(scl=pin22, sda=pin27, freq=100000)
buf = i2cbus.scan()
for id in buf:
print("scan:"+str(id))
def to_bcd(bin):
keta1 = bin % 10
keta2 = int(bin / 10)
r = b''
r += struct.pack('B', keta2 * 16 + keta1)
return r
def setDatetimeRTC(year, month, days, hour, minute, second):
global i2cbus
now_time = time.time()
now_time_jpn = now_time + 32400
now_time_jpn_tuple = time.localtime(now_time_jpn)
# stop rtc
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 0, b'\x20')
# year
rtc_year = year - 2000
rtc_year_bcd = to_bcd(rtc_year)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 8, rtc_year_bcd)
# month
rtc_month_bcd = to_bcd(month)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 7, rtc_month_bcd)
# days
rtc_days_bcd = to_bcd(days)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 5, rtc_days_bcd)
# weekdays
#rtc_weekdays_bcd = to_bcd(weekday)
#i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 6, rtc_weekdays_bcd)
# hours
rtc_hours_bcd = to_bcd(hour)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 4, rtc_hours_bcd)
# minutes
rtc_min_bcd = to_bcd(minute)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 3, rtc_min_bcd)
# seconds
rtc_sec_bcd = to_bcd(second)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 2, rtc_sec_bcd)
# start rtc
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 0, b'\x00')
return True
#
# ESP32の時刻をRTC8564にセットする関数
#
def setDatetimeESP32toRTC():
global i2cbus
now_time = time.time()
now_time_jpn = now_time # + 32400
now_time_jpn_tuple = time.localtime(now_time_jpn)
# stop rtc
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 0, b'\x20')
# year
rtc_year = now_time_jpn_tuple[0] - 2000
rtc_year_bcd = to_bcd(rtc_year)
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 8, rtc_year_bcd)
# month
rtc_month_bcd = to_bcd(now_time_jpn_tuple[1])
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 7, rtc_month_bcd)
# days
rtc_days_bcd = to_bcd(now_time_jpn_tuple[2])
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 5, rtc_days_bcd)
# weekdays
#rtc_weekdays_bcd = to_bcd(now_time_jpn_tuple[6])
#i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 6, rtc_weekdays_bcd)
# hours
rtc_hours_bcd = to_bcd(now_time_jpn_tuple[3])
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 4, rtc_hours_bcd)
# minutes
rtc_min_bcd = to_bcd(now_time_jpn_tuple[4])
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 3, rtc_min_bcd)
# seconds
rtc_sec_bcd = to_bcd(now_time_jpn_tuple[5])
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 2, rtc_sec_bcd)
# start rtc
i2cbus.writeto_mem(I2C_ADDR_RTC8564NB, 0, b'\x00')
return True
#
# RTC8564の時刻をESP32にセットする関数
#
def setDatetimeRTCtoESP32():
global i2cbus
current_datetime_str = getDatetimeTupleRTC()
year_int = int(current_datetime_str[0])*10 + int(current_datetime_str[1])
year_int+=2000
month_int = int(current_datetime_str[2])*10 + int(current_datetime_str[3])
weekday_int = int(current_datetime_str[4])
day_int = int(current_datetime_str[5])*10 + int(current_datetime_str[6])
hour_int = int(current_datetime_str[7])*10 + int(current_datetime_str[8])
min_int = int(current_datetime_str[9])*10 + int(current_datetime_str[10])
sec_int = int(current_datetime_str[11])*10 + int(current_datetime_str[12])
the_rtc = machine.RTC()
the_rtc.datetime((year_int, month_int, day_int, weekday_int, hour_int, min_int, sec_int, 0))
now_time = time.time()
now_time_jpn = now_time # - 32400
now_time_jpn_tuple = time.localtime(now_time_jpn)
the_rtc.datetime((now_time_jpn_tuple[0], now_time_jpn_tuple[1], now_time_jpn_tuple[2], weekday_int, now_time_jpn_tuple[3], now_time_jpn_tuple[4], now_time_jpn_tuple[5], 0))
return True
def getDatetimeTupleRTC():
global i2cbus
sec_upper, sec_lower = readFromI2CRTC8564NB(2)
min_upper, min_lower = readFromI2CRTC8564NB(3)
hour_upper, hour_lower = readFromI2CRTC8564NB(4)
day_upper, day_lower = readFromI2CRTC8564NB(5)
weekdays_upper, weekdays_lower = readFromI2CRTC8564NB(6)
month_upper, month_lower = readFromI2CRTC8564NB(7)
year_upper, year_lower = readFromI2CRTC8564NB(8)
return year_upper, year_lower, month_upper, month_lower, weekdays_lower, day_upper, day_lower, hour_upper, hour_lower, min_upper, min_lower, sec_upper, sec_lower
def readFromI2CRTC8564NB(mem_address):
global i2cbus
result = i2cbus.readfrom_mem(I2C_ADDR_RTC8564NB, mem_address, 1)[0]
bitmasks_lower = [0b00001111, 0b00001111, 0b00001111, 0b00001111, 0x00000111, 0b00001111, 0b00001111]
bitmasks_upper = [0b00000111, 0b00000111, 0b00000011, 0b00000011, 0x00000000, 0b00000001, 0b00001111]
# lower digit
lower_digit = result & bitmasks_lower[mem_address-2]
# upper digit
upper_digit = result >> 4
upper_digit = upper_digit & bitmasks_upper[mem_address-2]
return upper_digit, lower_digit
#
# RTC8564の時刻をYYYYMMDDHHMMSS形式で取得する関数
#
def makeDatetimeStrRTC():
global i2cbus
sec_upper, sec_lower = readFromI2CRTC8564NB(2)
min_upper, min_lower = readFromI2CRTC8564NB(3)
hour_upper, hour_lower = readFromI2CRTC8564NB(4)
day_upper, day_lower = readFromI2CRTC8564NB(5)
month_upper, month_lower = readFromI2CRTC8564NB(7)
year_upper, year_lower = readFromI2CRTC8564NB(8)
datetime_str = "20%d%d/%d%d/%d%d %d%d:%d%d:%d%d" %(year_upper, year_lower, month_upper, month_lower, day_upper, day_lower, hour_upper, hour_lower, min_upper, min_lower, sec_upper, sec_lower)
return datetime_str
# -----------------------------------------
# ESPのRTCに書き込み
def SetTime(yyyy, mm, dd, h, m, s) :
time_value = utime.mktime((yyyy, mm, dd, h, m, s, 00, 00)) #+ ( 9 * 60 * 60 )
t = utime.localtime(time_value)
yyyy = t[0] #yyyy
mm = t[1] #mm
dd = t[2] #dd
h = t[3] #hh
m = t[4] #mm
s = t[5] #ss
rtc = machine.RTC()
rtc.init((yyyy, mm, dd, 0, h, m, s, 0))
def zero_fill(i, n) :
str1="00000000000000000000" + str(i)
rtn = str1[-n:]
return rtn
#set RTC time
setDatetimeRTC(2023, 2, 1, 12, 13, 14)
buf = makeDatetimeStrRTC()
print("8564 time ="+buf)
#set ESP time
SetTime(2001, 1, 11, 9, 0, 0)
t = utime.localtime()
stime = zero_fill(t[0], 4) + "/" + zero_fill(t[1], 2) + "/" + zero_fill(t[2], 2) + " " + zero_fill(t[3], 2) + ":" + zero_fill(t[4], 2) + ":" + zero_fill(t[5], 2)+ "-" + zero_fill(t[6], 1)+ "-" + zero_fill(t[7], 3)
print("esp time ="+stime)
#ESP-->RTC
#setDatetimeESP32toRTC()
#buf = makeDatetimeStrRTC()
#print("8564 time ="+buf)
#RTC-->ESP
setDatetimeRTCtoESP32()
t = utime.localtime()
stime = zero_fill(t[0], 4) + "/" + zero_fill(t[1], 2) + "/" + zero_fill(t[2], 2) + " " + zero_fill(t[3], 2) + ":" + zero_fill(t[4], 2) + ":" + zero_fill(t[5], 2)+ "-" + zero_fill(t[6], 1)+ "-" + zero_fill(t[7], 3)
print("esp time ="+stime)
while True :
str = makeDatetimeStrRTC()
print(str)
utime.sleep(1)
#
#a = to_bcd(11)
#print("a="+str(a))
またまたoracleやってます。画面幅の調整のことです。
sqlplusなんて使ってるからだろう。とか言われそうですが、
お客さん環境でオブジェクトブラウザーとか使えればいいんですが、
最低限入っているsqlplusで頑張らなキャーの場合が多いと思います。
それでですね。
sqlplus上でselectをやると、
K1
--------------------
K2
--------------------------------------------------------------------------------
K3
----------
sibuya
1
tokyo
sibuya
1
x行が選択されました。
とかなって、何がなんだかわかんねーってなりませんか?
初めて見た時からこんな感じだったのでずっと疑問を持ちませんでしたが、
かってに適当なところで区切って改行を無理やりつけているかなー?
昔って画面が80桁が普通で、その範囲で画面設定したっけー
みたいな。
ちょっとググるとすぐ出てくる。
SQL> show linesize;
SQL> set linesize 500;
このコマンド。
SQL> show linesize;
の結果は
SQL> show linesize;
linesize 80
1行は80です。みたいな。
で、それならと、
SQL> set linesize 500;
で、も一回セレクト
K1 K2 K3
-------------------- ------------------------------------------------------------------------------------------ ----------
tokyo sibuya 1
tokyo sibuya 1
tokyo sibuya 1
tokyo sibuya 1
これこれ。これが普通だよね。
今はDos窓でっかく広げれば良い話なので。
これでいいです。
■追加情報
カラムごとの桁数の調整もできます。
column カラム名 format a桁数;
or
column カラム名 format 数値型の場合のフォーマット;
ex...1 文字型の場合aに続けて桁数
column K2 format a10;
K1 K2 K3
-------------------- ---------- ----------
tokyo sibuya 1
tokyo sibuya 1
tokyo sibuya 1
tokyo sibuya 1
ex...2 数字の場合フォーマット999,999とか。
column K3 format 999,999;
だと、K3がカンマ付き表示になる。
K1 K2 K3
-------------------- ------- --------
tokyo sibuya 1,000
tokyo sibuya 1,000
上記を実施するにあたり、以下2点を実施しております。
K3の属性をNUMBER(1,0)からNUMBER(4,0)に変更
ALTER TABLE t1 MODIFY (k3 NUMBER(4,0));
4桁表示したいのでK3の値を4桁に変更
update t1 set K3=1000;
k2をもっと短くしたかったので
column K2 format a7;
じゃー短くし過ぎるとどうなのよ?
column K2 format a2;
K1 K2 K3
-------------------- -- --------
tokyo si 1,000
bu
ya
上はK2を2桁にしてみた例。
なんと、2桁を使って縦に並んだぞ。
じゃそれなら一桁では?
column K2 format a1;
K1 K K3
-------------------- - --------
tokyo s 1,000
i
b
u
y
a
tokyo s 1,000
i
b
K1 K K3
-------------------- - --------
u
y
a
想像通りでしたね。こういう事が出来ると覚えておくだけでも少しやりやすくなるって事で。
指定方法がマニアックですね。
前回に引き続いてORACLEネタ
DBだけは不得意なんですーとか、言ってもね人手不足なんですよね。
というわけで、前回作成したOracle環境で分割Export/Importします。
今はあんまり使わなくなったかもですかもですけど。
昔はファイルシステムの制限とかで
1ファイルに付き2Gバイトまでしかデータを書き込めなかったりして。
そのために、DBからデータ抜くときに分割する機能が付いていたりとかします。
思い起こせば、最初のころに発売されたハードディスクって
こんなのhttps://www.logitec.co.jp/poke/regend/lhd10.html

すげーフロッピー10枚分もデータが入るって喜んでた頃を懐かしく思う。
今回も念のため、データ転送の途中のコマンドとか、
相手ファイルシステムで・・・とかいうトラブルを避けるために
ファイル分割したほうが安全だよねーと考えております。
ちょっと追記
前の記事
https://miha.jugem.cc/?eid=339
前の記事長いので・・・
ぽいんとだけ抜粋
CREATE DIRECTORY DIR1 as 'C:¥tmp'; ←深い場所にしてしまうとエラーになるぞなんで?
DROP DIRECTORY DIR1;
SELECT * FROM ALL_DIRECTORIES;
前回作成したテーブルt1と12にinsert大量に実行して
INSERT INTO t1 ( k1, k2, k3) VALUES ( 'tokyo', 'sibuya', 1) ;
1万2千行作っておいて。
exportとimport実行していきます。
export/import用ディレクトリはc:¥tmp
■ポイントとしては、
expdpの時に
dumpfile=data_%U.dmp ← _%Uと付ける
filesize=100kb ← filesizeパラメーターを付ける
filesizeの指定はkbのほかにGBとかでもOKらしいです。
filesizeのサイズで分割。分割した場合は%Uの所に01~連番で数字付けてくれる。
impdpの時に
dumpfile=data_%U.dmp ← _%Uと付ける
■分割Export
expdp miha/Mxxxxx1@orclpdb tables=t1,t2 directory=DIR1 dumpfile=data.dmp logfile=data.log
分割export
expdp miha/Mxxxxx1@orclpdb tables=t1,t2 directory=DIR1 dumpfile=data_%U.dmp logfile=data.log filesize=100kb
ex...
C:¥Users¥miha¥source¥oracle>expdp miha/Mxxxxx1@orclpdb tables=t1,t2 directory=DIR1 dumpfile=data_%U.dmp logfile=data.log filesize=100kb
Export: Release 19.0.0.0.0 - Production on 土 2月 4 13:18:20 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
"MIHA"."SYS_EXPORT_TABLE_01"を起動しています: miha/********@orclpdb tables=t1,t2 directory=DIR1 dumpfile=data_%U.dmp logfile=data.log filesize=100kb
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/MARKERの処理中です
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
. . "MIHA"."T2" 5.968 KB 2行がエクスポートされました
. . "MIHA"."T1" 225.5 KB 11242行がエクスポートされました
マスター表"MIHA"."SYS_EXPORT_TABLE_01"は正常にロード/アンロードされました
******************************************************************************
MIHA.SYS_EXPORT_TABLE_01に設定されたダンプ・ファイルは次のとおりです:
C:¥TMP¥DATA_01.DMP
C:¥TMP¥DATA_02.DMP
C:¥TMP¥DATA_03.DMP
C:¥TMP¥DATA_04.DMP
C:¥TMP¥DATA_05.DMP
ジョブ"MIHA"."SYS_EXPORT_TABLE_01"が土 2月 4 13:18:27 2023 elapsed 0 00:00:07で正常に完了しました
■分割import
impdp miha/Mxxxxx1@orclpdb directory=DIR1 table_exists_action=replace dumpfile=data_%U.dmp logfile=dataimp.log
ex...
C:¥Users¥miha¥source¥oracle>impdp miha/Mxxxxx1@orclpdb directory=DIR1 table_exists_action=replace dumpfile=data_%U.dmp logfile=dataimp.log
Import: Release 19.0.0.0.0 - Production on 土 2月 4 13:21:48 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"MIHA"."SYS_IMPORT_FULL_01"は正常にロード/アンロードされました
"MIHA"."SYS_IMPORT_FULL_01"を起動しています: miha/********@orclpdb directory=DIR1 table_exists_action=replace dumpfile=data_%U.dmp logfile=dataimp.log
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
. . "MIHA"."T2" 5.968 KB 2行がインポートされました
. . "MIHA"."T1" 225.5 KB 11242行がインポートされました
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/MARKERの処理中です
ジョブ"MIHA"."SYS_IMPORT_FULL_01"が土 2月 4 13:22:01 2023 elapsed 0 00:00:13で正常に完了しました
C:¥Users¥miha¥source¥oracle>