丹波篠山市と福知山の境界あたりのキャンプ場に来た

草山という地区であり、家の事情で子供の頃に何回か来たことがあったのだけど、懐かしさもあるようなないような感じで温泉もぼちぼち気持ちよかった。キャンプ場はオープンしたばかりでとてもきれいだしサイトも広かった。

地元の人たちがこのキャンプ場を見て何を思ったのかな、なんていうことが、どうでもいいのに気になる。百姓やってる静かな人たちぐらいしかいないところに急にキャンプ場が開発されて、都会の裕福なファミリーがみんなして見たこともないようなかっちょいいテントやキャンプグッズをそれぞれ広げて、マンションみたいに周りとは交流もせず行儀よくなんか焼いて食べたりしてるわけである。地元自体には大して興味もなく、施設内の遊びを程よく遊んで帰っていくなー、くらいに見えていそう。お金は地元の人には落ちるんだろうか。働いてる人もみんなよそからクルマで来てる若者っぽかった。

ほんとどうでもいいけど、温泉旅館とかに泊まるのとは何か違う、違和感を感じる、近ごろのキャンプ場。

Python Djangoの認証機能(Auth User)でパスワードのルール外したい

Djangoデフォルトのユーザテーブルで認証機能を実装できて便利なのだが、練習とかテスト用に開発しているアプリで、パスワードのルールは8文字以上で数字だけは許さないとかそういうのはめんどくさい

ここコメントアウトして瞬殺でした。

[settings.py]
# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    # {
    #     'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    # },
    # {
    #     'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    # },
    # {
    #     'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    # },
    # {
    #     'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    # },
]

ゼロからLinux(Fedora)でpython djangoの実行・開発環境を作る(2 of 2)

手順のメモがほとんどできていなかった・・・。結局 1 of 1のあとには、VS Codeに適当にプラグインをインストールしたりソースコードをGithubに載せたりとかをごにょごにょやった。

CSSはありものをできるだけ使う

適当な練習アプリを作るにもHTMLとCSSがいるのだが、CSSを細々書くのなんてめんどくさい。超かんたんにある程度の見栄えになる適当なCSSのサンプルとかライブラリはなにかないものかとWebを漁ってみたけど意外とない。かっちょいい企業サイトのサンプルみたいなやたらとリッチなやつしか出て来なくて、2カラムのさっぱりした見た目で、なんとなくHeadingとかテーブルとかリストとかがきれいになるようなCSSはないのかなって探してみたけどいいのがない。CSSが調べながら書いたりとか、できないわけじゃないけどそれに極力時間を使いたくないのである。

結局Pure.cssというものだけはとりあえず入れてみることにした。

https://purecss.io/

テンプレートエンジンを活用する

アプリのフォルダの下にtemplatesというフォルダを掘る。そこにlayout.htmlとindex.htmlを置く

[layout.html]
{% load static %}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>TQuest1</title>
    <link
      rel="stylesheet"
      href="{% static 'tq1a/bootstrap.css' %}"
      type="text/css"
      media="screen"
    />
    <link
      rel="stylesheet"
      href="{% static 'tq1a/style.css' %}"
      type="text/css"
      media="screen"
    />
    <!--[if lte IE 8]>
      <link rel="stylesheet" href="menuie.css" type="text/css" media="screen" />
      <link
        rel="stylesheet"
        href="vmenuie.css"
        type="text/css"
        media="screen"
      />
    <![endif]-->
    <!--[if IE 7]>
      <style type="text/css" media="screen">
        #ttr_vmenu_items li.ttr_vmenu_items_parent {
          margin-left: -16px;
          font-size: 0px;
        }
      </style>
    <![endif]-->
    <!--[if lt IE 9]>
      <script type="text/javascript" src="html5shiv.js"></script>
      <script type="text/javascript" src="respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <div id="container">
      {% block content %}
      <p>親</p>
      {% endblock %}
    </div>
  </body>
</html>
[index.html]
{% extends 'tq1a/layout.html' %}

{% block content %}

<h1><a>てきとうなクエスト</a></h1>

<h2>こんにちは</h2>
<p>現在の時刻: X月X日 23:45</p>
<p>現在のお金: 1234G</p>
<p class="index_message">{{ message }}</p>

