详情

全站展示位

推荐

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

30字的完美简历[转载] |

这个世界上,总有很多人很自以为是地以为若是他们做不到的事情,别人做到了,必定不是什么光彩的正道,必定不是靠自己的实力。包括我。 曾经看到托福GMAT拿满分的人,就会想着:“怎么可能!这个人肯定是小时候在国外生活过吧!” 看到保养地特别好的中年女人,就会撇嘴:“肯定是花重金打玻尿酸啊这针那针啊!” 看到年纪貌美的女孩开着豪车经过,就会想着:“肯定是二奶呀!” 看到年纪轻轻上了富豪榜的青年才俊,就会揣测:“肯定是家族企业啊!” 看到年少成名靠参加选秀红遍大江南北的歌手明星,就会怀疑人家:“估计是被潜规则了。” …… 这样的例子几乎每天都发生着,我也曾一度全然不觉自己在这样的渊里越堕越深。 直到大四有一次去参加一个牛逼公司的面试,面试通知邮件里最后有一条是:请携带不超过30字的Personal Statement(简称PS,个人陈述)。 我一看,疯了吧?30字?!我挨个把自己工作实习过的公司名字和读过书的学校名字列一遍都不止30个字了啊?!我想了想,绝对不可能!应该是他们漏写了个0吧?于是便也不去多想了。 等到面试那天,我带了份自认为已经是非常简洁的PS过去,一路上都觉得真是憋屈啊,很多东西没写进去呢实在没有发挥我洋洋洒洒的特点,都没充分展示我的闪光点呢!但是没办法还是尽量符合这个公司简洁精准的办事风格来吧。 到了公司,我递交上我的PS后,三个面试官不约而同皱起了眉头,一个头发花白的外国男人问我:“你这个字数超过30字了,起码得有400字吧,为什么不按我们的要求做?” 我愣了一下,什么?真的是30字?不是逗我玩? 我有点怀疑地说:“30字?30字写一篇PS根本是不可能做到的呀!这字数也太少了吧!” 一个女面试官很凌厉的口气说:“不可能?不可能的事情我们怎么会要求你做?”她说着把一叠PS亮在我面前,“他们都可能,为什么只有你不可能?” 我刷地一下脸就红了,支吾着说不出话。这是我唯一一次期待着面试官赶紧说:“好了可以了,请你出去吧。” 但是试场里出现里几秒钟的沉默,这几秒钟对我来说,竟然跟失眠的夜晚一样难熬。 那花白头发面试官又开口了:“你觉得这个世界上不可能的事情,是因为你没有试着去做。” 我犹豫了一下说:“谢谢您。我知道我的问题出在哪里了。不知道是否方便让我看一眼其他人的PS,我想知道自己的差距有多大。” 他们几个互相望了一下,点头示意后将一沓PS递给我。 我在拿过来的一瞬间已经被最上面的一份震惊到了。 那整张纸上画了一个应该是以面试者自己为原型的卡通人物,最上面是他的名字,然后是一个巨大的脑袋,脑袋顶部是开放的,用一大片电脑芯片画成了原始森林的样子,旁边写着“computerized mind”,左手拿着画板,写着“Photoshop Skiller ”,右手举着一叠报告,写着“Reportexpert”, 中间的领带处别着个话筒,上面写着“Good Presenter”,心脏的位置画了一颗奇形怪状的心,写着“Creative heart”,脚踩锃亮的皮鞋,穿着毫无褶皱的西裤,旁边写着“Detail-cared”…… 我一边看,一边手心出汗。 这样一份不超过20个单词的PS,我在看完四年后的今天还能够一字不差地回想起来,并且画面栩栩如生,你可以想象它当时带给我的震惊,以及给面试官们带来的印象有多深刻。 接下来的一沓PS里,有画一个大转盘,写出自己的几个特质的;有在一条竖直的时间轴上写了自己做成的几件大事的;还有剪切了几幅自己参加过的作品粘上去的…… 总之没有一个是多于30个字的! 但是每一份PS我看完都如同看到了一个活生生的人站在我面前,我知道他的个性如何,特长是什么,有过什么值得称赞的荣誉。 而我那张全是字的白纸,恐怕人家连看都不想看,即使看了,也不会留下任何印象。 我很不好意思地将一摞纸还给面试官,很诚恳地鞠了一躬,“很抱歉浪费了你们的时间,在来这里之前,我总觉得有些事我做不到,就是不可能做的到的。谢谢你们让我知道我的想法有多愚蠢。谢谢。” 我关上身后那扇门的时候,长长地吁了一口气。 回去的一路,都走的很慢。 我不是在难过失掉了这么一个工作机会,而是在难过地回想在过去的十几年光阴里我究竟失掉了多少次机会?让本该存在的可能,成了我嘴里的不可能。 我明白了一个让人很恼火去承认的事实就是: 那些我觉得不可能的事情,其实根本不是不可能,只是我认为不可能而已。 对一个根本不会去思考去想办法的庸人来说,很多事情都会成为不可能! 后来我试着去做一份字数在30字以内的简历,用了四个晚上后,真的也做出来了。 后来我试着再去做另一份简报似的简历,在用了三个晚上后,同样也真的做出来了。 而在之前,我认为简历就该是白纸黑字,从教育背景到工作经验到兴趣爱好,但其实它充满了那么多的可能性! 可是真的该如此理所当然吗? 我们自己不可能做到,真的是因为我们无能,还是我们根本没有尝试去做? 托福考满分的同学,说不定我们没看到的是,人家起早摸黑悬梁刺股每天练口语练到喉咙发炎; 开着豪车的美女,说不定我们没看到的是,姑娘辛苦打拼几年每天工作累得像狗辛苦攒钱; 保养的很好的中年女人,说不定我们没看到的是,她们每天下班后还去健身房睡觉一定不趴着睡,每晚一定做面膜,十几年如一日; 优秀的青年企业家们,说不定我们没看到的是,他们无数个不眠不休的夜晚,付出比我们这些在睡梦中的人多的多的努力; 那些一朝红遍全国的明星,说不定我们没看到的是,人家之前十几年的默默无闻用心苦练基本功…… 我们什么都没看到,就说别人不可能;我们什么都没去尝试,就说这事不可能。 其实,我们觉得不可能做到的事情,别人真的可以做到。对一个根本不敢去做的人来说,一切都是不可能。 想是问题,做是答案,有时候答案就藏在问题后面!

