用整個畫面寫訊息 screen message!

今天看到 CrBoy 學長用筆電螢幕寫下充滿整個畫面的訊息,感覺非常吸睛!!

詢問之後得知是 screen message 這隻程式達成的,而且這隻程式還有 python 版本!

非常方便好用!

#!/usr/bin/python
# encoding:utf8

#     vlshow.py
#     Copyright (C) 2006 Joachim Breitner
#
#     This program is free software; you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation; either version 2 of the License, or
#     (at your option) any later version.
#
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with this program; if not, write to the Free Software
#     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA


import pygtk
pygtk.require('2.0')
import gtk
import pango
import sys
import gobject

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_decorated(False)
window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
window.fullscreen()

settings = gtk.settings_get_default()

draw = gtk.DrawingArea()
draw.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
draw.set_size_request(400,300)

pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
color = gtk.gdk.Color()
cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)


tv = gtk.TextView()
tb = tv.get_buffer()

def get_text():
	return tb.get_text(tb.get_start_iter(), tb.get_end_iter())

if len(sys.argv) > 1:
	tb.set_text(" ".join(sys.argv[1:]))
else:
	tb.set_text(";-)")

quit = gtk.Button(stock=gtk.STOCK_QUIT)
quit.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
quit.connect("clicked",gtk.main_quit)

hbox = gtk.HBox()
hbox.pack_start(tv, expand=True, fill=True)
hbox.pack_start(quit,  expand=False,fill=False)

vbox = gtk.VBox()
vbox.pack_start(draw, expand=True, fill=True)
vbox.pack_start(hbox, expand=False, fill=False)
window.add(vbox)

font = pango.FontDescription()
font.set_family("LeHei Pro")
font.set_size(60*pango.SCALE)
layout = draw.create_pango_layout(get_text())
layout.set_font_description(font)
layout.set_alignment(pango.ALIGN_CENTER)


accel = gtk.AccelGroup()
key, mod = gtk.accelerator_parse("Q")
accel.connect_group(key, mod, 0, gtk.main_quit)
key, mod = gtk.accelerator_parse("Escape")
#accel.connect_group(key, mod, 0, gtk.main_quit)
#key, mod = gtk.accelerator_parse("C")
accel.connect_group(key, mod, 0, (lambda x,y,z,v: tb.set_text("")))
window.add_accel_group(accel)

window.show_all()

need_resize=True
need_quick=True

def resize(w=None,rect=None):
	global need_resize
	draw.window.set_cursor(cursor)
	(w1,h1) = layout.get_pixel_size()
	if h1>0 and w1>0:
		(x,y,w2,h2) = draw.get_allocation()
		s = font.get_size()
		s = min ( int (s*w2/w1), int (s*h2/h1) )
		font.set_size(s)
		layout.set_font_description(font)
		need_resize=False
	else:
		need_resize=True

def redraw(w=None,e=None):
	global need_resize, need_quick
	if layout.get_text(): # Fails for empty lines :-(
		gc = draw.get_style().fg_gc[gtk.STATE_NORMAL]
		(w1,h1) = layout.get_pixel_size()
		if h1>0 and w1>0:
			(x,y,w2,h2) = draw.get_allocation()
			draw.window.draw_layout(gc,(w2-w1)/2,(h2-h1)/2,layout)
			hq(True)

quality = False
def hq(q,force=False):
	global quality
	if q != quality:
		if q:
			settings.set_long_property("gtk-xft-antialias",1,"Hier halt")
		else:
			settings.set_long_property("gtk-xft-antialias",0,"Hier halt")
	else:
		if force:
			draw.queue_draw()

	quality = q
	return False

def newtext(w):
	global timeout_id
	layout.set_text(get_text())
	resize()
	hq(False, True)

draw.connect("configure-event", resize)
draw.connect("expose-event", redraw)
tb.connect("changed", newtext)

gtk.main()
sm.py 範例圖片

sm.py 範例圖片

參考來源: 點我

linux 快速更改大量檔名 rename

linux 底下的快速更改檔名方法非常優秀!rename 指令就是了!

首先可以先 man rename 看一下 rename 的使用方法。

舉例:
http://linux.die.net/man/1/rename
如果有檔案檔名如:foo1, …, foo9, foo10, …, foo278

rename foo foo0 foo?
rename foo foo0 foo??

結果如:foo001, …, foo009, foo010, …, foo278


rename 's/要被取代的字串/要換上的字串/' 檔名(可以用萬用字元 * )

把檔名裡面的所有空白換成底線

rename 's/ /_/g' *

rename 使用的是 perl expression, s 代表取代, g 會找尋檔名裡面所有符合條件的地方,如果沒有 g 的話則只會搜尋第一個符合條件的地方就結束了

Debian安裝java開發環境

因為編譯 flex 的需求,我在 Debian 上面安裝了 java jre

首先要在 apt 的 source.lists 加入下面這個來源,這樣才找得到 java 的套件!

deb http://ftp.tw.debian.org/debian/ sid main contrib non-free

然後輸入 sudo apt-get update 更新套件庫的內容,如此方可找到java套件。

然後就可以用下面的命令安裝 java jre和其他套件了

sudo apt-get install sun-java6-jdk sun-java6-jre sun-java6-fonts

安裝後可以用下面指令測試正常與否

javac -version

參考:<a href="http://wiki.debian.org.hk/w/Install_Sun_Java_with_APT&quot; http://wiki.debian.org.hk/w/Install_Sun_Java_with_APT
指令背景色碼:#CDC9C9

ASUS K40IN 安裝 linux(mandriva)

