理工系な話

組んだりバラしたり
旧『“PLASSON”自作二足歩行ロボット Personal Low-tech ASSembly Of Nisokuhokou 』

先日ハタガネで雰囲気出しましたStereo誌スピーカーキットの組み立て完了しています。
100mmフルレンジのバックロードホーンです。
 
エージング・・・というと大げさですが、ポータブルブルーレイプレーヤーのヘッドホン出力を使って、これもStereo誌のミニアンプ(ラックスマン製)で鳴らし始めまています。

20200907DSC_0681.jpg

こちらは、三重野さん&東大フィル・グラデュエイト・オーケストラでのベートーヴェン交響曲第7番(DVD)。
2012年。今なら弾けるところが少し増えているかも。この曲は機会があればまた参加してみたいです。

 

音の第一印象
 
・オーケストラ
 広がり感には欠けますが、この大きさの割には低い方も出てるので、さみしくなく(?)聴けました。
 ただ、ライブでの拍手の音に「ぉぉぉぉぉぉぉぉ・・・」という特定の邪魔な響きがあります。

・弦楽四重奏
 パートごとの解像度があって、音域のバランスも悪くないです。
 悪い意味ではなく「お?」とチェロがはっきり出るように聴こえるところは、上記オケ拍手での独特の響きのあたりにチェロの音域がきているのかも。

・バンドもの
 山下達郎「SPARCLE」、難波弘之「シルバーグレイの街」、星野源「Pop Virus」「恋」
 100mm径とはいえ、バックロードホーンでベースがもやもやしないかな?と思ったのですが、そんなこともなく楽しく聴けました。
 星野源の曲は山下達郎や難波弘之の1980年代の楽曲に比べると音圧高目なのですが、さすがに最近のユニットだけあって問題なかったです。

・ルパン3世「カリオストロの城」ブルーレイ
 音楽が入っていればそう気にならないのですが、セリフだけのところで少し違和感ある響き。

・テレビ
 今は使ってないけどまだ処分してないテレビチューナーをポータブルブルーレイプレーヤーに入力しました。
 音楽には違和感なくても、人の声には特定の響きを感じるという傾向は変わりませんでした。

 
 
この固有の響きは、バックロードホーンらしいと言えばらしいのかもしれませんが。。。
 
オーケストラの拍手の部分を使って、ホーンの開口部に古タオルを切ったものなど突っ込んでみましたが、あまり変わらず。
それなら、と厚めのウレタン吸音材(ちょうどいい大きさのものがあった)を突っ込んでみると、見事に消えました。

20200908DSC_0683.jpg

しかし、これではこの開口部を塞ぐのと変わらないのでは(笑)

 

もうしばらく慣らし鳴らし(?)したら、また実験してみたいと思います。
記事中のメーカーの方のお話によると、このユニット(フォステクスP1000=P1000KをStereo誌用に再設計したとのこと)はフルレンジ一発なら大きめのバスレフか密閉に向いているらしいです。

20200907DSC_0678.jpg

ユニットそのものの音は聴いていて好ましい感じがするので、今の響きが気になるようなら、バスレフか密閉にチャレンジするのも良いかも。
 



形あるものを作る作業がしたくなり、5年間寝かせてたキットにとりかかりました。

20200905DSC_0673.jpg

