大海Online的博客

Looking for Interest

批量转换GBK到UTF-8

批量转换GBK到UTF-8

find src | grep ".java" | grep -v ".svn" | xargs -I% echo "iconv -f GBK -t UTF-8 % > %.temp " | bash
find src | grep ".java" | grep -v ".svn" | grep -v ".temp" | xargs -I% echo "cp %.temp %" | bash
find src | grep ".java" | grep -v ".svn" | grep ".temp" | xargs -I% echo "rm %" | bash

注意, 如果直接用

iconv -f GBK -t UTF-8 filename > filename

会挂掉的, 导致filename清空,所以用的.temp

android 整合 maven 环境

我们再先整理一下思路:

使用eclipse:

  1. 创建: adt自带的android创建插件 New -> android application project
  2. 引入: import -> existing project into workspace
  3. 打包: run as -> android application

使用maven:

  1. 创建: maven archetype:generate (99: de.akquinet.android.archetypes:android-quickstart) https://github.com/akquinet/android-archetypes
  2. 运行: maven clean package android:deploy android:run (android-maven-plugin)
  3. 引入eclipse: a). mvn eclipse:eclipse b). import -> android -> existing android code into workspace c). 注意, 要选中 copy projects into workspace , 否则会有 overlaps 问题 d). 下次,已经存在.project .classpath, 直接导入已存在的java工程即可
  4. 打包同上~~~

用maven编译android并部署

  export ANDROID_HOME=~/android/sdk/
  mvn clean package android:deploy android:run

其中package中使用了 android-maven-plugin中的

  • android-maven-plugin:3.5.0:generate-sources
  • android-maven-plugin:3.5.0:proguard
  • android-maven-plugin:3.5.0:emma
  • android-maven-plugin:3.5.0:dex
  • android-maven-plugin:3.5.0:apk

这四个mvn指令,穿插在了package正常打包过程中 这四个mvn指令,均是直接调用了android.sdk中的platform-tools中的某个指令或java调用

<plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>3.1.1</version>
    <extensions>true</extensions>
    <configuration>
     <sdk>
      <platform>16</platform>
     </sdk>
    </configuration>
   </plugin>

maven.android的eclipse常用插件是 m2e-android 插件 可以认为m2e-android也是同样的道理,

android开发环境

android 开发环境搭建

刚接触android开发, 前辈们都说现在的android开发环境比以前容易搭建了~~~

搭建方式如下:

  1. 下载android sdk http://developer.android.com/sdk/index.html 下载后的sdk, 包括了 eclipse 以及 sdk
  2. 解压, 并切换至 eclipse 目录, 打开 eclipse
  3. eclipse打开菜单window-android SDK Manager下载SDK sources
  4. 安装m2e-android 用于maven工程 (当然没有使用maven就算了) web: http://rgladwell.github.com/m2e-android/ update: http://rgladwell.github.com/m2e-android/updates/
  5. import导入 maven版的android工程

另外:

由于android自带的eclipse不支持eclipse marketplace 你也可以下载最新版eclipse 然后从插件市场中下载 android sdk, m2e-android

入门必备,存档留念

java rsa code

package rsa;
import java.security.Key;  
import java.security.KeyFactory;  
import java.security.KeyPair;  
import java.security.KeyPairGenerator;  
import java.security.PrivateKey;  
import java.security.PublicKey;  
import java.security.interfaces.RSAPrivateKey;  
import java.security.interfaces.RSAPublicKey;  
import java.security.spec.PKCS8EncodedKeySpec;  
import java.security.spec.X509EncodedKeySpec;  
   
import javax.crypto.Cipher;  

import sun.misc.BASE64Decoder;  
import sun.misc.BASE64Encoder;  
   
   
public class RSAUtil {
	public static String[] initKey() throws Exception {
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  
        //密钥位数  
        keyPairGen.initialize(1024);  
        //密钥对  
        KeyPair keyPair = keyPairGen.generateKeyPair();  

        // 公钥  
        PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  

        // 私钥  
        PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  

        String publicKeyString = getKeyString(publicKey);  
        System.out.println("public:\n" + publicKeyString);  

        String privateKeyString = getKeyString(privateKey);  
        System.out.println("private:\n" + privateKeyString);  
        return new String[]{publicKeyString, privateKeyString};
	}
	
