Author Archives: admin

C++でリテラルの文字列をLのリテラルにしてつなげる

前提

Cのリテラル文字列は2つ続けて書くと連結してくれる。

マクロ

ここでL”abcxyz”がほしいときは以下のようにする。

2重のマクロにしないとならない。1重にすると以下のように解釈される

これは以下のように展開される。

つまりマクロを一回かますと、マクロが展開されることになる。##は連結するがシンボルとかを意識しないので単に結びつける、マクロを一回かまさないと展開されないのでLABCになってしまう。このLABCがどこかで#defineされていればちゃんと展開される。

#

ちなみにマクロの#は文字列にして展開してくれるので以下のように書くこともできる。もっと良い書き方があるのかよくわからない。

ソース

https://github.com/ambiesoft/blogprogs/tree/master/5910/literalmacro

コンパイルに/Pオプションを付けるとマクロの展開した時点のソースを拡張子.iをつけて出力してくれる。

古いWindows7のルート証明書の更新

ルート証明書が古いとhttpsでエラーが出るようなので更新したい。

最新のルート証明書を他のマシンからエクスポート

  1. 他の正常なWindows7で[Ctrl+R]mmcを実行。
  2. [ファイル][スナップインの追加][証明書][コンピュータアカウント]で追加
  3. 以下のようにエクスポート

取得した証明書を古いWindows7にインポート

上と同じような感じでエクスポートしたファイルをインポートする。

テストコード

バッチファイルの引数を色々変換

テストスクリプト

実演

testbat.bat aaa

%1 : as it is
%1=aaa

%~f1 : Fully quolified path
%~f1=C:\local\msys2\home\skYjennr\gitdev\bat\src\aaa

%~d1 : Drive letter
%~d1=C:

%~p1 : Path only
%~p1=\local\msys2\home\skYjennr\gitdev\bat\src\

%~n1 : file Name without file extension
%~n1=aaa

%~x1 : file eXtension only
%~x1=

%~s1 : Short 8.3 name
%~s1=C:\local\msys2\home\skYjennr\gitdev\bat\src\aaa

%~1 : removing any surrounding quotes (“)
%~1=aaa

%~a1 : Display the file attributes of %1
%~a1=

%~t1 : Display the date/time of %1
%~t1=

%~z1 : Display the file size of %1
%~z1=

%~$PATH:1 : Search the PATH environment variable and expand %1 to the fully qualified name of the first match found
%~$PATH:1=

WScript.Arguments.Count=1
WScript.Arguments(0)=aaa

testbat.bat “aaa”

%1 : as it is
%1=”aaa”

%~f1 : Fully quolified path
%~f1=C:\local\msys2\home\skYjennr\gitdev\bat\src\aaa

%~d1 : Drive letter
%~d1=C:

%~p1 : Path only
%~p1=\local\msys2\home\skYjennr\gitdev\bat\src\

%~n1 : file Name without file extension
%~n1=aaa

%~x1 : file eXtension only
%~x1=

%~s1 : Short 8.3 name
%~s1=C:\local\msys2\home\skYjennr\gitdev\bat\src\aaa

%~1 : removing any surrounding quotes (“)
%~1=aaa

%~a1 : Display the file attributes of %1
%~a1=

%~t1 : Display the date/time of %1
%~t1=

%~z1 : Display the file size of %1
%~z1=

%~$PATH:1 : Search the PATH environment variable and expand %1 to the fully qualified name of the first match found
%~$PATH:1=

WScript.Arguments.Count=1
WScript.Arguments(0)=aaa

testbat.bat “%LOCALAPPDATA%\CrashDumps”

%1 : as it is
%1=”C:\Users\skYjennr\AppData\Local\CrashDumps”

%~f1 : Fully quolified path
%~f1=C:\Users\skYjennr\AppData\Local\CrashDumps

%~d1 : Drive letter
%~d1=C:

%~p1 : Path only
%~p1=\Users\skYjennr\AppData\Local\

%~n1 : file Name without file extension
%~n1=CrashDumps

%~x1 : file eXtension only
%~x1=

%~s1 : Short 8.3 name
%~s1=C:\Users\skYjennr\AppData\Local\CRASHD~1

%~1 : removing any surrounding quotes (“)
%~1=C:\Users\skYjennr\AppData\Local\CrashDumps

%~a1 : Display the file attributes of %1
%~a1=d—-c—–

%~t1 : Display the date/time of %1
%~t1=2021/07/01 15:59

%~z1 : Display the file size of %1
%~z1=0

%~$PATH:1 : Search the PATH environment variable and expand %1 to the fully qualified name of the first match found
%~$PATH:1=C:\Users\skYjennr\AppData\Local\CrashDumps

