2017年11月28日 星期二

Centos7 配置 Samba 共享資料夾和印表機

Centos7 配置 Samba 共享資料夾和印表機

弄了好久,看了往上好多文章大多數中文的都是那幾篇的變形,照著做還是開不起來,其中中有很多原因,他們只提到一部分而已我猜應該不是全新作業系統去安裝的教程,或者是更新之後變的更安全需要額外開啟權限。
設置完畢之後直接從Windwos上的資料夾打上 \ip 即可連接上,進入網路上的芳鄰是看不到的。

Samba初始化過程

配置完成即可連上,並可見登入使用者的目錄
# 配置smb.conf
vi /etc/samba/smb.conf
[User1]
    read only = No
    guest ok = No
    valid users = user
    browseable = yes

# 新增帳號+重設密碼
smbpasswd -a user
# 刪除帳號
pdbedit -x user

#防火牆允許通過
firewall-cmd --permanent --zone=public --add-service=samba
#SElinux允許通過
setsebool -P samba_enable_home_dirs 1
setsebool -P samba_export_all_ro 1
setsebool -P samba_export_all_rw 1

# 設置文件屬性(好像不用不行再打)
chcon -R -t samba_share_t /home/chg
semanage fcontext -a -t samba_share_t "/home/chg(/.*)?"

# 重新啟動 Samba
systemctl restart smb
# 查看 Samba 是否正確運行中
systemctl status smb

#其他 Samba 指令
systemctl start smb
systemctl enable smb

建立公用資料夾 (大家看的到)

# 新建資料夾
mkdir /var/samba_share
mkdir /var/samba_share/public

# 資料夾更改權限(任何人可見可修改)
chmod 777 /var/samba_share/public
# 資料夾改權限(任人可見僅擁有者可修改)
chmod 755 /var/samba_share/public

# 修改 vi /etc/samba/smb.conf 文件
[public]
    public = yes
    path = /var/samba_share/public
    browseable = yes
    writable = yes
    guest ok = yes

# 重新啟動 Samba
systemctl restart smb

新增其他使用者

如果要新增第二個使用者需要做的步驟有
  1. 加入samba群組 smbpasswd -a user
  2. 配置 smb.conf 文件
  3. 重啟 samba 伺服器 systemctl restart smb

關於SElinux

沒有關閉預設狀態什麼都不能用,必須設置指令開啟才可以使用
他自己從右上角通知跳出來警告,然後警告裡面有教怎麼做
#暫時關閉SElinux(重開機會啟動)
setenforce 0
#確認有無關閉SElinux
getenforce

#開通三個布林值
setsebool -P samba_enable_home_dirs 1
setsebool -P samba_export_all_ro 1
setsebool -P samba_export_all_rw 1

#這兩個警告跳出來的要我按,我不確定要幹嘛的
ausearch -c 'smbd' --raw | audit2allow -M my-smbd
semodule -i my-smbd.pp

windwos端設定

開進去網路芳鄰之後直接點印表機右鍵連線就可以用了。
注意:要記住使用者名稱
如果不記住下一次開機的時候就需要重打,到這邊還不是問題就重就好了;會出問題的是 AdobeReader、Office 這些軟體有列印的功能的,一打開就會偵測印表機這時候因為沒有帳密就偵測不到,結果就是沒有回應整個白白的卡住要等個幾分鐘他才會放棄偵測,此時才正常打開 word 或 pdf。
如果要用指令的方式配置,我查了一些指令設置如下
# 安裝裝驅動
pnputil -a \\driver.inf

# 連線至印表機
rundll32 printui.dll,PrintUIEntry /in /n \\YourIP\dcp7040

# 新增主機名稱
set hostdir=%SystemRoot%\System32\drivers\etc\hosts
echo. >> %hostdir%
echo YourIP ServerName >> %hostdir%
START %SystemRoot%\explorer.exe \\ServerName
上面的方式其實還是要人去點,有嘗試想寫無人職守的方式,不過遇到不少問題,最後我放棄了QuQ

其他

2017年11月26日 星期日

Windows系統 GPT(EFI) 轉 MBR 無損資料可開機不須重灌系統

Windows系統 GPT(EFI) 轉 MBR 無損資料可開機不須重灌系統

如果是反過來 MBR->GPT 的請參考:
http://charlottehong.blogspot.com/2017/11/windows-mbr-gptefi.html

需要一個獨立系統

需要一個獨立系統,這裡建議把硬碟拆下來裝在第二台台電腦上並安裝以下軟體;其他方法可以在USB安裝WindowsRE用USB啟動去做,因為有些複雜就不介紹了,這裡會用第二台電腦做說明。
需要軟體diskgenius:http://www.diskgenius.cn/download.php
出狀況不要擔心也不要緊張亂弄!都可以救回來參考這一篇。
https://charlottehong.blogspot.tw/2018/03/efi-mbr.html

