Akhal


Change key pair for ec2 instance

Cara pertama

  1. Buka EC2 console.
  2. Pada menu NETWORK & SECURITY, pilih “Key Pairs”, kemudian klik Create Key Pair.
  3. Setelah pem file di-download, jalankan command berikut:
    ssh-keygen -f  YOURKEY.pem -y
  4. Simpan output dengan nama file authorized_keys.
  5. Simpan file authorized_keys di ~/.ssh/authorized_keys

Cara kedua

  1. Buka EC2 console.
  2. Pada menu NETWORK & SECURITY, pilih “Key Pairs”, kemudian klik Create Key Pair.
  3. Setelah pem file di-download,  upload pem file, kemudian jalankan command berikut:
    chmod 600 YOURKEY.pem
    ssh-keygen -f YOURKEY.pem -y >> ~/.ssh/authorized_keys

Get last n records pada MySQL

Untuk n records dapat menggunakan LIMIT pada query.

SELECT * FROM mytable
WHERE TIME(timecolumn) BETWEEN '10:20' and '11:20'
ORDER BY id DESC
LIMIT 10;

Let’s Encrypt & Apache pada Ubuntu 16.04

Let’s Encrypt merupakan open Certificate Authority yang bersifat gratis. Layanan ini The service disediakan oleh Internet Security Research Group.

Let’s Encrypt Client/Certbot

Certbot adalah istilah untuk client yang digunakan untuk mengatur Let’s Encrypt certificates pada server.

Certbot on Ubuntu 16.04 Xenial

Pada ubuntu, package untuk certbot menggunakan nama python-letsencrypt-apache. Ketik command berikut install:

sudo apt-get install python-letsencrypt-apache

Set Up a New Cert: Apache

Sebelum menjalankan Certbot, jangan lupa untuk membuka port yang digunakan. Untuk menjalankan Certbot/Letsencrypt, jalankan command berikut kemudian ikuti langkah-langkah yang ditunjukkan pada dialog info.

sudo letsencrypt --apache

Daftar domain yang muncul berdasarkan konfigurasi pada /etc/apache2/sites-available

Renew Certificate

Test renewal:

letsencrypt renew --dry-run --agree-tos

Jika berhasil, jalankan command berikut:

letsencrypt renew --agree-tos

let’s Encrypt menyarankan menjalankan script ini dua kali sehari sebagai cron job. Sertifikat dari let’s Encrypt berlaku selama 90 hari. Renewal tidak akan dilakukan kecuali sertifikat mendekati expiry date.


Delete Vertex pada Google Map