WScript.Arguments.Count=1
WScript.Arguments(0)=C:\Users\skYjennr\AppData\Local\CrashDumps

testbat.bat “C:\aa bb cc\dd ee\my file.zip”

%1 : as it is
%1=”C:\aa bb cc\dd ee\my file.zip”

%~f1 : Fully quolified path
%~f1=C:\aa bb cc\dd ee\my file.zip

%~d1 : Drive letter
%~d1=C:

%~p1 : Path only
%~p1=\aa bb cc\dd ee\

%~n1 : file Name without file extension
%~n1=my file

%~x1 : file eXtension only
%~x1=.zip

%~s1 : Short 8.3 name
%~s1=C:\aa bb cc\dd ee\my file.zip

%~1 : removing any surrounding quotes (“)
%~1=C:\aa bb cc\dd ee\my file.zip

%~a1 : Display the file attributes of %1
%~a1=

%~t1 : Display the date/time of %1
%~t1=

%~z1 : Display the file size of %1
%~z1=

%~$PATH:1 : Search the PATH environment variable and expand %1 to the fully qualified name of the first match found
%~$PATH:1=

WScript.Arguments.Count=1
WScript.Arguments(0)=C:\aa bb cc\dd ee\my file.zip

testbat.bat notepad.exe

%1 : as it is
%1=notepad.exe

%~f1 : Fully quolified path
%~f1=C:\local\msys2\home\skYjennr\gitdev\bat\src\notepad.exe

%~d1 : Drive letter
%~d1=C:

%~p1 : Path only
%~p1=\local\msys2\home\skYjennr\gitdev\bat\src\

%~n1 : file Name without file extension
%~n1=notepad

%~x1 : file eXtension only
%~x1=.exe

%~s1 : Short 8.3 name
%~s1=C:\local\msys2\home\skYjennr\gitdev\bat\src\notepad.exe

%~1 : removing any surrounding quotes (“)
%~1=notepad.exe

%~a1 : Display the file attributes of %1
%~a1=

%~t1 : Display the date/time of %1
%~t1=

%~z1 : Display the file size of %1
%~z1=

%~$PATH:1 : Search the PATH environment variable and expand %1 to the fully qualified name of the first match found
%~$PATH:1=C:\Windows\System32\notepad.exe

WScript.Arguments.Count=1
WScript.Arguments(0)=notepad.exe

ubuntu20で固定IPにする

バージョン確認

Ubuntu20ではNetplanを使ってネットワーク設定を管理していて、実際の設定作業はNetworkmanagerかSystemd-networkdを使っている。前者はデスクトップ、後者はサーバで使われる。ただしcloud-initが有効になっていればそれを使う。設定作業を行うプログラムをレンダラーとかバックエンドと呼ぶ、デフォルトではSystemd-networkdでnetplanの設定ファイルでレンダラーを指定できる。レンダラーと設定を分けることで設定を一つにすることができる。

/etc/netplan/配下にIPの設定がある。
固定IPの場合は例えば以下のようになっている。

設定を反映するには以下のコマンドを使う

現在のIPを見るには以下のコマンド

Ubuntu Server建てた記録

サーバー移行手順

ubuntu-20.04.2-live-server-amd64.isoをダウンロードしてインストール
DiskのLVM管理は行わない
IPを固定に設定
サブネットマスクは192.168.3.0/24
IPアドレスは192.168.3.97に設定
ここはDHCPでは割り当てられないようになっている(ルーターで設定している)

途中でopen-sshを追加インストールする

ところで最近snapというパッケージ管理コマンドがあるが、これはUbuntuが開発しているパッケージマネージャでユニバーサルなパッケージマネージャを目指しているようだ。どのディストリでも使えるようにすることが目標らしい。

ubuntuインストールで running ‘curtin hook’がなかなか終わらない。
仕方ないのでrebootしてしまう。
とりあえず起動できた。

ssh-server

まずはsshサーバーを設定してパスワードで外部からログインできるようにする。(これは特に設定しなくてもできた)

githubにいろいろ置いてあるのでssh-keygenで公開鍵をgithubに登録する。

これで.ssh/id_rsa.pubに公開鍵ができたので、これをhttps://github.com/settings/keysに登録する。
これでgit cloneやpushができる。

bind

このサーバはウェブサーバにするのでローカルからドメインを参照したとき、ローカルのIPを返すようにbindをインストールして設定する。LAN内のPCからはこのサーバをnameserverに設定する。

/etc/bind/named.confに以下を追加

ここで追加した2つのファイルを追加する。

