请教大家,是veo系统先进的公共交通系统还是id6

轻便与稳定双收 精嘉VEO唯影二代脚架235AB试用轻便与稳定双收 精嘉VEO唯影二代脚架235AB试用影像视觉百家号Vanguard精嘉对于摄影人来讲,一幅好的作品离不开灵感与创意,而要将头脑中的构思拍摄成照片,则离不开优秀的摄影器材的辅助。在拍摄风光或夜景等题材时,我们经常会用到长时间曝光的拍摄手法,针对这种拍摄,一个稳定的支撑系统就变成了刚需。目前市面上拥有众多的三脚架产品,那么有没有这么一款好用方便的选择呢?这时,精嘉VEO唯影二代脚架235AB就脱颖而出了。精嘉VEO唯影二代脚架235AB隶属于精嘉VEO系列旗下,VEO是精嘉在2015年所发布的系列产品,其主要包括三脚架、单脚架、云台和摄影包等。该系列的设计理念特别注重细节,关注产品的可操作性、精巧性和独特性,力求打造出行业领先的旅行三脚架。经过2年的打磨与研发,本次的精嘉VEO唯影二代脚架235AB更是进一步贯穿该系列设计初衷,并且做到了更加人性化的改变,加入更加新颖的设计元素。既然是主打旅行的脚架产品,那小巧与轻便自然是产品必须的特性。在精嘉VEO唯影二代脚架235AB上,唯影二代采用了反折的设计方式,其折叠后长度仅为40.5cm,包含云台在内的自重只有1.4kg。这样的体积与重量可以减少用户在旅行中的负担,为更多的器材腾出更多空间。相比于其他厂商反折三个脚管的方法,精嘉在VEO唯影二代脚架235AB上采用了相反的方式,将三个脚管固定直接反折中轴,这样同样达到了减小三脚架体积的作用,并且还可以增加一个中轴反置的功能。中轴反置的秘密就藏在中轴与脚架的连接处, 精嘉这个设计为中轴反折专利。在解锁中轴反折专利后,通过按住底部凸起的金属按键,整个中轴可以再次抬升,并且可以180度反转。整个中轴反折专利在实际使用中非常方便,可以做到很快速设置。并且这个中轴是可以拆卸,用户可以根据自己的使用情况,利用套装中的配件,将其换成一个超短中轴。中轴反折专利除了在三脚架携带收纳时可以减小体积外,在实际拍摄中,我们也可以利用其特点将相机反置于脚架上。这种状态非常适合低矮的机位,弥补了三脚架无法低拍的不足,这也是笔者之前说精嘉中轴反折专利的聪明之处,不但可以收纳脚架也可以提供用户另一种拍摄状态,让用户为不同的情况做出更多选择。看过了中轴上的玄机,接下来笔者带大家探寻一下精嘉在VEO唯影二代脚架235AB脚管上的解锁方式。跟第一代的VEO唯影235AB脚架一样,第二代产品精嘉也保留了不同角度的脚管锁,也是通过按下解锁,其可以将脚架固定在20°,45°,80°三个状态。在最低的20°情况下,三个脚管可以更贴近地面,一方面提供三脚架更加稳定的支撑,另一方面对微距拍摄等题材也可以提供更低的距离。虽然精嘉VEO唯影二代脚架235AB在角度调整方面的设计并没有改变,但其在脚管缩放上采用了快速锁紧装置。相比于普通的扳扣式解锁方式,旋钮式解锁方式减少了三脚架整体的重量,并且操作起来更加快捷。除此之外,旋钮式解锁也保留了安全可靠、易清洁和不易松动等特点,增强了三脚架的使用寿命和可靠性。为了保证用户更容易的旋拧,在每个旋钮上精嘉都为我们配备了橡胶把套增加摩擦力。在脚管方面,精嘉VEO唯影二代脚架235AB采用了铝合金的材质,耐用性很强,保证长时间在恶劣环境下使用都没有问题。在其中一根脚管上,精嘉用上了柔软的TPU握持套,如果大家在寒冷天气下戴手套使用脚架,它可以帮助大家紧握脚管,适合全天候使用 。整个精嘉VEO唯影二代脚架235AB最大高度可以达到1450mm,最大承重载荷为6kg。对于日常的一些长焦镜头和大相机来说,都可以支撑,并且高度基本可以满足大家拍摄需求。 锁扭锁结构设计独特,内里防尘胶圈可以防止沙粒进入,方便清洗。为了保证三角架可以牢固的支撑于不同的地面,精嘉VEO唯影二代脚架235AB将普通的圆形脚垫换成了耐用多边形橡胶脚垫。这种脚垫可以提供三脚架在地面上更强的抓地力,并且不惧怕瓷砖、大理石或湿滑的情况。当然,如果大家在冰面使用该脚架的话,橡胶脚垫也可以拆卸换成脚钉(单独出售)。针对VEO唯影二代脚架235AB,精嘉为我们准备了一款型号为VEO唯影二代BH-50多功能球形云台。这款云台也秉承了VEO系列的特点,其拥有小巧轻量级的特点,与235AB脚架可以说是天造地设的一对。细心的朋友可以发现,相比于其他厂商的产品,精嘉VEO唯影二代BH-50云台与脚架的连接处多了一个橡胶圈。这个橡胶圈主要作用是减震,防止用户在调整可旋转中轴时,误操作下对云台产生伤害。不得不说,无论云台、脚管还是中轴,细节方面精嘉想的真是非常到位。精嘉这款VEO唯影二代BH-50多功能球形云台带独立的水平旋转、阻尼调节和锁紧旋钮。并且,每个旋钮都配有防滑橡胶设计,还有底部旋钮有凸起扳手,操作时不需很大力气就可以完成调整。此外,为了进行各种精确操作,云台各种角度都配有标尺。在快装板设计上,精嘉也使用了新的阿卡(雅佳)云台型号,它的特点就是配有D环螺丝,可与相机背带连在一起(不含背带)。有单独D环螺丝的好处就是不必拆装的时候去找硬币了,提起来就可以将其与相机锁紧,减少了操作上的不必要麻烦。在云台制作方面一直是精嘉的拿手绝活之一,无论是三维云台还是球形云台,精嘉的产品的质量都非常过硬。这样的优点也保持在了VEO唯影二代BH-50身上,在加装相机后,整个云台的阻尼调节非常舒服,松紧有度,无论横向拍摄还是竖向拍摄,都可以牢牢锁紧,让相机保持绝对稳定。作为精嘉新一代的VEO2系列产品,本次精嘉VEO唯影二代脚架235AB和VEO唯影二代BH-50云台最大的特点就是在于轻巧便携。同时,这两个好搭档都拥有者非常不错的设计与做工,包括脚管旋钮解锁方式、脚钉、中轴等人性化细节设计非常突出。种种特点综合起来,让它们可以满足大家日常旅拍中的所有需求。这也印证了精嘉产品设计的初衷,将产品的可用性与探索世界的激情紧紧地结合在了一起。微信号:Vanguard精嘉本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。影像视觉百家号最近更新:简介:学拍照,让生活更有意思!作者最新文章相关文章6 - 歌单 - 网易云音乐
播放:1556次
喜欢这个歌单的人
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:基于HBase的冠字号查询系统2--实现部分
1. 软件版本和部署
maven:3.3.9,jdk:1.7 ,Struts2:2.3.24.1,hibernate:4.3.6,spring:4.2.5,MySQL:5.1.34,Junit:4,Myeclipse:2014;
Hadoop2.6.4,HBase1.1.2
下载:https://github.com/fansy1990/ssh_v3/releases
数据下载:http://download.csdn.net/detail/fansy 或 http://pan.baidu.com/s/1dEVeJz7
请先参考上篇Blog:基于HBase的冠字号查询1--理论部分;
2. 系统功能&核心实现
2.1 系统首页
冠字号查询系统,主要包括两方面功能:
1. 把原始数据通过MR流程从HDFS导入到HBase,提供通用接口;
2. 提供冠字号查询功能、提供存款、取款功能;
2.2 数据加载功能
数据加载功能是一个通用的HBase表数据导入功能;
用户只需提供原始数据路径(HDFS)、HBase表名(该表需要先存在)、列描述(参考前篇博客此参数解释)、字段分隔符、时间格式即可;
2.2.1 后台实现
public void submitJob() {
Map jsonMap = new HashMap();
if (HadoopUtils.getMrLock().equals(MRLock.NOTLOCKED)) {// 没有锁,则可以提交代码
HadoopUtils.setMrLock(MRLock.LOCKED);
// 清空MR任务缓存
HadoopUtils.initMRCache();
// 提交任务
new Thread(new Hdfs2HBaseRunnable(hdfsFile, tableName,
colDescription, splitter, dateFormat)).start();
jsonMap.put(&flag&, &true&);
jsonMap.put(&jobId&, HadoopUtils.getJobId());
jsonMap.put(&flag&, &false&);
jsonMap.put(&msg&, &已经在运行MR程序,请确认!&);
Utils.write2PrintWriter(JSON.toJSONString(jsonMap));
这里提供一个MRLock,加此锁是防止在提交任务后,任务正在运行,而有其他程序重复提交任务(监控会有问题);
同时,这里使用多线程,提交任务后,立即返回前台,前台接收返回的信息后,根据判断,是否弹窗监控任务进度:
ret = callByAJax(&hadoop/hadoop_submitJob.action&,
{hdfsFile:hdfs,tableName:table,colDescription:colDescription,splitter:splitter,dateFormat:dateFormat})
if(ret.flag==&false&){// 提交任务失败
$.messager.alert('提示',ret.msg,'warn');
$.messager.progress({
title:'提示',
msg:'导入数据中...',
interval:0
//disable auto update progress value
// hadoop_submitJob.action 返回的ret中包含jobId , ret.jobId
if(typeof(EventSource)!==&undefined&)
console.info(&jobId:&+ret.jobId);
var source=new EventSource(&hadoop/hadoop_getMRProgress.action&+&?jobId=&+ ret.jobId );
source.onmessage=function(event)
console.info(event.data);
// TODO 判断event.data indexOf error ,解析:后面的值,显示,同时提示任务错误
if(event.data.indexOf( &error&)& -1){
source.close();
$.messager.progress('close');
$.messager.alert('提示',&任务运行失败!&,'warn');
// TODO 判断 event.data 为success ,则提示任务成功, 其他清空则任务进度即可
if(event.data == &success&){
source.close();
$.messager.progress('close');
$.messager.alert('提示',&任务运行成功!&,'warn');
var bar = $.messager.progress('bar');
bar.progressbar('setValue',
event.data);
注意这里的JobId的获取:
1) 在提交任务的时候把job变量设置到外部静态类中;
2)在Thread线程提交任务后,去获取jobId
需要注意的是,jobId只有在任务运行中才会被初始化,所以在提交任务后(thread运行中才初始化jobid);
需要注意的是,jobId只有在任务运行中才会被初始化,所以在提交任务后(thread运行中才初始化jobid);
3)while循环获取jobid:
public static String getJobId() {
long start = System.currentTimeMillis();
while (noJobId()) {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
log.info(& Getting job id ...&);
long end = System.currentTimeMillis();
log.info(&获取jobId,耗时:& + (end - start) * 1.0 / 1000 + &s&);
return currJob.getJobID().toString();
private static boolean noJobId() {
if (currJob == null || currJob.getJobID() == null)
同时,这里使用了HTML5的服务器发送事件,关于此技术请参考:http://www.w3school.com.cn/html5/html_5_serversentevents. ;
2.2.2 实例
提交任务后,实时反映任务运行进度:
后台日志:
2.3. 查询冠字号
这里查询冠字号包含两个部分:
1)随机生成:是指随机生成冠字号(根据个数可以生成不同个数冠字号,逗号分隔);
2) 查询,根据冠字号进行查询,如果hbase表中该记录的exist字段为1则说明存在,否则说明查询改冠字号为取出状态,则对应为疑似伪钞冠字号;
3) 详细查询:查询冠字号的所有信息,可以查询多个版本信息:
2.3.1后台实现
* 检查给定的冠字号是否存在疑似伪钞冠字号
* @param stumbers
* @throws IllegalArgumentException
* @throws IOException
public Map checkStumbersExist(String stumbers)
throws IllegalArgumentException, IOException {
String[] stumbersArr = StringUtils.split(stumbers, Utils.COMMA);
Connection connection = HadoopUtils.getHBaseConnection();
Table table = connection.getTable(TableName
.valueOf(Utils.IDENTIFY_RMB_RECORDS));
Map map = new HashMap&&();
List gets = new ArrayList&&();
for (String stumber : stumbersArr) {
get = new Get(stumber.trim().getBytes());
gets.add(get);
Result[] results = table.get(gets);
StringBuffer existStr = new StringBuffer();
StringBuffer notExistStr = new StringBuffer();
for (int i = 0; i & results. i++) {
exist = new String(results[i].getValue(Utils.FAMILY,
Utils.COL_EXIST));
if (&1&.equals(exist)) {
existStr.append(stumbersArr[i]).append(Utils.COMMA);
} else if (&0&.equals(exist)) {
notExistStr.append(stumbersArr[i]).append(Utils.COMMA);
log.info(&冠字号:& + stumbersArr[i] + &值 exist字段值异常!&);
if (existStr.length() & 0) {
map.put(&exist&, existStr.substring(0, existStr.length() - 1));
map.put(&exist&, &nodata&);
if (notExistStr.length() & 0) {
map.put(&notExist&,
notExistStr.substring(0, notExistStr.length() - 1));
map.put(&notExist&, &nodata&);
} catch (Exception e) {
e.printStackTrace();
直接使用HBase的Table
API实现即可;
获取给定rowkey以及版本数的记录,同样使用HBase 的Table Java API 即可实现
* 根据rowkey和版本个数查询数据
* @param tableName
* @param cfs
* @param rowkeys
* @param versions
* @throws IOException
public List getTableCertainRowKeyData(String tableName,
String cfs, String rowkeys, int versions) throws IOException {
String[] stumbersArr = StringUtils.split(rowkeys, Utils.COMMA);
Connection connection = HadoopUtils.getHBaseConnection();
Table table = connection.getTable(TableName
.valueOf(tableName));
List list = new ArrayList&&();
List gets = new ArrayList&&();
for (String stumber : stumbersArr) {
get = new Get(stumber.trim().getBytes());
get.setMaxVersions(versions);
gets.add(get);
Result[] results = table.get(gets);
for (int i = 0; i & results. i++) {
cells = results[i].rawCells();
list.addAll(getHBaseTableDataListFromCells(cells));
} catch (Exception e) {
e.printStackTrace();
2.6 验证每秒500+查询
使用单个线程进行查询:
import java.io.IOE
import java.util.ArrayL
import java.util.D
import java.util.L
import org.apache.hadoop.hbase.TableN
import org.apache.hadoop.hbase.client.C
import org.apache.hadoop.hbase.client.G
import org.apache.hadoop.hbase.client.T
import org.apache.hadoop.hbase.util.B
public class ReadTest {
// private static String FAMILY =&info&;
public static void main(String[] args) throws IOException {
long size =10000;
get(Utils.getConn(),Utils.generateRowKey(size));
public static void get(Connection connection,List rowkeys) throws IOException {
System.out.println(new Date()+&:开始读取记录...&);
long start =System.currentTimeMillis();
Table table = connection.getTable(TableName.valueOf(Utils.TABLE));
long count =0;
for(byte[] rowkey :rowkeys){
get = new Get(Bytes.toBytes(&&));
get = new Get(rowkey);
table.get(get);
if(count%1000==0){
System.out.println(&count:&+count);
long end = System.currentTimeMillis();
System.out.println(new Date()+&:&+rowkeys.size()+&条记录,读取耗时:&+(end-start)*1.0/1000+&s&);
}catch(Exception e){
table.close();
使用多线程查询:
import java.util.D
import java.util.L
import org.apache.hadoop.hbase.client.G
import org.apache.hadoop.hbase.client.T
public class ReadThread implements Runnable {
private List
ReadThread(Table table ,List rks) {
this.table =
this.rks =
public void run() {
System.out.println(Thread.currentThread().getName()+& &+new Date()+&:开始读取记录...&);
long start =System.currentTimeMillis();
long count =0;
for(byte[] rowkey :rks){
get = new Get(Bytes.toBytes(&&));
get = new Get(rowkey);
table.get(get);
if(count%1000==0){
System.out.println(Thread.currentThread().getName()+& count:&+count);
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName()+& &+new Date()
+&:&+rks.size()+&条记录,读取耗时:&+(end-start)*1.0/1000+&s&);
}catch(Exception e){
多线程查询主程序:
import java.io.IOE
public class ReadThreadTest {
public static void main(String[] args) throws IOException {
long dataSize =500;
int threadSize = 20;
for(int i=0;i
工程类Utils程序
import java.io.IOE
import java.text.DecimalF
import java.util.ArrayL
import java.util.D
import java.util.L
import java.util.R
import org.apache.hadoop.conf.C
import org.apache.hadoop.hbase.HBaseC
import org.apache.hadoop.hbase.TableN
import org.apache.hadoop.hbase.client.C
import org.apache.hadoop.hbase.client.ConnectionF
import org.apache.hadoop.hbase.client.T
import org.apache.hadoop.hbase.util.B
public class Utils {
public static String TABLE = &records&;
private static DecimalFormat df = new DecimalFormat( &0000& );
public static String[]
crownSizePrefixes =
static Random random = new Random();
crownSizePrefixes = new String[26*2];
for (int i = 0; i & crownSizePrefixes.length/2; i++) {
crownSizePrefixes[i] = &AAA& + (char) (65 + i);
crownSizePrefixes[i+26] = &AAB& + (char) (65 + i);
* 把0~9999 转为
* @param num
public static String formatCrownSizeSuffix(int num){
return df.format(num);
public static Table getTable() throws IOException{
return getConn().getTable(TableName.valueOf(TABLE));
public static String getRandomCrownSize(){
return crownSizePrefixes[random.nextInt(crownSizePrefixes.length)]
+formatCrownSizeSuffix(random.nextInt(10000));
public static Connection getConn() throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set(&hbase.master&, &node2:16000&);// 指定HMaster
conf.set(&hbase.rootdir&, &hdfs://node1:8020/hbase&);// 指定HBase在HDFS上存储路径
conf.set(&hbase.zookeeper.quorum&, &node2,node3,node4&);// 指定使用的Zookeeper集群
conf.set(&hbase.zookeeper.property.clientPort&, &2181&);// 指定使用Zookeeper集群的端口
Connection connection = ConnectionFactory.createConnection(conf);// 获取连
public static List generateRowKey(long size){
System.out.println(new Date()+&开始生成&+size +&条记录...&);
long start =System.currentTimeMillis();
rowkeys = new ArrayList&&();
for(int i=0;i2.4 存款:&&1)存款需要输入用户ID、银行、冠字号,当然也可以随机生成;&&2)存取使用的是Table的checkAndPut 函数,关于此函数存储数据的一致性,参考:http://blog.csdn.net/fansy1990/article/details/&&由于AAAR5912的冠字号,其exist状态为1,说明HBase表中此冠字号为存储状态,不能再次存储,即发现了疑似伪钞的冠字号;2.5 取款&&1)取款同样有随机生成功能,类似上面:&&当然,这里随机生成的只是用户和银行而已;2) 取款:取款根据取款金额进行获取:&&取款流程如下:1) 根据给定的取款冠字号个数num,随机查找冠字号(rowkey)对应的op_www:exist字段值为1的num*3条记录;2) 使用HBase.checkAndPut进行更新,把op_www:exist字段值更新为0,并返回更新后的rowkey,即冠字号;3) 如果在num*3条记录更新后,被更新的冠字号不足num条,则再次随机查找冠字号对应的op_www:exist字段值为1的记录,并更新,返回更新后的冠字号,直到返回的冠字号个数为3. 总结
1) 基于冠字号查询系统基于已存在HBase的冠字号非伪钞,如果已存在冠字号包含伪钞,则存储和取钱功能都会有问题;
2) 原始数据(用户信息、冠字号交易信息),在一定程序上是有规律的,并且对于大数据来说,还是小数据,需要在较大数据集上测试;
3)用户账号相关信息(存储的钱总数等)并没有在该系统中体现,后续可以考虑;
4) 查询冠字号、存、取款功能在第一次点击的时候初始化时间较长,考虑弹窗显示;
5)查询冠字号、存、取款功能中的详细查询可以在定制点,比如可以只查询出某个列簇或列的数据即可;

我要回帖

更多关于 先进的公共交通系统 的文章

 

随机推荐