Pengaturan REPMGR Menggunakan WITNESS di PostgreSQL 10

Setting Up REPMGR With WITNESS For PostgreSQL 10 Database

This blog post will go over how to set up and implement repmgr which is the PostgreSQL application to manage replication between primary and replica nodes, allowing for quick and easy failover and rebuilding of replicas. For reference, all commands are run as root. For the commands that need to be run as the Postgres user, I will run them using su. As an example:

su - postgres -c 'COMMAND RUN AS POSTGRES USER'

Outline

  • The Setup
  • SSH
  • REPMGR
  • PostgreSQL Primary Configuration
  • PostgreSQL Replica Configuration
  • PostgreSQL Witness Configuration
  • Summary

The Setup

The environment that I will be working in consists of four CentOS 7 servers with a default install of PostgreSQL 10 installed using yum from the PostgreSQL 10 repo.  With PostgreSQL installed on each server, the Postgres user will already be on each server. I will configure the first server as the primary master. The second and third server will become replicas of the primary master. Then the fourth and final server will become a witness server used for voting in automatic failover scenarios.

base-centos-1 = primary master
base-centos-2 = replica
base-centos-3 = replica
base-centos-4 = witness

SSH

In order for repmgr to work correctly, the Postgres user account will need to be able to SSH to each of the other servers with no prompt.  In order to do this I went to each server and generated an SSH key, and then collected all of the public SSH keys and placed them in an authorzied_keys file on each server.  This allowed me to SSH between the servers with no prompt. I have SELINUX disabled by default. If you are using SELINUX, make sure it is set up correctly for SSH and authorized keys.

On each server, I did the following:

1) [ON ALL SERVERS] Become the Postgres user, create the ssh key, then cat out the public key:

su - postgres -c 'ssh-keygen'
su - postgres -c 'cat ~/.ssh/id_rsa.pub'

2) [ON ALL SERVERS] Create an authorized keys file and set the permissions:

su - postgres -c 'touch ~/.ssh/authorized_keys'
su - postgres -c 'chmod 600 ~/.ssh/authorized_keys'
su - postgres -c 'vi ~/.ssh/authorized_keys'

3) [ON ALL SERVERS] Place all of the public keys from Step 1 into the authorized_keys files created in Step 2.  The authorized_keys file contents looked like the following on all of my servers, with each key as a new line:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTXxjFY8dLs2GVRpDY7asAK5SvwITPVSJN9ItnwsVtzCpZgX/Mbnkc/jHgwuIGb0srh/KthByyYJi14QViI+x7xVQm8eyuqMBtORt9rl6rLF73H/gYPO9jONIbD/yihxJMWmJK1Ro6Armhfj5OyTXyW6vjbXqvl7fuSi4n13ubW+G7Pnk8jDK+5rOFYve6Czmde7cQPeueo7sY4oZCbhO+Vr+HwK6qUNUsP3/iRj/bjpbNh8gaqQDl5y5XCNV32y3IhgMgsimO4EkSbb03y0lcWI8dJ6asnXUZumvUwasrFcQ2SFRqb/F3kK4L2Ofy9qYo0yV+FyCuJlsoEur1IRKF postgres@base-centos-1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYHmDFOtYc/VDxccNRQEnDYBTE8QDiUTMX46PX1p5tvs6qvP3VPMEccs4um0YVFXZTmbnvyeN3bBPe23NS5Pal6ySfAxIdAAOt5YzKoJ0BJAoHksfTchXsCvSs1zIBLXLSRTYdmjb2s+EWxB9elle4Z2KbZrXbzVkSQuUOdMtbjTPUfIqcVh8kokCznpVjKSEXtHg9Vx1Whg20brw99EzhcBeS5q+jJtQbaSa6VG3VUmsznxtoWiA9EgMZ9C7hcmxTrtKNEJrQvd1LpBObTYbueV7+MVlgShTct88alun12iheT6x6ien445X1lYjLmkjGT8CHNqdos+VQR9sgT5R7 postgres@base-centos-2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgQNra4/rDOVWr5uV5nSa49yPLlgAJ6crsYKpvhfRr3L5J/T48QE468Am5t3lA318Nst2FbObq7dduqBNhOQDurPlTiPd9cWQsj0mVySnZ2gD7sc8epyRcNbR5cNBum2JKkez4X8FxArMZwYkvPd28dAPFd30NwLYgIFhQ/jzScweyfX1RYp4s+AOI0XpBAiuQZ6r5Gxz+h61jmsbCwM4ZmT4J8OFIF/x/GFExF126PB2PqEg41OK2AGZ2eneTtaoDxMoVDPuy1vhdUw/aODf1dPZYRTn2rwbdXDW7E6Y8/dxT3Lo1n8v/syboy/MsF50NdYzwOb0/Q4dtYsVPpemV postgres@base-centos-3
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5UAsmEkw9INHwXL6cpHqOy5O8VIpvLsfklzoHYfmGxBhGqi6nZzV/+TAzpotrmAf7PIUEdzWOm1lTfii1iRU821ks1bSPN2FeBXzK5Mhtl6KHpIXeDOS64WEJRcen2cQIw9f5f6Ji6PBlc3AQBvspxuNtth6Y0vOTq2N+kFTGOM95kuuIzRs7QvU0XrCoMKOn/BBE+e8ad72gwjCP1q9aNheDJBCsB9WhJerN+LOLr2gJiA0Ha6xxSGQ5WoAB17nYSQunsSvvAU079wfVt/e6OMozyNC6X/+I7IRcRg8IHS+aMKvKrasfi5PTawqoideB4QngM6lHmUR9/MFf9Ikt postgres@base-centos-4

4) I am now able to become the Postgres user and SSH to any of the other servers and log in without a password prompt. This is an example on base-centos-1:

[root@base-centos-1 vagrant]# su - postgres
Last login: Mon Jul 22 18:27:34 UTC 2019 on pts/0
-bash-4.2$ ssh base-centos-2
Last login: Mon Jul 22 18:22:31 2019
-bash-4.2$ hostname
base-centos-2

REPMGR

For repmgr, I first installed the repmgr software, and then configured it on each server to make sure all of the configurations are correct. With the installation of PostgreSQL 10 on my servers, I installed the PostgreSQL repository using the following RPM. This repo also includes repmgr, which is where I am installing the software from. You can find the different yum repositories from https://yum.postgresql.org/repopackages.php:

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

