入門

スポンサーリンク
JavaScript

JavaScript | 非同期処理:Promise 基礎 – finally の役割

まず finally を一言でいうとfinally は、「Promise が成功しても失敗しても“どっちにしても最後に必ず実行したい処理”を書く場所」です。例えば、ローディング表示を消したいモーダルを閉じたいファイルや接続を閉じたいなど、「...
JavaScript

JavaScript | 非同期処理:Promise 基礎 – catch の基本

まず catch を一言でいうとcatch は、「Promise で起きたエラー(失敗)を、最後にまとめて受け止める場所」です。then が「成功したときの続きを書く場所」だとしたら、catch は 「どこかで失敗したときの“落とし穴”とし...
JavaScript

JavaScript | 非同期処理:Promise 基礎 – then の基本

まず then を一言でいうとthen は、「Promise が“成功したあとにやりたい処理”を登録するための関数」です。Promise は「そのうち結果が入る箱」でしたね。then はその箱に対して、「中身(成功結果)が決まったら、この関...
JavaScript

JavaScript | 非同期処理:Promise 基礎 – reject の役割

まず「reject」のイメージを一言でreject は、「この Promise の非同期処理は“失敗”で終わったよ、と確定させるスイッチ」です。そして同時に、「なぜ失敗したのか(エラー情報)はこれだよ」と、Promise の中に「失敗の理由...
JavaScript

JavaScript | 非同期処理:Promise 基礎 – resolve の役割

まず「resolve」のイメージを一言でresolve は、「この Promise の非同期処理は“成功”で終わったよ、と確定させるスイッチ」です。そして同時に、「成功した結果はこれだよ」と、Promise の中に値をセットする役割 を持っ...
JavaScript

JavaScript | 非同期処理:Promise 基礎 – Promise の状態(pending / fulfilled / rejected)

Promise の状態を一言でイメージするPromise は「そのうち結果が入る箱」 で、その箱には常にどれか 1 つの「状態」がくっついています。pending(保留中)fulfilled(成功)rejected(失敗)Promise は...
JavaScript

JavaScript | 非同期処理:Promise 基礎 – Promise とは何か

まず Promise を一言でイメージするPromise は、「まだ終わっていない非同期処理の“結果がそのうち入る箱”」だと思ってください。今は結果が分からないけど、そのうち 成功するかもしれないもしかしたら 失敗するかもしれないどちらにし...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – escape analysis

escape analysis を一言でいうとescape analysis(エスケープ解析)は、JIT コンパイラが「このオブジェクトはメソッドの外に“逃げる”か?」「このオブジェクトはスレッドの外に“逃げる”か?」を解析する仕組みです。...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – String プール

String プールを一言でいうとString プールは、「同じ内容の文字列を、JVM の中でできるだけ 1 個だけにまとめて共有する仕組み」です。Java の String は不変(immutable)なので、同じ内容の "hello" ...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – 不要なオブジェクト生成

「不要なオブジェクト生成」がなぜパフォーマンス問題になるのかJava では new しても GC が片付けてくれるので、「とりあえず new しとけばいいや」となりがちです。でも、オブジェクトを作るたびにヒープが汚れ、GC の仕事が増えるの...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – パフォーマンス測定

「なんとなく速そう」ではなく「数字で語る」がパフォーマンス測定パフォーマンス測定の一番大事なポイントは、「体感」や「勘」ではなく、数字で語ることです。「この実装の方が速い気がする」ではなく、「この処理は平均 3.2ms、あっちは 7.8ms...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – Stop The World

Stop The World を一言でいうとStop The World(STW)は、「JVM が何か重要な作業をするために、アプリケーションのスレッドを一時的に全部止めること」です。特に GC(ガーベジコレクション)のときによく出てくる言...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – GC の基本

GC を一言でいうと「いらなくなったオブジェクトの自動掃除屋」GC(Garbage Collection)は、「もう使われていないオブジェクトを、自動で見つけて捨ててくれる仕組み」です。C や C++ では、自分で free や delet...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – ヒープ / スタック

ヒープとスタックを「机」と「倉庫」でイメージするまずはイメージからいきましょう。スタックは「今やっている作業のための机」。ヒープは「作ったモノを置いておく大きな倉庫」。机(スタック)の上には、今呼び出しているメソッドのローカル変数や一時的な...
Java

Java | Java 詳細・モダン文法:JVM・パフォーマンス – JVM メモリ構造

JVM メモリ構造をざっくり一枚の絵にするまずイメージからいきます。JVM のメモリは、大きく言うと次のような「部屋」に分かれています。ヒープ(Heap):new したオブジェクトが住む場所スタック(Stack):メソッド呼び出しの一時的な...
JavaScript

JavaScript | 非同期処理:コールバック – Promise が生まれた背景

