このブログを検索

2020/05/02

ラズベリーパイでwindowsのドライブをマウントする

ラズベリーパイで、windowsのドライブをマウントする。
sudo mkdir /mnt/DATA
sudo mount -t cifs //172.16.x.x/DATA/subdir /mnt/DATA -o user=fugafuga,password=hogehoge,iocharset=utf8
つねにマウントするには /etc/fstabに追記
//172.16.x.x/DATA/subdir /mnt/DATA cifs username=fugafuga,password=hogehoge,iocharset=utf8,rw,uid=1000,gid=1000,defaults 0 0
uidおよびgidは id コマンドで確認

2020/04/25

raspberry piでsshやraspi-config起動後ハングアップする

スイッチサイエンスで買い物をしたついでにラズパイ用のLCDディスプレイを買った。

はんだ付けが必要なキットである。

使ってみようと思い、古いラズパイに接続した。

WEBのチュートリアルにpythonのスクリプトサンプルが載っていて、
python3系しかサポートしていないとのことであった。

piでpythonって使ったことがなかったのだが確認すると2系と3系が両方入っていた。

pip3はなかったのでインストールし、サンプルスクリプトを作ろうとviを起動したら、
vi起動後、ハングアップしてしまう。

LCDディスプレイをつないだせいでぶっ壊れたのかと思い、別のpiで試すことにしたら、
それでも同じようにvi起動後にハングアップする。

どういうことだ?

軽くパニックになり、比較的新しいpi3を起動してviを起動したら正常に起動した。


最近わけあって家の無線LANのセグメントを変更した。

pi達には固定IPアドレスを振っているので、すべての固定アドレスを変更し、
ついでにapt update/upgradeをした。

そのせいだろうか?

viはすべてのpiでよく使っていたがこんな風になったことはなかった。


viだけでなく、raspi-configも起動しない。


いつもはsshで操作しているが、コンソールケーブルをつないでアクセスしてみた。

するとviもraspi-configも起動した。

メモリ不足とかか?


あきらめてディスプレイの確認はpi3でした。

翌日、ダメになった2台のpiはSDカードのインストールからやり直すと無事にsshしてviできるようになった。

raspi-configも動く。


なんらかのリソース不足じゃないかと思うのだが、ざっと見メモリとディスクは問題なさそうだった......




2020/03/11

ゲルマニウムラジオ改造

ゲルマニウムラジオを基板にはんだ付けし、ピンソケットを付け、小さいタッパにねじ止めした。

あと、コイルは今までポテトチップのケースに線を巻いた自作のものを使用していが、
かさばるのが嫌で、PA-63Rに置き換えてみたらうまくいったのでそれをケースの中にしまうことにした。

アンテナ、イヤホン(2)、アース、バリコン(2)、コイル(2)

計8本の線をソケットに挿す。

アンテナとアースは部屋に常設しておくことにした。
それぞれ10mくらい。



クリスタルイヤホンで聴こえることは聴こえるが、
ラジオとして実用に耐えうる音量ではない。

今は相撲中継が流れていたが耳をすませて集中していないと何を言っているのかわからない。

選局できるのも2つだけ。おそらくNHK。

もう一局、かすかに聴こえるがAFNか。

先日作ったaitendoのアンプキットにつなげば、実用的な音量にはなる。

あと、ややノイズがあるのだが、イヤホンと並行に0.01μFのコンデンサをつけると軽減する。

以前、「10KΩまたは33KΩの抵抗 + 0.1μFのコンデンサ」をつけると一番よく聴こえた、というエントリーを書いたが、それをやってみたが今回はうまくいかず、

いろいろ試したが0.01μFのコンデンサを付けたときが一番良かった。

ピンソケットに挿す線を忘れないようにメモしておく

ダイオードを上にして

左側が上から
 アンテナ
 バーアンテナ
 バーアンテナ
 バリコン

右側が上から
 イヤホン
 イヤホン
 アース
 バリコン