GPT -> MBR

這裡要特別注意!只能在 DOS模式或是PE上轉換,實測在Win10上轉換會失敗!
進入DOS模式
圖中之所以變成灰色的是因為 UEFI 設置須改為 (錯誤的說法是BIOS不過這樣應該比較清楚)
  • 打開 CMS(支援MBR啟動)
  • 關閉快速啟動
1.分割調整至4個以內,EFI分區可直接移除
2.直接轉成MBR -> 然後重啟系統或拔掉重插

3.將啟動分區標記為”啟動”
4.下面指令重新寫入BIOS引導文件
這時候系統MBR是沒有開機引導的,必須手動
  • [1]. 標記啟動分區 (剛剛做了)
  • [2]. 修復 MBR 開機引導 (導入bootmgr 文件)
  • [3]. 重建 BCD 選單
打入下面 cmd 指令即可(包含 [2][3]),也可以寫成bat批次檔,做批處理
# C是你的系統曹,第二個C是啟動磁區(如果有分開這裡要改)
bcdboot C:\windows /f BIOS /s C:\ /l zh-tw
分開指的是向 Win7 重灌的的時候多出 100M 的空間用來放
  • 標記啟動磁區
  • bootmgr 文件
  • bcd 選單
這時候系統曹可以是邏輯分區~實現單MBR硬盤安裝超過4個系統,之所以大家多不可以是因為非主分區不可以被標記成啟動
原理就是標記100M啟動這個100M內的bcd選單,再來由bdc選單決定開起哪個系統核心 x:\windows\system32\winload.exe

前面那一小段也可以切成啟動磁區,就是安裝Win7會跑出來的那個100M(Win10是300M),格式不限NTFS或者是FAT都可以,唯一條件就是必須標記為啟動。
因為也不大,100M~500M不痛不癢建議留著之後方便
如果要求完美軟體內可以合併空間。不過之後反悔也可以無損切回來啦~

Windows系統 MBR 轉 GPT(EFI) 無損資料可開機不須重灌系統

Windows系統 MBR 轉 GPT(EFI) 無損資料可開機不須重灌系統

重新寫一篇比較簡潔的文章,有影片操作過程,建議直接看這篇
- [圖/影] 升級 Windsows11 不用重灌 MBR 轉 GPT
   https://charlottehong.blogspot.com/2022/02/windsows11-mbr-gpt.html
- 如果是反過來的 GPT -> MBR 請參考:

快速轉換 mbr2gpt

這個是微軟內建的轉換工具,可以安心使用。
這個有條件限制,必須是三個主分區以內才能轉,其他任何狀況都會出問題。
操作前要注意主機板有沒有支持EFI啟動。(英特爾第二代開始H61以後都有)
使用方式比較簡單,不用第二台電腦,直接在需要轉換的電腦操作下面步驟:
  1. 開啟 RE or PE 中的 命令提示符
    (按住SIFT->再按重新開機->疑難排解->命令提示字元)
  2. 重啟之後會需要選擇帳號,並輸入密碼再來會開啟終端機
  3. 輸入 mbr2gpt /validate 檢查是否可轉
  4. 輸入 mbr2gpt /convert 轉換完畢
  5. 重新啟動

關於 [1] 還有另一種是PE,光碟在安裝的時候按SIFT+F6,會跳出命令提示字。
關於 [5] 一般有支持EFI啟動的主機板,預設狀態都是同時支援EFI與MBR的;可以先重開看看,不能再去設置調整,不知道怎麼調整就直接重設也可以~

上圖找不到命令提示符
是因為救援系統RE分區被砍掉了,可以從以下站內文重新開啟
https://charlottehong.blogspot.tw/2018/02/windows-re.html
有遇過 [2] 的時候明明有系統管理員帳號卻是顯示空白的狀況;
遇到的話從光碟或USB開啟吧~或參考下面手動設置說明。
詳細的 mbr2gpt.exe 說明可以參考微軟網站:
https://docs.microsoft.com/zh-cn/windows/deployment/mbr-to-gpt









以下是舊文,上面介紹的工具比較簡單也無風險,但是有一些條件限制。
如果遇到條件限制轉不過去才需要做下面的步驟。


前言

