2021年 12月 の投稿一覧

Taskの備忘録

こんにちは。弱小エンジニアのいすいです。

 

最近プロジェクトを引き継いで、コードの改修を行っているのですが、

そのコードが何とも杜撰笑笑

 

元々の担当者はもう辞めちゃった人で、

技術はあるのですが、結構雑な人だったっぽい笑笑

 

スペルミスやら、NGなコーディングしているとか色々あったけど、

特にいまいちと思ったのが、

Taskの付け方!

 

とりあえず色々なところにTaskがつけられて、全てすぐにawaitされている。。

 

まあ自分も実際よく分かってないし、人のこと言えないのですが、、

そんなこんなでこの機会に非同期について学び直しました。

 

Taskで処理する場所

まず、Taskで処理を行うと言うことは、非同期で処理する目的かと思いますが、

根本的に非同期にする場所というのは重い処理の箇所です。

 

何でもかんでも非同期にしてもアプリの性能は良くなりません。

 

具体的に非同期にした方が良いのは、

ファイル読み込みや、APIアクセス、DBアクセスとかですかね。

 

すぐにawaitしない方が良い時

戻り値がTask型だと、awaitで受け待ちにすると思いますが、

すぐにawaitで待たない方が良い時があります。

 

それは非同期にしたい箇所でTask型の変数をまとめてawaitしたい時です。

まとめてawaitするのは以下のようなコードです。

Task taskA = Task.Run(()=>
{
    Thread.Sleep(3000);
});

Task taskB = Task.Run(()=>
{
    Thread.Sleep(3000);
});

Task taskC = Task.Run(()=>
{
    Thread.Sleep(3000);
});

// ここでまとめてawait
await Task.WhenAll(taskA, taskB, taskC);

こうすることで、taskAとtaskB,TaskCを非同期で処理できます。

 

一度ここでawaitについておさらいすると、

awaitが付いている処理では、awaitにたどり着くと、メインスレッドに呼び出し元が戻ります。

つまり、メソッドAからメソッドBを呼び出し、メソッドBのawaitに辿り着いた時、メソッドAのメソッドB呼び出し以降の処理がメインスレッドで続行されます。

それと同時にサブメソッドでメソッドBのawaitの処理が実行され、それが終わると、await以降のメソッドBの処理がメインスレッドに戻ってきて実行されます。

例えば以下の場合、

void MethodA()
{
    MethodB();
    Console.WriteLine("A");
}

async void MethodB()
{
   await MethodC();
   Console.WriteLine("B");
}

async Task MethodC()
{
    await Task.Run(()=>
    {
        Thread.Sleep(3000);
        Console.WriteLine("C");
     });
}

上記例を実行すると、

A
C
B

の順番で出力されます。

MethodCで3秒スリープしている間に、MethodAがメインスレッドで処理を進め、MethodCが完了したあと、MethodBが最後まで実行されます。

 

ちなみに、MethodCの処理中にMethodAの処理は完了してしまうことになります。

 

ここで大事なのは、awaitするとその先は受け待ちになってしまうことです。

その先を非同期で処理したい場合にはawaitを付けてはいけません。

なので、何でもかんでもawaitで呼び出せば良いというわけではないのです。

 

ちなみに、ネットではasync voidはだめっていう記事が多いのですが、

async voidでも良くないですかね?

損はないからasync Taskにしとけってことですかね。。

 

ちなみに、Task.Wait()とかはデッドロックのリスクがあるので、しない方がいいみたいですね。

あまり良く理解していませんが、これは気をつけとこうと思います。

 

Taskを重ねてもあまり意味ない

先ほどのTaskとawaitの話をよく聞いておかないと、

Taskを重ねてしまうような無駄なコードを書いてしまう可能性があります。

例えば以下のようなものです。

async void MethodA()
{
    await Task.Run(async ()=>
    {
         await MethodB();
    });
}

async Task MethodB()
{
    await Task.Run(()=>
    {
         Thread.Sleep(3000);
     });
}

上記のようなコードは実際にありました。。😅😅

awaitしている間は受け待ちになるので、上記のって言ってしまえば以下のと同義です。