Berikut adalah contoh program untuk delete vertex pada google map.

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Deleting a vertex</title>
    <style>
      /* Always set the map height explicitly to define the size of the div
       * element that contains the map. */
      #map {
        height: 100%;
      }
      /* Optional: Makes the sample page fill the window. */
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      .delete-menu {
        position: absolute;
        background: white;
        padding: 3px;
        color: #666;
        font-weight: bold;
        border: 1px solid #999;
        font-family: sans-serif;
        font-size: 12px;
        box-shadow: 1px 3px 3px rgba(0, 0, 0, .3);
        margin-top: -10px;
        margin-left: 10px;
        cursor: pointer;
      }
      .delete-menu:hover {
        background: #eee;
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
    <script>
      function initialize() {
        var mapOptions = {
          zoom: 3,
          center: new google.maps.LatLng(-6.9691377,108.9729246),
          mapTypeId: 'terrain'
        };

        var map = new google.maps.Map(document.getElementById('map'), mapOptions);

        var flightPlanCoordinates = [
          new google.maps.LatLng(-6.5958845,107.4440923),
          new google.maps.LatLng(-6.6407947,107.6976926),
          new google.maps.LatLng(-7.1758121,108.5959127),
          new google.maps.LatLng(-6.9769447,109.8414482)
        ];
        var flightPath = new google.maps.Polyline({
          path: flightPlanCoordinates,
          editable: true,
          strokeColor: '#FF0000',
          strokeOpacity: 1.0,
          strokeWeight: 2,
          map: map
        });

        var deleteMenu = new DeleteMenu();

        google.maps.event.addListener(flightPath, 'rightclick', function(e) {
          // Check if click was on a vertex control point
          if (e.vertex == undefined) {
            return;
          }
          deleteMenu.open(map, flightPath.getPath(), e.vertex);
        });
      }

      /**
       * A menu that lets a user delete a selected vertex of a path.
       * @constructor
       */
      function DeleteMenu() {
        this.div_ = document.createElement('div');
        this.div_.className = 'delete-menu';
        this.div_.innerHTML = 'Delete';

        var menu = this;
        google.maps.event.addDomListener(this.div_, 'click', function() {
          menu.removeVertex();
        });
      }
      DeleteMenu.prototype = new google.maps.OverlayView();

      DeleteMenu.prototype.onAdd = function() {
        var deleteMenu = this;
        var map = this.getMap();
        this.getPanes().floatPane.appendChild(this.div_);

        // mousedown anywhere on the map except on the menu div will close the
        // menu.
        this.divListener_ = google.maps.event.addDomListener(map.getDiv(), 'mousedown', function(e) {
          if (e.target != deleteMenu.div_) {
            deleteMenu.close();
          }
        }, true);
      };

      DeleteMenu.prototype.onRemove = function() {
        google.maps.event.removeListener(this.divListener_);
        this.div_.parentNode.removeChild(this.div_);

        // clean up
        this.set('position');
        this.set('path');
        this.set('vertex');
      };

      DeleteMenu.prototype.close = function() {
        this.setMap(null);
      };

      DeleteMenu.prototype.draw = function() {
        var position = this.get('position');
        var projection = this.getProjection();

        if (!position || !projection) {
          return;
        }

        var point = projection.fromLatLngToDivPixel(position);
        this.div_.style.top = point.y + 'px';
        this.div_.style.left = point.x + 'px';
      };

      /**
       * Opens the menu at a vertex of a given path.
       */
      DeleteMenu.prototype.open = function(map, path, vertex) {
        this.set('position', path.getAt(vertex));
        this.set('path', path);
        this.set('vertex', vertex);
        this.setMap(map);
        this.draw();
      };

      /**
       * Deletes the vertex from the path.
       */
      DeleteMenu.prototype.removeVertex = function() {
        var path = this.get('path');
        var vertex = this.get('vertex');

        if (!path || vertex == undefined) {
          this.close();
          return;
        }

        path.removeAt(vertex);
        this.close();
      };

      google.maps.event.addDomListener(window, 'load', initialize);
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
</html>

Ubuntu Upgrade

  1. Backup system.
  2. Upgrade currently installed package.
    sudo apt-get update
    sudo apt-get upgrade 
    sudo apt-get dist-upgrade
  3. Use ubuntu’s do-release-upgrade tool to perform upgrade.
    sudo do-release-upgrade

Mount file sfs

File sfs atau SquashFS compresses files, merupakan file system yang biasa digunakan pada linux. Untuk membuka file tersebut, dapat dilakukan di sistem operasi linux. Pada contoh ini digunakan file system.sfs pada PhoenixOSInstaller_v2.1.0.175.64bit.iso dengan sistem operasi OpenSUSE versi Tumbleweed.

cd /mnt/
sudo mkdir iso
sudo mount -o loop PhoenixOSInstaller_v2.1.0.175.64bit.iso iso
sudo mkdir sfs
sudo mount -o loop iso/system.sfs sfs/
sudo mkdir img
sudo mount sfs/system.img img

apache2: Could not reliably determine the server’s fully qualified domain name

Ada yang pernah mencoba menjalankan ubuntu di perangkat android? Mungkin teman-teman yang pernah mencobanya mengalami masalah yang sama dengan yang saya alami. ketika  mencoba menginstall lamp server, muncul error “AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using ::1. Set the ‘ServerName’ directive globally to suppress this message” ketika akan menjalankan apache server.

Solusi:
tambahkan ServerName pada /etc/apache2/apache2.conf.

sudo nano /etc/apache2/apache2.conf

Pada contoh ini saya tambahkan dibawah Global configuration.

# Global configuration
#
ServerName localhost

Langkah selanjutnya, restart apache2.

sudo service apache2 restart

No directory, logging in with HOME=/

Ada yang pernah mencoba menjalankan ubuntu di perangkat android? Mungkin teman-teman yang pernah mencobanya mengalami masalah yang sama dengan yang saya alami. ketika  mencoba menginstall lamp server, muncul error “No directory, logging in with HOME=/” ketika akan menjalankan mysql server. Hal ini mungkin disebabkan karena kernel android dicompile dengan konfigurasi CONFIG_ANDROID_PARANOID_NETWORK. Masalah ini dapat diperbaiki dengan menambahkan mysql user pada aid_inet dan aid_net_raw groups.

usermod -a -G aid_inet,aid_net_raw mysql
su mysql

Langkah selanjutnya tinggal menjalankan mysql.

sudo service mysql start

SSH into “Bash on Ubuntu on Windows 10”

Pada Windows 10 Anniversary Edition terdapat fitur tambahan yaitu “Bash on Ubuntu on Windows”. Untuk kali ini akan membahas cara mengakses terminal pada ubuntu dengan menggunakan ssh. Langkah-langkahnya adalah sebagai berikut:

  1. Hapus ssh server yang sudah terinstall.
    sudo apt-get remove --purge openssh-server
  2. Install openssh-server.
    sudo apt-get install openssh-server
  3. Ganti pengaturan pada file “sshd_config” yang terdapat pada direktori “/etc/ssh/”.
    sudo vi /etc/ssh/sshd_config

    Ganti port menjadi port selain 22, karena port 22 sudah digunakan oleh windows.
    Ganti PermitRootLogin menjadi no.
    Tambahkan baris AllowUsers yourusername, dimana yourusernamemerupakan username yang digunakan.
    Set PasswordAuthenticationmenjadi yes jika ingin login menggunakan password.

    Berikut adalah konfigurasi yang saya gunakanan:

  4. Restart openssh-server.
    sudo service ssh --full-restart