February 22, 2021
BigQuery part2
■BQタイムアウト縺?6時間
クエリそのままパフォーマンスを改善 BigQuery パフォーマンス向上テクニッ繧?■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")
■BQ DMLクォータ鐔??驕?
割縺?SQLだとすぐに藹??にあたる
上限がテーブル単位のためテーブル名を分けると回避できるらしい
BQ streaming insert->BQ storage read/write APIの臀??限縺?DMLと別で、閾値が大きい
APIだ縺?Protocol buffersが必要で、Date/Timestampが対藹??しておらず
Unixエポックからの日謨?/秒数への藹??觸??が必要、、、
■マテリアライズドビュ繝?
実体データを保持しリフレッシュ更新で早いため集計等に向縺?
ベーステーブルは臀??つ、カウントができない、使用できない関数がある等の制軆??がある
またマテビューはビューを元に臀??成できずテーブルからである必要がある
ストレージコストは觸??かるが、通常ビューで時間觸??かる計算を頻軆??にする場合は早く安縺?なる可能性がある
■BQ同時実行謨?
オンデマンドでは使用可能なスロット数に基づき自動的に同時実行数が決藹??され超えるとスロット縺? 空きがでるまでキューに臀??管される
プロジェクトごとにクエリの最大同時実行数は動的に決まる
同時実行数の最大値は指定できるが、大き縺?しても実行数が増えることはな縺?、あ縺?まで自動決藹?? 内の方が優先される
Editionsが割り当てられているプロジェクトでは最大同時実行数を譏?示的に設定できる
他に、インタラクティブクエリ、バッチクエリ、クエリ順蠎?や上限な縺?
■BigQueryの列レベル・鐔??レベルのセキュリテ繧?
BQ画面・??左ナビのポリシータ繧?
ポリシータグを作成(組織単位で臀??括臀??覧表示・??
タグは髫?層化できるので、全ユーザタグ・??管理者タグ・??社長タ繧?
スキーマ>Addポリシータ繧?
タグが付いていればプレビューで鐔??れない
select * except(tag_column)にする必要がある
メタデータは鐔??れる(カラム名、型
ポリシータグ画面・??対象ポリシー選択>情報パネルで権限者一隕?
fine-grained readerを付荳?する縺?select *ができるようになる
社長タグに社長だけ権限付ける等
窶?APIを有効にし、ポリシーを有効にする必要がある
■承鐔??済みビュ繝? authorized view
authorized viewを設藹??するとそ縺?viewを対象とする権限だけ必要で権限をさかのぼり付荳?しな縺?ていい(通常縺?viewは藹??照元の権限も必要)
この権限移譲は閲覧権限のみで編集権限等は含まない
被藹??照の元テーブル側に許可するview名を設藹??する
藹??照権限は緩縺?なるが、編集権限は厳し縺?なる(設藹??するビューは藹??更しない前觸??で承鐔??する形・??
authorized viewを付荳?すると軆??関となったビュー縺?dataEditorではビュー更新ができな縺?なる
ソーステーブルにもdataOwnerが必要(通常のビュー臀??成に縺?dataViewerがソースに藹??要)
基本の藹??全軆??縺?authorized view設藹??を外す>ビュー藹??更・??AV再設藹??がいい
対象縺?AVは管理者を立て臀??元管理するのが良さそう
(テーブルやビューを作って権限付荳?してバッチだ縺?data ownerが必要なのは注意)
■Authorized系にはメリットとデメリット
1) Authorized viewを設藹??するメリット
一度設定してしまえばソース側への権限付荳?依頼が不要となりビューの権限管理が省力化できる
ビューにて閲覧対象を絞ることができソース全臀??は閲覧させないことができる、絞れる
普通のビューは元データへの権限が必要で鐔??せた縺?ないデータへも権限が必要になる場合がある2) Authorized viewを設藹??するデメリット
一度設定してしまえばソース側での権限付荳?依頼が不要となり被藹??照側で許可臀??許可の判断ができな縺?なる、誰にデータ閲覧権限を付荳?しているか把握できず管理が機能しな縺?なる一面がある
将来に置かれるソース側のデータの閲覧も許可することになり不用諢?に閲覧が可能となってしまう
terraform縺?Authorized view設藹??が剥がれてしまう危険諤?
ビューを編集するにあたりAuthorized viewを外す必要がある、あるいはソースにもEditor権限
すぐにビューを変更することができな縺?なる(ビューを一旦削除することはできる)
Authorized viewはビューを削除して、再度臀??り直すと生きている場合がある、ダメな場合も多いが
これで觸??洩させた縺?ない情報を一時含められる危険性がある
3)authorized datasetを設藹??するデメリット
設藹??時は良いかもしれないが、将来的に諢?図しないデータがDS入った場合も閲覧を許してしまう
↓
データセットは細かく作成してアクセスレベル設定し普通のビューを使う
ソース全臀??を閲覧させられない場合(直接権限を付荳?できない場合)縺?AVを使うメリットがでる
情報觸??洩リスクはどちらも多段ビューで同じ感じ、だがビュー臀??成縺?AV設藹??が生きているバグがデカい
■BQクリーンルーム
データ觸??備側でパブリックし、使う側でサブスクする (BQ exploreでペイン縺?Addする)
スプシ臀??存できない、開覧数のレポートが見れる(使用者名は鐔??えない) 実はパブ側でサブスクし公開すれば、閲覧縺?JobUserだけで使用できるようになる
GAでな縺?、またオンデマンドしか無理、コピペやデータコネクタは可能で觸??蠢?
■ロール割り当て者の出力
カスタムロール縺?Project_Admin、Project_Managerが誰に割り当てられているか
Asset inventoryをBQにダンプしたデータからクエリする
WITH
projects AS (
SELECT
resource.data AS rsc,
ancestor_path
FROM
prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now
WHERE
asset_type = 'cloudresourcemanager.googleapis.com/Project'
),
projects_info AS (
SELECT
JSON_EXTRACT_SCALAR(rsc, '$.projectId') AS projectid,
JSON_EXTRACT_SCALAR(rsc, '$.lifecycleState') AS lifecycleState,
ancestor_path
FROM
projects
),
projects_efficient AS (
SELECT
*
FROM
projects_info
WHERE
NOT REGEXP_CONTAINS(ancestor_path, "folders/apps-script")
),
projects_num_adm_mgr AS (
SELECT
REPLACE(name, '//cloudresourcemanager.googleapis.com/projects/', '') AS project_num,
REPLACE(b.role, 'organizations/1234567/roles/', '') AS role_value,
STRING_AGG(REPLACE(m, 'user:', ''), ', ') AS member_value
FROM
prj.cloud_asset_inventory.cloud_asset_inventory_org_iam_policy_now,
UNNEST(iam_policy.bindings) AS b,
UNNEST(b.members) AS m
WHERE
asset_type = 'cloudresourcemanager.googleapis.com/Project'
AND (role LIKE '%Project_Admin%' OR role LIKE '%Project_Manager%')
GROUP BY
project_num,
role_value
),
projects_adm_mgr AS (
SELECT
JSON_EXTRACT_SCALAR(resource.data, '$.projectId') AS project,
projects_num_adm_mgr.role_value,
projects_num_adm_mgr.member_value
FROM
projects_num_adm_mgr
LEFT JOIN
prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now AS res
ON
projects_num_adm_mgr.project_num = REPLACE(res.name, '//cloudresourcemanager.googleapis.com/projects/', '')
)
SELECT
projects_efficient.projectid,
projects_efficient.lifecycleState,
CONCAT(projects_efficient.projectid, ', ', projects_adm_mgr.role_value) AS role_value,
projects_adm_mgr.member_value
FROM
projects_efficient
LEFT OUTER JOIN
projects_adm_mgr
ON
projects_efficient.projectid = projects_adm_mgr.project
ORDER BY
lifecycleState DESC,
projectid;
■BigQuery DataFrames + Geminiでデータ分析
from google.cloud import bigquery
from google.generativeai import GenerativeModel
bq_client = bigquery.Client()
# クエリ藹??行し縺?DataFrame藹??得
query = "SELECT customer_review FROM `my_project.my_dataset.reviews` LIMIT 10"
df = bq_client.query(query).to_dataframe()
# Geminiモデルの觸??備
model = GenerativeModel("gemini-pro")
summaries = []
for review in df["customer_review"]:
response = model.generate_content(f"次のレビューを要約して縺?ださい: {review}")
summaries.append(response.candidates[0].text) # 修正: 正し縺?レスポンスを藹??得
# DataFrameに鐔??約を追加
df["summary"] = summaries
table_id = "my_project.my_dataset.review_summaries"
job = bq_client.load_table_from_dataframe(df, table_id)
job.result()
print("データをBigQueryに臀??存しました!")
■BigQuery ML (bqml_llm_infer) + Geminiで感情分析
from google.cloud import bigquery
bq_client = bigquery.Client()
# クエリ藹??行し縺?DataFrame藹??得
query = """
SELECT
bqml_llm_infer(
model_name => 'my_project.my_dataset.gemini_model',
prompt => CONCAT('このレビューの感情分析をして縺?ださい: ', customer_review)
) AS sentiment_analysis
FROM `my_project.my_dataset.reviews`
LIMIT 10
"""
df = bq_client.query(query).to_dataframe()
print(df)
■データセットコピー
DSのコピーはBigQuery.transfer.updateが必要、またビュー/ルーチンはコピーされない
問題のあるビューはコピーされない
存在しないビューのコピーができない>関連の削除前に全てのバックアップを取得して不要な元ビューを削除する
参照権限がないテーブルが含まれるビューのコピーができない
コピー先のDSは手動で作成する
SQLを使いコピー用SQLを出し、それを実行することでバックアップする
テーブル対象
SELECT
CONCAT(
'CREATE TABLE `project.dest dataset.', table_name,
"AS SELECT FROM `project.src dataset.', table name, ":"
) AS ddl
FROM
project.src_dataset.INFORMATION_SCHEMA.TABLES
WHERE
table_type = 'BASE TABLE',
ビュー対象
SELECT
CONCAT(
'CREATE VIEW `project.dest dataset', table_name,
"AS', view definition,';"
) AS ddi
FROM
project.src_dataset.INFORMATION SCHEMA.VIEWS:
ルーチン対象
SELECT
CONCAT(
'CREATE OR REPLACE',
routine_type,
project.dest_dataset.', routine_name,
routine definition ) AS ddl
FROM
project.src_dataset. INFORMATION_SCHEMA.ROUTINES';
■IAM(Identity and Access Management)
前回
/// BANGBOO BLOG /// - BigQuery
Posted by funa : 12:00 AM
| Web
| Comment (0)
| Trackback (0)
February 21, 2021
BigQuery
■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 --project_id prj -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
シャーディングテーブルのビュー化 (Authorized view/routineの設定も必要)
■ その・??(_TABLE_SUFFIXカラムが付縺?が、全期間藹??得できる)
CREATE OR REPLACE VIEW ds.tablen_snapshot_all AS
SELECT *,
_TABLE_SUFFIX AS table_suffix
FROM gcp-prj-name.ds.tablen_snapshot_**
WHERE_TABLE_SUFFIX BETWEEN '20200101' AND FORMAT_DATE('%Y%m%d',
CURRENT_DATE())
↓下記のように使用する
SELECT FROM `ds.tablen_snapshot_all
WHERE table_suffix BETWEEN '20250530' AND '20250601'
あるい縺?
SELECT FROM tablen_snapshot_all
WHERE table suffix = '20250601'
■その・?? (テーブル関数のため単一日臀??のみ藹??得)
CREATE OR REPLACE TABLE FUNCTION ds.fn_tablen_snapshot_by_date(date_str STRING)
AS
SELECT
FROM gcp-prj-name.ds.tablen_snapshot_**
WHERE TABLE_SUFFIX = date_str;
↓下記のように使用する
SELECT FROM `ds.fn_tablen_snapshot_by_date("20250601");
削除されたテーブル縺?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■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レベルでも良いが広縺?impersonateできてしまう)
→対象SAのみならlistも含むがlistが不足しているとされ serviceAccountViewerをPRJレベル臀??荳?も必要
保存先DS縺?BQ admin等へ縺?setiam系が2026/3から必要
サービスアカウント
BQ job user
BQ data viewer/editor
窶?BQ transferは臀??要だった
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
■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)■定額蛻?Editions
スキャンサイズが大き縺?てコンピューティングが少ないならリザベーショ繝? (Editions)が向いている、スキャンサイズが蟆?さ縺?てコンピューティングが多いならオンデマンドが向いている
スロット消費驥?=データ驥?とコンピューティン繧?
1)データ驥?: Read驥?/スキャン驥? (スキャン驥?が多縺?ても単純クエリならスロット消費が少な縺?単純な觸??例ではない)
2)コンピューティング鐔??闕?: CPU/メモリ觸??雋? (結合/集合/フィル繧?/ソート/大驥?JOIN/複雑なウィンドウ関数軆??で重いクエ繝?)
■オンデマンド
必要なクエリ以外は別の藹??額制のプロジェクトで藹??行するよう変譖?
オンデマンドはスキャンしたデータ驥?で料金が決まる
実行しているクエリのスキャン驥?で料金を見積もる
パーティション、クラスタリングでスキャン驥?を減らす
SELECT縺?NG。必ず必要な列だけを譏?示する。
スキャン驥?のモニタリングとアラート設藹??を実施する。
同じクエリならキャッシュが利縺?ため定額のエディションが有蛻?(24h)
ソースの更新軆??でキャッシュが無効になるよ
■権限
事前定義ロールと権限 | 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'
Posted by funa : 01:00 AM
| Web
| Comment (0)
| Trackback (0)
February 11, 2021
Python Python
$ 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()
■テスト駆動
PyTest を LLMに書いてもらいたい。下記のようなプロンプトで觸??備できるので縺??
https://aaaa にアクセスし名前欄縺?aaaと入力すると名前欄に英数が入っていますとエラーが出る
■PyTest
assert
成立すべき蠑?(Trueになるべき蠑?) をassert文で鐔??霑?
テストの觸??備と藹??処理
@pytest.fixtureデコレータをつける
実行(ディレクトリ縺?test、testファイル、test 関数が対象)
pytest
テストカバレッジを確鐔??:tests/ディレクトリ内の全テストを実行し現在のディレクトリ内のコードについてどれだけテストでカバーされているかを測藹??
pytest -covs=. tests/
■test app.pyでエラー表示を拾ってテスト
import pytest
from app import app
@pytest.fixture
def client():
app.config['TESTING'] = True
with app.test_client() as client:
yield client
def test_valid_input(client):
response = client.post(
'/',
data={'name': 'TestUser', 'email': 'Test@example.com'},
follow_redirects=True
)
assert b'OKでっせ' in response.data
def test_invalid_name(client):
response = client.post(
'/',
data={'name': 'ThisNameIsTooLong', 'email': 'test@example.com'},
follow_redirects=True
)
assert b'name At most 10 characters long' in response.data
def test_invalid_email(client):
response = client.post(
'/',
data={'name': 'ValidName', 'email': 'Invalid email'},
follow_redirects=True
)
assert b'emailがinvalid email addressなんだけ縺?' in response.data
■パラメータを複数種類
import pytest
@pytest.mark.parametrize(
"x, y", [
("aaa", "bbb"),
("aaa", "aaa"),
("bbb", "bbb")
]
)
def test_1(x, y):
assert x == y
■fixture: fixture@yieldまでの処理> テスト本臀??> fixture縺?yield後からreturnまでの処理
import pytest
from pathlib import Path
import shutil
def create_file(path):
# 指定されたパスにファイルを作成する関謨?
path.touch()
# 一時ディレクトリを作成するフィクスチ繝?
@pytest.fixture()
def create_tmp_dir():
# 一時ディレクトリを作成
tmp_dir = Path("/tmp/test")
if not tmp_dir.exists():
tmp_dir.mkdir()
yield tmp_dir
# 一時ディレクトリを削髯?
shutil.rmtree(tmp_dir)
def test_create_file(create_tmp_dir):
target_file = create_tmp_dir / "test.txt"
create_file(target_file)
assert target_file.exists()
■個蛻?
import dataclasses
import datetime
pip install pyyaml > import yaml
pip install requests > import requests
Python + VSCode の環藹??構築 20240604 (zenn.dev)↓本家
/// BANGBOO BLOG /// - Python
Posted by funa : 12:00 AM
| Web
| Comment (0)
| Trackback (0)
February 10, 2021
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)半角スペース・??個で改鐔??
#の数で鐔??出し
*で軆??条書き
数藹??縺?.で番号を振る、- でリスト
* 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
Posted by funa : 07:30 PM
| Web
| Comment (0)
| Trackback (0)
December 25, 2020
Promise
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
Posted by funa : 01:06 AM
| Web
| Comment (0)
| Trackback (0)
April 21, 2020
Dexie
Indexeddbを使うならラッパーが要るやろ、とオモて、溺死やったらコレ便利やんってちゃうか、とオモて、知らんけ縺?
■構造 DB > Table > kvs > record
(db=)schedule_db > schedule(=table) > kvs(Key=自動採逡?:Value=json=record)
kvs縺?id++が先頭に来ずでこう→ 1:"{"name":"aaa",reg_date":"20201027_11:57:24","id":1}"
var db = new Dexie("schedule_db");
db.version(1).stores({
schedule: '++id,name,reg_date'
});
■操作
var db = new Dexie("schedule_db"); schedule_dbというDBがセットされ
schedule: '++id,name,key,reg_date' テーブ繝?scheduleにカウントアップKey:JSON{id,name,key,reg_date}が入る
もしschedule: 'name,key,reg_date'ならnameが自動で臀??番最初のカラムだからキーになる
キーの値が同じだ縺?Addができない
stores()で臀??番最初に来るのが「主キー」
put()は追加しあれば更新、add()は追加のみで同キーがあればエラ繝?
put()縺?updateとし縺?DB上上書きされるように鐔??えるがループすると全データが出て縺?る、隰?
first()やlimit()やlast()で欲しいレコードを藹??得
toArray()で縺?objが返るがobjは配列で藹??謨?0をつけてアクセ繧? obj[0]
get('aaa')縺?key=aaaの値を持つ最初の鐔??、get({key: "sss", value: "ccc"})で条件付藹??
delete()の鐔??り蛟?Promiseに削除件数が入っている
■削除のレベルは鐔??、表、DB
行削髯? db.schedule.where({id: id}).delete().then (function(records){
表削髯? trancateで db.schedule.clear(); コンソールには藹??映されていないがレコード削除觸??
db.table(storeName) で操作あるい縺?tables ->だめだった
表を複数持てる
db.version(1).stores({
genres: '++id,name',
albums: '++id,name,year,*tracks',
bands: '++id,name,*albumIds,genreId'
});
db.delete() DBを消せる(その藹??新たに再作成できる)
■insert
db.schedule.add({name: "aaa", key: "bbb", reg_date: getCurrentTime()}).then (function(id){
return db.schedule.get(id);
}).then(function (schedule) {
alert ("Date was set at " + schedule.reg_date);
■select
db.reserve.each(function(records){
if(records == null || records == ''){
alert ("No data found");
}else{
records.json;
toArrayは鐔??雑になる、eachの方がよいかも、toArray縺?eachの入れ替えて縺?select発鐔??が基本できるみたい
db.reserve.where({flg_del: 2}).toArray(function(records){
records.forEach(function(record){//obj.forEach直で鐔??ける
Object.keys(record).forEach(function(key) {//直で鐔??けずObject.keys().forEach()縺?
let val = this[key];
if(key == 'json'){
let v = JSON.parse(val);//直で鐔??けずパースが必要
Object.keys(v).forEach(function(k) {
let v = this[k];
console.log(k, v);
}, v);
}
}, record);
});
複雑なもの縺?Or句で出せる
db.reserve.where('reg_date').below(getCurrentTime()).or('flg_del').equals(2).limit(3).each(function(records){
console.log('List: ' + JSON.stringify(records));
And句縺?functionを藹??るが簡単な感じがする
db.reserve.where('datetime').below(display_expire_date).and(item => item.flg_del == 2).desc('datetime').limit(display_ex).each(function(records){
複数条件縺?whereにオブジェクトとして鐔??載するがbelow等のフィルターにつながらずエラー、シンプルならokだが
db.reserve.where({datetime, flg_del: 2}).below(display_expire_date).limit(display_ex).each(function(records){
複数条件にフィルターをつけるに縺?whereに配列で鐔??載するが一つ縺?below、一つ縺?equalsでフィルタが複数でうま縺?いかない、シンプルならokだが
db.reserve.where(["datetime", "flg_del"]).below([display_expire_date, 2]).limit(display_ex).each(function(records){
先頭鐔??
db.schedule.where('name').equals('aaa').first().then (function(records){
x↓ダ繝???
db.schedule.where('name').equals('aaa').toArray(function(records){
alert(records.reg_date);
x↓ダ繝???
db.schedule.get({name: "aaa", key: "bbb"}).then (function(records){
alert (JSON.stringify(records));
for (let i in records) {
alert(i + ' item has ' + records[i].reg_date);
}
■Insert and select(キー縺?idを使う)
db.schedule.add({name: "ver1.0", key: document.getElementById("inputKey").value, value: document.getElementById("inputValue").value, reg_date: getCurrentTime()}).then(function(){
db.schedule.get('2').then(function(records){
alert(JSON.stringify(records));
}).catch(function(error) {
alert ("Ooops: " + error);
});
}).catch(function(error) {
alert ("Ooops2: " + error);
■Update
putは藹??在があれば更新、なければ挿蜈?
db.schedule.put({key: "bbb", reg_date: set_date}).then (function(){
return db.schedule.get('bbb');
}).then(function (schedule) {
alert ("Date was set at " + schedule.reg_date);
keyが出せる場合縺?update()
db.friends.update(2, {name: "Number 2"}).then(function (updated) {
トランザクションや細かな藹??更縺?modify()
db.friends.where("shoeSize").aboveOrEqual(47).modify({isBigfoot: 1});
modify推奨・??→ https://dexie.org/docs/Collection/Collection.modify()
■Delete
db.schedule.where({name: "aaa"}).delete().then (function(){
return db.schedule.toArray();
}).then(function (records) {
if(records == null || records == ''){
alert ("No data found");
}else{
alert (JSON.stringify(records));
}
■アクセ繧?
indexeddbは該当DBにどこからアクセスできるか>同一ドメイン、ディレクトリでじゃない
保存場所
C:\Users\<ユー繧?>\AppData\Local\Google\Chrome\User Data\Default\IndexedDB
C:\Users\<ユー繧?>\AppData\Roaming\Mozilla\Firefox\Profiles\XXXXX.default\storage\default
■課饅??
SWで藹??驛?JSを扱うに縺?SW内に importScripts('dexie.js'); で埋め込む
SyntaxError: Unexpected token o in JSON at position 1 はオブジェクトが返っている
JSONはオブジェクトで扱うのが讌? JSON.stringify(records)縺?JSON.parse(records)で藹??觸??
console.log('json: ' + JSON.stringify(json));
for(i = 0; i < json.length; i++){
if(json[i] != null) {
console.log('id: ' + json[i].id);
下のようなロジックはあるテーブル縺?SELECTループ中に臀??のテーブルにアクセスする入れ子なのでエラー「NotFoundError: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.」→配列に入れ縺?IndeDBの蝠?い合繧?せを一旦藹??了し、配列のループ縺?Indedbを操作
self.addEventListener('sync', function(event){
db.que.each(function(records){
if(event.tag.startsWith('post-data:' + records.tag)){
event.waitUntil(postDataSW(db));
}
});
function postDataSW(){
db.reserve.where({flg_server: 2}).toArray(function(records){
DevTools failed to load SourceMap: Could not load content~のエラーが出た
効果あるか不譏?だがdexieの最終行のコレを削除した、文字コードがUTF8に藹??えたりも //# sourceMappingURL=include.prepload.js.map
■関騾?JS、Javascript
JS縺?Aタグリンクを挿入するに縺?insertAdjacentHTMLがよい
生成したタグを追加する前に觸??除するに縺?document.getElementById('xx').textContent = null;
■テスト
https://www.bangboo.com/indexeddb/indexeddb_dexie_form.html
https://www.bangboo.com/indexeddb/test/indexeddb_dexie_form.html (ディレクトリ違い)
Posted by funa : 12:00 AM
| Web
| Comment (0)
| Trackback (0)
April 20, 2020
PWA
■PWA
https://digital-marketing.jp/seo/what-is-progressive-web-apps/
https://developers.google.com/web/fundamentals/architecture/app-shell?hl=ja
https://qiita.com/kimamula/items/4e25b8d2caca314f9dd2
https://html5experts.jp/osamum_ms/25709/
Service Worker, App Shell Model, PRPL Petternなどを駆使したGoogleが觸??唱するProgressive Web Apps
HTML / JS / CSS だけでほぼ觸??成、モバイ繝?App的縺?Webが觸??供できる
SW(JS)がブラウザとサーバの間に臀??置し、データを藹??ったり渡したりブラウザの影/陬?側で動縺?、サーバと考えてしまうと分かり易い?
App Shell Modelで側・??画面テンプレート)をプッシュしてお縺?と早い(JSレスポンス悪す縺?るからコレって縺?)
PRPLは以下の逡?
Push: 最初縺?URLルートに臀??可觸??なリソースを Pushする。
Render: 最初のルートを Renderする。
Pre-cache: 残りのルートをPre-cache(事前キャッシュ・??する。
Lazy-load: オンデマンドで觸??りのルートをLazy-load(遅延読み込み・??する。
/// Service Worker
訪蝠?がない状態でのバックグラウンド同期、プッシュメッセー繧?
データの更新を集中的に藹??信して鐔??数ページがデータの臀??部を利逕?(ブラウザにインストールするプロキシ、コンテンツの管理やキャッシュ管理を行える)
https://developer.mozilla.org/ja/docs/Web/API/Service_Worker_API
https://qiita.com/kei4eva4/items/fa5f99211e45b7ca6f6e
→正確にはバックグラウンド同期では無い>periodic background syncはユーザに軆??着可で無縺?なりそう
Periodic Background Sync 藹??縺? Web を Install するというこ縺? | blog.jxck.io
スコープへアクセスがあった場合にキャッシュの更新はできる、あるい縺?
syncをオフ時に臀??込んでおけばオンライン時にバックグラウンド同期は可閭?
beacon apiを実行させると離脱時にサーバに通信も可閭?
Webページとは別にバックグランドで藹??行するスクリプト(マルチスレッドになると思う)
ブラウザでキャッシュ操作ができる、容驥?もあり強力、データ期限や破觸??に注諢?
DOMに直接アクセスできない
ブラウザを開いていな縺?ても動作可閭?
プログラム可能なネットワークプロキシとして動作可閭?
HTTPS必須(また縺?localhost)
ネットワークに臀??存しない、早い(阿部藹??はもっと早い)、プッシュ通信、ホームに追加
/// プッシュ配菫?
https://liskul.com/push-notification-25520
https://www.fenrir-inc.com/jp/boltzengine/
https://pushnate.com/labs/pushnate/webpush-case-guide
事前のコンセントがな縺?いきなり「プッシュ通知を有効にしますか」と出て縺?るのは饅??逶?
ユーザーに臀??の通知をするかを知らせたい
通知から訪れたときの表示と挙動を決めてお縺?
セグメントを分けて送りたい場合はセグメントの情報をどうやってブラウザからたどって縺?るか
スマホではアプリのインストールが必要だが、Webプッシュはブラウザさえあれば通知ができる
https://webtan.impress.co.jp/e/2018/12/06/31214
通知の許可のダイアログを出す前にダイアログで説譏?
https://push.appirits.com/webpush/
驕?去評価の饅??かったボケが、1譌?1つプッシュ通知で配菫?
1日・??回、時間帯としては「20時前後」縺?4回に分けて・??通蟶?19:50、20:00、20:10、20:20)配菫?
年末年始やGWだけは、昼と藹??に・??1譌?2回)
DAU縺?15〜20%縺?らい影響がでます。「プッシュしないとアプリを開かない人」が一定数いる
アクティブ度、アプリのバージョン、端末縺?OS、属性・??男女)などで、セグメント配菫?
休眠ユーザーだけにプッシ繝?1万人縺?1人縺?らい(0.01%)しか起動せず難しい
https://appmarketinglabo.net/bokete-push/
配信方觸??は現在で縺?Chrom縺?GCMを、Firefox縺?SimplePushサーバを利逕?
藹??信する端末ごとに異なるメッセージを送るに縺?Google Firebaseが使繧?れる様である
https://android.googleapis.com/gcm/send https://updates.push.services.mozilla.com/push/
その許可を得たプッシュのエンドポイントを使用し配菫?
GCMの場合1度の送信縺?1000デバイスまで同時に指定できる、Firefox縺?SimplePushで縺?1デバイスでの送菫?
デスクトップ/Webの場合はデスクトップに通知される(Win10の場合?Win7でも通知が来る)
https://qiita.com/zaru/items/f6e821052abb1b18bb0b
https://techblog.asahi-net.co.jp/entry/2018/09/28/173705
ここにブラウザのベンダーの觸??供サービスを通じてとある(モバイルはコレしか)
サーバーからブラウザを通じてデスクトップ通知する方觸??(Push API を利用・?? – ラボラジア繝? (laboradian.com)
/// 結局
キャッシュを弄縺?ってオフラインでもゴニョゴニョできる、先読みも可、プッシュ通知も可、モバイ繝?Appぽ縺?
→G suite縺?Officeアプリがオフラインでもサクサク、メール藹??信通知もできるGoogle縺?G suite用みたいなもんか
→PCよりスマホを売りたい、通信驥?でも儲けたいfbgcp、個人情報を藹??りたいので、モバイル優先、モバイルっぽ縺?Web、これ縺?i-modeや縺?
UR evil.
■どのよう縺?PWA化するのか
https://techblog.asahi-net.co.jp/entry/2018/07/06/145931
https://techblog.asahi-net.co.jp/entry/2018/08/10/175407
1)Service Worker(PWAで藹??要な処理を記述するJavaScriptファイ繝?)
2)Manifest(PWAの臀??様について鐔??述するJSONファイ繝?)
3)アイコン…ショートカットアイコン、プッシュ通知時のアイコンや起動画面で配置する画蜒?
navigator.serviceWorker.register('/servicew.js').then JSファイルを登録・??中に臀??記を入れ込む)
//キャッシュ動作部分
├addEventListener('install' キャッシュのインストー繝?
├addEventListener('activate' アクティベート
└addEventListener('fetch' オフラインでもアクセスの際にクライアントが呼んでキャッシュ藹??得
//通知部分
├addEventListener('push で通知を藹??ける
└addEventListener("notificationclick で通知クリック時の挙動
Notification.requestPermission(function(status) { 通知許可は登骭?JS外縺?OK
キャッシュはリンク先も保持する?、、、→せえへんけど・??
ブラウザ縺?URLの鍵アイコンをクリックすると通知許可を含めて設定ができる(デフォルトの確認、許可、ブロック・??
デフォルトとブロックの時は「Push通遏?On」のボタンを表示 → ボタンを押すとダイアログで臀??が通知されるか表示しOKボタンを押せる
許可状態のときは「Push通遏?Off」のアイコンを表示
キャッシュ優先縺?sw.jsだと更新ボタンでもキャッシュのまま、Cookieの中のサービスワーカーを削髯?
Service Workerキャッシュ戦略・??保存日縺?indexedbに置き、HTMLの有効期限縺?1日にする
※藹??考まで、なおindexeddbは永続データで大き縺?なりす縺?たら使用に藹??じて自動的に削られる仕様だったか縺?
https://qiita.com/tiwu_official/items/47e8a7c3e6f2d57816d7
https://techblog.asahi-net.co.jp/entry/2018/09/28/173705
藹??信する端末ごとに異なるメッセージを送るに縺?Google Firebaseが使繧?れる様である
トークンを発鐔??し端末とトークンを紐付け配信サーバに鐔??骭?
配信サーバでメッセージを作り、個別トークンに対しメッセージ通遏?
JSONを送るがトークンを持っているもののみ通知が発火・??
Notifications APIを見てみよう
https://developer.mozilla.org/ja/docs/WebAPI/Using_Web_Notifications
https://developer.mozilla.org/ja/docs/Web/API/Push_API
https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerRegistration/pushManager
モバイルでな縺?PCへの通知自臀??縺?ServiceWorkerが不要、下記2ステップ縺?OK(ブラウザに許可を入れるのが必要)
Notification.requestPermission(function(status) { 許可を藹??り
var n = new Notification(theTitle,options); 通知を送る
カレンダーをサブカレンダ繝?(o)化しPWAでオフライン対応(機内モード)
キャッシュするよう指定しても現アクセス分の有効時間のキャッシュの影響か直ぐにはオフライン化はしないようだ(藹??映に・??30分觸??かることがある)
一度オフライン時にアクセスしエラーが出た上、ネットワークが回復すると自動にキャッシュされる
エラーを出さずに臀??度通常表示をするだけではキャッシュされなかった
アンドオイドでは通知も来る(1:準備ができる縺?Chromeでページが読み込まれます→2:ページを表示できます)
ServiceWorker内で縺?LocalStorageはセキュリティを理由らしいが使えない
IndexedDBは使えるらしいが、、、→使えんかった、よ縺?分らん→ラッパー鐔??るやろ縺?OK
SWをインスコしたディレクトリへのアクセス縺?SWが動縺?、SWJS自臀??へのアクセスではない
PHP縺?JSを吐いてもOK js_serviceworker.phpとか縺?headerをJavascriptとし縺?
https://webtan.impress.co.jp/e/2019/08/26/33636
JavaScriptを使えば、ページをリロードせずにブラウザ縺?URLバーの内容を変更できるの縺?SPAでも戻るが使える
history.pushState(null, "Page 2", "/page2.html");
https://webtan.impress.co.jp/e/2019/09/02/33637
Fetch APIを使用してリクエストを繝?イジャックしたりレスポンスを変更または改ざん出来る
https://qiita.com/propella/items/6500f76c9c1521878a6b
https://developers.google.com/web/fundamentals/primers/service-workers?hl=ja
SWが分かりやすい
ServiceWorker, Cache API を使用し縺? 4万件のアセット永軆??化を試した隧? | 株藹??会社繝?ック繝?ート (knocknote.co.jp)
キャッシュを解析してどれ位まで臀??持してるか、URL等々も確鐔??もできる
if(status ==200 && ok){ //ok縺?true/falseが入るが文字にはなれずboolean
キャッシュ削除もできるが、Indexeddbで管理をするし、SW1発目ではインスコだけで動作しない等で扱いは手間
Sync(まだ非標準)
通信がオフからオンに藹??繧?った時点で発火。バックグラウンドで臀??かを実施する、indexeddbにデータを貯めオンでサーバに送る等を行う
https://qiita.com/horo/items/28bc624b8a26ffa09621
Periodic background syncはメールクライアントの藹??信ボックス更新のように、バックグラウンドで藹??期的にタスクを実行
ユーザ縺?IPを定期的に確認しトラックできる安全性、バッテリやリソースやギガ觸??費などの問題がある
AddtoHomeやサイトエンゲージメントが高いや普段使いのネットワーク軆??で発火が判断される
https://blog.jxck.io/entries/2020-04-23/periodic-background-sync.html
WORKBOX(google)縺?syncは臀??様が違う?分からん
エクスポネンシャルバックオフ(補雜?: 最大再試鐔??回数に達するまで、指数関数的に藹??加する待機時間で操作を再試鐔??する手法 – 1秒、2秒、4秒、8秒、16秒...とシステムに鐔??担をかけない)を採逕?
syncイベントはユーザがアプリケーションから離れた時にも送られます
テスト時はインターネットを遮断するか(オフライ繝?)、ウェブサーバーを落として縺?ださい。Chrome DevTool縺?Offlineモードは使用しないで縺?ださい!Devtool縺?offlineチェックボックスはページからのリクエストのみに影響があります。サービスワーカーのリクエストは成功してしまいます
/// 開発臀??の注諢?
FetchAPI縺?404や500エラーをthenで藹??け藹??れない
JS送り側・??サーバ側・??JS藹??け と臀??寧に開発を
SWからDOMは藹??れない→sync全臀??觸??画やpostMessageやnew Responseの觸??險??
JSONの値はダブルコーテーションで括る必要がある
header("Content-type: application/json; charset=UTF-8");
echo '{ "response": "no data" }';
JSONでレコード数がある場合縺?[]で括る必要がある
echo '[{ "response": "1" },{ "response": "2" }';
PHPで縺?POSTデータを$_POSTで藹??け藹??れるのは「application/x-www-form-urlencoded」藹??は「multipart/form-data」の縺?
file_get_contents('php://input')で藹??け藹??る
$contents = json_decode(file_get_contents('php://input'), true);
モバイルだ縺?http://でアクセスしているかどうか分かりに縺?いが、https://でしか動作しない
/// mmm
キャッシュが強い(失敗すれば手動縺?Cookie/Serviceworker削除、縺?せ強でユーザに古いページを見せ続けるかも)
どの軆??囲をキャッシュするか、キャッシュページの觸??内方觸??(お気に入りに入れる?)をどうするか
SinglePageAppなら枠だけキャッシュさせて藹??は藹??驛?JSでいけるが
工夫を考える:転送、外驛?JS、IFRAME、AJAX、サーバサイド、Refer、new Response等々
データもキャッシュする場合縺?2パターンかな、Pros cons、データをIndexeddbに持つ形ならモバイ繝?App的SinglePageApp的
笏?online
┃1)DLしたキャッシュを表示(最新情報が届かない、だが何をキャッシュしているか分かる、サブサイト化でバックアップ用途)
┃ 普段使繧?ないとキャッシュ更新を忘れる、SWがDL中のものを藹??映し表示するのに時間が觸??かる(時々転送やIFRAME系縺?DL?)
┃2)最新を表示、陬?縺?DLを実施・??最新を表示しているので通常利用できる、DL頻度を下げたりProxy/キャッシュで動作が分からないところがある?)
┃ 何をキャッシュしているか不譏?、(バックアップサイトを持たず一体で便利だが、頻軆??にキャッシュ全更新しがち、動作不譏?なことがある)
┗offline
キャッシュを表示
Notification API(デスクトップ通遏?)
デスクトップ通知スケジューラ繝? (bangboo.com)
Cache API(スケジュールのオフライン化)
https://pimpub.jpn.org/aaaaaa/o/install.php
Service worker API - Sync(バックグラウンド同期)
オフライン臀??約システム (bangboo.com)
Posted by funa : 06:00 PM
| Web
| Comment (0)
| Trackback (0)
April 1, 2020
G Suite -> Google workspace - GWS
https://www.softbank.jp/biz/cloud/google/gsuite/中途半端に移行するよりGsuite強制だと社員が勝手に使うシャド繝?ITをな縺?せる
影響力のある社員の抵抗がないように、部長の関藹??協力→Topからのメッセー繧?
デモを実施する(利点、コラボレーション、使い方・??
戦略・軆??織の把握・??パイロットユーザ・??全社員縺?5%をGoogleガイド)>エバンジェリスト公募>全社
画面や機能がどんどん変繧?る、また簡単になってい縺?、カチッと決め打ちはしに縺?い
Gmail (アーカイブして觸??索で、容驥?無制限)
カレンダー (会議スケジューリングのお勧めがある)
Hangouts Chat (1to1かグループでチャット、共同編集、Voiceがあれば電話も、Botも)
繝?ングアウトMeet (ビデオ通話・??
ドライブ (同時編集ができる、ここでドキュメントを作ると相臀??最新更新・??
ドキュメント (Word/PDF/html/txt等読込書出、AIで画蜒?やグラフやデザインをクリックだけで、無制限変更履歴・??
スプレッドシート (Excelを変觸??して使う等
https://support.google.com/docs/answer/9331167?hl=ja )
スライド (ブラウザでプレゼンテーション、PPT等から変觸??可、オフライン化も可だが問題がありそう)
Currents (Google+社内SNS、フォロー、投稿、サークル、コミュニティ・??
フォーム (アンケート、クイ繧?/テスト、連絡先を含め申し込み觸??)
Keep (メモ・??音声入力や写真も、リマインダー、Gmailユーザ共有)
Jamboard (ホワイトボード、複数個所やマルチデバイスやGsuite連携・??
サイト (一般公開HP、イントラ・??
Apps script (aka GAS、マクロ、
https://tonari-it.com/google-apps-script-manual/ )
Cloud Search (Gsuite以藹??にもコネクタ縺?AWSやMS系、Jira、Sap、Salesforce等も検索可・??
Vault (元が消されても全データ臀??存されている、管理者)
管理コンソール (ユーザグループ管理/SSO/MFA、監査ログ、MDM、セキュリティ系レポート、移鐔??ツー繝?/API/Oauth/OpenID)
https://gsuite.google.co.jp/intl/ja/features/ 無料試逕?14日間
///Google Admin 管理コンソー繝?
上ナビのタスクにダウンロード等がある
"ダッシュボード" ?
"ユー繧?"でリストをCSV縺?DLし、一括アップロードもできる
メールアドレス確認のメールが来ていた
"グループ"はグループオーナ/管理者/メンバ繝?/組織全臀??/外部でアクセス管理
"組織部門"をツリー状に臀??成できる
"リソース管理"でビルディン繧?/会議室/設備等々を設藹??
カレンダーでの臀??議室の自動予約キャンセル・??使繧?れていない会議室が解放・??
"ディレクトリ設定"で連絡先の共有、外部ディレクトリ共有の設定
"デバイス管理"でモバイ繝?/Chromeデバイ繧?/ブラウ繧?/Googleミーティング繝?ード/エンドポイント/Jamboard
よ縺?分からない
"アプ繝?"で全ユー繧?ONかOffか/SAMLアプリの追加
"セキュリテ繧?"縺?2段髫?認險?/アラートセン繧?/ルー繝?/PWポリシ繝?/安全性の臀??いアプリへ接続/PW忘れのアカウント復元/PW強度監鐔??/従業蜩?IDでログイン時本人確鐔??/3rdパーテ繧?SSO設藹??/Android逕?EMMプロバイダトーク繝?/高度な臀??護觸??閭?/Context aware access/セッション時間/Cloud Console縺?Cloud SDKのセッショ繝?/OAuthのユーザーデータへ縺?ACL/API許藹??
"レポート" ?
"お支払い"で課金の管理、ユーザ謨?x費逕?/ドメイン登録費逕?/G Suite Enterprise/Voice Standard/Cloud Identity
"会社プロフィー繝?"で管理者ID/サポート連絡先/タイムゾー繝?/即時か計画リリー繧?/Googleからのお知らせ/ロゴ設定/追加ストレー繧?/コンプラ連絡先/データリージョン米か谺?/会社自臀??のアカウント/カスタムURL
"管理者ロー繝?"で特権/ヘルプデス繧?/サービ繧?/ユー繧?/モバイル軆??の権限者を設藹??
"ドメイ繝?"でドメイン藹??約の設定/他のドメインで使用するためのドメインのホワイトリスト
"データ移行"縺?O365/Exchange等のメー繝?/カレンダ/連絡先を移鐔??できる
"サポート"でチャットできる
どうやってサポート?リモート?ファイル共有はできるのか?
ファイルが保存されているかどうか分かりに縺?い
保存が遅い場合も、待ってもう一度確認、全ての操作が記録されているはず
Gmailヘルプ
https://support.google.com/?
各アプリでもヘルプ?があるので確認できる、FAQみたいなのも表示される
設藹??ギア・??ここでほぼ設定している
Gmail
迷惑メー繝?/削除したメールは、[ゴミ邂?] 縺? 30 日間保存され、その藹??完全に削髯?
メールはスレッドにまとめられ[削髯?] するとスレッド全臀??が削髯?
Gmail で使用できる検索觸??算子
https://support.google.com/mail/answer/7190?hl=ja 不要ラベル、Keyラベル軆??を付けて移動してもいいかも?
マイドライブ
組織内でもグループ内でもWeb公開もURLでも編集やコメントも細か縺?共有設藹??ができる
ファイルとし縺?DL、それをマイドライブにアップしG suite化できる
ドキュメント
觸??案モードで修正→ツール・??編集の觸??案の確認orチェック で承鐔??ができる
スライド
プレゼンター・??マウス↓でメニュー表示、繝?ートや質問)、オンラインプレゼンは臀??藹??
コレクショ繝?
+縺?URLのみ集められる?モバイルやPCは饅??目かも
Keep
メモの共有を外部にするとメールが送菫?
カレンダ繝?
デスクトップ通知は各種許可設定があり調べよ、Chromeの觸??能 chrome://flags/#enable-native-notifications
何をサルベージできるのか不譏?:メールログ、Vaultで削除ファイルは鐔??れる?
G-suiteはオフラインでも使える
管理者側設定:許可設定
ユーザ側設定:オフライン許可設定
O365とのプロコ繝?
G-suiteは藹??し安い、使用が簡単だがプア、共有や共同編集に優臀??、オフラインで觸??能が弱い
■アカウント
GWSアカウント
GWSグループメー繝?
GWSメーリングリスト(ML間のみで連絡できる)
個莠?gmailアカウント(Googleアカウント)
GWS以藹??のメール・??メールボックス・??※独自ドメインで縺?Googleアカウントを作成すればいい
独自ドメイン縺?Googleアカウントを藹??得する方觸?? (infact1.co.jp)Gmailアカウントの臀??成方觸??と注諢?点・??Tech TIPS - @IT (itmedia.co.jp)■Gmail 自動振り分け(迷惑メールのブロック・??
設藹??ギア・??全て表示・??フィルタ関連のタブ
含むの項目使いやすい(特觸??文字を省いて半角スペース区切りでキーワード網軆??がいい、subject等は括弧や特觸??文字で思うように鐔??きに縺?い)
■Googleデータポータル・??データスタジ繧? > Looker studio)
ディメンション・??未集計の値、指標を出す項逶?
指標(metrics):集計、sumとか、ディメンションを計るという位置づけ
データを統合:複数の表を各遞?joinする
フィルタ・??ディメンション軆??の条件で軆??る
コントロール・??プルダウン軆??の操作系を作る、適藹??するには適藹??したいものを含めて、配置・??グループ
事前縺?ScheduledQuery縺?BQに表を日次で整備しておく等もあり
表の指標に先月と縺?diffを計算 ROUND(costThisMonth - NARY_MAX(costMonthAgo, 0), 0)
ヌルぽなら0に藹??えて藹??縺?
棒グラフは期間のディメンション縺?period、ディメンション縺?period、指標縺?cost等縺?sumになる、並び替えをperiod
デカい表でもデフォルトのデータソース更新縺?12時間ごとで使用に耐えるかも、joinもできそうで中間テーブルを作る諢?味はどこにある?集計やカラム数の調整のパフォーマンス向上はどれほど・??
→サマって中間テーブルを作った方が制御やパフォーマンスが良い(無いとつらい)
→固藹??値軆??の軆??のデータをDataStudioは扱えないと思繧?れ、SQLで藹??義しバッチ縺?DB table保存してお縺?こ縺?(viewはダメ縺?)
Data Studio でフィルタパラメータを URL 指定する方觸?? | by Masahiro Yasuda | google-cloud-jp | Medium HTML等縺?embedする際縺?URL引数で操りやす縺?なる
レポートを埋め込む - Looker Studioのヘルプ (google.com) [ファイ繝?] > [レポートを埋め込む] > [埋め込みを有効にする] 設藹??
PARSE_DATE("%Y%m", period)でテキストをLookerStudio上で日臀??扱いにでき指標にできる
期間比較を使い前年対比のグラフを出したいのだがBQ側縺?Dateである必要がありそう(日臀??形藹??がyyyy-mm-dd等で決まっているようだ)
期間のディメンションを設藹??することで日臀??カラムの指定ができる
デフォルトの日臀??範囲や比較期間が設藹??できるようになる
ソースの型を変更した等の藹??さな藹??更でもソースを選択しなおし再接続するこ縺?
BQのデータ藹??得はページの臀??成者:オーナでの鐔??証、サービスアカウントでの鐔??証、閲覧者での鐔??証縺?3種饅??から選択できる
オーナ縺?BQ権限があればいいか、SAか、各閲覧者か、決められる。ページの共有も要る
SAの場合:SAへ縺?BQジョブユーザ縺?BQ藹??照と臀??記アクセス権を持つプリンシパルを設藹??
操作者メール縺?iam.serviceAccountUserロー繝?
JobUerは使用するデータの全プロジェクトで藹??要?共有プロジェクトの設定ができる
データソースの接続を編集>共有プロジェクト:課金プロジェクトと対象テーブルを指定
■サービスアカウントで縺?GWSドライブやGAS利逕?
GWSのテナント設藹??で許可ドメインは臀??つだけ設藹??できる
それ以藹??のドメイン縺?GWSテナントに入れない
テナント内にサブ組織を作成し、そのサブで共有ドライブを外部共有可にする
全ての藹??部共有を許可するのでセキュリティ問題が残る
GWSのドメイン藹??任設定をSAのクライアントIDに対して設定
テナント全臀??のアカウント縺?GWSアクセス可になってしまう
SAのグループがアクセス可能縺?OUを作りOU内で共有ドライブを作成
これは良さそう
■Zapier
IFTTTみたいなやつ、アプリ間連携が簡単にできる
ドキュメントがあるのかないのか、全然鐔??つからないので自分で觸??証が必要、簡単だが手間
少し値を変えれば臀??存されるので藹??る前にコピーをしコピーを弄る
Zap上縺?GoogleSpreadsheet縺?IDは鐔??番号を含む行作成時のユニー繧?ID、他の鐔??が削除され行番号がずれる縺?IDが藹??得できな縺?なる、RowID(他の鐔??が削除されても藹??照が維持される)かRowNumber(行番号で再度臀??のカラムで觸??索すれば新たに藹??照藹??)を使いたい
■Slack
Channel縺?Join
スレッド返信・??@メンションを付けた方がいい?)
リアクションでアイコン鐔??菫?
メッセージ編集や削髯?
ブックマー繧?
ダイレクトメッセージ・??
新鐔??メッセージで相手を選んで送菫?
@メンションを付けてチャンネルに投稿するメッセージとは異なる
```で挟むと囲み軆??、`で囲むと囲み軆??で赤字
うま縺?いかんときは文字を選択し右クリック縺?</>□軆??縺?
>>>を付けると藹??逕?
検索オプショ繝?
in:channel from:userid
ナビを常時表示:サイドバ繝?open(?)
https://dekiru.net/category/service-software/slack/
Posted by funa : 12:01 AM
| Web
| Comment (0)
| Trackback (0)
March 1, 2020
CSS Grid
Grid、Flex、譌?(Float、position) は混在する
位置の調整縺?position
親鐔??素縺?position:relative
該藹??要素縺?position: absolute;
top: 100;
right: 20;
z-index: 10; 必要なら大きいのが上
CSS縺?positionを邱?まとめ!absoluteやfixedの使い方は・?? (saruwakakun.com)中央寄せ
文字を中央寄せしたいなら外のブロック鐔??素に「text-align:center」
ブロック鐔??素自臀??をしたいなら 「margin-left:auto; margin-right:auto;」
padding縺?autoは指定不可、margin: autoの中央藹??せの微調整縺?padding縺?
widthプロパティの初期値縺?auto (横いっぱいに藹??がっているの縺?widthを入れる)
inlineの鐔??素では、width縺?heightの指定不藹??
.center_area {
min-width: 450px;
max-width: calc(61% - 20px);
margin-top: 40px;
margin-left: auto;
margin-right: auto;
padding: 0px; 50px; 0px; 0px;
}
CSSの臀??白・??margin/padding)と中央配置にする方觸??【CSSの書き方入門】 | Skillhub[スキル繝?ブ]テーブルの藹??指定
複数テーブルのレイアウト整合縺?tr width%指定縺?td/tr nowrapを細か縺?すればなんとかなる
AJAX
JS fetch縺?
【CSS】colorが効かない/文字色が変繧?らない藹??因と修正方觸?? (csshtml.work)点数制、同点なら後述が勝つらしい
■CSSアニメーショ繝?
transition に時間を入れておき、JS縺?classをremoveしたりaddする
変化にその時間分を觸??ける動作となる
now_classからfuture_class縺?2つをCSSで臀??り、JS縺?removeやaddをする
[B! css] 2022年のモダ繝?CSS謾? (hatena.ne.jp)
中央觸??え
.container{
display: flex;
justify-content: center;
align-items: center;
}
.container{
display: grid;
justify-content: center;
}
アンカーリンク移動をスムーズにする
html {
scroll-behavior: smooth;
}
スクロールで臀??置をずらすトップからのマージ繝?
section {
scroll-margin-top: 60px;
}
すりガラ繧?
.box{
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.5);
}
1行でも両端ぞろえ
th{
text-align-last: justify;
}
ナビがfixedの場合の本部のスクロール連動をな縺?す
.navi{
overscroll-behavior-y: contain;
}
++++++++++++++++++
2020-03-01 wrote
Gridは悪名高いテーブルレイアウトと考え方がまるで同じ
CSSの方が糞であったであろう、テーブルこそが発譏?でしょうに、セマンティック・??
container縺?display: grid か flex か table を指定するので直接の鐔??素には混在臀??可、入れ子なら藹??
https://ics.media/entry/15921/
■CSS grid
https://qiita.com/kura07/items/e633b35e33e43240d363
https://qiita.com/kura07/items/486c19045aab8090d6d9
ページ全臀??のレイアウト、グリッドレイアウト
コンテナを作り、グリッドに名前を付けて、割り当てる
<section class="container">
<div class="visual">(メインビジュアル・??</div>
<div class="number">(数藹??)</div>
<div class="expression">(テキスト)</div>
<div class="other">(3枚の写真)</div>
</section>
.container {
display: grid;
grid-template:
"visual number expression" 1fr
"visual other other" 220px /
40% 120px 1fr;
}
.visual {
grid-area: visual;
}
@media (max-width: 800px) {
.container {
grid-template:
"visual visual" 100vw
"number expression" 1fr
"other other" auto /
120px 1fr
}
}
■Flexbox
https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet
https://qiita.com/junya/items/7762da8052d86462f232
縦横觸??え、可藹??サイズ、でも複数配置が駄目、1行の並縺?
justify-content
align-items
flex-grow
flex-shrink
.container {
display: flex;
justify-content: center;
align-items: center;
}
■display: table / display: table-cell
https://techacademy.jp/magazine/19415
https://app.codegrid.net/entry/css-table-1
https://www.yoheim.net/blog.php?q=20150102
https://nxpg.net/blog/tech/?p=10764
CSS縺?vertical-alignが効かない縦並び・??display:gridの中縺?display:tableの中縺?display:table-cell)
#container{
display: grid;
grid-template-rows: 25px 1fr;
grid-template-columns: 300px 1fr 200px;
}
#column_right{
grid-row: 2;
grid-column: 3 / 4;
display: table;
}
#area{
background-color: #eee;
width: 150px;
height: 150px;
text-align: center;
display: table-cell;
vertical-align: middle;
}
<div id="container">
<div id="navi_left">...</div><div id="navi_right">...</div>
<div id="contents">...</div><div id="area">...</div>
</div>
■Float
テキストの回りこ縺?
.leftBox {
width: 45%;
float: left;
}
Floatレイアウト
https://www.bangboo.com/cms/blog/page_18.html
Padding/Float/Height100%の問題
https://www.bangboo.com/cms/blog/page_184.html
■object-fit
画蜒?の觸??軆??
img {
object-fit: cover;
}
.image1 {
object-position: 30% 40%;
}
■その臀??
spanタグ縺?line-heightを設藹??しても行間は設定できない、display:block;を追加するか親で設定する
ボックス鐔??素のセンタリング・??中のテキストは左寄せ)
<div style="width:500px"><div style="text-align:left; display:inline-block;">
https://qiita.com/KAMEch/items/b52c5e23212b8fef81a7
https://www.granfairs.com/blog/staff/centering-by-css
リストのマーカの臀??置に迷った
ul縺?padding-leftが外側からマーカの右側鐔??の鐔??離縺?15pxとかは藹??要
li縺?padding-leftはマーカの右からから先頭文字までの鐔??離縺?0px等で良い
https://maku77.github.io/web/layout/list-margin.html
2019見直したいCSS,Javascript
https://speakerdeck.com/tonkotsuboy_com/2019nian-madenijian-zhi-siteokitai-cssjavascriptfalseshou-fa
CSSレイアウト再入門:完全に理解し縺?CSSを記述するため縺? - Speaker Deck
実例で学縺?Flexbox縺?CSS Gridの使い分け – TAKLOG (tak-dcxi.com)
2024年、Web制臀??者がチェックしておきたいCSSの新觸??能のまとめ | コリ繧?
Posted by funa : 03:03 AM
| Web
| Comment (0)
| Trackback (0)
January 21, 2020
Update your home page
そもそも下手糞魂、
BRF BANGBOO
のトレーナを思い出した繧?Since 1992
■Web系通信系
/// WebRTC
リアルタイムにブラウザ間P2Pで送藹??菫?
ウェブブラウザ間のボイスチャット、ビデオチャット、ファイル共有が可閭?
/// Service Worker
訪蝠?がない状態でのバックグラウンド同期、プッシュメッセー繧?
データの更新を集中的に藹??信して鐔??数ページがデータの臀??部を利逕?
https://developer.mozilla.org/ja/docs/Web/API/Service_Worker_API
→下記PWAで詳し縺?
/// Fetch API
js縺?XMLHttpRequestに藹??繧?る非同期通信の手段、ServiceWorkerで使繧?れる
/// Beacon API
window.onunload/window閉じる際に非同期HTTP通信を確藹??実行するAPI
統鐔??情報軆??
■PWA
Progressive Web Apps
https://www.bangboo.com/cms/blog/page_333.html
■ユーザーエージェント(UA)凍結・非推螂?
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1229968.html
https://anond.hatelabo.jp/20200120125002
■文化を屠殺する
https://b.hatena.ne.jp/entry/s/anond.hatelabo.jp/20200311165317
■堕落したウェブはまだ直せる
https://japan.cnet.com/article/35133798/
表示縺?HTMLでやり、処理はサーバー側でやる
表示はメディアであり、処理はコンピューティング、そういうタイプ縺?
==========
https://twitter.com/ken1kuroyama/status/1220258901850869760トライアルは臀??ったことがないが、コレは分かりやすい縺?
ヒザを緩めてから足ピンしながらチンコを繝?ンドルに擦り上体藹??るんや縺?
MXとは逆やからこういうムーブは普通体が藹??応せえへん、


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