標籤

BAT (38) shell (34) Virtual Machine (33) Xubuntu (29) acfs (25) PHP (24) CentOS (21) Virtul Box (20) 編輯器 (17) 資料庫 (15) lubuntu (13) windows (13) CPP (12) ubuntu (12) chrome (11) laravel (10) Docker (9) Python (9) 5A88 (7) VMware (6) 資料結構 (6) Javascript (5) Node (5) Proxmox VE (5) 公告系統 (5) 程式積木 (5) Android Studio (4) ANN (3) OB2D2016x64 (3) Xoops (3) clonezilla (3) samba (3) 公文 (3) 其他 (3) 硬體 (3) API (2) Android (2) AppInvent2 (2) Html (2) Hyper-V (2) Nas (2) botnet (2) mbot (2) swift (2) wordpress (2) 樣板 (2) 防火牆 (2) AD的應用 (1) Ansible (1) Arduino (1) CSS (1) GitLab (1) HA Proxy (1) LegoEV3 (1) PowerShell (1) Scratch (1) VM (1) XenServer (1) kotlin (1) linuxmint (1) lxc (1)

2020年6月28日 星期日

5a88遠端遙控管理程式(台南開發)_bat檔_研究心得與程式碼解析

5a88遠端遙控管理程式 20200611版本
一、資料夾內的內容
有兩個資料夾bin與PSTools、一個5A88tnR.bat、一個IP_list_sample.txt。
我們的重心會放在5A88tnR.bat。
程式碼:
REM 讀取5a88tnR.ini 取得預設帳密及預設選單
if not exist .\bin\5a88tnR.ini (echo 找不到.\bin\5a88tnR.ini,請重新下載程式。 & pause & exit)

解釋:
檢查不到 .\bin\5a88tnR.ini ,印出找不到.\bin\5a88tnR.ini,請重新下載程式。暫停、離開。

想法:
if exist .\bin\5a88tnR.ini (echo 找到.\bin\5a88tnR.ini。 )
結語:
檔案存在與否? 使用if exist 檔案名稱 (echo 找到檔案名稱。 )

程式碼:
For /f "eol=# tokens=1,2 delims==" %%i in (.\bin\5a88tnR.ini) do (
    if /I %%i==AdminPW set AdminPW=%%j
    if /I %%i==AdminSU set AdminSU=%%j
    if /I %%i==AskAnyTime set AskAnyTime=%%j
    if /I %%i==PresetMU set PresetMU=%%j
)

解釋:
/f 代表要 FOR 迴圈會對傳入的字串進行解析(parsing)
eol=# 用來決定斷行符號,預設為 \n
delims== 用來決定欄位的分隔字元,預設為空白與TAB符號,並可自訂多個字元
tokens=1,2 會得到一個 %i 與一個 %j 變數值,分別代表比對到的第1與第2個欄位。

想法:
想知道在這段程式中,到底取到那些值?那程式碼要如何改寫?
For /f "eol=# tokens=1,2 delims==" %%i in (.\bin\5a88tnR.ini) do (
    echo "%i = "%%i "%j = "%%j
    if /I %%i==AdminPW (set AdminPW=%%j
      echo AdminPW=%%j
     )
    if /I %%i==AdminSU (set AdminSU=%%j
      echo AdminSU=%%j
     )
    if /I %%i==AskAnyTime (set AskAnyTime=%%j
      echo AskAnyTime=%%j
     )
    if /I %%i==PresetMU (set PresetMU=%%j
      echo  PresetMU=%%j
     )
)
程式碼:
REM 設定本機IP與MAC
:SetIP
cls
ipconfig /all | find "IPv4 位址" > %TEMP%\ip-chk.txt
set count=0

解釋:
cls清除螢幕
ipconfig /all | find "IPv4 位址" > %TEMP%\ip-chk.txt
ipconfig /all查詢IP、mac 及其他網卡資訊

find "IPv4 位址"尋找IPv4 位址
ipconfig /all | find "IPv4 位址" IP、mac 及其他網卡資訊內,尋找IPv4 位址。

ipconfig /all | find "IPv4 位址" > %TEMP%\ip-chk.txtIP、mac 及其他網卡資訊內,尋找IPv4 位址。將搜尋結果輸出到%TEMP%\ip-chk.txt
那問題是:%TEMP%是哪?

