首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Java 开发新选择?Apache NetBeans IDE 9.0 备受好评

Apache NetBeans 9.0 目前已发布Beta 版本,离正式版本越来越近。9.0 版本的主要目标囊括 Oracle 捐赠的大量代码,以及提供 Java 9 和 10 支持。 Apache NetBeans 近期在社区上发起了一项满意度调查,用于验收用户如何对 9.0 版本的看法,以及与8.2 版本的对比。日前,该调查结果公布,具体如下: 整体品质方面,32.5%的用户认为Apache NetBeans IDE 9.0 优于 8.2,有 10.3% 的用户认为8.2 更好,57.3% 的用户认为二者相差不大。 性能方面,依然是大多数用户认为差距并不明显,有 27.4% 的用户认为Apache NetBeans IDE 9.0 优于 8.2 。 高达 75.2 %的受访用户认为 Apache NetBeans IDE 9.0 的 Java 编辑功能符合他们的预期,另有 18.8% 的人认为还存在一些问题有待完善。其中,吐槽点主要集中在代码完成和编译上。 对于 Java 调试器,65.8% 的用户认为 Apache NetBeans IDE 9.0 提供了足够的调试支持。有意思的,有 14.5% 的受访用户表示他们根本不使用 Apache NetBeans 中的 Java 调试功能,或许他们正在同时使用另一款 IDE ? 最后,约有 2/3 的受访者认为 Apache NetBeans IDE 9.0 对Java 重构的支持是合适的。但是,也有超过 20% 的用户认为存在一些需要解决的问题。比如有评论指出“删除和重命名文件不一致会引发异常,更改接口类型有时也会导致异常,接口类型会发生变化,但所有实现都需要手动更改“等等。此外,有 8.5% 的人表示他们不使用 NetBeans 的 Java 重构功能。 调查结果报告地址 对于 Apache NetBeans IDE 9.0 ,你怎么看?是否会在日常工作中使用?欢迎评论。 本文来自云栖社区合作伙伴“开源中国” 本文作者:王练 原文链接

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

Android开发教程 - 使用Data Binding(二)集成与配置

本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fragment中的使用 使用Data Binding(五)数据绑定 使用Data Binding(六)RecyclerView Adapter中的使用 使用Data Binding(七)使用BindingAdapter简化图片加载 使用Data Binding(八)使用自定义Interface 使用Data Binding Android Studio不能正常生成相关类/方法的解决办法 安装依赖库,配置工程 Data Binding安装和配置都非常简单,仅需简单的两步即可完成。 更新SDK 打开SDK管理工具,下载最新的Android Support库。 配置工程的Gradle android { … dataBinding { enabled = true } } 加入完成后,然后点击Sync Now,完成后就可以使用Data Binding强大的功能了。 总结 这一篇我们介绍了Data Binding的配置,下一篇我们将介绍在Activity中使用Data Binding的内容,请点击:使用Data Binding(三)在Activity中的使用 如有更多疑问,请参考我的其它Android相关博客:我的博客地址

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

Python开发的十个Tips,你知道几个?

