so, dll, 动态链接库

so, dll, 动态链接库 不同操作系统的动态链接库文件格式稍有不同,Linux称之为共享目标文件 (Shared Object),文件后缀为.so,Windows的动态链接库 (Dynamic Link Library)文件后缀为.dll。 https://zhuanlan.zhihu.com/p/235551437 ‘windows dll, Linux so’ http://blog.csdn.net/yang_lang/article/details/5926486 摘要: 动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验。 引言 动态库 (Dynamic Link Library abbr,DLL) 技术是程序设计中经常采用的技术。其目的减少程序的大小,节省空间,提高效率,具有很高的灵活性。 采用动态库技术对于升级软件版本更加容易。与静态库 (Static Link Library) 不同,动态库里面的函数不是执行程序本身的一部分,而是根据执行需要按需载入,其执行代码可以同时在多个程序中共享。 在 Windows和Linux操作系统中,都可采用这种方式进行软件设计,但他们的调用方式以及程序编制方式不尽相同。本文首先分析了在这两种操作系统中通 常采用的动态库调用方法以及程序编制方式,然后分析比较了这两种方式的不同之处,最后根据实际移植程序经验,介绍了将VC++编制的Windows动态库 移植到Linux下的方法。 动态库技术 2.1 Windows动态库技术 动态链接库是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动态库包含外部函数和资源,也有一些动态库只包含 资源,如Windows字体资源文件,称之为资源动态链接库。通常动态库以.dll,.drv、.fon等作为后缀。 相应的windows静态库通常以.lib结尾,Windows自己就将一些主要的系统功能以动态库模块的形式实现。 Windows动态库在运行时被系统加载到进程的虚拟空间中,使用从调用进程的虚拟地址空间分配的内存,成为调用进程的一部分。DLL也只能被该进程的线程所访问。DLL的句柄可以被调用进程使用;调用进程的句柄可以被DLL使用。 DLL 模块中包含各种导出函数,用于向外界提供服务。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中 只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关,可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何 对象 (包括变量) 都归调用它的线程或进程所有。 根据调用方式的不同,对动态库的调用可分为静态调用方式和动态调用方式。 (1) 静态调用,也称为隐式调用,由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码 (Windows系统负责对DLL调用次数的计数) ,调用方式 简单,能够满足通常的要求。通常采用的调用方式是把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只须在源文件中 声明一下。 LIB文件包含了每一个DLL导出函数的符号名和可选择的标识号以及DLL文件名,不含有实际的代码。Lib文件包含的信息进入到生成的应用程序中,被调用的DLL文件会在应用程序加载时同时加载在到内存中。 (2)动态调用,即显式调用方式,是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,比较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。在Windows系统中,与动态库调用有关的函数包括: ①LoadLibrary (或MFC 的AfxLoadLibrary) ,装载动态库。 ②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。 ③FreeLibrary (或MFC的AfxFreeLibrary) ,释放动态链接库。 在 windows中创建动态库也非常方便和简单。在Visual C++中,可以创建不用MFC而直接用C语言写的DLL程序,也可以创建基于MFC类库的DLL程序。每一个DLL必须有一个入口点,在VC++ 中,DllMain是一个缺省的入口函数。DllMain负责初始化(Initialization)和结束(Termination)工作。 ...

2012-03-27 · 2 min · 243 words · -

FileDisk

FileDisk FileDisk原理分析! 2008-03-16 12:34 FileDisk作为开源代码,在网上广为流传,是卷,磁盘方面驱动的基础代码,对于刚刚接触驱动程序开发的朋友说来,是入门的捷径! 下面我将对FileDisk的基本工作原理做个简单的介绍: FileDisk是可以将文件虚拟为一个卷使用的驱动程序(其实不一定是文件,只要是存储介质都可以的)。Filedisk在加载的时候就会常见4个设备,当然你随便你创建几个。上层应用程序映射一个卷的时候,比如映射卷F: 那么F:就是FileDisk所创建的那4个设备其中一个的符号连接 (其中哪一个都是可以的) ,创建好这个符号连接以后,用户应用程序就可以发送IRP(IO请求)到这个设备了 (deviceFileDiskFileDisk0) ,那么怎样处理这些请求呢, (只有3种请求: READ WRITE IOCONTROL(包括自定义的iocode)) ,主要的任务就是处理读和写。针对每个设备都有一个处理IRP线程! (分发函数不直接处理IRP,而是加入队列,由处理线程处理) 。 其实原理就是这么一点东西,但是我们如果要是做其他的类似的驱动,无疑FileDisk是一个很好的教程!从FileDisk我们可以引申出很多东西!如果我们把FileDisk的文件,换成多个文件 (文件List) 那么就有点像磁盘整列的意思了! (不过显然FileDisk在其之上干活) 。 欢迎大家提问交流!!!!!!!!!!!!

