正誤表(最終更新日:2025/04/23)

本書に下記のとおり誤りがございました。お詫びして訂正いたします。

初版第1刷をお持ちの方(第2刷で修正済み)

p.vii 「アプリケーションをWasabiOSで動かす」1段落目

アプリケーションをWasabiOSで動かすためには、cargo buildコマンドでビルドしたアプリケーションのバイナリを、WasabiOSが提供するrun_with_app.shというスクリプトを使用して走らせる必要があります。これらを自動的に行ってくれる便利なシェルスクリプトを用意したので、以下のスクリプトを自分のプロジェクトに追加してください。または、d0iasm/saba/run_on_wasabi.shからコピーすることもできます。

アプリケーションをWasabiOSで動かすには、cargo buildコマンドでビルドしたアプリケーションのバイナリを、WasabiOSが提供するrun_with_app.shというスクリプトを使用して走らせる必要があります。これらを自動的に行うシェルスクリプトを用意したので、以下のスクリプトを後ほどcargoコマンドによって作成するプロジェクトのトップディレクトリに追加してください。d0iasm/saba/run_on_wasabi.shからコピーもできます。

p.viii 1つ目のリスト下から6行目

p.viii 3段落1行目

また、もしスクリプトが途中で失敗したら、rm -rf buildなどによりダウンロードしたWasabiOSのソースコードを削除してみてください。

もしスクリプトが途中で失敗したら、rm -rf buildなどダウンロードしたWasabiOSのソースコードを削除してください環境によってはwgetの導入が必要です。

p.ix 4段落1行目

p.28 「ストレージ」1段落5行目

p.48 「スキームの確認」2つ目のリスト上から3行目

p.57 1つ目のリスト7行目

「3&b= 456」の半角スペースを削除

p.75 2つ目のリスト3行目

p.77 2行目

p.84 「文字列の前処理」2段落3行目

p.84 「文字列の前処理」2段落4行目

p.84 2つ目のリスト5行目

p.84 3つ目のリスト5行目

p.126 「AttributeValueUnquoted状態の実装」1段落1行目

p.130 1つ目のリスト3行目

間の矢印を削除し半角スペースに

p.134 1つ目のコマンド1行目

p.188 1つ目のコマンド1行目

p.215 1つ目のリスト10行目

「oken());」の部分を太字に

p.216 1つ目のリスト5行目

「loating_digit」の部分を太字に

p.216 1つ目のリスト7行目

「as f64」の部分を太字に

p.241 1つ目のコマンド7,8行目

├── layout_object.rs
├── layout_point.rs
├── layout_size.rs
└── layout_view.rs
├── layout_object.rs
└── layout_view.rs

p.438 「ローカルサーバの構築」2段落1行目

初版第1~2刷をお持ちの方(第3刷で修正済み)

p90 「メイン関数の実装」リスト下から1行目

p94 「メイン関数の変更」リスト5行目

p127 「AfterAttributeValueQuoted 状態の実装」2段落7行目

p128 リスト下から7行目

p166 「要素ノードの追加」2段落2行目

p167 リスト

        if current.borrow().first_child().is_some() { ── ❹
            let mut last_sibiling = current.borrow().first_child();
            loop { ── ❺
                last_sibiling = match last_sibiling {
                    Some(ref node) => {
                        if node.borrow().next_sibling().is_some() {
                            node.borrow().next_sibling()
                        } else {
                            break;
                        }
                    }
                    None => unimplemented!("last_sibiling should be Some"),
                };
            }

            last_sibiling
                .unwrap()
                .borrow_mut()
                .set_next_sibling(Some(node.clone())); ── ❻
            node.borrow_mut().set_previous_sibling(Rc::downgrade(
                &current
                    .borrow()
                    .first_child()
                    .expect("failed to get a first child"),
            ))
        } else { ── ❼
            current.borrow_mut().set_first_child(Some(node.clone())); ── ❽
        }

        current.borrow_mut().set_last_child(Rc::downgrade(&node)); ── ❾
        node.borrow_mut().set_parent(Rc::downgrade(&current)); ── ❿

        self.stack_of_open_elements.push(node); ── ⓫
    }
}
        if current.borrow().first_child().is_some() { ── ❹
            let mut last_sibling = current.borrow().first_child();	◀「sibling」のスペルを修正
            loop { ── ❺
                last_sibling = match last_sibling {	◀「sibling」のスペルを修正
                    Some(ref node) => {
                        if node.borrow().next_sibling().is_some() {
                            node.borrow().next_sibling()
                        } else {
                            break;
                        }
                    }
                    None => unimplemented!("last_sibling should be Some"),	◀「sibling」のスペルを修正
                };
            }

            last_sibling	◀「sibling」のスペルを修正
                .as_ref()	◀追加
                .unwrap()
                .borrow_mut()
                .set_next_sibling(Some(node.clone())); ── ❻
            node.borrow_mut().set_previous_sibling(Rc::downgrade(
                &last_sibling.expect("last_sibling should be Some")	◀変更
            ))
        } else { ── ❼
            current.borrow_mut().set_first_child(Some(node.clone())); ── ❽
        }

        current.borrow_mut().set_last_child(Rc::downgrade(&node)); ── ❾
        node.borrow_mut().set_parent(Rc::downgrade(&current)); ── ❿

        self.stack_of_open_elements.push(node); ── ⓫
    }
}

p171 リストの19行目

if current.borrow().first_child().is_some() {  ── ❺
    current
        .borrow()
        .first_child()
        .unwrap()
        .borrow_mut()
        .set_next_sibling(Some(node.clone())); ── ❻
    node.borrow_mut().set_previous_sibling(Rc::downgrade(
        &current
            .borrow()
            .first_child()
            .expect("failed to get a first child"),
    ));
if current.borrow().first_child().is_some() {  ── ❺
    current
        .borrow()
        .first_child()
        .unwrap()
        .borrow_mut()
        .set_next_sibling(Some(node.clone())); ── ❻
    ◀削除

p273 「位置の計算」2段落3、4、5行目

p273-274 リスト5、6、7、12、13、14行目

p275 リスト5、6、7、11、14、15、24、25行目

p334 リスト下から7行目

p379 リスト1行目

if self.input[self.pos].is_ascii_alphanumeric() || self.input[self.pos] == '$' {
if self.input[self.pos].is_ascii_alphanumeric()
|| self.input[s elf.pos] == '_' || self.input[self.pos] == '$' {	◀「|| self.input[s elf.pos] == '_'」を追加

p384 1つ目のリスト10行目

p394 「変数の取得」1段落1行目

p394 「変数の追加と更新」1段落1行目、2段落1行目

p395 「evalメソッドの変更」3段落3行目、6段落1行目

p405 上から3行目

p426 「ブラウザAPIを呼び出すメソッドの追加」4段落4行目

初版第1~3刷をお持ちの方

p379 リスト上から2行目