糖尿病应该如何检测指尖血糖?

依据《医疗机构便携式血糖检测仪管理和临床操作规范(试行)》【1】,其操作主要有:定位采血部位,通常为指尖、足跟两侧等;先用75%酒精擦拭消毒采血部位,待干后穿刺;穿刺后不使用第一滴血液,而是使用第二滴血液进行血糖监测。

其规范操作流程全文如下:

三、血糖检测操作规范流程

(一)测试前的准备。
1.检查试纸条和质控品贮存是否恰当。
2.检查试纸条的有效期及条码是否符合。
3.清洁血糖仪。
4.检查质控品有效期。

(二)血糖检测。
1.用75%乙醇擦拭采血部位,待干后进行皮肤穿刺。
2.采血部位通常采用指尖、足跟两侧等末梢毛细血管全血,水肿或感染的部位不宜采血。
3.皮肤穿刺后,弃去第一滴血液,将第二滴血液置于试纸上指定区域。
4.严格按照仪器制造商提供的操作说明书要求和操作规程 (SOP)进行检测。
5.测定结果的记录包括被测试者姓名、测定日期、时间、结果、单位、检测者签名等。
6.出现血糖异常结果时应当采取的以下措施:重复检测一次;通知医生采取不同的干预措施;必要时复检静脉生化血糖。

那么,为什么要用酒精消毒,而且要用第二滴血检测呢?丁香园有一篇讨论汇总文章《主任提问:指测血糖为什么要用酒精消毒?》【2】,可解答相关疑问。该汇总文章在最后提醒:“如果扎指后没有立即出血,或出血量不够,最好手部自然下垂,等待 5 秒钟。必要时可从掌心部位向下挤压,切勿从指尖挤压。

参考:
【1】《中华人民共和国卫生部公报》,2011年第1期,第54页-第58页,http://www.nhc.gov.cn/bgt/s10823/201310/2b7025c3bab1466988134c05e4e78003.shtml (备注:点击“.pdf”文字,或以网页源文件方式查看,即可获取完整pdf文件)

【2】丁香园,2019-07-30 ,《主任提问:指测血糖为什么要用酒精消毒?》,http://lab.dxy.cn/article/629032

本页永久链接:https://www.orztip.com/?p=560&article_title=diabetes-tips-for-using-fingerstick-testing-glucose-meter

socat:比ncat(nc)更好的端口转发工具

最近在端口转发上遇到了问题,表现为使用ncat(nc)进行端口转发时总会自动断开。比如当笔者使用如下nc命令进行端口转发时,就总会报错,然后nc自动退出。

命令:

ncat -l 17676 0</tmp/dbfifo17676 | ncat 192.168.203.55 3306 1>/tmp/dbfifo17676

错误:

(UNKNOWN) [192.168.203.55] 3306 (mysql) : Connection refused
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

搜了一下,网上有人问过这个问题,有一个回复说nc不支持keep-alive和fork模式导致,并推荐了socat【1】。试了一下果然好用,故记录一下。

socat是一个“netcat++”版多功能网络双向传输数据通道中继器(Bidirectional data relay between two data channels (‘netcat++’),SOcket CAT),在各大Linux发行版上都有已经编译好的二进制包,直接yum/apt等方式安装即可。如果没有,也可以从官网下载源码编译(地址见参考【3】和参考【4】)。

就笔者而言,要将远程192.168.203.55的MySQL端口3306转发到本地端口17676,其socat的命令如下:

socat tcp-l:17676,fork,reuseaddr tcp:192.168.203.55:3306

然后就可以在本地用数据库管理工具,连接本地17176端口进行管理了。

更详细的用法请参考Red Hat网站Enable Sysadmin板块的文章《Getting started with socat, a multipurpose relay tool for Linux》(地址见参考【2】)。

参考:

【1】https://unix.stackexchange.com/questions/293304/using-netcat-for-port-forwarding
【2】Evans Amoany,Getting started with socat, a multipurpose relay tool for Linux,2020-06-25,https://www.redhat.com/sysadmin/getting-started-socat
【3】http://www.dest-unreach.org/socat/
【4】https://linux.die.net/man/1/socat

本页永久链接:https://www.orztip.com/?p=556&article_title=socat-a-better-alternative-tool-for-port-forward-and-bidirectional-data-relay

