Friday, September 27, 2024

Tips mendapatkan Beasiswa S3 ke Luar Negeri (part 2)

Pada artikel sebelumnya saya telah membahas salah satu tips untuk mendapatkan beasiswa ke LN fokus pada poin "mendapatkan Unconditional Letter Offer/Letter of Acceptance". Kali ini saya akan bahas poin-poin selanjutnya yg meliputi: Mendapatkan Sertifikat bahasa Inggris, menyiapkan berkas beasiswa dan Lingkungan yang mendukung.

School of Computer Science, University of Sheffield

2. Mendapatkan Sertifikat bahasa Asing

Sertifikat bahasa Inggris (TOEFL, IELTS, dll) atau bahasa asing lainnya merupakan syarat mutlak untuk mendapatkan leter offer atau beasiswa study LN. Bagi sebagian orang, dapat melewati tahapan ini dengan cepat dan mudah. Tapi hal ini tidak berlaku untuk saya, dimana saya telah menghabiskan waktu lebih dari 5 tahun untuk memperoleh score yang sesuai.

Jika anda punya cukup waktu untuk belajar secara mandiri, banyak soal-soal latihan yang dapat di download dari internet. Tantangan belajar secara mandiri adalah konsistensi dan manajemen waktu. Belajar secara mandiri bukan masuk ke pilihan saya, dengan kesibukan mengajar dan berbagai kegiatan di kampus, hal ini tidak memungkinkan bagi saya. Saya memilih mengambil kursus secara online, dimana kita bisa belajar pada waktu-waktu di luar kegiatan rutin (malam hari). Beberapa kursus online untuk IELTS bisa di explore di IG seperti: kobi education, ieltspresso, dan schoters.

Selain itu, saya juga mengikuti kegiatan pelatihan bahasa Inggris yang diselenggarakan dan didanai oleh Dikti (khusus dosen & tenaga kependidikan), dengan nama: Program Peningkatan Kamampuan Bahasa Inggris (PKBI). Di tahun 2020, program ini diselenggarakan secara daring/online selama 2 bulan (Di tahun-tahun berikutnya diselenggarakan secara luring di beberapa kota). Jika teman-teman ingin break dari hiruk-pikuk kegiatan mengajar di kampus, bisa mengikuti program ini untuk fokus meningkatkan score IELTS/TOEFL. Di akhir program ini, kita mendapatkan kesempatan 2 kali mengikuti ujian IELTS/TOEFL.  

3. Menyiapkan berkas beasiswa

Letter Offer dan score bahasa asing adalah syarat penting untuk mendapatkan sponsor atau beasiswa study. Selain itu, surat rekomendasi juga merupakan hal penting yang harus dipersiapkan sebelum apply beasiswa. Menjaga hubungan baik dengan dosen-dosen di perguruan tinggi sebelumnya sangat penting untuk mendapatkan recommendation letter. Surat ini biasanya diberikan oleh orang yang mengenal kita dengan baik dari sisi akademik atau profesional. Dosen pembimbing skripsi atau dosen yang pernah bekerja sama dengan kita saat mengerjakan project/penelitian saat kegiatan perkuliahan adalah hal pertama yang perlu kita pikirkan saat kita ingin mendapatkan surat rekomendasi. Atasan di institusi tempat kita bekerja juga bisa dipertimbangkan untuk menuliskan surat rekomendasi kita. Pastikan atasan anda kooperatif dan paham kontribusi dan detail pekerjaan anda, hal ini akan membuat surat rekomendasi tersebut semakin kuat untuk apply beasiswa. Beberapa beasiswa mensyaratkan applicant untuk melampirkan dua surat rekomendasi, hal yang saya tuliskan diatas bisa menjadi pertimbangan anda untuk mendapatkan surat rekomendasi. Saat apply beasiswa S3, saya menggunakan surat rekomendasi dari dosen pembimbing S2 dan calon supervisor S3 dari kampus tujuan.

Berkas penting selanjutnya adalah menuliskan essay. Hal pertama adalah pahami dengan detail persyaratan dalam menuliskan essay tersebut, seperti jumlah minimal dan maksimal kata, dan beberapa poin-poin wajib dalam essay tersebut. Dalam menulis essay, tidak bisa dalam waktu yang singkat; jadi anda harus menyiapkan waktu sekitar 2-3 bulan sebelum batas akhir submit berkas beasiswa. Anda bisa menuliskan kerangka dari essay terlebih dahulu, kemudian dilanjutkan menulis detail dari setiap section. Selanjutnya anda bisa meminta bantuan orang lain (biasanya awardee dari beasiswa target anda) untuk proof read tulisan anda. Pastikan anda melakukan "itterative refine" essay dari masukan-masukan tersebut dan jika dirasa sudah sesuai anda bisa melanjutkan melengkapi berkas-berkas lain.

4. Lingkungan/Ekosistem pendukung

Menurut saya pribadi, perjuangan untuk mendapatkan kesempatan study lanjut ke luar negeri adalah perjalanan panjang dan berliku (lagi-lagi bagi saya, mungkin sebagian orang cukup mudah mendapatkan nya). Lingkungan/ekosistem pendukung dalam mencapai tujuan ini merupakan hal paling penting. Carilah teman-teman yang mempunyai visi sama dalam memperjuangan mimpi ini. Karena ini adalah perjuangan yang cukup melelahkan dan menghabiskan waktu, maka support system sangat dibutuhkan untuk tetap konsisten menjaga proses perjuangan tersebut. 

Sekitar 6 atau 7 tahun yang lalu, saat memulai perjuangan mendapatkan beasiswa study lanjut, saya tidak mendapatkan lingkungan yang mendukung. Tidak banyak rekan dari institusi saya yang mempunyai mimpi serupa. Bahkan, rekan-rekan senior lulusan dari LN pun bisa dihitung dengan jari jumlahnya. Saya mendapatkan beberapa rekan seperjuangan ketika mengikuti kursus bahasa Inggris di salah satu lembaga kursus di Jogja. Selanjutnya, saat mengikuti program PKBI dari Dikti, semakin banyak rekan yang saling support dan mempunyai tujuan sama. 

Akhirnya, rekan-rekan Bridging Course 2022  merupakan support system terbaik yang saya dapatkan dalam menggapai mimipi ini. Disini, kita secara rutin melakukan diskusi (online) untuk saling support satu sama lain dalam mendapatkan beasiswa. Bahkan, kita juga mendatangkan beberapa awardee untuk kita ajak diskusi terkait berbagai hal terkait beasiswa dan study lanjut. Dari 14 orang yang ada di group Bridging Course ini, beberapa sudah mendapatkan beasiswa dan kampus di Australia, Hungaria, Finlandia dan UK. Jika anda ingin sesegera mungkin mendapatkan beasiswa dan kampus tujuan study, ciptakan atau bergabung lah dengan ekosistem yang benar-benar mendukung mimpi anda tersebut

