Skip to content

Portable

Chetabahana edited this page Sep 20, 2021 · 271 revisions

Pada sesi ini kita akan bahas sistem portable yaitu sistem yang sifatnya bisa dijalankan secara mobile atau terpisah sehingga tidak bergantung ke suatu sistem operasi utama.

Table of Contents

Skema

Seperti halnya komputer dekstop maka sistem portable dibuat oleh banyak sistem operasi. Untuk saat ini maka OS Android yang dikembangkan oleh Google memiliki pengguna terbanyak.


Kita akan bahas bagaimana cara membuat aplikasi yang dapat dijalankan di smartphone. Untuk membuat program Android ini kita akan gunakan modul kivy:

$ conda info --envs
$ conda.bat activate tf250
(tf250)$ pip install kivy
(tf250)$ conda deactivate
$ exit

Berikut panampakannya di layar komputer:

Sebagai tes awal kita masukkan kode di file dengan nama main.py. Untuk lebih jelasnya bisa disimak tutorialnya di Youtube (klik gambarnya)::

Berikutnya kita akan coba jalankan modul kivy ini.

Pola

Di bawah ini saya tulis kodenya jadi Anda bisa tinggal copas:

import kivy
from kivy.app import App
from kivy.uix.label import Label

kivy.require('1.9.0')

class NeuralRandom(App):

    def build(self):
        return Label(text="NeuralRandom")

NeuralRandom = NeuralRandom()
NeuralRandom.run()

Kemudian langsung dijalankan:

Jika muncul kotak hitam seperti di atas maka instalasi kivy sudah OK.

Basis

Sesuai nama class: NeuralRandom selanjutnya kita buat file pakai huruf kecil semua dan dikasih extension: .kv. Jadi nama filenya: neuralrandom.kv kemudian isi kode berikut:

<MyRoot>:
    random_label: random_label

    BoxLayout:
        orientation: "vertical"
        Label:
            text: "NeuralRandom"
            font_size: 66
            color: 0.92, 0.45, 0, 1
        Label:
            id: random_label
            text: "-"
            font_size: 64
        Button:
            text: "Generate"
            font_size: 52
            size: 100,50
            on_press: root.generate_number()

Disini kita pilih warna, kode warnanya bisa ambil di Internet:

Untuk lebih jelasnya bisa disimak di Youtube pada bagian ini (klik gambarnya):

Berikut saya uraikan cara jalankan filenya.

Frame

Untuk menjalankannya kita ubah kode di file main.py seperti ini:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

import random

kivy.require('1.9.0')

class MyRoot(BoxLayout):

    def __init__(self):
        super(MyRoot, self).__init__()

    def generate_number(self):
        self.random_label.text = str(random.randint(0, 1000))

class NeuralRandom(App):

    def build(self):
        return MyRoot()

NeuralRandom = NeuralRandom()
NeuralRandom.run()

Untuk lebih jelasnya bisa disimak di Youtube pada bagian ini (klik gambarnya)::

Kemudian kita jalankan lagi file main.py maka akan muncul seperti ini:

Berikutnya kita akan compile sehingga dapat dijalankan di smartphone.

Form

Nama compilernya: Buildozer. Sumber kodenya ada di GitHub (klik gambarnya):


Detil dan caranya bisa disimak pada tautan berikut: buildozer.readthedocs.io

Baris perintahnya ada di halaman Installation:

Buildozer ini tidak ada versi Windows nya jadi kita harus gunakan Linux

Shape

Di Windows kita bisa jalankan Linux via Windows Subsystem Linux atau WSL.
Cara Instal WSL ini sudah kita bahas. Jadi kita langsung masuk ke cara intalasi Buildozer:

sudo apt update
sudo apt install -y git zip unzip openjdk-8-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
pip3 install --user --upgrade Cython==0.29.19 virtualenv  # the --user should be removed if you do this in a venv
pip3 install --user --upgrade buildozer