2012-03-26 · 1 min · 25 words · -

CDI

http://www.infoq.com/cn/articles/cf-javaone-2011-cdi-google-dart CDI 对于依赖注入的概念,相信很多开发人员都不陌生。一个组件在运行过程中会依赖其他组件提供的功能。传统的做法是由组件本身负责查找所需的依赖对象。这种方式会造成组件之间的紧耦合,不利于组件的维护和更新。依赖注入的做法则是由组件以声明式的方式表明其依赖关系,由框架在运行时把所需的组件的Java对象注入到当前组件中。相对于Java SE来说,依赖注入的概念对于Java EE更加适用。Java EE中的很多资源和服务都是由容器来负责管理的。对于单个应用来说,查找由容器负责管理的组件并不是一件容易的事情。更好的做法是由应用来声明所需的资源和服务,由容器负责注入到应用中。通过这种方式,容器也可以更好的对资源和服务进行管理。以数据库连接为例,传统的做法需要由应用本身加载相关驱动并创建数据库连接,以及在适当的时候进行释放。而使用容器管理并注入依赖的做法,则减轻了应用开发人员的工作量。 Java EE 5中添加了对依赖注入的有限支持。通过注解可以往容器管理的对象中注入资源的对应对象。Java EE 6中把依赖注入的概念更进一步,即引入了JSR 299 (Contexts and Dependency Injection for the Java EE platform)规范,简称CDI。CDI规范吸收了来自Spring IoC容器、JBoss Seam和Google Guice的最佳实践,并与Java EE开发的实际需要相结合。正如CDI的字面含义一样,CDI中的两个核心功能是上下文信息 (context) 和依赖注入。这两个功能的结合点是Java中基本的组件模型bean。在CDI中,bean 定义了应用的状态和逻辑,并由容器来进行管理。每个被管理的bean都有定义好的绑定到特定上下文的作用域和生命周期。当需要注入或访问bean时,容器会从作用域对应的上下文中获取。当作用域失效时,对应上下文中所有的对象都会被删除。CDI中的每个bean都可以作为依赖注入时的目标。 CDI中预定义了一些常用的作用域。默认的作用域是Dependent,表示只对被注入的对象生效。作用域ApplicationScoped表示应用的全局作用域,用来创建全局唯一的对象。RequestScoped和SessionScoped则与HTTP相关,分别表示HTTP请求和HTTP会话。ConversationScoped是由应用自定义生命周期长短的作用域,可以用来实现跨多页面的工作流。如下面代码中的OrderProcessor类只存活在HTTP请求中,并且依赖OrderDao接口的实现。容器会在运行时查找到OrderDao接口的实现对象,并注入到OrderProcessor类的对象中。 @Named @RequestScoped public class OrderProcessor { @Inject private OrderDao orderDao; } 通常的依赖注入方式是在代码中只依赖接口,由容器在运行时选择合适的实现类的对象来进行注入。如果接口只有一个实现类,则不需要额外的声明。如果接口有不同的实现,则需要使用限定符 (qualifier) 来声明具体使用的实现,否则容器无法做出正确的选择。CDI的一个特点是限定符不是普通的字符串,而是类型安全的注解。 通过Qualifier元注解可以创建新的限定符注解。如下面的代码创建了一个新的限定符注解InMemory。 @Qualifier @Retention(RUNTIME) @Target({TYPE}) public @interface InMemory {} 该注解可以添加在OrderDao接口的实现上。 @InMemory public class InMemoryOrderDao implements OrderDao { } 如果在测试时,希望使用简单的基于内存的存储实现,可以使用InMemory注解来声明。这样容器在注入时会使用InMemoryOrderDao类的对象。 @Named @RequestScoped public class OrderProcessor { @Inject @InMemory private OrderDao orderDao; } ...

