1、安装Python
2、安装插件
python -m pip install ipython python -m pip install notebook
3、启动项目
cd PATH_TO_NOTEBOOK jupyter notebook
用浏览器访问后进行编辑即可
http://localhost:8888
Learn and share.
1、安装Python
2、安装插件
python -m pip install ipython python -m pip install notebook
3、启动项目
cd PATH_TO_NOTEBOOK jupyter notebook
用浏览器访问后进行编辑即可
http://localhost:8888
尤其是在有多版本Python共存的情况下,修改windows修改环境变量后,经常会导致pip无法启动的情况。
此时,不仅是pip,Python/Scripts目录下的所有脚本都无法启动,并会有如下错误:
Fatal error in launcher: Unable to create process using '"'
其根本原因,其实十分简单,pip无法找到python.exe可执行程序,你可以看pip的源码来确认这一点。
有几种方法可以解决这个问题:
1、环境变量法,更适合单Ptyhon环境
将python.exe路径,增加到PATH环境变量中即可解决问题
2、脚本启动法,适合多个Ptyhon环境
set PATH=PATH_TO_PYTHON\;PATH_TO_PYTHON\Scripts;%PATH% python -m pip install XXX
3、用1或2,更新pip,可以解决问题(对单Python环境更适用)
python -m pip install --upgrade pip
4、修改pip二进制文件
用十六进制编辑工具打开pip.exe
修改python.exe路径
保存
5、用PE编辑器修改pip二进制文件
同方法4
6、解压
用解压工具解压pip,
得到__main__.py
重命名为pip.py
运行
python pip.py install XXX
智能指针其实并不是指针,而是一个特殊对象。
在智能指针对象生命期即将结束时,它会调用析构函数释放有它管理的堆内存。
访问智能指针管理对象的方法,使用操作符“->”(重载)。
访问智能指针本来的方法,使用操作符“.”。
我们常见的智能指针有以下几种:
C98 std::auto_ptr 第一代智能指针,有些操作比如“=”坑比较多,不推荐使用。 C11 std::unique_ptr 独占对象,并保证指针所指对象生命周期与其一致。 std::shared_ptr 可共享指针对象,可以赋值给shared_ptr或weak_ptr。 通过引用计数的方式控制生命周期,当指针所指对象的所有的shared_ptr生命周期结束时(引用计数为0时)会被销毁。 std::weak_ptr 可以指向shared_ptr,但并不影响引用计数。 不影像所指对象的生命周期,在引用所指对象时,先用需要lock()才能使用。 Boost 不共享对象,类似于std::unique_ptr boost::scoped_ptr boost::scoped_array 共享对象,类似于std::shared_ptr boost::shared_ptr boost::shared_array 共享对象,但不改变对象引用计数,类似于std::weak_ptr boost::weak_ptr 侵入式引用计数,要求使用对象自己实现计数功能 boost::intrusive_ptr
下面给一个例子,说明一下std下的四种智能指针。
1、SmartPointerTest.cpp
#include <memory>
#include <iostream>
#include "MyTest.h"
using namespace std;
void test_auto_ptr()
{
std::auto_ptr<MyTest> auto_ptr_01(new MyTest("tom", 20));
if (auto_ptr_01.get())
{
auto_ptr_01->sayHello();
auto_ptr_01.get()->_name = "jerry";
auto_ptr_01->sayHello();
(*auto_ptr_01)._age += 1;
auto_ptr_01->sayHello();
}
//auto_ptr_02会抢占auto_ptr_01的对象
//此后auto_ptr_01不指向MyTest对象
std::auto_ptr<MyTest> auto_ptr_02 = auto_ptr_01;
if (auto_ptr_01.get())
{
cout << "auto_ptr_01 is released" << endl;
}
auto_ptr_02->sayHello();
//只是释放所有权,并不释放内存
//MyTest* test = auto_ptr_02.release();
//释放内存
auto_ptr_02.reset();
if (!auto_ptr_01.get())
{
cout <<"auto_ptr_02 is released"<< endl;
}
}
void test_unique_ptr()
{
//独占对象
//保证指针所指对象生命周期与其一致
unique_ptr<MyTest> unique_ptr_01(new MyTest("tom", 20));
unique_ptr_01->sayHello();
//不允许直接做右值
//unique_ptr<int> unique_ptr_02 = unique_ptr_01;
//需要通过move来处理
unique_ptr<MyTest> unique_ptr_03 = move(unique_ptr_01);
if (!unique_ptr_01)cout << "unique_ptr_01 is empty" << endl;
unique_ptr_03->sayHello();
//释放指针
unique_ptr_03.reset();
if (!unique_ptr_03)cout << "unique_ptr_03 is empty" << endl;
}
void test_shared_ptr()
{
shared_ptr<MyTest> shared_ptr_01(make_shared<MyTest>("tom", 20));
shared_ptr<MyTest> shared_ptr_02 = shared_ptr_01;
shared_ptr_01->sayHello();
shared_ptr_02->sayHello();
shared_ptr_01.reset();
if (!shared_ptr_01)cout << "shared_ptr_01 is empty" << endl;
shared_ptr_02->sayHello();
shared_ptr_02.reset();
if (!shared_ptr_02)cout << "shared_ptr_02 is empty" << endl;
}
void test_weak_ptr()
{
shared_ptr<MyTest> shared_ptr_01(make_shared<MyTest>("tom", 20));
weak_ptr<MyTest> weak_ptr_01 = shared_ptr_01;
shared_ptr_01->sayHello();
weak_ptr_01.lock()->sayHello();
weak_ptr_01.reset();
if (!weak_ptr_01.lock())cout << "weak_ptr_01 is empty" << endl;
shared_ptr_01->sayHello();
weak_ptr<MyTest> weak_ptr_02 = shared_ptr_01;
weak_ptr<MyTest> weak_ptr_03 = weak_ptr_02;
if(weak_ptr_01.lock())weak_ptr_02.lock()->sayHello();
shared_ptr_01.reset();
if (!weak_ptr_01.lock())cout << "weak_ptr_02 is empty" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
test_auto_ptr();
test_unique_ptr();
test_shared_ptr();
test_weak_ptr();
return 0;
}
2、MyTest.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class MyTest
{
public:
MyTest(string name, int age);
~MyTest();
void sayHello();
public:
string _name;
int _age;
};
3、MyTest.cpp
#include "stdafx.h"
#include "MyTest.h"
MyTest::MyTest(string name, int age)
{
_name = name;
_age = age;
}
MyTest::~MyTest()
{
}
void MyTest::sayHello()
{
cout << "Hello " << _name<< "! You are "<< _age <<" years old." << endl;
}
PS:
聪明的你有没有发下,CPP的智能指针,与JVM内存中的四种引用方式,强引用、软引用、弱引用,虚引用,有很多相似的地方呢?
1、后台运行命令
somecmd &amp; nohup somecmd &amp;
2、查看当前后台运行的命令
jobs -l # 展示当前终端的后台任务,+号表示当前任务,-号表示后一个任务。 ps -aux | grep somecmd # a:显示所有程序,u:以用户为主的格式来显示,x:显示所有程序,不以终端机来区分
3、关闭当前后台运行的命令
# 通过jobs命令查看jobnum,然后执行 kill %jobnum # 通过ps命令查看进程号PID,然后执行 kill %PID
4、前后台进程的切换与控制
#后台切换至前台 #fg命令:将后台中的命令调至前台继续运行 fg %jobnum #前台切换至后台 #快捷键,将一个正在前台执行的命令放到后台,并且处于暂停状态 #[ctrl]+ z #bg命令:将一个在后台暂停的命令,变成在后台继续执行 bg %jobnum
5、后台服务状态
service --status-all
1、查找大于500M的文件
find . -type f -size +500M -print0 | xargs -0 ls -l find . -type f -size +500M -print0 | xargs -0 du -h
2、统计文件个数
#统计文件夹下文件个数,包括子文件夹中的文件 ls -lR | grep "^-"| wc -l #统计文件夹下文件夹个数,包括子文件夹中的文件夹 ls -lR | grep "^d"| wc -l
3、删除文件夹
find . -name __MACOSX | xargs rm -rf
#方法一 ssh -N -f -p 22 -D 9527 userid@ip #方法二 ssh -N -f -p 22 -D 9527 -l userid ip
1、安装
# npm install gitbook # npm install ebook-convert npm install gitbook-cli -g gitbook install
2、设置国内源
npm config set registry https://registry.npmjs.org/ npm config set registry https://registry.npm.taobao.org
3、增加转PDF支持
# windows https://calibre-ebook.com/download_windows64 #linux sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin sudo apt-get install libfontconfig1 libxcomposite1 libxdamage1 libxfixes3 libgl1 #linux字体安装 #将需要的字体拷贝到这个文件夹 #/usr/share/fonts/truetype/winfonts #刷新 sudo fc-cache -fv #确保ubuntu认到字体 fc-list :lang=zh-cn
4、基本操作
# 新建一本书的目录结构 gitbook init # 开启网站查看书的内容 gitbook serve . # 图书生成pdf gitbook pdf .
0.AWK常变量含义
| 常变量名 | 含义 |
| ARGC | 命令行变元个数 |
| ARGV | 命令行变元数组 |
| FILENAME | 当前输入文件名 |
| FNR | 当前文件中的记录号 |
| FS | 输入域分隔符,默认为一个空格 |
| RS | 输入记录分隔符 |
| NF | 当前记录里域个数 |
| NR | 到目前为止记录数 |
| OFS | 输出域分隔符 |
| ORS | 输出记录分隔符 |
1、统计文本中单词数量,并进行排序
grep -Eo "[a-z|A-Z]+" words.txt|awk '{word_cound[$1]++}END {for(aword in word_cound){print aword,word_cound[aword]|"sort -rn -k2"}}'
2、电话号码验证
规则:
A、(xxx) xxx-xxxx
B、xxx-xxx-xxxx
grep -Eo '^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}$' phonelist.txt
3、行列转换
awk '{for(i=0;++i<=NF;)t[i]=t[i]?t[i] FS $i:$i}END {for(i=0;i++<NF;)print t[i]}' transport.txt
4、输出第10行
awk 'NR==10{print}' tenth.txt
昨天,公司一位同事遇到了十分神奇的一件事情,就是ibaits在应该调用A类A1方法时,ibatis会调用到B类的B1方法。
几个人查了半天,没发现情况。
最后细心的小江同学发现,是有一个接口文件的声明,与映射文件中的参数类型不一致造成的。
好坑啊。。。
前两天公司一哥们遇到了这个问题,记录一下解决方法:
ASP.NET 2.0
方案一:将aspx文件中的page项添加ValidateRequest=”false”
<%@ Page ValidateRequest="false" Language="C#" AutoEventWireup="true" CodeFile="xxx.aspx.cs" Inherits="xxx.xxx" %>
方案二:修改web.config配置文件(全局有效,慎用)
<system.web>
<pages validateRequest="false"></pages>
</system.web>
ASP.NET 4.0
方案一:修改web.config配置文件(全局有效,慎用)
<system.web>
<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false"></pages>
</system.web>
ASP.NET MVC
方案一:修改web.config配置文件(全局有效,慎用)
修改web.config配置文件(全局有效,慎用)
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
然后修改控制器
[HttpPost]
[ValidateInput(false)]
public ActionResult XXX(xxx xxx)
{
}