豪翔天下

Change My World by Program

0%

这里介绍一下怎么用程序包里破解linux加密的 就写一个程序来实现如何暴力破解它。当然,这个程序的前提是你能够拿到对方的root权限并查看到/etc/shadow里面的内容,linux当然不会让你那么轻易地拿到的。所以这里只是出于兴趣破解一下本机上的密码而已。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#define _GNU_SOURCE  
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

char letter[37] = "abcdefghijklmnopqrstuvwxyz0123456789"; // 存放所有可能的字符,不包含特殊字符以及大小写
char result[10]; // 存放最终结果,假设不超过十个字符
int minlen = 1; // 密码的最小长度
int maxlen = 10; // 密码的最大长度

// 这是通过/etc/shadow所获取的加密后的文本
char *encrypted = "$6$jMzjGK/$0QVw8FM87jd3yF0wvzgXPPe1l3FOfrIA7LhGPIVCbum9es5 /tQsGMJqmaQ78IY.Hv4h6UWnvTs4cLntrPMSfM/";
char *salt = "$6$jMzjGK//$"; // 由上面的文本所得到的值,crypt函数的第二个参数

// 递归尝试
void try_next(int index, int length)
{
int i;
if(index == length)
return ; // 递归结束条件
for(i = 0; i< 36; i++) // 把当前位置的所有情况试完
{
result[index] = letter[i]; // 给当前位置赋值
memset(result + index +1, letter[0], length – index -1); // index之后,length之前的字符都用character[0]即a来代替
if(i != 0) // i=0的情况已经判断过了
{
printf("尝试:%s\n", result);
if(! strcmp(encrypted, crypt(result, salt)))
{
printf("发现密码:%s\n", result);
exit (0);
}
}
try_next(index + 1, length); // 递归替换下一个位置的字符,直到找到密码或者index==length为止
}
}

void try(int length, int begin, int end)
{
int i;
for(i = begin; i<= end; i++)
{
result[0] = letter[i]; // 这一步只确定第一个字符
memset(result + 1, letter[0], length-1); // 第一个字符后面length前面的字符就用character[0]即a来代替
printf("尝试:%s\n", result);
if(!strcmp(encrypted, crypt(result, salt))) // 如果这时候就能够匹配那么直接推出
{
printf("发现密码:%s\n", result);
exit (0);
}
try_next(1, length); // 递归尝试第一个字符之后的字符
}
}

int main()
{
int len;
for(len = minlen; len <= maxlen; len++){
printf("\n正在尝试长度为%d的密码\n", len);
memset(result, 0, 10); // 初始化result数组为全0,这里并不是指字符0
try(len, 0, 36);
}
return 0;
}

这是我第一次尝试暴力破解,虽然没有用多线程,但还是能明显感觉到其效率之低,以后得学学其他的方法。

系统环境: ubuntu 64位

Linux内核的安装主要有以下两种方式:

方法一、安装编译好的通用内核DEB包

通用内核DEB包包含了linux内核得三个核心文件:

linux-image: 内核核心文件
linux-headers: 内核头文件
linux-headers-generic: 内核通用头文件

ubuntu内核DEB包下载地址(带了rc的内核为非稳定版本),这是最简单且最通用的方法,因为不需要去配置任何东西,几条命令就让系统自己配置好了。我们需要下载的三个文件为(注意平台,通常是amd64,32位版本则使用i386):

把他们放到同一个文件夹,然后在该文件夹内执行下面命令进行安装:

1
2
sudo dpkg -i *.deb	# 安装DEB包
sudo update-grup # 刷新grub

方法二、下载内核源代码,按照个人需求编译安装

此方法较为复杂,而且可能会出现很多问题,但是对于想了解内核以及想提高性能的用户就非常适用了,因为普遍认为通过此方法可以精简内核,提高系统效率。

首先下载最新稳定版内核源代码,然后在该目录打开终端,执行如下命令进行接呀:

1
2
xz -kd 文件名
tar -xvf 文件名.tar

然后执行编译步骤,如果之前编译过需要重新编译,首先得清理一下:make mrproper

再执行命令make menuconfig在图形化界面配置各个选项。