2012-03-26 · 2 min · 276 words · -

Spring的静态工厂方法

Spring的静态工厂方法 http://blog.csdn.net/chensugang/article/details/3357593 上一次写了一篇关于DI的三种方式,其中里面介绍了构造方法的方式,今天学习了一种替代构造器的方法,这就是静态工厂方法来返回对象,下面来看一下静态工厂方法的实现。 静态工厂方法: LoginAction类: package com.spring.test.di; public class LoginAction { private Logic logic; private LoginAction(Logic logic){ this.logic = logic; } public static LoginAction createInstance(Logic logic){ LoginAction loginAction = new LoginAction (logic); return loginAction; } public void execute() { String name = logic.getName(); System.out.print(“My Name Is " + name); } } 注意: 这里使用的构造方法是一个私有方法,createInstance这个就是我们的静态工厂方法 Logic接口: package com.spring.test.di; public interface Logic { public String getName(); } 这里只是做为一个简单的例子,所以我们在该接口中只有一个方法,并且在该接口的实现方法也超级简单 Logic接口实现: package com.spring.test.di; public class LogicImpl implements Logic{ public String getName(){ return “fengyun”; ...

2012-03-26 · 1 min · 133 words · -

static factory method

static factory method 创建类的实例的最常见的方式是用new语句调用类的构造方法。在这种情况下,程序可以创建类的任意多个实例,每执行一条new语句,都会导致Java虚拟机的堆区中产生一个新的对象。假如类需要进一步封装创建自身实例的细节,并且控制自身实例的数目,那么可以提供静态工厂方法。 例如Class实例是Java虚拟机在加载一个类时自动创建的,程序无法用new语句创建java.lang.Class类的实例,因为Class类没有提供public类型的构造方法。为了使程序能获得代表某个类的Class实例,在Class类中提供了静态工厂方法forName(String name),它的使用方式如下: Class c=Class.forName( “Sample “); //返回代表Sample类的实例 静态工厂方法与用new语句调用的构造方法相比,有以下区别。 (1) 构造方法的名字必须与类名相同。这一特性的优点是符合Java语言的规范,缺点是类的所有重载的构造方法的名字都相同,不能从名字上区分每个重载方法,容易引起混淆。 静态工厂方法的方法名可以是任意的,这一特性的优点是可以提高程序代码的可读性,在方法名中能体现与实例有关的信息。例如例程11-5的Gender类有两个静态工厂方法: getFemale()和getMale()。 例程11-5 Gender.java public class Gender{ private String description; private static final Gender female=new Gender( “女 “); private static final Gender male=new Gender( “男 “); private Gender(String description){this.description=description;} public static Gender getFemale(){ return female; } public static Gender getMale(){ return male; } public String getDescription(){return description;} } 这一特性的缺点是与其他的静态方法没有明显的区别,使用户难以识别类中到底哪些静态方法专门负责返回类的实例。为了减少这一缺点带来的负面影响,可以在为静态工厂方法命名时尽量遵守约定俗成的规范,当然这不是必需的。目前比较流行的规范是把静态工厂方法命名为valueOf或者getInstance。 l valueOf: 该方法返回的实例与它的参数具有同样的值,例如: Integer a=Integer.valueOf(100); //返回取值为100的Integer对象 从上面代码可以看出,valueOf()方法能执行类型转换操作,在本例中,把int类型的基本数据转换为Integer对象。 l getInstance: 返回的实例与参数匹配,例如: ...

2012-03-26 · 2 min · 265 words · -

tunctl

tunctl tunctl is used to set up and maintain persistent TUN/TAP network interfaces, enabling user applications to simulate network traffic. Such interfaces is useful for VPN software, virtualization, emulation, simulation, and a number of other applications. -t _interface _Specifies the desired interface name. **-b **Brief output, prints just the interface name -d _interfacename _Delete the specified interfacename (set it to non-persistent) -t _interface _Specifies the desired interface name. -u _user _Specifies the owner of the interface. This user is allowed to attach to the “network/wire” side. ...

2012-03-25 · 1 min · 96 words · -

virt-manager error

