SlideShare ist ein Scribd-Unternehmen logo
1 von 56
Downloaden Sie, um offline zu lesen
Web 2.0 on Rails

前田 修吾
 ネットワーク応用通信研究所




自己紹介

名前
前田 修吾
所属
ネットワーク応用通信研究所(NaCl)
Rubyアソシエーション
Railsとの出会い


2005年4月
仕事のため
SOAPがメイン




Railsとの関わり(1)

パッチ
文字コード関連
悲観的ロック
Bug fix
パフォーマンスチューニング
Railsとの関わり(2)

「RailsによるアジャイルWeb
アプリケーション開発」監訳




本日のテーマ


Rails
Ajax
REST
Rails

Ruby on Rails
 Rubyの
 Rubyによる
 Rubyのための
 Web Application Framework




Railsのコンセプト
DRY
 Don't Repeat Yourself

CoC
 Convention over
 Configuration

生産性 > 柔軟性
DRY

重複を排除する
コピペは悪

プログラマの常識
でも実践は難しい




CoC
設定より規約
命名規約により設定を省略
ファイル名をクラスから推測
テーブル名をクラス名から推測

使いやすいデフォルト
設定で上書きも可能
生産性 > 柔軟性

思い切った割り切り
柔軟性よりも生産性を重視
80%のWebアプリケーション
を効率的に書ければよい




Railsの特徴


オールインワン
自動生成
プラグイン
オールインワン

MVCをセットで提供
 密結合

その他のユーティリティ
 テストのサポートなど




自動生成


scaffold
 シンプルなCRUD
 いじりやすい
プラグイン


サードパーティ製のプラグイン
フレームワークの機能を拡張
Railsに取り込まれることも




コンポーネント


ActiveRecord
ActionView
ActionController
ActiveRecord

  モデルを担当
  O/Rマッパー
  PofEAAの同名のパターンに
  由来




  対応


テーブル      クラス
行         オブジェクト
列         属性
モデルの例



class Product < ActiveRecord::Base
end




   ActionView


   ビューを担当
   デフォルトのビューはeRuby
ビューの例



名前: <%= h(@product.name) %><br/>
価格: <%= h(@product.price) %><br/>




   ActionController

   コントローラを担当
   アクション
     メソッドでリクエストを処理

   インスタンス変数をビューから
   参照することができる
コントローラの例


class ProductsController
  def show
    @product = Product.find(params[:id])
  end
end




    Web 2.0 on Rails

    Basecamp
    @nifty TimeLine
    アバウトミー
    Twitter
Basecamp


37signals社
 DHH(=Rails作者)

プロジェクト管理




Basecampの画面
TimeLine


ソーシャルタイムライン
年表の共有




TimeLineの画面
アバウトミー


自分発見プロフィール
みんなに質問




アバウトミーの画面
Twitter
What are you doing?
 今してることをポスト
 実際は任意の短いメッセージ

ゆるいチャット風
 返事がなくてもイタくない
 ということにしたい




Twitterの画面
Why Rails?

なぜWeb 2.0にRailsが適し
ているのか?
 変化に対する柔軟性
 キーテクノロジーのサポート




変化に対する柔軟性

絶えず変化する仕様
 永遠のベータ

変化への対応
 軽量な開発サイクル
 DRY
キーテクノロジー

キーテクノロジーのサポート
 Ajax
 REST
 OpenID




サンプル

Boyakky
 Twitterもどき
 Boyakky = ぼやき

Railsのバージョン
 2.0 Preview Release
Boyakkyの画面




モデル
User


  ユーザを表現
  usersテーブルに対応
     テーブル名は小文字・複数形




  テーブル定義
create_table quot;usersquot;, :force => true do |t|
  t.column :login,            :string
  t.column :email,            :string
  t.column :crypted_password, :string,
           :limit => 40
  t.column :salt,             :string,
           :limit => 40
  t.column :created_at,       :datetime
  t.column :updated_at,       :datetime
  t.column :remember_token, :string
  t.column :remember_token_expires_at,
           :datetime
end
クラス定義


class User < ActiveRecord::Base
  has_many :whines, :include => :user,
           :order => quot;whines.created_at descquot;
  has_many :friendships
  has_many :friends, :through => :friendships
end




     Whine


     ぼやきを表現
     User/Whine = 1対多
テーブル定義

create_table :whines do |t|
  t.integer :user_id
  t.text :body
  t.timestamps
end
add_index :whines, :user_id




   クラス定義


class Whine < ActiveRecord::Base
  belongs_to :user
  attr_protected :user_id
  validates_presence_of :body
end
Friendship


    友達関係(双方向)を表現
    User/User = 多対多




    テーブル定義

