ギャバンITサービス
お菓子の家が作れるシステムエンジニアです

ubuntu22を利用開始

2022年のゴールデンウィーク頃にubuntu22が出たって記事を見た。 amazon primeから録画してきた動画が、ubuntu20だとどうしても再生できないのがあって、 windows + vlcやったらちゃんと再生できることがわかった。 業務用(pc1)と予備PC(pc2)は、後で作った予備PCが特にディスク性能の差がある。 予備PCはあくまで予備やからそれほど性能高くなくていいし、週に数回動画見るだけやし。 本マシンと予備マシンをひっくり返して、仮想マシン(vm)の切り替え(ubuntu20⇒ubuntu22)もやってみた。 ハードウェア構成の変更 pc1は8世代のi5。 pc2は10世代のi5。 メモリはどっちも32GBで、usb3接続の外付けhddが2個ある。ssdに比べたら低速やけど、大きなディスク使いたいからしゃぁない。 usbディスクはvmdkファイルを置いて仮想マシンに使わせていて、1つはdockerの領域を置いてる。 変更前) mini pc1 (bios hdd windows10pro + ssd vm(ubuntu20,win11pro)) └─USBhdd1 6TB (dataArea vmdk) └─USBhdd2 1TB (docker vmdk) mini pc2 (uefi ssd ubuntu20 + ssd vm(空)) 変更後) mini pc1 (bios hdd (空) + ssd windows10pro ) mini pc2 (uefi ssd windows11pro,vm( ubuntu22 ,win11pro) + ssd ( docker vmdk ) ) └─USBhdd1 6TB (dataArea vmdk) 例えば練習でoracleとかコンテナとして動かすときに、dockerの領域をssdにしたから、めっちゃ速くなるのを期待。 OSのインストール pc2は予備PCやからいきなり潰してもOK。 windows11を入れてから、pc1のデータを流し込む。 ...

 ⭐️

djangoをdockerコンテナで利用(16) - djangoで科目単位の集計

