SlideShare a Scribd company logo
.NET @ apache.org

 ApacheCon NA - Vancouver BC
     November 2011 2:30p

       husted@apache.org
http://www.slideshare.net/ted.husted
.NET @ apache.org

Like it or not, many open source developers are moving to the
Microsoft .NET platform, and we're bringing our favorite tools
with us!

In this session, we look inside ASF projects that are creating
software for .NET and Mono, like Logging and Lucene.net -- to
show you how to create leading-edge ASP.NET applications
with ASF open source libraries, and how you can integrate with
other appications using Thrift, Chemistry/DotCMIS, QPid or
ActiveMQ.

We'll also look at integrating other .NET open source projects,
like Spring.NET, NVelocity, and JayRock, into your C#
application to create a complete open source .NET stack.
http://balanagaraj.wordpress.com/
 .NET @ apache.org
 .NET @ apache.org
 .NET @ apache.org
Hello World - Log4Net
using System;
namespace log4net_console
{
  class Program
  {
    static void Main( string[] args )
    {
      log4net.Config. BasicConfigurator.Configure();
      log4net.ILog log = log4net.LogManager.GetLogger (typeof
(Program));
      log.Debug( "Hello World!" );
      log.Info( "I'm a simple log4net tutorial." );
      log.Warn( "... better be careful ..." );
      log.Error( "ruh-roh: an error occurred" );
      log.Fatal( "OMG we're dooooooomed!" );
      Console.ReadLine(); // so you can read the output
    }
  }
}
              http://www.beefycode.com/post/Log4Net-Tutorial-pt-1-Getting-Started.aspx
 .NET @ apache.org
Web.config

<appender name="RollingLogFileAppender" type="
log4net.Appender.RollingFileAppender">
  <threshold value="All" />
  <file value="C:LogFile" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <datePattern value="'.'yyyyMMdd'.log.txt'" />
  <lockingModel type="log4net.Appender.
FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern
value="%date %-5level %logger - %message%newline" />
  </layout>
</appender>
Program.cs

using System;
namespace Tutorial2_BasicXmlConfiguration
{
  class Program
  {
    static void Main( string[] args )
    {
      log4net.Config. XmlConfigurator.Configure();
      log4net.ILog log = log4net.LogManager.GetLogger (typeof(Program));
      log.Info( "beginning loop" );
      for( int c = 0; c < 100; ++c )
      {
        log.DebugFormat( "iteration #{0}", c );
      }
        log.Info( "loop has completed" );
        Console.ReadLine();
      }
  }
}
// http://www.beefycode.com/post/Log4Net-Tutorial-pt-2-Basic-XML-Configuration.aspx
 .NET @ apache.org
http://www.l4ndash.com/
Installation

ZIP Archive              NuGet
 ● Binary                 ● Log4Net
    ○ bin                ● Log4Net Rolling
    ○ doc                  Appender
 ● Source
    ○ examples
    ○ src
    ○ tests
Installation

ZIP Archive              NuGet
 ● Binary                 ● Log4Net
    ○ bin                ● Log4Net Rolling
    ○ doc                  Appender
 ● Source                 ● Twitter Appender
    ○ examples
    ○ src
    ○ tests
Log4net

● When to use it
   ○ You need to analyze the function or performance of an
     application
● What it does
   ○ Writes statements to a file either when certain lines are
     processed or when errors occur
● How it works
   ○ Log4net uses a flexible array of providers to capture
     and categorize logging statements
● Where does it fit in
   ○ Logging is a crosscutting concern that can occur at any
     application layer
Log4Net Resources


● Beefy Code Log4Net Tutorial (7 parts)
   ○ http://www.beefycode.com/post/Log4Net-Tutorial-pt-1-Getting-Started.aspx


● The Code Project Log4Net Tutorial
   ○ http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx


● Log4j Logging Mechanism (Kunal Dabir)
   ○ http://www.slideshare.net/kunal.dabir/log4j-logging-mechanism?src=related_normal&rel=1847004
 .NET @ apache.org
http://lemonodor.com/archives/001361.html
 .NET @ apache.org
 .NET @ apache.org
 .NET @ apache.org
http://www.slideshare.net/otisg/lucene-introduction
 .NET @ apache.org
http://www.slideshare.net/otisg/lucene-introduction
Documents and Fields

// Documents and Fields
var fordFiesta = new Document();
fordFiesta.Add(new Field("Id", "1", Field.Store.YES, Field.Index.NOT_ANALYZED));
fordFiesta.Add(new Field("Make", "Ford", Field.Store.YES, Field.Index.ANALYZED));
fordFiesta.Add(new Field("Model", "Fiesta", Field.Store.YES, Field.Index.ANALYZED));
var fordFocus = new Document();
fordFocus.Add(new Field("Id", "2", Field.Store.YES, Field.Index.NOT_ANALYZED));
fordFocus.Add(new Field("Make", "Ford", Field.Store.YES, Field.Index.ANALYZED));
fordFocus.Add(new Field("Model", "Focus", Field.Store.YES, Field.Index.ANALYZED));

var vauxhallAstra = new Document();
vauxhallAstra.Add(new Field("Id", "3", Field.Store.YES, Field.Index.NOT_ANALYZED));
vauxhallAstra.Add(new Field("Make", "Vauxhall", Field.Store.YES, Field.Index.ANALYZED));
vauxhallAstra.Add(new Field("Model", "Astra", Field.Store.YES, Field.Index.ANALYZED));




                         http://www.d80.co.uk/post/2011/03/29/LuceneNet-Tutorial.aspx
