Tkinter GUIプログラミング レイアウトマネージャpack

 今日も見に来てくださって、ありががとうございます。石川さんです。

 Tkinterのレイアウトマネージャは三種類あるのですけど、その中のpackがちょっとだけよくわからなかったので、いろいろと動作確認をしてみましたのでまとめます。お役に立てればうれしいです。

 packというくらいなので、箱詰めするんだよねぇ、というところまではイメージ通りなのですけど、箱詰めの方法がよくわからんなぁ、ということで、packのソースファイルまでさかのぼって確認してみました。コメントには、以下のようになってました。

Pack a widget in the parent widget. Use as options:
after=widget - pack it after you have packed widget
anchor=NSEW (or subset) - position widget according to given direction
before=widget - pack it before you will pack widget
expand=bool - expand widget if parent size grows
fill=NONE or X or Y or BOTH - fill widget if widget grows
in=master - use master to contain this widget
in_=master - see 'in' option description
ipadx=amount - add internal padding in x direction
ipady=amount - add internal padding in y direction
padx=amount - add padding in x direction
pady=amount - add padding in y direction
side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.

 このsideパラメータで位置を決めていますので、組み合わせでどうなるか、ちょっとやってみました。

ソースコード

 ソースコードは以下の通りです。

import tkinter as tk
import itertools as it

SIDES = [tk.TOP,tk.BOTTOM,tk.LEFT,tk.RIGHT]
COLORS = ["red","green","blue","yellow","gray"]

class Test(tk.Toplevel):
    def __init__(self, master, i, sides):
        super().__init__(master)
        self.title(str(i))
        self.geometry("140x120")
        for i, l in enumerate(sides):
            label = tk.Label(self,text=l, bg=COLORS[i])
            label.pack(side=l)
        