virt-manager error After I finished the install of the “kvm ,qemu-kvm ,libvirt-bin,virtinst,virt-manager”. I want to connect to my vms through the virt-manager .But I come to this error: Unable to open a connection to the libvirt management daemon. Libvirt URI is: qemu:///system Verify that: The ’libvirtd’ daemon has been started And more details: Unable to open connection to hypervisor URI ‘qemu:///system’: unable to connect to ‘/var/run/libvirt/libvirt-sock’, libvirtd may need to be started: Permission denied ...

2012-03-24 · 1 min · 146 words · -

LSM-Tree

LSM-Tree LSM-Tree, Log Structured Merge Tree LSM-Tree 能将离散的随机写请求都转换成批量的顺序写请求 (WAL + Compaction),以此提高写性能。 十多年前,谷歌发布了大名鼎鼎的"三驾马车"的论文,分别是 GFS(2003年),MapReduce (2004年),BigTable (2006年),为开源界在大数据领域带来了无数的灵感,其中在 “BigTable” 的论文中很多很酷的方面之一就是它所使用的文件组织方式,这个方法更一般的名字叫 Log Structured-Merge Tree。在面对亿级别之上的海量数据的存储和检索的场景下,我们选择的数据库通常都是各种强力的NoSQL,比如 Hbase, Cassandra, Leveldb, RocksDB 等等,这其中前两者是 Apache 下面的顶级开源项目数据库,后两者分别是 Google 和 Facebook 开源的数据库存储引擎。而这些强大的 NoSQL 数据库都有一个共性,就是其底层使用的数据结构,都是仿照 “BigTable” 中的文件组织方式来实现的,也就是我们今天要介绍的 LSM-Tree。 influxdb 使用的 TSM 存储引擎也是根据 LSM Tree 针对时间序列数据优化而来 什么是 LSM-Tree LSM-Tree全称是 Log Structured Merge Tree,是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了磁盘批量的顺序写要远比随机写性能高出很多的特性 围绕这一原理进行设计和优化,以此让写性能达到最优,正如我们普通的 Log 的写入方式,这种结构的写入,全部都是以 Append模式 追加,不存在删除和修改。当然有得就有舍,这种结构虽然大大提升了数据的写入能力,却是以牺牲部分读取性能为代价,故此这种结构通常适合于写多读少的场景。故 LSM 被设计来提供比传统的 B+树 更好的写操作吞吐量,通过消去随机的本地更新操作来达到这个目标。这里面最典型的例子就是 Kakfa 了,把磁盘顺序写发挥到了极致,故而在大数据领域成为了互联网公司标配的分布式消息中间件组件。 虽然这种结构的写非常简单高效,但其缺点是对读取特别是随机读很不友好,这也是为什么日志通常用在下面的两种简单的场景: 数据是被整体访问的,大多数数据库的 WAL (write ahead log) 也称 预写log,包括 mysql 的 Binlog 等 数据是通过文件的偏移量offset访问的,比如 Kafka。 想要支持更复杂和高效的读取,比如按key查询和按range查询,就得需要做一步的设计,这也是LSM-Tree结构,除了利用磁盘顺序写之外,还划分了 内存+磁盘 多层的合并结构的原因,正是基于这种结构再加上不同的优化实现,才造就了在这之上的各种独具特点的 NoSQL 数据库,如 Hbase,Cassandra,Leveldb,RocksDB,MongoDB, TiDB 等。 ...

2012-03-22 · 3 min · 450 words · -

undefined reference to ...

undefined reference to … https://zhuanlan.zhihu.com/p/81681440 /usr/bin/ld: cannot find -lxxx 的解决办法 在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到库文件 libhdf5.so,若是其它库文件,则是 cannot find -lxxx 了,其中 xxx 是库文件的名字。 将库文件所在路径添加到gcc的搜索路径 使用以下命令查询gcc能否搜寻到指定的库文件: gcc -lgsasl –verbose 查询库文件 libhdf5.so 是否能在搜索路径中找到。 使用 /etc/ld.so.conf 配置文件 将库文件所在的路径加入到 /etc/ld.so.conf 尾部,并使之生效: $ sudo echo ‘/opt/biosoft/hdf5-1.8.15-patch1/lib/’ » /etc/ld.so.conf libhdf5.so 在路径 /opt/biosoft/hdf5-1.8.15-patch1/lib/ 下,将该路径加添加到配置文件中 $ sudo ldconfig 运行该命令,重新载入 /ext/ld.so.conf 中的路径,使修改生效。 ls -l /lib/x86_64-linux-gnu cat /etc/ld.so.conf include /etc/ld.so.conf.d/*.conf ls -l /lib/x86_64-linux-gnu