在Linux中,如何让一个shell脚本以多进程的模式同时并行运行多份?

有时候,想让一个shell脚本像多进程模式那样并行运行多份,同时又能统一管理和终止。此时使用pipexec是最佳选择。

debian有该包,直接apt安装即可【1】。其它可能需要自行下载源代码并编译【2】。

以下是一个命令行示例,用于将test-sleep.sh并行运行5次:

pipexec \
-k \
-p /var/run/pipexec-test-sleep.pid \
-- \
[Test1 /bin/bash test-sleep.sh ] \
[Test2 /bin/bash test-sleep.sh ] \
[Test3 /bin/bash test-sleep.sh ] \
[Test4 /bin/bash test-sleep.sh ] \
[Test5 /bin/bash test-sleep.sh ]

其中,参数p用于写入运行pipexec时的pid,这个在用于服务管理的时候很有用。

注意,使用pipexec有可能会创建复杂的递归子进程,故使用ps命令行终止pipexec父进程无效,此时的表现为pipexec被终止运行了,但创建的相关子进程并不会被连环终止。要终止整个pipexec下面的所有子进程,尤其是递归子进程,需要使用pstree命令,详细见本站文章《Linux如何查看或杀死指定进程的所有子进程(包括递归子进程)?》【3】。

【1】https://packages.debian.org/stable/pipexec

【2】https://github.com/flonatel/pipexec

【3】https://www.orztip.com/?p=542&article_title=pstree-show-or-kill-process-dependency

本页永久链接:https://www.orztip.com/?p=548&article_title=pipexec-run-shell-script-as-multi-process

Linux如何查看或杀死指定进程的所有子进程(包括递归子进程)?

有时候,需要查看指定进程的所有子进程,ps命令在这个时候并不好使,尤其是当出现递归子进程的情况下,ps命令并不一定能查找得到——比如使用pipexec命令开启并行多进程的情况下。另外在杀死子进程方面,pkill命令也对递归子进程无能为力。

这个时候,需要pstree命令帮忙了。

使用pstree查看指定进程的所有子进程命令如下:

pstree -ap <待查看的进程>

此时它会输出所有相关子进程,包括递归子进程。

[test@local ~]# pstree -ap 2252
pipexec,2252 <命令行参数>
  ├─bash,9012 <命令行参数>
  │   └─su,38171 <命令行参数>
  │       └─bash,38173 <命令行参数>
  │           └─java,38175 <命令行参数>
  ├─bash,9013 <命令行参数>
  │   └─su,28185 <命令行参数>
  │       └─bash,28187 <命令行参数>
  │           └─java,28189 <命令行参数>
  ├─bash,9014 <命令行参数>
  │   └─su,28177 <命令行参数>
  │       └─bash,28179 <命令行参数>
  │           └─java,28181 <命令行参数>
  ├─bash,9015 <命令行参数>
  │   └─su,28184  <命令行参数>
  │       └─bash,28186 <命令行参数>
  │           └─java,28188 <命令行参数>
  └─bash,9016 <命令行参数>
      └─su,28176 <命令行参数>
          └─bash,28178 <命令行参数>
              └─java,28180 <命令行参数>

如果需要杀死指定进程下包括包括递归子进程的所有子进程,那么也要配合pstree的输出来进行。命令格式:

pstree  <待杀死的进程> -p -a -l | cut -d, -f2 | cut -d' ' -f1 | xargs kill

太温柔?直接暴力上kill -9咯:

pstree  <待强制杀死的进程> -p -a -l | cut -d, -f2 | cut -d' ' -f1 | xargs kill -9

本页永久链接:https://www.orztip.com/?p=542&article_title=pstree-show-or-kill-process-dependency

PHP 8.0兼容性注意事项

一、前言

以下内容主要针对从PHP 7.0或更早版本跨大版本升级到PHP 8.0的开发者。

在浏览本文之前,建议阅读以下链接:

(A)官方的PHP 8.0发布介绍:https://www.php.net/releases/8.0/en.php

(B)安全研究者phith0n发布的文章《有安全研究者混入了PHP 8.0开发组!》:https://mp.weixin.qq.com/s/0HSAPYY2PjbwEN3MhI4SkA

