Tuesday, October 25, 2016

Advertising Networks


HRSifu.com reached 20k page view per month. I'm looking for an Advertising Networks to monetize the website traffic. Here are some of the Ad Networks for Publisher:

Google AdSense – Rejected because Policy does not allow computer code generated page website.

Google AdMob – Unfortunately it is a platform for Mobile App, not Web App.

Media.net – Powered by Yahoo and Bing. Rejected because Policy does not allow computer code generated page website.

Infolinks – Approved, low CPM for Asia Website. Only display Facebook Advertisement at the moment.

Adroll - Not working with Publisher.

Quantcast – Not working with Publisher. It has a traffic measurement tool for publisher. Generally it provide information such as visitor gender, age, country and etc., similar to Google Analysis.

Adsoptimal –Approved, low CPM for Asia Website. Only display Jitta Investiment advertisement.

No doubt, Google AdSense is a great Advertising Networks. However, it is difficult to get approved. They are looking for quality content and high traffic website.

Infolinks and Adsoptimal is best alternative for Google AdSense and Media.net. However, CPM is really low because they don’t have quality advertiser. Most of the time only display 1 advertisement.

Wednesday, October 12, 2016

Amazon Web Services (AWS) Free Online Training


  1. Our quick introductory videos on each AWS service.
    https://aws.amazon.com/training/intro_series/
  2. Our ten minute, hands-on tutorials.
    https://aws.amazon.com/getting-started/tutorials/
  3. Our Qwiklabs, which is an in-depth, hands-on simulation training.
    https://run.qwiklab.com/lab_catalogue
  4. Our free online courses on Security in the Cloud and Big Data in the Cloud.
    https://aws.amazon.com/training/course-descriptions/security-fundamentals/
    https://aws.amazon.com/training/course-descriptions/bigdata-fundamentals/
  5. Our monthly webinar series which goes into much more detail on different services.
    https://aws.amazon.com/about-aws/events/monthlywebinarseries/
  6. Our AWS Youtube Webinar channel for past talks and presentations.
    https://www.youtube.com/user/AWSwebinars/feed

Tuesday, February 23, 2016

Open Source Anti Virus - ClamAV

ClamAV is an open source (free) anti-virus engine, support stream scanning using Java API. It’s come with an advanced tool such as online virus pattern database update.

ClamAV supports in Unix, Linus, MaxOS and Window. ClamAV is under Cisco Systems and can be reliable.

In this article, I am going to demonstrate how to install ClamAV in Window and write a sample java application to send a file for scanning.
  1. Download and install ClamAV.
    • Download "clamav-0.99-x64.msi" at http://www.clamav.net/documents/installing-clamav.
    • Double click on "clamav-0.99-x64.msi" to start the installation by selecting default options.
    • ClamAV is installed in folder C:\Program Files\ClamAV-x64 if you follow default options.
  2. Configure ClamAV.
    • Copy clamd.conf.sample and freshclam.conf.sample from C:\Program Files\ClamAV-x64\conf_examples\ to C:\Program Files\ClamAV-x64\.
    • Rename clamd.conf.sample to clamd.conf.
    • Rename freshclam.conf.sample to freshclam.conf.
    • In clamd.conf, 
      • comment "Example" in line number 8.
      • uncomment "TCPSocket" in line number 101.
      • uncomment "TCPAddr" in line number 109.
    • In freshclam.conf,
      • comment "Example" in line number 8.
    • Run freshclam using command prompt to download antivirus database.
    • Start ClamAV by run clamd using command prompt.
  3. Test ClamAV
    • Go to folder C:\Program Files\ClamAV-x64.
    • Run clamscan and scan all files in the directory.
  4. Write a sample JAVA Program
    • Download clamavj-0.1.jar and org.apache.commons.logging.jar at http://soniyj.altervista.org/blog/free-solution-for-check-infected-files-with-java-and-clamav/?doing_wp_cron=1456213243.7796299457550048828125
    • Create Test.java and copy below code:
      import com.philvarner.clamavj.ClamScan;
      import com.philvarner.clamavj.ScanResult;
      
      import java.io.*;
      import java.io.FileInputStream;
      
      public class Test {
       
       public static void main(String args[]) {
        System.out.println("Start");
        ClamScan clamScan = new ClamScan("127.0.0.1", 3310, 20);
        
        try {
         ScanResult result = clamScan.scan(new FileInputStream("D:\\14k.png"));
         System.out.println(result.getStatus());
        } catch (FileNotFoundException e) {
         e.printStackTrace();
        }
        
        System.out.println("End");
       }
       
      }
      
    • Compile Test.java using the command:
      javac -cp clamavj-0.1.jar;org.apache.commons.logging.jar Test.java
      
    • Run Test.java using the command:
      java -cp .;clamavj-0.1.jar;org.apache.commons.logging.jar Test
      
    • The code actually sending "D:\14k.png" to scan and return pass. Passed means the file is clean.