集計処理やっと作るところまで来た。 最初の頃に グラフ作れるかなって やってのたと、 集計 を組み合わせる。 結論 テストデータはこんな感じ。 月単位で経費を計上したレコードがある。 見た目ほぼそのままdockerコンテナであるmariadbのテーブル上でレコードとして存在する。 これを、縦軸に科目、横軸に月として、その1年の金額と比率を集計させる。 今月売上なんぼ、機材なんぼ、新聞図書費なんぼとかわかる。 帳簿の一部としてwebページをpdfにして保管するから、グラフはそのとき省く様ためグラフ表示のスイッチをつけとく。 さらに集計結果を円グラフ表示させる。 今月は旅費かかったなーとか、交際費もう少し使っても大丈夫かなーとか目安がわかる。 現行php版での処理をdjangoで全部作り直したとき、過去7年分の経費レコードに対する金額合計が1円の差異もなく集計・表示されたときは嬉しかった。 あと少しでphpのdockerコンテナとおさらばできる。 科目単位の集計 今までのdjango作りこみは実在するテーブルに対応したモデルだけを扱ってきた。 今回は複数テーブルから読み込んだ結果を集計するモデルを作っていく。 「見せ方」を先に考えるから、そのためのモデルをまずは準備して次にテンプレートを準備してく。 modelsの準備 結局は科目の一覧なので、ベースは科目のマスタ(GVIS_mst_kamoku)。 そこに、月単位の合計を肉付けしてモデルを作る。 1月から12月までの列を用意して、経費テーブル(GvisKeihi)の中にある科目で集計するメソッドを定義する。 以下、帳簿の一部であるGvisChobo.pyのモデル定義。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 from django.db import models from django.utils import timezone from pymysql import NULL from datetime import datetime ## 日付取得のため from datetime import date, timedelta ## マスターテーブル使うため from gvisWebApp.models.GvisMaster import GvisMstKeihishubetsu,GvisMstKamoku from gvisWebApp.models.GvisKeihi import GvisKeihi ## マスターテーブル絞り込みのため from django.db.models import Q,Sum class GvisChobo(models.Model): kamokuno = models.IntegerField(verbose_name='科目No',db_column='kamokuNo') # Field name made lowercase. def __str__(self): return str(self.kamokuno) kamokuname = models.CharField(verbose_name='科目名',db_column='kamokuName',max_length=20) # Field name made lowercase. def __str__(self): return self.kamokuname kamokusetsumei = models.CharField(verbose_name='科目説明',db_column='kamokuSetsumei', max_length=200) # Field name made lowercase. def __str__(self): return self.kamokusetsumei hyojiorder = models.IntegerField(db_column='hyojiOrder') # Field name made lowercase. def __str__(self): return str(self.hyojiorder) keihitaisho = models.IntegerField(db_column='keihiTaisho') # Field name made lowercase. def __str__(self): return str(self.keihitaisho) def get_kng01(self,year): object_list = GvisKeihi.objects.filter(workperiod__range = [date(year,1,1),date(year,2,1) - timedelta(days=1)]) findkey = '%03d' % self.kamokuno + '-' + self.kamokuname p = object_list.filter(Q(kamoku=findkey)).aggregate(sum=Sum('kng'))['sum'] kng = 0 if p is None else p return kng def get_kng02(self,year): object_list = GvisKeihi.objects.filter(workperiod__range = [date(year,2,1),date(year,3,1) - timedelta(days=1)]) findkey = '%03d' % self.kamokuno + '-' + self.kamokuname p = object_list.filter(Q(kamoku=findkey)).aggregate(sum=Sum('kng'))['sum'] kng = 0 if p is None else p return kng : (中略) : def get_kng12(self,year): object_list = GvisKeihi.objects.filter(workperiod__range = [date(year,12,1),date(year,12,31)]) findkey = '%03d' % self.kamokuno + '-' + self.kamokuname p = object_list.filter(Q(kamoku=findkey)).aggregate(sum=Sum('kng'))['sum'] kng = 0 if p is None else p return kng def get_KamokuTotal(self,year): object_list = GvisKeihi.objects.filter(workperiod__range = [date(year,1,1),date(year,12,31)]) findkey = '%03d' % self.kamokuno + '-' + self.kamokuname p = object_list.filter(Q(kamoku=findkey)).aggregate(sum=Sum('kng'))['sum'] kng = 0 if p is None else p return kng class Meta: managed = False db_table = 'GVIS_mst_kamoku' 例えばget_kng12はフォームで受け取った年で、12月の科目を集計してる。経費テーブルには「003-研究開発費」みたいな感じで、科目の頭に3桁の数字とハイフンが入っているから、それをキーにしてfilterしてる。 ...

 ⭐️

djangoをdockerコンテナで利用(15) - djangoでsql直接発行

