gaojingsong http://doc.okbase.net/gaojingsong 【SSDB常用命令列表】 http://doc.okbase.net/gaojingsong/archive/294440.html gaojingsong 2018/4/21 11:23:13

命令(命令不区分大小写, 推荐使用小写!)



 

1、Server

auth password

向服务器校验访问密码.

dbsize

返回数据库占用空间的近似值, 以字节为单位.

flushdb [type]

删除 SSDB 服务器的所有数据.

info [opt]

返回服务器的信息.

 

IP Filter

list_allow_ip rule

显示允许连接的IP规则.

 

add_allow_ip rule

新增一条允许连接的IP规则.

 

del_allow_ip rule

删除指定的一条允许连接的IP规则.

 

list_deny_ip rule

显示拒绝连接的IP规则.

 

add_deny_ip rule

新增一条拒绝连接的IP规则.

 

del_deny_ip rule

删除指定的一条拒绝连接的IP规则.

 

 

2、Key Value

set key value

设置指定 key 的值内容.

 

setx key value ttl

设置指定 key 的值内容, 同时设置存活时间.

 

setnx key value

当 key 不存在时, 设置指定 key 的值内容. 如果已存在, 则不设置.

 

expire key ttl

设置 key(只针对 KV 类型) 的存活时间.

 

ttl key

返回 key(只针对 KV 类型) 的存活时间.

 

get key

获取指定 key 的值内容.

 

getset key value

更新 key 对应的 value, 并返回更新前的旧的 value.

 

del key

删除指定的 key.

 

incr key [num]

使 key 对应的值增加 num.

 

exists key

判断指定的 key 是否存在.

 

getbit key offset

获取字符串内指定位置的位值(BIT).

 

setbit key offset val

设置字符串内指定位置的位值(BIT), 字符串的长度会自动扩展.

 

bitcount key [start] [end]

计算字符串的子串所包含的位值为 1 的个数.

 

countbit key start size

计算字符串的子串所包含的位值为 1 的个数.

 

substr key start size

获取字符串的子串.

 

strlen key

计算字符串的长度(字节数).

 

keys key_start key_end limit

列出处于区间 (key_start, key_end] 的 key 列表.

 

rkeys key_start key_end limit

列出处于区间 (key_start, key_end] 的 key 列表, 反向.

 

scan key_start key_end limit

列出处于区间 (key_start, key_end] 的 key-value 列表.

 

rscan key_start key_end limit

列出处于区间 (key_start, key_end] 的 key-value 列表, 反向.

 

multi_set key1 value1 key2 value2 ...

批量设置一批 key-value.

 

multi_get key1 key2 ...

批量获取一批 key 对应的值内容.

 

multi_del key1 key2 ...

批量删除一批 key 和其对应的值内容.

 

 

3、Hashmap

hset name key value

设置 hashmap 中指定 key 对应的值内容.

 

hget name key

获取 hashmap 中指定 key 的值内容.

 

hdel name key

删除 hashmap 中的指定 key(删除整个 hashmap 用 hclear).

 

hincr name key [num]

使 hashmap 中的 key 对应的值增加 num.

 

hexists name key

判断指定的 key 是否存在于 hashmap 中.

 

hsize name

返回 hashmap 中的元素个数.

 

hlist name_start name_end limit

列出名字处于区间 (name_start, name_end] 的 hashmap.

 

hrlist name_start name_end limit

像 hrlist, 逆序.

 

hkeys name key_start key_end

列出 hashmap 中处于区间 (key_start, key_end] 的 key 列表.

 

hgetall name

返回整个 hashmap.

 

hscan name key_start key_end limit

列出 hashmap 中处于区间 (key_start, key_end] 的 key-value 列表.

 

hrscan name key_start key_end limit

像 hscan, 逆序.

 

hclear name

删除 hashmap 中的所有 key.

 

multi_hset name key1 value1 key2 value2 ...

批量设置 hashmap 中的 key-value.

 

