2015年5月20日水曜日

[Linux] GNU/Linux 分支關係簡述

最近不知道為什麼一直在用Linux...

想說正好趁這次機會把Linux的分支關係寫一下,所以就有這篇了。

一般來說,Linux的分支主要有三大分支,分別為 debian、slackware、redhat。

除了三大分支以外,還有所謂的獨立系。

不過獨立系太麻煩了所以就不寫在這次的範圍內。

雖然說不講獨立系,不過還是大概說一下。

在獨立系中比較有名的是 Gentoo。

而 Google Chrome OS / Chromium OS 也是被歸類為獨立系的系統之一。

Google Chrome OS 從 2010年2月之後,底層從 ubuntu 換成了 Gentoo。

獨立系大概就這個比較重要。



各大分支最大的差異在 package 管理系統。

基本上每家都有自己的管理系統。

管理系統本身分為三個部分,形式、系統本體、前端。

debian 所使用的 package 是 deb 形式,而其管理系統為 dpkg ,前端為 apt。

redhat 所使用的 package 是 rpm 形式。

管理系統為 Redhat Package Manager(RPM),前端為 yum(Yellowdog Updater Modified)。

slackware 的眾多分之中, package 有使用 deb 形式也有使用 rpm 形式,管理系統為 ZYpp。

slackware 分支中的 openSUSE 所使用的即是 rpm 形式配上前端 Zypper/YaST。



某種程度上來說, slackware 是最早的分支版本。所以就從這分支開始說好了。

說到 slackware 大概最有名的就是 S.u.S.E.。

SUSE Linux 在 2003 年被 Novell 買去之後就變成了 open source。

然後改名成為現在的 openSUSE。

不過變成 openSUSE 只是其中一支分支。

除了不用錢的版本當然還是有商用版。

商用版則變成 SUSE Linux Enterprise Server/Desktop(SLES/SLED)。

openSUSE 在 Linux 版本分支的界定上感覺點微妙。

openSUSE 在 package 形式上是使用跟 radhat 一樣的 rpm 形式。

所以好像也有人把 openSUSE 認定為 redhat 分支的一部分?

不過從歷史演化上來看, openSUSE 應該還是屬於 slackware 分支。

slackeware 分支不知道為什麼在亞洲感覺好像快要消失一樣。

甚至不是很多人知道有這麼一個分支存在...

可是這在歐洲明明就是很大的分支...

在亞洲主要還是以 redhat 和 debian 為比較大宗。



debian 分支比較有名的就是 Ubuntu。

debian 在版本釋出時會有四個種類。

一般在使用的 stable 穩定版。

準備用來做下次穩定版的 testing 測試版。

開發者向的 unstable 不穩定版。

變化很劇烈的 experimental 實驗版。

在 debian 的開發順序中

當 package 在 experimental 版玩一玩發現可以用的時候就會丟進 unstable 版。

修正完基本穩定性之後就會進入 testing 版。

當 testing 版確定沒有什麼大問題之後就會變成 stable 版釋出。

而 sid 版指的就是 unstable 版。

testing 和 unstable 最大的差異在系統安全性。

unstable 的版本並不保證系統可以正常的運作。

testing 版則是就算有BUG也能在不影響使用的情況下運作。

stable 就沒什麼特別的...就是很穩定的版本。



redhat 分支則有許多版本。

redhat 分支就有許多有名的版本。

像是 Fedora、RHEL、CentOS。

雖然從分支歷史上來看其實看不出太大的關係。

不過實際關係應該是 Fedora → RHEL → CentOS。

簡單來說 redhat 分支中,Fedora 玩一玩覺得不錯的東西就會丟進 RHEL 裡面。

而將與商用無關的不分丟掉後,就變成了 CentOS。

這是三個版本最主要的關係和差異。

Fedora 的更新速度很快,在穩定之後才會加入 RHEL 裡。

RHEL 除去商用部分,做成 CentOS。

某種程度上來說,Fedora 其實就是 redhat 的測試版。

而 RHEL 則是穩定的商用版。

CentOS 則是穩定的免費版。


簡單來說比較有名的 linux 分支的關係大概是這樣。

當然有些東西表達的並不是非常精確。

不過應該沒有相距太遠意思到了就好XD



相關來源:

CentOSとは (CentOS/RHEL/Fedoraの関係についてまとめてみた)
http://mo-mo.hatenablog.com/entry/2014/02/13/125326

openSUSE と CentOS 全然ちがいますか? どっちが良いですか?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1447579574

linux の勉強をしたいのですが、Cent OSとSuse linuxで迷っています。 どちらがおすすめでしょうか。
http://q.hatena.ne.jp/1163282166

