学海无涯

被忽略的位运算符总结

曾经的我还是太年轻了, 基础不扎实还自以为是, 看到位运算符一节就以为是逻辑运算, 结果跳过没看了, 漏了很多知识. 果然 LeetCode 没白刷呀, 接下来是总结.

按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。

另,负数按补码形式参加按位与运算。

“与运算”的特殊用途:

  • 清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

  • 取一个数中指定位

方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

例:设X=10101110,取X的低4位,用 X & 0000 1111 = 00001110 即可得到; 还可用来取X的2、4、6位。

按位或运算符(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

即: 参加运算的两个对象只要有一个为1,其值为1。

例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。 

另,负数按补码形式参加按位或运算。

** “或运算”特殊作用: **

  • 常用来对一个数据的某些位置1。

方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。

例:将X=10100000的低4位置1 ,用X | 0000 1111 = 1010 1111即可得到。

Python中in的三种遍历协议

今天刷LeetCode碰到个简单题 宝石与石头想降一下时间复杂度,就没有用in list写法,直接又遍历了一遍列表,可没想到一看答案,这样做的用时比用in要慢得多。索性研究了一下in的原理。这里复制一下知乎用户(很抱歉, 这位同学账号似乎被封了,无法著名)的答案。

in 关键字实现了一套python中的遍历协议.

协议A: iter + next

循环时, 程序先使用__iter__ (相当于iter(instance))获取具有next方法的对象, 然后通过其返回的对象, 不断调用其next方法, 直到StopIteration错误抛出.

class A:
    def __iter__(self):
        self.limit = 4
        self.times = 0
        self.init = 1
        return self

    def next(self):
        if self.times >= self.limit:
            raise StopIteration()
        else:
            x = self.init
            self.times += 1
            self.init += 1
            return x

print 'A>>>>>>'
for x in A():
    print x

打印结果:

A>>>>>>
1
2
3
4

协议B: getitem + len

循环时, 程序先调用__len__ (相当于len(instance))方法获取长度, 然后循环使用 getitem(index) (相当于instance[index])获取元素, index in range(len(instance))

class B:

    def __init__(self):
        self._list = [5, 6, 7, 8]

    def __getitem__(self, slice):
        return self._list[slice]

    def __len__(self):
        return len(self._list)

print 'B>>>>>>'
for x in B():
    print x

打印结果:

从零开始学Laravel

Laravel5.5的安装

安装好WAMP环境后,在wampmanager.ini文件中将PHP版本更改为php7,查看php版本可以通过phpinfo()函数查看。 ,下载好后解压至Apache工作目录下。启动wamp服务后,正常情况下访问localhost/laravel/public就能显示Laravel的欢迎界面。

附上Laravel一键安装包 下载地址

PhpStrom安装

编程还是离不开JB全家桶的这步没有省略主要是因为jb全家桶更新3.4后大量激活方法和激活服务器集体失效。这里使用了ilanyu大佬提供的本地反向代理激活方法,或者自己手撸一个反代程序,不过比较麻烦的是每次打开IDE都需要进行授权认证,因此本地激活的IDE每次运行都需要启动一次反代程序,有条件最好挂在云服务器上。不过有条件还是要支持正版

Laravel教程使用碰到的一些坑

  • vagrant下composer create-project laravel/laravel Laravel --prefer-dist "5.5.*"报错, 解决方法:更换Composer国内镜像即可 composer config -g repo.packagist composer https://packagist.phpcomposer.com

Laravel的路由

Laravel5.5版本中把路由的routes文件拿出来单独建立了一个routes文件。这里感觉和django的urls.py文件很类似,也是起到了Controller的作用,值得一提的是必须制定http请求类型

路由选项

// 基础路由
Route::get('/', function () {
    return view('welcome');
});

Route::post('test', function(){
    return 'hello test';
});

//多请求路由
Route::match(['get', 'post'], 'test2', function(){
    return 'hello test2';
});

Route::any('test3', function (){
    return 'hello test3';
});

路由参数

这里虽然写起来比django的要复杂,但是个人感觉比urls.py中的逻辑要清楚。

//路由参数
Route::get('user/{id}', function ($id){
    return 'id '. $id;
});

Route::get('user/{name?}', function ($name = null){
    return 'name '. $name;
});

Route::get('user/{id}/{name?}', function ($id, $name){
    return 'id '. $id. ' '. 'name '. $name; 
})->where(['id' => '[0-9]+', 'name' => '[A-Za-z]+']);

路由命名

命名的好处是可以直接通过命名之后的路由进行重定向,带参数的路由可以指定初始值,相当于给这个url一个名字,可以直接使用route()生成对应的url。

PHP学习小知识点归纳

** Heredoc结构形式长字符串 ** 首先使用定界符表示字符串(«<),接着在“«<“之后提供一个标识符GOD,然后是字符串,最后以提供的这个标识符结束字符串。

<?php 
$string1 = <<<GOD
我有一只小毛驴,我从来也不骑。
有一天我心血来潮,骑着去赶集。
我手里拿着小皮鞭,我心里正得意。
不知怎么哗啦啦啦啦,我摔了一身泥.
GOD;

echo $string1;
?>

** 单双引号区别 ** 单引号串和双引号串在PHP中的处理是不相同的。双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。

$str='hello';
echo "str is $str"; //运行结果: str is hello
echo 'str is $str'; //运行结果: str is $str

** 资源类型 ** 这里和python比较类似,不过还是留档一下。

<?php 
//首先采用“fopen”函数打开文件,得到返回值的就是资源类型。
$file_handle = fopen("/data/webroot/resource/php/f.txt","r");
if ($file_handle){
    while (!feof($file_handle)) { //判断是否到最后一行
        $line = fgets($file_handle); //读取一行文本
        echo $line; //输出一行文本
        echo "<br />"; //换行
    }
}
fclose($file_handle);//关闭文件
?>

** 空类型 ** php空类型是NULL且对大小不敏感,python中为None对大小写敏感。

** 常量 ** php中有常量这个概念!这点比没有常量概念的python好多了啊。

<?php
define("PI",3.14);
$r=3;
echo "面积为:".(PI*$r*$r)."<br />";
echo "周长为:".(2*PI*$r)."<br />";
?>

判断常量是否被定义

小吐槽

哇,偷懒没弄https果然被流量劫持了,唉,只能开工加个https顺便优化一下因迁移产生的大量中文文章链接吧。

永久链接

此处使用hexo-abbrlink插件实现。附上官方使用文档

安装 npm install hexo-abbrlink --save 使用 打开config.yml,修改permalink中类似这样permalink: posts/:abbrlink/其中:abbrlink代表连接地址。

然后在所有文章加上abbrlink: 字段再部署后就会生成文章永久链接,方便SEO

为网站添加SSL证书

  • 在source目录下创建一个CNAME文件(没有md后缀),里面写入你的域名地址,不用带http/ https
  • TX云开启CDN服务并申请SSL证书,CDN设置将回源设置为https并设置强制跳转https

不过这里出现了一个小问题,就是不能直接用域名访问了很不爽,必须使用www.gvoidy.cn才能访问。之后再优化吧~

python实现单工、半双工、全双工聊天室

聊天室单工实现:

单工版非常简单,只能客户端单方面向服务端发消息,服务端回复固定模板消息。

Server:

# -*- coding: utf-8 -*-

import socket
import threading
import time

def tcplink(sock, addr):
    print 'Accept new connection from %s:%s...' % addr
    sock.send('Welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if data == 'exit' or not data:
            break
        sock.send('Hello, %s!' % data)
    sock.close()
    print 'Connection from %s:%s closed.' % addr

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
s.listen(5)
print 'Waiting for connection...'
while True:
    # 接受一个新连接:
    sock, addr = s.accept()
    # 创建新线程来处理TCP连接:
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

Client:

git的ssh key创建

Git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以要使用远程的git则需要ssh的配置。如果未配置ssh key将无法clone远程代码仓库到本地。

  • 第一步.创建user.name和email
git config --global user.name "EwdAger"
git config --global user.email "ewdager@hotmail.com"
  • 第二步.生成SSH密钥:
  1. 查看是否已经有了ssh密钥:cd ~/.ssh,Windows用户的路径在C:\Users\EwdAger\.ssh下 如果是刚安装git则不会有此文件夹,有则备份删除
  2. 生成ssh key sudo ssh-keygen -t rsa -C "ewdager@hotmail.com" 然后按三下回车 最后得到了两个文件:id_rsa和id_rsa.pub
  3. 在github上添加ssh密钥,这要添加的是“id_rsa.pub”里面的公钥 用编辑器打开id_rsa.pub复制全部内容到github的settings的SSH and GPG keys设置中,title取个好记的名字就行。
  4. 然后就能使用clone了

Django模型的Field Types总结

** Field Types ** 常用参数: ** null ** 如果设置为 True , Django 存放一个 NULL 到数据库字段。默认为 False。 ** blank ** 如果设置为 True , 此 field 允许为 blank (空白),默认为 False。 ** choices ** 一个2元元组的元组或者列表,如果执行 choices , Django 的 admin 就会使用 选择框而不是标准的 text 框填写这个 field。

YEAR_IN_SCHOOL_CHOICES = (
    (u'FR', u'Freshman'),
    (u'SO', u'Sophomore'),
    (u'JR', u'Junior'),
    (u'SR', u'Senior'),
    (u'GR', u'Graduate'),
)

2元元组的第一个元素是要存入 database 的数据,第二个元素是 admin 的界面 显示的数据。  使用了 choices 参数的 field 在其 model 示例里,可以用 “get_field的名 字_display” 方法 显示 choices 的显示字串(就是2元元组的第二个数据)。示 例:

(转)解决强智教务系统非IE下无法创建对象错误

** 最近要弄教务网的模拟登陆,但苦于教务网只兼容IE8以下的浏览器,不能用chrome强大的F12抓包就很烦,然后发现Fly俊大佬弄了一个相当强的插件啊。但是怕Fly俊大佬的博客失效,所以私自留了个档。侵删啊大佬~ **

*** 以下内容均为转载 ***

学校教务系统由于长期缺乏必要的维护,目前依旧只兼容IE8及以下浏览器。使用非IE浏览器访问登陆界面是没有问题,但是登录进去后就会报错,并且所有功能都无法使用。这对于使用非IE浏览器的用户简直就是噩梦,特别对于非Windows用户,以下是简单的解决办法

学长的修复

一位高能的学长在无法忍受这个问题后,进行了部分修复每次使用非IE浏览器访问后,替换一个JS文件为学长修改后的文件就可以正常使用了但是这个学长修复的结果又产生了一些新问题 无法创建对象问题解决了,但是又产生了新问题,所有的内容都重复了两遍 替换JS文件对小白用户来说是个难点

新的解决办法

经过查找、调试,终于是找到了内容重复的原因,内容是不再重复了然而怎么让普通用户也能替换JS文件呢感觉最好的办法还是写个浏览器插件,自动替换JS,不过需要注意以下几个问题。 插件只针对Chrome浏览器编写,不过360浏览器等使用Chrome内核的浏览器可能能够使用,不过未测试。

由于教务网浏览器兼容问题众多,所以此插件并不能完美修复所有问题。

插件使用教程

插件原地址» 度盘密码udn8»

在谷歌浏览器中打开 chrome://extensions/

将下载好的插件拖放 至上一步骤打开的 插件管理页面,然后会弹出如下窗口,点击添加即可

然后就可以开开心心的打开教务网了

ASF

linux环境下使用mono运行asf挂卡

杰瑞包大好评啊,但是带来的后果就是挂卡挂不完了。然而手里的服务器全是linux环境的并不支持C#写的ASF,所以用mono f**k之。

Ubuntu篇

接下来介绍如何安装mono,以Ubuntu 14.04为例。

1. 运行下面代码授权注册repo源并更新软件列表:

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF  
$ echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list  
$ sudo apt-get update  

2. 安装mono

$ sudo apt-get install mono-complete  

3. 测试mono是否安装成功

mono -V  //如果没有提示错误就可以啦

3. 运行asf 首先通过ftp工具将配置好的asf传到服务器上。然后新建一个窗口 screen -S ASF,最后进入asf的目录再运行asf就行啦~

cd /opt/ASF
mono ASF.exe

CentOS篇

这里转一个教程,当做留档了。 1. 添加yum源

rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"    
yum-config-manager --add-repo http://download.mono-project.com/repo/centos/

2. 有可能提示找不到yum-config-manager,这个是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-utils安装。

3. 安装mono

yum -y install mono-complete

4. 以下参照上面的3步以后

PS:关于“最小化Screen”,因为开启了screen后就不能进行其他操作了,我们的服务器当然不只是为了挂卡而存在的,所以可以通过按住Ctrl+A+D“最小化”screen窗口。