multi_hget name key1 key2 ...

批量获取 hashmap 中多个 key 对应的权重值.

 

multi_hdel name key1 key2 ...

指删除 hashmap 中的 key.

 

 

4、Sorted Set

zset name key score

设置 zset 中指定 key 对应的权重值.

 

zget name key

获取 zset 中指定 key 的权重值.

 

zdel name key

获取 zset 中的指定 key.

 

zincr name key num

使 zset 中的 key 对应的值增加 num. 参数 num 可以为负数. 如果原来的值不是整数(字符串形式的整数), 它会被先转换成整数.

 

zexists name key

判断指定的 key 是否存在于 zset 中.

 

zsize name

返回 zset 中的元素个数.

 

zlist

列出名字处于区间 (name_start, name_end] 的 zset.

 

zrlist

像 zlist, 逆序.

 

zkeys name key_start score_start score_end limit

列出 zset 中的 key 列表.

 

zscan name key_start score_start score_end limit

列出 zset 中处于区间 (key_start+score_start, score_end] 的 key-score 列表.

 

zrscan name key_start score_start score_end limit

像 zscan, 逆序.

 

zrank name key

返回指定 key 在 zset 中的排序位置(排名), 排名从 0 开始.

 

zrrank name key

像 zrank, 逆序.

 

zrange name offset limit

根据下标索引区间 [offset, offset + limit) 获取 key-score 对, 下标从 0 开始.

 

zrrange name offset limit

像 zrange, 逆序.

 

zclear name

删除 zset 中的所有 key.

 

zcount name start end

返回处于区间 [start,end] key 数量.

 

zsum name start end

返回 key 处于区间 [start,end] 的 score 的和.

 

zavg name start end

返回 key 处于区间 [start,end] 的 score 的平均值.

 

zremrangebyrank name start end

删除位置处于区间 [start,end] 的元素.

 

zremrangebyscore name start end

删除权重处于区间 [start,end] 的元素.

 

zpop_front name limit

从 zset 首部删除 limit 个元素.

 

zpop_back name limit

从 zset 尾部删除 limit 个元素.

 

multi_zset name key1 score1 key2 score2 ...

批量设置 zset 中的 key-score.

 

multi_zget name key1 key2 ...

批量获取 zset 中多个 key 对应的权重值.

 

multi_zdel name key1 key2 ...

批量删除 zset 中的 key.

 

 

 

5、List

qpush_front name item1 item2 ...

往队列的首部添加一个或者多个元素.

 

qpush_back name item1 item2 ...

往队列的尾部添加一个或者多个元素.

 

qpop_front name size

从队列首部弹出最后一个或者多个元素.

 

qpop_back name size

从队列尾部弹出最后一个或者多个元素.

 

qpush name item1 item2 ...

是 `qpush_back` 的别名..

 

qpop name size

是 `qpop_front` 的别名..

 

qfront name

返回队列的第一个元素.

 

qback name

返回队列的最后一个元素.

 

qsize name

返回队列的长度.

 

qclear name

清空一个队列.

 

qget name index

返回指定位置的元素.

 

qset name index val

更新位于 index 位置的元素.

 

qrange name offset limit

返回下标处于区域 [offset, offset + limit] 的元素.

 

qslice name begin end

返回下标处于区域 [begin, end] 的元素. begin 和 end 可以是负数

 

qtrim_front name size

从队列头部删除多个元素.

 

qtrim_back name size

从队列头部删除多个元素.

 

qlist name_start name_end limit

列出名字处于区间 (name_start, name_end] 的 queue/list.

 

qrlist name_start name_end limit

像 qlist, 逆序.

  • 大小: 78.7 KB
]]> 【SSDB安装】 http://doc.okbase.net/gaojingsong/archive/294436.html gaojingsong 2018/4/21 10:35:22

1、下载文件



 

2、安装文件

[root@master ssdb]# ls

ssdb-master.zip

[root@master ssdb]# unzip ssdb-master.zip 

 