Simpulan

Mendapatkan score IELTS/TOEFL merupakan langkah awal untuk membuka jalan dalam melanjutkan study ke LN. Masa berlaku sertifikat tersebut 2 tahun, jadi setelah mendapatklan score yang sesuai anda berkesempatan memaksimal waktu tersebut untuk mendapatkan Letter Offer dan Beasiswa. Terima kasih sudah menyimak serangkaian sharing dari pengalaman yang saya lalui untuk mendapatkan beasiswa study LN. Jika ingin melakukan korespondensi silahkan bisa menuliskan di kolom komentar atau melalui email ke arif.laksito@gmail.com. Semoga bermanfaat! 

"Mimpi-mimpi anda layak untuk diperjuangkan. Lakukan ikhtiar dengan maksimal, Insha Allah anda akan mendapatkan kampus dan beasiswa terbaik!"

Monday, December 25, 2023

Tips mendapatkan Beasiswa S3 ke Luar Negeri (part 1)

Ternyata sudah setahun saya tidak menyapa warga blogger karena tidak ada update artikel di sini 🙏. Alhamdulillah di tanggal 25 September 2023 ini saya mulai study S3 di Department of Computer Science University of Sheffield. Saya mendapatkan beasiswa BPI LN 2023 dengan pendanaan dari LPDP. Di artikel ini saya akan share beberapa tips (berdasarkan pengalam saya) mendapatkan beasiswa study ke LN.

BPI menyediakan beberapa program beasiswa untuk jenjang S1, S2 dan S3, lebih detailnya bisa langsung cek di halaman web ini dan buku panduan BPI di tahun bersangkutan (bisa jadi ada update program di tahun yg berbeda). Syarat utama untuk jenjang S3 di beberapa beasiswa adalah anda sudah mendapatkan Unconditional Letter of Acceptance (Uncon. LoA) dari kampus yang bersangkutan. Mendapatkan Uncon LoA ini setiap orang punya pengalaman yang berbeda-beda, ada yang mudah dan cepat mendapatkannya, ada juga yang harus bersusah payah mendapatkan dan butuh waktu yang tidak sebentar. 

Di artikel ini saya lebih fokus untuk membahas beasiswa S3 yang terbagi menjadi beberapa bagian yaitu (1) Mendapatkan Uncon LoA, (2) Sertifikat bahasa Inggris, (3) Menyiapkan berkas beasiswa, (4) Lingkungan yang mendukung.

1. Mendapatkan Unconditional LoA

Pengalaman saya untuk mendapatkan Uncon LoA ini tidak mudah dan cukup berliku jalannya. Dimulai tahun 2019 dimana saya melakukan koresponding dengan Prof dari TMU (Tokyo Metropolitan University) selama kurang lebih 5 bulan berdiskusi terkait proposal penelitian. Setelah itu, beliau setuju dengan proposal saya dan menyarankan mengirim aplikasi ke kampus (offline melalui pos). Selanjutnya, saya dijadwalkan untuk interview menggunakan zoom dengan beberapa Prof dari department. Beberapa minggu kemudian saya mendapatkan jawaban bahwa saya diterima di kampus TMU dan mendapatkan Uncon LoA. Sayangnya di tahun tersebut saya tidak mendapatkan beasiswa dari MEXT (usia sudah lewat) dan BUDI LN (kampus TMU tidak ada di list).

Di tahun berikutnya, saya mulai melakukan mini riset untuk mencari calon supervisor (spv) di kampus Australia dan Jepang. Kenapa 2 negara tersebut? Karena saya rencana apply beasiswa AAS dan BUDI LN (dengan list kampus yg available, karena masih pengen banget lanjut study di Jepang). Saya membuat matrix nama spv, kampus, bidang di Spreadsheet dan mendapatkan 6 nama dari Australia dan 5 nama dari Jepang. Setelah melakukan broadcast koresponding email (pastikan editorialnya berbeda setiap kirim email), saya mendapatkan response dari beberapa calon spv. Satu reply dari Prof di Macquarie Univ yang tertarik dan menjadwalkan interview, dan dua response dari Prof di Jepang yang mengatakan tidak ada space untuk PhD tahun ini dan sisanya tidak berbalas. Setelah sekitar 5 minggu saya followup dan menanyakan jadwal interview ke prof di Macquarie, ternyata tidak berbalas lagi. Saya kembali menyesal karena terlalu lama me-reply email beliau dan akhirnya hilang kesempatan mendapatkan LoA. 

Di 2022, saya mencoba apply salah satu project PhD dengan funding dari SFI Ireland. Tahap pertama adalah mengisi beberapa form dan dokumen yang diperlukan, selanjutnya saya dinyatakan lolos tahap awal dan dilanjutkan dengan seleksi tahap kedua. Di tahap ini, kita diminta membaca paper "AI and the Everything in the Whole Wide World Benchmark" dan menjawab beberapa pertanyaan seperti:  provide a brief description of the key contributions and address the significance of the findings, briefly describe some of the key strengths and weaknesses you find with this paper, the approach taken by the authors, and the clarity and ease of understanding of the writing (max 450 words). Beberapa minggu kemudian saya mendapatkan email bahwa saya belum dinyatakan lolos dan masuk ke reserved list (akan mendapatkan info jika ada kandidat yang mengundurkan diri). Sampai pada batas waktu yang ditentukan, saya tidak mendapatkan panggilan di tahap selanjutnya dan saya memutuskan melupakan track beasiswa ini. 

Di tahun yang sama saya apply beasiswa Stipendium Hungaricum (SH Hungaria), dan beasiswa Bridging Course (BC) dari Kemdikbud Dikti. Di beasiswa SH saya lolos di tahap administrasi dan mendapatkan interview di 2 kampus yaitu: ELTE dan Szeged Univ. Tetapi di tahap akhir interview ini, saya tidak lolos dari ke dua kampus tersebut. Hal ini (menurut saya) karena saya tidak melakukan korespondensi dengan calon spv sebelumnya sehingga track riset yang saya usulkan tidak ada yang sesuai dengan beberapa calon spv di kampus-kampus tersebut.

The sculpture of the eagle in front of The Diamond