class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Pack test")

        for i, s in enumerate(it.combinations_with_replacement(SIDES,len(COLORS))):
            print(i,s)
            t = Test(self, i, s)
            t.geometry("+"+str(10 + (i%10)*140)+"+"+str(10 + (i//10)*130))

        self.geometry("300x30+900+700")
        
if __name__ == "__main__":
    app = App()
    app.mainloop()

実行結果

 上のソースコードの実行結果です。

実行結果

解説

 どこへウィジェットを加えるかを決めるパラメータの、sideですが、TOPBOTTOMLEFTRIGHTの四種類の位置をセットすることができます。この組み合わせでどうなるか確認したかったので、itertoolscombinations_with_replacementを使って組み合わせを実現することにしました。このcombinations_with_replacementは、指定された長さのタプル列を重複ありのソートされた順で戻してくれます。

 このスクリプトでは、クラスを二つ定義しています。一つは、Tkを継承した本体のクラスで、もう一つは新たなウィンドウを作成するためのToplevelを継承したTestクラスです。このTestクラスでsideをいろいろと設定してみて試してみました。

 順番は、赤、緑、青、黄色、グレーの順で追加されています。afterbeforeを指定すれば順番が入れ替わるようですが、今回は追加した順番になっています。面白いな、と、思ったのは、RIGHTBOTTOMを指定した順番が右から順番、下から順番という風になっているところです。何となく、上から順番、左から順番と思っていたので、おやっ、と、思いました。

まとめ

 要素が多くないときや、単純な並びの時は、packが便利に使えそうですね。

PHPのバージョンアップその2

 今日も見に来てくださって、ありがとうございます。石川さんです。

 そうそう、昨日のPHPのバージョンアップ、やっぱりうまくいっていないよねぇ、と、いろいろ調べましたので、記録しておきます。

 いや~、ひどい目にあいましたよ~!

 慌てていろいろやったので、記憶に残っている限りで原因はこれかなぁ、という感じですが、ご参考になれば幸いです。

 最初に、google-fluentdがエラーを出していたのが原因なのかなぁ、と、思ってこちらを調べてみました。こちら、ログを出力するためのサービスだそうです。Googleさまがトラブルシューティングをここに書いておいてくれていました。Google Cloud MarketPlaceからのイメージを使っている場合は、Loggingエージェントが無効になっていて、そのためにエラーが出ているということがわかりました。そうそう、このWordPressのサイトを立ち上げるときに、MarketPlaceからイメージを利用させていただきまして、あっという間に構築したのでした。それで、このLoggingエージェントを有効にする方法もここに記載してくれてあったので、そのとおりに実行するとエラーが出なくなりました。
 が、、、PHPのバージョンは依然として変化ありませんでした。

 PHPのバージョン、7.0.33がまだ動作していると言われているのは、このバージョンのPHPが残っているからだよねぇ、と思ったので、思い切ってアンインストールすることにしました。なんでそんなに思い切っちゃいましたかねぇ。そうそう、こんなコマンドでした。

$ sudo apt-get remove php7.0 php7.0-cli

 そうすると、もう使わなくなったものは、このコマンドで削除できますよ~、と、言ってきたので、調子に乗って、実行してみました。

$ sudo apt autoremove

 そして、ヘルスチェックはこれでどうなったかしらと見に行ったところ、PHPのスクリプトがそのまま出力されてきました。そう、どのページに行っても、全部スクリプトなのです。動かなくなったけど、一歩前進ですね。ちょっぴり後退したようにも思えますが、やったことが影響あったということで、前進したと思いましょう。
 これは、いままで動いていたモジュールがなくなったのが原因でした。ただ最初は原因がわからないので、あちこち調べて、バージョンアップしたり、設定ファイルをいじったり、いろいろとウロウロしてしまいました。

 最終的に、効果があったのは、以下のコマンドだと思います。

$ sudo apt-get install libapache2-mod-php --reinstall   # ←これは必要なかったかも知れない
$ sudo a2enmod php7.4
$ sudo systemctl restart apache2

 最初は、単に.phpのファイルが認識できていなくて、phpが実行できないから、その設定をすればいいのかな、と考えていて、ずっとそっちの路線で調べていたのでした。この「a2enmod」というコマンド、今回初めて発見しました。どうやらapache2のモジュールを有効化するコマンドということだそうです。インストールしたけど、有効になっていなかった、というのが原因だったということなのね。

 ということで、サイトヘルス、良好になりました。

 ふ~、まだまだ知らないことがたくさんあるなぁ、と、思い知らされた事件でした。いやー、バックアップ取って実行していたから、いろいろと思い切ってやることができました。クラウドのサービス、すばらしいですね!
 ということで、これからも精進いたします。

 しばらくたって落ち着いてきたので、PHPのプロセスを確認してみると、php-fpmは7.3が動いているようでした。

$ ps ax | grep php
26168 ?        Ss     0:00 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
26169 ?        S      0:00 php-fpm: pool www
26170 ?        S      0:00 php-fpm: pool www
29794 pts/0    S+     0:00 grep php
$ 

 他のは7.4になっていたので、これもバージョンアップしておこうと、以下のコマンドを実行しました。

$ sudo a2enconf php7.4-fpm

 よく見ると、上記コマンド実行時のログにこんな風に出力されていました。

NOTICE: Not enabling PHP 7.4 FPM by default.
NOTICE: To enable PHP 7.4 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.4-fpm
NOTICE: You are seeing this message because you have apache2 package installed.

 はい、ちゃんと、書いてあったのですねぇ。まだデフォルトで使えるようになってないですよ。使えるようにするには、コマンド実行してね、って。

そして、a2enconf php7.4-fpmを実行したら、次にやることがちゃんと出ていました。

Enabling conf php7.4-fpm.
To activate the new configuration, you need to run:
  systemctl reload apache2

apache2をリロードして完了です。もしかしたら、昨日のコマンド実行時にもNOTICEが出ていたのかもしれないなぁ、ということで、ログをちゃんと見てれば回避できたかもしれないトラブルでしたね。

PHPのバージョンアップ

 今日も見に来てくださってありがとうございます。石川さんです。

 このサイト、WordPressで作られています。管理画面にダッシュボードというのがあるのですけど、使っているプラグインやテーマが古くなると、更新してください、と教えてくれる優れものです。先日も更新してください、と言われましたので、しゅるっと更新しました。更新についても何か書こうと思いましたが、簡単すぎて記憶に残っていません。

 更新後、ダッシュボードを見ていて、ふと、気づきましたが、何やら問題がありそうです。

サイトヘルスステータスに「改善が必要」と出てきました。

 まったく意味が分かりませんが、5項目ほど改善が必要な項目があるそうです。見てみましょう。左下の「サイトヘルス画面」をクリックしてみます。

サイトヘルス画面

 なんと、WordPressさん、こんな機能まであるのですね!すばらしい。おすすめの改善はいいとしても、致命的な問題は捨て置けませんね。ということで、サイトのPHPのバージョンアップ、したいと思います。

 しかし、どうやるのでしょうかねぇ。ぼくのサイト、GoogleさまのGoogle Cloud Platform (GCP)のCompute Engineというサービスを利用していまして、もう一年以上前にセットアップしたので記憶が、、、薄いなぁ。確か、MarketPlaceに用意されていたWordPress用のイメージをVMのインスタンスとしてDeploy、みたいな感じだったような。当時よくわからず、セットアップしたら、Googleさまの方で勝手に最新版に更新してくれるなんてすごいよねぇ、と、勘違いしておりました。いや、自分でやんなきゃね。

 ということで、手順は以下の通り進めていきましょう。

  • まず、自分の使っているサーバーのOSを調べる。わからなければ調べ方を調べる。
  • そのOSのPHPの更新方法を調べる。
  • 更新する前にバックアップを取得。そのためにバックアップの取り方を調べる。
  • PHPを最新版にアップデートする。
  • 動作確認。正常に動作していれば、バックアップを削除して完了。
  • 正常に動作していなければ、バックアップを戻して、ふりだしに戻る。

 と、いう感じでしょうか。計画通りにうまく行くといいのですけど。

サーバーOSの確認~バックアップ

 とりあえず、GCPのダッシュボードを見てみましょう。そこからCOMPUTE ENGINEに移動して、このサイト用のVMインスタンスの情報を見てみます。ええと、OSのバージョンは特に記載されていませんでしたね。と、いうことでSSHを使ってログインしましょう。Linuxマシンですので、バージョン確認方法をGoogle先生に教えてもらいましょう。このサイトが出てきました。最初に三つのやり方が示されていましたので、簡単に一つ目を実行してみました。

prompt $ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
prompt $ 

 OSは、Debian 9ということですね。
 そして、次はPHPのバージョンアップですが、今のバージョンを調べるコマンドは、php -vということですので実行してみます。

prompt $ php -v
PHP 7.0.33-0+deb9u7 (cli) (built: Feb 16 2020 15:11:40) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u7, Copyright (c) 1999-2017, by Zend Technologies
prompt $ 

 PHPのバージョンは、7.0.33-0+deb9u7ということだそうです。アップグレードの前にバックアップを取ろう。Google Cloud Platformは、スナップショットという機能で、バックアップできるようです。Compute Engineでスナップショットを選択して、スナップショットの作成をクリックします。

スナップショットの作成

 ソースディスクにWordPressのVMを選択して、作成クリックすれば簡単にできそうですね。ソースディスクを選ぶとソースディスクのロケーションに基づいて、勝手にロケーションが決まりました。たくさん管理している人は、ラベルを追加するようですが、ぼくはこのサイトだけしか管理していないので、そのままで「作成」をクリックします。しばらく時間がかかって、スナップショットが出来上がりました。スナップショットはバックアップ目的で、スケジューリングして定期的に実行することが推奨されているようですね。初めて知りました。最新の状態が残っていれば大丈夫、と、思っていたので深く調べてはいなかったのですが、基幹システムを運用する場合などは、必須ですね。

 1~2分ほどでしょうか、文章を書いているうちに30GBytesのバックアップ終了しました。さすがGCP、早いですねぇ!

PHPのバージョンアップ

 このページを参考に、バージョンアップを実行していきます。SSHで接続して、以下のコマンドを順番に実行していきます。

For Debian:

$ sudo apt install apt-transport-https lsb-release

$ sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg # Download the signing key

$ sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' # Add Ondrej's repo to sources list.

$ sudo apt update

$ sudo apt-get install php7.3

はい、無事にバージョンが変更されました。

$ php -v
PHP 7.3.16-1+0~20200320.56+debian9~1.gbp370a75 (cli) (built: Mar 20 2020 14:36:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.16, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.16-1+0~20200320.56+debian9~1.gbp370a75, Copyright (c) 1999-2018, by Zend Technologies

 しかし、WordPressのヘルスチェックでは、まだバージョンが更新されていませんね。再起動すれば、更新されるかな。GCPのコンソール画面からリセットを実行してみます。

  おお、リセットを押したら、警告メッセージが!

 なんと恐ろしいメッセージでしょう。「停止」の方がいいのかな。キャンセルして「停止」してみます。

 恐ろしさはあんまり変わりませんねぇ。ま、仕方ありませんね。停止して、開始しましょう。無事に停止できましたので、起動しました。起動時には以下のようなメッセージが表示されます。いったい料金はいくら請求されるのでしょうか。ビビります。

 さて、ヘルスチェックは、、、あらら、変わってませんね。いや、よく見ると違います。

 コマンドを調べてみると、どうやらphp-cgiのバージョンのようです。

prompt $ php-cgi -v
PHP 7.0.33-26+0~20200320.33+debian9~1.gbp746b8e (cgi-fcgi) (built: Mar 20 2020 14:33:44)
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-26+0~20200320.33+debian9~1.gbp746b8e, Copyright (c) 1999-2017, by Zend Technologies
prompt $ 

 と、いうことで今度はこのページを参考にしてアップデートを実行してみます。ちょっと長いですが、以下の通り実行しました。

sudo apt-get install php7.3 php7.3-cli php7.3-cgi php7.3-fpm php7.3-gd php7.3-mysql php7.3-imap php7.3-curl php7.3-intl php7.3-pspell php7.3-recode php7.3-sqlite3 php7.3-tidy php7.3-xmlrpc php7.3-xsl php7.3-zip php7.3-mbstring php7.3-soap php7.3-opcache php7.3-common php7.3-json php7.3-readline php7.3-xml

 すでにインストールされているものはスキップしてインストールできたようです。google-fluentdでエラーが起きたと言っていますが、まあ、よいでしょう。

prompt $ php-cgi -v
PHP 7.3.16-1+0~20200320.56+debian9~1.gbp370a75 (cgi-fcgi) (built: Mar 20 2020 14:36:13)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.16, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.16-1+0~20200320.56+debian9~1.gbp370a75, Copyright (c) 1999-2018, by Zend Technologies
prompt $ 

 バージョン上がりました!しかし、ヘルスチェックのバージョンは変わっておりません。再起動しましょうかねぇ。

 と、いうことで再起動しましたが、状況が変わりません。ログを見ていると、google-fluentdというサービスかプロセスがエラーを出力していましたので、その関係でしょうか。とりあえず、今日は力尽きました。やっぱりサーバーのセットアップとかは、苦手分野だなぁ。誰か知ってる人、教えてくださーい!

PL/SQL 効率の良いプログラミング

 今日も見に来てくださって、ありがとうございます。石川さんです。

 今日は、お仕事でオラクルのPL/SQLのストアドプロシージャを作っていて、参考にしたプログラムの書き方が気に入らなかったので、ちょっとそのことを記事にしてみました。どこが気に入らなかったって、大きくは、2点です。カーソルを使ったループの書き方と、%ROWTYPEを使ったINSERT文の書き方です。

カーソルFORループ

 PL/SQLでは、データベースからSELECT文でデータを取ってきて一件ずつ処理をする、ということがよくあります。SELECT文を使うときは、明示的にか暗黙的にかいずれにせよ、カーソルというものを使っています。カーソルは、問い合わせ結果の位置を示すポインタのようなものです。暗黙的なカーソルはPL/SQLでは一行のみ結果を戻すSELECT文や、UPDATE文、DELETE文などで使われています。複数行戻すSELECT文を利用するときには、必ず明示的にカーソルを定義する必要があります。そして、データを取得するために、カーソルをOPENして、FETCHして、FETCHが終わったら、CLOSEする必要があります。

-- カーソル定義
CURSOR c IS SELECT ...;

-- 処理部分
OPEN c;
LOOP
  -- FETCH
  FETCH c INTO 変数1, 変数2, ...;
  -- 終了条件
  EXIT WHEN c%NOTFOUND;
  -- 1件ごとの処理をここに記述します。
END LOOP;
CLOSE c;

 こんな感じです。自分でカーソルをOPENして、終わったらCLOSEする、というのがセオリーです。この場合、個別の終了条件を満たす場合や、例外などの異常が発生したときにもCLOSEを忘れないようにコーディングする必要があります。OPEN、CLOSEを忘れないようにするというわずらわしさから解放してくれる記法として、カーソルFORループという書き方があります。

-- カーソル定義
CURSOR c IS SELECT ...;

-- 処理部分
FOR i IN c LOOP
  -- 1件ごとの処理をここに記述します。
  -- 項目のデータは、「i.カラム名」という風に記載できます。
END LOOP;

 この記法、OPEN、FETCH、CLOSE、終了条件を記載する必要がありません。あ、あと、取得してきたデータを変数に代入する処理も、その変数の定義も記述する必要がありません。とってもエレガントですね。特に理由がない限り、カーソルFORループを使いましょう。ぼくは、1件だけデータを取得するSQLが何度も呼ばれるときにだけ、OPEN、FETCH、CLOSEを利用しています。通常のSELECT文は、データが1件しかなくても2件目を探しに行って、見つからないことがわかって初めてループを終了できるので、若干ですが、処理に時間がかかってしまいます。暗黙カーソルのSELECTの場合もTOO_MANY_ROWS例外を発生させないことを確認するために2件目がないことを確認しています。通常は処理時間はわずかですので、ほとんど気にする必要はありません。ただ、大量データを扱う場合など、パフォーマンスが気になるときには考慮してもよいかもしれませんね。

%ROWTYPEを利用したINSERT文

 オラクルにはテーブル定義を再利用するための記法として、%ROWTYPEという記法があります。宣言部分で以下のように記述します。これだけで、myRecordという変数の中にテーブル定義と同じ項目を宣言できます。

myRecord myTable%ROWTYPE; -- myTableテーブルの項目と同じ項目を持つ変数を定義

 このmyRecord変数を利用して、以下のようにINSERT文を記述することができます。

INSERT INTO myTable VALUES myRecord;

 この記述方法を知らないと、以下のように項目の数の2倍の記述が必要になってしまいます。

INSERT INTO myTable(
  COLUMN_NAME1,
  COLUMN_NAME2,
…
  COLUMN_NAMEn
)VALUES(
  myRecord.COLUMN_NAME1,
  myRecord.COLUMN_NAME2,
...
  myRecord.COLUMN_NAMEn
);

 ちなみに、このmyRecordの初期化は変数にNULLを代入するだけで完了です。すべての項目がNULLにセットされます。

myRecord := NULL;

 テーブルへデータをINSERTするときは、%ROWTYPEを使いましょう。%ROWTYPEを使うことで、項目の増減があっても既存部分はほぼ問題なく動作します。%ROWTYPEを使わなければ、すべての項目を再定義する必要があるため、コーディングの効率がずいぶんと悪くなります。

まとめ

 PL/SQLでデータを取得して繰り返し処理をするときは、カーソルFORループを使う、テーブルへデータをINSERTするときは、%ROWTYPEでテーブル定義を参照した変数を利用する。これだけで、ずいぶんとコーディングの時間が短縮できると思います。

Python GUI プログラミングを教えています「その3」

 今日も見に来てくださって、ありがとうございます。石川さんです。

 Python GUIプログラミング教室、先日はウィンドウを出して、サイズを変更して、背景色を変更するところまでやりました。次は、どうしようかなぁ、と、思っていましたが、やっぱりゲームなら、キャンバスが使えないとダメでしょう。と、いうことで、Canvasを作ってみましょう。

 とりあえず、ウィンドウを出すテンプレートとして、以下のスクリプトを覚えてもらいました。

import tkinter as tk

class Application(tk.Tk):
    def __init__(self):
        super().__init__()
# ここに色々な設定を書いていきます。
        
        self.mainloop()

if __name__ == "__main__":
    Application()

 サンプルとして、キャンバスを作ってみましょう。

        self.canvas = tk.Canvas()
        self.canvas.pack()

 追加しましたが、大きさが若干変化したくらいで、あんまり変わりませんね。次に線を引いてみましょう。

        self.canvas.create_line(10,10,200,200)
線が引けました

 キャンバスは、左上に原点の(0,0)があって、x軸が右、y軸が下に行くほど数値が増えていく構造です。なので上記の一行は、左上の(10,10)の座標から右下の(200,200)へ線を引く、という命令になります。ここまで教えて、さあ、自分でも好きな線を引いてみて、と、促したところ、下の二行を追加してくれました。

        self.canvas.create_line(100,100,200,200)
        self.canvas.create_line(65,65,150,150)

 当然ながら、実行しても線は増えませんね。追加した線は、もともと引いてあった線の上を引き直しているだけですからねぇ。

 次に、fill=”white”とか”red”で色が付けられることと、create_rectangleで四角形、create_ovalで楕円が書けることを教えてあげて、遊んでもらいました。最終的に何かができた、と、言っていたのですが、出来上がりは、こんな感じでした!

日の丸!

 そして、そこで終わらずに、さらに欲張って、キーボードを押されたイベントで押されたキーを出力するスクリプトを追加しました。

import tkinter as tk

class Application(tk.Tk):
    def __init__(self):
        super().__init__()

        self.canvas = tk.Canvas()
        self.canvas.pack()
        self.canvas.create_rectangle(10,50,200,160,fill="white")
        self.canvas.create_oval(80,80,130,130,fill="red")

        self.bind("<KeyPress>",self.print_key)
        
        self.mainloop()

    def print_key(self, event):
        print(event.keysym)
        
if __name__ == "__main__":
    Application()

12行目のbind"<KeyPress>"イベントに、16行目のself.print_keyメソッドを割り当てています。つまり、何かのキーが押されたよ、というイベントが発生したら、self.print_keyメソッドが実行されるようになります。print_keyの中で、event.keysymprintしています。押されたキーの内容によって、event.keysymの内容が変化します。適当にキーを押すと、出力結果は以下のようになりました。

space
a
b
c
Return
BackSpace
F1
F2
Down
Left
Up
Right
1
2
3
4
Shift_L
exclam

 この結果から、矢印キーが押されたときに何かさせようとすると、「Down」「Left」「Up」「Right」を判定すればうまくいきそうです。

 さあ、次は、、、と、思っていたら、もう疲れた~、と、またしても逃げられてしまいました。ねぇ、ホントはプログラミングしたくないんじゃないの?
 む~、それか、教え方がよくないのかなぁ。。。

Raspberry PI が故障してしまいました(涙)

 今日も見に来てくださって、ありがとうございます。昨日からコロナウィルの影響で勤務時間が1時間ほど短くなりました。

 タイトルにありますように、先日アップデートしたRaspberry PIが故障してしまいました。3日ほど電源を入れっぱなしにしていたのがいけないのでしょうか、電源ランプが光ってはいるのですが、画面が暗いままになってしまいました。

 これは、と、思い、電源コードを抜いて、挿し直しました。(Raspberry PIは電源ボタンがありませんので。)しばらくすると、虹色の画面がでましたが、その後は待てど暮らせど画面に変化がありません。そういえば、久しぶりに電源入れたときもこんな感じだったなぁ、ということを思い出しました。その時は何度か挿し直したら動き始めたのですが、今回は何度やってもいっこうによくなる気配がありません。

 チーン。ご臨終ですね。

 せっかく息子にプログラミングを教えていたのに、しばらく中止です。環境を作り直さないとなぁ。当時作っていたSDカードがあったので、何気にそちらを挿し込んで電源を入れたところ、無事に立ち上がりましたが、、、Bluetoothのマウスが動きません。先日の手順にのっとって、認識してから、sudo apt-get updateを実行。しかし、、、Wifiの設定がされていませんでした。インターネットにつながってなかったのね。設定確認したところ、故障する前に使っていたルータ用の設定でした。む~、となりながら、しばらくWifiの設定と格闘しましたが、うまく動きません。ちゃんと動くところまでやっとけよ、自分、と、思いましたが、その当時はちゃんと動いたのでしょうねぇ。と、いうことで、やっぱりえらいぞ、自分、と思い直しました。

 仕方ないので、SDカードを再度作り直すところからやろうか、そもそも今の環境でWifi設定できないならSDカードを再作成したところで無駄かもしれない、と、ぐるぐる回っているところです。前回は、いったいどうやって設定したのでしょうか。まったく記憶がありません。もうちょっとがんばります。

 と、いうことで気を取り直してWifiの設定、がんばりました。いろいろなサイトで/etc/wpa_supplicant/wpa_supplicant.confファイルに設定を記述せよ、と書いてあったので、がんばって記述していたのですが、それが間違いでした。最終的にやったことは、このファイルの中の以下の部分をコメントアウトして、再起動です。ちなみにコメントアウトは、「#」記号を先頭に記載しました。

network={
         ssid="..."
         psk="...."
         key_msmt=WPA-PSK
}

 すると、再起動後、Wifiの設定がされていないのでスキャンします、という感じで我が家の無線LANのssidを表示してきましたので、そいつを選んで、暗号化キーを入力すれば、無事に設定完了いたしました。ホッ。