Friday, February 6, 2015

How to create and run Apache JMeter Test Scripts from a Java program


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

 <modelVersion>4.0.0</modelVersion>

 <groupId>myportal</groupId>
 <artifactId>loadtest</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>Zug Portal Load Test Tool</name>
 <url>http://maven.apache.org</url>

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.apache.jmeter</groupId>
   <artifactId>ApacheJMeter_http</artifactId>
   <version>2.11</version>
  </dependency>

 </dependencies>
</project>
package myportal.loadtest;

import java.net.URL;

import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.SetupThreadGroup;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

public class SampleJmeter {

    public static void main(String[] args) {
        // Engine
        StandardJMeterEngine jm = new StandardJMeterEngine();
        URL property = SampleJmeter.class.getClassLoader().getResource("jmeter.properties");

        // jmeter.properties
        JMeterUtils.loadJMeterProperties(property.getPath());

        HashTree hashTree = new HashTree();

        // HTTP Sampler
        HTTPSampler httpSampler = new HTTPSampler();
        httpSampler.setDomain("www.google.com");
        httpSampler.setPort(80);
        httpSampler.setPath("/");
        httpSampler.setMethod("GET");

        // Loop Controller
        TestElement loopCtrl = new LoopController();
        ((LoopController) loopCtrl).setLoops(1);
        ((LoopController) loopCtrl).addTestElement(httpSampler);
        ((LoopController) loopCtrl).setFirst(true);

        // Thread Group
        SetupThreadGroup threadGroup = new SetupThreadGroup();
        threadGroup.setNumThreads(1);
        threadGroup.setRampUp(1);
        threadGroup.setSamplerController((LoopController) loopCtrl);

        // Test plan
        TestPlan testPlan = new TestPlan("MY TEST PLAN");

        hashTree.add("testPlan", testPlan);
        hashTree.add("loopCtrl", loopCtrl);
        hashTree.add("threadGroup", threadGroup);
        hashTree.add("httpSampler", httpSampler);

        jm.configure(hashTree);

        jm.run();
    }
}

meter.properties file is from the JMeter installation /bin directory.

Monday, May 5, 2014

Android infrared (IR) transmitter code sample for Kitkat and Jelly Bean

There are many remote controller application in Google play store. But, I was not able to find an app that I can put my own IR pattern. For some reason, I need to transmit my own pattern.

So, I made a remote controller application. Now I can reach my purpose. It was easy to make for Kitkat OS. but, I wanted to make it run for Jelly Bean OS. Despite of Android API officially offer IR API from Kitkat(4.4). apparently, I see few Samsung Android device has IR transmitter which is running Jelly Bean OS(4.2).

When I run the same app which is using IR API. It didn't run on Jelly Bean as expected. I was wonder how I can control the IR from Jelly Bean OS. Luckily, I found a code sample from https://github.com/rngtng/IrDude thanks to him.

There are list of manufactur IR pattern. Please refer http://www.remotecentral.com/cgi-bin/codes/


\AndroidManifest.xml
Just make sure that minSdkVersion is 17 and target version is 19. as well it needs a permission and feature to handle IR transmitter.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.devtrigger.remotecontrol"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.TRANSMIT_IR"
    android:required="false" />
    <uses-feature android:name="android.hardware.consumerir" />
    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.devtrigger.remotecontrol.MainActivity"
      android:screenOrientation="portrait"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



\res\layout\activity_main.xml
There are just power , Channel up and down button.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonPower"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="irSend"
        android:text="Power" />

    <Button
        android:id="@+id/buttonChUp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="irSend"
        android:text="CH +" />

    <Button
        android:id="@+id/buttonChDown"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="irSend"
        android:text="CH -" />

</LinearLayout>


