johnpili.com Ads.txt file
<!DOCTYPE html>
<html lang="en" dir="auto">
<head>
<meta name="generator" content="Hugo 0.147.0"><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<title>John Pili - Software Developer, Blogger and an aspiring Entrepreneur.</title>
<meta name="description" content="Software Developer, Blogger and an aspiring Entrepreneur.">
<meta name="author" content="">
<link rel="canonical" href="https://johnpili.com/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.css" rel="preload stylesheet" as="style">
<link rel="icon" href="https://johnpili.com/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://johnpili.com/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://johnpili.com/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://johnpili.com/apple-touch-icon.png">
<link rel="mask-icon" href="https://johnpili.com/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" type="application/rss+xml" href="https://johnpili.com/index.xml">
<link rel="alternate" type="application/json" href="https://johnpili.com/index.json">
<link rel="alternate" hreflang="en" href="https://johnpili.com/">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
</noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" integrity="sha512-MV7K8+y+gLIBoVD59lQIYicR65iaqukzvf/nwasF0nqhPay5w/9lJmVM2hMDcnK1OnMGCdVK+iQrJ7lzPJQd1w==" crossorigin="anonymous" referrerpolicy="no-referrer" /><meta property="og:url" content="https://johnpili.com/">
<meta property="og:site_name" content="John Pili - Software Developer, Blogger and an aspiring Entrepreneur.">
<meta property="og:title" content="John Pili - Software Developer, Blogger and an aspiring Entrepreneur.">
<meta property="og:description" content="Software Developer, Blogger and an aspiring Entrepreneur.">
<meta property="og:locale" content="en-us">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="John Pili - Software Developer, Blogger and an aspiring Entrepreneur.">
<meta name="twitter:description" content="Software Developer, Blogger and an aspiring Entrepreneur.">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "John Pili - Software Developer, Blogger and an aspiring Entrepreneur.",
"url": "https://johnpili.com/",
"description": "Software Developer, Blogger and an aspiring Entrepreneur.",
"logo": "https://johnpili.com/favicon.ico",
"sameAs": [
]
}
</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-N55N5TVM0G" type="b21a9bc0770d192bc9755636-text/javascript"></script>
<script type="b21a9bc0770d192bc9755636-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-N55N5TVM0G');
</script></head>
<body class="list" id="top">
<header class="header">
<nav class="nav">
<div class="logo">
<a href="https://johnpili.com/" accesskey="h" title=" (Alt + H)">
<img src="https://johnpili.com/images/johnpili.svg" alt="" aria-label="logo"
height="30"> </a>
<div class="logo-switches">
</div>
</div>
<ul id="menu">
<li>
<a href="https://johnpili.com/" title="Home">
<span class="active">Home</span>
</a>
</li>
<li>
<a href="https://johnpili.com/category/go/" title="Go">
<span>Go</span>
</a>
</li>
<li>
<a href="https://johnpili.com/category/linux/" title="Linux">
<span>Linux</span>
</a>
</li>
<li>
<a href="https://johnpili.com/tools" title="Online Tools">
<span>Online Tools</span>
</a>
</li>
<li>
<a href="https://johnpili.com/about/" title="About Me">
<span><i class='fa fa-user'></i></span>
</a>
</li>
<li>
<a href="https://johnpili.com/search" title="Search (Alt + /)" accesskey=/>
<span><i class='fa fa-search'></i></span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/git-cheat-sheet.webp" alt="git-cheat-sheet.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Git Cheat Sheet
</h2>
</header>
<div class="entry-content">
<p>Creating or cloning a Repository git init Initializes a new Git repository in the current directory git clone https://git[.]johnpili[.]com/path/to/repo.git Clones a repository using HTTPS protocol from a remote location git clone ssh://git[.]johnpili[.]com/path/to/repo.git Clones a repository using SSH protocol from a remote location git clone git://git[.]johnpili[.]com/path/to/repo.git Clones a repository using Git protocol from a remote location git clone ~/handler Clones a local repository from the home directory’s handler folder git clone –branch feature/query-loader https://git[.]johnpili[.]com/path/to/repo.git Clones a specific branch (feature/query-loader) from a remote repository Staging Area git status Shows the status of files in the working directory and staging area git add main.go Adds the specific file ‘main.go’ to the staging area git add . Adds all new and modified files in the current directory to the staging area git add environment Adds the ’environment’ directory or file to the staging area git rm main.go Removes ‘main.go’ from both the working directory and staging area git mv config.xml environment Moves ‘config.xml’ to the ’environment’ directory and stages the change git mv config.xml dev-config.xml Renames ‘config.xml’ to ‘dev-config.xml’ and stages the change git reset Unstages all files, keeping the working directory unchanged git reset main.go Unstages the specific file ‘main.go’, keeping the working directory unchanged git diff config.xml Shows unstaged changes in ‘config.xml’ compared to the staging area Commits: Creating Snapshots git commit Opens default editor to write a commit message and create a new commit git commit -m “Initial commit” Creates a new commit with the specified message without opening an editor git commit -am “Message” Stages all modified tracked files and commits them with the specified message git commit –amend Modifies the last commit by adding staged changes and/or editing the commit message git tag -a v2025.1 ef5bb78 -m “Release version 2025.1” Creates an annotated tag for commit ef5bb78 with a specified message without editor git tag Lists all tags in the repository Commit Logs git log Shows commit history with full commit messages git log -3 Shows only the last 3 commits git log –stat Shows commit history with files changed and number of modifications git log –before=“2025-01-21” Shows commits made before January 21, 2025. The Date formats in and are flexible (e.g., “2025-01-21”, “3 days ago”, “yesterday”) git log –after=“2025-01-15” Shows commits made after January 15, 2025 git log -p main.go Shows commit history with patches (changes) for main.go file git log –grep “Camunda” Shows commits whose message contains the word “Camunda”. --grep is case-sensitive by default; use -i flag for case-insensitive search git diff ef5bb78 ab0c0df Shows differences between two specific commits git show ab0c0df Shows details of a specific commit (changes, message, author, etc.) git show ab0c0df main.go Shows changes made to main.go file in the specific commit Branching git branch Lists all local branches (* marks current branch) git branch feature/user-login Creates a new branch named ‘feature/user-login’ at current position git checkout feature/query-loader Switches to existing branch ‘feature/query-loader’ git checkout -b feature/query-loader Creates and switches to new branch ‘feature/query-loader’ git switch -c feature/query-loader A modern alternative to git checkout.Creates and switches to new branch ‘feature/query-loader’ git branch -m feature/backdoor Renames current branch to ‘feature/backdoor’ git merge develop Merges ‘develop’ branch into current branch git branch -d feature/backdoor Deletes branch ‘feature/backdoor’ (if fully merged) git branch -D feature/backdoor Forces deletion of branch ‘feature/backdoor’ (even if not merged) git diff feature/query-loader develop Shows differences between ‘feature/query-loader’ and ‘develop’ branches git diff feature/query-loader main.go Shows changes to main.go file in ‘feature/query-loader’ vs current branch git branch –merged Lists branches merged into current branch git branch –no-merged Lists branches not yet merged git branch -v Shows last commit on each branch git branch -r Lists remote branches git branch -a Lists all branches (local and remote) git log –graph –all Shows commit history of all branches with ASCII graph visualization git log –graph –all –oneline A compact visualization of --graph Rebase git rebase develop Reapplies your current branch’s commits on top of the develop branch git rebase –abort Cancels an in-progress rebase and returns to the state before rebase started git rebase –continue Continues the rebase process after resolving conflicts git rebase -i Opens interactive rebase mode, allowing you to modify, reorder, or squash commits Important: Rebasing rewrites commit history, so it should generally be avoided on commits that have been pushed to shared repositories unless you’re absolutely sure about the implications.
...</p>
</div>
<footer class="entry-footer"><span title='2025-04-27 13:19:00 +0200 CEST'>April 27, 2025</span></footer>
<a class="entry-link" aria-label="post link to Git Cheat Sheet" href="https://johnpili.com/git-cheat-sheet/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/change-microsoft-sql-server-data-location.webp" alt="Change Microsoft SQL Server Data Location">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Change Microsoft SQL Server Data Location
</h2>
</header>
<div class="entry-content">
<p>Let’s say you have an existing Microsoft SQL data and want to move it to a
different disk or directory. Running the query below shows the logical name and the file location of your schema.
SELECT name AS FileLogicalName, physical_name AS FileLocation FROM sys.master_files WHERE database_id = DB_ID('HR'); Existing Location FileLogicalName FileLocation HR C:\MSSQL_DATA\OldPath\HR.mdf HR_log C:\MSSQL_DATA\OldPath\HR.ldf Target New Location FileLogicalName FileLocation HR D:\MSSQL_DATA\MSSQL15.MSSQLSERVER\MSSQL\Data\HR.mdf HR_log D:\MSSQL_DATA\MSSQL15.MSSQLSERVER\MSSQL\Data\HR.0.ldf Steps to move the database files Take the database offline
...</p>
</div>
<footer class="entry-footer"><span title='2025-03-28 01:41:00 +0100 CET'>March 28, 2025</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Change Microsoft SQL Server Data Location" href="https://johnpili.com/change-microsoft-sql-server-data-location/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/recursively-delete-files-with-a-specific-file-extension.webp" alt="recursively-delete-files-with-a-specific-file-extension.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Recursively delete files with a specific file extension
</h2>
</header>
<div class="entry-content">
<p>Delete files with specified file extension recursively. This is useful when you want to remove those temporary files or those unwanted auto-generated artifacts inside nested folders.
Be careful when using these commands because it will delete files permanently
Linux Bash find . -type f -name "*.tmp" -delete find . -type f -name "*.tmp" -exec rm -v "{}" + Windows Powershell Get-ChildItem * -Include *.tmp -Recurse | Remove-Item </p>
</div>
<footer class="entry-footer"><span title='2024-10-27 10:41:00 +0100 CET'>October 27, 2024</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Recursively delete files with a specific file extension" href="https://johnpili.com/recursively-delete-files-with-a-specific-file-extension/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/using-unix-domain-socket-in-go.webp" alt="using-unix-domain-socket-in-go.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Using Unix Domain Socket in Go
</h2>
</header>
<div class="entry-content">
<p>You can use Unix Domain Socket aka AF_UNIX for your interprocess communication. Previously, It was only available in a Linux/Unix operating system until Microsoft added it in Microsoft Windows in the beginning of Insider build 17063.
It offers better throughput and improved security
package main import ( "log" "net" "net/http" "os" "os/signal" "syscall" ) func main() { socketPath := "uds.sock" socket, err := net.Listen("unix", socketPath) if err != nil { log.Fatal(err) } c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func(p string) { <-c if err := os.Remove(p); err != nil { os.Exit(1) } os.Exit(0) }(socketPath) m := http.NewServeMux() m.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("GET...")) }) m.HandleFunc("POST /", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("POST...")) }) m.HandleFunc("PUT /", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("PUT...")) }) m.HandleFunc("DELETE /", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("DELETE...")) }) if err := http.Serve(socket, m); err != nil { log.Fatal(err) } } Source Code https://github.com/johnpili/go-using-unix-domain-socket</p>
</div>
<footer class="entry-footer"><span title='2024-02-14 12:00:00 +0100 CET'>February 14, 2024</span></footer>
<a class="entry-link" aria-label="post link to Using Unix Domain Socket in Go" href="https://johnpili.com/using-unix-domain-socket-in-go/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/check-jpa-query-type.webp" alt="Check JPA Query Type">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Check JPA Query Type
</h2>
</header>
<div class="entry-content">
<p>I am developing a repository as a service application. An application that let users create their endpoints with queries via a web interface. This application uses either Hibernate or Eclipselink as a JPA provider. The challenge is to check if the supplied user string (query) is a native SQL or a JPQL and that Eclipselink and Hibernate handles this differently, so I decided to wrap it behind this simple checker.
...</p>
</div>
<footer class="entry-footer"><span title='2024-01-28 13:01:00 +0000 UTC'>January 28, 2024</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Check JPA Query Type" href="https://johnpili.com/check-jpa-query-type/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/using-vue-without-a-build-step.webp" alt="using-vue-without-a-build-step.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Using Vue without a build step
</h2>
</header>
<div class="entry-content">
<p>Background I would like to share my experience using Vue 2 without a build step in my project and factors using this approach. I started experimenting with Vue.js (Vue 2) back in 2020. One of the nice feature of Vue is the ability to use the framework directly into HTML page without a build tool (compilation). This particular feature is the deciding factor why I selected this framework in migrating a jQuery based web application. I also considered how easy it is to learn and train my team.
...</p>
</div>
<footer class="entry-footer"><span title='2023-10-25 00:00:00 +0200 CEST'>October 25, 2023</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Using Vue without a build step" href="https://johnpili.com/using-vue-without-a-build-step/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/set-http-request-body-size-in-go.webp" alt="set-http-request-body-size-in-go.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Set HTTP Request Body Size in Go
</h2>
</header>
<div class="entry-content">
<p>Use http.MaxBytesReader to limit and control the size HTTP request body. This is a good practice to prevent abuse and save bandwidth. In the example below, I set a 20 bytes HTTP request body size limit.
package main import ( "github.com/julienschmidt/httprouter" "io" "log" "net/http" "time" ) func main() { router := httprouter.New() router.HandlerFunc(http.MethodPost, "/", func(w http.ResponseWriter, r *http.Request) { buffer, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 20)) defer r.Body.Close() if err != nil { w.WriteHeader(http.StatusBadRequest) log.Println(string(buffer)) return } log.Println(string(buffer)) }) httpServer := &http.Server{ Addr: ":8080", Handler: router, ReadTimeout: 120 * time.Second, WriteTimeout: 120 * time.Second, } log.Fatal(httpServer.ListenAndServe()) } Test Content Length 20 bytes
...</p>
</div>
<footer class="entry-footer"><span title='2023-10-23 23:13:00 +0200 CEST'>October 23, 2023</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Set HTTP Request Body Size in Go" href="https://johnpili.com/set-http-request-body-size-in-go/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/boot-linux-without-a-splash-screen.webp" alt="boot-linux-without-a-splash-screen.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Boot Linux without a splash screen
</h2>
</header>
<div class="entry-content">
<p>If you prefer to boot up your Linux machine with the boot messages rather than the distro splash screen. You can enable that by editing the file /etc/default/grub and set the value of GRUB_CMDLINE_LINUX_DEFAULT to an empty string.
Example:
GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="" After editing the file, execute update-grub to load your configuration into the bootloader.
sudo /usr/sbin/update-grub Output of update-grub
Generating grub configuration file ... Found background image: /usr/share/images/desktop-base/desktop-grub.png Found linux image: /boot/vmlinuz-6.1.0-10-arm64 Found initrd image: /boot/initrd.img-6.1.0-10-arm64 Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. Adding boot menu entry for UEFI Firmware Settings ... done </p>
</div>
<footer class="entry-footer"><span title='2023-08-05 03:20:00 +0100 +0100'>August 5, 2023</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Boot Linux without a splash screen" href="https://johnpili.com/boot-linux-without-a-splash-screen/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/start-a-react-project-without-using-cra.webp" alt="start-a-react-project-without-using-cra.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Start a React project without using CRA
</h2>
</header>
<div class="entry-content">
<p>Let’s start a React project without using create-react-app (CRA). CRA is a good project starter but for those who wants a complete control over the building process, we will have to use bundler tools like webpack or yarn.
Prerequisites React.js knowledge Installed and configures NodeJS Installed node package manager (npm) Steps Using the command-line, let us follow the following steps:
Create directories and files mkdir webapp cd webapp Let us continue with our src folder and placeholder files
...</p>
</div>
<footer class="entry-footer"><span title='2023-05-30 00:00:00 +0200 CEST'>May 30, 2023</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to Start a React project without using CRA" href="https://johnpili.com/start-a-react-project-without-using-cra/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="https://johnpili.com/og/pragmatic-programmer-its-your-life.webp" alt="pragmatic-programmer-its-your-life.webp">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">The Pragmatic Programmer - It's your life
</h2>
</header>
<div class="entry-content">
<p>A sound bite from The Pragmatic Programmer: Your Journey To Mastery, 20th Anniversary Edition (2nd Edition)
Interested? You can grab a copy of this book from Amazon.
https://www.amazon.com/Pragmatic-Programmer-journey-mastery-Anniversary/dp/0135957052
</p>
</div>
<footer class="entry-footer"><span title='2023-01-17 21:51:00 +0800 +0800'>January 17, 2023</span> · John Pili</footer>
<a class="entry-link" aria-label="post link to The Pragmatic Programmer - It's your life" href="https://johnpili.com/pragmatic-programmer-its-your-life/"></a>
</article>
<footer class="page-footer">
<nav class="pagination">
<a class="next" href="https://johnpili.com/page/2/">Next »
</a>
</nav>
</footer>
</main>
<footer class="footer">
<span>© 2018 - 2025 johnpili.com</span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a>
<script type="b21a9bc0770d192bc9755636-text/javascript">
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
<script type="b21a9bc0770d192bc9755636-text/javascript">
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="b21a9bc0770d192bc9755636-|49" defer></script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'97cc2518687fdbf6',t:'MTc1NzQ3ODE1Mw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>