# add the following line at the end of your ~/.bashrc file
echo 'export PATH=$PATH:~/.local/bin/' >> ~/.bashrc
export PATH=$PATH:~/.local/bin/

Perintah ini kita jalankan di WSL.
Untuk WSL ini saya pilih Ubuntu versi 20.04.

Berikut adalah penampakan saat perintah dijalankan:

Begitu selesai kita tutup dulu WSL nya.
Kemudian kita open lagi untuk periksa path dan folder.

Setelah itu kita jalankan proses kompile python ke apk sesuai petunjuk di Youtube pada bagian ini:

Berikut saya uraikan detilnya. .

Profile

Namun jika diikuti akan timbul error seperti ini:

  RAN: /usr/bin/mv Python-3.8.1 /mnt/c/users/Chetabahana/source/myapp/.buildozer/android/platform/build-armeabi-v7a/build/other_builds/hostpython3/desktop/hostpython3

  STDOUT:
/usr/bin/mv: cannot move 'Python-3.8.1' to '/mnt/c/users/Chetabahana/source/myapp/.buildozer/android/platform/build-armeabi-v7a/build/other_builds/hostpython3/desktop/hostpython3': Permission denied

Error ini muncul saat python dikompile oleh Buildozer:

Berikut penampakan layarnya:

Dari error ini nampak seperti linglung WSL nya.

Node

Sebagai solusinya saya pakai yang namanya Symbolic Links dari system Linux. Dengannya kita buat directory bayangan (symbolic): myapp di home directory.

cd $HOME
ln -s /mnt/c/users/Chetabahana/source/myapp myapp
buildozer init

Nah di home directory akan muncul file yang namanya buildozer.spec. Ini yang harus kita ubah pada variabel source.dir = . menjadi source.dir = myapp.

[app]

# (str) Title of your application
title = My Application

# (str) Package name
package.name = myapp

# (str) Package domain (needed for android/ios packaging)
package.domain = org.test

# (str) Source code where the main.py live
source.dir = .   # <<=== ini yang diedit

# (list) Source files to include (let empty to include all the files)
source.include_exts = py,png,jpg,kv,atlas

# (list) List of inclusions using pattern matching
#source.include_patterns = assets/*,images/*.png

# (list) Source files to exclude (let empty to not exclude anything)
#source.exclude_exts = spec

# (list) List of directory to exclude (let empty to not exclude anything)
#source.exclude_dirs = tests, bin

# (list) List of exclusions using pattern matching
#source.exclude_patterns = license,images/*/*.jpg

# (str) Application versioning (method 1)
version = 0.1

# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py

# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy

# (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy

# (list) Garden requirements
#garden_requirements =

# (str) Presplash of the application
#presplash.filename = %(source.dir)s/data/presplash.png

# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png

# (str) Supported orientation (one of landscape, sensorLandscape, portrait or all)
orientation = portrait

# (list) List of service to declare
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY

#
# OSX Specific
#

#
# author = © Copyright Info

# change the major version of python used by the app
osx.python_version = 3

# Kivy version to use
osx.kivy_version = 1.9.1

#
# Android specific
#

# (bool) Indicate if the application should be fullscreen or not
fullscreen = 0

# (string) Presplash background color (for new android toolchain)
# Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
# red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,
# darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,
# olive, purple, silver, teal.
#android.presplash_color = #FFFFFF

# (list) Permissions
#android.permissions = INTERNET

# (int) Target Android API, should be as high as possible.
#android.api = 27

# (int) Minimum API your APK will support.
#android.minapi = 21

# (int) Android SDK version to use
#android.sdk = 20

# (str) Android NDK version to use
#android.ndk = 19b

# (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi.
#android.ndk_api = 21

# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True

# (str) Android NDK directory (if empty, it will be automatically downloaded.)
#android.ndk_path =

# (str) Android SDK directory (if empty, it will be automatically downloaded.)
#android.sdk_path =

# (str) ANT directory (if empty, it will be automatically downloaded.)
#android.ant_path =

