Saturday, January 5, 2019

Google Terapkan Page Speed Sebagai Faktor Hasil Pencarian Mobile

Google Terapkan Page Speed Sebagai Faktor Hasil Pencarian Mobile - CodePolitan.com

Google belum lama ini mengumumkan bahwa dimulai pada bulan Juli 2018, page speed atau kecepatan muat halaman akan menjadi faktor peringkat hasil pencarian di perangkat mobile.

"Speed Update" yang diterapkan oleh Google hanya akan mempengaruhi situs-situs dengan kecepatan muat paling lama. Memiliki kecepatan muat yang lambat tidak serta merta menurunkan peringkat sebuah situs. Apabila situs tersebut masih memiliki konten yang bagus meskipun lambat, ia masih bisa berada di peringkat atas.

Sebelum diterapkan di pencarian mobile, page speed sudah menjadi faktor peringkat hasil pencarian desktop. Keputusan ini tentunya dibuat Google untuk membantu user yang berada di perangkat mobile agar mendapatkan hasil yang lebih baik dengan waktu yang lebih singkat.

Berdasarkan data statista.com, penetrasi pengguna Internet di Indonesia pada tahun 2017 adalah 39.7% dari populasi. Itu artinya lebih dari 103 juta masyarakat Indonesia sudah menggunakan Internet dan 76.11 juta di antaranya menggunakan internet dari perangkat mobile. Jadi, jika ingin tetap bersaing dari hasil pencarian perangkat mobile, kita harus memperbaiki performa aplikasi web kita sejak sekarang agar tak kalah dari situs-situs lainnya.

Sumber Google Terapkan Page Speed Sebagai Faktor Hasil Pencarian Mobile

Friday, January 4, 2019

Mudah Membuat API Tanpa Koding dengan Strapi

Mudah Membuat API Tanpa Koding dengan Strapi - CodePolitan.com

Strapi adalah Content Management Framework (CMS) open source yang dikembangkan untuk membantu developer membangun API dengan jauh lebih mudah. Strapi dikembangkan di atas lingkungan Node.js yang sudah terbukti kehandalannya. Berikut beberapa fitur Strapi:
  • Admin panel bawaan yang bisa di kostumisasi sesuai kebutuhan. Artinya kita bisa mengubah gaya maupun logika admin panel tersebut.
  • Sistem plugin yang memungkinkan developer menambah fitur server API dengan sesuai keinginan.
  • Front-end agnostic yang artinya bagiian frontend Strapi bisa dipasangkan dengan framework apapun (React, Vue, Angular, dsb.).
  • Sistem keamanan standar (CSRF, CORS, P3P, Xframe, XSS, dsb.) yang sudah dibungkus langsung ke dalam Strapi.
  • Berbasis komunitas sehingga memungkinkan Strapi untuk terus berkembang sebagai free and open source software.

Membuat API Blog Sederhana

Di tutorial ini kita akan belajar bagaimana membuat API blog sederhana yang mendemonstrasikan kemampuan Strapi.

Pemasangan Strapi

Untuk menggunakan Strapi pastikan untuk memasang aplikasi-aplikasi berikut terlebih dahulu.
  • Node.js >= 10.x
  • NPM >= 6.x
  • Salah satu database berikut: MongoDB >= 3.x, MySQL >= 5.6, MariaDB >= 10.1, PostgreSQL >= 10
Strapi bisa pasang menggunakan NPM. Jalankan perintah berikut di terminal:
$ npm install strapi@alpha -g
Jika muncul pesan yang mengatakan masalah permission, tambahan perintah sudo sebelum npm.
Berikutnya periksa versi Strapi yang terpasanga:
$ strapi -v
Saat tulisan ini dibuat versi Strapi yang penulis miliki adalah 3.0.0-alpha.17.

Membuat project baru

