IceskYsl@1sters!

程序员…

安装gem:

[root@iceskysl]# gem install spreadsheet –no-ri –no-rdoc
Successfully installed ruby-ole-1.2.10.1
Successfully installed spreadsheet-0.6.4.1
2 gems installed

[root@iceskysl]# gem install spreadsheet –no-ri –no-rdocSuccessfully installed ruby-ole-1.2.10.1Successfully installed spreadsheet-0.6.4.12 gems installed

使用:

require ‘rubygems’

require ‘spreadsheet/excel’

SUM_SPREADSHEET = ‘test.xls’

workbook = Spreadsheet::Excel.new(SUM_SPREADSHEET)

worksheet = workbook.add_worksheet(‘Random numbers and their sum.’)

# sum = 0

# random_numbers = (0..9).collect { rand(100) }

#

# puts “random_numbers=#{random_numbers.size}”

# worksheet.write_column(0, 0, random_numbers)

# worksheet.write_column(0, 1, random_numbers)

worksheet.update_row 4, ‘Hannes Wyss’, ‘Switzerland’, ‘Author’

row = worksheet.row(1)

row.push ‘Creator of Ruby’

row.unshift ‘Yukihiro Matsumoto’

# format = workbook.add_format(:bold => true)

# worksheet.write(10, 0, “Sum:”, format)

# worksheet.write(10, 1, random_numbers.inject(0) { |sum, x| sum + x })

workbook.close

参考:

http://sg552.javaeye.com/blog/701428

