新鲜出炉的百度js面试题

最近两位同学入职百度,带回来的笔试题基本上毫无悬念,不过有一个小题看到让人忍不住笑出声来,真的很无聊哦,一起来看看吧。

有编号1-100的房间,每个房间都有一扇门,刚开始都是关着的。有编号1-100的人,每个人依次路过每个房间,如果房间号能整除他的编号,就把门的状态改变一下(关的的就打开,打开的就关上)。问最后哪些门是开着的。
开:1,关-1

代码其实超级简单,

var a=[];
for(i=1;i<=100;i++)
{a[i]=-1;}
for(var i=1;i<=100;i++)
{for(var j=1; j<=100; j++)
{if(i%j==0){a[i]*=-1;}
}
}
var re=[];
for(var i=1; i<=100; i++){
if(a[i]==1){
re.push(i);
}
}
alert(re);

不过咱们可以稍微写的大气一点,用上自定义属性就有点高端的味道

var doors=[];
function Door(idx){
this.state=-1;
this.idx=idx;
}

for(var i=0; i<100; i++){
doors.push(new Door(i+1));
}

for(var i=1; i<=100; i++){
for(var j=0; j<100; j++){
if(doors[j].idx%i==0){
doors[j].state*=-1;
}
}
}

var result=[];
for(var i=0; i<100; i++){
if(doors[i].state==1){
result.push(doors[i].idx);
}
}

//console.log(result);
alert(result);

 

node.js+websocket实现简易聊天室

websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可以用于任意的客户端和服务器程序,

把上一个demo改装一下,变成一个简易聊天室,在不同的页面之间可以收到彼此send的内容,并且新增了上线提示和下线提示。如果新打开一个localhost:8080页面,我们就认为有新人加入,如果关闭了页面,就认为有人下线啦。

首先安装一下websocket,方法很简单啦,在命令行里输入 npm install websocket

页面只有一个chat.html,看一下前端页面的js核心代码

var wsClient = new WebSocket(“ws://localhost:9090″,”chat-protocol”);创建一个实例,这个端口,随便起,从0~65535理论上都行,但是3000之内的最好不要用,因为很多软件都有自己约定俗成的端口使用情况了。因为http server用了8080,所以WebSocketServer随手用了9090
wsClient.onopen = function(){
wsClient.send(‘____conn____’);这就是接头暗号,类似于天王盖地虎,是初始化消息
}
wsClient.onmessage = function(msg){监听消息
console.log(msg);
if(msg.data){
var data = JSON.parse(msg.data);转化成json形式
var txt = document.querySelector(“#chatRoom”).value;
txt += “\n”+data.nickname+”说:”+data.message;
document.querySelector(“#chatRoom”).value = txt;显示在页面
}
}

 

以下是server端核心代码

var http = require(“http”);
var WebSocketServer = require(“websocket”).server;
var url = require(“url”);
var resource = require(“./resource.js”) 处理resource的部分拿出来了,复用代码块

http.createServer(function(req, res){
var oUrl = url.parse(req.url, true);
if(oUrl.pathname == ‘/favicon.ico’){     给页面地址栏加了个小图标
resource.getFile(oUrl.pathname,res);
}
else {
resource.getFile(“/chat.html”, res);  这里就是获取的前端的html页面
}
}).listen(8080);

var wsHttpServer = http.createServer(function(req,res){
res.writeHead(403);这个httpServer是给websocket用的,所以对于普通的http请求就返回403,这是个websocket server,普通http请求不受理,也可以返回404,或者其他的页面
res.end(“NOT AUTH”);
}).listen(9090);

var wsServer = new WebSocketServer({httpServer:wsHttpServer})这里new了一个新的WebSocketServer对象

var connections = [];

function broadcast(content) {  广播出去喽,每个页面都能收到
for(var i=0;i<connections.length;i++){
if(connections[i].connected)
connections[i].send(content);
}
}
wsServer.on(‘request’,function(req){受理请求
var conn = req.accept(“chat-protocol”);
broadcast(JSON.stringify({nickname:’系统’,message:’有人上线了’}));
var index = connections.push(conn)-1;
conn.on(‘message’,function(msg){
if(msg.type == ‘utf8’){
if(msg.utf8Data != ‘____conn____’){对一下暗号
var msg = JSON.parse(msg.utf8Data);
var content = JSON.stringify({nickname:msg.nickname,message:msg.message});
broadcast(content);
}
}
});
conn.on(‘close’,function(){
connections.splice(index,1);
broadcast(JSON.stringify({nickname:’系统’,message:”有人下线了”}))
});
});

写完启动下,在命令行输入node  chat_server.js,打开多个localhost:8080就可以欢乐的聊天了。

node.js模拟qq漂流瓶

node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位,如果没有瓶子,提示无瓶子,等等,功能很丰富哦,let‘s   go

(1)安装python,node,由于这是很久之前装的了,此次不再重复。

(2)下载sqlite3数据库,网址为http://www.sqlite.org/download.html,

选择:Precompiled Binaries for Windows,下载完别忘记把这个文件放在c盘的windows下的sysytem32文件夹里。

(3)新建项目文件夹,打开终端,进入文件夹目录,先安装一下必要的插件,命令如下,npm install cryptojs,npm install sqlite3

开始建数据库,sqlite3  bottle.db就可以建新的bottle数据库啦,然后建表
CREATE TABLE message(
id Integer primary key autoincrement,
nick_name varchar(20),
content varchar(4096),
is_read boolean,
create_time datetime,
update_time datetime
);

整个项目的代码就是html文件和js文件组成的,非常和谐的,

前端html建立XMLHttpRequest,在onreadystatechange这个回调函数里判断状态,用的是最原始的ajax异步调用,get方式,这决定了漂流瓶不能内容太多,url传值有数量限制,最大是4k。

核心代码如下:都是毫无悬念的东西,原生的,求大神指点框架版本的怎么破。

xhr.onreadystatechange=function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
alert(xhr.responseText);
var returnValue = JSON.parse(xhr.responseText);
alert(returnValue.result);
}
else if(xhr.status == 500){
alert(“出错了”);
}
}
}
xhr.open(‘get’,’/send?content=’+encodeURIComponent(c)+”&name=”+encodeURIComponent(nickName),true);
xhr.send(null);

 

