一、什么是宏函数?通过宏定义的函数是宏函数。如下,编译器在预处理阶段会将Add(x,y)替换为((x)*(y))#defineAdd(x,y)((x)*(y))#defineAdd(x,y)((x)*(y))intmain(){inta=10;intb=20;intd=10;intc=Add(a+d,b)*2;cout<
C语言如何定义宏函数?
小九格物
c语言
在C语言中,宏函数是通过预处理器定义的,它在编译之前替换代码中的宏调用。宏函数可以模拟函数的行为,但它们不是真正的函数,因为它们在编译时不会进行类型检查,也不会分配存储空间。宏函数的定义通常使用#define指令,后面跟着宏的名称和参数列表,以及宏展开后的代码。宏函数的定义方式:1.基本宏函数:这是最简单的宏函数形式,它直接定义一个表达式。#defineSQUARE(x)((x)*(x))2.带参
c++ 的iostream 和 c++的stdio的区别和联系
黄卷青灯77
c++算法开发语言iostreamstdio
在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in
水平垂直居中的几种方法(总结)
LJ小番茄
CSS_玄学语言htmljavascript前端csscss3
1.使用flexbox的justify-content和align-items.parent{display:flex;justify-content:center;/*水平居中*/align-items:center;/*垂直居中*/height:100vh;/*需要指定高度*/}2.使用grid的place-items:center.parent{display:grid;place-item
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
广龙宇
一起学Rust#Rust设计模式rust设计模式开发语言
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用借用类型作为参数二、格式化拼接字符串三、使用构造函数总结前言Rust不是传统的面向对象编程语言,它的所有特性,使其独一无二。因此,学习特定于Rust的设计模式是必要的。本系列文章为作者学习《Rust设计模式》的学习笔记以及自己的见解。因此,本系列文章的结构也与此书的结构相同(后续可能会调成结构),基本上分为三个部分
Python数据分析与可视化实战指南
William数据分析
pythonpython数据
在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。一、环境准备1.1安装必要库在开始数据分析和可视化之前,我们需要安装一些常用的库。主要包括pandas、numpy、matplotlib和seaborn等。这些库分别用于数据处理、数学
LLM 词汇表
落难Coder
LLMsNLP大语言模型大模型llama人工智能
Contextwindow“上下文窗口”是指语言模型在生成新文本时能够回溯和参考的文本量。这不同于语言模型训练时所使用的大量数据集,而是代表了模型的“工作记忆”。较大的上下文窗口可以让模型理解和响应更复杂和更长的提示,而较小的上下文窗口可能会限制模型处理较长提示或在长时间对话中保持连贯性的能力。Fine-tuning微调是使用额外的数据进一步训练预训练语言模型的过程。这使得模型开始表示和模仿微调数
PHP环境搭建详细教程
好看资源平台
前端php
PHP是一个流行的服务器端脚本语言,广泛用于Web开发。为了使PHP能够在本地或服务器上运行,我们需要搭建一个合适的PHP环境。本教程将结合最新资料,介绍在不同操作系统上搭建PHP开发环境的多种方法,包括Windows、macOS和Linux系统的安装步骤,以及本地和Docker环境的配置。1.PHP环境搭建概述PHP环境的搭建主要分为以下几类:集成开发环境:例如XAMPP、WAMP、MAMP,这
关于提高复杂业务逻辑代码可读性的思考
编程经验分享
开发经验java数据库开发语言
目录前言需求场景常规写法拆分方法领域对象总结前言实际工作中大部分时间都是在写业务逻辑,一般都是三层架构,表示层(Controller)接收客户端请求,并对入参做检验,业务逻辑层(Service)负责处理业务逻辑,一般开发都是在这一层中写具体的业务逻辑。数据访问层(Dao)是直接和数据库交互的,用于查数据给业务逻辑层,或者是将业务逻辑层处理后的数据写入数据库。简单的增删改查接口不用多说,基本上写好一
拥有断舍离的心态,过精简生活--《断舍离》读书笔记
爱吃丸子的小樱桃
不知不觉间房间里的东西越来越多,虽然摆放整齐,但也时常会觉得空间逼仄,令人心生烦闷。抱着断舍离的态度,我开始阅读《断舍离》这本书,希望从书中能找到一些有效的方法,帮助我实现空间、物品上的断舍离。《断舍离》是日本作家山下英子通过自己的经历、思考和实践总结而成的,整体内涵也从刚开始的私人生活哲学的“断舍离”升华成了“人生实践哲学”,接着又成为每个人都能实行的“改变人生的断舍离”,从“哲学”逐渐升华成“
【华为OD机试真题2023B卷 JAVA&JS】We Are A Team
若博豆
java算法华为javascript
华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代
探索OpenAI和LangChain的适配器集成:轻松切换模型提供商
nseejrukjhad
langchaineasyui前端python
#探索OpenAI和LangChain的适配器集成:轻松切换模型提供商##引言在人工智能和自然语言处理的世界中,OpenAI的模型提供了强大的能力。然而,随着技术的发展,许多人开始探索其他模型以满足特定需求。LangChain作为一个强大的工具,集成了多种模型提供商,通过提供适配器,简化了不同模型之间的转换。本篇文章将介绍如何使用LangChain的适配器与OpenAI集成,以便轻松切换模型提供商
使用Apify加载Twitter消息以进行微调的完整指南
nseejrukjhad
twittereasyui前端python
#使用Apify加载Twitter消息以进行微调的完整指南##引言在自然语言处理领域,微调模型以适应特定任务是提升模型性能的常见方法。本文将介绍如何使用Apify从Twitter导出聊天信息,以便进一步进行微调。##主要内容###使用Apify导出推文首先,我们需要从Twitter导出推文。Apify可以帮助我们做到这一点。通过Apify的强大功能,我们可以批量抓取和导出数据,适用于各类应用场景。
深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具
nseejrukjhad
数据库python
深入理解MultiQueryRetriever:提升向量数据库检索效果的强大工具引言在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。MultiQueryRetriever的工
如何部分格式化提示模板:LangChain中的高级技巧
nseejrukjhad
langchainjava服务器python
标题:如何部分格式化提示模板:LangChain中的高级技巧内容:如何部分格式化提示模板:LangChain中的高级技巧引言在使用大型语言模型(LLM)时,提示工程是一个关键环节。LangChain提供了强大的提示模板功能,让我们能更灵活地构建和管理提示。本文将介绍LangChain中一个高级特性-部分格式化提示模板,这个技巧可以让你的提示管理更加高效和灵活。什么是部分格式化提示模板?部分格式化提
Day1笔记-Python简介&标识符和关键字&输入输出
~在杰难逃~
Pythonpython开发语言大数据数据分析数据挖掘
大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程
人工智能时代,程序员如何保持核心竞争力?
jmoych
人工智能
随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作,也有人认为AI是提高效率的得力助手。面对这一趋势,程序员应该如何应对?是专注于某个领域深耕细作,还是广泛学习以适应快速变化的技术环境?又或者,我们是否应该将重点转向AI无法轻易替代的软技能?让我们一起探讨程序员
每日算法&面试题,大厂特训二十八天——第二十天(树)
肥学
⚡算法题⚡面试题每日精进java算法数据结构
目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章
梁文道《尽头:怎样是好的阅读和书写》 片段
白夜书摘
1、写小说的人,有时会强烈地感到一种现实的召唤,想去面对和回应现实。这时他们会觉得自己正站在时代中心,就像黑格尔说的,要把时代精神掌握在自己的小说(不是哲学)里面。但是这也很危险,当一个作家像一个时代那样书写,可能就会出现问题了。2、文字是远比语言大块而且湿冷的木头,又距离我们内心的火花稍远,不容易瞬间点燃起来,这处隙缝,给了我们回身的余地,可以再多看一下想一下设身处地一下;人类过往这最后五千年,
pyecharts——绘制柱形图折线图
2224070247
信息可视化pythonjava数据可视化
一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据
阶段总结反思
轻争
马上就要进入10月份了,今天做一下前段时间的总结和反思。前段时间,日更、英语、健身、护肤坚持的比较好。阅读、书法坚持的不好。1.中间被迫停更半个多月,其余时间一直在坚持日更挑战。偶尔也有不想写的时候,就做一下摘抄。因为阅读(输入)没跟上来,所以写作(输出)质量有待进一步加强。2.英语做到了一周至少学习5天,每次不少于30分钟,但是小班课没有跟上更新速度,下一步要争取利用零碎时间补听小班课。3.减肥
【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)
算法大师
华为od面试python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
第六集如何安装CentOS7.0,3分钟学会centos7安装教程
date分享
从光盘引导系统按回车键继续进入引导程序安装界面,选择语言这里选择简体中文版点击继续选择桌面安装下面给系统分区选择磁盘,点击完成选择基本分区,点击加号swap分区,大小填内存的两倍在选择根分区,使用所有可用的磁盘空间选择文件系统ext4点击完成,点击开始安装设置root密码,点击完成设置普通用户和密码,点击完成整个过程持续八分钟左右根据个人配置不同,时间长短不同好,现在点击重启系统进入重启状态点击本
Python爬虫解析工具之xpath使用详解
eqa11
python爬虫开发语言
文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门
主题升华随机抽总结
木棉咕噜
昨天晚上在火山灿教练那里抽了主题升华最后一关。一共抽了两个故事,现总结如下。第一个故事是《并不是你想象的那样》。主题一:有时候,面对别人一些貌似不合常情的行为,不要轻易的指责他,也许背后有我们所不知道的原因。在这一个主题里面,刚开始的时候,我没有加上貌似二字。所以就没有改动之后这么精准。主题二:有时候我们对他人善意的行为,可能会给我们带来一些意外的回报。主题三:面对同样一件事,因为不同的人看待问题
Rust基础知识
GRKF15
rust开发语言后端
1.Rust语言简介1.1基础语法变量声明:let关键字用于声明变量,可以指定或不指定类型,如leta=10;和letmutc=30i32;。函数定义:使用fn关键字定义函数,并指定参数类型及返回类型,如fnadd(i:i32,j:i32)->i32{i+j}。控制流:包括if、else等,控制语句后需要使用;来结束语句。1.2数据类型整数类型:i8、i16、i32、i64、i128,以及无符号的
【无标题】达瓦达瓦
JhonKI
考研
博客主页:https://blog.csdn.net/2301_779549673欢迎点赞收藏⭐留言如有错误敬请指正!本文由JohnKi原创,首发于CSDN未来很长,值得我们全力奔赴更美好的生活✨文章目录前言111️111❤️111111111111111总结111前言111骗骗流量券,嘿嘿111111111111111111111111111️111❤️111111111111111总结11
上图为是否色发
JhonKI
考研
博客主页:https://blog.csdn.net/2301_779549673欢迎点赞收藏⭐留言如有错误敬请指正!本文由JohnKi原创,首发于CSDN未来很长,值得我们全力奔赴更美好的生活✨文章目录前言111️111❤️111111111111111总结111前言111骗骗流量券,嘿嘿111111111111111111111111111️111❤️111111111111111总结11
143234234123432
JhonKI
考研
博客主页:https://blog.csdn.net/2301_779549673欢迎点赞收藏⭐留言如有错误敬请指正!本文由JohnKi原创,首发于CSDN未来很长,值得我们全力奔赴更美好的生活✨文章目录前言111️111❤️111111111111111总结111前言111骗骗流量券,嘿嘿111111111111111111111111111️111❤️111111111111111总结11
解线性方程组
qiuwanchi
package gaodai.matrix;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Sc
在mysql内部存储代码
annan211
性能mysql存储过程触发器
在mysql内部存储代码
在mysql内部存储代码,既有优点也有缺点,而且有人倡导有人反对。
先看优点:
1 她在服务器内部执行,离数据最近,另外在服务器上执行还可以节省带宽和网络延迟。
2 这是一种代码重用。可以方便的统一业务规则,保证某些行为的一致性,所以也可以提供一定的安全性。
3 可以简化代码的维护和版本更新。
4 可以帮助提升安全,比如提供更细
Android使用Asynchronous Http Client完成登录保存cookie的问题
hotsunshine
android
Asynchronous Http Client是android中非常好的异步请求工具
除了异步之外还有很多封装比如json的处理,cookie的处理
引用
Persistent Cookie Storage with PersistentCookieStore
This library also includes a PersistentCookieStore whi
java面试题
Array_06
java面试
java面试题
第一,谈谈final, finally, finalize的区别。
final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能
网站加速
oloz
网站加速
前序:本人菜鸟,此文研究总结来源于互联网上的资料,大牛请勿喷!本人虚心学习,多指教.
1、减小网页体积的大小,尽量采用div+css模式,尽量避免复杂的页面结构,能简约就简约。
2、采用Gzip对网页进行压缩;
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz
正确书写单例模式
随意而生
java 设计模式 单例
单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你。
懒汉式,线程不安全
当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样
单例模式
香水浓
java
懒汉 调用getInstance方法时实例化
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(null == ins
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
AdyZhang
apachehttp server
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
每次到这一步都很小心防它的端口冲突问题,结果,特意留出来的80端口就是不能用,烦。
解决方法确保几处:
1、停止IIS启动
2、把端口80改成其它 (譬如90,800,,,什么数字都好)
3、防火墙(关掉试试)
在运行处输入 cmd 回车,转到apa
如何在android 文件选择器中选择多个图片或者视频?
aijuans
android
我的android app有这样的需求,在进行照片和视频上传的时候,需要一次性的从照片/视频库选择多条进行上传
但是android原生态的sdk中,只能一个一个的进行选择和上传。
我想知道是否有其他的android上传库可以解决这个问题,提供一个多选的功能,可以使checkbox之类的,一次选择多个 处理方法
官方的图片选择器(但是不支持所有版本的androi,只支持API Level
mysql中查询生日提醒的日期相关的sql
baalwolf
mysql
SELECT sysid,user_name,birthday,listid,userhead_50,CONCAT(YEAR(CURDATE()),DATE_FORMAT(birthday,'-%m-%d')),CURDATE(), dayofyear( CONCAT(YEAR(CURDATE()),DATE_FORMAT(birthday,'-%m-%d')))-dayofyear(
MongoDB索引文件破坏后导致查询错误的问题
BigBird2012
mongodb
问题描述:
MongoDB在非正常情况下关闭时,可能会导致索引文件破坏,造成数据在更新时没有反映到索引上。
解决方案:
使用脚本,重建MongoDB所有表的索引。
var names = db.getCollectionNames();
for( var i in names ){
var name = names[i];
print(name);
Javascript Promise
bijian1013
JavaScriptPromise
Parse JavaScript SDK现在提供了支持大多数异步方法的兼容jquery的Promises模式,那么这意味着什么呢,读完下文你就了解了。
一.认识Promises
“Promises”代表着在javascript程序里下一个伟大的范式,但是理解他们为什么如此伟大不是件简
[Zookeeper学习笔记九]Zookeeper源代码分析之Zookeeper构造过程
bit1129
zookeeper
Zookeeper重载了几个构造函数,其中构造者可以提供参数最多,可定制性最多的构造函数是
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolea
【Java命令三】jstack
bit1129
jstack
jstack是用于获得当前运行的Java程序所有的线程的运行情况(thread dump),不同于jmap用于获得memory dump
[hadoop@hadoop sbin]$ jstack
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F
jboss 5.1启停脚本 动静分离部署
ronin47
以前启动jboss,往各种xml配置文件,现只要运行一句脚本即可。start nohup sh /**/run.sh -c servicename -b ip -g clustername -u broatcast jboss.messaging.ServerPeerID=int -Djboss.service.binding.set=p
UI之如何打磨设计能力?
brotherlamp
UIui教程ui自学ui资料ui视频
在越来越拥挤的初创企业世界里,视觉设计的重要性往往可以与杀手级用户体验比肩。在许多情况下,尤其对于 Web 初创企业而言,这两者都是不可或缺的。前不久我们在《右脑革命:别学编程了,学艺术吧》中也曾发出过重视设计的呼吁。如何才能提高初创企业的设计能力呢?以下是 9 位创始人的体会。
1.找到自己的方式
如果你是设计师,要想提高技能可以去设计博客和展示好设计的网站如D-lists或
三色旗算法
bylijinnan
java算法
import java.util.Arrays;
/**
问题:
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,
您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳
子上进行这个动作,而且一次只能调换两个旗子。
网上的解法大多类似:
在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来
警告:No configuration found for the specified action: \'s
chiangfai
configuration
1.index.jsp页面form标签未指定namespace属性。
<!--index.jsp代码-->
<%@taglib prefix="s" uri="/struts-tags"%>
...
<s:form action="submit" method="post"&g
redis -- hash_max_zipmap_entries设置过大有问题
chenchao051
redishash
使用redis时为了使用hash追求更高的内存使用率,我们一般都用hash结构,并且有时候会把hash_max_zipmap_entries这个值设置的很大,很多资料也推荐设置到1000,默认设置为了512,但是这里有个坑
#define ZIPMAP_BIGLEN 254
#define ZIPMAP_END 255
/* Return th
select into outfile access deny问题
daizj
mysqltxt导出数据到文件
本文转自:http://hatemysql.com/2010/06/29/select-into-outfile-access-deny%E9%97%AE%E9%A2%98/
为应用建立了rnd的帐号,专门为他们查询线上数据库用的,当然,只有他们上了生产网络以后才能连上数据库,安全方面我们还是很注意的,呵呵。
授权的语句如下:
grant select on armory.* to rn
phpexcel导出excel表简单入门示例
dcj3sjt126com
PHPExcelphpexcel
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Brows
美国电影超短200句
dcj3sjt126com
电影
1. I see. 我明白了。2. I quit! 我不干了!3. Let go! 放手!4. Me too. 我也是。5. My god! 天哪!6. No way! 不行!7. Come on. 来吧(赶快)8. Hold on. 等一等。9. I agree。 我同意。10. Not bad. 还不错。11. Not yet. 还没。12. See you. 再见。13. Shut up!
Java访问远程服务
dyy_gusi
httpclientwebservicegetpost
随着webService的崛起,我们开始中会越来越多的使用到访问远程webService服务。当然对于不同的webService框架一般都有自己的client包供使用,但是如果使用webService框架自己的client包,那么必然需要在自己的代码中引入它的包,如果同时调运了多个不同框架的webService,那么就需要同时引入多个不同的clien
Maven的settings.xml配置
geeksun
settings.xml
settings.xml是Maven的配置文件,下面解释一下其中的配置含义:
settings.xml存在于两个地方:
1.安装的地方:$M2_HOME/conf/settings.xml
2.用户的目录:${user.home}/.m2/settings.xml
前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先。
ubuntu的init与系统服务设置
hongtoushizi
ubuntu
转载自:
http://iysm.net/?p=178 init
Init是位于/sbin/init的一个程序,它是在linux下,在系统启动过程中,初始化所有的设备驱动程序和数据结构等之后,由内核启动的一个用户级程序,并由此init程序进而完成系统的启动过程。
ubuntu与传统的linux略有不同,使用upstart完成系统的启动,但表面上仍维持init程序的形式。
运行
跟我学Nginx+Lua开发目录贴
jinnianshilongnian
nginxlua
使用Nginx+Lua开发近一年的时间,学习和实践了一些Nginx+Lua开发的架构,为了让更多人使用Nginx+Lua架构开发,利用春节期间总结了一份基本的学习教程,希望对大家有用。也欢迎谈探讨学习一些经验。
目录
第一章 安装Nginx+Lua开发环境
第二章 Nginx+Lua开发入门
第三章 Redis/SSDB+Twemproxy安装与使用
第四章 L
php位运算符注意事项
home198979
位运算PHP&
$a = $b = $c = 0;
$a & $b = 1;
$b | $c = 1
问a,b,c最终为多少?
当看到这题时,我犯了一个低级错误,误 以为位运算符会改变变量的值。所以得出结果是1 1 0
但是位运算符是不会改变变量的值的,例如:
$a=1;$b=2;
$a&$b;
这样a,b的值不会有任何改变
Linux shell数组建立和使用技巧
pda158
linux
1.数组定义 [chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo $a 1 一对括号表示是数组,数组元素用“空格”符号分割开。
2.数组读取与赋值 得到长度: [chengmo@centos5 ~]$ echo ${#a[@]} 5 用${#数组名[@或
hotspot源码(JDK7)
ol_beta
javaHotSpotjvm
源码结构图,方便理解:
├─agent Serviceab
Oracle基本事务和ForAll执行批量DML练习
vipbooks
oraclesql
基本事务的使用:
从账户一的余额中转100到账户二的余额中去,如果账户二不存在或账户一中的余额不足100则整笔交易回滚
select * from account;
-- 创建一张账户表
create table account(
-- 账户ID
id number(3) not null,
-- 账户名称
nam
COMMENTS
如何像里边赋值?
Posted by: IT技术论坛 | (42) March 2, 2012 07:54 PM
struct foo_object {
struct i_foo * vtbl;
void * data;
void * others;
};
把data, 放在基类中合适吗?
foo_object是不需要基类的具体数据的;
这样的话
struct foo_object * foo_create(struct i_foo *iface, void *data);
这个接口也不需要data参数;
必要的话,在i_foo
中加个,init函数成员,负责创建子类
foo_object 只需要在foo_create函数中调用i_foo中的init创建具体的子类既可以了。
这样的话个人感觉更nice点
Posted by: guaniu | (41) January 26, 2012 12:07 AM
我的观点是:我们需要的是面向对象的设计观,不需要编程语言是OOP的。
我个人觉得C++中有太多的语法陷阱。真正能用好C++的人,肯定可以用C完美地实现同样的功能。
Posted by: DavidWang | (40) October 20, 2011 01:50 PM
云风兄,俺写了个博客,想引用你的文章。但是不会用你的引用通告。。。能教一下不。。。
Posted by: zldrobit | (39) May 12, 2011 04:00 PM
云风大哥的C面向对象编程模式与高通brew平台C编程模式一模一样,面向对象从来都是思想,不是语言,前面说C++的偏颇多了,C++不是封装,不是拉了屎,不用擦,如果说管理内存是屎的话,那所有非托管代码都是屎。C要管理内存,C++不一样也得管理内存,而且,比C更复杂,更容易出问题
Posted by: Anonymous | (38) January 5, 2011 03:56 PM
我觉得写程序没有必要有偏执,
那种工具最适合当前的任务就用哪种。
任何语言都只是一种工具。
没有必要因为偏爱铁锤,就炒菜吃饭都用修正过的铁锤。
可能这位兄弟不了解云风,才会如此发言。
我感觉到很多搞技术管理的都是这样的观点,对于技术不求甚解、偏好表面的、随大流,很多东西并不是自己深深体会的就敢拿来用。
云风之所以选择C语言加上一点OO扩展,应该是有其深思熟虑的,并不是合适不合适,偏爱铁锤这么简单。
我作为一个菜鸟我都可以说出几个简单的理由
1)C++复杂度太大,增加了项目组成员的心理负担
2)C++对于3D核心编程,并没有太多的优势
3)C++对环境要求高,注意我说的环境是库依赖、开发环境,对于这点怀疑的同学可以自己去做做真正多平台的软件产品,那些拿QT随便画画界面的你就不要拿来说了
Posted by: softtiger | (37) December 6, 2010 01:40 PM
个人觉得
struct foo_object {
struct i_foo * vtbl;
void * data;
void * others;
};
不必存在,vtbl冗余了,不必模拟C++实现
下面这个是对数据和接口的调用原型
void do(struct _if1* pif,void * data)
{
pif->type_dosome(data);
}
对上面接口的使用
do(foobar_foo(),foobar_create());
没有采用构建foo_object的办法,而是直接调用,也即是说foo_object不必存在,foo_object仅仅是有形式上的意义,将函数表和数据放在一块了
Posted by: softtiger | (36) December 6, 2010 01:29 PM
老大, 我没有完全看懂,
但我觉得, 还不如自己实现一个编译器, 语法 想咋编就咋编.
如果实现 自己的(每个平台一种) 编译器 有困难, 这时就需要 c 专家.
可以 把 "自己的语言" --翻译成-->>"c语言"
c语言毕竟 无法实现 中断, 代理函数... 这是需要自己实现编译器的原因.
Posted by: Johnny | (35) November 18, 2010 04:13 PM
感觉像 Opaque pointer 的扩展,云风将处理与数据分开了,自由组合。我觉得这也是个不错的方式。
总希望最大化的重用已有的代码,总希望数据与处理可以独立又能和谐相处,还希望所有的接口都可以转成统一的模式,那就完美了。
变化的需求及开发过程中的突发事件,让我常常有上面的理想,设计让我感觉就是在一次又一次的不理想中完善的,所以方法都是值得学习的。
Posted by: zen_yue | (34) September 7, 2010 01:46 AM
虽然我不反对这样做,但是如果几个类继承下来,编码就显得有些费劲了吧,特别是要重新设计一个类的时候,以前看过一本讲oo的C语言的书,感觉也是这种风格的,但是代码读起来都很累......
感觉GObject也是用到了类似的方法,虽然功能强大,但是用起来也费尽.
我用宏写了个模拟oo的框架,个人感觉还算凑合的,顺带发个下载地址,
http://sourceforge.net/projects/jcoop
Posted by: pingf | (33) July 4, 2010 12:57 AM
好文章。
Posted by: magic | (32) April 24, 2010 04:23 PM
参见Linux内核VFS部分实现...
Posted by: wf | (31) April 3, 2010 11:29 PM
谢谢云风老大,最近要用C开发嵌入式程序,一直在找资料想用oo来设计,通读了两遍这篇文章,觉得自己大致理解了80%,决定用这个范式试试,总之这篇文章太及时了
Posted by: fooy | (30) March 31, 2010 01:06 AM
回27楼,如果你不真正了解需求,是不可能有所谓的完美的设计的,设计和语言没什么关系.
Posted by: ix | (29) March 30, 2010 07:35 PM
我说的减法是指对语言特性的利用方面……
至于那个例子……“CHttpDownloader::Connect()的实现就是建立TCP连接,发HTTP-GET命令”即使是作为一个独立的C函数,这个函数做的工作也应该分成两个,一个只处理TCP连接相关的事情,一个只处理HTTP相关的事情……我觉得有很多问题的根源不在于工具本身。
Posted by: sjinny | (28) March 29, 2010 11:46 PM
说C++难做减法,举个例子吧。假设你做一个下载的接口类CDownloader,定义三个虚函数(接口):Connect(), PullData()和Cleanup()。非虚函数两个:一个是Specify()指定文件的url和存放的路径,另一个是Go()。Go的实现很简单,就是依次调用Connect()和PullData(),根据这两个函数的返回值设置返回码,最后调用Cleanup()。
下面考察几个派生类
CHttpDownloader::Connect()的实现就是建立TCP连接,发HTTP-GET命令,PullData()的实现就是解析HTTP应答,分离出HTTP头部,保存数据,Cleanup()的实现就是断开TCP连接,关闭Socket。
到此为止,一切看起来都很简洁,简直是完美!
现在发现有些网站需要鉴权,使用HTTPS协议。问题开始显现:原先CHttpDownloader类的Connect()已经实现为连接和发送HTTP-GET请求,现在需要在这个请求里面加上鉴权信息,势必要推翻基类的设计,要么重载Connect(),不再调用基类的这个函数;要么重新设计CDownloader类,把连接和发送请求分开。
一个“设计好了”的类,你对它已经没有什么可挑剔的情况,没有理由不用它。而某一天你又发现它不适合某种需求,不得不修改时,才发觉C++的逻辑耦合远比宣传的“数据与方法封装”、“接口与实现分离”来得复杂。
现实中总是有需求变化,因为一点点需求变化,使得我们要去用HackN多年前已经工作正常的代码(或修改接口),然后花费很多精力去检查所有的派生类和使用该类的客户代码,这跟C++的初衷之一——提高代码重用——显然是背道而驰的。
Posted by: livy | (27) March 29, 2010 05:22 PM
关中刀客,
为什么说滥用const?
Posted by: Anonymous | (26) March 26, 2010 05:23 PM
真是太丑陋了:)
暂时是没办法的。
Posted by: mike | (25) March 26, 2010 03:20 PM
不太清楚用C++时做减法的难点在哪,感觉上C++并不要求使用者完全理解所有部分后才可以使用。
不知道const的滥用是怎样的,给“需要保护的对象的引用”加上const应该不算滥用吧,而这样应该也就足够了。
如果说C++要用好需要花费使用者很大的代价,那我认同,但也不用先给C++一个充当银弹的使命然后再去批判,C++并不是一个排斥其他语言的语言,也不排斥各种范式,即使把C++当作C用,也可以从类型检查中得到好处。
Posted by: sjinny | (24) March 25, 2010 11:26 PM
在校时没把C++学好,现在对C++还是一知半解呀,以后多多来学习一下,相信会懂得更多。
Posted by: 桂林旅游 | (23) March 22, 2010 09:27 AM
vtbl这个叫法不好。
fobj->vtbl->foobar(fobj->data);改成
fobj->ops->foobar(fobj->data);
对ops进行引用计数管理。
Posted by: Erick | (22) March 20, 2010 09:14 PM
OOP语言中用基类充当接口并不是很合理的抽象方式,而C++这些年提出的runtime concept则是一大进步,个人觉得它与本文中的思路是一致的。这在C++里面也许该叫做面向concept了。不过concept都给标准委员会毙了,runtime concept更不用指望了。
Posted by: kpx | (21) March 17, 2010 10:56 PM
@亮哥
云风当年可是c++的狂热fans
不过这里云风的这个对象模型和c++的不太一样 他将数据和接口分离了
不过我很好奇 没有更c的模型..
btw 从之前的文章看云风这个引擎和市面上的似乎会有很大的不同 我也很好奇
Posted by: qianqians | (20) March 16, 2010 06:48 PM
其实我能明白你的意思,你是想利用C的高效,然后用C做加法,利用一些技巧实现部分C++的面向对象功能。
语言之争也一直没有一个什么结果,可能是你一直是做底层,平台性相关的代码工作,所以主要是用C,所以你的C语言编写能力非常之好,完全能实现部分的C++功能,对于你采用C为主的观点,我换位思考,是同意的。不过我更关注的是3D引擎的设计,而你又在这方面很有经验,不妨写点你的心得放上来,让我们学学。
Posted by: 亮哥 | (19) March 16, 2010 06:00 PM
@亮哥,
"如果data是你的struct结构创建出来"
并不是这样,data 是数据体,foobar 是 data 以 foo 方式的呈现方式。
data 还可以以其它的形式呈现,用另一种形式去控制。
更多的时候我们需要让各种不同的实体,从不同的角度归类,按某一同质化的形式去操作。
对象并非非此即比的。这也是 C++ 社区为多继承吵的不可开交的缘由。
这里,把不同的实体按生命期隔开。再把功能按接口分离。算是有点 AOP 的味道吧。
Posted by: cloud | (18) March 16, 2010 01:18 PM
这里高手云集,我的MSN [email protected],希望能和各位共同探讨技术问题
Posted by: 亮哥 | (17) March 16, 2010 10:41 AM
我觉得写程序没有必要有偏执,
那种工具最适合当前的任务就用哪种。
任何语言都只是一种工具。
没有必要因为偏爱铁锤,就炒菜吃饭都用修正过的铁锤。
Posted by: 小糊涂 | (16) March 16, 2010 10:14 AM
恕我愚见,云风大哥的一些观点我不认同。C++是面向对像编程,其意是我只需要知道你的这个对像,不用管你内部是如何实现的,把交待好的事情给你办,你把办好的结果给我就行了。这样就能减少逻辑的复杂性,不必事事亲躬。就拿上面所说结构内部的data成员的生命周期来说,如果data是你的struct结构创建出来,你就必须负责data的释放,最好遵守谁创建,谁就要负责释放。说个不好听的比喻,你拉了一堆屎,还指望别人来帮你打扫啊。另外 一个设计原则,一个类(结构)的对象,最好不要用本类(结构)中的方法来建对象,这和真实世界是不相符的,一个类对象的创建,应当由上一级更大范围内的一个类(结构)来创建,比如说,一个总公司可以建立若干子公司,但是子公司你不能建立和自已平级的兄弟公司,子公司只能建立自已的子公司。但是为什么现在好多的C++类里面会用CreateObject创建本类的对象呢?这是一个工厂的概念。我举个例子 来说:一台电脑主机,是由各个比如主板,CPU,内存,硬盘等组成的,电脑生产公司比如联想,联想公司的电脑产品是一台一台地生产,联想公司需要面对的对象是一台台的整机电脑。但是联想公司采购电脑配件,不可能是一块主板配一块CPU,配一块内存,硬盘这样来采购,而是采用一批主板,一批显卡,硬盘,CPU的这种方式来采购,因为这么做效率高。效率才是最重要的,好了,基于这点,那么这些配件的生产商就是一个工厂,他负责生产专一的配件,这件事由他来做,更熟练更专业。假设配件有回收的概念,从理论上来说,那么这些用了若干年的老化了的配件,也必须由这类专业化的工厂进行回收,这样也才更有效率,把统一回收回来的主板统一扔到融炉里面分离出来材料。
好了,现在概念清晰了,对象逻辑层的东西,我们是需要面象对象来操作,比于底层的东西,我们需要有工厂的概念。所以在逻辑层,我们使C++方式来做,在底层,我们把这些对象分解,交给专业化的工厂来做。所以底层我们采用C的方式,C的方式也更接近硬件流水线。其实我们一直是在这么做的。比如我们客户端里面有1000个人物对象在行走,对于逻辑程序来说,他操作的是单个人物(模型),让这个模型跑到哪里,就跑到哪里。但是在底层渲染,我们不可能单个模型进行渲染的,底层程序都是把每个模型根据渲染状态,纹理等分离,再把这1000个分离出来的相同部件集成在一个渲染列表里面,形成批处理渲染。
总结一下,我们在底层,用专业化的工厂模式来大规模化生产配件,在上层,我们组装了一个个的产品,之后我们对于这些产品都是基于对象的概念来处理,这样才符合人类的思维模式,才有可能组建更大的社会团体。
希望我写的这点对于大家有帮助,一般我个人太懒,从来不爱写东西,也从来都潜水。希望能和大家云风交流技术问题。
Posted by: 亮哥 | (15) March 16, 2010 10:11 AM
http://www.reddit.com/r/programming/comments/bdkpb/the_c_object_system_using_c_as_a_highlevel/
Posted by: Anonymous | (14) March 16, 2010 09:23 AM
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
Posted by: 赵中 | (13) March 15, 2010 04:09 PM
在上个世纪,我读大学那会儿。见到有不少人只要写程序必用 MFC ,甚至不是跟窗口有关的。
他们用 MFC 只有一个理由,我要用 CString 。
Posted by: cloud | (12) March 15, 2010 01:26 PM
To Cloud:
我对你说的“C++ 里的东西又太多太杂。大部分时候做减法不易。
”这句话不太明白。
当你花费很多力气用C自己去实现一些OOP的时候,为什么只用C++的这些特性呢。
把C++的编译器当作一个C with OOP的编译器来用。还可以享受到一些C++类型检查的好处。
在我看来,做减法的难易程度取决于人的用法。而不是在语言本身。
从某个角度说如果使用语言的人,不知道自己所用的编译器支持C++那些花哨的特性,那么他们自然也不用滥用了。
所以我觉得,在编译器性能相当的情况下。自己用C去实现一些OPP得不偿失。
我是在不明白做减法的不易是不易在哪里。
Posted by: 小糊涂 | (11) March 15, 2010 12:15 PM
这种设计虽然可以做得天衣无缝,但学习使用的门槛我看比C++还高,我们可以很容易去限制C++特性的使用,但不容易限制C语言范式的扩展,C++能轻易地安全地无效率损失地实现,C语言这么做就不太合适了.C++的面向对象编程我认为最重要的是构造和析构的自动化,也是C语言无法实现的,有了这种自动化,大部分数据的生命周期问题都能轻易解决.
用个不太恰当的例子就是,C语言编程是水力发电,而C++是核能发电,虽然后者危险,但还是不能否认其在未来中的作用,而且我相信会更好地驯服.
Posted by: dwing | (10) March 15, 2010 10:46 AM
Unix编程艺术也是这个观点
还是比较赞同的 :)
某些领域C++有优势
但不是银弹
Posted by: volfmath | (9) March 15, 2010 10:27 AM
但是,这样子类直接覆盖虚函数表,如果父类中有公共的代码,不想在子类中重写,C++中可以写成parent::fun()这样。你这边怎么解决呢?
Posted by: haxixi | (8) March 14, 2010 11:58 PM
我的观点是在现有c/c++中, 宏和inline没太大问题, 甚至是模板, 想用就用, 最大的问题还是设计问题, 自以为是的巧妙实则愚笨的设计带来了成本问题, 学习成本,难解bug的成本, 甚至重写的成本.
有谁会去责怪stl呢, c++增长了庸的人设计的可能性, 成为一个c高手大概也要掌握很多设计范式, 这些经验性的东西,难以朝夕获得.若想降低普通程序员的门槛,似乎还真得JAVA一类的安全语言.
少数人做设计, 其它人在框架之上搭积木,可能是成熟开发的模式呢.
Posted by: liching | (7) March 14, 2010 10:59 PM
@cyberscorpio
题头第一句,OOP 不是银弹。
C++ 里的东西又太多太杂。大部分时候做减法不易。
所以在必须使用 OOP 的时候,我选择对 C 做加法。(此文方式,也并没有对 C 语言(借助宏或代码生成器)做语法上的加法。
@lichking
至于查 bug ,IMHO ,C++ 的 bug 比 C 的难查的多。
我本人极力避免在 C 里使用宏。
Posted by: Cloud | (6) March 14, 2010 07:29 PM
云风的这种方法作为一种编程规范,在项目组内推广普及,我觉得没什么问题,只要大家都这么做,实际上相当于减少了建造巴别塔的工人们所讲的方言数量,对于统一认识,加强战斗力是很有帮助的。
但把 C 的代码设计成这个样子,依我 **个人浅见** ,还不如用 C++ 来做这些接口了 ^_^
Posted by: cyberscorpio | (5) March 14, 2010 06:45 PM
inline和面向对象有什么关系, 宏又如何模拟面向对象, 为什么要分离,什么又是耦合,实际面对的问题有多少因为inline或是宏所引起的?
c++时代批判c到处充斥的宏, 如今inline也成了罪过.
还有const呢, IMHO, 类型较为安全的c++对c来说是一种进步, 但远不足够, 这也就导致了为什么这些程序员要花多得多的时间在调试上面,这些让人通宵恼怒地解决bug的经历并不是什么成就感.
户外运动者无需天文望远镜,数学家也绝少在论文中巧用比喻. 实践者和理论家是两种人, 实践者通过口口相传,体验领会,并非是写在纸上的淳淳教导,长久以来, 实践者发明了一个较为"理论"的词汇“方法论”, 于是面向对象, 耦合,分离, 形成了某种的实践主义的形而上学.可是尽管我们习惯于讨论似是而非, 终究感觉所学甚少,难以踏实. 谦逊地认为,这并非是一个理论, 而把它局限于我们模糊的讨论中吧.
Posted by: lichking | (4) March 14, 2010 04:23 PM
我感触较深的是c++程序员对const的滥用到了极致.