ホーム » スタッフ » 斉藤徹

斉藤徹」カテゴリーアーカイブ

2022年10月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

最新の投稿(電子情報)

アーカイブ

カテゴリー

情報制御基礎2022全講義録

情報メディア工学(前期)全講義録

オブジェクト指向プログラミング2022全講義録

データベースガイダンス2022

インターネットの情報量

インターネット上の情報量の話として、2010年度に281EB(エクサバイト)=281✕1018B(参考:kMGTPEZY)で、2013年度で、1.2 ZB(ゼタバイト)=1.2✕1021B という情報があった。ムーアの法則の「2年で2倍」の概算にも、それなりに近い。 では、今年2022年であれば、どのくらいであろうか?

しかし、これらの情報をGoogleなどで探す場合、すぐにそれなりに情報を みつけてくれる。これらは、どの様に実装されているのか?

Webシステムとデータベース

まず、指定したキーワードの情報を見つけてくれるものとして、 検索システムがあるが、このデータベースはどのようにできているのか?

Web創成期の頃であれば、Yahooがディレクトリ型の検索システムを構築してくれている。(ページ作者がキーワードとURLを登録する方式) しかし、ディレクトリ型では、自分が考えたキーワードではページが 見つからないことが多い。

そこで、GoogleはWebロボット(クローラー)による検索システムを構築した。 Webロボットは、定期的に登録されているURLをアクセスし、 そのページ内の単語を分割しURLと共にデータベースに追加する。 さらに、ページ内にURLが含まれていると、そのURLの先で、 同様の処理を再帰的に繰り返す。

これにより、巨大なデータベースが構築されているが、これを普通のコンピュータで実現すると、処理速度が足りず、3秒ルール or 5秒ルール (Web利用者は次のページ表示が3秒を越えると、次に閲覧してくれない)を実現するための能力が不足してしまう。だからこそ、これらを処理するには負荷分散が重要となる。

Webシステムの負荷分散

一般的に、Webシステムを構築する場合には、 1段:Webサーバ、2段:動的ページ言語、3段:データベースとなる場合も 多い。この場合、OS=Linux,Web=Apache,DB=MySQL,動的ページ生成言語=PHPの組合せによる、 LAMP構成とする場合も多い。

                            OS = Linux
               [ Webサーバ   動的Web言語  データベース ]
   User - - - - - Apache ----- PHP ----- MySQL

一方で、大量のデータを処理するDBでは、フロントエンド,セカンダリDB(スレーブDB),プライマリDB(マスタDB)のWebシステムの3段スキーマ構成となることも多い。
フロントエンドは、大量のWebユーザからの問合せを受ける部分であり、必要に応じてセカンダリDBに問合せを行う。
大量のユーザからの問合せを1台のデータベースシステムで捌くには処理の負荷が高い場合、複数のデータベースで負荷分散を行う。プライマリDBは、複数のデータベースシステムの原本となるべきデータを保存される。負荷分散の為に分散されたセカンダリDBは、プライマリDBと内容の同期をとりながらフロントエンドからの問合せに応答する。

データベースシステム

データベースには、ファイル内のデータを扱うためのライブラリの BerkleyDB といった場合もあるが、複雑なデータの問い合わせを実現する 場合には、リレーショナル・データベース(RDB)を用いる。 RDBでは、データをすべて表形式であらわし、SQLというデータベース 問い合わせ言語でデータを扱う。 また、問い合わせは、ネットワーク越しに実現可能であり、こういった RDBで有名なものとして、Oracle , MySQL , PostgreSQL などがある。 単一コンピュータ内でのデータベースには、SQLite などがある。

リレーショナルデータベースの串刺し

商品名 単価 個数 価格
りんご 200 2 400
みかん 50 6 300
アイスクリーム 125 1 125
みかん 50 3 150

このような表データでは、たとえば「みかん」の単価が変更になると、2行目,4行目を変更しなければいけなくなる。巨大な表の場合、これらの変更は大変。

そこで、この表を2つに分類する。

単価表
商品ID 商品名 単価
1010 りんご 125
1011 みかん 50
2101 アイスクリーム 125
販売表
商品ID 個数
1010 2
1011 6
2101 1
1011 3
必要に応じて、2つの表から、以下のような SQL の命令で、データを抽出する。