server部分核心代码:

var url = require(“url”)        类似的方法进行请求

var db = new sqlite.Database(“bottle.db”);  把咱们建好的数据库用起来

http.createServer(……..).listen(8080); 监听端口8080,

最后别忘记退出的时候关闭数据库连接
process.on(“SIGINT”,function(){
console.log(“program will exit.”);
db.close();
process.exit(1);
})

好叻,把node跑起来吧,在终端输入node  bottle_server.js

这个就是咱们刚写好的js的名字,现在可以在浏览器中输入localhost:8080

重定向到了html页面,现在就可以扔瓶子捞瓶子了,哈哈,很有趣啊,虽然捞到的都是自己扔的瓶子

 

如何找到某个方法的声明

1. 在VIM中,输入:    :Gsearch -F ‘要搜索的东西’ -R –include=*rb –include=*js
2. 就会得到:(可以看到,最下面的绿色地方,就是JS的声明)
1 #
2 # Modify the contents of this buffer and then
3 # use the “:Greplace” command to merge the changes.
4 #

5 app/views/client/version_ups/_form.html.erb:149:  validate_form( ‘form’, {


15 app/views/layouts/_customized_coffeescript.html.erb:118:@validate_form = (form_selector, options) ->

只有15那一条变量前面是加了@符号的,所以就可以直接回车查看了,那个文件就是方法声明的地方。

crontab添加定时任务

crontab是LINUX系统下的定时任务触发器,常用的方法如下:

crontab -l    显示用户crontab文件的内容

crontab -r  删除用户的crontab文件

crontab -e   编辑crontab文件

 

它的格式共分为六段,前五段为时间设定段,第六段为所要执行的命令段,
格式如下:Min Hour Date Month Day program 

第一段代表分钟0-59,第二段代表小时0-23,第三段代表日期1-31,第四段代表月份1-12,第五段代表星期0-6,其中0是星期天,

本次我用到的是

#0 7 * * *  cd  /vol/remote_logs_shelter && ruby apple.rb  意思就是每天早上七点打开目录,并执行一下apple.rb

以下是从网上找到的一些例子

● 0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache

● 50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务

● 50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务

● 0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘

● 1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件

● 00 03 * * 1-5 find /home “*.xxx” -mtime +4 -exec rm {} \;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
● 30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令

在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup  
  
周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s “hi” alex@domain.name  /dev/null 2>&1 即可
例:如果用户的Crontab文件的内容是:29 19 * * * echo its dinner time,则系统每天的19:29显示‘its dinner time’
示例(创建一个cron全过程,每分钟都会在test.txt里输入当前时间):

 

request-log-analyzer日志分析

日志分析是常见的工作,方法如下:

使用工具:request-log-analyzer
安装:$ gem install request-log-analyzer
运行:$ request-log-analyzer 20131224.log –format rails3 –output HTML –file report.html

20131224.log是我们要分析的日志文件,运行之后会生成一个 report.html文件,这就是我们最终需要的文件了。

ruby实现简易计算器

回到家里,用的还是windows系统,ruby的编辑器换成了Aptana Studio 3

puts “Please input the first Number:”
number1=gets
puts “Please input a operator(+,-,*,/):”
op=gets
puts “pleasse input the second Number:”
number2=gets

case op.chomp
when “+”
result=number1.to_i + number2.to_i
when “-”
result=number1.to_i – number2.to_i
when “*”
result=number1.to_i * number2.to_i
when “/”
result=number1.to_i / number2.to_i
end
puts “Result:#{number1.chomp}#{op.chomp}#{number2.chomp}=#{result}”

 

运行一下:

$ ruby calculator.rb
Please input the first Number:
2
Please input a operator(+,-,*,/):
*
pleasse input the second Number:
8
Result:2*8=16

 

继续阅读

初识cms

上上个月,Y同学跳槽到新浪cms,上个月H同学从雅虎跳到新浪cms,紧接着W同学从百度跳到了新浪cms(他们可以在公司开同学会了),每次听到cms,都会默默好奇下,于是,冥冥之中的安排,明白些了,哈哈。

 

终端  <–>无线API<–>无线cms

ubuntu下git输出的颜色变化

11点进家门,感觉很温暖哦。

 

以下是如何在用git的时候清晰的看出关键字的方法。

  1. $ vim .git/config
  2. $ git config –global color.status auto
  3. $ git config –global color.diff auto
  4. $ git config –global color.branch auto
  5. $ git config –global color.interactive auto

ruby学习