当前位置:  编程技术>综合
本页文章导读:
    ▪Android大举进入智能电视领域      对于智能电视来说,最核心的就是操作系统。而从目前大部分彩电品牌所采用的操作系统来看,均以Android平台居多,康佳、TCL、长虹、海信、创维、三星等品牌均采用的是Android平台。  &nb.........
    ▪初识XML(二)DTD      DTD简介:DTD实际上是一个语法文件,用来定义XML文件的结构,可以放在专门的DTD文件中,也可以直接写在XML文件中。对于XML文件来说DTD是可选的,即不是必须的。DTD规定了XML文件中的一些列的.........
    ▪基于Linux的消息队列及多线程编程实现的聊天室(二)代码分析      先将代码贴出来,然后慢慢再解释.@MakefileOBJS := server client all: $(OBJS) server: msg_svr.c msg.h gcc -o $@ $^ -D_DEBUG client: msg_client.c msg.h gcc -o $@ $^ -lpthread clean: $(RM) $(OBJS) @msg.h#include <stdlib.h> #inclu.........

[1]Android大举进入智能电视领域
    来源: 互联网  发布时间: 2013-11-10
对于智能电视来说,最核心的就是操作系统。而从目前大部分彩电品牌所采用的操作系统来看,均以Android平台居多,康佳、TCL、长虹、海信、创维、三星等品牌均采用的是Android平台。

    据笔者了解,由于Android的源码对外开放,可供开发商自由发展,同各家的云端系统相结合,因此大部分国内电视厂商所推出的智能电视都以Android平台为主,而随着各厂商均搭载Android平台的表现下,用户接受度也更高。

 

    同时,据业内众多专家介绍,基于android操作系统的智能电视,未来还将会有更多令人振奋的新功能与新应用推出,如3D游戏、扩展实镜、面部识别、电视支付、OTT、社交视频电话以及与其他家电连接的家庭自动化应用,这些都给广大消费者带来了无限遐想。

    康佳集团多媒体全球研发中心技术部经理仪海波也表示,在国内市场,Android平台由于开放性好,推广厂家多,占有明显优势。不过,也正因为Android的原始码是开放的,同智能手机市场曾经出现过的情况一样,各家推出的产品品质和应用参差不齐,完全依赖各家的技术水平决定。

 

    其中,康佳基于Android操作系统推出的智能电视,高效利用双核CPU运算、双核GPU渲染、双核Scaler缩放、双路音频处理、1080P硬解码的硬件平台,同步处理两路不同的视频、音频信号,达成“双通道,同步享”的震撼效果。

    另外,还有来自国内的TCL,其推出的智能电视在基于Android系统的表现下,搭载了全球首个电视专用点读教育系统,可以实现书本内容在电视上的实时高清显示、发声朗读,带给家庭新颖的亲情互动云教育体验,让孩子学习娱乐两不误,全面引领全球家庭教育潮流。

    而除了具备电视专用的点读教育系统外,基于Android系统,该系列产品还搭载了人脸识别、多屏互动2.0、自由交互、3D专区、视频通讯等多项全球领先的智能云功能和云应用。此外,TCL E5390系列更是独家率先通过“六星智能”认证,集合了3D智能云电视领域中的最高端技术。

    笔者认为,Android系统作为开放式的操作系统,已经在智能电视上得到了广泛认可和出色应用,未来随着开发商针对于Android系统开发出的更多应用,将促使智能电视更受大众青睐。

 

Android开发环境搭建所需资源、安装步骤图解        Android海量源码、教程与资料  

数字电视接口规范大全(行业标准)                      程序员必备:英语口语学习教程大全 

20本Linux电子书学习教程                    2013年25家IT高科技公司薪酬排行榜  

2013年Android平台8大预测                   优秀Android开发人员必须注意的10个误区 

Android开发应该掌握的28大内容和10大建议      成为“Android高手”的6个境界 

90后就业“钱景”分析:IT行业仍是最佳选择       90后就业“钱景”:IT仍是最佳选择