<h2>メニュー</h2>
<div class="pure-g">
  <div class="pure-u-1-3"><a href="{% url 'newt' %}">新しい手下</a></div>
  <div class="pure-u-1-3">狩りに行く</div>
  <div class="pure-u-1-3">バトルする</div>
</div>

<h2>お知らせ</h2>
<p>ありません</p>


<p>{{t.name}}</p>

<h2>手下たち</h2>
<div class="pure-g myuni">
{% for t in teshita %}
  <div class="pure-u-1 myuni-one">
    <p>{{t.name}} (Lv:{{t.level}})</p>
    <div class="pure-g">
      <div class="pure-u-1-3">max hp</div>
      <div class="pure-u-1-6">{{t.maxhp}}</div>
      <div class="pure-u-1-3">hp</div>
      <div class="pure-u-1-6">{{t.hp}}</div>
    </div>
    <div class="pure-g">
      <div class="pure-u-1-3">こうげき</div>
      <div class="pure-u-1-6">{{t.kougeki}}</div>
      <div class="pure-u-1-3">たいりょく</div>
      <div class="pure-u-1-6">{{t.tairyoku}}</div>
    </div>
  </div>
{% endfor %}
</div>
{% endblock %}

適当なゲームを作ろうとしていたので、こんなところくらいまできた。

手下を作って、敵を狩ったらレベルが上がるようなところを作ってみようかと思って、名前をつけたら名前によってランダムな強さが設定されるようにしてみた。

子供のフォートナイトを自動的に落とすpythonスクリプト(PC)

子供がPCでフォートナイトの時間を守らなかったり、やめなさいと言ってもなかなか聞かなかったりして、妻のイライラ、子供もイライラ、あまり良くない状態だったので、もう親子であれこれ言い合わなくていいように一定の条件を満たしたらフォートナイトが強制的にシャットダウンされるようにして見た。

方法は色々あると思うけど、pythonを選んだ。

Windows上でpythonのスクリプトをサービスとして実行し、Fortniteを起動した瞬間にプロセス監視で開始したことを検知したり、自分でゲームをやめたことも検知する。かつ、一定の条件を満たしているかどうかを1分に1回判定して、場合によってはFortniteを強制終了させる。自分でも試してみたけど、ほんとに一瞬でアプリがシャットダウンされてデスクトップに戻される。

作るスクリプトは以下。適当な名前.pyで保存

import sys
import time
import wmi
import win32serviceutil
import logging
import psutil
from plyer import notification

logging.basicConfig(
    filename = 'C:\\Users\\xxxxxxxxx\\xxxxxx\\gamemonitorscript.log',
    level = logging.DEBUG, 
    format="%(asctime)s:LINE[%(lineno)s] %(levelname)s %(message)s"
)

class GameMonitorService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'FNMoniter'
    _svc_display_name_ = 'Monitor Game'
    _svc_description_ = 'Saving over playing'

    def SvcDoRun(self):
        self.run = True
        
        loopcount = 0
        c=wmi.WMI()
        cre_process_watcher=c.Win32_Process.watch_for("creation")
        del_process_watcher=c.Win32_Process.watch_for("deletion")

       
        while self.run:
            new_cre_process=cre_process_watcher()
            new_del_process=del_process_watcher()
            
            if("FortniteClient" in new_cre_process.Caption):
                # ここで、お、ゲームやり始めたなというときの処理

            if("FortniteClient" in new_del_process.Caption):
                # ここで、ゲームをやめたとときの処理
                    
            time.sleep(1)
            loopcount += 1
            
            if loopcount == 60:
                
                # いい加減にしなさい、ゲーム強制終了ですよ、という判定をする
                if <<<何かしらのやりすぎ判定>>>:
                    logging.debug('強制終了')
                    for proc in psutil.process_iter():
                        n = proc.name()
                        if "FortniteClient" in n:
                            p = psutil.Process(proc.pid)
                            proc.kill()

                loopcount = 0
                
    def SvcStop(self):
        self.run = False

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(SampleService)

これを管理者ユーザでコマンドプロンプトからサービスとしてインストールして実行されていることを確認する。当然、pythonは事前にインストールして、pipでpywin32というパッケージもインストールしておく必要があるけど、その辺は以下の記事を見て参考にさせていただいた。

