劳动合同法中关于公司辞退员工四个重要条款(四十,四十七,四十八和八十七)

最近遇到法律问题,主要涉及到以下几个条款,写blog备忘·

劳动合同法全文见: http://baike.baidu.com/view/1027506.htm

第四十条
  有下列情形之一的,用人单位提前三十日以书面形式通知劳动者本人或者额外支付劳动者一个月工资后,可以解除劳动合同:
  (一)劳动者患病或者非因工负伤,在规定的医疗期满后不能从事原工作,也不能从事由用人单位另行安排的工作的;
  (二)劳动者不能胜任工作,经过培训或者调整工作岗位,仍不能胜任工作的
  (三)劳动合同订立时所依据的客观情况发生重大变化,致使劳动合同无法履行,经用人单位与劳动者协商,未能就变更劳动合同内容达成协议的。

第四十七条
  经济补偿按劳动者在本单位工作的年限,每满一年支付一个月工资的标准向劳动者支付。六个月以上不满一年的,按一年计算;不满六个月的,向劳动者支付半个月工资的经济补偿。
  劳动者月工资高于用人单位所在直辖市、设区的市级人民政府公布的本地区上年度职工月平均工资三倍的,向其支付经济补偿的标准按职工月平均工资三倍的数额支付,向其支付经济补偿的年限最高不超过十二年。
  本条所称月工资是指劳动者在劳动合同解除或者终止前十二个月的平均工资。

第四十八条
  用人单位违反本法规定解除或者终止劳动合同,劳动者要求继续履行劳动合同的,用人单位应当继续履行;劳动者不要求继续履行劳动合同或者劳动合同已经不能继续履行的,用人单位应当依照本法第八十七条规定支付赔偿金。

第八十七条
  用人单位违反本法规定解除或者终止劳动合同的,应当依照本法第四十七条规定的经济补偿标准的二倍向劳动者支付赔偿金。

POJ1002 Phone Number Duplication

上周三做了一道简单的poj题目,但是虽然简单却有比较大的收获,主要有四点:
1.gets()比cin()快
2.cin()不自动吃掉’\n’,需要的话,用getchar()吃掉
3.printf(“%.3d”,anInt),不足3位在前面补0
4.时间问题,抓主要矛盾(线性搜索改为二叉树搜索),new操作都是次要的,链表比数组慢也是次要的

下面是代码:

<

pre class=”brush:cpp;auto-links:false”>
// main.cpp
// POJ1002-PhoneNumberDuplication
// Created by Qiu Xiangyu on 12-7-10.
// gets()比cin()快
// cin()不自动吃掉’\n’,需要的话,用getchar()吃掉
// printf(“%.3d”,anInt),不足3位在前面补0
// 时间问题,抓主要矛盾(线性搜索改为二叉树搜索),new操作都是次要的,链表比数组慢也是次要的

include

//#include
using namespace std;