--------------------------------------------------------------------------------------------------------------

终生受益的43个健康常识--值得珍藏                           面试如何着装:不同职位穿着大不同     

2013年国内就业率最高的50个本科专业排名              女生面试如何着装及禁忌   

50个“最有钱景专业”的毕业生年薪一览表               毕业后头5年决定你的一生 

千万别熬夜:身体器官晚上工作时间表一览                  90后就业“钱景”:IT仍是最佳选择    

--------------------------------------------------------------------------------------------------------------

 211工程大学最新名单(共112所)                              985工程大学最新名单(共39所) 

中国

    
[2]初识XML(二)DTD
    来源: 互联网  发布时间: 2013-11-10

DTD简介:DTD实际上是一个语法文件,用来定义XML文件的结构,可以放在专门的DTD文件中,也可以直接写在XML文件中。对于XML文件来说DTD是可选的,即不是必须的。DTD规定了XML文件中的一些列的规则,如同名标签的数量,出现的先后顺序等等。DTD文件同样具有使用范围,如果将DTD文件定义为System则该文件仅限于在本系统中使用,如果想要将DTD文件进行推广,则应将DTD文件定义成public类型的。本文中我们将介绍如何在xml文件中使用DTD。

DTD的使用:

1. 直接在XML中内置DTD内容。我们可以直接将DTD规定的语法规则写入XML文件中,这样XML文件中的标签会自动遵守该语法规则。如:

<?xml version="1.0"encoding="gb2312"?>

