投稿者「sasakima-nao」のアーカイブ

Hibari

昨日の遅番出勤中に田圃にてキジを発見、当然カメラは無い。
今日も来るかもしれない、と同じ田圃で張り込みをすることに。

sekirei

出待ち中に LUMIX G99 の追尾 AF ターゲットを試してみる。
EVF を覗いた状態でタッチパネルでターゲットを指定、簡単だね。
このサイズ以上ならしっかり追尾してくれる、オリンパスは…
ターゲット枠より小さいと容赦無く背景に抜けるのはしかたがない。
大きめで動き回る被写体には使えるかも。

hibari

ヒバリ、E-M5 ボディにて少しクロップ。
G99 の直後に使うとやはりグリップが欲しくなる、てか持ちづらい。
完全に慣れなんだけど G99+100-400 を持つと「コレコレ」ってなる。
OM-1 とかでも「コレコレ」感が出るのかな?いやまだ買わないけど。
てかもうヒバリがいるのか、今までドコにいっていたんだろう?

hibari

別の場所でこれもヒバリ、G99 ボディにて少しクロップ。
今更だけど Dual I.S. ってスゲェな、E-M5 手ぶれ補正よりいい。
補正自体はどっこいだけどコッチはレンズを振っている時にも補正するのが。
これが本当にありがたい、比べないと気にしないかもだけど。

Luminar Neo 現像はやっぱり LUMIX のほうが綺麗に、Standard が選べるし。
キジは現れず、明日はどうしよう。

Escape

INI ファイルの読み書きページを更新しました。
INI ファイルの読み書き – Paepoi

セクションを見つける正規表現に最初戸惑った。

EXP = r'^\[\w+\]$'

でイケると思ったけど文字列に半角スペースがあると認識できない。
半角スペースを使うなで済ませようとも思ったけど。

EXP = r'^\[[^\]]+\]$'

そうだ「閉じブラケット以外の文字列なら何でもいい」にすれば!
こんなアホな思いつきに対応できる正規表現ってやはり面白い。

とほほの正規表現入門 – とほほのWWW入門
ところで、とほほさんで見た「ブラケット内は記号の意味を失う」なんですが。

#! /usr/bin/env python3

import re

# [..] にマッチさせる正規表現
EXP = r'^\[[^\]]+\]$'
# EXP = r'^\[[^]]+\]$' # Python OK

a = ['[test]', '[test2]', '[test3] ', ' [test4]', '[test 5]']

for s in a:
    if re.search(EXP, s):
        print(s)

Python

#! /usr/bin/env php

<?php

// [..] にマッチさせる正規表現
$EXP = '/^\[[^\]]+\]$/';
// $EXP = '/^\[[^]]+\]$/'; # PHP OK

$a = ['[test]', '[test2]', '[test3] ', ' [test4]', '[test 5]'];

foreach ($a as $s) {
    if (preg_match($EXP, $s))
        echo $s.PHP_EOL;
}
?>

PHP

#! /usr/bin/gjs

// [..] にマッチさせる正規表現
const EXP = /^\[[^\]]+\]$/;
//const EXP = /^\[[^]]+\]$/; // Gjs NO

let a = ['[test]', '[test2]', '[test3] ', ' [test4]', '[test 5]'];

for (let s of a) {
    if (EXP.test(s)) {
        print(s)
    }
}

Gjs ダメだった。

JavaScript エンジンは複数あるので全部かどうかは試していないけど。
エスケープすれば全部イケたのでブラケット内もエスケープしたほうがいいかと。

deprecated: SafeConfigParser

Python 3.11 は SafeConfigParser が非推奨になっていた。

deprecated

3.12 で完全削除のようです、3.11 は一応まだ動く。
今のうちに 2013 年に作った下記ページを書き換えとかないと。

INI ファイルの読み書き – Paepoi

てか GTK3 のコードだし、require_version していないし。
それと文字列をシングルクォートに統一でココは手をつけていないし。
自作クラスのほうも今なら正規表現にするし。

configparser — 設定ファイルのパーサー ? Python 3.11.1 ドキュメント

