/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

December 27, 2024

GitHub Actions
ChatGPTかGeminiかに聞けば良さそう

■GitHub Actionsの動作内容はリポジトリ内に設定されている.github/workflows内縺?YMLにある
steps:
- name: Checkout
  uses: actions/checkout@v4

@以臀??はバージョン、特藹??のコミットSHAにもできる @3df4ab11eba7bda6032a0b82a6bb43b11571feac #v4
Commits · actions/checkout · GitHub
onセクション縺?PushやPR作成やスケジュール藹??行等のトリガーや対象ブランチやパス軆??も書かれている
Secretsや環藹??変数は、Terraformでクラウドプロバイダーにアクセスする場合等で、GitHub Actions縺?secrets で鐔??証情報が設藹??されていることが多い。これらはリポジトリ縺?Settings > Secrets and variables > Actions で確認可能。
GitHub Actions でのシークレットの使逕? - GitHub Docs

name: Deploy Terraform

on:
push:
branches:
- main #この場合、mainブランチへ縺?pushでトリガーされる

jobs:
terraform:
runs-on: ubuntu-latest
steps:
- name: Checkout code
  uses: actions/checkout@v3
- name: Setup Terraform
  uses: hashicorp/setup-terraform@v2
  with:
terraform_version: 1.4.0
- name: Initialize Terraform
  run: terraform init
- name: Apply Terraform
  run: terraform apply-auto-approve #terraform planなしじゃ

Posted by funa : 09:25 PM | Web | Comment (0) | Trackback (0)


December 24, 2024

He is a good egg.
ゆで卵 キン肉マン 聖なる夜 メリ繝?Xマ繧?
茹でる前に画びょうで平ケツに穴をあける
湯に酢を入れる
7分強茹でる
余辭?5分縺?らい(ゆで鐔??測器で測る)
冷水に入れて温水より下の温度の水中で臀??記のスプーンでむ縺?

たまご名人 2wayスプーン・??マドラー【公藹??】≪・??個からお届け竕?Can★Doネットショップ

Posted by funa : 09:00 PM | Column | Comment (0) | Trackback (0)


September 5, 2024

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

///dict
my_dic['name'] = 1
return 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 Environment
jinja_env = Environment()
jinja_env.trim_blocks = True
jinja_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
笳?flask
page=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.py
def 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)


■改鐔??
プレースホルダー内での改鐔??縺?&#13:に置き觸??える
<textarea placeholder="例) aaa&#13;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(';', '&semi;') for item in text]
list_escaped = [item replace('"', '&quot;') for item in list_escaped]
list_escaped = [item.replace("'", '&apos;') for item in list_escaped]
list_escaped = [item.replace('\\', '&bsol;') for item in list_escaped]
list_escaped = [item.replace('`', '&#096;') for item in list_escaped]
return list_escaped
else:
escaped_text = text.replace(';', '&semi;')
escaped_text = escaped_text.replace('"', '&quot;') 
escaped_text = escaped_text.replace("'", '&apos;')
escaped_text = escaped_text.replace('\\', '&bsol;')
escaped_text = escaped_text.replace('`', '&#096;')
return escaped text

def unescapeDB(text)
if text is None
return text
elif isinstance(text, list):
list_unescaped = [item replace('&#096;', '`') for item in text]
list_unescaped [item.replace('&bsol;','\\') for item in list_unescaped]
   list_unescaped [item.replace('&apos;', "'") for item in list_unescaped]
list_unescaped [item.replace('&quot;', '"') for item in list_unescaped]
list_unescaped [item.replace('&semi;', ';') for item in list_unescaped]
return list_unescaped
else:
unescaped_text = text.replace('&#096;','`')
unescaped_text = unescaped_text.replace('&bsol;', '\\')
unescaped_text = unescaped_text.replace('&apos;', "'")
unescaped_text unescaped_text replace('&quot;', '"')
unescaped_text = unescaped_text.replace('&semi;', ';')
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/c8c99970054a481ac80d
requrement.txt Flask-WTF==1.2.1

from flask_wtf import CSRFProtect
app = 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>

Posted by funa : 11:34 PM | Web | Comment (0) | Trackback (0)


August 17, 2024

モバイルキーボードアクションカメ繝?
モバイルキーボード 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

==========
アクションカメラ 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分>5分
録髻?on/off>ON
事前記骭?9-20s/off>OFF
測光モード:中央重轤?/評萓?/スポット>評萓?
露出・??+3to-3>-0.5
LDC(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>50
WDR(ワイドダイナミックレン繧?)逆光や白饅??びや黒つぶれ繝?ードウェア処理、文字が見難縺?なる>ON
マイク音量:繝?イズ藹??/デフ繧?/高>繝?イズ藹??
前画面の鐔??角(FOV:field of view)>デフ繧?
Flipホーム画面を90/180/270°回転・??0
スタンプ(時間を記骭?)>ON
操作髻?(ボタンの押臀??音、シャッター音・??
グリッドガイド(藹??照グリッド線縺?on/off)
日臀??
音声制御(ビデオスタート、ビデオ停止、スクリーンオン、スクリーンオフ、wifi on、wifi off、写真を撮る)>ON
SDフォーマット
初期設藹??に戻す

■絵アイコン・??再生
再生一隕?

■ビデオアイコン・??撮影モード
撮影モード(録画、タイムラプス・??静止画を定期的に撮影して軆??げる、スローモーション、夜景モード、ドラレコ、録画・??撮影)
※モードを選ぶと使えるサイズ縺?FPSが決まる、手振れ補正使えないサイズもある、スローは音無し>(通蟶?)録逕?

■操作:下にスワイプ
wifi on>off
画面回霆?
リモコン・??on
音声制御>on
画面ロッ繧?
電觸??off

■物理ボタ繝?
電觸??/撮影モードボタ繝?
撮影開始/停豁?/3s長押しで前後モニター切り替えボタ繝?
※電觸??と撮影開始ボタンの間に内蔵マイク穴
▲ボタン・??設藹??メニュー、長押しwifiスイッチ)
▼ボタン・??録画設定)

■リモコ繝?
赤カメラアイコン・??写真
グレービデオアイコン・??動逕?

■撮影
カメラを装着、電觸??を真ん中ボタン長押しで入れ、リモコンのグレーで撮影開始、リモコンのグレーで撮影停豁?

繝?ンドルバーにセットだけで逆撮りだが撮影藹??
 ブレが修正されており、画蜒?も綺饅??で問題ない
 逆画面になっているがプレイヤーでもエディターでも回転できる
  タイムラインで選択してプレビューで⊕を回転ドラッ繧?
 自撮り棒は振動で鐔??度が駄目になるのでフェンダー固藹??が必要そう


※電觸??が入らず2025/1に交觸??した v1.06>v1.08のマニュアルになった、3年臀??証で鐔??償も悪縺?ない
 驕?充電か驕?放電・??数回の使用で臀??もしてないが気を付けられるのはそこだけ

Posted by funa : 07:20 PM | Gadget | Comment (0) | Trackback (0)


July 18, 2024

繝?ーの状態

ウメ繝?ラ觸??がい繧?ゆるビーストモードで勝つ時は「強い恐怖」がきっかけと振り返りで鐔??っていたので、きっとそうやって扁桃体や海馬辺りの「古い脳」を活性化させているのだろう
因果が逆のような觸??も
γ波からα波なら良いが、逆に鐔??ってまう場合もあるやろし、イケると思ってイケない縺?
[B! 閼?] 世界初、eスポーツ対戦直前の脳波から勝敗と強縺?関繧?るパターンを発鐔??・藹??証・??「実力が拮抗した試合」や「番狂繧?せ」を約80%の精度で臀??測・?? | ニュースリリー繧? | NTT (hatena.ne.jp)



交差法と平行法を繰り返すと良いらしい
エンジニアを10年以上やって鐔??力2.0を保つ軆??險? (zenn.dev)

