2025年3月16日日曜日

何か知りませんが、しばらく投稿できなくなってました; 久しぶりですが、現況ですがRapberry Pi5買って遊んでます。本当はファンが必須なんですが、某国の怪しいサイトで、アルミダイキャストのケースで放熱するよ~、というケースをつい買ってしまいまいました。結構調子がよく、それで使い続けてます。やっぱり、ファンはきらいです。(M1のMac Book Airを思わず、最初にポチって気に入ってます。もうあんなファンなしのPC出してくれないよな~)

2020年4月19日日曜日

USB内に複数のパーティションができてしまった場合

USBにシステムのイメージファイルを書き込むと、よく複数のパーティションが作られます。困るのはUSBを元に戻そうとフォーマットしようとしても、最初(primary)のパーティションしかフォーマットできず、本来の容量に戻ってくれません。

そんな場合、以下の手順でパーティションを一つにします。

「ファイル名を指定して実行」(Win+Rでできます)からdiskpartを起動します。
  diskpart
(注:コマンドプロンプトで動きます)

②ディスクのリスト表示を行い、問題のUSBを探します。
  list disk
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           465 GB  2048 KB

* ディスク 1    オンライン            14 GB    14 GB
(この場合、ディスク0は本体のHDDであり、USBはディスク1になります)

③USBのディスクを選択します。
  select disk [ディスク番号]

④念のため選択したディスクの情報を確認しておきます。
  detail disk

⑤ディスクの構成情報を消します。
  clean

⑥プライマリパーティションを作成します
  create partition primary

これで後は通常通りフォーマットすれば、元に戻ります。
注意として、最近のUSBは4GB以上のものが多いですが、FAT32でフォーマットしないと元の容量に戻りません。(FATでは4GB迄です)

2019年8月20日火曜日

eclipseの日本語、等幅フォント

時々、Linux上で大きなプログラムをいじるとき、昔はemacsだけでやってましたが、最近はもう統合開発環境がないとダメな情けない体になってしまいました。
デフォルトで入っているのが、eclipseなのでよく使います。その時、困るのがフォントです。デフォルトは、monospaceという(英語の)等幅フォントなのですが、日本語のコメント入れると、もうずれまくりです。ぐぐると「こんなフォントを入れるといいよ」とか色々ありますが、ネットに繋がっていない環境でプログラムをいじることが多いので、デフォルトで入っている"Dejavu Sans Mono"を使っています。

2018年9月30日日曜日

WindowsのSocket(TCP)

WindowsのSocketはAPIに変遷の歴史があり、ちょっと苦手です。(最初に作った時は、まだWinSock(1)のころで、Linuxとかなり似たAPIでした。その後、WinSock2になり、M$は.NetやMFCを推奨してきて嫌になります)
QtのSocketクラスを使えば、その辺をラップしてくれて楽ができます。ちょっと試しにServerのconsoleプログラムを作ってみました。telnet等をclientにして簡単に実験ができます。

proファイルですが、networkの追加を忘れずに。

MyTcpServer.pro
  1. QT -= gui
  2. QT += core
  3. QT += network
  4.  
  5. CONFIG += c++11 console
  6. CONFIG -= app_bundle

mainは以下の通りです。

main.cpp
  1. #include <qcoreapplication>
  2. #include "mytcpserver.h"
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QCoreApplication a(argc, argv);
  7.  
  8. MyTcpServer server;
  9.  
  10. return a.exec();
  11. }

MyTcpServerクラスのヘッダは最低限の関数だけ定義します。

mytcpserver.h
  1. #ifndef MYTCPSERVER_H
  2. #define MYTCPSERVER_H
  3.  
  4. #include <qobject>
  5. #include <qtcpsocket>
  6. #include <qtcpserver>
  7. #include <qdebug&gt
  8.  
  9. class MyTcpServer : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MyTcpServer(QObject *parent = 0);
  14.  
  15. signals:
  16.  
  17. public slots:
  18. void newConnection();
  19. void readData();
  20. void socketError(QAbstractSocket::SocketError);
  21. void deleteLater();
  22.  
  23. private:
  24. QTcpServer *server;
  25. QTcpSocket *socket;
  26. };
  27.  
  28. #endif // MYTCPSERVER_H

