2019年9月14日 星期六

Win10 莫名其妙被喚醒自動開機

電腦莫名其妙被喚醒,不只睡眠關機也是

已知睡眠會被滑鼠還有網卡喚醒,之前就處理過了,但是不知道為什麼後來變得連關機也會。又重新爬文了一次有一些收穫整起來。
先簡單導覽一下總共有那些原因
1. 裝置喚醒(滑鼠/網卡)
3. 電腦事件喚醒(程式排程/自動更新)

關於1可以看之前的文章有解決了:電腦休眠睡眠之後莫名其妙自己喚醒

自動更新喚醒

這個也是很搞人,Intel某個驅動裝置安裝之後為了安全,只要Windows有發布更新晚上就會自動喚醒更新電腦,然後就放置不管了。

有個大招直接把他關了。


工作與排程喚醒

工作排程內的程序也可以喚醒電腦,想知道哪程序可以喚醒電腦可以在 powershell 輸入以下指令。
# 查看計數器
powercfg /lastwake

# 查看可以喚醒的工作排程
Get-ScheduledTask | where {$_.settings.waketorun}
這個可以看出到底誰在雷把電腦開機了,之後去工作排程把它關閉就好了。
工作排程器可以直接在開始搜尋 工作排程器 就可以找到並開啟了。
上方的圖片中,前方的位置就是工作排成器的位置,可以找到該排程。
不過在關閉工作排程的時候又發現一個問題,沒有權限可以關閉QQ
如果使用管理員開啟工作排成,情況會變成要你輸入密碼,但是壓根就不知道系統管理員的密碼是什麼,使用使用者帳戶則登入是直接沒有反應。
查一查發現微軟有出工具可以解決
https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools
到微軟官方去下載,下載下來會是整包有很多東西,其中只需要用到 PsExec.exe 而已,把它解壓縮出來,並放到 C:\Windows\System32 這個位置來。
然後使用工作管理員開啟一個新的 powershell 視窗,執行下面的指令來開起工作排程。
psexec -i -s -d mmc.exe /s taskschd.msc
輸入完畢就會打開工作排成了,並且是使用足夠權限的方式開啟,這時候就可以把剛剛指令列出的工作排成給刪除了
位置在哪裡可以參考這個指令跳出來的訊息,上面就包含位置
圖中有兩個 ready 這兩個貌似每台電腦預設都開著,如果找不到原因就先關閉他
不用把服務完全關閉,設置成不要喚醒就好,這樣電腦開著還是一樣會運作

參考資料






2019年8月13日 星期二

CUDA 10.0 安裝於 VisutalStudio 2019 並執行範例程式

CUDA 10.0 安裝於 VisutalStudio 2019 並執行範例程式

開始安裝前記得先打開 Visual Studio Installer (在開始內搜尋就有了),把 VS 升級到最新版本。
如過沒有安裝VS可以參考這篇文章安裝
https://charlottehong.blogspot.com/2018/09/c-visual-studio-2017.html
cuda需要搭配 NVIDIA 的顯示卡,在開始前要先確定電腦的顯示卡是NVIDIA的卡。

安裝 cuda

一路下一步到底就好
安裝完成畫面

執行範例檔案

打開VS選擇建立新專案
在上面搜尋欄打上 cuda,並選擇cuda專案範例
接著輸入專案名稱,隨意即可
打開之後直接按上方的執行,就可以看到結果了

2019年8月9日 星期五

Windows10 如何永久關閉 自動更新

Windows10 如何永久關閉 自動更新

要關閉可以從 本機群組原則 這邊下手,可以用久禁用。
本機群組原則打開方式直接在開始搜尋 gpedit.msc 就有了
這個套件只有在專業版裡面才有,如果是家用版的並沒有這個功能,需要的話要打指令啟動,指令打在文章結尾處。
然後找到這裡就可以關閉自動更新了

最後一個框框可以自己選擇自己要什麼


啟用本機群組原則

把下面的指令開一個記事本儲存成 enbale_gpdeit.bat 然後使用管理員啟動即可。這可能需要重新啟動電腦。
@echo off 
pushd "%~dp0" 

dir /b %SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt 
dir /b %SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt 

for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i" 
pause

