- コンター図をエクセルファイルへ追加する fastAPI
Entry Page
Result Page
Draw a contor graph in the .xlsx file
2軸で定義された粗めのデータ配列から補間演算をしてコンター図を作成する。fastAPIを使用した作例。ローカル環境でのみ動作確認した。
他のプラットフォームへの実装についてはstreamlitを利用した作例がある。
streamlitへの実装例
データフローを下図に示す。contour_template.xlsx にデータを登録する。Web Appにアップロードし計算後に結果ファイルをダウンロードする。結果ファイルにはコンター図が挿入される。
graph LR
indata
temp
src
web[Web<br>Interpolating ...
- PDFのページを回転・削除・結合して保存するWebAPPの作成
PDF – page rotation / remove page / joint page
複数のPDFファイルを繋げる、指定したページを回転や削除を行う。結果をPDFファイルとしてダウンロードする。機能を限定し最小構成で実現することを試みる。
Sample Site
さくらインターネット・レンタルサーバスタンダードプランへ実装した作例。
(動作テスト用のためpdfファイルサイズを約1Mbyteに制限)
https://yanmos.jpn.org/editpdf/editpdf
Local環境ではuvicornで実行し確認、レンタルサーバではcgi経由でa2wsgiを利用した。
Structure
flowchart LR
subgraph fastAPI
cgi
end
subgraph uikit
html
end
infile((.pdf file))
...
- iCalendar .ics ファイルを生成するWebAPPの作成
iCalendar .ics ファイルを生成するWebAPPの作成
カレンダーへ会社の休日をまとめて登録したくて.icsファイルジェネレータを作成した。
Sample Site
さくらインターネット・レンタルサーバスタンダードプランへ実装したcgiを使用した作例。
https://yanmos.jpn.org/makeics/makeics.html
Local環境はfastAPIで実装、レンタルサーバーへはcgiで実装した。
使用方法は、まず下記のようなcsvファイルを用意する。1行目に題目を記載し、2行目以降に日付を羅列する。次にそのファイルをアップロードする。icsファイル生成後にDownloadボタンが表示されるのでクリックしファイルを入手する。
eg. 日本の正月
Input file: input.csv
正月
2024/1/1
2024/1/2
2024/1/3
Output file: output.ics
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Sample
BEGIN:VEVENT
SUMMARY:正月
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240102
UID:785ba0e4-8c91-4fcc-ad86-39a9ffe29296
END:VEVENT
BEGIN:VEVENT
SUMMARY:正月
DTSTART;VALUE=DATE:20240102
DTEND;VALUE=DATE:20240103
UID:ed2014cf-ccdb-4191-a86c-b2149de4ca74
END:VEVENT
BEGIN:VEVENT
SUMMARY:正月
DTSTART;VALUE=DATE:20240103
DTEND;VALUE=DATE:20240104
UID:88a2fe72-c0e4-47a8-9539-d0e7f32c9292
END:VEVENT
END:VCALENDAR
Structure
処理の構成は下図の通り。
flowchart LR
infile((.csv file))
outfile((.ics file))
cgi
html
html-->cgi-->outfile
infile-->cgi
使用ライブラリ
UIkit・・・Graphical User Interface
iCalendar・・・python calendar module
Source code
ソースコードを下記に示す。実際の運用版とは細部が異なる。
HTML
makeics.html
UIkitを利用してページを構成。
<!DOCTYPE ...
- Raspberry PiでADS1115を使う
Raspberry PiでADS1115を使う
I2CアドレスはADDR端子の配線で設定する。
ADS1115 I2C Address
ADDR pin connection
I2C address
GND
0x48
VDD
0x49
SDA
0x4A
SCL
0x4B
使用したI2Cチャネルは1。
ADS1115 Register
Pointer
Description
0x00
Conversion Register : AD変換結果
0x01
Config Register : 設定
ADS1115のレジスタデータはBig Endianだが、pigpio の I2CライブラリはSMBusベースなので Little Endianである。よって上位バイトと下位バイトを入れ替える必要がある。
Config Register 0x01
Bit
Field
Set
Description
15
OS
0
No efect
14:12
MUX
0b100
Input single end AIN0
11:9
PGA[2:0:
0b001
Full Scale 4.096V
8
MODE
0
Continuous-conversion mode
7:5
DR
0b010
Speed 32 Sample/s
4
COMP_MODE
0
Normal ...
- コンター図をエクセルファイルへ追加する streamlit
Draw a contor graph into the .xlsx file
2軸で定義された粗めのデータ配列から補間演算をしてコンター図を作成する。UIはWebで。プラットフォームはstreamlitを利用。
作成・設置例
https://yanmos-playstreamlit-drawcontour-c3kgvj.streamlit.app
他のプラットフォームへの実装についてはfastapiを利用した作例がある。
fastapiへの実装例
Data flow
データフローを下図に示す。contour_template.xlsx にデータを登録する。それをweb appでアップロードし計算後に結果ファイルをダウンロードする。結果ファイルにはコンター図が挿入される。
graph LR
indata
temp
src
web[Web<br>Interpolating &<br>drawing ...
- Raspberry Pi Pico – Picoprobe
Raspberry Pi Pico w/picoprobe
目的
Raspberry Pi Picoのソフトウェアを開発するため書き込みとデバッグを行う環境をセットアップする。HostはM1 Mac。MacからPicoprobeへはUSBで接続し、PicoprobeからターゲットpicoへはSWDで接続する。
構成
flowchart LR
subgraph M1 Mac w/vscode
gdb
...
- 自家用車の燃費推移の周波数分析
自家用車の燃費推移の周波数分析
一体何を言っているのだ。と思われそうだが、ガソリンの給油のたびに燃費を計算して記録していたので、そのデータをフーリエ変換したくなったのだ。
諸元
対象車
トヨタ アクア 2013
集計期間
2013 〜 2022
燃費計算
満タン法
備考
通勤に使用 毎日往復50km
結果
上のグラフは横軸は経過日数で、燃費の推移である。
下のグラフは横軸は周期である。365日(1年)と180日(半年)付近にピークがある。おそらく夏はエアコン、冬は暖房の使用で燃費が落ちるのだろう。
計算方法
燃費データをcsvフォーマットで作成する。1列目に経過日数、2列目を燃費とする。燃費はガソリンを満タン補給する度に走行距離と給油量から算出した。
燃費データcsvファイル例
18,28.122
34,21.676
54,27.475
73,21.922
89,22.234
107,23.484
~~~~~~~~
3221,30.254
3238,29.365
3257,27.977
3280,30.023
jupyter で作成し動作確認したソースコード
#!/usr/bin/env python
# coding: utf-8
# In:
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
from scipy import fftpack
# In:
# csvファイルの読み込み
filename = 'fuelconsumption.csv'
data = np.loadtxt(filename,delimiter=",",skiprows=1, dtype="float")
ds = data
fc = ...
- 単語カードWebAPPの作成
Flashcard WebAPP
フラッシュカードアプリを作成しました。英単語などを覚えるツールとしてレンタルサーバで動作するWebアプリです。私はiPhoneからアクセスして勉強しています。単語登録はMySQLへ直接登録する必要があります。
動作サンプル
たべっ子英単語
Screen shots
利用方法は橙色の面に表示された問題を見て回答をイメージします。そしてタップすると裏側の緑色の面が表示されるので答え合わせをします。さらにタップすると次の問題が橙色の面に表示されます。設定は左上のメニューをタップして出題の種類を選択します。
Condition
動作環境
項目
内容
サーバ
さくらインターネット
契約プラン
レンタルサーバ スタンダード
ライブラリ
jquery
データベース
MySQL
インターフェース
cgi
cgi処理
python3.7
ファイル構成
Filename
内容
flashcard.html
メインページ
flashcard.js
jqueryでユーザーインターフェース処理
flashcard.cgi
pythonでデータベース処理
flashcard.css
装飾
データベース
データベースのレコード定義はシンプルに下記としました。
CREATE TABLE IF NOT EXISTS `FlashCard` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`side_a` TEXT,
`side_b` TEXT,
...
- Benchmark M1 processor
Benchmark
自分が管理しているPCで計算処理のベンチマークを実施した。実行サンプルはnumpyで作成した4.5M要素の演算と探索を行いコンター図を出力するプログラムである。
1位
MacBook Pro 2021
Apple M1 Pro RAM 32GB
ARM64
計算時間 2 min 56 s
2位
MacBook Pro 2021
Apple M1 Pro RAM 32GB
Rosetta
計算時間 4 min 46 s
3位
Windows10 desktop 2020
Xeon 4GHz RAM 32GB
計算時間 5 min 11 s
4位
Windows10 note 2020
Core i5 ...
- Raspberry Pi Cmd Launcher
Raspberry Pi Cmd Launcher
Raspberry Piにキャラクタ液晶とプッシュスイッチを組み合わせてランチャーを製作する。
スイッチは左ボタンと右ボタンとエンターボタンの3つとする。液晶に表示されたメニューから左右ボタンで希望のコマンドを選択しエンターボタンで実行する。ユーザフィードバックはピエゾ素子で音を発生。
Hardware
液晶はi2c接続の2行8桁のものを使用する。秋月電子で販売中のバスリピーター付きのLCD(AQM0802A)。
スイッチは小さなプッシュ型でエンターボタンは少し大きめのものを選んだ。家庭内在庫品だ。
graph LR
subgraph Raspberry Pi
i2c
pwm
...
- Raspberry Pi に Beep音を実装する
Beep sound on Raspberry Pi
ラズパイにBeep音を実装したい。起動完了やアラート発生時にピッ・プーーと鳴らすのだ。
Hardware
Hardware PWMを利用した実装例です。
Schematic
BOM
Name
Type
Spec.
Piezo sounder
Murata PKM13EPYH4000-A0
Dia.13mm, t6.9mm, 30Vp-p max.
Transister
Rohm DTC143E
NPN Digital Tr. Rb=4.7kΩ, Rbe=4.7kΩ
Resister
Carbon film
10kΩ 0.1W
Software
Hardware PWMを利用した実装例です。
Source code
python3 PIGPIOモジュールを使用しました。beep(0) でピポッです。
これから動作確認します。(^^;)
import pigpio
BEEP_PORT = 13
BEEP_DUTY = 500000
pi = pigpio.pi()
def beep(pattern_id=0):
...
- LIFEGAME
LIFEGAME
Python, Numpy, Curses の組み合わせでライフゲームを製作した。練習問題ですね。
cursesでconsoleのwindowサイズを取得、それに合わせてnumpy.arrayを作成しbufferとする。初期画面はnumpyのrandomで生成、世代更新はnumpyのsumを利用した。画面更新はbufferをスキャンして1つ1つ書き換え。ここは改良の余地がありそう。
#!/usr/bin/env python3
import numpy as np
import curses as cs
import time
class lifegame:
def __init__(self, ny, nx):
self.field = np.zeros([ny, ...
- リアルタイムふうOS キャラクタ表示LCDドライバ
RTF-OS LCD driver
LCD初期化タスクとドライバタスクの初期化
#define N_LCD_MSG 32 /* LCDコマンドバッファのバイト数 */
flag_type *flag_lcd_init; ...
- リアルタイムふうOS キャラクタ表示LCDドライバ
RTF-OS LCD driver
MSC
Real Time Foo OS を使用したLCDドライバの作例。ドライバ本体タスクと初期化シーケンスを実行するタスクの2つのタスクで構成する。利用するタスク(メインタスクと表記)から初期化タスクを呼び出すことで起動する。lcd_mainタスクは初期化が完了すると不要となる。
API
名称
処理内容
init_lcd
LCD関連タスク、イベントフラグ、メールボックスの初期化
lcd_clear
表示をクリアする
lcd_home
カーソルをホームポジションに移動する
lcd_print_str
カーソル位置に文字列を表示する
lcd_print_dec4s
16ビット符号付きバイナリデータを4桁の十進数とで表示する。負数は"-"を付加。
lcd_print_dec4
16ビットバイナリデータを4桁の十進数で表示する
lcd_print_dec3
8ビットバイナリデータを3桁の十進数で表示する
lcd_print_dec2
8ビットバイナリデータを2桁の十進数で表示する
lcd_print_dec1
8ビットバイナリデータを1桁の十進数で表示する
lcd_set_pos
カーソルをx,y座標に移動する
print
カーソル位置に文字列を表示する。失敗なら再試行、成功なら状態遷移する。
locate
カーソルをx,y座標に移動する。失敗なら再試行、成功なら状態遷移する。
home
カーソルをホームポジションに移動する。失敗なら再試行、成功なら状態遷移する。
clear
表示をクリアする。失敗なら再試行、成功なら状態遷移する。
- リアルタイムふうOS 全体の構成とAPI
全体の構成とAPI
リアルタイムOSの勉強のために作成したフレームワークです。タスクが移り行く様はなかなかおもしろかった。
Over view
全体の構成図を下記に示す。1つのモジュールは1つの初期化ルーチンと1つ以上のタスクを持つ。各タスクの同期はOSが仲介する。
API
タスク制御と時間管理に関するAPI
名称
処理内容
init_os
OSの初期化
task_main
メインルーチン無限ループ
create_tcb
ユーザタスクを登録するTCBを作成
start_task
タスクを実行待ちリストに登録する
start_task_i
割込みルーチン用のstart_task処理
exit_task
タスクを終了するTCBを解放
exit_task_i
割込みルーチン用のexit_task処理
get_trg
状態遷移した理由を取得
delay_task
実行を指定時間だけ中断する
set_timeout
実行を指定時間だけ中断する(delay_taskと同じ)
clear_timeout
中断後の再開をキャンセルする
timer_1ms_int
1ms周期タイマ割込みで行う処理(タイムアウト判定)
slice_task
実行を中断しCPUを解放する
set_next_state
次の状態遷移変数値を設定
イベントフラグに関するAPI
名称
処理内容
create_flag
イベントフラグFLAGを作成
set_flag
イベントが発生する(フラグがTRUE)まで待つ
set_flag_i
イベントを発生(フラグをTRUEに設定)
clear_flag
割込みルーチン用のset_flag処理
clear_flag_i
イベントを消去(フラグをFALSEに設定)
wait_flag
割込みルーチン用のclear_flag処理
セマフォに関するAPI
名称
処理内容
create_sem
セマフォSEMを作成
signal_sem
セマフォwait動作(リソースが空くまで待つ)
wait_sem
セマフォにsignal動作(リソースを1つ解放する)
メールボックスに関するAPI
名称
処理内容
create_mbx
メールボックスMBXを作成
send_msg
メールボックスにメッセージが受信されるまで待つ
send_msg_i
メールボックスにメッセージを送信
wait_msg
割込みルーチン用のsend_msg処理
get_msg
メッセージを取得
get_msglen
メッセージの長さを取得
- リアルタイムふうOS データ構造
Data structure
Task Control Block: TCB
struct st_tcb {
struct st_tcb *link;
struct st_tcb *back_link;
void (*entry)( ...
- リアルタイムふうOS 時間管理
Time management
タイマ関連処理
タイムアウト待ち登録:TimerQへ登録
時間経過待ちタスクのリストへ登録する。待ち時間の短い順でソートされる。
void link_timer_q( tcb_type *tcb, uint16 time )
{
uint16 sum_time, time_z1;
tcb_type *scan;
...
- リアルタイムふうOS タスクの書式
How to write a task
Example of the task rouchine
Module initialize
tcb_type *tcb_sample1;
tcb_type *tcb_sample2;
flag_type *flag;
void init_sample( void ) /* 初期化ルーチン */
{
...
- リアルタイムふうOS 初期化とメインルーチン
Initialization and Mainrouchine
General flowchart
OS Initialization
void init_os( void )
{
que_type *que;
que = &TimerQ;
TimerQ.link = (tcb_type *)que;
...