想法:
echo %TEMP%
PAUSE
EXIT
REM 設定本機IP與MAC
:SetIP
cls
ipconfig /all | find "IPv4 位址" > %TEMP%\ip-chk.txt
set count=0
%TEMP%C:\Users\使用者名稱\AppData\Local\Temp

程式碼:
For /f "eol=# tokens=1-16 delims=( " %%a in (%TEMP%\ip-chk.txt) do (
set /a count+=1
if [%%p] NEQ [] (
echo !count!. %%p
set LocalIP=%%p
) else (
set /a count-=1
if [!LocalIP!]==[] set LocalIP=%%l
)
)


解釋:
For /f "eol=# tokens=1-16 delims=( " %%a in (%TEMP%\ip-chk.txt)
tokens=1-16 會得到16個變數從 %a ~%p 變數值,分別代表比對到的第1與第16個欄位。
另外,要取出set 的變數值,需使用!變數名!

想法:
想知道16個變數從 %a ~%p 變數值與LocalIP取得的值
For /f "eol=# tokens=1-16 delims=( " %%a in (%TEMP%\ip-chk.txt) do (
set /a count+=1
echo a=%%a b=%%b c=%%c d=%%d e=%%e f=%%f g=%%g h=%%h
echo i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o p=%%p  
if [%%p] NEQ [] (
echo !count!. %%p
set LocalIP=%%p
  echo LocalIP=!LocalIP! 
) else (
set /a count-=1
if [!LocalIP!]==[] set LocalIP=%%l
)
)

資料來源:
1.5a88相關資料下載
2.批處理中setlocal enabledelayedexpansion的作用詳細整理
3.windows下bat批處理中%cd%和%~dp0的區別
4.如何利用批次檔(Batch)讀取指令執行的結果或文字檔案內容
5.免費一鍵還原軟體AOMEI OneKey Recovery
6.5A88電腦管理系統
7.5A88tnR台南遠端遙控程式(請先詳讀)

2020年6月22日 星期一

C++程式_Z字形編排問題

目標
要變成
觀念:
1、如果矩陣的元素matrix[i][j]中縱坐標j是偶數,並且i==0或i==SIZE-1,那麼遍歷路徑在矩陣中的走向就是向右移動一格
條件寫成程式碼:
if (j%2==0&&(i==0||i==SIZE-1)) {
       j++;
       continue;
}
2、如果矩陣的元素matrix[i][j]中橫坐標i是奇數,並且j==0或j==SIZE-1,那麼遍歷路徑在矩陣中的走向就是向下移動一格
條件寫成程式碼:
if (i%2==1&&(j==0||j==SIZE-1)) {
       i++;
       continue;


3、除以上規律情況之外,如果矩陣的元素matrix[i][j]的橫縱坐標之和i+j為偶數,那麼遍歷路徑在矩陣中的走向就是向右上角移動一格;否則,如果i+j是奇數,那麼遍歷路徑在矩陣中的走向就是向左下角移動一格。
條件寫成程式碼:
if ((i+j)%2==0) {
  j++;
  i--;
} else if ((i+j)%2==1) {
  j--;
  i++;
}

測試程式碼:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int i,j,x,y,SIZE;
i=0,j=0,SIZE=8;
for(x=0;x<SIZE;x++) {
for(y=0;y<SIZE;y++) {
cout <<"i= "<<i<<" j= "<<j<<" x= "<<x<<" y= "<<y<<endl;
if ((i==0||i==SIZE-1)&&j%2==0) {
j++;
continue;
}
if ((j==0||j==SIZE-1)&&i%2==1) {
i++;
continue;
}
if ((i+j)%2 ==0) {
i--;
j++;
} else if((i+j)%2 ==1){
i++;
j--;
}
}
}
}