ハタガネ使って雰囲気出してみました(笑)
・・・もっと以前の年のStereo誌キットもあるのですが(^^;、最大なやつを作ります。

 



昨日(8/22)、メインデスクトップPC(Windows10)のケース交換をしました。

1年ほど前にグラボを GeForce RTX 2060 にして、懐かしいHaloの復刻版(?)Master Chief Collection のストーリーが追加されるたびに遊んできました。

せっかくなので、MODを20個くらい入れたFallout4で楽しい拠点づくりをやってみようと始めたところ、グラボ温度が80°Cを超えてゲームが終了してしまうことがしばしば出てきました。

ケースがMicro-ATX用でグラボの排熱がうまくいってないようで、グラボ排気口のお手製外付けファン・・・

20200823_DSC_0663.jpg

こんなものをつけて、強制排気(そのぶんケースファンは前後とも吸入)でグラボの温度上昇を抑えていました。
ちなみに写真手前の四角い切り欠きはグラボに差し込んだディスプレイポートコネクタ避けです。
製法の特許出願中です(^^; /嘘です。袋のままレンジでチンする「ほうとう」の箱です。

 

まとめるとこんな感じ。

20200823_AirFlow00.png

 

やることは単純で、これまでのケース( セルサス CS-MC04BK )からパーツを外して、、、
20200823_DSC_0652.jpg
(ここで敷いているのは、二足歩行ロボット趣味時代のものです。今でもこういうときに重宝しています(^^)/)

 

外したパーツを、新しいケース( SHARKOON シャークーン SHA-VS4-WBK )に組み込むだけです。
20200823_DSC_0660.jpg
(写真でみるより、がら空きです^^;)

 

10時くらいから始めて、CPUグリスを塗り直したり、M.2 SSDに冷却フィンをつけたり、フィンの埃を飛ばしたりしつつ、途中お昼を挟んで、腰痛や膝痛とも戦いながら、のんびり15時過ぎの組上りとなりました。

 

余談ですが、新しいケースの側面は一部透明なアクリルになっていて、付属している光るファンを見ることができます。
20200823_DSC_0662.jpg
(左側のメッシュは机の側面です。)

 

もともと、Core i7-6700KにGeForce RTX 2060という、ゲーミングPCの入門機みたいなスペックですが、ケースまでそれっぽくなってきました(笑)。
次は、キーボードにマウスか(^^;

 



このサイトで使っているレンタルサーバーは、バリューサーバー(「まるっとプラン」)です。

以下、このサーバー上でPythonプログラムを動かすにはどうすればいいのか、のメモです。

 

■バリューサーバーの「料金・プラン」のページ
 https://www.value-server.com/spec/
 仕様詳細の中にある実行パスの表では、

ーーー

/usr/local/bin/python

ーーー

とされているのですが、

■Webエンジニアの仕事見聞録
 レンタルサーバー各社でのPythonの実行方法のまとめ
 https://engineer-milione.com/create/python-execution.html
 コアサーバー、バリューサーバーの場合

によれば、上記実行パスは python 2系で、python 3系は
/usr/local/bin/python3
ということらしいです。

せっかくなので、このサイトに感謝しつつ、書いてあることに従って進めてみました。

「.py」で動かすために.htaccessに

ーーー

AddHandler cgi-script .py

ーーー

と追加して(というか、python用のディレクトリを作って、この1行だけの.htaccessを置いて)、

[動作確認用プログラム]として

ーーー

#!/usr/local/bin/python3

print ('Content-Type: text/html\n\n')
print ("Hello world!")

ーーー

という「hello.py」というファイルを置いて、

パーミッションは「700」で大丈夫

とのことなのでそう設定しました。

これをWebブラウザでアクセスしてみると

Internal Server Error

ですとー(笑)

紆余曲折しましたが、結論から言うと、改行コードがLFじゃなかったのです・・・。基本だよ基本!

 

ちなみに、このパーミッションと改行コードの問題は、修正したりするたびに起きることで、

■Perlゼミ
 2019年はPerlはCGIの欠点を克服できるのか
 https://tutorial.perlzemi.com/blog/20190328085626.html

によれば、FTPではなく、うわさに聞く「Git」とやらを使えば楽なようなのですが。



「土日でわかるPythonプログラミング教室」
・金曜日:環境構築
・土曜日:Pythonプログラミング
・日曜日:Webプログラミング

*************************************************
■日曜日:Webプログラミング

<本の内容>
DockerのLinux環境からgit clone コマンドでWebアプリ版「人工知能?ななこ」のソースをもってくる。
 
・・・

前と同様、GitHubからソースを単純にダウンロードして、、、ターミナルから python manage.py runserver ・・・

なんか、たくさんエラーが出た(^^;
 
一度、まっさらなDjango
ーーーーーーーーーーーーーーーーーーーーーー
初めてのDjango開発
https://qiita.com/mas9612/items/d616a74f931babae4566
ーーーーーーーーーーーーーーーーーーーーーー
$ django-admin startproject mysite
$ python manage.py runserver

Starting development server at http://127.0.0.1:8000/

では、素直にサーバーが立ち上がりました。
環境がおかしいわけでないようです。

いろいろググってみると、例えば、以下の2つのような説明が。
ーーーーーーーーーーーーーーーーーーーーーー
Memo:[Django]バージョンによるurls.py内のincludeの仕様の違い
https://qiita.com/snuow/items/3350f2d2c713d55b8423
<エラー発生>
urlpatterns = [
  url(r'^testapp/', include('testapp.urls', namespace='testapp')),
]
<これでOK>
urlpatterns = [
  url(r'^testapp/', include(('testapp.urls', 'testapp'),)),
]
> 要するに、namespaceでapp_nameを指定するのではなく、2-タプルで渡してね。ってことみたい。
ーーーーーーーーーーーーーーーーーーーーーー
Djangoのincludeの仕様が変っていてハマったのでメモ
https://mocabrown.com/blog/archives/5346
<エラー発生>
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^cms/', include('cms.urls', namespace='cms')),
]
<これでOK>
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^cms/', include(('cms.urls','cms'),)),
]
> ポイントはnamespaceを使わないこと。それと、includeの一つ目の引数としてカッコでくくって渡すこと。
ーーーーーーーーーーーーーーーーーーーーーー

「2-タプルで渡してね。」とか「includeの一つ目の引数として」とか、まだよくわからんけど(^^;、僕の場合は

<現状エラー発生>
urlpatterns = [
  url(r'^admin/', admin.site.urls), #テキストでは使用しません。
  url(r'^api/', include('api.urls', namespace='api')),
  url(r'^', include('talk.urls', namespace='talk')),
]
なので、
<これでOKか?>
urlpatterns = [
  url(r'^admin/', admin.site.urls), #テキストでは使用しません。
  url(r'^api/', include(('api.urls', 'api'),)),
  url(r'^', include(('talk.urls', 'talk'),)),
]

・・・OKでした。Webサーバーが立ち上がりました。
会話をしようとテキスト入力すると、またエラーが・・・あ、そうか、前回のチャットボット同様、,encoding="utf-8_sig" を追記せねば。

結果、こんな感じです。

20200517_AInanako02.jpg

本では、どういう流れでこれが動いているかの解説が続きます。HTTP、JSON、MVCとMVT、Djangoのルーティング、Djangoでのリクエストとレスポンスの扱い方、JavaScript、jQuery、Ajax、、、Web開発のキーワード目白押し。
少ないスペースでポイントがギュッと詰まった感じで書いてあります。まぁ、大まかな把握レベルではあるのですが、目の前で動いているソースなので、説得力というか臨場感というか。

ちゃんと読めてませんが(^^;、Webまわりは、きっとそのうちやるでしょう。
「土日でわかるPythonプログラミング教室」はこれで終了です。

 

次は、スクレイピングの予定。数年前に日経ソフトウェアの付録でさわりをやりましたが、あらためて。どうなりますやら。



朝、PCを立ち上げようとしたら、なんか出た(笑)

20200511DSC_0571.jpg

何度か起動し直すと立ち上がったり、これが出たりで、起動SSDやブートレコードが壊れたとかではなさそう。

USBキーボードを引っ張り出してきて(日ごろ使っているBluetoothキーボードではできない)、BIOS画面を立ち上げてみると、、、

あー、起動用SSDが認識されてなくて、起動順に本来のSSDが入ってないや(笑)

起動用SSDはM.2 なので、ケーブルが抜けかかっているとかいうことはないだろうし、下手すればメインボードがいかれた可能性も。

いちおう、内蔵ボタン電池(2~3年使ったかな)を交換。差し替えに時間を取ってCMOSもクリア。

BIOS設定を確認して、しばらく様子を見ることにします。



「土日でわかるPythonプログラミング教室」
・金曜日:環境構築
・土曜日:Pythonプログラミング
・日曜日:Webプログラミング

*************************************************
■日曜日:Webプログラミング

・・・のはずだったのですが、PCの調子の悪さに、Windowsクリーンインストール実施(^^;;;

20200510kaifuku.jpg

以前は、上の「この PC を初期状態に戻す」を選んで、データファイルを残すかどうか選択して・・・という手順だけでしたが、いつの間にか、下のほうに「その他の回復オプション」としてWindowsのクリーンインストール(データは残る)というのができていました。

「この PC を初期状態に戻す」はクリーンインストールじゃなかったのかいな?

新しくできたほうのクリーンインストールを実施しました。

1~2年に1回くらいやってる気がしますが、アプリのインストールやらなんやら、けっこう手間がかかるんですよねぇ。

復旧作業しながら「ロード・エルメロイⅡ世の事件簿」全話(アニメ)、見ちゃったよ・・・。



「土日でわかるPythonプログラミング教室」
・金曜日:環境構築
・土曜日:Pythonプログラミング
・日曜日:Webプログラミング

*************************************************
■土曜日:Pythonプログラミング
 
<本の内容(1)>
FizzBuzzプログラムを作ってみる。
 1.1から100まで出力
 2.3の倍数の時には数字ではなくFizzと表示
 3.5の倍数の時には数字ではなくBuzzと表示
 4.3と5の倍数の時には数字ではなくFizzBuzzと表示
 
・・・
 
とりあえず、この本は見ずに、日経ソフトウェア2020年5月号の付録「Pythonチートシート」を見ながら、書いてみました。

ーーーーーーーーーーーーー
for i in range(100):
  j=i+1
  if j%15 == 0:
   print("FizzBuzz")
  elif j%3 == 0:
   print("Fizz")
  elif j%5 == 0:
   print("Buzz")
  else:
   print(j)
ーーーーーーーーーーーーー

ちょっと中身を読んで改造
ーーーーーーーーーーーーー
for i in range(1,101):
  if i%3 == 0 and i%5 == 0:
   print("FizzBuzz")
  elif i%3 == 0:
   print("Fizz")
  elif i%5 == 0:
   print("Buzz")
  else:
   print(i)
ーーーーーーーーーーーーー

rangeは少し戸惑いました。
  for i in range(a,b):
って書いた時は、ついBASICの
  for i = a to b
だと思ってしまいます。。。実際には、
  for i = a to b-1
です。
正しくは
  for i in range(a,b):

  a ≦ i < b
です。
ということは、
  for i in range(b):
って書いたときも、iは0からb-1までb回まわる、と思ってしまっては間違いで、あくまでも
  0 ≦ i < b
なのだな。
 
本では、ここからしばらくPythonの基本文法(変数、演算子、if文、for文等)分の説明が続きます。
昨日の「金曜日:環境構築」は少々敷居が高い感じがしましたが、このあたりの説明はとても丁寧です。

 
<本の内容(2)>
DockerのLinux環境からgit clone コマンドでチャットボットプログラムのソースをもってくる。
 
・・・
 
うーむ。Windows10+Anaconda+Pycharmだとどうすればいいのかな・・・カミさんに聞いて、GitHubからソースを単純にダウンロードすることにしました。
GitやGitHubについては、また別の機会に確認することにします。

コピーしたソースを走らせるとエラーが発生・・・えぇと、一連のエラーの発端は、
UnicodeDecodeError: 'cp932' codec can't decode byte 0x87 in position 61: illegal multibyte sequence
ってやつだな。
DockerのLinux環境で動くソースだからutf-8が前提と思われるところ、WindowsのShift-JISではエラーになるってことかな。
そこでググって
ーーーーーーーーーーーーーーーーーーーーーー
WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話
https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e
ーーーーーーーーーーーーーーーーーーーーーー
を参考に、ファイルをオープンしているところに
「,encoding="utf-8_sig"」
を追加。
動いた!(^o^)/ しかし、文章を覚えさせるほうでも同じ原因のエラーが(^^;。そこも修正。
 

20200508_AInanako01.jpg

 
本では、チャットボットのソースを解析しながらの説明(import、fromと__init__.py、ユーザー定義関数、while/continue/break文、オブジェクト指向、ファイル入出力、形態素解析、乱数、辞書型/タプル型、文字列操作、マルコフ連鎖等)が続きます。
 
 
この本のAmazonの書評はかんばしくありません。ソースをダウンロードして眺めるだけの本、という評もあります。
確かに、本を読んで書けるようになるための説明というよりは、チャットボットの仕組みをどんな風に実現しているか、という内容だと思います。でも、初心者向けのごまかし説明ではなく、けっこう真正面から説明していて、会話タイプの人工知能への最初のアプローチとしては、なかなかの本ではないかと思います。
少なくとも僕は、今はわからないところもあるけれど、後日、戻ってきて読み返したい、という気持ちになりました。
 
さて、明日は Django です。



以前に購入した「土日でわかるPythonプログラミング教室」を引っ張り出してきました。

形態素解析を使ったチャットボットプログラムが取り上げられている本です。一から組み立てるのではなく、Pythonのコードをダウンロードして動かしてみる、という内容です。

Pythonを学ぶというよりは、こんなこともできるのねー、ということを感じる本・・・かな。

土日で、とありますが、
・金曜日:環境構築
・土曜日:Pythonプログラミング
・日曜日:Webプログラミング
となっています。

 
 
*************************************************
■金曜日:環境構築
 
<本の内容>
「Docker Toolbox」と「Atom」をインストール。Atomを日本語化する。「Docker Toolbox」の「Kitematic」でコンテナを作る。
コンテナ内に同梱されている主要なもの:
 ・Python
 ・MeCab(形態素解析エンジン)
 ・Django(Webアプリケーションフレームワーク)
コンテナ内でターミナル使ったディレクトリの確認とDjangoの起動を行う。
 
・・・
 
説明は丁寧ですし、トラブらなければ難しくはないと思います。しかし、"土日でわかる"の前に金曜日でつまづく人が多数出そうではあります(笑)。

僕は、この先、Dockerが必要となりそうな予定はないし、今のWindows10+Anaconda+Pycharmに慣れたいところです。なので、Anaconda navigatorでDjango入れた仮想環境を作って、Pycharmでsの仮想環境を指定する方法でやってみようと思いました。
違いは、DockerがPC内に別の仮想PCを用意する(この場合、WindowsPC内にLinuxのPCを作る)ものであるのに対して、Anaconda navigatorは同じPC内でプログラミングを行う仮想環境(Pythonのバージョンが違うものを使うとか、必要なライブラリが異なるとか)を用意するもの、ということになります。

たぶん(笑)

こうした違いを乗り越えること自体が、とても良い経験になります。
 
さっそく、Anaconda navigatorで仮想環境を・・・あれ?今までの仮想環境とは別のディレクトリにできてしまいました。
これまでは、たまたま、Pycharmからconda指定して仮想環境を構築してばかりだったので気づかなかった(^^;
仮想環境をAnaconda navigatorで作る場合でも、Pycharmで作る場合と同じディレクトリはにしておくことにしました。
ここでググって
ーーーーーーーーーーーーーーーーーーーーーー
開発メモ その127 Anaconda navigatorの仮想環境のディレクトリを変更する
https://taktak.jp/2018/07/21/3094
ーーーーーーーーーーーーーーーーーーーーーー
を参考に
1).condarc を開く。
2)下記の記述を追記する。
envs_dirs:
- /Users/nolan/newpath(←ここはディレクトリを書く)

これで、Anaconda navigatorでもPycharmででも同じディレクトリに仮想環境ができるようになりました。
 
次は、MeCabです。
これもググって
ーーーーーーーーーーーーーーーーーーーーーー
Windows環境のPython3でMeCabを使ってみよう
https://www.gis-py.com/entry/mecab
ーーーーーーーーーーーーーーーーーーーーーー
を参考に
1)Windows環境にMeCabをインストール
2) 先ほどのAnaconda navigatorで作った環境でPycharmでプレジェクトを作る
3) PycharmのTerminalで
pip install ipykernel

pip install mecab-python-windows
を実行する。
4) (MeCabのインストール先)/bin
にある"libmecab.dll"というファイルを
(Pyhthonのインストール先)/Lib/site-packages
にコピーする。
5)サンプルプログラムで動作確認

