wafu3000の技術

勉強の記録です。

Rubyのインストールエラーへの対応

久しぶりにRubyをインストールしたところ、エラーでインストールできません。

以前、あんなに簡単に入ったのに困りました。

 

インストールしたのは、RubyInstall+MSYS2です。

 

Rubyだけを入れた場合は、gemでsqlite3を入れると証明書関係のエラーが出るのでMSYS2は必要と思います。

 

■インストール対象

RubyInstallerからRuby+Devkit2.6.6-1(x64)です。

RubyInstaller for Windows

 

■手順

rubyinstaller-devkit-2.6.6-1-x64.exeを実行

 

■エラー内容

Rubyをインストール後、MSYS2のインストール画面が表示されます。

1 - MSYS2 base installation
2 - MSYS2 system update (optional)
3 - MSYS2 and MINGW development toolchain

Which components shall be installed? If unsure press ENTER [1,3]

1を選択

 

 

Which components shall be installed? If unsure press ENTER [1,3] 1

> sh -lc true
'C:\WINDOWS\system32\drivers\etc\hosts' -> '/etc/hosts'
'C:\WINDOWS\system32\drivers\etc\protocol' -> '/etc/protocols'
'C:\WINDOWS\system32\drivers\etc\services' -> '/etc/services'
'C:\WINDOWS\system32\drivers\etc\networks' -> '/etc/networks'
gpg: /etc/pacman.d/gnupg/trustdb.gpg: 信用データベースができました
gpg: 究極的に信用する鍵が見つかりません
gpg: starting migration from earlier GnuPG versions
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: error: GnuPG agent unusable. Please check that a GnuPG agent can be started.
gpg: migration aborted
gpg: starting migration from earlier GnuPG versions
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: error: GnuPG agent unusable. Please check that a GnuPG agent can be started.
gpg: migration aborted
gpg: Generating pacman keyring master key...
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: agent_genkey failed: エージェントが動いていません
gpg: key generation failed: エージェントが動いていません
gpg: Done
==> 信用データベースを更新...
gpg: 信用データベースの検査は、不要です
==> msys2.gpg からキーを追加...
gpg: starting migration from earlier GnuPG versions
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: error: GnuPG agent unusable. Please check that a GnuPG agent can be started.
gpg: migration aborted
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
==> キーリングの信頼されたキーに署名...
-> キーに署名 D55E7A6D7CE9BA1587C0ACACF40D263ECA25678A...
==> エラー: D55E7A6D7CE9BA1587C0ACACF40D263ECA25678A に署名できませんでした。
-> キーに署名 123D4D51A1793859C2BE916BBBE514E53E0D0813...
==> エラー: 123D4D51A1793859C2BE916BBBE514E53E0D0813 に署名できませんでした。
-> キーに署名 B91BCF3303284BF90CC043CA9F418C233E652008...
==> エラー: B91BCF3303284BF90CC043CA9F418C233E652008 に署名できませんでした。
-> キーに署名 9DD0D4217D75A33B896159E6DA7EF2ABAEEA755C...
==> エラー: 9DD0D4217D75A33B896159E6DA7EF2ABAEEA755C に署名できませんでした。
gpg: connecting dirmngr at '/etc/pacman.d/gnupg/S.dirmngr' failed: IPC connect呼び出しに失敗しました
gpg: 鍵サーバの更新に失敗しました: dirmngrがありません
==> エラー: キーサーバから特定のキーを更新できませんでした。
--> Installing /usr/share/info/assuan.info.gz ... done
--> Installing /usr/share/info/autoconf.info.gz ... done
--> Installing /usr/share/info/autoconf2.13.info.gz ... done
--> Installing /usr/share/info/autogen.info.gz ... done
--> Installing /usr/share/info/automake1.10.info.gz ... done
--> Installing /usr/share/info/automake1.11.info.gz ... done
--> Installing /usr/share/info/automake1.12.info.gz ... done
--> Installing /usr/share/info/automake1.13.info.gz ... done
--> Installing /usr/share/info/automake1.14.info.gz ... done
--> Installing /usr/share/info/automake1.15.info.gz ... done
--> Installing /usr/share/info/automake1.16.info.gz ... done
--> Installing /usr/share/info/automake1.6.info.gz ... done
--> Installing /usr/share/info/automake1.7.info.gz ... done
--> Installing /usr/share/info/automake1.8.info.gz ... done
--> Installing /usr/share/info/automake1.9.info.gz ... done
--> Installing /usr/share/info/automake-history1.12.info.gz ...install-info: warning: `/usr/share/info/automake-history1.12.info.gz' に Info dir 用の項目がありません
done
--> Installing /usr/share/info/automake-history1.13.info.gz ...install-info: warning: `/usr/share/info/automake-history1.13.info.gz' に Info dir 用の項目がありません
done
--> Installing /usr/share/info/automake-history1.14.info.gz ...install-info: warning: `/usr/share/info/automake-history1.14.info.gz' に Info dir 用の項目がありません
done
--> Installing /usr/share/info/automake-history1.15.info.gz ...install-info: warning: `/usr/share/info/automake-history1.15.info.gz' に Info dir 用の項目がありません
done
--> Installing /usr/share/info/automake-history1.16.info.gz ...install-info: warning: `/usr/share/info/automake-history1.16.info.gz' に Info dir 用の項目がありません
done
--> Installing /usr/share/info/autosprintf.info.gz ... done
--> Installing /usr/share/info/bash.info.gz ... done
--> Installing /usr/share/info/coreutils.info.gz ... done
--> Installing /usr/share/info/diffutils.info.gz ... done
--> Installing /usr/share/info/find.info.gz ... done
--> Installing /usr/share/info/find-maint.info.gz ... done
--> Installing /usr/share/info/flex.info.gz ... done
--> Installing /usr/share/info/gawk.info.gz ... done
--> Installing /usr/share/info/gawkinet.info.gz ... done
--> Installing /usr/share/info/gawkworkflow.info.gz ... done
--> Installing /usr/share/info/gcrypt.info.gz ... done
--> Installing /usr/share/info/gdbm.info.gz ... done
--> Installing /usr/share/info/gettext.info.gz ... done
--> Installing /usr/share/info/gmp.info.gz ... done
--> Installing /usr/share/info/gnupg.info.gz ... done
--> Installing /usr/share/info/gnutls.info.gz ... done
--> Installing /usr/share/info/gnutls-guile.info.gz ... done
--> Installing /usr/share/info/gpgme.info.gz ... done
--> Installing /usr/share/info/grep.info.gz ... done
--> Installing /usr/share/info/gzip.info.gz ... done
--> Installing /usr/share/info/history.info.gz ... done
--> Installing /usr/share/info/inetutils.info.gz ... done
--> Installing /usr/share/info/info-stnd.info.gz ... done
--> Installing /usr/share/info/ksba.info.gz ... done
--> Installing /usr/share/info/libffi.info.gz ... done
--> Installing /usr/share/info/libgomp.info.gz ... done
--> Installing /usr/share/info/libidn2.info.gz ... done
--> Installing /usr/share/info/libquadmath.info.gz ... done
--> Installing /usr/share/info/libtasn1.info.gz ... done
--> Installing /usr/share/info/libtool.info.gz ... done
--> Installing /usr/share/info/libunistring.info.gz ... done
--> Installing /usr/share/info/m4.info.gz ... done
--> Installing /usr/share/info/make.info.gz ... done
--> Installing /usr/share/info/mpfr.info.gz ... done
--> Installing /usr/share/info/nettle.info.gz ... done
--> Installing /usr/share/info/pinentry.info.gz ... done
--> Installing /usr/share/info/readline.info.gz ... done
--> Installing /usr/share/info/rluserman.info.gz ... done
--> Installing /usr/share/info/sed.info.gz ... done

 

入ったのかな?

たぶん、入っていないと思われます。

次に2のupdateです。

 

Which components shall be installed? If unsure press ENTER [] 2

> sh -lc true
MSYS2 seems to be properly installed
Remove catgets to avoid conflicts while update ...
> pacman -Rdd catgets libcatgets --noconfirm
エラー: mingw32: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: mingw64: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: msys: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: 対象が見つかりませんでした: catgets
エラー: 対象が見つかりませんでした: libcatgets
MSYS2 system update (optional) part 1 ...
> pacman -Syu --needed --noconfirm
エラー: mingw32: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: mingw64: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: msys: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
:: パッケージデータベースの同期中...
MSYS2 system update (optional) failed
Installation failed: pacman failed

 

入っていません。

この状態で、sqlite3のインストールを試みます。

gem install sqlite3
Fetching sqlite3-1.4.2.gem
Temporarily enhancing PATH for MSYS/MINGW...
Installing required msys2 packages: mingw-w64-x86_64-sqlite3
エラー: mingw32: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: mingw64: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: msys: "Alexey Pavlov (Alexpux) <alexpux@gmail.com>" の署名は信頼されていません
エラー: データベース 'mingw32' は無効です (無効または破損したデータベース (PGP 鍵))
エラー: データベース 'mingw64' は無効です (無効または破損したデータベース (PGP 鍵))
エラー: データベース 'msys' は無効です (無効または破損したデータベース (PGP 鍵))
pacman failed with the following output:

 

エラーが出て入りません。

1つめの対応

WindowsからRubyディレクトリ内のmsys2.exeを起動します。

どこかで、見つけてきた下記のコマンドを入力します。

$ pacman-key --init
$ pacman-key --lsign-key A47D45A1
$ rm /var/lib/pacman/db.lck
$ pacman -Syu

 

あれ、これもエラー?

$ pacman-key --init
gpg: starting migration from earlier GnuPG versions
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました
gpg: error: GnuPG agent unusable. Please check that a GnuPG agent can be started.
gpg: migration aborted
gpg: can't connect to the agent: IPC connect呼び出しに失敗しました

 

 

gpg-agentが動作していない。

もう、よくわかりません。

 

 調べたところ、セキュリティソフトのファイアウォールが原因のようです。

WindowsのFWとセキュリティソフト(ウイルスバスター)のFWを止めました。

(先日は問題がなかったのですが、今日はどうなのでしょう。)

 

 

msys2.exeを起動して、下記のコマンドで証明書を設定します。

(ネットにありましたが、大丈夫なのかな。今度はうまくいきました。)

$ pacman-key --init
$ pacman-key --lsign-key A47D45A1
$ rm /var/lib/pacman/db.lck
$ pacman -Syu

 

この設定のパーソナルファイアウォールの設定を変えるかもしくは、

C:\Ruby26-x64\msys64\etc ディレクトリににある。
pacman.conf ファイルを設定する方法もあります。

 

pacman.confファイルの19行目付近の

#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u

の先頭の#を外します。

 

pacmanコンパイル環境を入れます。

$ pacman -S gcc

$ pacman -S make

これで、終了です。

 

貴重な1日が・・・・

 

C++で、文字列の置換(string)

C++で、文字列の置換、string編です。

 

 

#include <iostream>
#include <string>

using namespace std;

bool MyReplaceString(string &str,const string &oldstr,const string &newstr);

int main(){
string str = "Hello ruby python perl ruby C++ ruby";

//rubyをRに置換
//文字列リテラルを部分文字列として渡しstringオブジェクトに変換
//ループして全部置換する
while(MyReplaceString(str,"ruby","R"))
cout << str << endl;
cout << endl;

//stringオブジェクトを明示的に渡す例
string oldstr("perl");
string newstr("java");
//perljavaに置換
MyReplaceString(str,oldstr,newstr);
cout << str << endl;

return 0;
}

//置換が行われたらtrueを返す。
bool MyReplaceString(string &str,const string &oldstr,const string &newstr){

string::size_type startidx;

startidx = str.find(oldstr);

if (startidx != string::npos){
str.replace(startidx,oldstr.size(),newstr);
return true;
}
return false;
}

C++で、文字列の置換(char)

C++のcharで、文字列の変換です。

標準関数にして欲しいです。

 

#include <iostream>
#include <cstring>

using namespace std;

bool MyReplace(char *str,int maxlen,const char *srcstr,const char *deststr);

int main(){
char str[80] = "ruby python C++ R言語 perl";

//「言語」を「language」に置換
while(MyReplace(str,79,"言語","language"))

//rubyRubyに置換
while(MyReplace(str,79,"ruby","Ruby"))

//文字列の削除
while(MyReplace(str,79,"C++",""))
cout << "置換後: " << str << endl;
return 0;
}

bool MyReplace(char *str,int maxlen,const char *srcstr,const char *deststr){

//終端のNULL文字は置換しない。
if (!*srcstr){
return false;
}
int len = strlen(str) - strlen(srcstr) + strlen(deststr);
if (len > maxlen){
return false;
}

//文字列の検索
char *p = strstr(str,srcstr);

//文字列を新しい文字列と置換
if (p){
memmove(p + strlen(deststr),p + strlen(srcstr),strlen(p) - strlen(srcstr) + 1);

//ここで、部分文字列を文字列にコピーする
strncpy(p,deststr,strlen(deststr));

return true;
}

//置換が行わなければfalseを返す
return false;
}

 

bool search_and_replace(char *str,int maxlen,const char *oldsubstr,const char *newsubstr){
//終端のNULL文字を置換しないようにする
if (!*oldsubstr){
return false;
}
int len = strlen(str) - strlen(oldsubstr) + strlen(newsubstr);
if (len > maxlen){
return false;
}
//文字列の中に指定した部分文字列があるか調べる
char *p = strstr(str,oldsubstr);
//文字列が見つかったら、新しい文字列と置き換える
if (p){
memmove(p + strlen(newsubstr),p + strlen(oldsubstr),strlen(p) - strlen(oldsubstr) + 1);
//ここで、部分文字列を文字列にコピーする
strncpy(p,newsubstr,strlen(newsubstr));

return true;
}
//置換が行わなければfalseを返す
return false;
}

RaspberryPIを使った無線LANコンバータ

部屋の環境を変更してから、インターネットのつながりが悪くなってしまいました。

Wi-Fiルータまで距離ができてしまったので、デスクトップパソコンには、USBのWi-Fiアダプタを使用して接続をして、ごまかしていましたが、このアダプタBuffaloのWLI-UC-G300P、かなり古いです。

そのせいか、よく切れていることがあるので、ついにアクセスポイントを購入。

 

しようと思いましたが、余っているRaspberryPIを使用して作ることにしました。

 

■概要

ポイントは、RaspberryPIを使ってもネットワークを分けることなく使いたいという要望です。

      Wi-FI           LAN

ルータ ーーーーーー RaspberryPI ーーーーー デスクトップ

  192.168.1.1 192.168.1.2  192.168.1.3  192.168.1.4

 

こんな感じかな。

 

■参考サイト

 http://rufas.manyoldmoon.com/blog/1604

 このサイトは親切です。ありがとうございます。

 

■使用機器

 RaspberryPI3

 

■構築

1 ネットワークの設定

 /etc/dhcpcd.conf に以下の記述を追加します。

interface wlan0
static ip_address=192.168.1.2/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

※今は、/etc/network/interface ファイルではないのですね。

 

2 IP forwardの設定

 /etc/rc.local に以下の記述の追加します。

 echo 1 > /proc/sys/net/ipv4/ip_forward

 

3 dhcpリレーエージェントのインストールと設定

 私は、dhcpは使っていないので、不要かもしれません。

 インストール

 sudo apt-get install dhcp-helper 

 設定

 sudo /etc/default/dhcp-helperファイルを編集します。

 DHCPHELPER_OPTS="-b wlan0"

 

4 Proxy ARPブリッジのインストールと設定

 インストール

 sudo apt-get install parprouted

 設定

 2でも出てきたrc.localに追加します。

 /etc/rc.localの2の記述の後に

 ip addr add 192.168.1.3 dev eth0

 parprouted wlan0 eth0

 

5 再起動

 

MACアドレスが同じになるのですね。なるほど

 

見事、動きました。

 

 

 

いまさら、C++の勉強(1)HelloWorld

今更ながら、C++の勉強をしていきます。

 

今でもC++なんですが、ほとんどCライクな内容です。

作成効率を考えれば、C++のほうが良いのかなと思って少しだけ勉強してみます。

C++の書籍を何冊か読んでみましたが難しいですね。

 

では、最初にHelloWorldです。

 

#include <iostream>

using namespace std;

int main()

{

    cout << "Hello World" << endl;

}

 

難しいことは考えずに進めます。

ONIONドメインでのサーバ公開

ONIONサイトの公開やってみました。

時間がないのでちゃちゃっとした内容です。

間違っているかもしれません。

 

○参考 Tor公式の導入の手引き

 https://2019.www.torproject.org/docs/debian.html.en#ubuntu

 

Ubuntuユニバースのパッケージは使用せずに
・apt install apt-transport-https
でパッケージを追加する方法です。

 

■構築

 今回使用するのは、debianです

 Tor公式の導入手引きのとおり進めます。

 

1 リポジトリにtorprojectを追加

 /etc/apt/sources.listに記載
 deb https://deb.torproject.org/torproject.org buster main
 deb-src https://deb.torproject.org/torproject.org buster main

2 gpg keyによる署名

Then add the gpg key used to sign the packages by running the following commands at your command prompt:
# curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import

# gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -

3 torインストール

 コマンド
 apt update
 apt install tor deb.torproject.org-keyring

4 torの設定
 Tor公式の設定の手引き
 https://2019.www.torproject.org/docs/tor-onion-service

 

(1) .hidden service のディレクトリパスと使用ポートの設定
 - /etc/tor/torrc の72,73行目のコメントアウトを外します。
 - ここで指定するディレクトリは任意です。

  (ディレクトリのパーミッションは700にすること)
  /etc/tor/torrcファイルを書き換えます。


  HiddenServiceDir /var/lib/tor/hidden_service/
  HiddenServicePort 80 127.0.0.1:8080

 

  普通のサーバを指定しても、通信できるかもしれません。

 

(2)torのインストール時にdebian-torというユーザが新規に追加されています。

   apt-get install sudo

   debianには、sudoコマンドがなかったのd、インストールしました。

 

(3)torの実行
   sudo -u debian-tor tor

 

BitmapDecoderでサポートしている画像ファイルの一覧表示

BitmapDecoderを使用してみました。

 

このサイトのソースで、サポートしている画像がわかるようです。

c# - BitmapDecoder がサポートしている画像ファイルの種類(拡張子)を全て取得したい (.heicとか) - スタック・オーバーフロー

 

コンパイルするとエラーが表示されます。

 

note.obj : error LNK2019: 未解決の外部シンボル __imp__CoUninitialize@0 が関数 "public: __thiscall `int __cdecl main(void)'::`2'::Com::~Com(void)" (??1Com@?1??main@@YAHXZ@QAE@XZ) で参照されました。
note.obj : error LNK2019: 未解決の外部シンボル __imp__CoCreateInstance@20 が関数 _main で参照されました。
note.obj : error LNK2019: 未解決の外部シンボル __imp__CoInitialize@4 が関数 "public: __thiscall `int __cdecl main(void)'::`2'::Com::Com(void)" (??0Com@?1??main@@YAHXZ@QAE@XZ) で参照されました。
note.exe : fatal error LNK1120: 3 件の未解決の外部参照

 

■解決

#pragma comment(lib,"ole32.lib ")

を追加します。

 

結構サポートしていますね。

BMP Decoder: .bmp,.dib,.rle
GIF Decoder: .gif
ICO Decoder: .ico,.icon
CUR Decoder: .cur
JPEG Decoder: .jpeg,.jpe,.jpg,.jfif,.exif
PNG Decoder: .png
TIFF Decoder: .tiff,.tif
DNG Decoder: .dng
WMPhoto Decoder: .wdp,.jxr
DDS Decoder: .dds
Microsoft HEIF Decoder: .heic,.heif,.avci,.heics,.heifs,.avcs
Microsoft Webp Decoder: .webp
Microsoft Camera Raw Decoder: .ARW,.CR2,.CRW,.ERF,.KDC,.MRW,.NEF,.NRW,.ORF,.PEF,.RAF,.RAW,.RW2,.RWL,.SR2,.SRW,.DNG