今將測試程式碼改寫成"二維陣列"如下:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
 int i,j,x,y,SIZE;
 i=0,j=0,SIZE=8;
 int a[SIZE][SIZE] = {0};
 int b[SIZE][SIZE] = {0};
 cout <<endl<<"變更前的矩陣"<<endl;
 for(i=0;i<SIZE;i++) {
  for(j=0;j<SIZE;j++) {
  if(a[i][j]!=0) {
  a[i][j]=0;
}
if(b[i][j]!=0) {
  b[i][j]=0;
}
a[i][j] = i*SIZE+j;
  cout <<setw(4)<<a[i][j]<<" ";
  }
  cout <<endl;
 }
 i=0;j=0;
 for(x=0;x<SIZE;x++) {
  for(y=0;y<SIZE;y++) {
   //cout <<"i= "<<i<<" j= "<<j<<" x= "<<x<<" y= "<<y<<endl;
   b[i][j]=a[x][y];
   //cout <<setw(4)<<b[i][j]<<setw(4)<<a[x][y]<<endl;
   if ((i==0||i==SIZE-1)&&j%2==0) {
    j++;
    continue;
   }
   if ((j==0||j==SIZE-1)&&i%2==1) {
    i++;
    continue;
   }
   if ((i+j)%2 ==0) {
    i--;
    j++;
   } else if((i+j)%2 ==1){
    i++;
    j--;
   }
  }
 }
 cout <<endl<<"變更後的矩陣"<<endl;
 i=0;j=0;
  for(i=0;i<SIZE;i++) {
  for(j=0;j<SIZE;j++) {
  cout <<setw(4)<<b[i][j]<<" ";
  }
  cout <<endl;
 }
}
其結果如下圖:

資料來源:
1.書籍:演算法之美:隱藏在資料結構背後的原理(C++版)
2.Z字形編排問題詳解(C++)

2020年6月15日 星期一

只要會用滑鼠點,解決學校會計主任電腦連不上縣市憑證線上簽核系統

問題描述:學校會計主任電腦連不上縣市憑證線上簽核系統。

        解決方案3.BAT快速設定:
檔案下載,解壓密碼demo1234
檔案名稱:DnsIpv4SettingWin10.bat
內容:
@echo on
netsh interface ip set dns "Ethernet0" static 163.23.200.1
netsh interface ip add dns "Ethernet0" 163.28.80.43

使用方法:
1.檔案下載
2.將檔案解壓縮
3.滑鼠對著資料夾內的DnsIpv4SettingWin10.bat,以系統管理員身分執行點一下。完成



問題描述:學校會計主任電腦連不上縣市憑證線上簽核系統。


縣市憑證線上簽核系統的使用者為 校長、教務主任(或學務主任)、會計主任需做設定
縣市憑單線上簽核資訊系統彰化縣


        解決方案1.感恩員林國小賴志明組長提供如下:
將主計電腦的DNS設定 8.8.8.8 換成 168.95.1.1 和 163.23.200.1,即可。
以下截圖為手動方式處理


        解決方案2.設定防火牆,將DNS改為163.23.200.1 與163.28.80.43
   
        解決方案3.BAT快速設定:
檔案下載
檔案名稱:DnsIpv4SettingWin10.bat
內容:
@echo on
netsh interface ip set dns "Ethernet0" static 163.23.200.1
netsh interface ip add dns "Ethernet0" 163.28.80.43


     
資料來源:
1.只要會用滑鼠點兩下,設定電腦教室學生機DNS來強制Google安全搜尋和youtube嚴格搜尋
2.色情網站過濾軟體與相關知識整理

2020年6月14日 星期日

Docker入門教學_筆記與心得

文章移到

一、shell快速完成安裝docker
二、建立一個Docker版的Node.js程式,並完成部署與分享
三、利用ENTRYPOINT進行指定的程序
四、建立一個Nginx的Web服務器

五、建立Python3.8的開發環境
六、建立PostgreSql資料庫
七、使用pgadmin4管理PostgreSQL資料庫
八、建立自己的快取Redis

九、Docker Compose
十、Flask+Redis多服務開發部署
十一、建立Vue開發環境

2020年6月13日 星期六

只要會複製貼上,設定電腦教室學生機禁止瀏覽某些網頁


    電腦教室學生機需限制某些網站。比方說限制FB,其網址為https://www.facebook.com/,只要將www.facebook.com,貼到config.txt。對資料夾內的ForceSafeURL.exe 點兩下,即可限制FB。此外,程式還會建立備份檔。

使用方法:
1.下載檔案下載
2.解壓縮,解壓密碼demo1234
3.修改設定檔config.txt

4.對資料夾內的ForceSafeURL.exe 點兩下
5.會產生hostsBK+日期,完成。
注意事項:
1.內有ForceSafeURL.cpp,可用Dev C++重新編譯



以下是思考過程與原始碼
檔案名稱:ForceSafeUrl.cpp
內容:
#include <windows.h>
#include <fstream>
#include <iostream>
#include <fstream>
#define MAX_FILENAME 100
#define MAX_TotalNumber 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
using namespace std;