Directories, Analyzers, and Writers

// Directory
string directoryLocation = Environment.CurrentDirectory + "LuceneIndex";
Directory directory = FSDirectory.Open(new DirectoryInfo(directoryLocation));

// Analyzer
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);

// Writer
var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
writer.AddDocument(fordFiesta);
writer.AddDocument(fordFocus);
writer.AddDocument(vauxhallAstra);
writer.Optimize();
writer.Close();
Console.WriteLine("Index stored at " + directoryLocation);
Parse, Query, and Search

// Read Index
IndexReader indexReader = IndexReader.Open(directory, true);
// Parse and Query Index
var queryParser = new QueryParser(Version.LUCENE_29, "Make", analyzer);
var query = queryParser.Parse("Ford");
Searcher indexSearch = new IndexSearcher(indexReader);
// Search Index and review Hits
TopDocs resultDocs = indexSearch.Search(query, indexReader.MaxDoc());
var hits = resultDocs.scoreDocs;
foreach (var hit in hits) {
    var documentFromSearcher = indexSearch.Doc(hit.doc);
    Console.WriteLine(documentFromSearcher.Get("Make") + " " +
     documentFromSearcher.Get("Model"));
}
Lucene.net

● When to use it
   ○ You need to search data in a flexible and powerful way
● What it does
   ○ Indexes data for retrieval from primary storage
● How it works
   ○ Lucene "tokenizes" strings into an inverted index
● Where does it fit in
   ○ Data access and Data storage layer
      ■ Searches are logical queries that access indexes
         stored as a secondary data source
Lucene.net Resources