djangoでレコードの集計してたら、どうしてもできない集計があることに気づいた。 仕方がないので、直接sql発行して集計させることにした。 sqlを文字列として準備し発行すると、仮にexceptionが発生したときにもそれをエラーログとして出力させるようにした。 ログ出力 はmariadbに出力するようにしてる。 今回はレコード集計結果を作ったのでそのメモ。 結論 djangoで経費のレコードを処理する画面を作ってる途中。 これから「編集」と「操作」の列にボタン足して編集・コピー・削除の機能をつけてこうとしてる。 他の画面で既に「編集」と「操作」は作ってあるから、djangoのviewsにはコピーして作れば余裕。 経費テーブルには、かかった費用の目安を記録しときたいから、自作の科目も含んでて、実際の「水道代」とか「外食費」もつけて台帳管理してる。 自宅で業務をしてると「水道光熱費」ってのは、実生活でかかる水道代や電気代を業務と生活で按分しなきゃいけないから、全部を計上しちゃいけない。 確定申告で使う経費科目は決まっているから、自作の経費科目は経費計上しないようにしたい。 けれど、djangoではその科目に応じた集計をさせられない場面があった。 予想してたけど、やっぱりできん集計あるんやなぁ。 (自分がまだ見つけられてないだけかもしれん) さっさと進めて作りたかったから、直接SQLの文字列を発行して集計結果を表示させるようにした。 djangoの基本機能で集計できなかったのは、経費合計。 理由は経費テーブルから外部参照する科目テーブルに、経費対象の列があって、外部参照する列をdjangoのfilterで指定できなかったから。 指定するとエラーになって、実テーブルに存在する項目しか指定を許可してくれなかったから。 その他の、医療費控除とか売上合計なんかの科目狙い打ち集計はできてた。 自分のテーブル設計がマズいのかもしれんけど、既存のphp版からの移行作成やから、保管構造は変えない方針。 (idの列は足したけど・・・) 処理優先で考えるんじゃなく、データベース優先で考えるから、djangoの機能を使えるところだけ使って、実際の集計はsql書くことにした。 既存のphp版にある過去7年分、84か月分の経費合計がきっちりあってた。1円も狂ってなくて気持ちよかったなぁ。 djangoは「SQL書かなくても動く」ってのがいいところ、みたいな書き方を見かけるけど、DBMSの集計機能を使ってSQLで書いたほうがいいこともあると思う。 実際の開発でSQL書けない人がたまにいるけど、RDBを扱うときにSQL書けなかったら、本番開始後のDB関連障害や高速化に対応できないんじゃないかとも思う。 例えばoracleからpostgresqlに移行するときのことを考えて、sqlは一切書かずに全部djangoに任せるっていうのはいいことかもしれんけど、そういう見込みがないんやったらベタのSQL書いて楽したほうがええんとちゃうか? サンプルデータ 例えばこんなデータがあったとする。 月間の売上とか経費が入ってる。 経費テーブル workPeriodは、経費計上の年月だけ使ってるから、全部1日の0:00:00って入ってる。 Kamokuは、科目テーブルにある科目番号と科目名が埋め込んである。 id workPeriod workShubetsu workPriority Keihi_date Kamoku Tehai Kng Biko 9058 2022/03/01/火 0:00:00 1yan 1001 2022/03/10/木 0:00:00 008-給料賃金 給与 60000 20140924申請の青色事業者専従者給与に関する届出書により10万円を目標に計上。 9059 2022/03/01/火 0:00:00 1yan 1002 2022/03/10/木 0:00:00 020-水道光熱費 光熱費 10000 50%を事業用の電気代とする。月平均2万円x50%=1万円。 9068 2022/03/01/火 0:00:00 1yan 1003 2022/03/10/木 0:00:00 025-通信費 インターネット/電話利用料 10000 電話とインターネットは50%を事業用の電気代とする。月平均2万円x50%=1万円。 9060 2022/03/01/火 0:00:00 2kgc 1010 2022/03/31/木 0:00:00 101-現金売上 amazon販売 0 物販(3/xx) 9077 2022/03/01/火 0:00:00 2kgc 1020 2022/03/10/木 0:00:00 102-預金売上 お客様 100000 xxx案件 9074 2022/03/01/火 0:00:00 2kgc 1047 2022/03/31/木 0:00:00 023-損害保険料 xx保険 6550 エージェント会社提供の掛け捨て保険 9087 2022/03/01/火 0:00:00 2kgc 1068 2022/03/05/土 0:00:00 003-研究開発費 定食屋 1630 IT市場調査。昼食。 9070 2022/03/01/火 0:00:00 2kgc 1072 2022/03/06/日 0:00:00 001-打合会議費 喫茶xx 2480 月初打合せ 9101 2022/03/01/火 0:00:00 2kgc 2019 2022/03/20/日 0:00:00 003-研究開発費 apple 4787 mp4解析用 9055 2022/03/01/火 0:00:00 3ikk 1042 2022/03/31/木 0:00:00 038-外食費 外食費累積 1467 目安 9056 2022/03/01/火 0:00:00 3ikk 1043 2022/03/31/木 0:00:00 039-食費 食費累積 74120 目安 9051 2022/03/01/火 0:00:00 3ikk 1045 2022/03/31/木 0:00:00 099-預金残高 銀行残高 0 残高確定 9085 2022/03/01/火 0:00:00 3ikk 1046 2022/03/31/木 0:00:00 040-水道代 大阪市水道局 3842 1月分水道代。1月13日検針。22立米。(クレカ引き落とし) 9054 2022/03/01/火 0:00:00 3ikk 1053 2022/03/31/木 0:00:00 041-電気代 関西電力 19738 3月分電気代。919kwh。 経費種別テーブル workShubetsuは経費の種別で、djangoのtemplatesで表示させるときの色指定が一緒に入ってる。 ...

 ⭐️