Beasiswa BC (beasiswa non-degree) ini merupakan langkah awal saya mendapatkan Uncon LoA di University of Sheffield, dimana proses mendapatkan beasiswa BC tersebut saya tulis lengkap di artikel ini. Selama mengikuti kegiatan BC, saya melakukan pencarian beberapa calon spv di NLP Group. Setelah mendapatkan 3 nama, saya mulai kontak salah satu calon spv untuk diskusi terkait tema penelitian. Dua hari kemudian beliau membalas email dan mengundang saya untuk bertemu secara langsung. Alhamdulillah saya berkesempatan tinggal di Sheffield selama 2 bulan sehingga memungkinkan bertemu secara langsung (offline). Di email balasan, beliau memberi tahu untuk bertemu di dekat patung Elang di depan The Diamond building. Pada hari-H (18 Nov 2022), saya bertemu beliau dan diajak ke salah satu Coffee shop untuk diskusi lebih lanjut. Diskusi ini tidak terlalu formal, dan berkisar tentang pertanyaan latar belakang, kenapa mau lanjut PhD, kenapa memilih dia, dan pengalaman riset. Setelah itu, beliau menyarankan saya untuk segera submit aplikasi di University untuk mendapatkan LoA, beliau juga memberi masukan untuk submit proposal dengan tema yang dia pilihkan. Setelah melengkapi dokumen dan submit ke Universitas, selanjutnya saya dijadwalkan untuk formal interview dengan calon spv dan salah satu Prof di Department. Saya mendapat jadwal interview hari Jumat (16 Des 2024) beberapa hari sebelum kembali ke Indonesia. Interview tersebut kurang lebih sama seperti ketika saya bertemu calon spv pertama kali lebih banyak diskusi tentang background dan motivasi studi S3. 

Tanggal 27 Jan 2023, setelah kembali ke Indonesia, saya mendapatkan Uncon. LoA dari Universitas. Kemudian saya memberi kabar ke spv dan memberi info bahwa saya akan apply beasiswa dari Pemerintah Indonesia.

Dari pengalaman yang sudah saya lakukan sekitar 4 tahun, untuk mendapatkan Uncon. LoA hal-hal berikut ini yang perlu diperhatikan:

  1. Pastikan anda sudah menentukan spesifik bidang/tema penelitian untuk study S3. 
  2. Explore background dari calon spv, pastikan bidang beliau fit/sama dengan tema yang akan kita ambil untuk study S3.
  3. Lakukan korespondensi melalui email (Jika anda ingin mendapatkan contoh korespondensi email, bisa tuliskan alamat email anda di comment).
  4. Jangan baper jika ditolak atau tidak mendapat respon. Cari calon spv dari kampus lain (Bisa dilakukan secara paralel)
  5. Siapkan dokumen-dokumen yang diperlukan untuk submit aplikasi (Pelajari syarat yang dibutuhkan di website department atau Universitas). 
  6. Banyak-banyak berdoa, minta doa restu dari keluarga dan orang tua.
Untuk poin-poin lainnya insya Allah saya akan tulis di artikel berikutnya, ternyata membahas terkait Uncon. LoA ini sudah cukup banyak. Terima kasih, semoga bermanfaat.

Sunday, November 13, 2022

Bridging Course 2022: University of Sheffield


Setelah sekian lama tidak ada artikel di blog ini, kali ini saya akan share salah satu pengalaman mendapatkan kesempatan Bridging Course 2022 (BC2022) ke University of Sheffield, United Kingdom. Bridging Course adalah salah satu beasiswa dari DIKTI yang dikhususkan untuk dosen di Indonesia yang telah diselenggarakan setiap tahunnya mulai dari tahun 2016. Kegiatan ini adalah sebagai persiapan bagi para dosen untuk melanjutkan study S3 ke Luar Negeri, dimana fokus nya adalah match-making antara calon supervisor dan calon siswa yang akan studi.

Pada tahun ini peserta BC2022 ke University of Sheffield berjumlah 14 dosen dari berbagai perguruan tinggi negeri dan swasta Indonesia. Selain ke ke Sheffield, ada beberapa kampus dan negara lain di tahun ini, yaitu ke University of Sopron, Hungary; National Taiwan University (NTU); dan University of New England, Australia. 

Perjalanan ini dimulai pada bulan April yaitu dengan dibukanya pengumuman pendaftaran dengan submit berkas maksimal 13 Mei 2022. Beberapa berkas yang harus di submit pada aplikasi yaitu: CV, Proposal penelitian S3, Sertifikat IELTS dan Surat ijin dari perguruan tinggi/LLDIKTI. Qodarullah, mendekati hari-H dateline submit berkas, anak ke-3 saya, Aydin (3 tahun) harus menjalani operasi usus buntu. Berkas ijin dari LLDIKTI dan surat pengantar dari dekan belum selesai saya urus, hal ini sangat menguras pikiran dan waktu. Alhamdulillah rekan saya, bu Rhisa membantu mengurus semua berkas, sampai mengantar surat ijin ke LLDIKTI. Semoga Allah SWT membalas semua kebaikannya bu 😊

Selanjutnya, sekitar minggu pertama bulan Juni 2022, DIKTI mengumumkan kandidat BC2022 yang lolos tahap pertama. Tahap berikutnya adalah tes interview untuk bisa lolos dan menjadi awardee BC2022 ini. Disini terdapat 110 kandidat dosen yang terjadwal pada sesi interview online. Pada sesi interview tersebut, saya memilih dari rumah, karena di kampus kurang kondusif environment-nya. Terdapat 2 interviewer dan 1 admin dalam sesi tersebut. Berbagai pertanyaan diajukan dalam bahasa Inggris oleh ke-2 interviewer terkait proposal penelitian yang sudah kita submit, seperti: background penelitian, keterbaharuan, metode dan juga pengalaman penelitian yang telah kita lakukan.  Alhamdulillah 40 menit berakhir juga sesi yang menegangkan tersebut. Saya merasa kurang maksimal dalam menjawab pertanyaa-pertanyaan dari interviewer, tentunya ikhtiar yang terbaik sudah saya lakukan, apapun hasilnya serahkan hanya ke Allah SWT.

Tanggal 4 Juli 2022, rekan dosen di Fisipol UGM, awardee Bridging Course tahun 2021, mengirim WA menginformasikan saya lolos sabagai awardee BC2022. Setelah membalas dengan ucapan terima kasih, saya segera mencari informasi resmi tersebut di website DIKTI. Alhamdulillah surat resmi tersebut menunjukan nama saya masuk kedalam 50 awardee BC2022. Pastinya ini semua karena Allah SWT memudahkan semua urusan saya.

Setelah 1 bulan tidak ada info terkait BC2022, akhirnya pada bulan Agustus diinfomasikan bahwa saya mendapatkan kampus tujuan di University of Sheffield, UK. Bersama dengan 14 dosen lain, kami mulai mengurus persiapan keberangkatan, yaitu VISA, Surat tugas negara (Satneg), Tiket dan akomodasi. Terjadwal kegiatan di Sheffield dimulai tanggal 10 Oktober 2022, tapi sampai dengan tanggal tersebut tidak semua Sheffiled's awardee terbit VISAnya. 

