Golang

纪念帖,第一个被google接收的patch,关于golang OAuth2.0

https://go-review.googlesource.com/#/c/6740/

go语言的坑爹省略

如果没有题目的提示,谁能猜到以下代码啥意思:

[code language=”c”]
for{
…..
}
[/code]

他爷爷的这是个无限循环,go把能省的都省了。

当初搜 “go语言for循环 无控制条件”

“go语言for循环 初始化”

“go语言for循环 空”

。。。。

神马都没搜到,原来是个无限循环,法克。

possible unbalanced brace in comment

我敢打赌,很多用expect写脚本的同学都遇到过这个问题。

一个小例子:

[shell]
if {$val == 1} {
# comments with {
send_user "Value is 1\n"
}
[/shell]

很明显,我们想要的效果是,向用户输出 “values is 1”这句话。可是他会报错:

“missing close-brace: possible unbalanced brace in comment”

究其原因,是因为注释最后不能加大括号。。。。。。

这本是tcl和expect脚本的一个bug,但貌似他们为了兼容以前的代码而拒绝修复这个bug,反而说这是语言特色。

whatever,不过在我看来,实在滑稽。

JQuery绑定click事件函数传参问题

最近用JQuery库遇到一个问题:

在给一个button绑定click函数的时候

1. 如果该函数不传递参数,那么可以正常使用

2. 如果该函数接收参数,该函数的响应时间变得非常奇怪

 

Example:

情况1

我有一个按钮,id为 btn_1,绑定的函数为

[code lang=”js”]
function cool_function()
{
alert("BALA BALA");
}
[/code]

绑定的方式为:

[code lang=”js”]
$("#btn_1").click(cool_function);
[/code]

这个时候,当我点击该按钮,可以弹出提示“BALA BALA”

 

情况2

当我需要传递一个参数给cool_function的时候,问题来了

[code lang=”js”]
function cool_function(val) // 接收一个参数
{
alert(val);
}

$("#btn_1").click(cool_function(12345)); // 传递12345进去
[/code]

按预想,应该是单击按钮的时候,弹出提示“12345”,但现在是只要我一进入页面,则自动弹出“12345”提示,而不是等我点击按钮以后提示。

 

解决方案

该问题是由于JQuery默认只要函数名后面跟了括号则触发的机制造成的。可以采取回调函数的方法来解决。示例代码如下:

[code lang=”js”]
function cool_function(event)
{
alert(event.data.para1);
alert(event.data.para2);
}

$("#btn_1").click({para1:"hello", para2:"world"}, cool_function);
[/code]

就ok了。在函数中通过event的data中的相应参数名即可获取你想要的 以及 everything.

 

Hope help, Have Fun 🙂

 

PHP 调用 SHELL 需要注意的地方

最近需要从前端调用系统命令实现一些东西,然后返回到前端来。

思来想去,觉得 html <-> php <-> shell的模式应该不错。从html到php可以用ajax实现动态交互,但php调用shell的这个过程需要注意一些地方。在这里浪费了不少时间。

第一:调用方式

PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。具体的用法Google一下已经很多了。

第二:权限问题

由于我的web项目是在apache目录下的,但apache并没有足够的权限执行一些诸如mkdir等命令,导致我拔一些东西并储存的时候毫无反应。简单的做法就是修改一下web项目所在目录权限就可以了。

比如

$ chmod -R 777 /home/www/example

 

SHELL 脚本从文件中按行读取数据

今天遇到一个问题:

需要给Shell脚本传递参数,一般来说,我们采用

$ ./test.sh para1 para2 para3 para4

这种方式,然后在shell中使用$1, $2, $3, $4 即可获取传入的参数。

但由于这次需要传递的参数实在太多,大约100K个(通过文件给出,每行即为一个参数),所以得变通一下。Google以后,发现通过awk命令可以实现,具体如下:

[shell]

#! /bin/bash

for x in ` awk ‘{print $0}’ number_sub.txt `
{
echo $x
}

[/shell]

接下来就可以做想做的工作了,解决。

Linux系统启动过程

面试的时候被问到Linux启动过程,没有答得很好。回来收集了一些资料,发现有一篇博客写得不错,不过是英文的。特翻译过来供广大小伙伴们参考:)

原文: http://www.thegeekstuff.com/2011/02/linux-boot-process/

———————————————————- 我是背景 ——————————————————–

通常,我们按下开机键,几秒钟后,我们就能看到Linux的登录界面。

但是你有没有想过,在屏幕的背后,这一切是怎么发生的呢?

下面会为大家分六个阶段简述一下一个典型的Linux操作系统的启动过程。

linux-boot-process