Android Jetpack Compose 超快速上手指南 |

Compose 介绍 Jetpack Compose发布也快有一年的时间了,虽然目前仍是DEV阶段,但是距离可用已经不远了。Compose库是用响应式编程的方式对View进行构建,可以用更少更直观的代码,更强大的功能,能提高开发速度(可以参考几乎一模一样的Flutter,开发速度确实很快)。 Jetpack Compose对于没有接触过声明式UI的小伙伴可能会学习曲线有点陡峭,对于已经能熟练开发Flutter应用的小伙白来说几乎没有难度。(Compose就是参考flutter的模式开发的,代码中还可以看到Flutter的相关注释) 这篇文章不回去解释过多的原理与技巧,只要是让你能够快速上手开发项目。 Compose 如何使用 因为目前(2020年09月27日)Compose仍处于开发阶段,所以需要使用最新 Canary 版的 Android Studio 预览版。 可以选择直接创建Empty Compose Activity来创建一个全新的Compose应用,或者可以选手动修改gradle的方式来创建Compose应用 修改Gradle 在模块的build.gradle文件中新增: android { ... kotlinOptions { jvmTarget = '1.8' useIR = true } buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion compose_version kotlinCompilerVersion '1.4.0' } } dependencies中新增: implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.ui:ui-tooling:$compose_version" 目前最新的Compose版本是1.0.0-alpha03 使用Compose最低的buildTools版本要求为29 使用 @Compose 所有关于构建View的方法都必须添加@Compose的注解才可以。并且@Compose跟协程的Suspend的使用方法比较类似,被@Compose的注解的方法只能在同样被@Comopse注解的方法中才能被调用

解决 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 替换之后就正常了。

心灵鸡汤

  北宋时期有位州官,为人极其廉洁。一天晚上,有人从京城送来一封上司的来信。他猜想这必须是朝廷有什么重要指示,立刻命令公差点上蜡烛阅读。

  谁知读了一半,他又命令把官家的蜡烛吹灭,把自我买来的蜡烛点上,继续往下看。公差很纳闷,难道官家买的蜡烛不及他自我出钱买的亮吗之后才明白,那封信有小半是关于他留在京城家属的情景,他认为这是私事,不能点官家的蜡烛。在有些人看来,为了半封家书,竟然换烛再读,实在有点“小题大做”。

  但正是这样的小事,却更能从细节上表现出一个人的品质,更足以让当今存在公“话”私打、公车私用、公请私吃、公费私游等等凡此种种揩公家油的一些领导干部汗颜。