Aydin, see you on Dec. I will miss you..

Akhirnya, keberangkatan defer menjadi tanggal 26 Oktober 2022. Kegiatan ini dilaksanakan selama 7 Minggu, yaitu berakhir pada tanggal 17 Desember 2022. Perjalanan kali ini kita akan menggunakan maskapai Emirates yang akan berangkat dari Soekarno Hatta tanggal 27 Okt jam 00:40, transit di Dubai International Airport dan diperkirakan sampai Bandara Manchester, UK tanggal 27 Okt jam 12:40. Perjalanan Manchester ke Sheffield berkisar 1 jam menggunakan coach (mini bus) yang sudah disiapkan tim dari University of Sheffield. 

Rombongan 14 dosen tiba di Manchester Airport

Finally, sekitar jam 15:00 kita telah sampai di St Vincent's Place yang merupakan flat tempat kita stay selama di Sheffield. InshaAllah akan saya update cerita kehidupan di Sheffield dan beberapa info kegiatan Bridging Course ini. Semoga bermanfaat dan menambah motivasi teman-teman yang ingin melanjutkan mimpinya study abroad. Wassalam..

St Vincent's Place

Wednesday, July 27, 2022

Panen data di twitter menggunakan python

Tidak sedikit penelitian di bidang text mining dan NLP (Natural Language Processing) memanfaatkan data dari platform populer twitter. Pada artikel kali, saya akan share bagaimana membuat dataset dari twitter menggunakan library tweepy di python.

Twitter adalah social media, dimana pengguna memungkinkan share pesan singkat sebanyak maksimal 140 karakter yang biasa disebut dengan tweet. Karena tweet dikirim terus menerus, Twitter merupakan cara yang tepat untuk mengetahui peristiwa/tren terkini. Biasanya pengguna menggunakan hashtag (#) dengan keyword tertentu dalam mengkategorikan topik apa yang mereka share.

Disini saya dibahas bagaimana mendapatkan data dari twitter yang akan disimpan ke dalam file csv dan database MySQL. Sebelumnya anda perlu membaca dokumentasi library tweepy disini: https://docs.tweepy.org/en/stable/. Selanjutnya kita perlu mendaftar sebagai developer di Twitter API untuk mendapatkan Api key dan Secret key. 

Mendapatkan API key Twitter

  1. Buka halaman https://developer.twitter.com/en,
  2. Login atau registrasi jika belum mempunyai akun developer,
  3. Buka menu Application Console dan create new Twitter application,
  4. Isi semua form dan check Developer agreement.
  5. Selanjutnya anda akan mendapat credential berupa Api key, Api Secret, Access token dan Access token secret

Setup Tweepy

Jika environment di python anda belum terinstall tweepy, bisa anda lakukan instalasi library tersebut dengan perintah: pip install tweepy

Untuk melakukan koneksi dan autentifikasi ke twitter, gunakan code berikut ini dimana variabel consumer_key, consumer_secret, access_token dan access_token_secret yang sudah anda isikan dengan data dari application yang sudah anda create diatas:


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)


Berikutnya kita perlu siapkan listerner untuk menangkap tweet yang di posting saat ini oleh pengguna berdasarkan keyword yang kita definisikan, sebagai contoh kita gunakan "jogja" dan "jogja istimewa". Pertama buat class StreamListener() selanjutnya jalankan class tersebut untuk mulai menarik data. Berikut code di python:

class StreamListener(tweepy.StreamListener):
def on_connect(self):
print("You are now connected to stream API")

def on_error(self, status_code):
print("An error has occured: " + repr(status_code))
return false

def on_status(self, status):
print(status.text)

stream_listener = StreamListener()
stream = tweepy.Stream(auth=auth, listener=stream_listener)
stream.filter(languages=['in'], track=["jogja", "jogja istimewa"])


Simpan file tersbut ke dengan nama "stream.py". Berikutnya bisa kita jalankan dari terminal atau command dengan perintah: python stream.py Bisa dilihat output di terminal tweet yang ditangkap oleh program tersebut. Untuk mengakhiri proses streamming tweet bisa menggunakan Ctrl + C atau close terminal / command aktif anda.

Menyimpan ke format CSV

Untuk menyimpan output tweet ke dalam csv, kita gunakan library csv dari python. Kemudian pada method on_status( ) di class StreamListener( ) perlu kita update dengan menambahkan kode untuk menulis ke file csv berikut ini:

with open('tweet_output.csv', 'a') as f:
    writer = csv.writer(f)
    writer.writerow([date, loc, name, desc, text, status.entities.get('hashtags')])
    time.sleep(10)


Pada kode diatas akan menulis output di file "tweet_output.csv" dengan kolom date, loc, name, desc, text, dan hashtags dari tweet yang dipisahkan dengan separator koma (,).

Berikut ini kode lengkap nya

import time
import tweepy
import csv

consumer_key = "<consumer key anda>"
consumer_secret = "<consumer secret anda>"
access_token = "<access token anda>"
access_token_secret = "<access token secret anda>"

class StreamListener(tweepy.StreamListener):
def on_connect(self):
print("You are now connected to stream API")

def on_error(self, status_code):
print("An error has occured: " + repr(status_code))
return false

def on_status(self, status):
text = status.text

# Menghilangkan karakter yg mungkin membuat error separator csv
remove_characters = [",", "\n"]
for c in remove_characters:
text.replace(c, " ")

try:
name = status.user.screen_name
desc = status.user.description
loc = status.user.location
date = status.created_at

with open('tweet_output.csv', 'a') as f:
writer = csv.writer(f)
writer.writerow([date, loc, name, desc, text, status.entities.get('hashtags')])
time.sleep(10)


except Exception as e:
print(e)