本体です。connectして文字列を送ったら、後は受信するだけのものです。相手がcloseしたり、勝手に切ったり、エラーが起きたらServer側はcloseするようにしてあります。また、"bye"を受信したらやはりcloseします。(windowsだと、受信文字列の最後にCR/LFが含まれますが、Linux等では行末記号は含まれてきません。)

mytcpserver.cpp
  1. // mytcpserver.cpp
  2.  
  3. #include "mytcpserver.h"
  4. #include <qdatastream .h>
  5.  
  6. MyTcpServer::MyTcpServer(QObject *parent) :
  7. QObject(parent)
  8. {
  9. server = new QTcpServer(this);
  10.  
  11. // 誰かがconnectしてきたら、signalを出してnewConnection()をCall
  12. connect(server, SIGNAL(newConnection()),
  13. this, SLOT(newConnection()));
  14.  
  15. if(!server->listen(QHostAddress::Any, 9999))
  16. {
  17. qDebug() << "Server could not start";
  18. }
  19. else
  20. {
  21. qDebug() << "Server started!";
  22. }
  23. }
  24.  
  25. void MyTcpServer::newConnection()
  26. {
  27. // socketのインスタンスを生成
  28. socket = server->nextPendingConnection();
  29.  
  30. qDebug() << " connect";
  31.  
  32. // 切断した時の処理を定義
  33. connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
  34.  
  35. // 受信した時の処理を定義
  36. connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
  37. // エラー処理の定義
  38. connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));
  39. // 切断したときの処理としてSLOT関数を設定する。
  40. connect(socket, SIGNAL(disconnected()), this, SLOT(deleteLater()));
  41.  
  42. // クライアントのIPアドレスを取得
  43. QString ippaddr = socket->localAddress().toString();
  44.  
  45. // 送信データをstreamとして定義
  46. QDataStream out(socket);
  47. out.setVersion(QDataStream::Qt_5_0);
  48.  
  49. out << "Hello client\r\n";
  50. }
  51.  
  52. void MyTcpServer::readData()
  53. {
  54. QString s;
  55.  
  56. // 受信データを」streamとして定義
  57. //QDataStream in(socket);
  58. //in.setVersion(QDataStream::Qt_5_11);
  59.  
  60. //in >> s;
  61.  
  62. s = socket->readAll();
  63.  
  64. qDebug() << "receive : " << s << "( " << s.size() << " ) ";
  65.  
  66. if ("bye\r\n" == s)
  67. {
  68. qDebug() << "close process";
  69.  
  70. //deleteLater();
  71. emit socket->disconnected();
  72. }
  73.  
  74. }
  75.  
  76. void MyTcpServer::socketError(QAbstractSocket::SocketError )
  77. {
  78. qDebug() << " socket error!";
  79.  
  80. socket->close();
  81. }
  82.  
  83. void MyTcpServer::deleteLater()
  84. {
  85. qDebug() << " socket disconnected";
  86.  
  87. socket->close();
  88. }

さて、ここでこのサンプルを作った本題に入ります。前からLinuxでSocket(TCP)のプログラムで悩んでいたのが、通信しているプログラムの片方が、socketをつないだまま、異常終了すると、しばらくその時のportが使えなくなる現象に困っていました。一方、昔winsockを見ていた時、windowsのAPIには、portを強制的にconnectするというフラグがあり、どう違うのか疑問に思っていました。
このサンプルプログラムで、windowsとLinux(or Mac)での挙動の違いを調べてみました。

(1)通信中にServerを強制終了すると、Linux(Mac)ではやはり当該portは使えなくなります。(already useのエラーメッセージがでます)しかし、windowsは何事もなかったようにconnectできます。
(2)Linux(Mac)でも、client側が強制終了しても、サンプルのServerでは相手との通信が切れたことを検知して、portをcloseするようにしてあるので、再度clientは接続できます。(これまでLinuxでうまくいかなかったのは、この処理を入れてなかったことに気づきました)

Windowsは「楽観的」というか「危険」というか、考え方がかなり違います。

2018年9月9日日曜日

Raspberrry Pi3にOpenSUSE(64bit)をインストール

Raspbery Pi3のRaspbianでしばらく遊んでいましたが、折角CPUが64bitアーキテクチャになったというのに、Raspbianは32bitのままというのが寂しくなってきました。折角なので、64bitのOSを入れましょう。