configparser.ConfigParser にすればいいのかな?
GTK4 で書き換えしてみよう。

#! /usr/bin/env python3

import os, configparser, gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

INI = 'test.conf'

class Win(Gtk.ApplicationWindow):
    '''
        ini(conf) の読み書き例
        Window の位置と大きさを保存と復元
    '''
    def __init__(self, a):
        '''
            起動時に ini を読み込む
            GTK4 は位置指定できないのかな?
        '''
        Gtk.ApplicationWindow.__init__(self, application=a, title='ini')
        # 設定ファイルを探す
        if os.path.exists(INI):
            # configparser を作成し読み込む
            conf = configparser.ConfigParser()
            conf.read(INI)
            # 後での追記を考えて has_opthon しておこう
            cx = 200
            cy = 200
            if conf.has_option('window', 'width'):
                cx = conf.getint('window', 'width')
            if conf.has_option('window', 'height'):
                cy = conf.getint('window', 'height')
            self.set_default_size(cx, cy)

    def do_close_request(self):
        '''
            GTK3 では do_delete_event
            終了時に ini に書き込み
        '''
        conf = configparser.ConfigParser()
        if os.path.exists(INI):
            conf.read(INI)
        # [window] セクションが存在しなければ追加
        if not 'window' in conf.sections():
            conf.add_section('window')
        # サイズを取得(タプルで戻る)して conf にセット
        cx, cy = self.get_default_size()
        conf.set('window', 'width', str(cx))
        conf.set('window', 'height', str(cy))
        # ファイルに書き込む
        with open(INI, 'w') as f:
            conf.write(f)
        return False

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()

これでイケるようだ。
そういえば GTK4 でウインドウの位置指定ってまだ調べていなかったな。

Composition

先週は WebP ネタが長くなって写真が貼れなかった。
今日は用事があったので撮影無し。
ということで先週分のを今日になって RAW 現像。

01

ジョビ子を地上にて日の丸構図、しゃがんでなるべく水平に。
今更だけどパナライカ 100-400 で地上の前ボケはイマイチ。

02

この子は大サービスで拙者もさせてくれました。
こういう枝並の前ボケならいい感じなんですけど。

03

モズ男、動物写真は目線の方向にスペースを開ける。
トリミングでそうするより最初から狙ったほうが自然になるね。

04

ヨシガモ男、あえて逆にしてみたらコッチ見てる感になった。
トリミングして被写体を大きく見せるより構図を工夫したほうが面白い。

で、遅ればせながら macOS Ventura 13.2 にアップデート。
LUMIX G99 を USB 接続、おぉ普通に写真を表示できるように戻った。
なんか Monterey の頃より遅い気がするけどまあいいや。

久々に G99 を触って今頃気がついたんですけど。
追尾 AF ターゲットも EVF を覗きながらタッチで動かせるのね。
今度からコレ使おう、まだ知らない機能あるかも。

Change 72dpi Screenshot

前回画像を PIL で WebP 化するネタを書いたけど。
どうせならスクリーンショットの 72dpi 化も同時にやりたい。
72dpi にして WebP にして、って二度手間じゃん。

色々試すとそのまま Image.save は全部 72dpi になるらしい。
ということは半分にリサイズしてセーブするだけですね。

import sys, os, re
from PIL import Image

arg = sys.argv[1:]
for s in arg:
    if re.search(r'\.(jpe?g|png|gif)$', s, re.I):
        im = Image.open(s)
        # 144dip to 72dpi
        x, y = im.size
        im_s = im.resize((x//2, y//2), Image.Resampling.LANCZOS)
        im_s.save(f'{os.path.splitext(s)[0]}.webp')

検索でよく見つかる Image.ANTIALIAS は非推奨になっているので注意。
これを前回と同様に Automator でメニューに追加。

mm

ところで前回 .zprofile をフルパスでって書いたけど。
チルダでイケた、ユーザーは自分自身だもんね。

ss

Pillow って思っていたより高機能なんですね、もっと色々やってみよう。
Pillow (PIL Fork) 9.4.0 documentation