• Tidak ada hasil yang ditemukan

Implementasi Global Tresholding Metode Otsu dan Tesseract Engine dengan Algoritma Horspool untuk Menerjemahkan Kata Berbahasa Jepang Jenis Katakana

N/A
N/A
Protected

Academic year: 2017

Membagikan "Implementasi Global Tresholding Metode Otsu dan Tesseract Engine dengan Algoritma Horspool untuk Menerjemahkan Kata Berbahasa Jepang Jenis Katakana"

Copied!
19
0
0

Teks penuh

(1)

Listing Program

Otsu_method.java

packagecom.example.demong_pc.implement_ocr_otsu; importandroid.graphics.Bitmap;

importandroid.graphics.Color;

import android.support.v7.app.AppCompatActivity; /**

* Created by Demong - PC on 15-May-17. */

public class Otsu_method extends AppCompatActivity { public static int[] imageHistogram (Bitmap input){111 int[] histogram = new int[256];

for(int i=0; i<histogram.length; i++) histogram[i] = 0; for(int i=0; i<input.getWidth(); i++) {

for(int j=0; j<input.getHeight(); j++) { intwarna = input.getPixel(i,j);

int red= Color.red(warna); histogram[red]++;

} }

return histogram; }

private staticintotsuTreshold (Bitmap original){ int[] histogram = imageHistogram(original);

int total = original.getWidth() * original.getHeight(); float sum = 0;

for(int i=0; i<256; i++) sum += i * histogram[i]; floatsumB = 0;

intwB = 0; intwF = 0;

floatvarMax = 0; int threshold = 0;

for(int i=0 ; i<256 ; i++) { wB += histogram[i];

if(wB == 0) continue; wF = total - wB; if(wF == 0) break;

sumB += (float) (i * histogram[i]); floatmB = sumB / wB;

float mF = (sum - sumB) / wF;

floatvarBetween = (float) wB * (float) wF * (mB - mF) * (mB - mF);

(2)

No table of contents entries found.threshold = i; }

}

return threshold; }

public static Bitmap toGray (Bitmap original){ intalpa_pic,red_pic,green_pic, blue_pic ; intnewPixel;

int width = original.getWidth(); int height = original.getHeight();

Bitmap bmOut = Bitmap.createBitmap(width, height, original.getConfig());

for (int i = 0; i<original.getWidth(); i++){ for (int j=0; j<original.getHeight(); j++){ intwarna = original.getPixel(i,j);

alpa_pic = Color.alpha(warna); red_pic = Color.red(warna); green_pic = Color.green(warna); blue_pic = Color.blue(warna);

red_pic = (int) (0.21 * red_pic + 0.71 * green_pic + 0.07 * blue_pic);; // newPixel =

Color.argb(alpa_pic,red_pic,red_pic,red_pic);

bmOut.setPixel(i,j, Color.argb(alpa_pic,red_pic,red_pic,red_pic)); }

}

returnbmOut; }

public static Bitmap createContrast(Bitmap src, double value) { // image size

int width = src.getWidth(); int height = src.getHeight(); // create output bitmap

Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());

// color information int A, R, G, B;

int pixel;

// get contrast value

double contrast = Math.pow((100 + value) / 100, 2); // scan through all pixels