create_table :friendships do |t|
  t.integer :user_id
  t.integer :friend_id
  t.timestamps
end
add_index :friendships, [:user_id, :friend_id],
          :unique => true
クラス定義


class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => quot;Userquot;
end




    コントローラ

     3つのコントローラを使用
       AccountController
       WhinesController
       FriendshipsController

     WhinesControllerがメイン
Account


ログイン処理
自動生成
 acts_as_authenticated




Whines
ぼやきの操作
 ホーム(home)
 一覧(index)
 表示(show)
 作成(create)
 削除(destroy)
Friendships

友達関係の操作
 一覧(index)
 作成(show)
 削除(destroy)




ホーム画面

/home/
ログイン後に遷移
ぼやき送信フォーム
自分と友達のぼやき一覧
homeアクション


def home
  # ビューで使用する変数の設定
  @whine = Whine.new
  @whines = current_user.whines_with_friends(:limit => 20)
end




      ぼやき一覧の取得

class User < ActiveRecord::Base
  def whines_with_friends(options = {})
    user_ids = friendships.collect { |i| i.friend_id }
    user_ids.push(id)
    opts = options.merge(:conditions => [
                            quot;user_id in (?)quot;,
                            user_ids
                         ],
                         :order => quot;whines.created_at descquot;,
                         :include => :user)
    return Whine.find(:all, opts)
  end
end
生成されるSQL

SELECT whines.`id` AS t0_r0, whines.`user_id` AS t0_r1,
       whines.`body` AS t0_r2, whines.`created_at` AS t0_r3,
       whines.`updated_at` AS t0_r4, users.`id` AS t1_r0,
       users.`login` AS t1_r1, users.`email` AS t1_r2,
       users.`crypted_password` AS t1_r3, users.`salt` AS t1_r4,
       users.`created_at` AS t1_r5, users.`updated_at` AS t1_r6,
       users.`remember_token` AS t1_r7,
       users.`remember_token_expires_at` AS t1_r8
  FROM whines
  LEFT OUTER JOIN users ON users.id = whines.user_id
  WHERE (user_id in (2,3,4,1)) ORDER BY whines.created_at desc




       home.html.erb

<% remote_form_for(@whine,
                   :before => show_indicator,
                   :complete => hide_indicator) do |f| %>
  <%= f.text_area(:body, :cols => 50, :rows => 2) %>
  <%= f.submit(quot;送信quot;) %>
<% end %>
<div id=quot;whinesquot;>
<% for whine in @whines %>
  <%= render(:partial => quot;whinequot;, :object => whine) %>
<% end %>
</div>
_whine.html.erb
<div id=quot;whine_<%= h(whine.id) %>quot; class=quot;whinequot;>
  <%= image_tag(quot;emoticon_unhappy.pngquot;) %>
  <%= link_to(h(whine.user.login),
              :controller => quot;whinesquot;,
              :user_login => whine.user.login) %>
  <%=h whine.body %>
  <span class=quot;datequot;>
    <%=h whine.created_at.strftime(quot;%Y/%m/%d %H:%M:%Squot;) %>
  </span>
  <% if whine.user == current_user %>
  <%= link_to_remote(image_tag(quot;bin.pngquot;, :alt => quot;削除quot;),
                      :url => whine,
                      :method => :delete,
                      :confirm => quot;本当に削除しますか?quot;,
                      :before => show_indicator,
                      :complete => hide_indicator) %>
  <% end %>
  <%= link_to('permalink', whine) %>
</div>




 remote_form_for

 モデルを作成・編集するため
 のフォームを生成
 remote_はAjaxによるリクエ
 スト送信を意味する
     remote_が付かないform_forは、
     普通にリクエストを送信
Ajax

ここでAjaxの話を
Ajax = Asynchronous
JavaScript + XML
 by Jesse James Garrett




Ajaxの要件
標準に準拠した表示
動的な表示・対話
データ交換・操作
非同期なデータ取得
これらすべての結合
Ajaxの要素技術
XHTML/CSS
Document Object Model
XML/XSLT
XMLHttpRequest
JavaScript




Ajaxの特徴

画面遷移の制約からの解放
 画面の一部だけを更新

リッチなUI
 視覚効果
 ドラッグ&ドロップ
Boyakkyの場合

ぼやきの書き込み後の処理
  古典的なWebアプリケーション
    画面遷移して全画面更新

  Ajaxなアプリケーション
    新しい書き込みを追加するだけ




createアクション

フォームの送信先の処理
def create
  @whine = Whine.new(params[:whine])
  @whine.user = current_user
  @whine.save