# (bool) If True, then skip trying to update the Android sdk
# This can be useful to avoid excess Internet downloads or save time
# when an update is due and you just want to test/build your package
# android.skip_update = False

# (bool) If True, then automatically accept SDK license
# agreements. This is intended for automation only. If set to False,
# the default, you will be shown the license when first running
# buildozer.
# android.accept_sdk_license = False

# (str) Android entry point, default is ok for Kivy-based app
#android.entrypoint = org.renpy.android.PythonActivity

# (str) Android app theme, default is ok for Kivy-based app
# android.apptheme = "@android:style/Theme.NoTitleBar"

# (list) Pattern to whitelist for the whole project
#android.whitelist =

# (str) Path to a custom whitelist file
#android.whitelist_src =

# (str) Path to a custom blacklist file
#android.blacklist_src =

# (list) List of Java .jar files to add to the libs so that pyjnius can access
# their classes. Don't add jars that you do not need, since extra jars can slow
# down the build process. Allows wildcards matching, for example:
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar

# (list) List of Java files to add to the android project (can be java or a
# directory containing the files)
#android.add_src =

# (list) Android AAR archives to add (currently works only with sdl2_gradle
# bootstrap)
#android.add_aars =

# (list) Gradle dependencies to add (currently works only with sdl2_gradle
# bootstrap)
#android.gradle_dependencies =

# (list) add java compile options
# this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option
# see https://developer.android.com/studio/write/java8-support for further information
# android.add_compile_options = "sourceCompatibility = 1.8", "targetCompatibility = 1.8"

# (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}
# please enclose in double quotes 
# e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }"
#android.add_gradle_repositories =

# (list) packaging options to add 
# see https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
# can be necessary to solve conflicts in gradle_dependencies
# please enclose in double quotes 
# e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'", "exclude 'META-INF/*.kotlin_module'"
#android.add_gradle_repositories =

# (list) Java classes to add as activities to the manifest.
#android.add_activities = com.example.ExampleActivity

# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME

# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png

# (str) XML file to include as an intent filters in <activity> tag
#android.manifest.intent_filters =

# (str) launchMode to set for the main activity
#android.manifest.launch_mode = standard

# (list) Android additional libraries to copy into libs/armeabi
#android.add_libs_armeabi = libs/android/*.so
#android.add_libs_armeabi_v7a = libs/android-v7/*.so
#android.add_libs_arm64_v8a = libs/android-v8/*.so
#android.add_libs_x86 = libs/android-x86/*.so
#android.add_libs_mips = libs/android-mips/*.so

# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wakelock = False

# (list) Android application meta-data to set (key=value format)
#android.meta_data =

# (list) Android library project to add (will be added in the
# project.properties automatically.)
#android.library_references =

# (list) Android shared libraries which will be added to AndroidManifest.xml using <uses-library> tag
#android.uses_library =

# (str) Android logcat filters to use
#android.logcat_filters = *:S python:D

# (bool) Copy library instead of making a libpymodules.so
#android.copy_libs = 1

# (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64
android.arch = armeabi-v7a

# (int) overrides automatic versionCode computation (used in build.gradle)
# this is not the same as app version and should only be edited if you know what you're doing
# android.numeric_version = 1

#
# Python for android (p4a) specific
#

# (str) python-for-android fork to use, defaults to upstream (kivy)
#p4a.fork = kivy

# (str) python-for-android branch to use, defaults to master
#p4a.branch = master

# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
#p4a.source_dir =

# (str) The directory in which python-for-android should look for your own build recipes (if any)
#p4a.local_recipes =

# (str) Filename to the hook for p4a
#p4a.hook =

# (str) Bootstrap to use for android builds
# p4a.bootstrap = sdl2

# (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)
#p4a.port =


#
# iOS specific
#

# (str) Path to a custom kivy-ios folder
#ios.kivy_ios_dir = ../kivy-ios
# Alternately, specify the URL and branch of a git checkout:
ios.kivy_ios_url = https://github.com/kivy/kivy-ios
ios.kivy_ios_branch = master

