有跳板机的 ssh 登陆

Written by wd on 五月 6, 2012 Categories: Linux Tags: 

我厂登陆服务器需要先走一个跳板机,不能直接登陆,很是蛋疼。实际上 ssh 早就解决了这个问题。

大意是通过设置 proxycommand 来实现,我也写过一个 http://wdicc.com/cow-ssh-proxycommand/ 。配置如下

# gateways
Host abc
     Hostname abc.com
 
# servers
Host *.xxx
     ProxyCommand ssh abc exec nc %h %p 2>/dev/null

这样所有 .xxx 结尾的机器,都会使用 abc 这个机器来跳了。要注意的是,首先需要你机器和 abc 之间的 ssh 验证,这个使用使用的是你机器的 id_rsa 和 abc.com 的 authorized_keys。然后会是 proxy 起作用,需要你的机器和 .xxx 机器的验证,使用的是你的机器的 id_rsa 和 .xxx 的 authorized_keys,注意并不是 abc.com 和 .xxx 之间。

倒霉的是,我厂有些 gateway 机器还需要使用 token,并不能使用 key 验证。虽然有了上面设置,如果从某个机器 cp 数据的时候,还得来回输入哪个 token,真他妈的 2b。

还好 ssh 还提供了一个 controlmaster,很好的解决了这个问题。

Host *
     User dong.wang
     ServerAliveInterval 30
     ControlMaster auto
     ControlPath /tmp/ssh/master-%r@%h:%p
     ControlPersist yes

上面这个设置是所有服务器启用 controlmaster,哪个 /tmp/ssh 目录可以自己设置,没有就创建一个。哪个 ControlPersist 可以是个时间。

这样设置之后,第一次连接的时候,会启动一个 master。后续连接都会走这个,连接速度很快不说,还完全不需要输入什么 token。并且因为只有 gateway 需要输入 token,所以一个 gateway 只需要输入一次。实在是爽大了,真是居家旅行必备啊。就冲着连接速度快这一点也值了。

一条评论

Postgresql 里面连接其他数据库

Written by wd on  Categories: Linux Tags: , ,

PG 9.x 引入了 fdw,可以通过 pg 去连接其他 db,不仅限于其他 pg,还可以是 mysql,oracle,文件等。按照设计,fdw 还应该提供给查询规划器一些对方 db 的索引等信息,这样在查询过程中可以提升查询速度。

dbi_link

dbi 就是 perl 的 dbi,总的思想就是通过 plperl 写一些 function(所以也给了调试修改的便利),通过 dbi 去连接其他数据库,可以连接的 db 和 dbi 的支持一样。

测试了一下,第一次连接的时候会 cache 对方 db 的信息,对于复杂库没测试成功,只有一个表的库连接成功,并且可以查询。查询的时候就和查询本地库没有区别。

效率上面看,不是很高,每次查询都必然需要获取对方全部数据。就算是有 where 条件,也不会试用到对方 db 的索引。所以综合来看,只是提供了一个简单的方法来获取数据,最好是一次性的。

db_link

db_link 本身是 pg 自带的,contrib 里面的。db_link 只支持 pg,建立连接之后,后续查询可以只指定使用哪个连接即可。

相对 dbi_link,使用起来稍微复杂一点,需要特定的格式。效率上面看,查全表数据比 dbi_link 快。

他有个优势是每次查询对方库的时候都需要指定一个 sql,而如果只需要少量数据的时候,可以在 sql 里面直接使用 where 来过滤数据,这样就能使用对方 db 的索引了,速度快很多。不过就是稍微有点繁琐。

fdw

http://www.postgresonline.com/journal/archives/250-File-FDW-Family-Part-1-file\_fdw.html 这里有个链接,讲了 file fdw。其他 fdw 还没有试过。我理解 fdw 是否能使用对方 db 的索引,还需要看 fdw 的实现。file fdw 提供了类似 oracle 外部表一样的东西。实际上早年间 yahoo 的兄弟写过一个外部表的 pg 扩展的,不知道是不是这个 file fdw 就是从那来的。