Sekarang mari kita buat project baru dengan aplikasi strapi yang telah terpasang. Buka aplikasi terminal lalu jalankan perintah berikut:
$ strapi new blog
Kita akan diminta memilih produk database yang ingin dipakai. Di sini penulis akan menggunakan MySQL saja.
Lets configurate the connection to your database:
? Choose your main database: MySQL
? Database name: blog
? Host: 127.0.0.1
? Port: 3306
? Username: root
? Password:
Pastikan bahwa database bernama blog sudah dibuat sebelum melakukan konfigurasi database.

Run the Server

Sekarang mari kita jalankan server ini.
$ cd blog
$ strapi start
Server Strapi bisa diakses melalui alamat http://localhost:1337 dan saat pertama kali di jalankan akann membawa kita ke http://localhost:1337/admin/plugins/users-permissions/auth/register untuk melakukan registrasi admin.


Jika sudah mengisi seluruh data yang diminta klik Ready to start. Checckbox di atas tombol Ready to start bersifat opsional. Hanya centang jika kamu ingin menerima informasi terbru lewat email dari pengembang Strapi.
Berikut tampilan dashboard Strapi saat pertama kali dimuat.

Membuat Content Type

Content Type adalah istilah yang digunakan oleh Strapi untuk mendefinisikan objek data yang ia miliki. Kita bisa mengatur setiap Content Type untuk memiliki nama, jenis data dan jenis media yang bisa disimpan ke dalam Content Type tersebut.
Strapi memiliki sebuah fitur bernama Content Type Builder, sebuah antarmuka yang membantu mendefinisikan struktur Content Type dengan beberapa klik saja. Karena kita akan membuat API untuk sebuah blog, maka mari kita buat sebuah Content Type untuk artikel.
Pertama, buka halaman Content Type Builder melalui menu yang ada di bagian sebelah kiri. Berikutnya klik tombol Add Content Type di tombol yang ada di sebelah kanan (perhatikan panah merah pada gambar di bawah):


Sebuah form dalam bentuk modal akan muncul.isikan kolom name dengan nama Content Type yang akan dibuat. Untuk pilihan connection biarkan saja default. Kolom description boleh di isi boleh juga tidak. Klik tombol save setelah selesai.


Setelah membuat Content Type, kita akan diminta menentukan jenis field/kolom yang kita ingin ada di dalam Content Type tersebut. Agar tetap sederhana, mari kita tambahkan tiga kolom bernama judul, isi, dan sampul yang masing-masing berjenis string, text, dan media. Gunakan tombol Add new field untuk menambahkannya.

Jenis data untuk field Content Type

Ada sebelas jenis data yang bisa kita pilih untuk setiap field/kolom Content Type diantaranya:
  1. String - Untuk data teks.
  2. Text - Untuk data teks seperti String, tapi umumnya untuk teks yang lebih panjang seperti deskripsi, paragraf, artikel, dokumen, komentar, dsb.
  3. Number - Untuk data berupa angka baik itu bilangan bulat maupun riil.
  4. Boolean - Untuk data benar-salah.
  5. Date - Untuk jenis data yang menyatakan tanggal/waktu.
  6. JSON - Untuk data jenis teks seperti String, tapi harus memiliki struktur JSON yang valid.
  7. Email - Untuk data email.
  8. Password - Dipakai untuk menyimpan password.
  9. Media - Untuk menyimpan data berupa file gambar, video, PDF, dsb.
  10. Enumeration - Untuk data berupa pilihan jawaban.
  11. Relation - Untuk menentukan hubungan antar Content Type

Berikut gambar Content Type artikel setelah diberikan field-field.

Klik tombol save untuk menyimpan.


Operasi CRUD di Strapi

Sebagian besar waktu kita dalam melakukan manajemen konten tentu saja melakuakn operasi create, read, update, dan delete atau yang sering dikenal dengan akronim CRUD. Operasi-operasi ini sudah disediakan secara langsung oleh Strapi.
Setiap kali kita membuat Content Type dan menyimpannya, akan muncul sebuah menu baru di sebelah kiri atas (lihat gambar).