	public static String encode(String data, String publicKey) throws Exception {
        //加解密类  
        Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding");  
        cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey));  

        //加密  
        byte[] enBytes = cipher.doFinal(data.getBytes("UTF-8"));  
        return new BASE64Encoder().encode(enBytes);
	}
	
	public static String decode(String data, String privateKey) throws Exception {
        //加解密类  
        Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding");  
        cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));  

        //加密  
        byte[] deBytes = new BASE64Decoder().decodeBuffer(data);
        byte[] enBytes = cipher.doFinal(deBytes);  
        return new String(enBytes, "UTF-8");
	}	
	
   
      /** 
       * 得到公钥 
       * @param key 密钥字符串(经过base64编码) 
       * @throws Exception 
       */  
      private static PublicKey getPublicKey(String key) throws Exception {  
            byte[] keyBytes;  
            keyBytes = (new BASE64Decoder()).decodeBuffer(key);  
   
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);  
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
            PublicKey publicKey = keyFactory.generatePublic(keySpec);  
            return publicKey;  
      }  
      /** 
       * 得到私钥 
       * @param key 密钥字符串(经过base64编码) 
       * @throws Exception 
       */  
      private static PrivateKey getPrivateKey(String key) throws Exception {  
            byte[] keyBytes;  
            keyBytes = (new BASE64Decoder()).decodeBuffer(key);  
   
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);  
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);  
            return privateKey;  
      }  
   
      /** 
       * 得到密钥字符串(经过base64编码) 
       * @return 
       */  
      private static String getKeyString(Key key) throws Exception {  
            byte[] keyBytes = key.getEncoded();  
            String s = (new BASE64Encoder()).encode(keyBytes);  
            return s;  
      }  
   
   
      public static void main(String[] args) throws Exception {  
          //明文  
          String plainText = "很好!hello world";  
          String[] keys = initKey();
          
          System.out.println(encode(plainText, keys[0]));
          System.out.println(decode(encode(plainText, keys[0]), keys[1]));
   
      }  
   
}  

maven 多环境配置

maven多环境配置

比较常见的maven的多环境配置

<build>
  <resources>
     <resource>
       <directory>src/main/resources</directory>
         <filtering>true</filtering>
     </resource>
  </resources>
  <profiles>
    <profile>
      <id>development</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <filters>
        <filter>src/main/resources/profile/development.properties</filter>
      </filters>
    </profile>
    <profile>
      <id>production</id>
      <filters>
        <filter>src/main/resources/profile/production.properties</filter>
      </filters>
     </profile>
  </profiles>
</build>
    mvn jetty:run
    mvn jetty:run -Pproduction

当没有写P参数时,采用development的profile,若指定,则使用指定的profile

另外一种写,个人认为比较优化

<properties>
  <env>development</env>
<build>
  <filters>
    <filter>src/main/resources/profile/${env}.properties</filter>
  </filters>
  <resources>
     <resource>
       <directory>src/main/resources</directory>
         <filtering>true</filtering>
     </resource>
  </resources>
</build>
   mvn jetty:run
   mvn jetty:run -Denv=production

默认的采用properties中的配置,不同的环境采用指定的参数


多环境需要注意的点:

  1. 在切换环境时,不能改动源代码,如操作系统,线上线下,切换数据库等
  2. 源代码独立于环境配置,或配置文件独立,或切换环境名称
  3. 环境所有配置独立,需独立server管理
  4. 环境名称切换,则可扩展性不强,但适应性强,管理方便

raspberry 网络设置

今天调了一天 raspberry pi 的网络设置

测试结论如下

  1. raspberry pi的USB确实有问题, 插拔都会引起系统重启, 尤其是TTL2USB以及USB网卡
  2. usb网卡在TTL模式下时, 可以设置成功, 拔掉TTL后, 自动重启, 然后就连不上了, 再接上TTL, 网络又好了, 很怪
  3. 有线网卡, DHCP下总是不成功, 设置死IP后, 就成功了, 可以断掉TTL, 重启后,依然正常
  4. 有线网卡, DHCP下也是可以成功的, 需要在rc.local中添加 dhclient eth0