# Another platform dependency: ios-deploy
# Uncomment to use a custom checkout
#ios.ios_deploy_dir = ../ios_deploy
# Or specify URL and branch
ios.ios_deploy_url = https://github.com/phonegap/ios-deploy
ios.ios_deploy_branch = 1.7.0

# (str) Name of the certificate to use for signing the debug version
# Get a list of available identities: buildozer ios list_identities
#ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"

# (str) Name of the certificate to use for signing the release version
#ios.codesign.release = %(ios.codesign.debug)s


[buildozer]

# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
log_level = 2

# (int) Display warning if buildozer is run as root (0 = False, 1 = True)
warn_on_root = 1

# (str) Path to build artifact storage, absolute or relative to spec file
# build_dir = ./.buildozer

# (str) Path to build output (i.e. .apk, .ipa) storage
# bin_dir = ./bin

#    -----------------------------------------------------------------------------
#    List as sections
#
#    You can define all the "list" as [section:key].
#    Each line will be considered as a option to the list.
#    Let's take [app] / source.exclude_patterns.
#    Instead of doing:
#
#[app]
#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
#
#    This can be translated into:
#
#[app:source.exclude_patterns]
#license
#data/audio/*.wav
#data/images/original/*
#


#    -----------------------------------------------------------------------------
#    Profiles
#
#    You can extend section / key with a profile
#    For example, you want to deploy a demo version of your application without
#    HD content. You could first change the title to add "(demo)" in the name
#    and extend the excluded directories to remove the HD content.
#
#[app@demo]
#title = My Application (demo)
#
#[app:source.exclude_patterns@demo]
#images/hd/*
#
#    Then, invoke the command line with the "demo" profile:
#
#buildozer --profile demo android debug

Jadi jika Anda temu masalah yang sama maka hapus dulu semua folder yang namanya .buildozer baik itu di folder project maupun di Linux nya.

Perintah hapusnya di Linux bisa gunakan kode berikut (pilih salah satu):

rm -rf ~/.buildozer
rm -rf $HOME/.buildozer

Setelah itu kita buat symbolik link seperti yang saya uraikan di atas.

Nah disini artinya buildozer init akan tempatkan file buildozer.spec di directory kita di Linux: $HOME bukan di folder projeknya yang di Windows.

Karena file buildozer.spec sekarang ada di Linux maka disini saya pakai editor bawaan Linux yang disebut nano, perintahnya gunakan kode berikut (pilih salah satu):

nano ~/buildozer.spec
nano $HOME/buildozer.spec

Ketika sudah masuk ke nano kita edit source.dir = . jadi source.dir = myapp:

Setelah selesai diedit kita tekan Control X lalu pilih yes untuk disimpan.

Theory

Dengan demikian si folder .buildozer akan menetap duduk manis di Linux. Gak jalan² linglung kesana kemari. Yang jalan² ke Windows hanya setelan kita saja di buildozer.spec.

Nah compile nya sendiri memang lama. Mister yang di Youtube dia bilang sekitar ½ jam, kalau di komputer saya itu kira sejam. Hasil akhirnya akan ada file apk di folder $HOME/bin.

Karena folder ini ada di Linux maka kita copy ke myapp (pilih salah satu):

cp ~/bin/myapp-0.1-armeabi-v7a-debug.apk ~/myapp/myapp-0.1-armeabi-v7a-debug.apk
cp $HOME/bin/myapp-0.1-armeabi-v7a-debug.apk $HOME/myapp/myapp-0.1-armeabi-v7a-debug.apk

Jadi otomatis file apk ini akan muncul di folder projek kita di Windows.

Nah file apk ini yang kita kirim ke smartphone.
Kirimnya sih bebas bisa pakai kabel data, atau card reader.

Kalu saya kirim nya pakai Bluetooth karena selalu standby di komputer jadi gak repok colok².

Outline

Instalasi di smartphone Android tidak serumit masalah compile nya. Berikut ini saya animasikan penampakan layar pada Hp Jenis OPPO F1S (Android 5.1). Jadi bisa diikuti langkah²nya.