● Lucene.net Tutorial (Dan's Dev Blog)
   ○ http://www.d80.co.uk/post/2011/03/29/LuceneNet-Tutorial.aspx
   ○ http://www.d80.co.uk/post/2011/09/08/LuceneNet-Video-Tutorial.aspx


● Lucene Introduction
   ○ http://www.slideshare.net/otisg/lucene-introduction


● Simple Lucene - Lucene.net made easy
   ○ http://blogs.planetcloud.co.uk/mygreatdiscovery/post/SimpleLucene-e28093-Lucenenet-made-easy.asp
Lucene.net Resources


● Lucene.net Tutorial (Dan's Dev Blog)
   ○ http://www.d80.co.uk/post/2011/03/29/LuceneNet-Tutorial.aspx
   ○ http://www.d80.co.uk/post/2011/09/08/LuceneNet-Video-Tutorial.aspx


● Lucene Introduction
   ○ http://www.slideshare.net/otisg/lucene-introduction


● Simple Lucene - Lucene.net made easy
   ○ http://blogs.planetcloud.co.uk/mygreatdiscovery/post/SimpleLucene-e28093-Lucenenet-made-easy.asp
 .NET @ apache.org
 .NET @ apache.org
www.slideshare.net/talentica/building-scalable-and-language-independent-java-services-using-apache-thrift-6286467
http://thrift.apache.org/about/
www.slideshare.net/talentica/building-scalable-and-language-independent-java-services-using-apache-thrift-6286467
www.slideshare.net/talentica/building-scalable-and-language-independent-java-services-using-apache-thrift-6286467
time.thrift

# time.thrift namespace java tserver.gen
typedef i64 Timestamp
service TimeServer {
  Timestamp time()
}




               http://nbonvin.wordpress.com/2009/03/08/simple-thrift-tutorial/
Generate the code

thrift --gen java time.thrift
TimeServerImpl.java

package server;
import org.apache.thrift.TException;
import tserver.gen.*;

class TimeServerImpl implements TimeServer.Iface {
  @Override
  public long time() throws TException {
    long time = System.currentTimeMillis();
    System.out.println("time() called: " + time);
    return time;
  }
}
Server.java
package server;
import java.io.IOException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException;
import tserver.gen.TimeServer;
public class Server {
 private void start() {
  try {
   TServerSocket serverTransport = new TServerSocket(7911);
   TimeServer.Processor processor = new TimeServer.Processor(new TimeServerImpl());
   Factory protFactory = new TBinaryProtocol.Factory(true, true);
   TServer server = new TThreadPoolServer(processor, serverTransport, protFactory);
   System.out.println("Starting server on port 7911 ...");
   server.serve();
   } catch (TTransportException e) { e.printStackTrace();
   } catch (IOException e) { e.printStackTrace();
  }
}
public static void main(String args[]) {
  Server srv = new Server(); srv.start(); }}
TimeClient.java
package client;
import java.net.SocketException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException;
import tserver.gen.TimeServer.Client;
public class TimeClient {
  private void start() {
  TTransport transport;
  try {
   transport = new TSocket("localhost", 7911);
   TProtocol protocol = new TBinaryProtocol(transport);
    Client client = new Client(protocol);
    transport.open();
    long time = client.time();
   System.out.println("Time from server:" + time);
   transport.close();
  } catch (SocketException e) { e.printStackTrace(); } catch (TTransportException e) {
    e.printStackTrace(); } catch (TException e) { e.printStackTrace();
  }
}
public static void main(String[] args) {
  TimeClient c = new TimeClient(); c.start(); } }
http://www.slideshare.net/jhammerb/20080611accel
Thrift

● When to use it
   ○ You need to invoke an action between co-located
     servers, especially on a different language platform.
● What it does
   ○ Transfers data to a procedure on the server using a
     flexible, lightweight, efficient protocol
● How it works
   ○ You define the data transfer object and service in a
     JSON-like syntax, and Thrift generates the code for
     client code and stub server code
● Where does it fit in
   ○ Data source layer
       ■ Alternative to SOAP, REST, or COM
Thrift Resources

● Apache Thrift (Prunicki)
    ○ http://jnb.ociweb.com/jnb/jnbJun2009.html


● Getting Started with Apache Thrift Tutorial (Rakowski)
    ○ http://www.thrift.pl/Thrift-tutorial-getting-started.html


● Simple Thrift Tutorial (Bovin)
    ○ http://nbonvin.wordpress.com/2009/03/08/simple-thrift-tutorial/
 .NET @ apache.org
http://gazarenkov.blogspot.com/
http://www.slideshare.net/pie1120/the-point-of-the-content-interoperability-services-cmis-standard
 .NET @ apache.org
http://www.slideshare.net/pie1120/the-point-of-the-content-interoperability-services-cmis-standard
http://www.slideshare.net/pie1120/the-point-of-the-content-interoperability-services-cmis-standard
Chemistry / DotCMIS

● When to use it
   ○ You need to connect CMIS repositories
● What it does
   ○ DotCMIS implements the CMIS client standard
● How it works
   ○ Exchanges data through web services or Atom.
● Where does it fit in
   ○ Data Access Layer
 .NET @ apache.org
 .NET @ apache.org
http://gti-ia.upv.es/sma/tools/magentix2/overview.php
Qpid API

● message
●
● connection
●
● session
●
● sender

● receiver
Qpid API

● message - standard fields, custom properties, and content.
●
● connection
●
● session
●
● sender

● receiver
Qpid API

● message - standard fields, custom properties, and content.
●
● connection - network connection to a remote endpoint.
●
● session
●
● sender

● receiver
Qpid API

● message - standard fields, custom properties, and content.
●
● connection - network connection to a remote endpoint.
●
● session - ordered messages based on a connection.
●
● sender

● receiver
Qpid API

● message - standard fields, custom properties, and content.
●
● connection - network connection to a remote endpoint.
●
● session - ordered messages based on a connection.
●
● sender - based on a session for a given target address.

● receiver
Qpid API

● message - standard fields, custom properties, and content.
●
● connection - network connection to a remote endpoint.
●
● session - ordered messages based on a connection.
●
● sender - based on a session for a given target address.

● receiver - based on a session for a given source address.
using System;
using Org.Apache.Qpid.Messaging;
namespace Org.Apache.Qpid.Messaging {
class Program {
 static void Main(string[] args) {
 String broker = args.Length > 0 ? args[0] : "localhost:5672";
 String address = args.Length > 1 ? args[1] : "amq.topic";
 Connection connection = null;
 try {
  connection = new Connection( broker);
  connection.Open();
  Session session = connection.CreateSession();
  Receiver receiver = session.CreateReceiver( address);
  Sender sender = session.CreateSender( address);
  sender.Send(new Message("Hello world !"));
  Message message = new Message();
  message = receiver. Fetch(DurationConstants.SECOND * 1);
  Console.WriteLine("{0}", message.GetContent());
  session. Acknowledge(); connection. Close();
  } catch (Exception e) {
     Console.WriteLine("Exception {0}.", e);
     if (connection != null) connection.Close();
}}}}




   docs.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.3/html-single/Programming_in_Apache_Qpid/index.html
Qpid

● When to use it
   ○ Various clients need to exchange information with an
     incompatible server.
● What it does
   ○ Places a sophisticated broker between system that can
     queue and/or transform messages.
● How it works
   ○ Qpid implements the AMPQ industry standard.
● Where does it fit in
   ○ Data access layer integration
Qpid Resources

● Message Orientated Middleware (Wikipedia)
     ○ http://en.wikipedia.org/wiki/Message-oriented_middleware


● Advanced Message Queuing Protocol (Wikipedia)
     ○ http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol


● Programming in Apache Qpid (Red Hat)
● http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.3/html-
  single/Programming_in_Apache_Qpid/index.html
ActiveMQ C# Client

● When to use it
   ○ You want to connect a C# client to a Java Messaging
     Server (among others)
● What it does
   ○ Sends and receives messages brokered by a server.
● How it works
   ○ Exposes a standard API and
     provides connectivity.
● Where does it fit in
   ○ Data Access Layer integration

● http://activemq.apache.org/
 .NET @ apache.org
Spring.NET + JayRock + NVelocity

● When to use it
   ○ You would like an alternative to the default ASP.NET
     framework.
● What it does
   ○ With Postgres or MongoDB, forms a soup-to-nuts web
     application platform.
● How it works
   ○ Taken together the platform provides dependency
     injection, remote procedure calls, and dynamic,
     lightweight UI pages.
● Where does it fit in
   ○ All levels
Spring.net
<objects xmlns="http://www.springframework.net">
<object name="MyMovieLister"
 type="Spring.Examples.MovieFinder.MovieLister,
Spring.Examples.MovieFinder">
</object>
</objects>

public static void Main () {
 IApplicationContext ctx = ContextRegistry.GetContext();
 IMovieLister lister = (IMovieLister) ctx.GetObject ("MyMovieLister");
  Movie[] movies = lister.MoviesDirectedBy("Roberto Benigni");
}

public interface IMovieLister
  IList MoviesDirectedBy (string director);
}


                 http://www.springframework.net/doc-latest/reference/html/quickstarts.html
Jayrock

public class HelloWorld : JsonRpcHandler {
[ JsonRpcMethod("greetings") ]
public string Greetings() {
  return "Welcome to Jayrock!";
}}




                         http://jayrock.berlios.de/
Jayrock
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.
org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
  <title>Hello Jayrock</title>
  <script type="text/javascript" src="json.js"></script>
  <script type="text/javascript" src="helloworld.ashx?proxy"></script>
  <script type="text/javascript">
/* <![CDATA[ */

  window.onload = function() {
  var s = new HelloWorld();
  alert("sync:" + s.greetings());
  s.greetings(function(response) {
  alert("async:" + response.result)

}); } /* ]]> */
  </script>
  </head>
<body>
  <p>This page tests the HelloWorld service with Jayrock.</p>
</body>




                                           http://jayrock.berlios.de/
NVelocity

<HTML>
<BODY>
Hello $customer.Name!
<table>
#foreach( $mud in $mudsOnSpecial )
#if ( $customer.hasPurchased($mud) )
<tr> <td>
$flogger.getPromo( $mud )
</td> </tr>
#end
#end
</table>


               http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html
Spring.NET + Jayrock + NVelocity

● Spring.NET
   ○ http://www.springframework.net/


● Jayrock
   ○ http://www.castleproject.org/others/nvelocity/index.html


● NVelocity
   ○ http://www.castleproject.org/others/nvelocity/index.html
 .NET @ apache.org
NPOI

● When to use it
   ○ When you need to read or write XLS, DOC, or PPT.
● What it does
   ○ Exposes an API that can called from a .NET application.
● How it works
   ○ The API reads and writes the file formats directly.
● Where does it fit in
   ○ Data access layer.

● http://npoi.codeplex.com/
http://na11.apachecon.com/talks/19459

          husted@apache.org
   http://www.slideshare.net/ted.husted

More Related Content

What's hot (20)

PPT
Logstash
琛琳 饶
 
PDF
Logstash family introduction
Owen Wu
 
PPT
ELK stack at weibo.com
琛琳 饶
 
PDF
Reversing the dropbox client on windows
extremecoders
 
KEY
groovy & grails - lecture 9
Alexandre Masselot
 
PDF
Node.js cluster
Derek Willian Stavis
 
PPTX
GeeCon.cz - Integration Testing from the Trenches Rebooted
Nicolas Fränkel
 
PDF
Monitoring OSGi Applications with the Web Console - Carsten Ziegeler
mfrancis
 
PPTX
Getting Started With Aura
Chris Tankersley
 
PDF
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Publicis Sapient Engineering
 
PPTX
Everything you wanted to know about writing async, concurrent http apps in java
Baruch Sadogursky
 
PPT
{{more}} Kibana4
琛琳 饶
 
PPTX
Big Data Day LA 2016/ Big Data Track - Fluentd and Embulk: Collect More Data,...
Data Con LA
 
PDF
Piwik elasticsearch kibana at OSC Tokyo 2016 Spring
Takashi Yamamoto
 
PDF
elk_stack_alexander_szalonnas
Alexander Szalonnas
 
PPTX
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
cpsitgmbh
 
PDF
C# e Visual Basic Future: Async Made Simple (DEV304)
Giovanni Bassi
 
PDF
From nothing to Prometheus : one year after
Antoine Leroyer
 
PPT
Iss letcure 7_8
Ali Habeeb
 
PPTX
Presentation: Everything you wanted to know about writing async, high-concurr...
Baruch Sadogursky
 
Logstash
琛琳 饶
 
Logstash family introduction
Owen Wu
 
ELK stack at weibo.com
琛琳 饶
 
Reversing the dropbox client on windows
extremecoders
 
groovy & grails - lecture 9
Alexandre Masselot
 
Node.js cluster
Derek Willian Stavis
 
GeeCon.cz - Integration Testing from the Trenches Rebooted
Nicolas Fränkel
 
Monitoring OSGi Applications with the Web Console - Carsten Ziegeler
mfrancis
 
Getting Started With Aura
Chris Tankersley
 
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Publicis Sapient Engineering
 
Everything you wanted to know about writing async, concurrent http apps in java
Baruch Sadogursky
 
{{more}} Kibana4
琛琳 饶
 
Big Data Day LA 2016/ Big Data Track - Fluentd and Embulk: Collect More Data,...
Data Con LA
 
Piwik elasticsearch kibana at OSC Tokyo 2016 Spring
Takashi Yamamoto
 
elk_stack_alexander_szalonnas
Alexander Szalonnas
 
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
cpsitgmbh
 
C# e Visual Basic Future: Async Made Simple (DEV304)
Giovanni Bassi
 
From nothing to Prometheus : one year after
Antoine Leroyer
 
Iss letcure 7_8
Ali Habeeb
 
Presentation: Everything you wanted to know about writing async, high-concurr...
Baruch Sadogursky
 

Viewers also liked (7)

PDF
Open Source Secret Sauce - Lugor Sep 2011
Ted Husted
 
PPTX
Ship It!
Ted Husted
 
PDF
The secret life_of_open_source
Ted Husted
 
PPTX
Cross browser testing
Sauce Labs
 
PPTX
Desserts and sauces
kellimccabe
 
PDF
Cblm lg gr. 10 tle commercial cooking (cookery)
JeRo Awanan
 
PDF
LM Cookery G9
Cha Caunan
 
Open Source Secret Sauce - Lugor Sep 2011
Ted Husted
 
Ship It!
Ted Husted
 
The secret life_of_open_source
Ted Husted
 
Cross browser testing
Sauce Labs
 
Desserts and sauces
kellimccabe
 
Cblm lg gr. 10 tle commercial cooking (cookery)
JeRo Awanan
 
LM Cookery G9
Cha Caunan
 
Ad

Similar to .NET @ apache.org (20)

PPT
Logging Services for .net - log4net
Guo Albert
 
PPTX
Illuminating Lucene.Net
Dean Thrasher
 
PPTX
Search enabled applications with lucene.net
Willem Meints
 
PPTX
OrigoDB - take the red pill
Robert Friberg
 
PPTX
Search Me: Using Lucene.Net
gramana
 
PPTX
OpenSearchLab and the Lucene Ecosystem
Grant Ingersoll
 
PPTX
MojoPortal And Log4net
VerifiedAD.com
 
PDF
Rapid Prototyping with Solr
Erik Hatcher
 
PPTX
Apache Lucene 4
Grant Ingersoll
 
PDF
2011-12-13 NoSQL aus der Praxis
Johannes Hoppe
 
PPT
IronPython and Dynamic Languages on .NET by Mahesh Prakriya
codebits
 
PDF
Rapid Prototyping with Solr
Erik Hatcher
 
PDF
Rein_in_the_ability_of_log4j
Razorsight
 
PPT
Introduction To Dot Net Siddhesh
Siddhesh Bhobe
 
PDF
Lucene for Solr Developers
Erik Hatcher
 
PPTX
Skillwise - Enhancing dotnet app
Skillwise Group
 
PDF
What is in a Lucene index?
lucenerevolution
 
PDF
.NET TECHNOLOGIES
Prof Ansari
 
PDF
IIPC-Training-Event-Jan-2014-Solr-Introduction.pdf
Matrix823409
 
PPTX
Common.logging
Larry Nung
 
Logging Services for .net - log4net
Guo Albert
 
Illuminating Lucene.Net
Dean Thrasher
 
Search enabled applications with lucene.net
Willem Meints
 
OrigoDB - take the red pill
Robert Friberg
 
Search Me: Using Lucene.Net
gramana
 
OpenSearchLab and the Lucene Ecosystem
Grant Ingersoll
 
MojoPortal And Log4net
VerifiedAD.com
 
Rapid Prototyping with Solr
Erik Hatcher
 
Apache Lucene 4
Grant Ingersoll
 
2011-12-13 NoSQL aus der Praxis
Johannes Hoppe
 
IronPython and Dynamic Languages on .NET by Mahesh Prakriya
codebits
 
Rapid Prototyping with Solr
Erik Hatcher
 
Rein_in_the_ability_of_log4j
Razorsight
 
Introduction To Dot Net Siddhesh
Siddhesh Bhobe
 
Lucene for Solr Developers
Erik Hatcher
 
Skillwise - Enhancing dotnet app
Skillwise Group
 
What is in a Lucene index?
lucenerevolution
 
.NET TECHNOLOGIES
Prof Ansari
 
IIPC-Training-Event-Jan-2014-Solr-Introduction.pdf
Matrix823409
 
Common.logging
Larry Nung
 
Ad

More from Ted Husted (16)

PDF
NU FaceBook 101 JCC 2010
Ted Husted
 
PDF
Developing java Web Applications Using Google Apps RJUG 2011
Ted Husted
 
PDF
Open source secret_sauce_apache_con_2010
Ted Husted
 
PDF
Drupal kickstart-workshop
Ted Husted
 
PDF
Open source-secret-sauce-rit-2010
Ted Husted
 
PDF
Agile Analysis with Use Cases: Balancing Utility with Simplicity
Ted Husted
 
PDF
Testing Web Application Security
Ted Husted
 
PDF
API Doc Smackdown
Ted Husted
 
PDF
Testing The Testers
Ted Husted
 
PDF
Testing Ajax Applications
Ted Husted
 
PPT
Testing Ajax Web Applications
Ted Husted
 
PDF
Testing Tools
Ted Husted
 
PDF
Coding Ajax
Ted Husted
 
PDF
Coding Ajax
Ted Husted
 
PPT
Retrofitting
Ted Husted
 
PDF
Open Source Secret Sauce
Ted Husted
 
NU FaceBook 101 JCC 2010
Ted Husted
 
Developing java Web Applications Using Google Apps RJUG 2011
Ted Husted
 
Open source secret_sauce_apache_con_2010
Ted Husted
 
Drupal kickstart-workshop
Ted Husted
 
Open source-secret-sauce-rit-2010
Ted Husted
 
Agile Analysis with Use Cases: Balancing Utility with Simplicity
Ted Husted
 
Testing Web Application Security
Ted Husted
 
API Doc Smackdown
Ted Husted
 
Testing The Testers
Ted Husted
 
Testing Ajax Applications
Ted Husted
 
Testing Ajax Web Applications
Ted Husted
 
Testing Tools
Ted Husted
 
Coding Ajax
Ted Husted
 
Coding Ajax
Ted Husted
 
Retrofitting
Ted Husted
 
Open Source Secret Sauce
Ted Husted
 

Recently uploaded (20)

PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PPTX
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
PPTX
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
PPTX
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
PPTX
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
PDF
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
PDF
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
PPTX
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PPTX
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
PDF
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
PDF
Market Insight : ETH Dominance Returns
CIFDAQ
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PPTX
Farrell_Programming Logic and Design slides_10e_ch02_PowerPoint.pptx
bashnahara11
 
PDF
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PPTX
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
PDF
Researching The Best Chat SDK Providers in 2025
Ray Fields
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PDF
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
Market Insight : ETH Dominance Returns
CIFDAQ
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Farrell_Programming Logic and Design slides_10e_ch02_PowerPoint.pptx
bashnahara11
 
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
Researching The Best Chat SDK Providers in 2025
Ray Fields
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 

.NET @ apache.org

  • 1. .NET @ apache.org ApacheCon NA - Vancouver BC November 2011 2:30p [email protected] http://www.slideshare.net/ted.husted
  • 2. .NET @ apache.org Like it or not, many open source developers are moving to the Microsoft .NET platform, and we're bringing our favorite tools with us! In this session, we look inside ASF projects that are creating software for .NET and Mono, like Logging and Lucene.net -- to show you how to create leading-edge ASP.NET applications with ASF open source libraries, and how you can integrate with other appications using Thrift, Chemistry/DotCMIS, QPid or ActiveMQ. We'll also look at integrating other .NET open source projects, like Spring.NET, NVelocity, and JayRock, into your C# application to create a complete open source .NET stack.
  • 7. Hello World - Log4Net using System; namespace log4net_console { class Program { static void Main( string[] args ) { log4net.Config. BasicConfigurator.Configure(); log4net.ILog log = log4net.LogManager.GetLogger (typeof (Program)); log.Debug( "Hello World!" ); log.Info( "I'm a simple log4net tutorial." ); log.Warn( "... better be careful ..." ); log.Error( "ruh-roh: an error occurred" ); log.Fatal( "OMG we're dooooooomed!" ); Console.ReadLine(); // so you can read the output } } } http://www.beefycode.com/post/Log4Net-Tutorial-pt-1-Getting-Started.aspx
  • 9. Web.config <appender name="RollingLogFileAppender" type=" log4net.Appender.RollingFileAppender"> <threshold value="All" /> <file value="C:LogFile" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="'.'yyyyMMdd'.log.txt'" /> <lockingModel type="log4net.Appender. FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level %logger - %message%newline" /> </layout> </appender>
  • 10. Program.cs using System; namespace Tutorial2_BasicXmlConfiguration { class Program { static void Main( string[] args ) { log4net.Config. XmlConfigurator.Configure(); log4net.ILog log = log4net.LogManager.GetLogger (typeof(Program)); log.Info( "beginning loop" ); for( int c = 0; c < 100; ++c ) { log.DebugFormat( "iteration #{0}", c ); } log.Info( "loop has completed" ); Console.ReadLine(); } } } // http://www.beefycode.com/post/Log4Net-Tutorial-pt-2-Basic-XML-Configuration.aspx
  • 13. Installation ZIP Archive NuGet ● Binary ● Log4Net ○ bin ● Log4Net Rolling ○ doc Appender ● Source ○ examples ○ src ○ tests
  • 14. Installation ZIP Archive NuGet ● Binary ● Log4Net ○ bin ● Log4Net Rolling ○ doc Appender ● Source ● Twitter Appender ○ examples ○ src ○ tests
  • 15. Log4net ● When to use it ○ You need to analyze the function or performance of an application ● What it does ○ Writes statements to a file either when certain lines are processed or when errors occur ● How it works ○ Log4net uses a flexible array of providers to capture and categorize logging statements ● Where does it fit in ○ Logging is a crosscutting concern that can occur at any application layer
  • 16. Log4Net Resources ● Beefy Code Log4Net Tutorial (7 parts) ○ http://www.beefycode.com/post/Log4Net-Tutorial-pt-1-Getting-Started.aspx ● The Code Project Log4Net Tutorial ○ http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx ● Log4j Logging Mechanism (Kunal Dabir) ○ http://www.slideshare.net/kunal.dabir/log4j-logging-mechanism?src=related_normal&rel=1847004
  • 25. Documents and Fields // Documents and Fields var fordFiesta = new Document(); fordFiesta.Add(new Field("Id", "1", Field.Store.YES, Field.Index.NOT_ANALYZED)); fordFiesta.Add(new Field("Make", "Ford", Field.Store.YES, Field.Index.ANALYZED)); fordFiesta.Add(new Field("Model", "Fiesta", Field.Store.YES, Field.Index.ANALYZED)); var fordFocus = new Document(); fordFocus.Add(new Field("Id", "2", Field.Store.YES, Field.Index.NOT_ANALYZED)); fordFocus.Add(new Field("Make", "Ford", Field.Store.YES, Field.Index.ANALYZED)); fordFocus.Add(new Field("Model", "Focus", Field.Store.YES, Field.Index.ANALYZED)); var vauxhallAstra = new Document(); vauxhallAstra.Add(new Field("Id", "3", Field.Store.YES, Field.Index.NOT_ANALYZED)); vauxhallAstra.Add(new Field("Make", "Vauxhall", Field.Store.YES, Field.Index.ANALYZED)); vauxhallAstra.Add(new Field("Model", "Astra", Field.Store.YES, Field.Index.ANALYZED)); http://www.d80.co.uk/post/2011/03/29/LuceneNet-Tutorial.aspx
  • 26. Directories, Analyzers, and Writers // Directory string directoryLocation = Environment.CurrentDirectory + "LuceneIndex"; Directory directory = FSDirectory.Open(new DirectoryInfo(directoryLocation)); // Analyzer Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); // Writer var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED); writer.AddDocument(fordFiesta); writer.AddDocument(fordFocus); writer.AddDocument(vauxhallAstra); writer.Optimize(); writer.Close(); Console.WriteLine("Index stored at " + directoryLocation);
  • 27. Parse, Query, and Search // Read Index IndexReader indexReader = IndexReader.Open(directory, true); // Parse and Query Index var queryParser = new QueryParser(Version.LUCENE_29, "Make", analyzer); var query = queryParser.Parse("Ford"); Searcher indexSearch = new IndexSearcher(indexReader); // Search Index and review Hits TopDocs resultDocs = indexSearch.Search(query, indexReader.MaxDoc()); var hits = resultDocs.scoreDocs; foreach (var hit in hits) { var documentFromSearcher = indexSearch.Doc(hit.doc); Console.WriteLine(documentFromSearcher.Get("Make") + " " + documentFromSearcher.Get("Model")); }
  • 28. Lucene.net ● When to use it ○ You need to search data in a flexible and powerful way ● What it does ○ Indexes data for retrieval from primary storage ● How it works ○ Lucene "tokenizes" strings into an inverted index ● Where does it fit in ○ Data access and Data storage layer ■ Searches are logical queries that access indexes stored as a secondary data source
  • 29. Lucene.net Resources ● Lucene.net Tutorial (Dan's Dev Blog) ○ http://www.d80.co.uk/post/2011/03/29/LuceneNet-Tutorial.aspx ○ http://www.d80.co.uk/post/2011/09/08/LuceneNet-Video-Tutorial.aspx ● Lucene Introduction ○ http://www.slideshare.net/otisg/lucene-introduction ● Simple Lucene - Lucene.net made easy ○ http://blogs.planetcloud.co.uk/mygreatdiscovery/post/SimpleLucene-e28093-Lucenenet-made-easy.asp
  • 30. Lucene.net Resources ● Lucene.net Tutorial (Dan's Dev Blog) ○ http://www.d80.co.uk/post/2011/03/29/LuceneNet-Tutorial.aspx ○ http://www.d80.co.uk/post/2011/09/08/LuceneNet-Video-Tutorial.aspx ● Lucene Introduction ○ http://www.slideshare.net/otisg/lucene-introduction ● Simple Lucene - Lucene.net made easy ○ http://blogs.planetcloud.co.uk/mygreatdiscovery/post/SimpleLucene-e28093-Lucenenet-made-easy.asp
  • 37. time.thrift # time.thrift namespace java tserver.gen typedef i64 Timestamp service TimeServer { Timestamp time() } http://nbonvin.wordpress.com/2009/03/08/simple-thrift-tutorial/
  • 38. Generate the code thrift --gen java time.thrift
  • 39. TimeServerImpl.java package server; import org.apache.thrift.TException; import tserver.gen.*; class TimeServerImpl implements TimeServer.Iface { @Override public long time() throws TException { long time = System.currentTimeMillis(); System.out.println("time() called: " + time); return time; } }
  • 40. Server.java package server; import java.io.IOException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TBinaryProtocol.Factory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import tserver.gen.TimeServer; public class Server { private void start() { try { TServerSocket serverTransport = new TServerSocket(7911); TimeServer.Processor processor = new TimeServer.Processor(new TimeServerImpl()); Factory protFactory = new TBinaryProtocol.Factory(true, true); TServer server = new TThreadPoolServer(processor, serverTransport, protFactory); System.out.println("Starting server on port 7911 ..."); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String args[]) { Server srv = new Server(); srv.start(); }}
  • 41. TimeClient.java package client; import java.net.SocketException; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import tserver.gen.TimeServer.Client; public class TimeClient { private void start() { TTransport transport; try { transport = new TSocket("localhost", 7911); TProtocol protocol = new TBinaryProtocol(transport); Client client = new Client(protocol); transport.open(); long time = client.time(); System.out.println("Time from server:" + time); transport.close(); } catch (SocketException e) { e.printStackTrace(); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } } public static void main(String[] args) { TimeClient c = new TimeClient(); c.start(); } }
  • 43. Thrift ● When to use it ○ You need to invoke an action between co-located servers, especially on a different language platform. ● What it does ○ Transfers data to a procedure on the server using a flexible, lightweight, efficient protocol ● How it works ○ You define the data transfer object and service in a JSON-like syntax, and Thrift generates the code for client code and stub server code ● Where does it fit in ○ Data source layer ■ Alternative to SOAP, REST, or COM
  • 44. Thrift Resources ● Apache Thrift (Prunicki) ○ http://jnb.ociweb.com/jnb/jnbJun2009.html ● Getting Started with Apache Thrift Tutorial (Rakowski) ○ http://www.thrift.pl/Thrift-tutorial-getting-started.html ● Simple Thrift Tutorial (Bovin) ○ http://nbonvin.wordpress.com/2009/03/08/simple-thrift-tutorial/
  • 51. Chemistry / DotCMIS ● When to use it ○ You need to connect CMIS repositories ● What it does ○ DotCMIS implements the CMIS client standard ● How it works ○ Exchanges data through web services or Atom. ● Where does it fit in ○ Data Access Layer
  • 55. Qpid API ● message ● ● connection ● ● session ● ● sender ● receiver
  • 56. Qpid API ● message - standard fields, custom properties, and content. ● ● connection ● ● session ● ● sender ● receiver
  • 57. Qpid API ● message - standard fields, custom properties, and content. ● ● connection - network connection to a remote endpoint. ● ● session ● ● sender ● receiver
  • 58. Qpid API ● message - standard fields, custom properties, and content. ● ● connection - network connection to a remote endpoint. ● ● session - ordered messages based on a connection. ● ● sender ● receiver
  • 59. Qpid API ● message - standard fields, custom properties, and content. ● ● connection - network connection to a remote endpoint. ● ● session - ordered messages based on a connection. ● ● sender - based on a session for a given target address. ● receiver
  • 60. Qpid API ● message - standard fields, custom properties, and content. ● ● connection - network connection to a remote endpoint. ● ● session - ordered messages based on a connection. ● ● sender - based on a session for a given target address. ● receiver - based on a session for a given source address.
  • 61. using System; using Org.Apache.Qpid.Messaging; namespace Org.Apache.Qpid.Messaging { class Program { static void Main(string[] args) { String broker = args.Length > 0 ? args[0] : "localhost:5672"; String address = args.Length > 1 ? args[1] : "amq.topic"; Connection connection = null; try { connection = new Connection( broker); connection.Open(); Session session = connection.CreateSession(); Receiver receiver = session.CreateReceiver( address); Sender sender = session.CreateSender( address); sender.Send(new Message("Hello world !")); Message message = new Message(); message = receiver. Fetch(DurationConstants.SECOND * 1); Console.WriteLine("{0}", message.GetContent()); session. Acknowledge(); connection. Close(); } catch (Exception e) { Console.WriteLine("Exception {0}.", e); if (connection != null) connection.Close(); }}}} docs.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.3/html-single/Programming_in_Apache_Qpid/index.html
  • 62. Qpid ● When to use it ○ Various clients need to exchange information with an incompatible server. ● What it does ○ Places a sophisticated broker between system that can queue and/or transform messages. ● How it works ○ Qpid implements the AMPQ industry standard. ● Where does it fit in ○ Data access layer integration
  • 63. Qpid Resources ● Message Orientated Middleware (Wikipedia) ○ http://en.wikipedia.org/wiki/Message-oriented_middleware ● Advanced Message Queuing Protocol (Wikipedia) ○ http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol ● Programming in Apache Qpid (Red Hat) ● http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.3/html- single/Programming_in_Apache_Qpid/index.html
  • 64. ActiveMQ C# Client ● When to use it ○ You want to connect a C# client to a Java Messaging Server (among others) ● What it does ○ Sends and receives messages brokered by a server. ● How it works ○ Exposes a standard API and provides connectivity. ● Where does it fit in ○ Data Access Layer integration ● http://activemq.apache.org/
  • 66. Spring.NET + JayRock + NVelocity ● When to use it ○ You would like an alternative to the default ASP.NET framework. ● What it does ○ With Postgres or MongoDB, forms a soup-to-nuts web application platform. ● How it works ○ Taken together the platform provides dependency injection, remote procedure calls, and dynamic, lightweight UI pages. ● Where does it fit in ○ All levels
  • 67. Spring.net <objects xmlns="http://www.springframework.net"> <object name="MyMovieLister" type="Spring.Examples.MovieFinder.MovieLister, Spring.Examples.MovieFinder"> </object> </objects> public static void Main () { IApplicationContext ctx = ContextRegistry.GetContext(); IMovieLister lister = (IMovieLister) ctx.GetObject ("MyMovieLister"); Movie[] movies = lister.MoviesDirectedBy("Roberto Benigni"); } public interface IMovieLister IList MoviesDirectedBy (string director); } http://www.springframework.net/doc-latest/reference/html/quickstarts.html
  • 68. Jayrock public class HelloWorld : JsonRpcHandler { [ JsonRpcMethod("greetings") ] public string Greetings() { return "Welcome to Jayrock!"; }} http://jayrock.berlios.de/
  • 69. Jayrock <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <title>Hello Jayrock</title> <script type="text/javascript" src="json.js"></script> <script type="text/javascript" src="helloworld.ashx?proxy"></script> <script type="text/javascript"> /* <![CDATA[ */ window.onload = function() { var s = new HelloWorld(); alert("sync:" + s.greetings()); s.greetings(function(response) { alert("async:" + response.result) }); } /* ]]> */ </script> </head> <body> <p>This page tests the HelloWorld service with Jayrock.</p> </body> http://jayrock.berlios.de/
  • 70. NVelocity <HTML> <BODY> Hello $customer.Name! <table> #foreach( $mud in $mudsOnSpecial ) #if ( $customer.hasPurchased($mud) ) <tr> <td> $flogger.getPromo( $mud ) </td> </tr> #end #end </table> http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html
  • 71. Spring.NET + Jayrock + NVelocity ● Spring.NET ○ http://www.springframework.net/ ● Jayrock ○ http://www.castleproject.org/others/nvelocity/index.html ● NVelocity ○ http://www.castleproject.org/others/nvelocity/index.html
  • 73. NPOI ● When to use it ○ When you need to read or write XLS, DOC, or PPT. ● What it does ○ Exposes an API that can called from a .NET application. ● How it works ○ The API reads and writes the file formats directly. ● Where does it fit in ○ Data access layer. ● http://npoi.codeplex.com/
  • 74. http://na11.apachecon.com/talks/19459 [email protected] http://www.slideshare.net/ted.husted