众乐乐-weekly 2026-W01

Read 📖 继续读《20世纪简史》,预计下周就可以读完 Tools 🧰 升级完Idea,好多按键都不好使了,尤其是AI相关 尝试了一下Obsidian,还是更喜欢Logseq,两者各有千秋:Logseq 是“思考的空间”,Obsidian 是“输出的空间 给每日回顾模板增加每天和每周的review任务 pdd上买的电脑立式支架到了,试了一下,感觉一般,直接退了 开始使用Dropzone AI的辅助编程还是用云端的模型更准确 NotebookLLM最终推荐的人挺多,准备深入研究一下 Image 🖼️ Speech 💬 好的评论不是给出答案,而是打开问题 Wiki一下

2026-01-12 ·  (🌟Updated: 2026-01-12) · 1 min · 20 words · tomyli

大鹏慢读-tomyli的读书2026

DONE 20世纪简史 (豆瓣) DONE 丝绸之路 (豆瓣) TODO 极端的年代:1914—1991 (豆瓣) TODO 别闹了,费曼先生! TODO 超越感觉 TODO 练习的心态

2026-01-06 ·  (🌟Updated: 2026-02-28) · 1 min · 15 words · tomyli

收集的命令行工具

Atuin - Shell History & Executable Runbooks 一个命令行工具, 可以在你的所有机器上同步/搜索/备份shell命令历史 Watchman - A file watching service | Watchman 监控文件变化并及时通知 bensadeh/tailspin: 🌀 A log file highlighter 日志文件高亮 yihong0618/epubhv: Make your epub books vertical or horizontal. 任意转换 epub 书的横竖排。(可批量) os-health/ssar: Site Reliability Engineering System Activity Reporter 磁盘 io 监控,作者开发的其它工具也很好用 Curl by example: Interactive guide curl命令指南,还有互动的示例

2025-12-31 ·  (🌟Updated: 2025-12-31) · 1 min · 52 words · tomyli

众乐乐-weekly 2025-W52

Read 📖 开始读 20世纪简史 Tools 🧰 新买的耳机到了,测试了一下不错,随后又买了中空耳塞和耳机转typec转接器,这样手机电脑就都可以用了 准备看 坠落的审判 ReaderWise 播客内容解析功能显示真的是一塌糊涂,全都连在了一起 帮朋友弄一个双旦的海报,试了几个工具效果都不好,用豆包和comet的效果也不好,最好还是同事帮弄了一下 网盘filen续费 在网上看到一个三角支架,可以手机电脑使用,有点心动 Amazing AI需要高版本的15.2才能安装,准备升级 Speech 💬 拥有资源并不意味着就能找到方向 Wiki一下 Mira Murati,她创立了一家名为Thinking Machines Lab的人工智能初创公司,之前在OpenAI和Tesla任职。

2025-12-26 ·  (🌟Updated: 2025-12-26) · 1 min · 24 words · tomyli

众乐乐-weekly 2025-W51

Read 📖 在读《简读中国史》,作为科普读物,这本书写的很多,给人一个中国历史发展的大地图。 受 https://ciceroxiao.github.io/hong525/2025/12/16/2025-W50.html 启发,在2025年末开启周报模式 Tools 🧰 最近在深度使用Logseq,有点感觉了,还是得尊重人是视觉动物的原则 使用Logseq整理以前收藏的内容,发现自己是严重的收集狂,于是又开始进行归类、删除 更新完Emacs和陈大神的配置后,搜索不能记录历史了 Speech 💬 故事不能替代现实,只能帮助我们面对现实 Wiki一下

2025-12-19 ·  (🌟Updated: 2025-12-19) · 1 min · 15 words · tomyli

重拾Android的快乐-Handler

