1 |
docker run -it -v `pwd`:/tmp node bash -c 'cd tmp; pwd; ls;' |
JavaScript
JavaScriptでコールバックの練習
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'use strict'; const p = console.log; const functionRunner = ({ func, arg }) => func(arg); const fr = functionRunner; fr({ func: p, arg: fr({ func: (a) => a, arg: fr({ func: (b) => b, arg: 'どうなるかな', }), }), }); |
1 |
どうなるかな |
JavaScriptでquicksort(ひさびさ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
'use strict'; const p = console.log; const swap = (a, l, r) => { const t = a[l]; a[l] = a[r]; a[r] = t; }; const getPivot = (a, b, c) => { if (a > b) { if (b > c) { return b; } else { return a > c ? c : a; } } else { if (a > c) { return a; } else { return b > c ? b : c; } } }; const quicksort = (a, left = 0, right = null) => { if (null === right) { right = a.length - 1; } if (left >= right) { return; } let l = left; let r = right; const pivot = getPivot(a[l], a[l + 1], a[r]); while (true) { if (a[l] < pivot) { l++; } if (pivot < a[r]) { r--; } if (l >= r) { break; } swap(a, l, r); l++; r--; } quicksort(a, left, l - 1); quicksort(a, r + 1, right); }; const a = [4, 3, 2, 1, 0]; p(a); quicksort(a); p(a); |
1 2 |
[ 4, 3, 2, 1, 0 ] [ 0, 1, 2, 3, 4 ] |
高階関数に高階関数を渡す
1 2 3 4 5 6 7 8 9 10 |
const p = console.log; const functionRunner = ({ func, args }) => func(args); const fr = functionRunner; fr({ func: fr, args: { func: p, args: 'メタメタ', }, }); |
1 |
メタメタ |
実行順を守りたいが互いに依存しない非同期関数にはPromise.all()を使うべきである
async-await だと1つずつ完了を待ってしまうが、
Promise.all()は一斉に(疑似的に並列に)処理する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
'use strict'; const sleepXXms = (ms) => { return new Promise((resolve) => { setTimeout(() => { resolve(`${ms}ms待ちました`); }, ms); }); }; const sleep10ms = () => sleepXXms(10); const sleep20ms = () => sleepXXms(20); const sleep30ms = () => sleepXXms(30); const calcRunTimeMs = async (targetFunc) => { const start = new Date(); const result = await targetFunc(); const lapseMs = new Date() - start; return { lapseMs, result }; }; const targetFuncA = async () => { return [await sleep20ms(), await sleep10ms(), await sleep30ms()]; }; const targetFuncB = async () => { return await Promise.all([sleep20ms(), sleep10ms(), sleep30ms()]); }; (async () => { console.log(await calcRunTimeMs(targetFuncA)); console.log(await calcRunTimeMs(targetFuncB)); })(); |
1 2 |
{ lapseMs: 61, result: [ '20ms待ちました', '10ms待ちました', '30ms待ちました' ] } { lapseMs: 31, result: [ '20ms待ちました', '10ms待ちました', '30ms待ちました' ] } |
GASで特定の行をグレーに塗る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/** * myFunction を実行すると sheetName 内の keywords を含む行をグレーに塗る */ const id = 'xxxxxx-xxxxxxxxx_11111-XXXXXXXXXXXXXXXXXXXXX'; const sheetName = 'シート1'; const keywords = ['ホゲギンコウ', 'フガカンパニー']; const 指定した行を返す関数 = ({ dataRangeValues, row }) => dataRangeValues[row - 1]; const 指定した行のカラム数を返す関数 = ({ dataRangeValues, row }) => 指定した行を返す関数({ dataRangeValues, row }).length; const 指定した行を色付けする関数 = ({ sheet, dataRangeValues, row, color = '#C0C0C0' }) => { const カラム数 = 指定した行のカラム数を返す関数({ dataRangeValues, row }); /* getRange(row, column, numRows, numColumns) */ sheet.getRange(row, 1, 1, カラム数).setBackground(color); }; const 文字列1が文字列2を含んでいたら真となる関数 = (文字列1, 文字列2) => 文字列1.indexOf(文字列2) !== -1; const 行がキーワードを含んでいたら真となる関数 = ({ dataRangeValues, row, keywords }) => { const columns = 指定した行を返す関数({ dataRangeValues, row }); for (const column of columns) { for (const keyword of keywords) { if (文字列1が文字列2を含んでいたら真となる関数(String(column), keyword)) { return true; } } } return false; }; const キーワードをカラムに持つ行に色を塗る関数 = ({ sheet, keywords }) => { const dataRangeValues = sheet.getDataRange().getValues(); for (let i = 0; i < dataRangeValues.length; i++) { const row = i + 1; if (行がキーワードを含んでいたら真となる関数({ dataRangeValues, row, keywords })) { 指定した行を色付けする関数({ sheet, dataRangeValues, row }); } } }; const myFunction = () => { const sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName); キーワードをカラムに持つ行に色を塗る関数({ sheet, keywords }); }; // 参考 // https://qiita.com/cazimayaa/items/224daebe536799e5a8a2 |
JSのfetchのresponse.json()はPromiseを返す!その対処法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'use strict'; const callApi = (url) => { fetch(url) .then(async (res) => ({ status: res.status, json: await res.json(), })) .then(console.log); }; callApi('https://www.jma.go.jp/bosai/forecast/data/overview_week/130000.json'); /** {status: 200, json: {…}} json: headTitle: "関東甲信地方週間天気予報" publishingOffice: "気象庁" reportDatetime: "2021-03-08T10:35:00+09:00" text: "予報期間 3月9日から3月15日まで↵ 向こう一週間は、期間のはじめと終わりに晴れる日もありますが、期間の中頃は気圧の谷や湿った空気の影響で雲が広がりやすく、雨の降る日があるでしょう。↵ 最高気温は、平年より高い日が多く、期間のはじめと終わりは平年よりかなり高い日もある見込みです。最低気温は、平年より高い日が多く、期間の後半は平年よりかなり高い日もあるでしょう。↵ 降水量は、平年並か平年より多い見込みです。" __proto__: Object status: 200 __proto__: Object */ |
generator関数をラムダに閉じ込める意味はあるのか不明
1 2 3 4 5 6 7 8 9 10 11 12 |
'use strict'; const myGenerator = () => (function* () { yield '私の'; yield '名前'; yield 'は'; yield '太郎デス'; })(); for (const v of myGenerator()) { console.log(v); } |
1 2 3 4 |
私の 名前 は 太郎デス |
JSのジェネレータ関数はイテレータオブジェクトを返す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
'use strict'; const p = console.log; const iterable1 = { [Symbol.iterator]: () => { let cnt = 0; const iterator = { next: () => { const value = cnt++; const done = (5 < cnt); return { value, done }; // iterator result } }; return iterator; }, }; const iterable2 = { [Symbol.iterator]: function* () { for (let i = 0; i < 5; i++) { yield i; } } }; for (const v of iterable1) { p(v); } for (const v of iterable2) { p(v); } |
1 2 3 4 5 6 7 8 9 10 |
0 1 2 3 4 0 1 2 3 4 |
JavaScriptのイテレータの練習
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
'use strict'; const getIterableObject = (argMax = 10) => { const iterableObject = { [Symbol.iterator]: () => { let cnt = 0; const iterator = { next: () => { const value = cnt++; const done = (argMax <= value); const iteratorResult = { value, done }; return iteratorResult; }, }; return iterator; }, }; return iterableObject; }; for (const v of getIterableObject(3)) { console.log(v); } for (const v of getIterableObject(7)) { console.log(v); } |
1 2 3 4 5 6 7 8 9 10 |
0 1 2 0 1 2 3 4 5 6 |