都配置好过后,在终端以此执行如下命令(下面的命令参数重的-x表示设置的线程数,设置多线程可以加快编译速度,比如我是双核处理器那就选4线程,x为4):

1
2
3
4
5
6
7
make -jx 					# 编译内核  
make modules -jx # 编译内核模块
make headers -jx # 编译内核头文件
sudo make headers_install # 安装内核头文件
sudo make modules_install # 安装内核模块
sudo make install # 安装内核
sudo reboot # 重启以验证内核

TroubleShooting

执行make menuconfig的时候出现如下错误
1
2
3
4
5
6
7
8
*** Unable to find the ncurses libraries or the  
*** required header files.
*** ‘make menuconfig’ requires the ncurses libraries.
---
*** Install ncurses (ncurses-devel) and try again.
---
make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
make: *** [menuconfig] 错误 2

那么执行这条命令可以解决:sudo apt-get install libncurses5-dev

作者:卢思浩 一

从北京回家的动车上,偶然听到邻座的小姑娘边哭边打电话给家人,她说:“妈,对不起,本来说好了赚钱了才回家的……”她蜷坐在座位上,极力压制着自己的哭声,“但是我
尽力了,妈,我不后悔。”

联想起之前看到的一篇文章,有人说他始终不相信努力奋斗的意义。然而努力奋斗的意义,真的只是为了赚钱,或者为了社会所认可的成功吗?

我突然想起我日夜颠倒的那个死党,M。

有一天周末晚上,他发来自己的封面设计,还没等我给出评价,他又说:“不行,我还得再改改。”其实我觉得已经很好了,可是他总是不满意。第二天中午他把改好的设计给我
看了看,然后语音另一边的他突然叹了口气。

“你说,我们这样日夜颠倒,这么忙碌,到底是为了什么呢?”他问我。

那时我想起一句,便对他说:“归根结底,我们之所以漂泊异地辛苦奋斗,是因为我们愿意。我们这么努力,不过是为了给自己一个交代。”

就像那个跟我萍水相逢的姑娘打动我的那句话:“但是我尽力了,妈,我不后悔。”

不知道为什么最近出现了很多文章说不相信努力的意义。然而这对于我来说似乎从来不是一个问题,努力从来不等于成功,而成功也从来不是终极目标。那些终极的梦想,其实是
很难以实现的。但在你追逐梦想的时候,你会找到一个更好的自己,一个沉默、努力、充实、安静的你自己,你会因为自己所做的事情而觉得充实。

我始终相信努力奋斗的意义,因为那是本质问题。我朋友曾经问我:“如果有一天你发现梦想始终没有实现,你会不会觉得很可怕。”

我对他说:“没什么好可怕的。”

他看着我说:“即使那些努力都没有回报?”

我觉得努力就是努力的回报,付出就是付出的回报,写作就是写作的回报,画画就是画画的回报,唱歌就是唱歌的回报,一如我的死党所说,虽然每次觉得很累,但
当他看到自己的作品的时候,心里的兴奋和激动没有任何一样别的东西能够代替的了。

如果你的努力能让自己做自己喜欢的事情,那为什么要放弃努力呢?如果人能够做自己喜欢的事情,谁说这样不是一种回报呢?

我相信,任何人,不管他是个大人物还是小人物,只要做自己喜欢做的事情,他一定是开心的。只要为了自己想要做的事情努力,那一定会感到充实。相反,如果你的努力是为了
你不想要的东西,那你自然而然地会感到憋屈和不开心,进而怀疑努力的意义。

如果你的努力不是为了自己喜欢的,自己想要的,那么请停下来问问自己是不是太急躁了。

曾经在山区里看到过天真无邪的孩子们念书的情境,正如那些文章里所说,这些孩子也许将来只能接过父母的活,在山区里继续着他艰苦的人生。然而他们却比很多比他们家境好
的人快乐许多,因为对于他们来说,念书就是念书的回报。

一个在北京飘着的哥们曾跟我说,他也许这辈子也无法“逆袭”,也许那些高富帅们不需要怎么付出也能做出更好的成绩,但他还是决定继续漂泊,做一个奋斗的屌丝,他觉得这
样子值得,失败了也不会后悔,也算是给自己一个交代。