詳しくはわからないが、ambiesoft.comに対して192.168.3.97を返す。
再起動して試す

このコマンドは動くが、タブ補完が効かないうえに、–status-allの一覧にも表示されない。コマンドが変わったのか?(後記:bind9ではなくてnamedになっていた)(後記:さらにserviceではなくsystemctlを使うようだ)
bindが動いているかWindowsのコマンドプロンプトでチェック

多分動いている。
とおもったがforwarderが動いていない。google.comでも192.168.3.97を返している。
調べた結果dnssec-validation no;にしなければないないらしい。

古いマシンにはもう1つHDDがついているのでこれも移動する。まず新しいハードディスクに古いハードディスクの内容を丸々コピーしてから新しいマシンに接続してマウントする。
新しいマシンからHDDを見つけるにはlsblkやblkidコマンドを使う。

新しく追加されたディスクはsdbでUUIDはd81a8861-98d5-43a4-9924-d52b7f241887であることが分かったのでこれを/etc/fstabに追加する。

マウントする。

マウントできたのでリブートして確かめる。

mysqlをインストール

ハードディスクをコピーしてデータをそのまま使いたい。データは/theData/mysqlにある。
パーミッションがおかしいのでまず直す。

つぎにデフォルトのデータディレクトリ/var/lib/mysqlをシンボリックリンクにする。
$ cd /var/lib
$ sudo ln -s /theData/mysql mysql

起動
$ sudo service mysql start
Job for mysql.service failed because the control process exited with error code.
See “systemctl status mysql.service” and “journalctl -xe” for details.
$
apparmorがアクセスを拒否しているようなので設定を追加

無事起動した

phpmyadmin

いろいろ大変だった
やったこと

/etc/mysql/debian.cnfにdebian-sys-maintのパスワードが設定されている。
データをまるまるコピーしてるのでパスワードが合わないが、ここに古いパスワードを設定しても動かないので、mysqlの方のパスワードをかえる。
mysqlが8になっていろいろ変わったようでググったものでは動かなかった。
結局パスワードを変えるには以下

もともとこのユーザーがcaching_sha2_passwordで保存されてなければならなかったのか?プレーンパスワードだと設定できなかった。

いずれにしてもこれでhttp://192.168.3.97/phpmyadminにアクセスできて動いた。
セキュリティは後でまとめて行う。

apache2

phpmyadminのインストールでapacheもインストールされているので、あとは設定

Let’s encrypt

ウェブサイトの指示に従ったらできてた

samba

できた

vue

vue内部のaxiosで通信するところでエラーがでている。
原因はhttpsではなくhttpで通信していたからだった。

wordpress

ここに書いた。

wordpressで引っ越しするとき投稿内容に古いドメインが含まれる

wordpressで引っ越しするとき投稿内容に古いドメインが含まれる

wordpressでイメージなどを挿入するとそのURLがドメイン付きのフルパスになっていて、サイトを移動すると、古いドメインを参照してしまう。投稿の内容はmysqlの中にあるのでこれを変換する手段。

変換

mysqlのデータ構造はいろいろつくられているが変更する必要があるのはテーブルwp_optionswp_postsでいいと思う。よって以下のクエリーを実行して書き換える。

old.site.example.comが古いドメインでold.site.example.comが新しいドメイン。ディレクトリ階層が異なることは想定していない。

クエリーはやり直しがきかないのでバックアップ必須。

pythonでスクリプトのあるディレクトリにログファイルをつくる

__file__はスクリプトファイル、3.9以降では絶対パス、それ以前ではpythonに渡されたパスになるらしい。

realpathはシンボリックリンクなどを取り除いた絶対パスを返す。ほかにもabspathnormpathなどがある。

dirnameはディレクトリを返す。

splitextは拡張子で分割する。

この呼び出しにより、スクリプトと同じディレクトリにあって拡張子が.logのパスが得られる。

C#のRichTextBoxのフォントが途中で変わる

RichTextBoxのIMF_DUALFONTIMF_AUTOFONTフラグをクリアする。デフォルトでオンになっている。

参考:http://pineplanter.moo.jp/non-it-salaryman/2017/11/25/post-5255/

VMwareのゲストのWindows10にWSL2のubuntuがインストールできない

Error: 0x80370102 The virtual machine could not be started because a required feature is not installed.

このエラーはゲストのvmxに以下の設定を記述する。

Error: 0xc03a001a The requested operation could not be completed due to a virtual disk system limitation. Virtual hard disk files must be uncompressed and unencrypted and must not be sparse.

ubuntuをインストールするフォルダがntfs圧縮されているとインストールできない。以下のフォルダの圧縮を解除する。