Author Archives: admin

ファイルの特定の行を変更したコミットの差分を見る

git blame

これは、funcs.cというファイルの814行目から10行の部分を変更したのは誰なのかを表示する。

git log -L

git log -Lを使うには1.8.4以上が必要らしい。

コミットメッセージも表示してくれる。
変更が81f15c2b0d6e9eaf524ff7bab37426c21af75fb7によることは分かったので、これと一個前との差分を見る。

差分

これでコミット全体の差分が見れた。

この差分をgithubで見るにはhttps://github.com/file/file/commit/81f15みたいなURLになる。

参考

https://stackoverflow.com/a/19757493 made by Matt McClure CC BY-SA 3.0

bashで自分のグローバルIPを取得する

現在のインターネット環境では自分のPCのIPはプライベートIPの場合が多いので、自分のPCにはグローバルIPは設定されていない。グローバルIPが設定されているのはその先のルーターなのでルーターから取得することもできるだろうが、ルーターはパスワードが必要なのでここではスルー。

http://checkip.dyndns.com/にアクセスするとアクセス元つまり自分のIPを返してくれる。よってここからIPを取得すればいい

w3mはテキストブラウザ、-dumpは出力して終わる。-oはマッチした部分を返す。-PはPerl互換の正規表現。\dは数字にヒット+は連続の数字にヒット、\..をエスケープ。

なおこのスクリプトだとw3mがIPをいくつも返したとき全部取得してしまうので最初の1つだけを取得したい場合は head -n 1などをさらにパイプでつなげる。

タスクバー

下固定。いつもは上に配置して使っているので慣れるまで大変。

クイックローンチがない

クイックローンチ(C:\Users\User\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch)にショートカットをたくさんおいて使っていたのでこれがなくなると大変になる。

常にグルーピング?

グルーピングしたくない

IE

IEがないが、IEのコントロールはあるようなのでIEをつかった既存のアプリは動く。バージョンは以下。新しくなっているかは不明。ちなみにIEを起動するとEdgeが起動する。

デスクトップの右クリック

デスクトップの右クリックメニューが変わった。

いままでのメニューは「Show more options」で表示できる。

結論

とくに嬉しいことはなかった。というか使いづらい。さらにモバイルに近づけようとしているようだ。バージョンが上がるごとにWindowsがつかいずらくなっている。

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のパスが得られる。