diff --git a/CNAME b/CNAME index 8d2094ad3d..2de97096ea 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -yansu.org \ No newline at end of file +chenjun0210.github.io diff --git a/README.md b/README.md index 3aa22e135d..24f0eeba70 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ### 我的博客 -地址:[http://yansu.org](http://yansu.org) +地址:[cj1024.com](http://cj1024.com) ### 安装说明 diff --git a/_config.yml b/_config.yml index e32b604be1..50ea0699ff 100644 --- a/_config.yml +++ b/_config.yml @@ -1,12 +1,12 @@ # Site settings -title: 闫肃的博客 -email: suyan0830@gmail.com +title: 陈军的博客 +email: 754816138@qq.com description: > # this means to ignore newlines until "baseurl:" - 闫肃的博客 + 陈军的博客 baseurl: "" # the subpath of your site, e.g. /blog/ -url: http://yansu.org # the base hostname & protocol for your site +url: cj1024.com # the base hostname & protocol for your site rss_url: /pages/feed.xml -author: Su Yan +author: chen jun # Sidebar filter # Choose 'tag' or 'category' as filter in sidebar. @@ -14,11 +14,11 @@ filter: 'category' recent_num: 20 # Social account -twitter: masonsuyan -weibo: suyan0830 -github: suyan -instagram: suyan0830 -linkedin: suyan0830 +twitter: +weibo: +github: chenjun0210 +instagram: +linkedin: # avatar and Favicon avatar: http://7u2ho6.com1.z0.glb.clouddn.com/site-avatar.png @@ -26,12 +26,12 @@ favicon: http://7u2ho6.com1.z0.glb.clouddn.com/site-favicon.ico # disqus config disqus: - shortname: suyan-zh + shortname: chenjun-zh # google analytics config ga: - id: UA-54767140-1 - url: yansu.org + id: + url: # Build settings permalink: /:year/:month/:day/:title.html diff --git a/_posts/book/2013-12-20-book-list-of-2013.md b/_posts/book/2013-12-20-book-list-of-2013.md deleted file mode 100644 index 46f6a8325c..0000000000 --- a/_posts/book/2013-12-20-book-list-of-2013.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: post -title: 2013阅读书单 -category: 读书 -keywords: 阅读,书单,2013 ---- - -## Pro Git - -![cover](http://7u2ho6.com1.z0.glb.clouddn.com/book-pro-git.jpg) - -[阅读地址](http://git-scm.com/book) - -## The Little Mongodb Book - -![cover](http://7u2ho6.com1.z0.glb.clouddn.com/book-the-little-mongodb-book.png) - -[阅读地址](https://github.com/karlseguin/the-little-mongodb-book/blob/master/en/mongodb.markdown) - -这本书非常之简洁,读起来非常易懂,其实这还归功于MongoDB的简洁。NoSQL与MySQL最大的区别在于它是为一些特定的场景设计的,如MongoDB、Redis、Cassandra等。MongoDB是其中更加通用的一个方案,从MySQL往MongoDB转,几乎不需要太大变化。 - -## 白帽子讲Web安全 - -![cover](http://7u2ho6.com1.z0.glb.clouddn.com/book-the-safety-of-web-by-white-hat.jpg) - -[购买地址](http://book.douban.com/subject/10546925/) - -## 浪潮之巅 - -![cover](http://7u2ho6.com1.z0.glb.clouddn.com/book-on-top-of-tides.jpg) - -[购买地址](http://book.douban.com/subject/6709783/) - diff --git a/_posts/book/2014-03-14-book-list-of-2014.md b/_posts/book/2014-03-14-book-list-of-2014.md deleted file mode 100644 index 6835c45cd4..0000000000 --- a/_posts/book/2014-03-14-book-list-of-2014.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: post -title: 2014阅读书单 -category: 读书 -keywords: 阅读,书单,2014 ---- - -## Web前端黑客技术揭秘 - -![cover](https://img3.doubanio.com/lpic/s24562945.jpg) - -[阅读地址](http://book.douban.com/subject/20451827/) - -## The Little Redis Book - -![cover](https://raw.githubusercontent.com/karlseguin/the-little-redis-book/master/en/title.png) - -[阅读地址](https://github.com/karlseguin/the-little-redis-book) - -## 打造Facebook - -![cover](https://img3.doubanio.com/lpic/s24581301.jpg) - -[购买地址](http://book.douban.com/subject/20471120/) - diff --git a/_posts/book/2017-09-10-deeplearnBook.md b/_posts/book/2017-09-10-deeplearnBook.md new file mode 100644 index 0000000000..91ba242a50 --- /dev/null +++ b/_posts/book/2017-09-10-deeplearnBook.md @@ -0,0 +1,6 @@ +--- +layout: post +title: 2017阅读书单 +category: 读书 +keywords: 阅读,书单,2014 +--- \ No newline at end of file diff --git a/_posts/interview/2016-11-17-airbnb-boggle-game.md b/_posts/interview/2016-11-17-airbnb-boggle-game.md deleted file mode 100644 index 3bc2d10445..0000000000 --- a/_posts/interview/2016-11-17-airbnb-boggle-game.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -layout: post -title: Airbnb Boggle Game -category: 面试 -tags: Airbnb,Interview -keywords: Airbnb,Interview,Boogle Game ---- - -题目来源: [http://www.1point3acres.com/bbs/thread-204884-1-1.html](http://www.1point3acres.com/bbs/thread-204884-1-1.html) - -## 描述 - -boggle game,给一个board和字典,找出board上出现最多的单词集合,单词不能重叠在同一个位置 - -例如 - -``` -board: -{'a', 'b', 'c'}, -{'d', 'e', 'f'}, -{'g', 'h', 'i'} - -dict: -["abc", "cfi", "beh", "defi", "gh"] -``` - -答案应该是 `["abc", "defi", "gh"]` - -## 分析 - -这个题和 Leetcode 的 Word Search II 有点像,唯一区别是这个题里面 board 上的单词不可以重复利用。刚开始我觉得可以 run 一次 Word Search II 得到所有的可能单词先,然后求最大的一个单词无重合集合,但是找无重合集合这个又变成一个 subset 的题目(我没有研究更快的方法)。所以最后还是考虑用控制一下递归搜索的条件,在找单词的时候记录一下已经选中的单词,只是这个过程需要两层递归。 - -1. 还是用一个 Trie 来加速 Word 的查找 -2. 第一个循环,遍历 board 上每一个点,然后从这里找第一个单词(因为第一个单词的选择会影响最终单词数量),开始第一个递归。 -3. 第一个递归的作用是,从当前点开始,通过第二个递归拿到当前点可行的每一个单词。挨个放入,每放入一个更新当前 board 的使用情况,然后开始下一层搜索。 -4. 第二个递归的作用是,从当前点开始,找所有可行的单词 indexes,为第一个递归提供选择 - - -## Java解答 - -```java -import java.util.*; -class Untitled { - // 从每个点开始,找从这个点出发的所有单词组合 - public void getAllWords(char[][] board, String[] words) { - // 构建字典树加速查找 - Trie trie = new Trie(); - for(String word : words) { - trie.insert(word); - } - - int m = board.length; - int n = board[0].length; - List result = new ArrayList<>(); - // 每个点作为起点,可能会有不一样的结果 - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - boolean[][] visited = new boolean[m][n]; - List path = new ArrayList<>(); - findWords(result, board, visited, path, i, j, trie.root); - } - } - - System.out.println(result); - } - - // 从i,j开始递归找到所有单词组合 - public void findWords(List result, char[][] board, boolean[][] visited, List words, int x, int y, TrieNode root) { - - int m = board.length; - int n = board[0].length; - for (int i = x; i < m; i++) { - for (int j = y; j < n; j++) { - List> nextWordIndexes = new ArrayList<>(); - List path = new ArrayList<>(); - // 获得从当前点开始的所有可能单词的indexes - getNextWords(nextWordIndexes, board, visited, path, i, j, root); - for (List indexes : nextWordIndexes) { - // 设置visited为当前使用单词 - String word = ""; - for (int index : indexes) { - int row = index / n; - int col = index % n; - visited[row][col] = true; - word += board[row][col]; - } - - words.add(word); - // 只要更新了words,就保存一次words - if (words.size() > result.size()) { - result.clear(); - result.addAll(words); - } - findWords(result, board, visited, words, i, j, root); - - // 恢复visited - for (int index : indexes) { - int row = index / n; - int col = index % n; - visited[row][col] = false; - } - words.remove(words.size() - 1); - } - } - // 只有第x行是从y开始,后面都从0开始 - y = 0; - } - } - - private void getNextWords(List> words, char[][] board, boolean[][] visited, List path, int i, int j, TrieNode root) { - if(i < 0 | i >= board.length || j < 0 || j >= board[0].length - || visited[i][j] == true || root.children[board[i][j] - 'a'] == null) { - return; - } - - root = root.children[board[i][j] - 'a']; - if(root.isWord) { - List newPath = new ArrayList<>(path); - newPath.add(i * board[0].length + j); - words.add(newPath); - return; - } - - visited[i][j] = true; - path.add(i * board[0].length + j); - getNextWords(words, board, visited, path, i + 1, j, root); - getNextWords(words, board, visited, path, i - 1, j, root); - getNextWords(words, board, visited, path, i, j + 1, root); - getNextWords(words, board, visited, path, i, j - 1, root); - path.remove(path.size() - 1); - visited[i][j] = false; - } - - class Trie { - TrieNode root; - - Trie() { - root = new TrieNode('0'); - } - - public void insert(String word) { - if(word == null || word.length() == 0) { - return; - } - TrieNode node = root; - for(int i = 0; i < word.length(); i++) { - char ch = word.charAt(i); - if(node.children[ch - 'a'] == null) { - node.children[ch - 'a'] = new TrieNode(ch); - } - node = node.children[ch - 'a']; - } - node.isWord = true; - } - } - - class TrieNode { - char value; - boolean isWord; - TrieNode[] children; - - TrieNode(char v) { - value = v; - isWord = false; - children = new TrieNode[26]; - } - } - - public static void main(String[] args) { - char[][] board = new char[][]{ - {'a', 'b', 'c'}, - {'d', 'e', 'f'}, - {'g', 'h', 'i'} - }; - String[] words = new String[] { - "abc", "cfi", "beh", "defi", "gh" - }; - - Untitled s = new Untitled(); - s.getAllWords(board, words); - } -} -``` - - diff --git a/_posts/life/2013-06-17-the-end-of-regular-college-course.md b/_posts/life/2013-06-17-the-end-of-regular-college-course.md deleted file mode 100644 index eeb72a118c..0000000000 --- a/_posts/life/2013-06-17-the-end-of-regular-college-course.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: post -title: 本科生涯结束了 -category: 生活 -tags: Essay -keywords: 本科,结束 -description: 毕设答辩完了,大概大学四年也等于交代了吧 ---- - -今天上午答辩完了,准备了几个月的毕业设计,也算是给了自己一个交代。 - - -回想自己本科四年,有过得失,有过起伏。自己在学校做了很多自己大学之前不敢,也没有机会做的事情。 - - -这四年每天都有新鲜事情发生,现在却一件都想不起来了,唯一的感觉就是自己淡然了很多。 - - -每天混迹在V2EX、微博还有微信中,这些都是我的消息来源,我奋力搜集着自己感兴趣的内容,漫无目的。 - - -出去实习过,也有过干一番事情的冲动,但最后还是选择了安稳读研。曾经一边努力获得保研名额,却又暗暗希望保研失败,这样我就可以有别的选择,不是这样漫无目的走下去。 - - -除了人,这个学校没有什么让我值得留恋的地方,但我却选择继续留在这里。可我决的我天性应该适合陌生的环境,在陌生环境中我有极强的求生欲,内心的斗志会被激发出来,就像我刚来大学时候的状态。 - - -唯一让我难以忘怀的是我在大学遇到的几个人,他们是我这辈子可能都不会忘掉的。 - - -在我看来,一段理想的生活即将结束,未来的路谁都没法预测,坚持做自己认为对的事情就够了。 diff --git a/_posts/life/2013-08-01-the-importent-of-writing.md b/_posts/life/2013-08-01-the-importent-of-writing.md index ec66a089df..6ca148f5b9 100644 --- a/_posts/life/2013-08-01-the-importent-of-writing.md +++ b/_posts/life/2013-08-01-the-importent-of-writing.md @@ -5,21 +5,4 @@ category: 生活 tags: Essay keywords: 写作,writing description: 不再学习技术或做项目,就不再产生内容,这就是我从6月中旬到现在都没有更新的原因 ---- - -最近都没有怎么上微博,昨天上去看到这样一句话,让我挺有感触 - -![写作的重要性](http://7u2ho6.com1.z0.glb.clouddn.com/life-programmer-writing.png) - -我自己写的东西大部分都是一些遇到问题记录和总结,很少能有一些“创造性”的东西。 - -记得Fenng在一篇文章里讲到现在的社交网站中,98%的人在消费信息,只有2%的人在产生信息。 - -我一直属于这98%的人,没有办法,在大学之前从来没有觉得写作的重要性,写出来的东西也是为了完成作文800字的限制。现在想象一下,感觉自己真是太文盲了,自己能写的好像也只有议论文了。提一个议论点,然后摆一些论据,最后总结一下,800字搞定收工。甚至在写一些个人技术学习总结的时候都没有很好的利用好议论文方法,仅仅是一个流水陈述,想到哪里写到哪里。 - -曾经也想过提高一下个人写作水平,想过的一个方式是翻译外文,把今天的hacker news上或者techmeme上感兴趣的一篇文章翻译下来。尝试过一次太受打击,就放弃了。虽然看这些文章基本上没有什么问题,但是要翻译的时候就英语水平捉急了,翻译一篇可能要耗费好多小时的时间。以前翻译过一篇[OpenStack Nova内部机制的文章](/2012/11/08/openstack-nova-internal.html),因为没有找到译文,自己又比较需要这方面的信息,所以尝试了一下,结果发现就这样一个自己比较了解的东西,都翻译的惨不忍睹。 - -现在每天除了学习英语,其余时间最多的就是看看微信上的公众帐号,小道消息、道哥黑板报、Mac Talk都是我比较喜欢的公众帐号。虽然我没有他们那样深的积累和话题,或许我能从个人理解上写一些容易上手的话题。 - - - +--- \ No newline at end of file diff --git a/_posts/life/2014-01-02-my-2013.md b/_posts/life/2014-01-02-my-2013.md deleted file mode 100644 index 8a918468d2..0000000000 --- a/_posts/life/2014-01-02-my-2013.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -layout: post -title: 2013个人总结 -category: 生活 -tags: Essay -keywords: 总结,2013 -description: ---- - -### 动机 - -不知不觉已经进入2014年,今年是我的本命年,实际上从去年到今年也是我人生轨迹变化极快的一年。昨天晚上很晚才睡,有幸读了几个关注的人的2013总结,收益颇多。 - -- [2013 年个人总结](http://dbanotes.net/mylife/2013_personal_review.html) -- [Tinyfool的2013年总结————在困惑和挣扎中试图前行](http://tiny4.org/blog/2014/01/tinyfool-2013/) -- [我在App Store这三年](http://www.iwangke.me/2014/01/01/three-years-in-app-store-as-indie-developer/) - -于是我打算自己也写一篇2013总结,未来自己回顾一年历程的时候,能感觉到自己成长了多少。 - -### 实习 -2013最早的4个月一直是在研究OpenStack是什么,它的作用机制,它的应用方向以及怎么把它运行起来。着手研究OpenStack其实从2012年10月就开始了,我刚刚进入大四,保研后的研究生导师把我推荐到联想实习。 - -OpenStack的学习对我来说真的算是一次不一样的体验,因为它足够大。从概念上如云计算,到技术层面如虚拟化,再到运维层面如自动化运维,最后到开源项目编程,每一部分的学习都让我获益颇丰。我在其中主要的研究虚拟机的监控,这个组件让我更能了解到它各个部分协调运行的机制。 - -4月的时候由于导师需要,从联想回来给实验室弄OpenStack环境,同时我也准备就这个方向写我的毕业论文。 - -### 毕业设计 -回来以后的感觉真的是...节奏缓慢,没有项目的驱动,没有任务的督促。因为老师也不知道要拿这个东西干什么,甚至都不去看我们给他弄好的环境。为了不让自己就这样轻轻松松毕业,我打算继续研究OpenStack,至少完全搞定一个组件。 - -当时正好在于Grizzly版本发布,OpenStack自己的监控组件Ceilometer正式发布(之前我们用新浪开源的Kanyun),对我来说正好是个千载难逢的学习机会。 - -从4月到7月毕业,3个月的时间,我读完了Ceilometer组件的代码,顺便基于它还有Horizon搞了二次开发,顺利毕业。为了阅读代码,我感觉到自己的Python水平提升了不少,最让我满意的应该是还写了几篇有关这个组件的博客。这算是自己真正首次原创了吧。 - -### 放弃读研&出国准备 -从保研开始呆在研究生实验室有快1年,曾经保研只是为了让家人放心,毕业后能找个不错的工作拿到北京户口,这似乎是生活在小县城中父母眼里最好的归宿。但我感受到这里并不适合我,我不希望把自己最有干劲的几年浪费在这个地方。 - -我没有办法改变环境,那我只能换一个环境。 - -一个解决方式是去留学。 - -本科能聊的来的2个哥们,一个已经去了美国,另一个在准备去美国的路上...在他们给我各种灌输之下,以及对北京兴趣的减少,我动摇了。 - -但是我错误判断了自己的英语实力和学习速度...以为我可以像学编程语言一样学英语,但事实显然不是这样的。4个月,GRE+TOEFL几乎把我累死,另一方面还要不停地给家人做工作。最后分数是有了,但是完全达不到自己的预期。 - -另一个解决方式是去工作。 - -### 一个工作 -眼看想去的几个学校无望,我甚至做了最坏的打算,再准备一年再出去。 - -我完全没有想到我轨迹又变了,因为一个偶然的工作机会。 - -英语的准备过程真的有些枯燥,我止不住想去写点东西(码农的命..)。看到V2EX上的一则低调招聘贴,澳洲公司,还能远程,这对于正在学习英语,又想编程的我是最佳选择,没多想就交了简历。 - -电话+QQ联系之后就开始实习了,不得不说这个效率... - -至今为止一个半月的实习,感觉自己在这里有很大的发挥空间,也能在这个方面提升不少。如果能在年后顺利去澳洲工作,或许也是不错的选择。 - -### 总结 - -> 但行好事,莫问前程 - -> 埋头干事,抬头看路 - -这两句似乎有些矛盾,不过我总拿它们来作为自己选择的标准。前者从Fenng听来,后者忘了。 \ No newline at end of file diff --git a/_posts/life/2014-12-12-travel-of-california.md b/_posts/life/2014-12-12-travel-of-california.md deleted file mode 100644 index adb6baf1cc..0000000000 --- a/_posts/life/2014-12-12-travel-of-california.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -layout: post -title: 美西加州三日游 -category: 生活 -tags: essay -keywords: 加州,生活,California ---- - -> 来美3个月了,终于迎来第一个小假期。由于时间有限,还没有车,所以选择了跟团先粗略了解一下加州。 - - - -## 丹麦村 (Solvang) - -丹麦村是我们的第一站停歇点。 - -![solvang street](http://7u2ho6.com1.z0.glb.clouddn.com/life-solvang-street.jpg) - -这里的建筑风格都特别小清醒,多重色彩穿插点缀整条大街。 - -![solvang windmill](http://7u2ho6.com1.z0.glb.clouddn.com/life-solvang-windmill.jpg) - -这个风车是这儿的标志建筑,配合加州的大蓝天,可以拍很多不错的照片。 - -## 赫氏古堡 (Hearst Castle) - -第二站是赫氏古堡,在地图上的C点。 - -![hearst castle appearance](http://7u2ho6.com1.z0.glb.clouddn.com/life-hearst-castle-appearance.jpg) - -这座城堡建在一座山头,城堡中收藏了各种珍贵的雕像和油画。 - -![hearst castle outside](http://7u2ho6.com1.z0.glb.clouddn.com/life-hearst-castle-outside.jpg) - -向西眺望就是沙滩和太平洋,视野非常开阔。 - -## 罗马艺术宫 (Palace of Fine Arts) - -罗马艺术宫就坐落在进门大桥旁边,据说是当初万国博览会举办的地方。 - -![palace of fine arts](http://7u2ho6.com1.z0.glb.clouddn.com/life-palace-of-fine-arts.jpg) - -## 九曲花街 (Lombard Street) - -很多人推荐九曲花街这个地方,但是我们来的时候两边花并没有开,所以看起来就是一个大家练车的地方 0_0 - -![lombard street](http://7u2ho6.com1.z0.glb.clouddn.com/life-lombard-street.jpg) - -## 渔人码头 (Fisherman's Wharf) - -渔人码头这个地方就像一个游客集散地,来的都是外地游客。这里有各种海鲜可以尝,另外广场的歌手唱的也挺不错。 - -![fisherman's wharf](http://7u2ho6.com1.z0.glb.clouddn.com/life-fishermans-wharf-gate-1.jpg) - -## 恶魔岛 (Alcatraz Island) - -从渔人码头上船,可以绕恶魔岛一圈。恶魔岛以前是关政治罪犯的地方,孤立在海中央,非常难越狱,不过据说有人挖了地道到了对岸。 - -![alcatraz island](http://7u2ho6.com1.z0.glb.clouddn.com/life-alcatraz-island.jpg) - -## 金门大桥 (Golden Gate Bridge) - -金门大桥算是旧金山的标志之一。 - -![golden gate bridge](http://7u2ho6.com1.z0.glb.clouddn.com/life-golden-gate-bridge.jpg) - -## 优胜美地国家公园 (Yosemite) - -![Yosemite Artist's Point](http://7u2ho6.com1.z0.glb.clouddn.com/life-yosemite-artists-point.jpg) - -![Yosemite Trees](http://7u2ho6.com1.z0.glb.clouddn.com/life-yosemite-trees.jpg) - -![Yosemite Fall](http://7u2ho6.com1.z0.glb.clouddn.com/life-yosemite-fall.jpg) - -![Yosemite EI Captain](http://7u2ho6.com1.z0.glb.clouddn.com/life-yosemite-ei-captain.jpg) - diff --git a/_posts/life/2015-01-01-my-2014.md b/_posts/life/2015-01-01-my-2014.md deleted file mode 100644 index 5654eebf34..0000000000 --- a/_posts/life/2015-01-01-my-2014.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -layout: post -title: 2014 个人总结 -category: 生活 -tags: Essay -keywords: 个人总结,2014 -description: ---- - -> 在2014年里,我在求学、职业生涯以及家庭关系上都有过多次尝试和选择。 - -## 留学申请 - -英语考试和学校申请总的时间大概是从去年8月中旬到今年1月中旬,历时5个月,这段时间是我有记忆以来最困难的一段时期。其中包括说服家人支持我留学,考过TOEFL和GRE,以及学校的选择和申请。 - -最后由于考试结果不理想,只申请了一个学校尝试,之后打算继续考试和准备来年的申请。 - -## 远程工作 - -从13年底加入澳洲这家公司,到今年5月离开,是我第一次尝试远程工作。由于那边公司节奏也不快,所以除了工作外,我可以有闲暇的时间完成留学的各种琐事,以及处理研究生学校退学的一些事情。 - -工作中收获很多,一方面要熟悉远程工作方式,另一方面为了实现项目的需求需要不断学习提升自己。最后积累了比较多的网络安全知识和实际开发经验。 - -但是后来由于公司重组,原定的很多计划都不能再继续,因此我有了很长一段空闲期。 - -## 几次旅行 - -这段空闲期里,正好给了我很多机会出去旅行。我在14年上半年去游了华山和普陀山。一直想抽空把图片整理一下,写一下游记... 但是一直没有完成,看来只能拖到15年了。 - -## 新公司 - -旅行归来以后开始考虑自己接下来的计划,选择一个既有利于自己发展,又对个人限制比较少的公司工作,这样可以让我继续自己留学的目标。 - -在几次面试和选择以后,最后加入了一个创业公司,开始全职工作。 - -## 留学 - -5月中旬,我不幸被一波拒信AOE砸中。14Fall的入学没戏了,不过学校接着给我发来一封调剂录取,说我如果愿意接受学校国际学校的语言课程,可以14Fall加入国际学院,然后15Spring或者15Fall再进入正式的Master学院。 - -和家人和老板都商量过以后,确定接受调剂,先到美帝熟悉环境。 - -## 语言学习 - -语言学习过程其实也是熟悉未来生活和学习环境的过程。事实证明早来也有早来的好处,经过几个月的学习,我的英文水平可以应付了日常生活和学术的基本要求。 - -其间除了探索洛杉矶,还去过一次旧金山旅行,感受了一下湾区风光。 - -## 总结 - -总得说来,这一年经历了很多,也成长了很多。 diff --git a/_posts/life/2015-01-30-microsoft-openhack-2015.md b/_posts/life/2015-01-30-microsoft-openhack-2015.md deleted file mode 100644 index 07c25513be..0000000000 --- a/_posts/life/2015-01-30-microsoft-openhack-2015.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -layout: post -title: 微软 Openhack 2015 -category: 生活 -tags: Essay -keywords: ---- - -Hackathon 在国内也见过不少,不过一直没有参加过,一是熬夜实在是伤身体,二是以前不太好找队伍。这回室友喊我去参加,因为好奇这边IT的工作环境,就去参加了。 - -这次 Hackathon 的主题是 USC vs UCLA,这俩学校的 Football 一直是死敌,导致各方面也都开始竞争,在 [Wikipedia](http://en.wikipedia.org/wiki/UCLA–USC_rivalry) 上还有专门的词条来记录两校的竞争。 - -![USC vs UCLA](http://7u2ho6.com1.z0.glb.clouddn.com/life-openhack-usc-vs-ucla.png) - -上图是 Hackathon 一组队伍最终展示PPT时候的封面~ - -这次 Openhack 的奖品还好,第一是去西雅图总部玩,第二是人手一台XBOX. - -![Prize](http://7u2ho6.com1.z0.glb.clouddn.com/life-openhack-prize.png) - -不过在中间每隔一个小时有一次小活动,奖品包含了XBOX和Surface Pro等 0_0 可惜活动都没法参加,对游戏规则都不明白。不过这边的工程师们还是挺逗的,唱歌跳舞神马的各种玩 High。 - -下图是洛杉矶微软办公室,这天里面基本上能坐的地方都被参加 Hackathon 的队伍挤满了。 - -![Office](http://7u2ho6.com1.z0.glb.clouddn.com/life-openhack-microsoft-office.png) - -我们的4个人的桌面~ 隔壁一哥带外星人来写代码,不过据说装了10个小时,Visual Studio 都没装完。 - -![table](http://7u2ho6.com1.z0.glb.clouddn.com/life-openhack-table.png) -
最后是队伍合影 =_= 我是那个比较正常的 - -![team](http://7u2ho6.com1.z0.glb.clouddn.com/life-openhack-team.png) \ No newline at end of file diff --git a/_posts/life/2015-04-13-rent-car-by-zipcar.md b/_posts/life/2015-04-13-rent-car-by-zipcar.md deleted file mode 100644 index a149bfa52a..0000000000 --- a/_posts/life/2015-04-13-rent-car-by-zipcar.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -layout: post -title: 使用 Zipcar 在加州租车 -category: 生活 -tags: Essay -keywords: Zipcar,Rent,Car ---- - -> 在洛杉矶这个“大饼”中生活,没有车真的是各种艰难。2月初把驾照考过了,接下来就考虑买车或者租车。买车算了算不是很划算,而且对车也不太懂,就考虑先租车。 - -> 在 [USC Transportation](http://transnet.usc.edu/index.php/getting-around/) 上排名最靠前的两个公司是 Enterprise 和 Zipcar。前者是传统的租车公司,后者稍微不一样一点。我还没有在 Enterprise 上租过车,所以先说说 Zipcar. - -## Zipcar 简介 - -[Zipcar](http://www.zipcar.com) 是会员制的,在注册以后会给发一张 Zipcard 过来,有了这张卡你就可以随时去订车和提车了。Zipcar 不像其他租车行一样你得去固定地方统一取车,它的车就停在路边,他们有固定的停车位。来看一下 Zipcar 在 USC 附近的停车点。 - -![zipcar map](http://7u2ho6.com1.z0.glb.clouddn.com/life-zipcar-map.png) - -## Zipcar 使用 - -### 1. 注册获得会员卡 - -大部分学校应该都和 Zipcar 有合作,所以注册之前应该去学校网站看一下。学生可以将会员费缩减到 25刀/年。 - -注册地址在[这里](http://members.zipcar.com/registration),注册的时候去搜一下 Promo Code,我就是注册完才看到一个免费40刀的 Code T_T。在美国注册帐号一看到 Code 填空就应该去搜搜~ - -### 2. 租车 - -租车可以在网站上或者手机 APP 上进行。租车非常方便,只要选择相应车辆,以及使用时间预订即可。然后在预订时间的前15分钟内取车。取车很简单,拿自己的 Zipcard 刷一下车前部的一个感应器门就开了。然后上车发动走人。 - -### 3. 加油 - -Zipcar 租的车带了加油卡,就在司机座位上面。虽然看起来比较贴心,但是这个卡经常不能用,因为它似乎是个信用卡,然后一旦有人尝试多次失败就被锁了,导致后面的人们也不能用。 - -加油卡的使用方式是: - -1. 刷一下加油卡 (Gas Card) -2. 输入汽车里程表上的数 -3. 输入 Zipcard 上面那个 6 位的 Gas ID -4. 加油 - -如果加油卡失效,这个时候会提示:Find your cashier。不用担心,直接用自己的信用卡加油就好了,然后记得要收据 (Receipt),然后把收据发到 support@zipcar.com 报销就好。记得在邮件里加上自己的 Zipcard ID. - -### 4. 还车 - -还车记得一定要还到原车的位置。 - -### 5. 保险 - -在帐号注册的时候有个保险选项 - -![damage fee](http://7u2ho6.com1.z0.glb.clouddn.com/life-zipcar-damage-fee.png) - -我建议选择那个complete waiver,毕竟开车难免磕碰。 - -## 注意 - -### 1. 逾期罚款 - -租车的时候宁可多不可少,因为逾期惩罚是非常重的,应该是一个小时50刀左右。 - diff --git a/_posts/life/2015-12-23-las-vegas-travel.md b/_posts/life/2015-12-23-las-vegas-travel.md deleted file mode 100644 index 9af897fbc6..0000000000 --- a/_posts/life/2015-12-23-las-vegas-travel.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: post -title: Las Vegas 自驾游 -category: 生活 -tags: essay -keywords: 加州,生活,California,Las Vegas ---- - -> Las Vegas 是美国必去的城市之一。有人说,要看100年前的美国要去 San Francisco,看50年前的美国要去 Los Angels,看现在的美国要去 Las Vegas。 - - - -## Outlets at Barstow - -很大一个 Outlets,只是顺路上厕所... - -## Bellagio Hotel - -![Bellagio](http://7u2ho6.com1.z0.glb.clouddn.com/life-bellagio-resort.png) - -![Bellagio](http://7u2ho6.com1.z0.glb.clouddn.com/life-bellagio-resort-2.png) - -![Bellagio](http://7u2ho6.com1.z0.glb.clouddn.com/life-bellagio-resort-3.png) - -## Hoover Dam - -![Hoover Dam](http://7u2ho6.com1.z0.glb.clouddn.com/life-hoover-dam-1.png) - -![Hoover Dam](http://7u2ho6.com1.z0.glb.clouddn.com/life-hoover-dam-2.png) - -## Valley of Fire State Park - -![Valley of Fire](http://7u2ho6.com1.z0.glb.clouddn.com/life-valley-of-fire-1.png) - -![Valley of Fire](http://7u2ho6.com1.z0.glb.clouddn.com/life-valley-of-fire-2.png) - - diff --git a/_posts/life/2016-03-13-san-diego-travel.md b/_posts/life/2016-03-13-san-diego-travel.md deleted file mode 100644 index dbe698898b..0000000000 --- a/_posts/life/2016-03-13-san-diego-travel.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -layout: post -title: San Diego 自驾游 -category: 生活 -tags: essay -keywords: 加州,圣地亚哥,生活,California,San Diego ---- - -> San Diego 就在 Los Angeles 车程不到2小时的地方,本来是来 LA 以后首选的旅行城市,拖到现在才去。总的说来,这个城市不大,每个地方都很容易到达,特别适合生活。 - - - -## Carlsbad Flower Fields - -![Carlsbad Flower Fields](http://7u2ho6.com1.z0.glb.clouddn.com/life-carlsbad-flower-fields.png) - -## University of California San Diego - -![University of San Diego](http://7u2ho6.com1.z0.glb.clouddn.com/life-university-of-san-diego.png) - -## San Diego Temple - -![San Diego Temple](http://7u2ho6.com1.z0.glb.clouddn.com/life-san-diego-temple.png) - -## La Jolla Cove - -![La Jolla Cove](http://7u2ho6.com1.z0.glb.clouddn.com/life-la-jolla-cove.png) - -## SeaWorld - -![SeaWorld](http://7u2ho6.com1.z0.glb.clouddn.com/life-seaworld-san-diego.png) - -## USS Midway Museum - -![USS Midway Museum](http://7u2ho6.com1.z0.glb.clouddn.com/life-uss-midway-museum.png) - -![Cute girl](http://7u2ho6.com1.z0.glb.clouddn.com/life-cute-girl.png) - -## Sunset Cliffs Park - -![Sunset Cliffs Park](http://7u2ho6.com1.z0.glb.clouddn.com/life-sunset-cliffs-park.png) - -## Old Town - -![Old Town](http://7u2ho6.com1.z0.glb.clouddn.com/life-old-town.png) - -## Potato Chip Rock - -![Potato Chip Rock](http://7u2ho6.com1.z0.glb.clouddn.com/life-potato-chip-rock.png) - -## 美食严重推荐 - -- Great Plaza Buffet - diff --git a/_posts/life/2016-07-02-olympic-national-park-travel.md b/_posts/life/2016-07-02-olympic-national-park-travel.md deleted file mode 100644 index 680b88666f..0000000000 --- a/_posts/life/2016-07-02-olympic-national-park-travel.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -layout: post -title: Olympic National Park 自驾游 -category: 生活 -tags: essay -keywords: 加州,生活,California,Olympic National Park ---- - -> Olympic National Park 是美国10大国家公园之一,体验过以后真的感觉,要雪山有雪山,要湖水有湖水,要雨林有雨林,几乎囊括了大部分客观上的户外景观。 - - - -## Nourish Sequim - -![Nourish Sequim](http://7u2ho6.com1.z0.glb.clouddn.com/life-nourish-sequim.png) - -## Hurricane Ridge - -![Hurricane Ridge](http://7u2ho6.com1.z0.glb.clouddn.com/life-hurricane-ridge.png) - -![Hurricane Ridge](http://7u2ho6.com1.z0.glb.clouddn.com/life-hurricane-ridge-2.png) - -![Hurricane Ridge](http://7u2ho6.com1.z0.glb.clouddn.com/life-hurricane-ridge-3.png) - -## La Push Beach - -![La Push](http://7u2ho6.com1.z0.glb.clouddn.com/life-la-push.png) - -## Sol Duc Falls - -![Sol Duc Falls](http://7u2ho6.com1.z0.glb.clouddn.com/life-sol-duc-falls.png) - -## Deer Lake - -![Deer Lake](http://7u2ho6.com1.z0.glb.clouddn.com/life-deer-lake.png) - -## Hoh Rain Forest - -![Hoh Rain Forest](http://7u2ho6.com1.z0.glb.clouddn.com/life-hoh-rain-forest.png) - -## Ruby Beach - -![Ruby Beach](http://7u2ho6.com1.z0.glb.clouddn.com/life-ruby-beach.png) - - - - diff --git a/_posts/life/2016-11-07-credit-cards-in-usa.md b/_posts/life/2016-11-07-credit-cards-in-usa.md deleted file mode 100644 index 95042b7622..0000000000 --- a/_posts/life/2016-11-07-credit-cards-in-usa.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -layout: post -title: 美国信用卡懒人选择 -category: 生活 -tags: essay -keywords: 信用卡,生活,美国 ---- - -## 美国信用卡简介 - -在美国信用卡在日常生活中非常重要,不光是好处多,而且有些地方非信用卡不可,我列举一下我知道的部分: - -1. 从租车公司租车必须使用信用卡 -2. 用信用卡付账可以返现或者积分 -3. 拥有信用卡可以提升个人的信用分数 -4. 临时大额消费可以分期偿还 - -但是信用卡类型非常多,几乎每家银行都提供了非常多的信用卡类型,选哪个作为日常使用的呢?以下我只介绍我自己的开的卡和选择原因。 - -## 不需要SSN卡 - -### Citibank - -#### Citi ThankYou Preferred for College Students - -![](http://7u2ho6.com1.z0.glb.clouddn.com/life-citi-thankyou-card.jpg) - -[申请地址](https://goo.gl/oATrVo) - -这个卡是我来美国第一个申请的卡,非常适合新来的国际学生,因为这个卡的申请不需要任何信用分数,也没有任何年龄限制。当时我有BOA和Citi两个选择,但是前者在年龄超一定值的时候需要在银行存一定的押金 T_T 大龄青年表示很受伤,所以立马放弃申请BOA。 - -这个卡我的开卡额度是1000刀,每半年可以申请提升一次。它的积分兑换大概是略小于1%,但是对于刚开始来说够用,然后我使用积分的方式是在Amazon上买东西。 - -## 需要SSN卡 - -### Discover - -![](http://7u2ho6.com1.z0.glb.clouddn.com/life-discover-it.jpg) - -[申请地址](https://goo.gl/QELR4c) - -- 返现: 季度分类5%,其他1% -- 开卡奖励: 开卡三月内消费一次得$50(需要refer) - -这个卡基本是有了SSN以后人人必备,因为每个季度都有一定的5%返现,现在申请其实返现力度有10%,因为它会记录你第一年的返现的钱,在一年后把这些返现再给你一次。这个卡搭配下面介绍的一个卡,可以一年返现非常多。 - -申请学生版本(用学校邮箱)可以每年拿好学生奖励 :D 大概是25刀,另外refer开卡有50刀的奖励。 - -### Chase - -Chase是我选择的一个主要银行,因为大银行嘛,各方面做的都比较到位。还有就是我比较懒,不想管理太多卡,而Chase的信用卡囊括了很多高返现方面。 - -在介绍信用卡之前,先说一下Debit Card的开卡奖励,这个在开卡的时候需要SSN号和工作单位(实习也行),然后需要一个coupon,可以找人要或者eBay搞一个~ - -- Saving Account: 存$15000放3个月可得$200 -- Checking Account: 有公司给你发工资到卡上可得$300 - -#### Ultimate Rewards(UR) - -UR是Chaes的积分系统。以下所有信用卡的返现,都以积分方式体现在这个系统里面。积分可以以100:1的方式兑换现金,也可以通过CSP(下面介绍的一个信用卡)花在别的地方,提高积分的价值。如果通过使用积分去买机票,租车和住酒店,可以达到100:2或100:3。 - -具体的使用方式可以读一下[美国信用卡指南]((https://goo.gl/j5iJif))的文章,非常详细清晰。 - -#### Chase Freedom - -![](http://7u2ho6.com1.z0.glb.clouddn.com/life-chase-freedom.jpg) - -[申请地址](https://goo.gl/m8ovRp) - -- 返现: 季度分类5%,其他1% -- 开卡奖励: 开卡三个月消费满500给$150 - -Chase Freedom 也是必选之一,因为也是一个5%季度返现卡,配合Discover使用。开卡奖励应该有15000 UR,直接转换现金是$150。现在这个卡正在支持Costco购物5%的返现,所以基本上每个季度都可以把积分赚满(每个季度5%的上限是前1500)。 - -#### Chase Freedom Unlimited - -![](http://7u2ho6.com1.z0.glb.clouddn.com/life-cfu.png) - -[申请地址](https://goo.gl/KmlL8s) - -- 返现: 所有1.5%,无上限 -- 开卡奖励: 开卡三个月消费满500给$150 - -这个是今年新开的一个卡,这个卡真正算得上懒人用,即所有的消费都是1.5%的返现,而且返现没有上限。我用这个卡付其他一切消费 :D - -#### Chase Sapphire Preferred (CSP) - -![](http://7u2ho6.com1.z0.glb.clouddn.com/life-csp-card.png) - -[申请地址](https://goo.gl/c0cOIk) - -- 返现: 吃饭和旅行2%,其他1% -- 开卡奖励: 开卡三个月消费4000给$550 -- 年费: $95,第一年免年费 - -这个卡用来帮助把之前攒的点数加倍,即用这个卡来买机票和住特定酒店,可以把积分成倍。另外如果租车的话,这个卡还可以提供Primary租车保险。 - -## 我的使用 - -基本我持有以上的卡以后就不再折腾了,Citibank我已经不再使用,其他几个卡的用途如下: - -1. 有季度5%返现的时候,用discover和Chase Freedom -2. 吃饭和旅游相关(Uber, Zipcar等都算),用CSP -3. 其他情况使用Chase Freedom Unlimited - -## 需要Refer留邮箱即可 - -除了Citibank之外,我都可以Refer,如果需要的话可以直接留邮箱。 - - - diff --git a/_posts/resource/2013-04-23-general-bootstrap-resources.md b/_posts/resource/2013-04-23-general-bootstrap-resources.md deleted file mode 100644 index 7a0628f7a2..0000000000 --- a/_posts/resource/2013-04-23-general-bootstrap-resources.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: post -title: Bootstrap常用资源 -category: 资源 -tags: Bootstrap -description: 列举自己搜集的Bootstrap资源,给像我这样前端不太行的WEB开发者 ---- - -### 官方资源 - -- [官方首页](http://twitter.github.io/bootstrap/) - -### 字体图标 - -- [Font Awesome](http://fortawesome.github.io/Font-Awesome/) - - 扩展bootstrap的图标,是基于css的,非常漂亮,而且还支持视网膜屏,但是貌似手机上没法支持(测试过UC) - -### 下拉按钮 - -- [Bootstrap Mutiselect](http://davidstutz.github.io/bootstrap-multiselect/) - - 多选下拉列表插件 - -### 表单扩展 - -- [Bootstrap Form Helpers](http://vincentlamanna.com/BootstrapFormHelpers/index.html) - - 扩展常用的表单功能,包括日期选择、时间选择等 - diff --git a/_posts/resource/2014-01-15-general-git-resources.md b/_posts/resource/2014-01-15-general-git-resources.md deleted file mode 100644 index 4dad07812f..0000000000 --- a/_posts/resource/2014-01-15-general-git-resources.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -layout: post -title: Git 常用资源 -category: 资源 -tags: Git -keywords: Git ---- - -## 库管理 - -### 克隆库 - -```bash -git clone https://github.com/php/php-src.git -git clone --depth=1 https://github.com/php/php-src.git # 只抓取最近的一次 commit -``` - -## 历史管理 - -### 查看历史 - -```bash -git log --pretty=oneline filename # 一行显示 -git show xxxx # 查看某次修改 -``` - -### 标签功能 - -```bash -git tag # 显示所有标签 -git tag -l 'v1.4.2.*' # 显示 1.4.2 开头标签 -git tag v1.3 # 简单打标签 -git tag -a v1.2 9fceb02 # 后期加注标签 -git tag -a v1.4 -m 'my version 1.4' # 增加标签并注释, -a 为 annotated 缩写 -git show v1.4 # 看某一标签详情 -git push origin v1.5 # 分享某个标签 -git push origin --tags # 分享所有标签 -``` - -### 回滚操作 - -```bash -git reset 9fceb02 # 保留修改 -git reset 9fceb02 --hard # 删除之后的修改 -``` - -### 取消文件的修改 - -```bash -git checkout -- a.php # 取消单个文件 -git checkout -- # 取消所有文件的修改 -``` - -### 删除文件 - -```bash -git rm a.php # 直接删除文件 -git rm --cached a.php # 删除文件暂存状态 -``` - -### 移动文件 - -```bash -git mv a.php ./test/a.php -``` - -### 查看文件修改 - -```bash -git diff # 查看未暂存的文件更新 -git diff --cached # 查看已暂存文件的更新 -``` - -### 暂存和恢复当前staging - -```bash -git stash # 暂存当前分支的修改 -git stash apply # 恢复最近一次暂存 -git stash list # 查看暂存内容 -git stash apply stash@{2} # 指定恢复某次暂存内容 -git stash drop stash@{0} # 删除某次暂存内容 -``` - -### 修改 commit 历史纪录 - -```bash -git rebase -i 0580eab8 -``` - -## 分支管理 - -### 创建分支 - -```bash -git branch develop # 只创建分支 -git checkout -b master develop # 创建并切换到 develop 分支 -``` - -### 合并分支 - -```bash -git checkout master # 切换到 master 分支 -git merge --no-ff develop # 把 develop 合并到 master 分支,no-ff 选项的作用是保留原分支记录 -git rebase develop # rebase 当前分支到 develop -git branch -d develop # 删除 develop 分支 -``` - -### 克隆远程分支 - -```bash -git branch -r # 显示所有分支,包含远程分支 -git checkout origin/android -``` - -### 修复develop上的合并错误 - -1. 将merge前的commit创建一个分之,保留merge后代码 -2. 将develop `reset --force`到merge前,然后`push --force` -3. 在分支中rebase develop -4. 将分支push到服务器上重新merge - -### 强制更新到远程分支最新版本 - -```bash -git reset --hard origin/master -git submodule update --remote -f -``` - -## Submodule使用 - -### 克隆带submodule的库 - -```bash -git clone --recursive https://github.com/chaconinc/MainProject -``` - -### clone主库后再去clone submodule - -```bash -git clone https://github.com/chaconinc/MainProject -git submodule init -git submodule update -``` - -## Git设置 - -Git的全局设置在`~/.gitconfig`中,单独设置在`project/.git/config`下。 - -忽略设置全局在`~/.gitignore_global`中,单独设置在`project/.gitignore`下。 - -### 设置 commit 的用户和邮箱 - -```bash -git config user.name "xx" -git config user.email "xx@xx.com" -``` - -或者直接修改config文件 - -```bash -[user] - name = xxx - email = xxx@xxx.com -``` - -### 查看设置项 - -```bash -git config --list -``` - -### 设置git终端颜色 - -```bash -git config --global color.diff auto -git config --global color.status auto -git config --global color.branch auto -``` \ No newline at end of file diff --git a/_posts/resource/2014-01-15-general-html-resources.md b/_posts/resource/2014-01-15-general-html-resources.md deleted file mode 100644 index b2473d3878..0000000000 --- a/_posts/resource/2014-01-15-general-html-resources.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: post -title: HTML 常用资源 -category: 资源 -tags: HTML -keywords: HTML -description: ---- - -## 常用属性 - -### 在link中可能会出现media=screen的情况 -这个属性是确定在哪种情况下使用这个link的css文件,screen是指输出到屏幕,而print用于打印 - -### 在meta中增加viewport选项 -viewport的作用是告诉浏览器,目前的装置情况。 - - - -- width:数字或device-width 设置宽度 -- height:数字或device-width 设置高度 -- initial-scale:最小0.25,最大5 初始缩放 -- minimum-scale:最小0.25,最大5 最小缩放 -- maximum-scale:最小0.25,最大5 最大缩放 -- user-scalable:1或0(yes or no) 是否允许用户缩放 \ No newline at end of file diff --git a/_posts/resource/2014-01-15-general-javascript-resources.md b/_posts/resource/2014-01-15-general-javascript-resources.md deleted file mode 100644 index 055a638d1b..0000000000 --- a/_posts/resource/2014-01-15-general-javascript-resources.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -layout: post -title: JavaScript 常用资源 -category: 资源 -tags: JavaScript -keywords: JavaScript -description: ---- - -## 常用代码 - -### 字符串截取 - substr(start [, length ]) - 返回一个从指定位置开始的指定长度的子字符串 - substring(start, end) - 返回位于 String 对象中指定位置的子字符串。 - - -### 页面跳转 - window.navigate("top.jsp"); - window.history.back(-1); - window.location.href="login.jsp?backurl="+window.location.href; - self.location='top.htm'; - top.location='xx.jsp'; - -### 加载完成 - window.onload - 必须等页面内包括图片的所有元素加载完成后才能执行。 - 不能同时编写多个,只执行一个 - $(document).ready() - 是DOM结构绘制完毕后就可以执行 - 可以编写多个 - 简写$(function(){}); - $(window).load()等同与window.onload - -### 刷新页面 - history.go(0) - location.reload() - location=location - location.assign(location) - document.execCommand('Refresh') - window.navigate(location) - location.replace(location) - document.URL=location.href - -### json转化和解析 - - JSON.parse("{a:'111',b:'ccc'}"); //解析 - eval("("+"{{ cpu_data }}"+")"); //解析 - -### 时间转换 - - var day1 = parseInt(new Date().valueOf()/1000); //获得当前时间时间戳 - day2 = new Date(day1*1000); - alert(day2.getFullYear()+"-"+(day2.getMonth()+1)+"-"+day2.getDate()+" "+day2.getHours()+":"+day2.getMinutes()+":"+day2.getSeconds()) - d = new Date(); - s = d.getFullYear() + "-"; - s += ("0"+(d.getMonth()+1)).slice(-2) + "-"; - s += ("0"+d.getDate()).slice(-2) + " "; - s += ("0"+d.getHours()).slice(-2) + ":"; - s += ("0"+d.getMinutes()).slice(-2) + ":"; - s += ("0"+d.getSeconds()).slice(-2) + "."; - s += ("00"+d.getMilliseconds()).slice(-3); - -### URI编码转换 - - var a="':'"; - en = encodeURI(a); //编码 - a = decodeURI(en); //解码 - -### HTML编码转换 - - function htmlEncode(value){ - return $('
').text(value).html(); - } - - function htmlDecode(value){ - return $('
').html(value).text(); - } diff --git a/_posts/resource/2014-01-15-general-jquery-resources.md b/_posts/resource/2014-01-15-general-jquery-resources.md deleted file mode 100644 index 6a615024f0..0000000000 --- a/_posts/resource/2014-01-15-general-jquery-resources.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -layout: post -title: jQuery 常用资源 -category: 资源 -tags: jQuery -keywords: jQuery -description: ---- - -## 官方资源 - -- [官方首页](http://jquery.com/) -- [官方插件](http://plugins.jquery.com/) - -## 下拉框扩展 - -- [Select 2](http://ivaynberg.github.io/select2/) - - 功能强大的下拉列表插件,基本包含了所有可能的需求…… - -- [OptionTree](http://kotowicz.net/jquery-option-tree/demo/demo.html) - - 联动下拉列表插件,可以动态生成下拉列表,而且支持ajax获取数据 - -## 常用代码 - -### 禁用a的链接 - - href="return false;"或href="javascript;" - $().live('click',function(e){ - e.preventDefault(); - }); - -### 清空file的内容 - - var cfile = $('#id').clone(); - $('#id').replaceWith(cfile); - -### jquery.form.js 和 jquery.validate.js配合使用 - 这两个脚本搭配在表单验证和提交是非常的好用,顺便增加了对bootstrap表单的支持 - $("#page_form").validate({ - highlight: function(element) { - $(element).closest('.control-group').removeClass('success').addClass('error'); - }, - success: function(element) { - element.text('OK!').addClass('valid').closest('.control-group').removeClass('error').addClass('success'); - }, - submitHandler:function(form) { - $(form).ajaxSubmit(options); - }}); - -### 选择父节点 - 使用$(this)来将dom对象转为jquery对象 - $(this).parents('tr'); - -### 多重操作 - $(this).parents('tr').remove(); - 因为jquery函数返回jquery节点 \ No newline at end of file diff --git a/_posts/resource/2014-01-15-general-php-resources.md b/_posts/resource/2014-01-15-general-php-resources.md deleted file mode 100644 index 662eb66d95..0000000000 --- a/_posts/resource/2014-01-15-general-php-resources.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -layout: post -title: PHP 常用资源 -category: 资源 -tags: PHP -keywords: PHP -description: ---- - -## 常用资源 - -### 常用扩展 - -1. [phpDocumentor](http://www.phpdoc.org) -2. [PHPUnit](https://phpunit.de) -3. [Guzzle](https://github.com/guzzle/guzzle) - -### 好文 -1. [PHP之道](http://wulijun.github.io/php-the-right-way/) -2. [Cookie/Session机制详解](http://blog.csdn.net/fangaoxin/article/details/6952954) - -### 优秀的类库 -1. [PHP中文分词: 自动打标签功能](http://jingwentian.com/t-145) - -### 判断是否为空 -``` -+--------------+-----------+---------+-----------+---------+--------+ -| 真值表 | gettype() | empty() | is_null() | isset() | (bool) | -+--------------+-----------+---------+-----------+---------+--------+ -| $x = "" | string | true | false | true | false | -| $x=null | NULL | true | true | false | false | -| var $x | NULL | true | true | false | false | -| $x = array() | array | true | false | true | false | -| $x = false | boolean | true | false | true | false | -| $x = 15 | integer | false | false | true | true | -| $x = 1 | integer | false | false | true | true | -| $x = 0 | integer | true | false | true | false | -| $x = -1 | integer | false | false | true | true | -| $x = '15' | string | false | false | true | true | -| $x = '1' | string | false | false | true | true | -| $x = '0' | string | true | false | true | false | -| $x = '-1' | string | false | false | true | true | -| $x = 'foo' | string | false | false | true | true | -| $x = 'true' | string | false | false | true | true | -| $x = 'false' | string | false | false | true | true | -+--------------+-----------+---------+-----------+---------+--------+ -``` - -## 常用命令 - -### 修改phpunit内存限制 - - phpunit -d memory_limit=512M - - -## PHPStorm 常用快捷键 - -- Quick Command - - `Command + Shift + A` - -- Quick File - - `Command + Shift + O` - -- Quick Class - - `Command + O` - -- Quick Symbol - - `Command + Option + O` \ No newline at end of file diff --git a/_posts/resource/2014-01-15-general-python-resources.md b/_posts/resource/2014-01-15-general-python-resources.md deleted file mode 100644 index 63f9e5bc2c..0000000000 --- a/_posts/resource/2014-01-15-general-python-resources.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: post -title: Python 常用资源 -category: 资源 -tags: Python -keywords: Python -description: ---- - -## 常用代码 - -### 遍历对象 - for key in a.__dict__: - print key,':',a.__dict__[key] - -### 调试方法 - assert False //引发异常,观察错误界面 - import logging - logging.info('') //写日志 - -### 获得当前时间 - #时间戳 - time.time() - #日期时间 - time.ctime() - #iso时间 - datetime.fromtimestamp(time.time()).isoformat() - #固定格式 - time.strftime('%Y-%m-%d',time.localtime(time.time())) -### 日期到时间戳 - dateC=datetime.datetime(2010,6,6,8,14,59) - timestamp=time.mktime(dateC.timetuple()) -### 时间戳到日期 - ltime=time.localtime(1237515355.0) - timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime) -### 之后的包从绝对位置导入 - from __future__ import absolute_import - diff --git a/_posts/resource/2014-01-15-general-shell-resources.md b/_posts/resource/2014-01-15-general-shell-resources.md deleted file mode 100644 index 45489a35e7..0000000000 --- a/_posts/resource/2014-01-15-general-shell-resources.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -layout: post -title: Shell 常用资源 -category: 资源 -tags: Shell -keywords: Shell -description: ---- - - -## 常用指令 - -### 文本内容搜索 - - grep aaa * - -### 文件夹操作 - - 查看文件夹大小 du -h --max-depth=1 /home/ys - 查看驱动器空间 df -h - -### 压缩命令 - - tar zxvf aaa.tar.gz - tar zcvf aaa.tar.gz aaa - -### 登陆到其他用户 - - login - -### 查看端口的占用 - - lsof -i:8087 查看8087端口的使用 - -### 批量杀死进程 - - ps -aux|grep name|grep -v grep|cut -c 9-15|xargs kill -9 - -### 查看当前时间 - - date 时间 - date +%s 时间戳 - date -d "2010-07-20 10:25:30" +%s 指定时间时间戳 - date -d "@1279592730" 时间戳转时间 - date -d "1970-01-01 14781 days" "+%Y/%m/%d %H:%M:%S" - -### 查看进程内存使用情况 - - top -d 1 -p pid [,pid ...] - pmap pid - ps aux|grep process_name - 查看/proc/process_id/文件夹下的status文件 - -### 查看Linux内核版本或发布版本 - - lsb_release -a - uname -a - -### 一句话实现一个HTTP服务,把当前文件夹作为根目录 - - python -m SimpleHTTPServer - -### 查看本地网络服务活动状态 - - lsof -i - -### 查看自己的外网ip - - curl ifconfig.me - -### 下载整个网站 - - wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com - -### 后台运行一段不中止的程序,并可随时查看它的状态 - - screen -d -m -S some_ name ping my_router - -### 查看进程执行的时间 - - ps -A -opid,stime,etime,args | grep python - -### 创建守护进程 - - nohup python /var/www/a.py & - -### 查看当前文件夹下文件(文件夹)大小 - - du -h --max-depth=1 . - -### 查看所有磁盘大小 - - df -h - -### 诊断网络 - - mtr - ping - traceroute - dig - -### 列出本机监听的端口号 - - netstat –tlnp - netstat -anop - -### 在远程机器上运行一段脚本 - - ssh user@server bash < /path/to/local/script.sh - -### 端口扫描 - - nc -z -v -n 127.0.0.1 20-100 - -### 负载测试,30秒内向Google发起20个并发连接 - - siege -c20 www.google.co.uk -b -t30s - -### 封禁一个ip的访问 - - iptables -I INPUT -s 211.1.0.0 -j DROP - diff --git a/_posts/resource/2014-01-15-general-svn-resources.md b/_posts/resource/2014-01-15-general-svn-resources.md deleted file mode 100644 index b176b6f4b3..0000000000 --- a/_posts/resource/2014-01-15-general-svn-resources.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -layout: post -title: SVN 常用资源 -category: 资源 -tags: SVN -keywords: SVN -description: ---- - -## 常用指令 - -### 将文件checkout到本地目录 - - svn checkout path(path是服务器上的目录) - svn checkout svn://192.168.1.1/pro/domain - svn co - -### 往版本库中添加新的文件 - - svn add file - svn add test.php(添加test.php) - svn add *.php(添加当前目录下所有的php文件) - svn add *.php --force(增加所有文件) - -### 将改动的文件提交到版本库 - - svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关) - svn commit -m “add test file for my test“ test.php - svn ci - -### 加锁/解锁 - - svn lock -m “LockMessage“ [--force] PATH - svn lock -m “lock test file“ test.php - svn unlock PATH - -### 更新到某个版本 - - svn update -r m path - svn update 如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。 - svn update -r 200 test.php(将版本库中的文件test.php还原到版本200) - - svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit) - - svn up - -### 查看文件或者目录状态 - - svn status path(目录下的文件和子目录的状态,正常状态不显示) - 【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】 - - svn status -v path(显示文件和子目录状态) - 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。 - - 注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。 - - svn st - -### 删除文件 - - svn delete path -m “delete test fle“ - svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file” - 或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种 - svn (del, remove, rm) - -### 查看日志 - - svn log path - svn log test.php 显示这个文件的所有修改记录,及其版本号的变化 - -### 查看文件详细信息 - - svn info path - svn info test.php - -### 比较差异 - - svn diff path(将修改的文件与基础版本比较) - svn diff test.php - svn diff -r m:n path(对版本m和版本n比较差异) - svn diff -r 200:201 test.php - svn di - -### 将两个版本之间的差异合并到当前文件 - - svn merge -r m:n path - svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下) - -### SVN 帮助 - - svn help - svn help ci - -### 版本库下的文件和目录列表 - - svn list path - svn ls - -### 创建纳入版本控制下的新目录 - - svn mkdir: 创建纳入版本控制下的新目录。 - mkdir PATH… - mkdir URL… - - 创建版本控制的目录。 - - 1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。 - 2、每个以URL指定的目录,都会透过立即提交于仓库中创建.在这两个情况下,所有的中间目录都必须事先存在。 - -### 恢复本地修改 - - svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert: - 用法: revert PATH… - 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录 - -### 代码库URL变更 - - svn switch (sw): 更新工作副本至不同的URL。 - - 1、switch URL [PATH] - 2、switch –relocate FROM TO [PATH...] - 1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。 - - 2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。 - -### 解决冲突 - - svn resolved: 移除工作副本的目录或文件的“冲突”状态。 java设计模式之——策略模式 - 用法: resolved PATH… - 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。 - -### 输出指定文件或URL的内容。 - - svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。 - svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的) - diff --git a/_posts/resource/2014-05-11-general-mysql-resources.md b/_posts/resource/2014-05-11-general-mysql-resources.md deleted file mode 100644 index 5596889c12..0000000000 --- a/_posts/resource/2014-05-11-general-mysql-resources.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -layout: post -title: MySQL常用资源 -category: 资源 -tags: MySQL -keywords: MySQL -description: ---- - -## 常用命令 - -### 登录数据库 - - mysql -h localhost -uroot -p - -### 导出数据库 - - mysqldump -uroot -p db > db.sql - -### 导入数据库 - - mysql -uroot -p db < db.sql - // or - mysql -uroot -p db -e "source /path/to/db.sql" - -### 开启远程登录 - - grant all privileges on ss.* to 'root'@'%' indentified by 'passoword' with grant option; - // or - update user set Host="%" and User="root" - // 注意%是不包含localhost的 - flush privileges; - -### 创建用户 - - CREATE USER 'test'@'localhost' IDENTIFIED BY 'password'; - grant all privileges on *.* to test@'localhost' identified by 'test'; - -### 创建表 - - CREATE SCHEMA testdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; - -### 赋予数据库权限 - - GRANT ALL ON testdb.* TO 'test'@'localhost'; - diff --git a/_posts/resource/2014-08-03-general-mac-resources.md b/_posts/resource/2014-08-03-general-mac-resources.md deleted file mode 100644 index e171ed0af7..0000000000 --- a/_posts/resource/2014-08-03-general-mac-resources.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -layout: post -title: Mac 常用资源 -category: 资源 -tags: Mac -keywords: Mac -description: ---- - -## 常用软件 - -### Alfred - -#### Alfred常用Workflow - -- [Dash](http://kapeli.com/dash) -- [Dict - Lookup Word](https://github.com/liberize/alfred-dict-workflow) -- [Reminders](http://www.alfredforum.com/topic/917-reminders/) -- [Evernote](http://support.alfredapp.com/evernote) -- [Notes](http://www.alfredforum.com/topic/1009-notes/) - -## 常用命令 - -### 开启关闭dashboard - -关闭 - - defaults write com.apple.dashboard mcx-disabled -boolean YES - killall Dock - -开启 - - defaults write com.apple.dashboard mcx-disabled -boolean NO - killall Dock - -### 剪贴板操作 -写入剪切板 - - echo 'test' > pbcopy - cat testfile > pbcopy - -读取剪贴板 - - pbpaste > testfile - pbpaste | cat - -### 开启关闭Hidpi -开启 - - sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES - -关闭 - - sudo defaults delete /Library/Preferences/com.apple.windowserver DisplayResolutionDisabled -### Finder 标题栏显示完整路径 - -``` -defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES -``` - -### 修改Dock隐藏和出现时间 - -```bash -defaults write com.apple.dock autohide-delay -int 0 -defaults write com.apple.dock autohide-time-modifier -float 0.4 -killall Dock -``` - - -### 设置iterm中option为alt(meta)键 - -![option-to-meta](http://7u2ho6.com1.z0.glb.clouddn.com/resource-set-meta-to-alt.png) - -### 删除dropbox冲突文件 - - find . -type f -name "* conflicted *" -exec rm -f {} \; - -### 清空Launchpad(删除掉) - - sqlite3 ~/Library/Application\ Support/Dock/*.db 'DELETE FROM apps;' && killall Dock - -### 重置Launchpad - - rm -f ~/Library/Application\ Support/Dock/*.db && killall Dock - -### 修改Finder中文件夹显示语言 - - # 以Desktop为例 - touch ~/Desktop/.localized - chmod 600 ~/Desktop/.localized - -## 常用快捷键 - -### Chrome - -- 切换用户 `Command + shift + M` diff --git a/_posts/resource/2015-02-13-general-seo-resources.md b/_posts/resource/2015-02-13-general-seo-resources.md deleted file mode 100644 index d6dee04861..0000000000 --- a/_posts/resource/2015-02-13-general-seo-resources.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: post -title: SEO 常用资源 -category: 资源 -tags: SEO -keywords: SEO ---- - -## 小技巧 - -### URL中用`-`分割单词,用`_`关联单词 - -Google 会把 `a-good_reource-of-seo.html` 拆分成关键字:`a`, `good_resource`, `of` 和 `seo`。 \ No newline at end of file diff --git a/_posts/resource/2015-10-04-general-vim-resources.md b/_posts/resource/2015-10-04-general-vim-resources.md deleted file mode 100644 index 0ccbe73923..0000000000 --- a/_posts/resource/2015-10-04-general-vim-resources.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: post -title: Vim 常用资源 -category: 资源 -tags: Vim -keywords: Vim ---- - -## 在粘贴代码时不启动自动缩进 - -粘贴之前输入 `:set paste` -粘贴完后恢复 `:set nopaste` - -## 关闭和开启行号 - -关闭 `:set nonu` -开启 `:set number` - diff --git a/_posts/tech/2012-09-19-php-session-security.md b/_posts/tech/2012-09-19-php-session-security.md deleted file mode 100644 index 94768c793b..0000000000 --- a/_posts/tech/2012-09-19-php-session-security.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -layout: post -title: PHP Session 原理及安全性提升 -category: 技术 -tags: PHP -description: PHP操作Session的原理及提升安全性时的一个问题 ---- - -### Session和Cookie基本介绍 - -相同点:两者都是保存用户的临时信息,以方便用户和网站之间的交互 - -不同点:Session保存在服务器端,只有服务器端才可查看和修改。服务器端通过客户端在cookie中携带的session_id来获得保存在服务器端的用户数据。Cookie保存在客户端,服务端和客户端都可以对其进行修改。 - -### Session的工作原理 - -首先测试如下一段代码 - - ’;//显示此次交互的session_id - ?> - -页面显示结果为 - - Session id:ihrk96384qjvvsqmce0dlkla04 - -即使不停刷新页面,依然不变,说明服务器端是可以识别出客户端,那么它是如何做到的呢? - -我们可以查看一下他们的第一次HTTP交互(先清空一次cookie和缓存再测试) - - Request Header: - GET /phptest/test2.php HTTP/1.1 - Host: localhost - Cookie: - Response Header: - Set-Cookie: PHPSESSID=sastrf9cikeij6meoe3055brq3; path=/ - - -为了说明问题,我只取要用到的信息,从请求头可以看到,这个时候客户端没有给服务端传Cookie内容。而返回的头信息中,服务端指明了set-cookie要设置一个PHPSESSID的内容,保存在”/”目录下。 - -来看第二次交互: - - Request Header: - GET /phptest/test2.php HTTP/1.1 - Host: localhost - Cookie:PHPSESSID=sastrf9cikeij6meoe3055brq3 - Response Header: - Set-Cookie: - - -这一次结果显示服务器端没有再要求写Cookie,而客户端主动上传了上次获得的PHPSESSID值,也就是这种机制,使服务端”认识”了客户端。只要服务端没有要求再次写session,则以后的交互将一直以此session_id作为客户端的身份标志。 - -### 服务器端修改Session_id - -当然session_id不是永久不变的,当我们清空过一次Cookie以后就发现以前登录了的网站都得重新登陆。再次登陆的时候,我们又会以新的session_id来进行重新确认身份。(注:还有别的方式可以传递session_id值,例如query string等)。 - -其实从上一个例子中我们就可以看到,服务器端修改session_id其实是通过重写一次cookie来实现的,这次重写发生在一次请求完成以后,即传回的HTTP头中说明的。 - -为了防止Session劫持,我们可能需要通过每次请求都更改session_id来确保用户是本人登录的。在php中,可以使用以下方式: - - ’; - session_regenerate_id(true);//重置session_id,并使原session无效 - echo ‘New Session id:’.session_id().‘
’; - ?> -页面显示结果为: - - Old Session id:mqk5sfudpu9ikgp49vc825ggo6 - New Session id:mrck9n85v190reupsni4ob6lo5 - -可见session_id在使用了session_regenerate_id()以后发生了变化,变化写入方式同第二点介绍的,服务器端在返回的HTTP头中加入Set-Cookie。 - -### session_regenerate_id()的一个问题 - -在实际操作中,session_id的保存位置可以通过 - - session_set_cookie_params() - -来修改,如下: - - ’; - session_regenerate_id(true);//重置session_id,并使原session无效 - echo ‘New Session id:’.session_id().‘
’; - ?> - -在这种方式下,session_id的默认domain被修改,但是session_regenerate_id()是不识别的。这不知道算不算php的一个bug,为了解决这个问题,我们必须使用手动方式重置session保存,修改代码如下: - - ’; - session_regenerate_id(true);//重置session_id,并使原session无效 - echo ‘New Session id:’.session_id().‘
’; - setcookie(session_name(),session_id(),0,‘/’,‘testdomain’);//手动更新session_id - ?> - -这样一来就可以每次交互更新session_id了……虽然有些复杂,但是经测试可行。 diff --git a/_posts/tech/2012-09-27-open-widown-in-javascript.md b/_posts/tech/2012-09-27-open-widown-in-javascript.md deleted file mode 100644 index e448efe48e..0000000000 --- a/_posts/tech/2012-09-27-open-widown-in-javascript.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -layout: post -title: JS中防止浏览器屏蔽window.open -category: 技术 -tags: JavaScript -description: JS中防止浏览器屏蔽window.open ---- - -有的时候我们需要一些弹出窗来作为临时信息显示,在js代码中直接使用 - - window.open(url,“_blank”,option); - - -即可实现跳转,而且还可以传递一些参数。 - -但是有个问题是,很多浏览器不支持代码触发上述代码,这个问题在平常使用中显得很不方便,尤其是我们经常用ajax返回值来触发一个新页面。 - -为了防止被屏蔽,可以有两种方式解决。 -1、在用户点击事件中增加监听程序 - - - - -2、在点击后先打开空白页,之后再修改地址 - - - \ No newline at end of file diff --git a/_posts/tech/2012-09-27-php-variable-variables.md b/_posts/tech/2012-09-27-php-variable-variables.md deleted file mode 100644 index 73b54dc3d8..0000000000 --- a/_posts/tech/2012-09-27-php-variable-variables.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -layout: post -title: PHP可变变量 -category: 技术 -tags: PHP -description: PHP可变变量 ---- - -### 什么叫可变变量 - -不知道大家在使用php的时候是否遇到这样一种情况,即想将一个变量的内容作为另一个变量的名称。在php中,这个需求可以通过可变变量(Variable variables)来实现。 - -可变变量的一般形式为: - - $var=“foo”; - $$var=1; - - -在这里, 其实等同于向将var展开,然后再以它的值作为真正的变量名 - - $foo=1; - -### 可变变量妙用 -#### 类的动态实例化 - - $var=“foo”; - $a=new $foo; - -#### 循环定义变量 - - for($i=0;$i<10;$i++){ - ${aa.$i}=“a”; - } - -#### 动态调用方法 - - class test_class{ - var $func=‘display_UK’; - function display_UK(){ - echo “Hello”; - } - function display_FR(){ - echo “Bonjour”; - } - function display(){ - $this->{$this->func}(); - } - } \ No newline at end of file diff --git a/_posts/tech/2012-11-08-openstack-nova-internal.md b/_posts/tech/2012-11-08-openstack-nova-internal.md deleted file mode 100644 index 83a32ed1e0..0000000000 --- a/_posts/tech/2012-11-08-openstack-nova-internal.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -layout: post -title: OpenStack Nova内部机制【译】 -category: 技术 -tags: OpenStack -description: 本文经原作者同意后进行转载和翻译 ---- - -> 本文经原作者同意后进行转载和翻译,[原文链接](http://www.sandywalsh.com/2012/04/openstack-nova-internals-pt1-overview.html) - -本人正在学习Openstack源码,为了自己学习和他人学习方便,故可能将一些国外优秀博客翻译转载。本人看英语文章基本顺利,但是翻译却不太在行,也希望通过这个方式提升一下英语水平,如果您发现我翻译后的文章问题太严重,尽管指出,谢谢!另外也希望志同道合的朋友一起探讨有关Openstack的问题! - -作为 核心开发者 ,我已经为 Openstack 的 Nova 项目工作了18个月多。开始的时候这个项目很小,所以你可以很容易的从代码库找到你想要的东西。你的代码不必完全遵守 PEP8 即可提交。但是,对于任何一个项目来说,随着项目的深入,更多琐碎的问题将接踵而来。严格控制异常处理、并发、状态管理、同步异步操作及数据分区变得至关重要。作为核心开发者也越来越难以记住所有的规则,更不用说是一个新的贡献者,所以新的贡献者很难完成第一次提交。 - -出于这个原因,我想我会在我博客中写一些深入介绍Openstack项目的文章,帮助一些人少走弯路。在这开始,我需要先介绍一下Openstack源码布局和基础架构。 - -我将假设你懂得 Cloud IaaS (镜像管理、虚拟机管理器、实例管理、网络管理等概念), Python (如果你是经验丰富的程序员,语言不是问题)还有基于事件驱动的框架(又叫做 Reactor pattern )。 - -### 源码布局 - -在你一拿到Nova的源码后,你会很容易的了解它的主要布局。 - -git clone https://github.com/openstack/nova.git -真正的Nova服务的代码在 ./nova 下,相应的单元测试在 ./nova/tests 下。这是一个简化的Nova源码目录结构: - - ├── etc - │ └── nova - ├── nova - │ ├── api - the Nova HTTP service - │ │ ├── ec2 - the Amazon EC2 API bindings - │ │ ├── metadata - │ │ └── openstack - the OpenStack API - │ ├── auth - authentication libraries - │ ├── common - shared Nova components - │ ├── compute - the Nova Compute service - │ ├── console - instance console library - │ ├── db - database abstraction - │ │ └── sqlalchemy - │ │ └── migrate_repo - │ │ └── versions - Schema migrations for SqlAlchemy - │ ├── network - the Nova Network service - │ ├── notifier - event notification library - │ ├── openstack - ongoing effort to reuse Nova parts with other OpenStack parts. - │ │ └── common - │ ├── rpc - Remote Procedure Call libraries for Nova Services - │ ├── scheduler - Nova Scheduler service - │ ├── testing - │ │ └── fake - “Fakes” for testing - │ ├── tests - Unit tests. Sub directories should mirror ./nova - │ ├── virt - Hypervisor abstractions - │ ├── vnc - VNC libraries for accessing Windows instances - │ └── volume - the Volume service - ├── plugins - hypervisor host plugins. Mostly for XenServer. - -深入看代码前,我们需要仔细了解Nova的架构。Openstack是多个服务的集合,一个服务意味着运行着的一个进程。根据部署Openstack的规模,决定了你是选择将所有服务运行在同一个机器上还是多个机器上。 - -Openstack的核心服务为: API、Compute、Scheduler和Network。你也可能需要管理主机镜像(可存储在 Swift Storage Service )的 Glance Image Service 。我们会在之后深入了解每一个服务,但是现在需要了解他们各自的任务是什么。 API是进入Nova的HTTP接口。Compute和虚拟机管理器交互来运行虚拟机(经常是一个主机一个Compute服务)。Network通过和交换机、路由器、防火墙以及相关设备来管理Ip地址池。Scheduler从可用池中选择最合适的计算节点来创建新的实例(它也可能用来选择Volumes)。 - -数据库本身不是Nova的服务之一。每一个Nova服务都可以直接访问数据库(尽管它不应该这样访问,我们正在修正这个问题)。如果一个计算节点被攻击,我们要避免它来访问数据库。 - -你可能单独的运行一个 Authentication 服务(像Kenstone) 或者负责管理硬盘的 Volume 服务,这都不是必须的。 - -Openstack Nova 使用 AMQP (特别是 RabbitMQ ) 作为服务之间的交流总线。AMQP 信息写入到专门的队列中,然后由专门的服务从中去走进行处理。这个决定了Nova的性能。如果你发现一个单一的计算节点不能处理所有的请求,你可以增加另外一个计算节点,其他服务也可以这么做。 - -如果AMQP是服务之间唯一的交互方式,那么用户如何执行指令?答案是API服务,它是一个HTTP服务(一个Python中的 WSGI 应用)。API服务监听HTTP上的 REST 命令并且将他们转换成相应服务的AMQP消息。同样的,来自服务的相应也通过 AMQP和API服务转换成HTTP相应返回给请求者。 OpenStack当前可以使用 EC2 (亚马逊API) 和 OpenStack (是 Rackspace API 的变种)。我们将在后面的文章中详细介绍API服务。 - -但是不仅仅是API可以和服务交互。服务之间也可以交互。Compute可能需要和Network和Volume交互来获得必须的资源。如果我们不关心怎么组织源码,这些功能会是代码有一点点凌乱。现在,我们开始深入了解服务和RPC机制。 - -### 注释 - -我将使用Python的单元测试模块,方法以及函数。特别的,nova.compute.api:API.run_instance 等同与 ./nova/compute/api.py文件中的run_instance方法。同样的,nova.compute.api.do_something指的是./nova/compute/api.py文件中的do_something函数。 - -和一个服务交互 - -除了API服务,每一个Nova服务必须有一个相应的Python模块来处理RPC命令的封装处理。例如: - -Network服务 ./nova/network/api.py -Compute服务 ./nova/compute/api.py -Scheduler服务 ./nova/scheduler/api.py -… -这些模块通过集合大量函数来使服务正常工作。但是有的时候他们包含一些类来工作。这都依赖与我们是否需要截断一些服务对函数的调用。我们会在接下来接触这些用例。 - -Scheduler服务nova.scheduler.api可能有着最多的简单接口,包含最难的函数。 - -Network是一个有着唯一API类的服务,尽管它可以通过简单的函数被实现。 - -Compute有一个有趣的类层封装,如: - -BaseAPI->API->AggregateAPI -BaseAPI->HostAPI -nova.compute.api.API 是类中的主力,我们将在以后做别的派生。 - -如果我想要暂停一个运行中的实例,我需要导入nova.compute.api,实例化API类并且调用pause()方法。这个过程将封装参数并且将它传送给Compute服务,由Compute通过相应的AMQP队列来管理那个实例。寻找相应的compute服务的AMQP是通过一个数据库的快速扫描实现的,这个方法在nova.compute.api:BaseAPI._cast_or_call_compute_message。对与其他服务也是这样,通过调用相应的api模块然后调用函数。 - -### Cast和Call - -AMQP不是完全的 RPC 机制,但是我们可以从它那里获得类RPC特性。在nova.rpc._init_中有两个调用来操作cast()和call()。cast()在一个服务上执行异步的调用,而call()是一个同步的操作所以它需要一个返回值。call()真正做的是从服务动态创建一个短暂的AMQP来返回消息。它会一直等待一个 eventlet greenthread 直到接收到响应。 - -如果异常是源于nova.exception:NovaException的,那么它也可以通过这个响应传递以及在调用者方重生成/重抛出。否则,一个nova.rpc.common:RemoteError会被抛出。 - -理论上,我们将仅仅执行异步cast()来和服务通信,而call()很明耗费更大的代价。认真选择你需要的,如果可能,尽量不要依赖返回值。同时,尽量使你的函数是幂等的,因为它们可能会在未来一直执行。 - -如果你对rpc-over-amqp的工作原理感兴趣,多看看nova.rpc.impl_kombu - -### Fail-Fast 系统架构 - -Openstack使用的是“快速失败”的系统架构。如果一个请求不成功,则马上返回一个一场丢给其调用者。但是,当一个Nova服务是eventlet中的一个操作时,它一般不会以我们希望的状态终止任何进程或离开系统。一个新的请求可以通过AMQP或HTTP非常容易的被处理。除非我们正在做的一件事情需要显示的进行清理。如果你期望字典中一个确定的值,一个关键错误弹出是正确的。对于不同的错误情况,你不需要常常派生一个独立的异常,甚至在最坏的情况下,WSGI中间件将把它转化成客户端可以处理的。对于事件驱动的编程这是很不错的方式,我们会在后续的文章中讲解nova的错误处理。 - -好了,这是一些Nova源码的布局和服务间如何通讯。下一此我们将探究服务管理器和驱动,来了解服务如何在被调用方实现。 \ No newline at end of file diff --git a/_posts/tech/2012-12-31-python-development-of-sae.md b/_posts/tech/2012-12-31-python-development-of-sae.md deleted file mode 100644 index 6ee43eac20..0000000000 --- a/_posts/tech/2012-12-31-python-development-of-sae.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -layout: post -title: sae下的python开发部署和一个简单例子 -category: 技术 -tags: Python -description: sae下的python开发部署和一个简单例子 ---- - ->以前开发php时,一直在使用[sae](http://sae.sina.com.cn "sae")的平台和服务,非常的喜欢。现在在整openstack,所以改用python做一些东西,为了不来回切换两个语言,我决定学习学习django,方便做一些自己的东西。关于sae下python的使用,[sae官方文档](http://appstack.sinaapp.com/static/doc/release/testing/index.html "sae官方文档")写的非常全面,我这里只是记录自己的一个学习过程 - -## 搭建本地开发环境 - -安装django - - easy_install django - -下载安装本地开发环境 - - git clone https://github.com/SAEPython/saepythondevguide.git - cd dev_server - python setup.py install - -## 创建python项目 - -到sae.sina.com.cn下创建一个python项目 - -进入管理面板创建版本,版本号为1 - -使用svn下载代码 - - svn co https://svn.sinaapp.com/xxxxx/ - -进入主目录,发现一个1的文件夹,这个就是对应的django的工程目录 - - django-admin.py start project mysite - mv mysite/* 1 - -在1下创建配置文件config.yaml,并写入如下内容 - - libraries: - - name: "django" - version: "1.4" - -在1下创建index.wsgi,内容如下 - - import sae - from mysite import wsgi - application = sae.create_wsgi_app(wsgi.application) - -项目创建完毕,在1中执行dev_server.py来启动sae项目,默认localhost:8080访问 - -我在这里遇到一个问题,我是用Windows虚拟的Linux,所以我在Windows下无法通过ip:8080访问到linux。看了d>ev_server.py的代码发现这里host是写死为localhost的,所以我将代码小改动了一下 - - #/usr/local/lib/python2.7/dist-packages/sae_python_dev.../EGG-INFO/scripts/dev_server.py - run_simple(option.host, options.port...) - if __name__ == '__main__': - parser = Option.Parser() - parser.add_option("--host",dest="host",default="localhost") - -这样就能通过增加--host,将外部访问的ip设定好了 - - -## 实现一个简单的投票应用 - -在1目录下,创建应用 - - python manage.py startapp polls - - -修改配置文件settings - - import os - - if 'SERVER_SOFTWARE' in os.environ: - from sae.const import( - MYSQL_HOST, - MYSQL_PORT, - MYSQL_USER, - MYSQL_PASS, - MYSQL_DB - ) - else: - MYSQL_HOST = "localhost" - MYSQL_PORT = "3306" - MYSQL_USER = "root" - MYSQL_PASS = "xxxxx" - MYSQL_DB = "app_polls" - - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': MYSQL_DB, - 'USER': MYSQL_USER, - 'PASSWORD': MYSQL_PASS, - 'HOST': MYSQL_HOST, - 'PORT': MYSQL_PORT, - } - } - ... - TEMPLATE_DIRS = ( - # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. - os.path.join(os.path.dirname(__file__), 'templates'), - ) - - INSTALLED_APPS = ( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - 'django.contrib.messages', - 'django.contrib.staticfiles', - # Uncomment the next line to enable the admin: - 'django.contrib.admin', - # Uncomment the next line to enable admin documentation: - # 'django.contrib.admindocs', - 'polls' - ) - -这里的配置项主要是将SAE和本地开发环境区分开,在SAE环境下使用它们提供的变量就可以直接连接数据库了,不过记得要在SAE控制面板进行初始化 - -配置主urls,即mysite下的urls - - from django.conf.urls import patterns, include, url - - from django.contrib import admin - admin.autodiscover() - - urlpatterns = patterns('', - url(r'^admin/', include(admin.site.urls)), - url(r'^polls/', include('polls.urls')), - ) - -在polls文件夹下修改urls - - from django.conf.urls import patterns, url - - urlpatterns = patterns('polls.views', - url(r'^$', 'index'), - url(r'^(?P\d+)/$', 'detail'), - url(r'^(?P\d+)/results/$', 'results'), - url(r'^(?P\d+)/vote/$', 'vote'), - ) - -在polls文件夹下创建model.py - - from django.db import models - - - class Poll(models.Model): - question = models.CharField(max_length=200) - pub_date = models.DateTimeField('date published') - - - class Choice(models.Model): - poll = models.ForeignKey(Poll) - choice = models.CharField(max_length=200) - votes = models.IntegerField() - -然后在mysql中创建一个add_polls数据库,使用 - - python manage.py syncdb - -同步数据库,这个仅限本地,如果要在sae使用的话,需要本地生成后导入到sae上。 - -在polls文件夹下创建view视图文件 - - from django.shortcuts import render_to_response, get_object_or_404 - from django.template import RequestContext - from django.http import HttpResponseRedirect - from django.core.urlresolvers import reverse - from polls.models import Poll, Choice - - - #主页显示最新的5条投票列表 - def index(request): - latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] - return render_to_response('index.html', {'latest_poll_list': latest_poll_list}) - - - #获得某条信息详细情况 - def detail(request, poll_id): - p = get_object_or_404(Poll, pk=poll_id) - return render_to_response('detail.html', {'poll': p}, - context_instance=RequestContext(request)) - - - #投票 - def vote(request, poll_id): - p = get_object_or_404(Poll, pk=poll_id) - try: - selected_choice = p.choice_set.get(pk=request.POST['choice']) - except (KeyError, Choice.DoesNotExist): - return render_to_response('detail.html', { - 'poll': p, - 'error_message': "You didn't select a choice.", - }, context_instance=RequestContext(request)) - else: - selected_choice.votes += 1 - selected_choice.save() - return HttpResponseRedirect(reverse('polls.views.results', args=(p.id,))) - - - #显示投票结果 - def results(request, poll_id): - p = get_object_or_404(Poll, pk=poll_id) - return render_to_response('results.html', {'poll': p}) - - -在polls下创建templates文件夹,并创建以下三个文件 - -detail.html - - {% raw %} -

{{ poll.question }}

- {% if error_message %}

{{ error_message }}

{% endif %} -
- {% csrf_token %} - {% for choice in poll.choice_set.all %} - -
- {% endfor %} - -
- {% endraw %} - -index.html - - {% raw %} - {% if latest_poll_list %} - - {% else %} -

No polls are available.

- {% endif %} - {% endraw %} - -results.html - - {% raw %} -

{{ poll.question }}

-
    - {% for choice in poll.choice_set.all %} -
  • {{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
  • - {% endfor %} -
- Vote again? - {% endraw %} - diff --git a/_posts/tech/2013-01-30-command-of-kanyun.md b/_posts/tech/2013-01-30-command-of-kanyun.md deleted file mode 100644 index 910c635004..0000000000 --- a/_posts/tech/2013-01-30-command-of-kanyun.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -layout: post -title: kanyun的api-client命令 -category: 技术 -tags: OpenStack -description: kanyun的api-client命令 ---- - - uuid:虚拟机的唯一标识,如08e89e41-d2c2-4c5d-ba2a-c0d180942270 - column_family(metric): 'cpu','vmnetwork','mem_max','mem_free','nic_incoming','nic_outgoing','blk_read','blk_write' - super_column_family:当column_family为vmnetwork,cpu,mem*时为total,其他情况为'vnet0','vda'等 - timestamp: 时间戳,如1357628942 - option:额外选项,用来处理数据,'sum','max','min','avg','sam' - period:时间间隔 - -### 获得某一虚拟机一段时间内某一度量标准记录值 - - api-client -get - api-client -get 08e89e41-d2c2-4c5d-ba2a-c0d180942270 cpu total 1357628942 1357629699 - -### 获得某一虚拟机一段时间内某一度量标准分析值 - - api-client -get