随着移动互联网的迅猛发展,对手机流量的需求越来越强。联通近两年推出了各种互联网套餐,吞噬了大批的用户。我作为一个资深移动老用户也办了张「大王卡」。 在联通刚推出3G业务,而移动由于自身原因只能使用2G的时期我都忍住没有迁移至联通,但现在我几乎要离开移动了。日常使用全部大王卡,移动只有接收银行等重要信息、验证码等功能。姑且还称移动为主卡,联通为副卡吧。

如果手机不支持双卡双待,多卡带来的问题就是得多备一个手机,多花钱不说还得天天带着。对于我这种 iPhone党简直是噩梦,势必要解决它

需要解决的有俩部分

1.电话:主卡电话呼叫转移到副卡

2.短信: 希望把主卡短信全部转发到副卡上

呼叫转移

目前大部分智能手机已系统支持呼叫转移,注意的是,这部分是需要另付资费哦例如A/B俩卡都是免费接听,但如果 A 转接到 B 需要收取 A 的呼叫费用

使用 IFTTT 解决短信转发

要解决短信的转移前提是能获取到本机短信的权限,iOS 因为隐私保护暂时做不到,所以需要一台Android 手机供主卡使用,如果是小米还需要在安全中心里给 IFTTT 开启读取服务类短信,不然无法收到银行验证码等。

建议使用 Google Play 版本的 IFTTT(需翻墙)

下面表格列出邮件、Telegram、微信三种方案各自优缺点。个人推荐使用微信,毕竟每天都使用,更加习惯。

转发方案 优点 缺点
邮件 配置简单,稳定 响应稍慢
Telegram 安全,及时 俩个手机都需要翻墙
微信 习惯,及时 需要第三方推送服务

具体配置方法都很简单,就不详述了。推送到微信要配置成 Webhooks 的方式,推荐 Server酱 服务,绑定下微信就可以收到推送啦。

其他

其实还有个更简单的方案,就是使用 IFTTT 自身APP。俩部手机都下载 IFTTT 并用同一个账号登录,打开 Applets 的推送即可~

Lombok的主旨是提高开发效率,消除冗长的 JAVA 代码,尤其是 POJO 类型。在开发初期 POJO 经常修改,随之涉及到改动 getter/setter/toString 等一系列方法。虽然现在 IDE 都能自动生成对应代码,但还是需要手动删除重新生成。

它的原理是在编译期操作 AST(抽象语法树) 去改变字节码,根据注解生成对应的代码。因为在静态编译期做的,相对可控,使用也简单。

Google 开源的 AutoValue 也是用来解决这个问题,功能很全面,还可以定制化。但有一些的问题

  1. 代码侵入重,所有定义的对象是抽象类,使用都是封装后的 AutoValue_XXX
  2. 生成的 POJO 都是 immutable 的,需要频繁操作的类会很麻烦。
在使用 Lombok 期间遇到一个坑

当你的 POJO 中出现单字母驼峰名称时,例如:iType,Lombok生成出来的 getter/setter 方法

1
2
3
4
5
6
7
private String iType;
public String getIType() {
return iType;
}
public void setIType(String iType) {
this.iType = iType;
}

乍一看没啥问题,但是影响很严重,首先 Spring 是不认此方法的,其次也影响到 Jackson 的解析,直接导致无法使用

一般来说,代码规范和 API 规范有所区别,参考之前的文章「浅谈 Api 设计」。从后端输出 Api 时会做一些转换,例如驼峰转小写+下划线格式,这个 Jackson 有对应支持

1
2
3
4
5
6
Jackson2ObjectMapperBuilder.propertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)
//Jackson 也是通过 get 方法来获取属性
//我们的预期是
iType -> i_type
//而结果是
IType -> itype

开始我觉得这是 Lombok 的 bug,随后我下载了 Lombok 的源码来验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//HandlerUtil 类统一处理方法名
//可以看到规则是如果首字母小写,长度大于2并且第二个字母是大写或者是 titlecase 的话,则把首字母变大写。
/**
* @param prefix Something like {@code get} or {@code set} or {@code is}.
* @param suffix Something like {@code running}.
* @return prefix + smartly title-cased suffix. For example, {@code setRunning}.
*/
public static String buildAccessorName(String prefix, String suffix) {
if (suffix.length() == 0) return prefix;
if (prefix.length() == 0) return suffix;
char first = suffix.charAt(0);
if (Character.isLowerCase(first)) {
boolean useUpperCase = suffix.length() > 2 &&
(Character.isTitleCase(suffix.charAt(1)) || Character.isUpperCase(suffix.charAt(1)));
suffix = String.format("%s%s",
useUpperCase ? Character.toUpperCase(first) : Character.toTitleCase(first),
suffix.subSequence(1, suffix.length()));
}
return String.format("%s%s", prefix, suffix);
}

显然这是特意而为之,随后我上官方 issue 中看了下,在15年已经有人提出了这个问题,而官方的答复是 Java Bean 的规范就是如此,且不应该使用首字母小写第二个字符大写的命名规则,Spring 的处理方式是自己发明的,我们不能跟着 Spring 乱搞,如果 Oracle 官方推荐如此或者所有人都是这么处理的话我们才改~