你说登山的人为什么要登山?是因为山在那里,是因为他们无法言说那难以满足的渴望。

为什么明知道梦想很难实现还是要去追逐?因为那是我们的渴望,因为我们不甘心,因为我们想要自己的生活能够多姿多彩,因为我们想要给自己一个交代,因为我们想要在我们
老去之后可以对孙辈说,你爷爷我曾经为了梦想义无反顾地努力过。

诚然,也许奋斗了一辈子的屌丝也只是个屌丝,也许咸鱼翻身了也还不过是一个翻了面的咸鱼,但至少他们有做梦的自尊,而不是丢下一句努力无用心安理得地生活下去。

你不应该担心你的生活即将结束,而应担心你的生活从未开始。

其实我在追逐梦想的时候,早就意识到那些梦想很有可能不会实现,可是我还是决定去追逐。失败没有什么可怕的,可怕的是从来没有努力过还怡然自得地安慰自己
,连一点点的懊悔都被麻木所掩盖下去。

不能怕,没什么比自己背叛自己更可怕。

九把刀在书里说过:“有些梦想,纵使永远也没办法实现,纵使光是连说出来都很奢侈。但如果没有说出来温暖自己一下,就无法获得前进的动力。

人为什么要背负感情?是因为只有在人们面对这些痛楚之后,才能变得强大,才能在面对那些无能为力的自然规律的时候,更好地安慰他人。

人为什么要背负梦想?是因为梦想这东西,即使你脆弱得随时会倒下,也没有人能夺走他。即使你真的是一条咸鱼,也没人能夺走你做梦的自由。

所有的辉煌和伟大,一定伴随着挫折和跌倒,所有的辉煌背后都是一座座苦逼的高墙。谁没有一个不安稳的青春?没有一件事情可以一下子把你打垮,也不会有一件事情可以让你
一步登天,慢慢走,慢慢看,生命是一个慢慢累积的过程。

有一个环卫工人,工作了几十年终于退休了,很多人觉得他活的很卑微,然而每天早起的他待人总是很温和,微笑示人,我觉得虽然他也许没能赚很多钱,但是他同样是伟大的。

活得充实比获得成功更重要,而这正是努力的意义。

我常说,你是一个什么样的人,就会听到什么样的歌,看到什么样的文,写出什么样的字,遇到什么样的人。你能听到治愈的歌,看到温暖的文,写着倔强的文,遇到正好的人,
你会相信那些温暖、信念、坚持这样子看起来老掉牙的字眼,是因为你就是这样子的人。

你相信梦想,梦想自然会相信你。千真万确。

然而感情和梦想都是冷暖自知的事儿,你想要跟别人描述吧,还真不一定能描述的好,说不定你的一番苦闷在别人眼里显得莫明其妙。喜欢人家的是你又不是别人,别人再怎么出
谋划策,最后决策的不还是你;你的梦想是你自己的又不是别人的,可能在你眼里看来意义重大,在他们眼里无聊的根本不值一提。

在很大的一部分时间里,你能依靠的只有你自己。所以,管他的呢,管别人怎么看,做自己想做的,努力到坚持不下去为止。

也许你想要的未来在他们眼里不值一提,也许你一直在跌倒然后告诉自己要爬起来,也许你已经很努力了可还是有人不满意,也许你的理想离你的距离从来没有拉近过,但请你继
续向前走,因为别人看不到你背后的努力和付出,你却始终看得见自己。

——摘自《读者》2014年第3期

(封面图来自Pixabay)

2013年最后一个月,六级终于考完了,仔细回想一下,大概是在2006年上初中后才开始学习英语的,至今已有八年多了。现在终于不用再上专门的英语课了,就写下这篇
博客纪念一下。

最开始的那位英语老师现在想来都很不爽,音标只上了一节课,之后就再也没有教过我们英语单词该怎么拼,而是完全教我们把单词的读音给背下来,之后很长一段时间都没能适
应过来。幸好后来换了老师才算对英语入门来了。那时候感觉学英语最重要的就是单词和语法,当然,这也是考试的需要。至于单词,我一直都是最懒的,几乎没怎么记,因为初
中所要求的词汇量确实很少,懂音标就会写单词了。而语法,当时还真的要记一下,多亏了我超强的做笔记能力,语法也比其它同学的好,记得上了高中后偶尔都还会拿出那本笔
记来看。