https://qiita.com/Bashi50/items/1d98f80ccaa8746bff38

正直、WMIとかなんとか、使い方があんまり良くわかってなくて、適当にやっててこれで動いたから、まあいいか、という感じ。

20220315

人間のやる気ってホントにムラがあるなあって話。元気よくバリバリ仕事で来ているときの自分の実感と、とにかく気分が乗らなくてだらだらしてしまうときの差が結構あって、在宅勤務ってなると後者の方が本当に苦労する。怖い人に見られてないとだめなことってやっぱりどうしてもありますわな。

春になると毎年これくらいの時期、なんだか頭が痛い。花粉症の薬のせいとか花粉のせいかなと思ってたけど今年は全然外の空気も吸ってなくて花粉浴びてないと思うから鼻も平気だし、薬も飲んでないしなんだろうな。

シャトレーゼが篠山にあったの6-7年前につぶれたらしいと今になって知る。大丈夫なのか、丹波篠山。ケーキとかシュークリームはいったいどこで買えるんだ。

ゼロからLinux(Fedora)でpython djangoの実行・開発環境を作る(1 of 2)

この記事の目的は以下。

  • hyper-vを利用し、まっさらなFedora 35の仮想環境を作成する
  • その上にデスクトップ環境を作り、python djangoの実行環境、Visual Studio CodeのLinux版をインストールして開発環境も作る
  • 家のどこのPCからでも接続して作業ができるようにする
  • djangoで作るアプリのコードはgithubで管理できるようにする

Fedoraをインストール

https://getfedora.org/ja/server/download/

netinstallのISOイメージを落としてくる。そのあとhyper-vでクイック作成で新規マシンを作成

メモリのサイズを4096MBに調整して起動。しばらく待つとインストール画面に来る。構成を選ぶことができるけど、おそらくGNOMEが入ってくるFedora Workstationを選んでLibre Officeだけは追加しておく。ほかのを選んでもあとでいまいちなー、ってなりそうですし。

「インストール開始」を押したら、他のことをしながらしばらく放置。やがてデスクトップ環境にログインできました。

ルートボリューム(ディスク)サイズの調整

デフォルトのインストーラがあまり賢くないのか、ちゃんとやらなかったから悪いのか、なぜかルートにマウントされているパーティションが125Gのうち15Gしか使ってない。とりあえず30GBくらいは割り当ててる状態にしたいところ。ネットで調べて、以下のコマンドで拡張できた。結果の記載は省略。

$ df -h
$ pvscan --cache
$ sudo vgdisplay
$ sudo lvdisplay
$ sudo lvextend -L +20G /dev/fedora/root
$ sudo xfs_growfs /dev/fedora/root
$ df -h

SELinux無効化

特に不要なので無効化。以下の設定ファイル変更後に再起動。

$ sudo vim /etc/selinux/

SElinux=disabled

リモートデスクトップ接続

TigerVNCとXRDPを使って、Windows PCからリモートデスクトップ接続を可能にする。

$ sudo dnf insatll xrdp tigervnc-server
$ sudo systemctl start xrdp.services
$ sudo systemctl enabled xrdp.services
$ sudo firewall-cmd --permanent --add-port=3389/tcp
$ sudo firewall-cmd --reload

Visual Studio Code のインストール

$ sudo vim /etc/yum.repos.d/vscode.repo

[vscode]
name=Visual Studio Code
baseurl=https://packages.microsoft.com/yumrepos/vscode
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc

$ sudo dnf update
$ sudo dnf install code

MySQLサーバーのインストール

dnf でインストールしたあとにデフォルトでできているデータベースを確認して、新規にユーザを作成して、新規にテストアプリ用のデータベースも作成して権限も付与する。DB名、ユーザ名、パスワードなどは適宜書き換えて使う。

$ sudo dnf install community-mysql-server community-mysql-libs community-mysql-devel

$ mysql --version
mysql  Ver 8.0.27 for Linux on x86_64 (Source distribution)

$ sudo systemctl start mysqld
$ sudo systemctl enable mysqld

$ sudo mysql

> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

> CREATE DATABASE testapp;
> CREATE USER '<user>'@'localhost' IDENTIFIED BY '<password>';
> GRANT ALL PRIVILEGES ON testapp.* TO '<user>'@'localhost';
> quit