说明 Handler 是Android提供的一个用于处理消息与可运行对象的组件,它有两个功能: 将消息与可运行对象在安排在未来某个时间点运行 在其它线程上操作队列 为什么提供Handler机制 Android在启动后会有一个主线程,它不允许子线程去改变主UI线程的内容,为了防止一些耗时操作导致主UI线程无响应而闪退,是Android提供的一种保护机制。在现实中确实有一些耗时长的需求使用异步线程,比如调用三方接口,加载完后来刷新UI,这种需要就可以用Android提供的 Handler 机制来实现,可以认为 Handler 是一个与Android主进程的通道 常用方法 sendMessage 发送消息 handleMessage 接收消息 obtainMessage 从全局消息pool获取一个Message对象 post 提交可运行对象,后缀带AtTime表示在指定时间提交,后续带Delayed表示提交延迟运行 removeMessages 移除消息队列中等待中的消息 hasMessages 判断消息队列中是否有某个指定消息 实战 实现一个指定时间切换图片的功能,最终效果如下 页面 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/RelativeLayout1" android:gravity="center"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imgAnimation" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout> 代码比较简单,就是一个图片,居中显示 代码逻辑 var imgAnimation: ImageView? = null var imgstart = 0 val imgids = arrayOf( R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5 ) private fun testHandler() { setContentView(R.layout.handler_sample) imgAnimation = findViewById(R.id.imgAnimation) val handler = ImgAnimationHandler() Timer().schedule( object : TimerTask() { override fun run() { handler.sendEmptyMessage(101) } }, 0, 500 ) } class ImgAnimationHandler : Handler() { override fun handleMessage(msg: Message) { if (msg.what == 101) { imgAnimation?.setImageResource(imgids[imgstart++ % imgids.size]) } } } 消息处理:主要是新建了一个 ImgAnimationHandler ,它覆写了 handleMessage 方法来处理信息,当消息what值=101 时,从 imgids 中顺序选择一个 sourceId 来达到图片切换的效果 发送消息:主线程中创建一个Timer的schedule线程每隔 500ms 通过 ImgAnimationHandler 发送消息 (what=101) 在子线程中调用Handler 在子线程中调用Handler,需要设置指定 Looper 的Handler(在创建 Handler 时,官方不再建议使用默认的构造函数创建 Handler,而是推荐 传入 Looper 实例作为构建参数的构造函数) ...

2025-08-01 ·  (🌟Updated: 2025-08-04) · 1 min · 188 words · tomyli

重拾Android的快乐-Service

说明 REF https://developer.android.com/develop/background-work/services

2025-07-29 · 1 min · 3 words · tomyli

重拾Android的快乐-ListView组件

说明 ListView 组件用来以垂直滚动的显示View集合,配置方式如下: <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ListView 实现动态数据展示 ListView 是一个 AdapterView,它不关心要显示的数据,只负责展示 ListView 显示的数据是交由 ListAdapter 进行处理,ListAdapter 本质是一个 Adapter,它是ListView和展示数据的桥,这样就可以实现内容与数据的分离 BaseAdapter 抽象基类,自定义扩展都会继承这个类 ArrayAdapter 支持泛型操作,实现最简单的展示一行文字 SimpleAdapter 具有良好扩展性的Adapter,支持Map类型的List数据(List<Map>),支持自定义多种效果 重点关注一下 Adapter 的 getView 方法,它提供获取显示数据的View,这个View可以直接创建或者从XML layout中创建 实战 实现一个最简单的列表 最终效果 核心代码 ListView 容器layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/listView" /> </LinearLayout> 文件名为: list_item1 在线性布局下定义一个 ListView , 设置id为 listView MainActivity 代码 private fun testListView1() { setContentView(R.layout.list_item1) val list = listOf("111", "222", "333", "444", "555") val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, list) val listView = findViewById<ListView>(R.id.listView) listView.adapter = adapter } 主要关注创建 ArrayAdapter 的代码,创建时需要的参数: ...

2025-07-25 ·  (🌟Updated: 2025-08-04) · 1 min · 115 words · tomyli

重拾Android的快乐-TableLayout布局