Tambahkan beberapa data baru. Salin saja beberapa artikel yang ada di Codepolitan untuk mengisinya.
Seperti yang bisa kalian lihat juga, halaman ini sudah memiliki fitur untuk melakukan pencarian atau penyaringan berdasarkan masing-masing field yang ada di Content Type. Kita bisa mengatur untuk menampilkan berapa data untuk setiap halaman. Pagination pun sudah langsung aktif dari sananya. Field yang ditampilkan dalam tabel juga bisa ditentukan apa saja.

Mengaktifkan WWYSIWYG Untuk Field Isi

Saat menambahkan artikel baru, kamu pasti menyadari bahwa kolom isi merupakan sebuah textarea. Pada umumnya kita ingin menggunakan editor WYSIWYG untuk sebuah konten yang banyak isinya. Strapi pun sudah memiliki fitur ini.
Kembali ke Content Type Builder, pilih Artikel, kemudian klik gambar ikon edit pada kolom isi. Pindah ke tab advanced setting, lalu centang Display as a WYSIWYG.

img

Klik Continue lalu klik tombol Save. Perhatikan perbedaan form sebelum dan sesudah mengaktifkan opsi display as a wysiwyg.

img

Konsumsi API Blog

Sekarang kita sudah memiliki data yang siap untuk dikonsumsi. Data ini mungkin ingin dikonsumsi oleh aplikasi mobile, mungkin juga untuk dikonsumsi oleh bagian frontend aplikasi web. Agar sebuah Content Type bisa dikonsumsi oleh dunia luar, kita perlu mengatur agar Content Type tersebut memiliki permission Public.
Klik menu Roles & Permission di menu yang ada di sebelah kiri.

img

Ada tiga role yang tersedia langsung yaitu Administrator, Authenticated, dan Public. Kita akan mengatur agar Artikel memliiki akses Public. Klik pada menu Public di halaman Roles & Permission yang telah di buka.
Atur permission yang ingin diberikan pada public terhadap artikel. Seluruh opsi di centang hanya untuk contoh, pada umumnya public tidak memiliki akses untuk membuat (create), menghapus (destroy), atau mengubah (update) tanpa melakukan autentikasi terlebih dahulu.

img

Jika terdapat field upload, dan ingin bisa mengunggah file melalui POST atau UPDATE, kita juga perlu mengaktifkan permission upload.

img

Jangan lupa untuk menakan tombol Save setelah selesai.

Mengambil Seluruh Data (GET)

Kita bisa mengakses seluruh data menggunakan endpoint http://localhost:1337/artikels dimana artikels merupakan nama Content Type yang tadi kita buat.

img

Kita juga bisa melakukan filter atau pengurutan. Misalnya, untuk melakukan pencarian artikel dengan judul yang mengandung CSS adalah http://localhost:1337/artikels?judul_contains=CSS Untuk semua opsi filter silahkan kunjungi dokumentasi resminya di sini.

Mengambil salah satu data (GET)

Untuk mengambil salah satu data caranya sangat mudah, cukup tambahkan nomor id data yang ingin diambil di ujung endpoint sebelumnyahttp://localhost:1337/artikels/{id}.

img

Menambah Data Baru (POST)

Untuk mengirimkan pesan POST kita bisa memanfaatkan aplikasi Postman atau Curl. Di sini penulis menggunakan Postman supaya lebih mudah. Endpoint untuk membuat data baru sama dengan endpoint untuk mengambil seluruh data, hanya saja operasi yang dipilih mesti berjenis POST seperti gambar di bawah.

img

Hmm, bukankah tadi ada field sampul untuk menyimpan gambar thumbnail artikel? Strapi tidak menyimpan informasi gambar di satu tabel yang menyebabkan kita tidak bisa mengunggah gambar sampul atau file jenis apapun di satu request. Untuk mengunggah sebuah file kita harus melakukan operasi terpisah dengan melakukan request ke http://localhost:1337/upload seperti pada gambar berikut.