大概補一下前言知識GPT跟MBR是磁碟格式,以前的主機板內的韌體叫做BIOS他是16位元的,後來出了EFI大概一年就淘汰換UEFI。
BIOS基於16位元的關係磁碟最多就只能切2T,所以你如果裝1顆3T的硬碟,要麼你切1T+2T要麼就只能換GPT。
MBR 最多切4個分區,擴展分區全部和算算一個,如果要在同一顆硬碟安裝4個以上的系統需要一些技巧。
UEFI可以支援傳統MBR模式開機,這個選項叫做CSM開啟之後也可以讀到,不過今年開始新版的UEFI拿掉了CSM,XP已經成為歷史沒辦法在新主機板安裝了。
UEFI多了安全開機,系統必須有被他檢測過才可以開機,這導致linux安裝稍微麻煩了點(是能裝的)。
UEFI 多了快速啟動開機可以神速開到桌面,不過啟動條件比較多需要 1.系統本身支持並啟用 2.安裝系統的時候選用EFI安裝 3.主機板支持並且啟用該功能 4.其他周邊硬件:如顯示卡。
此外IDE跟AHCI是另一回事,這個也可以無損轉要補驅動但是建議重灌保險;轉了之後比較容易發生衝突問題變得怪怪的。

開機引導

UEFI的開機管理比較特別一點,可以由BIOS裡面決定要開哪一個系統,對就是選系統(也就是EFI內的哪一個啟動文件),有趣的是這個選擇完畢開進去之後也會啟動grub或bcd,然後又可以再選一次系統。
以往MBR的硬碟BIOS只能決定開哪一個硬碟的grub或bcd無權決定開誰,之後再由grub或bcd決定開哪一個系統(這時候也可以開別的硬碟的系統)。
Linux比較特別的EFI啟動的時候會有兩個EFI文件檔,就是BIOS裡面會看到兩個系統,一個是沒過驗證的grub這個如果安全啟動沒開不能開機,另一個是有過安全啟動驗證的,如果你沒關閉安全啟動記得要選否則預設是grub會黑屏不能開機。
某些筆電設計成必須設置密碼才能選擇載入其他EFI文件選擇第二個系統開機,詳細可以蒐一下參考站內文。


確認你有滿足條件

確定一下你有滿足上面所提的條件,一般就是進入BIOS看一下有沒有一項 Secure Boot安全啟動,這個最好找,有的話就可以啟動EFI了。
顯示卡在自己爬文一下有沒有支持,沒支持也可以拉只是 超級啟動 不能用。

需要一個獨立系統

需要一個獨立系統,這裡建議把硬碟拆下來裝在第二台台電腦上並安裝以下軟體;其他方法可以在USB安裝WindowsPE用USB啟動去做,因為有些複雜就不介紹了,這裡會用第二台電腦做說明。
需要軟體diskgenius:http://www.diskgenius.cn/download.php

轉換流程

記得備份重要資料,避免操作失誤資料遺失
分區如果不見了左上角有個搜尋分割可以救回來

MBR -> GPT

首先擴展分區無法保存資料,請先轉為主分區或備份再重新寫入
某些情況會導致不能讓擴展分區轉為主分區,MBR最多切4個分區(擴展分區則是全部合只算1個),所以如果你切了3個主分區+2個或以上的擴展分區(1個好像也不行),那就沒辦法在同一顆無損轉了,因為轉完之後就超出4個了。
這種情況處理方式建議就拿另一顆來複製資料了。
1.有擴展分區要先處理掉只留主分區
2.直接轉換成GPT -> 然後左上角保存
3.C曹壓縮讓前面空出500M以上的區間
並將其格式調整成EFI,然後保存
再來是新增盤符,需要重開機才可以新增不然會跳錯
(如果是非原生sata的主機板可以熱拔插,拔掉sata線重接就好)
4.下面指令重新寫入EFI引導文件
這時候系統是沒有開機引導的,必須手動
  • 修復EFI開機引導
  • 重建BCD選單
打入下面 cmd 指令即可,也可以寫成bat批次檔,做批處理
# C = 系統槽, Z = EFI槽
bcdboot C:\windows /f UEFI /s Z:\ /l zh-tw

選用::壓縮系統

在效能影響不大的情況下,有效壓縮系統空間
這個隨時都可以[壓縮\解壓縮],開進系統再執行即可。
Windows10 如何啟用 壓縮系統 compactos 霍夫曼壓縮:
http://charlottehong.blogspot.com/2018/03/windows10-compactos.html

2017年11月20日 星期一

[原始碼] C / C++ 旋轉 任意角度的圖片

[原始碼] C / C++ 如何旋轉圖片

首先會用到線性插補可以參考這一篇
https://charlottehong.blogspot.tw/2017/11/bilinear.html

旋轉公式

跟上一篇差不多意思線性插補指的是for迴圈去跑新圖,然後縮放對應回去原圖的座標,因為縮放得之後的點可能比較多或比較少,對應回去就會在非整數整數位置,這時候就看比例給數值。
旋轉也是一樣意思,旋轉過後的的點會正好不在點上,旋轉有兩個公式;另外這兩個公式其實就是仿射轉換的運算過程,只是差別在沒有

公式1 - for跑原圖映射到新圖

