■Big queryリファレンス
BigQuery解説:https://beyondjapan.com/blog/2016/03/what-is-bigquery/
クエリ処理のツリーアーキテクチャによる分散並列処理
複数のサーバーに対してツリー状に拡がっていき、並列にサーバー上で同時に分散処理
ルートサーバ>intermediateサーバ>leafサーバ
BigQuery MLという機能を利用すると、機械学習モデルをCloud AI PlatformのTensorFlowなどに連携させ、クエリ結果を素早くAIと連携
Lookerというデータ分析プラットフォームとの連携よりクエリ結果を、データ統合、変換、分析、可視化、レポーティングすることができ、非常に強力なBI
列指向型・カラム型データベース・カラムナストレージ(一般的なRDBMSでは行単位でデータが保存)
必要なカラムのデータを取得するだけでよく、またデータは圧縮できる
https://dev.classmethod.jp/articles/google-bigquery-debut/
GCPプロジェクト>データセット>テーブル(行row列columnで普通のテーブル、ネイティブbigqueryテーブル/Googleドライブのような外部テーブル、SQLクエリによるビュー)
アンスコ_で始まるデータセット名は隠しでコンソールで非表示
ジョブは非同期で実行され、ステータスをポーリング(データの読み込み、データのエクスポート、データのクエリ、データのコピーなど)
クエリ(ウェブ UI、bq コマンド、BigQuery REST APIの方法がある、SQLと同じ?
SELECT title, answer_count, view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
ORDER BY view_count DESC LIMIT 10
BigQueryはSELECT tag, time FROM [dataset_name.table_name_20151206]のように必要な列だけを選択した場合にはスキャンの幅を狭めることは可能ですが、LIMITやWHERE句には何を書いてもテーブルをフルスキャンしてしまう
節約 Amaのs3に入れRedshift内でテーブルを分割した後にBigQuery
Hadoopでも使われていたGoogle開発のエンジンであるMapReduceは、非構造化データをプログラミングモデルを通して扱うが、巨大なテーブルの結合や巨大な出力結果のエクスポートも可能である半面、処理時間は数分間から数日に及んだ、だが、BigQueryは、あらかじめデータを構造化してBigQueryのテーブルに格納しておかねばならないが、ほとんどのクエリは数秒で完了する
サードパーティ ツール(データの読み込みや視覚化を行うツールなど)を使用して BigQuery のデータにアクセス可
Google Cloud SDKをインストールすればコマンドラインが使える
BQは同一リージョンでないとJoinができない、ゾーンはマルチで良い
BQでは us と eu がマルチリージョン
22/4現在のリージョンリスト:asia-east1-2、asia-northeast1-3、asia-south1-2、asia-southeast1-2、australia-southeast1-2、europe-central1-2、europe-north1、europe-west1-6、northamerica-norhteast1-2、southamerica-east1、sourthamerica-west1、us-central1、us-east1-4、us-west1-4
`other-prj`.dataset.table あるいは `other-prj.dataset.table`
■標準SQL
先頭行でレガシーか宣言 #standardSQL あるいは #legacySQL
バッククォートでエスケープ、プロジェクト区切りも.(ドット)、From句のカンマはCross joinで全組合せかと思われ通常通りjoinやunionを使う事
配列が使える、カラム一つに配列を入れて多元的に扱える
withで一時テーブルを作れる
exceptでカラムを除外、replaceでカラムの置き換え
select * except(kuso) from a
分析関数over()とwindowで計算ができる
rank() over (order by x)は下記moreのRFMに使用している
ROW_NUMBER() over (order by timestamp) as id,で採番できる
地理関数とかJSON関数とか色々関数もありそう
■レガシーSQL(標準SQLを使うのが由)
予約語は角かっこを使ってエスケープ、プロジェクト区切りは:
集計関数で WITHIN キーワードを使用すると、レコード内の繰り返しの値が集計?
FROM句のカンマは標準SQLのCross joinとは異なりUNION ALL 演算子
通常のSQL処理システムとは異なり、BigQueryは繰り返しデータの処理を前提として設計。繰り返しレコードの構造を操作するクエリを記述。その方法の1つが、FLATTEN 演算子?
JOINは、INNER、[FULL|RIGHT|LEFT] OUTER、および CROSS JOIN 演算子をサポート、デフォルトINNER
除外できる select + from A OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
TOP を使用するには、SELECT 句に COUNT(*) を含める
分析関数over()とwindowで計算ができる?(標準SQLと同様?)
functionを作って使える(標準SQLと同様?)
JSON等のネストをフラット化
■DDL
データ定義言語ステートメントの使用 | BigQuery | Google Cloudhttps://www.isoroot.jp/blog/1651/
auto_incrementもdefaultもprimary keyもindexもshow create tableないのでは?
CREATE TABLE IF NOT EXISTS bangboo_data.x_xxx (
`no` INT64 NOT NULL,
`user_no` INT64 NOT NULL,
`name` STRING,
`date` DATETIME,
)
同じスキーマで作ることもできる
CREATE TABLE ore_ds.test003
LIKE prj.ds.test001
PARTITION BY _PATITIONDATE
■bqコマンドはコンソールで実行できる
ブラウザで該当プロジェクトに入りコンソールボタン、下記ではスキーマをJSONで取得できる
bq show --schema --format=prettyjson myProject:myDataset.tbl001
bq ls -n 3000 dataset_aho (データセット内のリスト3000件、デフォ50件?)
bq cp --force prj:ds.tbl prj:ds.tbl2
上書きコピー(削除しコピー)コンソールだと同名コピーや下記ができない
bq cp ds.tbl1,ds.tbl2 ds.newtbl
2つのテーブルをnewtable にまとめコピー
bq cp -a ds.tbl2 ds.tbl1
tbl2をtbl1に追加コピー --append_table でも同じ
bq load (csvとかgcsのファイルを読み込む)
bq extract (gcsに抽出)
■データアップロード時のスキーマ指定
自動検出はFirestore、Datastore、Avro、Parquet、ORCだけ?ほぼ手動のutf-8のcsvかjsonlかを使う形
コンソールで手動スキーマ指定可(jsonスキーマを張付ける)、modeは省略可でデフォはnullable、
JSONスキーマファイルupはaqコマンドのみ可、ローカルからup時のコマンドとスキーマ例↓
bq load --source_format=CSV mydataset.mytable ./myfile.csv ./myschema.json
[
{
"description": "quarter",
"mode": "REQUIRED",
"name": "qtr",
"type": "STRING"
},
{
"description": "total sales",
"mode": "NULLABLE",
"name": "sales",
"type": "FLOAT"
}
]
COUNT DISTINCTだが、BigQueryでは概算値が返ってくる??。正確な値が必要な場合は、GROUP EACH BYとCOUNT(*)を組み合わせる
///Saved query
プロジェクトに対して保存をして使いまわす等ができる
URLでクエリを共有できる
///Federated Query
スプレッドシートやGCSの外部ソースをBigQueryで
範囲の書き方:シート1!A1:B100
Auto detectにするとHeader skipを1にして1行目をカラム名として使うといい
注意)
シートで構成を変えると滅茶苦茶になる
空欄のセルはnullになる
使う人はBQへもスプレッドシートへも両方権限が必要
///パラメータ(変数)を使う
--parameter=min_count:INT64:250
SELECT word FROM `prj.ds.t` WHERE AND count >= @min_count
パラメータ化されたクエリの実行 | BigQuery | Google Cloudこういう感じでも使えるのでは
WITH params AS (
SELECT @sheetInput AS p
),
tmp_pre_processed_src AS (
SELECT * FROM src
)
SELECT * FROM tmp_pre_processed_src
,params
WHERE
tmp_pre_processed_src.a = p
///*を受ける_TABLE_SUFFIXを使う(複数テーブルだとunion allになる)
SELECT year FROM `bigquery-public-data.ds.gsod19*`
WHERE _TABLE_SUFFIX BETWEEN '29' and '35'
ワイルドカード テーブルを使用した複数テーブルに対するクエリ | BigQuery | Google Cloud BTWで絞らないと全結合で課金が厳しいかも
※ワイルドカード注意
dataset.product_*と書くとdataset.product_20190425だけでなくdataset.product_special_20190425にもヒットしてしまう
betweenは小さいから大きいで、パーティションのないシャーディングテーブル日付きつきテーブルでも行ける(From句のテーブルに動的な名前を使うにはこれか、EXE IMEDIATEくらいか?)
SELECT year FROM `bigquery-public-data.ds.gsod20*`
where _TABLE_FUFFIX between format_date('%y%m%d', date_sub(current_date("Asia/Tokyo"), interval 3 day))
and format_date('%y%m%d', current_date("Asia/Tokyo"))
///時間のパラメータを使う
select * from mytable_{run_time-1h|"%Y%m%d"}
実行時間run_time(UTC)から1時間引いた日→mytable_20180214
クエリのスケジューリング | BigQuery | Google Cloud///動的にテーブル名を指定してcreate table
パラメータや変数や_TABLE_FUFFIXだけでは難しい。変数はテーブル名とは解釈されない、_table_fuffixはselect分のfrom句に入れwhere句で内容を指定するがcreate分は無理、execute immediateを用いる
DECLARE t STRING;
SET t = (SELECT CONCAT('x_emp_at', FORMAT_DATE("%Y%m%d", DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY))));
EXECUTE IMMEDIATE format('CREATE OR REPLACE TABLE `%s` AS SELECT * FROM `prj.bangboo_data.x_employee`', t);
ScheduledQueryでは出力テーブルの指定が可能でテーブル指定例:table001_{run_time-1h|"%Y%m%d"}でOK、なおSQL内にはrun_timeが使用できない
//動的にSQLを作成し実行(組織レベルのメタデータを取得
DECLARE all_meta STRING;
SET all meta = (
with projects AS(
SELECT DISTINCT project_id from region-us.INFORMATION_SCHEMA.TABLE_STORAGE_BY_ORGANIZATION
WHERE project_id NOT IN ('対象外プロジェクト)
),
sql AS(
SELECT
CONCAT('select from`', project_id, "`.`region-us`.INFORMATION_SCHEMA.SCHEMATA_OPTIONS", "\nUNION DISTINCT\n') AS s FROM projects
),
concat_sql AS(
SELECT REGEXP REPLACE(STRING AGG(s, ''), '(UNIION DISTINCT+)$', '') AS concat_s
FROM sql
)
SELECT SUBSTR(concat_s, 1, LENGTH(concat_s) - 16) AS all_meta
FROM concat_sql
);
--Scheduled query化ならcreate文にする
--EXECUTE IMMEDIATE format('CREATE OR REPLACE TABLE `bq_us_all_dataset` AS %s', all meta);
EXECUTE IMMEDIATE format('%s', all_meta);
///既存のテーブルをコピー(CREATE OR REPLACE TABLEもあり)
CREATE TABLE IF NOT EXISTS bangboo_data.x_employee_copy (
`no` INT64 NOT NULL,
`name` STRING,
) as
select * from `prj.bangboo_data.x_employee`
データ定義言語ステートメントの使用 | BigQuery | Google Cloud///timestampとdatetime
datetime型カラムにはCURRENT_DATETIME()、timestamp型カラムにはCURRENT_TIMESTAMP()を使う
timestampはUTC、datetimeはローカル的で地域指定ができる
直近3分
SELECT * FROM `aaa.ds.tbl111`
WHERE `date` > DATETIME_SUB(CURRENT_DATETIME(), INTERVAL 3 MINUTE)
//stringとdate
func_approved_routine_a('2021-10-31') 引数がstring型
func_approved_routine_a("2021-10-31") 引数がdate型
///日付のキャスト
CAST(date AS STRING)
TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 1 month))
BigQueryのStandardSQLで日付(date, datetime, timestamp)を変換する方法 - 寝ても覚めてもこんぴうた (hatenablog.com)Bigqueryの日時に関係する関数全部試してみた ①Date編 - Qiita///timeで入っているものを日でサマるSQL
select
count(table_id),
sum(size_bytes),
date(record_time) as record_day
from bq_metadata
where record_time > TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 3 month))
group by record_day
order by record_day DESC
///有効期限 table expiration
データセットに対して何日間かにするか設定できる
テーブルに対し特定の日付を設定できる
何が起こる?>データセット自体は残るが中のテーブルが無くなる
///パーティション
パーティション分割テーブルの概要 | BigQuery | Google CloudBigQueryのStandardSQLで日付(date, datetime, timestamp)を変換する方法 - 寝ても覚めてもこんぴうた (hatenablog.com)パーティション分割テーブルは2種類:パーティショニングとシャーディング
●シャーディングテーブル
カラムの増減OK、スキーマとメタデータを持ち権限検証され オーバヘッド有り、ワイルドカード誤操作しやすい→保存向き
●パーティションテーブル
クエリが早い、カラムの増減に対応できない、上限4000位→利用向き
●シャーディングテーブルにパーティション設定
各シャーディングtblでパーティションを持たせる、特殊用途で通常どちらかで
TIMESTAMP 列とDATETIME列では、パーティションを時間単位、日単位、月単位、年単 位のいずれで
SQで自動的にtimestampでDAYになる、SQ実行頻度から自動設定される?
ワイルドカード誤操作 *だと_fuyou_20240401等の想定外も含むため_202*にする等の考 慮が必要
シャーディングの作り方、yyyymmではダメだった、create文でテーブル名にyyyymmddを 付ける あるいはSQのテーブル名に_{run_time-2h["%Y%m%d"}等
シャーディングはテーブルごとに権限を付与が必要で日付別なら実質無理でデータセットで権限管理が必要
クラスタリング も同時に考慮したい
事前にソートし、まとまりを作っておく仕組み。
インデックスのようにカーディナリティが高いカラムを指定してあげると列指向のため全スキャンしなくて良くなる。圧縮率も上がり 保存費用も削減できる。
WHERE で指定あるいは GROUP BY される複数列をクラスタ化列として指定するが、指定の順番が重要。
まずパーティションが考慮され、次に最初にクラスタ指定した列で行がソートされ、次にその中で2番めに指定した列でソート、次に3番目...となる
CREATE TABLE ds.tbl_cls (purchase_dt DATE, prod_id STRING, prod_name STRING)
PARTITION BY purchase dt
CLUSTER BY prod_id
1)パーティショニング
BigQueryでパーティション分割テーブルを作成する - goodbyegangsterのブログ (hatenablog.com) を見よ
パーティショニングは事前に作っておくこと
上限が4000のため最大日単位で11年、時間単位で5か月くらいでpartition_expiration_daysも指定しておく事
CREATE TABLE sample.n225 (
trading_day DATE NOT NULL OPTIONS(description="取引日"),
closing_quotation NUMERIC NOT NULL OPTIONS(description="終値"),
opening_quotation NUMERIC NOT NULL OPTIONS(description="始値"),
high NUMERIC NOT NULL OPTIONS(description="高値"),
low NUMERIC NOT NULL OPTIONS(description="低値")
)
PARTITION BY
DATE_TRUNC(trading_day, MONTH)
OPTIONS (
partition_expiration_days=1825,
require_partition_filter=true,
friendly_name="日経225時系列データ",
description="月別パーティションされた、201901から202107までの日経225時系列データ",
labels=[("environ", "dev")]
)
クエリはpartitioned byのヤツで絞れば良い
select * from aaa_history wehre
#ParticionIDで絞る(つーかpartitioned byのヤツで日付をキャストしてUTCをJST日付に
date(rec_time) = date(datetime_add(datetime "2000-10-10 00:00:00" interval -9 hour))
AND
#実際の時間で絞る、パーティションが日付区切りなので時間検索だけなら全件検索になる
datetime(rec_time) between datetime_add(datetime "2000-10-10 00:00:00" interval -9 hour)
and datetime_add(datetime "2000-10-10 00:59:59" interval -9 hour)
2)シャーディング
シャーディングは_TABLE_SUFFIXを使ったり、テーブル名にハードコーディングする。
日付のキャスト select * from `task_*` where _TABLE_SUFFIX = REPLACE(CAST(date AS STRING), '-', '')
DROP TABLE `task_*`のようにワイルドカードは削除時は使えない
大量削除は下記のようにbq cmdリストを作りBashで。(Terminal貼りつけでも可)
シャーディングはデータセット別にしてデータセットごと消すようにしたいが
Delete BigQuery tables with wildcard - Stack Overflowselect concat("bq rm -f -t ",table_schema,".", table_name, ";" )
from INSERT_YOUR_DATASET_NAME.INFORMATION_SCHEMA.TABLES
where table_name like "INSERT_YOUR_TABLE_NAME_%"
order by table_name desc
削除されたテーブルは7日以内なら復元することも可能
テーブルの管理 | BigQuery | Google CloudBQタイムトラベルで2-7日前のデータを見れる
タイムトラベルを使用した履歴データへのアクセス | BigQuery | Google Cloud ///UNNEST
UNNESTを知らないとBigQueryを使えない? | 4番は司令塔 (pep4.net)ARRAY を一組の行にフラット化するには、UNNEST 演算子を使用
SELECT id, title FROM games, UNNEST(titles) AS title
id | titles |
1 | [skyrim, fortnite] |
2 | [atvvsmx, mario] |
↓フラット化
id | title |
1 | skyrim |
1 | fortnite |
2 | atvvsmx |
2 | mario |
ただしUNNESTで指定したカラムが空の配列やNULLの場合、該当行は無くなってしまうので注意
id=3 titles=[]やid=4 titles=NULLの時はid=3,4は引っ張れないということ
select * from unnest(['aaa', 'bbb']) as baka -> rowとして2行出る
select ['aaa', 'bbb'] as baka -> 1行目に配列として全て含まれ出る
sql - How to query multiple nested fields in Bigquery? - Stack OverflowUnnestでもflattenができず空欄ができる場合、結局left join
空を含むカラムはSelectに残し、repeatedのカラムはleft joinでくっつける
VariantsをunnestしてるがPricesもrepeatedなのでleft joinのものを出している
repeatedもarrayと同じらしいが、、、cross joinやarray_to_stringもやったが駄目だった
なおrepeated以外はunnestが効かない
それでも駄目ならselect句の指定方法やwhere句で絞ると空欄が抜けたよ
select Productid,Variants.SKU,Variants.Size
,Prices.Currency,Prices.Country
from `ga-export-0000.feed.feed_dev`
,UNNEST (Variants) AS Variants
LEFT JOIN UNNEST(Variants.Prices) as Prices
///ARRAY型とSTRUCT型
Arrayは上のUnnestを参照。
Structは構造体型。順序付きで親子の構造を持つ。各フィールドはデータ型(必須)とフィールド名(オプション)を持つ。
array型 unnestできる、[]なのでarray_length()で数が取れる
struct型 unnestできる、ネストを含みスキーマでrecord型と表記される、struct型の子へは.ドットで指定す
stringでJSONはjson_extractを使う
配列との絡みでjson_query_arrayを使う、2段階くらいは関数で対処できるがそれ以上はwith句がいい
BigQueryでの複雑なJSON文字列の扱い方と注意点 - Qiita JSON functions | BigQuery | Google CloudCREATE TABLE IF NOT EXISTS `bangboo-prj.ds.x_list` (
`record_time` TIMESTAMP,
`name` ARRAY
)
INSERT INTO `bangboo-prj.ds.x_list` (`record_time`,`name`) VALUES (CURRENT_TIMESTAMP(),['a','b'])
struct型(record型)は子や孫でヒットすれば親を含めて表示されてしまう
見やすくするため*ではなく、カラムを特定すると空欄が表示されなくなり
親が出なくなり理解しやすくなる(必ずカラム指定したい)
Array=String Repeatedつまりリスト(配列)に値を入れる書式(下記で2つしか入らない)
insert into aaa (aaa) value ("['aaa','bbb']") value has STRING
insert into aaa (aaa) value (`['aaa','bbb']`) Unrecognized name: `['aaa','bbb']`
insert into aaa (aaa) value (['aaa','bbb']) OK
insert into aaa (aaa) value ('["aaa","bbb"]') value has STRING
insert into aaa (aaa) value (`["aaa","bbb"]`) Unecognized name
insert into aaa (aaa) value (["aaa","bbb"]) OK
insert into aaa (aaa) value ([`aaa`,`bbb`]) Unrecognized name
insert into aaa (aaa) value ([aaa,bbb]) Unrecognized name: aaa
insert into aaa (aaa) value ([123,456]) Value has type ARRAY
例)権限が変わっていないかの確認する等
降順で最新の日付のアイテムを見る、そして最終ページの古い日付のアイテムを見る
そしてそれらを比較する
select record_time, name, asset_type, m, b.role
from cai_iam_policy_history
,unnest(iam_policy.bindings) b
,unnest(b.members) m
where record_time between timestamp('2021-05-01') and timestamp('2021-06-30')
and b.role in ("roles/bigquery.dataViewer", "roles/bigquery/jobUser")
and m like '%ketsu@bangboo.com%'
and ancestor_path like '%ketsuproject%'
order by record_time desc
SQL解説)struct型が沢山入っていても全部unnestしfromに入れればいい
from a, unnest(iam_policy.bindings) b, unnest(b.members) m
unnest(iam_policy)はできないので2階層目から
一つ階層上ではunnest時に別名を付けて下の階層はその別名でunnest
struct型の子へは.ドットで指定すればいい、フラットでなくてもbでも取得ができる
↑
通常SQLは「表.カラム」だが「親カラム.子カラム」なので、出元がどこかテーブルを探すかスキーマ内を探すかで迷う
///json_extract, json_extract_scalar
2番目の引数はパス
BigQueryでの複雑なJSON文字列の扱い方と注意点 - Qiita標準 SQL の JSON 関数 | BigQuery | Google Cloudwith t as (
SELECT unco_data AS col_1 FROM `kuso`
WHERE date = "2021-08-04"
)
SELECT
json_extract(col_1, '$.color') as unco_color,
json_extract(col_1, '$.temperature') as temperature,
json_extract(col_1, '$.fart.times[0].stink') as first_stink,
FROM t
)
PIVOT(
MAX( IF (active IS NOT NULL, 1, 0))
FOR user IN ("a", "b")
)
↓
tool a b
------------
axe 1 0
sword 0 1
※参考にピボットテーブル
集計して行を列に変換、生ログをある単位でまとめる
生ログが「日 店 金額」の場合
↓
ピボットで「日 金額 (店1 店2 店3)」にする等で、各項目を行と列と値に配置し直す
BigQueryでPreviewになったPIVOTとUNPIVOTを試す | DevelopersIO (classmethod.jp)PIVOTの中は定数でないとだめだが、
Execute Immediate なら動的にイケる、
がGoogleSheetのConnectedSheetではサポートされておらず無理という罠
///縦持ち横持ち
pivotは集計関数を用いる、単純の入れ替えならSQLならこちら
[SQL]データの縦持ち、横持ちを入れ替える | DevelopersIO (classmethod.jp)///新旧の差分
比較したいデータの共通してい部分で外部結合をしてnull部分を探す
WITH
old_e AS (
SELECT * FROM status WHERE user IN ('a@old.com')
),
new_e AS (
SELECT * FROM status WHERE user IN ('a@new.com')
)
SELECT * FROM old_e o
FULL OUTER JOIN new_e n ON o.id = n.id AND o.date = n.date
WHERE o.id is null OR n.id is null
ORDER BY o.id, o.date
unionにexcept distinctをSQLを付けると差分になる
https://qiita.com/tatsuhiko_kawabe/items/2537c562c6d99f83e37b
SELECT * FROM item.item_table
EXCEPT DISTINCT
SELECT * FROM item.item_table WHERE user_id = 'A'
1つ目の結果から2つ目を引いたものを出す
///REGEXP_REPLACE 正規表現で文字を削除
WITH markdown AS
(SELECT "# Heading" as heading
UNION ALL
SELECT "# Another Heading" as heading)
SELECT
REGEXP_REPLACE(heading, r"^# He", "") AS html
FROM markdown;
標準 SQL の文字列関数 | BigQuery | Google Cloud///スラッシュで分割するとarrayになるのでオフセットで取得
select SPLIT(path, "/")[OFFSET(3)] from www
スラッシュの最後を取る
ARRAY_REVERSE(SPLIT(aaa, "/"))[SAFE_OFFSET(0)]
///Job kill
CALL BQ.JOBS.CANCEL('job_id')
CALL BQ.JOBS.CANCEL('project_id.job_id')
job idでエラー詳細を確認
bq show -j
bq show --project_id bangboo_sandbox --format json -j bqjobidxxxxxxxxxx | jp .
job idはコンソールのBQのジョブ詳細やスクリプトキックならロギングから見つけてもいい
クエリならjob/query historyでわかるがbq cmdでもエラーが返る
bq query --nouse_legacy_sql 'select ketsu from `prj`.oshi.ri'
unrecognized name: 'kusofuke@ketsu.com' at [1:149]
select * from prj.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
where job_id ="aaaaa" and creation_time > "2022-01-01"
ジョブIDの取得
SELECT
project_id,
job_id,
user_email,
creation_time,
start_time,
--query,
total_slot_ms
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
--`region-us`.INFORMATION_SCHEMA.JOBS_BY_USER
--`region-us`.INFORMATION_SCHEMA.JOBS_BY_FOLDER
--`region-us`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
WHERE state != "DONE"
--state = "RUNNING"
--state = "PENDING"
AND user_email = 'my@email.com'
AND project_id = 'paa'
AND start_time < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 3 MINUTE)
AND total_slot_ms > (1000 * 30)
AND PARTITIONDATE BETWEEN '2021-01-01' AND '2021-01-02'
--PARTITIONTIME BETWEEN TIMESTAMP('2021-01-01') AND TIMESTAMP('2021-01-02')
///upsert(アップデートか新規インサート
https://swfz.hatenablog.com/entry/2021/02/08/195024
MERGE aaa target USING tmptbl src
ON target.time = src.time
WHEN MATCHED AND src.satus = 'rejected' THEN
DELETE
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED THEN
INSERT ROW
///window関数
集約関数(GROUP BY)だと個別データは出力されず集計データだけでるが
window関数だと集計データが個別データにouter joinされた形で出力される
SELECT
deptname,
id,
salary,
AVG(salary) OVER (PARTITION BY deptname)
FROM emp;
deptname | id | salary | avg_salary
-----------+-------+--------+-------------
dev | 11 | 5200 | 5020
dev | 7 | 4200 | 5020
dev | 9 | 4500 | 5020
dev | 8 | 6000 | 5020
dev | 10 | 5200 | 5020
hr | 5 | 3500 | 3700
hr | 2 | 3900 | 3700
sales | 3 | 4800 | 4866
sales | 1 | 5000 | 4866
sales | 4 | 4800 | 4866
deptnameでグループしそのsalaryの集計のAVGが出ている
下のようにover()が空でも良い、4900は大体
SELECT
deptname,
id,
salary,
AVG(salary) OVER () AS avg
FROM emp;
deptname | id | salary | avg
-----------+-------+--------+-------------
dev | 11 | 5200 | 4900
dev | 7 | 4200 | 4900
dev | 9 | 4500 | 4900
dev | 8 | 6000 | 4900
dev | 10 | 5200 | 4900
hr | 5 | 3500 | 4900
hr | 2 | 3900 | 4900
sales | 3 | 4800 | 4900
sales | 1 | 5000 | 4900
sales | 4 | 4800 | 4900
関数としては集計関数がそのまま使えるようだ
OVERはwindow関数を使う宣言、OVERの後にどのようにwindowを作るのかを定義
PARTITIONでwindowでつまりどの範囲でグループを作るか指定
AVG(salary) OVER (PARTITION BY deptname, sub_deptname) でサブデプト単位での平均となる
///誰が実行しているかをセッションユーザで出す
標準 SQL のセキュリティ関数 | BigQuery | Google CloudSELECT SESSION_USER() as user;
+----------------------+
| user |
+----------------------+
| jdoe@example.com |
+----------------------+
///エラーハンドリング
BQのクエリ内の条件によりerror()でエラーが吐ける
///プログラムで使う
from google.cloud import bigquery
client = bigquery.Client()
QUERY = ('SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`')
query_job = client.query(QUERY)
rows = query_job.result()
for row in rows:
print(row.name)
///Pythonも含めトランザクション
/// BANGBOO BLOG /// - GCP script///承認済みビュー authorized view
authorized viewを設定するとそのviewを対象とする権限だけ必要で権限をさかのぼり付与しなくていい(通常のviewは参照元の権限も必要)
この権限移譲は閲覧権限のみで編集権限等は含まない
被参照の元テーブル側に許可するview名を設定する
参照権限は緩くなるが、編集権限は厳しくなる(設定するビューは変更しない前提で承認する形)
authorized viewを付与すると玄関となったビューはdataEditorではビュー更新ができなくなる
玄関ビューにも、ソーステーブルにもEditor権限が必要
基本の安全策はauthorized view設定を外す>ビュー変更>AV再設定がいい
対象のauthorized viewは管理者を立て一元管理するのが良さそう
(テーブルやビューを作って権限付与してバッチだとdata ownerが必要なのは注意)
■saturationの場合、詰まっている、サチっている
対象にクエリを発行 select 1
同プロジェクトの他のテーブルにクエリを発行 select 1
別プロジェクトから対象にクエリを発行 select 1
reservationsのoverviewを見る
対象のSQLを発行
別のプロジェクトで同SQLを発行
時間を比べる
Google側の問題と思われるときはGoogleのサポートへGo
Google Could Status
Google Cloud Status DashboardINFORMATION_SCHEMA < Audit log で調査
メタデータ(データに対するデータ)
システムメタデータ(作成更新日時、サイズ、誰いつ参照
ビジネスメタデータ(オーナ、更新頻度、カラムの意味
select * from prj.ds.INFORMATON_SCHEMA.TABLES
select * from prj.ds.INFORMATON_SCHEMA.PARTITIONS
longterm storageでサイズが100000b以上で、更新日が1か月以上とか出せる
select * from prj.ds.INFORMATON_SCHEMA.COLUMNS where column_name like '%kuso%'
select * from prj.ds.INFORMATON_SCHEMA.VIEWS where view_definition like '%kuso_table%'
view_definitionはSQL文が入っている
select * from prj.ds.INFORMATON_SCHEMA.JOBS_BY_(USER / PROJECT / ORGANIZATION)
誰アクセス/誰作った/何Job等も分かる、180日しか出せないが
roles.bigquery.resourceViewerが必要
カラム例:user_email、query、referenced_tables
Auditlogは プロジェクト間で使用されるBQでも情報が取れる
info_schemaのjobs_byとほぼ同じ内容が取れるがよりリッチ
利用ユーザ数、旧データを見ている人、権限変更操作ログ等
SELECT `b-sandbox`.test_ds.count_row(1); で実行できる
UDFやテーブル関数のルーティンを承認しておくと誰からでも使える(ビューと違い権限管理できずセキュリティがズブズブになると思われ)
target_prj.trg_dsに受け入れる関数を共有指定する形
UDFは戻り値がある、テーブル関数は副問い合わせとして使う形か
///ScheduledQueryの実行者
コンソールの場合:コンソール操作者
Terraformの場合:Terraform実行者
bqコマンドの場合:任意に設定ができる
サービスアカウントをbqコマンドでSQ実行者として登録する場合、通常は問題がないがスプレッドシートを使用するなら@プロジェクト名.iam.gserviceaccount.com等でアクセス権が必要なため、会社のポリシーによってはうまく行かない。batch@unco.comのような共通メールを作成し使用したい。(GWS側でOUを使いTrusted ruleによりSAにGoogleDriveへアクセス許可すると問題回避できるが:OUをつくりそのOU内で専用共有ドライブを作成し設定する)
サービスアカウントにScheduleQueryを実行させる設定に必要な権限
https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja
操作者
BQ job user
BQ transfers.get/update
BQ data viewer/editor
●iam ServiceAccountUser(対象SA、PRJレベルでも良いが)
サービスアカウント
BQ job user
BQ transfer
BQ data viewer/editor
Scheduled queryからの保存先
コンソールだと同じプロジェクト内だが、create文を自由記載ならどこでもOK
job userは同じプロジェクトの権限が必要
設定者一覧を出したい場合
bq --format=json --project_id=bangboo-oketsu ls --transfer_config --transfer_location=us | jq.[].name
bq --format=json show --transfer_config project/1111111/locations/us/tranferConfigs/111111 | jq .ownerInfo.email
■BQ transfer(クエリが不要なBQ連携、3rd partyもあり)
データセットコピー、GCSファイル
Ama S3, Azure storage, Oracle, Salesforce, Ads系等々
■Cloud SQLにBQからクエリ
SELECT * FROM EXTERNAL_QUERY("connection_name", "SELECT * FROM db.tbl")
https://zenn.dev/ykdev/articles/4a4d2fbc6b4fe1
■BQ DMLクォータ超過
割とSQLだとすぐに壁にあたる
上限がテーブル単位のためテーブル名を分けると回避できるらしい
BQ streaming insert->BQ storage read/write APIの上限はDMLと別で、閾値が大きい
APIだとProtocol buffersが必要で、Date/Timestampが対応しておらず
Unixエポックからの日数/秒数への変換が必要、、、
■SQLはカラム数の増加数で構成考える?
left outer joinはカラム数がカラム数の合計から共通のjoin onのカラム数を引いた数(行数はleftに同じ)
full outer join はカラム数がカラム数の合計から共通のjoin onのカラム数を引いた数(行数はleftの要素数にrightの要素数を合計したもの)
unionは重複を除外し表を足し合わせるため行数が両表の合計行数(カラム数は合致必要でカラム数は変わらない)
unian allは重複を除外せず表を足し合わせるため行数が両表の合計行数(カラム数は合致必要でカラム数は変わらない)
cross joinはカラム数が両表のカラム数の合計、行数は両表の行数の掛け算
再帰的にSQL処理はcross joinし条件を付けるか?
■課金
クエリ課金:使用しているプロジェクトで課金される、データの置き場所ではない
定額フラット:$2000/100slot/m(全プロジェクトでスロットを共有)、オンデマンド:$5/T=2Gスキャンで1円位
flat rateでもflex slotsとして時間帯によりスロットを増やす等ができる
Editionsに変更になった:組織に5プロジェクト等しかreservationを置けない、その中で限りなく設定ができる
課金を減らすには:カラムを減らす、パーティショニング
プレビューを活用:しかしビューだとプレビュー機能はない。列が501列以上あったら501列以降はプレビュー出ない
データ保管課金:データ量
$1/50G/m
active storageからlong term storageへの移行は自動(90日変更がない、50%off)
6,000スロットを使うBigQueryのリソース配分最適化への挑戦 (plaid.co.jp)■権限
事前定義ロールと権限 | BigQuery | Google Cloudjob user:select文クエリ実行だけでもジョブでjob userとdata viewerが要る(data viewerだけでは不足)
課金プロジェクトでjob userを持ち、参照先プロジェクトでdata viewerを持つという権限構成だから
例えばjob userがなくdata ownerだけの場合はデータセットやテーブルやビューの削除作成ができるが、データロードやselect文発行はできない
IAMかデータセット/tblに必要な権限を付与する
data editorでも自分で作成したものは自分がOwnerになり削除や変更権限がある
meta data viewerならDSとテーブル一覧、テーブルのスキーマや容量等の情報が見れデータは見れない
これを広く付けておくとデータ管理が楽
■サービスアカウントに対するBQ job user
コンソールであれば画面左上の請求先プロジェクトで切り替えができるが
スクリプトであればgcloud auth login時に切り替える
gceならインスタンスにSA設定するが
請求先プロジェクトのデフォルトはインスタンスの置いている/SAが作成されたPrj
※同プロジェクトからしか選択ができない
コード上で切り替えができる
bq --project_id=xxx query 'select count(*) from ds.tbl'
■BigQueryの列レベル・行レベルのセキュリティ
BQ画面>左ナビのポリシータグ
ポリシータグを作成(組織単位で一括一覧表示)
タグは階層化できるので、全ユーザタグ>管理者タグ>社長タグ
スキーマ>Addポリシータグ
タグが付いていればプレビューで見れない
select * except(tag_column)にする必要がある
メタデータは見れる(カラム名、型
ポリシータグ画面>対象ポリシー選択>情報パネルで権限者一覧
fine-grained readerを付与するとselect *ができるようになる
社長タグに社長だけ権限付ける等
※APIを有効にし、ポリシーを有効にする必要がある
$ python
>>> import sys
>>> sys.path
でパス一覧が出るので探すと分かる >>> exit()でpythonコマンド終了
例えば Cloud functionsなら requrements.txtに google-api-python-client==3.3.2と記載し
PyPI · The Python Package Index でバージョンを探す
コードに from google.cloud import bigqueryと宣言する
requirementがpipインスコ
import フォルダ.ファイル名
from フォルダ.ファイル名 import *
上下同じだが、fromは一部を指定し直接使うという意、*は非推奨
つまり
import hello なら下記とする必要があるが
print(hello.hello)
from hello import hello なら省略ができ下記で良い
print(hello)
from フォルダ名 の場合
そのフォルダ名の中に __init__.pyがあれば其れ
from .xxx import aaa の.の意味は?
mainに対するモジュールから見て相対で隣
モジュール検索パスを出す
from pprint import pprint
import sys
pprint(sys.path)
■pipインスコ
PyPIでサードパーティライブラリを管理していてインスコ可
setup.pyが含まれたローカルディレクトリも指定しインスコ可
eオプションで編集可能な状態でインスコ
--userで~/.local下の管理権限不要なユーザディレクトリ以下でシステムが汚れない
--userなしで/usr下にインスコ
pip install --user -e unko
pip3 install pipenv
pyenv install --list インストールできるもの
pyenv install 3.8.8 指定verをインスコ
pyenv global 3.8.8 デフォルトに指定
.python-versionファイルをGITに載せ管理したい?
pipenvはPipfileとPipfile.lockを利用しpipでrequrements.txtを用いるよりも強力
PipfileとPipfile.lockとrequirementsをGITに載せ管理したい?
pipenv --python 3.8.8 など最初にpyバージョンをpipfileに記載
pipenv install "google-cloud-tasks==1.5.0" バージョン無しでも有りでも入れられる
Pipfileを書き換える方法
[packages]
google-cloud-tasks = "==1.5.0"
protobuf = "*"
そして下記cmdでインスコ
pipenv install PipefileからインストールしPipefile.lockを更新
pipenv sync Pipfile.lockの最新を取得し環境更新(Pipefileは使わない)
pipenv shell 仮想環境を起動
pipenv run python main.py
他に
pipenv uninstall google-cloud-tasks アンインスコ
Pipfile, Pipfile.lockがあれば pip syncでOKだがrequirements.txtも使える
pipenv lock -r > requirements.txt 生成
pipenv install -r requirements.txt
pipenvのバージョンが古いと依存関係、Ver整合性で問題が起きやすい
pipenv --version
pip install pipenv
pipenv update
pipenv upgrade <パケ>でやり直す
■assertでテスト
assert文は組み込み定数__debug__がTrueの時のみ実行されます
実行コマンドにオプションに-Oをつけると__debug__がFalseになりassert文が無効に
def func_so(a, b):
c = a * b
return
def test():
assert(func_so(1,2) == 2)
if __name__ == "__main__":
test()
main()
■個別
import dataclasses
import datetime
pip install pyyaml > import yaml
pip install requests > import requests
Python + VSCode の環境構築 20240604 (zenn.dev)↓本家
/// BANGBOO BLOG /// - Python
おッPythonやるのか?
ファイル拡張子oppython.py デフォUTF-8、全部オブジェクト(list,dict,set等のミュータブルなら参照になる点に注意、必要ならcopy())
#コメント、ドキュメントストリング(三連引用符):"""そのまま表示""" print mymod.__doc__で見れる
変数型不要:p = 500 * num、でもキャストは必要、定数はない
文字繰り返し、キャスト:"文字列" * 4 + str(p) + "Hi\nお元気ですか?\nSee u"
raw文字列でescしない:print(r"インストール先は c:\\code\python\bin です")
正規表現のrも同意 re_result = re.match('hel', r'hellow python, 123, end.' )
if re_result: #None以外という意味で、Noneはいわゆるnull、Pythonにnullはない
文字数:len("東京都")→3
文字列[開始:終了]→→ str = "Flower" print(str[1:4]) → low
文字列 % (値1, 値2, ...)→→ num= "10進数では %d 、16進数では %x " % (num, num)
"xxxx{index:書式指定子}xxxx".format(値)→→ "名は{:<8s}で年は{:>3d}で".format(name, age)
f"xxxx{値:書式指定子}xxxx"→→ f"名は{name:<8s}で年は{age:>3d}で"
0/空の文字列''/値なしはfalse、Noneは? x = None x is None→→true?
//→除算切り捨てし整数、**→べき乗
関数宣言はdef kansu(): で中で宣言する変数はローカル変数
関数外で宣言された変数はグローバル変数でどの関数の中でも扱えるようになる
なお関数内でもglobal henでグローバル変数を宣言できる
Pythonでのグローバル(global)変数の宣言方法 | UX MILK返り値複数はcsvでタプルになる、リストが楽か? return a,b → (a, b) あるいは return [a, b] → [a, b]
def func(a, b):
return a, b
result = func()
result[0]がa、result[1]がb
try/exceptを関数内で設定することも、逆に関数呼び出し時にも使用ができる、else, finally, raiseも使う、エラーが出ても止めたくない場合は try-except Exceptions as e、逆にexceptを入れなければ止まるので安全
try:
get_all_transfer(project_id)
excerpt Exception as e:
print(e)
置換は左辺が要る?要る a = a.replace('x','')
とほほのPython入門 - リスト・タプル・辞書 - とほほのWWW入門 (tohoho-web.com)Pythonの辞書とリストとクラス 複数情報の受け渡し|みはみ|noteリストa=[1,2,3]はmap(), filter(), reduce()等が使える
a=a.append()とかa=a.extend()は値がないんで駄目、単純にappend(b)やextend(b)で左辺不要
取得:a[0]、for v in a:
リストの合体:list_a += list_b
セット型set={1,2,3}は重複や順序や添字の無いリスト、set(list)でキャストし重複を無くせる、ミュータブルは格納できない
取得 for v in a:
tuple→タプルは定数リスト、更新無しならリストより速い a = 1,2,3 a = (1, 2, 3)
取得:a[0]、for num in a:
dict→辞書は連想配列みたいな{a:1,b:2}はitems(), keys(), valus(), iteritems(), get()を使える
Python | 辞書に含まれるすべてのキーと値を取得する (javadrive.jp) 取得:dict_a['key1']、for k in dict_a.keys(): for v in dict_a.values(): for k, v in dict_a.items():
dictの合体:dict_a.update(dict_b)
クラス→例えば●●クラスを宣言しsampleインスタンスを生成し、getter/setterで変数に入れて置く
取得:sample.key
BigQuery→別名を付ければ名前で取得できるが、インデックスでも取得できる(これ何?)
取得:for row in query_job: →row[0], row["t"]
lambdaは無名関数?
str_w = input('何か入力してください-->') #入力させた値を取れるが数字もstr
__iter__()はnext()を持つオブジェクトを返し、next()は次の要素を返し、最後に達するとStopIteration例外を返す?
yield はイテレータを返すジェネレータを定義?
@デコレータは関数を実行する前後に特殊な処理を実行したい場合?
withで終了処理を指定できる、ファイル読込とその後の処理とか
assertや__debug__はテストで機体通りかを確認する?
passは中身の無い関数やクラスを作成しkara.p=1で粋なり属性追加等ができる
execは引数の文字列をPythonとして実行 exec "print 'Hello'"
delはオブジェクトを削除 del x, y, z
継承やオーバーライド class MyClass2(MyClass):
多重継承class MyClassC(MyClassA, MyClassB): で纏めて使えるようになる
class MyClass:
"""A simple example class""" # 三重クォートによるコメント
def __init__(self): # コンストラクタ
self.name = ""
def __del__(self): #インスタンスが消滅する際に呼出でコンストラクタ
print "DEL!"
def __str__(self): #文字列化
return "My name is " + self.name
def getName(self): # getName()メソッド
return self.name
def setName(self, name): # setName()メソッド
self.name = name
class MyClass2(MyClass):
def world(self):
print "World"
class MyClass3(MyClass):
def hello(self): # 親クラスのhello()メソッドをオーバーライド
print "HELLO"
a = MyClass() # クラスのインスタンスを生成
a.setName("Tanaka") # setName()メソッドをコール
print a.getName() # getName()メソッドをコール
print a #=> My name is Tanaka 文字列化
b = MyClass2() #継承
b.hello() #=> Hello
b.world() #=> World
c = MyClass3() #オーバーライド
c.hello() #=> HELLO
super()を使ってオーバーライドする
super()は基底クラスのメソッドを継承した上で処理を拡張
super().__init__(x、y)が使える
if __name__ == "__main__":
モジュール時の勝手実行を抑える
import helloの時hello.py 内部での __name__ は "hello"
python hello.pyのような実行時hello.py の内部の __name__ は "__main__"
from math import pi, radians→mathモジュールから特定のオブジェクト(関数/変数/クラス)をimpo(math.piみたいに書かず省略できる)
import urllib.error→urllibパッケージからerrorモジュールをimpo、パッケージはフォルダ
import numpy as np→別名でしか使えなくなるnp.array()とかで
モジュール=ファイル名.pyでファイルをimpoしている
from {another_file} import {ClassName}
another_file.pyがファイル名
class ClassNameがクラス名
from {パッケージ:ディレクトリ} import {モジュール:ファイル}
ちゅー書き方もできるらしいが、どっち?
impo順:標準ライブラリ>サードパーティライブラリ>ローカルライブラリ(自作のライブラリ)
関数や変数:小文字スネークケース(sample_func)
クラス名、例外、型変数:キャピタルパスカルケース(SampleClass)
定数名:大文字アンダースコア区切り(SAMPLE_CONST)
モジュール名:小文字(samplemodule, sample_module)
パッケージ(フォルダ)名:小文字。アンダースコア非推奨(samplepackage)
インデントは半角スペース4つ
1行半角で79文字以内
トップレベルの関数やクラスは2行開ける
デバッグの方法案
print(type(v)) でどんなメソッドを持っているか等を探る
print(v) をコマンド前後や流れで沢山仕込みでどこでエラーが出ているか探す
print("creds:")
print(creds)
print("type(creds:")
print(type(creds))
print("vars(creds:")
print(vars(creds))
print("creds.keys():")
print(creds.keys())
print("dir(creds):")
print(dir(creds))
print("creds._dict_:")
print(creds.__dict__)
is not subscriptableのエラー 添字不可エラーでリストでないのにリストとして入れようとしている
※参照になりコピーされない、必要ならコピー(値を入れた時点で参照が外れるので実際問題少ない?)
a = []
b = a
b.append(1)
print(a) #[1]
https://qiita.com/ponnhide/items/cda0f3f7ac88262eb31e
https://nishiohirokazu.hatenadiary.org/entry/20120125/1327461670
環境変数を扱う
import os
print(os.environ["HOME"]) ホームディレクトリ、LANGでja_JP.UTF-8とか
os.environ["PHASE"] = "staging" 環境変数に代入できるのは文字列だけ
del os.environ["PHASE"] 削除
コマンドラインの引数を扱う
python3 sys_arg_test.py a 100
dst_prj = sys.argv[1] (aが入っている)
sys.argv (['sys_arg_test.py','a','100']
i = 0
v = "["
for s in list_v:
i += 1
if i > 1:
v += ","
v += "'" + s + "'"
v += "]"
SQL = "insert into aaa (aaa) value ({v})"
※テキスト選択
Shift↑or↓ で行全体
home(+fn)で行頭、end(+fn)で行末移動
【基礎一覧】Pythonの基本文法を全て解説してみた!【初心者】 (suwaru.tokyo)Python基本文法まとめ - QiitaとほほのPython入門 - とほほのWWW入門 (tohoho-web.com) Python入門 ~Pythonのインストール方法やPythonを使ったプログラミングの方法について解説します~ | Let'sプログラミング (javadrive.jp)Welcome to Python.orgHTMLの中に少し埋め込めず、基本的にプログラムの中にHTMLを埋め込む:CGI(Perl然)
さくらインターネットでPython CGI (mwsoft.jp)WSGI
Python で WSGI (Web Server Gateway Interface) に従ったシンプルな Web サーバで Hello World - QiitaPython用Webサイト用途フレームワーク:Flask(軽量)、Django
WSGI について — Webアプリケーションフレームワークの作り方 in Python (c-bata.link) GCPでどう使うかは不明だがホスティングは↓
ウェブ ホスティング | Google Cloud 静的ウェブサイトのホスティング | Cloud Storage | Google Cloudstr.split() 区切り文字で分割しリスト等に入れる
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数) | note.nkmk.meprint('Sam' in 'I am Sam') # True 任意の文字列を含むか判定: in演算子
Pythonで文字列を検索(〜を含むか判定、位置取得、カウント) | note.nkmk.me==============
ここで動かせるgoogle colaboratory→
Colaboratory へようこそ - Colaboratory (google.com)半角スペース2個で改行
#の数で見出し
*で箇条書き
数字と.で番号を振る、- でリスト
* or - or _ を3つ以上で水平線
[ ]でチェックボックス、[x]でチェック
| td | td | td |でテーブル
**aaa**で太字、*aaa*で斜体
~~aaa~~で打消し線
[タイトル](URL)でリンク
```でコードの挿入、`でインライン挿入
> or >> で引用
[^1]で注釈
\バックスラッシュでマークダウンのエスケープ
==============
宗教論争(事実は同じでも他人の認知は違うので意味なし
if self.flag_ok == 1 and self.mode == '1'
↓一見で分からんなら変数名を工夫してこうやんな
if self.file_verify_completed and self.mode == GRANT_PERMISSION:
マジックナンバーを使わない(数字の方が曖昧性が無い場合も)
STATUS_ERROR = -1
STATUS_SUCCESS = 0
self.status_error = STATUS_SUCCESS
with構文で処理の前後でコンテキストマネジャ__enter__、__exit__が使われる
__enter__メソッドで事前処理
__exit__メソッドで事後処理
with ファイル操作や通信などの開始時の前処理と終了時の後処理など必須となる処理を自動で実行
try/finallyみたいなもの、最初と最後に何かしてくれる
class a(object):
def_enter_(self):
print 'sss'
return 'sss111'
def_exit__(self, type, value, traceback):
print 'ok'
return False
with a() as s:
print s
sss
sss111
ok
初期値をエラー値にし、業務判定エラーでステータスを設定したらreturnで抜ける
def exFunction(self):
self.status_error = STATUS_ERROR
try:
if XX = AAA:
self.status_error = STATUS_XX_ERROR
retrun
self.status_error = STATUS_SUCCESS
retrun
except:
~エラー処理、ステータスは変更しない
エラーメッセのハードコーディングを避ける方法(ハードが場所と内容が分かり易いかも)
MSG_ERROR_OLD_EMAIL = "Error: 旧メール%sです\n"
e_message_list.append(MSG_ERROR_OLD_EMAIL % (old_email))
self.error_message = '\n'.join(e_message_list)
ケチって分厚い本1冊にしたが全然進まぬ、薄い奴星e、?チッPython、誰がJSONじゃ~い、チェーンソー魔わすっぞ
続編、、モジュールとかmportとか、
/// BANGBOO BLOG /// - Python Python
群雄割拠か弱肉強食か政治解決か遣りたい放題の中、当事者なら自然に身につくだろうが時代に参加していない貴殿には到底分からない、シルバーブレットはなく結局は愚直しかない、どう愚直になるか/どう立ち回るかを発見するのがフレームワークだ、もしトレンドを感じればそれに乗ればよい、他にシーズがあればプロダクトアウト、ニーズがあればマーケットインだ
■フレームワーク
3C(Customer/Competitor/Company:自社)
SWOT(Strength-Weakness x Opportunity-Threat)
PEST分析(Politics/Economy/Society/Technology)
3M(人物金、Men/Material/Money)
3M(ムリ:負荷が人に掛かる/ムダ:資源が余り浪費しコスト高/ムラ:負荷と浪費が交互)
7S(<3sはハード>Structure/Strategy/System、<4sはソフト>Shared value:価値観/Skill/Staff/Style:文化)
VRIO(Value/Rarity/Inimitability:模範困難性/Organization)
MVV(Mission:使命why/Vision:将来像what/Value:価値観how)
マーケ4P4C(4p:product/price/place/promotion, 4c:customer cost/customer cost/convenience/communication)
QCD(Quarity品質/Costコスト/Delivery納期)
ポーターの5forces(Competitive Rivalry:競争企業間の敵対関係/Supplier Power:売り手の交渉力/Buyer Power:買い手=顧客の交渉力/Threat of Substitution:代替品の脅威/Threat of New Entry:新規参入業者の脅威)
コトラーのSTP(segmentation:顧客やニーズや特性等で細分化/targeting:セグメ選択/positioning:勝てる位置取り)
競争戦略ポジショニング (コストや差別化や集中戦略等で業界ポジを練る)
PPM:product portfolio mgt(市場成長率xシェア->問題児:花形に育てる/花形:継続投資/金のなる木:投資無し/負け犬:撤退検討)
製品ライフサイクル:PLC(導入期:認知度と需要up/成長期:製品多角化販路拡大/成熟期:差別化とコストダウン/衰退期:選択と集中効率化)
イノベータ理論(Innovators/Early Adopters/Early Majority/Late Majority/Laggards:16%キャズム:段階で戦略を変えていく)
RFM(recency/frequency/monetary->優良顧客を見つけよりマーケ)
ポーターのバリューチェーン(企画/開発/購買/製造/物流/販売/サービス/人事の各々での価値->VRIOで分析)
アンゾフの成長マトリクス(既存市場浸透:既存市場x既存商品/新市場開拓:新規市場x既存商品/新商品開発:既存市場x新規商品/多角化:新規市場x新規商品)
TOWS(クロスSWOT分析:SWOTをSWOTする->SWOTで現状分析、さらにSWOTで戦略化)
SCAMPER(アイデアの展開->substitute代用/combine結合/adapt応用/modify修正-magnify拡大/put to other uses転用/elininate削除-minify削減/reverse逆転-rearrange再編集)
ECRS:イクルス(改善策->排除/統合/交換/簡素)
ギャップ分析(As Is/To Be<-間にaction)
特性要因図:フィッシュボーンチャート(要因を網羅的に調べる、他にも親和図法やマインドマップ)
意思決定マトリックス(縦軸に候補、評価基準を横軸、評価基準に重みをつけて点を出し、合計の総合点で判断)
CS/CE分析(Customer satisfaction/Customer expectation->各機能のcsをceに合わせる、ce高cs低の改善)
リスク評価マップ(インパクトx不確実性、インパクト大に対処し小は静観、不確実性が高いと注意が必要<-pest/5f)
ユダヤの商法:78対22の法則で上手くいく、契約主義で約束を守る
ケイパビリティ戦略:ビジネスプロセスを能力化、スピード/整合性/明瞭性/俊敏性/革新性が上がる、CEOがツールや組織を検討
ポジショニング戦略:競合との位置付け、STP分析をしどうポジションを取り差別化するか
タイムベース競争戦略:時間こそが希少資源、スピードが一番顧客満足が高い、数稼ぐ
アダプティブ型戦略:多くの新しいアプローチを試し最も有望なものを拡大展開、PDCA、やらな分からん時代
ランチェスターの法則:
奇襲/武器/集中、逆にシェアトップで武器も兵数あると模倣し広域戦
自分を知る、競合を知る、シェア1位を知る
地域限定、顧客志向営業、販路、陽動奇襲の企画、強みに集中
■逆転の競争戦略
競合の弱みを攻撃するのがセオリーだったが、イノベーションのジレンマでひっくり返す(客の意見を聞きすぎると安い慣れた商品を求められるが自ら革新を進め避けるべき、サンクコストや業界しがらみを乗り越えるべき)
業界破壊者(枠を壊す)/侵入者(他業種からの参入)/挑戦者(競合が攻撃)がトップシェア企業を脅かす
1)企業資産の負債化=リーダーが持つ競争優位の源泉を攻めリーダーが蓄積してきた優位な経営資源を価値のないものにし負債にしてしまう戦略:モスは店内で調理しマックより優位に、あるいは逆にセントラルキッチン
2)市場資産の負債化=リーダー企業に有利に働いていた競争のルールを変更し、顧客が持つ資産(ソフトウェア、交換部品など)を使えなくする戦略:VISAよりQRのPaypay
3)論理の自縛化=安易に追随するとリーダー企業が発信してきたメッセージと矛盾することになり、企業イメージを低下させてしまう戦略:手作り丁寧より100均
4)事業の共喰化=リーダー企業が強みとしてきた製品・サービスと共喰い関係にあるような製品・サービスを市場に出すことで、リーダー企業内に追随するか否かの不協和音を引き起こす戦略:カーシェア
ランチェスター戦略、マイケルポーター競争優位の戦略
ーーーーーーーーーーーーーーーーーーーーーーーーーー
■現代思想
ニーチェ:ルサンチマン、奴隷道徳<>快と力の高揚感が生を肯定、ニヒリズム
マルクス:神格化、砂漠の水を都市で売ろう、紙一枚が命より大事…社会的関係の錯覚
フロイト:無意識<>理性、理性は単なるハリボテであり無意識が主人で自律神経も管理
エス(快楽主義)>自我:Ego(調整役)>超自我:Super ego(親/社会/会社の価値観の同一化)
親や社会等から裏切られると同一化できずトラウマ、葛藤を無意識化に隠したい
ユング:Collective unconscious(人類は人種に限らず同じ記憶を持っている)
ーーーーーーーーーーーーーーーーーーーーーーーーーー
■リーダーシップで面白いほど結果が出る本
(仕事の種類)リーダシップ分類:指示/率先/構想/合意/育成/関係構築
リーダシップ→変化、コントロール→維持(基本どちらもPDCA)
若手に新しい変化のリーダシップが期待されている
(担当)鷹の眼と蟻の眼(大きな視点の戦略+現場の改善)
(頭脳)1)構想力、2)推進力、3)育成力
→アイデア発表、ダメ出し、頼りにされる
1)構想力:戦略をゲームとして導入する、仕事の意味を伝える、今を楽しむフロー没入
2)推進力:手段の目的化を防ぐダメ出し、メンバーに寄り添う:会話の時間が足りない、現場のアイデアや成功事例を吸い出し
3)育成力:個々人の心のベクトルを少しプラスに、共通言語の定着(これがないと心の障壁や違和感)
(発想は言葉から、リーダは言葉が大事)
ーーーーーーーーーーーーーーーーーーーーーーーーーー
JCOM回線不安定:
インターネット回線の信号レベルはタブレットで通信でモデムに入って測れる
宅外でモデムを繋いででも宅外で調査しろ
同時接続数等々でスロットリングしているだろうが
「今年2021年は間違いなく株価が暴落する」との見出し→日経が下がらない場合は「予想が外れたとして私の株価が下がるため間違いはない」のだと
個人的にはAIもデータも信じていない、やっぱりデカい絵より個の可能性が良いという勘、アフターコロナ操り人形ではないぞと人々はなるか
https://note.com/naoto111/n/nebd8adf8e69e
産業革命の蒸気機関から電力を前提としたビジネスの間には大きな飛躍、機械からソフトウェアへのパラダイムシフト。ルーティンを変えたいが、いちど内面化された規範は取り出して再評価することが非常に難しくルーティンを受益者側が認知し、改善することはとてもむずかしい人の問題
■アフターデジタル2 UXと自由
Line payとか決済の感じを言っている、キックボードな感じではなかった
決済>サービサー>メーカ のヒエラルキーに
Line pay、Pay2、dとかが総合サービスとなりメーカを操る
取得したデータがユーザに価値を与える、UXとして還元、不義理しない責任があると中国
顧客を知るデータ(UX->data->AI)→体験型サービス(世界観、コア体験)
高頻度接点>成長シナリオ>体験を自動化するシステム(リコメンド、VIP)
属性データは終わり行動データ→状況ターゲティング
┣タイミング(ライフタイム、刹那)
┗好きと思われるもの
AI(行動パターンのセグメント、仮説の結果分析とか)
UX品質:スタンダード(便利か、楽か、使いやすいか、楽しいか)
バリュージャーニー(アプリ、店舗、イベント、コールセンター)の各接点のコンセプトで顧客支援→ファン化
デジタル接点をメインにリアルをツール的に使う、丸井は売らない店舗
コスト削減(流通、マーケ、金融、インフラ)
UXの改善、新しいUX→DX(ペインポイントから未来を創る)
日本はホワイトリスト、中国米国はブラックリスト、日本はグレーは黒とされ許されない、中国はグレーは黒ではない(日本は成文法、米国は判例主義との考えもある)
スタバは固執せずにデリをし新しい形でブランディングをした、発想の転換
逆にオフラインの方が新規獲得コストが安く逆転が見られる、自販機出すとか
会社の歴史のDNAを引き継ぐ(重要人物を巻き込む)
ダメ:市場にすでに代替がある、商品起点でユーザ起点でない、社内政治でユーザ視点でない
スターバックスラテwithハニーホイップ venti、量が多く後からガンガン冴えて寝れん、スタバは店が温かくてベンティで3時間はイケるがグランデから2shotらしいのでトール一択では、ガストの大盛ポテトと赤ワインx2とどっちが体験が良いか:両方いいな
スタバ丼(写真で2つ映ってたらhot/iceだが1つならどっちか)
ラテ/ムースフォームラテ/カプチーノ/アーモンドラテ
ブルーボトル
https://tokyo-cafeblog.com/bluebottlecoffee-menu/
浅煎りなのでカフェラテかスチームが多いカプチーノの2択+ワッフル500 or 何か甘味では、バター匂いがヤバい、ドリップのブレンド行ったが浅煎り薄目酸味でブラクでも悪くなかった
=====
2019-12-08に投稿 Losing your job
仮にAI自体に先進性がなかったとしても、仕事が無くなることは社会的インパクトがある
過去10年はEndUserComputingでスピード化が勝負だったと思う、次は勝負ではなくソーシャルイシューの解決だと見た、社会問題を解決できるトコロが生き残る切符をもらえる感じ、AIやクラウドで商売臭が強すぎて惑わされるが
早くより良いサービスが提供ができる、コスト/人を少なくできる、やらなければ他社にヤラれる
お金をかけてデータ検証をしても、そうしたとこのマネをすれば良い、デジタルはコピーできるし
無人化をしても店員の仕事が減るだけ、RPA
加点評価の制度を敷いても少しの損得が出るだけかも、根本的には何も変わらないかも
(DIDIでは評価が高いと単価が高いドライバーになる、評価は買収ができないようセンサー等の公平な指標を使う等)
AIでもツール自体はコモディティ化するので優位性はすぐになくなる
競合を見ておき自動運転、Amazon等の黒船が出てきても対応できるようにする
競争力の問題?古いやり方はダメなの?UXで負けると死ぬ、お金目茶掛からん?
腐す業界慣習を打開し、アパレルの在庫破棄とか、雇用や無駄な事を守ることより正しいこと、あるべきようにやる、M&Aや業界団体を通じて再編をするしか、中国ではアイデア商品が作られ日本Amazonで買えるし小回りを利かして大きなマーケットに行くのもできる、正しいことをするとマーケットが変わるかも知れないのもDXか
■アフターデジタル
オンライン後の理想を実現するだけ。デジタルで塗り替える、シェアリングエコノミー、逆にオンラインストアが店舗を持ち発送する等区別がない、スタバが古く新しいカフェが勝つかも、GoogleやAmazonのように未完成でも出しマーケットを取る。デジタルによる社内連携を変える、鉄道が郵便や新聞や銀行を作ったようにデジタルが何かを作るかも
Uber等のデリバリーが現れると店舗が不要、キャッシュレス決済で購入する意識が変わる>決済時間は減るので形に嵌められた対応より店員のエンターテイメントで選ばれる
中国の事例が多いが人口が多く世界の工場となっているから必然性があったのかも知れない
■Deep Tech
プロパンを軽く運ぶ装置を開発:古いビジネスを技術で改良、イノベーションのジレンマの先を行く、まあ何としても商品を作る意気込みではBy Productを商品化とか
■AI救国論
ある国をディスって炎上した人。ある種重要なことを言うと揚げ足を取られ村八分される場合がある。危険思想や儲け過ぎ、やっかみが理由。炎上マーケの場合もマッチポンプで画を描くので構造は同じではないか。AI、ロボ、英語を強調している、また若者こそ優秀、日本のITは変、日本には若い良い技術者がいない、給料が、受験システムがダメで高専がいいと主張。:社会システムの革新性が込みではあろうな、高学歴より高専の方がよりプラクティカルなのはプラクティカルで育ったので当たり前では
黒船になる輸出できるもの、マネのできないもの は脅威になる
経験や勘ではなくデータ(レーシングもデータを使うがある程度からは数値より経験、無いデータは要るがデータ頼りとは情けない)
アウトドアスポーツ用品店で改革(売り場の壁の高さ、動線分析、何故買わなかったのか)
データを持っていると商圏、購入金額、購入内容の予想ができ出店が簡単になる
管理側が被管理側をどう誘導するかという観点しかない
最前線で使用されるべきツールが管理側でしか使用されない、ボトムアップの時代は来ない?
どんなデータ、あるいは業務が必要かは現場が一番分かっているべきだが
DX化デジタルトランスフォーメーションで何を変えるか、古いものをデジタル化するだけ?
現業務にデジタルを適用>リアルとデジタルをUXに基づき融合>デジタルで収益構造を変える
デジタル的マーケティング、シェアリングとか
人間を変えるべきでは?人間自体が一番変わる
果てし無く記憶力がある、42kmを誰もが2時間で走れる、空を飛べると世界が変わる
組織の力を変える
効率やコスパや低価格、かつスタイルがCoolなもの、ポケモンゴーのような流行るマーケ仕組みを入れる(人が溜まる、列を作る)、AIも所詮バズワード
面倒なことはAIにやらせるというスキルは取得すべき
DX意味わからん。「IT革命」と何が違うの?という話|広木大地(日本CTO協会理事/レクター取締役)|note
ナニガ安く簡単になったか分からないと駄目→どう動けばいいか知る→突然儲けの出るビジネスがなくなるかも
=====
2018-04-30に投稿 Smart contract, AI & Emo
■AI雑感
アルゴリズムが鍵、ロジックをどうプログラムするか考え方が変わるとなると手を動かしてスキルを取得しておかないとな、面倒なことはAIにやらせるのがいいかも知れない、始めと終わり以外の中間成果物的なところ
ディープラーニング:人間が理解しない形のデータが扱える(音声をウェーブでなくn次元の座標にする等しても良い)
マシーンラーニング:教師
機械学習の一連手順
1)データの可視化 :データの全体感を掴んで前処理の方針を決める
2)データの前処理 :予測精度が高くなるよう、データを綺麗にする
3)アルゴリズムの選定:データに対して適切なアルゴリズムを決める
4)モデルの学習 :コンピュータにデータの法則性を学習させる
5)モデルの検証 :出来上がったモデルの予測精度を確認する
AIが建築設計をし人間は間取りを選ぶだけ
癌画像診断、コンクリ護岸点検、バレーボールのセッター配球予測、経理伝票の仕分け入力
Adobe:類似例の自動生成
チャットボット:質問をすれば最適解を回答してくれる
HRテック(AIで評価/効果測定/異動/離職、経歴/性格/IQ/遺伝まで全自動)
性格も知識も偏った変/嫌なやつが一番企業に利益をもたらしている事が分かった
誰かを犠牲にするイノベーション、ジョブズのように人をビュンビュン振り回す人
普通の成績の子どもたちは高い協調性を求められ組織や集団の中で大過なく過ごす
https://bunshun.jp/articles/-/28229?page=4
(人間が時間を掛けて選択していることをAIにやらせる、多変量解析でもいいかも知らんが)
仕組みについてはここが良い感じかと
https://aizine.ai/algorithm-0315/
■Smart contract雑感
中央管理者を必要としない事のデメリットの癖が強い、用途が限られる
1)スケーラビリティ
ビットコインは総量がある
信頼性を担保するのにノード数が必要なくせに
履歴を持つくせにパフォーマンスを考えるとデータ量は多くできない
2)プライベートでもすべてオープンになる
仮想通貨により世界統一通貨を実現したり、紙幣やコインが不要になったり、IMFが不要になったりするかも知れない
中央政府が不要になる可能性
■エモ消費
世代的消費活動の括り、消費というかどうやって浪費させるかという手法
https://note.mu/wildriverpeace/n/necb216232d12
いいモノを作れば売れる、広告で認知させれば売れる、割引やオトクを提示すれば売れる、は既に終わっている
モノからコト/体験へなんて言われたのははるか昔の2000年の頃 CD→握手→入れあげ
モノは外に揃える、コトは外からの刺激(必要なモノは揃えてしまった、高品質の置いてけぼり感)
エモは入れ込む、特に女に(コトに刺激され、未完成なものに巻き込まれる)
精神的充足
コミュニティへの帰属意識
瞬間的につながる刹那のコミュニティ
今この瞬間の自己肯定感
https://comemo.io/entries/7261
家族は現状幸福度が高い。だからこそ現在の状態を維持したいという消費
幸福度の低いソロは、現状を打破するためにお金と時間を費やしたい
承認と達成感、また幸せ感の共有、帰属意識(体験/時間の共有、純粋な体験や時間でなく共有を含む)
幸せのマイレージを貯める行動
消費者の関与によって完成するからこそ「エモい」のです。ニコニコ超会議やコミケが盛り上がるのはそういうこと
エモいとは単に感動したというより、美的/切なさ、はたから見れば哀れみを含む
-----------
■Booランディング
コンテンツが重要というが、余程のことがないと人は中身を見ていない
人間の馬鹿なところを突くというのが商法の本質
品質とは何か、ブランドで差異化、多広告対応、一定期間の体験
Apple: 紛らわしい販売店、コピー商品を防ぐ
ハイネケン: ステーショナリー
幻冬舎: やりたいことをやってもいい。判断は極端であること
https://rightcode.co.jp/blog/information-technology/javascript-promise
https://rightcode.co.jp/blog/information-technology/javascript-async-await
http://www.tohoho-web.com/ex/promise.html
https://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/
https://qiita.com/niusounds/items/37c1f9b021b62194e077
https://qiita.com/soarflat/items/1a9613e023200bbebcb3
非同期関数は処理の順序を制御できない問題があった、そこでPromise
↓
Promise オブジェクトは then(ok_callback, ng_callback) というメソッドを持ちます。
then() はPromise が成功または失敗になるまで処理を受け流し、
処理を.then()で繋げ順番を確保することが可能
成功時に ok_callback を、失敗時に ng_callback をコールバック関数として呼び出します
.then() は第一引数に成功時のコールバック関数、第二引数に失敗時のコールバック関数
.catch(ng_callback) は、.then(undefined, ng_callback) と同じ意味
.catch() は処理中に発生した throw をキャッチできる
ES2018(ES9) では、.finally() がサポートされました
function aFunc3(data) {
return new Promise(function(okCallback, ngCallback) {
setTimeout(function() {
if (Math.random() < 0.30) {
ngCallback(new Error('ERROR!'));
} else {
okCallback(data * 2);
}
}, Math.random() * 1000);
});
}
function sample_finally2() {
aFunc3(100).then((data) => {
console.log(data);
return aFunc3(data);
})
.then((data) => {
console.log(data);
return aFunc3(data);
})
.then((data) => {
console.log(data);
throw new Error('ERROR!!!');
})
.catch((e) => {
console.log("catch");
console.log(e);
})
.finally(() => {
console.log('*** Finally ***');
});
}
//200 400 800 catch Error:ERRROR!!! *** Finally ***
Promise.all() は配列で指定された全てのPromiseタスクを待ち全てが完了した時点で .then()を呼ぶ
Promise.race()ならいずれかのPromise
function sample_all() {
p1 = taskA();
p2 = taskB();
Promise.all([p1, p2]).then(() => {
console.log("taskA and taskB are finished.");
});
}
↓
ES2017 では、async/await がサポートされました
async と await を用いることで、Promise に対応した非同期関数を、同期関数の様にシンプルに呼び出すことが可能となります
同期関数の様に呼び出したい非同期関数を呼び出す際に await をつけます。await を呼び出す関数に async をつけます
async function sample_async_await_with_catch() {
var val = 100;
try {
val = await aFunc3(val);
console.log(val);
val = await aFunc3(val);
console.log(val);
val = await aFunc3(val);
console.log(val);
} catch (e) {
console.log(e);
}
}
■コールバック関数
広い定義でいうと「高階関数に渡すための関数」
「関数を受け取る関数」は「高階関数」、つまりhello()がコールバック関数
// 関数を2回実行する関数!!
function doTwice(func) {
func(); // 1回目Hello!
func(); // 2回目Hello!
}
// あいさつするだけの関数
function hello() {
console.log('Hello!');
}
// あいさつを2回実行する
doTwice(hello);
========================================
もっと詳しく、もっと分かり易く、どう使うか↓
https://knowledge.sakura.ad.jp/24890/
https://jsprimer.net/basic/async/
https://dev.classmethod.jp/articles/javascript-asynchronous-processing/
■処理の繋がり
1)コールバック関数
ある関数の処理が終われば次のコールバック関数を呼ぶという指定がそれ
歴史的にはエラーファーストコールバック(のルール)
処理が失敗した場合は、コールバック関数の1番目の引数にエラーオブジェクトを渡して呼び出す
処理が成功した場合は、コールバック関数の1番目の引数にはnullを渡し、2番目以降の引数に成功時の結果を渡して呼び出す
fs.readFile("./example.txt", (error, data) => {
2)Promise(非同期処理に対するPromise→順番を合わせる意味では同期処理ではと思う?JSはシングルスレッドかつ非同期という糞?仕様)
ある関数の処理が終わればPromiseオブジェクトを返す
JSがシングルスレッドだが 処理を一定の単位ごとに分け処理を切り替えながら実行する並行処理(concurrent)の仕様のため 順序を考慮する必要がある
非同期処理の実行中にとても重たい処理があると非同期処理の切り替えが遅れる
Promiseオブジェクトは3つの内部状態を持ちます。
pending(保留): まだ非同期処理は終わっていない(成功も失敗もしていない)
fulfilled(成功): 非同期処理が正常に終了した
rejected(拒否): 非同期処理が失敗した
初期状態はpendingで、一度fulfilledまたはrejectedになったらそれ以降は状態は変わらず、非同期処理の終了時に返す値もそれ以降は変わらない
Promiseのコンストラクターは関数を引数に取って、その関数がさらに2つの関数を引数に取る
1番目の関数(resolve)に引数を渡して実行すると状態がfulfilledになり、引数の値はPromiseオブジェクトが保持する値になる
2番目の関数(reject)に引数を渡して実行すると状態がrejectedになり、引数の値はPromiseオブジェクトが保持する値になる
関数が例外を投げた場合も状態がrejectedになり、投げた値がPromiseオブジェクトが保持する値になる、throwする値をrejectedに渡して実行した時と同じ
then()は2つの関数を引数に取り、Promiseの状態がfulfilledになったら1番目の関数が、rejectedになったら2番目の関数が実行されます。
then()の1番目の引数が関数でなければidentity function(入力値をそのまま返す関数)が代わりに使われます
2番目の引数が関数でなければthrower function(入力値を例外として投げる関数)が代わりに使われます
catch()は1番目の引数にidentity functionを指定したthen()と同じ
上の挙動をオレオレPromiseをYakusokuで作っているので分かり易い https://knowledge.sakura.ad.jp/24890/
なお、本質としてはコレ、下記ソースが決まりの流れ、ひな形としてヤリ慣れるしか
1)時間が掛かる処理をPromise化して順序立てよう
2)成功と失敗のコールバックを指定しよう
//処理にコールバック関数を入れて成功と失敗時の型で終える
function dummyFetch(cmt, callBack) {
setTimeout(() => {
if (cmt.startsWith("/success")) {
callBack(null, { body: `Response body of ${cmt}` });
} else {
callBack(new Error("Bad"));
}
}, 1000 * Math.random());
}
//プロミスを入れるためラッパーを関数にかます
function aaaFilePromise(cmt) {
return new Promise((resolve, reject) => {
dummyFetch(cmt, (err, data) => {
if (err) {
reject(err); // 失敗: 内部状態をrejectedにする
}
else {
resolve(data); // 成功: 内部状態をfulfilledにする
}
});
});
}
//プロミスチェーンでのフロー
aaaFilePromise("/success/passwd")
.then((data) => { // 読み出しに成功したらresolve()に渡した値が引数として渡される
console.log("1", data);
//return 'next';//テキストがあってもなくても次のthenに行く、省略でもテキストでも第一引数関数に行く成功側
return aaaFilePromise("/etc/text");//エラーで次のthenの失敗側の第二引数関数にきっちり行く
})
.then((data) => {
console.log("2", data);
return aaaFilePromise("/success/shadow1");
}, (data) => {
console.log("2e", data);
return aaaFilePromise("/success/shadow2");
})
.then((data) => {
console.log("3", data);
return aaaFilePromise("/etc/shadow");
})
.catch((err) => { // reject()に渡した値が引数として渡される
console.log("error", err);
});
then()/ catch()は、引数で渡された関数の戻り値から新たにPromiseオブェクトを作り、そのオブジェクトを返します。そのためメソッドチェーンが可能
引数に渡した関数の戻り値がPromiseオブジェクトの場合はそのオブジェクトをそのまま返す、そうでなければ戻り値をPromiseで包んで返す
エラーでキャッチに飛ぶ訳ではなく次のthen第2引数関数に飛んでいる、省略でcatchに行っているように見えるだけ
dexieやPWAでの提供があり使う(処理を順序立てて使うようプログラムを組む時に
dexie: db.schedule.where('site').equals('sche').first().then(function(records) {
pwa: caches.keys().then(function(keyList){
return Promise.all(keyList.map(function(key){
3)async / await
promiseは順番決めができたがasync/awaitは順番を扱う処理もできるsetTimeout/setIntevalがプロミスチェーンだけでは時間を止められない
シングルスレッドから似非スレッドで分離し非同期になるから、awaitを入れると同期する↓
const wait = (sec) => {
return new Promise((resolve, reject) => { setTimeout(resolve, sec*1000); });
};
async function arrKick_async(arr) {
for(let i=1; i<=num_arr; i++){
arr = await kickPromise(arr);
await wait(2);
}
}
arrKick_async(arr);
========================================
JSネイティブとPromiseとasyncが混ざった場合は同期しない、then()すら超えてくる↓
4)コールバック地獄
結局コールバック地獄が扱いやすい(スレッドの切り替えがなければ同期ができる)、最近のJSフレームワークは全部Promise化しているらしいが
例)キャッシュを保存し、そのステータスを取るようにAsyncやPromiseで保存待ちの順番をにしても、待たない
//隙間がないと1度エラーだとエラーになりっぱなし
let num_cache;
num_cache = getCacheStatus();
if(num_cache == 0 || !num_cache){
num_cache = getCacheStatus();
if(num_cache == 0 || !num_cache){
num_cache = getCacheStatus();
if(num_cache == 0 || !num_cache){
num_cache = getCacheStatus();
if(num_cache == 0 || !num_cache){
//setTimeoutで隙間があっても関数スレッドの返り値を代入するスレッド切替時に、返り値を待つスレッドの方は次の処理に進んでしまいIF判定ができない
let s = setTimeout(function(){
let num_cache1 = getCacheStatus();
if(num_cache1 == 0 || !num_cache1){
s = setTimeout(function(){
let num_cache2 = getCacheStatus();
if(num_cache2 == 0 || !num_cache2){
s = setTimeout(function(){
let num_cache3 = getCacheStatus();
if(num_cache3 == 0 || !num_cache3){
s = setTimeout(function(){
let num_cache4 = getCacheStatus();
if(num_cache4 == 0 || !num_cache4){
//Func返り値やPromiseやAsyncでのスレッドの切り替えがないDOMの判定であれば上手くいく
let s = setTimeout(function(){
getCacheStatus();
if(document.getElementById('mes_filenames').innerHTML == 'none'){
s = setTimeout(function(){
getCacheStatus();
if(document.getElementById('mes_filenames').innerHTML == 'none'){
s = setTimeout(function(){
getCacheStatus();
if(document.getElementById('mes_filenames').innerHTML == 'none'){
s = setTimeout(function(){
getCacheStatus();
if(document.getElementById('mes_filenames').innerHTML == 'none'){
s = setTimeout(function(){
getCacheStatus();
if(document.getElementById('mes_filenames').innerHTML == '<?php echo $lang_page->install_none; ?>'){
function getCacheStatus(){
let num_caches = 0;
let num_success = 0;
caches.keys().then(function(keyList){
return Promise.all(keyList.map(function(key){
caches.open(key).then(function(cache) {
cache.matchAll().then(function(response) {
document.getElementById('mes_filenames').innerHTML = '';
let s;
let o;
for(const value of response){
s = value.status;
o = value.ok;
document.getElementById('mes_filenames').insertAdjacentHTML('afterbegin', value.url + '<br>');
if(s == '200' && o){
num_success++;
}
num_caches++;
}
if(num_caches > 0){
document.getElementById('mes_progress_rate').innerHTML = 'Progress: ' + num_success / num_caches * 100 + '%';
}else{
document.getElementById('mes_filenames').innerHTML = 'None';
}
});
});
}));
});
return num_caches;
}
===============
thenの入れ子だと親の部分だけ先に進んでしまう、入れ子ダメで親子を作れば親→子の一方方向で子で終わるトーナメント構造で(上がらない)
test1().then((result) => {
test2().then((result) => { //fuok });
})then(function() これは入れ子
↓
test1().then((result) => {
test2().then((result) => {
//fuok
})then(function(){ //fuok2 }); これでトーナメント構造
})catch(function(e)
promiseチェーンでthen毎にに欲しい引数を出すが、複数であればそれらの引数をthenに渡せない、下記1は駄目
1)thenで一つの引数になるようにロジックを組む(thenのトーナメント構造、一階層上で変数に入れる等)
}).then(function(response){
return [response.json(), arr_del];
}).then(function(v) {
json = v[0]; arr = v[1];
2)callbackとresolveに配列を使うとOK、オブジェクトでもいいかも
function dummyFetch(cmt, callBack) {
if(Array.isArray(cmt){
var p = cmt[0];
var s = cmt[1];
}else{
var p = cmt;
var s = 1;
}
setTimeout(() => {
if (p.startsWith("/success")) {
var r = [p, ++s];//これ不可[p, s++]
callBack(null, r);
} else {
callBack(new Error("Bad"));
}
}, 1000 * Math.random());
}
function aaaFilePromise(cmt) {
return new Promise((resolve, reject) => {
dummyFetch(cmt, (err, data) => {
if (err) {
reject(err);
}
else {
if(Array.isArray(data){
var p = data[0];
var s = data[1];
}else{
var p = data;
var s = 1;
}
resolve([p, s]); // 成功: 内部状態をfulfilledにする
}
});
});
}
===============
Promise化していない関数を使いたいが、そのまま使うかthen化できるようにするか?
1)次thenに進みたい元Funcの処理としてresolveの返り値に入れる、ダメなら省略可だがreject()に渡しcatchする
2)次thenには適当でもいいのでreturnで進む
function test1 () {
return new Promise((resolve, reject) => {
const a = 1;
const b = 2;
resolve([a, b]);
})
}
test1().then((result) => {
console.log(result[0]); // 1
console.log(result[1]); // 2
return 'go next';
}).then(function(){
エラーハンドリングしたい、よくわからんが下記で動作に違いがでた、rejectはJSがエラーを吐いた
1)catchさせるにはthrow new Errorし、alertを出す
2)catchはしないが次のthenには移動させないためreturn false
}).then(function(json){
if(json.init == 'Not appropriate access'){
throw new Error('Server warning');
}else if(json.init == 'No data'){
//reject("initiate!");
return false;
}else{
resolve(json);
}
}).catch(function(error){
alert('Ooops: ' + error);
});
Promise.allを使って、3つのpromiseを同時に実行、allはすべての非同期処理がresolveされたタイミングで結果を返
Promise.all([test1, test2, test3]).then(function() {
console.log("Fourth");
もっと簡単に async, await, Promise - Qiita■Javascript
https://www.bangboo.com/cms/blog/page_325.html
■夢をかなえるゾウ0 ガネーシャと夢を食べるバク
最高の行動を選択し続ければ想像しない形で夢が叶う、と信じるしかない
自分の存在がちっぽけだと自覚>本物の夢を目指す
夢>理想>信念>計画>実行>成果>幸福
捉え方、意味付け(どんな困難も、嫌なことも鍛錬や人助けと考えられる)
夢>楽しい>集中力>行動力>強さ>魅力
寝たい短期の欲求があっても、鍛錬が要る長期の欲求=夢がない
英雄と臆病者の違い>何をなすかだけ、自分の負の部分を受け入れる
本物の夢は同じ痛みを持った他者を救うことで自分を救う事
誰かの為、世の中の為は建前、自分の怒り悲しみ羨望…エゴが大きな力
悲しみ=自分だけの意味を見出そうとしている、その悲しみはいつか喜びに変わる
自分以外のものを見て気づき、自分とは何か、自分は何のために生きているか、生きる意味を知る(教えられるものでなく経験から見出す)
自分に正直に夢を叶える過程で、最高の行動を選ぶ事で必ず自分を好きになる
レトリックだが人間のサガと天晴、不快でも他人なりの信念を読み取る>包括し大局観の概念、他人の信念を言い表しておけばいい
■夢をかなえるゾウ4、ガネージャと死神
自分、今の生き方やったら死ぬときめっちゃ後悔するで。
///死神の教え(誰も皆ほぼ同じことに後悔する)
本当にやりたいことをやらなかったこと
健康を大切にしなかったこと
仕事ばかりしていたこと
会いたい人に会いに行かなかったこと
学ぶべきことを学ばなかったこと
人を許さなかったこと
人の意見に耳をかさなかったこと
人に感謝の言葉を伝えられなかったこと
死の準備をしておかなかったこと
生きた証を残さなかったこと
(遺書を書く、死後に人に伝えたいメッセージを書く:やりたいリストをやれる)
結局、人間の夢なんて『お金持ちになりたい』とか『魅力的な異性と付き合いたい』とか『自分の名前が残るような仕事がしたい』とか、そんなんばっかで、全然バラエティに富んでへんやん→お前の夢面白んない
///ガネーシャの課題
1.健康に良いことを始める:行動を管理して目標を達成する習慣化
2.死後に必要な手続きを調べる:目を逸らしたくなる現実に向き合う、死後家族を守る
3.お金の問題がなかったらどんな仕事をしたいか夢想する:人が買うてくれる価値を作る→情熱
4.大きな夢に向かう小さな一歩を 今日踏み出す:やれることは何でもある、調べるでも
5.人に会ってわだかまりを解く:器の持ち主が家族会社を末永く繁栄できる
6.死ぬまでにやりたいことリストを作る:20個以上、リマインダ、ワクワクできる
7.経験したことのないサービスを受ける:勉強になる、どっちかに囚われず本当に望むものを選べるようになる
8.節約を楽しむ:贅沢した後の道理、工夫して楽しめ
9.思い切って仕事を休む:他人の評価が下がることを恐れてる、本当に大事なものより
10.自分の体に感謝をする:労わらんのはブラック、他人にも気遣いができるようになり、力を引き出せる
11.身近な人に感謝の言葉を伝える:人の苦労が分かる
12.周囲の期待と違う行動をとる:本心と期待の間でどっちが本物かわかる
13.限界を感じた時 もうひと踏ん張りする:頑張りすぎ意味ないという言い訳はなし
14.両親の生い立ちを知る:自分が人生で感じた痛みは親が感じた痛み、酒を飲んで語り合う、何を世襲する
15.かなえてきた夢を思い出す:忘れてしまう、将来に縛られて不幸せか
16.他者の欠点を受け入れる姿勢を持つ(見る場所を変える、相手の背景を想像する、他人に完璧さを求めている自分に気づく):苦しみは必ず減る、他人でイライラする必要はない
17.つながりを意識する時間を持つ:岩も石も砂もない、同じでダイヤと線を引かない
18.喜怒哀楽を表に出す:繋がった世界では死がない、安らぎの世界から切り離され不安で泣きながら生まれてくる、喜びも感動も存在できない
追い詰められて強なる奴は自分を責められる奴、弱なる奴は一発逆転を狙ってまう、期待だけ膨らんでまう
タバコ吸わんで健康で良かったと思う人、一方タバコが吸えんと苦しい人、無いから苦しいんやない、奪われたから苦しいんや
トルストイ)死の準備をするということは充実した人生を送るということ、人生の充実によって安らかに死を迎えられる
ジミヘン)死が訪れたとき死ぬのは俺なんだ、俺の好きなように生きさせてくれ
ヘップバーン)もし世界が終るとしても幸運だったこと楽しかったことの全てを思い出す
ルター)死は人生の終末ではない、生涯の完成である
夢はかならず叶うというのは原動力になる
偉人も生きているうちに夢を叶えた人は少ない ディズニー、アインシュタイン、エジソン、ダビンチ
あきらめと受け入れは同じ 死はかなわない夢 叶わないことを受け入れる
衣食住医で過去の人の夢は叶えた状態
病気で死んだ人も薬が何十年か後に出来て生きれる、夢はいつか叶う、全ての夢は叶う、タスキを受け死んだ人の夢を叶えるのは今を生きている人
死は土に返るだけで原子は変わらない形が変わっただけ、恐れる必要はない
完全な光を見れるのは夢を追っているときだけ、叶えたとき裏側の闇を知る、死後を想像し光で満たされた場所と考えるなら、生きている間を夢を追っている最中とする事ができる
輪廻し形を変えながらあなたでしか経験できない尊さ
生と死の対比でエモさがズルい、夢のような張りがないと体の反応として死んでいく、無意識が意識をコントロールするのが理性で表を保つ役割がある、裏表なく無意識を意識化し一体とすることはパフォーマンスがあがるが長期だと自然過ぎて刺激や葛藤がなくボケて死ぬ?生という快楽への執着でしかないがね
■夢をかなえるゾウ3 ブラックガネーシャの教え
基本的にスパルタで集中、頑張る人生でないと何も始まらない
だが楽しい/報酬を見出す、環境は他人なので人に頼る
///ガネーシャの課題
自分の持ち物で本当に必要なものだけを残し必要のないものは捨てる
苦手な分野のプラス面を見つけて克服する(遠ざけない)
目標を誰かに宣言する(口に出してしまう)
うまくいっている人のやり方を調べる(ダメな奴は自己流)
一度自分のやり方を捨て、うまくいっている人のやり方を徹底的に真似る
空いた時間をすべて使う(お前中途半端やねん)
合わない人をホメる(人を使うには)
決まずいお願い事を口に出す(夢には衝突も避けられないので練習にもなる)
今までずっと避けていたことをやってみる(頭のどこかでやった方が良いと思っている)
自分の仕事でお客さんとして感動できるところを見つける(感動を繋げられるのが天職)
一度儲けを忘れてお客さんが喜ぶことだけを考える(発想の転換)
自分の考えを疑ってみる
自分にとって勇気が必要なことを一つ実行する
優れた人から直接教えてもらう
一緒に働いている人に感謝の言葉を伝える(社長は社員に掛けると退職率が違う等)
自分で自由にできる仕事を作る(自分で工夫できるのはゲームより楽しい)
余裕がないときにユーモアを言う
目の前の苦しみを乗り越えたら手に入れられるものを、できるだけ多く紙に書き出す
欲しいものが手に入っていくストーリを考えて空想をふくらませていく
手に入れたいものを目に見える形にして、いつでも見れる場所に置いておく
自分流にアレンジする(自分で思いつくが大事、アイデアを試したくなる、工夫)
(ブラック富神:錯覚を利用、短期やバレなければ)
希少価値を演出する
あえて自分の不利益になることを言って信用してもらう
周囲の人間関係を断つ(情や人のせいにしてしまうから)
中毒にする(次もその次もとなる、油や砂糖)
夢や成功を手に入れるには、つらいことや苦しいことは決して避けられない
ほとんどの人は避けるが、乗り越えることで相応の魅力や価値を身に着けるのだ
(魅力や価値)
■夢をかなえるゾウ2 ガネーシャと貧乏神
「お金」と「幸せ」の関係、ごっついの教えたろか。
夢追い痛い人、誘惑に負ける人、仕事で儲けられない人は貧乏になる
競争は相対的であり勝つしかない、絶対的と分けて捉える
欲しいものを口に出す
成功まで止めない、努力、練習量、向き不向き、成長する
やりたい事をやると滅茶成長させてくれる、そういう所へ行く
借金で退路を断つ?、カタ嵌められてるが
意見を聴いて直す、分析に時間をかける
貧乏になる素質があるか:分析してみ
辛い状況を笑い話>挑戦できるし自由になる
みんな辛いしお前だけではない
他人を誉める、プレゼントする、楽しみを見つける、自分が困ってても
貧乏神は福の神になる、貧乏な時でも好きなら結婚する?
才能と向き合う=貧乏を経験するということかも
TVは人を勘違いさせるために●を出している:目指すのはその先だ
■夢をかなえるゾウ、ガネージャ
偉人になるには→迷いがあるとだめ→自分で良いと信じること
決めたことをやる、良いことをやる、人に文句を言わせる前に押さえておく
今ある体制を認める、右翼な良市民:小市民になる可能性が大(志の大きさ)
靴を磨く:自分を支えてくれるものを大事にする
募金する:人から愛される、世の中を良くしたい
腹八分目:自分をコントロールすることを楽しむ
人が欲しがるものを先取り:人が何を欲するかがビジネス、上司の欲も
笑わせる:空気を作れる、やる気やアイデア、いい面がでる
トイレを掃除:人がやりたがらない事をやる
まっすぐ帰宅:むしろ逆、一番大切な自由に使える時間
寝る前褒める:頑張ったり成長することが楽しい事と教える
何かを辞める:新しく何かをやる為に何かを止める、1日でも
環境を作る:意識を変えても駄目、環境を変えて習慣に
鏡を見て整える:意識や内面を変えるのは難しいが外見は変えられる
自分が得意な事を人に聞く:価値を決めるのは客、自分以外だから
自分が苦手な事を人に聞く:長所と短所は逆かも
夢を想像:考えはじめたら楽しくて止まらない
運が良いと言う:脳みそが勝手に運がいい事を探し始める、脳が学び始める
タダで貰う:言い方や仕草に気を使うようにコミュが変わる
明日の準備をする:一流はどんな状況でも結果を出す、綿密な準備が要る
身近な人を喜ばせる:どうでもいい人に気を使うのに、世話になった人、好いてくれる人、大事な人をぞんざいに扱うもの
褒める:誰かの助けなしに成功はない、呼吸レベルで褒め言葉を言う
人の長所を盗む:同業なら筋を通さないといけないがパクッてでも人を喜ばせる
求人情報を見る:これや!と思えるまで探し続ける、仕事で一生が決まるから
お参りに行く:どうしたら出世できるか成功できるかは心の底では分かっている、面倒臭がりでやらないだけ、成功する奴は少しでも可能性があればやる、信仰心は意味がある
人気の店、理由の観察:どうやって人を喜ばしているか観察
プレゼントする:期待以上だった時に喜ぶ、サプライズするには
やらずに後悔していることをやる:大体やらないまま死んでいく、成功はやりたい事をやるだけと言われている
夢を語る:人が聞きたい夢は実現が望まれていること、かなえるのが簡単
人の成功をサポートする:自分が成功する近道は人の成功を助けること
応募する:もし才能が認められたら人生はあっという間に変わる
毎日感謝する:地位名誉名声お金は他人がくれる、満たされて他人に愛を注ぐ状態で、自然な形で手に入る
1富神・2貧乏神・3ブラック神・4死神・0バク・Love理論
■偏差値78のAV男優が考えるセックス幸福論 森林原人
性欲は欲求の中でも特別で他者が必要、社会調和の為に理性が必要で快楽や享楽:セックは排除される、理性は客観的判断、理性は教育でつくられ正義でも絶対的でもない、人間は快に動かされ生きてきた生き物、性欲は恋愛という肩書を与えられた
社会性を持ったセックは?社会的地位の高い外面が硬い教師弁護士のレイプ願望等の人の裏側や多面性、性愛は社会が成立する前からあり社会的概念を超え社会に閉じ込められない、アブノーマルを含めスリルや快楽が何十倍もavにありこの経験は人類史上貴重(金や物は死ぬ間際には意味がない)、他者承認欲求と自己承認欲求、社会的信用も社会的弾圧を受けた子が背中を追うことを考えればあってないようなもので何を大事にするか、セックに無関心な人もいるがエロとは人間に対する愛
セックの可能性:かけがえのなさ、発見、感動、意味、悦び、儚い存在価値、自分を赦す、コンプレックスがあってもだれでも原始な感覚で絶対的な全肯定感を感じることがある、その瞬間に二人が存在したという事実の確認、粘膜への不可侵侵入、過去を受け入れ未来が約束された気になる幻想、全肯定感は幸福感や深い愛情の源になりえ社会的成功とは別の人として根源的な幸せに直結、脆く儚い刹那の逆説、契約や社会制度に囚われない本来の原始のセック
セックは同じのがない一期一会、承認欲求(自分)→肉体的快感→mがもっと虐めてといえばsと立場が一転する、気持ち良さとsmで脳で快感→心から想う愛おしい(相手)、性欲不満か承認欲求不満か、肉体と心の危険性に気を
女性の性欲は男と違う、挿入より抱っこだったり女版風俗はないし、王子に優しくイケメンに話しかけられ見たい(コミュニケーション)、受け入れられた実感をセックに求める、性欲と愛情と結婚は割り切れるというか別次元で捉え性対象とされたいとか心の繋がりとか、歳とると挿入だが、気遣いとサービス精神と印象良く初対面でセックしてもいいと思われるのが男優
覚醒と睡眠と中間の催眠、脳が眠ると入力そのまま動く、運動支配>感覚支配>記憶支配、記憶呼び出しトレースしつつ書き換えでトラウマを消せる、呼吸は意識と無意識に唯一またがる、意識的に深い呼吸をすることで無意識の本能を呼び出せる
セックは本能でするもので今この瞬間に心があり、先や過去に縛られない、愛は執着であり思考ではない、今瞬間の積み重ねが永遠であり今ないものは先にもない、本能から生まれる愛おしさ慈しみの先にあるのが愛、瞬間的な心の状態
=
オーガズム、射精回数での脳回路を書き換えて絆を強くしている
オーガズムは脳回路を「再配線」させて絆を作り出していたと判明! (2/2) - ナゾロジー (nazology.net)集団になると男女とも本能が現れるのでは
夜這い、乱交が一般習俗だった日本、その中心を担った祭りの歴史 「祭り」と「セックス」は古来より神の意志による(1/8) | JBpress (ジェイビープレス) (ismedia.jp)■サイコパスに学ぶ成功法則
知力とサイコパスの合体で偉大な人物になりえる
成功するにはサイコパスであることは近道
↑
スイッチの切り替えができる
やり遂げることができる
/// サイコパスの性質
共感性が低い、我慢強い、割り切れる
恐怖感がない、自信家、説得が上手い
/// サイコパスの精神性
怒りを抑えられる、個人的屈辱と捉えず無視、ゲームとして割り切る
プロは後悔をしない
カリスマとして騙して誘導できる
/// サイコパスの訓練
ストレス環境への適応
恐怖下のスイッチ切替
/// 説得する方法
相手の言葉を使う、心を読む、親密になる
影響の割合:目を合わせる55%、トーン38%、言葉7%
/// 親密になる方法
笑いかける
ほめる
気さく
利得
ボディタッチ
温める飲み物を出す
見た目が近い
共通項が多い
キューブラー・ロスによる5段階モデル(死の受容モデル)と、それへの代表的な批判について | KAIGO LAB(カイゴラボ)第1段階:否認と孤立(denial & isolation)
「なにかの間違いだ」周囲から距離を取り孤立する
第2段階:怒り(anger)
自分が死ぬという事実は認識できたが「なぜ、自分が」
第3段階:取り引き(bargaining)
神や仏にすがり死を遅らせてほしいと願う
第4段階:抑うつ(depression)
「ああ、これだけ頼んでもダメか」死を悟り頭で理解していた死が感情的にも理解できる
第5段階:受容(acceptance)
生命が死んでいくことは自然なことだという気持ちになる。生命観や宇宙観のようなものを形成することもある。自分の人生の終わりを、静かにみつめることができるようになり、心に平穏が訪れる。
■死ぬときに後悔すること25
大切な人とは人生に色どりを与えてくれた人
好き勝手:やりたい放題する人は人を引き付ける、輝かしい、潔さがある
忍従:耐え忍ぶ人生の方が思いのままになるより楽しいらしい(これも自身のやり切りだろう)
安らかな優しい顔で死ぬってその時の満足感だけで人生全体を反映していない可能性もありそう
本館
/// BANGBOO BLOG /// - 竹書房