各種Linuxディストリビューション解説
http://kapper1224.sakura.ne.jp/UNIX2.html

Red Hat系とDebian系の違いを教えて下さい。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1029959760

Linuxについて質問です。Debian系、Red Hat系、Slackware系 、独立系がありますが、具体的にはどのような違いがあるんですか。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11104091486;_ylt=A2RiHzvSe1FVV1QAoXC0_PN7?pos=2&ccode=ofv

GNU/Linux Distribution Timeline
http://futurist.se/gldt/

Slackware
http://dic.nicovideo.jp/a/slackware

Linuxディストリビューション
http://dic.nicovideo.jp/a/linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

Linuxディストリビューション
http://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3#Slackware.E7.B3.BB

Slackware
http://ja.wikipedia.org/wiki/Slackware

zypper の紹介
http://qiita.com/ftake/items/ff79832f15ce49725b52

openSUSE
http://ja.wikipedia.org/wiki/OpenSUSE

SUSE Linux Enterprise Server
http://ja.wikipedia.org/wiki/SUSE_Linux_Enterprise_Server

Debian
http://ja.wikipedia.org/wiki/Debian

パッケージ管理システム
http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0

ZYpp
http://zh.wikipedia.org/wiki/ZYpp

openSUSE におけるパッケージ管理入門
http://www.slideshare.net/ftake/20111120-10248066

2015年1月12日月曜日

[VMware] 在 Windows 8.1 上的 VMware Workstation 11 裡安裝 MAC OS X 10.10 Yosemite

必要的東西

  1. 有 VT 功能的 intel CPU 主機一台 ...沒有這個就不用玩了w
  2. VMware workstation 11 
  3. Unlocker 2.0.3
  4. OS X 10.10 Yosemite 的 ISO 可啟動安裝檔一份

安裝 VMware Workstation


沒什麼意外的話,應該直接下一步到底,全部使用預設就可以了。


讓 VMware Workstation 認識 MAC OS X

要讓 11 版的 VMware Workstation 認識 MAC OS X 需要使用 2.0 以上的 Unlocker。
2.0 以下的版本 只能對應到 10 版以前的 VMware Workstation。
2.0 以上的版本 才能正確的看到 "Apple MAC OS X" 的選項


在 VMware Workstation 裡安裝 OS X 10.10 Yosemite

有空再補圖...w





相關問題

  1. 在這篇的動作中,一個很矛盾的問題是 MAC OS X 10.10 Yosemite 的原始安裝檔雖然可以從 AppStore 免費下載,但這個下載動作的預設條件卻是需要在 MAC OS X 上才能下載並以升級系統的方式進行安裝。而且下載來的 Yosemite 也必須在 MAC 上透過指令轉換成 iso檔,才能在 Windows PC 上使用。這個問題的兩個解決方法: 1. 改裝10.9 Mavericks 然後再升級成 10.10 Yosemite,但同樣的問題只會不斷的發生,所以這可能不是個好方法。 2. 直接用別人做好的 ISO 檔進行安裝,這個方法是確實可行的,但其中的缺點是,無法得知ISO檔是不是有問題或經過修改的檔案。
  2. 在 VM 中最常遇到的問題之一,螢幕解析度要變大的問題。預設安裝完的系統螢幕解析度是 1024 × 768 ,這比萬惡的1366 × 768 還要小。所以大部分應該都會想辦法讓解析度提升。但是在這篇中沒有這麼做的原因是,在VMware Workstation 10 所使用的 VMsvga ,在現時點(2015/01/12)對 11 版的 VMware Workstation 支援度並不好,使用後客體系統會出現不穩定,所以放棄。如果不介意的話就將就點用吧...w


參考來源

Windows上のVmwareにMac OS X Yosemiteをインストール
http://ichitaso.com/vmware/yosemite-on-windows-vmware/

VMware安裝 OS X Yosemite 10
http://bensnote.com/?p=190








2014年9月14日日曜日

[Linux] VirtualBox上執行Fedora 20安裝 guest additions的方法

Fedora 每次安裝 guest additions 都好麻煩 所以就有這篇了ww

1. 更新 Fedora
$ sudo yum distro-sync

2. 安裝 核心標頭檔 和 建置 工具
$ yum -y install kernel-devel kernel-headers dkms gcc gcc-g++

3. 重開機
$ reboot

4. 掛載 VirtaulBox guest additions 在 虛擬機器的 選單上 選擇 Devices > Insert guest additions CD image 這時候應該就會把 guest additions 掛到光碟機上 (/dev/cdrom 或是 /dev/sr0) 

