Datadog APM Tracing in Golang

Motivation and Concept

APM (Application Performance Monitoring) tools like Datadog are important for our system because they provide valuable insights into the performance, behavior, and security of our applications. They allow us to identify performance issues in real-time, improve application performance, troubleshoot problems, plan capacity, and identify security vulnerabilities.

The performance tracing implementation is done by:

  • Running an agent beside your service(s). One agent could be used by several services. The agent acts as gateway to send data to Datadog APIs.
  • Inject the tracer inside your app.
    • For monitoring a casual HTTP service, by default the tracer will watch each request that comes to the router.
    • For deep performance monitoring, custom instrumentation is possible, deep down to SQL queries.
    • Inter-service performance monitoring is also possible, see Distributed Tracing below.

The yellow-colored parts are the ones that you need to setup,

Examples

First, get your DATADOG _API_KEY then run the agent,

docker run -d --cgroupns host \
              --pid host \
              -v /var/run/docker.sock:/var/run/docker.sock:ro \
              -v /proc/:/host/proc/:ro \
              -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
              -p 127.0.0.1:8126:8126/tcp \
              -e DD_API_KEY=<DATADOG_API_KEY> \
              -e DD_APM_ENABLED=true \
              gcr.io/datadoghq/agent:latest

This is the basic example of ddtrace implementation for go-chi,

package main

import (
        "net/http"
        "github.com/go-chi/chi/v5"
        "github.com/go-chi/chi/v5/middleware"
        ddchi "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-chi/chi.v5"
        "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

func welcome(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello world!"))
}

func main() {
        tracer.Start() // Start the tracer daemon
        r := chi.NewRouter()
        r.Use(ddchi.Middleware()) // Inject the tracer
        r.Use(middleware.Logger)
        r.Get("/hello", welcome)
        http.ListenAndServe(":8000", r)
}

Then run the service by pointing out the agent through DD_AGENT_HOST envar,

$ DD_AGENT_HOST=localhost go run single/main.go

If you try to hit http://localhost:8000/hello several times, the traced data will be shown in Datadog APM dashboard.

Custom Instrument

Custom instruments allow us to get deep insight into the performance of our service. Imagine the /hello endpoint has to call another function like this

func functionA() {
        time.Sleep(60 * time.Millisecond)
        return
}

func welcome(w http.ResponseWriter, r *http.Request) {
        time.Sleep(10 * time.Millisecond)
        functionA()
        time.Sleep(10 * time.Millisecond)
        w.Write([]byte("Hello world!"))
}

I did intentionally put some delays to simulate bottlenecked situations.

Nested flamegraph

At the code below I put tracer.StartSpanFromContext at the start of the function. You can see r.Context() is passed to another function. This context contains important tracing metadata like process-id and runtime-id that helped Datadog to build visual flamegraph of your performance profiling later.

func functionA(ctx context.Context) {
        span, _ := tracer.StartSpanFromContext(ctx, "functionA", tracer.ResourceName("someParam"))
        defer span.Finish()
        time.Sleep(60 * time.Millisecond)
        return
}

func welcome(w http.ResponseWriter, r *http.Request) {
        time.Sleep(10 * time.Millisecond)
        functionA(r.Context())
        time.Sleep(10 * time.Millisecond)
        w.Write([]byte("Hello world!"))
}

If you try to hit the endpoint, you’ll see the functionA() bottlenecked our /hello endpoint:

Synchronous execution

The sibling process in flamegraph is also possible, assuming that functionA() and functionB() are executed in sync and functionC() is nested under functionB(), consider this example code,

func functionA(ctx context.Context) {
        span, _ := tracer.StartSpanFromContext(ctx, "functionA", tracer.ResourceName("someParam"))
        defer span.Finish()
        time.Sleep(60 * time.Millisecond)
        return
}

func functionB(ctx context.Context) {
        span, ctx := tracer.StartSpanFromContext(ctx, "functionA", tracer.ResourceName("someParam"))
        defer span.Finish()
        time.Sleep(10 * time.Millisecond)
        functionC(ctx)
        return
}

func functionC(ctx context.Context) {
        span, _ := tracer.StartSpanFromContext(ctx, "functionA", tracer.ResourceName("someParam"))
        defer span.Finish()
        time.Sleep(60 * time.Millisecond)
        return
}

func welcome(w http.ResponseWriter, r *http.Request) {
        time.Sleep(10 * time.Millisecond)
        functionA(r.Context())
        functionB(r.Context())
        time.Sleep(10 * time.Millisecond)
        w.Write([]byte("Hello world!"))
}

You can see that r.Context is passed twice, then it passes again under functionB() to functionC(). This kind of context-passing will build a flamegraph like this:

Database performance

Tracing the database query performance is done by wrapping the database driver like this,

        sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql"
...
        sqltrace.Register("pq", &pq.Driver{}, sqltrace.WithServiceName("postgres"))
        db, err := sqltrace.Open("postgres", args)
        if err != nil {
                panic(err.Error())
        }

Then instead of executing a query like this,

        db.Query(statement)

Now you have to append Context to the function name and pass the context.Context object.

        db.QueryContext(ctx, statement)

Also applied to other database functions (QueryRow() to QueryRowContext(), Exec() to ExecContext() and so on)

Distributed Tracing

Distributed tracing will provide inter-service flamegraph so you can inspect your services performance end to end through several services. To do this, you have to pass the context by using wrapped HTTP client and propagated context. Please take a look at this code of, let’s say, serviceA:

        httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
  ...
        httpClient = httptrace.WrapClient(&http.Client{})
        req, _ := http.NewRequest("GET", "http://service-b/hello", nil)
        req = req.WithContext(ctx)
        carrier := opentracing.HTTPHeadersCarrier(req.Header)
        _ = tracer.Inject(span.Context(), carrier)
        httpClient.Do(req)

Then the HTTP handler in serviceB,

func hello(w http.ResponseWriter, r *http.Request) {
        // Extract from propagated context
        spanCtx, err := tracer.Extract(opentracing.HTTPHeadersCarrier(r.Header))
        if err != nil {
                log.Println(err)
        }
        span := tracer.StartSpan("dummyhelloservice", tracer.ResourceName("/hello"), tracer.ChildOf(spanCtx))
        defer span.Finish()

        log.Printf("CONTEXT %+v", span.Context())
        w.Write([]byte("Hello World\n"))
}

This inter-service propagated context passing will let Datadog build flamegraph like this:

If there is something sit between the services (e.g. a proxy or gateway), this something must support context propagation. Some known proxy that have this feature/plugin/extension are Nginx and EnvoyProxy.

Impact to the codebase

You have to get used to using context.Context and always consider each time you write a function, whether you want to trace the performance or not.

For system-wide implementation and to minimize the refactor effort, you can use helper like this,

/*
 * To get current function name from a function,
 * heavily used by ddtrace implementation.
 * Usage:
 *
 *     pc, _, _, _ := runtime.Caller(0)
 *     log.Println(utils.GetFunctionName(pc))
 */
func GetFunctionName(pc uintptr) string {
        splitted := strings.Split(runtime.FuncForPC(pc).Name(), ".")
        functionName := splitted[len(splitted)-1]
        return functionName
}

Then put these lines at the start of any functions that you want to trace,

func SomeFunction(ctx context.Context, foo string) error {
        pc, _, _, _ := runtime.Caller(0)
        span, ctx := tracer.StartSpanFromContext(
                ctx,
                utils.GetFunctionName(pc),
                tracer.ResourceName("someParam"),
        )
        defer span.Finish()
...

Please remember to pass the context.Context as you need. Losing the context means losing the correct flamegraph representation.

How I created a pull request on my first day at work

I’m not talking about myself regarding the pull request (okay, I’ll talk about it a bit at the end of this blog post), there is nothing special about it.

I want to talk about how a smooth and comprehensive onboarding process could let me create a pull request on the first day at work. All of these onboarding processes were done in less than 4 hours. Kudos for the people who helped me!

The Onboarding Flow

1. Company-wide onboarding by people management

My first encounter with the onboarding is with People Acquisition Specialist. She gave me a company badge and then explained about the company, the mission, the people and its hierarchy, the values and culture, the career path, and so on. She even doesn’t mind re-explaining the things that were already stated in the offering letter to make sure that I know my rights.

2. Hardware

I received an M1 Macbook Pro. It was decent hardware, faster than my previous one.

3. Team onboarding by the CPO

The CPO greeted me then introduced me to the entire teams that were available at the time, then he lead me straight to my desk. He also explained a bit about the business/products.

4. Business, product, and the first tasks onboarding by the VP of Engineering

I was scheduled an 1 on 1 meeting with the VP of Engineering. For sure, he talks fast and it helped for a shorter meeting, which is good. He explained the core business of the company and how the company products will drive these businesses.

My task at the first day was actually to read the wiki/documentation so I could learn about the culture, standards and whatnot but he also told me about what were my next three real tasks that involve coding. I didn’t waste this part by straightly asking about the expectations of these tasks. By the end of the meeting, I have clear hints on how to solve the problems.

He also gave me a clue about the important individuals in the teams. This was very valuable information that helped me to know who is the correct person to ask if something blocks me.

5. Wiki/Documentation

The wiki is huge and extensive. It even contains a page on how to set up your hardware, minutes of meetings, a tech debts list, and so on. I appreciate the transparency they applied here, no silo at all!

I spent around 30 minutes skimming the wiki.

6. Credentials and access

I can’t tell all the services and SaaS used by the company (NDA stuff, you know), but the credentials and access I retrieved in these 4 hours were quite a lot, up to 8 accounts. Not including the accounts that are shared via the company password manager. Trust is essential here.

If you can’t get much trust, the ball is on you to ask the right person for the right credentials/access that you need to start your work. If rejection occurs, you have to explain to them why you need the cred/access. Just make sure nothing blocks you.

Happy hacking.

The Onboarding Process at my previous company

HR will handle the company-wide onboarding then the rest is up to me. So as Product and Engineering Lead, it’s on me to design the onboarding process for my team did try to put myself in the perspective of a new employee, but it was not deep enough. One thing is for sure, I improved the process bit a bit by asking for feedback from the new employees about the onboarding process. You’re lucky if they are honest enough to point out the missing things or the pain points of your onboarding process.

One of the honest feedback I received is about how people have different ways and paces to adapt. This particular new employee said that the long wiki page that I wrote is useless, “No one will read this wiki page” he said. Before I could counter his argument, he added that he was used to talking in person instead of reading boring texts and he need someone to sit down beside him for prolonged hours because he got a lot of questions in his head. I don’t think that I want to sit for hours beside him but he was right to some degree.

I put too much effort on the wiki documentation but spent less on preparing the onboarding in person. I was enforcing RTFM culture unwittingly.

I am supposed to balance the textual onboarding vs in-person onboarding.

My First Pull Request

As I said before, I did nothing special. I picked the easiest among thefirst three tasks. Once I got the Gitlab access, I scanned the repositories and guessed which is the right repo that related to the task, then started digging into the codebase. It’s a fronted one, I spend around 15 to try to understand the codebase structures then go straight to the file that I need to modify. Sure, I got questions/minor issues and asked directly to the person that governs the domain. They are all very responsive and helpful. At the end of the day, I submitted a pull request.

That’s it.

Blockchain, Penggunaan, Masalah yang dihadapi


Blockchain diharapkan akan digunakan dalam berbagai bidang, seperti keuangan, perdagangan, pemerintahan, kesehatan, dan lainnya. Beberapa contoh penggunaan yang diharapkan adalah:
  • Sistem pembayaran yang lebih efisien dan aman
  • Penyimpanan data yang lebih aman dan mudah diakses
  • Smart contract yang memungkinkan transaksi otomatis
  • Supply chain management yang lebih transparan
  • Sistem voting yang lebih adil dan aman
  • Pencatatan aset digital yang aman dan mudah diakses
Namun, ada juga beberapa halangan yang harus diatasi sebelum penggunaan blockchain dapat digunakan secara luas, seperti regulasi yang belum jelas dan masalah skalabilitas.

Regulasi yang belum jelas dapat menghambat perkembangan dan penggunaan blockchain karena masih ada ketidakpastian tentang bagaimana teknologi ini harus diatur. Beberapa negara belum memiliki regulasi yang jelas mengenai penggunaan mata uang digital, smart contract, atau aset digital lainnya yang dibangun di atas blockchain. Hal ini dapat menimbulkan masalah bagi perusahaan atau individu yang ingin menggunakan teknologi ini dalam bisnis mereka.

Masalah skalabilitas di blockchain terkait dengan jumlah transaksi yang dapat ditangani oleh jaringan dalam satu periode waktu tertentu. Saat ini, beberapa jaringan blockchain seperti Bitcoin dan Ethereum hanya dapat menangani sekitar 7-15 transaksi per detik. Ini sangat sedikit jika dibandingkan dengan sistem pembayaran tradisional seperti Visa yang dapat menangani hingga 65,000 transaksi per detik. Ini menyebabkan masalah ketika jaringan sibuk dan membuat transaksi menjadi lambat atau terganggu. Beberapa solusi yang dikembangkan untuk mengatasi masalah skalabilitas ini, seperti SegWit, sharding dan off-chain scaling. Namun, masalah ini masih dalam proses pengembangan dan penyelesaiannya.

-- sumber dari chatGPT --

AWS Cloud: Stop an EC2 Instance using AWS Lambda when the Budget Amount is Reached

Hi all!

Good night and happy holiday! Here I would like to share with all of you about something an interesting case study that maybe you’ve done or come across soon.

Imagine the Developer Team in your company is still doing Proof-of-Concept related to a specific project for the user, and the user is strict about the cost. The Dev Team is using EC2 Instance and the maximum budget for EC2 Instance is only $5 per day.

You —as an infrastructure engineer are tasked to create an alert when a budget amount is reached. The alert will send a notification via email, and at the same time the user wants any running EC2 Instance will automatically stop for further investigation.

For this case, we will be using several services to make the goal is reached. The diagram is below:

First, to ensure the team’s cost usage is under control and tracked easily, we are able to use AWS Budget. This service is provided by AWS and will show our maximum budget for all or specific services. We are also able to define the threshold and connect it to Amazon SNS (Simple Notification Service), so the team will be notified. For example, we defined the maximum budget as $2 per day, and the alarm was triggered when it reached 80%. This is really something interesting. We don’t necessarily check it manually, and the team is notified automatically via email (for example).

How about a task to stop the EC2 Instance at the same time? Yup, AWS Lambda Function. We are able to use that service to ensure the EC2 instance is stopped when the alarm is triggered 🙂

Let’s break it down!

First, we have to configure the notification using Amazon SNS. There are two components that we have to set up. Topic and Subscription. Topic is similar to a channel that will send a broadcast message to subscribers we defined in a subscription, for example email and AWS Lambda. Both will receive a notification when the budget amount is reached.

To create a topic, you can follow the full guide here. The thing you must pay attention to is access policy. Add an additional policy so that Amazon SNS will get permission to publish a notification when the budget is reached. Below:

{
  "Sid": "E.g., AWSBudgetsSNSPublishingPermissions",
  "Effect": "Allow",
  "Principal": {
    "Service": "budgets.amazonaws.com"
  },
  "Action": "SNS:Publish",
  "Resource": "your topic ARN",
   "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "<account-id>"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:budgets::<account-id>:*"
        }
      }
}

Below is an example of topic I’ve created:

For the first subscription, follow the guide here and ensure the email is confirmed.

If the Amazon SNS is configured, we move on to the AWS Budget.

From the Management Console, find an AWS Budget menu and just click create button. In this case, I’m using Customize and Cost budget type like the one below.

I’m set for the period is to daily, and the amount is $2.

For the budget scope, because in this case, the Dev team only using EC2 Instances, we can configure to filter EC2 Instances only.

We can define the specific threshold for the alert. Below the example, if the usage is reached 80% of the budgeted amount, it will send the notification.

Who will receive the notification? Put the ARN Amazon SNS that we created before in the form. Ensure it is valid.

Until this step, a team that has the email will get a notification when the budget amount is reached 80%. After this, we have to configure AWS Lambda. We have to create a function that will execute to stop the EC2 Instance when the alert is triggered.

First, create a new policy and role in IAM so the AWS Lambda will have permission to stop EC2 Instance directly. Below is the policy in a JSON format:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeRegions",
                "ec2:StopInstances",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}

The policy I’ve created successfully:

Below is the role I’ve created successfully:

For the function in AWS Lambda, I’m using Python 3.7 runtime and for the execution role, choose the existing role we created before. Here, my existing role name is StopEC2Instance.

Below is the example code to stop EC2 instances. Paste into lambda_function.py editor.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
import boto3
def GetInstanceRunning():
client = boto3.client('ec2')
ec2_regions = [region['RegionName'] for region in client.describe_regions()['Regions']]
for region in ec2_regions:
ec2 = boto3.resource('ec2')
instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
return [instance.id for instance in instances]
def StopInstance(ids=GetInstanceRunning()):
ec2 = boto3.client('ec2')
if not ids:
print("No Instance in the state Running or pending")
else:
ec2.stop_instances(InstanceIds=ids)
ec2.get_waiter('instance_stopped').wait(InstanceIds=ids)
print('instance {} was shutdown'.format(ids))
def lambda_handler(event, context):
StopInstance()

Go to the Test tab and click Test. Wait for a moment, and below is the result. It shows that there is one instance is shutting down.

Go to EC2 Instance, and the instance status is stopped 🙂

But wait! The function is run successfully when we click the Test button. How about ensuring that it will run when the budget is reached?