(C)《从 PHP 7.4.x 移植到 PHP 8.0.x》:https://www.php.net/manual/zh/migration80.php

二、语法引入和变更

1、不再支持大括号的数组写法(PHP 7.4引入)

以往我们会使用大括号来获取字符串某一个位置的内容:

$a = "abfdcccc";
$b = $a{0};

从PHP 7.4开始,该写法将不被支持,会报E_COMPILE_ERROR

[E_COMPILE_ERROR][Error Code 64] Array and string offset access syntax with curly braces is no longer supported

三、类引入和变更

1、Throwable接口引入(PHP 7.0引入)

从PHP 7.0开始,官方引入Throwable接口。现在Exception类和Error类均是Throwable接口的实现。

如果使用了set_exception_handler接收默认异常处理时,请在PHP 7.0检查是否允许实现了Throwable接口的实例传递。如果只支持传递Exception实例,则在PHP 7.0开始会存在问题,因为有可能会传递新增的Error实例。详见:https://www.php.net/manual/en/function.set-exception-handler.php

2、Error类引入(PHP 7.0引入,PHP 7.x强化PHP 8.0强化)

从PHP 7.0开始,官方引入Error类,即所有PHP内部错误类的基类。参见:https://www.php.net/manual/en/class.error.php

后续的PHP 7.x版本中,部分内置扩展把原来的输出warning迁移到抛出Error类,比如:

(A)ext/BCMath错误行为变更(PHP7.3引入):“BCMath Arbitrary Precision Mathematics: All warnings thrown by BCMath functions are now using PHP’s error handling. Formerly some warnings have directly been written to stderr.”

到了PHP 8.0,官方进一步强化了该类使用范畴:使用PHP函数时,如果出现参数验证错误,现在会抛出Error类而不是输出warning。因此,需要留意如何处理更多的异常。

Consistent type errors for internal functions: Most of the internal functions now throw an Error exception if the validation of the parameters fails.

PHP 7例子:

strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

PHP 8例子:

strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

四、扩展部分

1、ext/mcrypt扩展不再内置(PHP 7.1废弃,PHP 7.2移除)

从PHP 7.1开始,内置的mcrypt扩展被标记为废弃;PHP 7.2开始,mcrypt扩展被从内置库移除。

建议相关函数改用openssl扩展实现,和其它编程语言对接起来相对更通用。

详细见:

https://www.php.net/manual/en/intro.mcrypt.php

https://www.php.net/manual/en/migration71.deprecated.php

2、ext/xmlrpc扩展不再内置(PHP 8.0移除)

从PHP 8.0开始,内置的xmlrpc扩展被移除。

如有需要,请自行从PECL库下载并编译:https://pecl.php.net/package/xmlrpc

3、ext/sodium引入(PHP 7.2引入)

从PHP 7.2开始,官方引入sodium扩展。该扩展依赖libsodium库。

sodium扩展可以替代mcrypt扩展的功能,也能替代openssl扩展中的部分加解密功能。

但笔者建议,如果涉及和其它系统或编程语言的对接,优先使用openssl扩展。

参考:https://www.php.net/manual/en/book.sodium.php

本页永久链接:https://www.orztip.com/?p=526&article_title=php-8-compatibility

如何下载Adobe Flash Player 29.0.0.140全系列独立离线安装包

Adobe已经停止支持Flash Player,但国内转交给一家公司进行运营,也就是中国特供版。中国特供版存在锁区、弹广告等行为【1】,所以不少人会寻找29.0.0.140的版本以满足特定用途。那么在哪里可以找到呢?

在52pojie论坛上,有网友分享了其收集的Adobe Flash Player 29.0.0.140的所有离线安装包、调试程序、独立播放器,总共约151MB,值得各位下载备用。

下载地址见:

https://www.52pojie.cn/thread-730019-1-1.html

备用地址:

链接: https://pan.baidu.com/s/15jI9kHzZPGU8PWsw55U3sQ 密码: ee1v

要安装Adobe Flash Player 29.0.0.140,请注意如下事项。

(1)安装Adobe Flash Player 29.0.0.140需要断网安装。

(2)安装后必须在控制面板内的“Flash Player”设置中设置其为永不更新,否则仍然会被更新到中国特供版。