5. 創建工作路徑 在 root 資料夾底下創建一個叫做 vboxcd 的資料夾
$ cd /root
$ mkdir vboxcd

6. 掛載到光碟內容到資料夾中
$ sudo mount /dev/cdrom ~/vboxcd
這時候應該會出現一些訊息
mount: /dev/sr0 is write-protected, mounting reading-only

7. 確認掛載成功
$ ls

8. 執行
$ ./VBoxLinuxAdditions.run

9. 不管執行結果如何 最重要的是一定要看到 建置是成功的!
Building the VirtualBox Guest Additions kernel modules     [  OK  ]

10. 重開機
$ reboot
應該就會成功了w

2014年4月5日土曜日

[開發環境] 應用程式開發之開發環境版本

在程式開發中,經常會遇到版本的問題。

這邊筆記主要記錄開發環境的版本對應關係。

這裡所提的版本,有四個部分:

  • 作業系統OS的版本(Windows XP、Vista、7、8、8.1...)
  • .NET Framework的版本(1.0、1.1、2.0、3.0、3.5、4.0、4.5、4.5.1...)
  • C++的版本(C++98、C++03、C++0x、C++11...)
  • Visual Studio的版本(2002、2003、2005、2008、2010、2012、2013...)

Visual Studio 和 C++ 的版本

在不同的C++版本中,有許多不同的語法,Visual Studio 所支援的程度也不相同。
目前確定是 Visual Studio 2013也還沒有完整的支援C++11。
Visual Studio版本支援C++版本
Visual Studio 2005C++03/部分C++0x
Visual Studio 2008C++03/部分C++0x
Visual Studio 2010更多的C++0x
Visual Studio 2012部分的C++11
Visual Studio 2013更多的C++11
除非開發時使用到相當複雜的用法,不然幾乎沒有太大的差別。

在C++各版本中,某些敘述語法是無法向上相容的,

VS2013 所使用的敘述有時候在 VS2012 是會無法解讀的。

同樣的情況也會發生在其他的版本中。

Visual Studio 的版本所伴隨的功能一直增加,使得開發作業變得越來越容易。

因為許多原因而持續使用舊版本的 Visual Studio 對於開發者來說,可能會比較辛苦。



根據不同的 Visual Studio 版本,所使用的 .NET Framework 版本也不同。

雖然 Visual Studio 每個版本皆有一定範圍的 .NET Framework版本可以選擇。

不過根據編譯器的版本還是會有些問題。

Visual Studio 和 .NET Framework 的版本

Visual Studio對應 .NET Framework附註
Visual Studio.NET 20021.0
Visual Studio.NET 20031.1
Visual Studio 20052.0
Visual Studio 20082.0, 3.0, 3.5
Visual Studio 20104.0安裝 .NET Framework 3.5 即可選擇 2.0, 3.0, 3.5
Visual Studio 20124.0, 4.5安裝 .NET Framework 3.5 即可選擇 2.0, 3.0, 3.5
Visual Studio 20134.5.1安裝 .NET Framework 3.5 即可選擇 2.0, 3.0, 3.5
2.0、3.0、3.5 三個版本可以完全共存。3.5 有包含 2.0 和 3.0。

2.0 或 3.0 所開發的程式,基本上可以在 3.5 SP1 下完整使用。

4.0 和 4.5 無法共存。4.0 和 4.5.1 也無法共存。

在 4.0 的環境中安裝 4.5 會被直接把 4.0 升級取代成 4.5。

4.0 所開發的程式,除了極少部分的程式,幾乎都可以在 4.5 或 4.5.1中正常執行。



OS 和 .NET Framework 的版本

OS版本和各版本的 .NET Framework 的對應關係
OS版本1.01.12.03.03.54.04.54.5.1
2000VVV-----
XPVVVVVV--
Server 2003VVVVVVV--
Server 2003 R2VVVVVVVV--
Vista-VVVVVVVVV (SP2)
Server 2008-VVVVVVVVV (SP2)
7--VVVVVVVVV (SP1)
Server 2008 R2--VVVVVVVVV
8--VV V-VVV
Server 2012--VVV-VVV
8.1--VVV--VV
  • 符號
    • -: 無法安裝
    • V: 可以安裝
    • VV: 標準配備
基本上,由於 3.5 有包含 2.0 和 3.0,所以由這幾個版本的 .NET Framework 所做出來程式,

都可只安裝 3.5 即可執行。

4.0、4.5、4.5.1 所開發的程式,除了極少部分的 4.0,基本上可以在有安裝 4.5.1 的機器上執行。