Just add a new Trigger 🙂

Set a new trigger into Amazon SNS that we created before.

It was added successfully, and whenever the alert rings, the function will automatically run to stop EC2 Instances.

Thank you!

References:

  1. https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html
  2. https://docs.aws.amazon.com/sns/latest/dg/sns-email-notifications.html
  3. https://boto3.amazonaws.com/v1/documentation/api/latest/guide/ec2-example-managing-instances.html

My Journey: #RoadToGDE Mentorship Program

Hi all!

How are you?

I hope that you all good and healthy. By end of this year, I just want to share something great experience I’ve done from September until December 2022. Yup #RoadToGDE Mentorship Program.

That is an incredible journey, I thought. As long as 7 weeks, we as a mentee got opportunities to discuss all related technical and preparation to become a GDE with the real GDE directly and supported by Google.

GDE or Google Developer Expert is a program provided by Google for whoever has an interest and expert in their expertise. Not only experts but also actively contributing to the community and caring for each other. This is the part I am interested in. Sharing is caring. You can read more here.

I would like to say thousands of thanks , through this program, I’m able to meet Imre Nagi. My mentor during this mentorship. LinkedIn, GitHub, and Twitter.

Imre Nagi currently is a Tech Lead at Gojek, Indonesia. Besides that, he is also a GDE in Cloud Platform specialization. Match with the path I currently learn. He has lots of experience in technology he expertise, and also actively contributes to the communities. So inspiring me and making me keep moving, learning, and contributing too!

As I said, I got a lot of knowledge through mentoring, and through this journal, I would like to you all learn and get value too.

The mentoring is divided into seven-part from September to December. In each part, we will get a chance to 1o1 mentoring for around one hour with our mentor. Yup, each of the mentees will exclusively get a private mentor around the world.

I remember, my first mentoring was held on September 7th, 2022. One of the interesting things about my first mentoring is to always use the time as valuable as possible. Yup. The mentoring was only one hour, and it was a rare chance! For the first one hour, mas Imre shared about the GDE Program and his experience when becoming a GDE.

He had just goes back from study, at that time still a software engineer in a startup company in Indonesia, and at that time, he looking for a chance to become a GDE through a Google Developer Manager in Indonesia. He prepared the mock application, an gratefully, He accepted to become a GDE in Data. When mas Imre tells the story, I imagine how enthusiastic and incredible that moment was.

He asked me, with what media will I apply to a GDE Program? Youtube video, podcast, or technical blog? By the way, this media is important to whoever wants to apply GDE because it will be used as proof we actively contributing to the community.

These are the media Mas Imre used to actively contribute:

That was so huge and great. I preferred to choose my personal blog at misskecupbung.wordpress.com :). I showed him that, and he gave me a task to create a technical blog for the next mentoring and expected I could write at least four blogs through this mentoring.

At the mentoring, Mas Imre said, “your writing is good enough; the step-by-step you’ve written is well-prepared. But there is no unique opinion you give in. So, why other people as a reader will read your writing whether they can read it fully on the documentation directly?”

Yup. That’s the point I forgot all along when I wrote a blog or when I spoke at a live event. I’ve not mentioned my opinion, pros and cons about the tools, or something brave takeaways like the comparison between the tools. That so makes me think about it deeply.

It continued to the 2nd and 3rd mentoring held on September 22nd, 2022, and October 7th, 2022. We discussed how to write a good technical blog, something straightforward to write about the point; you’re not necessarily to write all the steps because it is already written in the documentation. If you have to write a code, paste it to GitHub or Gist GitHub and embed it on your blog. Don’t hesitate to put your opinion there. Something about your definition by your experience, pros, and cons when you use the tools or when you compare the tools with others (for example, GKE vs Kubernetes vs EKS).

In the 4th and 5th mentoring, we discussed the mock application to apply for the GDE program. The mock application is divided into several parts, each of which is explained by mas Imre carefully. First, about the bio, and then about the reason for applying, which tells about why you want to apply for a GDE? which part do you want to apply? because there are several options like Google Cloud Platform, Web Development, Mobile, etc. The ends are in-person impact I’ve done which is an activity I spoke about and content I created for at least three years long.

I always thought that GDE was a program I could use to contribute more actively to the community. But, why GDE? If you want to contribute to the community, would it be much more difficult without being a GDE? What’s the problem? What is the impact of GDE, or what can Google support so you can solve the issue? Asked by Mas Imre, and made me think along the day 🙂

Yup, the keypoint is WHY. It’s not just about the goal, but the reason also. Something like when we troubleshoot the issue. Find the root cause, and solve the problem.

On the 6th mentoring, which was held on November 22th 2022, we discussed mock interview. Actually, when we apply for GDE, there are two interviews. First interview with other GDEs, will discuss the community itself and a bit of technical knowledge. The second interview is with Googler/Noogler (Google’s employee with expertise in the category we chose).

But, in this mentorship, we just do mock interviews for the first interview, which is a community interview. There will be three parts. The first is an introduction, the second is about the community itself, and the third is about a bit of technical knowledge.

Mas Imre acted as an interviewer and asked me several questions. The result is not smooth as I want. The bad moment was when I answered the questions:

  • Why do you want to become a GDE?
  • What is the workflow, and what happens inside the infrastructure when we run kubectl apply -f deployment.yaml?
  • CRD inside of Kubernetes

Maybe at the moment, I’m too confident and not creating something like a cheat sheet. So when I get unexpected questions, I need more time to think about the question, find the answer, and translate it into English first in my head and then say it. Too long and wordy. Mas Imre said it because we, as Indonesian, use English, not the daily language. So, when we want to talk using English, we have to think about it in Indonesian first, and our brain has to translate it into English, and yes, there is a need for more time. It is normal, and we have to reduce the time to make it more smooth.

Mas Imre gave me advice like: do practically English every day in small cases; for example, when you are on the road and see a traffic sign, billboard, etc., Try to say that in English. Make you used to English. He gives me one chance to do it again at the next mentoring session.

The last mentoring was held this week, on 27th December 2022. Why was the gap between the previous mentoring one month? Because there were DevFest 2022 events held in several cities, we focused on there first, and mas Imre gave me more time to prepare the mock interview (thank you!).

The 2nd community interview was similar to the first interview, and I tried to be more fluent by creating a cheat sheet (I tried at home several times a day to achieve it :D). Mas Imre said that the second one is good enough with some advice. First, keep moving because we still learning (especially in English). He also gives me correctness in some questions to make my answer is more clear, and we take a photo 🙂

I would like to thanks to #RoadToGDE committee too. The Kits just arrived!

See you next on my journey! Thank you!

Mencoba Emulator PS3

Sambil menunggu pekerjaan ready untuk dikerjakan, saya tergerak iseng untuk memainkan game melalui emulator. Target yang dicoba adalah RPCS3 yang tersedia pada repositori distro-distro linux, juga tersedia untuk Windows dan MacOS.

Yang perlu dicatat prosesnya kurang lebih sebagai berikut:

  1. Pasang RPCS3 pada sistem Anda.
  2. Unduh firmware PS3 pada situs Playstation.
  3. Siapkan image/iso game yang akan digunakan, kalo mau berburu di internet juga bisa. Image tersebut terenkripsi.
  4. Pasang alat Libray untuk mendekrip image pada butir 3. Baca panduannya dengan baik.
  5. Idr bisa merujuk ke sini.

Catatan tambahan:

  • Jika menggunakan controller Xbox One, gunakan xpadneo agar pemetaan tombolnya sesuai.

Liputan Indonesia Linux Conference 2022 - Bagian 1

Beberapa bulan lalu saya mengajukan diri sebagai pemateri acara Indonesia Linux Conference 2022 yang awalanya akan dilaksanakan di salah satu Universitas di Ponorogo, Jawa Timur.

Namun karena sesuatu hal, akhirnya harus pindah ke tempat lain yaitu dilaksanakan di Universitas Muhammadiyah Sidoarjo (UMSIDA).

Alhamdulillah materi yang saya ajukan berjudul Aplikasi Permainan F/LOSS Untuk Pendidikan layak ditampilkan. Materi ini masuk kategori Lightning Talk dengan Durasi 10 menit.

 

Persiapan Materi

Untuk pembuatan materi ini, terlebih dulu saya mengumpulkan berbagai dokumentasi lama yang pernah saya ikuti, adapun isinya berupa Foto dan Video.

Kemudian foto-foto dan video tersebut saya susun menjadi presentasi berupa video menggunakan KDENLIVE. Saya membuat presentasi berupa video alasannya adalah untuk menyesuaikan durasi yang hanya 10 menit sesuai dengan kategori Lightning Talk. 

Saya buat materi 9 menit 55 detik (toleransi 5 detik), tentu saja saya pasang timer di di video yang saya buat. Nah... di sini ternyata saya salah memperkirakan toleransi waktu tersebut yang hanya 5 detik saja, mungkin seharusnya minimal 2 menit

Efeknya adalah saya hanya bisa menggunakan presentasi tersebut kurang dari 8 menit. Hal ini terjadi karena kesalahan operator yang kurang cakap ketika membuka presentasi berupa Video.

Operator mungkin mengira presentasi saya berupa berkas format PDF, karena sebelumnya juga sudah terjadi permsalahan yang hampir sama, yaitu ketika membuka file format PDF dikiranya berupa file ODP sehingga tidak bisa dijalankan secara langsung. Setelah terjadi teriakan dari berbagai orang, presentasi bisa dibuka dengan klak-klik area tertentu baru muncul tulisan Presentasi pada menu, presentasi berupa PDF akhirnya berhasil dijalankan.

Nah.... presentasi saya juga kurang lebih seperti itu kejadiannya, yang mana waktu saya terpotong 2 menit lebih. Untung saja saya tidak jadi kirim berkas presentasi berupa format SVG yang seperti biasa saya lakukan, mungkin kalau pakai SVG bisa habis setengah durasi untuk saya.

Di sini saya tidak menyalahkan siapa pun, termasuk operator yang tugasnya menjalankan presentasi, saya yakin operatornya juga sudah keluar keringat dingin ketika itu. Saya harap ini sebagai pembelajaran untuk ke depan agar kejadian serupa tidak terulang kembali, tentunya selain kejadian Meme Tragedi Salah Desktop di Acara ILC 2022

Materi presentasi lengkap dari saya bisa dilihat di Youtube, tapi tentu saja sensasi melihat di youtube dengan melihat langsung pada acara sangat berbeda karena tidak ada narasinya.


 

Perjalanan ke Lokasi

Saya berangkat ke Sidoarjo dari semarang dengan angkutan darat, yaitu Bus umum dari terminal Terboyo Semarang tujuan terminal Bungurasih Surabaya, berangkat dari rumah pukul 20.45 WIB dengan ojek online, sampai di terminal ngeteh dan isi perut dulu, tidak lupa ngobrol-ngobrol dengan beberapa pedagang yang masih kenal saya.

Pukul 21.20 WIB naik Bus Patas di depan pabrik percetakan Suara Merdeka yang mana pabrik tersebut sudah tutup sejak lebih dari 5 tahun lalu.

Singkat cerita sampai di terminal Bungurasih pukul 05.12 menit, cari masjid, kemudian sholat subuh (tidak peduli apakah masih sah atau tidak yang penting yakin).

Ngeteh, makan pisang rebus, sarapan pop mie di terminal, selesai ritual ini berangkat ke Sidoarjo, rencananya mau naik bus TransJatim untuk ke lokasi, ternyata penuh terus, akhirnya menggunakan moda transportasi online.

 

Oh ya, untuk menggunakan moda transportasi online di terminal Bungurasih Surabaya harus dari luar terminal, akhirnya saya pagi itu sedikit olah raga kecil dengan jalan kaki ke luar dari terminal.

Salah Lokasi

Tanggal 04 November ada kelas Seminar LibreOffice internal di Kampus UMSIDA, pesertanya adalah dosen dan mahasiswa/i Prodi IT, kebetulan saya dan pak Aftian yang ditunjuk sebagai pematerinya.

Saya tidak tahu jika acara seminar diadakan di kampus yang berbeda (salah saya juga sih tidak tanya ke panitia), ternyata dilaksanakan di kampus 2. Saya naik ojek online turun di kampus 1. Pas turun ada pesan dari telegram kalau seminar dilaksnakan di kampus 2 lantai 4.

Saya pun bertanya Satpam, dimana letak kampus 2, oleh satpam ditujukkin kalau kampus 2 bapak maju lurus saja, nanti belok kanan, di sebelah gedung yang sedang di renovasi itu kampus 2, eh ternyata info dari satpam tersebut salah, tanya satpam lagi, baru dapat jawaban yang benar kalau kampus 2 jaraknya masih sekitar 3 KM.

Singkat cerita saya pun akhirnya sampai di kampus UMSIDA 2 dengan naik ojek online lagi.

 

Di kampus 2 clingak-clinguk, jalan kaki ke masjid, di depan masjid sudah ada beberapa orang yang mengenali saya padahal belum pernah bertemu langsung sebelumnya.

Istirahat di lantai 3, tidak lupa numpang mandi biar segar. Tidak beberapa lama teman-teman panitia datang, ngobrol-ngobrol sebentar.

Pukul 09.12 WIB acara seminar dimulai, seminar dilaksanakan di lantai 4 yang mana untuk ke lantai 4 tidak ada lift, jadi harus jalan kaki melewati tangga yang cukup unik.

Materi pertama adalah Pengenalan LibreOffice secara umum, dilanjut dengan penjelasan dan demo LibreOffice Impress.


 

Selesai materi  LibreOffice, dilanjut materi Pegon yang dibawakan oleh pak Aftian, tidak lupa pak Aftian juga ceramah mengenai dosa besar menggunakan aplikasi yang seharusnya berbayar tapi tidak bayar.

Pukul 10.00 WIB acara seminar internal selesai, makan cemilan yang disediakan panitia, foto-foto, kemudian kembali ke kampus UMSIDA 1.

Sampai di sini dulu Liputan Indonesia Linux Conference 202, sampai jumpa pada liputan selanjutnya.

Terima kasih sudah mau membaca tulisan singkat ini. 


Meme Tragedi Salah Desktop di Acara ILC 2022

Kemarin di acara ILC2022 terulang kembali kejadian yang hampir mirip kejadian tempat lain yang pernah ada sehingga menjadi cukup viral memenya.

 
Berikut ini analisa mengenai penyebab kejadian tersebut dari sudut pandang teknisi berdasarkan profesi dan pengalaman saya, sehingga tidak terulang lagi kejadian serupa pada acara lain.
 
Ketika acara dimulai saya sudah menyadari bahwa ada yang tidak beres dengan tamplian gambar di Videotron, yaitu pada tampilan beberapa logo yang tidak simetris atau dengan kata lain terlihat gepeng.
 
Tidak lama kemudian saya tanya ke operator yang menjalankannya sampai dimana kewenangannya untuk akses komputer dan Videotron tersebut.
Dia jawab sebatas mengoperasikannya saja.
 
Nah sampai disini sudah jelas, pihak panitia penyelenggara tidak bisa berbuat banyak, dan kalau pun dipaksakan acara pasti molor, bisa jadi malah tidak terlaksana hari itu juga, karena teknolgi Videotron tidak sebarangan orang bisa menanganinya.

Videotron Rakitan
Biasanya Videotron besar dalam ruangan menggunakan versi rakitan, alasannya kalau beli yang bukan rakitan susah memasukkanya ke ruangan terutama ketika melewati pintu ukuran standar dengan tinggi 2 meteran.
Yang saya maksud di sini adalah Vediotron yang dirakit di tempat, karena semua videotron memang rakitan, hanya saja kalau videotron outdoor sudah dirakit dari distributor.

Berikut penjelasan sederhana proses perakitan Videotron:
Komponen: Cabinet - Kontroler, Sender Card, Reciver Card, dan Player
 
Langkah perakitan dan pengaturan
Rakit dulu Cabinet Kontroler Videotron dengan benar sesuai jumlahnya,  cabinet harus benar urutannya, kalau keliru potongan gambar bisa acak. 
 
Gambar Ilustrasi jika salah susun Cabinet
 
 
Sambungkan Cabinet ke Sender Card (sebagian besar koneksi dari komputer/laptop ke sender card modern menggunakan jaringan internet)
 
Kontroler Videotron
Install sender card, setelah terdeteksi, masuk ke screen configutation setting panel, masukkan password, bagian setting ini menggunakan software khusus (contoh: HD Player)
 
Bagian ini sengaja tidak saya lampirkan gambar pemandu karena pembaca tidak perlu mikir, setting Videotron itu benar-benar mudah kok.
 

Komponen lain yang perlu di perhitungkan adalah Receiver card, misal menggunkan Linsn Rv908m32

Setting brightness (semakin besar nilainya semakin bagus, tapi daya yang digunakan semakin besar atau semakin boros listrik)

setelah semua setting selesai, untuk bisa menghubungkan laptop lain ke Videotron bisa menggunakan menambahkan player, contoh menggunakan Novastar yang memiliki input AV, VGA, dan HDMI

