<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    簡(jiǎn)易語(yǔ)言

    數(shù)字溝通

     

    置頂隨筆

    [置頂]安裝rails(ruby on rails)

      記得兩年前使用ror做網(wǎng)站,自動(dòng)生成功能記憶猶新,只是當(dāng)時(shí)網(wǎng)絡(luò)知識(shí)實(shí)在缺乏,體會(huì)不到其中的樂(lè)趣。現(xiàn)在了解的很多了,書也有兩本,一直想重新體驗(yàn)最新版做個(gè)網(wǎng)站。安裝這個(gè)過(guò)程實(shí)在有點(diǎn)坑爹,查找網(wǎng)上若干ror的書包括2012年版的書,按照上面的步驟都沒(méi)法安裝完成,搞得我一會(huì)在linux下試驗(yàn),一會(huì)在windows下試驗(yàn),都沒(méi)成功,只好放下。時(shí)間花不少,很不爽的體驗(yàn)。

      好在,過(guò)了一段時(shí)間,忽然想看看ruby的那兩本書,然后就愛(ài)上這個(gè)語(yǔ)言了。于是做一些想做的試驗(yàn),一些試驗(yàn)需要做些配置,對(duì)安裝目錄也就了解了。下載一些插件居然自己跑到了ruby的下載頁(yè)。看到上面居然一個(gè)版本有3樣要下的,幫助文件和安裝文件不就夠了嗎。還要一個(gè)mingw做工具么?這個(gè)不是有自己的官網(wǎng)下載么。也沒(méi)管。想起ruby目錄下include中有i386-mingw32,才聯(lián)系起來(lái)。應(yīng)該是以mingw做make工具的。rails應(yīng)該需要make,因?yàn)槊看伟惭b都拋出make出錯(cuò)信息。雖然有mingw官網(wǎng),但這里應(yīng)該是做成自己的插件。于是到下載頁(yè)http://rubyforge.org/frs/?group_id=167下載相應(yīng)版本的mingw32工具解壓覆蓋到安裝目錄中,要是怕出問(wèn)題先對(duì)目錄做備份

      另外下載不了的都cross wall下載


    C:\Documents and Settings\Administrator>gem install rails
    ERROR:  Error installing rails:
            The 'json' native gem requires installed build tools.

    Please update your PATH to include build tools or download the DevKit
    from 'http://rubyinstaller.org/downloads' and follow the instructions
    at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

      還有錯(cuò),但明顯不是曾經(jīng)報(bào)的make錯(cuò)誤了。
      按照網(wǎng)址下載和遵從上面的方法安裝即可(下面的命令即是按照安裝方法安裝的)
      其中config.yml文件僅僅描述ruby所在路徑,修改成你的ruby路徑即可

    D:\>cd D:\Ruby192\devkit

    D:\Ruby192\devkit>ruby dk.rb init
    [INFO] found RubyInstaller v1.9.2 at D:/Ruby192

    Initialization complete! Please review and modify the auto-generated
    'config.yml' file to ensure it contains the root directories to all
    of the installed Rubies you want enhanced by the DevKit.

    D:\Ruby192\devkit>ruby dk.rb review
    Based upon the settings in the 'config.yml' file generated
    from running 'ruby dk.rb init' and any of your customizations,
    DevKit functionality will be injected into the following Rubies
    when you run 'ruby dk.rb install'.

    D:/Ruby192

    D:\Ruby192\devkit>ruby dk.rb install
    [INFO] Updating convenience notice gem override for 'D:/Ruby192'
    [INFO] Installing 'D:/Ruby192/lib/ruby/site_ruby/devkit.rb'

    D:\Ruby192\devkit>gem install rdiscount --platform=ruby
    Fetching: rdiscount-1.6.8.gem (100%)
    Temporarily enhancing PATH to include DevKit...
    Building native extensions.  This could take a while...
    Successfully installed rdiscount-1.6.8
    1 gem installed
    Installing ri documentation for rdiscount-1.6.8...
    Installing RDoc documentation for rdiscount-1.6.8...

    D:\Ruby192\devkit>ruby -rubygems -e "require 'rdiscount'; puts RDiscount.new('**
    Hello RubyInstaller**').to_html"
    <p><strong>Hello RubyInstaller</strong></p>

    下面安裝rails

    D:\Ruby192\devkit>gem install rails
    Temporarily enhancing PATH to include DevKit...
    Building native extensions.  This could take a while...
    Fetching: rdoc-3.12.gem (100%)
    Depending on your version of ruby, you may need to install ruby rdoc/ri data:

    <= 1.8.6 : unsupported
     = 1.8.7 : gem install rdoc-data; rdoc-data --install
     = 1.9.1 : gem install rdoc-data; rdoc-data --install
    >= 1.9.2 : nothing to do! Yay!
    Fetching: railties-3.2.8.gem (100%)
    Fetching: bundler-1.2.0.gem (100%)
    Fetching: rails-3.2.8.gem (100%)
    Successfully installed json-1.7.5
    Successfully installed rdoc-3.12
    Successfully installed railties-3.2.8
    Successfully installed bundler-1.2.0
    Successfully installed rails-3.2.8
    5 gems installed
    Installing ri documentation for json-1.7.5...
    Installing ri documentation for rdoc-3.12...
    unable to convert U+00A9 from UTF-8 to GBK for lib/rdoc/text.rb, skipping
    Installing ri documentation for railties-3.2.8...
    Installing ri documentation for bundler-1.2.0...
    Installing ri documentation for rails-3.2.8...
    Installing RDoc documentation for json-1.7.5...
    Installing RDoc documentation for rdoc-3.12...
    unable to convert U+00A9 from UTF-8 to GBK for lib/rdoc/text.rb, skipping
    Installing RDoc documentation for railties-3.2.8...
    Installing RDoc documentation for bundler-1.2.0...
    Installing RDoc documentation for rails-3.2.8...

      果然成功了,哈哈

    D:\Ruby192\devkit>rails -v
    Rails 3.2.8

      想做個(gè)實(shí)例,搜一下網(wǎng)上的書,還是不行,那些書最新的2012的都不用命令行做,2011的還是老的命令行方式。根本沒(méi)法用,上官網(wǎng)看就是了。
    D:\Ruby192\devkit>rails new D:/project/ruby/railsapp
          create
          create  README.rdoc
          create  Rakefile
          create  config.ru
          create  .gitignore
          create  Gemfile
          create  app
          create  app/assets/images/rails.png
          create  app/assets/javascripts/application.js
          create  app/assets/stylesheets/application.css
          create  app/controllers/application_controller.rb
          create  app/helpers/application_helper.rb
          create  app/mailers
          create  app/models
          create  app/views/layouts/application.html.erb
          create  app/mailers/.gitkeep
          create  app/models/.gitkeep
          create  config
          create  config/routes.rb
          create  config/application.rb
          create  config/environment.rb
          create  config/environments
          create  config/environments/development.rb
          create  config/environments/production.rb
          create  config/environments/test.rb
          create  config/initializers
          create  config/initializers/backtrace_silencers.rb
          create  config/initializers/inflections.rb
          create  config/initializers/mime_types.rb
          create  config/initializers/secret_token.rb
          create  config/initializers/session_store.rb
          create  config/initializers/wrap_parameters.rb
          create  config/locales
          create  config/locales/en.yml
          create  config/boot.rb
          create  config/database.yml
          create  db
          create  db/seeds.rb
          create  doc
          create  doc/README_FOR_APP
          create  lib
          create  lib/tasks
          create  lib/tasks/.gitkeep
          create  lib/assets
          create  lib/assets/.gitkeep
          create  log
          create  log/.gitkeep
          create  public
          create  public/404.html
          create  public/422.html
          create  public/500.html
          create  public/favicon.ico
          create  public/index.html
          create  public/robots.txt
          create  script
          create  script/rails
          create  test/fixtures
          create  test/fixtures/.gitkeep
          create  test/functional
          create  test/functional/.gitkeep
          create  test/integration
          create  test/integration/.gitkeep
          create  test/unit
          create  test/unit/.gitkeep
          create  test/performance/browsing_test.rb
          create  test/test_helper.rb
          create  tmp/cache
          create  tmp/cache/assets
          create  vendor/assets/javascripts
          create  vendor/assets/javascripts/.gitkeep
          create  vendor/assets/stylesheets
          create  vendor/assets/stylesheets/.gitkeep
          create  vendor/plugins
          create  vendor/plugins/.gitkeep
             run  bundle install
    Fetching gem metadata from https://rubygems.org/.........
    Installing rake (0.9.2.2)
    Installing i18n (0.6.1)
    Installing multi_json (1.3.6)
    Using activesupport (3.2.8)
    Using builder (3.0.0)
    Using activemodel (3.2.8)
    Using erubis (2.7.0)
    Using journey (1.0.4)
    Using rack (1.4.1)
    Using rack-cache (1.2)
    Using rack-test (0.6.1)
    Using hike (1.2.1)
    Using tilt (1.3.3)
    Using sprockets (2.1.3)
    Using sprockets (2.1.3)
    Using actionpack (3.2.8)
    Installing mime-types (1.19)
    Using polyglot (0.3.3)
    Using treetop (1.4.10)
    Using mail (2.4.4)
    Using actionmailer (3.2.8)
    Using arel (3.0.2)
    Using tzinfo (0.3.33)
    Using activerecord (3.2.8)
    Using activeresource (3.2.8)
    Using bundler (1.2.0)
    Installing coffee-script-source (1.3.3)
    Installing execjs (1.4.0)
    Installing coffee-script (2.2.0)
    Using rack-ssl (1.3.2)
    Using json (1.7.5)
    Using rdoc (3.12)
    Installing thor (0.16.0)
    Using railties (3.2.8)
    Installing coffee-rails (3.2.2)
    Installing jquery-rails (2.1.1)
    Using rails (3.2.8)
    Installing sass (3.2.1)
    Installing sass-rails (3.2.5)
    Using sqlite3 (1.3.6)
    Installing uglifier (1.2.7)
    Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem
    is installed.

    D:\Ruby192\devkit>cd D:\project\ruby\railsapp

    D:\project\ruby\railsapp>rails server
    => Booting WEBrick
    => Rails 3.2.8 application starting in development on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    [2012-09-01 06:44:40] INFO  WEBrick 1.3.1
    [2012-09-01 06:44:41] INFO  ruby 1.9.2 (2011-07-09) [i386-mingw32]
    [2012-09-01 06:44:41] INFO  WEBrick::HTTPServer#start: pid=2924 port=3000

      瀏覽器中輸入http://localhost:3000/,熟悉的界面出現(xiàn)


      所以ror厚厚的書讀完也沒(méi)用,可能動(dòng)手連代碼都沒(méi)機(jī)會(huì)敲。

      另外也可以到網(wǎng)站http://railsinstaller.org/下載配置好的安裝包,就免去手動(dòng)配置啦。

    posted @ 2012-09-02 01:17 yangyusong 閱讀(4676) | 評(píng)論 (0)編輯 收藏

    [置頂]涂鴉秀秀游戲項(xiàng)目介紹

      這是六月初完成的一個(gè)游戲

     

    兩個(gè)月時(shí)間終于完成了我們的涂鴉秀秀項(xiàng)目,與同類產(chǎn)品相比,我們內(nèi)容更多些,分為雙人對(duì)戰(zhàn)模式,多人模式,相信可以同時(shí)在線很多人。

     

    技術(shù)上實(shí)踐了一把前后端都js的游戲。算是過(guò)了把小癮。用到nodejssocket.iophonegapexpress框架和其他細(xì)枝末節(jié)。一路上我們披荊斬棘,果然爽。

     

    其實(shí)從項(xiàng)目需求到解決各個(gè)小bug,真是刷了若干個(gè)夜

     

    這樣的項(xiàng)目特點(diǎn)就是能在各手機(jī)上玩,包括ipodpadPc上只要支持canvas也可以一起玩,多好的一個(gè)大融合。當(dāng)然其實(shí)要兼容ie6也不是什么難事,難在我根本沒(méi)時(shí)間理了,真不好意思。簡(jiǎn)單說(shuō)就是跨平臺(tái)。適配的機(jī)器也較多,能有較廣的群眾基礎(chǔ)。

     

    我們也有好友系統(tǒng),分享,邀請(qǐng),當(dāng)然不會(huì)做深,我們的目標(biāo)是先吸引住市場(chǎng),然后再集中力量對(duì)用戶喜歡的點(diǎn)做深入研發(fā)。

     

    做完后同學(xué)陪我玩好長(zhǎng)時(shí)間,他很喜歡玩,這一點(diǎn)讓我比較欣慰。感覺(jué)畫圖游戲來(lái)源于人類的自戀,人類天然喜歡用圖來(lái)表達(dá)意思。只是世界上的系統(tǒng)還是符號(hào)的多。

     

    如圖:

     

    SouApp.com還給我們蓋了章,我特地確認(rèn)了一下,這是人家主動(dòng)蓋的章。在審核的時(shí)候就下載了一百多次。當(dāng)然我也不知道這算什么概念。至少覺(jué)得有人感興趣,其實(shí)這游戲?qū)γ佬g(shù)是樂(lè)事,他們功底好,pc上有自己的畫圖板,畫起來(lái)非常專業(yè)。贏點(diǎn)小禮品根本不是問(wèn)題。當(dāng)然以后的版本會(huì)更好,更吸引人。已經(jīng)有不少想法,可改進(jìn)的地方也不少。

     

     

    如下是一些界面截圖


     

     

    一些小作品

     


     

    下載地址

    http://souapp.com/app_detail/?appid=aaf7a621-205a-4c73-a88b-a5ef3ebb9431

     

    http://www.appchina.com/soft_detail_291505_0_10.html

     

    游戲地址

    m.tuyaxiuxiu.com

    360.tuyaxiuxiu.com

    google.tuyaxiuxiu.com

    官網(wǎng)地址

    www.tuyaxiuxiu.com

     

    兩個(gè)月我們都做了什么?

    美術(shù)需求,協(xié)議定制,詳細(xì)編碼,修bug,手機(jī)測(cè)試,穩(wěn)定服務(wù),官網(wǎng)搭建,后臺(tái)搭建,推廣運(yùn)維。非常多的細(xì)節(jié),充實(shí)有趣。

     

    現(xiàn)已通過(guò)sina,google等各大平臺(tái),能搜到精選,分享,當(dāng)然不是我們自己弄的,比如下面這個(gè)精選,人家是還要注冊(cè)才能下載的社區(qū)。我們自己搞這種就過(guò)頭了。

     

     

    如果大家覺(jué)得兩個(gè)月太長(zhǎng)了,其實(shí)試試就知道,光推廣就夠累的,各個(gè)平臺(tái)各種限制。不玩得技術(shù)欲仙欲死才怪。官網(wǎng),后臺(tái),各種修改更新。甚至圖都要自己改改。開始半個(gè)月,美術(shù)需求就寫了10次,不敢說(shuō)每次都很詳細(xì),但也夠有調(diào)理和詳細(xì)的了。

     

    不過(guò)從中也獲得不少經(jīng)驗(yàn),本來(lái)規(guī)劃非常短的時(shí)間來(lái)完成,這個(gè)按照很理想的條件來(lái)處理的話。當(dāng)然其實(shí)也準(zhǔn)時(shí)完成了,只不過(guò)我們又要了加倍的功能,而我們的人數(shù)從開始實(shí)施時(shí)就減少了一半。這樣的條件下,沒(méi)報(bào)告什么特別的,既然說(shuō)了就做吧,通宵很多個(gè)晚上,弄得我經(jīng)常起不來(lái)。

     

    另一些感觸就是積極加入各種思考分析中就好,根本不要去考慮回報(bào),這個(gè)世界上能去考慮回報(bào)的人并不多。

     

    其實(shí)其中有的地方不太到位,比如分享界面、官網(wǎng)、統(tǒng)計(jì)分析。只能等人來(lái)幫忙了。

     

    如下圖是當(dāng)時(shí)做的一個(gè)極限測(cè)試

     

    當(dāng)時(shí)數(shù)據(jù)量一大就丟失數(shù)據(jù)。于是自己做了個(gè)編碼方式,減少數(shù)據(jù)量,這個(gè)圖證明的就是只要網(wǎng)絡(luò)能傳輸,內(nèi)容再多都能處理。

     

    這個(gè)游戲的不好之處就是必須有一定的玩家基數(shù)才能帶動(dòng)起來(lái)。另外,我們開發(fā)很多功能其實(shí)沒(méi)必要,先開發(fā)主要功能,看市場(chǎng)反應(yīng),在進(jìn)一步開發(fā)才有意義。于是有了下一個(gè)游戲,見(jiàn)下一篇。

    posted @ 2012-07-18 15:49 yangyusong 閱讀(869) | 評(píng)論 (0)編輯 收藏

    [置頂]進(jìn)軍手機(jī)游戲和一些建議

    轉(zhuǎn)眼又過(guò)了幾個(gè)月,但是這幾個(gè)月做了好多游戲,瘋狂了。其中做的第一款游戲今天進(jìn)了google應(yīng)用首頁(yè)最上面的圖。如圖中,有好多金幣那個(gè)圖,就是我們的游戲。一個(gè)非常簡(jiǎn)單的游戲。



    這個(gè)游戲名稱叫砸金幣水果機(jī),我們做了英文版,中文版,ios,andriod版。如下就是英文andriod版,模仿街機(jī)風(fēng)格,頗有懷舊的味道。當(dāng)然技術(shù)上我并不看好這款游戲,但實(shí)際效果卻不好說(shuō),圖片精美,物理效果不錯(cuò),觸發(fā)的神奇界面不少,就看游戲?qū)沤z對(duì)街機(jī)是否著迷過(guò)了。估計(jì)也是這些原因?qū)е卤?/span>google推薦吧,我們也沒(méi)花任何一分錢買推薦。

     

    其實(shí)我更想推薦的是多人網(wǎng)上互動(dòng)的手機(jī)游戲,希望在下一篇給大家做介紹。

     

    現(xiàn)在我們發(fā)現(xiàn)最火的語(yǔ)言成了javascript,原因是html5的推出,其實(shí)原理上講,這個(gè)語(yǔ)言也是必然要火的,首先人類交互最密集的地方轉(zhuǎn)移到互聯(lián)網(wǎng)上了,人類交互的重要性是不言而喻的,就要求我們的網(wǎng)頁(yè)有更多的功能,而這個(gè)功能的提供者第一個(gè)是js,且語(yǔ)言簡(jiǎn)潔,開源,這就奠定了它的競(jìng)爭(zhēng)力基礎(chǔ)。有了這些基礎(chǔ)后,最大數(shù)量的研究人員都會(huì)在這上面。如果將it產(chǎn)業(yè)比喻成火山,那么網(wǎng)絡(luò)這部分就是巖漿部分,就是變化最快的地方。一開始都是最專業(yè)的人研究底層,當(dāng)這些底層成熟后,應(yīng)用層就快速發(fā)展起來(lái),推陳出新非常快。Html5推出將人們最常用的應(yīng)用以很簡(jiǎn)潔的方式表達(dá)出來(lái),nodejsjs推向后端,socket.io加速交互效率和交互設(shè)計(jì)。當(dāng)然有非常多的js框架都出來(lái)了。這里不具體說(shuō)了。

     

    這幾個(gè)月的經(jīng)驗(yàn)總結(jié)希望給大家一些啟發(fā), 如果我們做一個(gè)跨平臺(tái)手機(jī)游戲發(fā)最好做好以下準(zhǔn)備

     

    Js越熟越好,不要以為它真的很簡(jiǎn)單,要做手機(jī)游戲,必須學(xué)會(huì)優(yōu)化,如果是客戶端,要求很高,如果在繪圖時(shí)畫一大堆對(duì)象,andriod一定會(huì)過(guò)不去的。那么就一方面研究js(我的建議是,不要去啃面向?qū)ο螅a清晰,規(guī)范最重要),一方面細(xì)讀html5規(guī)范吧。

     

    java基礎(chǔ),那么在用phonegap打包到andriod系統(tǒng)下時(shí),就能較快明白怎么做配置,怎么添加插件和使用。Javajs都不錯(cuò)的話那么寫點(diǎn)插件也不錯(cuò)。有的功能是必須用插件的哦。

     

    有點(diǎn)andriod設(shè)計(jì)的基礎(chǔ),我是沒(méi)什么基礎(chǔ),所以也花不少時(shí)間研究,其實(shí)就研究它的一些配置關(guān)系。也會(huì)有煩人問(wèn)題的。

     

    有點(diǎn)mac下的xcode基礎(chǔ),xcode的基本的使用最好明白,否則還是要花不少時(shí)間摸索,對(duì)于mac系統(tǒng)的設(shè)計(jì),我實(shí)在不太茍同,雖然我能挺快適應(yīng)。至于oc,會(huì)一些也更好,這樣方便使用插件和寫插件。

     

    想進(jìn)軍app store,越早申請(qǐng)賬號(hào),越早提交越好,遇到的問(wèn)題非常之多。也許怪物英文不好,mac不熟吧。

     

    當(dāng)然硬件上最好有幾個(gè)手機(jī),ipod,pad做測(cè)試,ipad3尤其要測(cè)。

     

    你還會(huì)遇到的問(wèn)題,比如手機(jī)屏幕適配,音樂(lè)的使用,兼容瀏覽器等。

     

     另一個(gè)建議就是認(rèn)準(zhǔn)了自己喜歡的,一頭扎進(jìn)去動(dòng)手就是了。

     

    這篇文章總體質(zhì)量不高,沒(méi)給大家講講技術(shù)細(xì)節(jié),商業(yè)游戲,不太方便哈,會(huì)給大家講開源的。甚至有的地方可能講失誤也歡迎批評(píng)指出。本篇完。

     

    游戲地址1http://app.baidu.com/273943

    游戲地址2

    https://chrome.google.com/webstore/detail/jdjcanmclknahldoohmphkiicmggghdf?hl=zh-CN

    (要在chrome下安裝過(guò)才可玩)

    posted @ 2012-06-13 04:26 yangyusong 閱讀(1547) | 評(píng)論 (2)編輯 收藏

    [置頂]用yecc(erlang)寫一個(gè)json解析器

      昨天寫了個(gè)json的解析器。其實(shí)yecc早看過(guò)了,只是那時(shí)對(duì)自己要求太高,想一下子寫個(gè)小語(yǔ)言。然后大腦就陷入混亂... 后來(lái)注意力轉(zhuǎn)移了。就不那么急著去開發(fā)些難道大的。今天回來(lái)一看,覺(jué)得都理解了,實(shí)踐一下,發(fā)現(xiàn)沒(méi)人寫json的,太好了。于是就在紙上寫了一下。晚上沒(méi)事都敲掉計(jì)算機(jī)里試試。果然很好用。廢話就不多說(shuō)了,不專業(yè)的我在readme里面已經(jīng)寫了不少?gòu)U話了。主要也不知道git有沒(méi)規(guī)范約束readme不能寫廢話。其實(shí)被google騙了一下,有人寫過(guò)json的erlang解析,每次我搜yrl,它就主動(dòng)搜url文件。還要點(diǎn)一下堅(jiān)持搜索才行。看看https://github.com/jchris/erlang-json-eep-parser/downloads這上面就是一個(gè)解析器,還好我們寫的不是太像,他寫的更精細(xì)一點(diǎn)。我寫的更容易使用上手。我寫的就到這下載吧https://github.com/yangyusong/erlang_json_parser。

      接著就是講講內(nèi)容了,大學(xué)學(xué)過(guò)編譯原理就很容易理解這其中的內(nèi)容。yrl文件就是erlang中的滿足LALR-1規(guī)范的解析生成器,相似于yacc。會(huì)有很多文章做解釋,這里不詳述。yrl文件或yacc中的.y這類文件就是給我們寫編譯規(guī)則用的,我們寫好一個(gè)推理機(jī)制,按照規(guī)范分解成4部分,放到這一個(gè)文件中,那么yecc就可以給我們生成一個(gè)符合這個(gè)推理規(guī)則的解析器,當(dāng)然這里就是生成.erl的源文件給我們使用,其中會(huì)有parse作為默認(rèn)方法提供給我們解析我們的字符串。

      yrl文件中一共有四部分,其實(shí)三部分分別用Nonterminals Terminals Rootsymbol關(guān)鍵字來(lái)標(biāo)識(shí),意義很明顯,非終結(jié)符,終結(jié)符,起始符(這個(gè)忘了怎么翻譯)。要解釋一下也行,一個(gè)更好的理解方式就是,非終結(jié)符可以在推理符號(hào)(->)的左邊和右邊,相當(dāng)于函數(shù)作用,最終分析為終結(jié)符的組合。終結(jié)符只能在推理符號(hào)(->)的右邊。意義就是一個(gè)符號(hào)系統(tǒng)的基本集合。 Rootsymbol是其中一個(gè)非終結(jié)符,作為推理的起始點(diǎn)。用一棵解析樹來(lái)表示的話,Rootsymbol就是根節(jié)點(diǎn)。Nonterminals就是樹枝。Terminals就是樹葉。任何一個(gè)符合此推理規(guī)則的字符串都可以用這樣一棵解析樹表示出來(lái)(我就不畫了)。

      除了上面說(shuō)的三部分就剩下最重要的部分了:推理規(guī)則。其實(shí)這四部分都是列表,只不過(guò)Rootsymbol這個(gè)表只有一個(gè)元素。規(guī)則列表有多條,通常每行一條規(guī)則,和erlang一樣用.結(jié)束一條規(guī)則。
    終結(jié)符用單引號(hào)引起,冒號(hào)后面是我們解析后的erlang表達(dá)式。$1,$2,$3這種相似正則表達(dá)式規(guī)則,也說(shuō)一下吧,就是對(duì)冒號(hào)左邊的元素作為列表并從1計(jì)數(shù)。再搞不懂就發(fā)郵局問(wèn)吧,呵呵。

      那么這樣的一個(gè)規(guī)則列表就很好建立了,其實(shí)這個(gè)過(guò)程還是有很多規(guī)則可以遵循的,其中這里遵循了左遞歸,終結(jié)字符先出現(xiàn)的規(guī)則優(yōu)先表達(dá)這兩條規(guī)則。更多,你還可以畫個(gè)有限狀態(tài)機(jī),做一下分析,化解,做成閉包,某些運(yùn)算還要考慮優(yōu)先級(jí)之類。當(dāng)然這里這樣小的結(jié)構(gòu)基本是最優(yōu)了,沒(méi)什么化解的必要。

    代碼附上
    Nonterminals list object kv_list v_list kv k v. % 7

    Terminals ',' ':' 'element' '[' ']' '{' '}'. % 7

    Rootsymbol object.

    object -> '{' '}' : {}.
    object -> '{' kv_list '}' : { '$2' }.


    kv_list -> kv ',' kv_list : '$1' , '$3'.
    kv_list -> kv : '$1'.

    kv -> k ':' v : {'$1', '$3'}.

    k -> 'element' : '$1'.

    v -> 'element' : '$1'.
    v -> list : '$1'.
    v -> object : '$1'.

    list -> '[' ']' : [].
    list -> '[' v_list ']' : [ '$2' ].

    v_list -> v ',' v_list : '$1' , '$3'.
    v_list -> v.

      其中object,list就是json中最基本的結(jié)構(gòu)。kv_list就是剝離大括號(hào)后的鍵值對(duì)列表。v_list是剝離中括號(hào)的列表。

      再講講這個(gè)解析器的使用吧,json_parser就是yrl文件生成的解析器了,我們就用這個(gè)解析器來(lái)做解析。文件use_json_parser對(duì)json_parser的使用做了一個(gè)包裝,那就是parser/1函數(shù)了,我們給它傳入json字符串就返回解析后的erlang列表。例如我們輸入use_json_parser:parser("{a, b, c}").就會(huì)返回[{'{',1},
                                            {atom,1,a},
                                            {',',1},
                                            {atom,1,b},
                                            {',',1},
                                            {atom,1,c},
                                            {'}',1},
                                            {'$end',999}]。
      這個(gè)文件還提供一個(gè)測(cè)試函數(shù)了unit_test_()。為了方便大家,我還是講講測(cè)試方法吧。在命令行輸入
    cd erlang_json_parser
    erl -pa ./ebin/ -eval "make:all([{d, 'EUNIT'},{outdir, \"./ebin/\"}, debug_info]) ,eunit:test(\"./ebin\",[]),init:stop()"

      參考更多的解析器制作,可以參考erlang官網(wǎng)提供的計(jì)算表達(dá)式解析,list解析。也可以從其他網(wǎng)站搜到html,xml等的解析,當(dāng)然如果你看得多一點(diǎn)還會(huì)看到aleppo,erlydtl這類的工程。希望更多的人們投入到這些更有意思的開發(fā)中。下次再寫yecc,就不寫這么簡(jiǎn)單的了。哈哈。不要期待在下一篇里出現(xiàn)哦。

    posted @ 2011-12-30 23:28 yangyusong 閱讀(3462) | 評(píng)論 (0)編輯 收藏

    [置頂]一個(gè)小游戲ChainReaction的設(shè)計(jì)(html5)

    本來(lái)一直覺(jué)得js是個(gè)讓人混亂不堪的語(yǔ)言,html5的出現(xiàn)改變了我對(duì)它的看法。到了html5的時(shí)代,各種犀利的設(shè)計(jì)就更明顯的需要js了。看了一些小游戲設(shè)計(jì),忽然來(lái)了興趣,于是寫了幾個(gè)小游戲,這是其中一個(gè)。已經(jīng)開源,歡迎下載https://github.com/yangyusong/ChainReaction

     

    游戲叫連鎖反應(yīng),這個(gè)游戲是看到有人在ipad上面玩的游戲,覺(jué)得好玩,自己實(shí)現(xiàn)一遍。游戲是這樣的,一群小球在區(qū)域內(nèi)彈來(lái)彈去,玩家鼠標(biāo)點(diǎn)擊一個(gè)地方,在一個(gè)圓的范圍內(nèi),小球碰上就會(huì)爆炸,爆炸的過(guò)程中其他小球碰上也會(huì)發(fā)生爆炸,這就叫連鎖反應(yīng)。每一關(guān)爆破一定數(shù)量的小球就算勝利。

     

    我的設(shè)計(jì)中一個(gè)有20關(guān),數(shù)值增長(zhǎng)比較平和,運(yùn)氣不是太差的話都能一次通關(guān)。在說(shuō)有個(gè)再玩本級(jí)的功能,過(guò)一關(guān)的壓力是一點(diǎn)都沒(méi)有。這樣設(shè)計(jì)是為了給工作后的朋友緩解壓力。我們輕松的一點(diǎn)就爆炸一片。

     

    看看截圖


     

    大的那個(gè)灰色的(其實(shí)是半透明的)圓是鼠標(biāo)范圍。其他是彈來(lái)彈去的小球。可以看到,小球是各種顏色的。

     

    我們看看小球的定義

    function Circle(x, y, xSpeed, ySpeed, radius, color, liveTime, state){

        //圓心坐標(biāo)

        this.x = x;

        this.y = y;

        //運(yùn)動(dòng)速度

        this.xSpeed = xSpeed;

        this.ySpeed = ySpeed;

        //半徑

        this.radius = radius;

        //顏色

        this.color = color;

        //生存計(jì)數(shù)器

        this.liveTime = liveTime;

        //狀態(tài):

        this.state = state;

    }

     

    其中生存計(jì)數(shù)器是要和狀態(tài)結(jié)合使用的,狀態(tài)分為如下5個(gè)狀態(tài)

    //小球狀態(tài)

    var SMALL = 0;

    var BIG = 1;

    var EXPEND = 2;

    var END = 3;

    var DIS_VISIBLE = 4;

     

    當(dāng)處于EXPEND狀態(tài)的時(shí)候,就說(shuō)明小球進(jìn)入爆炸狀態(tài),這時(shí)候生存計(jì)數(shù)器就用上了。計(jì)數(shù)器是個(gè)倒計(jì)時(shí),計(jì)時(shí)到零,小球進(jìn)入DIS_VISIBLE狀態(tài)。這時(shí)候小球就不再渲染出來(lái)。

     

    我們的小球有不同大小,不同顏色,看看小球的初始化就知道了,代碼在ObjectMgr.js

    for(i = 0; i < g_StepsArr[g_Steps].ballsNum; i++){

                //_Util.dump_obj(_Color.color_str(new Color(Math.random(), Math.random(), Math.random())));

                var raduis = _Util.random_range(SMALL_RADIUS1, SMALL_RADIUS2);

                this.circles.push(new Circle(

                    _Util.random_range(raduis*2, this.canvasWidth-2*raduis),

                    _Util.random_range(raduis*2, this.canvasHeight-2*raduis),

                    _Util.random(SPEED_MIN, SPEED_MAX),

                    _Util.random(SPEED_MIN, SPEED_MAX),

                    raduis,

                    _Color.color_rgba_str(new Color1(Math.random(), Math.random(), Math.random(), 0.8)),

                    MID_LIVE_TIME,

                    SMALL

                    ));

            }

     

    其中g_StepsArr負(fù)責(zé)我們關(guān)卡的管理,有這一關(guān)的小球數(shù),和通關(guān)需要爆破的小球數(shù)。總之,這里按照本關(guān)需要的小球數(shù)初始化小球,可以看到里面有很多的隨機(jī)函數(shù)使用。小球的半徑處于如下兩個(gè)數(shù)之間

    var SMALL_RADIUS1 = 3;

    var SMALL_RADIUS2 = 10;

    通過(guò)random_range來(lái)進(jìn)行這個(gè)范圍隨機(jī)。我們看到速度也是隨機(jī)的,范圍是

    var SPEED_MIN = 10;

    var SPEED_MAX = 50;

    顏色中的color_rgba_str函數(shù)的第四個(gè)參數(shù)說(shuō)明我們的每個(gè)小球的透明度是0.8,這樣我們就能在爆破的時(shí)候,或彈動(dòng)的時(shí)候仍然看清其他小球。這段代碼就說(shuō)到這。

     

    我們講講主要流程,其實(shí)其中的詳細(xì)注釋,我覺(jué)得已經(jīng)可以教會(huì)很多初學(xué)者。不過(guò)還是講講好。主要流程就在Main.js中。負(fù)責(zé)初始化,渲染和循環(huán)。開始我們?cè)O(shè)置了一堆全局變量。

    var g_ObjectMgr = null;

    var g_MouseEventDispatch = new MouseEventDispatch();

    var g_MouseMgr = null;//g_MouseMgrg_ObjectMgr初始化后才初始化

    //當(dāng)前關(guān)

    var g_Steps = 1;//todo 顯示出來(lái)

    //關(guān)卡數(shù)組

    var g_StepsArr = [];

    g_StepsArr = stepsInit();

    //爆炸開始標(biāo)識(shí)

    var _ExpendStart = false;

     

    if(DEBUG){

        _CircleLib.test();

    }

    var _Main = { 。。。

     

    包括關(guān)卡數(shù)組,當(dāng)前關(guān)數(shù),爆炸標(biāo)識(shí)等。居然還設(shè)置了一個(gè)是否調(diào)試的狀態(tài)量,其實(shí)我也不知道js調(diào)試怎樣才好,基本就按自己的方式調(diào)。 _Main是個(gè)很大的結(jié)構(gòu)。我更寧愿把它當(dāng)做單例來(lái)思考。主要是,它包括了渲染,這個(gè)渲染不具通用性,僅此一例就夠。其他地方用了且不是畫出什么就難說(shuō)了。當(dāng)然已經(jīng)設(shè)計(jì)其實(shí)我會(huì)更多考慮通用性的設(shè)計(jì),盡量不設(shè)計(jì)成這種單例。

     

    這個(gè)_Main結(jié)構(gòu)中有我們的畫布canvas,我們的初始化函數(shù),每關(guān)調(diào)用一次,它來(lái)負(fù)責(zé)2d對(duì)象的初始化,游戲?qū)ο蟮某跏蓟J髽?biāo)監(jiān)聽初始化。然后就是進(jìn)入我們的循環(huán)。循環(huán)很簡(jiǎn)單,就干四件事情

    /*

         * 循環(huán)繪圖

         * 1.清空畫面

         * 2.游戲?qū)ο箨P(guān)系處理

         * 3.渲染出來(lái)

         * 4.循環(huán)調(diào)用

         */

        step: function(){

            this.clear();

            g_ObjectMgr.step();

            this.render();

            _this = this;

            this._st = setTimeout(function(){

                _this.step();

            }, 50);

        }

     

    看看我們的下一關(guān)都干些什么

    /*

         * 下一關(guān)

         */

        nextStep: function(){

            clearTimeout(this._st);

            if(this.canvas.getContext)

            {

                g_MouseEventDispatch.start();

                this.initObjects();

                this.step();

            }

        }

    它就是清除計(jì)時(shí)器,重新分配事件,初始化對(duì)象。然后進(jìn)入循環(huán),為什么是這樣呢?清除計(jì)時(shí)器以使我們之前的循環(huán)停止。因?yàn)槲覀凂R上有新的循環(huán)了,其實(shí)事件可以看做有兩個(gè)狀態(tài),我們按下鼠標(biāo)的時(shí)候,這個(gè)事件就不可用了,下次使用必須初始化。小球數(shù)量變了,必須按照本關(guān)的需求來(lái)初始化。進(jìn)入循環(huán),新的循環(huán)開始。

    看看再玩一次(本級(jí))按鈕的調(diào)用:

    /*

         * 再玩一次(本級(jí))

         */

        again: function(){

            this.nextStep()

        }

     

    為什么居然是調(diào)用下一關(guān)呢?只能說(shuō)我設(shè)計(jì)的太懶惰,nextStep()本身根本不管關(guān)卡的變更。關(guān)卡的變更完全在爆炸檢查函數(shù)里,一旦發(fā)現(xiàn)小球爆炸,就會(huì)修改當(dāng)前關(guān)卡。而單純調(diào)用nextStep所使用的關(guān)卡是未改變過(guò)的,故而是在玩本級(jí)。

     

    我們?cè)倏匆幌?/span>ObjectMgr.js中的爆炸檢查函數(shù)

     

    expendCheck: function(){

            if(_ExpendStart){

                this.expendNum = _CircleLib.intersect(this.circles, g_MouseMgr.mouseCircle);

    //            _Util.dump_obj(g_StepsArr[g_Steps])

                if(this.expendNum >= g_StepsArr[g_Steps].killNum){

                    var next = g_Steps + 1;

                    alert("成功爆破超過(guò)"+this.expendNum+"個(gè)小球,恭喜進(jìn)入第"+ next + "關(guān),\n\

    下一關(guān)需要爆破" +g_StepsArr[g_Steps + 1].killNum + "個(gè)小球");

                    g_Steps++;

                    _Main.init();

                }

            }

        }

     

    還記得_ExpendStart這個(gè)變量的意思么?就是說(shuō)鼠標(biāo)是否按下了,按下的話我們就要檢查是否有小球撞上鼠標(biāo)范圍或撞上爆炸中的小球。其實(shí)這里的調(diào)用_CircleLib.intersect這個(gè)函數(shù)是有些小問(wèn)題的。它是通過(guò)引用修改的當(dāng)前小球的狀態(tài),至于為什么有很少量的小球未修改狀態(tài),這個(gè)我還沒(méi)弄明白。總之,這個(gè)函數(shù)檢查了爆炸小球的數(shù)量,一旦爆炸小球的數(shù)量符合本關(guān)的要求,那么就可以進(jìn)入下一關(guān),可以看到我們進(jìn)入下一關(guān)的提示是一個(gè)對(duì)話框,不是很友好,可以設(shè)計(jì)為一個(gè)圖片較好,可惜我沒(méi)時(shí)間找美術(shù)。

     

    點(diǎn)擊確定,我們玩下一關(guān)

     

    小球多了很多,找個(gè)好點(diǎn)的位置,能捕捉很多小球。

    看一下爆炸過(guò)程吧:


    這是第十八關(guān)的一個(gè)爆炸情形,更具體的內(nèi)容歡迎看具體代碼吧,要不還講好長(zhǎng)時(shí)間。

     

    做完這個(gè)例子,發(fā)現(xiàn)其實(shí)非常多的小游戲很好設(shè)計(jì),可惜沒(méi)那么多時(shí)間,再說(shuō)設(shè)計(jì)別人設(shè)計(jì)過(guò)的游戲也不是我的目標(biāo)。設(shè)計(jì)一些有趣的小游戲到手機(jī)里,這個(gè)倒是個(gè)不錯(cuò)的方向

    posted @ 2011-12-18 23:03 yangyusong 閱讀(2139) | 評(píng)論 (2)編輯 收藏

    [置頂]游戲中最近可達(dá)點(diǎn)(用erlang寫一個(gè)簡(jiǎn)單算法)

    游戲中有點(diǎn)擊障礙點(diǎn),人物走到離障礙物最近點(diǎn)的算法。我這給一個(gè)簡(jiǎn)單的算法,這個(gè)問(wèn)題可以復(fù)雜化,另外這個(gè)問(wèn)題應(yīng)該由客戶端來(lái)完成。

    如圖,玩家在b點(diǎn),點(diǎn)擊了a點(diǎn),a在一個(gè)障礙區(qū)(紅色,玩家只能在障礙區(qū)外移到)。這時(shí)候玩家應(yīng)該走到c點(diǎn),我們就需要計(jì)算出c點(diǎn),一個(gè)簡(jiǎn)單的數(shù)學(xué)題,用什么語(yǔ)言都沒(méi)幾行代碼,我就用erlang寫一下。


    障礙物通常都不規(guī)則的,我們只能從a點(diǎn)開始一個(gè)個(gè)點(diǎn)測(cè)試,直到不是障礙點(diǎn),也就是x自增,y=x*tan(A),然后測(cè)試這個(gè)點(diǎn),地圖數(shù)據(jù)都是靜態(tài)的數(shù)據(jù),方便測(cè)試,這里就寫死一個(gè)x為障礙結(jié)束的地方作為障礙檢測(cè)函數(shù)。

    我們還需要一個(gè)記錄表示點(diǎn),tan函數(shù)在erlang中是有的,但其實(shí)可以不用,我們就直接要一個(gè)比值,但需要一個(gè)向上取整的函數(shù),據(jù)說(shuō)是round函數(shù),但測(cè)試一下,不行,難道是因?yàn)椴皇亲钚耾tp
    D:\NetBeanPj\mytest\src>erl
    Eshell V5.8.1.1  (abort with ^G)
    1> round(1.2).
    1

    所以這里我們要寫的一個(gè)輔助函數(shù),最后就是我們的重點(diǎn),取最近點(diǎn),用一個(gè)列表解析就夠了,剩下的就看具體實(shí)現(xiàn)吧,還可以寫個(gè)測(cè)試函數(shù),這次就不寫成單元測(cè)試了。好的我們看代碼:
    -module(nearst_point).

    -export([ceil/1, is_barrier/1, nearst_point/2]).

    -export([p1/0, p2/0, test_1/0]).

    %% 一個(gè)點(diǎn)
    -record(point,{
        x,
        y
                  }).

    %% 向上取整
    ceil(Num) ->
        Num1 = round(Num),
        case Num1 >= Num of
            true ->
                Num1;
            false ->
                Num1+1
        end.

    %% 判斷是否是障礙物
    is_barrier(Point) ->
        Point#point.x =/= 5 .

    %% 查找最近點(diǎn)
    nearst_point(Pointa,Pointb) ->
        Tan = (Pointa#point.x - Pointb#point.x)/(Pointa#point.y - Pointb#point.y),
        case Pointa#point.x > Pointb#point.y of
            true ->
                MaxX = Pointa#point.x,
                MinX = Pointb#point.x;
            false ->
                MaxX = Pointb#point.x,
                MinX = Pointa#point.x
        end,
        try
            [
                begin
                    Point = #point{
                        x = X,
                        y = ceil(X*Tan)},
                    case is_barrier(Point) of
                        true ->
                            ok;
                        false ->
                            throw(Point)
                    end
                end|| X <- lists:seq(MinX, MaxX)]
        catch
            throw: Point ->
                io:format("~p", [Point]),
                Point
        end.

    %% 下面函數(shù)測(cè)試用,可以改成單元測(cè)試,這里就免了
    p1() ->
        #point{
            x = 1,
            y = 9}.

    p2() ->
        #point{
            x = 15,
            y = 25}.

    test_1() ->
        nearst_point(p1(),p2()).

    編譯和測(cè)試
    2> c(nearst_point).
    {ok,nearst_point}
    3> nearst_point:test_1().
    {point,5,5}{point,5,5}
    4>

    我們的測(cè)試如預(yù)期的在5那個(gè)點(diǎn)得到,好像有個(gè)小問(wèn)題,怎么這個(gè)點(diǎn)輸出了兩次?哦,這不是問(wèn)題,一個(gè)點(diǎn)是代碼里的io輸出的,一個(gè)點(diǎn)是返回給shell,shell的輸出,看來(lái)寫代碼的人太懶,疑惑也會(huì)增多啊。在nearst_point中用到了一個(gè)小技巧,就是用throw來(lái)跳出循環(huán)(這個(gè)在erlang中還是挺有意思),這次到這,應(yīng)該說(shuō)寫的很基礎(chǔ)很難看。下次會(huì)來(lái)點(diǎn)有意思的,歡迎大家學(xué)習(xí)erlang。

    posted @ 2011-06-24 23:54 yangyusong 閱讀(2883) | 評(píng)論 (0)編輯 收藏

    [置頂]給www.bayke.com做的一個(gè)簡(jiǎn)單seo分析

    曾經(jīng)也是寫java程序,如今也寫起了網(wǎng)站,還做起了seo分析,看到雪落無(wú)聲的兩篇博文:《SEO新手從bayke網(wǎng)站建設(shè)到關(guān)鍵詞排名第一的詳細(xì)步驟》和《做為百客購(gòu)物返利網(wǎng)(bayke)站長(zhǎng),哥感覺(jué)鴨梨很大!》發(fā)現(xiàn)在這個(gè)博客里還有不少同仁,和他一樣也為了推廣自己的網(wǎng)站,開始寫關(guān)于seo的博文,就目前我所掌握給他做一些分析,不知道他會(huì)不會(huì)建議,早點(diǎn)發(fā)現(xiàn)和我聊聊。其實(shí)我和他一樣,感覺(jué)很辛苦,而且我是孤軍奮戰(zhàn),但感覺(jué)死的是自己,也就不是那么在意了,我的網(wǎng)站建得晚,簡(jiǎn)單,效果比他的差,但相信我的分析很實(shí)用。時(shí)間有限,內(nèi)容不會(huì)多。建議從第三條看起。

    1.       我進(jìn)了他的網(wǎng)站:http://www.bayke.com/,內(nèi)容非常豐富,各種分類非常全,一個(gè)正規(guī)的購(gòu)物類網(wǎng)站。我相信它的前途是好的,只是知道的人還太少,產(chǎn)生信任也要一段時(shí)間。

    2.       好像會(huì)定時(shí)自動(dòng)刷新,也許是為了實(shí)時(shí)性。

    3.       他是098月建的網(wǎng)站,我是今年10月建的網(wǎng)站。他的是商業(yè)網(wǎng)站,我的是專業(yè)網(wǎng)站。

    4.       我給他查了一下收錄情況,情況如下:


        也就是說(shuō)谷歌對(duì)它的認(rèn)同比較好,收錄了
    43個(gè)頁(yè)面(或鏈接),有道,必應(yīng)有都有一個(gè)鏈接,百度收錄為0,這個(gè)我懷疑不是很準(zhǔn),用另一家的工具查看,情況如下


        百度有
    26個(gè)反向鏈接,雅虎有43個(gè)反向鏈接,說(shuō)明哥們寫了很多博文,發(fā)了不少鏈接,搜狗收錄了12個(gè)鏈接。百度沒(méi)有收錄或說(shuō)很少,我想原因有3,(1)可能頁(yè)面的定時(shí)刷新被百度認(rèn)為是作弊,(2)可能關(guān)鍵詞的密度太低,我不知道這個(gè)是否真重要到如此程度。(3)百度是個(gè)中文網(wǎng),商品網(wǎng)站的詞對(duì)百度來(lái)說(shuō)基本都是熟詞,但百度幾乎只收錄不熟的,感覺(jué)是原創(chuàng)的網(wǎng)頁(yè)。這些只是猜測(cè)。

    5.       現(xiàn)在做一下密度測(cè)試,百客(或bayke)應(yīng)該作為該站的一個(gè)關(guān)鍵詞,我們看如下查詢結(jié)果:


        結(jié)果告訴我們?cè)谑醉?yè)中,關(guān)鍵詞百客的密度是
    0.2%,而正常的網(wǎng)頁(yè)在2%-8%比較恰當(dāng),當(dāng)然通常不用刻意在意。

    我們?cè)诓橐幌?#8220;瀟灑男裝”分類頁(yè)中的關(guān)鍵字“百客”的密度,如圖:


        頻率特別的小,我對(duì)
    bayke也在這兩個(gè)頁(yè)面查詢,結(jié)果是一樣。建議站長(zhǎng)在各頁(yè)做長(zhǎng)尾關(guān)鍵詞。

    6.       查了一下該站的死鏈接,做的特別好,沒(méi)有死鏈接,如圖


        該站一共兩百多站內(nèi)鏈接,
    20站外鏈接,還能看出站長(zhǎng)用的是php寫的網(wǎng)站。

    7.       網(wǎng)站出錯(cuò)時(shí)返回404是最好的,有很多網(wǎng)站為了美觀頁(yè)面,總對(duì)404錯(cuò)誤做重定向,導(dǎo)致出現(xiàn)301等錯(cuò)誤,這些錯(cuò)誤是會(huì)受到引擎處罰的。貴站這點(diǎn)做的不錯(cuò),返回的是404,如圖:


        時(shí)間有限,下次再接著分析。歡迎到我的網(wǎng)站
    http://www.suchseo.com/了解更多具體seo內(nèi)容和對(duì)網(wǎng)站的分析方法。一定要看看本站分析,seo工具,這些分類,你就知道今天的分析很簡(jiǎn)單,也還算實(shí)用。

    posted @ 2010-10-21 22:21 yangyusong 閱讀(1622) | 評(píng)論 (2)編輯 收藏

    [置頂]什么是躲貓貓

        躲貓貓是云南的一個(gè)游戲,小朋友都愛(ài)玩,躲避的時(shí)間由這段話的時(shí)間來(lái)度量:“蒙貓貓,躲老耗,老耗老耗躲穩(wěn)點(diǎn),不給老貓拿得著,一碗油,二碗油,放個(gè)貓貓拿氣球;一碗水,二碗水,放個(gè)貓貓拿小鬼”。
        躲貓貓事件讓這個(gè)詞變得很熱門,而這段膾炙人口的順口溜卻一直只能在云南的小朋友中口口相傳,小時(shí)候還有很多順口溜,書上并不能見(jiàn),如“XXX,放個(gè)屁,放到意大利,意大利的老板在看戲,聞到這個(gè)屁,真生氣...”,xxx表示任一人名。省略號(hào)是因?yàn)槲矣洸磺辶耍ィ辉偃?#8220;切切切,切韭菜,兩只小貓翻鍋蓋”。現(xiàn)在就我一個(gè)人在外地,暫時(shí)還沒(méi)老鄉(xiāng)過(guò)來(lái),玩不起腦力激蕩,就回憶這兩句。民間藝術(shù)是要我們快樂(lè)的,是不要錢的,流傳那么多年,還是沒(méi)人寫出來(lái)。也許會(huì)漸漸消失,也許還是口口相傳下去。很多地方,很多方言,很多的表達(dá)方式,只有我們?nèi)ネ妫ヂ牐拍荏w會(huì)人們生活的許多樂(lè)趣。并非就普通話表達(dá)的那一點(diǎn)。網(wǎng)上也開始流行各地方言的教科書。往往都是異想天開的學(xué)生們對(duì)生活樂(lè)趣的一種表達(dá),對(duì)自己每天用的語(yǔ)言的一種熱愛(ài)。網(wǎng)絡(luò)會(huì)慢慢承載更多文化,更多樂(lè)趣。
        就寫這么點(diǎn)了,理科生就這樣,已經(jīng)寫不少?gòu)U話。覺(jué)得有點(diǎn)味道就行了。

    posted @ 2010-02-26 21:39 yangyusong 閱讀(378) | 評(píng)論 (0)編輯 收藏

    [置頂]打包——izpack(2)

     

    現(xiàn)在我們接著玩上次的試驗(yàn)結(jié)果,雙擊生成的install.jar運(yùn)行安裝,如下圖:


    lzPack1-1

    下一步如圖:(你發(fā)現(xiàn)和lzPack本身的安裝過(guò)程和界面是一樣的,不過(guò)也已經(jīng)夠漂亮了,是吧)(以后都是下一步的圖)


    lzPack1-2


    圖lzPack1-3


    圖lzPack1-4


    圖lzPack1-5


    圖lzPack1-6

    圖lzPack1-7


    圖lzPack1-8

      點(diǎn)擊Done完成安裝

      看看我們sample的結(jié)構(gòu)(即要安裝的軟件)


    lzPack1-9

      看看安裝好的文件結(jié)構(gòu)


    lzPack1-10

    少了一個(gè)文件listener,多了一個(gè)文件uninstaller,進(jìn)入uninstaller雙擊uninstaller.jar就看到卸載界面了(超簡(jiǎn)單的界面,就不貼了)。我們?cè)诨仡^看看那個(gè)配置文件install.xml,如下:

    <?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>

    - <!--

     
        A sample installation file.
        Use it as a base for your own installers :-)
        
        To compile it :
        - go in the bin directory where you installed IzPack
        - call "compile ../sample/install.xml -b ../sample"

      -->

    - <installation version="1.0">

    - <!--

     
            The info section.
            The meaning of the tags should be natural ...
        

      -->

    - <info>

      <appname>Sample Installation</appname>

      <appversion>1.4 beta 666</appversion>

    - <authors>

      <author name="JPz" email="jpz@superman.org" />

      <author name="Hidden Man" email="hidden@hisdomain.com" />

      </authors>

      <url>http://www.anotherworld-inspace-website.net/</url>

      </info>

    - <!--

     
            The gui preferences indication.
            Sets the installer window to 640x480. It will not be able to change the size.
        

      -->

      <guiprefs width="640" height="480" resizable="no" />

    - <!--

     
            The locale section.
            Asks here to include the English and French langpacks.
        

      -->

    - <locale>

      <langpack iso3="eng" />

      <langpack iso3="fra" />

      </locale>

    - <!--

     
            The resources section.
            The ids must be these ones if you want to use the LicencePanel and/or the InfoPanel.
        

      -->

    - <resources>

      <res id="LicencePanel.licence" src="Licence.txt" />

      <res id="InfoPanel.info" src="Readme.txt" />

      </resources>

    - <!--

     
            The panels section.
            We indicate here which panels we want to use. The order will be respected.
        

      -->

    - <panels>

      <panel classname="HelloPanel" />

      <panel classname="InfoPanel" />

      <panel classname="LicencePanel" />

      <panel classname="TargetPanel" />

      <panel classname="PacksPanel" />

      <panel classname="InstallPanel" />

      <panel classname="FinishPanel" />

      </panels>

    - <!--

     
            The packs section.
            We specify here our packs.
        

      -->

    - <packs>

    - <pack name="Base" required="yes">

      <description>The base files</description>

      <file src="Readme.txt" targetdir="$INSTALL_PATH" />

      <file src="Licence.txt" targetdir="$INSTALL_PATH" />

      <file src="script.bat" targetdir="$INSTALL_PATH" />

      <parsable targetfile="$INSTALL_PATH/script.bat" />

    - <!--

     The file will be parsed 

      -->

      </pack>

    - <pack name="Docs" required="no">

      <description>The documentation</description>

      <file src="doc" targetdir="$INSTALL_PATH" />

    - <!--

     Reccursive adding 

      -->

      </pack>

    - <pack name="Sources" required="no">

      <description>The sources</description>

      <file src="src" targetdir="$INSTALL_PATH" />

      </pack>

      </packs>

      </installation>

     我算它是七段,第一段

    <installation version="1.0">

     聲明安裝的版本

    第二段

    <info>

      <appname>Sample Installation</appname>

      <appversion>1.4 beta 666</appversion>

    - <authors>

      <author name="JPz" email="jpz@superman.org" />

      <author name="Hidden Man" email="hidden@hisdomain.com" />

      </authors>

      <url>http://www.anotherworld-inspace-website.net/</url>

      </info>

     聲明軟件的基本信息:名稱、版本、各個(gè)作者和聯(lián)系方式、公司主頁(yè)。對(duì)應(yīng)圖lzPack1-2

    第三段

    <guiprefs width="640" height="480" resizable="no" />

    設(shè)置安裝導(dǎo)航的寬高等屬性。

    第四段

    <locale>

      <langpack iso3="eng" />

      <langpack iso3="fra" />

      </locale>

     語(yǔ)言選擇,對(duì)應(yīng)圖lzPack1-1

    第五段

    <resources>

      <res id="LicencePanel.licence" src="Licence.txt" />

      <res id="InfoPanel.info" src="Readme.txt" />

      </resources>

     提供兩個(gè)資源給客戶閱讀,對(duì)應(yīng)兩個(gè)界面,圖lzPack1-3lzPack1-4。分別為軟件說(shuō)明和基本條款。

    第六段

    <panels>

      <panel classname="HelloPanel" />

      <panel classname="InfoPanel" />

      <panel classname="LicencePanel" />

      <panel classname="TargetPanel" />

      <panel classname="PacksPanel" />

      <panel classname="InstallPanel" />

      <panel classname="FinishPanel" />

      </panels>

     說(shuō)明順序下來(lái)都經(jīng)過(guò)那些界面。

    第七段

    <packs>

    - <pack name="Base" required="yes">

      <description>The base files</description>

      <file src="Readme.txt" targetdir="$INSTALL_PATH" />

      <file src="Licence.txt" targetdir="$INSTALL_PATH" />

      <file src="script.bat" targetdir="$INSTALL_PATH" />

      <parsable targetfile="$INSTALL_PATH/script.bat" />

    - <!--

     The file will be parsed 

      -->

      </pack>

    - <pack name="Docs" required="no">

      <description>The documentation</description>

      <file src="doc" targetdir="$INSTALL_PATH" />

    - <!--

     Reccursive adding 

      -->

      </pack>

    - <pack name="Sources" required="no">

      <description>The sources</description>

      <file src="src" targetdir="$INSTALL_PATH" />

      </pack>

      </packs>

      提供了要復(fù)制的文件夾結(jié)構(gòu),由<packs>標(biāo)簽包括

      共有三個(gè)包,每個(gè)包由<pack>標(biāo)簽標(biāo)識(shí) name=”base” 的包為基本包,包括所有文件和文件夾的文件夾,其下包括三個(gè)文件。$INSTALL_PATH即安裝路徑,由用戶給出

      包Docs 是文件夾doc

      <file >元素標(biāo)明文件或文件夾,src屬性為文件或文件夾名,targetdir屬性為要放到的路徑

      包Sources是文件夾src

      整個(gè)文件結(jié)構(gòu)和關(guān)系就由最后這一段來(lái)闡釋。

        另外,包<pack>還可以有其他的用途,下一節(jié)是個(gè)較實(shí)用的實(shí)例,你會(huì)看到它的用途,要不我們打的包都和izpack一樣光禿禿的,沒(méi)快捷鍵,沒(méi)環(huán)境變量,在實(shí)踐中我們慢慢發(fā)現(xiàn)光明,原來(lái)有趣的東西等著我們?nèi)ヌ剿鳌?/span>

    posted @ 2008-11-24 20:01 yangyusong 閱讀(2205) | 評(píng)論 (0)編輯 收藏

    [置頂]打包——IzPack(1)

     

    網(wǎng)頁(yè)上簡(jiǎn)紹一堆開源打包軟件,你饒有興趣的在那閱讀,發(fā)現(xiàn)IzPack就是你很理想的打包軟件,點(diǎn)開詳細(xì)簡(jiǎn)紹,看到了軟件的開源網(wǎng)址(這是基本規(guī)律嘛,沒(méi)給俺就googlebaiduhttp://izpack.org,常規(guī)你看到了download的按鈕,點(diǎn)吧,不用等網(wǎng)頁(yè)完全打開,就進(jìn)入了http://izpack.org/downloads/頁(yè)面,就只顧找下載的那個(gè)鏈接去,當(dāng)迅雷下著軟件的時(shí)候,你在看此頁(yè)面的各標(biāo)題,確定重點(diǎn)段落閱讀一下,發(fā)現(xiàn)沒(méi)有教你怎么用的,就最初的那個(gè)鏈接也是草草講了一點(diǎn)無(wú)關(guān)緊要的然后就叫你上官方網(wǎng)站找學(xué)的。不用急,軟件下完了,咱先安裝,看自述不就行了。

     就軟件的安裝界面來(lái)看,它打出來(lái)的包也挺不錯(cuò),這算一種自身思考吧。安裝完畢時(shí),它叫保存什么東西?連什么格式也弄不清(好幾個(gè)點(diǎn)呢),隨便取名保存吧。失望的是,它沒(méi)有彈出自述文件,看看桌面上,從開始菜單進(jìn)去一看,有卸載和幫助,就是沒(méi)有啟動(dòng)。你是不是該懷疑你下載的東西被人做過(guò)手腳,可這是官方的呀。簡(jiǎn)單,問(wèn)題來(lái)了。我們就想關(guān)鍵字,google上輸入軟件名“IzPack”,點(diǎn)擊相關(guān)搜索 lzpack使用”。看了幾個(gè)簡(jiǎn)紹的,教學(xué)大同小異,知道有大概策略,卻無(wú)從下手,關(guān)鍵就在于寫文章的不像我一樣喜歡搞策略,總是沒(méi)我需要的實(shí)際,高效。他們往往會(huì)講重點(diǎn),但卻不注意切入點(diǎn),在大學(xué)聽課也經(jīng)常這樣,讓你痛苦不已,就像被蚊子叮了,撓癢癢的只撓旁邊。總是看不到你的存在。

     那些重點(diǎn)、難點(diǎn)你已經(jīng)知道是那些就行了(其實(shí)還不用知道,知道是為了先跳過(guò)),只細(xì)致的搜尋這你要的切入點(diǎn)。有一個(gè)網(wǎng)頁(yè)說(shuō)有兩三種用IzPack的方法,只是概述那種也把責(zé)任推給官方。不幸看到一網(wǎng)站這一段“這個(gè)software的基本思想就是,它給你提供了許多安裝步驟所需要的panel(比如選擇安裝路徑、選擇安裝的內(nèi)容、觀看License等等),然后你自己寫一個(gè)install.xml文件將你自己軟件的信息、安裝需要的步驟、以及安裝的資源等等都寫進(jìn)這個(gè)文件里,然后使用它所提供的compile批處理文件編譯這個(gè)文件(e.g. compile install.xml),它就會(huì)自動(dòng)生成一個(gè)install.jar的可執(zhí)行Java包。至此,整個(gè)過(guò)程就結(jié)束了,雙擊這個(gè)install.jar,就能啟動(dòng)install界面。”,可以想到應(yīng)該用命令行的方式來(lái)用這個(gè)軟件,其實(shí)這個(gè)想法早出來(lái)了,因?yàn)椋烂嫔弦矝](méi)有lzPack的快捷方式。可我使用命令上就只會(huì)如 Javac xx.java 這一種,不過(guò)這一點(diǎn)也夠了,我已經(jīng)萌生了一個(gè)測(cè)試策略。不就是命令加參數(shù)嗎?驗(yàn)證一下再看其他的。

               1.       cmd進(jìn)入軟件的bin目錄(compile.bat在這里)

               2.       軟件附有樣例這是常規(guī),進(jìn)入軟件目錄IzPack下的sample(只有一個(gè)xml,compile 處理的就應(yīng)該是xml,總共只有一個(gè)樣例,當(dāng)然所有東西全用),全選,復(fù)制,貼入bin目錄下(不用怕混了,到時(shí)咱對(duì)照著刪就是了)。

               3.       (輸入什么呢,應(yīng)該以bat文件為命令吧,以所要處理的文件為參數(shù)。那就)輸入

    Compile install.xml

      有輸出,有許多文字在輸出,你已經(jīng)露微笑了,不幸命中,就是這么用,一看bin中多了個(gè)install.jar,就更放心了。雙擊看看,哦,原來(lái)是個(gè)語(yǔ)言選擇界面。那么你該處理“策略垃圾”了,你同時(shí)打開bin目錄和sample目錄對(duì)比著把bin中復(fù)制來(lái)的文件一個(gè)一個(gè)刪掉(這只是一種嚴(yán)慎的行為,因?yàn)殄e(cuò)誤總會(huì)隨時(shí)降臨)。

      Bin未刪sample里復(fù)制過(guò)來(lái)的文件時(shí)如下圖:


      你其實(shí)挺興奮,嚴(yán)格記下你的第一次,以備以后快速進(jìn)入和研究,于是你還把
    cmd上留下的命令行輸出復(fù)制出來(lái)留待研究。而且你的很多策略也出來(lái)了,那個(gè)sample就是你參照的對(duì)象,寫xml可以仿寫,sample的結(jié)構(gòu)有多復(fù)雜,你打包處理的軟件就至少能有這么復(fù)雜。對(duì),start里面的幫助文檔還沒(méi)使用呢,下次肯定得用上。其實(shí)你在做這個(gè)測(cè)試的時(shí)候都是數(shù)著步數(shù)的,因?yàn)槟阆肟纯春蜕洗蜗啾龋@軟件最快的使用方式有多大差別,對(duì),每次你都用sample來(lái)數(shù)你開始的步伐了嗎?

      這是在cmd里的操作和輸出,不是很有意義,僅作為一種完整性貼這。

    C:"Documents and Settings"yys>cd E:"Program Files"IzPack"bin

    C:"Documents and Settings"yys>e:

    E:"Program Files"IzPack"bin>compile install.xml

    .:: IzPack - Version 4.1.0 ::.

    < compiler specifications version: 1.0 >

    - Copyright (c) 2001-2008 Julien Ponge

    - Visit http://izpack.org/ for the latest releases

    - Released under the terms of the Apache Software License version 2.0.

    -> Processing : install.xml

    -> Output      : install.jar

    -> Base path   : .

    -> Kind        : standard

    -> Compression : default

    -> Compr. level: -1

    -> IzPack home : .

    Adding resource: IzPack.uninstaller

    Setting the installer information

    Setting the GUI preferences

    Adding langpack: eng

    Adding resource: flag.eng

    Adding langpack: fra

    Adding resource: flag.fra

    Adding resource: LicencePanel.licence

    Adding resource: InfoPanel.info

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/HelloPanel.jar

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/InfoPanel.jar

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/LicencePanel.jar

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/TargetPanel.jar

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/PacksPanel.jar

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/InstallPanel.jar

    Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j

    ar!/bin/panels/FinishPanel.jar

    Building installer jar: E:"Program Files"IzPack"bin"install.jar

    [ Begin ]

    Copying the skeleton installer

    Copying 7 files into installer

    Merging 7 jars into installer

    Writing 3 Packs into installer

    Writing Pack 0: Base

    Writing Pack 1: Docs

    Writing Pack 2: Sources

    [ End ]

    Build time: Thu Oct 30 20:08:24 CST 2008

    E:"Program Files"IzPack"bin>

       cmd輸出的你能看到我用的命令就是剛才寫的,就那么一條,然后輸出它打包的過(guò)程,xml配置有問(wèn)題的話,就會(huì)編譯不過(guò)去。
      同樣izpack是個(gè)小巧的開源軟件,用大部分用java寫的,離不開java環(huán)境,打出的包就一jar文件,比起installsheild輕省多了,但問(wèn)題也來(lái)了,客戶要安裝你的軟件就要安裝jdk,以后我們會(huì)解決這問(wèn)題。
     下節(jié)看看我們的結(jié)果并簡(jiǎn)單研究一下要配置的xml。

    posted @ 2008-11-24 18:47 yangyusong 閱讀(4000) | 評(píng)論 (5)編輯 收藏

    [置頂]打包——launch4j

     

    這次講的就簡(jiǎn)短了,launch4jjsmooth強(qiáng)多了,但也不是我們的研究重點(diǎn),我主要用它來(lái)生成exe,再用izpackinstalljammer打包。

       launch4j也是開源軟件,所以可以上http://sourceforge.net下載。安裝好后,把C:"Program Files下你安裝jdkjava文件名改了,再打開launch4j發(fā)現(xiàn)打不開,證明這個(gè)軟件是依賴java環(huán)境的,它本身包打得很小。改回java文件夾的名字,再打開,發(fā)現(xiàn)啟動(dòng)界面很漂亮,你的軟件也有望成這樣了。上次有一點(diǎn)沒(méi)講清楚,jsmoothjre路徑那就是告訴jsmooth用此jrejvm(大家都知道class的運(yùn)行靠的就是jvm),而不用再搜尋jdk等中的jvmJsmooth中一欄是jvm查找順序就是在不自己帶上jre的情況下搜尋客戶機(jī)的jvm的策略。這兒同樣要jre進(jìn)行同樣的動(dòng)作。好,現(xiàn)在就讓我們來(lái)生成一個(gè)不依賴客戶機(jī)java環(huán)境的exe

      前提準(zhǔn)備:

      把jdk中的jre復(fù)制到你要打包的文件夾(我的是Java2D)下,要打包的jar,這兒用jdkdemo中的Java2Demo.jar,一張bmp圖片j2d.bmp,一個(gè)ico文件,如圖


       你需要填寫的也很少。

    1.       basicjar一欄找到你的jar,安照同路徑給你的exe起名字。在Icon一欄找到你的ico


    2.jre一欄寫上./jre表示當(dāng)前路徑(launch4j聰明多了,記住你的路徑)


     3.Splash一欄的Enable splash screen 打上勾,下面選出你的bmp,估計(jì)你軟件的啟動(dòng)時(shí)間,然后填上比這個(gè)時(shí)間大的時(shí)間。如下為5。這個(gè)bmp就是你的啟動(dòng)畫面


    可以生成了(其實(shí)你可以不填
    bmp,ico就生成,軟件可還貼心)。點(diǎn)擊工具欄的齒輪圖就生成了。結(jié)果如圖


    多了一個(gè)
    exe就是你所需。點(diǎn)擊就看到啟動(dòng)畫面,如下

    下次講
    izpack。開始比較有意思了。

    posted @ 2008-11-19 23:11 yangyusong 閱讀(10022) | 評(píng)論 (8)編輯 收藏

    [置頂]打包——JSmooth

     

    在這之前已經(jīng)有很多人講過(guò)怎么用JSmooth了,如BeanSoft還貼了自己的視頻,網(wǎng)址是: http://download.gro.clinux.org/beansoft/JSmooth_zh_CN.swf  大家記得去參考,做的挺好的。

     寫這篇文章一是為了完整性,再一個(gè)一步一步過(guò)來(lái)比較自然,先學(xué)會(huì)簡(jiǎn)單易用的,思維也容易清晰。很多的文章也免不了千篇一例,過(guò)來(lái)看看我的見(jiàn)解還是值得的,呵呵。

     其實(shí)這款小軟件真是一堆一堆的漏洞,但還是勉強(qiáng)可用,作為開源打包的入門軟件。通常都用JSmooth 0.9.9-7版本的,看看下面的圖


     
    是我們的beansoft翻譯的,上次說(shuō)過(guò)了,有問(wèn)題可要請(qǐng)教他呀。

       先別急著動(dòng)手,先說(shuō)學(xué)完咱們可以做啥,一個(gè)是你可以生成一個(gè)有exe殼的jar應(yīng)用程序,其實(shí)就是在你的包里多了一個(gè)exe文件,其他的依舊在,不要以為拿著你的exe就出去用了,脫離了你的這個(gè)jar,你的這個(gè)文件結(jié)構(gòu)就玩完了,甚至脫離了你本地機(jī)的java環(huán)境就沒(méi)戲了。你不能要求客戶都安裝jdk吧,人家不想搞研發(fā)。別灰心,看完本文你就知道怎么脫離java環(huán)境了(只是脫離本地機(jī)java環(huán)境哦,不是脫離你的那個(gè)包結(jié)構(gòu),還沒(méi)那么智能的)。雖然是很簡(jiǎn)單,可當(dāng)初我也是不了解。幾個(gè)人硬沒(méi)弄出一個(gè)脫離java環(huán)境的,加上小軟件經(jīng)不起蹂躪,然后不得不怪軟件是中文版的,還動(dòng)手用c來(lái)生成exe調(diào)用巨大的jdk,然后脫離本地機(jī)java。轉(zhuǎn)了一圈回來(lái)才理解了怎么回事。之所以說(shuō)它經(jīng)不起蹂躪就是你不要對(duì)著上面的按鈕嘩啦嘩啦的點(diǎn),一不小心,它不反應(yīng)了,你的從新打開,次數(shù)開多了,說(shuō)不定每次都不讓你看某些界面。除非你重啟。或者正常的某個(gè)功能就是不理你了,或者生成的時(shí)候忘了敲上exe而不得不從來(lái)。所以蹂躪對(duì)軟件和你都沒(méi)好長(zhǎng)。

     下面分兩部分,一部分教你用最簡(jiǎn)單的方式打出exe,體會(huì)一下成功的快樂(lè)。一部分教你加上jre脫離本地機(jī)java

      

     前提,你有java環(huán)境(安裝了jdk

     最簡(jiǎn)單的exe打包

     其實(shí)最簡(jiǎn)單的打包只要寫三個(gè)地方就可以打了,而你可以對(duì)著一個(gè)jar文件就打成你的exe,有一點(diǎn)就是你要知道jar里的主類是誰(shuí),不知道這個(gè)概念就問(wèn)問(wèn)別人。那么開始吧,講的算細(xì)了。

     打開綠色軟件中的jsmoothgen.exe就開始了。這里以打Java2Demo.jar為例(在jdkdemo里有,我就不提供了),

    1.       點(diǎn)擊 骨架,選擇Windowed Wrapper (表示打的是windows下的,左邊欄從上到下就一打包流程,很多都沒(méi)用上,也沒(méi)細(xì)究。移動(dòng)鼠標(biāo)到“?”,人家告訴你該做什么。別太興奮。)


    2.點(diǎn)擊 可執(zhí)行文件,點(diǎn)擊紅線處的按鈕找到你的jar文件,記得換后綴為exe,如圖


    3.       點(diǎn)擊 應(yīng)用程序,點(diǎn)擊classpash 那一欄右邊的加號(hào),把你的jar加進(jìn)去,然后點(diǎn)擊紅線處,彈出的框中只有一個(gè)文件夾,雙擊打開,直到找到你的主類為止,點(diǎn)擊 select 確定,如下兩幅圖所示


    開始生成吧,點(diǎn)擊工具欄里的小齒輪,彈出對(duì)話框,路徑就選在你打包的文件下(好像是必須的),寫上名稱,如圖,確定即可在你的包里看到這個(gè)exe


    打開
    E:"Java2D看到


      其中
    j2d.jsmoothjsmooth生成的配置文件,Java2Demo.exe即你要的,點(diǎn)擊試試,看能不能用,然后把exe剪切到其他地方看能不能用,放回來(lái),把C:"Program Files下的java文件夾改名字(注意把用到java虛擬機(jī)的軟件都關(guān)了),看exe還能不能用。(別忘了改回來(lái)。)

    結(jié)果清楚了exe不能和jar分離了,也不能離開jvm環(huán)境,下面我們就讓他脫離本機(jī)java環(huán)境。這樣的exe可以為我們進(jìn)一步的打包奠定基礎(chǔ),所有它是有用的。

    準(zhǔn)備條件:把你jdk下的jre考到和jar同一個(gè)目錄,要圖標(biāo)就找好一個(gè)“.ico”的文件三個(gè)放同一文件夾下

    下面開始:

    1.       和剛才一樣,點(diǎn)擊 骨架,選擇Windowed Wrapper

    2.       點(diǎn)擊 可執(zhí)行文件,找到你的jar文件,記得換后綴為exe,同樣找到包里準(zhǔn)備好的ico文件如下圖

    這就看到一個(gè)bug了,我選的ico它顯示為另外一個(gè)以前同名的ico,即使我改了它的名,其實(shí)還有另一點(diǎn)令人不舒服的,就是每次點(diǎn)擊找路徑都從頭找,它不幫你記下。另外注意一點(diǎn)我一來(lái)點(diǎn)了保存,把j2d.exe.jsmooth存到了e:"java2D下,所以你看到的路徑很短,


        3.和剛才一樣找到jar放到classpath里,然后找到主類,(注意順序性)


    4.點(diǎn)擊 jvm選項(xiàng) ,在jvm捆綁包那選上復(fù)選框,點(diǎn)紅線處找到jre路徑并確定。如圖


    選擇了
    jre

    5.開始生成吧,點(diǎn)擊工具欄里的小齒輪,彈出對(duì)話框,路徑就選在你打包的文件下,寫上名稱,如圖,

    確定生成

    exe是你要的,這里要抱歉一下,它的bug所致,ico用的不是我當(dāng)前的ico,但也沒(méi)什么影響。J2d.bmp什么的是不必要的,下一節(jié)才用上,點(diǎn)擊exe看,把C:"Program Files下的java文件夾改名字再試一次,噢,可以了,呵呵。Jsmooth 的其他選項(xiàng)就考各位補(bǔ)充了,俺不太明白了,謝謝各位。下次講launch4j打包。

    posted @ 2008-11-19 22:02 yangyusong 閱讀(5752) | 評(píng)論 (3)編輯 收藏

    [置頂]打包——InstallSheild之InatallScript

     

    上次講了InstallSheildasistant的方式,你跟著弄就打處一個(gè)包來(lái)了,驗(yàn)證一下是否符合你的設(shè)置,就是安裝一下看看。這就不多說(shuō)了。

    上次的解說(shuō)你可能已經(jīng)迫不及待要看看Installation Designer的方式。別急。

       很多時(shí)候我們只需要照著一個(gè)簡(jiǎn)單的示例做一次成功,就能體會(huì)到達(dá)成一間事的最簡(jiǎn)單方式。所以這次改一下結(jié)構(gòu),講解和操作分離,凡是操作的部分都寫成 xx操作:”后面跟上本示例操作,xx表示步數(shù),其實(shí)有的步是不必要的。你要親自動(dòng)手看有此標(biāo)簽的部分就行。有多余的需求和想了解在看具體講解。用標(biāo)簽 “講解:”表示具體講解。

       下面開始

        1操作:打開InstallShield x 又看到起始頁(yè),如下圖:

      講解:要是沒(méi)有,你就新建一個(gè)。要?jiǎng)h除項(xiàng)目,通常是關(guān)閉InstallShield x,然后到ism所在的文件夾刪除整個(gè)文件夾就行。


        2操作:點(diǎn)擊TTPlay.ism打開上次建的項(xiàng)目,如下圖:

      講解:看到如下圖,如果看到的不是,你就點(diǎn)一下標(biāo)簽頁(yè)Installation Designer,看到這個(gè)界面,我們應(yīng)該很高興,面熟呀,這不和vc6.0的和相似么。其實(shí)用法、語(yǔ)法也很相似,紅線圈住的部分是下一步操作的


    3操作:點(diǎn)擊上圖左邊樹狀目錄中紅圈中的部分,看到如下圖:

    講解:左邊的目錄也是九個(gè),對(duì)應(yīng)項(xiàng)目助手的九個(gè)步驟


        4操作:右擊中間目錄中的,看到如下圖:再點(diǎn)擊Make default,那么默認(rèn)就是中文了。

      講解:紅勾就到了Chiness選項(xiàng),上次的問(wèn)題就解決了,再次安裝是看到的就是中文了,不信可以點(diǎn)擊編譯、鏈接,執(zhí)行試試,和vc一樣,這兩個(gè)圖中都有,自己試試。

      點(diǎn)擊Project Properties,可以看到,保存配置的方式是xml,其他信息都是默認(rèn)配置或你在工程助手那填寫的。


      所有東西到要安裝,不需客戶選擇,那么可以如下操作

        5操作:點(diǎn)擊左邊目錄的Setup Types ,看到中間目錄,右擊Complete選項(xiàng),點(diǎn)擊Remove刪除

      講解:你說(shuō)為什么不刪除Custom因?yàn)?/span>Custom里才可以讓客戶選擇安裝路徑。


        6操作:點(diǎn)擊左邊目錄的Files and Folders,展開中間部分下邊欄中的Application Target Folder目錄看到如下圖

      講解:Destination computer’s folders欄里的各目錄在同上節(jié)添加文件是所看到的彈出目錄含義相同,參看上節(jié),在這兒你可以展開source computer’s folders中我的電腦,直到找到你要打包的文件夾,拖到下邊欄中的Application Target Folder目錄就行,也是比較浪費(fèi)時(shí)間(他要搜索你的整個(gè)結(jié)構(gòu)進(jìn)去),和使用工程助手添加文件夾的效果相同,但顯然這樣感覺(jué)更方便,尤其是有多個(gè)文件夾并列時(shí)(很多時(shí)候你不想要很深的目錄,公司名文件夾下、軟件名文件夾才到你拖進(jìn)來(lái)的文件夾,可能你的好幾個(gè)文件夾都只想做公司名文件夾下的子文件夾,那么想上次講的你可以不寫軟件名,然后再這多次拖動(dòng)并列的這幾個(gè)文件夾。)。在具體的,有少量文件變動(dòng)你可以點(diǎn)擊有文件變動(dòng)的文件夾,在最右邊上面的文件拖到下面的相應(yīng)位置。變動(dòng)比較大,建議你就吧下邊欄中Application Target Folder里的文件目錄都刪掉再重新拖進(jìn)去


        7操作:點(diǎn)擊Shortcuts 展開中間欄的ttplay目錄,展開中間欄的Desktop目錄并點(diǎn)擊TTPlayer.exe1看到如下圖(這一步可以省去,只是看一眼就行,謹(jǐn)慎行事就在看講解)。

      講解:沒(méi)有的話,你就自己在這兒建,相信你會(huì)需要這樣建而且也很方便,沒(méi)有快捷方式的話,可能你看到的只有Programs Menu 那么你就右擊Programs Menu點(diǎn)New Folder新建文件夾(就是在開始菜單中的文件夾,一個(gè)文件夾中有可若干個(gè)選項(xiàng)調(diào)用不同的exe,然后對(duì)文件夾起名字(最好用你的公司名,要是改名,按F2就行了)然后右鍵點(diǎn)擊這個(gè)剛建的文件夾,點(diǎn)擊New Shortcut 新建你的快捷方式并起上名(也是彈出一個(gè)框,你找到你的exe,但名字是要自己給的)。要注意的就是起好名字后點(diǎn)擊這個(gè)快捷方式,在最右邊的wording Directory填上你的工作目錄,要不產(chǎn)生的快捷方式找不到你的exe,如果是Desktop就填上<DesktopFolder>,如果是Start Manu就復(fù)制Target中的目錄不到xxx.exe,而是它的上層目錄。如<TARGETDIR>"TTPlayer"TTPlayer.exe就只復(fù)制<TARGETDIR>"TTPlayer貼到Working Directory,Display name改為你的軟件名,這個(gè)名字將顯示在快捷方式里,如這兒改成TTPlayer


        8操作:點(diǎn)擊Registry,如下圖(只一步也可省去)

      講解:和Files and Folders一樣,中間一欄上面是本機(jī)的,下面是對(duì)應(yīng)的,要注冊(cè)什么在本機(jī)上新建了,拖到下面就行了,也都點(diǎn)右鍵新建同名文件夾直到最下層,拖動(dòng)你剛建的名值對(duì)就完了。


      講解:
    Server Configuration中的兩項(xiàng)是iisSQL Server2000,我們都不用,也都很簡(jiǎn)單。跳過(guò)。

        9操作:點(diǎn)擊InstallScript 看到如下圖


      講解
    :這是重點(diǎn),這里可以添加代碼來(lái)修改環(huán)境變量、添加驗(yàn)證、添加調(diào)用等。這兒只會(huì)講到添加環(huán)境變量,添加調(diào)用會(huì)在講開源軟件是講。具體語(yǔ)法講解只有InstallSheild 5的,從哪個(gè)網(wǎng)站下,忘了,剛搜了一下,感覺(jué)這個(gè)網(wǎng)站應(yīng)該能下:http://cio.ccw.com.cn/qtzl/htm2008/20081018_523911.shtml 不行你就到google 輸入 installshield 丁有和”。

      復(fù)制其中的部分代碼如下:

    Dlg_Start:

        nResult = 0;

    Dlg_SdWelcome:

        szTitle = "";

        szMsg = "";

        //{{IS_SCRIPT_TAG(Dlg_SdWelcome)

        nResult = SdWelcome( szTitle, szMsg );

        //}}IS_SCRIPT_TAG(Dlg_SdWelcome)

        if (nResult = BACK) goto Dlg_Start;

    Dlg_SdLicense2:

      很顯示它的語(yǔ)法挺簡(jiǎn)單,大致你也能猜到,這兒是三個(gè)對(duì)話框,都是用標(biāo)簽的方式,說(shuō)明我們要跳來(lái)跳去,不錯(cuò),if (nResult = BACK) goto Dlg_Start;就是通過(guò)一個(gè)判斷調(diào)回上一個(gè)對(duì)話框。Dlg_Start即開始對(duì)話框,Dlg_SdWelcome即歡迎對(duì)話框。nResultszTitle等都是變量,并非弱類型的變量,前邊有定義。

    廢話不多說(shuō),我們要加上一個(gè)環(huán)境變量,

        10操作:對(duì)著有代碼那一欄拖動(dòng)滾動(dòng)條到最下面看到最后一個(gè)end為止,在它的下一行粘貼如下代碼:

    function OnEnd()      

    string mypath, szKey, szEnv;        

    POINTER pEnv;  

    begin                

     mypath=TARGETDIR;     

     szKey="Environment";  

     RegDBSetDefaultRoot(HKEY_CURRENT_USER);     

     RegDBSetKeyValueEx(szKey,"mypath",REGDB_STRING,mypath,-1);  

     szEnv = "Environment";  

     pEnv = &szEnv;  

     SendMessage (0xffff, 0x001A , 0, pEnv );  

     // MessageBox("設(shè)置了環(huán)境變量mypath ",0);

    end;

      講解:要調(diào)用函數(shù)就的在那些對(duì)話框中找個(gè)位置插入這個(gè)函數(shù),這兒就找“Dlg_SetupType2:”標(biāo)簽

        11操作: 找到“Dlg_SetupType2:”標(biāo)簽,在其后新加一行 OnEnd();

    講解:此時(shí)應(yīng)該點(diǎn)一下Complile,編譯一下(和用vc一樣來(lái)使用),若有錯(cuò)會(huì)和vc一樣在下面報(bào)出,雙擊錯(cuò)誤到出錯(cuò)行,如果你是復(fù)制代碼過(guò)去的,很可能是字符編碼不一致的問(wèn)題。特別是中文和空格,那么去掉每行前面的空格可能就去了大部分的錯(cuò)誤,有中文的行最好去了,自己再敲一次,實(shí)在不好解決的就全去了再全部敲一遍。

      注釋方式和c,java的一樣,這兒把后面那個(gè)注釋去了,運(yùn)行到那時(shí)就會(huì)那個(gè)彈出對(duì)話框。內(nèi)部函數(shù)查幫助,語(yǔ)法和常用函數(shù)看我剛才介紹下載的講解。

      這里邊還有調(diào)試運(yùn)行,好像不能加斷點(diǎn),全都是從頭至尾的走。但同樣有跳出函數(shù),停止調(diào)試等常規(guī)操作。

        12操作:點(diǎn)擊Dialogs(可以省去),看到如下圖:


      講解:在
    Skin里有多種風(fēng)格的皮膚,通過(guò)右鍵點(diǎn)擊來(lái)選取。All Dialogs里有從開始安裝到結(jié)束安裝的各種可能用上的對(duì)話框,通過(guò)雙擊可以在這里改變這些對(duì)話框的結(jié)構(gòu)。當(dāng)然標(biāo)志installshied可不好去,最好也別去,誰(shuí)叫你用人家的產(chǎn)品。這些對(duì)話框的引用可以在前面的InstallScript代碼來(lái)引用。如Welcome對(duì)話框就用“Dlg_SdWelcome:”標(biāo)簽來(lái)引用。

        13操作:點(diǎn)擊編譯。(與vc一樣)

      講解:ok,本次操作結(jié)束。到你創(chuàng)建的目錄下就能找到setup.exe點(diǎn)擊安裝試試,或者點(diǎn)InstallSheild x里的運(yùn)行。也行。


      如果加了環(huán)境變量,就能找到,如我這兒添加了
    mypath= C:"Program Files"JoinusRip,看看你的。有問(wèn)題提問(wèn)。

      這次一個(gè)13個(gè)操作(可能還不要或者更多一點(diǎn))你就用InstallSheild x打包好一個(gè)軟件,不到兩分鐘。你可能急了,說(shuō)我只幫你解決了添加環(huán)境變量的問(wèn)題,你還有很多要求,要求調(diào)用其他軟件先安裝呀什么的。其實(shí)大部分情況這些已經(jīng)差不多了。你的問(wèn)題也許可以換種方式,要不你自己正是很不輕松,盡管你及其勤奮。要先安裝其他軟件,你可以通過(guò)選擇安裝對(duì)話框加說(shuō)明讓用戶先安裝你要求的。這種對(duì)話框你可以通過(guò)另外的打包軟件處理,要不去記InstallSheild的一堆語(yǔ)法,不一定吃得消。我也不敢講一堆,更主要的原因是,這可不是免費(fèi)的軟件,你用了說(shuō)不定哪天律師就來(lái)找你了,所有你僅僅體驗(yàn)一下明白打包的一個(gè)大體過(guò)程就可以了,學(xué)問(wèn)有相似之處,再學(xué)其他的也就不那么難了。除非你公司買了InstallSheild,否則你就先把它扔一邊吧,我們有更好的開源軟件,雖然一下子講不到最好的。

      提醒一下,如果你運(yùn)行了剛打好的包,或打開了包所在的文件夾,此時(shí)編譯會(huì)過(guò)不去,總提醒一個(gè)錯(cuò)誤,還有InstallSheild x有很多bug,不行了,你就刪除從來(lái)。有人翻譯了InstallSheild2008的部分,當(dāng)然幫助沒(méi)翻譯,你可以下來(lái)看看都什么意思,但想使用好像不是很現(xiàn)實(shí)。當(dāng)然要學(xué)好就得看英文的,很多人都習(xí)慣了看英文的幫助,但一下子要看明白并操作許多也還是花點(diǎn)時(shí)間的。另外所有的部分都是用例子來(lái)講,不會(huì)面面俱到,要深入必須再花時(shí)間看幫助,相信有了例子,再看幫助的時(shí)候理解的就多了。

      下次進(jìn)入開源,最簡(jiǎn)單的jsmooth,中文版翻譯是劉長(zhǎng)炯,這次我慘了。希望他沒(méi)寫相關(guān)的,要不撞車了。

    posted @ 2008-11-17 01:14 yangyusong 閱讀(1520) | 評(píng)論 (2)編輯 收藏

    [置頂]打包——installsheild之Assistant

     

      經(jīng)簡(jiǎn)紹說(shuō)installsheild不錯(cuò),打包方便快捷,于是要來(lái)軟件,安裝的是InstallSheild x英文版。

    如下圖,這是打開的見(jiàn)面,紅線是我畫上的,點(diǎn)擊這條語(yǔ)句就開始新建工程了。


      彈出對(duì)話框中默認(rèn)的
    InstallScript Project(如下圖) 正是我們所需(以Script的方式來(lái)完成更多任務(wù))。填入你要打包的項(xiàng)目名,和要釋放的位置(打成的包要放的位置),(什么?你說(shuō)我打的怎么是TTplay,不好意思,TTplay確實(shí)是別人的,要先試驗(yàn)再動(dòng)真格的,要不就元?dú)獯髠恕0寻惭b了的TTplay打成包不是很簡(jiǎn)單的試驗(yàn)方式么。一來(lái)就把你幾百兆的軟件拿過(guò)來(lái)打,又慢風(fēng)險(xiǎn)又大。你也不知道剛用的軟件會(huì)發(fā)生些什么事故,保險(xiǎn)起見(jiàn),把安裝在你電腦里的整個(gè)TTplay的文件夾考到一個(gè)地方備用。才2點(diǎn)幾兆,盡情試驗(yàn)吧)。點(diǎn)擊Ok進(jìn)入下一步。


      于是你就見(jiàn)到了
    Project Assistantinstall Designer.如下圖所示
      我們就叫
    Project Assistant為工程助理吧,用工程助理就可以完成一般的打包工作,只要點(diǎn)擊最下排圖標(biāo),從左至右來(lái)按向?qū)顚懢托校W(wǎng)上應(yīng)該有簡(jiǎn)紹的,但我還是要嘮叨,好像這兒會(huì)更有特色。你也完全可以在install Designer里全部完成,但通常都是結(jié)合著用。


        Project Assistant共九步形成一個(gè)安裝流程。

    點(diǎn)擊第一個(gè)Application Files,如下圖

    以此是公司名稱、應(yīng)用軟件名稱、版本、公司首頁(yè)。最后的選項(xiàng)是是否自動(dòng)提醒更新。

    生成的軟件安裝后會(huì)以你的公司名為文件夾,應(yīng)用軟件名稱為其子文件夾,接著是你的放進(jìn)去的文件夾(后面會(huì)講到),很多時(shí)候你可能不需要這么多文件夾嵌套,像我打包的文件夾就不要應(yīng)用軟件名稱,否則,所設(shè)置的環(huán)境變量就不好處理了,但這的試驗(yàn)就不用管了,后面具體講。你要根據(jù)你所需的文件結(jié)構(gòu)來(lái)決定。


      點(diǎn)擊
    installation Architecture,如下圖,只有一個(gè)選擇項(xiàng),問(wèn)你是否要個(gè)性化安裝,意思就是可以選擇部分安裝,我們就不管了,我們都是要全裝的,哈,而且這兒也很簡(jiǎn)單。(還是說(shuō)說(shuō)吧,點(diǎn)選yes,點(diǎn)擊New,添加文件夾,取個(gè)名字,Set Default來(lái)設(shè)計(jì)你選定要做默認(rèn)安裝的,下一步驟是選定你要打包的文件,其中All Application下拉框選項(xiàng)就會(huì)發(fā)現(xiàn)剛才你new的文件,選定誰(shuí),當(dāng)前放進(jìn)的包就屬于它了,好像有點(diǎn)抽象,看看想想就應(yīng)該明白了)


      點(diǎn)擊
    Application Files看到如下圖

    我們要全安裝所以用All Application Data,下面的Destination Computer中的重點(diǎn)文件夾是Application Target Folder,其意義就是客戶所選路徑+公司名+軟件名這樣一個(gè)路徑。

    Program Files 是絕對(duì)路徑“C:"Program Files”群里有哥們?yōu)橐乓恍┪募竭@個(gè)絕對(duì)路徑,問(wèn)了幾天人,告他用Indesigner中的Program Files,他沒(méi)明白,效果和項(xiàng)目助手的一樣。

    Windows也是絕對(duì)路徑,“C:"WINDOWS”下屬分別為“C:"WINDOWS"Fonts”和“C:"WINDOWS"system32


      這兒還沒(méi)操作呢,開始操作,點(diǎn)選
    Application Target Folder,點(diǎn)擊Add Folders 選定你打包的文件夾,確定就會(huì)在Application Target Folder里顯示你的文件結(jié)構(gòu),這可是個(gè)慢動(dòng)作,文件越多就越慢,實(shí)際它只是記錄了你的文件結(jié)構(gòu),并非復(fù)制。結(jié)果如下圖:

    如果你看不到,很正常,這是它的一個(gè)bug,點(diǎn)一下其他的步驟,再點(diǎn)回來(lái)就看到了(點(diǎn)回來(lái)有時(shí)也要你一些時(shí)間,bug呀)


      點(diǎn)擊下一個(gè)步驟
    Application Redistributables,如下圖:

    就是問(wèn)你用不用ODBCsql Server 2000 等等的,都不管了,我們喜歡用開源的。


      點(diǎn)擊下一步驟
    Application Shortcuts,即應(yīng)用程序快捷方式,如下圖


      它自動(dòng)幫你提起你所給文件夾下的
    exe,你的軟件要沒(méi)exe就先生成exe,以后會(huì)講到

      你的問(wèn)題出來(lái)了,要是exe不在所給文件夾下怎么辦,你就點(diǎn)new,彈出窗口展示的是DefaultFeature里的文件分類(如下圖),文件分類和前面講的一樣,Application Target Folder 是客戶所選路徑+公司名+軟件名這樣一個(gè)路徑……回憶起來(lái)俺就不廢話了。大部分情況點(diǎn)擊Application Target Folder到你提供的文件夾里找到你的exe就有了。


      點(diǎn)選你的
    exe,然后在右邊的復(fù)選框選擇是否創(chuàng)建開始菜單快捷方式和桌面快捷方式(看下圖)。點(diǎn)選并刪除你不用的exe。你可能覺(jué)得這樣方式真好,后面你會(huì)發(fā)現(xiàn)工程助手的方式不如Install Designer 的方式好,工程助手可能會(huì)令你反復(fù)弄來(lái)弄去。


      下一步
    Aplication Registry,如下圖:

    你就需要選擇一個(gè)根目錄,然后不斷點(diǎn)右鍵新建選項(xiàng),最后定變量—數(shù)值對(duì)就行


      如下圖,新建一次后,再次新建里就可以新建各種值,或者選擇導(dǎo)入
    Reg的方式,具體自己研究了。也是Install Designer 的方式更好。這兒什么都不需要注冊(cè),把剛加的刪了。


      下一步
    Installation Interview 如下圖:

    共四個(gè)選項(xiàng),第一個(gè)選項(xiàng)是是否要license,是的話你要提供一個(gè)txtlicense或者寫一段腳本來(lái)處理。我們選擇否。

    第二個(gè)選項(xiàng)是是否填入公司名和用戶名,不用了,我們這不用那么麻煩客戶。

    第三選項(xiàng)說(shuō)是否讓客戶選擇安裝目錄,默認(rèn)就行(yes)。

    第四選項(xiàng)說(shuō)是否同意客戶只安裝部分。也默認(rèn)就行(yes)。


      下一步驟
    Installation Localization 安裝本地化,如下圖:

    選上簡(jiǎn)體中文。All String Data等功能和All Application Data的意義是一樣的就是看你要整個(gè)處理還是安裝某部分才這樣處理。我們用默認(rèn)的就行。


      最后一步
    Build Installation 就是生成你的軟件了。如下圖:

    三個(gè)選項(xiàng)意義就是生成單個(gè)執(zhí)行文件、網(wǎng)絡(luò)版、光盤版。

    點(diǎn)擊Build Installations就開始建造了。這個(gè)過(guò)程也有點(diǎn)慢,畢竟要把所有文件存儲(chǔ)到一個(gè)dat文件里。


      結(jié)果如下圖:


      點(diǎn)擊
    setup.exe就可以安裝了。

    當(dāng)然這樣的效果可能不如你想象的好,例如點(diǎn)開可能是英文的,你就急了,不是本地化了嗎?你忘了看,同時(shí)選中的English上有個(gè)紅勾,表示它是默認(rèn)語(yǔ)言,要么你把英語(yǔ)的去掉,要么你上Install Designer處理。

    如果你已經(jīng)安裝過(guò)這個(gè)setup.exe,再次點(diǎn)擊時(shí)它就會(huì)提醒你是要修改、修復(fù)還是卸載,如下圖:


      這就是
    InstallSheild用向?qū)Т虬浖暮?jiǎn)單過(guò)程。你應(yīng)該知道有exe的軟件怎么打包了,下次講InstallSheildinstall Designer的方式,它能滿足你更多的需求。能解決你在工程助手這令人抓狂的問(wèn)題。

    錯(cuò)漏之處,謝謝指正。

    posted @ 2008-11-16 01:50 yangyusong 閱讀(2082) | 評(píng)論 (4)編輯 收藏

    僅列出標(biāo)題  下一頁(yè)

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 日本激情猛烈在线看免费观看 | 最近在线2018视频免费观看| 久久精品国产精品亚洲| MM1313亚洲精品无码久久| 男人的好免费观看在线视频| 亚洲精品456在线播放| 久久久久久久久久国产精品免费| 国产亚洲精品成人AA片新蒲金| 国产成人+综合亚洲+天堂| 免费的一级黄色片| 亚洲色丰满少妇高潮18p| 国产一卡2卡3卡4卡2021免费观看| 亚洲大片在线观看| 久久国产精品成人免费| 亚洲精品国偷自产在线| 三级黄色在线免费观看| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 午夜亚洲AV日韩AV无码大全| 国产一级高青免费| 亚洲人色婷婷成人网站在线观看| 一级做a爰片久久免费| 亚洲福利精品电影在线观看| 日韩精品视频在线观看免费| 亚洲av无码天堂一区二区三区| 国产亚洲蜜芽精品久久| 免费看国产一级片| 成a人片亚洲日本久久| 四虎国产精品免费久久影院| 国产精品久久亚洲一区二区| 全部免费国产潢色一级| 男人扒开添女人下部免费视频| 亚洲第一区在线观看| 一级毛片免费全部播放| 在线亚洲97se亚洲综合在线| 国产做国产爱免费视频| 亚洲国产成人高清在线观看 | 好大好硬好爽免费视频| 亚洲国产成人精品无码区二本 | 亚洲an天堂an在线观看| 青青草无码免费一二三区| 亚洲精品中文字幕麻豆|