2014年10月8日 星期三

安裝 Nvidia 顯卡驅動

1. 查看自己的顯卡型號 (本例如下型號):


lspci

01:00.0 VGA compatible controller: NVIDIA Corporation G94 [GeForce 9600 GT] (rev a1)


2. Nvidia 官方載點:

http://www.nvidia.com.tw/Download/index.aspx?lang=tw

下載以 Nvidia Geforce 9600 GT 為例,如下圖:

搜尋後,下載到一個「NVIDIA-Linux-x86_64-340.32.run」。

3. 開始安裝(頁面最下方有 Debug 說明):

sh NVIDIA-Linux-x86_64-340.32.run

4. 在 X-Windows 下,以終端機開啟 Nvidia 設定視窗,指令如下:

nivida-setting

可以查看到各項顯卡設定,
例如我有兩台螢幕,在裡面設定:

左螢幕:
 

右螢幕(主要):

輸出結果:

5. 以 Blender 軟體為例,來驅動 3D 硬體加速:

至軟體 Blender > file > system > USR...> compute device > CUDA

Debug 1. 

過程需要關 X-Windows  ,若 X 無法關閉(以gnome為例),
則需要移除下列三個套件:
gnome
gnome-core
gdm3

apt-get remove gnome gnome-core gdm3


Debug 2.

過程中發現 nouveau 驅動模組無法關閉( rmmod )的話,
則有可能是在核心編譯過程中,選到 <*> 或 <M>  所致:

先試試停用 Nouveau 驅動模組,
(特別注意下面是兩個大於符號):
echo "blacklist nouveau" >> /etc/modprobe.d/fbdev-blacklist.conf
reboot

如果還是不行,請重新做核心編譯:
> Device Drivers >
Graphics support >
< > Nouveau (nVidia) cards


解決方法為,重編核心,把上面的 <*> 或 <#> 改為 < >
把 kernel 內建的 nvidia 驅動關閉,我們另裝官方提供的驅動程式。



Linux Kernel 編譯及更新

1. 安裝編譯工具

#gcc-4.4
gcc
#g++-4.4
g++
#cpp-4.4
cpp
m4
make
nasm
bison
flex
autoconf
automake
autotools-dev
#compile kernel
kernel-package
libncurses5-dev
# Fetch Source Code
git
subversion

將上述工具、套件 copy 起來,
並建立一個編譯工具安裝列表 PKG_PROG 文字檔 paste 上去,
可以更方便紀錄及管理;接著下 cmd 安裝:
sudo apt-get update && apt-get install -y `grep -v ^# PKG_PROG`

grep 是擷取文字。
-v 是 inverter 反向。
^# 其中 ^ 是文字每行之開頭意思,# 是 shell script 做為註解用途,這邊目的是要取每個 # 開頭的行再結合 -v 做反向 → 每個 # 開頭的行都不截取。

2. 至 https://www.kernel.org/ ,下載最新的核心版本,
建議使用 longterm (長期支援版),下載至 /usr/src 目錄下,
下面以linux-3.14.20.tar.xz 為例。


3. 電腦驅動模組:

lspci -v
lspci -k
lsmod
cat /proc/cpuinfo


基本的查看的項目:Ethernet、VGA、Audino…等,以我的為例:
02:00.0 Ethernet controller: Atheros Communications Inc. AR8121/AR8113/AR8114 Gigabit or Fast Ethernet (rev b0)
        Subsystem: ASUSTeK Computer Inc. Device 8226
        Flags: bus master, fast devsel, latency 0, IRQ 17
        Memory at fe9c0000 (64-bit, non-prefetchable) [size=256K]
        I/O ports at bc00 [size=128]
        Capabilities: 
        Kernel driver in use: ATL1E

01:00.0 VGA compatible controller: NVIDIA Corporation G94 [GeForce 9600 GT] (rev a1) (prog-if 00 [VGA controller])
        Subsystem: ASUSTeK Computer Inc. Device 8304
        Flags: bus master, fast devsel, latency 0, IRQ 46
        Memory at fd000000 (32-bit, non-prefetchable) [size=16M]
        Memory at c0000000 (64-bit, prefetchable) [size=512M]
        Memory at fa000000 (64-bit, non-prefetchable) [size=32M]
        I/O ports at ac00 [size=128]
        [virtual] Expansion ROM at fe880000 [disabled] [size=512K]
        Capabilities: 
        Kernel driver in use: nvidia