<!DOCTYPE 书籍列表[

         <!ELEMENT书籍列表(计算机书籍)>

         <!ELEMENT计算机书籍(书名,价格,简要介绍)>

         <!ELEMENT书名(#PCDATA)>

         <!ELEMENT价格(#PCDATA)>

         <!ELEMENT简要介绍(#PCDATA)>

]>

 

<书籍列表>

     <计算机书籍>
  
         <书名>XML的今生今世</书名>
  
         <价格>4.5元</价格>

         <简要介绍>概述详细介绍了DTD</简要介绍>

   </计算机书籍>

</书籍列表>
2. 使用dtd文件。需要在xml文件中引入dtd文件,导入方式为在第一句下面添加:<!DOCTYPE 商品系列 SYSTEM "X.dtd">。这种方式需要将xml文件和dtd文件放在同一个目录下(也可以使用网络上的DTD文件)。如:

<?xml version="1.0" encoding="gb2312"?>

<!DOCTYPE 商品系列 SYSTEM "X.dtd">

<书籍列表>

      <计算机书籍>

         <书名>XML的今生今世</书名>

         <价格>4.5元</价格>

         <简要介绍>概述详细介绍了DTD</简要介绍>
      </计算机书籍>
</书籍列表>

DTD中元素出现次数规定:

出现次数

符号

例子

只出现一次

无符号

<!ELEMENT 书籍列表(计算机书籍)>

至少出现一次

+

<!ELEMENT 书籍列表(计算机书籍+)>

出现零次或多次

*

<!ELEMENT 书籍列表(计算机书籍)*>

出现零次或一次

<!ELEMENT 书籍列表(计算机书籍)?>

声明或

|

<!ELEMENT 书籍列表(计算机书籍)|文学书籍>

声明混合型内容

 

<!ELEMENT 书籍列表(#PCDATA|计算机书籍)*>表示书籍列表下既可以是文本内容也可以是子元素

<!ELEMENT 书籍列表(计算机书籍,文学书籍)>有严格的顺序,必须先出现计算机数据,后出现文学书籍

一组要共同匹配的表达式

()

<!ELEMENT 书籍列表(计算机书籍,文学书籍)*>表示计算机书籍和文学书籍必须组合出现0次或多次

 

DTD中属性的类型:在DTD中属性通过ATTLIST来进行声明,<!ATTLIST 元素名称 属性名称 属性类型 默认值>,<ATTLIST payment type CDATA “cash”>。

属性类型

描述

CDATA

值为字符数据

(en1|en2|…)

此值是枚举列表中的一个值

ID

值为唯一的id

IDREF

值为另外一个元素的id

IDREFS

值为其他id的列表

NMTOKEN

值为合法的XML名称

ENTITY

值是一个实体

ENTITIES

值是一个实体列表

NOTATION

此值是符号的名称

Xml

值是一个预定义的XML值

 

DTD属性的默认值

解释

属性的默认值

#REQUIRED

属性值是必须的

#IMPLIED

属性不是必须的(隐含的)

#FIXED value

属性值是固定的



作者:a1314517love 发表于2013-1-9 11:35:07 原文链接
阅读:0 评论:0 查看评论

    
[3]基于Linux的消息队列及多线程编程实现的聊天室(二)代码分析
    来源: 互联网  发布时间: 2013-11-10

先将代码贴出来,然后慢慢再解释.

@Makefile

OBJS := server client
all: $(OBJS)

server: msg_svr.c msg.h 
	gcc -o $@ $^ -D_DEBUG

client: msg_client.c msg.h
	gcc -o $@ $^ -lpthread

clean:
	$(RM) $(OBJS)

@msg.h

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <sys/msg.h>

#define   MSG_FILE "/tmp/msg_server"    
#define   BUFFER 255    
#define   PERM S_IRUSR | S_IWUSR    

#define 	OK			1 
#define 	ERR			0

// msg type
#define   TYPE_SERVER		1000
#define   TYPE_SERVER_STR	"1000"

// msg target string
#define   SERVER_STR		"SERVER"
#define   TO_ALL_STR		"ALL"

// send cmd
// L, I, O is send to server
#define 	CMD_LIST		'L'
#define 	CMD_LOGIN		'I'
#define 	CMD_LOGOUT		'O'
#define 	CMD_TOALL 		'A'

// C, F send to others
#define 	CMD_CHAT		'C'
#define 	CMD_SEND_FILE	'F'

// CMD:FROM:TIME:DATA 
#define		DATA_LEN	4
#define		OFT_CMD		0
#define		OFT_FRM		1
#define		OFT_TIM		2
#define		OFT_DAT		3
#define		DATA_TOK	":"

// USR_ID:USR_NAME:TIME
#define		USER_DATA_LEN	3
#define		OFT_USR_ID		0
#define		OFT_USR_NM		1
#define		OFT_LOGIN_TM	2
#define		USER_DATA_TOK	"#"

// id admin
#define 	START_ID	1

//-------------------------------------+
// List operations
struct list_head {
	struct list_head *next;
};

// init a new list named name
#define LIST_INIT(name)	\
	struct list_head name = {NULL}

static inline int list_add(struct list_head * head, struct list_head* new){
	new->next = head->next;
	head->next = new;
}

static inline int list_delete(struct list_head * head, struct list_head* target){
	while(head){
		if(head->next == target){
			head->next = target->next;
			return 0;
		}
		head = head->next;
	}
	return -1;
}
//-------------------------------------+

// online status
enum status{ online, offline, invisible };

// available id 
int available_id = START_ID;

// user struct to save user informations
struct user{
	struct list_head list;
	int id;
	char name[32];
	enum status status;;
	long login_time;
};

// message struct
struct message
{    
	long mtype;
	char buffer[BUFFER+1];    
}msg_snd, msg_rcv;    

int msgid = 0;

// send a format message to client
// CMD:FROM:TIME:DATA 
int send_msg(long type, int cmd, int from_id, char * data){
	sprintf(msg_snd.buffer, "%c:%d:%d:%s", cmd, from_id, time(NULL), data);
	msg_snd.mtype = type;
	if(msgsnd(msgid, &msg_snd, strlen(msg_snd.buffer)+1, 0) < 0)
		return ERR;
	else
		return OK;
}

inline char *time2str(long time, char* buf){
	struct tm *t = localtime(&time);
	strftime(buf, 32, "%Y-%m-%d-%H:%M:%S", t);
	return buf;
}

int init_msg_queue(){
	key_t key;
	if((key = ftok(MSG_FILE, 'a')) == -1){
		perror("ftok");
		exit(1);
	} 

	printf("Key:%d\n", key);
	if((msgid = msgget(key, PERM | IPC_CREAT)) == -1)
	{   
		perror("msgget");
		exit(1);
	}       
	printf("msgid = %d\n", msgid);
	return msgid;
}       

int process_msg(char* buffer);  



@msg_svr.c

/* msg_svr.c */  

#include "msg.h"   

LIST_INIT(msg_list_head); 

int main()    
{    
	msgid = init_msg_queue();

	while(1)   
	{
		if(msgrcv(msgid, &msg_rcv, sizeof(struct message), TYPE_SERVER, 0) == -1)
			perror("msgrcv");
		else
			printf("Get: %s\n", msg_rcv.buffer);

		// process message
		process_msg(msg_rcv.buffer);
	}    
	exit(0);    
}

// process message received from message queue
// message format:
// CMD:TARGET:FROM:TIME:DATA
int process_msg(char* buffer){
	char * data[DATA_LEN];
	char * str, *subtoken;
	int i;
	memset(data, NULL, sizeof(data));
	for(str = buffer, i = 0; ; str = NULL, i++){
		subtoken = strtok(str, DATA_TOK);
		if(subtoken == NULL)
			break;
		data[i] = subtoken;
#ifdef _DEBUG
		printf("> data[%d] = %s\n", i, subtoken);
#endif
	}
	// data format error
	if(i != DATA_LEN)
		return ERR;

	char info[256];
	char buf[256];
	struct user* u ;
	struct list_head* p;

	// send to server cmd
	switch(data[OFT_CMD][0]){
	case CMD_LIST:
		bzero(buf, sizeof(buf));
		p = (&msg_list_head)->next;
		while(p){
			u= (struct user*)p;
			sprintf(info, "%d#%s#%ld#", u->id, u->name, u->login_time);
#ifdef _DEUBG
			printf("u->name = %s\n", u->name);
#endif
			strcat(buf, info);
			p = p->next;
		}
		if(p != msg_list_head.next){
			// delete the end '#'
			buf[strlen(buf) - 1] = 0;
		}
		send_msg(atol(data[OFT_FRM]), CMD_LIST, TYPE_SERVER, buf);
		break;

	case CMD_LOGIN:
		u = (struct user *)malloc(sizeof(struct user));
		if(NULL == u){
			perror("malloc");
			return ERR;
		}
		// add to list
		list_add(&msg_list_head, &(u->list));
		u->id = available_id++;
		strcpy(u->name, data[OFT_FRM]);
		u->status = online;
		u->login_time = atol(data[OFT_TIM]);

		// login ok echo msg
		msg_snd.mtype = atol(data[OFT_DAT]);                
		sprintf(msg_snd.buffer, "%d", u->id);
		msgsnd(msgid, &msg_snd, strlen(buf)+1, 0);  
		break;

	case CMD_LOGOUT:
		p = (&msg_list_head)->next;
		while(p){
			u= (struct user*)p;
			// find the user who request logout
			if(u->id == atoi(data[OFT_FRM])){
				if(send_msg(u->id, CMD_LOGOUT, TYPE_SERVER, "Logout OK!") == OK){
					list_delete(&msg_list_head, p);
					free(p);
				}else{
					return ERR;
				}
				break;
			}
			p = p->next;
		}
		break;

	case CMD_TOALL:
		// send to all online client
		p = (&msg_list_head)->next;
		while(p){
			u= (struct user*)p;
			send_msg(u->id, CMD_CHAT, data[OFT_FRM], data[OFT_DAT]);
			p = p->next;
		}
		break;
	default:
		return ERR;
	}
	return OK;
}

@msg_client.c

/* msg_client.c */  
#include "msg.h"   

int userid = 0;

char name[32] = "";

void print_menu(void){
	printf("\t+----------------------------------+\n");
	printf("\t+    Chat Room V1.0 2013.01.08     +\n");
	printf("\t+----------------------------------+\n");
	printf("\t+ User Commands as follows:        +\n");
	printf("\t+                                  +\n");
	printf("\t+ l: list all online user          +\n");
	printf("\t+ i: Login                         +\n");
	printf("\t+ o: logOut                        +\n");
	printf("\t+ c: Chat with other online user   +\n");
	printf("\t+ a: Chat with all online user     +\n");
	printf("\t+ f: transfer a File to others     +\n");
	printf("\t+ h: Help                          +\n");
	printf("\t+----------------------------------+\n");
}

int get_choice(){
	printf("%s# ", name);
	int answer = getchar();	// eat <Enter>
	while(getchar() != '\n');	// eat <Enter>
	//putchar(answer);
	return answer;
}

void func(int sig){
	printf("\n%s# ", name);
	fflush(stdout);
}

int send_to(int target, int cmd, char *data){
	return send_msg(target, cmd, userid, data);
}

int send_server(int cmd, char *data){
	return send_msg(TYPE_SERVER, cmd, userid, data);
}

int chat(){
	if(strlen(name) == 0){
		printf("You are not login!\n");
		return ERR;
	}

	char id[32];
	char data[256];
	char buf[256];
	printf("To: [USR_ID] ");
	fflush(stdout);
	if(fgets(id, sizeof(id), stdin) == NULL){
		perror("fgets");
		return ERR;
	}
	sprintf(data, " %s > ", name);
	id[strlen(id) - 1] = 0;

	printf(">> ");
	fflush(stdout);
	if(fgets(buf, sizeof(buf), stdin) == NULL){
		perror("fgets");
		return ERR;
	}
	strcat(data, buf);
	data[strlen(data) - 1] = 0;
	send_to(atoi(id), CMD_CHAT, data);
}

int chat_all(){
	if(strlen(name) == 0){
		printf("You are not login!\n");
		return ERR;
	}

	char data[256];
	char buf[256];
	sprintf(data, " %s To all > ", name);

	printf("To all >> ");
	fflush(stdout);
	if(fgets(buf, sizeof(buf), stdin) == NULL){
		perror("fgets");
		return ERR;
	}
	strcat(data, buf);
	data[strlen(data) - 1] = 0;
	send_to(TYPE_SERVER, CMD_TOALL, data);
}

int login(){
	printf("username: \n");
	if(fgets(name, sizeof(name), stdin) == NULL){
		perror("fgets");
		return ERR;
	}
	name[strlen(name) - 1] = 0;
	int rand_type = random();
	time_t t;
	time(&t);
	sprintf(msg_snd.buffer, "%c:%s:%ld:%d", CMD_LOGIN, name, t, rand_type);
#ifdef _DEBUG
	printf("%s\n", msg_snd.buffer);
#endif
	// get a random type to login server
	msg_snd.mtype = TYPE_SERVER;
	if(msgsnd(msgid, &msg_snd, strlen(msg_snd.buffer)+1, 0) < 0){
		perror("msgsnd");
		return ERR;
	}

	// wait server response
	if(msgrcv(msgid, &msg_rcv, sizeof(msg_rcv), rand_type, 0) < 0){
		return ERR;
	} else{
		userid = atol(msg_rcv.buffer);
		printf("Login OK id = %d\n", userid);
		return OK;
	}
}

int logout(){
	if(strlen(name) == 0){
		return ERR;
	}
	send_server(CMD_LOGOUT, "Logout");
	// wait server response
	if(msgrcv(msgid, &msg_rcv, sizeof(msg_rcv), userid, 0) < 0){
		return ERR;
	}else{
		userid = 0;
		printf("Logout OK\n");
		return OK;
	}
}

void format_user_list(char * buffer){
	char * data[USER_DATA_LEN];
	char * str, *subtoken;
	char time_buf[24];
	int i, n;
	memset(data, NULL, sizeof(data));
	printf("--------      
    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3