分享我的投资故事。
首发于 Forest的博客.

初出茅庐

小时候,没啥理财习惯和资本。一是没零花钱,二是压岁钱基本需要上交。有一年,大概是为了培养我的理财意识,爸爸带我去建设银行开了户,几百块钱的压岁钱给我补齐到一千,存进了存折。定期一年,自动复利。

本身是很好的开端。大概是我家对钱的追求不那么在意,这笔钱竟然忘记了。我之前设置的密码也说是不对。后来长大了竟然取不出来了。
而且一开始是通过户口本办的。当年小孩子都没身份证,不像现在。
后来去建设银行说了这个事情后,工作人员说必须开户整周年的当天才能取出来。也是醉了。
后来我过上了北漂生活,半年才能回一次家。赶不上时间,也怕麻烦,这笔钱竟然就一直在那里。

这次理财经历算是一次失败的教训,毕竟本金都取不出来了。

再试牛刀

上大学后,终于有独立花钱和管钱的权限了。一开始,只是父亲给的生活费和学费;再到后来有了不菲的奖学金和助教工作收入,基本实现了经济独立。因为花费和收入都较少,也没有专门打理;学成一定之后,有了实习工作,开始每天三百,之后每天四百,竟然有了几万的积蓄。这时候,我看到自己挣得钱,第一反应是存起来,就有了理财的再试牛刀。

当时余额宝和朝朝盈的收益还不错,绝大多数钱都放在里面,也不用操心。后来了解到基金这么个玩意儿。虽然之前父亲买过基金,还赔了钱。不过好在他一直没取出来,之后也一直没看,也不能叫赔。现在说不定还赚了不少也是有可能的。我想当然认为自己也可以。而且当时已经到了2018年,在支付宝上买卖基金十分方便。我梭哈了支付宝给我推荐的一只鸡:嘉实环保低碳股票。支付宝说该基金过往收益多牛,我也觉得环保是未来的方向,就买了6千块钱的。

先说结论,又一次失败的理财投资。也是第一次当韭菜,感觉到资本市场的寒冷。最后清仓时赔了1600元,持有时间半年。
总结几点教训:

  • 相信支付宝的推荐,没有自己的思考。要知道,APP或其他经理推荐给你的不一定是能让你挣钱的,但一定是可以让它们挣钱的。所以不要听信其一面之词,而是要有自己的思考和理解。大多数时候,APP的推荐都是不靠谱的。
  • 持有时间过短。当是持有了半年,割肉离场,后来2年多时间没大规模碰基金。我以为已经是坚持挺长时间的了。后来发现基金持有基本上是要以年为单位的。基金持有大于3年也绝不是空穴来风。后来发现该基金确实后来有涨了上去,而且涨的不少。不过这些都是在我清仓后面几年的事情了。
  • 一开始就碰股票基金,而且是比较激进的行业型基金。涨的快回撤也大,一般人确实遭不住。环保确实是未来的方向,但这个未来可能以年甚至十年来计,绝不是我能hold住的。新手一开始应该购买货币基金(也就是余额宝之类的),然后是债卷基金,最后是股票型的指数基金。行业基金能不碰就不碰,如果碰了,你一定要对该行业有独特的信仰,支撑你坚持下去。
阅读全文 »

ID score rank K-Goodness String L Shaped Plots Rabbit House Checksum Penalty Time
YoungForest 56 1295 5 + 7 8 + 12 9 + 15 0 1:40:55

久违的参加了KickStart比赛。之前2年还因为想去Google的原因一直坚持打,不过人算不如天算,因为疫情原因实习和秋招都直接凉了。2年多参加了10+场比赛也“白”打了。
今年参加真的是全凭兴趣。结果排名果然1000+。之前基本都是几百。
不得说,从去年开始,KickStart简单也友好了很多。之前经常只能做出来1道半题。后来为了增加参赛范围,3题变四题,整体难度也降下来了。

阅读全文 »

耽误了比赛,赛后补题。

1796. Second Largest Digit in a String

签到题。统计所有的数字,再从大到小找第二大的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int secondHighest(string s) {
vector<int> cnt(10, 0);
for (char c : s) {
if(isdigit(c)) {
++cnt[c - '0'];
}
}
int maxNumber = -1;
for (int i = 9; i >= 0; --i) {
if (cnt[i] > 0) {
if (maxNumber == -1) {
maxNumber = i;
} else {
return i;
}
}
}
return -1;
}
};

时间复杂度: O(N),
空间复杂度: O(1).

1797. Design Authentication Manager

