カテゴリー
学術

計算機科学入門

 計算機を使って学術的な正当性を主張するならばそれを支える揺るぎない理論的裏付けが必要で、数学がそれを叶えてくれると思いました。

ChatGPTに聞いてみた。

M.アービブ著の計算機科学入門はどんな本ですか。ChatGPT

M.アービブ著の『計算機科学入門』は、計算機科学の初学者向けに書かれた入門書です。コンピューターサイエンスの基礎的な概念や理論、プログラミング言語、アルゴリズムなどについて詳しく解説されています。

本書は、計算機科学の基礎知識を習得したい初学者向けに書かれており、特にプログラミングを初めて学ぶ人にも分かりやすいように構成されています。章ごとに重要なポイントをまとめた要約や、練習問題なども用意されているため、学習の効果を高めることができます。

『計算機科学入門』は、計算機科学に興味を持っている人や、プログラミングやアルゴリズムの基礎を学びたい初学者にとって、非常に役立つ一冊となっています。また、数学や物理学などの分野に興味がある人にとっても、コンピューターサイエンスにおける数学的な考え方やアルゴリズムの応用などを学ぶことができるため、広い層の人々にとって興味深い本となっています。

カテゴリー
学術

システム構成技術

岩波講座 マイクロエレクトロニクス 10 1988年2月発行

 当時の巨大な通信システムの構造が分かりそうですが、私には馴染みのない内容でした。

カテゴリー
学術

VLSIコンピュータⅡ

岩波講座 マイクロエレクトロニクス 9 VLSIコンピュータ II 1987年7月発行

 汎用CPU以外のVLSIが色々解説されています。じっくり勉強してみたい本です。

カテゴリー
学術

VLSIコンピュータⅠ

 16ビットCPUまでがLSIで32ビットからVLSIとなっていくようです。命令も高機能になり従来よりも一命令に必要なクロックサイクルが長くなりました。

 一つの命令を実行する過程の一部を見てみると、CPU内部の回路が同時に全て動作はしません。空いている回路にも演算させるためにパイプライン技術が登場します。

 同時に実行できる命令を増やすために並列化も登場し回路同士を協調させる機構も必要です。更にソフトウェア開発の作業を軽減させるために高機能な命令をどんどん増やされていきました。

 ICの実装技術の向上が高機能VLSIを登場させたと思います。本来の原始的な機能では足りず高機能化と高効率化を追い求め更にエネルギー効率を向上させた結果に富嶽やスマホの実現があります。

 初期型16ビットCPUとそれ以降とが分水嶺なんですね。

カテゴリー
学術

プログラミング言語とVLSI

岩波講座 マイクロエレクトロニクス 7 1988年1月発行

 Smalltalkを使い並列処理で人工知能を実現するためそれ用のVLSIを開発しようとしていたが逐次処理のプロセッサーの進化が速すぎて実現できなかったようです。

 1980年代中庸、ImPP(UPD7281)も同じような理由で消えていったのでしょうか。

 現在はCPUコアの複数化やCPU自体をたくさん積むなど並列処理全盛ですがこの頃の技術が生きていいるのでしょうか。

カテゴリー
学術

マイクロコンピュータのプログラミング

岩波講座 マイクロエレクトロニクス 6 1987年8月発行

 MS-DOSやらLattice Cやらが出てきてとても懐かしいです。ここから先は専門なのですが、知らなかったことも多くありますので真面目に勉強します。

カテゴリー
学術

マイクロコンピュータのハードウェア

岩波講座 マイクロエレクトロニクス 5 1984年11月発行

 16bit時代のマイクロコンピュータのハードウェアが解説されています。各社の主なCPUを取り上げているところが勉強になります。ハードウェアの基礎が解りやすく解説されていました。

カテゴリー
学術

VLSIの設計

岩波講座 マイクロエレクトロニクス 3 1987年9月発行

 VLSIという言葉自体が古めかさを感じる時代ですね。人手ではなく専用システムを使って設計できるからこそ集積度が上がっていったのでしょう。これも個人で作ることができないので参考にならなかったです。

カテゴリー
学術

マイクロエレクトロニクス素子

岩波講座 マイクロエレクトロニクス 1 1987年11月発行

 集積回路の構造を素材から解説している。当時の技術なので今は違うと思うがICすら個人では作れないので遠い出来事のようでした。

カテゴリー
学術

情報と符号の理論

 岩波講座 情報科学4 1985年8月発行

 距離に関わらず情報を“正確”に伝えることは大変な理論と工夫が必要なのがわかりました。それは一つのデバイスの中でさえも情報を確実に伝えるのは難しいテーマなのです。誤りの訂正から暗号へ発展していくこともわかる気がします。

カテゴリー
学術

情報ネットワークの理論

 岩波講座 情報科学5 1982年6月発行 コンピューターの通信のみならず放送や通信までにも渡る基礎から説いてあります。デジタル通信の元にアナログ通信があります。広い範囲が良くまとまっている本でした。

カテゴリー
学術