1. BIOS

  • BIOS,即 Basic Input/Output System BIOS,基本输入输出系统。
  • 对系统做完整性检查,即计算机硬件能否满足运行的基本条件。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止,比如内存卡没有插好。
  • 查找,加载以及执行引导装载程序。
  • 它会在软盘、光盘或者硬盘驱动器等上查找引导装载程序。你也可以在BIOS启动过程中按F12或者F2(一般来说是这两个键)来改变这个顺序。比如重装系统的时候,你在BIOS阶段按F12,然后选择从U盘启动。
  • 一旦引导装载程序被找到并且加载到了内存中,BIOS就将计算机的控制权交给它了。
  • 简单来说,BIOS阶段就是加载并执行MBR

2. MBR

  • MBR,即Master Boot Record. MBR, 主引导记录。
  • 位于启动盘的第一扇区,一般为 /dev/hda或者/dev/sda
  • MBR 共有512位,由三个部分组成,1)第1-446位,主引导加载程序信息 2)接下来64位存放分区表 3)最后两位用来存储MBR有效标记
  • 它包含了GRUB的信息(或者在一些老系统上的LILO信息)
  • 简单来说,MBR阶段就是加载并执行GRUB

3. GRUB

    • GRUB,即Grand Unified Bootloader,启动管理器。
    • 如果你在操作系统分区中装了好几个内核,通过GRUB,你就可以选择启动哪一个。
    • GRUB会展示一个初始化的界面,等待你的选择,如果过了等待时间,它就会加载在grub配置文件中指定的默认内核镜像。
    • GRUB能够识别文件系统(在老Linux系统上的LILO并不能识别文件系统)。
    • Grub 配置文件在 /boot/grub/grub.conf (/etc/grub.conf 只是一个链接)。下面是一个CentOS中的grub.conf文件信息
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
          initrd /boot/initrd-2.6.18-194.el5PAE.img
  • 正如你从上面所看到的那样,它包含了内核以及initrd镜像的信息,initrd中含有内核所需的一些基本模块驱动。
  • 简单来说,GRUB阶段就是加载并执行内核以及initrd镜像。

4. Kernel

  • 挂载根文件系统,这个已经在grub.conf文件中”root=”指出。
  • 运行/sbin/init 程序来初始化系统环境
  • 由于/sbin/init 是第一个被Linux内核所执行的程序,它的进程ID号为1。可以通过命令“ps -ef | grep init”看到。
  • initrd,即 Initial RAM Disk,是用内存模拟的磁盘,一个临时文件系统。
  • 在真正的根文件系统被挂载之前,initrd被内核作为一个临时的文件系统,其中含有内核所需的一些基本模块驱动,内核启动时展开该initrd来加载相应的驱动,在该驱动的补充之下从而挂载上根分区;

5. Init

  • 根据/etc/inittab 文件来设定LInux的运行级别。
  • Linux的运行等级设定如下:
    • 0 – halt,关机
    • 1 – Single user mode,单用户模式
    • 2 – Multiuser, without NFS,无网络支持的多用户模式
    • 3 – Full multiuser mode,有网络支持的多用户模式
    • 4 – unused,保留,未使用
    • 5 – X11,有网络支持有X-Window支持的多用户模式
    • 6 – reboot,重新启动
  • Init程序根据/etc/inittab指定的默认运行等级来加载适当的程序。
  • 执行命令‘grep initdefault /etc/inittab’可以看到系统默认的运行等级
  • 如果你想给自己找点儿麻烦,你可以把默认运行等级设置为0或者6,鉴于你已经知道了0和6代表什么,我估计你不会那样干:)
  • 通常你会设置默认运行等级为3或者5

6. Runlevel programs

  • 当Linux系统启动以来以后,你会看到有很多服务也跟着运行起来了。比如你可能会看到“starting sendmail …. OK”。这些就是设置运行等级以后会对应加载的程序了。
  • 系统会根据你设置的系统运行等级来运行下面某一个目录中的所有程序。
    • Run level 0 – /etc/rc.d/rc0.d/
    • Run level 1 – /etc/rc.d/rc1.d/
    • Run level 2 – /etc/rc.d/rc2.d/
    • Run level 3 – /etc/rc.d/rc3.d/
    • Run level 4 – /etc/rc.d/rc4.d/
    • Run level 5 – /etc/rc.d/rc5.d/
    • Run level 6 – /etc/rc.d/rc6.d/
  • 请注意,这里面也包含直接指向/etc目录下的符号链接。也就是说,/etc/rc0.d 是指向/etc/rc.d/rc0.d的链接。
  • 在 /etc/rc.d/rc*.d/ 这些目录下面,你可以看到很多名字以S或者K开头的程序
  • 以S开头的程序是在启动过程中使用的,S代表startup。
  • 以K开头的程序是在关闭过程中使用的,K代表kill。
  • 这里还有数字出现在S或者K的后面,它们代表了程序的执行顺序。
  • 比如说,S12syslog 是用来启动syslog deamon,他的启动顺序是12,S80sendmail是用来启动sendmail daemon,他的启动顺序是80。那么显然syslog会先于sendmail启动。

好了,就是这些,这就是在Linux启动过程中所发生的事情。