with open('tweet_output.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['Date', 'Location','Name', 'Desc', 'Text', 'Hashtag'])


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

listener = StreamListener(api=tweepy.API(wait_on_rate_limit=True))
streamer = tweepy.Stream(auth=auth, listener=listener)

print("Tracking data twitter on progress..")
streamer.filter(languages=['in'], track=['jogja','#jogja'])


Pada kode diatas di bagian stream.filter( ) ditambahkan parameter languages=['in'] untuk mengambil tweet yang menggunakan bahasa indonesia saja. Sedangkan untuk parameter track, bisa digunakan lebih dari 2 keyword.

Menyimpan ke database MySQL

Sedangkan untuk menyimpan data output tweet ke database MySQL, digunakan library pymysql. Selanjutnya kita membutuhkan satu method untuk melakukan koneksi dan penyimpanan ke tabel MySQL. Berikut ini kode dari method store_data( ) yang digunakan untuk menyimpan ke tabel di database:

def store_data(id, name, date, txt):
connection = pymysql.connect(host=host, user=user, password=password,
db=db, charset=charset, cursorclass=cursorclass)

try:
with connection.cursor() as cursor:
sql_save = "insert into tweet (tweet_id, screen_name, created_at, text) "
            sql_save += "values(%s, %s, %s, %s)"
cursor.execute(sql_save, (id, name, date, txt))
connection.commit()

cursor.close()
return
finally:
connection.close()


Dari kode diatas terlihat variabel connection digunakan untuk membuat koneksi ke database, variabel sql_save untuk menyimpan perintah query insert dan cursor.execute() untuk menjalankan perintah query tersebut. Untuk menerapkan di Streamer, pada method on_status() kita tambahkan pemanggilan method store_data() ini.

Sebelum menjalankan kode python tersebut di terminal, kita perlu membuat tabel di database MySQL terlebih dahulu. Berikut ini DDL untuk membuat kode di database dengan nama tabel "tweets".

CREATE TABLE `tweets` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `tweet_id` varchar(250) DEFAULT NULL,

  `screen_name` varchar(128) DEFAULT NULL,

  `created_at` timestamp NULL DEFAULT NULL,

  `text` text DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8


Berikut ini kode lengkap pada file "stream-db.py" yang bisa anda jalankan.

import pymysql.cursors
import tweepy

host = 'localhost'
user = 'root'
password = ''
db = 'tweet'
charset = 'utf8'
cursorclass = pymysql.cursors.DictCursor

consumer_key = "<consumer key anda>"
consumer_secret = "<consumer secret anda>"
access_token = "<access token anda>"
access_token_secret = "<access token secret anda>"

def store_data(id, name, date, txt):
connection = pymysql.connect(host=host, user=user, password=password,
db=db, charset=charset, cursorclass=cursorclass)

try:
with connection.cursor() as cursor:
sql_save = "insert into tweets (tweet_id, screen_name, created_at, text) "
            sql_save += "values(%s, %s, %s, %s)"
cursor.execute(sql_save, (id, name, date, txt))
connection.commit()

cursor.close()
return
finally:
connection.close()

class StreamListener(tweepy.StreamListener):
def on_connect(self):
print("You are now connected to stream API")

def on_error(self, status_code):
print("An error has occured: " + repr(status_code))
return false

def on_status(self, status):
text = status.text
remove_characters = [",", "\n"]
for c in remove_characters:
text.replace(c, " ")

try:
name = status.user.screen_name
tid = status.id
date = status.created_at

store_data(tid, name, date, text)

except Exception as e:
print(e)

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

listener = StreamListener(api=tweepy.API(wait_on_rate_limit=True))
streamer = tweepy.Stream(auth=auth, listener=listener)

print("Tracking data twitter on progress..")
streamer.filter(languages=['in'], track=['jogja', '#jogja'])


Selanjutnya bisa anda jalankan kode diatas dengan perintah python stream-db.py

Saat proses streamming berjalan, kemungkinan terdapat bebeapa warning message di terminal / command dikarenakan terdapat beberapa karekter yang tidak sesuai.  Hal ini bisa kita atasi dengan menambahkan beberapa filter di kode sebelum menyimpan di database.

Untuk mendapatkan data dalam jumlah besar, kita harus menjalankan stream tersebut secara terus-menerus. Pada artikel berikutnya inshaAllah akan saya bahas bagaimana membuat service stream tweepy di server Amazon AWS.


Tuesday, July 12, 2022

Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 2)

Artikel berikut ini merupakan kelanjutan dari posting sebelumnya tentang implementasi sistem rekomendasi berbasis konten (Content-based filtering Recommender System) pada PHP. Silahkan bisa menyimak terlebih dahulu artikel bagian pertama disini: Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 1).

Pada project ini, saya menggunakan library Sastrawi untuk melakukan pre-processing data, dan menggunakan library Nette/Database untuk akses ke database mysql, bisa anda cek dokumentasi lengkap di sini: https://doc.nette.org/en/database/core. Dengan menggunakan composer, kita bisa tambahkan code berikut di file composer.json:

{
"require": {
"sastrawi/sastrawi": "^1.2",
"nette/database": "^3.1"
}
}


Kemudian bisa dijalankan perintah composer update pada terminal untuk mendownload beberapa library diatas ke project kita.

Pertama kita siapkan class di PHP untuk menghitung TF-IDF dan Cosine similarity seperti yang sudah dibahas di artikel bagian 1. Kali ini, saya menggunakan nama class Cbrs dan nama file disesuaikan menjadi Cbrs.php. Berikut ini kode lengkap dari class tersebut.

Selanjutnya, kita siapkan file index.php untuk menampilkan daftar list hotel secara random dari tabel di database. Untuk tampilan HTML digunakan Bootstrap CSS supaya lebih rapi. Dan pada bagian akhir, kita buat file detail.php dimana akan menampilkan 1 hotel yang dipilih, dan kemudian akan di cari similarity/kesamaan dari sejumlah hotel dengan score paling besar berdasarkan id hotel yang dipilih tersebut.

Pada kode diatas, terdapat function pre_process() dan get_hotel_detail(), dimana kegunaan fungsi pertama untuk melakukan pembersihan data sebelum masuk ke class perhitungan TF-IDF dan cosine similarity di class Cbrs dan fungsi kedua untuk menampilkan detail hotel berdasarkan parameter id. Variabel $n digunakan untuk menyimpan jumlah item rekomendasi yang akan ditampilkan (top-n). Dan pada bagian perulangan variabel $r ditambahkan keyword continue; untuk menghilangkan item kunci, dimana nilainya = 1 dikarenakan menghitung similarity dari item yang sama. Selain itu, digunakan juga keyword break; untuk keluar dari perulangan jika jumlah n rekomendasi sesuai dengan variabel $n.

Tampilan antar muka detail hotel dan rekomendasi 8 item (beserta score similarity)

Jika anda membutuhkan kode lengkap dari project diatas beserta file database sql, silahkan tuliskan alamat email di bagian komentar. InshaAllah akan segera saya kirimkan ke email anda.


Friday, July 8, 2022

Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 1)

Sebelum menyimak dan mengikuti tutorial dalam membangun sistem rekomendasi berbasis konten (content-based filtering) di artikel ini, sebaiknya membaca terlebih dahulu 2 artikel yang saya tulis sebelumnya, karena hal tersebut berkaitan dan saya menggunakan case/domain yang sama seperti sebelumnya.