Permasalah di ILC2022 bisa saja terjadi seperti kondisi berikut:
  1. Driver VGA pada komputer belum terinstall dengan benar, sehingga gambar yang ditampilkan tidak bisa sempurna (terlihat gepeng pada ikon lingkaran), dengan demikian kesulitan untuk melakukan pengaturan pada desktop.
  2. Resolusi komputer/laptop hanya support resolusi 1365 x 768 sedangkan Videotron membutuhkan resolusi 1920 x 1080, hal ini terlihat jelas pada salah satu presentasi yang menggunakan file PDF yang bagian bawahnya muncul potongan gambar bagian atas salindia.
  3. Tidak ada tambahan Palyer pada Videotron sehingga tidak bisa menghubungkan laptop ke Videotron (dengan asumsi videotron langsung terhubung ke komputer melalui LAN.
  4. Bisa saja terjadi karena permasalahan point 1 dan 2.
  5. Atau bisa juga karena faktor lainnya
 Ada juga yang komentar ditwitter kalau laptop operator tidak boleh diganti Linux 
 
Kalau komentar ini bisa saya simpulkan adalah komentar ngawur, apa diatahu secara pasti kalau Videotron bisa tersambung dengan Laptop?. 
Bisa jadi tidak bisa karena tidak ada port input VGA/HDMI ke laptop (tidak menggunakan player tambahan). Atau kasus lainnya laptopnya tidak ada port LAN RJ45.
 
Misalkan bisa menggunakan laptop yang OSnya Linux apakah support dengan Videotron secara langsung?
 
Atau misalkan komputer operator boleh diinstall ulang, apakah ada jaminan driver dan software videotron tersedia di Linux?, kalau pun tersedia proses install pasti memakan waktu lama, belum lagi jika gagal di tengah jalan yang mengakibatkan tampilan Videotron menjadi klisse.
 
Kalau sampai terjadi Klisse harus bongkar videotron untuk reset ulang kontroller (clear CMOS), bahkan bisa lebih parah lagi kalau harus inject firmware (semacam firmware eprom pada TV.

Untuk kalian yang membuat dan menyebarkan meme tersebut jika memang pintar cobalah buat tutorial Cara Menyambungkan Laptop OS Linux ke Videotron dengan Mudah, jika tidak bisa, kalian memang Djuaanncuuuk (mumpung acaranya di jawa Timur saya pakai pisuhan jawa timuran)
 
Sebenarnya saya juga mau MISUH dengan kejadian itu, karena berimbas juga pada materi saya, tapi percuma juga karena sudah ada yang mewakili pada sesi setelahnya. Seandainya saya juga ikut misuh tidak akan mengubah apapun, bahkan bisa memperkeruh suasana.
-
Semarang, 06 November 2022

Google Cloud: Backup and Restore Our GKE Workloads using Backup for GKE

Hi all!

I hope that you are doing well, safe and healthy!

In this journal, I would like to share and explain a case study related to one of the great features of Google Kubernetes Engine (GKE). Yup, it is a Backup for GKE. As the name suggests, this feature is intended to back up and restore the workloads in the Kubernetes cluster we have on Google Cloud.

What can be backed up?:

  • Configuration: Kubernetes resource including manifest and the cluster state.
  • Volume backups: Application data that correspond to PersistentVolumeClaim resources

There are many possible scenarios that we can choose to back up and restore the cluster. For example, we can only back up the configuration and restore it to the newly created cluster, or we can also back up the entire cluster and restore it to the source cluster for disaster recovery that may happen. Besides that, we can also set a scheduler job to run back up automatically. It will save our lives when shocking incidents unexpectedly happen.

From the main documentation here, there are two main components to focus on. A service and an agent. A service has the ability to serve as a controller for Backup for GKE service, and the agent will run automatically in the cluster where backups or restores are performed. Below is the diagram architecture:

As you may know, in the previous journal, I already wrote about Velero. One of the open-source tools which has a similar function to Backup for GKE. So, what is the difference between both? Based on my perspective, Backup for GKE is more simplified and requires less effort than Velero. You do not necessarily download the binary and install it like Velero. Also, Backup for GKE is more integrated into GKE and GCP services as common like IAM, Cloud Storage Bucket, etc.

But, if you were more familiar with Velero as you’re used it in another Kubernetes environment cluster before, and you want to use Backup for GKE now, you need to adapt again . For example, in Backup for GKE you need to create a backup and restore plan as template before doing a backup and restore. Backup for GKE also gives us a challenge when we’ve already enjoy using it and we have to move in another cloud platform, we need to research and adapt again because this feature is native and proprietary.

Backup for GKE is a separate service from GKE, so the pricing too. Based on the documentation here, we will be charged along two items. Backup management and also storage. And the pricing is different based on the region. So be careful!

Now. In this journal, we will do a simple backup and restore scenario. I have a GKE cluster in us-central1 named gke-cluster1-a. There, I deploy a wordpress application with a persistent disk provided by PersistentVolumClaim and execute backup regularly every hour. Then I create a new GKE cluster named gke-cluster1-b, and try to restore the backup created before to test and ensure that the backup runs smoothly and successfully.

What will I back up? GKE cluster configuration and wordpress data stored on persistent disk. So, when the restore is complete, wordpress is automatically loaded and can be accessed from outside.

As I writing this journal, Backup for GKE still has a limitation for backup storage(PVC). It is only support for multi-zone (intra-region) and doesn’t support multi-region yet. So, I will only using us-central1 region for backup and restore.

Okay! Let’s jump in!

Here, I will use Google Cloud SDK instead of Google Cloud Console. So, I will define the environment variables first like below:

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
# Define env variables
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_USER=$(gcloud config get-value core/account)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID –format="value(projectNumber)")
export IDNS=${PROJECT_ID}.svc.id.goog
export GCP_REGION="us-central1"
export GCP_ZONE="us-central1-c"
export NETWORK_NAME="default"
view raw define-env-gcp hosted with ❤ by GitHub

Make sure the configuration is correct, and then set the default region and zone based on the variables defined before.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud config set compute/region $GCP_REGION
gcloud config set compute/zone $GCP_ZONE

We can verify with the command below:

gcloud config list

We need to enable three APIs that will be used for each service. Containers API will be used by GKE for computing, storage API will be used by GKE for persistent disk, and also GKE Backup for backup and restore tasks.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud services enable compute.googleapis.com \
container.googleapis.com \
storage.googleapis.com \
gkebackup.googleapis.com
view raw enable-apis-gke hosted with ❤ by GitHub

We can verify the enabled services with command below:

gcloud services list --enabled

Next. We have to create a GKE cluster. I create it as a public cluster with a multi-zones configuration in us-central1 region. Do not forget to add –addons=BackupRestore to install Backup for GKE agent in this cluster.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
export CLUSTER_NAME="gke-central1-a"
gcloud beta container clusters create $CLUSTER_NAME \
–project=$PROJECT_ID \
–region=$LOCATION \
–addons=BackupRestore \
–num-nodes=1 \
–enable-autoupgrade –no-enable-basic-auth \
–no-issue-client-certificate –enable-ip-alias \
–metadata disable-legacy-endpoints=true \
–workload-pool=$IDNS

Verify the cluster and make sure the state of all workers is Ready.

gcloud container clusters get-credentials $CLUSTER_NAME \
--region $GCP_REGION --project $PROJECT_ID

kubectl get nodes -o wide

For wordpress application, I am using the tutorial from here. You can follow along, or use your own application instead.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
# create Kustomize file
cat > ./kustomization.yaml << EOF
secretGenerator:
– name: mysql-pass
literals:
– password=gkebackup2022
EOF
# download manifests
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
# update Kustomize file (note >> which appends original file)
cat >> ./kustomization.yaml << EOF
resources:
– mysql-deployment.yaml
– wordpress-deployment.yaml
EOF
# deploy (using built-in kustomize feature of kubectl)
kubectl apply -k ./
view raw deploy-wp-gke hosted with ❤ by GitHub

Make sure the pod is running, the external IP in the service appears, and the volume state is bound.

kubectl get pods
kubectl get svc
kubectl get pvc

Try to access the application from browser like below.

Now, we are going to do back up strategy. We will back up the entire kubernetes cluster environment, including data volume and secrets.

Before that, make sure the location can provide it, because not all regions can using command below:

gcloud alpha container backup-restore locations list \
    --project $PROJECT_ID

For the backup strategy, we have to create a BackupPlan first. I will create it using environment variables that defined below

# Define env variables for GKE Backup
export BACKUP_PLAN="gke-central1-a-backup"
export LOCATION="us-central1"
export CLUSTER="projects/$PROJECT_ID/locations/$GCP_REGION/clusters/$CLUSTER_NAME"
export RETAIN_DAYS="3"

And then, create a BackupPlan which will back up all namespaces, including secret and volume data. I also set the cron scheduler that will automatically back up every hour and set backup retention only for 3 days.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud alpha container backup-restore backup-plans create $BACKUP_PLAN \
–project=$PROJECT_ID \
–location=$LOCATION \
–cluster=$CLUSTER \
–all-namespaces \
–include-secrets \
–include-volume-data \
–cron-schedule="0 * * * *" \
–backup-retain-days=$RETAIN_DAYS \
–locked

Verify the backup plan newly created:

gcloud alpha container backup-restore backup-plans list \
--project=$PROJECT_ID \
--location=$LOCATION

We can also verify from the Cloud Console too

How do we back up using BackupPlan created before? Using the command below will create a manually backup named manual-backup1 with the appropriate BackupPlan, location, and project.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
export BACKUP=manual-backup1
gcloud alpha container backup-restore backups create $BACKUP \
–project=$PROJECT_ID \
–location=$LOCATION \
–backup-plan=$BACKUP_PLAN \
–wait-for-completion

Wait and ensure the backup is successful.

All right. After we do the back up the task. We need to test using restore to ensure that the backup is running correctly.

First, I will create a second GKE cluster with the same specification like the cluster one.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
export CLUSTER_NAME2="gke-central1-b"
gcloud beta container clusters create $CLUSTER_NAME2 \
–project=$PROJECT_ID \
–region=$LOCATION \
–addons=BackupRestore \
–num-nodes=1 \
–enable-autoupgrade –no-enable-basic-auth \
–no-issue-client-certificate –enable-ip-alias \
–metadata disable-legacy-endpoints=true \
–workload-pool=$IDNS

Same as BackupPlan, I define the environment variables:

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
export RESTORE_LOCATION="us-central1"
export RESTORE_PLAN="gke-central1-b-restore"
export CLUSTER2="projects/$PROJECT_ID/locations/$GCP_REGION/clusters/$CLUSTER_NAME2"
export CLUSTER_RESOURCE_CONFLICT_POLICY="use-backup-version"
export NAMESPACED_RESOURCE_RESTORE_MODE="delete-and-restore"
export VOLUME_DATA_RESTORE_POLICY="restore-volume-data-from-backup"

And do the manual restore with appropriate restore plan and the backup created before.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
export RESTORE="manual-restore1"
gcloud alpha container backup-restore restores create $RESTORE \
–project=$PROJECT_ID \
–location=$GCP_REGION \
–restore-plan=$RESTORE_PLAN \
–backup=projects/$PROJECT_ID/locations/$LOCATION/backupPlans/$BACKUP_PLAN/backups/$BACKUP \
–wait-for-completion
view raw restore-gke hosted with ❤ by GitHub

Wait until the restore is successful. Verify the pods is running, PVC are bounds, and the external IP is accessible

References:

  1. https://cloud.google.com/kubernetes-engine/docs/add-on/backup-for-gke/concepts/backup-for-gke
  2. https://cloud.google.com/kubernetes-engine/docs/add-on/backup-for-gke/how-to/install

Cheers!

Google Cloud: Backup and Restore Our GKE Workloads using Velero

Hi all!

I hope that you are doing well. In this journal, I will explain the backup and restore strategy for Kubernetes using Velero, specifically in Google Kubernetes Engine (GKE).

As you may know, Velero is one of the great open-source tools which can be used to back up and restore (including migrate and replicate) our existing Kubernetes cluster. It has lots of features which we can use. First, absolutely it is open source. We can use Velero in all most Kubernetes environments. For example, on-premise, Google Kubernetes (GKE), or other public clouds. So, if you are already using Velero in another environment, you will easily adapt to it in GKE.

Based on the main documentation here, there are many use cases that we can use to implement using Velero, for example, backup filtering. Velero is also easy to use. We just have to install the binary and a bit of configuration to connect to the cluster, and it is ready to do backup and restore.

But, in this case, there are many limitations on Velero too. First, Velero does not natively support the migration of persistent volumes snapshots across cloud providers. If we want to do it, we need to enable Restic. Velero also does not support do restore into a cluster with a lower Kubernetes version than where the backup was taken. So, we need to ensure the version is properly and carefully.

Maybe, in previous experience, you’ve already tried Velero to execute backup and restore on-premise Kubernetes environment. This is the most common use case, but storage is one of the benefits of using the public cloud. We don’t necessarily to taking care of the backup storage because (for example, in GCP, we are using cloud storage) it is fully managed.

We just have to create a backup (if we don’t have one) that is ready to use.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
BUCKET=velero-backup-anandadwi
gsutil mb gs://$BUCKET/
# verify
gsutil ls

Because Velero needs access the resources and the storage, we need to create a service account and define the permission. The permission must be attached to the service account is get, create, and delete. So the resources are accessible from Velero.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud iam service-accounts create velero-backup-anandadwi –display-name "Velero SA"
SERVICE_ACCOUNT_EMAIL=$(gcloud iam service-accounts list –filter="displayName:Velero SA" –format 'value(email)')
gcloud iam service-accounts list
ROLE_PERMISSIONS=(
compute.disks.get
compute.disks.create
compute.disks.createSnapshot
compute.snapshots.get
compute.snapshots.create
compute.snapshots.useReadOnly
compute.snapshots.delete
compute.zones.get
)
gcloud iam roles create velero.server –project $PROJECT_ID –title "Velero SA" –permissions "$(IFS=","; echo "${ROLE_PERMISSIONS[*]}")"
gcloud projects add-iam-policy-binding $PROJECT_ID –member serviceAccount:$SERVICE_ACCOUNT_EMAIL –role projects/$PROJECT_ID/roles/velero.server
gsutil iam ch serviceAccount:$SERVICE_ACCOUNT_EMAIL:objectAdmin gs://${BUCKET}
gcloud iam service-accounts keys create credentials-velero –iam-account $SERVICE_ACCOUNT_EMAIL

After the permission is configured, we now have to download the Velero. There are many architectures provided, and we can just choose it right away

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
wget -c https://github.com/vmware-tanzu/velero/releases/download/v1.9.2/<RELEASE-TARBALL-NAME&gt;.tar.gz
tar -xvf <RELEASE-TARBALL-NAME>.tar.gz
sudo cp <RELEASE-TARBALL-NAME>/velero /usr/bin/
view raw velero-install hosted with ❤ by GitHub

And install it. Don’t forget to use GCP as the plugin and define the secret file to the secret file created earlier before. This is important, so the Velero can connect to the bucket

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
velero install –provider gcp –plugins velero/velero-plugin-for-gcp:v1.5.0 –bucket velero-backup –secret-file ./credentials-velero –use-volume-snapshots=true

Okay. Now Velero is ready to use.

In this journal, for example, below is my GKE cluster. I am using Kubernetes with the version 1.22.12, and it has three workers nodes.

And there, I already deployed a wordpress application that uses PVC for storage and services with LoadBalancer type. You can follow along here.

There are many ways to do a backup. We can backup based on the namespace, on the label, and even the entire cluster, including cluster state. This depends on the use case. For example, I only want to do backup-specific namespace or deployment based on the label.

Here is the example if I only want to do a backup for wordpress namespace

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
velero backup create wp-backup –include-namespace wordpress
velero backup get
velero backup describe wp-backup

In another moment, we can do a backup automatically by scheduling it as daily like below

The resources will automatically back up into the storage defined before.

After backup is successful, how do restore it? For testing, we can delete the deployment first and try to restore it in the same cluster. Or if we have another cluster, we can restore it there too.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
BACKUP_NAME = wp-backup
velero restore create –from-backup $BACKUP_NAME
view raw velero-restore hosted with ❤ by GitHub

References:

  1. https://velero.io/docs/v1.9/
  2. https://gist.github.com/rcompos/adc4f0dd00e37df023fd78c5db7965ef
  3. https://github.com/vmware-tanzu/velero-plugin-for-gcp

Cheers!

Google Cloud: GKE Upgrade using Blue-Green Strategy

Hi all!

I hope that your day is good enough. In this journal, I would like to explain about Google Kubernetes (GKE) upgrade, specifically using Blue-Green Strategy.

By default, GKE offers an automatic upgrade feature to our existing GKE cluster. We just have to make sure auto-upgrade is enabled, with a bit configuration, and the system will do an upgrade automatically. Sounds promising, right?

That strategy has a lot of benefits. First, it is less effort and easy to use because we don’t have to manually track and update the versions. It has better security management because GKE will ensure that the security of the selected version is updated.

But how about when we want to choose the specific version of Kubernetes for our existing cluster? For example, I want to use the newer version from the current version instead of the latest. How about our strategy when the automatic upgrade is still happening, but our application is crashing/failing, and we have to downgrade the version?

From the documentation here, downgrading a cluster is not recommended, and we cannot downgrade a cluster control plane from one minor version to another. For example, if your control plane runs GKE version 1.17.17, you cannot downgrade to 1.16.15. If we attempt to do that, we will get an error. We can just downgrade 1.17.17 to 1.17.16, if that version is still available.

The same thing will happen to node pool, based on the documentation here. If we want to downgrade the worker’s node, we have to create a new node pool with the previous version, drain the workers which use the latest version, and delete it. Lots of effort and pain.

So, what is the alternative? How do we avoid the pain and ensure the upgrading process is successful?

We can do this by using the upgrade manually strategy 🙂

Similar to common Kubernetes clusters, the manual upgrading process will consume more effort and time. But, we will have more control to ensure the upgrading process is successful and reduce the risk.

Using a manual process, we can choose the specific version of the Kubernetes cluster instead of the latest. But, to be honest, it also has a limitation. We cannot upgrade the cluster to more than one minor version at a time. So, if our version cluster is 1.22 and we want to upgrade to 1.24, we have to upgrade to 1.23 first and then upgrade it to 1.24. The reference is here.

The limitation is similar to the Kubernetes provided by officials. But, one thing we have to remember is the version provided by GKE is limited. As this journal writes, the latest version of Kubernetes is 1.25. But from the version provided by GKE is still 1.24. Version 1.25 is still in rapid channel (pre-production), and we have to wait 2-3 months until it is ready to be used in production.

GKE provided two strategies when we want to use a manual upgrade, SURGE (default) and BLUE-GREEN. What is the difference between both? The surge strategy uses a rolling method to upgrade nodes simultaneously in an undefined order. This strategy is better for our applications that tolerate disruptions until 60 minutes when graceful termination happens.

So, when our applications are less tolerant of disruption, it is better to use the blue-green strategy. Other than that, blue-green strategy also offers to cancel, resume, roll back, and complete features. This is a great solution if our workloads fail and we need to be rolled back to the old node configuration.

When we recap, the steps to do blue-green strategy upgrade are:

  1. Upgrade the control-plane version to the newer version
  2. Create a new worker node pool (call it a green pool) with the same version as control plane
  3. Drain and cordon nodes in the blue node pool (node pool with the previous version)
  4. Migrates the applications to the green pool
  5. Delete the blue node pool
  6. Test and verify

All right, let’s practice!

Let’s say I have a cluster named gke-dev1 in us-central1 region, and it uses 1.22.12-gke.2300 for the version.

By default, the upgrade strategy for node pool is SURGE which means

And we need to change to blue-green strategy by using the command below:

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud container node-pools update $NODE_POOL \
–cluster $CLUSTER_NAME \
–enable-blue-green-upgrade

After that, upgrade the control plane:

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud container clusters upgrade $CLUSTER_NAME \
–region $GCP_REGION \
–cluster-version $NEW_K8S_VER \
–project $PROJECT_ID \
–master

Verify that the control plane is upgraded as below.

After that, create a green node pool that uses the same version as the control plane node

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud container node-pools create pool-gke1-23 \
–project $PROJECT_ID \
–cluster $CLUSTER_NAME \
–region $GCP_REGION \
–num-nodes $NUM_NODES \
–machine-type $MACHINE_TYPE \
–node-labels=nodepool=$NEW_GKE_VER

And then drain and cordon the blue node pool. This action ensures that new pods are not scheduled to the blue node pool.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
NODE=$(kubectl get nodes -o wide | grep v1.22.12-gke.2300 | awk '{print $1}'
kubectl -n default cordon $NODE

As we can see below, the node status is changed to SchedulingDisabled.

After this, we have to reschedule the applications into the green node pool. Make sure the applications is healthy, and then we delete the blue node pool.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
gcloud container node-pools delete default-pool \
–project $PROJECT_ID \
–cluster $CLUSTER_NAME \
–region $GCP_REGION

References:

  1. https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-upgrades
  2. https://cloud.google.com/kubernetes-engine/docs/how-to/upgrading-a-cluster
  3. https://cloud.google.com/kubernetes-engine/docs/concepts/node-pool-upgrade-strategies
  4. https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

Thank you!

Google Cloud: Deploying a Static Web Application to Google Cloud Storage Bucket with HTTPS Load Balancer

Hi all!

I hope that you are doing well, safe, and healthy!

In this journal, I would like to share how to deploy a static web application using the Google Cloud Storage bucket for hosting with HTTPS Load Balancer. So it will be safely accessible from outside.

What makes it different from static web hosted on other platforms? Using this HTTPS Load Balancer will ensure the communication and/or user requests will be secure using the HTTPS 443 Protocol.

You may see the diagram below:

The data flow is:

  • When external users access a static website from outside, the request will forward to the Load Balancer system.
  • Like a gate, the forwarding rule is the first part that needs to be passed. It contains the public IP along with the port used by the application. The forwarding rule is responsible for forwarding requests to the respective HTTP(S) proxy targets.
  • Once received by the target HTTP(S) proxy, the request will be evaluated using the URL Map to determine where to forward the request. For example, in this journal will be forwarded to the GCS backend, which contains the application. In this section also, we can add security using an SSL certificate to make it even more secure.

Let’s jump in.

Here. I am using Google Cloud SDK for configuration. First, we have to define the environment variables.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_USER=$(gcloud config get-value core/account)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

# Workload identity domain
export IDNS=${PROJECT_ID}.svc.id.goog

export GCP_REGION="asia-southeast2"
export GCP_ZONE="asia-southeast2-b"

export NETWORK_NAME="default"

And enable the appropriate APIs

# enable apis
gcloud services enable compute.googleapis.com \
    storage.googleapis.com

To verify which APIs is enabled, we can use the command below:

gcloud services list --enabled | head -25 | tail -15

Set default region and zone to avoid wrong location

# Configure default region and zone
gcloud config set compute/region $GCP_REGION
gcloud config set compute/zone $GCP_ZONE

To verify all configuration is correct, use the command below:

gcloud config list

We need to create a new bucket in GCS to store the static files. We can use gcloud or gsutil command-line tool that provided by Google Cloud to create it. For example, I create a bucket named pengedit-markdown-sept2022site

# create a storage bucket
export BUCKET_NAME="pengedit-markdown-sept2022site"
gsutil mb -b on gs://$BUCKET_NAME

gsutil ls

I will use a react app I created before for this scenario. So, I need to clone from the repository first, and run npm run build command to provide a build directory for production-ready application

# Setup the application
APP_NAME="pengedit-markdown"
git clone https://github.com/misskecupbung/pengedit-markdown
cd $APP_NAME
npm i react-scripts
npm run build
cd ../

Copy all the sources code in build directory to the bucket newly created.

# upload site files
gsutil cp -r $APP_NAME/build/* gs://$BUCKET_NAME

For making it accessible from outside, we need to configure permission too. It must be accessible by anyone with read-only access.

# set read permissions for public
gsutil iam ch allUsers:objectViewer gs://$BUCKET_NAME

# set 404 to redirect to index.html page
gsutil web set -m index.html -e index.html gs://$BUCKET_NAME

Prepare the dishes is finished.

Now, we are going to set up the HTTPS Load Balancer which will serve to handle external requests from outside. Before that, I will define the environment variable for IP Public and SSL Certificate that I will request and domain name that I will use

export ADDRESS_NAME="my-public-ip"
export CERTIFICATE_NAME="pengedit-markdown-ssl"
export DOMAIN="pengedit-markdown.dwiananda.me"

Request a dedicated Public IP with command below. This IP will be used by the web application.

# reserve external IP
gcloud compute addresses create $ADDRESS_NAME --global

After that, go to your own DNS Management and point the domain to the appropriate IP Address before. Make sure it is resolved by a command similar nslookup or dig.

Fortunately! And maybe this is also one of the huge benefits when we use HTTPS Load Balancer, we can request an SSL Certificate that we can use on the target HTTPS or target SSL proxy just by one line command.

# create a certificate
gcloud compute ssl-certificates create $CERTIFICATE_NAME \
    --description=$DOMAIN \
    --domains=$DOMAIN \
    --global

The requesting process may consume around 20-40 minutes depending on the issuer. Please wait until the status changes into ACTIVE.

We can also verify the SSL Certificate from the cloud console like below

And then, we also need to create a backend service that will distribute the requests to the healthy backends. In this case, it is a GCS bucket.

# create backend bucket for lb
export BACKEND_BUCKET_NAME="pengedit-md-backend-static-site"
gcloud compute backend-buckets create $BACKEND_BUCKET_NAME \
    --gcs-bucket-name=$BUCKET_NAME

Define a backend service created before in a URL MAP

# configure URL Map
gcloud compute url-maps create https-lb \
    --default-backend-bucket=$BACKEND_BUCKET_NAME

And create a target HTTPS Proxy which configured URL Map and SSL Certificate created before.

# Add HTTPS target proxy to LB
gcloud compute target-https-proxies create https-lb-proxy \
    --url-map=https-lb \
    --ssl-certificates=$CERTIFICATE_NAME

After the target HTTPS proxy is created, create a new forwarding rule that connected to the target.

# Configure Forwarding Rule
gcloud compute forwarding-rules create https-content-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=$ADDRESS_NAME \
    --global \
    --target-https-proxy=https-lb-proxy \
    --ports=443

Don’t forget to create a firewall rule to allow the incoming request from outside using TCP port 80 and 443.

# Add a firewall rule
gcloud compute firewall-rules create allow-http-https-traffic \
    --direction=INGRESS \
    --priority=10000 \
    --action=ALLOW \
    --rules=tcp:80,tcp:443 \
    --source-ranges=0.0.0.0/0

And that is. After all the configuration is successfully. We can verify the web application using command-line tool similar like cURL or using browser instead.

References:

Cheers!

AWS: Building a Simple Web Application Using AWS CodeBuild

Hai!

Selamat siang. Pada jurnal ini saya ingin berbagi sedikit mengenai AWS CodeBuild. AWS CodeBuild merupakan layanan yang memiliki tugas untuk meng-compile kode aplikasi, menjalankan unit test, dan membuat artifak yang siap untuk di deploy oleh layanan AWS CodeDeploy.

AWS CodeBuild menawarkan banyak sekali build environment yang sudah dikemas oleh bahasa pemrograman dan build tools populer seperti Apache Maven, Gradle, dan masih banyak lagi. Kelebihan AWS CodeBuild:

  • Fully managed. Dikelola sepenuhnya oleh AWS
  • On demand. Skalabilitasnya sangat tinggi dan sesuai permintaan
  • Out of the box

Mari kita coba.

Pertama, masuk ke AWS Management Console. Pada kolom pencarian, ketik AWS CodeBuild.

Berikut ini tampilan dashboard dari AWS CodeBuild. Klik Create Build Project untuk membuat project baru.

Isikan nama project, misal web-app dan isikan deskripsinya lalu gulir ke bawah

Untuk Source Provider, pilih AWS CodeCommit dan pilih repositori yang diinginkan. Jangan lupa atur branch nya juga ya. Disini saya atur default ke master. Lalu gulir ke bawah

Pada bagian environment, saya pilih Managed Image dengan pengaturan:

  • Operating system: Amazon Linux 2
  • Runtime: Standard
  • Image: aws/codebuild/amazonlinux2-arch64-standard:1.0
  • Image Version: use the latest image for this runtime version

Untuk bagian service role, saya pilih New Service Role dan set default pengaturan lainnya

Pilih No Artifact karena disini saya tidak ingin membuat artifak dan hanya ingin mencoba AWS CodeBuild saja dan uncheck pada Logs. Lalu klik Create Build Project

Pastikan project berhasil dibuat dan untuk menjalankan build klik Start Build

Tunggu sampai statusnya berubah menjadi Succeded

Buka tab Phase details dan bisa diverifikasi mengenai tiap fase build yang telah dijalankan

Sekian!

AWS: Creating a Private Repository using AWS CodeCommit

Hai!

Selamat siang. Pada jurnal ini saya ingin berbagi mengenai salah satu layanan AWS yaitu AWS CodeCommit. AWS CodeCommit merupakan layanan version control (mirip seperti GitHub) yang dikelola AWS untuk menyimpan repositori yang berisi kode aplikasi pribadi hingga binary yang aman dan memiliki skalabilitas yang tinggi.

AWS CodeCommit memungkinkan para developer dalam satu tim untuk saling berkolaborasi dalam membuat kode yang saling terintegrasi satu sama lain melalui pull request, branching, dan merging. Dan selain itu juga dapat melakukan tracking untuk melihat perubahan kode yang terjadi.

Mari kita coba.

Pertama, buka AWS Management Console masing-masing.

Lalu pada kolom pencarian, ketik codecommit

Setelah masuk ke dashboard CodeCommit. Klik Create repository untuk membuat repositori baru yang nantinya akan digunakan sebagai lumbung untuk menyimpan kode.

Isikan nama repositori. Misal web-app, isikan deskripsi dan klik Create

Verifikasi bahwa repositori berhasil dibuat dan salin perintah clone yang terdapat di step ketiga, yang tertera git clone https://git-xxxxx . Perintah ini yang nantinya kita gunakan untuk mendorong/push kode dari lokal laptop ke repositori

Selanjutnya, kita akan mengatur autentikasi yang dapat digunakan untuk mengakses repositori secara remote CLI. Pada kolom pencarian, ketik IAM.

Masuk ke menu Users dan pilih user yang akan digunakan untuk mengakses repositori. Misal user dwi

Masuk ke tab Security Credentials

Gulir ke bawah sampai menemukan opsi HTTPS Git Credentials for AWS CodeCommit. Klik Generate

Akan muncul kredensial yang berhasil di generate, dan bisa diunduh

Selanjutnya, akan kita coba uji adengan mendorong/push kode aplikasi ke repositori.

Pertama, clone repo dengan perintah yang telah disalin sebelumnya. Gunakan kredensial yang telah digenerate.

Note: terdapat warning karena repositorinya memang masih kosong.

Lalu coba unggah kode aplikasi dengan melakukannya seperti tangkapan layar berikut ini

Bisa diverifikasi melalui web-app repo di console, apakah kode berhasil diunggah atau belum

Sekian!

Memaksimalkan Ryzen 5 5600g untuk Video Game

Setelah menimbang-nimbang cukup lama, akhirnya saya menjual CPU dan GPU saya selagi harganya masih tidak masuk akal, yakni Ryzen 5 3400g di harga 2.5 juta rupiah (harga beli 2 juta rupiah di tahun 2020) dan GTX 1660 Ti di harga 6.6 juta rupiah (harga beli 4 juta rupiah di tahun 2020).

Terus saya pakai apa, dong? Sesuai judul, saya comot 5600g di harga 3.2 juta rupiah dan tidak menggunakan discrete GPU sampai harga GPU kembali normal. Bagaimana saya bisa yakin harganya akan normal? Berikut alasannya:

  1. Eth akan pindah ke PoS paling dekat Q2 2022, paling lama entahlah. Setelah Eth 2.0 merged ke main net, mining ethereum tidak lagi berlaku. GPU bekas akan memenuhi pasaran dan sesuai hukum supply demand, harga GPU baru akan tertekan turun.
  2. Intel masuk ke pasar discrete GPU.
  3. Rilis RTX 4000 series.

Saya memilih 5600g dibanding 5700g karena perbedaan harganya lebih dari 1 juta rupiah sementara perbedaan performanya hanya sekitar 5%. Artinya 5600g ini masuk ke best bang for the bucks.

Saya tidak terlalu puas dengan performa CPU saya sebelumnya, yakni 3400g. Sementara 5600g ini memberikan banyak kejutan. Judul seperti Dirt Rally 2.0, Battlefield V, PES 2020, Jedi Fallen Order, PUBG dan lainnya cukup lancar dimainkan. Meskipun ada beberapa permainan koleksi saya yang tidak begitu lancar seperti Horizon Zero Dawn dan BeamNG. Toleransi lancar di sini bagi saya adalah 45-50 FPS.

Mestinya yang nyaman itu 60FPS, bukan? Itu dia.

Overclock

Ada 2 hal yang bisa saya tingkatkan dari sistem yang saya miliki sekarang. Frekuensi CPU dan RAM-nya.

Untuk CPU caranya cukup mudah. Naikkan saja VSOC-nya ke 1.35v dan frekuensi CPU-nya akan naik sampai 4.3 sampai 4.4 GHz. Lebih dari itu harusnya tidak stabil.

Sementara untuk RAM lebih rumit. Ini juga pengetahuan baru buat saya. RAM yang dipasarkan untuk umum memiliki beberapa kualitas kelas chip yang disebut die.

Samsung B-Die adalah yang terbaik untuk dioverclock, overheadnya lumayan dan cukup stabil. Jadi kalau Anda ingin merakit PC baru, sebaiknya cocokkan RAM dari QVL dengan daftar yang ada di sini.

RAM saya (F4-3200C16D-16GFX) sayangnya masuk kelas C-Die. RAM ini dipasarkan dengan XMP Profile yang mencapai 3200MHz. Apakah bisa lebih kencang dari ini? Bisa.

Caranya adalah sebagai berikut (di setiap langkah ini setelan BIOS perlu disimpan lalu reboot ke sistem operasi untuk melihat apakah setelannya cukup stabil):

  1. Disable XMP Profile, frekuensinya akan turun ke 2133MHz.
  2. Naikan voltase VDIMM ke 1.1v.
  3. Naikkan multipliernya ke target, misalnya 3400MHz.
  4. Setel timing yang cukup longgar, misal mulai dari 18-22-22-22-44
  5. Perkecil angka timingnya secara perlahan, misal 18-21-21-21-40.
  6. Perkecil terus sampai ketemu batasnya (tidak stabil, crash, reboot, tidak bisa boot)
  7. Jika ketemu, kembali ke setelan terakhir. Jika dirasa cukup stabil, ulangi siklusnya dari no 3, naikkan multipliernya ke jenjang berikutnya. Lanjutkan sampai ketemu frekuensi dan timing yang stabil.

Di kasus saya, frekuensi yang stabil jatuh pada 3600Mhz dengan timing 18-18-21-21-39, GDM di-disabled dan Cmd2T disetel ke 1T. Ini sesuai dengan panduan yang saya ikuti https://www.reddit.com/r/overclocking/comments/mfcwb4/samsung_cdie_3200cl16_1st_overclock_attempt_70ns/.

Usaha ini memberikan hasil berupa tambahan performa, yaitu sekitar 5-15 FPS tergantung permainannya.

Sekarang saya bisa lanjut nyetir di Dirt Rally 2.0 dengan 60FPS di resolusi 1080p. Sungguh di luar perkiraan.

AWS: Deploy Container Workloads using Amazon Lightsail

Hai!

Selamat malam teman-teman. Pada jurnal ini saya ingin berbagi bagaimana men-deploy container(s) di AWS menggunakan Amazon Lightsail. Untuk Lightsail sendiri sudah pernah saya bahas di jurnal sebelumnya, bisa dibaca dulu AWS: Launch a WordPress Site using Amazon Lightsail. Selain itu, saya juga pernah share mengenai bagaimana men-deploy container menggunakan Amazon ECS, bisa dibaca dulu di AWS: Getting Started with Amazon ECS (Elastic Container Service) using Fargate.

Pada intinya, goal yang diinginkan sama, yaitu aplikasi di dalam container running dan bisa diakses. Hanya saja, di AWS banyak opsi yang bisa dipilih, salah satunya adalah Amazon Lightsail.

Mari kita coba.

Klik Services > Compute > Lightsail

Kita akan diarahkan ke dashboard Amazon Lightsail. Klik tab Containers > Create container service

Pada langkah pertama, bisa pilih region yang akan menjadi tempat service berada. Saya pilih Singapore dan gulir ke bawah

Pilih spesifikasi dari container, misal saya pilih Micro dengan scale x 2 (container akan direplika menjadi 2)

Klik + Set Up Deployment > Specify a custom deployment. Ubah nama container, image, configuration (jika ada), dan port aplikasi, misal 80 HTTP. Sesuaikan dengan container yang ingin dibuat

Bisa tentukan konfigurasi health check nya juga seperti di bawah ini

Tentukan nama service, misal virtualpiano dan klik Create container service.

Tunggu hingga status container menjadi Running

Akses public domain melalui tab baru, maka aplikasi bisa diakses seperti berikut ini

Sekian!

AWS: Create an Amazon FSx File System for Windows File Server

Hai!

Selamat malam teman-teman. Pada jurnal ini saya ingin berbagi mengenai bagaimana membuat file server dengan menggunakan Amazon FSx untuk Windows workload. Jurnal ini merupakan jurnal lanjutan, bisa dibaca dulu di AWS: Create AWS Managed Microsoft AD Directory dan AWS: How to Join a Windows Server Instance to AWS Managed Microsoft AD Directory .

Ibaratkan Windows workload sudah terbentuk, file server disini berperan untuk saling berbagi dan menyimpan file. Amazon FSx merupakan layanan file server yang fully-managed untuk Windows. Dengan backend fully-native Windows file system, Amazon FSx memiliki banyak fitur seperti performa dan kompatibilitas yang tinggi.

Mari kita coba.

Sebelum memulai, pastikan AD directory sudah aktif dan instance Windows Server di jurnal sebelumnya bisa diakses.

Untuk menggunakan Amazon FSx, klik Services > Storage > FSx

Kita akan diarahkan ke dashboardnya. Klik Create file system untuk membuat fs baru.

Pilih tipe file system yang akan digunakan. Klik Amazon FSx for Windows File Server lalu Next.

Tentukan nama file system, tipe lokasi (Multi-AZ atau Single-AZ), dan tipe storage (SSD atau HDD) lalu Gulir ke bawah

Tentukan VPC yang akan digunakan oleh file system dan pilih security groupnya. Pastikan rule berikut sudah di allow:

RulesPorts
UDP53, 88, 123, 389, 464
TCP53, 88, 135, 389, 445, 464, 636, 3268, 3269, 5985, 9389, 49152-65535

Untuk autentikasi saya pilih AWS Managed Microsoft Active Directory, dan pilih direktori yang sudah dibuat di jurnal sebelumnya.

Enkripsi saya pilih default dan untuk auditing, bisa ceklis log yang diperlukan.

Bisa tambahkan dns alias (memudahkan untuk map drive), dan tentukan konfigurasi backup and maintenance nya. Atur daily backup, retensi, dan kapan daily maintenance window dilakukan.

Bisa tambahkan tag, lalu Next

Bisa lakukan review untuk verifikasi apakah konfigurasi sudah benar

Jika sudah OK, klik Create file system

Tunggu hingga statusnya berubah menjadi Available.

Klik nama file system untuk melihat detail, dan untuk mengaitkan instance ke file system, bisa klik Attach

Akan muncul pop up berisi langkah-langkah bagaimana melakukan attach file system

Kita bisa gunakan perintah di atas dan paste di CMD, atau melalui GUI seperti berikut:

Saat sudah di attach, drive siap digunakan

Referensi:

  1. https://docs.aws.amazon.com/fsx/latest/WindowsGuide/getting-started-step2.html

Sekian!

Hoby Pencet Tombol Meteran

Sudah hampir 1 bulan ini sering pencet-pencet tombol Meteran PLN.
Berkaitan dengan pencet-memencet tombol meteran tersebut saya ada beberapa cerita menarik, tapi saat ini saya ceritakann 1 dulu saja.
Beberapa hari lalu ada teman yang beli token listrik, nah ketika selesai diinput tulisannya gagal, sudah dicoba berulang-ulang tetap nihil hasilnya.


Akhirnya dia komplain ke saya, ya sudah saya kompain ke PLN melalui call center 123, biar cepat karena kalau lewat aplikasi PLN Mobile prosesnya lebih lama, walau begitu ketika kita telp ke 123 salah satu jawaban si robot adalah kurang lebih seperti ini "agar pelayan lebih cepat ditangani silakan gunakan aplikasi PLN Mobile" tapi yaitu tadi kenyataannya malah sebaliknya.

 


Pernah komplain lewat aplikasi PLN Mobile dari jam 8 pagi, jam 4 sore baru ditangani.
Singkat cerita ketika saya telp 123 diminta nomor WA yang aktif. saya berikan saja.
Saya Telp 123 pukul 14.xx WIB, pukul 21.xx WIB si Halo Electrizen baru kirim WA berisi Key Change Token-1 untuk diinput ke meteran yang bermasalah.


Ya sudah saya teruskan saja kode tersebut ke pemilik meteran, dengan sedikit penjelasan cara menggunakannya.

Beberapa menit kemudian pemilik meteran balas WA saya, bahwa ketika selesai memasukkan kode baris ke-2 selalu gagal.
Akhirnya dia minta tolong ke saya untuk datang ke rumahnya, saya pun dijemput.
Sampai di rumahnya langsung saya input 4 baris kode tersebut, ternyata memang benar seperti yang dia bilang, pada baris kedua keterangannya gagal.


Jalan keluarnya saya reset meteran tersebut dengan pencet angka 0 (nol) sebanyak 2 kali, kemudian Enter.
Baru deh masukkan 4 baris kode tersebut, selanjut masukkan kode token yang dia beli. dan input token pun sukses.

Sementara ini kalau ada yang beli token listrik, saya tolak dengan alasan Saldo habis, daripada cuma untung seribu rupiah tapi ribet dan menyita waktu. Lebih baik waktu digunakan untuk keperluan lain yang lebih bermanfaat, misalnya menulis buku.
-
Mungkin PLN keliru dengan slogannya "Listrik Printar" kalau jadinya ribet begini, mungkin sloganya bisa diubah jada "Listrik Belajar"

GitLab Productivity Tracking: Know How Your Team Breathing

How do I know if my team performs well? How to tell that with data? If we’re underperformed or didn’t meet the deadline, how to find the causes and tackle them? I was thinking about analyzing the entire activities in my team to get some insights, starting from GitLab issues.

I put some filters to the issues:

  • Has been assigned to someone
  • Has mentioned in (at least one) a merge request
  • Has been closed
  • The entire time spent (from open to closed) is less than two weeks (some issues were created as reference or documentation which sometimes took a bit long to be resolved)

For each, I fetch the:

  • Notes, contains activities of the issue, including comments, assignments, etc. There is a timestamp for each assignment activity.
  • Merge requests to the particular issue. They contain the timestamp of created and merged events which are very useful to get insight from the dev side.

From 500 issues sorted by the latest updated (by the boundaries above), they narrowed down to 113 issues.

By using this data, I could aggregate it to get the duration of the activities for each issue:

  • From opened to closed, which represents the lifetime of an issue.
  • From opened to picked by/assigned to someone.
  • From assigned to the first merge request, which represents how long devs finished their jobs.
  • From merge request creation to a merged event, which represents how long peer to peer review process and revisions (if any) take time.
  • From merged to issue get closed, which represents how long the QA took over the issue and test them.

I wrote them into a single script: https://gist.github.com/herpiko/b5aa126e29f5f2ad15c4ff481bf5aee8. There is a lot more area to explore. Of course, this setup has some inaccuracy as there were so many things that happened in the team but let’s see the early insight first, shall we?

There were some bottlenecks:

  • The developers took too long to get merge requests merged into our main branches. It’s a bit tricky and has a trade-off. You can stop your coding session to help your coworker by reviewing their patches immediately then you get a costly context switch here. Or you can ignore it, let your job done first then take a look at the patches later which may impact the issue cycle a lot.
  • QAs (which at the time they were also handling the other stuff) have a hard time testing it. The single issue should take less than an hour to test but the QAs have not picked it for days until they have time or until the deadline came nearer.

In the last step, let’s gather the team and talk.

Cryptocurrency Mining

After a year of having mining-capable GPU for gaming and despite the EIP 1559 plan, I decided to join the bandwagon in the end of April. Then I added some GPUs. Still, it’s a small rig. Quite late but I still got much profit. In this October I sold the rig and left with the 1660 Ti so I could continue to play video games. Some of the reasons:

  • The daily profit is low in recent days
  • Some miners began to sell their GPUs while the GPU prices spiked again
  • There is a difficulity bomb in Ethereum that will be dropped in December (but maybe get postponed https://ambcrypto.com/ethereum-developers-propose-to-postpone-difficulty-bomb-until-may-2022/)
  • It is not something that can leave unmonitored. Sometimes issues occured. Also I still worry about the safety.
  • https://www.fi.se/en/published/presentations/2021/crypto-assets-are-a-threat-to-the-climate-transition–energy-intensive-mining-should-be-banned/
  • Want to focus to another side hustle

I learned a lot in the process. The profit exceeded my expectation. Big portion of it goes into investment portofolio and I bought myself a steering wheel as selfreward. When in doubt, flat out!

Parting with Wakijo

He served me for almost eight years. Not very well but he did his job. Since COVID, I barely touch him and I believe my family could not get much advantage by having him around. So I let it go.

Wakijo passed to my old friend, his previous owner.

Music as a Time Capsule

I’m not talking about music that takes you back to the year where it got popular. That is a shared experience among other people. What I’m talking about is the music that could bring you up a specific memory about specific place or event, about yourself, in one strong dose. I don’t know if it works for others but here is how it works for me.

Over and over again, almost infinite

It’s started with an album by Enno Lerian when I was still a kindergarten kid. I’ve to asked my dad to hook the cassette into stereo player every single time I want to dance with dudidam. I only want to hear dudidam and dismiss the rest of the album. Backward and forward buttons were my best fellow since there is no repeat feature back then.

Then I grew up with impaired hearing disability and understanding music is hard for me. I don’t mind about lyric or genre. As long as the beat blasts my brain and the melodies make my body wiggled, I’ll just listen. I frequently found myself loving a certain song by how it sounds but completely disagree against the raison d’etre of its lyric.

So I just played the song I liked over and over again until I found another easy listening song. I can stays with single track for long hours, days or weeks. The trade off is clear: I’ve bad knowledge (and sometime bad taste, some people said) about music and its diversity.

I don’t know the long term effect of this habit until I move to another city for the first time.

Just how strong the dose is?

The memories is as strong as its inaccuracy. No instrument that could bring sharp memories as text or imaging or talking with your old friend, but music do this differently on me. A particular song could help me to imagine the place in strong vibe. It maybe inaccurate but it’s strong.

My wife hate the way I play songs so I never play it using loud speaker.

This is the way.

Teman Lama

Suatu pagi di hari minggu saya “reuni” dengan teman-teman SMA yang satu ekstrakulikuler (Paskibra). Dari 14 orang cuma 11 yang berhasil dikumpulkan di grup WA. Yang hadir di zoom 10 orang. 8 sudah menikah, 6 sudah punya anak, 1 bahkan tinggal di Montreal nikah sama bule di sana. 2 dari 3 orang yang ga berhasil dikontak hidupnya kurang beruntung/bermasalah, sementara yang 1 tidak diketahui kabarnya.

Semua ini berangkat dari 1 orang yang rindu di Kanada sana, mengemukakan idenya di grup WA. Hal ini mengingatkan akan diri saya beberapa tahun yang lalu yang merasa kesepian setelah lama merantau di ibu kota.

Sistem peringatan dini (EWS)

“Entah kenapa ketika tiba-tiba passion gue muncul terhadap satu hal, biasanya akan ada pekerjaan dalam waktu dekat” begitu kata gue ke Aris suatu malam di kantor Cilandak waktu gue ngoprek SMS gateway dan dia membuktikannya dua Minggu kemudian kami kedatangan tamu dari Belanda

Selepas dari kampus sekitar tahun 2010an, saat itu lagi rame-rame nya kejadian gempa di Indonesia, saat itu pengguna internet ga seramai sekarang dan blackberry masih menguasai pangsa gadget high-end. gue sempet bantuin disebuah NGO kebencanaan buat membangun sistem peringatan dini bencana alam terutama gempa bumi. datanya dari BMKG buat dibroadcast ke stasiun tv, portal, dan SMS warga di sekitar area terdampak. Teknologinya sederhana memang tapi lumayan gue jadi punya kesempatan jadi pembicara di banyak tempat gara-gara itu.

Sekitar tahun yang sama sebagian teknologi tersebut mulai diadopsi oleh beberapa lembaga dari pemantauan kota di Jakarta, pemantauan kekerasan di Papua dan Thailand selatan, pemantauan lingkungan, kekerasan thd TKI, hingga pemantauan pemilu di malaysia. Beberapa tahun kemudian. sekitar 2013 tiba-tiba dikontak mahasiswa MIT diajak mengembangkan salah satu teknologi tersebut untuk pemantauan banjir di Jakarta. Sayangnya itu hanya menjadi sebatas paper. Mungkin karena terlampau canggih kala itu.

Beberapa waktu kemudian saat rame kebakaran hutan, gw terlibat dalam pengembangan sistem peringatan dini kebakaran hutan, metodenya jauh berbeda dari yang sebelumnya lumayan ribet, tapi beberapa tahun kemudian berguna buat pekerjaan gue di lokadata. Nah sekarang gw lagi pengen iseng bikin EWS buat SpO2 karena mungkin ketersediaan tempat tidur RS akan semakin berkurang dan akan lebih banyak yg isoman, kalo ada sebuah EWS yg bisa broadcast ke nakes/RT/RW keknya bisa mengurangi beban RS. ternyata alat dan bahannya cukup murah.

Gue bilang juga apa!!

Penggalan frasa semacam itu dan sejenisnya udah gue tinggalkan sejak mungkin 5 tahunan lebih, frasa yang ga ada gunanya selain bentuk keinginan pengakuan atas keberhasilan yang entah apa yang sebenernya juga ga jelas.

Bener ga jelas, karena gw jamin 80% yang bilang kaya gitu ga siap perencanaan jika ide mereka yang dipake, kalo ditanya bagaimana rencananya biasanya akan jawab “lah gue kan udah usul, masa gue juga yang harus bikin rencana?” Terlihat flawless sekali bukan?

Belakangan sejak pemerintah terlihat kehilangan kontrol terhadap pengendalian pandemi, frasa semacam itu banyak yang lewat di timeline sosial media gue. Jadi inget omongan si Bahlul suatu hari waktu kami duduk disebuah rapat, dan lagi ngomongin yang mimpin rapat .

G: “Omongannya tinggi banget ya ga takut kesamber pesawat tuh?”
B: “Orang Indonesia itu dilahirkan dengan rahang yang kuat”
G: “maksudnya gimana?”
B: ” hobinya komentar doang ga ada eksyen”
G: “itu soalnya pas absen pembagian otak bangunnya kesiangan, dapetnya dikit deh”

Sinyal dan indikator

Bagaimana untuk mengetahui seekor sapi sedang lapar atau sudah kenyang?

Setahun trading gue belajar untuk menunggu sinyal, kemudian menunggu konfirmasi kemudian baru di eksekusi. Setelah eksekusi pun kita perlu pasang pengaman sampai semua berjalan sesuai arah sinyal. Pengaman dipasang di awal biar gue ga mikir lagi buat mengakhiri kalo ternyata setelah konfirmasi gerakan ga berjalan sesuai dengan rencana.

Mendefinisikan keberanian adalah ketika kita mengeksekusi setelah melihat konfirmasi dan memasang pengaman, spekulasi adalah ketika kita baru hanya melihat sinyal kemudian kita langsung mengeksekusi, gegabah adalah ketika ga ada sinyal kita maksa buat masuk.

Secara umum trading mencerminkan kehidupan secara keseluruhan. Manusia tidak didesain untuk mengatasi semua masalah, banyak hal yang diluar kuasa setiap individu. Dari alam sampai perasaan individu yang lain. Kita hanya perlu alat ukur atau indikator yaitu sebuah alat yg bisa kita gunakan untuk mengukur sebuah kejadian.

Output dari beberapa indikator yang saling berkorelasi bisa membentuk sebuah sinyal, sinyal – sinyal tersebut tentunya akan banyak sekali dan karena alat ukur ini adalah alat ukur statistik maka tidak selalu sinyal ini benar, oleh karena itu sinyal perlu diperkuat oleh sebuah konfirmasi. Setelah adanya konfirmasi gerakan sesuai dengan yg sinyal berikan baru rencana dapat dijalankan.

Jadi menurut gue kalo mau belajar apapun pelajari sifat dan indikator baru pelajari sinyal dan konfirmasi.

Obituary

Lebih dari 10 tahun hidup di perantauan gue bersyukur banyak ketemu orang baik, seorang kawan pernah bilang “orang baik biasanya bakal ketemu orang baik, cuma ya biasanya yg ga baik lebih banyak.”

Well, Veri Junaedi adalah salah satunya, sebelum mengenal baik kami sempat bertemu beberapa kali saat persiapan pemilu 2014 sama-sama di KPU tapi beda bidang beliau di peraturan perundangan gw di teknologi mungkin circa 2012, di tahun yang sama di kepentingan yang lain kami dipertemukan di sebuah program yaitu Matamassa program inisiatif masyarakat untuk pemantauan pemilu. Tak lama kemudian kami berada satu gedung dalam usaha rintisan kami masing-masing.

Veri Junaedi, adalah sosok yang istimewa berbeda dengan image orang yg bekerja dibidang hukum kebanyakan yg gw kenal. Entah apa yang dia lihat sama gue sehingga mau berteman sama gue. Mungkin karena kesamaan kami spontan, ketika punya ide kemudian langsung dieksekusi.

Dia orang yg tiba-tiba ga ada angin ga ada hujan tiba-tiba ngajak makan bareng, yang mungkin setiap Ramadhan ngajak buka bareng, setiap kesempatan makan-makan gw selalu diundang. hmm mungkin ini juga salah satu kesamaan kami, kami suka makan enak.

Beberapa kali kami nyoba buat bikin usaha rintisan bareng juga tapi ga jalan, kami terlalu sibuk dengan urusan masing-masing, meski gagal pertemanan kami baik-baik saja. ya gue menemukan definisi pertemanan tak sebatas materi dari orang-orang baik sekitar gue.

Perbedaan usia kami ga terlalu jauh, Gue udah nganggep dia seperti kakak gue sendiri. Sekali gue pernah ngenalin perempuan spesial gue ke dia, gue ajak ke pembukaan rumah makannya. buat gue ini adalah big move karena gue bukan tipe orang yg selalu ngenalin cewek gue ke orang-orang terdekat, unless she has taken half of my soul. Sayangnya gw ga berjodoh sama dia.

Sekitar 3 Minggu yang lalu seperti biasa dia kontak ngajakin ngopi di proyek rumah barunya di Cibinong, dia bercerita setiap weekend dia nginep disana. Rumahnya gede iya memang dia sekalian menyiapkan untuk kantor istrinya yang notaris. Ajaibnya dia juga tetep bikin area buat kumpul2 seperti yg biasa kami dan kawan-kawan sering lakukan.

“Ini nanti kita bisa kumpul-kumpul disini mas, terus yang bawah itu bisa buat barbeque, sebelah sana nanti saya bikin kolam renang, terus nanti pintu ke rumah udah saya bedakan biar yg ngumpul ga ganggu orang rumah, dan kalo kemaleman males balik udah saya siapkan kamar khusus tamu” kata Beliau sambil tertawa-tawa

Kemudian kami makan, dan gue dikenalkan seluruh keluarga besarnya dari neneknya yang biasa dia panggil emak sampai ibunya. saat itu neneknya bercerita tentang masa kecil mas Veri yang sudah ditinggal bapaknya dari usia 4 bulan dalam kandungan, kemudian ibunya yang banting tulang sebagai single parents membesarkan dia, juga paman dan sodara-sodaranya yang lain yang bahu membahu membesarkan dia. “Saya juga ga nyangka dia akan jadi anak yang pinter begini” ujar emak

Saat itu gue jadi tau darimana kebaikan dia berasal. Dia dibesarkan oleh orang-orang yang baik dan tidak pernah putus asa. dalam hati gue bertanya apa harus jadi orang sesusah ini buat jadi orang berhasil? Gue melihat mas Veri ini orang yg berhasil. Dia berhasil menjalin pertemanan dengan banyak orang dari berbagai kalangan, dia berhasil membangun kantornya yang nyaris ga sepi dari pelanggan, dan menularkan kebaikannya pada ketiga putrinya yang masih kecil.

Sekitar dua Minggu lalu dia memasang status di WA bahwa dia terkena Covid 19, gw kirim pesan ke dia semoga lekas pulih. Namun tak pernah terbalas hingga siang tadi gue dapat kabar dari Fadli teman kami bahwa Mas Veri sudah Wafat siang tadi pukul 14.10 di RS. Pelni.

Anak dan Video Gim

Saya dan saudara-saudara saya tumbuh di keluarga pengusaha yang ketat tentang apa yang boleh dan tidak boleh dilakukan oleh anak mereka. Bapak saya membolehkan apa pun selama hal itu terkait dengan sekolah. Pilihan atau keputusan-keputusan orang tua saya itu adalah hak mereka. Saya patut mematuhi mereka sampai saya diizinkan untuk mengambil keputusan penting sendirian. Namun saya menyayangkan satu hal yaitu betapa tidak sukanya orang tua saya terhadap video gim, apa pun bentuknya. Orang tua saya pastinya memiliki alasan tersendiri.

Saya dan kakak saya tidak pernah meminta konsol video gim kepada orang tua kami secara terang-terangan. Tapi kami masih bisa bermain di rumah teman/tetangga kami atau di rental video gim, kan? Tidak juga, orang tua kami juga tidak mengizinkan itu. Kami selalu melakukannya secara sembunyi-sembunyi. Jangan remehkan rasa penasaran anak-anak yang sangat tinggi. Hal-hal yang berbau teknologi dan elektronik sangat menarik minat kami. Puncaknya, bapak saya marah besar saat mengetahuinya dan langsung menjemput kami di tempat kami bermain.

Dampak

Sejak kejadian itu saya tidak pernah benar-benar bisa menikmati bermain video gim.

Saya berusia 12 tahun saat bapak saya meralat sikapnya dan memberi saya kebebasan yang lebih longgar. Saya pindah ke lingkungan baru di mana saya bertemu anak-anak baru yang lebih mapan. Kebanyakan dari mereka memiliki konsol video gim di rumahnya. Meskipun bapak saya tidak pernah lagi melarang saya akan tetapi saya tidak pernah bisa menikmati video gim seperti dulu. Semacam ada perasaan tidak enak menghantui dan hal itu sangat mengganggu.

Jika sedang bermain video gim dengan teman-teman, saya lebih sering dijadikan bulan-bulanan karena saya sangat payah. Saat teman-teman berdebat tentang aturan-aturan dalam permainan tertentu, saya sudah malas mencernanya. Saya menjadi anak yang memiliki sifat kurang kompetitif, gampang menyerah, selalu mencari cara aman atau malas mengambil resiko dan tidak cukup kreatif dalam urusan strategi. Saya tidak lagi menyukai permainan yang melibatkan lebih dari 1 orang seperti sepak bola. Saya menyukai basket tapi saya tidak pernah suka bermain dalam tim.

Setelah tumbuh dewasa dan bisa menghasilkan uang sendiri, saya pernah mencoba menyewa konsol gim, dibawa pulang selama beberapa hari untuk melihat apakah saya dapat menumbuhkan kembali hasrat yang dulu. Hal itu ternyata sia-sia.

Akibat yang paling memalukan barangkali pendapat sok tahu saya yang menyatakan bahwa video gim bukanlah bentuk seni. Saya salah. Saya hanya kurang dapat mengapresiasi jenis karya yang satu ini karena bias dan trauma.

Kembali

Saya pertama kali bertemu istri saya pada suatu sore di tahun 2017, kenal lebih dekat 1 tahun kemudian dan akhir 2019 kami menikah. Buat saya hal yang paling mengejutkan dari dirinya adalah ia seorang gamer. Ia tumbuh besar di keluarga yang mampu membeli konsol video gim dan masih bermain gim sampai sekarang. Saat ia mempersiapkan pindahan untuk tinggal bersama saya, ia membawa serta konsol Xbox 360 dan sebuah Nintendo 3DS yang sistemnya terkunci dalam bahasa/aksara Jepang. Hati saya bergejolak. Saya tidak dapat menahan diri dan mencoba menjelajahi konsol genggam tersebut. Saya kembali menjelma seperti anak kecil yang penasaran akan dunia luas yang pintunya tidak lebih lebar dari 800 piksel. Dan yang paling penting, orang terdekat saya sekarang memahami dengan baik perasaan meluap yang saya alami itu.

Keputusan untuk memiliki anak juga mendorong saya untuk bereksperimen ulang dengan video gim. Kami kemudian memutuskan untuk merakit PC gaming. Dengan dukungan istri, saya perlahan dapat menumbuhkan kembali minat yang hampir 2 dekade telah pudar. Setelah setahun berlalu dan menamatkan judul-judul epik seperti What Remains of Edith Finch, Inside, Shadow of Mordor dan lainnya, saya dapat mengapresiasi video gim sebagai karya seni. Saya juga menyempatkan diri untuk mempelajari kultur dan perkembangan video gim yang selama ini saya ketinggalan banyak.

Sekarang video gim menjadi salah satu pilihan saya dalam mengisi waktu luang di akhir pekan. Tidak jarang saya bermain bersama keluarga. Video gim juga telah membantu saya melewati tekanan pada masa-masa karantina atau isolasi mandiri karena infeksi COVID-19. Video gim melatih saya untuk bergerak lebih kreatif, tidak mudah menyerah, mengembangkan kelincahan dalam berpikir dan memberi saya kumpulan emosi positif yang tidak saya dapatkan di media lain.

Menjadi Orang Tua

Keresahan orang tua zaman saya masih kecil mungkin berbeda dengan orang tua zaman sekarang. Video gim masih menghantui sebagai salah satunya. Sekarang di media massa mudah didapati berita-berita tentang seorang anak yang menghabiskan jutaan rupiah hanya untuk membeli voucher gim. Di lingkungan tempat tinggal saya sendiri dapat ditemukan anak-anak yang nongkrong dengan telepon genggam masing-masing dan menghabiskan waktu sepanjang hari tanpa pengawasan. Video gim pada anak-anak masih erat diselimuti isu adiksi dan minim pengawasan.

Keresahan macam apa yang akan saya hadapi di zaman anak-anak saya nanti? Saya tidak tahu apa yang akan terjadi nanti namun saya harus siap beradaptasi apa pun itu. Inti dari tantangan ini barangkali bagaimana kita dapat melindungi anak-anak kita dari keresahan-keresahan itu tanpa membuat mereka tertinggal dari perkembangan zaman ataupun menghambat aspek-aspek tumbuh kembang mereka.

Saya dan istri saya sepakat tidak akan melarang anak kami bermain video gim. Saya akan membelikannya konsol video gim jika dia memintanya, barangkali sebagai bentuk apresiasi atas prestasi. Saya akan mengawasi dan menemaninya. Saya akan mengizinkannya mengalahkan saya dalam permainan, saya tidak keberatan. Saya akan membatasi screen time sesuai rujukan ilmiah terkini. Saya percaya video gim dapat memberi dampak yang baik dalam perkembangan anak bila kesempatan itu diberikan dengan batas wajar dan diawasi. Anak saya berhak menikmati karya seni ini jika dia mau.

Anak saya usianya belum satu tahun dan saya sudah membual tentang apa yang akan saya lakukan dengannya. Saya tahu ini tidak mudah. Tulisan ini akan saya kunjungi ulang sewaktu-waktu untuk membantu saya mengevaluasi apa yang telah saya lakukan di masa mendatang.

Menghapus Gambar Latar Belakang di LibreOffice Calc

Kemarin sore di group Telegram LibreOffice Indonesia ada salah seorang anggota yang mengalami masalah ketika menggunakan LibreOffice.

Kemudian yang dia bertanya bagaimana cara mengatasinya, adapun permasalahannya adalah; dia menyisipkan tandatangan berupa gambar format JPG pada dokumen, kemudian dia mengaturnya ke Latar Belakang dengan cara Arrange to Background. Nah, setelah itu dia kesulitan untuk menghapusnya.

 Sampai esok harinya belum juga ada yang bisa memberi jawaban memuaskan atas pertanyaan tersebut.

Kemudian penulis menanyakan permasalahan tersebut terjadi pada LibreOffice Writer, Calc, atau Impress?


Namun penanya tidak juga memnjawab pertanyaan penulis. Akhir penulis perhatikan dengan cara yang seksama dan sesingkat-singkatnya pada tangkapan layar yang dilampirkan, dan dapat disimpulkan bahwa permasalahan tersebut terjadi pada LibreOffice Calc.

 Cara mengatasi masalah

Karena penulis juga penasaran dengan permasalahan tersebut, maka penulis berusaha mencari jalan keluaranya.

Pertama penulis mencari berkas lama yang berisi data yang agap mirip dengan milik penanya, akhirnya ditemukanlah berkas daftar belajar komputer murid-murid PKBM Kertajaya.

Langkah selanjutnya adalah; penulis menyisipkan tandatangan ke salah satu sel di berkas LibreOffice Calc tersebut (biasanya kalau saya menyisipkan tanda tangan berarti bayaran).

 
Selanjutnya penulis mengatur tandatangan tersebut ke belakang dengan cara klik kanan tanda tangan => Arrange => To Background.

Dan memang benar, setelah gambar diatur ke latar belakang tidak bisa dikelola lagi atau jadi beku, mau dihapus, digeser, diperbesar tidak bisa.

Penulis pun mencobanya dengan disertai menekan tombol pintas, yaitu dengan menekan tombol Ctrl, Shift, Alt sambil klik pada gambar tandatanga, namun tetap tidak bisa. Bahkan penulis sempat masuk ke sel dengan menekan tombol F2 hasilnya tetap nihil.

Akhirnya penulis menggunakan metode seleksi seperti pada aplikasi grafis (Inkscape, Gimp, Scribus), dan ternyata berhasil.

Berikut caranya:

Tampilkan Alat Menggambar pada LibreOffice Calc dengan cara klik View => Toolbar => Drawing.

Setelah Alat Menggambar sudah berhasil ditampilkan, cari dan klik ikon Select (biasanya berada di pojok paling kiri)

Sekarang arahkan kursor ke gambar tanda tangan, kemudian klik tanda tangan tersebut, bisa bukan?.

Dengan cara ini kita tetap bisa mengolah gambar atau tandatangan pada LibreOffice Calc yang telah diatur ke Latar Belakan (Arrang To Background), Mudah bukan?

Di bawah ini adalah video sesuai artikel ini


Demikian Tutorial singkat yang dapat penulis bagikan hari ini, sampai jumpa pada tutorial lainnya, semoga penulis tidak malas menulis di blog ini.


 

Upgrade PC Tanpa Menggoncang Tabungan

Suatu ketika saya ingin meng-upgrade PC saya tapi kok rasanya berat hati untuk menyentuh tabungan. Rasanya kok keinginan tersebut tidak pada prioritas yang betul kalau sampai tabungan terkorek. Apa lagi sebentar lagi saya akan punya anak, tentu tidak betul kalau sampai pundi-pundi yang sudah diatur sedemikian rupa jadi terganggu. Terus bagaimana dong?

Decluttering

Ada orang-orang yang dengan mudah menyingkirkan barang yang tidak mereka perlukan, ada pula orang yang perlu arahan/motivasi lebih untuk melakukan itu. Saya adalah jenis orang yang kedua.

Ada dua buah buku yang saya baca secara berurutan pada tahun 2018, yaitu The Life-Changing Magic of Tidying Up oleh Marie Kondo dan Goodbye, Things oleh Fumio Sasaki.

Ide soal spark of joy dari Marie Kondo tidak begitu masuk ke kepala saya. Banyak benda yang tidak memenuhi kriteria tersebut tapi kalau disingkirkan dari hidup saya maka saya akan menjadi kesusahan secara tidak perlu. Nasihat-nasihat dari Fumio Sasaki lebih mengena di hati dan kepala.

Saat menulis buku tersebut, Fumio Sasaki adalah pria lajang tanpa tanggung jawab yang banyak, bahkan tanpa pacar. Jadi nasihat-nasihatnya sangat ekstrim. Saya juga sudah pernah beberapa kali melakukan decluttering, baik dengan giveaway mau pun dengan penjualan namun saya belum pernah mencobanya dengan cara yang ekstrim. Sekarang saya dapat melakukannya.

Keputusan memiliki anak ada trade-off-nya: ada banyak hal yang tidak dapat saya lakukan lagi dikarenakan waktu dan tenaga yang terbagi untuk keluarga. Setelah saya pikir-pikir, ternyata saya:

  • Tidak bisa naik gunung sampai 5-10 tahun ke depan.
  • Mengganti olahraga saya dengan yang lebih sederhana seperti jogging. Ditambah kondisi pandemi, saya tidak lagi bersepeda jauh-jauh untuk berolahraga.
  • Sulit/tidak dapat meluangkan waktu untuk beberapa mainin/koleksi.

Artinya benda-benda yang terkait dengan kegiatan di atas tidak lagi berguna untuk saya. Jadi saya memutuskan untuk menjual barang-barang saya tersebut: alat-alat dan perlengkapan mendaki gunung, sepeda, mechanical keyboard, beberapa barang elektronik, barang-barang yang duplikat (misal saya punya tetikus 2 buah), barang-barang yang dibeli sebagai cadangan, barang-barang pemberian, dan sebagainya. Pokoknya banyak banget! Banyak dari benda-benda itu adalah barang kesayangan, koleksi, dan memiliki kenangan namun manfaatnya untuk saya tidak ada. Manfaatnya untuk keluarga saya lebih nihil lagi. Apa yang lebih nihil dari nihil?

Saya tidak dapat menjelaskannya sebaik Fumio Sasaki. Jika kamu termasuk orang yang perlu motivasi tambahan untuk menyingkirkan barang-barang tidak terpakai, Goodbye Things boleh dicoba.

Strategi penjualan

Saya menjual semuanya dengan harga jual 3/4 harga beli. Bahkan ada yang setengah harga beli jika saya pikir barang tersebut sulit ditemukan pembelinya. Jika yang membelinya adalah orang yang saya kenal baik, maka saya memberinya kepercayaan untuk cicilan yang bebas diaturnya sendiri. Ada yang mengambil cicilan 1 tahun, ada pula yang mengambil cicilan 1.5 tahun. Dengan adanya cicilan ini, saya mesti menyediakan semacam dana buffer yang nantinya harus diganti oleh piutang cicilan ini. Dana ini dapat saya gunakan dengan segera untuk upgrade.

Kurang dalam 2 minggu penjualan, ditambah hasil penjualan spare part PC yang mau diupgrade, saya berhasil mengumpulkan dana sekitar 18 juta rupiah. Saya juga kaget dengan kalkulasi ini. Tapi saya hanya menggunakan sekitar 7-8 juta rupiah untuk upgrade PC. Selebihnya bisa masuk tabungan. Asyik kan?

Spesifikasi unit PC sekarang

Jika ditambahkan dengan nilai dari sebelum di-upgrade, totalnya Rp 16.301.000. Lumayan juga, tapi saya cukup senang dengan hasil ini.

Dari rig lama, pembelian 2020:

  • AMD Ryzen 5 3400G, Rp. 2.080.000
  • Zotac NVidia 1660 Ti AMP, Rp. 4.000.000
  • Nvme M2 SSD Intel 660P 512GB, Rp 1.507.000

Upgrade 2021:

  • Gigabyte B450 I Aorus Pro Wifi, Rp 2.158.000
  • RAM G.SKILL F4-3200C16D-16GFX FlareX 16GB (2x8GB) DDR4 3200Mhz, Rp. 1.363.000
  • Corsair - SF750 80 Plus Platinum 750 Watt SFX P, Rp. 2.668.000
  • CPU cooler Noctua NH-L9a AM4, Rp. 698.000
  • Geeek A50 Plus White ITX Case, Rp. 1.510.000
  • ID-COOLING NO-9215 92mm Slim Cooling Fan PWM, Rp. 231.000
  • Mini ITX Wifi & Bluetooth Antenna RP-SMA Female, Rp. 65.000
  • Audio Splitter Combiner, Rp. 21.000

Penampakan

Buku Belajar Komputer Tingkat Dasar 5 Tema 1

Puji syukur tim penulis panjatkan kepada Tuhan Yang Maha Esa yang telah memberikan rahmat dan karunia-Nya, setelah molor beberapa waktu akhirnya buku Belajar Komputer Tingkat Dasar 5 Tema 1 yang kami tulis hari ini bisa rilis.


Buku ini adalah lanjutan dari buku Belajar Komputer Tingkat Dasar 4 yang sudah terbit sebelumnya. Seperti pada buku sebelumnya, materi dalam buku ini juga masih mengusung tema belajar dan bermain secara menyenangkan.
Adapun beberapa materi dalam buku ini adalah:
  • Materi pada bab 1 berisi pelajaran geografi yaitu mengenal negara-negara di berbagai dunia, sehingga anak-anak dapat mengetahui nama benua dan negara di dunia. Di dalam bab ini juga berisi permainan tentang wilayah dalam berbagai negara di dunia.
  • Bab 2 berisi pelajaran huruf braille, yaitu huruf yang biasa digunakan oleh orang-orang tidak bisa melihat. Dengan menggunakan huruf braille, orang yang tidak bisa melihat bisa membaca. Di dalam bab ini juga dijelaskan sejarah singkat terciptanya huruf braille.
  • Bab 3 berisi pelajaran cara bermain catur untuk anak-anak. Di dalam bab ini dijelaskan pengetahuan dasar mengenai catur, notasi pada permainan catur, gerakan berbagai buah catur. Materi pelajar pada bab ini dapat dilakukan lewat permainan di komputer ataupun menggunakan perangkat catur asli yang tersedia.
 Untuk mengunduh buku digital Belajar Komputer Tingkat Dasar 5 Tema 1 silakan pilih salah satu tautan berikut:

Pembaca boleh menyebarkan buku versi digital ini ke masyarakat yang membutuhkan baik secara online ataupun offline, juga dipersilakan untuk membuat mirror di berbagai web atau server yang pembaca miliki.


-

Migrasikan Konten Django Lama ke Jekyll

Para pengembang BlankOn Linux saat ini telah menggunakan Jekyll untuk beberapa situsnya, salah satunya adalah laman http://blankon.id. Penulisan konten berbasis Markdown dan situs statis merupakan pilihan yang diambil setelah beberapa tahun sebelumnya para pendahulu menggunakan Django untuk sebagian besar website mereka. Konsekuensinya konten-konten website lama yang berbasis Django tersebut perlu...

Permainan Baru di GCompris bagian 1 (Keyboard Bayi)

Awal bulan Oktober 2020 lalu penulis membaca pengumuman di Millis GCompris bahwa tim pengembang akan merilis GCompris V 1.0 pada tanggal 17 November 2020. Dengan adanya rencana rilis tersebut maka Server GCompris akan dibekukan pada tanggal 15 s/d 17 November 2020.

Dengan adanya pengumuman tersebut maka Tim Penerjemah GCompris Indonesia bergerak secara cepat melakukan diskusi melalui Telegram.

Nah di sini ternyata saya salah baca atau memahami tanggal dan bulan.


Yang seharus tanggal tanggal 15 November saya bacanya 15 September.

Pada rilis GCompris V 1,0 ini terdapat perubahan dan perbaikan pada beberapa permaianan, contohnya adalah permianan Jelajahi Peternakan Hewan, Permianan Catur, Menghitung Benda, Pengelompokan. dan lain-lain.

 

Selain itu terdapat juga beberapa permaian baru pada GCompris V1.0, yaitu: Keyboar Bayi, Listrik Analog, Labirin Pemrograman, Belajar Digit, Belajar Pengurangan,dan Belajar Penambahan.


Pada post kali ini penulis membahas permianan bernama Keyboard bayi, sedangkan permainan baru lainnya akan penulis bahas pada post berikutnya


Terjemahan pada judul permainan ini masih keliru, yang lebih tepat adalah Keyboard anak.
Tapi bisa dimaklumi karena tim penerjemah melakukan penerjemahan secara langsung dari judul aslinya yaitu Baby keyboard.



Permainan ini bertujuan sebagai sarana belajar memahami berbagai tombol pada keyboard sekaligus pengenalan huruf dan angka untuk anak-anak pada usia dini.

Cara memainkannya adalah Tekan tombol apa pun pada keyboard sesuai keinginan.
Maka Huruf, angka, atau karakter muncul di layar sesuai tombol yang ditekan tersebut.

Jika yang ditekan tombol berupa huruf dan angka maka keluar suara  sesuai tombol yang ditekan.
Jika yang ditekan tombol selain huruf dan angka maka suaranya hanya bleep.


Rencananya permainan ini akan penulis masukkan pada Buku Belajar Komputer Dasar tingkat 0 Tema 3 yang sedang penulis kerjakan, atau bisa jadi dimasukkan ke tema 1 atau 2 edisi revisi.

Untuk yang tertarik dengan buku yang penulis rilis dapat mengunjungi tautan berikut => Unduh Buku Digital Gratis



Cara Menginstall Python 3.6 di Debian 9 (stretch)

Debian 9 (stretch) secara default membawa python2.7 (default) dan python3.5. Saya sedang melakukan instalasi aplikasi yang ternyata membutuhkan Python versi 3.6. Pada beberapa tutorial di internet, menyarankan untuk menggunakan repo debian testing. Namun saat tulisan ini dibuat, saya cek repo debian testing memiliki python versi 3.8, sedangkan versi tersebut ketinggian....

Mengunci Versi aplikasi di CentOS

Setelah catatan sebelumnya kita berhasil downgrade versi aplikasi di CentOS, ternyata saat kita lakukan yum update, aplikasi kembali dinaikkan versinya ke versi yang lebih baru. Tentunya hal ini menjengkelkan karena aplikasi project kita akan kembali error alias tidak jalan. Namun jangan khawatir, pada postingan ini kita akan membahas bagaimana cara...

Cara Downgrade Aplikasi di CentOS

Sebuah aplikasi yang ditulis oleh temen-temen developer terkadang hanya kompatibel dengan versi runtime tertentu pada bahasa pemrogramannya. Hal ini akan menuntut administrator agar dapat menyesuaikan dengan kebutuhan tersebut. Nah, catatan ini disimulasikan dijalankan di sebuah VM dengan sistem operasi CentOS 8. Catatan ini juga berdasarkan pengalaman penulis saat menangani sebuah...

Multi Machine Vagrant dengan Vagrantfile Tunggal

Vagrant merupakan sebuah tools yang saya gunakan untuk provisioning Virtual Machine, khususnya untuk environment lokal di laptop. Vagrant juga dapat digunakan untuk provisioning VM dengan beberapa provider, antara lain VirtualBox, VMware, Docker, Hyper-V, maupun custom. Saya sendiri menggunakan provider Libvirt :D Oke, salah satu alasan kenapa tulisan ini saya buat...

Cara Install Autoscaling GitLab Runner yang Hemat Biaya

Ngomong-ngomong soal GitLab tidak lepas soal CI/CD (Continuous Integration/Continuous Delivery/Deployment). Nah, kebetulan Di tempat saya bekerja menggunakan gitlab-runner. GitLab Runner merupakan salah satu fitur yang sangat bermanfaat untuk menjalankan CI/CD. Saya tidak akan menjelaskan apa itu CI/CD di sini (mungkin akan saya jelaskan di postingan yang lain). Hanya akan saya...

Menjalankan Vagrant Provider Libvirt di openSUSE Leap 15.2

Melihat pak Andi Sugandi menggunakan vagrant untuk menyediakan lab VM saat beliau mengajar, saya pun jadi penasaran. Karena provisioning VM menggunakan vagrant ini sepertinya mengasyikkan, terutama karena….. Nanti deh saya ceritain apa, dan mengapa ini penting saya utarakan. Apa itu Vagrant? Tampilan Website Vagrant Vagrant merupakan sebuah perangkat lunak yang...

Cara Install gcloud CLI di openSUSE Leap 15.2

Postingan kali ini akan sangat singkat, karena merupakan catatan yang dibuat untuk sekedar mendokumentasikan apa yang saya ketikkan saat memasang gcloud CLI di laptop saya. Sistem Operasi yang digunakan di laptop saya seperti yant tertulis di judul tulisan ini, yaitu openSUSE Leap 15.2. Sebelumnya, mungkin perlu juga saya tulisan apa...

openSUSE Leap 15.2 di Google Cloud Platform (GCP)

Sebagai pengguna openSUSE, saya kadang merasa penasaran apakah bisa saya menggunakan os ini di langit sebagai server. Yang saya maksud di langit di sini adalah Google Cloud Platform (GCP), karena saya juga pengguna produk google tersebut di beberapa proyek milik klien. Namun melihat daftar templat citra (image template) di Google...

Pi Zero sebagai Tukang Periksa (Bot)

Bojongbot - Pi Zero

Saya memasang beberapa cctv berbeda merek, baik yang berjenis ip cam maupun yang analog dengan dvr. Kesemuanya terhubung ke 1 server shinobi video yang pernah saya tulis di artikel sebelumnya. Nah, beberapa perabotan itu tentunya memiliki IP, dan ada beberapa yang suka ngambek, gak hidup. Di-ping juga gak respon. Agak susah kalau tidak mengetahuinya. Kapan hari ada insiden panci presto meledak, namun cctv di area dapur pas heng. Jadi tidak ketahuan prosesnya.

Setelah kemarin ngoprek-ngoprek ARM (lagi setelah sekian lama), saya jadi inget punya beberapa perabotan arm yang tidak kepakai, salah satunya pi zero. Ya sudah itu aja dimanfaatkan jadi mesin bot. Tugasnya cuma kirim ping ke beberapa perangkat yang ada di daftar, jika gak ngasih balikan, ngirim pesan ke telegram via bot telegram.

Kodenya ada di https://github.com/princeofgiri/bojongbot.

Bot beraksi

Ada beberapa yang nanya, kenapa gak pakai ESP32 aja? Jawabannya sebagai berikut:

  1. Saya belum pernah ngoprek ESP32, baru order, belum datang saat tulisan ini dibuat
  2. Memanfaatkan yang sudah ada, jadi tinggal pakai gak perlu beli-beli
  3. Saya sangat familiar dengan linux dan bash, jadi ndak ribet bahasa pemrograman lainnya

Kepinginnya sih nanti botnya jadi tambah pinter, kulkas di rumah sepertinya ada API, bisa diintip nanti-nanti.

LibreOffice 7.0 di Raspberry Pi OS

Setelah kemarin bikin video Armbian dengan LibreOffice 7.0 (https://www.youtube.com/watch?v=1rTrCVgGXfA) ngoprek disela-sela kesibukan masih berlanjut. Kali ini ngidupin layar 7 inch dengan perangkat raspberry pi buat mainan bocah dengan GCompris.

Di Raspberry Pi OS (dulu Raspbian), yang berbasis debian buster. Caranya cukup mudah, pasang flatpak, pasang libreoffice dari flatpak. Beres!

Eh tunggu dulu, belum beres. Karena menu aplikasi libreofficenya belum bisa muncul. Harus digosok dulu. Berikut cara nggosoknya:

  • Edit berkas

/etc/xdg/lxsession/LXDE-pi/desktop.conf

  • Di paling bawah, tambahkan

[Environment_variable] XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/home/pi/.local/share/flatpak/exports/share:/usr/local/share/:/usr/share/raspi-ui-overrides:/usr/share/:/usr/share/gdm/:/var/lib/menu-xdg/

  • Reboot

Udah deh!

LibreOffice 7.0 di Raspberry Pi OSLibreOffice 7.0 di Raspberry Pi OS

Unduh Buku Digital Gratis

Halaman ini sengaja penulis buat untuk kumpulan buku digital yang sudah penulis rilis dan bagikan gratis.
Silakan klik pada masing-masing judul buku untuk menuju link download



Cara menjadi Sponsor pada buku yang akan terbit


Server CCTV dengan Shinobi Video – Bag. 5, IP Cam Murah Meriah

Setelah liat-liat di situs perbelanjaan daring, saya menemukan satu kamera yang fiturnya cukup pas untuk disambungkan dengan Shinobi, harganya juga berkisar 250 ribu rupiah. Berikut fitur yang penting untuk digunakan:

  • Onvif
  • AUTO TRACKING
  • PTZ Rotate Pan Tilt 360
  • Ada sensor suara, sensor gerak dan pemberitahuan ke Hp

Mini CameraMini Camera

PTZnya juga berhasil tersambung dengan Shinobi. Onvif devicenya dikenali bikinan Eyeplus.

Server CCTV dengan Shinobi Video – Bag. 4, Menyambungkan dengan DVR

Saya memiliki satu set CCTV beserta DVRnya. Mereknya Nathans, sponsor dari kantor (PT SKK). Ini CCTV asli ndak pakai ribet, just work. Nah … PRnya adalah gimana caranya nyambungin ke Shinobi. Berminggu-minggu saya gak berhasil menemukan solusinya. Sampai saya menyerah.

DVRDVR

Sekitar 2 mingguan lalu, saya tiba-tiba nemu sebuah saran url rtsp dari internet. Dan saya coba beneran bisa. Berikut urlnya:

rtsp://192.168.0.3:554/user=admin&password=passwordmu&channel=1&stream=1.sdp?real_stream–rtp-caching=100

Silahkan sesuaikan alamat IP beserta akun yang ada di DVR Anda.

Data Diri Lengkap di Marketplace

Maraknya penjualan data yang dicuri dari marketplace sedikit banyak tidak lepas dari penggunanya juga, makanya sampai saat ini kalau ada notifikasi peringatan untuk melengkapi data diri (No KTP, KK, dll.) saya tidak melakukannya, termasuk dulu jamannya masih main di FJB Kaskus.

Di beberapa marketplace mensyaratkan kita harus melengkapi data diri tersebut agar akun kita bisa terverifikasi 100 %, tapi saya tetap tidak melakukan, biarlah akun saya tidak terverifikasi 100% tidak mengapa daripada data diri diperjual-belikan, resikonya sih calon pembeli yang belum begitu kenal sangsi dengan dengan reputasi toko online kita.

Segera ganti password dan PIN anda untuk mencegah kejadian yang tidak diinginkan

Satu lagi, jangan terlalu banyak membiarkan saldo kita di akun marketplace, lebih aman lagi kalau kita pindah ke rekening pribadi (walau tidak 100%).



Saatnya tarik saldo ah, kalau ada yang saldonya melimpah dan tidak punya rekening pribadi, saya tidak menolak jika anda mengirimnya ke rekening saya



Cara Install extensi redis di Azure App Service Linux

Pada proyek di salah satu klien di tempat saya bekerja, menggunakan layanan Azure app service untuk mendeploy aplikasi Laravel. Aplikasi tersebut membutuhkan ekstensi redis untuk dapat terhubung dengan cache service di azure yang berbasis Redis. Berikut langkah-langkah pemasangannya. Buka konsol KUDU https://<sitename>.scm.azurewebsites.net Pilih SSH pada konsol SSH, ketikkan perintah berikut...

Screencast OBS Studio ke Google Meet di openSUSE

Saat ini masanya, masa pandemi ini banyak yang melakukan pekerjaan dari rumah (“WFH”). Salah satu kebutuhan saat meeting secara daring adalah melakukan screencasting, atau berbagi layar. Catatan ini menjelaskan bagaimana cara melakukannya dengan OBS Studio dan Google Meet. OS yang saya gunakan di laptop adalah openSUSE Leap 15.1. Yang perlu...

Membuat CI/CD di GitLab CI

Sekarang saatnya saya akan membuat sebuah catatan tentang bagaimana kita akan membuat CI/CD (Continuous Integration & Continuous Delivery/Deployment) di GitLab. Ini merupakan contoh sederhana yang mungkin dapat Anda jadikan acuan jika Anda sama sekali baru dalam dunia CI/CD, khususnya di GitLab CI. Istilah-Istilah Penting Hal pertama yang ingin saya jelaskan...

Install GitLab Runner dengan Ansible

Setelah kita selesai menyiapkan server GitLab di postingan sebelumnya ini dan/atau ini, selanjutnya akan kita setup server atau instance untuk digunakan sebagai Runner. Apa itu GitLab Runner? GitLab Runner merupakan aplikasi sumber terbuka yang digunakan untuk menjalankan job dan mengirim kembali hasilnya ke GitLab. Sebagai penghubung dengan GitLab CI, layanan...

Server CCTV dengan Shinobi Video – Bag. 3, Menggunakan IP Cam Publik

Bagaimana kalau mau belajar pemasangan shinobi namun tidak memiliki IP Cam? ada caranya kah?

Ada. Pasti Ada

Salah satu caranya adalah dengan menggunakan IP Cam publik yang berada di beberapa wilayah/negara. Daftarnya bisa didapat di http://www.insecam.org/. Tidak semua bisa digunakan, namun tentu saja ada yang bisa. Saya sendiri menemukan satu yang sukses digunakan. Tahapannya kurang lebih seperti ini:

  1. Cari salah satu kamera. Saya menemukan yang berada di Jepang. http://www.insecam.org/en/view/534370/.
  2. Ambil IP Addressnya, investigasi url-urlnya dengan iSpy agar bisa mendapat informasi lebih detil.
  3. Jika tanpa nomor 2, juga bisa, kebetulan kameranya support ONVIF, tinggal masukin alamat IP dan atur-atur dan coba-coba sampai pas
  4. Khusus ini, saya menemukan bahwa konfigurasi yang pas itu MJPEG.

IP Cam PublikIP Cam Publik

Selamat mencoba dan latihan untuk kamera yang lain. Banyak spot-spot bagus juga lho.

 

PS: CCTV Xiaomi Yi Max 02 1080p Outdoor Smart IP Cam ini ndak support ONVIF gak bisa diakses via rtsp jadinya.

Server CCTV dengan Shinobi Video – Bag. 2, Pemasangan Shinobi

Pemasangan Shinobi cukup mudah sekali, cukup menjalankan sebaris perintah dari root:

bash <(curl -s https://gitlab.com/Shinobi-Systems/Shinobi-Installer/raw/master/shinobi-install.sh)

Selanjutnya tinggal mengikuti langkah-langkah yang ada di layar. Saya memilih mengambil dari branch development agar mendapatkan fitur-fitur terbaru sekaligus testing. Dokumentasi pemasangan secara lengkap bisa dibaca di sini.

Berikut hal-hal utama yang perlu dilakukan setelah pemasangan:

Peramban Firefox

Gunakan peramban Firefox. Karena peramban Chrome tidak mau bila ada https dan self sign. Juka untuk streaming beberapa video cctv. Firefox bekerja lebih benar dari pada Chrome. Enggak tau kenapa.

Masuk sebagai admin dan buat user

Kita perlu memasukkan url http://alamat-ip-shinobi-server:8080/super. User / Pass bakunya adalah admin@shinobi.video / admin. Dari halaman ini kita bisa membuat user baru untuk masuk ke dashboard shinobi server. Juga untuk mengganti password akun admin tersebut.

Super AdminSuper Admin

Shinobi Dashboard

Untuk masuk ke dashboard, buka peramban dan arahkan ke http://alamat-ip-shinobi-server:8080/ lalu masukkan username/password yang sudah dibuat tadi.

Menambahkan Kamera

Klik tombol + (Add Monitor). Di sini kamera disebut monitor. Lalu tinggal isikan parameter-parameter yang sesuai kamera. Saya mencoba sendiri dan ribet. Setelah beberapa kali percobaan, baru berhasil.

Menambah KameraMenambah Kamera

Ada cara gampangnya, melalui menu pojok kiri atas – ONVIF. Lalu isikan alamat ip dan klik tombol search. Secara pintar, shinobi bisa mendeteksi kamera dalam jaringan yang kombatibel ONVIF. Jika ketemu, akan ditampilkan deskripsi kamera, bahkan bisa tahu merek/modelnya. Lalu tinggal klik tombol bergambar 2 dokumen (seperti ikon duplicate).

Add Monitor - ONVIFAdd Monitor – ONVIF

Selanjutnya tinggal melengkapi/mengganti isian yang ditampilkan (sama dengan jendela Add Monitor). Tinggal disesuaikan saja atau langsung Save. Secara baku, kamera akan memiliki mode View Only. Kita bisa mengatur/mengganti modenya menjadi Record.

Dua Kamera/MonitorDua Kamera/Monitor

Power Video Viewer

Digunakan untuk melihat video yang sudah tersimpan terekam. Tombol ikonnya mirip seperti tag/point pada peta.

Video ViewerVideo Viewer

Seingat saya, Power Video Viewer ini yang tidak bisa di Chrome.

Dah itu dulu tulisan kali ini. Tulisan berikutnya saya akan jelaskan cara optimasinya.

 

*Featured image diambil dari http://getwallpapers.com/collection/hidden-leaf-village-wallpaper

Install GitLab dengan Ansible

Nah, kemarin sudah kita bahas instalasi GitLab secara manual di postingan sebelumnya. Kali ini saya akan tuliskan langkah-langkah instalasi GitLab dengan cara yang lebih simple, yaitu dengan Ansible. Ansible adalah sebuah alat otomasi yang dikembangkan oleh RedHat. Beberapa kata kunci yang melekat pada Ansible adalah “automation tool”, “configuration management”, “infrastructure...

Server CCTV dengan Shinobi Video – Bag. 1, IP Cam

Oprekan kali ini bermula dari lokasi proyek rumah yang kemalingan. Saat awal bangun, kemalingan genset, berikutnya beberapa minggu lalu, para tukang kemalingan handphone.

Saya memiliki cctv yang ada di rumah, subsidi dari Pak Bos yang memiliki perusahaan penjualan cctv. Yang sudah dipakai, sangat mudah dioperasikan. Just work. Namun kali ini sejak pandemi, saya kepikir untuk memanage cctv tersebut dengan linux, entah raspi atau pakai komputer-komputer spek rendah.

Sebelumnya, saya sama sekali tidak mengerti teknologi cctv beserta perabotannya. Namun sejak ngoprek ini, pengetahuan jadi bertambah. Awalnya hanya tau/nemu Shinobi Video saja, setelah itu bingung, harus bagaimana? cara koneksinya ke cctv bagaimana?

Dinamakan IP Cam, tentunya memiliki IP, umumnya, dari pabrikan diatur menjadi dhcp client. Sehingga dapat IP otomatis dari router/server dhcp. Saya dipinjami IP Cam oleh Pak Iwan Tahari. Dalam kardusnya tidak ada informasi apapun (buku manual juga tidak ada). Merek/Pabrikan pembuatnya juga tidak tahu. Jadi dengan coba-coba colokin aja ke router/modem yang ada di rumah, lalu diintip dapat IP berapa, nah itu dia tinggal dipanggil IPnya di peramban.

IP CamIP Cam

Setelah sukses dapat IP, saya punya 1 komputer yang rencananya jadi server cctv dan sudah ada dhcp servernya, saya sambungkan IP Cam tersebut ke komputer . Dapat IP 10.42.0.151. Tinggal dipanggil di peramban dan muncul antar muka web si kamera.

Antarmuka WebAntarmuka Web

Hal utama yang perlu dilakukan adala mengatur zona waktu/waktu, agar nantinya saat dipakai, timestamp yang ditampilkan sesuai. Hal berikutnya adalah pengaturan kualitas gambar. Kamera ini sanggup merekam video/gambar dengan codec H265 dan H264, juga bisa merekam audio serta pengaturan fps dan kualitas. Saya mengatur kualitas medium dan codec H264 (karena H265, rata-rata browser tidak mulus menampilkannya).

Selanjutnya, bagaimana cara menguji bahwa kamera tersebut bisa digunakan? Saya cukup bingung dengan pertanyaan sendiri. Mencari-cari, akhirnya menemukan jawaban, bahwa bisa menguji dengan menggunakan VLC. Tinggal memasukkan url rtp/udp melalui menu Open Network. Nah bagaimana mendapatkan urlnya? macem-macem jawabnya dan bingung. Namun saya menemukan aplikasi pembantu, yang bisa memandu kita.

Aplikasinya bernama iSpy, opensource, adanya di OS Windows saja. Cara penggunaannya cukup mudah, bisa mencari berdasarkan IP yang kita masukkan atau dia mencari melalui jaringan yang ada. Setelah itu dia akan memberikan info ke kita daftar url yang bisa digunakan.

iSpyiSpy

Ada beberapa format yang perlu diperhatikan:

  • ONVIF, ini format standar IP Cam, jika bisa ini, dengan Shinobi bisa otomatis dalam pendeteksiannya.
  • RTSP, catat url rtsp yang diberikan, di atas contohnya rtsp://ip:8554/live/ch00_0

VLC dengan rtspVLC dengan rtsp

Setelah sukses tampil di VLC, kita bisa melanjutkan pemasangan Shinobi Video.

Install GitLab di Ubuntu 18.04

Setelah sekian lama, saya merasa perlu memerbarui konten blog ini. Kali ini saya akan menulis ulang panduan instalasi GitLab di Ubuntu 18.04 dalam Bahasa Indonesia. Dokumentasi resminya dapat langsung diakses melalui halaman ini. Di sana cukup singkat dan mudah dipahami. Namun saya menambah beberapa cuil penjelasan tambahan berdasarkan hasil praktek...

Membuat VM dengan Ubuntu Cloud Image di KVM/virsh

PERINGATAN, Aku akan mengambil harta karunmu. Eh, bukan. Kalo disebut tutorial sebenarnya enggak juga, postingan ini lebih ke catatan pribadi. Dan mungkin akan banyak yang sulit dipahami, terutama jika pembaca belum pernah menggunakan Linux, atau belum pernah menggunakan virsh. Namun, saya akan tetap menulikan ini sebagai “tutorial” yang mungkin akan...

Pasang ulang Weibu F3C – Endless Mini PC (unreleased)

Saya mendapatkan komputer ini dari Baris, CEO Endless Solutions jaman saya masih jadi ambassador pada 2017. Sudah terpasang Endless OS dan berfungsi dengan baik. Beberapa hari ini saya memutuskan untuk mengganti OSnya dengan OS apapun yang memungkinkan.

Pengujian pertama dengan openSUSE Tumbleweed, pemasangan berjalan mulus, masuk desktop agak kacau dikarenakan layar HDMI dianggap sebagai layar extended. Jadi harus mengarahkan kursor yang tepat dan mengatur ulang layar beserta resolusinya. Setelah masuk desktop, wireless tidak bisa digunakan. ini sudah sesuai prediksi. Pasang firmware non-free juga tidak membuahkan hasil.

Pengujian berikutnya dengan Ubuntu 20.04 yang masih Beta. Hampir sama, perbedaannya hanya si Ubuntu sedikit lebih pintar mengenali layar dari pada openSUSE. Namun tetap perlu mengatur resolusi layarnya. Wireless juga sama-sama tidak bisa digunakan walaupun sudah memasang firmware non-free.

Berikutnya nyari firmware yang dipakai Endless OS, nemu di github https://github.com/endlessm/linux-firmware. Coba dipasang … jreng, tetep gagal. Karena masih penasaran, saya unduh iso Endless OS terkini, dan install lagi. Selanjutnya ambil /lib/firmware untuk dibandingkan, ternyata ada sedikit (bisa dibilang banyak sih) tambahan dari yang ada di github. Saya rangkum di https://lumbung.mycoop.id/ahmadharis/linux-firmware/commit/ee4aec2c50e82a06861e2b166814d418e3d5046b. Setelah dipasang, reboot, tetep gak mau.

Baca-baca dmesg, terus guling-guling, nemu titik terang untuk ambil dari https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20161130-3+rpt3_all.deb terus dibongkar. Dicomot yang brcmfmac43455. Saya rangkum di https://lumbung.mycoop.id/ahmadharis/linux-firmware/commit/1c1f19900b2399ce123dd5e5d2978aa6ba21e397.

Dicoba di Ubuntu 20.04 sukses. Di openSUSE Tumbleweed pun demikian.

openSUSE TumbleweedopenSUSE Tumbleweed

 

Ubuntu 20.04Ubuntu 20.04

Macbook Jadul dengan openSUSE Tumbleweed

Jadi kapan hari menjenguk duo R, dan keinget kalau ada “harta” lama yang gak dipakai. Jadinya saya minta dan dicoba dihidupkan. Macbook2,1. Laptop jaman Pak Beye kata teman saya.

Macbook2,1Macbook2,1

Ini komputer cukup nyusahin. Kalau pakai MacOS X mentok di Lion. Walhasil gak bisa ngapa-ngapain, wong banyak aplikasi ndak support. Boot usb linux juga ndak mau, gak kayak Macbook keluaran baru yang mau boot linux. Dulu masang ubuntu lewat media CD. Berhubung sudah gak punya CD, alhasil menggunakan segala cara agar bisa boot. Cara termudah adalah memasang ubuntu dari komputer lain, lalu pindah disknya ke macbook jadul tersebut.

Bagaimana dengan OS Linux lainnya? susah … gak bisa kepasang. Kesimpulan akhir, karena grub yang terpasang di ubuntu itu grub-pc i386 (walaupun pakai arch 64 bit). Jadi yang mulus terpasang pertama kali adalah ubuntu.

Selanjutnya usaha agar memasang openSUSE Tumbleweed. Berbagai cara sudah digunakan, ketemu kesimpulan cara yang mujarab sebagai berikut:

  1. Pasang opensuse (boot legacy, jangan uefi) pada disk (usb flashdisk) lain dengan komputer lain.
  2. Sediakan partisi kosong ext4 di macbook jadul tersebut.
  3. Salin isi usb flashdisk pada nomor 1 ke dalam partisi ext4 tadi. Salin dengan opsi -rapv biar kebawa semua atribut dan permission berkasnya.
  4. Uji dengan chroot, kalau mulus berarti sudah benar.
  5. Ubah fstab, sesuaikan dengan uuid yang baru, pindah motherboard/komputer akan membuat beda uuid.
  6. Edit grub di ubuntu, sesuaikan.

Ribet kan? tapi seru, buat nambah kesibukan selama masa diam di rumah.

Beli Kuota Rela, Tapi Beli Aplikasi Tidak Mau

Beberapa hari lalu saya mengisi acara Seminar Pendidikan yang diselenggarakan oleh salah satu yayasan, temanya adalah "Implementasi Belajar Sambil Bermain lewat Permainan di Gawai" (kurang lebih seperti itu kalau diterjemahkan ke bahasa Indonesia).

Salah satu Materi saya adalah mengenai penggunaan GCompris untuk belajar sesuai kurikulum yang berlaku.

Pada sesi tanya jawab ada salah seorang peserta yang bertanya;
  • Apakah GCompris bisa diinstal di Android?
  • Bisa, jawab saya singkat, cari saja di Playstore
Kemudian sebagian besar peserta seminar mulai mencarinya di playstore.
Salah seorang peserta bertanya;
  • Kok berbayar?

  • Ya, jawab saya dengan beberapa penjelasan singkat
  • Peserta lain kemudian menimpali kalau harganya terlalu mahal untuk sebuah permainan.
Saya pun menjawab:
  • Dalam satu bulan anda belu kuota habis berapa?
Dia jawab
  • Kurang lebih 100 ribu untuk saya, kalau untuk anak saya 20 ribu untuk seminggu.
Kemudian saya menimpali, Anda beli kuota setiap bulan saja tidak sayang, kok beli aplikasi yang harganya cuma 99.000 dan bisa dipakai seumur Android sayang banget.
Belum lagi kuota untuk anaknya yang dipakai untuk game online yang tidak jelas unsur pendidikannya.

Padahal rata-rata peserta seminar adalah tenaga pendidik (guru), termasuk kedua peserta yang bertanya tadi.
Sepertinya tingkat Edukasi untuk tenaga pendidik di Indonesia masih perlu ditingkatkan lagi.