也就是說如果機器同時存在 3.5 和 4.5.1 兩個版本,則應該就可以執行 2.0 ~ 4.5.1 的每個版本。

.NET Framework 的支援期限

.NET
Framework
版本
延長支援
結束日期
實際
結束日期
標準搭載
作業系統
開發工具
2.0 SP22016/04/122020/01/14
依據 3.5 SP1
Windows Server 2003 R2Visual Studio 2005
3.0 SP22011/07/122020/01/14
依據 3.5 SP1
Windows Vista SP2
Windows Server 2008
Expression Blend
3.5 SP12020/01/14
依據 OS
2020/01/14
依據 OS
Windows 7
Windows Server 2008 R2
Visual Studio 2008
4.02020/09/08
依據 VS 2010
2020/09/08
依據 VS 2010
-Visual Studio 2010
4.52023/01/10
依據 OS、VS
2023/01/10
依據 OS、VS
Windows 8
Windows Server 2012
Visual Studio 2012
4.5.12024/04/09
依據 VS 2013
2024/04/09
依據 VS 2013
Windows 8.1
Windows Server 2012 R2
Visual Studio 2013


相關來源:

.NET Framework のサポート期限

[C#][.NET]アプリケーション開発と保守における考慮事項

.NET Framework のバージョンの互換性

.NET Framework 4.5と下位バージョンの互換性がカオス

.NET Framework のバージョンおよび依存関係

Windows 8 / Windows Server 2012 用の .NET 4.5.1

.NET Framework 4.0 と 4.5 は CLR のバージョンが異なる

.NET Framework 4.5 のインストールにより Visual Studio 2010 が起動するビルドツールが 64 bit 版に変化する場合がある

Microsoft Visual Studio 大集合

.NET Framework のサポート概要

Microsoft Visual C++ Wikipedia



[Visual Studio] 複數版本的Visual Studio共存

Visual Studio 多個版本共存的筆記。

雖然這麼說,不過是VC++的東西。

在C++的開發中,include directory 和 library directory 雖然可以在每個專案中各自設定,

但也可以全域的方式設定。

此篇筆記是在記錄以全域方式設定 include directory 和 library directory,

使所有的專案都可以使用這樣的設定。

在 Visual Studio 中,2010、2012、2013這三個版本的MS Build都沒有改變,

所以基本上這三個版本都是共用這一個 Property sheet 設定。

在預設路徑下, property sheet 可以在下方的路徑中找到

32位元的專案
C:\Users\<user-name>\AppData\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
64位元的專案
C:\Users\<user-name>\AppData\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props
用來區分VS版本的方法為 Condition 屬性,

直接將 Condition 屬性增加到 IncludePath 和 LibraryPath 下即可。

<?xml version="1.0" encoding="utf-8"?> 

<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <PropertyGroup>
    <IncludePath>$(IncludePath);C:\opencv248\build\include</IncludePath>
  </PropertyGroup>
  <PropertyGroup>
    <LibraryPath Condition=" '$(VisualStudioVersion)' == '11.0'">$(LibraryPath);C:\opencv248\build\x86\vc11\lib</LibraryPath>
    <LibraryPath Condition=" '$(VisualStudioVersion)' == '12.0'">$(LibraryPath);C:\opencv248\build\x86\vc12\lib</LibraryPath>
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />

</Project>

VisualStudioVersion 10.0 為 VS 2010

VisualStudioVersion 11.0 為 VS 2012

VisualStudioVersion 12.0 為 VS 2013

事實上 Condition 屬性也可以直接加在 PropertyGroup 標籤中。




來源: http://www.rainyman.net/nest/?p=759

2014年1月7日火曜日

[MFC] 對話框以 SendMessage 傳遞 struct 結構體

接著前一篇,在兩個對話框之間傳遞資料。

同樣使用 SendMessage 來傳遞,所以直接拿上一篇的程式碼做一點修改。

同樣假設有兩個對話框 Send_Dlg 和 Receive_Dlg。

Send_Dlg: Send_Dlg.h 和 Send_Dlg.cpp

Receive_Dlg: Receive_Dlg.h 和 Receive_Dlg.cpp

Send_Dlg.h
 // 定義 訊息編號
#define WM_MYMESSAGE_USE_COSTOMIZE_MESSAGE (WM_USER + 2)

struct DataStruct
{
    int i;
    double d;
    CString m_string;
    CEdit m_edit;
};

class Send_Dlg : public CDialogEx
{
public:
    Send_Dlg(CWnd* pParent = NULL); 

    // 要傳遞的結構體
    DataStruct dataStruct;

    // 傳遞訊息的 function 
    afx_msg void sender(); 
}
Send_Dlg.cpp
#include "Send_Dlg.h"

Send_Dlg::Send_Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Send_Dlg::IDD)
{
    m_Icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Send_Dlg::sender()
{
    // struct 的值
    dataStruct.i = 1;
    dataStruct.d = 1.0;
    dataStruct.m_string = L"";
    dataStruct.m_edit = "";
    // 尋找對話框名稱為 Receive_Dlg 的對話框
    CWnd* pWnd = CWnd::FindWindowW(NULL, L"Receive_Dlg");

   // 傳送訊息
    pWnd->SendMessageW(WM_MYMESSAGE_USE_COSTOMIZE_MESSAGE, (WPARAM)&dataStruct);
}

Receive_Dlg.h
#include "Send_Dlg.h"

class Receive_Dlg : public CDialogEx
{
    Receive_Dlg(CWnd* pParent = NULL);  

    // 接收訊息用的 Function
    afx_msg LRESULT receiver(WPARAM wParam, LPARAM lParam);
}

Receive_Dlg.cpp
#include "Receive_Dlg.h"

Receive_Dlg::Receive_Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Receive_Dlg::IDD)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


 // 在 MESSAGE MAP 中加入關聯