用字典存储每一个tokenIdexpired time.

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
29
30
31
32
33
34
35
36
37
class AuthenticationManager {
int timeToLive;
unordered_map<string, int> expiredTime;
public:
AuthenticationManager(int _timeToLive) : timeToLive(_timeToLive) {

}

void generate(string tokenId, int currentTime) {
expiredTime[tokenId] = currentTime + timeToLive;
}

void renew(string tokenId, int currentTime) {
auto it = expiredTime.find(tokenId);
if (it != expiredTime.end() && it->second > currentTime) {
generate(tokenId, currentTime);
}
}

int countUnexpiredTokens(int currentTime) {
int ans = 0;
for (const auto& p : expiredTime) {
if (p.second > currentTime) {
++ans;
}
}
return ans;
}
};

/**
* Your AuthenticationManager object will be instantiated and called as such:
* AuthenticationManager* obj = new AuthenticationManager(timeToLive);
* obj->generate(tokenId,currentTime);
* obj->renew(tokenId,currentTime);
* int param_3 = obj->countUnexpiredTokens(currentTime);
*/

时间复杂度:

  • generate: O(1),
  • renew: O(1),
  • countUnexpiredTokens: O(expiredTime.size())
    空间复杂度:
  • O(expiredTime.size())
阅读全文 »

由于科研需求,我需要连接杭州研究院的VPN,才能使用显卡做神经网络的训练任务。
然而在Ubunut 18.04配置好OpenVPN后,发现一个难题:连上VPN后无法上外网(百度等网站,不是墙外的网站,而是相对局域网内网的“外网”),断开VPN后可以连外网,但无法连接杭研院的资源。鉴于工作中,外网和杭研院内网基本缺一不可,我花了2天时间调研和修复改问题。而且其他同学使用VPN并没有类似问题,所以我认为是Ubuntu独特的问题。修复的操作很简单,但定位到问题的过程十分坎坷。

现象整理

连接VPN后,可以ping通baidu的IP,但浏览器无法连接baidu,也无法直接ping通baidu.com。浏览器只能打开杭研院和北航内部的网站。
初步判断是网络上DNS服务器的问题,但调研之后发现DNS的配置并无问题。
猜测是访问外部资源时,理应的DNS解析并没有办法完成。

最后在网上查了半天,才发现真正的问题(VPN本地配置问题)和解决方案。

解决方案

网上最类似的一个问题和解决方案

由于我是Ubuntu 18.04, 并不大一样。
在我这里给出我的完整解决方案,以供大家参考。

打开VPN的配置。

Step 1

Step 2

阅读全文 »

Rank Name Score Finish Time Q1 (3) Q2 (4) Q3 (5) Q4 (7)
807 / 12541 YoungForest 17 1:06:39 0:03:24 0:06:02 0:38:44 1:01:39 1

昨天出去修Mac,因为屏幕一直闪。果然卖Apple的产品Apple Care是必须的。上次修了键盘,这次修屏幕,4个面都换新的了。在外面跑了一天,特别累。今早起来晚,一起来就开始比赛了,一口水一口饭都没吃。
继连续2周3题后,终于4题了。一开始我还挺得意,觉得这周应该不用打卡了。后来发现小丑竟然是我自己。其他选手竟然认为本场是手速场。我T3 T4想复杂了,速度慢了些,没进前500. 残酷名次也从10+退到了40+。下周rating要掉了。没想到3题涨分,4题掉分。

阅读全文 »

Rank Name Score Finish Time Q1 (3) Q2 (4) Q3 (5) Q4 (6)
64 / 9933 YoungForest 18 0:55:55 0:03:37 0:07:16 0:13:28 0:55:55

疯狂上分场。13分钟做出3题。最后一题也思路相对比较顺畅。遇到2个阻塞。1. 一开始忘记考虑没有边相连的点对;2. 求了互补问题,但返回答案时粗心误以为总数是n^2,而事实上是C_2 n = n * (n - 1) / 2, 调试又浪费了不少时间。如果更加顺利的话,说不定成绩会突破天际。拿到前20名丰盛的礼物。

阅读全文 »

Rank Name Score Finish Time Q1 (3) Q2 (4) Q3 (5) Q4 (7)
314 / 11654 YoungForest 12 0:27:36 0:04:00 0:14:38 0:27:36 null

自从秋招结束后,刷题和比赛的热情与日俱减。
之前每日三题(国服、美服、残酷),现在每日0题。当然偶尔因为周赛成绩不足以免打卡,也需每日一题。
相反,比赛的反馈还是挺强的。长期有rating和排名的增长激励,短期有残酷排名和每次排名的激励,还有额外积分的奖励。另外每周比赛完还可以在残酷群里领红包,给自己加个鸡腿。