struct UD {
char httpUrl[MAX_FILENAME];
};


int main() {

 /*讀取設定檔的變數*/
  char httpUrlmark[MAX_FILENAME];
  struct UD UD[MAX_TotalNumber];
  int TotalNum;
  int i;
  ofstream outfile;
  bool FileExist;
  //將時間寫入檔名
  char filename[128];
  time_t now=time(NULL);
  struct tm *newtime=localtime(&now);
  strftime(filename,128,"hostsBK%Y-%m-%d",newtime);

  ifstream fin("config.txt");
    if(!fin) {
        cout << "無法讀入檔案\n";
        return 1;
    }
   fin >>httpUrlmark;
   TotalNum = 0;
//讀取禁止存取的網站網址
          while(!fin.eof()) {
           fin >> UD[TotalNum].httpUrl;
   TotalNum++;
    if (TotalNum>=MAX_TotalNumber) {
      cout <<"警告!!\n"
                      cout <<"讀取名稱與對應IP資料數超過1000!!\n"
                      cout <<"需修改原始碼MAX_TotalNumber並重新編譯!!\n";
    }
  }
    fin.close();
//備份 hosts
    FileExist =  CopyFile("C:\\Windows\\System32\\drivers\\etc\\hosts",filename,FALSE);
    if (!FileExist) {
cout << "找不到檔案C:\\Windows\\System32\\drivers\\etc\\hosts"<<endl;
    } else {
      cout <<"備份hosts,檔名為 "<<filename<<endl;
}
//寫入hosts
  outfile.open("C:\\Windows\\System32\\drivers\\etc\\hosts", std::ios_base::app);
  for(i=0;i<=TotalNum-1;i++) {
    /*網站網址(對應總數需小於等於1000)*/
    outfile << "0.0.0.0" <<" "<<UD[i].httpUrl<<endl;
}
  return 0;
}
資料來源:
1.C++ CopyFile函式的用法
2.[C語言練習]以日期作為存檔名稱
3.C/C++---用fprintf函数输出.txt文件
4.C語言rename()函數:重命名文件或目錄
5.C++ 檔案、資料夾、路徑處理函式庫

2020年6月9日 星期二

色情網站過濾軟體與相關知識整理

一.縣網DNS提供

Google 安全搜尋和 youtube 嚴格搜尋已啟用
dns:
163.23.200.1
163.28.80.43
ipv6 dns:
2001:288:5600::1
2001:288:5000:1:163:28:80:43

解決方案:
1.SRX防火牆設定DNS
感恩西勢國小陳金地老師提供的防火牆SRX300 簡易操作說明-20200218
在講義的P39頁
 步驟:


2.在電腦安裝免費的成人網站過濾軟體 K9 Web Protection
感恩湖南國小許銘堯老師、員林國中葉彥麟老師指導。
家長救星~免費的成人網站過濾軟體 K9 Web Protection 詳細步驟教學說明,網路分級自己來 (含下載點)
注意事項:
(1)K9 Web Protection 4.5.1001.0 for Windows 適用:Windows 10 / 8 / 7 / Vista / XP  (32/64 bit)
(2)K9 Web Protection 4.4.268 for Mac 適用:Mac OS X 10.8 (Mountain Lion) and higher
(3)授權碼(License):K95669ZYDY

3.在電腦安裝網路守護天使
感恩和東國小王麒富老師指導

4.在電腦安裝

5.在電腦安裝

二、若是程式或通知出現色情圖片或廣告

解決方案:
1.關閉Windows 10 的通知
感謝Lewis Liu老師指導
解決:

  2.使用RouterOS 的Web Proxy 功能
  感恩湖南國小許銘堯老師指導。
  MikroTik RouterOS 新增 Web Proxy 功能

資料來源:

2020年6月8日 星期一

只要會用滑鼠點兩下,設定電腦教室學生機DNS來強制Google安全搜尋和youtube嚴格搜尋

使用方法:
1.下載檔案下載
2.解壓縮,解壓密碼demo1234
3.對資料夾內的DnsSetting.bat (以系統管理員身分執行)點兩下),完成。

思考過程:

1.經縣網協助,Google 安全搜尋和 youtube 嚴格搜尋已啟用

dns:
163.23.200.1
163.28.80.43
ipv6 dns:
2001:288:5600::1
2001:288:5000:1:163:28:80:43