img

Key untuk sebuah file adalah files. Key ref dipakai untuk menentukan file yang kita upload ini dimiliki oleh model (Content Type) apa. Karena sebuah artikel memiliki sebuah gambar, maka kita nyatakan isi ref sebagai artikel. Artikel ada banyak, maka kita tentukan artikel dengan id apa yang memiliki gambar ini melalui key refId. Di model artikel tadi kita sudah menentukan bahwa atribut yang menyimpan gambar merupakan sampul, maka kita isikan nama atribut ini sebagai isi key field.
Kirimkan request POST ini dan perhatikan di panel admin Strapi bahwa data yang tadi kita buat sudah memiliki gambar sampul meskipun kita upload dengan dua request yang berbeda.

Mengubah Data (PUT)

Mengubah data salah satu artikel bisa kita lakukan dengan melakukan request PUT ke http://localhost:1337/artikels/{id}. Contoh berikut ini kita ingin mengubah judul artikel ber-id 4.

img


Menghapus Data (DELETE)

Menghapus salah satu data caranya sangat mudah. Cukup buat sebuah request DELETE ke endpoint http://localhost:1337/artikels dengan id data yang ingin dihapus.

img

Penutup

Tutorial ini hanya memberikan gambaran singkat akan fitur standar yang dimiliki oleh Strapi. Masih ada banyak lagi fitur yang dimilikinya. Selain itu kita juga bisa menambah fungsi yang tidak tersedia langsung oleh Strapi dengan memodifikasi source code-nya secara manual jika memang diperlukan.
Akhir kata, semoga bermanfaat dan jangan lupa bahagia.

Sumber : CODEPOLITAN

Corona Labs Rilis Corona Game Engine Sebagai Aplikasi Open Source

Corona Labs Rilis Corona Game Engine Sebagai Aplikasi Open Source - CodePolitan.com

Corona adalah game engine 2D yang dikembangkan oleh Corona Labs. Game engine ini sudah cukup lama berlaga di dunia pengembangan game dan sudah membantu banyak developer mengembangkan game-game mereka. Beberapa game terkenal yang berhasil dikembangkan dengan Corona adalah Tiny Boxes, Gunman Taco Truck, Scale, Rider, dan lain sebagainya.

Semenjak Corona Labs di akuisisi oleh Appodeal tahun 2017 yang lalu, persiapan untuk meng-open source kan Corona game engine sudah dilakukan. Langkah ini diambil untuk menunjukkan proses pengembangan yang lebih transparan dan mengajak komunitas untuk ikut bersama-sama mengarahkan masa depan Corona. Inti game engine Corona akan di buka source code-nya kecuali beberapa plugin yang ada di Marketplace.

Sayangnya Corona versi open source memaksa kita untuk merilis game yang dibuat dengannya sebagai aplikasi open source juga dengan lisensi GPL v3. Sedangkan, jika ingin merilis game sebagai aplikasi komersil maka harus menggunakan lisensi komersial.
Informasi resmi dari pihak Corona labs tentang langkah ini bisa dibaca di sini, dan source code game engine Corona bisa di lihat di Github.

Sumber : Corona Labs Rilis Corona Game Engine Sebagai Aplikasi Open Source

Wednesday, January 2, 2019

Yang Baru di Laravel 5.6

Yang Baru di Laravel 5.6 - CodePolitan.com

Laravel 5.6 baru saja dirilis sebagai versi mayor framework ini! Rilis yang terbaru membawa banyak fitur dan artikel ini akan membahas fitur-fitur utamanya. Untuk daftar lengkap silahkan hubungi changelog Github.

Logging Improvements