1.適当なOSを探す
ぐぐってみるといくつかでてきました。ただ個人的にやられていそうな方は今後の継続性が怖いのと、一番例が多く見つかったOpenSUSEにすることにしました。(コンサバにいきます)
OpenSUSEのHPにいくと、頻繁に更新がされているらしく、DLしたいものをクリックしても、「リンクがありません」と言われたりします。しかしそこはしょせん単なるFTPサーバーみたいなものですから、「リンクがありません」と言われたURLから、目的としているファイル名だけ削除して、当該ディレクトリ内一覧を表示させ、より新しいバージョンが入っているのを見つけてDLしてきました。私がDLしてきたのは、Tumbleweed版のXFCE版です。(LXQt版というのもありましたが、どちらがいいかはまた時間があったら試してみます)
注意しないといけないのは、多数のパッケージが入っていますが、その中にRapberrry Pi以外のARMベースのものも混じっているらしいということです。ファイル名の中にきちんと"raspberry"の文字が入っているのをDLしてきましょう。(最初、これでなんでbootしないんだと、何回か失敗しました)

2.DLしたOSイメージをSDカードに焼く
この辺りは他の人が多数解説していますので、省きます。一つだけ注意があります。他の方はもう当たり前だと思って、書いていてくれませんでしたが、SDカードの初期化は専用アプリの"SD Card Formatter"を使いましょう。Windows標準でフォーマットさせると、32GBのSDがなんかちっこい2つのドライブにフォーマットされて、後からのOS image書き込みがうまくいきません。(Windowsは標準のFATでフォーマットしようとするんで、最近の32GB等の様な大容量には対応できていません)
2年くらい前にRaspberry Pi2を初めていじったときは、一生懸命調べてやってたんですが、すっかり忘れていました。

3.OpenSUSEの起動
後はもう特に注意点はありません。最初の起動に時間がかかるのはいつものことです。(設定諸々やっていいたり、SD内の使える領域を全域にしたりの作業をしていますから)

4.Wi-Fiの設定
さて、ここからが今回の本題です。Raspberry Pi3には折角内蔵のWi-Fiがついています。(Broadcom BCM43438のチップがついています)
OpenSUSEの記事を色々みていると、みなさんかなり苦労しているようです。とりあえず標準的な方法として、設定ツール"YaST"→"Network Setting"から試してみます。
画面の表示から、とりあえず最初の起動で、BCM43430 WLAN CArdの文字がでてきています。(チップの認識に問題があるのか、それとも製造ロットで違いがでた?)
これならYaSTで設定できるかと思い作業を進めていきましたが、どうもうまくいきません。YaSTで設定していて、最後のOK押すと画面に右下にメッセージで「無線ネットワークが認識されました」みたいなものが出てくるんで、成功したかと思うとだめ。ifconfigコマンドで確認してみると、wlan0は認識していますが、DHCPのアドレスが割り当てられていません。
そもそも、YaSTのwi-fiのSSIDと暗号key設定のところのIFが分かりにくいんですよね。keyのnegotiationで失敗している可能性が大きいです。
そこで今度は別のHPをぐぐると、以下のファイルにSSIDとkeyを登録しろとの情報が。

   /etc/wpa_supplicant/wpa_supplicant.conf

ここのファイルの最後に以下を追加しろとありました。(でもYaSTはここに何も書いていてくれないんですが…不安がよぎります)

network={
    ssid="調べたSSID"
    psk="WiFiのパスワード"
}

まあダメ元でと試してみましたが、やはりkeyのnegotiationに失敗とのログが残ります。少し考えて、上記の例との違いに気づきました。例ではssidやpskの前にインデントがしてあります。私は何も考えずにTabで行ってしまいましたが、もしかしてTabはまずかった?Tabを削除してマシンを再起動し、やっとWi-Fiがつながりました。

5.総論
OpenSUSEと言えば結構有名どころなんですが、まだ落ち着いているとはいいがたい状況ですね。特に今回のWi-Fiまわりは皆さん苦労しているようで、他のHPのデータを見るたびにbroadcomのライブラリ名称や個数が変わってきたりで苦労している後が見えます。(このあたりのドライバ回りまで64bitにするのが大変なので、本家がなかなか対応できないんでしょうが)

