Configure JDK on Linux

Configure JDK

Decompression JDK to

1
/usr/lib/jvm

See if there is other optional Java

1
sudo update-alternatives --list java

Configure environment varible:

1
2
3
4
5
6
sudo gedit ~/.bashrc
## copy and paste
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_55
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:{JRE_HOME}/lib
export PATH=PATH

Success or Fail

1
java -version

Linux Add Fonts

Add fonts on Linux

Step 1:

1
2
3
## Copy and  authorize
sudo cp $fontspath /usr/share/fonts/
sudo chmod u+rwx /usr/share/fonts/xpfonts/*

Step 2:

1
2
3
4
5
## Make font cache
cd /usr/share/fonts/xpfonts
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

Step 3:

1
sudo reboot

C++ Trick

C++ Trick

1.

1
2
3
C++ 11
std::to_string() 要 g++ -std=c++11
g++ -std=c++11 -w file.cpp -o file 使用c++11标准,并且忽略所有警告

2.

1
有人也许以为i++或者++i的效率比拆开之后要高,这只是一种错觉。这些代码经过基本的编译器优化之后,生成的机器代码是完全没有区别的。自增减表达式只有在两种情况下才可以安全的使用。一种是在for循环的update部分,比如for(int i = 0; i < 5; i++)。另一种情况是写成单独的一行,比如i++;。这两种情况是完全没有歧义的。你需要避免其它的情况,比如用在复杂的表达式里面,比如foo(i++),foo(++i) + foo(i),…… 没有人应该知道,或者去追究这些是什么意思。

3.

1
有人可能会说,全都打上花括号,只有一句话也打上,多碍眼啊?然而经过实行这种编码规范几年之后,我并没有发现这种写法更加碍眼,反而由于花括号的存在,使得代码界限明确,让我的眼睛负担更小了。

4.

1
2
3
4
5
6
7
避免使用continue和break。循环语句(for,while)里面出现return是没问题的,然而如果你使用了continue或者break,就会让循环的逻辑和终止条件变得复杂,难以确保正确。
出现continue或者break的原因,往往是对循环的逻辑没有想清楚。如果你考虑周全了,应该是几乎不需要continue或者break的。如果你的循环里出现了continue或者break,你就应该考虑改写这个循环。改写循环的办法有多种:

如果出现了continue,你往往只需要把continue的条件反向,就可以消除continue。
如果出现了break,你往往可以把break的条件,合并到循环头部的终止条件里,从而去掉break。
有时候你可以把break替换成return,从而去掉break。
如果以上都失败了,你也许可以把循环里面复杂的部分提取出来,做成函数调用,之后continue或者break就可以去掉了。

5.

1
如果你把异常catch了,忽略掉,那么你就不知道foo其实失败了。这就像开车时看到路口写着“前方施工,道路关闭”,还继续往前开。这当然迟早会出问题,因为你根本不知道自己在干什么。catch异常的时候,你不应该使用Exception这么宽泛的类型。你应该正好catch可能发生的那种异常A。使用宽泛的异常类型有很大的问题,因为它会不经意的catch住另外的异常(比如B)。你的代码逻辑是基于判断A是否出现,可你却catch所有的异常(Exception类),所以当其它的异常B出现的时候,你的代码就会出现莫名其妙的问题,因为你以为A出现了,而其实它没有。这种bug,有时候甚至使用debugger都难以发现。

6.

1
2
3
4
5
6
7
不要把null放进“容器数据结构”里面。所谓容器(collection),是指一些对象以某种方式集合在一起,所以null不应该被放进Array,List,Set等结构,不应该出现在Map的key或者value里面。把null放进容器里面,是一些莫名其妙错误的来源。因为对象在容器里的位置一般是动态决定的,所以一旦null从某个入口跑进去了,你就很难再搞明白它去了哪里,你就得被迫在所有从这个容器里取值的位置检查null。你也很难知道到底是谁把它放进去的,代码多了就导致调试极其困难。
解决方案是:如果你真要表示“没有”,那你就干脆不要把它放进去(Array,List,Set没有元素,Map根本没那个entry),或者你可以指定一个特殊的,真正合法的对象,用来表示“没有”。
```
7.
```C++
char num[128];
cin >> setw(127) >> ... 限定输入字符数

8.

1
2
inline本身还是有另外一个意义: 
一个可执行文件的cpp文件中一个函数只能被定义一次。如果你把函数定义在一个.h文件中并让两个cpp包含就会造成这个函数分别在两个cpp中被定义产生错误。但是inline函数是允许在多个cpp中多次定义的,就解决了这个问题。

C Trick

C Trick

BASIC

1
2
scanf( "%[^\n]", str );     回车才返回
printf中 %zu 可输出size_t类型且不报警告

底层是指针实现
a[5] == 5[a];
“ABCD”[2] == 2[“ABCD”] == ‘C’;
相当于(a + 5) == (5 + a)


1
2
3
4
5
6
7
#include <stdio.h>
int main(void){
int x = 5;
printf("%d and ", sizeof(x++)); // note 1
printf("%d\n", x); // note 2
return 0;
}

result:4 and 5, 因为 sizeof 是编译时行为,运行时不会执行


MACRO


#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。


下划线是变量
(, );
__
[];
__
=&__;


GNU C EXTEND


gcc的C扩展支持嵌套函数(函数里可以再定义函数). clang的C好像还有闭包..
http://www.anwcl.com/wordpress/c%E8%AF%AD%E8%A8%80%E7%9A%84tricks%E4%B8%8E%E6%9C%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA-undefined-behavior/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
static const unsigned char a[] = {
#include "values.txt"
};

int main(int argc, char *argv[])
{
int i;

for (i = 0; i < sizeof(a); ++i)
printf("a[%d] = %d\n", i, a[i]);
return 0;
}

values.txt
1,2,3,4,5,
6,7,8,9,0,

1
2
3
4
5
6
来自Linux Kernel的例子,一般用得比较少
static struct usb_driver usb_storage_driver = { .owner = THIS_MODULE,
.name = "usb-storage",
.probe = storage_probe,
.disconnect = storage_disconnect,
.id_table = storage_usb_ids, };

匿名数据结构:匿名数组、匿名结构体等。实现Lisp的List

1
2
3
4
5
6
7
8
9
10
int main() {
struct mylist {int a; struct mylist* next;};
#define cons(x, y) (struct mylist[]){{x, y}}
struct mylist *list = cons(1, cons(2, cons(3, NULL)));
struct mylist *p = list;
while(p != 0) {
printf("%d\n", p->a);
p = p -> next;
}
}

TRICK

C++1x 可以用 auto 来省略类型声明, 而 C 的 auto 关键字意思完全不同但明显是个废话(auto 的意思是非 static, 和不写一样), 还好有 C 有 typeof

异或实现双链表
https://en.wikipedia.org/wiki/XOR_linked_list

STUDY SOURCE

duff‘s device
https://en.wikipedia.org/wiki/Duff%27s_device
trigraph
http://blog.sina.com.cn/s/blog_4b687eac01008ice.html

Laptop cannot wakeup

##ubuntu挂起后不能唤醒解决

1
2
3
4
5
6
7
8
9
10
11
12
##安装pm-utils  
sudo apt-get install pm-utils
##安装laptop-mode-tools
sudo apt-get install laptop-mode-tools
##查看是否启动laptop_mode
cat /proc/sys/vm/laptop_mode #如果显示结果为0,则表示未启动

##解决方案
更改/etc/default/acpi-support中ENABLE_LAPTOP_MODE=true
sudo gedit /etc/default/acpi-support
##想启动laptop_mode模式
sudo laptop_mode start

Split Screen

使用 wmctrl 和一段脚本就可以实现基本的屏幕对切的功能:

安装 wmctrl

1
sudo apt-get install wmctrl

安装 shell 脚本

1
2
3
4
5
6
7
8
#!/bin/sh
set -- $(xwininfo -root| awk -F '[ :]+' '/ (Width|Height):/ { print $3 }')
width=$1
height=$2
win1=$(xwininfo| awk '/^xwininfo: W/ { print $4 }')
win2=$(xwininfo| awk '/^xwininfo: W/ { print $4 }')
wmctrl -i -r $win1 -e 0,0,0,$((width/2)),$height
wmctrl -i -r $win2 -e 0,$((width/2)),0,$((width/2)),$height