Pada catatan ini saya ingin mendokumentasikan proses reclaim username SUSE Community Account saya yang tidak ikut migrasi pada Juli 2020 dan telah dibekukan.
Keberhasilan dari proses re-claim old username ini karena, email yang saya daftarkan pada username yang telah dibekukan, masih aktif saya pergunakan.
Seperti yang tertulis di FAQ,
The account reactivation needs access to the registered e-mail address
Pada 1 Januari 2022, saya berencana ingin memasang distro openSUSE sebagai distro utama. Sambil menelusuri openSUSE Wiki 1, saya mencoba untuk login ke akun SUSE Community Account yang sudah pernah saya buat.
Ternyata, terdapat berita “Community Account Migration” pada portal 2 yang mana mereka sudah memigrasikan portal mereka menggunakan Univention.
Saya coba daftarkan username saya bandithijo
, ternyata sudah terdaftar. Namun, saya tidak bisa melakukan password reset, dan mendapatkan pesan error,
Saya coba baca-baca FAQ yang terdapat di portal 2, dan mendapatkan bagian FAQ yang ini,
FAQ: I don’t have access to the registered e-mail address.
Sorry. The account reactivation needs access to the registered e-mail address or (within the migration phase) the old password.
However the migration phase has ended in July 2020.
If you no longer have access to the registered e-mail address or it is invalid or longer existing there is no way to prove your ownership of the account and thus can not be regained.
Cerita di atas juga sudah pernah saya share di group telegram openSUSE Indonesia di sini.
Saat itu saya berfikir, akun bandithijo
sudah tidak lagi dapat dipulihkan karena tertinggal jadwal migrasi.
Saya pun mengurungkan niat untuk memasang openSUSE ke harddrive. Karena saat itu saya baru pasang di Virtual Machine via VirtualBox saja.
Alasan tidak melanjutkan ini bersifat personal saja. Saya tidak ingin berinteraksi di forum dan wiki dengan akun selain bandithijo
. Saya akhirnya membuat akun lain bernama bndthj
. Namun, rasanya kurang kalau bukan bandithijo
. Hahaha dasar idealis. 😁
Alasan kenapa saya ingin memasang openSUSE karena sekitar 2004 atau 2005 saya pernah pasang SUSE di laptop lama saya. Saat itu saya masih pengguna Windows, jadi tidak mengerti cara menggunakan Linux untuk dipakai sehari-hari. Karena sekarang saya cukup lama migrasi menggunakan Linux sejak Desember 2014, dan sudah menggunakan beberapa distro. Beberapa diantara yang saya pergunakan cukup lama (lebih dari 6 bulan):
Urutan tidak berdasarkan waktu pemakaian, karena yang paling lama saya pergunakan adalah Arch. Arch seperti fallback dari semua distro. Kalau saya mulai bosan, maka saya akan balik lagi ke Arch. Sekarang pun saya menulis catatan ini, yaa dengan Arch.
Dari daftar tersebut, saya belum menggunakan SUSE yang sekarang menjadi openSUSE.
September 2023, tepatnya tanggal 17, saya tiba-tiba tertarik lagi dengan openSUSE.
Namun, tentu saja, langkah pertama adalah mencoba meng-claim username bandithijo
saya.
Karena berdasarkan FAQ di atas, asalakan email yang terdaftar masih aktif, masih bisa dilakukan proses reactivasi akun.
Sayangnya, tidak disebutkan alamat email yang akan digunakan untuk mengajukan issue.
Saya pun mencoba mengirimkan email ke alamat admin@opensuse.org
, dengan isi sebagai berikut,
Date: Mon, 18 Sep 2023 06:43:01 +0800
From: Rizqi Nur Assyaufi <bandithijo@gmail.com>
To: admin@opensuse.org
Subject: [HELP] Reclaim my old username
[-- Begin signature information --]
Good signature from: Rizqi Nur Assyaufi <bandithijo@gmail.com>
aka: Rizqi Nur Assyaufi <rizqiassyaufi@gmail.com>
aka: Rizqi Nur Assyaufi <rizqinurassyaufi@gmail.com>
created: Mon 18 Sep 2023 06:43:01 AM WITA
[-- End signature information --]
[-- The following data is signed --]
Hello, admin of opensuse.org
My name is Rizqi Nur Assyaufi from Indonesia.
I ever create SUSE Community Account (SUSE ID) named "bandithijo",
but I did not participate in the migration process in July 2020.
May I reclaim my username "bandithijo" again?
Currently I have second account named "bndthj".
But I do not want to handle different username for all my online account.
Could you help me, please.
Best,
Rizqi Nur Assyaufi (bandithijo)
--
Rizqi Nur Assyaufi (bandithijo)
https://bandithijo.dev
560691E942A02F91
He/Him/His
TZ=Asia/Makassar (GMT +0800)
[-- End of signed data --]
Saya tidak terlalu berharap banyak karena alamat dari email tersebut juga saya dapatkan dari hasil menebak-nebak saja. Saya berasumsi bahwa, mungkin ada orang yang menghandle email admin@opensuse.org
. Kalau nanti salah topik, mudah-mudahan diarahkan ke alamat yang benar.
Ternyata ada balasan.
Date: Sun, 17 Sep 2023 22:54:40 +0000
From: malcolmlewis <redmine@opensuse.org>
To: bandithijo@gmail.com
Subject: [openSUSE admin - tickets #135857] [HELP] Reclaim my old username
X-Mailer: Redmine
[openSUSE Tracker]
Issue #135857 has been updated by malcolmlewis.
Category set to Accounts
Assignee set to crameleon
@crameleon User name "bandithijo" has no presence in the Forum, bndthj does and created 2021-12-31.
----------------------------------------
tickets #135857: [HELP] Reclaim my old username
https://progress.opensuse.org/issues/135857#change-673775
Surprise! Ternyata alamat balasannya dari redmine@opensuse.org
.
Kalau tidak salah redmine ini adalah free dan opensour web-based project management dan issue tracking yang dibuat dengan Ruby on Rails. Keren! Ternyata masih ada yang pakai.
Email saya mendapat nomor issue tiket #135857.
Dari pesan di atas, terlihat kalau @malcolmlewis memberikan assignment issue ticket ini kepada @crameleon dan memberikan informasi singkat untuk mempercepat proses identifikasi problem.
Kalau sudah mendapat nomor tiket, artinya tinggal menunggu antrian kalau tiket kita akan dikerjakan.
Kali ini, email dibalas oleh @crameleon.
Date: Tue, 19 Sep 2023 13:22:17 +0000
From: crameleon <redmine@opensuse.org>
To: bandithijo@gmail.com
Subject: [openSUSE admin - tickets #135857] (In Progress) [HELP] Reclaim my old username
X-Mailer: Redmine
[openSUSE Tracker]
Issue #135857 has been updated by crameleon.
Status changed from New to In Progress
----------------------------------------
tickets #135857: [HELP] Reclaim my old username
https://progress.opensuse.org/issues/135857#change-674906
Tentang perubahan satus tiket ke (In Progress).
Kemudian, @crameleon, membalas email dan memberikan arahan.
Date: Tue, 19 Sep 2023 13:25:43 +0000
From: crameleon <redmine@opensuse.org>
To: bandithijo@gmail.com
Subject: [openSUSE admin - tickets #135857] (Feedback) [HELP] Reclaim my old username
X-Mailer: Redmine
[openSUSE Tracker]
Issue #135857 has been updated by crameleon.
Status changed from In Progress to Feedback
Hi,
I reinstated your old `bandithijo` account. Please visit https://idp-portal.suse.com/univention/self-service/#page=passwordreset to reset the passphrase for it.
Afterwards, visit https://idp-portal.suse.com/univention/self-service/#page=verifyaccount to validate the email address.
Let me know if it worked.
Best,
Georg
----------------------------------------
tickets #135857: [HELP] Reclaim my old username
https://progress.opensuse.org/issues/135857#change-674912
Dari arahan tersebut, saya diarahkan untuk melakukan 2 hal:
Setelah mencoba, langkah 1, ternyata masih gagal. Saya pun membalas email sebelumnya dengan menyertakan screenshot.
Date: Tue, 19 Sep 2023 21:41:03 +0800
From: Rizqi Nur Assyaufi <bandithijo@gmail.com>
To: crameleon <redmine@opensuse.org>
Subject: Re: [openSUSE admin - tickets #135857] (Feedback) [HELP] Reclaim my old username
[-- Attachment #1 --]
[-- Type: multipart/alternative, Encoding: 7bit, Size: 6.5K --]
[image: Screenshot_2023-09-19_21-35-07.png]
First of all, thank you for helping me. I have plan to use openSUSE after
my old username is back.
When visiting
https://idp-portal.suse.com/univention/self-service/#page=passwordreset I
put `bandithijo` on username input form and got those pop up (on image).
"You are not authorized to perform this action.
Server error message:
No contact information is stored for this user. Resetting the password is
not possible."
--
Rizqi Nur Assyaufi (bandithijo)
https://bandithijo.dev
560691E942A02F91
He/Him/His
TZ=Asia/Makassar (GMT +0800)
[image: Screenshot_2023-09-19_21-35-07.png]
adalah attachment dari Gambar 1 seperti yang saya berikan di awal catatan, saat melakukan password reset. Masih gagal dan dapat informasi yang sama seperti sebelumnya.
“No contact information is stored for this user.”
Date: Tue, 19 Sep 2023 13:56:19 +0000
From: crameleon <redmine@opensuse.org>
To: bandithijo@gmail.com
Subject: [openSUSE admin - tickets #135857] [HELP] Reclaim my old username
X-Mailer: Redmine
[openSUSE Tracker]
Issue #135857 has been updated by crameleon.
Thanks for the screenshot, that was an oversight on my end. Please try it again now.
----------------------------------------
tickets #135857: [HELP] Reclaim my old username
https://progress.opensuse.org/issues/135857#change-674981
Screenshot yang saya berikan, diapresiasi oleh. Dan dari email balasan ini, saya disuruh mencoba kembali.
Setelah saya coba lagi langkah 1 (password reset), ternyata berhasil! 🎉
Setelah memasukkan username, dan username kita divalidasi, kita diarahkan untuk memilih media untuk menerima data token. Karena username bandithijo
ini memang sudah memiliki email, dan email nya masih aktif saya pergunakan, saya memilih pilihan email. Dan memang hanya ada 1 pilihan saja.
Kemudian, kita akan mendapatkan email dari noreply@suse.de
, berisi,
Date: Tue, 19 Sep 2023 13:59:33 +0000
From: Password Reset Service <noreply@suse.de>
To: bandithijo@gmail.com
Subject: Password reset
Dear user bandithijo,
we have received a password reset request for your account. If you did not
wish to change your password, you can safely ignore this message.
To change your password please follow this link:
https://idp-portal.suse.com/univention/self-service/#page=newpassword&token=NeEe84uDfxS<REDACTED>tseY9obBAv9tQH9vC8kDebkRf&username=bandithijo
If the link does not work, you can go to
https://idp-portal.suse.com/univention/self-service/#page=newpassword
and enter the following token manually:
NeEe84uDfxS<REDACTED>tseY9obBAv9tQH9vC8kDebkRf
Greetings from your password self service system.
Dapat dilihat token untuk mereset password sudah didapatkan.
Copy token atau klik link yang diberikan.
Kemudian tekan CHANGE PASSWORD.
Selanjutnya, lakukan email validation melalui link yang diberikan di sini.
Isi form yang meminta kita memasukkan username. Nanti akan mendapatkan email seperti ini,
Date: Tue, 19 Sep 2023 14:00:40 +0000
From: noreply@suse.de
To: bandithijo@gmail.com
Subject: Account verification
Dear user bandithijo,
we have received your email verification request. To verify
your email address, please follow this link:
https://idp-portal.suse.com/univention/self-service/#page=verifyaccount&token=ka5D7MNFgb6gNNT<REDACTED>JiFSPm7PrAKSOdMo7TdW63uss&username=<REDACTED>&method=verify_email
If the link does not work, you can go to
https://idp-portal.suse.com/univention/self-service/#page=verifyaccount
and enter the following token manually:
ka5D7MNFgb6gNNT<REDACTED>JiFSPm7PrAKSOdMo7TdW63uss
Copy token atau click link yang diberikan.
Jika berhasil, akan mendapatkan popup seperti ini.
Alhamdulillah, dengan ini username bandithijo
berhasil saya dapatkan kembali di SUSE Community Account.
Setelah berhasil, tak lupa saya mengabarkan (mengkonfirmasi).
Karena konfirmasi dan terima kasih, adalah hal yang sangat penting.
Date: Tue, 19 Sep 2023 22:06:00 +0800
From: Rizqi Nur Assyaufi <bandithijo@gmail.com>
To: crameleon <redmine@opensuse.org>
Subject: Re: [openSUSE admin - tickets #135857] [HELP] Reclaim my old username
[-- Attachment #1 --]
[-- Type: multipart/alternative, Encoding: 7bit, Size: 5.2K --]
Thank you very much!
1. request forget password with token ✅
2. verify email address ✅
I have finished all the steps. 🎉
[image: Screenshot_2023-09-19_22-01-20.png]
Thank you very much Georg 🙏
Best,
Rizqi Nur Assyaufi
--
Rizqi Nur Assyaufi (bandithijo)
https://bandithijo.dev
560691E942A02F91
He/Him/His
TZ=Asia/Makassar (GMT +0800)
[image: Screenshot_2023-09-19_22-01-20.png]
adalah attachment dari Gambar 5.
@crameleon pun menutup tiket dan membalas.
Date: Tue, 19 Sep 2023 14:09:35 +0000
From: crameleon <redmine@opensuse.org>
To: bandithijo@gmail.com
Subject: [openSUSE admin - tickets #135857] (Resolved) [HELP] Reclaim my old username
X-Mailer: Redmine
[openSUSE Tracker]
Issue #135857 has been updated by crameleon.
Status changed from Feedback to Resolved
Sweet! Thanks for confirming, glad it worked!
Cheers,
Georg
----------------------------------------
tickets #135857: [HELP] Reclaim my old username
https://progress.opensuse.org/issues/135857#change-675014
That’s it!
Itu tadi pengalaman saya melakukan klaim terhadap old username saya di SUSE Community Account yang dibekukan karena tertinggal tidak ikut migrasi pada July 2020.
Proses re-claim username ini berhasil, karena alamat email yang saya gunakan masih aktif saya pergunakan. Kalau email nya tidak aktif, atau ingin berganti email pada username yang dibekukan, proses tersebut akan sulit (mungkin mustahil), karena mereka tidak punya data untuk memvalidasi bahwa username tersebut benar milik kita atau bukan.
Mudah-mudahan catatan ini bermanfaat untuk teman-teman.
Terima kasih sudah mampir yaa.
Minggu ini (September 2023), saya akan mulai migrasi ke openSUSE.
Terima kasih untuk @malcolmlewis dan @crameleon karena telah membantu saya memulihkan username bandithijo
.
Pada catatan kali ini saya ingin memodifikasi output dari nama attribute yang terlalu panjang menjadi lebih pendek di Ruby on Rails.
Saya memiliki method geofences yang mengembalikan colllection of hash
data dari model geofeonce.
Model geofence memiliki attributes,
:id, :created_at, :updated_at, :name, :description, :coordinates, :incoming_notification, :outgoing_notification
Saya hanya ingin mengambil attributes: :id
, :incoming_notification
, :outgoing_notification
.
1
2
3
4
5
def geofences
{
geofences: Geofence.all.order(id: :asc).as_json(only: [:id, :incoming_notification, :outgoing_notification])
}
end
Outputnya,
{
"geofences": [
{
"id": 1,
"incoming_notification": true,
"outgoing_notification": false
},
{
"id": 2,
"incoming_notification": false,
"outgoing_notification": true
},
{
"id": 3,
"incoming_notification": true,
"outgoing_notification": false
},
{
"id": 4,
"incoming_notification": false,
"outgoing_notification": true
}
]
}
Karena nama attribute :incoming_notification
dan :outgoing_notification
terlalu panjang, saya akan ganti menjadi :in
dan :out
. 1
Algoritma Pertama
1
2
3
4
5
6
7
8
9
10
11
12
13
# First algorithm
def geofences
{
geofences: Geofence.all.order(id: :asc)
.as_json(only: [:id, :incoming_notification, :outgoing_notification])
.each { |attribute|
attribute.tap { |key|
key[:in] = key.delete('incoming_notification')
key[:out] = key.delete('outgoing_notification')
}
}
}
end
Algoritma Kedua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Second algorithm
def geofences
geofences = Geofence.all.order(id: :asc)
transformed_geofences = geofences.map do |geofence|
{
id: geofence.id,
in: geofence.incoming_notification,
out: geofence.outgoing_notification
}
end
{ geofences: transformed_geofences }
end
Saya menulis 2 pendekatan. Namun, saya cenderung memilih algoritma kedua.
Alasannya adalah,
Database Query Optimization:
.as_json
:id
, :incoming_notification
, :outgoing_notification
dengan .map()
, hal ini berpotensi untuk meminimalisir query time ke databaseReduced Object Mutation:
.each
dengan .tap
untuk memodifikasi Hash Object, hal ini terkadang dapat menyebabkan behaviour yang tidak dapat diprediksi sehingga menimbulkan bug.Hasilnya,
{
"geofences": [
{
"id": 1,
"in": true,
"out": false
},
{
"id": 2,
"in": false,
"out": true
},
{
"id": 3,
"in": true,
"out": false
},
{
"id": 4,
"in": false,
"out": true
}
]
}
Terima kasih sudah mampir yaa.
Pada catatan kali ini saya akan mendokumentasikan salah satu feature dari Git yang cukup sering saya pergunakan di kerjaan, yaitu Git-stash.
Dalam sebuah project yang menggunakan Git, terkadang saya memiliki beberapa perubahan terhadap file-file project yang tidak ingin saya commit dulu.
Beberapa alasan diantaranya:
Alasan-alasan tersebut di atas, dapat terselesaikan dengan Git-stash. 1
Dengan Git-stash, saya bisa menyimpan segelondongan perubahan file yang tidak ingin saya commit, namun saya simpan terlebih dahulu, untuk saya kerjakan (panggil) lagi nanti, di waktu yang lain.
Caranya,
$ git stash save 'fix: bug on create product ver.1' -u
git stash
, adalah prefix git untuk melakukan stash-ing.
save
, adalah option untuk menyimpan stash dengan diikuti message.
-u
atau --include-untracked
, adalah option untuk melakukan stash terhadap semua untracked files. Saya menggunakan option ini karena semua modifikasi file belum saya staging.
Kita dapat menyimpan lebih dari 1 stash.
Ada 3 cara untuk melihat daftar stash.
$ git stash list
stash@{0}: On feature/xxxxxxxx-xxxxxx: Modularity script ver.1
stash@{1}: On feature/xxxxxxxx-xxxxxx: xxxxxxx-xxxxxx: Update logic ver.1
stash@{2}: On feature/xxxxxxxx-xxxxxx: xxxxxxxx xxxxxx ver.1
stash@{3}: On feature/admin-xxxxxxx-xxxx: Add set_default xxxxxxx_xxxxxxxxxx
stash@{4}: On feature/admin-xxxxxxx-xxxx: Update ver.1
stash@{Nth}
adalah identitas dari stash, untuk {Nth}
adalah index dari stash yang dimulai dari 0. Dengan order (urutan), stash dengan index ke 0 adalah stash yang paling terakhir ditambahkan ke dalam stash.
Kekurangan:
Output list stash, akan tampil dalam bentuk less like. Apabila value lebih dari jumlah baris yang dapat ditampilkan di layar, maka, akan ada indikator berupa -- More --
di pojok kiri bawah
Dengan kekurangan yang ada di nomor 1, artinya tidak ada navigasi untuk melihat detail dari isi stash
$ git log -g stash
-g
, atau --walk-reflogs
, adalah option yang digunakan untuk mengurutkan reflog yang masuk dari yang paling terbaru (terakhir masuk) sampai yang terlama. 2
Outputnya akan seperti ini,
commit 08335778789d5b70228a4f47da95b89f99f5bc3d
Reflog: stash@{0} (Rizqi Nur Assyaufi <bandithijo@gmail.com>)
Reflog message: On feature/xxxxxxxx-xxxxxx: Modularity script ver.1
Merge: 23efe1d1e 6e4e19906
Author: Rizqi Nur Assyaufi <bandithijo@gmail.com>
Date: Thu Jun 8 14:50:12 2023 +0800
On feature/xxxxxxxx-xxxxxx: Modularity script ver.1
commit b3987dadfd79daf1b7a33ab61b7761a9281b3ca7
Reflog: stash@{1} (Rizqi Nur Assyaufi <bandithijo@gmail.com>)
Reflog message: On feature/xxxxxxxx-xxxxxx: xxxxxxx-xxxxxx: Update logic ver.1
Merge: 4335369f9 c24229e8b
Author: Rizqi Nur Assyaufi <bandithijo@gmail.com>
Date: Mon May 22 14:38:06 2023 +0800
On feature/xxxxxxxx-xxxxxx: xxxxxxx-xxxxxx: Update logic ver.1
commit 039ba27c4388d7f2dea17a627903580442ea4967
Reflog: stash@{2} (Rizqi Nur Assyaufi <bandithijo@gmail.com>)
Reflog message: On feature/xxxxxxxx-xxxxxx: xxxxxxxx xxxxxx ver.1
Merge: 60655d305 3f4a2cc7e
Author: Rizqi Nur Assyaufi <bandithijo@gmail.com>
Date: Mon Apr 24 15:29:55 2023 +0800
On feature/xxxxxxxx-xxxxxx: xxxxxxxx xxxxxx ver.1
commit 272e653bf7b31ec10c587bdfdabf28b88a2d1bc0
Reflog: stash@{3} (Rizqi Nur Assyaufi <bandithijo@gmail.com>)
Reflog message: On feature/admin-xxxxxxx-xxxx: Add set default xxxxxxx xxxxxxxxxx
Merge: 65542c241 ad4763514
Author: Rizqi Nur Assyaufi <bandithijo@gmail.com>
Date: Wed Mar 29 22:38:14 2023 +0800
On feature/admin-xxxxxxx-xxxx: Add set default xxxxxxx xxxxxxxxxx
commit a8430b442e3c6db0476e8b369a99b1707821ca1c
Reflog: stash@{4} (Rizqi Nur Assyaufi <bandithijo@gmail.com>)
Reflog message: On feature/admin-xxxxxxx-xxxx: Update ver.1
Merge: 4de02c94b 00df18f4a
Author: Rizqi Nur Assyaufi <bandithijo@gmail.com>
Date: Tue Mar 28 17:57:42 2023 +0800
On feature/admin-xxxxxxx-xxxx: Update ver.1
Pada bagian Reflog:
, adalah identitas stash dengan format stash@{Nth}
, untuk {Nth}
adalah index dari stash yang dimulai dari 0. Dengan order (urutan), stash dengan index ke 0 adalah stash yang paling terakhir ditambahkan ke dalam stash.
Dengan menggunakan Git-reflog show, kita dapat melihat detail dari stash. 3
$ git reflog show stash
Akan terbuka window split horizontal baru dengan output,
083357787 stash@{0}: On feature/xxxxxxxx-xxxxxx: Modularity script ver.1
b3987dadf stash@{1}: On feature/xxxxxxxx-xxxxxx: xxxxxxx-xxxxxx: Update logic ver.1
039ba27c4 stash@{2}: On feature/xxxxxxxx-xxxxxx: xxxxxxxx xxxxxx ver.1
272e653bf stash@{3}: On feature/admin-xxxxxxx-xxxx: Add set_default xxxxxxx_xxxxxxxxxx
a8430b442 stash@{4}: On feature/admin-xxxxxxx-xxxx: Update ver.1
Outputnya hampir mirip dengan Git-stash list, namun perbedaannya terdapat prefix commit hash di awalnya.
Commit hash ini memungkinkan kita untuk membuka isi dari stash dan melihat patch di dalamnya dengan cara menekan tombol Enter di atas commit hash.
Outputnya akan seperti ini,
tree a7510e9ce2fdc6026fce8a3f8dbc614d522560c1
parent b6540c374b9cab4d47d91f133261b805ed8ead03
parent d33698aabf3538e52372b5561a356830503d36a1
author Rizqi Nur Assyaufi <bandithijo@gmail.com> Fri Dec 23 07:07:58 2022 +0800
committer Rizqi Nur Assyaufi <bandithijo@gmail.com> Fri Dec 23 07:07:58 2022 +0800
On feature/admin-xxxxxxx-xxxx: Update ver.1
diff --git a/serializer/admin.rb b/serializer/admin.rb
index 392ea6f9d..c936694ba 100644
--- a/serializer/admin.rb
+++ b/serializer/admin.rb
@@ -32,6 +32,10 @@ class SerializerAdmin
encrypt(object.phone)
end
+ attribute :request_payload do
+ # new logic statement here
+ end
+
attribute :links do
{
# self: admin_path(object),
Untuk, kembali ke stash list, dapat menggunakan tombol Ctrl+^.
Kekurangannya adalah tidak dapat melihat untracked files (file yang baru dibuat). Untuk case ini, dapat menggunakan Git-stash show.
Untuk melihat detail dari stash dalam bentuk patch diff, gunakan perintah ini, 1
$ git stash show -p stash@{Nth} -u
Atau shorthandnya untuk stash{0}
, hanya tuliskan index nya saja,
$ git stash show -p 0 -u
-p
adalah shorthand dari --patch
.
-u
adalah shorthand dari --include-untracked
.
Jika tanpa -u
maka file yang baru dibuat, tidak akan ditampilkan.
Sekarang cara mengeluarkan dari stash, apabila stash yang telah disimpan, ingin digunakan kembali, yaitu dengan perintah, 1
Ada 2 cara untuk mengeluarkan stash:
$ git stash apply stash@{Nth}
{Nth}
adalah index, yang paling akhir (paling baru) ditambahkan adalah index ke 0
.
Atau langsung dengan indexnya,
$ git stash apply 0
Artinya, kita akan melakukan apply pada stash dengan index ke 0
.
Perintah git stash apply
ini tidak akan menghilangkan stash dengan index terpilih dari dalam stash list. Stash tersebut masih akan tetap ada. Untuk mengeluarkan sekaligus melakukan apply terhadap stash terpilih, dapat menggunakan Git-stash pop.
Jika stash terpilih sudah tidak diperlukan lagi, kita bisa menerapkan stash sambil menghapus stash dari daftar list.
$ git stash pop stash@{Nth}
{Nth}
adalah index dari stash. Index ke 0 adalah stash dengan index paling akhir (paling baru ditambahkan).
Atau bisa langsung dengan index nya saja.
$ git stash pop 0
Jika stash yang ada dalam daftar stash list sudah tidak digunakan lagi, kita dapat langsung menghapusnya dengan perintah Git-stash drop, 1
$ git stash drop stash@{Nth}
{Nth}
adalah index dari stash terpilih, dengan index 0 adalah stash paling akhir ditambahkan (paling baru).
Atau bisa langsung dengan index nya,
$ git stash drop 0
Untuk menghapus seluruh stash atau mengosongkan seluruh stash dari list, kita dapat menggunakan Git-stash clear. 1
$ git stash clear
Perintah ini akan menghapus seluruh stash dari daftar list. Dan mungkin akan tidak mungin dapat di-recover.
Terima kasih sudah mampir yaa.
Catatan kali ini, saya akan mendokumentasikan proses troubleshooting pada Ubuntu Server yang mengalami expired signature key saat melakukan apt update.
Saat menjalankan perintah $ sudo apt update
, keluar pesan erorr seperti ini,
The following signatures were invalid: EXPKEYSIG 23E7166788B63E1E Yarn Packaging <yarn@dan.cx>
Ini berarti di Ubuntu saya, masih memiliki kunci GPG versi lama yang digunakan untuk menandatangani package Yarn.
Kita asumsikan package maintainer sudah memperbaharui public key mereka dan menguploadnya di keyserver.ubuntu.com. Jadi, kita tinggal menjalankan perintah di bawah ini.
$ sudo apt-key adv --refresh-keys --keyserver keyserver.ubuntu.com
Terima kasih sudah mampir yaa.
Language Server Protocol sangat membantu developer saat proses membangun aplikasi. Solargraph adalah salah satu LSP yang populer digunakan dikalangan Ruby programmer dan Rails developer. Catatan ini akan mendokumentasikan cara saya melakukan setup terhadap Solargraph pada Rails project di Neovim.
Dikutip dari halaman official site dari solargraph,
Solargraph is a Ruby language server and suite of static analysis tools. The language server provides intellisense, autocompletion, diagnostics, and other language features for editors and IDEs with language client capabilities. The static analysis tools check code for type safety.
Fitur yang ditawarkan, antara lain:
Ruby programmer atau Rails developer pasti sudah familiar dengan gem ini.
Saya menggunakan Neovim dengan konfiguasi lua.
local on_attach = function(client, bufnr)
if client.server_capabilities.documentSymbolProvider then
navic.attach(client, bufnr)
end
end
require("lspconfig").solargraph.setup({
on_attach = on_attach
})
Solargraph belum akan berjalan karena kita perlu memasang Solargraph gem terlebih dahulu.
Gem yang diperlukan tentu saja solargraph
dan juga solargraph-rails
. Namun, kita tidak perlu memasukkannya ke dalam Gemfile
project kita.
Cukup install sendiri di dalam lokal project kita. Karena bisa jadi anggota tim kita tidak menggunakan Solargraph.
$ gem install solargraph solargraph-rails
Initialize file konfigurasi dengan menjalankan perintah di bawah pada direktori root dari Rails project.
$ solargraph config
Perintah di atas, akan otomatis membuatkan kita file .solargraph.yml
di Root Rails project dan sudah memiliki default template di dalamnya.
Modifikasi isinya seperti di bawah ini
---
include:
- "**/*.rb"
exclude:
- spec/**/*
- test/**/*
- vendor/**/*
- ".bundle/**/*"
require:
- rails
domains: []
reporters:
- rubocop
- require_not_found
formatter:
rubocop:
cops: safe
except: []
only: []
extra_args: []
require_paths: []
plugins:
- solargraph-rails
max_files: 5000
Yang saya tambahkan adalah bagian,
require:
- rails
dan
plugins:
- solargraph-rails
Secara default Solargraph menggunakan Rubocop sebagai linter. Pasang juga.
$ gem install rubocop
Kalau mau menginisialisasi file confignya gunakan perintah di bawah ini
$ rubocop --auto-gen-config
Perintah di atas akan mengenerate konfigurasi default untuk Rubocop yaitu file .rubocop.yml
dan .rubocop_todo.yml
di Root Rails prject kita.
Sip!
Konfigurasi sudah selesai, dengan begini kita sudah dapat memanfaatkan kemampuan LSP Solargraph di Neovim kita.
Keymap | Action |
---|---|
g+d | Jump to definition |
shift+k | Show hover documentation |
g+r | Open quickfix with all references to method |
r+n | Rename method and update references |
Agar tidak mengganggu isi dari direktori Root Rails project, kita perlu mendaftarkan file-file konfigurasi yaml yang telah dibuat ke dalam file .gitignore
.
/.rubocop*.yml
/.solargraph.yml
Terima kasih sudah mampir yaa.
https://solargraph.org/
Diakses tanggal: 2023/07/08
https://github.com/castwide/solargraph
Diakses tanggal: 2023/07/08
https://github.com/iftheshoefritz/solargraph-rails
Diakses tanggal: 2023/07/08
GNOME memang terkenal Desktop Environment yang berat dan membutuhkan banyak resource. Namun, saya tidak bisa tidak suka dengan GNOME. Mungkin karena saya cukup lama dengan OSX yang menjadi rujukan UI/UX design dari GNOME, sehingga saya merasa cukup nyaman menggunakan GNOME. Di catatan kali ini, saya akan mencatat tips ketika saya menggunakan GNOME di Arch Linux.
Pasang paket dconf
dan dconf-editor
$ sudo pacman -S dconf dconf-editor
GDM di Arch Linux, tidak langsung menampilkan logo distribusi di bagian bawah dari GDM. Kita perlu melakukan setup manual.
Pindah ke direktori /etc/dconf/db/
$ cd /etc/dconf/db
Buat direktori baru dengan nama gdm.d/
$ sudo mkdir /etc/dconf/db/gdm.d
Buat file dengan nama 02-logo
$ sudo touch /etc/dconf/db/gdm.d/02-logo
Isi dengan konfigurasi di bawah ini
1
2
[org/gnome/login-screen]
logo='/usr/share/pixmaps/archlinux-logo-text-dark.svg'
/usr/share/pixmaps/archlinux-logo-text-dark.svg
sudah secara default disediakan oleh Arch Linux, tinggal digunakan saja.
Untuk mengganti cursor theme dan size pada GDM.
Buat file baru dengan nama 10-cursor-settings
$ sudo touch /etc/dconf/db/gdm.d/10-cursor-settings
Isi dengan konfigurasi di bawah ini
1
2
3
[org/gnome/desktop/interface]
cursor-theme='ComixCursors-White'
cursor-size=48
Pada variable cursor-theme=
, isi dengan cursor theme yang kalian inginkan. Alamatnya harus berada di path global /usr/share/icons/
.
Pada variable cursor-size=
, isi dengan size yang tersedia dari cursor theme, umumnya antara: 16, 24, 36, 48. Saya menggunakan 48, karena saya menggunakan layar FHD (1920x1080).
For check the current cursor size,
$ gsettings get org.gnome.desktop.interface cursor-size
The default is 24
.
Depending on the theme, sizes are 24, 32, 48, 64.
To change the cursor size,
$ gsettings set org.gnome.desktop.interface cursor-size 32
Just set the env XCURSOR_SIZE=
before run the Qt apps, or define on local/global env file.
My local env variables are on ~/.profile
(some people keep it on ~/.bashrc
or ~/.bash_profile
).
1
export XCURSOR_SIZE=36
Secara default, kalau kita menekan SUPER+Number, maka app yang terdapat pada Dash pada index yang terpanggil, akan terbuka. Fitur ini sangat mengganggu bagi saya yang terbiasa menggunakan Window Manager (WM). Saya akan disable fitur ini.
Disable dash-to-dock hot-keys
properties
$ gsettings set org.gnome.shell.extensions.dash-to-dock hot-keys false
Kemudian, disable keybinding switch-to-application-${index}
properties, kita akan buat nilai array nya menjadi array kosong.
$ for i in $(seq 1 9); do gsettings set org.gnome.shell.keybindings switch-to-application-${i} '[]'; done
Terima kasih sudah mampir yaa.
Arch Wiki: GDM > Login Screen Logo
Diakses tanggal: 2023/06/27
Arch Wiki: GDM > Change Cursor Theme
Diakses tanggal: 2023/06/27
Disable the default app key (super+num) functionality on Ubuntu 17.10 and later
Diakses tanggal: 2023/06/27
wiki.archlinux.org: Cursor themes
Diakses tanggal: 2023/10/07
github.com/telegramdesktop/tdesktop: Big cursor in GNOME Wayland #16920
Diakses tanggal: 2023/10/07
Terkadang, setelah sistem kita mengalami masalah audio server, terkhusus untuk yang sudah menggunakan Pipewire dan Wireplumber, terkadang bakal bertemu dengan berbagai macam kendala audio yang secara random akan muncul dan dengan berbagai sebab.
Kondisi ini terbilang cukup jarang terjadi, tapi kalau sedang terjadi, cukup dapat membuat kepala pening, kalau belum tahu cara menghandle-nya.
Buka Terminal dan jalankan perintah di bawah,
Kalau pakai Bash Shell
$ systemctl restart --user {pipewire,wireplumber}.service
Kalau bukan Bash Shell
$ systemctl restart --user pipewire.service
$ systemctl restart --user wireplumber.service
Tidak dipungkiri, beberapa aplikasi masih memerlukan trayicon. Bahkan ada beberapa aplikasi yang tidak dapat berjalan apabila tidak terdapat tempat untuk meletakkan trayicon. Untuk beberapa Window Manager yang tidak memiliki Bar yang menyediakan trayicon, kita dapat memanfaatkan Polybar sebagai tempat menyimpan trayicon.
Saya sudah pernah menggunakan metode konvensional untuk melakukan hide/show pada Polybar sebagai trayicon di artikel ini, Polybar, Bar yang Mudah Dikonfig, Praktis, dan Mudah Dikustomisasi
Terdapat banyak sekali kelemahan dari menggunakan pendekatan tersebut.
Namun, yang paling mengganggu saya adalah: Fungsi aplikasi yang sangat tergantung dengan trayicon, tidak berjalan dengan semestinya.
Contohnya seperti nm-applet yang apabila tidak disimpan di trayicon dan hanya berjalan sebagai background process, tidak akan memberikan notifikasi status network.
Maka dari itu, saya lebih merekomendasikan untuk menggunakan pendekatan menggunakan IPC.
Cara ini memanfaatkan IPC (Interprocess Communication) agar kita dapat mengirimkan message process ke Polybar dengan menggunakan perintah polybar-msg
pada segment bar yang menggunakan attribute enable-ipc = true
.
Pada segment atau section bar yang dijadikan sebagai trayicon, tambahkan attribute enable-ipc = true
.
Contoh seperti yang saya pergunakan,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
[colors]
foreground = ${xrdb:foreground:}
background = #001E1E1E
[bar/traydwm]
monitor = ${env:MONITOR:eDP1}
fixed-center = false
width = 1%
height = 24
offset-x = 1
offset-y = 1
bottom = yes
foreground = ${colors.foreground}
background = ${colors.background}
line-size = 1
line-color = #dfdfdf
border-size = 1
padding-left = 0
padding-right = 0
module-margin-left = 0
module-margin-right = 0
font-0 = JetBrainsMono Nerd Font Bandit:size=9;2
tray-padding = 0
tray-position = left
tray-maxsize = 16
tray-scale = 1.0
tray-foreground = ${colors.foreground}
tray-background = ${colors.background}
tray-detached = true
tray-offset-x = 9
tray-offset-y = -9
override-redirect = true
enable-ipc = true
cursor-click = pointer
cursor-scroll = ns-resize
modules-left = sp1
modules-center =
modules-right =
[module/sp1]
type = custom/text
content = " "
content-foreground = ${colors.foreground}
content-background = ${colors.background}
[settings]
throttle-output = 5
throttle-output-for = 10
screenchange-reload = true
compositing-background = source
compositing-foreground = over
compositing-overline = over
compositing-underline = over
compositing-border = over
pseudo-transparent = true
[global/wm]
margin-top = 0
margin-bottom = 0
; vim:ft=dosini
Perhatikan pada baris ke-42, saya menggunakan attribute enable-ipc = true
pada section bar yang saya gunakan sebagai trayicon dengan nama section [bar/traydwm]
.
Sip, untuk langkah di Polybar config hanya seperti ini saja.
Setelah memasang attribute enable-ipc = true
pada bar yang kita ingin dapat melakukan hide & show, selanjutnya cara memanggil dan menyembunyikannya dengan menggunakan command polybar-msg
.
Coba dulu jalankan di Terminal emulator,
Untuk menampilkan bar
$ polybar-msg cmd show
Successfully wrote command 'show' to PID 229212
Untuk menyembunyikan bar
$ polybar-msg cmd hide
Successfully wrote command 'hide' to PID 229212
Perhatikan output yang ditampilkan, terdapat keterangan PID 229212
yang menunjukkan bahwa PID tersebut milik Polybar.
Cara mengeceknya tinggal gunakan command pidof
.
$ pidof polybar
229212
Nah, kalau sudah berhasil menggunakan command polybar-msg
untuk hide & show di Terminal, tinggal mengaplikasikannya pada applikasi hotkey yang kalian gunakan. Saya menggunakan sxhkd.
1
2
3
# polybar tray
super + shift + ~b
polybar-msg cmd {show, hide}
Penggunaan lebih lanjut saya serahkan pada imajinasi dan kreatifitas teman-teman.
Mungkin teman-teman bisa membaca-baca manual dari man polybar-msg
dan membantu dalam solusi kreatifitas teman-teman.
Terima kasih sudah mampir yaa.
https://www.reddit.com/r/Polybar/comments/ak246w/polybar_hide_show_on_key_press_release_bspwmsxhkd/
Diakses tanggal: 2022/12/10
https://github.com/polybar/polybar/wiki#launching-the-bar-in-your-wms-bootstrap-routine
Diakses tanggal: 2022/12/10
GnuPG adalah implementasi dari OpenPGP Standard (PGP) yang juga dikenal dengan nama GPG, yang dapat kita gunakan untuk melakukan enkripsi dan menandatangani data. Kita akan menggunakan GnuPG untuk mengenkripsi file atau dokumen.
Kenapa kita perlu mengenkripsi file atau dokumen?
Penggunaan dari GPG sangat kompleks sekali. Di catatan kali ini, saya hanya akan menunjukkan beberapa perintah-perintah yang sering saya pergunakan.
Target file bisa apa saja, misal: gambar, video, file dari Miscrosoft Word, archive (zip, tar, dst.), dll.
Sebagai contoh file atau dokumen yang akan saya enkripsi adalah sebuah file bertipe plain text dengan ekstension Markdown.
1
2
3
4
5
6
7
8
9
10
11
12
| id | email | password |
|-----|--------------------------------------|------------------------------------|
| 1 | kyle_kunde@predovic-gorczany.com | mjvfPFh9E1WCUMPY2H5uLNRxvw42MdJRSH |
| 2 | dorene_berge@bogisich.info | mhRudkNp1QyM3bpqxCq3tJzKVuQJHcsLZT |
| 3 | kimberlie@mueller.info | mxiHi8kUAvrt2c4HsCcR5diZnBy26wHnzg |
| 4 | royce.marks@bauch.com | msk7nRPFfckdpxePKurzXNCPNUtkej5pnn |
| 5 | billie@armstrong.net | msGDzgvmyqY1UqybAB4ujv595qRNEWi16D |
| 6 | gina@reynolds-klein.org | mmGKEBk99QwgcdCwuUjtHzJYXESF96uRNP |
| 7 | shon.batz@kiehn.name | mut88wKf8GhKoijTLAXkoVNgUTscark4Uu |
| 8 | minh@lubowitz-walsh.io | mx8Qort7MR4RrjNfCsY4dnu9meQrSB6ChF |
| 9 | jonah@reinger.io | mjoFeZ7BUrhiwF4PkcrqfUT1CUBJbSonBw |
| 10 | trey_zemlak@wisozk.info | mg99BBN2Y6S7YCsVa8wDK6yqZNEKvjwTUq |
Setelah menentukan target file, kita lanjut ke tahap enkripsi.
Ada banyak sekali cara metode enkripsi yang dapat kita lakukan dengan gpg.
Di catatan ini saya membatasi hanya menulis cara yang sering saya gunakan saja.
Untuk metode-metode lain, teman-teman dapat membaca sendiri di man gpg
.
Syarat: Kita sudah memiliki default secret gpg key.
Artinya bentuk enkripsi ini hanya dapat dibuka oleh orang yang memiliki signature dari gpg key tersebut. Yang berarti saya sendiri.
Cara mengetahuinya.
$ gpg --list-secret-keys
sec rsa4096 2022-08-20 [SC]
AE706A616B252A6822635041560691E942A02F91
uid [ultimate] Rizqi Nur Assyaufi <bandithijo@gmail.com>
uid [ultimate] Rizqi Nur Assyaufi <rizqiassyaufi@gmail.com>
uid [ultimate] Rizqi Nur Assyaufi <rizqinurassyaufi@gmail.com>
ssb rsa4096 2022-08-20 [E]
Saya memiliki 1 buah gpg key.
Nah, kita bisa langsung mengenkripsi file dengan menandatanganinya (sign) dengan gpg secret key yang kita miliki.
$ gpg --sign tabel_users.md
Outputnya akan berupa file tabel_users.md.gpg
.
tabel_users.md tabel_users.md.gpg
Ketika membuat gpg key, kita akan membuat 2 kunci, public key & secret key. Inilah yang disebut assymmetric key, karena key yang digunakan untuk menguncinya tidak sama dengan kunci yang digunakan untuk membuka.
Namun, kita tetap bisa mengunci file secara symmetric dengan gpg.
$ gpg --symmetric tabel_users.md
Setelah itu, kita akan diminta memasukkan password sebanyak 2x.
Outputnya akan berupa file tabel_users.md.gpg
.
tabel_users.md tabel_users.md.gpg
Metode enkripsi ini saya gunakan untuk berkirim file kepada orang yang gpg public key nya saya simpan.
Misal, saya ingin berkirim file yang terenkripsi kepada om Linus Torvalds. Kebetulan saya punya gpg public key om Linus.
$ gpg --list-key torvalds@linux-foundation.org
pub rsa2048 2011-09-20 [SC]
ABAF11C65A2970B130ABE3C479BE3E4300411886
uid [ unknown] Linus Torvalds <torvalds@kernel.org>
uid [ unknown] Linus Torvalds <torvalds@linux-foundation.org>
sub rsa2048 2011-09-20 [E]
Oke, tinggal kita enkripsi file nya dengan gpg public key punya om Linus.
$ gpg --encrypt --recipient torvalds@linux-foundation.org tabel_users.md
gpg: 88BCE80F012F54CA: There is no assurance this key belongs to the named user
sub rsa2048/88BCE80F012F54CA 2011-09-20 Linus Torvalds <torvalds@linux-foundation.org>
Primary key fingerprint: ABAF 11C6 5A29 70B1 30AB E3C4 79BE 3E43 0041 1886
Subkey fingerprint: AEE4 16F7 DCCB 753B B3D5 609D 88BC E80F 012F 54CA
It is NOT certain that the key belongs to the person named
in the user ID. If you *really* know what you are doing,
you may answer the next question with yes.
Use this key anyway? (y/N) y
Outputnya akan menjadi file tabel_users.md.gpg
.
tabel_users.md tabel_users.md.gpg
Nah, sudah jadi. Tinggal dikirim ke om Linus.
Hanya om Linus yang dapat membuka file terenkripsi tersebut dengan gpg secret key milik om Linus, karena file tersebut dienkripsi dengan gpg public key miliknya.
Cara untuk mendekrip file atau dokumen yang dienkripsi dengan gpg, biasanya, saya menggunakan 2 flow.
$ gpg --decrypt tabel_users.md.gpg | less
$ gpg --output tabel_users.md --decrypt tabel_users.md.gpg
Tambahkan baris di bawah ini pada salah satu file configurasi ranger ~/.config/ranger/rifle.conf
.
1
2
# gnupg
ext gpg, has gpg = gpg --decrypt "$1" | less
Arti dari baris di atas:
.gpg
gpg
gpg --decrypt "$1" | less
$1
adalah file yang terseleksi
Saya menggunakan less
untuk mengintip file terenkripsi tersebut.
Penggunaan lebih lanjut saya serahkan pada imajinasi dan kreatifitas teman-teman.
Terima kasih sudah mampir yaa.
Saya juga pernah menulis terkait GnuPG di catatan sebelumnya.
https://www.gnupg.org/
Diakses tanggal: 2022/08/20
https://www.gnupg.org/gph/en/manual/x110.html
Diakses tanggal: 2022/08/20
dmenu-websearch ini saya buat karena kemalasan saya dalam melakukan pencarian kata/frasa tertentu namun harus membuka website terkait. Tidak praktis. Saya ingin kata/frasa tersebut cukup saya inputkan dari menu di desktop kemudian browser akan menuntun saya ke halaman hasil pencarian di website terkait.
dmenu-websearch ini memiliki fitur:
Simpan file dmenu-websearch
di PATH direktori.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/bin/bash
# Released under MIT License
# Copyright (C) 2021 Rizqi Nur Assyaufi <bandithijo@gmail.com>
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# Deps:
# - dmenu
# - jq
MENU="dmenu"
FILE="$HOME/.urlquery"
if [ ! -f $FILE ]; then
cp urlquery.example $HOME/.urlquery
fi
FILEOPT=$(cat $FILE)
OPTIONS="
[
${FILEOPT}
[ \"Add:New:Query\", \"\" ],
[ \"Delete:Query\", \"\" ]
]
"
OBJ_LENGTH=$(echo $OPTIONS | jq length)
OBJ_MENU=$(echo $OPTIONS | jq -r ".[][0]" | $MENU -i -p " WebSearch:")
OBJ_SELECTED=$(echo $OBJ_MENU | cut -d' ' -f1)
OBJ_KEYWORDS=$(echo $OBJ_MENU | cut -d' ' -f2- | tr " " "+")
add_query() {
PREFIXMENU=$(echo "" | dmenu -p "Add prefix menu:" <&-)
if [ ! -z $PREFIXMENU ]; then
URLQUERY=$(echo "" | dmenu -p "Add url query:" <&-)
echo "[ \"$PREFIXMENU\", \"$URLQUERY\" ]," >> $FILE
fi
exit
}
delete_query() {
OBJ_MENU=$(echo $OPTIONS | jq -r ".[][0]" | head -n -2 | $MENU -i -p "Delete Menu:")
OBJ_SELECTED=$OBJ_MENU
if [ ! -z $OBJ_SELECTED ]; then
CONFIRM_DELETE=$(echo -e "no\nyes" | dmenu -p "Do you want to delete this url?")
if [ $CONFIRM_DELETE = "yes" ]; then
sed -i "/$OBJ_SELECTED/d" $FILE
fi
fi
exit
}
main() {
for i in $(seq 0 $((OBJ_LENGTH - 1))); do
if [ $OBJ_SELECTED = "Add:New:Query" ]; then
add_query
fi
if [ $OBJ_SELECTED = "Delete:Query" ]; then
delete_query
fi
if [ $OBJ_SELECTED = $(echo $OPTIONS | jq -r --arg i $i '.[($i|tonumber)][0]') ]; then
URLQUERY=$(echo $OPTIONS | jq -r --arg i $i '.[($i|tonumber)][1]')
KEYWORDS=$(echo $OBJ_KEYWORDS)
xdg-open "${URLQUERY}${KEYWORDS}" 2> /dev/null
fi
done
}
main
Simpan file .urlquery
di HOME direktori.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[ "Arch:Manpage", "https://man.archlinux.org/search?q=" ],
[ "Arch:Wiki", "https://wiki.archlinux.org/index.php?search=" ],
[ "Arch:Packages", "https://archlinux.org/packages/?q=" ],
[ "Arch:Packages:AUR", "https://aur.archlinux.org/packages/?K=" ],
[ "DuckDuckGo:Search", "https://duckduckgo.com/?q=" ],
[ "GitHub:Search", "https://github.com/search?q=" ],
[ "Google:Search", "https://duckduckgo.com/?q=!g+" ],
[ "Google:Search:Image", "https://duckduckgo.com/?q=!gi+" ],
[ "Google:Translate", "https://translate.google.com/?sl=auto&tl=id&text=" ],
[ "Ruby:Gems", "https://rubygems.org/search?query=" ],
[ "Ruby:Toolbox", "https://www.ruby-toolbox.com/search?q=" ],
[ "Ruby:LibHunt", "https://ruby.libhunt.com/search?query=" ],
[ "Twitter:Search", "https://twitter.com/search?q=" ],
[ "Youtube:Search", "https://www.youtube.com/results?search_query=" ],
[ "Twitch:Search", "https://www.twitch.tv/search?term=" ],
[ "NPM:Search", "https://www.npmjs.com/search?q=" ],
Penggunaan lebih lanjut saya serahkan pada imajinasi dan kreatifitas teman-teman.
Terima kasih sudah mampir yaa.
http://kb.mozillazine.org/Using_keyword_searches
Diakses tanggal: 2022/08/14
https://github.com/bandithijo/dmenu-websearch
Diakses tanggal: 2022/08/14