なぜ Promise なんてものが出てきたのか(ざっくり全体像)Promise は、「非同期処理をコールバックだけで頑張った結果、みんながしんどくなったので生まれた“救急アイテム” です。特に、次のような問題が限界に達していました。コールバ...
JavaScript

JavaScript | 非同期処理:コールバック – 可読性の低下

「コールバックで可読性が落ちる」という話の本質コールバックは、非同期処理には欠かせない仕組みです。ただし、使い方次第でコードの「可読性(読みやすさ)」を一気に悪くしてしまう ことがあります。特に問題になるのは、ネストが深くなる処理の流れ(順...
JavaScript

JavaScript | 非同期処理:コールバック – エラーハンドリングの問題

コールバックとエラーハンドリングの関係(まず全体像)コールバックを使った非同期処理では、「エラーをどう扱うか」 が一気に難しくなります。同期処理なら、try { const result = doSomething(); // ここでエラー...
JavaScript

JavaScript | 非同期処理:コールバック – コールバック地獄

コールバック地獄とは何か(まずイメージ)コールバック地獄(callback hell)は、「非同期処理をコールバックだけでつなぎまくった結果、コードが右に右にネストしまくって、読めない・直せない状態」のことです。やっていること自体はシンプル...
JavaScript

JavaScript | 非同期処理:コールバック – ネストしたコールバック

ネストしたコールバックとは何か(まずイメージ)ネストしたコールバックというのは、「コールバックの中で、さらに別の非同期処理を呼び、その中でまたコールバックを書き…と階段状に深くなっていく書き方」 のことです。イメージとしてはこうです。「A ...
JavaScript

JavaScript | 非同期処理:コールバック – 同期コールバックとの違い

いちばん大事な違いのイメージまず、ざっくりこう覚えてください。同期コールバック→ 「その場で、すぐに呼ばれるコールバック」非同期コールバック→ 「あとで、別のタイミングで呼ばれるコールバック」どちらも「関数を引数として渡す」のは同じですが、...
JavaScript

JavaScript | 非同期処理:コールバック – 非同期コールバック

まず「非同期コールバック」を一言でイメージする非同期コールバックは、「“今すぐ”ではなく、“あとで”呼び出してもらうために登録しておく関数」のことです。普通のコールバックも「あとで呼ばれる関数」ですが、非同期コールバックは特に、いつ呼ばれる...
JavaScript

JavaScript | 非同期処理:コールバック – setInterval の仕組み

setInterval を一言でいうと何かsetInterval は「この処理を◯ミリ秒ごとにくり返し実行してね」とブラウザ(または Node)に頼む関数です。setTimeout が「1回だけ、あとで実行」なのに対して、setInterv...
JavaScript

JavaScript | 非同期処理:コールバック – setTimeout の仕組み

まず setTimeout を一言でイメージするsetTimeout は、「この処理を◯ミリ秒“後に”実行してね」とブラウザ(または Node)にお願いする関数です。ポイントはここです。setTimeout を呼んだ瞬間に、コールバックの中...
JavaScript

JavaScript | 非同期処理:コールバック – コールバック関数とは

コールバック関数のイメージ(まず感覚から)コールバック関数は、「あとで呼んでね」と他の関数に渡しておく関数 です。自分で直接 myFunc() と呼ぶのではなく、「この処理が終わったときに、この関数を実行して」「ボタンが押されたら、この関数...
Java

Java | Java 詳細・モダン文法:並行・非同期 – 非同期例外処理

まず「非同期の例外」がなぜややこしいのか同期コードなら、try-catch で囲めばだいたい済みます。try { int x = doSomething(); // ここで例外が出たら catch に飛ぶ System.out.printl...
Java

Java | Java 詳細・モダン文法:並行・非同期 – allOf / anyOf

allOf / anyOf を一言でいうとCompletableFuture.allOf と CompletableFuture.anyOf は、「複数の非同期処理をまとめて扱うための“ハブ”」です。allOf は「全部終わったら教えて」。...
Java

Java | Java 詳細・モダン文法:並行・非同期 – thenApply / thenCompose

まず「何をつなぎたいのか」をはっきりさせるCompletableFuture を使うとき、thenApply と thenCompose の違いで必ずつまずきます。でも本質はシンプルで、こうです。「ただ結果を変換したいだけ」なら thenA...
Java

Java | Java 詳細・モダン文法:並行・非同期 – CompletableFuture 組み合わせ

CompletableFuture の「組み合わせ」をざっくり俯瞰するCompletableFuture の本質は「非同期処理を“値”として扱い、それらをつなぎ合わせること」です。単発で supplyAsync を使うだけだと「ただの非同期...
Java

Java | Java 詳細・モダン文法:並行・非同期 – ThreadPool 設計

ThreadPool を一言でいうと「スレッドの再利用工場」ThreadPool(スレッドプール)は、「あらかじめ何本かスレッドを作っておき、タスクをそこに流し込んで再利用する仕組み」です。毎回 new Thread していると、スレッドの...
Java

Java | Java 詳細・モダン文法:並行・非同期 – ExecutorService 詳細

ExecutorService を一言でいうとExecutorService は、「スレッドを自分で new せずに、“仕事(タスク)だけ渡して実行してもらう”ための仕組み」です。new Thread(...).start() を直接使うと...
Java

Java | Java 詳細・モダン文法:並行・非同期 – happens-before

happens-before を一言でいうとhappens-before は、「この処理が終わってから、あの処理が“必ずその結果を見える形で”起きる」という“時間とメモリの順序”を表す言葉です。もっと砕くと、「A が B の前に“ちゃんと起...
Java

Java | Java 詳細・モダン文法:並行・非同期 – volatile の役割

volatile を一言でいうとvolatile は、「この変数の“最新の値”を、すべてのスレッドから必ず見えるようにする」ためのキーワードです。もっと砕くと、「CPU やスレッドごとのキャッシュにこもらせない」「書き込みと読み込みの順序を...
Java

Java | Java 詳細・モダン文法:並行・非同期 – synchronized の仕組み

synchronized は何を「約束」してくれるのかsynchronized は一言でいうと、「同じ場所を同時に触ろうとする複数スレッドを、順番待ちにさせる仕組み」です。もっと具体的に言うと、あるオブジェクト(ロック)に対して「今はこのス...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – 非同期が必要な理由

まず「なぜ非同期なんて面倒なものがあるのか」いきなり本音から言うと、多くの人はこう感じます。「同期処理だけで書けたらどれだけ楽か」「非同期って急に難しくなるし、できれば避けたい」実は JavaScript の世界でも、本音はかなり近いです。...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – 実行順序の全体像

まず「実行順序の全体像」を一言でまとめるJavaScript の実行順序は、ざっくり言うとこうなります。同期処理(ふつうのコード)を上から順番に実行する同期が一段落してコールスタックが空いたら、Promise 関連(マイクロタスク)を全部片...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – イベントループ

まずイベントループを一言でイメージするイベントループは、「JavaScript に“次にやるべき仕事”をひたすら渡し続ける司会進行役」です。JavaScript はシングルスレッドで、同時に動ける処理は 1 つだけですが、setTimeou...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – マイクロタスクキュー

マイクロタスクキューとは何か(まずざっくりイメージ)マイクロタスクキューは、「とても優先度の高い“あとで実行する処理”が並ぶ、特別レーンの待ち行列」 です。前回の「タスクキュー」は、setTimeout や DOM イベントなどのコールバッ...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – タスクキュー

まずタスクキューを一言でイメージするタスクキューは、「あとで実行する処理(コールバック)を順番に並べておく待ち行列」 です。JavaScript はシングルスレッドなので、「今」実行できるのは 1 つだけ。でも setTimeout や f...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – Web API の役割

全体像:Web API は「JavaScript の外にいる助っ人」まず前提から整理します。ブラウザの中で JavaScript が動くとき、JavaScript エンジン(言語そのものを実行する脳みそ)Web API(ブラウザが提供する「...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – コールスタック

コールスタックとは何か(まずイメージから)コールスタックは、「今、どの関数を実行中で、その関数からどの関数を呼び出しているか」を記録している“関数呼び出しの積み重ねメモ” です。JavaScript エンジンは、このコールスタックを見ながら...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – JavaScript がシングルスレッドである理由

まず「シングルスレッド」のイメージからJavaScript が「シングルスレッド」というのは、「同時に実行できるのは、基本的に1つのことだけ」 という意味です。console.log() を実行しているあいだは、他の関数は同時には動かない一...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – ブロッキングとは何か

「ブロッキング」とは何か(まずイメージから)「ブロッキング」は、ある処理が終わるまで、そこから先の処理が一切進めなくなる状態のことです。JavaScript だと「一番の働き手(メインスレッド)が、その処理に捕まってしまい、他のことが何もで...
JavaScript

JavaScript | 非同期処理:非同期の基礎概念 – 同期処理と非同期処理の違い

同期処理と非同期処理の一番大事なイメージまず、抽象的な言葉を捨てて、イメージから掴みにいきます。同期処理は、「一列に並んで順番待ちする世界」 です。前の人の処理が終わるまで、次の人は絶対に動けません。非同期処理は、「順番待ちの札だけ渡して、...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – クラスの初期化順序

ゴール:「クラスが new されたとき“何がどの順番で動くか”をイメージできるようになる」クラス設計がうまくいくかどうかは、「初期化の順番」をちゃんと理解しているかにかなり左右されます。フィールド初期化子(x = 1)コンストラクタの処理継...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – staticメソッド

ゴール:「これは“インスタンスのメソッド”か“クラスのメソッド”か」を自分で選べるようになるstatic メソッドは一言でいうと、「new した“個体”ではなく、“クラスそのもの”にぶら下がる関数」です。ここがあいまいなままだと、いつ us...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – staticプロパティ

ゴール:「static は“インスタンスじゃなくてクラスに属するもの”だと腹で理解する」static を一言でいうと、「new した“個体”ではなく、“クラスそのもの”にぶら下がるもの」です。ここがふわっとしたままだと、いつ User.na...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – getter / setter の型

ゴール:「getter / setter の“型”を見て、どう使うかイメージできるようになる」getter / setter は、クラスのプロパティに「振る舞い」をくっつける仕組みです。でも、ただ「便利そうだから使う」だと、だいたいごちゃつ...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – readonlyプロパティの活用

ゴール:「この値は“変わらない”」を型で約束できるようになるreadonly プロパティは、クラス設計でめちゃくちゃコスパのいい武器です。一言でいうと、「この値は、作ったあとに書き換えちゃダメ」をコンパイラに見張らせる仕組みです。「変わらな...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – public / private / protected

ゴール:「どこまで外に見せるか」を自分でコントロールできるようになるpublic / private / protected は、「クラスの中身をどこまで外に見せるか」を決めるスイッチです。ここをなんとなくで書くと、触ってほしくないところを...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – メソッドの型指定

ゴール:「メソッドの型だけ見て“何をするか”がだいたい分かるように書ける」クラスのメソッドって、書こうと思えば何でも書けます。だからこそ「型をどう付けるか」で、読みやすさと安全性が大きく変わります。ここでは、メソッドの基本的な型指定this...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – コンストラクタ引数と型

ゴール:「コンストラクタの引数に“どんな型をつけるか”を意識して設計できるようになることクラスを書くとき、コンストラクタは「インスタンスをどう初期化するか」を決める、とても重要な場所です。ここでの型設計が雑だと、作るときに毎回つらい間違った...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – プロパティの型設計

ゴール:「クラスのプロパティに“どんな型をつけるか”を意識して設計できるようになること」クラスを書くとき、「プロパティ名」だけでなく「プロパティの型」をどう設計するかで、そのクラスの使いやすさ・安全さがかなり変わります。ここでは、「とりあえ...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:クラス設計 – クラスの基本構文復習

クラスってそもそも何者?「設計図」と「new」の関係から整理するまずイメージからいきます。クラスはざっくり言うと、「オブジェクトを量産するための設計図」です。設計図(class)を書いておいて、new を使って「実物(インスタンス)」を何個...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:関数設計の深化 – 実務での関数分割ルール

ゴール:「どこまでを1つの関数にして、どこから分けるか」を自分の基準で判断できるようになる実務で一番モヤっとしやすいのがここです。「この関数、長い気はするけど、どこで分ければいいの?」「分けたら分けたで、逆に追いづらくならない?」ここでは、...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:関数設計の深化 – 可読性の高い関数型設計

ゴール:「関数の“型”を見ただけで、何をするかだいたい分かる」状態を目指す可読性の高い関数型設計って、難しい言い方をしているけれど、やりたいことはシンプルです。その関数の「型」だけを見たときに、何を受け取って何を返してどんな役割を持っていそ...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:関数設計の深化 – 関数設計での型肥大対策

ゴール:「型がデカくなってきた…」と感じたときに、落ち着いて“細く・分けて・名前をつける”発想を持てるようにするTypeScript を真面目に書けば書くほど、そのうち必ずこうなります。「型、でかすぎない?」「この関数の型注釈、もはや呪文な...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:関数設計の深化 – 非同期関数への移行準備

ゴール:「あとで async にしたくなっても困らない関数設計」を身につけるいきなり全部 async/await にする必要はありません。むしろ大事なのは、「今は同期処理だけど、いつでも非同期(async)に“安全に”移行できる形で関数を設...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:関数設計の深化 – assert関数の型定義

ゴール:「assert 関数の型」を“道具として設計できる”ようになるまずイメージからいきます。assert 関数は一言でいうと、「この条件が成り立たないなら、ここで止まってくれ」「この時点で、値はもう〇〇型だとみなしていい」という“宣言”...
TypeScript

TypeScript | 関数・クラス・ジェネリクス:関数設計の深化 – ユーザー定義型ガード

ゴール:「ユーザー定義型ガード」を“自分で設計して使いこなせる”ようになるここで目指したいのは、「ユーザー定義型ガードって何?」から一歩進んで、「いつ・どう設計するとコードが楽になるか」までイメージできる状態です。キーワードはこれです。va...
スポンサーリンク