Senin, 20 Maret 2023

Calculate bounding box coordinate using php

saya punya kordinat "-6.9788295,107.6333703", buat perhitungan menggunakan php untuk membuat kotak yang mengelilingi kordinat tersebut, sehingga akan menghasilkan 4 buah kordinat, dimana titik tengah nya "-6.9788295,107.6333703", buat jarak antar sisi berjarak 5 meter


<?php $lat = -6.9788295; // latitude $lng = 107.6333703; // longitude $distance = 5; // jarak antar sisi dalam meter // konversi jarak antar sisi dari meter ke derajat $distance_lat = $distance / 111111; // 1 derajat latitude = 111.111 meter $distance_lng = $distance / (111111 * cos(deg2rad($lat))); // 1 derajat longitude berbeda-beda tergantung pada lintangnya // hitung koordinat titik sudut kotak $northwest_lat = $lat + $distance_lat; $northwest_lng = $lng - $distance_lng; $southeast_lat = $lat - $distance_lat; $southeast_lng = $lng + $distance_lng; // tampilkan hasil echo "Titik Tengah: $lat, $lng<br>"; echo "Jarak antar sisi: $distance meter<br>"; echo "Koordinat kotak:<br>"; echo "($northwest_lat, $northwest_lng)<br>"; echo "($northwest_lat, $southeast_lng)<br>"; echo "($southeast_lat, $southeast_lng)<br>"; echo "($southeast_lat, $northwest_lng)<br>"; ?>



Kamis, 02 Maret 2023

Mengambil data snmp menggunakan python pysnmp

 Instal pysnmp

pip install pysnmp

Buat file receiver snmp (file ini hanya dapat menerima snmp versi 1 dan versi 2c)

snmp_receiver.py

from pysnmp.hlapi import *
from pysnmp.entity.rfc3413 import ntfrcv
from pysnmp.entity import engine, config
from pysnmp.carrier.asyncore.dgram import udp
import time
import os


# Fungsi untuk menangani notifikasi SNMP Trap
def handle_trap(snmp_engine, state_reference, context_engine_id, context_name, var_binds, cb_ctx):
# Loop melalui semua variable bindings
# open file snmp_trap.txt
with open('snmp_trap.txt', 'a') as f:
for var_bind in var_binds:
oid, value = var_bind
timestamp = int(time.time())

# simpan file snmp ke log snmp_trap.txt
f.write(f"OID: {oid.prettyPrint()}, value: {value.prettyPrint()}\n")

print(f"OID: {oid.prettyPrint()}, value: {value.prettyPrint()}")


def main():
# jika file snmp_trap.txt tidak ada, maka buat
if not os.path.isfile('snmp_trap.txt'):
open('snmp_trap.txt', 'w').close()

# Inisialisasi engine SNMP
snmp_engine = SnmpEngine()
community_name = 'my-community'
# 0.0.0.0 untuk mengambil data dari semua device
device_ip = '0.0.0.0'

# Inisialisasi handler SNMP Trap
trap_receiver = ntfrcv.NotificationReceiver(snmp_engine, handle_trap)

# Konfigurasi handler SNMP Trap
# 162 merupakan port default snmp
config.addTransport(
snmp_engine,
udp.domainName + (1,),
udp.UdpTransport().openServerMode((device_ip, 162))
)
config.addV1System(snmp_engine, community_name, community_name)


# Jalankan modul penerima SNMP Trap
snmp_engine.transportDispatcher.jobStarted(1)

try:
snmp_engine.transportDispatcher.runDispatcher()
finally:
snmp_engine.transportDispatcher.closeDispatcher()


if __name__ == '__main__':
main()

Buat kode untuk testing mengirim snmp

from pysnmp.hlapi import *

# membuat varbind untuk SNMP trap
# set oid = 1.3.6.1.2.1.31.1.1.1.6
# set string value yang berisi Traps
var_binds = [
('1.3.6.1.2.1.31.1.1.1.6', OctetString('Traps')),
]

