Skip to content

Commit ae1982b

Browse files
committed
chore: move external post links to references section
1 parent 129abf2 commit ae1982b

8 files changed

+64
-37
lines changed

_posts/2011/2011-08-30-fine-tuning-the-autostart-in-ubuntu-server.md

+17-17
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ By editing the script and leaving only the minimum necessary, we get a file with
7979
# Default-Start: 2 3 4 5
8080
# Default-Stop: 0 1 6
8181
# Short-Description: Start and stop execution state of VBox virtual machines
82-
# Description: This script is used to start and stop of VBox virtual machines
82+
# Description: This script is used to start and stop of VBox virtual machines
8383
# using System-V on Ubuntu Server.
8484
# This file should be placed in /etc/init.d
8585
### END INIT INFO
@@ -111,7 +111,7 @@ case “$1” in
111111
;;
112112
stop)
113113
perform_save
114-
;;
114+
;;
115115
*)
116116
echo “Usage: /etc/init.d/agent {start|stop}”
117117
exit 3
@@ -138,18 +138,18 @@ Adding system startup for /etc/init.d/agent ...
138138
After the reboot, we can verify that the virtual machine startup command was executed. Let's look at the startup report:
139139

140140
```bash
141-
kungfux@itworks:~$ cat /var/log/boot.log
142-
fsck from util-linux-ng 2.17.2
143-
/dev/sda1: clean, 92526/4751360 files, 2565789/18975488 blocks
144-
* Starting Jenkins Continuous Integration Server jenkins
145-
* Starting No-IP.com dynamic address update noip2
146-
* Not starting internet superserver: no services enabled
147-
* Starting Postfix Mail Transport Agent postfix
148-
* Starting bittorrent daemon transmission-daemon
149-
* Starting VirtualBox kernel modules
150-
* Starting NTP server ntpd
151-
* Starting ftp server proftpd
152-
* Starting web server apache2
141+
kungfux@itworks:~$ cat /var/log/boot.log
142+
fsck from util-linux-ng 2.17.2
143+
/dev/sda1: clean, 92526/4751360 files, 2565789/18975488 blocks
144+
* Starting Jenkins Continuous Integration Server jenkins
145+
* Starting No-IP.com dynamic address update noip2
146+
* Not starting internet superserver: no services enabled
147+
* Starting Postfix Mail Transport Agent postfix
148+
* Starting bittorrent daemon transmission-daemon
149+
* Starting VirtualBox kernel modules
150+
* Starting NTP server ntpd
151+
* Starting ftp server proftpd
152+
* Starting web server apache2
153153
* Starting Agent VM
154154
```
155155

@@ -163,8 +163,8 @@ kungfux@itworks:~$ /etc/init.d/agent start
163163

164164
As you can see from this example, the Ubuntu operating system provides many ways to control the start and stop of services and programs. In startup scripts, you can describe dependencies on other services using "Required-Start/Required-Stop" sections, and the script itself can be of any complexity, allowing you to fine-tune any startup configuration.
165165

