东东东 陈煜东的博客

月份存档: 三月 2014

我常用的电脑设置和程序

有时候会重装系统,记录一下常用的程序,将来方便查找

程序

必备

编程相关

一些软件

  • 办公:Office、Visio、Adobe Acrobat 9.0
  • 图像:PhotoShop、Snagit
  • 思维导图:Mindjet、FreeMind
  • 代理:BitviseSSH、myentunnel
  • 端口转发:PassPort

配置

  • 关闭Windows无用的安全系统、自动更新等服务
  • 虚拟内存放置到其他盘
  • 将sublime添加到右键菜单
  • 开发规范
    git关闭autocrlf,git config --global core.autocrlf false
    所有编辑器使用Unix换行符
    设置使用空格代替tab键

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 我常用的电脑设置和程序 – https://www.chenyudong.com/archives/my-favorite-setting-and-programs.html

分类: Programming

Squid为http代理设置密码权限

touch /etc/squid/squid_passwd
chmod o+r /etc/squid/squid_passwd

#添加用户名和密码
htpasswd -cb /etc/squid/squid_passwd username password  

注意htpasswd是Apache Httpd中的一个应用,我在安装Squid后,发现这个就已经有了。如果没有这个程序的话,需要安装httpd服务器。

yum install httpd
apt-get install apache2

接下来修改squid的配置文件,/etc/squid/squid.conf

在文件的最上方添加下面的配置(总之在acl和http_access之前),我的ncsa_auth是在lib64下的,我是64位的操作系统

auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/squid_passwd

以前这个放在中间的时候,我这里出现了下面的问题:

Can’t use proxy auth because no authentication schemes are fully configured.

在acl那里配置里最后一行加入

acl ncsa_users proxy_auth REQUIRED

在http_access那里最上一行加入

http_access allow ncsa_users

重新启动

/etc/init.d/squid restart
chkconfig squid on  #开机自动启动,自己选择安装

附送一个代理检测网站,如果是高度的匿名代码是不会被检测出来的http://www.iprivacytools.com/proxy-checker-anonymity-test/

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Squid为http代理设置密码权限 – https://www.chenyudong.com/archives/squid-http-proxy-set-password.html

分类: 网络

chrome修复css属性position fixed抖动

我现在使用的浏览器是Chrome版本 32.0.1664.3 m Aura,发现该版本的Chrome每次打开页面滚动页面对于position:fixed的元素会抖动,然而在重新应用position:fixed,抖动就不存在了,或者F5刷新页面后也不会抖动。

抖动的情况

我的测试代码

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title></title>
  
<style type='text/css'>
.fixbutton{
    position: fixed;
    padding: 1em;
    border: 1px solid #C8C8C8;
    background: #FF4F4F;
    bottom: 0em;
    right: 2em;
  
}

.fixedheader{
    position: fixed;
    padding: 1em;
    background: #7E7EFF;
    top : 0;
    left : 0;
    right:  0;
}
  </style>

</head>
<body>
  <div class="fixedheader">fixed header</div>

11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>11111111<br>


<div class="fixbutton">fixed button</div>
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>  
</body>
</html>

大家先看看视频

重新设置position发现不会抖动了。

引入jQuery1.7.2不会抖动了。但是引入1.11.0发现还是会抖动

其他浏览器的情况

我的电脑上的其他浏览器(Chromium 版本 30.0.1592.0 、Firefox 27.0.1 、 IE9)无抖动问题。

寻找其他人的浏览器,Chrome 33 无此抖动问题。

因此此问题应该是部分浏览器的问题,非全部的问题。

目前可能可以解决的方法

目前可以解决的方法我也尝试了一些,只剩下几个。

第一种,给fixed的元素添加css的样式,我试过,这个可以解决此闪动的问题。

-webkit-transform: translateZ(0);

第二种,设置css。我是在不复杂的页面做的测试。

html, body {height:100%;overflow:auto;margin: 0;}

注意,引入这个CSS可能会导致原来的页面布局出现问题,慎重。我的同事也说,这个是为了解决IE6系列的fixed抖动问题。