後、OpenSUSEとRaspbianを使った感想ですが、一言「OpenSUSE遅すぎ!」もうイライラしてくるレベルです。Raspbianの時は、最初のPi2の頃からは大幅に改善されていて「使い物になるじゃん」と感じたのとは大違いです。Graphic回りがまだまだ作りこみに問題があるのかわかりませんが、もう少し様子見した方がよさげです。

2018年8月23日木曜日

Windows10 VS2015でもPython

ちょっと古いネタですが、メモとして残しておきます。

VS2015から、Pythonが扱えるようになりました。ただ、インタープリタ本体はM$は提供してくれないので、自分で別途設定する必要があります。
問題は、VS2015を使うとき、「どのPython」を使うのか、どうやってVSに指定したらいいのかです。Pythonって、色々なものがあり、どれがベストとは言い切れない状態です。ただ、今から始めるなら2.*系に将来はないので、3.*系を使えとは皆さん言います。
だけど結構、2.7を使う開発環境がいまだに多いんですよね~ まあ、今回は開発環境はWinのVSなので、本家のpython.orgの3.6をインストールしました。実行状況を以下に示します。
matplotlibを後から追加でインストールして、簡単なデータ解析用の使い捨てプログラムが簡単に作れます。
ただ、問題はPCに入っている、どのPython環境を使うかの設定です。VSの場合、「ソリューション エクスプローラー」の「Python Environments」で指定できます。
御覧の様に、Python3(正確にはPython3.6)を設定してあります。VSインストール時に、Python環境がインストールしてあれば自動的に検出してくれるようですが、後からPython環境をインストールした場合は、自力で設定してやる必要があります。自動検出という手もありますが、大抵はうまくいかないので「Custom」で手動の作業になります。どのバイナリ(python.exe)を使うのか、作業フォルダはどこかとか設定してやる必要がありますが、そのあたりは自動検出に成功しているのを参考にしてやればうまくいきます。(不幸にも、PythonなしでVSインストールした方にはちょっと難題ですが・・・。そもそも、Pythonを初めてやろうと思うなら、潔く一旦VSをアンインストールして、Python環境をインストールしてからVSをインストールした方がいいと思います)
ネットでググると、このあたりの設定はVSCodeに関するものが圧倒的に多いですが、まあ似たようなものです。VSとVSCodeの実装はまるで違うものでしょうが、GUIとかは同じようになってしまいますから。(作っている環境が同じなら、そうなってしまうでしょう)
ちょっと注意が必要なのは、Customで設定しているとき、Pythonのバージョンを指定する選択リストがあったんですが、VS2015ではPython3.5までしかありませんでした。自動コードチェック等に影響があるのかもしれませんが、まあそんな変わらないだろうと仕方なく「python3.5」を選択して、Custom設定は終わらせました。



2018年8月14日火曜日

ANACONDA Navigatorのアイコンが消えた!?

これまでpythonのプログラムを書くときは、editorだけで済ませてきました。しかし、最近はVisualStuioもPython書ける様になっていますし、やはりIDEに慣れてしまうとそっちを使って楽をしたくなります。
PythonのIDEというと、Spyderが上がってくると思います。anacondaをインストールするとSpyderも入っており、これまではデバッガとしてしか使っていませんでした。IDEとしてのSpyderの使いごごちを見てみようと、久しぶりにANACONDA Navigatorを立ち上げて見たところ、Spyderの更新が出ているとの表示がありました。何も考えずに、Updateをしたところ、NavigatorのSpyder等、ICONが全て消えてしまいました!
通常は、上記の様に各種プログラムの起動ICONが出ていますが、これが消えて灰色に・・・

当初、どうしたらいいかわからず、$HOME/.anaconda/navigator/内の設定ファイルを見ても見当がつかず、途方にくれました。ぐぐってみても回答らしきものが見つからず悩んでいましたが、何度か検索しているうちに英語だけでらしき検索wordを入れると、stackoverflowにそれらしき質問が!見て見ると、完全に自分とは同じ状況ではありませんが、ICONが消えるのは同じで、回答は「Environmentsのupdate Indexボタンを押せ」とのこと。(以下の画面)
真ん中、上にあるボタンです。これで元に戻ってくれました。回答者はどうもNavigatorのメンテナンスをしている人らしく、1.8.3ではfixしてreleaseすると言ってました。

まあ無理にANACONDA Navigatorを使う必要はなく、コマンドラインから起動してもいいんですが、何かが調子悪いままというのは気持ち悪いので。