/// 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

January 14, 2024

GKE
モダンか何か知らんが、豚玉かイカ玉で十分じゃ

===========
kubectlチートシート | Kubernetes

フォルダに .py と requirements.txt と .dockerignore と Dockerfile を入れてアップロードしている
gcloud builds submit --tag asia-northeast2-docker.pkg.dev/bangboo-prj/xxx/image001

helloworld@bangboo-prj.iam.gserviceaccount.com 作成
アクセス元のIPを確認するCloud run作成
 ドメインないと無理なのでLBとIAPをあきらめ生成されるURLで十分
 Cloud runでアクセス元IPを表示するヤツ
 runのallUsersのinvokerを削除したらアクセス不可になった(この方法で管理する)
curl http://ifconfig.me/ で十分だったが

GKE
k8sの内部NWは通常別途いるがGKEは速い奴が動作
GKEはクラスタ内部のDNSでサービス名で名前解決できる
サービスのIPとポートは環境変数で参照可
kubectlを使うには、gcloud container cluters get-credentials を打つ必要がある

GKE設定
-クラスタ:側の設定(IP範囲とかセキュリティとか?)
 一般/限定公開:外部IPを使うか使わないか
 コントロール プレーン承認済みネットワーク:CPにアクセスできるセキュリティ範囲
-ワークロード:マニフェストで設定

一般か限定公開か?コントロールプレーンが外部IPか?CPがグローバルアクセス可か?承認NWか?
 一般公開で承認NWが良いのでは?簡単だし、
 限定公開で使うには>CPに外部IPで承認NWでいいのでは?
  NW:default subnet:default
  外部IPでアクセス許可
  CP アドレスの範囲 192.168.1.0/28とか172.16.0.0/28(サブネット重複しない奴)
  コントロール プレーン承認済みネットワーク home (169.99.99.0/24ではなくGCPのIPぽい)
  限定公開ならnatが要る
 CPの VPCのIP範囲は、クラスタの VPC 内のサブネットと重複不可。CPとクラスタは VPC ピアリングを使用してプライベートで通信します
 グローバルアクセスは別リージョンからという意味っぽい、cloud shellからのkubectlのためONが良い
デフォルト設定なら作成したサブネットのIP範囲でなくクラスタが作られない
 面倒ならdefault-defaultで良いかも

サブネットをVPCネットワークを考えて指定する方が偉いかも知れんが
default asia-northeast2 10.174.0.0/20 の場合
 サブネットは asia-northeast2 10.174.27.0/24 とか

ARにあるコンテナからGKEをデプロイが簡単にできる
Cloud Source Repositories でソース管理gitが下記のようにできる
 gcloud source repos clone bangboo-registry --project=bangboo-prj
 cd bangboo-registry
 git push -u origin master
run使用中のコンテナがGKE上では上手くいかない runのコンテナは8080のようだ
 Dockerfileとmain.py上ではポートは何でもよい仕様だが、runで自動的に8080割り当てるようだ
  それが駄目でありGKEは環境変数でPORT 8080を指定
  CrashLoopBackOff問題がでる
  https://www.scsk.jp/sp/sysdig/blog/container_security/content_7.html
デプロイ公開でポート80 ターゲットポート8080に(クラスタを作成後、ワークロードでデプロイする)

developmentのspec: containers: ports: - containerPort: 8080 を入れる?
 yamlでなく、コンソールで設定時に入れると良い

$ kubectl get all
NAME                      TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
service/flask-1-service   LoadBalancer   10.48.4.134   34.97.169.72   80:32147/TCP   20m

us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
 これは簡単に上手く行く、環境変数PORT8080不要
 クイックスタート: アプリを GKE クラスタにデプロイする  |  Google Kubernetes Engine (GKE)  |  Google Cloud

ワークロードでyamlの spec: replicas: 0を保存するとアクセスを止められる

コンフィグマップ:構成ファイル、コマンドライン引数、環境変数、ポート番号を別途持っていてPodにバインドする(マニフェストに書くと抜き出され見れる)
シークレット:Base64の値?(マニフェストに書くと抜き出され見れる)甘いのでsecret mgrを使う方が良い?
 config map/secretはマニフェストで編集する必要がある(見れるだけと思われる)
エディタで見てみる:yamlとかステータスが見れる

■LBに静的IPを振る
hello-app-addressと名付けたIPを取得
LBのアノテーションで設定
# ingress.yaml(NWはNodePort、Route
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.global-static-ip-name: hello-app-address  # IP
    networking.gke.io/managed-certificates: hello-managed-cert      # 証明書
    kubernetes.io/ingress.class: "gce"  # 外部 HTTP(S)LB
spec:
  defaultBackend:
    service:
      name: hello-deployment
      port:
        number: 8080

ServiceのLBはリージョン指定するタイプの静的IP
IngressはグローバルIPOK
apiVersion: v1
kind: Service
metadata:
  name: hoge
  labels:
    app: hoge
spec:
  ports:
    - port: 80
  selector:
    app: hoge
    tier: frontend
    environment : stage
  type: LoadBalancer
  loadBalancerIP: xxx.xxx.xxx.xxx


ArmorでIP制限
1)サービスから対象を選択しingressを作成することでLBを追加しArmorも設定可能
2)デフォルトLBに付けるにはkubectl要りそう、backendconfig.yamlはどこに置く
 Cloud ArmorでGKE IngressへのアクセスをIPで制御する #GoogleCloud - Qiita
サービス画面のkubectrlから
# backend-config.yaml を作り kubectl apply -f backend-config.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  namespace: default
  name: hello-backend-config
spec:
  securityPolicy:
    name: "bangboo-armor"

serviceのyamlに下記を追加
metadata:
  annotations:
    cloud.google.com/backend-config: '{"ports": {"8080":"hello-backend-config"}}'
↑これでは不足する 
どこで設定状態を見るか?
ingress作成してLBとArmorつけて、デフォルトLBを削除してみる?

GKEの外部からのアクセスを制限するには?
 限定公開+コントロールプレーンは承認済み等でアクセスしKubectlする
 ArmorでIP制限+アダプティブ設定(ArmorはLBが要る)
GKEでNodePort TypeのServiceに対してインターネットアクセス許可する - IK.AM

限定公開クラスタ+踏み台サーバにIAPで入りKubectl(承認済みNWでの制御はIPのみなので危ういらしい)
GKE(Google Kubernetes Engine) Autopilotの限定公開クラスタにIAPを利用してアクセスする | Tech-Tech (nddhq.co.jp)
【GKE/Terraform】外部ネットワークからの全てのアクセスを制限した限定公開クラスタを作成し、踏み台サーバーからkubectlする (zenn.dev)
コントロールプレーンとPod間で自動FWされない場合もありFirewall要チェック

 Cloud shellのグローバルIPを取得しシェルを承認済みNWにできないか?>OK
 curl http://ifconfig.me/

GKEでPythonをCron定期実行させたい
ArgoでDAGを実行させたい
 https://zenn.dev/ring_belle/articles/2c4bbe4365b544
ArgoでGKEのCICD(Argoは別ホストでGithubにアクセスし、GKEを操る)
 https://www.asobou.co.jp/blog/web/argo-cd

サービスアカウント
Workload Identity Federation for GKEの新しい設定方法を解説 - G-gen Tech Blog
1)ノードに紐付いたサービスアカウントKSAをそのまま使用する(裏でimpersonate)
gkeのサービスアカウントとIAMサービスアカウントの紐づけが不要になった
VPCサービスコントロールで管理したい場合impersonateのSAを指定できないためWIFが要る
2)サービスアカウントのキーを Kubernetes Secret として GKE クラスタに登録する
3)Workload Identity Federationをつかう
GCP の Workload Identity サービスについてのまとめ #GoogleCloud - Qiita
Githubとか外部のサービスから利用するためSAを連携させる
IAM>Workload identity連携画面で設定が見れる
※KSAはノード単位で設定、Pod単位でGCPのリソースにアクセスできるように管理したい?

●メモ
忙しいときはスケールアウトするが、落ち着き始めるとスケールinし、必要なPodも落とされてしまう
safe-to-evict をymlのannotationで明示して特定Podはスケールinしない等にしておく
annotations:
  cluster-autoscaler.kubernetes.io/safe-to-evict:"false"
クラスタのオートスケーラー イベントの表示  |  Google Kubernetes Engine (GKE)  |  Google Cloud

■Workloads リソース
Pod:Workloadsリソースの最小単位
ReplicaSet:Podのレプリカを作成し、指定した数のPodを維持し続けるリソースです。
Deployment:ローリングアップデートやロールバックなどを実現するリソースです。
DaemonSet(ReplicaSet亜種):各ノードにPodを一つずつ配置するリソースです。
StatefulSet(ReplicaSet亜種):ステートフルなPodを作成できるリソースです。
Job:Podを利用して、指定回数のみ処理を実行させるリソースです。(使い捨てPod)
CronJob:Jobを管理するリソースです。
Config connector:GKEでGCPリソースを調節してくれるアドオン。Podの増加減少にあたり必要なアカウントや権限やPubSub等々を自動作成や管理する。マニフェストのymlにcnrmのAPIを記載したりする(Config connector resource nameの略)

■GKE関連の運用
GKEクラスタ認証ローテーション
30日以内になると自動ローテーションするが危険なので手動が由
GKEはマイクロサービスのエンドポイントでのサービス提供かgcloud api利用が前提といえるのでこれでOK
1) ローテ開始 (CPのIPとクレデンシャル)
2) ノード再作成
3) APIクライアントを更新 (クレデンシャル再取得)
4) ローテ完了 (元IPと旧クレデンシャルの停止)
GKEクラスタ認証ローテーションの考慮
セキュアなGKEクラスタ
コントロールプレーンの自動アップグレード&IPローテーション&ノードブールの自動アップグレードで死ぬ
 CPの更新後はクレデンを取得しなおす必要がある、ArgoでCICDを組んでいるとクラスタに認証入りなおす必要がある
 ノードが入れ替わりに時間が掛かり、時間差で問題がでることがあるので注意

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


December 8, 2023

竹書房 stardust
裁判で「ツッコんでもうた、ボケやのにっ」てボケる
そしてデブキャラで復活、笑われるキャラっていうのが俺の見立て

==========
■ユダヤの商法 藤田田
合理、契約、ケチ、疑い深い、信用、仕事お金至上
金を巻き上げる/お金は奪い合い
 取引額を倍々に増やし現地を耕した後に進出して直売りに変更等エグイ
 日本の大企業の社員は自分の力を過大評価し世界では通用しない
食を楽しむ
 宗教上休みをきっちり取るし、食を楽しむやイイ女を囲ったり楽しんでる
 風呂でシッカリ体を洗い清潔
金持ち、女と口、好きなものより苦手なものを売った方が割り切れる
 ターゲットは金持ち/女性を狙う等、これは確実に見習いたい
田さん陳さん東大でGHQに通訳アルバイトし19に弟子入りし銀座のユダヤ人になった

買い切りかリピート購入/サブスクか、買い切りは長く続ける商売でなく店を畳んで違う商品をやる
広告投資管理7割:年間に支払う平均金額(1年LTV)>客一人獲得に掛かる広告費上限(CPO)

