Mryqu's Notes


  • 首页

  • 搜索
close

短网址服务学习和测试

时间: 2016-07-30   |   分类: Tech     |   阅读: 48 字 ~1分钟
短网址服务 短网址(Short URL) ,顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。 网上的短网址服务一堆堆的,例如谷歌家的goo.gl,bit.ly为推特家提供了bit.ly及为亚马逊家提供了amzn.to,推特家自己的t.co,新浪家的t.cn,百度家的dwz.cn,简直数不过来。 SearchEngineLand曾对国外市面上的URL缩短服务进行了分析总结,列出了推荐使用的和应尽力避免使用的服务。该评测从是否为301转向(永久转向,相对302为暂时转向)、是否支持Tracking(追踪链接的来源)、是否支持主流的Twitter客户端、缩短后的URL字数、是否支持自定义URL、是否支持分享等多个方面进行评价。具体结果见此表。 短网址算法 算法一 将长网址md5生成32位签名串,分为4段, 每段4个字节(即32位); 对这四段循环处理, 取4个字节(32位), 将他看成16进制串与0x3fffffff(30位1)与操作,即超过30位的忽略处理; 这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串; 总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址; 算法二 把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。 把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理ID为2时,字符串组合为bba,依次类推,直至到达62种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。 短网址服务测试(基于新浪短地址服务) 短地址服务是否验证长URL? 对于不存在的长地址http://www.mryqu.com/test/test.html,新浪短地址服务没有验证,直接转成了短地址http://t.cn/RtXngGQ 。 如果长url其实是该短地址服务产生的短地址,如何处理? 对于长地址http://t.cn/RtXngGQ ,新浪短地址服务做了检查识别出短地址,并直接按照http://www.mryqu.com/test/test.html返回短地址http://t.cn/RtXngGQ 。 如果长url其实是其他短地址服务产生的短地址,如何处理? 我用长地址http://blog.sina.com.cn/yandongqu 在百度短地址服务获得了短地址http://dwz.cn/3TE3bq ,将其作为新浪短地址服务的输入,新浪短地址服务识别出短地址,获得原始长地址http://blog.sina.com.cn/yandongqu ,并返回相应短地址短地址http://t.cn/RLoGZKa 。 参考 短网址 短网址服务,我们该怎么选? URL Shorteners: Which Shortening Service Should You Use? 短链接URL系统是怎么设计的? tinyURL的设计方案与实现【一】

[Spark]Spark2集群安装实践

时间: 2016-07-28   |   分类: BigData     |   阅读: 282 字 ~2分钟
从Spark2.0.0开始,Spark使用Scala2.11构建,不再对Java7和Python2.6进行支持。当然不编译Spark源码的话,无需安装Scala。 Spark集群模型 Spark应用作为集群上一组独立进程运行,由你的主程序(即驱动程序)的SparkContext对象管理。为了在集群上运行,SparkContext可以与若干类型集群管理器(Spark自带的独立集群管理器、Mesos、YARN)连接,集群管理器为应用分配资源。Spark需要集群节点上的执行者(executor)为应用执行计算或存储数据。接下来,它将应用代码发送给执行者,最后SparkContext将人物发往执行者进行运行。 准备工作 安装Scala # Scala Installation wget www.scala-lang.org/files/archive/scala-2.11.8.deb sudo dpkg -i scala-2.11.8.deb # sbt Installation echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823 sudo apt-get update sudo apt-get install sbt 安装Java8 sudo apt-add-repository ppa:webupd8team/java -y sudo apt-get update -y sudo apt-get install oracle-java8-installer -y sudo apt-get install oracle-java8-set-default 环境变量设置 在~/.bashrc中添加: # Set SPARK_HOME export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin 最后通过source~/.bashrc刷新配置文件。 安装Spark (在node50064上)下载并配置Spark wget http://d3kbcqa49mib13.
阅读全文 »

twitcurl获取访问令牌(AccessToken和AccessTokenSecret)的实现流程

