<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Zimera Corporation</title>
    <description>The latest articles on Forem by Zimera Corporation (@zimeracorp).</description>
    <link>https://forem.com/zimeracorp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F3848%2F7eccf16d-9851-48c1-af09-213477ddabc4.jpg</url>
      <title>Forem: Zimera Corporation</title>
      <link>https://forem.com/zimeracorp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/zimeracorp"/>
    <language>en</language>
    <item>
      <title>Bypass Transparent DNS Proxy</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Thu, 21 Jul 2022 05:48:24 +0000</pubDate>
      <link>https://forem.com/zimeracorp/bypass-transparent-dns-proxy-g8i</link>
      <guid>https://forem.com/zimeracorp/bypass-transparent-dns-proxy-g8i</guid>
      <description>&lt;p&gt;Since some days ago, I can not update my Devuan box. The error is "Temporary failure in name resolution". This is strange provided that Brave Browser can access deb.devuan.org. Later, I figured out that my ISP (Indihome - &lt;a href="https://www.indihome.co.id/"&gt;https://www.indihome.co.id/&lt;/a&gt;) uses transparent DNS proxy and Brave Browser has &lt;strong&gt;Secure DNS&lt;/strong&gt; (also known as &lt;strong&gt;DNS Over HTTPS&lt;/strong&gt;) so I can access deb.devuan.org from Brave Browser, but I can not access deb.devuan.org from command line. &lt;/p&gt;

&lt;p&gt;This is why eventhough I use 8.8.8.8 in my /etc/resolv.conf, all request to DNS server is intercepted by them and then the request will be directed to ISP for whatever they want. This is unacceptable behaviour but well, complaints won't be heard, so I choose to use DNS over https.&lt;/p&gt;

&lt;p&gt;I search for tools and found &lt;a href="https://github.com/m13253/dns-over-https"&gt;dns-over-https&lt;/a&gt;. This tool uses Go (1.13 or newer) so it's not a big deal for me since I already use Go. Just clone the repo and compile and then execute doh-client (&lt;a href="https://go.dev/"&gt;Go&lt;/a&gt; should be available on your system):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/m13253/dns-over-https
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;dns-over-https
&lt;span class="nv"&gt;$ &lt;/span&gt;make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I don't use systemd, So just go to doh-client and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;doh-client
&lt;span class="nv"&gt;$ &lt;/span&gt;./doh-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change /etc/resolv.conf to use 127.0.0.1 as nameserver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nameserver 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I can use &lt;strong&gt;apt&lt;/strong&gt; from shell like before.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getting Started with Redis and RedisGraph</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Thu, 21 Oct 2021 10:06:04 +0000</pubDate>
      <link>https://forem.com/zimeracorp/getting-started-with-redis-and-redisgraph-3mk8</link>
      <guid>https://forem.com/zimeracorp/getting-started-with-redis-and-redisgraph-3mk8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;A graph is a representation of data structure which emerge from Discrete Mathematics (more specifically, studied in Graph Theory) to represent interconnected data and solving any problems related with those interconnected data. Currently, there are two big graph implementation in software:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Triple, mainly represented by &lt;a href="https://www.w3.org/TR/rdf11-concepts/"&gt;RDF&lt;/a&gt; with &lt;a href="https://www.w3.org/TR/sparql11-overview/"&gt;SPARQL&lt;/a&gt; as its query language. In TripleStore, data is represented as &lt;em&gt;Subject-Predicate-Object&lt;/em&gt;. The database for this kind of data is usually called &lt;em&gt;TripleStore&lt;/em&gt;. An example of TripleStore is &lt;a href="https://blazegraph.com/"&gt;BlazeGraph&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Property Graph, mainly represented as node and relationship in which they can have properties. The database for this kind of data is usually called &lt;em&gt;Graph Database&lt;/em&gt;. &lt;a href="https://tinkerpop.apache.org/"&gt;Gremlin - by TinkerPop project&lt;/a&gt; and &lt;a href="https://opencypher.org/"&gt;Cypher - by Neo4J&lt;/a&gt; are their query language (also &lt;a href="https://www.arangodb.com/docs/stable/aql/"&gt;AQL - Arango Query Language - by ArangoDB&lt;/a&gt;, but AQL does not only provides graph query language).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this article, we will explain Property Graph only. Some Graph DBMS which support Property Graph natively, for example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://janusgraph.org/"&gt;JanusGraph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neo4j.com/"&gt;Neo4J&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some other DBMS use already available DBMS engine to handle graph data, for example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; with graph extension, developed by a team at Apache Software Foundation as &lt;a href="https://age.apache.org/"&gt;Apache AGE&lt;/a&gt;. Apache AGE uses Gremlin.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.io/"&gt;Redis&lt;/a&gt; module for graph - &lt;a href="https://oss.redis.com/redisgraph/"&gt;RedisGraph&lt;/a&gt;. RedisGraph uses Cypher for its query language.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.yugabyte.com/"&gt;YugabyteDB&lt;/a&gt; provides a detail on &lt;a href="https://docs.yugabyte.com/latest/api/ysql/the-sql-language/with-clause/traversing-general-graphs/graph-representation/"&gt;how to represent and manipulate graph data using YugabyteDB&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's start with RedisGraph!&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis Installation
&lt;/h2&gt;

&lt;p&gt;If you already have Redis installed using your distro, you may use them provided that you use Redis version as required in &lt;a href="https://redis.io/modules"&gt;Redis module center&lt;/a&gt;. If not, just use your distro specific package manager. For example, in Debian-based distro, you may use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;redis-server redis-cli redis-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, go to RedisGraph installation. If you want to use the hard way - compile Redis, use this guide below. Redis src has beed downloaded from &lt;a href="https://redis.io/download"&gt;Redis website&lt;/a&gt;. In this article, I use version 6.2.6 with TLS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ tar -xvf redis-6.2.6.tar.gz
$ cd redis-6.2.6
$ make BUILD_TLS=yes
cd src &amp;amp;&amp;amp; make all
make[1]: Entering directory '/home/bpdp/master/postdoc-ugm/redis-6.2.6/src'
    CC Makefile.dep
...
...
...
    CC mt19937-64.o
    LINK redis-server
    INSTALL redis-sentinel
    CC redis-cli.o
redis-cli.c: In function ‘_serverAssert’:
redis-cli.c:485:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
  485 |     *((char*)-1) = 'x';
      |     ~~~~~~~~~~~~~^~~~~
    CC cli_common.o
    LINK redis-cli
    CC redis-benchmark.o
redis-benchmark.c: In function ‘_serverAssert’:
redis-benchmark.c:269:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
  269 |     *((char*)-1) = 'x';
      |     ~~~~~~~~~~~~~^~~~~
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory '/home/bpdp/master/postdoc-ugm/redis-6.2.6/src'
$ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, we've already got Redis compiled, ready to serve. The results are in &lt;code&gt;src/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; src/
total 63300
drwxr-xr-x 3 bpdp bpdp   12288 Okt 21 12:15 ./
drwxr-xr-x 7 bpdp bpdp    4096 Okt  4 17:59 ../
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   89642 Okt  4 17:59 acl.c
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp     426 Okt 21 12:15 acl.d
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  287152 Okt 21 12:15 acl.o
...
...
...
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 4877400 Okt 21 12:15 redis-benchmark&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   76300 Okt  4 17:59 redis-benchmark.c
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp     441 Okt 21 12:15 redis-benchmark.d
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  796440 Okt 21 12:15 redis-benchmark.o
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 9310280 Okt 21 12:15 redis-check-aof&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp    7243 Okt  4 17:59 redis-check-aof.c
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp     444 Okt 21 12:15 redis-check-aof.d
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   35744 Okt 21 12:15 redis-check-aof.o
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 9310280 Okt 21 12:15 redis-check-rdb&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   14772 Okt  4 17:59 redis-check-rdb.c
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp     444 Okt 21 12:15 redis-check-rdb.d
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   89992 Okt 21 12:15 redis-check-rdb.o
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 4678976 Okt 21 12:15 redis-cli&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  318821 Okt  4 17:59 redis-cli.c
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp     396 Okt 21 12:15 redis-cli.d
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  877064 Okt 21 12:15 redis-cli.o
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   66774 Okt  4 17:59 redismodule.h
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 9310280 Okt 21 12:15 redis-sentinel&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 9310280 Okt 21 12:15 redis-server&lt;span class="k"&gt;*&lt;/span&gt;
...
...
...
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   21090 Okt  4 17:59 zmalloc.c
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp     100 Okt 21 12:15 zmalloc.d
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp    5215 Okt  4 17:59 zmalloc.h
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   50152 Okt 21 12:15 zmalloc.o
&lt;span class="nv"&gt;$ &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just in case, if you want to check whether everything is ok, test them using &lt;code&gt;make test&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nb"&gt;test
cd &lt;/span&gt;src &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;test
&lt;/span&gt;make[1]: Entering directory &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/redis-6.2.6/src'&lt;/span&gt;
Cleanup: may take some time... OK
Starting &lt;span class="nb"&gt;test &lt;/span&gt;server at port 21079
&lt;span class="o"&gt;[&lt;/span&gt;ready]: 15259
...
...
...
Testing solo &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ok]: Active defrag
&lt;span class="o"&gt;[&lt;/span&gt;ok]: Active defrag big keys
&lt;span class="o"&gt;[&lt;/span&gt;ok]: Active defrag big list
&lt;span class="o"&gt;[&lt;/span&gt;ok]: Active defrag edge &lt;span class="k"&gt;case&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;64/64 &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;: defrag &lt;span class="o"&gt;(&lt;/span&gt;74 seconds&lt;span class="p"&gt;)&lt;/span&gt;

                   The End

Execution &lt;span class="nb"&gt;time &lt;/span&gt;of different units:
  0 seconds - unit/printver
  0 seconds - unit/type/incr
  1 seconds - unit/protocol
  1 seconds - unit/info
  1 seconds - unit/keyspace
  2 seconds - unit/auth
  0 seconds - unit/quit
  3 seconds - unit/type/hash
  2 seconds - unit/acl
  6 seconds - unit/type/set
  5 seconds - unit/multi
  6 seconds - unit/sort
  7 seconds - unit/type/string
  7 seconds - unit/scan
  7 seconds - unit/type/stream-cgroups
  8 seconds - unit/type/list
  13 seconds - unit/other
  15 seconds - unit/expire
  16 seconds - unit/type/list-2
  12 seconds - unit/latency-monitor
  0 seconds - integration/convert-zipmap-hash-on-load
  3 seconds - integration/logging
  21 seconds - unit/type/zset
  14 seconds - integration/aof
  17 seconds - integration/replication-2
  13 seconds - integration/rdb
  30 seconds - unit/type/list-3
  8 seconds - integration/failover
  31 seconds - unit/dump
  32 seconds - unit/type/stream
  1 seconds - unit/pubsub
  2 seconds - unit/slowlog
  27 seconds - integration/block-repl
  3 seconds - integration/redis-benchmark
  1 seconds - unit/limits
  20 seconds - integration/corrupt-dump-fuzzer
  3 seconds - unit/introspection
  16 seconds - integration/psync2-pingoff
  11 seconds - integration/redis-cli
  22 seconds - integration/corrupt-dump
  3 seconds - unit/bitfield
  6 seconds - unit/introspection-2
  2 seconds - unit/lazyfree
  4 seconds - unit/wait
  23 seconds - integration/psync2-reg
  1 seconds - unit/tls
  1 seconds - unit/oom-score-adj
  8 seconds - unit/memefficiency
  14 seconds - unit/scripting
  1 seconds - unit/shutdown
  10 seconds - unit/bitops
  1 seconds - unit/networking
  3 seconds - unit/tracking
  8 seconds - unit/pendingquerybuf
  21 seconds - unit/obuf-limits
  52 seconds - integration/replication-4
  53 seconds - integration/replication-3
  47 seconds - integration/psync2
  46 seconds - unit/hyperloglog
  54 seconds - unit/maxmemory
  54 seconds - north
  123 seconds - unit/aofrw
  165 seconds - integration/replication-psync
  227 seconds - integration/replication
  74 seconds - defrag

&lt;span class="se"&gt;\o&lt;/span&gt;/ All tests passed without errors!

Cleanup: may take some time... OK
make[1]: Leaving directory &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/redis-6.2.6/src'&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check whether you have this, shows that all tests passed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
...
\o/ All tests passed without errors!
...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, install Redis using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/bpdp/software/postdoc-ugm/redis-6.2.6/ &lt;span class="nb"&gt;install
cd &lt;/span&gt;src &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install
&lt;/span&gt;make[1]: Entering directory &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/redis-6.2.6/src'&lt;/span&gt;

Hint: It&lt;span class="s1"&gt;'s a good idea to run '&lt;/span&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="s1"&gt;' ;)

    INSTALL redis-server
    INSTALL redis-benchmark
    INSTALL redis-cli