列表展示

主站展示位

使用 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里notifyItemRemoved的坑 |

RecyclerView很多时候是展示静态的数据,并不会有删除的操作,讲到RecyclerView时,会提到它提供了一个很好的展现删除操作动画的函数,代码片段一般是这样的 @Override public void onBindViewHolder(final CommonViewHolder holder, final int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { contentList.remove(position); notifyItemRemoved(position); } }); } 这样写的话,很快会产生数据删除错乱和超出索引异常导致崩溃。 原因是函数里面的传入的参数position,它是在进行onBind操作时确定的,在删除单项后,已经出现在画面里的项不会再有调用onBind机会,这样它保留的position一直是未进行删除操作前的postion值。 对于尚未进入画面的单项来说,它会使用新的position值,这个值是正确的,如果在单项里加上下面的代码 holder.textView.setText(contentList.get(position) + "#" + String.valueOf(position)); 在删除第一屏的一项后,向上滚动,会发现新滚上来的一行和它上面的一行的textview显示是一样的。 解决办法也很简单 先remove,再notifyItemRemoved, 最后再notifyItemRangeChanged remove:把数据从list中remove掉, notifyItemRemoved:显示动画效果 notifyItemRangeChanged:对于被删掉的位置及其后range大小范围内的view进行重新onBindViewHolder

Vue watch中调用this时出现undefined问题 |

记录一下在 Vue 学习使用时候的遇到的问题 在watch侦听器中,想要调用methods中的方法 applicationId: (val)=> { if (val) { this.getAppConfig(val) } } 结果提示: Error in callback for watcher "applicationId": "TypeError: Cannot read property 'getAppConfig' of undefined" 查了官方的资料才知道。改成这样就可以了:

Android ListView 与 RecyclerView 对比浅析—缓存机制 |

一,背景 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活。 最近,自己负责的业务,也遇到这样的一个问题,关于是否要将ListView替换为RecyclerView? 秉承着实事求是的作风,弄清楚RecyclerView是否有足够的吸引力替换掉ListView,我从性能这一角度出发,研究RecyclerView和ListView二者的缓存机制,并得到了一些较有益的”结论”,待我慢慢道来。 同时也希望能通过本文,让大家快速了解RecyclerView与ListView在缓存机制上的一些区别,在使用上也更加得心应手吧。 PS:相关知识: ListView与RecyclerView缓存机制原理大致相似,如下图所示: 过程中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取,只是ListView与RecyclerView的实现细节有差异.(这只是缓存使用的其中一个场景,还有如刷新等) PPS:本文不贴出详细代码,结合源码食用更佳! 二. 正文 2.1 缓存机制对比 层级不同: RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。 具体来说: ListView(两级缓存): RecyclerView(四级缓存): ListView和RecyclerView缓存机制基本一致: 1). mActiveViews和mAttachedScrap功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView; 2). mScrapView和mCachedViews + mReyclerViewPool功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用. 3). RecyclerView的优势在于a.mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;b.mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势.客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。 缓存不同: 1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为: View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态); 2). ListView缓存View。 缓存不同,二者在缓存的使用上也略有差别,具体来说: ListView获取缓存的流程: RecyclerView获取缓存的流程: 1). RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView: 而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView),相关代码如下: //AbsListView源码:line2345 //通过匹配pos从mScrapView中获取缓存 final View scrapView = mRecycler.getScrapView(position); //无论是否成功都直接调用getView,导致必定会调用createView final View child = mAdapter.getView(position, scrapView, this); if (scrapView != null) { if (child != scrapView) { mRecycler.

android根据银行卡卡号判断银行 |

根据银行卡号判断是哪个银行的卡,依据是银行卡号的前6位数,称之为bin号。 我们把bin号转化为长整形,再把各个银行卡的bin号做成有序表。通过二分查找的方法,找到bin号在有序表的位置,然后读出银行卡的信息。

