mirror of
https://github.com/cole-maxwell1/cole-maxwell1.github.io.git
synced 2026-06-03 11:10:25 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7f475cc503 |
@@ -1,11 +0,0 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
# 2 space indentation
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = true
|
||||
# Unix-style newlines with a newline ending every file
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
@@ -1,16 +0,0 @@
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
* text=auto
|
||||
|
||||
# Force bash scripts to always use LF line endings so that if a repo is accessed
|
||||
# in Unix via a file share from Windows, the scripts will work.
|
||||
*.sh text eol=lf
|
||||
|
||||
# Force batch scripts to always use CRLF line endings so that if a repo is accessed
|
||||
# in Windows via a file share from Linux, the scripts will work.
|
||||
*.{cmd,[cC][mM][dD]} text eol=crlf
|
||||
*.{bat,[bB][aA][tT]} text eol=crlf
|
||||
|
||||
# Denote all files that are truly binary and should not be modified.
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.ico binary
|
||||
@@ -1,29 +0,0 @@
|
||||
name: 'Automatic build'
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- .gitignore
|
||||
- README.md
|
||||
- LICENSE
|
||||
|
||||
jobs:
|
||||
continuous-delivery:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0 # for posts's lastmod
|
||||
|
||||
- name: Setup Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: 2.7
|
||||
bundler-cache: true
|
||||
|
||||
- name: Deploy
|
||||
run: bash tools/deploy.sh
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
# hidden files
|
||||
.*
|
||||
!.git*
|
||||
!.editorconfig
|
||||
!.nojekyll
|
||||
!.travis.yml
|
||||
!.husky
|
||||
!.commitlintrc.json
|
||||
!.versionrc.json
|
||||
|
||||
# bundler cache
|
||||
_site
|
||||
vendor
|
||||
|
||||
# rubygem
|
||||
*.gem
|
||||
|
||||
# npm dependencies
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -1,3 +0,0 @@
|
||||
[submodule "assets/lib"]
|
||||
path = assets/lib
|
||||
url = https://github.com/cotes2020/chirpy-static-assets.git
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "jekyll-theme-chirpy", "~> 5.2", ">= 5.2.1"
|
||||
|
||||
group :test do
|
||||
gem "html-proofer", "~> 3.18"
|
||||
end
|
||||
|
||||
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||
# and associated library.
|
||||
install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do
|
||||
gem "tzinfo", "~> 1.2"
|
||||
gem "tzinfo-data"
|
||||
end
|
||||
|
||||
# Performance-booster for watching directories on Windows
|
||||
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?
|
||||
|
||||
# Jekyll <= 4.2.0 compatibility with Ruby 3.0
|
||||
gem "webrick", "~> 1.7"
|
||||
-117
@@ -1,117 +0,0 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
colorator (1.1.0)
|
||||
concurrent-ruby (1.1.10)
|
||||
em-websocket (0.5.3)
|
||||
eventmachine (>= 0.12.9)
|
||||
http_parser.rb (~> 0)
|
||||
ethon (0.15.0)
|
||||
ffi (>= 1.15.0)
|
||||
eventmachine (1.2.7)
|
||||
ffi (1.15.5)
|
||||
forwardable-extended (2.6.0)
|
||||
html-proofer (3.19.4)
|
||||
addressable (~> 2.3)
|
||||
mercenary (~> 0.3)
|
||||
nokogiri (~> 1.13)
|
||||
parallel (~> 1.10)
|
||||
rainbow (~> 3.0)
|
||||
typhoeus (~> 1.3)
|
||||
yell (~> 2.0)
|
||||
http_parser.rb (0.8.0)
|
||||
i18n (1.12.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
jekyll (4.2.2)
|
||||
addressable (~> 2.4)
|
||||
colorator (~> 1.0)
|
||||
em-websocket (~> 0.5)
|
||||
i18n (~> 1.0)
|
||||
jekyll-sass-converter (~> 2.0)
|
||||
jekyll-watch (~> 2.0)
|
||||
kramdown (~> 2.3)
|
||||
kramdown-parser-gfm (~> 1.0)
|
||||
liquid (~> 4.0)
|
||||
mercenary (~> 0.4.0)
|
||||
pathutil (~> 0.9)
|
||||
rouge (~> 3.0)
|
||||
safe_yaml (~> 1.0)
|
||||
terminal-table (~> 2.0)
|
||||
jekyll-archives (2.2.1)
|
||||
jekyll (>= 3.6, < 5.0)
|
||||
jekyll-paginate (1.1.0)
|
||||
jekyll-redirect-from (0.16.0)
|
||||
jekyll (>= 3.3, < 5.0)
|
||||
jekyll-sass-converter (2.2.0)
|
||||
sassc (> 2.0.1, < 3.0)
|
||||
jekyll-seo-tag (2.8.0)
|
||||
jekyll (>= 3.8, < 5.0)
|
||||
jekyll-sitemap (1.4.0)
|
||||
jekyll (>= 3.7, < 5.0)
|
||||
jekyll-theme-chirpy (5.2.1)
|
||||
jekyll (~> 4.1)
|
||||
jekyll-archives (~> 2.2)
|
||||
jekyll-paginate (~> 1.1)
|
||||
jekyll-redirect-from (~> 0.16)
|
||||
jekyll-seo-tag (~> 2.7)
|
||||
jekyll-sitemap (~> 1.4)
|
||||
jekyll-watch (2.2.1)
|
||||
listen (~> 3.0)
|
||||
kramdown (2.4.0)
|
||||
rexml
|
||||
kramdown-parser-gfm (1.1.0)
|
||||
kramdown (~> 2.0)
|
||||
liquid (4.0.3)
|
||||
listen (3.7.1)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
mercenary (0.4.0)
|
||||
mini_portile2 (2.8.6)
|
||||
nokogiri (1.16.5)
|
||||
mini_portile2 (~> 2.8.2)
|
||||
racc (~> 1.4)
|
||||
parallel (1.22.1)
|
||||
pathutil (0.16.2)
|
||||
forwardable-extended (~> 2.6)
|
||||
public_suffix (4.0.7)
|
||||
racc (1.7.3)
|
||||
rainbow (3.1.1)
|
||||
rb-fsevent (0.11.1)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
rexml (3.2.8)
|
||||
strscan (>= 3.0.9)
|
||||
rouge (3.30.0)
|
||||
safe_yaml (1.0.5)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
strscan (3.1.0)
|
||||
terminal-table (2.0.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
thread_safe (0.3.6)
|
||||
typhoeus (1.4.0)
|
||||
ethon (>= 0.9.0)
|
||||
tzinfo (1.2.10)
|
||||
thread_safe (~> 0.1)
|
||||
tzinfo-data (1.2022.1)
|
||||
tzinfo (>= 1.0.0)
|
||||
unicode-display_width (1.8.0)
|
||||
wdm (0.1.1)
|
||||
webrick (1.7.0)
|
||||
yell (2.2.2)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
html-proofer (~> 3.18)
|
||||
jekyll-theme-chirpy (~> 5.2, >= 5.2.1)
|
||||
tzinfo (~> 1.2)
|
||||
tzinfo-data
|
||||
wdm (~> 0.1.1)
|
||||
webrick (~> 1.7)
|
||||
|
||||
BUNDLED WITH
|
||||
1.17.2
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Cotes Chung
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,59 +0,0 @@
|
||||
# About
|
||||
This is my personal blog/about site where I post random things about cool tech I am playing with. The project was inspired by a video that @timothystewart6 did on [youtube](https://youtu.be/F8iOU1ci19Q). It is built with the Ruby static site generator [Jekyll](https://jekyllrb.com/). Hosting is provided by GitHub pages.
|
||||
|
||||
Some of the main drivers that lead me to move away from WordPress are:
|
||||
* I feel writing in markdown is both more convenient and better for technical topics
|
||||
* Markdown is more portable when I inevitably decide to move my blog again
|
||||
* I never have to leave my text editor to add new posts or update other parts of the site
|
||||
* While hosting fees for my WordPress instants were very low, it is nice to host on a free service and eliminate the cost
|
||||
|
||||
The heavy lifting for the CI/CD GitHub actions, and Jekyll theme were provided by @cotes2020. More information about the theme below:
|
||||
|
||||
# Chirpy Starter
|
||||
|
||||
[](https://rubygems.org/gems/jekyll-theme-chirpy) [][mit]
|
||||
|
||||
When installing the [**Chirpy**][chirpy] theme through [RubyGems.org][gem], Jekyll can only read files in the folders `_includes`, `_layout`, `_sass` and `assets`, as well as a small part of options of the `_config.yml` file from the theme's gem. If you have ever installed this theme gem, you can use the command `bundle info --path jekyll-theme-chirpy` to locate these files.
|
||||
|
||||
The Jekyll organization claims that this is to leave the ball in the user’s court, but this also results in users not being able to enjoy the out-of-the-box experience when using feature-rich themes.
|
||||
|
||||
To fully use all the features of **Chirpy**, you need to copy the other critical files from the theme's gem to your Jekyll site. The following is a list of targets:
|
||||
|
||||
```shell
|
||||
.
|
||||
├── _config.yml
|
||||
├── _data
|
||||
├── _plugins
|
||||
├── _tabs
|
||||
└── index.html
|
||||
```
|
||||
|
||||
In order to save your time, and to prevent you from missing some files when copying, we extract those files/configurations of the latest version of the **Chirpy** theme and the [CD][CD] workflow to here, so that you can start writing in minutes.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Follow the instructions in the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of `Ruby`, `RubyGems`, `Jekyll` and `Bundler`.
|
||||
|
||||
## Installation
|
||||
|
||||
[**Use this template**][use-template] to generate a brand new repository and name it `<GH_USERNAME>.github.io`, where `GH_USERNAME` represents your GitHub username.
|
||||
|
||||
Then clone it to your local machine and run:
|
||||
|
||||
```
|
||||
$ bundle
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Please see the [theme's docs](https://github.com/cotes2020/jekyll-theme-chirpy#documentation).
|
||||
|
||||
## License
|
||||
|
||||
This work is published under [MIT][mit] License.
|
||||
|
||||
[gem]: https://rubygems.org/gems/jekyll-theme-chirpy
|
||||
[chirpy]: https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
[use-template]: https://github.com/cotes2020/chirpy-starter/generate
|
||||
[CD]: https://en.wikipedia.org/wiki/Continuous_deployment
|
||||
[mit]: https://github.com/cotes2020/chirpy-starter/blob/master/LICENSE
|
||||
-201
@@ -1,201 +0,0 @@
|
||||
# The Site Configuration
|
||||
|
||||
# Import the theme
|
||||
theme: jekyll-theme-chirpy
|
||||
|
||||
# Change the following value to '/PROJECT_NAME' ONLY IF your site type is GitHub Pages Project sites
|
||||
# and doesn't have a custom domain.
|
||||
baseurl: ""
|
||||
|
||||
# The language of the webpage › http://www.lingoes.net/en/translator/langcode.htm
|
||||
# If it has the same name as one of the files in folder `_data/locales`, the layout language will also be changed,
|
||||
# otherwise, the layout language will use the default value of 'en'.
|
||||
lang: en
|
||||
|
||||
# Additional parameters for datetime localization, optional. › https://github.com/iamkun/dayjs/tree/dev/src/locale
|
||||
prefer_datetime_locale:
|
||||
|
||||
# Change to your timezone › http://www.timezoneconverter.com/cgi-bin/findzone/findzone
|
||||
timezone: America/Chicago
|
||||
|
||||
# jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
|
||||
# ↓ --------------------------
|
||||
|
||||
title: Cole Maxwell # the main title
|
||||
|
||||
tagline: Craftsmanship in software and systems
|
||||
|
||||
description: >- # used by seo meta and the atom feed
|
||||
A site about software craftsmanship, system design, and Cole Maxwell.
|
||||
|
||||
# fill in the protocol & hostname for your site, e.g., 'https://username.github.io'
|
||||
url: "https://colemaxwell.dev"
|
||||
|
||||
github:
|
||||
username: cole-maxwell1 # change to your github username
|
||||
|
||||
#twitter:
|
||||
#username: twitter_username # change to your twitter username
|
||||
|
||||
social:
|
||||
# Change to your full name.
|
||||
# It will be displayed as the default author of the posts and the copyright owner in the Footer
|
||||
name: Cole Maxwell
|
||||
email: cole@codecraftsmen.dev
|
||||
links:
|
||||
# The first element serves as the copyright owner's link
|
||||
- https://github.com/cole-maxwell1 # change to your github homepage
|
||||
- https://www.linkedin.com/in/cole-n-maxwell
|
||||
- https://twitter.com/cole-maxwell1 # change to your twitter homepage
|
||||
# Uncomment below to add more social links
|
||||
# - https://www.facebook.com/username
|
||||
|
||||
google_site_verification: # fill in to your verification string
|
||||
|
||||
# ↑ --------------------------
|
||||
# The end of `jekyll-seo-tag` settings
|
||||
|
||||
google_analytics:
|
||||
id: G-T9FVDLVRR3 # fill in your Google Analytics ID
|
||||
# Google Analytics pageviews report settings
|
||||
pv:
|
||||
proxy_endpoint: # fill in the Google Analytics superProxy endpoint of Google App Engine
|
||||
cache_path: # the local PV cache data, friendly to visitors from GFW region
|
||||
|
||||
# Prefer color scheme setting.
|
||||
#
|
||||
# Note: Keep empty will follow the system prefer color by default,
|
||||
# and there will be a toggle to switch the theme between dark and light
|
||||
# on the bottom left of the sidebar.
|
||||
#
|
||||
# Available options:
|
||||
#
|
||||
# light - Use the light color scheme
|
||||
# dark - Use the dark color scheme
|
||||
#
|
||||
theme_mode: # [light|dark]
|
||||
|
||||
# The CDN endpoint for images.
|
||||
# Notice that once it is assigned, the CDN url
|
||||
# will be added to all image (site avatar & posts' images) paths starting with '/'
|
||||
#
|
||||
# e.g. 'https://cdn.com'
|
||||
img_cdn:
|
||||
|
||||
# the avatar on sidebar, support local or CORS resources
|
||||
avatar: https://avatars.githubusercontent.com/u/58858010?v=4
|
||||
|
||||
# boolean type, the global switch for ToC in posts.
|
||||
toc: true
|
||||
|
||||
comments:
|
||||
active: # The global switch for posts comments, e.g., 'disqus'. Keep it empty means disable
|
||||
# The active options are as follows:
|
||||
disqus:
|
||||
shortname: # fill with the Disqus shortname. › https://help.disqus.com/en/articles/1717111-what-s-a-shortname
|
||||
# utterances settings › https://utteranc.es/
|
||||
utterances:
|
||||
repo: # <gh-username>/<repo>
|
||||
issue_term: # < url | pathname | title | ...>
|
||||
# Giscus options › https://giscus.app
|
||||
giscus:
|
||||
repo: # <gh-username>/<repo>
|
||||
repo_id:
|
||||
category:
|
||||
category_id:
|
||||
mapping: # optional, default to 'pathname'
|
||||
input_position: # optional, default to 'bottom'
|
||||
lang: # optional, default to the value of `site.lang`
|
||||
|
||||
# Self-hosted static assets, optional › https://github.com/cotes2020/chirpy-static-assets
|
||||
assets:
|
||||
self_host:
|
||||
enabled: # boolean, keep empty means false
|
||||
# specify the Jekyll environment, empty means both
|
||||
# only works if `assets.self_host.enabled` is 'true'
|
||||
env: # [development|production]
|
||||
|
||||
pwa:
|
||||
enabled: true # the option for PWA feature
|
||||
|
||||
paginate: 10
|
||||
|
||||
# ------------ The following options are not recommended to be modified ------------------
|
||||
|
||||
kramdown:
|
||||
syntax_highlighter: rouge
|
||||
syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options
|
||||
css_class: highlight
|
||||
# default_lang: console
|
||||
span:
|
||||
line_numbers: false
|
||||
block:
|
||||
line_numbers: true
|
||||
start_line: 1
|
||||
|
||||
collections:
|
||||
tabs:
|
||||
output: true
|
||||
sort_by: order
|
||||
|
||||
defaults:
|
||||
- scope:
|
||||
path: "" # An empty string here means all files in the project
|
||||
type: posts
|
||||
values:
|
||||
layout: post
|
||||
comments: true # Enable comments in posts.
|
||||
toc: true # Display TOC column in posts.
|
||||
# DO NOT modify the following parameter unless you are confident enough
|
||||
# to update the code of all other post links in this project.
|
||||
permalink: /posts/:title/
|
||||
- scope:
|
||||
path: _drafts
|
||||
values:
|
||||
comments: false
|
||||
- scope:
|
||||
path: ""
|
||||
type: tabs # see `site.collections`
|
||||
values:
|
||||
layout: page
|
||||
permalink: /:title/
|
||||
- scope:
|
||||
path: assets/img/favicons
|
||||
values:
|
||||
swcache: true
|
||||
- scope:
|
||||
path: assets/js/dist
|
||||
values:
|
||||
swcache: true
|
||||
|
||||
sass:
|
||||
style: compressed
|
||||
|
||||
compress_html:
|
||||
clippings: all
|
||||
comments: all
|
||||
endings: all
|
||||
profile: false
|
||||
blanklines: false
|
||||
ignore:
|
||||
envs: [development]
|
||||
|
||||
exclude:
|
||||
- "*.gem"
|
||||
- "*.gemspec"
|
||||
- tools
|
||||
- README.md
|
||||
- CHANGELOG.md
|
||||
- LICENSE
|
||||
- gulpfile.js
|
||||
- node_modules
|
||||
- package*.json
|
||||
|
||||
jekyll-archives:
|
||||
enabled: [categories, tags]
|
||||
layouts:
|
||||
category: category
|
||||
tag: tag
|
||||
permalinks:
|
||||
tag: /tags/:name/
|
||||
category: /categories/:name/
|
||||
@@ -1,62 +0,0 @@
|
||||
# CDNs
|
||||
|
||||
cdns:
|
||||
# Google Fonts
|
||||
- url: https://fonts.googleapis.com
|
||||
- url: https://fonts.gstatic.com
|
||||
args: crossorigin
|
||||
- url: https://fonts.googleapis.com
|
||||
# jsDelivr CDN
|
||||
- url: https://cdn.jsdelivr.net
|
||||
|
||||
# fonts
|
||||
|
||||
webfonts: https://fonts.googleapis.com/css2?family=Lato&family=Source+Sans+Pro:wght@400;600;700;900&display=swap
|
||||
|
||||
# Libraries
|
||||
|
||||
jquery:
|
||||
js: https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js
|
||||
|
||||
bootstrap:
|
||||
css: https://cdn.jsdelivr.net/npm/bootstrap@4/dist/css/bootstrap.min.css
|
||||
js: https://cdn.jsdelivr.net/npm/bootstrap@4/dist/js/bootstrap.bundle.min.js
|
||||
|
||||
bootstrap-toc:
|
||||
css: https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@1.0.1/dist/bootstrap-toc.min.css
|
||||
js: https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@1.0.1/dist/bootstrap-toc.min.js
|
||||
|
||||
fontawesome:
|
||||
css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.11.2/css/all.min.css
|
||||
|
||||
search:
|
||||
js: https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js
|
||||
|
||||
mermaid:
|
||||
js: https://cdn.jsdelivr.net/npm/mermaid@8/dist/mermaid.min.js
|
||||
|
||||
dayjs:
|
||||
js:
|
||||
common: https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js
|
||||
locale: https://cdn.jsdelivr.net/npm/dayjs@1/locale/:LOCALE.min.js
|
||||
relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1/plugin/relativeTime.min.js
|
||||
localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1/plugin/localizedFormat.min.js
|
||||
|
||||
countup:
|
||||
js: https://cdn.jsdelivr.net/npm/countup.js@1.9.3/dist/countUp.min.js
|
||||
|
||||
magnific-popup:
|
||||
css: https://cdn.jsdelivr.net/npm/magnific-popup@1/dist/magnific-popup.min.css
|
||||
js: https://cdn.jsdelivr.net/npm/magnific-popup@1/dist/jquery.magnific-popup.min.js
|
||||
|
||||
lozad:
|
||||
js: https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js
|
||||
|
||||
clipboard:
|
||||
js: https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js
|
||||
|
||||
polyfill:
|
||||
js: https://polyfill.io/v3/polyfill.min.js?features=es6
|
||||
|
||||
mathjax:
|
||||
js: https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js
|
||||
@@ -1,51 +0,0 @@
|
||||
# fonts
|
||||
|
||||
webfonts: /assets/lib/fonts/main.css
|
||||
|
||||
# Libraries
|
||||
|
||||
jquery:
|
||||
js: /assets/lib/jquery-3.6.0/jquery.min.js
|
||||
|
||||
bootstrap:
|
||||
css: /assets/lib/bootstrap-4.6.1/bootstrap.min.css
|
||||
js: /assets/lib/bootstrap-4.6.1/bootstrap.bundle.min.js
|
||||
|
||||
bootstrap-toc:
|
||||
css: /assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.css
|
||||
js: /assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.js
|
||||
|
||||
fontawesome:
|
||||
css: /assets/lib/fontawesome-free-5.15.4/css/all.min.css
|
||||
|
||||
search:
|
||||
js: /assets/lib/simple-jekyll-search-1.10.0/simple-jekyll-search.min.js
|
||||
|
||||
mermaid:
|
||||
js: /assets/lib/mermaid-8.13.10/mermaid.min.js
|
||||
|
||||
dayjs:
|
||||
js:
|
||||
common: /assets/lib/dayjs-1.10.7/dayjs.min.js
|
||||
locale: /assets/lib/dayjs-1.10.7/locale/en.min.js
|
||||
relativeTime: /assets/lib/dayjs-1.10.7/plugin/relativeTime.min.js
|
||||
localizedFormat: /assets/lib/dayjs-1.10.7/plugin/localizedFormat.min.js
|
||||
|
||||
countup:
|
||||
js: /assets/lib/countup.js-1.9.3/countUp.min.js
|
||||
|
||||
magnific-popup:
|
||||
css: /assets/lib/magnific-popup-1.1.0/magnific-popup.css
|
||||
js: /assets/lib/magnific-popup-1.1.0/jquery.magnific-popup.min.js
|
||||
|
||||
lozad:
|
||||
js: /assets/lib/lozad-1.16.0/lozad.min.js
|
||||
|
||||
clipboard:
|
||||
js: /assets/lib/clipboard-2.0.9/clipboard.min.js
|
||||
|
||||
polyfill:
|
||||
js: /assets/lib/polyfill-v3-es6/polyfill.min.js
|
||||
|
||||
mathjax:
|
||||
js: /assets/lib/mathjax-3.2.0/tex-chtml.js
|
||||
@@ -1,31 +0,0 @@
|
||||
# The contact options.
|
||||
|
||||
-
|
||||
type: github
|
||||
icon: 'fab fa-github'
|
||||
-
|
||||
type: linkedin
|
||||
icon: 'fab fa-linkedin'
|
||||
url: 'https://www.linkedin.com/in/cole-n-maxwell'
|
||||
-
|
||||
type: email
|
||||
icon: 'fas fa-envelope'
|
||||
noblank: true # open link in current tab
|
||||
-
|
||||
type: rss
|
||||
icon: 'fas fa-rss'
|
||||
noblank: true
|
||||
|
||||
# Uncomment and complete the url below to enable more contact options
|
||||
# -
|
||||
# type: mastodon
|
||||
# icon: 'fab fa-mastodon' # icons powered by <https://fontawesome.com/>
|
||||
# url: '' # Fill with your mastodon account page
|
||||
# -
|
||||
# type: linkedin
|
||||
# icon: 'fab fa-linkedin' # icons powered by <https://fontawesome.com/>
|
||||
# url: '' # Fill with your Linkedin homepage
|
||||
# -
|
||||
# type: stack-overflow
|
||||
# icon: 'fab fa-stack-overflow'
|
||||
# url: '' # Fill with your stackoverflow homepage
|
||||
@@ -1,83 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Post
|
||||
category: Category
|
||||
tag: Tag
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Home
|
||||
categories: Categories
|
||||
tags: Tags
|
||||
archives: Archives
|
||||
about: About
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: search
|
||||
cancel: Cancel
|
||||
no_results: Oops! No results found.
|
||||
|
||||
panel:
|
||||
lastmod: Recently Updated
|
||||
trending_tags: Trending Tags
|
||||
toc: Contents
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: This post is licensed under :LICENSE_NAME by the author.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Some rights reserved.
|
||||
verbose: >-
|
||||
Except where otherwise noted, the blog posts on this site are licensed
|
||||
under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.
|
||||
|
||||
meta: Powered by :PLATFORM with :THEME theme.
|
||||
|
||||
not_found:
|
||||
statment: Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
|
||||
|
||||
notification:
|
||||
update_found: A new version of content is available.
|
||||
update: Update
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: By
|
||||
posted: Posted
|
||||
updated: Updated
|
||||
words: words
|
||||
pageview_measure: views
|
||||
read_time:
|
||||
unit: min
|
||||
prompt: read
|
||||
relate_posts: Further Reading
|
||||
share: Share
|
||||
button:
|
||||
next: Newer
|
||||
previous: Older
|
||||
copy_code:
|
||||
succeed: Copied!
|
||||
share_link:
|
||||
title: Copy link
|
||||
succeed: Link copied successfully!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Pinned
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure:
|
||||
singular: category
|
||||
plural: categories
|
||||
post_measure:
|
||||
singular: post
|
||||
plural: posts
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Entrada
|
||||
category: Categoría
|
||||
tag: Etiqueta
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Inicio
|
||||
categories: Categorías
|
||||
tags: Etiquetas
|
||||
archives: Archivo
|
||||
about: Acerca de
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: Buscar
|
||||
cancel: Cancelar
|
||||
no_results: ¡Oops! No se encuentran resultados.
|
||||
|
||||
panel:
|
||||
lastmod: Actualizado recientemente
|
||||
trending_tags: Etiquetas populares
|
||||
toc: Contenido
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Esta entrada está licenciada bajo :LICENSE_NAME por el autor.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Algunos derechos reservados.
|
||||
verbose: >-
|
||||
Salvo que se indique explícitamente, las entradas de este blog están licenciadas
|
||||
bajo la Creative Commons Attribution 4.0 International (CC BY 4.0) License por el autor.
|
||||
|
||||
meta: Hecho con :PLATFORM usando el tema :THEME.
|
||||
|
||||
not_found:
|
||||
statment: Lo sentimos, hemos perdido esa URL o apunta a algo que no existe.
|
||||
|
||||
notification:
|
||||
update_found: Hay una nueva versión de contenido disponible.
|
||||
update: Actualizar
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Por
|
||||
posted: Publicado
|
||||
updated: Actualizado
|
||||
words: palabras
|
||||
pageview_measure: visitas
|
||||
read_time:
|
||||
unit: min
|
||||
prompt: ' de lectura'
|
||||
relate_posts: Lecturas adicionales
|
||||
share: Compartir
|
||||
button:
|
||||
next: Nuevo
|
||||
previous: Anterior
|
||||
copy_code:
|
||||
succeed: ¡Copiado!
|
||||
share_link:
|
||||
title: Copiar enlace
|
||||
succeed: ¡Enlace copiado!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Fijado
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: categorias
|
||||
post_measure: entradas
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Post
|
||||
category: Catégorie
|
||||
tag: Tag
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Accueil
|
||||
categories: Catégories
|
||||
tags: Tags
|
||||
archives: Archives
|
||||
about: A propos de
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: recherche
|
||||
cancel: Annuler
|
||||
no_results: Oups ! Aucun résultat trouvé.
|
||||
|
||||
panel:
|
||||
lastmod: Récemment mis à jour
|
||||
trending_tags: Tags tendance
|
||||
toc: Contenu
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Cet article est sous licence :LICENSE_NAME par l'auteur.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Certains droits réservés.
|
||||
verbose: >-
|
||||
Sauf mention contraire, les articles de ce site sont publiés sous licence
|
||||
sous la licence Creative Commons Attribution 4.0 International (CC BY 4.0) par l'auteur.
|
||||
|
||||
meta: Propulsé par :PLATFORM avec le thème :THEME
|
||||
|
||||
not_found:
|
||||
statment: Désolé, nous avons égaré cette URL ou elle pointe vers quelque chose qui n'existe pas.
|
||||
|
||||
notification:
|
||||
update_found: Une nouvelle version du contenu est disponible.
|
||||
update: Mise à jour
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Par
|
||||
posted: Posté
|
||||
updated: Mis à jour
|
||||
words: mots
|
||||
pageview_measure: vues
|
||||
read_time:
|
||||
unit: min
|
||||
prompt: lire
|
||||
relate_posts: Autres lectures
|
||||
share: Partager
|
||||
button:
|
||||
next: Plus récent
|
||||
previous: Plus ancien
|
||||
copy_code:
|
||||
succeed: Copié !
|
||||
share_link:
|
||||
title: Copier le lien
|
||||
succeed: Lien copié avec succès !
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Épinglé
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: catégories
|
||||
post_measure: posts
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Postingan
|
||||
category: Kategori
|
||||
tag: Tagar
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Beranda
|
||||
categories: Kategori
|
||||
tags: Tagar
|
||||
archives: Arsip
|
||||
about: Tentang
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: Cari
|
||||
cancel: Batal
|
||||
no_results: Ups! Tidak ada hasil yang ditemukan.
|
||||
|
||||
panel:
|
||||
lastmod: Postingan Terbaru
|
||||
trending_tags: Tagar Terpopuler
|
||||
toc: Konten
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Postingan ini dilisensikan di bawah :LICENSE_NAME oleh penulis.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Sebagian konten dilindungi.
|
||||
verbose: >-
|
||||
Kecuali jika dinyatakan, Postingan blog di situs ini dilisensikan
|
||||
di bawah Lisensi Creative Commons Attribution 4.0 International (CC BY 4.0) oleh penulis.
|
||||
|
||||
meta: Didukung oleh :PLATFORM dengan tema :THEME.
|
||||
|
||||
not_found:
|
||||
statment: Maaf, kami gagal menemukan URL itu atau memang mengarah ke sesuatu yang tidak ada.
|
||||
|
||||
notification:
|
||||
update_found: Versi konten baru tersedia.
|
||||
update: Perbarui
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Oleh
|
||||
posted: Diterbitkan
|
||||
updated: Diperbarui
|
||||
words: kata
|
||||
pageview_measure: dilihat
|
||||
read_time:
|
||||
unit: menit
|
||||
prompt: baca
|
||||
relate_posts: Postingan Lainya
|
||||
share: Bagikan
|
||||
button:
|
||||
next: Terbaru
|
||||
previous: Terlama
|
||||
copy_code:
|
||||
succeed: Disalin!
|
||||
share_link:
|
||||
title: Salin tautan
|
||||
succeed: Tautan berhasil disalin!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Disematkan
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: kategori
|
||||
post_measure: Postingan
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: 포스트
|
||||
category: 카테고리
|
||||
tag: 태그
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: 홈
|
||||
categories: 카테고리
|
||||
tags: 태그
|
||||
archives: 아카이브
|
||||
about: 정보
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: 검색
|
||||
cancel: 취소
|
||||
no_results: 검색 결과가 없습니다.
|
||||
|
||||
panel:
|
||||
lastmod: 최근 업데이트
|
||||
trending_tags: 인기 태그
|
||||
toc: 바로가기
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: 이 기사는 저작권자의 :LICENSE_NAME 라이센스를 따릅니다.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: 일부 권리 보유
|
||||
verbose: >-
|
||||
명시되지 않는 한 이 사이트의 블로그 게시물은 작성자의
|
||||
Creative Commons Attribution 4.0 International(CC BY 4.0) 라이선스에 따라 사용이 허가되었습니다.
|
||||
|
||||
meta: Powered by :PLATFORM with :THEME theme.
|
||||
|
||||
not_found:
|
||||
statment: 해당 URL은 존재하지 않습니다.
|
||||
|
||||
notification:
|
||||
update_found: 새 버전의 콘텐츠를 사용할 수 있습니다.
|
||||
update: 업데이트
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: By
|
||||
posted: 게시
|
||||
updated: 업데이트
|
||||
words: 단어
|
||||
pageview_measure: 조회
|
||||
read_time:
|
||||
unit: 분
|
||||
prompt: 읽는 시간
|
||||
relate_posts: 관련된 글
|
||||
share: 공유하기
|
||||
button:
|
||||
next: 다음 글
|
||||
previous: 이전 글
|
||||
copy_code:
|
||||
succeed: 복사되었습니다!
|
||||
share_link:
|
||||
title: 링크 복사하기
|
||||
succeed: 링크가 복사되었습니다!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: 핀
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: 카테고리
|
||||
post_measure: 포스트
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: ပို့စ်
|
||||
category: ကဏ္ဍ
|
||||
tag: နာမ(တက်ဂ်)
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: အဓိကစာမျက်နှာ
|
||||
categories: ကဏ္ဍများ
|
||||
tags: နာမ(တက်ဂ်)များ
|
||||
archives: မှတ်တမ်းတိုက်
|
||||
about: အကြောင်းအရာ
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: ရှာဖွေမည်
|
||||
cancel: ဖျက်သိမ်းမည်
|
||||
no_results: အိုး! ဘာမှမရှိပါ
|
||||
|
||||
panel:
|
||||
lastmod: မကြာသေးမီကမွမ်းမံထားသည်
|
||||
trending_tags: ခေတ်စားနေသည့်တက်ဂ်များ
|
||||
toc: အကြောင်းအရာများ
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: ဤပို့စ်သည်စာရေးသူ၏ :LICENSE_NAME လိုင်စင်ရထားသည်။
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: မူပိုင်ခွင့်အချို့ကို လက်ဝယ်ထားသည်။
|
||||
verbose: >-
|
||||
အခြားမှတ်သားထားချက်များမှလွဲ၍ ဤဆိုက်ရှိ ဘလော့ဂ်ပို့စ်များသည် စာရေးသူ၏
|
||||
Creative Commons Attribution 4.0 International (CC BY 4.0) အောက်တွင် လိုင်စင်ရထားပါသည်။
|
||||
|
||||
meta: Powered by :PLATFORM with :THEME theme.
|
||||
|
||||
not_found:
|
||||
statment: ဝမ်းနည်းပါသည်၊ ကျွန်ုပ်တို့သည် အဆိုပါ URL ကို မှားယွင်းစွာ နေရာချထားခြင်း သို့မဟုတ် ၎င်းသည် မရှိသောအရာကို ညွှန်ပြနေပါသည်။
|
||||
|
||||
notification:
|
||||
update_found: အကြောင်းအရာဗားရှင်းအသစ်ကို ရနိုင်ပါပြီ။
|
||||
update: အပ်ဒိတ်
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: ကရေးသားခဲ့သည်။
|
||||
posted: တင်ထားခဲ့သည်။
|
||||
updated: မွမ်းမံထားခဲ့သည်။
|
||||
words: စကားလုံးများ
|
||||
pageview_measure: အမြင်များ
|
||||
read_time:
|
||||
unit: မိနစ်
|
||||
prompt: ဖတ်ပါမည်
|
||||
relate_posts: နောက်ထပ်ဖတ်ရန်
|
||||
share: မျှဝေရန်
|
||||
button:
|
||||
next: အသစ်များ
|
||||
previous: အဟောင်းများ
|
||||
copy_code:
|
||||
succeed: ကူးယူလိုက်ပြီ။
|
||||
share_link:
|
||||
title: လင့်ခ်ကို ကူးယူရန်
|
||||
succeed: လင့်ခ်ကို ကူးယူလိုက်ပြီ။
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: ချိတ်ထားသည်။
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: ကဏ္ဍများ
|
||||
post_measure: ပို့စ်များ
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Post
|
||||
category: Categoria
|
||||
tag: Tag
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Home
|
||||
categories: Categorias
|
||||
tags: Tags
|
||||
archives: Arquivos
|
||||
about: Sobre
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: Buscar
|
||||
cancel: Cancelar
|
||||
no_results: Oops! Nenhum resultado encontrado.
|
||||
|
||||
panel:
|
||||
lastmod: Atualizados recentemente
|
||||
trending_tags: Trending Tags
|
||||
toc: Conteúdo
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Esta postagem está licenciada sob :LICENSE_NAME pelo autor.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Alguns direitos reservados.
|
||||
verbose: >-
|
||||
Exceto onde indicado de outra forma, as postagens do blog neste site são licenciadas sob a
|
||||
Creative Commons Attribution 4.0 International (CC BY 4.0) License pelo autor.
|
||||
|
||||
meta: Feito com :PLATFORM usando o tema :THEME.
|
||||
|
||||
not_found:
|
||||
statment: Desculpe, a página não foi encontrada.
|
||||
|
||||
notification:
|
||||
update_found: Uma nova versão do conteúdo está disponível.
|
||||
update: atualização
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Por
|
||||
posted: Postado em
|
||||
updated: Atualizado
|
||||
words: palavras
|
||||
pageview_measure: visualizações
|
||||
read_time:
|
||||
unit: min
|
||||
prompt: " de leitura"
|
||||
relate_posts: Leia também
|
||||
share: Compartilhar
|
||||
button:
|
||||
next: Próximo
|
||||
previous: Anterior
|
||||
copy_code:
|
||||
succeed: Copiado!
|
||||
share_link:
|
||||
title: Copie o link
|
||||
succeed: Link copiado com sucesso!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Fixado
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: categorias
|
||||
post_measure: posts
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Публикация
|
||||
category: Категория
|
||||
tag: Тег
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Домашняя страница
|
||||
categories: Категории
|
||||
tags: Теги
|
||||
archives: Архив
|
||||
about: О сайте
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: поиск
|
||||
cancel: Отменить
|
||||
no_results: Ох! Ничего не найдено.
|
||||
|
||||
panel:
|
||||
lastmod: Недавно обновлено
|
||||
trending_tags: Популярные теги
|
||||
toc: Содержание
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Публикация защищена лицензией :LICENSE_NAME.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Некоторые права защищены.
|
||||
verbose: >-
|
||||
Публикации на сайте защищены лицензией Creative Commons Attribution 4.0 International (CC BY 4.0),
|
||||
если в тексте публикации не указано иное.
|
||||
|
||||
meta: Powered by :PLATFORM with :THEME theme.
|
||||
|
||||
not_found:
|
||||
statment: Извините, эта ссылка указывает на ресурс который не существует.
|
||||
|
||||
notification:
|
||||
update_found: Доступна новая версия контента.
|
||||
update: Обновлять
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Автор
|
||||
posted: Время публикации
|
||||
updated: Обновлено
|
||||
words: слов
|
||||
pageview_measure: просмотров
|
||||
read_time:
|
||||
unit: минут
|
||||
prompt: чтения
|
||||
relate_posts: Вам также может быть интересно
|
||||
share: Поделиться
|
||||
button:
|
||||
next: Предыдущая публикация
|
||||
previous: Следующая публикация
|
||||
copy_code:
|
||||
succeed: Скопировано успешно!
|
||||
share_link:
|
||||
title: Скопировать ссылку
|
||||
succeed: Ссылка успешно скопирована!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Закреплено
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: категории
|
||||
post_measure: публикации
|
||||
@@ -1,79 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Публікація
|
||||
category: Категорія
|
||||
tag: Тег
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Домашня сторінка
|
||||
categories: Категорії
|
||||
tags: Теги
|
||||
archives: Архів
|
||||
about: Про сайт
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: пошук
|
||||
cancel: Скасувати
|
||||
no_results: Ох! Нічого не знайдено.
|
||||
|
||||
panel:
|
||||
lastmod: Нещодавно оновлено
|
||||
trending_tags: Популярні теги
|
||||
toc: Зміст
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Публікація захищена ліцензією :LICENSE_NAME.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Деякі права захищено.
|
||||
verbose: >-
|
||||
Публікації на сайті захищено ліцензією Creative Commons Attribution 4.0 International (CC BY 4.0),
|
||||
якщо інше не вказано в тексті.
|
||||
|
||||
meta: Powered by :PLATFORM with :THEME theme.
|
||||
|
||||
not_found:
|
||||
statment: Вибачте, це посилання вказує на ресурс, що не існує.
|
||||
|
||||
notification:
|
||||
update_found: Доступна нова версія вмісту.
|
||||
update: Оновлення
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Автор
|
||||
posted: Час публікації
|
||||
updated: Оновлено
|
||||
words: слів
|
||||
pageview_measure: переглядів
|
||||
read_time:
|
||||
unit: хвилин
|
||||
prompt: читання
|
||||
relate_posts: Вас також може зацікавити
|
||||
share: Поділитися
|
||||
button:
|
||||
next: Попередня публікація
|
||||
previous: Наступна публікація
|
||||
copy_code:
|
||||
succeed: Успішно скопійовано!
|
||||
share_link:
|
||||
title: Скопіювати посилання
|
||||
succeed: Посилання успішно скопійовано!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Закріплено
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: категорії
|
||||
post_measure: публікації
|
||||
@@ -1,77 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: Bài viết
|
||||
category: Danh mục
|
||||
tag: Thẻ
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: Trang chủ
|
||||
categories: Các danh mục
|
||||
tags: Các thẻ
|
||||
archives: Lưu trữ
|
||||
about: Giới thiệu
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: tìm kiếm
|
||||
cancel: Hủy
|
||||
no_results: Không có kết quả tìm kiếm.
|
||||
|
||||
panel:
|
||||
lastmod: Mới cập nhật
|
||||
trending_tags: Các thẻ thịnh hành
|
||||
toc: Mục lục
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: Bài viết này được cấp phép bởi tác giả theo giấy phép :LICENSE_NAME.
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: Một số quyền được bảo lưu.
|
||||
verbose: >-
|
||||
Trừ khi có ghi chú khác, các bài viết đăng trên trang này được cấp phép bởi tác giả theo giấy phép Creative Commons Attribution 4.0 International (CC BY 4.0).
|
||||
meta: Trang web này được tạo bởi :PLATFORM với chủ đề :THEME.
|
||||
|
||||
not_found:
|
||||
statment: Xin lỗi, chúng tôi đã đặt nhầm URL hoặc đường dẫn trỏ đến một trang nào đó không tồn tại.
|
||||
|
||||
notification:
|
||||
update_found: Đã có phiên bản mới của nội dung.
|
||||
update: Cập nhật
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: Viết bởi
|
||||
posted: Đăng lúc
|
||||
updated: Cập nhật lúc
|
||||
words: từ
|
||||
pageview_measure: lượt xem
|
||||
read_time:
|
||||
unit: phút
|
||||
prompt: đọc
|
||||
relate_posts: Bài viết liên quan
|
||||
share: Chia sẻ
|
||||
button:
|
||||
next: Mới hơn
|
||||
previous: Cũ hơn
|
||||
copy_code:
|
||||
succeed: Đã sao chép!
|
||||
share_link:
|
||||
title: Sao chép đường dẫn
|
||||
succeed: Đã sao chép đường dẫn thành công!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: Bài ghim
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: danh mục
|
||||
post_measure: bài viết
|
||||
@@ -1,78 +0,0 @@
|
||||
# The layout text of site
|
||||
|
||||
# ----- Commons label -----
|
||||
|
||||
layout:
|
||||
post: 文章
|
||||
category: 分类
|
||||
tag: 标签
|
||||
|
||||
# The tabs of sidebar
|
||||
tabs:
|
||||
# format: <filename_without_extension>: <value>
|
||||
home: 首页
|
||||
categories: 分类
|
||||
tags: 标签
|
||||
archives: 归档
|
||||
about: 关于
|
||||
|
||||
# the text displayed in the search bar & search results
|
||||
search:
|
||||
hint: 搜索
|
||||
cancel: 取消
|
||||
no_results: 搜索结果为空
|
||||
|
||||
panel:
|
||||
lastmod: 最近更新
|
||||
trending_tags: 热门标签
|
||||
toc: 文章内容
|
||||
|
||||
copyright:
|
||||
# Shown at the bottom of the post
|
||||
license:
|
||||
template: 本文由作者按照 :LICENSE_NAME 进行授权
|
||||
name: CC BY 4.0
|
||||
link: https://creativecommons.org/licenses/by/4.0/
|
||||
|
||||
# Displayed in the footer
|
||||
brief: 保留部分权利。
|
||||
verbose: >-
|
||||
除非另有说明,本网站上的博客文章均由作者按照知识共享署名 4.0 国际 (CC BY 4.0) 许可协议进行授权。
|
||||
|
||||
meta: 本站由 :PLATFORM 生成,采用 :THEME 主题。
|
||||
|
||||
not_found:
|
||||
statment: 抱歉,我们放错了该 URL,或者它指向了不存在的内容。
|
||||
|
||||
notification:
|
||||
update_found: 发现新版本的内容。
|
||||
update: 更新
|
||||
|
||||
# ----- Posts related labels -----
|
||||
|
||||
post:
|
||||
written_by: 作者
|
||||
posted: 发表于
|
||||
updated: 更新于
|
||||
words: 字
|
||||
pageview_measure: 次浏览
|
||||
read_time:
|
||||
unit: 分钟
|
||||
prompt: 阅读
|
||||
relate_posts: 相关文章
|
||||
share: 分享
|
||||
button:
|
||||
next: 下一篇
|
||||
previous: 上一篇
|
||||
copy_code:
|
||||
succeed: 已复制!
|
||||
share_link:
|
||||
title: 分享链接
|
||||
succeed: 链接已复制!
|
||||
# pinned prompt of posts list on homepage
|
||||
pin_prompt: 顶置
|
||||
|
||||
# categories page
|
||||
categories:
|
||||
category_measure: 个分类
|
||||
post_measure: 篇文章
|
||||
@@ -1,27 +0,0 @@
|
||||
# Sharing options at the bottom of the post.
|
||||
# Icons from <https://fontawesome.com/>
|
||||
|
||||
platforms:
|
||||
-
|
||||
type: Twitter
|
||||
icon: "fab fa-twitter"
|
||||
link: "https://twitter.com/intent/tweet?text=TITLE&url=URL"
|
||||
-
|
||||
type: Facebook
|
||||
icon: "fab fa-facebook-square"
|
||||
link: "https://www.facebook.com/sharer/sharer.php?title=TITLE&u=URL"
|
||||
-
|
||||
type: Telegram
|
||||
icon: "fab fa-telegram"
|
||||
link: "https://t.me/share/url?url=URL&text=TITLE"
|
||||
|
||||
# Uncomment below if you need to.
|
||||
# -
|
||||
# type: Linkedin
|
||||
# icon: "fab fa-linkedin"
|
||||
# link: "https://www.linkedin.com/sharing/share-offsite/?url=URL"
|
||||
#
|
||||
# -
|
||||
# type: Weibo
|
||||
# icon: "fab fa-weibo"
|
||||
# link: "http://service.weibo.com/share/share.php?title=TITLE&url=URL"
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env ruby
|
||||
#
|
||||
# Check for changed posts
|
||||
|
||||
Jekyll::Hooks.register :posts, :post_init do |post|
|
||||
|
||||
commit_num = `git rev-list --count HEAD "#{ post.path }"`
|
||||
|
||||
if commit_num.to_i > 1
|
||||
lastmod_date = `git log -1 --pretty="%ad" --date=iso "#{ post.path }"`
|
||||
post.data['last_modified_at'] = lastmod_date
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,207 +0,0 @@
|
||||
---
|
||||
date: 2022-07-14 15:30:55 -05:00
|
||||
title: Utilize a RESTful API with IBMi QSYS_HTTP Tools in SQL
|
||||
categories: [IBM i,]
|
||||
tags: [ibmi, api, qsys2, rest, sql]
|
||||
---
|
||||
|
||||
## The Api
|
||||
|
||||
This demo used the `fakeStoreApi` which is a free online REST API that you can use whenever you need Pseudo-real data for without running any server-side code. It's awesome for teaching purposes, sample codes, tests, etc. This API does not require authentication for requests
|
||||
|
||||
> A list of other public APIs can be found [here](https://github.com/public-apis/public-apis)
|
||||
|
||||
## HTTP Functions Overview
|
||||
These HTTP functions are used to make HTTP requests that use web services. These functions allow the SQL programmer to use Representational State Transfer (RESTful) via SQL, including Embedded SQL. They provide the same capabilities as the [SYSTOOLS HTTP functions](https://www.ibm.com/docs/en/ssw_ibm_i_75/rzajq/rzajqhttpoverview.htm) without the overhead of creating a JVM.
|
||||
|
||||
These HTTP functions exist in QSYS2 and have lower overhead than the SYSTOOLS HTTP functions. Additional benefits of the QSYS2 HTTP functions are HTTP authentication, proxy support, configurable redirection attempts, and configurable SSL options.
|
||||
|
||||
The URL parameter supports http: and https: URLs. The https: URL indicates that network communication should take place over a secure communication channel. An https request uses TLS (Transport Layer Security) to create the secure channel. This secure channel encrypts any transmitted data and also prevents man-in-the-middle attacks. Any communication that contains secure information should use https instead of http. Because of the sensitive nature of userids and passwords, HTTP authentication is not allowed for http URLs.
|
||||
|
||||
### Foundational HTTP functions
|
||||
The foundational functions are named according to the two dimensions used when making HTTP requests.
|
||||
The first dimension is the HTTP operation. There are 5 different HTTP operations: GET, PUT, POST, PATCH, and DELETE.
|
||||
The second dimension indicates whether the verbose version of the function should be used. The non-verbose functions are scalar functions that return the response as a CLOB. The verbose functions are table functions that return a single row, which includes the return header information that is sent from the HTTP server. The header information is formatted as JSON.
|
||||
The names of the functions reflect these dimensions. For example, HTTP_GET_VERBOSE uses the GET operation from the first dimension and the VERBOSE setting from the second dimension. All the functions return CLOB data.
|
||||
|
||||
> See the [IBM Docs](https://www.ibm.com/docs/en/i/7.4?topic=programming-http-functions-overview) for more details
|
||||
|
||||
# Get a List of Products
|
||||
|
||||
The first demo receives a list of products from the `fakeStoreApi` as JSON. Here is a look at the JSON we can expect to receive:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Fjallraven - Foldsack No. 1 Backpack, Fits 15 Laptops",
|
||||
"price": 109.95,
|
||||
"description": "Your perfect pack for everyday use and walks in the forest. Stash your laptop (up to 15 inches) in the padded sleeve, your everyday",
|
||||
"category": "men's clothing",
|
||||
"image": "https://fakestoreapi.com/img/81fPKd-2AYL._AC_SL1500_.jpg",
|
||||
"rating": {
|
||||
"rate": 3.9,
|
||||
"count": 120
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "Mens Casual Premium Slim Fit T-Shirts ",
|
||||
"price": 22.3,
|
||||
"description": "Slim-fitting style, contrast raglan long sleeve, three-button henley placket, light weight & soft fabric for breathable and comfortable wearing. And Solid stitched shirts with round neck made for durability and a great fit for casual fashion wear and diehard baseball fans. The Henley style round neckline includes a three-button placket.",
|
||||
"category": "men's clothing",
|
||||
"image": "https://fakestoreapi.com/img/71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg",
|
||||
"rating": {
|
||||
"rate": 4.1,
|
||||
"count": 259
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
This is actually an array of two JSON objects. The JSON tools provided by DB2 are smart and will know to treat each object separately. To make sure we are getting the expected JSON we can print the results of `QSYS2.HTTP_GET` with the `VALUES` keyword.
|
||||
|
||||
```sql
|
||||
VALUES QSYS2.HTTP_GET(
|
||||
'http://fakestoreapi.com/products?limit=2',
|
||||
''
|
||||
);
|
||||
```
|
||||
|
||||
`QSYS2.HTTP_GET` takes two arguments. The first argument is the URL of the API endpoint the GET request will be sent to. In this case it is the `http://fakestoreapi.com/products` endpoint and the `limit=2` parameter is added to only get two items total. The second argument is for [HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) parameters. In this case no HTTP header parameters need to be specified to complete the request so this field can be left empty.
|
||||
|
||||
The `JSON_TABLE` function can take any `QSYS2.HTTP_XXXX` that produces JSON as an argument. The values from the JSON keys can then be extracted and placed directly into a table.
|
||||
|
||||
```sql
|
||||
SELECT *
|
||||
FROM JSON_TABLE(
|
||||
QSYS2.HTTP_GET(
|
||||
'http://fakestoreapi.com/products?limit=10',
|
||||
''
|
||||
),
|
||||
'$' COLUMNS(
|
||||
name VARCHAR(75) PATH 'lax $.title',
|
||||
totalRatings INT PATH 'lax $.rating.count'
|
||||
)
|
||||
);
|
||||
```
|
||||
This example will extract the values from the `title` (name of item) key and the nested field `count` (total number of ratings) key in the ratings array. and then place them into a table with the column names `name` and `totalRatings`.
|
||||
|
||||
#### Result:
|
||||
|
||||
| Name | Rating |
|
||||
| --------------------------------------------------------------------------- | ------ |
|
||||
| Fjallraven - Foldsack No. 1 Backpack, Fits 15 Laptops | 120 |
|
||||
| Mens Casual Premium Slim Fit T-Shirts | 259 |
|
||||
| Mens Cotton Jacket | 500 |
|
||||
| Mens Casual Slim Fit | 430 |
|
||||
| John Hardy Women's Legends Naga Gold & Silver Dragon Station Chain Bracelet | 400 |
|
||||
| Solid Gold Petite Micropave | 70 |
|
||||
| White Gold Plated Princess | 400 |
|
||||
| Pierced Owl Rose Gold Plated Stainless Steel Double | 100 |
|
||||
| WD 2TB Elements Portable External Hard Drive - USB 3.0 | 203 |
|
||||
| SanDisk SSD PLUS 1TB Internal SSD - SATA III 6 Gb/s | 470 |
|
||||
|
||||
# POST a New User
|
||||
|
||||
The next example is sending a POST request to the `https://fakestoreapi.com/users` endpoint to create a new user. The `fakeStoreApi` [docs](https://fakestoreapi.com/docs) indicate that the body of our HTTP POST request should contain the following JSON object:
|
||||
|
||||
```json
|
||||
{
|
||||
"email":"John@gmail.com",
|
||||
"username":"johnd",
|
||||
"password":"m38rmF$",
|
||||
"name":{
|
||||
"firstname":"John",
|
||||
"lastname":"Doe"
|
||||
},
|
||||
"address":{
|
||||
"city":"kilcoole",
|
||||
"street":"7835 new road",
|
||||
"number":3,
|
||||
"zipcode":"12926-3874",
|
||||
"geolocation":{
|
||||
"lat":"-37.3159",
|
||||
"long":"81.1496"
|
||||
}
|
||||
},
|
||||
"phone": "1-570-236-7033"
|
||||
}
|
||||
```
|
||||
Upon a successful add of a new user the API will return a 200 response code and a JSON object with the user's new id:
|
||||
|
||||
```json
|
||||
{
|
||||
"address": {
|
||||
"geolocation": {
|
||||
"lat": "-37.3159",
|
||||
"long": "81.1496"
|
||||
},
|
||||
"city": "kilcoole",
|
||||
"street": "7835 new road"
|
||||
},
|
||||
"_id": "62c73539f0321700139f4682",
|
||||
"id": 1,
|
||||
"email": "John@gmail.com",
|
||||
"username": "johnd",
|
||||
"password": "m38rmF$",
|
||||
"phone": "1-570-236-7033"
|
||||
}
|
||||
```
|
||||
|
||||
`QSYS2.HTTP_POST` takes three This time arguments the URL, the HTTP body and the HTTP header parameters. This time the URL and body arguments of the `QSYS2.HTTP_POST` will be assigned to variables for readability.
|
||||
|
||||
We also need to specify the "Content-Type" in the HTTP header to indicate that our HTTP body will be in JSON format. By default `QSYS2.HTTP_POST` specifies the content type of the body to be XML. To override this setting we pass in the header settings in JSON format:
|
||||
|
||||
```json
|
||||
{"header":"Content-Type,application/json;charset=utf-8"}
|
||||
```
|
||||
> More information about the different header settings that can to passed to the `QSYS2.HTTP_XXXX` tools can be found in the [IBM docs](https://www.ibm.com/docs/en/i/7.4?topic=functions-http-get#rbafzscahttpget__HTTP_options)
|
||||
|
||||
Here all the moving parts put together:
|
||||
|
||||
```sql
|
||||
Create or replace variable @userURL varchar(50) ;
|
||||
SET @userURL = 'http://fakestoreapi.com/users';
|
||||
|
||||
Create or replace variable @postBody varchar(500) ;
|
||||
SET @postBody = '{
|
||||
"email":"John@gmail.com",
|
||||
"username":"johnd",
|
||||
"password":"m38rmF$",
|
||||
"name":{
|
||||
"firstname":"John",
|
||||
"lastname":"Doe"
|
||||
},
|
||||
"address":{
|
||||
"city":"kilcoole",
|
||||
"street":"7835 new road",
|
||||
"number":3,
|
||||
"zipcode":"12926-3874",
|
||||
"geolocation":{
|
||||
"lat":"-37.3159",
|
||||
"long":"81.1496"
|
||||
}
|
||||
},
|
||||
"phone": "1-570-236-7033"
|
||||
}';
|
||||
|
||||
SELECT *
|
||||
FROM JSON_TABLE(
|
||||
QSYS2.HTTP_POST(
|
||||
@userURL,
|
||||
@postBody,
|
||||
'{"header":"Content-Type,application/json;charset=utf-8"}'
|
||||
),
|
||||
'$' COLUMNS(
|
||||
testID INT PATH 'lax $.id',
|
||||
email VARCHAR(50) PATH 'lax $.email',
|
||||
username VARCHAR(50) PATH 'lax $.username',
|
||||
password VARCHAR(50) PATH 'lax $.password'
|
||||
)
|
||||
);
|
||||
```
|
||||
And the result:
|
||||
|
||||
| TESTID | EMAIL | USERNAME | PASSWORD |
|
||||
| ------ | -------------- | -------- | -------- |
|
||||
| 1 | John@gmail.com | johnd | m38rmF$ |
|
||||
@@ -1,234 +0,0 @@
|
||||
---
|
||||
date: 2022-08-03 19:39:00 -05:00
|
||||
title: Using ODBC on IBM i for Local Linux Development
|
||||
categories: [IBM i,]
|
||||
tags: [ibmi, odbc, linux, as400, sql]
|
||||
---
|
||||
|
||||
If you are new to the IBM i platform coming right out of school, like me, or you are a developer used to working exclusively with open-source tooling, the IBM i platform can be a strange place. The legacy application support is industry leading, to both the benefit and downside of the platform. Under the hood there is IBM's powerful and well tested relational database, DB2 for i. So far, I like what I see. Is it possible to get the best of the open-source tooling while leveraging the power of an existing enterprise grade database? My initial take is yes, and the ODBC driver on the platform is the answer.
|
||||
|
||||
The [Open Database Connectivity](https://en.wikipedia.org/wiki/Open_Database_Connectivity) (ODBC) standard is an application programming interface (API) for accessing database management systems (DBMS). The designers of ODBC aimed to make it independent of database systems and operating systems. From what I have seen so far IBM is continuing to make improvements to the driver in the latest release of IBM i. I personally view ODBC as the future of the platform and a key factor to help IBM i remain relevant as the years progress.
|
||||
|
||||
As I have gotten my start, the other open-source advocates on the IBM i platform have provided many excellent articles, source code examples, and video lessons that have aided my on boarding to the platform. However, even though the topic of ODBC has been extensively covered I still felt like a comprehensive guide for connecting locally to DB2 for i via ODBC on a linux development machine was missing.
|
||||
|
||||
This post has compiled the good, but scattered, information to explain how an open-source developer would go about connecting up their local linux machine to DB2 for i to develop an application in an open-source language of their choice. I want to give a big thank you and credit to **Liam Allan**, **Kevin Adler**, **Seiden Group**, and **FormaServe** for helping get this information out to the community. They are the heavy hitters aiding the open-source embracement on IBM i. Much of the following is copied directly from their blogs and video resources. Please see the [references](#references) at the end of this post.
|
||||
|
||||
# Prerequisites
|
||||
You must have the ODBC driver installed on the IBM i you want to connect to. See Seiden Group's guide[^Seiden] for [Using YUM to Install or Update the IBM i ODBC Driver](https://www.seidengroup.com/2022/07/11/using-yum-to-install-or-update-the-ibm-i-odbc-driver/)
|
||||
|
||||
### Enhance Your Understanding
|
||||
If your background is exclusively developing on the IBM i (AS400) and you don't have experience with Linux or other Unix-like operating systems you may want to spend some time reading about the basic file structure of Unix-like operating systems. You will find these patterns in the `/QOpenSys` directory on IBM i and it will aid your journey to better understand open-source on IBM i and even Linux.
|
||||
|
||||
* University of Cincinnati: [The Unix File System](https://homepages.uc.edu/~thomam/Intro_Unix_Text/File_System.html)
|
||||
* IBM: [Open systems file system (QOpenSys)](https://www.ibm.com/docs/en/i/7.5?topic=systems-open-file-system-qopensys)
|
||||
|
||||
# Installing the Repository
|
||||
IBM has made RPM and DEB package manager repositories for Linux available directly from IBM for the `IBM i Access Client Solutions` application package, which includes the `IBM i Access ODBC driver`.
|
||||
|
||||
With this change, it is much easier to install the driver on Linux. It also makes it easier for automation to install the driver as well, whether that’s Ansible system deployment scripts or Dockerfiles for building ODBC-based Linux container apps. In addition, it makes updating the driver much easier too, since the process uses the same upgrade procedure as the rest of the system packages[^Adler].
|
||||
|
||||
The repositories are located under: [https://public.dhe.ibm.com/software/ibmi/products/odbc/](https://public.dhe.ibm.com/software/ibmi/products/odbc/).
|
||||
|
||||
## Add the Repository to the Package Manager
|
||||
|
||||
First, you must add IBM's package repository to your distribution's package manager.
|
||||
|
||||
### Debian-based and Ubuntu-based Distribution Setup
|
||||
``` shell
|
||||
curl https://public.dhe.ibm.com/software/ibmi/products/odbc/debs/dists/1.1.0/ibmi-acs-1.1.0.list | sudo tee /etc/apt/sources.list.d/ibmi-acs-1.1.0.list
|
||||
```
|
||||
### Red Hat-based Distribution Setup
|
||||
``` shell
|
||||
curl https://public.dhe.ibm.com/software/ibmi/products/odbc/rpms/ibmi-acs.repo | sudo tee /etc/yum.repos.d/ibmi-acs.repo
|
||||
```
|
||||
### SUSE-based Distribution Setup
|
||||
``` shell
|
||||
curl https://public.dhe.ibm.com/software/ibmi/products/odbc/rpms/ibmi-acs.repo | sudo tee /etc/zypp/repos.d/ibmi-acs.repo
|
||||
```
|
||||
|
||||
# Installing the ODBC driver
|
||||
Now install the package via the distribution's package manager.
|
||||
### Debian-based and Ubuntu-based Distribution Installation
|
||||
``` shell
|
||||
sudo apt update
|
||||
sudo apt install ibm-iaccess
|
||||
```
|
||||
### Red Hat-based Distribution Installation
|
||||
``` shell
|
||||
sudo dnf install --refresh ibm-iaccess
|
||||
```
|
||||
### SUSE-based Distribution Installation
|
||||
``` shell
|
||||
sudo zypper refresh
|
||||
sudo zypper install ibm-iaccess
|
||||
```
|
||||
|
||||
# Configuring the Connection (FYI)
|
||||
|
||||
Now that you have the IBM i Access ODBC Driver installed on your system, you are ready to connect to Db2 on i. Below is some background information on the two methods to create a connection.
|
||||
|
||||
## Connection Strings
|
||||
ODBC uses a connection string with keywords to create a database connection. Keywords are case insensitive, and values passed are separated from the keyword by an equals sign (“=”) and end with a semi-colon (“;”). As long as you are using an ODBC database connector, you should be able to pass an identical connection string in any language or technology and be confident that it will correctly connect to Db2 on i. A common connection string may look something like[^odbc-docs]:
|
||||
|
||||
```
|
||||
DRIVER=IBM i Access ODBC Driver;SYSTEM=my.ibmi.system;UID=foo;PWD=bar;
|
||||
```
|
||||
In the above example, we define the following connection options:
|
||||
|
||||
* DRIVER: The ODBC driver for Db2 for i that we are using to connect to the database (and that we installed above)
|
||||
* SYSTEM: The location of your IBM i system, which can be its network name, IP address, or similar
|
||||
* UID: The User ID that you want to use on the IBM i system that you are connecting to
|
||||
* PWD: The password of the User ID passed above.
|
||||
|
||||
These are only some of the over 70 connection options you can use when connecting to Db2 on i using the IBM i Access ODBC Driver. A complete list of IBM i Access ODBC Driver connection options can be found at the [IBM Knowledge Center: Connection string keywords webpage](https://www.ibm.com/docs/en/i/7.4?topic=details-connection-string-keywords). If passing connections options through the connection string, be sure to use the keyword labeled with **Connection String**.
|
||||
|
||||
## DSNs
|
||||
As you add more and more options to your connection string, your connection string can become quite cumbersome. Luckily, ODBC offers another way of defining connection options called a DSN (datasource name). Where you define your DSN will depend on whether you are using Windows ODBC driver manager or unixODBC on Linux or IBM i[^odbc-docs].
|
||||
|
||||
IBM i, Linux distributions, and macOS use unixODBC and have nearly identical methods of setting up your drivers and your DSNs.
|
||||
|
||||
`odbc.ini` and `.odbc.ini`
|
||||
|
||||
When using unixODBC, DSNs are defined in `odbc.ini` and `.odbc.ini` (note the `.` preceding the latter). These two files have the same structure, but have one important difference:
|
||||
|
||||
`odbc.ini` defines DSNs that are available to all users on the system. If there are DSNs that should be available to everyone, they can be defined and shared here. Likely, this file is located in the default location, which depends on whether you are on IBM i or Linux:
|
||||
|
||||
IBM i: `/QOpenSys/etc/odbc.ini`
|
||||
|
||||
Linux: `/etc/unixODBC/odbc.ini`
|
||||
|
||||
If you want to make sure, the file can be found by running:
|
||||
```
|
||||
odbcinst -j
|
||||
```
|
||||
.odbc.ini is found in your home directory `~/` and defines DSNs that are available only to you. If you are going to define DSNs with your personal username and password, this is the place to do it.
|
||||
|
||||
In both `odbc.ini` and `.odbc.ini`, you name your DSN with `[]` brackets, then specify keywords and values below it. An example of a DSN stored in `~/.odbc.ini` used to connect to an IBM i system with private credentials might look like:
|
||||
|
||||
```
|
||||
[MYDSN]
|
||||
Description = My IBM i System
|
||||
Driver = IBM i Access ODBC Driver
|
||||
System = my.ibmi.system
|
||||
UserID = foo
|
||||
Password = bar
|
||||
Naming = 0
|
||||
DefaultLibraries = MYLIB
|
||||
TrueAutoCommit = 1
|
||||
```
|
||||
|
||||
In the above example, we define the following connection options:
|
||||
|
||||
* Driver: The ODBC driver for Db2 for i that we are using to connect to the database (and that we installed above)
|
||||
* System: The location of your IBM i system, which can be its network name, IP address, or similar
|
||||
* UserID: The User ID that you want to use on the IBM i system that you are connecting to
|
||||
* Password: The password of the User ID passed above.
|
||||
* Naming: Specifies the naming convention used when referring to tables. For more information, refer to Naming [conventions](https://www.ibm.com/docs/en/ssw_ibm_i_74/db2/rbafzch2nam.htm) in the DB2 for i SQL reference.
|
||||
* DefaultLibraries: Specifies the IBM i libraries to add to the server job's library list as well as the default library used to resolve unqualified names. The libraries can be delimited by commas or spaces.
|
||||
* TrueAutoCommit: Specifies how to handle autocommit support
|
||||
|
||||
Like connection string keywords, DSN keywords can be found at the [IBM Knowledge Center: Connection string keywords webpage](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/rzaik/connectkeywords.htm). When passing connection options through a DSN, be sure to use the keyword labeled with ODBC.INI.
|
||||
|
||||
# User Level Connection
|
||||
|
||||
1. In your home directory create a `.odbc.ini` file
|
||||
|
||||
```
|
||||
touch .odbc.ini
|
||||
```
|
||||
2. Using your text editor of choice ([vi](https://www.redhat.com/sysadmin/introduction-vi-editor), [vim](https://linuxfoundation.org/blog/classic-sysadmin-vim-101-a-beginners-guide-to-vim/), [nano](https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/), ect...) add the following DSN configuration, changing the `UserID` and `Password` to **your** IBM i username and password.
|
||||
|
||||
```
|
||||
[devserver]
|
||||
Description = Connection to development power server
|
||||
Driver = IBM i Access ODBC Driver
|
||||
System = devserver.mycompany.com
|
||||
UserID = myUsername
|
||||
Password = myPassword
|
||||
Naming = 0
|
||||
DefaultLibraries = businessDataLib,myUserLib,myBusinessUtils
|
||||
```
|
||||
|
||||
In the above example, we define the following connection options:
|
||||
* Driver: The ODBC driver for Db2 for i that we are using to connect to the database (This must be installed on the OS)
|
||||
* System: The location of your IBM i system, which can be its network name, IP address, or similar
|
||||
* UserID: The User ID that you want to use on the IBM i system that you are connecting to
|
||||
* Password: The password of the User ID passed above.
|
||||
* Naming: Specifies the naming convention used when referring to tables. A `0` indicates you want SQLs naming convention, which is likely what you want for running queries in any program you write.
|
||||
* DefaultLibraries: Specifies the IBM i libraries to add to the server job's library list as well as the default library used to resolve unqualified names. The libraries can be delimited by commas or spaces.
|
||||
|
||||
# Testing the Connection
|
||||
|
||||
The `isql` command is included with the open source components of unixODBC and unixODBC-devel. You can use this command to run SQL queries via ODBC right from the command-line. To make the connection to the **DSN** configured above pass in the DSN name:
|
||||
|
||||
```
|
||||
isql devserver
|
||||
```
|
||||
|
||||
If the connection is configured correctly, you will get a prompt that looks like this:
|
||||
|
||||
```
|
||||
+---------------------------------------+
|
||||
| Connected! |
|
||||
| |
|
||||
| sql-statement |
|
||||
| help [tablename] |
|
||||
| quit |
|
||||
| |
|
||||
+---------------------------------------+
|
||||
SQL>
|
||||
```
|
||||
|
||||
There is an included sample customer table (`qiws.qcustcdt`) on all IBM i systems that can be used for testing[^FormaServe]
|
||||
|
||||
Type this command into the `SQL>` prompt:
|
||||
```
|
||||
select * from qiws.qcustcdt
|
||||
```
|
||||
|
||||
The results will look like this:
|
||||
```
|
||||
SQL> select * from qiws.qcustcdt
|
||||
+---------+---------+-----+--------------+-------+------+--------+-------+-------+---------+---------+
|
||||
| CUSNUM | LSTNAM | INIT| STREET | CITY | STATE| ZIPCOD | CDTLMT| CHGCOD| BALDUE | CDTDUE |
|
||||
+---------+---------+-----+--------------+-------+------+--------+-------+-------+---------+---------+
|
||||
| 938472 | Henning | G K | 4859 Elm Ave | Dallas| TX | 75217 | 5000 | 3 | 37.00 | 0 |
|
||||
| 839283 | Jones | B D | 21B NW 135 St| Clay | NY | 13041 | 400 | 1 | 100.00 | 0 |
|
||||
| 392859 | Vine | S S | PO Box 79 | Broton| VT | 5046 | 700 | 1 | 439.00 | 0 |
|
||||
| 938485 | Johnson | J A | 3 Alpine Way | Helen | GA | 30545 | 9999 | 2 | 3987.50 | 33.50 |
|
||||
| 397267 | Tyron | W E | 13 Myrtle Dr | Hector| NY | 14841 | 1000 | 1 | 0 | 0 |
|
||||
| 389572 | Stevens | K L | 208 Snow Pass| Denver| CO | 80226 | 400 | 1 | 58.75 | 1.50 |
|
||||
| 846283 | Alison | J S | 787 Lake Dr | Isle | MN | 56342 | 5000 | 3 | 10.00 | 0 |
|
||||
| 475938 | Doe | J W | 59 Archer Rd | Sutter| CA | 95685 | 700 | 2 | 250.00 | 100.00 |
|
||||
| 693829 | Thomas | A N | 3 Dove Circle| Casper| WY | 82609 | 9999 | 2 | 0 | 0 |
|
||||
| 593029 | Williams| E D | 485 SE 2 Ave | Dallas| TX | 75218 | 200 | 1 | 25.00 | 0 |
|
||||
| 192837 | Lee | F L | 5963 Oak St | Hector| NY | 14841 | 700 | 2 | 489.50 | .50 |
|
||||
| 583990 | Abraham | M T | 392 Mill St | Isle | MN | 56342 | 9999 | 3 | 500.00 | 0 |
|
||||
+---------+---------+-----+--------------+-------+------+--------+-------+-------+---------+---------+
|
||||
SQLRowCount returns -1
|
||||
12 rows fetched
|
||||
SQL>
|
||||
```
|
||||
|
||||
To exit the prompt press <kbd>Ctr + C</kbd> or type `quit` into the prompt
|
||||
|
||||
# Next Steps
|
||||
|
||||
Now that you have the ODBC driver installed and configured on you development machine you can use the ODBC drivers in many of your favorite open-source programing languages. See IBM's [Db2 for Developers](https://www.ibm.com/products/db2-database/developers?utm_content=SRCWW&p1=Search&p4=43700068101138376&p5=p&gclid=Cj0KCQjwuaiXBhCCARIsAKZLt3npUFCKyE-dxmuikHbggZepKbmypy53W5utWVdqpc5xsTI1Jqk_FHQaAusYEALw_wcB&gclsrc=aw.ds) page for supported languages.
|
||||
|
||||
Examples of connections in programing languages:
|
||||
* Seiden Group: [HOW TO QUERY IBM i DATA WITH PHP AND PDO_ODBC](https://www.seidengroup.com/2022/04/15/how-to-query-ibm-i-data-with-php-and-pdo_odbc/)
|
||||
* Liam Allan: [Using node-odbc on Windows to talk to IBM i](https://worksofbarry.com/?post=25)
|
||||
|
||||
# Other Helpful Articles:
|
||||
* Seiden Group: [Q&A: IBM i ODBC DRIVER](https://www.seidengroup.com/2020/08/28/qa-ibm-i-odbc-driver/)
|
||||
* Seiden Group: [ODBC CONNECTION STRINGS FOR IBM i DB2](https://www.seidengroup.com/2022/05/18/odbc-connection-strings-for-ibm-i-db2/)
|
||||
|
||||
# References
|
||||
[^Adler]: Kevin Adler: [IBM-provided Repositories ODBC Linux Driver Repositories](https://kadler.io/2022/05/20/odbc-repos.html)
|
||||
[^FormaServe]: FormaServe: [How to use ODBC on the IBM i](https://www.youtube.com/watch?v=hOFZf4bd_wM)
|
||||
[^Allan]: Liam Allan: [Deploying a Node.js + Db2 for i app using Docker (from a Codespace!)](https://worksofbarry.com/?post=59)
|
||||
[^odbc-docs]: [IBM i OSS Docs](https://ibmi-oss-docs.readthedocs.io/en/latest/odbc/using.html)
|
||||
[^Seiden]: Seiden Group: [USING YUM TO INSTALL OR UPDATE THE IBM i ODBC DRIVER](https://www.seidengroup.com/2022/07/11/using-yum-to-install-or-update-the-ibm-i-odbc-driver/)
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
title: About
|
||||
icon: fas fa-info-circle
|
||||
order: 4
|
||||
---
|
||||
# 👋 Hi, I’m Cole
|
||||
- 📍 Mankato, Minnesota
|
||||
- 🎓 University of Minnesota, Morris
|
||||
- 🌱 I’m currently learning: {:height="36px" width="36px"}
|
||||
|
||||
Hi my name is Cole and I am a growing software engineer. I am currently studying Computer Science at the University of Minnesota, Morris.
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
layout: archives
|
||||
title: Archives
|
||||
icon: fas fa-archive
|
||||
order: 3
|
||||
---
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
layout: categories
|
||||
title: Categories
|
||||
icon: fas fa-stream
|
||||
order: 1
|
||||
---
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
layout: tags
|
||||
title: Tags
|
||||
icon: fas fa-tag
|
||||
order: 2
|
||||
---
|
||||
File diff suppressed because one or more lines are too long
Vendored
+4
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 8.6 KiB |
Executable
+3
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 27 KiB |
@@ -0,0 +1 @@
|
||||
{ "name": "Cole Maxwell", "short_name": "Cole Maxwell", "description": "A site about software craftsmanship, system design, and Cole Maxwell.", "icons": [ { "src": "/assets/img/favicons/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/assets/img/favicons/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } ], "start_url": "/index.html", "theme_color": "#2a1e6b", "background_color": "#ffffff", "display": "fullscreen" }
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1 @@
|
||||
MathJax = { tex: {inlineMath: [ ['$', '$'], ['\\(', '\\)'] ],displayMath: [ ['$$', '$$'], ['\\[', '\\]'] ],tags: 'ams' } };
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
const swconf = { purge: true };
|
||||
Vendored
+4
File diff suppressed because one or more lines are too long
Vendored
+4
File diff suppressed because one or more lines are too long
Vendored
+4
File diff suppressed because one or more lines are too long
Vendored
+4
File diff suppressed because one or more lines are too long
Vendored
+4
File diff suppressed because one or more lines are too long
Vendored
+4
File diff suppressed because one or more lines are too long
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
/*!
|
||||
* jekyll-theme-chirpy v7.4.1 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
*/
|
||||
var Theme=function(){"use strict";function t(t,e,i){if("function"==typeof t?t===e:t.has(e))return arguments.length<3?e:i;throw new TypeError("Private element is not present on this object")}function e(e,i,s){return s(t(e,i))}var i;class s{static get DARK(){return"dark"}static get LIGHT(){return"light"}static get ID(){return"theme-mode"}static get visualState(){return e(s,this,o)?e(s,this,n):e(s,this,h)?this.DARK:this.LIGHT}static getThemeMapper(t,e){return{[this.LIGHT]:t,[this.DARK]:e}}static init(){this.switchable&&(t(s,this,b)._.addEventListener("change",()=>{const i=e(s,this,n);t(s,this,a).call(this),i!==this.visualState&&t(s,this,l).call(this)}),e(s,this,o)&&(e(s,this,r)?t(s,this,u).call(this):t(s,this,c).call(this)))}static flip(){e(s,this,o)?t(s,this,a).call(this):e(s,this,h)?t(s,this,c).call(this):t(s,this,u).call(this),t(s,this,l).call(this)}}function n(e){return sessionStorage.getItem(t(i,e,g)._)||document.documentElement.getAttribute(t(i,e,v)._)}function r(t){return e(i,t,n)===t.DARK}function o(t){return null!==e(i,t,n)}function h(e){return t(i,e,b)._.matches}function u(){document.documentElement.setAttribute(t(i,this,v)._,this.DARK),sessionStorage.setItem(t(i,this,g)._,this.DARK)}function c(){document.documentElement.setAttribute(t(i,this,v)._,this.LIGHT),sessionStorage.setItem(t(i,this,g)._,this.LIGHT)}function a(){document.documentElement.removeAttribute(t(i,this,v)._),sessionStorage.removeItem(t(i,this,g)._)}function l(){window.postMessage({id:this.ID},"*")}i=s;var m,f,d,g={_:"mode"},v={_:"data-mode"},b={_:window.matchMedia("(prefers-color-scheme: dark)")};return m=s,f="switchable",d=!document.documentElement.hasAttribute(t(i,i,v)._),(f=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,e);if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(f))in m?Object.defineProperty(m,f,{value:d,enumerable:!0,configurable:!0,writable:!0}):m[f]=d,s.init(),s}();
|
||||
-1
Submodule assets/lib deleted from d1d2ec17c8
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<feed xmlns="http://www.w3.org/2005/Atom"> <id>https://colemaxwell.dev/</id><title>Cole Maxwell</title><subtitle>A site about software craftsmanship, system design, and Cole Maxwell.</subtitle> <updated>2026-03-07T15:58:24-06:00</updated> <author> <name>Cole Maxwell</name> <uri>https://colemaxwell.dev/</uri> </author><link rel="self" type="application/atom+xml" href="https://colemaxwell.dev/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://colemaxwell.dev/"/> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 Cole Maxwell </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>Using ODBC on IBM i for Local Linux Development</title><link href="https://colemaxwell.dev/posts/ibmi-odbc-on-linux/" rel="alternate" type="text/html" title="Using ODBC on IBM i for Local Linux Development" /><published>2022-08-03T19:39:00-05:00</published> <updated>2022-08-03T21:48:45-05:00</updated> <id>https://colemaxwell.dev/posts/ibmi-odbc-on-linux/</id> <content type="text/html" src="https://colemaxwell.dev/posts/ibmi-odbc-on-linux/" /> <author> <name>Cole Maxwell</name> </author> <category term="IBM i" /> <summary>If you are new to the IBM i platform coming right out of school, like me, or you are a developer used to working exclusively with open-source tooling, the IBM i platform can be a strange place. The legacy application support is industry leading, to both the benefit and downside of the platform. Under the hood there is IBM’s powerful and well tested relational database, DB2 for i. So far, I like...</summary> </entry> <entry><title>Utilize a RESTful API with IBMi QSYS_HTTP Tools in SQL</title><link href="https://colemaxwell.dev/posts/rest-api-ibmi-qsys2/" rel="alternate" type="text/html" title="Utilize a RESTful API with IBMi QSYS_HTTP Tools in SQL" /><published>2022-07-14T15:30:55-05:00</published> <updated>2022-08-03T21:32:53-05:00</updated> <id>https://colemaxwell.dev/posts/rest-api-ibmi-qsys2/</id> <content type="text/html" src="https://colemaxwell.dev/posts/rest-api-ibmi-qsys2/" /> <author> <name>Cole Maxwell</name> </author> <category term="IBM i" /> <summary>The Api This demo used the fakeStoreApi which is a free online REST API that you can use whenever you need Pseudo-real data for without running any server-side code. It’s awesome for teaching purposes, sample codes, tests, etc. This API does not require authentication for requests A list of other public APIs can be found here HTTP Functions Overview These HTTP functions are used to make ...</summary> </entry> </feed>
|
||||
+1
-4
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
|
||||
User-agent: *
|
||||
|
||||
Disallow: /norobots/
|
||||
|
||||
Sitemap: https://colemaxwell.dev/sitemap.xml
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/posts/rest-api-ibmi-qsys2/</loc>
|
||||
<lastmod>2022-08-03T21:32:53-05:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/posts/ibmi-odbc-on-linux/</loc>
|
||||
<lastmod>2022-08-03T21:48:45-05:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/categories/</loc>
|
||||
<lastmod>2026-03-07T15:58:24-06:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/</loc>
|
||||
<lastmod>2026-03-07T15:58:24-06:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/archives/</loc>
|
||||
<lastmod>2026-03-07T15:58:24-06:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/about/</loc>
|
||||
<lastmod>2026-03-07T15:58:24-06:00</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/ibmi/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/api/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/qsys2/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/rest/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/sql/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/odbc/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/linux/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/tags/as400/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://colemaxwell.dev/categories/ibm-i/</loc>
|
||||
</url>
|
||||
</urlset>
|
||||
@@ -0,0 +1,4 @@
|
||||
/*!
|
||||
* jekyll-theme-chirpy v7.4.1 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/
|
||||
*/
|
||||
!function(){"use strict";importScripts("./assets/js/data/swconf.js");const e=swconf.purge,t=swconf.interceptor;self.addEventListener("install",t=>{e||t.waitUntil(caches.open(swconf.cacheName).then(e=>e.addAll(swconf.resources)))}),self.addEventListener("activate",t=>{t.waitUntil(caches.keys().then(t=>Promise.all(t.map(t=>e||t!==swconf.cacheName?caches.delete(t):void 0))))}),self.addEventListener("message",e=>{"SKIP_WAITING"===e.data&&self.skipWaiting()}),self.addEventListener("fetch",s=>{s.request.headers.has("range")||s.respondWith(caches.match(s.request).then(n=>n||fetch(s.request).then(n=>{const r=s.request.url;if(e||"GET"!==s.request.method||!function(e){const s=new URL(e),n=s.pathname;if(!s.protocol.startsWith("http"))return!1;for(const e of t.urlPrefixes)if(s.href.startsWith(e))return!1;for(const e of t.paths)if(n.startsWith(e))return!1;return!0}(r))return n;let a=n.clone();return caches.open(swconf.cacheName).then(e=>{e.put(s.request,a)}),n})))})}();
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-160
@@ -1,160 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Build, test and then deploy the site content to 'origin/<pages_branch>'
|
||||
#
|
||||
# Requirement: html-proofer, jekyll
|
||||
#
|
||||
# Usage: See help information
|
||||
|
||||
set -eu
|
||||
|
||||
PAGES_BRANCH="gh-pages"
|
||||
|
||||
SITE_DIR="_site"
|
||||
|
||||
_opt_dry_run=false
|
||||
|
||||
_config="_config.yml"
|
||||
|
||||
_no_pages_branch=false
|
||||
|
||||
_backup_dir="$(mktemp -d)"
|
||||
|
||||
_baseurl=""
|
||||
|
||||
help() {
|
||||
echo "Build, test and then deploy the site content to 'origin/<pages_branch>'"
|
||||
echo
|
||||
echo "Usage:"
|
||||
echo
|
||||
echo " bash ./tools/deploy.sh [options]"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo ' -c, --config "<config_a[,config_b[...]]>" Specify config file(s)'
|
||||
echo " --dry-run Build site and test, but not deploy"
|
||||
echo " -h, --help Print this information."
|
||||
}
|
||||
|
||||
init() {
|
||||
if [[ -z ${GITHUB_ACTION+x} && $_opt_dry_run == 'false' ]]; then
|
||||
echo "ERROR: It is not allowed to deploy outside of the GitHub Action envrionment."
|
||||
echo "Type option '-h' to see the help information."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
_baseurl="$(grep '^baseurl:' _config.yml | sed "s/.*: *//;s/['\"]//g;s/#.*//")"
|
||||
}
|
||||
|
||||
build() {
|
||||
# clean up
|
||||
if [[ -d $SITE_DIR ]]; then
|
||||
rm -rf "$SITE_DIR"
|
||||
fi
|
||||
|
||||
# build
|
||||
JEKYLL_ENV=production bundle exec jekyll b -d "$SITE_DIR$_baseurl" --config "$_config"
|
||||
}
|
||||
|
||||
test() {
|
||||
bundle exec htmlproofer \
|
||||
--disable-external \
|
||||
--check-html \
|
||||
--allow_hash_href \
|
||||
"$SITE_DIR"
|
||||
}
|
||||
|
||||
resume_site_dir() {
|
||||
if [[ -n $_baseurl ]]; then
|
||||
# Move the site file to the regular directory '_site'
|
||||
mv "$SITE_DIR$_baseurl" "${SITE_DIR}-rename"
|
||||
rm -rf "$SITE_DIR"
|
||||
mv "${SITE_DIR}-rename" "$SITE_DIR"
|
||||
fi
|
||||
}
|
||||
|
||||
setup_gh() {
|
||||
if [[ -z $(git branch -av | grep "$PAGES_BRANCH") ]]; then
|
||||
_no_pages_branch=true
|
||||
git checkout -b "$PAGES_BRANCH"
|
||||
else
|
||||
git checkout -f "$PAGES_BRANCH"
|
||||
fi
|
||||
}
|
||||
|
||||
backup() {
|
||||
mv "$SITE_DIR"/* "$_backup_dir"
|
||||
mv .git "$_backup_dir"
|
||||
|
||||
# When adding custom domain from Github website,
|
||||
# the CANME only exist on `gh-pages` branch
|
||||
if [[ -f CNAME ]]; then
|
||||
mv CNAME "$_backup_dir"
|
||||
fi
|
||||
}
|
||||
|
||||
flush() {
|
||||
rm -rf ./*
|
||||
rm -rf .[^.] .??*
|
||||
|
||||
shopt -s dotglob nullglob
|
||||
mv "$_backup_dir"/* .
|
||||
[[ -f ".nojekyll" ]] || echo "" >".nojekyll"
|
||||
}
|
||||
|
||||
deploy() {
|
||||
git config --global user.name "GitHub Actions"
|
||||
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
git update-ref -d HEAD
|
||||
git add -A
|
||||
git commit -m "[Automation] Site update No.${GITHUB_RUN_NUMBER}"
|
||||
|
||||
if $_no_pages_branch; then
|
||||
git push -u origin "$PAGES_BRANCH"
|
||||
else
|
||||
git push -f
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
init
|
||||
build
|
||||
test
|
||||
resume_site_dir
|
||||
|
||||
if $_opt_dry_run; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
setup_gh
|
||||
backup
|
||||
flush
|
||||
deploy
|
||||
}
|
||||
|
||||
while (($#)); do
|
||||
opt="$1"
|
||||
case $opt in
|
||||
-c | --config)
|
||||
_config="$2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
--dry-run)
|
||||
# build & test, but not deploy
|
||||
_opt_dry_run=true
|
||||
shift
|
||||
;;
|
||||
-h | --help)
|
||||
help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
# unknown option
|
||||
help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user