2014/02/19

刪除 PDF 檔的旁註和重點標示

拿到一份 PDF 檔,用功的前人在上面又是底線又是螢光筆的重點畫得滿滿多是,看得眼花撩亂。終於找到一個方法,可將這些 annotation 清理的乾乾淨淨:

sed -i -e 's:/Annots\[[^]]\+\]::g' FILENAME.PDF
上述指令看來很玄,簡單說就是將文件中 "/Annots[....]" 的資料片段都給刪了。

若你不想全部刪,或者只想一個個刪,在 Ubuntu 上可以找一個 pdfedit。開啟檔案後,點「樹」的「頁面」可列出每一頁,每頁的「註釋」就是插入的這些重點標示。

參考資料

2013/10/01

Eclipse 的 Workspace 該怎麼用

剛開始用 Eclipse 開發 Android Apps。在學習過程中,一直有一個疑問:workspace 該怎麼用?一個 app 一個 workspace?還是一個 workspace 通吃大部分的 app?這兩種策略又有何差異?

以下這邊文章解答了我部份的疑問 (簡單說,用一個 workspace 通吃大部分的 apps):
還有其他考量嗎?繼續研究當中,有心得再來更新。

2013/09/16

將多張 JPEG 圖形檔合成一個多頁文檔

想將多張 JPEG 圖形檔合成一個多頁文檔?沒問題,但你要先知道 JPEG 格式目前沒有多頁模式。所以要轉成支援多頁的格式,譬如 .PDF 或 .TIFF。

Ubuntu 上似乎預設就有此功能:
convert file1.jpg file2.jpg file3.jpg output.pdf
此功能是包含在 imagemagick 套件上,若沒有上述 convert 程式,可以自己安裝此套件:
sudo apt-get install imagemagick
據說 Windows 和 MacOS 平台上也都有此程式。

2013/08/31

在 Ubuntu 使用 USB RS232 轉接線

現在的 PC 或 NB 已經很少看到 RS232 接口了。但有些時候,如開發 embedded system 時,還是很需要 serial console。此時就需要 USB RS232 轉接線。

在 Ubuntu 上使用 USB RS232 轉接線很簡單。首先,插入 USB RS232 轉接線後馬上執行以下命令查出 device name:
$ dmesg | grep tty
[ 7842.193255] usb 2-2: pl2303 converter now attached to ttyUSB0
如上述範例的  device name 的是 ttyUSB0。一般來說,你可能會沒有足夠的權限:
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0  8月 31 10:33 /dev/ttyUSB0
像上述範例,你如果不是 root,就要把自己加入 dialout 那個 group (修改 /etc/group)。然後就可用自己喜好的 terminal emulator 開始上工了。

以下是其他一些可能會需要的診斷工具,僅供參考:
  • 查看連接上的 USB 裝置的資訊:lsusblsusb -v
  • 查查裝置剛插入時有什麼狀況發生:tail /var/log/syslog

2013/08/02

在 Ubuntu 上將 YouTube 的 MV 轉成 MP3 檔

先聲明,以下這方法不是最簡單的,只是個人喜好的步驟 (其實,有網站提供此服務)。

首先,先在 Firefox 安裝可下載 YouTube 影片的 Add-on,譬如:1-Click YouTube Video Download。將喜歡的 MV 轉成 MP4 檔。

然後,執行以下指令:
avconv -i input.mp4 -f mp3 -vn output.mp3
若不能成功,可能是缺少 mp3 codec,用以下方法安裝:
sudo apt-get install libavcodec-extra-53
不習慣 avconv (亦即之前的 ffmpeg) 命令列的,可以安裝 winff 來用 GUI。

參考資料:


2013/07/24

Android/Eclipse 上 Java 的 Tab 處理

Android 的 Code Style Guidelines 明確規定縮排是用四個空白,而且強調 We never use tabs。既然最權威的原創者有明確的規定,我們開發 Android Apps 時,若沒有特別的理由,建議也比照辦理。

有趣的是,Eclipse 的預設跟此規定恰好相反:用相當於四個空白寬度的 tab 來縮排。改變此設定的方法如下:
  • Window > Preferences > Java > Code Style > Formatter > New
  • Java Conventions [built-in] 當樣板,新增一個 Android Style profile
  • 修改此 profile,將 Tab policy 改成 Spaces only,Tab size 設成 4
有了上面的設定,用 eclipse 開發 android app 時,縮排用 tab 就會自動變成四個空白。我建議再做以下設定,讓 eclipse 明確顯示 space、tab 和 newline 等字元,以便精準掌握「空白」是不是你所想要的那種「空白」:
  • Window > Preferences > General > Editors > Text Editors > Show whtiespace characters

2013/07/20

Ubuntu 的網路設定

一般來說,Ubuntu 的網路設定不會是個問題,安裝時幾乎就幫你搞定一切了。但若你後來更換網路卡,或者將安裝硬碟換到不同的機器,你可能就需要自己稍微調整一下設定了。以下是我的一些經驗,僅供參考。

首先,確認 kernel 認到多少張網路卡:
root@ubuntu:~# dmesg | grep eth
[    1.678186] i2c-core: driver [aat2870] using legacy suspend method
[    1.678186] i2c-core: driver [aat2870] using legacy resume method
[    2.718021] via-rhine 0000:01:06.0: eth0: VIA Rhine II at 0xfebffc00, 00:11:22:ab:cd:ed, IRQ 19
[    2.718735] via-rhine 0000:01:06.0: eth0: MII PHY found at address 8, status 0x782d advertising 01e1 Link cde1
[    2.726899] forcedeth: Reverse Engineered nForce ethernet driver. Version 0.64.
[    2.727153] forcedeth 0000:00:0f.0: PCI INT A -> Link[LMAC] -> GSI 20 (level, low) -> IRQ 20
[    2.727160] forcedeth 0000:00:0f.0: setting latency timer to 64
[    3.253390] forcedeth 0000:00:0f.0: ifname eth1, PHY OUI 0x732 @ 1, addr 00:33:44:ab:cd:ed
[    3.253394] forcedeth 0000:00:0f.0: highdma pwrctl mgmt gbit lnktim msi desc-v3
以上輸出,很清楚看到系統抓的兩張網路卡,eth0 & eth1。有些時候,你會看到 "eth0 is renamed to eth1" 之類的訊息。這時候,你用 ifconfig 去看時,會發現網路界面的名稱跟系統抓到的好像不一致。遇到這種情況,請檢查 /etc/udev/rules.d/70-persistent-net.rules:
# PCI device 0x1106:/sys/devices/pci0000:00/0000:00:0a.0/0000:01:06.0 (via-rhine)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:ab:cd:ef", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x10de:/sys/devices/pci0000:00/0000:00:0f.0 (forcedeth)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:33:44:ab:cd:ef", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
也就是說,網路界面的名稱可被 udev 重新定義。確認網路界面之後 (確認沒有的網路卡,可以直接刪除),就可以設定各個界面的網路型態:
root@ubuntu:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
以上範例,eth0 會自動取得 IP,eth1 則自行指定 IP 位址。