Berikut artikel yang berkaitan dengan posting ini:

  1. Preprocessing text Bahasa Indonesia di PHP dengan Sastrawi
  2. Menghitung TF-IDF menggunakan kode PHP
Domain item yang akan saya bahas disini adalah data hotel, seperti pada artikel-artikel sebelumnya. Tahapan dalam membangun aplikasi sistem rekomendasi ini diawali dengan melakukan preprocesisng menggunakan library Sastrawi yang ada di PHP, dilanjutkan dengan melakukan pembobotan kata menggunakan metode TF-IDF dan terakhir adalah mengukur jarak kedekatan(similarty) dari 1 item ke item lainnya.

Pada artikel ini akan saya bahas bagian terakhir, yaitu menghitung similarity antar item menggunakan metode cosine similarity dan membuat top-n rekomendasi berdasarkan item yang dipilih. Kedua tahapan sebelumnya sudah ada di artikel yang saya sertakan link diatas 👆.

Cosine similarity

Untuk memudahkan pemahaman cara kerja cosine similarity, saya akan gunakan Spreadsheet untuk perhitungan nya dengan menggunakan contoh data hotel seperti pada case di artikel sebelumnya. Pada contoh data ini terdapat 3 dokumen dan 10 terms/kata yang akan kita ujicoba untuk perhitungan dan sudah kita beri bobot untuk masing-masing terms. Selanjutnya untuk menghitung similarity 2 item kita gunakan rumus berikut:

Pertama kita akan hitung terlebih dahulu sumproduct dari item A dan B, selanutnya kita bagian dengan perkalian panjang vektor A dan B. Pada Spreadsheet kita bisa gunakan formula SUMPRODUCT() sendangkan panjang vektor kita gunakan rumus SQRT(SUMSQ()).

Hasil dari pembobotan kata pada setiap dokumen

Berikut ini contoh rumus dari file Spreadsheet diatas untuk mencari similarity dari item d1 dan d2:

=SUMPRODUCT(C17:L17,C18:L18)/(SQRT(SUMSQ(C17:L17))*SQRT(SUMSQ(C18:L18)))

Selanjutnya kita bisa buat matrix untuk menghitung setiap dokumen. Score cosine similarity mempunyai rentang dari 0 - 1, yang artinya nilai mendekati 1 bearti kedua item tersebut sangat mirip, sedangkan mendekati 0 artinya kedua item tidak mirip. Perhitungan kedua item yang sama akan menghasilkan nilai 1.

Matrix perhitungan similaity antar item

Silahkan tuliskan alamat email anda di bagian komentar jika ingin mendapatkan file Spreadsheet untuk perhitungan seperti pada gambar diatas.

Cosine similarity di PHP

Berdasarkan perhitungan dari Spreadsheet dan rumus diatas, di PHP kita dapat membuat fungsi baru untuk mencari similarity antara 2 item dan mengurutkan hasil kemiripan score dari yang paling besar.

# Fungsi menghitung similarity ke semua dokumen
# parameter input = id dari item
public function similarity($d1){
    $score = [];
    foreach($this->doc_weight as $ndw => $w){
        $score[$ndw] = $this->cosim($d1, $ndw);
    }
    
    arsort($score);
    return $score;
}

private function cosim($d1, $d2){
    $dw = $this->doc_weight;
    
    # sum square dari 2 doc
    $dw1 = $dw[$d1];
    $dw2 = $dw[$d2];
    
    $dx = 0;
    $dx1 = 0;
    $dx2 = 0;
    
    foreach($this->corpus_terms as $t => $terms){
        $dx += $dw1[$t] * $dw2[$t];
        $dx1 += $dw1[$t]*$dw1[$t];
        $dx2 += $dw2[$t]*$dw2[$t]; 
    }
    
    return round($dx / (sqrt($dx1) * sqrt($dx2)), 4);
    
}

Kedua fungsi diatas merupakan kelanjutan kode dari Tfidf.php pada artikel berikut ini: Menghitung TFIDF menggunakan kode PHP, yang perlu anda tambahkan di class Tfidf. Selanjutnya pada file index.php anda bisa menjalankan fungsi tersebut dengan menggunakan parameter index array sebagai dokumen kunci yang akan dicari kemiripannya.

$hotel = array();
$hotel[1] = "Hotel Modern yang Terjangkau";
$hotel[2] = "Akomodasi modern, nyaman, dan tenang";
$hotel[3] = "Hotel bintang 3 yang mewah namun dengan harga yang terjangkau";

foreach($hotel as $key=>$item){
    $hotel[$key] = pre_process($item);
}

$cbrs = new Tfidf();
$cbrs->create_index($hotel);
$cbrs->idf();
$w = $cbrs->weight();  
$r = $cbrs->similarity(1);

print '<pre>';
print_r($r);
print '</pre>';

Dari kode diatas akan menghasilkan score kemiripan dari dokumen kunci(index array) sesuai dengan parameter yang di inputkan pada fungsi similarity.

Array
(
    [1] => 1
    [3] => 0.2062
    [2] => 0.1203
)

Pada posting berikutnya akan saya bahas detail bagaimana menggunakan dataset yang sudah tersimpan di tabel pada database MySQL untuk menampilkan item rekomendasi dari dokumen yang kita pilih.



Friday, July 1, 2022

Menghitung TF-IDF menggunakan kode PHP


Term Frequency, Inverse Document Frequency (TFIDF), merupakan sub-area dari Natural Language Processing(NLP) yang digunakan dalam information retrievel dengan tujuan untuk ekstrasi data. Sederhananya, bagaimana menghitung kemunculan setiap kata dalam dokumen dan memberi bobot pada setiap kata, dan menghitung skor untuk dokumen tersebut.

Sebelum kita bahas code di PHP, saya akan share penjelasan perhitungan manual TF-IDF menggunakan Spreadsheet atau Excel untuk memudahkan memahami cara kerjanya. Harapannya, anda bisa melakukan improvisasi code di bahasa pemrograman yang lainnya.

Pastikan sebelum mulai proses pembobotan kata dengan metode ini, text yang anda gunakan sudah melalui tahap preprocessing. Untuk preprocessing text di bahasa indonesia anda bisa menggunakan library sastrawi yang sudah saya bahas di artikel berikut ini: https://blog.ariflaksito.net/2022/04/preprocessing-text-bahasa-indonesia-di.html.

Berikut ini perhitungan di Spreadsheet menggunakan 3 dokumen seperti yang saya gunakan pada artikel preprocessing pada link artikel diatas.


