blog.Ring.idv.tw

Articles

Average Length of URL? - Using Hadoop New API

「Average Length of URL?」這是之前寫的一個小範例,由於Hadoop在0.20.0版就新增了全新的API(HADOOP-1230),不過它的文件則一直要到0.21.0版才會補齊(Modify the mapred tutorial documentation to use new mapreduce api.),而本文純粹將原先的版本改寫成新的API版本,如下所示:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.Counters;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class URLAvgLength
{
	static enum URLCounter
	{
		COUNT
	}

	public static class URLMapper extends Mapper<Object, Text, Text, IntWritable>
	{
		private Text len = new Text("Len");

		public void map(Object key, Text value, Context context) throws IOException, InterruptedException
		{
			context.write(len, new IntWritable(value.getLength()));
			context.getCounter(URLCounter.COUNT).increment(1);
			context.setStatus(value.toString());
		}
	}

	public static class URLReducer extends Reducer<Text, IntWritable, Text, IntWritable>
	{
		private IntWritable result = new IntWritable();

		public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
		{
			int sum = 0;
			for (IntWritable val : values)
			{
				sum += val.get();
			}
			result.set(sum);
			context.write(key, result);
		}
	}

	public static void main(String[] args) throws Exception
	{
		String input = "/user/shen/urllist/*";
		String output = "/user/shen/urlavglen";

		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(conf);
		fs.delete(new Path(output), true);

		Job job = new Job(conf, "URLAvgLength");
		job.setJarByClass(URLAvgLength.class);
		job.setMapperClass(URLMapper.class);
		job.setCombinerClass(URLReducer.class);
		job.setReducerClass(URLReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		FileInputFormat.addInputPath(job, new Path(input));
		FileOutputFormat.setOutputPath(job, new Path(output));

		boolean status = job.waitForCompletion(true);
		Counters cs = job.getCounters();
		Counter c = cs.findCounter(URLCounter.COUNT);
		long count = c.getValue();

		InputStream in = fs.open(new Path("hdfs://shen:9000" + output + "/part-r-00000"));
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		String line = br.readLine();
		Integer value = Integer.parseInt(line.split("\t")[1]);
		System.out.println("Avg:" + value / count);

		System.exit(status ? 0 : 1);
	}
}

上述範例中,「Counter」和「Status」都已經從原先的「Reporter」換成了「Context」來處理,同樣地可以從JobTracker Admin(default:50030)來看執行的狀態。

相關資源

.Upgrading To The New Map Reduce API

.What’s New in Hadoop Core 0.20

2009-10-29 18:16:45 | Comments (2)

Augmented Reality in Flash - FLARToolKit

Augmented Reality這個詞主要是在1990年的時候由波音公司的一位「Thomas Caudell」工程師所提出來的(根據wiki的說法),Augmented Reality可以讓我們將虛擬的產物和真實世界結合在一起,可以想像如1996年的一部「Space Jam」電影,該電影將虛擬世界的卡通人物和Michael Jordan結合的作法,只不過那是電影後製的處理手法,而Augmented Reality則是更能實際和生活中結合。

要建構這方面的應用最初可以透過Dr. Hirokazu Kato所開發的ARToolKit library,它是一個採用C/C++的函式庫,不過有許多熱心的人都已經將它移植到其它語言了,所以如果你是用Flash/ActionScript開發的話,那麼可以使用Saqoosha所移植的「FLARToolKit」,只是它也遵循著ARToolKit的腳步採用GNU General Public License,所以如果想商業化的話則必須取得它的Commercial License。

相關資源

.手機科技可以讓你看到鬼了!

.ARToolKit 實戰/教學(一) 建置篇

.FlarToolkit/Flash Augmented Reality - Getting Started

.Scorpio: FLARToolkit簡單教學

.【教學】PV3D 結合 flartoolkit

2009-10-23 19:25:15 | Add Comment

[Chrome擴展套件] Ymedia Downloader 天空部落影音下載器 v0.1

兩年多前筆者曾寫了手動下載天空部落「影音」和「音樂」兩篇的po文,不過這都是需要「手動下載」~

然而隨著Google Chrome的發展,根據「Extensions at Google I/O」的說明(2009年5月),我們已經可以自行開發Chrome Extensions(副檔名為crx)。

開發Chrome Extensions必須先將你的Chrome改成Dev版本,可以參考「Early Access Release Channels 」,另外除了參考官方的教學之外,也有「www.chromeextensions.org」提供許多Chrome Extensions的集中地~

由於Chrome Extension的crx檔也是像Adobe AIR的air檔採用zip壓縮,所以可以很方便的解開,如果想學習它人如何開發的話... 不失為一種方式,但還是要尊重它人的智財權:)。

