スナックelve 本店

バツイチ40代女の日記です

おみくじどころじゃねぇ!!w

f:id:elve:20220101155553p:plain

ハロー2022。エルベです。
一昨年10月にマッチングアプリで知り合った男と、去年の3月から同棲をはじめました。
去年の正月は、凶を2連続でひいたりしていました。そんな事あるんだなぁ。

snack.elve.club
snack.elve.club
snack.elve.club

とか思っていたらですね、2022。朝一で初詣に行ったら神社の門が開かなかった(爆)


www.katsushikahachimangu.com

1月1日は午前6時に開門

https://www.katsushikahachimangu.com/

寝坊とかそれくらいのハプニングであってほしいね(;´Д`)

京成八幡からエモい感じの道のり
f:id:elve:20220101154354j:plain
f:id:elve:20220101154401j:plain


珍しくカズがプンスカしてて面白かったです(ノД`)ナェルシク
そっかー、そういうのは君はだめなんだねぇ。

そしてカズは定位置(実家)に帰り、私も定位置(PC前)で各々の正月を満喫するのでありました・・・。
べ、別に寂しくないわよぅっ!!

消費は娯楽なんだよねぇ

f:id:elve:20220101142127p:plain

あけちゃいました~。2022年も意味不明な長文を生成する疑似AI(なに?)として成長していきますのでご贔屓に!!

今週のお題「買ってよかった2021」

ソーダストリーム

snack.elve.club

最近ちょっと調子悪いみたいなんですが、炭酸水を運ばなくて良いのは助かる!
毎日500ml~1L飲んどるね、カズが。
ガスシリンダー60L(2,160円)で70本(500ml)くらい作れます。
amazonで買ってたら500mlで80円くらいだから5,600円位?
バッキバキの強炭酸以外認めない!! とかじゃなければおすすめ。冷たい水で作ると結構いい感じの炭酸になりますよ。

浄水ポットは2020年購入っぽいのでパス

でかい冷蔵庫

snack.elve.club
引っ越しを機に購入。そんなに料理するわけじゃない。
唐突にカズが大量の肉買ってきても、私が気分で持つ鍋セット買ってもスイスイ入るので助かる。
やはり腕に覚えがない人ほど道具に助けてもらったほうが良いですよ。

電気代は部屋がワンルームから2DKに移ったのでどうしても上がっちゃいますね。2人だと思えばまぁ頑張ってる方かな?

2020/11/30 ソフトバンクでんき 1,348
2021/11/30 ソフトバンクでんき 2,453

LEDシーリングライト

snack.elve.club
amazon ECHOにコントロールしてもらってます。リモコン便利。

iPad Pro & iPhone13mini

snack.elve.club
snack.elve.club

すごく遊びやすくなった。iPad miniがめちゃ評判いいので気になっちゃうところ(;´Д`)
父は順調に生存中。取るもんとって、後は定期検診って感じみたいです。
役に立ってたら良いけどね。使いこなせてなかったっぽいのよね(ノД`)ナェルシク

iPhone13miniはサイズがちょうどよくて、やはりコレ以上大きいのは持てない(;´Д`)

秀丸

ワイが生まれて初めて(・・・かな? DOSのとき覚えてないわ(;´Д`))触ったテキストエディタ。♪マクロが素敵 思想が素敵 思わず見とれてしまうの とかいいながら見とれて二十数年。ようやく購入。
秀まるおのホームページ(サイトー企画)-秀丸エディタ

Microsoft Office 365

コレもうずっと2010を使っていて、そろそろ新しい機能も試してみたい・・・なんて思って買いましたが、新機能には全く触れておりません(笑)
でもほんと、Excelできたらそれでいい気がするね、人生(大げさ)。セキュリティソフトと同時購入で2割引きくらいで買えた。
・・・でも高いのよね。フォントとか送料と同じでめちゃくちゃ恩恵に預かってるのに対価払うのケチってしまうアレですな。
www.microsoft.com

ソフトウェア 有効期限 価格 1ヶ月あたり
Microsoft 365 Personal 15 11,880 792 81%
Microsoft 365 Personal 12 11,682 974

