月份: 2014-01

winserver 下注册 mysql 服务

布署了个免安装式的mysql 注册服务让它自启动

bin\mysqld --install mysql --defaults-file="%cd%\my.ini"

当然my.ini 的位置视当前的情况定咯
然后 netstart mysql 启动就好了

mysql 存储过程游标相关

定义本地变量
DECLARE idcard varchar(128);
定义游标
DECLARE user_cursor CURSOR FOR
SELECT card_no FROM t_user where last_login_time >= “2013-01-01”;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_users =1;
SET no_more_users =0;
打开游标
OPEN user_cursor;
循环读取游标的内容
REPEAT
FETCH user_cursor INTO idcard ;
update t_jifen set score=score*1.5 where card_no=@idcard ;
循环结束
UNTIL no_more_users
END REPEAT;
关闭游标
CLOSE user_cursor;

终于找到图片模糊加载的方式了

终于找到这个方式了。

GIF、JPEG有种格式可以在web 页面上,先模糊再清晰地加载。
其中GIF叫做交错GIF, JPEG则是渐进(Progressive Encoding)JPEG。
用PS进行保存的时候,alt+ctrl+shift+s 可以保存成 web 或设备所用格式 。格式选择jpeg,然后在 checkbox 中选择“连续”,就可以保存成渐进式的JPEG图像了。
img-fuzzloading-1

给Blog 加了一个css3 的效果

参见右边栏的标签

#sidebar li a{
    -webkit-transition: padding .4s;
    -moz-transition: padding .4s;
    -o-transition: padding .4s;
    transition: padding .4s;
}
#sidebar li a:hover{
    padding-left: 6px;
}

windows 下共享wifi 无线网络

net start wlansvc
netsh wlan set hostednetwork mode=allow  ssid=kj key=12345678
netsh wlan start hostednetwork

关于RandomAccess 接口

RamdomAccess接口是一个声明接口,接口内并没有声明任何的方法。
该接口只是为了标示实现了该接口的类是否推荐随机访问的遍历方式。
在实现了List 的接口的类中,有 LinkedList 和 ArrayList,其中ArrayList 实现了 RandomAccess 接口,而 LinkedList 没有。它们之间有什么不同呢?

      // ArrayList
        int num = 5000000;
        List<Integer> arrayList = new ArrayList<Integer>(num);
        for(int i=0;i<num ;i++){
          arrayList.add(1);
        }
        long time1 =System.currentTimeMillis();
        for (int i = 0, size = arrayList.size(); i < size; i++) {
            arrayList.get(i);
        }
        long time2 = System.currentTimeMillis();
        System.out.println(time2-time1); //34
        for (Integer integer : arrayList) {
        }
        long time3 = System.currentTimeMillis();
        System.out.println(time3-time2);//158
        //LinkedList
        List<Integer> linkedList = new LinkedList<Integer>();
        for (int i = 0, size = arrayList.size(); i < size; i++) {
          linkedList.add(i);
        }
        long time4 = System.currentTimeMillis();
        for (Integer integer : linkedList) {
        }
        long time5 = System.currentTimeMillis();
        System.out.println(time5-time4);//65
        for (int i = 0; i < num/200; i++) {  //这里除以200吧,要不然真的很久。
          linkedList.get(i);
        }
        long time6 = System.currentTimeMillis();
        System.out.println(time6-time5);//1449

结果会发现,声明了 RandomAccess 接口的 ArrayList 用顺序取值来遍历要比迭代器的方式要快。
而没有声明 RandomAccess 接口的 LinkedList 则迭代器遍历要比顺序取值快很多很多。
Java中的foreach语法是iterator(迭代器)的变形用法。但迭代器是需要知道两个相邻元素之间的关系的,不然怎么提供hasNext的支持呢?就是因为上一个元素要判断下一个元素是否存在的这种关系,违背了ArrayList随机存取的特性,所以在ArrayList 中用迭代器要比顺序遍历要慢。
注:foreach(Integer i : arrayList)  编译再反编译后得到下句:
for (Iterator localIterator1 = arrayList.iterator(); localIterator1.hasNext(); localInteger1 = (Integer)localIterator1.next());
而LinkedList 在随机访问时,它需要沿着双向链表去找到对应位置的元素,其效率较之ArrayList 内在实现的数组下标取元素访问,要低得多。
最后:RandomAccess 接口的声明与否全凭自觉。就foreach 而言,JDK似乎没有对它进行优化。
发表于 30/08/2013 , 11:39 于分类 .

Java 中使用 javascript 等脚本语言实现非编译逻辑分离