2020/02/16

djangoとapacheの連携

# httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   Dec 23 2019 20:45:34

/var/www 
で、djangoのプロジェクトを作る。

/var/www/kingyo
を作った。


mod_wsgiをインストール

dnf install python3-mod_wsgi


/usr/lib64/python3.6/site-packages/mod_wsgi/server
にある
mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
を
/etc/httpd/modules
にコピーする。

/etc/httpd/conf.d
に
django.conf
を作る。

# cat django.conf
LoadModule wsgi_module modules/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

WSGIScriptAlias / /var/www/kingyo/kingyo/wsgi.py
WSGIPythonPath /var/www/kingyo/

<Directory /var/www/kingyo/kingyo>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

/var/www/kingyo
に
wsgi.py
を作る。


# cat wsgi.py
#!/usr/bin/python
#coding:utf-8

import os
import sys

from django.core.wsgi import get_wsgi_application

sys.path.append("/var/www/kingyo")
sys.path.append("/var/www/kingyo/kingyo")

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kingyo.settings")


application = get_wsgi_application()


apache再起動

これでapacheのデフォルトサイトがdjangoで作ったサイトになる。

この時、2つほど問題が
1.管理ページにアクセスできない
2.1を解決した後、管理ページのcssが読み込まれない

1.の解決
djangoで作ったプロジェクトフォルダ、dq.sqlsite3、のownerをapacheに変える

2.の解決
settings.py
に以下を追記
STATIC_ROOT = os.path.join(BASE_DIR, "static")

下記を実行
python manage.py collectstatic

/etc/httpd/conf/httpd.conf
にaliasを追加

Alias /static/ /var/www/kingyo/static/

<Directory /var/www/kingyo/static>
    Require all granted
</Directory>

apacheをリスタート

なかなか認証にたどりつけない....
が、この管理サイトというものがすでにpython+djangoで認証しているのである。
これに一般ユーザを追加すればよいのだ。

そしてdjangoはさっきちらっとでてきたが、デフォルトでSQLiteを使っている。

つまり上記の設定により Apache + python + SQLite が動いているのだ。

そこでWSGIという仕組みが使われている。

dbは好きなものに変更でき、postgresqlも使える。









django

pythonのcgiでdbにアクセスできるようになった。
さあ、dbを使ってちょっとしたアプリケーションを作ってみたいが、
何をするにもサービスにログインする仕組みは必要だろう。
以前からログインの仕組みをやりたいと思っていた。
しらべるとdjangoを使った方法が紹介されていたので、
まずdjangoを使ってみる。

centos8, python3が前提


pip intall django

以下は適当な場所にフォルダを作り、そこで実行した。

プロジェクトの作成
# django-admin startprojects myproject

#cd myproject

アプリケーションの作成
#python manage.py startapp myapp

myapp/views.py を編集

from django.shortcuts import render

# Create your views here.

from django.http import HttpResponse

def index(request):
        return HttpResponse("Hello")


myproject/urls.py を編集、
import myapp.views を追加、
最後のところに作成したアプリケーションへのpathを追加

from django.contrib import admin
from django.urls import path
import myapp.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'', myapp.views.index, name='index')
]


myproject/myproject/settigs.py

にアクセスを許可するホスト名を追加する

ALLOWED_HOSTS = ['*']
で、なんでも許可

デフォルトは何も設定されていないので必ずエラーになる。

プロジェクトフォルダにある manage.pyを使って
migrate(設定の反映みたいなもの?)を実行

python manage.py migrate


アプリケーションを実行
xx.xx.xx.xxはサーバのグローバルIPアドレス
アドレスを指定しないと127.0.0.1になり、外部からアクセスできない。

python manage.py runserver xx.xx.xx.xx:8000


fierwall-cmdでtcp8000を開ける。

http://www.example.com:8000
にアクセス

Hello
と表示される。











postgresqlのcsvエクスポートとインポート