166-
> This material was written for the "First contest of Russian-language articles for Ubuntu OS 2011" (konkurs.ubuntu.ru) and published on [open-life.org](https://open-life.org/blog/1862.html)
167-
{: .prompt-tip }
168-
169166
![Article competition diploma](diploma.webp)
170167
_Article competition diploma._
168+
169+
> This material was written for the "First contest of Russian-language articles for Ubuntu OS 2011" (konkurs.ubuntu.ru) and published on [open-life.org](https://open-life.org/blog/1862.html)
170+
{: .prompt-tip }

_posts/2021/2021-06-14-test-framework-for-microsoft-office-add-in.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Build a test framework that can:
2929
- Support simultaneous work with multiple instances of Office applications
3030

3131
## Solution
32-
The test framework is built using [Selenium](https://www.selenium.dev/) for web application part and [FlaUI](https://github.com/FlaUI/FlaUI) for UI automation of Microsoft Office applications. I chose FlaUI because it supports UIA3 automation, which works best for WPF applications.
32+
The test framework is built using Selenium for web application part and FlaUI for UI automation of Microsoft Office applications. I chose FlaUI because it supports UIA3 automation, which works best for WPF applications.
3333

3434
The solution includes the following projects:
3535
- `Office`, which is responsible for launching applications and creating documents such as read-only and protected documents.
@@ -255,3 +255,7 @@ public abstract class DocumentBase: IDocument
255255

256256
## Conclusion
257257
While the solution worked, it was not without its drawbacks. Due to the nature of desktop automation, it was not possible to run tests in parallel mode on the same machine/session, or to run tests in headless mode. Each CI agent required additional configuration to run these tests. In addition, these tests were quite slow because it takes time to run a process as heavy as an MS Office application. Therefore, we had to keep an eye on the scenarios we were automating to maintain a small test suite. The focus was on other testing solutions, while scenarios that needed to run in the Microsoft Office environment had to be written using this framework.
258+
259+
## References
260+
- [Selenium](https://www.selenium.dev/)
261+
- [FlaUI](https://github.com/FlaUI/FlaUI)

_posts/2021/2021-09-30-measure-application-startup-performance.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ There are solutions for measuring application performance, such as integrated or
3131
I had to accept the fact that I needed a custom solution. During my research, I found an interesting example of an application that aims to test the startup performance of desktop applications by launching the application and detecting the point at which the application becomes visible and waits for idle input.
3232

3333
![PassMark AppTimer](app-timer.webp)
34-
_[PassMark AppTimer](https://www.passmark.com/products/apptimer/)_
34+
_PassMark AppTimer_
3535

3636
This was pretty close to what I was looking for, so I decided this was a good starting point for my idea. However, I had to work around its limitations: it won't work for complex applications and it can't be extended to add additional features.
3737

@@ -209,3 +209,6 @@ To perform tests, this solution requires a Windows server running as a CI agent
209209

210210
* Unsuitable for all cases
211211
The solution is designed based on analysis of target applications and may not work for other applications. It's completely up to the application implementation, and plug-in initialization can be fully parallel or delayed until the main process is fully loaded, so you won't affect startup performance in any way.
212+
213+
## References
214+
- [PassMark AppTimer](https://www.passmark.com/products/apptimer/)

_posts/2021/2021-10-15-choosing-a-selector-strategy.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ image: cover.webp
1515
What is a selector? In terms of web automation testing, a selector refers to the mechanism or technique used to locate and identify an element on a web page. Common selector types include ID, Name, Class, XPath, CSS, Link text etc.
1616

1717
| Selector type | Example |
18-
|---------------|--------------------------------|
18+
| ------------- | ------------------------------ |
1919
| ID | `#sumbit` |
2020
| Name | `input[name='submit']` |
2121
| CSS | `.signIn` |
@@ -42,6 +42,10 @@ Let me take a step back from the technical details of locators and focus more on
4242
The selectors I mentioned earlier, which we use to find elements on a page, were designed primarily for development, not testing. However, as testers, we should focus more on how real users perceive and interact with the UI than on the technical details of the implementation. Our locators and tests should be able to catch any changes in the UI that break the expected user flow and experience, not just technical bugs. The goal is to ensure that the UI works as intended for the end user, not to validate the code.
4343

4444
## Solution
45-
There are frameworks that support a different approach to writing UI tests. They are built from the ground up for testing and focus more on user interaction, such as the [Testing Library](https://testing-library.com/docs/queries/about/#priority) and [Playwright](https://playwright.dev/docs/locators). They suggest using specific functions like `getByRole()`, `getByText()`, etc. that mimic how real users perceive the elements, reflecting the experience of visual/mouse users as well as those using assistive technology like screen readers. I think this is a great step towards a way that is closer to how software is used by end users, while making selectors resilient to change.
45+
There are frameworks that support a different approach to writing UI tests. They are built from the ground up for testing and focus more on user interaction, such as the Testing Library and Playwright. They suggest using specific functions like `getByRole()`, `getByText()`, etc. that mimic how real users perceive the elements, reflecting the experience of visual/mouse users as well as those using assistive technology like screen readers. I think this is a great step towards a way that is closer to how software is used by end users, while making selectors resilient to change.
4646

47-
Here is an example of how this could be done using Testing Library query: `getByRole('button', { name: 'Submit' })`.
47+
Here is an example of how this could be done using Testing Library query: `getByRole('button', { name: 'Submit' })`.
48+
49+
## References
50+
- [Testing Library](https://testing-library.com/docs/queries/about/#priority)
51+
- [Playwright](https://playwright.dev/docs/locators)

_posts/2021/2021-11-10-spa-web-application-for-small-businesses.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ This was my longest project so far, which started somewhere in 2008 and ended in
1616

1717
The very first version I built in 2008 was a desktop application using C# and WinForms with a simple Microsoft Access database. It had a single screen to add income/expenses and calculate the total, average per year, or per selected range. It was easy to build and super usable for my dad.
1818

19-
Later, in 2015, I updated the application to use WPF for modern UI and SQLite database. This version had more features like employee directory, salary management and basic charts. It was also packaged using InnoSetup to create a simple Windows installer. This served him well for many years. It is available on [GitHub](https://github.com/kungfux/business-accounting-desktop).
19+
Later, in 2015, I updated the application to use WPF for modern UI and SQLite database. This version had more features like employee directory, salary management and basic charts. It was also packaged using InnoSetup to create a simple Windows installer. This served him well for many years.
2020

2121
In 2021, he told me that what he wanted most was to be able to access the application from any device, not just his computer.
2222

@@ -30,8 +30,6 @@ In 2021, he told me that what he wanted most was to be able to access the applic
3030
- Preserve functionality currently available in the desktop application
3131

3232
## Solution
33-
Source code is available on [GitHub](https://github.com/kungfux/business-accounting-cloud)
34-
3533
At first I thought about separate desktop and mobile applications and how to synchronize data between them. However, I decided to simplify things and go with an SPA application that could run in the browser on any device.
3634

3735
### Database
@@ -150,3 +148,7 @@ contextBridge.exposeInMainWorld('isRunningInsideDesktopApp', {
150148
- The frontend application bundle was quite large for such a small application. I wish I had spent time thinking about how to break it up into multiple pieces so that the user doesn't have to load the whole bundle if they don't need it.
151149
- I wish I had taken the time to make it a PWA application so my dad could keep track of his finances even when he is not connected to the Internet.
152150
- Even after all these years and multiple versions of the application, my dad said he loved the very first version of the program because it allowed him to enter values with a single click and gave him the big picture for the entire year on the same application screen. It was an interesting thing to think about. However, he enjoyed being able to access his finances from anywhere and on any device.
151+
152+
## References
153+
- [Business Accounting Desktop](https://github.com/kungfux/business-accounting-desktop)
154+
- [Business Accounting Cloud](https://github.com/kungfux/business-accounting-cloud)

_posts/2022/2022-10-18-automation-by-image-search.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ I once had to deal with a Unity mini-game that drew graphics on a screen. The on
2323
## Solution
2424
Stack used:
2525
- Python
26-
- [PyAutoGUI](https://pypi.org/project/PyAutoGUI/)
27-
- [python-imagesearch](https://pypi.org/project/python-imagesearch/)
26+
- PyAutoGUI
27+
- python-imagesearch
2828

2929
We need to find the screen location of items to interact with. There are some rules were given like game character enjoys only yellow fruits, so user had to click on yellow fruits on screen.
3030

@@ -88,4 +88,8 @@ Even though it was a simple game, this approach allowed me to automate repetitiv
8888

8989
- Image recognition is relatively slow. The image recognition area should be as small as possible to avoid wasting processing time during execution. Each asset should be as small as possible for the same reason. Assets should be sorted and used in order from most expected to least expected. This improves the average execution time.
9090
- No error thrown on failed click or misclick.
91-
- Assets are sensitive to any visual changes. Light/dark themes, UI updates can break image search. So you may need to prepare assets for both or have strict requirements for the automation execution environment. Hence, it will work poorly with animated elements and may fail due to element visual state changes such as hover, active, etc.
91+
- Assets are sensitive to any visual changes. Light/dark themes, UI updates can break image search. So you may need to prepare assets for both or have strict requirements for the automation execution environment. Hence, it will work poorly with animated elements and may fail due to element visual state changes such as hover, active, etc.
92+
93+
## References
94+
- [PyAutoGUI](https://pypi.org/project/PyAutoGUI/)
95+
- [python-imagesearch](https://pypi.org/project/python-imagesearch/)

_posts/2023/2023-09-20-browser-extension-to-add-what-is-missing.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,15 @@ Each browser company maintains its own extension store where extension developer
130130
- There is good documentation out there for extension developers, which means that companies would love for people to build extensions.
131131
- Hopefully, I have been able to work around the limitations and imperfections of the test case management web application. While it has been fun, it would be really nice if the management, developers and testers of the original application would think about how their product is being used and make it just a little bit better, I would never have to spend time doing all this. This is a good lesson and reminder for all of us.
132132

133-
## Extras
134-
You can find this project repository on [GitHub](https://github.com/kungfux/qtest-manager-assistant)
135-
136-
[![Firefox Add-ons](get-addon-firefox.webp)](https://addons.mozilla.org/en-US/firefox/addon/assistant-for-qtest-manager/)
137-
[![Chrome Web Store](get-addon-chrome.webp)](https://chrome.google.com/webstore/detail/pnbnfgjbennnjlajgpoajfilinkdpiaf)
138-
139133
## Demo
140134
![Feature: Highlight changes](https://github.com/kungfux/qtest-manager-assistant/raw/dev/docs/highlight.gif)
141135
_Feature: Highlight changes_
142136

143137
![Feature: Copy link and details](https://github.com/kungfux/qtest-manager-assistant/raw/dev/docs/copy.gif)
144-
_Feature: Copy link and details_
138+
_Feature: Copy link and details_
139+
140+
## References
141+
- [Source code](https://github.com/kungfux/qtest-manager-assistant)
142+
143+
[![Firefox Add-ons](get-addon-firefox.webp)](https://addons.mozilla.org/en-US/firefox/addon/assistant-for-qtest-manager/)
144+
[![Chrome Web Store](get-addon-chrome.webp)](https://chrome.google.com/webstore/detail/pnbnfgjbennnjlajgpoajfilinkdpiaf)

_posts/2024/2024-05-26-development-containers.md

+12-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ We deploy and run applications in Docker containers, which gives us many benefit
2323

2424
The idea is to use the Docker container as the development environment during the development process. In theory, this helps to completely eliminate some of the problems associated with configuring the development environment.
2525

26-
The good news is that development containers are already widely supported by [VS Code](https://code.visualstudio.com/docs/devcontainers/containers), [Rider](https://www.jetbrains.com/help/rider/Connect_to_DevContainer.html), [Visual Studio](https://learn.microsoft.com/en-us/visualstudio/containers/?view=vs-2022) and others, but with limited support mostly. There are platforms that allow you to spin up development containers remotely, such as [GitHub](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers). This all possible due to the Open Development Container [Specification](https://containers.dev/implementors/spec/).
26+
The good news is that development containers are already widely supported by Visual Studio, VS Code, Rider, and others, but with limited support mostly. There are platforms that allow you to spin up development containers remotely, such as GitHub. This all possible due to the Open Development Container Specification.
2727

2828
### Configuration
2929

@@ -68,7 +68,7 @@ flowchart LR
6868

6969
Devcontainer images are a bit different from typical images. Devcontainer images come with pre-built tools and runtime stack specific to development container image, also they are not designed to be used for hosting applications in production as permissions and OS configuration could be adjusted to make it easier to use. But what makes a huge difference is the Visual Studio Code Server that runs inside the container, which allows you to run formatters and linters, use a predefined list of Visual Studio Code extensions, and even scan the container output and integrate all of this with the IDE running locally. So you are basically using the IDE as a terminal to connect to the remote development environment.
7070

71-
There are a number of ready-made development containers [available](https://mcr.microsoft.com/en-us/catalog?search=dev%20container). You can create a [custom one](https://github.com/devcontainers/template-starter) including [custom features](https://github.com/devcontainers/feature-starter) for devcontainers. Features are self-contained units of installation code and development container configurations that can be installed along with the primary image, allowing you to mix .NET and NodeJS in a single devcontainer configuration, for example, or use them to extend your existing `Dockerfile` definition just for development purposes.
71+
There are a number of ready-made development containers available. You can create a custom one including custom features for devcontainers. Features are self-contained units of installation code and development container configurations that can be installed along with the primary image, allowing you to mix .NET and NodeJS in a single devcontainer configuration, for example, or use them to extend your existing `Dockerfile` definition just for development purposes.
7272

7373
## Benefits
7474

@@ -100,3 +100,13 @@ There is no ideal solution. Like any other, it has some drawbacks.
100100
## Conclusion
101101

102102
Would I recommend using it? Well, it depends. There are no good or bad tools, and this one is no exception. I believe it needs more time to discover and reduce common issues related to it's usage, IDE support and can become a great seamless one-click way to spin up development environment. While it looks feature-rich even today, it is necessary to compare all the pros and cons for a particular project to make a proper decision. Nevertheless, I would recommend everyone to give it a try and integrate it into a smaller project to see how easy development environment management can be.
103+
104+
## References
105+
- [Microsoft Visual Studio](https://learn.microsoft.com/en-us/visualstudio/containers/?view=vs-2022)
106+
- [Microsoft Visual Studio Code](https://code.visualstudio.com/docs/devcontainers/containers)
107+
- [JetBrains Rider](https://www.jetbrains.com/help/rider/Connect_to_DevContainer.html)
108+
- [Introduction to dev containers by GitHub](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)
109+
- [Development Container Specification](https://containers.dev/implementors/spec/)
110+
- [Official Microsoft images](https://mcr.microsoft.com/en-us/catalog?search=dev%20container)
111+
- [Dev Container Templates: Self Authoring Guide](https://github.com/devcontainers/template-starter)
112+
- [Dev Container Features: Self Authoring Template](https://github.com/devcontainers/feature-starter)

0 commit comments

Comments
 (0)