for(int x = 0; x < width; ++x) { for(int y = 0; y < height; ++y) { // get pixel color pixel = src.getPixel(x, y);

A = Color.alpha(pixel);

// apply filter contrast for every channel R, G, B R = Color.red(pixel);

(3)

if(R < 0) { R = 0; }

else if(R > 255) { R = 255; }

G = Color.red(pixel);

G = (int)(((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);

if(G < 0) { G = 0; }

else if(G > 255) { G = 255; }

B = Color.red(pixel);

B = (int)(((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);

if(B < 0) { B = 0; }

else if(B > 255) { B = 255; }

// set new pixel color to output bitmap bmOut.setPixel(x, y, Color.argb(A, R, G, B));

} } returnbmOut; }

public static Bitmap binarize (Bitmap original){ int red;

intnewPixel;

int width = original.getWidth(); int height = original.getHeight(); int threshold = otsuTreshold(original);

Bitmap asule = Bitmap.createBitmap(width, height, original.getConfig());

for (int i = 0; i<original.getWidth(); i++){ for (int j= 0; j<original.getHeight(); j++){ intwarna = original.getPixel(i,j);

intalpa_pic = Color.alpha(warna); intred_pic = Color.red(warna); if(red_pic> threshold){

newPixel = 255; } else{

newPixel = 0; }

newPixel = Color.argb(alpa_pic,newPixel,newPixel,newPixel); asule.setPixel(i,j,newPixel);

} } return asule; }

}

CaptureActivity.java

packagecom.example.demong_pc.implement_ocr_otsu.fragment; importandroid.app.Activity;

(4)

importandroid.content.Context;

importandroid.content.DialogInterface; importandroid.content.Intent;

importandroid.content.pm.PackageManager; importandroid.content.res.AssetManager; importandroid.database.Cursor;

importandroid.graphics.Bitmap; importandroid.graphics.Canvas; importandroid.graphics.Matrix; importandroid.graphics.Paint;

importandroid.graphics.drawable.BitmapDrawable; importandroid.net.Uri;

importandroid.os.AsyncTask; importandroid.os.Bundle;

importandroid.provider.MediaStore; importandroid.speech.tts.TextToSpeech;

importandroid.support.design.widget.FloatingActionButton; importandroid.support.media.ExifInterface;

import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; importandroid.util.Log;

importandroid.view.LayoutInflater; importandroid.view.View;

importandroid.view.ViewGroup; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.ImageView; importandroid.widget.Toast;

importcom.example.demong_pc.implement_ocr_otsu.ApiConnector; importcom.example.demong_pc.implement_ocr_otsu.ConvolutionMatrix; importcom.example.demong_pc.implement_ocr_otsu.DownloadImageTask; importcom.example.demong_pc.implement_ocr_otsu.Otsu_method; importcom.example.demong_pc.implement_ocr_otsu.R;

importcom.example.demong_pc.implement_ocr_otsu.activity.Utility; importcom.example.demong_pc.implement_ocr_otsu.translate.Language; importcom.example.demong_pc.implement_ocr_otsu.translate.YandexTranslato rAPI;

importcom.googlecode.tesseract.android.TessBaseAPI; importorg.json.JSONArray;

importorg.json.JSONObject;

importjava.io.ByteArrayOutputStream; importjava.io.File;

importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; import java.net.URL;

(5)

/**

* Created by Demong - PC on 07-May-17. */

public class CaptureActivity extends Fragment implements View.OnClickListener{

// TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1";

private static final String ARG_PARAM2 = "param2";

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;

// TODO: Rename and change types of parameters private String mParam1;

private String mParam2;

private String userChoosenTask, pat; privateExifInterfaceexif;

privateint REQUEST_CAMERA = 0, SELECT_FILE = 1; privateFloatingActionButton fab;

privateImageViewphoto,tulis;

private Bitmap resize,ocr_has,greyscale,bismilah; privateEditText OCR;

privateEditTexthasil;

private String url,query,url2; private Button trans,voice;

private Locale bahasa_awal= Locale.ENGLISH; private Locale bahasa_tujuan= Locale.ENGLISH; private char aduh;

privateOnFragmentInteractionListenermListener; public static String apiKey

="trnsl.1.1.20170521T102809Z.607761b5575a2d66.a6024221856221c34eb6f93d9c 5e50436f3d405d";

private static final String SERVICE_URL =

"https://translate.yandex.net/api/v1.5/tr.json/translate?"; private static final String TRANSLATION_LABEL = "text"; private static final String baseUrlForImage =

"http://192.168.43.164/tugasAkhir/kata/"; public String data[] = new String[90];

public String dataGambar [] = new String[90];

public static int SIZE=500;

public static int table[]=new int[SIZE];

Bitmap image;

(6)

int result;

publicCaptureActivity() {

// Required empty public constructor }

// TODO: Rename and change types and number of parameters

public static CaptureActivitynewInstance(String param1, String param2) { CaptureActivity fragment = new CaptureActivity();

Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args);

return fragment; }

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

if (getArguments() != null) {

mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); }

}

@Override

public View onCreateView(LayoutInflaterinflater, ViewGroup container, Bundle savedInstanceState)

//initialize Tesseract API String language = "jpn";

datapath = getActivity().getFilesDir()+ "/tesseract/"; mTess = new TessBaseAPI();

checkFile(new File(datapath + "tessdata/")); mTess.init(datapath, language);

//translate

bahasa_awal = Locale.JAPANESE; bahasa_tujuan = Locale.ENGLISH; otsu = new Otsu_method(); //otsu.

fab.setOnClickListener(new View.OnClickListener() { @Override

public void onClick(View view) { selectImage();

} });

toSpeech = new TextToSpeech(CaptureActivity.this.getActivity(), new TextToSpeech.OnInitListener() {

@Override

public void onInit(int status) { if(status==TextToSpeech.SUCCESS) {

result=toSpeech.setLanguage(Locale.JAPANESE); }

(7)

{

Toast.makeText(getActivity(),"NOtsuppord",Toast.LENGTH_SHORT).show(); }

} }); return view; }