Kolom token/term merupakan kata unique dari semua dokumen yang ada. Selanjutnya pada kolom tf, dibagi menjadi 3 dokumen untuk menghitung jumlah setiap kata yang ada di masing-masing dokumen. Pada kolom df akan menghitung jumlah kata yang muncul pada semua dokumen. Pada bagian ini kita hitung jumlah kemunculan, bukan jumlah total kata (digunakan rumus countif bukan sum). Kolom D/df merupakan pembagian dari jumlah dokumen (n) dan df. Jumlah dokumen yang kita gunakan untuk contoh perhitungan ini adalah 3.

Kolom IDF merupakan nilai log dari D/df, dan terkahir score tf-idf merupakan perkalian dari tf masing-masing dokumen dan token dengan nilai IDF. Hasilnya akan berupa matrix bobot dari dokumen dan term seperti pada gambar diatas.

Bisa anda tuliskan email di komentar jika menghendaki file Spreadsheet/Excel untuk contoh perhitungan  TF-IDF diatas.

Selanjutnya kita masuk pada inti pembahasan, yaitu membuat script PHP untuk perhitungan bobot kata seperti cara di Excel diatas. Pertama siapkan class dan beberapa fungsi di PHP, yaitu:

  • fungsi untuk mebuat index dari setiap kata
  • fungsi untuk menghitung idf
  • fungsi untuk menghitung weight/tf-idf

Terdapat 2 file pada code diatas, index.php dan Tfidf.php. Dimana fungsi-fungsi TF-IDF berada pada class Tfidf() di file Tfidf.php. Sedangkan file index.php digunakan sebagai input dokumen untuk menjalankan perhitungan tersebut.

Pada fungsi create_index() di class Tidf menjalankan proses untuk melakukan split setiap kata dan memberi informasi posisi dari setiap dokumen. Hasilnya bisa di lihat menggunakan fungsi show_index(). Fungsi idf() digunakan untuk menghitung menggunakan rumus log(D/df). Dan fungsi weight() untuk menghitung score/nilai dari tf-idf dari setiap kata/term di dokumen. Hasilnya berupa matrix/array dengan bobot pada setiap term di dokumen.

Berikut ini hasil dari kode tersebut, sama seperti pada perhitungan di excel diatas pastinya..

Array
(
    [1] => Array
        (
            [hotel] => 0.1761
            [modern] => 0.1761
            [jangkau] => 0.1761
            [akomodasi] => 0
            [nyaman] => 0
            [tenang] => 0
            [bintang] => 0
            [3] => 0
            [mewah] => 0
            [harga] => 0
        )

    [2] => Array
        (
            [hotel] => 0
            [modern] => 0.1761
            [jangkau] => 0
            [akomodasi] => 0.4771
            [nyaman] => 0.4771
            [tenang] => 0.4771
            [bintang] => 0
            [3] => 0
            [mewah] => 0
            [harga] => 0
        )

    [3] => Array
        (
            [hotel] => 0.1761
            [modern] => 0
            [jangkau] => 0.1761
            [akomodasi] => 0
            [nyaman] => 0
            [tenang] => 0
            [bintang] => 0.4771
            [3] => 0.4771
            [mewah] => 0.4771
            [harga] => 0.4771
        )

)

Referensi

  1. https://khozaimi.wordpress.com/2010/06/26/menghitung-tf-idf-engan-php/
  2. https://www.youtube.com/watch?v=B3UZ8DxHocQ&t=1s

Preprocessing text bahasa Indonesia di PHP dengan Sastrawi

 

the image was taken from https://www.analyticsvidhya.com

Bismillah.. setelah sekian lama belum ada artikel lagi, semoga bisa kembali produktif menulis di blog ini lagi dan terus konsisten  ✌.

Pada beberapa artikel sebelumnya terkait content-based filtering di Sistem rekomendasi, saya menggunakan salah satu library untuk preprocessing text yaitu Sastrawi di Python. Ternyata beberapa mahasiswa menanyakan penggunaan library tersebut di pemrograman PHP. Inilah salah satu alasan adanya artikel ini.

Source code dari Sastrawi bisa anda temukan disini: https://github.com/sastrawi/sastrawi. Library ini sudah ada pada beberapa bahasa pemrograman, seperti: Java, C, Python, Go, Rudy dan tentunya di PHP. Untuk menggunakan di PHP anda bisa melakukan instalasi menggunakan Composer. Apa itu composer? Silahkan beca artikel berikut ini: https://blog.ariflaksito.net/2018/08/berkenalan-dengan-composer.html

Pada terminal atau command line anda bisa menjalankan perintah berikut ini:
php composer.phar require sastrawi/sastrawi:^1

Library ini dapat digunakan untuk melakukan stemming di bahasa Indonesia, yaitu proses untuk menemukan kata dasar dari sebuat kata, dengan menghilangkan semua imbuhan termasuk dari awalan, sisipan, akhiran dan kombinasi dari awalan dan akhiran pada kata turunan.

Contohnya:

  • Menghilang = hilang
  • Terjangkau = jangkau
Selain itu, Sastrawi dapat juga digunakan untuk menghilangkan kata-kata yang memiliki arti tidak penting(stop-words) dalam proses pengolahan text, seperti: dan, atau, yang, dll.

Berikut ini code di PHP berupa fungsi untuk melakukan stemming dan menghapus stop-words:

Output dari code diatas sebagai berikut:

Array
(
    [1] => hotel modern jangkau
    [2] => akomodasi modern nyaman tenang
    [3] => hotel bintang 3 mewah harga jangkau
)

Dari output tersebut terlihat bahwa beberapa kata stop-words dan tanda koma (,) berhasil di hapus dan kata "terjangkau" diubah menjadi bentuk kata dasar "jangkau". Tahapan ini berguna untuk beberapa case berikutnya seperti: text classification, sentiment analysis atau yang akan saya bahas berikutnya yaitu menghitung pembobotan kata dengan TF-IDF untuk sistem rekomendasi berbasis content (content-based filtering).

Selamat mencoba..

Referensi

  1. https://adinyahya.com/cara-penerapan-stemming-dengan-menggunakan-library-sastrawi/
  2. https://github.com/sastrawi/sastrawi

Tuesday, December 7, 2021

Bedah kode Aplikasi Storage di Android

Storage/Media penyimpanan merupakan hal yang penting pada aplikasi berbasis mobile, salah satunya di Android. Berdasarkan data penyimpanan, di Android terdapat 2 jenis yaitu: data temporary dan data persistence. Data temporary umumnya diproses melalui internal storage dalam bentuk cache, sedangkan data persistence disimpan secara permanen dalam suatu file.