正常的/etc/network/interfaces 如下

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
#iface eth0 inet dhcp
iface eth0 inet static
   address 192.168.1.8 
   netmask 255.255.255.0
   gateway 192.168.1.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

以上测试基于2013-02-09-wheezy-raspbian.img 只改动了 interfaces , 其余未动

dhcp的/etc/network/interfaces 如下

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

并在 /etc/rc.local中添加一行, 需在exit 0前 dhclient eth0

  1. 难道无线网卡也是同样的问题, 再试下

ubuntu下的apache

最近仔细的研究了下ubuntu的apache

ubuntu下的apache跟其它操作系统下的apache, 有很大的区别

ubuntu下安装apache

    sudo apt-get install apache2

ubuntu下启用apache的模块

   sudo a2enmod <modname>

ubuntu下的apache的设计, 有很大程度上, 是帮助程序员尽量的减少conf的改动 比如:

  1. 让apache启用一个模块 a) 我们可以看到apache下的模块,是以文件的形式存在的, mods-enables下, 多一个模块的引用, 就表示启用一个模块, 而全部的模块, 是保存在 mods-available中的 b) 这样设计的原因, 就在于, 启用以及停用模块, 简化为文件的操作 c) 这样, apt-get,a2enmod这样的命令行,会更方便的执行命令, 否则要用正则匹配conf文件, 复杂麻烦,易出错, 而且耦合在了一起, 不利于apache的conf版本升级
  2. 让apache启用一个站点 同上面的设计一样, 站点也是使用 sites-available 以及 sites-enables 来管理的
  3. conf.d 的设计 a) 使用 conf.d 目录的设计, 让增加以及修改 apache2.conf 文件的方式, 改为了文件操作 b) 比如支持一个proxy的, 或者 Redirect 类的, 可以简化增加一个文件配置
  4. 利用别名的技术 a) 增加一个 phpmyadmin
      sudo ln -s  /usr/share/phpmyadmin  /var/www/phpmyadmin
    

    b) 或者自定义的代码库

      sudo ln -s  /home/admin/workspace  /var/www/workspace
    
      sudo ln -s  /home/admin/.m2/repository      /var/www/maven2
    
  5. 使用 .htaccess 将 .htaccess 打包在代码库里, 统一使用上面的别名部署, 统一代码管理, 减少与 apache 的相关配置文件的耦合
  6. 使用 .htpasswd 这其实也是一个不错的实践

ubuntu下安装phpmyadmin

其实ubuntu下安装phpmyadmin很简单

sudo apt-get install phpmyadmin

然而,装完之后的配置, 就让人容易出错了 起初我一直在修改 /usr/share/phpmyadmin/config.inc.php 然而,不是的,正确的位置在 /etc/phpmyadmin/config.inc.php, 而它又 include 了 /var/lib/phpmyadmin/config.inc.php 我们需要修改的文件, 应该是 /var/lib/phpmyadmin/config.inc.php

事实上, 我们没有必要手工去修改 config.inc.php 我们可以这样配置 http://localhost/phpmyadmin/setup/

有两个命令可以帮助我们

  • pma-configure
  • pma-secure 这两个命令, 都没有参数, 作用相反, 一个为打开配置开关, 另一个为关闭配置,禁止修改 当我们需要修改时, 就执行pma-configure, 修改完后,执行 pma-secure 当然, 这两个命令都需要 sudo 权限

于是整体流程如下: install phpmyadmin -> pma-configure -> /phpmyadmin/setup -> pma-secure

当然, 我们需要将phpmyadmin放置在apache下面, 或者 nginx下

sudo ln -s /usr/share/phpmyadmin  /var/www/

事实上, 上面的步骤也是多余的 看看 /etc/phpmyadmin/apache.conf , 你就明白了

Alias /phpmyadmin /usr/share/phpmyadmin

而且还有别的配置


这么多的内容, 其实你可以从这里看出点端倪来

dpkg -L phpmyadmin

这样, 你可以看到 phpmyadmin到底在硬盘上装了什么文件

ubuntu 支持无线网卡

在cubieboard上测试了下无线网卡, ubuntu上也应该是适用的

要求:

sudo apt-get install wpasupplicant

