SecureCRT上传和下载文件

SecureCRT这个工具自带了一个FTP,方便我们上传和下载,而且做的比较人性化,由于其基本命令和linux中基本命令大都相似,熟悉LINUX人能很容易上手。
当我们用SecureCRT连接上一台主机时,点击该工具的上 “文件”,在其下拉列表中选中“连接SFTP会员”,这样我们就连接上了FTP,就可以利用该FTP进行上传和下载了。当然你也可以使用快捷键Alt + P。

继续阅读

SVN指定IP访问

现SVN服务器是放在公网的,考虑到安全,需要特别指定公司的IP才能进行操作。 步骤如下:

在安装完Visual SVN Server之后,打开安装目录下的conf中(比如我的是C:\Program Files (x86)\VisualSVN Server\conf )的 httpd.conf 文件

接着在一堆LoadModule最后添加一条
LoadModule authz_host_module bin/mod_authz_host.so

接着在
Options FollowSymLinks
AllowOverride None
RewriteEngine on

RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule ^(.*/svn)$ %1/ [R=301,L]
的中间添加
Order Deny,Allow
Deny From All
Allow From 112.86.83.226

重启SVN服务后就只有 112.86.83.226 能操作SVN了。

JS及Jquery获取iframe中的元素

JS版本

在父窗口中获取iframe中的元素 

1、

格式:window.frames[“iframe的name值”].document.getElementByIdx_x(“iframe中控件的ID”).click();

实例:window.frames[“ifm”].document.getElementByIdx_x(“btnOk”).click();

2、

格式:

var obj=document.getElementByIdx_x(“iframe的name”).contentWindow;

var ifmObj=obj.document.getElementByIdx_x(“iframe中控件的ID”);

ifmObj.click();

实例:

var obj=document.getElementByIdx_x(“ifm”).contentWindow;

var ifmObj=obj.document.getElementByIdx_x(“btnOk”);

ifmObj.click();

在iframe中获取父窗口的元素

格式:window.parent.document.getElementByIdx_x(“父窗口的元素ID”).click();

实例:window.parent.document.getElementByIdx_x(“btnOk”).click();


Jquery版本

在父窗口中获取iframe中的元素 

1、

