/// BANGBOO BLOG ///
■21/2/10 7:30PM
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, bresult = func() result[0]がa、result[1]がbtry・?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()    #=> Hellob.world()    #=> Worldc = 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行開けるクラス内部では・??行ずつ開けてメソッド定鄒?
ドックストリングでクラスや関数についてコメントする(慣軆??的にダブルクォート)
 コード中は処理についてのコメントをな縺?し関数化縺?docstringで藹??照するよう縺?
 「コメント(#)縺?docstring(""")の違いは・??」コメント縺?docstringについ縺?
 [Python]可読性を上げるための、docstringの書き方を学ぶ・??NumPyスタイル・?? - Qiita
デバッグの方觸??案
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 = ab.append(1)print(a) #[1]https://qiita.com/ponnhide/items/cda0f3f7ac88262eb31ehttps://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']
Pythonのリストと文字列を相臀??に藹??觸??する方觸??まとめ | HEADBOOST
→リストをStrに藹??觸??し縺?SQLにする場合For文が良い(Pythonの書藹??縺?SQL書藹??のコンビなので臀??寧に対処するため)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.org

HTMLの中に藹??し埋め込めず、基本的にプログラムの中縺?HTMLを埋め込む:CGI(Perl辟?)
 さ縺?らインターネット縺?Python CGI (mwsoft.jp)
WSGI Python 縺? WSGI (Web Server Gateway Interface) に藹??ったシンプル縺? Web サーバ縺? Hello World - Qiita
Python逕?Webサイト用途フレームワーク・??Flask(軽驥?)、Django
 WSGI につい縺? — Webアプリケーションフレームワークの臀??り譁? in Python (c-bata.link)
 GCPでどう使うかは臀??譏?だがホスティングは↓
 ウェブ ホスティン繧? | Google Cloud 静的ウェブサイトのホスティン繧?  |  Cloud Storage  |  Google Cloud

str.split() 区切り文字で分割しリスト等に入れる Pythonで文字列を分割・??区切り文字、改鐔??、正鐔??表現、文字数・?? | note.nkmk.me
print('Sam' in 'I am Sam') # True 任諢?の文字列を含むか判藹??: in演算子 Pythonで文字列を検索・??〜を含むか判藹??、位置藹??得、カウント) | note.nkmk.me
==============
ここで動かせるgoogle colaboratory→ Colaboratory へようこそ - Colaboratory (google.com)
コラボラトリはマークダウン Qiita マークダウン鐔??法 一覧表・チートシート - Qiita
半角スペース・??個で改鐔??#の数で鐔??出し*で軆??条書き数藹??縺?.で番号を振る、- でリスト* 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 = -1STATUS_SUCCESS = 0self.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 Falsewith a() as s: print sssssss111okPython縺?with文の正体 (zenn.dev)
初期値をエラー値にし、業務判藹??エラーでステータスを設藹??したら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
(More)
Comment (0)

■20/12/25 1:06AM
Promise
仕事は轤?上芸なり~と勤しむ轤?上芸人にも分かるように解説をさせて頂きた縺?候
(勤しむところはソコではない)

///promise/async/await 非同期関謨?
【ES6】 JavaScript初心者でも繧?かるPromise講蠎? - Qiitahttps://rightcode.co.jp/blog/information-technology/javascript-promisehttps://rightcode.co.jp/blog/information-technology/javascript-async-awaithttp://www.tohoho-web.com/ex/promise.htmlhttps://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/https://qiita.com/niusounds/items/37c1f9b021b62194e077https://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()ならいずれか縺?Promisefunction 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


Comment (0)

■20/4/21 12:00AM
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を消せる(その藹??新たに再作成できる)

■insertdb.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()
■Deletedb.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)); }
■Where藹??
db.friends.where("shoeSize").between(40, 45).count(function(count) {
[HTML5] IndexedDBでデータの臀??存や読み込みを行う - Dexie.js邱? (katsubemakito.net)
Dexie.js縺?TypeScript縺?IndexedDBを操作する - noxi雑記 (hateblo.jp)

■アクセ繧?indexeddbは該当DBにどこからアクセスできるか>同一ドメイン、ディレクトリでじゃない保存場所C:\Users\<ユー繧?>\AppData\Local\Google\Chrome\User Data\Default\IndexedDBC:\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、JavascriptJS縺?Aタグリンクを挿入するに縺?insertAdjacentHTMLがよい生成したタグを追加する前に觸??除するに縺?document.getElementById('xx').textContent = null;
■テストhttps://www.bangboo.com/indexeddb/indexeddb_dexie_form.htmlhttps://www.bangboo.com/indexeddb/test/indexeddb_dexie_form.html (ディレクトリ違い)
Comment (0)

Navi: <  10 | 11 | 12 | 13  >
-Home
-Column [136]
-Europe [9]
-Gadget [79]
-Web [137]
-Bike [4]

@/// BANGBOO BLOG ///