■確率思考の戦略論
客引きもバンカーも運転手も世界各国で同じ雰囲気>法則がある
ブランドに対する好意度:preference=ブランドイクイティ+価格+製品パフォーマンス
プレファレンスが高いものはより高頻度で購入される=>シェア
人はそれぞれのカテゴリのEvoked setを持ってる:エビス50黒ラベル30一番搾り20
プレファレンスに基づいたエボークトセット持ち、その中のカテゴリーの購買回数分だけサイコロを振って選んでいるだけ
Preference好意度(ブランドイクイティ+価格+製品パフォーマンス)+Awareness認知+Distribution配荷
年間購入者の全世帯に対する割合=認知率x配荷率x過去購入率xEvokedSet率x年間購入率
年間売り上げ=総世帯数x1年間に買う人浸透率x平均購入回数x平均購入金額
シェア=参入順位xプレファレンスx宣伝費比率x間合い年数
 どれだけ競合に比べて宣伝できているかが大きい
 次回購入タイミング=平均購入回数xプレファレンス とかデータ化、確率見ていく
差別化して先鋭化しても自社を選んで貰えるとは限らない
 差別化でターゲットを絞ってマーケットが小さくなる危険性

ベストセラー>観光大使/政府/首相>人を巻き込みPRに
コーラは原液販売に注力し現地生産フランチャイズにし配荷拡大した
商品棚をその店/客のプレファレンスに合わせ配荷の質を改善
都合が悪くなるとルールを変えてでも勝とうとする西洋人
 スポーツマンシップは油断させるプロパガンダでしかない
サイコパス:感情が意思決定の邪魔にならない>選ぶストレス無しに最適判断できる
 +人心掌握(
※勝ち馬しか人は選ばない、第一想起にどう入るか、高くても良い大量の広告を打つ
 オペを遅くしてでも行列を作る、先着サイコロ無料話題をつくる、ライトが明かる過ぎるとか目立つ店構え

====
多変量解析
消費者の行動を左右する要素は様々だが、「絞り込むと本質的には3つ程度しか残らない」
最も重視すべきは「プレファレンス(相対的好意度)」。次にどれだけ知ってもらえているかという「認知」、その後、消費財であれば製品の手に取りやすさを示す「配荷」、テーマパークであればパークまでの「距離」が続く。企業が重視しがちな品質や技術力といった「パフォーマンス」の優先順位は低い。「新機能を搭載しただけでは、消費者に響かない」。相対的好意度、認知、配荷のどれかが足りないと、どんなにいい製品も埋もれてしまう。

商圏
テーマパーク業界の失敗例を調べ全国で閉園になった約50の遊園地を見ると、すべて需要を上回る投資をしていました。 需要は商圏の大きさやその人口を調べると分かります。明らかにお金を使ってはいけないところに投資をしていたのです。

可視化
思考力に強みを持つ人を「T(=Thinking)型」、人とつながる力や伝える力が強い人を「C(=Communication)型」、人を率いて動かす力を強みとする人を「L(=Leadership)型」として、3つに分類し可視化。可能性の高い分野に資源を集中。

====
国の大学教育の目標人材「思考力、判断力、俯瞰力、表現力の基礎の上に、幅広い教養を身につけ、高い公共性、倫理性を保持しつつ、時代の変化に合わせて積極的に社会を支え、論理的思考力を持って社会を改善していく資質」
1)分野を超え先端の学問を学び時代の変化に合わせて積極的に社会を改善していく人材
2)高度な教養と専門性がある人材
3)高い実務能力がある人材

■米海軍で屈指の潜水艦艦長による最強組織の作り方
リーダシップ:価値と潜在能力を伝え刺激する(協力を支配で操る)
担当者の方がが細かいところまで詳しく知っている
 権限を与えるとは支配と同じ
 目標と裁量は両立するか
 リーダの技量が組織の業績か、メンバーの技量ではないのか
疑問:活かすには命令でなく創意工夫で実務を行った方が良いのではないか
結果:残留率up、組織状態better
要るもの:権限だけでなく自由を与える
やる事:mtgでなく確認会(聞く方の準備や参加が必要)、命令でなく確認し許可取り

●やったこと
委ねるリーダーシップ
権限を与える
命令を避ける
命令するときは、乗員が異を唱える余地を残す
やるべきことを確認する
会話をする
上官と部下が学びあう機会を設ける
人を重視する
長い目で考える
いなくなっても困らない存在を目指す
訓練の回数より質を重視する
正式な命令以外でも、会話を通じて情報交換する
つねに好奇心を持つ
意味のない手順や工程をすべて排除する
監視や検査を減らす
情報を公開する

●やらなかったこと
命じるリーダーシップ
権限を握る
命令する
命令するときは、 自信を持って絶対だと明言する
やるべきことを説明する
会議をする
上官が部下を指導する機会を設ける
技術を重視する
目の前のことを考える
いなくなったら困る存在を目指す
訓練の質より回数を重視する
明瞭簡潔な言葉のみを使用し、 正式な命令以外の言葉を交わさない
つねに疑いを持つ
手順や工程の効率を改善する
監視や検査を増やす
情報を公開しない

-支配からの解放
┣支配構造の遺伝子コードを見つけ出して書き換える
┣態度を変えることで新しい考え方をもたらす
┣早めに短く言葉を交わし、仕事の効率を高める
┣ 「これから~をします」という言い方を導入し、命令に従う だけだったフォロワーを自発的に行動するリーダーに変える
┣解決策を与えたい衝動を抑える
┣部下を監視するシステムを排除する
┗思っていることを口に出す

-優れた技能
┣直前に確認する
┣いつどこでも学ぶ者でいる
┣説明するな、確認せよ
┣同じメッセージを絶えず繰り返し発信する
┗手段ではなく目標を伝える

-正しい理解
┣ミスをしないだけではダメだ、優れた成果をあげよ
┣信頼を構築し部下を思いやる
┣行動指針を判断の基準にする
┣目標を持って始める
┗盲目的に従うことなく疑問を持つ姿勢を奨励する

■勘違いが人を動かす 教養としての行動経済学入門
論理も情熱も人を動かすには弱い、不安や同調や本能で勘違いさせ誘導する
思考の穴を突く

心理的距離が遠ければ嫌いな人とも上手く行く(共感せず上辺だけ)
 相手の嫌なことは嫌なことで返し強化させない

■OODA
Observe(観察)、Orient(状況判断、方向づけ)、Decide(意思決定)、Act(行動)
OODAは過去の経験に捉われることなく現状にあった行動をとるためのもの
Observeでは先入観を持つことなく公平かつ客観的に行うことを推奨
 変化を観察しスピーディな分析をし判断して進めるので生存率が高い
 場当たり的、個人の判断が多い、中長期計画に適していない、仮説が弱い、ミッションバリュービジョン共有の欠如で統率問題
PDCA
目標設定から始まるので、目標が明確になり、ブレずに取り組みやすい
安定した環境での品質管理や一定期間かける取組などに適している
 品質管理や生産管理用フレームワークの状況や前提が変わらない中で最適解を見つけるのに適している
簡易としてはPDR、Prep=準備、Do=実行、Review=復習検証

====
ティーチング:正解や解決に必要なノウハウを教える
コンサルティング:相手の問題を解決するための提案をし共に解決していく
カウンセリング:悩みや不安を解決するためにサポートする
コーチング:目標達成のために行動変容を促す傾聴と質問(アドバイスしない)

人生の幸福度は「貯金の量」で決まる
幸福感が最大になる貯金額とは1億円

Posted by funa : 11:16 PM | Column | Comment (0) | Trackback (0)


October 31, 2023

GCP Network Connectivity
●共有 VPC
 同組織のプロジェクトのホストプロジェクト(親)のVPCをサービスプロジェクト(子)に共有
●VPC ネットワーク ピアリング
 異なる組織間の接続(双方のVPCでコネクションを作成する、内部IPで通信する、サブネットは重複しないこと、2ホップ制限で1:1=3つ以上の場合は古メッシュでコネクション作成要)、k8sサービスとPod ipをVPCピアリング経由する利用法もある

●ハイブリッド サブネット
 Cloud VPN/Interconnect等が必要、オンプレルータとCloud RouterをBGPでつなぐ、オンプレとGCPをつなぐ
●Cloud Interconnect
 DCと専用線で閉域網接続、Cloud VPNより低レイテンシ/帯域安定
●Cloud VPN
 オンプレとIPsec VPN接続、アドレス帯の重複だめ、Cloud VPN側でBGPIP設定やIKEキー生成をしオンプレルータ側でそれらを設定する

●内部範囲
 VPCで使うIPをCIDRで定義しIP範囲の使用方法を事前に決定しておく、IPが勝手に使われたりしない等ができる

●限定公開の Google アクセス(Private Google Access)
 外部IPを持たないGCE等はデフォルトのインターネットゲートウェイ0.0.0.0を経由してGoogle APIにアクセスする、VPC>Routesで見れる
●オンプレミス ホスト用の限定公開の Google アクセス
 CloudVPNやInterconnectを経由してオンプレから内部IPを利用してGoogleAPIにアクセス、GCP側ではCloudDNSで特定のドメインのAレコードを入れる、選択したドメインのIPアドレス範囲を静的カスタムルートでVPC内のプライベートIPからルーティングできるように設定する、オンプレにはCloudRouterからドメインのIPアドレス範囲をBGPでルーティング広報する、VPNやInterconnectがないと0.0.0.0でGoogleAPIにアクセスするがこれだとRFC1918に準拠しない199.33.153.4/30などのIPを使う必要がありルーティングが複雑化したり、オンプレを通る場合があり通信は慎重に設計をすること
●Private Service Connect
 「限定公開の Google アクセス」の発展版、オンプレをNATでVPCに接続、内部IPでGoogleAPIにアクセスできる、PSCエンドポイントを介して内部IPで公開できる、NATされ内部IPの公開先での重複OK

●プライベート サービス アクセス
 VPCペアリングを併用してサービスプロデューサをVPCに接続し内部IPで次のようなサービスに内部IPでアクセスできるようにする(Cloud VPNまたはInterconnectを付け足せばオンプレからも可)、Cloud SQL/AlloyDB for posgre/Memorystore for Redis/Memcached/Cloud build/Apigee等の限られたもの
●サーバーレス VPC アクセス
 サーバレスからVPC内リソースにアクセスするためのコネクタ(通常は外部IP通信になるがコレだと内部IPでVPCにルーティングされる、/28のサブネットを指定)、例えば既存のcloud runサービスを編集しても付けられず初期構築時のみ設定できる

●外部 IP アドレスを持つ VM から API にアクセスする
IPv6をVMに設定し限定公開DNSゾーン設定をすればトラフィックはGCP内にとどまりインターネットを通りません

●CDN Interconnect
 Cloud CDNもあるが他社のCDNに接続する、Akamai/Cloud flare/fastly等々

●Network Connectivity Center 
 ハブとなりCloudVPN/InterconnectをメッシュしGCP/オンプレ含め通信させる、Googleのバックボーンでユーザ企業の拠点間を接続できる
●ダイレクト ピアリング
 GoogleのエッジNWに直接ピアリング接続を確立し高スループット化、Google workspaceやGoogleAPI用だが普通は使わずInterconnectを使う
●キャリア ピアリング
 ダイレクトピアリングの高度な運用が自社対応できない等でサービスプロバイダ経由でGoogle workspaceなどのGoogleアプリに品質よくアクセスする

Google CloudのVPCを徹底解説!(応用編) - G-gen Tech Blog

●トンネル系の下記は色々権限が要りそうで候補
Compute OS login/IAP-secured tunnel user/Service account user/viewer/compute.instance*

■ポートフォワードは止めないと別につないで繋いでいるつもりでも同じところに繋ぎ続ける
lsof -i 3128
ps ax | grep 3128
ps ax | ssh
kill [PID]

■IAPトンネル
export http_proxy=http://localhost:3128
export https_proxy=http://localhost:3128
gcloud compute start-iap-tunnel --zone asia-northeast1-a gce-proxy001 3128 --local-host-port=localhost:3128 --project=gcp-proxy-prj
でコマンドを打てばIAP踏み台トンネルを通って外部に通信できる