Python djangoのインストール

pipでpython djangoをインストールする最短手順。最初にgccとpython3-develをインストールするのはpipでmysqlクライアントをインストールするときになぜか必要になるため。

$ sudo dnf install gcc python3-devel
$ cd ~
$ sudo dnf install python3-pip python3-mysqlclient
$ mkdir py
$ cd py

#venvする
$ python -m venv testappenv
$ source testappenv/bin/activate

#pipを最新バージョンにする
$ pip install -U pip

$ pip install mysqlclient

$ django-admin startproject testapp

$ cd testapp
$ vim ./testapp/settings.py
DATABASES = {
    'default': {
       'ENGINE': 'django.db.backends.mysql',
       'NAME': 'testapp',
       'USER': '<USER>',
       'PASSWORD': '<PASSWORD>',
       'HOST': 'localhost',
       'PORT': '3306',
    }
}

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py runserver 0.0.0.0:8001

ここまで来たら、一旦Djangoが動いていることを確認できる。

何やかや使うのがDjangoの標準のAdmin画面。これを使えるようにする。runserverはいったんCtrl+Cで閉じる。

$ python manage.py createsuperuser
Username (leave blank to use xxxxx: admin
Email address:  
Password: 
Password (again): 
Superuser created successfully.

もう一度 runserver したらここに来れる。

いったんここまで。

Linux(CentOS)上でJava Swing系プログラムが中身真っ白になる Weblogic インストーラが使えない

Hyper-Vで作ったCent OSサーバにJava 8u321とWeblogic 12.2.1.4をインストールしようとしたけど、インストーラがこんなことになってなにもできないという問題に遭遇した。

[xxx@localhost Downloads]$ java -jar ./fmw_12.2.1.4.0_wls_lite_generic.jar 

さんざんWebで調べたけどわからないし、StackOverflowに質問投稿したけど、閲覧数すら2桁ぐらいだし回答も大してつかないし困った。しかしこれ、CentOSにXRDPをyumでインストールしてWindowsのリモートデスクトップでアクセスするとどうしても発生するのに、hyper-vのコンソールからアクセスするとなぜか動くし、試しにVNCでデスクトップアクセスしても動く。以下はVNCでデスクトップつないでまったく同じことをやった画面。

切り分けのために、超簡単なJava Swingプログラムを動かしてみる。以下はテストした内容。

$ vim ./test.java

import javax.swing.*;    
class LabelExample      
    {  
    public static void main(String args[])  
        {  
        JFrame f= new JFrame("Label Example");  
        JLabel l1,l2;  
        l1=new JLabel("First Label.");  
        l1.setBounds(50,50, 100,30);  
        l2=new JLabel("Second Label.");  
        l2.setBounds(50,100, 100,30);  
        f.add(l1); f.add(l2);  
        f.setSize(300,300);  
        f.setLayout(null);  
        f.setVisible(true);  
    }      
}          

$ javac ./test.java
$ java -classpath ./ LabelExample

テスト結果:VNC接続の場合

テスト結果:Windowsのリモートデスクトップからの場合

同じだ。Swing自体のアプリがちゃんと動いてないんだ。というのはわかったけど、ログが出てくるわけでもなし次の調べ方もわからないので断念するかな。次に何を見ればいいのかな。そういえば、最初にCentOSに入ってたopenjdkはアンインストールしたうえでOracle Javaの1.8をインストールして使ってるので今の挙動になっているけど、openjdkだとこの挙動ってどうなるだろう。

$ sudo yum install java-1.8.0-openjdk
$ java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (build 25.322-b06, mixed mode)

まあ予想通り変わらない。深遠な世界っぽいのでここで諦める。

メインPCのCPU

Ryzen 3 2200Gをずっと使ってるけど、結構重い処理とかもするし仕事もバリバリ使うようになってきたので早くなってくれたら快適だな、とおもってRyzen 5 5600Gくらいを狙ってるけど新品でまだ3万円弱もするのか。無理だなあ。じゃあいくらになったら買うかっていうと2万円切っても買わない気もするけど。2200G当分、壊れるまで使い倒そう。でも壊れないよね、CPUなんて。