睡觉睡觉,我可懒得老是管 XML 和几个接口/抽象类定义的事情...
CachedServiceFetcher、registerService、permission-group、checkSelfOrCallingPermission 什么的,你们自己看吧,给张图就跑~
CachedServiceFetcher、registerService、permission-group、checkSelfOrCallingPermission 什么的,你们自己看吧,给张图就跑~
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
😲 Sticker
该死... 又多写了(
https://github.com/duangsuse/RandomPicture/commit/440b8a1c7d2251b0074c1571c0d07c613628fc54
支持了个刷新功能,可以使用 Ctrl-|
https://github.com/duangsuse/RandomPicture/blob/master/src/main/kotlin/org/duangsuse/fushion/RandomPicture.kt#L76
https://github.com/duangsuse/RandomPicture/commit/440b8a1c7d2251b0074c1571c0d07c613628fc54
支持了个刷新功能,可以使用 Ctrl-|
SIGQUIT 退出程序https://github.com/duangsuse/RandomPicture/blob/master/src/main/kotlin/org/duangsuse/fushion/RandomPicture.kt#L76
GitHub
Feat(Main): Add Signal: Ctrl-C SIGINT refresh · duangsuse/RandomPicture@440b8a1
- And see file list!
因为 Telegram 一直连不上,白白浪费了很多时间!
This media is not supported in your browser
VIEW IN TELEGRAM
效率.... 🤐
那既然已经花了很多时间就再多花一点(皮)
演示一下这个功能:
[DuangSUSE@duangsuse]
~/WallpapperSlide% cd ~/Projects/RandomPicture
~/Projects/RandomPicture% ./gradlew build
BUILD SUCCESSFUL in 1s
12 actionable tasks: 9 executed, 3 up-to-date
~/Projects/RandomPicture% cp build/libs/server-1.0-SNAPSHOT.jar ~/bin; cd -
四月 01, 2019 11:29:18 上午 org.duangsuse.fushion.RandomPicture
信息: Checking with regex /^.*\.(png|jpg|jpeg|gif|webp|raw|bmp|img|svg)$/
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
严重: Failed in deploying verticle
io.vertx.core.impl.NoStackTraceThrowable: Input path /app/favourite (RANDOM_PICTURE) should be exists and is folder
(其实我应该用 then 而不是 all 的,不过机不可失,逃跑)
信息: Begin indexing images
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Begin >
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Finished > (.) costs 1 ms
信息: Finished > (png) costs 0 ms
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
警告: Ignoring non-picture file ./png
警告: 8 files ignored, 75 files added
信息: Finished indexing images size 75 costs 19 ms
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
<Ctrl-C(INT)
信息: Refreshing pictures list...
== All files
0: /home/DuangSUSE/WallpapperSlide/昨日青空/./后来谁又在这里装作不经意的看过谁.jpg
...
74: /home/DuangSUSE/WallpapperSlide/昨日青空/./l-2.jpg
信息: Begin Cleaning old list
信息: Finished Cleaning old list costs 1 ms
信息: Begin Indexing new images...
警告: 8 files ignored, 75 files added
信息: Finished Indexing new images... 0 files added costs 14 ms
<Ctrl+Z(HUP)
mv origin.jpg.bak origin.jpg
fg %RANDOM_PICTURE=.
警告: 7 files ignored, 76 files added
信息: Finished Indexing new images... 1 files added costs 7 ms
== New files
/home/DuangSUSE/WallpapperSlide/昨日青空/./origin.jpg
<Ctrl+Z
kill -TERM %RANDOM_PICTURE=.
🤔 SIGQUIT 都被 HotSpot 占用了... 欸
如果是生产环境的话,可以用 USR1、USR2 代替这种操作,毕竟也不常用(可以用于不停服刷新静态数据)。
当然,Java 也提供了文件夹更新监听器,所以这种操作完全不用手工弄,也不用完全重新扫描整个文件树,直接用 fs watcher 监听就好 #backend #Kotlin #Java
其他操作,比如输出更新 log 什么的,可以试试 UNIX Signal
那既然已经花了很多时间就再多花一点(皮)
演示一下这个功能:
[DuangSUSE@duangsuse]
~/WallpapperSlide% cd ~/Projects/RandomPicture
~/Projects/RandomPicture% ./gradlew build
BUILD SUCCESSFUL in 1s
12 actionable tasks: 9 executed, 3 up-to-date
~/Projects/RandomPicture% cp build/libs/server-1.0-SNAPSHOT.jar ~/bin; cd -
##~/WallpapperSlide% java -jar ~/bin/server-1.0-SNAPSHOT.jar
四月 01, 2019 11:29:18 上午 org.duangsuse.fushion.RandomPicture
信息: Checking with regex /^.*\.(png|jpg|jpeg|gif|webp|raw|bmp|img|svg)$/
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
严重: Failed in deploying verticle
io.vertx.core.impl.NoStackTraceThrowable: Input path /app/favourite (RANDOM_PICTURE) should be exists and is folder
(其实我应该用 then 而不是 all 的,不过机不可失,逃跑)
##
RANDOM_PICTURE=. java -jar ~/bin/server-1.0-SNAPSHOT.jar信息: Begin indexing images
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Begin >
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Finished > (.) costs 1 ms
信息: Finished > (png) costs 0 ms
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
警告: Ignoring non-picture file ./png
警告: 8 files ignored, 75 files added
信息: Finished indexing images size 75 costs 19 ms
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
<Ctrl-C(INT)
信息: Refreshing pictures list...
== All files
0: /home/DuangSUSE/WallpapperSlide/昨日青空/./后来谁又在这里装作不经意的看过谁.jpg
...
74: /home/DuangSUSE/WallpapperSlide/昨日青空/./l-2.jpg
信息: Begin Cleaning old list
信息: Finished Cleaning old list costs 1 ms
信息: Begin Indexing new images...
警告: 8 files ignored, 75 files added
信息: Finished Indexing new images... 0 files added costs 14 ms
<Ctrl+Z(HUP)
mv origin.jpg.bak origin.jpg
fg %RANDOM_PICTURE=.
警告: 7 files ignored, 76 files added
信息: Finished Indexing new images... 1 files added costs 7 ms
== New files
/home/DuangSUSE/WallpapperSlide/昨日青空/./origin.jpg
<Ctrl+Z
kill -TERM %RANDOM_PICTURE=.
🤔 SIGQUIT 都被 HotSpot 占用了... 欸
如果是生产环境的话,可以用 USR1、USR2 代替这种操作,毕竟也不常用(可以用于不停服刷新静态数据)。
当然,Java 也提供了文件夹更新监听器,所以这种操作完全不用手工弄,也不用完全重新扫描整个文件树,直接用 fs watcher 监听就好 #backend #Kotlin #Java
其他操作,比如输出更新 log 什么的,可以试试 UNIX Signal
duangsuse::Echo
最后完整注释的版本 #Android
最后,快速了解一下 #Android 系统服务吧,看来这个星期又是啥都没干成... 🤐
== 简而言之
就是简单的『强类型』 C/S 架构喽
(下面的 Class#method% 方法表示我不想提及 method 的方法列表,但它是方法不是实例字段)
Service,就是 Android IPC 的 OOService
Service Server 使用 ServiceManager#addService% 和 ServiceManager#getService% 注册和获取 IBinder
一般要进行权限认证,Context#checkCallingOrSelfPermission
没有 Context,使用 ActivityThread 拿到 system main thread,再拿 system Context。
检查相等性 PackageManager.PERMISSION_GRANTED
XML 符号:
tag permission-group { android:name android:icon android:label }
tag permission { android:name android:icon android:label android:permission-group android:protectionLevel }
Client,就是 OO,它找 ServiceManager 拿到一个 IBinder 对象,然后进行 IOOService.Stub.asService 转换,保证接口是清真无混乱的(IBinder 好比果的 HTTP 协议、AIDL 则是我们自己对协议的约束)
API,就是 IOOService,可以使用 AIDL 语言定义,用来利用 Android IPC 系统传递我们自己的消息
Manager,就是你自己提供一些辅助函数,比如
—> 应用程序
class Vibrator
class android.os.SystemVibrator extends Vibrator
AIDL interface IVibratorService
abstact class IVibratorService.Stub
public class VibratorService extends IVibratorService.Stub implements InputManager.InputDeviceListener
public void VibratorService#vibrate(int uid, String opPkg, long milliseconds, int usageHint, IBinder token)
Context#getSystemService(@ServiceName String! serviceId)
Context.VIBRATOR_SERVICE
—> SystemServer
class com.android.server.SystemServer
traceBeginAndSlog(String)
ServiceManager.addService(String, IBinder)
traceEnd()
SystemServer#startOtherServices()
SystemServer#main()
SystemServer#run()
SystemServiceManager#startService()
ServiceManager#addService(String, IBinder)
ServiceManager#getService(String)
—> Services API
class android.app.SystemServiceRegistry
abstract class CachedServiceFetcher<T> { T createService(ContextImpl ctx); }
registerService(name, ServiceFetcher)
abstract class ServiceConnection
onServiceConnected(ComponentName name, IBinder service)
IXXXService.Stub.asInterface(service);
—> Android API
class android.os.Looper
Looper#prepareMainLooper();
Looper#loop%
activityThread.getSystemContext%
ActivityThread#systemMain
android.permission.SHUTDOWN
IPowerManager
IPowerManager#shutdown
Context.POWER_SERVICE
PowerManager.SHUTDOWN_USER_REQUESTED
Context#checkCallingOrSelfPermission
http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/java/com/android/server/SystemServer.java#475
== 简而言之
就是简单的『强类型』 C/S 架构喽
(下面的 Class#method% 方法表示我不想提及 method 的方法列表,但它是方法不是实例字段)
Service,就是 Android IPC 的 OOService
Service Server 使用 ServiceManager#addService% 和 ServiceManager#getService% 注册和获取 IBinder
abstract class ServiceConnection但是注册 Service 对象的程序应该持续运行,一般使用 Looper 的 mainLooper
onServiceConnected(ComponentName name, IBinder service)
一般要进行权限认证,Context#checkCallingOrSelfPermission
没有 Context,使用 ActivityThread 拿到 system main thread,再拿 system Context。
检查相等性 PackageManager.PERMISSION_GRANTED
XML 符号:
tag permission-group { android:name android:icon android:label }
tag permission { android:name android:icon android:label android:permission-group android:protectionLevel }
Client,就是 OO,它找 ServiceManager 拿到一个 IBinder 对象,然后进行 IOOService.Stub.asService 转换,保证接口是清真无混乱的(IBinder 好比果的 HTTP 协议、AIDL 则是我们自己对协议的约束)
API,就是 IOOService,可以使用 AIDL 语言定义,用来利用 Android IPC 系统传递我们自己的消息
Manager,就是你自己提供一些辅助函数,比如
getOOService()
== 根据符号们:—> 应用程序
class Vibrator
class android.os.SystemVibrator extends Vibrator
AIDL interface IVibratorService
abstact class IVibratorService.Stub
public class VibratorService extends IVibratorService.Stub implements InputManager.InputDeviceListener
public void VibratorService#vibrate(int uid, String opPkg, long milliseconds, int usageHint, IBinder token)
Context#getSystemService(@ServiceName String! serviceId)
Context.VIBRATOR_SERVICE
—> SystemServer
class com.android.server.SystemServer
traceBeginAndSlog(String)
ServiceManager.addService(String, IBinder)
traceEnd()
SystemServer#startOtherServices()
SystemServer#main()
SystemServer#run()
SystemServiceManager#startService()
ServiceManager#addService(String, IBinder)
ServiceManager#getService(String)
—> Services API
class android.app.SystemServiceRegistry
abstract class CachedServiceFetcher<T> { T createService(ContextImpl ctx); }
registerService(name, ServiceFetcher)
abstract class ServiceConnection
onServiceConnected(ComponentName name, IBinder service)
IXXXService.Stub.asInterface(service);
—> Android API
class android.os.Looper
Looper#prepareMainLooper();
Looper#loop%
activityThread.getSystemContext%
ActivityThread#systemMain
android.permission.SHUTDOWN
IPowerManager
IPowerManager#shutdown
Context.POWER_SERVICE
PowerManager.SHUTDOWN_USER_REQUESTED
Context#checkCallingOrSelfPermission
http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/java/com/android/server/SystemServer.java#475
blog.yuuta.moe
从 Vibrator 到系统服务
这是一篇从前博客迁移来的文章。
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Doge
欢迎回来,亲爱的Doge AxuUnW !
获得了本月 3466 MB 流量,下月 1603.5 MB 流量
获得了本月 3466 MB 流量,下月 1603.5 MB 流量
啊看来这种公益项目还是救命啊,可惜我网上经济不自由不能使用付费服务
duangsuse::Echo
好了,闲杂事物已经处理完毕,现在来干 ♂ 正事 ❤️ #weekly #tech 这星期(虽然就一天)的事情,将会包含: + 两个到三个 Excited 的项目(BinaryStreamIO 1.0、SimpleCat)(Android 的 Perferences 封装) + 两个小型 PoC 项目(PartitionSortableList、Delete/Insert/Modify sorted Lists Android 应用、TextTag)(吐槽:其实 duangsuse 也不会多少排序算法呢,他连…
我只能最后改正之前错误的 NP-hard 问题什么的了... 其余的,下周说、下周做吧。 🤐
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
我只能最后改正之前错误的 NP-hard 问题什么的了... 其余的,下周说、下周做吧。 🤐
0. 这是什么
本频道上上周讲事的时候,讲错了一点,必须即时修正(皮一下,玩个个人的梗)
(我是在强调我修错修的快!)(所以不要告 typo)(是即时编译的即)
虽然我这周很多事情没有做(比如重写别人的 TextTag,比如写 SimpleCat 解释器和策划 NaiveCat、还有写 BinaryStreamIO、用 GeekSpec 1.0 重写 GeekApk 服务定义... 等等十几项)
(也会导致我下周在学校里不能看新书了,我要看文学书.... 这么多都是必须写的堆在哪里...)
但是我这个人呢,一直重视改错的,我和王垠一样总是在更新自己(又皮一下,又玩个个人的梗)(终于说了句大实话)
(好啦 duangsuse 毒舌...)
(只是玩梗而已,无恶意啦)
1. 这个问题出在哪里
-> 某条历史回顾消息广播
2. 是啥类型的问题
很智障的计算机科学定义混淆
3. 你打算怎么改
👇
本频道上上周讲事的时候,讲错了一点,必须即时修正(皮一下,玩个个人的梗)
(我是在强调我修错修的快!)(所以不要告 typo)(是即时编译的即)
虽然我这周很多事情没有做(比如重写别人的 TextTag,比如写 SimpleCat 解释器和策划 NaiveCat、还有写 BinaryStreamIO、用 GeekSpec 1.0 重写 GeekApk 服务定义... 等等十几项)
(也会导致我下周在学校里不能看新书了,我要看文学书.... 这么多都是必须写的堆在哪里...)
但是我这个人呢,一直重视改错的,我和王垠一样总是在更新自己(又皮一下,又玩个个人的梗)(终于说了句大实话)
(好啦 duangsuse 毒舌...)
(只是玩梗而已,无恶意啦)
1. 这个问题出在哪里
-> 某条历史回顾消息广播
2. 是啥类型的问题
很智障的计算机科学定义混淆
3. 你打算怎么改
👇
Telegram
duangsuse::Echo
所以呢,细心的大佬们仔细观察一下 duangsue 这条消息,你们会发现 duangsuse 开始决定走出之前某次导致某 Android 开发者频道被删的事件的阴影了
#statement #Android #dev
自然,情绪平复是需要时间的。 ⏲
大佬们看垃圾 duangsuse 之前的广播,会注意到可能有表现得很难受的消息,甚至有些消息,是有莫名讽刺意味的
实际上这非常的智障,首先,我自己在那个领域(指 Android 应用程序开发/计算机图形图像/图形用户界面和布局设计)(这个领域基本还需要基本的异步编程和…
#statement #Android #dev
自然,情绪平复是需要时间的。 ⏲
大佬们看垃圾 duangsuse 之前的广播,会注意到可能有表现得很难受的消息,甚至有些消息,是有莫名讽刺意味的
实际上这非常的智障,首先,我自己在那个领域(指 Android 应用程序开发/计算机图形图像/图形用户界面和布局设计)(这个领域基本还需要基本的异步编程和…
duangsuse::Echo
0. 这是什么 本频道上上周讲事的时候,讲错了一点,必须即时修正(皮一下,玩个个人的梗) (我是在强调我修错修的快!)(所以不要告 typo)(是即时编译的即) 虽然我这周很多事情没有做(比如重写别人的 TextTag,比如写 SimpleCat 解释器和策划 NaiveCat、还有写 BinaryStreamIO、用 GeekSpec 1.0 重写 GeekApk 服务定义... 等等十几项) (也会导致我下周在学校里不能看新书了,我要看文学书.... 这么多都是必须写的堆在哪里...) 但是我这…
=> 最后一次,drakeet 提到一个数组(线性表)优先级排序的问题(OI 入门内容,所谓初等内容都是 dfs bfs 这种的,计算机可解的数学问题,游戏模拟、递归算法、关系代数,稍微搞基一点的离散化、编译原理、神经网络)
就是你们之前看到纯纯支持 Book 的 Chapter 手动排序的特性,他在群里讨论了一下,(想了一段时间)说是逻辑上冲突无法实现,我表达了一下自己的看法『你可以做 Pin Chapter 的功能啊,我觉得应该会用得到』,但是 drakeet 觉得这依然是 NP-hard 问题(他觉得这类似停机问题,是不能解决的,我的观点大概就是不必须使用优先级排序,排序什么的有很多方法,都好说,『半自动排序半手动』是完全可行的),我最后甚至用 Ruby 写了个算法实现(就是能够 Pin 数据的 Array,并且可以自动 sort,sort 完手动 pin 的数据依然在表头部),结果就被踢了.... 🙁
出错的部分在这段话里,这里提到的 Chapter 现在在纯纯写作中被称为『文章』应该,反正纯纯写作把文章集合称为『书』Book,然后文章就是你们编辑(随机插入删除)的东西,我对这些名称不负责,就是表示这些。『drakeet 觉得这依然是 NP-hard 问题』
👉 后面和『
停机问题』逻辑并列这是错误的,因为停机问题和 NP-hard 不是一种概念
并且,停机问题也不是『不能解决』的,实际上,停机问题早就被证实了
好了这周就这么多
Wikipedia
停机问题
停机问题(英語:halting problem)是逻辑数学中可计算性理论的一个问题。通俗地说,停机问题就是判断任意一个程序是否能在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。