2.那要如何快速設定學生機DNS?使用BAT


檔案名稱:DnsSettingWin10.bat
內容:
@echo on
netsh interface ip set dns "Ethernet0" static 163.23.200.1
netsh interface ip add dns "Ethernet0" 163.28.80.43
netsh interface ipv6 set dns "Ethernet0" static 2001:288:5600::1
netsh interface ipv6 add dns "Ethernet0" 2001:288:5000:1:163:28:80:43

檔案名稱:DnsSettingWin7.bat
內容:
@echo on
netsh interface ip set dns "區域網路" static 163.23.200.1
netsh interface ip add dns "區域網路" 163.28.80.43
netsh interface ipv6 set dns "區域網路" static 2001:288:5600::1
netsh interface ipv6 add dns "區域網路" 2001:288:5000:1:163:28:80:43

執行後的結果

3.可否讓bat自行判斷作業系統,將上述兩個bat合併成一個

檔案名稱:DnsSetting.bat
內容:
@echo off
systeminfo | find "Windows 10"
if %ERRORLEVEL% == 0 goto Win10
systeminfo | find "Windows 7”
if %ERRORLEVEL% == 0 goto Win7

:Win10
echo "Windows 10"
netsh interface ip set dns "Ethernet0" static 163.23.200.1
netsh interface ip add dns "Ethernet0" 163.28.80.43
netsh interface ipv6 set dns "Ethernet0" static 2001:288:5600::1
netsh interface ipv6 add dns "Ethernet0" 2001:288:5000:1:163:28:80:43
exit

:Win7
echo "Windows 7"
netsh interface ip set dns "區域網路" static 163.23.200.1
netsh interface ip add dns "區域網路" 163.28.80.43
netsh interface ipv6 set dns "區域網路" static 2001:288:5600::1
netsh interface ipv6 add dns "區域網路" 2001:288:5000:1:163:28:80:43
exit

4.執行DnsSetting.bat會出現錯誤訊息 ,可以無視。

感恩東芳國小蔡忠仁老師提供的協助


那要如何驗證該dns存在呢?
感恩彰化縣網中心林哲明老師提供的協助
請下指令
nslookup dns.chc.edu.tw
就可以得到 163.23.200.1 與 2001:288:5600::1
nslookup chcns.tcrc.edu.tw
就可以得到 163.28.80.43 與 2001:288:5000:1:163:28:80:43
其截圖如下:



資料來源:
1.只要會打字,快速設定電腦教室的電腦為固定ip或dhcp
2.Windows 使用指令修改 IP
3.batch file and windows version

只要會用滑鼠點兩下,電腦教室學生機強制安全搜尋


使用方法:
1.下載檔案下載
2.解壓縮,解壓密碼demo1234
3.對資料夾內的ForceSafeSearch.exe (以系統管理員身分執行)點兩下,完成。


以下是思考過程:
        根據資料來源2.How to: Enforcing Google SafeSearch, YouTube, and Bing
我們得知幾件事
1.要在單機主機內C:\Windows\System32\drivers\etc\hosts,新增幾行。其意義如下:
(1)強制google安全搜尋 -> 216.239.38.120
(2)強制bing安全搜尋 ->會有個IP
(3)強制youtube安全搜尋 ->會有個IP
     包含:www.youtube.com、m.youtube.com、youtubei.googleapis.com
                 youtube.googleapis.com、www.youtube-nocookie.com
以下是資料來源2的截圖:


       所以,我們就去ping來得知這些網站的IP
1)強制google安全搜尋 -> 216.239.38.120
(2)強制bing安全搜尋 ->204.79.197.220
(3)強制youtube安全搜尋 ->216.239.38.120


         所以我想用用滑鼠點兩下,電腦教室學生機強制安全搜尋
