首页 文章 精选 留言 我的

精选列表

搜索[单工作区],共10000篇文章
优秀的个人博客,低调大师

Android 8.0 新特性之语言区国际化和隐私性

语言区域和国际化 Android 7.0引入了能指定默认类别语言区域的概念,某些API在使用默认的DISPLAY类别语言区域时,仍然使用的是不带参数Locale.getDefault()函数。在Android 8.0,以下的一些函数使用Locale.getDefault(Category.DISPLAY)来代Locale.getDefault(): Currency.getDisplayName(); Currency.getSymbol(); Locale.getDisplayScript(). 当Locale参数指定的displayScript值不可用时,Locale.getDisplayScript(Locale)回退到Locale.getDefault(). 以上的函数调用时传入参数为null时,都会抛出NullPointerException 时区名称的分析方法发生了变化。之前,Android设备使用在启动时取样的系统时钟值,用来分析日期时间的时区名称。所以如果在启动时或者一些少数情况下系统时钟出现错误,会导致分析结果出现问题。现在,一般情况下,分析时区名称时使用ICU和当前的系统时钟值。此种分析方法能提供更准确的结果,使用SimpleDateFormat等类可能会与之前的Android版本得到的结果不同。 3.Android 8.0的ICU库更新到了版本58. 隐私性 Android 8.0对平台的隐私性有关的变更: 改变了标识符的处理方式。在OTA之前安装的Android 8.0的应用,ANDROID_ID的值保持不变,除非在OTA之后卸载了又重新安装,在OTA后在卸载期间要保持ANDROID_ID值保留,可以利用key/value来备份。 2.在Android 8.0上,由应用签署秘钥、用户和设备来确定唯一的ANDROID_ID值,因此在相同的设备上同一用户下运行的具有不同签名应用页不会有相同的Android ID。 签名相同,在OTA到Android 8.0之前未安装的应用,ANDROID_ID的值在软件包卸载或重新安装时就不会发生变化。 系统更新导致软件包签名发生变化,ANDROID_ID的值也不会变。 要借助一个简单、标准的系统实现获利的应用,使用广告ID, 广告 ID 是 Google Play 服务针对广告服务提供的唯一 ID,此 ID 可由用户重置。 查询 net.hostname 系统属性返回的结果为空。 系统属性 net.dns1、net.dns2、net.dns3 和 net.dns4 不再可用。 获取DNS之类的网络的连接信息,具有ACCESS_NETWORK_STATE权限的应用可以注册NetworkRequest 或 NetworkCallback 对象来获取,在Android5.0后才可使用。 废弃Build.SERIAL 。新的获取硬件序列号的的函数为Build.getSerial(),需要READ_PHONE_STATE权限。 LauncherApps API不再允许work profile apps访问primary profile apps的信息,与之前一样,尝试访问没有关联的个人资料会引发SecurityExceptions。当某个用户被配置在托管配置文件中时,LauncherApps API的行为就像同一的配置文件组的其它配置文件中没有安装任何应用一样。 http://blog.csdn.net/wsq_tomato/article/details/79180475

优秀的个人博客,低调大师

Java Nio中的三种内存映射缓冲区---MappedByteBuffer

开始有点跟不上实际思路了, 今天暂停吧。 作个记录。 package com.ronsoft.books.nio.channels; import java.io.File; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class MapFile { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub File tempFile = File.createTempFile("mmaptest", null); RandomAccessFile file = new RandomAccessFile(tempFile, "rw"); FileChannel channel = file.getChannel(); ByteBuffer temp = ByteBuffer.allocate(100); temp.put("This is the file content".getBytes()); temp.flip(); channel.write(temp, 0); temp.clear(); temp.put("This is more file content".getBytes()); temp.flip(); channel.write(temp, 8192); MappedByteBuffer ro = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); MappedByteBuffer rw = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size()); MappedByteBuffer cow = channel.map(FileChannel.MapMode.PRIVATE, 0, channel.size()); System.out.println("Begin"); showBuffers(ro, rw, cow); cow.position(8); cow.put("COW".getBytes()); System.out.println("Change to COW buffer"); showBuffers(ro, rw, cow); rw.position(9); rw.put(" R/W".getBytes()); rw.position(8194); rw.put(" R/W".getBytes()); rw.force(); System.out.println("Change to R/W buffer"); showBuffers(ro, rw, cow); temp.clear(); temp.put("Channel write ".getBytes()); temp.flip(); channel.write(temp, 0); temp.rewind(); channel.write(temp, 8202); System.out.println("Write on channel"); showBuffers(ro, rw, cow); cow.position(8207); cow.put(" COW2".getBytes()); System.out.println("Second change to COW buffer"); showBuffers(ro, rw, cow); rw.position(0); rw.put(" R/W2 ".getBytes()); rw.position(8210); rw.put(" R/W2 ".getBytes()); rw.force(); System.out.println("Second change to R/W buffer"); showBuffers(ro, rw, cow); channel.close(); file.close(); tempFile.delete(); } public static void showBuffers(ByteBuffer ro, ByteBuffer rw, ByteBuffer cow) throws Exception { dumpBuffer("R/O", ro); dumpBuffer("R/W", rw); dumpBuffer("COW", cow); System.out.println(""); } public static void dumpBuffer(String prefix, ByteBuffer buffer) throws Exception { System.out.print(prefix + ": '"); int nulls = 0; int limit = buffer.limit(); for (int i = 0; i < limit; i++) { char c = (char)buffer.get(i); if (c == '\u0000') { nulls++; continue; } if (nulls != 0) { System.out.print("|[" + nulls + " nulls]|"); nulls = 0; } System.out.print(c); } System.out.println("'"); } } Begin R/O: 'This is the file content|[8168 nulls]|This is more file content' R/W: 'This is the file content|[8168 nulls]|This is more file content' COW: 'This is the file content|[8168 nulls]|This is more file content' Change to COW buffer R/O: 'This is the file content|[8168 nulls]|This is more file content' R/W: 'This is the file content|[8168 nulls]|This is more file content' COW: 'This is COW file content|[8168 nulls]|This is more file content' Change to R/W buffer R/O: 'This is t R/Wile content|[8168 nulls]|Th R/Ws more file content' R/W: 'This is t R/Wile content|[8168 nulls]|Th R/Ws more file content' COW: 'This is COW file content|[8168 nulls]|Th R/Ws more file content' Write on channel R/O: 'Channel write le content|[8168 nulls]|Th R/Ws moChannel write t' R/W: 'Channel write le content|[8168 nulls]|Th R/Ws moChannel write t' COW: 'This is COW file content|[8168 nulls]|Th R/Ws moChannel write t' Second change to COW buffer R/O: 'Channel write le content|[8168 nulls]|Th R/Ws moChannel write t' R/W: 'Channel write le content|[8168 nulls]|Th R/Ws moChannel write t' COW: 'This is COW file content|[8168 nulls]|Th R/Ws moChann COW2ite t' Second change to R/W buffer R/O: ' R/W2 l write le content|[8168 nulls]|Th R/Ws moChannel R/W2 t' R/W: ' R/W2 l write le content|[8168 nulls]|Th R/Ws moChannel R/W2 t' COW: 'This is COW file content|[8168 nulls]|Th R/Ws moChann COW2ite t'