\src\com\devtrigger\remotecontrol\MainActivity.java
I just removed my own pattern to generalize it and share it on my blog. I put Samsung TV IR pattern on below sample and this Class works find for my Samsung Android device. I have test Galaxy S4 mini Jelly Bean and Galaxy S4 Kitkat.
package com.devtrigger.remotecontrol;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.hardware.ConsumerIrManager;
import android.os.Build;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    Object irdaService;
    Method irWrite;    
    SparseArray<String> irData;
    TextView mFreqsText;
    ConsumerIrManager mCIR;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Be sure to call the super class.
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        irData = new SparseArray<String>();
  irData.put(
    R.id.buttonPower,
    hex2dec("0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0040 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"));
  irData.put(
    R.id.buttonChUp,
    hex2dec("0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 003f 0015 003f 0015 0015 0015 0040 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"));
  irData.put(
    R.id.buttonChDown,
    hex2dec("0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 0015 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"));

  
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
    
    irInit4KitKat();
   }else{
    irInit4JellyBean();
   }
  
    }
    
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void irInit4KitKat() {
     
     // Get a reference to the ConsumerIrManager
        mCIR = (ConsumerIrManager)getSystemService(Context.CONSUMER_IR_SERVICE);
 
 }

 public void irInit4JellyBean() {
  irdaService = this.getSystemService("irda");
  Class c = irdaService.getClass();
  Class p[] = { String.class };
  try {
   irWrite = c.getMethod("write_irsend", p);
  } catch (NoSuchMethodException e) {
   e.printStackTrace();
  }
 }

 public void irSend(View view) {
  
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
   
   irSend4Kitkat(view);
  }else{
   
   irSend4JellyBean(view);
  }
 }
 
 @TargetApi(Build.VERSION_CODES.KITKAT)
 private void irSend4Kitkat(View view) {

    
  String data = irData.get(view.getId());
  if (data != null) {
   String values[] = data.split(",");
   int[] pattern = new int[values.length-1];
   
   for (int i=0; i<pattern.length; i++){
    pattern[i] = Integer.parseInt(values[i+1]);
   }
   
   mCIR.transmit(Integer.parseInt(values[0]), pattern);
  }
 }
 
 private void irSend4JellyBean(View view) {
  String data = irData.get(view.getId());
  if (data != null) {
   try {
    irWrite.invoke(irdaService, data);
   } catch (IllegalArgumentException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    e.printStackTrace();
   }
  }
 }

 protected String hex2dec(String irData) {
  List<String> list = new ArrayList<String>(Arrays.asList(irData
    .split(" ")));
  list.remove(0); // dummy
  int frequency = Integer.parseInt(list.remove(0), 16); // frequency
  list.remove(0); // seq1
  list.remove(0); // seq2

  for (int i = 0; i < list.size(); i++) {
   list.set(i, Integer.toString(Integer.parseInt(list.get(i), 16)));
  }

  frequency = (int) (1000000 / (frequency * 0.241246));
  list.add(0, Integer.toString(frequency));

  irData = "";
  for (String s : list) {
   irData += s + ",";
  }
  return irData;
 }
}

Friday, March 14, 2014

Reversed Binary Numbers (Difficulty Level: Easy)

My friend sent me a quiz how to make a reverse binary from input number and put it back as number.
It is easy level though, I had fun of it
If you are interested to get more quiz, please check this https://code.google.com/codejam/
There are many programing quiz in Internet. I see there are so many genius in the world.
I wonder when I can resolve the difficult level of quiz. I must study math again.


Task

Your task will be to write a program for reversing numbers in binary. For instance, the binary representation of 13 is 1101, and reversing it gives 1011, which corresponds to number 11.

Input

The input contains a single line with an integer N, 1 ≤ N ≤ 1000000000.

Output

Output one line with one integer, the number we get by reversing the binary representation of N.

Sample input 1
13
Sample output 1
11
Sample input 2
47
Sample output 2
61




package puzzle;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 *
 * @author jack
 */
public class Reversebinary {

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

            String input;

            while ((input = br.readLine()) != null) {
                int inputValue = Integer.parseInt(input);

//                System.out.println(Integer.toBinaryString(inputValue));

                StringBuffer revertedString = new StringBuffer();
                revertedString.append(Integer.toBinaryString(inputValue)).reverse();

//                System.out.println(revertedString);
                System.out.println(Long.parseLong(revertedString.toString(), 2));

            }

        } catch (java.lang.NumberFormatException ne) {
            System.out.println("Please type numbers");
        } catch (IOException io) {
            io.printStackTrace();

        }
    }
}

How to get the apk out of the non-rooted Android device

I got a request to test updated Android application. but, it often happens that I need to test without apk file.
Due to complicated commpany rules, politics and security, the requester can't send me the apk file.. But, they push me to do..
To resolve this situation, luckily I had one Android device which is installed the latest apk. but, I need to test it on another device.
I can extract the apk from an Anroid device and install it on the other devices.

To do this step, Android SDK is required. so that you will be able use 'adb' command.