end
createのビュー

HTMLの代りにJavaScriptを
返す
 ブラウザがJavaScriptを実行

ただし、JavaScriptは書かな
い




RJS

Ruby-Generated
JavaScript
 JavaScriptの自動生成

Rubyで記述
 DOM操作もRubyで
create.rjs

if @whine.valid?
  page.insert_html(:top, :whines,
                   :partial => quot;whinequot;,
                   :object => @whine)
  page[quot;whine_#{@whine.id}quot;].visual_effect(:highlight)
  page[:whine_body].value = quot;quot;
  page[:whine_body].focus
else
  page[:whine_body].visual_effect(:highlight,
                                  :startcolor => quot;#FF8888quot;)
end




      page変数

       JavaScriptGenerator
       page.insert_html()
          要素の内容にHTML断片を挿入

       page[要素のid]
          要素プロキシを返す
要素プロキシ

    要素を操作するコードを生成
    # 要素をハイライト表示
    page[name].visual_effect(:highlight)
    # 要素のvalue属性に空文字列を設定
    page[name].value = quot;quot;
    # 要素にフォーカスを移動
    page[name].focus




    生成されたコード


$(quot;whine_7quot;).visualEffect(quot;highlightquot;);
$(quot;whine_bodyquot;).value = quot;quot;;
$(quot;whine_bodyquot;).focus();
インジケータ


    リクエストの処理中であること
    を表示
       視覚的フィードバックが重要
       処理しているのがわからないと、
       何度もクリックしてしまう




    インジケータ画像


<%= image_tag quot;indicator.gifquot;,
              :id => quot;indicatorquot;,
              :style => quot;display: nonequot; %>
ajaxload.info

http://www.ajaxload.info/




:before/:complete

Ajax処理前/処理後に実行す
る処理を指定
<% remote_form_for(@whine,
     :before => show_indicator,
     :complete => hide_indicator) do |f| %>
update_page
JavaScriptを生成
def show_indicator
  return update_page { |page|
    page[:indicator].show
  }
end

クライアントサイドで完結



link_to_remote


remote_form_forと同様に
Ajaxリクエストを送信
フォームではなくリンク
link_to_remoteの例

<%= link_to_remote(
      image_tag(quot;bin.pngquot;, :alt => quot;削除quot;),
      :url => whine,
      :method => :delete,
      :confirm => quot;本当に削除しますか?quot;,
      :before => show_indicator,
      :complete => hide_indicator) %>


    「:method => :delete」?




    REST

    ここでRESTの話を
    REST = Representational
    State Transfer
       by Roy Fielding
Architectural style

RESTはArchitectural style
Architectural style
 アーキテクチャのパターン
 MVCとかクライアントサーバとか




Web


WebはRESTの一実装形態
これ以降はWebにおける
RESTの話
リソース


RESTはリソース指向
リソースはURIで識別




リソースの操作
基本はCRUD
リクエストメソッドで識別
操作      メソッド
CREATE  POST
READ    GET
UPDATE  PUT
DELETE  DELETE
再びlink_to_remote
<%= link_to_remote(
      image_tag(quot;bin.pngquot;, :alt => quot;削除quot;),
      :url => whine,
      :method => :delete,


    RESTful
       URIでリソースを識別
       メソッドで操作を識別




    DELETE?
    ブラウザでDELETEを発行?
       普通はできない

    POSTで代用
       パラメータで本来のメソッドを指定
         _method=delete
         PUTも同様
routes.rbの設定


 # config/routes.rb
 ActionController::Routing::Routes.draw do |map|
   map.resources :users
 end




     対応関係

メソッド            URI                アクション
GET             /users             index
POST            /users             create
GET             /users/1           show
PUT             /users/1           update
DELETE          /users/1           destroy
Webサービス

RESTfulなWebサービス
 リソースのRemix

RESTfulでもAPIがばらばらだ
と使いにくい




AtomPub

Atom Publishing Protocol
 RFC5023
 リソースを操作(CRUD)するため
 のプロトコル
 データフォーマットとしてAtom
 (RFC4287)を採用
リソース

      コレクションリソース
          フィード

      メンバリソース
          エントリ




      フィードの例
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<feed xml:lang=quot;jaquot; xmlns=quot;http://www.w3.org/2005/Atomquot;>
  <id>tag:localhost:whines</id>
  <link type=quot;text/htmlquot; rel=quot;alternatequot; href=quot;http://localhost:3000quot;/>
  <title>Whines of all</title>
  <updated>2007-10-29T02:22:44+09:00</updated>
  <entry>
    <id>tag:localhost:3000:Whine10</id>
    <published>2007-10-29T02:22:44+09:00</published>
    <updated>2007-10-29T02:22:44+09:00</updated>
    <title>テスト</title>
    <author>
      <name>shugo</name>
    </author>
    <content type=quot;textquot;>テストです。</content>
  </entry>
  <entry>
  ...
  </entry>
</feed>
エントリの例

<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<entry xml:lang=quot;jaquot; xmlns=quot;http://www.w3.org/2005/Atomquot;>
  <id>tag:localhost:3000:Whine11</id>
  <published>2007-10-29T03:24:31+09:00</published>
  <updated>2007-10-29T03:24:31+09:00</updated>
  <link type=quot;text/htmlquot; rel=quot;alternatequot; href=quot;http://localhost:3000/whines/11quot;/>
  <title>テスト</title>
  <author>
    <name>shugo</name>
  </author>
  <content type=quot;textquot;>テストです。</content>
  <link rel=quot;editquot; href=quot;http://localhost:3000/whines/11.atomquot;/>
</entry>




        フィードの取得


        全ユーザのぼやき一覧
        指定したユーザのぼやき一覧
リクエスト



GET /whines/ HTTP/1.1
Host: example.org




 レスポンス
HTTP/1.1 200 OK
Content-Type: application/atom+xml; charset=utf-8
Content-Length: nnn
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<feed xml:lang=quot;jaquot; xmlns=quot;http://www.w3.org/2005/Atomquot;>
  <id>tag:localhost:whines</id>
  <link type=quot;text/htmlquot; rel=quot;alternatequot; href=quot;http://localhost:3000quot;/>
  <title>Whines of all</title>
  <updated>2007-10-29T02:22:44+09:00</updated>
  <entry>
    <id>tag:localhost:3000:Whine10</id>
    <published>2007-10-29T02:22:44+09:00</published>
    <updated>2007-10-29T02:22:44+09:00</updated>
    <title>テスト</title>
    <author>
      <name>shugo</name>
    </author>
    <content type=quot;textquot;>テストです。</content>
  </entry>
  <entry>
  ...
  </entry>
</feed>
indexアクション
def index
  if @user
    @whines = @user.whines.find(:all, :limit => 20)
  else
    @whines = Whine.find(:all,
                         :order => quot;created_at descquot;,
                         :limit => 20)
  end
  respond_to do |format|
    format.html
    format.atom
  end
end




      respond_to

      Accept:やURIの拡張子に
      よってビューを切替え
         index.html.erb
         index.atom.builder

      Content-Typeも設定
Builderテンプレート


     拡張子は.builder
     ブロックによりXMLの入れ子
     構造を表現




     index.atom.builder

atom_feed(:language => quot;jaquot;) do |feed|
  name = @user.nil? ? quot;allquot; : @user.login
  feed.title(quot;Whines of quot; + name)
  feed.updated(@whines.first.updated_at)
  for whine in @whines
    feed.entry(whine) do |entry|
      whine_atom_entry(entry, whine, :feed => true)
    end
  end
end
whine_atom_entry

def whine_atom_entry(entry, whine, options = {:feed => false})
  if !options[:feed]
    entry.id(quot;tag:#{request.host_with_port}:#{whine.class}#{whine.id}quot;)
    entry.published(whine.created_at.xmlschema)
    entry.updated(whine.updated_at.xmlschema)
    entry.link(:rel => 'alternate', :type => 'text/html',
               :href => whine_url(whine))
  end
  entry.title(truncate(whine.body, 20))
  entry.author do |author|
    author.name(whine.user.login)
  end
  entry.content(whine.body, :type => quot;textquot;)
  entry.link(:rel => quot;editquot;, :href => whine_url(whine) + quot;.atomquot;)
end




       エントリの作成


       Basic認証
       リクエストボディでAtomエン
       トリを送信
リクエスト
 POST /whines/ HTTP/1.1
 Host: example.org
 Authorization: Basic c2h1Z286dGVzdA==
 Content-Type: application/atom+xml;type=entry
 Content-Length: nnn
 <?xml version=quot;1.0quot;?>
 <entry xmlns=quot;http://www.w3.org/2005/Atomquot;>
   <title></title>
   <updated>2007-10-29T01:22:00Z</updated>
   <author><name>Shugo Maeda</name></author>
   <content>AtomPubのテスト</content>
 </entry>




        レスポンス

HTTP/1.1 201 Created
Date: Sun, 28 Oct 2007 18:24:31 GMT
Location: http://localhost:3000/whines/11
Content-Type: application/atom+xml;type=entry
Content-Length: 604
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<entry xml:lang=quot;jaquot; xmlns=quot;http://www.w3.org/2005/Atomquot;>
  <id>tag:localhost:3000:Whine11</id>
  <published>2007-10-29T03:24:31+09:00</published>
  <updated>2007-10-29T03:24:31+09:00</updated>
  <link type=quot;text/htmlquot; rel=quot;alternatequot; href=quot;http://localhost:3000/whines/11quot;/>
  <title>AtomPub&#12398;&#12486;&#12473;&#12488;</title>
  <author>
    <name>shugo</name>
  </author>
  <content type=quot;textquot;>AtomPub&#12398;&#12486;&#12473;&#12488;</content>
  <link rel=quot;editquot; href=quot;http://localhost:3000/whines/11.atomquot;/>
</entry>
parse_atom

       beforeフィルタでAtomエント
       リをハッシュに変換
       before_filter :parse_atom
       def parse_atom
         if /^application/atom+xml/.match(request.env[quot;CONTENT_TYPEquot;])
           xml = REXML::Document.new(request.raw_post)
           params[:whine] = {
             :body => xml.elements[quot;entry/contentquot;].text
           }
         end
         return true
       end




       createアクション
def create
  @whine = Whine.new(params[:whine])
  @whine.user = current_user
  @whine.save
  respond_to do |format|
    format.js
    format.atom do
      if @whine.valid?
        headers[quot;Content-Typequot;] = quot;application/atom+xml;type=entryquot;
        headers[quot;Locationquot;] = whine_url(@whine) + quot;.atomquot;
        render :action => quot;showquot;, :status => 201
      else
        headers[quot;Content-Typequot;] = quot;text/plainquot;
        render :text => quot;validation failednquot;, :status => 400
      end
    end
  end
end
show.atom.builder


xml.instruct!
xml.entry(quot;xml:langquot; => quot;jaquot;,
          quot;xmlnsquot; => quot;http://www.w3.org/2005/Atomquot;) do |entry|
  whine_atom_entry(entry, @whine)
end




       curlによるテスト


 $ curl -D - -u shugo:test --basic -s -X POST 
     -H 'Accept: application/atom+xml' 
     -H 'Content-Type: application/atom+xml;type=entry' 
     --data-binary @entry.atom 
     http://localhost:3000/whines/
まとめ

RJSでJavaScriptを書かずに
Ajaxを実現
map.resourcesでRESTfulに
WebサービスはAtomPubで




参考文献
RailsによるアジャイルWebア
プリケーション開発
 Dave Thomasほか
 ISBN: 978-4-274-06696-2

Ajax on Rails
 Scott Raymond
 ISBN: 978-4-87311-332-6
参考サイト
RJS を使ってみる
 http://jp.rubyist.net/
 magazine/?0014-
 RubyOnRails

REST入門
 http://yohei-
 y.blogspot.com/2005/04/
 rest_23.html




参考サイト(2)


Atom Publishing Protocol
日本語訳
 http://www.ricoh.co.jp/src/
 rd/webtech/rfc5023_ja.html
本日の講演資料

スライドPDF
 http://shugo.net/tmp/
 web2.0-on-rails.pdf

ソースコード
 http://shugo.net/tmp/
 boyakky.zip




おわり



ご静聴ありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

Try Web Components
Try Web ComponentsTry Web Components
Try Web Components拓樹 谷
 
I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)Joel Lord
 
I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)Joel Lord
 
Front-End Dev Tools
Front-End Dev ToolsFront-End Dev Tools
Front-End Dev ToolsNetguru
 
Rails HTML Fragment Caching with Cache Rocket
Rails HTML Fragment Caching with Cache RocketRails HTML Fragment Caching with Cache Rocket
Rails HTML Fragment Caching with Cache Rocketteeparham
 
Beyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehr
Beyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehrBeyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehr
Beyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehrJens-Christian Fischer
 
High Performance Webdesign
High Performance WebdesignHigh Performance Webdesign
High Performance Webdesign拓樹 谷
 
Flickr Open Api Mashup
Flickr Open Api MashupFlickr Open Api Mashup
Flickr Open Api MashupJinho Jung
 
Links/Деловой и денежный мир
Links/Деловой и денежный мирLinks/Деловой и денежный мир
Links/Деловой и денежный мирCavatex
 
Acceptance Testing with Webrat
Acceptance Testing with WebratAcceptance Testing with Webrat
Acceptance Testing with WebratLuismi Cavallé
 
Recommender Systems [Borsani, Camedda, Leo]
Recommender Systems [Borsani, Camedda, Leo]Recommender Systems [Borsani, Camedda, Leo]
Recommender Systems [Borsani, Camedda, Leo]Giulia Camedda
 
Windows 7兼容性系列课程(3):有针对的兼容性开发(上)
Windows 7兼容性系列课程(3):有针对的兼容性开发(上)Windows 7兼容性系列课程(3):有针对的兼容性开发(上)
Windows 7兼容性系列课程(3):有针对的兼容性开发(上)Chui-Wen Chiu
 

Was ist angesagt? (19)

Sk.php
Sk.phpSk.php
Sk.php
 
Try Web Components
Try Web ComponentsTry Web Components
Try Web Components
 
Theme
ThemeTheme
Theme
 
I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)
 
I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)
 
Html5 intro
Html5 introHtml5 intro
Html5 intro
 
Front-End Dev Tools
Front-End Dev ToolsFront-End Dev Tools
Front-End Dev Tools
 
Rails HTML Fragment Caching with Cache Rocket
Rails HTML Fragment Caching with Cache RocketRails HTML Fragment Caching with Cache Rocket
Rails HTML Fragment Caching with Cache Rocket
 
spring_jiaocheng
spring_jiaochengspring_jiaocheng
spring_jiaocheng
 
Emmet cheat-sheet
Emmet cheat-sheetEmmet cheat-sheet
Emmet cheat-sheet
 
Beyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehr
Beyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehrBeyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehr
Beyond HTML - Scriptsprachen, Frameworks, Templatesprachen und vieles mehr
 
High Performance Webdesign
High Performance WebdesignHigh Performance Webdesign
High Performance Webdesign
 
Flickr Open Api Mashup
Flickr Open Api MashupFlickr Open Api Mashup
Flickr Open Api Mashup
 
Links/Деловой и денежный мир
Links/Деловой и денежный мирLinks/Деловой и денежный мир
Links/Деловой и денежный мир
 
Acceptance Testing with Webrat
Acceptance Testing with WebratAcceptance Testing with Webrat
Acceptance Testing with Webrat
 
Tybscrc
TybscrcTybscrc
Tybscrc
 
Recommender Systems [Borsani, Camedda, Leo]
Recommender Systems [Borsani, Camedda, Leo]Recommender Systems [Borsani, Camedda, Leo]
Recommender Systems [Borsani, Camedda, Leo]
 
Ipad gump
Ipad gumpIpad gump
Ipad gump
 
Windows 7兼容性系列课程(3):有针对的兼容性开发(上)
Windows 7兼容性系列课程(3):有针对的兼容性开发(上)Windows 7兼容性系列课程(3):有针对的兼容性开发(上)
Windows 7兼容性系列课程(3):有针对的兼容性开发(上)
 

Ähnlich wie Web 2.0 Apps Built with Ruby on Rails

Ruby on Rails 2.1 What's New Chinese Version
Ruby on Rails 2.1 What's New Chinese VersionRuby on Rails 2.1 What's New Chinese Version
Ruby on Rails 2.1 What's New Chinese VersionLibin Pan
 
Chinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 ZhChinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 ZhJesse Cai
 
Rails Cache
Rails CacheRails Cache
Rails Cachewear
 
Ruby on Rails Tutorial Part I
Ruby on Rails Tutorial Part IRuby on Rails Tutorial Part I
Ruby on Rails Tutorial Part IWei Jen Lu
 
Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門shigeya
 
20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編mochiko AsTech
 
Web應用程式以及資安問題的探討
Web應用程式以及資安問題的探討Web應用程式以及資安問題的探討
Web應用程式以及資安問題的探討Mu Chun Wang
 
Shibuya.abc - Gnashで遊ぼう
Shibuya.abc - Gnashで遊ぼうShibuya.abc - Gnashで遊ぼう
Shibuya.abc - Gnashで遊ぼうgyuque
 
技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTrac技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTracterada
 
Page Caching Resurrected
Page Caching ResurrectedPage Caching Resurrected
Page Caching ResurrectedBen Scofield
 
Spring基础教程
Spring基础教程Spring基础教程
Spring基础教程Shilong Sang
 
事件模型探究
事件模型探究事件模型探究
事件模型探究ematrix
 
jQuery 實戰經驗講座
jQuery 實戰經驗講座jQuery 實戰經驗講座
jQuery 實戰經驗講座Jace Ju
 
DOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript FrameworkDOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript FrameworkMatthew McCullough
 
20081128 Bp Study#15 Active Record
20081128 Bp Study#15 Active Record20081128 Bp Study#15 Active Record
20081128 Bp Study#15 Active RecordTomohito Ozaki
 
Swap Skills I Phone
Swap Skills I PhoneSwap Skills I Phone
Swap Skills I PhoneSwapSkills
 

Ähnlich wie Web 2.0 Apps Built with Ruby on Rails (20)

Ruby on Rails 2.1 What's New Chinese Version
Ruby on Rails 2.1 What's New Chinese VersionRuby on Rails 2.1 What's New Chinese Version
Ruby on Rails 2.1 What's New Chinese Version
 
Chinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 ZhChinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 Zh
 
Dev004奚江華
Dev004奚江華Dev004奚江華
Dev004奚江華
 
Rails Cache
Rails CacheRails Cache
Rails Cache
 
Ruby on Rails Tutorial Part I
Ruby on Rails Tutorial Part IRuby on Rails Tutorial Part I
Ruby on Rails Tutorial Part I
 
Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門
 
20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編
 
Web應用程式以及資安問題的探討
Web應用程式以及資安問題的探討Web應用程式以及資安問題的探討
Web應用程式以及資安問題的探討
 
Shibuya.abc - Gnashで遊ぼう
Shibuya.abc - Gnashで遊ぼうShibuya.abc - Gnashで遊ぼう
Shibuya.abc - Gnashで遊ぼう
 
技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTrac技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTrac
 
Page Caching Resurrected
Page Caching ResurrectedPage Caching Resurrected
Page Caching Resurrected
 
Spring基础教程
Spring基础教程Spring基础教程
Spring基础教程
 
Apache Tapestry
Apache TapestryApache Tapestry
Apache Tapestry
 
事件模型探究
事件模型探究事件模型探究
事件模型探究
 
jQuery 實戰經驗講座
jQuery 實戰經驗講座jQuery 實戰經驗講座
jQuery 實戰經驗講座
 
DOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript FrameworkDOSUG Intro to JQuery JavaScript Framework
DOSUG Intro to JQuery JavaScript Framework
 
Spring Framework勉強会
Spring  Framework勉強会Spring  Framework勉強会
Spring Framework勉強会
 
20081128 Bp Study#15 Active Record
20081128 Bp Study#15 Active Record20081128 Bp Study#15 Active Record
20081128 Bp Study#15 Active Record
 
Swap Skills I Phone
Swap Skills I PhoneSwap Skills I Phone
Swap Skills I Phone
 
Seize The Cloud
Seize The CloudSeize The Cloud
Seize The Cloud
 

Mehr von TH Schee

[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考
[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考
[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考TH Schee
 
COVID19 - Digital Response in Taiwan
COVID19 - Digital Response in TaiwanCOVID19 - Digital Response in Taiwan
COVID19 - Digital Response in TaiwanTH Schee
 
不實訊息在網路的攻防-文本、脈絡和戰術框架的初探
不實訊息在網路的攻防-文本、脈絡和戰術框架的初探不實訊息在網路的攻防-文本、脈絡和戰術框架的初探
不實訊息在網路的攻防-文本、脈絡和戰術框架的初探TH Schee
 
瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力
瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力
瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力TH Schee
 
Digital TAITRA
Digital TAITRADigital TAITRA
Digital TAITRATH Schee
 
後匯流時代台灣的國際參與
後匯流時代台灣的國際參與後匯流時代台灣的國際參與
後匯流時代台灣的國際參與TH Schee
 
給東吳政治系學生的演講
給東吳政治系學生的演講給東吳政治系學生的演講
給東吳政治系學生的演講TH Schee
 
我們對台北這個城市 還沒有搞得很清楚
我們對台北這個城市 還沒有搞得很清楚我們對台北這個城市 還沒有搞得很清楚
我們對台北這個城市 還沒有搞得很清楚TH Schee
 
《民間版國家特別基礎建設條例草案》十大立法原則
《民間版國家特別基礎建設條例草案》十大立法原則《民間版國家特別基礎建設條例草案》十大立法原則
《民間版國家特別基礎建設條例草案》十大立法原則TH Schee
 
The Hero is in the Government. Now What?
The Hero is in the Government. Now What?The Hero is in the Government. Now What?
The Hero is in the Government. Now What?TH Schee
 
從去中心化來看各行業及法規衝擊與人才需求
從去中心化來看各行業及法規衝擊與人才需求從去中心化來看各行業及法規衝擊與人才需求
從去中心化來看各行業及法規衝擊與人才需求TH Schee
 
開放創新之路(2015年@上海)
開放創新之路(2015年@上海)開放創新之路(2015年@上海)
開放創新之路(2015年@上海)TH Schee
 
前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei
前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei
前瞻基礎建設總體檢論壇 (2017/4/21) @ TaipeiTH Schee
 
Crafting Open Data Policy
Crafting Open Data PolicyCrafting Open Data Policy
Crafting Open Data PolicyTH Schee
 
Code for All Summit 2015 (Code for Tomorrow)
Code for All Summit 2015 (Code for Tomorrow)Code for All Summit 2015 (Code for Tomorrow)
Code for All Summit 2015 (Code for Tomorrow)TH Schee
 
網路發展趨勢研習營
網路發展趨勢研習營網路發展趨勢研習營
網路發展趨勢研習營TH Schee
 
NCC 網路治理研討會 2014
NCC 網路治理研討會 2014NCC 網路治理研討會 2014
NCC 網路治理研討會 2014TH Schee
 
雙北機車大問題
雙北機車大問題雙北機車大問題
雙北機車大問題TH Schee
 
開放數據助力生態
開放數據助力生態開放數據助力生態
開放數據助力生態TH Schee
 
Motorcycle Policy in Taiwan - Public Discussion Part 4
Motorcycle Policy in Taiwan - Public Discussion Part 4Motorcycle Policy in Taiwan - Public Discussion Part 4
Motorcycle Policy in Taiwan - Public Discussion Part 4TH Schee
 

Mehr von TH Schee (20)

[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考
[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考
[#民防搞什麼@線上5/14] 自我防衛/人道救援/前後線資通訊應用思考
 
COVID19 - Digital Response in Taiwan
COVID19 - Digital Response in TaiwanCOVID19 - Digital Response in Taiwan
COVID19 - Digital Response in Taiwan
 
不實訊息在網路的攻防-文本、脈絡和戰術框架的初探
不實訊息在網路的攻防-文本、脈絡和戰術框架的初探不實訊息在網路的攻防-文本、脈絡和戰術框架的初探
不實訊息在網路的攻防-文本、脈絡和戰術框架的初探
 
瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力
瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力
瑞士思維 (Geneva.Zone) - 由輔導瑞士最悠久之育成基金會團隊經驗,看日內瓦如何持續引領競爭力
 
Digital TAITRA
Digital TAITRADigital TAITRA
Digital TAITRA
 
後匯流時代台灣的國際參與
後匯流時代台灣的國際參與後匯流時代台灣的國際參與
後匯流時代台灣的國際參與
 
給東吳政治系學生的演講
給東吳政治系學生的演講給東吳政治系學生的演講
給東吳政治系學生的演講
 
我們對台北這個城市 還沒有搞得很清楚
我們對台北這個城市 還沒有搞得很清楚我們對台北這個城市 還沒有搞得很清楚
我們對台北這個城市 還沒有搞得很清楚
 
《民間版國家特別基礎建設條例草案》十大立法原則
《民間版國家特別基礎建設條例草案》十大立法原則《民間版國家特別基礎建設條例草案》十大立法原則
《民間版國家特別基礎建設條例草案》十大立法原則
 
The Hero is in the Government. Now What?
The Hero is in the Government. Now What?The Hero is in the Government. Now What?
The Hero is in the Government. Now What?
 
從去中心化來看各行業及法規衝擊與人才需求
從去中心化來看各行業及法規衝擊與人才需求從去中心化來看各行業及法規衝擊與人才需求
從去中心化來看各行業及法規衝擊與人才需求
 
開放創新之路(2015年@上海)
開放創新之路(2015年@上海)開放創新之路(2015年@上海)
開放創新之路(2015年@上海)
 
前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei
前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei
前瞻基礎建設總體檢論壇 (2017/4/21) @ Taipei
 
Crafting Open Data Policy
Crafting Open Data PolicyCrafting Open Data Policy
Crafting Open Data Policy
 
Code for All Summit 2015 (Code for Tomorrow)
Code for All Summit 2015 (Code for Tomorrow)Code for All Summit 2015 (Code for Tomorrow)
Code for All Summit 2015 (Code for Tomorrow)
 
網路發展趨勢研習營
網路發展趨勢研習營網路發展趨勢研習營
網路發展趨勢研習營
 
NCC 網路治理研討會 2014
NCC 網路治理研討會 2014NCC 網路治理研討會 2014
NCC 網路治理研討會 2014
 
雙北機車大問題
雙北機車大問題雙北機車大問題
雙北機車大問題
 
開放數據助力生態
開放數據助力生態開放數據助力生態
開放數據助力生態
 
Motorcycle Policy in Taiwan - Public Discussion Part 4
Motorcycle Policy in Taiwan - Public Discussion Part 4Motorcycle Policy in Taiwan - Public Discussion Part 4
Motorcycle Policy in Taiwan - Public Discussion Part 4
 

Kürzlich hochgeladen

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Kürzlich hochgeladen (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

Web 2.0 Apps Built with Ruby on Rails