2019年8月5日 星期一

DmitriRender 3.0.0.1 nvidia顯示卡 綠屏 無法正常使用

DmitriRender 3.0.0.1 nvidia顯示卡 綠屏 無法正常使用

官方網址:http://www.dmitrirender.ru/index/0-11
點擊下方的粗體DmitriRender 3.0.0.1就可以下載了。
DmitriRender 好像是所有補禎數軟體裡面安裝最簡單的,一鍵安裝完全不需要更改播放器的設置,直接幫你設置到好。
我的顯示卡是 “NVIDIA GeForce GTX 1050 with Max-Q Design”
NVIDIA 顯示卡綠屏的問題,直接網頁滾到下面看在後半段。

安裝

安裝的過程非常傻瓜,就是下一步,然後就沒了!
安裝完畢可以到開始裡面找
長這個樣子,找到 Register Filter 這個按右鍵 “開啟檔案位置”
然後會開啟資料夾,對著這個批次檔按右鍵使用檔案管理員開啟
然後就安裝好了。
再來直接打開你的播放器就會自動套用了,傻瓜包一起幫你做完了。
這邊推薦 K-Lite 的播放器,我個人慣用的,
https://codecguide.com/download_k-lite_codec_pack_mega.htm
記得播放器要在DmitriRender之前安裝,順序反了就在安裝一次DmitriRender 。


NVIDIA 打開後綠屏什麼都看不到

懶人包

懶人包連結:https://mega.nz/#F!RlVVgaoB!QlqcB_ee8P9ocls5zgdE5Q
懶人包已經幫你做好安裝位置了,開啟之後一鍵安裝即可完成。

原因

貌似是新卡的問題,我是根據google收到的訊息寄信給作者求解的,信件內容如下。
簡單說就是要我安裝一個補丁包,解決這個問題。
原作者的補丁檔案連結:https://yadi.sk/d/ydDyqgpblZfqXQ (已問過授權可張貼)
這個補丁包要放到使用者文件內的這個位置。
%USERPROFILE%\AppData\Roaming\DmitriRender\
另外我不知道什麼時候會改版,文章寫作日期目前是 2019.08.06
如果超過太久失效了,可能需要重新跟作者要了。
或是你在這裡留言可也可以拉,做懶人包很快的。

2019年7月22日 星期一

京城銀行 手機線上提領西聯匯款 圖文教學

京城銀行 手機線上提領西聯匯款 圖文教學

線上提醒比銀行簡單太多惹~

網路提領

我使用的是京城銀行的網路銀行功能,要事先到銀行開戶,並告知要使用網銀等等,如果不知道怎麼做直接跟他說,你要從手機提領西聯匯款應該就可以了。
實體帳戶開完之後手機還要開通歐,她會給你一個一次性密碼條開通,你要輸入到APP才可以激活,啟用後只有這台手機可以動帳戶金額;別台手機不行(就算有你的網銀帳密),換手機要帶雙證件去銀行重拿一組密碼,那啟用碼一次性的。
但是其實就是一般數位銀行的手續而已各家都一樣。如果你是新手第一次辦網銀,建議就是當場就請行員手把手交你,跟她說我手機怎麼設定。

設置完畢之後底下是如何提領的流程

首先打開APP進入西聯匯款頁面(這邊可能會出現要求你登入)
點擊匯入
同意說明書
填入匯款單 (WTF這邊比銀行填單簡單太多了,銀行要填一大堆)
只要填入MTCN號碼與匯款人姓名、在選個國家即可,都在剛剛的收據上的紅框那裏
匯款人的部分有姓與名兩個欄位必填,這邊我是拆成底下這樣
名:Google Asia Pacific Pte.
姓:Ltd.
下一步就可以提醒摟
提領是馬上就會好的,可以到帳戶內看到金額已匯入

Google Adsence 西聯匯款如何領取

Google Adsence 西聯匯款如何領取

前置步驟

Google Adsence 在累積到一定金額之後就可以開通地址驗證了,這邊我查網路上好像是說10美元的樣子。有點久了印象中就是右上角鈴鐺自己會跳出來要你輸入真實地址驗證,這邊不要亂填,她真的會寄一封實體信件給你,裡面有pin碼,你要輸入完成地址驗證才可以正式開通。
驗證完畢之後還有一關是需要你選擇哪一種付款方式,個人小額建議填西聯匯款,沒有手續費的樣子,我上次領100多美元是實領3200多。
設定的位置在這個地方

