IT関連のメモ

メモです

JavaScriptのPromiseについて

身内向け 口頭説明含むこと前提

JavaScriptのPromiseがとっつきにくい気がしたのでまとめます。

概要

JavaScript、TypeScript
世の中、利用多い

www.itmedia.co.jp

だから使う機会もあるだろうし、ここではとっつきにくそうなPromiseについて触れる

function promiseTest(): Promise {
  return new Promise(async (resolve) => {
    resolve();
  });
}

promiseTest().then(async () => {
  promiseTest().then(async () => {
    console.log(`promiseTest1.`);
  });
  promiseTest().then(async () => {
    console.log(`promiseTest2.`);
  });
  promiseTest().then(async () => {
    console.log(`promiseTest3.`);
  });
});

Promise

JavaScriptはシングルスレッドだけど、フロントやってたら非同期の処理は欲しい
JavaScriptのPromiseはJavaScriptだけどマルチスレッドというか非同期の処理をしたいときに使うもの
C#のTask、JavaのThread的に使える

resolve reject

サクセスコールバック、エラーコルバック
成功時のデリゲート、失敗時のデリゲート

扱いが微妙にフレームワークで異なる気がする

function promiseTest(resolve, reject){
    resolve();
    reject();
}

promiseTest(() => {
    console.log(`success`);
},
() => {
    console.log(`failure`);
});

※イメージの説明 Promise使ってすらいない例

このように明示的にサクセスコールバック、エラーコルバックの実行を指定できる。
この例ではサクセスコールバック、エラーコルバックを両方実行しているおバカなコードであるがこういうことができるという説明。
普通は↓みたいになるかと思う

https://jsfiddle.net/Jirobe/1dw5g9fh/27/

const isSuccess = true;

function promiseTest(resolve, reject){
  // 何らかの成功・失敗の共通ロジック
  // 何らかの判断ロジック
  if(isSuccess){
    // 何らかの前処理
    resolve();
    // 何らかの後処理
  }else{
    // 何らかの前処理
    reject();
    // 何らかの後処理
  }
}

promiseTest(() => {
    console.log(`success`);
},
() => {
    console.log(`failure`);
});

※イメージの説明 Promise使ってすらいない例

これはいい。引数にあるからみんな読める。thenが扱いにくい

then

thenがresolve、catchがreject

これはわかってもらえると思う
関数使ってPromisを5個作ってる

https://jsfiddle.net/Jirobe/1dw5g9fh/39/

let count = 0;

function promiseTest(): Promise {
    console.log(++count);
  return new Promise((resolve) => {
    resolve();
  });
}

promiseTest().then( () => {
  promiseTest().then( () => {
    promiseTest().then( () => {
      promiseTest().then( () => {
        promiseTest().then( () => {
          console.log(`last:` + count);
        });
      });
    });
  });
});

then これがきつい。意味は全然違うけど、↑と↓は出力が同じもの

https://jsfiddle.net/Jirobe/1dw5g9fh/45/

let count = 0;

function promiseTest(): Promise {
    console.log(++count);
  return new Promise((resolve) => {
    resolve();
  });
}

promiseTest()
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () =>  {console.log(`last:` + count);})

Promisを一度作ればthenでいくらでもつなげられる。成功したら、次に行く。
これは同じ処理を連続してよんでいるけど、仕事で人が作る現実のプログラムは別々の意味のある処理がかかれているわけで、大きいソースのプロジェクトでこれが混ざってくるとコールバックが別の場所に書いてあったりで頭が爆発するからそういうものだと覚悟がいる。

シグナルやメッセージを指定してデリゲート仕掛けるタイプのemitとかsubscribeとかの単語を使いそうなメッセージ系のイベント管理と違って、必ず前後関係を間違えずに順番に処理してくれるのでビジネスでは安心かもしれない。マルチスレッドだけど、並列になることはない。一つのワーカースレッドで大きい処理をしている感覚。

