考虑 bluetooth 本身呢... 是一个近距离通信, IoT 的解决方案
它的徽标好像是从丹麦一位口舌伶俐的国王哪里受到启发,是由拉丁还是希腊... 字母 'B' 和 'H' 组成的
最新的 Bluetooth 4.0 技术提供了低能耗等新特性,不过应用编程模型貌似没有区别
虽然功耗 和速度什么的 应该都是问题,但它的支持相当广泛
https://www.bluetooth.org/en-us/specification/adopted-specifications
如果只是应用的话,过程大概是这样:
这个模型从『自己的设备』有三个对象:
1. BluetoothAdapter,这是你设备的蓝牙适配器,它代表了你的设备(不过是『主语』),它可以有一个外部设备可见的名字
蓝牙是低频无线电通讯的方式,适配器是可以『扫描』和『建立连接』其他设备的东西
2. BluetoothDevice,这是有蓝牙能力的设备,以 Client/Server 方式抽象
你的设备可以通过『pair』配对的方式,和另一个设备连接起来(利用蓝牙的指纹 footprint 标记,地址被称为 address),连接是安全加密的,第三人很难截取窃听。
3. Connection,一般被抽象为 socket (BluetoothSocket, BluetoothServerSocket)
Socket 是计算机网络传输层的一个抽象,可以发送和接受数据
蓝牙有两种模式 -- Server 和 Client (关系 1:N)
Server 可以处理 『accept』 client 的请求,并且请求之间在应用层各自独立,不会出现新请求打断老请求,使得服务无法正常运行的情况
== 一般的应用工作模式 (getDefaultAdapter)
1. 打开(enable)你的蓝牙适配器 (boolean enable, disable, isEnabled; int getState)
.5 你可以选择给设备设置一个名称
Intent enableBh = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBh, REQUEST_ENABLE_BT);
2. 开始扫描(discover)附近的蓝牙设备 (startDiscovery),你可以定时,等一会后继续(这里推荐 Kotlin 使用 await coroutine)
3. 你扫描能得到一个蓝牙的设备集合,他们使用 footprint 作为自己的唯一标识 (Set<BluetoothDevice> getBondedDevices)
4. 你可以对未配对的设备请求配对,只有配对设备之间可以传输用户数据
5. 主控设备可以进入 server 模式,监听连接(listenRFCommWithServiceRecord),客户机可以连接到 paired device 并且发送请求(平等关系判断主从也可以比较随便,知道 ID 即可)
7. 客户机找到服务器后发送数据请求,服务器接收
#Java #Android #unconfirmed
它的徽标好像是从丹麦一位口舌伶俐的国王哪里受到启发,是由拉丁还是希腊... 字母 'B' 和 'H' 组成的
最新的 Bluetooth 4.0 技术提供了低能耗等新特性,不过应用编程模型貌似没有区别
虽然功耗 和速度什么的 应该都是问题,但它的支持相当广泛
https://www.bluetooth.org/en-us/specification/adopted-specifications
如果只是应用的话,过程大概是这样:
这个模型从『自己的设备』有三个对象:
1. BluetoothAdapter,这是你设备的蓝牙适配器,它代表了你的设备(不过是『主语』),它可以有一个外部设备可见的名字
蓝牙是低频无线电通讯的方式,适配器是可以『扫描』和『建立连接』其他设备的东西
2. BluetoothDevice,这是有蓝牙能力的设备,以 Client/Server 方式抽象
你的设备可以通过『pair』配对的方式,和另一个设备连接起来(利用蓝牙的指纹 footprint 标记,地址被称为 address),连接是安全加密的,第三人很难截取窃听。
3. Connection,一般被抽象为 socket (BluetoothSocket, BluetoothServerSocket)
Socket 是计算机网络传输层的一个抽象,可以发送和接受数据
蓝牙有两种模式 -- Server 和 Client (关系 1:N)
Server 可以处理 『accept』 client 的请求,并且请求之间在应用层各自独立,不会出现新请求打断老请求,使得服务无法正常运行的情况
== 一般的应用工作模式 (getDefaultAdapter)
1. 打开(enable)你的蓝牙适配器 (boolean enable, disable, isEnabled; int getState)
.5 你可以选择给设备设置一个名称
Intent enableBh = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBh, REQUEST_ENABLE_BT);
2. 开始扫描(discover)附近的蓝牙设备 (startDiscovery),你可以定时,等一会后继续(这里推荐 Kotlin 使用 await coroutine)
3. 你扫描能得到一个蓝牙的设备集合,他们使用 footprint 作为自己的唯一标识 (Set<BluetoothDevice> getBondedDevices)
4. 你可以对未配对的设备请求配对,只有配对设备之间可以传输用户数据
5. 主控设备可以进入 server 模式,监听连接(listenRFCommWithServiceRecord),客户机可以连接到 paired device 并且发送请求(平等关系判断主从也可以比较随便,知道 ID 即可)
adapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM, uuid);6. 使用 blocking accept (queue 队列) 模式(ServerSocket)串行地对每个请求打开 socket 进行处理(accept 到 client request 后获取 input stream 来 read),注意这不会导致任何请求因为资源被占用而被遗忘
7. 客户机找到服务器后发送数据请求,服务器接收
#Java #Android #unconfirmed
Bluetooth® Technology Website
Core Specification | Bluetooth® Technology Website
This specification defines the technologies required to create interoperable Bluetooth devices. Related Resource(s): Bluetooth® Core 6.2…
duangsuse::Echo
考虑 bluetooth 本身呢... 是一个近距离通信, IoT 的解决方案 它的徽标好像是从丹麦一位口舌伶俐的国王哪里受到启发,是由拉丁还是希腊... 字母 'B' 和 'H' 组成的 最新的 Bluetooth 4.0 技术提供了低能耗等新特性,不过应用编程模型貌似没有区别 虽然功耗 和速度什么的 应该都是问题,但它的支持相当广泛 https://www.bluetooth.org/en-us/specification/adopted-specifications 如果只是应用的话,过程大概是这样:…
类似这样对应用开发者有用的资料,还是要分享的。
需要一些不常见的,比如解析器 DSL 解释器 翻译器 新语言设计什么的 编写,请去隔壁的 @dsuse_tmp
需要一些不常见的,比如解析器 DSL 解释器 翻译器 新语言设计什么的 编写,请去隔壁的 @dsuse_tmp
你们做了什么?开了这么久,到现在连一门自己的语言都没有写,连算法可视化都没做过 为什么要这么死板地做 还是在使用的角度看 作为描述的直觉的编程语言
没有区分 过程式 函数式 面向对象 对程序和数据的处理方式 照搬照抄、模板,没有直觉和对缘由的感知 生搬硬套 应试教育的翻版
为什么 这对国内水准的提高 有帮助吗? 很多人只是为了考试 用用就忘掉了,到头来 抛弃 Dynamic programming 抛弃图算法 抛弃 继承和传递的优化思路 抛弃了所学到的所有 用回手写的辣鸡排序算法 用回暴力搜索
一个美妙的名字 『中国』 的 计算机『学会』 本来应该承载着多少希望,担负着提升国名计算机应用素质的责任重担,现在这样,还不如『同人』的 OJ
这么多年了,为什么不能有点改变呢?
没有区分 过程式 函数式 面向对象 对程序和数据的处理方式 照搬照抄、模板,没有直觉和对缘由的感知 生搬硬套 应试教育的翻版
为什么 这对国内水准的提高 有帮助吗? 很多人只是为了考试 用用就忘掉了,到头来 抛弃 Dynamic programming 抛弃图算法 抛弃 继承和传递的优化思路 抛弃了所学到的所有 用回手写的辣鸡排序算法 用回暴力搜索
一个美妙的名字 『中国』 的 计算机『学会』 本来应该承载着多少希望,担负着提升国名计算机应用素质的责任重担,现在这样,还不如『同人』的 OJ
这么多年了,为什么不能有点改变呢?
有一个 IDE,不过很老了 而且也没什么特色 可能最多的功能就是调用外部工具了(笑
真的是中国最『称职』的计算机『学』会了,如果要知道为什么我这么夸赞的话 — 是因为『某种极其特殊的原因』
真的是中国最『称职』的计算机『学』会了,如果要知道为什么我这么夸赞的话 — 是因为『某种极其特殊的原因』
#Java 希望能够重写 SuicideBot 并且为之加上启动 / 退出的 Autosave (user -> time map) 功能,同时,也打算记录退出时间,来自动释放一些用户
那就加一个自杀排行榜吧(啊啊啊啊
啊,才发现定时是 Telegram 自己管理的 直播请在 tmp 观看
那就加一个自杀排行榜吧(啊啊啊啊
啊,才发现定时是 Telegram 自己管理的 直播请在 tmp 观看
GitHub
Trumeet/SuicideBot
Just for fun :D. Contribute to Trumeet/SuicideBot development by creating an account on GitHub.
Forwarded from duangsuse Throws
Forwarded from dnaugsuz
一方面我是人,一方面我要训练自己重复的能力
Forwarded from dnaugsuz
因为我从重复中实践,从重复中看出可以增强的地方
Forwarded from dnaugsuz
训练是不可避免的,我必须要做到『想什么时候编程,想写些什么模式,都能够立刻做到』
Forwarded from dnaugsuz
https://t.me/dsuse_tmp/605
你看,如果我简单地去用 code template,能够把这个『模板』中重复的部分抽提出来吗?能够让我理解 travis 的配置综合模型吗?
实际上重复也是学习本身依赖的重要因素
你看,如果我简单地去用 code template,能够把这个『模板』中重复的部分抽提出来吗?能够让我理解 travis 的配置综合模型吗?
实际上重复也是学习本身依赖的重要因素
Telegram
/tmp/duangsuse.sock
第二遍,我们需要 docker 的 build, depoly
language: minimal
service:
- docker
install:
- VERSION=$(git rev-list --count HEAD)
- VERSION_HEAD=$(git rev-parse --verify HEAD | head -c7)
- echo $DOCKER_PASS | docker login --password-stdin $DOCKER_REGISTRY -u…
language: minimal
service:
- docker
install:
- VERSION=$(git rev-list --count HEAD)
- VERSION_HEAD=$(git rev-parse --verify HEAD | head -c7)
- echo $DOCKER_PASS | docker login --password-stdin $DOCKER_REGISTRY -u…
duangsuse Throws
#statement #dev
有人说『学习的本质是重复』『学习的本质是记忆』,其实未必真是的,但我这里想告诉大家
就是:实践很重要 不要害怕实践 不要害怕去把编程,开新工程当成日常来做(甚至带一点 build system / project management / depolyment 的)
我之所以要当『复读机』,一方面是因为我一直是『复读机』(实际上也没那么严重,甚至比很多人好一些),另一方面是我应该永远学习下去,『未满』才是最好的样子。
所以复读机 我也要当! 在复读的过程中,我训练了自己对代码的阅读记忆能力、看到了各种编程风格,多次的复读,让我有机会深化对模型和技术的理解,让我能够在『刻板』的基础上做出『创新』,并且保证了以后的实践里,我总是能够在第一时间想到『怎么做』
使用模板是好事,因为它避免了重复,可是它却不能让你『弄懂』弄明白
总是『理解记忆』也是好事,可是它却不能保证你真正理解了、记住了,有时候你总是会想不到一些事情、总是会发现自己又忘记了,这样要再次去查
”再次去查“是我最讨厌的东西,因为它意味着,我得重新理解,我对之前的知识还不够深刻以至于要『再次找』,而且它会浪费大量的时间、会搞坏你的心情、阻止你对当前程序的兴趣和理解
我很讨厌『用到就去查』,因为这不利于我系统的理解。你们可以看到,我发的每篇比较长的广播,都是相对系统完整的知识,不是『某个功能,已经有了什么数据,有啥 API 完成某操作』『某件看起来了不得的事情,我实现它的 point 在哪里』然后简单一两行、几个截图完事
相反的,我总是先系统学习某种技术,对于大的系统我会一个一个小片的理解消化,并且在过程中我会留下不少实践编程的碎片,而且不止一种语言。我希望我的每行代码都是有确切理解验证的。 — 就是,必须有编写可运行/可使用代码的验证
这个看起来愚蠢的行为的解释,我已经给出了,你觉得呢?
在信息技术 软件工程里更是如此,缺乏实践验证的理解,你怎么知道你用的时候就真正理解了?
现在那个什么 『Agile Development』 的 TestDrivenDevelopment,仅仅从它对『测试』的看重上,我觉得是对的。因为实际应用要的是至少『有效』『工作』的代码,不是看起来没什么问题实际上无法在某些正常情况下工作的 buggy 代码。
错误发现的越早,其产生的不良影响就越小。
系统理解的战线拖延得越长、产生的误解和漏洞越多,其对实际编程和后继学习产生的不良影响就越大。
这个道理,套用到个人对技术的理解上,不也是一样吗? #statement
就是:实践很重要 不要害怕实践 不要害怕去把编程,开新工程当成日常来做(甚至带一点 build system / project management / depolyment 的)
我之所以要当『复读机』,一方面是因为我一直是『复读机』(实际上也没那么严重,甚至比很多人好一些),另一方面是我应该永远学习下去,『未满』才是最好的样子。
所以复读机 我也要当! 在复读的过程中,我训练了自己对代码的阅读记忆能力、看到了各种编程风格,多次的复读,让我有机会深化对模型和技术的理解,让我能够在『刻板』的基础上做出『创新』,并且保证了以后的实践里,我总是能够在第一时间想到『怎么做』
使用模板是好事,因为它避免了重复,可是它却不能让你『弄懂』弄明白
总是『理解记忆』也是好事,可是它却不能保证你真正理解了、记住了,有时候你总是会想不到一些事情、总是会发现自己又忘记了,这样要再次去查
”再次去查“是我最讨厌的东西,因为它意味着,我得重新理解,我对之前的知识还不够深刻以至于要『再次找』,而且它会浪费大量的时间、会搞坏你的心情、阻止你对当前程序的兴趣和理解
我很讨厌『用到就去查』,因为这不利于我系统的理解。你们可以看到,我发的每篇比较长的广播,都是相对系统完整的知识,不是『某个功能,已经有了什么数据,有啥 API 完成某操作』『某件看起来了不得的事情,我实现它的 point 在哪里』然后简单一两行、几个截图完事
相反的,我总是先系统学习某种技术,对于大的系统我会一个一个小片的理解消化,并且在过程中我会留下不少实践编程的碎片,而且不止一种语言。我希望我的每行代码都是有确切理解验证的。 — 就是,必须有编写可运行/可使用代码的验证
这个看起来愚蠢的行为的解释,我已经给出了,你觉得呢?
在信息技术 软件工程里更是如此,缺乏实践验证的理解,你怎么知道你用的时候就真正理解了?
现在那个什么 『Agile Development』 的 TestDrivenDevelopment,仅仅从它对『测试』的看重上,我觉得是对的。因为实际应用要的是至少『有效』『工作』的代码,不是看起来没什么问题实际上无法在某些正常情况下工作的 buggy 代码。
错误发现的越早,其产生的不良影响就越小。
系统理解的战线拖延得越长、产生的误解和漏洞越多,其对实际编程和后继学习产生的不良影响就越大。
这个道理,套用到个人对技术的理解上,不也是一样吗? #statement