djangoをdockerコンテナで利用(14) - djangoでblobカラムを含むレコードのコピー

djangoでblob列を含むレコードを作成・更新・参照・削除することができるようになった。 自分特有の blob操作 もできるようになった。 ただ、これだけでは自分にとって使える処理とは言えない。 普段は一度入力した内容をコピーして再作成することのほうが多い。 1から入力するんじゃなく、既存レコードをコピーして更新しながら作る。 そのほうが楽やし。 今回はレコードをコピーする処理を作ったのでそのメモ。 結論 実際の作りはこうなった。 月間作業予定の一覧を年月単位で存在させてて、優先順位を番号として付けてある。 listviewを使って一覧表示させたレコードに「行コピー」ってボタンを作って、そのレコードをコピーし、ボタンを押すとそれ以降のレコードの優先順位を+1する。 例えばこういうレコードがあって3列目にあるコピーボタンを押すと、 こうなる。 4列目に優先順位「27」ってあるレコードがコピーされて「28」ができてる。 ここで「27」からさらにコピーすると、「27」と「28」は「28」と「29」になって、元の27を新規レコードとして保管する。 右端の3列にガッキーのjpeg、五線譜のpdfの1ページ目をjpeg変換したもの、ガッキーの別のjpegがちゃんと入ってコピーされている。 しっかしガッキーかわいい。 格納したファイルと性能 jpegは100KB程度やけど、pdfはムーンライトソナタの譜面で16ページ、7.5MB程度ある。 それをbase64でエンコードして保管するから、容量は1.5倍程度として1レコードはたぶん10MB強。 それでもdjango的には1秒もかからず処理してくれている。 20件ある先頭レコードでコピーしても同じやった。 数百件とか数千件だと時間かかるのかもしれないけど、ここではこれで十分。 dockerコンテナでもこれぐらい動いてくれるんやなぁ。 レコードの構成 jpegとpdfは実表示用データ(longblob)だけでなく、一覧表示するときのための縮小版(mediumblob)を持ってる。1レコードに3つの添付ができるように、同じようなフィールドが3つずつある。 mariaDB上の定義 前回のblob操作は在庫のテーブル使ってたけど、今回は活動テーブル。 BLOBって名前で始まる列の定義は他のテーブルも完全に同じ。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 CREATE TABLE `GVIS_work` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `workPeriod` datetime DEFAULT NULL COMMENT '業務期間-開始日', `workShubetsu` char(4) DEFAULT NULL COMMENT '作業種別', `workPriority` int(10) DEFAULT NULL COMMENT '優先順位', `Category1` varchar(100) DEFAULT NULL COMMENT 'カテゴリ1', `Category2` varchar(100) DEFAULT NULL COMMENT 'カテゴリ2', `Tehai` varchar(10000) DEFAULT NULL COMMENT '手配方法・名称・機種', `Kazu` decimal(12,4) DEFAULT 0.0000 COMMENT '数量', `Tnk` decimal(12,4) DEFAULT 0.0000 COMMENT '単価', `Kng` decimal(12,4) DEFAULT 0.0000 COMMENT '金額', `WorkTime` decimal(12,4) DEFAULT NULL COMMENT '作業時間', `Biko` varchar(100) DEFAULT NULL COMMENT '備考', `BLOB_data1` longblob DEFAULT NULL COMMENT 'BLOBデータ1', `BLOB_data2` longblob DEFAULT NULL COMMENT 'BLOBデータ2', `BLOB_data3` longblob DEFAULT NULL COMMENT 'BLOBデータ3', `BLOB_extent1` varchar(100) DEFAULT NULL COMMENT '添付mime1', `BLOB_extent2` varchar(100) DEFAULT NULL COMMENT '添付mime2', `BLOB_extent3` varchar(100) DEFAULT NULL COMMENT '添付mime3', `BLOB_medium1` mediumblob DEFAULT NULL COMMENT '添付-埋め込み画像用1', `BLOB_medium2` mediumblob DEFAULT NULL COMMENT '添付-埋め込み画像用2', `BLOB_medium3` mediumblob DEFAULT NULL COMMENT '添付-埋め込み画像用3', `ins_date` datetime DEFAULT NULL COMMENT 'データ作成日', `ins_user` varchar(100) DEFAULT NULL COMMENT 'データ作成ユーザ', `upd_date` datetime DEFAULT NULL COMMENT 'データ更新日', `upd_user` varchar(100) DEFAULT NULL COMMENT 'データ更新ユーザ', PRIMARY KEY (`id`), KEY `IDX_work` (`workPeriod`,`workShubetsu`,`workPriority`,`Category1`,`Category2`,`Tehai`(255)) ) ENGINE=InnoDB AUTO_INCREMENT=1502 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC django内のmodels.pyの定義 blob列はdjangoではTextFieldになる。 ...

 ⭐️