select 単価表.商品名, 単価表.単価, 販売表.個数, 単価表.単価*販売表.個数
    from 単価表, 販売表 ;

 

データベースに求められるのACID特性

データベースシステムと呼ばれるには、ACID特性が重要となる。(次に述べるデータベースが無かったら…を参照)

  • A: 原子性 (Atomicity) – 処理はすべて実行するか / しない のどちらか。
  • C: 一貫性 (Consistency) – 整合性とも呼ばれ、与えられたデータのルールを常に満たすこと。
  • I: 独立性 (Isolation) – 処理順序が違っても結果が変わらない。それぞれの処理が独立している。
  • D: 永続性 (Durability) – データが失われることがない(故障でデータが無くならないとか)

しかし、RDBでは複雑なデータの問い合わせはできるが、 大量のデータ処理のシステムでは、フロントエンド,セカンダリDB,プライマリDB の同期が問題となる。この複雑さへの対応として、最近は NoSQL(RDB以外のDB) が 注目されている。(例: Google の BigTable)

データベースが無かったら

これらのデータベースが無かったら、どのようなプログラムを作る 必要があるのか?

情報構造論ではC言語でデータベースっぽいことをしていたが、 大量のデータを永続的に扱うのであれば、ファイルへのデータの読み書き 修正ができるプログラムが必要となる。

こういったデータをファイルで扱う場合には、1件のデータ長が途中で 変化すると、N番目のデータは何処?といった現象が発生する。 このため、簡単なデータベースを自力で書くには、1件あたりのデータ量を 固定し、lseek() , fwrite() , fread() などの 関数でランダムアクセスのプログラムを書く必要がある。

また、データの読み書きが複数同時発生する場合には、排他処理(独立性)も 重要となる。例えば、銀行での預け金10万の時、3万入金と、2万引落としが 同時に発生したらどうなるか? 最悪なケースでは、 (1)入金処理で、残金10万を読み出し、 (2)引落し処理で、残金10万を読み出し、 (3)入金処理で10万に+3万で、13万円を書き込み、 (4)引落し処理で、残金10万-2万で、8万円を書き込み。 で、本来なら11万になるべき結果が、8万になるかもしれない。

さらに、コンピュータといってもハードディスクの故障などは発生する。 障害が発生してもデータの原子性永続性を保つためには、バックアップや 障害対応が重要となる。

福井大学リカレント教育・プログラミング応用

{CAPTION}

mariadbトラブル appamor

mariadb が止まってしまう

パッケージの更新をしていたら、mariadb が起動しなくなる。systemctl start mariadb を実行すると、コマンドラインに帰ってこない。Ctrl-Z で background にすると WordPress も動いているし問題ないのかと思えば、30分ほどするとエラーを吐いてとまる。journalctl -xe で吐いているエラーを確認すると以下のようなメッセージが残っていた。

AVC apparmor="DENIED" operation="connect" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/mysqld" name="run/nscd/socket" pid=67400 comm="mysqld" requested_mask="wr" denied_mask="wr" fsuid=118

メッセージを元にググると、こちらの記事が該当した。

AppArmor(Application Armor)は、各プログラムにセキュリティプロファイルを結びつけ、プログラムのできることに制限をかけるプログラム…らしい。(wikipediaより)

AppArmor の不具合を解消

パッケージを MySQL から MariaDB に移行する際に、AppArmor でトラブルが残ったみたい。こちらの記事を参考に、以下のコマンドで、ゴミを消したらうまく起動するようになった。

$ sudo aa-remove-unknown
Removing '/usr/sbin/mysqld'         mysql関連のゴミを消してくれたみたい。
$ sudo systemctl start mariadb      無事に起動

VSCodeとXAMPPのインストール

Webアプリ開発の基本を勉強するために、HTML+CSS、JavaScript のフロントエンドと、PHP+データベースのバックエンドを簡単な演習で体験するのであれば、プログラムのエディタの VS Code (Visual Studio Code) と、自分のパソコンで動かせる Webサーバ XAMPP をインストールして演習してみましょう。

Visual Studio Code のインストール

