Categories
木有技术

Apache服务器配置WoSign(沃通)SSL证书

参考文献
使用沃通签了一份SSL证书,其实配置的过程挺简单的,看参考文献基本能搞定。需要注意的是,本教程只开启了HTTPS站点的访问,并不强制跳转HTTP到HTTPS
我的服务器是Ubuntu+Apache,按照apt-get安装的apache2应该在这个/etc/apache2 目录下
可以看到目录大概是这个结构:

total 80
-rw-r--r-- 1 root root 7114 Dec 31 05:57 apache2.conf
drwxr-xr-x 2 root root 4096 Dec 31 05:31 conf-available
drwxr-xr-x 2 root root 4096 Dec 31 05:31 conf-enabled
-rw-r--r-- 1 root root 1782 May 20 2015 envvars
-rw-r--r-- 1 root root 31063 May 20 2015 magic
drwxr-xr-x 2 root root 12288 Apr 28 07:03 mods-available
drwxr-xr-x 2 root root 4096 May 24 11:17 mods-enabled
-rw-r--r-- 1 root root 320 May 20 2015 ports.conf
drwxr-xr-x 2 root root 4096 Dec 31 05:56 sites-available
drwxr-xr-x 2 root root 4096 May 24 11:27 sites-enabled

其中sites-available目录下应该有个默认的https配置的,我这边就有个default-ssl.conf ,然后参考本文最开始提供的参考文献链接,编辑这个文件,做这么几步:

  1. 配置公钥:修改字段SSLCertificateFile conf/ssl/test.wosign.com.crt ,SSLCertificateFile字段后面的文件地址是你存储的公钥文件(以我的站为例,wosign发给我的压缩包里有for Apache.zip,压缩包里面就有个 _boweihe.me.crt);
  2. 配置私钥:修改字段SSLCertificateKeyFile conf/ssl/test.wosign.com.key 同理,自行修改私钥文件地址(私钥文件后缀是.key)
  3. 配置服务器证书链:找到以#SSLCertificateChainFile 开头的一行,删除行开头的#号注释,并修改字段对应值为你的证书链文件(1_root_bundle.crt)地址,如SSLCertificateChainFile conf/ssl/1_root_bundle.crt

然后需要启用这个HTTPS站点(配置文件的其他内容修改可以参考你自己本身已经启用的http站的,可能要注意的是webroot要保持一致什么的),启用的命令很简单

a2ensite default-ssl

后面的default-ssl是你刚才修改的default-ssl.conf文件的名字,如果你起了另外的名字,那相应修改。命令执行成功后,会提示

To activate the new configuration, you need to run:
  service apache2 reload

照着做就行了,重新加载下apache服务:

service apache2 reload

至此你的站就可以用https协议访问了,如图
https
可能遇到的问题是,站点里部分资源是非HTTPS协议的,这时候图表就不能变绿了。比如我使用了七牛云的静态文件缓存,还得去人工提交一下申请,开通HTTPS静态资源访问的协议。

Categories
不学无术 木有技术

在SpringMVC 4 中用注释(Annotation)方式使用 Google Kaptcha (Captcha)

原创内容,转载请注明来自http://boweihe.me/?p=2026

近期在努力学习SpringMVC,因为之前对JSP也是一知半解的,干脆拿了本《Spring in Action》(4th edition)啃,发现使用注释的方式比用xml来的有意思一些。网站中要用到验证码,目前能找到的文档都是用xml配置的,感觉有点不爽,决定学我党“摸着石头过河”一次,希望不要naive了..

Maven库

Google自家的库估计是没了,大概是时间太久远了吧。我用的Maven库是这个

<dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
</dependency>

Bean配置文件

需要把原有的applicationContext.xml用注释的方式实现,其实就是让Spring找到个可以用的Bean并加载相关配置。
 
我构造了一个类来搞定这个事情,里面的配置参数会从application.properties文件中读取,我仅仅实现了我需要的几个参数,反正如果要加的话就在kaptchaProperties方法里面写就可以,然后Autowire一个Environment用来读取文件配置参数。主要是@Configuration 注释,这个是告诉Spring我是个配置类,这个还是从Hibernate配置中学过来的,哈哈。
声明出来的这个@Bean(name = “captchaProducer”) 就是后面Controller里面要用的了

package edu.inlab.config;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import java.util.Properties;
/**
 * Created by inlab-dell on 2016/5/17.
 */
