wafuの技術

勉強の記録です。

ocraのエラー

ocraで作成したexeファイルを実行しようとしたところ、

 

エラーが出ました。


ruby_builtin_dlls\libssp-0.dllが見つからないため、
コードの実行を続行できません。
プログラムを再インストールすると、この問題が解決する可能性が
あります。」

 

 

調べると、コマンドを変えると良いらしいです。

ocra sample.rb --dll ruby_builtin_dlls\libssp-0.dll

 

Rubyのインストールエラーへの対応(再び)

久しぶりにRubyを使っていましたが、sqlite3でエラーです。

昨年つまづいたのに、もう忘れていました。

手順です。

 

1 Ruby+msysをインストール

2 ウイルスバスターディレクトリを除外

3 ファイルの編集(不要かも)

 msys2のmsys64/etc/pacman.confの

 #XferCommand = /usr/bin/curl -L -C - -f -o %o %u
 #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u

 あれ、最終的にコメントアウトしていました。

4 msys2でアップデート

 ロックされていたら、ファイルの削除

 rm /var/lib/pacman/db.lck

 pacman -Syu

 署名がなければ署名の追加

 pacman-key --init

 pacman-key --lsign-key 9078f532

 

 ※msys2のページに記載がありました。

 https://www.msys2.org/news/

 

5 初期化とアップデート

 pacman-Syu

 

6 これで、sqlite3が使えるようになりました。 

 gem install sqlite3

 

 

○出ていたエラー

####エラー1

gpg: can't connect to the agent: IPC connect呼び出しに失敗しました

が繰り返し表示されます。

####エラー2

エラー: mingw32: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
エラー: mingw64: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
エラー: msys: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
:: パッケージデータベースの同期中...
エラー: mingw32 の更新に失敗しました (データベースをロックできません)
エラー: mingw64 の更新に失敗しました (データベースをロックできません)
エラー: msys の更新に失敗しました (データベースをロックできません)
エラー: 全てのデータベースの同期に失敗しました

 

 

current directory: C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2/ext/sqlite3
C:/Ruby26-x64/bin/ruby.exe -I C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0 -r ./siteconf20210207-3444-zson06.rb extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Install SQLite3 from http://www.sqlite.org/ first.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.

 

Pythonのimportの記述方法

PythonRubyC#C++を同時に勉強するのは失敗かな。

 

Python使用中に、よく出てくる「import」なぜか記述が違うので確認します。

 

1 通常のライブラリの追加

   import <モジュール名>

  記述する際に、モジュール名を記述する。

 例

  import hoge

  hoge.foo()

 

2 オブジェクトをインポート

  from <モジュール名> import <オブジェクト名>

  モジュール名の記述を省けます。

  例

  from hoge import foo

  foo()

 

3 その他

  〇別名をつけてインポート

  import <モジュール名> as <別名>

 

 

dlibを使用したプログラミング

dlibを使用したプログラミングに挑戦

 

以前にdlibを使用した顔認識を試しました。

当時はサンプルプログラムを実行させました。

今度は時間が空きましたがオリジナルプログラミングにチャレンジします。

 

と試してみたら、前回の環境では思うプログラミングができません。

 

○エラー内容
dlib19.17.0_release_32bit_msvc1910.lib(entropy_decoder_kernel_2.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出さ れました。値 'MD_DynamicRelease' が MT_StaticRelease の値 'face_landmark_detection_ex.obj' と一致しません。
dlib19.17.0_release_32bit_msvc1910.lib(base64_kernel_1.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MD_DynamicRelease' が MT_StaticRelease の値 'face_landmark_detection_ex.obj' と一致しません。
dlib19.17.0_release_32bit_msvc1910.lib(gui_core_kernel_1.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MD_DynamicRelease' が MT_StaticRelease の値 'face_landmark_detection_ex.obj' と一致しません。
dlib19.17.0_release_32bit_msvc1910.lib(canvas_drawing.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。 値 'MD_DynamicRelease' が MT_StaticRelease の値 'face_landmark_detection_ex.obj' と一致しません。

 

とりあえず、再作成をすることにしました。

CMAKEとdlibをダウンロードしてきます。

https://cmake.org/

http://dlib.net/

 

dlibはdlib-19.20にアップデートしています。

 

ここから長い戦いになりました。それは割愛します。

■実施したいこと

CPPのオリジナルプログラムを作成したいので、32ビットのスタティックライブラリがほしい。

結論を先に言うと、原因不明ですが成功しました。

 

■手順のメモ

対象フォルだ内で、cmakeコマンドを動作させて、VisualStudio用のSolutionファイルを作成するのですが、失敗です。

1 そのままCMAKEをすると64ビットになってしまいました。

  64ビットのエラー

  スタティックコンパイルする必要があるかもしれません。
dlib19.20.0_release_64bit_msvc1926.lib : warning LNK4272: ライブラリのコンピューターの種類 'x64' がターゲットのコンピュ ーターの種類' x86' と競合しています

 

  32ビットに指定します。

  コマンドを

  dlib-19.20を展開したディレクトの上で

  cmake -G "Visual Studio 16 2019" -A win32 -S dlib-19.20

  

2 CMAKE後に

  VisualStudioで、ソリューションを開いたら、dlibのコードの生成を

  マルチスレッド DLL(/MD)をMTに変更

  先にReleaseにしておきます。

 

これで、libファイルが完成します。

 

完成したlibファイルを使用してみます。

ヘッダファイルは、インクリュードファイルの存在するdlibフォルダを使用しました。結果は、エラーが出ました。

error LNK2019: 未解決の外部シンボル _USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2 が関数 "void __cdecl `dynamic initializer for 'dlib_check_not_configured_helper_variable''(void)" (??__Edlib_check_not_configured_helper_variable@@YAXXZ) で参照されました

 

調べた結果、ヘッダファイルの中のconfig.hとrevision.hをCMAKEを動作させたときに、

作成されたconfig.hとrevision.hで置換します。

 

これで、スタティックコンパイル可能なdlibとlibファイルが作られました。

 

時間があるときに正しいdlibの構築方法を確認したいと思います。

 

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;
}