備忘録

備忘録

C#でWindows 10のOCRを利用する方法

Ⅰ. はじめに

タイトルの通り「C#Windows 10のOCRを利用する方法」です。

Ⅱ. 環境

Ⅱ. やり方

1. csprojを編集してTargetFrameworkを変更する
<TargetFramework>net5.0-windows10.0.18362.0</TargetFramework>
2. サンプルプログラムを書く

123.png
f:id:kagasu:20210614105758p:plain

Program.cs

using System;
using System.Threading.Tasks;
using Windows.Graphics.Imaging;
using Windows.Media.Ocr;
using Windows.Storage;
using Windows.Storage.Streams;

namespace OcrTest
{
  class Program
  {
    static async Task Main(string[] args)
    {
      var ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();

      // ローカルファイルの場合
      var storageFile = await StorageFile.GetFileFromPathAsync("C:\\123.png");
      using var iRandomAccessStream = await RandomAccessStreamReference.CreateFromFile(storageFile).OpenReadAsync();

      // URLの場合
      // var uri = new Uri("https://i.imgur.com/LkJ8ZEJ.png");
      // using var iRandomAccessStream = await RandomAccessStreamReference.CreateFromUri(uri).OpenReadAsync();

      var bitmapDecoder = await BitmapDecoder.CreateAsync(iRandomAccessStream);
      using var softwareBitmap = await bitmapDecoder.GetSoftwareBitmapAsync();

      var result = await ocrEngine.RecognizeAsync(softwareBitmap);
      Console.WriteLine(result.Text);
    }
  }
}

実行結果

123

類似記事

C#でTesseractを利用する方法

Ⅰ. はじめに

タイトルの通り「C#でTesseractを利用する方法」です。

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
dotnet add package Tesseract --version 5.2.0
2. 学習済みデータを任意のディレクトリに保存する

例. C:\Tesseract\eng_fast.traineddata

3. サンプルプログラムを書く

123.png

Program.cs

using Tesseract;

using var engine = new TesseractEngine("C:\\Tesseract", "eng_fast");
engine.SetVariable("tessedit_char_whitelist", "0123456789");
engine.SetDebugVariable("debug_file", "null");

var page = engine.Process(Pix.LoadFromFile("C:\\123.png"));
Console.WriteLine(page.GetText());

実行結果

123

類似記事

node-fetchでproxyを設定する方法

Ⅰ. はじめに

タイトルの通り「node-fetchでproxyを設定する方法」です。

Ⅱ. やり方

1. 必要なパッケージをインストールする
npm install node-fetch
npm install http-proxy-agent
npm install https-proxy-agent
2. サンプルプログラムを書く

index.js

const fetch = require('node-fetch');
// const HttpProxyAgent = require('http-proxy-agent');
const HttpsProxyAgent = require('https-proxy-agent');

(async () => {
  // process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'

  const proxyAgent = new HttpsProxyAgent('http://10.0.0.2:3128')
  // const proxyAgent = new HttpsProxyAgent('http://username:password@10.0.0.2:3128')
  const response = await fetch('https://api.ipify.org/?format=json', { agent: proxyAgent })
  const json = await response.json()
  console.log(json)
})()

実行結果

$ node index.js
{ ip: '107.x.x.x' }

PHPでワンタイムパスワードを生成する方法

Ⅰ. はじめに

タイトルの通り「PHPワンタイムパスワードを生成する方法」です。

Ⅱ. やり方

1. サンプルプログラムを書く

index.php

<?php
require_once "vendor/autoload.php";

// composer require spomky-labs/otphp
use OTPHP\TOTP;

$secret = 'JDDK4U6G3BJLEZ7Y';
$otp = TOTP::create($secret);
echo $otp->now();

実行結果

ワンタイムパスワードの生成に成功した。Authyの値と一致している。
f:id:kagasu:20210612081940p:plain

C#で非同期かつ優先度考慮可能なQueueを利用する方法

Ⅰ. はじめに

タイトルの通り「C#で非同期かつ優先度考慮可能なQueueを利用する方法」です。
非同期ではないPriorityQueueは.NET6で実装されました

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
dotnet add package ConcurrentDataStructures --version 0.2.0
2. サンプルプログラムを書く

※簡単の為非同期らしい動きは省きます

using DataStructures;

namespace Test
{
  class Program
  {
    class MyQueue : IComparable<MyQueue>
    {
      public int Id { get; set; }
      public int Priority { get; set; }

      public int CompareTo(MyQueue x)
      {
        // Priorityが大きい順に取得出来るようにする
        return Priority - x.Priority;
      }
    }

    static void Main(string[] args)
    {
      var queue = new ConcurrentPriorityQueue<MyQueue>();
      queue.TryAdd(new MyQueue { Id = 1, Priority = 100 });
      queue.TryAdd(new MyQueue { Id = 2, Priority = 999 });
      queue.TryAdd(new MyQueue { Id = 3, Priority = 200 });

      while (true)
      {
        if (queue.TryTake(out var x))
        {
          Console.WriteLine($"Id: {x.Id}, Priority: {x.Priority}");
        }
        else
        {
          break;
        }
      }
    }
  }
}

実行結果

Id: 2, Priority: 999
Id: 3, Priority: 200
Id: 1, Priority: 100

留意点(2022/08/18追記)

  • 以下プログラムは途中でID5を挿入する。このときID2よりもID5が先に取り出される。
    つまり、CompareToの条件が最優先される。
    (Queueの動きとして妥当では無い気もしますが…)
using DataStructures;
using System;

namespace Test
{
  class Program
  {
    class MyQueue : IComparable<MyQueue>
    {
      public int Id { get; set; }
      public int Priority { get; set; }

      public int CompareTo(MyQueue x)
      {
        // Priorityが大きい順に取得出来るようにする
        return Priority - x.Priority;
      }
    }

    static void Main(string[] args)
    {
      var queue = new ConcurrentPriorityQueue<MyQueue>();
      queue.TryAdd(new MyQueue { Id = 1, Priority = 100 });
      queue.TryAdd(new MyQueue { Id = 2, Priority = 100 });
      queue.TryAdd(new MyQueue { Id = 3, Priority = 999 });
      queue.TryAdd(new MyQueue { Id = 4, Priority = 200 });

      while (true)
      {
        if (queue.TryTake(out var x))
        {
          Console.WriteLine($"Id: {x.Id}, Priority: {x.Priority}");

          if (x.Id == 4)
          {
            queue.TryAdd(new MyQueue { Id = 5, Priority = 100 });
          }
        }
        else
        {
          break;
        }
      }
    }
  }
}