一般看到的就是給輸入原圖得出新圖的座標
公式如下:
x' = x * cos(theta) - sin(theta) * y
y' = x * sin(theta) + cos(theta) * y
這樣做會有一種情況是,原圖的點轉換到新圖之後是小數點,把小數點四捨五入之後得出同一個點,導致新圖有某幾點沒被跑到就沒值有空洞。

公式2 - for跑新圖映射回原圖

比較正確的作法是for去跑新圖座標,輸入新圖座標得到舊圖的座標(小數點),然後再利用線性插補補出來。
公式如下:
float r_rot = (j)*sin_t + (i)*cos_t;  // 原圖X座標
float c_rot = (j)*cos_t - (i)*sin_t;  // 原圖Y座標
其中 (j, i) 就是新圖的 (y, x) 座標,sin_t 與 cos_t 則是預先算好的數值,因為計算三角函數很費時,建議提出到for迴圈之外先算好,如果再for回圈內就要不斷的重複運算同一個角度浪費效能。
// 預算
float cos_t = cosf(sita*(float)(M_PI/180));
float sin_t = sinf(sita*(float)(M_PI/180));

原點在哪裡

需要注意的是上圖的公式會以圖的左上角 (0, 0) 作為定點轉換,如果需要從中心點旋轉或是任點轉需要轉換一下座標
假如現在要以 (10, 10) 為中心旋轉,那麼在旋轉前你需要先把for迴圈扣調這個範圍,也就是從 (j, i) 要從負號 -10 開始跑,經過旋轉公式計算出來之後還需要將原本的 10 加回來,這樣就可以獲得正確的位置了。
此外獲得正確位置之後還有一個問題就是旋轉後的圖比旋轉前的圖還要大,勢必會計算出超出原圖範圍的點,跑一個if過濾負號與超出原圖長寬的點即可。

範例代碼

只有給主要函式,有部分是已經寫好的函式庫,我有空再補上完整能跑的
(懶懶的~還沒補上又真的有需要然後看不懂可以直接留言問吧~我會看到的)
ImgRaw rotateImg(const ImgRaw& sou, size_t x, size_t y, float radius, float sita) {
    ImgRaw test = sou;
    //test.at2d(x, y) = 1;
    Draw::draw_arrow(test, y, x, radius, sita, 1);
    test.bmp("rotate_test.bmp");
    // 新圖長寬半徑
    float maxRadius = radius;
    int rotH = floor(maxRadius);
    int rotW = floor(maxRadius);
    ImgRaw rotate(rotW*2, rotH*2, 8);
    // 預算
    sita *= -1; // 把新圖轉回0度
    float cos_t = cosf(sita*(float)(M_PI/180));  
    float sin_t = sinf(sita*(float)(M_PI/180));
    // 跑新圖
    for (int j = -rotH; j < rotH; j++) {
        for (int i = -rotW; i < rotW; i++) {
            // 輸入新圖座標返回舊圖座標(已0, 0為圓心旋轉)
            float r_rot = (j)*sin_t + (i)*cos_t; // 原圖X座標
            float c_rot = (j)*cos_t - (i)*sin_t; // 原圖Y座標
            // 矯正回指定位置
            float rbin = r_rot + x; 
            float cbin = c_rot + y;
            // 去除原圖外的點
            if (cbin < sou.height - 1 and cbin > 0) {
                if (rbin < sou.width - 1 and rbin > 0) {
                    // 雙線姓插補
                    rotate.at2d(j+rotH, i+rotW) = test.atBilinear(cbin, rbin); 
                }
            }
        }
    }
    return rotate;
}
ImgRaw 帶有圖像的
  1. 一維陣列
  2. 長寬
  3. 位元數(彩圖灰圖)
  4. 一些方法
線性插補建議寫成一個讀取的,這樣規劃結構還不錯用 atBilinear(y, x) 要是你輸入的點不正好在點上,比如說 (0.5, 0.5) 就算出這個位置的插補值回傳。
這個函式的功能主要為輸入
  1. 點(y, x)
  2. 角度
  3. 半徑
輸出為
  1. 畫出點與半徑的箭頭
  2. 把點與角度轉正向右
  3. 擷取點為中心半徑的距離
其實就是SIFT算法的一小部分,轉正主角度時用到到的

公式1 的用處

另外公式1也是完全沒有用處,依照適當的情況做選擇;比如說在做sift描述特徵點這一步的時候,需要把圖片旋轉然後取值。
這時候公式1就是轉完之後得知小數點(y, x)位置,sift描述特徵點這裡的重點是原圖有n點n點都要統計到,而不在意準確轉為整數後的位置。
上面所提的是因為我們要輸出來看,要有準確的整數(y, x)位置,公式1轉完之後就變成小數點很難切開,不知道這一點到底是要往上下左右哪邊取整數,極端情況可能還有同一格有兩點。