SVGファイルの件

スケーラブルベクターグラフィックス形式といって中身はjavascriptの画像形式で、テキストの入ったような資料を貼付けるのに適していると思う。ブログへの貼付けも通常の画像と同様に貼り付けが可能で、図形拡大による劣化がないのが有難い。今後当サイトでも色々使えそうなので調査してみた。

テキストファイルなのでその気があればテキストエディタで作成・編集が可能だが、基本的にはInkscapeの様な画像ソフトで作成する。Inkscapeの使い方を一からおぼえるのも大変なので、他に手段を考えてみる。Inkscapeでは様々なベクタフォーマットをインポート出来るので、慣れたソフトで作成して変換するのもアリでしょう。

使えそうなフォーマットは*.emf(拡張メタファイル)。これはOffice系からも吐き出せるので便利そう。あとフリーの回路図エディタ水魚堂のBschも*.emfファイルを書き出せるので、回路図を貼付けるの良いかもしれない。ということで早速Bsch付属のサンプル回路図を*.emf出力→InkscapeでSVGに変換してみた。

水魚堂Bschのサンプル回路図

良い感じ。

あと*.wmf(ウィンドウズメタファイル)も対応しているため、簡単な図ならOffice系のDrawで作成して、インポートすれば楽勝じゃん!と思ってPowerPointdeサンプル作って実験してみたところ、インポート時にInkscapeが落ちてしまった。。。

何度やってもダメなため、ネットで調べたが同様の症状は見当たらず、まぁWMF使う人は少ないのかなとでも思っておくことにした。

Officeインポート作戦はあきらめて別の方法を調べていたら、なんと!PowerPointから直接SVGファイルが作成出来るじゃないかー。Office系Drawはある程度使い慣れているので、この方が良いかもしれないが、PowerPointはプレゼンソフトなのでキャンバスサイズがスライドサイズとなり、簡単な図形をそのまま保存すると余白が気になることになる。その場合は保存したい図形を選択した状態でシフトを押しながら右クリックすると「図として保存」という項目があり、そこで出力形式をSVGにすると良い。

作成環境:PowerPoint (Office365) 2021/06/11現在

ちなみに、WordpressでSVGファイルを貼付けられるが、メディアファイルにリンクを設定しても画像ポップアップは出来ないようなので、リンクは無しで貼り付けとする

SVGはソースファイルっぽいので右クリックで保存されないようした方が良さそうだけど、、なんとなく。いや、へんな著作権を主張するんじゃなくて、訪問者の安全性を考えて。。一応javascriptみたいなモンだからねー。

ブロックリスト自動生成(番外)

前回のPythonプログラムの補足説明というか、WEBページで図を使って説明するための練習の様な投稿になります。WEBで表示出来るオブジェクトとしては通常段落と画像が主なものになりますが、画像はビットマップ形式が多く説明用の図には向かないかなと思っていたが、よくよく調べるとHTML5からベクタ図形の表示が出来るようになってるんですね。ほうほう。

ということで、SVGについて少し勉強してみることにした。中身はjavascriptのようで、WEBに貼付けるときは普通に画像扱いで良いとか。作成用のツールはInkscapeというフリーソフトがあるので早速インストールして使用してみた。

illustratorとかと同じように使えそうなスグレモノだけど、あいにく自分はillustrator系は使い慣れていないので、一から勉強するよりは、既存のドローソフトで簡単に描いたものをSVGに変換して貰うだけでも便利そうだ。

簡単なものならWMF(ウィンドウズメタファイル)、EMF(拡張メタファイル)も読み込めるのでBschとかで描いた回路図も変換出来そう。

ということで前回のPythonネタの続き

msks = list(map(lambda n: int('1'*n+'0'*(8-n), 2), [8 if (mask - i*8) >= 8 else (mask - i*8) if (mask - i*8) > 0 else 0 for i in range(4)]))

これは、整数値のネットマスク幅を、IPアドレスリストと同じ形式のマスクビット配列に変換する1文となる。(例えば23 → 11111111.11111111.11111110.00000000

[8 if (mask - i*8) >= 8 else (mask - i*8) if (mask - i*8) > 0 else 0 for i in range(4)]

これが1から32までの数字mskに対して、8ビットずつ4分割し、足りない分は余りと、ゼロとする構文。mskを8で割って、配列の上から「商」の数だけ8として、次に「余り」残りをゼロとする。

map(lambda n: int('1'*n+'0'*(8-n), 2), LIST)

上記配列の要素に対し上位を1で埋めたビット表記に変換して、2進数で数値化

例)7 → 11111110 → 0xFE

