package test;
import java.lang.reflect.Field;
import jnr.ffi.LibraryLoader;
import jnr.ffi.Pointer;
import jnr.ffi.Runtime;
public class Test {
public static interface Kernel32 {
boolean TerminateProcess(Pointer handle, int exitCode);
}
public static interface Posix {
int kill(int pid, int sig);
}
public static void main(String[] args) throws Exception {
ProcessBuilder pb = new ProcessBuilder(args[0]);
Process p = pb.start();
System.out.println("Sleeping for 5 seconds");
Thread.sleep(5000);
p.destroy();
if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
if (p.getClass().getName().equals("java.lang.Win32Process") ||
p.getClass().getName().equals("java.lang.ProcessImpl")) {
Field f = p.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handle = f.getLong(p);
System.out.println("Killing process");
Pointer ptr = Pointer.wrap(Runtime.getSystemRuntime(), handle);
int exitCode = 0;
Kernel32 kernel32 = LibraryLoader.create(Kernel32.class).load("Kernel32");
kernel32.TerminateProcess(ptr, exitCode);
}
} else {
if (p.getClass().getName().equals("java.lang.UNIXProcess")) {
Field f = p.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = f.getInt(p);
System.out.println("Killing process");
Posix posix = LibraryLoader.create(Posix.class).load("c");
posix.kill(pid, 9);
}
}
}
}
Tuesday, January 7, 2014
How to Force Kill a Process in Java
In Java, there is no easy way to force a termination of a process spawned in Java. Calling Process.destroy() does not guarantee that the process will be terminated. Although Java 8 might fix this with Process.destroyForcibly(), if you still use older versions of Java, you are out of luck.
Below is a not-so-portable solution to terminate a process on Linux and Windows using Java Native Runtime. You could also use JNA or JNI to invoke the OS native API.
Wednesday, November 6, 2013
How to Embed Python into C++
Below is a simple example how to embed Python into C++.
#include <iostream>
#include <Python.h>
int main(int argc, char* argv[]) {
Py_Initialize();
PyRun_SimpleString("import math; a = 100; result = math.log10(100)");
PyObject* module = PyImport_AddModule("__main__");
PyObject* dictionary = PyModule_GetDict(module);
PyObject* result = PyDict_GetItemString(dictionary, "result");
double resultValue = PyFloat_AsDouble(result);
std::cout << "result: " << resultValue << std::endl;
Py_Finalize();
return 0;
}
Output:
result: 2
Thursday, October 31, 2013
How to Solve Max Volume Problem
My solution for max volume problem.
package main
import (
"fmt"
)
func maxVolume(a []int) int {
left := 0
right := len(a) - 1
volume := 0
total := 0
for left != right {
if a[left] <= a[right] {
for i := left + 1; i < len(a); i++ {
if a[left] > a[i] {
volume += a[left] - a[i]
} else {
left = i
total += volume
volume = 0
break
}
}
} else {
for i := right - 1; i >= left; i-- {
if a[right] > a[i] {
volume += a[right] - a[i]
} else {
right = i
total += volume
volume = 0
break
}
}
}
}
return total
}
func main() {
fmt.Println(maxVolume([]int{2, 5, 1, 2, 3, 4, 7, 7, 6}) == 10)
fmt.Println(maxVolume([]int{2, 5, 1, 3, 1, 2, 1, 7, 7, 6}) == 17)
fmt.Println(maxVolume([]int{2, 3, 1, 2, 3, 1, 3}) == 5)
fmt.Println(maxVolume([]int{1, 2, 3, 4, 5, 6, 7, 8, 9}) == 0)
fmt.Println(maxVolume([]int{9, 8, 7, 6, 5, 4, 3, 2, 1}) == 0)
fmt.Println(maxVolume([]int{1, 1, 1, 1, 1}) == 0)
fmt.Println(maxVolume([]int{1, 0, 1}) == 1)
fmt.Println(maxVolume([]int{5, 0, 5}) == 5)
fmt.Println(maxVolume([]int{5, 0, 4}) == 4)
fmt.Println(maxVolume([]int{4, 0, 5}) == 4)
fmt.Println(maxVolume([]int{4, 0, 5, 0, 2}) == 6)
fmt.Println(maxVolume([]int{0, 1, 0, 1, 0}) == 1)
fmt.Println(maxVolume([]int{0, 1, 0, 0, 1, 0}) == 2)
fmt.Println(maxVolume([]int{4, 2, 2, 1, 1, 1, 3}) == 8)
fmt.Println(maxVolume([]int{0, 3, 2, 1, 4}) == 3)
fmt.Println(maxVolume([]int{1, 0, 1, 0}) == 1)
fmt.Println(maxVolume([]int{1, 0, 1, 2, 0, 2}) == 3)
fmt.Println(maxVolume([]int{2, 5, 1, 2, 3, 4, 7, 7, 6}) == 10)
fmt.Println(maxVolume([]int{5, 1, 0, 1}) == 1)
fmt.Println(maxVolume([]int{2, 5, 1, 2, 3, 4, 7, 7, 6, 3, 5}) == 12)
fmt.Println(maxVolume([]int{3, 0, 1, 0, 2}) == 5)
}
How to Solve Spiral Problem
My solution for spiral problem.
package main
import (
"fmt"
)
func spiral(height, width, row, col int) []int {
a := createSlice(height, width)
result := []int{}
r := row - 1
c := col - 1
result = append(result, a[r][c])
x := 1
for z := 0; (height * width) != len(result); z++ {
for i := 0; i < x; i++ {
r, c = up(r, c)
if !outOfBoundary(height, width, r, c) {
result = append(result, a[r][c])
}
}
for i := 0; i < x; i++ {
r, c = left(r, c)
if !outOfBoundary(height, width, r, c) {
result = append(result, a[r][c])
}
}
x += 1
for i := 0; i < x; i++ {
r, c = down(r, c)
if !outOfBoundary(height, width, r, c) {
result = append(result, a[r][c])
}
}
for i := 0; i < x; i++ {
r, c = right(r, c)
if !outOfBoundary(height, width, r, c) {
result = append(result, a[r][c])
}
}
x += 1
}
return result
}
func outOfBoundary(height, width, row, col int) bool {
return !((row >= 0 && row < height) && (col >= 0 && col < width))
}
func left(row, col int) (int, int) {
return row, col - 1
}
func right(row, col int) (int, int) {
return row, col + 1
}
func up(row, col int) (int, int) {
return row - 1, col
}
func down(row, col int) (int, int) {
return row + 1, col
}
func createSlice(height, width int) [][]int {
a := make([][]int, height)
n := 1
for i := 0; i < height; i++ {
a[i] = make([]int, width)
for j := 0; j < width; j++ {
a[i][j] = n
n += 1
}
}
return a
}
func main() {
fmt.Println(spiral(5, 5, 3, 3))
fmt.Println(spiral(2, 4, 1, 2))
fmt.Println(spiral(5, 5, 4, 2))
}
Sunday, October 27, 2013
How to Call C++ from Go
.
└── src
└── cgotest
├── hello
│ ├── cpp
│ │ └── hellocpp.cpp
│ ├── hello.go
│ ├── include
│ │ └── hellocpp.h
│ └── lib
│ └── libhellocpp.so
└── main.go
hellocpp.h
#ifndef _HELLOCPP_H_
#define _HELLOCPP_H_
#ifdef __cplusplus
extern "C" {
#endif
void SayHello();
#ifdef __cplusplus
}
#endif
#endif
hellocpp.cpp
#include <iostream>
#include "hellocpp.h"
using namespace std;
void SayHello() {
cout << "Hello from C++" << endl;
}
Let's now create a C++ shared library.
cd $GOPATH/src/cgotest/hello mkdir lib g++ -Wall -shared -fpic cpp/hellocpp.cpp -Iinclude -o lib/hellocpp.sohello.go
package hello
// #cgo CFLAGS: -Iinclude
// #cgo LDFLAGS: -Llib -lhellocpp
// #include "hellocpp.h"
import "C"
func HelloFromCpp() {
C.SayHello()
}
main.go
package main
import "cgotest/hello"
func main() {
hello.HelloFromCpp()
}
There seems to be a bug that makes setting relative paths in LDFLAGS not to work. The workaround is to set LIBRARY_PATH env variable using absolute path.
cd $GOPATH export LIBRARY_PATH=$GOPATH/src/cgotest/hello/lib export LD_LIBRARY_PATH=$LIBRARY_PATH go build cgotest ./cgotestOutput:
Hello from C++
Wednesday, October 23, 2013
How to Create a Self-Extracting Installer in Bash
The basic idea of creating a self-extracting installer in Bash is really straightforward. We just need to append the binary package, e.g. an archive file in our installer script.
Here's a simple example on how to do that.
- Create an installer script
- Append an archive file into an installer script
- Give an executable permission
- Execute the installer script
#!/bin/bash
echo "Running self-extracting installer"
ARCHIVE=`awk '/^__START_HERE__/ {print NR + 1; exit 0; }' $0`
echo $ARCHIVE
tail -n+$ARCHIVE $0 | tar xzv
exit 0
__START_HERE__
cat myproject.tar.gz >> installer
chmod +x installer
./installer
Tuesday, October 15, 2013
How to Programmatically Download Dependencies using Ivy
Below is an example how to programmatically download dependencies using Ivy.
apply plugin: "java"
apply plugin: "eclipse"
repositories {
mavenCentral()
}
dependencies {
compile "org.apache.ivy:ivy:2.3.0"
testCompile "junit:junit:4.10"
}
import java.util.ArrayList;
import java.util.List;
import org.apache.ivy.Main;
public class Test {
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("-settings");
list.add("ivysettings.xml");
list.add("-dependency");
list.add("testgroup");
list.add("testartifact");
list.add("1.0.0");
list.add("-retrieve");
list.add("lib/[artifact]-[revision].[ext]");
String[] newArgs = new String[list.size()];
Main.main(list.toArray(newArgs));
}
}
<ivysettings>
<settings defaultResolver="myResolver"/>
<property name="ivy.checksums" value="" />
<include url="${ivy.default.settings.dir}/ivysettings-public.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
<resolvers>
<url name="testivy">
<ivy pattern="http://myivyserver/[organisation]/[module]/[revision]/ivy-[revision].xml" /> -->
<artifact pattern="http://myivyserver/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
</url>
<ibiblio name="testmaven" m2compatible="true" root="http://mymavenserver/maven" />
<chain name="myResolver">
<resolver ref="default" />
<resolver ref="testivy" />
<resolver ref="testmaven" />
</chain>
</resolvers>
</ivysettings>
Subscribe to:
Posts (Atom)