优秀的个人博客,低调大师

【匠心】昆腾中国区技术总监王刚谈广播影视行业存储

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 谈到广播影视行业的存储解决方案,就不得不提昆腾。作为一家拥有三十多年存储经验的老牌存储厂商,昆腾通过提供技术和营销方面的支持,帮助那些在广播与后期制作、视频监控、网络安全、数据保护和归档等关键战略市场扩张其产品的技术合作伙伴提供昆腾领先的解决方案和产品。 【责任编辑: 张诚 TEL:(010)68476606】

优秀的个人博客,低调大师

Kubernetes API server工作原理

作为Kubernetes的使用者,每天用得最多的命令就是kubectl XXX了。 kubectl其实就是一个控制台,主要提供的功能: 1. 提供Kubernetes集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更; 2. 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd) 也就是说,我们在终端里输入的每个kubectl命令,实际上都是一个发往Kubernetes API server的Restful API调用。 我们可以做个实验: kubectl get secret -v=9, 通过-v=9设置最高级别的trace: 从输出观察到为了取回所有的secret而进行的API server的调用url:https://xxxx/api/v1/

优秀的个人博客,低调大师

ios开发准备工作

这篇文章有点马后炮的感觉。实际上,写这篇文章的时候,我已经在开始进行ios开发了。写这篇文章,既是总结,也是希望给有想做ios开发,却又不知道如何下手的人做一个入门指导。 1.工具: 硬件:一台苹果机,如果资金不足的话,搞个黑苹果也可以。如果是有公司赞助的话,当然是搞一个mac一体机,iphone,ipad这些东西都搞齐全了。网上常有人用vmware虚拟机搞个苹果系统来做开发,不过太吃内存了。一般机器,如果内存没有4G,建议还是不要尝试了。 软件:xcode,这个是苹果自带IDE,虽然有一些问题,不过这个是目前搞ios开发的唯一选择了。xcode这个ide也是要花时间去学习如何使用的,用惯了visual studio的我,可是花了好一段时间才慢慢适应这个工具。 2.理论知识: objective c:ios开发的语言基础。网上有本《ojective c基础教程》,写的还可以。我就是看的这本书。在ppurl.com这个网站上有下载。 cocoa框架相关知识:这个是苹果提供的ios上层的框架。cocoa框架和objective c的关系类似于mfc和c++的关系。只懂objectivec是不行的。cocoa的学习可以看看 《learn cocoa on the mac》。不过结合我自己的开发入门来看,还是先看《iphone 开发基础教程》,等到能做简单应用后,再抽时间看cocoa框架。同样,这两本书在ppurl.com上也有。 3.参考资料和教学资源 苹果官方给出了比较详尽的开发资料。https://developer.apple.com/devcenter/ios/index.action这个比较考验个人英语阅读理解能力,不过既然投身IT行业了,自然要有这个觉悟。 土豆上有一个iphone开发的系列视频。http://www.tudou.com/plcover/ICHpDsjAHMk/个人觉得讲的稍微有点拖沓,不过还好,视频制作者的功底看起来还不错,作为入门的视频,还是挺好的。 4.其它 没有其他了,剩下的就是变学变写实践。搞开发,理论是一方面,但实践更重要。不论是熟悉开发环境,验证理论,都要耗费不少时间。要有代码虐我千万遍,我待代码如初恋的觉悟。所以,耐心学习,逐步积累,总会熟能生巧,成为ios开发的高手的。 本文转自leipei博客园博客,原文链接:http://www.cnblogs.com/leipei2352/archive/2013/04/10/3011496.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册