OneDriveの容量が増えたため色々入れてしまいサブスクリプションをやめられない罠にかかっている(ノД`)ナェルシク

花柄厚底スニーカー

足がつったりサイズギリギリすぎてつま先がヒリヒリしますが可愛いので大満足です。

もうちょい頑張ってほしいで賞

デロンギのオイルヒーター

諦めてでかいの買えばよかったわ・・・。高くてなぁ・・・。寒いのきつい・・・。
snack.elve.club

Teplo ティーポット

https://teplotea.com/
茶はうまい。が、高いから当然でしょ~ってのはある。
snack.elve.club

カルテック 首掛けタイプ

いや、私が勝手に油断してるだけなんだけどw フィルター掃除しないとな。確か水につけるだけなんだけどさ。なかなかね。

snack.elve.club

壁掛けタイプが新宿のPCR検査会場にかかってて、なんかちょっと嬉しかったw

かるがるぅ~

f:id:elve:20220101130422p:plain

googleフォトをOneDriveに年ごと月ごとフォルダに分けたい・・・ただそれだけなのにクソ重くてどうしようかと思っていたのですが、Pythonでサクッと終わりました(;´Д`)
snack.elve.club

適材適所ですな!!!(ノД`)ナェルシク
たぶんTypeScriptはこういうローカルいじるんじゃなくてサーバーでweb系コンテンツいじる時に力を発揮するんだと思います(;´Д`)

まず、OneDriveと同期してるフォルダいじると毎回同期で時間がかかるので別のフォルダに一旦移してからOneDriveに移すことにしました。
年フォルダの中に01~12の月フォルダを入れます。

import os
b = "C:\\Users\\user\\Desktop\\Takeout\\"
for y in range(2000, 2022):
    os.mkdir(b + format(y, '0>4'))
    for m in range(1, 13):
        os.mkdir(b + format(y, '0>4') + "\\" + format(m, '0>2'))

