Penyebab pemakaian CPU 100% di VPS sudah diketahui, ternyata VS Code penyebabnya. Entah kenapa, VS Code menginstall tools nya ke VPS lalu tools inilah yang membuat server sibuk. Akhirnya saya matikan service ini secara manual lewat htop. #webkoe #problemsolved #problem #VSCode
Menu "create" telah dipoles, ada tambahan emoticon biar tidak bosan. Perbaikan posisi container, card dan footer. #webkoe #alhamdulillah
API untuk konversi crypto ke fiat https://github.com/coinconvert/crypto-convert #webkoe #crypto #cardano-project #API
Malam ini sudah berhasil mengambil data asset spesific dari API nya blockfrost lalu menampilkannya. #webkoe #cardano-project #blockfrost_io
Hari ini mulai membuat langkah demi langkah web terhubung ke wallet menjadi lebih informatif, pada saat tombol connect di klik muncul Modal berisi daftar wallet yang terinstall, lalu wallet bisa dipilih. Setelah memilih wallet, informasi prosesnya juga ditampilkan apakah walletnya valid atau tidak (Failed status). Setelah wallet valid, berikutnya dicek, apakah terdapat address yang sudah digunakan (No Data status) Dan terakhir jika walletnya valid dan terdapat address yang digunakan, maka alamat dalam format hexa dari wallet di teruskan ke endpoint /blockfrost webkoe untuk kemudian di konversi ke bech32 lalu diteruskan ke API blockfrost disisi backend. Hasil keluaran dari /blockfrost berupa JSON kemudian dikonsumsi oleh javascript client kembali untuk kemudian di render. Render asset adalah bagian yang menarik, karena ternyata blockfrost juga telah menyediakan API untuk melihat detail berdasarkan kode asset (TODO NEXT). -- awesome #webkoe #project #cardano-project #blockfrost_io #alhamdulillah
Cardano Wallet connect via chrome/browser extension sudah ditambahkan. #webkoe #cardano #project #cardano-project #cardano-wallet
webkoe bisa diakses lewat telegram, dialamat ini t.me/webkoe_bot/app #project #webkoe #telegram #webkoe-on-telegram
Mendaftarkan diri di Taptools Hackathon, dengan brief project seperti ini: I have a personal blog, and I'm planning to add a feature that can help me check my portfolio using the Taptools API. Currently I have to open my personal blog, and taptools in another browser window. I thought it would be nice to be able to do both on my blog. I think it would also be interesting if I could add a little note to every movement of my portfolio. Like a little note, that appears on the coinmarketcap chart. #project #webkoe #taptools #taptools-hackathon
Masih belum ketemu chart harga yang mudah digunakan, coba ini dulu https://www.anychart.com/download/cdn/?v=8.13.0 https://playground.anychart.com/docs/v8/samples/STOCK_Price_Indicator_02 #crypto-chart-link #webkoe #project #anychart
Pukul berapa? ini adalah waktu yang benar, setelah dilakukan restart. #webkoe
Pukul berapa? Date server salah, artinya pada saat billing tidak dibayar, server sepertinya FREEZE. #webkoe
Intersection Observer is nice. #webkoe #Javascript-Stuff #Intersection-Observer-Javascript
Chart Crypto bisa diakses di link ini Market Activity Of Indodax Chart Powered by Indodax API & Mongodb Atlas Chart #webkoe #webkoe-crypto #mongodb-atlas #indodax-API #crypto-chart-insight #crypto-chart-link #API
semua request HTTP ke webkoe.net dialihkan ke HTTPS. #webkoe #webkoe-http-https
Webkoe crypto works like a charm. Tidak menggunakan react, hanya bermain dengan Promise dan await Javascript, dan library standar jQuery. Dan beberapa trik setTimeout punya javascript bawaan juga. #alhamdulillah #webkoe #webkoe-crypto #problemsolved #problem
Rencananya akan menggunakan Reactjs untuk menangani webkoe-crypto. Render manual dengan jQuery beberapa kali gagal, dan wajar karena kodenya terlalu versi saya, bukan versi yang benar. Wkwkwkwk... Render DOM dengan React terbukti sangat efisien dan memang sudah teruji sebagai kode "yang benar". #webkoe #webkoe-crypto #webkoe-crypto-project #reactjs
Perlu menulis ulang kode crypto V2, sepertinya akan banyak bermain dengan promise dan await nya javascript. Yang dilakukan saat ini pada saat mengambil data ke API indodax, setiap data coin masih berdiri masing-masing. Misal data ADA diambil, hasilnya langsung di masukkan ke DOM ADA yang telah dibuat diawal. - Buat DOM seluruh coin, berdasarkan array code crypto - BTC data -> DOM - ADA data -> DOM - ETH data -> DOM ----> sampai sini berhasil - BTC,ADA,ETH data -> DATA ----> Failed (DATA tidak bisa dibaca, karena prosesnya tidak diketahui) Solusi yang mungkin adalah menggunakan Promise dan Await. #webkoe #webkoe-crypto-project #javascript-promise-await #todo #problem
Crypto V2 sudah ready. Todo: - Filter coin - Lihat transaksi terbesar - Status Bear/Bull untuk gabungan semua coin #webkoe #webkoe-crypto-project #todo
Mongod service set to Restart=always ini diperlukan agar setiap kali mongod di kill system, dia bisa start otomatis, menurut artikel begitu, kita lihat saja nanti. Problem solved of Mongod Killed By System #webkoe #problemsolved
Renew VPS Rumahweb Rp67.900,- sampai 11 Oktober 2024 nanti. #webkoe #rumahweb-VPS #rumahweb
Webkoe menggunakan zona waktu WIB, sejak VPS Rumahweb, bawaan defaultnya, belum disesuaikan ke WITA. #webkoe
Explore Vuejs, dengan mengikuti tutorial di W3schools. VueJS W3Schools Rencananya vue ini akan saya gunakan untuk membuat dashboard crypto yang lebih informatif dan nyaman dibaca. Mengambil API dari indodax. Project ini akan dihandle oleh link berikut ini: CryptoV3 Update 22:25 WIB - ternyata ribet, harus install nodejs dan pernak-perniknya - pending dulu aja lah #vuejs #webkoe #indodax #indodax-API
MongoDB kembali ke pangkuan Ibu Pertiwi, tidak lagi menggunakan Cluster. Ini adalah solusi dari "Kadang-kadang webkoe tidak bisa diakses" #webkoe #mongodb #problemsolved
Script google analytic sudah diperbaharui. "Data collection may take up to 48 hours to get started" Dalam 2 hari ke depan baru bisa aktif analyticsnya. #webkoe #google-analytics
Droplet Digital Ocean destroyed. Terima kasih telah melayani webkoe selama kurang lebih 8 Tahun.
#webkoe #digitalocean #rumahweb-VPS
Sepertinya migrasi ke VPS Rumahweb akan saya tunda dulu, control panelnya tidak senyaman digital ocean (DO), ini bahkan tidak bisa diakses. O iya, waktu restart nya pun tidak secepat DO. #webkoe #rumahweb-VPS #pending-migrasi #digitalocean
Sepertinya route akan dimigrasi ke GIN saja. Session Gorilla masih bermasalah, sedangkan library ini sudah tidak lagi di maintenance oleh developernya. #webkoe #problem #golang-gin
Beberapa menu sudah bisa berjalan di hosting yang baru setelah penyesuaian modul, yang masih bermasalah adalah session. 17 Agustus 2024 06:28 WIB Masalah session, pada saat awal di halaman create telah berhasil menyimpan session berupa random karakter, namun pada saat post session hilang. Hilangnya session ini kemungkinan karena perubahan menjadi modul, desain modul yang dipanggil pada setiap route baru sepertinya selalu membuat instance Store session baru; bukan menggunakan Store yang sudah ada. Solusinya yang mungkin adalah modul session dipanggil satu kali saja di main script. Setiap route baru hanya merefer ke instance Store session yang hanya dipanggil satu kali tersebut. 18 Agustus 2024 22:36 WIB Create sudah bisa, session sudah kembali normal. Menggunakan library baru, Gin. Session lama menggunakan gorilla error. #webkoe #gorilla-toolkit #gorilla-sessions #problem #problemsolved #alhamdulillah #gin-library
Nyoba VPS nya Rumahweb, 60 ribu per bulan sebelum pajak. Saya memilih lokasi server di Bogor, adem. 19:05 wib - VPS sudah bisa listen port 80, masih diakses lewat IP - Perlu menulis ulang kode, karena go tidak lagi support relative path. Banyak bermain Go Mod #rumahweb #webkoe #rumahweb-VPS
Kadang-kadang webkoe susah diakses kemungkinan karena cache di browser mobile. #webkoe #tanyakenapa #problem
Coba library ini untuk wysiwyg https://github.com/Alex-D/Trumbowyg #todo #webkoe #wysiwyg-editor-web
Berikutnya kita akan bikin textarea pada menu "Create" menjadi penuh magic... Lets do it! Idenya adalah memudahkan membuat dan mengedit catatan pada antarmuka textarea pure bawaan native browser dengan tetap mempertahankan kesederhanaan dan kecepatan (by markup saja, bukan dengan WYSIWYG editor yang saya pikir terlalu boros sumberdaya). #todo #webkoe
Domain handle dipindahkan ke cloudflare, Error #webkoe #domain-handle-migration #rumahweb #cloudflare
tag italic tidak membuat miring tulisan, ternyata karena font Mali tidak suppport italic (sepertinya). #webkoe
Error ini yang membuat tidak bisa ke halaman 11 dan seterusnya. Executor error during find command :: caused by :: Sort exceeded memory limit of 33554432 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in. Problem Solved: Ternyata solusinya mudah, cukup membuat index baru dengan memasukkan field yang dijadikan kunci sort. Dalam hal ini, paging memerlukan field "date" yang dijadikan acuan sort. Pada MongoDB Compass: 1. Buat index baru, field date dengan type -1(desc) 2. Lalu "Create Index" Selesai, dan sekarang page 11 dan seterusnya sudah bisa diakses tanpa error. #mongodb #mongodb-compass #webkoe #todo #problemsolved
Menambahkan "Read More" pada tulisan yang panjangnya melebihi yang ditentukan dengan menggunakan library readmore.js Works like a charm #webkoe #readmore-js-library
- Views of Tag, added - SEO-ing permalink, menambahkan tag pada url permalink - Permalink icon clickable added to card #webkoe
- Card dijadikan template tersendiri; - Mouseover menu pada card menjadi round biru; - Add jumlah hit/views pada card #webkoe
Antisipasi jika user menekan tombol create berkali-kali dilakukan dengan cara yang simple saja, yaitu mencek id telebih dahulu sebelum input. Cara terbaik sebenarnya adalah membuat field id menjadi unik, namun hal ini terkendala dengan data sebelumnya; banyak terdapat duplikasi id pada data lama. Yang aneh adalah, pada saat saya melakukan cleansing manual, terdapat error pada id tertentu, namun ketika id tersebut dicari, tidak ditemukan. #webkoe
Yuk bongkar kenapa post berkali-kali dengan klik cepat tombol "create", berhasil? #webkoe
Menu pada card diubah ke popup, mengikuti twitter. Warna tombol menu utama di bagian paling atas, diubah ke Biru dari sebelumnya hijau. #webkoe
Menyesuaikan menu pada Card, klik triple dot dan muncul menu transparan menutupi seluruh card. Perubahan ini hanya di menu Home, belum diterapkan ke view yang lain seperti page, tag, dan permalink. #webkoe
Membuka kembali VSCODE, menyelami script webkoe. - Routing spesifik ke domain webkoe.net saja, jika request selain domain webkoe.net maka NO RESPON. Hal ini dilakukan setelah saya menemukan hasil pencarian webkoe.net lewat edge ternyata mengarahkan ke alamat ip address webkoe, dan ternyata bisa diakses dengan IP. - Develop lewat laptop iCherry #webkoe #iCherry-kantor
Akses home bermasalah,... tidak bisa diakses, loading lama. 16:01 WIB Sudah kembali normal #webkoe #tanyakenapa
Beberapa hari yang lalu sempat down, ini kok bisa recovery sendiri ya? #webkoe #tanyakenapa
Develop snapshoot analyzer, berfungsi untuk membuat historical view dari snapshoot yang di generate saat dilakukan update Blog. [snapshoot-analyzer-data] amount 8 price 101 value 1789 #snapshoot-analyzer #snapshoot-analyze-amount-price-value #webkoe #test
Post pertama kali lewat hape dengan klik suggest untuk add Tag. #webkoe #nice #what-a-nice-day #works_like_a_charm #done
Rekap hari ini: - Masalah monitor, done; - Permalink, done; - Add Tag dengan Klik saja, done. Time to sleep... #justwritesomething #webkoe #problemsolved #msi_gf63 #monitor-aoc #aim-nft #our-nft
Kumpulan Emoji Char yang di support webkoe 🕌🎁🛠️ #🕌 #🎁 #🛠️ #emoji-char #webkoe
Rewrite model, disesuaikan dengan nama tabel saja. Format : [nama-tabel]_model Supaya tidak membingungkan. #webkoe
Upgrade ke Ubuntu 22 menyebabkan mongodb tidak kompatibel, blog setelah tanggal 15 Januari 2023 belum bisa di restore, untungnya sempat melakukan backup di Mongodb Cloud. Mongodb akhirnya tidak lagi menggunakan mongodb lokal, tapi dialihkan ke MongoDB Cloud (Free). Ada beberapa catatan menarik: - Go akhirnya menggunakan Go1.20 - MongoDB akhirnya pindah ke Cloud - Webkoe akhirnya dipaksa untuk rewrite ke kode yang lebih ter-manage dengan baik #webkoe #problem #alhamdulillah
Webkoe service no more flag; --production & --redirect 18:46 Systemctl start webkoe-web-server DONE #webkoe
Log: Webkoe dipindahkan ke nameserver cloudflare, menggunakan SSL bawaan cloudflare. Registrasi domain masih di rumahweb. Note: service path: /etc/systemd/system command: systemctl restart webkoe-web-server #webkoe #rumahweb #cloudflare #migrasi-nameserver #webkoe-service
wget -qO- https://repos-droplet.digitalocean.com/install.sh | sudo bash #webkoe
{\__/} (●_●) ( >🌮 Want a taco? Ternyata menarik juga....wakwakwak #webkoe #ascii-emoticon #nice
Webkoe is up, beberapa hari yang lalu tidak bisa diakses karena setting ip DNS di rumahweb merujuk ke alamat ip tidak dikenal. Solusinya adalah mengembalikan seting ke alamat VPS yang benar. --> ping webkoe.net PING webkoe.net (206.189.42.180) 56(84) bytes of data. 64 bytes from forward-app.vps.mysrsx.net (206.189.42.180): icmp_seq=1 ttl=62 time=0.697 ms 64 bytes from forward-app.vps.mysrsx.net (206.189.42.180): icmp_seq=2 ttl=62 time=0.887 ms --> 206.189.42.180 IP TIDAK DIKENAL ⊂_ヽ \\ \( ͡° ͜ʖ ͡°) > ⌒ヽ / へ\ / / \\ レ ノ ヽ_つ / / / /| ( (ヽ | |、\ | 丿 \ ⌒) | | ) / ノ ) Lノ (_/ #webkoe #problem #problemsolved #tanyakenapa
Sejak chrome desktop update ke versi 100, fetch ajax ke indodax jadi ter-affected CORS policy. Browser memblock akses ke sumber dengan nama berbeda, webkoe.net ke indodax.com. Ternyata bukan cuma webkoe, banyak web yang saya akses gagal load karena tersandung policy baru ini. Saya pikir hanya berlaku pada google chrome, setelah saya coba dengan browser lain, sama. Brave, Edge, dan Opera. Untungnya blok belum berlaku pada chrome android, akses ke webkoe crypto lewat chrome android masih bisa dilakukan, sepertinya hanya menunggu waktu saja untuk chrome android turut mengimplementasikan policy baru CORS nya ini. Oya, saat menginstall brave jadi berkenalan dengan BAT nya. Brave browser build in wallet, yang mana user akan dapat koin BAT pada saat click ads yang mereka sediakan. -- update 6 April 2022 12:45 Saat diakses dari PC kantor, dengan Chrome 100 dan Brave, lancar jaya, tidak ada isu CORS. Tanya kenapa ?? #webkoe #cors-issue #google-chrome #brave-browser #BAT-coin #crypto #nice #tanyakenapa
Crypto watcher add shortcut ke beberapa koin 🔧🔧🔧 #crypto-watcher #webkoe
Nyoba mongodb di Amazon Web Service (AWS) - nyoba yang free dulu - sudah berhasil bikin database - nyoba connect dari webkoe ke aws (... progress) 14:38 - Ternyata lebih murah mongodb cluster di digitalocean. AWS $0.09/jam sedangkan DO $0.02/jam. Belum bicara tentang spek, masih tentang harga termurah yang ditawarkan. #webkoe #AWS #mongodb #digitalocean
Cek harga crypto cardano realtime di indodax bisa disini https://webkoe.net/crypto untuk custom jenis kripto yang lain bisa tambahkan parameter tambahan, contoh: https://webkoe.net/crypto/btcidr untuk cek harga BTC sumber: indodax api #cardano #crypto #crypto-watcher #webkoe #indodax
- FTP sudah bisa diakses - Sempat bingung kenapa error saat nyoba build, syukurlah solusinya kemarin sudah dicatat dengan baik Errornya seperti ini : server.go:23:2: no required module provides package github.com/gorilla/mux: go.mod file not found in current directory or any parent directory; see 'go help modules' Jalankan perintah ini sebelum go run / go build : go env -w GO111MODULE=auto Sumber : https://go.dev/blog/go116-module-changes #golang #webkoe
5 💎 = 900 20💎 = 2.900 50💎 = 6.800 70💎 = 9.200 100💎 = 13.600 tambahkan tag PRE supaya bagus hasilnya :) #webkoe
Kemungkinan domain akan dipindahkan ke cloudflare saja, lebih banyak fiturnya. ----- Domain tetap di rumahweb saja, ada kedekatan emosional saya dan rumahweb, niat pindah domain ke cloudflare pun akhirnya saya urungkan. ❤️ rumahweb.com #webkoe #rumahweb #cloudflare
Seseorang atau sesuatu mempost tanpa tulisan ke webkoe. Enam tulisan kosong sekaligus dengan waktu yang bersamaan. #webkoe
Adding screenshoot_date_created - edit 1 11:40 Screenshoot_date_created ADDED #webkoe #webkoe-on-develop
Dan tanpa saya sadari, timezone server masih belum sesuai... besok lah, sudah malam ini seharusnya 23/01/2020 00:25 AM --- 23/01/2020 00.46 AM --- Tidak perlu menunggu besok, ternyata settingnya mudah saja #webkoe
PRE markup automatically ADDED ke textarea, untuk memudahkan create tulisan. #webkoe
Snapshoot tulisan sebelum dilakukan edit --> ADDED snapshoot ini sebagai history tulisan sebelumnya, untuk menghindari kesalahan edit atau bahasa kerennya SOFT EDIT. #webkoe #alhamdulillah
Tahun 2020 ini, webkoe sudah berhasil upgrade ke Ubuntu 18 dan otomatis ke python 3 #webkoe #ubuntu #ubuntu18 #python3 #alhamdulillah
Prepare for upgrade ... - Ubuntu ke Ubuntu 18 - Python ke Python 3 Kemungkinan akan dilakukan destroy droplet, lalu membuat droplet yang baru. #webkoe
Webkoe certificate renewed, berlaku sampai 25 Februari 2020. Terima kasih kepada letsencrypt. #letsencrypt #webkoe
Hallo kolom kecil ku, apa kabar? terlalu banyak kejadian, pikir, dan semacamnya berkelebatan silih berganti di benak ini. Ingin ku tulis satu per satu, tapi sepertinya hanya akan memenuhi ruang saja. Maka dari itu, aku tuliskan ini. Hanya sekedar ingin saja, bukan bermaksud menuangkan kelebatan itu. Kolom kecilku, terima kasih telah menemaniku selama ini. Kamu hanya kolom, dan aku hanya suka menulisimu. Sesederhana itu saja,... #webkoe #justwritesomething
Utak atik modem indihome kontrakan supaya aplikasi dilaptop bisa diakses dari internet =========================== Modem indihome bisa diakses di ip lokal 192.168.100.1, atau kalo mau lebih yakin bisa dilihat lewat "ipconfig", biasanya modem induk nangkring di nomor 1. Account defaultnya "Admin" dan password defaultnya "admin". - Aplikasi web laptop berjalan di port 9090 =========================== Case 1 : Mengakses aplikasi laptop di jaringan modem saja - Laptop (server aplikasi) terhubung ke wifi indihome (DHCP) - Handphone (client) terhubung ke wifi indihome (DHCP) Hasil DHCP: - Laptop ip 192.168.100.6 (port 9090 forwarding ke 9090 juga) - HP tidak saya cek result: HP dapat mengakses aplikasi web di laptop dengan lancar tentunya di port alamat http://192.168.100.6:9090 Case 2 : Mengakses aplikasi laptop lewat internet - Laptop (server aplikasi) terhubung ke wifi indihome (DHCP) - Handphone (client) terhubung ke GSM Cari tau berapa ip public modem indihome saat itu, tinggal ketik di pencarian google "what is my ip". Setelah ketemu ip modem indihome, berikutnya tinggal akses ip tersebut lewat HP yang terhubung ke GSM Result: HP dapat mengakses aplikasi web di laptop dengan lancar tentunya di port alamat http://36.75.19.66:9090 Case 3 : Mengakses aplikasi laptop (static IP) di jaringan modem Laptop terhubung ke modem dengan cara DHCP, artinya IP yang diberikan ke laptop random. Ini akan bermasalah saat port forwarding, karena port forwarding menggunakan ip static/tetap. Saya ingin laptop selalu berIP 192.168.100.2 (misalnya). Pemberian static IP bisa dilakukan dengan mendaftarkan Mac Address laptop ke modem, cara ini memungkinkan laptop selalu didaftarkan modem dengan IP yang static, misal 192.168.100.2 tadi. Result: Saya coba putuskan laptop dari wifi modem, lalu nyalakan lagi, setelah saya cek dengan ipconfig, IP laptop didaftarkan dengan ip yang saya inginkan, yakni ip 192.168.100.2 Case 4 : Mengakses aplikasi laptop di jaringan internet IP public yang dimiliki modem indihome salalu berubah ketika kita nyala/matikan. Saat kita berada di jaringan modem indihome, mudah bagi kita untuk mengetahui ip public yang sedang kita gunakan. Bagaimana ketika kita ingin mengaksesnya dari luar jaringan modem indihome? Ada salah satu solusi untuk hal ini, yakni dengan mendaftarkan nomor indihome kita ke ip-dynamic.com, situs ini memungkinkan kita untuk tahu berapa ip public yang sedang digunakan oleh modem indihome kita walaupun tidak berada didalam jaringan modem indihome. Result: Tanpa harus tahu berapa ip public modem indihome, saya bisa akses aplikasi web di laptop dengan alamat 162222202752.ip-dynamic.com:9090#project #indihome #webkoe #aplikasi #nice #port-forwarding-indihome #modem-indihome #ip-dynamic
Masih kepikiran godaan bikin droplet baru dengan space 25GB dan RAM 1GB, harga tetap $5/month. Waaww... mayan nambah 5GB. #digitalocean #improvement #webkoe
-Install certbot -certbot certonly -d webkoe.net -sesuaikan /etc/nginx/conf.d/default.conf dengan lokasi sertifikat yang baru (misal: /etc/letsencrypt/live/webkoe.net-0002/...)#webkoe #letsencrypt
Masalah: navigator.serviceWorker.controller selalu null Kemungkinan: service_worker.js tidak berada di root Solusi: Taro service_worker.js di root (Lol) http://stackoverflow.com/questions/30256390/navigator-serviceworker-controller-is-always-null Sekarang sudah bisa berkomunikasi dengan service worker,... XD tinggal di test saat chrome tidak aktif,... lets check it out#webkoe #pushmessage #problemsolved #alhamdulillah
C:\Users\luqman baihaqi>curl --header "Authorization: key=AIzaSyAhhhFjJGhA0q0CgmZMVQzuV9I-cRLTCiA" --header "Content-Type: application/json" https://android.googleapis.com/gcm/send -d "{\"to\":\"ca1CvrW69kQ:APA91bGi_Ue4kyVPkQp86ZJoLzSx_OH9r-bzCQAse28QP1ucsTgadHmCwpTWOlDYnjELhDD_SGO9Mhm_zKyr-qQbuBCCy_GQJ5GHLSU8-8RKIO9ypx8omi_tPSUG7RUXK9nNgyOi46ek\", \"notification\":{\"title\":\"my title\",\"body\":\"the messages\",\"icon\":\"/static/custom/images/turtle.ico\", \"color\":\"#fff2ae\",\"click_action\":\"com.google.android.apps.chrome.Main\"}}" -k
https://developers.google.com/cloud-messaging/concept-options https://developers.google.com/cloud-messaging/concept-options#common-message-options https://developers.google.com/cloud-messaging/http-server-ref#priority1. Bagaimana saat notification payload di click, mengarah ke url yang diinginkan. Sampai sejauh ini, click tidak bereaksi apa2. 2. Tetap harus nyari cara supaya data bisa dikirim ke service worker....#webkoe
root@webkoe:~# curl --header "Authorization: key=AIzaSyAhhhFjJGhA0q0CgmZMVQzuV9I-cRLTCiA" --header "Content-Type: application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"fYRp7auRigk:APA91bG9fVhvjkicr8Wp2S2UGN-m9xzysnkvgL4PUx6KQR4UREriCaPutWXtxug8pulxJqZyJc8sW5SkG822F1uDpq7flJBqk9BkvCM45_ptQHFtI765Syr_Ev3RmIjFpVAV8wCzRTx7\"]}" #googleapi #webkoe #API
Roadmap kedepan : - Famtree - Push Message - Chat/Conference webbase#webkoe
We've had to reboot your Droplet due to an issue on the underlying physical node where the Droplet runs. We are investigating the health of the physical node to determine whether this was a single incident or systemic. If you have any questions related to this issue, please send us a ticket. https://cloud.digitalocean.com/support Droplet Details- webkoe 128.199.226.18 sgp1 Happy coding, DigitalOcean#webkoe #tanyakenapa
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-24-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Thu Oct 8 00:05:29 WITA 2015 System load: 0.13 Processes: 71 Usage of /: 25.3% of 19.56GB Users logged in: 0 Memory usage: 21% IP address for eth0: 128.199.226.18 Swap usage: 2% Graph this data and manage this system at: https://landscape.canonical.com/ 51 packages can be updated. 14 updates are security updates. Last login: Thu Oct 8 00:05:29 2015 from 114.4.78.197 luqman@webkoe:~$ su Password: root@webkoe:/home/luqman##webkoe #linux #command_line
Tag suggest lumayan informatif, lumayan menambah semangat juga buat nge-post terus, apalagi kalo bisa tap langsung add 30 januari 2024 Tap tag suggest langsung add ke textarea sudah bisa saat create tulisan, alhamdulilah works like a charm. #webkoe #todo #done #works_like_a_charm
func safehtml(text string) template.HTML { text = text + " " text = strings.Replace(text, "<", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "dan ini yang memanggil", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }", -1) text = strings.Replace(text, "", "
func WkListHandler(w http.ResponseWriter, r *http.Request) { funcMap := template.FuncMap{ "safehtml": safehtml , } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles(templatePath + "webkoe-base.html", templatePath + "webkoe-list.html")) var results []Blog err = MCol.Find(bson.M{}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } // var finalResult []tagView // fmt.Println(reflect.TypeOf(results)) err := templates.ExecuteTemplate(w, "base", results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }#script #webkoe #go #enlightenment #nice
- Bikin file .conf baru di /etc/init - Ketikkan perintahnya, misalnya service untuk server-gorilla # /etc/init/server-gorilla.conf start on filesystem or runlevel [2345] stop on runlevel [06] script exec /go-app/webkoe/server-gorilla end script - lalu SAVE - untuk start service cukup dengan perintah "service server-gorilla start" - untuk stop servicenya "service server-gorilla stop"dengan upstrat memory lebih ringan, ketimbang menggunakan forever ... dan lagi upstart bisa melakukan exec sepuasnya, bahkan seperti contoh .conf diatas tadi, upstart menjalankan executable file ... #nice bukan ? #webkoe #script #enlightenment
Ane awalnya rumit sekali mikirnya ... syukurlah ketemu link ini http://stackoverflow.com/questions/17306358/golang-removing-fields-from-struct-or-hiding-them-in-json-response Ternyata cukup serahkan pada map[string]interface{}, sudah bisa kirim variable apapun, sepuasnya ke templates func WkTagViewHandler(w http.ResponseWriter, r *http.Request) { tagName := mux.Vars(r)["tag"] funcMap := template.FuncMap{ "safehtml": func(text string) template.HTML { text = text + " " text = strings.Replace(text, "&#60;", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "#webkoe #go #script", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }, } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles(templatePath + "webkoe-base.html", templatePath + "webkoe-tagview.html")) var results []Blog err = MCol.Find(bson.M{"tag": tagName}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } finalResult := map[string]interface{}{ "tagName" : tagName, "tagList" : results, } err := templates.ExecuteTemplate(w, "base", finalResult) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }", -1) text = strings.Replace(text, "", "
package main import ( "fmt" "github.com/gorilla/mux" "github.com/gorilla/sessions" "github.com/fzzy/radix/redis" "net" "net/http" "html/template" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "regexp" "strings" "crypto/rand" "time" // "reflect" ) var ( // MongoDB mongoConfig = "mongodb://***usermongo***:***passmongo***@localhost:***portmongo***/***dbmongo***" MongoSession, err = mgo.Dial(mongoConfig) MDB = MongoSession.DB("admin") MCol = MDB.C("blog") // Session store = sessions.NewCookieStore([]byte("something-very-secret")) // Tag Factory tagPattern = "#([a-z]|[A-Z])+" ) type Blog struct { Id string Things string Date string Ip string Agent string Tag []string } // type tagView struct { // tagName string // tagList []main.Blog // } func WkHomeHandler(w http.ResponseWriter, r *http.Request) { err := template.Must(template.ParseFiles("templates/webkoe-home.html")).Execute(w, nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkTagViewHandler(w http.ResponseWriter, r *http.Request) { tagName := mux.Vars(r)["tag"] funcMap := template.FuncMap{ "safehtml": func(text string) template.HTML { text = text + " " text = strings.Replace(text, "&&#35;60;", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "#script #go #webkoe", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }, } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/webkoe-base.html", "templates/webkoe-tagview.html")) var results []Blog err = MCol.Find(bson.M{"tag": tagName}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } err := templates.ExecuteTemplate(w, "base", results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkCreateHandler(w http.ResponseWriter, r *http.Request) { blog_id := randStr(7, "alphanum") session, _ := store.Get(r, "session-name") session.Values["blog_id"] = blog_id session.Save(r, w) templates := template.Must(template.New("").ParseFiles("templates/webkoe-base.html", "templates/webkoe-create.html")) err := templates.ExecuteTemplate(w, "base", blog_id) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkPostCreateHandler(w http.ResponseWriter, r *http.Request) { things := r.FormValue("things") thingsWithSpace := things + " " captcha := r.FormValue("captcha") session,_ := store.Get(r, "session-name") blog_id := fmt.Sprintf("%s", session.Values["blog_id"]) if things != "" { if captcha == blog_id { // Factory cariTag,_ := regexp.Compile(tagPattern) tagFound := cariTag.FindAllString(thingsWithSpace, -1) var tempTags []string for _, value := range tagFound { cleanRegex,_ := regexp.Compile("(#| )") cleanTag := cleanRegex.ReplaceAllString(value, "") tempTags = append(tempTags, cleanTag) } waktu := strings.Split(fmt.Sprint(time.Now()), ".")[0] ip := GetIP(r) agent := fmt.Sprint(r.Header["User-Agent"]) jsonBlog := &Blog{Id: blog_id, Things: things, Date: waktu, Ip: ip, Agent: agent, Tag: tempTags} err = MCol.Insert(jsonBlog) fmt.Println("Welcome, " + things + " " + thingsWithSpace) http.Redirect(w, r, "/#thanks", 301) }else{ fmt.Println("Robot ?") http.Redirect(w, r, "/#you_r_a_bots", 301) } }else{ http.Redirect(w, r, "/#empty", 301) } // fmt.Println("Someone POST " + things + " blog_id " + blog_id) // fmt.Println(blog_id) /* templates := template.Must(template.New("").ParseFiles("templates/webkoe-base.html", "templates/webkoe-create.html")) err := templates.ExecuteTemplate(w, "base", nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } */ } func WkListHandler(w http.ResponseWriter, r *http.Request) { funcMap := template.FuncMap{ "safehtml": func(text string) template.HTML { text = text + " " text = strings.Replace(text, "<", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "", -1) text = strings.Replace(text, "", "", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }, } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/webkoe-base.html", "templates/webkoe-list.html")) var results []Blog err = MCol.Find(bson.M{}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } // var finalResult []tagView // fmt.Println(reflect.TypeOf(results)) err := templates.ExecuteTemplate(w, "base", results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func CatatanHomeHandler(w http.ResponseWriter, r *http.Request) { var results []Blog err = MCol.Find(bson.M{}).Sort("-date").Limit(100).All(&results) if err != nil { panic(err) } err := template.Must(template.ParseFiles("templates/gorilla-catatanhome.html")).Execute(w, results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func HomeWKSHandler(w http.ResponseWriter, r *http.Request) { err := template.Must(template.ParseFiles("templates/gorilla-home_wks.html")).Execute(w, nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkBlogHandler(w http.ResponseWriter, r *http.Request) { page := mux.Vars(r)["page"] err := template.Must(template.ParseFiles("templates/gorilla-blog.html")).Execute(w, map[string]string{"halaman": page}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkRedisHandler(w http.ResponseWriter, r *http.Request) { // redis redisClient, _ := redis.Dial("tcp", "localhost:6379") news, _ := redisClient.Cmd("zrevrangebyscore", "news:republika:posttime", "+inf", "-inf", "limit", "0", "3").List() var bundleNews []string for _, elemStr := range news { bundleNews = append(bundleNews, elemStr) fmt.Println(bundleNews) } // render err := template.Must(template.ParseFiles("templates/gorilla-redis.html")).Execute(w, bundleNews) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkTestPassVarHandler(w http.ResponseWriter, r *http.Request) { err := template.Must(template.ParseFiles("templates/gorilla-blog.html")).Execute(w, map[string]string{"halaman": "2"}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func randStr(strSize int, randType string) string { var dictionary string if randType == "alphanum" { dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "alpha" { dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "number" { dictionary = "0123456789" } var bytes = make([]byte, strSize) rand.Read(bytes) for k, v := range bytes { bytes[k] = dictionary[v%byte(len(dictionary))] } return string(bytes) } func GetIP(r *http.Request) string { if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 { return ipProxy } ip, _, _ := net.SplitHostPort(r.RemoteAddr) return ip } func main() { // MUX ROUTER mx := mux.NewRouter() // WEBKOE.NET // *** home *** mx.HandleFunc("/", WkListHandler).Host("webkoe.net") // *** tag *** mx.HandleFunc("/tag/{tag}", WkTagViewHandler).Host("webkoe.net").Methods("GET") // *** create *** mx.HandleFunc("/create", WkCreateHandler).Host("webkoe.net").Methods("GET") mx.HandleFunc("/create", WkPostCreateHandler).Host("webkoe.net").Methods("POST") // *** misc *** mx.HandleFunc("/test/pass_var", WkTestPassVarHandler).Host("webkoe.net") mx.HandleFunc("/redis", WkRedisHandler).Host("webkoe.net") mx.HandleFunc("/page/{page}", WkBlogHandler).Host("webkoe.net") mx.PathPrefix("/").Handler(http.FileServer(http.Dir("./public/"))).Host("webkoe.net") // CATATAN.WEBKOE.NET mx.HandleFunc("/", CatatanHomeHandler).Host("catatan.webkoe.net") // WEBKANSAJA.COM mx.HandleFunc("/", HomeWKSHandler).Host("webkansaja.com") http.ListenAndServe(":80", mx) }", -1) text = strings.Replace(text, "", "
package main import ( "github.com/go-martini/martini" "github.com/martini-contrib/render" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "net" "net/http" "fmt" "time" "crypto/rand" "strings" "regexp" ) // local var mongoConfig = "127.0.0.1:27017" var blogCollection = "webkoe_blog" var hostHome = "localhost:8080" var hostCatatan = "catatan" // webkoe // var mongoConfig = "mongodb://usermongo:passmongo@localhost:portmongo/dbmongo" // var blogCollection = "blog" // var hostHome = "webkoe.net:8080" // var hostCatatan = "catatan.webkoe.net" type Blog struct { Id string Things string Date string Ip string Agent string Tag []string } func GetIP(r *http.Request) string { if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 { return ipProxy } ip, _, _ := net.SplitHostPort(r.RemoteAddr) return ip } func randStr(strSize int, randType string) string { var dictionary string if randType == "alphanum" { dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "alpha" { dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "number" { dictionary = "0123456789" } var bytes = make([]byte, strSize) rand.Read(bytes) for k, v := range bytes { bytes[k] = dictionary[v%byte(len(dictionary))] } return string(bytes) } func main() { // MARTINI m := martini.Classic() m.Use(render.Renderer(render.Options{ Layout: "layout", })) // MONGODB session, err := mgo.Dial(mongoConfig) if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) webkoe_blog := session.DB("admin").C(blogCollection) // ROUTER m.Get("/", func(r render.Render, req *http.Request) { if req.Host == hostHome { r.HTML(200, "home", req.Host) }else if req.Host == hostCatatan { r.HTML(200, "home-catatan", req.Host) } }) m.Get("/blog", func(r render.Render) { var results []Blog err = webkoe_blog.Find(bson.M{}).Sort("-date").Limit(100).All(&results) if err != nil { panic(err) } // fmt.Println(results) r.HTML(200, "blog", results) }) m.Post("/blog", func(req *http.Request, r render.Render){ things := req.FormValue("things") + " " // tag regex, err := regexp.Compile("#([a-z])+ ") remove, err := regexp.Compile("(#| )") tags := regex.FindAllString(things, -1) // fmt.Println(tags) // modify semua listA var modTags []string for _, value := range tags { final := remove.ReplaceAllString(value, "") modTags = append(modTags, final) } // fmt.Println(modTags) waktu := strings.Split(fmt.Sprint(time.Now()), ".")[0] blog_id := randStr(7, "alphanum") ip := GetIP(req) agent := fmt.Sprint(req.Header["User-Agent"]) jsonBlog := &Blog{Id: blog_id, Things: things, Date: waktu, Ip: ip, Agent: agent, Tag: modTags} err = webkoe_blog.Insert(jsonBlog) if err != nil { panic(err) } // fmt.Println(agent) r.Redirect("/blog") }) m.Get("/blog/write", func(r render.Render) { r.HTML(200, "blog-form", nil) }) m.RunOnAddr(":8080") }
20141111161321 66.249.65.137 http://catatan.webkoe.net/page/10952 (REF) undefined Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)ngapain ke halaman 10952 ? #webkoe
def grab(list,label) : parameter = ["curl","-H","User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0 FirePHP/0.7.4","--max-time", "1000", "--write-out", "%{http_code}", "--silent"] for l in list : parameter.append(l) default_code = "000" reconnect = "" proc = subprocess.Popen(parameter,stdout=subprocess.PIPE) (out, err) = proc.communicate() print label ''' while default_code != "200" : proc = subprocess.Popen(parameter,stdout=subprocess.PIPE) (out, err) = proc.communicate() if str(out) == "200" : default_code = "200" # OK info = "OK" elif str(out) == "000" : info = "FAIL" reconnect = "reconnect" elif str(out) == "302" : info = "REDIRECT" reconnect = "reconnect" else : info = "..." reconnect = "reconnect" print label + ": " + str(out) + " " + info + " " + reconnect '''#webkoe #script #python
var _date = replies[a].date var date = new Date(_date) var newdate = date.getDay() var namaBulan = {} namaBulan[0] = "Minggu" namaBulan[1] = "Senin" namaBulan[2] = "Selasa" namaBulan[3] = "Rabu" namaBulan[4] = "Kamis" namaBulan[5] = "Jumat" namaBulan[6] = "Sabtu" replies[a].date = namaBulan[newdate] + " " + _date#script #webkoe
webkoe's stream now using redis --- 22/01/2020 --- webkoe meninggalkan redis karena sangat membebani RAM #redis #webkoe #missioncompleted