Tuesday, February 19, 2013

emacs ansi-term mode


身為偉大的作業系統,內建一個支援 ansi 的 Terminal emulator  也是很正常的

M-x ansi-term

比較重要的

C-c C-j line mode    # ling scrolling
C-c C-k char mode





http://www.emacswiki.org/emacs/AnsiTerm

注意事項:


Also note that ansi-term remaps your default ‘C-x’ key to ‘C-c’.

In Emacs 22, try prefixing actions that aren’t recognized by their standard key commands with ‘C-x’. For example, ‘M-x’ becomes ‘C-x M-x’.




搭配 luit 可以開心的上 BBS 惹 ^q^

http://www.pps.univ-paris-diderot.fr/~jch/software/luit/

in bashrc

alias telnet="/usr/bin/luit -encoding big5 /usr/bin/telnet"

不過 BBS 的話可以在 .emacs 裡面寫防 idle 斷線


; anti idle for BBS                                                              
(defvar antiidle)                                                                
(defun enable-anti-idle ()                                                       
  (interactive)                                                                  
    (setq antiidle                                                               
      (run-with-timer 0 180 '(lambda ()                                          
        (term-send-up)                                                           
          (term-send-down)))))                                                   
                                                                                 
(defun disable-anti-idle ()                                                      
  (interactive)                                                                  
    (cancel-timer antiidle))

Tuesday, February 12, 2013

builtin http server


有時候會有需要臨時開個 http server ,傳東西或是啥得很方便




Python 有內建


[update] Python 3 這個 module 換了名字  0w0

$ python3 -m http.server 5566
$ python2 -m SimpleHTTPServer 5566


Perl 的話可以用這個 CPAN  module

$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>5566); $s->mount("/"=>{path=>"./"}); $s->start'


Ruby 也有內建,不過也是比較醜

$ ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 5566, :DocumentRoot => Dir.pwd).start'