for分の書き方すらググらんとわからんレベルですよ(;´Д`)

from PIL import Image
import datetime
import os
# 0x0132	306	Image	Exif.Image.DateTime
# 0x9003	36867	Image	Exif.Image.DateTimeOriginal
# 0xc71b	50971	Image	Exif.Image.PreviewDateTime
# 0x9003	36867	Photo	Exif.Photo.DateTimeOriginal
# 0x9004	36868	Photo	Exif.Photo.DateTimeDigitized
#

#画像ファイルの移動
def moveImgFile(im):
    exif = im.getexif()
    index = [306, 36867, 50971, 36867, 36868]
    d = []
    for i in index:
        if i in exif:
            tmp = exif[i].split()
            d.append(datetime.date.fromisoformat(tmp[0].replace(":", "-")))
    #ここでim開放しないとパーミションエラーが出る(ハマった)
    im.close()
    del im

    minD = datetime.date.today()
    for dd in d:
        if minD > dd:
            minD = dd

    mD = minD.strftime('%m')
    try:
        os.rename(baseP + y + "\\" + f,
                  "C:\\Users\\user\\Desktop\\Takeout\\" + yD + "\\" + mD + "\\" + f)
    except OSError as err:
        print("OS error: {0}".format(err))
    except:
        print(os.error)
    return

#画像以外の移動
def moveFile(flfilename):
    f = os.stat(flfilename)
    d = []
    d.append(datetime.datetime.fromtimestamp(f.st_ctime).date())
    d.append(datetime.datetime.fromtimestamp(f.st_atime).date())
    d.append(datetime.datetime.fromtimestamp(f.st_mtime).date())
    if "st_birthtime" in f:
        d.append(datetime.datetime.fromtimestamp(f.st_birthtime).date())
    minD = datetime.date.today()
    for dd in d:
        if minD > dd:
            minD = dd

    mD = minD.strftime('%m')
    filename = os.path.basename(flfilename)
    try:
        os.rename(flfilename,
                  "C:\\Users\\user\\Desktop\\Takeout\\" + yD + "\\" + mD + "\\" + filename)
    except OSError as err:
        print("OS error: {0}".format(err))
    except:
        print(os.error)
    del f
    return

#メイン処理
baseP = "C:\\Users\\user\\Desktop\\Takeout\\Google フォト\\"

yDirList = os.listdir(baseP)
for y in yDirList:
    yD = y.replace("Photos from ", "")
    files = os.listdir(baseP + y)

    files_file = [f for f in files if os.path.isfile(
        os.path.join(baseP, y, f))]
    del files
    for f in files_file:
        try:
            im = Image.open(baseP + y + "\\" + f)
            moveImgFile(im)
        except:
            moveFile(baseP + y + "\\" + f)
del yDirList

おまけ:空フォルダ削除

import os

baseP = "C:\\Users\\user\\Desktop\\Takeout\\"

yDirList = os.listdir(baseP)
for y in yDirList:
    for m in range(1,13):
        fileList = os.listdir(baseP + y + "\\" + format(m, "0>2"))
        if not fileList:
            os.rmdir(baseP+y+"\\")
for y in yDirList:
    fileList = os.listdir(baseP + y + "\\" )
    if not fileList:
        os.rmdir(baseP+y+"\\")

参考

[Python入門]ファイル操作と例外処理:Python入門(1/2 ページ) - @IT
組み込み関数 — Python 3.10.0b2 ドキュメント
os --- 雑多なオペレーティングシステムインターフェース — Python 3.10.0b2 ドキュメント
stat --- stat() の結果を解釈する — Python 3.10.0b2 ドキュメント
string --- 一般的な文字列操作 — Python 3.10.0b2 ドキュメント
8. エラーと例外 — Python 3.10.0b2 ドキュメント
ExifTags Module — Pillow (PIL) examples
[Python] フォルダやファイルのコピー、移動、削除(shutilモジュール) | Hbk project
【python3】forとifを一行で書きたい|yucco|note
Pythonで現在時刻・日付・日時を取得 | note.nkmk.me
Pythonの基本的なエラー一覧とその原因の確認方法 | note.nkmk.me
Python, formatで書式変換(0埋め、指数表記、16進数など) | note.nkmk.me
Pythonの三項演算子(条件演算子)でif文を一行で書く | note.nkmk.me
Pythonでリスト(配列)に要素を追加するappend, extend, insert | note.nkmk.me
Pythonでファイル名・ディレクトリ名の一覧をリストで取得 | note.nkmk.me
Pythonでパス文字列からファイル名・フォルダ名・拡張子を取得、結合 | note.nkmk.me
Pythonでディレクトリ(フォルダ)を作成するmkdir, makedirs | note.nkmk.me
Pythonでファイル・ディレクトリを削除するos.remove, shutil.rmtreeなど | note.nkmk.me
Python, pathlibでファイル一覧を取得(glob, iterdir) | note.nkmk.me
Pythonの画像処理ライブラリPillow(PIL)の使い方 | note.nkmk.me
Pythonでファイル・ディレクトリを移動するshutil.move | note.nkmk.me
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数) | note.nkmk.me
Python日付型 - Qiita
Python配列のループ処理 - Qiita
【Python】PillowライブラリのExifTags名前一覧を取得 - Qiita
[Python]ファイル/ディレクトリ操作 - Qiita
WindowsでのPython外部モジュール導入のはまりどころ - Qiita
Python - stat — stat()の結果を解釈する - Source code:Lib/stat.py stat の結果を解釈するためのモジュール定義定数と機能 os.stat() 、 os.fstat() と os - 日本語
Pythonでos.remove()を使って条件を指定してファイルを削除しようとするとPermissionErrorになる - プログラミング素人のはてなブログ
【Python】Pillow(PIL)のインストールをわかりやすく解説 | ジコログ
file io - Error with os.open in Python - Stack Overflow
pythonのwin環境での実行時、ファイル削除しようとするとパーミッションエラー。(またpythonで変に詰まったので備忘録) - プログラミングを趣味にしたい
Pythonのlistdir関数の使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
Python - 「プロセスはファイルにアクセスできません。」の解決法について|teratail
Python - [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。:|teratail
python for文を初心者向けに解説!for文基礎はこれで…|Udemy メディア
python : PermissionError:[WinError 32]別のプロセスで使用されているため、プロセスはファイルにアクセスできません。
Pythonでディレクトリ(フォルダ)が空か確認する - ほぼ中立ブログ
Python | ファイル名またはディレクトリ名を変更する
関数の定義: ゼロからのPython入門講座 - python.jp
【Python入門】メモリの解放や効率的に使う方法をマスターしよう! | 侍エンジニアブログ
python — Pythonでファイルが開いていない(他のプロセスで使用されていない)

くっそ重い

f:id:elve:20211231232830p:plain
snack.elve.club
snack.elve.club

最後のリネーム後のファイル名間違えて結構なファイルをロスした(ノД`)ナェルシク
上書きするから注意ね(ノД`)ナェルシク
googoleフォトから復活させる(ノД`)ナェルシク
処理が激重なので非同期処理にしたほうがいいかも。