2012-03-22 · 1 min · 63 words · -

TLS, HTTPS

TLS, HTTPS 创建自签名TLS/SSL证书和私钥 https://www.ssldragon.com/zh/how-to/openssl/create-self-signed-certificate-openssl/ # 生成私钥 openssl genpkey -algorithm RSA -out private.key 自签名证书里的域名不能用 .dev 结尾, .dev 是 Google 持有的顶级域名, 不能用在自签名证书里 https://stackoverflow.com/questions/49503337/self-signed-dev-cert-untrusted-using-firefox-59-on-ubuntu https://blog.ideawand.com/2017/11/22/build-certificate-that-support-Subject-Alternative-Name-SAN/ https://www.mikesay.com/2018/12/30/create-self-signed-ssl/ 创建 CA 证书用的配置文件 ca.cnf https://www.mikesay.com/2018/12/30/create-self-signed-ssl/ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned-key.key -out selfsigned-certificate.crt openssl: 基本命令行工具,用来创建和管理OpenSSL证书,私钥和其它文件。 req: 子命令,主要是用来创建和处理PKCS#10格式的证书请求。它也能创建被用作根证书的自签名证书。 -x509: 这个选项告诉openssl创建一个自签名证书而不是一个证书请求。 -nodes: 这个选项告诉openssl不要加密私钥,否则当使用在Nginx上时,每次Nginx启动都要提示输入密码。 -days 365: 设置证书的有效期为1年(365天)。 -newkey rsa:2048: 这个选项告诉 openss l在生成证书的同时生成私钥。rsa:2048 说明创建一个 2048 比特长的 RSA 私钥。 -keyout: 告诉 openssl 生成的私钥的名字和路径。 -out: 告诉openssl生成的自签名证书和路径。 客户端安装自签名证书 # ubuntu # 将证书拷贝到目录 “/usr/local/share/ca-certificates” sudo cp selfsigned-certificate.crt /usr/local/share/ca-certificates # 更新CA存储 sudo update-ca-certificates # 删除sudo update-ca-certificates --fresh sudo rm /usr/local/share/ca-certificates/selfsigned-certificate.crt sudo update-ca-certificates --fresh SAN SAN, Subject Alternative Name(证书主体别名) 是 SSL 标准 x509 中定义的一个扩展。它允许一个证书支持多个不同的域名。通过使用 SAN 字段,可以在一个证书中指定多个 DNS 名称(域名)、 IP 地址或其他类型的标识符,这样证书就可以同时用于多个不同的服务或主机上。这种灵活性意味着企业不需要为每个域名单独购买和安装证书, 从而降低了成本和复杂性。 ...

2012-03-21 · 3 min · 517 words · -

content-type