BEGIN_MESSAGE_MAP(Receive_Dlg, CDialogEx)
    // 以 ON_MESSAGE 將 訊息ID 和 receiver 串起來
    ON_MESSAGE(WM_MYMESSAGE_USE_COSTOMIZE_MESSAGE, &Receive_Dlg::receiver) 
END_MESSAGE_MAP()

LRESULT Receive_Dlg::receiver(WPARAM wParam, LPARAM lParam)
{
    // 接受到訊息後的工作
    // do something
    
    // 接收傳過來的結構體
    DataStruct* pDs;
    pDs = (DataStruct*)wParam;

    // 取值
    pDs->i;
    pDs->d;
    pDs->m_string;
    pDs->m_edit;

    AfxMessageBox("接收到訊息");
    return LRESULT();
}


[MFC] 對話框傳訊息 SendMessage

雖然MFC已經很古老了...
不過用於簡單的程式倒是挺方便的。 
在兩個對話框中傳遞訊息的方式: SendMessage、PostMessage。

SendMessage: 在訊息傳送之後,等待接收反應才返回。
PostMessage: 在訊息傳送之後,不等待即立刻返回。


假設有兩個對話框。一個叫 Send_Dlg,一個叫 Receive_Dlg。

Send_Dlg: Send_Dlg.h 和 Send_Dlg.cpp

Receive_Dlg: Receive_Dlg.h 和 Receive_Dlg.cpp

Send_Dlg.h
 // 定義 訊息編號
#define WM_MYMESSAGE (WM_USER + 1)

class Send_Dlg : public CDialogEx
{
public:
    Send_Dlg(CWnd* pParent = NULL); 

    // 傳遞訊息的 function 
    afx_msg void sender();
}

Send_Dlg.cpp
#include "Send_Dlg.h"

Send_Dlg::Send_Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Send_Dlg::IDD)
{
    m_Icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Send_Dlg::sender()
{
    // 尋找對話框名稱為 Receive_Dlg 的對話框
    CWnd* pWnd = CWnd::FindWindowW(NULL, L"Receive_Dlg");


   // 傳送訊息
    pWnd->SendMessageW(WM_MYMESSAGE);
}

Receive_Dlg.h
#include "Send_Dlg.h"

class Receive_Dlg : public CDialogEx
{
    Receive_Dlg(CWnd* pParent = NULL);  

    // 接收訊息用的 Function
    afx_msg LRESULT receiver(WPARAM wParam, LPARAM lParam);
}

Receive_Dlg.cpp
#include "Receive_Dlg.h"

Receive_Dlg::Receive_Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Receive_Dlg::IDD)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


 // 在 MESSAGE MAP 中加入關聯
BEGIN_MESSAGE_MAP(Receive_Dlg, CDialogEx)
    // 以 ON_MESSAGE 將 訊息ID 和 receiver 串起來
    ON_MESSAGE(WM_MYMESSAGE, &Receive_Dlg::receiver) 
END_MESSAGE_MAP()

LRESULT Receive_Dlg::receiver(WPARAM wParam, LPARAM lParam)
{
    // 接受到訊息後的工作
    // do something

    AfxMessageBox("接收到訊息");
    return LRESULT();
}



參考:
MFC的SendMessage函数详解
http://blog.csdn.net/nupt123456789/article/details/7370463

MESSAGE_HANDLER [メッセージの送受信]
http://bcb.client.jp/tips/022_receive_postmessage.html