wafuの技術

勉強の記録です。

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

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;

}

 

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