用组合代替继承能为 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 的所有行为放到一个独立的类里面。但这样做会降低可维护性,甚至带来性能影响。

不使用第三方软件实现Obsidian多平台实时同步 |

这篇文章涉及服务器配置、docker 技术,当然都是很初级的使用 相信很多人跟我一样,不喜欢使用第三方软件来同步 Obsidian 。每次要打开两个软件,很麻烦。这种情况在手机上最为明显。 这也是我为什么从 9 月多就接触了 Obsidian 但是一没有最为主力的原因。虽然印象笔记已经非常的不好用,但是他的同步真的非常的方便。 直到最近在翻看 Obsidian 的插件的时候接触到了这个插件 Self-hosted LiveSync(虽然也有一款支持 WebDav 的插件,但是试了一下连不上服务器,作者说目前 WebDav 还在测试中)这个插件真的非常的棒 👍🏻。实现了无感同步,甚至可以多平台实时同步。 引用一张作者的图: 搭建服务器端 Self-hosted LiveSync 使用的是CouchDB数据库,这是一个开源的具有版本控制的文档数据库。 你可使用 IBM 提供的 CouchDB 数据库,这里有作者写的教程 我们这里还是直接自己搭建,我是在家里的群辉 NAS 上搭建的,如果你没有 NAS 也可以在腾讯云、阿里云等云服务上搭建。优先推荐在 NAS 上搭建。 安装 docker 群辉直接再套件商店安装。云服务器用户使用下面的命令 docker version > /dev/null || curl -fsSL get.docker.com | bash service docker restart 安装数据库 首先创建配置文件 local.ini [couchdb] single_node=true [c

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.

Android5.0通知变化浅析 |

目前在Android中通知的使用还是很常见的,为了做版本兼容,常用兼容包NotificationCompat.Builder和 Notification.Builder。 NotificationCompat.Builder位于v4扩展包内(version 4 Support Library) Notification.Builder在Android 3.0 开始引入(API level 11). 最近在Android5.0设备上发现一个问题:通知图标突然变成了白色的方块而不是代码中设置的icon。 问题原因 细读开发者文档其实也可以发现一些线索,虽然笔者是直接查的源码发现的问题原因。部分介绍了几点关于通知的建议,其中的有两点是建议开发者不要做的行为。 Don’t Place any additional alpha (dimming or fading) into your small icons and action icons; they can have anti-aliased edges, but because Android uses these icons as masks (that is, only the alpha channel is used), the image should generally be drawn at full opacity. Don’t Use color to distinguish your app from others.

Flutter |

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

Typecho to Hugo |

这两天正式把博客从 typecho 转到 hugo 了。更准确的说应该是从动态博客转到了静态博客。 以前我是很抵制静态博客的。主要是感觉: 更新麻烦(现在仍然是这种感觉) 放在 github pages 上访问速度也不快,为了加速还需要套个 CDN。(同样是花钱,打折期间买个国内云服务器,速度不慢,还能干其他的) 配置真的很麻烦 这次换到 hugo 的起因是一个域名要备案,博客所在的域名要关闭评论系统,备案完后,打开评论发现,只要有评论的文章就卡死,然后 502。懒得折腾,直接关闭评论功能,发现关了后台也会卡死。索性转移到了 Hugo Hugo 如何安装配置网上很多这里不再赘述,主要说一下我是如何转换的。 部署在哪里 本来打算部署在腾讯对象存储 COS 上的,不过最后还是放弃了。 域名备案,内容审查。 不方便自动化处理,虽然通过github action + 云函数 + hook 可以做到更新仓库后自动构建,下载到 COS 但还是略显麻烦。需要配置好几个地方。 最终选择了部署在 在文章前面可以加很多参数的比如 --- title: "Typecho to Hugo" slug: "typecho-to-hugo" date: 2022-03-11T10:49:59+08:00 categories: [岁月如歌] tags: [Typecho,Hugo] showToc: true TocOpen: true draft: false # description: "Desc Text.

Android 声明式 UI 框架 Litho 初探 —— Layout |

Litho底层使用的是Yoga,Yoga是Facebook的另一个开源项目,它是一个跨iOS、Android、Windows平台在内的布局引擎,兼容Flexbox布局方式。 所以只要熟悉Flexbox布局,那么在使用Litho进行UI布局时基本毫无压力。 如果熟悉Flutter开发,那在使用Litho时,会有一些似曾相识的感觉,Litho中的 Row 与 Column 相关属性与Flutter中的 Row 与 Column 几乎无二。 本来想写一点示例代码,但是感觉没什么可写的。下面这个链接是Yoga 官网的playground。 你可以通过它可视化的调整UI,构建你需要的layout。同时可以生成相应的Litho代码 在线可视化构建UI: 直接生成的Litho代码: 在 Flexbox 中可以通过 positionType(ABSOLUTE)属性来实现Android 中的 FrameLayout效果: @OnCreateLayout fun createLayout(c: ComponentContext): Component { return Column.create(c) .child( SolidColor.create(c) .color(Color.MAGENTA) .widthDip(100f) .heightDip(100f) ) .child( Text.create(c) .text("FrameLayout") .marginDip(YogaEdge.TOP, 30f) .positionType(YogaPositionType.ABSOLUTE) ) .build(); } 运行效果:

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(); } }

