详情

全站展示位

使用 Rust 开发 Android 底层库,并简化 Java 与 Rust 相互操作 |

前言 提到JNI,大家都会想到C,C++.不过如今Rust又给我们增加了一个选项,借助rust的jni库( 关于 Rust 环境搭建、配置 Rust Android targets、linker,以及如何在 Android 上如何直接运行 Rust 代码,可以看上篇文章 将 Rust 编译为可在 Android 上使用的二进制文件 本文主要介绍如何使用 Rust 借助 J4RS 方便快捷的编写 Android Jni: 阅读本文,你需要具备、了解一下知识: Android 编写 JNI 的基本流程 Rust 代码基本的阅读能力 Android 开发的基本流程 Android 集成 Rust 配置 Rust Android Gradle Plugin Rust Android Gradle Plugin 这个 Gradle 插件的主要功能是帮你自动配置 Rust-Android 交叉编译,并将编译产物自动添加到 Android 项目。 这并不是必须的,你同样可以手动 build rust 项目。然后手动复制到 Android Studio 中使用。 因为我使用的是最新版本的 gradle , 采用 Kotlin kts 编写。在语法上稍有不同,旧版本写法可以在项目的 README 查看。。。

推荐

解决RecyclerView嵌套ScollView5.0以上失去惯性 |

 项目中发现,RecyclerView在5.0以上版本滑动不流畅,滑动的手指一离开屏幕,列表就不动了,没有惯性效果。调查原因,发现应该是与ScrollView的有关。 在网上找了找解决方案,有人说把targetSDK改成21可以解决问题,但是并不好用。 解决: 为recyclerView设置禁止嵌套滑动 setNestedScrollingEnabled(false);

Android 内存泄露实践分析 |

定义 ​内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。 内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。 ​ ——来自《百度百科》 影响 导致OOM 糟糕的用户体验 鸡肋的App存活率 成效 内存泄露是一个持续的过程,随着版本的迭代,效果越明显 由于某些原因无法改善的泄露(如框架限制),则尽量降低泄露的内存大小 内存泄露实施后的版本,一定要验证,不必马上推行到正式版,可作为beta版持续观察是否影响/引发其他功能/问题 内存泄露实施后,项目的收获: OOM减少30%以上 平均使用内存从80M稳定到40M左右 用户体验上升,流畅度提升 存活率上升,推送到达率提升 类型 IO FileStream Cursor Bitmap Context 单例 Callback Service BraodcastReceiver ContentObserver Handler Thread 技巧 慎用Context Context概念 四大组件Context和Application的context使用参见下表 **善用Reference ** Java引用介绍 Java四种引用由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用 表格说明 **复用ConvertView ** 复用详解 对象释放 遵循谁创建谁释放的原则 示例:显示调用clear列表、对象赋空值 分析  原理 Java内存分配机制 Java垃圾回收机制 根本原因 关注堆内存 怎么解决 详见方案 实践分析

Android实现图片缩放与旋转 |

本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下: package com.android.matrix;import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ImageView.ScaleType; /** * Android实现图片缩放与旋转。 * @author Administrator * */ public class MatixActivity extends Activity { public void onCreate(Bundle icicle) { super.onCreate(icicle); setTitle("Android实现图片缩放与旋转。"); LinearLayout linLayout = new LinearLayout(this); //加载需要操作的图片,这里是一张图片 Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.r); //获取这个图片的宽和高 int width = bitmapOrg.

用组合代替继承能为 Activity 带来什么 |

原文链接 : Composition over Inheritance,What it means for your Activities 原文作者 : Josh Brown 译者 : chaossss 校对者: Mr.Simple 状态 : 完成  事实上我们在很多 Java 进阶书籍上看到过“开发时应该更倾向于选择组合而不是继承”的建议,为什么建议我们更倾向于而不是完全代替呢,因为当类 A 能完全代替另一个类 B(我们想让 B 成为 A 的父类)时,我们就应该使用继承,如果 A 仅仅是和 B 有着某些共同的行为,是不应该使用继承的(更多的讨论戳我)。然而,在我阅读别人的源码时,滥用继承的情况实在是太多了,多少人创建了一个 BaseActivity 后,就让所有 Activity 继承它,在子 Activity 中实现业务逻辑。  而且这样做问题大大的有,最鲜活的例子就是:Joe Newguy 加入到我们组,并实现了 ShinyFeatureActivity,那会组里没有任何规定强迫他必须让 ShinyFeatureActivity 继承于 BaseActivity,但他还是这么干了……万幸我们在 Code Review 时发现了这个问题。此外,如果每一个 Activity 都继承于 BaseActivity,在某些情况下,你可能要继承的是其他 Activity(例如:PreferenceActivity、ListActivity)。尽管大部分 Activity 的子类都有相应的 Fragment 代替,但还是有一部分是没有对应 Fragment 的,某些库仍然需要相应的 Activity 子类。  有些更潜在的问题是:有时候某些 Activity 需要这些行为,其他的 Activity 需要其他行为,而 Java 并不支持多继承,这就意味着我们得将行为有交集的 Activity 的所有行为放到一个独立的类里面。但这样做会降低可维护性,甚至带来性能影响。

心灵鸡汤

被优待的高考

文/蔚新敏

高考被优待,有的加分,有的优先录取,1994年我高考,优待睡竹躺椅。

高考前,邪门了,白天下雨晚上晴天,潮乎乎的热。我家有一个躺椅,竹板做的,躺上去,倍儿凉快,那是我爸的宝椅,平时谁都不能躺。7月6号晚上,我爸说:“明天你高考,今晚上躺椅归你,想躺到几点就几点。”我受宠若惊呀,这“小灶”开得别具一格,可能是我爸表达对我高考重视的唯一途径。

那天晚上,我和衣躺躺椅上看书,我爸把落地扇脑袋调成对着我呼呼吹,我是大暑天下河,凉快透了。

那么一躺就睡着了,一夜都没翻身。

早晨醒来,我的胳膊、脖子、腰、腿都好像坠着沙袋般发沉,各个关节都不活泛了,第一是让躺椅的竹板硌的,第二是电扇吹着了。我也不敢说,就那么去参加考试了。

我的座位在最后一排,我屁股上扎着蒺藜似的,坐不住凳子。腰酸,我就把腰挺得倍儿直溜,直着不舒服了我瘫桌上,过会儿再脖子拉长了腰板挺直了“眺望远方”……总之,人家都低头答题,我摇头晃脑可忙乎了,字都没写多少。

监考的老师走过来,也不问我怎么回事,给我脖子上抹了点风油精,以为我是被蚊子咬了呢。见我还不“老实”,估计是以为我偷看左右同学的答案,也不经过我同意,提溜起我的身体,直接把我的凳子往后拽,桌子往后挪。另外一个老师走过来,身体挡在我前面,恰好头顶一个吊扇,忽闪忽闪转,吹得我更难受。俩老师配合默契,瞅着我,意思是“这下你可凉快了”。我何尝不知道其实是防着我抄袭。那天的考试,我成了药店的抹布,苦透了。

第一天的考试不怎么好。可也不敢跟家里人说啊,吃罢晚饭,我爸说:“你辛苦了,今儿晚上,躺椅还归你,电扇还归你。”我赶紧溜到自己的床上,佯装睡着,待我爸叫我去睡躺椅,我假装睡得死死的,呼噜那个响哦,睡得那个沉哦,怎么叫都叫不醒。那天晚上,真热,我整夜大汗淋漓,第二天,浑身酸疼的感觉没了。

后来我就总结,把高考平常化,别给孩子太特殊的待遇,万一不适应,反而弄巧成拙。

父亲的考前忠告

文/李育蒙

说起高考,我不算成功者。第一年高考失利以后,我背上行囊南下深圳打工,在一家工厂喷油漆。工作了一个多月,父亲打来电话,问我想清楚没有是否复读?差不多同一时间,高三的班主任也打来电话劝我返校复读。因为家里条件不好,我还是非常犹豫。倒是父亲一再坚持要我上学,拗不过父亲,我辞掉了工作还是回学校复读。这其中一个最现实的动力是,班主任电话里和我说,已经向学校申请给我减免了费用。而我自己,也不并甘心就这样被“赶”进了城市。

因为经历了第一次的失败,那一年的复读时光,我学习更加认真,也懂得适当调整自己,成绩也一直稳定在年级前列。时间匆匆而过,转眼又到了高考季,因为是复读高考,总体感觉我比第一次稳当得多。不过因为是第二次高考,其实面临的压力比第一次更大。

让我没有想到的是,高考的前一天,居然在送考的人群里发现了父亲。远远看上去,父亲黑了很多,瘦了很多。父亲在考场外面租了个便宜的小旅馆,为了让我吃好,还特意从家里带了电饭锅,把从家里炒好的菜重新蒸热后让我吃。虽然高考期间的伙食比较好,但我觉得还是家里的饭菜更香。我知道,父亲是在用这样的方式,传递着家人对我的支持。

第二天早上,父亲送我到考场门口。他的话不多,只是拍了拍我的肩膀,说了句“放宽心态”。其实第一年高考更多的是败在了心态上。我看了看父亲,他的眼神里充满了信任和希望,走进考场,我心平静了很多,父亲的期许,于我而言更是一种力量。

每一堂考试出来和下一堂进考场前,我都能在人群中发现父亲。他依旧会轻轻地拍拍我的肩膀,那一拍,我觉得有无比的力量。

其实在我的印象里,父亲性格是比较孤僻的,生活的压力全落在他身上,他很少有情绪的表达。也正是这次高考,让我感到少有的父亲的温情。前前后后共三天,高考很快结束。虽然考得不是特别好,但我终究还是没有辜负父母的期望。

如今,多年过去了,我已经在城市立足,但我依然记得,高考那年,父亲拍拍我的肩膀,忠告我的那句“放宽心态”。虽然我知道有些路只能一个人走,但背后,依旧会有最可依靠的力量。

列表展示

主站展示位

使用 GoMobile 创建 Android、iOS 跨平台 WebSocket Library |

GoMobile 是 Go 语言的扩展,将 Go 代码编译为可在移动设备上运行的静态库或动态库,可在 iOS 和 Android 平台上使用。本文介绍如何使用 GoMobile 创建 Android 应用并在其中调用 Go 语言 WebSocket。 安装 GoMobile go install golang.org/x/mobile/cmd/gomobile@latest 创建 Go WebSocket 库 首先创建一个 Go WebSocket 服务端: mkdir go-websocket cd go-websocket go mod init go-socket // 使用 gomobile 初始 gomobile init 如果你无法使用 gomobile init 请检查 GOBIN 是否加入环境变量 我们使用在go 中广泛使用的gorilla/websocket来创建websocket服务端: go get github.com/gorilla/websocket 编写WebSocket服务端代码: package socket import ( "flag" "log" "net/

软件开发 |

琥珀之月,空谷之兰,皆是孤芳,既是孤芳,但求自赏便罢!

慧极必伤,情深不寿,强极则辱,谦谦君子,温润如玉 |

慧极必伤,情深不寿,强极则辱,谦谦君子,温润如玉: 这是金先生<书剑>里,乾隆送陈家洛佩玉上的刻字。大意:一个人太聪明智慧便会对自己有损伤,过于沉迷和执着的感情不会持续长久,过于突出的人势必会受到屈辱,君子应该如玉一般的温润沉稳,含蓄坚毅,不张扬,却自显价值。 金庸在《书剑恩仇录》中,借乾隆送陈家洛佩玉上之刻字,道出自己人生特别推崇的境界,正是这四句十六字。 但很有意思的是,如此佳句居然没有人能查其出处(人们都认为其境界颇深定有出处)。有人查遍孔孟老庄,以及四书五经,均无所获,故将此难题贴于网上,一年多来终无所获,故被称为“武侠与国文的一个绝题”。其中,最接近的答案是《国风·秦风·小戎》里有“言念君子,温其如玉。”,《易经》第十五卦中有“谦谦君子”,但仅此而已。 金庸“谦谦君子,温润如玉”之说不知其出处,但从《书剑》所蕴涵的他早期的人生 理想来看,这似乎是金庸所推崇的一种人生境界。 飞扬跳脱的个性不属于谦谦君子,因为,玉的光芒是凛于内而非形于外的。雍容自若的神采,豁达潇洒的风度,不露锋芒,不事张扬,无大悲大喜,无偏执激狂,生命的状态在这里呈现出一种成熟的圆润。 佛家有一个词,圆融,是跟这种成熟的圆润颇为相似的境界。是以佛家讲求戒嗔、戒痴、戒贪,无欲无求,尔后能不动声色、不滞于心。谦谦君子的圆润亦同此理。 而要达到这种境界是需要修炼的。修炼是一个很奇妙的词语,人生在世实质上就是一个修炼的过程,只不过并不是人人都可以修成正果。 修成佛、修成仙是尘世之人遥不可及的梦想,但磨去棱角、收敛光华、修成谦谦君子却并非太难的事情。容人之量是修成谦谦君子的前提。斤斤计较、小肚鸡肠修不成君子,开阔的心胸、通透的眼光,才是君子的气量。 于是,我们常常可以看到这样的人,荣损得失面前,总能一笑置之。正所谓,宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。 剑有双刃,谦谦君子亲切柔和,少了无拘无束的冲动莽撞,却也少了率性率真的刚猛豪放。正如一个人磨砺的过程一样,成熟的获得是以天真童趣的无可追回为代价的。 当然,“情深不寿,强极则辱”的背后,似乎也透着一种淡淡的无奈。试想,人活一世,谁人不想追求恒久?只是恒久不可强求,于是退一步海阔天空。这何尝不是一种迂回的战术、以求得宛转的余地?谁能说这种淡淡的无奈不是一种生存的智慧。

unable to connect to 5555: connection refused |

I had the same issue since the android 6 upgrading. I noticed that for some reason the device is playing “hard to get” when you try to contact it over WIFI. Try these following steps: Make sure that Aggressive Wi-Fi to Cellular handover under Networking section in the device’s developer options is turned off. ping continuously from your pc to the device to make sure it’s not in network idle mode ping -t 192.

Flutter |

琥珀之月,空谷之兰,皆是孤芳,既是孤芳,但求自赏便罢!

Android 6.0需要申请的权限分类 |

6.0之前开发者申请各种权限,只需要在清单列表(AndroidManifest.xml)中进行声明就可以了。对开发者来说是相当便利,但对用户来说是体验不好,6.0的权限换成了用户可以随时更改的操作,类似IOS的权限申请。 常规的权限 和以前一样,在清单中申请,这里不作累述 ####需要申请的权限 google是以权限组进行分类的,一旦组内的某个权限被赋予了,那么这个组的其他权限也将自动被赋予 !!! 权限组 权限 android.permission-group.CALENDAR(日历数据) android.permission.READ_CALENDARandroid.permission.WRITE_CALENDAR android.permission-group.CAMERA(相机) android.permission.CAMERA android.permission-group.CONTACTS(联系人) android.permission.READ_CONTACTSandroid.permission.WRITE_CONTACTSandroid.permission.GET_ACCOUNTS android.permission-group.LOCATION(位置) android.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATION android.permission-group.MICROPHONE(麦克风) android.permission.RECORD_AUDIO android.permission-group.PHONE(电话) android.permission.READ_PHONE_STATEandroid.permission.CALL_PHONEandroid.permission.READ_CALL_LOGandroid.permission.WRITE_CALL_LOGcom.android.voicemail.permission.ADD_VOICEMAILandroid.permission.USE_SIPandroid.permission.PROCESS_OUTGOING_CALLS android.permission-group.SENSORS(传感器) android.permission.BODY_SENSORS android.

Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存? |

!!! 原文出处:  0、写在前面本文涉及到屏幕密度的讨论,这里先要搞清楚 DisplayMetrics 的两个变量,摘录官方文档的解释: density:The logical density of the display. This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5”x2” screen), providing the baseline of the system’s display. Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc. This value does not exactly follow the real screen size (as given by xdpi and ydpi, but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi.

⾃定义布局流程 |

⾃定义布局流程 布局过程 确定每个 View 的位置和尺⼨ 作⽤:为绘制和触摸范围做⽀持 绘制:知道往哪⾥绘制 触摸反馈:知道⽤户点的是哪⾥– 流程 从整体看 测量流程:从根 View 递归调⽤每⼀级⼦ View 的 measure() ⽅法,对它们进⾏测量 布局流程:从根 View 递归调⽤每⼀级⼦ View 的 layout() ⽅法,把测量过程得出的⼦ View 的位置和尺⼨传给⼦ View,⼦ View 保存 为什么要分两个流程? 从个体看,对于每个 View: 运⾏前,开发者在 xml ⽂件⾥写⼊对 View 的布局要求 layout_xxx ⽗ View 在⾃⼰的 onMeasure() 中,根据开发者在 xml 中写的对⼦ View 的要求,和⾃⼰的可⽤空间,得出对⼦ View 的具体尺⼨要求

FastJson简单使用 |

在工作中,经常客服端需要和服务端进行通信,目前很多项目都采用JSON的方式进行数据传输,简单的参数可以通过手动拼接JSON字符串,但如果请求的参数过多,采用手动拼接JSON字符串,出错率就非常大了。并且工作效率也特别低。 我在网上看了一些开源的JSON框架,比如Google提供的Gson,Jackson,FastJson等框架。 经过测试,个人觉得FastJson执行效率比较高,而且简单易用。 FastJson不依赖于第三方包, 直接可以运行在Java JDK1.5之上,FastJson完全支持 一个JSON库涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化。使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化。 简单的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setAge(int age){ this.age=age; } public int getAge(){ return age; } } public class TestOne{ public static void main(String[] args){ UserInfo info=new UserInfo(); info.

Android实现图片缩放与旋转 |

本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下: package com.android.matrix;import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ImageView.ScaleType; /** * Android实现图片缩放与旋转。 * @author Administrator * */ public class MatixActivity extends Activity { public void onCreate(Bundle icicle) { super.onCreate(icicle); setTitle("Android实现图片缩放与旋转。"); LinearLayout linLayout = new LinearLayout(this); //加载需要操作的图片,这里是一张图片 Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.r); //获取这个图片的宽和高 int width = bitmapOrg.

Connection with adb was interrupted.解决办法 |

[2012-10-16 10:49:35 – My First App] [2012-10-16 10:49:35 – My First App] Android Launch! [2012-10-16 10:49:35 – My First App] Connection with adb was interrupted. [2012-10-16 10:49:35 – My First App] 0 attempts have been made to reconnect. [2012-10-16 10:49:35 – My First App] You may want to manually restart adb from the Devices view.

Sophie’s World |

生命本没有意义,你要能给他什么意义,他就有什么意义。与其终日冥思苦想人生有何意义,不如试用此生做点有意义的事。 ——苏菲某天放学回家,收到了神秘的一封信。 ——你是谁? ——世界从何而来?  从此,她的生活彻底改变,在一位神奇的哲学老师艾伯特的指引下,她开始思索,从苏格拉底到柏拉图,从黑格尔到马克思,从文艺复兴到浪漫主义,各位大师所思考 的根本问题。与此同时,苏菲不断收到一个自称是少校的人的神秘信件,,并托她转达给一个叫席德的人。可苏菲并不认识这个叫席德的人。世界像谜团一样展现在 苏菲眼前,她运用少女天生的悟性与后天的知识,企图解开这些谜团,然而,事实真相远比她所想的更离奇,更怪异……在艾伯特的指引下,他们发现自己仅仅是少 校写的一本为自己女儿席德生日而送的书中的人物,他们所做的一切,包括思考的一切都被少校用笔写了下来,他们不过是少校大脑中的一丝电磁波罢了。换句话 说,苏菲和艾伯特,以及他们那个世界中的一切,全部都是不存在的,是虚无的!可就是这样一个虚构的人物,竟然也有自己的思想,他们企图脱离书本,不再受少 校的摆控。终于,在席德将苏菲的故事看到最后一页时,他们成功的逃离了书本,来到了一个叫永恒之乡的世界。这是一个与现实世界相对位的地方,这个世界的人 都拥有永恒的生命。他们可以看到听到现实世界的一切,但现实世界的人却永远也无法感受到他们的存在。永恒之乡的人都是像苏菲和艾伯特一样,是从某个虚构的 股市中跑出来的人物。此时少校和席德正在草地上仰望星空,谈人生,谈宇宙,而苏菲正在某个角落默默地注视着他们……  这个故事看似匪夷所 思,实则发人深省,看完后我们不禁要问——人生的意义是什么?在苏菲的世界中,他们的一切都是虚无的,不存在的。他们所有的思想动作以及所发生的一切事 情,都是少校所安排好的,少校在那个世界中无所不能,仿佛就是他们的上帝一样。因为少校就是创造他们世界的人。可事实上,少校和席德不也是虚构的人物吗? 他们所做的一切不都是作者乔斯坦·贾德所安排好的吗?我们所看到的席德,就像席德看到的苏菲一样,而贾德,就是席德他们那个世界的上帝吧?再放眼我们现在 所处的这个世界,这应该是相对于我们的“现实世界”吧?那是不是存在这样一个“上帝”,我们的所作所思,都是这位上帝所安排好了的呢?那这样我们的存在岂 不是毫无意义的吗?那这位上帝之上,是否还有一位上帝呢……  其实,每个人都是一个思维的个体,而相对于我们而言,自己的命运是要靠自己把 握的。尽管我们的未来可能就像戏剧一样早已被上帝写进了剧本,可是只要我们认为自己是存在的,不就足够了吗?正如苏菲和艾伯特将要离开他们那个世界时一 样,艾伯特对大家说;“在座的没有一个人会想念我们,因为你们根本就不存在,你们无法用任何器官来想念我们。”当即立刻有人反驳道:“你凭什么说我们不存 在?我努力赚钱,养活我的家人,过上幸福的生活,我很快乐!可你到头来却说我不存在?”的确,按理说他只是虚构的,的确是不存在,可如果映射到我们这个世 界,岂不是同样没有人存在?引入一个概念前必先引入其相反的一个概念,既然一切都“不存在”,那又何来“存在”的概念呢?所以,或许我们不存在,可那只是 相对上帝而言的,我们只须抓住这如星尘般稍纵即逝的瞬间,以自己的方式,度过人生,那就足够了。或许每当天空中有星尘散落时,那一定是某个小说中的人物从 他那所谓不存在的世界中脱离出来了,他会在某个角落,默默地注视着我们…… 人生如梦。 梦即现实。

vSphere, ESXi 和 vCenter 的区别 |

update:2020年03月26日 经理了一番折腾之后,最终公司、家里都安装上PVE了,没错就是PVE。虽然最开始特别想使用ESXI。 首先说一下之前的误解,KVM的界面是非常难看的,没想到这个基于KVM的PVE其实还好。UI还不错。 再有,ESXI不知道何故在联想的电脑上装上去打不开,UEFI BOIS 都试过了,网上的几种方法试了还是不行,在家里机器上试了一会下轻松装上~~。 最后不得不说,PVE真香~内存占用方面,最先版PVE 6.1基于Debian 9 ,内存方面控制的很好!! 最近准备把家里之前的Windows + Vmware 的服务器,物理机虚拟化。考虑了ESXI、PVE、XEN。 首先感觉XEN比较老,有点落伍,PVE 核心也是 KVM。所以最后无非就是在 ESXI 和 PVE 里选 这两个都没问题的。 最后选了ESXI。不选KVM主要是界面丑。真的丑。 Vmware 用的最多的应该是虚拟机了。刚开始 Vmware vSphere、EXSi、vCenter 搞得有点蒙。所以查资料了解了一下 vSphere 和他的组件。 首先弄清楚 vSphere,EXSi 和 vCenter 的区别是很重要的。我先在VMware Workstation 中安装了 vSphere。 vSphere是一个属于数据中心产品的软件套件。vSphere就像微软 Office 套装一样拥有许多产品,比如 Office,Excel等。vSphere同样也包括很多软件组件,比如 vCenter、ESXi、vSphere client 等等。所以这些软件的合集,就叫做vSphere。vSphere不是一种你可以安装和使用的软件,它仅仅是一个软件套件的合集。 ESXi、vSphere client 和 vCenter 都是 vSphere 的部件。ESXi server是最重要的部分,ESXi是一个一类虚拟化管理器(type 1 hypervisor)。所有的虚拟机或者客户机操作系统都安装在 ESXi 服务器上,同时,你可能还需要vSphere中的其他部件– vSphere client 或者 vCenter。管理员可以通过 vSphere client 连接 ESXi 服务器来访问或者管理虚拟机。vSphere client 是用来从客户端机器连接 ESXi 执行任务的。所以,现在的问题是,vCenter是什么?我们为什么需要他?我们完全可以通过 vSphere client来克隆虚拟机,而不需要 vCenter server。

Android声明式UI框架 Litho 初探 ——两种数据类型 |

Litho中包含的的两种数据类型 Litho的两种属性分别是: 不可变属性称为Props 可变属性称为State 不可变属性Props 定义和使用props Props属性:Component中使用@Prop注解的参数集合,具有单向性和不可变性,可以在左右的方法中访问它的指。在同一个Component中我们可以定义和访问相同的prop 下面这个例子,定义了两个Prop,一个string类型text,一个int类型index,text的注解中optional = true表示它是一个可选参数。 当Component的生命周期方法被调用的时候,@Prop参数会保存component创建时从它们的父级传递过来的值(或者它们的默认值) 设置props prop参数其实在前几篇文章中都有使用过,用起来也没有什么特别的地方,这里不在赘述,制作一个简单的说明。 Component中的prop参数会在编译时候自动加入到Builder中,以上面的代码举例: PropComponent.create(c).index(10)./*text("测试文本").*/build() Prop的默认值 对于可选的Prop如果不设置值,就是java的默认值。或者你也可以使用@PropDefault注解然后添加默认值。 如果你使用Kotlin,那还需要加上@JvmFiel把该字段编辑为public才行。 @MountSpec object PropComponentSpec { @JvmField @PropDefault val prop1 = "default" @JvmField @PropDefault val prop2 = -1 资源类型 在Android开发中,我们经常会限定参数的类型。比如: fun doSomething(@ColorInt color: Int, @StringRes str: Int, @DimenRes width: Int){} 在Compontent的Prop中也有类似的操作,具体看代码: fun onMount( c: ComponentContext, textView: TextView, @Prop(optional = true,resType = ResType.STRING) text: String?

Don’t Store Data in the Application Object |

There is always some information that is needed in many places in your app. It can be a session token, the result of an expensive computation, etc. It is often tempting to avoid the overhead of passing objects between activities or keeping those in persistent storage. A pattern that is sometimes suggested is to dump your data in the Application object with the idea that it will be available across all activities.

解决 golang IDEA中不能debug问题 |

IDEA是2018-01版本,Golang是go-1.12.1,IDEA在Plugins中安裝的Go插件,我在运行go程序時是正常的,但是提示could not launch process: decoding dwarf section info at offset 0x0: too short 解決方案: 1:在终端运行 go get -u github.com/derekparker/delve/cmd/dlv。 2:运行上面的命令之后运行环境中就有dlv了。替换IDEA go 插件中的dlv macOS中的插件地址是:/Users/用户名 /Library/Application Support/IntelliJIdea2018.1/intellij-go/lib/dlv/mac 替换之后就正常了。

Android调用手机中的应用市场 |

public static void goToMarket(Context context, String packageName) { Uri uri = Uri.parse("market://details?id=" + packageName); Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); try { context.startActivity(goToMarket); } catch (ActivityNotFoundException e) { e.printStackTrace(); } }

Flutter 基础 | Dart 语法 mixin |

假设有这样一种场景:小明和小方都是程序员。其中小方会跳舞,当然它们都会编程。 用面向对象的方法可以建模如下: 因为小明和小方都会写编程,为了复用这个行为,提取了超类 Programmer,它包含所有程序员共用的行为 code()。这样一来,Ming 和 Fang 就能复用编程行为,而不是各自重新实现一遍相同的逻辑。(继承复用了行为) 小慧是一个舞者,再用面向对象的方法建模如下: 这样的继承关系违反了 DRY 原则,即 Don’t repeat yourself. 因为小慧并未复用小方的跳舞行为,所以同样的跳舞逻辑出现了两次。 那把跳舞行为上提到它们公共的基类 Human 中,是不是就解决问题了?的确,但这不是强迫所有程序员都必须会跳舞吗。。。 那让小方同时继承 Programmer 和 Dancer 能解决问题吗?能!但多重继承容易出事情,比如 “Diamond Problem”: 假设 Human 类中有 eat() 方法,且 Programmer 和 Dancer 都重写了它,此时 Fang 会发生编译报错。因为它不知道自己的 eat() 方法该采用哪一个父类的实现。上面的类图就好像一个钻石的形状,所以称为Diamond problem。 Dart 禁用了多重继承,而是引入了mixin来解决这个问题。 mixin 是一个特殊的类,它的属性和行为可以被其他类复用,而且不需要通过继承。 语法 如果希望一组属性和行为能够复用于多个类,碰巧这些类不在一条继承链路上,此时就应该使用mixin: mixin DanceMixin { void dance() {} } 这是声明 mixin 的方式,几乎和声明 class 一模一样,就是把 class 换成 mixin 而已。 还可以通过 on 限定 mixin 适用范围:

Android全新支持库androidx |

如果使用最新版Android Studio 创建基于API28的项目,就会发现,原来的android.support.*全部变成了androidx.*??这是什么鬼?我们来看看Google的介绍 我们正在推出一种新的软件包结构,以便更清楚哪些软件包与Android操作系统捆绑在一起,并与您的应用程序的APK一起打包。展望未来,android.*软件包层次结构将保留给随操作系统提供的Android软件包; 其他包将在新的androidx.*包层次结构中发布。 正在重构现有包以使用新层次结构。历史文物 - 那些版本为27及更早版本,并打包为android.support.*- 将继续在Google Maven上提供; 但是,所有新开发都将发生在androidx.*从1.0.0开始版本化的新打包工件中。 有关所有旧类和构建工件的完整映射到新的,请参阅AndroidX重构页面。有关AndroidX重构的更多信息, 请参阅博客文章。 版本控制更改 新工件将遵循语义版本控制,并将独立更新,而不是一次更新。重组后,可以独立更新项目中的AndroidX库。这避免了将项目中的许多支持库模块从例如一次更新26.1.0到27.0.0所有支持库模块的问题。 新项目 如果使用androidx打包的依赖项创建新项目(而不是使用Android Studio工具重构现有项目),则新项目需要针对API级别28,并且您需要将以下行添加到您的gradle.properties文件中: android.useAndroidX=true android.enableJetifier=true 简而言之,support包会继续维护,但是所有新特性都会放到androidx中,如果想使用androidx,需要API为28(IDE应该也需要最新版本),同时gradle.properties中添加 android.useAndroidX=true android.enableJetifier=true,反之不想使用设置为false即可,需要注意的是即使依赖中不添加 implementation androidx.*相关的支持库,如果gradle.properties中设置为true 仍然使用androidx相关支持库,android.support相关引用会提示not found

博客寄语:

    从14年开始写博客,到现在再有2年就10年了。

实时播报:

博客号-学习成长

相信每一分耕耘都有每一分收获,致力帮助博客主所创作的博客能更快的被收录! 如果有其它需求,可联系下方邮箱。