catch

catchがreject

https://jsfiddle.net/Jirobe/1dw5g9fh/51/

let count = 0;

function promiseTest(): Promise {
    console.log(++count);
  return new Promise((resolve, reject) => {
    if(count > 0){reject();}
  
    resolve();
  });
}

promiseTest()
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () =>  {console.log(`last:` + count);})
.catch(() => {console.log(`failure`);});

止まる。

でも、この場合、こうだと止まらない。if文のチャンスは最初の一回だけだから

let count = 0;

function promiseTest(): Promise {
    console.log(++count);
  return new Promise((resolve, reject) => {
    if(count > 1){reject();}
  
    resolve();
  });
}

promiseTest()
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () => { 
    console.log(++count);})
.then( () =>  {console.log(`last:` + count);})
.catch(() => {console.log(`failure`);});

なのでこう書かないといけない

https://jsfiddle.net/Jirobe/1dw5g9fh/62/

let count = 0;

function promiseTest(): Promise {
    console.log(++count);
  return new Promise((resolve, reject) => {
    if(count > 1){reject();}
  
    resolve();
  });
}

promiseTest()
.then( () => { 

  promiseTest()
  .then( () => { 
      promiseTest()
    .then( () => { 

        promiseTest()
      .then( () => { 

            promiseTest()
          .then( () => { 

              console.log(`last:` + count);
            ;}
          ).catch(() => {console.log(`failure`);});
        ;}
      ).catch(() => {console.log(`failure`);});
      ;}
    ).catch(() => {console.log(`failure`);});

    ;}
  ).catch(() => {console.log(`failure`);});
  
  ;}
).catch(() => {console.log(`failure`);});
 

あと、catch句の通り、例外の時も実行される
finallyもある

https://jsfiddle.net/Jirobe/1dw5g9fh/75/

let count = 0;

function promiseTest(): Promise {
    console.log(++count);
  return new Promise((resolve, reject) => {
  
    if(count > 1){reject();}
    resolve();
  });
}