struct node{
long phoneNumber;
int repeatCount;
node leftChild;
node *rightChild;
node *parant;
};
inline int translateCode(char c)
{
if (c >= ‘0’ && c <= ‘9’) {
return c – ‘0’;
}
if (c >= ‘A’ && c <= ‘O’) {
int num = c – ‘A’;
return num / 3 + 2;
}
if (c == ‘P’ || c == ‘R’ || c == ‘S’) {
return 7;
}
if (c >= ‘T’ && c <= ‘V’) {
return 8;
}
if (c >= ‘W’ && c <= ‘Y’) {
return 9;
}
return -1;
}
inline node *findNodeWithNumber(node
startNode, long number)
{
if (startNode == NULL) {
return NULL;
}
if (startNode->phoneNumber == number) {
return startNode;
} else if (startNode->phoneNumber < number) {
if (startNode->rightChild == NULL) {
return startNode;
}
return findNodeWithNumber(startNode->rightChild, number);
} else {
if (startNode->leftChild == NULL) {
return startNode;
}
return findNodeWithNumber(startNode->leftChild, number);
}
}
bool haveDuplication = false;
inline void output(node *root)
{
if (root == NULL) {
return;
}
output(root->leftChild);

if (root->repeatCount > 1) {
    haveDuplication = true;
    long phoNum = root->phoneNumber;
    int first = phoNum / 10000;
    int last = phoNum % 10000;
    printf("%.3d-%.4d %d\n",first,last,root->repeatCount);
}

output(root->rightChild);

}
int main(int argc, const char * argv[])
{
node *head = NULL;
int totalNumber;
cin>>totalNumber;
getchar();
// cout<<“total:”<<totalNumber<<endl;
for (int iNumber = 0; iNumber < totalNumber; iNumber ++) {
char inputbuffer[500];
char *str = inputbuffer;
gets(str);
// cout<<aNumber<<endl;
// cout<<str;
long phoneNumber = 0;
int strLen = strlen(str);// aNumber.length();
// if (strLen == 0) {
// iNumber–;
// continue;
// }
for (int ichar = 0; ichar < strLen; ichar ++) {
char c = str[ichar];
if (c == ‘-‘) {
continue;
}
int num = translateCode(c);
if (num == -1) {
continue;
}
phoneNumber = 10 * phoneNumber + num;
}
// cout<<phoneNumber<<endl;
node *phoneNode = findNodeWithNumber(head, phoneNumber);
if (phoneNode) {
if (phoneNode->phoneNumber == phoneNumber) {
phoneNode->repeatCount ++;
} else if (phoneNode->phoneNumber < phoneNumber) {
node *parant = phoneNode;
node *child = new node();
child->phoneNumber = phoneNumber;
child->repeatCount = 1;
child->parant = parant;
parant->rightChild = child;
} else {
node *parant = phoneNode;
node *child = new node();
child->phoneNumber = phoneNumber;
child->repeatCount = 1;
child->parant = parant;
parant->leftChild = child;
}
} else {
phoneNode = new node();
phoneNode->phoneNumber = phoneNumber;
phoneNode->repeatCount = 1;
head = phoneNode;
}
}
// cout<<“done”<<endl;
output(head);
if (!haveDuplication) {
cout<<“No duplicates.”<<endl;
}
return 0;
}

xcode换了电脑之后无法在真机调试(无code sign)

没有了mac本,只好在台式机的虚拟机内装一个mac来进行开发,但是却遇到一个问题:
以前在mac本上使用好好的developer apple id,在新环境下无法进行开发。xcode会自动去获取各种证书和provisioning文件,但是在codeSign下拉列表中就是不见可用的code sign选项。
苹果开发者网站上的流程走了几遍也没有用,花了好多时间,不过最终在support里面找到了解决方法:
1.删除key chain里面所有和开发账户相关的内容
2.删除xcode organizer里面的所有无效provisioning
3.需要在开发者网站portal里面找到certificate,先点一下”Revoke”
4.点xcode organizer provisioning标签下的”Refresh”(右下角)

到此终于搞定。

通过javascript控制flash

昨天研究一个用C#写的自动化应用,针对一个网页的按钮进行点击操作,这一步可以用javascript很自然的解决(见:利用JavaScript从UIWebView获取、修改、提交网页内数据的方法)。

怎么在C#中利用webbrowser运行javascript可以参见:C#中让WebBrowser运行Javascript脚本

然后页面居然弹出来一个flash,第二步的操作时针对这个flash的。为了解决这个问题,只好对flash进行反编译(用到了一个叫做“硕思闪客精灵”的软件),才看到里面的代码。好在于网上有很多关于javascript和flash的交互方法。可以通过javascript来调用flash中的方法。在查看了flash的源代码之后,发现需要调用其中一个函数(叫做function吧)。

实现方法就是:
第一步,拿到flash对象
好在于在页面内部我直接找到了这个函数,要针对不同的浏览器用不同的方式获取,代码如下:

  1. function getSWF(a){
  2.   if(navigator.appName.indexOf(\”Microsoft\”)!=-1){
  3.     return window[a];
  4.   } else {
  5.     if(window.navigator.userAgent.indexOf(\”Firefox\”)!=-1){
  6.       return document[a];
  7.     } else {
  8.       if(window.navigator.userAgent.indexOf(\”Chrome\”)!=-1){
  9.         return document[a];
  10.       } else {
  11.         if(window.navigator.userAgent.indexOf(\”Safari\”)!=-1){
  12.           return document.getElementById(a);
  13.         } else {
  14.           if(window.navigator.userAgent.indexOf(\”Opera\”)!=-1){
  15.             return document[a];
  16.           }
  17.         }
  18.       }
  19.     }
  20.   }
  21. }
  1. flash=getSWF(‘flashName’);