没有评论

关于面试的一点经验

Written by wd on 四月 8, 2012 Categories: Heart Tags: 

最近面试了不少,也算有点经验了,阶段总结一下。本文也基本是针对刚毕业的或者毕业没两年的,大牛就别看了,浪费时间。

简历

其实写简历的时候,为了能获得更多的面试机会,通常都会有些夸大,尤其是刚毕业没多久,经验不多的,这个情况更严重。把只看过两次的东西,说成熟悉,把用过几次的说成熟练。

对于新人来说,这么做似乎会增加面试机会。但实际上,没有目的的面试,只会浪费双方的时间。很多次看到简历觉得似乎这个是我们需要的人,叫来问两句明白水平之后,基本就只能让对方走人了。不管怎么样,这对双方都是一个损失。

与其夸大简历寻求面试机会,有时候还不如花点时间上个培训班。我见到过不少上培训班的,可能花 3 个月半年的,来了之后你问问题,答得也还算靠谱。不过上培训班能学到的水平大家也清楚,基本是比较初级的,对于高级职位没有帮助。

总之吧,简历不好夸大,提到的东西至少得是你有自己见解的,否则还不如不提。

面试题

对于技术工程师,很多公司都有面试题。有些求职者可能觉得这个东西挺讨厌的,浪费时间。想知道水平直接聊聊不就完了。

其实面试通常时间都不会很长,在这么短的时间内要决定时不时要一个人,也不是个简单的事情,要了解各方面。通常找工程师的时候,动手能力也是一项。从面试题能看出来动手能力。

看你写 for 循环也能看出来你的基础扎实不扎实。我还真见过不少人使用他熟悉的语言,这些都写错的。

当然,面试题不是一切,也不是不允许有笔误,毕竟现在那么多编辑工具都有提示,真没记住还不行么?错是可以错的,可是别人指出错误的时候你一要能看出来错误在哪里,二要虚心接受错误。别牛逼哄哄的还说什么从来不手写,都在编辑器写之类,那种态度要不得,哪个公司哪个领导都不愿意找一个大爷回来养着,伺候不起的。

面试过程

面试聊天期间大可不必紧张,你的主要目的是表达出来你会的东西。大可不必管对方需要什么样子的人,你合适不合适由对方做判断就好了。

而同时其实面试官也会努力帮你,让你表达出你会的东西。

至于说不会的东西怎么办?如实说就可以了。可以类比,但是千万不要狡辩,你要明白的是对方的水平肯定不会比你差,你的任何狡辩只能让对方觉得你这个人很无知自大。

将来的团队

面试不要只关注工资。一个好的工作环境,一个靠谱的团队,带给你的隐性收入远比眼前的工资来的多。不过说实话,这些收入恐怕1,2年就挖空了,那个时候如果一个公司不能按照行情给一个靠谱的价格,那就比较难能继续留住人了。也是个博弈吧,这些事情不是很懂。

同时,找一个自己喜欢的愿意专研的工作也比较重要。

当然,如果你就是想涨工资,那就另说。

薪资

不要尝试讨价还价。

现在的 IT 公司薪资基本都是不透明的,普通员工通常都只知道自己的工资。

如果你不想让自己觉得被坑,那最好在来面试之前就通过各个渠道去获取一下这个公司的薪资水平,并且确定自己能接受的最低工资是多少,可以通过朋友你自己等对你的评价来判断,不要依赖面试官。另外你工作的前一家公司给你的工资也是一个参考,觉得自己屈才的话,大可以往上提。

综合考虑自己的能力,公司能给你带来的隐性收入,到时候直接报你能接受的最低工资就好了。如果是对方真的觉得你的水平不到那个工资,那也没办法的事情。重要的是自己能接受的最低限度是多少,就不要和对方讨价了,否则就算入职了回头也会郁闷的。