php 5.4 後也有內建... 不過誰有 php54 呢(逃

$ php -S localhost:8000 -t ./

Linux change fonts

你需要一個路邊撿的 LiHeiPro


cp -r fontdir /usr/share/fonts
換字型就直接把裝字型的資料夾 cp -r 到 /usr/share/fonts 下面

sudo fc-cache -fv && sudo fc-list : file
更新 font cache


更多請參考鳥哥

http://linux.vbird.org/linux_basic/0590xwindow.php#fc-cache

Saturday, February 2, 2013

guess anonymous plurk's owner

匿名噗是噗浪近期提供的新功能

主要用意是讓大家可以趁亂告白講出內心的話

不過,猜猜噗主的真實身份其實也挺有趣的

寫了一個簡單的腳本來做這件事

其中 $p 是 plurk 的 API 物件,請參考其他機器人的 code


Usage:

給定一個 plurk link ,Ex. http://www.plurk.com/p/asdfgh

看 source code 可以拿到該噗的 plurk_id      Ex. data-pid="1094072786">

傳給這個 function 即可得到統計資料分析出可能的匿名噗擁有者

原理:紀錄該噗回應的好友交集,假若交集愈大的話愈可能是匿名噗的主人


sub guess_anon_by_pid {                                                         
    my $pid = shift;                                                            
    my %pool;                                                                   
    my @rank = ();                                                              
                                                                                
    my $response = $p->callAPI('/APP/Responses/get', plurk_id => $pid);                                                                
    for my $f_list (keys $response->{friends}) {                                
        my $fri = $p->callAPI('/APP/FriendsFans/getFriendsByOffset', user_id => $f_list, limit => 300);
        for (@$fri) {                                                           
            $pool{$_->{display_name}}++ if ($_->{display_name});                
        }                                                                       
    }                                                                           
                                                                                
    for (keys %pool) {                                                          
        push @rank, [$_, $pool{$_}];                                            
    }                                                                           
                                                                                
    @rank = sort {$b->[1] >= $a->[1]} @rank;                                    
                                                                                
    say $_->[0], " => ", $_->[1] for (@rank[0..10]);                            
}

Tuesday, January 22, 2013

processes & threads management

在系計中工作站管理很常遇到使用者的程式死在那邊,然後一直咬著工作站的 CPU 不放,因而讓工作站的  loading 飆高

以下是處理方法

1. 先 top / htop 看看是哪個東西佔有高 loading
$ top
$ htop

2. 對該 pid 作 renice
$ sudo renice 19 <pid>

3. 已經死掉的程式就直接 top/htop 裏面 kill 掉吧
$ sudo top

4. 如果是 multi-threading 的程式可能需要把運算資源限在某幾顆 cpu 裏面
$ taskset -pc 8-14 <pid>

5. more information

cpu core 數量

grep -E "^core" /proc/cpuinfo

詳細的 ps
ps amxo user,pgid,tid,pcpu,etime,comm --sort user,pgid

taskset
taskset -pc <pid>
taskset -pc <core list> <pid>

看 tid (for multi-threading porgrams)
 ps mp <pic> o tid



systemd-analyze


Arch 和很多 Linux 都開始逐漸改用 systemd 作為 service 管理,取代舊的 SysV rc scripts 。從 top 可以看到 pid 1 的程式就是 systemd (取代原本 Unix 的 init)

systemd 最大的好處就是可以平行的去把 service 叫起來,這篇要講的是在 optimize 時所使用的 profiling 工具:systemd-analyze

根據 man page :

       systemd-analyze blame prints a list of all running units, ordered by the time they took to initialize.This information may be used to optimize boot-up times. Note that the output might be misleading as the initialization of one service might be slow simply because it waits for the initialization of another service to complete.

       systemd-analyze plot prints an SVG graphic detailing which system services have been started at what time, highlighting the time they spent on initialization.

也就是說,主要用法非常簡單,只要兩個指令:

sudo systemd-analyze blame             # see the detail
sudo systemd-analyze plot > out.svg    # picture

blame 會印出花最多時間的服務。我這邊第一名是 dhcpcd@eth0.service

plot 顧名思義就是畫出精美的圖形:




阿!兇手現身了!


for optimization, you can mask/disable some thing 
sudo systemd mask/disable xxx.service     # mask is the stronger version of disable 


結語:systemd-analyze 是非常方便的 profiling 工具來幫助我們優化調整系統開機流程,以及關掉不必要的 service

Wednesday, January 16, 2013

simple RSS fetcher in Perl


寂寞考,念不下書寫點程式 Orz

把一年前 SA 作業寫過的 RSS feed fetcher 拿出來重刻一次,主要用到這兩個 CPAN modules:

https://metacpan.org/module/XML::Feed
https://metacpan.org/module/WWW::Shorten::TinyURL

可以看得出這一年來 Perl 功力的成長(?) 總之現在寫的比較乾淨了 :P

#!/usr/bin/perl -CDS

use 5.014;

use XML::Feed;
use WWW::Shorten::TinyURL;

# max articles number each feed
use constant THRESHOLD => 5;

# RSS feed urls
my @urls = (
    "http://feeds2.feedburner.com/solidot",
    "http://www.36kr.com/feed",
    "http://pansci.tw/feed",
    "http://blog.gslin.org/feed",
    "https://www.linux.com/rss/feeds.php",
    "http://www.linuxplanet.org/blogs/?feed=rss2",
    "http://perlsphere.net/atom.xml",
    "http://planet.linux.org.tw/atom.xml",
    "http://security-sh3ll.blogspot.com/feeds/posts/default",
    "http://feeds.feedburner.com/TheGeekStuff",
    "http://coolshell.cn/feed",
);

# force to print
$|++;
my $done = 0;
my @data = ();
for my $url (@urls) {
    say "fetching ..." . (sprintf "%2d", int ($done/@urls * 100)) . "%";

    # get RSS Feed via URI
    my $feed = XML::Feed->parse(URI->new($url)) or die XML::Feed->errstr;

    my $count = 0;
    for my $entry ($feed->entries) {
        push @data, [$feed->title, $entry->title, $entry->link];
        $count++;
        last if ($count >= THRESHOLD);
    }
    $done++;
}

say "done!";

for (@data) {
    say "$_->[0] | $_->[1]\n$_->[2]";
    my $short =  makeashorterlink($_->[2]);
    say $short;
    say "============================================";
}

get environment in C

一切都是從這篇有趣的 C-faq 開始

http://c-faq.com/ansi/envp.html

有人問了 main() 的 "the third argument" *env[] 是啥?

一般就會講到這個可怕的歷史

在一般的 Unix 底下,很多人會跟你說,可以用 *env[] 或是 extern const char **environ 去問到

甚至給出了這樣的 code ...


#include <stdio.h>
 
extern const char **environ;
 
int main(int argc, const char *argv[], const char *env[])
{
    int i;
    for (i = 0; env[i]; i++)
        printf("env %02d: %s\n", i, env[i]);
    printf("=========================================\n");
    
    for (i = 0; environ[i]; i++)
        printf("env %02d: %s\n", i, environ[i]);
    printf("=========================================\n");
    
    printf(env==environ? "They are same.\n": "They are different.\n");
    return 0;
}

/* 
Output:


env 00: TMPDIR=/tmp/p0rIMq
env 01: PATH=/usr/local/bin:/usr/bin:/bin
env 02: PWD=/home/oAdQev
env 03: LANG=en_US.UTF-8
env 04: HOME=/home/oAdQev
env 05: SHLVL=0
=========================================
env 00: TMPDIR=/tmp/p0rIMq
env 01: PATH=/usr/local/bin:/usr/bin:/bin
env 02: PWD=/home/oAdQev
env 03: LANG=en_US.UTF-8
env 04: HOME=/home/oAdQev
env 05: SHLVL=0
=========================================
They are same.
*/


去 man 一下 environ (7) 可以看到相關的歷史


根據標準,我們應該使用 getenv 來跟系統要環境變數

以下是 C11 Standard 的節錄:


請參考:
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#getenv
http://www.cplusplus.com/reference/cstdlib/getenv/


C++ 的 case 也類似,用 std::getenv()
http://en.cppreference.com/w/cpp/utility/program/getenv



更多說明可以看這篇棧溢出:

http://stackoverflow.com/questions/10321435/is-char-envp-as-a-third-argument-to-main-portable



Saturday, January 12, 2013

vim easter eggs

幾個有趣的 vim 彩蛋


Ref. http://vim.wikia.com/wiki/Best_Vim_Tips







生命、宇宙和萬物的答案      (梗如以上影片)                                                               
:help 42

尋找聖杯吧!
:help holy-grail

help!
:help!

修道院(?
:help map-modes

當用戶覺得無聊時
:help UserGettingBored

湯匙
:help spoon

神縮寫
:help showmatch

你需要灌木嘛
:Ni!


Ceci n'est pas une pipe
這不是一個 pipe
:help bar


永遠不要認為自己已經擺脫新手

永遠不要認為自己已經擺脫新手


上大學這一年多,看了一些人的現象、行為算是對自己的一些檢討吧

太多人認為自己不是新手,實際上卻...




某朋友說過:

以為自己會了,但其實不會,這比完全不懂的人更糟,因為他們會跟你爭論那些他們覺得是正確的知識



之前和系上某教授上課戰過一些 C language 的概念也是,雖然他是我的老師,我應該要尊敬他,但是我還是無法讓他將錯誤的觀念知識傳授給他人

戰到後來實在是無法說服頑固的老師,只好拿出 C11 Standard 來塞住他的嘴

當然最後老師灰頭土臉的知道他錯了,也說:"我想這方面的資訊我應該要 update 一下"

這其實是比較好聽的想法,很可惜,那天戰的東西在 ANSI C 一開始就有了 lol





正巧今天是 WebConf 2012 ,不過之前就知道下週還有期末修蘿場,於是就沒報名了



剛剛看噗看到一半,同樣的看到有人發了這樣的噗:

                        剛剛不小心誤闖新手場 = =…




誤入新手場,科科。

當然,聽 Conf 時跑錯場的機會在所難免,很常見好不容易搶到的位子結果該 talk 的主題或是程度和自己差太多。

很常見的思維弊病是看了一些也許比較接近初學者的人後就覺得自己是高手,這顯然是錯誤的。

像我反而會開始檢討,我和身邊這些人的程度也許有差,那是不是因為我自己不夠努力而找不到高手願意學習?或者是因為我自己的程度也跟我身邊的人其實也相差無幾?

真正的高手是深藏不露的,而且他們虛懷若谷,遇到新手會非常熱心且有耐心的指導。像是 freenode 上 #perl 就很多這樣的 hackers ,他們解答疑問,題點我們思路的盲點,或是補足我們知識的不足。這些高手是不會看不起新手的。

有個很好的習慣,常常跑到書店或是圖書館去閱讀,找那些給 Beginners 的書。最基本的練習、最基礎的圖書、最基礎的教材再三而閱讀的話往往能帶給我們有趣的思想。舉個例好了,從去年年初算來寫 Python 也算是寫了一陣子了,最近閱讀的 ThinkPython 就帶給我很大的啟發。愈是給初學者的教材,往往會更用心的編輯,明確指示哪邊該注意、該小心,或是更清楚地說明正確的觀念。

看新手書籍的好處是,可以再三的檢視自己的習慣,是否有一些不錯的 coding style 可以學習,這些都是對於就算是五年十年以上的編程老手還是有可以自我檢討學習的地方吧!



老媽常說一句話:

How do you know you don't know?


我們無法知道那些我們不知道的,我不知道"我其實不知道"。



給自己一點反省 : )



其實會寫這篇文章的原因是看了強者我朋友 __CA__ 和 PkmX 學長在 ptt 某串系列文的關係 :P