第二步,调用flash中的方法

  1. flash.function();

另外一些可用的方法如下:
播放:Play()
停止: StopPlay()
停止并回到首帧: Rewind()
下一帧: TGetProperty(nameOfTargetMovieClip, propertyIndex) and GotoFrame(frameNum)
方大或缩小: Zoom(relative percentage)
发送数据: SetVariable(variableName, variableValue)
读取数据: GetVariable(variableName)

ubuntu用户以及组管理

ubuntu中的用户和组管理

======重要文件======
/etc/passwd
用户账户文件,每行一个用户,每行有7个字段,分别是:
登录名:有无口令:用户ID:组ID:账户备注信息:用户Home目录:登录时用户shell的名称

/etc/shadow
用户口令文件,每行一个用户,字段分别为:
登录名:加密的口令:上次更改口令距离1970.1.1的天数:口令更改后不可更改的天数:口令更改后必须再更改的天数(有效期):口令失效前警告用户的天数:口令失效后距帐号被查封的天数:帐号被封时距1970.1.1的天数:保留未用

/etc/group
组账户文件,每行一个组,字段为:
组名:组加密口令:GID:组成员列表

/etc/gshadow
组口令文件,每行一个组,字段为:
用户组:用户组加密口令:组管理员帐号:组成员列表

======常用命令======
useradd
添加用户

usermod
修改用户属性

userdel
删除用户

groupadd
添加组

groupmod
修改组账号

groupdel
删除组账号

passwd
口令维护,超级用户可以设置其他人的口令,其他用户只能设置自己的

gpasswd
组成员维护,添加、删除、管理组管理员

id
查看用户状态,包括id,所属组等。也可以查别人的。

参考:
http://my.oschina.net/zhangqingcai/blog/32094

在iOS开发中利用GCD进行多线程编程

GCD = Grand Central Dispatch,是苹果开发中针对多线程编程的一个框架,在iOS4.0中引入。



>>>>>>>>iOS中的多线程有以下几个办法
1.performSelector(InBackground or MainThread)
这个方法比较方便,但是问题在于参数传递只能支持一个对象(传多个参数,我是将其打包在一个NSDictionary里面)
2.NSOperationQueue
这个方法稍微复杂,提供了每个任务的封装(NSOperation)。可以继承NSOperation之后,在main函数中写一些同步执行的代码,然后放到一个Queue之中,Queue自动管理Operation的执行和调度(在UI线程以外)。对于异步执行的代码,需要重载NSOperation的好几个函数才能正常工作(告诉Queue关于这个任务的进度以及执行情况)。
3.NSThread
这种方法我还没有研究过,不过直觉会比较复杂。
4.GCD
在UI线程和其它线程之间切换很方便,我喜欢的方式是和NSOperationQueue搭配使用。本文着重介绍这个方法。



>>>>>>>>GCD的使用方法
以点击一个按钮,然后显示loading,同时在后台下载一张图片,最后将下载的图片放到UIImageView中显示为例。

  1.     //显示loading
  2.     self.indicator.hidden = NO;
  3.     [self.indicator startAnimating];
  4.     //进入异步线程
  5.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  6.         //异步下载图片
  7.         NSURL * url = [NSURL URLWithString:@“http://anImageUrl”];
  8.         NSData * data = [NSData dataWithContentsOfURL:url];
  9.         //网络请求之后进入主线程
  10.         dispatch_async(dispatch_get_main_queue(), ^{
  11.             //关闭loading
  12.             [self.indicator stopAnimating];
  13.             self.indicator.hidden = YES;
  14.             if (data) {//显示图片
  15.                 self.imageView.image = [UIImage imageWithData:data];
  16.             }
  17.         });
  18.     });

这样利用GCD可以把关于一个任务的代码都放在一起。而不是像采用第一种方法一样代码到处散落。



>>>>>>> 利用GCD延迟执行任务的方法

  1. // 延迟2秒执行:
  2.     double delayInSeconds = 2.0;
  3.     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
  4.     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  5.         // code to be executed on the main queue after delay
  6.     });



