Category Archives: Programming

Excel的一些技巧

最近跟着好朋友的表哥混饭吃,自学了些excel相关的三脚猫功夫。
微软真的太强大,word,excel已经横行天下,深得国人心,绑架我党及政府,成了为人民服务的利器。
希望以后可以为亲朋好友服务。
1. 函数相关
原来有两天函数,详细参考如下
http://www.cnblogs.com/dxy1982/archive/2011/09/08/2159541.html
害得我折腾了一个晚上vba…
countif函数,详见:http://club.excelhome.net/thread-713790-1-1.html
注意:
a. 在自定义函数中是不能设置单元格格式的。很奇怪,但是确实设置Range对象的NumericalFormatLocal是不成功的
2. 访问单元格
Range 是一个对象,封装单元格层面并提供对之的操作
3. 快捷键
合并单元格 经过设置后用 Alt + M
打开“插入-名字” Ctrl + F3
编辑格式 Ctrl + 1
4. 数组公式
ctrl + shift + enter
5. 保护工作表,防止修改
http://www.cnblogs.com/yuyang-DataAnalysis/archive/2011/11/24/2261405.html
6. 数组处理
vba 获取range当作数组处理: http://stackoverflow.com/questions/8718065/vba-reading-excel-range-into-an-object-array
ubound,lbound: http://carlinpl.blog.163.com/blog/static/19549913620119134494307/

两层指针的参数传值

#include <stdio.h>
 
void getCharX(char ** c)
{
char x = ‘X’;
char * cp = &x;
*c = cp;
}
 
int main(void)
{
char *xp;
getCharX(&xp);
printf("my char: %c", *xp);
return 0;
}

本质上是传入指针的地址,然后可以将函数内部分配的空间的地址传给函数外部的指针,根据指针地址存入指针空间中。

字符串中删除多余的空白符

编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格。这里所说的空白包括空格、’\t’、’\n’、’\r’。

#include <stdio.h>
 
int isSpace(char c)
{
if(c==’ ‘ || c==’\t’ || c==’\n’ || c==’\r’)
return 1;
else
return 0;
}
 