06:00.0 Multimedia audio controller: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller (rev 01)
        Subsystem: Device 160b:0010
        Flags: bus master, medium devsel, latency 64, IRQ 16
        I/O ports at ec00 [size=32]
        I/O ports at e880 [size=128]
        Capabilities: 
        Kernel driver in use: snd_ice1724


4. 先解壓縮,並做一個 sublink 到 linux,並進去做核心參數設定

tar xfva linux-3.14.20.tar.xz
ln -s /usr/src/linux-3.14.20 /usr/src/linux
cd /usr/src/linux

make menuconfig


下面開始做最基本的核心選單設定,可以用 "/" 來做搜尋,輸入上面找到的 Kernel driver,可以更快的開啟模組:

設定編譯的壓縮格式,XZ 為壓縮率高及失真率低優點:
> General setup > Kernel compression mode > XZ


設定自己核心所屬的家族 (本例是 Core 2/newer Xeon):
> Processor type and features > Processor family > (Core 2/newer Xeon)


網路卡開啟自己的型號(本例是 Atheros 要開啟 ):
> Device Drivers > Network device support > Ethernet driver support > Atheros 全開


顯卡驅動( 本例是 Nvidia ),這邊注意不能選<*> ,後面要裝官方驅動會有問題。
> Device Drivers > Graphics support >  <M> Nouveau (nVidia) cards 


音效卡驅動(本例是 Onkyo SE-90PCI 音效卡,晶片為 VT1720/24 [Envy24PT/HT]):
-> Device Drivers > Sound card support (SOUND [=m])  > Advanced Linux Sound Architecture (SND [=m])  > PCI sound devices (SND_PCI [=y])  >   ICE/VT1724/1720 (Envy24HT/PT) 


選好所需要的核心模組後,及可按 Exit 並儲存離開,回到 /usr/src/linux 目錄下。

5. 開始編譯!直接指令來 Run :

time make-kpkg --initrd --revision=[版本名稱] kernel_image -j [核心數]


版本名稱可以自訂,一般設定習慣為 1.0.1.xxx 這種格式,數字及英文代號皆可自訂。
核心數可以用 cat /proc/cpuinfo 來查看 siblings 核心處理序數量。

6. 編譯完成,來進行最後核心 .deb 檔的安裝(本例核心版本名稱為 1.0.1.lpm ):

sudo dpkg -i linux-image-3.14.20_1.0.1.lpm_amd64.deb


7. 安裝完成,重開機~

sudo shutdown -r now 或
reboot

8. 查看核心版本:

uname -a



2014年10月3日 星期五

PCI 音效卡設定

音效卡型號:Onkyo SE-90PCI


查看晶片模組:
lspci -v

06:00.0 Multimedia audio controller: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller (rev 01)
 Subsystem: Device 160b:0010
 Flags: bus master, medium devsel, latency 64, IRQ 16
 I/O ports at ec00 [size=32]
 I/O ports at e880 [size=128]
 Capabilities: 
 Kernel driver in use: snd_ice1724

查看驅動模組有沒有啟動:
lsmod |grep snd_ice1724

snd_ice1724           123182  2
snd_ak4113             13661  1 snd_ice1724
snd_pt2258             12712  1 snd_ice1724
snd_ak4114             13642  1 snd_ice1724
snd_i2c                13184  2 snd_pt2258,snd_ice1724
snd_ice17xx_ak4xxx     12763  1 snd_ice1724
snd_ak4xxx_adda        13382  2 snd_ice1724,snd_ice17xx_ak4xxx
snd_ac97_codec        106699  1 snd_ice1724
snd_pcm                68848  7 snd_ice1724,snd_pcm_oss,snd_ac97_codec,snd_hda_codec,snd_hda_intel,snd_ak4113,snd_ak4114
snd_rawmidi            22995  2 snd_ice1724,snd_seq_midi
snd                    53159  31 snd_pt2258,snd_ice1724,snd_pcm_oss,snd_ac97_codec,snd_hwdep,snd_timer,snd_hda_codec_via,snd_i2c,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec_generic,snd_hda_codec,snd_ak4xxx_adda,snd_hda_intel,snd_seq_oss,snd_seq_device,snd_mixer_oss,snd_ak4113,snd_ak4114


如果沒啟動,就下載入摸組指令:
modprobe snd_ice1724

如果都沒辦法載入所需要的驅動摸組,就必須要重新編譯核心,驅動「snd_ice1724」 這個模組,才可以驅動VT1720/24 [Envy24PT/HT] PCI 晶片。

接下來,安裝 PulseAudio :
sudo apt-get install pulseaudio


並去修改設定檔 /etc/pulse/default.pa:
vi /etc/pulse/default.pa