これを図で説明すると下図の様になる

なんか余計に分かりにくくなったような。まぁ今回は自分で思い出せれば良いか~くらいのつもりでまとめておきます。今後のツール活用に期待で。

Youtube貼付けに謎の空白が!

別にYoutuberになるわけではないが、Yutubeチャンネルを開設このブログサイトの右上の動画アイコンリンクも自分のチャンネルに変更。

開設理由はたいしたことではなく、過去に投稿した動画ページについて、容量が余裕だったので、自サイトのメディアライブラリにアップして配信を行ってみたが、たった一人しか見ていないのに関わらず転送が間に合わず動画がカクカクになる問題となっていた。やっぱりセオリー通りというか一旦Youtubeなど動画配信専門サイトにアップしてリンクした方が良いという結論になった。そこでの開設と相成ったという感じ。

チャンネル自体は昔から作ってあったけど、身内専用限定公開の為のものだったが、折角なので今回から特に差し障りがない限り公開で行くことにした。

YouTubeにアップした後、自サイトに貼付けること自体は容易な作業で、Wprdpressブロックエディタ(Gutenberg)のブロック挿入コマンドで動画、もしくはYoutubeアイコンを選択し、URL貼り付けとしてYoutubeからの共有URLを貼付けるだけ。編集画面で上手く行っていたので、実際にプレビューしてみたところここで問題発生。

なんだこの空白は!って感じで動画フレームと直前の段落の間に謎の空白が出来てしまっている。

ブラウザの開発者ツールでHTMLのソースを見てみたら特に空白が設定されているわけでもなく、何らかのスタイルシートの影響だろうということまでは想像できた。

ネットで情報収集すると「Wordpress Youtube 空白」で色々出てきて、皆さん苦労しているのが伺える。皆さん各自で対策しているようなので(症状、原因もマチマチな感じ)こちらも独自調査で行くこととする。

埋め込んだブロックをHTML編集することとし、部分的にソース表示すると埋込み用のfigureタグの中にもう一つdivでスタイル指定をしている。

  • <div class=”wp-block-embed wrapper”>

こいつが悪さしているのでは、と、class指定文を削除。Gtenbergは「なんか変だぞ?」とエラーを出してくるが無視してHTMLとして保存。

以上の作業で編集状態では動画のプレビューが出来なくなるが、このままプレビューを行った所、無事、謎の空白が削除されていることが確認できた。

スタイル指定文を削除することで弊害が出るかどうか手持ちの機器でアクセスして確認したところ、特にこれと言って問題は無さそうなので、当サイトではこの方法で貼付けることとした。

当サイトの確認条件

  • WordPress 5.7.2
  • 使用テーマ:Catch Base
続きを読む…

WordPress環境ごたごた

内容はともかく、最近日課としてブログを書くようにしているが、記事が貯まってくると、レイアウトとかいじりたくなり、何となくカスタマイズもしたくなり、と、色々設定をいじっていたら元のレイアウトに戻すことが出来なくなってしまった。具体的には

こんななってしまった

  • 使用していたテーマはCatch Responsiveで、トップページは最新の投稿から順に全文表示していたのだが、数行のダイジェスト表示のリストになってしまった。最近の流行のレイアウトなのだろうか、トップページに固定ページを置き、その下の最新記事をダイジェストする様な形でした。一応テーマ設定で全文表示変更出来るのだが、更新すると元に戻ってしまう。
  • トップページのスライダ画像も設定が消えて、デモ画像になってしまったので、再設定してみたが、これも更新すると元に戻ってしまう。

そこでやったことは、

  • テーマの再インストール ー 効果無し
  • サーバー引越前のバックアップデータがあったので、データベース以外のファイル群をリストアした
    ー テーマ設定情報がデータベース側にあるのか効果はなかった。
  • あきらめて似たようなテーマを探してインストール
    ー 他のテーマであれば設定が反映され正常動作することは確認できた。

結局、元のテーマの不具合の理由は分からないまま、昔の設定のまま長く使っていたのと、サーバーの引越でデータベースの内容がおかしくなったのだろうと結論づけて、似たようなテーマに変更することとした。