插上无线网卡后, 在ifconfig里看到了wlan0

然后在 /etc/network/interfaces 里添加四行即可, 完整的见下

auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet dhcp   
wpa-ssid  <you wlan ssid>
wpa-psk   <your wlan password>

然后重启网络生效

//关闭再开启wlan0
sudo ifdown wlan0
sudo ifup wlan0

//或者重启网络
sudo service networking stop
sudo service networking start

//或者重启,有时需要执行两次, 执行时会有提示
sudo service networking restart
  • 网上说的wpa打头的各类配置经测试可以省略, 我这里是 tp-link wpa2-psk的安全配置
  • wpa-psk 也可以用密文, 有命令可以生成

参考文档: http://ubuntuforums.org/showthread.php?t=318539

后记: 还有一种实现方案比较繁琐 使用了wpa_supplicant守护进程及配置文件的做法, 比较麻烦, 不过, 可用于启动后再插上网卡的情况 比如: http://onefishum.blog.163.com/blog/static/5184730520131174170755/ 如果按文中所说,生成rc.local后,得停止networking,用守护进程安装后,再启动networking,然后依赖于networking的dbus,avahi-deamon还得再启动一次, 这个方式不适合rc.local 无线网卡配置应该是在系统初始化时完成的, /etc/network/interfaces正好 所以文中的方法,适合, 系统已经正常运行时, 再插入的无线网卡配置

或者: 这篇也可以 比如: http://www.cnitblog.com/luofuchong/archive/2010/05/20/66251.html

精简配置, 来自于 http://www.raspberrypi.org/phpBB3/viewtopic.php?f=27&t=7592

ubuntu name server

我们在ubuntu下经常会遇到以下问题

  1. windows下ping ubuntu的机器名ping不到
  2. ubuntu下ping windows下的机器名 ping 不到
  3. ubuntu下ping ubuntu下的机器名ping不到

以上就是碰到了name server的问题了

首先, 我们要理清楚以下几个问题

  1. windows是如何根据name寻找ip的
  2. ubuntu是如何根据name寻找ip的
  3. mac呢

name到ip的映射有以下几个方式

  1. /etc/hosts的方式, 用户自行配置的, 优先级最高
  2. wins windows用于解析名字的服务
  3. mdns 是apple发明的, ubuntu下也可以使用
  4. dns服务, 通常由ISP提供, 一般局域网搜不到, 就要去外网搜了 另外: wins 的服务, 有时会有域服务器来提供服务

由此: windows 与 ubuntu 下互通name, 需要敲定要走 wins还是mdns

  1. windows 下默认支持 wins 服务, 有服务器,也有客户端支持
  2. ubuntu下走wins, 可以安装 samba , 由 nmbd服务器提供服务端
  3. ubuntu 下 ping wins, 可以在 smb.conf 下配置 wins server
  4. windows 下走 mdns 服务, 可以安装apple的itunes, 由bonjour提供服务端
  5. ubuntu 下安装 mdns服务, 可使用 avahi-demon 来提供 mdns 服务
  6. ubuntu 下解析 mdns, 可以在 /etc/resolv.conf 中配置, 由 dnsmasq 来提供解析
  7. mac 上默认提供了 mdns 与 wins

因此, 不动 windows, 可以在 ubuntu 中安装以下服务

sudo apt-get install samba
sudo apt-get install avahi-daemon
sudo apt-get install libnss-mdns             ##necessary?

sudo vi /etc/nsswitch.conf   (hosts:          files mdns4_minimal dns)
sudo vi /etc/samba/smb.conf

sudo service smbd restart
sudo service nmbd restart
//sudo service avahi-daemon restart
sudo dnsmasq

sudo service networking restart

如果ubuntu一直ping不通mac.local or ipad.local,请尝试重启 这样, 在 windows, ubuntu, mac 下互相ping hostname就OK了 补: mdns 的ping时, 要加 .local

相关的命令有: ping nslookup host dig nbtscan nmblookup nmap sudo netstat -ntp sudo ss -nlt

相关的文件有: /etc/resolv.conf /etc/nsswitch.conf /etc/NetworkManager/NetworkManager.conf https://wiki.archlinux.org/index.php/Avahi