(3)如果安装了中国特供版,需要先卸载,完全重启一次后才能安装。

参考资料:

【1】《为什么我们要卸载Flash》:https://mp.weixin.qq.com/s/dGLnWnV0Xp4CZj3NRV3L_g

附:Adobe Flash Player 29.0.0.140离线安装包、调试程序、独立播放器文件的SHA256校验

342b22d1e8143102b98b2bd2a1f455ecca4fc54fd1dfa3fe63e4bb76300ca2ce ./ActiveX Internet Explorer/install_flash_player_ax.exe
a958591ede770b3e27af5f4e605c1ee99623c3fa59560c1b6bcafc63e616da3a ./Content Debuggers/flashplayer_29_ax_debug.exe
4f35c2c0ea3cf91dadf7352c45430342a44b6b22fe42a0670a8f4510c37f25fa ./Content Debuggers/flashplayer_29_plugin_debug.exe
97c4e4749a55c8ada49197030184befdf768b5481c5bf1a5629c1fad56f1afeb ./Content Debuggers/flashplayer_29_ppapi_debug.exe
d1b1680b966cee845cb33df0f8fd1da50fd0b70db1736524cb08ab29269ef4d1 ./NPAPI Firefox/install_flash_player.exe
4ce6e0910f71efb7fcca585388df847f8ea609d1125e1a6085dd7372ed234e09 ./PPAPI Opera and Chrome/install_flash_player_ppapi.exe
e5fdb31acd751c4b03a48b0463c60f445f9470c2efdcc73ee71ff3b268e75fef ./Standalone/flashplayer_29_sa.exe
bb24eff218d32ebefc042ebdbfe4cad81d6c79e82c8c6c061fe8b23520c615ed ./Standalone Debuggers/flashplayer_29_sa_debug.exe
26e2f1136867d67d4f2104e0a012f21d9645d7486f7c7083a26f6722ff22a639 ./uninstall_flash_player.exe

本页永久链接:https://www.orztip.com/?p=513&article_title=adobe-flash-player-29-0-0-140-content-debugger-standalone-offline-installer-download

如何获取旧版macOS DMG原版镜像

方法一:苹果官方支持网站

截至2021-03-17,苹果官方支持网站放出了以下macOS DMG原版镜像:

macOS Sierra 10.12(可升级 El Capitan、Yosemite、Mavericks、Mountain Lion 或 Lion)
OS X El Capitan 10.11(可升级 Yosemite、Mavericks、Mountain Lion、Lion 或 Snow Leopard)
OS X Yosemite 10.10(可升级 Mavericks、Mountain Lion、Lion 或 Snow Leopard)

下载地址:https://support.apple.com/zh-cn/HT211683

方法二:App Store

截至2021-03-17,苹果在App Store上架了以下安装器

macOS Catalina 10.15(可升级 Mojave、High Sierra、Sierra、El Capitan、Yosemite、Mavericks):https://apps.apple.com/cn/app/macos-catalina/id1466841314?mt=12

macOS Mojave 10.14(可升级 High Sierra、Sierra、El Capitan、Yosemite、Mavericks、Mountain Lion):https://apps.apple.com/cn/app/macos-mojave/id1398502828?mt=12

macOS High Sierra 10.13(可升级 Sierra、El Capitan、Yosemite、Mavericks、Mountain 、Lion):https://apps.apple.com/cn/app/macos-high-sierra/id1246284741?mt=12

方法三:由Collin开发的macOS XXX Patcher Tool for Unsupported Macs

开发者Collin开发的macOS XXX Patcher Tool for Unsupported Macs系列,本意是用于对安装镜像打补丁,以支持在官方不受支持的旧苹果电脑型号上运行新的macOS。但这些工具也含有可以下载旧版macOS DMG原版镜像的能力。注意,这些工具需要在macOS上运行。

(A)macOS Sierra Patcher Tool for Unsupported Macs

Current version: 4.2.7

下载地址:http://dosdude1.com/sierrapatch.html

(B)macOS High Sierra Patcher Tool for Unsupported Macs

Current version: 2.7.0, SHA1: 73f180d30200ef5f6d900440fe57b9c7d22bd6bf

下载地址:http://dosdude1.com/highsierra/

(C)macOS Mojave Patcher Tool for Unsupported Macs