Fitur paling besar yang ada di laravel 5.6 adalah peningkatan logging. Konfigurasinya dipindah dari config/app.php ke config/logging.php.
Kita bisa mengatur sebuah "stacks" yang dapat mengirim pesan log ke beberapa handler. Misalnya, kita bisa mengirim pesan debug ke system log dan mengirim error log ke slack. Baca lebih lanjut tentang logging di sini.

Single Server Task Scheduling

Jika kita memiliki sebuah task scheduler di beberapa server, tiap-tiap task tersebut akan berjalan di servernya masing-masing. Kita bisa mengatur agar task tersebut hanya berjalan di salah satu server saja dengan method onOneServer():
$schedule->command('report:generate')
    ->fridays()
    ->at('17:00')
    ->onOneServer();
Catatan: Kita harus menggunakan memcached atau redis driver agar driver cache bawaan bisa memakai fitur single server task scheduling di Laravel 5.6 ini.

Dynamic Rate Limiting

Laravel 5.6 memperkenalkan dynamic rate limiting yang memberikan fleksibilitas dan memungkinkan kita memberi rate dengan mudah per-user:
Route::middleware('auth:api', 'throttle:rate_limit,1')
    ->group(function () {
        Route::get('/user', function () {
            //
    });
});
Pada contoh di atas, rate_limit adalah atribut dari model App\User untuk menentukan jumlah rikues yang diperbolehkan pada waktu yang diberikan.

Broadcast Channel Classes

Sekarang kita bisa menggunakan channel classes di file routes/channels.php daripada menggunakan closures.
Untuk membuat kelas channel baru, Laravel 5.6 memberikan perintah make:channel:
php artisan make:channel OrderChannel
Lalu kita daftarkan channel tersebut ke routes/channels.php:
use App\Broadcasting\OrderChannel;

Broadcast::channel('order.{order}', OrderChannel::class);

API Controller Generation

Kita sekarang bisa membuat resource controller untuk API yang akan mengabaikan aksi create dan edit yang tidak perlu sehingga hanya berguna untuk membuat resource controller yang mengembalikan HTML. Untuk membuat sebuah resource controller gunakan flag --api:
php artisan make:controller API/PhotoController --api

Eloquent Date Casting

Kita bisa mengkostumisasi format date Eloquent dan casting datetimg secara individu:
protected $casts = [
    'birthday' => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];
Format ini dipakai pada model serialization ke sebuah array atau data JSON.

Blade Component Aliases

Sekarang kita bisa memberikan alias kepada komponen Blade untuk mempermudah akses. Misal, jika kita menyimpan sebuah komponen di resources/views/components/alert.blade.php kita bisa memakai method compoenent() untuk memendekkannya:
Blade::component('components.alert', 'alert');
Lalu kita bisa me-render file blade tadi dengan lias yang sudah dibuat:
@component('alert')
    <p>This is an alert component</p>
@endcomponent

Argon2 Password Hashing

Laravel 5.6 mendukung algoritma hashing baru untuk PHP 7.2+. Kita bisa mengontrol driver hashing mana yang dipakai di file config/hashing.php.
// baca juga

UUID Methods

Dua method baru tersedia di Illuminate\Support\Str untuk membuat Universal Unique Identifiers (UUID):
return (string) Str::uuid();
return (string) Str::orderedUuid();
Method orderedUuid() akan membuat sebuah UUID dengan timstamp untuk mempermudah dan mengefisienkan index di database.

Collision

Collision adalah fitur untuk memberikan pesan error yang enak dilihat langsung di terminal.



Bootstrap 4

Semua scaffolding frontend (kode-kode yang di-generate) dan contoh komponen Vue sekaran gmenggunakan Bootstrap 4.

Upgrade Ke Laravel 5.6

Untuk meng-upgrade pemasangan ke v5.6, ikuti petunjuk upgrade ini.
Sumber: laravel-news

CODEPOLITAN

Mengunci Orientasi Activity Android

