人間夜行

一切の有為の法 夢幻泡影の如し

人人消息提醒

| 评论

本人致力于服务人人网上的Linux用户。时值寒假初始,热烈奉送一款运行于终端的消息提醒器。

原理:wget读取cookie并登录手机人人,下载首页。grep分析有无新消息。终端响铃。

提醒:cookie的取得可以通过各种途径。一般情况下使用浏览器正常登录一次,再导出为cookies.txt即可。如果下载下来的页面很小,多试几次即可。如home.htm一直不正常,请检查你的cookie是否正确,保证url已经修改为可以正确登录首页的url。此外,请开启你的终端响铃。

#!/bin/bash

# Renren Messages Notifier
# 人人消息提醒
# Koc Zhang: zszth@126.com
# GPLv3 Licensed

# 仅识别手机人人
# 请在使用前自行修改首页url
# 放置已成功登录过手机人人的cookies.txt至当前目录

# url为自己登录后的首页
# !!!请自行修改!!!
# 格式为http://http://3g.renren.com/home.do加上后面一长串
url=""

note="新消息"
mes=0
while [ "1" = "1" ];
do
wget -q --cookies=on --load-cookies=cookies.txt --keep-session-cookies --save-cookies=cookies.txt "$url" -O home.htm
mes=`cat home.htm¦grep -c "$note"`
if [ 1 = $mes ]; then
date
go=`cat home.htm¦grep -Eo '"http://3g.renren.com/news/home.do.{45}新消息<'`
echo "$go"
echo -e "\a"
sleep 1
echo -e "\a"
sleep 1
echo -e "\a"
mes="0"
fi
sleep 60
done  

RQNOJ 262 游戏排行榜

| 评论

//稍微有点算是水题。吧。
#include <stdio.h>
#include <limits.h>
int main()
{
        unsigned int list[51]={0};
        list[0]=INT_MAX;
        int p,s;
        unsigned int n;
        scanf("%d%d%d",&p,&s,&n);
        int i;
        for(i=1;i<=s;i++)
                scanf("%d",&list[i]);
        for(i=1;i<=p;i++)
                if(n>=list[i]&&n>list[p]&&n<list[i-1])
                {
                        printf("%d",i);
                        return 0;
                }
        printf("-1");
        return 0;
}
 

RQNOJ 255 排队接水

| 评论

 

#include <stdio.h>
#include <stdlib.h>
int t[901];
int n;
int findmin()
{
	int min=9999,i,minpos=0;
	for(i=1;i<=n;i++)
	{
		if(t[i]<min)
		{
			min=t[i];
			minpos=i;
		}
	}
	return minpos;
}
int main()
{
	int wait=0;
	int i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	scanf("%d",&t[i]);
	double ave;
	for(i=1;i<n;i++)
	{
		int pos=findmin();
		wait+=t[pos]*(n-i);
		printf("%d ",pos);
		t[pos]=10000;
	}
//此处坑人,注意格式。只有“整个”输出末尾的空格、换行会被忽略。
		int pos=findmin();
		wait+=t[pos]*(n-i);
		printf("%d",pos);
//强制类型转换
	ave=(double)wait/(double)n;
	printf("\n%0.2f",ave);
	return 0;
}

某君

| 评论

某君有一个爱好,就是走路。据某君自己所说,他从小时候开始就爱上了走路。那时,他偶然发现走路走的多了就会双腿酸胀。而一旦停下休息便会感到无比舒服。并且走的越多,休息时就越舒服。从此,它一有空便去走路。

某君最喜欢这样一句话:“这世上本没有路,走的人多了,也就成了路。”他常常将这话挂在嘴边,也常常讲给别人听。用他的话说,这叫“座前铭”,不光要对自己有用,也要让别人知道。久而久之,他周围的人都以为这句话是他的标志,对于其由来,也不再多过问。

批量访问人人好友

| 评论

好吧,我承认这样的需求是真的恶俗了。就当是练练手,同时希望对于一些有同样需求的人有所帮助。

试验环境:Archlinux。需要grep,装了Launch Clipboard插件的Firefox。

方法:先访问人人,登录,见到新鲜事。保证之后开浏览器上人人无须登录即可。将页面源代码另存。然后对源代码作如下处理:

cat source ¦grep -Eo  "http://www.renren.com/profile.do.id=[0-9]{9}">res
当然res可以换成任何你喜欢的。关于grep的参数大可请教man。此时打开res文件,你是否已经知道该怎么做了呢?没错,用那个插件所提供的功能批量打开页面就好啦!(囧)