References:

Tuesday, November 17, 2015

Scala map vs flatMap

map is loop thru all element and apply a function into it.
scala> val i = List("Apple", "Banana", "Orange")
i: List[String] = List(Apple, Banana, Orange)

scala> i.map(x => x.toUpperCase)
res2: List[Char] = List(APPLE, BANANA, ORANGE)
flatMap is loop thru all element, flatten the element and apply a function into it.
scala> val i = List("Apple", "Banana", "Orange")
i: List[String] = List(Apple, Banana, Orange)

scala> i.flatMap(x => x.toUpperCase)
res2: List[Char] = List(A, P, P, L, E, B, A, N, A, N, A, O, R, A, N, G, E)
Here is an example on different between map and flatMap in List(List(), List())
scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> def x(v:Int) = List(v,v+1)
x: (v: Int)List[Int]

scala> l.map(i => x(i))
res5: List[List[Int]] = List(List(1, 2), List(2, 3), List(3, 4))

scala> l.flatMap(i => x(i))
res6: List[Int] = List(1, 2, 2, 3, 3, 4)
Here is an example on different between map and flatMap in Option (None and Some). flatMap remove empty value (None).
scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)

scala> def f(x:Int) = if (x > 2) Some(x) else None
f: (x: Int)Option[Int]

scala> l.map( x => f(x))
res11: List[Option[Int]] = List(None, None, Some(3), Some(4), Some(5))

scala> l.flatMap( x => f(x))
res12: List[Int] = List(3, 4, 5)
References:
http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/
http://alvinalexander.com/scala/collection-scala-flatmap-examples-map-flatten

Sunday, November 15, 2015

Scala For Loop Syntax

For Loop with Counter

The simplest loop syntax is:
for (a  <- 1 to 5){
   println(“Print a: ” + a);
}

When the above code is compiled and executed, it produces following result:
Print a: 1
Print a: 2
Print a: 3
Print a: 4
Print a: 5
By default, counter increment is 1. You can change the number of counter increment using "by".
for (a  <- 1 to 5 by 2) {
   println(“Print a: ” + a);
}
When the above code is compiled and executed, it produces following result:
Print a: 1
Print a: 3
Print a: 5

For Loop with Filter

You can filter out some of the elements. Following is the example of for loop along with filters:
for (
   a  <- 1 to 5
   if ( a > 3)
) {
   println(“Print a: ” + a);
}
When the above code is compiled and executed, it produces following result:
Print a: 4
Print a: 5

For Loop with Yield

This is one of the awesome feature in Scala where you generate a static type variable using loop. I don’t really see in other programming language.

When For loop finishes running, it returns a collection of all these yielded values.

The type of the collection that is returned is the same type that you were iterating over.

// Loop through and generate a variable
val i = for (
   a  <- 1 to 5
   if ( a > 3)
) yield {
   a
}

// Print the result
for( a <- i){
   println( "Value of a: " + a );
}
When the above code is compiled and executed, it produces following result:
Print a: 4
Print a: 5

Wednesday, October 28, 2015

Generate CSV in Playframwork

Example of generate CSV by modify output header.

  def exportCSV = Action {
    val data = "data 1, data 2"

      Ok(data).withHeaders(
          CONTENT_TYPE -> "text/csv",
          CONTENT_DISPOSITION -> "attachment; filename=foo.csv"
      )
  }

This method only suitable if you have small amount of data. If not, I would recommend using streaming.