Step to extract apk file from an Android device.
1. Connect the device to the computer
2. start command prompt or shell
3. adb shell pm list package -f -3 (to display all the installed apps on the device)
C:\>adb shell pm list package -f -3
package:/data/app/autotechniksteeg.preistafel-1.apk=autotechniksteeg.preistafel
...
package:/data/app/uk.amazon.mShop.android-2.apk=uk.amazon.mShop.android
...

4. adb pull {apk name} (This will save the required apk on the current directory of the computer)
C:\>adb pull /data/app/uk.amazon.mShop.android-2.apk


If you remove '-3' option, it will show all apk which is pre-loaded app on your device. I used 'adb shell pm list package -f -3' command.
If you like to know more about 'pm list package' filter option, please refer below.
pm list packages: prints all packages, optionally only
  those whose package name contains the text in FILTER.  Options:
    -f: see their associated file.
    -d: filter to only show disbled packages.
    -e: filter to only show enabled packages.
    -s: filter to only show system packages.
    -3: filter to only show third party packages.
    -i: see the installer for the packages.
    -u: also include uninstalled packages.

Thursday, October 24, 2013

receive argument on expect shell script

I just wanted to scp easily. I just simply made a expect shell script which receive one argument.
I just excute one script like below

cp.sh file

and copy finished
#!/usr/bin/expect -f

set filename [lindex $argv 0];

spawn scp -v /temp/$filename root@192.168.1.1:/tmp/root/
expect "Enter passphrase"
send "\r"
...

Thursday, August 8, 2013

Manipulate Access Control List (ACL) on mysql

I had to limit of access to mysql server due to security improvement task.
We like to allow only few host to the mysql. It was very easy

mysql>use mysql
mysql> select host, user from user;
----------------------------+
host  user
----------------------------+
%  dmitry
host : % means all (It is security breach)
host side should be ip address of web server
or
ip address of admin pc.
example)
-- Replace unlimited access rule to only allow 192.168.0.5 host rule
mysql>update user set host='192.168.0.5' where host = '%' and user in ('dmitry');
mysql>commit;
mysql>flush privileges;
Query OK, 0 rows affected (0.01 sec)


-- Remove unlimited access rule

mysql> delete from user where host = '%';
mysql> commit;
mysql> flush privileges;


you can insert more hosts if you like to.

Monday, July 29, 2013

Android Json file read instead of property file read


While I am building an Android application. I wanted to read a property file and wanted to act my app depends on the property file configuration. But, property file can't handle array unless I add dependency Apache Common Configuration. As I am building an mobile application, it should be compact. for the reason, I just used Android JSONObject to resolve this.

Create "country.json" file and locate it Android device "/" directory

{
    "country": [
        {
            "name": "germany",
            "code": "DE",
            "continent": "Europe",
            "eat": "sausage"
        },    
        {
            "name": "france",
            "code": "FR",
            "continent": "Europe",
            "eat": "croissant"
        },
        {
            "name": "korea",
            "code": "KR",
            "continent": "ASIA",
            "eat": "rice"
        },
        {
            "name": "japan",
            "code": "JP",
            "continent": "ASIA",
            "eat": "fish"
        }
    ]
}


Create 2 method and use "getCountryList()" on your need.
private List<Country> getCountryList() throws Exception {

 File dirSDCard = Environment.getExternalStorageDirectory();
 File yourFile = new File(dirSDCard, "country.json");
 InputStream jsonStream = new FileInputStream(yourFile);
 JSONObject jsonObject = new JSONObject(InputStreamToString(jsonStream));
 JSONArray jsonArray = jsonObject.getJSONArray("country");
 List<Country> countryList = new ArrayList<Country>();

 for (int i = 0; i < jsonArray.length(); i++) {

  JSONObject jsonCountry = jsonArray.getJSONObject(i);
  Country country = new Country();
  country.setName(jsoncountry.getString("name"));
  country.setCode(jsoncountry.getString("code"));
  country.setContinent(jsoncountry.getString("continent"));
  country.setEat(jsoncountry.getString("eat"));

  countryList.add(country);
 }

 return countryList;
}

private String InputStreamToString(InputStream is) {

 BufferedReader r = new BufferedReader(new InputStreamReader(is));
 StringBuilder total = new StringBuilder();
 String line;
 try {
  while ((line = r.readLine()) != null) {
   total.append(line);
  }
 } catch (IOException e) {
  e.printStackTrace();
 }
 return total.toString();

}