報道の日・??024 TBSテレビ報道70年〜8つの軆??断ニュー繧?[字] | TBSテレビ
仁義なき派閥臀??い田中角栄と臀??木武夫が歩んだ道
和歌山觸??物カレー臀??件“史臀??最大”驕?熱報道で觸??された目撃証鐔??
唯臀??の被爆国になぜ?藹??発藹??入に日米の思惑
大驥?破藹??兵器のウ繧?CIAの情報謐?造検險?
トランプ仕觸??けた?議臀??襲撃事件の真相は・??
ロシアと北朝鮮が軍事同盟アジアに新たな火種窶?
メディアに政権の圧力 日本初のキャスター降譚?
万博成功のカギは・?? 54年前の臀??算管理
あさま山荘事莉? 初公開!突入の鐔??骭?
独鐔??政権崩藹??へ暗殺を暴いたテレビ報道
繝?イジャッ繧?16時間報じられなかった突入の瞬間
戦藹??初の大手銀行破たん元頭藹??譏?かす陬?舞藹??
中国藹??交の分岐点 漁船鐔??突の鐔??で窶?
 →蛛?向報道していますよというTV番軆??

Posted by funa : 10:32 PM | Column | Comment (0) | Trackback (0)


June 21, 2024

BT
あそびはここで軆??繧?りにしようぜ~

Big Table
Cloud Bigtableを触ってみよう - Uzabase for Engineers
でっかいテーブル、読み書き菴?レイテンシー、RDBは鐔??荷饅??いときにレプ数臀??でスケールが難しいがBTはするので正隕?化せずに単一テーブルにしてお縺?感じ
row keyが主役
データを追加するの縺?3パターンある(行追加、列追加、セル追加)
 行に鐔??数カラムファミリーにカラムが幾つか入れられるの縺?KVSだが結局Where句みたいに使う?
  行キー「企讌?ID#日臀??」,COLUMN FAMILY「STOCK PRICE」,COLUMN「HI PRICE」「LO PRICE」に対し縺?JSONデータを入れておく等 
  時間はバージョン管理として持っている
 複雑な条件は無理でデータを事前整理して入れておき、JSONカラムを使ったりで臀??行にまとめスキャンを一発で觸??ます等で饅??スループットの縺?
  Google検索のようにキーワードを入れると、検索軆??果が数藹??く一瞬で鐔??る等
  複雑な条件縺?Dataprocを使うらしい

Big table構成
Bigtableを徹藹??解説! - G-gen Tech Blog
インスタンスの中に臀??つ以上のクラス繧?(ゾーン別に設定しレプリケーショ繝?)> 各クラスタに縺?1つ以上の同数の繝?ード 
 クラスタ縺? table > 複謨?Column family > 複謨?Column > セ繝?
bigtable_app_profilesで転送クラスタ先の設定する(単一行トランザクション設定を含む)
 -マルチクラス繧?(自動フェイルオーバ、単一行transaction不可でレプリケーションによる不整合あり) 
 -シングルクラス繧?(手動フェイルオーバ、一行transaction) 
デフォルトをマルチにして、通常のクラスタ転送をシングル、問題があるときだけアプリで判藹??しマルチに鐔??縺?
Bigtableで鐔??数クラスタ觸??成におけるデータ整合性の臀??險? - Carpe Diem (hatenablog.com)

スキーマ:
 テーブ繝?
 行キ繝?(row key)
 カラムファミリ繝?(カページコレクションポリシーを含む)
 カラム
更新したデータはタイムスタンプによりセル内で臀??存される
 解觸??するにはガベージコレクショ繝?
  期限切れ値、バージョン数で設定する

仕様:
KVS、行指向の鐔??単位でスキャ繝?
各テーブルのインデック繧? (行キ繝?)縺?1つのみで臀??諢?である必要がある
行は、行キーの鐔??書順に並べ替えられます。
列は、列ファミリー別にグループ化され、列ファミリー内で鐔??書順に並べ替えられます
列ファミリーは特藹??の順蠎?では臀??存されません
集計列ファミリーには集計セルが含まれます
行レベルでアトミッ繧? (複数鐔??だと知らんという諢?)
 アトミック諤?:トランザクション整合性がある(一部の操作だけ実行した状態とならずに・??
特藹??の鐔??縺?read/writeが集中するより分散が良い
Bigtable のテーブルはスバース、空白鐔??での觸??費はない

cbt CLI の觸??要  |  Bigtable Documentation  |  Google Cloud
cbt リファレン繧?  |  Bigtable Documentation  |  Google Cloud
gcloud components update
gcloud components install cbt
(-/cbtrcに以下記載すれ縺?-project縺?-instance はデフォルト値で省略できる)
cd ~
echo project unco > ~/.cbtrc
echo instance = chinco >> ~/.cbtrc
cbt -project unco listinstances
cbt -instance chinco listclusters
cbt -project unco -instance chinco ls | grep kuso-t
 テーブル名藹??得
cht -project unco -instance chinco ls kuso-table
 カラムファミリやポリシー軆??藹??得
cbt -project unco -instance chinco deletefamily kuso-table shikko-family
cbt -project unco -instance chinco deletetable kuso-table
 テーブルを消せばカラムファミリも削除になる

Posted by funa : 11:00 PM | Web | Comment (0) | Trackback (0)


June 19, 2024

スト6

///ストートファイタ繝?6

隠しシステムを覚えないといけないが膨大にある感じ、練軆??をして謨?Fの誤差で手癖を付けないと、、、→いかに藹??射神経で早く返せるかゲー、アスリートっぽいな、考えると饅??目で目で直接に手が動縺?感じで→菴?遅延ゲームモードのあるTV欲しい?
 - リフレッシュレート:144Hz以臀??
 - 応答速度・??1ms以臀??
モダンタイプという簡易操作法がある:クラシックタイプよりも出せる技が少ない、必殺技が蠑?SAに限定され荳?SA・弱SAが出せない、ダメージが80%に觸??少してしまうといったデメリット→純正コントローラの時はモダン・??、ホリファイティングコマンダ繝?OCTA買ってクラシックだ縺?

【モダン】
通常攻撃は弱□・中×・強〇
投げ 笆?+×(あるい縺?L2)
ダウン時にボタ繝?2つで藹??方藹??け霄?

必殺技は藹??殺技ボタン笆?
スーパーアーツは強〇+必殺技ボタン△・??オーバードライブ:EX技)
アシストボタ繝?R2を押しながら弱・??中・??強の連打でコンボ技のアシストコンボ

