Blogs

Android AES 加密、解密

AES加密介绍 ASE 加密、解密的关键在于秘钥、只有使用加密时使用的秘钥,才可以解密。 生成秘钥的代码网上一大堆,下面的代码可生成一个秘钥 private SecretKey generateKey(String seed) throws Exception { // 获取秘钥生成器 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); // 通过种子初始化 SecureRandom secureRandom = new SecureRandom(); secureRandom.setSeed(seed.getBytes("UTF-8")); keyGenerator.init(128, secureRandom); // 生成秘钥并返回 return keyGenerator.generateKey(); } 然后使用秘钥进行加密 private byte[] encrypt(String content, SecretKey secretKey) throws Exception { // 秘钥 byte[] enCodeFormat = secretKey.getEncoded(); // 创建AES秘钥 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); // 创建密码器 Cipher cipher = Cipher.getInstance("AES"); // 初始化加密器 cipher.init(Cipher.ENCRYPT_MODE, key); // 加密 return cipher.

继续阅读

MachingLearning中的距离和相似性计算以及python实现

前言 写这篇文章的目的不是说摘抄网上其他人的总结,刚才最近在看这方面的东西,为了让自己能够实际的去感受下每种求距离公式的差别,然后用python进行具体实现。 在机器学习中,经常要用到距离和相似性的计算公式,我么要常计算个体之间的差异大小,继而评价个人之间的差异性和相似性,最常见的就是数据分析中的相关分析,数据挖掘中的分类和聚类算法。如利用k-means进行聚类时,判断个体所属的类别,要利用距离计算公式计算个体到簇心的距离,如利用KNN进行分类时,计算个体与已知类别之间的相似性,从而判断个体所属的类别等。 文章编辑的过程中或许存在一个错误或者不合理的地方,欢迎指正。 参考:http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html 推荐:https://my.oschina.net/hunglish/blog/787596 欧氏距离 也称欧几里得距离,是指在m维空间中两个点之间的真实距离。欧式距离在ML中使用的范围比较广,也比较通用,就比如说利用k-Means对二维平面内的数据点进行聚类,对魔都房价的聚类分析(price/m^2 与平均房价)等。 二维空间的欧氏距离 二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离 $$ d12 =\sqrt{(x{1}-x{2})^2+(y{1}-y{2})^2} $$ python 实现为: # coding: utf-8 from numpy import * def twoPointDistance(a,b): d = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 ) return d print 'a,b 二维距离为:',twoPointDistance((1,1),(2,2)) 三维空间的欧氏距离 三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离 $$d12 =\sqrt{(x{1}-x{2})^2+(y{1}-y{2})^2+(z{1}-z{2})^2}$$ python 实现为: def threePointDistance(a,b): d = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2 ) return d print 'a,b 三维距离为:',threePointDistance((1,1,1),(2,2,2)) 多维空间的欧氏距离 两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离 $$ \sqrt{\sum{n}^{k=1}(x{1k}-x_{2k})^2 } $$ python 实现为:

继续阅读

一切的闹闹哄哄,只是他在水帘洞躲避风沙那晚做的一个梦

送同学走之后,我在路边默默的站了有五分钟,突然觉得我无处可去,有一种深入骨髓的悲哀和无奈,然后我就想起了一个命题,“如今的你,何去何从!”我不知道为什么会突然想到这样一个命题,或许是我们每个人都是至尊宝吧。其实每个人对《大话》的理解都是有所不同的,同样的人在不同的时期认识也会有偏差,就好比我第一次看的时候,笑得腹背抽筋,呲牙咧嘴,第二次看的时候,笑得少了,想的多了,过后便什么感觉也没有了,第三次看得时候,忽然觉得不知道是该哭还是该笑,笑得时候太牵强,哭得时候太尴尬。第四次便是这一次,看完之后觉得有一种无可奈何的悲哀。 对《大话》的解读 有人说这是一部烂片,也有人说这是一部经典,有人说这是对西游文化的过度消费,有人说这是一代人的反思与成长,有人说阴差阳错的蝴蝶效应,让一个年代的人支撑起了这部超越中国电影水平50年的无厘头式作品,也有人说这是一部笑中带泪,总有一天你走在路上也会像一条狗的悲剧。 一千个人眼中有一千个哈姆雷特,对于一部影视作品,我们无法去评论任何一个人的理解是对还是错,因为经历不同,就像你不能把你的情感强加到别人身上。喜欢一部作品,在不知不觉间你会忽略他的缺点,讨厌一个事物,在不知不觉间就会放大他的短处。我们也不能用我们现代的思维和观念去评判20世纪港台电影的文化和情感。 至尊宝的路线是,有人给他点了三颗痣,拔出来紫青宝剑,开启了与紫霞的交涉,娶亲,戴上紧箍咒,大战牛魔王,西天取经。其实至尊宝这条路线,何尝不是我们的漫漫人生路呢,至尊宝用月光宝盒来寻找500年前的白晶晶,却阴差阳错遇到了紫霞仙子,最后在对白晶晶失而复得之后又得知紫霞在他内心留下的一滴眼泪,最终大彻大悟,明白了舍生取义,参透了生亦何哀,死亦何苦。我们的人生不也一样,总会有各种各样的未知因素影响我们的选择,在努力面对眼前一切之后,最终回头感叹年华,围炉小饮,本来无一物,何处惹尘埃。 对于紫霞和至尊宝的爱情,没有这种体验,是不会懂的,越是深情的人越容易受伤,她放下尊严来爱他,终于他后悔了。在至尊宝的梦里,紫霞仙子说:“飞蛾明明知道前面是火堆,却还义无反顾的扑进去。”她笑一下,接着说:“飞蛾就是这么傻!”而同样的至尊宝,“有一个名字叫紫霞的,你叫七百八十四次“,时光真是个好东西,所谓雕刻时光,是说生活像把钝刀,锉平我们的触觉,而电影则是解毒的重药,它让人突然领悟到,我们的内心要比自己想像的敏感干净得多!你等的那么辛苦,他却陌生到让你心疼。以至于在人生的不同阶段去欣赏《大话》,似乎都能从中找到某些影子,原先是笑,后来是苦,到最后便是沉默了。城墙上的一吻,至尊宝变成了旁观者,他借用夕阳武士的身份和转世的紫霞完成了他告别的深情,于是他的背影,他的离开,寂寞成了“好像一条狗”。 他好像一条狗呀! -“那个人的样子好怪啊” -“我也看到了,他好像条狗啊” 是呀,英雄的离开,留下的永远只是背影,只不过在至尊宝这里加上了悲剧色彩,加上了人艰不拆的辛酸泪,以至于多少年后才明白了至尊宝转身离开有多难。至尊宝的结局是一个男人的悲怆与无奈。 至尊宝用了月光宝盒来寻找500年前的白晶晶,同时遇到了在她看来,他是她的命中注定的紫霞仙子,直到后来牛魔王的出现,夺走了紫霞,夺走了白晶晶,夺走了至尊宝往日的快乐,他明白他要夺回这一切,可是面对戏剧般的月光宝盒,至尊宝得到的更多是无力和苍白,面对这些无情的现实,幻想一次又一次地破灭。直到最后的关头,至尊宝终于醒悟,靠月光宝盒不行,至尊宝更是没有那个本事,只有成为孙悟空,只有戴上那个金刚圈,他才有能力同牛魔王一较高下。 这是一个极大的讽刺。你想要得到吗?好,那么你必须先放弃至尊宝的身份,你必须做出选择,必须忍受无尽的痛苦,他想要化解时间无尽的仇恨,就必须放弃自己的感情,不是不爱,而是大彻大悟之后的大爱,他必需化身为孙悟空,帮助唐三藏取得经书,化解这世间的恨。 那么至尊宝的放弃是自觉自愿的醒悟吗?不,他并不愿意,但是他必须拯救紫霞,必须化解人间的恨,他别无选择,他必须戴上紧箍咒。虽然成为了孙悟空,成了大英雄,但他对自己的生存状态极度不满。所以在最后,孙悟空将他心中残存的至尊宝的影子幻化作一位夕阳武士,在对现实世界彻底失望后,只能构造一个虚幻的想象来了却这桩心愿,并借武士的口中表达了对自己生存状态的不满,活得好象是一条狗一样。唉,一个男人的悲怆和无奈。 那句意中人,满足了多少人的少女心 “我知道有一天,他会在一个万众瞩目的情况下出现,身披金甲圣衣,脚踏七色云彩来娶我” “我的意中人是个盖世英雄,有一天他会踏着云彩来娶我” 这两句分别是紫霞在牛魔王娶她前的晚上和死前对孙悟空说的,多么经典的台词,以至于现在多少人还幻想着自己的意中人。 进入至尊宝内心的只有两个女人,一个是白晶晶,一个是紫霞,白晶晶问的是“他最喜欢的人是不是我”,紫霞问的是“他跟他的娘子是不是很恩爱呀?”,白晶晶的爱是一种索求的爱,而紫霞的爱则是无怨无悔的。 所以最终至尊宝回来了,在化身为孙悟空之后,身披金甲圣衣,脚踏七色云彩而来,他实现了紫霞的梦想,只不过加了一层掩饰与牵强。 从现如今这个角度反思紫霞的意中人,我是不太赞同的,童话毕竟是童话,正是这个经典的对白,让多少人活在自己的想象中,我们都渴望对方是个“意中人”的形象,可是我们却忽略乐一个”等价“的观念,你凭什么拥有你的”意中人“,你配得上吗?这不仅让我想起了另外一个命题:“不要去羡慕那些散发光芒的成功者,因为你不知道他背后付出的努力和艰辛”,这其实是一个道理,如果你仅仅是停留在幻想和计划的层面,那么你永远得不到你的”意中人“。 我猜中了开头,可是我猜不着这结局 紫霞说猜得到开始,却猜不透这结局。大约直到最后,她也没能明白、没能理解至尊宝的苦心。又或者说,是至尊宝从来也未能真正了解她的心意。我曾经以为,死去的紫霞是最可怜的角色。可是,至尊宝又何尝不可怜呢,他甚至,连伤心的权利也没有了。在紫霞死去的一瞬间,他的心也已经跟着死去了。在他余下的人生里,再也不会有欢笑、快乐,再也不会有那样一个可以在他心里流下眼泪的女孩子。就算取回西经又能如何,心爱的人再也会不来了。就算成佛又能如何,没有了你,整个世界对我来说都毫无意义。 《大话》把遗憾和难题抛给了时间 又一次的时空穿梭后,面对城头男女,孙悟空附身夕阳武士,给出无数人热泪纵横,内心中期盼的最后答案。 没有失去过,也永远不能明白得到的快乐。 附身后的孙悟空发自内心肺腑地给了女子一记深深长吻,这一吻穿越地老天荒,不再相信自欺欺人的一万年,他那般语气坚决地说出了那三个字。 先前拒不让步的夕阳武士,拥抱着爱人幸福陶醉。 转身远去的孙悟空了却尘缘心事,消失在大漠黄沙尽头。 只是每次在紫霞被刺中或者孙悟空松手的瞬间,还是会心潮如水甚至潸然泪下。 十年大话,一群人围坐着观看《大话西游》的狂热时代过去了,心底保存的泪水也慢慢尘封直至故事终结。毫无拘束的开怀大笑渐渐沦为一个人的狂欢,难加掩饰的心底苍凉逐渐成了人生重担 如今的你,何去何从 “如今的你,何去何从?” “对呀,何去何从” 真的羡慕至尊宝最初为了营救白晶晶,借用外力,使用月光宝盒穿越回500年前,为了解救紫霞,戴上紧箍咒。 而你呢?没有目标,你便是一个游荡的灵魂。 加长版加了什么 1:紫霞刚出现时在沙漠和雪蛤精,孔雀王的对话以及 他们的拔剑抢婚,与影片中紫霞和至尊宝在 牛魔王婚礼上遇见时雪蛤精,孔雀王和反对结婚作了呼应。 2:约好二更相见,原版是牛夫人出现 ,然后是至尊宝直接被猪八戒和沙师弟拉去救师父,加长版中先是牛夫人出现,然后牛魔王,然后至尊宝 3:牛魔王婚礼时猪八戒和沙僧在小妖堆里跟他们“打成一片” 4:至尊宝被青霞揍晕第二次之后,早上跟紫霞说的那通话“你要让我拿点信物给他看, 你有什么项链啊,首饰啊,金银珠宝啊,月光宝盒啊什么的……”原版的这段声音不是石班瑜所配。新版中,这段声音是重新配音,换上了石班瑜的声音。 5:2K画面的修复 一切的闹闹哄哄,只是他在水帘洞躲避风沙那晚做的一个梦

继续阅读

Android APK添加系统签名

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 将应用设置为系统级应用。可以调用系统级别API。 下载 签名文件 在AndroidManifest.xml中添加sharedUserId 为 android.uid.system,设置应用为系统级。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="……" android:sharedUserId="android.uid.system"> …… </manifest> 生成APK 此时生成的APK是无法安装并运行的,因为在上一步已经设置了应用为系统级应用,但是还并没有添加系统签名。 解压下载好的签名文件并添加系统签名 java -jar signapk.jar platform.x509.pem platform.pk8 上一步生成的未添加系统签名的APK文件.apk 要生成的签名文件.apk

继续阅读

Android蓝牙通信——AndroidBluetoothManager

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN To get a Git project into your build: Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } Step 2. Add the dependency dependencies { compile 'com.github.kongqw:AndroidBluetoothManager:1.0.0' } AndroidBluetoothManager 效果图 PNG GIF 基础功能 添加权限 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.