選定したテーマはCatch Base(フリー版)で同じ所のもののようで、設定項目も似たような感じでした。違いはデフォルトでは3カラムで両脇サイドバーのレイアウトだったくらいで、トップのスライド画像も前回同様のものを設定可能であった。一応またテーマを変えてしまうかも知れないので、現在のSSを貼付けておきます。

まぁ、ほぼほぼ前回と同じレイアウトに戻せてメデタシメデタシであったが、一つだけ気になる点があった。

続きを読む…

ブロックリスト自動生成その3(素人のサーバー管理)

自動生成プログラムの機能はオプション‘-h’を付けると確認することが出来る。この辺は普通のコマンドラインプログラムっぽく作ってみました。

root@xxx:~# blockset.py -h
usage: blockset.py [-h] [-n] [-f] [-d] [-u] [-o MASK,COUNT] [-c COUNT] [-a ADDRESS] [logfile]

blockset.py collection of unauthorized access list and restart firewall(ufw)

positional arguments:
  logfile               input log file default:/var/log/mail.log

optional arguments:
  -h, --help            show this help message and exit
  -n, --none            Check only mode.
  -f, --force           bloclist force update, unless new record.
  -d, --debug           debug print mode
  -u, --update          blocklist update and restart firewall(ufw)
  -o MASK,COUNT, --orderck MASK,COUNT
                        ipset order ckeck
  -c COUNT, --count COUNT
                        abuse count
  -a ADDRESS, --address ADDRESS
                        individually address entry to blacklist
root@xxx:~#

  • -h(–help)
    ヘルプの表示、引数やコマンドラインオプション説明
  • -n(–none)
    ログファイルの検査のみで何もしない
  • -f(–foce)
    ログの検査で不正アクセスが無かった場合でも、ファイヤーウォール設定ファイルへのブロックリスト追加を続行する(ネットマスクによるリスト整理時に使用する)
  • -u(–upadte)
    ファイヤーウォール設定ファイルの更新とプロセスリスタートを行う
  • -o MASK,COUNT (–oderck MASK,COUNT)
    ブロックリストを再検査し、指定したマスクビットにてグループ化して、一定数以上のものをリストアップする。-fオプションで該当アドレスをマスクビットでまとめてファイヤーウォール設定ファイルを更新する、ファイヤーウォールの再起動には-uオプションを併用する
  • -c N(–count N)
    検査対象ログにて不正アクセスがN回以上あった場合にリストアップする
  • -a ADDRESS(–address ADDRESS)
    IPアドレスを直接指定して登録する、ログ検査と併用する仕様上、便宜的に100回不正アクセスがあったことにしている
続きを読む…

ブロックリスト自動生成その2(素人のサーバー管理)

手動起動によるメンテナンス機能をまとめると(順不同)

  1. 指定した(規定の)ログファイルを検索して不正アクセスのパターンにマッチしたIPアドレスを収集する
  2. 規定回数(例:5回)以上の不正アクセスが確認できたIPアドレスをリスト化
  3. 現行ブロックリスト(ufwの場合:/etc/ufw/before.rules)より現行のブロックリストを読み出し、新しく検出したIPアドレスリストを重複しないようにマージ(基本的には重複しないはず)
  4. オプション機能としてブロックリストの整理ーアクセスの多いIPアドレスのノードを指定幅ネットマスクでまとめる
  5. 新しいブロックリストを更新し、ファイヤーウォールを再起動 ー オプション:基本的には確認のみ

ipv4adrsetクラス

1のIPアドレスのパターンマッチは普通に正規表現と比較だけですむが、ブロックリストにはネットマスクでグループ化した形式(xxx.yyy.zzz.0/24)などに指定アドレスが含まれるかどうかの判定も必要になる。おそらく便利なライブラリがあるとは思うが、ここは勉強を兼ねてクラスを作成した

