備忘録

備忘録

C++17でstd::mapをforループさせる方法

Ⅰ. はじめに

タイトルの通り「C++17でstd::mapをforループさせる方法」です。

Ⅱ. やり方

1. サンプルプログラム
std::map<int, int> items;

items.insert(std::make_pair(1, 1));
items.insert(std::make_pair(2, 2));
items.insert(std::make_pair(3, 3));

for (const auto& [key, value] : items)
{
    std::cout << key << "," << value << std::endl;
}

実行結果

1,1
2,2
3,3

C++でSHA256ハッシュを計算する方法

Ⅰ. はじめに

タイトルの通り「C++でSHA256ハッシュを計算する方法」です。

Ⅱ. やり方

1. 必要なパッケージをインストールする
vcpkg install botan
2. サンプルプログラムを書く
#include <botan/hash.h>
// #include <botan/hex.h>
#include <botan/base64.h>
#include <iostream>

std::string sha256(std::string str) {
    std::unique_ptr<Botan::HashFunction> hash(Botan::HashFunction::create("SHA-256"));
    hash->update(str);
    // return Botan::hex_encode(hash->final());
    return Botan::base64_encode(hash->final());
}

int main() {
    std::string str("helloworld");
    std::cout << sha256(str) << std::endl;
}

実行結果

k2oYXKqiZrucvpgengXLeM1zKwsygOuURBK7b4+PB68=

C#で共有メモリを利用する方法

Ⅰ. はじめに

タイトルの通り「C#で共有メモリを利用する方法」です。

以下記事の方法でC++でも同じメモリ空間を利用できます。
https://kagasu.hatenablog.com/entry/2017/05/03/003922

Ⅱ. やり方

1. サンプルプログラムを書く
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Data
{
  public int Value;
}

class Program
{
  static void Main(string[] args)
  {
    using var memoryMappedFile = MemoryMappedFile.CreateOrOpen("test001", (uint)Marshal.SizeOf(typeof(Data)));
    using var accessor = memoryMappedFile.CreateViewAccessor();
    var data = new Data();

    // 書き込む
    data.Value = 100;
    accessor.Write(0, ref data);

    // 読み込む
    accessor.Read(0, out data);
  }
}

実行結果

省略

pproxyを利用してポートごとに利用するproxyサーバを変更する方法

Ⅰ. はじめに

タイトルの通り「pproxyを利用してポートごとに利用するproxyサーバを変更する方法」です。
f:id:kagasu:20210920133528p:plain

Ⅱ. やり方

1. サンプルプログラム
import asyncio
import pproxy

basePort = 8000
loop = asyncio.get_event_loop()

def getProxies():
  return [
    '10.0.0.1:1080',
    '10.0.0.2:1080',
    '10.0.0.3:1080',
  ]

def startProxyServer(proxies):
  for i, x in enumerate(proxies):
    server = pproxy.Server(f'http+socks5://0.0.0.0:{basePort + i}')
    remote = pproxy.Connection(f'socks5://{x}')
    handler = loop.run_until_complete(server.start_server(dict(rserver=[remote])))
    print(f'socks5://0.0.0.0:{basePort + i} -> socks5://{x}')

if __name__ == '__main__':
  proxies = getProxies()
  startProxyServer(proxies)

  try:
    loop.run_forever()
  except KeyboardInterrupt:
    print('exit!')

  loop.close()

実行結果

省略

Postfixで任意のヘッダを削除する方法

Ⅰ. はじめに

タイトルの通り「Postfixで任意のヘッダを削除する方法」です。

Ⅱ. 前提条件

  • Postfixがpcre有効状態としてコンパイルされている事
    ※以下コマンドを実行してpcreと表示されればOK
$ postconf -m | grep pcre
pcre

Ⅲ. やり方

1. postfix-pcreをインストールする
apt install postfix-pcre
2. dynamicsmap.cfの設定を確認する

postfix-pcreをインストールすると自動的に設定されます。

$ cat /etc/postfix/dynamicmaps.cf | grep pcre
pcre	postfix-pcre.so	dict_pcre_open	
3. Postfixの設定を変更する

/etc/postfix/main.cf

smtp_header_checks = pcre:/etc/postfix/smtp_header_checks

/etc/postfix/smtp_header_checks

# Received ヘッダを消す
/^Received:/ IGNORE

# X-Originating-IP ヘッダを消す
# /^X-Originating-IP:/ IGNORE
4. Postfixを再起動する
systemctl restart postfix

実行結果

Received ヘッダが消えた

Before f:id:kagasu:20210718014054p:plain
After f:id:kagasu:20210718014100p:plain