最近透過 成功大學校園筆電專案 買了我人生中第一台筆電,但是安裝 Ubuntu 的過程中歷經好大一番功夫,因為我完全不能接受一台只有 windows 的電腦,情況甚至一度讓我想著『如果不能安裝linux,那我就要退貨!』

一開始拿到機器先嘗試安裝Ubuntu9.04,但是遇到 棘手的錯誤 ,上網找了很久,放棄…
安裝片放入光碟機,開機,選擇語系,開始安裝,立即出現以下錯誤

BUG: Int 6: CR2 00000000

原因不明…

陸陸續續查到 Debian or Ubuntu9.04 64bit 版 or Ubuntu8.10 or … 可以安裝的假消息XDD

燒了約六片DVD,都失敗XDD

例如:Debian安裝完後,無線網路找不到。

最後忘了看到哪個網頁寫『 mandriva 2010.0 Alpha 1 』可以正常安裝在該 laptop 上面,只有一個無法正常使用睡眠功能的缺點。

目前,我的 k40IN 安裝了 mandriva 2010.0 Alpha 1 使用中。

這個發行版的 vim 預設只有安裝 vim-minimal,所以無法使用 syntax on 這個功能。

可以安裝 vim-common vim-enhance 來解決這個問題!

sudo urpmi vim-common vim-enhance

超陽春,FTP相簿系統,免SQL

使用 FTP 可以很方便地上傳照片,但是沒有辦法進行友善的瀏覽,再加上不希望製作太複雜的相簿系統(如果要很複雜的話就乾脆用 gallery 了),所以製作了下面這樣的 php 頁面。
他可以印出 FTP 資料夾底下的縮圖,連結到大圖




photo


<?php
$path = $_GET['path'];
if( $path == NULL){
	$path = ".";
}
if( ereg("..", $path) ){
	$path= ".";
}
echo "path is $path (作者不知道如何製作動態下載,請自行使用下載軟體下載所有連結)
n"; if( @!chdir("$path") ){ echo "error when chdir to $path
n"; $path= "."; } exec("ls", $file); $end = strrpos($path, "/"); $upper_path = substr($path, 0, $end); echo "上一層
n"; echo "full screen(推薦使用)n"; echo "n"; echo "n"; $i = 1; foreach( $file as $per_file ){ $string = filetype("$per_file"); if( $string == "file" && exif_imagetype("$per_file") ){ if( !ereg("thumb", $per_file) ){ if( !file_exists("$per_file"."thumb") ){ $size = GetImageSize("$per_file"); if($size[0] > $size[1]){ $height = $size[1]/($size[0]/200); $width = 200; } else{ $width = $size[0]/($size[1]/200); $height = 200; } $im0 = imageCreateFromJPEG("$per_file"); $im1 = imagecreatetruecolor($width, $height); imagecopyresized($im1, $im0 ,0 ,0 ,0, 0, $width, $height, $size[0], $size[1]); imagejpeg($im1, "$per_file"."thumb"); } echo "n"; if( ($i%5) == 0 ){ echo "n"; } $i++; } } elseif($string == "dir"){ echo "$per_file n"; } } echo "
"; echo ""; echo "
n"; echo "n"; ?>

Demo
http://kawaiftp.twbbs.org/photo/


上面這個範例的 readdir 是根據檔案在硬碟上面的索引來排列順序的,所以印出來的順序通常非常奇怪。
如果要依照檔名排列順序的話,改為像下面這份 code 用 exec 呼叫系統的 ls 來用也可以!




slide


<?php
$path = $_GET['path'];
$i = $_GET['i'];
$total = 0;
if( @!chdir("$path") ){
	echo "error when chdir to $path
n"; $path= "."; } exec("ls", $file); foreach( $file as $per_file ){ if( !ereg("thumb", $per_file) ){ $list_file[] = $per_file; $total++; } } $j = $i+1; if($j == $total){ echo "上一層
n"; echo "n"; echo "n"; echo "n"; } else{ echo "上一層
n"; echo "n"; echo "n"; echo "n"; } ?>

將傳遞參數的方法改為 GET ,這樣方便使用者分享網址,同時為避免傳入『../../』之類的參數窺探到系統檔案,加上判斷參數的三行程式碼!

if( ereg("..", $path) ){
	$path= ".";
}

比對如果傳入的參數有『..』的話,就把參數重設為『.』

為了讓 IE 這種破瀏覽器可以正確讀取中文網址,我加上在傳遞參數時把中文參數用 urlencode 編碼過

雖然有使用 urlencode 編碼過,但是如果使用 firefox 瀏覽網頁的話,網址列上面寫的依然是中文!

請大家愛用 firefox 或者其他開放原始碼瀏覽器,停用 IE 吧!

又進急診了!

醫生真幽默…


『那個針現在還插在我手上嗎?』

醫生『你又不是飛鏢的靶,幹麼一直插在你手上』

噢,那個麻醉針很痛地插下去之後

幾十秒後沒有感覺了,也沒有針拔出來的感覺

聽身邊的朋友說,那個針插進去之後還以針頭為支點左右移動

Q_Q

感覺我很容易受傷…進急診

大學到現在送急診三次了

二上出遊車禍

二下團慶意外被打昏,這次同時也是第一次坐救護車

四上手指頭戳入木屑

至於手指頭是怎麼被戳入木屑的呢!

因為今天一樓樓聚,去打保齡球

還沒開打,拿球的時候就被該死的木櫃邊邊戳到

剛開始不會痛,打完十局

嗯,你們續攤,先派一個人先送我去醫院掛急診…