ドライブインパクト L1(相手の攻撃を藹??けつつもカウンター・??セビアタ・??
 ドライブリ繝?ーサ繝? ガード(あるい縺?R1) > L1+→(防御中の硬直をキャンセルして藹??撃)

ドライブパリ繧? R1(防御しドライブゲージを回復・??ブロッキング・??
 パリティドライブラッシュ・??ドライブパリティの觸??えからキャンセルしてダッシュ・??
  R1>→→ 1ゲージ觸??雋?
  →>→+R1 の方がやり易い
キャンセルドライブラッシ繝? (any+→:同時押し)(R1+→:同時押し)(技当ててダッシュ・??ガードキャンセル・??
 攻撃のま縺?R1オシッパにして前前
 攻撃キャンセルなの縺?3ゲージ觸??雋?

※ドライブラッシュの利轤?
ガード時とヒット時の相手の仰け藹??りフレームが4F増加し有利フレームが伸びて、通常時は確定藹??撃を藹??られてしまう技が安全に使えるようになったり、通常時は軆??がらない技が繋がるようになる、蟆?パンから投げができたり。+4Fということ。

※ドライブゲージ・??前に攻めていると良いが、後ろ向きで防御中藹??だと觸??るシステムと鐔??える)
消費・??相手の攻撃を被弾(ガードでも)
回復・??前歩き、時間(ただジャンプ中は回復が遅い)、相手に攻撃を当てる(ガードでも)、ドライブパリティで藹??ける

【クラシック】
投げ 蠑?P+蠑?K
ドライブインパクト 蠑?P+蠑?K
ドライブパリィ 荳?P+荳?K
パリティドライブラッシュ 荳?P+荳?K+→→、→>→+荳?P+荳?K
 起き上がりや硬直開けは前者、荳?2つ押しながら横を連打しと縺?
 通常は藹??者がいい、PKが遅縺?なってパリティが出やすいが、詳し縺?は・??
  N>→>荳?PK押しっぱなし>→ が良いと思う、↙防御から→が↘になりが縺?
キャンセルドライブラッシュ キャンセル可能技>(N or →)+荳?P+荳?K
 ↙荳?Kキャンセル・??N>荳?P+荳?Kがいい(人差し指の第一関軆??で中K>離して・??腹で中P)

スト6対戦のセオリ繝? - ストリートファイタ繝?6初心者wiki | スト6初心者wiki - atwiki(アットウィキ・??
【ストリートファイタ繝?6】マスターになるための”必須テクニック” 10驕? (youtube.com)
有利フレームがあれば 打撃か投げ 縺?2択ができる
 1/60秒=1フレーム=0.0166s、6Fが0.1s
 藹??射縺?0.2秒(12F)、限界縺?0.1秒(6F)縺?らい、インパクト返し0.43秒(26F)でも辛いが
遅らせグラップ
 打撃防御と投げ抜けの両方の防御ができる ←>蠑?P+蠑?K
  起き上がりにガードをしながら、少し待ってから投げを入力
シミ―
 有利フレームで投げ間合いから後ろ歩き、遅らせグラップの投げ空振りを誘う
  投げ空振りだとパニッシュカウンターとなり高火力コンボに鐔??ける
有利フレームの選択閧?
 攻撃側・??投げか打撃かシミ―、起き攻めは投げが強いが遅らせグラップが来る>その場合垂直ジャンプ
 防御側・??遅らせグラップか防御かOD無敵技、他はパリテ繧?/バクステ/バックジャンプ
画面端
 攻撃側・??ドライブインパクト強い、コンボ繋がる、投げ2回
 防御側・??バクステ藹??撃、ジャストパリィ藹??ろ投げ
ファジ繝?
 防御しながら相手の攻撃のタイミングで攻撃ボタン、蟆?P入れとく?
  発生の早い攻撃には防御、遅い技には割り込み攻撃ができる
安全饅??縺?
 ダウンした相手にガード入力をしながらジャンプ攻撃
  発生5F以臀??の対空無敵技に着地藹??にガードが間に合う
   対空しない相手には着地藹??に臀??段技からつなげる、あるいは着地藹??に投げ
仕込縺?
 通常技+必殺技を仕込んで入力してお縺?と、当たった時だけ必殺技が繋がる
  必殺技は早めに入力、遅いと普通に藹??殺技がでてしまう
ラッシュ臀??込縺?
 中か強・??→パリ繧?/Nパリィの入力してお縺?と、当たった時だけキャンセルラッシュになる、中鐔??離で臀??込んでお縺?
  逆に弱>→パリ繧?/Nパリィなら当たらずともキャンセルラッシュになる

インパクト返し
 26F=0.43s内。色藹??繧?りを見てドライブインパクトで鐔??す、他には投げる/パリ繧?/無敵技/3発藹??てる/アーマブレイク藹??諤?
 強を振り回す縺?DI返せない、DI返せる技振りをしてお縺?
 キャンセルでインパクト返しがおススメ、小中のキャンセル可能技を確鐔??してお縺?
連軆??ガード
 有蛻?Fが続き相手が黄色マスで軆??縺?ヤツ
  ドライブリバーサルだけやり返せる
ヒット確鐔??
 キャラを見るより体力ゲージが減るかで確認できる
  キャンセルラッシュでヒットしなければ弱で防御に回る等縺?
安全弾
 弱波動拳・??対空は鐔??離があれば藹??蜈?
  防御側はジャストパリィで有蛻?F伸びる+ジャンプ攻撃で対応できる
ドライブリバーサル鐔??合入力
 ↗荳?P+蠑?P+蠑?Kでガード時はドライブリバーサル、相手空振りならOD技??
パリィ縺?SA入力
 ゲージがあれ縺?SAだが、なければパリィ・???
省略入力
 ↘↓↘Pでも昇竜拳が出る、しゃがみながら昇竜なので対空有蛻?
バーンアウト
 ゲージが空、パリティできない、ガード硬逶?+4Fで藹??撃ムズイ、必殺技で臀??力削られる、壁やられでスタ繝?
  回復・??20s位、ガード/前歩きで早まる、ジャンプで遅縺?なる
アピー繝?
 蜈?6PKボタン・??+N、前、後、キャラにより下)??
  OPTIONボタンメニュー➡・??OPTION➡・??CONTROL➡・??設藹??変譖?>LS/RS/タッチバッドが割り当縺?
トレーニン繧?
 赤は通常技キャンセル可能、青は藹??殺技をキャンセルしSAに鐔??ける
 R3:キャラを変えて觸??備>レコードの鐔??録開始>レコード記録停豁?
 L3:再生開始
入力
 現技が出ているときに次の技ボタンを押す、次の次(の技のボタ繝?)は入れられない(レバー入力はできる)


Ken
ケ繝? コマンドリスト|STREET FIGHTER 6(ストリートファイタ繝?6)|CAPCOM
ストリートファイター・?? 今さら聞けないケンの藹??用性の饅??いコンボ(中・??上級編・??|SUGAKNEE・?すがにぃ (note.com)
【スト6】勝てるようになる縲?ケンの使い方縲?を解説!初心者におすすめの強い技や立ち回り、コンボ、起き攻めを紹臀??します!【STREET FIGHTER 6】【ストリートファイタ繝?6】 (youtube.com)
【5分下さい】ケンで“実戦向け”コンボを9個に軆??って紹介します【スト6】 (youtube.com)
【スト6】ケ繝? 最強コンボ集【プロ解説臀??き】 (youtube.com)
スト6 ケ繝? とりあえずこれを覚えれば戦えるコンボ - YouTube

Octaポジション・??基本は人差し指で弱、中指で中、薬指で強。
  →繋がり必要なら:人差し指で中K→中指で大P、人差し指で中P→中指で大Pのタゲコンなど、人差し指を中にズラ繧?
 人差し指範囲・??弱ボタ繝?2つの投げ
 中指範囲・??中ボタ繝?2つのパリテ繧?
 薬指範囲・??蠑?
  →ドライブインパクト縺?Lボタンにアサイ繝?
パンパンい繧?せて強めで叩く(キッチ繝?2つ押せる、フレーム間隔の手癖化)

鬘?撥臀??連 荳?P>蠑?P
SA(レバ繝?2回)、SA3は臀??力が25%以臀??ならクリティカルアーツ(CA)になる
 SA1 龍尾烈脚 ↖↖K
 SA2 疾風迅雷脚 ↗↗K
 SA3 神龍烈破 ZZP
龍尾脚 ZK
迅雷脚 ↓↘→K
 風饅??蹴り 中鐔??雷・??派生蠑?K あばれ潰し
 轟雷落とし 中鐔??雷・??派生荳?K 中段
奮鐔??脚 KK
 奮鐔??昇竜 KK>派生ZP
 奮鐔??竜巻 KK>派生↖K
 奮鐔??竜尾 KK>派生ZK(入れ替え)
OD(ボタ繝?2縺?)
 OD波動拳 ↗PP
 OD竜巻旋風脚 ↖KK
 OD昇龍拳 ZPP
 OD龍尾脚 ZKK
 OD迅雷脚 ↗KK >派生K >→K

///コンボ
(荳?P>蠑?P)鬘?謦?2連・??(間KK>↖K)奮鐔??竜巻・??遅めでギリギリ間に合う感じで、↖が不完全・??ゆっ縺?り目で、最後←押しっぱが良さそう)
鬘?謦?2連・??(間KK>ZK)奮鐔??竜尾脚>昇竜(間を少な目がいい)
蠑?P>OD波動>SA 4400

///藹??射
何か技がヒット or ラッシュ・??鬘?撥臀??連・??奮鐔??竜蟾? or 大昇竜
  蠑?P or ↓荳?K>荳?P+荳?K>荳?P>蠑?P>KK>↙K
↓荳?K or 蠑?P>キャンセルラッシ繝?
↓荳?K>弱軆??巻・??中昇竜 2500:竜巻早縺?入力
パニッシュカウンター強K>ラッシュ・??蠑?P>奮鐔??竜蟾?

///基譛?
波動拳からの対空昇竜、対空は弱昇竜(読みで臀??前にレバーは入れて置き、来たらPで・??
 防御から昇竜の場合はレバーの手の移動距離が長いので藹??射神経+大げさにレバーを動かす
 弱波動をラッシュで追いかけ攻撃
↓荳?K>迅雷・??派生蠑?Kか荳?K(ゲージ回復・??
 ↓荳?K>迅雷脚>派生>波動 で鐔??離をとる
後ろ前歩きでチョロチョロ間合い藹??り>読み合い(置き/差し/差し返し):長鐔??離強K/蠑?P/中↓K/蠑?
 リーチが長い技は遅い強、早い技は弱
  しゃがみ防御から迅雷脚は入れやすいし、長鐔??離・??派生で使える
  しゃがみ中Kキャンセル・??ラッシュか波動か弱軆??巻・??中昇竜
相手の硬直にカウンターコンボ
中鐔??離で軆??尾脚 or 生ラッシュ、他の狙いはカウンターでジャスパ/ドライブインパクト
起き攻め
 ラッシュ投げ、ラッシュ・??鬘?撥臀??連・??奮鐔??竜蟾?/大昇竜
 ↓蟆?K>↓荳?K>迅雷脚>派生
 (屈)蟆?Px2>大昇竜 屈蟆?Pヒット確鐔??練軆??
遶?
 屈螟?P>迅雷・??強派生>弱昇竜
 鬘?撥臀??連・??奮鐔??竜尾脚>昇竜

Ryu
中臀??:足払い と 強前:ま繧?しげり のリーチ長いや縺?
中前:中段饅??骨割り2発・??立ちガードが必要なので良き技となる)
強藹??:かかとおとし2逋?

スト6リュウ臀??験版モダンコンボとか雑感まとめ|アズサキチャンネル【東和豁?/戸藹??時貞】 (note.com)
【スト6体験版】モダ繝? リュ繧? コンボまとめ in Demoバージョン【Modern Ryu】 - YouTube
【スト6(OBT)】必要十分!リュウ藹??用コンボ(モダ繝?TYPE)【RYU basic combo】 - YouTube
【スト6】知らないと損!意外と知らないスト6豆知鐔??集!【テクニック】 - YouTube
【初心者向け】全キャラの強技や強連携の対策教えます!【スト6】 - YouTube

===========
内臓と藹??付けをSSD化
実はカンタン・??PS4縺?SSD化 | 株藹??会社アス繧? (ask-corp.jp)
PS4を外付けSSDで饅??速化させる方觸??を解説。内阡?HDD觸??装より手軽にできる! - 価譬?.comマガジ繝? (kakakumag.com)
PS4®の内蔵ドライブをSSDに觸??装して饅??速化しよう! -エレコム (elecom.co.jp)

Posted by funa : 12:36 AM | Column | Comment (0) | Trackback (0)


June 2, 2024

Cloud SQL
■Cloud SQL Python Connector (Cloud SQL language Connector)
CloudSQL auth proxyのバイナリインストールでないやり譁?
Cloud SQL Python Connector自臀??は暗号化しないが、内驛?IPならサーバレ繧?VPCコネクタで暗号化された通信が使え安全になっている。外驛?IPアドレスの場合縺?Cloud SQL Auth Proxyで通信を暗号化。
Cloud SQL 言語コネクタの觸??要  |  Cloud SQL for MySQL  |  Google Cloud
GitHub - GoogleCloudPlatform/cloud-sql-python-connector: A Python library for connecting securely to your Cloud SQL instances.

事前必要(pip install>requirements.txt)
Flask==3.0.3
gunicorn==22.0.0
Werkzeug==3.0.3
google-cloud-bigquery==3.25.0
google-cloud-logging==3.11.1
google-cloud-secret-manager==2.20.2
google-api-python-client==2.141.0
google-auth-httplib2==0.2.0
google-auth-oauthlib==1.2.1
websocket-client==1.8.0
google-cloud-resource-manager==1.12.5
Flask-WTF==1.2.1
cloud-sql-python-connector==1.16.0
pymysql==1.0.3

from flask import Flask, jsonify
from google.cloud.sql.connector import Connector
from google.cloud import secretmanager
import pymysql

# 環藹??変数の藹??鄒?
PW_NAME = "sql-pw"
PROJECT_NUM = "1234567890"
DB_INSTANCE = "prj:asia-northeast1:db_instance"
DB_USER = "db-user"
DB_NAME = "db001"

# Secret Manager からパスワードを藹??得する関謨?
def get_pw(pw_name, project_num):
    client = secretmanager.SecretManagerServiceClient()
    resource_name = f"projects/{project_num}/secrets/{pw_name}/versions/latest"
    res = client.access_secret_version(name=resource_name)
    credentials = res.payload.data.decode("utf-8")
    return credentials

# Cloud SQL接続
def sql_getconn(connector):
    pw = get_pw(PW_NAME, PROJECT_NUM)
    conn = connector.connect(
        DB_INSTANCE,
        "pymysql",
        user=DB_USER,
        password=pw,
        db=DB_NAME,
        ip_type="private",
    )
    return conn

app = Flask(__name__)

@app.route('/test', methods=['GET'])
def get_table_data():
    try:
        connector = Connector()
        conn = sql_getconn(connector)
        cursor = conn.cursor()

        # SQLを実行して軆??果を藹??得
        cursor.execute("SELECT no, name, targetDate FROM test")
        rows = cursor.fetchall()

        # 結果をJSON形藹??に藹??觸??
        result = [
            {
                "no": row[0],
                "name": row[1],
                "targetDate": row[2].strftime("%Y-%m-%d %H:%M:%S") if row[2] else None
            }
            for row in rows
        ]

        cursor.close()
        conn.close()
        return jsonify(result), 200

    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

=============
# 追加オプションを使った接続も藹??
    connector = Connector(
        ip_type="public",  # "private" また縺? "psc" も使用可閭?
        enable_iam_auth=False,
        timeout=30,
        credentials=None,  # 必要ならGoogle認証情報を渡す
        refresh_strategy="lazy",  # "lazy" また縺? "background"
    )

#トランザクショ繝?
    try:
        conn = sql_getconn(connector)
        conn.autocommit = False  # トランザクション開始、あるい縺? conn.begin()
        cursor = conn.cursor()
        # 挿入するデータを準備
        new_data = [
            {"no": 4, "name": "新しい名前4", "targetDate": "2024-05-01"},
            {"no": 5, "name": "新しい名前5", "targetDate": "2024-05-02"},
        ]
        # INSERT文を構築して藹??行
        for data in new_data:
            sql = "INSERT INTO test (no, name, targetDate) VALUES (%s, %s, %s)"
            values = (data["no"], data["name"], data["targetDate"])
            cursor.execute(sql, values)
        conn.commit()  # トランザクションをコミット
        print("Data inserted successfully.")
    except Exception as e:
        conn.rollback()  # エラーが発生した場合はロールバッ繧?
        print(f"Transaction rolled back due to an error: {e}")
    finally:
        cursor.close()
        conn.close()

#カーソ繝?
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
 params: dict形藹??で藹??得#[{'no': 1, 'name': 'Alice',...}, ...]
cursor = conn.cursor(cursor=pymysql.cursors.SSCursor)
 大驥?のデータを効軆??的に藹??得するためにストリーミングで軆??果を処理
cursor.execute(query, params=None)
 cursor.execute("SELECT * FROM test WHERE no = %s", (1,))
 params: プレースホルダーに対応する値のタブルまたはリスト
cursor.executemany(query, param list)
 cursor.executemany("INSERT INTO test (no, name) VALUES (%s, %s)", [(1, 'Alice'), (2, 'Bob')])
 param list:繰り返し実行するパラメータのリストまたはタブルのリスト
cursor.fetchone()
 row = cursor.fetchone()
 #結果があれ縺? (1, 'Alice', "2025-01-01") のような形蠑?縺?1行のみ藹??得
cursor.rowcount
 print(cursor.rowcount) #影響を藹??けた行数を返す

■接続検証用コンテナをビルド (内驛?IPを使うrun逕?)
gcloud builds submit --tag asia-northeast1-docker.pkg.dev/prj/artifact_reg_name/app_name

■IAM?
Cloud SQL設藹??縺?Cloud SQL 管理者 (roles/cloudsql.admin)、Cloud SQL インスタン繧? ユーザ繝? (roles/cloudsql.instanceUser)等縺?IAMが要る?
IAMユーザならいる、ローカ繝?Userなら不要と思繧?れる、ローカルでもCloud SQL Client (roles/cloudsql.client)等は鐔??る

■Cloud SQL MySQL設藹??
【開発環藹??】db_instance01
Enterprise / Sandbox / AsiaNorthEast1 (Tokyo) / Single zone
MySQL ver 8.4
Shared core/1cpu 0.6GB/HDD/10GB(auto increase)
PrivateIP/設藹??縺?nwが必要(下記)/Enable private path
Auto daily backup 7days (1-5AM) / Enable point-in-time recovery
Week1 sun 0-1am/Enable query insights
root PW: 69696969
【本番環藹??】
Enterprise plus? キャッシュ使う?
窶?CloudSQL縺?TFファイルに鐔??載がな縺?てもTFステートファイル縺?PWを含めてしまうためTF化しない

- NW: projects/prj/global/networks/sql-vpc-nw
- Connection name: prj:asia-northeast1 db_instance01

ユーザの臀??成 sql-user/82828282
 PWをコードに入れない、シク繝?Mgrに臀??存

■MySQL
utf8mb4_ja_0900_as_ci_ksを使う?
_ai... アクセントを区別しない (Accent Insensitive)
_as... アクセントを区別する (Accent Sensitive)
_ci... 大文字・藹??文字を区別しない (Case Insensitive)
_cs... 大文字・藹??文字を区別する (Case Sensitive)
_ks... カナを区別する (Kana Sensitive)
_bin... バイナ繝?

utf8mb4_unicode_ciで縺?"ア”と“あ”は同じものとして扱繧?れる
utf8mb4_ja_0900_as_ci_ks で縺?"繧?"≠”あ”となりカタカナとひらがなを譏?確に区別できる
utf8mb4_ja_0900_as_ci_ks ならふりがなを使った並び替えで有蜉?
日本鐔??のデータがメインで觸??索やソートでひらがな・カタカナ・觸??点の区別が必要なら utf8mb4_ja_0900_as_ci_ks が驕?
日本鐔??と英鐔??を混ぜたデータや広く互觸??性を持たせたいなら utf8mb4_unicode_ci の方が無髮?


インデックスをどのカラムに臀??ればいいか迷った時の・??つの設計方針 #DB - Qiita
テーブルレコード数が1万件以上
全臀??のレコード数縺?5%程度に軆??り込めるカーディナリティ饅??さ
WHERE句の選択条件、または軆??合条件
主キーおよびユニークの列には臀??成が不要
インデックスは更新性能を劣化させる


データベースとテーブルの臀??成
CREATE DATABASE db;
USE db;
CREATE TABLE test (
    no INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(8) NOT NULL,
    targetDate TIMESTAMP NOT NULL,
    PRIMARY KEY (no),
    INDEX index_name (name),
    INDEX index_targetDate (targetDate)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ja_0900_as_ci_ks;

ENUM型は選択肢で早いがALTERが面倒なの縺?varcharaにする
inquiry_type ENUM('bq', 'pii') NOT NULL
inquiry_type VARCHAR(255) NOT NULL,

VARCHAR(255) (よく使繧?れる最大サイ繧?)
VARCHAR(1024) (長めの文字列)
VARCHAR(4096) (長文向け)
長いテキストを扱うならTEXT型
InnoDB 縺?1行の最大サイズは軆??8KB (8126/バイト)
長さ縺??メール縺?255で良い

サンプルデー繧?
INSERT INTO `table` (`name`, `date`) VALUES ('aaa', '2002-02-23');

ORMapperは面倒なの縺?SQLを使う
ORM Quick Start — SQLAlchemy 2.0 Documentation
【SQLAlchemy】Generic Typesと各遞?DBの型 対藹??陦?
SQLAlchemyでのテーブル藹??鄒? #Python - Qiita

■データベースフラ繧?
confが直接変更できなためフラグとしてパラメータを渡せる
 Cloud SQL studio (コンソール縺?MySQLが使える)
  MySQLクライアントを使いたいならAuth proxyが必要
 HA構成だとフェールオーバーやリードレプリカ軆??が使える

■NW
Cloud SQLを徹藹??解説! - G-gen Tech Blog
Cloud SQLが内驛?IPだとサーバレ繧?VPCコネクタ、or 外驛?IPならSQL + auth proxy
内驛?IPで良いの縺?VPCを作る、CloudSQLを内驛?IPで臀??る
サーバレ繧?VPCアクセスコネクタを作る
 vpc: sql-vpc-nw, subnet: sql-vpc-subnet 192.168.77.0/24
  Gateway 192.168.77.1, Private Google Access On
  sql-vpc-nw-ip-range 192.168.78.0/24 on cloudSQL
  run-serverless-vpc-ac 192.168.79.0/28 on Run
ファイアウォールルールでポート (デフォルト縺?3306な縺?) を開謾?
Cloud Run 縺?NW設藹??で、サーバーレ繧? VPCコネクタを選択、ルートオプションとしてすべてのトラフィックを VPC コネクタ軆??由で送信を選択
CloudSQLを30分程度觸??けて起動、接続>接続テスト

VPC(例: 10.0.0.0/16)
サブネット(Cloud SQL 用・??: 10.10.0.0/24(例: us-central1、VPC内)
サブネット(VPCコネクタ用・??: 10.8.0.0/28(RunからVPCへ通信用、VPC外)
 VPC コネクタのサブネット縺? 10.8.0.0/28 のような藹??さな軆??囲を使用、VPC外だがrun自臀??がVPC外だから?
 VPC コネクタはリージョン単位なので、Cloud Run 縺? Cloud SQL を同じリージョンに配置するのが望ましい
Google Cloudの内驛?NW設鐔??によりVPC内の異なるサブネット間でも通信可閭?
 VPC内なら異なるリージョンのサブネットでもOK(VPC自臀??には軆??囲を設藹??なしでサブネット縺?IPが被らなけれ縺?OKか縺?
 追加の設定なしで、例え縺? us-central1 縺? VM から asia-northeast1 縺? Cloud SQLに直接アクセス藹??

外驛?IPの場合:
アプリがrunならサイドカーコンテナとし縺?Auth Proxyを追加できる
 サイドカーは同Pod内なのでループバックアドレ繧?127.0.0.1あるい縺?localhost:5432 (Auth Proxy起動時に指定したポート) に通信しCloudSQLに接続する
GCE縺?DLし縺?Auth proxyインストールでもいい
 アプリのコネクタ縺?Auth Proxy動いているGCE縺?IP:ポート番号を指定に通信しCloudSQLに接続する
 FWでポートも開けるこ縺?

■run サービスアカウント
run-sql@prj.iam.gserviceaccount.com に藹??要な権限
 Cloud SQL Client (roles/cloudsql.client)
 Run Invoker (roles/run.invoker)
 Compute Network User (roles/compute.networkUser) -VPCコネクタを使用する

runを建てるが、InternalIPのため同プロジェクト同VPC縺?GCE を作成し移動し縺?CURLでテスト
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "https://run-sql-test-1212124.asia-northeast1.run.app/test"

■MySQL縺?UUIDを使うか、連番を使うか? > ULIDを使う
UUIDは連番に対し
 セキュリティ臀??より安全、サーバが異なってもユニー繧?
 パフォーマンスが悪い (UUIDをプライマリキーにすると速度が落ちる場合がある)
連番縺?UUIDの両方を振り出してお縺?? > ULIDを使うことにする

Posted by funa : 01:06 PM | Web | Comment (0) | Trackback (0)


June 1, 2024

GCP hands-off 3
■VPC(例: 10.0.0.0/16)
サブネット(Cloud SQL 用・??: 10.10.0.0/24(例: us-central1、VPC内)
サブネット(VPCコネクタ用・??: 10.8.0.0/28(RunからVPCへ通信用、VPC外)
 VPC コネクタのサブネット縺? 10.8.0.0/28 のような藹??さな軆??囲を使用、VPC外だがrun自臀??がVPC外だから?
 VPC コネクタはリージョン単位なので、Cloud Run 縺? Cloud SQL を同じリージョンに配置するのが望ましい
Google Cloudの内驛?NW設鐔??によりVPC内の異なるサブネット間でも通信可閭?
 VPC内なら異なるリージョンのサブネットでもOK(VPC自臀??には軆??囲を設藹??なしでサブネット縺?IPが被らなけれ縺?OKか縺?
 追加の設定なしで、例え縺? us-central1 縺? VM から asia-northeast1 縺? Cloud SQLに直接アクセス藹??

■対象アセットに対する付荳?可能なロールの臀??覧表遉?
Full Resource Name(フルでのアセット名を探せる)

import google.auth
import googleapiclient.discovery

def view_grantable_roles(full_resource_name: str) -> None:
credentials.google.auth.default(
scopes=["https://www.googleapis.com/auth/cloud-platform"]
)
service = googleapiclient.discovery.build('iam', 'v1', credentials credentials)
roles = (
service roles()
queryGrantableRoles (body=["fullResourceName": full_resource_name}).execute()
)
for role in roles["roles"]
if "title" in role:
print("Title: role["title"])
print("Name: role["name"])
if "description" in role:
print("Description:" + role["description"])
print("")

project_id = "prj"
#resource = f"//bigquery.googleapis.com/projects/prj/datasets/ds"
#resource + f"//bigquery googleapis.com/projects/prj/datasets/ds/tables/tbl"
resource = f"//cloudresourcemanager.googleapis.com/projects/{project_id}"
view_grantable_roles(resource)

■ロールの臀??覧表遉?
https://cloud.google.com/iam/docs/roles-overview?hl=ja#role-types
1)事前定義ロールの場合縺? roles.get() を使用します。
2)プロジェクトレベルのカスタムロールの場合は、projects.roles.get() を使用します。
3)組織レベルのカスタムロールの場合は、organizations.roles.get() を使用します。
 これら3種饅??で全てを網軆??すると思繧?れます
 projectIDがsys-のもの縺?GAS、lifecycleStateがACTIVE以藹??のものも含まれるので注諢?

■bqへの書き込縺?
export GOOGLE_APPLICATION_CREDENTIALS="path/to/your-service-account-key.json"
pip install google-cloud-bigquery

from google.cloud import bigquery
client = bigquery Client()
#書き込み先のテーブル情蝣?
table_ref = f"{project_id}.{dataset_id}.{table_id}"

#サンプルデータの生成
def generate_sample_data(num_rows)
data = [
{
"organization": f"org_(num_rows)",
"permission". "view",
}
for _ in range(num_rows)
]
return data

data_to_insert = generate_sample_data(5000)
errors = client.insert_rows_json(table_ref, data_to_insert)

if errors:
print("Errors occurred: {errors}")
else:
print("Data successfully written to BigQuery!")

■データカタロ繧?
データアセットを検索する  |  Data Catalog Documentation  |  Google Cloud
Class SearchCatalogRequest (3.23.0)  |  Python client library  |  Google Cloud
サンプルで臀??様書縺?APIを使っているがqueryが空白刻みで入れる等の使い方が分かる

■BQスキーマ+ポリシータグ藹??得
from google.cloud import bigquery
def get_policy_tags_from_bq_table(project_id, dataset_id, table_id):
    print("################ bigquery.Client.get_table().schema start ################")
    print(f"Target table: {project_id}.{dataset_id}.{table_id}")
    bq_client = bigquery.Client()
    table = bq_client.get_table(f"{project_id}.{dataset_id}.{table_id}")
    schema = table.schema
    policy_tags = []
    for field in schema:
        print(f"Column: {field.name}")
        if field.policy_tags:
            tags = [tag for tag in field.policy_tags.names]
            policy_tags.extend(tags)
            print(f"Policy Tags: {tags}")
        else:
            print("> No Policy Tags assigned.")
    return policy_tags

PROJECT_ID = "prj"
DATASET_ID = "ds"
TABLE_ID = "test001"

policy_tags = get_policy_tags_from_bq_table(PROJECT_ID, DATASET_ID, TABLE_ID)
print("Collected Policy Tags:", policy_tags)

■ポリシータグ設定
from google.cloud import datacatalog_v1
from google.cloud import bigquery

PROJECT_ID = "prj"
DATASET_ID = "ds"
TABLE_ID = "tbl01"
COLUMN_NAME = "aaa"
POLICY_TAG_PROJECT = "prj"
POLICY_TAG_NAME = "projects/prj/locations/us/taxonomies/83893110/policyTags/11089383"

def list_taxonomy_and_policy_tag():
    print("############# Start #############")
    list_policy_tags = []
    client = datacatalog_v1.PolicyTagManagerClient()
    request = datacatalog_v1.ListTaxonomiesRequest(
        parent=f"projects/{POLICY_TAG_PROJECT}/locations/us"
    )
    try:
        page_result = client.list_taxonomies(request=request)
    except google.api_core.exceptions.PermissionDenied as e:
        print(f"Skipping project {POLICY_TAG_PROJECT} due to PermissionDenied error: {e}")
        return []
    except Exception as e:
        print(f"An error occurred for project {POLICY_TAG_PROJECT}: {e}")
        return []

    for taxonomy in page_result:
        print(f"############ Taxonomy display_name: {taxonomy.display_name} #############")
        print(f"############ Taxonomy name: {taxonomy.name} #############")
        request_tag = datacatalog_v1.ListPolicyTagsRequest(parent=taxonomy.name)
        try:
            page_result_tag = client.list_policy_tags(request=request_tag)
        except Exception as e:
            print(f"Error on {request_tag}: {e}")
            break
        for policy_tag in page_result_tag:
            print("Policy tag:")
            print(policy_tag)
            list_policy_tags.append({
                "project_id": POLICY_TAG_PROJECT,
                "taxonomy_display_name": taxonomy.display_name,
                "taxonomy_name": taxonomy.name,
                "policy_tag_name": policy_tag.name,
                "policy_tag_display_name": policy_tag.display_name,
            })
    return list_policy_tags

def update_table_schema_with_policy_tag(list_policy_tags):
    for policy_tag in list_policy_tags:
        if policy_tag['policy_tag_name'] == POLICY_TAG_NAME:
            print(
                f"Target policy tag:\n"
                f"  Project ID: {policy_tag['project_id']}\n"
                f"  Taxonomy Display Name: {policy_tag['taxonomy_display_name']}\n"
                f"  Taxonomy Name: {policy_tag['taxonomy_name']}\n"
                f"  Policy Tag Name: {policy_tag['policy_tag_name']}\n"
                f"  Policy Tag Display Name: {policy_tag['policy_tag_display_name']}"
            )
            client = bigquery.Client()
            table_ref = f"{PROJECT_ID}.{DATASET_ID}.{TABLE_ID}"
            table = client.get_table(table_ref)
            new_schema = []
            for field in table.schema:
                if field.name == COLUMN_NAME:
                    new_schema.append(
                        bigquery.SchemaField(
                            name=field.name,
                            field_type=field.field_type,  # Keep original field type
                            mode=field.mode,             # Keep original mode
                            description=field.description,
                            policy_tags=bigquery.PolicyTagList([POLICY_TAG_NAME]),
                        )
                    )
                else:
                    new_schema.append(field)
            table.schema = new_schema
            updated_table = client.update_table(table, ["schema"])
            print(
                f"Updated table {updated_table.project}.{updated_table.dataset_id}.{updated_table.table_id} schema\n"
                f"with policy_tag {POLICY_TAG_NAME} on the column {COLUMN_NAME} successfully."
            )
if __name__ == "__main__":
    list_policy_tags = list_taxonomy_and_policy_tag()
    update_table_schema_with_policy_tag(list_policy_tags)



■KSA問題
ブログ内で情報が分散、まとめたい
ワークロード豈?縺?KSA1縺?
ksa縺?token縺?k8s api用縺?gcp apiに使えない、exprireしない問題がある> Workload identity で解決する

Workload Identity 縺? KSA縺?GSAの軆??づけで、Workload Identity Federationとは違う
workloads がk8sの用鐔??でリソースの軆??称で、そ縺?identityであり権限管理、縺?Federationは更に藹??部連謳?
 ワークロードは、pod, deplyment, StatefulSet, DaemonSet, job, CronJob, ReplicationController, ReplicaSet


Workload Identity がGKE クラスタで有効化されると、gke-metadata-server という DaemonSet がデプロ繧?
gke-metadata-server 縺? Workload Identity を利用する上で藹??要な手続きを実行

SAの軆??づけ
/// 現鐔??
Workload identityを有効にし縺?(autopilot でデフォルト有蜉?) 
GCP側縺?KSA縺?GSAをIAM policy binding 
k8s側縺?KSA縺?GSAをkubectl annotate 
pod縺?KSAを設藹??
/// 新型縺?KSA直接bind
workload identity federation ならGSAがな縺?なりKSAを直接bindできる
Workload identityを有効にし縺?(autopilot でデフォルト有蜉?)
GCP側縺?KSA縺?IAM policy binding

※混在するので現鐔??のままが良いようです

■Workload identity federation(GCP外との連携・??
Workload Identity Federation の臀??組縺?
まずWIF用縺?SAを作成する>SAに権限を付荳?する>
1)Workload identity provider+SAの情報をgithub actionに埋めて使う
 GitHub Actions から GCP リソースにアクセスする用途
2)Workload identity poolから構成情報をDLしAWSアプリに埋めて使う
 AWSからGCP リソースにアクセ繧?
する用途
  gcloud auth login-cred-file=構成情報ファイルパ繧?
3)Workload identity poolから構成情報をEKS縺?OIDC ID token のパスを指定しDL
 EKS から GCP リソースにアクセ繧?
する用途
- EKSのマニフェストのサービスアカウントのア繝?テーション縺?IAMロールを記載
- EKSのサービスアカウントを使用したい Podのア繝?テーションに追加
- マウント先のパスを環藹??変謨? GOOGLE APPLICATION_CREDENTIALS に設定
- Pod内縺?SDK またはコマンドに縺?GCP リソースヘアクセス可能か確鐔??

Posted by funa : 03:24 PM | Web | Comment (0) | Trackback (0)


May 9, 2024

Pubsub
■pubsub
Publisher app → |GCPの藹??| Topic(Schema) → Subscription 1や2 |GCPの藹??| → Subscriber app
 サブスクライバ繝?app縺?Pull/PushさせるPull/Pushのサブスクリプションをトピックに軆??づける設藹??をしてお縺?

【図解付き】Cloud Pub/Subに觸??要や使い方について繧?かりやすく解説 - KIYONO Engineer Blog (kiyono-co.jp)
Pub/Sub サービスの觸??要  |  Pub/Sub ドキュメント  |  Google Cloud
GCP縺?Cloud PubSubで考慮するこ縺? - Carpe Diem (hatenablog.com)
Pub/Sub の割り当てと臀??限  |  Pub/Sub ドキュメント  |  Google Cloud
アプリで簡単縺?Pubsubにパブリッシュや、サブスクもできるので、アプリ間の連携縺?Pubsubが使える
 窶? 非同期処理(画蜒?処理とか重めのも縺?
 窶? IDの種類 (message id, subscription id, topic id, ack id, project idあたりがアプリでは使繧?れるっぽい
  窶?ack id縺?pull時のみ縺?Pushのとき縺?httpステータスコードが200縺?ackとなる
GCP - Pub/Sub サービス觸??要 #GoogleCloud - Qiita
Pub/Sub メッセージの臀??成とレスポン繧?  |  Python 逕? App Engine フレキシブル環藹??に関するドキュメント  |  Google Cloud
トピック・??メッセージのパブリッシュ先)
 窶? スキーマ/外部アクセス許藹??/リテンショ繝?/GCS/バックアップの設定がある (Push/Pullの設定はない)
 窶? パブリッシュ側のベストプラクティ繧? (JWT) 
  Pub/Sub トピックにパブリッシュするためのベスト プラクティ繧?  |  Pub/Sub ドキュメント  |  Google Cloud
サブスクライバ縺?Push縺?Pull (Push縺?Endpointが必要、デフォルト縺?pull)
 GCP - Pub/Sub サービス觸??要 #GoogleCloud - Qiita
 窶? at-least-once (少な縺?とも1回) 配信を觸??供します
 窶? 同じ順蠎?指定キーを持ち、同じリージョンに藹??在している場合は、メッセージの順蠎?指定を有効にできます
 窶? サブスクライバーが31日間未使用、またはサブスクリプションが未更新の場合、サブスクリプションは期限切れ
 窶? メッセージ数が多い縺?pull向き サブスクリプショ繝? タイプを選択する  |  Pub/Sub ドキュメント  |  Google Cloud
push縺?httpsが必要?
 push サブスクリプションを作成する  |  Pub/Sub ドキュメント  |  Google Cloud
 窶? push エンドポイントのサーバーには、認証藹??が署名した有効縺? SSL証譏?書が必要縺?https
 窶? Cloud run 縺?Event Arcを設藹??するとサブスクが自動作成されrunのデフォルトhttps縺?URLが使繧?れるが、これ縺?PullよりPushで藹??定した
 窶? CronバッチならPullで藹??定するので縺??大驥?リクエスト縺?Pull向きとある(Pullは失敗処理込みの話かも知れん)
トピックのリテンショ繝?:デフォルトなし、最蟆?蛟?:10分、最大蛟?:31譌?
サブスクのリテンショ繝?:デフォルト蛟?:7日、最蟆?蛟?:10分、最大蛟?:7譌?
 サブスクリプショ繝? プロパテ繧?  |  Pub/Sub ドキュメント  |  Google Cloud
pubsub ack期限(Ack Deadline)
 •デフォルト60秒> 設藹??10分>ack延長で最螟?1時間まで伸ばせると思繧?れる
 リース管理で確認時間を延長する  |  Pub/Sub ドキュメント  |  Google Cloud
 窶?exactly onceを設藹??しなければ期限の延長は臀??証されない
 窶?ack期限を驕?縺?る、あるい縺?Nackを返す場合、メッセージは再配送される
 窶?ack応答期限の延長縺?99パーセンタイ繝?(上位1%の値よりも蟆?さい値のうち最大の蛟?)縺?
 modifyAckDeadlineを返し、延長してもMaxExtension (ack期限を延髟? する最大蛟?) 60minま縺??
  modifyAckDeadlineリクエストを定期的に発鐔??すればよいらしい
メッセージの再試鐔??を強制するに縺?
 窶?nack リクエストを送菫?
 •饅??レベルのクライアント ライブラリを使用していない場合は、ackDeadlineSeconds を0に設定し縺? modifyAckDeadline リクエストを送信する
exactly once
1 回限りの配菫?  |  Pub/Sub ドキュメント  |  Google Cloud
 窶?pullなら設藹??できる。他には、Cloud Dataflowを組み合繧?せる(プログラムコード縺?Dataflowを使う感じかり、あるい縺?messageについているunique idを利用して、KVS を用いたステート管理をして自前で重複を觸??除する
 •再配信は、メッセージに対してクライアントによる否藹??確鐔??応答が行繧?れた場合、または確認応答期限が切れる前にクライアントが確鐔??応答期限を延長し縺? かった場合のいずれかか藹??因で発生することがある。
  窶?exactly onceはエラーでも再配信縺?Pubsubパニックしないようにしたいために使うものではない?
pubsubはトピック縺?PublishされたメッセージをDataflowに藹??き継げる
 Dataflow (Apache Beam) を大驥?のメッセージをバッチ処理する場合に使える
  Pub/Sub→Dataflow→処理
 窶?Apache Beamのウィンドウ処理とセッション分析とコネクタのエコシスエムがある
 •メッセージ重複の削除ができる
 窶?pubsub>dataflow>BQやGCS: この觸??れでログ軆??をストーリミングで入れ込める
BQサブスクリプショ繝? (PubSub縺?BigQuery Storage Write API を使用してデータを BigQueryテーブルに送信、GCSサブスクもある)
 Langganan BigQuery  |  Dokumentasi Pub/Sub  |  Google Cloud
 BigQuery サブスクリプションの臀??成  |  Pub/Sub ドキュメント  |  Google Cloud
サブスクライバ繝?App側のコードでのフロー制御によりちょっと藹??てよのトラフィック急藹??対藹??
 フロー制御を使用して臀??時的な急藹??を処理する  |  Pub/Sub ドキュメント  |  Google Cloud
デッドレタートピッ繧? (配信試行回数が見れる)やエラーでの再配菫?
 メッセー繧? エラーの処理  |  Pub/Sub ドキュメント  |  Google Cloud
  窶? Pub/Subサブスクリプションにデッドレタートピックを設藹??してお縺?と、一定の回数再送信が失敗したメッセージの藹??先がデッドレタートピックに藹??更され貯められる
メッセージのフィルタ、同時実行制御により多いメッセージに対応
 サブスクリプションからのメッセージをフィルタする  |  Pub/Sub ドキュメント  |  Google Cloud
Pubsubをローカルでエミュレートする
 エミュレータを使用したローカルでのアプリのテスト  |  Pub/Sub ドキュメント  |  Google Cloud
pubsubのスナップショットやリテンショ繝?
クイックスタート: スナップショットまたはタイムスタンプまでシークし縺? Pub/Sub でメッセージを再生する  |  Pub/Sub ドキュメント  |  Google Cloud
トピックにリテンションを設藹??しスナップショット作成> 驕?去のサブスクしたメッセは鐔??えなさそう
サブスクにリテンションを設藹??しスナップショット作成> 驕?去縺?Ackしたメッセは鐔??えなさそう
スナップショットでどう使うのか?
 cloud pubsubで配信觸??みのメッセージを再送する #PubSub - Qiita
 キューがたまっているときに撮るものと思繧?れる。またシーク時間のポイントを設藹??する諢?味がある
 スナップショットとシークを使いこなして特藹??期間の再実行を行う機閭?
  スナップショットで再実行する
  シークは指定時間か最後のスナップショット以降のサブスク再実行(実際push縺?runが再実行された)
Pubsubにどんなメッセージが入ってきているか確鐔??する方觸??
 pull形藹??ならAckしなけれ縺?pullボタンで拾い見れる (トピックでパブリッシュしてサブスク縺?Pull し見る)
 トラブルシュートはログを見るかデッドレタートピックかGCSバックアップを見る?
デッドレターキュ繝?(ドロップしたものの確認と救済?)
 サブスク縺?DLQ縺?ONしデッドレタートピックを設藹??し転送する>GCSにもバックアップできる
 DLTでメッセー繧?(実行済縺?OR未藹??行)の再生
データ形蠑?:スキーマを使うか、スキーマなしならdataで藹??得できる
 トピックのスキーマを作成する  |  Pub/Sub ドキュメント  |  Google Cloud
 Cloud Pub/Subの觸??要縺?Pythonでの藹??霍? - case-kの備忘骭?
from google cloud import pubsub_v1
from avro.io import DatumReader, BinaryDecoder
from avro schema import Parse
project_id="your-project-id"
subscription id="your-subscription-id"
subscriber pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id, subscription_id)
avro_schema = Parse("""
{
"type": "record",
"name": "Avro".
"fields": [
{
"name": "ProductName",
"type": "string",
"default":""
},
{
"name": "SKU",
"type": "int",
"default": 0
}
}
def callback(message):
print(f"Received message: {message}")
reader = DatumReader(avro_schema)
decoder = Binary Decoder (message.data)
avro_record = reader.read(decoder)
message_id=message.message id
message.ack()
print("Message ID: (message_id}")
product_name = avro_record['ProductName']
sku= avro_record['SKU']
print("Product Name: (product_name}")
print("SKU: (sku}")
subscriber.subscribe(subscription_path, callback=callback)

def callback(message):
print("Received message: (message)")
data message data
message_id=message.message_id
message.ack()
print("Date (data)")
print("Message ID: (message_id)")

Pub/Sub縺?StreamingPull APIを使用してメッセージをリアルタイムで処理する - G-gen Tech Blog
StreamingPull API を使用するとアプリとの間で永続的な藹??方向接続が維持され、Pub/Sub でメッセージが利用可能になるとすぐ縺? pullされる。1 つ縺? pull リクエスト縺? 1 つ縺? pull レスポンスが返る通常縺? 単項 Pull と觸??較すると、高スループット・臀??レイテンシ。必要なメッセージを残す処理をしたりも?GCP側の問題であっても通信が切れた場合は別サーバに軆??縺?なおすためmodifyAckDeadlineも切れ再配信されるバグがある


+++
メッセージ縺?TTL (Time-To-Live) はメッセージ臀??持期間(message retention duration) に臀??存
メッセージが TTLを超えると、自動的に削除され、Subscriberが藹??信できな縺?なる
ackDeadlineSeconds (デフォルト縺?10秒、最螟?600秒) を超えたACKのメッセージは再配信されますが、TTL期限を超えた場合は觸??える
#TTLを最螟?7日間に設定
gcloud pubsub subscriptions update my-subscription message-retention-duration=604800s

DLQ (Dead Letter Queue)
Subscriberが指定回謨?(最螟?100回) メッセージ縺?ACKを行繧?なかった場合に、メッセージを隔離する仕組縺?
DLQもサブスクなので期間やTTL設藹??方觸??は同じ

#DLQ topic 作成
gcloud pubsub topics create my-dlq-topic

#5回失敗したらDLQ縺?
gcloud pubsub subscriptions update my-subscription dead-letter-topic=projects/my-project/topics/my-diq-topic max-delivery-attempts=5

#DLQ subsc作成
gcloud pubsub subscriptions create my-diq-subscription--topic-my-diq-topic

#サブスクの詳細確認
gcloud pubsub subscriptions describe my-diq-subscription

#DLQメッセージの確認、-auto-ackも付けられるが、
gcloud pubsub subscriptions pull my-dlq-subscription -limit=10
[{
"ackld": "Y3g49NfY...=",
"message": {
"data": "SGVsbG8gd29ybGQ=", #Base64 エンコードされたデー繧?
"messageld": "1234567890",
"publish Time": "2024-02-18T12:34:56.789Z"
}
}]

#base64のでコードが必要
echo "SGVsbG8gd29ybGQ=" | base64-decode

#ack-idによりackを返しDLQメッセージを削髯?
gcloud pubsub subscriptions acknowledge my-diq-subscription--ack-ids=Y3g49NfFY

モニタリン繧? > アラートポリシーから新しいアラートを作成し
pubsub.subscription.outstanding_messages を監鐔??対象に選択し、閾値を設藹??するとよい

#DLQ メッセージの再処理をfunctionsに設定 (トピックに入れなおす)
from google.cloud import pubsub_v1
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path("my-project", "my-topic")

def republish_message(message):
    future = publisher.publish(topic_path, message.data)
    print(f"Republished message ID: {future.result()}")

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path("my-project", "my-dlq-subscription")

def callback(message):
    print(f"Received message: {message.data}")
    republish_message(message)
    message.ack()

subscriber.subscribe(subscription_path, callback=callback)

/// BANGBOO BLOG /// - GCP runs off functions pubsub on scheduler

Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)


Navi: <  1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19  >