提領資訊

金額累計到設定的最低金額之後就會配發了,配發的日期通常在每個月21日,你會收到gmail的信件
這時候回到你的 https://www.google.com/adsense 主頁就會發現金額被扣除了
需要查找西聯匯款的數據可以,點擊左邊的付款,查看交易紀錄。
這邊點入 (這張圖箭頭所指的地方只有發錢的時候有,平時是不會有的你找不到的)
收據內就有跟你說提醒要填的東西
西聯匯款只要填對,對方資訊+自己的資訊,然後再給身分證證明本人,就可以提領了。
提領方式就算是第一次提領,我也建議你用線上的方式,線上網銀也是可以當場辦好的,比填單方式方便很多,那個西聯匯款實體單子要寫蠻多的。
直接跟行員說要辦線上提領西聯匯款,叫行員教你怎麼開通網銀,好了之後直接在現場用手機提領,不懂就直接問叫她手把手教你,流程都不是太麻煩,都是一下子就能好的,不用擔心弄很久。

銀行提領

填單子而已,一個蘿蔔一個坑,前面收據紅色框框內的資訊是會用到的,剩下的都自己的資料,全部都要寫英文,會需要用到台灣的英文地址,記得先到郵局查一下英文地址~
(地址要跟收據上的一樣歐,圖中我碼掉了在紅框下那個,不然領不到)
這邊我第一次去銀行領的時候,行員超不客氣的,我不知道哪一個要填哪一格,問了行員,行員跟我說我怎麼知道,這些你自己應該要知道阿!((好像怕我盜領似的QQ
要去之前建議先看一下紅框內的資訊,個別代表是什麼。但其實也不是太難拉,只是第一次去有點緊張。內容舉例來說哪個單字是國家、銀行名稱,街道名稱,這些而已,冷靜下來應該不會填錯才是。

線上提領

我使用的是京城銀行的APP,線上提領比起去銀行填單提領簡單超多的ㄚㄚ
只要填入 MTCN、匯款人姓名、國家 這三項資訊就可以提領了,銀行的單子要填超多的…
篇幅有一點長,文章另外寫一篇,可以連結到這裡參考
https://charlottehong.blogspot.com/2019/07/blog-post.html

2019年7月2日 星期二

C 動態陣列 範例與解說

C 動態陣列 範例與解說

其實是看到有人在社團問問題,順道寫了程式,不過當我弄完的時候才發現早就關閉回應了QQ
好吧自己發部落格XD

動態陣列

顧名思義,意思是說當你需要用到多大的陣列才向系統要求多大的記憶體,一般如果直接寫在宣告上的陣列,是程序一打開的瞬間就向系統要求記憶體,這種一開始就要求的記憶體是有限的不能塞太大的。
其次使用動態陣列也可以節省空間,如果初期並不知道空間大小,而是計算後才能知道總共要多大,直接寫在宣告上,只能多寫一點避免到時候不夠。動態陣列就沒關係了,程序執行後計算出來再要求記憶體即可。

宣告方法

介紹最基本的兩個函式
int* p=NULL;
int len=5;

// 要求空間
p = (int*)calloc(len, sizeof(int));     // 陣列內容會初始化為0
p = (int*)malloc(len* sizeof(int));   // 陣列內容不會初始化,可能是亂碼垃圾值
兩個簡單就差別是否初始化,根據使用情況調整使用就好,其中要注意的是 malloc 只有一個參數,calloc則是有兩個參數,所以可以看到其中一個是逗號跟乘號(這不是打錯)。

檢測

獲取之後就可以使用了,但是再使用前要先檢查是否有成功要到記憶體,電腦的記憶體是有限的,如果你要求一個超大的,大於當前記憶體容量,系統不會給你的,這種情況下函式會返回NULL,所以類似於底下的方法就可以檢測是否成功。
if(p){
    printf("成功");
} else {
    printf("失敗");
}
當然啦現在電腦記憶體都很大,寫作業基本上應該是不會遇到NULL的情況,但是即便如此,我還是建議你養成習慣寫一下,以後寫大專案的時候你會感謝你自己的。
另外記憶體的不足不只發生在記憶體空間不構的情況,如果程序長時間運行,不斷的解構重購,會造成記憶體破碎,就是說一段有使用,一段沒使用,記憶體中間是有間格的,上述的兩種要求方法,要求的情況是連續記憶體,在這種記憶體破碎嚴重的情況下,即便記憶體充足也可能要不到,系統找不到足夠長的連續空間。

使用

使用就很簡單了,要求到的記憶體要用第幾個,直接加上去就好,編譯器會自動幫你計算位置的,最後再使用星號取值即可。
for (int i; i<len; ++i){
    prinf("%d", *(p+i));
}

解構

用完之後要記得把記憶體回收,告訴系統這個我不用了,這樣下次你要求空間的時候,原本這一段也可以被列入使用,不回收的話,這個空間就一直佔著誰也不能用。
如果你再還沒回收之前就把那個記憶體位址給丟失了,也就是那個P你改成別的值,那就再也沒有人知道,那一段記憶體在哪裡,你就沒有辦法釋放那塊記憶體了,這種情況叫做 memroy leak。
倒是不用擔心練習程式忘記釋放記憶體,結果記憶體被偷吃滿,以目前的作業系統來說是會自動幫你把記憶體回收掉的,不會讓你做這種傻事,作業系統知道這隻程式從頭到尾到底要了那些記憶體,既然都把程式關了,當然全部都回收瞜。
解構的方法很簡單,只是一個函式
free(self->p);
self->p=NULL;
free即可解構,後面的設置成NULL是一種保險,也是一種聲明,既然都解構掉了代表這塊記憶體不能用了,還留著指標幹嘛,不知道知情的人傻傻的拿去用了就罪過了(這個叫未定義行為)。當設置成NULL,別人就用不了了,同時也可以用if來判斷已解構。
不要想說反正記憶體充足就不解構,這個習慣真的很重要,以後寫大專案的時候沒有養成習慣,真的會抓蟲抓的不要不要的。不解構甚至過分點leak,不只影響到記憶體用量,有時候還可能導致非預期的行為,導致你抓蟲的時候沒得下手,怎麼想都奇怪,這時候就來不及了,只能加油吧,祝好運XDD。
抓蟲第一件事情,先把釋放還有leak做好,真的是不是開玩笑的,沒有嚴謹的照規矩寫的程式,很多時候補上就莫名其妙好了,然後完全不知道發生什麼了,乾怎麼好了!

範例

最後附上簡單寫的範例,可以對照著參考
/*****************************************************************************
Name : 動態陣列
Date : 2019/07/02
By   : CharlotteHonG
Final: 2019/07/02
*****************************************************************************/
#include <iostream>
using namespace std;

struct Arr {
    int* p;
    int len;
};

void Arr_ctor(Arr* self, int len) {
    int*p = NULL;
    p = (int*)calloc(len, sizeof(int));

    if(p){
        self->p   = p;
        self->len = len;
    } else {
        printf("Error Arr_ctor.");
    }
}
void Arr_set(Arr* self, int idx, int num) {
    int* p = self->p;
    int len = self->len;

    if(idx>=0 && idx < len){
        *(p+idx) = num;
    } else {
        printf("Error Arr_set");
    }
}
void Arr_dtor(Arr* self) {
    free(self->p);
    self->p=NULL;
    self->len=0;
}
void Arr_print(Arr* self) {
    for(size_t i = 0; i < self->len; i++){
        int* p = self->p;
        printf("%d, ", *(p+i));
    } printf("\n");
}
//=============================================================================
int main(int argc, char const* argv[]) {
    // 陣列長度
    int len = 10;

    // 建立陣列 (初始值為0)
    Arr array;
    Arr_ctor(&array, len);
    // 打印
    Arr_print(&array);
    // 更改數值
    for(size_t i = 0; i < len; i++){
        Arr_set(&array, i, i+1);
    }
    // 打印
    Arr_print(&array);
    // 釋放資源
    Arr_dtor(&array);

    return 0;
}
//=============================================================================