promiseTest()
.then( () => { 
    console.log(++count);   
  if(count > 1){throw new Error();}
  },() => {console.log(`failure`))
.then( () => { 
    console.log(++count);   
  if(count > 1){throw new Error();}
  },() => {console.log(`failure`))
.then( () => { 
    console.log(++count);   
  if(count > 1){throw new Error();}
  },() => {console.log(`failure`))
.then( () => { 
    console.log(++count);   
  if(count > 1){throw new Error();}
  },() => {console.log(`failure`))
.then( () =>  {console.log(`last:` + count);},() => {console.log(`failure`);})
.finally(() => {console.log(`finally`);});

自作PCを新しく組んだので消費電力を測ってみた(低負荷の場合)

目的

パーツのグレードを上げたPCを新たに自作したが、旧マシンもまだまだ動く(ブルースクリーン頻発していてガタは来ているが)。コストの低いコーディング、動画視聴、文章記載くらいは旧マシンの方が電力的に有利ではないか?
では実際に計測してみよう。

f:id:Jirobe_Katori:20211002093717p:plain

構成

①構成
- Ryzen 7 1700
- Geforce GTX 1060
- ASROCK AB350 PRO4

この構成で多分4年ほど過ごしてきた
初自作であり、当時は満足していたがそろそろ変えてみるかとなり、次の構成に変えた

②構成
- Ryzen 7 5800X
- Geforce RTX 3070 Ti
- MAG B550 TOMAHAWK

f:id:Jirobe_Katori:20211002093406p:plain

ケースも拘って、ぴかぴか光って大満足

でも、我に返ると少し後悔。すげー高かった。グレードを上げたのもあるけど②構成は①構成の1.5倍以上は金かかった。
ビットコインは悪。グラボ高い。

計測

アイドル状態

①構成も②構成もマザボの会社のソフトを使って、パワーセーブ状態 f:id:Jirobe_Katori:20211002094251p:plain
f:id:Jirobe_Katori:20211002100938p:plain

  • 動画見てもあまり変わらない
  • 室温が25度くらいで①②ともにCPU温度が30度~33度くらい

①構成

  • 起動直後:120ワットくらい
  • 起動後:52~55ワット
  • 55ワット 3時間動作 3.6円(22円/kWh):30日(一か月間)で108円

②構成

  • 起動直後:200ワットくらい
  • 起動後:80~85ワット
  • 85ワット 3時間動作 5.6円(22円/kWh):30日(一か月間)で168円

感想

ネットサーフィンやブログに文字を書くくらいなら、アイドル状態とそんなに変わらない。 さすがにアプリ起動やバックグラウンドで何か動くと違うが。
①構成と②構成のワット数の差は30ワットほど。
自分の賃貸は22円/kWh。電気代的には1時間当たり0.66円の差である。
ものすごく微々たる差だ。日に2時間動画視聴を30日(一か月間)で40円の差だ。
実際はプロセス立ち上げとかいろいろなところで①構成が電力的に有利ではないだろうか?
たとえ高コストなゲームをしなくても、月に100円から200円くらいの電気代の差は発生しそう。 金額(消費電力)でいえば1.5倍くらい低負荷状態でも違うということなのだろう。
ただ、金額的に使い分けるほど気にするほどなのか悩ましい差だ。

総括

試した構成だと、1.5倍くらい違う。ただ、低負荷な利用に関しては元々電気代の額が大きくないので使い分けることがめんどくさくなるのかもしれない。

電源を切っているとき

電源を切っていても

  • ①構成 2.0 ~ 2.1 ワット
  • ②構成 1.2 ~ 1.4ワット

くらい電気を使っていた

f:id:Jirobe_Katori:20211002101736p:plain

USB給電を①構成はしていて、②構成はしていないようだ。差がある。 電源が入っていなくても、マザボの時計などで電気を必要としているかもしれないが、2ワットも必要なのだろうか?
減らせないかな、と思う。

①構成

  • Biosのそれっぽい設定をいじっても変化なし
  • Windowsの  電源とスリープ → 電源の追加設定 → 電源ボタンの動作の選択 → 現在利用可能でない設定を変更します → ★高速スタートアップを有効にする(推奨) → 変更を保存
    ★をオフにするとUSB給電がなくなった
    でも変化はなさそう?

②構成

よくわからない

感想

電源入ってなくてもマザボには2ワットくらい必要なのかな?
一度PC電源入れて、PC電源落とすと電源を切っているときのワット数が0.5ワットくらい下がった。あのボタン電池2次電池じゃないよな?なんなんだ?

マザボには電池がある。4年くらい交換してないけど(まさか①構成のブルースクリーンはそこなのか?)。給電してないと電池の電気を使ってしまうので電池の消費が速くなる、的な話を会社の先輩に昔聞いたような?(本当なのかな?起電力的なもの?WDT?)

きっと、意味があって電気を使っているのだと思う。電源が入ってなくても節約でコンセントを抜くのは悪手だと思うので、この2ワットについては気にしないようにしようと思った。

Insider ProgramのWindows11にしてしまったけど、Windows10に戻す

2021.09.25

自作したばかりのOSを壊してもいいくらいの状態のPCでInsider ProgramのWindows11にしてみましたけど、我に返ったので元に戻しました。

以下、手順を記録します。

目的

Insider ProgramのWindows11からWindows10に戻す

手順

1.Windows Updateを開く

2.更新の履歴を選択

f:id:Jirobe_Katori:20210925191143p:plain

3.回復オプションを選択

f:id:Jirobe_Katori:20210925191327p:plain

4.復元を押下

f:id:Jirobe_Katori:20210925191414p:plain

5.ダイアログを進める

あとは選択肢に従って次に進んでください

f:id:Jirobe_Katori:20210925191446p:plain

以上