虽然我没有仔细的看过 Bean 规范,但如果 Spring 这么大厂都不支持的话会很难推广,在我刚和同事推荐的时候大家都非常激动,一听有这么个坑几乎都放弃了,也许是 xXxx 这种命名非常常见吧,比如 iPhone……

不光 Spring,Jackson,编译器( IDEA)自动生成的也是如此,只能说 Lombok 性格真是倔。既然如此只好自己修改下源码了…

1
2
3
4
5
//好在改动也非常小, 规则改为:长度大于2,并且第二个字母是大写则不转换大写
boolean useUpperCase = suffix.length() > 2 && Character.isUpperCase(suffix.charAt(1));
suffix = String.format("%s%s", useUpperCase ? first : Character.toTitleCase(first),
suffix.subSequence(1, suffix.length()));

PS:据官方说从 JAVA 讨论组数据统计,半数多人支持 getxXxx() 的做法。但他们大多数人的选择未必是正确的做法~

啊呸…

北海道雪场非常多,二世谷、留寿都、札幌国际等诸多著名雪场,前年公司年会去的时候傻逼的被导游带去玩雪橇错过了留寿都的体验,据同事反馈也是相当的好。后面去了札幌国际玩了一天,体验也还不错。今年首次自带装备去滑雪,前期做了不少功课。

自带板的一些注意事项
  • 装备托运:滑雪板属于超规行李,需要特殊办理托运。事先了解航空公司对运动类大件物件的处理方式,国内航空一般把重量算在了普通行李中,部分国际航空公司有免费的政策
  • 酒店位置,背板的后果就是无法乘坐计程车, 所以酒店位置非常重要,距车站越近越好,当然价格会高一些。
  • 酒店往返雪场巴士时刻表

这次雪场的选择在 Kiroro二世谷中犹豫,由于没有订上雪场内的酒店,只能选择住在较近的小樽,这里去 Kiroro 大巴约50分钟。去二世谷要坐 JR 一个多小时。最终选择了较近的 Kiroro

这里必须要推荐下我选择的这家酒店,Dormy Inn Premium Otaru(小樽豪华多米酒店),就在 JR 小樽站对面,下车步行约1min。旁边是大巴站,隔壁是小樽最大的商场。 店内提供洗衣房及公共温泉,重点晚上还有免费拉面吃,哈哈。(偶然发现在札幌狸小路旁边也有一家)

KIRORO滑雪 (8 - 16点)

​ Kiroro雪场巴士有两种,一种免费的巴士到小樽驻港站,一种收费到达JR小樽站,都需要预约,因为座位有限,但基本坐不满。有一天我们只约到一个人,经过沟通也让我们上车了。小樽大巴早上八点十分出发,每日一班,不要迟到,不会等人。

Kiroro

​ 正逢圣诞节,雪场也搞了一些活动。在日本没有滑雪票的概念, 只有Lift price(缆车费) 和Rental price(租赁费用)。自带装备的话只需购买缆车费,根据年龄和时长价格不一,这次我们买的是3天联票(含夜场),折合人民币850左右,是不是比国内还便宜?

会发一张实名卡乘缆车用,印有你的个人信息,遇到问题能迅速找到你的资料,理论上只限本人使用。

Kiroro 雪场由两座山头组成,最长的雪道(Asari Dynamic) 4km 左右,覆盖初中高级雪道,也是人最多的雪道,缺点就是中午后雪就不粉了。我更爱的是最右侧的 Asari Course ,人烟稀少,大粉雪。

Asari 山顶雪季非常的美,像这样。

也可以这样

第一天下午四点左右暴风雪就开始来了,山顶雪雾大到戴着雪镜只能看到一片白茫茫,当时在高级道的我吓的不太敢滑,害怕冲到树林里的深雪堆里爬不出来。加上只穿了一件保暖内衣和软壳,感觉异常的冷~ 下山就收包返程了

Asari Course

吃饭逛街(18-21点)

​ 在小樽基本没有夜生活。六点多我们去觅食已经很多店关门了,有些出名的店还要预定,真是难死我们了~ 饭后就开启了买买买节奏

温泉&拉面(21-23点)

​ 运动一天后泡个温泉简直不能再爽,泡饿了再干它两碗免费拉面(拉面23点截止,千万别泡过头了)温泉图片就不放了….

​ 提示:女汤需要凭密码进入哦,密码每天都更换,记得找前台要。

最后遗憾

恰好那几天北海道遭遇大暴雪,缺点就是天气不好,也比较冷,好处是雪真是松软到不行,雪场下午都放弃压雪了,雪道内和野雪一样棉花糖似得脚感,趁最后一天天气晴朗拍了个视频,可惜已经没有棉花糖的雪了~

PS:在北海道遇到了几个热心的台湾人,解决了一些沟通问题,买 JR 函馆站的一位台湾姐姐带我们到售票厅中买到了更实惠的往返联程票,在雪场丢失了一台 wifi 设备也是一位台湾 MM 帮我们做了相关的登记(虽然最终也没有找回来)