class ipv4adrset:
    def __init__(self):
        self.ips = []
        self.msk = 32
    def __init__(self, line = None):
        self.set_line(line)

    def set_line(self, line):
        if line is None:
            self.ips = []
            self.msk = 32
        else:
            res = re.match('^([0-9\.]+)\/([0-9]+)$', line)
            (ip, msk0) = (res.group(1), res.group(2)) if res else (line, 32)
            self.ips = list(map(lambda n: int(n), ip.split('.')))
            self.msk = int(msk0)

    def set_mask(self, mask):
        if self.msk < mask:
            return self
        msks = list(map(lambda n: int('1'*n+'0'*(8-n), 2), [8 if (mask - i*8) >= 8 else (mask - i*8) if (mask - i*8) > 0 else 0 for i in range(4)]))
        rip = list(np.array(self.ips) & np.array(msks))
        ret = ipv4adrset()
        ret.ips = rip
        ret.msk = mask
        return ret

    def __eq__(self, other):
        smsks = list(map(lambda n: int('1'*n+'0'*(8-n), 2), [ 8 if (self.msk - i*8) >= 8 else (self.msk - i*8) if (self.msk - i*8) > 0 else 0 for i in range(4)]))
        omsks = list(map(lambda n: int('1'*n+'0'*(8-n), 2), [ 8 if (other.msk - i*8) >= 8 else (other.msk - i*8) if (other.msk - i*8) > 0 else 0 for i in range(4)]))
        sip = list(np.array(self.ips) & np.array(smsks) & np.array(omsks))
        oip = list(np.array(other.ips) & np.array(smsks) & np.array(omsks))
        return sip == oip

    def __str__(self):
        return '.'.join(map(lambda i: str(i), self.ips)) + ('/' + str(self.msk) if self.msk < 32 else '')

  • メンバ変数self.ipsは4要素整数の配列でアドレスを示しており、self.mskはネットマスクピット数でデフォルトは全マスクで32
  • メゾッドset_lineはIPアドレスのマスク有り無しの文字列を読み込みオブジェクトの値をセットする
  • メゾッドset_maskはマスクピット幅をセットする。マスク外のビットはゼロにする
  • メゾッド__eq__は比較関数だが、ネットマスク幅の短い方で比較する。指定したアドレスがあるネットマスクに含まれるかどうかを判別出来る
  • メゾッド__str__は文字列変換関数

改めて見てみるとリスト内包表記で無理に一行で書こうとしている感じで可読性が非常に悪いですね。。。

とくに1文メチャクチャ長いリスト内包表記があるので、覚書きついでに解説

続きを読む…

ドラレコ動画(2021年春その2)

ドライブ花見の動画に続き、もう一つ編集したドラレコ動画をアップします。2021年5月より地元の名古屋高速の料金体系が距離制に変るというのと、名古屋市を一周する名二環という都市高速の西側通路が開通して湾岸道路を合せるとここも一周できるポイントなりましたので早速一周してきました。

10分くらいあって長いです・・・。まぁYoutubeに上げるのが良いかもですが、とりあえず今回はサーバーの機能試験も兼ねてと

ジャンクション辺りだけ通常速度に戻してますが、基本的に一本道では10倍速で編集しています。

これもTMPGEnc Video Mastering Work7で編集しました。

2021/06/10
動画を自サイト貼り付けからYoutube貼付けに変更しました。自サイト(さくらVPS)からの動画配信は無理がありすぎたwwwー全然動画が落ちてこない

ドラレコ動画(2021年春)

土曜日という訳でもないけど、少し内容を変えてと、少し前の今年の4月のネタですが、自粛期間中のお花見ということで、自動車で通り抜けるだけでお花見になるドライブ花見ということにしました。

場所は、三重県鍋田川堤桜並木、南の国道23号線側のAより侵入、Bまで抜ける間の4kmの桜並木となっています。

ドラレコ動画の一部を下記に貼付けます。

動画画質がイマイチですね。撮影はスバルフォレスター(SJ5型)の純正ドラレコですが、一回故障したので、Amazonで売っていた同型品(KEIYO AN-R011G)を取付けました(配線済みだし、純正品より圧倒的に安いw)

画質自体は

  • 録画解像度:1280 x 720p (15FPS)
  • 録画方式:モーションJPEG(AVI)

動画データはSDカードの中の1分ずつの動画として記録されるので、アップロード出来る動画にするためには、連結と、エンコードの作業が必要になる。

動画連結はFFMPEG(フリーソフト)、編集とエンコードはTMPGEnc Video Mastering Work7を使用。

2021/06/10 自サイト配信からYoutube貼付けに変更しました。ついでにYoutubeチャンネルも開設しました。まぁ、ここに貼付けるための足場にするだけの予定ですが・・・

リモートホスト設定・開発環境

パソコンなどのローカル環境から外部サーバー(ここ:さくらVPSなど)に接続して各種設定を行う場合は、基本的にはSSHなどターミナル接続を行い、サーバー上のエディタなどを用いて設定ファイルなどの編集を行っている。

