rails編譯
『壹』 為什麼有同鞋學習 Ruby 之後學習 Go
我的個人經驗就是,用java的時候,各種架構太復雜,IoC,EJB各種,之前做Java時候從來沒自己成功上線過一個項目,因為部署也不簡單。當Rails出現的時候,感覺看到了曙光,15分鍾就上線Blog,太快了。寫起來太舒服了。
但是後來,項目越寫越大,動態腳本語言的缺陷就暴漏出來了,依賴編譯都能排除的Bug,只能通過多寫測試來確保了,測試越寫越多,越運行越慢,小團隊可以,但是有誰見過比如50人做一個Rails項目,當然能做,但是肯定會花費更多額外的精力。
那Go就是編譯,並發模型支持,寫起來也不像Java那麼繁瑣,但相對Ruby還是要繁瑣點,性能比Ruby強,就是寫的時候,只管寫代碼,實現了,性能基本過得去,但Ruby和Rails都不一樣了。
另外雖然我覺得Ruby的gems挺好,但是我個人覺得Go的包管理更好,穩定的包直接就用,不穩定的Fork到自己的Github上,進行
hack,然後直接引用自己的包,當然Ruby也能這種方式,但是發布Gem,還是比較有一定的台階的,不是Fork下來就能用這種。
安裝依賴,也不用去維護個gemfile,因為依賴都在代碼里,編譯器保證了你的依賴在你的代碼里調用過的,引用了沒調用過的包,你編譯都通不過。
『貳』 vasp支持python 編譯器么
vasp支持python 編譯器
CSS
CSS權威指南
Eric Meyer的CSS權威指南至今仍然是CSS2講解最全面和最深入的參考書
Javascript and jQuery
Web開發的交互性會越來越多,Javascript已經成為了相當嚴肅的編程語言
JavaScript權威指南
目前最全面最好的Javascript學習書籍
jQuery基礎教程 (第4版)
唯一尚可稱得上緊跟jQuery發展腳步的學習指南
Rails
『叄』 怎麼構建Ruby的開發環境
安裝Ruby
在Windows系統下,安裝Ruby最簡單的辦法是使用RubyInstaller。如果是為了使用Ruby on Rails,則可以下載RailsInstaller並安裝。這會安裝Ruby和Rails等相關工具。在這里,我選擇安裝了Ruby 2.3 64位。安裝過程很簡單,在這里就不細數了。為了方便命令行使用,建議選中將Ruby可執行文件添加到PATH的選項。
安裝完成之後,打了命令提示符。輸入ruby -v查看是否安裝成功。
安裝Ruby DevKit
有時候可能需要安裝一些本地C/C++編譯的Ruby插件和開發工具。這時候就需要安裝Ruby DevKit。安裝方法也很簡單,到Ruby下載頁面,找到DEVELOPMENT KIT字樣,然後下載和自己Ruby版本對應的開發工具包。這應該是一個壓縮包,將其解壓到合適的位置即可。然後在安裝目錄中打開命令提示符,依次運行下面的命令即可。
安裝完成之後,再次安裝這些需要本地編譯的插件就不會失敗了。
安裝IDE
Ruby語言最好用的IDE還是Jetbrains的RubyMine。下載之後安裝即可。具體的配置方法我就不說了,在極客學院這里有更詳細的ntelliJ IDEA使用教程 ,對PHPStorm、RubyMine等Jetbrians系的其他軟體也同樣適用。
『肆』 如何快速正確的安裝 Ruby,Rails 運行環境 · Ruby China
安裝 Ruby,Rails 運行環境首先確定操作系統環境,不建議在 Windows 上面搞,所以你需要用: Mac OS X 任意 Linux 發行版本(Ubuntu,CentOS, Redhat, ArchLinux ...) 強烈新手使用 Ubuntu 省掉不必要的麻煩! 以下代碼區域,帶有 $ 打頭的表示需要在控制台(終端)下面執行(不包括 $ 符號)步驟0 - 安裝系統需要的包# For Mac # 先安裝 [Xcode] 開發工具,它將幫你安裝好 Unix 環境需要的開發包# 然後安裝 [Homebrew]
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
OS X 安裝 Rails 必要的一些三方庫
$ brew install libxml2 libxslt libiconv
步驟1 - 安裝 RVMRVM 是干什麼的這里就不解釋了,後面你將會慢慢搞明白。
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys $ curl -sSL https://get.rvm.io | bash -s stable
# 如果上面的連接失敗,可以嘗試:
$ curl -L https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable
期間可能會問你 sudo 管理員密碼,以及自動通過 Homebrew 安裝依賴包,等待一段時間後就可以成功安裝好 RVM。然後,載入 RVM 環境(新開 Termal 就不用這么做了,會自動重新載入的)$ source ~/.rvm/scripts/rvm修改 RVM 下載 Ruby 的源,到 Ruby China 的鏡像:
echo "ruby_url=https://cache.ruby-china.org/pub/ruby" > ~/.rvm/user/db
檢查一下是否安裝正確
$ rvm -vrvm 1.22.17 (stable) by Wayne E. Seguin <[email protected]>, Michal Papis <[email protected]> [https://rvm.io/]
步驟2 - 用 RVM 安裝 Ruby 環境$ rvm requirements$ rvm install 2.3.0同樣繼續等待漫長的下載,編譯過程,完成以後,Ruby, Ruby Gems 就安裝好了。步驟3 - 設置 Ruby 版本RVM 裝好以後,需要執行下面的命令將指定版本的 Ruby 設置為系統默認版本$ rvm use 2.3.0 --default同樣,也可以用其他版本號,前提是你有用 rvm install 安裝過那個版本這個時候你可以測試是否正確
$ ruby -vruby 2.3.0 ...$ gem -v2.1.6$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
安裝 Bundler$ gem install bundler步驟4 - 安裝 Rails 環境上面 3 個步驟過後,Ruby 環境就安裝好了,接下來安裝 Rails$ gem install rails然後測試安裝是否正確$ rails -vRails 4.2.5然後開始你的 Ruby,Rails 之旅吧。 歡迎來到 Ruby 的世界!
『伍』 Spring,Django,Rails,Express框架用哪些方面
首先從DRY原則開始說起
Don't Repeat Yourself,不要重復你的代碼。
DRY原則的重要性怎麼提都不過分,很多人說編程是種機械性的工作,而有很多程序員也自嘲為碼農,意為編程成了一種沒有技術含量的體力性工作。如果不想淪為這個境界,首先需要的就是將DRY原則融入你的血液,在今後的編碼工作中加以運用。可以加我扣一六二二中間四七九最近四三五分享免費資料視頻
1)最初級的DRY:語法級別
System.out.println(1); System.out.println(2); …… System.out.println(10);
我想只要學過基礎語法,都會採用下面的形式。
for (int i = 1; i <= 10; i++) { System.out.println(i); }
如果發現有任何人採用上面一種形式的編碼形式,那麼不用懷疑,他對於編程絕對還沒有入門。
我們當然會選擇省力的做法,這種做法不但省力,還會有利於我們後續修改或擴展這組代碼,如:
for (int i = 1; i <= 10; i++) { System.out.println(i * 2 + 1); }
我們進行這樣的修改,只需要修改一處,而上面的形式卻需要修改10處,當然會更麻煩且更容易出錯,所以請記住能不重復就不重復。
2)進階的DRY原則:方法級別
當我們經常寫一些重復性代碼時,我們就要注意看能否將其抽取出來成為一個方法,如:
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
讓我們將其抽取到一個方法 threadSleep() 中,這樣我們只需要調用 threadSleep() 就可以實現原來的功能,不但所需敲擊的代碼更少,而且代碼看起來更加清楚明白。而為了增加這個方法的復用性,我們還可以將其中固定的數字抽取成為參數,如:
private static void threadSleep(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } }
這樣我們就可以利用這個方法實現不同時間的sleep了。要注意提高代碼的復用性也是實踐DRY原則的一個重要方法,在後面我們也可以看到框架為了提高所謂的靈活性進行的一些設計,如在適當的位置增加擴展點。
3)繼續進階的DRY原則:類型級別
現在我們看一個類
public class Person { private String name; private int age; // Setter & Getter ... }
我們新建一些Person類實例,並進行一些操作:
Person person = new Person(); person.setName("jack"); person.setAge(18); Person person2 = new Person(); person2.setName("rose"); person2.setAge(17); ..... System.out.printf("Name: %s, Age:%d\n", person.getName(), person.getAge()); System.out.printf("Name: %s, Age:%d\n", person2.getName(), person2.getAge()); .....
觀察這些代碼,其實有很大的DRY改造空間,首先可以添加一個構造方法
public Person(String name, int age) { this.name = name; this.age = age; }
其次,可以添加一個toString()方法
public String toString() { return String.format("Name: %s, Age: %d", name, age); }
這樣的話,上面的代碼就可以改成下面的形式。
Person person = new Person("jack", 18); Person person2 = new Person("rose", 17); ...... System.out.println(person.toString()); System.out.println(person2.toString()); ......
4)繼續繼續進階的DRY原則:多個類組合級別
上面的代碼我們其實還是有改善空間,就是利用容器類
List<Person> list = new ArrayList<>(); list.add(new Person("jack", 18)); list.add(new Person("rose", 17)); ...... list.forEach(p -> System.out.println(p));
這里利用JDK8的Stream API以及Lambda表達式輸出,其實可以進一步簡化為
list.forEach(System.out::println);
這里我們可以看到,基本上我們寫代碼只寫有變化的代碼,而盡量不寫機械性重復性的代碼,其實後面我們就會知道,這就叫專注於業務邏輯,所謂業務邏輯就是你這個項目中,與別的項目都不一樣的地方,必須由你親自去編寫實現的部分。
其實容器類很大程度上也是為了幫助我們編寫代碼而被設計出來的,首先讓我們不必為每一個對象起名字(省去了person,person2,...等變數),然後又為批量操作提供了可能性。像是這樣一系列有用的類組合起來可以稱之為類庫。常用的類庫有Commons-Lang包等,為我們提供了一大批實用方法,我之所以提到類庫,也是因為框架其實也是一種特殊的類庫,但是卻與一般的類庫有著本質的不同。
②
設計模式,更高層級的DRY應用
上面我講到了DRY原則的幾個層次,一般情況下大家也早就這樣使用了,屬於入門之後很容易自己就想到得一些層次。但是設計模式不一樣,設計模式是經過長時間編碼之後,經過系統性的總結所提出的針對某一類問題的最佳解決方案,又稱之為最佳實踐。
而在小規模的編碼工作中,其實並不需要什麼設計模式,只有大型程序才有設計模式發揮的空間,所以我們需要藉助一些特定領域有足夠規模的問題來了解一下設計模式存在的必要性。
1)連接資料庫,進行一些操作,並安全釋放資料庫連接。
public static boolean updatePassword(String username, String password, String newpassword) { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; boolean success = false; try { conn = beginTransaction(); stmt = conn.prepareStatement("select id, password from user where username = ?"); stmt.setString(1, username); rs = stmt.executeQuery(); if (rs.next()) { if (rs.getString("password").equals(password)) { PreparedStatement stmt2 = null; try { stmt2 = conn.prepareStatement("update user set password = ? where id = ?"); stmt2.setString(1, newpassword); stmt2.setLong(2, rs.getLong("id")); success = stmt2.executeUpdate() > 0; } finally { safeClose(stmt2); } } } commitTransaction(conn); return success; } catch (sqlException e) { rollbackTransaction(conn); throw new RuntimeException(e); } finally { safeClose(rs); safeClose(stmt); safeClose(conn); } }
上面是一個簡單的資料庫事務,雖然只有一個查詢和一個更新,但是想要將其繼續簡化卻並不容易,雖然其中有關於業務邏輯的部分只是少量幾行代碼,但是初始化,異常,提交,回滾操作讓我們很難抽取出一個合適的方法來。雖然我們已經抽取出了 begin,commit,rollback,safeClose等方法,但是仍嫌繁瑣。
我們發現之所以我們難以抽取方法,主要是因為流程,因為裡面牽扯到流程式控制制,而流程式控制制一般是由我們程序員來控制的,所以也就必然需要我們手動編碼來完成。難道真的就不能繼續簡化了嗎?這就是需要設計模式的時候了。
2)應用設計模式「模板方法模式」
public static boolean updatePassword(String username, String password, String newpassword) { return connection(conn -> statement(conn, "select id, password from user where username = ?", stmt -> { stmt.setString(1, username); return resultSet(stmt, rs -> { if (rs.next()) { if (rs.getString("password").equals(password)) { long id = rs.getLong("id"); return statement(conn, "update user set password = ? where id = ?", stmt2 -> { stmt2.setString(1, newpassword); stmt2.setLong(2, id); return stmt2.executeUpdate() == 1; }); } } return false; }); })); }
可以看到,所有的conn,stmt,rs的開啟和關閉,事務的提交和回滾都不用自己手動編寫代碼進行操作了,之所以可以達到這個效果,就是因為使用了模板方法設計模式,核心就是通過回調方法傳遞想對資源進行的操作,然後將控制權交給另一個方法,讓這個方法掌握流程式控制制,然後適當的時候回調我們的代碼(也就是我們自己寫的業務邏輯相關的代碼)。
這是需要額外寫的幾個方法
public interface ConnectionCallback<T> { T doConnection(Connection conn) throws SQLException; } public interface StatementCallback<T> { T doStatement(PreparedStatement stmt) throws SQLException; } public interface ResultSetCallback<T> { T doResultSet(ResultSet rs) throws SQLException; } public static <T> T connection(ConnectionCallback<T> callback) { Connection conn = null; T result = null; try { conn = beginTransaction(); result = callback.doConnection(conn); commitTransaction(conn); } catch (SQLException e) { rollbackTransaction(conn); throw new RuntimeException(e); } finally { safeClose(conn); } return result; } public static <T> T statement(Connection conn, String sql, StatementCallback<T> callback) throws SQLException { PreparedStatement stmt = null; T result = null; try { stmt = conn.prepareStatement(sql); result = callback.doStatement(stmt); } finally { safeClose(stmt); } return result; } public static <T> T resultSet(PreparedStatement stmt, ResultSetCallback<T> callback) throws SQLException { ResultSet rs = null; T result = null; try { rs = stmt.executeQuery(); result = callback.doResultSet(rs); } finally { safeClose(rs); } return result; }
你們可能會疑惑,這些代碼加上我們寫的業務邏輯的代碼,比原來的代碼還要長,有什麼必要使用這個設計模式。這正是我前面已經指出的一個問題,那就是要你的程序規模足夠大才有必要應用設計模式,試想如果你有上百個乃至上千個資料庫操作方法需要寫,那麼是不是寫這幾個額外的方法,就不算什麼了呢。
其實這正是DRY原則在更高層次上的應用,即結合設計模式來達到更高層次的代碼復用效果,進而應用DRY原則。而想要在這個層次繼續向上攀升,那就必須是結合眾多設計模式以及一些高層架構設計,能夠幫助我們實現這一目的的就是框架。
3)框架,是設計模式的集大成者,是DRY原則的最高應用
先讓我們來看一下,使用框架會是什麼樣的一種體驗?
這里以Hibernate + Spring聲明式事務為例
@Transactional public boolean updatePassword(String username, String password, String newpassword) { User user = (User) session().createQuery("from User where username = :username") .setString("username", username) .uniqueResult(); if (user != null && user.getPassword().equals(password)) { user.setPassword(newpassword); return true; } return false; }
可以發現令人驚訝的簡潔,而且代碼邏輯異常清晰,完全不需要考慮conn,stmt,rs等資源的釋放,以及事務的提交和回滾,但是這些事情其實框架已經默默的幫我們做到了。這才叫真正的專注於業務邏輯,盡最大可能的只寫與業務邏輯有關的代碼。
當然這些框架的效果雖然神奇,其實只要細細探究其內部原理,是完全可以理解並掌握的。
二、那麼問題就來了,框架到底是什麼?要不要學,怎麼學?
上面我說過了,框架其實就是一個或一組特殊的類庫,特殊在什麼地方?特殊在控制權轉移!
框架與一般類庫不同的地方是,我們調用類庫,而框架調用我們。也就是說框架掌握整個程序的控制權,我們必須一定程度上把程序流程的控制權交給框架,這樣框架才能更好的幫助我們。
下面以JavaWeb開發為例再進行一些說明,並順便簡單介紹一下JavaWeb的一些脈絡。
①靜態網頁時代
本來網站都是一個個靜態HTML組成的,或許這些網頁還是用Dreamweaver寫的,但是這樣的靜態頁面顯然不能滿足我們,很快我們就迎來了動態網頁的時代。
②Servlet時代
如果熟悉HTTP協議的話,我們就知道其實訪問網頁的過程不過是一次TCP連接罷了。瀏覽器發起TCP連接到伺服器,伺服器接受請求,然後返回HTML代碼作為響應。那麼我們完全可以等到接受到請求之後,再動態生成HTML代碼返回給客戶端。
Servlet就是這么做的,其主要代碼不過是利用out.write()一點一點的輸出HTML代碼罷了。當然我們可以在其中摻雜一點動態的東西,如返回當前的時間。
out.write("<!DOCTYPE html>\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<title>Index Page</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("Hello, " + new Date() + "\r\n"); out.write("</body>\r\n"); out.write("</html>\r\n");
③ JSP包打天下的時代
純粹的Servlet很是醜陋,給前端程序員理解和修改這樣的代碼帶來了很多困難。因此JSP技術被發明了出來,原理也不復雜,就是不直接寫Servlet,而是先寫好JSP文件,再由伺服器將JSP文件編譯成Servlet。而JSP中是以常見的HTML標簽為主,這樣前端程序員就能方便的修改這些代碼了。
<!DOCTYPE html> <html> <head> <title>Index Page</title> </head> <body> Hello, <%=new Date()%> </body> </html>
PS:由只使用 Servlet到使用JSP,雖然是一個簡單的變化,但這迎合了前後端專業分工的大趨勢,讓前段人員只需要懂得HTML/CSS/JavaScrip代碼就可以開始工作,而不需要學習Servlet那枯燥無味的用法,因此借著JSP技術的東風,JavaWeb技術迅速的擴展開來了。
④ Servlet + JSP 時代
隨著JSP技術的發展,用它寫成的網站也越來越大,業務邏輯也越來越復雜。開發人員漸漸發現整個網站漸漸的再次變成了一團亂麻,不僅僅是JSP中夾雜了大量的Java代碼,頁面之間的耦合關系也越來越緊密。
即便是要修改一個簡單的按鈕文本,或者是引入一段靜態的內容,也需要打開越來越龐大的JSP頁面,艱難到找到需要修改的部分,有時還不僅僅是一處,這種修改是有很大的風險的,完全有可能引入新的錯誤。
這時候開發者漸漸意識到,僅僅使用JSP是不行的,JSP承擔了太多的責任。這時人們又想起了Servlet,Servlet中主要使用Java代碼,處理業務邏輯非常輕松。如果JSP只使用HTML代碼,而將業務邏輯的代碼轉移到Servlet中,就可以大大的減輕JSP的負擔,並且讓前後端分工更加明確。
⑤MVC模式時代
在Servlet + JSP模式的基礎上,Java陣營進一步發展出了一種適合JavaWeb應用的設計模式,MVC設計模式,即將程序分為顯示層(Viewer),控制層(Controller),模型層(Model)。如下圖所示:
&amp;lt;img src=&quot;https://pic4.mg.com/_b.png&quot; data-rawwidth=&quot;744&quot; data-rawheight=&quot;325&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;744&quot; data-original=&quot;https://pic4.mg.com/_r.png&quot;&amp;gt;一次典型的訪問是這樣的流程:
一次典型的訪問是這樣的流程:
1. 用戶輸入網址或點擊鏈接或提交表單,瀏覽器發起請求
2. --> 通過互聯網,通過HTTP協議 -->
3. Tomcat接受到HTTP請求,生成HttpServletRequest對象,根據Web.xml的配置,調用開發者編寫的HttpServlet,HttpServlet根據請求內容,調用JavaBean獲取數據,JavaBean從資料庫獲取數據,返回HttpServlet,HttpServlet將數據轉發給JSP,JSP負責將數據渲染為HTML,由Tomcat負責將HTML轉化為HTTP響應,返回客戶端。
4. --> 通過互聯網,通過HTTP協議 -->
5. 客戶端瀏覽器接收到HTTP響應,瀏覽器將HTML渲染為頁面,並運行其中可能存在的Java進一步調整界面。
整個流程必須由開發者精確設計才能運作流暢,其中客戶端HTML和Java屬於前端設計,伺服器運行的其他內容屬於後端設計。雖然符合J2EE規范的Tomcat等應用伺服器已經幫我們實現了最復雜的一塊,即HTTP協議部分,還給我們提供了JSP這個模板引擎,以及自定義標簽等手段。但是在控制層,在模型層,J2EE能給我們的幫助少之甚少。
就拿用戶提交一個表單為例,而我們在Servlet中獲取參數為例,雖然不用我們解析HTTP報文,應該已經是要謝天謝地了,但是我們要做的事情仍然很多,分析一下:
1. 客戶端傳過來的數據全是文本,而我們需要的是Java對象。
2. 凡是文本就有編碼問題,而這需要前後端配合解決。
3. 客戶端的輸入是不可信的,我們必須校驗參數的合法性。
4. 我們還必須將校驗結果反饋給客戶,並且最好不要讓客戶全部重新輸入。
5. 我們往往不是只有一個參數需要,而是有幾個甚至更多參數,要妥善的處理各種情況組合。
這些事情幾乎全部都需要我們手動編碼來完成,幾乎每一個 Servlet 都充斥著這樣的代碼,設置編碼,獲取參數,校驗參數,校驗通不過返回錯誤信息,校驗通過則進行業務處理。而更重要的是,獲取參數僅僅是整個流程中的一小步,我們的Servlet中存在著大量的重復性,機械性代碼,而處理業務邏輯的代碼可能只有一兩行。
『陸』 修改rails需要重啟web伺服器嗎
就一句話
啟動時載入後不變和啟動後修改可以重新解析!!
下面是說明:
javaBean和Servlet需要事先編譯好 因為web伺服器只負責使用classes而不編譯classes,然後在伺服器啟動的時候就載入,也就是說在伺服器沒有重啟以前這些載入好了的classes是不會發生變化的,要讓這些classes的改變生效的話只有重啟伺服器重新載入,其實也就是classes的更新了.
以上理解為要用新的就要重新載入!!
而jsp頁面是由web伺服器負責解析的,你每次改了jsp頁面以後是要保存後刷新的,而刷新的作用就是告訴web伺服器重新解析,只有在web伺服器啟動的時候才可以解析!!,但與是否重啟伺服器無關,因為就算你重啟伺服器,它解析jsp的方式也是那樣,是實現好了的,不會改變!你只要用他解析jsp也就好了.
以上理解為要用新的只要重新解析!!
『柒』 關於Ruby
Ruby on Rails是一個用於編寫網路應用程序的框架,它基於計算機軟體語言Ruby,給程序開發人員提供強大的框架支持。Ruby on Rails包括兩部分內容:Ruby語言和Rails框架。
什麼是Ruby?
Ruby 語言是一種動態語言,它與Python、Smalltalk和Perl這3種編程語言有些類似。Ruby語言起源於日本,它的研發者是日本人松本行弘(Matsumoto Yukihiro)。松本行弘在1993年開始著手Ruby語言的研發工作,他開發Ruby語言的初衷是為了提高編程的效率。 1995年12月Matz推出了Ruby的第一個版本Ruby 0.95。
Ruby語言的主要特點如下。
1.純的面向對象語言
在Ruby中,一切皆是對象。下面舉一個例子來更直觀地說明Ruby語言的這一特點。
在Java中,求一個數的絕對值的代碼如下。
int c = Math.abs(-20);
而在Ruby語言中,一切皆是對象,也就是說「-20」這個數也是一個對象,因此,求一個數絕對值的Ruby代碼形式如下。
c = -20.abs
這樣的代碼編寫方式是不是更形象一些呢?
2.解釋型腳本語言
Ruby 語言是解釋型腳本語言,它既有腳本語言強大的字元串處理能力和正則表達式,又不失解釋型語言的動態性。一方面,在最初設計Ruby語言時,Ruby的研發者松本行弘考慮到文字處理方面的需要,他借鑒了Perl語言在文字處理方面的成功經驗。另一方面,松本行弘將Ruby語言設定為一種解釋型語言,Ruby 的動態性使得由Ruby語言編寫的程序不需要事先編譯即可直接運行,這為程序的調試帶來了方便。同時,這一特點可以實現開發過程中的快速反饋。
3.其他特點
(1)動態載入。可以在運行時候重定義自己,類也可以在運行時繼承或取消繼承。
(2)自動內存管理機制。
(3)多精度整數。
(4)迭代器和閉包。
(5)開源項目。有大量活躍的社區支持Ruby語言。
什麼是Rails?
雖然Ruby語言有很多優點,但是一直以來,其流行的范圍也僅限於日本。直到2004年,Ruby才逐漸被世界上其他地區的人們所認識,那麼是什麼讓Ruby語言走向世界的呢?是Rails。
Rails 框架首次提出是在2004年7月,它的研發者是26歲的丹麥人David Heinemeier Hansson。不同於已有復雜的Web 開發框架, Rails是一個更符合實際需要而且更高效的Web開發框架。Rails結合了PHP體系的優點(快速開發)和Java體系的優點(程序規整),因此, Rails在其提出後不長的時間里就受到了業內廣泛的關注。
Rails框架主要有如下的6大特點。
1.全棧式的MVC框架
Rails是一個全棧式的MVC框架,換句話說,通過Rails可以實現MVC模式中的各個層次,並使它們無縫地協同運轉起來。
在實際開發一個MVC模式的Web應用項目時,如果使用Java開發,需要用到Struts(Model層)、Hibernate (Controller 層)和Spring(View層)3個框架,而且需要額外整合3個框架開發出的內容。而使用Ruby語言開發相同的項目時,只需要用到Rails框架就可以完成。
2.約定優於配置
為了說明各個對象之間的關聯關系,一般的Web應用開發框架往往採用寫入XML配置文件的方法。這種方式雖然可以解決一些問題,但是卻帶來了管理上的混亂。
Rails 對此的態度是約定優於配置,這意味著在Rails中不會出現XML配置文件。Rails使用Web應用多年來積累的各種常見約定(更具體地說是命名規則)來代替XML配置文件,而在Rails內部的映射與發現機制根據這些約定可以實現對象之間的關聯。在第1章中,通過Rails的映射與發現機制實現了數據表與Ruby對象之間的關聯。
3.更少的代碼
使用約定來代替XML配置文件說明Rails本身完成了大量的底層工作,這意味著使用更少的代碼來實現應用程序是極有可能的。此外,代碼量的縮減也減小了出現bug的可能性,降低了維護程序和升級程序的難度。
4.生成器
Rails 使用的實時映射技術和元編程技術,免去了開發人員在開發過程中編寫大量樣板文件代碼的煩惱。在少數需要使用樣板文件代碼的時候,開發人員可以通過 Rails內建的生成器腳本實時創建,而不再是通過手工編寫。Rails的這個特點可以使開發人員更專注於系統的邏輯結構,而不必為一些瑣碎的細節所煩擾。
5.零周轉時間
對已有的Web應用系統進行修改後,其一般需要經過配置、編譯、發布、重新設置、測試等一系列步驟才能投入使用,這明顯浪費了許多時間。而使用Rails開發Web應用系統,可以通過瀏覽器即時查看程序運行結果,從而節約了大量的時間。
6.支架系統
Rails的支架系統可以自動為任何相關的資料庫表創建一套包含標准CRUD操作和前台視圖的系統。通過支架系統,開發人員可以方便快捷地操縱資料庫中的數據表。此外,Rails也允許開發人員使用自己設計的代碼或視圖來替換自動生成的代碼和視圖。
目前,Rails的最新版本是2005年12月13日發布的v1.0.0。從RoR正式提出到v1.0.0的發布,RoR在一年多的時間里受到了業內人士的廣泛關注。RoR受到廣泛關注主要有如下兩個原因:首先,RoR的開發效率高(部署容易)、功能豐富(支持Ajax等流行應用),有消息稱對於相同的 Web開發項目,使用RoR開發比使用Java體系架構開發快5~10倍;此外,令人不可思議的高性能是其受到關注的另一個重要原因,根據CSDN上轉載的新聞稱使用RoR開發出來的項目性能,比基於Struts+Hibernate+Spring的Java應用還要高15%~20%。
RoR 當前遇到的主要問題是使用RoR搭建的大型商業應用還很少,究其原因可以概括為兩點:第一,從開發能力的角度,RoR是一個基於Ruby語言的輕型Web 開發框架,很多開發者對其是否適合大型應用難以把握。第二,本身使用RoR開發的大型商業應用較少,使得後來者持觀望態度。
綜合分析來看,RoR的發展前景還是很光明的。RoR在短時間內取得了巨大的成就,它打破了Web開發領域的固有觀念,方便快捷的開發方式使其被廣泛接受。而事實上,現在已有幾家跨國公司正在使用RoR開發自己的Web應用程序,並且有多家大型公司在考慮使用RoR進行Web應用開發。
『捌』 asp.net(C#)做的網頁編譯完成後怎麼打包
其實就是一項非同步交互技術,可以做到局部刷新,增強用戶體驗效果,比如網路或GOOGLE中輸入搜索詞,下邊就出來提示要搜索的內容,這就是AJAX技術實現的,還有GOOGLE地圖,等等。
可以看一下下邊的詳述。
國內通常的讀音為「阿賈克斯」和阿賈克斯足球隊讀音一樣。Web應用的交互如Flickr, Backpack和Google在這方面已經有質的飛躍。這個術語源自描述從基於網頁的Web應用到基於數據的應用的轉換。在基於數據的應用中,用戶需求的數據如聯系人列表,可以從獨立於實際網頁的服務端取得並且可以被動態地寫入網頁中,給緩慢的Web應用體驗著色使之像桌面應用一樣。 雖然大部分開發人員在過去使用過XMLHttp或者使用Iframe來載入數據,但僅到現在我們才看到傳統的開發人員和公司開始採用這些技術。就像新的編程語言或模型伴隨著更多的痛苦,開發人員需要學習新的技巧及如何最好利用這些新技術。
AJAX模式
許多重要的技術和AJAX開發模式可以從現有的知識中獲取。例如,在一個發送請求到服務端的應用中,必須包含請求順序、優先順序、超時響應、錯誤處理及回調,其中許多元素已經在Web服務中包含了,就像現在的SOA。AJAX開發人員擁有一個完整的系統架構知識。同時,隨著技術的成熟還會有許多地方需要改進,特別是UI部分的易用性。
AJAX開發與傳統的CS開發有很大的不同。這些不同引入了新的編程問題,最大的問題在於易用性。由於AJAX依賴瀏覽器的JavaScript和XML,瀏覽器的兼容性和支持的標准也變得和JavaScript的運行時性能一樣重要了。這些問題中的大部分來源於瀏覽器、伺服器和技術的組合,因此必須理解如何才能最好的使用這些技術。
綜合各種變化的技術和強耦合的客戶服務端環境,AJAX提出了一種新的開發方式。AJAX開發人員必須理解傳統的MVC架構,這限制了應用層次之間的邊界。同時,開發人員還需要考慮CS環境的外部和使用AJAX技術來重定型MVC邊界。最重要的是,AJAX開發人員必須禁止以頁面集合的方式來考慮Web應用而需要將其認為是單個頁面。一旦UI設計與服務架構之間的范圍被嚴格區分開來後,開發人員就需要更新和變化的技術集合了。
時刻想著用戶
AJAX的最大機遇在於用戶體驗。在使應用更快響應和創新的過程中,定義Web應用的規則正在被重寫;因此開發人員必須更注重用戶。現在用戶已經逐漸習慣如何使用Web應用了。例如用戶通常希望每一次按鈕點擊會導致幾秒的延遲和屏幕刷新,但AJAX正在打破這種長時間的狀況。因此用戶需要重新體驗按鈕點擊的響應了。
可用性是AJAX令人激動的地方而且已經產生了幾種新穎的技術。其中最引人注目的是一種稱為「黃色隱出」的技術,他在數據更新之前時將用戶界面變為黃色,更新完成後立刻恢復原來的顏色。AJAX開發人員將用戶從Web應用的負載中解放出來;小心地利用AJAX提供的豐富介面,不久桌面開發人員會發現AJAX是他們的方向。
幾種工具和技術
隨著AJAX迅速地引人注目起來,我想開發人員對這種技術的期待也迅速地增加。就像任何新技術,AJAX的興旺也需要一整個開發工具/編程語言及相關技術系統來支撐。
JavaScript
如名字所示AJAX的概念中最重要而最被忽視的是他也是一種JavaScript編程語言。JavaScript是一種粘合劑使AJAX應用的各部分集成在一起。在大部分時間,JavaScript通常被服務端開發人員認為是一種企業級應用不需要使用的東西應該盡力避免。這種觀點來來自以前編寫JavaScript代碼的經歷:繁雜而又易出錯的語言。類似的,他也被認為將應用邏輯任意地散布在服務端和客戶端中,這使得問題很難被發現而且代碼很難重用。在AJAX中JavaScript主要被用來傳遞用戶界面上的數據到服務端並返回結果。XMLHttpRequest對象用來響應通過HTTP傳遞的數據,一旦數據返回到客戶端就可以立刻使用DOM將數據放到網面上。
XMLHttpRequest
XMLHttpRequest對象在大部分瀏覽器上已經實現而且擁有一個簡單的介面允許數據從客戶端傳遞到服務端,但並不會打斷用戶當前的操作。使用XMLHttpRequest傳送的數據可以是任何格式,雖然從名字上建議是XML格式的數據。
開發人員應該已經熟悉了許多其他XML相關的技術。XPath可以訪問XML文檔中的數據,但理解XML DOM是必須的。類似的,XSLT是最簡單而快速的從XML數據生成HTML或XML的方式。許多開發人員已經熟悉Xpath和XSLT,因此AJAX選擇XML作為數據交換格式有意義的。XSLT可以被用在客戶端和服務端,他能夠減少大量的用JavaScript編寫的應用邏輯。
CSS
為了正確的瀏覽AJAX應用,CSS是一種AJAX開發人員所需要的重要武器。CSS提供了從內容中分離應用樣式和設計的機制。雖然CSS在AJAX應用中扮演至關重要的角色,但他也是構建創建跨瀏覽器應用的一大阻礙,因為不同的瀏覽器廠商支持各種不同的CSS級別。
伺服器端
但不像在客戶端,在服務端AJAX應用還是使用建立在如Java,.Net和PHP語言基礎上機制;並沒有改變這個領域中的主要方式。
既然如此,我們對Ruby o n Rails框架的興趣也就迅速增加了。在一年多前,Ruby o n Rails已經吸引了大量開發人員基於其強大功能來構建Web和AJAX應用。雖然目前還有很多快速應用開發工具存在,Ruby o n Rails看起來已經儲備了簡化構建AJAX應用的能力。
開發工具
在實際構建AJAX應用中,你需要的不只是文本編輯器。既然是JavaScript非編譯的,他可以容易地編寫和運行在瀏覽器中;然而,許多工具提供了有用的擴展如語法高亮和智能完成。
不同的IDE提供了對JavaScript支持的不同等級。來自JetBrains的IntelliJ IDEA是一個用來JavaScript開發的更好的IDE,雖然許多開發人員也喜歡Microsoft』s Visual Studio產品(允諾會在最新的版本中改善對AJAX的支持)。Eclipse包含了兩個免費的JavaScript編輯器插件和一個商業的來自ActiveStat的Komodo IDE。
另一個JavaScript和AJAX開發中的問題是調試困難。不同的瀏覽器提供不同的通常是隱藏的運行時錯誤信息,而JavaScript的缺陷如雙重變數賦值(通常是由於缺少數據類型)使得調試更加困難。在AJAX的開發中,調試就更復雜了,因為其需要標識究竟是客戶端還是服務端產生的錯誤。在過去,JavaScript調試的方法是刪除所有代碼然後一行行的增加直到錯誤出現。現在,更多開發人員回到為IE准備的Microsoft Script Debugger和為Mozilla瀏覽器准備的Venkman。
瀏覽器兼容性
JavaScript編程的最大問題來自不同的瀏覽器對各種技術和標準的支持。構建一個運行在不同瀏覽器(如IE和火狐)是一個困難的任務。因此幾種AJAX JavaScript框架或者生成基於服務端邏輯或標記庫的JavaScript,或者提供符合跨瀏覽器AJAX開發的客戶端JavaScript庫。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.
這些框架給開發人員更多的空間使得他們不需要擔心跨瀏覽器的問題。雖然這些框架提升了開發人員構建應用的能力,但由於廠商已經開發了更細節的用戶界面的打包組件解決方案,因此在AJAX組件市場中需要考慮一些其他因素。例如提供通用用戶界面的組件如組合框和數據柵格的幾個廠商,都可以被用來在應用中創建良好的通過類似電子數據表方式來查看和編輯數據的體驗。但這些組件不僅是封裝了組件的用戶界面而且包括與服務端數據的通訊方式,這些組件通常使用基於標記方式來實現如ASP.Net或JSF控制項。
展望
最近IE和火狐之間的瀏覽器之爭變得火熱起來,因此AJAX開發人員需要足夠敏捷的作出反應。關鍵點在一些問題如CSS或XML,雖然各種瀏覽器形成採用最新標準的不同陣營(如Mozilla擁抱SVG和E4X標准及在最新火狐BETA版本中使用XUL,而微軟使用自己的XAML技術)。所有這些技術代表當前AJAX主流JavaScript和XML的市場方向改變。
總的來說,AJAX開發人員必須盡快地跟進最新的技術並利用高產的工具集。成功的AJAX開發人員還需要留心他們的使用者以避免將任何問題擴大化。並且AJAX開發人員還需要持續地創新來創建增強Web應用易用性的新方法。
『玖』 rake db:migrate RAILS_ENV="proction"創建資料庫的時候報錯
上rubygems上下載