@Configuration
@PropertySource(value = {"classpath:application.properties"})
public class KaptchaConfig {
    @Autowired
    private Environment environment;
    private DefaultKaptcha kaptcha;
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaProducer(){
        if(null == kaptcha) {
            kaptcha = new DefaultKaptcha();
            kaptcha.setConfig(getKaptchaConfig());
        }
        return kaptcha;
    }
    @Bean
    public Config getKaptchaConfig(){
        return new Config(kaptchaProperties());
    }
    private Properties kaptchaProperties(){
        Properties properties = new Properties();
        properties.put("kaptcha.image.width",
                environment.getRequiredProperty("kaptcha.image.width"));
        properties.put("kaptcha.image.height",
                environment.getRequiredProperty("kaptcha.image.height"));
        properties.put("kaptcha.textproducer.char.string",
                environment.getRequiredProperty("kaptcha.textproducer.char.string"));
        properties.put("kaptcha.textproducer.char.length",
                environment.getRequiredProperty("kaptcha.textproducer.char.length"));
        return properties;
    }
}

对应的application.properties,具体含义可以看参考文献里,解释的很清楚了。

kaptcha.image.width = 200
kaptcha.image.height = 50
kaptcha.textproducer.char.string = ABCDEFGHKLMNPQRSTWXY3456789
kaptcha.textproducer.char.length = 6

CaptchaController 控制器

项目在实习前怕是赶不完来了,我还是少花点时间写博客吧。
控制器的实现Wiki上都有,主要的是要@Autowire之前我们做好的那个Bean,大概是这样。其实就是个基于set方法的注入嘛~

@Controller
@RequestMapping("/captcha")
public class CaptchaController {
    private Producer captchaProducer;
    @Autowired
    public void setCaptchaProducer(Producer captchaProducer) {
        this.captchaProducer = captchaProducer;
    }
    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView handleRequest(HttpServletRequest request,
                  HttpServletResponse response) throws Exception{
        // ...
    }
}

 

参考文献:

  1. 在springmvc项目中使用kaptcha生成验证码
  2. 简单Maven的Web项目之验证码(Kaptcha篇)
  3. Spring mvc框架下使用kaptcha生成验证码
  4. https://code.google.com/archive/p/kaptcha/wikis

 

Categories
不学无术 木有技术

百度前端技术学院 任务四:定位和居中问题

任务:

http://ife.baidu.com/task/detail?taskId=4

效果图:

屏幕快照 2016-04-03 下午5.54.13

有用的参考资料:

思路:

灰色矩形使用relative定位,然后设定left与top为50%,由于已经知道框的大小,用margin把长款的一半距离补回来就行了。
两个扇形在矩形的div内部,使用绝对定位,用border-radius做圆角,clip:rect剪切。

代码:

CodePen: http://codepen.io/idailylife/full/QNqJXe/

<div class="rectangle">
  <div id="left_top" class="qcircle">
  </div>
  <div id="right_bottom" class="qcircle">
  </div>
</div>

 

.rectangle{
  position: absolute;
  width: 400px;
  height: 200px;
  top: 50%;
  left: 50%;
  margin-left: -200px;
  margin-top:-100px;
  background-color: #ccc;
}
.qcircle{
  position:absolute;
  width:100px;
  height:100px;
  border-radius:50px;
  background-color:#fc0;
}
#left_top{
  top: -50px;
  left: -50px;
  clip:rect(50px, 100px, 100px, 50px);
}
#right_bottom{
  right: -50px;
  bottom: -50px;
  clip:rect(0, 50px, 50px, 0);
}

 

Categories
不学无术 木有技术

百度前端技术学院 任务三 HTML、CSS布局入门,三栏式布局的实践

恩,很遗憾没有赶上报名,因为是事后好几天才知道的。好在他们公开了练习题已经微信通知,所以还是可以跟着练一练哒!就是得不到别人的评论了,很忧伤,但是可以看每一队提交的作业,挺好。
给出我自己的实现吧,作为“对于有过页面实践,但没做过太复杂页面的同学”,我先选了第三题
效果图:
屏幕快照 2016-04-02 下午6.42.20
实现:
三栏布局使用的是float,没有用到相对定位。文字在框里的垂直居中,找到的是这里的方法。
前端团队提供的有关清除浮动的信息很给力:http://zh.learnlayout.com/clearfix.html,里面还有些很实用的技巧。
目前的缺陷是,强制设置了min-width,移动界面不适配,我还要慢慢学习啊!
代码:
CodePen: https://codepen.io/idailylife/pen/pyWLvq
HTML