Pemasangannya kita harus lewati blokir default dari smartphone. Jika penasaran mencoba, file apk nya bisa difork atau download disini myapp-0.1-armeabi-v7a-debug.apk.

Namun sebaiknya buat sendiri supaya yakin file nya itu aman. Kan kalau berhasil nantinya kita bisa buat aplikasi Android sendiri ambil macem yang lain suka² kita.

Nah setelah beres kita tos dulu sama Mister yang di Youtube.
Jangan lupa subscribe dan bunyikan loncengnya.👍

Konsep

Sistem portable berkembang dari kebutuhan manusia untuk berkomunikasi secara mudah. Saat ini aplikasi Whatsapp menduduki peringkat tertinggi dalam jumlah pengguna.


Kita dapat membuat pesan Whatsapp secara otomatis baik ke nomer kita sendiri maupun nomer lainnya. Caranya adalah dengan menggunakan akun online yang melayani pengiriman pesan².

Salah satunya adalah dengan daftar akun Twilio.
Berikut kita bahas step²nya.

Logics

Kita siapkan alamat email dan nomer Whatsapp. Pertama kali kita akan diminta untuk verifikasi email seperti yang tampak pada gambar berikut ini:

Kemudian isikan nomer Whatsapp yang akan kita gunakan:

Setelah itu kita akan menerima konfirmasinya:

Berikutnya kita setel akun untuk kirim pesan dengan Whatsapp.

Umum

Disini kita akan diminta untuk mengisi form. Untuk amannya Anda isi saja formnya sesuai tujuan tutorial yang akan kita bahas seperti tampak pada gambar berikut ini:

Setelah itu kita dapat mengaktifkan fasilitas pengiriman pesan. Disini istilahnya adalah SandBox. Anda bisa cek di akun seperti tampak pada gambar berikut ini:

Berikutnya kita akan gunakan programnya di komputer.

Khusus

Instalasinya mudah saja, kita bisa gunakan pip. Sejauh yang saya pantau tidak ada kendala sama sekali dalam pemasangan. Berikut penampakan layar saat instalasi:

Setelah itu kita coba mengetes pengiriman pesan dari komputer via akun kita di Twilio. Untuk mudahnya kita ambil salah satu tutorialnya di Youtube (klik gambarnya).

Dengan tutorial ini kita bisa pahami cara kerjanya.
Berikut kita ulas step²nya.

System

Pada prinsipnya pengiriman pesan dilakukan oleh server di Twilio via otorisasi dengan kode yang istilahnya token. Setelan kode ini di python adalah seperti berikut ini:

import os
from twilio.rest import Client

account = "ACXXXXXXXXXXXXXXXXX"
token = "YYYYYYYYYYYYYYYYYY"
client = Client(account, token)

Setelan ini bisa kita bypass. Caranya adalah masukkan ke Windows Environtment dengan nama: TWILIO_ACCOUNT_SID dan TWILIO_AUTH_TOKEN. Untuk jelasnya bisa diikuti di bagian ini:

Untuk mengisi kode dari variabel ini kita ambil nilainya di akun Twilio. Anda bisa copas kodenya dari halaman Keys and Credentials seperti yang tampak pada gambar berikut ini:

Kemudian kita simpan di Environtment Windows dengan cara disimpan di setelan User Variables di Windows seperti yang tampak pada gambar berikut ini:

Hal sama kita lakukan juga untuk variabel nomor Whatsapp dengan nama: MY_PHONE_NUMBER. Pengiriman ke kontak lain juga isikan nomer nya di variabel ini.

Untuk tes nya kita gunakan cmd. Caranya masukan perintah: set. Kemudian pastikan nama variabel tersimpan di Windows dimana mereka muncul seperti ini:

Jika sudah masuk maka selanjutnya kita bisa abaikan setelan akun di python.

Filosofi

