wafuの技術

技術習得の努力メモです。

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

dlibを使った顔認識

dlibを使えば、顔画像の認識ができるようです。

 

ちょっと、試してみました。

 

○環境

 Windows10 32ビットで動作するようにします。

 ※訳あって32ビットです。

 

順番は、このとおりです。

1 dlibのダウンロード

2 cmakeで、ファイルの作成

3 VS2017を使用してコンパイル

 

※参考サイトです。

Dlib 最新版のインストール(Windows 上)

 

1 dlibのダウンロード

dlib C++ Library

 

2 cmakeで、ソリューションファイルを作成します。

 cmakeをダウンロード

 

https://cmake.org/

 

cmake-3.15.0-rc4-win32-x86.msi

をダウンロードして、インストールします。

 

3 cmake

展開した「dlib-19.17」フォルダ内で、

 cmakeを実行します。

 「Project.sln」ファイルができるので、VS2017で開いて、ビルドします。

 「dlib\Release」フォルダ内に、

 「dlib19.17.0_release_32bit_msvc1910.lib」ファイルが、できあがります。

 

4 exampleのファイルを作ってみます。

exampleフォルダ内で、

 cmakeを実行します。

 何を思ったのか

 cmake -G "Visual Studio 15 2017" -T host=x86で実行しました。

 ※適当です。

 

 これで、exampleフォルダ内に、「face_detection_ex.exe」とか、できます。

 

5 実行

できました。

 

f:id:wafu3000:20190715211600p:plain

 

LinuxのUEFIをMBRへ変換

Linuxのバックアップを使用して、UEFIのパソコンからMBRのパソコンへ交換をしました。

 

対象はdebianのバックアップ

使用したのは、

・バックアップを保存するUSBメモリ

・手元にあったUbuntuの起動ディスク(インストール媒体)

debianのインストール媒体を使用したかも(これだけでいいのかな)

あまり、ネット上に情報がみつからなかったので、手さぐりになりました。

 

 

手順概要

1 dumpコマンドでバックアップ

2 restoreコマンドでリストア

3 パッケージのインストール

4 MBRのインストール

 

1 dumpコマンドでバックアップ

  UEFIのマシンでdumpコマンドでバックアップを作成します。

  USBメモリを接続して、ext3でフォーマットしてマウント

  ext4の場合は、エラーになったので下記のコマンド

   sudo mount -t ext4 -o ro,noload /dev/sdb1 /mnt

 

2 パーティションの作成

  ubuntuの起動ディスクでパーティションの作成

 

3 restoreコマンドでリカバリ

  USBメモリと作成したパーティションをマウント

  リカバリ

 

4 fstabを修正 

 リカバリした/etc/fstabの内容は、UUIDで記述されているので、/dev/sda0のように修正をする。

 

5 パッケージのインストール

  ※忘れました。

   ubuntuのコマンドで実行したのか、debianのインストールCDで修復にしたかもしれません。

  apt-get install grub-pc

  grub-install /dev/sda

 

無事、MBRへ変更できました。