跳槽

如果是跳槽过来的,一般都会问一下为什么从原单位离职。建议如实交代,就算是因为工资不高等觉得好像放不到台面上面的原因。没关系的,诚信是个基本要求。

跳槽也不建议太频繁。虽然现在通过跳槽涨工资是个普遍现象,但是也没有刚那边工作半年就来这边面试,并且要求工资涨 2k 的吧?那你再牛逼也没公司敢要,刚培养到能干活,跑了?

没有评论

org-mode 里面自动归档任务

Written by wd on  Categories: Linux Tags: ,

我想应该有不少人在使用 emacs 的 org-mode 来做笔记,任务管理等。我使用 org-mode 比较多的情况是使用他做一些提纲,类似思维导图一样,以及用它来管理 todo list。

org-mode 本身提供了 remember 来创建 todo list。

新建一个 org 文件 ~/org/todo.org,包含两行内容如下

* Tasks
* Done

然后设置下面的内容

(define-key global-map "\C-ca" 'org-agenda)
(global-set-key (kbd "C-c m r") 'org-capture)
(setq org-capture-templates
      '(("t" "Todo" entry (file+headline "~/org/todo.org" "Tasks")
         "* TODO %?\nCREATED: %U")
        ("j" "Journal" entry (file+datetree "~/org/journal.org")
         "* %?\nEntered on %U\n  %i\n  %a")))
(defun wd-move-done-task-to-done-cats ( task-pos )
  "move done task to *DONE cats"
  (let* ((entry (org-get-entry))
        (title (org-get-heading))
        (task (format "** %s\n%s\n" title entry))
        )
    (goto-char (point-min))
    (when (search-forward-regexp "^* Tasks$latex ")
      (goto-char (point-min))
      (when (search-forward-regexp "^* Done$")
        (goto-char (match-beginning 0))
        (forward-line)      
        (insert task)
        (goto-char task-pos)
        (delete-region (org-entry-beginning-position) (org-entry-end-position))      
        )
      )
    )
  )
 