熱輻射論講義

 私の知能では難しくて解りませんでした。

 なので、ChatGPTに聞いてみた。

User
マックス・プランク著の熱輻射論講義という本は知っていますか。

ChatGPT
はい、知っています。マックス・プランクが提唱した量子論の発展において非常に重要な役割を果たした、彼の著書の一つです。この講義で、プランクは物質と放射線の相互作用についての理論を提唱し、熱放射のスペクトルの解析に成功しました。この成果は、量子力学の発展につながり、量子力学の基礎を築くことになりました。

User
読んでも良く解らなかったので内容を要約できますか。

ChatGPT
「熱輻射論講義」という書籍は、マックス・プランクが開発した量子論の重要な発展に関する著書です。この講義では、物質と放射線の相互作用についての理論が提唱され、熱放射のスペクトルの解析が行われました。

熱放射とは、温度によって放出される電磁波のことであり、それらの波の振幅や周波数は温度に依存することが知られています。プランクは、この現象を量子論に基づいて説明するために、エネルギーの量子化の考え方を導入しました。

具体的には、プランクは放射エネルギーを、周波数に比例する一定の値(プランク定数)をかけたエネルギーの小さなパケット(量子)として考えました。このアプローチは、当時の物理学者たちにとっては奇妙であったものの、実験結果と合致し、量子論の基礎を築くことになりました。

この講義で示された理論は、現代の物理学においても重要な位置を占めています。

カテゴリー
学術

自作ROMライター そのC

 今までuPC741Cを何個もブレッドボードに並べて回路を構成していました。機能を拡大するにつれ配線が複雑になり動作の不安定化を招いていたのです。

 でもuPC458Cはオペアンプが4個入っているので一つの小さい方のブレッドボードで1チャンネルの信号を処理するようにしてみます。4チャンネルを一つの大きい方のブレッドボードで構成するよりも組み易くなると思っています。

カテゴリー
学術

自作ROMライター そのB

 今までの失敗は、正負電源が貧弱で充分な電力を供給できなかったのと、パソコンからの信号処理する回路が複雑になり安定した動作を期待するほど実装能力が無いのが原因です。

それでuPC458Cで作り直してみます。

カテゴリー
学術

確率の哲学的試論

 ラプラスという人は単なる数学者ではなく激動のフランス革命を生き抜いた偉人だったのは知りませんでした。賭け事が好きな人にお勧めしたい一冊です。

カテゴリー
学術

真空マイクロエレクトロニクス

カテゴリー
学術

Flutterで状態管理あれこれ2

 状態管理の元となるInheritedWidgetを理解するためにカウンターアプリを改造して実装してみましたがとても複雑でした。

 それで流行りのパッケージを実装してみました。使いやすいように InheritedWidget をラップしているのでコードは短くなるのですが、バージョンによって細かく記述方法が異なりなり正解にたどり着くのが大変です。

  flutter_hooks: ^0.17.0
  hooks_riverpod: ^0.14.0+4
  state_notifier: ^0.7.0
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

final viewModel = StateNotifierProvider((_) => ViewModel());

class ViewModel extends StateNotifier<int> {
  ViewModel() : super(0);
  void increment() => state++;
  void decrement() => state--;
}

void main() {
  runApp(
    ProviderScope(
      child: CounterApp(),
    ),
  );
}

class CounterApp extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final _viewModel = useProvider(viewModel);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('CounterApp')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(
                _viewModel.toString(),
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          ),
        ),
        floatingActionButton: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            FloatingActionButton(
              heroTag: 'increment',
              onPressed: () => context.read(viewModel.notifier).increment(),
              child: Icon(Icons.add),
            ),
            Gap(15),
            FloatingActionButton(
              heroTag: 'decrement',
              onPressed: () => context.read(viewModel.notifier).decrement(),
              child: Icon(Icons.remove_circle_outline),
            ),
          ],
        ),
      ),
    );
  }
}

 このコードもパッケージのバージョンがちょっとでも上がれば直さなくなると思います。

Flutterで状態管理あれこれ2
Flutterで状態管理あれこれ2

実機のスクリーンショットは
flutter screenshot
で撮れます。プロジェクトフォルダーに画像が保存される。

カテゴリー
学術

Flutterで角を丸くする

 TextFieldやDropdownButtonの角を丸くしてみた。結局ConainerのBorderを丸くして角が丸くなったように見せるだけだった。

