mirror of
https://github.com/avinal/avinal.github.io.git
synced 2026-07-04 07:40:09 +05:30
added hugo website
Signed-off-by: Avinal Kumar <avinal.xlvii@gmail.com> rh-pre-commit.version: 2.2.0 rh-pre-commit.check-secrets: ENABLED
This commit is contained in:
@@ -0,0 +1,406 @@
|
||||
---
|
||||
title: Configure Logitech MX Master 3S using LogiOps
|
||||
date: 2023-09-25T20:47:00
|
||||
category: blogs
|
||||
tags: [fedora, mouse, "logid", "logitech", "logiops", "mx-master-3s"]
|
||||
image: "/images/mouse-building.webp"
|
||||
description: "I brought Logitech MX Master 3S mouse and it is a great mouse. It
|
||||
has a lot of features and I am still exploring them. One of the features is to
|
||||
configure the mouse using LogiOps. LogiOps is a command line tool to configure
|
||||
Logitech devices on Linux distos."
|
||||
---
|
||||
|
||||
I brought Logitech MX Master 3S mouse, and it is a great mouse. It has a lot of
|
||||
features, and I am still exploring them. One of the features is to configure the
|
||||
mouse using LogiOps. LogiOps is a command line tool to configure Logitech
|
||||
devices on Linux distros, since Logitech provides official tools to configure the
|
||||
mouse on Windows and macOS.
|
||||
|
||||
## Logitech MX Master 3S
|
||||
|
||||
Although I use keyboard shortcuts for most of my work, I still use the mouse a
|
||||
lot. It is usually very helpful to have a good mouse, especially when you have
|
||||
to scroll thousands of lines of code and documentation. This mouse features a
|
||||
superfast scroll wheel that can scroll thousands of lines in a second. In total
|
||||
there are 7 buttons on the mouse. The mouse can be connected to the computer via
|
||||
Bluetooth or a USB receiver. It can also be connected to multiple devices at the
|
||||
same time and can be switched between them using a button on the bottom of the
|
||||
mouse. The mouse can be charged using a USB-C cable, and it can be used while
|
||||
charging as well. You can see a 3D model of the mouse below. You can rotate the model using your
|
||||
mouse or touchpad.
|
||||
|
||||
<iframe class="aspect-video w-full" title="Logitech MX Master 3 Mouse Black" frameborder="0" allowfullscreen
|
||||
mozallowfullscreen="true" webkitallowfullscreen="true" allow="autoplay; fullscreen; xr-spatial-tracking"
|
||||
xr-spatial-tracking execution-while-out-of-viewport execution-while-not-rendered web-share
|
||||
src="https://sketchfab.com/models/c15eda7cd7874423a8c31d55193b9ff2/embed?ui_theme=dark&dnt=1"> </iframe>
|
||||
|
||||
The best part about this mouse is that it is very comfortable to use and highly
|
||||
customizable. You can customize most of the buttons and even extend the functionality
|
||||
by adding gestures. You can also customize the scroll wheel and the scroll
|
||||
direction as well as the DPI and the pointer speed. All this can be done using
|
||||
LogiOps.
|
||||
|
||||
## Installing LogiOps
|
||||
|
||||
It is an open source tool with code available on [GitHub](https://github.com/PixlOne/logiops).
|
||||
This blog post will show you how to install and configure LogiOps on Fedora. The
|
||||
steps should be similar for other Linux distros and other Logitech mice as well.
|
||||
You can directly install using `dnf` but for latest version, you can build from
|
||||
source.
|
||||
|
||||
- Install the dependencies.
|
||||
|
||||
```bash
|
||||
sudo dnf install cmake libevdev-devel systemd-devel libconfig-devel gcc-c++ glib2-devel
|
||||
```
|
||||
|
||||
- Clone the repository.
|
||||
|
||||
```bash
|
||||
git clone https://github.com/PixlOne/logiops.git
|
||||
```
|
||||
|
||||
- Build and install.
|
||||
|
||||
```bash
|
||||
cd logiops
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||
make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
## Configuring LogiOps
|
||||
|
||||
In this blog post I will show you what buttons are available and how you can configure
|
||||
actions (*keypress* or *gestures*) on them. Let us take a look at all the available buttons.
|
||||
|
||||

|
||||
|
||||
You can also get a table of available buttons, their CID and available features
|
||||
by running logid in debug mode.
|
||||
|
||||
```bash
|
||||
sudo logid -d
|
||||
```
|
||||
|
||||
You can get output like this:
|
||||
|
||||
```bash
|
||||
[INFO] Device found: MX Master 3S on /dev/hidraw4:255
|
||||
[DEBUG] /dev/hidraw4:255 remappable buttons:
|
||||
[DEBUG] CID | reprog? | fn key? | mouse key? | gesture support?
|
||||
[DEBUG] 0x50 | | | YES |
|
||||
[DEBUG] 0x51 | | | YES |
|
||||
[DEBUG] 0x52 | YES | | YES | YES
|
||||
[DEBUG] 0x53 | YES | | YES | YES
|
||||
[DEBUG] 0x56 | YES | | YES | YES
|
||||
[DEBUG] 0xc3 | YES | | YES | YES
|
||||
[DEBUG] 0xc4 | YES | | YES | YES
|
||||
[DEBUG] 0xd7 | YES | | | YES
|
||||
[DEBUG] Thumb wheel detected (0x2150), capabilities:
|
||||
[DEBUG] timestamp | touch | proximity | single tap
|
||||
[DEBUG] YES | YES | YES | YES
|
||||
[DEBUG] Thumb wheel resolution: native (18), diverted (120)
|
||||
```
|
||||
|
||||
You can see thumb wheel has some cool features like touch, proximity and single
|
||||
tap. Furthermore, you can configure these features in the configuration file. You can also
|
||||
configure the thumb wheel resolution.
|
||||
|
||||
### Create a configuration file
|
||||
|
||||
LogiOps uses a configuration file to configure the mouse. By default, the
|
||||
configuration file is located at `/etc/logid.cfg`. If you cannot
|
||||
find the file, you can create one. You can copy the default configuration file
|
||||
and edit it. You can find the default configuration file
|
||||
[here](https://github.com/PixlOne/logiops/blob/main/logid.example.cfg). You can
|
||||
read the documentation for the configuration file in [this wiki](https://github.com/PixlOne/logiops/wiki/Configuration).
|
||||
|
||||
```bash
|
||||
sudo touch /etc/logid.cfg
|
||||
```
|
||||
|
||||
You can also pass a custom path for the configuration file using `-c` flag. But
|
||||
it never worked for me, so I am going to skip this part.
|
||||
|
||||
### Understanding the configuration options
|
||||
|
||||
You can obviously read the documentation for the configuration file, but I will
|
||||
focus on easy understanding of the options that will be more than enough for most
|
||||
users. I will be building the configuration file step by step and finally show
|
||||
you the complete configuration file.
|
||||
|
||||
- Add a device and define its name
|
||||
|
||||
```cpp
|
||||
devices: (
|
||||
{
|
||||
name: "MX Master 3S";
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
- Configure smartshift
|
||||
|
||||
```cpp
|
||||
smartshift:
|
||||
{
|
||||
on: true;
|
||||
threshold: 30;
|
||||
torque: 50;
|
||||
}
|
||||
```
|
||||
|
||||
- Configure hires scrolling
|
||||
|
||||
```cpp
|
||||
hiresscroll:
|
||||
{
|
||||
hires: true;
|
||||
invert: false;
|
||||
target: false;
|
||||
}
|
||||
```
|
||||
|
||||
- Configure dpi
|
||||
|
||||
```cpp
|
||||
dpi: 2000;
|
||||
```
|
||||
|
||||
Next we will see how to configure the buttons.
|
||||
|
||||
#### Buttons
|
||||
|
||||
Every button has a CID. You can see the CID of the buttons in the debug output
|
||||
as well as in the image above. Every remappable button has some actions that can
|
||||
be configured. You can configure a keypress or a gesture or a combination of
|
||||
both.
|
||||
|
||||
There can be two situations when you configure a button. Either you want to
|
||||
configure the button for a specific keypress, or you want to configure the button
|
||||
for a specific gesture. You can also configure the button for both keypress and
|
||||
gesture. In this case, the keypress will be triggered when you press the button
|
||||
and the gesture will be triggered when you press the button and move the mouse
|
||||
in a specific direction. The buttons can also be configured to toggle specific
|
||||
fetcures of the mouse like smartshift, hires scrolling, etc.
|
||||
|
||||
First create a button section for the button you want to configure.
|
||||
|
||||
```cpp
|
||||
buttons: (
|
||||
{
|
||||
<first-button>
|
||||
},
|
||||
{
|
||||
<second-button>
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
- Configure only a keypress, let's configure the wheel button to take screenshot
|
||||
|
||||
```cpp
|
||||
{
|
||||
cid: 0x52;
|
||||
action =
|
||||
{
|
||||
type: "keypress";
|
||||
keys: ["KEY_PRINT"]
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
- Configure the top button to toggle SmartShift
|
||||
|
||||
```cpp
|
||||
{
|
||||
cid: 0xc4;
|
||||
action =
|
||||
{
|
||||
type: "ToggleSmartShift";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- configure the gesture button for the following (sway based gestures)
|
||||
- keypress: Opens Terminal
|
||||
- Up gesture: Snaps current window to top
|
||||
- Down gesture: Snaps current window to bottom
|
||||
- Left gesture: Snaps current window to left
|
||||
- Right gesture: Snaps current window to right
|
||||
|
||||
```cpp
|
||||
{
|
||||
cid: 0xc3;
|
||||
action =
|
||||
{
|
||||
type: "Gestures";
|
||||
gestures: (
|
||||
{
|
||||
direction: "Up";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_UP"];
|
||||
};
|
||||
},
|
||||
{
|
||||
direction: "Down";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_DOWN"];
|
||||
};
|
||||
},
|
||||
{
|
||||
direction: "Left";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_LEFT"];
|
||||
};
|
||||
},
|
||||
{
|
||||
direction: "Right";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys = ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_RIGHT"];
|
||||
}
|
||||
},
|
||||
{
|
||||
direction: "None"
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_ENTER"];
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The keypress while using with gestures is defined as direction **None**. These are
|
||||
just some examples, you can go through the documentation to see all the available
|
||||
options.
|
||||
|
||||
### Complete configuration file
|
||||
|
||||
Here is the complete configuration file that I use.
|
||||
|
||||
```cpp
|
||||
devices: (
|
||||
{
|
||||
name: "MX Master 3S";
|
||||
smartshift:
|
||||
{
|
||||
on: true;
|
||||
threshold: 30;
|
||||
torque: 50;
|
||||
};
|
||||
hiresscroll:
|
||||
{
|
||||
hires: true;
|
||||
invert: false;
|
||||
target: false;
|
||||
};
|
||||
dpi: 2000;
|
||||
|
||||
buttons: (
|
||||
{
|
||||
cid: 0xc3;
|
||||
action =
|
||||
{
|
||||
type: "Gestures";
|
||||
gestures: (
|
||||
{
|
||||
direction: "Up";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_UP"];
|
||||
};
|
||||
},
|
||||
{
|
||||
direction: "Down";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_DOWN"];
|
||||
};
|
||||
},
|
||||
{
|
||||
direction: "Left";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_LEFT"];
|
||||
};
|
||||
},
|
||||
{
|
||||
direction: "Right";
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys = ["KEY_LEFTMETA", "KEY_LEFTSHIFT", "KEY_RIGHT"];
|
||||
}
|
||||
},
|
||||
{
|
||||
direction: "None"
|
||||
mode: "OnRelease";
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_LEFTMETA", "KEY_ENTER"];
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
},
|
||||
{
|
||||
cid: 0x52;
|
||||
action =
|
||||
{
|
||||
type: "Keypress";
|
||||
keys: ["KEY_RIGHTCTRL", "KEY_PRINT"]
|
||||
};
|
||||
},
|
||||
{
|
||||
cid: 0xc4;
|
||||
action =
|
||||
{
|
||||
type: "ToggleSmartshift";
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
## Post Configuration
|
||||
|
||||
Once configured you will need to restart the logid service.
|
||||
|
||||
```bash
|
||||
sudo systemctl restart logid
|
||||
```
|
||||
|
||||
Voila! You have successfully configured your Logitech mouse.
|
||||
|
||||
## References
|
||||
|
||||
- [LogiOps](https://github.com/PixlOne/logiops)
|
||||
- [My Configurations](https://gist.github.com/avinal/2acfc0ac2952f4354dd3b4b78b8ccb2b)
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: Installing Fedora with automatic and custom partioning
|
||||
date: 2023-01-19 23:02
|
||||
category: blog
|
||||
tags: [fedora, partioning]
|
||||
image: ""
|
||||
draft: true
|
||||
---
|
||||
|
||||
Fedora is one of the most popular Linux distribution for daily uses as well as
|
||||
development purpose. I have been a Linux user since 2019 and switched through
|
||||
multiple distros since then. For a long time I was stuck with Ubuntu and now
|
||||
finally Fedora. Fedora is an amazing distribution. You get to enjoy the latest
|
||||
of almost everything. But this all starts with installing Fedora on your system.
|
||||
Although Fedora is one of the most easy-to-install distribution out there, a lot
|
||||
of people struggle to install it the right way. There is a lot of tutorials and
|
||||
blogs as well, but I couldn't find one that answers all my questions and still is
|
||||
easy to understand and follow along. So I decided to write one.
|
||||
|
||||
## What is the best for me?
|
||||
|
||||
## Complete automatic installation
|
||||
|
||||
## Semi-automatic custom partitioning
|
||||
|
||||
## Advanced custom partitioning
|
||||
|
||||
### Partition Scheme
|
||||
|
||||
| Mount Points | Filesystem | Size (minimum) | Remarks |
|
||||
| --- | --- | --- | --- |
|
||||
| `/boot/efi` | EFI | | |
|
||||
| `/boot` | ext4 | | |
|
||||
| `/` | ext4 | | |
|
||||
| `/home` | btrfs | | |
|
||||
|
||||
## References
|
||||
@@ -0,0 +1,301 @@
|
||||
---
|
||||
category: blogs
|
||||
date: 2023-07-19T18:08:00
|
||||
description: In the last post, I described how to install Tekton Results on a Kubernetes
|
||||
cluster. In this post, we will see how to use Tekton Results to store the results
|
||||
of a PipelineRun and how to retrive them later.
|
||||
image: /images/tekton-results-retrieve.webp
|
||||
tags:
|
||||
- tekton
|
||||
- kubernetes
|
||||
- redhat
|
||||
- openshift
|
||||
- results
|
||||
title: Tekton Results - Storing and Retrieving Results
|
||||
---
|
||||
|
||||
In the [last post](/posts/blogs/hey-tekton-results/), I described how to install
|
||||
Tekton Results on a Kubernetes cluster. In this post, we will see how to use Tekton
|
||||
Results to store the results of a PipelineRun and how to retrive them later.
|
||||
|
||||
## Creating a PipelineRun/TaskRun
|
||||
|
||||
Let us create a simple PipelineRun to see how Tekton Results works. Here is a simple
|
||||
PipelineRun that I created for this demo.
|
||||
|
||||
- Create a PipelineRun YAML file.
|
||||
|
||||
```sh
|
||||
cat <<EOF > demo-pipeline-run.yaml
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: demo-pipeline-run
|
||||
spec:
|
||||
pipelineRef:
|
||||
name: demo-pipeline
|
||||
tasks:
|
||||
- name: demo-task
|
||||
taskSpec:
|
||||
steps:
|
||||
- name: demo-step
|
||||
image: alpine
|
||||
script: |
|
||||
echo "Hello World"
|
||||
EOF
|
||||
```
|
||||
|
||||
- Create the PipelineRun.
|
||||
|
||||
```bash
|
||||
kubectl apply --filename demo-pipeline-run.yaml
|
||||
```
|
||||
|
||||
## Querying the Results API
|
||||
|
||||
There are three ways to query the Results API. The simplest way is to use
|
||||
`tkn-results` CLI. You can also use `curl` or any other HTTP client as well as
|
||||
a gRPC client. I will go through all three methods. Before we start, we have to
|
||||
create a ServiceAccount and a ClusterRoleBinding to access the API.
|
||||
|
||||
- Create a ServiceAccount for quering the API.
|
||||
|
||||
```bash
|
||||
kubectl create sa tekton-results-query -n tekton-pipelines
|
||||
```
|
||||
|
||||
- Grant readonly permissions to the ServiceAccount
|
||||
|
||||
```bash
|
||||
kubectl create clusterrolebinding tekton-results-query \
|
||||
--clusterrole=tekton-results-readonly
|
||||
--serviceaccount=tekton-pipelines:tekton-results-query
|
||||
```
|
||||
|
||||
- Create an access token
|
||||
|
||||
```bash
|
||||
export ACCESS_TOKEN=$(kubectl create token tekton-results-query -n tekton-pipelines)
|
||||
```
|
||||
|
||||
- Expose the results API server, this will block so run in a separate shell.
|
||||
|
||||
```bash
|
||||
kubectl port-forward --namespace tekton-pipelines \
|
||||
service/tekton-results-api-service 8080:8080
|
||||
```
|
||||
|
||||
### Using `tkn-results` CLI
|
||||
|
||||
We are not releasing the CLI yet, but you can install it using Go. You will need
|
||||
[Go](https://golang.org/doc/install) installed on your machine.
|
||||
|
||||
- Install `tkn-results`
|
||||
|
||||
```bash
|
||||
GOBIN=${TKN_PLUGINS_DIR:-"${HOME}/.config/tkn/plugins"} \
|
||||
go install github.com/tektoncd/results/tools/tkn-results@latest
|
||||
```
|
||||
|
||||
- Query the API, pass `--insecure` flag if you are using a self-signed certificate. In place of `default` you can pass the namespace name. `-` means all namespaces.
|
||||
|
||||
```bash
|
||||
tkn-results list --insecure \
|
||||
--addr http://localhost:8080
|
||||
--authtoken $ACCESS_TOKEN
|
||||
default
|
||||
```
|
||||
|
||||
You will get a response like below.
|
||||
|
||||
```bash
|
||||
Name Start Update
|
||||
default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be 2023-06-13 12:04:49 +0530 IST 2023-06-13 12:09:07 +0530 IST
|
||||
```
|
||||
|
||||
- Similarly you can query Records for a particular PipelineRun or TaskRun Result.
|
||||
|
||||
```bash
|
||||
tkn-results records list --insecure \
|
||||
--addr http://localhost:8080
|
||||
--authtoken $ACCESS_TOKEN
|
||||
default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be
|
||||
```
|
||||
|
||||
You will get a response like below. Notice that there are two records, one for the PipelineRun and one for the TaskRun.
|
||||
|
||||
```bash
|
||||
Name Type Start Update
|
||||
default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be/records/dcb7926e-42e8-4338-ab7d-0b67e02389be tekton.dev/v1beta1.PipelineRun 2023-06-13 12:04:51 +0530 IST 2023-06-13 12:19:09 +0530 IST
|
||||
default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be/records/64a0ab6e-9b90-4e5e-a072-e44d8ff27467 tekton.dev/v1beta1.TaskRun 2023-06-13 12:06:14 +0530 IST 2023-06-13 12:07:52 +0530 IST
|
||||
```
|
||||
|
||||
- Finally you can get a single record too.
|
||||
|
||||
```bash
|
||||
tkn-results records list --insecure \
|
||||
--addr http://localhost:8080
|
||||
--authtoken $ACCESS_TOKEN
|
||||
default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be/records/dcb7926e-42e8-4338-ab7d-0b67e02389be
|
||||
```
|
||||
|
||||
You will get a response like below.
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be/records/dcb7926e-42e8-4338-ab7d-0b67e02389be",
|
||||
"id": "50b13d54-2eb0-4a45-8399-853f2d4ba028",
|
||||
"uid": "50b13d54-2eb0-4a45-8399-853f2d4ba028",
|
||||
"data": {
|
||||
"type": "tekton.dev/v1beta1.PipelineRun",
|
||||
"value": "eyJraW5kIjogIlBpcGVsaW5lUn<base64-encode-data-truncated-for-brevity>"
|
||||
},
|
||||
"etag": "50b13d54-2eb0-4a45-8399-853f2d4ba028-1686638949162394019",
|
||||
"createdTime": "2023-06-13T06:34:51.320028Z",
|
||||
"createTime": "2023-06-13T06:34:51.320028Z",
|
||||
"updatedTime": "2023-06-13T06:49:09.162394Z",
|
||||
"updateTime": "2023-06-13T06:49:09.162394Z"
|
||||
}
|
||||
```
|
||||
|
||||
### Using `curl`
|
||||
|
||||
Using curl is similar to using `tkn-results` CLI. You can use the same access
|
||||
token and the same API server address. The only difference is that you have to
|
||||
pass the access token as a header and provide the API path depending on what
|
||||
you want to query.
|
||||
|
||||
- Query the results
|
||||
|
||||
```bash
|
||||
curl --insecure \
|
||||
-H "Authorization: Bearer $ACCESS_TOKEN"
|
||||
-H "Accept: application/json"
|
||||
https://localhost:8080/apis/results.tekton.dev/v1alpha2/parents/default/results
|
||||
```
|
||||
|
||||
You will get a response like below.
|
||||
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"name": "default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be",
|
||||
"id": "50b13d54-2eb0-4a45-8399-853f2d4ba028",
|
||||
"uid": "50b13d54-2eb0-4a45-8399-853f2d4ba028",
|
||||
"createdTime": "2023-03-02T07:26:48.972907Z",
|
||||
"createTime": "2023-03-02T07:26:48.972907Z",
|
||||
"updatedTime": "2023-03-02T07:26:54.191114Z",
|
||||
"updateTime": "2023-03-02T07:26:54.191114Z",
|
||||
"annotations": {},
|
||||
"etag": "50b13d54-2eb0-4a45-8399-853f2d4ba028-1677742014191114634",
|
||||
"summary": {
|
||||
"record": "default/results/dcb7926e-42e8-4338-ab7d-0b67e02389be/records/dcb7926e-42e8-4338-ab7d-0b67e02389be",
|
||||
"type": "tekton.dev/v1beta1.PipelineRun",
|
||||
"startTime": null,
|
||||
"endTime": "2023-03-02T07:26:54Z",
|
||||
"status": "SUCCESS",
|
||||
"annotations": {}
|
||||
}
|
||||
}
|
||||
],
|
||||
"nextPageToken": ""
|
||||
}
|
||||
```
|
||||
|
||||
You can also use filters to query record for a particular (set of) PipelineRun
|
||||
or TaskRun. See the available filters [here](https://github.com/tektoncd/results/blob/main/docs/api/README.md#filtering).
|
||||
|
||||
### Using gRPC
|
||||
|
||||
You can also use gRPC to query the API. You can use the same access token. You
|
||||
will need to [install](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md)
|
||||
`grpc_cli` to query the API.
|
||||
|
||||
- Querying using gRPC will need cert. Here is how to export them.
|
||||
|
||||
```bash
|
||||
kubectl get secrets tekton-results-tls -n tekton-pipelines \
|
||||
--template='{{index .data "tls.crt"}}' | base64 -d > /tmp/results.crt
|
||||
export GRPC_DEFAULT_SSL_ROOTS_FILE_PATH=/tmp/results.crt
|
||||
```
|
||||
|
||||
- List available services
|
||||
|
||||
```bash
|
||||
grpc_cli ls --channel_creds_type=ssl \
|
||||
--ssl_target=tekton-results-api-service.tekton-pipelines.svc.cluster.local \
|
||||
localhost:8080
|
||||
```
|
||||
|
||||
You will get a response like below.
|
||||
|
||||
```bash
|
||||
grpc.health.v1.Health
|
||||
grpc.reflection.v1alpha.ServerReflection
|
||||
tekton.results.v1alpha2.Results
|
||||
```
|
||||
|
||||
- List the Results
|
||||
|
||||
```bash
|
||||
grpc_cli call --channel_creds_type=ssl \
|
||||
--ssl_target=tekton-results-api-service.tekton-pipelines.svc.cluster.local \
|
||||
--call_creds=access_token=$ACCESS_TOKEN
|
||||
localhost:8080
|
||||
tekton.results.v1alpha2.Results.ListResults 'parent: "default"'
|
||||
```
|
||||
|
||||
You will get a response like below.
|
||||
|
||||
```bash
|
||||
connecting to localhost:8080
|
||||
|
||||
results {
|
||||
name: "default/results/7afa9067-5001-4d93-b715-49854a770412"
|
||||
id: "b74a3317-e6c0-421c-85d9-54b0f3d4b4c6"
|
||||
created_time {
|
||||
seconds: 1677742028
|
||||
nanos: 143729000
|
||||
}
|
||||
etag: "b74a3317-e6c0-421c-85d9-54b0f3d4b4c6-1677742039224211588"
|
||||
updated_time {
|
||||
seconds: 1677742039
|
||||
nanos: 224211000
|
||||
}
|
||||
uid: "b74a3317-e6c0-421c-85d9-54b0f3d4b4c6"
|
||||
create_time {
|
||||
seconds: 1677742028
|
||||
nanos: 143729000
|
||||
}
|
||||
update_time {
|
||||
seconds: 1677742039
|
||||
nanos: 224211000
|
||||
}
|
||||
summary {
|
||||
record: "default/results/7afa9067-5001-4d93-b715-49854a770412/records/7afa9067-5001-4d93-b715-49854a770412"
|
||||
type: "tekton.dev/v1beta1.TaskRun"
|
||||
end_time {
|
||||
seconds: 1677742039
|
||||
}
|
||||
status: SUCCESS
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Similar to curl you can pass filters here as well.
|
||||
|
||||
## Conclusion
|
||||
|
||||
In this post, we saw how to use Tekton Results to store the results of a PipelineRun
|
||||
or TaskRun and how to query them later. Tekton Results is still in alpha, we are
|
||||
working on adding more features to it. If you have any feedback or feature request,
|
||||
please feel free to open an issue [here](https://github.com/tektoncd/results/issues)
|
||||
or reach out to us on [Slack](https://tektoncd.slack.com/). Thanks for reading!
|
||||
|
||||
## References
|
||||
|
||||
- [Tekton Results](https://github.com/tektoncd/results)
|
||||
- [Tekton Pipelines](https://github.com/tektoncd/pipeline)
|
||||
- [Tekton Results API Specification](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/tektoncd/results/v0.7.0/docs/api/openapi.yaml)
|
||||
- [Tekton Results CLI](https://github.com/tektoncd/results/tree/main/tools/tkn-results)
|
||||
@@ -0,0 +1,280 @@
|
||||
---
|
||||
category: development
|
||||
date: 2020-12-01T23:47:00
|
||||
description: The project was to Create the VLC User Documentation for Android Mobile
|
||||
Port which was previously hosted on VLC wiki pages. The major portion of this was
|
||||
to start everything from scratch including chapter separation, section organization.
|
||||
image: /images/day-of-cone.webp
|
||||
modified: 2020-12-31 23:19
|
||||
tags:
|
||||
- vlc
|
||||
- gsod
|
||||
- gsod2020
|
||||
title: Create the VLC User Documentation for one Mobile Port(Android)
|
||||
---
|
||||
|
||||
VideoLAN is a non-profit organization that develops software for playing
|
||||
video and other media formats. VLC media player (commonly known as just
|
||||
VLC) is a free and Open Source cross-platform multimedia player and
|
||||
framework that plays most multimedia files as well as DVDs, Audio CDs,
|
||||
VCDs, and various streaming protocols built by the VideoLAN organization
|
||||
and a team of volunteers. VLC for Android is a port of the VLC for
|
||||
Android OS.
|
||||
|
||||
The project was to Create the VLC User Documentation for Android Mobile
|
||||
Port which was previously hosted on VLC's wiki pages. The major portion
|
||||
of this was to start everything from scratch including chapter
|
||||
separation, section organization and an engaging and easy to follow for
|
||||
both technical and non-technical users. The original proposal can be
|
||||
found here.
|
||||
|
||||
## PROJECT GOALS
|
||||
|
||||
- Propose a new structure for documentation e.g. Chapter Separation,
|
||||
Sections etc
|
||||
- Proper balance between technical and non-technical descriptions to
|
||||
serve all kinds of users.
|
||||
- Adequate amount of screenshots in each section and other supporting
|
||||
media to make documentation more appealing.
|
||||
- Optimized for all Screen Sizes. Especially for Mobile Devices.
|
||||
- Ease of navigation
|
||||
|
||||
## COMMUNITY BONDING
|
||||
|
||||
This period was mostly utilized for collecting more information and many
|
||||
internal meetings to shape the projects and bonding with fellow writers,
|
||||
developers(mentors). I got to know more about the VLC organization and
|
||||
the project. We decided to create a skeleton of the project and then
|
||||
follow a Issue-Merge Request-Review-Merge system to keep the commit
|
||||
history clean and maintain the proper review of the work before it is
|
||||
merged.
|
||||
|
||||
I initially proposed that the new documentation should also use the same
|
||||
tools(Sphinx and GitLab Pages) because if in future we want to merge all
|
||||
the documentation into a single one, it will be easier to migrate and
|
||||
will provide a consistency across all documentations. Later I got to
|
||||
know that this will be an independent project and may not be merged
|
||||
since it solves a lot of problems. I was already familiar with the tools
|
||||
so it took no time to get started.
|
||||
|
||||
Nicolas Pomepuy, who is the lead developer of VLC for Android was
|
||||
assigned as my primary mentor and Simon Latapie as secondary mentor.
|
||||
|
||||
## DOCUMENTATION DEVELOPMENT PHASE
|
||||
|
||||
Initial Preparation I first moved my existing demo documentation to an
|
||||
entirely new repository with only the skeleton at the suggestion of my
|
||||
mentor. It was necessary to keep the commit history clean. The skeleton
|
||||
contained the empty directories representing the chapter separation. I
|
||||
got to learn “how to properly develop a project and contribute to open
|
||||
source”. This was a major lesson that got me familiar with the Merge
|
||||
Request and Review system.
|
||||
|
||||
The Development The next part was to frame the actual documentation
|
||||
pages and push to the repository. Since there was a significant
|
||||
time-zone difference we agreed to discuss by creating issues and
|
||||
sometimes my emails. There was one meeting every fortnight to check the
|
||||
process and discuss further development and blockers. Nicolas was really
|
||||
helpful and patient, answering each of my big-small queries.
|
||||
|
||||
Work Done
|
||||
|
||||
<style>
|
||||
table,td,th {
|
||||
border-collapse:collapse;
|
||||
border: 1px solid #000000;
|
||||
}
|
||||
</style>
|
||||
<table>
|
||||
<tr>
|
||||
<td><strong>Documentation</strong></td>
|
||||
<td><a href="https://avinal.videolan.me/vlc-android-user/">VLC for Android User Documentation </a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Project Repository</strong>
|
||||
</td>
|
||||
<td><a href="https://code.videolan.org/avinal/vlc-android-user">Projects · Avinal Kumar / VLC for Android User Documentation</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Commits</strong>
|
||||
</td>
|
||||
<td><a href="https://code.videolan.org/avinal/vlc-android-user/-/commits/master">Commits · Avinal Kumar / VLC for Android User Documentation</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Issues/Discussions</strong>
|
||||
</td>
|
||||
<td><a href="https://code.videolan.org/avinal/vlc-android-user/-/issues">Issues · Avinal Kumar / VLC for Android User Documentation</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Merge Requests</strong>
|
||||
</td>
|
||||
<td><a href="https://code.videolan.org/avinal/vlc-android-user/-/merge_requests">Merge Requests · Avinal Kumar / VLC for Android User Documentation</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Since the Android port of VLC can be installed on Android
|
||||
Smartphones/Tablets, Android TVs, Amazon Fire Devices and Chromebooks
|
||||
too, a full documentation will cover these all devices. Although these
|
||||
are different form factors, the features provided on each of them is
|
||||
exactly the same and the same documentation can be used for all these
|
||||
devices. As of now only Smartphones/Tablets are covered. And later
|
||||
additional pages will be added to reference different features/User
|
||||
Interface. Regardless of this addition the current documentation can
|
||||
serve a major part for all these form factors. Completed/Remaining
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><strong>Chapters</strong>
|
||||
</td>
|
||||
<td><strong>Sections</strong>
|
||||
</td>
|
||||
<td><strong>Status</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Settings</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>General Settings
|
||||
<li>Interface
|
||||
<li>Video
|
||||
<li>Subtitles
|
||||
<li>Audio
|
||||
<li>Casting
|
||||
<li>Advanced
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>ALL COMPLETED</strong>
|
||||
<p>
|
||||
<strong>FOR ALL FORM FACTORS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Video</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Video Explorer
|
||||
<li>Video Player
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>COMPLETED FOR SMARTPHONES/TABLETS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Audio</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Audio Explorer
|
||||
<li>Audio Player
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>COMPLETED FOR SMARTPHONES/TABLETS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Browse</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Explorer
|
||||
<li>Local Network
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>ONLY SMB IN LOCAL NETWORK COMPLETED</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Installation</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Smartphones/Tablets
|
||||
<li>Android TV
|
||||
<li>Fire Devices
|
||||
<li>Chromebooks
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>COMPLETED FOR SMARTPHONES/TABLETS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>User Interface</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Smartphones/Tablets
|
||||
<li>Android TV
|
||||
<li>Fire Devices
|
||||
<li>Chromebooks
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>COMPLETED FOR SMARTPHONES/TABLETS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Support</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>FAQs
|
||||
<li>Help
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>IN PROGRESS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Guidelines</strong>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Contribution Guideline
|
||||
<li>Screenshot Guidelines
|
||||
<li>READMEs
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><strong>IN PROGRESS</strong>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## CHALLENGES
|
||||
|
||||
The major obstacle was to get screenshots for all form factors. Since
|
||||
screenshots were the major part of this documentation it was necessary
|
||||
to provide proper screenshots in each chapter and with every step. For
|
||||
Android TV and Smartphone this was solved by using emulators instead of
|
||||
actual devices, but to emulate the actual scenario in an emulator was
|
||||
sometimes very difficult. There were many occasions where I was not able
|
||||
to gather the exact information about devices other than
|
||||
smartphones/tables. Since all form factors share a common pool of
|
||||
features, my mentor suggested that I focus on smartphones/tables. And to
|
||||
create issues mentioning missing parts so that it could be solved later.
|
||||
|
||||
## THANKS
|
||||
|
||||
I want to thank my mentors for being supporting and helpful. I want to
|
||||
thank every person at VLC and Google who were involved in this whole
|
||||
process. Thanks and Congrats to my fellow writer Abhishek Pratap Singh.
|
||||
This was a great opportunity to learn and meet awesome people. I learned
|
||||
a lot about Sphinx, reStructured Text and many other things.
|
||||
|
||||
## ATTRIBUTION
|
||||
|
||||
- [Image by Tom Bigelajzen](https://images.videolan.org/images/goodies/day-of-the-cones-ex2.jpg)
|
||||
@@ -0,0 +1,172 @@
|
||||
---
|
||||
category: blogs
|
||||
date: 2023-03-16T20:47:00
|
||||
description: Tekton Results aims to help users logically group CI/CD workload history
|
||||
and separate out long term result storage away from the Pipeline controller.
|
||||
image: /images/tekton-results-wall.webp
|
||||
tags:
|
||||
- tekton
|
||||
- kubernetes
|
||||
- redhat
|
||||
- openshift
|
||||
- results
|
||||
title: Tekton Results to the Rescue
|
||||
---
|
||||
|
||||
What do you do with your Tekton Pipelines once it finishes? Depending on if it
|
||||
failed or passed, you may keep it to inspect the logs. For most of the users/organizations
|
||||
the simplest step is to keep the completed TaskRuns/PipelineRuns object on the
|
||||
cluster to retrieve the data later.
|
||||
|
||||
Imagine having thousands of runs and although a single TaskRun object takes very
|
||||
small space compared to the scale of a production cluster, but these little
|
||||
things add up quickly, and soon your cluster will be burdened with objects that
|
||||
probably no one will ever revisit. The organization/user is keeping them
|
||||
just-in-case if they want to see the logs and other data later.
|
||||
|
||||
Although in most of the cases there is a pruning policy that takes care of these
|
||||
objects. But there are multiple problems with this approach.
|
||||
|
||||
- This type of storage is not reliable and very difficult to query.
|
||||
- If the scale is massive, this could lead to destabilization of the cluster.
|
||||
- If you have a pruning policy, the completed objects are cleaned, and you lose all the associated data as well.
|
||||
|
||||
So, what is the solution, how can you save your pipelines' data without having to keep them on cluster?
|
||||
|
||||
## Introducing Tekton Results
|
||||
|
||||
As mentioned on the [project repository](https://github.com/tektoncd/results):
|
||||
|
||||
> Tekton Results aims to help users logically group CI/CD workload history and
|
||||
> separate out long term result storage away from the Pipeline controller. This
|
||||
> allows you to:
|
||||
>
|
||||
> - Provide custom Result metadata about your CI/CD workflows not available in
|
||||
> the Tekton TaskRun/PipelineRun CRDs (for example: post-run actions)
|
||||
> - Group related workloads together (e.g. bundle related TaskRuns and PipelineRuns into a single unit)
|
||||
> - Make long-term result history independent of the Pipeline CRD controller,
|
||||
> letting you free up etcd resources for Run execution.
|
||||
|
||||
In short, Tekton results archives the run data (called results) and logs to an
|
||||
external storage. Now you can safely prune completed TaskRuns/PipelineRuns and
|
||||
save run data and logs for a later visit. Let us see how actually Tekton Results
|
||||
works under the hood.
|
||||
|
||||
### How Tekton Results Works?
|
||||
|
||||
Tekton Results is composed of two main components.
|
||||
|
||||
- A **watcher** to listen to creation/update of PipelineRuns or TaskRuns.
|
||||
- An **API Server** to query the persistent storage for data.
|
||||
|
||||
In addition to that, Tekton Results needs a working database connection that can
|
||||
be a persistent storage on the same cluster or hosted externally such as RDS.
|
||||
If no external storage is attached, logs are also stored on a persistent storage
|
||||
on the cluster, you may use a S3 (or compatible) storage solution for that.
|
||||
|
||||
The lifecycle of a _result_ is as below:
|
||||
|
||||
1. The first step is to create a Tekton PipelineRun or TaskRun.
|
||||
2. The Watcher listens for any changes in the TaskRun or PipelineRun.
|
||||
3. On change, Watcher updates (or creates) a corresponding `Record` or `Result` using the Results API.
|
||||
Watcher adds annotations to the TaskRuns or PipelineRuns with proper identifiers. Watcher uses
|
||||
these annotations to decide if the `Result` has been created/updated/finished or not.
|
||||
4. You can now query the Results data using the API. If the run state is incomplete yet, the response
|
||||
from the API will indicate that as well via the status flag.
|
||||
5. Once the TaskRun/PipelineRun has been completed, you can safely prune the resource object.
|
||||
|
||||
## Installing Tekton Results
|
||||
|
||||
Installing Tekton Results is easy. You can use Kubernetes or OpenShift cluster, for this particular
|
||||
demonstration, I will be using a Kind cluster and a local database.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) for a local Kubernetes cluster.
|
||||
- [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)
|
||||
- [curl](https://curl.se/download.html) for querying the API.
|
||||
- [OpenSSL](https://www.openssl.org/source/) for generating certificates.
|
||||
|
||||
### Let's start
|
||||
|
||||
1. Create a Kind Cluster
|
||||
|
||||
```bash
|
||||
kind create cluster --name tekton-results
|
||||
kind export kubeconfig --name tekton-results
|
||||
```
|
||||
|
||||
2. [Tekton Pipelines](https://github.com/tektoncd/results) must be installed on
|
||||
the cluster. You can install it using the command below.
|
||||
|
||||
```bash
|
||||
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
|
||||
```
|
||||
|
||||
3. Generate a database root password and store as a Kubernetes Secret. If you are using an external
|
||||
database, prove the credential for the same. Here is a bare minimum requirement as YAML.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: tekton-results-postgres
|
||||
namespace: tekton-pipelines
|
||||
type: Opaque
|
||||
data:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: <your-password>
|
||||
```
|
||||
|
||||
You can directly use the command line as well:
|
||||
|
||||
```bash
|
||||
kubectl create secret generic tekton-results-postgres \
|
||||
--namespace="tekton-pipelines" \
|
||||
--from-literal=POSTGRES_USER=postgres \
|
||||
--from-literal=POSTGRES_PASSWORD=$(openssl rand -base64 20)
|
||||
```
|
||||
|
||||
4. Generate a cert/key pair. You may use any cert management software to generate this. You can even
|
||||
use cluster generated certs.
|
||||
|
||||
```bash
|
||||
openssl req -x509 \
|
||||
-newkey rsa:4096 \
|
||||
-keyout key.pem \
|
||||
-out cert.pem \
|
||||
-days 365 \
|
||||
-nodes \
|
||||
-subj "/CN=tekton-results-api-service.tekton-pipelines.svc.cluster.local" \
|
||||
-addext "subjectAltName = DNS:tekton-results-api-service.tekton-pipelines.svc.cluster.local"
|
||||
```
|
||||
|
||||
5. Create another TLS Kubernetes Secret with the name `tekon-results-tls` to store the cert/key pair.
|
||||
|
||||
```bash
|
||||
kubectl create secret tls -n tekton-pipelines tekton-results-tls \
|
||||
--cert=cert.pem \
|
||||
--key=key.pem
|
||||
```
|
||||
|
||||
6. Install Tekton Results
|
||||
|
||||
```bash
|
||||
kubectl apply -f https://storage.googleapis.com/tekton-releases/results/latest/release.yaml
|
||||
```
|
||||
|
||||
7. You can check the status of the deployments using the below command. Do not worry
|
||||
if some deployments show `CrashLoopBackOff`. Wait for some time, and
|
||||
they should all be running.
|
||||
|
||||
```bash
|
||||
kubectl get pods -n tekton-pipelines --watch
|
||||
```
|
||||
|
||||
Once all deployments are ready, we can start creating some TaskRuns/PipelineRuns. In the next part
|
||||
of this blog, I will explain how to retrieve data from Tekton Results. Happy Reading.
|
||||
|
||||
## References
|
||||
|
||||
- [Tekton Results](https://github.com/tektoncd/results)
|
||||
- [Tekton Pipelines](https://github.com/tektoncd/pipeline)
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
category: blogs
|
||||
date: 2021-01-04T21:47:00
|
||||
image: /images/hrt-singapore.webp
|
||||
tags:
|
||||
- HRT
|
||||
- hudsonrivertrading
|
||||
- interview
|
||||
- internship
|
||||
title: HRT (Hudson River Trading) Systems Internship Interview Experience
|
||||
---
|
||||
|
||||
I applied for **Systems Internship - Summer 2021** back in December 2020
|
||||
at [Hudson River Trading](https://www.hudsonrivertrading.com), New
|
||||
York. The internship description was: -
|
||||
|
||||
> We are looking for highly motivated students who are eager to learn
|
||||
> and excited about systems to join us for our summer internship
|
||||
> program. As a systems intern, you may have the opportunity to work on
|
||||
> projects in the following areas:
|
||||
>
|
||||
> - Programming/scripting (Golang, Python, C++, C)
|
||||
> - FOSS development
|
||||
> - HPC, Cluster computing
|
||||
> - System Administration
|
||||
> - Linux, Debian
|
||||
> - Linux-based computer security
|
||||
> - Data Storage
|
||||
> - Large deployment or config management
|
||||
|
||||
The first step was a coding test on the Codility platform. If you have
|
||||
used any of the online coding platforms, this is similar. It was a
|
||||
`2.5 hrs (90 mins)` test consisting of 3 questions. They let you use
|
||||
`online references (documentation, man pages, etc.)` but **do not copy
|
||||
the code** as it will highly reduce your chances of qualifying for this
|
||||
first stage. You can choose between **C/C++**, **Python** and **Golang**
|
||||
(no Java 😪).
|
||||
|
||||
Questions were clear and of medium level. But they were designed in such
|
||||
a way that you must know the basics before you could attempt. Also, they
|
||||
expected a clear and concise approach. Two of the most important points
|
||||
in their instructions were: -
|
||||
|
||||
> - While correctness and performance are the most important factors
|
||||
> for evaluation, we will take test duration into account as well.
|
||||
> - Please understand that this test is meant to be challenging. A
|
||||
> perfect score is not necessary to move on to future interview
|
||||
> rounds, so do the best you can!
|
||||
|
||||
So, you must be near perfect in your approach as well as on time. I did
|
||||
them kind of quickly. They will show you a summary of your submission
|
||||
but not the results. It will take almost 2 weeks to get back to you for
|
||||
further steps.
|
||||
|
||||
Next, I received a mail invitation for a telephonic interview. **This
|
||||
interview will last about 45 minutes and will be technical but will not
|
||||
require coding. Interview topics may include your background,
|
||||
programming languages, and Unix/Linux concepts**. Once you receive this
|
||||
mail you can then decide a time slot for an interview.
|
||||
|
||||
I was not sure what they will ask if this is not a coding interview. The
|
||||
interviewer was very polite, and he was explaining the questions too.
|
||||
Questions were not so tricky but practical and real-life. Since it was
|
||||
**not for SDE role**, the questions were mostly related to Linux/Unix,
|
||||
C++ (mainly pointers and memory), Python/Bash scripting, automation,
|
||||
knowledge of tools (IDEs, Editors, System Administration Tools) and
|
||||
previous experiences. The interview would often explain why he is asking
|
||||
this question, this was very nice. Then some common interview questions,
|
||||
why do you want to work for this role? What makes you fit for this role?
|
||||
etc.
|
||||
|
||||
One thing that I want to point out is that the interviewer was
|
||||
repeatedly checking my resume, and for the most part he did not ask
|
||||
anything that was not on my resume. So, my tip is to create a nice
|
||||
resume with genuine work/tool experiences. And when you are applying for
|
||||
such a role, it would be helpful if you mention mathematics or other
|
||||
courses that you have taken. *Do not lie on your resume*. They will
|
||||
easily catch that.
|
||||
|
||||
The other thing is to keep your words short and clear; I was not great
|
||||
at communication, but you can be. If the interviewer allows then use
|
||||
examples for the things you cannot explain. I used nice examples. At
|
||||
last, he gave me short feedback on how well I performed.
|
||||
|
||||
At last, I want to point out things I should not have done. The first
|
||||
is, I did not ask much about the role, you must do this at least once.
|
||||
Second, I am talkative, I do not know if the interviewer was not faking
|
||||
his expressions (because he would often discuss in-depth), but not all
|
||||
interviewers will be the same. So, do not talk too much, nor too less.
|
||||
At last work on your communication skill, mostly how you to present
|
||||
things and how to answer technical as well as behavioral questions. I
|
||||
was not fluent, but my way of presentation might have saved me.
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
title: Setup Remark42 from scratch on Oracle Cloud
|
||||
draft: true
|
||||
---
|
||||
Reference in New Issue
Block a user