content-type Content-Type 实体头部用于指示资源的 MIME 类型 media type Content-Type (内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件 Content-Type 标头告诉客户端实际返回的内容的内容类型。 语法格式: Content-Type: text/html; charset=utf-8 Content-Type: multipart/form-data; boundary=something charset 字符编码标准。 常见的媒体格式类型如下: text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式 image/gif :gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式 以application开头的媒体格式类型: application/xhtml+xml :XHTML格式 application/xml: XML数据格式 application/atom+xml :Atom XML聚合格式 application/json: JSON数据格式 application/pdf:pdf格式 application/msword : Word文档格式 application/octet-stream : 二进制流数据 (如常见的文件下载) application/x-www-form-urlencoded : <form encType=""> 中默认的encType,form 表单数据被编码为 key/value 格式发送到服务器 (表单默认的提交数据的格式) 另外一种常见的媒体格式是上传文件之时使用的: multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式 application/json: Official MIME type for json ...

2012-03-20 · 1 min · 84 words · -

git 团队协作, Github flow

git 团队协作, Github flow 团队协作中的 Github flow 工作流程 https://zhuanlan.zhihu.com/p/39148914 GitHub flow https://githubflow.github.io/ https://insights.thoughtworks.cn/real-agile-workflow-github-flow/

2012-03-20 · 1 min · 13 words · -

wifi

wifi Wi-Fi是一种允许电子设备连接到一个无线局域网 (WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段。 802.11a 5 GHz 1999 年发布。 各种调制类型的数据传输率:6、9、12、18、24、36、48 和 54 Mbps。 带 52 个子载波频道的正交频分复用 (OFDM)技术。 不需要许可证的国家信息基础设施 (UNII)频道内的 12 个 5 GHz 互不重叠频带。 802.11b 2.4 GHz 传送速度为11Mbit/s IEEE802.11b的后继标准是IEEE802.11g; 在2.4-GHz-ISM频段共有14个频宽为22MHz的频道可供使用。 1999 年发布。 各种调制类型的数据传输率:1、2、5.5 和 11 Mbps 高速直接序列展频 (HR-DSSS)。 工业、科技和医疗 (ISM)领域内的三个 2.4 GHz 互不重叠频带。 802.11g 2.4GHz OFDM 原始传送速度为54Mbit/s,净传输速度约为24.7Mbit/s (跟802.11a相同)。 2003 年发布。 各种调制类型的数据传输率:6、9、12、18、24、36、48 和 54 Mbps;可以使用 DSSS 和 CCK 转换为 1、2、5.5 和 11 Mbps。 带 52 个子载波频道的正交频分复用 (OFDM)技术;使用 DSSS 和 CCK 向下兼容 802.11b。 工业、科技和医疗 (ISM)领域内的三个 2.4 GHz 互不重叠频带。 ...

2012-03-20 · 1 min · 186 words · -

Go context

Go context 什么是 context Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。 随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。 context.Context 类型的值可以协调多个 groutine 中的代码执行“取消”操作,并且可以存储键值对。最重要的是它是并发安全的。 与它协作的 API 都可以由外部控制执行“取消”操作,例如:取消一个 HTTP 请求的执行。 https://zhuanlan.zhihu.com/p/68792989 https://www.36kr.com/p/1721518997505

2012-03-19 · 1 min · 36 words · -

us, 用户故事

us, 用户故事 as a xxx, i would like to xxx so that xxx. As a “user”, I want to “do sth”, so that “sth” “user” - 就是我们抽象出来的persona (Definition refer to wiki http://en.wikipedia.org/wiki/Persona) “do sth” - 要实现的功能 最后so that后面的 “sth” - 价值 价值说起来很简单,也很容易理解,就是 实现这个story后对用户的价值所在。 可是再多问一个问题,为什么要有这个价值,为什么一定要写这个so that呢? 如果你的目的是想买一条裙子,20年前,唯一的就是去商场买,但是今天我们还可以选择网上购物。 这也就是说,对于同一个story,不同的技术背景,不同的地域,不同的时代都会有不同的实现,这就是so that存在的价值。

2012-03-19 · 1 min · 48 words · -

计算器 bc, expr、dc、echo、awk)

计算器 bc, expr、dc、echo、awk) Linux下的计算器 bc, expr、dc、echo、awk) bc # install bc sudo pacman -S bc # 将16进制的A7输出为10进制, 注意,英文只能大写 echo "ibase=16;A7" |bc bc在默认的情况下是个交互式的指 令。在bc工作环境下,可以使用以下计算符号: + 加法 – 减法 * 乘法 / 除法 ^ 指数 % 余数 示例: bc #bc 1.07.1 #Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. #This is free software with ABSOLUTELY NO WARRANTY. #For details type `warranty'. 2.7*8 # 21.6 3+6 <=加法 4+2_3 <=加法、乘法 (4+2)_3 <=加法、乘法 (优先) 4_6/8 <=乘法、除法 10^3 <=指数 1000 18%5 <=余数 3+4;5_2;5^2;18/4 <=一行输入多个计算,用;相隔。 quit <=退出 bc scale=3 <=设小数位 1/3 .333 quit 以上是交互的计算,那到也可以不进行交互而直接计算出结果。 ...

2012-03-18 · 2 min · 411 words · -

pathmunge

