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>