当方の場合は、ローカルのWindowsマシンよりPuttyを使用してSSH接続を行っている。サーバー側もSSHの設定を行いしっかりと鍵ペア認証による接続を行うことで安全性を保っている。ちなみにファイルのコピーには同じ鍵を用いたWinSCPを使用している。

サーバー上での設定ファイルの編集などは、当方ではEmacsを用いている。昔はワークステーション上でも重量級のエディタという印象だったので、チョットしたファイルの編集には不向きということで、専らVi系の軽いエディタを使用していた。まぁ昨今になるとマシンパワーのおかげでそれほど気にするレベルでも無いと言うことで、何となく惰性で使用している。しかし昔ほど気合いの入った設定とかは行う事無くほぼほぼインストールしたままで使用しているのでした。

ただし一点だけ、こだわりではないが、バックアップファイルの自動生成について、デフォルトの設定では、編集してセーブを行うと、元ファイルと同じディレクトリに「(元ファイル名)~」という「~」(チルダ)付きのバックアップファイルが大量発生して何とも見苦しい。その為、バックアップファイルは編集したユーザーのホームの「.saves」ディレクトリにバックアップファイルを世代付きで保存する方式に変更している。

編集対象ファイル例):/home/user-name/project/hogehoge/Readme.md
⇒バックアップファイル:/home/user-name/.saves/!home!user-name!project!hogehoge!Readme.md.~1~

のように元のパス情報を含めたファイル名で世代管理の番号を付けた状態で保存される。下記の設定を

(setq auto-save-default nil)
(setq backup-directory-alist `(("." . "~/.saves")))
(setq backup-by-copying t)
(setq delete-old-versions  t
      kept-ner-versions 6
      kept-old-versions 2
      version-control t)

各ユーザーの設定ファイル(.emacs)に記載しておく、当方の場合は自分以外に使用する人もいないという理由もあって/usr/shara/emacs/下のdefault.elに記載とか乱暴なことをやっている(汗)

続きを読む…

ブロックリスト自動生成(素人のサーバー管理)

自宅あるPCを使っている分には外部からの攻撃とかあまり気にしないけど、さくらVPSなど外部に配置したサーバーだと、攻撃とは言わないまでも手当たり次第にピンポンダッシュしてくる輩の多いこと・・・。

ここでいうピンポンダッシュとは言うまでも無く、ポートスキャンや不正ログイン試行のことで(不正ログインはピンポンダッシュと言うよりドアガチャのイメージかな)、ログを見てても気持ちの良いものではない。そんなに見ていただく内容もない自己満足のサーバーなだけに、こう言うのだけでアクセスが増えるのも何とも困ったものだ。

そこで、ファイヤーウォールのお世話になることになる。何も用事が無ければ全ポート閉じてしまうのが一番安全だけど、何のためのサーバーぞやということで、WEBサーバーもやりたいしメールサーバーも動かしたい。SSHも当然開けておかないと意味がないし。。。

SSHに関しては自分が使うだけなので、ポート番号を変更して鍵のないアカウントからはログイン出来ないようにすればとりあえず安心。WEBサーバーもそれほどいたずらされる心配も無いと思うが、一番怖いのは多分メールサーバーで25番からポート変更するわけにも行かないし、設定不備で世間に迷惑をかけることになりかねない。

引越前のサーバーだが、下のようなログが1日に何百何千と残ることがある

May  2 15:41:32 marocha postfix/smtpd[810548]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:41:32 marocha postfix/smtpd[810542]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:41:42 marocha postfix/smtpd[810542]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:41:43 marocha postfix/smtpd[810559]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:41:54 marocha postfix/smtpd[810559]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:41:54 marocha postfix/smtpd[810568]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:41:58 marocha postfix/smtpd[810568]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:41:58 marocha postfix/smtpd[810570]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:07 marocha postfix/smtpd[810570]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:42:07 marocha postfix/smtpd[810588]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:20 marocha postfix/smtpd[810588]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:42:20 marocha postfix/smtpd[810589]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:30 marocha postfix/smtpd[810589]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:42:31 marocha postfix/smtpd[810590]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:41 marocha postfix/smtpd[810590]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:42:42 marocha postfix/smtpd[810591]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:46 marocha postfix/smtpd[810591]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:42:46 marocha postfix/smtpd[810592]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:43:15 marocha postfix/smtpd[810592]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
続きを読む…