时间: 2016-07-01   |   分类: DataBuilder     |   阅读: 84 字 ~1分钟
twitterClient.cpp中有一段代码是没有AccessToken和AccessTokenSecret的情况下,通过ConsumerKey、ConsumerKeySecret、UserName和UaserPassword获取AccessToken和AccessTokenSecret。 一般实现是通过重定向到Twitter页面去授权应用,通过callbackURL获得Twitter传过来的AccessToken和AccessTokenSecret信息。twitcurl既可以通过访问twitter.com获取PIN,也可以交由twitcurl自动获得。 如果通过twitter.com处理PIN,twitcurl会提供授权链接。进入链接后输入用户名和密码,会重定向到Twitter应用的callbackURL(例如http://www.mryqu.com/test.html?oauth_token={OAuthToken}&oauth_verifier={OAuthVerifier} ),其中oauth_verifier值即为所谓的PIN。 下面我们看一下twitcurl是如何实现不访问twitter.com获取AccessToken和AccessTokenSecret的。 GET https://api.twitter.com/oauth/request_tokentwitCurl::oAuthRequestToken 方法实现该HTTP请求,允许消费者应用获得一个OAuth请求令牌以请求用户授权。除了HTTP OAuth头外,twitcurl实现没有其他HTTP头,也没有消息体内容。HTTP OAuth头包含如下项: oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_version 通过如下HTTP响应可以获得oauth_token和oauth_token_secret,保存在oAuth对象的m_oAuthTokenKey和m_oAuthTokenSecret变量中: oauth_token=XXXXXX&oauth_token_secret=XXXXXX&oauth_callback_confirmed=true GET https://api.twitter.com/oauth/authorize?oauth_token=XXXXXXtwitterObj.oAuthHandlePIN 方法实现该HTTP请求,获取响应页面中表单的authenticity_token和oauth_token元素的值。除了HTTP OAuth头外,twitcurl实现没有其他HTTP头,也没有消息体内容。HTTP OAuth头包含如下项: oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token (取自上一HTTP响应) oauth_version HTTP响应片段: POST https://api.twitter.com/oauth/authorize?oauth_token=XXXXXXtwitterObj.oAuthHandlePIN 方法实现该HTTP请求,允许消费者应用使用OAuth请求令牌请求用户授权。HTTP OAuth头包含如下项: oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token (取自上一HTTP响应) oauth_version HTTP请求消息体内容为: oauth_token=XXXXXX&authenticity_token=XXXXXX&session[username_or_email]=**XXXXX**X&session[password]=XXXXXX HTTP响应片段:通过如下HTTP响应可以获得oauth_verifier,保存在oAuth对象的m_oAuthPin变量中。 GET https://api.twitter.com/oauth/access_tokentwitterObj.oAuthAccessToken 方法实现该HTTP请求,允许消费者应用使用OAuth请求令牌交换OAuth访问令牌。HTTP OAuth头包含如下项: oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token oauth_verifier (取自上一HTTP响应) oauth_version HTTP响应: oauth_token=XXXXXX&oauth_token_secret=XXXXXX&user_id=XXXXXX&screen_name=XXXXXX&x_auth_expires=0 通过HTTP响应可以获得oauth_token、oauth_token_secret和user_id,保存在oAuth对象的m_oAuthTokenKey、m_oAuthTokenSecret和m_oAuthScreenName变量中,可以将此OAuth访问令牌保存下来以备之后的使用,下次就无需再次申请访问令牌了。 参考 Twitter OAuth Overview Twitter PIN-based authorization Github: mryqu/twitcurl OAuth Core 1.
阅读全文 »

微信语音导出和转换

时间: 2016-06-18   |   分类: Tool     |   阅读: 3 字 ~1分钟
用微信语音发送了一段儿子朗诵诗,想导出来做个念想,结果发现还挺麻烦。 在tencent/MicsoMsg目录下有名字很长的文件夹就是微信聊天记录存放的文件夹,每登陆一个微信就会产生一个名字很长的文件夹。在这个目下下有个Voice2目录,将下面的子目录按照日期排序缩小范围,查找疑似子目录下的amr文件,想办法拷贝到计算机中。 一开始我按照网上的攻略用格式工厂转换成mp3,报错。用Ultraedit打开文件,头部显示有silk_v3。SILKv3编码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器,Skype后来将其开源。在Github上找到了https://github.com/kn007/silk-v3-decoder,搞定!

使用Jacoco

时间: 2016-06-16   |   分类: Java     |   阅读: 96 字 ~1分钟
在以前的项目都是用Cobertura做代码覆盖率测试的,这次有机会接触了一下另一个代码覆盖率Java库JaCoco。 JaCoCo拥有友好的授权形式。JaCoCo使用了Eclipse PublicLicense,方便个人用户和商业用户使用。JaCoCo/EclEmma项目除了提供JaCoCo库之外,还提供了Ant任务、Maven插件及EclEmmaEclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如SonarQube、Jenkins、Netbeans、IntelliJIDEA、Gradle等。 JaCoCo包含多种级别的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstractmethods)、类覆盖(classes)。 指令覆盖:计数单元是单个java字节码指令,指令覆盖率提供了代码是否被执行的信息,该指标完全独立与源码格式。 分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的分支数量。 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测试案例没有完全覆盖到这个模块。 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。 类覆盖率:度量计算class类文件是否被执行。 JaCoCo的一个主要优点是使用Java代理,可以动态(on-the-fly)对类进行插桩。这样代码覆盖率分析简化了预插桩过程,也无需考虑classpath的设置。但是还存在如下不适合动态插桩的情况,需要线下对字节码进行预插桩: 运行环境不支持java agent。 部署环境不允许设置JVM参数。 字节码需要被转换成其他的虚拟机如Android Dalvik VM。 动态修改字节码过程中和其他agent冲突。 示例 我这个懒人还是在Building a Hypermedia-Driven RESTful Web Service示例的基础上稍作修改,熟悉一下JaCoCo的使用。 build.gradle buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.X.Y.RELEASE") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'spring-boot' apply plugin: 'jacoco' jar { baseName = 'hello-jacoco' version = '0.1.0' } repositories { mavenCentral() } sourceCompatibility = 1.8 targetCompatibility = 1.
阅读全文 »