格式:$(“#iframe的ID”).contents().find(“#iframe中的控件ID”).click();//jquery 方法1

实例:$(“#ifm”).contents().find(“#btnOk”).click();//jquery 方法1

2、

格式:$(“#iframe中的控件ID”,document.frames(“frame的name”).document).click();//jquery 方法2

实例:$(“#btnOk”,document.frames(“ifm”).document).click();//jquery 方法2

在iframe中获取父窗口的元素

格式:$(‘#父窗口中的元素ID’, parent.document).click();

实例:$(‘#btnOk’, parent.document).click();

linux搭建shadowsocks服务器(Go版)

一、ShadowSocks介绍

Shadowsocks是一个基于python的轻量级socks代理软件,可以在任何系统简单的实现访问被屏蔽的网站。
官方网站: https://shadowsocks.org/en/index.html

二、ShadowSocks服务端安装

root用户登录,运行以下命令:

wget –no-check-certificate -O shadowsocks-go.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh

chmod +x shadowsocks-go.sh

./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log

本脚本安装完成后即已后台启动 Shadowsocks-go ,并且已将 shadowsocks-go 加入开机自启动。
运行:/etc/init.d/shadowsocks status可以查看 Shadowsocks-go 进程是否已经启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status使

Shadowsocks for Windows 客户端下载:
https://github.com/shadowsocks/shadowsocks-windows/releases

Java 8十个lambda表达式案例

1. 实现Runnable线程案例

使用() -> {} 替代匿名类:

//Before Java 8:
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Before Java8 ");
    }
}).start();

//Java 8 way:
new Thread( () -> System.out.println("In Java8!") ).start();
     
Output:
too much code, for too little to do
Lambda expression rocks !!

你可以使用 下面语法实现Lambda:

(params) -> expression
(params) -> statement
(params) -> { statements }

如果你的方法并不改变任何方法参数,比如只是输出,那么可以简写如下:

() -> System.out.println(“Hello Lambda Expressions”);

如果你的方法接受两个方法参数,如下:

(int even, int odd) -> even + odd 继续阅读

为什么面试要问 hashmap 的原理

我们都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。

1. 什么是HashMap?

HashMap可以接受null键值,而Hashtable则不能。HashMap是非synchronized,因此HashMap也很快。以及HashMap储存的是键值对。

 

2. 你知道HashMap和get()方法的工作原理吗?

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,或者错误的认为仅仅只在bucket中存储值的话,你将不会回答如何从HashMap中获取对象的逻辑。这个答案相当的正确,也显示出面试者确实知道hashing以及HashMap的工作原理。

 

3. 当两个对象的hashcode相同会发生什么?

这个问题是关于HashMap中的碰撞探测(collision detection),因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。

这个答案非常的合理,虽然有很多种处理碰撞的方法,这种方法是最简单的,也正是HashMap的处理方法。

 

4. 如果两个键的hashcode相同,你如何获取值对象?

当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,获取值对象。如果两个值对象存储在一个bucket中,将会遍历LinkedList直到调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。(当程序通过 key 取出对应 value 时,系统只要先计算出该 key 的 hashCode() 返回值,在根据该 hashCode 返回值找出该 key 在 table 数组中的索引,然后取出该索引处的 Entry,最后返回该 key 对应的 value 即可。)

 

5. 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?

当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

 

6. 重新调整HashMap大小存在什么问题吗?

当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在LinkedList中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。这个时候,你可以质问面试官,为什么这么奇怪,要在多线程的环境下使用HashMap呢?

继续阅读

Gradle 构建工程时jcenter下载慢或超时以及INSTALL_FAILED_OLDER_SDK解决

在使用 Gradle 构建工程时,jcenter 下载慢、超时的解决方法。

方法一:

https 改成 http 协议下载,修改项目根目录下 build.gradle 文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()
// jcenter()
jcenter(){url ‘http://jcenter.bintray.com/’}
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.2.1’

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
// jcenter()
jcenter(){url ‘http://jcenter.bintray.com/’}
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

方法二:

切换到国内的Maven镜像仓库。如:
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()
maven{url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.2.1’

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
maven{url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

INSTALL_FAILED_OLDER_SDK原因就是您设备的Android版本过低,app不支持。 在程序的Manifest文件(或build.gradle)中修改minSdkVersion和targetSdkVersion版本号即可。

年轻的时候为什么不努力就是在犯罪!【力荐】

        爱,金钱,健康。这三样是我认为代表了一个人最重要的安全感来源。然而健康未必是爱的基础,爱也未必是健康的保障,但金钱却可以同时保障爱与健康。

    舒的小说《喜宝》中,女主角姜喜宝的自白说“我要很多很多爱,不然就要很多很多钱,最差也要有健康才好。”
  而没钱所带来的怯弱,是说不尽的。也许是初中时一双破了洞鞋子,紧紧的缩在校服的裤子里,体育课宁可受罚也躲着不去。也许是大学时室友聚餐找了借口不去,一个人躲在寝室煮青菜面条,吃完还要小心翼翼的打扫不被发现。也许是工作后捡到被遗弃的小猫,仍犹犹豫豫要不要买上百块的猫奶粉,错过拯救它的最佳时机,最后看它死在怀里又懊悔的痛哭流涕。

继续阅读

centos 7不能联网的处理

VMWare虚拟机中centos7安装vim提示错误,经检查发现是没有联网,尝试使用ifconfig命令检查网卡情况时提示command not found。继而cd去了sbin目录发现并没有ifconfig文件。作为一个linux门外汉,查阅了很多资料后才知道是因为centos7已经不使用ifconfig命令了,而是使用ip命令代替。并且网卡名称也不是eth0,而是改成ens33了。 解决方式如下:

1,如解决ifconfig命令找不到,可以使用ip addr 即查看分配网卡情况。
2,激活网卡:cd /etc/sysconfig/network-scripts/, vi ifcfg-ens33 进入编辑模式,将 ONBOOT=no 改为 ONBOOT=yes,保存后service network restart重启网卡服务就OK了。

万能的Ctrl + Z可以中断ping命令。

Ionic.Utils.Zip大全

项目开发中用到了Koogra,处理excel2007时遇到Invalid header magic number的问题。不得不吐嘈一下关于Koogra的资源是真的少,不过好再找到了问题的根源:Koogra读取2003和2007是不一样的,需要写两个不同的配置类。代码稍后贴出来(也是网上找的)。

但是在使用过程中,编译项目时new Net.SourceForge.Koogra.Excel2007.Workbook报错,提示缺少Ionic.Utils.Zip.dll的引用。于是到网上down了一个引用进来,编译通过了,但在运行时又报黄页了,看了一下错误提示,Koogra引用了个1.3.0版本的Ionic.Utils.Zip。 找半天终于找着了1.3.0版本的dll,整理了一下,有需要的自行下载吧。 继续阅读