1773. Count Items Matching a Rule

签到题。按照题目描述便利一遍即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int countMatches(vector<vector<string>>& items, string ruleKey, string ruleValue) {
int index = -1;
if (ruleKey == "type") {
index = 0;
} else if (ruleKey == "color") {
index = 1;
} else {
index = 2;
}
int ans = 0;
for (const auto& v : items) {
if (v[index] == ruleValue) {
++ans;
}
}
return ans;
}
};

时间复杂度: O(N),
空间复杂度: O(1).

1774. Closest Dessert Cost

Brute force 暴力枚举即可。观察题目的数据规模,nm都比较小,指数级的暴力搜索就可以过。
可以只用回溯(backtracking),也可以使用3进制bitmask做枚举。
我比赛时采用了回溯。

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
29
30
31
32
33
34
class Solution {
const int INF = 0x3f3f3f3f;
public:
int closestCost(vector<int>& baseCosts, vector<int>& toppingCosts, int target) {
// time: n * (3 ^ m)
// 10 * 3 ^ 10 59049
// max: 10^4 + 2 * 10 * 10^4
vector<int> candidates;
const int m = toppingCosts.size();
function<void(const int, const int)> backtracking = [&](const int i, const int now) -> void {
if (i == m) {
candidates.push_back(now);
} else {
for (int j = 0; j <= 2; ++j) {
backtracking(i + 1, now + toppingCosts[i] * j);
}
}
};
for (int base : baseCosts) {
backtracking(0, base);
}
int ans = -1, diff = INF;
for (int i : candidates) {
const int diffI = abs(i - target);
if (diffI < diff) {
ans = i;
diff = diffI;
} else if (diffI == diff && i < ans) {
ans = i;
}
}
return ans;
}
};

时间复杂度: O(n * 3 ^ m),
空间复杂度: O(n * 3 ^ m).

阅读全文 »

起因

最近毕业压力比较大,想在北邮人上下载个电影看看,放松下。却发现一直使用的做种下载工具qBittorrent无法打开了。在网上寻找了半天原因和解决方案。

最终确认是MAC更新的锅,qBittorrent 属于认证不完整的应用:Issue 11570
解决方案有二:

  • 禁掉APPLE的安全检查
  • 自己手动编译一遍应用

由于某些原因,我无法对MAC做过多的系统更改。只好尝试第二个解决方案。事实证明,手动编译qBittorrent并不简单,一下午就此度过,电影也不用看了。为方便有相同问题的同学参考,我记录我的解决方案于此。因为在我编译构建过程中,网上并没有类似的教程或是参考,而且确实有不少坑。

步骤

如果之前没有QT环境,./configure会报找不到qmake的错误。需要配置相应的环境。

1
2
3
4
5
6
brew install qt
echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.zshrc
export PATH="/usr/local/opt/qt/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/qt/lib"
export CPPFLAGS="-I/usr/local/opt/qt/include"
export PKG_CONFIG_PATH="/usr/local/opt/qt/lib/pkgconfig

如果之前没有boost环境,会报找不到boostlib的错误:

1
2
checking for boostlib >= 1.65 (106500)... configure: We could not detect the boost libraries (version 1.65 or higher). If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to --with-boost option.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.
configure: error: Could not find Boost
阅读全文 »

动机

最近由于看了“半佛仙人”的一些视频,我对钱更感兴趣了。除了拿出积蓄的一部分投资A股外,还想着怎么提高被动收入。自己一直有写博客的习惯,写了有5年多,攒了一百余篇文章。虽然每日浏览量只有几十,但苍蝇再小也是肉。参照大佬的一些经验,尝试着通过投放广告来牟利。
一般网站的广告收入都是通过广告联盟接入的。简而言之就是,你只用出租广告位给广告联盟,他们在此投放针对用户的广告,然后按照流量给你钱。
面向国际的主要就是Google AdSense了,国内也有一些,如百度。
因为我本职是一名程序员,博客内容也不分国界,因此选择了Google AdSense作为广告商。Google AdSense的配置十分简单。

具体步骤

注册新的AdSense账号.

从Google AdSense上获取针对你网站的广告脚本,类似这样

1
<script data-ad-client="ca-pub-9*******6" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

Option1:

将广告脚本粘贴在./themes/next/layout/_partials/head/head-unique.swig的末尾。

然后进行验证。一般几天就会通过,发邮件通知到你。

通过审核后,需要去AdSense上进行配置。基本上把 自动广告 打开即可。

阅读全文 »
0%