檔案名稱:ForceSafeSearch.cpp
內容:
#include <fstream>
using namespace std;
int main() {
  ofstream outfile;
  outfile.open("C:\\Windows\\System32\\drivers\\etc\\hosts", std::ios_base::app);
  outfile << "204.79.197.220" <<" "<<"www.bing.com"<<endl; 
  outfile << "216.239.38.120" <<" "<<"www.google.com"<<endl;
  outfile << "216.239.38.120" <<" "<<"www.google.com"<<endl;
  outfile << "216.239.38.120" <<" "<<"www.youtube.com"<<endl;
  outfile << "216.239.38.120" <<" "<<"m.youtube.com"<<endl;
  outfile << "216.239.38.120" <<" "<<"youtubei.googleapis.com"<<endl;
  outfile << "216.239.38.120" <<" "<<"youtube.googleapis.com"<<endl;
  outfile << "216.239.38.120" <<" "<<"www.youtube-nocookie.com"<<endl;
 outfile << "[2001:4860:4802:32::78]" <<" "<<"www.google.com"<<endl;
  outfile << "[2001:4860:4802:32::78]" <<" "<<"www.google.com.tw"<<endl;
  return 0;
}
結果:
1.打開 C:\Windows\System32\drivers\etc\hosts。可看到:


資料來源:
1.How to append text to a text file in C++?
2.How to: Enforcing Google SafeSearch, YouTube, and Bing

2020年6月7日 星期日

C++程式_用指標改寫轉置4x4的陣列演算法

        最近利用C++ 程式讀取config.txt後,將部分工作快速完成。開始又去回顧C++語言、資料結構與演算法。往年讀資料結構與演算法,只是應付考試。而演算法又需要大量數學驗證,不覺得能解決問題。因此,重新讀[演算法之美:隱藏在資料結構背後的原理(C++版)],並將心得與相關筆記記錄下來。希望能對資料結構與演算法有新的認識。