Mengunci Orientasi Activity Android - CodePolitan.com

Saat membuat aplikasi Android, kadang kita menemukan kasus di mana kita ingin agar Activity tidak ikut berubah saat orientasi layar berubah. Kita ingin agar Activity tetap portrait meskipun posisi perangkat Android saat ini Landscape dan begitu pula sebaliknya.

Dengan memanfaatkan AndroidManifest.xml, kita bisa mengatur agar activity tertentu mengunci orientasinya baik dalam bentuk portrait maupun landscape. Opsi ini hanya bisa dilakukan dengan menambah atribut android:screenOrientation didalam tag <activity>

Nilai yang umumnya dipakai adalah portrait, landscape, dan behind (mengikuti orientasi activity sebelumnya di stack).


Berikut contoh kode yang akan mengunci orientasi layar Activity:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lobothijau.halo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DetailActivity"
            android:screenOrientation="landscape" />
        <activity
            android:name=".SettingsActivity"
            android:screenOrientation="behind" />
    </application>

</manifest>
 
 
Sumber : Mengunci Orientasi Activity Android

Tuesday, January 1, 2019

Cara Membuat Data Migration dengan Django

Cara Membuat Data Migration dengan Django - CodePolitan.com

Diterjemahkan dari How to Create Django Data Migrations karya Vitor Freitas.

Level menengah/intermediate. Pembaca diharapkan sudah memahami cara membuat aplikasi web Django.

Data Migration alias migrasi data merupakan sebuah cara yang sangat nyaman dilakukan untuk mengubah data di database untuk mengikuti perubahan schema. Cara kerjanya sama seperti migrasi schema biasa. Django mencatat tiap dependensi, urutan eksekusi dan memeriksa apakah aplikasi untuk melakukan migrasi data tertentu atau belum.
Kasus paling sering ialah saat kita ingin membuat field baru yang non-nullable. Atau saat kita akan membuat field baru untuk menyimpan angka pencatat (cached count), kita akan membuat field baru tersebut dan memulai angka pencatat pertamanya.

Di artikel ini kita akan mempelajari cara kerja sebuah aplikasi sederhana yang bisa di-extend dan modifikasi sesuai keperluan.


Data Migrations

Anggap kita memiliki sebuah app bernama blog yang sudah dipasang di INSTALLED_APPS.
Aplikasi blog kita memiliki model sebagai berikut:
blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=255)
    date = models.DateTimeField(auto_now_add=True)
    content = models.TextField()

    def __str__(self):
        return self.title
Aplikasi ini sudah memakai model Post di atas; ia sudah ada di production dan sudah ada banyak data tdi dalamnya.
idtitledatecontent
1How to Render Django Form Manually2017-09-26 11:01:20.547000[…]
2How to Use Celery and RabbitMQ with Django2017-09-26 11:01:39.251000[…]
3How to Setup Amazon S3 in a Django Project2017-09-26 11:01:49.669000[…]
4How to Configure Mailgun To Send Emails in a Django Project2017-09-26 11:02:00.131000[…]

Sekarang, kita anggap kita akan membuat field baru bernama slug yang akan dipakai untuk membuat URL blog tersebut. Field slug ini harus unique dan not null.

Secara umum, selalu buat field baru dengan properti null=True atau dengan sebuah nilai default. Jika tidak bisa menyelesaikannya dengan parameter default, pertama buat field dengan properti null=True dan buat migrasi datanya. Setelah itu kita bisa membuat migrasi baru dan mengubah properti field-nya dengan null=False.

Begini caranya:
blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=255)
    date = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    slug = models.SlugField(null=True)

    def __str__(self):
        return self.title
Buat migrasi:
python manage.py makemigrations blog

Migrations for 'blog':
  blog/migrations/0002_post_slug.py
    - Add field slug to post
Lalu aplikasikan:
python manage.py migrate blog

Operations to perform:
  Apply all migrations: blog