第三种,引入jquery1.7.2的类库。

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>

引入jQuery的方法不知道为什么可以,但是引入了1.11.0的版本就无法解决这个问题。很奇怪。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: chrome修复css属性position fixed抖动 – https://www.chenyudong.com/archives/chrome-position-fixed-shake.html

分类: Web 开发

PHP的MVC框架模式是如何实现的

PHP的mvc框架很多,像YiiCodeIgniterThinkPHP等现在流行的框架,利用MVC模式进行web页面的开发,我们可以非常方便的编写web程序。他们的工作原理大家应该也比较感兴趣,下面我说说一个mvc框架长什么样。

路由机制

在互联网我们都是通过url提供服务,因此不同的url有不同的服务。用户访问不同的页面也就获得了不同的服务。那么我们的服务是如何通过url来区分不同的服务呢。

我们的web程序就要通过url寻找到不同的文件,进行不同的业务逻辑处理。我们的路由机制就是根据url,寻找到对应的controller,和action,然后由action进行具体的业务逻辑处理。

//定义一个controller
class UserControler extends Controller{
     //定义一个action方法,注意一定是public的
     public function index(){
          // do business code
     }
}

具体的对应规则不同的框架映射不同。以下是CodeIgniter框架的URL路由,它会尽力的尝试各种的可能,来分析URL的情况。

// 看看是否是从命令行运行的
if (php_sapi_name() == 'cli' or defined('STDIN')){
    $this->_set_uri_string($this->_parse_cli_args());
    return;
}

// 首先尝试 REQUEST_URI 这个适应大部分的情况
if ($uri = $this->_detect_uri()){
    $this->_set_uri_string($uri);
    return;
}

// 看看PATH_INFO变量是否存在?nginx需要配置
// Note: some servers seem to have trouble with getenv() so we'll test it two ways
$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
if (trim($path, '/') != '' && $path != "/".SELF){
    $this->_set_uri_string($path);
    return;
}

// 没有PATH_INFO,看看 QUERY_STRING?
$path =  (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
if (trim($path, '/') != ''){
    $this->_set_uri_string($path);
    return;
}

//尝试去从 $_GET 获取信息
if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != ''){
    $this->_set_uri_string(key($_GET));
    return;
}

// 尽力了,放弃了路由
$this->uri_string = '';
return;

通过上面的尝试,接下来就是如何利用路由机制加载正确的controller了。

Controller加载机制

我们来看看Codeigniter框架是如何加载到controller并且调用action的。

/system/core/Codeigniter.php中有如下的代码。Codeigniter在这之前会根据$_SERVER['PATH_INFO]里面的值来进行赋值(这个都是靠自己的设定的,默认的话CI他会有许多的if分支进行判断)。

//大约在250行
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');

$class  = $RTR->fetch_class();
$method = $RTR->fetch_method();

//大约在308行
$CI = new $class();

//大约在359行
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));

就这样,通过这个就调用到了我们的controller及其方法了,接下来就是编写自己的业务逻辑代码了。

视图view的显示

当我们的业务逻辑代码写完后,就需要页面的展示了。很多常见的MVC框架在页面的调用是这么写的。

//controller中action的方法
public function index(){
    // ... 许多的业务逻辑代码
    $data = array('name'=>'abc', 'age'=>12, .... );
    return $this->render('view/path/file.html',$data);
}

接着在视图文件view/path/file.html里写上一下代码。

<div>
姓名 : <?=$name ?>
年龄 : <?php echo $age; ?> 
</div>

这段如何将数据渲染到视图中,这段代码以前我一直很好奇,现在我明白了,我们来看看是如何实现的。

protected function render($template, array $var = array() ) 
{
    extract($var);   // 抽取数组中的变量
    ob_end_clean (); //关闭顶层的输出缓冲区内容
    ob_start ();     // 开始一个新的缓冲区
    require TEMPLATE_ROOT . $template . '.html';  //加载视图view
    $content = ob_get_contents ();             // 获得缓冲区的内容
    ob_end_clean ();           // 关闭缓冲区

    //ob_end_flush();      // 这个是直接输出缓冲区的内容了,不用再次缓存起来。
    ob_start();            //开始新的缓冲区,给后面的程序用
    return $content;       // 返回文本,此处也可以字节echo出来,并结束代码。
}