pathmunge pathmunge是linux系统redhat系列版本系统变量/etc/profile中的函数,如果想要把某个二进制程序可以在所有的shell不用全路径运行,就需要将其所在的目录放在profile中,用过的命令正是pathmunge (目录命) pathmunge{ if ! echo $PATH | /bin/egrep -q “(^|:)$1($|:)";then if["$2”=“after”];then PATH=$PATH:$1 else PATH=$1:$PATH fi fi export PATH } pathmunge大致的作用是: 判断当前系统的PATH中是否有该命令的目录,如果没有,则判断是要将该目录放于PATH之前还是之后 echo “PATH” 输出PATH变量的内容以供egrep查询, grep是利用正则表达式来搜索文本的工具,egrep用的是扩展的正则表达式 -q:do not write anything to the standart output “(^|:)$1($|:)“为要搜索的文本,()和|都是扩展的正则表达式,()查找组,|用或的方式查找字符串,^和$是基础的正则表达式,表示待查找的字符串在开头或结尾,&1是命令所在的目录,整个表达式的意思就是在PATH开头或以: 开头,末尾是文本的末尾或以: 为末尾的该目录 !表示查找的字符串不在PATH中 下来两个if很好理解,如果你想把该目录放于整个PATH变量的后边,pathmunge (目录名) after 则PATH=$PATH:$1,否则PATH=$1:PATH export 将新设置的变量输出,使其在当前的shell和以后的shell中都生效

2012-03-15 · 1 min · 45 words · -

linux distribution, 发行版

linux distribution, 发行版 Archlinux Gentoo Alpine Ubuntu Centos Fedora Debian Redhat

2012-03-14 · 1 min · 11 words · -

PuTTY, SecureCRT

PuTTY SecureCRT 在命令行启动 SecureCRT 的时候指定配置文件目录 # SecureCRT /F folder SecureCRT /F C:\workspace\conf\securecrt 命令行直接连接某一个 ssh 服务 SecureCRT.exe /SSH2 /L wiloon /P 22 /PASSWORD password0 192.168.50.80 端口转发 File> Connection> 选择一个连接> Properties Name: foo Local Manually select IP address on which to allow connections (checked) IP address: 127.0.0.1 Port: 32178 Remote Destination host is different from the SSH server(checked) Hostname: 192.168.1.111 Port: 32178 从 windows 访问 linux,除了 samba 之外,日常操作用得最多的大概就是 PuTTY 和 SecureCRT Putty是免费的,SecureCRT是收费的 Putty缺省配置就很好看很好用,SecureCRT的缺省配置不是为linux准备的而且很难看。 ...

2012-03-14 · 1 min · 80 words · -

RedHat Enterprise Linux 网络配置

RedHat Enterprise Linux 网络配置 一、$/sbin/ifconfig //显示ifconfig命令查看网络接口的信息 #ifconfig eth0 //显示指定接口的信息 #ifconfig -a //显示所有接口的信息 (无论是否活跃) #ifconfig eth0 192.168.0.2 netmask 255.255.255.0 //临时修改接口IP地址 (无需重启接口) 二、$/sbin/route //显示当前Linux主机中的路由表信息 #route del default gw 192.168.0.1 //临时删除默认网关192.168.0.1 #route add default gw 192.168.0.1 //临时添加默认网关192.168.0.1 #route add -net 192.168.1.0/24 gw 192.168.0.254 //临时添加一条静态路由 /*本文中提及临时操作的地方,即主机重启后该操作将失效,如果希望每次系统重启后自动添加静态路由条目,则可以将该语句写入/etc/rc.d/rc.local中。*/ 三、#ping //测试与其他主机的网络连接 #ping -c 4 192.168.0.1 //指定发出ICMP包个数 四、#traceroute //测试当前主机到目的著急的网络连接 五、#hostname //查看当前主机的主机名 #hostname linsrv //临时修改当前主机名 六、#nslookup //测试DNS域名解析 server //显示当前DNS服务器 server 192.168.0.1 //临时指定DNS服务器地址 七、#dhclient //为当前主机申请网络配置信息 八、#netconfig //通过向导在字符界面下修改网络配置信息 九、#/etc/init.d/network restart //重启网络服务 ...

2012-03-13 · 1 min · 168 words · -