Running migrations:
  Applying blog.0002_post_slug... OK
Sampai di sini, sistem database kita sudah memiliki kolom slug.
idtitledatecontentslug
1How to Render Django Form Manually2017-09-26 11:01:20.547000[…](null)
2How to Use Celery and RabbitMQ with Django2017-09-26 11:01:39.251000[…](null)
3How to Setup Amazon S3 in a Django Project2017-09-26 11:01:49.669000[…](null)
4How to Configure Mailgun To Send Emails in a Django Project2017-09-26 11:02:00.131000[…](null)
Buat sebuah empty migration dengan perintah berikut:
python manage.py makemigrations blog --empty

Migrations for 'blog':
  blog/migrations/0003_auto_20170926_1105.py
Lalu buka file 0003_auto_20170926_1105.py, dan tambahkan konten berikut:
blog/migrations/0003_auto_20170926_1105.py
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-09-26 11:05
from __future__ import unicode_literals

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        ('blog', '0002_post_slug'),
    ]

    operations = [
    ]

Lalu di dalam file ini, kita bisa membuat sebuah fungsi yang akan diekseskusi oleh perintah RunPython:

blog/migrations/0003_auto_20170926_1105.py
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-09-26 11:05
from __future__ import unicode_literals

from django.db import migrations
from django.utils.text import slugify

def slugify_title(apps, schema_editor):
    '''
    We can't import the Post model directly as it may be a newer
    version than this migration expects. We use the historical version.
    '''
    Post = apps.get_model('blog', 'Post')
    for post in Post.objects.all():
        post.slug = slugify(post.title)
        post.save()

class Migration(migrations.Migration):

    dependencies = [
        ('blog', '0002_post_slug'),
    ]

    operations = [
        migrations.RunPython(slugify_title),
    ]

Pada contoh di atas kita menggunakna fungsi slugify. Ia meminta sebuah string sebagai parameter dan mengubahnya menjadi sebuah slug. Berikut ini contoh penggunaannya:
from django.utils.text import slugify

slugify('Hello, World!')
'hello-world'

slugify('How to Extend the Django User Model')
'how-to-extend-the-django-user-model'
Fungsi yang dipanggil RunPython untuk membuat sebuah migrasi data meminta dua parameter: apps dan schema_editor. Parameter RunPython mengisikan dua parameter tersebut. Ingat juga bahwa kita perlu mengimpor model dengan method apps.get_model('app_name', 'model_name').

Simpan file ini dan eksekusi migrasinya seperti melakukan migrasi model:
python manage.py migrate blog
Operations to perform:
  Apply all migrations: blog
Running migrations:
  Applying blog.0003_auto_20170926_1105... OK
Sekarang jika kita periksa isi databasenya:
idtitledatecontentslug
1How to Render Django Form Manually2017-09-26 11:01:20.547000[…]how-to-render-django-form-manually
2How to Use Celery and RabbitMQ with Django2017-09-26 11:01:39.251000[…]how-to-use-celery-and-rabbitmq-with-django
3How to Setup Amazon S3 in a Django Project2017-09-26 11:01:49.669000[…]how-to-setup-amazon-s3-in-a-django-project
4How to Configure Mailgun To Send Emails in a Django Project2017-09-26 11:02:00.131000[…]how-to-configure-mailgun-to-send-emails-in-a-django-project

Setiap Post memiliki sebuah value, jadi kita bisa mengubahnya dari null=True menjadi null=False. Dan karena semua value unique, kita juga bisa menambah tag unique=True.
Ubah model menjadi:
blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=255)
    date = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    slug = models.SlugField(null=False, unique=True)

    def __str__(self):
        return self.title

Buat migrasi baru:
python manage.py makemigrations blog

Sekarang akan muncul prompt berikut:
You are trying to change the nullable field 'slug' on post to non-nullable without a default; we can't do that
(the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL
 operation to handle NULL values in a previous data migration)
 3) Quit, and let me add a default in models.py