# sesuaikan dengan server agent kalian
server_ip = 'localhost'

# mengirimkan SNMP trap
errorIndication, errorStatus, errorIndex, varBinds = next(
sendNotification(
SnmpEngine(),
CommunityData('my-community', mpModel=0),
UdpTransportTarget((server_ip, 162)),
ContextData(),
'trap',
NotificationType(
ObjectIdentity('SNMPv2-MIB', 'coldStart')
).addVarBinds(*var_binds)
)
)

# menampilkan hasil
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex)-1] or '?'))
else:
print('SNMP trap berhasil dikirim')

Jika ingin menjalankan background service file receiver di linux bisa menggunakan nohup:

nohup python3 snmp_receiver.py &

jika ingin melihat id dari service snmp_receiver, bisa menggunakan perintah:

ps aux | grep snmp_receiver.py

Jika ingin menghentikan background service bisa menggunakan:

kill 54626

54626 adalah pid dari service, yang didapatkan melalui ps aux diatas.

Rabu, 01 Maret 2023

Mengambil jarak dalam radius menggunakan sql (Retrieval of distances in a radius using sql)

Satuan Meter

Sebagai informasi, 1 derajat (decimal degree) setara dengan sekitar 111,12 kilometer pada lingkaran khatulistiwa bumi. Oleh karena itu, untuk menghitung radius dalam derajat, perlu dilakukan konversi dari meter ke derajat dengan rumus:

1 meter = 1 / (111,12 km) = 0.000008983 derajat

Untuk menghitung radius dalam derajat yang setara dengan 5 meter, perlu dikalikan dengan nilai tersebut sehingga diperoleh:

5 meter * 0.000008983 derajat/meter = 0.000044915 derajat

Sehingga query untuk mengambil data dalam radius 5 meter pada MySQL adalah sebagai berikut:

SELECT * FROM locations WHERE SQRT(POW((latitude — (-6.7175274)), 2) + POW((longitude — (108.2801614)), 2)) <= 0.000044915


Satuan Kilometer

Untuk menghitung radius dalam derajat yang setara dengan 1 kilometer, perlu dikalikan dengan nilai tersebut sehingga diperoleh:

1 kilometer * 0.008983 derajat/kilometer = 0.008983 derajat

Sehingga query untuk mengambil data dalam radius 1 kilometer pada MySQL adalah sebagai berikut:

SELECT * FROM locations WHERE SQRT(POW((latitude — (-6.7175274)), 2) + POW((longitude — (108.2801614)), 2)) <= 0.008983


Asumsi bahwa 1 derajat (dalam konteks garis lintang atau garis bujur) sama dengan sekitar 111,319 km didasarkan pada perhitungan sirkumferensi Bumi yang merupakan jarak yang ditempuh jika berjalan mengelilingi Bumi pada garis lintang atau garis bujur yang sama.

Sirkumferensi Bumi adalah sekitar 40.075 km pada khatulistiwa dan semakin ke arah kutub, jaraknya semakin pendek. Oleh karena itu, jarak satu derajat pada garis lintang atau garis bujur akan berbeda-beda tergantung pada letaknya di Bumi.

Perhitungan 1 derajat sama dengan sekitar 111,319 km berasal dari perhitungan sederhana, yaitu 360 derajat dalam satu lingkaran yang jika dikalikan dengan sirkumferensi Bumi (40.075 km) maka didapatkan hasil sekitar 40.075 km x 360 derajat = 14.400.900 km. Jika dibagi dengan 360 derajat, maka didapatkan hasil sekitar 40.075 km / 360 derajat = 111,319 km per derajat.


How to install air (golang hot reload)

  1.  go install github.com/cosmtrek/air@latest
  2. add bin path to system environmet, like this is 
  3. check air -v
  4. air init
  5. air

source: https://github.com/cosmtrek/air#installation