Magic Mouse
已经损坏了好长时间了,故障现象就是鼠标无法移动,但是点击,触摸都是有效的。网上搜索了一下,貌似这种故障很多。
大概率是Apple
设计原因导致的故障。原因在于这个芯片跟罗技的鼠标用的同一个型号的,而罗技的鼠标很少发生类似的故障。初步猜测是Apple
设计的时候,地线是跟外壳联通的,导致静电会沿着金属外壳击穿芯片内部管脚。
杂记
Magic Mouse
已经损坏了好长时间了,故障现象就是鼠标无法移动,但是点击,触摸都是有效的。网上搜索了一下,貌似这种故障很多。
大概率是Apple
设计原因导致的故障。原因在于这个芯片跟罗技的鼠标用的同一个型号的,而罗技的鼠标很少发生类似的故障。初步猜测是Apple
设计的时候,地线是跟外壳联通的,导致静电会沿着金属外壳击穿芯片内部管脚。
有个小需求,获取今天是周几,想我大java,获取一个星期几不是手到擒来。
第一想法,System.currentTimeMillis(),这是个时间戳,还得处理秒数,太麻烦。
第二想法,new Date() deprecated? 好吧。
第三想法,Calendar,简单写下代码,开始调试
1 2 3 |
Calendar calendar = Calendar.getInstance(); int weekDay = calendar.get(Calendar.DAY_OF_WEEK) - 1; |
weekDay = 3,wtf?今天是周二,怎么给了我一个3,只听说过从0、1计数,没听说过从2开始计数的啊!
继续查
国际上是以星期日为一周第一天的开始,Calendar中提供的DAY_OF_WEEK获取的一周也是以星期日作为一周的开始。
而中国的习惯是以星期一作为一周的开始,所以需要根据项目的实际需求来设置。
好吧,真是人生处处皆学问,写代码还能学知识。
怎么办呢?Calendar有个api叫setFirstDayOfWeek,原来从哪一天开始是可以设置的,java也是蛮人性化的么~
1 |
calendar.setFirstDayOfWeek(Calendar.MONDAY); |
继续调试
weekDay = 3
这就有点意思了,这个api是用来看的么? 继续查
官方文档一大堆,概括为:
setFirstDayOfWeek的方法意思只对WEEK_OF_MONTH
与WEEK_OF_YEAR
有作用.
WEEK_OF_MONTH
:当前Calendar日期对象是当前月的第几周.
WEEK_OF_YEAR
:当前Calendar 日期对象是当前年的第几周.
好吧,老老实实写下比较丑陋的代码
1 2 3 4 |
int weekDay = calendar.get(Calendar.DAY_OF_WEEK) - 1; if (weekDay == 0) { weekDay = 7; } |
最近收到招商银行香港银行的短信:
1 |
尊敬的客户,您的香港一卡通已超过18个月无主动交易,请于xx年xx月xx日前办理一笔交易以保持账户活动。 |
查询了一下,根据香港的规定,"账户连续两年内没有任何主动交易,则账户自动转为冻结状态,成为“睡眠户”,该类账户不允许进行出款交易。若您需要重新恢复该账户的使用,需要您填妥解除睡眠户表格寄送给香港分行审批,审批通过后,香港分行会主动联系您,核实后可以解除。"
以前总是傻傻的进行一次国内的转账操作,每次都被收高昂的手续费。今天终于想明白了,只要进行交易都算,那么干脆做一笔最小的活期转定期的存款,比如100
块美金的一周定期,就搞定了。
最近(2021/03),上述的办法已经不行了,最近会收到如下信息:
1 |
您的相关一卡通长期未有网银转账,请您于xx月xx日前通过香港专业版完成一笔转出交易,避免限额清零,详情可咨询95555 |
比较简单的方式是找同事要一下账号,同行转出1分钱即可,也可以给慈善机构捐款,还是转账一分钱最简单。
另外,若网银每日限额已经被清零,可能收到如下短信通知:
1 |
您的香港一卡通长期未有网银转账,现香港专业版限额已被清零,您可于一个月内通过香港专业版-其他功能-限额管理复原,详情可咨询95555 |
可以登录香港专业版,可以使用“复原网银限额”复原到最近一次的网银限额;只有一个月内复原,才有效果。
PLMN:
PLMN(Public Land Mobile Network,公共陆地移动网络)
该网路必须与公众交换电话网(PSTN)互连,形成整个地区或国家规模的通信网。
PLMN = MCC + MNC:
中国移动的PLMN为46000,46002,46007
中国联通的PLMN为46001,46006
中国电信的PLMN 46003,46005
PLMN的分类 :
对于一个特定的终端来说,通常需要维护几种不同类型的PLMN列表,每个列表中会有多个PLMN。
RPLMN(Registered PLMN 已登记PLMN):
已登记PLMN。是终端在上次关机或脱网前登记上的PLMN。
在3GPP 2003年第TSG TP-21次会议上决定,将该参数从USIM卡上删掉,而将其保存在终端的内存中。
EPLMN(Equivalent PLMN 等效PLMN):
为与终端当前所选择的PLMN处于同等地位的PLMN,其优先级相同。
EHPLMN(EquivalentHome PLMN等效本地PLMN):
为与终端当前所选择的PLMN处于同等地位的本地PLMN。
其实:EHPLMN和EPLMN就好比是中移动的新建的158网络,
而EPLMN就好比是原来的135~139网络。
HPLMN(Home PLMN 归属PLMN):
为终端用户归属的PLMN。也就是说,终端USIM卡上的IMSI号中包含的MCC和MNC与HPLMN上的MCC和MNC是一致的,
对于某一用户来说,其归属的PLMN只有一个。
VPLMN(Visited PLMN 访问PLMN):
为终端用户访问的PLMN。其PLMN和存在SIM卡中的IMSI的MCC,MNC是不完全相同的。当移动终端丢失覆盖后,一个VPLMN将被选择。
UPLMN(User Controlled PLMN 用户控制PLMN):
是储存在USIM卡上的一个与PLMN选择有关的参数。
OPLMN(Operator Controlled PLMN 运营商控制PLMN):
是储存在USIM 卡上的一个与PLMN选择有关的参数。
FPLMN(Forbidden PLMN禁用PLMN):
为被禁止访问的PLMN,通常终端在尝试接入某个PLMN被拒绝以后,会将其加到本列表中。
APLMN(Approve PLMN 可捕获PLMN):
为终端能在其上找到至少一个小区,并能读出其PLMN标识信息的PLMN。
PLMN的选择优先级:
不同类型的PLMN其优先级别不同,终端在进行PLMN选择时将按照以下顺序依次进行:
RPLMN
EPLMN
HPLMN
EHPLMN
UPLMN
OPLMN
其他的PLMN
From: http://baike.baidu.cn/view/544151.htm
3GPP 23122协议规定的小区重选PLMN选择顺序
At switch on or recovery from lack of coverarge,用户首先尝试选择的是RPLMN(registered PLMN),选择失败后按照如下顺序选择:
1) HPLMN(如果EHPLMN列表不存在或为空)或最高优先级的EHPLMN(如果EHPLMN列表存在);
2) 在SIM卡数据中按照UPLMN优先级顺序选择;(User Controlled PLMN Selector with Access Technology)
3) 在SIM卡数据中按照OPLMN优先级顺序选择;(Operator Controlled PLMN Selector with Access Technology)
4) 随机选择RSCP值大于-84dBm(足够强度信号质量)形成的PLMN接入技术组合;
5) 当信号强度不够时,根据接收信号强度递减排序选择其他所有PLMN。
From: http://blog.sina.com.cn/s/blog_6617106b01013nxi.html
因为有多个PLMN,USIM卡中存储的的EHPLMN List用支持多个HPLMN lists;
对于2G SIM卡中是不存在EHPLMN List存储区域。
手机支持从UICC卡文件系统中读取EHPLMN List,只有在UICC文件系统支持EHPLMN List的情况下。
而EHPLMN List就是决定手机支持的PLMN;对SIM卡没有EHPLMN List,而只有HPLMN即IMSI一个;会将HPLMN作为终端的PLMN.
当SIM卡的PLMN事46002,而手机注册的基站网络PLMN是46000;将会是一种漫游状态;而实际上不是。
鉴于这个问题,手机方案厂商采取一些措施解决:
高通将EHPLMN List可存储在手机内存上;2G卡将从手机内存中读取EHPLMN List,USIM或从卡中读取;
需要设置NV:
NV65602:Location – /nv/item_files/modem/nas/ehplmn
Default value – 0x03 0x64 0xf0 0x00 0x64 0xf0 0x20 0x64 0xf0 0x70 (46000, 46002, 46007)
NV70189:Location – /nv/item_files/modem/nas/ tdscdma_op_plmn_list
Default value – 0x03 0x64 0xf0 0x00 0x64 0xf0 0x20 0x64 0xf0 0x70 (46000, 46002, 46007)
Modem代码中处理与PLMN相关的函数:
reg_sim.c :reg_sim_read_ehplmn_list
最近观察服务器的认证日志,发现有些国外的IP
地址,多次尝试破解服务器的密码进行登录。于是希望能将多次尝试 SSH
登录失败的IP
阻止掉。
查看日志文件:
1 |
$ sudo cat /var/log/auth.log |
看到很多如下的日志:
Failed password for root from 123.15.36.218 port 51252 ssh2
reverse mapping checking getaddrinfo for pc0.zz.ha.cn [218.28.79.228] failed – POSSIBLE BREAK-IN ATTEMPT!
Invalid user akkermans from 218.28.79.228
pam_unix(sshd:auth): check pass; user unknown
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.28.79.228
来统计一下有多少人在暴力破解 root
密码
1 2 3 4 5 6 |
$ sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more 16 212.237.47.236 5 42.120.74.106 4 ; 1 80.211.140.131 |
如果已经禁用了root
登录,则看一下暴力猜用户名的统计信息
1 2 3 4 5 |
$ sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more 129 212.237.47.236 3 ; 1 80.211.140.131 |
某个人尝试了 129
次。为了防范于未然,我们可以做些配置,让服务器更加安全。
下面的三个方法,可以完全使用,也可以部分使用。一般建议使用其中的第一条跟第三条。
SSH
端口,禁止root
登陆修改/etc/ssh/sshd_config
文件
1 2 3 4 5 6 |
$ sudo vim /etc/ssh/sshd_config Port 4484 #一个别人猜不到的端口号 PermitRootLogin no $ sudo service sshd restart |
RSA
私钥登录如果服务器只允许使用私钥登录的,但是如果想在别的电脑上临时SSH
上来,又没带私钥文件的情况下,就很麻烦。所以还是保留密码验证登录。不管怎样,这一条还是先列出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 在客户端生成密钥 $ ssh-keygen -t rsa # 把公钥拷贝至服务器 $ ssh-copy-id -i .ssh/id_rsa.pub server # 也可以手动将.shh/id_rsa.pub拷贝至服务器用户目录的.ssh中,记得修改访问权限 # $ scp .shh/id_rsa.pub server:~/.ssh # 在服务器中 $ cd ./.ssh/ $ mv id_rsa.pub authorized_keys $ chmod 400 authorized_keys $ vim /etc/ssh/sshd_config RSAAuthentication yes #RSA认证 PubkeyAuthentication yes #开启公钥验证 AuthorizedKeysFile .ssh/authorized_keys #验证文件路径 PasswordAuthentication no #禁止密码认证 PermitEmptyPasswords no #禁止空密码 UsePAM no #禁用PAM # 最后保存,重启 $ sudo service sshd restart |
denyhosts
denyhosts
是 Python
语言写的一个程序,它会分析 sshd
的日志文件,当发现重复的失败登录时就会记录 IP
到 /etc/hosts.deny
文件,从而达到自动屏 IP
的功能。现今 denyhosts
在各个发行版软件仓库里都有。
注意在 ubuntu 16.04
系统上,如果通过远程的 SSH
登录到服务器上执行安装命令的话,会由于默认情况下 RESET_ON_SUCCESS = yes #如果一个ip登陆成功后,失败的登陆计数是否重置为0
这部分,默认情况下是关闭的。而如果恰好我们又出现自己输入的错误密码错误累计次数超过 5
次的情况(即使后面有成功登录的记录也不行),会导致我们自己当前登录的地址也被阻止的情况。这种情况发生之后,会导致我们自己无法控制服务器(这个阻塞是在 iptables
层阻塞的,如果要恢复,在 iptables
中删除已经添加的记录才可以)。解决办法就是换一个新的 IP
地址登录服务器,然后修改 RESET_ON_SUCCESS
这个参数,并重启 denyhosts
服务。如果是阿里云或者腾讯云的服务器,可以尝试从他们网站上提供的网页版本的 Shell
进行操作。
对于 ubuntu 16.04
系统,建议使用如下方式进行安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#创建执行脚本 $ touch ~/install.sh #创建执行安装命令,整个过程不中断连续执行,如果不使用脚本,执行到这里,可能SSH就已经被阻断了 #安装完成后,denyhosts的服务就已经开始运行了,此时可能已经设置了iptables了 $ echo "sudo apt-get install denyhosts" >> ~/install.sh #创建修改配置文件的命令 $ echo "sudo sed -i 's/^#RESET_ON_SUCCESS/RESET_ON_SUCCESS/g' /etc/denyhosts.conf" >> ~/install.sh #创建重启服务的命令 $ echo "sudo service denyhosts restart" >> ~/install.sh #执行我们刚刚的安装脚本 $ sudo bash ~/install.sh |
默认配置就能很好的工作,如要个性化设置可以修改 /etc/denyhosts.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ sudo vim /etc/denyhosts.conf SECURE_LOG = /var/log/auth.log #ssh 日志文件,它是根据这个文件来判断的。 HOSTS_DENY = /etc/hosts.deny #控制用户登陆的文件 PURGE_DENY = #过多久后清除已经禁止的,空表示永远不解禁 BLOCK_SERVICE = sshd #禁止的服务名,如还要添加其他服务,只需添加逗号跟上相应的服务即可 DENY_THRESHOLD_INVALID = 5 #允许无效用户失败的次数 DENY_THRESHOLD_VALID = 10 #允许普通用户登陆失败的次数 DENY_THRESHOLD_ROOT = 1 #允许root登陆失败的次数 DENY_THRESHOLD_RESTRICTED = 1 WORK_DIR = /var/lib/denyhosts #运行目录 SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES HOSTNAME_LOOKUP=YES #是否进行域名反解析 LOCK_FILE = /var/run/denyhosts.pid #程序的进程ID ADMIN_EMAIL = root@localhost #管理员邮件地址,它会给管理员发邮件 SMTP_HOST = localhost SMTP_PORT = 25 SMTP_FROM = DenyHosts <nobody@localhost> SMTP_SUBJECT = DenyHosts Report AGE_RESET_VALID=5d #用户的登录失败计数会在多久以后重置为0,(h表示小时,d表示天,m表示月,w表示周,y表示年) AGE_RESET_ROOT=25d AGE_RESET_RESTRICTED=25d AGE_RESET_INVALID=10d RESET_ON_SUCCESS = yes #如果一个ip登陆成功后,失败的登陆计数是否重置为0 DAEMON_LOG = /var/log/denyhosts #自己的日志文件 DAEMON_SLEEP = 30s #当以后台方式运行时,每读一次日志文件的时间间隔。 DAEMON_PURGE = 1h #当以后台方式运行时,清除机制在 HOSTS_DENY 中终止旧条目的时间间隔,这个会影响PURGE_DENY的间隔。 |
查看 /etc/hosts.deny
发现里面已经有 3
条记录。
1 2 |
$ sudo cat /etc/hosts.deny | wc -l 3 |
目前 ubuntu 16.04
系统源里的 denyhosts
存在一个 BUG
,就是系统重启之后,iptables
中的拦截设置没有恢复。具体的讨论以及描述,参考Iptables not persistent,代码应该已经增加了,目前还没合并到主分支。
对于 ubuntu 20.04
系统,默认源已经不包含 denyhosts
,需要使用 Fail2ban
替代。参考 How to Install and Configure Fail2ban on Ubuntu 20.04
最近在ThinkPad-T440
上安装最新的Ubuntu 17.04
的时候,系统提示如下信息:
1 |
Oct 21 00:29:34 ThinkPad-T440 kernel: [ 0.000000] [Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0x20 (or later) |
通过提示,可以看到是系统的CPU
微码部分没有更新到最新,导致系统在执行部分功能的时候发生了异常,升级BIOS
可以解决这个问题。
在联想官网上下载最新的BIOS
光盘镜像(假定镜像名为BIOSCD.iso
)之后,发现无法直接通过U
盘启动系统。原因是光盘的镜像格式不符合U
盘启动需要的格式,需要进行转换之后才可以正常启动系统。
可以通过如下的方式,转换下载到的镜像文件之后,刷新BIOS
。
1 2 3 4 5 6 7 8 |
$ sudo apt-get install genisoimage $ geteltorito -o bios.img BIOSCD.iso #找出U盘挂载的位置,假定是/dev/sdb $ df $ sudo dd if=bios.img of=/dev/sdb |
之后,重启系统即可。
家里用的CVR100W
路由是几年前买的,当时升级过一次固件,版本到1.0.1.19
,但是最近几个月发现出现了无线不稳定的情况,有线访问打开路由器主页也变得比较慢,重启无效。因此怀疑是路由器系统在长时间运行后,这个版本的固件是存在问题的。
去思科官网搜索一下最新固件,竟然看到了1.0.1.24
版本的固件,于是下载下来CVR100W_FW_1.0.1.24,各位也可以去思科官网去搜索下载。
目前测试来看,这个版本的固件应该是更稳定,速度也有所提升。
继续阅读CVR100W升级到最新固件1.0.1.24
使用录屏功能,轻松给家中长辈制作手机视频使用教程,或录制打游戏过程中的精彩片段。
最近淘宝了一个PSV
版本的神秘海域,卖家说是繁体跟英文双语言的,结果插卡后一直是英文,始终找不到中文语言的选项。
网上搜索了以下,才发现是跟机器语言绑定的,如果要使用繁体中文版本,必须把机器的语言从简体中文调整到繁体中文才行。
也就是,在PSV
设置里将系统语言设置为繁体中文,再进入游戏里就可以了。
前言
日常的开发工作中,为代码添加注释是代码可维护性的一个重要方面,但是仅仅提供注释是不够的,特别是当系统功能越来越复杂,涉及到的模块越来越多的时候,仅仅靠代码就很难从宏观的层次去理解。因此我们需要图例的支持,图例不仅仅包含功能之间的交互,也可以包含复杂的数据结构的示意图,数据流向等。
但是,常用的UML建模工具,如Visio等都略显复杂,且体积庞大。对于开发人员,特别是后台开发人员来说,命令行,脚本才是最友好的,而图形界面会很大程度的限制开发效率。相对于鼠标,键盘才是开发人员最好的朋友。
graphviz简介
本文介绍一个高效而简洁的绘图工具graphviz。graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言): dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局。graphviz提供丰富的导出格式,如常用的图片格式,SVG,PDF格式等。