FLAMEc隨手記

一陣風飄過~~~

0%

最近用xampp做了一個簡單的php網頁,

剛好碰到將網頁移動到iis系統上狀況,

於是碰到mysql和mssql使用上差異~

連接到mysql如下~

1
2
3
4
5
6
7
8
9
10
$server_name = 'localhost';
$username = 'flamec';
$password = '123456789';
$db_name = 'test';

$conn = new mysqli($server_name, $username, $password, $db_name);

if ($conn->connect_error) {
die('資料庫連線錯誤:' . $conn->connect_error);
}

連接到mssql如下~

1
2
3
4
5
6
$connectionInfo = array( "Database"=>$db_name, "UID"=>$server_name, "PWD"=>$password );
$conn = sqlsrv_connect( $server_name, $connectionInfo);

if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

語法都差不多,但結果尚有點差異~
mysql的select~~~

1
2
3
4
5
6
7
8
9
$sql = "SELECT * FROM testtable";
$result = $conn->query($sql); //1

if ($result->num_rows > 0) { //2
// 输出数据
while($row = $result->fetch_assoc()) { //3
print_r($row);
}
}

mssql的select~~~

1
2
3
4
5
6
7
8
9
10
$sql = "SELECT * FROM testtable";
$result = sqlsrv_query($conn, $sql); //1

if($result === false) { //2
die(print_r(sqlsrv_errors(), true));
}

while($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { //3
print_r($row);
}

最主要差異就是上面註解1~3的地方~~~

其他大部分相同~~~

但是有些mysql語法mssql不支援,比如limit…

如果要讓兩邊方便切換可以減少使用,就能快速切換~~~

最近因為工作上需要研究了Asp .Net Core Razor~~~

個人之前剛用過php舊寫法,對於網頁呈現方式看起來還可以~~~

但是偏偏找不到起始頁面到底是從哪裡設定的0.0…

網路上有許多說法…

有在專案屬性中設定,有右鍵選單指定?

可能是版本關係都不能用~!!

我目前是使用VS2022,舊專案應該也是用相去不遠版本產生的!!!

經過各種查詢和開專案測試…確認如下!!!

  1. 預設會執行index頁面,副檔名很多,可能是cshtml或.razor…

  2. 實際指定情況是@page,如沒有加字串應該就是用檔名,如home.cshtm的狀況下@page大概就等於@page “/home”

  3. 設定預設執行哪邊請用@page “/“,如果有index頁面請對index設定其他@page “/其他值”,避免有兩個預設頁面出錯

以上大概是今天研究成果,感覺上進度大大增加XDD

知道從哪邊開始就是不一樣~~~~~~~~~~~

今天又碰到爬樓梯的問題~~~

是leetcode的題目,題目如下(直接複製的):

You are climbing a staircase. It takes n steps to reach the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

之前也碰過但沒詳細研究為什麼這樣會對!!!

這次就要把整個過程記下來避免忘記~~~

網路上常看到說要爬到n-1步和n-2步加起來~~~

也沒細說為什麼…後來我靈光一閃是這樣的XD

因為我們只能走1步或2步~~~

所以當我們到達第N樓梯的時候~~~最後一步只有兩種可能!!!

踏上N樓梯的最後一步只有兩種狀況 跨一步跨兩步

所以我們只需要知道跨一步有幾種可能和跨兩步有幾種可能,加起來就是答案~~~

因為最後步伐不同所以不會有重複情況!!

然後往回推~~~最後跨一步有幾種可能也是一樣!!

最後跨一步也是由 走一步 和 走兩步 可能和計算出來~~~

同理最後跨兩步也是一樣~~~

用這樣解法逆推到一開始就會得到答案!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int climbStairs(int n) {
if( n < 3 )
{
return n;
}

std::vector<int> nstep(n,0);
nstep[0] = 1;
nstep[1] = 2;

for(int i = 2; i < n; i++)
{
nstep[i] = nstep[i - 1] + nstep[i - 2];
}

return nstep[n - 1];
}

上面這方法可以將nstep存起來,重複使用!

之前學習Unreal 5的時候有製作小遊戲~

那時候主要目的是測試DataTable~

那時候有微軟的Excel可以輸出csv檔案~

編輯起來很方便~

但是回到家裡後沒有Excel可以用!!

整個改資料就很麻煩,相對麻煩~

後來在UE商店有看到直接使用Google Sheet資料的影片~

就決定找方法把Google Sheet資料抓下來填充!!

先從Unreal的Module開始研究起~

Win11點uproject右鍵要先用左鍵點選,再點右鍵才會出現Generate Virsual Studio project file

然後決定使用plugin來製作~

最後成果 Unreal5GoogleSheetDataTable

這個方法是直接共享sheet,更好方法需使用google私密金鑰!!之後再研究~

是leetcode的題目,題目如下(直接複製的):

Given an array of integers nums, sort the array in ascending order and return it.

You must solve the problem without using any built-in functions in O(nlog(n)) time complexity and with the smallest space complexity possible.

心得:

簡單說大概就是自己寫排序不要用已經有的排序吧!!

一開始我是用較常用的排序法QuickSort就上了!!!

結果超時!!!!!!!!!

結果超時!!!!!!!!!

猜測大概是會排序到對QuickSort來說最壞狀況的陣列,剛好超時吧!?

所以稍微找了一下更快的排序法~

  1. MergeSort 合併排序法
  2. TimSort Tim排序法

研究後發現兩者有一定關係,TimSort像是MergeSort優化版本,或著說加強版。

TimSort會將數列分割成一定大小,然後先用InsertSort排序,之後才開始用MergerSort合併。

最後實作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class Solution {
public:
//插入排序法,小數量很穩
void insertSort(vector<int>& nums,int left , int right)
{
for(int i = left + 1; i <= right; i++)
{
int val = nums[i];
int j = i - 1;
while(j >= left && nums[j] > val)
{
nums[j+1] = nums[j];
j--;
}
nums[j+1] = val;
}
}

//MergeSort,看網上TimSort資料這邊也有優化,似乎把一個一個檢查改成跳幾個檢查
void merge(vector<int>& nums,vector<int>& cpyBuff,int left , int mid , int right)
{
int leftn = 0,rightn;
for(int i = left; i <= mid; i++)
{
cpyBuff[leftn] = nums[i];
leftn++;
}

int len = mid - left;
leftn = 0;
rightn = mid + 1;
//兩個排序數列找小的放前面
while(leftn <= len && rightn <= right)
{
if(cpyBuff[leftn] > nums[rightn])
{
nums[left] = nums[rightn];
rightn++;
left++;

}
else
{
nums[left] = cpyBuff[leftn];
leftn++;
left++;
}
}

while(leftn <= len)
{
nums[left] = cpyBuff[leftn];
leftn++;
left++;
}

while(rightn <= right)
{
nums[left] = nums[rightn];
rightn++;
left++;
}
}

vector<int> sortArray(vector<int>& nums) {
int n = nums.size();
int run = 32; //分割大小,稱為Run
for(int i = 0 ; i < n; i += run)
insertSort(nums,i,std::min(n - 1 , i + run - 1));

int cpySize = run;
while(cpySize < n)
{
cpySize *= 2;
}
cpySize = cpySize >> 1;
std::vector<int> cpyBuff(cpySize);
for(int size = run; size < n ; size *= 2)
{
for(int i = 0; i < n; i += size * 2)
{
int mid = i + size - 1;
if(mid >= n)
continue;
int right = std::min(n - 1 , mid + size);

merge(nums,cpyBuff,i,mid,right);
}
}

return nums;
}
};