[root@master ssdb]# ls

ssdb-master  ssdb-master.zip

[root@master ssdb]# cd ssdb-master

[root@master ssdb-master]# ls

api  build.sh  ChangeLog  deps  Dockerfile  docs  LICENSE  Makefile  README.md  src  ssdb.conf  ssdb_slave.conf  tools  version

[root@master ssdb-master]# make

g++ -o leveldb-import leveldb-import.o ../src/net/link.o ../src/net/fde.o ../src/util/log.o ../src/util/bytes.o   "/opt/ssdb/ssdb-master/deps/leveldb-1.20/out-static/libleveldb.a" "/opt/ssdb/ssdb-master/deps/snappy-1.1.0/.libs/libsnappy.a" "/opt/ssdb/ssdb-master/deps/jemalloc-4.1.0/lib/libjemalloc.a" -pthread -lrt

g++ -o ssdb-migrate ssdb-migrate.o ../api/cpp/libssdb-client.a ../src/util/libutil.a

make[1]: Leaving directory `/opt/ssdb/ssdb-master/tools'

 

[root@master ssdb-master]# ls

api  build_config.mk  build.sh  ChangeLog  deps  Dockerfile  docs  LICENSE  Makefile  README.md  src  ssdb.conf  ssdb-server  ssdb_slave.conf  tools  var  var_slave  version

[root@master ssdb-master]# cd src/

[root@master src]# ls

backend_dump.cpp  backend_sync.h  cluster.h            cluster.o          include.h         proc_cluster.o  proc_kv.o       proc_zset.o  slave.cpp  ssdb-server.cpp

backend_dump.h    backend_sync.o  cluster_migrate.cpp  cluster_store.cpp  Makefile          proc_hash.cpp   proc_queue.cpp  serv.cpp     slave.h    ssdb-server.o

backend_dump.o    client          cluster_migrate.h    cluster_store.h    net               proc_hash.o     proc_queue.o    serv.h       slave.o    util

backend_sync.cpp  cluster.cpp     cluster_migrate.o    cluster_store.o    proc_cluster.cpp  proc_kv.cpp     proc_zset.cpp   serv.o       ssdb       version.h

[root@master src]# cd ../tools/

[root@master tools]# ls

leveldb-import      Makefile          ssdb-bench.cpp  ssdb-cli      ssdb-dump      ssdb-iterate.php  ssdb-migrate.o   ssdb-repair.o         unittest.php

leveldb-import.cpp  redis-import.php  ssdb-bench.o    ssdb-cli.bat  ssdb-dump.cpp  ssdb-migrate      ssdb-repair      ssdb.sh

leveldb-import.o    ssdb-bench        ssdb_cli        ssdb-cli.cpy  ssdb-dump.o    ssdb-migrate.cpp  ssdb-repair.cpp  test_slow_client.php

[root@master tools]# cat ssdb.sh 

#!/bin/sh

#

# chkconfig: 2345 64 36

# description: SSDB startup scripts

#

ssdb_root=/usr/local/ssdb

ssdb_bin=$ssdb_root/ssdb-server

# each config file for one instance

# configs="/data/ssdb_data/test/ssdb.conf /data/ssdb_data/test2/ssdb.conf"

configs="/data/ssdb_data/test/ssdb.conf"

 

 

if [ -f /etc/rc.d/init.d/functions ]; then

        . /etc/rc.d/init.d/functions

fi

 

start() {

        for conf in $configs; do

                $ssdb_bin $conf -s restart -d

        done

}

 

stop() {

        for conf in $configs; do

                $ssdb_bin $conf -s stop -d

        done

}

 

# See how we were called.

case "$1" in

    start)

        start

        ;;

    stop)

        stop

        ;;

    restart)

        stop

        start

        ;;

    *)

        echo $"Usage: $0 {start|stop|restart}"

        ;;

esac

exit $RETVAL

[root@master tools]# 

[root@master ssdb-master]# ./ssdb-server 

ssdb-server 1.9.6

Copyright (c) 2012-2015 ssdb.io

 

Usage:

    ./ssdb-server [-d] /path/to/ssdb.conf [-s start|stop|restart]

Options:

    -d    run as daemon

    -s    option to start|stop|restart the server

    -h    show this message

[root@master ssdb-master]# ./ssdb-server  ssdb.conf -s start

ssdb-server 1.9.6

Copyright (c) 2012-2015 ssdb.io

 

[root@master ssdb-master]# ./ssdb-server  ssdb.conf -s start -d

ssdb-server 1.9.6

Copyright (c) 2012-2015 ssdb.io

 

[root@master ssdb-master]# 

 

 

 

 

3、安装验证

 

[root@master ~]# netstat -tnpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   

tcp        0      0 0.0.0.0:869                 0.0.0.0:*                   LISTEN      2807/rpc.statd      

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2766/portmap        

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      3081/cupsd          

tcp        0      0 127.0.0.1:8888              0.0.0.0:*                   LISTEN      14572/ssdb-server   

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      3139/sendmail: acce 

tcp        0      0 :::22                       :::*                        LISTEN      3057/sshd           

[root@master ssdb-master]# cd tools/

[root@master tools]# ./ssdb-cli

ssdb (cli) - ssdb command line tool.

Copyright (c) 2012-2016 ssdb.io

 

'h' or 'help' for help, 'q' to quit.

 

ssdb-server 1.9.6

 

ssdb 127.0.0.1:8888> info

version

        1.9.6

links

        1

total_calls

        1

dbsize

        0

binlogs

            capacity : 20000000

            min_seq  : 0

            max_seq  : 0

serv_key_range

            kv  : "" - ""

            hash: "" - ""

            zset: "" - ""

            list: "" - ""

data_key_range

            kv  : "" - ""

            hash: "" - ""

            zset: "" - ""

            list: "" - ""

leveldb.stats

                                       Compactions

        Level  Files Size(MB) Time(sec) Read(MB) Write(MB)

        --------------------------------------------------

 

17 result(s) (0.000 sec)

(0.000 sec)

ssdb 127.0.0.1:8888> 

 

  • 大小: 236.5 KB
]]> 【SSDB 介绍】 http://doc.okbase.net/gaojingsong/archive/292392.html gaojingsong 2018/4/18 8:08:33

SSDB一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.

 

特性

1)替代 Redis 数据库, Redis 的 100 倍容量

2)LevelDB 网络支持, 使用 C/C++ 开发

3)Redis API 兼容, 支持 Redis 客户端

4)适合存储集合数据, 如 list, hash, zset...

5)客户端 API 支持的语言包括: C++, PHP, Python, Java, Go

6)持久化的队列服务

7)主从复制, 负载均衡

 

SSDB 数据类型

SSDB 支持三种数据类型, 分别是 KV(key-value), Hashmap(map), Zset(sorted set). 三种数

据类型处于不同的命名区间, 所以不同类型的数据可以起相同的名字, 但不建议这么做



 

 

SSDBJ是一款支持SSDB NoSQL数据库集群的驱动。

功能: 

1、ssdb数据库连接池 

2、支持多个SSDB数据库的master-slave集群 

3、支持集群内部的master和slave的负载均衡,负载均衡暂时支持4中方式(Random round_robin round_robin_weight random_weight) 

4、实现了读写分离 

5、支持集群内slave获取not_found的情况下从master再次直接获取 

6、支持同步未完成时slave读取error的情况下,从master尝试或者重复在slave中尝试。尝试次数

  • 大小: 62.4 KB
]]> 【Android之Picasso图形缓存库】 http://doc.okbase.net/gaojingsong/archive/289490.html gaojingsong 2018/4/15 11:11:24

 A powerful image downloading and caching library for Android

 

 

Images add much-needed context and visual flair to Android applications. Picasso allows for hassle-free image loading in your application—often in one line of code!

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

Many common pitfalls of image loading on Android are handled automatically by Picasso:

  • Handling ImageView recycling and download cancelation in an adapter.
  • Complex image transformations with minimal memory use.
  • Automatic memory and disk caching.

许多在Android上图片加载常见的的陷阱都被Picasso自动的处理了:

1)在adaper中处理ImageView循环和取消下载

2)对复杂图像进行转换,使其占用最小的内存

3)自动的内存和磁盘缓存

 

 

Features

ADAPTER DOWNLOADS

Adapter re-use is automatically detected and the previous download canceled.

 

IMAGE TRANSFORMATIONS

Transform images to better fit into layouts and to reduce memory size.

You can also specify custom transformations for more advanced effects.

 

PLACE HOLDERS

Picasso supports both download and error placeholders as optional features.

A request will be retried three times before the error placeholder is shown.

 

RESOURCE LOADING

Resources, assets, files, content providers are all supported as image sources.

 

Picasso.get().load(R.drawable.landing_screen).into(imageView1);

Picasso.get().load("file:///android_asset/DvpvklR.png").into(imageView2);

Picasso.get().load(new File(...)).into(imageView3);

 

DEBUG INDICATORS

 

For development you can enable the display of a colored ribbon which indicates the image source. Call setIndicatorsEnabled(true) on the Picasso instance.

特性

在Adapter中下载

自动检测Adapter重用并取消之前的下载

 

图片转换

转换图片以更好地适配布局并减少内存使用

你也可以指定定制的转换方式来实现更高级的效果

 

占位图

Picasso同时支持了下载和出错的占位图供用户选择

 

资源加载

支持Resources, assets, files, content providers作为图片源

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);

Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);

Picasso.with(context).load(new File(...)).into(imageView3);

 

调试指示

开发时可以打开彩带显示来指示图片源,在Picasso实例调用setIndicatorsEnabled(true)即可

 

Picasso功能

 1.加载速度快 
 2.资源消耗低 
 3.保证加载图片时不错位 
  4.加载图片类型丰富,支持网络图片以及各种本地图片如Asserts目录下,内容提供者提供的图片资源路径

Picasso策略

  1.加载速度快 
  标准的二级缓存(内存缓存+磁盘缓存)+Net 
  a.标配策略,MemoryCache+DiskCache+Net。提高加载速度,同时保证流量。 
  b.Net部分,兼顾单请求加载速度与多请求并发能力,从而提高整体加载速度。 
c.MemoryCache部分,通过Lru策略提高缓存效率。 
  2.资源消耗低 
  a.渲染适当尺寸图片来减少内存。 
  b.通过线程池来限制并发的图片加载线程,降低资源消耗。 
  c.请求相同图片的线程要合并,减少线程数。 
  3.加载图片类型丰富 
  Picasso内置针对不同的图片资源类型的各种handler 例如:网络下载图片:NetworkRequestHandler,Asserts目录下的图片资源:AssetRequestHandler 
 4.保证加载图片时不错位 
  Picasso维护了Map,Key为ImageView,Value为Action,每个ImageView均只对应一个Action。若获取的图片Action与ImageView不符合,则丢弃,等待正确的Action执行完。 

  • 大小: 44.8 KB
]]> 【微服务之Ribbon 服务消费(消费者)】 http://doc.okbase.net/gaojingsong/archive/289450.html gaojingsong 2018/4/15 10:42:48

1、启动微服务注册中心

永久链接: http://gaojingsong.iteye.com/blog/2411007

预览文章: 【微服务之Eureka服务注册发现】



 

2、启动微服务提供者

永久链接: http://gaojingsong.iteye.com/blog/2411019

预览文章: 【微服务之DiscoveryClient 服务注册(提供者)】



 

3、启动微服务消费者



 

4、结果验证

1)结果一



 

2)结果二



 

  • 大小: 95.2 KB
  • 大小: 112.1 KB
  • 大小: 114.9 KB
  • 大小: 93 KB
  • 大小: 93 KB
]]> 【MQTT 介绍】 http://doc.okbase.net/gaojingsong/archive/288526.html gaojingsong 2018/4/14 8:59:52

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。

 

 

MQTT特点

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

2、对负载内容屏蔽的消息传输;

3、使用 TCP/IP 提供网络连接;

4、有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

“至少一次”,确保消息到达,但消息重复可能会发生。

“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;

 

 

MQTT服务器有好多种

Apache-Apollo:一个代理服务器,在ActiveMQ基础上发展而来,可以支持STOMP、AMQP、MQTT、Openwire、SSL和WebSockets等多种协议,并且Apollo提供后台管理页面,方便开发者管理和调试。

EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器。

HiveMQ:一个企业级的MQTT代理,主要用于企业和新兴的机器到机器M2M通讯和内部传输,最大程度的满足可伸缩性、易管理和安全特性,提供免费的个人版。HiveMQ提供了开源的插件开发包。

Mosquitto:一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式。

]]>
【Android 之Orm框架】 http://doc.okbase.net/gaojingsong/archive/286370.html gaojingsong 2018/4/12 8:19:55

在开发Android应用时,保存数据有这么几个方式,

一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择)。

对于第一种方式,即本地数据存储,如嵌入式SQLite,你可以选择直接使用SQL语句、Content Provider 或 ORM(对象关系数据映射)。

对于 Android 应用的开发,主要是使用Java语言,所以适用于Java语言的一些ORM,也能移植于 Android 平台上。

 

下面是5个可用ORM的总体介绍:

1. OrmLite

OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。

官方网站:http://ormlite.com/sqlite_java_android_orm.shtml

 

2. SugarORM

SugarORM 是 Android 平台专用ORM。提供简单易学的APIs。可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化CRUD基本操作。

 

 

3. GreenDAO

当性能很重要时(数据访问频繁),GreenDao是一个很快的解决方案,它能够支持数千条记录的CRUD每秒,和OrmLite相比,GreenDAO要快几乎4.5倍。(准确数据请自行benchmark)。

 

greenDAO is an open source Android ORM making development for SQLite databases fun again. It relieves developers from dealing with low-level database requirements while saving development time. SQLite is an awesome embedded relational database. Still, writing SQL and parsing query results are quite tedious and time-consuming tasks. greenDAO frees you from these by mapping Java objects to database tables (called ORM, “object/relational mapping”). This way you can store, update, delete, and query for Java objects using a simple object oriented API.

 

greenDAO’s Features at a glance

  • Maximum performance (probably the fastest ORM for Android); our benchmarks are open sourced too
  • Easy to use powerful APIs covering relations and joins
  • Minimal memory consumption
  • Small library size (<100KB) to keep your build times low and to avoid the 65k method limit
  • Database encryption: greenDAO supports SQLCipher to keep your user’s data safe
  • Strong community: More than 5.000 GitHub stars show there is a strong and active community

 

 

4. Active Android

Active Record(活动目录)是Yii、Rails等框架中对ORM实现的典型命名方式。Active Android 帮助你以面向对象的方式来操作SQLite。

在你的项目中包含Active Android,你需要在项目的 /libs 目录下添加一个jar文件代码并使用Maven进行编辑。

 

 

 

5. Realm

Realm 是一个将可以使用的Android ORM,基于C++编写,直接运行在你的设备硬件上(不需要被解释),因此运行很快。它同时是开源跨平台的,iOS的代码可以在GitHub找到,你还可以找到Objective-C以及Swift编写的Realm使用实例。

官方网站:http://realm.io/

 

ORM框架用到的实现方式主要有几种:

1.注解(运行时 Annotation,编译时 Annotation)

2.反射

3.直接生成代码

]]>
【JAVA之缩略图】 http://doc.okbase.net/gaojingsong/archive/279479.html gaojingsong 2018/4/6 17:17:25

缩略图介绍

缩略图:代表网页上或计算机中图片经压缩方式处理后的小图 ,其中通常会包含指向完整大小的图片的超链接。缩略图用于在 Web 浏览器中更加迅速地装入图形或图片较多的网页。因其小巧,加载速度非常快,故用于快速浏览。相当于图片文件预览及目录的作用。 计算机中,Windows在第一次显示缩略图时,先读取当前目录中的“Thumbs.db"这个文件(隐藏文件),其实这是一个缩略图数据库,从而来判断是否有大图片的缩略图。

 

关闭Windows缩略图缓存

在Windows系统中,为了提高被频繁浏览的缩略图的显示速度,系统会将这些被显示过的图片进行缓存,以便下次打开时直接读取缓存中的信息。可以通过编辑组策略来关闭缩略图缓存的功能,以Windows XP系统为例介绍方法:

在“组策略编辑器”窗口中依次展开“用户配置”→“管理模板”→“Windows组件”目录,并选中“Windows资源管理器”选项。在右窗格中将“关闭缩略图的缓存”策略置于“已启用”状态。

JAVA之缩略图

 

package pic;

 

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.Arrays;

 

import javax.imageio.ImageIO;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

public class ImageUtil {

 

    private Logger log = LoggerFactory.getLogger(getClass());

 

    private static String DEFAULT_PREVFIX = "thumb_";

    private static Boolean DEFAULT_FORCE = false;//建议该值为false

 

    /**

     * <p>Title: thumbnailImage</p>

     * <p>Description: 依据图片路径生成缩略图 </p>

     * @param imagePath    原图片路径

     * @param w            缩略图宽

     * @param h            缩略图高

     * @param prevfix    生成缩略图的前缀

     * @param force        是否强制依照宽高生成缩略图(假设为false,则生成最佳比例缩略图)

     */

    public void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force){

        File imgFile = new File(imagePath);

        if(imgFile.exists()){

            try {

                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]

                String types = Arrays.toString(ImageIO.getReaderFormatNames());

                String suffix = null;

                // 获取图片后缀

                if(imgFile.getName().indexOf(".") > -1) {

                    suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);

                }// 类型和图片后缀所有小写,然后推断后缀是否合法

                if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0){

                    log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);

                    return ;

                }

                log.debug("target image's size, width:{}, height:{}.",w,h);

                Image img = ImageIO.read(imgFile);

                if(!force){

                    // 依据原图与要求的缩略图比例,找到最合适的缩略图比例

                    int width = img.getWidth(null);

                    int height = img.getHeight(null);

                    if((width*1.0)/w < (height*1.0)/h){

                        if(width > w){

                            h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0)));

                            log.debug("change image's height, width:{}, height:{}.",w,h);

                        }

                    } else {

                        if(height > h){

                            w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0)));

                            log.debug("change image's width, width:{}, height:{}.",w,h);

                        }

                    }

                }

                BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

                Graphics g = bi.getGraphics();

                g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);

                g.dispose();

                String p = imgFile.getPath();

                // 将图片保存在原文件夹并加上前缀

                ImageIO.write(bi, suffix, new File(p.substring(0,p.lastIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName()));

                log.debug("缩略图在原路径下生成成功");

            } catch (IOException e) {

               log.error("generate thumbnail image failed.",e);

            }

        }else{

            log.warn("the image is not exist.");

        }

    }

 

    public static void main(String[] args) {

        new ImageUtil().thumbnailImage("C:/china-drm/20150314_124204.jpg", 200, 300,DEFAULT_PREVFIX,DEFAULT_FORCE);

    }

}

 

结果验证:

1)生成尺寸为300*400的图片



 

2)图片大小28KB,比原图小很多



 

3)图片预览



 

 

  • 大小: 36.9 KB
  • 大小: 40.9 KB
  • 大小: 41.2 KB
]]> 【FFmpeg介绍】 http://doc.okbase.net/gaojingsong/archive/278943.html gaojingsong 2018/4/6 9:06:59

FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。

 

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

 

FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created. It supports the most obscure ancient formats up to the cutting edge. No matter if they were designed by some standards committee, the community or a corporation. It is also highly portable: FFmpeg compiles, runs, and passes our testing infrastructure FATE across Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris, etc. under a wide variety of build environments, machine architectures, and configurations.

 

It contains libavcodec, libavutil, libavformat, libavfilter, libavdevice, libswscale and libswresample which can be used by applications. As well as ffmpeg, ffplay and ffprobe which can be used by end users for transcoding and playing.

 

FFmpeg Libraries for developers

libavutil is a library containing functions for simplifying programming, including random number generators, data structures, mathematics routines, core multimedia utilities, and much more.

libavcodec is a library containing decoders and encoders for audio/video codecs.

libavformat is a library containing demuxers and muxers for multimedia container formats.

libavdevice is a library containing input and output devices for grabbing from and rendering to many common multimedia input/output software frameworks, including Video4Linux, Video4Linux2, VfW, and ALSA.

libavfilter is a library containing media filters.

libswscale is a library performing highly optimized image scaling and color space/pixel format conversion operations.

libswresample is a library performing highly optimized audio resampling, rematrixing and sample format conversion operations.

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库libavcodec等。

libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构

和读取音视频帧等功能;

libavcodec:用于各种类型声音/图像编解码;

libavutil:包含一些公共的工具函数;

libswscale:用于视频场景比例缩放、色彩映射转换;

libpostproc:用于后期效果处理;

ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever:一个 HTTP 多媒体即时广播串流服务器;

ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

]]>
【JAVA之图片水印】 http://doc.okbase.net/gaojingsong/archive/276123.html gaojingsong 2018/4/3 8:30:17

JAVA之图片水印核心代码

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

 

import javax.imageio.ImageIO;

 

public class WaterMarkUtils {

 

    /**

     * @param srcImgPath 源图片路径

     * @param tarImgPath 保存的图片路径

     * @param waterMarkContent 水印内容

     * @param markContentColor 水印颜色

     * @param font 水印字体

     */

    public void addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent,Color markContentColor,Font font) {

 

        try {

            // 读取原图片信息

            File srcImgFile = new File(srcImgPath);//得到文件

            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片

            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽

            int srcImgHeight = srcImg.getHeight(null);//获取图片的高

            // 加水印

            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);

            Graphics2D g = bufImg.createGraphics();

            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);

            g.setColor(markContentColor); //根据图片的背景设置水印颜色

            g.setFont(font);              //设置字体

 

            //设置水印的坐标

            int x = srcImgWidth - 1*getWatermarkLength(waterMarkContent, g);  

            int y = srcImgHeight - 1*getWatermarkLength(waterMarkContent, g);  

            g.drawString(waterMarkContent, x, y);  //画出水印

            g.dispose();  

            // 输出图片  

            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);  

            ImageIO.write(bufImg, "jpg", outImgStream);

            System.out.println("添加水印完成");  

            outImgStream.flush();  

            outImgStream.close();  

 

        } catch (Exception e) {

            // TODO: handle exception

        }

    }

    public int getWatermarkLength(String waterMarkContent, Graphics2D g) {  

        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());  

    }  

    public static void main(String[] args) {

        Font font = new Font("微软雅黑", Font.BOLD, 60);                     //水印字体

        String srcImgPath="c:/tmp/20150314_124204.jpg"; //源图片地址

        String tarImgPath="c:/tmp/t.jpg"; //待存储的地址

        String waterMarkContent="图片来源:北华航天工业学院<http://www.nciae.edu.cn/>";  //水印内容

        Color color=new Color(255,0,0);                               //水印图片色彩以及透明度

        new WaterMarkUtils().addWaterMark(srcImgPath, tarImgPath, waterMarkContent, color,font);

 

    }

}

 

效果验证

原图



 

水印图



 

  • 大小: 902.4 KB
  • 大小: 3.8 MB
]]>