2018/03/29

SAMBA config setting

Linux:Ubuntu 14.04

1.安裝samba
$ sudo apt-get samba

2.設定使用者登入samba的密碼
$ sudo smbpasswd -a youraccount
我使用與登入系統相同的帳號來登入samba,先輸入root的密碼,再輸入兩次youraccount密碼。

3.設定分享資料夾權限
假設你要分享的資料夾是 /home/youraccount/movie,則
$ cd /home/youraccount
$ mkdir movie
$ sudo chmod 755 movie
如果是其他位置的資料夾,要看有沒有權限存取,否則分享後看得到,但可能無法讀寫。

4.設定samba config
$ sudo gedit /etc/samba/smb.conf
加入以下設定
 //----------add in to smb.conf as below----------//
[movie]
comment=favory movie
path=/home/youraccount/movie
browseable=yes
writable=yes
read only=no
force user=youraccount
force group=youraccount's group
create mode =0777
directory mode=0777
//--------------------end--------------------//

6.重啟samba服務
$ sudo service smbd restart

7.從windows端存取samba分享的movie資料夾
開啟檔案總管,在網址列打入\\ubuntu's ip\movie\
理論上這樣就成功囉~ 

參考: 鳥哥 SAMBA

2013/12/20

VMware Bridged類型網卡不通

小弟在本機上先安裝了virtual box,並自動產生了virtual box所需的網路橋接裝置-->VirtualBox Host-Only Network,
其後又安裝了另外一套VMware workstation,並在VMware下建立了Guest OS(Fedora),
在GuestOS的Network Connection當中,設置為Bridged,以便於網路上的其他主機能直接存取Fedora,
Fedora的network settingk則是使用static ip的方式,
剛開始使用一切都正常,直到有天關機後再開啟,才發現Fedora無法對外連線,
但是VMware底下的其他Guest OS 只要是使用NAT的方式都能正常連線,唯獨bridge有問題,
查了一下才發現原理是這樣的--->
VMware安裝完後,會生成三個網路橋接裝置,分別為VMnet0,VMnet1,VMnet8(詳細請自己搜尋),
其中Bridged模式走的是VMnet0,此橋接裝置會將Guest OS的網卡導到Host實體機器的網卡上,
但是若實體機器有多張網卡時,則會依照設定值決定導到哪一張實體網卡上,
設定值有兩種:Automatic or 某一張實體網卡,
我在VMware安裝完後從未進來設定過,其預設值為Automatic,
But!!!VMware 將 VirtualBox Host-Only Network 也當作是實體網卡!!!
所以導致Fedora or Guest OS 不管怎麼修改設定,都無法連到真正的實體網路~~~><~~~

所以,解決方法就是
1.進入VMware Network Editor->點選VMnet0-->下方WMnet Information-->在Bridged to的下拉式選單中選擇一張實體網卡!
或是
2.右方的 Automatic Settings內,將VirtualBox Host-Only Ethernet Adapter的勾選取消,Bridged to的下拉選單仍維持 "Automatic"

搞定,收工!

ref: VMWare虛擬機Bridged類型網卡ping不通的原因和解決辦法

2013/11/21

[MFC] TreeCtrl使用問題

前提:TreeCtrl需帶有 "Check Boxes"屬性
問題一:
OnInitDialog時,在treectrl內新增item後,需要將此項目的checkbox勾選,但是SetCheck卻無效?
回答一:
若要在初始化時期就設定treectrl's check box狀態,且在UI上表現出來,需在設定check box前,重新設定一次tree ctrl屬性!
若是在OnInitDialog以後的function內設定treectrl's check box,則無此問題。
BOOL TestDlg::OnInitDialog() { CDialog::OnInitDialog(); //TODO: mTreectrl.ModifyStyle( TVS_CHECKBOXES, 0 ); mTreectrl.ModifyStyle( 0, TVS_CHECKBOXES ); //在這之後新增的item就可以設定check box為有勾選狀態 HTREEITEM hCurItem = mTreectrl.InsertItem("Test"); mTreectrl.SetCheck(hCurItem,true); }
問題二:
當勾選/取消溝選Tree上任一Item後,要如何自動選擇目前的Item,而非總是選擇第一個Item?
回答二:
需要在Click事件動手腳!
方法1:
void TestDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此加入控制項告知處理常式程式碼 *pResult = 0; //不正當寫法 //copy from OnTvnSelchangedTree LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); // pNMTreeView->ptDrag; //此point無法直接換算取得目前點擊的Item CPoint pt; pt.x = pNMTreeView->ptDrag.y; // 此point位置無法理解. pt.y = pNMTreeView->itemNew.lParam; // 此point位置無法理解. HTREEITEM hCurItem = mTreectrl.HitTest(pt); if(hCurItem == NULL) return; //CString szText = mTreectrl.GetItemText(hCurItem);//驗證用,非必須. mTreectrl.SelectItem(hCurItem); }
方法2:
void TestDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此加入控制項告知處理常式程式碼 *pResult = 0; //正常寫法 CPoint pt; GetCursorPos(&pt); mTreectrl.ScreenToClient(&pt); HTREEITEM hCurItem = mTreectrl.HitTest(pt); if(hCurItem == NULL) return; //CString szText = mTreectrl.GetItemText(hCurItem);//驗證用,非必須. mTreectrl.SelectItem(hCurItem); }
方法1知道原理的朋友,歡迎留言解釋一下,感恩!

2013/08/29

[VC]GDI+繪圖

上次寫了一個GDI+做漸層效果,今天要再用就忘了一些步驟,所以把整個流程寫上來。

Step1.在stdafx.h中加入GDI+的Header file

#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

Step2.在CWinApp中加入成員變數

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
在CWinApp::InitInstance()中初始化GDI+資源

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Step3.至此,你的程式即可開始使用GDI+囉~

Step4.程式結束前,需釋放GDI+資源,請在CWinApp::ExitInstance()中加入:

GdiplusShutdown(gdiplusToken);

以小弟需求來說--->漸層<---以下程式碼請參考:
/*****MyClass.h*****/
class CMyClass:public CWnd
{
DECLARE_DYNAMIC(CMyClass)
public:
 CMyClass();
 virtual ~CMyClass();  

protected:
 afx_msg void OnPaint();
 
private:
 Gdiplus::PointF  m_gdiPoint1,m_gdiPoint2;
 Gdiplus::Color  m_gdiColor1,m_gdiColor2;
};

/*****MyClass.cpp*****/
CMyClass::CMyClass()
{
 vm_gdiPoint1 =PointF(0,0);
 vm_gdiPoint2 =PointF(0,18);
 vm_gdiColor1 =Color(255,255,255);
 vm_gdiColor2 =Color(0,0,0);
}

void CMyClass::OnPaint()
{
 CPaintDC dc(this);
 CRect rcBar;
 GetClientRect(&rcBar);
 //GDI+
 Gdiplus::LinearGradientBrush  gdiBrush(m_gdiPoint1,m_gdiPoint2,m_gdiColor1,m_gdiColor2);
 Gdiplus::RectF gdiRc((Gdiplus::REAL)rcBar.left,(Gdiplus::REAL)rcBar.top, (Gdiplus::REAL)rcBar.Width(),(Gdiplus::REAL)rcBar.Height());
 Graphics grThis(dc.m_hDC);
 grThis.FillRectangle( &gdiBrush, gdiRc);
}

ref:CodeProject_GDI+
ref:MSDN_GDI+