不足:只能访问部分好友(最近发了新鲜事的)。另外,批量打开页面是不是很恐怖呢?小内存千万别尝试!

对于第二项缺点,一定有办法解决(编个脚本之类的)。不过懒了。谁有解决办法告诉我吧,不胜感激!

Unknown 钓鱼

| 评论

题目描述

约翰是个垂钓谜,星期天他决定外出钓鱼h小时(1≤h≤16),约翰家附近共有n个池塘(2≤n≤25),这些池塘分布在一条直线上,约翰将这些池塘按离家的距离编上号,依次为L1,L2,…,Ln,他从湖1出发,向右走,有选择性地在一些湖停留一定的时间钓鱼,最后在某一个湖结束钓鱼。

约翰家门外就是第一个池塘,所以他到第一个池塘是不用花时间的,约翰可以任选若干个池塘垂钓,并且在每个池塘他都可以呆上任意长的时间,但呆的时间必须为5分钟的倍数,(5分钟为一个单位时间),已知从池塘Li到池塘Li+1要化去约翰ti个单位时间,每个池塘的上鱼率预先也是已知的,池塘Li在第一个单位时间内能钓到的鱼为Fi(0≤Fi≤100),并且每过一个单位时间在单位时间内能钓到的鱼将减少一个常数di(0≤di≤100),现在请你编一个程序计算约翰最多能钓到多少鱼。

RQNOJ 654 [NOIP2011]铺地毯

| 评论

#include <stdio.h>
int main()
{
        int a[10001],b[10001],g[10001],k[10001];
        int n;
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++) scanf("%d %d %d %d",&a[i],&b[i],&g[i],&k[i]);
        int x,y;
        scanf("%d %d",&x,&y);
        for(i=n;i>=1;i--)
        {
                if((x>=a[i])&&(x<=a[i]+g[i])&&(y>=b[i])&&(y<=b[i]+k[i]))
                {
                        printf("%d",i);
                        return 0;
                }
        }
        printf("-1");
        return 0;
}

GTK+ 03 icon

| 评论

对应http://zetcode.com/tutorials/gtktutorial/chinese/firstprograms/

#include <gtk/gtk.h>
//编译使用:gcc 文件名 `pkg-config --libs --cflags gtk+-2.0`
//所有注释仅为我的理解

//实现对图片的访问。目前不甚理解。大概是读入缓冲。
GdkPixbuf *create_pixbuf(const gchar * filename)
{ GdkPixbuf *pixbuf;
GError *error=NULL;
pixbuf=gdk_pixbuf_new_from_file(filename,&error);
if(!pixbuf)
{
fprintf(stderr,"%s\n",error->message);
g_error_free(error);
}
return pixbuf;
} int main( int argc, char *argv[])
{ GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"This is the TITLE");
gtk_window_set_default_size(GTK_WINDOW(window),400,300);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
//设置图标
gtk_window_set_icon(GTK_WINDOW(window),create_pixbuf("ra3.jpg"));
gtk_widget_show(window);
g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_main();
return 0;
}

GTK+ 02 window widget

| 评论

对应http://zetcode.com/tutorials/gtktutorial/chinese/firstprograms/

#include <gtk/gtk.h>
//编译使用:gcc 文件名 `pkg-config --libs --cflags gtk+-2.0`
//所有注释仅为我的理解
int main( int argc, char *argv[])
{
	GtkWidget *window;
	gtk_init(&argc, &argv);
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//本次的窗口构建内容

//设置标题
gtk_window_set_title(GTK_WINDOW(window),"This is the TITLE");
//设置大小
gtk_window_set_default_size(GTK_WINDOW(window),400,300);
//设置位置,又有一个常数
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);

gtk_widget_show(window);

//处理关闭的信号,此法方能正常退出
g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

gtk_main();
return 0;
}

GTK+ 01 first

| 评论

本人要学GTK+啦!(囧)所以把各种感悟都写在这里。

《GTK+程序设计教程》为材料来学习。在此感谢zetcode.com和翻译卢名扬。(这话以后就不说了。。。)

本篇对应http://zetcode.com/tutorials/gtktutorial/chinese/firstprograms/

#include <gtk/gtk.h>
//编译使用:gcc 文件名 `pkg-config --libs --cflags gtk+-2.0`
//所有注释仅为我的理解
int main( int argc, char *argv[])
{
	//建立一个窗口对象
	GtkWidget *window;
	//初始化gtk,必须有
	gtk_init(&argc, &argv);
	//初始化window对象
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	//显示window
	gtk_widget_show(window);
	//启动gtk,必须有,从此进入主循环
	gtk_main();
	//事实上本程序不会结束
	return 0;
}