macのchromeが真っ黒(妄想)

googleにお金払ってメールやクラウドを使ってるので、gmailとgoogle cloud consoleはchromeでいっつも見てる。 ある日、妄想でchrome起動したら真っ暗になってた。 どうしようもない雨の日で、お先真っ暗って気分になった。 その回避方法。 原因 googleにあるchromeのヘルプを探してみた。 chromeは画面描画の際にハードウェアアクセラレータを使いたがるらしい。 その設定が生きてると、真っ暗になることがあるって。 そのほうが処理能力が上がってレスポンスが上がるからなんやろけど・・・。 いらんことせんといて欲しいなぁ。 chromeの右上に「・・・」って書いたアイコンがあって、そこから設定に行けって解説してあるけど、真っ黒で見えんかった。 以下、真っ暗じゃないときにアイコンがある箇所。 アンインストール(これだけじゃ治らず) APPのフォルダを開いて普通にchromeのアイコンをゴミ箱に入れる。 しばしお別れ。 chromeのdmgをダウンロードしてマウントし、開いた窓でAPPにドラッグしたらまたインストールできる。 そしたらまだ真っ暗。 くろむー、腹立つー!! たぶん設定ファイルがどっかにあるんやな。 設定ファイルを潰す こうなったら、どっかに設定ファイルみたいなのがあるはずやから潰したるねん。 設定を削除する方法を探したら、書いておられる方がおられた。 作者さんありがとう。 Knowledge for Google Products: Chrome の初期化方法(Windows / Macintosh 編) kitaney-google.blogspot.com もう1回アンインストールして、作者さんが解説してたことをコマンドラインでやってみる。 1 2 rm -fR /Users/nari/Library/Application Support/Google/Chrome rm /Users/nari/Library/Preferences/com.google.Chrome.plist ここでさっきダウンロードしておいたchromeのdmgファイルを使ってインストールしたら治った。 なぜかハードウェアアクセラレーションがオンでもブラウザは真っ暗にはなってへんかったけど、即座にオフにした。 削除を2つ実行したけど、2つ目のPreferencesのフォルダの中見たら昔使ってたソフトウェア設定がゴロゴロ残ってることに気づいた。 インストールしなおしたらまた同じ設定が使えるって配慮やろけど、設定おかしくなったときは困ったことになるから、いらんものはついでに消しといた。 そういえばwindowsでも同じようなフォルダがあるなぁ。 Usersフォルダの自分のプロファイルにAppなんとかってフォルダがあったはず。 参考にさせてもらったサイトにも、%USERPROFILE%¥AppDataってある。 windowsもたいがいやけど、macも手間かかるわぁ。