上了高中后,发现语法并没有那么重要了,因为英语也就那些个语法,什么从句、感叹句什么的,我现在只看得懂,却说不出他们的名字了。也就写作文时用得多点,by
the way,我高中的英语作文和语文作文水平都还是中等偏上的。高中强调的是语感和听力。额。。。我的语感可不强,只能拿着文章一句一句分析,听力我就不想提了,
完全是渣,三十分的听力一般就得一半,我四级听力居然可以得一百多分,奇迹呀!高中的英语老师喜欢让同学们主动去说英语,对于不喜欢表现的我,每次遇到这种情况都只能
在边上尴尬地走神。

大学的英语,怎么说呢,课堂上完全是要我们去说和听,我知道这种方式是很正确的教育方式,但是我可不想在课堂上说什么,这就导致了我极其讨厌上英语课。四级和六级虽然
我也花了很多功夫,但是说实话,这两个考试只要多记点单词就行了,四级记了300多个单词,六级记了200多个单词,除去重复的最多不会超过500个单词,我很郁闷那
些成天抱着一本词汇表的人到底记住了多少,我只是用有道词典把那些常见但就是记不住的单词给记下来,要考试的时候,再拿出来看看而已。
八年了,学的真的不咋的,最近,我加入了伯乐在线的技术翻译小组(ID:haofly),偶尔为他们翻译一些技术文章。一方面我觉得作为一名程序员要有分享精神,把外
文翻译为中文可以让那些优秀文章得到更广泛的流传;另一方面,我也应该增强一些对英语的兴趣,不能像以前那样,碰到英语文章就退缩了!虽然我没打算以后出国或者跟外国
人打交道,但是看英语的文章还是得看的。而且才翻译两篇文章就发现了以前学习英语的大问题了。单词可以说个个都认识(当然,现在的翻译软件都能做到这一点),但就是有
些词汇以及句子连起来的时候不知道该怎么翻译才能通顺。

作为程序员我们可以不具备听说英语的能力,但必须要有看懂技术文章的能力。世界上绝大多数优秀技术文章都是用英语写的,这个观点应该没人会辩驳吧,谁让计算机这东西是
美国佬发明的呢!

In a word, 虽然我以后不会再上英语课了,但我不会放弃这个学了八年的工具的。

昨晚去学校外面买了两本书,一本《计算机网络》,一本《C和指针》,

分别是15元和19元。买的时候很是高兴,但买回来我就后悔了,不是因为质量差,而是因为内心感到的不安,经过一夜的辗转反侧,决定写下这篇文章,激励自己以后尽量买正版产品,无论是书籍、软件还是其它。

说实话,作为一个生活都还要向父母伸手的学生党,而且是在这个神奇的国度,要想完全支持正版是不可能的,毕竟,我又不是富二代。幸运的是,我们学校参与了微软的dreamspark计划,可以免费获得很多微软的正版软件,比如我现在所使用的windows 7操作系统和visiual studio 2013,当然,相比windows我更喜欢使用linux。在书籍方面我最喜欢的是在亚马逊购书,不仅全部是正版,而且价格相对其它网上书店便宜(这里就不提淘宝了),购物体验相当不错。

很多人觉得买盗版书籍无所谓,无非就是纸张差一点,内容都一样,凭什么正版就要贵那么多呢。而软件更甚,正版软件和盗版软件所有功能几乎都是一样的,甚至连md5都一样,只是他们习惯直接去百度一个激活码来使用。说到习惯,身边有好多人,无论要下载什么软件,都直接去百度搜索软件名 破解版,我只想说,亲,有些软件本来就是免费的。盗版指的是一种行为,而并不是指你得到的东西与原本的东西有什么不同,因为你没有遵守该软件的获取规则,所以你就是盗版,无论是用破解版,或是激活码,或是把禁止商用的拿来商用。其实,盗版最大的危害并不是拿到一本低等质量的书或是漏洞百出的软件,而是会让创作者们对知识产权的保护感到失望,渐渐地,他们就会以为自己创造出来的东西确实不值那个钱,那么自己以后是不是不用花那些精力去创作了呢。换句话说,盗版越多,我们以后看到好书用到好软件的机会就会越来越少。也有人说正版书的价格是虚高,我想反问的是,什么叫虚高?不说我国的正版书记相对于美国便宜了好多倍,而直接问你是否认为该书的分量配不上它的价格呢?如果是,那请远离那本书,真没必要看了。拿国情说话的人就更甚了,我们已经过了没盗版就活不下去的年代了,我们在腾飞,我们现在应该一步一步由made in chinacreated in chain前进。

