`
tedeyang
  • 浏览: 326632 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

初学ruby,写个域名查询的小程序练练手

阅读更多

前端时间公司出钱买书,我定了本<Programming Ruby>,拿回家了,每天看一点点,半个月的时间也有了点收获.

下面星期天在家里写的一个小程序,起源于我想买个.com域名,心血来潮,想看看还有哪些拼音短域名没被注册过,说不定可以捡个漏呢,哈哈.

 

程序的关键之处在于词库和拼音,还好有人做好了:http://open-phrase.googlecode.com/files/phrase_pinyin_freq_sc_20090402.txt.bz2

这也是ibus所用的词库.

词库中含有中文,拼音以及词频,非常合用.

运行环境:linux,unix,freebsd,macos

 

#!/usr/bin/ruby
# author tedeyang 
# 2010-8-2
#
# A script for running whois command to detect which pinyin can be used for ".com" domain (like:zhongguo.com),the phrases are parsed from ibus phrase lib.  
#
class ReadPhrase
  attr_reader :all
	def initialize(file,lengthRange)
	  @file = file
	  @range = lengthRange
	  @count = 0
	  @runcount = 0
	  @askcount = 0
	  @all = Array.new()
	  @work = File.new("work-#{@range.}.log","w")
	  @get = File.new("domain-#{@range}.log","w")
	  @nowPid = 0
	  @ask = ""
	end
	def initFromFile
	  phraseFile = File.new(@file,'r')
	  keystore = Hash.new
	  phraseFile.each{|line|
	    phrase,pinyin,freq = line.split
	    two = (pinyin =~ /^\w+('\w+){0,2}$/) != nil
	    pinyin.gsub!("'","")
	    if pinyin.length <=8 && two
        # p "#{pinyin}   #{phrase} (词频:#{freq})"
        previousPinyin = @all[keystore[pinyin]] if keystore.has_key?(pinyin)
	      if previousPinyin == nil
	        @all << [pinyin,freq.to_i,phrase]
	        keystore[pinyin] = @count
	        @count = @count + 1
        else
          @all[keystore[pinyin]] = [pinyin,freq.to_i+previousPinyin[1],previousPinyin[2]+","+phrase]
        end
      end
	  }
	  puts "read done!"
	  puts "there are #{@count} phrases in file"
	  @all.sort!{|p1,p2|
	    p1[0].length - p2[0].length
	  }
	  puts "sort done by phrase 's length!"
  end
  
  def unregisted?(phrasePy)
    @askcount += 1
    domain = phrasePy + ".com"
    @work.puts "#{@askcount}-----run whois #{domain}---------------------------begin with #{Time.new}"
    @ask = "whois #{domain}"
    whois = IO.popen(@ask,"r") do |pipe|
      @nowPid = pipe.pid
      result = pipe.read
      @nowPid = 0
      good = (/\s*(No match for).+/ =~ result) != nil
      @work.puts "#{@askcount}-----run whois #{domain}------------#{good}------------end with #{Time.new}"
      @work.flush
      good
    end
    return whois
  end
  
  #start a thread for timeout check
  def startTimeoutKiller
    th = Thread.start {
      while 1
        pid1 = @nowPid.to_i
        sleep(3) #wait for n seconds
        pid2 = @nowPid.to_i
        if pid1==pid2 && pid1>0
          Process.kill 'TERM',pid1 
          p "kill a timeout whois , pid=#{pid1},is '#{@ask}'"
        end
      end
    }
  end
  
  def tryall
    @get.puts "begin "+ Time.new().to_s
    @work.puts "begin "+ Time.new().to_s
    
    @all.each{|p|
     
      if @range===p[0].length && self.unregisted?(p[0])
        puts "Now get domain : "+p.join(' ')
        @get.puts "#{p[0]} #{p[2]} #{p[1]} order[#{@askcount}]"
        @get.flush
        @runcount += 1
      end
      # sleep(3) if @askcount % 10 ==9
      # break if @runcount >1
    }
    puts "done with #{@runcount}!(#{Time.new()}),see run.log"
  end
end

parser = ReadPhrase.new("phrase_pinyin_freq_sc_20090402.txt",6..6)
parser.initFromFile
parser.startTimeoutKiller
# p parser.unregisted?('qidian')
parser.tryall

 代码写得散乱,textmate用得不顺手,缩手缩脚,一点没有用eclipse写java那般行云流水的手感,没办法,写代码也是个经验活,和开车一样,写着写着就有感觉了嘛.

代码没用多线程,只开了个线程检查超时,因为怕whois命令太多导致被封IP,呵呵,机器开了一整夜才跑完1万多个5字母拼音域名.

还有3,4百个汉语拼音没被注册的,有价值的也很少了.

譬如"xieca.com",xieca与"鞋擦"同音,也许对浙江的小商品市场还有那么一丁点商业价值,呵呵,6字母的就太多了,不过双音节的不多.

 

以后还可以写个多线程版本,从godaddy,net.cn查询,效率应该可以提高不少.

 

 

 

2
0
分享到:
评论
2 楼 tedeyang 2010-09-25  
fireflyman 写道
代碼有誤 -->第16行里面的
 @work = File.new("work-#{@range.}.log","w")

@range.應該是沒有點的

-true --->
 @work = File.new("work-#{@range}.log","w")

谢谢这么仔细。
1 楼 fireflyman 2010-08-27  
代碼有誤 -->第16行里面的
 @work = File.new("work-#{@range.}.log","w")

@range.應該是沒有點的

-true --->
 @work = File.new("work-#{@range}.log","w")

相关推荐

    非常多的JAVA初学者测试简单小程序

    非常多的JAVA初学者测试简单小程序非常多的JAVA初学者测试简单小程序非常多的JAVA初学者测试简单小程序非常多的JAVA初学者测试简单小程序非常多的JAVA初学者测试简单小程序非常多的JAVA初学者测试简单小程序非常多的...

    ruby trap 初学者使用

    "Ruby Trap"这个标题暗示了这是一本关于Ruby编程中常见问题和陷阱的电子书,旨在帮助初学者避免在学习过程中遇到的困扰。下面,我们将深入探讨一些可能涵盖在书中的Ruby编程知识点。 1. **变量和常量**: - Ruby有...

    用ruby写的采集程序.zip

    标题中的“用ruby写的采集程序”表明这是一个使用Ruby编程语言编写的网络数据采集脚本。Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而受到开发者喜爱。在Web开发领域,Ruby...

    ruby初学的总结

    此时我对初学者一些总结

    近百个微信小程序模板(含源码)

    本资源包含近百个微信小程序的模板,每个模板都包含了完整的源码,这对于开发者来说是一份非常宝贵的参考资料,无论是初学者还是经验丰富的开发者,都能从中受益。 一、小程序模板的价值 1. 学习参考:这些模板覆盖...

    134个小程序源码打包下载

    本资源包“134个小程序源码打包下载”提供了丰富的学习和实践材料,涵盖多种功能类型,无论是对新手还是有经验的开发者,都能从中受益。 首先,源码是理解编程和软件开发最直接的方式。通过分析这些小程序源码,你...

    使用ruby初学者必备

    ruby初学者必备,和java api一样,很强大。

    java小程序源代码(初学者练手用)

    15个经典的小程序,帮助我很多,希望也可以给你带来一些帮助。

    微信小程序模板(几十个)

    总的来说,"微信小程序模板(几十个)"这个资源对于初学者和开发者来说都是宝贵的工具,它们不仅可以快速启动项目,还可以作为学习和参考的对象,帮助提升微信小程序的开发技能。通过深入研究和实践,你可以掌握从...

    Ruby编程Ruby Programming

    这本面向初学者和高级读者的指南旨在全面介绍Ruby编程语言的基础及其高级特性,因此我们将从多个角度来解析这些内容。 ### 一、Ruby编程语言简介 #### 1.1 Ruby语言的历史与发展 Ruby是一种动态、面向对象的脚本...

    mongo-ruby-driverMongoDB的Ruby驱动程序-源代码

    MongoDB的Ruby驱动程序,即`mongo-ruby-driver`,是用于与MongoDB数据库进行交互的一个关键组件。这个驱动程序允许Ruby开发者利用MongoDB的强大功能,包括文档存储、分布式数据处理以及灵活的数据模型。在本文中,...

    微信小程序+后台(.net)+sql server数据库

    在本项目中,"微信小程序+后台(.net)+sql server数据库"组合形成一个完整的开发环境,适合初学者了解和学习微信小程序的开发流程,以及后端服务与数据库的集成。 首先,微信小程序部分主要涉及以下几个知识点: ...

    20个小程序源码下载

    本资源包提供了20个微信小程序的源码,对于初学者和希望提升技能的开发者来说,是一份宝贵的参考资料。 1. weapp-bear-diary-master.zip:这个源码可能是一个日记类小程序,可以帮助用户记录生活点滴。通过学习这个...

    微信小程序云开发完整源码.rar

    这款"微信小程序云开发完整源码"是针对微信小程序初学者和毕业设计者的一份宝贵资源,它包含了实现具体功能的小程序源代码以及安装指南。 首先,我们要理解微信小程序的基本结构。小程序由JSON配置文件、WXML结构...

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    "Ruby新手学习书"和"Rails_4_days"这两个资源是为初学者设计的,旨在帮助他们快速掌握Ruby语言的基础以及Rails框架的核心概念。 在Ruby语言中文教程中,你将学到以下关键知识点: 1. **基础语法**:Ruby的语法简洁...

    ruby1.8.6-26

    Ruby 1.8.6 是一个古老的 Ruby 语言版本,发布于2009年,主要为Windows用户提供安装程序。这个版本在当时是许多开发者和项目依赖的基础,它包含了对Ruby编程语言的基本特性以及对Windows操作系统的兼容性优化。本文...

    RUBY+1.8 windows UI

    Ruby是一种面向对象、动态类型的编程语言,由松本行弘于1995年创建,设计目标是提高开发者...通过这个安装程序,用户可以享受到完整的开发环境,包括必要的工具和可能附带的IDE,从而专注于编写和运行他们的Ruby代码。

Global site tag (gtag.js) - Google Analytics