瀏覽分類:

心得筆記

[Python] Windows 下安裝 pyopenssl 時出現錯誤

緊接著 [Python] Windows 下安裝 pycrypto 時出現錯誤 又遇到個問題是在安裝 pyopenssl 的時候噴了下面的錯誤

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\bin\HostX86\x86\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\git\App\venv\include -IC:\Users\lex_xu\AppData\Local\Programs\Python\Python38-32\include -IC:\Users\lex_xu\AppData\Local\Programs\Python\Python38-32\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /Tcbuild\temp.win32-3.8\Release\_openssl.c /Fobuild\temp.win32-3.8\Release\build\temp.win32-3.8\Release\_openssl.obj
  _openssl.c
  build\temp.win32-3.8\Release\_openssl.c(546): fatal error C1083: Cannot open include file: 'openssl/opensslv.h': No such file or directory
  error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Tools\\MSVC\\14.24.28314\\bin\\HostX86\\x86\\cl.exe' failed with exit status 2
  
  ----------------------------------------
  Running setup.py clean for cryptography
Failed to build cryptography

  Failed building wheel for cryptography
Could not build wheels for cryptography which use PEP 517 and cannot be installed directly

閱讀更多

       

[C#][TPL] 自定義 TaskScheuler 管理執行續

最近利用 Task 撰寫非同步的程式時碰到了許多未釐清的用法,這邊筆記一下自定義  TaskScheuler 的方法。

public class StaticThreadTaskScheduler : TaskScheduler, IDisposable
{
    private readonly List<Thread> _threads = new List<Thread>();
    private readonly BlockingCollection<Task> _tasks = new BlockingCollection<Task>();
    private readonly AutoResetEvent _lockObj = new AutoResetEvent(true);

    public new int MaximumConcurrencyLevel { get; private set; }

    public StaticThreadTaskScheduler() : this(Environment.ProcessorCount) { }

    public StaticThreadTaskScheduler(int maximumConcurrencyLevel)
    {
        MaximumConcurrencyLevel = maximumConcurrencyLevel;
        initalize();
    }

    protected override IEnumerable<Task> GetScheduledTasks()
    {
        return _tasks;
    }

    protected override void QueueTask(Task task)
    {
        if (task != null)
        {
            _lockObj.WaitOne();
            _tasks.Add(task);
            _lockObj.Set();
        }
    }

    protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
    {
        return false;
    }

    private void initalize()
    {
        for (int i = 0; i < MaximumConcurrencyLevel; i++)
        {
            Thread thread = new Thread(execute);
            thread.IsBackground = true;
            thread.Start();
            _threads.Add(thread);
        }
    }

    private void execute()
    {
        foreach (var task in _tasks.GetConsumingEnumerable())
        {
            TryExecuteTask(task);
        }
    }

    #region IDisposable Support

    private bool _disposedValue = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposedValue)
        {
            if (disposing)
            {
                _lockObj.WaitOne();
                foreach (var thread in _threads)
                {
                    thread.Join();
                }
                _threads.Clear();
                _tasks.Dispose();
                _lockObj.Dispose();
            }
            _disposedValue = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
    }

    #endregion
}

為了測試 StaticThreadTaskScheduler 是否真的如預期,我寫了一小段 Testing Code 去驗證。

class Program
{
    static StaticThreadTaskScheduler _scheduler = new StaticThreadTaskScheduler(1);
    static void Main(string[] args)
    {
        foreach (var item in Enumerable.Range(1, 100))
        {
            Task.Factory
                .StartNew(() =>
                    WorkingAsync(item),
                    CancellationToken.None,
                    TaskCreationOptions.None,
                    _scheduler)
                .Unwrap();
        }
        Console.ReadKey();
        _scheduler.Dispose();
        Console.ReadKey();
    }

    static async Task WorkingAsync(int i)
    {
        while (true)
        {
            Console.WriteLine($"Thread ID: {Thread.CurrentThread.ManagedThreadId}, Working ID: {i}");
            await
                Task.Factory
                    .StartNew(async () =>
                        {
                            await Task.Delay(1000);
                            Console.WriteLine($"Thread ID: {Thread.CurrentThread.ManagedThreadId}, Sub Working ID: {i}");
                        },
                        CancellationToken.None,
                        TaskCreationOptions.None,
                        _scheduler)
                    .Unwrap();
        }
    }
}

結果如下:

       

[Hyper-V] 如何自訂虛擬 IP ?

最近有個需求要在 Hyper-V 自訂一個 Private Switch 讓 VM 彼此之間互相溝通,
在預設的情況下 Default Switch 被設為 NAT 模式,也就是對外的網路連線必須透過 Host 與外部溝通,
我聰明的以為只要在該台的網卡設定 IP 就可以順利結案,殊不知預設的 Default Switch 並不允許自訂 IP …

閱讀更多

       

[C#][MSSQL] 連線結束後 Temp Table 沒有自動釋放 !?

上次 [C#] SQL 資料庫 Connection Pool 連線池觀念釐清 有提到可以開啟 Connection Pool 來減少開啟連線的效能耗損,但最近發現有 Stored Procedure 執行後沒有手動 Drop Temp Table,而 .NET 又將連線丟回 Pool 裡面造成 Temp Table 沒有被正常釋放的問題,下面來測試看看是不是真的會有這種情況發生。 閱讀更多

       

[C#] Registrykey 登錄機碼的新增、修改、刪除、讀取

寫 Windows 應用程式時,常常會將一些參數存至機碼裡面,今天來簡單的筆記一下 Registry 的 CRUD。

在 64-bits 的作業系統下執行 32-bits 或 64-bits 應用程式時,預設寫入 Registry 會被作業系統寫入 Wow6432Node 的目錄底下。在 HKEY_LOCAL_MACHINE\SOFTWARE\ 底下寫入機碼,就會出現在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\,其目的是為了區分 32-bits 與 64-bits 作業系統的對應而產生的結果,只有真正的 64-bits 應用程式才能寫在 HKEY_LOCAL_MACHINE\SOFTWARE\ 目錄。

閱讀更多