@Override

public void onRequestPermissionsResult(intrequestCode, String[] permissions, int[] grantResults) {

switch (requestCode) {

caseUtility.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: if (grantResults.length> 0 &&grantResults[0] ==

PackageManager.PERMISSION_GRANTED) { if(userChoosenTask.equals("Take Photo")) cameraIntent();

else if(userChoosenTask.equals("Choose from Library")) galleryIntent();

} else {

//code for deny }

break; } }

private void checkFile(File dir) { if (!dir.exists()&&dir.mkdirs()){ copyFiles();

}

if(dir.exists()) {

String datafilepath = datapath+ "/tessdata/jpn.traineddata"; File datafile = new File(datafilepath);

if (!datafile.exists()) { copyFiles();

} } }

@Override

public void onDestroy(){ super.onDestroy();

if(toSpeech != null){ toSpeech.stop(); toSpeech.shutdown(); }

}

(8)

String filepath = datapath + "/tessdata/jpn.traineddata"; AssetManagerassetManager = getActivity().getAssets();

InputStreaminstream = assetManager.open("tessdata/jpn.traineddata"); OutputStreamoutstream = new FileOutputStream(filepath);

byte[] buffer = new byte[1024]; int read;

while ((read = instream.read(buffer)) != -1) { outstream.write(buffer, 0, read);

} outstream.flush(); outstream.close(); instream.close();

File file = new File(filepath); if (!file.exists()) {

throw new FileNotFoundException(); }

} catch (FileNotFoundException e) { e.printStackTrace();

} catch (IOException e) { e.printStackTrace();

} }

private void selectImage() {

finalCharSequence[] items = { "Take Photo", "Choose from Library", "Cancel" };

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("Add Photo!");

builder.setItems(items, new DialogInterface.OnClickListener() { @Override

public void onClick(DialogInterface dialog, int item) { boolean result=Utility.checkPermission(CaptureActivity.this); if (items[item].equals("Take Photo")) {

userChoosenTask ="Take Photo"; if(result)

cameraIntent();

} else if (items[item].equals("Choose from Library")) { userChoosenTask ="Choose from Gsllery";

if(result) galleryIntent();

} else if (items[item].equals("Cancel")) { dialog.dismiss();

} } }); builder.show(); }

(9)

Intent intent = new Intent(Intent.ACTION_PICK,

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, SELECT_FILE);

}

private void cameraIntent() {

Intent intent = new

Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

//intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,android.provi der.MediaStore.Images.Media.EXTERNAL_CONTENT_URI );

startActivityForResult(intent, REQUEST_CAMERA); }

@Override