Current version: 1.3.7, SHA1: 6f96788c3e61240dde232d644d83a0d8f373dbdc

下载地址:http://dosdude1.com/mojave/

(D)macOS Catalina Patcher

Current Version: 1.4.4

SHA1: b4caafe55b4f79afa962ec7ff58264c9b257aeca

下载地址:http://dosdude1.com/catalina/

方法四:Apple’s Regular Software Catalog

该方法需要从Apple’s Regular Software Catalog中辨别数个文件的下载url(一般为BaseSystem.dmg、BaseSystem.chunklist、InstallInfo.plist、InstallESDDmg.pkg、AppleDiagnostics.dmg、AppleDiagnostics.chunklist等),下载后进行U盘写入。

该方法需要一定的技术能力,详细见如下帖子《Making a bootable High Sierra USB Installer Entirely From Scratch in Windows or Linux Mint (without access to Mac or App Store Installer.app)》:https://www.insanelymac.com/forum/topic/329828-making-a-bootable-high-sierra-usb-installer-entirely-from-scratch-in-windows-or-linux-mint-without-access-to-mac-or-app-store-installerapp/

Apple’s Regular Software Catalog地址:https://swscan.apple.com/content/catalogs/others/index-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz

备注:安装文件校验值可参考如下地址,包括macOS安装文件(SharedSupport.dmg、InstallESD.dmg、BaseSystem.dmg)和Xcode Installer DMG的SHA1值:

https://github.com/notpeter/apple-installer-checksums

本页永久链接:https://www.orztip.com/?p=504&article_title=macos-dmg-download

Win10怎样通过蓝牙播放手机上的音乐或声音

最近想把Windows 10变成蓝牙音箱,让手机上的音乐或者声音通过蓝牙传输到电脑上,然后在电脑扬声器上播放。查了一下,这个功能涉及到Windows有没有实现和开放A2DP sink角色的问题。

A2DP全名是Advanced Audio Distribution Profile(高质量音频数据传输协议),这里面有两个角色,第一个是A2DP Source,作为源头端(source)负责编码和发送;第二个是A2DP Sink角色,作为接收端(receiver)负责接收和解码【1】。

Windows 7时代,虽然微软没有明面支持A2DP Sink角色,但如果厂商的蓝牙驱动有相关实现,那么是可以让Win 7作为A2DP Sink角色,来通过蓝牙播放手机上的音乐。但从Windows 8开始,无论是微软还是厂商蓝牙驱动,均不再支持A2DP Sink角色。这个问题也就一直延续到了Windows 10,更确切点来说,延续到Windows 10版本1909【2】。

不过就在Windows 10版本2004开始,微软又重新实现和开放了A2DP sink角色。只不过微软官方并没有实现相关界面,需要让开发者编写程序来实现。有鉴于此,一位名为Mark Smirnov‬的开发者编写了“Bluetooth Audio Receiver”程序并在微软商店上架,让Windows 10版本2004和其后的版本开启A2DP sink角色。

因此,要让Win 10变身成“蓝牙音箱”,需要进行如下步骤:

(1)确认你的操作系统是Windows 10版本2004或更高版本。

(2)确保蓝牙设置处已经匹配了手机。

(3)从微软商城安装“Bluetooth Audio Receiver”。如果搜不到,请直接点击下面链接:

https://www.microsoft.com/en-us/p/bluetooth-audio-receiver/9n9wclwdqs5j?activetab=pivot:overviewtab

(4)打开“Bluetooth Audio Receiver”,选择对应的手机,然后按“Open Connection”。

(5)成功后,界面会提示Connected,手机上也有相关提示。现在手机上的音乐或者声音就会通过Windows 10的电脑扬声器来播放了。

===============

参考信息:

【1】AN986: BLUETOOTH® A2DP AND AVRCP PROFILES GETTING STARTED GUIDE,https://www.silabs.com/documents/public/application-notes/AN986.pdf

【2】Enable and Use A2DP Sink for Bluetooth in Windows 10,https://winaero.com/enable-and-use-a2dp-sink-for-bluetooth-in-windows-10/

本页永久链接:https://www.orztip.com/?p=487&article_title=how-to-let-windows-10-act-as-bluetooth-a2dp-sink-to-receive-and-play-mobile-music