カテゴリー: 未分類

  • Python 3 + pyodbc + unixODBC + FreeTDS の日本語でハマる

    TL;DR

    connect = pyodbc.connect('DSN=SQLServer;UID=user;PWD=password;')
    connect.setencoding('utf-8')
    connect.cursor.execute('SELECT 列 FROM テーブル WHERE 番号 = 5;')

    connect.setencoding() でエンコーディングを指定したら解決しました。

    経緯

    古い基幹システムに SQL Server 2008 が使われており、テーブル名やカラム名が全て日本語で構成されていた関係で、Linux 上の Python から接続するのにひと手間かかっていました。DB 自体は UTF-8 で処理されているので、Python 2 からはクエリを query.encode('utf-8') とすることでうまく処理できていました。さらっと書いていますが、Python にまだ慣れていないときに開発していたので、かなり苦労して辿りついた結論です。

    今回は Bottle を使うに当って Python 3 に移行する関係から DB 接続周りを一新する必要があったのが事の始まりです。DB への接続自体は Python 2 と同じで特に問題もなかったのですが、いざ SELECT 分を execute してみると次のようなエラーを吐きました。

    pyodbc.ProgrammingError: ('42S22', "[42S22] [FreeTDS][SQL Server]Invalid column name 'F'. (207) (SQLExecDirectW)")

    このエラーには見覚えがあり、さらにカラム名は日本語で指定したはずなのに見慣れない文字になっていることから、日本語のエンコーディング周りの問題だろうということはすぐにわかりました。

    まず試してみたのが Python 2 と同じ手法でクエリを encode(‘utf-8’) する方法です。これの結果は

    TypeError: The first argument to execute must be a string or unicode query.

    ユニコードでよこせと怒られてしまいました。なら最初はユニコードで渡してるからそれで良いのではないか。

    次に疑ったのはファイルの文字コードを他のエンコーディングで保存していないかです。でもソースコード冒頭には # -*- coding: utf-8 -*- と記述した上で、間違いなく UTF-8N で保存しています。試しに Shift JIS で保存すると、次のエラーで実行すらできません。

    SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x8f in position 0: invalid start byte

    調べていても、そもそも Linux の Python から Windows Server の SQL Server を扱う事例自体が少なすぎて、情報があまり得られません。そこで、pyodbc のソースを読んでみようと思ったら、そのものずばりの情報がありました。

    記事冒頭に書いた、DB に connect() した後 connection.setencoding('utf-8') するだけです。これで無事に日本語のテーブル名、列名を処理できました。

    たった一文のことですが、情報量が少ないとこれに辿りついて気づくまでが本当に大変です。

  • Windows Update 後に指紋認証が使えなくなった – ThinkPad X1 Carbon 5th Gen

    Windows Update 後に指紋認証が使えなくなった – ThinkPad X1 Carbon 5th Gen

    ThinkPad X1 Carbon 5th Gen(Windows 10 64bit) にて Windows Update 後に指紋認証によるログインができなくなりました。設定 -> アカウント -> サインインオプション を確認すると、Windows Hello に対応するデバイスがないと表示されています。

    Lenovo のサイトから「ドライバーとソフトウェア」へ行き、X1 Carbon 用の指紋認証リーダーのドライバを取得します。

    「Synaptics Metallica MOC 指紋認証 ドライバー」をダウンロードしてインストールします。

    設定 - アカウント - Windows Hello
    設定 – アカウント – Windows Hello

    再起動することなく、無事に指紋認証が有効になりました。

  • アニメでのフィルタによる画質向上 – TMPGEnc Video Mastering Works 6

    アニメでのフィルタによる画質向上 – TMPGEnc Video Mastering Works 6

    TMPGEnc Video Mastering Works 6(以下VMW6) で録画したアニメをエンコードするお話の続きです。前回のインターレース解除に続いて、今回はエンコード時のフィルタによって画質は良くなるのか、というお話。

    録画したそのままの映像を拡大してみると、意外とブロックノイズが多いことに気付くと思います。地上波だと 1440x1080p で 20Mbps 弱といったところ、それを MPEG2 でエンコードしているので仕方ないところです。

    まずは調査がてらに色んな人の意見を見てみたのですが、大体の方が「映像ノイズ除去」あるいは「高精度映像ノイズ除去」を使っていて、「映像シャープネス」や「スマートシャープ」をお好みで、というパターンが多いようでした(各フィルタのオンラインヘルプへのリンクを張っておいたので、詳しくはそちらで)。

    「高精度映像ノイズ除去」は処理が重いらしく処理時間が跳ね上がるので、性能に余裕があるか CUDA を使える環境ならば選ぶといった感じみたいです。

    「スマートシャープネス」は後述しますが、下手にかけると作画に影響が及ぶくらいの効果が出ます。なので原画に忠実にしたい場合はオフにするのが好ましい。

    結局試さないとはっきりわからないってことで、検証した結果を残しておきます。初めに断っておきますが、以下のキャプチャはすべてプレビュー画面から保存したものなので、最終的にエンコードして出てきたものをキャプチャしたものではありません。ご了承ください。

    花咲くいろは 1話より
    花咲くいろは 1話より

    検証には『花咲くいろは』第 1 話より、緒花ちゃんの見上げるシーンを使わせていただきました。

    高精度映像ノイズ除去

    高精度映像ノイズ除去

    実写映像での高精細な処理や、ベタ塗りで構成されることの多いアニメーション的な映像で発生しているノイズ成分を解析し、除去します。また素材にすでに発生してしまっているブロックノイズなどの除去にも向きます。処理が複雑なため、通常の[映像ノイズ除去]フィルターよりもディテールの保持に向いていますが、処理速度に大きな影響が出るので、場合によっては[映像ノイズ除去]フィルターと使い分けてください。

    高精度映像ノイズ除去 – TMPGEnc Video Mastering Works 6 オンラインヘルプ

    通常の「映像ノイズ除去」より優れているが、やっぱり重たいみたいですね。

    デフォルト設定

    なし
    なし
    強さ: 10 範囲: 普通(普通) - デフォルト
    強さ: 10 範囲: 普通(普通) – デフォルト

    髪の輪郭線近くにあるブロックノイズが、なんとなく消えているのがお判りいただけるでしょうか。他の輪郭線近くも同様によーく見ないとわかりませんが、JPEG 系のブロックノイズが抑えられている感じです。

    続いて、処理を軽くするために「範囲」を「狭い(速い) – ディティール保存重視」に固定し、「強さ」を変化させて検証してみます。

    強さによる違い

    強さ: 10 範囲: 狭い(高速) - ディテール保存重視
    強さ: 10 範囲: 狭い(高速) – ディテール保存重視
    強さ: 100 範囲: 狭い(高速) - ディテール保存重視
    強さ: 100 範囲: 狭い(高速) – ディテール保存重視
    強さ: 250 範囲: 狭い(高速) - ディテール保存重視
    強さ: 250 範囲: 狭い(高速) – ディテール保存重視
    強さ: 600 範囲: 狭い(高速) - ディテール保存重視
    強さ: 600 範囲: 狭い(高速) – ディテール保存重視

    いかがでしょうか。正直この記事を書いている画面では全然差がわからないのですが(笑)、拡大して見てみるとだいぶ違いがあります。強さ 100 になると緒花ちゃんの髪の明部のノイズは目立ちませんが、髪飾りの暗部の白浮きノイズは強さ 250 にならないと消えません。強さ 600 まで行くとノイズは確認できませんが、全体的にぼやっとした絵になるので、ちょっとやりすぎですね。大体の方が 200~300 を目安としているようでした。

    違いがわかりにくい場合、画面の明度を上げて、比較画像をダウンロードして画像ビューワで全画面表示してパラパラとめくってみてください。

    スマートシャープ

    スマートシャープ

    映像の輪郭を検出し、輪郭部分を細く(スマートに)することで、解像感を向上させます。

    スマートシャープ – TMPGEnc Video Mastering Works 6 オンラインヘルプ

    ただのシャープネスではなく、ぼやっとした輪郭線を、太らせずに綺麗にはっきりさせる感じでしょうか。

    デフォルト設定

    スマートシャープなし
    スマートシャープなし
    範囲: 80 ぼかし強度: 3 検出レベル: 128 - デフォルト
    範囲: 80 ぼかし強度: 3 検出レベル: 128 – デフォルト

    こちらのフィルタはわりとわかりやすいでしょうか。輪郭線が明かに細くなっていますね。冒頭で「作画に影響が及ぶ」というのはこういうことです。線の太さが変ってしまうと、画風にも影響が出ますから、ぱっと見の綺麗さに乗せられて軽々しく使うものではないと思います。

    範囲による違い

    範囲:
    範囲を指定します。
    1~255 の範囲で設定可能です。
    値が大きくなるほど、輪郭からより広い範囲にスマートシャープの効果を適用します。
    範囲: 1 ぼかし強度: 3 検出レベル: 128
    範囲: 1 ぼかし強度: 3 検出レベル: 128
    範囲: 80 ぼかし強度: 3 検出レベル: 128 - デフォルト
    範囲: 80 ぼかし強度: 3 検出レベル: 128 – デフォルト
    範囲: 255 ぼかし強度: 3 検出レベル: 128
    範囲: 255 ぼかし強度: 3 検出レベル: 128

    強度による違い

    ぼかし強度:
    ぼかしの強さを設定します。
    1~10 の範囲で設定可能です。
    値が大きくなるほど、輪郭の検出を鈍くさせ、輪郭としてより目立つ部分をターゲットにスマートシャープの効果を適用します。 大きくしすぎると、ぼやけた輪郭線となります。
    範囲: 255 ぼかし強度: 1 検出レベル: 128
    範囲: 255 ぼかし強度: 1 検出レベル: 128
    範囲: 255 ぼかし強度: 10 検出レベル: 128
    範囲: 255 ぼかし強度: 10 検出レベル: 128

    検出レベルによる違い

    検出レベル:
    輪郭部を検出する強さを設定します。
    1~255 の範囲で設定可能です。
    値が大きくなるほど、より細くくっきりとした輪郭線となります。
    範囲: 255 ぼかし強度: 3 検出レベル: 1
    範囲: 255 ぼかし強度: 3 検出レベル: 1
    範囲: 255 ぼかし強度: 3 検出レベル: 128
    範囲: 255 ぼかし強度: 3 検出レベル: 128
    範囲: 255 ぼかし強度: 3 検出レベル: 255
    範囲: 255 ぼかし強度: 3 検出レベル: 255

    結論

    ここまで試しておきながら、結局は「高精度映像ノイズ除去」だけを使う予定です。強さは 250 で。いくら綺麗になると言っても、作画に影響が出るのはちょっとやり過ぎかなと思いまして。

  • アニメでのインターレース解除 – TMPGEnc Video Mastering Works 6

    アニメでのインターレース解除 – TMPGEnc Video Mastering Works 6

    急に昔の録画をエンコードしたくなったので、思い切って定評のある TMPGEnc Video Mastering Works 6(以下VMW6) に手を出して試行錯誤してみたお話です。結論を先に書いてしまうと、先人が用意されたプロファイルが一番楽で綺麗でバランスが取れています。

    手っ取り早く済ませたいなら本当にこれが一番です。以下は色々効果を調べたい方向けの内容です。

    (さらに…)

  • Debian の WordPress でハマったこと

    プラグインやテーマの更新で FTP 接続を要求される

    原因
    Apache 等のプロセスが、wp-content に書込む権限がないのが原因です。
    対処
    wp-content に書込権限を与える、または所有者を変更する。
    参考
    自宅DebianサーバーにWordPressインストール後にハマりやすい注意点3つ – デフよん
    $ sudo chmod 707 /usr/share/wordpress/wp-content/

    または

    $ sudo chown -R www-data:www-data /usr/share/wordpress/wp-content/