public void onActivityResult(intrequestCode, intresultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode == Activity.RESULT_OK) { if (requestCode == SELECT_FILE)

onSelectFromGalleryResult(data);

else if (requestCode == REQUEST_CAMERA) onCaptureImageResult(data);

} }

private void onCaptureImageResult(Intent data){

Bitmap bmp = (Bitmap) data.getExtras().get("data"); /*

ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray();

// convert byte array to Bitmap

Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

*/

Uri tempuri = getImageUri(getContext(), bmp); String pat =getttRealPathFromURI(tempuri); photo.setImageBitmap(bmp);

}

public Uri getImageUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path =

MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);

returnUri.parse(path); }

(10)

Cursor cursor = getContext().getContentResolver().query(uri, null, null, null, null);

cursor.moveToFirst();

intidx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); returncursor.getString(idx);

}

private void onSelectFromGalleryResult(Intent data) { //String LOG_TAG;

Uri photoUri = data.getData();

// Do something with the photo based on Uri Bitmap selectedImage = null;

try {

selectedImage =

MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver( ), photoUri);

} catch (IOException e) { e.printStackTrace();

}

pat =getRealPathFromURI(photoUri, this.getContext()); // Bitmap otate = rotateBitmap(pat, selectedImage); photo.setImageBitmap(selectedImage);

}

public StringgetRealPathFromURI(Uri contentURI,Context context) { String path= contentURI.getPath();

try {

Cursor cursor =

context.getContentResolver().query(contentURI, null, null, null, null); cursor.moveToFirst();

String document_id = cursor.getString(0);

document_id = document_id.substring(document_id.lastIndexOf(":") + 1); cursor.close();

cursor = context.getContentResolver().query(

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);

cursor.moveToFirst(); path =

cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); cursor.close();

}

catch(Exception e) {

(11)

privateintgetExifOrientation(String src) throws IOException { int orientation = 1;

ExifInterfaceexif = new ExifInterface(src); String

orientationString=exif.getAttribute(ExifInterface.TAG_ORIENTATION); try {

orientation = Integer.parseInt(orientationString); }

catch(NumberFormatException e){}

return orientation; }

public BitmaprotateBitmap(String src, Bitmap bitmap) { try {

int orientation = getExifOrientation(src);

Toast.makeText(getActivity(), "ori ="+orientation, Toast.LENGTH_SHORT).show();

if (orientation == 1) {

// return bitmap;

Toast.makeText(getActivity(), "ori = 1", Toast.LENGTH_SHORT).show();

}

Matrix matrix = new Matrix(); switch (orientation) {

case 2:

matrix.setScale(-1, 1); break;

case 3:

//fotokebalik matrix.setRotate(90);

break; case 4:

matrix.setRotate(180); matrix.postScale(-1, 1); break;

case 5:

matrix.setRotate(90); matrix.postScale(-1, 1); break;

case 6:

matrix.setRotate(270);

Toast.makeText(getActivity(), "ori = 6", Toast.LENGTH_SHORT).show(); break;

case 7:

(12)

matrix.postScale(-1, 1); break;

case 8:

//kekiri matrix.setRotate(90);

break; default: return bitmap; }

bismilah = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

//bitmap.recycle();

} catch (IOException e) { e.printStackTrace();

}

returnbismilah ; }

public Bitmap BITMAP_RESIZER(Bitmap bitmap,intnewWidth,intnewHeight) { Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);

floatratioX = newWidth / (float) bitmap.getWidth(); floatratioY = newHeight / (float) bitmap.getHeight(); floatmiddleX = newWidth / 2.0f;

floatmiddleY = newHeight / 2.0f;

Matrix scaleMatrix = new Matrix();

scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

Canvas canvas = new Canvas(scaledBitmap); canvas.setMatrix(scaleMatrix);

canvas.drawBitmap(bitmap, middleX - bitmap.getWidth() / 2, middleY - bitmap.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

returnscaledBitmap; }

// TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) {

if (mListener != null) {

mListener.onFragmentInteraction(uri); }

}

@Override

(13)

mListener = null; }

public interface OnFragmentInteractionListener { // TODO: Update argument type and name voidonFragmentInteraction(Uri uri);

}