usersというテーブルに以下のようなレコードがあった。
                id                |               name
----------------------------------+----------------------------------
 paul                             | Paul McCartney
 pete                             | Pete Townshend
 john2                            | John Ryden
 bob                              | Bod Dylan
 john                             | John Lennon
bobの名前が間違っている。 Bob Dylanに直したい。 Excelあるいはテキスト感覚で直接テーブルを開いて書き換えたいところだが、 それはできない(よね?) csvでエクスポートインポートできるようなのでやってみた。
monqy=# COPY users TO '/var/lib/pgsql/users.csv' WITH CSV DELIMITER ',';
COPY 5
出力先は当然ながら書き込み権限が必要で、書き込み先に権限を与える(postgresの)か、書き込み権限のある場所にエクスポートする。 さっきのBob Dylanを直してインポートしようとしたら
monqy=# COPY users FROM '/var/lib/pgsql/users.csv' with csv;
ERROR:  duplicate key value violates unique constraint "users_pkey"
DETAIL:  Key (id)=(paul                            ) already exists.
CONTEXT:  COPY users, line 1
1件目の登録で already exists のエラーが。 上書きするオプションみたいなものは無いようで、一時的に作ったテーブルにインポートしてそこからupdateするとかいうことが必要らしい。 しょうがないので updateで更新。
monqy=# UPDATE users set name = 'Bob Dylan' where id = 'bob';
UPDATE 1
monqy=# select id,name from users;
                id                |               name
----------------------------------+----------------------------------
 paul                             | Paul McCartney
 pete                             | Pete Townshend
 john2                            | John Ryden
 john                             | John Lennon
 bob                              | Bob Dylan
(5 rows)
更新後のテーブルを表示すると更新したレコードが最後になっている。 削除・登録になっているのか?

psycopg2 検索cgi

DBといえば検索だよね。

私は何かを探す場合はほとんどシーケンシャル処理で正規表現でさがす。
あつかうデータがいろいろでフォーマットも不明な場合が多いからだ。
でもDBがあるなら、キーで検索すれば瞬時に見つかる。


検索フォーム
<!DOCTYPE html>
<html>
<head>
<title>dbq</title>
</head>
<body>
<form action="/cgi-bin/dbq.py" method="POST">
  <input type="text" name="text" value="id" />
  <input type="submit" name="submit" />
</form>
</body>
</html>
検索cgi

dbq.py


#!/usr/bin/python

import cgi
import psycopg2
import psycopg2.extras
import os

path = "localhost"
port = "5432"
dbname = "monqy"
user = "postgres"
password = "hogehoge"

pg_params = "host={} port={} dbname={} user={} password={}"
pg_params = pg_params.format(path,port,dbname,user,password)

connection = psycopg2.connect(pg_params)
cur = connection.cursor(cursor_factory=psycopg2.extras.DictCursor)

html_body = """
<!DOCTYPE html>
<html>
<head>
<title>your query</title>
<style>
h1 {
font-size: 3em;
}
</style>
</head>
<body>
<h1>%s</h1>
</body>
</html>
"""

form = cgi.FieldStorage()
qtext = form.getvalue('text','')

cur.execute('SELECT * FROM Users WHERE id = %s', (qtext,))

results = cur.fetchone()

if results is None:
        text = "not found"
else:
        text = results['name']

cur.close
connection.close

print(html_body % (text))

テーブル users から、idというフィールドが検索文字列と一致するレコードを探し、
一致しなければ「not found」、一致すればそのレコードの name フィールドを表示する。

単純な動作なのでフォームや実行結果を表示するまでもないでしょう。

このテーブルはid がkeyであり重複するレコードはないので fetchoneを使っている。

「レコードが見つからない場合」をどう書くのか、少し探した。
見つからない場合に results をそのまま表示すると「None」となることはわかったのだが、
results eq None
とか
results == "None"
ではダメで、
正しくは
results is None
であった。