我对知识产权的尊重主要来自于各大开源社区。开源是一种精神,我很高兴世界上有这样一群人,乐于把自己的东西奉献出来,大家一起学习。虽然开源不等于免费,商业软件不一定要收费。但是正是有了一个又一个开源的项目,才有现在强大的互联网。

支不支持正版仅是个人素质问题,法律目前还缺少很多管制。但是作为一个大学生,有必要为国家的未来做一些努力,为知识产权的保护做一些力所能及的事情。只要少吃一点零食,少喝一点酒,买正版书的钱,很容易就能节省出来的。

2011年 人生第一个Hello World,用C语言写的
2013年初开始学习C++,不过忙着过四级去了,所以一直到暑假才学完

2013年夏 python Delphi 汇编 Win32汇编

至今保存在电脑里的代码大约有2万多行

下面是几个Hello World!

C语言:或许大多数人的第一门编程语言都是C语言,面向过程的语言,是以后学习其它语言的基础,初学时我看的是谭浩强的书,很多人把他的书贬低得一无是处,但我觉得他
的书细节讲得好,更重要的是适合中国国情,也适合在中国环境下长大的孩子的思维习惯

C++:第一门面向对象的编程语言(好吧,虽然我还没对象),之所以现在不学习Java一是因为这学期没什么时间,二是因为不知道为什么就讨厌Java,就想讨厌做网
站一样,反正很多人都追的东西我就不喜欢,不过C++真的是一个无底洞啊,感觉永远也学不完

Python:一门面向对象的解释型语言,在某些方面也可以算是一门脚本语言,学这门语言主要是因为在编程社区看到的一句话“人生苦短,我用Python”,不知道是
哪位外国人说的了,原话应该是“Life is short, you need Python”,正在学,还没学完呢

Delphi(懒得拉窗口了,直接用Windows API):跟VB和VC是差不多的,都算是可视化编程环境,直接拉空间就可以做出软件了,它用的是Pascal语
言,不过由于其坚持收费的性质,越来越不如VB和VC普及了,其广告是“聪明的程序员用Delphi,真正的程序员用C++”,好吧

汇编(好久没写了):由于win7对masm支持不好,所以在winxp环境下写的,虽然上个月才学完,但这个月太忙了,几乎没写了,怎么说呢,学汇编至少现在我不能
那他来写什么程序,因为现在还没碰到系统底层的东西,能看到那些语句就行了

另外,给自己设计了一个logo(草帽+二进制,太有创意了):要给每一个奇迹打上我的logo


其实这些语言都只学了基础部分,还不会运用到实际中,不过今年是没时间了,明年再说吧,我知道,语言只是工具,代码只是途径,考试只是方法,真正要学到的是思维能力,
而这学期我明显感觉遇到很多问题思维跟不上了,所以去研究算法导论,这本全世界最权威的算法课程

这学期的主要目标是六级和静态破解,正在学习python、win32汇编和OD

无论怎样,坚持自己的忍道,Change my world by program!

Apache安装与配置

Apache 2.4与2.2配置上的区别见: Upgrading to 2.4 from 2.2

常用命令

1
2
3
4
5
6
7
httpd -v # 查看apache版本
apachectl start apache # 启动
apachectl stop # 停止
apachectl restart # 重启
apachectl graceful # 不中断当前连接重启服务器,类似于nginx -s reload
apachectl configtest # 验证配置文件语法是否正确,类似于nginx -t
apachectl fullstatus # 显示服务器完整的状态信息

