Categories
生活琐碎

日淘ThinkPad X1 carbon 2017到手,写个下单转运收货流水账

2017.10 很不幸的事情发生了。去德国旅游的过程中,此电脑于柏林火车站附近在租的车子内被盗,怀疑是借助工具将车干扰解锁了——从此对柏林毫无好感,因为接警的警察都毫无诚意。Unfortunately this computer was stolen in Berlin, Germany during a trip. The local police seemed quite accustomed to this kind of case report and asked me to wait two hours in the night to create a case. It SUCKS!

 
笔记本终于到手了,来发下经历。

付款:
淘宝上找日本代购代付款的,他们好像是用银行转账的模式(并不是信用卡在线支付)。因此其实是我在日本官网定制->提供转账代码给代购->代购帮忙付款->发到我的转运仓库这一模式。需要注意的是,我找的代付其实并不比专门thinkpad代购的商家便宜,估计多了个运费钱的样子,不过因为好奇所以还是这么做了。
生产:
世界上最遥远的距离就是,电脑在中国生产,然后发到日本,然后又发回中国。
下单日期是2月28日,生产完毕到了3月6日左右,然后发到日本。日本进口是用NEC 日通的清关,清关完毕后日本国内走的宅急送派送,宅急送派件是第二天就到了转运仓库。由于留的自己的邮箱地址,在收到付款、准备生产、生产结束、转国内发货这些关键节点都能收到邮件,而且有官网可以实时查信息。
但是这里留下了一个大教训:走转运的亲,如果转运的客户识别号比较长的话,可能在联想订单的运单上就会被截断(鄙人血淋淋的教训)!因此建议选用XX四方这样把识别号体现在收件人姓名上的转运公司,我用JPDeliver的话客户代码有8位而且只有地址上有,今天拿到快递一看,被截断到了只有一位。
转运:
由于周末入库+客户代码被截断的问题,周一找客服翻仓库1小时才得以入库。也幸好是找到了,不然就坑了。
转运走的EMS,主要是能保价。整箱重3250g左右,联想的包装已经很好了,我没有选择任何额外加固。
由于有个同事走的必税天堂杭州入关,被税了15%(申报价值4K多,收了650+),果断找帝都朋友代收。3月14日日本寄出(申报价值7W 日元哈哈),17日无税到手(据说帝都不是0就是300,没有见过15%的)。以后万一出毛病了就找同事的税单吧哈哈
(技巧:EMS官网状态更新很慢,建议去http://www.fjxmems.com/查,还能看到些许内网信息,而且免费,不必淘宝上花钱查的差!)
然后17日顺丰陆运发到杭州,今天下午拿到。
基本体验:
配置: i7-7500U, 16G, 256G nvme,英文键盘
跟我的XPS13差不多轻,但是屏幕变大了而且窄边框,感觉很开心。屏幕分辨率的问题,目前用100%字少许有点小,125%小部分软件的字有点糊,据说win10即将到来的更新都强制GDI渲染了,可能可以根治…另外,新款用了USB-C的电源口,我看电源适配器上写着这么些参数,感觉都能用大一点的移动电源给电脑充电了(还是我火星了)?
(输出:20V 2.25A / 15V 3A / 9V 2A / 5V2A)
出风口在右边,不过目前没有感觉到有风,Intel虽是牙膏厂,但是还是厉害。
但是,触摸的体验(我不确定是硬件还是软件)虽有改进但还是不及macbook pro。

Categories
不学无术

C++11 继承构造函数、委派构造函数

C++11标准中引入了两种构造函数的活用方法,可以适当地减轻一些情景下的码字负担。

1.继承构造函数

以往情况下,在派生类中调用基类的构造函数,一般需要在派生类中显式调用:

struct A
{
    A(int i) {}
};
struct B
{
    B(int i) : A(i) {}
};

当构造函数的花式(签名)很多的时候,继承类写起来就比较辛苦了。
在C++11标准中,可以通过using声明来简化这种操作(using声明在以前的标准中已经可以用在非构造函数里)

struct A
{
    A(int i) {}
    A(double d, int i) {}
    A(float f, double d, int i) {}
    //...
};
struct B
{
    using A::A;    //继承构造函数
    //...
};

需要注意的是,采用这种using声明有两个规矩:

  • 如果基类的构造函数是private或是派生类是从基类中虚继承的,不能用这种方法;
  • 一旦用了继承构造函数,编译器就不会为派生类生成默认构造函数(Visual Studio报error C2280),除非基类自己没有定义任何构造函数而触发了默认构造函数生成;

2.委派构造函数

委派构造函数常用在减少初始化过程的代码冗余问题,比如下面这个经典例子(我就这么干过):

class Info
{
public:
    Info() { InitRest(); }
    Info(int i) : type(i) { InitRest(); }
    Info(char c) : name(c) { InitRest();}
private:
    void InitRest ()
    {
        // 初始化其他东西
    }
    int type {1};
    char name {'a'};
    //...
};

使用一般方法,我们无法在自己构造函数里又调用自己的构造函数(突然想起了python的import this,哈哈),纵使函数签名不同也会报编译错误。
C++11中,可以这么写:

class Info
{
public:
    Info() { InitRest(); }
    Info(int i) : Info() { type = i; }
    Info(char c) : Info() { name = c; }
private:
    void InitRest ()
    {
        // 初始化其他东西
    }
    int type {1};
    char name {'a'};
    //...
};

但是要注意,委派构造函数不能和初始化列表并用,不然依旧编译错误。
比如我们不能搞Info(int i) : Info(), type(i) { } 。
不过有解决办法,比如可以声明一个私有的构造函数,它包括“完整”的参数输入,然后公有的其他构造函数调用它:

class Info
{
public:
    Info() : Info(1, 'a') { } // 或采用链状委派: Info(1) 或 Info('a')
    Info(int i) : Info(i, 'a') { }
    Info(char c) : Info(1, c) { }
private:
    Info(int i, char e) : type(i), name(c) { }
    int type {1};
    char name {'a'};
    //...
};

关于函数执行顺序,目标函数执行总是先于委派构造函数的。

参考文献

《深入理解C++11 (C++11新特性解析与应用)》

Categories
未分类

人生哲理

除非你能忽视周遭环境,做你承诺过要做的事,否则你就会永远受到这个世界的控制。
——《肠子》恰克·帕拉尼克

Categories
生活琐碎

WoSign/StartCom的HTTPS证书风波

之前网站使用的StartCom发的SSL证书,结果今天登陆发现提示“不安全的网站”,一时费解去查了一下。原来这两家(一家)公司违反了证书签发规定,已经被好几个浏览器给墙了(详见https://linux.cn/article-7922-1.html)…
还好现在免费SSL证书比较多,换了家腾讯云旗下的TrustAsia之类的,终于又恢复了正常。

Categories
生活琐碎

Protected: 2016年年终总结

This content is password-protected. To view it, please enter the password below.

Categories
不学无术

C++模板元编程 习题: add_const_ref

要学的东西还有很多啊…
习题2-0. 编写一个一元元函数add_const_ref<T>,如果T是一个引用类型,就返回T,否则返回T const&.

#include "add_const_ref.h"
int main()
{
	int a = 5;
	add_const_ref<int>::type c = a;
	add_const_ref<int&>::type d = a;
	return 0;
}

 

#ifndef ADD_CONST_REF
#define ADD_CONST_REF
template <class T>
struct add_const_ref;
template<class T>
struct add_const_ref
{
	typedef T const& type;
};
template<class T>
struct add_const_ref<T&>
{
	typedef T type;
};
#endif

 

Categories
生活琐碎

终于写完毕业论文了!

其实是终于交了送外审了,从11月到现在,感觉过了几个世纪。
不过一想研究生阶段也快结束了,有种莫名的不舍…

Categories
软件

App推荐——TaoMix2 干活、睡觉专用辅助声音

之前MUJI Sleep给我的印象很深,也是用来辅助睡眠的。今天发现一个进阶版的,这个App也是用来播放一些自然声响的,但它的特点是可以混音:里面有个白色的点,播放的时候会在几种音源之间游走。比如,可以在水声、鸟叫声、树叶声中间各种游动,应该是掺杂比例的不同。
 
不知为何,想起了高斯混合模型…
 
Android: https://play.google.com/store/apps/details?id=air.com.demute.TaoMix&hl=zh_CN
iOS: (TaoMix与TaoMix2)
https://itunes.apple.com/cn/app/taomix-create-your-own-relaxing/id660104097?mt=8
https://itunes.apple.com/cn/app/taomix-2-yong-zi-ran-sheng/id1032493819?mt=8

Categories
木有技术

Windows 下使用MinGW编译Cython

用Visual C++编译器也是可以的(找不到vcvarsall.bat可以看这篇),不过为了后面移植方便,目前的项目还是用MinGW.
步骤其实很简单,参考http://cython.readthedocs.io/en/latest/src/tutorial/appendix.html。
稍微翻译一下就是:

  1. 从这里http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite 下载个MinGW Installer. 下载、安装的时候记住是32位版本的,因为64位版仍旧有些不兼容现象。
  2. 运行安装下载的程序。Cython只需要最基本的包(basic package)就行了,主要是为了里面的C++编译器
  3. 将你安装MinGW的目录设置到PATH环境变量中。默认位置应该是C:\MinGW\bin
  4. 在Python安装目录下创建配置文件。如果Python是安装在C:\Python27目录下,那就创建C:\Python27\Lib\distutils\distutils.cfg,然后文件内容为
    [build]
    compiler = mingw32

     

这样就可以使用GCC编译啦~
 

Categories
不学无术

翻译:次梯度以及一阶最优性条件(Subgradient and First-order Optimality Condition)

本文是对文章Basics of Convex Analysis的部分翻译,若本文对您的任何权益造成侵犯,请联系我。
This article is a partial translation of Basics of Convex Analysis, if this infringes any of your rights, please contact me.


次梯度以及一阶最优性条件

若下述不等式成立:
[latex]f(z) \geqslant{f(x)} + <z-x, y>, \forall z \in X.[/latex]
则我们说[latex]y\in X[/latex]是函数[latex]f \in \Gamma _0(X)[/latex]在[latex]x \in X[/latex]点上的一个次梯度,并且属于[latex]f[/latex]在该点(用[latex]\partial f(x)[/latex]表示)的一个次微分。
上述不等式表明函数[latex]f[/latex]的图像(graph)是由不等式右侧定义的超平面所(hyperplane)支撑的。一个次梯度因此也是这众多支持超平面其中一个的“斜率(slope)”。如果该函数在点[latex]x[/latex]处可微,则这样的次梯度有且仅有一个(即标准梯度),与此对应地,也只有一个支持超平面。相对地,如果一个函数在点[latex]x[/latex]处不可谓(比如,在[latex]x[/latex]处有个扭曲)那么就能有无穷多个支持超平面,并且相对应地,在该点的次微分是一个连续的次梯度的集合。
一个典型的例子是绝对值函数[latex]f(x)=|x|[/latex],它在0点是不可导的。但在这个点上,它可以由[latex]l(x)=\alpha x, \alpha \in [-1,1][/latex]组成的所有直线支持。这个集合即该函数在0点的次微分,用[latex]\partial f(0)[/latex]表示。

函数[latex]f(x)=|x|[/latex]的演示(粗线表示)以及其中两个支持直线(虚线表示)。这两条支持直线都有次微分[latex]\partial f(0)[/latex]中的斜率。注意,那条水平线也是支持超平面之一,表明[latex]0 \in \partial f(0)[/latex]。并且因此由一阶条件(下文定义),这个函数在原点有一个极小值。
现在,通过定义非限制问题中的一个最优点[latex]x^{\#}[/latex],必有[latex]f(z) \geqslant{f(x^{\#}) + <z-x, 0>}, \forall z \in x [/latex],并且因此0必须是函数[latex]f[/latex]在[latex]x^{\#}[/latex]点处的一个子梯度。
这就是一阶最优性条件(FOC):
[latex]x^{\#} \in arg min_{x}{f(x)} \Longleftrightarrow 0 \in \partial f(x^{\#})[/latex]
如果我们将次微分看做一个运算符那么,直观地,寻找极小可以看做“逆转”次微分并计算它在点0的值的过程,即[latex]x^{\#}=(\partial f)^{-1} (0)[/latex]。我们稍后再进一步介绍,但这个逆转次微分运算符的思路是非常重要的。
在继续之前,有必要提一下(并且这并不难理解)下述包含关系对于次微分的和是成立的:
[latex]\sum_{i}{\partial f_i} \subseteq \partial \sum_{i}{f_i} [/latex]
对关注的大部分问题而言,上述关系可以强化为相等的关系, 但注意如果[latex]0 \in \sum_{i}{\partial f_i (x^\dagger)}[/latex],则上述包含关系意味着[latex]0 \in \partial \sum_{i}{f_i (x^\dagger)}[/latex],这对于证明[latex]x^\dagger[/latex]是个极小值而言(这正是我们最感兴趣之处)足矣。