git aaa
と書いた場合、git-aaaが$PATHにあり、なおかつ実行属性がつけられている必要がある。
1 2 |
$ which git-aaa $ chmod +x git-aaa |
git aaa
と書いた場合、git-aaaが$PATHにあり、なおかつ実行属性がつけられている必要がある。
1 2 |
$ which git-aaa $ chmod +x git-aaa |
AcroCleanerを実行して一回全部削除する
Offline installerからインストールする
RESTがいつもわからなくなるので覚書
HTTPプロトコルで単純なデータのやりとりのこと
ステートレスとはURIのレスポンスがいつも一意で他の情報によってレスポンスが変わったりしないこと。よってクッキーが関わるとステートレスではない。
クライアントからは見えないところで最適化できるようにするためにキャッシュできるようになってること。URIにセッション情報を含めるとできなくなるのでだめ。セッション情報とは個別のクライアントに設定される値のこと
RESTはSOAPなどとは違ってプロトコルではなくざっくりとしたスタイルのこと
クライアントは難しいことを考える必要なく簡単にアクセスできる。
ソリューションを開くと以下のようなメッセージボックスでエラーが出て、ビルドができない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
--------------------------- Microsoft Visual Studio --------------------------- The 'Global Hub Client Package' package did not load correctly. The problem may have been caused by a configuration change or by the installation of another extension. You can get more information by examining the file 'C:\Users\xxxxxx\AppData\Roaming\Microsoft\VisualStudio\16.0_3219468f\ActivityLog.xml'. Restarting Visual Studio could help resolve this issue. Continue to show this error message? --------------------------- Yes No --------------------------- |
おかしな環境変数が設定されているとこうなる。msys2などから起動した場合や、msys2経由のファイルマネージャから起動した場合は環境変数を引き継ぐと思うので、引き継がないようにする。
大変
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using namespace System; using namespace System::Collections::Generic; int main() { List<int> intlist; intlist.Add(2); intlist.Add(1); intlist.Add(7); intlist.Sort(); // 1,2,7 for each (int i in intlist) Console::WriteLine(i); intlist.Reverse(); for each (int i in intlist) Console::WriteLine(i); return 0; } |
これは簡単。しかし要素がクラスだと難しい
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using namespace System; using namespace System::Collections::Generic; typedef KeyValuePair<String^, int> KVP; ref class MyComparer : public System::Collections::Generic::IComparer<KVP> { public: enum class SORTBY { KEY, VALUE, }; private: SORTBY sortby_; public: MyComparer(SORTBY sortby) : sortby_(sortby){} virtual int Compare(KVP kvp1, KVP kvp2) { switch (sortby_) { case SORTBY::KEY: return kvp1.Key->CompareTo(kvp2.Key); case SORTBY::VALUE: return kvp1.Value.CompareTo(kvp2.Value); } return 0; } }; int main() { List<KVP> silist; silist.Add(KVP("x", 1)); silist.Add(KVP("y", 2)); silist.Add(KVP("z", 300)); silist.Add(KVP("a", 400)); silist.Add(KVP("b", 500)); silist.Add(KVP("c", 50)); // Exception! // silist.Sort(); // Sort by key MyComparer compByKey(MyComparer::SORTBY::KEY); silist.Sort(% compByKey); for each (KVP kvp in silist) Console::WriteLine(kvp.Key + "=" + kvp.Value); Console::WriteLine(); // Sort by value MyComparer compByValue(MyComparer::SORTBY::VALUE); silist.Sort(% compByValue); for each (KVP kvp in silist) Console::WriteLine(kvp.Key + "=" + kvp.Value); return 0; } |
SortはインターフェースIComparerを引数にとるので、まずはこれを継承するクラスをつくりその仮想関数Compareで比較をする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using namespace System; using namespace System::Collections::Generic; ref class MyClass { private: String^ s1_; public: MyClass(String^ s1) : s1_(s1) {} public: static int Compare(MyClass^ m1, MyClass^ m2) { return String::Compare(m1->s1_, m2->s1_); } virtual String^ ToString() override { return s1_; } }; ref class MyClassComparer : public System::Collections::Generic::IComparer<MyClass^> { public: virtual int Compare(MyClass^ mc1, MyClass^ mc2) { return MyClass::Compare(mc1, mc2); } }; int main() { List<MyClass^> mclist; mclist.Add(gcnew MyClass("fjwoeijf")); mclist.Add(gcnew MyClass("bzz32r")); mclist.Add(gcnew MyClass("+fwe3vv2r")); mclist.Add(gcnew MyClass("a32432faf")); mclist.Add(gcnew MyClass("3ff")); mclist.Add(gcnew MyClass("-fw654f")); // Exception! // mclist.Sort(); mclist.Sort(gcnew MyClassComparer()); // Sort by key for each (MyClass ^ mc in mclist) Console::WriteLine(mc->ToString()); return 0; } |
自分のクラスMyClassにstatic int Compareを定義する。次にMyClassComparerも定義する。こうしないでMyClassをIComparerから派生させると、Sortの際に自分のクラスを渡すことになってなんかおかしい感じになる。
SHGetFileInfoを使う
1 2 3 4 5 6 7 8 9 10 11 |
SHFILEINFO sfi = { 0 }; if (0 == SHGetFileInfo(strFullPath_, NULL, &sfi, sizeof(sfi), SHGFI_TYPENAME)) { // Error DWORD dwLE = GetLastError(); } strTypeName_ = sfi.szTypeName; |
サーバー移行手順
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サーバーを設定してパスワードで外部からログインできるようにする。(これは特に設定しなくてもできた)
1 2 |
$ ssh-keygen -t rsa $ cat .ssh/id_rsa.pub |
これで.ssh/id_rsa.pubに公開鍵ができたので、これをhttps://github.com/settings/keysに登録する。
これでgit cloneやpushができる。
このサーバはウェブサーバにするのでローカルからドメインを参照したとき、ローカルのIPを返すようにbindをインストールして設定する。LAN内のPCからはこのサーバをnameserverに設定する。
1 |
$ sudo apt install bind9 |
/etc/bind/named.confに以下を追加
1 2 3 4 5 6 7 8 9 10 |
zone "ambiesoft.mooo.com" IN { type master; file "/etc/bind/ambiesoft.mooo.com.zone"; allow-update { none; }; }; zone "ambiesoft.com" IN { type master; file "/etc/bind/ambiesoft.com.zone"; allow-update { none; }; }; |
ここで追加した2つのファイルを追加する。
1 2 3 4 5 6 7 8 9 10 11 |
$TTL 86400 @ IN SOA ambiesoft.com. root.ambiesoft.com.( 2004031901 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS ambiesoft.com. IN MX 10 ambiesoft.com. @ IN A 192.168.3.97 * IN A 192.168.3.97 |
詳しくはわからないが、ambiesoft.comに対して192.168.3.97を返す。
再起動して試す
1 |
$ sudo service bind9 restart |
このコマンドは動くが、タブ補完が効かないうえに、–status-allの一覧にも表示されない。コマンドが変わったのか?(後記:bind9ではなくてnamedになっていた)(後記:さらにserviceではなくsystemctlを使うようだ)
bindが動いているかWindowsのコマンドプロンプトでチェック
1 2 3 4 5 6 |
>nslookup ambiesoft.com 192.168.3.97 Server: UnKnown Address: 192.168.3.97 Name: ambiesoft.com Address: 192.168.3.97 |
多分動いている。
とおもったがforwarderが動いていない。google.comでも192.168.3.97を返している。
調べた結果dnssec-validation no;にしなければないないらしい。
古いマシンにはもう1つHDDがついているのでこれも移動する。まず新しいハードディスクに古いハードディスクの内容を丸々コピーしてから新しいマシンに接続してマウントする。
新しいマシンからHDDを見つけるにはlsblkやblkidコマンドを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 55.4M 1 loop /snap/core18/1944 loop1 7:1 0 69.9M 1 loop /snap/lxd/19188 loop2 7:2 0 31.1M 1 loop /snap/snapd/10707 sda 8:0 0 40G 0 disk tqsda1 8:1 0 1M 0 part mqsda2 8:2 0 40G 0 part / sdb 8:16 0 20G 0 disk mqsdb1 8:17 0 20G 0 part sr0 11:0 1 1024M 0 rom ebisu@minpsrv ~$ blkid /dev/sda2: UUID="cc21c814-e341-47d5-a52e-b5a663623ab3" TYPE="ext4" PARTUUID="9cffd304-56a7-4676-9d3d-2e8141c5adce" /dev/sdb1: UUID="d81a8861-98d5-43a4-9924-d52b7f241887" SEC_TYPE="ext2" TYPE="ext3" PARTUUID="0005c4f8-01" $ |
新しく追加されたディスクはsdbでUUIDはd81a8861-98d5-43a4-9924-d52b7f241887であることが分かったのでこれを/etc/fstabに追加する。
1 |
/dev/disk/by-uuid/d81a8861-98d5-43a4-9924-d52b7f241887 /theData ext3 defaults 0 0 |
マウントする。
1 2 3 4 5 6 |
$ sudo mkdir /theData $ sudo mount -av / : ignored /theData : successfully mounted none : ignored $ |
マウントできたのでリブートして確かめる。
1 |
$ sudo apt install mysql-server |
ハードディスクをコピーしてデータをそのまま使いたい。データは/theData/mysqlにある。
パーミッションがおかしいのでまず直す。
1 |
$ sudo chown -R mysql: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がアクセスを拒否しているようなので設定を追加
1 2 3 4 5 |
# Allow data dir access /var/lib/mysql/ r, /var/lib/mysql/** rwk, /theData/mysql/ r, /theData/mysql/** rwk, |
無事起動した
いろいろ大変だった
やったこと
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
156 sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl 157 sudo mysql 158 sudo mysql -u root 159 sudo mysql -u root -p 160 sudo apt install phpmyadmin 161 cd /etc/mysql/ 162 less debian.cnf 163 sudo less debian.cnf 164 sudo vi debian.cnf 165 sudo service mysql restart 166 his 167 sudo apt install phpmyadmin 168 ls 169 sudo less debian.cnf 170 his 171 sudo apt install phpmyadmin 172 sudo phpenmod mbstring 173 sudo systemctl restart apache2 174 his |
/etc/mysql/debian.cnfにdebian-sys-maintのパスワードが設定されている。
データをまるまるコピーしてるのでパスワードが合わないが、ここに古いパスワードを設定しても動かないので、mysqlの方のパスワードをかえる。
mysqlが8になっていろいろ変わったようでググったものでは動かなかった。
結局パスワードを変えるには以下
1 |
ALTER USER 'debian-sys-maint'@'localhost' IDENTIFIED WITH caching_sha2_password BY '<password>'; |
もともとこのユーザーがcaching_sha2_passwordで保存されてなければならなかったのか?プレーンパスワードだと設定できなかった。
いずれにしてもこれでhttp://192.168.3.97/phpmyadminにアクセスできて動いた。
セキュリティは後でまとめて行う。
phpmyadminのインストールでapacheもインストールされているので、あとは設定
ウェブサイトの指示に従ったらできてた
できた
vue内部のaxiosで通信するところでエラーがでている。
原因はhttpsではなくhttpで通信していたからだった。
ここに書いた。
sqliteのサイトからsqlite-tools-win32をダウンロードして解凍してsqlite3.exeを取り出す。
コマンドラインで以下のように実行。
1 |
sqlite3 broken.db ".recover" | sqlite3 new.db |
理由は不明
バグなのか、ソリューション内のプロジェクトの並び方に影響するのか?