<div class="container">
  <div id="group" class="nav sub container">
    <div id="group_logo" class="smallbox container">
      团队LOGO</br>80x80
    </div>
    <div id="group_name">
      团队名称
    </div>
  </div>
  <div id="right" class="right sub container">
    <div class="plogo smallbox container withvmargin">
      <p>个人LOGO</p>
    </div>
    <div class="plogo smallbox container withvmargin">
      <p>个人LOGO</p>
    </div>
    <div class="plogo smallbox container withvmargin">
      <p>个人LOGO</p>
    </div>
    <div class="plogo smallbox container">
      <p>个人LOGO</p>
    </div>
  </div>
  <div id="middle" class="sub container">
    <p>团队介绍</p>
    <p>《金刚般若波罗蜜经》来自印度的初期大乘佛教。因其包含根本般若的重要思想,在般若系大乘经中被视为一个略本;本经说“无相”而不说“空”,保持了原始般若的古风。本经六种译本中,通常流通的是鸠摩罗什的初译。如印顺法师所说,此后的五译是同一唯识系的诵本,比如菩提流支、达摩笈多等,都是依无著、世亲的释本译出;只有罗什所译为中观家(般若系)的诵本。又如吕澂说,罗什传龙树的般若学,所以能“心知其意”;到玄奘新译般若经,《金刚经》其实已“面目全非”了。
《金刚经》在印度有唯识家(无著、世亲)的论释。传入中国,三论、天台、贤首、唯识各宗都有注疏;然而中国佛教深受真常系大乘的影响,各宗表面上阐扬《金刚经》,实际上阐扬常住佛性和如来藏。又在三教合流环境下,明清以来,三教九流都来注解《金刚经》,杂合浓厚的真常理论和儒道信仰。又受到密教影响,《金刚经》被附上密咒形成读诵仪轨。此外,民间还出现各种离奇的灵验记和感应录。般若经典《金刚经》被真常化、儒道化、迷信化之中,在中国特别的盛行起来。
本经文义次第的艰深为古印度学者所公认,如无著说:“金刚难坏句义聚,一切圣人不能入”。依龙树所示《般若经》的“两番嘱累”,《金刚经》的“初问初答”即宣说“般若道”,“再问再答”宣说“方便道”。本经侧重广观万法(《心经》则侧重观身心五蕴),阐扬发菩提心,行无我的大乘菩萨道;彻始彻终归宗於般若无住的离相法门,以此明示阿耨多罗三藐三菩提。</p>
  </div>
</div>

CSS

body{
  min-width:540px;
}
.container{
    padding: 20px;
    background-color: #eee;
    border: 1px solid #999;
    overflow: auto;
    zoom: 1;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.sub{
  background-color: #fff;
}
.nav{
  float:left;
  width:200px;
}
.right{
  width:120px;
  float:right;
}
.smallbox{
  width:80px;
  height:80px;
  float:left;
  overflow:hidden;
}
.withvmargin{
  margin-bottom:20px;
}
.plogo{
  padding:20px 0;
  font-size: 12px;
  text-align:center;
}
#group_name{
  margin: 0px auto;
  width: 78px;
  font-size: 16px;
  float: left;
  text-align:right;
}
#group_logo{
  font-size: 12px;
  padding: 0 auto;
}
#middle{
  margin-left: 220px;
  margin-right: 140px;
}

 

Categories
木有技术

LeetCode 203. Remove Linked List Elements

Remove all elements from a linked list of integers that have value val.
Example
Given: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
Return: 1 –> 2 –> 3 –> 4 –> 5

思路:

思路很简单,记录当前指针的前一个节点,然后val对上的话把前一个节点的next指针指向当前节点的next指针。有几个需要注意的输入:

  1. 空指针输入,即head就是NULL
  2. head->val等于val的情况,即删除完后head指针会变化
  3. 末尾节点要删除的情况
  4. 删完之后链表变空的情况

《剑指Offer》这书还挺有用的,代码的稳健性很重要。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head == NULL)
            return head;
        ListNode* pNewHead = head;
        ListNode* pPrev = NULL;
        ListNode* pCurr = head;
        while(pCurr != NULL){
            if(pCurr->val == val){
                if(pPrev == NULL) {//pCurr is the head of linkedlist
                    pNewHead = pCurr->next;
                } else {
                    pPrev->next = pCurr->next;
                }
            } else {
                pPrev = pCurr;
            }
            pCurr = pCurr->next;
        }
        return pNewHead;
    }
};

 

Categories
木有技术

LeetCode 5. Longest Palindromic Substring

题目:https://leetcode.com/problems/longest-palindromic-substring/
思路:
分为两种回文,一种是”aba”的形式,另一种是”aa”的形式,当然了,”a”也算是回文.
我的想法指定一个对称中心,然后往两边搜索,这样能找到最大可能的回文。或许还有一种思路是利用类似栈的容器的,但是怎样判断”abcbaabcba”这种嵌套型的呢?
代码:

class Solution {
public:
	string longestP(string s, int pos, int type) {
		//Type: 0- 'a', 1-'aa'
		//Find palindrome at the position 'pos'
		int len = s.size();
		int posFront, posRear, maxLen;
		if (type == 0) {
			maxLen = 1; //'a'
			posFront = pos - 1;
			posRear = pos + 1;
			if (posFront < 0)
				return s;
		}
		else {
			maxLen = 0;
			posFront = pos - 1;
			posRear = pos;
		}
		while (posRear - posFront + 1 <= len) {
			if (s[posFront] != s[posRear]) {
				if (maxLen == 0)
					return "";
				return s.substr(posFront + 1, posRear - posFront - 1);
			}
			posFront--;
			posRear++;
			maxLen+=2;
		}
		return s.substr(posFront + 1, posRear - posFront - 1);
	}
	string longestPalindrome(string s) {
		int strSize = s.size();
		string maxStr = s.substr(0,1);
		for (int i = 1; i<strSize; i++) {
			string type1str = longestP(s, i, 0);
			string type2str = longestP(s, i, 1);
			if (type1str.size() > maxStr.size()) {
				maxStr = type1str;
			}
			if (type2str.size() > maxStr.size()) {
				maxStr = type2str;
			}
		}
		return maxStr;
	}
};

 

Categories
木有技术

Cisco Linksys EA3500 OpenWrt Snapshot镜像

仅限Snapshot版本r48648使用,需要自己搭服务器的可以参考我的帖子http://boweihe.me/?p=1537

没有Luci界面的,可以直接修改/etc/opkg/distfeeds.conf 这个文件。LuCi界面下等效的。

src/gz designated_driver_base http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/base
src/gz designated_driver_kernel http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/kernel
src/gz designated_driver_luci http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/luci
src/gz designated_driver_management http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/management
src/gz designated_driver_packages http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/packages
src/gz designated_driver_routing http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/routing
src/gz designated_driver_telephony http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/telephony
# src/gz designated_driver_targets http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/targets

 
 

Categories
木有技术

前端测试服务 by aliyun

感觉很给力的样子,一天有俩小时的时间可以用,从IE6开始的浏览器兼容性测试,竟然是跑虚拟机的!
http://fts.aliyun.com/

Categories
木有技术

SS客户端及使用教程

2016-03-02更新Windows客户端版本至3.0
2017-03-16更新客户端版本

准备工作:

使用步骤:
1.进入SS服务的用户面板,点击左侧“节点列表”
QQ截图20160209102124
2.挑选需要的节点,然后点击“操作”->“二维码”
QQ截图20160209102808
点击后会新开个网页,上面有二维码,不要动它
3.打开SS客户端,此时任务栏右下角会有小飞机图标。鼠标右键,弹出的菜单点击“服务器”,然后“扫描屏幕上的二维码”
QQ截图20160209103239
正常的话就能扫描好屏幕的上的二维码了,就是服务器账户信息
4.还是刚才的右键菜单,点“启动系统代理”
然后“系统代理模式”选择“PAC”模式
最后一步,在“PAC”那边,点击“从GFWList更新本地PAC”
记得定期更新PAC列表,否则请直接使用“全局模式”。
如果过几秒提示“更新PAC成功”,就一切搞定啦!

Categories
木有技术

Cisco Linksys EA3500 刷入OpenWrt

万万没想到这个路由器现在也有了官方的OpenWrt支持!
可以参考这里(英文):https://wiki.openwrt.org/toh/linksys/ea3500
大致翻译如下:

As of r47458 the EA3500 is completely supported. This model is identified by the board codename “Audi.”
自从版本r47458开始,EA3500已被OpenWrt完整支持了。这个机型的固件可以用识别码 “Audi”查找

访问这里可以得到最新的编译版本:https://downloads.openwrt.org/snapshots/trunk/kirkwood/generic/
需要查找带有

openwrt-kirkwood-linksys-audi-squashfs-factory.bin

字样的,是可以直接用思科原版固件刷入的;而

openwrt-kirkwood-linksys-audi-squashfs-sysupgrade.tar

是从旧版本OpenWrt升级用的。
注意:刷好之后默认没有开启无线的,也没有装luci图形界面,需要用ssh(可通过putty软件)用有线的方式连接到管理界面。路由器默认的IP地址应该是192.168.1.1
连接SSH时,默认用户是root,然后是空密码。进入后需要用

passwd

命令设置密码。
然后可以更新opkg包进而安装网页管理界面luci

opkg update #更新包信息
opkg install luci #下载并安装luci
opkg install luci-i18n-base-zh-cn #可选,安装中文语言

随后就能通过网页访问http://192.168.1.1来管理啦!
CISCO LinkSys EA3500 OpenWrt