通常在寫 code 的時候都會使用 formater 去自動排版程式碼,在 Python 中我用了 autopep8 實現排版的動作,但個人覺得預設單行長度只有 80 太短了排出來很醜,那就來自己調整吧!
瀏覽作者:
lex.xu
對資訊技術這方面非常有興趣,常常自學新技術來補齊自己的好奇心,解決問題的成就感是我繼續走向這條路的最大動力。
[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();
}
}
}
結果如下:

[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\ 目錄。