http://sunfengcheng.javaeye.com/blog/240130

  • 0 Comments
  • Filed under: Ruby&Rails
  • ruby文件操作大全

    参考:

    http://pleac.sourceforge.net/pleac_ruby/filecontents.html

    ruby文件操作大全 http://www.javaeye.com/topic/517410

    用ruby读写文本文件 http://www.albertsong.com/read-87.html

    Ruby 读取目录(Diretories),文件(files), 网页的几个方法小结

    http://weixuhong.com/rubyruby-on-rails/2008/10/06/ruby-%E8%AF%BB%E5%8F%96%E7%9B%AE%E5%BD%95%EF%BC%88diretories%EF%BC%8C%E6%96%87%E4%BB%B6files-%E7%BD%91%E9%A1%B5%E7%9A%84%E5%87%A0%E4%B8%AA%E6%96%B9%E6%B3%95%E5%B0%8F%E7%BB%93/

  • 0 Comments
  • Filed under: Ruby&Rails
  • Ruby on Rails 3 的相关资料

    1.Rails 3.0 Release Notes – Rails导册对所有Ruby on Rails开发者来说都是很宝贵的资源,这个发布文档介绍了很多API的改进和新特性。

    2.RailsPlugins.org – 提供了很多 Rails 3的插件.

    3.Having Ruby on Rails 3 My Way – Rails 3与Mongoid, Haml, jQuery等的安装

    4.The Rails Module (in Rails 3) -在Rails模块中一些有用的方法

    5.Rails 3 I18n changes – I18n的改变.

    6.Ruby on Rails 3 Screencast series

    ActionController / Rack

    7.Embracing REST with mind, body and soul - José Valim 介绍了 RESTful responders与Rails 3 controller的使用。

    8.Railscasts #224 Controllers in Rails 3 – Rails 3 controllers的新特性.

    9.Render Options in Rails 3 –  Rails 3的渲染的变化.

    10.Adding Routes for tests / specs with Rails 3

    11.32 Rack Resources to Get You Started –  rack相关资源的整合.

    ActionMailer

    12.New ActionMailer API in Rails 3.0 - 如何使用新的ActionMailer.

    13.A Whole New ActionMailer –  ActionMailer的特性.

    ActiveRecord/ActiveModel

    14.ActiveModel: Make Any Ruby Object Feel Like ActiveRecord – ActiveModel的模块化.

    15.Railscasts #219 Active Model - 如何正确的添加ActiveModel 模块到tableless模块.

    16.ActiveRelation: ActiveRecord Gets a Facelift -新的ActiveRecord finder API.

    17.Active Record Query Interface – 自Rails 2以来,ActiveRecord query接口的变化.

    Bundler

    18.Gembundler.com -官方的 Bundler文档,包含一些扩展的文档.

    19.Library Management Gets an Update in Rails 3

    20.Railscasts #201 Bundler - 在Rails 3中,如何使用bundler.

    21.AdventuresInCoding.com screencast on Bundler

    Railties

    22.Rails 3 Internals: Railtie & Creating Plugins –  Railties in Rails 3.

    23.rails-templater – 如何生成一个 greenfield Rails 3 应用.

    24.Making generators for Rails 3 with Thor – 如何使用新的generators ,以及在gem中如何去处理.

    Routes

    25.The Lowdown on Routes in Rails 3 -在 Rails 3创建routes的几个不同的方法.

    26.Rails Routing from the Outside In - 新的 router介绍.

    Plugins

    27.Plugin Authors: Toward a Better Future – Rails 3中创建插件的改变.

    28.Customizing Rails Apps with Plugins - 使用responders, form, devise以及mail form的插件.

    29.Devise 1.1 is out and ready to rock with Rails 3 – Devise 1.1的新特性。

    Books

    30.Beginning Rails 3 – Cloves Carneiro Jr 和 Rida Al Barazi 撰写的 Rails 3 入门书籍,其中有很多实例.

    31.The Rails 3 Way .

    32.Rails 3 In Action - BDD with Cucumber

    33.Rails 3 Upgrade Handbook – Jeremy McAnally的书籍,教你如何从Rails 2 应用升级到Rails 3.

    34.Ruby on Rails Tutorial: Learn Rails by Example – 一步一步的教学习 Rails.

  • 0 Comments
  • Filed under: Ruby&Rails
  • malformed format string on rails~

    在rails中使用find进行模糊查询时,出现了malformed format string输入为字符)或非法字符(输入为数字)的提示。
    (1) @vendors  = Vendor.find(:all,:conditions=>[@sql])
    (2) @vendors = Vendor.find_by_sql(“select * from vendor where “+@sql)
    错误发生在按(1)方式查询过程中,采用(2)方式可以避免这个错误,这间接说明了find_by_sql确实相当不安全。
    查阅了一下资料,对于这个问题的说法如下:Rails uses sprintf (%) on the inside. So, Escape your % with %,因此只要将模糊查询的地方一个百分号全部换成两个便可以解决问题。

  • 0 Comments
  • Filed under: Ruby&Rails
  • ChartsOnRails

    这几天需要找到漂亮的Charts类库,找了几个,发现一个很不粗的,mark下待使用,介绍如下:

    Highcharts is a charting library written in pure JavaScript, offering an easy way of adding interactive charts to your web site or web application. Highcharts currently supports line, spline, area, areaspline, column, bar, pie and scatter chart types.

    有兴趣的可以参考如下连接去看看:

    http://highcharts.com/

    http://railscasts.com/episodes/223-charts

    http://www.spritle.com/blogs/?p=859

  • 1 Comment
  • Filed under: Ruby&Rails
  • Munin LogoIf your running Munin in WHM they you may have noticed the passive netstat connections have been rising steadily over the last couple of weeks. This isn’t a problem with your server, its a Munin bug that can be easily fixed.

    Passive netstat  connection - Munin

    Apparently the problem stemms from Munin counting the passive connections rejected. You can fix this problem quite easily by following the instructions below

    Edit the following file:
    /usr/share/munin/plugins/netstat

    and change the line

    netstat -s | awk ‘/active connections/ { print “active.value ” $1 } /passive connection/ { print “passive.value ” $1 } /failed connection/ { print “failed.value ” $1 } /connection resets/ { print “resets.value ” $1 } /connections established/ { print “established.value ” $1 }’
    to
    netstat -s | awk ‘/active connections/ { print “active.value ” $1 } /passive connection openings/ { print “passive.value ” $1 } /failed connection/ { print “failed.value ” $1 } /connection resets/ { print “resets.value ” $1 } /connections established/ { print “established.value ” $1 }’

    ref:

    http://markmaunder.com/2008/how-to-fix-munins-netstat-passive-connections-increasing-constantly/

    http://www.silverark.co.uk/knowledge/hosting/fix-the-passive-netstat-connections-in-munin

  • 0 Comments
  • Filed under: *UNIX & Mac, Tips
  • 今天在GoogleTalk上朋友发来消息,说有人撰写文章指出我以前开发的一款更换手机壁纸的应用(嵌入了admob和google的广告)中存在偷窃用户隐私数据行为时,我简直不敢相信这是真的;当看到新闻的详细内容时,我更是被震惊了。以下是那段转载文章的原话:

    “拉斯维加斯黑帽大会上,Lookout 的安全人员指出,一个伪装成Android手机壁纸应用的偷窃个人信息程序已经被下载了百万次,它会收集您的个人资料,并将其发送到一个来自中国深圳的神秘网站imnet.us中。安全人员(Kevin MaHaffey)估计这款程序是由正常的壁纸应用修改而来,黑客将其上传到Android Market,希望装饰自己手机的用户因此而中招。泄漏的数据包括浏览历史记录,短信,手机的SIM卡号码,用户识别号,语音邮件,甚至是密码,他警告称每个人都应该警惕来自手机上的威胁。”

    在看完这条消息后,我立马检查了所有代码,防止这款应用在我不知情的情况下,被他人加入恶意代码,但我一无所获。

    现就相关事宜申明如下:

    一、我开发的所有程序都没有侵犯到用户的隐私。

    在这个应用中,申请的全部权限为:

    <uses-permission android:name=”android.permission.INTERNET” />
    <uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />
    <uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
    <uses-permission android:name=”android.permission.SET_WALLPAPER” />
    <uses-permission android:name=”android.permission.READ_PHONE_STATE” />
    <uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION” />

    懂点Android技术的都知道,这些权限都是为了让该软件的功能,能够正常工作所必须的权限(连接网络,获取网络状态,下载壁纸时读写SD卡,设置壁纸,读取手机状态)和Admob的广告精准推送所需要的权限(位置信息,读取手机状态)。
    至于获取用户浏览历史记录、短信、语音邮件密码的这些明显侵犯用户隐私的行为,完全是子虚乌有。一方面并没要申请相关的权限;另一方面我还真不知道怎样获取这些敏感信息。另外,admob的精准广告服务中可能是会针对用户的地理位置等信息推送更准确的广告服务。
    关于这款应用能获取的设备标识号是用来区分设备的唯一性,免去用户注册的麻烦,而能给用户提供收藏图片的功能;而诸如获取手机屏幕大小是为了能够智能适配合适的图片。在这些设备信息中,请问哪一条会侵犯到用户的隐私。
    另外说我可以获取浏览历史信息,这简直就是个天大的笑话。如果懂一点程序的就会知道,要获取浏览器信息必须在程序里申请com.android.browser.permission.READ_HISTORY_BOOKMARKS权限。我的程序完全没有获取到权限,怎么能够获取到历史信息,真是笑话!!!

    二、Android手机的权限管理,在任何没有刷过第三方rom的手机上是很严格的。
    Android手机的权限管理,在任何没有刷过第三方rom的手机上是很严格的,在没有相关权限的情况下,要获取那些信息,是完全不可能的。就算是被刷过Rom的手机,也只有具有该ROM制作人的加密签名的程序,才能完成一些不安全的操作。
    我所需要的权限在用户安装的时候会很明确的告诉用户,下面我就给大家展示一下我应用申请的权限和另外一个著名的壁纸的应用background和一款管理短信的应用申请的权限。

    我的软件需要的权限:

    看看background(另外一款壁纸的应用)申请的权限:

    Handcent SMS申请的权限:

    短信有短信的权限,联系人有联系人的权限,我都没要申请,请问我如何获取相关的信息。

    三、应用主要面向外国用户,但绝对没有获取那些高敏感度的隐私信息!

    该应用主要面向外国用户(国内由于网络原因无法正常使用),连接服务器端能够获取到精确适配终端的图片,这是一款非常有用,也深受用户喜爱的应用。它确实拥有数量众多(几百万)的用户,但绝对没有获取那些高敏感度的隐私信息!我每天都收到很多用户的反馈邮件告诉我这个软件多么棒,给他们带来多少乐趣!

    四、我本人始终与业界同仁一道,希望建立诚实守信、和谐共生的Android产业生态系统。

    随着Android开放性操作平台手机的广泛使用,其应用软件开发市场正呈现蓬勃发展景象。对于提醒用户警惕来自手机上的威胁,我本人向来都是强烈支持的!本人一直始终与业界同仁一道,一直为共建诚实守信、和谐共生的Android产业生态系统而努力,将力量专注于用户需求和技术创新,创造更被用户喜欢的软解,并致力于推动手机应用软件产业持续健康发展。

    在此,本人郑重申明,该应用没有获取任何诸如浏览历史记录,短信,语音邮件密码等这种高敏感度的信息,并和国外的原作者取得联系,让其修正自己的言论并发布公开道歉,同时对于这种不负责任的言论和评价观点,对我及与我相关的应用进行不负责任的报道造成的影响给予补偿,我将保留追究其法律责任的权利。

    ps:

    如果您有其他的疑问或者问题,欢迎你在我sina微博客(http://t.sina.com.cn/iceskysl)或者sohu微博(http://t.sohu.com/iceskysl)给我沟通!

    update:

    写完申明后,去看消息出处看到其竟然做了修改,我早料到其会做相关的行为,所有早些时候截了屏幕如下:

    而现在的文章被修改为:

    看我用鼠标标识的地方,对关键信息进行了修改,感兴趣的人可以去 http://mobile.venturebeat.com/2010/07/28/android-wallpaper-app-that-steals-your-data-was-downloaded-by-millions/ 查看原文,对于这种标题党用子虚乌有的事情炒作,等消息传播后再修改自己的内容算什么行为!而对国内部分媒体在传播时不但不对真实性进行验证,还添油加醋,歪曲意思的报道,我非常无奈(看到有人还说可以获取信用卡信息,还加密传输,我实在无语)。

    按照我个人的感觉,他们应该紧接着要开始拿这个事件来炒作自己的产品了,我个人懒得去关注,如果有人发现有人借此炒作自己的产品,请帮忙分析分析,看看到底是什么人用这样手法。

    再次update!!!

    通过email和mylookout的人取得联系,说明我取得诸如设备号,手机屏幕大小是为了更智能的给设备适配图片,而获取部分的sim卡号是后来用户反馈说自己换了手机还想使用之前的收藏记录才使用的,这些信息只在该应用中使用,并没提供给任何第三方!

    同时让其确认venturebeat上文章中说到的获取浏览器历史,短信息,密码等高敏感性信息是否是他们说的还是写文章的人自己写的(Lots of my users send me the email ask me why I collect their text message and voicemail passward, I just want to make sure whether you and your ceo said that  I collected browsing history,text message ,voicemail passward during the meeting.)。

    其cto给我回复说他们没有说过我的应用获取过诸如text messages or browsing history这些信息( We never stated that the wallpaper applications gathered users text messages or browsing history.),是媒体在撰写和传播的时候错误报道了(A member of the press misreported our research and he has since corrected it. )。

    我非常无语~

    2010年8月4日第二次次update!

    多谢这些天很多朋友的关心,我很好,谢谢!这些天和google android组,lookout公司和venturebeat的作者,以及国内外很多媒体,博客们,记者们都有很多的接触。

    1. google就前段时间将应用暂停和我一起分析了这个应用,今天发来调查的结果:

    Our investigation has concluded that there’s no obvious malicious code in your apps, though the implementation accesses data that it doesn’t need to.  We’ve restored your apps (and they’ll be available on Market again once you publish them), and are looking forward to seeing them updated to use ANDROID_ID.  We are likely to make a statement about this issue this week–I’ll let you know.

    我早就说过,我配合调查,我把代码提供给他们,google也做出了公正的评判,另外也给我提了一些建议(ANDROID_ID)。

    2. 当时写这篇报道的venturebeat记者Dean Takahashi发来了mail,为自己犯的错误道歉,并道歉该事带来的恶劣影响,会再写一篇文章澄清这个事情以消除影响。

    3. 那个安全公司lookout的人写邮件来要于我一起“ We wanted to coordinate with you to prevent further misunderstandings. ”。

    4.好几个不认识的国外记者很负责任,发邮件和gt和我交流询问事情的真相,并帮我喊冤,谢谢这些有职业精神的记者们。

    这个事情到这差不多就结束了,其中看到很多假丑恶,也看到很多真善美!谢谢所有帮助过我的人(很多很多,就不一一列举)。

    def parse_rails_log_file(file)
      # Remove all empty lines
      lines = file.each_line.map(&:strip).reject(&:empty?)
    
      # Use +Enumerable#slice_before+ to slice log file into sections for each request
      lines.slice_before(/Started (GET|POST|PUT|DELETE)/).each_with_object({}) do |request_log, totals|
        # Only include successfully finished actions in report
        if duration = request_log.last[/Completed 200 OK in (?<duration>\d+)ms/, :duration]
          action_name = request_log.first[/Started (GET|POST|PUT|DELETE) "(?<action>.+?)" for/, :action]
          totals[action_name] ||= 0
          totals[action_name] += duration.to_i
        end
      end
    end
    
    if __FILE__ == $PROGRAM_NAME
      require "pp"
      puts "Parsing Rails 3 log file (extracting cumulative running time per request path):"
      puts "================="
    
      log_file = <<-LOG_FILE
      Started GET "/index" for 192.168.74.1 at 2010-03-09 11:37:40
        Processing by UpdatesController#index as HTML
        Update Load (0.5ms)  SELECT `updates`.* FROM `updates` ORDER BY created_at DESC
      Rendered updates/index.html.erb (16.7ms)
      Completed 200 OK in 71ms (Views: 44.3ms | ActiveRecord: 0.5ms)
    
      Started POST "/updates" for 192.168.74.1 at 2010-03-09 11:37:43
        Processing by UpdatesController#create as HTML
        Parameters: {"commit"=>"Save changes"}
        Update Load (0.4ms)  SELECT `updates`.* FROM `updates` ORDER BY created_at DESC
      Rendered updates/index.html.erb (1.3ms)
      Completed 200 OK in 60ms (Views: 32.1ms | ActiveRecord: 0.4ms)
    
      Started GET "/updates" for 192.168.74.1 at 2010-03-09 11:45:51
        Processing by UpdatesController#index as HTML
    
      TypeError (exception class/object expected):
        app/controllers/updates_controller.rb:3:in `raise'
        app/controllers/updates_controller.rb:3:in `index'
    
      Rendered /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.6ms)
      Rendered /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.9ms)
      Rendered /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/layout.erb (23.9ms)
    
      Started GET "/updates" for 192.168.74.1 at 2010-03-09 11:45:58
        Processing by UpdatesController#index as HTML
        Update Load (0.3ms)  SELECT `updates`.* FROM `updates` ORDER BY created_at DESC
      Rendered updates/index.html.erb (1.1ms)
      Completed 200 OK in 100ms (Views: 29.3ms | ActiveRecord: 0.3ms)
      LOG_FILE
    
      pp parse_rails_log_file(log_file) # => {"/index"=>71, "/updates"=>160}
    end
  • 0 Comments
  • Filed under: Ruby&Rails

  • 《Google Android开发入门与实战》是我主导撰写的第一本技术书籍(之前的《Google API 大全》我是参与者),20096月上市后,我GF聊天时问我,对这本书有什么期待,我说:我的期待时做为技术书籍能销量超过1万本。
    到2010年7月的时候,这个期待实现了,人民邮电的编辑张涛说“咱那本书又加印了2000册”,喜,终于过万,回忆下:

    • 2009年6月第一次印刷:5000册
    • 2009年10月第二次印刷:1500册
    • 2009年12月第三次印刷:1500册
    • 2010年3月第四次印刷:1500册
    • 2010年7月第五次印刷:2000册

    这样总数11500册,加上翻译成繁体中文在台湾上市的数量,已经突破预期的1万册大关,做为一个计算类书籍,这个成绩我还是很满意的;至于其被读者提到的排版不精美,内容偏简单等问题,也是在预期之中的。

    对于我主导的第二本书《It’s Android TIME: 创赢路线与产品开发实战》,我还是这个预期,能销出1万本,何时能达到呢,期待中。


    昨天出版社说《It’s Android TIME: 创赢路线与产品开发实战》得书印刷出来了,给我们快递一些过来,早上到公司就收到走宅急送送来得一个箱子,打开果然是《It’s Android TIME: 创赢路线于产品开始实战》,第二本android书籍终于要上市了。
    这本书主要是我策划和组织的,召集了10多个人参与了编写,全书600来页,共16章,从去年10月份开始策划,到现在的7月份,时间还真不短。
    本书立足点不再是单纯的技术,大家应该知道,我写的第一本书《Google Andori开发入门也实战》是国内最早的android书籍,09年6月上市,是09年计算机销量TOP50,刚接到出版社电话,说又重印了2000本,那本书主要是将如何入门android开发,讲的都比较基础,让大家入门android;而本书《It’s Android TIME: 创赢路线与产品开发实战》主要阐述如何分析android的市场,如何找到市场,做出产品,以及和android技术相关的内容,诸如UI设计,赢利模式探讨,传统软件突围等等,不仅仅只是技术。当然,也还是以技术为主,讲了基础开发,底层开发,游戏开发,开发平台产品,源码编译和修改等等,其中我们分析了很多的数据,花了不少心思的。

    推荐序1(Frost&Sullivan中国区总裁 王煜全):http://www.eoeandroid.com/thread-25461-1-1.html
    推荐序2(我学网(开复学生网)负责人 王开源):http://www.eoeandroid.com/thread-25462-1-1.html
    推荐序3(Android技术专家 高焕堂):http://www.eoeandroid.com/thread-25463-1-1.html

    详细目录:

    http://www.eoeandroid.com/thread-25465-1-1.html

    预定购买:
    China-pub互动出版购买地址(预定) :http://www.china-pub.com/196898

    Page::页面

    Calendar::日历

    September 2010
    M T W T F S S
    « Aug    
     12345
    6789101112
    13141516171819
    20212223242526
    27282930  

    RSSTwitter: iceskysl