async void MethodA()
{
    await Task.Run(()=>
    {
         Thread.Sleep(3000);
     }
}

もちろん、場面によって前者の方が適していることはあるかと思います。

ですが、Taskとawaitの仕組みをしっかり理解していないと、

意味のないコードを書いてしまうので要注意です。

macbookが水濡れしたが、外部キーボードで何とかなった話

こんにちは弱小エンジニアのいすいです。

本日は愛用してきたm1のmacbookが水濡れしてキーボードが壊れていたのですが、何とか今使えている方法をご紹介します。

今困っている人の参考になればと😃😃

 

macbookは水濡れしてもまだ使える!

結論から先に言うと、macbookが水濡れしてキーボードが使えなくなっても、

諦めるのは早いかもしれません。

 

外部キーボードを用意すれば、

macアプリを駆使して動く可能性は十分あります!

 

僕は誤反応してしまうまで故障したキーボードでも、

現在は動いています。😁

 

macbookが水濡れした時の驚愕の修理代

1ヶ月ほど前、全くの自分の不注意によって、赤ワインをmacbookにこぼしてしまいました。

この時キーボード等普通に使えていましたが、内部の水濡れが気になったので、

念の為Appleコールセンターにチャットで相談。

 

無料で点検してくれることに。

ほっと胸を撫で下ろします。😌

 

その後チャットで点検の会話を進めます。

誤字をしてしまい、バックスペースを押すと、そのまま送信。

あれ。。??

 

不安になってもう一度トライ。。

 

やはりバックスペースを押すと、送信される(もしくは入力が確定される)!

 

これはキーボード壊れたっぽい?笑笑(ほんとは笑えてない)

オペレーターにそのことを伝えると、修理に出すべきだと打診され、

オンライン修理費はなんと、、

 

130,000円!!!!

まじか、、、😨😨😨😨

 

アップルストアに駆け込み🏃‍♂️🏃‍♂️🏃‍♂️🏃‍♂️🏃‍♂️

 

しかし、ここでも13万円。。。

 

濡れただけだからそれを乾かしたり、一部交換するだけだと思っていましたが、濡れたと思われる箇所は全て取り替えるからそれだけかかるみたい。。

甘かった。。

なんと、apple care ++ に入っていれば、4万以内で修理できたとのこと。

なぜ購入時に入っていなかったのか。。2〜3万をケチった自分が悔やまれる。

次は絶対apple care ++入ろう。

 

その後、店員さんには買い替えをお勧めされました。

 

自分のm1のmacbook proはストレージを512GBにしていたので、購入時の定価は約17万。

買い換えるよりは修理に出した方が良い気はする。。

でもどっちにせよすごい痛手。。

 

故障しているので下取りもできませんでした。

また、メルカリでも売れないだろうと思いました。

 

最後の望み

この時、自分の中では

1.修理に出す(約14万)

2.買い換える(約17万 + appcare++の2万)

3.ほぼ性能の変わらないm1のmacbook airに乗り換える(約15万+applecare++の2万)

の3つで迷っていました。

 

ですが実は、

故障しているのはキーボードだけで、外部キーボードでつなげばまだ使えるのでは?という可能性も考えていました。

 

この時自分のmacでは、キーを押していないのに、キーが何度も勝手に押されている現象が起きていたので、この現象を抑えないといけません。

調べたところ、

内蔵キーボードのキー受付を無効にするiOSアプリがあったのです!

 

それは、karabinerというアプリです!

調べればすぐ出てくると思います。

 

あとはキーボードを買うだけ。

しかしmac純正のキーボードはお値段がなかなか。。

 

非純正のmac専用のキーボードもなかなかな値段します。

 

背に腹は変えられず、1万を超えているキーボードを買うしかないかと考えていた時、

電化製品の店員さんに、windowsのキーボードもmacで使えて、

logicoolならコマンドをmac用にできますよとの話を聞きました。

 

なあーにー!?

 

目から鱗でした。

そんなことできるんですね。笑笑

 

試しに1700円ぐらいの一番安いlogicoolのキーボードを購入。

帰ってつないでみると、macで使えました!!

 

ただこの1700円のキーボードだとmac用にキーボードを変換してくれるlogicoolの対象商品ではなく、karabinerでキーの調整はしました。

 

よかった〜〜〜〜〜〜

 

結論

そもそもですが、macbookを購入するときは、

apple care ++にケチらず入りましょう笑笑

 

安いPCではないのですから、2万でちゃんと保険つけましょう。

 

apple care++に入っていなくて、

水濡れしてしまった場合は、外部キーボードで暫定的に対処できる可能性があります。

新しくキーボードを購入する必要がある人は、純正を買うのではなく、

非正規品で一旦試すことをお勧めします。

一度の水濡れぐらいなら、外部キーで動くと思います。

ただ、今自分のmacは、常にどこかしらのキーが押されていて、その受付をアプリで無視しているだけなので、バッテリーとかの消耗が激しいかもしれません。

また、スリープ状態は大丈夫なのですが、システム終了するとkarabinerアプリが停止して内蔵キーが反応してしまうので、macがすぐ立ち上がってしまい、システム終了できないのが残念な点です笑笑

 

とはいえ捨てるのは勿体無い方にはぜひ試してみても良いかもしれないです。

PAGE TOP