继续阅读

Android自定义雷达扫描控件

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN Android 雷达扫描控件 To get a Git project into your build: Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } Step 2. Add the dependency dependencies { compile 'com.github.kongqw:AndroidRadarScanView:1.0.1' } 源码:AndroidRadarScanView 效果图 XML <com.kongqw.radarscanviewlibrary.RadarScanView android:id="@+id/radarScanView" android:layout_width="match_parent" android:layout_height="match_parent" /> 初始化 radarScanView = (RadarScanView) findViewById(R.

继续阅读

Gradle常用技巧

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN Gradle http://google.github.io/android-gradle-dsl/current/index.html https://docs.gradle.org/current/userguide/java_plugin.html 打包多个版本 开发过程中我们经常需要打包多个版本的apk,最为常见的,一个是release版本,一个是debug版本,他们可能使用的api也有所区别,手动改起来总是很麻烦。 我们可以通过Gradle,配置多个版本,他们有各自的参数来区分不同的版本。如下,在 app/build.gradle 系统默认会给我生成release版本,我们可以手动自己添加一个版本,我这里命名为debug,分别添加了三种类型的参数。 apply plugin: 'com.android.application' android { …… buildTypes { release { …… buildConfigField("boolean", "isDebug", "false") } debug { // 添加了boolean类型的参数 buildConfigField("boolean", "isDebug", "true") // 添加了String类型的参数 buildConfigField("String", "coder", "\"kongqw\"") // 添加了int类型的参数 buildConfigField("int", "age", "26") } } } …… dependencies { …… } 添加完成后Rebuild,会在 BuildConfig 下看到我们添加的参数 因为是静态变量,取值时直接用类名点变量名即可 上述属于在Java代码中添加字段,同样的,Gradle也支持添加xml属性,类似这样 apply plugin: 'com.android.application' android { …… defaultConfig { …… } buildTypes { release { …… } debug { …… resValue("bool", "is_debug", "true") resValue("string", "coder", "\"kongqw\"") resValue("integer", "age", "26") } } } dependencies { …… } 添加完以后Rebuild,会在generated.

继续阅读

打造简洁高效的动态权限管理器

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 GitHub地址:PermissionsManager 随着Android 6.0的普及,动态权限的重要性也开始时慢慢体现出来。为了更好的保护用户隐私,Android 6.0要求在进行敏感操作之前,必须要向用户请示申请权限。 如何使用,在之前的文章里也已经介绍过了,但是用起来比较麻烦。Android6.0动态获取权限 我希望可以封装一下,使用之前创建一个动态权限的管理对象,他有两个回调来告诉我权限申请成功或者失败,像这样: mPermissionsManager = new PermissionsManager(this) { @Override public void authorized(int requestCode) { // TODO 权限通过 } @Override public void noAuthorization(int requestCode, String[] lacksPermissions) { // TODO 有权限没有通过 } }; 使用的时候,可以直接调用一个方法,把要请示的权限传进去就可以进行校验,像这样: // 检查权限 mPermissionsManager.checkPermissions("请求码", "要校验的权限"); 于是乎,下面封装的动态权限管理器就来了: 动态权限管理器 package com.kongqw.permissionslibrary; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.

继续阅读

Android自定义View绘图基础

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN Android自定义View绘图基础 View的测量 控件的测量可以说是固定写法,原生的View只支持EXACTLY的测量模式,我们自定义的控件可以重写onMeasure方法 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getMeasuredSize(widthMeasureSpec), getMeasuredSize(heightMeasureSpec)); } onMeasure方法给我们返回的widthMeasureSpec和heightMeasureSpec,我们并不能直接拿过来使用,需要使用MeasureSpec类进行解析,来获取测量后的具体值。 首先需要获取测量模式 MeasureSpec.getMode(measureSpec) getMode方法返回是测量的模式,有以下3种类型: - MeasureSpec.EXACTLY : 精确值模式(指定值/match_parent) - MeasureSpec.AT_MOST : 最大值模式(wrap_content) - MeasureSpec.UNSPECIFIED : 不指定大小的测量模式(一般用不上) 获取到了测量模式以后,获取测量后的大小 MeasureSpec.getSize(measureSpec) 根据上面的意思,可以封装我们的getMeasuredSize方法 // 默认大小 private static final int DEFAULT_SIZE = 200; /** * 获取测量后的大小 * * @param measureSpec measureSpec * @return measuredSize */ private int getMeasuredSize(int measureSpec) { switch (MeasureSpec.getMode(measureSpec)) { case MeasureSpec.

继续阅读

Android与Javascript交互

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 本篇参考Android与HTML+JS交互入门 效果图 加载本地Html contentWebView = (WebView) findViewById(R.id.webview); // 加载Assets下的Html contentWebView.loadUrl("file:///android_asset/html/test.html"); 启用Javascript contentWebView.getSettings().setJavaScriptEnabled(true); contentWebView.addJavascriptInterface(this, "android"); Android调用Javascript的方法 Javascript写法 <script type="text/javascript"> function jsFunction(){ document.getElementById("content").innerHTML = "JS方法被调用"; } function jsFunctionArg(arg){ document.getElementById("content").innerHTML = "JS方法被调用并收到参数:<br/>" + arg; } </script> Android写法 // 调用JS的jsFunction方法 contentWebView.loadUrl("javascript:jsFunction()"); // 调用JS的jsFunctionArg方法 contentWebView.loadUrl("javascript:jsFunctionArg('[Android传递过来的数据]')"); Javascript调用Android的方法 Android方法 @JavascriptInterface public void androidFunction() { Snackbar.make(contentWebView, "Android的方法被调用", Snackbar.LENGTH_SHORT).show(); } @JavascriptInterface public void androidFunction(String text) { Snackbar.make(contentWebView, "Android的方法被调用并收到参数 : \n" + text, Snackbar.

继续阅读