Select an option:
Pilih opsi 2 dengan menulis angka “2” di terminal.
Migrations for 'blog':
  blog/migrations/0004_auto_20170926_1422.py
    - Alter field slug on post

Sekarang kita bisa mengaplikasikan migrasinya:
python manage.py migrate blog
Operations to perform:
  Apply all migrations: blog
Running migrations:
  Applying blog.0004_auto_20170926_1422... OK

Kesimpulan

Migrasi data terkadang sulit dilakukan. Saat membuat mgirasi data untuk project kita, selalu periksa data production dengan teliti. Impelemntasi slugify_title yang penulis pakai di contoh ini terlalu sederhana karena ia bisa menulis title ganda di data yang besar. Selalu lakukan test untuk migrasi data di staging environment, untuk menghindari kerusakan data di production.

Penting untuk melakukannya step-by-step, sehingga kita memiliki kontrol setiap perubahan yang ingin dilakukan. Catat bahwa di sini penulis membuat tiga file migrasi untuk sebuah migrasi data sederhana.

Seperti yang dapat pembaca lihat, melakukan migrasi data seperti tidak sulit dilakukan. Ia juga sangat fleksibel. Kita bisa saja memuat sebuah file teks untuk mengisikan datanya ke sebuah kolom baru.
Kode sumber yang dipakai di artikel ini tersedia di GitHub: https://github.com/sibtc/data-migrations-example

Sumber : CODEPOLITAN

Menampilkan Title Toolbar Android di Tengah

Menampilkan Title Toolbar Android di Tengah - CodePolitan.com

Toolbar merupakan salah satu komponen yang sangat penting bagi sebuah aplikasi Android. Toolbar dapat menampilkan title yang dapat nama aplikasi atau nama Activity.
Normalnya, title ditampilkan diposisi agak ke kiri di Toolbar. Namun, terkadang kita juga ingin menampilkan title dalam posisi ditengah Toolbar. Kali ini kita akan belajar bagaimana melakukan hal ini di Android Studio.


Sebelum memulai, pastikan bahwa kita di dalam layout kita menggunakan objek Toolbar. Ubah kode Toolbar yang tadinya seperti pada sisipan di bawah:

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
 
Menjadi:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        tools:text="Codepolitan"
        android:id="@+id/toolbar_text" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"/>
</android.support.v7.widget.Toolbar>
 
Berikut ini gambar preview yang didapatkan:

 

Saat program di jalankan, teks yang ada di dalam TextView tidak tampil seperti pada bagian preview. Untuk menampilkannya, kita harus tambahkan kdoe Java berikut di Activity yang menampilkan Toolbar di atas:

TextView toolbarText = (TextView) findViewById(R.id.toolbar_text);
if(toolbarText!=null && toolbar!=null) {
  toolbarText.setText(getTitle());
  setSupportActionBar(toolbar);
}
Berikut contoh kode onCreate yang ada di dalam Activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);

  TextView toolbarText = (TextView)
  findViewById(R.id.toolbar_text);
  if(toolbarText!=null && toolbar!=null) {
    toolbarText.setText(getTitle());
    setSupportActionBar(toolbar);
  }
}
 
Method getTitle() yang ada di dalam toolbarText.setText() akan mengambil nama Activity yang diatur di AndroidManifest.xml. Jika ingin mengubahnya dengan teks lain, cukup tuliskan teks yang diinginkan sebagai ganti getTitle(). Berikut hasil yang akan didapatkan saat aplikasi ini di jalankan di emulator:

 

Rekomendasi Aplikasi Penghasil Cuan :D Dirumah saja tetap Dapet Duit !!!

Hallo Bosskyuuh semua. Perkenalkan aku Patrick Ananta berasal dari Jawa Tengah. Aku sudah lama sekali dirumahkan dikarenakan covid19 sehingg...