Visual Studio Code は、Microsoft 社が開発しているプログラムのエディタ(様々なテキストの編集ソフト)であり、最近のプログラマーの中で一番利用されています。

まずは、Visual Studio Code をパソコンにインストールしてみましょう。Visual Studio Code で検索すれば、簡単に見つかると思います。

Windows 10,11 (64bit OS)であれば、Windows System Installer 64bit を選んで、ダウンロードしたファイルを実行しましょう。インストールが始まります。

Visual Studio Code の起動と設定

インストールが終わったら、メニューから  を起動してください。

拡張機能のインストール機能を用いて、日本語メニューを出すための Japanese Language Pack をインストールしてください。

拡張機能のインストールが終わると Restart の表示がでるので VSCode の再起動を行ってください。

XAMPP のインストール

次に、XAMPP(正式にはシャンプと発音, ザンプは間違いらしい😢) をインストールします。XAMPP は、様々なOS の上で、ウェブアプリケーションの開発に必要な Webサーバ機能(Apache)データベース機能(Maria DB)動的Webページ用言語(PHP, Perl) をまとめてインストールでき、ウェブアプリケーションの学習用に広く使われています。

インターネットに自分の作ったウェブアプリケーションのシステムを公開するのであれば、OS Linux で、Apache, MySQL, PHP を動かすのが一般的です。この構成は通称 LAMP (ランプ) と呼ぶことが多い。XAMPP も X(??), Apache, MariaDB, PHP, Perl の組み合わせなので XAMPP と名付けられた。

XAMPPのダウンロード

XAMPPのホームページダウンロードより、最新の Windows 用 XAMPP 8.1.6 をダウンロードし、実行するとインストールが始まる。

インストーラーを起動するの以下のような画面になるが、次々と “Yes”や”Next”を選んでいく。

インストールする機能の選択の画面で、今回の演習は、Webサーバ機能(Apache)と、動的なWebプログラム言語(PHP)を選択するだけでいい。

XAMPPの起動

XAMPPのインストールが終わったら、メニューの  よりプログラムを起動する。

プログラムを起動すると、Windows のファイアウォール機能により、以下のような画面が出てくるが、アクセスを許可する。

XAMPP が起動すると、タスクバーに XAMPP のアイコンが現れるのでクリックすると、XAMPP のコントロールパネルが表示される。一番上の Apache の “Start”ボタンを押すと Webサーバ Apache が起動する。

右上の “Config” ボタンを押し、以下の画面が表示されたら、”Editor:”欄に、先にインストールした “VS Code” や ”Browser:”欄に、自分が使うブラウザを設定しておくと便利。

ブラウザを起動し、URL 欄に “http://localhost/” を入力し、以下の画面が表示できたら、XAMPP が動いていることが確認できる。

XAMPP で表示するファイルを編集する場合は、VS Code を開き、“C:\xampp\htdocs” の中の index.php や *.html , *.css といったファイルを開いて編集すればいい。

マルツ電波二の宮店

プロコンで必要な部品購入だけど学校通すと時間かかるし、直接マルツ電波さんに買い物。そういえば、最近の学生さんは地元で電子部品を買える場所知らないよな…。
{CAPTION}

{CAPTION}

電子部品以外にも、パソコン周りのボードやアマチュア無線の機材も扱ってるよ。
{CAPTION}

公開講座 スマホ向けゲームアプリを作る

8/27(土),28(日)の両日、小学校・中学生を対象とした 「スマートフォン向けのWebゲームアプリを作ろう! 〜RPGゲームを作ってプログラミング入門〜」を開催しました。
スマートフォン向けのWebブラウザで動くゲームアプリを作ろうということで、 プログラミング研究会の学生が作った簡単なゲームプログラムで 敵キャラクターの強さなどを調整したりキャラクターの絵を差し替えたり といった作業を通して、プログラミングに興味を持ってもらいました。

mariadb の utf8mb4 への移行完了

自宅サーバで、mysqlからmariadbへの移行、内部文字コードが Latin1 になっていたものを utf8mb4 への変更がようやく上手くいったと思う。そこで、学科のWebサーバも同様に移行作業を行う。ただ、文字コードの移行などの際にデータベースの物理ファイルを壊してしまったようで、どこまで上手く治ったのかが不安。