public static String execute(final String text, final Language from, final Language to) throws Exception {

validateServiceState(text);

YandexTranslatorAPIapi = new YandexTranslatorAPI(); String PARAM_API_KEY = api.PARAM_API_KEY; String ENCODING = api.ENCODING;

String PARAM_TEXT = api.PARAM_TEXT;

String PARAM_LANG_PAIR = api.PARAM_LANG_PAIR; final String params =

PARAM_API_KEY + URLEncoder.encode(apiKey,ENCODING) + PARAM_LANG_PAIR +

URLEncoder.encode(from.toString(),ENCODING) + URLEncoder.encode("-",ENCODING) + URLEncoder.encode(to.toString(),ENCODING)

+ PARAM_TEXT + URLEncoder.encode(text,ENCODING); final URL url = new URL(SERVICE_URL + params);

returnapi.retrievePropArrString(url, TRANSLATION_LABEL).trim(); }

private static void validateServiceState(final String text) throws Exception {

YandexTranslatorAPIapi = new YandexTranslatorAPI(); String ENCODING = api.ENCODING;

finalintbyteLength = text.getBytes(ENCODING).length;

if(byteLength>10240) { // TODO What is the maximum text length allowable for Yandex?

throw new RuntimeException("TEXT_TOO_LARGE"); }

//validateServiceState(); }

@Override

public void onClick(View view) { if(view==trans) {

ocr_has = ((BitmapDrawable) photo.getDrawable()).getBitmap(); Bitmap rotate = rotateBitmap(pat, ocr_has);

//Bitmap resaize = BITMAP_RESIZER(rotate,100,300); //Bitmap smoothing = smooth(rotate,50);

Bitmap gray = Otsu_method.toGray(rotate); Bitmap binary = Otsu_method.binarize(gray);

String OCRresult = null; mTess.setImage(binary);

(14)

// TextViewOCRTextView = (TextView) findViewById(R.id.OCRTextView);

chararr[]= OCRresult.toCharArray(); for(int i=0; i<arr.length; i++){ if(arr[i]=='一')

{ arr[i]=' '; } else if(arr[i]==' ') { arr[i]=' '; } else

{ arr[i]=arr[i]; } }

OCR.setText(String.valueOf(arr).replace(" ","")); Toast.makeText(getActivity(), OCR.getText().toString(), Toast.LENGTH_SHORT).show();

newgetTrans().execute();

newGetCustomerDetails().execute(new ApiConnector());

}

if(view==voice){

String kata = OCR.getText().toString(); if(result==TextToSpeech.LANG_MISSING_DATA ||

result==TextToSpeech.LANG_NOT_SUPPORTED) {

Toast.makeText(getActivity(),"NOtsuppord",Toast.LENGTH_SHORT).show(); }

else

{

toSpeech.speak(kata, TextToSpeech.QUEUE_FLUSH, null); }

} }

public void shifttable(String pattern) { inti,j,m;

char p[] = pattern.toCharArray(); m=pattern.length();

for (i=0;i<SIZE;i++) table[i]=m;

(15)

public static inthorspool(String source,String pattern) {

inti,k,pos,m;

char s[] = source.toCharArray(); char p[] = pattern.toCharArray(); m=pattern.length(); for(i=m-1;i<source.length();) {

k=0;

while((k<m) && (p[m-1-k] == s[i-k])) k++;

if(k==m)

{ pos=i-m+2; returnpos;

} else

i+=table[s[i]]; }

return -1; }

publicinthorspool_execute(String kata, String pattern){ intpos;

String text = kata; String patt = pattern; shifttable(patt);

pos = horspool(text,patt); if(pos==-1){

//Toast.makeText(getActivity(), "Tidakada", Toast.LENGTH_SHORT).show();

} else {

//Toast.makeText(getActivity(), "ada", Toast.LENGTH_SHORT).show();

}

returnpos ; }

private class getTrans extends AsyncTask<String, Void, String> { String kata = OCR.getText().toString();

String trans =""; @Override

protected String doInBackground(String... params) { try {

trans = CaptureActivity.execute(kata, Language.JAPANANESE,Language.INDONESIA); } catch (Exception e) { e.printStackTrace();

(16)

}

@Override

protected void onPostExecute(String trans){ if(trans != null) {

hasil.setText(trans);

Toast.makeText(CaptureActivity.this.getActivity(), "SuksesTRasnlate"+trans, Toast.LENGTH_SHORT).show(); }

} }

private class GetCustomerDetails extends AsyncTask<ApiConnector,Long,JSONArray> {

ProgressDialogpDialog;

@Override

protected void onPreExecute() {

// TODO Auto-generated method stub super.onPreExecute();

pDialog = new ProgressDialog(getActivity()); pDialog.setMessage("Please Wait...");

pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show();

}

@Override

protectedJSONArraydoInBackground(ApiConnector... params) {

// it is executed on Background thread

returnparams[0].GetAllCustomers(); }

@Override

protected void onPostExecute(JSONArrayjsonArray) { String kata_trans =

hasil.getText().toString().toLowerCase(); booleancek = false;

intcek_proses = 50; try

{

intpanjang = jsonArray.length();

Toast.makeText(getActivity(), "panjang"+panjang, Toast.LENGTH_SHORT).show();

for (int i = 0; i<panjang; i++) {

(17)

String getString = customer.getString("b_indo"); String getGambar = customer.getString("nameImage"); data[i] = getString;

dataGambar[i]=getGambar; }

for(int x=1; x<data.length; x++) { if(data[x].equals(kata_trans)){

inthasil = horspool_execute(kata_trans,data[x]); if (hasil == -1) {

cek=false;

} else {

Toast.makeText(getActivity(), "ada"+x, Toast.LENGTH_SHORT).show(); cek=true;

String urlForImage = baseUrlForImage + dataGambar[x];

newDownloadImageTask(tulis).execute(urlForImage); break;

} } else {

tulis.setImageResource(R.drawable.img); cek = false;

}

pDialog.dismiss(); } if(cek=false){

Toast.makeText(getActivity(), "tidakada", Toast.LENGTH_SHORT).show(); }

else {

Toast.makeText(getActivity(), "ada", Toast.LENGTH_SHORT).show(); }

(18)

DAFTARRIWAYATHIDUP

CURRICULUM VITAE

PERSONAL DATA

Full Name

: DhiwaAriePratama

Nick Name

: Dhiwa

Place/ Date of Birth

: Medan/September18

rd

1995

Sex

: Male

Religion

: Islam

Nationality

: Indonesia

Address

:Jalan M NAwiHarahap, Kec, Denai , Medan

Mobile Phone

: 082238905254

E-mail

: Dhiwaariep@gmail.com

Marital Status

: unmarried / married

EDUCATION

Bachelor of Computer Science

University of Sumatera Utara, Medan

2013-Present

Higher Secondary Education

PERGURUAN SWASTA TAMAN SISWA, Pematangsiantar

2010-2013

Secondary Education

PERGURUAN SWASTA TAMAN SISWA, Pematangsiantar

2007-2010

Primary Education

PERGURUAN MASYRAKAT RAKYAT, Pematagsiantar

2000-2006

Programming: C#, C,Java,PHP

Database

: MySQL, Sqlite, Ms. Access

IDE

: Free Pascal, Dev C++, Android Studio ,Eclipse,

Other

: -

(19)

Automatic Egg Hatchery

Factory-managed Systems

Automatic Locking System

ORGANIZATIONAL EXPERIENCES

―I

hereby declare that all information above is true and correct to the best of my

knowledge.‖

Medan, 15 Juli 2017

DhiwaAriePratama

PROJECT UNDERTAKEN

No

Organization

Position

Year

1

UKMI AL-Khuarizmi

Anggota

2013-2014

2

Sikonek

Anggota

2014-2015

SEMINARS

No.

Seminar

Year

1

Si GELITIK

2013

Referensi

Dokumen terkait