■踏み台コマンド
gcloud compute ssh --projet gcp-prj-unco --zone asia-northeast1-a gce-step-svr
でSSHログインしそこからcurl等で操作する

■シークレットからPWを取りつつコマンドを打つ
gcloud compute ssh --project gcp-prj --zone asia-northeast1-b stp-srv --tunnel-through-iap fNL 3306:mysql.com: 3306
mysql -u baka_usr -p"$(gcloud secrets versions access latest --secret mysql_pw --project=gcp-prj)" -h 127.0.0.1-P 3306
 mysqlコマンドのpオプションは空白なしでPWを入れる、baka_usrはMySQLのユーザ、mysql_pwはsecret mgrに保存した名前
 $()のLinuxコマンドでgcloudコマンドを入れ子。ワンライナーの形で利用ができる
secret mgrのコマンド 
ワンライナー解説(変数と$()とバッククォート

■SSHトンネル
sshの基本はこれ、セキュアシェル、トンネルは特殊?
SSH [オプション] [ログイン名@]接続先 [接続先で実行するcmd]
接続先に権限があること

SSHの疎通確認
ssh baka@stp_srv.unco.com

設定例
.ssh/config
User baka
Hostname step_srv
ProxyCommand ssh -W %h:%p baka@step_srv.unco.com
PubkeyAuthentication no
PasswordAuthentication yes

※sshはPWは危険なので鍵認証のみにしたい
 IPアドレス元を制限や同一IPのログイン試行は拒否する仕組み等は欲しい

SSHコネクション上でトンネル作る
ssh step_srv -L 8080:dest.benki.com:80
 とか ssh -L 8080:dest.benki.com:80 ahouser@step_srv.unco.com
※ポート22でstep_srvにSSHコネクションを貼り、ローカル:8080のリクエストはdest:80に転送する
ブラウザか新規ターミナルでcurl
http://localhost:8080
ダメなら転送設定したターミナルはstep_srvにいるのでcurl

GCP、AWS、Azure 別に見るクラウド VM への攻撃経路まとめ (paloaltonetworks.jp)

=============
なぜレッドオーシャン化する前にサービスを グロースできなかったのか? - フリマアプリ編 - (フリル)
サービスを急拡大させる意思決定が遅く競合に遅れ
競合出現後も経営方針を大きく変えなかった
勝利条件はユーザ数で機能差ではなかった
パワープレーでいかにプロモーションばら撒いて認知広げて第一想起をとるかだった
先行者優位で過ごせる期間は短い
スタープレイヤーの採用、手数料無料化、TVCM等PLを超えた手法があった、BS経営すべきだった
成長のキャップが創業者の能力になっていた
有能な人材:耳の痛いことを言ってくれる人材を経営チームに採用しても良かった
CTOが開発をし、組織運営の雑務をし、採用もやっていた
CEOは机の組み立てをするな。CTOはPCの購入をするな
役割の変化に素早く適用し権限移譲を行い、やるべきことをやれる状況を作る
あるいは必要な組織を大きくすることに注力する、例えば開発組織を大きくする
戦時のCEO、皆に戦時であることを伝える、企業文化に背く意思決定も行う
研究や教育等、やった方が良さそうな耳障りの良いタスクも拒否する
どうやったら市場で勝てるかの戦略

IPOとか目指さなければConfort zoneを見つけてじっくりまったりビジネスを継続させる手もある
メルカリやPay2をみた結果論、このやり方も古いというかアレ

Posted by funa : 10:57 PM | Web | Comment (0) | Trackback (0)


June 21, 2023

Machine learning(Bigquery ML)
機械学習:
 マシーンラーニング、ML。マッシーンがLearnしデータの背景にあるルールやパターンを発見する。
モデル:
 機械学習における入力データに対して結果(出力)を導き出す仕組み。モデルは入力されたデータを解析し、評価/判定を行った結果を出力として返す。つまり、機械学習は「入カ>モデル>出力」から成る。

学習データ
 モデルをつくるために学習させるデータ
適用データ
 モデルに対して予測を適用させるデータ
教師あり
 学習データに対して正解ラベルを付けて学習する方法
  例)過去にDMを送付した結果(目的変数)を用いて学習させる
教師ありは、回帰と分類の2つに分けられます。
 回帰(予测)
  連続する数値を予測するもので、売上、重量、温度などを算出する
 分類(識別)
  データがどのクラスに属するかを予測するもので、販売商品が売れる見込み/売れない見込みなどに分類
  DMにおいては分類モデル(買う・買わないの識別)を使用

目的変数
 結果側の変数
 例)ある特定のカテゴリやブランドをその顧客が注文する
  ●確率(購入する・しない)
   ー学習データにターゲットフラグ (購入あり=1、購入無し=0)を立てる
   ー適用後に出てくる結果は0~1 (0%~100%) の範囲
  ●金額
説明変数(特微量とも呼ぶ) 
 原因側のデータ
 目的変数を予測するために使用する顧客の様々な情報、大きく分けて2種類
  ●顧客属性
   ー法人/個人事業主など事業形態、登録住所の郵便番号、業種コードなど
  ●購買履歴
   ー購買 いつ、何を、どのくらい購入したか等の情報
   ー各商品カテゴリ毎の購入金額 etc.
質的変数
 数値で推し測ることができ、数字の大小に意味をもつデータ
  (例)売上、購入回数、従業員数、DM送付回数
單的変数
 単に分類や種類を区別するためだけのデータ
  (例)都道府県、茎種コード、購入有無

統計手法
 重回帰分析:
  説明変数xが目的変数yの値を変化させます。そのため、説明変数から、目的変数の値を予測可能です。
 ロジスティック回帰
  yが1になる確率を判別します。いくつかの要因(説明変数)から「2値の結果(目的変数)」が起こる確率を説明・予測
   2値の結果とは合格/不合格、採用/不採用など、答えが2つしかない場合を指し

線形回帰(エクセル)
 slope関数:回帰直線の傾きを取得
 inercept関数:回帰直線の切片を取得
 forecast関数:単回帰分析からの推測値を取得
+++++++++++++

BigQueryを利用して機械学習を簡易に学びたいです。Webアプリのログよりサーバーエラーを予測するようなもので方法を教えてください > BigQueryを利用して機械学習を学び、Webアプリのログからサーバーエラーを予測する方法について簡単に解説します。以下はその手順の概要です。

●ステップ1: データの準備
まず、WebアプリのログデータをBigQueryにインポートします。ログデータには、タイムスタンプ、リクエストの詳細、ステータスコード、エラー メッセージなどの情報が含まれているはずです。

例:ログデータスキーマ server_log
timestamp: TIMESTAMP
request_id: STRING
status_code: INTEGER
error_message: STRING
user_agent: STRING
response_time: FLOAT

●ステップ2:データの前処理
エラーログの解析を容易にするために、データをクリーンアップし、特徴量を作成します。

CREATE OR REPLACE TABLE ds.cleaned_log AS
SELECT
timestamp,
status_code,
error_message,
user_agent,
response_time,
IF(status_code >= 500, 1, 0) AS is_error
FROM
ds.server_log
WHERE
timestamp BETWEEN 2023-01-01 AND 2023-12-31;

このクエリでは、ステータスコードが500以上のものをエラーと見なし、is_error列を追加しています。

●ステップ3:特徴量エンジニアリング
機械学習モデルに投入するための特徴量を作成します。例えば、以下のような特徴量を考えます。
-時間帯 (hour)
-ユーザーエージェント (user_agent) 
-過去のエラーレート(past_error_rate)
※past_error_rateを省くとどうなのか?

CREATE OR REPLACE TABLE ds.features AS
SELECT
EXTRACT(HOUR FROM timestamp) AS hour,
user_agent,
response_time,
is_error,
--AVG(is_error) OVER (PARTITION BY user_agent ORDER BY timestamp RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW) AS past_error_rate
AVG(is_error) OVER (PARTITION BY user_agent) AS past_error_rate
FROM
ds.cleaned_log;

●ステップ4: 機械学習モデルの作成
BigQuery MLを使用してモデルを作成します。ここではロジスティック回帰モデルを使用してエラーの予測を行います。
他には、The CREATE MODEL statement  |  BigQuery  |  Google Cloud
MODEL_TYPE = { 'LINEAR_REG' |'LOGISTIC_REG' |'KMEANS' |'MATRIX_FACTORIZATION' |'PCA' |'AUTOENCODER' |'AUTOML_CLASSIFIER' |'AUTOML_REGRESSOR' |'BOOSTED_TREE_CLASSIFIER' |'BOOSTED_TREE_REGRESSOR' |'RANDOM_FOREST_CLASSIFIER' |'RANDOM_FOREST_REGRESSOR' |'DNN_CLASSIFIER' |'DNN_REGRESSOR' |'DNN_LINEAR_COMBINED_CLASSIFIER' | 'DNN_LINEAR_COMBINED_REGRESSOR' |'ARIMA_PLUS' |'ARIMA_PLUS_XREG' |'TENSORFLOW' |'TENSORFLOW_LITE' |'ONNX' |'XGBOOST'}

