分类归档

Docker教程

FWQ
Docker教程
如何编辑.mo的文件
我来了,我本想做个教程呢,那就借宝地说一下,我是在手机上直接汉化的,手机上安装gettext就好了,然后用leafpad打开翻译就好了,哎呀 ,都加上了那我就完善一下,,手机安装命令:   root apt-get install gettext 就好了,安装好后找一个mo文件,把mo文件放到MyDocs下后, root cd /home/user/MyDocs msgunfmt 文件名.mo -o 文件名.po     //(转换成po) 在用leafpad打开po文件汉化即可,要汉化msgstr后面引号里面的,不要动引号,也可用Vi(千万不要用只带的修改,那货改什么都不行滴)。 汉化好后打开XT输入: root cd /home/user/MyDocs msgfmt 文件名.po -o 文件名.mo        //(转换成mo) 在把mo文件放到手机相应的地方就好了。
2024-11-18 阅读全文 →
FWQ
Docker教程
Go中import 导入包的语法
一、包的导入语法 在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:   import(     "fmt" ) 然后在代码里面可以通过如下的方式调用 fmt.Println("hello world") 上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 相对路径    import   “./model”  //当前文件同一目录的model目录,但是不建议这种方式import 绝对路径    import   “shorturl/model”  //加载GOPATH/src/shorturl/model模块 上面展示了一些import常用的几种方式,但是还有一些特殊的import,让很多新手很费解,下面是三种导入包的使用方法。 1、点操作   有时候会看到如下的方式导入包     import( . “fmt” ) ,这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”) …
2024-11-18 阅读全文 →
FWQ
Docker教程
Go中结构体 struct 中的方法
今天在看到 struct 章节,其中提及到了方法,先看下Go中的方法定义语法:   一般形式: func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... } 如果方法不需要使用 recv 的值,可以用 _ 替换它,比如: func (_ receiver_type) methodName(parameter_list) (return_value_list) { ... } 一、方法的接受者类型(receiver_type) 方法的接受者类型几乎可以是任何类型。Go中的类型参考:Go新手需注意的知识点(一) 下面举例说明:…
2024-11-18 阅读全文 →
FWQ
Docker教程
CGI、FastCGI、PHP-CGI、PHP-FPM的联系与区别
什么是CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。   什么是FastCGI FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。 FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over(失效转移)特性等等。 FastCGI与CGI特点 如CGI,FastCGI也具有语言无关性. 如CGI, FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境。(APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器; 恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。) FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的。 如CGI,FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。 FastCGI的工作原理 Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)…
2024-11-18 阅读全文 →
FWQ
Docker教程
php-fpm的配置与应用指南
一、什么是php-fpm PHP-FPM  全程是 FastCGI Process Manager (FastCGI进程管理器),对于PHP 5.3.3之前的php来说,是一个补丁包 ,旨在将FastCGI进程管理整合进PHP包中。如果你使用的是PHP5.3.3之前的PHP的话,就必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。   从PHP 5.4 RC2开始,php-fpm已经转正了,不再被php团队标注为EXPERIMENTAL(实验性的东西)集成到php的发行版本中 。 相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。 参考文章:CGI、FastCGI、PHP-CGI、PHP-FPM的联系与区别 二、fpm工作流程 fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。启动fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由 listen.backlog 配置。 三、php-fpm配置 注意:本人安装php7的目录是/usr/local/php7 pid = run/php-fpm.pid 默认是目录前缀 /usr/local/php7/var,例如:pid…
2024-11-18 阅读全文 →
FWQ
Docker教程
CGI、FastCGI和PHP-FPM关系图解
  当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了. CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。 FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。 PHP-CGI:是 PHP (Web Application)对 Web…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go新手需注意的知识点(三)