配置指令

1
2
3
4
5
# Options指令
Options All # 默认开启所有的服务器特性
Options None # 不启用任何的服务器特性
Options FollowSymLinks # 允许在此目录中使用符号链接
Options Indexes # 如果输入的是一个目录,而且目录中没有DirectoryIndex指令,那么服务器会返回目录列表,这是非常危险的

添加Gzip压缩

  1. 首先,开启相关模块:

    1
    2
    LoadModule deflate_module modules/mod_deflate.so
    LoadModule headers_module modules/mod_headers.so
  2. 然后,在项目下的.htaccess下添加如下内容并重启即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
    AddOutputFilterByType DEFLATE text/*
    AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    </IfModule>

    # 如果需要json请求启用gzip,可以这样做
    <IfModule mod_deflate.c>
    <IfModule mod_filter.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
    AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/json
    </IfModule>
    </IfModule>

配置虚拟目录/设置二级域名

阅读全文 »

Linux手册

系统安装

CentOS版本说明

  • BinDVD: 最完整的版本,可以选择安装所有的软件
  • LiveDVD: 光盘安装版
  • LiveCD:比LiveDVD体积小而已
  • minimal: 精简版,连基本软件都没带,最好不要安装这个
  • netinstall: 网络安装版

基础安装

1
2
3
4
5
6
# CentOS
sudo yum install epel-release
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm # EC2的Centos7上执行这个才能使用安装EPEL

yum groupinstall "Development Tools" # 安装gcc等基本开发工具
## vim /etc/sysconfig/network-scripts/ifcfg-eth0把ONBOOT=no改成yes即可让网卡开机自动启动

命令行Tips

阅读全文 »

Python 包/pcakge排名: pypi.org那个搜索不知道结果是些啥玩意儿,最好在这里搜,前5000基本上都是主流的

安装方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# for CentOS
yum groupinstall -y 'development tools'
yum install -y zlib-dev openssl-devel sqlite-devel bzip2-devel xz-libs libffi-devel
# for Ubuntu
apt-get install -y build-essential libssl-dev libffi-dev
# for alpine
apk add --update alpine-sdk

# Linux下不区分64和32位
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
xz -d Python-3.7.0.tar.xz
tar -xvf Python-3.7.0.tar
cd Python-3.7.0
# for Linux
./configure && make && sudo make altinstall
# for Mac
./configure --enable-framework --with-openssl=/usr/local/opt/openssl # 不加openssl可能会出现the SSL module is not available的错误
cd

# 如果默认没有安装pip,那么可以这样安装
wget https://bootstrap.pypa.io/get-pip.py
python3.5 get-pip.py

# Python3.5版本默认有安装pip的,如果没有,那么就酱紫
wget https://bootstrap.pypa.io/get-pip.py
python3.3 get-pip.py

基本语法

阅读全文 »

PHP

  • 貌似基本上的语言都不会像PHP这样,每次一个HTTP请求过来都去重启初始化全部资源(重启整个框架),要解决这个问题,swoole是目前最可行的解决方案
  • PHP还有一种输出内容模式是直接echo或者直接重定向,在return之前就返回,有些古老的框架是这样的,需要特别注意
  • LEMP(Linux + Nginx + MySQL + PHP)环境安装

基本语法

  • 判断两个变量是否相等,如果=====都能用的情况,那么尽量用===,因为它仅检查闭合范围。

  • ??: null合并运算符。如果遍历那个存在且值不为NULL,就返回本身,否则返回它的第二个操作数。三元运算符可以这样用$a = $a ? : 1,表示如果为真则直接使用$a的值,7里面可以写成$a = $a ?? 1

    1
    2
    3
    $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
    $username = $_GET['user'] ?? 'nobody'; // 和上面语句等价
    $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; // 甚至可以连接多个
  • ??=(7.4): 运算符表示有key则赋值,例如$array['key'] ??= 1表示数组中有key这个key才会被赋值

  • compact函数,能够创建一个包含变量和它们的值的数组,例如

    1
    2
    3
    $a = 123;
    $b = 'abc';
    compact("a", "b"); // ['a' => 123, 'b' => 'abc']
阅读全文 »