在Outlook 2013中查看邮件的消息头

时间: 2016-06-09   |   分类: Tool     |   阅读: 3 字 ~1分钟
双击邮件后选择File菜单,点击Porperties按钮: 查看Internet headers:

[OpenUI5] 复习Controller lifecycle

时间: 2016-05-27   |   分类: FrontEnd     |   阅读: 171 字 ~1分钟
昨天看到有同事添加了几个Controller的回调,对其中的onBeforeExit、beforeExit没一点印象。 sap.ui.controller("kx123.foo", { onInit: function () { console.info("foo onInit called"); }, onBeforeExit: function(){ console.info("foo onBeforeExit called") ; } , beforeExit: function() { console.info("foo beforeExit called") ; }, onBeforeRendering: function() { console.info("foo onBeforeRendering called"); }, onExit: function() { console.info("foo onExit called"); } }); 查了一下如下OpenUI5开发指南 MVC中关于Controllers的介绍。 SAPUI5 provides predefined lifecycle hooks forimplementation. You can add event handlers or other functions tothe controller and the controller can fire events, for which othercontrollers or entities can register.
阅读全文 »

使用SpringFox自动生成Swagger文档

时间: 2016-04-28   |   分类: Service+JavaEE   Swagger     |   阅读: 312 字 ~2分钟
前面的博文Swagger实践和总结总体上探索了一下Swagger,这里着重研究Springfox。 Springfox Java库源自MartyPitt创建的swagger-springmvc项目。Swagger是一系列对RESTful接口进行规范描述和页面展示的工具,而通过Springfox将Swagger与Spring-MVC整合,可以将代码中的注解转换为符合Swagger开放API声明(OpenAPI Specification,OAS)的swagger.json文件,springfox-swagger-ui提供了将swagger.json转换为html页面的服务。 HelloSpringfox示例 尽管springfox-demos中的boot-swagger很全面了。但是对于一个写程序的人来说,不亲自写一遍,总觉得可能会有陷阱和漏洞,缺乏那么一点点自信。 我的示例是以Building a Hypermedia-Driven RESTful Web Service为基础修改的,懒人总是要找个肩膀。 build.gradle jar { baseName = 'hello-springfox' version = '0.1.0' } dependencies { compile("org.springframework.boot:spring-boot-starter-actuator") compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-hateoas") compile("io.springfox:springfox-swagger2:${springfoxVersion}") compile("io.springfox:springfox-swagger1:${springfoxVersion}") compile("io.springfox:springfox-swagger-ui:${springfoxVersion}") testCompile("com.jayway.jsonpath:json-path") testCompile("org.springframework.boot:spring-boot-starter-test") } Application.java package com.yqu.hellospringfox; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } Greeting.java package com.yqu.hellospringfox; import org.springframework.hateoas.ResourceSupport; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public class Greeting extends ResourceSupport { private final String content; @JsonCreator public Greeting(@JsonProperty("content") String content) { this.
阅读全文 »

了解PhantomJS

时间: 2016-04-13   |   分类: FrontEnd     |   阅读: 39 字 ~1分钟
今天看到我们的项目依赖PhantomJS,就稍作了解。 PhantomJS 是什么? 官方介绍如下: PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG. PhantomJS是无需浏览器基于WebKit的全Web栈,支持JS解析引擎、渲染引擎、请求处理等,但是不包括显示和用户交互页面。 PhantomJS的使用场景 无浏览器网站测试:支持使用Jasmine、QUnit、Mocha、Capybara、WebDriver等框架进行功能测试。 页面截屏:抓取页面内容,包括SVG和Canvas。 页面自动化:使用标准DOMAPI或jQuery等通用库访问和操作网页。 网页监控:监控网页加载和导出成标准HAR文件。让使用YSlow和Jenkins的性能分析自动化。 大概可以估计出PhantomJS的作用了,应该是用于单元测试吧。

[OpenUI5] sap.ui.model.SimpleType及其子类中的约束

时间: 2016-04-12   |   分类: FrontEnd     |   阅读: 165 字 ~1分钟
对OpenUI5模型中的数据项如何设置类型,如何设置最大最小值等约束呢?这一切可以通过研究sap.ui.model.SimpleType及其子类获得答案。 sap.ui.model.SimpleType类图 SimpleType子类Integer约束测试 下面的示例中有两个sap.m.Input控件,第一个为文本类型输入没有约束,第二个整数类型输入有约束: that.oNameInput = new Input({ id: sFormId+"-name", type: sap.m.InputType.Text, value: "{/name}", layoutData: new GridData({span: "L3 M5 S6"}) }); that.oCountInput = new Input({ id: sFormId+"-count", type: sap.m.InputType.Number, value: { path:'/count', type: 'sap.ui.model.type.Integer', constraints: { minimum : 1, maximum : 50 } }, placeholder: "(1-50)", layoutData: new GridData({span: "L3 M5 S6"}) }); 完整示例代码: 二者调试信息的差异: 一个仅指定了映射路径;另一个除了指定映射路径外,明确指定了模型数据项类型及约束。 测试结果 that.oCountInput施加了范围1到50的约束。如果输入值在范围内,则界面和模型中的count值都会改变;如果输入值不再范围内,则模型中的count值保留上一有效值,而界面发生改变且无告警。 调试堆栈如下: PropertyBinding.setExternalValue (sap-ui-core-dbg.js:57174) ManagedObject.updateModelProperty (sap-ui-core-dbg.js:34286) ManagedObject.setProperty (sap-ui-core-dbg.js:32531) InputBase.setProperty (InputBase-dbg.js:690) InputBase.setValue (InputBase-dbg.js:1007) Input.setValue (Input-dbg.
阅读全文 »
10 11 12 13 14 15 16 17 18

Programmer & Architect

662 日志
27 分类
1472 标签
RSS 订阅
GitHub Twitter FB Page
© 2009 - 2023 Mryqu's Notes
Powered by - Hugo v0.120.4
Theme by - NexT
0%