Chap2:指標與陣列--也談中國古代兵制
1.請用指標改寫轉置4x4的陣列
陣列寫法:
#include <iostream>
using namespace std;
int main() {
int a[4][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
int i = 0;
int j = 0;
int tmp = 0;
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;

for(i=0;i<4;i++) {
for(j=i+1;j<4;j++) {
tmp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = tmp;
}
}

 for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
觀念:
1.指標
        int a[4][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *p;
p = &a[0][0];
        或者
        int *p = a;
範例程式碼
#include <iostream>
using namespace std;
int main() {
        int a[4][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *p;
p = &a[0][0];
        int i,j;
        for(i=0;i<4;i++) {
             for(i=0;i<4;i++) {
                 cout <<*(p+4*i+j)<<" ";
             }
             cout <<endl;
         }
}
改寫:
#include <iostream>
using namespace std;
int main() {
int a[4][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *p;
int temp;
p = &a[0][0];
//呈現原始陣列
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
       cout <<*(p+4*i+j)<<" ";
}
cout <<endl;
}
//轉置
for(int i=0;i<4;i++) {
for(int j=i+1;j<4;j++) {
   temp = *(p+4*i+j);
   *(p+4*i+j)= *(p+4*j+i);
   *(p+4*j+i) = temp;
}
}
//呈現轉置後陣列
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
       cout <<*(p+4*i+j)<<" ";
}
cout <<endl;
}
return 0;
}
   
資料來源:
1.書籍:演算法之美:隱藏在資料結構背後的原理(C++版)
2.C++ Template 筆記

2020年6月5日 星期五

MongoDB入門_筆記與學習心得

自從學了Node.js入門。發現Node.js需要跟MongoDB搭配,深深覺得MongoDB是下一個學習的重心。因此將所學的內容整理。

1.基本觀念:

MongoDB                      VS                  關聯式資料庫(MySQL)
database                         <->                        database
collection                       <->                        table
document                       <->                        record

*不同的地方:資料長度可不同

2.使用方法
(1).建立 database:Blog
(2).建立 collection:Posts,Categories,Tags
(3).建立 document:Post:{"_id":"","title":""}

Blog
  Posts
     {"_id":1,"title":"Posts title01"}
     {"_id":2,"title":"Posts title02"}
     {"_id":3,"title":"Posts title03","delfg":1}
 Categories
     {"_id":1,"title":"Categories title01"}
     {"_id":2,"title":"Categories title02"}
Tags
     {"_id":1,"title":"Tags title01"}
     {"_id":2,"title":"Tags title02"}
     {"_id":3,"title":"Tags title03"}

2.指令:

操作實例:
$mongo
> help

> exit
$mongo
>show dbs;
>use Blog
>db.createCollection("Posts")
>db.createCollection("Categories")
>db.createCollection("Tags")
>show collections
>show dbs

>db.stats()
>db.dropDatabase()
>show dbs

3.Collection 實作

操作實例:
$mongo
>show dbs
>use Blog
>show collections
>db.createCollection("Posts")
>show collections
>db.Posts.renameCollection("Tags")
>show collections
>db.Tags.drop()
>show collections
>db.dropDataBase()
>show dbs

4.Document實作

操作實例:
mongo
>show dbs
>use Blog
>show collections
>db.createCollection("Posts")
>db.Posts.insert({
  title:"Posts title01",
  content:"Posts content01"
})
>show collections
>db.Posts.find()
>db.Posts.insert({
  title:"Posts title02",
  content:"Posts content02",
  tag:["Posts tag02"]
})
>db.Posts.find()
>for(var i = 3;i<=10;i++){
   db.Posts.insert(
      title:"Posts title0"+i
      content:"Posts content0"+i
   );
}
>db.Posts.find()
>db.Posts.count()
>db.Posts.remove({})
>db.Posts.count()

>db.Posts.find()

5.限制條件的文檔db.find

觀念:
db.[collection_name].find({"":""})
$gte 大於等於 >=
$gt 大於 >
$eq 等於 =
$ne 不等於
正規表示法:/k/,/^k/
/k/   :帶有k的
/^k/ :不帶有k的
db.[collection_name].distinct("field_name")

操作實例:
mongo
>use Blog
>db.Posts.remove({})
>db.Posts.insert({title:Posts title01,"rank":2,"tag":"game"})
>db.Posts.insert({title:Posts title02,"rank":1,"tag":"game"})
>db.Posts.insert({title:Posts title03,"rank":3,"tag":"it"})
>db.Posts.insert({title:Posts title04,"rank":4,"tag":"game"})
>db.Posts.insert({title:Posts title05,"rank":7,"tag":"it"})
>db.Posts.insert({title:Posts title06,"rank":4,"tag":"game"})
>db.Posts.find({"tag":"game"})
>db.Posts.find({"rank":{$gte:4}})
>db.Posts.find({"rank":{$gt:4}})
>db.Posts.find({"rank":{$lte:4}})
>db.Posts.find({"rank":{$lt:4}})
>db.Posts.find({"title":/Posts/})
>db.Posts.distinct("tag")

6.複雜條件:

觀念:
db.[collection_name].find({"":"","":""})
進行多個條件
db.[collection_name].find({$or:[{...},{...}]})
進行多個條件、[or]、[and]運算
db.[collection_name].find({"":{$in:[...]}})
進行關聯式資料庫的select_in
db.[collection_name].find({"":{$exists:true}})
進行[存在]就列出

操作實例:
$mongo
>use Blog
>db.Posts.find()
>db.Posts.insert({"title":"Posts title09 u","istop":true})
>db.Posts.find({"title":/u/})
>db.Posts.find({$or:[{"title":/u/},{"rank":{$gte:4}}]})
>db.Posts.find({"rank":{$in:[3,4]}})
>db.Posts.insert({"title":"Posts title08","istop":true})
>db.Posts.find({"istop":{$exists:true}})



7.列出指定條件下的document

 觀念:
db.[collection_name].find({},{field1:true,field2:1})
列出field1是真的,field2:是的文檔


操作實例:
$mongo
>use Blog
>db.Posts.find()
>db.Posts.find({},{title:true,rank:1})
>db.Posts.find({},{title:true,rank:1,_id:0})

  隱藏_id 


8.document 的方法 sort limit skip

  觀念:
sort()

document的排序
limit() ex:limit(5)

document的限制列出 ex: 列出5個document
 skip() ex:skjh(5)
document的跳過列出 ex跳過5個document
操作實例:
$mongo
>use Blog
>db.Posts.find()
>db.Posts.find({},{_id:0}).sort({rank:1})

rank:1 升冪排序
 >db.Posts.find({},{_id:0}).sort({rank:-1})
rank:-1 降冪排序
>db.Posts.find({},{_id:0}).limit(3)
預設排序,前三個document
>db.Posts.find({},{_id:0}).sort({rank:-1}).limit(3)
>db.Posts.findOne({},{_id:0})

只要第一條document
>db.Posts.find({},{_id:0})
>db.Posts.find({},{_id:0}).limit(3)
>db.Posts.find({},{_id:0}).skip(3).limit(3)

  9.document的更新update

觀念:
update(<filter>,<update>,<options>)

操作實例:
$mongo
>use Blog
>db.Posts.findOne({title:"Posts title01"})
>db.Posts.update({title:"Posts title01"},{set:{"rank":10}})
>db.Posts.find()
資料來源:
1.MongoDB入門
2.DB-Engines Ranking
3.MongoDB學習
4.MongoDB官網
5.30天之你好MongoDB 系列


2020年6月3日 星期三

只要會複製貼上,快速產生一學年課程所需帶有連結的index.html

      上資訊課。有時需要配合其他處室的宣導,在課程中需要到其他網站。利用該網站的資源,進行課程。一學年過去了,也知道要利用哪些網站。如果能利用config.txt,將這些網站名、網站連結列在config.txt。寫個C++的程式去讀取這個config.txt,產生課程所需帶有連結的index.html。我只要將index.html放進電腦教室的伺服器。讓教師機與學生機的chrome瀏覽器。這個chrome其中一個分頁指向伺服器的index.html。換句話說,只要老師示範,打開chrome那個分頁,就可以看到一整學年課程所需的網站連結。對於資訊組長管理電腦教室也很方便,只要一學年改一次config.txt,自動產生一學年課程所需帶有連結的index.html。然而,現在的問題是沒有伺服器。自從網站集中化之後,學校內部沒有伺服器。該怎麼辦呢?
使用方法:
1.下載rar:檔案下載     zip:檔案下載
2.解壓縮,解壓密碼demo1234
3.修改設定檔config.txt
4.對資料夾內的HtmlGenerator.exe 點兩下
5.會產生index.html
6.將此index.html放入電腦教室的伺服器,完成。


以下是程式內容與相關說明:
檔名:config.txt
內容:

檔名:HtmlGenerator.cpp
內容:
#include <iostream>
#include <fstream>
#define MAX_FILENAME 100
#define MAX_TotalNumber 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

struct UD {
char CName[MAX_FILENAME];
char httpUrl[MAX_FILENAME];
}; 
main() {

/*讀取設定檔的變數*/
    char titlemark[MAX_FILENAME];
    char title[MAX_FILENAME];
    char UDmark[MAX_FILENAME];
    struct UD UD[MAX_TotalNumber];
    int TotalNum;
/*讀取設定檔config.txt,並將設定寫入變數*/
    ifstream fin("config.txt"); 
    if(!fin) { 
        cout << "無法讀入檔案\n"; 
        return 1; 
    }
        fin >> titlemark;
        fin >> title;
fin >> UDmark;
        TotalNum = 0;
   //讀取網站中文名稱_網址
          while(!fin.eof()) {
           fin >> UD[TotalNum].CName >> UD[TotalNum].httpUrl;
   TotalNum++;
    if (TotalNum>=MAX_TotalNumber) {
      cout <<"\n警告!!讀取名稱與對應IP資料數超過1000!!\n需修改原始碼MAX_TotalNumber並重新編譯!!\n";
    }
  }  
    fin.close();
    
/*產生 index.html*/
    char chFileName[MAX_FILENAME];
    FILE * fp;
    int i;
    sprintf(chFileName, "index.html");
    fp = fopen(chFileName, "w");    
    fprintf(fp, "<html>\n");
    fprintf(fp, "<head>\n");
    fprintf(fp, "<title>\n");
    fprintf(fp, "%s\n",title);
    fprintf(fp, "</title>\n");
    fprintf(fp, "</head>\n");
    fprintf(fp, "<style type='text/css'>\n");
    fprintf(fp, "<!--\n");
    fprintf(fp, ".style {font-size: 36px}\n");
    fprintf(fp, "-->\n");
    fprintf(fp, "</style>\n");
    fprintf(fp, "<body>\n");
    fprintf(fp, "<center>\n");
    for(i=0;i<=TotalNum-1;i++) { 
   /*網站中文名稱_網址(對應總數需小於等於1000)*/
    fprintf(fp, "<br><span class='style'><a href='%s' class='style2' target='_blank'>%s</a></span><br>\n",UD[i].httpUrl,UD[i].CName);
}
fprintf(fp, "</center>\n");
        fprintf(fp, "</body>\n");
fprintf(fp, "</html>\n");
fclose(fp);
    return 0; 
}
最後產生的index.html的成品如下:


資料來源:
1.利用C++程式產生的bat來一鍵設定電腦教室的電腦為固定ip或dhcp

在 Windows 10 x64 1909版,使用BAT快速安裝公文系統與人事服務網(自然人憑證)版

相關內容移往 https://skjhcreator.blogspot.com/2021/02/windows-10-x64-1909bat.html