char * mergeSpace(char *dest, const char *src)
{
int spacePre=0;
 
int i,j;
for(i=0, j=0; src[i] !=’\0′; i++)
{
if(isSpace(src[i]))
{
[...]

迷宫寻路

import java.util.Deque;
import java.util.LinkedList;
 
/*
使用广度有限遍历实现迷宫路径
*/
public class Maze {
private class Point{
int x;
int y;
Point pre;
 
public Point(int x, int y, Point p) {
this.x = x;
this.y = y;
this.pre = p;
}
}
 
Point[] queue = new Point[256];
int head = 0, tail = 0;
 
public void enqueue(Point p) {
queue[tail++] = p;
}
 
public Point dequeue() {
return queue[head++];
}
 
public boolean isEmpty() {
return head == tail;
}
 
private static int MAX_ROW =5, MAX_COL [...]

单向链表操作

public class ListOperations {
private String id;
 
private class Node {
Node next;
int id;
 
Node(Node n, int id) {
this.next = n;
this.id = id;
}
 
@Override
public String toString() {
return Integer.toString(id);
}
}
 
/*
* 从后面添加节点
*/
public Node createList() throws IOException {
Node head = null, last = null;
 
boolean isHead = true;
byte[] inputId = new byte[1024];
while(true) {
System.out.println("Please input the id of the Node. And ‘0′ for exit");
int [...]

二叉树

 
/*
* 求二叉树的深度
*/
public class TreeDepth {
private class Node {
Node left;
Node right;
int id;
 
Node(Node l, Node r, int id) {
this.left = l;
this.right = r;
this.id = id;
}
}
 
public int getDepth(Node root) {
if(root == null)
return 0;
 
if(root.left == null && root.right == null)
return 0;
 
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
 
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + [...]

字符串操作

 
import java.util.HashMap;
import java.util.Map;
 
/*
* 给定一个字符串,其中一个字符出现的次数是奇数次,其余字符出现次数是偶数次,找出出现奇数次的那个字符
*/
public class OddChar {
public void methodByMap(char[] a) {
 
 
Map<Character, Integer> char_num = new HashMap<Character, Integer>();
for(int i=0; i<a.length; i++) {
char c = a[i];
if(char_num.containsKey(c)) {
char_num.put(c, char_num.get(c) + 1);
}
else {
char_num.put(c, 1);
}
}
 
for(Character c: char_num.keySet()) {
Integer integer = char_num.get(c);
if(integer % 2 == 1) {
System.out.println(c);
break;
}
}
}
 
public void methodByXOR(char[] a) {
if(a.length == 0) {
return;
}
 
if(a.length == 1) {
System.out.println(a[0]);
}
 
char k = [...]

初识Java项目管理工具Maven

最近浏览了一下许晓斌的《Maven实战》,作者是Maven专家,书写得深入浅出。作者定位Maven是一个基于java平台的项目建构、依赖管理和项目信息管理工具。通过他的介绍,我才晓得Maven可以干很多事情。从项目管理的角度切入,Maven可以完成项目名称、目录架构、依赖关系、建构过程(包括编译、测试这两个主要部分)及Web发布。
Maven中的核心概念:
1. 坐标
这个是用来唯一定位一个构件(最直白的代表是jar包形式的库):通过groupId, artifactId, version, packaging, classifier这几个tag来标识。
2. 依赖
这个主要是指构件间的依赖关系。我们一般是在开发一个项目,可以称其为当前构件,开发中一般会重用其他已经开发好的构件(典型的成为第三方jar包/库)。Maven将依赖关系描述成xml格式的结构化配置。
3. 仓库
存储和维护了很多构件,可以通过坐标定位并提供下载。这个类似于linux的软件源,只是里面存储的是构建而非软件。
4. 生命周期
Maven核心作用还是构建项目,从源码到字节码,到打包,再到测试集成,最后部署。Maven的这个过程采用了模板方法(template method),主类中实现了这个算法流程,将用到的方法暴露给子类重新实现,这样变得高可配。将这个构建过程严格规定化后称为生命周期。Maven中有三个生命周期:clean,default,site。每个生命周期中又被细分为很多阶段(phase)。一般运行命令行任务就是在执行某个生命周期,直到某个指定的阶段结束。
5. 插件
生命周期是一个抽象的定义,具体在构建过程中,Maven是调用插件来完成相应的构建任务。为了使构建足够灵活,Maven将完成生命周期中具体任务时候采用插件的方式交给插件构件完成(插件也是构件)。插件可以特定于构建过程中某个或者某几个阶段完成相应的任务。
在这种架构下,生命周期中完成具体任务的插件也是可配置的,而且插件间可以有依赖、继承关系(模块化软件构建),这些十分类似于构件的依赖问题。

Streaming in Hadoop

1. 基本过程
获取数据进程:数据输入文件夹下面的数据会变成流数据进入stdin,交给数据处理进程(process),然后该进程输出到stdout,并作为mapper的stdin。
map/reduce任务进程:进程一行一行(line by line)的从stdin读入数据记录,调用mapper/reducer中设定的可执行或者脚本(executable or script)处理每行记录,并把结果输出到stdout中。
2. 一些默认设置
数据默认以tab分割,也可通过参数配置;
默认的输入格式:-inputformat的参数是TextInputFormat,并且忽略掉LongWritable类型的key,只向mapper传递value
3. 参数设置
参数分为[genericOptions] [streamingOptions],必须先设定genericOptions,后设定streamingOptions,并且后者会覆盖前者。
-file 参数向cluster提交local的文档,包括mapper,reducer,share file等,这样可以把文档分布到集群上。
参考:官方文档 http://hadoop.apache.org/common/docs/r0.20.203.0/streaming.html

Serialization in Hadoop

1. Serialization in Hadoop using Writable interface
序列化(Serialization)是把内存中的结构化对象转换成可以在网络上传输和磁盘上存储的字节流的过程
反序列化(Deserialization)是序列化的反过程,即将字节流转成对象。
分布式系统中对象序列化主要用在两个方面:1. 进程间通信(interprocess communication),主要是将对象序列化后用于网络传输;2. 持久化(persistent storage),主要是将对象存储于磁盘。其实,本质上是一样的,将内存中的对象变成可序列传输和存储的字节流。
Hadoop定义了自己的序列化格式:可以序列化的类实现org.apache.hadoop.io.Writable接口。
Writable接口定义了两个方法:将自身的状态写入DataOutput对象中;从DataInput对象中读入状态数据。

public interface Writable {
/**
* Serialize the fields of this object to out.
*
* @param out DataOuput to serialize this object into.
* @throws IOException
*/
void write(DataOutput out) throws IOException;
 
[...]