make[1]: Leaving directory '&lt;/span&gt;/home/bpdp/master/postdoc-ugm/redis-6.2.6/src&lt;span class="s1"&gt;'
$
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't forget to change &lt;code&gt;PREFIX&lt;/code&gt; to a location in your own computer and then put them inside a text file so that we may source them whenever we need to use Redis (we use Fish Shell, if you use Bash or any other shell, change accordingly):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/env/fish/postdoc-ugm/redis-graph 
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; PATH &lt;span class="nv"&gt;$HOME&lt;/span&gt;/software/postdoc-ugm/redis-6.2.6/bin &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make background save more robust, use this (if this is not done, Redis will display warning):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl vm.overcommit_memory&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; password &lt;span class="k"&gt;for &lt;/span&gt;bpdp:
vm.overcommit_memory &lt;span class="o"&gt;=&lt;/span&gt; 1
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ source ~/env/fish/postdoc-ugm/redis-graph
$ redis-server
4596:C 21 Oct 2021 16:34:31.976 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4596:C 21 Oct 2021 16:34:31.976 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=4596, just started
4596:C 21 Oct 2021 16:34:31.976 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
4596:M 21 Oct 2021 16:34:31.976 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```

.

  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4596
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

4596:M 21 Oct 2021 16:34:31.977 # Server initialized
4596:M 21 Oct 2021 16:34:31.977 * Ready to accept connections

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At that point, we are ready to use Redis server from our &lt;code&gt;redis-cli&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;redis-cli
127.0.0.1:6379&amp;gt; &lt;span class="nb"&gt;help
&lt;/span&gt;redis-cli 6.2.6
To get &lt;span class="nb"&gt;help &lt;/span&gt;about Redis commands &lt;span class="nb"&gt;type&lt;/span&gt;:
      &lt;span class="s2"&gt;"help @&amp;lt;group&amp;gt;"&lt;/span&gt; to get a list of commands &lt;span class="k"&gt;in&lt;/span&gt; &amp;lt;group&amp;gt;
      &lt;span class="s2"&gt;"help &amp;lt;command&amp;gt;"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;help &lt;/span&gt;on &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="s2"&gt;"help &amp;lt;tab&amp;gt;"&lt;/span&gt; to get a list of possible &lt;span class="nb"&gt;help &lt;/span&gt;topics
      &lt;span class="s2"&gt;"quit"&lt;/span&gt; to &lt;span class="nb"&gt;exit

&lt;/span&gt;To &lt;span class="nb"&gt;set &lt;/span&gt;redis-cli preferences:
      &lt;span class="s2"&gt;":set hints"&lt;/span&gt; &lt;span class="nb"&gt;enable &lt;/span&gt;online hints
      &lt;span class="s2"&gt;":set nohints"&lt;/span&gt; disable online hints
Set your preferences &lt;span class="k"&gt;in&lt;/span&gt; ~/.redisclirc
127.0.0.1:6379&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we are ready with Redis Server and Client. It's time to get RedisGraph ready!&lt;/p&gt;

&lt;h2&gt;
  
  
  RedisGraph
&lt;/h2&gt;

&lt;p&gt;RedisGraph has some deps and those dependencies are &lt;em&gt;not included&lt;/em&gt; inside their source distribution. Therefore, we need to use Git with specific tag (as of today, v2.4.11 is the latest GA). Here's how to get the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/RedisGraph/RedisGraph &lt;span class="nt"&gt;-b&lt;/span&gt; v2.4.11 &lt;span class="nt"&gt;--recurse-submodules&lt;/span&gt; &lt;span class="nt"&gt;-j8&lt;/span&gt;
Cloning into &lt;span class="s1"&gt;'RedisGraph'&lt;/span&gt;...
remote: Enumerating objects: 49063, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;2906/2906&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1082/1082&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Total 49063 &lt;span class="o"&gt;(&lt;/span&gt;delta 1998&lt;span class="o"&gt;)&lt;/span&gt;, reused 2448 &lt;span class="o"&gt;(&lt;/span&gt;delta 1736&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 46157
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;49063/49063&lt;span class="o"&gt;)&lt;/span&gt;, 39.33 MiB | 114.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;38402/38402&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/RediSearch'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/RediSearch/RediSearch.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/RediSearch'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/googletest'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/google/googletest.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/googletest'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/libcypher-parser'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/RedisGraph/libcypher-parser.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/libcypher-parser'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/rax'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/antirez/rax.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/rax'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/readies'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/RedisLabsModules/readies.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/readies'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/xxHash'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/Cyan4973/xxHash.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/xxHash'&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/RediSearch'&lt;/span&gt;...
remote: Enumerating objects: 34395, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1802/1802&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1097/1097&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 34395 &lt;span class="o"&gt;(&lt;/span&gt;delta 1150&lt;span class="o"&gt;)&lt;/span&gt;, reused 1182 &lt;span class="o"&gt;(&lt;/span&gt;delta 696&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 32593        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;34395/34395&lt;span class="o"&gt;)&lt;/span&gt;, 23.62 MiB | 71.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;25261/25261&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/rax'&lt;/span&gt;...
remote: Enumerating objects: 668, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;25/25&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;14/14&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 668 &lt;span class="o"&gt;(&lt;/span&gt;delta 12&lt;span class="o"&gt;)&lt;/span&gt;, reused 19 &lt;span class="o"&gt;(&lt;/span&gt;delta 11&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 643        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;668/668&lt;span class="o"&gt;)&lt;/span&gt;, 236.14 KiB | 1.41 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;414/414&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/readies'&lt;/span&gt;...
remote: Enumerating objects: 2354, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;833/833&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;329/329&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 2354 &lt;span class="o"&gt;(&lt;/span&gt;delta 608&lt;span class="o"&gt;)&lt;/span&gt;, reused 675 &lt;span class="o"&gt;(&lt;/span&gt;delta 503&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 1521        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;2354/2354&lt;span class="o"&gt;)&lt;/span&gt;, 390.69 KiB | 17.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;1577/1577&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/libcypher-parser'&lt;/span&gt;...
remote: Enumerating objects: 3250, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;68/68&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;46/46&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 3250 &lt;span class="o"&gt;(&lt;/span&gt;delta 42&lt;span class="o"&gt;)&lt;/span&gt;, reused 43 &lt;span class="o"&gt;(&lt;/span&gt;delta 21&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 3182        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;3250/3250&lt;span class="o"&gt;)&lt;/span&gt;, 2.10 MiB | 28.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;2488/2488&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/xxHash'&lt;/span&gt;...
remote: Enumerating objects: 4784, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;345/345&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;188/188&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 4784 &lt;span class="o"&gt;(&lt;/span&gt;delta 189&lt;span class="o"&gt;)&lt;/span&gt;, reused 255 &lt;span class="o"&gt;(&lt;/span&gt;delta 143&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 4439        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;4784/4784&lt;span class="o"&gt;)&lt;/span&gt;, 2.54 MiB | 27.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;2922/2922&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/googletest'&lt;/span&gt;...
remote: Enumerating objects: 23334, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;234/234&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;142/142&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 23334 &lt;span class="o"&gt;(&lt;/span&gt;delta 120&lt;span class="o"&gt;)&lt;/span&gt;, reused 146 &lt;span class="o"&gt;(&lt;/span&gt;delta 81&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 23100        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;23334/23334&lt;span class="o"&gt;)&lt;/span&gt;, 9.49 MiB | 44.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;17191/17191&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/RediSearch'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'68430b3c838374478dd9ffe4e361534f572b16ff'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/googletest'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/google/googletest.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/RediSearch/deps/googletest'&lt;/span&gt;
Submodule &lt;span class="s1"&gt;'deps/readies'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;https://github.com/RedisLabsModules/readies.git&lt;span class="o"&gt;)&lt;/span&gt; registered &lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="s1"&gt;'deps/RediSearch/deps/readies'&lt;/span&gt;
Cloning to &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/RediSearch/deps/googletest'&lt;/span&gt;...
remote: Enumerating objects: 23334, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;234/234&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;148/148&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 23334 &lt;span class="o"&gt;(&lt;/span&gt;delta 120&lt;span class="o"&gt;)&lt;/span&gt;, reused 141 &lt;span class="o"&gt;(&lt;/span&gt;delta 75&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 23100        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;23334/23334&lt;span class="o"&gt;)&lt;/span&gt;, 9.56 MiB | 1.05 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;17185/17185&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Kloning ke &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/deps/RediSearch/deps/readies'&lt;/span&gt;...
remote: Enumerating objects: 2354, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;833/833&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;329/329&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;        
remote: Total 2354 &lt;span class="o"&gt;(&lt;/span&gt;delta 608&lt;span class="o"&gt;)&lt;/span&gt;, reused 675 &lt;span class="o"&gt;(&lt;/span&gt;delta 503&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 1521        
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;2354/2354&lt;span class="o"&gt;)&lt;/span&gt;, 390.69 KiB | 853.00 KiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;1577/1577&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/RediSearch/deps/googletest'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'dea0216d0c6bc5e63cf5f6c8651cd268668032ec'&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/RediSearch/deps/readies'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'89be267427c7dfcfaab4064942ef0f595f6b1fa3'&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/googletest'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'565f1b848215b77c3732bca345fe76a0431d8b34'&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/libcypher-parser'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'38cdee1867b18644616292c77fe2ac1f2b179537'&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/rax'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'ba4529f6c836c9ff1296cde12b8557329f5530b7'&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/readies'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'d59f3ad4e9b3d763eb41df07567111dc94c6ecac'&lt;/span&gt;
Submodule path &lt;span class="s1"&gt;'deps/xxHash'&lt;/span&gt;: checked out &lt;span class="s1"&gt;'726c14000ca73886f6258a6998fb34dd567030e9'&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we have RedisGraph source code complete with its dependencies. Time to install.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;To install, just do &lt;code&gt;make&lt;/code&gt; and put &lt;code&gt;redisgraph.so&lt;/code&gt; file as the result of RedisGraph compilation to any location that we prefer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;RedisGraph
&lt;span class="nv"&gt;$ &lt;/span&gt;make
...
...
...
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/thpool/pools.o
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/thpool/thpool.o
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/range/numeric_range.o
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/range/string_range.o
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/range/unsigned_range.o
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/cache/cache_array.o
    CC /home/bpdp/master/postdoc-ugm/RedisGraph/src/util/cache/cache.o
    CC redisgraph.so
objcopy &lt;span class="nt"&gt;--only-keep-debug&lt;/span&gt; redisgraph.so redisgraph.so.debug
objcopy &lt;span class="nt"&gt;--strip-debug&lt;/span&gt; redisgraph.so
objcopy &lt;span class="nt"&gt;--add-gnu-debuglink&lt;/span&gt; redisgraph.so.debug redisgraph.so
make[1]: Leaving directory &lt;span class="s1"&gt;'/home/bpdp/master/postdoc-ugm/RedisGraph/src'&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;Now, put &lt;code&gt;redisgraph.so&lt;/code&gt; file to any directory and then refer it in a configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;
/home/bpdp/software/postdoc-ugm
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;redis-6.2.6/redis.conf
loadmodule /home/bpdp/software/postdoc-ugm/redis/modules/redisgraph.so
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Let's Try RedisGraph!
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;redis-server /home/bpdp/software/postdoc-ugm/redis-6.2.6/redis.conf
5946:C 21 Oct 2021 16:51:57.090 &lt;span class="c"&gt;# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo&lt;/span&gt;
5946:C 21 Oct 2021 16:51:57.090 &lt;span class="c"&gt;# Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=5946, just started&lt;/span&gt;
5946:C 21 Oct 2021 16:51:57.090 &lt;span class="c"&gt;# Configuration loaded&lt;/span&gt;
5946:M 21 Oct 2021 16:51:57.091 &lt;span class="k"&gt;*&lt;/span&gt; monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-&lt;span class="sb"&gt;``&lt;/span&gt;__ &lt;span class="s1"&gt;''&lt;/span&gt;-._                                             
      _.-&lt;span class="sb"&gt;``&lt;/span&gt;    &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;  &lt;span class="sb"&gt;`&lt;/span&gt;_.  &lt;span class="s1"&gt;''&lt;/span&gt;-._           Redis 6.2.6 &lt;span class="o"&gt;(&lt;/span&gt;00000000/0&lt;span class="o"&gt;)&lt;/span&gt; 64 bit
  .-&lt;span class="sb"&gt;``&lt;/span&gt; .-&lt;span class="sb"&gt;```&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="sb"&gt;```&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;    _.,_ &lt;span class="s1"&gt;''&lt;/span&gt;-._                                  
 &lt;span class="o"&gt;(&lt;/span&gt;    &lt;span class="s1"&gt;'      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; _.-&lt;span class="s1"&gt;'|     Port: 6379
 |    `-._   `._    /     _.-'&lt;/span&gt;    |     PID: 5946
  &lt;span class="sb"&gt;`&lt;/span&gt;-._    &lt;span class="sb"&gt;`&lt;/span&gt;-._  &lt;span class="sb"&gt;`&lt;/span&gt;-./  _.-&lt;span class="s1"&gt;'    _.-'&lt;/span&gt;                                   
 |&lt;span class="sb"&gt;`&lt;/span&gt;-._&lt;span class="sb"&gt;`&lt;/span&gt;-._    &lt;span class="sb"&gt;`&lt;/span&gt;-.__.-&lt;span class="s1"&gt;'    _.-'&lt;/span&gt;_.-&lt;span class="s1"&gt;'|                                  
 |    `-._`-._        _.-'&lt;/span&gt;_.-&lt;span class="s1"&gt;'    |           https://redis.io       
  `-._    `-._`-.__.-'&lt;/span&gt;_.-&lt;span class="s1"&gt;'    _.-'&lt;/span&gt;                                   
 |&lt;span class="sb"&gt;`&lt;/span&gt;-._&lt;span class="sb"&gt;`&lt;/span&gt;-._    &lt;span class="sb"&gt;`&lt;/span&gt;-.__.-&lt;span class="s1"&gt;'    _.-'&lt;/span&gt;_.-&lt;span class="s1"&gt;'|                                  
 |    `-._`-._        _.-'&lt;/span&gt;_.-&lt;span class="s1"&gt;'    |                                  
  `-._    `-._`-.__.-'&lt;/span&gt;_.-&lt;span class="s1"&gt;'    _.-'&lt;/span&gt;                                   
      &lt;span class="sb"&gt;`&lt;/span&gt;-._    &lt;span class="sb"&gt;`&lt;/span&gt;-.__.-&lt;span class="s1"&gt;'    _.-'&lt;/span&gt;                                       
          &lt;span class="sb"&gt;`&lt;/span&gt;-._        _.-&lt;span class="s1"&gt;'                                           
              `-.__.-'&lt;/span&gt;                                               

5946:M 21 Oct 2021 16:51:57.092 &lt;span class="c"&gt;# Server initialized&lt;/span&gt;
5946:M 21 Oct 2021 16:51:57.094 &lt;span class="k"&gt;*&lt;/span&gt; &amp;lt;graph&amp;gt; Starting up RedisGraph version 2.4.11.
5946:M 21 Oct 2021 16:51:57.095 &lt;span class="k"&gt;*&lt;/span&gt; &amp;lt;graph&amp;gt; Thread pool created, using 8 threads.
5946:M 21 Oct 2021 16:51:57.095 &lt;span class="k"&gt;*&lt;/span&gt; &amp;lt;graph&amp;gt; Maximum number of OpenMP threads &lt;span class="nb"&gt;set &lt;/span&gt;to 8
5946:M 21 Oct 2021 16:51:57.095 &lt;span class="k"&gt;*&lt;/span&gt; Module &lt;span class="s1"&gt;'graph'&lt;/span&gt; loaded from /home/bpdp/software/postdoc-ugm/redis/modules/redisgraph.so
5946:M 21 Oct 2021 16:51:57.095 &lt;span class="k"&gt;*&lt;/span&gt; Ready to accept connections
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's try some &lt;code&gt;Cypher&lt;/code&gt; query from &lt;code&gt;redis-cli&lt;/code&gt; (query was taken from RedisGraph example):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;redis-cli
127.0.0.1:6379&amp;gt; GRAPH.QUERY MotoGP &lt;span class="s2"&gt;"CREATE (:Rider {name:'Valentino Rossi'})-[:rides]-&amp;gt;(:Team {name:'Yamaha'}), (:Rider {name:'Dani Pedrosa'})-[:rides]-&amp;gt;(:Team {name:'Honda'}), (:Rider {name:'Andrea Dovizioso'})-[:rides]-&amp;gt;(:Team {name:'Ducati'})"&lt;/span&gt;
1&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Labels added: 2"&lt;/span&gt;
   2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Nodes created: 6"&lt;/span&gt;
   3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Properties set: 6"&lt;/span&gt;
   4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Relationships created: 3"&lt;/span&gt;
   5&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Cached execution: 0"&lt;/span&gt;
   6&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Query internal execution time: 61.852344 milliseconds"&lt;/span&gt;
127.0.0.1:6379&amp;gt; GRAPH.QUERY MotoGP &lt;span class="s2"&gt;"MATCH (r:Rider)-[:rides]-&amp;gt;(t:Team) WHERE t.name = 'Yamaha' RETURN r.name, t.name"&lt;/span&gt;
1&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; r.name
   2&lt;span class="o"&gt;)&lt;/span&gt; t.name
2&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; Valentino Rossi
      2&lt;span class="o"&gt;)&lt;/span&gt; Yamaha
3&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Cached execution: 0"&lt;/span&gt;
   2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"Query internal execution time: 55.436734 milliseconds"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are all set! When we close Redis server, the graph will persist. Happy hacking!.&lt;/p&gt;

</description>
      <category>graph</category>
      <category>redis</category>
      <category>redisgraph</category>
      <category>opencypher</category>
    </item>
    <item>
      <title>Belajar Rust - 03: IDE untuk Rust</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Sat, 11 Sep 2021 05:32:13 +0000</pubDate>
      <link>https://forem.com/zimeracorp/belajar-rust-03-ide-untuk-rust-4p3e</link>
      <guid>https://forem.com/zimeracorp/belajar-rust-03-ide-untuk-rust-4p3e</guid>
      <description>&lt;p&gt;IDE (&lt;em&gt;Integrated Development Environment&lt;/em&gt;) adalah software yang digunakan sebagai peranti pengembangan terintegrasi. IDE sangat penting dalam membangun aplikasi. Produktivitas pemrogram biasanya sangat tergantung dari kepiawaiannya menggunakan IDE. Bab ini membahas tentang IDE yang bisa digunakan untk membangun aplikasi menggunakan Rust. Ada beberapa software dasar yang akan dijelaskan dan digunakan dalam pembahasan ini, yaitu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.vim.org/"&gt;Vim&lt;/a&gt; / &lt;a href="https://neovim.io/"&gt;NeoVim&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt; / &lt;a href="https://vscodium.com/"&gt;VSCodium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pada umumnya, terkait dengan IDE, ada 2 kategori:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;IDE yang memang sejak awal khusus dirancang untuk suatu bahasa pemrograman tertentu. Contoh dari IDE ini antara lain adalah IDE Borland Delphi, IntelliJ IDEA, Apache NetBeans, dan lain-lain. Software jenis ini biasanya juga memberikan fasilitas pembuatan plugins untuk bahasa pemrograman lain dengan mekanisme plugins yang khusus untuk IDE tersebut, contohnya adalah Apache NetBeans yang bisa digunakan untuk C/C++, PHP, dan lain-lain. Mekanisme ini tidak cross software, artinya mekanisme plugin untuk Apache NetBeans tidak akan bisa digunakan oleh IntelliJ IDEA.&lt;/li&gt;
&lt;li&gt;Editor teks yang bersifat umum / generik dan memerlukan konfigurasi maupun plugin / add-on / tambahan untuk keperluan penggunaan editor teks tersebut untuk keperluan suatu bahasa pemrograman.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kecenderungan saat ini menuju ke nomor 2, bahkan beberapa IDE (kategori nomor 1) juga menggunakan mekanisme nomor 2. Mekanisme pertama memang cenderung ditinggalkan karena setiap IDE / editor teks harus secara spesifik mendefinisikan dan mengelola plugins sendiri-sendiri. Selain mendatangkan kerepotan pengelole IDE / editor teks, hal ini juga mendatangkan kerepotan komunikas serta pengembangan kompilator / interpreter bahasa pemrograman. Karena berbagai kerepotan itu, makan muncul &lt;a href="https://microsoft.github.io/language-server-protocol/"&gt;Language Server Protocol / LSP&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Dengan menggunakan mekanisme LSP, maka setiap IDE / editor teks hanya perlu membuat dan mengelola klien LSP  saja sesuai dengan protokol LSP. Setelah itu, komunitas bahasa pemrograman tertentu akan membuat dan mengelola server LSP sesuai spesifikasi protokol LSP. Dengan demikian, selama IDE / editor teks mengikuti protokol klien LSP dan tersedia server LSP dari komunitas pengembangan bahasa pemrograman, maka sudah cukup untuk menjadikan IDE / editor teks tersebut sebagai IDE bahasa pemrograman sesuai dengan server LSP yang dikembangkan komunitas pengembang bahasa pemrograman tersebut. Protokol LSP menyediakan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Completion&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hover/tooltips&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Go to definition&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Show/go to references&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Show method signatures&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Rename&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Code actions&lt;/em&gt;, misalnya untuk &lt;em&gt;automatic formatting&lt;/em&gt;, &lt;em&gt;organize imports&lt;/em&gt;,dan lain-lain.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mekanisme LSP kurang lebih sebagai berikut:&lt;/p&gt;




&lt;p&gt;Menjalankan IDE / Editor teks =&amp;gt; menjalankan plugin / add-on klien LSP =&amp;gt; mengaktifkan server LSP sesuai konfigurasi =&amp;gt; IDE bahasa pemrograman.&lt;/p&gt;




&lt;p&gt;Untuk kompilator Rust, server LSP dikembangkan di &lt;a href="https://github.com/rust-lang/rls"&gt;repo &lt;strong&gt;rls&lt;/strong&gt;&lt;/a&gt;. Untuk menggunakan LSP, install terlebih dahulu &lt;code&gt;rls&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustup component add rls rust-analysis rust-src
info: downloading component &lt;span class="s1"&gt;'rls'&lt;/span&gt;
info: installing component &lt;span class="s1"&gt;'rls'&lt;/span&gt;
info: downloading component &lt;span class="s1"&gt;'rust-analysis'&lt;/span&gt;
  2.8 MiB /   2.8 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt; 868.9 KiB/s &lt;span class="k"&gt;in  &lt;/span&gt;4s ETA:  0s
info: installing component &lt;span class="s1"&gt;'rust-analysis'&lt;/span&gt;
info: downloading component &lt;span class="s1"&gt;'rust-src'&lt;/span&gt;
  2.3 MiB /   2.3 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;   1.2 MiB/s &lt;span class="k"&gt;in  &lt;/span&gt;2s ETA:  0s
info: installing component &lt;span class="s1"&gt;'rust-src'&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasilnya adalah sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rls &lt;span class="nt"&gt;--version&lt;/span&gt;
rls 1.41.0 &lt;span class="o"&gt;(&lt;/span&gt;a82a052 2021-07-21&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;rls &lt;span class="nt"&gt;--help&lt;/span&gt;

    &lt;span class="nt"&gt;--version&lt;/span&gt; or &lt;span class="nt"&gt;-V&lt;/span&gt; to print the version and commit info
    &lt;span class="nt"&gt;--help&lt;/span&gt; or &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;this message
    &lt;span class="nt"&gt;--cli&lt;/span&gt; starts the RLS &lt;span class="k"&gt;in &lt;/span&gt;&lt;span class="nb"&gt;command &lt;/span&gt;line mode
    No input starts the RLS as a language server
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah itu, IDE / editor teks dikonfigurasi untuk mengaktifkan LSP. &lt;/p&gt;

&lt;h2&gt;
  
  
  Vim / Neovim
&lt;/h2&gt;

&lt;p&gt;Mengkonfigurasi Vim / Neovim dari awal cukup menyita waktu dan cenderung ribet. Untuk menyingkat, akan digunakan &lt;a href="https://spacevim.org/"&gt;SpaceVim&lt;/a&gt;. Dengan menggunakan SpaceVim, kerumitan-kerumitan instalasi klien LSP akan diabstraksi oleh Spacevim, sehingga menggunakan fasilitas LSP akan lebih mudah.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi Vim
&lt;/h3&gt;

&lt;p&gt;Distribusi Linux biasanya secara default sudah menginstall Vim. Jika belum, maka bisa menggunakan &lt;em&gt;package manager&lt;/em&gt; (apt, urpmi, dnf, pacman, dan lain-lain) ataupun install dari kode sumber Vim secara langsung. Untuk OS lain, bisa mengikuti petunjuk di &lt;a href="https://www.vim.org/download.php"&gt;halaman download Vim&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi Neovim
&lt;/h3&gt;

&lt;p&gt;Neovim biasanya juga tersedia di berbagai distribusi Linux dan bisa diinstall menggunakan &lt;em&gt;package manager&lt;/em&gt;. Untuk OS lain, bisa mengikuti petunjuk di &lt;a href="https://github.com/neovim/neovim/releases"&gt;GitHub Releases page untuk Neovim&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi SpaceVim
&lt;/h3&gt;

&lt;p&gt;Instalasi Spacevim dijelaskan di [URL instalasi SpaceVim]. Jika menggunakan Windows, tersedia file &lt;code&gt;install.cmd&lt;/code&gt; yang bisa dijalankan secara langsung. Jika menggunakan Linux:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Instalasi SpaceVim untuk Vim dan Neovim&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sLf&lt;/span&gt; https://spacevim.org/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Instalasi SpaceVim untuk Vim&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sLf&lt;/span&gt; https://spacevim.org/install.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install&lt;/span&gt; vim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Instalasi SpaceVim untuk Neovim&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sLf&lt;/span&gt; https://spacevim.org/install.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install&lt;/span&gt; neovim
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: saat menginstall SpaceVim di Linux, kompilasi harus dilakukan untuk &lt;code&gt;vimproc.vim&lt;/code&gt;. Masuk ke direktori &lt;code&gt;$HOME/.SpaceVim/bundle/vimproc.vim&lt;/code&gt;, setelah itu berikan perintah &lt;code&gt;make&lt;/code&gt;. Hasilnya adalah file &lt;code&gt;$HOME/.SpaceVim/bundle/vimproc.vim/lib/vimproc_linux64.so*&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Konfigurasi SpaceVim
&lt;/h3&gt;

&lt;p&gt;Konfigurasi SpaceVim diletakkan pada file &lt;code&gt;$HOME/Spacevim.d/init.toml&lt;/code&gt;. Berikut ini tambahan yang diperlukan untuk konfigurasi SpaceVim - Rust:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
...
...
&lt;span class="o"&gt;[[&lt;/span&gt;layers]]
  name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lang#toml"&lt;/span&gt;

&lt;span class="o"&gt;[[&lt;/span&gt;layers]]
  name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lang#rust"&lt;/span&gt;

&lt;span class="o"&gt;[[&lt;/span&gt;layers]]
  name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lsp"&lt;/span&gt;
  filetypes &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"rust"&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt;layers.override_cmd]
    rust &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"rls"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
...
...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: plugin untuk TOML juga harus diaktifkan karena konfigurasi &lt;code&gt;cargo&lt;/code&gt; menggunakan format serialisasi &lt;a href="https://toml.io/en/"&gt;TOML&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saat menjalankan Rust, akan diinstall paket-paket yang diperlukan secara otomatis. Setelah selesai instalasi, Vim / Neovim bisa digunakan untuk IDE Rust.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EEWfWne2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkqgbbf7cfzzwrltydav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EEWfWne2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkqgbbf7cfzzwrltydav.png" alt="Neovim + SpaceVim untuk Rust"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Studio Code / VSCodium
&lt;/h2&gt;

&lt;p&gt;Visual Studio Code (selanjutnya disebut &lt;em&gt;VS Code&lt;/em&gt; adalah IDE generik yang dibuat oleh Microsoft. VS Code dirancang untuk memungkinkan adanya penambahan fasilitas melalui &lt;a href="https://code.visualstudio.com/docs/editor/extension-marketplace"&gt;Extension&lt;/a&gt;. Daftar lengkap &lt;em&gt;extensions&lt;/em&gt; bisa dilihat pada &lt;a href="https://marketplace.visualstudio.com/VSCode"&gt;Extensions Marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;VSCodium adalah versi VS Code tanpa &lt;em&gt;telemetry&lt;/em&gt;. &lt;a href="https://code.visualstudio.com/docs/getstarted/telemetry"&gt;Telemetry&lt;/a&gt; adalah fasilitas dari VS Code yang mengumpulkan data dari pengguna untuk keperluan layanan yang lebih baik (setidaknya, definisinya mengatakan demikian). VS Code secara default mengaktifkan fasilitas telemetry. Bagian lainnya sama dengan VS Code sehingga pembahasan tetang VS Code juga berlaku untuk VSCodium. Selanjutnya, keduanya akan disebut dengan &lt;em&gt;VS Code&lt;/em&gt; saja. &lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi VS Code / VSCodium
&lt;/h3&gt;

&lt;p&gt;Untuk instalasi VS Code, cukup download dari &lt;a href="https://code.visualstudio.com/Download"&gt;download VS Code&lt;/a&gt; / (&lt;a href="https://github.com/VSCodium/vscodium/releases"&gt;download VSCodium&lt;/a&gt;) dan kemudian ekstraksi hasil download tersebut. Untuk menjalankan VS Code, cukup jalankan &lt;code&gt;code&lt;/code&gt; yang terdapat pada direktori hasil ekstraksi. Jika menggunakan VSCodium, jalankan &lt;code&gt;codium&lt;/code&gt; yang terdapat pada direktori hasil ekstraksi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extension untuk Rust
&lt;/h3&gt;

&lt;p&gt;Extension untuk Rust di VS Code tersedia di &lt;a href="https://marketplace.visualstudio.com/items?itemName=rust-lang.rust"&gt;marketplace - Rust&lt;/a&gt;. Untuk melakukan instalasi, tekan &lt;code&gt;Ctl-P&lt;/code&gt; (&lt;em&gt;Quick Open&lt;/em&gt;) dan masukkan perintah untuk instalasi berikut ini: &lt;code&gt;ext install rust-lang.rust&lt;/code&gt;. Setelah itu, extension akan di-install:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5iGfljE3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ulligpvnwkb9jz8va55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5iGfljE3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ulligpvnwkb9jz8va55.png" alt="Instalasi extension Rust di VS Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah itu, kita bisa menggunakan VS Code sebagai IDE  Rust. Gunakan &lt;strong&gt;File - Open Folder&lt;/strong&gt; untuk membuka proyek Rust. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J5x44NSO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8c4zj5o1hebnke6f7053.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J5x44NSO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8c4zj5o1hebnke6f7053.png" alt="VS Code - Rust in Action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Eclipse
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://eclipse.org"&gt;Eclipse Foundation&lt;/a&gt; juga mempunyai proyek yang didedikasikan untuk membuat IDE Rust dengan basis IDE Eclipse untuk membangun aplikasi menggunakan Rust. Untuk memperoleh software ini, silahkan akses ke Web dari proyek &lt;a href="https://projects.eclipse.org/projects/tools.corrosion"&gt;Eclipse Corrosion&lt;/a&gt;. Sebagai informasi, sampai saat artikel ini ditulis, Eclipse Corrosion masih berstatus &lt;em&gt;Eclipse Incubation&lt;/em&gt;, artinya belum menjadi proyek utama, masih masa inkubasi. Hal ini perlu diperjelas supaya memahami dukungan dari &lt;em&gt;Eclipse Foundation&lt;/em&gt; terhadap IDE berbasis Eclipse ini.&lt;/p&gt;

&lt;p&gt;Untuk menggunakan Eclipse Corrosion, lihat terlebih dahulu versi terbaru dari Eclipse Corrosion di &lt;a href="https://projects.eclipse.org/projects/tools.corrosion"&gt;https://projects.eclipse.org/projects/tools.corrosion&lt;/a&gt;. Setelah itu, download Eclipse Corrosion dari &lt;a href="https://download.eclipse.org/corrosion/releases/latest/products/"&gt;https://download.eclipse.org/corrosion/releases/latest/products/&lt;/a&gt;. Kelak, jika sudah tidak berada di posisi inkubasi, Eclipse Corrosion akan bisa diambil dari download utama Eclipse.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: untuk menggunakan Eclipse, setidaknya harus memiliki JRE (Java Runtime Environment) versi 8.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setelah itu, ekstrak hasil download:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; eclipseide-rust-1.2.1-linux.gtk.x86_64.tar.gz 
eclipse/
eclipse/p2/
eclipse/p2/org.eclipse.equinox.p2.engine/
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/1623857155371.profile.gz
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.lock
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.data/
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.data/org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions/
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.data/org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions/jvmargs
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.data/.settings/
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.data/.settings/org.eclipse.equinox.p2.artifact.repository.prefs
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/.data/.settings/org.eclipse.equinox.p2.metadata.repository.prefs
eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry/CorrosionIDE.profile/1623857155392.profile.gz
...
...
...
eclipse/plugins/org.eclipse.corrosion_1.2.1.202106081156.jar
eclipse/icon.xpm
eclipse/eclipse
eclipse/.eclipseproduct
eclipse/readme/
eclipse/readme/readme_eclipse.html
eclipse/dropins/
eclipse/eclipse.ini
eclipse/configuration/
eclipse/configuration/org.eclipse.equinox.simpleconfigurator/
eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info
eclipse/configuration/config.ini
eclipse/configuration/org.eclipse.update/
eclipse/configuration/org.eclipse.update/platform.xml
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil ekstrak adalah direktori &lt;em&gt;eclipse&lt;/em&gt; dengan isi sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;eclipse/
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 376
drwxr-xr-x  8 zaky zaky   4096 Jun 16 22:25 ./
drwxr-xr-x  4 zaky zaky   4096 Sep 11 11:40 ../
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 zaky zaky  84784 Jun 16 22:25 artifacts.xml
drwxr-xr-x  4 zaky zaky   4096 Jun 16 22:25 configuration/
drwxr-xr-x  2 zaky zaky   4096 Jun 16 22:25 dropins/
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;  1 zaky zaky  80072 Jun 12 04:14 eclipse&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 zaky zaky    821 Jun 16 22:25 eclipse.ini
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 zaky zaky     61 Jun 12 03:06 .eclipseproduct
drwxr-xr-x 37 zaky zaky   4096 Jun 16 22:25 features/
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;  1 zaky zaky 140566 Jun 12 04:14 icon.xpm&lt;span class="k"&gt;*&lt;/span&gt;
drwxr-xr-x  4 zaky zaky   4096 Jun 16 22:25 p2/
drwxr-xr-x 11 zaky zaky  32768 Jun 16 22:25 plugins/
drwxr-xr-x  2 zaky zaky   4096 Jun 16 22:25 readme/
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk menjalankan &lt;em&gt;Eclipse for Rust Developers&lt;/em&gt;, masuk ke direktori hasil ekstrak kemudian eksekusi&lt;br&gt;
file &lt;em&gt;eclipse&lt;/em&gt; sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;eclipse
&lt;span class="nv"&gt;$ &lt;/span&gt;./eclipse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah &lt;em&gt;splash screen&lt;/em&gt;, Eclipse akan menanyakan &lt;em&gt;workspace&lt;/em&gt; tempat menyimpan berbagai proyek Rust. Isikan seperti yang anda kehendaki (bebas), setelah itu,&lt;br&gt;
klik pada &lt;em&gt;Launch&lt;/em&gt;, maka akan dimunculkan window utama dari Eclipse. Sebelum mulai menggunakan Eclipse for Rust, isikan &lt;strong&gt;Rust Preferences&lt;/strong&gt; dengan memilih  &lt;strong&gt;Window - Rust Preferences&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e-zOyYLk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8w09t7wijrcvz6t65ue7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e-zOyYLk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8w09t7wijrcvz6t65ue7.png" alt="Rust Preferences"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah isian sesuai, kita bisa menggunakan Eclipse for Rust:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hLOySLnw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3kzox3l0gduadfmkdyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hLOySLnw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3kzox3l0gduadfmkdyv.png" alt="Window utama Eclipse for Rust"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>belajar</category>
      <category>seri</category>
    </item>
    <item>
      <title>Managing a Software Development Team: Some Experiences</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Mon, 06 Sep 2021 04:34:21 +0000</pubDate>
      <link>https://forem.com/zimeracorp/managing-a-software-development-team-some-experiences-5f0</link>
      <guid>https://forem.com/zimeracorp/managing-a-software-development-team-some-experiences-5f0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Managing a software development team is never an easy task. It consists of 2 sides: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;technical things&lt;/li&gt;
&lt;li&gt;non-technical things. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This task is often assigned to the project manager, VP Engineering, Software Development Manager, etc. To be succeed, one has to consider those 2 sides. In this article, I will ouline some of my experiences in managing a software development team. This list is not meant to be complete nor perfect. You may need more but at least you will be in the safety line level one if you do care with these issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide the tools which will be used by the team
&lt;/h2&gt;

&lt;p&gt;Well, this is a bad news if you don’t have enough technical capabilities. Once you don’t decide the tools, your team will be confuse as they have more than one preferences. It’s not funny to have your team uses PHP with different versions, some use WAMP while the others use XAMPP or maybe PHP which comes from some Linux distros. It’s not funny to have your team uses Notepad, Visual Studio Code, Textpad, Vim, Netbeans, Eclipse, for their IDE/Text Editor. This will waste much time and bandwidth. Consider this, if they use different tools, then when someone says: “uh oh, my Vim always give me a tab and not some spaces, how do I turn the tab into spaces?” and then nobody can answer this and probably think “that is your responsibility, I don’t care because I never use Vim”. Now consider if everybody uses Netbeans (note: I don’t have any relation whatsoever with Netbeans nor a Netbeans evangelist), when someone yell “How do I create a new PHP module in Netbeans?”, chances are some of the guys in your team know about this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a specific software development methodology, probably with some minor adaption
&lt;/h2&gt;

&lt;p&gt;A software development methodology consists of process and modelling. It guides the team through the process and enable the team to model the software which is built by the team to solve client problems. It is important to use the specific methodology so that everyone in the team knows what and how to do the development. If you don’t decide any methodology, then your team won’t have any guides. Remember, you have to use a specific methodology but don’t be too rigid. Your team may consists of people from many backgounds with many level of capabilities. For example, you may use a Unified Process methodology but because your team is limited and don’t have time to learn how to use UML, then don’t push them to use rigid UP methodology. The most important thing here is process. Do use that process but don’t be too rigid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make some conventions regarding technical issues
&lt;/h2&gt;

&lt;p&gt;Again, this is important to keep the team away from the state of flux and let the guys in the team communicate with the same language. You surely don’t want your team to have more than one variable / property naming system, right? What if some programmers use “this_is_a_variable”, while the others use “thisIsAVariable”? quite confusing, I guess. You may need to define some coding conventions and probably uses software tool to force this conventions, for example if your team uses Rust, clippy can help you and your team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enforce Programming Idiom
&lt;/h2&gt;

&lt;p&gt;Every programming language, together with their ecosystems and development tools are such a complex beast. Usually, in the beginning, the most important thing is "it works!", but turns out that this may decrease productivity since there are more than one thing to do somenthing, reducing readability. Enforcing programming idiom is important to increase source code readability. &lt;/p&gt;

&lt;h2&gt;
  
  
  Know the client(s) and their problems which are tried to be solved
&lt;/h2&gt;

&lt;p&gt;You must understand this good enough so that you can define the scope of the problems and deal with the problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide the scope of the problems and insists on this.
&lt;/h2&gt;

&lt;p&gt;Clients basically don’t understand the requirements, so your duty as a leader is to define the scope of the problems which are tried to be solved by the software. You must cooperate nicely with the client and have the information understood by all team members. From programmers’ point of view, the uncertainty caused by scope uncertainty will lead to frustration. Well, I do understand that agile methodologies encourage changes, but who want to deal with changes everytime? What I am trying to say is, a software development leader should understand that changes are possible but this should be done within the scope. Don’t play with programmers’ heart 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Have a good interpersonal relationship and don’t be a jerk
&lt;/h2&gt;

&lt;p&gt;I know that this software development task is not easy. Clients always ask the progress and the team is in a stress condition. It really helps to just stay with the team and always willing to help them whatever you can than just act like a jerk who walks here and there and yelling. Trust me, the team will respect you more if you are always willing to help them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Never let the team in a state of flux
&lt;/h2&gt;

&lt;p&gt;Uncertainty comes everytime. Whenever the team has anything uncertain, your decision is needed to keep them away from confusion. You do understand that you have to have a good grasp in technical side and problem domain to make a good decision, don’t you?&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the team concentrate on technical matters
&lt;/h2&gt;

&lt;p&gt;Ok, pay attention more to non technical matters so that the team can concentrate on technical side. Don’t let them do any clerical things since programmers (usually) hate to do administrative things. It’s good to have a dedicated person to deal with all administrative things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the team member knows each other about progress and difficulties
&lt;/h2&gt;

&lt;p&gt;Opennes is important. By let them know each other’s progress, you keep them in a fair situation. Low salary probably can be understood, but unfair treatment can not be tolerated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inform the team about your progress too
&lt;/h2&gt;

&lt;p&gt;So you think you can hide your progress? The team will surely want to know that you do your jobs too. If you hide your progress, they will lose respect and trust in you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Communicate. Communicate. Communicate
&lt;/h2&gt;

&lt;p&gt;I can not emphasize this more. This is really important for the team to have them communicate each other. Your tasks will be to communicate with them and act as a liaison between the team and the client. Oh and don’t forget, have a good sense of humour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Always keep backup of everything
&lt;/h2&gt;

&lt;p&gt;You don’t need to backup everything if you are sure that you always live in an ideal situation. You should keep backup in more than one place. Compress them and have them uploaded anywhere on the Internet or in a storage server if possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Version Control System
&lt;/h2&gt;

&lt;p&gt;Version control system is a software which can be used to track the software source code versioning. You may use Git or Mercurial for this purpose. With version control systems, the progress is transparant. Also, any bugs and improvement can be tracked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use web based bug tracking system, project management software, and/or wiki
&lt;/h2&gt;

&lt;p&gt;This will keep any information handy and on track. All any other members can also see the project’s progress. It will keep each team members informed and any unfair situation can be detected. Usually, they are now available in GitHub or GitLab.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>methodology</category>
      <category>software</category>
      <category>development</category>
    </item>
    <item>
      <title>Belajar Rust - 02: Instalasi Rust</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Sat, 04 Sep 2021 10:37:09 +0000</pubDate>
      <link>https://forem.com/zimeracorp/belajar-rust-02-instalasi-rust-pf</link>
      <guid>https://forem.com/zimeracorp/belajar-rust-02-instalasi-rust-pf</guid>
      <description>&lt;p&gt;Untuk menggunakan Rust, tentu saja anda harus melakukan instalasi terhadap Rust dan ekosistem yang bisa digunakan untuk mendukung proses membangun software menggunakan Rust. Bagian ini membahas tentang berbagai cara yang bisa digunakan untuk mulai menggunakan Rust. Selain itu, di bab ini juga akan dibahas tentang berbagai peranti pengembangan yang lazim digunakan sebagai hasil dari instalasi serta pengenalan penggunaannya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rilis Rust
&lt;/h2&gt;

&lt;p&gt;Rust mempunyai 3 kategori rilis:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stable&lt;/strong&gt;: rilis stabil, dengan &lt;em&gt;test&lt;/em&gt; yang dilakukan secara menyeluruh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beta&lt;/strong&gt;: rilis versi ini merupakan rilis yang disiapkan untuk menjadi versi stabil berikutnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nightly&lt;/strong&gt;: rilis versi ini merupakan rilis yang berisi berbagai eksperimen yang mungkin bisa masuk ke versi stabil berikutnya (setelah melalui versi &lt;strong&gt;Beta&lt;/strong&gt;). Meskipun demikian, bisa juga eksperimen-eksperimen tersebut tidak akan pernah dimasukkan ke rilis resmi Rust.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Saat membangun aplikasi, pemrogram bebas untuk menggunakan kategori rilis manapun. Meskipun demikian, dianjurkan untuk menggunakan versi &lt;strong&gt;Stable&lt;/strong&gt; karena fitur yang ada di dalamnya adalah fitur-fitur yang sudah stabil sehingga memudahkan pemrogram untuk me-&lt;em&gt;maintain&lt;/em&gt; aplikasi yang dikembangkan.&lt;/p&gt;

&lt;p&gt;Untuk semua rilis tersebut, Rust menggunakan pedoman yang disebut dengan &lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;Semantic Versioning&lt;/a&gt;. Dengan menggunakan pedoman ini, setiap penomoran rilis Rust terdiri atas 3 bagian:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MAJOR&lt;/strong&gt;: rilis dengan perubahan API (&lt;em&gt;Application Programming Intergace&lt;/em&gt;) yang tidak kompatibel dengan versi MAJOR sebelumnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MINOR&lt;/strong&gt;: rilis dengan penambahan fungsionalitas yang kompatibel dengan versi sebelumnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PATCH&lt;/strong&gt;: rilis dengan perbaikan terhadap &lt;em&gt;bugs&lt;/em&gt; yang kompatibel dengan versi &lt;em&gt;MAJOR&lt;/em&gt; dan &lt;em&gt;MINOR&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sebagai contoh, versi &lt;code&gt;1.54.0&lt;/code&gt; dari versi Rust berisi Rust dengan semua API yang kompatibel dengan versi 1.x.x sebelumnya. Angka &lt;code&gt;54&lt;/code&gt; berarti penambahan fungsionalitas yang bersifat kompatibel dengan versi penambahan fungsionalitas sebelumnya. Angka &lt;code&gt;0&lt;/code&gt; berarti sama sekali belum ada perubahan perbaikan &lt;em&gt;bug&lt;/em&gt; (jika ada) untuk versi 1.54 tersebut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Siklus Rilis Rust
&lt;/h2&gt;

&lt;p&gt;Versi dari Rust (&lt;em&gt;stable, beta, nightly&lt;/em&gt;) dirilis setiap 6 minggu sekali (1.5 bulan sekali). Jadi, setiap 6 minggu akan muncul versi &lt;em&gt;stable, beta&lt;/em&gt;, serta &lt;em&gt;nightly&lt;/em&gt;). Kepastian siklus rilis ini menarik dan memberi kepastian kepada para pemrogram dalam mengantisipasi versi yang akan digunakan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edisi Rust
&lt;/h2&gt;

&lt;p&gt;Selain versi Rust berdasarkan &lt;em&gt;semantic versioning&lt;/em&gt; seperti yang telah dijelaskan di atas, Rust juga mengenal istilah &lt;em&gt;Rust Edition&lt;/em&gt; / Edisi Rust. Edisi Rust menggunakan tahun dan digunakan untuk memecahkan masalah &lt;em&gt;backward compatibility&lt;/em&gt; antara berbagai versi semantik.&lt;/p&gt;

&lt;p&gt;Saat versi stabil pertama Rust dirilis (1.x.x), Rust mempunyai janji &lt;em&gt;backward compatibility&lt;/em&gt;, artinya kode sumber yang dibuat untuk versi 1.x.x awal dulu, sampai versi 1.x.x terakhir tetap bisa dikompilasi dan dijalankan menggunakan Rust versi 1.x.x terakhir. Jadi, selama masih berada di versi &lt;em&gt;MAJOR&lt;/em&gt; yang sama, maka hal tersebut kompatibel. Problem dari hal ini adalah jika ingin merilis versi semantik Rust 1.x.x yang memungkinkan terjadinya &lt;em&gt;breaking changes&lt;/em&gt; (perubahan yang "merusak" - membuat tidak bisa dikompilasi). Sebagai contoh, Rust versi 1.x.x terakhir memperkenalkan kata kunci yang belum ada di versi awal-awal dulu. Jika dikompilasi dengan versi semantik Rust terakhir, maka akan terjadi error. Untuk itu, maka dibuat versi edisi Rust. Setiap edisi Rust akan menjamin &lt;em&gt;backward compatibility&lt;/em&gt; &lt;strong&gt;terkecuali&lt;/strong&gt; jika pemrogram dengan sadar telah melakukan berbagai perubahan yang diperlukan dan memilih edisi Rust versi berikutnya. Jika tidak mau dan ingin tetap bisa dikompilasi, maka pemrogram tetap bisa memilih untuk berada pada edisi Rust yang sebelumnya.&lt;/p&gt;

&lt;p&gt;Sampai saat ini, ada beberapa edisi Rust:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://doc.rust-lang.org/edition-guide/rust-2015/index.html" rel="noopener noreferrer"&gt;Rust 2015&lt;/a&gt;: fokus pada kestabilan.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doc.rust-lang.org/edition-guide/rust-2018/index.html" rel="noopener noreferrer"&gt;Rust 2018&lt;/a&gt;: fokus pada produktivitas.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://doc.rust-lang.org/edition-guide/rust-2021/index.html" rel="noopener noreferrer"&gt;Rust 2021&lt;/a&gt;: belum dirilis sampai saat ini. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Saat membuat suatu proyek kode sumber baru, secara default akan digunakan versi edisi Rust yang aktif saat ini.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rust Playground
&lt;/h2&gt;

&lt;p&gt;Jika kebutuhan kita hanya untuk mencoba beberapa bagian kode sumber, maka kita cukup hanya menggunakan &lt;a href="https://play.rust-lang.org/" rel="noopener noreferrer"&gt;Rust Playground&lt;/a&gt; saja. Setelah mengakses URL tersebut, kita bisa menuliskan kode sumber dan menjalankan kode sumber tersebut tanpa perlu melakukan instalasi peranti pengembangan Rust.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3q6gbfywftba020mrtey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3q6gbfywftba020mrtey.png" alt="Rust Playground"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi Rust
&lt;/h2&gt;

&lt;p&gt;Instalasi Rust bisa dilakukan dengan berbagai macam cara, tetapi cara yang paling mudah dan dianjurkan adalah dengan menggunakan &lt;a href="https://rustup.rs/" rel="noopener noreferrer"&gt;rustup&lt;/a&gt;. Prasyarat software yang diperlukan adalah &lt;a href="https://curl.se/" rel="noopener noreferrer"&gt;curl&lt;/a&gt; yang biasanya sudah terinstall di sistem Linux.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
info: downloading installer

Welcome to Rust!

This will download and &lt;span class="nb"&gt;install &lt;/span&gt;the official compiler &lt;span class="k"&gt;for &lt;/span&gt;the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /home/zaky/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory located at:

  /home/zaky/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo&lt;span class="s1"&gt;'s bin directory, located at:

  /home/zaky/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /home/zaky/.profile
  /home/zaky/.bashrc

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
&amp;gt;1

info: profile set to '&lt;/span&gt;default&lt;span class="s1"&gt;'
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for '&lt;/span&gt;stable-x86_64-unknown-linux-gnu&lt;span class="s1"&gt;'
info: latest update on 2021-07-29, rust version 1.54.0 (a178d0322 2021-07-26)
info: downloading component '&lt;/span&gt;cargo&lt;span class="s1"&gt;'
  6.0 MiB /   6.0 MiB (100 %)   1.2 MiB/s in  5s ETA:  0s
info: downloading component '&lt;/span&gt;clippy&lt;span class="s1"&gt;'
  2.4 MiB /   2.4 MiB (100 %)   1.2 MiB/s in  2s ETA:  0s
info: downloading component '&lt;/span&gt;rust-docs&lt;span class="s1"&gt;'
 16.7 MiB /  16.7 MiB (100 %)   1.2 MiB/s in 14s ETA:  0s
info: downloading component '&lt;/span&gt;rust-std&lt;span class="s1"&gt;'
 21.9 MiB /  21.9 MiB (100 %)   1.2 MiB/s in 19s ETA:  0s
info: downloading component '&lt;/span&gt;rustc&lt;span class="s1"&gt;'
 50.1 MiB /  50.1 MiB (100 %)   1.2 MiB/s in 44s ETA:  0s 
info: downloading component '&lt;/span&gt;rustfmt&lt;span class="s1"&gt;'
  3.7 MiB /   3.7 MiB (100 %)   1.2 MiB/s in  3s ETA:  0s
info: installing component '&lt;/span&gt;cargo&lt;span class="s1"&gt;'
info: installing component '&lt;/span&gt;clippy&lt;span class="s1"&gt;'
info: installing component '&lt;/span&gt;rust-docs&lt;span class="s1"&gt;'
 16.7 MiB /  16.7 MiB (100 %)   9.1 MiB/s in  1s ETA:  0s
info: installing component '&lt;/span&gt;rust-std&lt;span class="s1"&gt;'
 21.9 MiB /  21.9 MiB (100 %)  12.5 MiB/s in  2s ETA:  0s
info: installing component '&lt;/span&gt;rustc&lt;span class="s1"&gt;'
 50.1 MiB /  50.1 MiB (100 %)  13.7 MiB/s in  4s ETA:  0s
info: installing component '&lt;/span&gt;rustfmt&lt;span class="s1"&gt;'
info: default toolchain set to '&lt;/span&gt;stable-x86_64-unknown-linux-gnu&lt;span class="s1"&gt;'

  stable-x86_64-unknown-linux-gnu installed - rustc 1.54.0 (a178d0322 2021-07-26)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo'&lt;/span&gt;s bin directory &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cargo/bin&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

To configure your current shell, run:
&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cargo/env
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah proses instalasi tersebut, ada file berisi variabel lingkungan (&lt;em&gt;environment variables&lt;/em&gt;) yang harus diaktifkan, yaitu &lt;em&gt;$HOME/.cargo/env&lt;/em&gt;. Berikut adalah kondisi sebelum diaktifkan dan setelah diaktifkan menggunakan perintah &lt;em&gt;source&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustc
&lt;span class="nt"&gt;-bash&lt;/span&gt;: rustc: perintah tidak ditemukan
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo
&lt;span class="nt"&gt;-bash&lt;/span&gt;: cargo: perintah tidak ditemukan
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .cargo/env
&lt;span class="nv"&gt;$ &lt;/span&gt;rustc &lt;span class="nt"&gt;--version&lt;/span&gt;
rustc 1.54.0 &lt;span class="o"&gt;(&lt;/span&gt;a178d0322 2021-07-26&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nt"&gt;--version&lt;/span&gt;
cargo 1.54.0 &lt;span class="o"&gt;(&lt;/span&gt;5ae8d74b3 2021-06-22&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Secara default, isi dari file &lt;em&gt;.cargo/env&lt;/em&gt; sudah diletakkan pada file &lt;em&gt;.profile&lt;/em&gt; sehingga akan aktif setiap login. Setelah instalasi, silahkan logout dari shell dan kemudian mengaktifkan shell kembali supaya &lt;em&gt;.profile&lt;/em&gt; dieksekusi oleh shell. Periksa hasil instalasi berikut ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustc &lt;span class="nt"&gt;--version&lt;/span&gt;
rustc 1.54.0 &lt;span class="o"&gt;(&lt;/span&gt;a178d0322 2021-07-26&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nt"&gt;--version&lt;/span&gt;
cargo 1.54.0 &lt;span class="o"&gt;(&lt;/span&gt;5ae8d74b3 2021-06-22&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;rustfmt &lt;span class="nt"&gt;--version&lt;/span&gt;
rustfmt 1.4.37-stable &lt;span class="o"&gt;(&lt;/span&gt;a178d03 2021-07-26&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mencoba kompilator / &lt;em&gt;compiler&lt;/em&gt; Rust, buat file &lt;code&gt;hello.rs&lt;/code&gt; di lokasi direktori bebas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mengkompilasi dan menjalankan hasil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustc hello.rs 
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 3216
drwxr-xr-x 2 zaky zaky    4096 Sep  4 11:58 ./
drwxr-xr-x 6 zaky zaky    4096 Sep  4 11:57 ../
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 zaky zaky 3280808 Sep  4 11:58 hello&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 zaky zaky      46 Sep  4 11:58 hello.rs
&lt;span class="nv"&gt;$ &lt;/span&gt;./hello 
Hello World!
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: &lt;code&gt;rustc&lt;/code&gt; adalah kompilator Rust, sedangkan &lt;code&gt;hello.rs&lt;/code&gt; adalah file kode sumber yang akan dikompilasi menjadi &lt;em&gt;native machine code&lt;/em&gt; (lihat hasil file &lt;code&gt;hello&lt;/code&gt;) di atas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Proses kompilasi tersebut merupakan proses kompilasi yang digunakan secara sederhana, cukup untuk 1 file kode sumber saja. Jika software mulai kompleks dan memerlukan banyak kode sumber serta mempunyai ketergantungan / &lt;em&gt;dependecy&lt;/em&gt; ke berbagai pustaka, maka diperlukan &lt;code&gt;cargo&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Uninstall&lt;/em&gt; Rust
&lt;/h2&gt;

&lt;p&gt;Untuk menghapus instalasi Rust, gunakan &lt;code&gt;rustup&lt;/code&gt; yang sudah terinstall saat melakukan instalasi Rust. Berikut ini adalah cara menghapus instalasi Rust:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustup self uninstall


Thanks &lt;span class="k"&gt;for &lt;/span&gt;hacking &lt;span class="k"&gt;in &lt;/span&gt;Rust!

This will uninstall all Rust toolchains and data, and remove
&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cargo/bin from your PATH environment variable.

Continue? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; y

info: removing rustup home
info: removing cargo home
info: removing rustup binaries
info: rustup is uninstalled
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Memperbarui Rust
&lt;/h2&gt;

&lt;p&gt;Jika muncul versi terbaru dari Rust, maka kita bisa memperbarui Rust hanya dengan menggunakan &lt;code&gt;rust update&lt;/code&gt; berikut ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustup update
info: syncing channel updates &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'stable-x86_64-unknown-linux-gnu'&lt;/span&gt;
679.5 KiB / 679.5 KiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt; 623.0 KiB/s &lt;span class="k"&gt;in  &lt;/span&gt;1s ETA:  0s
info: latest update on 2021-09-09, rust version 1.55.0 &lt;span class="o"&gt;(&lt;/span&gt;c8dfcfe04 2021-09-06&lt;span class="o"&gt;)&lt;/span&gt;
info: downloading component &lt;span class="s1"&gt;'cargo'&lt;/span&gt;
  6.1 MiB /   6.1 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt; 981.4 KiB/s &lt;span class="k"&gt;in  &lt;/span&gt;6s ETA:  0s
info: downloading component &lt;span class="s1"&gt;'clippy'&lt;/span&gt;
  2.4 MiB /   2.4 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;   1.1 MiB/s &lt;span class="k"&gt;in  &lt;/span&gt;2s ETA:  0s
info: downloading component &lt;span class="s1"&gt;'rust-docs'&lt;/span&gt;
 17.0 MiB /  17.0 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;   1.2 MiB/s &lt;span class="k"&gt;in &lt;/span&gt;15s ETA:  0s
info: downloading component &lt;span class="s1"&gt;'rust-std'&lt;/span&gt;
 22.3 MiB /  22.3 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt; 780.8 KiB/s &lt;span class="k"&gt;in &lt;/span&gt;23s ETA:  0s 
info: downloading component &lt;span class="s1"&gt;'rustc'&lt;/span&gt;
 51.0 MiB /  51.0 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;   1.1 MiB/s &lt;span class="k"&gt;in &lt;/span&gt;52s ETA:  0s 
info: downloading component &lt;span class="s1"&gt;'rustfmt'&lt;/span&gt;
  3.7 MiB /   3.7 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt; 943.6 KiB/s &lt;span class="k"&gt;in  &lt;/span&gt;4s ETA:  0s
info: removing previous version of component &lt;span class="s1"&gt;'cargo'&lt;/span&gt;
info: removing previous version of component &lt;span class="s1"&gt;'clippy'&lt;/span&gt;
info: removing previous version of component &lt;span class="s1"&gt;'rust-docs'&lt;/span&gt;
info: removing previous version of component &lt;span class="s1"&gt;'rust-std'&lt;/span&gt;
info: removing previous version of component &lt;span class="s1"&gt;'rustc'&lt;/span&gt;
info: removing previous version of component &lt;span class="s1"&gt;'rustfmt'&lt;/span&gt;
info: installing component &lt;span class="s1"&gt;'cargo'&lt;/span&gt;
info: installing component &lt;span class="s1"&gt;'clippy'&lt;/span&gt;
info: installing component &lt;span class="s1"&gt;'rust-docs'&lt;/span&gt;
 17.0 MiB /  17.0 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;   7.7 MiB/s &lt;span class="k"&gt;in  &lt;/span&gt;2s ETA:  0s
info: installing component &lt;span class="s1"&gt;'rust-std'&lt;/span&gt;
 22.3 MiB /  22.3 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;  12.3 MiB/s &lt;span class="k"&gt;in  &lt;/span&gt;2s ETA:  0s
info: installing component &lt;span class="s1"&gt;'rustc'&lt;/span&gt;
 51.0 MiB /  51.0 MiB &lt;span class="o"&gt;(&lt;/span&gt;100 %&lt;span class="o"&gt;)&lt;/span&gt;  10.2 MiB/s &lt;span class="k"&gt;in  &lt;/span&gt;6s ETA:  0s
info: installing component &lt;span class="s1"&gt;'rustfmt'&lt;/span&gt;
info: checking &lt;span class="k"&gt;for &lt;/span&gt;self-updates

  stable-x86_64-unknown-linux-gnu updated - rustc 1.55.0 &lt;span class="o"&gt;(&lt;/span&gt;c8dfcfe04 2021-09-06&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;from rustc 1.54.0 &lt;span class="o"&gt;(&lt;/span&gt;a178d0322 2021-07-26&lt;span class="o"&gt;))&lt;/span&gt;

info: cleaning up downloads &amp;amp; tmp directories
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Plugin untuk &lt;em&gt;subcommand&lt;/em&gt; &lt;code&gt;Cargo&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Cargo&lt;/code&gt; memungkinkan untuk diperluas fungsionalitasnya dengan menggunakan &lt;em&gt;plugin&lt;/em&gt;. Dengan menggunakan &lt;em&gt;plugin&lt;/em&gt;, Cargo akan mendapatkan &lt;em&gt;subcommand&lt;/em&gt;. Sebagai contoh, pada bagian ini akan dijelaskan tentang salah satu &lt;em&gt;plugin&lt;/em&gt; yang bermanfaat untuk mendeteksi paket yang perlu diperbarui di skala user (bukan per proyek). &lt;em&gt;Plugin&lt;/em&gt; tersebut adalah &lt;em&gt;plugin&lt;/em&gt; &lt;a href="https://github.com/nabijaczleweli/cargo-update" rel="noopener noreferrer"&gt;cargo-update&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi &lt;em&gt;Plugin&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Instalasi dilakukan dengan menggunakan &lt;code&gt;cargo install&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;cargo-update
    Updating crates.io index
  Downloaded cargo-update v7.0.1
  Downloaded 1 crate &lt;span class="o"&gt;(&lt;/span&gt;44.4 KB&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;1.45s
  Installing cargo-update v7.0.1
  Downloaded dirs-sys v0.3.6
...
...
...
   Compiling semver v0.9.0
   Compiling cargo-update v7.0.1
   Compiling url v2.2.2
   Compiling git2 v0.11.0
    Finished release &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;1m 24s
  Installing /home/zaky/.cargo/bin/cargo-install-update
  Installing /home/zaky/.cargo/bin/cargo-install-update-config
   Installed package &lt;span class="sb"&gt;`&lt;/span&gt;cargo-update v7.0.1&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;executables &lt;span class="sb"&gt;`&lt;/span&gt;cargo-install-update&lt;span class="sb"&gt;`&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;cargo-install-update-config&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk memeriksa pembaruan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo install-update &lt;span class="nt"&gt;-a&lt;/span&gt;
    Updating registry &lt;span class="s1"&gt;'https://github.com/rust-lang/crates.io-index'&lt;/span&gt;

Package       Installed  Latest  Needs update
cargo-update  v7.0.1     v7.0.1  No

No packages need updating.
Overall updated 0 packages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Memahami Ekosistem Rust
&lt;/h2&gt;

&lt;p&gt;Mempelajari suatu bahasa pemrograman tidak hanya cukup dengan mempelajari sintaksis saja. Setiap bahasa pemrograman biasa mempunyai spesifikasi, &lt;em&gt;kompilator/interpreter&lt;/em&gt;, pengelola paket pustaka, IDE, komunitas, dan lain-lain. Pemahaman mengenai ekosistem saat mempelajari suatu bahasa pemrograman menjadi hal yang sangat penting. Biasanya pemrogram mudah mempelajari sintaksis tetapi cukup perlu waktu lama untuk memahami ekosistem. Ekosistem ini juga menentukan bagaimana seorang pemrogram bisa produktif serta menggunakan idiom-idiom yang sesuai dengan bahasa pemrograman yang ditekuni. Pada bagian ini, kita akan mempelajari ekosistem dari bahasa pemrograman Rust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pustaka Rust
&lt;/h3&gt;

&lt;p&gt;Pustaka / &lt;em&gt;library&lt;/em&gt; Rust sering disebut dengan istilah &lt;em&gt;crate&lt;/em&gt;. &lt;em&gt;Crate&lt;/em&gt; dari komunitas dipusatkan di &lt;a href="https://crates.io/" rel="noopener noreferrer"&gt;https://crates.io/&lt;/a&gt;. Pengelolaan pustaka dalam suatu proyek software yang dikembangkan menggunakan Rust dilakukan oleh &lt;a href="https://doc.rust-lang.org/cargo/" rel="noopener noreferrer"&gt;cargo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pengenalan Cargo
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;cargo&lt;/code&gt; adalah bagian dari peranti pengembangan Rust yang digunakan untuk mengelola paket-paket pustaka yang digunakan dalam suatu proyek. Selain itu, &lt;code&gt;cargo&lt;/code&gt; juga bisa digunakan untuk keperluan menangani berbagai proses yang diperlukan oleh proyek, misalnya membangun (&lt;em&gt;build&lt;/em&gt;), &lt;em&gt;test&lt;/em&gt;, menjalankan &lt;em&gt;run&lt;/em&gt;, dan masih banyak lagi. Selain fasilitas resmi, &lt;code&gt;cargo&lt;/code&gt; juga menyediakan &lt;em&gt;plugins&lt;/em&gt; untuk menambahkan kemampuan dari &lt;code&gt;cargo&lt;/code&gt;. Daftar &lt;em&gt;plugins&lt;/em&gt; bisa diperoleh dengan mengakses &lt;a href="https://crates.io/search?q=cargo" rel="noopener noreferrer"&gt;https://crates.io/search?q=cargo&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Inisialisasi Proyek
&lt;/h4&gt;

&lt;p&gt;Untuk menginisialisasi proyek ada dua cara:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;menggunakan &lt;code&gt;cargo init&lt;/code&gt;: untuk membuat proyek pada direktori aktif.&lt;/li&gt;
&lt;li&gt;menggunakan &lt;code&gt;cargo new&lt;/code&gt;: untuk membuat proyek sekaligus membuat, menyiapkan, dan mengisi direktori proyek.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Menggunakan &lt;code&gt;cargo init&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;hello-cargo
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hello-cargo/
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo init
     Created binary &lt;span class="o"&gt;(&lt;/span&gt;application&lt;span class="o"&gt;)&lt;/span&gt; package
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; 
total 24
drwxr-xr-x 4 zaky zaky 4096 Sep  4 12:12 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x 3 zaky zaky 4096 Sep  4 12:12 ..
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 zaky zaky  180 Sep  4 12:12 Cargo.toml
drwxr-xr-x 6 zaky zaky 4096 Sep  4 12:12 .git
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 zaky zaky    8 Sep  4 12:12 .gitignore
drwxr-xr-x 2 zaky zaky 4096 Sep  4 12:12 src
&lt;span class="nv"&gt;$ &lt;/span&gt;tree &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Menggunakan &lt;code&gt;cargo new&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo new hello-cargo-2 &lt;span class="nt"&gt;--bin&lt;/span&gt;
     Created binary &lt;span class="o"&gt;(&lt;/span&gt;application&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;hello-cargo-2&lt;span class="sb"&gt;`&lt;/span&gt; package
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hello-cargo-2/
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 24
drwxr-xr-x 4 zaky zaky 4096 Sep  4 12:15 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x 4 zaky zaky 4096 Sep  4 12:15 ..
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 zaky zaky  182 Sep  4 12:15 Cargo.toml
drwxr-xr-x 6 zaky zaky 4096 Sep  4 12:15 .git
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 zaky zaky    8 Sep  4 12:15 .gitignore
drwxr-xr-x 2 zaky zaky 4096 Sep  4 12:15 src
&lt;span class="nv"&gt;$ &lt;/span&gt;tree &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: secara default, jika tidak menggunakan parameter, maka rerangka proyek yang dihasilkan adalah rerangka proyek untuk hasil file &lt;em&gt;binary executable&lt;/em&gt; atau aplikasi yang bisa dijalankan secara langsung oleh sistem operasi. Jika ingin membuat proyek pustaka / &lt;em&gt;library&lt;/em&gt;, gunakan argument &lt;code&gt;--lib&lt;/code&gt; sebagai berikut: &lt;code&gt;cargo init --lib&lt;/code&gt; atau &lt;code&gt;cargo new project_name --lib&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Secara umum, hasil dari kedua perintah tersebut sama saja.&lt;/p&gt;

&lt;h3&gt;
  
  
  Struktur Direktori dan Aplikasi Proyek Rust
&lt;/h3&gt;

&lt;p&gt;Suatu proyek Rust yang dihasilkan oleh &lt;code&gt;cargo init&lt;/code&gt; maupun &lt;code&gt;cargo new&lt;/code&gt; untuk tipe aplikasi maupun pustaka mempunyai struktur yang sama, hanya berbeda di kode sumber &lt;code&gt;src&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tipe Aplikasi&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Tipe Pustaka&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
├── Cargo.toml
└── src
    └── lib.rs

1 directory, 2 files
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setiap proyek juga mempunyai dua direktori dan file yang tersembunyi (&lt;em&gt;hidden&lt;/em&gt;) yang diperlukan oleh &lt;a href="https://git-scm.com" rel="noopener noreferrer"&gt;Git&lt;/a&gt; yaitu direktori &lt;code&gt;.git&lt;/code&gt; dan file &lt;code&gt;.gitigore&lt;/code&gt;. Direktori &lt;code&gt;.git&lt;/code&gt; merupakan direktori internal dari setiap repo &lt;strong&gt;Git&lt;/strong&gt; dan file &lt;code&gt;.gitignore&lt;/code&gt; merupakan file yang digunakan untuk memberitahu direktori serta file apa di repo tersebut yang tidak perlu dimasukkan ke repo Git di &lt;a href="https://github.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; atau &lt;a href="https://gitlab.com" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;. Kedua direktori dan file tersebut muncul karena asumsi bahwa proyek tersebut akan dimasukkan ke suatu repo Git tertentu. &lt;/p&gt;

&lt;p&gt;Berikut adalah penjelasan dari struktur direktori serta berbagai file yang ada pada suatu proyek Rust.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Cargo.toml&lt;/code&gt;: file ini disebut file &lt;strong&gt;manifest&lt;/strong&gt; dan digunakan untuk mendeskripsikan metadata tentang proyek serta berbagai pustaka yang digunakan di proyek tersebut. File ini dikelola oleh pemrogram.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cargo.lock&lt;/code&gt;: file yang digunakan secara internal oleh &lt;code&gt;cargo&lt;/code&gt; untuk mengelola seluruh pustaka yang digunakan di proyek tersebut. File ini tidak dimaksudkan untuk dikelola oleh pemrogram. File ini akan muncul jika pemrogram sudah melakukan proses membangun aplikasi (&lt;em&gt;build&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src&lt;/code&gt;: tempat pemrogram menempatkan kode sumber. Jika aplikasi, maka akan bernama &lt;code&gt;main.rs&lt;/code&gt; yang akan menjadi titik awal eksekusi program.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;target&lt;/code&gt;: direktori hasil proses kompilasi, akan muncul jika sudah dilakukan proses kompilasi / membangun / &lt;em&gt;build&lt;/em&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: jika proyek merupakan proyek untuk pustaka selain pustaka sistem (yang menggunakan tipe &lt;em&gt;crate&lt;/em&gt; &lt;code&gt;staticlib&lt;/code&gt; atau &lt;code&gt;cdylib&lt;/code&gt;), masukkan &lt;em&gt;Cargo.lock&lt;/em&gt; ke baris di &lt;code&gt;.gitignore&lt;/code&gt;. Selain itu, jangan masukkan. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suatu file Cargo.toml biasanya berisi minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;package]
name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hello-cargo-2"&lt;/span&gt;
version &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;
edition &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2018"&lt;/span&gt;

&lt;span class="c"&gt;# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;dependencies]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;File &lt;code&gt;Cargo.toml&lt;/code&gt; mempunyai format &lt;a href="https://github.com/toml-lang/toml" rel="noopener noreferrer"&gt;TOML&lt;/a&gt; dan secara minimal berisi deskripsi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;package&lt;/code&gt;: menjelaskan tentang paket proyek tersebut, minimal berisi &lt;code&gt;name&lt;/code&gt; (nama proyek), &lt;code&gt;version&lt;/code&gt; (versi proyek), dan &lt;code&gt;edition&lt;/code&gt; (edisi Rust yang digunakaan).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dependencies&lt;/code&gt;: berbagai pustaka yang digunakan di aplikasi serta versinya.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Membangun Proyek
&lt;/h4&gt;

&lt;p&gt;Untuk membangun proyek, &lt;code&gt;cargo&lt;/code&gt; harus dikerjakan pada direktori tempat proyek tersebut berada. Ada 2 kategori proyek yang dibangun:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Versi &lt;strong&gt;debug&lt;/strong&gt; / &lt;strong&gt;dev&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Versi &lt;strong&gt;release&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Versi &lt;strong&gt;debug&lt;/strong&gt; menyertakan data untuk proses &lt;em&gt;debugging&lt;/em&gt; sehingga ukurannya lebih besar. Saat pengembangan, biasanya proses membangun proyek dilakukan secara default menggunakan versi &lt;em&gt;debug&lt;/em&gt;. Jika proyek sudah selesai, maka dibangun menggunakan versi &lt;em&gt;release&lt;/em&gt;. Berikut adalah proses serta hasil dari masing-masing versi.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Versi &lt;em&gt;Debug&lt;/em&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo build
   Compiling hello-cargo-2 v0.1.0 &lt;span class="o"&gt;(&lt;/span&gt;/home/zaky/kerjaan/src/rust/hello-cargo-2&lt;span class="o"&gt;)&lt;/span&gt;
    Finished dev &lt;span class="o"&gt;[&lt;/span&gt;unoptimized + debuginfo] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;8.53s
&lt;span class="nv"&gt;$ &lt;/span&gt;tree 
Cargo.lock  Cargo.toml  .git/       .gitignore  src/        target/     
&lt;span class="nv"&gt;$ &lt;/span&gt;tree target/
target/
├── CACHEDIR.TAG
└── debug
    ├── build
    ├── deps
    │   ├── hello_cargo_2-61ab1226333d611e
    │   └── hello_cargo_2-61ab1226333d611e.d
    ├── examples
    ├── hello-cargo-2
    ├── hello-cargo-2.d
    └── incremental
        └── hello_cargo_2-1tf9vp8hw5tph
            ├── s-g21ocip69e-1gz7gsu-2d3iv3pzmnper
            │   ├── 14ljyy7cs4njs43i.o
            │   ├── 1jvulq62qig4vscu.o
            │   ├── 28iowghk4bcm6y1h.o
            │   ├── 3okkrcxho0rd7dc2.o
            │   ├── 46r7u1vfzs5zeczg.o
            │   ├── 50jgk6qv50atsv1.o
            │   ├── dep-graph.bin
            │   ├── dhg43ne52kxn1e6.o
            │   ├── query-cache.bin
            │   ├── sn76ibo0w8dil4z.o
            │   └── work-products.bin
            └── s-g21ocip69e-1gz7gsu.lock

7 directories, 17 files
&lt;span class="nv"&gt;$ $ &lt;/span&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; target/debug/
3,2M    target/debug/deps
4,0K    target/debug/examples
564K    target/debug/incremental/hello_cargo_2-1tf9vp8hw5tph/s-g21ocip69e-1gz7gsu-2d3iv3pzmnper
568K    target/debug/incremental/hello_cargo_2-1tf9vp8hw5tph
572K    target/debug/incremental
20K target/debug/.fingerprint/hello-cargo-2-61ab1226333d611e
24K target/debug/.fingerprint
4,0K    target/debug/build
3,8M    target/debug/
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil dari membangun aplikasi menggunakan versi &lt;em&gt;debug&lt;/em&gt; adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Direktori &lt;code&gt;target/debug&lt;/code&gt; sebesar 3,8 MB&lt;/li&gt;
&lt;li&gt;Hasil kompilasi utama:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; target/debug/hello-cargo-2
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 2 zaky zaky 3290088 Sep  4 12:21 target/debug/hello-cargo-2&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Versi &lt;em&gt;Release&lt;/em&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;
   Compiling hello-cargo-2 v0.1.0 &lt;span class="o"&gt;(&lt;/span&gt;/home/zaky/kerjaan/src/rust/hello-cargo-2&lt;span class="o"&gt;)&lt;/span&gt;
    Finished release &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.54s
&lt;span class="nv"&gt;$ &lt;/span&gt;tree target/release/
target/release/
├── build
├── deps
│   ├── hello_cargo_2-0904ddb38520974e
│   └── hello_cargo_2-0904ddb38520974e.d
├── examples
├── hello-cargo-2
├── hello-cargo-2.d
└── incremental

4 directories, 4 files
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; target/release/
3,2M    target/release/deps
4,0K    target/release/examples
4,0K    target/release/incremental
20K target/release/.fingerprint/hello-cargo-2-0904ddb38520974e
24K target/release/.fingerprint
4,0K    target/release/build
3,2M    target/release/
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil dari membangun aplikasi menggunakan versi &lt;em&gt;release&lt;/em&gt; adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Direktori &lt;code&gt;target/release&lt;/code&gt; sebesar 3,2 MB&lt;/li&gt;
&lt;li&gt;Hasil kompilasi utama:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; target/release/hello-cargo-2
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 2 zaky zaky 3280008 Sep  4 16:00 target/release/hello-cargo-2
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dari apa yang telah dihasilkan tersebut, kita bisa mengetahui bahwa versi &lt;em&gt;release&lt;/em&gt; mempunyai ukuran lebih kecil serta waktu kompilasi yang lebih cepat daripada versi &lt;em&gt;debug&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Menjalankan Hasil
&lt;/h4&gt;

&lt;p&gt;Untuk menjalankan hasil, hasil utama kompilasi bisa dieksekusi secara langsung, atau bisa juga menggunakan &lt;code&gt;cargo run&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;target/debug/hello-cargo-2 
Hello, world!
&lt;span class="nv"&gt;$ &lt;/span&gt;target/release/hello-cargo-2 
Hello, world!
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo run 
    Finished dev &lt;span class="o"&gt;[&lt;/span&gt;unoptimized + debuginfo] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.00s
     Running &lt;span class="sb"&gt;`&lt;/span&gt;target/debug/hello-cargo-2&lt;span class="sb"&gt;`&lt;/span&gt;
Hello, world!
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo run &lt;span class="nt"&gt;--release&lt;/span&gt;
    Finished release &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.00s
     Running &lt;span class="sb"&gt;`&lt;/span&gt;target/release/hello-cargo-2&lt;span class="sb"&gt;`&lt;/span&gt;
Hello, world!
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Menggunakan &lt;code&gt;cargo&lt;/code&gt; untuk Mengelola &lt;em&gt;Dependencies&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Seperti yang telah dijelaskan di awal, &lt;code&gt;cargo&lt;/code&gt; bisa digunakan untuk mengelola berbagai pustaka yang diperlukan. Pengelolaan ini dilakukan menggunakan file &lt;code&gt;Cargo.toml&lt;/code&gt;. Berikut ini kita akan membuat aplikasi yang memanfaatkan suatu pustaka dari &lt;a href="https://crates.io" rel="noopener noreferrer"&gt;https://crates.io&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Aplikasi yang kita buat merupakan aplikasi untuk mengkonversi warna 4-bit sRGB dan warna palet 8-bit yang digunakan oleh terminal ANSI (xterm, rxvt-unicode) ke dalam mode warna 256.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: penggunakan &lt;em&gt;crate&lt;/em&gt; pada bagian ini hanya merupakan contoh saja. Hal yang perlu diperhatikan adalah cara menggunakan &lt;em&gt;crate&lt;/em&gt; / pustaka. Mengenai pemanfaatan pustakan dan kode sumber, tidak perlu dipahami.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Crate&lt;/em&gt; yang digunakan bisa diperoleh di &lt;a href="https://crates.io/crates/ansi_colours" rel="noopener noreferrer"&gt;https://crates.io/crates/ansi_colours&lt;/a&gt;. Masukkan dependensi ini ke &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;package]
name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hello-time"&lt;/span&gt;
version &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;
edition &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2018"&lt;/span&gt;

&lt;span class="c"&gt;# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;dependencies]
ansi_colours &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1.0.4"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kompilasi bisa dilakukan seperti biasa. Saat proses membangun aplikasi, &lt;code&gt;cargo&lt;/code&gt; akan mengambil dan mengelola pustaka / &lt;em&gt;crate&lt;/em&gt; yang sudah kita spesifikasikan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;
    Updating crates.io index
  Downloaded ansi_colours v1.0.4
  Downloaded cc v1.0.70
  Downloaded 2 crates &lt;span class="o"&gt;(&lt;/span&gt;67.7 KB&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.87s
   Compiling cc v1.0.70
   Compiling ansi_colours v1.0.4
   Compiling hello-time v0.1.0 &lt;span class="o"&gt;(&lt;/span&gt;/home/zaky/kerjaan/src/rust/hello-time&lt;span class="o"&gt;)&lt;/span&gt;
    Finished release &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;4.69s
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo run &lt;span class="nt"&gt;--release&lt;/span&gt;
    Finished release &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.00s
     Running &lt;span class="sb"&gt;`&lt;/span&gt;target/release/hello-time&lt;span class="sb"&gt;`&lt;/span&gt;
 50: &lt;span class="o"&gt;(&lt;/span&gt;0, 255, 215&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;100, 200, 150&lt;span class="o"&gt;)&lt;/span&gt; ~  78 &lt;span class="o"&gt;(&lt;/span&gt;95, 215, 135&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Membersihkan Hasil Kompilasi
&lt;/h4&gt;

&lt;p&gt;Jika kita ingin membersihkan direktori proyek dari hasil kompilasi, gunakan perintah &lt;code&gt;cargo clean&lt;/code&gt; di direktori proyek tersebut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clippy
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/rust-lang/rust-clippy" rel="noopener noreferrer"&gt;Clippy&lt;/a&gt; digunakan sebagai &lt;em&gt;linter&lt;/em&gt; dan digunakan untuk menangkap berbagai kemungkinan error yang umum maupun berbagai perbaikan yang bisa digunakan untuk memperbaiki kode sumber kita (meski tidak terdapat error). Untuk menggunakan &lt;em&gt;clippy&lt;/em&gt;, maka &lt;em&gt;clippy&lt;/em&gt; harus terinstall - biasanya sudah diinstall saat menginstall Rust menggunakan &lt;code&gt;rustup&lt;/code&gt;. Jika belum terinstall, gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rustup component add clippy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh penggunaaan &lt;em&gt;clippy&lt;/em&gt; pada proyek &lt;code&gt;hello-cargo-2&lt;/code&gt; di atas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo clippy &lt;span class="nt"&gt;--release&lt;/span&gt;
    Checking hello-cargo-2 v0.1.0 &lt;span class="o"&gt;(&lt;/span&gt;/home/zaky/kerjaan/src/rust/hello-cargo-2&lt;span class="o"&gt;)&lt;/span&gt;
    Finished release &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.03s
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Misal, kita buat error dengan sengaja di &lt;code&gt;src/main.rs&lt;/code&gt; dengan menghapus penutup string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!);
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita bisa menggunakan &lt;em&gt;clippy&lt;/em&gt; berikut ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo clippy &lt;span class="nt"&gt;--release&lt;/span&gt;
    Checking hello-cargo-2 v0.1.0 &lt;span class="o"&gt;(&lt;/span&gt;/home/zaky/kerjaan/src/rust/hello-cargo-2&lt;span class="o"&gt;)&lt;/span&gt;
error[E0765]: unterminated double quote string
 &lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; src/main.rs:2:14
  |
2 |       println!&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello, world!);
  |  ______________^
3 | | }
  | |__^

error: aborting due to previous error

For more information about this error, try &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;rustc &lt;span class="nt"&gt;--explain&lt;/span&gt; E0765&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;.
error: could not compile &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;hello-cargo-2&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;

To learn more, run the command again with --verbose.
&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada bagian awal seperti ini, error serta saran yang muncul sama dengan saat menggunakan &lt;code&gt;cargo build&lt;/code&gt;, tetapi semakin kompleks kesalahan serta kode sumber, maka &lt;em&gt;clippy&lt;/em&gt; akan memberikan masukan yang lebih baik. Pada posisi ini, pahami penggunaan &lt;em&gt;clippy&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengikuti Perkembangan Rust
&lt;/h2&gt;

&lt;p&gt;Perkembangan Rust sangat menarik dan dinamis. Berikut ini adalah beberapa tempat yang bisa menjadi panduan untuk mengikuti perkembangan dari Rust.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://this-week-in-rust.org/" rel="noopener noreferrer"&gt;This Week in Rust&lt;/a&gt;: &lt;em&gt;newsletter&lt;/em&gt; mingguan tentang perkembangan Rust&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rust-unofficial/awesome-rust" rel="noopener noreferrer"&gt;Awesome Rust&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/not-yet-awesome-rust/not-yet-awesome-rust" rel="noopener noreferrer"&gt;Not-Yet-Awesome Rust&lt;/a&gt;: software, kode sumber, maupun berbagai sumber daya yang belum ada di Rust meski sangat diperlukan.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rust-lang.org/community" rel="noopener noreferrer"&gt;Komunitas Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stackoverflow.com/tags" rel="noopener noreferrer"&gt;Cari tags &lt;code&gt;Rust&lt;/code&gt; di StackOverflow&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>rust</category>
      <category>seri</category>
      <category>belajar</category>
    </item>
    <item>
      <title>Belajar Rust - 01: Mengenal Bahasa Pemrograman Rust</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Sat, 28 Aug 2021 22:55:30 +0000</pubDate>
      <link>https://forem.com/zimeracorp/belajar-rust-01-mengenal-bahasa-pemrograman-rust-4m3g</link>
      <guid>https://forem.com/zimeracorp/belajar-rust-01-mengenal-bahasa-pemrograman-rust-4m3g</guid>
      <description>&lt;p&gt;Bagian ini membahas tentang gambaran umum dari bahasa pemrograman serta peranti pengembangan Rust. Dengan mempelajari bab ini, pembaca diharapkan bisa memahami gambaran umum dari Rust sehingga bisa memberikan semacam pemahaman terhadap ruang lingkup masalah-masalah pemrograman yang bisa diselesaikan menggunakan Rust serta posisi Rust di antara berbagai bahasa pemrograman dan peranti pengembangan lainnya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apakah Rust Itu?
&lt;/h2&gt;

&lt;p&gt;Secara umum, biasanya para pemrograman akan menyebut &lt;em&gt;Rust&lt;/em&gt; untuk segala macam peranti pengembangan yang terkait dengan Rust. Pada dasarnya, saat membicarakan tentang peranti pengembangan, ada beberapa komponen sebagai berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spesifikasi bahasa pemrograman&lt;/li&gt;
&lt;li&gt;Implementasi bahasa pemrograman dalam bentuk &lt;em&gt;compiler&lt;/em&gt; / &lt;em&gt;interpreter&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Package Manager&lt;/em&gt; yang digunakan untuk mengelola pustaka / paket yang diperlukan saat dilakukan proses kompilasi maupun untuk instalasi berbagai peranti pendukung yang dibutuhkan pemrogram saat membangun aplikasi.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Build Tool&lt;/em&gt; yang digunakan untuk mengelola proses kompilasi serta hasil akhirnya.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hal tersebut juga berlaku untuk &lt;em&gt;Rust&lt;/em&gt;. Meskipun seringkali hanya disebut &lt;em&gt;Rust&lt;/em&gt;, biasanya sudah mengacu ke setidaknya spesifikasi bahasa pemrograman Rust serta &lt;em&gt;compiler&lt;/em&gt; dari Rust. Pada pembahasan ini, penyebutan &lt;em&gt;Rust&lt;/em&gt; akan mengacu pada spesifikasi bahasa pemrograman serta peranti standar untuk &lt;em&gt;compiler&lt;/em&gt; maupun pustaka standar yang disertakan pada saat instalasi Rust. Informasi tentang Rust bisa diperoleh di &lt;a href="https://www.rust-lang.org/"&gt;Web bahasa pemrograman Rust&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sejarah Singkat Rust
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Rust pertama kali dibuat oleh salah seorang pegawai dari Mozilla yang bernama &lt;em&gt;Graydon Hoare&lt;/em&gt; sekitar tahun 2006. Saat itu, Graydon membuat bahasa pemrograman baru dan &lt;em&gt;compiler&lt;/em&gt; dari bahasa pemrograman tersebut menggunakan &lt;a href="https://ocaml.org"&gt;OCaml&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Mozilla mulai men-sponsori dan mendukung Rust untuk keperluan internal pada tahun 2009 (diumumkan tahun 2010).&lt;/li&gt;
&lt;li&gt;Tahun 2010, pengembangan Rust menggunakan OCaml dihentikan, digantikan dengan &lt;em&gt;self-hosting compiler&lt;/em&gt; (Rust dibuat dengan menggunakan Rust). Tahun 2011, Rust berhasil digunakan untuk mengkompilasi dirinya sendiri. Saat itu, Rust menggunakan &lt;em&gt;LLVM&lt;/em&gt; sbagai &lt;em&gt;compiler backend&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Versi stabil pertama (versi 1.0.0) dari Rust berhasil dirilis pada tanggal 15 Mei 2015.&lt;/li&gt;
&lt;li&gt;Setelah itu, Rust menetapkan pola rilis pasti setiap 6 minggu, artinya setiap 6 minggu ada rilis baru untuk versi stabil, beta, dan &lt;em&gt;nightly&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Paradigma Pemrograman Rust
&lt;/h2&gt;

&lt;p&gt;Paradigma pemrograman merupakan cara pandang untuk menyelesaikan permasalahan pemrograman. Rust tidak mempunyai suatu paradigma pemrograman spesifik tertentu, tetapi lebih ke arah &lt;em&gt;multi-paradigm&lt;/em&gt; atau mempunyai lebih dari satu paradigma. Secara umum, paradigma pemrograman Rust adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Konkuren: mendukung pemrograman secara konkuren, artinya lebih dari satu unit komputasi bisa dieksekusi secara "bersamaan" (secara &lt;em&gt;overlap&lt;/em&gt;, bergantian - tidak harus menunggu satu unit komputasi selesai baru kemudian satu unit komputasi berikutnya dieksekusi.&lt;/li&gt;
&lt;li&gt;Fungsional: program dikonstruksi dengan menggunakan melakukan komposisi &lt;em&gt;function&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Generik: tipe pada fungsi bisa dispesifikasikan belakangan, bukan pada saat pembuatan fungsi.&lt;/li&gt;
&lt;li&gt;Imperatif: program terdiri atas berbagai &lt;em&gt;statement&lt;/em&gt; yang mengubah &lt;em&gt;state&lt;/em&gt; dari program (misal dengan memanipulasi variabel, dan lain-lain).&lt;/li&gt;
&lt;li&gt;Terstruktur: program menekankan pada penggunakan berbagai struktur kendali serta subprogram, terutama digunakan untuk &lt;em&gt;readibility&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;PBO (Pemrograman Berorientasi Obyek): meski Rust tidak murni bahasa PBO, tetapi Rust mendukung berbagai fitur PBO yang memungkinkan pemrogram untuk mengkonstruksi program dengan pendekatan obyek yang mempunyai karakteristik serta perilaku tertentu dan adanya interaksi antar obyek tersebut dalam menyelesaikan masalah pemrograman.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lisensi Rust
&lt;/h2&gt;

&lt;p&gt;Semua artifak dari Rust (&lt;em&gt;compiler&lt;/em&gt;, logo, situs Web, dan lain-lain) mempunyai lisensi ganda:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;MIT License&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Apache License&lt;/em&gt; - Versi 2.0&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Software yang Dibangun Menggunakan Rust
&lt;/h2&gt;

&lt;p&gt;Rust digunakan untuk membangun berbagai software, mulai dari &lt;em&gt;low level&lt;/em&gt; sampai dengan &lt;em&gt;high level&lt;/em&gt;. Istilah &lt;em&gt;low level&lt;/em&gt; dan &lt;em&gt;high level&lt;/em&gt; ini digunakan untuk menunjukkan kedekatan dengan akses mesin. &lt;em&gt;Low level&lt;/em&gt; dikenal juga dengan istilah &lt;em&gt;system programming&lt;/em&gt; (meski istilah ini bukan merupakan istilah yang kanonikal). Rust merupakan satu di antara sedikit bahasa pemrograman dan peranti pengembangan yang bisa digunakan utk semua level. Bagian ini menunjukkan beberapa software yang dibangun dengan menggunakan Rust.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://servo.org/"&gt;Servo&lt;/a&gt;: &lt;em&gt;engine&lt;/em&gt; penjelajah Web (&lt;em&gt;Web browser&lt;/em&gt;) yang digunakan dalam browser &lt;em&gt;Mozilla Firefox&lt;/em&gt; melalui proyek &lt;em&gt;Quantum&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.redox-os.org/"&gt;Redox&lt;/a&gt;: sistem operasi baru dengan teknologi &lt;em&gt;microkernel&lt;/em&gt; dengan &lt;em&gt;userland&lt;/em&gt; mirip Unix.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.nushell.sh/"&gt;Nushell&lt;/a&gt;: shell.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tikv.org/"&gt;TiKV&lt;/a&gt;: basis data &lt;em&gt;key-value&lt;/em&gt; transaksional yang terdistribusi.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://deno.land/"&gt;Deno&lt;/a&gt;: &lt;em&gt;runtime&lt;/em&gt; untuk JavaScript dan TypeScript.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://discord.com/"&gt;Discord&lt;/a&gt;: salah satu peranti pengembangan yang digunakan untuk mengembangkan sistem Discord.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Domain Masalah dari Rust
&lt;/h2&gt;

&lt;p&gt;Rust bisa digunakan untuk menyelesaikan berbagai masalah pada berbagai domain. Secara umum, Rust bisa digunakan untuk pembuatan software di aras rendah (&lt;em&gt;system programming&lt;/em&gt;) maupun di berbagai masalah pemrograman aras atas. Beberapa domain masalah yang bisa diselesaikan oleh Rust antara lain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;System Programming&lt;/li&gt;
&lt;li&gt;Akses ke peranti keras (&lt;em&gt;interfacing&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;CLI (&lt;em&gt;Command Line Interface&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;li&gt;Aplikasi Web&lt;/li&gt;
&lt;li&gt;Akses ke berbagai basis data&lt;/li&gt;
&lt;li&gt;GUI (&lt;em&gt;Graphical User Interface&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Cloud&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>rust</category>
      <category>belajar</category>
      <category>seri</category>
    </item>
    <item>
      <title>Using YugabyteDB in Python App Development</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Sat, 28 Aug 2021 09:47:01 +0000</pubDate>
      <link>https://forem.com/zimeracorp/using-yugabytedb-in-python-app-development-2en5</link>
      <guid>https://forem.com/zimeracorp/using-yugabytedb-in-python-app-development-2en5</guid>
      <description>&lt;p&gt;As a long time &lt;a href="https://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; user, it's normal that &lt;a href="https://www.yugabyte.com/"&gt;YugabyteDB&lt;/a&gt; got my attention. It's a distributed SQL database which features-compatible with PostgreSQL so that I don't need to lose my investation. YugabyteDB reuses PostgreSQL's query layer, so I can use my development tools as usual. It gives me more since there is also Cassandra query layer. Using YugabyteDB I can reuse my SQL skill and development tools, enhanced with NOSQL data model (especially &lt;strong&gt;wide-column store&lt;/strong&gt;), while I have NewSQL's resiliency, scalability, and high performance.&lt;/p&gt;

&lt;p&gt;In this article, I am going to setup YugabyteDB for local cluster, populate data, and access the data using Python3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install and Configure YugabyteDB
&lt;/h2&gt;

&lt;p&gt;Installation is very easy and straightforward. No source code compilation (well, unless you really want to dig that deep). Just &lt;a href="https://download.yugabyte.com/local"&gt;download&lt;/a&gt; YugabyteDB, extract, then execute &lt;code&gt;bin/post-install.sh&lt;/code&gt;. When this step has finished, make sure that &lt;code&gt;path/to/extracted/yugabytedb/bin&lt;/code&gt; is in the $PATH. Here's what I did:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fish Shell&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; path/to/extracted/yugabytedb/bin &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bash Shell&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;path/to/extracted/yugabytedb/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: to avoid writing the same thing over and over again, I usually put the &lt;code&gt;set&lt;/code&gt; or &lt;code&gt;export&lt;/code&gt; statements above inside a file and then whenever I want to use YugabyteDB, I just &lt;code&gt;source the-file.sh&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, we need to configure YugabyteDB. To configure YugabyteDB, see &lt;a href="https://docs.yugabyte.com/latest/deploy/manual-deployment/system-config/"&gt;YugabyteDB configuration&lt;/a&gt;. The documentation is complete but to have everything works, all I need to do is changing &lt;code&gt;/etc/security/limits.conf&lt;/code&gt; to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/security/limits.conf&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;#Each line describes a limit for a user in the form:&lt;/span&gt;
...
...
...
&lt;span class="c"&gt;#&amp;lt;domain&amp;gt;      &amp;lt;type&amp;gt;  &amp;lt;item&amp;gt;         &amp;lt;value&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;

&lt;span class="k"&gt;*&lt;/span&gt;                -       core            unlimited
&lt;span class="k"&gt;*&lt;/span&gt;                -       data            unlimited
&lt;span class="k"&gt;*&lt;/span&gt;                -       fsize           unlimited
&lt;span class="k"&gt;*&lt;/span&gt;                -       sigpending      119934
&lt;span class="k"&gt;*&lt;/span&gt;                -       memlock         64
&lt;span class="k"&gt;*&lt;/span&gt;                -       rss             unlimited
&lt;span class="k"&gt;*&lt;/span&gt;                -       nofile          1048576
&lt;span class="k"&gt;*&lt;/span&gt;                -       msgqueue        819200
&lt;span class="k"&gt;*&lt;/span&gt;                -       stack           8192
&lt;span class="k"&gt;*&lt;/span&gt;                -       cpu             unlimited
&lt;span class="k"&gt;*&lt;/span&gt;                -       &lt;span class="nb"&gt;nproc           &lt;/span&gt;12000
&lt;span class="k"&gt;*&lt;/span&gt;                -       locks           unlimited

&lt;span class="c"&gt;# End of file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depends on your situation, maybe you need to restart or just logout-login back. &lt;/p&gt;

&lt;p&gt;All data, logs, configurations, etc for YugabyteDB reside in &lt;code&gt;$HOME/var/&lt;/code&gt;. Do check &lt;code&gt;$HOME/var/conf/yugabytedb.conf&lt;/code&gt; for more configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"tserver_webserver_port"&lt;/span&gt;: 9000, 
    &lt;span class="s2"&gt;"master_rpc_port"&lt;/span&gt;: 7100, 
    &lt;span class="s2"&gt;"universe_uuid"&lt;/span&gt;: &lt;span class="s2"&gt;"dabc3d28-6982-4585-8b10-5faa7352da02"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"webserver_port"&lt;/span&gt;: 7200, 
    &lt;span class="s2"&gt;"ysql_enable_auth"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;, 
    &lt;span class="s2"&gt;"cluster_member"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;, 
    &lt;span class="s2"&gt;"ycql_port"&lt;/span&gt;: 9042, 
    &lt;span class="s2"&gt;"data_dir"&lt;/span&gt;: &lt;span class="s2"&gt;"/home/bpdp/var/data"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"tserver_uuid"&lt;/span&gt;: &lt;span class="s2"&gt;"71ad70b8eef149ae945842572e0fff75"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"use_cassandra_authentication"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;, 
    &lt;span class="s2"&gt;"log_dir"&lt;/span&gt;: &lt;span class="s2"&gt;"/home/bpdp/var/logs"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"polling_interval"&lt;/span&gt;: &lt;span class="s2"&gt;"5"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"listen"&lt;/span&gt;: &lt;span class="s2"&gt;"0.0.0.0"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"callhome"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;, 
    &lt;span class="s2"&gt;"master_webserver_port"&lt;/span&gt;: 7000, 
    &lt;span class="s2"&gt;"master_uuid"&lt;/span&gt;: &lt;span class="s2"&gt;"1ef618e573a04e1d835f4ed4364825d7"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"master_flags"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;, 
    &lt;span class="s2"&gt;"node_uuid"&lt;/span&gt;: &lt;span class="s2"&gt;"6ae31951-7199-4c22-b30b-e8f235cef7db"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"join"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;, 
    &lt;span class="s2"&gt;"ysql_port"&lt;/span&gt;: 5433, 
    &lt;span class="s2"&gt;"tserver_flags"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;, 
    &lt;span class="s2"&gt;"tserver_rpc_port"&lt;/span&gt;: 9100
&lt;span class="o"&gt;}&lt;/span&gt;                                                          
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: PostgreSQL usually uses port 5432, but YugabyteDB default port is 5433. Pay attention to this since we are going to use this when we write our code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So many things we can do with YugabyteDB, but for this article, I will concentrate more on Python app development. Therefore, it's enough now to have local cluster. Let's set it up!.&lt;/p&gt;

&lt;p&gt;Let's run YugabyteDB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yugabyted start
Starting yugabyted...
✅ System checks           

+--------------------------------------------------------------------------------------------------+
|                                            yugabyted                                             |
+--------------------------------------------------------------------------------------------------+
| Status              : Running. Leader Master is present                                          |
| Web console         : http://127.0.0.1:7000                                                      |
| JDBC                : jdbc:postgresql://127.0.0.1:5433/yugabyte?user&lt;span class="o"&gt;=&lt;/span&gt;yugabyte&amp;amp;password&lt;span class="o"&gt;=&lt;/span&gt;yugabyte  |
| YSQL                : bin/ysqlsh   &lt;span class="nt"&gt;-U&lt;/span&gt; yugabyte &lt;span class="nt"&gt;-d&lt;/span&gt; yugabyte                                       |
| YCQL                : bin/ycqlsh   &lt;span class="nt"&gt;-u&lt;/span&gt; cassandra                                                  |
| Data Dir            : /home/bpdp/var/data                                                        |
| Log Dir             : /home/bpdp/var/logs                                                        |
| Universe UUID       : dabc3d28-6982-4585-8b10-5faa7352da02                                       |
+--------------------------------------------------------------------------------------------------+
🚀 yugabyted started successfully! To load a sample dataset, try &lt;span class="s1"&gt;'yugabyted demo'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
🎉 Join us on Slack at https://www.yugabyte.com/slack
👕 Claim your free t-shirt at https://www.yugabyte.com/community-rewards/
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yugabyted status

+--------------------------------------------------------------------------------------------------+
|                                            yugabyted                                             |
+--------------------------------------------------------------------------------------------------+
| Status              : Running. Leader Master is present                                          |
| Web console         : http://127.0.0.1:7000                                                      |
| JDBC                : jdbc:postgresql://127.0.0.1:5433/yugabyte?user&lt;span class="o"&gt;=&lt;/span&gt;yugabyte&amp;amp;password&lt;span class="o"&gt;=&lt;/span&gt;yugabyte  |
| YSQL                : bin/ysqlsh   &lt;span class="nt"&gt;-U&lt;/span&gt; yugabyte &lt;span class="nt"&gt;-d&lt;/span&gt; yugabyte                                       |
| YCQL                : bin/ycqlsh   &lt;span class="nt"&gt;-u&lt;/span&gt; cassandra                                                  |
| Data Dir            : /home/bpdp/var/data                                                        |
| Log Dir             : /home/bpdp/var/logs                                                        |
| Universe UUID       : dabc3d28-6982-4585-8b10-5faa7352da02                                       |
+--------------------------------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just in case you need to shutdown YugabyteDB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yugabyted stop
Stopped yugabyted using config /home/bpdp/var/conf/yugabyted.conf.
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, now let YugabyteDB runs. We will use that for later processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Preparation
&lt;/h2&gt;

&lt;p&gt;Now, it gets more interesting. Using one YugabyteDB server instance, we can use both SQL and Cassandra data model. Let's aggregate some data into PostgreSQL layer and Cassandra layer. For this purpose, we still use default user and password. Later on, you can manage the security side of YugabyteDB.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: default username and password for PostgreSQL layer: &lt;strong&gt;yugabyte:yugabyte&lt;/strong&gt;, while for Cassandra: &lt;strong&gt;cassandra:cassandra&lt;/strong&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  SQL Data
&lt;/h3&gt;

&lt;p&gt;YugabyteDB provides &lt;a href="https://docs.yugabyte.com/latest/sample-data/"&gt;sample datasets&lt;/a&gt; for SQL data. We are going to use &lt;a href="https://docs.yugabyte.com/latest/sample-data/northwind/"&gt;Northwind Traders Database&lt;/a&gt;. Get the &lt;code&gt;DDL&lt;/code&gt; and &lt;code&gt;Data&lt;/code&gt; scripts from the Northwind sample datasets URL. Follow this sceen dump to prepare the database, tables, and populate the data. The &lt;strong&gt;#&lt;/strong&gt; pompt is the place to write command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ysqlsh &lt;span class="nt"&gt;-U&lt;/span&gt; yugabyte
ysqlsh &lt;span class="o"&gt;(&lt;/span&gt;11.2-YB-2.7.2.0-b0&lt;span class="o"&gt;)&lt;/span&gt;
Type &lt;span class="s2"&gt;"help"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;help.

&lt;span class="nv"&gt;yugabyte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# create database northwind;&lt;/span&gt;
CREATE DATABASE
&lt;span class="nv"&gt;yugabyte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# \l&lt;/span&gt;
                                   List of databases
      Name       |  Owner   | Encoding | Collate |    Ctype    |   Access privileges   
&lt;span class="nt"&gt;-----------------&lt;/span&gt;+----------+----------+---------+-------------+-----------------------
 northwind       | yugabyte | UTF8     | C       | en_US.UTF-8 | 
 postgres        | postgres | UTF8     | C       | en_US.UTF-8 | 
 system_platform | postgres | UTF8     | C       | en_US.UTF-8 | 
 template0       | postgres | UTF8     | C       | en_US.UTF-8 | &lt;span class="o"&gt;=&lt;/span&gt;c/postgres          +
                 |          |          |         |             | &lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CTc/postgres
 template1       | postgres | UTF8     | C       | en_US.UTF-8 | &lt;span class="o"&gt;=&lt;/span&gt;c/postgres          +
                 |          |          |         |             | &lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CTc/postgres
 yugabyte        | postgres | UTF8     | C       | en_US.UTF-8 | 
&lt;span class="o"&gt;(&lt;/span&gt;6 rows&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;yugabyte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# \c northwind&lt;/span&gt;
You are now connected to database &lt;span class="s2"&gt;"northwind"&lt;/span&gt; as user &lt;span class="s2"&gt;"yugabyte"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;northwind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# \i northwind_ddl.sql &lt;/span&gt;
SET
SET
SET
SET
SET
SET
SET
SET
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
&lt;span class="nv"&gt;northwind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# \d&lt;/span&gt;
                 List of relations
 Schema |          Name          | Type  |  Owner   
&lt;span class="nt"&gt;--------&lt;/span&gt;+------------------------+-------+----------
 public | categories             | table | yugabyte
 public | customer_customer_demo | table | yugabyte
 public | customer_demographics  | table | yugabyte
 public | customers              | table | yugabyte
 public | employee_territories   | table | yugabyte
 public | employees              | table | yugabyte
 public | order_details          | table | yugabyte
 public | orders                 | table | yugabyte
 public | products               | table | yugabyte
 public | region                 | table | yugabyte
 public | shippers               | table | yugabyte
 public | suppliers              | table | yugabyte
 public | territories            | table | yugabyte
 public | us_states              | table | yugabyte
&lt;span class="o"&gt;(&lt;/span&gt;14 rows&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;northwind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# \i northwind_data.sql&lt;/span&gt;
...
...
...
INSERT 0 1
INSERT 0 1
INSERT 0 1
&lt;span class="nv"&gt;northwind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# select * from products;&lt;/span&gt;
 product_id |           product_name           | supplier_id | category_id |  quantity_per_unit   | unit_price | units_in_s
tock | units_on_order | reorder_level | discontinued 
&lt;span class="nt"&gt;------------&lt;/span&gt;+----------------------------------+-------------+-------------+----------------------+------------+-----------
&lt;span class="nt"&gt;-----&lt;/span&gt;+----------------+---------------+--------------
          4 | Chef Anton&lt;span class="s1"&gt;'s Cajun Seasoning     |           2 |           2 | 48 - 6 oz jars       |         22 |           
  53 |              0 |             0 |            0
         46 | Spegesild                        |          21 |           8 | 4 - 450 g glasses    |         12 |           
  95 |              0 |             0 |            0
         73 | Röd Kaviar                       |          17 |           8 | 24 - 150 g jars      |         15 |           
 101 |              0 |             5 |            0
         29 | Thüringer Rostbratwurst          |          12 |           6 | 50 bags x 30 sausgs. |     123.79 |           
   0 |              0 |             0 |            1
         70 | Outback Lager                    |           7 |           1 | 24 - 355 ml bottles  |         15 |           
  15 |             10 |            30 |            0
         25 | NuNuCa Nuß-Nougat-Creme          |          11 |           3 | 20 - 450 g glasses   |         14 |           
  76 |              0 |            30 |            0
         54 | Tourtière                        |          25 |           6 | 16 pies              |       7.45 |           
  21 |              0 |            10 |            0
...
...
...
         17 | Alice Mutton                     |           7 |           6 | 20 - 1 kg tins       |         39 |           
   0 |              0 |             0 |            1
         59 | Raclette Courdavault             |          28 |           4 | 5 kg pkg.            |         55 |           
  79 |              0 |             0 |            0
(77 rows)

northwind=#  
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finish with SQL data, it's about the time to populate column-wide - Cassandra data.&lt;/p&gt;

&lt;h3&gt;
  
  
  NOSQL Column-wide Data - Apache Cassandra
&lt;/h3&gt;

&lt;p&gt;We will use a simple keyspace: one keyspace, consists of one table. Create a CQL script file (here, the file name is &lt;code&gt;zimera-employees.cql&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;KEYSPACE&lt;/span&gt; &lt;span class="n"&gt;zimera&lt;/span&gt;
  &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;replication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'class'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'SimpleStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'replication_factor'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;zimera&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;e_id&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;e_fullname&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;e_address&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;e_dept&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;e_role&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e_fullname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e_dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e_role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Zaky A. Aditya'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Information Technology'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Machine Learning Developer'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ycqlsh &lt;span class="nt"&gt;-f&lt;/span&gt; zimera-employees.cql 
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check whether succeed or not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ycqlsh &lt;span class="nt"&gt;-u&lt;/span&gt; cassandra
Password: 
Connected to &lt;span class="nb"&gt;local &lt;/span&gt;cluster at 127.0.0.1:9042.
&lt;span class="o"&gt;[&lt;/span&gt;ycqlsh 5.0.1 | Cassandra 3.9-SNAPSHOT | CQL spec 3.4.2 | Native protocol v4]
Use HELP &lt;span class="k"&gt;for &lt;/span&gt;help.
cassandra@ycqlsh&amp;gt; use zimera&lt;span class="p"&gt;;&lt;/span&gt;
cassandra@ycqlsh:zimera&amp;gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; from employees&lt;span class="p"&gt;;&lt;/span&gt;

 e_id | e_fullname     | e_address                                                            | e_dept                 | e_role
&lt;span class="nt"&gt;------&lt;/span&gt;+----------------+----------------------------------------------------------------------+------------------------+----------------------------
    1 | Zaky A. Aditya | Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia | Information Technology | Machine Learning Developer

&lt;span class="o"&gt;(&lt;/span&gt;1 rows&lt;span class="o"&gt;)&lt;/span&gt;
cassandra@ycqlsh:zimera&amp;gt; 
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Python - Drivers
&lt;/h2&gt;

&lt;p&gt;Since we are going to use both PostgreSQL and Apache Cassandra data model, we need to install those two drivers: &lt;a href="https://www.psycopg.org/"&gt;psycopg2&lt;/a&gt; for PostgreSQL and &lt;a href="https://github.com/datastax/python-driver"&gt;Python Driver for Apache Cassandra&lt;/a&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: currently, &lt;code&gt;psycopg&lt;/code&gt; is still developing &lt;a href="https://www.psycopg.org/psycopg3/"&gt;psycopg3&lt;/a&gt;. We do not use psycopg3 since it is still in early development stage, but once &lt;code&gt;psycopg3&lt;/code&gt; is released, there should be easy to migrate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Install Cassandra Driver&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;conda &lt;span class="nb"&gt;install &lt;/span&gt;cassandra-driver
...
...
...
  added / updated specs:
    - cassandra-driver


The following packages will be downloaded:

    package                    |            build
    &lt;span class="nt"&gt;---------------------------&lt;/span&gt;|-----------------
    cassandra-driver-3.25.0    |   py39h27cfd23_0         3.0 MB
    &lt;span class="nt"&gt;------------------------------------------------------------&lt;/span&gt;
                                           Total:         3.0 MB

The following NEW packages will be INSTALLED:

  blas               pkgs/main/linux-64::blas-1.0-mkl
  cassandra-driver   pkgs/main/linux-64::cassandra-driver-3.25.0-py39h27cfd23_0
  intel-openmp       pkgs/main/linux-64::intel-openmp-2021.3.0-h06a4308_3350
  libev              pkgs/main/linux-64::libev-4.33-h7b6447c_0
  mkl                pkgs/main/linux-64::mkl-2021.3.0-h06a4308_520
  mkl-service        pkgs/main/linux-64::mkl-service-2.4.0-py39h7f8727e_0
  mkl_fft            pkgs/main/linux-64::mkl_fft-1.3.0-py39h42c9631_2
  mkl_random         pkgs/main/linux-64::mkl_random-1.2.2-py39h51133e4_0
  numpy              pkgs/main/linux-64::numpy-1.20.3-py39hf144106_0
  numpy-base         pkgs/main/linux-64::numpy-base-1.20.3-py39h74d4b33_0
  six                pkgs/main/noarch::six-1.16.0-pyhd3eb1b0_0


Proceed &lt;span class="o"&gt;([&lt;/span&gt;y]/n&lt;span class="o"&gt;)&lt;/span&gt;? y
...
...
...
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Install PostgreSQL Driver&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;conda &lt;span class="nb"&gt;install &lt;/span&gt;psycopg2                                                              ...
...
...
  added / updated specs:
    - psycopg2


The following NEW packages will be INSTALLED:

  krb5               pkgs/main/linux-64::krb5-1.19.2-hac12032_0
  libedit            pkgs/main/linux-64::libedit-3.1.20210714-h7f8727e_0
  libpq              pkgs/main/linux-64::libpq-12.2-h553bfba_1
  psycopg2           pkgs/main/linux-64::psycopg2-2.8.6-py39h3c74f83_1


Proceed &lt;span class="o"&gt;([&lt;/span&gt;y]/n&lt;span class="o"&gt;)&lt;/span&gt;? y
...
...
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I use &lt;code&gt;conda&lt;/code&gt; for package management, but you don't need to. You can also use &lt;code&gt;pip&lt;/code&gt;, in this case just &lt;code&gt;pip install psycopg2&lt;/code&gt; and &lt;code&gt;pip install cassandra-driver&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Let's Code!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Accessing SQL Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# code-sql.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;psycopg2&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"northwind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yugabyte"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"5433"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yugabyte"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Open a cursor to perform database operations
&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Execute a query
&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT * FROM products"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Retrieve query results
&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python code-sql.py
&lt;span class="o"&gt;(&lt;/span&gt;4, &lt;span class="s2"&gt;"Chef Anton's Cajun Seasoning"&lt;/span&gt;, 2, 2, &lt;span class="s1"&gt;'48 - 6 oz jars'&lt;/span&gt;, 22.0, 53, 0, 0, 0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessing Cassandra Data Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cassandra.cluster&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;

&lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'zimera'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'SELECT e_fullname, e_address, e_dept, e_role FROM employees'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_fullname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python code-cassandra.py 
Zaky A. Aditya Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia Information Technology Machine Learning Developer
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What if we want to use both data model in one python source code? Here you go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# code-all.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;psycopg2&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cassandra.cluster&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"northwind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yugabyte"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"5433"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yugabyte"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Open a cursor to perform database operations
&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Execute a query
&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT * FROM products"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Retrieve query results
&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'zimera'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'SELECT e_fullname, e_address, e_dept, e_role FROM employees'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_fullname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;e_role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python code-all.py
&lt;span class="o"&gt;(&lt;/span&gt;4, &lt;span class="s2"&gt;"Chef Anton's Cajun Seasoning"&lt;/span&gt;, 2, 2, &lt;span class="s1"&gt;'48 - 6 oz jars'&lt;/span&gt;, 22.0, 53, 0, 0, 0&lt;span class="o"&gt;)&lt;/span&gt;
Zaky A. Aditya Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia Information Technology Machine Learning Developer
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aren't they cool? Happy coding!&lt;/p&gt;

</description>
      <category>python</category>
      <category>yugabytedb</category>
      <category>cassandra</category>
      <category>postgres</category>
    </item>
    <item>
      <title>WebSharper: Getting Started Easily</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Wed, 25 Aug 2021 03:49:01 +0000</pubDate>
      <link>https://forem.com/zimeracorp/websharper-getting-started-easily-5haa</link>
      <guid>https://forem.com/zimeracorp/websharper-getting-started-easily-5haa</guid>
      <description>&lt;p&gt;So I am stuck again when I want to create a web app. Don't laugh. I come from *NIX environment and the way everything is started in WebSharper is quite confusing at first. I tried to go to &lt;a href="https://developers.websharper.com/docs/v4.x/fs/overview"&gt;installation documentation&lt;/a&gt; but I don't use Visual Studio nor MonoDevelop. Using &lt;a href="https://fsprojects.github.io/Paket/"&gt;paket&lt;/a&gt; also doesn't solve my problem since they also seem to use Visual Studio or MonoDevelop. &lt;/p&gt;

&lt;p&gt;As someone who used to work in a shell environment, of course using shell is always my preferred way to do something. Then I open the &lt;a href="https://websharper.com/downloads"&gt;Downloads page&lt;/a&gt; which turns out become my saviour.&lt;/p&gt;

&lt;p&gt;In short, I have to install template first then using the template to create a skeleton of application and then hack away that skeleton. Easier for me :-D. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: make sure you have installed .NET SDK - current version 5.x.x and .NET SDK - LTS version 3.x.x. Read my other &lt;a href="https://dev.to/zimera/multiple-net-sdk-and-runtimes-installation-28bi"&gt;article&lt;/a&gt; on this matter. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install Application Template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new &lt;span class="nt"&gt;-i&lt;/span&gt; WebSharper.Templates
Template Name                                 Short Name       Language    Tags                  
&lt;span class="nt"&gt;--------------------------------------------&lt;/span&gt;  &lt;span class="nt"&gt;---------------&lt;/span&gt;  &lt;span class="nt"&gt;----------&lt;/span&gt;  &lt;span class="nt"&gt;----------------------&lt;/span&gt;
Console Application                           console          &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Common/Console        
Class library                                 classlib         &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Common/Library        
Worker Service                                worker           &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Common/Worker/Web     
MSTest Test Project                           mstest           &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/MSTest           
NUnit 3 Test Item                             nunit-test       &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/NUnit            
NUnit 3 Test Project                          nunit            &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/NUnit            
xUnit Test Project                            xunit            &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/xUnit            
Razor Component                               razorcomponent   &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
Razor Page                                    page             &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
MVC ViewImports                               viewimports      &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
MVC ViewStart                                 viewstart        &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
Blazor Server App                             blazorserver     &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/Blazor            
Bolero Hosted Application                     bolero-app       F#          Web/Blazor/Bolero     
Blazor WebAssembly App                        blazorwasm       &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/Blazor/WebAssembly
ASP.NET Core Empty                            web              &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Web/Empty             
ASP.NET Core Web App &lt;span class="o"&gt;(&lt;/span&gt;Model-View-Controller&lt;span class="o"&gt;)&lt;/span&gt;  mvc              &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Web/MVC               
ASP.NET Core Web App                          webapp           &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/Razor Pages   
ASP.NET Core with Angular                     angular          &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/SPA           
ASP.NET Core with React.js                    react            &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/SPA           
ASP.NET Core with React.js and Redux          reactredux       &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/SPA           
Razor Class Library                           razorclasslib    &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/Razor/Library     
ASP.NET Core Web API                          webapi           &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Web/WebAPI            
ASP.NET Core gRPC Service                     grpc             &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/gRPC              
WebSharper 4 Extension                        websharper-ext   F#          WebSharper            
WebSharper 4 Library                          websharper-lib   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper            
WebSharper 4 Proxy                            websharper-prx   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper            
WebSharper 4 Client-Server Application        websharper-web   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper/Web        
WebSharper 4 Html Site                        websharper-html  &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper/Web        
WebSharper 4 Single Page Application          websharper-spa   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper/Web        
dotnet gitignore file                         gitignore                    Config                
global.json file                              globaljson                   Config                
NuGet Config                                  nugetconfig                  Config                
Dotnet &lt;span class="nb"&gt;local &lt;/span&gt;tool manifest file               tool-manifest                Config                
Web Config                                    webconfig                    Config                
Solution File                                 sln                          Solution              
Protocol Buffer File                          proto                        Web/gRPC              

Examples:
    dotnet new mvc &lt;span class="nt"&gt;--auth&lt;/span&gt; Individual
    dotnet new websharper-lib
    dotnet new &lt;span class="nt"&gt;--help&lt;/span&gt;
    dotnet new websharper-web &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have these templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
...
WebSharper 4 Extension                        websharper-ext   F#          WebSharper            
WebSharper 4 Library                          websharper-lib   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper            
WebSharper 4 Proxy                            websharper-prx   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper            
WebSharper 4 Client-Server Application        websharper-web   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper/Web        
WebSharper 4 Html Site                        websharper-html  &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper/Web        
WebSharper 4 Single Page Application          websharper-spa   &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     WebSharper/Web        
...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay attention to the &lt;strong&gt;shortname&lt;/strong&gt;, we are going to use that. To see more information about the templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
...
...
  WebSharper.Templates
    Details:
      NuGetPackageId: WebSharper.Templates
      Version: 4.7.3.424
      Author: IntelliFactory
    Templates:
      WebSharper 4 Client-Server Application &lt;span class="o"&gt;(&lt;/span&gt;websharper-web&lt;span class="o"&gt;)&lt;/span&gt; C#
      WebSharper 4 Client-Server Application &lt;span class="o"&gt;(&lt;/span&gt;websharper-web&lt;span class="o"&gt;)&lt;/span&gt; F#
      WebSharper 4 Extension &lt;span class="o"&gt;(&lt;/span&gt;websharper-ext&lt;span class="o"&gt;)&lt;/span&gt; F#
      WebSharper 4 Library &lt;span class="o"&gt;(&lt;/span&gt;websharper-lib&lt;span class="o"&gt;)&lt;/span&gt; C#
      WebSharper 4 Library &lt;span class="o"&gt;(&lt;/span&gt;websharper-lib&lt;span class="o"&gt;)&lt;/span&gt; F#
      WebSharper 4 Html Site &lt;span class="o"&gt;(&lt;/span&gt;websharper-html&lt;span class="o"&gt;)&lt;/span&gt; C#
      WebSharper 4 Html Site &lt;span class="o"&gt;(&lt;/span&gt;websharper-html&lt;span class="o"&gt;)&lt;/span&gt; F#
      WebSharper 4 Proxy &lt;span class="o"&gt;(&lt;/span&gt;websharper-prx&lt;span class="o"&gt;)&lt;/span&gt; C#
      WebSharper 4 Proxy &lt;span class="o"&gt;(&lt;/span&gt;websharper-prx&lt;span class="o"&gt;)&lt;/span&gt; F#
      WebSharper 4 Single Page Application &lt;span class="o"&gt;(&lt;/span&gt;websharper-spa&lt;span class="o"&gt;)&lt;/span&gt; C#
      WebSharper 4 Single Page Application &lt;span class="o"&gt;(&lt;/span&gt;websharper-spa&lt;span class="o"&gt;)&lt;/span&gt; F#
    Uninstall Command:
      dotnet new &lt;span class="nt"&gt;-u&lt;/span&gt; WebSharper.Templates
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are 6 types of templates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Client-Server Application&lt;/strong&gt; / &lt;code&gt;websharper-web&lt;/code&gt;: full client-server application - in other world, it is usually called &lt;strong&gt;fullstack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extension&lt;/strong&gt; / &lt;code&gt;websharper-ext&lt;/code&gt;: interface to an existing JS library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library&lt;/strong&gt; / &lt;code&gt;websharper-lib&lt;/code&gt;: library which can be used in any WebSharper project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML Site&lt;/strong&gt; / &lt;code&gt;websharper-html&lt;/code&gt;: multipage HTML/JavaScript application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy&lt;/strong&gt; / &lt;code&gt;websharper-prx&lt;/code&gt;: JavaScript-compilable F# implementations for classes and modules that were compiled without WebSharper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Page Application&lt;/strong&gt; / &lt;code&gt;websharper-spa&lt;/code&gt;: single page HTML/JavaScript with HTML and F# contents plugs into it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As an example, I will use SPA template to create a skeleton of SPA project. Here's how to do that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new websharper-spa &lt;span class="nt"&gt;-lang&lt;/span&gt; f# &lt;span class="nt"&gt;-n&lt;/span&gt; helloSPA
The template &lt;span class="s2"&gt;"WebSharper 4 Single Page Application"&lt;/span&gt; was created successfully.
...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;helloSPA&lt;/code&gt; is project name which later becomes application name.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;helloSPA
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 28
drwxr-xr-x 3 bpdp bpdp 4096 Agu 25 10:19 ./
drwxr-xr-x 3 bpdp bpdp 4096 Agu 25 10:19 ../
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp 1019 Agu 25 10:19 Client.fs
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  599 Agu 25 10:19 helloSPA.fsproj
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp 1045 Agu 25 10:19 Startup.fs
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  123 Agu 25 10:19 wsconfig.json
drwxr-xr-x 2 bpdp bpdp 4096 Agu 25 10:19 wwwroot/
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Now we have a skeleton of SPA app. Let's try to run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet run
Hosting environment: Production
Content root path: /home/bpdp/kerjaan/src/fsharp/websharper/artikel/helloSPA
Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:5000&lt;/code&gt; using your browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZBK_xBMe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isoqytdltr0daavjljzk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZBK_xBMe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isoqytdltr0daavjljzk.jpg" alt="SPA app runing - using WebSharper"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voila! you have WebSharper up and running. Now, what you need to do is to understand the contents of an SPA app using WebSharper. This one deserves its own articles. At this point, your knowledge on F#, packages / libs, and WebSharper is important. &lt;/p&gt;

&lt;h2&gt;
  
  
  Update Templates
&lt;/h2&gt;

&lt;p&gt;Whenever there are new releases, we can always update the templates using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"WebSharper.Templates::*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>websharper</category>
      <category>dotnet</category>
      <category>fsharp</category>
    </item>
    <item>
      <title>Multiple .NET SDKs and Runtimes Installation</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Sun, 22 Aug 2021 08:52:49 +0000</pubDate>
      <link>https://forem.com/zimeracorp/multiple-net-sdk-and-runtimes-installation-28bi</link>
      <guid>https://forem.com/zimeracorp/multiple-net-sdk-and-runtimes-installation-28bi</guid>
      <description>&lt;p&gt;As a beginner in Microsoft ecosystem, especially under Linux, I found a little bit difficult to get everything works as expected. Last week, I tried to get &lt;a href="https://websharper.com/"&gt;WebSharper&lt;/a&gt; up and run but turns out I can not get it worked. I probably will write about this later. The solution is pretty simple: I need to have .NET SDK - LTS version (3.1.x) while I only have &lt;em&gt;Current&lt;/em&gt; version (5.x.x).&lt;/p&gt;

&lt;p&gt;So yes, I have to install more than one SDKs and Runtimes. How to do that? &lt;code&gt;dotnet&lt;/code&gt; command - AFAIK - can not be used to do that. The answer is &lt;a href="https://dotnet.microsoft.com/download/dotnet/scripts"&gt;dotnet-install scripts&lt;/a&gt; - available for Windows and for &lt;code&gt;Bash&lt;/code&gt; shell. Using this install script, I can install more than one SDK and Runtimes. Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install LTS Version First
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The argument &lt;code&gt;--install-dir&lt;/code&gt; is used to let installer knows the installation directory.&lt;/li&gt;
&lt;li&gt;The argument -c LTS means that we will install latest version from LTS channel
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet-install.sh &lt;span class="nt"&gt;--install-dir&lt;/span&gt; ~/software/dotnet-dev-tools/dotnet-all &lt;span class="nt"&gt;-c&lt;/span&gt; LTS
dotnet-install: Note that the intended use of this script is &lt;span class="k"&gt;for &lt;/span&gt;Continuous Integration &lt;span class="o"&gt;(&lt;/span&gt;CI&lt;span class="o"&gt;)&lt;/span&gt; scenarios, where:
dotnet-install: - The SDK needs to be installed without user interaction and without admin rights.
dotnet-install: - The SDK installation doesn&lt;span class="s1"&gt;'t need to persist across multiple CI runs.
dotnet-install: To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.

dotnet-install: Downloading primary link https://dotnetcli.azureedge.net/dotnet/Sdk/3.1.413/dotnet-sdk-3.1.413-linux-x64.tar.gz
dotnet-install: Extracting zip from https://dotnetcli.azureedge.net/dotnet/Sdk/3.1.413/dotnet-sdk-3.1.413-linux-x64.tar.gz
dotnet-install: Adding to current process PATH: `/home/bpdp/software/dotnet-dev-tools/dotnet-all`. Note: This change will be visible only when sourcing script.
dotnet-install: Note that the script does not resolve dependencies during installation.
dotnet-install: To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
dotnet-install: Installation finished successfully.
$
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Current Version
&lt;/h2&gt;

&lt;p&gt;Install current version at the same directory location&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet-install.sh &lt;span class="nt"&gt;--install-dir&lt;/span&gt; ~/software/dotnet-dev-tools/dotnet-all &lt;span class="nt"&gt;-c&lt;/span&gt; Current
dotnet-install: Note that the intended use of this script is &lt;span class="k"&gt;for &lt;/span&gt;Continuous Integration &lt;span class="o"&gt;(&lt;/span&gt;CI&lt;span class="o"&gt;)&lt;/span&gt; scenarios, where:
dotnet-install: - The SDK needs to be installed without user interaction and without admin rights.
dotnet-install: - The SDK installation doesn&lt;span class="s1"&gt;'t need to persist across multiple CI runs.
dotnet-install: To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.

dotnet-install: Downloading primary link https://dotnetcli.azureedge.net/dotnet/Sdk/5.0.207/dotnet-sdk-5.0.207-linux-x64.tar.gz
dotnet-install: Extracting zip from https://dotnetcli.azureedge.net/dotnet/Sdk/5.0.207/dotnet-sdk-5.0.207-linux-x64.tar.gz
dotnet-install: Adding to current process PATH: `/home/bpdp/software/dotnet-dev-tools/dotnet-all`. Note: This change will be visible only when sourcing script.
dotnet-install: Note that the script does not resolve dependencies during installation.
dotnet-install: To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
dotnet-install: Installation finished successfully.
$
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install versi &lt;em&gt;beta / RC&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Jika ingin melakukan instalasi untuk versi yang belum rilis resmi, gunakan channel sesuai dengan nomor rilis versi &lt;em&gt;beta / RC&lt;/em&gt; tersebut. Sebagai contoh, saat penulisan artikel ini, versi &lt;em&gt;beta / RC&lt;/em&gt; adalah versi &lt;code&gt;6.0.100-rc1&lt;/code&gt;. Berikut ini adalah tampilan saat instalasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet-install.sh &lt;span class="nt"&gt;--install-dir&lt;/span&gt; ~/software/dotnet-dev-tools/dotnet-all &lt;span class="nt"&gt;-c&lt;/span&gt; 6.0
dotnet-install: Note that the intended use of this script is &lt;span class="k"&gt;for &lt;/span&gt;Continuous Integration &lt;span class="o"&gt;(&lt;/span&gt;CI&lt;span class="o"&gt;)&lt;/span&gt; scenarios, where:
dotnet-install: - The SDK needs to be installed without user interaction and without admin rights.
dotnet-install: - The SDK installation doesn&lt;span class="s1"&gt;'t need to persist across multiple CI runs.
dotnet-install: To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.

dotnet-install: Downloading primary link https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.100-rc.1.21458.32/dotnet-sdk-6.0.100-rc.1.21458.32-linux-x64.tar.gz
dotnet-install: Extracting zip from https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.100-rc.1.21458.32/dotnet-sdk-6.0.100-rc.1.21458.32-linux-x64.tar.gz
dotnet-install: Adding to current process PATH: `/home/bpdp/software/dotnet-dev-tools/dotnet-all`. Note: This change will be visible only when sourcing script.
dotnet-install: Note that the script does not resolve dependencies during installation.
dotnet-install: To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
dotnet-install: Installation finished successfully.
$
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Innstallation Check
&lt;/h2&gt;

&lt;p&gt;Now, when we use --info as &lt;code&gt;dotnet&lt;/code&gt; CLI argument, we will have those 2 SDKs and 2 Runtimes already installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet &lt;span class="nt"&gt;--info&lt;/span&gt;
.NET SDK &lt;span class="o"&gt;(&lt;/span&gt;reflecting any global.json&lt;span class="o"&gt;)&lt;/span&gt;:
 Version:   6.0.100-rc.1.21458.32
 Commit:    d7c22323c4

Runtime Environment:
 OS Name:     devuan
 OS Version:  4
 OS Platform: Linux
 RID:         linux-x64
 Base Path:   /home/bpdp/software/dotnet-dev-tools/dotnet-all/sdk/6.0.100-rc.1.21458.32/

Host &lt;span class="o"&gt;(&lt;/span&gt;useful &lt;span class="k"&gt;for &lt;/span&gt;support&lt;span class="o"&gt;)&lt;/span&gt;:
  Version: 6.0.0-rc.1.21451.13
  Commit:  d7619cd4b1

.NET SDKs installed:
  3.1.413 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/sdk]
  5.0.207 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/sdk]
  6.0.100-rc.1.21458.32 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 3.1.19 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/shared/Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.10 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/shared/Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 6.0.0-rc.1.21452.15 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.19 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.10 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.0-rc.1.21451.13 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-dev-tools/dotnet-all/shared/Microsoft.NETCore.App]

To &lt;span class="nb"&gt;install &lt;/span&gt;additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we can use &lt;code&gt;LTS&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt;, and &lt;code&gt;beta / RC&lt;/code&gt; version altogether. Enjoy!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>beginners</category>
      <category>installation</category>
    </item>
    <item>
      <title>Battery Notification in Audio using Fish Shell</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Sat, 21 Aug 2021 08:48:54 +0000</pubDate>
      <link>https://forem.com/zimeracorp/battery-notification-in-audio-using-fish-shell-3lmk</link>
      <guid>https://forem.com/zimeracorp/battery-notification-in-audio-using-fish-shell-3lmk</guid>
      <description>&lt;p&gt;Some desktop environments provide battery notification so that every time battery is low or maybe full, the DE will notify us. The notification usually comes as something like tooltip which may not be handy if we are not in front of our monitor or maybe still concentrate on our tasks. Also, sometimes I want to change my DE or window manager - KDE to GNOME, AwesomeWM to Spectrwm, etc. In this situation I usually stuck. &lt;a href="https://github.com/brndnmtthws/conky"&gt;Conky&lt;/a&gt; can help but changing WM / DE involves struggling with configuration file(s) and/or more software (panel, for example).&lt;/p&gt;

&lt;p&gt;So, that was my problem. I want to have a very simple and can be used to notify my battery status. I decide to use audio to notify myself since it can be used across any DE/WM. All I need to do is just prepare two audio files (you can create that by yourself or download from the Internet) and create this script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/fish&lt;/span&gt;

&lt;span class="nb"&gt;set &lt;/span&gt;bcapacity &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/class/power_supply/BAT0/capacity&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;set &lt;/span&gt;bstatus &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/class/power_supply/BAT0/status&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$bcapacity&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-le&lt;/span&gt; 15 &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$bstatus&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Discharging"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
  /usr/bin/mpg123 /home/bpdp/Musik/battlow.mp3
end

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$bcapacity&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 90 &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$bstatus&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Charging"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
  /usr/bin/mpg123 /home/bpdp/Musik/battfull.mp3
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's say, I put that file in &lt;code&gt;$HOME/bin/batt.sh&lt;/code&gt;. I install &lt;a href="https://www.mpg123.de/"&gt;mpg123&lt;/a&gt; for my player and put those &lt;code&gt;mp3&lt;/code&gt; files at &lt;code&gt;/home/bpdp/Musik/battlow.mp3&lt;/code&gt; for battery low audio and &lt;code&gt;/home/bpdp/Musik/battfull.mp3&lt;/code&gt; for battery full audio.&lt;/p&gt;

&lt;p&gt;Put the script into a crontab by &lt;code&gt;crontab -e&lt;/code&gt; and write then save this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt;/2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /home/bpdp/bin/batt.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so that every 2 minutes,my battery will be checked. Run cron daemon (I use &lt;code&gt;OpenRC&lt;/code&gt;, might be different if you use &lt;code&gt;systemd&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rc-service cron start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all. &lt;/p&gt;

</description>
      <category>fish</category>
      <category>battery</category>
      <category>laptop</category>
      <category>audio</category>
    </item>
    <item>
      <title>Getting Started with F# and VSCode in Linux</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Fri, 13 Aug 2021 15:17:19 +0000</pubDate>
      <link>https://forem.com/zimeracorp/getting-started-with-f-and-vscode-in-linux-5blc</link>
      <guid>https://forem.com/zimeracorp/getting-started-with-f-and-vscode-in-linux-5blc</guid>
      <description>&lt;p&gt;F# has become one of the primary programming language on the .NET environment. F# is developed by a non-profit organization: &lt;a href="https://foundation.fsharp.org/"&gt;The F# Software Foundation&lt;/a&gt;. Don Syme serves as lead designer of F# together with Microsoft Research. Installing .NET SDK means you have F# SDK at your disposal. Here, I will describe how I use Visual Studio Code for F# development. It is intended for beginners who are confused when they first use VSCode with F# (just like me, some time ago).&lt;/p&gt;

&lt;h2&gt;
  
  
  Install .NET SDK
&lt;/h2&gt;

&lt;p&gt;To install .NET SDK, download the SDK from &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;.NET SDK Download&lt;/a&gt;. Download current release and extract them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/sofware/dotnet-5
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/software/dotnet-5
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; ~/Downloads/dotnet-sdk-5.0.400-linux-x64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 224
drwxr-xr-x 7 bpdp bpdp   4096 Jul 27 01:49 ./
drwxr-xr-x 6 bpdp bpdp   4096 Agu 13 11:27 ../
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 bpdp bpdp 133632 Jul 10 01:26 dotnet&lt;span class="k"&gt;*&lt;/span&gt;
drwxr-xr-x 3 bpdp bpdp   4096 Jul 10 01:28 host/
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp   1116 Jul 10 01:22 LICENSE.txt
drwxr-xr-x 6 bpdp bpdp   4096 Jul 27 01:49 packs/
drwxr-xr-x 3 bpdp bpdp   4096 Jul 27 01:49 sdk/
drwxr-xr-x 4 bpdp bpdp   4096 Jul 16 00:50 shared/
drwxr-xr-x 3 bpdp bpdp   4096 Jul 27 01:49 templates/
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  60108 Jul 10 01:22 ThirdPartyNotices.txt
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, .NET SDK is installed at &lt;code&gt;~/software/dotnet-5&lt;/code&gt; directory. We need to tell shell that the new PATH to include the directory location of .NET SDK. I usually put this command inside a file (whatever filename and location, up to you - example here: &lt;code&gt;$HOME/env/dotnet.sh&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH=$HOME/software/dotnet-5:$PATH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fish&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; DOTNET_ROOT &lt;span class="nv"&gt;$HOME&lt;/span&gt;/software/dotnet-5
&lt;span class="nb"&gt;set &lt;/span&gt;PATH &lt;span class="nv"&gt;$DOTNET_ROOT&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever needed, we can &lt;code&gt;source&lt;/code&gt; the file (just once in every shell/terminal):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/env/dotnet.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test that .NET SDK has been installed successfully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet &lt;span class="nt"&gt;--info&lt;/span&gt;
.NET SDK &lt;span class="o"&gt;(&lt;/span&gt;reflecting any global.json&lt;span class="o"&gt;)&lt;/span&gt;:
 Version:   5.0.400
 Commit:    d61950f9bf

Runtime Environment:
 OS Name:     devuan
 OS Version:  4
 OS Platform: Linux
 RID:         linux-x64
 Base Path:   /home/bpdp/software/dotnet-5/sdk/5.0.400/

Host &lt;span class="o"&gt;(&lt;/span&gt;useful &lt;span class="k"&gt;for &lt;/span&gt;support&lt;span class="o"&gt;)&lt;/span&gt;:
  Version: 5.0.9
  Commit:  208e377a53

.NET SDKs installed:
  5.0.400 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-5/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.9 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-5/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.9 &lt;span class="o"&gt;[&lt;/span&gt;/home/bpdp/software/dotnet-5/shared/Microsoft.NETCore.App]

To &lt;span class="nb"&gt;install &lt;/span&gt;additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can check wheter we can use F# or not by executing REPL for F# (&lt;code&gt;fsi&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet fsi

Microsoft &lt;span class="o"&gt;(&lt;/span&gt;R&lt;span class="o"&gt;)&lt;/span&gt; F# Interactive version 11.4.2.0 &lt;span class="k"&gt;for &lt;/span&gt;F# 5.0
Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; Microsoft Corporation. All Rights Reserved.

For &lt;span class="nb"&gt;help type&lt;/span&gt; &lt;span class="c"&gt;#help;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It all things work, congratulation, you have .NET SDK and F# on your Linux machine. Next, we use VSCode and Ionide for our F# development.&lt;/p&gt;

&lt;h2&gt;
  
  
  VSCode and Ionide
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code - VSCode&lt;/a&gt; is a code editing tools. It provides text editor capabilities and extensible. Many vendor and communities provide extensions for many programming languages. They are all exist at &lt;a href="https://marketplace.visualstudio.com/vscode"&gt;VSCode Marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/Download"&gt;Download VSCode&lt;/a&gt; and then extract the tarball to a directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvf&lt;/span&gt; ~/Downloads/code-stable-x64-1628120346.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; ~/VSCode-linux-x64 ~/software/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit $HOME/env/dotnet.sh which we've already created before (see above). Add this line:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/software/VSCode-linux-x64/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fish&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; PATH &lt;span class="nv"&gt;$HOME&lt;/span&gt;/software/VSCode-linux-x64/bin &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Close the terminal / shell so that you can source the file later.&lt;/p&gt;

&lt;p&gt;Now, install [Ionide] extension for VSCode which will turn VSCode into a fullblown F# IDE. Source the file (open new shell / terminal first):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/env/dotnet.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run VScode from shell/terminal using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow installation instructions at &lt;a href="https://marketplace.visualstudio.com/items?itemName=Ionide.Ionide-fsharp"&gt;Ionide-fsharp extension&lt;/a&gt;. This will also install C# extension since C# extension is Ionide's pre-requisites.&lt;/p&gt;

&lt;p&gt;Close VSCode for now. &lt;/p&gt;

&lt;h2&gt;
  
  
  F# Project at VSCode - Ionide
&lt;/h2&gt;

&lt;p&gt;We can use &lt;code&gt;dotnet&lt;/code&gt; command to create a project skeleton, based on a template. Here's some templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new &lt;span class="nt"&gt;--list&lt;/span&gt;
Template Name                                 Short Name      Language    Tags                  
&lt;span class="nt"&gt;--------------------------------------------&lt;/span&gt;  &lt;span class="nt"&gt;--------------&lt;/span&gt;  &lt;span class="nt"&gt;----------&lt;/span&gt;  &lt;span class="nt"&gt;----------------------&lt;/span&gt;
Console Application                           console         &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Common/Console        
Class library                                 classlib        &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Common/Library        
Worker Service                                worker          &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Common/Worker/Web     
MSTest Test Project                           mstest          &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/MSTest           
NUnit 3 Test Item                             nunit-test      &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/NUnit            
NUnit 3 Test Project                          nunit           &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/NUnit            
xUnit Test Project                            xunit           &lt;span class="o"&gt;[&lt;/span&gt;C#],F#,VB  Test/xUnit            
Razor Component                               razorcomponent  &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
Razor Page                                    page            &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
MVC ViewImports                               viewimports     &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
MVC ViewStart                                 viewstart       &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/ASP.NET           
Blazor Server App                             blazorserver    &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/Blazor            
Blazor WebAssembly App                        blazorwasm      &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/Blazor/WebAssembly
ASP.NET Core Empty                            web             &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Web/Empty             
ASP.NET Core Web App &lt;span class="o"&gt;(&lt;/span&gt;Model-View-Controller&lt;span class="o"&gt;)&lt;/span&gt;  mvc             &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Web/MVC               
ASP.NET Core Web App                          webapp          &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/Razor Pages   
ASP.NET Core with Angular                     angular         &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/SPA           
ASP.NET Core with React.js                    react           &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/SPA           
ASP.NET Core with React.js and Redux          reactredux      &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/MVC/SPA           
Razor Class Library                           razorclasslib   &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/Razor/Library     
ASP.NET Core Web API                          webapi          &lt;span class="o"&gt;[&lt;/span&gt;C#],F#     Web/WebAPI            
ASP.NET Core gRPC Service                     grpc            &lt;span class="o"&gt;[&lt;/span&gt;C#]        Web/gRPC              
dotnet gitignore file                         gitignore                   Config                
global.json file                              globaljson                  Config                
NuGet Config                                  nugetconfig                 Config                
Dotnet &lt;span class="nb"&gt;local &lt;/span&gt;tool manifest file               tool-manifest               Config                
Web Config                                    webconfig                   Config                
Solution File                                 sln                         Solution              
Protocol Buffer File                          proto                       Web/gRPC              
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create a project using a template inside an empty directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new console &lt;span class="nt"&gt;-lang&lt;/span&gt; f#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the screendump:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;helloFSharp
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;helloFSharp/
&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new console &lt;span class="nt"&gt;-lang&lt;/span&gt; f#
The template &lt;span class="s2"&gt;"Console Application"&lt;/span&gt; was created successfully.

Processing post-creation actions...
Running &lt;span class="s1"&gt;'dotnet restore'&lt;/span&gt; on /home/bpdp/kerjaan/src/fsharp/helloFSharp/helloFSharp.fsproj...
  Determining projects to restore...
  Restored /home/bpdp/kerjaan/src/fsharp/helloFSharp/helloFSharp.fsproj &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;440 ms&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Restore succeeded.

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; 
total 20
drwxr-xr-x  3 bpdp bpdp 4096 Agu 13 21:07 ./
drwxr-xr-x 17 bpdp bpdp 4096 Agu 13 21:07 ../
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 bpdp bpdp  282 Agu 13 21:07 helloFSharp.fsproj
drwxr-xr-x  2 bpdp bpdp 4096 Agu 13 21:07 obj/
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 bpdp bpdp  342 Agu 13 21:07 Program.fs
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From this point, we can run our project using &lt;code&gt;dotnet run&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet run
Hello world from F#
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Are we finish? yes, if we do not use VSCode. Since we will use VSCode for out FSharp IDE, from that directory, do this (of course we have &lt;code&gt;source ~/env/dotnet.sh&lt;/code&gt; in this shell / terminal before):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;code &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;: there is dot after &lt;code&gt;code&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inside VSCode, click on &lt;code&gt;Program.fs&lt;/code&gt; so that this file is opened. Run program using &lt;code&gt;F5&lt;/code&gt; key. VSCode will ask for &lt;em&gt;environment&lt;/em&gt;. Choose &lt;code&gt;.NET Core&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nzxsIsVR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0jrsoqoa033vpp2de6ck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nzxsIsVR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0jrsoqoa033vpp2de6ck.png" alt="Select environment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VSCode will ask some options to launch the compilation process and run the result. &lt;code&gt;launch.json&lt;/code&gt; is opened since we do not have that file. The bottom-right of VSCode shows &lt;code&gt;Add Configuration&lt;/code&gt; button. Click on that button and choose this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aSZforNT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1i1fb9rmpdbsohltvaal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aSZforNT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1i1fb9rmpdbsohltvaal.png" alt="Configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change the &lt;code&gt;program&lt;/code&gt; from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;"program"&lt;/span&gt;: &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;workspaceFolder&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/bin/Debug/&amp;lt;target-framework&amp;gt;/&amp;lt;project-name.dll&amp;gt;"&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;"program"&lt;/span&gt;: &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;workspaceFolder&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/bin/Debug/dotnet-5/helloFSharp.dll"&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: see &lt;code&gt;helloFSharp.fsproj&lt;/code&gt; file to fill &lt;code&gt;target-framework&lt;/code&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the file, and then hit &lt;code&gt;F5&lt;/code&gt; key again. VSCode will display a dialog, shows that we haven't define &lt;em&gt;buld&lt;/em&gt; task since we don't have &lt;code&gt;tasks.json&lt;/code&gt; file. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vcQMHwQe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeq88kqathjmjxxdrz26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vcQMHwQe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeq88kqathjmjxxdrz26.png" alt="Configure task"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose &lt;code&gt;Configure task&lt;/code&gt; then &lt;code&gt;Create tasks.json file from template&lt;/code&gt;, choose &lt;code&gt;.NET Core&lt;/code&gt;. VSCode will open &lt;code&gt;tasks.json&lt;/code&gt; file. Save file then hit &lt;code&gt;F5&lt;/code&gt;. The result can be seen in &lt;code&gt;DEBUG CONSOLE&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dSoPvfl_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ezz2emah5ot2j5di6gpl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dSoPvfl_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ezz2emah5ot2j5di6gpl.png" alt="Results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we can start our development process. Any new project should have &lt;code&gt;launch.json&lt;/code&gt; and &lt;code&gt;tasks.json&lt;/code&gt;. They are all saved inside &lt;code&gt;.vscode/&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; .vscode/
total 16
drwxr-xr-x 2 bpdp bpdp 4096 Agu 13 21:56 ./
drwxr-xr-x 5 bpdp bpdp 4096 Agu 13 21:30 ../
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  649 Agu 13 21:51 launch.json
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 bpdp bpdp  770 Agu 13 21:56 tasks.json
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are many possibilities but the most important thing is now we know at least 2 json files and how to create them. Later on, we will modify them, depend on our project requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  F# REPL
&lt;/h2&gt;

&lt;p&gt;Ionide also provides &lt;code&gt;FSI:Start&lt;/code&gt; from &lt;em&gt;Command pallette&lt;/em&gt; (&lt;code&gt;Ctrl-Shift-P&lt;/code&gt;) to execute REPL (&lt;em&gt;Read-Eval-Print-Loop&lt;/em&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3nGMa8IH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rjv5r35v5ndhye0dxs1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3nGMa8IH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rjv5r35v5ndhye0dxs1.png" alt="REPL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all. Now you may start your F# development, using whatever templates you like and then change &lt;code&gt;launch.json&lt;/code&gt; and &lt;code&gt;tasks.json&lt;/code&gt; properly.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>fsharp</category>
      <category>ionide</category>
    </item>
    <item>
      <title>ERPNext Installation Details</title>
      <dc:creator>Bambang Purnomosidi D. P.</dc:creator>
      <pubDate>Wed, 11 Aug 2021 10:28:25 +0000</pubDate>
      <link>https://forem.com/zimeracorp/erpnext-installation-details-1ii1</link>
      <guid>https://forem.com/zimeracorp/erpnext-installation-details-1ii1</guid>
      <description>&lt;p&gt;&lt;a href="https://erpnext.com" rel="noopener noreferrer"&gt;ERPNext&lt;/a&gt; is one of free / open source ERP software available in today's market. Beside their cloud offering, there is a possibility to use ERPNext on-premise. However, installation instructions are not quite clear. I personally have to experiment with installation many times before I got ... "oh this is how things work". I hope, this is not because I am too slow. LOL. So here is my details instruction on how to make ERPNext installed properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;p&gt;ERPNext is developed in Python using Frappe Framework (will use &lt;code&gt;Frappe&lt;/code&gt; term in this article). Both ERPNext and Frappe come from the same company with many community supporters. MariaDB is used for the DBMS, so, before going into details, here is our list of software which I prepare before ERPNext installation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.python.org" rel="noopener noreferrer"&gt;Python&lt;/a&gt;: the programming language to implement Frappe and ERPNext on top of Frappe.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mariadb.org" rel="noopener noreferrer"&gt;MariaDB&lt;/a&gt;: the DBMS, used to store and manage data. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://frappe.io/" rel="noopener noreferrer"&gt;Frappe&lt;/a&gt;: software framework, based on Python, used to build ERPNext. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/frappe/bench" rel="noopener noreferrer"&gt;Bench&lt;/a&gt;: a CLI program to manage multi-tenant deployments for Frappe apps. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;: JavaScript engine, used by Frappe for frontend purposes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://yarnpkg.com/" rel="noopener noreferrer"&gt;yarn&lt;/a&gt;: package manager for Node.js. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com" rel="noopener noreferrer"&gt;Git&lt;/a&gt;: version control system, used by &lt;strong&gt;bench CLI&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.io/download/" rel="noopener noreferrer"&gt;Redis&lt;/a&gt;: personally, I prefer redis-stack, in this article I will use redis-stack 6.2.4.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installation and Configuration for Infrastructure Software
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;p&gt;I use &lt;a href="https://docs.conda.io/en/latest/miniconda.html" rel="noopener noreferrer"&gt;Miniconda&lt;/a&gt; distribution. See this &lt;a href="https://conda.io/projects/conda/en/latest/user-guide/install/index.html" rel="noopener noreferrer"&gt;installation instructions&lt;/a&gt; for information on how to install Miniconda. After installation, create environment - special for this ERPNext installation:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ conda create -n py310-erpnext python=3.10
$ conda activate py310-erpnext
$ python
Python 3.10.8 (main, Nov  4 2022, 13:48:29) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
&amp;gt;&amp;gt;&amp;gt;
$


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;All of our steps to install ERPNext will be done in this shell. If you want to open another shell, activate conda environment &lt;strong&gt;py311-erpnext&lt;/strong&gt;, just like the command above.&lt;/p&gt;

&lt;h3&gt;
  
  
  MariaDB
&lt;/h3&gt;

&lt;p&gt;Get MariaDB at &lt;a href="https://mariadb.org/download/" rel="noopener noreferrer"&gt;https://mariadb.org/download/&lt;/a&gt;, install using installation instructions at &lt;a href="https://mariadb.com/kb/en/binary-packages/" rel="noopener noreferrer"&gt;https://mariadb.com/kb/en/binary-packages/&lt;/a&gt; and then change its configuration (usually you have to edit &lt;strong&gt;my.cnf&lt;/strong&gt;, in most Linux distribution you can find this file in &lt;code&gt;/etc/mysql/my.cnf&lt;/code&gt;):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

...
&lt;span class="o"&gt;[&lt;/span&gt;mysqld]
datadir                 &lt;span class="o"&gt;=&lt;/span&gt; /home/bpdp/mariadbdata
default-storage-engine  &lt;span class="o"&gt;=&lt;/span&gt; InnoDB
collation-server        &lt;span class="o"&gt;=&lt;/span&gt; utf8mb4_unicode_ci
character_set_server    &lt;span class="o"&gt;=&lt;/span&gt; utf8mb4
...


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Run MariaDB server process using the instructions at &lt;a href="https://mariadb.com/kb/en/starting-and-stopping-mariadb-automatically/" rel="noopener noreferrer"&gt;https://mariadb.com/kb/en/starting-and-stopping-mariadb-automatically/&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;User &lt;em&gt;root&lt;/em&gt; comes with no password, so, I choose to set root password:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

mysqladmin &lt;span class="nt"&gt;-u&lt;/span&gt; root password &lt;span class="s1"&gt;'root'&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;: I use &lt;em&gt;root&lt;/em&gt; as password for root just for simplicity.&lt;/p&gt;

&lt;p&gt;Test your MariaDB installation:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; 
Enter password: 
Welcome to the MariaDB monitor.  Commands end with &lt;span class="p"&gt;;&lt;/span&gt; or &lt;span class="se"&gt;\g&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Your MariaDB connection &lt;span class="nb"&gt;id &lt;/span&gt;is 5
Server version: 10.10.2-MariaDB MariaDB Server

Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type &lt;span class="s1"&gt;'help;'&lt;/span&gt; or &lt;span class="s1"&gt;'\h'&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;help. Type &lt;span class="s1"&gt;'\c'&lt;/span&gt; to clear the current input statement.

MariaDB &lt;span class="o"&gt;[(&lt;/span&gt;none&lt;span class="o"&gt;)]&amp;gt;&lt;/span&gt; 
&lt;span class="err"&gt;$&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Frappe
&lt;/h3&gt;

&lt;p&gt;You may read about Frappe at &lt;a href="https://github.com/frappe/frappe" rel="noopener noreferrer"&gt;https://github.com/frappe/frappe&lt;/a&gt;. In the meantime, this will be installed, together with ERPNext later using &lt;code&gt;bench&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bench
&lt;/h3&gt;

&lt;p&gt;If you want more information, you can always have a look at its source code here: &lt;a href="https://github.com/frappe/bench" rel="noopener noreferrer"&gt;https://github.com/frappe/bench&lt;/a&gt;. Although there are many instructions to install &lt;strong&gt;bench&lt;/strong&gt;, the easiest is just:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;frappe-bench
Collecting frappe-bench
  Using cached frappe_bench-5.14.4-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;145 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting click&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;7.0
  Using cached click-8.1.3-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;96 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting gitpython~&lt;span class="o"&gt;=&lt;/span&gt;2.1.15
  Using cached GitPython-2.1.15-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;452 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting honcho
  Using cached honcho-1.1.0-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;21 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting jinja2~&lt;span class="o"&gt;=&lt;/span&gt;3.0.3
  Using cached Jinja2-3.0.3-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;133 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting python-crontab~&lt;span class="o"&gt;=&lt;/span&gt;2.6.0
  Using cached python_crontab-2.6.0-py3-none-any.whl
Collecting requests
  Using cached requests-2.28.1-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;62 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting semantic-version~&lt;span class="o"&gt;=&lt;/span&gt;2.8.2
  Using cached semantic_version-2.8.5-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;15 kB&lt;span class="o"&gt;)&lt;/span&gt;
Requirement already satisfied: setuptools&amp;gt;40.9.0 &lt;span class="k"&gt;in&lt;/span&gt; /home/bpdp/software/python-dev-tools/miniconda39/envs/py311-erpnext/lib/python3.11/site-packages &lt;span class="o"&gt;(&lt;/span&gt;from frappe-bench&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;65.5.1&lt;span class="o"&gt;)&lt;/span&gt;
Collecting gitdb2&amp;lt;3,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;2
  Using cached gitdb2-2.0.6-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;63 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting MarkupSafe&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;2.0
  Using cached MarkupSafe-2.1.1-cp311-cp311-linux_x86_64.whl
Collecting python-dateutil
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;247 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting charset-normalizer&amp;lt;3,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;2
  Using cached charset_normalizer-2.1.1-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;39 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting idna&amp;lt;4,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;2.5
  Using cached idna-3.4-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;61 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting urllib3&amp;lt;1.27,&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;1.21.1
  Using cached urllib3-1.26.12-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;140 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting certifi&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;2017.4.17
  Using cached certifi-2022.9.24-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;161 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting smmap2&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;2.0.0
  Using cached smmap2-3.0.1-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;1.1 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting six&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;1.5
  Using cached six-1.16.0-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;11 kB&lt;span class="o"&gt;)&lt;/span&gt;
Collecting smmap&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;3.0.1
  Using cached smmap-5.0.0-py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;24 kB&lt;span class="o"&gt;)&lt;/span&gt;
Installing collected packages: honcho, urllib3, smmap, six, semantic-version, MarkupSafe, idna, click, charset-normalizer, certifi, smmap2, requests, python-dateutil, jinja2, python-crontab, gitdb2, gitpython, frappe-bench
Successfully installed MarkupSafe-2.1.1 certifi-2022.9.24 charset-normalizer-2.1.1 click-8.1.3 frappe-bench-5.14.4 gitdb2-2.0.6 gitpython-2.1.15 honcho-1.1.0 idna-3.4 jinja2-3.0.3 python-crontab-2.6.0 python-dateutil-2.8.2 requests-2.28.1 semantic-version-2.8.5 six-1.16.0 smmap-5.0.0 smmap2-3.0.1 urllib3-1.26.12
&lt;span class="nv"&gt;$ &lt;/span&gt;pip list | &lt;span class="nb"&gt;grep &lt;/span&gt;bench                                                                   
frappe-bench       5.14.4
&lt;span class="nv"&gt;$ &lt;/span&gt;bench &lt;span class="nt"&gt;--help&lt;/span&gt; 
WARN: Command not being executed &lt;span class="k"&gt;in &lt;/span&gt;bench directory
Usage:  &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] COMMAND &lt;span class="o"&gt;[&lt;/span&gt;ARGS]...

Options:
  &lt;span class="nt"&gt;--version&lt;/span&gt;
  &lt;span class="nt"&gt;--use-feature&lt;/span&gt; TEXT
  &lt;span class="nt"&gt;-v&lt;/span&gt;, &lt;span class="nt"&gt;--verbose&lt;/span&gt;
  &lt;span class="nt"&gt;--help&lt;/span&gt;              Show this message and exit.

Commands:
  backup-all-sites         Backup all sites &lt;span class="k"&gt;in &lt;/span&gt;current bench
  config                   Change bench configuration
  disable-production       Disables production environment &lt;span class="k"&gt;for &lt;/span&gt;the bench.
  download-translations    Download latest translations
  drop
  exclude-app              Exclude app from updating
  find                     Finds benches recursively from location
  get                      Clone an app from the internet or filesystem...
  get-app                  Clone an app from the internet or filesystem...
  include-app              Include app &lt;span class="k"&gt;for &lt;/span&gt;updating
  init                     Initialize a new bench instance &lt;span class="k"&gt;in &lt;/span&gt;the...
  &lt;span class="nb"&gt;install                  &lt;/span&gt;Install system dependencies &lt;span class="k"&gt;for &lt;/span&gt;setting up...
  migrate-env              Migrate Virtual Environment to desired Python...
  new-app                  Create a new Frappe application under apps folder
  pip                      For pip &lt;span class="nb"&gt;help &lt;/span&gt;use &lt;span class="sb"&gt;`&lt;/span&gt;bench pip &lt;span class="nb"&gt;help&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;COMMAND]&lt;span class="sb"&gt;`&lt;/span&gt; or...
  remote-reset-url         Reset app remote url to frappe official
  remote-set-url           Set app remote url
  remote-urls              Show apps remote url
  remove                   Completely remove app from bench and re-build...
  remove-app               Completely remove app from bench and re-build...
  renew-lets-encrypt       Sets Up latest cron and Renew Let&lt;span class="s1"&gt;'s Encrypt...
  restart                  Restart supervisor processes or systemd units
  retry-upgrade            Retry a failed upgrade
  rm                       Completely remove app from bench and re-build...
  set-mariadb-host         Set MariaDB host for bench
  set-nginx-port           Set NGINX port for site
  set-redis-cache-host     Set Redis cache host for bench
  set-redis-queue-host     Set Redis queue host for bench
  set-redis-socketio-host  Set Redis socketio host for bench
  set-ssl-certificate      Set SSL certificate path for site
  set-ssl-key              Set SSL certificate private key path for site
  set-url-root             Set URL root for site
  setup                    Setup command group for enabling setting up a...
  src                      Prints bench source folder path, which can be...
  start                    Start Frappe development processes
  switch-to-branch         Switch all apps to specified branch, or...
  switch-to-develop        Switch frappe and erpnext to develop branch
  update                   Performs an update operation on current bench.
$


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Node.js
&lt;/h3&gt;

&lt;p&gt;See this &lt;a href="https://nodejs.org/en/download/package-manager/" rel="noopener noreferrer"&gt;installation instructions&lt;/a&gt;. I use version 16.x.x (LTS version).&lt;/p&gt;
&lt;h3&gt;
  
  
  Yarn
&lt;/h3&gt;

&lt;p&gt;After Node.js installation, you should have &lt;code&gt;node&lt;/code&gt; and &lt;code&gt;npm&lt;/code&gt;. Install Yarn using this command:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ npm install -g yarn


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Git
&lt;/h3&gt;

&lt;p&gt;Usually all Linux distro has Git installed by default. Just in case your Linux box does not have Git or maybe you use MacOS or Windows, see &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" rel="noopener noreferrer"&gt;installation instructions for Git&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Redis
&lt;/h3&gt;

&lt;p&gt;Redis will be needed in &lt;code&gt;bench&lt;/code&gt; directory initialization. Make sure that you have redis (or redis-stack) and &lt;code&gt;redis --version&lt;/code&gt; has an output - for example:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ redis-server --version
Redis server v=6.2.7 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=adcdff4a0d295794
$


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Initialize &lt;code&gt;bench&lt;/code&gt; Directory
&lt;/h2&gt;

&lt;p&gt;Our applications will reside in one &lt;strong&gt;bench directory&lt;/strong&gt;, therefore we need to initialize it first:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench init &lt;span class="nt"&gt;--frappe-branch&lt;/span&gt; version-14 myERPNext14


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here's the screen dump:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench init &lt;span class="nt"&gt;--frappe-branch&lt;/span&gt; version-14 myERPNext14 Setting Up Environment
&lt;span class="nv"&gt;$ &lt;/span&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv &lt;span class="nb"&gt;env&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;/home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/env/bin/python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
Getting frappe
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/frappe/frappe.git &lt;span class="nt"&gt;--branch&lt;/span&gt; version-14 &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 &lt;span class="nt"&gt;--origin&lt;/span&gt; upstream
Cloning into &lt;span class="s1"&gt;'frappe'&lt;/span&gt;...
remote: Enumerating objects: 3162, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;3162/3162&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;2836/2836&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Total 3162 &lt;span class="o"&gt;(&lt;/span&gt;delta 424&lt;span class="o"&gt;)&lt;/span&gt;, reused 1254 &lt;span class="o"&gt;(&lt;/span&gt;delta 227&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 0
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;3162/3162&lt;span class="o"&gt;)&lt;/span&gt;, 15.99 MiB | 1.76 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;424/424&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Installing frappe
&lt;span class="nv"&gt;$ &lt;/span&gt;/home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/env/bin/python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; /home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/apps/frappe 
  DEPRECATION: zxcvbn-python is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: PyQRCode is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: docopt is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: traceback-with-variables is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: maxminddb is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: hiredis is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: maxminddb-geolite2 is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: rauth is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: premailer is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: googlemaps is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: cairocffi is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn &lt;span class="nb"&gt;install
&lt;/span&gt;yarn &lt;span class="nb"&gt;install &lt;/span&gt;v1.22.19
warning ../../../../../../package.json: No license field
&lt;span class="o"&gt;[&lt;/span&gt;1/5] Validating package.json...
&lt;span class="o"&gt;[&lt;/span&gt;2/5] Resolving packages...
&lt;span class="o"&gt;[&lt;/span&gt;3/5] Fetching packages...
&lt;span class="o"&gt;[&lt;/span&gt;4/5] Linking dependencies...
warning &lt;span class="s2"&gt;" &amp;gt; @frappe/esbuild-plugin-postcss2@0.1.3"&lt;/span&gt; has unmet peer dependency &lt;span class="s2"&gt;"less@^4.x"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
warning &lt;span class="s2"&gt;" &amp;gt; @frappe/esbuild-plugin-postcss2@0.1.3"&lt;/span&gt; has unmet peer dependency &lt;span class="s2"&gt;"stylus@^0.x"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
warning Workspaces can only be enabled &lt;span class="k"&gt;in &lt;/span&gt;private projects.
&lt;span class="o"&gt;[&lt;/span&gt;5/5] Building fresh packages...
Done &lt;span class="k"&gt;in &lt;/span&gt;237.62s.
Found existing apps updating states...
&lt;span class="nv"&gt;$ &lt;/span&gt;bench build
Assets &lt;span class="k"&gt;for &lt;/span&gt;Release v14.16.0 don&lt;span class="s1"&gt;'t exist
✔ Application Assets Linked                                                                                                                          


yarn run v1.22.19
warning ../../../../../../package.json: No license field
$ node esbuild --production --run-build-command
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
Browserslist: caniuse-lite is outdated. Please run:
  npx browserslist@latest --update-db
  Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating
File                                                        Size

frappe/dist/js/
├─ bootstrap-4-web.bundle.22U72DEL.js                       1.73 Kb
├─ controls.bundle.XMXXTEDE.js                              1226.29 Kb
├─ data_import_tools.bundle.ZHGGYJ52.js                     106.10 Kb
├─ desk.bundle.MLU24LZA.js                                  1315.72 Kb
├─ dialog.bundle.IBOC573P.js                                52.67 Kb
├─ form.bundle.DM6ACTZY.js                                  153.74 Kb
├─ frappe-web.bundle.UEU5WTAG.js                            823.04 Kb
├─ libs.bundle.YZMCKPNH.js                                  574.13 Kb
├─ list.bundle.TT33PVXT.js                                  185.23 Kb
├─ logtypes.bundle.7STJ7YLS.js                              0.73 Kb
├─ recorder.bundle.5AOEUOFD.js                              179.54 Kb
├─ report.bundle.GFUQKB7W.js                                170.93 Kb
├─ user_profile_controller.bundle.YR6XHZRM.js               11.35 Kb
├─ video_player.bundle.UO3KNN5D.js                          120.59 Kb
├─ web_form.bundle.KZ3DGEKH.js                              1560.14 Kb
├─ print_format_builder.bundle.KP4FAW42.js                  170.39 Kb
├─ build_events.bundle.L2HAVD4K.js                          11.62 Kb
└─ kanban_board.bundle.VCVKXCPT.js                          27.42 Kb

frappe/dist/css/
├─ desk.bundle.ZJ65KRGK.css                                 542.84 Kb
├─ email.bundle.2SCQFONP.css                                4.02 Kb
├─ login.bundle.YF3JSIEM.css                                23.56 Kb
├─ print.bundle.4DZBYDHD.css                                194.76 Kb
├─ print_format.bundle.P4TGM3H5.css                         177.61 Kb
├─ report.bundle.INQWGNNN.css                               5.36 Kb
├─ web_form.bundle.ICCT62YT.css                             14.73 Kb
└─ website.bundle.DQ2V2XQ5.css                              420.08 Kb

frappe/dist/css-rtl/
├─ desk.bundle.2VE3L2MS.css                                 543.10 Kb
├─ email.bundle.5KSKAB3K.css                                4.02 Kb
├─ login.bundle.BI7G5G42.css                                23.56 Kb
├─ print.bundle.3YGOKYDF.css                                194.91 Kb
├─ print_format.bundle.N76YW3PD.css                         177.72 Kb
├─ report.bundle.S5GOBZKX.css                               5.35 Kb
├─ web_form.bundle.KPBAPSVI.css                             14.72 Kb
└─ website.bundle.MQZU7APE.css                              420.24 Kb

 DONE  Total Build Time: 12.268s

 WARN  Cannot connect to redis_cache to update assets_json
 WARN  Cannot connect to redis_cache to update assets_json
 WARN  Cannot connect to redis_cache to update assets_json
Done in 15.86s.
SUCCESS: Bench myERPNext14 initialized
$


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;At this point, we already have one bench directory, named myERPNext14.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: The term &lt;strong&gt;bench/Bench&lt;/strong&gt; usually denotes two things: &lt;strong&gt;directory&lt;/strong&gt; and &lt;strong&gt;CLI&lt;/strong&gt;. Starting now, we will call &lt;strong&gt;bench/Bench directory&lt;/strong&gt; as &lt;strong&gt;bench/Bench&lt;/strong&gt; and &lt;strong&gt;bench/Bench CLI&lt;/strong&gt; as &lt;strong&gt;bench/Bench CLI&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this bench, we will create our site and then get the app (ERPNext) and install our ERPNext app into our site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create New Site
&lt;/h2&gt;

&lt;p&gt;Set the host first:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hosts
127.0.0.1   localhost
127.0.1.1   dellvuan    dellvuan
127.0.1.1   myerpnext   myerpnext

&lt;span class="c"&gt;# The following lines are desirable for IPv6 capable hosts&lt;/span&gt;
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
&lt;span class="nv"&gt;$ &lt;/span&gt;ping myerpnext
PING myerpnext &lt;span class="o"&gt;(&lt;/span&gt;127.0.1.1&lt;span class="o"&gt;)&lt;/span&gt; 56&lt;span class="o"&gt;(&lt;/span&gt;84&lt;span class="o"&gt;)&lt;/span&gt; bytes of data.
64 bytes from dellvuan &lt;span class="o"&gt;(&lt;/span&gt;127.0.1.1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;icmp_seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;64 &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.052 ms
64 bytes from dellvuan &lt;span class="o"&gt;(&lt;/span&gt;127.0.1.1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;icmp_seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;64 &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.031 ms
^C
&lt;span class="nt"&gt;---&lt;/span&gt; myerpnext ping statistics &lt;span class="nt"&gt;---&lt;/span&gt;
2 packets transmitted, 2 received, 0% packet loss, &lt;span class="nb"&gt;time &lt;/span&gt;1021ms
rtt min/avg/max/mdev &lt;span class="o"&gt;=&lt;/span&gt; 0.031/0.041/0.052/0.010 ms
&lt;span class="err"&gt;$&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Enter the directory which we have created before using &lt;code&gt;bench init&lt;/code&gt; (&lt;em&gt;myERPNext14&lt;/em&gt;) and then use this command to create a new site (&lt;strong&gt;myerpnext01&lt;/strong&gt;):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench new-site &lt;span class="nt"&gt;--db-name&lt;/span&gt; myerpnextdb01 myerpnext01 
MySQL root password: 

Installing frappe...
Updating DocTypes &lt;span class="k"&gt;for &lt;/span&gt;frappe        : &lt;span class="o"&gt;[========================================]&lt;/span&gt; 100%
Updating country info               : &lt;span class="o"&gt;[========================================]&lt;/span&gt; 100%
Set Administrator password: 
Re-enter Administrator password: 
Updating Dashboard &lt;span class="k"&gt;for &lt;/span&gt;frappe
myerpnext01: SystemSettings.enable_scheduler is UNSET
&lt;span class="k"&gt;***&lt;/span&gt; Scheduler is disabled &lt;span class="k"&gt;***&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If we do not use &lt;code&gt;--db-name&lt;/code&gt; then &lt;strong&gt;bench CLI&lt;/strong&gt; will use randomly generated name. We need to answer Administrator password. Take note of the password, we're gonna need this later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get ERPNext Application
&lt;/h2&gt;

&lt;p&gt;Use this command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench get-app &lt;span class="nt"&gt;--branch&lt;/span&gt; version-14 erpnext


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here's the screendump:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench get-app &lt;span class="nt"&gt;--branch&lt;/span&gt; version-14 erpnext
Getting erpnext
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/frappe/erpnext.git &lt;span class="nt"&gt;--branch&lt;/span&gt; version-14 &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 &lt;span class="nt"&gt;--origin&lt;/span&gt; upstream
Cloning into &lt;span class="s1"&gt;'erpnext'&lt;/span&gt;...
remote: Enumerating objects: 4909, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;4909/4909&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;4172/4172&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
remote: Total 4909 &lt;span class="o"&gt;(&lt;/span&gt;delta 971&lt;span class="o"&gt;)&lt;/span&gt;, reused 2275 &lt;span class="o"&gt;(&lt;/span&gt;delta 506&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 0
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;4909/4909&lt;span class="o"&gt;)&lt;/span&gt;, 17.18 MiB | 1.72 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;971/971&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Ignoring dependencies of erpnext. To &lt;span class="nb"&gt;install &lt;/span&gt;dependencies use &lt;span class="nt"&gt;--resolve-deps&lt;/span&gt;
Installing erpnext
&lt;span class="nv"&gt;$ &lt;/span&gt;/home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/env/bin/python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; /home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/apps/erpnext 
  DEPRECATION: pycountry is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: jsonobject is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: taxjar is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: plaid-python is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
  DEPRECATION: gocardless-pro is being installed using the legacy &lt;span class="s1"&gt;'setup.py install'&lt;/span&gt; method, because it does not have a &lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; and the &lt;span class="s1"&gt;'wheel'&lt;/span&gt; package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to &lt;span class="nb"&gt;enable &lt;/span&gt;the &lt;span class="s1"&gt;'--use-pep517'&lt;/span&gt; option. Discussion can be found at https://github.com/pypa/pip/issues/8559
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn &lt;span class="nb"&gt;install
&lt;/span&gt;yarn &lt;span class="nb"&gt;install &lt;/span&gt;v1.22.19
warning ../../../../../../package.json: No license field
&lt;span class="o"&gt;[&lt;/span&gt;1/4] Resolving packages...
&lt;span class="o"&gt;[&lt;/span&gt;2/4] Fetching packages...
&lt;span class="o"&gt;[&lt;/span&gt;3/4] Linking dependencies...
&lt;span class="o"&gt;[&lt;/span&gt;4/4] Building fresh packages...
Done &lt;span class="k"&gt;in &lt;/span&gt;1.31s.
&lt;span class="nv"&gt;$ &lt;/span&gt;bench build &lt;span class="nt"&gt;--app&lt;/span&gt; erpnext
✔ Application Assets Linked                                                                                                                          


yarn run v1.22.19
warning ../../../../../../package.json: No license field
&lt;span class="nv"&gt;$ &lt;/span&gt;node esbuild &lt;span class="nt"&gt;--production&lt;/span&gt; &lt;span class="nt"&gt;--apps&lt;/span&gt; erpnext &lt;span class="nt"&gt;--run-build-command&lt;/span&gt;
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
Browserslist: caniuse-lite is outdated. Please run:
  npx browserslist@latest &lt;span class="nt"&gt;--update-db&lt;/span&gt;
  Why you should &lt;span class="k"&gt;do &lt;/span&gt;it regularly: https://github.com/browserslist/browserslist#browsers-data-updating
File                                                        Size

erpnext/dist/js/
├─ bank-reconciliation-tool.bundle.M2IJU46J.js              15.49 Kb
├─ erpnext-web.bundle.SJSJGLAQ.js                           33.34 Kb
├─ erpnext.bundle.N434KUXQ.js                               171.45 Kb
├─ hierarchy-chart.bundle.7XNMCT5W.js                       197.67 Kb
├─ item-dashboard.bundle.FDBNNRVN.js                        10.01 Kb
└─ point-of-sale.bundle.6IPZTPSS.js                         92.75 Kb

erpnext/dist/css/
├─ erpnext-web.bundle.A6SQ2ID7.css                          25.63 Kb
├─ erpnext.bundle.U356GCQU.css                              45.08 Kb
└─ erpnext_email.bundle.IZ3Q7O74.css                        0.56 Kb

erpnext/dist/css-rtl/
├─ erpnext-web.bundle.V7HAL4NV.css                          25.62 Kb
├─ erpnext.bundle.VJVO6DLO.css                              45.07 Kb
└─ erpnext_email.bundle.5XL2M5KG.css                        0.56 Kb

 DONE  Total Build Time: 1.609s

 WARN  Cannot connect to redis_cache to update assets_json
 WARN  Cannot connect to redis_cache to update assets_json
 WARN  Cannot connect to redis_cache to update assets_json
Done &lt;span class="k"&gt;in &lt;/span&gt;5.35s.
&lt;span class="err"&gt;$&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Install ERPNext Into the Site
&lt;/h2&gt;

&lt;p&gt;Once we get ERPNext, we can install it into our site. In version 14, we need to install &lt;code&gt;payments&lt;/code&gt; app first (see &lt;a href="https://discuss.erpnext.com/t/getting-error-when-running-install-app-erpnext/92832):" rel="noopener noreferrer"&gt;https://discuss.erpnext.com/t/getting-error-when-running-install-app-erpnext/92832):&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ bench get-app payments
Getting payments
$ git clone https://github.com/frappe/payments.git  --depth 1 --origin upstream
Cloning into 'payments'...
remote: Enumerating objects: 84, done.
remote: Counting objects: 100% (84/84), done.
remote: Compressing objects: 100% (74/74), done.
remote: Total 84 (delta 12), reused 37 (delta 4), pack-reused 0
Receiving objects: 100% (84/84), 41.23 KiB | 1.72 MiB/s, done.
Resolving deltas: 100% (12/12), done.
Ignoring dependencies of payments. To install dependencies use --resolve-deps
Installing payments
$ /home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/env/bin/python -m pip install --quiet --upgrade -e /home/bpdp/kerjaan/ptjim/erpnext/myERPNext14/apps/payments 
  DEPRECATION: paytmchecksum is being installed using the legacy 'setup.py install' method, because it does not have a 'pyproject.toml' and the 'wheel' package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to enable the '--use-pep517' option. Discussion can be found at https://github.com/pypa/pip/issues/8559
$ bench build --app payments
✔ Application Assets Linked                                                                                                                          


yarn run v1.22.19
warning ../../../../../../package.json: No license field
$ node esbuild --production --apps payments --run-build-command
File                                                        Size

 DONE  Total Build Time: 399.758ms

clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
 WARN  Cannot connect to redis_cache to update assets_json
 WARN  Cannot connect to redis_cache to update assets_json
 WARN  Cannot connect to redis_cache to update assets_json
Done in 3.92s.
$


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench &lt;span class="nt"&gt;--site&lt;/span&gt; myerpnext01 install-app erpnext
Installing payments...
Updating DocTypes &lt;span class="k"&gt;for &lt;/span&gt;payments      : &lt;span class="o"&gt;[========================================]&lt;/span&gt; 100%
&lt;span class="k"&gt;*&lt;/span&gt; Installing Payment Custom Fields &lt;span class="k"&gt;in &lt;/span&gt;Web Form
Updating Dashboard &lt;span class="k"&gt;for &lt;/span&gt;payments

Installing erpnext...
Updating DocTypes &lt;span class="k"&gt;for &lt;/span&gt;erpnext       : &lt;span class="o"&gt;[========================================]&lt;/span&gt; 100%
Updating customizations &lt;span class="k"&gt;for &lt;/span&gt;Address
Updating customizations &lt;span class="k"&gt;for &lt;/span&gt;Contact
Updating Dashboard &lt;span class="k"&gt;for &lt;/span&gt;erpnext
&lt;span class="err"&gt;$&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Setup Frappe for Production Environment
&lt;/h2&gt;

&lt;p&gt;We can use &lt;strong&gt;bench CLI&lt;/strong&gt; to setup Frappe for production environment, especially for specific user. Here, my username is &lt;strong&gt;bpdp&lt;/strong&gt;, so we will do setup for user &lt;strong&gt;bpdp&lt;/strong&gt;. To setup production environment using &lt;strong&gt;bench CLI&lt;/strong&gt;, we need to use &lt;strong&gt;sudo&lt;/strong&gt; since the command will change some system settings. Using &lt;code&gt;sudo&lt;/code&gt; for &lt;code&gt;miniconda&lt;/code&gt; distribution is a little bit tricky since &lt;code&gt;sudo&lt;/code&gt; usually can not find command from &lt;code&gt;miniconda&lt;/code&gt; because &lt;code&gt;miniconda&lt;/code&gt; is installed for user. Therefore we need to use full path:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /home/bpdp/software/python-dev-tools/miniconda39/envs/py310-erpnext/bin/bench setup production bpdp


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;At this point, our installation has fisnished successfully. Next, we will run our ERPNext app and doing some initial setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run ERPNext
&lt;/h2&gt;

&lt;p&gt;To run ERPNext, use &lt;strong&gt;bench CLI&lt;/strong&gt; below;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;bench start
...
...
&amp;lt;screendump&amp;gt;
...
...
16:31:26 web.1            |  &lt;span class="k"&gt;*&lt;/span&gt; Running on http://0.0.0.0:8001/ &lt;span class="o"&gt;(&lt;/span&gt;Press CTRL+C to quit&lt;span class="o"&gt;)&lt;/span&gt;
...
...
16:31:56 watch.1          | Rebuilding bank-reconciliation-tool.min.js
16:31:56 watch.1          | Rebuilding erpnext.css
16:31:56 watch.1          | Rebuilding marketplace.css
16:31:56 watch.1          | Rebuilding erpnext-web.css
&lt;span class="err"&gt;$&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: The screendump above display the port which is accessible using browser where ERPNext serves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Initial Setup
&lt;/h2&gt;

&lt;p&gt;Using browser, access &lt;a href="http://myerpnext:8001/" rel="noopener noreferrer"&gt;http://myerpnext:8001/&lt;/a&gt;, a login screen appear:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vhbh2dh7fd8drl4ctm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vhbh2dh7fd8drl4ctm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use the password which has been created above and Administrator user.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9iofiez773ndc3yesvfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9iofiez773ndc3yesvfe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose your language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feyv3n4drzxtnbbu8g1bf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feyv3n4drzxtnbbu8g1bf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose region and fill timezone and currency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgd0smjqa9liqodnmhz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgd0smjqa9liqodnmhz9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create user. You may put picture or not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkplpri0idnjvxe08ylw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkplpri0idnjvxe08ylw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose domain / industry where our company operate. We may choose more than one for later process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwpxndgtoq48yrn367bp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwpxndgtoq48yrn367bp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Brand of our company. Logo for our company also optional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnabqmycwy665dqkd591f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnabqmycwy665dqkd591f.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More info about our company can be filled now. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0favui7rn0vq0mm5vz4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0favui7rn0vq0mm5vz4v.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait until setup finish successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh32834m928v7emvheff1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh32834m928v7emvheff1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setup completed! Right now, we can start use our ERPNext. Enjoy!&lt;/p&gt;

</description>
      <category>erpnext</category>
      <category>python</category>
      <category>frappe</category>
      <category>erp</category>
    </item>
  </channel>
</rss>