(defun wd-track-task-status ( changes-plist )
   "Track task status, and move it to '* Done' cats if it is stats change from to to done
1 TODO 文件至少需要包含两个标题 * Tasks 和 * Done
2 * Tasks 里面的 TODO 内容变成 DONE 的时候,会自动把这个条目移动到 * Done
3 org-todo-keywords 的设置里面不能包含自动增加时间等的设置,否则增加的内容不能正确加到这个条目
"
   ;; (interactive)
   (let ((type (plist-get change-plist :type))
          (pos (plist-get change-plist :position))
          (from (plist-get change-plist :from))
          (to (plist-get change-plist :to))
          )
     (when (and (string= from "TODO")
                (string= to "DONE"))
       ;; (let ((answer (read-char "Move this entry to *DONE ? Y/N (Y)")))
       ;;   (when (or (= answer (string-to-char "y"))
       ;;             (= answer (string-to-char "Y"))
       ;;             (= answer (string-to-char "
"))
       ;;             )
           (wd-move-done-task-to-done-cats pos)
         ;; ))
       )
     )
   )
 
(add-hook 'org-trigger-hook 'wd-track-task-status)
 
;; (setq org-todo-keywords
;;       '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)")))
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w)" "|" "DONE(d)" "CANCELED(c)")))

在任何地方按一下 C-c m r,会出来一个 window 让你选择要创建 todo 还是 journal。选 t,然后输入内容就会自动插入到 ~/org/todo.org 的 * Tasks 里面。

此后,如果任务完成的时候,打开 todo.org,然后在任务上面 C-c C-t,会提示输入状态。如果是从 TODO 变成了 DONE,那这条任务会被转移到 * Done 里面。

因为里面都有时间,所以在 agenda list 里面,可以用 L 看到任务完成时间等。也将就用了。

没有评论

mac 里面的 emacs 的几个设置

Written by wd on 三月 6, 2012 Categories: Linux Tags: ,

刚开始在 mac 里面使用 emacs 简直就是自虐,因为那个反人类的 command 按键。一般 pc 上面的 alt 是在 space 旁边的,macbook 的 space 旁边是 command,对于一个需要经常在 mac 里面按的键,不是一般的郁闷。这个问题有两个方法解决。

mac 自带的解决方法

就是在键盘设置里面,把修饰键里面的 command 和 alt 替换一下。这个方法会很不爽,因为 mac 里面的复制粘贴是 command + c/v,以后要按 alt + c/v 的话,距离有点远。

KeyRemap4MacBook

这个是个 mac 上面的软件,地址在 这里 。里面的设置实在太多了,这里要用到的一个就是只在 emacs 里面把 command 和 alt 替换一下,这样就解决了上面提到的问题,还算完美。可是这个时候会发现,在 emacs 界面激活的情况下,command 开头的系统级别的快捷键都不好用了,比如 command + tab,这也很郁闷。

emacs 自带的完美解决方法

只说 emacs23,emacs24。早期的好像有 mac-pass-command-to-system 之类的设置,可我在 emacs24 里面没看到这个变量。

具体设置参考这里 ,主要是下面这些设置。

;; key bindings
(when (eq system-type 'darwin) ;; mac specific settings
  (setq mac-option-modifier 'alt)
  (setq mac-command-modifier 'meta)
  (global-set-key [kp-delete] 'delete-char) ;; sets fn-delete to be right-delete
  )

现在就很爽了,按 command + x 和 alt + x 效果一样,按 command + tab 也能切换窗口。算是完美了。

没有评论

postgres sql 调优一例

Written by wd on 三月 3, 2012 Categories: Linux Tags: ,

前几天发现有个 sql 跑的超慢,第一次拿到 sql 大家简单分析了一下,觉得是写的有问题,里面有对一个大表的查询,数据量大概 800 万,结果还和好几个小表做了 join,而且还是 left join,速度可想而知了。单独对那个大表查询,其实也就是几分钟的事情。

所以建议就是先对小表做 join,然后再和大表做一次 join。不过结果并不理想,时间依然还是那么长。这个时候就得仔细看执行计划了,如下。

能看到虽然人肉对 sql 做了一些优化,但是 sql 并没有按照我们的期望去执行,执行计划里面还是首选去查 fact_tuan_rank_detail 这个大表,速度肯定慢了。

 Nested Loop Left Join  (cost=447.90..1003.43 rows=2 width=620)
   Join Filter: (team.id = team_arrive_city.team_id)
   ->  Nested Loop  (cost=77.62..85.98 rows=1 width=588)
         ->  HashAggregate  (cost=77.62..77.68 rows=1 width=71)
               ->  Index Scan using date_idx on fact_tuan_rank_detail  (cost=0.00..77.60 rows=1 width=71)
                     Index Cond: ((thedate >= '2012-02-25'::date) AND (thedate <= '2012-02-27'::date))
                     Filter: (((source)::text ~~ '%team%'::text) AND ((source)::text !~~ '%today%'::text) AND ((source)::text !~~ '%ongoing%'::text) AND ((s
ource)::text !~~ '%special%'::text))
         ->  Index Scan using team_pkey on team  (cost=0.00..8.28 rows=1 width=32)
               Index Cond: (team.id = fact_tuan_rank_detail.team_id)
               Filter: ((to_timestamp((team.end_time)::double precision))::date > '2012-02-27'::date)
   ->  HashAggregate  (cost=370.29..589.15 rows=14591 width=15)
         ->  Seq Scan on team_arrive_city  (cost=0.00..288.19 rows=16419 width=15)
(12 rows)

仔细研究之后,发现了 rows=1 这个信息。这就是为什么查询分析器先对这个表做查询了,因为他认为这个表最小。

此后对这个表执行了一下 analyse 命令,更新了一些统计信息。然后再看执行计划如下。

 Hash Join  (cost=1210761.12..1326052.45 rows=2282704 width=620)
   Hash Cond: (fact_tuan_rank_detail.team_id = team.id)
   ->  HashAggregate  (cost=1203912.40..1265555.26 rows=1027381 width=71)
         ->  Index Scan using date_idx on fact_tuan_rank_detail  (cost=0.00..1075489.81 rows=10273807 width=71)
               Index Cond: ((thedate >= '2012-02-25'::date) AND (thedate <= '2012-02-27'::date))
               Filter: (((source)::text ~~ '%team%'::text) AND ((source)::text !~~ '%today%'::text) AND ((source)::text !~~ '%ongoing%'::text) AND ((source)
::text !~~ '%special%'::text))
   ->  Hash  (cost=6666.33..6666.33 rows=14591 width=64)
         ->  Merge Left Join  (cost=6414.63..6666.33 rows=14591 width=64)
               Merge Cond: (team.id = b.team_id)
               ->  Sort  (cost=4670.40..4686.82 rows=6567 width=32)
                     Sort Key: team.id
                     ->  Seq Scan on team  (cost=0.00..4254.02 rows=6567 width=32)
                           Filter: ((to_timestamp((end_time)::double precision))::date > '2012-02-27'::date)
               ->  Sort  (cost=1744.23..1780.71 rows=14591 width=40)
                     Sort Key: b.team_id
                     ->  Subquery Scan on b  (cost=370.29..735.06 rows=14591 width=40)
                           ->  HashAggregate  (cost=370.29..589.15 rows=14591 width=15)
                                 ->  Seq Scan on team_arrive_city  (cost=0.00..288.19 rows=16419 width=15)
(18 rows)

可以看到执行计划已经变了,先做其他表的 join,最后再和大表 join。并且提示的执行时间也大致靠谱。

从这里面引申一下,时常会听到有人说 explain 命令执行后得出的执行时间不靠谱,需要使用 explain analyse。可是为什么不靠谱呢,其实 explain analyse 需要的时间和实际执行时间一样,explain 不靠谱的原因是因为数据库对那个表的统计信息不及时导致的。

再进一步了解,postgres 里面这个统计信息为什么不靠谱呢?难道还总是需要我维护这些信息啊?

其实 postgres 里面有个 autovacuum 进程就是做这个事情的。autovacuum 进程默认是启用的。他会在数据库空闲的时候,对数据库做 vavcuum 和 analyse。具体多久执行一次,文档 里面都有写,建议多看看这个页面里面的信息。

此外,还发现 postgres 还提供了很多 数据库状态查询函数 ,使用这里面函数可以查到每个表最后一次 analyse 的时间,vacuum 的时
间,里面索引被使用的情况等等,好多信息。

ps: 使用 analyse 之后,那个 sql 好用了,可是发现过两天又不行了,查看 explain select * from t1 好像没问题,那怎么回事呢?开始没想明白,只好继续 analyse 一下,又好了。可过了两天又不行了。这次得细看了。最后发现是因为真实的 sql 是有 where 条件的,日期条件限定的那部分数据查询分析器认为很少导致了问题。没办法后面只好每次导数都 analyse 一下了。发现 pg_bulkload 导数的方式有点问题。

没有评论

总算是将就同步好了 gentoo 和 mac 的 emacs

Written by wd on 二月 20, 2012 Categories: Heart

mac 里面居然自带了一个 emacs,,版本是 22.1.1,有够老的反正是。因为 gentoo 用的是 emacs24,所以按照不知道哪里推荐的,去下载了一个 emacs24。然后就是尝试在 mac 下面配置好我的 emacs 了,配置好才好通过 org2blog 写 blog。。。

老早就随大流把 .emacs.d 放到了 github,所以这部分比较简单,只要 clone 一下就可以了。

之前没想到的是我的一部分 elisp 包是通过 gentoo 管理的,这样只有 .emacs.d 显然是不行的。然后使用了 dropbox 这个方案,把 gentoo 里面的 site-lisp 部分也同步过来。主要是 usr/share/emacs/etcusr/share/emacs/site-lisp 两个目录。把 gentoo里面的这两个目录转移到 dropbox 里面,然后做个软链。mac 里面也从 dropbox 里面做好软链,要注意路径位置不能变化,变化的话 gentoo 里面的 site-gentoo.el 里面写死的路径就不能用了。不过不变化那个路径的话,其实是会影响系统自带的 emacs22.1.1 的使用的,不过不管了,爱咋匝地吧,反正我也不用那个。

接下来就是在 .emacs 里面加 load-path 就可以了。gentoo 是不需要的,所以用下面的代码

(if (eq system-type 'darwin)
    (setq load-path
        (cons "/usr/share/emacs/site-lisp/" load-path)))

mac 里面用 emacs 一个郁闷的问题是,command 键挤在了 alt 和 space 中间,和普通键盘不一样,导致习惯了普通键盘的我经常按错。很郁闷,不知道能不能把那个 command 弄成 alt,反正好像 command 在 emacs 里面没用。。。

可以用上面类似的方法处理一些两个系统的特例。

顺便再吐槽下 mac 的输入法,装了个 sogou,发现这小子启动慢,经常切换过去后打了几个字母了都,他还没反应,字母就上屏了。fit的词库又不行,词频调整也有问题。‘在’我这半天输入 n 个了都,还是处在‘再’的后面,很讨厌。不知道有没有其他靠谱的。。。

没有评论

mac 上面安装 wine

Written by wd on 二月 13, 2012 Categories: mac

买了 mbp 之后,就尝试安装 wine。想用它搞定 rtx 来着。

我用的 homebrew,感觉还不错。之前尝试过 gentoo prefix,我的妈,要编译的包太多了。homebrew 好很多。

wine 使用 llvm-gcc 编译不过去,需要先安装 gcc,gcc 在 xcode 低版本好像是自带的,高于 4.2.x 好像就不带了。

gcc 也有几个选择,可以参考这里,我用的第一个。

brew install https://raw.github.com/adamv/homebrew-alt/master/duplicates/apple-gcc42.rb
brew install --use-gcc wine

基本上就没问题了,参考了 这里

对了,brew 里面还有 winetricks,可以直接安装使用。还没有尝试安装 rtx,不知道这玩意能不能装上。。

ps: 感觉这片文章好水。。一点含量都没有。。

一条评论

thunderbird 和 davmail 配合连接 exchange

Written by wd on 二月 1, 2012 Categories: Linux Tags: , , ,

exchange 是个恶心玩意,虽然提供了 imap 接口,但是速度巨慢,发送接收都慢。davmail 可以解决这个问题。

davmail 能干啥

davmail 可以理解为就是一个 proxy,他负责和 exchange 通讯,其他邮件客户端连接 davmail 来获取邮件什么的。网站上面有图,看
着更加直观一点。

安装配置 davmail

ubuntu 里面好像直接就有,apt-get 安装就可以了。gentoo 里面没有,我在 overlay 里面找到一个 ebuild,自己修了一下,放到我的
overlay 了,在 net-mail/davmail-bin 下面。启用 server 这个 use。

安装后会创建一个 davmail 用户,需要建立一个 /var/log/davmail 的目录,给 davmail 写权限。

然后手动运行 opt/davmail/davmail.sh,有界面,配置好 exchange owa 的地址,保存,会生成 ~.davmail.properties 文件。

这里有个问题,如果 owa 地址是 http 的,那直接继续下面的就可以了,如果是 https 的,那还需要配置对应的 ssl 相关参数。我是
直接在 thunderbird 里面配置好之后,收了一下邮件,然后会提示一个什么证书的东西,这之后再继续下面的事情就可以了,这个时候
他会给你配置好里面 ssl 相关的东西。

复制到 /etc/davmail.properties,把里面的 davmail.server=fales 改成 true,设置好 log 为 /var/log/davmail/davmail.log,级
别先使用 debug,测试好了之后改成 warn。

配置 thunderbird

参考 davmail 网站上面关于 thunderbird 的配置就好了。

可配置的有接收,发送,地址簿,日历。

排错就看看 /var/log/davmail/davmail.log 把,信息很详细。

没有评论

老文一篇,关于小毛

Written by wd on 十二月 5, 2011 Categories: Heart

一个老文,从 buaa bbs 翻出来,贴这里吧

无题(1)

序曲

好久以前就想养只猫了,可是条件不允许。没法子,只能看看别人pp的小猫过过瘾了。

去年冬天的时候,养猫的欲望越来越严重,以至于那个时候就找robomm定了一个,其间小叶子还和我说要是想养的话可以给我找人抱一只。呵呵,不过后来robomm的大猫好像没有怀孕,结果空欢喜一场。再后来就要过年了,因为照顾起来也不方便,所以就放弃了。过年来了我就在打算抱只小猫了。开始本来打算找宠物市场买一只,可是robomm的那片文章,让我放弃了这个念头,trademark一只在怂恿我去买一只,不过还好我能顶得住,呵呵。平时也不去什么猫的论坛,那就只好让robomm给我留意一下啦,呵呵。

联系

robomm给我介绍的我联系过两个,其中有一个只是发email问了问相片,不过他好久才给我回的,他给我回信时,我都已经和另外一个谈好了,呵呵,那个就是万晓飞。我介绍了我的情况之后,她说可以给我,不过有个条件,就是要送她的大猫一些猫粮,说为了让我付出点代价,这样我至少不会随便处理掉猫猫,我想都没想说没问题,然后就这么说定了。第一眼看到这些小猫的相片的时候,他们还不点大,其实也比现在大不了多少,非常可爱。而我尤其喜欢那个头上有点黑毛的小猫,之后的联系中她也同意给我那只了。高兴中,我就在bbs上面发了帖子,给大家看,那个就是我要的猫。:p

郁闷之初

因为没有满月,所以要等1,2个星期才行。上周一我给他发了个mail问小猫的事情,周二他给我打电话,说我可以过去拿了,不过告诉我那只说好了留给我的给她姐姐了,当时我很郁闷。后来一想,还不都一样啊,呵呵,我说那就拿起他的吧,没关系。然后就说起送大猫什么猫粮的事情来,然后他就说周一有个小mm花了80多块钱的猫粮,其实也就值40多,被骗了。所以让我买罐头好了,7块钱一听。也差不了那么多。期间我也没有问我需要买多少,因为我想,既然都这么联系好了,那多少还不是一个形式而已?而她也一再表示她不是要卖钱。从后来接触中听她的口气,她确实应该不缺钱,北京的有钱人。

没有订到我想要的那个,多少也有点郁闷吧,不过这还好。

郁闷之中

周二她说我工作日晚上都可以过去吧,我说我还没有准备好猫用的东西,所以周三我需要去买点东西,周四吧,她说可以。周二晚上我来bbs问好了robomm,然后周三下午请假去买了猫粮,和一些猫用的东西。周四,我和她联系,问我晚上什么时候过去,让我郁闷的是,她说今天晚上不行。。。。。。

郁闷之极

既然不行,我说那就周五吧,而且我想周五也刚好,抱回来是周末,也好照顾一下她。周五也就是今天了。今天我们部门搬到楼上,从早上9点开始,一直忙到下午6点,还有一些东西没有搞定,不过只能周一了。中午吃完饭我给他发短信问我什么时候过去,后来我就去忙了,结果他给我发的消息我没有看到,后来他给我打电话,然后我们说好了过去的时间,不过中间她问我给大猫买了多少东西,我说6听。然后他就表现出很失望的样子,我立刻郁闷了。。。

我说如果你觉得我买的少了,不够诚心的话,那就算了,我也就不过去了。后来反正两个人jjww了半天,还是说好过去了。

喜悦之初

没想到搬家忙到了6点,这一天我就中午吃饭的时候喝了口水,而且一直搬桌子柜子,脚都疼死了,连坐一下都没有时间,不过总算是忙完了。

站在地铁里面,我的脚一直在疼,想相还要走那么远,稍有点不爽。

到了她家,门口有只黄色的大猫,跑来跑去的,据说他们有三只大猫。还有两只就是现在丁丁(我听他们喊他丁丁,我觉得也挺好听的,而且他确实很小不点,wy还说像只老鼠,呵呵,就这么叫吧 :p)的父母了。

万晓飞给我在沙发下面摸了半天,把丁丁给我摸了出来,呵呵,小不点,然后头顶有点淡黄色的毛,非常可爱。我看到这只小猫,之前的郁闷全都没有啦,哈哈。据说这只猫的眼睛是鸳鸯眼,反正我也不懂了。。。(to be continued…)

无题(2)

说在前面的话

偶得小丁丁的名字在我叫了两天之后,终于没有能顶得住大家的压力,改名叫毛毛啦,小名就叫小毛好了,赫赫。事情是这样的,小猫抱回来之后,大家就开始给她起名字了,如下:小白、小黑、毛球、小红,我一看这可不行啊,而且关键是丁丁大家都不大同意阿,没法子,就叫毛毛吧,其实我一开始就打算叫这个的。这个名字好歹赢得了几个人的同意,赫赫。

继续上次的话题

把小毛塞到包里,我就急急忙忙的出来了。小毛一到包里,就开始喵喵叫个不停,声音很细,可是一直叫,我抱着包,然后赶紧跑出来打了个车就杀回来了。跑上楼,打开包,小毛不叫了,开始环视周围环境,哈哈,肯定吓了一跳。

家有小毛

赶紧给他准备猫粮、猫砂、水、小窝什么的,准备妥当之后,才想起来,我还没有吃饭呢,搬家搬了一天,脚后跟都疼死了。烧水煮了点面,吃完面发现小家伙不见了,喊了半天也没有反映,想想可能钻床地了。床下好多东西,掏了半天才看到,摸出来后,小家伙一溜烟,又跑到下面去了,呵呵,把我郁闷的,再次摸出来后,我就把东西都靠里面的墙边放,这样他就算再跑进去也容易够了。后来还是xh给猫的小窝上面盖了一件衣服,放进去之后小毛才算老实了,在里面呆着,哈哈,原来他是害羞阿。刚抱回来的时候给她拍了几张相片,不过没敢用闪光灯,怕吓着他,所以比较模糊,呵呵,感兴趣的可以到我的ftp上面下。

一个星期左右

现在小毛抱回来大概一个星期左右了吧,刚开始那两天天气比较冷,我这里暖气不是很足,我担心他冻着,所以就把他抱到被子里面呆了两个晚上。后来那几天转暖和了,而且我发现她的眼屎特别严重,怀疑是晚上太热所致,所以后来几天就没有让他钻了。晚上她老是要从被子的边角往里面跑,往往是我每次醒来都会发现他已经在被子里了,然后就把他抱出去,下一次醒来就又来了,呵呵,一点办法都没有。不过这几天发现小家伙懂事多了,困了会爬到你的腿上睡一会,玩一会,要不然就会爬到自己的窝里面睡,晚上也比较少钻被子了。呵呵。

尾声

就说这些了吧,我觉得养一只小猫也没有说的那么恐怖了,你只要让他找到了吃饭喝水方便的地方,基本上就不用你管了,他要是什么找不到,就会和你喵喵的叫得,你要是听到了就把他抱到吃饭喝水的地方,他自己就会去解决了。至于洗澡、打针、剪指甲之类的事情也不是天天都有,所以还是比较省心的,呵呵。

说在后面的话

就是既然上一次的标题用丁丁历险记了,这次还是继续吧,哈哈。

一条评论