Flutterで角を丸くする
Flutterで角を丸くする
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    String dropdownValue = 'One';
    return Scaffold(
      backgroundColor: Colors.grey,
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ClipRRect(
              borderRadius: BorderRadius.all(Radius.circular(30)),
              child: Container(
                width: 200,
                height: 100,
                color: Colors.yellow,
                child: Padding(
                  padding: const EdgeInsets.all(8),
                  child: const TextField(
                    obscureText: true,
                    decoration: InputDecoration(
                      border: InputBorder.none,
                      labelText: 'Pass',
                    ),
                  ),
                ),
              ),
            ),
            Gap(20),
            Container(
              padding: const EdgeInsets.symmetric(horizontal: 5),
              width: 200,
              decoration: BoxDecoration(
                border: Border.all(color: Colors.blue),
                borderRadius: BorderRadius.circular(20),
              ),
              child: const TextField(
                obscureText: true,
                decoration: InputDecoration(
                  border: InputBorder.none,
                  labelText: 'Pass',
                ),
              ),
            ),
            Gap(20),
            Container(
              padding: const EdgeInsets.symmetric(horizontal: 5),
              width: 200,
              decoration: BoxDecoration(
                border: Border.all(color: Colors.blue),
                borderRadius: BorderRadius.circular(20),
              ),
              child: DropdownButton<String>(
                value: dropdownValue,
                icon: const Icon(Icons.arrow_downward),
                iconSize: 24,
                elevation: 16,
                style: const TextStyle(color: Colors.deepPurple),
                onChanged: (String? newValue) {},
                items: <String>['One', 'Two', 'Free', 'Four']
                    .map<DropdownMenuItem<String>>((String value) {
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(value),
                  );
                }).toList(),
              ),
            ),
            Gap(20),
            Text(
              'You have pushed the button this many times:',
              style: TextStyle(color: Colors.white),
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
カテゴリー
学術

Flutterの状態管理あれこれ

 状態管理の要点はその状態に影響を受けるWidgetのみが状態変化に対する処理を行えるように効率化することです。

InheritedWidget
 Flutter自身を構成するWidgetの一つ。Widgetツリーの配下に効率的に情報を伝える仕組みを提供します。

Flutter_InheritedWidget
Flutter_InheritedWidget
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(
        key: null,
        child: Scaffold(
          appBar: AppBar(
            title: Text("Inherited Widget Sample"),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                WidgetNumText(),
                WidgetCenterText(
                  key: null,
                ),
              ],
            ),
          ),
          floatingActionButton: WidgetIncrementBtn(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({required Key? key, required this.child}) : super(key: key);

  final Widget child;

  @override
  _MyHomePageState createState() => _MyHomePageState();

  static _MyHomePageState of(BuildContext context, {bool rebuild = true}) {
    return rebuild
        ? (context.dependOnInheritedWidgetOfExactType<_InheritedWidget>()
                as _InheritedWidget)
            .data
        : (context
                .getElementForInheritedWidgetOfExactType<_InheritedWidget>()!
                .widget as _InheritedWidget)
            .data;
  }
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return _InheritedWidget(
      child: widget.child,
      data: this,
    );
  }
}

class WidgetIncrementButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final _MyHomePageState state = MyHomePage.of(context, rebuild: false);
    return FloatingActionButton(
      onPressed: () => state._incrementCounter(),
      tooltip: 'Increment',
      child: Icon(Icons.add),
    );
  }
}

class _InheritedWidget extends InheritedWidget {
  _InheritedWidget({
    Key? key,
    required Widget child,
    required this.data,
  }) : super(key: key, child: child);

  final _MyHomePageState data;

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;
}

class WidgetNumText extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final _MyHomePageState state = MyHomePage.of(context);
    return Text(
      '${state._counter}',
      style: Theme.of(context).textTheme.headline4,
    );
  }
}

class WidgetIncrementBtn extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final _MyHomePageState state = MyHomePage.of(context, rebuild: false);
    return FloatingActionButton(
      onPressed: () => state._incrementCounter(),
      tooltip: 'Increment',
      child: Icon(Icons.add),
    );
  }
}

class WidgetCenterText extends StatelessWidget {
  const WidgetCenterText({required Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Text('You have pushed the button this many times:');
  }
}

Memo
Shader compilation errorが出たら
エミュレーターからアプリを消してflutter cleanする


Provider
 InheritedWidgetのラッパークラスで状態管理とDI機能を提供します。

StateNotifer
状態管理パッケージでProviderをベースに作られている。同じ作者。

カテゴリー
学術

UbuntuでもFlutter開発環境を作ってみた

 Android Studioは公式の説明通りにインストールしFlutterとDartのプラグインを追加した。

Google Pixelを有効にするためのコマンド
echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"18d1\", MODE=\"0666\", GROUP=\"plugdev\"" > /tmp/51-android.rules
sudo cp /tmp/51-android.rules /etc/udev/rules.d/51-android.rules

Flutterのインストール
git clone https://github.com/flutter/flutter
sudo mv flutter /usr/local/
sudo apt install clang curl pkg-config ninja-sudo apt install clang curl pkg-config ninja-build cmake libgtk-3-dev libblkid-dev liblzma-dev unzipbuild cmake libgtk-3-dev libblkid-dev liblzma-dev unzip
flutter config --enable-linux-desktop
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, 2.5.0-7.0.pre.182, on Ubuntu 20.04.3 LTS
    5.4.0-83-generic, locale ja_JP.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 2020.3)
[✓] Android Studio
[✓] VS Code (version 1.59.1)
[✓] Connected device (4 available)
Kindle Fire 7で Flutter
Kindle Fire 7で Flutter

更にKindle Fire 7 で実行してみた。