これで、僕のPCでMeCabが使えるようになりました。
上記の参考サイトのほか、
PythonでMeCabを利用する方法を現役エンジニアが解説【初心者向け】
https://techacademy.jp/magazine/22052

MeCabで遊んでみる。すぐ使えるコードあり。
https://note.com/yuhyuh/n/ne6819dcfad0e
などが参考になると思います。
 
これで「金曜日:環境構築」は終了しました。

 



日経ソフトウェアの付録「5日でできる!Pythonでゲーム作成入門」の最後の章、「シューティングゲーム」が完成しました。これまた、ちょっとだけ、改造しています(^^;

Pygame Zero というゲーム用ライブラリの入門ではありましたが、ちょっとしたアクションゲームなら、こんなに気軽に作れるんだなぁという驚きがありました。
Pythonそのものの学習にはならなかったかもですが、なかなか楽しかったです。

 

さて、次は、何を使ってみようかな。



アイテム

  • 20200907DSC_0678.jpg
  • 20200908DSC_0683.jpg
  • 20200907DSC_0681.jpg
  • 20200905DSC_0673.jpg
  • 20200823_DSC_0663.jpg
  • 20200823_DSC_0663.jpg
  • 20200823_AirFlow00.png
  • 20200823_DSC_0662.jpg
  • 20200823_DSC_0660.jpg
  • 20200823_DSC_0652.jpg