在这短短的几行代码中,全都是精华,就是这些非常重要的,全是php的内置函数,接下来我们来具体分析分析。

看看第一个extract($var)。这个函数从数组中将变量导入到当前的符号表。刚刚就将$data数组里面的name、age抽取出来,这样就可以在视图view中使用$name $age。更详细的请参考http://www.php.net/manual/zh/function.extract.php

第二个ob_end_clean()的作用是关闭顶层的缓冲区,为了是之前的程序不小心echo出的一些文字给清楚了,为了下一行的重新开辟一块缓冲区。

第三个ob_start()是开启一块新的缓冲区,为了是将视图的内容放到缓冲区。当然了,缓冲区有一定的大小,如果内容超出了缓冲区的设定值,那么会自动的发送给server。

第四个require file,这个就是第一个参数,根据自己的规则去加载视图的文件。其中文件里可以夹杂php、html的代码。你在这个render()函数声明的任何局部变量或者这里能访问到的任何全局变量,都可以在require的file文件中访问到。

第五个$content = ob_get_contents ()很重要,是为了将缓冲区的内容取出来,但不清除它。

第七个ob_start()是重新开启一个缓冲区,为了是下面的程序需要使用缓冲区。有写框架可能不用对$content的内容进行操作了,那么直接ob_end_flush()将缓冲区的内容输出出来就行了。

这个是一个很简单的展示视图的过程。如果直接使用这个不方便对视图view进行模块化,因此一些框架都不会这么直接用的。

我们从这个函数也可以看到程序有点类似程序中断保护现场的感觉。只不过中断保护现场会先保存数据,然后在返回的时候恢复回来。这里只有关闭上一个缓冲区,开启一个新的缓冲区,关闭这个缓冲哦过去,开启另外一个缓冲区。

至此,我们看到一个简单的PHP的MVC框架。如果你有兴趣可以自己开发一个MVC框架,或者更深入点的HMVC。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: PHP的MVC框架模式是如何实现的 – https://www.chenyudong.com/archives/how-to-php-mvc-framework.html

分类: PHP, Web 开发

Linux下ssh动态端口转发

SSH协议是一个非常棒的协议,因为他的存在,在互联网上传输才会的安全。

一般在Linux上,ssh客户端程序都会安装,ssh服务端程序不会安装。如果需要安装自己apt或者yum安装一下。

ssh的端口转发给我们带来了很多方便。比如我们在一个公共的WIFI环境或者局域网中,我们的网络包可以被他们截取,有了ssh的端口转发,他们之间会有一个加密的过程,防止被监听。

另外通过ssh端口转发,我们可以访问一些不能访问的网站。想象一下,你处于一个局域网中、或者学校的网络中,那么你的网络无法访问某些网站,此限制看网络管理员是如何限制的。比如在天朝,你无法访问facebook;再或者有些网站会封锁中国的IP,这些通过ssh的端口转发,就可以轻松的访问到。

ssh端口转发

ssh端口转发

根据图例说明:我们用浏览器访问www.google.com,此时浏览器开启了一个端口15453,但是发现在访问到某个节点,此网络包被丢弃了或者返回了错误的信息,导致我们无法访问www.google.com。但是我们想到了另外的一个方法,因为我们发现我们可以访问proxy.remotehost.com,而且他可以访问google.com,因此我们利用proxy.remotehost.com来做一个跳转。

因此我们利用的ssh的动态端口转发技术来达到这个目的。通过命令,我们在本地开启了一个7070端口,并且将7070端口关联到了proxy.remotehost.com的22号端口上。通过对浏览器设置,将所有的请求都转发到127.0.0.1:7070上,通过ssh的隧道,会将数据包传递到了proxy.remotehost.com:22。proxy服务器会随机开启一个端口去访问google.com。然后将数据在返回给proxy,再返回给浏览器。这就是一个代理转发的一个过程了。