Untuk kode python bisa dicopas seperti berikut ini. Kode ini bebas saja nama file nya jadi tidak mengikat seperti yang dibahas di aplikasi kivy. Disini kita beri nama Whatsapp.py.

import os
from twilio.rest import Client

client = Client()

from_whatsapp_number='whatsapp:+14155238886'
to_whatsapp_number='whatsapp:' + os.environ['MY_PHONE_NUMBER']

client.messages.create(body='Ahoy World!',
                       from_=from_whatsapp_number,
                       to=to_whatsapp_number)

Kode terdiri dari tiga bagian penting. Pertama import cilent yaitu class python yang berfungsi intuk dioperasikan di komputer dalam menyampaikan pesan.

Berikutnya adalah implementasi variabel: MY_PHONE_NUMBER untuk setelan nomer Whatsapp yang digunakan. Cara ini berlaku sama untuk mengirim pesan ke nomer² lain:

Kemudian terakhir adalah kode untuk kirim pesan. Disini pesannya: Ahoy world!. Anda ubah saja pesannya ini sesuai yang Anda inginkan:

Untuk memulainya kita tes terlebih dahulu dengan cara kirim Whatsapp ke Twilio. Hal ini juga akan berlaku sama untuk nomer lain yang akan kita kirimkan pesan:

Berikunya kita bahas cara menjalankan kode ini.

Analogi

Setelah kirim pesan ke Twilio pastikan bahwa kita akan terima konfirmasi di nomer Whatsapp yang didaftarkan. Berikut penampakan layar di Smartphone:

Dengan konfirmasi ini maka kita bisa langsung jalankan kode python. Dalam proses ini dia akan mengirimkan sinyal dari komputer ke Twilio via internet:

Sinyal ini akan diproses oleh server pengiriman pesan di Twilio. Jika semua setelan benar maka pesannya akan muncul di Smartphone.

Jika tidak muncul coba periksa lagi step² yang sudah diuraikan di atas.

Jika berhasil maka kita coba kirim ke nomer lain. Caranya kita ikuti prosedur Sandbox Participants:

Pada nomer lain ini juga akan terima konfirmasi persis seperti halnya di nomer yang kita daftarkan sendiri, jadi pesan akan muncul setelah nomernya masuk participants list:

Sampai disini aplikasi selesai kita tes.

Pattern

Tutorial di atas kita lakukan via standard yang dikirim dari Twilio. Bila pakai nomor lain misalnya untuk tujuan komersil maka kita harus beli nomor dan digunakan dengan API Key.

Setelah dapat konfirmasi maka kemudian kita buat token nya di akun:

Setelan ini berlaku sementara, jadi bisa kita distribusikan secara aman.

Berikut akan dibahas pengembangan dari sumber kodenya.

Outlook

Sumber kodenya ini juga tersedia di GitHub dengan berbagai bahasa pemrograman.

Disini kita pilih python. Gambar berikut adalah penampakan layar repository nya di GitHub:

Jika Anda punya akun di GitHub maka kita bisa ambil secara fork:

Maka dalam sekejap semua kodenya akan masuk ke akun kita:

Dengan cara ini kita bisa ubah namanya suka² kita:

Scheme

Caranya adalah dengan masuk ke halaman setelan repository:

Berikut penampakan layar setelah ubah nama:

Untuk instalasinya kita lepas dulu aplikasi yang sudah terpasang. Kemudian ambil sumber kode dari akun kita sendiri. Semua ini bisa dilakukan dengan menggunakan pip:

$ conda.bat activate tf250
(tf250)$ pip uninstall twilio
(tf250)$ pip install git+https://github.com/chetabahana/twilio.git
(tf250)$ conda deactivate
$ exit

Dengan demikian aplikasi yang terpasang sekarang bebas untuk disetel sesuai tujuan.

Dari sini selanjutnya kita bisa kontribusi atau kembangkan sendiri.

Realisasi

Korelasi

Grounds

Diagram

Template

Package

Updating

Delivery

Branching

Manuscript

Referensi

Clone this wiki locally