找到:
#load-module module-alsa-sink ...
改為
load-module module-alsa-sink device=dmix

找到:
load-module module-suspend-on-idle
改為
#load-module module-suspend-on-idle

找到: (解決錄音問題,如skype)
load-module module-hal-detect
改為:
#load-module module-hal-detect

在家目錄下寫一個 .asoundrc 檔,新增一個項目到 alsa ,讓它與 PulseAudio 做連結:

vi ~/.asounds

pcm.softvol
{
        type softvol
        slave.pcm "hw:1,0"
        control.name "paMaster"
        control.card 1
}

pcm.!default
{
        type pulse
}

ctl.!default
{
        type pulse
}


之後重新登出再登入,接著重新啟動 PulseAudio:
/etc/init.d/pulseaudio restart


如果出現錯誤訊息「[warn] PulseAudio configured for per-user sessions ... (warning).」,就要去修改 /etc/default/pulseaudio:
vi /etc/default/pulseaudio

改成下面
PULSEAUDIO_SYSTEM_START=1

最後裝輔助控制介面:
sudo apt-get install pavucontrol paman

直接下上面套件名稱「pavucontrol」,「paman」來啟動程式,並選擇自己所使用的音效卡。


Reference:
https://packages.debian.org/squeeze/pulseaudio

http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?viewmode=compact&type=&topic_id=10102&forum=10

http://rueiyuanlu.blogspot.tw/2011/04/pulseaudio-alsa-softvol.html




2014年10月1日 星期三

壓縮與解壓縮指令

Linux 下壓縮與解壓縮指令:

  • tar 指令 (參數無順序)

-a  all
-x  extract 解壓
-c  create 製作壓縮檔
-z  .gz
-j  .bz
-f  file 後面加 .tar.??? 的檔案(製/解壓都一樣)
-v  view 查看製/解壓過程
-C  後面加目錄位置(將結果檔放至目標位置)

實作指令整理如下:
------------------------------------------------

.tar


extract :
tar xfv filename.tar


create :
tar cfv filename.tar filename

------------------------------------------------

.gz


extract1 :
gunzip filename.gz

extract2 :
gzip -d filename.gz


create :
gzip filename

------------------------------------------------

.tar.gz


extract :
tar xfzv filename.tar.gz


create :
tar cfzv filename.tar.gz filname

------------------------------------------------

.bz2


extract1 :
bunzip2 filename.bz2

extract2 :
bzip2 -d filename.bz2


create :
bzip2 -z filename

------------------------------------------------

.tar.bz2


extract :
tar xfjv filename.tar.bz2


create :
tar cfjv filename.tar.bz2 filename

------------------------------------------------

.bz


extract1 :
bzip2 -d filename.bz

extract2 :
bunzip2 filename.bz

------------------------------------------------

.tar.bz


extract :
tar xfvj filename.tar.bz

------------------------------------------------

.Z


extract :
uncompress filename.Z

create :
compress filename.Z

------------------------------------------------

.tar.Z


extract :
tar Zxvf filename.tar.Z

create :
tar Zcvf filename.tar.Z filename

------------------------------------------------

.tgz


extract :
tar zxvf filename.tgz

------------------------------------------------

.tar.tgz


extract :
tar zxvf filename.tar.tgz

create :
tar zcvf filename.tar.tgz filename

------------------------------------------------

.zip


extract :
unzip filename.zip

create :
zip filename.zip filename

------------------------------------------------

.rar

Download Page for rar_4.0.b3-1_amd64.deb
extract :
rar x filename.rar

create :+++
rar a filename.rar filename

------------------------------------------------


Reference:
http://www.dotblogs.com.tw/phoenixwu/archive/2008/05/22/4103.aspx

2014年9月29日 星期一

NTP 網路校時 & 時區設定


  • 先進入時區的選擇及設定

sudo dpkg-reconfigure tzdata


接下來選所在國家 (例如:我在Asia -> Taipei)

  • 接下來介紹台灣 NTP Server 如下:
tock.stdtime.gov.tw
watch.stdtime.gov.tw
time.stdtime.gov.tw
clock.stdtime.gov.tw
tick.stdtime.gov.tw


  • 安裝 ntp 套件:
sudo apt-get update && apt-get install -y ntpdate ntp



  • ntpdate 與 ntp 分別說明:
ntpdate 常用於手動強制校準時間,是較為暴力方法。
ntp 為自動校時,是將 NTP Server 存於設定檔中,慢慢校準,較為優良。


  • ntpdate 使用指令及使用方法:
ntpdate time.stdtime.gov.tw


如果出現問題訊息:
ntpdate: no server suitable for synchronization found

則可以去嚐試其它的 NTP Server 看看,例如最上面所述的,或國外的 NTP Server (例:ntp.ubuntu.com )

但如果出現: 
ntpdate: the NTP socket is in use, exiting
則是因為 ntp 自動校時正在運作中,需要先把它關閉,
service ntp stop
或是
/etc/init.d/ntp stop

  • ntp 設定:
vi /etc/ntp.conf



  • 寫入 NTP Server :
server time.stdtime.gov.tw
server tock.stdtime.gov.tw
server watch.stdtime.gov.tw
server clock.stdtime.gov.tw
server tick.stdtime.gov.tw


  • 重啟ntp
/etc/init.d/ntp restart

2014年8月19日 星期二

Android 監測螢幕觸碰方向

功能說明:

監測手指滑動螢幕的座標變化量(VelocityTracker),根據滑的方向,顯示出上下左右,並改變背景顏色做更明顯區分。


##ReadMore##

原理說明:

首先知道在 Java 中的繪圖座標系為
X 左負右正,
Y 上負下正,
接著,方向的判斷,為取X及Y座標變化量來判斷,先取絕對值:

|X|>|Y| 則為水平移動,
再判斷若 X>0 即向右,X<0 即向左;

|X|<|Y| 則為垂直移動,
再判斷若 Y>0 即向下,Y<0 即向上。

Main Java Code :
package com.example.testtouch;

import android.support.v7.app.ActionBarActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

 // 顯示方向數據
 private TextView touchShow;

 // Velocity Tracker 監測觸碰速度
 private VelocityTracker touchTracker;

 // Relative Layout 相對佈局
 private RelativeLayout layout;


 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // IO Setting
  touchShow = (TextView) findViewById(R.id.textView2);
  layout = (RelativeLayout) findViewById(R.id.colorLayout);

  // 觸控監測處理
  layout.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View view, MotionEvent event){
    // get actinon event
    switch(event.getAction()){

    // 開始觸碰瞬間
    case MotionEvent.ACTION_DOWN:
     touchShow.setText(""); // Clear touchShow
     touchTracker = VelocityTracker.obtain(); // 取得追蹤到的速度
     break;

    // 觸碰中的過程
    case MotionEvent.ACTION_MOVE:
     touchTracker.addMovement(event); // 滑動中的資料加到 Tracker 裡
     break;

    // 觸碰結束
    case MotionEvent.ACTION_UP:
     touchTracker.computeCurrentVelocity(1); // 計算單位:每1ms為一像素(1pix/1ms)

     /*
     先說明在 Java 中的繪圖座標系為 X 左負右正,Y 上負下正,接著,
     方向判斷,取X及Y座標變化量來判斷,先取絕對值:
     若 |X|>|Y| 則為水平移動,再判斷若 X>0 即向右,X<0 data-blogger-escaped-y="">0 即向下,Y<0 data-blogger-escaped-absolute="" data-blogger-escaped-float="" data-blogger-escaped-getabs_x="Math.abs(getVel_X);" data-blogger-escaped-getabs_y="Math.abs(getVel_Y);" data-blogger-escaped-getvel_x="touchTracker.getXVelocity();" data-blogger-escaped-getvel_y="touchTracker.getYVelocity();" data-blogger-escaped-velocity="">|Y| 時,為水平移動
     if(getAbs_X > getAbs_Y){
      if(getVel_X > 0){ // 若 X>0 時,為向右
       touchShow.setText("向右移動\nX = " + getVel_X + "\nY = " + getVel_Y);
       layout.setBackgroundColor(Color.RED); // 顏色區分方向,右=紅
      }
      else { // 若 X<0 data-blogger-escaped-brush:xml="" data-blogger-escaped-nx=" + getVel_X + " data-blogger-escaped-ny=" + getVel_Y);
       layout.setBackgroundColor(Color.YELLOW); // 顏色區分方向,上=黃
      }
     }
     break;
    }
    return true;
   }
  });
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();
  if (id == R.id.colorLayout) {
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
}

</pre><br />
<br />
Layout Code:<br />
<pre class=" data-blogger-escaped-touchshow.settext="">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/colorLayout"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1.0"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testtouch.MainActivity" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="35dp"
        android:text="@string/hello_world" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="55dp" />

</RelativeLayout>


String Code:
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">testTouch</string>
    <string name="hello_world">滑動方向判斷</string>
    <string name="action_settings">Settings</string>

</resources>