1) [ON ALL SERVERS] I installed repmgr from the PostgreSQL 10 repository. Make sure you install the correct repmgr for the version of PosgreSQL that you are running:

yum install -y repmgr10.x86_64

2) [ON ALL SERVERS] Next, I configured repmgr on each server with the servers specific details. Make sure to update each according to the server and paths. As an example for each server, I updated the node_id, node_name, and conninfo to match the servers I was configuring. If you are using a different version of PostgreSQL you will want to make sure you update the paths for the version you are using. Do NOT assume the paths in my example will be the same on your system. In my setup, the configuration file was located at /etc/repmgr/10/repmgr.conf.

node_id=101
node_name='base-centos-1'
conninfo='host=base-centos-1 dbname=repmgr user=repmgr'
data_directory='/var/lib/pgsql/10/data/'
config_directory='/var/lib/pgsql/10/data'
log_file='/var/log/repmgr.log'
repmgrd_service_start_command = '/usr/pgsql-10/bin/repmgrd -d'
repmgrd_service_stop_command = 'kill `cat $(/usr/pgsql-10/bin/repmgrd --show-pid-file)`'
promote_command='repmgr standby promote -f /etc/repmgr/10/repmgr.conf --siblings-follow --log-to-file'
follow_command='repmgr standby follow -f /etc/repmgr/10/repmgr.conf --log-to-file'
failover=automatic
reconnect_attempts=3
reconnect_interval=5
ssh_options='-q -o StrictHostKeyChecking=no -o ConnectTimeout=10'

3) [ON ALL SERVERS] I created the log file that I configured in Step 2 so I would not get an error when starting the service:

su - postgres -c 'touch /var/log/repmgr.log'

 

PostgreSQL Primary Configuration

Next, I started working on the primary server to get it set up within repmgr. For the configuration of the pg_bha.conf and postgresql.conf, I am only updating them on the primary master, because when I rebuild the replicas from the master, these changes will get copied over. If your server keeps the configuration files separate from the data directory, you will need to update these configurations on all of the servers, not just on the primary master.

1) Create the repmgr user account and repmgr database that will be used for repmgr to manage the cluster. The repmgr user account will be used for replication to the PostgreSQL replica servers to the primary master.

su - postgres -c 'createuser --replication --createdb --createrole --superuser repmgr'
su - postgres -c "psql -c 'ALTER USER repmgr SET search_path TO repmgr, \"\$user\", public;'"
su - postgres -c 'createdb repmgr --owner=repmgr'

2) Update pg_hba.conf to allow the repmgr account to authenticate. With trust being used, this allows the repmgr user account in the database to authenticate without a password. If you are building a production environment, you will want a more secure method using md5 and passwords. These changes won’t take place until the PostgreSQL service is restarted, which I will do after the next step. In my setup this file is located at /var/lib/pgsql/10/data/pg_hba.conf. I found that I had the best results by specifying the IPs.

host replication repmgr 192.168.56.101/32 trust
host replication repmgr 192.168.56.102/32 trust
host replication repmgr 192.168.56.103/32 trust
host replication repmgr 192.168.56.104/32 trust
host repmgr repmgr 192.168.56.101/32 trust
host repmgr repmgr 192.168.56.102/32 trust
host repmgr repmgr 192.168.56.103/32 trust
host repmgr repmgr 192.168.56.104/32 trust

3) Next, I configured the PostgreSQL configuration file to allow for replication to occur by setting the wal_level and other settings. I also add the repmgr shared libraries into the postgresql.conf file. In my setup, the PostgreSQL configuration file is at /var/lib/pgsql/10/data/postgresql.conf.

listen_addresses = '*'
shared_preload_libraries = 'repmgr'
wal_level = replica
archive_mode = on
max_wal_senders = 10
hot_standby = on
archive_command = 'cp -i %p /var/lib/pgsql/10/data/archive/%f'

4) I then created the archive directory that I specified in the PostgresSQL configuration file using the Postgres user to make sure it had the correct permissions, and then I restarted PostgreSQL server to pick up the new settings.

su - postgres -c 'mkdir /var/lib/pgsql/10/data/archive'
systemctl enable postgresql-10.service
systemctl restart postgresql-10.service
systemctl status postgresql-10.service

5) Now that repmgr and PostgreSQL are both configured, I will register my PostgreSQL server with repmgr and then start the repmgr daemon service so that it monitors the status of the replication cluster.

su - postgres -c 'repmgr primary register'
su - postgres -c 'repmgr daemon start'
su - postgres -c 'repmgr daemon status'
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+---------------+---------+-----------+---------------+---------+------+---------+--------------------
101 | base-centos-1 | primary | * running | | running | 5496 | no | n/a

 

PostgreSQL Replica Configuration

At this stage I already have SSH and regmgr installed and repmgr configured on all of the servers. Now I will utilize repmgr to backup the databases off of the primary server and restore them onto the two replica servers base-centos-2 and base-centos-3. Because my pg_hba.conf and postgresql.conf files are in the same directory as my data, these files will also get copied over during the backup and restore process. I will be running the following commands on both of the replica servers, but not the final witness server which I will configure later.

1) Stop PostgreSQL and clear the data directory:

systemctl stop postgresql-10.service
rm -rf /var/lib/pgsql/10/data/*

2) Next, I backed up and restored the data from the primary server, and then started the PostgreSQL server and viewed the status to make sure it was running:

su - postgres -c "repmgr -h base-centos-1 -U repmgr -d repmgr standby clone"
systemctl start postgresql-10.service
systemctl status postgresql-10.service

3) Then I register the replica with the repmgr cluster and start the repmgr daemon service to monitor the server in the cluster:

su - postgres -c 'repmgr standby register -h base-centos-1 -U repmgr'
su - postgres -c 'repmgr daemon start'
su - postgres -c 'repmgr daemon status'
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+---------------+---------+-----------+---------------+---------+------+---------+--------------------
101 | base-centos-1 | primary | * running | | running | 5496 | no | n/a
102 | base-centos-2 | standby | running | base-centos-1 | running | 3414 | no | 1 second(s) ago
103 | base-centos-3 | standby | running | base-centos-1 | running | 4549 | no | 1 second(s) ago

 

4) To verify that the replication is up and running I can run the following commands to validate the replication status:

ON PRIMARY

su - postgres -c 'psql -c "select pid, usename, client_addr, backend_start, state, sync_state from pg_stat_replication;"'
pid | usename | client_addr | backend_start | state | sync_state
-------+---------+----------------+-------------------------------+-----------+------------
15347 | repmgr | 192.168.56.102 | 2019-07-22 18:19:31.232492+00 | streaming | async
15363 | repmgr | 192.168.56.103 | 2019-07-22 18:19:36.566369+00 | streaming | async

ON REPLICAs

su - postgres -c 'psql --pset expanded=auto -c "select * from pg_stat_wal_receiver;"'
-[ RECORD 1 ]---------+------------------------------------------------------------------
pid | 5408
status | streaming
receive_start_lsn | 0/B000000
receive_start_tli | 3
received_lsn | 0/B0025B8
received_tli | 3
last_msg_send_time | 2019-07-22 18:22:17.942712+00
last_msg_receipt_time | 2019-07-22 18:22:17.943306+00
latest_end_lsn | 0/B0025B8
latest_end_time | 2019-07-22 18:19:47.617303+00
slot_name |
conninfo | user=repmgr host='base-centos-1' application_name='base-centos-3'

PostgreSQL Witness Configuration

Having a separate witness is good in the event that there is a network outage and you want a server to vote on who should become the new master. This will help prevent split-brain scenarios, with the understanding that you cannot truly prevent split brains unless you implement a configuration management solution like consul or zookeeper. The important thing to note when setting up a witness is that the witness has to use its own repmgr database. You CANNOT make a standby replica server a witness. I will NOT be restoring the database from the primary onto the witness server, so I will have to repeat a couple of the steps to create the repmgr user and database which will be separate. I then have to configure the pg_hba settings to allow for the repmgr user from the other servers to talk to the witness.

1) Create the repmgr user account and repmgr database that will be used for repmgr to manage the cluster. The repmgr user account will be used for replication to the PostgreSQL replica servers to the primary master.

su - postgres -c 'createuser --replication --createdb --createrole --superuser repmgr'
su - postgres -c "psql -c 'ALTER USER repmgr SET search_path TO repmgr, \"\$user\", public;'"
su - postgres -c 'createdb repmgr --owner=repmgr'

2) Update pg_hba.conf to allow the repmgr account to authenticate. With trust being used, the PosgreSQL user can authenticate without a password. If you are building a production environment, you will want a more secure method using md5 and passwords. These changes won’t take place until PostgreSQL service has been restarted, which I will do after the next step. In my setup, this file is located at /var/lib/pgsql/10/data/pg_hba.conf.

host replication repmgr 192.168.56.101/32 trust
host replication repmgr 192.168.56.102/32 trust
host replication repmgr 192.168.56.103/32 trust
host replication repmgr 192.168.56.104/32 trust
host repmgr repmgr 192.168.56.101/32 trust
host repmgr repmgr 192.168.56.102/32 trust
host repmgr repmgr 192.168.56.103/32 trust
host repmgr repmgr 192.168.56.104/32 trust

3) Register the witness with the primary server in the cluster:

su - postgres -c 'repmgr witness register -h base-centos-1 -U repmgr'
su - postgres -c 'repmgr daemon start'
su - postgres -c 'repmgr daemon status'
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+---------------+---------+-----------+---------------+---------+------+---------+--------------------
101 | base-centos-1 | primary | * running | | running | 5496 | no | n/a
102 | base-centos-2 | standby | running | base-centos-1 | running | 3414 | no | 1 second(s) ago
103 | base-centos-3 | standby | running | base-centos-1 | running | 4549 | no | 1 second(s) ago
104 | base-centos-4 | witness | * running | base-centos-1 | running | 3226 | no | 0 second(s) ago

Summary

Now I have a fully configured repmgr cluster that allows for me to failover from the primary to one of the replicas. As an example, I can run the following to migrate the primary role to one of the standbys. In order to run this, the failover command has to be run on the standby that is becoming the new primary:

su - postgres -c 'repmgr --dry-run -h base-centos-2 standby switchover --siblings-follow'
su - postgres -c 'repmgr -h base-centos-2 standby switchover --siblings-follow'
su - postgres -c 'repmgr cluster show'
su - postgres -c 'repmgr cluster event'

FAILOVER TO base-centos-2

su - postgres -c 'repmgr -h base-centos-2 standby switchover --siblings-follow'
WARNING: following problems with command line parameters detected:
database connection parameters not required when executing UNKNOWN ACTION
NOTICE: executing switchover on node "base-centos-2" (ID: 102)
NOTICE: local node "base-centos-2" (ID: 102) will be promoted to primary; current primary "base-centos-1" (ID: 101) will be demoted to standby
NOTICE: stopping current primary node "base-centos-1" (ID: 101)
NOTICE: issuing CHECKPOINT
DETAIL: executing server command "/usr/pgsql-10/bin/pg_ctl -D '/var/lib/pgsql/10/data' -W -m fast stop"
INFO: checking for primary shutdown; 1 of 60 attempts ("shutdown_check_timeout")
INFO: checking for primary shutdown; 2 of 60 attempts ("shutdown_check_timeout")
NOTICE: current primary has been cleanly shut down at location 0/C000028
NOTICE: promoting standby to primary
DETAIL: promoting server "base-centos-2" (ID: 102) using "/usr/pgsql-10/bin/pg_ctl -w -D '/var/lib/pgsql/10/data' promote"
waiting for server to promote.... done
server promoted
NOTICE: waiting up to 60 seconds (parameter "promote_check_timeout") for promotion to complete
NOTICE: STANDBY PROMOTE successful
DETAIL: server "base-centos-2" (ID: 102) was successfully promoted to primary
INFO: local node 101 can attach to rejoin target node 102
DETAIL: local node's recovery point: 0/C000028; rejoin target node's fork point: 0/C000098
NOTICE: setting node 101's upstream to node 102
WARNING: unable to ping "host=base-centos-1 dbname=repmgr user=repmgr"
DETAIL: PQping() returned "PQPING_NO_RESPONSE"
NOTICE: starting server using "/usr/pgsql-10/bin/pg_ctl -w -D '/var/lib/pgsql/10/data' start"
NOTICE: NODE REJOIN successful
DETAIL: node 101 is now attached to node 102
NOTICE: executing STANDBY FOLLOW on 2 of 2 siblings
INFO: node 104 received notification to follow node 102
INFO: STANDBY FOLLOW successfully executed on all reachable sibling nodes
NOTICE: switchover was successful
DETAIL: node "base-centos-2" is now primary and node "base-centos-1" is attached as standby
NOTICE: STANDBY SWITCHOVER has completed successfully

CLUSTER STATUS

su - postgres -c 'repmgr cluster show'
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string
-----+---------------+---------+-----------+---------------+----------+----------+----------+----------------------------------------------
101 | base-centos-1 | standby | running | base-centos-2 | default | 100 | 3 | host=base-centos-1 dbname=repmgr user=repmgr
102 | base-centos-2 | primary | * running | | default | 100 | 4 | host=base-centos-2 dbname=repmgr user=repmgr
103 | base-centos-3 | standby | running | base-centos-2 | default | 100 | 3 | host=base-centos-3 dbname=repmgr user=repmgr
104 | base-centos-4 | witness | * running | base-centos-2 | default | 0 | 1 | host=base-centos-4 dbname=repmgr user=repmgr

CLUSTER EVENTS FOR FAILOVER

su - postgres -c 'repmgr cluster event'
Node ID | Name | Event | OK | Timestamp | Details
---------+---------------+----------------------------+----+---------------------+-------------------------------------------------------------------------
102 | base-centos-2 | child_node_new_connect | t | 2019-07-22 20:00:04 | new witness "base-centos-4" (ID: 104) has connected
102 | base-centos-2 | child_node_new_connect | t | 2019-07-22 20:00:04 | new standby "base-centos-3" (ID: 103) has connected
104 | base-centos-4 | witness_register | t | 2019-07-22 19:59:59 | witness registration succeeded; upstream node ID is 102
103 | base-centos-3 | standby_follow | t | 2019-07-22 19:59:59 | standby attached to upstream node "base-centos-2" (ID: 102)
104 | base-centos-4 | repmgrd_upstream_reconnect | t | 2019-07-22 19:59:59 | witness monitoring connection to primary node "base-centos-2" (ID: 102)
102 | base-centos-2 | repmgrd_reload | t | 2019-07-22 19:59:58 | monitoring cluster primary "base-centos-2" (ID: 102)
101 | base-centos-1 | repmgrd_standby_reconnect | t | 2019-07-22 19:59:58 | node has become a standby, monitoring connection to upstream node 102
102 | base-centos-2 | standby_switchover | t | 2019-07-22 19:59:54 | node 102 promoted to primary, node 101 demoted to standby
101 | base-centos-1 | node_rejoin | t | 2019-07-22 19:59:54 | node 101 is now attached to node 102
102 | base-centos-2 | standby_promote | t | 2019-07-22 19:59:54 | server "base-centos-2" (ID: 102) was successfully promoted to primary

Bank BRI Dukung Indonesia Fintech Summit Expo 2019 dengan Platform BRIAPI

Big Data, BRI, API, BRIAPI, BRI Developer API, API BRI

Dalam rangkaian kegiatan ini Bank BRI menggelar kompetisi pengembangan layanan berbasis BRIAPI sebagai upaya melahirkan inovasi baru maupun solusi dari permasalahan yang ada di tengah masyarakat bernama “BRI Hackathon Digital Challenges”. Ajang ini merupakan gelaran yang bertujuan menciptakan solusi dan inovasi-inovasi terbaru untuk membangun ekosistem digital di Indonesia. Seiring berkembangnya teknologi, industri jasa keuangan pun ikut berevolusi termasuk munculnya financial technology (fintech). Pembayaran secara non tunai atau cashless kini bisa dilakukan dalam genggaman dengan berbekal smartphone. Fenomena ini menjadi salah satu tema yang diangkat pada Indonesia Fintech Summit Expo (IFSE) 2019.

“Kita ingin menantang para pengembang aplikasi agar melahirkan produk dan layanan baru bagi masyarakat menggunakan BRIAPI yang sudah kita sediakan untuk memenuhi berbagai kebutuhan,” jelas Indra, Direktur Digital Teknologi Informasi dan Operasi Bank BRI.

Mengusung tema Inovasi untuk inklusi, acara ini diikuti oleh 110 perusahaan atau startup fintech dan dihadiri oleh 36 pembicara. Asosiasi Fintech Indonesia (AFTECH) bekerja sama dengan Otoritas Jasa Keuangan (OJK) dan Bank Indonesia menyelenggarakan IFSE 2019 selama dua hari pada 23-24 September 2019 di Jakarta Convention Center (JCC), Senayan, Jakarta dengan dukungan penuh dari PT Bank Rakyat Indonesia (Persero) Tbk.

“Sebagai bank dengan jaringan terbesar di Indonesia, kami ingin membuka peluang berkolaborasi dengan startup fintech. Kami sangat terbuka bagi startup fintech untuk memanfaatkan produk Open Banking BRI atau platform digital milik BRI yakni BRIAPI (BRI Application Programming Interface),” ungkap Direktur Digital Teknologi Informasi dan Operasi Bank BRI, Indra Utoyo.

BRIAPI diharapkan bisa menjadi jembatan penghubung antara Bank BRI dan industri startup yang terus berkembang. Terutama untuk meningkatkan brand awareness transformasi digital yang telah dilakukan Bank BRI kepada pelaku startup. Namun lebih dari itu, BRIAPI menjadi cara bagi Bank BRI untuk membuka potensi kerja sama dengan sekitar 50 startup yang nantinya terpilih dalam event hackhaton tersebut.

IFSE 2019 juga akan dimanfaatkan BRI untuk berbagi informasi mengenai transformasi digital yang telah dilakukan, termasuk tentang pentingnya membangun ekosistem digital. Forum diskusi ini diharapkan mampu memberi gambaran lebih dalam bagi industri fintech, penggiat startup fintech, maupun pengunjung yang hadir terkait ekosistem digital dalam mendukung inklusi keuangan di Indonesia.

Bentuk kerja samanya antara lain dilakukan oleh BRI Ventures yang akan berperan sebagai investor untuk membangun startup fintech terpilih yang fokus dan kuat pada pembentukan ekosistem. Nilai investasi awal yang disiapkan BRI Ventures guna mengembangkan startup fintech terpilih bisa mencapai USD 250 juta.

Industri fintech kian tumbuh pesat di Indonesia. Mengacu data yang dirilis AFTECH pada tahun ini, dari 235 startup fintech berbagai sektor pada tahun 2018 lalu, sektor payment mencatatkan porsi terbesar mencapai 39%, dan kemudian diikuti oleh sektor lending atau pinjaman di angka 32%. Dari jumlah tersebut, saat ini sudah terdapat berbagai fintech yang bekerja sama dengan Bank BRI diantaranya Gojek, Shopee, Tokopedia, Dana, Investree, dsb.

Artikel ini merupakan saduran dari “Bangun Ekosistem Digital, Bank BRI Dukung Indonesia Fintech Summit Expo 2019” di OkeZone

Daftar API Bank Lokal Indonesia

Big Data, BRI, API, BRIAPI, BRI Developer API, API BRI

Dahulu programming hanya berkutat di aplikasi Desktop saja, jarang sekali ada interaksi dengan dunia luar. Namun segalanya berubah sejak negara API menyerang. Lau… Ada gak sih API lokal Indonesia? Setidaknya kamu pasti pernah membatin bertanya-tanya bukan! Ternyata ada loh, dan banyak. Siapa tahu nantinya kamu berencana membuat software menggunakan API dari salah satu yang ada pada list di bawah. Berikut ini kami sajikan daftar API lokal Indonesia yang dapat kita manfaatkan. 

Bank

Nama API Developer URL Status Deskripsi Auth
Bank BRI BRIAPI Link Aktif API dari Bank BRI apiKey
Bank BCA BCA Dev Link Aktif API dari Bank BCA apiKey

E-Commerce

Nama API Developer URL Status Deskripsi Auth
Bukalapak Bukalapak Dev Link Aktif API dari e-commerce terkenal di Indonesia sebagai situs jual-beli daring (online) apiKey
Matahari Mall API for Seller Matahari Mall Dev Link Aktif API untuk penjual di Matahari Mall apiKey
Tiket.com API Tiket.com Dev Link Aktif API untuk transaksi pada tiket.com yang merupakan situs penjualan tiket kereta api, tiket pesawat, dan lain-lain. apiKey

Finansial

Nama API Developer URL Status Deskripsi Auth
Bisatopup Bisatopup Link Aktif Melalui API ini dapat melakukan transaksi seperti beli pulsa, bayar token listrik, dan lain-lain. apiKey
Jurnal API jurnal.id Link Aktif API untuk software laporan keuangan. Oauth / apiKey
Midtrans – Payment gateway Midtrans Link Aktif Gateway atau gerbang untuk transaksi pembayaran. apiKey
iPaymu iPaymu Link Aktif Gateway atau gerbang untuk transaksi pembayaran. apiKey

Manfaatkan Platform API BRI untuk BRI Hackaton Digital Challenges

Big Data, BRI, API, BRIAPI, BRI Developer API, API BRI

PT Bank Rakyat Indonesia (Persero) Tbk menggelar kompetisi bagi startup financial technology (fintech) untuk menciptakan solusi dan inovasi untuk membangun ekosistem keuangan digital dalam negeri. Kompetisi bertajuk BRI Hackaton Digital Challenges tersebut menyasar lima puluh startup fintech untuk bekerja sama mengembangkan inovasi lewat platform digital BRIAPI (BRI Application Programming Interface). Ajang kompetisi yang diluncurkan di acara Indonesia Fintech Summit & Expo 2019  ini menjadi cara BRI mengembangkan BRIAPI sebagai fitur atau layanan yang bisa digunakan oleh pihak ketiga (startup). Nantinya, BRI Ventures akan berperan sebagai investor untuk membuka potensi kerja sama dengan 50 startup fintech yang terpilih.

“Sebagai bank dengan jaringan terbesar di Indonesia, kami ingin membuka peluang berkolaborasi dengan startup fintech,” papar Direktur Digital, Teknologi Informasi dan Operasi Bank BRI Indra Utoyo. “Kami sangat terbuka bagi startup fintech untuk memanfaatkan produk Open Banking BRI atau platform digital BRIAPI.”

Saat ini sudah tersedia empat puluh API BRI yang siap digunakan dengan fitur direct debit, fund transfer, dan bill payment. Platform BRIAPI sendiri telah digunakan oleh beberapa rekanan BRI mulai dari instansi pemerintahan seperti TNP2K (Tim Nasional Percepatan Penanggulangan Kemiskinan), hingga sejumlah perusahaan teknologi seperti TokopediaGojek, dan Lazada.

“Nilai investasi awal yang disiapkan BRI Ventures bisa mencapai US$250 juta (Rp3,5 triliun),” kata Indra. BRIAPI dikembangkan untuk menjadi jembatan penghubung antara BRI dengan industri startup yang terus berkembang. BRIAPI merupakan produk perseroan yang memungkinkan pihak ketiga untuk menggunakan fitur atau fungsi layanan finansial BRI dalam platform milik mereka dengan cepat dan aman. Dengan penerapan BRIAPI, BRI menjadi bank dengan sistem open API pertama di Indonesia yang bersertifikasi ISO 27001.

BRIAPI, Platform API dari BRI untuk Fintech di Indonesia

Big Data, BRI, API, BRIAPI, BRI Developer API, API BRI

Seiring berkembangnya teknologi, industri jasa keuangan pun ikut berevolusi termasuk munculnya teknologi keuangan alias financial technology (fintech). Pembayaran secara non tunai atau cashless kini bisa dilakukan dalam genggaman dengan berbekal smartphone. Berangkat dari fenomena ini, PT Bank Rakyat Indonesia (Persero) Tbk pun membuka peluang bekerja sama dengan perusahaan rintisan alias startup fintech. “Sebagai bank dengan jaringan terbesar di Indonesia, kami ingin membuka peluang berkolaborasi dengan startup fintech. Kami sangat terbuka bagi startup fintech untuk memanfaatkan produk Open Banking BRI atau platform digital milik BRI yakni BRIAPI (BRI Application Programming Interface),” ungkap Indra Utoyo, Direktur Digital, Teknologi Informasi dan Operasi BRI dalam keterangannya, Selasa (24/9/2019).

BRI pun menggelar kompetisi pengembangan layanan berbasis BRIAPI sebagai upaya melahirkan inovasi baru maupun solusi, yakni BRI Hackathon Digital Challenges. Tujuannya untuk menciptakan solusi dan inovasi-inovasi terbaru untuk membangun ekosistem digital di Indonesia. “Kita ingin menantang para pengembang aplikasi agar melahirkan produk dan layanan baru bagi masyarakat menggunakan BRIAPI yang sudah kita sediakan untuk memenuhi berbagai kebutuhan,” jelas Indra. BRIAPI merupakan produk perseroan yang memungkinkan pihak ketiga untuk menggunakan fitur atau fungsi layanan finansial BRI dalam platform milik mereka dengan cepat dan aman. Dengan penerapan BRIAPI, BRI menjadi bank dengan sistem open API pertama di Indonesia yang bersertifikasi ISO 27001.

Produk API BRI ini diharapkan bisa menjadi jembatan penghubung antara BRI dan industri startup yang terus berkembang. Utamanya untuk meningkatkan brand awareness transformasi digital yang telah dilakukan Bank BRI kepada pelaku startup. Namun lebih dari itu, BRIAPI menjadi cara bagi BRI untuk membuka potensi kerja sama dengan sekitar 50 startup yang nantinya terpilih dalam event hackhaton tersebut. Bentuk kerja samanya antara lain dilakukan oleh BRI Ventures yang akan berperan sebagai investor untuk membangun startup fintech terpilih yang fokus dan kuat pada pembentukan ekosistem. Nilai investasi awal yang disiapkan BRI Ventures guna mengembangkan startup fintech terpilih bisa mencapai 250 juta dollar AS.

Artikel ini telah tayang di Kompas.com dengan judul “BRI Buka Peluang Fintech Manfaatkan Platform Digitalnya”
 

BRIAPI: Persembahan BRI untuk para Developer Software

Big Data, BRI, API, BRIAPI, BRI Developer API

Salah satu terobosan inovasi yang dilakukan BRI adalah menyediakan BRI Developer API (Application Programming Interface) untuk pengembang aplikasi yang ingin berinteraksi dengan pelanggan BRI yaitu [BRIAPI](https://developers.bri.co.id). BRIAPI merupakan produk perseroan yang memungkinkan pihak ketiga untuk menggunakan fitur atau fungsi layanan finansial dari Bank BRI dalam platform milik mereka dengan cepat dan aman. Penerapan BRIAPI dengan ISO 27001 menjadikan Bank BRI sebagai bank dengan system open API pertama di Indonesia yang bersertifikasi ISO 27001.

Sertifikasi ISO 27001 membuktikan BRIAPI memiliki kejelasan flow operasional (clarity), pengajuan dan peran dari bisnis [BRIAPI](https://developers.bri.co.id) menjadi lebih cepat (agility), data yang tersimpan di BRIAPI terjamin aman dan tidak akan bocor ke pihak lain (safety), meningkatkan kepatuhan akan keamanan sistem informasi terhadap aturan yang berlaku (compliance), menyiapkan penanganan atas risiko yang dapat terjadi pada sistem BRIAPI (risk management), serta menekan potensi timbulnya fraud yang dapat membahayakan reputasi dari BRI (Reputation).

Saat ini platform [BRIAPI](https://developers.bri.co.id) sendiri telah digunakan oleh beberapa rekanan BRI mulai dari instansi pemerintahan dan digital startup seperti Tokopedia, Gojek, Lazada, TNP2K (Tim Nasional Percepatan Penanggulangan Kemiskinan), KJMIS (Koperasi Jaringan Masyarakat Indonesia Sejahtera) dan instansi atau tekfin yang lain. BRI berharap sertifikasi ini juga dapat menjadikan Bank BRI tumbuh semakin cepat di dunia digital dan semakin maju dengan teknologi, guna melayani nasabah dengan lebih baik lagi sehinga “No One Left Behind”

BRIAPI, Produk dari BRI untuk Developer Software, Dapat ISO 27001

Big Data, BRI, API, BRIAPI, BRI Developer API, API BRI

BRI mendapatkan ISO 27001 untuk product Open Banking BRI, yaitu BRIAPI (BRI Application Programming Interface). BRI Developer API ini merupakan produk perseroan yang memungkinkan pihak ketiga untuk menggunakan fitur atau fungsi layanan finansial dari Bank BRI dalam platform milik mereka dengan cepat dan aman. Penerapan BRIAPI dengan ISO 27001 menjadikan Bank BRI sebagai bank dengan system open API pertama di Indonesia yang bersertifikasi ISO 27001. Adapun sertifikasi ISO27001 tersebut didapatkan dari BSI British Standards Institution (BSI), sebuah lembaga sertifikasi internasional yang berbasis di London, Inggris. 

“Kami bersyukur BRIAPI yang kami terapkan berhasil meraih sertifikasi ISO 27001 dan capaian ini akan menjadi semangat kami untuk terus mengembangkan produk-produk berbasis digital teknologi lainnya dan mengarahkan Bank BRI menjadi Open Banking platform” ujar Direktur IT dan Operasi Bank BRI Indra Utoyo dalam keterangan tertulis, Rabu (8/5/2019).

Dia mengatakan melalui ISO 27001 ini, BRIAPI dapat semakin mantap dimanfaatkan oleh partner yang membutuhkan layanan finansial dari Bank BRI sekaligus mendorong percepatan kolaborasi secara digital. 

“Saat ini sudah tersedia 40 API yang siap untuk digunakan, dengan fitur andalan seperti direct debit, fund transfer, dan bill payment. Platform BRIAPI sendiri telah digunakan oleh beberapa rekanan BRI mulai dari instansi pemerintahan dan digital startup seperti Tokopedia, Gojek, Lazada, TNP2K (Tim Nasional Percepatan Penanggulangan Kemiskinan) dan KJMIS (Koperasi Jaringan Masyarakat Indonesia Sejahtera). Kami berharap sertifikasi ini juga dapat menjadikan Bank BRI tumbuh semakin cepat di dunia digital dan semakin maju dengan teknologi, guna melayani nasabah dengan lebih baik lagi” tutup Indra.

Sertifikasi ISO 27001 membuktikan BRIAPI memiliki kejelasan flow operasional (clarity), pengajuan dan peran dari bisnis BRIAPI menjadi lebih cepat (agility), data yang tersimpan di BRIAPI terjamin aman dan tidak akan bocor ke pihak lain (safety), meningkatkan kepatuhan akan keamanan sistem informasi terhadap aturan yang berlaku (compliance), menyiapkan penanganan atas risiko yang dapat terjadi pada sistem BRIAPI (risk management), serta menekan potensi timbulnya fraud yang dapat membahayakan reputasi dari BRI (reputation).

Bank BRI Pamerkan BRI API di Ajang Google Cloud Summit

Big Data, BRI, API, BRIAPI, BRI Developer API, API BRI

Direktur Teknologi Informasi dan Operasi Bank BRI, Indra Utoyo, menjadi pembicara dalam acara Google Cloud Summit di JIExpo Convention Center dan Theatre (05/09) memperkenalkan Portal BRI API untuk pada Developers yang ingin menggunakan BRI API. Google Cloud Summit kali ini adalah yang ketiga kalinya yang diselenggarakan di Jakarta, sebagai event rutin tahunan Google di setiap negara. Kegiatan ini juga mengundang seluruh pemain besar IT dan korporasi, terutama pihak-pihak yang telah bekerjasama atau memiliki antusiasme terhadap teknologi Google.

Dalam acara tersebut, Indra Utoyo menyampaikan komitmen Bank BRI sebagai salah satu lembaga keuangan terbesar di Indonesia untuk tetap fokus pada segmen mikro kecil menengah, membantu pelaku UMKM (Usaha Mikro, Kecil dan Menengah) di tanah air sehingga mereka memiliki harapan untuk meningkatkan kesejahteraan hidup. Sehingga pada akhirnya pelaku UMKM akan menjadi backbone perekonomian Indonesia. 

Data yang besar tanpa teknologi yang mumpuni tidak akan menghasilkan solusi layanan yang terbaik. Oleh karena itu, Bank BRI telah meningkatkan kemampuannya untuk melompati persaingan teknologi finansial dengan BRI Developer API. BRI Developer API ini menggunakan Apigee API Google Cloud sebagai intinya. Dengan portal BRI API, waktu yang dibutuhkan untuk menggabungkan Bank BRI dengan mitra baru dapat berlangsung lebih cepat dari enam bulan menggunakan teknologi host-to-host menjadi kurang dari satu jam menggunakan BRI API. “Sejak Agustus 2016, kami merupakan penyedia API pertama di Indonesia yang bisa memberikan layanan perbankan dalam 1 jam. Saat ini sudah lebih dari Rp 3 Triliun transaksi yang dilakukan melalui BRI API,” kata Indra Utoyo.

Salah satu keunggulan yang dimiliki Bank BRI adalah jumlah data yang massive hingga ke segmen ultra-mikro di seluruh pelosok tanah air. Dengan keunggulan data besar, Bank BRI berfokus untuk membuat manajemen risiko yang lebih efisien dan berkualitas.

Lebih lanjut Indra Utoyo juga menyampaikan bahwa, Bank BRI merupakan satu-satunya institusi di Indonesia yang telah mendapatkan sertifikasi ISO 270001 untuk big data. “Hal ini menunjukkan komitmen Bank BRI dalam menjaga keamanan dan kerahasiaan data nasabah,” imbuh Indra.

Dengan inovasi digital yang dilakukan Bank BRI, diharapkan dapat mendorong pertumbuhan ekonomi semakin merata hingga segmen ultra-mikro dan literasi finansial yang lebih tinggi di masyarakat Indonesia guna mencapai inklusi finansial sebesar 75% dari populasi warga negara Indonesia di tahun 2019.

Belajar Programming Web Mulai Dari Mana?

Pojok Programmer Code Factory Belajar Programming Berbasis Web PHP HTML CSS Mulai Dari Mana

Code Factory | Skill pemrograman sebenarnya adalah sebuah skill yang cukup mudah dipelajari, dengan syarat kita menyukai-nya dalam artian kita harus punya passion, dan tahu arah-nya dalam artian kita harus tahu apa yang lebih dahulu harus kita pelajari dan kemudian sedikit demi sedikit meningkatkan ketrampilan yang kita miliki secara terarah. Passion diperlukan karena belajar pemrograman sering kala membuat kita stress saat kita menemui problem yang sulit diselesaikan. Seorang programmer sejati sangat menyukai tantangan, dan problem yang dia hadapi adalah tantangan yang harus diselesaikan. Untuk itu perlu kita ketahui bersama roadmap untuk belajar web programming harus mulai dari mana?

Syarat kedua adalah arahan atau roadmap, dan roadmap inilah yang biasanya tidak dimiliki oleh programmer yang belajar secara otodidak tanpa mengikuti bangku kuliah formal. Seorang yang mempunya passion yang tinggi namun tanpa arahan cenderung kemajuannya lambat atau tidak maju sama sekali,  Artikel ini mencoba menjawab roadmap yang harus dilalui seseorang yang ingin menjadi programmer tingkat pemula

Pertanyaan yang umumnya muncul adalah, “Saya ingin belajar pemrograman web menggunakan PHP?” Sebenarnya PHP hanyalah bahasa pemrograman saja, yang jauh lebih penting adalah mempelajari konsep-nya. Konsep penting dipahami karena dengan memahami konsep dasar pemrograman ini maka kita akan dengan mudah beradaptasi dengan bahasa pemrograman lainnya, misalkan javascript, java, vb.net dan lain-lain. Jika kita sudah memahami konsep pemrograman, maka berganti bahasa pemrograman lain hanya semudah mempelajari sintaks bahasa bersangkutan saja. Oleh karena itu, ikutilah tahapan-tahapan berikut ini untuk bisa menjadi seorang programmer berbasis web yang handal dengan cepat dan efisien

  1. Belajar Bahasa Inggris
  2. Pelajari Dasar HTML dan CSS
  3. Pelajari Konsep Pemrograman Terstruktur (Imperative)
  4. Pelajari Konsep Pemrograman Berorientasi Obyek (PBO/OOP)
  5. Pelajari Algoritma, Struktur Data
  6. Pelajari Pemanfaatan Framework untuk mempercepat proses pembuatan aplikasi yang kita inginkan

Tahapan pertama adalah belajar bahasa inggris… Menguasai bahasa inggris menjadi point penting saat belajar coding atau programmring, karena bisa dikatakan semua istilah dalam pemrograman yang ada sekarang menggunakan bahasa Inggris. Semua kata kunci (keyword) seperti if else while, adalah bahasa Inggris. Saat belajar algoritma, ketemu lagi dengan linked list, queue, structure, array. Bahasa Inggris juga. Lebih parah lagi kalau code yang kita buat error, maka pesan error (error message) yang muncul semuanya dalam bahasa Inggris… So, English is a must.

Tahapan kedua adalah mempelajari dasar HTML meliputi hal-hal berikut ini

  • Pelajari HTML Tag Dasar, meliputi elemen dasar seperi html, body, header, footer, div, p, table, thead, tbody, tr, th, td, ul, ol, dsb
  • Mampu Membuat Layout HTML dan elemen nya menggunakan div secara manual
  • Pelajari HTML Form, meliputi elemen form seperti form, input, select, textarea, option, button, dsb
  • Mampu Membuat Form HTML secara manual
  • Mempelajari styling dasar menggunakan CSS

Tahapan ketiga adalah memahami Konsep Pemrograman Terstruktur/=, atau biasa juga disebut Pemrograman Imperatif, atau Pemrograman Prosedural. Konsep inilah yang harus benar-benar dipahami sebelum bisa membuat aplikasi serius. Semua bahasa pemrograman terstruktur pasti ada konsep-konsep berikut ini. 

  • variable dan konstanta
  • statement, operator, dan operator precedence
  • logika percabangan, atau disebut juga decision control structure (if-else, dsb.)
  • logika perulangan atau disebut juga repetitin control structure (while loop, dsb.)
  • struktur data sederhana (array, enum, collection)
  • memformat dan menampilkan string
  • prosedur dan fungsi (procedure and function)

Tahapan keempat Kemudian, yang harus kita pelajari adalah pemrograman berorientasi obyek (object oriented programming), karena hampir semua bahasa pemrograman sudah mendukung OOP. Ada beberapa tambahan konsep yang harus dipahami meliputi,

  • Class dan Instance
  • Constructor dan Destructor
  • Abstraction dan Encapsulation
  • Namespace dan Assemblies
  • Inheritance dan Interface
  • Polymorphism

Dengan memahami OOP maka kita bisa dengan mudah membuat aplikasi Hello World menggunakan OOP 🙂

Pada tahapan kelima yang perlu dipelajari adalah algoritma. Algoritma menjadi penting karena algoritma adalah nyawa dari aplikasi kita. Jika kita yang sedang belajar programming memerlukan arahan dan roadmap, maka algoritma yang menentukan arah dari program yang nantinya akan kita buat dan membantu kita proses problem solving dan menemukan solusi terhadap permasalahan programming yang kita hadapi. Perlu diketahui juga, bahwa algoritma tidak terbatas pada algoritma bubble sort, quick sort, depth-first search, breadth-first search, djikstra, atau sebangsanya, tapi secara umum algoritma adalah urutan langkah-langkah yang harus kita lakukan untuk dalam menyelesaikan suatu masalah. Sebagai contoh, berikut ini adalah algoritma minum kopi:

  1. Siapkan bahan
    • Ambil gelas
    • Ambil kopi, masukkan ke dalam gelas
    • Ambil gula, masukkan ke dalam gelas
  2. Siapkan air panas
    • Ambil panci
    • Isi panci dengan air
    • Taruh oanci di atas kompor
    • Nyalakan kompor
    • Tunggu sampai air mendidih
  3. Seduh kopi
    • Tuangkan air panas ke dalam gelas
    • Aduk kopi hingga merata
  4. Hidangkan
    • Letakkan gelas di atas nampan
    • Bawa ke meja
    • Ambil gelas dari nampan taruh ke meja 
    • Tunggu hingga kopi agak dingin
    • Minumlah kopi kita

Dalam mempelajari algoritma, pasti kita akan berkenalan juga dengan pseudocode. Sederhananya, pseudocode adalah urutan aksi yang harus kita lakukan dalam program yang akan kita buat. Dalam pseudocode yang kita masukkan hanyalah aksi yang harus kita lakukan, tidak perlu memasukkan hal-hal teknis seperti deklarasi variable dan inisialisasi varibel. langkah selanjutnya adalah menerjemahkan pseudocode tersebut ke dalam bahasa pemrograman yang kita inginkan.

Dalam membuat sebuah algoritma, biasanya tidak bisa sekali jadi. Kita sebagai programmer harus berpikir detil dalam menyusun langkah-langkah program kita, karena bisa jadi ada langkah yang terlewat atau urutan langkah yang salah, karena kesalah menyusun algoritma ini bisa berujung pada bug di dalam aplikasi yang kita bangun. Sebagai contoh, algoritma di atas akan membuat rumah kita kebakaran…. loh koq! Karena kita melupakan langkah untuk mematikan kompor! Ha… ha… ha…!

Setelah kita memahami seluruh hal dasar di atas (konsep pemrograman terstruktur, konsep pemrograman berorientasi obyek, dan algoritma) barulah kita bisa naik tingkat berikutnya mempelajari hal-hal lain yang lebih rumit, misalkan framework, akses database, pemrograman asinkron, dan lain sebagainya. Misalkan saat kita menggunakan framework Laravel, kita akan bertemu dengan template engine Blade, yang pada dasarnya adalah HTML dan CSS…. kalau tahapan pertama saja kamu belum paham, bagaimana mungkin bisa cepat belajar Laravel

Selamat belajar!

 

Code Fatory Pojok Programmer Belajar Programming Mulai Dari Mana

 

.

Lorem Ipsum Kolor si Ahmet

The standard Lorem Ipsum passage, used since the 1500s

“Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.”

Section 1.10.32 of “de Finibus Bonorum et Malorum”, written by Cicero in 45 BC

“Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?”