1<!DOCTYPE html> 2<html lang=" en-US" data-theme="dark"> 3 4<head> 5
5<script> 6 (function () { 7 var saved = localStorage.getItem('theme') || 'dark'; 8 document.documentElement.setAttribute('data-theme', saved); 9 })(); 10 </script>
10 11 <meta charset="UTF-8"> 12 <!-- Begin Jekyll SEO tag v2.8.0 --> 13<title>Blog | Daniel Opitz - Blog</title> 14<meta name="generator" content="Jekyll v3.10.0" /> 15<meta property="og:title" content="Blog" /> 16<meta property="og:locale" content="en_US" /> 17<meta name="description" content="blog posts about web development, php, dotnet" /> 18<meta property="og:description" content="blog posts about web development, php, dotnet" /> 19<link rel="canonical" href="https://odan.github.io/" /> 20<meta property="og:url" content="https://odan.github.io/" /> 21<meta property="og:site_name" content="Daniel Opitz - Blog" /> 22<meta property="og:type" content="website" /> 23<meta name="twitter:card" content="summary" /> 24<meta property="twitter:title" content="Blog" />
25<script type="application/ld+json"> 26{"@context":"https://schema.org","@type":"WebSite","description":"blog posts about web development, php, dotnet","headline":"Blog","name":"Daniel Opitz - Blog","url":"https://odan.github.io/"}</script>
26 27<!-- End Jekyll SEO tag --> 28 29 <meta name="viewport" content="width=device-width, initial-scale=1"> 30 <meta name="theme-color" content="#1e293b"> 31 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 32 33 <meta name="keywords" content="php, dotnet, webdeveloper" /> 34 35 <link rel="alternate" type="application/rss+xml" title="Subscribe to What's New" 36 href="https://odan.github.io/feed.xml" /> 37 <link rel="preconnect" href="https://fonts.bunny.net"> 38 <link rel="stylesheet" href="/assets/css/style.css?v=e9a526afe686618291ddcbf01fc2dc3799c141f8"> 39 <link href="https://fonts.bunny.net/css?family=inter:400,500,600,700,800|jetbrains-mono:400,500" rel="stylesheet" /> 40 <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?"> 41
41<script type="module" 42 src="https://cdn.jsdelivr.net/npm/@hotwired/turbo@latest/dist/turbo.es2017-esm.min.js"></script>
42 43 <meta name="view-transition" content="same-origin"> 44 <meta name="turbo-prefetch" content="false"> 45 <meta name="turbo-refresh-method" content="morph"> 46 <meta name="turbo-refresh-scroll" content="preserve"> 47</head> 48 49<body> 50 <nav> 51 <div class="nav-inner"> 52 <a href="/" class="nav-logo">odan/blog</a> 53 <div class="nav-links" id="nav-links"> 54 <a href="/">Blog</a> 55 <a href="/about.html">About</a> 56 <a href="/donate.html">Donate</a> 57 <a href="/search.html">Search</a> 58 </div> 59 <button class="theme-btn" id="toggle-mode" aria-label="Toggle dark/light mode">☾</button> 60 <button class="hamburger" id="hamburger" aria-label="Menu">☰</button> 61 </div> 62 <div class="nav-overlay" id="nav-overlay"></div> 63 </nav> 64 65 <header class="hero" role="banner"> 66 <div class="hero-bg"></div> 67 <div class="hero-content"> 68 <h1>Daniel Opitz - Blog</h1> 69 <p>Developer, Trainer, Open Source Contributor</p> 70 </div> 71 </header> 72 73 <main id="content" class="container-wide" role="main"> 74 <h1 class="page-heading" id="blog">Blog</h1> 75 76<!--
77<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8731878573760439" 78 crossorigin="anonymous"> 79</script>
79 80--> 81<!-- 82<iframe src="https://rcm-eu.amazon-adsystem.com/e/cm?o=3&p=26&l=ez&f=ifr&linkID=abb0f54a7e918b0807606332fe09d652&t=28031982-21&tracking_id=28031982-21" width="468" height="60" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0"></iframe> 83--> 84 85<!-- 86<iframe src="https://rcm-eu.amazon-adsystem.com/e/cm?o=3&p=26&l=ur1&category=gift_certificates&banner=1FRYA4Y34G5SPX4CXAR2&f=ifr&linkID=d02832eeac1478aae87ef3f420acc971&t=28031982-21&tracking_id=28031982-21" width="468" height="60" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0"></iframe> 87--> 88 89 90 91<h2 class="year-heading" data-year="2026">2026 <span class="year-count">(4)</span></h2> 92<div class="card-grid"> 93 94 <div class="card"> 95 <h3><a href="/2026/09/02/trusting-self-signed-certificate-on-linux.html">Trusting a self-signed localhost certificate in Chrome on Linux</a></h3> 96 <div class="meta">2026-09-02</div> 97 98 <p>Trust a self-signed localhost HTTPS certificate in Chrome on Ubuntu, Linux Mint, and other Debian-based Linux distributions.</p> 99 100 </div> 101 102 <div class="card"> 103 <h3><a href="/2026/06/28/smooth-page-transitions.html">Smooth page transitions without flickering</a></h3> 104 <div class="meta">2026-06-28</div> 105 106 <p>How to add smooth, SPA-like page transitions to a static site using Hotwire</p> 107 108 </div> 109 110 <div class="card"> 111 <h3><a href="/2026/06/16/cline-ai.html">Cline in VS Code with a free DeepSeek model</a></h3> 112 <div class="meta">2026-06-16</div> 113 114 </div> 115 116 <div class="card"> 117 <h3><a href="/2026/06/16/agents-md.html">Why your project needs an AGENTS.md file</a></h3> 118 <div class="meta">2026-06-16</div> 119 120 </div> 121 122</div> 123 124<h2 class="year-heading" data-year="2025">2025 <span class="year-count">(3)</span></h2> 125<div class="card-grid"> 126 127 <div class="card"> 128 <h3><a href="/2025/12/14/fix-dotnet-sdk10-ubuntu-libicu78.html">Fixing the libicu dependency error when installing .NET SDK 10 on Ubuntu</a></h3> 129 <div class="meta">2025-12-14</div> 130 131 </div> 132 133 <div class="card"> 134 <h3><a href="/2025/12/12/recap-2025.html">The year in review 2025</a></h3> 135 <div class="meta">2025-12-12</div> 136 137 </div> 138 139 <div class="card"> 140 <h3><a href="/2025/06/01/php-dev-box.html">PHP - A Lightweight Dev Setup for Windows</a></h3> 141 <div class="meta">2025-06-01</div> 142 143 </div> 144 145</div> 146 147<h2 class="year-heading" data-year="2024">2024 <span class="year-count">(5)</span></h2> 148<div class="card-grid"> 149 150 <div class="card"> 151 <h3><a href="/2024/07/26/slim5.html">Slim - Work on Slim 5 has begun</a></h3> 152 <div class="meta">2024-07-26</div> 153 154 </div> 155 156 <div class="card"> 157 <h3><a href="/2024/07/04/aspnet-single-action-controllers.html">ASP.NET - Single Action Controllers</a></h3> 158 <div class="meta">2024-07-04</div> 159 160 </div> 161 162 <div class="card"> 163 <h3><a href="/2024/06/16/uuid-in-apis.html">Maximizing Database Efficiency - Why UUIDs Should Stay at the API Level</a></h3> 164 <div class="meta">2024-06-16</div> 165 166 </div> 167 168 <div class="card"> 169 <h3><a href="/2024/06/09/slim-framework-member.html">Joining the Slim Framework Organization on GitHub</a></h3> 170 <div class="meta">2024-06-09</div> 171 172 </div> 173 174 <div class="card"> 175 <h3><a href="/2024/03/20/aspnet-openapi-swagger-ui.html">ASP.NET - Streamlining OpenAPI Documentation</a></h3> 176 <div class="meta">2024-03-20</div> 177 178 </div> 179 180</div> 181 182<h2 class="year-heading" data-year="2023">2023 <span class="year-count">(13)</span></h2> 183<div class="card-grid"> 184 185 <div class="card"> 186 <h3><a href="/2023/12/06/recap-2023.html">Recap 2023 - A Year of Changes and Innovations</a></h3> 187 <div class="meta">2023-12-06</div> 188 189 </div> 190 191 <div class="card"> 192 <h3><a href="/2023/11/16/clock-psr20-datetime.html">PHP - Using the PSR-20 Clock</a></h3> 193 <div class="meta">2023-11-16</div> 194 195 </div> 196 197 <div class="card"> 198 <h3><a href="/2023/11/03/api-orm-decoupling.html">API Design - Decoupling from ORM Dependencies</a></h3> 199 <div class="meta">2023-11-03</div> 200 201 </div> 202 203 <div class="card"> 204 <h3><a href="/2023/08/20/reducing-background-audio-noise.html">
204Reducing Background Audio Noise Using Neural Networks</a></h3> 205 <div class="meta">2023-08-20</div> 206 207 </div> 208 209 <div class="card"> 210 <h3><a href="/2023/08/12/slim4-ebook-vol3.html">Slim 4 - eBook Vol. 3</a></h3> 211 <div class="meta">2023-08-12</div> 212 213 </div> 214 215 <div class="card"> 216 <h3><a href="/2023/08/12/slim-htmx.html">Slim 4 - HTMX Server-side Integration</a></h3> 217 <div class="meta">2023-08-12</div> 218 219 </div> 220 221 <div class="card"> 222 <h3><a href="/2023/07/07/vscode-aspnet.html">Visual Studio Code Setup for ASP.NET Core</a></h3> 223 <div class="meta">2023-07-07</div> 224 225 </div> 226 227 <div class="card"> 228 <h3><a href="/2023/06/28/ipc-2023-berlin.html">International PHP Conference 2023 - Berlin</a></h3> 229 <div class="meta">2023-06-28</div> 230 231 </div> 232 233 <div class="card"> 234 <h3><a href="/2023/05/09/video-reverse-search.html">Unraveling the Origins of a Video - A Guide to Source Discovery</a></h3> 235 <div class="meta">2023-05-09</div> 236 237 </div> 238 239 <div class="card"> 240 <h3><a href="/2023/02/09/orm.html">Beyond ORM - A guide for advanced database queries</a></h3> 241 <div class="meta">2023-02-09</div> 242 243 </div> 244 245 <div class="card"> 246 <h3><a href="/2023/01/22/slim-error-handling.html">Slim Framework - Debugging and Error Handling</a></h3> 247 <div class="meta">2023-01-22</div> 248 249 </div> 250 251 <div class="card"> 252 <h3><a href="/2023/01/16/youtube-slim-middlware.html">New video - Slim Framework - Middleware</a></h3> 253 <div class="meta">2023-01-16</div> 254 255 </div> 256 257 <div class="card"> 258 <h3><a href="/2023/01/12/phpstan-disallow-assign-in-conditional-rule.html">PHPStan - Creating a rule to disallow assignments in a conditional expression</a></h3> 259 <div class="meta">2023-01-12</div> 260 261 </div> 262 263</div> 264 265<h2 class="year-heading" data-year="2022">2022 <span class="year-count">(6)</span></h2> 266<div class="card-grid"> 267 268 <div class="card"> 269 <h3><a href="/2022/10/25/collections-php.html">Collections in PHP</a></h3> 270 <div class="meta">2022-10-25</div> 271 272 </div> 273 274 <div class="card"> 275 <h3><a href="/2022/09/09/slim4-ebook-vol2.html">Slim 4 - eBook Vol. 2</a></h3> 276 <div class="meta">2022-09-09</div> 277 278 </div> 279 280 <div class="card"> 281 <h3><a href="/2022/07/02/slim4-ebook-online.html">Slim 4 - eBook Online Version</a></h3> 282 <div class="meta">2022-07-02</div> 283 284 </div> 285 286 <div class="card"> 287 <h3><a href="/2022/06/18/slim-blade.html">Slim 4 - Blade</a></h3> 288 <div class="meta">2022-06-18</div> 289 290 </div> 291 292 <div class="card"> 293 <h3><a href="/2022/04/06/slim4-latte.html">Slim 4 - Latte Template Engine</a></h3> 294 <div class="meta">2022-04-06</div> 295 296 </div> 297 298 <div class="card"> 299 <h3><a href="/2022/02/19/slim-basic-auth.html">Slim 4 - Basic Authentication</a></h3> 300 <div class="meta">2022-02-19</div> 301 302 </div> 303 304</div> 305 306<h2 class="year-heading" data-year="2021">2021 <span class="year-count">(12)</span></h2> 307<div class="card-grid"> 308 309 <div class="card"> 310 <h3><a href="/2021/09/12/slim-cycle-query-builder.html">Slim 4 - Cycle Query Builder</a></h3> 311 <div class="meta">2021-09-12</div> 312 313 </div> 314 315 <div class="card"> 316 <h3><a href="/2021/08/14/slim-reactphp.html">Slim 4 - ReactPHP</a></h3> 317 <div class="meta">2021-08-14</div> 318 319 </div> 320 321 <div class="card"> 322 <h3><a href="/2021/08/12/slim-graphql.html">Slim 4 - GraphQL</a></h3> 323 <div class="meta">2021-08-12</div> 324 325 </div> 326 327 <div class="card"> 328 <h3><a href="/2021/07/06/slim-whoops.html">Slim 4 - Whoops</a></h3> 329 <div class="meta">2021-07-06</div> 330 331 </div> 332 333 <div class="card"> 334 <h3><a href="/2021/06/23/slim-console.html">Slim 4 - Console</a></h3> 335 <div class="meta">2021-06-23</div> 336 337 </div> 338 339 <div class="card"> 340 <h3>
340<a href="/2021/06/20/slim-memcached.html">Slim 4 - Memcached</a></h3> 341 <div class="meta">2021-06-20</div> 342 343 </div> 344 345 <div class="card"> 346 <h3><a href="/2021/06/14/slim-redis.html">Slim 4 - Redis</a></h3> 347 <div class="meta">2021-06-14</div> 348 349 </div> 350 351 <div class="card"> 352 <h3><a href="/2021/01/22/slim4-framework-vs-micro-framework.html">Slim 4 - Framework vs. Micro Framework</a></h3> 353 <div class="meta">2021-01-22</div> 354 355 </div> 356 357 <div class="card"> 358 <h3><a href="/2021/01/16/slim4-spam-protection.html">Slim 4 - Spam Protection</a></h3> 359 <div class="meta">2021-01-16</div> 360 361 </div> 362 363 <div class="card"> 364 <h3><a href="/2021/01/15/slim4-session.html">Slim 4 - Session</a></h3> 365 <div class="meta">2021-01-15</div> 366 367 </div> 368 369 <div class="card"> 370 <h3><a href="/2021/01/07/webpack-bootstrap-icons.html">Webpack - Bootstrap Icons</a></h3> 371 <div class="meta">2021-01-07</div> 372 373 </div> 374 375 <div class="card"> 376 <h3><a href="/2021/01/03/slim4-sftp.html">Slim 4 - League Flysystem v2 SFTP</a></h3> 377 <div class="meta">2021-01-03</div> 378 379 </div> 380 381</div> 382 383<h2 class="year-heading" data-year="2020">2020 <span class="year-count">(21)</span></h2> 384<div class="card-grid"> 385 386 <div class="card"> 387 <h3><a href="/2020/12/28/slim4-flysystem-v2.html">Slim 4 - League Flysystem v2</a></h3> 388 <div class="meta">2020-12-28</div> 389 390 </div> 391 392 <div class="card"> 393 <h3><a href="/2020/12/23/annual-review-2020.html">Annual Review 2020</a></h3> 394 <div class="meta">2020-12-23</div> 395 396 </div> 397 398 <div class="card"> 399 <h3><a href="/2020/12/22/php8-compatibility-check.html">PHP 8 Compatibility Check</a></h3> 400 <div class="meta">2020-12-22</div> 401 402 </div> 403 404 <div class="card"> 405 <h3><a href="/2020/12/09/slim4-php-view.html">Slim 4 - PHP Templates</a></h3> 406 <div class="meta">2020-12-09</div> 407 408 </div> 409 410 <div class="card"> 411 <h3><a href="/2020/12/03/xampp-xdebug-setup-php8.html">XAMPP - XDebug Setup for PHP 8</a></h3> 412 <div class="meta">2020-12-03</div> 413 414 </div> 415 416 <div class="card"> 417 <h3><a href="/2020/10/18/slim4-cakephp-validation.html">Slim 4 - CakePHP Validation</a></h3> 418 <div class="meta">2020-10-18</div> 419 420 </div> 421 422 <div class="card"> 423 <h3><a href="/2020/10/08/slim4-respect-validation.html">Slim 4 - Respect/Validation</a></h3> 424 <div class="meta">2020-10-08</div> 425 426 </div> 427 428 <div class="card"> 429 <h3><a href="/2020/10/06/slim4-filepond.html">Slim 4 - File uploads with FilePond</a></h3> 430 <div class="meta">2020-10-06</div> 431 432 </div> 433 434 <div class="card"> 435 <h3><a href="/2020/09/04/slim4-programmez.html">Programmez! - à la découverte de Slim 4</a></h3> 436 <div class="meta">2020-09-04</div> 437 438 </div> 439 440 <div class="card"> 441 <h3><a href="/2020/08/09/slim4-http-session.html">Slim 4 - Symfony Session</a></h3> 442 <div class="meta">2020-08-09</div> 443 444 </div> 445 446 <div class="card"> 447 <h3><a href="/2020/07/21/slim4-vue.html">Slim 4 - Vue.js</a></h3> 448 <div class="meta">2020-07-21</div> 449 450 </div> 451 452 <div class="card"> 453 <h3><a href="/2020/06/18/slim4-sentry.html">Slim 4 - Sentry</a></h3> 454 <div class="meta">2020-06-18</div> 455 456 </div> 457 458 <div class="card"> 459 <h3><a href="/2020/06/12/slim4-swagger-ui.html">Slim 4 - API documentation with Swagger</a></h3> 460 <div class="meta">2020-06-12</div> 461 462 </div> 463 464 <div class="card"> 465 <h3><a href="/2020/06/09/slim4-testing.html">Slim 4 - Testing</a></h3> 466 <div class="meta">2020-06-09</div> 467 468 </div> 469 470 <div class="card"> 471 <h3><a href="/2020/05/27/slim4-error-handling.html">Slim 4 - Error handling</a></h3> 472 <div class="meta">2020-05-27</div> 473 474 </div> 475 476 <div class="card"> 477 <h3><a href="/2020/05/25/slim4-logging.html">Slim 4 - Logging</a></h3> 478 <div class="meta">2020-05-25</div> 479 480 </div> 481 482 <div class="card"> 483 <h3><a href="/2020/05/20/slim4-php-magazin-420.html">Slim 4 - PHP Magazin 4.20</a></h3> 484 <div class="meta">2020-05-20</div> 485 486 </div> 487 488 <div class="card"> 489 <h3><a href="/2020/05/07/slim4-working-with-images.html">Slim 4 - Images</a></h3> 490 <div class="meta">2020-05-07</div> 491 492 </div> 493 494 <div class="card"> 495 <h3><a href="/2020/04/17/slim4-twig-templates.html">Slim 4 - Twig</a></h3> 496 <div class="meta">2020-04-17</div> 497 498 </div> 499 500 <div class="card"> 501 <h3><a href="/2020/04/11/slim4-sending-emails.html">Slim 4 - Mailer</a></h3> 502 <div class="meta">2020-04-11</div> 503 504 </div> 505 506 <div class="card"> 507 <h3><a href="/2020/04/05/slim4-multiple-pdo-database-connections.html">Slim 4 - Multiple database connections</a></h3> 508 <div class="meta">2020-04-05</div> 509 510 </div> 511 512</div> 513 514<h2 class="year-heading" data-year="2019">2019 <span class="year-count">(14)</span></h2> 515<div class="card-grid"> 516 517 <div class="card"> 518 <h3><a href="/2019/12/20/slim4-performance-testing.html">Slim 4 - Performance</a></h3> 519 <div class="meta">2019-12-20</div> 520 521 </div> 522 523 <div class="card"> 524 <h3><a href="/2019/12/06/php-best-practice-2019.html">
524PHP - Best Practices 2019</a></h3> 525 <div class="meta">2019-12-06</div> 526 527 </div> 528 529 <div class="card"> 530 <h3><a href="/2019/12/05/slim4-doctrine-dbal.html">Slim 4 - Doctrine DBAL</a></h3> 531 <div class="meta">2019-12-05</div> 532 533 </div> 534 535 <div class="card"> 536 <h3><a href="/2019/12/03/slim4-eloquent.html">Slim 4 - Laravel Query Builder</a></h3> 537 <div class="meta">2019-12-03</div> 538 539 </div> 540 541 <div class="card"> 542 <h3><a href="/2019/12/03/slim4-cakephp-query-builder.html">Slim 4 - CakePHP Query Builder</a></h3> 543 <div class="meta">2019-12-03</div> 544 545 </div> 546 547 <div class="card"> 548 <h3><a href="/2019/12/01/the-phpstorm-sonarlint-plugin.html">PhpStorm - SonarLint Plugin</a></h3> 549 <div class="meta">2019-12-01</div> 550 551 </div> 552 553 <div class="card"> 554 <h3><a href="/2019/12/01/slim4-laminas-db-query-builder-setup.html">Slim 4 - Laminas Query Builder</a></h3> 555 <div class="meta">2019-12-01</div> 556 557 </div> 558 559 <div class="card"> 560 <h3><a href="/2019/11/24/slim4-cors.html">Slim 4 - CORS</a></h3> 561 <div class="meta">2019-11-24</div> 562 563 </div> 564 565 <div class="card"> 566 <h3><a href="/2019/11/17/xampp-replacing-mariadb-with-mysql-8.html">XAMPP - Replacing MariaDB with MySQL 8</a></h3> 567 <div class="meta">2019-11-17</div> 568 569 </div> 570 571 <div class="card"> 572 <h3><a href="/2019/11/05/slim4-tutorial.html">Slim 4 - Tutorial</a></h3> 573 <div class="meta">2019-11-05</div> 574 575 </div> 576 577 <div class="card"> 578 <h3><a href="/2019/09/21/slim4-compiling-assets-with-webpack.html">Slim 4 - Webpack</a></h3> 579 <div class="meta">2019-09-21</div> 580 581 </div> 582 583 <div class="card"> 584 <h3><a href="/2019/09/09/slim-4-cheatsheet-and-faq.html">Slim 4 - Cheatsheet and FAQ</a></h3> 585 <div class="meta">2019-09-09</div> 586 587 </div> 588 589 <div class="card"> 590 <h3><a href="/2019/08/30/creating-a-strictly-typed-collection-of-objects-in-php.html">Creating a strictly typed collection of objects in PHP</a></h3> 591 <div class="meta">2019-08-30</div> 592 593 </div> 594 595 <div class="card"> 596 <h3><a href="/2019/03/18/creating-your-first-slim-framework-application-part-2.html">Creating your first Slim 3 Framework Application Part 2</a></h3> 597 <div class="meta">2019-03-18</div> 598 599 </div> 600 601</div> 602 603<h2 class="year-heading" data-year="2018">2018 <span class="year-count">(1)</span></h2> 604<div class="card-grid"> 605 606 <div class="card"> 607 <h3><a href="/2018/07/17/aspnet-core-2-ubuntu-setup.html">Installing ASP.NET Core 2.1 on Ubuntu 18.4 Linux</a></h3> 608 <div class="meta">2018-07-17</div> 609 610 </div> 611 612</div> 613 614<h2 class="year-heading" data-year="2017">2017 <span class="year-count">(12)</span></h2> 615<div class="card-grid"> 616 617 <div class="card"> 618 <h3><a href="/2017/12/16/creating-and-downloading-excel-files-with-slim.html">Slim Framework - Export Excel and CSV</a></h3> 619 <div class="meta">2017-12-16</div> 620 621 </div> 622 623 <div class="card"> 624 <h3><a href="/2017/11/30/creating-your-first-slim-framework-application.html">Creating your first Slim 3 Framework Application</a></h3> 625 <div class="meta">2017-11-30</div> 626 627 </div> 628 629 <div class="card"> 630 <h3><a href="/2017/10/29/installing-an-ssl-certificate-under-apache-xampp.html">Installing an SSL Certificate under Apache (XAMPP)</a></h3> 631 <div class="meta">2017-10-29</div> 632 633 </div> 634 635 <div class="card"> 636 <h3><a href="/2017/08/13/xampp-replacing-mariadb-with-mysql.html">XAMPP - Replacing MariaDB with MySQL</a></h3> 637 <div class="meta">2017-08-13</div> 638 639 </div> 640 641 <div class="card"> 642 <h3><a href="/2017/08/10/aes-256-encryption-and-decryption-in-php-and-csharp.html">AES-256 encryption and decryption in PHP and C#</a></h3> 643 <div class="meta">2017-08-10</div> 644 645 </div> 646 647 <div class="card"> 648 <h3><a href="/2017/04/17/rest-restful-api-quick-reference.html">RESTful API - Quick Reference</a></h3> 649 <div class="meta">2017-04-17</div> 650 651 </div> 652 653 <div class="card"> 654 <h3><a href="/2017/03/30/xampp-curl-ssl-setup.html">XAMPP - CURL SSL Setup</a></h3> 655 <div class="meta">2017-03-30</div> 656 657 </div> 658 659 <div class="card"> 660 <h3><a href="/2017/03/21/xampp-oracle-driver-setup-v12.html">XAMPP - Oracle Driver Setup (v12)</a></h3> 661 <div class="meta">2017-03-21</div> 662 663 </div> 664 665 <div class="card"> 666 <h3><a href="/2017/02/05/xampp-how-to-enable-php-opcache.html">XAMPP - How to enable PHP OPCache</a></h3> 667 <div class="meta">2017-02-05</div> 668 669 </div> 670 671 <div class="card"> 672 <h3><a href="/2017/01/07/basic-crud-operations-with-pdo.html">Basic CRUD operations with PDO</a></h3> 673 <div class="meta">2017-01-07</div> 674 675 </div> 676 677 <div class="card"> 678 <h3><a href="/2017/01/02/resources-for-php.html">Learn modern PHP</a></h3> 679 <div class="meta">2017-01-02</div> 680 681 </div> 682 683 <div class="card"> 684 <h3><a href="/2017/01/02/how-to-use-htmlspecialchars-in-php.html">Using htmlspecialchars correctly</a></h3> 685 <div class="meta">2017-01-02</div> 686 687 </div> 688 689</div> 690 691<h2 class="year-heading" data-year="2015">2015 <span class="year-count">(1)</span></h2> 692<div class="card-grid"> 693 694 <div class="card"> 695 <h3><a href="/2015/12/27/installing-xdebug-for-xampp-with-php-7-x.html">Installing Xdebug for XAMPP with PHP 7.x</a></h3> 696 <div class="meta">2015-12-27</div> 697 698 </div> 699 700</div> 701 702
703<script> 704 (function() { 705 var headings = document.querySelectorAll('.year-heading'); 706 headings.forEach(function(h) { 707 var year = parseInt(h.getAttribute('data-year'), 10); 708 var currentYear = new Date().getFullYear(); 709 var grid = h.nextElementSibling; 710 if (grid && grid.classList.contains('card-grid')) { 711 if (year >= currentYear - 2) { 712 grid.style.display = 'grid'; 713 } else { 714 grid.style.display = 'none'; 715 } 716 h.addEventListener('click', function() { 717 if (grid.style.display === 'none') { 718 grid.style.display = 'grid'; 719 } else { 720 grid.style.display = 'none'; 721 } 722 }); 723 } 724 }); 725 })(); 726</script>
726 727 728<!--
729<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8731878573760439" 730 crossorigin="anonymous"> 731</script>
731 732--> 733<!-- 734<iframe src="https://rcm-eu.amazon-adsystem.com/e/cm?o=3&p=26&l=ez&f=ifr&linkID=abb0f54a7e918b0807606332fe09d652&t=28031982-21&tracking_id=28031982-21" width="468" height="60" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0"></iframe> 735--> 736 737<!-- 738<iframe src="https://rcm-eu.amazon-adsystem.com/e/cm?o=3&p=26&l=ur1&category=gift_certificates&banner=1FRYA4Y34G5SPX4CXAR2&f=ifr&linkID=d02832eeac1478aae87ef3f420acc971&t=28031982-21&tracking_id=28031982-21" width="468" height="60" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0"></iframe> 739--> 740 741 742 <footer> 743 © 2026 Daniel Opitz 744 | <a href="https://x.com/dopitz" target="_blank">X</a> 745 | <a href="https://github.com/odan" target="_blank">GitHub</a> 746 | <a href="https://www.linkedin.com/in/daniel-opitz-493816111" target="_blank">LinkedIn</a> 747 | <a href="https://odan.github.io/feed.xml" target="_blank">RSS</a> 748 </footer> 749 </main> 750 751
751<script> 752 (function () { 753 document.getElementById('toggle-mode').addEventListener('click', function (e) { 754 var cur = document.documentElement.getAttribute('data-theme'); 755 var next = cur === 'dark' ? 'light' : 'dark'; 756 document.documentElement.setAttribute('data-theme', next); 757 localStorage.setItem('theme', next); 758 }); 759 760 var hamburger = document.getElementById('hamburger'); 761 var navLinks = document.getElementById('nav-links'); 762 var overlay = document.getElementById('nav-overlay'); 763 if (hamburger && navLinks) { 764 function closeMenu() { 765 navLinks.classList.remove('open'); 766 overlay.classList.remove('open'); 767 document.body.classList.remove('nav-open'); 768 } 769 hamburger.addEventListener('click', function () { 770 navLinks.classList.toggle('open'); 771 overlay.classList.toggle('open'); 772 document.body.classList.toggle('nav-open'); 773 }); 774 overlay.addEventListener('click', closeMenu); 775 navLinks.querySelectorAll('a').forEach(function (link) { 776 link.addEventListener('click', closeMenu); 777 }); 778 } 779 })(); 780 </script>
780 781</body> 782 783</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.