下面是十个Python中很有用的贴士和技巧。其中一些是初学这门语言常常会犯的错误。 注意:假设我们都用的是Python 3 1. 列表推导式 你有一个list:bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子:[2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来做 bag = [ 1 , 2 , 3 , 4 , 5 ] for i in range(len(bag)): bag[i] = bag[i] * 2 但是有更好的方法: bag = [elem * 2 for elem in bag] 很简洁对不对?这叫做Python的列表推导式。 2. 遍历列表 还是上面的列表。如果可能尽量避免这样做: bag = [ 1 , 2 , 3 , 4 , 5 ] for i in range(len(bag)): print(bag[i]) 取而代之的应该是这样: bag = [ 1 , 2 , 3 , 4 , 5 ] for i in bag: print(i) 如果x是一个列表,你可以对它的元素进行迭代。多数情况下你不需要各元素的索引,但如果你非要这样做,那就用enumerate函数。它像下边的样子: bag = [ 1 , 2 , 3 , 4 , 5 ] for index, element in enumerate(bag): print(index, element) 非常直观明了。 3. 元素互换 如果你是从java或者C语言转到Python来,可能会习惯于这样: a = 5 b = 10 # 交换 a 和 b tmp = a a = b b = tmp 但Python提供了一个更自然更好的方法! a = 5 b = 10 # 交换a 和 b a, b = b, a 4. 初始化列表 假如你要一个是10个整数0的列表,你可能首先想到: bag = [] for _ in range( 10 ): bag.append( 0 ) 换个方式吧: bag = [0] * 10 看,多优雅。 注意:如果你列表包含了列表,这样做会产生浅拷贝。 举个例子: bag_of_bags = [[ 0 ]] * 5 # [[0], [0], [0], [0], [0]] bag_of_bags[ 0 ][ 0 ] = 1 # [[1], [1], [1], [1], [1]] Oops!所有的列表都改变了,而我们只是想要改变第一个列表。 改一改啦: bag_of_bags = [[ 0 ] for _ in range( 5 )] # [[0], [0], [0], [0], [0]] bag_of_bags[ 0 ][ 0 ] = 1 # [[1], [0], [0], [0], [0]] “过早优化是万恶之源” 问问自己,初始化一个列表是必须的吗? 5. 构造字符串 你会经常需要打印字符串。要是有很多变量,避免下面这样: name = "Raymond" age = 22 born_in = "Oakland, CA" string = "Hello my name is " + name + "and I'm " + str(age) + " years old. I was born in " + born_in + "." print(string) 额,这看起来多乱呀?你可以用个漂亮简洁的方法来代替,.format。 这样做: name = "Raymond" age = 22 born_in = "Oakland, CA" string = "Hello my name is {0} and I'm {1} years old. I was born in {2}." .format(name, age, born_in) print(string) 6. 返回tuples(元组) Python允许你在一个函数中返回多个元素,这让生活更简单。但是在解包元组的时候出出线这样的常见错误: def binary(): return 0 , 1 result = binary() zero = result[ 0 ] one = result[ 1 ] 这是没必要的,你完全可以换成这样: def binary(): return 0 , 1 zero, one = binary() 要是你需要所有的元素被返回,用个下划线_: zero, _ = binary() 就是这么高效率! 7. 访问Dicts(字典) 你也会经常给dicts中写入key,value(键,值)。 如果你试图访问一个不存在的于dict的key,可能会为了避免KeyError错误,你会倾向于这样做: countr = {} bag = [ 2 , 3 , 1 , 2 , 5 , 6 , 7 , 9 , 2 , 7 ] for i in bag: if i in countr: countr[i] += 1 else : countr[i] = 1 for i in range( 10 ): if i in countr: print( "Count of {}: {}" .format(i, countr[i])) else : print( "Count of {}: {}" .format(i, 0 )) 但是,用get()是个更好的办法。 countr = {} bag = [ 2 , 3 , 1 , 2 , 5 , 6 , 7 , 9 , 2 , 7 ] for i in bag: countr[i] = countr.get(i, 0 ) + 1 for i in range( 10 ): print( "Count of {}: {}" .format(i, countr.get(i, 0 ))) 当然你也可以用setdefault来代替。 这还用一个更简单却多费点开销的办法: bag = [ 2 , 3 , 1 , 2 , 5 , 6 , 7 , 9 , 2 , 7 ] countr = dict([(num, bag.count(num)) for num in bag]) for i in range( 10 ): print( "Count of {}: {}" .format(i, countr.get(i, 0 ))) 你也可以用dict推导式。 countr = {num: bag.count(num) for num in bag} 这两种方法开销大是因为它们在每次count被调用时都会对列表遍历。 8 使用库 现有的库只需导入你就可以做你真正想做的了。 还是说前面的例子,我们建一个函数来数一个数字在列表中出现的次数。那么,已经有一个库就可以做这样的事情。 from collections import Counter bag = [ 2 , 3 , 1 , 2 , 5 , 6 , 7 , 9 , 2 , 7 ] countr = Counter(bag) for i in range( 10 ): print( "Count of {}: {}" .format(i, countr[i])) 一些用库的理由: ●代码是正确而且经过测试的。 ●它们的算法可能会是最优的,这样就跑的更快。 ●抽象化:它们指向明确而且文档友好,你可以专注于那些还没有被实现的。 ●最后,它都已经在那儿了,你不用再造轮子了。 9. 在列表中切片/步进 你可以指定start的点和stop点,就像这样list[start:stop:step]。我们取出列表中的前5个元素: bag = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] for elem in bag[: 5 ]: print(elem) 这就是切片,我们指定stop点是5,再停止前就会从列表中取出5个元素。 要是最后5个元素怎么做? bag = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] for elem in bag[- 5 :]: print(elem) 没看明白吗?-5意味着从列表的结尾取出5个元素。 如果你想对列表中元素间隔操作,你可能会这样做: bag = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] for index, elem in enumerate(bag): if index % 2 == 0 : print(elem) 但是你应该这样来做: bag = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] for elem in bag[:: 2 ]: print(elem) # 或者用 ranges bag = list(range( 0 , 10 , 2 )) print(bag) 这就是列表中的步进。list[::2]意思是遍历列表同时两步取出一个元素。 你可以用list[::-1]很酷的翻转列表。 10. tab键还是空格键 长时间来看,将tab和空格混在一起会带来很多不必要的麻烦,你会看到IndentationError: unexpected indent。不管你选择tab键还是空格键,你应该在你的文件和项目中一直保持使用。 一个使用空格而不是tab的原因是,tab不是在所有编辑器中都一样的。视呢所用的编辑器,tab可能会被当作2到8个空格。 你也可以在写代码时用空格来定义tab。这样你可以自己选择用几个空格来当做tab。大多数Python用户是用4个空格。 原文发布时间为:2018-10-8 本文来自云栖社区合作伙伴“机器学习算法与Python学习”,了解相关信息可以关注“机器学习算法与Python学习”。

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

Android 开发中的代码片段(3)地图操作相关

前言 收集常用的代码块,留存记录。此次代码块包含:唤起高德地图导航、唤起百度地图导航 代码 判断手机内安装的地图 /**判断是否安装目标应用*/ private boolean isInstallByread(String packageName) { return new File("/data/data/" + packageName) .exists(); } /** * 判断和打开地图 */ public void navigationMap() { //1.两个地图都安装了,让用户选择 boolean installBaidu = isInstallByread("com.baidu.BaiduMap"); boolean installAmap = isInstallByread("com.autonavi.minimap"); if (installBaidu && installAmap) {//两个地图都安装了 让用户进行选择 showSelectMap(); } else if (installBaidu) {//安装了百度地图 startBaiduMap(); } else if (installAmap) {//安装了高德地图 startAmapMap(); } else {//两个地图都没安装,使用web Api进行导航,不建议实现 //startWebMap(); T.showToast(mActivity, "您的手机未安装高德地图或者百度地图"); } } 唤起高德地图导航(驾车) /** * 唤起高德地图 */ private void startAmapMap() { try { Intent intent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("androidamap://route?sourceApplication=导航demo" + "&dlat=" + mEndLat + "&dlon=" + mEndLng + "&dname=" + name + "&dev=0&t=2")); intent.setPackage("com.autonavi.minimap"); mActivity.startActivity(intent); } catch (Exception e) { T.showToast(mActivity, "调起高德地图失败"); } } 相关参数: 参数 说明 是否必填 sourceApplication 当前app的名字 dlat 纬度 dlon 经度 name 终点的名称 dev 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密) t 导航方式:0 速度快1 费用少2 路程短;3 不走高速4 躲避拥堵5 不走高速且避免收费6 不走高速且躲避拥堵7 躲避收费和拥堵8 不走高速躲避收费和拥堵 效果如下: 高德地图驾车导航演示 唤起百度地图导航(驾车) /** * 移动APP调起Android百度地图方式 */ private void startBaiduMap() { try { Intent intent = new Intent(); intent.setData(Uri.parse("baidumap://map/direction?destination=name:" + name + "|" + "latlng:" + mEndLat + "," + mEndLng + "&mode=driving&car_type=TIME")); mActivity.startActivity(intent); // 启动调用 } catch (Exception e) { T.showToast(mActivity, "调起百度地图失败"); } } 相关参数: 参数 说明 destination 目的地名称 latlng 纬度,进度 拼接字符串 mode 导航模式:transit(公交)driving(驾车)walking(步行)riding(骑行) car_type 驾车路线规划类型:BLK:躲避拥堵(自驾)TIME:高速优先(自驾)DIS:不走高速(自驾)FEE:少收费(自驾)DEFAULT: 默认偏好;默认使用地图中已保存的路线偏好(缺省值)。 除缺省值外,若用户已勾选车牌限行,其他类型都会默认增加车牌限行的偏好。 最后 本文只写了驾车相关的导航实例,剩余的公交、步行、骑行可参考官方文档。 官方文档: 高德地图 百度地图 未完待续、后续补充!我的博客地址

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

开发过程中快速抓包并解析

这几天小编在工作中遇到了一个灵异事件,客户端使用的是安卓原生系统,服务端使用的是java。需求就是客户端在照相的时候可以实时上传照片。后台接收并保存,并且可以在平台上显示。看似简单的功能,确有个很大的坑。有2个平台,192.168.31.87平台是测试环境,192.168.31.239是演示环境,测试环境,演示环境,还有安卓客户端代码都是一样的,连mq,redis,nginx,数据库都是一样的。但是安卓端上传测试环境一直报java.net.SocketException,在演示环境上是正常的。检查服务端代码。我首先用了postman进行测试. image.png 由于已经上传过一张一样的照片,所以这里返回failed,但是请求是200.说明是调用正常。然后我在微服务上写了个测试类,用httpclient调用结果也是正常。 image.png 在安卓客户端上传的时候,正常和不正常的log分别是 正常: response-->Response{protocol=http/1.1, code=200, message=OK, url=http://192.168.31.239:8081/api/collDataUpload?para={%22fileName%22:%2220180822_185110_523.jpg%22,%22pno%22:%2220180821%22,%22dkey%22:%2215948c07-c718-4f32-a0af-4b7841fa95a0%22,%22stime%22:%221534935070523%22,%22etime%22:%221534935071000%22}} 不正常: response-->Response{protocol=http/1.1, code=400, message=, url=http://192.168.31.87:8081/api/collDataUpload?para={%22fileName%22:%2220180822_184559_902.jpg%22,%22pno%22:%228230%22,%22dkey%22:%22d351aa68-bace-438f-8d08-89ff598d4e04%22,%22stime%22:%221534934759902%22,%22etime%22:%221534934760000%22}} 安卓客户端部分代码 /** * 同步基于post的图片上传 * * @param url * @param file * @return */ public Response uploadPic(String url, File file, String fileName) throws IOException { MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); Log.i("huang", "files[0].getName()==" + files[0].getName()); //第一个参数要与Servlet中的一致 builder.addFormDataPart("file", fileName, RequestBody.create(MediaType.parse(guessMimeType(fileName)), file)); MultipartBody multipartBody = builder.build(); Request request = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody, listener)).build(); okHttpClient.newCall(request).enqueue(callback); } 服务端 image.png 然后客户端调用服务端连这个接口都没进来,首先我判断配置文件是否有对文件大小进行过滤,然后看了filter也没什么。百思不得奇解。于是做了很多操作。虽然最后问题还是没=解决,但是到get到了很多新技能。 非常重要的一个技能:抓包。 ··· 大致步骤为: 1.首先在linux服务器上执行指令 2.调用接口,然后执行指令把linux文件下载到本地 3.使用Wireshark查看日志 需要使用的linux命令 netstat -tupln | grep 5088 tcpdump -i any -p -s 0 -w /tmp/cap.pcap sz /tmp/cap.pcap ··· image.png image.png image.png 然后到开始菜单换中打开 image.png Wireshark这软件,小伙伴百度下载即可 地址栏中可以输入过滤条件: ip.addr == 192.168.31.182 and http image.png 选中其中你想看的包,右键追溯流--->TCP流或者http流 image.png 这里大致解释一下: Content-Type:是上传文件格式multipart/form-data是指图片。 boundary=XXXX,这是前端传的时候使用的一种形式addBoundary Content-Length是内容大小 Host:是服务器主机地址 Connection是链接状态 Accept-Encoding是接收的编码格式 User-Agent:是用户上传的形式,这里安卓使用的是okhttp/3.6.0 content-Desposition是上下文的描述 content-Type:内容类型 很开心,又get到了一个新技能,但是我的问题还是没有解决。目前的解决办法就是自己在写个安卓端,单独用做个按钮,然后用okhttp上传文件到平台。 另外在操作安卓的时候遇到了adb.exe已停止工作,然后开启不了虚拟机的问题。 image.png 出错画面: image.png 一般出现这个错误的原因都是由于adb的默认端都5037,被其他程序占用了。撸主我就碰到过被酷我音乐,鲁大师和被360mobile的exe程式占用了,后来这些程式全部被我删了! 首先我们应该在电脑中查看5037的端口情况,输入 netstat -aon|findstr "5037": image.png 我们可以看到PID为4476的程式使用了关端口,然我我们打开任务管理器。 image.png 我们可以看到进程为“360MobileLoader.exe *32”的进程占用了5037端口。理论上来说我们结束这个进程应该就行了。但是问题来了! image.png image.png 居然不让我删除!!!!!!!!PS:我自己的电脑,删不删除还需要你的同意? image.png 选择打“”开文件位置“”,找到对应的exe程式,我这儿使用的是360强制删除,PS:普通删除的方同样不允许我删除。 我删除了之后,电脑重新注销了一下,adb.exe正常启动起来了。 Genymotion又开启了。小姐姐又回来了哈哈。 image.png 在附送一个知识:无界鼠标.就是一个鼠标键盘控制N台电脑(可以是不同操作系统)附上链接 image.png

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

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文件系统,支持十年生命周期更新。

用户登录
用户注册