■24/9/5 11:34PM
Flask
■formaction (hidden以外でのSubmit先変更方法) buttonや inputのtype=submit/image に付与できる ベースとなるのはformのidのformタグ<input... form="formのid">
<form id="form" method="post"><button type="submit" formaction="app.html" name="transition" value="a" form="form">戻る</button><button type="submit" formaction="ok.html" name="transition" value="b" form="form">送信</button>下記のような属性がある formaction formenctype formmethod formnovalidate formtarget
■jinja2【Flask】Jinja2のテンプレート継承でHTMLファイルを役割ごとに分割する | たぬハック (tanuhack.com)[Flask/Jinja2]extendsやincludeを使い、メンテしやすいテンプレート構築を目指す | pixelbeat sandboxJinjaテンプレートの書き方をがっつり調べてまとめてみた。 #Python - Qiita
///dictmy_dic['name'] = 1return render_template('index.html', message=my_dic)テンプレ側{{message.name}}
///リストnum_list = np.arange(10)return render_template('index.html', message=num_list)テンプレ側{% for num in num_list %}<div>{{ num }}</div>{% endfor %}
///改行
{%- xxx -%} jinjaタグの前後マイナスで改行空白を除外する
+はtrim_blocks(改行詰め)、Istrip_blocks(空白詰め)を無効化する設定で俺は使わないfrom jinja2 import Environmentjinja_env = Environment()jinja_env.trim_blocks = Truejinja_env.Istrip_blocks = True
///置換
{{ "aaagh" | replace("a","oh,","2") }}
-> oh,oh,agh
{{ input['txtarea'] | replace("\n","<br />") }}
///エスケープ
safeフィルタがなければhtmlエスケープがかかる{{ output | safe }}
あるいは
{{% autoescape False %}}{{ output }}{{% endautoescape %}}
///コメント(複数行ok){# note: commented-out we no longer use this {% for user in users %} …#}
///生{% raw %} <ul> {% for item in seq %} <li>{{ item )}</li> {% endfor %} </ul>{% endraw %}
///extend と block と include●flaskpage=page_a.model(user)return render_template("layout.html",title=title,page=page)
●layout.html (テンプレ切替と共通ブロック、共通ブロックはテンプレに書いた方分かり易い?) {% if page['destination']== 'confirm' %} {% extends "template_confirm.html" %} {% elif page['destination']== 'complete' %} {% extends "template_complete.html" %} {% else %} {% extends "template_html" %} {% endif %} {% block body %} {% include "header.html" %} <p>content here.</p> {% endblock %}
●template.html <html> <body> <h1>{{ title }}</h1> {% block body %} {% endblock %}
#0以上の入力データの確認 (空の確認やintへのキャスト)#{% if 'inquiry_id' in page['input'] and page['input']['inquiry_id'] is not none and page['input']['inquiry_id'][int > 0 %}
{% if page[input']['inquiry_subject'] %} <input name="inquiry_subject" type="text" placeholder="例)a" value="{{ page['input']['inquiry_subject'] }}"> {% else %)} <input name="inquiry subject" type="text" placeholder="例)a"> {% endif %}
{% include "footer.html" %} </body> </html>
●header.html <p>date:2024-8-27</p>
●footer.html <p>author.p</p>
●page_a.pydef model(user):value_return = ""input = {}error = {}value_return <br>under constructions taken place by user '<br>'
#入力があった、if request.method == "POST": transition = request form.get("transition")#get, post, 取得するもので書き方が違う#request.args.get("inquiry_id")#request.form.get("inquiry_id"#request.json.get("inquiry_id") logging warming('#####' + user + 'transition: ' + str(transition)+'#####')
if transition == "new" or transition == "error" or transition == "confirm back": flag_ng=0 #入力値の判定 error_txt_inquiry_subject = [] inquiry_subject = request.form.get("inquiry_subject") ff not checkRequire(inquiry_subject): error_txt_inquiry_subject.append("件名が空欄です”) flag_ng=1
input[inquiry_subject] = inquiry_subject if flag_ng == 1: error['error_txt_inquiry_subject] = error_txt_inquiry_subject #エラー画面を出す destination = "error" else: #確認画面を出す destination = "confirm" #End of transition == "new" or transition == "error" or transition == "confirm back": else: #transition == "confirm_proceed" #登録処理し完了画面を出す destination = "complete"else: #初期画面を出す destination = "new"return ("value":value_return, "destination":destination, "input":input, "error":error)
■改行
プレースホルダー内での改行は
:に置き換える<textarea placeholder="例) aaa bbb">
JINJA2のフォーム入力後の確認HTMLの改行は?置換ではhtmlエスケープが掛かり<br>がそのまま表示されてしまいダメ{{ input | replace("\n", "<br>") }}
htmlエスケープ(HTMLエスケープは<>&のみだった)• 入力があればhtmlエスケープ+改行<br/>変換• html表示はそのままhtmlエスケープ+改行<br/>変換状態で出力• DBにそのままhtmlエスケープ+改行<br/>変換状態で出力入れる• htmlフォーム内表示はhtmlエスケープを解除し表示↓
入力値はそのままinput変数に保持confirm画面でエスケープ (html.escape()+改行<br/>変換) しescape変数に保持DB保存時にはescape変数にプラスしてダブル/シングル/バッククォート、セミコロン、バックスラッシュをエスケープし保存DBから取り出す際はそれらをアンエスケープしescape変数に保持Docへはinput変数で保存画面表示時はアンエスケープ (改行<br />変換+html.unescape())
def escapeHtmlBr(text): if text is None: return text elif isinstance(text, list): list_escaped = [html.escape(item) for item in text] list_escaped [item.replace("\n', '<br>') for item in list_escaped] return list_escaped else: escaped_text = html escape(text)
return escaped_text.replace('\n', '<br>')
def unescapeHtmlBr(text): if text is None: return text elif isinstance(text, list): list_unescaped = [item.replace('<br>', '\n') for item in text] list_unescaped = [html.unescape(item) for item in list_unescaped] return list_unescaped else: text text.replace('<br>', '\n') return html.unescape(text)
def escapeDB(text): if text is None: return text elif isinstance(text, list): list_escaped = [item.replace(';', ';') for item in text] list_escaped = [item replace('"', '"') for item in list_escaped] list_escaped = [item.replace("'", ''') for item in list_escaped] list_escaped = [item.replace('\\', '\') for item in list_escaped] list_escaped = [item.replace('`', '`') for item in list_escaped] return list_escaped else: escaped_text = text.replace(';', ';') escaped_text = escaped_text.replace('"', '"') escaped_text = escaped_text.replace("'", ''') escaped_text = escaped_text.replace('\\', '\') escaped_text = escaped_text.replace('`', '`') return escaped text
def unescapeDB(text) if text is None return text elif isinstance(text, list): list_unescaped = [item replace('`', '`') for item in text] list_unescaped [item.replace('\','\\') for item in list_unescaped]
list_unescaped [item.replace(''', "'") for item in list_unescaped] list_unescaped [item.replace('"', '"') for item in list_unescaped] list_unescaped [item.replace(';', ';') for item in list_unescaped] return list_unescaped else: unescaped_text = text.replace('`','`') unescaped_text = unescaped_text.replace('\', '\\') unescaped_text = unescaped_text.replace(''', "'") unescaped_text unescaped_text replace('"', '"') unescaped_text = unescaped_text.replace(';', ';') return unescaped_text
■文字確認def check_special_characters(a):| #チェックする記号のセット special_characters = ['<', '>', '"', '&'] #特定の記号が含まれているかをチェック if any(char in a for char in special_characters): raise ValueError(f"変数 'a' に禁止されている文字が含まれています: {a}")try: a = "Hello & World" check_special_characters(a)except ValueError as e: print(e)
■DBのnull行の排除bq = bigquery.Client()sql = f"""SELECT a FROM `ds.b' WHERE c = '{pri}'"""results=bq.query(sql)list = list()for row in results: if row.a is not None: list.append(str(row.a))
■Flask-WTF CCSRF対策でhiddenに入れるhttps://qiita.com/RGS/items/c8c99970054a481ac80drequrement.txt Flask-WTF==1.2.1
from flask_wtf import CSRFProtectapp = Flask(__name__)app.config['SECRET_KEY'] = 'mysecretkey'csrf = CSRFProtect(app)
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
PRGパターンでGETで完了画面に行くがエラーとならない、WTFはPOSTのみ利くようだ
●完了画面でセッション変数がない場合はエラーとする保存処理でdoc_idをセッション変数に入れ不正で直接完了画面にいくとエラーとするhttps://xxxx.com/complete?doc id=ddd
■重複登録の回避策(PRG方式+JSボタン無効)・リダイレクト POST/Redirect/GET パターン・連打を避けるためボタンのJS無効化片方のみのためquerySelectorAll() を使う>ページ遷移しなくなった>下記JSを使う
@app.route('/submit', methods=['POST'])def page(): page = model if complete: session['doc_id'] = page['input']['doc_id'] redirect(url_for('thank_you')) else: retrun template('layout.html')
@app.route('/thank_you')def thank_you(): if 'doc_id' in session: page['input']['doc_id"] = session['doc_id"] session clear() return render_template('complete_layout.html', page=page) else: return render_template('error.html", message="missing arg")
@app.errorhandler(404)def page_not_found(e) return render_template('error html', message="Page not found"), 404
error.html側<h1>{{message }}</h1>
submit側連打を避けるためボタンの無効化片方のみのためquerySelectorAll() を使うとページ遷移しなくなる等がある<script>document.addEventListener('DOMContentLoaded', function(){ const form = document.getElementById('form'); const buttons = form.getElementsByTagName('button'); form.onsubmit= function(event) { //クリックされたボタンを取得 const clickedButton = event.submitter; //隠しフィールドを追加して、ボタンのname と value を送信 const hiddenField = document.createElement('input'); hiddenField type = 'hidden' hiddenField.name = clickedButton.name; hiddenField.value = clickedButton value; form.appendChild(hiddenField); // すべてのボタンを無効化して二重送信を防止 for (let i = 0; i < buttons.length; i++) { buttons[i].disabled = true; } }}</script>
Comment (0)
■24/8/17 7:20PM
モバイルキーボードアクションカメラ
モバイルキーボード Bluetooth 3.0 Keyboard KIKIGOAL 低電圧でLED青灯、充電4hrsで60hrs使用、充電時は赤灯で完了時は消灯 Fn+C(青歯アイコン)でBluetooth灯が点滅しペアリング準備中(Bluetooth 3.0 Keyboard)
接続時に消灯、CapsLockでLED白灯 システム切換:Fn+WでWin用、Fn+QでAndオイド用、Fn+EでiOS用
AndオイドはShift+Spaceで日本語切り替え コピペ:メール等のテキストappはカーソルがでるのでShift+←→で選択、Ctrl+c/v ブラウザは、反転させてから後ろへはShift+→で選択できる、もっと良い方法は? F10で英数不可問題:システムをandオイドにせず、winだとスマホの機能はFnで呼び出さない つまり入力時はFn+WでWin用にすると良い F6:ひらがな/F7:全角カナ/F8:半角カナ/F9:全角英数/F10:半角英数 変換問題:スペース後に早すぎる決定があると最初の候補が選ばれる? 変換時にSpaceで切替てEnter押しても変、タッチパネル使う?
↓
安価タブレットの方が読書メモには使いやすい<画面デカいし入力予測の選択がやり易い
2024/11に1万円だが、モッサリし過ぎなのでもうちょい良いのが欲しいが
タブレット BMAX I9Plus Android14 1.8GHz 8コアCPU ディスプレイ 10.1inches 1280x800 FHD1080p メモリ4G+8G 64GBストレージ bluetooth5, 802 11 acbgn, microsd「Google Pixel 6a」実機でWi-Fiテザリングを使うための設定方法を詳しく紹介!外出先でモバイルルーターのように!
==========
アクションカメラ XTU S6 JP-S6 Ambarella H22 CPU Cortex-A53/1.2GHz 4コア SONY IMX386、1/2.8''CMOSセンサー
170度広角、6軸ジャイロ手ぶれ補正4.0 H.264/265コーデック Mirco SDカード クラス10UHS-3以上 64-256GB 1350mAhバッテリー
【SuperView超広角機能&縦向き撮影機能】スーパービュー機能で臨場感のある広角映像を撮影できます。4:3 のアスペクト比で撮影した映像が 16:9 のアスペクト比にダイナミックに引き伸ばされます。カメラセンサーの 4:3 比率で得られる上下幅を利用するため、カメラを水平線に向けている場合でも撮影範囲に入る空や地面が広くなる(4K/30fps,1080P/60fps)
【WiFi/リモコン/音声制御可】Wi-Fiが内蔵、スマホに専用アプリをインストールすれば、ライブビューモードで画像を確認するだけではなく、撮影した映像を動画共有サイトやSNSに直接に投稿することができます。10Mの遠隔操作ができるリモコンコントロール付。音声で録画はじめ、終了と制御出来ます
【Gyroflowアプリ対応&Type-Cポート対応&HDMI出力】手ブレを補正するジャイロデータモードが搭載されているため、手ブレ補正アプリ「Gyroflow」に対応。手ぶれ補正のレベルや画像効果を自由に編集することができます。Type-Cで高速充電可能です。さらに、MicroHDMIも搭載されているため、映像をテレビやプロジェクターなどの大画面で再生できます。USBType-Cで充電や外部マイク可。
当日テスト撮影してAWBとISOと明るさを決めるのが良さそう(AWB/ISOは自動で明るさだけでもいいが)↑■中央サイズ表示:録画設定4K30、4K30(SuperView)、2.7K30、1440P60、1440P30、1080P120、1080P60、1080P60(SuperView)、1080P30、1080P30(SuperView)、720P240-30>720P60(か1080P60)セグメント:自動、1/3/5分>3分録音on/off>ON事前記録9-20s/off>OFF測光モード:中央重点/評価/スポット>評価
露出:+3to-3>-0.5LDC(Lens Distortion Correction:歪曲の曲面補正)>ON手振れ補正:オフ/普通/ジャイロデータ>スーパー補正
AWB(オートホワイトバランス):自動/晴れ/曇り/白熱灯/蛍光灯>自動(晴れ)ISO:100-1600>自動(100から出来るだけ低め)
シーンモード:自動/人物/風景/露補正>風景シャープネス:高/ミディアム/低>高
コントラスト:1-6>3明るさ:1-6>2彩度:1-6>5
画像の品質:標準/高>高
フィルタ:オリジナル/モノクロ/ビビッド/セピア/ワーム/クール>オリジナルエンコード:H264/H265(見れんかった)>H264(mp4 低圧縮だがwinデフォで使える)
■コグアイコン:設定自動スリープ:オフ10-60s>30自動オフ1-5m>3m
wifi 周波数50/60Hz>50WDR(ワイドダイナミックレンジ)逆光や白飛びや黒つぶれハードウェア処理、文字が見難くなる>ON
マイク音量:ノイズ小/デフォ/高>ノイズ小前画面の視角(FOV:field of view)>デフォFlipホーム画面を90/180/270°回転>0スタンプ(時間を記録)>ON操作音(ボタンの押下音、シャッター音)グリッドガイド(参照グリッド線のon/off)日付音声制御(ビデオスタート、ビデオ停止、スクリーンオン、スクリーンオフ、wifi on、wifi off、写真を撮る)>ONSDフォーマット初期設定に戻す
■絵アイコン:再生
再生一覧
■ビデオアイコン:撮影モード
撮影モード(録画、タイムラプス:静止画を定期的に撮影して繋げる、スローモーション、夜景モード、ドラレコ、録画+撮影)※モードを選ぶと使えるサイズとFPSが決まる、手振れ補正使えないサイズもある、スローは音無し>(通常)録画
■操作:下にスワイプwifi on>off画面回転リモコン>on音声制御>on画面ロック電源off
■物理ボタン電源/撮影モードボタン撮影開始/停止/3s長押しで前後モニター切り替えボタン※電源と撮影開始ボタンの間に内蔵マイク穴▲ボタン(設定メニュー、長押しwifiスイッチ)▼ボタン(録画設定)
■リモコン
赤カメラアイコン:写真
グレービデオアイコン:動画
■撮影
カメラを装着、電源を真ん中ボタン長押しで入れ、リモコンのグレーで撮影開始、リモコンのグレーで撮影停止
ハンドルバーにセットだけで逆撮りだが撮影可
ブレが修正されており、画像も綺麗で問題ない
逆画面になっているがプレイヤーでもエディターでも回転できる
タイムラインで選択してプレビューで⊕を回転ドラッグ
自撮り棒は振動で角度が駄目になるのでフェンダー固定が必要そう
[Click for image]
※電源が入らず2025/1に交換した v1.06>v1.08のマニュアルになった、3年保証で補償も悪くない
過充電か過放電?数回の使用で何もしてないが気を付けられるのはそこだけ
==========
3Dプリンタ(欲しい部品があるなら作ればいいのでは)
「3d プリンター」「プロダクトデザイン」から探す | ココナラ
Comment (0)
■24/7/18 10:32PM
ノーの状態
[Click for image]
ウメハラ氏がいわゆるビーストモードで勝つ時は「強い恐怖」がきっかけと振り返りで語っていたので、きっとそうやって扁桃体や海馬辺りの「古い脳」を活性化させているのだろう
因果が逆のような気も
γ波からα波なら良いが、逆に行ってまう場合もあるやろし、イケると思ってイケないと
[B! 脳] 世界初、eスポーツ対戦直前の脳波から勝敗と強く関わるパターンを発見・実証~「実力が拮抗した試合」や「番狂わせ」を約80%の精度で予測~ | ニュースリリース | NTT (hatena.ne.jp)
[Click for image]
交差法と平行法を繰り返すと良いらしい
エンジニアを10年以上やって視力2.0を保つ秘訣 (zenn.dev)
報道の日2024 TBSテレビ報道70年〜8つの禁断ニュース[字] | TBSテレビ
仁義なき派閥争い田中角栄と三木武夫が歩んだ道和歌山毒物カレー事件“史上最大”過熱報道で消された目撃証言唯一の被爆国になぜ?原発導入に日米の思惑大量破壊兵器のウソCIAの情報捏造検証トランプ仕掛けた?議会襲撃事件の真相は?ロシアと北朝鮮が軍事同盟アジアに新たな火種…メディアに政権の圧力 日本初のキャスター降板万博成功のカギは? 54年前の予算管理あさま山荘事件 初公開!突入の記録独裁政権崩壊へ暗殺を暴いたテレビ報道ハイジャック16時間報じられなかった突入の瞬間戦後初の大手銀行破たん元頭取明かす裏舞台中国外交の分岐点 漁船衝突の裏で…
→偏向報道していますよというTV番組
Comment (0)
Navi: < 1 | 2 | 3 | 4 >
-Home
-Column [133]
-Europe [9]
-Gadget [77]
-Web [136]
-Bike [4]
@/// BANGBOO BLOG ///