RxJava操作符分类 |

ReactiveX的每种编程语言的实现都实现了一组操作符的集合。不同的实现之间有很多重叠的部分,也有一些操作符只存在特定的实现中。每种实现都倾向于用那种编程语言中他们熟悉的上下文中相似的方法给这些操作符命名。 本文首先会给出ReactiveX的核心操作符列表和对应的文档链接,后面还有一个决策树用于帮助你根据具体的场景选择合适的操作符。最后有一个语言特定实现的按字母排序的操作符列表。 如果你想实现你自己的操作符,可以参考这里:实现自定义操作符 创建操作 用于创建Observable的操作符 Create — 通过调用观察者的方法从头创建一个Observable Defer — 在观察者订阅之前不创建这个Observable,为每一个观察者创建一个新的Observable Empty/Never/Throw — 创建行为受限的特殊Observable From — 将其它的对象或数据结构转换为Observable Interval — 创建一个定时发射整数序列的Observable Just — 将对象或者对象集合转换为一个会发射这些对象的Observable Range — 创建发射指定范围的整数序列的Observable Repeat — 创建重复发射特定的数据或数据序列的Observable Start — 创建发射一个函数的返回值的Observable Timer — 创建在一个指定的延迟之后发射单个数据的Observable 变换操作 这些操作符可用于对Observable发射的数据进行变换,详细解释可以看每个操作符的文档 uffer — 缓存,可以简单的理解为缓存,它定期从Observable收集数据到一个集合,然后把这些数据集合打包发射,而不是一次发射一个 latMap — 扁平映射,将Observable发射的数据变换为Observables集合,然后将这些Observable发射的数据平坦化的放进一个单独的Observable,可以认为是一个将嵌套的数据结构展开的过程。 roupBy — 分组,将原来的Observable分拆为Observable集合,将原始Observable发射的数据按Key分组,每一个Observable发射一组不同的数据 ap — 映射,通过对序列的每一项都应用一个函数变换Observable发射的数据,实质是对序列中的每一项执行一个函数,函数的参数就是这个数据项 can — 扫描,对Observable发射的每一项数据应用一个函数,然后按顺序依次发射这些值 indow — 窗口,定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一项。类似于Buffer,但Buffer发射的是数据,Window发射的是Observable,每一个Observable发射原始Observable的数据的一个子集 过滤操作 这些操作符用于从Observable发射的数据中进行选择 Debounce — 只有在空闲了一段时间后才发射数据,通俗的说,就是如果一段时间没有操作,就执行一次操作 Distinct — 去重,过滤掉重复数据项 ElementAt — 取值,取特定位置的数据项 Filter — 过滤,过滤掉没有通过谓词测试的数据项,只发射通过测试的 First — 首项,只发射满足条件的第一条数据 IgnoreElements — 忽略所有的数据,只保留终止通知(onError或onCompleted) Last — 末项,只发射最后一条数据 Sample — 取样,定期发射最新的数据,等于是数据抽样,有的实现里叫ThrottleFirst Skip — 跳过前面的若干项数据 SkipLast — 跳过后面的若干项数据 Take — 只保留前面的若干项数据 TakeLast — 只保留后面的若干项数据 组合操作 组合操作符用于将多个Observable组合成一个单一的Observable

博客寄语:

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

实时播报:

博客号-学习成长

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