下面我来看看如何具体的操作。

基本的动态端口转发

首先在我们的机器运行一下命令,先开启本机的7070端口到远程的22号端口的连接。

ssh -D 7070 -l username proxy.remotehost.com

参数说明:

  • -D 7070 -D [bind_address:]port D参数说明我们开启一个本地的端口转发。通过在本地分配一个socket去监听端口。只要有连接请求到这个port上来时,这个连接就会被安全通过给转发出去,应用程序的协议将有远程机器来决定连接到哪里。目前支持SOCKS4SOCKS5协议,ssh会扮演一个SOCKS5服务器。另外只有root用于才能转发原始端口。
  • -l username 小写字母l参数指定了登录ssh服务器的用户名
  • proxy.remotehost.com 指定了我们需要登录的远程ssh服务器。默认使用ssh程序的指定端口,一般是22号端口,除非系统做了修改

通过这一个命令,再配合一下浏览器的设置,我们就能访问被封锁的网站了。但是不能太高兴了,还是有些问题的。

帐号一登录成功就被退出了?

我的帐号在输入密码成功后,就被强制退出了,这样不就不能进行动态端口转发了吗?

其实这情况很容易解决,因为你的帐号被远程服务器做了手脚了,ssh服务器禁止这个帐号登录请求shell终端了,不能执行远程命令。目的是防止你登录他的系统进行命令的操作。一般专门用于代理的帐号都做了这个限制。

这个时候我们就需要增加一个参数-N来解决这个问题了。

ssh -D 7070 -l username proxy.remotehost.com -N

-N 参数是不请求一个shell界面,不执行远程命令。这个在只是端口转发的时候非常实用(只能在SSH2协议下工作,现在一般都是SSH2协议了,SSH1协议有安全问题,基本不用了)

让这个端口转发连接后台运行

如果只是上面的命令,在登录成功后,你是无法在当前的shell终端中进行任何的操作的,此时你想要干其他的事情只能再起一个端口了。

通常这个是没有意义的,放一个无用的窗口在那边,我们可以增加一个-f参数,让这个连接在后台运行

ssh -D 7070 -l username proxy.remotehost.com -Nf

这样我们就可以用当前的shell终端继续工作了。或者弄一个开机自动运行的脚本,开机自动连接。

给ssh连接增加http代理

如果你的PC无法直接访问到ssh服务器上,但是只有http代理可以访问,那么我们要建立这个socks5的动态端口转发只能为他加上一个代理了。

ssh -D 7070 -l username proxy.remotehost.com -Nf -o ProxyCommand="connect -H web-proxy.oa.com:8080 %h %p "

加上了-o ProxyCommand="connect -H web-proxy.oa.com:8080 %h %p "这个参数,就让我们的ssh连接建立在了一个http代理上了,这个应用对于在公司内网里面非常实用。

其中ProxyCommand指定了使用connect程序来进行代理。通常还可以使用corkscrew来达到相同的效果。

附connect的安装。

如果你是Ubuntu或者Debain系列的使用

sudo apt-get install connect-proxy

如果你是Ubuntu、Debain系列没找到源或者是Centos系列的,需用从下面去访问下载http://pkgs.org/download/connect-proxy。寻找一个适合你系统的包下载下来。

rpm -ivh connect-proxy-1.93-2.el6.x86_64.rpm
或者rpm -Uvh connect-proxy-1.93-2.el6.x86_64.rpm

一段时间没动作,连接自动断开了

一段时间没有发送消息,就出现了

Write failed: Broken pipe

这样的情况,这样的情况就是因为长时间没有发送消息,此隧道被关闭了。

因此我们需要设置一下ssh,让其每隔一段时间就发送一些消息,想服务器说明我还活着,不管关闭了我们的连接。

ssh -D 7070 -l username proxy.remotehost.com -Nf -o ProxyCommand="connect -H web-proxy.oa.com:8080 %h %p " -o ServerAliveInterval=60

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Linux下ssh动态端口转发 – https://www.chenyudong.com/archives/linux-ssh-port-dynamic-forward.html

分类: 网络

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