<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Resent Article List]]></title>
<link><![CDATA[http://www.kkito.cn/]]></link>
<description><![CDATA[kkito | kkito.cn | www.kkito.cn ]]></description>
<language>zh_CN</language>
<pubDate>2012-02-08 10:09:01</pubDate>
<lastBuildDate>2012-02-08 10:09:01</lastBuildDate>
<generator>Kkito RSS Generator</generator>
<item>
<title><![CDATA[mongodb使用]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p><a href="http://www.mongodb.org/downloads" target="_blank">http://www.mongodb.org/downloads</a></p>
<p>下载对应的程序<br />./mongod 启动服务<br />/data/db/ 目录没有，报错起不来，新建目录ok<br /><br /><br />./mongo 启动客户端<br />The shell is a full-featured JavaScript interpreter<br /><br />Math.PI<br />a = {"asdf":3123123 , "fee":"fwefwe"}<br />函数等等<br /><br />-------------<br />help # 帮助<br />use foobar(db name) # switch db<br />db # show current db name<br />show dbs<br />show collections<br />...<br />db.help()<br />db.myblog.help()<br />db.myblog.find().help()<br /><br />----------------------<br />post = {"title":.....}<br />db.myblog.insert(post)<br />db.myblog.find(); # 得到所有的数据<br />db.myblog.findOne()<br />db.myblog.findOne({"title":"second article"}) # 按条件查询<br />db.myblog.find({"title":"second article"}) # 得到多个数据<br /><br />var cur = db.myblog.find() # 注意var，没有声明有问题<br />cur.hasNext(); cur.next();<br />cur.forEach(function(x) { })<br /><br /><br />update<br /><br />record = db.myblog.findOne({"title":"first post"})<br />record.title = "my first post"<br />db.myblog.update({"title":"first post"} , record)<br /><br />remove<br /><br />db.myblog.remove({"title":"my first post"})<br /><br /><br />Using Modifiers<br />$inc<br />$set , $unset<br />Array modifiers , $push , $addToSet</p>]]></description>
<pubDate>2012-2-2 16:55:00</pubDate>
</item>
<item>
<title><![CDATA[mldonkey web界面 bt 电驴 linux客户端]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>装载vps上，挺好玩的</p>
<p><a href="http://mldonkey.sourceforge.net/Main_Page" target="_blank">http://mldonkey.sourceforge.net/Main_Page</a></p>
<p>centos6一堆乱七八糟错误，换了debian靠谱了</p>
<p>要加入一些server.met</p>
<p>dl框里面可以运行很多命令，详情见文档</p>
<p>setting可以修改配置</p>
<p>dl框里面加ed2k的链接就开始下载电驴</p>
<p>bt：有个bt链接或者上传bt文件到 ~/.mldonkey下再到dl框出入 startbt xxxx.torrent就可以了有待验证</p>
<p>总之挺不错</p>]]></description>
<pubDate>2011-12-21 13:57:00</pubDate>
</item>
<item>
<title><![CDATA[使用tmux抛弃screen]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>大家都用tmux</p>
<p><a href="http://tmux.sourceforge.net/" target="_blank">http://tmux.sourceforge.net/</a></p>
<p><a href="http://www.openbsd.org/cgi-bin/man.cgi?query=tmux&amp;sektion=1" target="_blank">http://www.openbsd.org/cgi-bin/man.cgi?query=tmux&amp;sektion=1</a><br /><a href="http://www.linuxized.com/2010/05/switching-from-gnu-screen-to-tmux/" target="_blank">http://www.linuxized.com/2010/05/switching-from-gnu-screen-to-tmux/</a><br /><a href="http://superuser.com/questions/302187/can-i-get-tmux-split-screen-to-retain-the-pwd" target="_blank">http://superuser.com/questions/302187/can-i-get-tmux-split-screen-to-retain-the-pwd</a><br /><a href="http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/" target="_blank">http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/</a></p>
<p><br />整了个.tmux.conf文件</p>
<pre class="syntax_python"># C-a ? for help
# use ctrl-a just like screen
set-option -g prefix C-a
unbind-key C-b
bind-key C-a send-prefix

# select next pane
bind-key C-a select-pane -t :.+
# split horizon
bind-key | split-window -h
</pre>
<p>&nbsp;</p>]]></description>
<pubDate>2011-12-16 13:28:35</pubDate>
</item>
<item>
<title><![CDATA[diff patch简单使用]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>生成diff文件<br />最好用diff -c ,一般生成的都是 -uN<br />-r是目录递归，不带参数默认的话单个文件还是挺靠谱的<br />生成的patch文件参数不同样子也不一样，但patch似乎都可以用</p>
<pre class="syntax_python">diff t1.txt t2.txt &gt; t1.txt.patch
patch t1.txt t1.txt.patch
patch -p0 &lt; t1.txt.patch
diff -c t1.txt t2.txt &gt; t1.txt.patch
diff -cr dir1 dir2 &gt; dir.patch
patch -p0 &lt; t1.txt.patch
patch -p0 &lt; dir.patch

diff -uN t1.txt t2.txt &gt; t1.txt.patch
patch -p0 &lt; t1.txt.patch
</pre>
<p>&nbsp;</p>
<p><a href="http://linux.ccidnet.com/art/3067/20070418/1064163_2.html" target="_blank">http://linux.ccidnet.com/art/3067/20070418/1064163_2.html</a></p>
<p><a href="http://www.linuxso.com/command/patch.html" target="_blank">http://www.linuxso.com/command/patch.html</a></p>
<p><a href="http://www.linuxsky.org/doc/admin/200712/213.html" target="_blank">http://www.linuxsky.org/doc/admin/200712/213.html</a></p>
<p>很多介绍的文章</p>]]></description>
<pubDate>2011-12-16 9:47:19</pubDate>
</item>
<item>
<title><![CDATA[客户端使用js渲染模板的技术]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p><a href="http://akdubya.github.com/dustjs/" target="_blank">http://akdubya.github.com/dustjs/</a></p>
<p>博客介绍linkin后端很异构，导致很多页面widget不能重用</p>
<p>所以后端服务都返回json数据，由前端脚本来进行页面模板的实现，比较有启发意义</p>
<p>有空研究看下</p>
<p><a href="https://engineering.linkedin.com/frontend/leaving-jsps-dust-moving-linkedin-dustjs-client-side-templates" target="_blank">https://engineering.linkedin.com/frontend/leaving-jsps-dust-moving-linkedin-dustjs-client-side-templates</a></p>]]></description>
<pubDate>2011-12-15 9:03:28</pubDate>
</item>
<item>
<title><![CDATA[rails路由 controller action request]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize</p>
<p>Inflector有很多方法可以实现camelize, classify, constantize 等等功能</p>
<p>通过 active_support/dependencies.rb 内实现的一个映射关系</p>
<p>由route出发 action_dispatch/routing/route_set.rb</p>
<p>找到对应的controller和action，再通过 Inflector找到对应的类</p>
<p>&nbsp;</p>
<pre class="syntax_ruby">    # ---- lib/action_controller/metal.rb ---
    # Return a rack endpoint for the given action. Memoize the endpoint, so
    # multiple calls into MyController.action will return the same object
    # for the same action.
    #
    # ==== Parameters
    # action&lt;#to_s&gt;:: An action name
    #
    # ==== Returns
    # Proc:: A rack application
    def self.action(name, klass = ActionDispatch::Request)
      middleware_stack.build(name.to_s) do |env|
	# new 新建一个对应controller类的实例
	# name是action的名字
	# 新建了一个request对象
        new.dispatch(name, klass.new(env))
      end
    end
</pre>]]></description>
<pubDate>2011-12-14 14:49:08</pubDate>
</item>
<item>
<title><![CDATA[rails active support notification]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>语言内部实现的一个类似消息服务器的机制，看到log已经应用上去了</p>
<p>挺不错，应该有很多应用可以挖掘，包括看railscast的时候看到rails自身继承了很多notification</p>
<p><a href="http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html" target="_blank">http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html</a><br /><a href="http://railscasts.com/episodes/249-notifications-in-rails-3" target="_blank">http://railscasts.com/episodes/249-notifications-in-rails-3</a></p>
<p>很简单的使用</p>
<pre class="syntax_ruby">require "active_support"
require "active_support/all"
ActiveSupport::Notifications.subscribe(/kktest/) do |*args|
  p args
  if args.size &gt; 2
    p args.size
    event = ActiveSupport::Notifications::Event.new(*args)
    p event.duration
  end
end

ActiveSupport::Notifications.subscribe(/kktest/) do |*args|
  p "i am do other things"
end
ActiveSupport::Notifications.subscribe(/kktest/) do |*args|
  p "i am do third !!!! things"
end
ActiveSupport::Notifications.instrument(:kktest, :extra =&gt; :information) do
  sleep 3
end
ActiveSupport::Notifications.publish(:kktest, :t1=&gt; :t2)
</pre>
<p>&nbsp;</p>]]></description>
<pubDate>2011-12-2 11:19:08</pubDate>
</item>
<item>
<title><![CDATA[rails query cache 同一请求中缓存相同查询(2)]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>接上篇</p>
<p><a title="http://kkito.cn/index.php/blog/getArticle/352/rails_query_cache_同一请求中缓存相同查询" href="/index.php/blog/getArticle/352/rails_query_cache_%E5%90%8C%E4%B8%80%E8%AF%B7%E6%B1%82%E4%B8%AD%E7%BC%93%E5%AD%98%E7%9B%B8%E5%90%8C%E6%9F%A5%E8%AF%A2" target="_blank">http://kkito.cn/index.php/blog/getArticle/352/rails_query_cache_同一请求中缓存相同查询</a></p>
<p>lib/active_record/connection_adapters/abstract/query_cache.rb</p>
<p>中只有一个清空缓存hash的方法 clear_query_cache</p>
<p>代码中不仅覆盖了select_all的方法，而且还覆盖了 insert , update , delete 方法</p>
<pre class="syntax_ruby">        def included(base)
          dirties_query_cache base, :insert, :update, :delete
        end

        def dirties_query_cache(base, *method_names)
          method_names.each do |method_name|
            base.class_eval &lt;&lt;-end_code, __FILE__, __LINE__ + 1
              def #{method_name}(*)                         # def update_with_query_dirty(*args)
                clear_query_cache if @query_cache_enabled   #   clear_query_cache if @query_cache_enabled
                super                                       #   update_without_query_dirty(*args)
              end                                           # end
            end_code
          end
        end
</pre>
<p>在进行更新的时候就会执行一下 clear_query_cache，保证下次查询是直接冲数据库查</p>
<p>但这样过于暴力，如果更新的东西和缓存的根本没有关系，也直接清空了</p>
<p>&nbsp;</p>
<pre class="syntax_ruby">User.first # 通过数据库查询
User.first # 这次走cache
Teacher.first.update_attribute :name , "blahblah" # 会清空整个query cache，但实际上没有必要
User.first # 还是走数据库
User.first # 这次走Cache了
</pre>
<p>&nbsp;</p>]]></description>
<pubDate>2011-12-2 10:13:55</pubDate>
</item>
<item>
<title><![CDATA[rails query cache 同一请求中缓存相同查询]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>rails在同一个请求中，如某个action写</p>
<p>User.first # 第一次会真正的发出请求</p>
<p>User.first&nbsp; # 这次log中看到是从cache中拿的</p>
<p>看了activerecord的源码</p>
<p>lib/active_record/query_cache.rb 覆盖了call方法<br />然后调用cache方法<br />lib/active_record/connection_adapters/abstract/query_cache.rb 实现了cache方法<br />yeild的call方法，最后ensure clear_query_cache<br /><br />与此同时<br />lib/active_record/connection_adapters/abstract/query_cache.rb<br />覆盖了ar的select_all，利用cache_sql的维护的一个hash记录结果<br /><br />clear_query_cache会清除这个hash表<br /><br /><br />多线程不行<br /><br />如果对象被修改了，如何通知那个hash？<br /><br />ActiveSupport Notifications instrument<br /><br />to be continue.......</p>]]></description>
<pubDate>2011-12-1 17:47:51</pubDate>
</item>
<item>
<title><![CDATA[栈区和堆区]]></title>
<link><![CDATA[http://www.kkito.cn]]></link>
<description><![CDATA[<p>堆是用malloc分配的内存，可以用free收回</p>
<p>栈是函数用的，不用收回。是不是也不应该在栈上声明大把空间的变量？</p>
<p>更改栈大小</p>
<p>ulimit -a<br />core file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -c) 0<br />data seg size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -d) unlimited<br />scheduling priority&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-e) 20<br />file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -f) unlimited<br />pending signals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-i) 16382<br />max locked memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -l) 64<br />max memory size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -m) unlimited<br />open files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-n) 1024<br />pipe size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (512 bytes, -p) 8<br />POSIX message queues&nbsp;&nbsp;&nbsp;&nbsp; (bytes, -q) 819200<br />real-time priority&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-r) 0<br />stack size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -s) 8192<br />cpu time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (seconds, -t) unlimited<br />max user processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-u) unlimited<br />virtual memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -v) unlimited<br />file locks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-x) unlimited<br /><br />ulimit -s</p>
<p>man 3 malloc</p>
<p><a href="http://topic.csdn.net/u/20070216/19/a7dde58e-7641-44ea-b14e-dea1e4d3f04d.html" target="_blank">http://topic.csdn.net/u/20070216/19/a7dde58e-7641-44ea-b14e-dea1e4d3f04d.html</a></p>
<p>A&nbsp;&nbsp; 静态数据区：内存在程序启动的时候才被分配，而且可能直到程序开始执行的时候才被初始化，如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整个运行期间都存在，如全局变量，static变量等。<br />注意：初始化的全局变量和静态变量在一块区域，未初始化的全局变量与静态变量在相邻的另一块区域，同时未被初始化的对象存储区可以通过void*来访问和操纵，程序结束后由系统自行释放。<br /><br />B&nbsp;&nbsp; 代码区：存放函数体的二进制代码；<br /><br />C&nbsp;&nbsp; 栈区：存放自动变量。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元由编译器自动释放，超出其作用域外的操作没有定义。栈内存分配运算内置于处理器的指令集中，效率很高，但分配的内存容量有限。栈存放函数的参数值，局部变量的值等。<br /><br />D&nbsp;&nbsp; 堆区（自由存储区）：在运行的时候调用程序（如C中的malloc或C++中的new）分配内存，可以在任何时候决定分配内存及分配的大小，用户自己负责在何时释放内存（如用free或delete）。堆中的所有东西都是匿名的，这样不能按名字访问，而只能通过指针访问。<br /><br /><br />函数指针指向Code区，是程序运行的指令代码，数据指针指向Data,Heap,Stack区，是程序依赖以运行的各种数据<br /><br />在文件作用域声明inline函数默认为static存储类型,const常量默认为static存储，如果加上extern，则为外部存储类型。</p>
<p><a href="http://www.yuanma.org/data/2006/0609/article_744.htm" target="_blank">http://www.yuanma.org/data/2006/0609/article_744.htm</a><br /><a href="http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html" target="_blank">http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html</a></p>]]></description>
<pubDate>2011-11-30 16:04:05</pubDate>
</item>
</channel>
</rss>