学习Go的一些需要注意的知识点。   十、出于性能考虑的最佳实践和建议 1、尽可能的使用:=去初始化声明一个变量(在函数内部); 2、尽可能的使用字符代替字符串; 3、尽可能的使用切片代替数组; 4、尽可能的使用数组和切片代替映射; 5、如果只想获取切片中某项值,不需要值的索引,尽可能的使用for range去遍历切片,这比必须查询切片中的每个元素要快一些; 6、当数组元素是稀疏的(例如有很多0值或者空值nil),使用映射会降低内存消耗; 7、初始化映射时指定其容量; 8、当定义一个方法时,使用指针类型作为方法的接受者; 9、在代码中使用常量或者标志提取常量的值; 10、尽可能在需要分配大量内存时使用缓存; 11、使用缓存模板。
2024-11-18 阅读全文 →
FWQ
Docker教程
Go值得学习的开源项目
谷歌官方维护了一个基于go语言的开源项目列表:https://github.com/golang/go/wiki/Projects,其中有非常多的优秀项目值得学习,有几百行代码适合新手阅读的项目,也有大型如nsq、docker等的项目。   下面推荐几款适合学习的项目: 1、cache2go https://github.com/muesli/cache2go 比较简单的一个缓存库,代码量很少,适合新手学习,可以学习到锁、goroutines等。 2、groupcache https://github.com/golang/groupcache 与memcached同一作者,相当于是memcached的go语言实现。 3、nsq https://github.com/bitly/nsq 消息分发平台,阅读代码可以了解到很多分布式、负载均衡等方面的编程。 4、docker https://github.com/docker/docker 时下很火的项目,个人感觉适合应用,不适合入门阅读学习,待成为了高手后可以研究下其实现。
2024-11-18 阅读全文 →
FWQ
Docker教程
编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
最近在研究Python和Erlang。反复提到动态类型语言、动态语言、解释型语言这些概念。这些概念很生涩,在这里做一个总结。   编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。 代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift 2、解释型语言 解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。 优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。 缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。 代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby 3、混合型语言 既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。 Java先生成字节码再在Java虚拟机中解释执行。 严格来说混合型语言属于解释型语言。C#更接近编译型语言。 动态语言和静态语言 1、动态语言 是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。 主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。 2、静态语言 与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。 3、注意: 很多人认为解释型语言都是动态语言,这个观点是错的!Java是解释型语言但是不是动态语言,Java不能在运行的时候改变自己结构。反之成立吗?动态语言都是解释型语言。也是错的!Object-C是编译型语言,但是他是动态语言。得益于特有的run time机制(准确说run time不是语法特性是运行时环境,这里不展开)OC代码是可以在运行的时候插入、替换方法的。 C#也是动态语言,通过C#的反射机制可以动态的插入一段代码执行。所以我说C#是这个星球最好的编程语言。…
2024-11-18 阅读全文 →
FWQ
Docker教程
GO中的互斥锁与读写锁
在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都是非常常用和重要的。   一、互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类型代表。sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开方法——Lock和Unlock。顾名思义,前者被用于锁定当前的互斥量,而后者则被用来对当前的互斥量进行解锁。 类型sync.Mutex的零值表示了未被锁定的互斥量。也就是说,它是一个开箱即用的工具。我们只需对它进行简单声明就可以正常使用了,就像这样: var mutex sync.Mutex mutex.Lock() 在我们使用其他编程语言(比如C或Java)的锁类工具的时候,可能会犯的一个低级错误就是忘记及时解开已被锁住的锁,从而导致诸如流程执行异常、线程执行停滞甚至程序死锁等等一系列问题的发生。然而,在Go语言中,这个低级错误的发生几率极低。其主要原因是有defer语句的存在。 我们一般会在锁定互斥锁之后紧接着就用defer语句来保证该互斥锁的及时解锁。请看下面这个函数: var mutex sync.Mutex func write() { mutex.Lock() defer mutex.Unlock() // 省略若干条语句 } 函数write中的这条defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。这省去了我们在所有return语句之前以及异常发生之时重复的附加解锁操作的工作。在函数的内部执行流程相对复杂的情况下,这个工作量是不容忽视的,并且极易出现遗漏和导致错误。所以,这里的defer语句总是必要的。在Go语言中,这是很重要的一个惯用法。我们应该养成这种良好的习惯。 对于同一个互斥锁的锁定操作和解锁操作总是应该成对的出现。如果我们锁定了一个已被锁定的互斥锁,那么进行重复锁定操作的Goroutine将会被阻塞,直到该互斥锁回到解锁状态。请看下面的示例: func repeatedlyLock() {…
2024-11-18 阅读全文 →