说明 TableLayout 是一个用来以行或者列方式来显示子View的视图组。TableLayout不显示行、列或者单元格的边框线。一个表可以留空多个单元格,也可以跨越多列,这个与html类似 TableRow TabRow是 TableLayout 的子View,用来表示一行,此元素下可以定义多个单元格来包含其它元素,单元格又可以嵌套 TableLayout 约束 列的宽度由该列中最宽单元格的行定义 TableLayout 子类不能指定 layout_width 属性,宽度值一直为 MATCH_PARENT layout_height 属性可以由子类进行设置,默认值为 WRAP_CONTENT ;如果子类是 TableRow ,则其高度值一直为 WRAP_CONTENT 常用属性 android:collapseColumns 基于索引0来隐藏列,多个值用英文逗号分隔,例如配置为1,则隐藏第2列 table中的列索引从0开始计数,如果不指定,则自动增加 android:shrinkColumns 基于索引0来收缩列 android:stretchColumns 基于索引0来拉升列 示例 效果图 代码 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="1"> <TableRow> <TextView android:layout_column="1" android:text="Open..." android:padding="3dip" /> <TextView android:text="Ctrl-O" android:gravity="right" android:padding="3dip" /> </TableRow> <TableRow> <TextView android:layout_column="1" android:text="Save..." android:padding="3dip" /> <TextView android:text="Ctrl-S" android:gravity="right" android:padding="3dip" /> </TableRow> <TableRow> <TextView android:layout_column="1" android:text="Save As..." android:padding="3dip" /> <TextView android:text="Ctrl-Shift-S" android:gravity="right" android:padding="3dip" /> </TableRow> <View android:layout_height="2dip" android:background="#FF909090" /> <TableRow> <TextView android:text="X" android:padding="3dip" /> <TextView android:text="Import..." android:padding="3dip" /> </TableRow> <TableRow> <TextView android:text="X" android:padding="3dip" /> <TextView android:text="Export..." android:padding="3dip" /> <TextView android:text="Ctrl-E" android:gravity="right" android:padding="3dip" /> </TableRow> <View android:layout_height="2dip" android:background="#FF909090" /> <TableRow> <TextView android:layout_column="1" android:text="Quit" android:padding="3dip" /> </TableRow> </TableLayout> 因为在 TableLayout 中设置了 android:stretchColumns="1" 属性来拉升第一列,可以看到第一列的宽度最宽

2025-07-17 ·  (🌟Updated: 2025-07-17) · 1 min · 124 words · tomyli

重拾Android的快乐-RelativeLayout布局

说明 RelativeLayout 是一个提供子View相对位置的View组,可以指定相邻同级节点的位置(上下左右)或相对于父区域的位置。RelativeLayout主要是用来消除嵌套布局来保持布局层级扁平来提升性能。 布局方向 Android中的布局方向有两种: LTR 从左到右 RTL 从右到左 可以通过 android:layoutDirection 进行设置 常用属性配置 对齐相关 android:layout_alignParentTop 此视图顶部边缘与父视图顶部边缘对齐,忽略布局方向,对应的有 android:layout_alignParentBottom android:layout_alignParentLeft 此视图顶部边缘与父视图左侧对齐,只支持LTR,对应的有 android:layout_alignParentRight android:layout_alignParentStart 此视图顶部边缘与父视图左侧对齐,支持LTR与RTL,对应的有 android:layout_alignParentEnd android:layout_alignTop 此视图顶部边缘与给定视图顶部边缘对齐,忽略布局方向,对应的有 android:layout_alignParentBottom android:layout_alignLeft 此视图顶部边缘与给定视图左侧对齐,只支持LTR,对应的有 android:layout_alignRight android:layout_alignStart 此视图顶部边缘与给定视图左侧对齐,支持LTR与RTL,对应的有 android:layout_alignEnd android:layout_alignWithParentIfMissing 如果没有设置 layout_toLeftOf 或者 layout_toRightOf 属性则使用父view做为锚点 居中相关 android:layout_centerHorizontal 子视图在父视图中垂直居中 android:layout_centerVertical 子视图在父视图中水平居中 android:layout_centerInParent 子视图在父视图中水平和垂直居中 android:layout_below 用于控制垂直方向,此视图定位于指定资源id的下方,对应的还有 android:layout_above android:layout_toRightOf 用于左右(LTR)布局并忽略右左布局,此视图的左边缘定位于指定资源的右方,其它的还有 android:layout_toLeftOf android:layout_toEndOf 支持LTR与RTL两种布局,对于LTR表示位于指定资源id的右侧,对于RTL则相反 示例 这里引用一个官方提供的样例 效果图 代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="16dp" android:paddingRight="16dp" > <EditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/reminder" /> <Spinner android:id="@+id/dates" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_below="@id/name" android:layout_alignParentLeft="true" android:layout_toLeftOf="@+id/times" /> <Spinner android:id="@id/times" android:layout_width="96dp" android:layout_height="wrap_content" android:layout_below="@id/name" android:layout_alignParentRight="true" /> <Button android:layout_width="96dp" android:layout_height="wrap_content" android:layout_below="@id/times" android:layout_alignParentRight="true" android:text="@string/done" /> </RelativeLayout> 这里主要关注中间两个Spinner和Button ...

2025-07-10 ·  (🌟Updated: 2025-07-17) · 1 min · 168 words · tomyli