>>>>>>> 创建自己的Queue

  1. dispatch_queue_t custom_queue = dispatch_queue_create(“customQueue”, NULL);
  2.     dispatch_async(custom_queue, ^{
  3.         //doing something in custom_queue
  4.     });
  5.     dispatch_release(custom_queue);



>>>>>>> 利用GCD并行多个线程并且等待所有线程结束之后再执行其它任务

  1.     dispatch_group_t group = dispatch_group_create();
  2.     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
  3.         // 并行执行的线程一
  4.     });
  5.     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
  6.         // 并行执行的线程二
  7.     });
  8.     dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
  9.         // 汇总结果
  10.     });



参考
http://blog.iosxcode4.com/archives/212

站点备份脚本

昨天研究了mysql怎么备份,今天在昨天的基础上研究了一下tar的使用以及在此基础上的整个站点备份的方法:

tar的简单使用

  1. //将一堆文件或者文件夹创建tar
  2. tar cf atarname.tar somefile somedir
  3.  
  4. //查看tar文件包的内容
  5. tar xvf atarname.tar
  6.  
  7. //解包
  8. tar xf atarname.tar

备份站点

  1. # the directory for story your backup file.
  2. backup_dir=“/backupdir”
  3. #dirs to backup
  4. discuzRoot=“/discuzLocation”
  5.  
  6. customAvatar=“$discuzRoot/uc_server/data/avatar”
  7. attachment=“$discuzRoot/data/attachment”
  8.  
  9. TAR=“$(which tar)”
  10. $TAR cf $backup_dir/filebackup.tar $customAvatar $attachment

再加上数据库的备份文件,就ok了。不过还是觉得文件这部分还是用ftp软件的增量备份比较好。如果这样打包备份的话,一来文件比较大,二来服务器每次备份开销也大。

mysql在linux系统下的备份脚本

转自:http://os.chinaunix.net/a2006/0823/970/000000970876.shtml
空了修改修改就能备份整个站点了

脚本如下:

  1.     #!/bin/sh
  2.     # mysql_backup.sh: backup mysql databases and keep newest 5 days backup.
  3.     #
  4.     # Last updated: 20 March 2006
  5.     # ———————————————————————-
  6.     # This is a free shell script under GNU GPL version 2.0 or above
  7.     # Copyright (C) 2006 Sam Tang
  8.     # Feedback/comment/suggestions : http://www.real-blog.com/
  9.     # ———————————————————————-
  10.     # your mysql login information
  11.     # db_user is mysql username
  12.     # db_passwd is mysql password
  13.     # db_host is mysql host
  14.     # —————————–
  15.     db_user=“root”
  16.     db_passwd=“”
  17.     db_host=“localhost”
  18.     # the directory for story your backup file.
  19.     backup_dir=“”
  20.     # date format for backup file (dd-mm-yyyy)
  21.     time=“$(date +”%d-%m-%Y“)”
  22.     # mysql, mysqldump and some other bin’s path
  23.     MYSQL=“$(which mysql)”
  24.     MYSQLDUMP=“$(which mysqldump)”
  25.     MKDIR=“$(which mkdir)”
  26.     RM=“$(which rm)”
  27.     MV=“$(which mv)”
  28.     GZIP=“$(which gzip)”
  29.     # check the directory for store backup is writeable
  30.     test ! w $backup_dir >> echo “Error: $backup_dir is un-writeable.” >> exit 0
  31.     # the directory for story the newest backup
  32.     test ! “$backup_dir/backup.0/” >> $MKDIR “$backup_dir/backup.0/”
  33.     # get all databases
  34.     all_db=“$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse ‘show databases’)”
  35.     for db in $all_db
  36.     do
  37.      $MYSQLDUMP u $db_user h $db_host p$db_passwd $db | $GZIP 9 > “$backup_dir/backup.0/$time.$db.gz”
  38.     done
  39.     # delete the oldest backup
  40.     test “$backup_dir/backup.5/” >> $RM rf “$backup_dir/backup.5”
  41.     # rotate backup directory
  42.     for int in 4 3 2 1 0
  43.     do
  44.      if(test “$backup_dir”/backup.“$int”)
  45.      then
  46.      next_int=`expr $int + 1`
  47.      $MV “$backup_dir”/backup.“$int” “$backup_dir”/backup.“$next_int”
  48.      fi
  49.     done