使用Ymedia Downloader 天空部落影音下載器 v0.1

請點擊「ymedia.crx」安裝,完成之後會在瀏覽器下方的工具列上看到下圖:

接下來只要當你瀏覽天空部落的任一個影音網站時,點擊上圖的按鈕就會立即下載您目前所處於瀏覽的影音!!

如果有任何問題的話,歡迎給予建議或回饋,謝謝。

2009-09-22 19:59:48 | Add Comment

09/09/09 TransNote 線上輔助閱讀工具.改版了!!

TransNote.線上輔助閱讀工具

自從去年10月7日推出以來,陸續收到許多熱心朋友所提供的寶貴建議,直到今天... 我們推出新版了!

新版本所強調的是提供「個人化服務」,同樣地此版本也保留「整合翻譯的操作介面」,並且設計一個全新的TransNote閱讀介面,歡迎大家來使用這個好工具,如果有任何建議也可以在此留言,謝謝。

改版特點

1.您現在可以「儲存」目前所閱讀的文件,也可以將此文件和朋友「分享」或發佈到您的「Twitter」上,另外也可以針對單一文件進行是否「開放」閱讀的權限控管。

2.在閱讀的過程中也可以使用「字典查詢」。

3.另外在閱讀的時候也可以使用「Ctrl + z」快速鍵來返回上一個操作步驟。

4.您可以將右上角的「bookmarklet」加入到您的書籤工具列,只要選取文字後點選此書籤就可以直接將所選取的文字加到TransNote的文字輸入框內,以節省「拷貝」和「複製」的動作。

5.在「個人管理」內提供屬於自己的「Tag Cloud」。

6.目前「搜尋」功能仍保留,這部份未來才會開發。

2009-09-09 16:01:12 | Comments (2)

淺談Tuple

Tuple.在Python程式語言中是一個immutable data structure,也可以將它當做是immutable list,也由於它是不可變的,所以它沒有像list擁有的一些append、remove等函式可供使用,那這樣的話為何還需要它呢?大致上有下述三點:

1. 它可以讓程式更具安全性,這裡的安全性指的是它具備不被更改的可能。

2. 由於它是immutable,所以也可以用來當作dictionary的key來使用。

3. 和list相較之下,Tuple在建構時的速度上較快。

下述來看一些實例:

>>> def a():
...     x = [1,2,3]
... 
>>> def b():
...     x = (1,2,3)
... 
>>> import dis
>>> dis.dis(a)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 BUILD_LIST               3
             12 STORE_FAST               0 (x)
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        
>>> dis.dis(b)
  2           0 LOAD_CONST               4 ((1, 2, 3))
              3 STORE_FAST               0 (x)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE        

從上述這兩個bytecode instructions來看,在建構Tuple所需要的指令較少,也意謂著在建構時的速度較快,實證如下:

python -m timeit "x=(1,2,3,4,5,6,7,8,9,10)"
10000000 loops, best of 3: 0.0261 usec per loop
python -m timeit "x=[1,2,3,4,5,6,7,8,9,10]"
10000000 loops, best of 3: 0.177 usec per loop

透過Tuple大約只耗費了「0.0261 usec」,至於List則需要「0.177 usec」左右~ 但如果比較兩者存取的速度上來看,List會顯得較有效率上的優勢。

python -m timeit -s "x=(1,2,3,4,5,6,7,8,9,10)" "y=x[3]"
10000000 loops, best of 3: 0.0649 usec per loop
python -m timeit -s "x=[1,2,3,4,5,6,7,8,9,10]" "y=x[3]"
10000000 loops, best of 3: 0.0584 usec per loop

相關資源

Are tuples more efficient than lists in Python?

32.12. dis — Disassembler for Python bytecode

2009-08-23 17:11:13 | Add Comment

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 分類 :::

::: 最新文章 :::

::: 最新回應 :::