Pada artikel ini akan kita bahas jenis yang kedua yaitu data persistence. Android menyediakan beberapa solusi untuk menangani data persistence, tergantung dari sifatnya apakah private atau public. Beberapa solusi yang dipilih harus sesuai dengan kebutuhan spesifiknya, seperti apakah data yang disimpan akan bersifat private atau boleh diakses secara bebas (public) serta berapa banyak space yang dibutuhkannya. Selain itu, Android juga menyediakan cara untuk membuka data private ke aplikasi lain (apabila diperlukan), melalui Content Provider (inshaAllah akan dibahas di posting lainnya).

Images are taken from flaticon

Storage data persistence ini terbagi lagi menjadi 2 yaitu: 
  • Internal storage: direktori private yang hanya diakses pada aplikasi itu sendiri.
  • External storage: direktori public dapat diakses secara lebih luas pada aplikasi itu sendiri dan aplikasi lainnya.
Karakteristik internal storage:
  • Selalu tersedia/dapat diakses.
  • Menggunakan file sistem dari device.
  • Hanya bisa diakses pada aplikasi itu sendiri, kecuali secara eksplisit diatur agar dapat dibaca/tulis.
  • Saat aplikasi di-uninstall/clear data, sistem akan menghapus data di internal strorage.
Karakteristik exsternal storage:
  • Tidak selalu tersedia/dapat dihapus.
  • Menggunakan file sistem dari device atau external seperti SdCard.
  • World-readable, semua aplikasi dapat membaca.
  • Saat aplikasi di-uninstall, sistem tidak menghapus file tersebut.

Bedah kode aplikasi MyStorage

Langkah awal dengan membuat project baru di Android Studio, disini saya menggunakan nama aplikasi MyStorage dengan nama package net.ariflaksito.mystorage, minimal SDK adalah Android 5.0. Setelah itu di kita akan membuat contoh penggunaan internal dan external storage, pada MainActivity akan saya buat dua tombol untuk menuju ke activity InStorageActivity dan ExStorageActivity menggunakan Intent.

Jika anda ingin memahami lebih detail tentang Intent bisa disimak video berikut ini:


Silahkan anda siapkan layout seperti pada tampilan dibawah ini:

Tampilan awal MainActivity

Setelah itu kita bisa membuat 2 activity baru (Empty Activity) dengan nama : InStorageActivity dan ExStorageActivity. Untuk layout kedua activity tersebut, kita siapkan 4 Button dan 1 TextView seperti pada tampilan berikut :

Tampilan layout editor file

Untuk kode dari layout tersebut seperti dibawah ini:

Pada kode xml diatas kita perlu tambahkan beberapa resource di file strings.xml karena data-data text kita simpan di file res/values/strings.xml. Jika nanti diperlukan localize resource seperti aplikasi yang support multi bahasa lebih mudah dalam me-manage string tersebut.

Kode Activity Internal Storage

Selanjutnya kita edit bagian inStorageActivity. Pertama kita tambahkan class attribut nama-file, button dan textview seperti ini:

public static final String FILENAME = "myfile.txt";
Button btnCreate, btnEdit, btnRead, btnDelete;
TextView tvRead;

Selanjutnya kita set masing-masing komponen tersebut dan kita tambahkan label untuk ActionBar pada method onCreate( ) seperti berikut:

String title = getResources().getString(R.string.title_in_storage);
getSupportActionBar().setTitle(title);

btnCreate = findViewById(R.id.btn_create_file);
btnEdit = findViewById(R.id.btn_edit_file);
btnRead = findViewById(R.id.btn_read_file);
btnDelete = findViewById(R.id.btn_del_file);
tvRead = findViewById(R.id.tv_read);

Selanjutnya kita buat 4 method baru untuk menjalankan masing-masing fungsi, yaitu: createFile( ), editFile( ), readFile( ) dan deleteFile( ). Pada model internal storage kita gunakan fungsi getFilesDir( ) untuk meng-akses path dari storage. Untuk kode method createFile( ) seperti berikut:

void createFile() {
String isiFile = "Hello world!";
File file = new File(getFilesDir(), FILENAME);

FileOutputStream outputStream = null;
try {
file.createNewFile();
outputStream = new FileOutputStream(file, true);
outputStream.write(isiFile.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

Secara lengkap kode fungsi-fungsi yang lain dalam Activity tersebut seperti berikut:

Lokasi/path dari myfile.txt tersebut pada device berada di /data/data/(package-name)/files/myfile.txt. Kita dapat melihat melalui device file explorer di Android Studio untuk lokasi file tersebut. Sedangkan dari device file explorer akses ke path tersebut tidak bisa kecuali device anda sudah di root.

Lokasi file di internal storage

Kode Activity External Storage

Pada metode penyimpanan external, kita perlu tambahkan beberapa kode untuk melakukan cek perijinan dari Android API 23 keatas. Selain mendefinisikan nama file, kita perlu mendefinisikan code request untuk kembalian dari cek perijinan tersebut. Selanjutnya kita siapkan method baru yaitu checkPermission( ) dan onRequestPermissionsResult( ).

Pada method tersebut aplikasi akan menampilkan alert/pop-up ke pengguna apakah pengguna memberikan ijin aplikasi untuk merubah data-data di storage. Jika pengguna menekan tombol allow maka akan dilanjutkan ke proses selanjutnya, jika tidak maka akses ke storage tidak bisa dilakukan oleh aplikasi.

Alert pada device untuk perijinan akses storage

Selain itu, untuk external storage ini perlu menambahkan code permission di AndroidManifest.xml yaitu sebagai berikut:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Pada element <application> di file manifest juga perlu ditambahkan atribut berikut: 

android:requestLegacyExternalStorage="true"

Untuk akses lokasi/path dari file tersebut, disni kita menggunakan method yang berada di class Environment, yaitu: Environment.getExternalStorageDirectory(). Pada method createFile( ) dan editFile( ) juga perlu ditambahkan validasi untuk cek apakah media storage tersebut sudah di mount atau belum dengan kode berikut:

String state = Environment.getExternalStorageState();

if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}

Layout di activity ExStorageActivity menggunakan file yang sama pada activity sebelumnya. Untuk kode lengkap nya seperti dibawah ini:

Anda bisa ujicoba aplikasi tersebut dengan membuat file baru, melihat isi datanya, kemudian cek di device explorer, apakah sudah ada nama file tersebut. Selain itu anda bisa coba edit isi file dan hapus file.

Kesimpulan

Kapan kita perlu menggunakan internal dan external storage? Internal storage paling baik digunakan jika tidak ada yang boleh mengakses file selain aplikasi itu sendiri. Sebaliknya, external storage paling baik digunakan jika file tidak memerlukan batasan akses, file dapat di share ke aplikasi lain atau user diperbolehkan akses file melalui usb atau pc.