有些常改变的逻辑,或者配置性的逻辑,比如最近在项目中遇到的,开发环境与正式环境的 ip 地址,端口的不同。以及启动项、模块 Lazy loading 的部分代码,介于配置文件与代码之间的很多模糊的地方,其实可以用JRE 自带的 ScriptEngine 实现。
这部分半配置半程序的代码可以用JS 写到固定的相对目录下。用 FileReader 加载然后执行就可以了。
因为是动态语言,无需编译,在布署时可以直接修改部分参数,还可以用 require,甚至可以继承等一些高级语言语法来实现DRY(don’t repeat yourself)。
示例如下:

public class ScriptTest {
  public static void main(String[] args) throws Exception{
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
    Bindings bind = engine.createBindings();
    bind.put("c", 3);
    engine.setBindings(bind, ScriptContext.ENGINE_SCOPE);
    engine.eval(jsStr);
//    engine.eval(new FileReader("f:/aaa.txt"));
    if(engine instanceof Invocable){
      Invocable in = (Invocable) engine;
      Double result = (Double) in.invokeFunction("test", 1,2);
      System.out.println(result);
    }
  }
  static String jsStr = "function test(a,b){ return (a+b)*c;}";
}

发表于 03/09/2013 , 03:21 于分类 .

java 用 ffmpeg 截取视频图片与获取视频长度

  /**
   * 获取视频长度,生成缩略图
   * */
  public static int createThumb(String videoPath, String thumbPath)
  {
    //System.out.println(System.getProperty("java.home"));
    //FFMPEG_PATH = System.getProperty("user.dir")+"/WebRoot/WEB-INF/plugin/ffmpeg/ffmpeg.exe";
    try {
      /**
       * 获取视频时长,不需要的话可以只留 Runtime.getRunti... 一句
       * */
      int time = Integer.valueOf(CtrlFtpFile.getMediaTime(videoPath));
      if(time<=0)
        throw new IOException("长度过短");
          Runtime.getRuntime().exec(getCmdStr(videoPath, thumbPath));
          return time;
      } catch (IOException e) {
          e.printStackTrace();
      return 0;
      }
  }
  public static void main(String[] args) throws Exception
  {
    System.out.println(createThumb("F:\\aaa.rmvb" , "F:\\b.jpg"));
  }
  /**
   * ffmpeg 地址
   * */
  private static String FFMPEG_PATH = "D:/ffmpeg/ffmpeg.exe";
  /**
   * 生成 CMD 命令
   * */
  private static String getCmdStr(String videoPath ,String thumbPath)
  {
     return FFMPEG_PATH + " -i " + videoPath + "  -ss 0.5 -vframes 1 -r 1 -ac 1 -ab 2 -s 160*120 -f  image2 " + thumbPath;
  }

将下包里的 dll 放进 jre(jdk)/bin里,如果仅获取视频长度,可以不放。
注:该dll来自   http://jatula.javaeye.com/

java 原生的方法发送 http Post 请求

使用POST 命令时,并不需在URL 中添加任何参数,而从URLConnection 中获取输出流,将name/value 对写入该流中,需对这些值进行URL 编码,并用& 字符将它们隔开。下面将介绍这个过程:
首先创建一个URLConnection 对象
URL url = new URL(“http://host/script”);
URLConnection connection = url.openConnection();
然后调用setDoOutput 方法建立一个用于输出的连接。
connection.setDoOutput(true);
接着,调用getOutputStream 方法获得一个流,可以通过这个流向服务器发送数据。如果要向服务器发送文本信息,那么可以非常方便地将流包装在PrintWriter 对象中。
PrintWriter out = new PrintWriter(connection.getOutputStream());
现在可以向服务器发送数据了:
out.print(name1+”=” + URLEncoder.encode(value1,”UTF-8”)+”&”);
out.print(name2 + “=” URLEncoder.encode(value2,”UTF-8”));
之后,关闭输出流。
out.close();
最后调 用getInputStream 方法读取服务器的响应。如果在读取过程中碰到脚本运行错误,那么服务器会返回一个错误页面。为了捕捉这个错误页,可以将URLConnection 对象转型为HttpURlConnection 类开调用它的getErrorStream 方法:
InputStream err = ((HttpURLConnection)connection.getErrorStream();

 
看来还是封装过的 Apache 包里的 HttpPost 好用,再封装一次更好用了,哈哈

mysql 的权限赋予,备忘一下

grant [all | all privileges  |select | update … ]  #权限  all privileges = all
on dbname.table_name [*] #库名表名
to somebody@111.111.111.%  #用户名@IP端,可用%代替
identified by ‘123’ #登录密码