CREATE OR REPLACE MODEL ds.error_prediction_model
OPTIONS(model_type='logistic_reg', input_label_cols=['is error'] AS
SELECT
hour, 
user_agent, 
response_time, 
past_error_rate,
is_error
FROM
ds.features;

●ステップ5: モデルの評価
モデルを評価し、精度を確認します。

SELECT
*
FROM
 ML.EVALUATE(MODEL, `ds.error.prediction_model`,(
SELECT hour,
user_agent,
response_time,
past_error_rate,
is_error
FROM
ds.features
));

●ステップ6: エラーの予測
新しいデータを使ってエラーを予測します。

SELECT
*
predicted_is_error,
predicted_is_error_probs
FROM
ML.PREDICT(MODEL `ds.error_prediction_model`,(
SELECT
EXTRACT(HOUR FROM timestamp) AS hour,
user_agent,
response_time,
--AVG(CASE WHEN status_code 500 THEN 1 ELSE 0 END) OVER (PARTITION BY user_agent ORDER BY timestamp RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW) AS past_error_rate
AVG(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END) OVER (PARTITION BY user_agent) AS past_error_rate
FROM
ds.new_server_log
));


●ダミーデータ
INSERT INTO ds.server_log (timestamp, request_id, status_code, error_message, user_agent, response_time)
VALUES
('2024-06-28 18:00:00 UTC', 'req 801, 208, '', 'Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 0.123), 
(2024-06-20 10:01:00 UTC', 'req 002, 588, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 8.456),
(2024-06-28 10:02:00 UTC', 'req 003', 484, 'Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1, 8.234),
(2024-06-20 10:03:00 UTC', 'req 004', 200, '', 'Mozilla/5.0 (Windows NT 18.8; Win64; x64; rv:89.0) Gecko/20100181 Firefox/89.8, 0.345),
(2024-06-28 10:04:00 UTC, 'req 005', 502, Bad Gateway', 'Mozilla/5.0 (Linux; Android 11; SM-G9918) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Mobile Safari/537.36, 0.678),
(2024-86-28 10:05:00 UTC, 'req 006', 503, 'Service Unavailable', 'Mozilla/5.0 (iPad; CPU OS 14.6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/6084.1, 0.789), (2824-86-28 18:06:00 UTC, req 007, 200, Chrome/91.0.4472.124 Safari/537.36, 0.567), Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
(2024-06-2010:07:00 UTC, 'req 008, 500, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.361, 0.890),
(2024-06-20 18:08:00 UTC, req 009, 404, Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14 6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.11', 8.345),
('2024-06-28 18:09:00 UTC', 'req 010', 200, '', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0 Gecko/20100101 Firefox/89.0', 0.456);


INSERT INTO ds.new_server_log (timestamp, request_id, status_code, error_message, user_agent, response_time)
VALUES
(2024-06-21 09:00:00 UTC', 'req 101', 200, '', 'Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 0.112), 
(2024-06-21 09:01:08 UTC, req 102', 500, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.478),
(2024-06-21 09:02:00 UTC', 'req 183, 484, 'Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safar1/684.1, 0.239),
(2024-06-21 09:03:00 UTC', 'req 104, 200, Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0, 8.301),
(2024-06-21 09:04:08 UTC, req 185', 502, 'Bad Gateway', 'Mozilla/5.0 (Linux; Android 11; SM-G9918) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Mobile Safari/537.36', 8.683),
(2024-06-21 09:05:00 UTC, req 106', 503, Service Unavailable', 'Mozilla/5.0 (iPad; CPU OS 14,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1, 0.756),
(2024-06-21 09:06:00 UTC, req 107, 208, ", Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.523),
(2024-06-21 09:07:00 UTC, req 188, 500, Internal Server Error, Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.812),
('2024-06-21 09:08:08 UTC', 'req 109,, 404, 'Not Found', 'Mozilla/5.0 (iPhone: CPU iPhone OS 14,6 1ike Mac OS X) AppleWebKit/685.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1', 0.267),
('2024-06-21 09:09:08 UTC', 'req 110', 200, '', 'Mozilla/5.0 (Windows NT 18.8; Win64: x64; rv:89.0) Gecko/20180101 Firefox/89.8', 8.412);

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


June 1, 2023

GCP Python Google doc編集
Google Docのコピーや編集
https://developers.google.com/docs/api/how-tos/documents?hl=ja
https://rimever.hatenablog.com/entry/2019/10/16/060000
クイックスタート
https://developers.google.com/docs/api/quickstart/python?hl=ja
スコープ情報 https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#docs
ディスカバリ ドキュメント
例えばこれはDriveAPIの分だが、RESTAPIで何ができるか全記載しているっぽい
https://www.googleapis.com/discovery/v1/apis/drive/v3/rest
Drive API
https://developers.google.com/drive/api/guides/about-sdk?hl=ja
https://developers.google.com/drive/api/reference/rest/v3?hl=ja
Docs API
https://developers.google.com/docs/api/concepts/document?hl=ja
https://developers.google.com/docs/api/reference/rest?hl=ja
https://googleapis.github.io/google-api-python-client/docs/epy/index.html
https://googleapis.github.io/google-api-python-client/docs/dyn/docs_v1.html
https://developers.google.com/docs/api/reference/rest/v1/documents/get?hl=ja

文字置換 https://developers.google.com/docs/api/how-tos/merge?hl=ja

※DocAPIからdriveld folderidは取得できなさそう、getは使えそう
※DriveAPIが使えない?
コピーでなくDocAPIでget body からの新規createで行く?
共有ドライブ時は、supports All Drives=True が必要だったでOK
file_metadata = service.files().get(fileld=DOCUMENT_ID, fields=id, name, mimeType, driveld', supports AllDrives=True) execute()

サービスアカウントでGWSにアクセスするにはGWS OU設定等が必要な場合がある>Google一般共有Docで検証も可

あるGoogle Docをコピーし、
本文を編集した上で
 本文の編集は((sample))となっている文字列をAAAに置換する
特定のドライブのフォルダに移動

from google.oauth2.service_account import Credentials
from googleapiclient.discovery
import build import re
#1. サービスアカウントの認証情報を設定
SCOPES = ['https://www.googleapis.com/auth/documents',
'https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'path/to/your/service-account-file.json' #サービスアカウント のJSONファイルのパス

creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)

#2. Google Docs と Driveのサービスをビルド
docs_service = build('docs', 'v1', credentials=creds)
drive_service = build('drive', 'v3', credentials=creds)

#3. コピー元のGoogle DocのIDと、移動先のフォルダIDを設定
SOURCE_DOCUMENT_ID = 'source_doc_id' #コピー元のドキュメントID
TARGET_FOLDER_ID = 'target_folder_id' #移動先のフォルダID

#4. Google Docをコピー
copied_doc = drive_service.files().copy(fileld=SOURCE_DOCUMENT_ID, body={"name": "Copied Document"), supportsAllDrives=True).execute()
copied_doc_id = copied_doc['id']

#5、本文を取得し、{{sample}} をAAAに置換
def replace_text(document_id, old_text, new_text)
#ドキュメントの内容を取得
document = docs_service.documents().get(documentid=document_id).execute()
content = document.get('body').get('content')
#リクエストリスト
requests = []
#検索と置換を行う
for element in content:
if 'paragraph' in element:
for paragraph_element in element['paragraph']['elements']:
if 'textRun' in paragraph_element:
text = paragraph_element['textRun']['content']
if old_text in text:
start_index = paragraph_element('startindex']
end_index = paragraph_element['endIndex']
requests append({
'replaceAllText': {
'containsText': {
'text': re.escape(old_text), #エスケープなしにする必要有
'matchCase': True
},
'replaceText': new_text
}
})
#置換リクエストを実行
if requests:
docs_service.documents().batchUpdate(documentid=document_id, body={'requests':requests}).execute()

#置換処理の実行
replace_text(copied_doc_id, '((sample))', 'AAA')

#6、コピーしたドキュメントを指定のフォルダに移動
drive_service.files().update(fileld=copied_doc_id, addParents=TARGET_FOLDER_ID, removeParents=copied doc['parents'][0], supportsAllDrives=True).execute() #親が取れないのでフォルダはハードコード

print(f"Document copied, edited, and moved successfully! Document ID: {copied_doc_id)")


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


May 29, 2023

GCP hands-off 2
■プロジェクト削除時のサービスアカウント
プロジェクトは30日保留される。その間サービスアカウント権限は生きており他プロジェクトでは動作する。
しかし保留期間はプロジェクトを使用できずサービスアカウントを削除できず、個別に一つ一つ権限をはく奪するしかない。
サービスアカウントはプロジェクト削除前に、必要であれば事前に削除や無効化しておくことも検討する。

■連携
GoogleWorkspace -> GAS -> GCP Oauth + API -> GCP(Bigquery etc.)
Python -> Gcloud sdk -> gcloud auth -> GCP(Bigquery etc.) <-> federation query/Connected sheet
Python(Oauth key) -> GCP認証情報(Oauth Key) + API -> GoogleWorkspace
 GCPのクレデンシャルページでOauth2.0 client IDと鍵が発行でき、鍵でイケる
  Pythonコードで鍵を指定すると実行時にログインを求められ、client IDとユーザIDを紐づけして実行することになる
  Authentication — gspread 5.7.2 documentation
  Python でシンプルに OAuth 2 する (urllib + oauthlib) - Qiita
 GCPのクレデンシャルページでAPIキーも発行でき、これは可能性はある
Python -> local csv/tsvが基本
●Python(SA key) -> GCP認証情報(SA Key) + API -> GoogleWorkspace
 サービスアカウントでGWSにアクセスできないのでダメ
  信頼しているドメインとのみ外部共有を許可する - Google Workspace 管理者 ヘルプ
  サービス アカウント(ドメイン名の末尾が「gserviceaccount.com」)を信頼しているドメインにすることはできません
   OUで許可するとイケるはずだが、、
●Python でGoogle docをイジる
下記のURLの内容を検証すればよい
Google Cloudコンソールで
Oauth同意画面を設定
Google Docs APIを有効化
OAuth クライアントIDを作成
シークレットJson ファイルができるのでDL(リネーム)
コードにクレデンシャルJSONファイルとDocのURLに含まれるdocumentIDを記述
→Python実行するとDocのデータが取れる(ローカルの場合は楽)

/// runのデプロイ時に設定を入れる方法について
1)環境変数を(コンソール/cmd/コンテナymiのどれかで)設定:
env=os environ.get("ENV") で使う。ログに出やすく非推奨
2)シークレットマネージャ保存分を設定
環境変数+コードでやるのと同じ?
3)ボリュームを使う:
クレデンを入れ、トークンの一時保存ができる?
Cloud RunでSecret Managerを使いたい #Python - Qiita
※サービスアカウントでGWSを扱うにはGWSのOUで受け入れる設定が必要な場合がある

■secret managerに保存してコードで呼び出して使う 
Secret Managerのシークレットアクセサー権限 
 (checksumをかけている)

from google.cloud import secretmanager
import google.cloud.logging
import logging
def get_url(secret_key, project_num)
logging.warning('####### secret_key' + str(secret_key) + '######')
client = secretmanager.SecretManagerServiceClient()
resource_name = "projects/()/secrets/()/versions/latest.format(project_num, secret_key)
res = client.access_secret_version(resource_name)
slack_url = res.payload.data.decode("utf-8")
return slack_url

■API等でデータを取った時中身が分からない場合
pramsが何かわからん時
print(params)
print(type(params))
#<class 'proto.marshal.collections.maps.MapComposite'>
#よくわからんクラスでもdirで保持するAttributeが分かる
attributes = dir(params)
print(attributes)
#そこに含まれるメソッドも確認できるのでhelpする
help(params.get)
 #prams.get('query')すると含まれるSQLが分かりこれで進める等

■Protocol buffers
APIの返りはGoogleは自社で開発したProtocol buffersを使っていようだ
たとえば下記が返る
name: "projects/98765"
parent: "folders/12345"
project_id: "aaaaaa-bbbb-market"
state: "ACTIVE"
display_name: "aaaaaa-bbbb-market"
create_time{
seconds: 1601250933
nanos: 820000000
}
update_time{
seconds: 1632826231
nanos: 634000000
}
etag: "W/a06910d9093db111"
labels{
key: "budget_group"
value: "cccc"
}

これは
print (type(response))すると下記であり
<class "google.cloud. resourcemanager v3.types.projects.Project"> 
print (response.project_id) で簡単にデコードし値取得できることが分かる

APIからの値を取るときのコード
from google.cloud import resourcemanager_v3
client = resourcemanager_v3.ProjectsClient()
request resourcemanager v3.ListProjectsRequest{
#組織の場合、現状は権限がGOP側で用意がなく無理だった
#parent organizations/12345678.
parent="folders/1122233344"
}
page_result = client.list_projects(request=request)
for response in page result:
print(type(response))
print (response.project_id)

エンコードする場合 https://blog.imind.jp/entry/2019/12/28/124728
pip install googleapis-common-protos でインスコ?
sudo apt install protobuf-compiler でインスコ
sudo apt-get install protobuf-compiler でインスコ
 ※google提供のフォルダごと使用しようとして失敗した方法 
 ※にprotoファイルがあるが丸々必要なので下記でDL
 ※git clone https://github.com/googleapis/googleapis.git
 ※バスを合わせてprojects.protoを使うが失敗
 ※たとえば protoc python_out=. --proto_path=googleapis ./googleapis/google/cloud/resourcemanager/v3/projects.proto
projects.proto を下記の内容で一から作成することが必要だった
syntax proto3;

message Resource{
string name = 1;
string parent = 2; 
string project_id = 3;
string state = 4;
string display_name = 5; 
map<string, string> create_time = 6;
map<string, string> update_time = 7;
string etag = 8;
map<string, string> labels = 9;
}
そして下記を実行しコンパイル
protoc --python_out=. ./projects.proto
projects_pb2.pyが生成されるため、パッケージとして読みこみprotocol buffersを実行できるようになる
import projects_pb2.py
※なおエラーで pip install U protobuf=3.20.0でダウングレードした

注意点としては、pythonとprotocol bufferとBigqueryの型合わせが必要
 DateやTimestampはUNIXエポックからの日数や秒数に変換する必要がある
 Noneをstr 'None'や、int -1や、bool FalseにPythonで調整をする
//UNIXエポックからの日数
current_date = datetime.now()
epoch = datetime(1970, 1, 1)
record_date = (current_date - epoch).days

//UNIXエポックからの秒数
data_string = str(date_v)
dt_obj = datetime.fromisoformat(date_string.replace("Z","+00:00"))
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
seconds_since_epoch = (dt_obj - epoch).tatal_seconds()
microseconds_since_epoch = int(seconds_since_epoch * 1e6)
date_v = microseconds_since_epoch

■BQ APIクォータ割り当て超過(1000件insertしようとした)
テーブル変更1日1500件まで
テーブルメタデータ変更は10sあたり5回まで
テーブル当たりDMLの実行待ちキューは20件まで
テーブル当たり10sあたり25のDMLまで
→各insertでスリープを5秒入れた
 import time
 time.sleep(5)

上限がテーブル単位のためテーブル名を分けると回避できるらしい
■BQ streaming insert->BQ storage read/write APIの上限はDMLと別で、閾値が大きい
streaming insert -> Bigquery storage write API を使う
BigQuery Storage Write API を使用してデータを一括読み込み、ストリーミングする  |  Google Cloud
Storage Write API を使用したデータ読み込みのバッチ処理  |  BigQuery  |  Google Cloud

CreateWriteStream > AppendRows(ループ) > FinalizeWriteStream > BatchCommitWriteStreams
 をstart/append/send/close(write commit)の関数化し返り値でつなげた形にしたが
 sendをした後 proto_rows = types.ProtoRows() を掛け初期化する必要があった(offsetが倍々で増えたから)
offsetで送信毎の開始行の設定も必要(一連の処理で件数を記憶しており0固定で処理を書けないようだった)

■Python/Client libraryの値をBQに入れるにあたり
仕様書で型を調べる。STRUCTやクラスは紐解いて通常のカラムでBQに挿入
timestampやboolやint64はそのままの形でBQに挿入
BQ SQL:日付は値なしならNULLを入れる、数値やBool値はクォートで囲まない
PythonでSQLインサート文を作るとき改行コードが含まれるものをセットするとSyntax errror:Unclosed string literal
q = q.replace('//', '////') バックスラッシュをエスケープ、あるとイリーガルエスケープシーケンスとなる、raw文字列にしたい?
q = q.replace('/n', '//n') 改行をエスケープ
q = q.replace("'", "\\'") SQLが途切れないようシングルクォートをエスケープ
q = q.replace('/n', '    ') 改行を空白で置き換える

■変更の判断
変更で問題がでないか→PCにマウスと付けて問題が起こらないかという問題と相似、最終的に経験で判断するしか

■監査ログからSetIamのメソッドを取りBQ権限付与を検知するクエリ
WITH source AS(
SELECT
*
FROM `project-logging.organization_audit_log_v2.cloudaudit_googleapis_com_activity_20*`
WHERE_TABLE_SUFFIX = format_date('%y%m%d', current_date("Asia/Tokyo"))
),
project source AS(
SELECT
ROW_NUMBER() OVER (ORDER BY timestamp) as id,
*
FROM source
WHERE
protopayload_auditlog.methodName = 'SetlamPolicy'
project_authorizationinfo AS(
SELECT
DISTINCT
id,
__ori.resource.type as type,
__ori.resource.labels.project_id as project_id,
__ori.resource.labels.dataset_id as dataset_id,
protopayload_auditlog.methodName as method_name
protopayload_auditlog.resourceName as resource_name,
protopayload_auditlog.authenticationInfo.principal Email as email_manipulator,
authorizationInfo.resource as request_resource,
authorizationInfo.permission as request_permission,
authorizationInfo.granted as request_granted,
protopayload_auditlog.requestMetadata.callerlp as callerlp,
protopayload_auditlog.requestMetadata.callerSuppliedUserAgent as callerSuppliedUserAgent,
FROM project_source AS __ori
). UNNEST (protopayload_auditlog.authorizationInfo) AS authorizationInfo
project_bindingdeltas AS(
SELECT
id,
--array_binding Deltas_project as binding Deltas_project,
array_binding Deltas_project.action as action_project,
array_binding Deltas_project.member as member_project,
array_binding Deltas_project.role as role_project,
timestamp
FROM project_source AS_ori
,UNNEST (protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS array_binding Deltas_project
),
project_setiam AS(
SELECT
--*, except(id)
type,
project_id,
dataset_id,
method_name,
resource_name,
email_manipulator,
request_resource,
request_permission,
request_granted,
callerip,
callerSuppliedUserAgent.
action_project,
member_project,
role project.
CAST(NULL AS STRING) AS metadataJson,
CAST(NULL AS STRING) AS bindingDeltas_dataset,
CASTINULLAS STRING AS action_dataset,
CAST(NULL AS STRING) AS member_dataset,
CAST(NULL AS STRING) AS role_dataset,
CAST(NULL AS STRING) AS bindingDeltas_table,
CAST(NULL AS STRING) AS action_table,
CAST(NULL AS STRING) AS member_table,
CAST(NULL AS STRING) AS role_table,
timestamp
FROM project_authorizationinfo
LEFT JOIN project_bindingdeltas ON project_authorizationinfo.id = project_bindingdeltas.id
WHERE role_project LIKE 'roles/bigquery%
),
resource_source AS (
SELECT
__ori.resource.type as type,
__ori.resource.labels.project_id as project id,
__ori.resource.labels.dataset_id as dataset_id,
protopayload_auditlog.methodName as method_name,
protopayload_auditlog.resourceName as resource_name,
protopayload_auditlog.authenticationInfo.principalEmail as email_manipulator,
authorizationInfo.resource as request_resource,
authorizationInfo.permission as request_permission,
authorizationInfo.granted as request_granted,
protopayload_auditlog.requestMetadata.callerlp as callerlp,
protopayload_auditlog.requestMetadata.callerSuppliedUserAgent as callerSuppliedUserAgent,
protopayload_auditiog.metadataJson,
timestamp
FROM source AS __ori
,UNNEST(protopayload_auditlog.authorizationInfo) AS authorizationInfo 
WHERE
protopayload_auditlog.methodName = 'google.iam.v1.IAMPolicy.SetlamPolicy' 
--AND timestamp= "2024-03-11 04:11:30.885258 UTC"
),
resource_id AS (
SELECT
ROW_NUMBER() OVER (ORDER BY timestamp) as id,
*
FROM resource_source
),
resource_bq_dataset AS (
SELECT
id as id_dataset,
json_extract(metadataJson, '$.datasetChange bindingDeltas') as bindingDeltas_dataset,
json_extract(array_bindingDeltas_dataset, '$action') as action_dataset,
json_extract(array_bindingDeltas_dataset, $.member') as member_dataset,
json_extract(array_bindingDeltas_dataset, '$.role') as role_dataset,
FROM resource_id
,UNNEST(json query_array(metadataJson, '$.datasetChange.bindingDeltas')) AS array_bindingDeltas_dataset
),
resource_bq_table AS (
SELECT
id as id table,
json_extract(metadataJson, '$.tableChange.bindingDeltas') as bindingDeltas_table,
json extract(array_bindingDeltas_table, '$.action') as action table,
json_extract(array_bindingDeltas_table. '$.member') as member table,
json_extract(array_bindingDeltas_table, '$.role') as role_table,
FROM resource_id
,UNNEST(json query_array(metadataJson, '$.tableChange.bindingDeltas')) AS array_bindingDeltas_table
),
resource_setiam AS ( 
SELECT
--*except(id, id_dataset, id_table)
type,
project_id,
dataset_id,
method_name,
resource_name,
email_manipulator,
request_resource,
request_permission,
request_granted,
callerlp,
callerSuppliedUserAgent,
CAST(NULL AS STRING) AS action_project,
CAST(NULL AS STRING) AS member_project,
CAST(NULL AS STRING) AS role_project,
metadataJson,
bindingDeltas_dataset,
action_dataset,
member_dataset,
role_dataset,
bindingDeltas_table,
action_table,
member_table,
role_table,
timestamp
FROM resource_id
LEFT JOIN resource_bq_dataset ON resource_id.id = resource_bq_dataset.id_dataset
LEFT JOIN resource_bq_table ON resource_id.id = resource_bq_table.id_table
)
SELECT * FROM project_setiam
UNION ALL
SELECT * FROM resource_setiam

■BQからCloudSQLにデータを入れる (GCSを経由する、コマンドやPythonがある
bq query --use_legacy_sql=false 'CREATE OR REPLACE TABLE `prj.ds._table` AS SELECT FROM `prj.ds.view`';
bq extract -destination_format CSV 'prj.ds._table' gs://bucket/tbl.csv
gcloud sql import csv インスタンス名 
gs://bucket/tbl.csv --database=データベース名 --table=テーブル名

■ログの重複をなくす
import google.cloud.logging
import logging

# クライアントの作成
client = google.cloud.logging.Client()

# Cloud Logging ハンドラを追加
client.get_default_handler()
client.setup_logging()

# 既存のハンドラをすべて削除
for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

# 新しいハンドラを追加
logging.basicConfig(level=logging.INFO)
# logging.basicConfig(level=logging.DEBUG)  # DEBUG レベルからすべてのレベルを記録

# propagate を無効にして重複を防ぐ
logger = logging.getLogger()
logger.propagate = False

# 各ログレベルでテスト
logging.debug('This is a DEBUG log')
logging.info('This is an INFO log')
logging.warning('This is a WARNING log')
logging.error('This is an ERROR log')
logging.critical('This is a CRITICAL log')

■何度かAPIコールを繰り返す
def safe_replace_text(document_id, old_text, new_text, max_attempts=3):
    for attempt in range(max_attempts):
        try:
            replace_text(document_id, old_text, new_text)
            break  # 成功した場合はループを抜ける
        except Exception as e:
            print(f"Attempt {attempt + 1} failed: {e}")
            if attempt == max_attempts - 1:
                print("Reached maximum attempts.")

■Exponential Backoffで時間を指数級数的にゆらぎながら増やすリトライ
import time
import random
def exponential_backoff(max_retries=5, base_wait_time=1, max_wait_time=32):
    retries = 0
    while retries < max_retries:
        try:
            # APIリクエストの送信
            response = send_request()
            if response.status_code == 200:
                return response  # 成功時に結果を返す
        except Exception as e:
            wait_time = min(base_wait_time * (2 ** retries), max_wait_time)
            wait_time += random.uniform(0, 1)  # ランダムなズレを追加(Jitter)
            print(f"Retrying in {wait_time} seconds...")
            time.sleep(wait_time)
            retries += 1
    raise Exception("Max retries reached, request failed")

クォータの増加の依頼もできるが、基本的に下記の上限がある

1. Google Docs API の利用上限

  • ユーザーごとの1分あたりのリクエスト数:
    • 1,000 リクエスト/ユーザー/100秒
  • プロジェクトごとの1日あたりのリクエスト数:
    • プロジェクトごとに1日100万リクエスト(デフォルト)

これらの制限を超えると、リクエストが拒否されるか、APIを利用できなくなることがあります。

2. Google Drive API の利用上限

  • ユーザーごとの100秒あたりのリクエスト数:
    • 1,000 リクエスト/ユーザー/100秒
  • プロジェクトごとの1日あたりのリクエスト数:
    • 1日10億リクエスト(デフォルト)
  • ユーザーごとのデータ転送量の制限:
    • 読み込みは750GB/日/ユーザー
    • 書き込みはユーザーごとの制限が異なるため、大量のデータ処理を行う場合は注意が必要

Posted by funa : 07:30 PM | Web | Comment (0) | Trackback (0)


April 23, 2023

Bay Bay Bay
ebayはSellerからオファーがあり値引きしてくる。破壊力あるな。ただ購入が面倒だった。

ebayでの問題
1)日本には送ってくれない場合がある
2)日本に送ってくれるが住所が日本語だと売主でキャンセルされる
決済での問題
3)クレカ会社で支払いを止められている場合がある
4)Paypalで各種証明書が必要で止められている場合がある(クレカ認証も要るはず
5)google payでの決済ができない(クレカ側で止められているのでは?

対処
1)米国転送住所 shipito.com が使える
 オレゴン倉庫は消費税が掛からないが有料で月10ドル
 calの10%弱の消費税が掛からず送料も安くなるので一時契約する
 ebayに米国住所を登録するには米国電話番号が必要
  skypeで毎月300円で発行ができるので一時契約する(MSのoutlookメールID)
 shipito.comに送付されたら日本に転送依頼をする
2)ebayの送付先住所(米国)は英語にする(日本に送付可ならコレなくてもいい)
 念のため日本の個人情報住所も英語にする(日本に送付可でもココは英語がいいかも)
 念のためebayの言語設定を英語、場所を米国にする(上か下ナビにあるはず)
  その後に購入・決済手続きする方がいい
3)クレカサイトのFAQで支払いできない時等で検索して対処
4)Paypalは各種証明書を登録する。クレカ認証は確か少額課金で検証されるはず
5)知らん

shipitoで送料見積もると安かったが、実際に荷物が届くと梱包が大きくかなり高い
米国内転送でshipitoでまとめて荷物一つで送ろうと思ったが、直接日本に送ってくれる相手なら直接の方が安いかもしれず良く考えよ
解約すること shipito $10 / skype us phone num 300yen

解約していたはずが、SKYPE.COM/GO/BILL利用国LUで300円請求されていた ログインIDを確認しログインし Manage features| Skype My Account で解約した
SkypeとかGoogleとか詐欺ってるよな

=========

流せるトイレブラシの使い方に「天才かよ」 真似したくなるトイレの掃除術 – grape [グレイプ] (grapee.jp)

昭和100年は、2025年/平成37年/令和7年だ。(昭和64年=平成元年/1989、平成31年=令和元年/2019)
西暦の下2桁から018(レイワ)を引くと令和、23-18=5なので令和5年

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


March 15, 2023

GMT(Greenwich Mean Time)

■セイコーPROSPEX SPEEDTIMER Solar Chronograph SBDL097(ペプシ)
セイコー プロスペックス SPEEDTIMER SBDL097 | セイコーウオッチ (seikowatches.com)
腕時計のベルト調整方法(Cリング式) - YouTube
Cリングが内側下側に入っており無くし易いので気を付ける
6時方向を短くした方がバランスが良い
バックル微調整はバネ棒なので縮めてズラす(バックルから外さない方が面倒がない)
 クロノグラフはストップウィッチで秒針が12時のままが正しい
 スプリットセコンド付
  上ボタンでスタート、下ボタンでラップ、下ボタンで続き
  上ボタンでストップ、下ボタンでリセット
 FとEでソーラー充電上体を表示
 竜頭1段出しで日付、2段目で時刻調整
ソーラ充電電池の寿命は10年とメーカで謳われている、交換は三~四千円で、機械かクォーツの方がいい?

■セイコー5 SPORTS SKX Sports Style GMT SSK001K1
SBSC001の海外モデルでブレスレットの中3連がミラー艶出し
各部の名称と主なはたらき (seikowatches.com)
ベルト調整はCリング無しの割ピン仕様
 午後8時から午前4時は日付の調整を行わないこと(朝昼夕方に合わせる、反時計回りは駄目)
 竜頭1段目にして反時計回りで前日の日付にセットし、
 竜頭2段目にして時計回りで時刻合わせ
  竜頭0段目:ぜんまい巻き上げ(時計回り、回しすぎない方がいいらしい)
  竜頭1段目:日付合わせ(反時計回り)・GMT24時針合わせ(時計回り)
  竜頭2段目:時刻合わせ
 日本時間の24時間針として使う場合
  ベゼルを時差分ずらすと2か国の時刻が分かる
   GMT針は24時間針で日本時間で、ベゼルを9時始まりにしてUTCの設定が良い
    +0900 JST9:00のときUTC0:00、UTCだけどcoordinated universal time
 デュアルタイム針として使う場合
  ベゼルを時差分ずらすと3か国の時刻が分かる(日本時間の長短針/盤面の24時間/ベゼルの24時間)
機械式は面倒、嵌めていないと止まる、時間がズレる、でもソコがカワイイかも
クォーツ+ソーラは100倍便利だが、機械の相棒一本がいいかもな
伝統のUI/ユーザビリティとか、機能美とか様式美に行きつく


■セイコーNH35A サブマリーナ
スピードタイマー、GMTとくれば、次はサブマリーナでしょ。ベゼルが酸素ボンベの量を表す、潜水開始時に分針をベゼルの0を合わせると何分経ったか分かる、ベゼルは逆回転しないので誤って廻っても分数が加算されるだけ
 時間合わせは5Sportsと同じ、ねじ込み式リューズで先に緩める
 ブレスレットのネジは精密ドライバ1.4mmが良かった、小さいとナメるよ
 グライドロック:ブレスレットの微調整は動く方をパキっと持上げて好きな位置迄スライドさせて押し込む
フルスペック!!
 Superior grade 904 stainless steel construction
 Sapphire crystal with clear anti reflective undercoat
 Ceramic bezel insert
 Solid link bracelet with screw pins and solid end links
 Case size is 40mm, lug width 20mm

■セイコー5 SPORTS Skz209 7S36-01E0(Blue atlas Landshark)
トリッキーなガジェットでヤバいな。回転式コンパスチャプターリング(方位計)、200m water resistant、7S36自動巻き、デイデイト表示、回転式ダイバーズベゼル、ねじ込み式リューズ
方位計の使い方
1)時計を水平にして時針を太陽の方向に合せる。この時、時針の指す方向と、12時の中間の方向が南
2)回転ベゼル(方位計)を回しSを南の方角に合せると、おおよその全方位がでる
※緯度や季節によってはズレが生じることがある
日付は「午前0時」ごろ、曜日は「午前4時」ごろ送るようになっている
 午後8時から午前4時は日付の調整を行わないこと(朝昼夕方に合わせる、反時計回りは駄目)
 竜頭1段目にして反時計回りで前日の日付、時計回りで前日の曜日にセットし、
 竜頭2段目にして時計回りで時刻合わせ
  竜頭0段目:ぜんまい巻き上げがない
ベゼルが回らないとき(そもそも反時計回りにしか回らない)
 アルカリ電解水を入れ何度かやって汚れを取る(不要な部分に浸み込まないように)
 シリコンスプレーを吹く(ベゼルに吹くと若干色が戻り艶がでる)
 SEIKO SKX ブラックボーイのベゼル外して掃除&ブレス交換します! - YouTube
  セロテープをコジリの器具の方に
  時計本体にマスキングテープ
  こじる場所がある場合もある

残るはエクスプローラー/デイトかくらいか、知らんけど、圧倒的にレディーがいいなロレックスデイトジャスト、28mmで濃縮されてる感じで、39/36と28でお揃いとかええけどな。バンド種類の名前:Oyster/Presidential/Jubilee



■カシオDATA BANK DBC-611
QW-3228 (casio.jp)説明書
左側上Aボタンでモード切替:データバンク>計算>アラーム>ストップウォッチ>DT=デュアルタイム
右側下Cボタン:操作音ONOFF
右側上Lボタン:ライト点灯
戻る:÷、進む:+
アラーム5つと時報がセットできる、Aボタンでセット、鳴るセットでAL-1~5が表示
時報セットでSIGが表示、Cボタンでアラーム時報ONOFF

■カシオ ワールドタイム AE-1200WH-1AV
QW-3198_3299 (casio.jp)説明書

■MOD
SEIKO 5 .club
DLW MODS - Seiko Watch Modification Parts (dlwwatches.com)
SeikoMods: Seiko Mod Parts & Watch Mod Parts UK
Seiko Mod Parts | Watch-Modz

Posted by funa : 09:27 PM | Gadget | Comment (0) | Trackback (0)


February 11, 2023

HSTS/CORS/CSPOAuth/OpenID/SAML/XSS/CSRF/JSOP/SSO/SSL/SVG/JWT/WebAssembly
2024-10-6
クレカ情報の流出があったタリーズオンラインストアのWebアーカイブから原因を特定した猛者が現れる→集まった有識者たちにより巧妙な手口が明らかに - Togetter [トゥギャッター]
レスポンスヘッダーに Content-Security-Policy が適切に設定されていれば防げた可能性は高い。
具体的には
▼ connect-src ディレクティブの設定
スクリプトからの外部リソースへの通信先を制限して、マルウェアが悪意あるドメインにデータを送信するを防ぐ。
例. Content-Security-Policy: connect-src 'self' https://api.trustedservice.com;
▼ eval() の禁止
Content-Security-Policy はデフォルトで eval() の使用を禁止しているが、 'unsafe-eval' を指定することで許可できる。
slick.jsのライブラリに仕込まれていたので、管理者がやったんじゃないの?
slickスライダー実装まとめ16選【サンプル付き】 - じゅんぺいブログ (junpei-sugiyama.com)

2024-7-5
Webサービス公開前のチェックリスト (zenn.dev)

2023-02-11
フロントエンド開発のためのセキュリティ入門 - Speaker Deck
 HTTPとHTTPSが混ざっているwebサイトはHSTS(http strict transport securityヘッダ)でHTTPS強制できる
 JSのfetch,xhr/iframe/canvas/WebStorage,IndexedDBでクロスオリジンは危険
 Access-Control-Allow-OriginレスポンスヘッダでCORS(cross origin resource sharing)許可を判定できる
 CSP(Content-Security-Policy)レスポンスヘッダあるはmetaタグで許可するJSを判定できる

SVG
SVG Repo - Free SVG Vectors and Icons
Vector Icons and Stickers - PNG, SVG, EPS, PSD and CSS (flaticon.com)
SVGはテキストファイルなので開いてタグとして使える
ChatGPTにSVGでお絵描きさせる|temoki / Tomoki Kobayashi (note.com)
タグで図が書ける
SVGファイルについて (zenn.dev)
sizeを決めてviewBoxの座標を設定するのがやりやすい

JWT (JSON WEB TOKEN?)
JWTセキュリティ入門 - Speaker Deck

WebAssemblyとは?〜実際にC言語をブラウザで動かす〜【2019年6月版】 #JavaScript - Qiita
コンパイルしてバイナリをWebで実行する、速いJSみたいな、ゲームやエミュやCアプリ的な奴

=========================
2022-04-06
SAML
 SSOのログイン状態を保持する認証プロバイダー(IdP)を使い各アプリ(ServiceProvider)でSSOを実現する
 SSOの仕組みにはエージェント方式、リバースプロキシ方式、代理認証方式など
  ユーザはWebサービスにアクセス
  WebサービスからSSO認証プロバイダーサーバにSAML認証要求をPostする
  SSO認証プロバイダーサーバでSAML認証を解析、ユーザに認証を転送
  ユーザはそれでWebサービスにログインする

SAMLはログイン時にユーザー情報をチェック、OAuthはユーザーの情報を登録
OAuthはアプリケーションを連動させるAPIで有効なアクセストークンかを見る
 アクセストークンには「いつ」「どこで」「なんのために」作られたのか分からない
OpenIDはIDトークンを使い「いつ」「どこで」「なんのために」作られたのか分かる

OAuth 2.0、OpenID Connect、SAMLを比較
OAuth 2.0:新しいアプリケーションに登録して、新しい連絡先をFacebookや携帯電話の連絡先から自動的に取得することに同意した場合は、おそらくOAuth 2.0が使われています。この標準は、安全な委任アクセスを提供します。つまり、ユーザーが認証情報を共有しなくても、アプリケーションがユーザーに代わってアクションを起こしたり、サーバーからリソースにアクセスしたりすることができます。これは、アイデンティティプロバイダー(IdP)がユーザーの承認を得て、サードパーティのアプリケーションにトークンを発行できるようにすることで実現されます。

OpenID Connect:Googleを使ってYouTubeなどのアプリケーションにサインインしたり、Facebookを使ってオンラインショッピングのカートにログインしたりする場合に使用されるのが、この認証オプションです。OpenID Connectは、組織がユーザーを認証するために使用するオープンスタンダードです。IdPはこれを利用して、ユーザーがIdPにサインインした後、他のWebサイトやアプリにアクセスする際に、ログインしたりサインイン情報を共有したりする必要がないようにします。

SAML:SAML認証は、多くの場合に仕事環境で使用されます。たとえば、企業のイントラネットやIdPにログインした後、Salesforce、Box、Workdayなどの多数の追加サービスに、認証情報を再入力せずにアクセスできるようになります。SAMLは、IdPとサービスプロバイダーの間で認証・認可データを交換するためのXMLベースの標準で、ユーザーのアイデンティティとアクセス許可を検証し、サービスへのアクセスの許可/拒否を決定します。
OAuth、OpenID Connect、SAMLの違いとは? | Okta

Oath: idpがトークンを発行、Webサイト間でユーザを認識し3rdからでも個人情報を使えるようになる
OpenID(OIDC): idpとJWT(トークン)で認証するOauth系のSSO、Oauthの拡張でログインが3rdからもできるようになる
SAML: idpで各アプリやAD間をXMLメッセージにより認証管理しSSOを実現
 OpenIDとSAMLが同じような機能
 SAMLはユーザ固有の傾向で大企業SSOが多い、OpenIDはアプリ固有の傾向でWebサイトやモバイルアプリが多い
 SAMLよりOIDCの方が新しくSPAやスマホと親和性が高い
 SaaSとしてOpenIDはOktaのidp、SAMLはPingFederateのidpがメジャー

=========================
2016-01-03
■XSS対策、CSRF対策、脆弱性チェック
情報処理推進機構にチェックリスト有
https://www.ipa.go.jp/security/vuln/websecurity.html
XSS対策
 フォーム送信後の確認画面ではHTMLエスケープ等でサニタイズされた内容の結果を表示
 DBへのクエリについてはプレースホルダやエスケープ等でSQLインジェクションを防ぐ
 target="_blank"はXSSになるので危ない、rel="noopener noreferrer"を付ける
  https://b.hatena.ne.jp/entry/s/webtan.impress.co.jp/e/2020/03/13/35510
  https://laboradian.com/test-window-opener/
CSRF対策
 前ページでhidden値を入れる

 クッキーに具体的なものは入れない、CookieにHttpOnly属性、HTTPS通信ではsecure属性
 エラーメッセージを表示しない
 不要なファイルは削除

 XMLの外部実態参照は禁止、サーバ上でコードが実行される
  →libxml_disable_entity_loader(true)で止める、xmlをアップロードさせない/使用しない、JSON使う
 PDFからHTTPリクエストが発行される
  →PDFをアップロードさせない

------

//SQLインジェクション対策
$sql = "UPDATE users SET name='.mysql_real_escape_string($name).'WHERE id='.mysql_real_escape_string ($id).'";
\ " ' を最低限、\エスケープ
NUL (ASCII 0) /n /r / ' " およびCTRL+Zをエスケープしたい

//クロスサイトスクリプティング対策
表示時には<>&"をメタ文字へ変換
echo htmlspecialchars($_GET['username'], ENT_QUOTES);
$ent = htmlentities($ent, ENT_QUOTES, "UTF-8"); //100個の文字を変換

//クロスサイトスクリプティング対策
別サイトからのポストを弾く
refferを送信しないリクエストもある(別サイトのリファラを弾き、nullもしくは適切ページからを許可する)
セッションIDで判断する

//DOS対策
2重ポスト
IPと日付で2重ポストを防ぐ(同IPのポストがx秒以内を弾く)

■サニタイズの方法
DOCには生のテキスト、DBとHTMLにはエスケープ済みのものを入れる
• 入力があればhtmlエスケープしDBに入れる
• html表示はそのままhtmlエスケープ状態で出力
• Docへはhtmlエスケープを解除し表示
• htmlフォーム内表示はhtmlエスケープを解除し表示
htmlエスケープ
https://weblan3.com/html/special-character
バッククォート以外は分かり易いで文字表記でエスケープする、改行はエスケープしない
< &#60 &lt 不等号(より小さい)
> &#62 &gt; 不等号(より大きい)
& &#38; &amp; アンパサンド
" &#34; &quot; 二重引用符
' &#39; &apos; シングルクォート,アポストロフィ
; &#59: &semi; セミコロン
\ &#92; &bsol バックスラッシュ
` &#096 バッククォート

========

■JSONP
scriptタグを使用してクロスドメインなデータを取得する仕組みのことである。 HTMLのscriptタグ、JavaScript(関数)、JSONを組み合わせて実現される

GoogleAnalyticsのクッキーは1stパーティでサイト側がオーナでありGoogleがオーナーではない
 サイト側のJSでクッキーが作成されるようなっている
 クッキーが送信される相手はどこか?が重要でGoogleでなくサイト側に送信される
 アクセス履歴は別途データをGoogleに送信しており、クッキーはセッション管理に使用される


■SSO
色々な方法がある、SAMLや、サイトにエージェントを組み込み+SSO認証サーバ等
ロジックを確認しないと詳しくは分からない

=========

■SSL
CAはサーバに証明書(署名)を発行
====
クライアントが接続要求
サーバが証明書(署名とRSA公開鍵を含む)を送る
クライアントが証明書を検証(
 どっち?
 1)署名をルート証明書のチェーン(RSA公開鍵)で複合化しドメインを確認
  該当のルート証明書(RSA公開鍵)がブラウザにないと該当CAに要求?
   CRLやOCSPで失効について問合せができるようだがRSA公開鍵の要求は出来なさそう
  (ルート証明書はブラウザにある結局オレオレ証明書に違いない:厳密な審査の上で組込まれている)
 2)クライアントが公開鍵をサーバに送りRSA秘密鍵で暗号化し送り返すとクライアントが複合化してRSA秘密鍵が正しい事を確認
)
クライアントが共通鍵(セッションキー)を生成し公開鍵で暗号化し送る
サーバが秘密鍵で共通鍵を複合
以降共通鍵暗号で通信
 ※ホンマか??
====
ホスト(ドメイン)を持って接続要求をし、暗号化通信後にパスやクエリパラメータを送るので、詳細は暗号化され守られている

Posted by funa : 01:46 AM | Web | Comment (0) | Trackback (0)


January 22, 2023

竹書房 plotted nibbler
ええ本無いな、ダメな方に誘導しているだけで読まん方がいいよな
 どうでもええ、科学的でも前進が少ない、分かりにくい、本となっていない
 上梓しましたよ~という為だけにある
 レビューも信用ならん
 適当なことを言っているだけ、逆誘導
 逆に生産性が無さそうな批評家、評論の方がええかも

といっても、私も逆誘導だよ~ん
ということで… ベリベリベリ竹書房復活ってdoDow


/// 支配の構造 国家とメディア――「世論」はいかに操られるか
仏)フランス革命で労働者が団結して職能組合や結社を厳しく制限
中間共同体を認めず、ルソーの社会契約論に影響された
国家は個人の自由意思に基づく契約により成立、一般意思こそが公の利益を達成する
党派、結社は私的団体であり、私的利益誘導するでなく個人になれと
実際には党派なのに個人と言い張ることが起こる

米)タウンシップがデモクラシーの下支え
地域に根差す自治的な中間共同体、つまり教会
中産階級が階級的ではなくフラットな個人として関係性を結ぶ
中間共同体が国家権力の防波堤になり、パブリックマインドの教育の場となる
行き過ぎた個人主義から共同体を見直す動きも
結社としてのメディア=ローカルニュース
選挙は神の見えざる手、デモクラシーには見えない神の存在があると思っているのでは

プロテスタントの救済、神の国に行くのは厳格で難しい
カトリックは懺悔をすればいいが、Pは大抵の人は救済されないと考えている
救済される自分は救済されない堕落した人間とは付き合えない
つまりエリートとしての連帯は強く救済される同志

人の間で同時性を認識できると共同体やネーション等の連帯感が現れる
同じニュースを見る事、昔は新聞で同時性がありメディアが連帯を近年作りだした
昔はどこに巡礼するかで共同体が決まった、共同体から代表2名で伊勢に行ったとか
ネットはバラバラに小世界を点在させ、相互交流はしない

検閲や強制や弾圧でなく、社会の変化に従って、大衆が自ら忖度し発禁していくだろう
ちびくろサンボ、アンクルトムの小屋、煙草と肺がん、コロナ、陰謀
誰かにとって好ましくないものは何も考えずに燃やしてしまえば平穏無事だ
自分の頭で考えているような気になる、動かなくても動いているような感覚になる、ニュースのみをぎっしり詰め込んでやれ

/// 知ってはいけない現代史の正体
waspはもう米国を支配していない
排他的だったwaspは > 同一化 > 多様性 > というメディア世論で没落 > DS
多文化共生を一つの国家で行えない(DSの分断戦略、欺瞞、国家は単一文化が自然)

戦争紛争を利用し利益を収奪
シリアに介入したい(反アサド⇔ISIS(悪者)←育てる/武器を供給)>無政府状態にした後>介入
時に両方に付く、時に片方、だが裏切ることもある

自由と民主主義は国際介入政策を正当化する口実
- 民主化>民営化>グローバル市場化→国民主権の喪失
- グローバリズム→民族文化を破壊し金融で独裁支配する社会主義化


歴代大統領:グローバリズム←影のキングメーカ:国際金融資本家のコントロール下
トランプ:アメリカファースト/ナショナリズム
プーチン:反グローバリズム

中国:共産党独裁国家、超個人主義、中国人に国家観はない(儲かればいい)→世界のリーダになり得ない

/// アンジャッシュ渡部の 大人のための「いい店」選び方の極意
食の楽しみ、開拓の楽しみ
相手の苦手なものを確認、行きたいところを調べて行く
忙しいとか疲れている時こそ食べに行く:充実感でリフレッシュ
予約時:用途を言っておきたい(デートとか接待とか)、個室はテーブルか座敷か、お土産

/// フロイト vs ユング
フロイトが考えたのはこういうことだ。人間は誰しも、自分でも知らない 「心の秘密」をもっている。世の中には、不幸にも、なぜだかわからないうちに心や体の調子が悪くなり、しかもそのせいで周りとの人間関係までぎくしゃくしてしまっているような人がいる。そういう人の多くは、この「心の秘密」のせいで不幸になっている。

フロイトは、この秘密の在りかを「無意識」と呼んだ。

自分にも分からない 「心の秘密」などというものができてしまうの は、もとはといえばこの「話すこと」に原因があるのだと言ってよい。フロイトは、「無意識」をつくる心の働きを「抑圧」と呼んだが、これは「話すこと」を抜きには考えることが できないメカニズムである。つまり、あることを言わずに別のことを言う、ということではじめて、なにかが外へと追い出される、ということになるのである。

ときどき、精神分析 (まがい)の本を読んでいると、人間に心の病をもたらす根本的な問題は 「人間の本能が壊れている」ことだ、などという説明に出会うことがある。こうした考え方 は、精神分析の立場からすると、まったくの的外れだと言わねばならない。人間が「ことば」というものを話すようになった瞬間から、自らの本能的現実とはまったく異なる次元の「現実」に、すなわち、まさに「言語によって生み出される現実」に、捕らえられてしまうということ、そのことこそが重要なのだ。

言語の働きにのっとって話すことが「無意識」をつくり、また逆に「無意識」を探す道すじを与えてくれるのだとすれば、およそ人間の活動の及ぶあらゆる領域において、「無意識」が存在し、「無意識」が探求されうることになる。だからフロイト以後、文学も、人類学も、政治学も、社会学も、文学作品の中にも、未開社会の畑の中にも、政治的言説の中にも、はたまた社会構造そのものの中にも、「無意識」は存在するし探求されるようになった。

フロイト:チェコ、年子、ユダヤ改修派(ユダヤとして被差別、隣国ナチスとの関係)
ユング:ゲルマン系スイス、父プロテスタント牧師名士、母シャーマン家系
抑圧・トラウマを意識化すると神経症が治る。カタルシス→意識化していない、知らないことは怖い
 抑圧>無意識>神経症(神経症だけでなく無意識に入り込む:夢・失錯行為・機知に反映)
心の構造論
 イドesリビドー:快感原則
 自我ego:健全
 超自我super ego:無意識な躾(破ると後悔や罪責感)
コンプレックス - Wikipedia:無意識に働く心的内容で複合的な観念、好きだが嫌いとか葛藤とかフェチ的な
 エディプスコンプレックス:母好き父嫌いな息子
 エレクトラコンプレックス:父好きな葉は嫌いな娘
 劣等感を意味するのはコンプの一種でコレ、劣等複合(inferiority complex)
  全ての他人よりも不足している、劣っているという信念から劣等感が生じ、極端な内気、自己隔離、社会的従順などが発生
死の欲動・影←対抗するには自我(健全)の強さが必要
 駄目男に惹かれる>快感(受動な不快を能動的に置換して和らげようとしている)
ヌーメン性:聖性が作用し自身が支配される
ニヒリズム:虚無主義、絶対的な価値がなくなる
脳科学の知見
 思考)外部を知覚し判断
 感情)内的寛容や内的欲求を抑圧し評価
 情動)検索、のっとり、恐怖、パニックの少なくとも4つ
力動:反対方向に動くエネルギーの葛藤
 愛情と攻撃性、欲望と禁
転移:患者が分析家に愛情や憎しみ等の感情を向ける、逆に分析家が患者に感情を向けると逆転移
解離:ヒステリーから別人格が現れる
 (ヒステリー:強い感情があり意識から追い出されている記憶)
自由連想法:自由に話し無意識に閉じ込められた記憶を蘇らせる
催眠術:意識は眠らせるが無意識に話し掛け暗示を掛ける、これで支配できる
幼児期の性的トラウマが思春期以降にヒステリーとして現れる
夢:願望充足(あくまで無意識の。だがかつて意識から追放された欲望)
 睡眠自体を守る行為の場合もある
 圧縮+移動+抵抗の検閲
 イドとエゴとスーパーエゴが夢を歪めているのを探る
 夢により意識と無意識を近づけたと言える
子供の夢:強い歪曲や検閲がなく、また抑圧や記憶が少なく欲望成就そのままが多い
大人の夢:遠い記憶/複雑な葛藤/幼年期の記憶で圧縮移動されて分かりにくい
現実と欲望の葛藤→間違い/度忘れ/ヒステリー/脅迫神経症/夢で成就
 プライベートで退行し抑圧を解放しバランスを取っている
(フロイト
夢や症状は個人史の中で探られるべき
脅迫症状には愛憎の葛藤や性的トラウマがある
夢には無意識に抑圧された願望が現れる
無意識は自我が受け入れられないものを放り込むゴミ箱のようなもの
自我は意識の中心、無意識の中に抑圧された衝動や感情が神経症の原因
神経症の原因は幼少期にある
(ユング
夢や症状は集合的無意識に根差す原初的なイメージとも比較対象すべき
物語が重要であり人の苦悩や背景を明らかにする
無意識は意識を補償するもので夢は無意識からのメッセージ
無意識はもっと創造的で植物にすら通底する将来的な層がある
意識と無意識からなる心の中心には自己(セルフ)がありこれを実現することが人生の目標
神経症の原因は現在にある、神経症の人こそ自己実現の可能性をもつ
(オレ
無意識の願望が幼稚な場合は折り合いがつかず問題だな

夢の定型変形
 塔/ペン:ちんこ
 鞄/洞窟:おまんちょ
 王/王妃:両親
 小動物:子供/兄弟
言葉遊びで別の言葉に置き変えらる
夢を他人に話す前提>転移者(分析家)が夢に含まれている
前頭法:頭を叩きながら治療者が語り掛ける
自由連想法:頭に浮かんだことをそのまま語らせる
 不安=内的、恐怖:外的、体内:楽園
不安の原型は出産外傷で分離、孤独、見捨てられ

神経症は無知に押し込まれている
暗示法は信頼関係=転移が必要で危険>フロイトは自由連想法に変えた

フロイト=性欲、子供においては愛着・依存が
 男女間の結合だけでなく、創造・欲求・生命力の源泉・活力

 人間は性欲を学習するので間違いや失敗が起こりやすい
男:エディプスコンプ(母に恋し父を憎む)→去勢を連想→断念し父を真似→超自我→(拗らせ)性同一性
女:エディプスコンプ(母を愛す)→ちんこがない→劣っている→母を嫌悪→父に憧れ→他男と恋愛→(拗らせ)変な恋愛、ユング派はエレクトラコンプレックスという

肛門期:トイレ成功/失敗の躾>SMに発展
ナルシシズム:性的エネルギーを自己に(自己保全)
防衛機制:抑圧(嫌な事は無責任化)、否認(認めない)、分離(感情を切り離し他人事)
防衛機制:同一化、反動形成(嫌なのに丁寧)、投射(被害妄想など)、合理化(知性化:言い訳)、昇華(虐めをスポーツ)
死への欲動(タナトス):正か生き死に、外部とすると他者攻撃となる、あるいは超自我(躾)
生の欲動(エロース):
 戦争=攻撃的欲求
 宗教=幼児は親に守ってもらいたい欲望(幼児神経症的)
 芸術=幼児期に抑圧された性的欲望を形を変え昇華
 性欲・攻撃性・エディプスコンプを転換→仕事/スポーツ/絵/戦争/文学

ユング:心がどこへ向かおうとしているか?心は過去から未来へ発達を続けようとする
フロイト:過去(幼児期)>性的エネルギー
カレン、ホナイ:神経症は性欲でなく文化的要因=対人関係と基底不安(幼児期/孤独で無力)
アルフレッドアドラー:権力闘争/体力知力を求める、劣等感が神経症に

子供の人格形成:親は子供の世界に入るべきでない、自分で世界を発見すべき
幼児の人格形成:母が外部との緩衝になり、受け取れるものだけ選択し赤ちゃんに返すといい

ラカン:
 想像界(鏡像):ナルシシズムと攻撃性で事故や他人を形成する領域
 象徴界:人を人と形成する言語の領域=法
 現実界:死の欲動の領域

男性の去勢不安、女性のペニス羨望>精神分析治療で乗り越えるのが難しい

自我心理学:自我を強くし適応能力を高める(無意識を長期間分析する必要がなくなる
認知行動療法:無意識にアプローチしないプラグマティックなトレーニング療法
 例)ゴキブリ怖い>映像を見て慣れる等(パブロフの犬的)
ニューロサイエンス:心の現象も脳内化学物質プロセス

心理学
 ヴント:要素主義-構成主義-意識内容の考察
 ワトソン:行動主義 S(刺激)-R(反応)
 ヴェルトハイマー:ゲシュタルト心理学=形態(似てるものをグループしがち)
  上の2つの反応観察に反論し全体性に光を当て解明しようとする、心は要素に分解できず部分からは導くことは不可
 フロイト:精神分析
=======
枢軸 axis/pivot
国際関係のうえで親密な友好関係にあり、共同行動をとる国々。ナチス・ドイツ、ファシストのイタリア、軍国主義の日本。ムッソリーニがローマとベルリンを結ぶ垂直線を枢軸として国際関係は転回すると演説して有名に。ひっくり返すの暗喩。
 直喩simile:~のような「雪のような肌」
 暗喩=隠喩metaphor:例えが隠されている「檻の中のライオン」
 換喩metonymy:連想できる代替の語「白衣の力で治す」

Posted by funa : 04:17 PM | Column | Comment (0) | Trackback (0)


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


TWITTER
Search

Mobile
QR for cellphone  QR for smart phone
For mobile click here
For smart phone click here
Popular Page
#1Web
#2Hiace 200
#3Gadget
#4The beginning of CSSレイアウト
#5Column
#6Web font test
#7Ora Ora Ora Ora Ora
#8Wifi cam
#9みたらし団子
#10Arcade Controller
#11G Suite
#12PC SPEC 2012.8
#13Javascript
#14REMIX DTM DAW - Acid
#15RSS Radio
#16Optimost
#17通話SIM
#18Attachment
#19Summer time blues
#20Enigma
#21Git
#22Warning!! Page Expired.
#23Speaker
#24Darwinian Theory Of Evolution
#25AV首相
#26htaccess mod_rewite
#27/// BANGBOO BLOG /// From 2016-01-01 To 2016-01-31
#28竹書房
#29F☆ck CSS
#30Automobile Inspection
#31No ID
#32Win7 / Win10 Insco
#33Speaker
#34Arcade Controller
#35Agile
#36G Suite
#37Personal Information Privacy Act
#38Europe
#39Warning!! Page Expired.
#40GoogleMap Moblile
#41CSS Selectors
#42MySQL DB Database
#43Ant
#44☆od damnit
#45Teeth Teeth
#46Itinerary with a eurail pass
#47PHP Developer
#48Affiliate
#49/// BANGBOO BLOG /// From 2019-01-01 To 2019-01-31
#50/// BANGBOO BLOG /// From 2019-09-01 To 2019-09-30
#51/// BANGBOO BLOG /// On 2020-03-01
#52/// BANGBOO BLOG /// On 2020-04-01
#53Windows env tips
#54恐慌からの脱出方法
#55MARUTAI
#56A Rainbow Between Clouds‏
#57ER
#58PDF in cellphone with microSD
#59DJ
#60ICOCA
#61Departures
#62Update your home page
#63CSS Grid
#64恐慌からの脱出方法
#65ハチロクカフェ
#66/// BANGBOO BLOG /// On 2016-03-31
#67/// BANGBOO BLOG /// From 2017-02-01 To 2017-02-28
#68/// BANGBOO BLOG /// From 2019-07-01 To 2019-07-31
#69/// BANGBOO BLOG /// From 2019-10-01 To 2019-10-31
#70/// BANGBOO BLOG /// On 2020-01-21
#71Bike
#72Where Hiphop lives!!
#73The team that always wins
#74Tora Tora Tora
#75Blog Ping
#76無料ストレージ
#77jQuery - write less, do more.
#78Adobe Premire6.0 (Guru R.I.P.)
#79PC SPEC 2007.7
#80Google Sitemap
#81Information privacy & antispam law
#82Wifi security camera with solar panel & small battery
#83Hope get back to normal
#84Vice versa
#85ハイエースのメンテ
#86Camoufla
#87α7Ⅱ
#88Jack up Hiace
#89Fucking tire
#90Big D
#914 Pole Plug
#925-year-old shit
#93Emancipation Proclamation
#94Windows env tips
#95Meritocracy
#96Focus zone
#97Raspberry Pi
#98Mind Control
#99Interview
#100Branding Excellent
Category
Recent Entry
Trackback
Comment
Archive
<     December 2024     >
Sun Mon Tue Wed Thi Fri Sat
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
Link