exiftoolインストールしてc:\nodeにコピって名前変更しておく。

const fs = require('fs');
const { spawnSync } = require('child_process');

function getMonthStr(path) {

    const stats = fs.statSync(path);
    let d = [];

    // 最終アクセス時刻
    d.push(new Date(stats.atime));
    // 最終修正時刻
    d.push(new Date(stats.mtime));
    // 最終状態変更時刻
    d.push(new Date(stats.ctime));

    //exiftoolで取れそうな日付タグ
    let tag = ["FileModifyDate", "FileAccessDate", "FileCreateDate", "CreateDate", "ModifyDate", "MetadataDate", "DateTimeOriginal", "CreateDate"];

    // シェル上で実行するコマンド
    let i;
    let COMMAND = "C:\\node\\exiftool";
    for (i of tag) {
        let re = spawnSync(COMMAND, ["-T", "-" + i, path]);
        if (re.stdout === null) {
            console.log(re.error.toString());
        } else {
            let tmp = re.stdout.toString().replace("'", "");
            tmp = tmp.replace(/\r?\n/g, "");
            tmp = tmp.replace(":", "-");
            if (tmp != "-") {
                d.push(new Date(tmp));
            }
        }
    }
    let minD = new Date(Date.now());
    for (i of d) {
        if (minD.valueOf() > i.valueOf()) {
            minD = i;
        }

    }
    return ('00' + (minD.getMonth() + 1)).slice(-2);
}


function main() {
    //UTF-8
    let basePath = "C:\\Users\\user\\OneDrive\\画像\\カメラ ロール\\";
    //年ディレクトリ一覧取得
    let dirList = fs.readdirSync(basePath, {
        withFileTypes: true,
    }).filter(dirent => dirent.isDirectory())
        .map(dirent => dirent.name);

    //カメラロールの各フォルダ内
    let yPath;
    for (let i of dirList) {
        //ファイル一覧取得
        yPath = basePath + i + "\\";
        let fileList = fs.readdirSync(yPath, {
            withFileTypes: true,
        }).filter(dirent => dirent.isFile()).map(dirent => dirent.name);
        for (let f of fileList) {
            let fPath = yPath + f;
            let m = getMonthStr(fPath);

            if (Number(m) > 0 && Number(m) <= 12) {
                fs.rename(fPath, yPath + m + "\\" + f, (err) => {
                    if (err) throw err;
                    console.log('ファイルを移動しました :' + fPath);
                });
            }

        }
    }
}

main();

あ、各フォルダ内に月のフォルダ作った部分忘れた(最初に作った後は不要だったので)

//カメラロールの各フォルダ内に12ヶ月のフォルダを作成
let yPath;
for (let i = 0; i < dirList.length; i++) {
    yPath = dirPath + "\\" + dirList[i] + "\\";
    for (let m = 1; m <= 12; m++) {
        fs.mkdir(yPath + ('00' + m).slice(-2), (err) => {
            if (err) {
                console.log(err.toString());
            }
        });
    }
}

反省したってたるんでるんだよね~

f:id:elve:20211231170614p:plain
snack.elve.club
snack.elve.club

365日ぶりだな・・・

r.gnavi.co.jp


f:id:elve:20211231165042j:plain
f:id:elve:20211231165055j:plain
f:id:elve:20211231165203j:plain
f:id:elve:20211231165212j:plain
f:id:elve:20211231165222j:plain
f:id:elve:20211231165228j:plain
f:id:elve:20211231165230j:plain
f:id:elve:20211231165233j:plain

鴨鍋 もりそば付き
ニシンの甘露煮
アサリのかけ汁煮
蕎麦羊羹

日本酒:山間(やんま)と超辛口の大信州(だいしんしゅう)

年末だからね(;´Д`)
来年も来れるといいね。いいかな? いいよね?