diff --git a/404.html b/404.html index 86685d78..de4142ea 100644 --- a/404.html +++ b/404.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
\ No newline at end of file +
\ No newline at end of file diff --git a/404/index.html b/404/index.html index 2c343999..097c8d85 100644 --- a/404/index.html +++ b/404/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
\ No newline at end of file +
\ No newline at end of file diff --git a/app-4f7f3a7ad20a05c933d6.js b/app-ea08e30339acd6ab79af.js similarity index 99% rename from app-4f7f3a7ad20a05c933d6.js rename to app-ea08e30339acd6ab79af.js index 140a4cf4..ab93bfeb 100644 --- a/app-4f7f3a7ad20a05c933d6.js +++ b/app-ea08e30339acd6ab79af.js @@ -1,3 +1,3 @@ -/*! For license information please see app-4f7f3a7ad20a05c933d6.js.LICENSE.txt */ -(self.webpackChunkgatsby_starter_lumen=self.webpackChunkgatsby_starter_lumen||[]).push([[143],{80:function(t,e,n){"use strict";n.d(e,{cQ:function(){return v},cn:function(){return m},xv:function(){return b}});var r=n(885),o=n(7294),i=function(t){return Object.keys(t).includes("default")},a={},s=function(t){return a[t]=a[t]||{},a[t]},c=function(t,e){return i(e)?function(t,e){var n=s(t)[e.key];if("atom"!==n.type)throw new Error("".concat(n.key," is not an atom"));return n.value}(t,e):function(t,e){return e.get({get:u(t)})}(t,e)},u=function(t){return function(e){return c(t,e)}},l=function(t,e,n){var r=s(t)[e.key];if("atom"!==r.type)throw new Error("".concat(r.key," is not an atom"));n!==r.value&&(r.value=n,r.subscribers.forEach((function(t){return t()})))},f=function(t){return function(e,n){return p(t,e,n)}},p=function(t,e,n){i(e)?l(t,e,n):e.set&&e.set({get:u(t),set:f(t)},n)},d=function(t,e,n){var r=s(t)[e].subscribers;if(r.includes(n))throw new Error("Already subscribed to Coil Value");return r.push(n),function(){r.splice(r.indexOf(n),1)}},h=o.createContext(""),v=function(t){var e=t.children,n=1..toString();return o.createElement(h.Provider,{value:n},e)},m=function(t){return t},_=function(){var t=(0,o.useContext)(h);if(!t)throw new Error("Wrap your app with ");return t},y=function(t,e){return function n(r){return e.push(r.key),i(r)?c(t,r):r.get({get:n})}},g=function(t){var e=_(),n=(0,o.useReducer)((function(t){return t+1}),0),a=(0,r.Z)(n,2)[1];return function(t,e){var n=e.key,r=s(t);r[n]||(i(e)?r[n]={default:e.default,key:n,subscribers:[],type:"atom",value:e.default}:r[n]={key:n,subscribers:[],type:"selector"})}(e,t),function(t,e){var n=_();(0,o.useEffect)((function(){if(i(t))return d(n,t.key,e);var r=[];t.get({get:y(n,r)});var o=[];return r.forEach((function(t){return o.push(d(n,t,e))})),function(){return o.forEach((function(t){return t()}))}}),[n,t,e])}(t,a),c(e,t)},b=function(t){var e=_();return[g(t),(0,o.useMemo)((function(){return i(t)?function(t,e){return function(n){return l(t,e,n)}}(e,t):function(n){t.set&&t.set({get:u(e),set:f(e)},n)}}),[e,t])]}},2393:function(t,e){"use strict";var n=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},u=c.state,l=c.replace,f=void 0!==l&&l;if("number"==typeof e)t.history.go(e);else{u=n({},u,{key:Date.now()+""});try{a||f?t.history.replaceState(u,null,e):t.history.pushState(u,null,e)}catch(d){t.location[f?"replace":"assign"](e)}}i=r(t),a=!0;var p=new Promise((function(t){return s=t}));return o.forEach((function(t){return t({location:i,action:"PUSH"})})),p}}},i=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",e=t.indexOf("?"),n={pathname:e>-1?t.substr(0,e):t,search:e>-1?t.substr(e):""},r=0,o=[n],i=[null];return{get location(){return o[r]},addEventListener:function(t,e){},removeEventListener:function(t,e){},history:{get entries(){return o},get index(){return r},get state(){return i[r]},pushState:function(t,e,n){var a=n.split("?"),s=a[0],c=a[1],u=void 0===c?"":c;r++,o.push({pathname:s,search:u.length?"?"+u:u}),i.push(t)},replaceState:function(t,e,n){var a=n.split("?"),s=a[0],c=a[1],u=void 0===c?"":c;o[r]={pathname:s,search:u},i[r]=t},go:function(t){var e=r+t;e<0||e>i.length-1||(r=e)}}}},a=!("undefined"==typeof window||!window.document||!window.document.createElement),s=o(a?window:i()),c=s.navigate;e.V5=s},2098:function(t,e,n){"use strict";e.ei=void 0;var r,o=n(1143),i=(r=o)&&r.__esModule?r:{default:r};var a=function(t,e){return t.substr(0,e.length)===e},s=function(t,e){for(var n=void 0,r=void 0,o=e.split("?")[0],a=d(o),s=""===a[0],u=p(t),f=0,h=u.length;fe.score?-1:t.index-e.index}))},d=function(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")},h=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r0})))&&n.length>0?"?"+n.join("&"):"")},v=["uri","path"];e.ei=s},7015:function(t,e,n){"use strict";n.d(e,{Gd:function(){return y},Xb:function(){return v},cu:function(){return m},pj:function(){return _},vi:function(){return b}});var r=n(4942),o=n(5671),i=n(3144),a=n(2861),s=n(5153),c=n(245),u=n(9195),l=n(9),f=n(1768),p=n(5389);function d(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function h(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:new f.s,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:4;(0,o.Z)(this,t),this._version=r,t.prototype.__init.call(this),this.getStackTop().scope=n,e&&this.bindClient(e)}return(0,i.Z)(t,[{key:"__init",value:function(){this._stack=[{}]}},{key:"isOlderThan",value:function(t){return this._version0&&void 0!==arguments[0]&&arguments[0];if(t)return this.endSession();this._sendSessionUpdate()}},{key:"endSession",value:function(){var t=this.getStackTop(),e=t&&t.scope,n=e&&e.getSession();n&&(0,p.RJ)(n),this._sendSessionUpdate(),e&&e.setSession()}},{key:"startSession",value:function(t){var e=this.getStackTop(),n=e.scope,r=e.client,o=r&&r.getOptions()||{},i=o.release,a=o.environment,s=(u.n2.navigator||{}).userAgent,c=(0,p.Hv)(h(h(h({release:i,environment:a},n&&{user:n.getUser()}),s&&{userAgent:s}),t));if(n){var l=n.getSession&&n.getSession();l&&"ok"===l.status&&(0,p.CT)(l,{status:"exited"}),this.endSession(),n.setSession(c)}return c}},{key:"shouldSendDefaultPii",value:function(){var t=this.getClient(),e=t&&t.getOptions();return Boolean(e&&e.sendDefaultPii)}},{key:"_sendSessionUpdate",value:function(){var t=this.getStackTop(),e=t.scope,n=t.client;if(e){var r=e.getSession();r&&n&&n.captureSession&&n.captureSession(r)}}},{key:"_withClient",value:function(t){var e=this.getStackTop(),n=e.scope,r=e.client;r&&t(r,n)}},{key:"_callExtensionMethod",value:function(t){var e=m(),n=e.__SENTRY__;if(n&&n.extensions&&"function"==typeof n.extensions[t]){for(var r=arguments.length,o=new Array(r>1?r-1:0),i=1;i1&&void 0!==arguments[1]?arguments[1]:{};if(this._extra&&Object.keys(this._extra).length&&(t.extra=v(v({},this._extra),t.extra)),this._tags&&Object.keys(this._tags).length&&(t.tags=v(v({},this._tags),t.tags)),this._user&&Object.keys(this._user).length&&(t.user=v(v({},this._user),t.user)),this._contexts&&Object.keys(this._contexts).length&&(t.contexts=v(v({},this._contexts),t.contexts)),this._level&&(t.level=this._level),this._transactionName&&(t.transaction=this._transactionName),this._span){t.contexts=v({trace:this._span.getTraceContext()},t.contexts);var n=this._span.transaction&&this._span.transaction.name;n&&(t.tags=v({transaction:n},t.tags))}return this._applyFingerprint(t),t.breadcrumbs=[].concat((0,r.Z)(t.breadcrumbs||[]),(0,r.Z)(this._breadcrumbs)),t.breadcrumbs=t.breadcrumbs.length>0?t.breadcrumbs:void 0,t.sdkProcessingMetadata=v(v({},t.sdkProcessingMetadata),this._sdkProcessingMetadata),this._notifyEventProcessors([].concat((0,r.Z)(_()),(0,r.Z)(this._eventProcessors)),t,e)}},{key:"setSDKProcessingMetadata",value:function(t){return this._sdkProcessingMetadata=v(v({},this._sdkProcessingMetadata),t),this}},{key:"_notifyEventProcessors",value:function(t,e,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return new u.cW((function(i,a){var c=t[o];if(null===e||"function"!=typeof c)i(e);else{var u=c(v({},e),n);("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&c.id&&null===u&&l.kg.log('Event processor "'.concat(c.id,'" dropped event')),(0,s.J8)(u)?u.then((function(e){return r._notifyEventProcessors(t,e,n,o+1).then(i)})).then(null,a):r._notifyEventProcessors(t,u,n,o+1).then(i).then(null,a)}}))}},{key:"_notifyScopeListeners",value:function(){var t=this;this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach((function(e){e(t)})),this._notifyingListeners=!1)}},{key:"_applyFingerprint",value:function(t){t.fingerprint=t.fingerprint?(0,f.lE)(t.fingerprint):[],this._fingerprint&&(t.fingerprint=t.fingerprint.concat(this._fingerprint)),t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}}],[{key:"clone",value:function(e){var n=new t;return e&&(n._breadcrumbs=(0,r.Z)(e._breadcrumbs),n._tags=v({},e._tags),n._extra=v({},e._extra),n._contexts=v({},e._contexts),n._user=e._user,n._level=e._level,n._span=e._span,n._session=e._session,n._transactionName=e._transactionName,n._fingerprint=e._fingerprint,n._eventProcessors=(0,r.Z)(e._eventProcessors),n._requestSession=e._requestSession,n._attachments=(0,r.Z)(e._attachments),n._sdkProcessingMetadata=v({},e._sdkProcessingMetadata)),n}}]),t}();function _(){return(0,p.YO)("globalEventProcessors",(function(){return[]}))}function y(t){_().push(t)}},5389:function(t,e,n){"use strict";n.d(e,{CT:function(){return s},Hv:function(){return a},RJ:function(){return c}});var r=n(5153),o=n(2861),i=n(2362);function a(t){var e=(0,r.ph)(),n={sid:(0,o.DM)(),init:!0,timestamp:e,started:e,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:function(){return function(t){return(0,i.Jr)({sid:"".concat(t.sid),init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?"".concat(t.did):void 0,duration:t.duration,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}(n)}};return t&&s(n,t),n}function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),t.did||e.did||(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||(0,r.ph)(),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=32===e.sid.length?e.sid:(0,o.DM)()),void 0!==e.init&&(t.init=e.init),!t.did&&e.did&&(t.did="".concat(e.did)),"number"==typeof e.started&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof e.duration)t.duration=e.duration;else{var n=t.timestamp-t.started;t.duration=n>=0?n:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),"number"==typeof e.errors&&(t.errors=e.errors),e.status&&(t.status=e.status)}function c(t,e){var n={};e?n={status:e}:"ok"===t.status&&(n={status:"exited"}),s(t,n)}},2268:function(t,e,n){"use strict";n.d(e,{ro:function(){return b},lb:function(){return g}});var r=n(2982),o=n(4942),i=n(7015),a=n(245),s=n(2684),c=n(9),u=n(6710),l=n(2662);function f(){var t=(0,l.x1)();if(t){var e="internal_error";("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&a.kg.log("[Tracing] Transaction: ".concat(e," -> Global error occured")),t.setStatus(e)}}var p=n(1441),d=n(5955);function h(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function v(t){for(var e=1;e1)return("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&a.kg.warn("[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got ".concat(t,".")),!1;return!0}(r)?r?(t.sampled=Math.random()0&&(e.__SENTRY__.integrations=[].concat((0,r.Z)(e.__SENTRY__.integrations||[]),(0,r.Z)(o)))}}(),(0,u.o)("error",f),(0,u.o)("unhandledrejection",f)}t=n.hmd(t)},1441:function(t,e,n){"use strict";n.d(e,{hd:function(){return g},io:function(){return w},mg:function(){return y},nT:function(){return _}});var r=n(7326),o=n(5671),i=n(3144),a=n(1752),s=n(136),c=n(2963),u=n(1120),l=n(5153),f=n(245),p=n(6369),d=n(5955);function h(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return v(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return v(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,o=function(){};return{s:o,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}function v(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:_,c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:y,u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:g,l=arguments.length>5&&void 0!==arguments[5]&&arguments[5];return(0,o.Z)(this,n),(a=e.call(this,t,i))._idleHub=i,a._idleTimeout=s,a._finalTimeout=c,a._heartbeatInterval=u,a._onScope=l,n.prototype.__init.call((0,r.Z)(a)),n.prototype.__init2.call((0,r.Z)(a)),n.prototype.__init3.call((0,r.Z)(a)),n.prototype.__init4.call((0,r.Z)(a)),l&&(S(i),("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&f.kg.log("Setting idle transaction on scope. Span ID: ".concat(a.spanId)),i.configureScope((function(t){return t.setSpan((0,r.Z)(a))}))),a._startIdleTimeout(),setTimeout((function(){a._finished||(a.setStatus("deadline_exceeded"),a.finish())}),a._finalTimeout),a}return(0,i.Z)(n,[{key:"__init",value:function(){this.activities={}}},{key:"__init2",value:function(){this._heartbeatCounter=0}},{key:"__init3",value:function(){this._finished=!1}},{key:"__init4",value:function(){this._beforeFinishCallbacks=[]}},{key:"finish",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:(0,l._I)();if(this._finished=!0,this.activities={},this.spanRecorder){("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&f.kg.log("[Tracing] finishing IdleTransaction",new Date(1e3*e).toISOString(),this.op);var r,o=h(this._beforeFinishCallbacks);try{for(o.s();!(r=o.n()).done;){var i=r.value;i(this,e)}}catch(s){o.e(s)}finally{o.f()}this.spanRecorder.spans=this.spanRecorder.spans.filter((function(n){if(n.spanId===t.spanId)return!0;n.endTimestamp||(n.endTimestamp=e,n.setStatus("cancelled"),("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&f.kg.log("[Tracing] cancelling span since transaction ended early",JSON.stringify(n,void 0,2)));var r=n.startTimestamp=3?(("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&f.kg.log("[Tracing] Transaction finished because of no change for 3 heart beats"),this.setStatus("deadline_exceeded"),this.finish()):this._pingHeartbeat()}}},{key:"_pingHeartbeat",value:function(){var t=this;("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&f.kg.log("pinging Heartbeat -> current counter: ".concat(this._heartbeatCounter)),setTimeout((function(){t._beat()}),this._heartbeatInterval)}}]),n}(d.Y);function S(t){var e=t.getScope();e&&(e.getTransaction()&&e.setSpan(void 0))}},6369:function(t,e,n){"use strict";n.d(e,{Dr:function(){return h},gB:function(){return d}});var r=n(4942),o=n(5671),i=n(3144),a=n(1508),s=n(2861),c=n(5153),u=n(245),l=n(2362);function f(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function p(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:1e3;(0,o.Z)(this,t),t.prototype.__init.call(this),this._maxlen=e}return(0,i.Z)(t,[{key:"__init",value:function(){this.spans=[]}},{key:"add",value:function(t){this.spans.length>this._maxlen?t.spanRecorder=void 0:this.spans.push(t)}}]),t}(),h=function(){function t(e){if((0,o.Z)(this,t),t.prototype.__init2.call(this),t.prototype.__init3.call(this),t.prototype.__init4.call(this),t.prototype.__init5.call(this),t.prototype.__init6.call(this),t.prototype.__init7.call(this),!e)return this;e.traceId&&(this.traceId=e.traceId),e.spanId&&(this.spanId=e.spanId),e.parentSpanId&&(this.parentSpanId=e.parentSpanId),"sampled"in e&&(this.sampled=e.sampled),e.op&&(this.op=e.op),e.description&&(this.description=e.description),e.data&&(this.data=e.data),e.tags&&(this.tags=e.tags),e.status&&(this.status=e.status),e.startTimestamp&&(this.startTimestamp=e.startTimestamp),e.endTimestamp&&(this.endTimestamp=e.endTimestamp),e.instrumenter&&(this.instrumenter=e.instrumenter)}return(0,i.Z)(t,[{key:"__init2",value:function(){this.traceId=(0,s.DM)()}},{key:"__init3",value:function(){this.spanId=(0,s.DM)().substring(16)}},{key:"__init4",value:function(){this.startTimestamp=(0,c._I)()}},{key:"__init5",value:function(){this.tags={}}},{key:"__init6",value:function(){this.data={}}},{key:"__init7",value:function(){this.instrumenter="sentry"}},{key:"startChild",value:function(e){var n=new t(p(p({},e),{},{parentSpanId:this.spanId,sampled:this.sampled,traceId:this.traceId}));if(n.spanRecorder=this.spanRecorder,n.spanRecorder&&n.spanRecorder.add(n),n.transaction=this.transaction,("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&n.transaction){var r=e&&e.op||"< unknown op >",o=n.transaction.name||"< unknown name >",i=n.transaction.spanId,a="[Tracing] Starting '".concat(r,"' span on transaction '").concat(o,"' (").concat(i,").");n.transaction.metadata.spanMetadata[n.spanId]={logMessage:a},u.kg.log(a)}return n}},{key:"setTag",value:function(t,e){return this.tags=p(p({},this.tags),{},(0,r.Z)({},t,e)),this}},{key:"setData",value:function(t,e){return this.data=p(p({},this.data),{},(0,r.Z)({},t,e)),this}},{key:"setStatus",value:function(t){return this.status=t,this}},{key:"setHttpStatus",value:function(t){this.setTag("http.status_code",String(t));var e=function(t){if(t<400&&t>=100)return"ok";if(t>=400&&t<500)switch(t){case 401:return"unauthenticated";case 403:return"permission_denied";case 404:return"not_found";case 409:return"already_exists";case 413:return"failed_precondition";case 429:return"resource_exhausted";default:return"invalid_argument"}if(t>=500&&t<600)switch(t){case 501:return"unimplemented";case 503:return"unavailable";case 504:return"deadline_exceeded";default:return"internal_error"}return"unknown_error"}(t);return"unknown_error"!==e&&this.setStatus(e),this}},{key:"isSuccess",value:function(){return"ok"===this.status}},{key:"finish",value:function(t){if(("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&this.transaction&&this.transaction.spanId!==this.spanId){var e=this.transaction.metadata.spanMetadata[this.spanId].logMessage;e&&u.kg.log(e.replace("Starting","Finishing"))}this.endTimestamp="number"==typeof t?t:(0,c._I)()}},{key:"toTraceparent",value:function(){var t="";return void 0!==this.sampled&&(t=this.sampled?"-1":"-0"),"".concat(this.traceId,"-").concat(this.spanId).concat(t)}},{key:"toContext",value:function(){return(0,l.Jr)({data:this.data,description:this.description,endTimestamp:this.endTimestamp,op:this.op,parentSpanId:this.parentSpanId,sampled:this.sampled,spanId:this.spanId,startTimestamp:this.startTimestamp,status:this.status,tags:this.tags,traceId:this.traceId})}},{key:"updateWithContext",value:function(t){var e=this;return this.data=(0,a.h)(t.data,(function(){return{}})),this.description=t.description,this.endTimestamp=t.endTimestamp,this.op=t.op,this.parentSpanId=t.parentSpanId,this.sampled=t.sampled,this.spanId=(0,a.h)(t.spanId,(function(){return e.spanId})),this.startTimestamp=(0,a.h)(t.startTimestamp,(function(){return e.startTimestamp})),this.status=t.status,this.tags=(0,a.h)(t.tags,(function(){return{}})),this.traceId=(0,a.h)(t.traceId,(function(){return e.traceId})),this}},{key:"getTraceContext",value:function(){return(0,l.Jr)({data:Object.keys(this.data).length>0?this.data:void 0,description:this.description,op:this.op,parent_span_id:this.parentSpanId,span_id:this.spanId,status:this.status,tags:Object.keys(this.tags).length>0?this.tags:void 0,trace_id:this.traceId})}},{key:"toJSON",value:function(){return(0,l.Jr)({data:Object.keys(this.data).length>0?this.data:void 0,description:this.description,op:this.op,parent_span_id:this.parentSpanId,span_id:this.spanId,start_timestamp:this.startTimestamp,status:this.status,tags:Object.keys(this.tags).length>0?this.tags:void 0,timestamp:this.endTimestamp,trace_id:this.traceId})}}]),t}()},5955:function(t,e,n){"use strict";n.d(e,{Y:function(){return b}});var r=n(4942),o=n(5671),i=n(3144),a=n(7326),s=n(1752),c=n(136),u=n(2963),l=n(1120),f=(n(8702),n(1508)),p=n(7015),d=n(5153),h=n(245),v=n(2362),m=n(6369);function _(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function y(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:"custom";t===this.name&&e===this.metadata.source||this.metadata.changes.push({source:this.metadata.source,timestamp:(0,d.ph)(),propagations:this.metadata.propagations}),this._name=t,this.metadata.source=e}},{key:"initSpanRecorder",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e3;this.spanRecorder||(this.spanRecorder=new m.gB(t)),this.spanRecorder.add(this)}},{key:"setContext",value:function(t,e){null===e?delete this._contexts[t]:this._contexts[t]=e}},{key:"setMeasurement",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";this._measurements[t]={value:e,unit:n}}},{key:"setMetadata",value:function(t){this.metadata=y(y({},this.metadata),t)}},{key:"finish",value:function(t){var e=this;if(void 0===this.endTimestamp){if(this.name||(("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&h.kg.warn("Transaction has no name, falling back to ``."),this.name=""),(0,s.Z)((0,l.Z)(n.prototype),"finish",this).call(this,t),!0===this.sampled){var r=this.spanRecorder?this.spanRecorder.spans.filter((function(t){return t!==e&&t.endTimestamp})):[];this._trimEnd&&r.length>0&&(this.endTimestamp=r.reduce((function(t,e){return t.endTimestamp&&e.endTimestamp?t.endTimestamp>e.endTimestamp?t:e:t})).endTimestamp);var o=this.metadata,i=y({contexts:y(y({},this._contexts),{},{trace:this.getTraceContext()}),spans:r,start_timestamp:this.startTimestamp,tags:this.tags,timestamp:this.endTimestamp,transaction:this.name,type:"transaction",sdkProcessingMetadata:y(y({},o),{},{dynamicSamplingContext:this.getDynamicSamplingContext()})},o.source&&{transaction_info:{source:o.source,changes:o.changes,propagations:o.propagations}});return Object.keys(this._measurements).length>0&&(("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&h.kg.log("[Measurements] Adding measurements to transaction",JSON.stringify(this._measurements,void 0,2)),i.measurements=this._measurements),("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&h.kg.log("[Tracing] Finishing ".concat(this.op," transaction: ").concat(this.name,".")),this._hub.captureEvent(i)}("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&h.kg.log("[Tracing] Discarding transaction because its trace was not chosen to be sampled.");var a=this._hub.getClient();a&&a.recordDroppedEvent("sample_rate","transaction")}}},{key:"toContext",value:function(){var t=(0,s.Z)((0,l.Z)(n.prototype),"toContext",this).call(this);return(0,v.Jr)(y(y({},t),{},{name:this.name,trimEnd:this._trimEnd}))}},{key:"updateWithContext",value:function(t){return(0,s.Z)((0,l.Z)(n.prototype),"updateWithContext",this).call(this,t),this.name=(0,f.h)(t.name,(function(){return""})),this._trimEnd=t.trimEnd,this}},{key:"getDynamicSamplingContext",value:function(){if(this._frozenDynamicSamplingContext)return this._frozenDynamicSamplingContext;var t=this._hub||(0,p.Gd)(),e=t&&t.getClient();if(!e)return{};var n=e.getOptions()||{},r=n.environment,o=n.release,i=(e.getDsn()||{}).publicKey,a=this.metadata.sampleRate,s=void 0!==a?a.toString():void 0,c=t.getScope(),u=(c&&c.getUser()||{}).segment,l=this.metadata.source,f=l&&"url"!==l?this.name:void 0;return(0,v.Jr)({environment:r,release:o,transaction:f,user_segment:u,public_key:i,trace_id:this.traceId,sample_rate:s})}}]),n}(m.Dr)},2662:function(t,e,n){"use strict";n.d(e,{XL:function(){return a},x1:function(){return i},zu:function(){return o}});var r=n(7015);function o(t){var e=(0,r.Gd)().getClient(),n=t||e&&e.getOptions();return!!n&&("tracesSampleRate"in n||"tracesSampler"in n)}function i(t){var e=(t||(0,r.Gd)()).getScope();return e&&e.getTransaction()}function a(t){return t/1e3}},595:function(t,e,n){"use strict";n.d(e,{Rt:function(){return i},l4:function(){return s},qT:function(){return c}});var r=n(2684),o=(0,n(9195).Rf)();function i(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};try{for(var n,r=t,o=5,i=[],s=0,c=0,u=" > ",l=u.length,f=Array.isArray(e)?e:e.keyAttrs,p=!Array.isArray(e)&&e.maxStringLength||80;r&&s++1&&c+i.length*l+n.length>=p);)i.push(n),c+=n.length,r=r.parentNode;return i.reverse().join(u)}catch(d){return""}}function a(t,e){var n,o,i,a,s,c=t,u=[];if(!c||!c.tagName)return"";u.push(c.tagName.toLowerCase());var l=e&&e.length?e.filter((function(t){return c.getAttribute(t)})).map((function(t){return[t,c.getAttribute(t)]})):null;if(l&&l.length)l.forEach((function(t){u.push("[".concat(t[0],'="').concat(t[1],'"]'))}));else if(c.id&&u.push("#".concat(c.id)),(n=c.className)&&(0,r.HD)(n))for(o=n.split(/\s+/),s=0;s=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}function p(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2?n[2]:void 0;if(o){var i=d,a=String(o);d=a,g("history",{from:i,to:a})}return t.apply(this,n)}}h.onpopstate=function(){var e=h.location.href,n=d;if(d=e,g("history",{from:n,to:e}),t)try{for(var r=arguments.length,o=new Array(r),i=0;i0&&void 0!==arguments[0]?arguments[0]:[];return"Request"in h&&(0,o.V9)(t[0],Request)&&t[0].method?String(t[0].method).toUpperCase():t[1]&&t[1].method?String(t[1].method).toUpperCase():"GET"}function w(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return"string"==typeof t[0]?t[0]:"Request"in h&&(0,o.V9)(t[0],Request)?t[0].url:String(t[0])}var S,E;function k(t,e){if(!t)return!0;if(t.type!==e.type)return!0;try{if(t.target!==e.target)return!0}catch(n){}return!1}function O(t){if("keypress"!==t.type)return!1;try{var e=t.target;if(!e||!e.tagName)return!0;if("INPUT"===e.tagName||"TEXTAREA"===e.tagName||e.isContentEditable)return!1}catch(n){}return!0}function x(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(n){if(n&&E!==n&&!O(n)){var r="keypress"===n.type?"input":n.type;(void 0===S||k(E,n))&&(t({event:n,name:r,global:e}),E=n),clearTimeout(S),S=h.setTimeout((function(){S=void 0}),1e3)}}}var T=null;var R=null},2684:function(t,e,n){"use strict";n.d(e,{Cy:function(){return m},HD:function(){return u},J8:function(){return v},Kj:function(){return h},PO:function(){return f},TX:function(){return s},V9:function(){return y},VW:function(){return a},VZ:function(){return o},cO:function(){return p},fm:function(){return c},i2:function(){return _},kK:function(){return d},pt:function(){return l}});var r=Object.prototype.toString;function o(t){switch(r.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return y(t,Error)}}function i(t,e){return r.call(t)==="[object ".concat(e,"]")}function a(t){return i(t,"ErrorEvent")}function s(t){return i(t,"DOMError")}function c(t){return i(t,"DOMException")}function u(t){return i(t,"String")}function l(t){return null===t||"object"!=typeof t&&"function"!=typeof t}function f(t){return i(t,"Object")}function p(t){return"undefined"!=typeof Event&&y(t,Event)}function d(t){return"undefined"!=typeof Element&&y(t,Element)}function h(t){return i(t,"RegExp")}function v(t){return Boolean(t&&t.then&&"function"==typeof t.then)}function m(t){return f(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}function _(t){return"number"==typeof t&&t!=t}function y(t,e){try{return t instanceof e}catch(n){return!1}}},245:function(t,e,n){"use strict";n.d(e,{Cf:function(){return s},RU:function(){return a},kg:function(){return r}});var r,o=n(9195),i="Sentry Logger ",a=["debug","info","warn","error","log","assert","trace"];function s(t){if(!("console"in o.n2))return t();var e=o.n2.console,n={};a.forEach((function(t){var r=e[t]&&e[t].__sentry_original__;t in e&&r&&(n[t]=e[t],e[t]=r)}));try{return t()}finally{Object.keys(n).forEach((function(t){e[t]=n[t]}))}}function c(){var t=!1,e={enable:function(){t=!0},disable:function(){t=!1}};return"undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__?a.forEach((function(n){e[n]=function(){for(var e=arguments.length,r=new Array(e),a=0;a>t/4).toString(16)}))}function u(t){return t.exception&&t.exception.values?t.exception.values[0]:void 0}function l(t){var e=t.message,n=t.event_id;if(e)return e;var r=u(t);return r?r.type&&r.value?"".concat(r.type,": ").concat(r.value):r.type||r.value||n||"":n||""}function f(t,e,n){var r=t.exception=t.exception||{},o=r.values=r.values||[],i=o[0]=o[0]||{};i.value||(i.value=e||""),i.type||(i.type=n||"Error")}function p(t,e){var n=u(t);if(n){var r=n.mechanism;if(n.mechanism=s(s(s({},{type:"generic",handled:!0}),r),e),e&&"data"in e){var o=s(s({},r&&r.data),e.data);n.mechanism.data=o}}}function d(t){if(t&&t.__sentry_captured__)return!0;try{(0,o.xp)(t,"__sentry_captured__",!0)}catch(e){}return!1}function h(t){return Array.isArray(t)?t:[t]}},9:function(t,e,n){"use strict";function r(){return!("undefined"!=typeof __SENTRY_BROWSER_BUNDLE__&&__SENTRY_BROWSER_BUNDLE__)&&"[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0)}function o(t,e){return t.require(e)}function i(e){var n;try{n=o(t,e)}catch(i){}try{var r=o(t,"process").cwd;n=o(t,"".concat(r(),"/node_modules/").concat(e))}catch(i){}return n}n.d(e,{l$:function(){return o},KV:function(){return r},$y:function(){return i}}),t=n.hmd(t)},2362:function(t,e,n){"use strict";n.d(e,{$Q:function(){return f},HK:function(){return p},Jr:function(){return y},Sh:function(){return h},_j:function(){return d},hl:function(){return u},xp:function(){return l},zf:function(){return _}});var r=n(4942),o=n(595),i=n(2684),a=n(7940);function s(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function c(t){for(var e=1;e"}}function m(t){if("object"==typeof t&&null!==t){var e={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}return{}}function _(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:40,n=Object.keys(h(t));if(n.sort(),!n.length)return"[object has no keys]";if(n[0].length>=e)return(0,a.$G)(n[0],e);for(var r=n.length;r>0;r--){var o=n.slice(0,r).join(", ");if(!(o.length>e))return r===n.length?o:(0,a.$G)(o,e)}return""}function y(t){return g(t,new Map)}function g(t,e){if((0,i.PO)(t)){var n=e.get(t);if(void 0!==n)return n;var r={};e.set(t,r);for(var o=0,a=Object.keys(t);o=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n1&&void 0!==arguments[1]?arguments[1]:0,o=[],i=s(t.split("\n").slice(n));try{for(i.s();!(e=i.n()).done;){var a=e.value;if(!(a.length>1024)){var c,u=a.replace(/\(error: (.*)\)/,"$1"),l=s(r);try{for(l.s();!(c=l.n()).done;){var p=c.value,d=p(u);if(d){o.push(d);break}}}catch(h){l.e(h)}finally{l.f()}}}}catch(h){i.e(h)}finally{i.f()}return f(o)}}function l(t){return Array.isArray(t)?u.apply(void 0,(0,o.Z)(t)):t}function f(t){if(!t.length)return[];var e=t,n=e[0].function||"",r=e[e.length-1].function||"";return-1===n.indexOf("captureMessage")&&-1===n.indexOf("captureException")||(e=e.slice(1)),-1!==r.indexOf("sentryWrapped")&&(e=e.slice(0,-1)),e.slice(0,50).map((function(t){return a(a({},t),{},{filename:t.filename||e[0].filename,function:t.function||"?"})})).reverse()}var p="";function d(t){try{return t&&"function"==typeof t&&t.name||p}catch(e){return p}}},7940:function(t,e,n){"use strict";n.d(e,{$G:function(){return o},U0:function(){return s},nK:function(){return i}});var r=n(2684);function o(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"string"!=typeof t||0===e||t.length<=e?t:"".concat(t.substr(0,e),"...")}function i(t,e){if(!Array.isArray(t))return"";for(var n=[],r=0;r2&&void 0!==arguments[2]&&arguments[2];return!!(0,r.HD)(t)&&((0,r.Kj)(e)?e.test(t):!!(0,r.HD)(e)&&(n?t===e:t.includes(e)))}function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return e.some((function(e){return a(t,e,n)}))}},4712:function(t,e,n){"use strict";n.d(e,{Ak:function(){return i},Bf:function(){return c},Du:function(){return a},t$:function(){return s}});var r=n(245),o=(0,n(9195).Rf)();function i(){if(!("fetch"in o))return!1;try{return new Headers,new Request("http://www.example.com"),new Response,!0}catch(t){return!1}}function a(t){return t&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}function s(){if(!i())return!1;if(a(o.fetch))return!0;var t=!1,e=o.document;if(e&&"function"==typeof e.createElement)try{var n=e.createElement("iframe");n.hidden=!0,e.head.appendChild(n),n.contentWindow&&n.contentWindow.fetch&&(t=a(n.contentWindow.fetch)),e.head.removeChild(n)}catch(s){("undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__)&&r.kg.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",s)}return t}function c(){var t=o.chrome,e=t&&t.app&&t.app.runtime,n="history"in o&&!!o.history.pushState&&!!o.history.replaceState;return!e&&n}},5370:function(t,e,n){"use strict";n.d(e,{$2:function(){return c},WD:function(){return s},cW:function(){return u}});var r,o=n(5671),i=n(3144),a=n(2684);function s(t){return new u((function(e){e(t)}))}function c(t){return new u((function(e,n){n(t)}))}!function(t){t[t.PENDING=0]="PENDING";t[t.RESOLVED=1]="RESOLVED";t[t.REJECTED=2]="REJECTED"}(r||(r={}));var u=function(){function t(e){(0,o.Z)(this,t),t.prototype.__init.call(this),t.prototype.__init2.call(this),t.prototype.__init3.call(this),t.prototype.__init4.call(this),t.prototype.__init5.call(this),t.prototype.__init6.call(this);try{e(this._resolve,this._reject)}catch(n){this._reject(n)}}return(0,i.Z)(t,[{key:"__init",value:function(){this._state=r.PENDING}},{key:"__init2",value:function(){this._handlers=[]}},{key:"then",value:function(e,n){var r=this;return new t((function(t,o){r._handlers.push([!1,function(n){if(e)try{t(e(n))}catch(r){o(r)}else t(n)},function(e){if(n)try{t(n(e))}catch(r){o(r)}else o(e)}]),r._executeHandlers()}))}},{key:"catch",value:function(t){return this.then((function(t){return t}),t)}},{key:"finally",value:function(e){var n=this;return new t((function(t,r){var o,i;return n.then((function(t){i=!1,o=t,e&&e()}),(function(t){i=!0,o=t,e&&e()})).then((function(){i?r(o):t(o)}))}))}},{key:"__init3",value:function(){var t=this;this._resolve=function(e){t._setResult(r.RESOLVED,e)}}},{key:"__init4",value:function(){var t=this;this._reject=function(e){t._setResult(r.REJECTED,e)}}},{key:"__init5",value:function(){var t=this;this._setResult=function(e,n){t._state===r.PENDING&&((0,a.J8)(n)?n.then(t._resolve,t._reject):(t._state=e,t._value=n,t._executeHandlers()))}}},{key:"__init6",value:function(){var t=this;this._executeHandlers=function(){if(t._state!==r.PENDING){var e=t._handlers.slice();t._handlers=[],e.forEach((function(e){e[0]||(t._state===r.RESOLVED&&e[1](t._value),t._state===r.REJECTED&&e[2](t._value),e[0]=!0)}))}}}}]),t}()},5153:function(t,e,n){"use strict";n.d(e,{Z1:function(){return p},_I:function(){return f},ph:function(){return l},yW:function(){return u}});var r=n(9),o=n(9195);t=n.hmd(t);var i=(0,o.Rf)(),a={nowSeconds:function(){return Date.now()/1e3}};var s=(0,r.KV)()?function(){try{return(0,r.l$)(t,"perf_hooks").performance}catch(e){return}}():function(){var t=i.performance;if(t&&t.now)return{now:function(){return t.now()},timeOrigin:Date.now()-t.now()}}(),c=void 0===s?a:{nowSeconds:function(){return(s.timeOrigin+s.now())/1e3}},u=a.nowSeconds.bind(a),l=c.nowSeconds.bind(c),f=l,p=function(){var t=i.performance;if(t&&t.now){var e=36e5,n=t.now(),r=Date.now(),o=t.timeOrigin?Math.abs(t.timeOrigin+n-r):e,a=o1&&void 0!==arguments[1]?arguments[1]:"legacy",n=t.endsWith(".html"),r=t.endsWith(".xml"),o=t.endsWith(".pdf");return"/"===t?t:((n||r||o)&&(e="never"),"always"===e?t.endsWith("/")?t:"".concat(t,"/"):"never"===e&&t.endsWith("/")?t.slice(0,-1):t)}},540:function(t,e,n){"use strict";e.__esModule=!0,e.onInitialClientRender=void 0;n(3521),n(2163);e.onInitialClientRender=function(){}},1897:function(t,e,n){"use strict";n(6535),n(9244),e.__esModule=!0,e.getForwards=function(t){return null==t?void 0:t.flatMap((function(t){return(null==t?void 0:t.forward)||[]}))}},2163:function(t,e,n){"use strict";e.__esModule=!0,e.injectPartytownSnippet=function(t){if(!t.length)return;var e=document.querySelector("script[data-partytown]"),n=document.querySelector('iframe[src*="~partytown/partytown-sandbox-sw"]');e&&e.remove();n&&n.remove();var i=(0,o.getForwards)(t),a=document.createElement("script");a.dataset.partytown="",a.innerHTML=(0,r.partytownSnippet)({forward:i}),document.head.appendChild(a)};var r=n(2911),o=n(1897)},5706:function(t,e,n){"use strict";var r=n(8812),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function c(t){return r.isMemo(t)?a:s[t.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=a;var u=Object.defineProperty,l=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,d=Object.getPrototypeOf,h=Object.prototype;t.exports=function t(e,n,r){if("string"!=typeof n){if(h){var o=d(n);o&&o!==h&&t(e,o,r)}var a=l(n);f&&(a=a.concat(f(n)));for(var s=c(e),v=c(n),m=0;ml;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},7475:function(t,e,n){var r=n(3157),o=n(4411),i=n(111),a=n(5112)("species"),s=Array;t.exports=function(t){var e;return r(t)&&(e=t.constructor,(o(e)&&(e===s||r(e.prototype))||i(e)&&null===(e=e[a]))&&(e=void 0)),void 0===e?s:e}},5417:function(t,e,n){var r=n(7475);t.exports=function(t,e){return new(r(t))(0===e?0:e)}},4326:function(t,e,n){var r=n(1702),o=r({}.toString),i=r("".slice);t.exports=function(t){return i(o(t),8,-1)}},648:function(t,e,n){var r=n(1694),o=n(614),i=n(4326),a=n(5112)("toStringTag"),s=Object,c="Arguments"==i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(n){}}(e=s(t),a))?n:c?i(e):"Object"==(r=i(e))&&o(e.callee)?"Arguments":r}},9920:function(t,e,n){var r=n(2597),o=n(3887),i=n(1236),a=n(3070);t.exports=function(t,e,n){for(var s=o(e),c=a.f,u=i.f,l=0;l9007199254740991)throw e("Maximum allowed index exceeded");return t}},8113:function(t){t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},7392:function(t,e,n){var r,o,i=n(7854),a=n(8113),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(o=(r=l.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},748:function(t){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(t,e,n){var r=n(7854),o=n(1236).f,i=n(8880),a=n(8052),s=n(3072),c=n(9920),u=n(4705);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,m=t.stat;if(n=v?r:m?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in e){if(p=e[l],f=t.dontCallGetSet?(d=o(n,l))&&d.value:n[l],!u(v?l:h+(m?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},7293:function(t){t.exports=function(t){try{return!!t()}catch(e){return!0}}},6790:function(t,e,n){"use strict";var r=n(3157),o=n(6244),i=n(7207),a=n(9974),s=function(t,e,n,c,u,l,f,p){for(var d,h,v=u,m=0,_=!!f&&a(f,p);m0&&r(d)?(h=o(d),v=s(t,e,d,h,v,l-1)-1):(i(v+1),t[v]=d),v++),m++;return v};t.exports=s},9974:function(t,e,n){var r=n(1470),o=n(9662),i=n(4374),a=r(r.bind);t.exports=function(t,e){return o(t),void 0===e?t:i?a(t,e):function(){return t.apply(e,arguments)}}},4374:function(t,e,n){var r=n(7293);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},6916:function(t,e,n){var r=n(4374),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:function(t,e,n){var r=n(9781),o=n(2597),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},1470:function(t,e,n){var r=n(4326),o=n(1702);t.exports=function(t){if("Function"===r(t))return o(t)}},1702:function(t,e,n){var r=n(4374),o=Function.prototype,i=o.call,a=r&&o.bind.bind(i,i);t.exports=r?a:function(t){return function(){return i.apply(t,arguments)}}},5005:function(t,e,n){var r=n(7854),o=n(614),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},8173:function(t,e,n){var r=n(9662),o=n(8554);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},7854:function(t,e,n){var r=function(t){return t&&t.Math==Math&&t};t.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:function(t,e,n){var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return i(o(t),e)}},3501:function(t){t.exports={}},490:function(t,e,n){var r=n(5005);t.exports=r("document","documentElement")},4664:function(t,e,n){var r=n(9781),o=n(7293),i=n(317);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:function(t,e,n){var r=n(1702),o=n(7293),i=n(4326),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?s(t,""):a(t)}:a},2788:function(t,e,n){var r=n(1702),o=n(614),i=n(5465),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},9909:function(t,e,n){var r,o,i,a=n(4811),s=n(7854),c=n(111),u=n(8880),l=n(2597),f=n(5465),p=n(6200),d=n(3501),h="Object already initialized",v=s.TypeError,m=s.WeakMap;if(a||f.state){var _=f.state||(f.state=new m);_.get=_.get,_.has=_.has,_.set=_.set,r=function(t,e){if(_.has(t))throw v(h);return e.facade=t,_.set(t,e),e},o=function(t){return _.get(t)||{}},i=function(t){return _.has(t)}}else{var y=p("state");d[y]=!0,r=function(t,e){if(l(t,y))throw v(h);return e.facade=t,u(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw v("Incompatible receiver, "+t+" required");return n}}}},3157:function(t,e,n){var r=n(4326);t.exports=Array.isArray||function(t){return"Array"==r(t)}},614:function(t,e,n){var r=n(4154),o=r.all;t.exports=r.IS_HTMLDDA?function(t){return"function"==typeof t||t===o}:function(t){return"function"==typeof t}},4411:function(t,e,n){var r=n(1702),o=n(7293),i=n(614),a=n(648),s=n(5005),c=n(2788),u=function(){},l=[],f=s("Reflect","construct"),p=/^\s*(?:class|function)\b/,d=r(p.exec),h=!p.exec(u),v=function(t){if(!i(t))return!1;try{return f(u,l,t),!0}catch(e){return!1}},m=function(t){if(!i(t))return!1;switch(a(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return h||!!d(p,c(t))}catch(e){return!0}};m.sham=!0,t.exports=!f||o((function(){var t;return v(v.call)||!v(Object)||!v((function(){t=!0}))||t}))?m:v},4705:function(t,e,n){var r=n(7293),o=n(614),i=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n==l||n!=u&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},8554:function(t){t.exports=function(t){return null==t}},111:function(t,e,n){var r=n(614),o=n(4154),i=o.all;t.exports=o.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:r(t)||t===i}:function(t){return"object"==typeof t?null!==t:r(t)}},1913:function(t){t.exports=!1},2190:function(t,e,n){var r=n(5005),o=n(614),i=n(7976),a=n(3307),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},6244:function(t,e,n){var r=n(7466);t.exports=function(t){return r(t.length)}},6339:function(t,e,n){var r=n(1702),o=n(7293),i=n(614),a=n(2597),s=n(9781),c=n(6530).CONFIGURABLE,u=n(2788),l=n(9909),f=l.enforce,p=l.get,d=String,h=Object.defineProperty,v=r("".slice),m=r("".replace),_=r([].join),y=s&&!o((function(){return 8!==h((function(){}),"length",{value:8}).length})),g=String(String).split("String"),b=t.exports=function(t,e,n){"Symbol("===v(d(e),0,7)&&(e="["+m(d(e),/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!a(t,"name")||c&&t.name!==e)&&(s?h(t,"name",{value:e,configurable:!0}):t.name=e),y&&n&&a(n,"arity")&&t.length!==n.arity&&h(t,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?s&&h(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(o){}var r=f(t);return a(r,"source")||(r.source=_(g,"string"==typeof e?e:"")),t};Function.prototype.toString=b((function(){return i(this)&&p(this).source||u(this)}),"toString")},4758:function(t){var e=Math.ceil,n=Math.floor;t.exports=Math.trunc||function(t){var r=+t;return(r>0?n:e)(r)}},30:function(t,e,n){var r,o=n(9670),i=n(6048),a=n(748),s=n(3501),c=n(490),u=n(317),l=n(6200),f=l("IE_PROTO"),p=function(){},d=function(t){return" \ No newline at end of file +

좋은 이름은 기억에 오래 남고, 비슷한 이름은 익숙해지기 쉽습니다. 이런 노력을 기울여서 이름에 대한 프로그래머의 생각비율을 최소화 합시다.

Published Jan 6, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file diff --git a/books/clean-code/2023-01-13-pt03/index.html b/books/clean-code/2023-01-13-pt03/index.html index cbe83c0c..138ec486 100644 --- a/books/clean-code/2023-01-13-pt03/index.html +++ b/books/clean-code/2023-01-13-pt03/index.html @@ -184,4 +184,4 @@

‘요구사항 문서로 도출되는 명사와 동사를 클래스와 함수 후보로 고려하자’ 같은 소리를 하는게 절대 아닙니다!!!

시스템을 구현할 프로그램으로 보지 않고 풀어나갈 이야기로 여겨서, 이를 도메인에 특화된 언어로 풀어나간다고 할 수 있겠습니다.

찐막

-

향로님의 좋은 함수 만들기 시리즈도 함께 읽어보십시오.

Published Jan 13, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file +

향로님의 좋은 함수 만들기 시리즈도 함께 읽어보십시오.

Published Jan 13, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file diff --git a/books/clean-code/2023-01-13-pt04/index.html b/books/clean-code/2023-01-13-pt04/index.html index 83a31f68..1129a228 100644 --- a/books/clean-code/2023-01-13-pt04/index.html +++ b/books/clean-code/2023-01-13-pt04/index.html @@ -143,4 +143,4 @@

모호한 관계

주석과 코드는 서로 말하는 바가 같아야 합니다. 그렇지 않으면 주석이 잘못 말하고있는지, 코드가 잘못 말하고 있는지 판단할 수가 없습니다.

-

[^1] : 모국어와 외국어 읽기에 대한 연구에 의하면, ’기술적으로 글을 잘 읽기 위해서는 빠르고도 자동적인 단어 인지와 이해력을 높이기 위한 절과 구조의 빠른 인지를 필요로 한다.’ 라는 주장입니다.
또한, 아래 논문들은 다른 언어로 된 글 읽기는 질적으로 다른 지각과 과정 전략을 포함한다고 주장하는 연구입니다. 참고 1 , 참고 2  

Published Jan 13, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file +

[^1] : 모국어와 외국어 읽기에 대한 연구에 의하면, ’기술적으로 글을 잘 읽기 위해서는 빠르고도 자동적인 단어 인지와 이해력을 높이기 위한 절과 구조의 빠른 인지를 필요로 한다.’ 라는 주장입니다.
또한, 아래 논문들은 다른 언어로 된 글 읽기는 질적으로 다른 지각과 과정 전략을 포함한다고 주장하는 연구입니다. 참고 1 , 참고 2  

Published Jan 13, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file diff --git a/books/clean-code/2023-01-27-pt05/index.html b/books/clean-code/2023-01-27-pt05/index.html index 470a76ee..890fac72 100644 --- a/books/clean-code/2023-01-27-pt05/index.html +++ b/books/clean-code/2023-01-27-pt05/index.html @@ -98,4 +98,4 @@

PEP 8 을 기반으로 한 각종 포매터들이 떠오르실겁니다.

팀 규칙

-

팀에 속한다면 규칙을 따르는 것이 좋겠습니다. 하나의 규칙을 세울 때 최대한 일관적인 생각을 가지고 이를 유지하면, 로직에 집중할 힘이 생길 것입니다.

Published Jan 27, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file +

팀에 속한다면 규칙을 따르는 것이 좋겠습니다. 하나의 규칙을 세울 때 최대한 일관적인 생각을 가지고 이를 유지하면, 로직에 집중할 힘이 생길 것입니다.

Published Jan 27, 2023

Non scholæ sed vitæ discimus.

his/him

\ No newline at end of file diff --git a/books/clean-code/2023-01-27-pt06/index.html b/books/clean-code/2023-01-27-pt06/index.html index b7864a4a..fe4f1342 100644 --- a/books/clean-code/2023-01-27-pt06/index.html +++ b/books/clean-code/2023-01-27-pt06/index.html @@ -257,4 +257,4 @@

  • VISITOR 패턴을 활용하여 풀어낼 수도 있지만, 이런 기법 또한 내부 구조가 VISITOR에 열리게됩니다. 캡슐화 위반이지요. 그리고 상기 살펴본 절차적 프로그램에서 볼 수 있는 구조가 반환됩니다.  
  • -

    Published Jan 27, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jan 27, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-02-03-pt07/index.html b/books/clean-code/2023-02-03-pt07/index.html index 4e2e861e..e7eda705 100644 --- a/books/clean-code/2023-02-03-pt07/index.html +++ b/books/clean-code/2023-02-03-pt07/index.html @@ -127,4 +127,4 @@

  • 상세한 내용은 리팩토링 개정 2판의 ‘10.5 - 특이 케이스 추가하기’ 를 참고하십시오.
  • -

    Published Feb 3, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 3, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-02-03-pt08/index.html b/books/clean-code/2023-02-03-pt08/index.html index 6641e7e2..262031df 100644 --- a/books/clean-code/2023-02-03-pt08/index.html +++ b/books/clean-code/2023-02-03-pt08/index.html @@ -110,4 +110,4 @@

    테스트 주도 개발의 222-237쪽을 참고하십시오. -

    Published Feb 3, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 3, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-02-10-pt09/index.html b/books/clean-code/2023-02-10-pt09/index.html index 9e7eae8a..9279e92b 100644 --- a/books/clean-code/2023-02-10-pt09/index.html +++ b/books/clean-code/2023-02-10-pt09/index.html @@ -141,4 +141,4 @@

  • 저자의 FitNesse 프로젝트에선 BUILD-OPERATE-CHECK 패턴이라고 부릅니다. 이렇게 부르는 이유는, 저자의 프로젝트에선 빌드하고 작동시킨 후 체크하기 때문이지요.
  • -

    Published Feb 10, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 10, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-02-10-pt10/index.html b/books/clean-code/2023-02-10-pt10/index.html index 84573c6b..93689afd 100644 --- a/books/clean-code/2023-02-10-pt10/index.html +++ b/books/clean-code/2023-02-10-pt10/index.html @@ -138,4 +138,4 @@

    변경으로부터 격리

    객체 지향 프로그래밍을 배울 때, Concrete class와 Abstract class 클래스를 배웁니다. 이는 추상구현과 상세구현의 분리를 시사합니다. 상세한 구현에 의존한 코드는 변화에 취약하기 때문이지요.

    ‘어떤 기능이 있음’을 먼저 생각하고, 그 구현체를 앞서 생각한 기능에 맞추어 개발할 필요가 있습니다. 이를 구현의 결합도를 낮춘다고 표현합니다. 결합도가 낮아지면 유연성과 재사용성 또한 높아집니다. 시스템이 잘 격리되어있으면 이해하기도 쉬워집니다.

    -

    이러한 클래스 설계원칙을 DIP(Dependency Inversion Principle)라고 부르며 이 또한 앞서말한 SOLID의 D 입니다.

    Published Feb 10, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이러한 클래스 설계원칙을 DIP(Dependency Inversion Principle)라고 부르며 이 또한 앞서말한 SOLID의 D 입니다.

    Published Feb 10, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-02-17-pt01/index.html b/books/clean-code/2023-02-17-pt01/index.html index 4fb000c2..2fcf93f7 100644 --- a/books/clean-code/2023-02-17-pt01/index.html +++ b/books/clean-code/2023-02-17-pt01/index.html @@ -524,4 +524,4 @@

    보다 상세한 내용에 대해서는 해당 게시글을 참고하십시오.  
  • 이런 식의 접근은 DDD(Domain-driven Development)와 직접적으로 맞닿아 있습니다.  
  • -

    Published Feb 17, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 17, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-02-24-pt01/index.html b/books/clean-code/2023-02-24-pt01/index.html index b19acf8f..5d666f40 100644 --- a/books/clean-code/2023-02-24-pt01/index.html +++ b/books/clean-code/2023-02-24-pt01/index.html @@ -181,4 +181,4 @@

  • 더 나아가, 코드리뷰를 쉽게 하기 위해서 최소한의 구현을 빠르게 하고 리뷰받읍시다. 긴 코드는 리뷰를 설렁설렁 하게 됩니다.
    아울러 PR에 대한 이야기도 살펴보십시오.  
  • -

    Published Feb 24, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 24, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/clean-code/2023-03-07-pt01/index.html b/books/clean-code/2023-03-07-pt01/index.html index 2b95f530..55cd8751 100644 --- a/books/clean-code/2023-03-07-pt01/index.html +++ b/books/clean-code/2023-03-07-pt01/index.html @@ -378,4 +378,4 @@

    이 링크 의 내용이 도움 되었습니다.  
  • Tanenbaum의 Modern Operating Systems, Chapter 2 관련 장표가 상당히 도움되었습니다. 참고링크  
  • -

    Published Mar 7, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Mar 7, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-11-pt01-ch01/index.html b/books/cosmic-python/2023-04-11-pt01-ch01/index.html index 5db36d76..88c100c3 100644 --- a/books/cosmic-python/2023-04-11-pt01-ch01/index.html +++ b/books/cosmic-python/2023-04-11-pt01-ch01/index.html @@ -144,4 +144,4 @@

  • 자바로 치면 hashCode() , equals() 같은걸로 객체의 유일성 제공 및 동등함 부여를 체크한다 라는 말
  • -

    Published Apr 11, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 11, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-13-pt01-ch02/index.html b/books/cosmic-python/2023-04-13-pt01-ch02/index.html index f742368b..94f75de6 100644 --- a/books/cosmic-python/2023-04-13-pt01-ch02/index.html +++ b/books/cosmic-python/2023-04-13-pt01-ch02/index.html @@ -389,4 +389,4 @@

    참고 링크 -

    Published Apr 13, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 13, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-13-pt01-ch03/index.html b/books/cosmic-python/2023-04-13-pt01-ch03/index.html index 512ff50d..28c67270 100644 --- a/books/cosmic-python/2023-04-13-pt01-ch03/index.html +++ b/books/cosmic-python/2023-04-13-pt01-ch03/index.html @@ -223,4 +223,4 @@

    Gary Bernhardt 가 말한 Functional Core, Imperative Shell 이라는 접근방법이다. 상세한건 링크 참고 -

    Published Apr 13, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 13, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-15-pt01-ch04/index.html b/books/cosmic-python/2023-04-15-pt01-ch04/index.html index 3584122c..accdf577 100644 --- a/books/cosmic-python/2023-04-15-pt01-ch04/index.html +++ b/books/cosmic-python/2023-04-15-pt01-ch04/index.html @@ -361,4 +361,4 @@

    sqlite?

    SQLite는 딱히 TRUNCATE TABLE이 없다. 그래서 DELETE FROM 으로 다 날리면 된다

    -

    한편 postgres에서 DB 테스트하고 날릴거면 nextval 시퀀스 초기화라거나 그런 부분들도 생각해야한다.

    Published Apr 15, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    한편 postgres에서 DB 테스트하고 날릴거면 nextval 시퀀스 초기화라거나 그런 부분들도 생각해야한다.

    Published Apr 15, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-16-pt01-ch05/index.html b/books/cosmic-python/2023-04-16-pt01-ch05/index.html index 2b16125e..36fc300e 100644 --- a/books/cosmic-python/2023-04-16-pt01-ch05/index.html +++ b/books/cosmic-python/2023-04-16-pt01-ch05/index.html @@ -305,4 +305,4 @@

    Published Apr 16, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 16, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-16-pt01-ch06/index.html b/books/cosmic-python/2023-04-16-pt01-ch06/index.html index 8969f406..513eae00 100644 --- a/books/cosmic-python/2023-04-16-pt01-ch06/index.html +++ b/books/cosmic-python/2023-04-16-pt01-ch06/index.html @@ -435,4 +435,4 @@

  • 어떤 목표를 달성하기 위해 서로 협력하는 객체를 묘사하는 협력자(collaborator) 라는 단어가 있다. UoW와 Repository는 객체 모델링의 측면에서 아주 적절한 협력자의 예시라 할 수 있다. 책임 주도 설계에서 자신의 역할 안에서 협력하는 여러 객체를 이웃 객체(object neighborhood)라고 한다.
  • -

    Published Apr 16, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 16, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-17-pt01-ch07/index.html b/books/cosmic-python/2023-04-17-pt01-ch07/index.html index 79654392..e4423c15 100644 --- a/books/cosmic-python/2023-04-17-pt01-ch07/index.html +++ b/books/cosmic-python/2023-04-17-pt01-ch07/index.html @@ -612,4 +612,4 @@

    동시성 버그 재현을 위해 스레드 사이에서 세마포어나 비슷한 동기화 기능을 쓰는 편이 테스트 행동 방식을 보다 잘 보장할 수 있다.
  • https://www.postgresql.org/docs/current/explicit-locking.html
  • -

    Published Apr 17, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 17, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-04-17-pt02-ch08/index.html b/books/cosmic-python/2023-04-17-pt02-ch08/index.html index 5f10dcea..c63fb405 100644 --- a/books/cosmic-python/2023-04-17-pt02-ch08/index.html +++ b/books/cosmic-python/2023-04-17-pt02-ch08/index.html @@ -607,4 +607,4 @@

    아래 두 링크를 보고, 파이썬이든 뭐든 try/catch 구문을 극혐하고 빼야한다라고 생각하는 근거를 읽어보자.
  • 아래 두 아티클이 굉장히 도움될 것이다
  • -

    Published Apr 17, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Apr 17, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-05-06-pt02-ch09/index.html b/books/cosmic-python/2023-05-06-pt02-ch09/index.html index 2a81eb55..2c913db2 100644 --- a/books/cosmic-python/2023-05-06-pt02-ch09/index.html +++ b/books/cosmic-python/2023-05-06-pt02-ch09/index.html @@ -499,4 +499,4 @@

    https://martinfowler.com/articles/preparatory-refactoring-example.html
  • emit 이란 단어를 사용하는지는 해당 링크를 읽어보자. 다른 곳에서도 자주 쓰이는 듯 하니…
  • -

    Published May 6, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published May 6, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-05-07-pt02-ch10/index.html b/books/cosmic-python/2023-05-07-pt02-ch10/index.html index 19b74d55..cec9c6de 100644 --- a/books/cosmic-python/2023-05-07-pt02-ch10/index.html +++ b/books/cosmic-python/2023-05-07-pt02-ch10/index.html @@ -422,4 +422,4 @@

    대충 이런 상품이 있다고 생각해주세요
  • Product.allocate() 은 내부적으로 Batch.can_allocate() 로직을 거치기 때문
  • -

    Published May 7, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published May 7, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-05-18-pt02-ch10/index.html b/books/cosmic-python/2023-05-18-pt02-ch10/index.html index 9184fcb4..e00a10dc 100644 --- a/books/cosmic-python/2023-05-18-pt02-ch10/index.html +++ b/books/cosmic-python/2023-05-18-pt02-ch10/index.html @@ -434,4 +434,4 @@

    원문에선 Distributed Ball of Mud antipattern 이라고 했다. 이런 설계가 안티패턴임을 시사하는 비꼬기 같은데 이걸 어케 번역함ㅋㅋ
  • 책에선 ‘배달’ 이란 용어를 쓰는데, 난 이게 더 익숙해서 이렇게 풀거다. 아니면 딜리버라고 바로 말하거나, 영단어를 바로 쓰거나…
  • -

    Published May 18, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published May 18, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/cosmic-python/2023-05-18-pt02-ch12/index.html b/books/cosmic-python/2023-05-18-pt02-ch12/index.html index 65bf9c69..efac4363 100644 --- a/books/cosmic-python/2023-05-18-pt02-ch12/index.html +++ b/books/cosmic-python/2023-05-18-pt02-ch12/index.html @@ -401,4 +401,4 @@

    쿼리 1번으로 N건을 가져왔으나, 관련 컬럼을 얻기 위해 쿼리를 N번 더 하는(!) 문제를 의미한다. 필히 알아둬야 할 내용이다. (N+1 쿼리문제 관련 링크)(교재상의 참고링크)
  • Time to Completely Jump the Shark이 원제인데, jumping the shark은 잘 안풀려서 무리수를 뒀다 이런 뜻이라… (링크를 보고 알아서 판단하시와요)
  • -

    Published May 18, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published May 18, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/pragmatic-programmer-1st/2018-02-21-pt01/index.html b/books/pragmatic-programmer-1st/2018-02-21-pt01/index.html index b6862d6b..9caf05e6 100644 --- a/books/pragmatic-programmer-1st/2018-02-21-pt01/index.html +++ b/books/pragmatic-programmer-1st/2018-02-21-pt01/index.html @@ -125,4 +125,4 @@

    Published Feb 21, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    장인정신은 이렇기 때문에 중요하다.

    Published Feb 21, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/pragmatic-programmer-1st/2018-02-21-pt02/index.html b/books/pragmatic-programmer-1st/2018-02-21-pt02/index.html index a91bf66c..31dbd4f9 100644 --- a/books/pragmatic-programmer-1st/2018-02-21-pt02/index.html +++ b/books/pragmatic-programmer-1st/2018-02-21-pt02/index.html @@ -269,4 +269,4 @@

    Tip 10. 무엇을 말하는가와 어떻게 말하는가 모두 중요하다

    -

    Published Feb 21, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 21, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/pragmatic-programmer-1st/2018-02-23-pt03/index.html b/books/pragmatic-programmer-1st/2018-02-23-pt03/index.html index b22b1ede..0dd2f592 100644 --- a/books/pragmatic-programmer-1st/2018-02-23-pt03/index.html +++ b/books/pragmatic-programmer-1st/2018-02-23-pt03/index.html @@ -135,4 +135,4 @@

    Published Feb 23, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 23, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/pragmatic-programmer-1st/2018-02-24-pt04/index.html b/books/pragmatic-programmer-1st/2018-02-24-pt04/index.html index 0982ff94..76404c8a 100644 --- a/books/pragmatic-programmer-1st/2018-02-24-pt04/index.html +++ b/books/pragmatic-programmer-1st/2018-02-24-pt04/index.html @@ -336,4 +336,4 @@

    Published Feb 24, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 24, 2018

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/unit-testing/2023-06-28-pt01-ch01/index.html b/books/unit-testing/2023-06-28-pt01-ch01/index.html index 1dc73041..44c0ac48 100644 --- a/books/unit-testing/2023-06-28-pt01-ch01/index.html +++ b/books/unit-testing/2023-06-28-pt01-ch01/index.html @@ -382,4 +382,4 @@

    열역학 제 2법칙의 그 엔트로피에서 따왔다. 소프트웨어 엔트로피는 소프트웨어 시스템 내의 무질서도를 의미한다고 보면 될 것이다
  • https://docs.python.org/3/library/functions.html#int
  • -

    Published Jun 28, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jun 28, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/unit-testing/2023-06-30-pt01-ch02/index.html b/books/unit-testing/2023-06-30-pt01-ch02/index.html index 8c329a30..231255b7 100644 --- a/books/unit-testing/2023-06-30-pt01-ch02/index.html +++ b/books/unit-testing/2023-06-30-pt01-ch02/index.html @@ -779,4 +779,4 @@

    Published Jun 30, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jun 30, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/unit-testing/2023-07-01-pt01-ch03/index.html b/books/unit-testing/2023-07-01-pt01-ch03/index.html index f236bda0..f7ecfea3 100644 --- a/books/unit-testing/2023-07-01-pt01-ch03/index.html +++ b/books/unit-testing/2023-07-01-pt01-ch03/index.html @@ -652,4 +652,4 @@

    Published Jul 1, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jul 1, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/books/unit-testing/2023-07-04-pt02-ch04/index.html b/books/unit-testing/2023-07-04-pt02-ch04/index.html index fe852e64..6e42c97c 100644 --- a/books/unit-testing/2023-07-04-pt02-ch04/index.html +++ b/books/unit-testing/2023-07-04-pt02-ch04/index.html @@ -1034,4 +1034,4 @@

    버그 없는 시스템은 없다. 최소한 이 의견에 동의한다. True Negative 영역 어딘가에 존재할 ‘수도 있다’. 관련 내용에 대한 원본 링크
  • 코스믹 파이썬에서 시사하는 high gear, low gear가 연관있을지 살펴보자.
  • -

    Published Jul 4, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jul 4, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index 2cc3cdab..33e8b80d 100644 --- a/categories/index.html +++ b/categories/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/category/books/index.html b/category/books/index.html index 13e12f77..818c60a3 100644 --- a/category/books/index.html +++ b/category/books/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    books

    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    \ No newline at end of file +

    books

    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/category/books/page/1/index.html b/category/books/page/1/index.html index b3c4a724..52db908d 100644 --- a/category/books/page/1/index.html +++ b/category/books/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    \ No newline at end of file +

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/category/books/page/2/index.html b/category/books/page/2/index.html index c9f4679e..2ab2b4f8 100644 --- a/category/books/page/2/index.html +++ b/category/books/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    books

    실용주의 프로그래머 pt. 4

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 4

    Read
    books

    실용주의 프로그래머 pt. 3

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 3

    Read
    books

    실용주의 프로그래머 pt. 2

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 2

    Read
    books

    실용주의 프로그래머 pt. 1

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 1

    Read
    \ No newline at end of file +

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    books

    실용주의 프로그래머 pt. 4

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 4

    Read
    books

    실용주의 프로그래머 pt. 3

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 3

    Read
    books

    실용주의 프로그래머 pt. 2

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 2

    Read
    books

    실용주의 프로그래머 pt. 1

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 1

    Read
    \ No newline at end of file diff --git a/category/devlog/index.html b/category/devlog/index.html index 5823ca1c..f19fe0f0 100644 --- a/category/devlog/index.html +++ b/category/devlog/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devlog

    devlog

    서블릿부터 스프링 프레임워크까지

    PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    \ No newline at end of file +

    devlog

    devlog

    서블릿부터 스프링 프레임워크까지

    PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    \ No newline at end of file diff --git a/category/devlog/page/1/index.html b/category/devlog/page/1/index.html index be9bb12b..157264a4 100644 --- a/category/devlog/page/1/index.html +++ b/category/devlog/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devlog

    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)

    PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    \ No newline at end of file +

    devlog

    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)

    PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    \ No newline at end of file diff --git a/category/devlog/page/2/index.html b/category/devlog/page/2/index.html index babb711c..18730399 100644 --- a/category/devlog/page/2/index.html +++ b/category/devlog/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devlog

    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    \ No newline at end of file +

    devlog

    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    \ No newline at end of file diff --git a/category/devlog/page/3/index.html b/category/devlog/page/3/index.html index 33dbe136..4c40dda7 100644 --- a/category/devlog/page/3/index.html +++ b/category/devlog/page/3/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devlog

    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    devlog

    인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기

    OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.

    Read
    devlog

    인가를 다시 살펴보다 (1) OAuth 2.0 개요와 프로토콜 소개

    API 서비스가 많이 나누어졌을 때, 인가에 대해 살펴보며 **인가** 에 사용되는 OAuth 2.0 스펙을 알아봅시다.

    Read
    devlog

    HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?

    JWT의 사용방안과, 세션 쿠키처럼 사용하는 JWT 토큰 사용방식이 과연 타당한 쓰임새인지 살펴봅시다.

    Read
    \ No newline at end of file +

    devlog

    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    devlog

    인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기

    OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.

    Read
    devlog

    인가를 다시 살펴보다 (1) OAuth 2.0 개요와 프로토콜 소개

    API 서비스가 많이 나누어졌을 때, 인가에 대해 살펴보며 **인가** 에 사용되는 OAuth 2.0 스펙을 알아봅시다.

    Read
    devlog

    HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?

    JWT의 사용방안과, 세션 쿠키처럼 사용하는 JWT 토큰 사용방식이 과연 타당한 쓰임새인지 살펴봅시다.

    Read
    \ No newline at end of file diff --git a/category/devlog/page/4/index.html b/category/devlog/page/4/index.html index d57b779c..1f594838 100644 --- a/category/devlog/page/4/index.html +++ b/category/devlog/page/4/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devlog

    devlog

    HTTP의 인증에 대해 (1) 인증의 발전사

    HTTP 기본 스펙을 이용한 기초적 인증부터 쿠키와 세션을, 그리고 갑자기 들불처럼 등장한 JWT이 뭔지까지만 살펴봅니다.

    Read
    devlog

    Python의 디스크립터에 대해 (1): 이론

    Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.

    Read
    devlog

    시작부터 배포까지: 도커 패키징의 베스트케이스

    PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.

    Read
    devlog

    ksqlDB 101, part 3. 실전 예시: 오픈소스를 통해 살펴보는 실시간 보안 이벤트 탐지 룰

    ksqlDB을 활용한 오픈소스의 예시를 통해, 보안 이벤트를 실시간으로 걸러내는 방안에 대해 학습해보고 이를 토대로 어떤식으로 활용하면 좋을지 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 2. Kafka Streams에 대해

    ksqlDB의 내부 구조인 Apache Kafka의 Kafka Streams를 간략하게 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 1. 배경지식

    ksqlDB를 어느정도 이해하기 위해 필요한 기본지식을 설명하였습니다.

    Read
    \ No newline at end of file +

    devlog

    devlog

    HTTP의 인증에 대해 (1) 인증의 발전사

    HTTP 기본 스펙을 이용한 기초적 인증부터 쿠키와 세션을, 그리고 갑자기 들불처럼 등장한 JWT이 뭔지까지만 살펴봅니다.

    Read
    devlog

    Python의 디스크립터에 대해 (1): 이론

    Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.

    Read
    devlog

    시작부터 배포까지: 도커 패키징의 베스트케이스

    PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.

    Read
    devlog

    ksqlDB 101, part 3. 실전 예시: 오픈소스를 통해 살펴보는 실시간 보안 이벤트 탐지 룰

    ksqlDB을 활용한 오픈소스의 예시를 통해, 보안 이벤트를 실시간으로 걸러내는 방안에 대해 학습해보고 이를 토대로 어떤식으로 활용하면 좋을지 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 2. Kafka Streams에 대해

    ksqlDB의 내부 구조인 Apache Kafka의 Kafka Streams를 간략하게 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 1. 배경지식

    ksqlDB를 어느정도 이해하기 위해 필요한 기본지식을 설명하였습니다.

    Read
    \ No newline at end of file diff --git a/category/retrospect/index.html b/category/retrospect/index.html index 36b866e0..84e84969 100644 --- a/category/retrospect/index.html +++ b/category/retrospect/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    retrospect

    retrospect

    [글또10기] 삶의 지도

    글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    retrospect

    1년차 회고

    2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)

    Read
    \ No newline at end of file +

    retrospect

    retrospect

    [글또10기] 삶의 지도

    글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    retrospect

    1년차 회고

    2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)

    Read
    \ No newline at end of file diff --git a/category/tips/index.html b/category/tips/index.html index f1fdd582..8311c787 100644 --- a/category/tips/index.html +++ b/category/tips/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    tips

    tips

    Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)

    Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.

    Read
    tips

    토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.

    Read
    tips

    토탈 커맨더 입문기 (1) 기본기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.

    Read
    tips

    제발 한국인이라면 파일 끝에 엔터 칩시다

    EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.

    Read
    tips

    Bash 스크립트의 문자열 비교에 대해 알아봅시다

    Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.

    Read
    tips

    아니 내 탭 어디감?

    우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...

    Read
    tips

    PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기

    매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.

    Read
    \ No newline at end of file +

    tips

    tips

    Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)

    Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.

    Read
    tips

    토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.

    Read
    tips

    토탈 커맨더 입문기 (1) 기본기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.

    Read
    tips

    제발 한국인이라면 파일 끝에 엔터 칩시다

    EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.

    Read
    tips

    Bash 스크립트의 문자열 비교에 대해 알아봅시다

    Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.

    Read
    tips

    아니 내 탭 어디감?

    우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...

    Read
    tips

    pre-commit hook, 나도 한번 써보자 (1)

    pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.

    Read
    \ No newline at end of file diff --git a/category/tips/page/1/index.html b/category/tips/page/1/index.html index d6e3a39c..625cc062 100644 --- a/category/tips/page/1/index.html +++ b/category/tips/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/chunk-map.json b/chunk-map.json index 18f2c53b..3a453e5a 100644 --- a/chunk-map.json +++ b/chunk-map.json @@ -1 +1 @@ -{"polyfill":["/polyfill-d458e180ce0db2ade457.js"],"app":["/app-4f7f3a7ad20a05c933d6.js"],"component---cache-caches-gatsby-plugin-offline-app-shell-js":["/component---cache-caches-gatsby-plugin-offline-app-shell-js-0c915c7b1bdb5eac4fdf.js"],"component---src-templates-categories-template-categories-template-tsx":["/component---src-templates-categories-template-categories-template-tsx-e2d2add397e32e3517ca.js"],"component---src-templates-category-template-category-template-tsx":["/component---src-templates-category-template-category-template-tsx-078f2adfba160a34229f.js"],"component---src-templates-index-template-index-template-tsx":["/component---src-templates-index-template-index-template-tsx-83380c7954c9f6621026.js"],"component---src-templates-not-found-template-not-found-template-tsx":["/component---src-templates-not-found-template-not-found-template-tsx-56fe4d3b015459d56c99.js"],"component---src-templates-page-template-page-template-tsx":["/component---src-templates-page-template-page-template-tsx-c6c21d7369a9356db3a1.js"],"component---src-templates-post-template-post-template-tsx":["/component---src-templates-post-template-post-template-tsx-119cd0258cb38628d01f.js"],"component---src-templates-tag-template-tag-template-tsx":["/component---src-templates-tag-template-tag-template-tsx-8d0b3090e775aa3c4584.js"],"component---src-templates-tags-template-tags-template-tsx":["/component---src-templates-tags-template-tags-template-tsx-30027e87af7d042f3afb.js"]} \ No newline at end of file +{"polyfill":["/polyfill-93be280e3dbf3699d675.js"],"app":["/app-ea08e30339acd6ab79af.js"],"component---cache-caches-gatsby-plugin-offline-app-shell-js":["/component---cache-caches-gatsby-plugin-offline-app-shell-js-0c915c7b1bdb5eac4fdf.js"],"component---src-templates-categories-template-categories-template-tsx":["/component---src-templates-categories-template-categories-template-tsx-e2d2add397e32e3517ca.js"],"component---src-templates-category-template-category-template-tsx":["/component---src-templates-category-template-category-template-tsx-078f2adfba160a34229f.js"],"component---src-templates-index-template-index-template-tsx":["/component---src-templates-index-template-index-template-tsx-83380c7954c9f6621026.js"],"component---src-templates-not-found-template-not-found-template-tsx":["/component---src-templates-not-found-template-not-found-template-tsx-56fe4d3b015459d56c99.js"],"component---src-templates-page-template-page-template-tsx":["/component---src-templates-page-template-page-template-tsx-c6c21d7369a9356db3a1.js"],"component---src-templates-post-template-post-template-tsx":["/component---src-templates-post-template-post-template-tsx-119cd0258cb38628d01f.js"],"component---src-templates-tag-template-tag-template-tsx":["/component---src-templates-tag-template-tag-template-tsx-8d0b3090e775aa3c4584.js"],"component---src-templates-tags-template-tags-template-tsx":["/component---src-templates-tags-template-tags-template-tsx-30027e87af7d042f3afb.js"]} \ No newline at end of file diff --git a/devlog/backend/2022-10-05-considering-http-authn-pt01/index.html b/devlog/backend/2022-10-05-considering-http-authn-pt01/index.html index 5f2aa60f..ffa6b9c8 100644 --- a/devlog/backend/2022-10-05-considering-http-authn-pt01/index.html +++ b/devlog/backend/2022-10-05-considering-http-authn-pt01/index.html @@ -296,4 +296,4 @@

    해당 링크를 참고해주세요. -

    Published Oct 5, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 5, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/backend/2022-10-05-considering-http-authn-pt02/index.html b/devlog/backend/2022-10-05-considering-http-authn-pt02/index.html index 8f1c15d4..d097d645 100644 --- a/devlog/backend/2022-10-05-considering-http-authn-pt02/index.html +++ b/devlog/backend/2022-10-05-considering-http-authn-pt02/index.html @@ -260,4 +260,4 @@

    링크참조 -

    Published Oct 5, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 5, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01/index.html b/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01/index.html index b34e11a0..467c8ce4 100644 --- a/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01/index.html +++ b/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01/index.html @@ -864,4 +864,4 @@

    OAuth 2.0의 구동 관련 내용을 번역해둔 사항에 대해 참고하였습니다 -

    Published Oct 16, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 16, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02/index.html b/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02/index.html index d24be534..1ae8a2c2 100644 --- a/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02/index.html +++ b/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02/index.html @@ -449,4 +449,4 @@

    언제 OAuth 2.0을 쓰고 OIDC를 써야할지, 그리고 OAuth 2.1 드래프트를 살펴보며 어떤 식의 변화와 차이점에 주목해야 할지 알 수 있었습니다 -

    Published Oct 17, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 17, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/data/2020-02-05-ksqldb-101-pt01/index.html b/devlog/data/2020-02-05-ksqldb-101-pt01/index.html index 63e6bf74..b823744e 100644 --- a/devlog/data/2020-02-05-ksqldb-101-pt01/index.html +++ b/devlog/data/2020-02-05-ksqldb-101-pt01/index.html @@ -352,4 +352,4 @@

    Kafka 스키마 관리, Schema Registry -

    Published Feb 5, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 5, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/data/2020-02-17-ksqldb-101-pt01/index.html b/devlog/data/2020-02-17-ksqldb-101-pt01/index.html index 66a24c98..53b686e6 100644 --- a/devlog/data/2020-02-17-ksqldb-101-pt01/index.html +++ b/devlog/data/2020-02-17-ksqldb-101-pt01/index.html @@ -289,4 +289,4 @@

    Faust: Python Stream Processing -

    Published Feb 17, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 17, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/data/2020-03-10-ksqldb-101-pt03/index.html b/devlog/data/2020-03-10-ksqldb-101-pt03/index.html index 4e1ed66b..84dd76bf 100644 --- a/devlog/data/2020-03-10-ksqldb-101-pt03/index.html +++ b/devlog/data/2020-03-10-ksqldb-101-pt03/index.html @@ -324,4 +324,4 @@

    KSQL and Kafka Streams
  • HELK, Hunting ELK
  • Real-time sysmon processing via ksql and HELP pt.3
  • -

    Published Mar 10, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Mar 10, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/docker/2021-09-18-how-to-make-docker-image-securely/index.html b/devlog/docker/2021-09-18-how-to-make-docker-image-securely/index.html index 05c1aeb9..05a0c526 100644 --- a/devlog/docker/2021-09-18-how-to-make-docker-image-securely/index.html +++ b/devlog/docker/2021-09-18-how-to-make-docker-image-securely/index.html @@ -302,4 +302,4 @@

    References

    Published Sep 18, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Sep 18, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/docker/2023-03-13-from-servlet-to-spring/index.html b/devlog/docker/2023-03-13-from-servlet-to-spring/index.html index 5ffa01b4..c41edf68 100644 --- a/devlog/docker/2023-03-13-from-servlet-to-spring/index.html +++ b/devlog/docker/2023-03-13-from-servlet-to-spring/index.html @@ -277,4 +277,4 @@

    Java EE 5 튜토리얼 (사실 이 속에 정답이 거의 들어있었습니다!)
  • Configuration annotation을 통한 Spring Bean 설정
  • Spring @Configuration Annotation
  • -

    Published Mar 13, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Mar 13, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/python/2022-06-09-python-classmethod-and-staticmethod/index.html b/devlog/python/2022-06-09-python-classmethod-and-staticmethod/index.html index 66b72a34..f02f9ec7 100644 --- a/devlog/python/2022-06-09-python-classmethod-and-staticmethod/index.html +++ b/devlog/python/2022-06-09-python-classmethod-and-staticmethod/index.html @@ -166,4 +166,4 @@

    Published Jun 9, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jun 9, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/python/2022-06-10-python-descriptor-described/index.html b/devlog/python/2022-06-10-python-descriptor-described/index.html index 29517d35..66c9305a 100644 --- a/devlog/python/2022-06-10-python-descriptor-described/index.html +++ b/devlog/python/2022-06-10-python-descriptor-described/index.html @@ -536,4 +536,4 @@

    내 나름의 결론

    이거… 제대로 쓰려면 상위 클래스에서 쓰고, 하위 클래스에서는 상속을 받고 써먹어야 하는 것 같다..

    코드가 dry 해지고, lazy properties 의 특징을 가지기야 한다만… 필요할 때 제대로 쓰자. 왜냐하면 평소엔 필요없을 것이기 때문이다.

    -

    따라서, 좋은 라이브러리의 코드를 이해하고 타고들어갈 때, 혹은 저수준의 라이브러리/파이썬 스러운 인터페이스 설계 시에는 쓸 수 있으니 얼마든지 이런 방향을 알고는 있어야할 것이다.

    Published Jun 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    따라서, 좋은 라이브러리의 코드를 이해하고 타고들어갈 때, 혹은 저수준의 라이브러리/파이썬 스러운 인터페이스 설계 시에는 쓸 수 있으니 얼마든지 이런 방향을 알고는 있어야할 것이다.

    Published Jun 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01/index.html b/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01/index.html index 5749b90f..f916fe14 100644 --- a/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01/index.html +++ b/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01/index.html @@ -582,4 +582,4 @@

    이 링크입니다. -

    Published Jan 22, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jan 22, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/python/2024-10-13-python-container-101-pt01/index.html b/devlog/python/2024-10-13-python-container-101-pt01/index.html index 4fa7f295..d3e5bd5a 100644 --- a/devlog/python/2024-10-13-python-container-101-pt01/index.html +++ b/devlog/python/2024-10-13-python-container-101-pt01/index.html @@ -79,6 +79,7 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }()
    All Articles

    [연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해

    이번 게시글에서는 컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너를 구성하기 위한 선택지를 살펴봅니다.

    +

    이 게시글은, 파이썬으로 서버 개발을 진행한 경험이 있으시다면 보다 쉽게 이해하실 수 있습니다.

    컨테이너 기술?

    요즘은 컨테이너로 서비스를 배포하는 것이 굉장히 일상적입니다. 각종 기고문 등에서도 컨테이너를 사용한 배포가 일상화 되어있고, 국내의 큰 회사도 100만개의 컨테이너가 동시에(!) 돌기도 한다고 합니다. 그렇다면 컨테이너가 어떤 것인지 먼저 살펴볼까요?

    컨테이너 이전에는…

    @@ -91,126 +92,32 @@

    2의 단락을 읽어주세요.

    컨테이너, IaC, DevOps, let’s go

    -

    컨테이너는 정말 쉽게 말하면, 어디서든 구동될 수 있는 서버 환경까지 고정하여 어디서든 동일하게 사용할 수 있도록 구성한 프로세스 입니다. 이게 구동되면 서버가 돌 수 있는 것이지요. 그런 컨테이너 기술로 널리 사용되는 것은 단연 Docker 입니다.

    -
    -(생략가능) Docker와 더 상세한 컨테이너 기술에 대한 정보는 여기에 정리했습니다. +

    보통 말하는 컨테이너의 정의는 아래와 같습니다.

    -

    🍎 tips

    -

    글의 방향을 이해하는 데는 크게 필요없지만, 만약 더 알아보시고 싶으시다면 이 내용을 참고해주세요.

    +

    애플리케이션을 패키징화하고 실행을 격리한다.

    +

    다시말해, 서버 구성 환경 하나하나 고정하여 어디서든 동일하게 실행가능한 프로세스 입니다. 좀 뭉뚱그려 말하면 이게 구동되면 서버가 돌 수 있는 것이지요. 그런 컨테이너 기술로 널리 사용되는 것은 단연 Docker 입니다. 컨테이너 기술의 등장으로 인해 기존 배포과정에서의 단점이 훌륭하게 해결되었지요. 실행 당시의 환경을 별도로 격리시켜주고, 종속성을 유지할 수 있게 할 수 있게 되다보니 아래와 같은 장점을 누릴 수 있게 되었습니다.

      -
    • -

      Docker의 역할과 발전

      -
        -
      • Docker는 컨테이너 기술을 대중화한 선구자 역할을 했습니다.
      • -
      • 초기에는 자체적인 도커 엔진을 통해 컨테이너를 관리했습니다.
      • -
      • 현재는 내부적으로 containerd를 사용하여 컨테이너 런타임을 관리합니다.
      • -
      -
    • -
    • -

      containerd의 분리와 역할

      -
        -
      • containerd는 원래 도커 엔진의 핵심 컴포넌트였습니다.
      • -
      • 2017년 CNCF(Cloud Native Computing Foundation)에 기부되어 독립 프로젝트가 되었습니다.
      • -
      • 2019년 CNCF 졸업 프로젝트가 되었습니다.
      • -
      • 컨테이너 이미지 관리, 실행, 네트워킹 등 컨테이너 생애주기 전반을 관리합니다.
      • -
      • Docker뿐만 아니라 쿠버네티스 등 다른 상위 레벨 시스템에서도 직접 사용될 수 있습니다.
      • -
      -
    • -
    • -

      OCI(Open Container Initiative)와 표준화

      -
        -
      • 2015년 설립되어 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 개발합니다.
      • -
      • 주요 표준: -
          -
        • 런타임 명세 (runtime-spec)
        • -
        • 이미지 명세 (image-spec)
        • -
        -
      • -
      • 다양한 컨테이너 런타임이 호환성을 유지할 수 있게 합니다.
      • -
      -
    • -
    • -

      다른 주요 컨테이너 기술

      -
        -
      • CRI-O: 쿠버네티스를 위해 특별히 설계된 컨테이너 런타임입니다. Red Hat과 쿠버네티스 커뮤니티에 의해 개발되었습니다.
      • -
      • rkt: CoreOS에서 개발한 대안적인 컨테이너 런타임으로, 보안과 모듈성에 중점을 두었습니다. (현재는 개발 중단)
      • -
      • LXC: 리눅스 커널 수준의 컨테이너화 기술로, 운영 체제 수준의 가상화를 제공합니다.
      • -
      -
    • -
    • -

      컨테이너 기술의 최신 트렌드

      -
        -
      • 마이크로서비스 아키텍처의 부상과 함께 컨테이너 기술의 중요성이 더욱 커졌습니다.
      • -
      • 서버리스 컴퓨팅에서도 컨테이너 기술이 백엔드로 활용되고 있습니다.
      • -
      • 쿠버네티스와 같은 오케스트레이션 도구의 발전으로 컨테이너 관리가 더욱 효율적으로 이루어지고 있습니다.
      • -
      -
    • -
    -
    -

    컨테이너 기술의 대두는 기존에 지적되어왔던 단점을 훌륭하게 해결해주었지요. 실행 당시의 환경을 별도로 격리시켜주고, 종속성을 유지할 수 있게 할 수 있지요. 이렇게 되면 아래와 같은 장점이 있습니다.

    -
      -
    • 개발환경과 운영환경 구성 시의 차이점을 최소화 할 수 있습니다.
    • +
    • 개발환경과 운영환경의 차이점을 최소화 할 수 있습니다.
    • 다른 사람이 만든 “서버”를 쉽게 가져다 사용할 수 있습니다.
    • 서버 가용성을 확장하기 위해 컨테이너를 한 서버/다른 서버 에서 동시에 구동하여 처리할 수도 있습니다.
    -

    그리고 클라우드 컴퓨팅의 시대로 들어오며 이런 장점은 더욱 극대화 되기 시작했습니다. 기존에는 서버실 구성, 각종 배선작업 및 쿨링 시스템 구축을 거의 모든 회사가 직접 해야했으나, 원격지의 서버를 임대하여 사용할 수 있는 시스템이 등장함으로 인해 이런 컨테이너를 통한 장점이 더욱 극대화될 수 있는 환경마저 제공된 것이죠. 심지어는 이런 구성마저도 코드로 관리하여(IaC, Infrastructure as Code) 처리하는 접근법이 대두되기도 합니다.

    +
    +🤔 컨테이너 기술이 DevOps에 끼치는 영향 +
    +

    🍎 tips

    +

    글의 방향을 이해하는 데는 크게 필요없지만, 만약 더 알아보시고 싶으시다면 아래 내용도 참고해주세요.

    +

    만일 IaC 중 Terraform에 대해 관심이 있으시다면 저의 다른 연재글을 함께 살펴봐주시면 감사하겠습니다. 🙇

    +
    +

    클라우드 컴퓨팅의 시대로 들어오며 이런 장점은 더욱 극대화 되기 시작했습니다. 기존에는 서버실 구성, 각종 배선작업 및 쿨링 시스템 구축을 거의 모든 회사가 직접 해야했으나, 원격지의 서버를 임대하여 사용할 수 있는 시스템이 등장함으로 인해 이런 컨테이너를 통한 장점이 더욱 극대화될 수 있는 환경마저 제공된 것이죠. 심지어는 이런 구성마저도 코드로 관리하여(IaC, Infrastructure as Code) 처리하는 접근법이 대두되기도 합니다.

    이런 식으로 기존 개발 방식에서 개발팀(Dev)와 운영팀(Ops)의 역할 사이클을 한 번에 줄이고 보다 자주, 그리고 견고하게 배포하도록 하는 과정이 DevOps의 일부라고 할 수 있겠습니다.

    +
    +

    컨테이너에 대해

    -

    이 이상의 DevOps와 IaC에 대한 내용은 본 주제와 어긋날 수 있으니 과감히 생략하겠습니다.

    -

    만일 알아보시고 싶으시다면 제가 기존에 작성한 글타래를 살펴봐주시면 감사하겠습니다. 🙇

    +

    🍎 note

    +

    이 글 이후로 컨테이너 관련 플랫폼은 Docker(이하 도커)를 사용하도록 하겠습니다.

    -

    파이썬 컨테이너에 대해 알아봅시다

    -

    그렇다면, 파이썬 컨테이너에 대해 살펴볼까요. 컨테이너는 앞서 언급했듯 어디서든 구동될 수 있는 서버 환경을 구성할 수 있습니다.

    -

    파이썬 컨테이너 살펴보기

    -

    저희가 살펴볼 파이썬 컨테이너는 Docker Hub에서 확인할 수 있습니다. 사이트에 접속해서 어떤 내용이 있나 살펴보죠.

    -

    - - - - - - - Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags) - - - -

    Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)

    -

    +

    지금까지 컨테이너에 대한 말이 굉장히 많이 나왔는데요. 그렇다면 이건 어떻게 만들고 구동해볼 수 있을까요? 설명에 앞서 용어부터 정리해봅시다. 컨테이너 기술을 이야기할 때는 흔히 “도커 이미지”와 “도커 컨테이너”라는 용어를 사용하여 실행가능한 형태와 실제 구동중인 형태를 각각 표현합니다. “도커 이미지”에 대한 설계도는 Dockerfile 이구요.

    Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags) -

    Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)

    +

    귀여운 고래와 함께 보시죠

    -

    뭔가 되게 많군요. 숫자는 파이썬 버전같은데, - 뒤의 값은 뭔지 알아봅시다. 각각 Simple tags, Shared tags 인데요. 이 값은 아래와 같습니다.

    -
      -
    • -

      simple tags: 기재된 리눅스 혹은 윈도우즈에서만 동작을 보장하는 컨테이너 이미지임을 의미합니다. 이 값을 사용하면 해당 태그에 명시된 플랫폼(리눅스나 윈도우즈 등)의 하나의 매니페스트에 연결됩니다. 이 경우, 명확히 지정한 플랫폼의 이미지만 사용할 수 있습니다.

      -
    • -
    • -

      shared tags: 여러 운영체제(리눅스 및 다양한 윈도우즈 버전)와 아키텍처에서 동작하는 컨테이너 이미지를 나타냅니다. 이 값을 Docker Engine이 구동되는 환경(운영체제, 아키텍처 등)에 맞는 적절한 이미지를 자동으로 선택해서 pull하게 됩니다. 예를 들어, mongo:4.0 같은 shared tag를 사용하면 Docker Engine이 현재 실행 중인 호스트의 운영체제와 아키텍처에 맞는 이미지를 알아서 가져옵니다.

      -
    • -
    -

    헬로 글또!

    -

    그렇다면, shared tags를 사용해서 헬로월드를 출력하는 도커 이미지를 만들어봅시다.

    +

    도커 이미지와 Dockerfile에 대해

    +

    이미지는 애플리케이션을 실행하는데 필요한 모든 것을 포함하는 ‘불변의 템플릿’입니다. 여기엔 소스 코드, 런타임, 라이브러리, 환경 변수, 설정 파일 등이 포함됩니다. 그리고 이 이미지를 만드는 명세서가 바로 Dockerfile입니다. Dockerfile에는 이미지를 어떻게 만들지 순서대로 적어둡니다. 기준이 되는 이미지부터 우리가 원하는 내용을 추가할 수 있지요. 한번 살펴봅시다.

    +

    Dockerfile의 각 명령어는 하나의 “레이어”가 되어 이미지를 겹겹이 쌓아갑니다. 각각의 레이어는 그 명령어로 인한 파일 시스템의 변경사항을 담고 있죠. 한번 만들어진 레이어는 읽기 전용이 되어 “불변성”을 보장합니다. 이렇게 모든 레이어가 쌓이면 하나의 이미지가 완성되는 거죠.

    +

    도커 이미지를 만들기 위한 바탕을 베이스 이미지3라고 부르기도 합니다. 파이썬 베이스 이미지는 Docker Hub에서 확인하실 수 있어요. 필요한 파이썬 버전이 있다면 그에 맞는 값을 바꿔주면 됩니다. 3.12 버전이 필요하면 그 값을 입력하면 되죠. 심지어는 어떤 운영체제에서 구동되는 걸 기대하는지도 지정해줄 수 있습니다.

    +
    FROM python:3.12            # 앞서 살펴본 베이스 이미지 입니다. 여기서는 파이썬 3.12를 사용해요.
    +WORKDIR /app                # 이제부터의 명령어들이 실행될 작업 디렉터리를 지정합니다.
    +COPY hello.py .             # 현재 디렉터리의 hello.py 파일을 컨테이너의 /app 디렉터리로 복사합니다.
    +CMD ["python", "hello.py"]  # 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
    +

    만들어봅시다!

    +

    그러면 헬로월드를 출력하는 도커 이미지를 만들어봅시다. Docker Desktop을 설치하고 한번 만들어볼까요!

    1. hello.py 파일 생성:
    print("Hello, geultto!")
      -
    1. Dockerfile 생성:
    2. +
    3. Dockerfile 생성(위에서 본 내용입니다):
    FROM python:3.12
    -
     WORKDIR /app
    -
     COPY hello.py .
    -
     CMD ["python", "hello.py"]
      -
    1. 이미지 빌드 및 실행:
    2. +
    3. 이미지 빌드:
    -
    docker build -t python-hello .
    -docker run python-hello

    3을 실행시키면 아래와 같은 결과가 나옵니다.

    docker build -t python-hello .
    -[+] Building 26.1s (8/8) FINISHED                                                                                                 docker:desktop-linux
    - => [internal] load build definition from Dockerfile                                                                                              0.0s
    - => => transferring dockerfile: 151B                                                                                                              0.0s
    - => [internal] load metadata for docker.io/library/python:3.12                                                                                    2.7s
    - => [internal] load .dockerignore                                                                                                                 0.0s
    - => => transferring context: 2B                                                                                                                   0.0s
    - => [1/3] FROM docker.io/library/python:3.12@sha256:05855f5bf06f5a004b0c1a8aaac73a9d9ea54390fc289d3e80ef52c4f90d5585                             22.7s
    +[+] Building 26.1s (8/8) FINISHED                           docker:desktop-linux
    + => [internal] load build definition from Dockerfile                        0.0s
    + => => transferring dockerfile: 151B                                        0.0s
    + => [internal] load metadata for docker.io/library/python:3                 2.7s
    + => [internal] load .dockerignore                                           0.0s
    + => => transferring context: 2B                                             0.0s
    + => [1/3] FROM docker.io/library/python:3.12@sha256:<생략>                 22.7s
      (생략)
    - => => extracting sha256:3795519dea7759f67ddca8240187a3dd44b924bf57de62a5a77ac2226c7b9d43                                                         0.0s
    - => [internal] load build context                                                                                                                 0.0s
    - => => transferring context: 98B                                                                                                                  0.0s
    - => [2/3] WORKDIR /app                                                                                                                            0.5s
    - => [3/3] COPY hello.py .                                                                                                                         0.0s
    - => exporting to image                                                                                                                            0.1s
    - => => exporting layers                                                                                                                           0.0s
    + => => extracting sha256:<생략>
    + => [internal] load build context                                           0.0s
    + => => transferring context: 98B                                            0.0s
    + => [2/3] WORKDIR /app                                                      0.5s
    + => [3/3] COPY hello.py .                                                   0.0s
    + => exporting to image                                                      0.1s
    + => => exporting layers                                                     0.0s
      (생략)
    - => => naming to docker.io/library/python-hello:latest                                                                                            0.0s
    - => => unpacking to docker.io/library/python-hello:latest                                                                                         0.0s
    + => => naming to docker.io/library/python-hello:latest                      0.0s
    + => => unpacking to docker.io/library/python-hello:latest                   0.0s
     
     What's next:
    -    View a summary of image vulnerabilities and recommendations → docker scout quickview
    -
    -$ docker run python-hello
    -Hello, geultto!
    + View a summary of image vulnerabilities and recommendations → docker scout quickview

    축하합니다. 당신은 첫 파이썬 컨테이너를 빌드했습니다! 🎉🎉

    -

    이제 빌드한 이미지의 크기를 확인해봅시다.

    +

    도커 컨테이너?

    +

    그렇다면 도커 컨테이너는 무엇일까요? 바로 도커 이미지를 실행한 프로세스를 말합니다. 이 프로세스는:

    +
      +
    • 격리된 프로세스 공간 확보
    • +
    • 호스트로부터 컨테이너 자신만의 독립된 파일시스템을 확보
    • +
    • 컨테이너 만의 네트워크 환경을 개별적으로 확보
    • +
    • 심지어 실행 권한도 별도로 부여받을 수 있습니다!
    • +
    +

    이런 특성들 덕분에:

    +
      +
    • 어떤 환경에서도 동일하게 실행됩니다 +
        +
      • 내 컴퓨터에서 잘 돌던 게 서버에서도 그대로!
      • +
      +
    • +
    • 다른 프로세스와 충돌 없이 실행됩니다 +
        +
      • Python 2.7과 3.8이 필요한 프로그램들도 걱정 없이!
      • +
      +
    • +
    • 문제가 생겨도 다른 프로그램에 영향을 주지 않습니다 +
        +
      • 하나의 컨테이너가 문제가 생겨도 다른 건 멀쩡해요
      • +
      +
    • +
    +

    그러면 컨테이너를 한번 실행해볼까요?

    +
    $ docker run python-hello
    +Hello, geultto!
    +

    컨테이너 실행 완료! 이제 더 이상 환경에 구애받지 않는 실행환경이 만들어졌어요! 🎉🎉

    +

    그런데?

    +

    성공적으로 실행했으니 이제 빌드한 이미지의 크기를 확인해봅시다.

    $ docker images python-hello
     REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
     python-hello   latest    746136719e90   3 minutes ago   1.46GB
    @@ -330,7 +263,7 @@

  • 운영체제 레이어와 각종 의존성
      -
    • 기본 OS 파일 시스템, 유틸리티 등이 함께 포함될 수 있기 때문입니다. 저희는 shared tags를 썼으니까요.
    • +
    • 기본 OS 파일 시스템, 유틸리티 등이 함께 포함될 수 있기 때문입니다.
  • 그런데 여기서 애플리케이션 코드 및 데이터가 들어가면? @@ -369,12 +302,14 @@

  • -

    그렇다면 다음 글에서는 컨테이너 크기를 줄이기 위한 방안을 살펴보고, 파이썬 컨테이너 이미지의 특징을 살펴보도록 하겠습니다.

    +

    끝으로

    +

    그렇다면 다음 글에서는 파이썬 컨테이너 이미지 크기를 줄이기 위한 여러 방안을 살펴보고, 파이썬 컨테이너 이미지 빌드가 가지는 특징을 살펴보도록 하겠습니다.

    긴 글 읽어주셔서 감사합니다.


    1. 자세한 내용은 이 링크를, 관련 출처는 이 링크에서 확인할 수 있습니다.
    2. https://www.44bits.io/ko/post/why-should-i-use-docker-container#운영하면서-만들어지는-눈송이-서버들snowflake-servers
    3. +
    4. 모든 이미지의 베이스 이미지도 있습니다. 참고 링크
    -

    Published Oct 13, 2024

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 13, 2024

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/python/2024-10-26-python-container-101-pt02/index.html b/devlog/python/2024-10-26-python-container-101-pt02/index.html new file mode 100644 index 00000000..819aab10 --- /dev/null +++ b/devlog/python/2024-10-26-python-container-101-pt02/index.html @@ -0,0 +1,616 @@ +[연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화 - 팔공산 창고
    All Articles

    [연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화

    이번 게시글에서는 컨테이너 크기를 줄이기 위한 방안을 살펴보고, 파이썬 컨테이너 이미지 빌드가 가지는 특징을 살펴보도록 하겠습니다.

    +

    빌드 최적화를 해봅시다

    +

    지난 글에서 빌드된 이미지의 크기를 다시 살펴볼까요?

    +
    $ docker images python-hello
    +REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
    +python-hello   latest    746136719e90   3 minutes ago   1.46GB
    +

    1.46GB인 데는 분명 이유가 있을 겁니다. 그러면 latest 라는 태그가 무엇을 의미하는지부터 살펴볼까요?

    +

    잠시만, 왜 이렇게 크지?

    +

    Docker Hub으로 다시 들어가봐서, 어떤 컨테이너가 있나 살펴봅시다.

    +

    뭔가 되게 많군요. 숫자는 파이썬 버전같은데, - 뒤의 값은 뭔지 알아봅시다.

    +

    + + + + + + + Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags) + + + +

    Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)

    +

    +

    + + + + + + + Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (shared tags) + + + +

    Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (shared tags)

    +

    +

    이 값들은 각각 Simple tags, Shared tags 인데요. 이 값은 아래와 같습니다.

    +
      +
    • +

      simple tags: 태그로 기재된 리눅스 배포판 혹은 윈도우즈에서만 동작을 보장하는 컨테이너 이미지 입니다. 이 값을 사용하면 해당 태그에 명시된 플랫폼(리눅스나 윈도우즈 등)의 하나의 이미지 정보(이미지의 구성 정보, 레이어 정보, 실행 환경 등을 담은 매니페스트)에 연결됩니다. 이 경우, 명확히 지정한 플랫폼의 이미지만 사용할 수 있습니다.

      +
    • +
    • +

      shared tags: 여러 운영체제(리눅스 및 다양한 윈도우즈 버전)와 아키텍처에서 동작하는 컨테이너 이미지를 나타냅니다. 이 값을 Docker Engine이 구동되는 환경(운영체제, 아키텍처 등)에 맞는 적절한 이미지를 자동으로 선택해서 pull하게 됩니다. 예를 들어, mongo:4.0 같은 shared tag를 사용하면 Docker Engine이 현재 실행 중인 호스트의 운영체제와 아키텍처에 맞는 이미지를 알아서 가져옵니다.

      +
    • +
    +
    +🤔 도커의 매니페스트란? +

    도커 매니페스트는 컨테이너 이미지에 대한 상세 정보를 담고 있는 메타데이터입니다. 여기에는:

    +
      +
    • 이미지가 실행될 수 있는 운영체제와 아키텍처
    • +
    • 이미지를 구성하는 레이어들의 정보
    • +
    • 이미지의 설정값 (환경 변수, 실행 명령어 등)
    • +
    +

    등이 포함됩니다. 도커는 이 매니페스트를 읽어 해당 이미지가 현재 환경에서 실행 가능한지, 어떤 레이어들이 필요한지 등을 파악합니다.

    +
    +

    그럼 어떻게 하죠?

    +

    도커 이미지 크기를 줄이기 위해서는 아래와 같은 과정을 처리할 수 있습니다.

    +
      +
    • 가능하면 가벼운 베이스 이미지를 선택할 것
    • +
    • 멀티-스테이지를 사용해서, 빌드-런타임 환경을 분리할 것
    • +
    • 다양한 최적화 방안을 고려해보기 +
        +
      • .dockerignore 파일 작성
      • +
      • RUN 레이어 최적화
      • +
      • 나에게 맞는 패키지1/파일을 취사선택하기
      • +
      +
    • +
    +

    step 1. simple tag를 골라봅시다

    +

    앞서 말씀드린 latest 는 shared tags 입니다. 구동하려는 호스트에 맞게 구동될 수는 있지만, 최적화는 다른 문제죠. 이럴 땐 최소한의 내용만을 컨테이너를 통한 배포를 수행할 때는 최소한의 내용만 맞추고 배포하는 것이 보다 나은 접근입니다.

    +

    대표적인 베이스 이미지는 Debian linux 기반의 slimAlpine linux 기반의 alpine이 있습니다.

    +
      +
    • slim 이미지는, +
        +
      • Debian linux의 최소화 버전이며
      • +
      • 필수적인 시스템 라이브러리를 갖추고 있습니다
      • +
      • C 라이브러리 구현체로 glibc 를 사용합니다. 이는 거의 대부분의 라이브러리와 호환됩니다.
      • +
      +
    • +
    • alpine 이미지는, +
        +
      • Alpine linux에 대한 최소한의 버전이며
      • +
      • 필수적인 시스템 라이브러리로 busybox 를 이용합니다
      • +
      • C 라이브러리 구현체로 musl libc를 사용합니다. 경량버전의 라이브러리를 추구하는 것이 목표이므로, 일부 라이브러리와 호환되지 않을 수도 있습니다.
      • +
      +
    • +
    +

    그러면 이 둘을 사용해서 각각 빌드해볼까요?

    +
    +👨‍💻 `slim` 빌드를 해봅시다. +
      +
    1. Dockerfile 을 제작합니다.
    2. +
    +
    FROM python:3.12-slim       # slim은 Debian slim 이미지를 의미합니다.
    +WORKDIR /app
    +COPY hello.py .
    +CMD ["python", "hello.py"]
    +
      +
    1. 빌드를 동일하게 해보고,
    2. +
    +
    ocker build -t python-hello:slim .
    +
      +
    1. 사이즈를 확인해볼까요?
    2. +
    +
    docker images
    +REPOSITORY          TAG            IMAGE ID       CREATED         SIZE
    +python-hello        slim           2f648897463c   5 seconds ago   212MB
    +python-hello        latest         746136719e90   12 days ago     1.46GB
    +
    +
    +👨‍💻 `alpine` 빌드를 해봅시다. +
      +
    1. Dockerfile 을 제작합니다.
    2. +
    +
    FROM python:3.12-alpine       # alpine은 Alpine 이미지를 의미합니다.
    +WORKDIR /app
    +COPY hello.py .
    +CMD ["python", "hello.py"]
    +
      +
    1. 빌드를 동일하게 해보고,
    2. +
    +
    ocker build -t python-hello:alpine .
    +
      +
    1. 사이즈를 확인해볼까요?
    2. +
    +
    docker images
    +REPOSITORY          TAG            IMAGE ID       CREATED         SIZE
    +python-hello        slim           2f648897463c   5 seconds ago   212MB
    +python-hello        alpine         37a9f605a036   3 minutes ago   78.4MB
    +python-hello        latest         746136719e90   12 days ago     1.46GB
    +
    +

    step 2. 멀티-스테이지 사용해보기

    +

    멀티-스테이지는 하나의 Dockerfile에서 다양한 스테이지로 나누어서 레이어를 쌓는 개념을 의미합니다. 그렇다면 어떤 스테이지가 있는지 살펴볼까요?

    +
      +
    • 빌드 스테이지 +
        +
      • 빌드 도구에 필요한 내용만을 포함합니다
      • +
      • 빌드 결과를 저장합니다
      • +
      +
    • +
    • 런타임 스테이지 +
        +
      • 직전 phase에서 저장한 파일들을 복사합니다.
      • +
      • 빌드 후의 내용을 구동할 최소한의 파일만을 설치합니다
      • +
      • 본 내용에서는 런타임 스테이지를 run stage, service stage 둘로 나눕니다. +
          +
        • 이는 각각 실행환경 구성, 앱 실행환경 구성을 의미합니다.
        • +
        +
      • +
      +
    • +
    +

    그렇다면 멀티-스테이지로 빌드를 수행해볼까요?

    +

    이번 예시부터는 이 GitHub repo를 사용해보겠습니다.

    +

    멀티-스테이지가 없다면?

    +

    그렇다면, 멀티-스테이지 없이 헬로글또를 찍어볼까요?

    +
    FROM python:3.12-slim
    +
    +ARG POETRY_VERSION=1.6.1
    +ARG APPLICATION_SERVER_PORT=8000
    +
    +ENV PIP_NO_CACHE_DIR=off \
    +    PIP_DISABLE_PIP_VERSION_CHECK=on \
    +    PIP_DEFAULT_TIMEOUT=100 \
    +    POETRY_VERSION=${POETRY_VERSION} \
    +    POETRY_HOME="/opt/poetry" \
    +    PYTHONUNBUFFERED=1 \
    +    PYTHONDONTWRITEBYTECODE=1 \
    +    PYTHONPATH=/application_root \
    +    POETRY_VIRTUALENVS_IN_PROJECT=true \
    +    POETRY_CACHE_DIR="/application_root/.cache" \
    +    VIRTUAL_ENVIRONMENT_PATH="/application_root/.venv" \
    +    APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT \
    +    PATH="/opt/poetry/bin:$PATH"
    +
    +# 빌드 도구 설치
    +RUN apt-get update \
    +    && apt-get install --no-install-recommends -y \
    +        build-essential
    +
    +# Poetry 설치
    +RUN python -m venv ${POETRY_HOME}
    +RUN ${POETRY_HOME}/bin/pip install -U pip setuptools
    +RUN ${POETRY_HOME}/bin/pip install "poetry==${POETRY_VERSION}"
    +
    +# 사용자 생성
    +RUN groupadd -g 1001 python_application && \
    +    useradd -r -u 1001 -g python_application python_application
    +
    +WORKDIR ${PYTHONPATH}
    +COPY . ${PYTHONPATH}
    +RUN chown python_application:python_application ${PYTHONPATH}
    +
    +RUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR}
    +
    +EXPOSE ${APPLICATION_SERVER_PORT}
    +
    +COPY ./docker/dev/entrypoint /entrypoint
    +RUN sed -i 's/\r$//g' /entrypoint
    +RUN chmod +x /entrypoint
    +
    +USER 1001
    +
    +RUN poetry install --without dev
    +
    +ENTRYPOINT ["/entrypoint"]
    +

    이걸로 만든 이미지의 크기를 살펴봅시다.

    +
    docker images
    +REPOSITORY          TAG                  IMAGE ID       CREATED          SIZE
    +python-hello        slim-without-multi   f4be58bb8080   38 seconds ago   700MB
    +

    멀티-스테이지가 있다면?

    +

    반대로 멀티-스테이지를 추가해서 헬로글또를 찍어봅시다.

    +
      +
    1. 빌드 스테이지
    2. +
    +

    빌드 스테이지는 실제 필요한 내용들만을 설치합니다.

    +
    ### ### ### ### ### ### ###
    +# STAGE 0. Prerequisites  #
    +### ### ### ### ### ### ###
    +ARG OFFICIAL_PYTHON_IMAGE=3.12
    +
    +FROM python:${OFFICIAL_PYTHON_IMAGE}-slim AS build-stage        # debian slim 이미지를 빌드 스테이지로 설정합시다.
    +ARG POETRY_VERSION=1.6.1                                        # 패키지 매니저로 poetry v1.6.1를 씁니다.
    +
    +ENV PIP_NO_CACHE_DIR=off \                                      # 최적화 옵션입니다. 자세한 것은 위의 GitHub 링크를 확인해주세요!
    +    PIP_DISABLE_PIP_VERSION_CHECK=on \
    +    PIP_DEFAULT_TIMEOUT=100 \
    +    POETRY_VERSION=${POETRY_VERSION} \
    +    POETRY_HOME="/opt/poetry"
    +
    +RUN apt-get update \
    +    && apt-get install --no-install-recommends -y build-essential \   # 빌드에 필요한 핵심 내용들만 설치합니다.
    +    && rm -rf /var/lib/apt/lists/*
    +
    +# https://python-poetry.org/docs/#installing-manually
    +RUN python -m venv ${POETRY_HOME}                               # 가상환경을 구성하고, poetry를 설치합니다.
    +RUN ${POETRY_HOME}/bin/pip install -U pip setuptools
    +RUN ${POETRY_HOME}/bin/pip install "poetry==${POETRY_VERSION}"
    +
      +
    1. Run 스테이지
    2. +
    +
      +
    • 실행환경을 구성하는 중간단계 입니다.
    • +
    • 필요한 부분만을 복사하고, 빌드도구를 제외합니다.
    • +
    +
    ### ### ### ### ###
    +# STAGE 1. 'run'  #
    +### ### ### ### ###
    +FROM python:${OFFICIAL_PYTHON_IMAGE}-slim AS run-stage
    +
    +ENV PATH="/opt/poetry/bin:$PATH"                    # 환경변수를 추가하여, poetry를 쓸 수 있게 구성합니다.
    +
    +COPY --from=build-stage /opt/poetry /opt/poetry/    # build-stage에서 필요한 내용만 가져옵니다.
    +
      +
    1. Service 스테이지
    2. +
    +
      +
    • 실제 애플리케이션이 구동될 환경을 구성합니다.
    • +
    • 보안설정, 런타임에 필요한 의존성을 구성하고 서비스를 구동합니다.
    • +
    • 구동 전 entrypoint 파일을 별도로 두고 이 파일을 entrypoint 로 구성합니다.
    • +
    +
    ### ### ### ### ### ###
    +# STAGE 2. 'service'  #
    +### ### ### ### ### ###
    +FROM run-stage AS service-stage
    +
    +ARG APPLICATION_SERVER_PORT=8000
    +
    +    # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED
    +ENV PYTHONUNBUFFERED=1 \
    +    # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE
    +    PYTHONDONTWRITEBYTECODE=1 \
    +    PYTHONPATH=/application_root \
    +    # https://python-poetry.org/docs/configuration/#virtualenvsin-project
    +    POETRY_VIRTUALENVS_IN_PROJECT=true \
    +    POETRY_CACHE_DIR="/application_root/.cache" \
    +    VIRTUAL_ENVIRONMENT_PATH="/application_root/.venv" \
    +    APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT
    +
    +# 가상환경이 먼저 실행될 수 있도록 PATH의 앞에 추가
    +# https://docs.python.org/3/library/venv.html#how-venvs-work
    +ENV PATH="$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH"
    +
    +# 권한분리를 위해 처리
    +RUN groupadd -g 1001 python_application && \
    +    useradd -r -u 1001 -g python_application python_application
    +
    +# WORKDIR를 애플리케이션 루트 디렉터리로 지정
    +# https://www.uvicorn.org/settings/#development
    +# https://docs.docker.com/engine/reference/builder/#workdir
    +WORKDIR ${PYTHONPATH}
    +COPY . ${PYTHONPATH}
    +RUN chown python_application:python_application ${PYTHONPATH}
    +
    +# poetry 캐시 디렉터리를 만들고, 권한을 부여함. 링크 참조
    +# https://python-poetry.org/docs/configuration/#cache-directory
    +RUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR}
    +
    +# API 엔드포인트에 대해 문서화를 수행
    +# https://docs.docker.com/engine/reference/builder/#expose
    +EXPOSE ${APPLICATION_SERVER_PORT}
    +
    +# ENTRYPOINT로 사용할 파일에 대해 복사 후 내용 구성
    +COPY ./docker/dev/entrypoint /entrypoint
    +RUN sed -i 's/\r$//g' /entrypoint
    +RUN chmod +x /entrypoint
    +
    +# 컨테이너 구동 시에 부여하는 권한을 명시함
    +USER 1001
    +
    +# poetry를 이용하여 의존성 설치
    +RUN poetry install --without dev
    +
    +# Entrypoint 로 추가한 파일을 사용.
    +# https://www.docker.com/blog/docker-best-practices-choosing-between-run-cmd-and-entrypoint/
    +ENTRYPOINT ["/entrypoint"]
    +

    이렇게 되면 용량은 얼마나 줄어들까요?

    +
    docker images
    +REPOSITORY          TAG            IMAGE ID       CREATED          SIZE
    +python-hello        slim-multi     4f8e4848dc55   27 minutes ago   324MB
    +

    절반이나 줄어들었군요!

    +

    step 2. 빌드 타임을 줄여봅시다

    +

    멀티-스테이지는 빌드타임이 얼마나 걸리는지 살펴볼까요? 이번에는 외부 패키지를 추가로 설치해서 테스트 해봅시다. +설치 대상은 pandasmatplotlib 입니다.

    +
    docker build -t python-hello:slim-multi-2 --no-cache .
    +[+] Building 45.6s (20/20) FINISHED                                                                                                    docker:desktop-linux
    + => [internal] load build definition from Dockerfile                                                                                                   0.0s
    + => => transferring dockerfile: 3.53kB                                                                                                                 0.0s
    + => [internal] load metadata for docker.io/library/python:3.12-slim                                                                                    2.6s
    + => [internal] load .dockerignore                                                                                                                      0.0s
    + => => transferring context: 2B                                                                                                                        0.0s
    + => [internal] load build context                                                                                                                      0.0s
    + => => transferring context: 87.08kB                                                                                                                   0.0s
    + => [build-stage 1/5] FROM docker.io/library/python:3.12-slim@sha256:032c52613401895aa3d418a4c563d2d05f993bc3ecc065c8f4e2280978acd249                  5.6s
    +(생략)
    + => [build-stage 2/5] RUN apt-get update     && apt-get install --no-install-recommends -y build-essential     && rm -rf /var/lib/apt/lists/*          12.4s
    + => [build-stage 3/5] RUN python -m venv /opt/poetry                                                                                                   1.9s 
    + => [build-stage 4/5] RUN /opt/poetry/bin/pip install -U pip setuptools                                                                                1.1s 
    + => [build-stage 5/5] RUN /opt/poetry/bin/pip install "poetry==1.6.1"                                                                                  5.1s 
    + => [run-stage 2/2] COPY --from=build-stage /opt/poetry /opt/poetry/                                                                                   0.2s
    + => [service-stage 1/9] RUN groupadd -g 1001 python_application &&     useradd -r -u 1001 -g python_application python_application                     0.2s
    + => [service-stage 2/9] WORKDIR /application_root                                                                                                      0.0s
    + => [service-stage 3/9] COPY . /application_root                                                                                                       0.0s
    + => [service-stage 4/9] RUN chown python_application:python_application /application_root                                                              0.1s
    + => [service-stage 5/9] RUN mkdir /application_root/.cache && chown python_application:python_application /application_root/.cache                     0.1s
    + => [service-stage 6/9] COPY entrypoint /entrypoint                                                                                                    0.0s
    + => [service-stage 7/9] RUN sed -i 's/\r$//g' /entrypoint                                                                                              0.1s
    + => [service-stage 8/9] RUN chmod +x /entrypoint                                                                                                       0.1s
    + => [service-stage 9/9] RUN poetry install --without dev                                                                                               7.4s
    + => exporting to image                                                                                                                                 8.3s
    + => => exporting layers                                                                                                                                6.5s
    + => => exporting manifest sha256:2e1a026e67ea60a968a576838692cc7661011085b146d3b94bff86e21c10fedd                                                      0.0s
    + => => exporting config sha256:f7b5913e1edb9f4566cd1bf1c1f32e0baa757f9fae90fea096917d7241a0fd6d                                                        0.0s
    + => => exporting attestation manifest sha256:6482e53034c92e947f0c26372d5a0fc24e24d510ec9a4a5c5ff6901310ef5263                                          0.0s
    + => => exporting manifest list sha256:a23299c55409341354951e7931f8bf1f38137fd21391853773255b17062c1c0f                                                 0.0s
    + => => naming to docker.io/library/python-hello:slim-multi-2                                                                                           0.0s
    + => => unpacking to docker.io/library/python-hello:slim-multi-2                                                                                        1.8s
    +

    그렇다면, alpine 베이스 이미지로 빌드를 수행해봅시다.

    +
    docker build -t python-hello:alpine-multi-2 --no-cache .
    +[+] Building 90.4s (21/21) FINISHED                                                                                                     docker:desktop-linux
    + => [internal] load build definition from Dockerfile                                                                                                    0.0s
    + => => transferring dockerfile: 2.18kB                                                                                                                  0.0s
    + => [internal] load metadata for docker.io/library/python:3.12-alpine                                                                                   1.4s
    + => [internal] load .dockerignore                                                                                                                       0.0s
    + => => transferring context: 2B                                                                                                                         0.0s
    + => [internal] load build context                                                                                                                       0.0s
    + => => transferring context: 85.72kB                                                                                                                    0.0s
    + => [build-stage 1/5] FROM docker.io/library/python:3.12-alpine@sha256:38e179a0f0436c97ecc76bcd378d7293ab3ee79e4b8c440fdc7113670cb6e204                 2.3s
    +(생략)
    + => [build-stage 2/5] RUN apk add --no-cache     gcc     python3-dev                                                                                   12.1s
    + => [build-stage 3/5] RUN python -m venv /opt/poetry                                                                                                    2.2s 
    + => [build-stage 4/5] RUN /opt/poetry/bin/pip install -U pip setuptools                                                                                 1.3s 
    + => [build-stage 5/5] RUN /opt/poetry/bin/pip install "poetry==1.6.1"                                                                                   5.7s 
    + => [run-stage 2/2] COPY --from=build-stage /opt/poetry /opt/poetry/                                                                                    0.2s
    + => [service-stage  1/10] RUN addgroup -g 1001 -S python_application &&     adduser -S -u 1001 -G python_application python_application                 0.1s
    + => [service-stage  2/10] WORKDIR /application_root                                                                                                     0.0s
    + => [service-stage  3/10] COPY . /application_root                                                                                                      0.0s
    + => [service-stage  4/10] RUN chown python_application:python_application /application_root                                                             0.1s
    + => [service-stage  5/10] RUN mkdir /application_root/.cache && chown python_application:python_application /application_root/.cache                    0.2s
    + => [service-stage  6/10] COPY entrypoint /entrypoint                                                                                                   0.0s
    + => [service-stage  7/10] RUN sed -i 's/\r$//' /entrypoint                                                                                              0.2s
    + => [service-stage  8/10] RUN chmod +x /entrypoint                                                                                                      0.1s
    + => [service-stage  9/10] RUN apk add --no-cache     g++     openssl                                                                                    8.2s
    + => [service-stage 10/10] RUN poetry install --without dev                                                                                             44.2s
    + => exporting to image                                                                                                                                 11.8s```
    + => => exporting layers                                                                                                                                 9.2s
    + => => exporting manifest sha256:6b7bcd80340bf252c06947fde85a4fb53012c3d8bb07ff6dfd3a8b6fe6d1022c                                                       0.0s
    + => => exporting config sha256:58c4058d992779af8b0e3aa67ceabd655d234d871e38af0e6996155a56ed953e                                                         0.0s
    + => => exporting attestation manifest sha256:e88ed3098ce10fbce9ed2452c82ada1f5ccccb7c9d094b6f2da495754249db26                                           0.0s
    + => => exporting manifest list sha256:b0b8cc043f1436abf29e9b45bcbcf618d0838de9d1678086c9b2b5acc1541e9b                                                  0.0s
    + => => naming to docker.io/library/python-hello:alpine-multi-2                                                                                          0.0s
    + => => unpacking to docker.io/library/python-hello:alpine-multi-2                                                                                       2.6s
    +

    빌드 시간과 크기에 대해 한번 살펴보죠.

    +
    docker images
    +REPOSITORY     TAG              IMAGE ID       CREATED         SIZE
    +python-hello   alpine-multi-2   b0b8cc043f14   2 minutes ago   1.13GB
    +python-hello   slim-multi-2     a23299c55409   3 minutes ago   755MB
    + + + + + + + + + + + + + + + + + + + + +
    베이스이미지빌드된 이미지 크기소요시간(단위: 초)
    debian slim755 MB45.6
    alpine1.13 GB90.4
    +
      +
    • debian 베이스 이미지는 용량, 소요시간 측면 모두에서 안정적이었습니다.
    • +
    • alpine 베이스 이미지는 빌드시간 자체도 늦고, 크기도 커졌습니다.
    • +
    +

    그렇다면 alpine 베이스 이미지는 사용할 수 없는 걸까요? 왜 그런건지 알아보기에 앞서, 앞서 알아봅시다.

    +

    C 라이브러리 구현체와 빌드의 차이

    +

    그렇다면 앞서 alpine linux 배포판과 debian 배포판의 차이를 알아봅시다. 이 글에서 살펴볼 둘의 주요 차이점은 C 라이브러리 구현체의 선택입니다. 각각의 특징을 살펴보겠습니다:

    +

    glibc (Debian 계열)

    +
      +
    • 리눅스 생태계의 사실상 표준 구현체입니다
    • +
    • 대부분의 파이썬 패키지가 glibc 기준으로 빌드되어있으니, 안정성과 호환성이 검증되어 있습니다.
    • +
    • 그런 이유로 베이스 이미지 크기가 상대적으로 큽니다
    • +
    +

    musl (Alpine Linux)

    +
      +
    • 경량화된 C 라이브러리 구현체입니다
    • +
    • 단순한 구현으로 보안 공격 표면이 작습니다
    • +
    • 베이스 이미지 크기가 매우 작습니다 (Debian 대비 약 1/20)
    • +
    • 일부 바이너리와 호환성 이슈가 발생할 수 있습니다
    • +
    +

    Python Wheels의 발전과 Alpine Linux 지원

    +

    과거에는 Alpine Linux에서 많은 파이썬 패키지를 설치할 때 소스로부터 직접 빌드해야 했고, 이는 컨테이너 빌드 시간을 길어지게 하는 주요 요소였습니다. 하지만 Python 패키징 생태계의 발전으로 상황이 크게 개선되었습니다.

    +

    Python 패키징의 발전 과정

    +

    다양한 배포판에서 파이썬 패키지를 바로 설치할 수 있도록 하기 위해, 아래와 같은 PEP가 지속적으로 제안되어 왔고 또 받아들여졌습니다.

    +
      +
    1. PEP 513 (manylinux1): 최초의 호환성 있는 Linux wheel 표준 도입
    2. +
    3. PEP 571 (manylinux2010): glibc 2.12 기반 호환성 확장
    4. +
    5. PEP 599 (manylinux2014): 더 새로운 시스템 라이브러리 지원
    6. +
    7. PEP 600 (Future manylinux): 향후 확장성을 고려한 태그 체계 도입
    8. +
    9. PEP 656 (musllinux): Alpine Linux 등 musl 기반 배포판 공식 지원
    10. +
    +

    PEP 656이 accept 되며, musl 기반의 빌드가 이루어진 파이썬 패키지도 직접 다운로드 받게 되어, 이를 지원하고 빌드한 라이브러리라면 누구나 쓸 수 있게 되었습니다.

    +

    manylinux?

    +

    manylinux는 “Python wheels that work on any linux (almost).” 라는 목표를 가지고 다양한 배포판을 타겟으로 빌드하기 위해 시작된 프로젝트 입니다. 원하는 리눅스 배포판에서 라이브러리를 빌드없이 직접 다운로드 받아 쓸 수 있도록 규약을 잡기 시작한 것이라고 이해할 수 있지요(manylinux 링크에서 발췌하였습니다).

    +
    manylinux
    +---
    +
    +Older archives: https://groups.google.com/forum/#!forum/manylinux-discuss
    +
    +The goal of the manylinux project is to provide a convenient way to distribute binary Python extensions as wheels on Linux. This effort has produced PEP 513 (manylinux1), PEP 571 (manylinux2010), PEP 599 (manylinux2014), PEP 600 (manylinux_x_y) and PEP 656 (musllinux_x_y).
    +

    PEP 656의 의의

    +

    Alpine linux와 관련해서는 PEP 656(Platform Tag for Linux Distributions Using Musl)은 위 PEP의 연장선상이라 할 수 있지요. 이 표준이 받아들여지면서, musl 기반의 빌드된 wheel을 배포자가 업데이트 하면 사용자가 즉시 설치할 수 있게 된 것입니다. 이로 인해 alpine linux 기반의 베이스 이미지를 선택해도 빌드 시간 단축 및 의존성 문제를 해결할 수 있게 된 겁니다.

    +

    이로인해 Alpine 베이스 파이썬 컨테이너를 선택하더라도 빌드 시간 단축과 이미지 크기 최적화의 이점을 누릴 수 있게 되었습니다. 특히 PEP 656 도입 이후에는 많은 패키지가 musllinux wheel을 제공하고 있고, 코어 로직이 Rust로 짜여진 파이썬 패키지들은 크로스플랫폼을 쉽게 지원하기 때문에 이런 부분에서도 선택에 제약이 크게 없습니다.

    +

    마지막으로

    +

    그렇지만 여전히 의문입니다. 그러면 언제, 어떤 시기에 적절한 베이스 이미지를 선택하면 될까요? 무턱대고 고르기에는 아무래도 의심이 듭니다. 간단하게나마 있을법한 일을 검증해보고 적절한지 예시 데이터를 보면 더욱 안심이겠죠. 그래서 다음장에는 아래의 상황에서 어떤 베이스 이미지가 좋은지 함께 살펴볼 예정입니다.

    +
      +
    • I/O bound 태스크 중심: API 서비스를 만들고, DB에는 1억개의 데이터을 추가한 후, 쿼리 테스트 및 부하 테스트를 수행하여 성능을 리포트
    • +
    • CPU bound 태스크 중심: 매우 큰 데이터를 pandas로 처리, matplotlib으로 연산하게 구성해보고 성능을 리포트
    • +
    +

    긴 글 읽어주셔서 감사합니다.

    +
    +
    +
      +
    1. 패키지(이 글에서는 파이썬 패키지를 의미)는 pip 등으로 설치할 수 있는 외부 모듈의 모음을 의미합니다. 쉽게 말하자면 파이썬 라이브러리라고 할 수 있지요.
    2. +
    +

    Published Oct 26, 2024

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01/index.html b/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01/index.html index 30565c35..8054095c 100644 --- a/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01/index.html +++ b/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01/index.html @@ -268,4 +268,4 @@

    이것으로 제 1장을 마칩니다. 긴 글 읽어주셔서 감사합니다.


    -

    [1]: “작성된 코드에 대한 환경을 배포한다” 로 이해하면 쉽습니다. 적절한 권한을 가진 유저가 인프라 구성 명령을 내려서 실제 인프라 구성을 수행하는 것이지요.

    Published Oct 20, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    [1]: “작성된 코드에 대한 환경을 배포한다” 로 이해하면 쉽습니다. 적절한 권한을 가진 유저가 인프라 구성 명령을 내려서 실제 인프라 구성을 수행하는 것이지요.

    Published Oct 20, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02/index.html b/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02/index.html index 10a0bed7..6fcd8f6e 100644 --- a/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02/index.html +++ b/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02/index.html @@ -254,4 +254,4 @@

  • 데이터 소스 블록에 대해 배웠습니다.
  • -

    이것으로 제 2장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Oct 27, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 2장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Oct 27, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03/index.html b/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03/index.html index 7fd8d8ca..927cb794 100644 --- a/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03/index.html +++ b/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03/index.html @@ -442,4 +442,4 @@

    -

    이것으로 제 3장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 3, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 3장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 3, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04/index.html b/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04/index.html index 384443f8..7184bd70 100644 --- a/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04/index.html +++ b/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04/index.html @@ -240,4 +240,4 @@

    모듈 사용법을 읽고, 반복되는 내용을 어떻게 효과적으로 제어하는지 알아볼 수 있습니다.
  • 특히 주요 주의사항과 모듈 버전관리 전략에 대해 읽고, 모듈 사용시 의도치 않은 실수를 하지 않도록 대비할 수 있습니다.
  • -

    이것으로 제 4장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 4장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1/index.html b/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1/index.html index c401d367..45c5d70e 100644 --- a/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1/index.html +++ b/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1/index.html @@ -709,4 +709,4 @@

    조건문의 사용방법과 주의사항에 대해 배웠습니다.

    -

    이것으로 제 5장, 반복문 설명을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 16, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 5장, 반복문 설명을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 16, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2/index.html b/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2/index.html index 9e653f88..9dd9cd81 100644 --- a/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2/index.html +++ b/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2/index.html @@ -361,4 +361,4 @@

    조건문의 사용방법과 주의사항에 대해 배웠습니다.

    -

    이것으로 제 5장, 조건문 설명을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 19, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 5장, 조건문 설명을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 19, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06/index.html b/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06/index.html index 776382a2..f274a532 100644 --- a/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06/index.html +++ b/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06/index.html @@ -456,4 +456,4 @@

    암호 관리 도구들은 어떤 목적을 가지고 있으며, 어떤 내용들이 있는지 살펴보았습니다.
  • 암호관리는 목적에 맞게 처리하는 것이 중요합니다.
  • -

    이것으로 제 6장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 27, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 6장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Nov 27, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07/index.html b/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07/index.html index 21b14280..4d17decf 100644 --- a/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07/index.html +++ b/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07/index.html @@ -482,4 +482,4 @@

    향후 자신의 프로젝트나, 회사의 인프라 관리 코드들을 보고 이해할 수 있게 되었습니다.
  • 향후 나올 8장의 내용 이해 및 실제 프로덕션 레벨에서의 일부를 가정하여, 학습할 수 있게 되었습니다.
  • -

    이것으로 제 7장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Dec 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 7장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Dec 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08/index.html b/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08/index.html index 8f44b634..774a20b5 100644 --- a/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08/index.html +++ b/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08/index.html @@ -478,4 +478,4 @@

    -

    이것으로 제 8장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Dec 12, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 8장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Dec 12, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09/index.html b/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09/index.html index 0e2869da..cf2fcbde 100644 --- a/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09/index.html +++ b/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09/index.html @@ -390,4 +390,4 @@

    계정별, 여러 프로바이더 별, 여러 리전 별 배포 또한 가능함을 살펴보았습니다.
  • 도커와 쿠버네티스 실습환경에 대한 내용은 곧 업데이트 하겠습니다!
  • -

    이것으로 제 9장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Dec 12, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이것으로 제 9장을 마칩니다. 긴 글 읽어주셔서 감사합니다.

    Published Dec 12, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/index.html b/index.html index 1ee633e3..1de9017d 100644 --- a/index.html +++ b/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    [연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해

    컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.

    Read
    retrospect

    [글또10기] 삶의 지도

    글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.

    Read
    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    \ No newline at end of file +

    [연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화

    컨테이너 사이즈 최소화의 필요성과, 최소화 과정 중 파이썬 라이브러리 설치 과정에서의 최적화 제안(PEP 656)을 소개합니다.

    Read

    [연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해

    컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.

    Read
    retrospect

    [글또10기] 삶의 지도

    글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.

    Read
    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/offline-plugin-app-shell-fallback/index.html b/offline-plugin-app-shell-fallback/index.html index bd7d94a0..ff4f3933 100644 --- a/offline-plugin-app-shell-fallback/index.html +++ b/offline-plugin-app-shell-fallback/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json index 85e42557..3792c192 100644 --- a/page-data/app-data.json +++ b/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"944e95b7ad74dd7b9ccb"} +{"webpackCompilationHash":"af28f98cfe740e509712"} diff --git a/page-data/category/tips/page-data.json b/page-data/category/tips/page-data.json index f2bc24e4..b90518ba 100644 --- a/page-data/category/tips/page-data.json +++ b/page-data/category/tips/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-category-template-category-template-tsx","path":"/category/tips","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/tips/2023-01-04---gatsby-add-image-captions//tips/2023-01-04-gatsby-add-image-captions","categorySlug":"/category/tips/"},"frontmatter":{"description":"Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.","category":"tips","title":"Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)","date":"2023-01-04T16:35:00.000Z","slug":"/tips/2023-01-04-gatsby-add-image-captions"}}},{"node":{"fields":{"slug":"/tips/2023-01-02---total-commander-101-pt02//tips/2023-01-02-total-commander-101-pt02","categorySlug":"/category/tips/"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.","category":"tips","title":"토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기","date":"2023-01-02T13:07:29.000Z","slug":"/tips/2023-01-02-total-commander-101-pt02"}}},{"node":{"fields":{"slug":"/tips/2022-12-30---total-commander-101-pt01//tips/2022-12-30-total-commander-101-pt01","categorySlug":"/category/tips/"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.","category":"tips","title":"토탈 커맨더 입문기 (1) 기본기","date":"2022-12-30T11:43:07.000Z","slug":"/tips/2022-12-30-total-commander-101-pt01"}}},{"node":{"fields":{"slug":"/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file//tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file","categorySlug":"/category/tips/"},"frontmatter":{"description":"EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.","category":"tips","title":"제발 한국인이라면 파일 끝에 엔터 칩시다","date":"2022-10-10T19:30:00.000Z","slug":"/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file"}}},{"node":{"fields":{"slug":"/tips/2022-10-08---meaning-of-z-in-shell-script//tips/2022-10-08-meaning-of-z-in-shell-script","categorySlug":"/category/tips/"},"frontmatter":{"description":"Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.","category":"tips","title":"Bash 스크립트의 문자열 비교에 대해 알아봅시다","date":"2022-10-08T19:30:00.000Z","slug":"/tips/2022-10-08-meaning-of-z-in-shell-script"}}},{"node":{"fields":{"slug":"/tips/2021-09-05---what-is-wrong-with-my-vscode-tab//tips/2021-09-05-what-is-wrong-with-my-vscode-tab","categorySlug":"/category/tips/"},"frontmatter":{"description":"우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...","category":"tips","title":"아니 내 탭 어디감?","date":"2021-09-05T19:30:00.000Z","slug":"/tips/2021-09-05-what-is-wrong-with-my-vscode-tab"}}},{"node":{"fields":{"slug":"/tips/2021-06-03---how-to-use-file-signature-in-pycharm//tips/how-to-use-file-signature-in-pycharm","categorySlug":"/category/tips/"},"frontmatter":{"description":"매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.","category":"tips","title":"PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기","date":"2021-06-03T09:00:00.000Z","slug":"/tips/how-to-use-file-signature-in-pycharm"}}}]}},"pageContext":{"group":"tips","limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/category/tips","nextPagePath":"/category/tips/page/1","hasNextPage":true,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-category-template-category-template-tsx","path":"/category/tips","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/tips/2023-01-04---gatsby-add-image-captions//tips/2023-01-04-gatsby-add-image-captions","categorySlug":"/category/tips/"},"frontmatter":{"description":"Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.","category":"tips","title":"Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)","date":"2023-01-04T16:35:00.000Z","slug":"/tips/2023-01-04-gatsby-add-image-captions"}}},{"node":{"fields":{"slug":"/tips/2023-01-02---total-commander-101-pt02//tips/2023-01-02-total-commander-101-pt02","categorySlug":"/category/tips/"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.","category":"tips","title":"토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기","date":"2023-01-02T13:07:29.000Z","slug":"/tips/2023-01-02-total-commander-101-pt02"}}},{"node":{"fields":{"slug":"/tips/2022-12-30---total-commander-101-pt01//tips/2022-12-30-total-commander-101-pt01","categorySlug":"/category/tips/"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.","category":"tips","title":"토탈 커맨더 입문기 (1) 기본기","date":"2022-12-30T11:43:07.000Z","slug":"/tips/2022-12-30-total-commander-101-pt01"}}},{"node":{"fields":{"slug":"/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file//tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file","categorySlug":"/category/tips/"},"frontmatter":{"description":"EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.","category":"tips","title":"제발 한국인이라면 파일 끝에 엔터 칩시다","date":"2022-10-10T19:30:00.000Z","slug":"/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file"}}},{"node":{"fields":{"slug":"/tips/2022-10-08---meaning-of-z-in-shell-script//tips/2022-10-08-meaning-of-z-in-shell-script","categorySlug":"/category/tips/"},"frontmatter":{"description":"Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.","category":"tips","title":"Bash 스크립트의 문자열 비교에 대해 알아봅시다","date":"2022-10-08T19:30:00.000Z","slug":"/tips/2022-10-08-meaning-of-z-in-shell-script"}}},{"node":{"fields":{"slug":"/tips/2021-09-05---what-is-wrong-with-my-vscode-tab//tips/2021-09-05-what-is-wrong-with-my-vscode-tab","categorySlug":"/category/tips/"},"frontmatter":{"description":"우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...","category":"tips","title":"아니 내 탭 어디감?","date":"2021-09-05T19:30:00.000Z","slug":"/tips/2021-09-05-what-is-wrong-with-my-vscode-tab"}}},{"node":{"fields":{"slug":"/tips/2021-07-11---how-to-use-pre-commit-hook-vol1//tips/2021-07-11-how-to-use-pre-commit-hook-vol1","categorySlug":"/category/tips/"},"frontmatter":{"description":"pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.","category":"tips","title":"pre-commit hook, 나도 한번 써보자 (1)","date":"2021-06-03T09:00:00.000Z","slug":"/tips/2021-07-11-how-to-use-pre-commit-hook-vol1"}}}]}},"pageContext":{"group":"tips","limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/category/tips","nextPagePath":"/category/tips/page/1","hasNextPage":true,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/category/tips/page/1/page-data.json b/page-data/category/tips/page/1/page-data.json index a57d6334..3ca4f87c 100644 --- a/page-data/category/tips/page/1/page-data.json +++ b/page-data/category/tips/page/1/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-category-template-category-template-tsx","path":"/category/tips/page/1","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/tips/2021-07-11---how-to-use-pre-commit-hook-vol1//tips/2021-07-11-how-to-use-pre-commit-hook-vol1","categorySlug":"/category/tips/"},"frontmatter":{"description":"pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.","category":"tips","title":"pre-commit hook, 나도 한번 써보자 (1)","date":"2021-06-03T09:00:00.000Z","slug":"/tips/2021-07-11-how-to-use-pre-commit-hook-vol1"}}},{"node":{"fields":{"slug":"/tips/2021-02-03---server-maintenance-guide-101//tips/2021-02-03-server-maintenance-guide","categorySlug":"/category/tips/"},"frontmatter":{"description":"서버 점검과 관련하여","category":"tips","title":"간략히 써본 서버 점검 가이드","date":"2021-02-03T10:17:43.000Z","slug":"/tips/2021-02-03-server-maintenance-guide"}}},{"node":{"fields":{"slug":"/tips/2019-04-19---jekyll-liquid-issue//tips/2019-04-19-jekyll-liquid-issue","categorySlug":"/category/tips/"},"frontmatter":{"description":"Python 코드를 Jekyll에 작성 시, Liquid syntax error가 뜬다면?","category":"tips","title":"Django 코드를 Jekyll에 작성할 때 Liquid syntax error가 뜬다면?","date":"2019-04-19T12:00:00.000Z","slug":"/tips/2019-04-19-jekyll-liquid-issue"}}}]}},"pageContext":{"group":"tips","limit":7,"offset":7,"pagination":{"currentPage":1,"prevPagePath":"/category/tips","nextPagePath":"/category/tips/page/2","hasNextPage":false,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-category-template-category-template-tsx","path":"/category/tips/page/1","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/tips/2021-06-03---how-to-use-file-signature-in-pycharm//tips/how-to-use-file-signature-in-pycharm","categorySlug":"/category/tips/"},"frontmatter":{"description":"매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.","category":"tips","title":"PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기","date":"2021-06-03T09:00:00.000Z","slug":"/tips/how-to-use-file-signature-in-pycharm"}}},{"node":{"fields":{"slug":"/tips/2021-02-03---server-maintenance-guide-101//tips/2021-02-03-server-maintenance-guide","categorySlug":"/category/tips/"},"frontmatter":{"description":"서버 점검과 관련하여","category":"tips","title":"간략히 써본 서버 점검 가이드","date":"2021-02-03T10:17:43.000Z","slug":"/tips/2021-02-03-server-maintenance-guide"}}},{"node":{"fields":{"slug":"/tips/2019-04-19---jekyll-liquid-issue//tips/2019-04-19-jekyll-liquid-issue","categorySlug":"/category/tips/"},"frontmatter":{"description":"Python 코드를 Jekyll에 작성 시, Liquid syntax error가 뜬다면?","category":"tips","title":"Django 코드를 Jekyll에 작성할 때 Liquid syntax error가 뜬다면?","date":"2019-04-19T12:00:00.000Z","slug":"/tips/2019-04-19-jekyll-liquid-issue"}}}]}},"pageContext":{"group":"tips","limit":7,"offset":7,"pagination":{"currentPage":1,"prevPagePath":"/category/tips","nextPagePath":"/category/tips/page/2","hasNextPage":false,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/devlog/python/2024-10-13-python-container-101-pt01/page-data.json b/page-data/devlog/python/2024-10-13-python-container-101-pt01/page-data.json index 99421d75..1909d66e 100644 --- a/page-data/devlog/python/2024-10-13-python-container-101-pt01/page-data.json +++ b/page-data/devlog/python/2024-10-13-python-container-101-pt01/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-template-post-template-tsx","path":"/devlog/python/2024-10-13-python-container-101-pt01","result":{"data":{"markdownRemark":{"id":"10cdca32-9929-5548-9ff2-3cfcb26b498d","html":"

    이번 게시글에서는 컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너를 구성하기 위한 선택지를 살펴봅니다.

    \n

    컨테이너 기술?

    \n

    요즘은 컨테이너로 서비스를 배포하는 것이 굉장히 일상적입니다. 각종 기고문 등에서도 컨테이너를 사용한 배포가 일상화 되어있고, 국내의 큰 회사도 100만개의 컨테이너가 동시에(!) 돌기도 한다고 합니다. 그렇다면 컨테이너가 어떤 것인지 먼저 살펴볼까요?

    \n

    컨테이너 이전에는…

    \n

    과거 서버를 구성할 때는 개발팀(Dev)의 개발 후 품질보증팀(QA), 보안팀(Infosec)의 검증을 거쳐서 운영팀(Ops)이 배포하는 흐름이었습니다. 이러한 개발 방식은 서비스를 기획하고 지속적으로 운영하며 여러 문제를 겪는데요. 첫 번째 문제는, 개발한 코드가 배포되기까지의 흐름이 너무 늦다는 것입니다.

    \n

    우리는 배포에 가까워지며 버그를 패치할 때는 임시방편으로 일정을 맞추기 위한 코드를 짜죠. 이런 ‘기술 부채’들은 지속적으로 쌓이고, 언젠간 해결해야지 하는 방법으로 계속 때우는 것으론 한계가 발생합니다. 근본결함을 수정하기에는 문제 해결에 대한 시간이 너무 짧다는 것입니다.

    \n

    두 번째 문제는 배포와 관리를 하기 위한 서버 관리 비용 또한 고려의 대상이라는 것입니다. 배포를 할 땐 서버 환경을 모두 알고 잘 구성해야 합니다. 하나라도 어긋나면 서버구동이 되지 않을 수 있습니다. 서버를 늘리고 줄이기 위해서는 물리 서버에 동일한 작업을 여러 번 반복하는 것 또한 일입니다.

    \n

    이 두 가지 단점에 대해서는, 후술할 DevOps 개념과 컨테이너가 본격적으로 쓰이기 전인 2011년 IDC와 가트너(Gartner)는 전 세계 GDP의 약 3.1조 달러가 IT에 지출된다고 추정했습니다1.

    \n
    \n

    🍎 tips

    \n

    컨테이너가 등장하기 이전에도 이를 위한 많은 시도가 있었지만, 주제와 어긋나므로 과감히 생략합니다. 관련해서는 이 글2의 단락을 읽어주세요.

    \n
    \n

    컨테이너, IaC, DevOps, let’s go

    \n

    컨테이너는 정말 쉽게 말하면, 어디서든 구동될 수 있는 서버 환경까지 고정하여 어디서든 동일하게 사용할 수 있도록 구성한 프로세스 입니다. 이게 구동되면 서버가 돌 수 있는 것이지요. 그런 컨테이너 기술로 널리 사용되는 것은 단연 Docker 입니다.

    \n
    \n(생략가능) Docker와 더 상세한 컨테이너 기술에 대한 정보는 여기에 정리했습니다.\n
    \n

    🍎 tips

    \n

    글의 방향을 이해하는 데는 크게 필요없지만, 만약 더 알아보시고 싶으시다면 이 내용을 참고해주세요.

    \n
    \n
      \n
    • \n

      Docker의 역할과 발전

      \n
        \n
      • Docker는 컨테이너 기술을 대중화한 선구자 역할을 했습니다.
      • \n
      • 초기에는 자체적인 도커 엔진을 통해 컨테이너를 관리했습니다.
      • \n
      • 현재는 내부적으로 containerd를 사용하여 컨테이너 런타임을 관리합니다.
      • \n
      \n
    • \n
    • \n

      containerd의 분리와 역할

      \n
        \n
      • containerd는 원래 도커 엔진의 핵심 컴포넌트였습니다.
      • \n
      • 2017년 CNCF(Cloud Native Computing Foundation)에 기부되어 독립 프로젝트가 되었습니다.
      • \n
      • 2019년 CNCF 졸업 프로젝트가 되었습니다.
      • \n
      • 컨테이너 이미지 관리, 실행, 네트워킹 등 컨테이너 생애주기 전반을 관리합니다.
      • \n
      • Docker뿐만 아니라 쿠버네티스 등 다른 상위 레벨 시스템에서도 직접 사용될 수 있습니다.
      • \n
      \n
    • \n
    • \n

      OCI(Open Container Initiative)와 표준화

      \n
        \n
      • 2015년 설립되어 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 개발합니다.
      • \n
      • 주요 표준:\n
          \n
        • 런타임 명세 (runtime-spec)
        • \n
        • 이미지 명세 (image-spec)
        • \n
        \n
      • \n
      • 다양한 컨테이너 런타임이 호환성을 유지할 수 있게 합니다.
      • \n
      \n
    • \n
    • \n

      다른 주요 컨테이너 기술

      \n
        \n
      • CRI-O: 쿠버네티스를 위해 특별히 설계된 컨테이너 런타임입니다. Red Hat과 쿠버네티스 커뮤니티에 의해 개발되었습니다.
      • \n
      • rkt: CoreOS에서 개발한 대안적인 컨테이너 런타임으로, 보안과 모듈성에 중점을 두었습니다. (현재는 개발 중단)
      • \n
      • LXC: 리눅스 커널 수준의 컨테이너화 기술로, 운영 체제 수준의 가상화를 제공합니다.
      • \n
      \n
    • \n
    • \n

      컨테이너 기술의 최신 트렌드

      \n
        \n
      • 마이크로서비스 아키텍처의 부상과 함께 컨테이너 기술의 중요성이 더욱 커졌습니다.
      • \n
      • 서버리스 컴퓨팅에서도 컨테이너 기술이 백엔드로 활용되고 있습니다.
      • \n
      • 쿠버네티스와 같은 오케스트레이션 도구의 발전으로 컨테이너 관리가 더욱 효율적으로 이루어지고 있습니다.
      • \n
      \n
    • \n
    \n
    \n

    컨테이너 기술의 대두는 기존에 지적되어왔던 단점을 훌륭하게 해결해주었지요. 실행 당시의 환경을 별도로 격리시켜주고, 종속성을 유지할 수 있게 할 수 있지요. 이렇게 되면 아래와 같은 장점이 있습니다.

    \n
      \n
    • 개발환경과 운영환경 구성 시의 차이점을 최소화 할 수 있습니다.
    • \n
    • 다른 사람이 만든 “서버”를 쉽게 가져다 사용할 수 있습니다.
    • \n
    • 서버 가용성을 확장하기 위해 컨테이너를 한 서버/다른 서버 에서 동시에 구동하여 처리할 수도 있습니다.
    • \n
    \n

    그리고 클라우드 컴퓨팅의 시대로 들어오며 이런 장점은 더욱 극대화 되기 시작했습니다. 기존에는 서버실 구성, 각종 배선작업 및 쿨링 시스템 구축을 거의 모든 회사가 직접 해야했으나, 원격지의 서버를 임대하여 사용할 수 있는 시스템이 등장함으로 인해 이런 컨테이너를 통한 장점이 더욱 극대화될 수 있는 환경마저 제공된 것이죠. 심지어는 이런 구성마저도 코드로 관리하여(IaC, Infrastructure as Code) 처리하는 접근법이 대두되기도 합니다.

    \n

    이런 식으로 기존 개발 방식에서 개발팀(Dev)와 운영팀(Ops)의 역할 사이클을 한 번에 줄이고 보다 자주, 그리고 견고하게 배포하도록 하는 과정이 DevOps의 일부라고 할 수 있겠습니다.

    \n
    \n

    이 이상의 DevOps와 IaC에 대한 내용은 본 주제와 어긋날 수 있으니 과감히 생략하겠습니다.

    \n

    만일 알아보시고 싶으시다면 제가 기존에 작성한 글타래를 살펴봐주시면 감사하겠습니다. 🙇

    \n
    \n

    파이썬 컨테이너에 대해 알아봅시다

    \n

    그렇다면, 파이썬 컨테이너에 대해 살펴볼까요. 컨테이너는 앞서 언급했듯 어디서든 구동될 수 있는 서버 환경을 구성할 수 있습니다.

    \n

    파이썬 컨테이너 살펴보기

    \n

    저희가 살펴볼 파이썬 컨테이너는 Docker Hub에서 확인할 수 있습니다. 사이트에 접속해서 어떤 내용이 있나 살펴보죠.

    \n

    \n \n \n \n \n \n \n \n \n \n \n

    Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)

    \n

    \n

    \n \n \n \n \n \n \n \n \n \n \n

    Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)

    \n

    \n

    뭔가 되게 많군요. 숫자는 파이썬 버전같은데, - 뒤의 값은 뭔지 알아봅시다. 각각 Simple tags, Shared tags 인데요. 이 값은 아래와 같습니다.

    \n
      \n
    • \n

      simple tags: 기재된 리눅스 혹은 윈도우즈에서만 동작을 보장하는 컨테이너 이미지임을 의미합니다. 이 값을 사용하면 해당 태그에 명시된 플랫폼(리눅스나 윈도우즈 등)의 하나의 매니페스트에 연결됩니다. 이 경우, 명확히 지정한 플랫폼의 이미지만 사용할 수 있습니다.

      \n
    • \n
    • \n

      shared tags: 여러 운영체제(리눅스 및 다양한 윈도우즈 버전)와 아키텍처에서 동작하는 컨테이너 이미지를 나타냅니다. 이 값을 Docker Engine이 구동되는 환경(운영체제, 아키텍처 등)에 맞는 적절한 이미지를 자동으로 선택해서 pull하게 됩니다. 예를 들어, mongo:4.0 같은 shared tag를 사용하면 Docker Engine이 현재 실행 중인 호스트의 운영체제와 아키텍처에 맞는 이미지를 알아서 가져옵니다.

      \n
    • \n
    \n

    헬로 글또!

    \n

    그렇다면, shared tags를 사용해서 헬로월드를 출력하는 도커 이미지를 만들어봅시다.

    \n
      \n
    1. hello.py 파일 생성:
    2. \n
    \n
    print(\"Hello, geultto!\")
    \n
      \n
    1. Dockerfile 생성:
    2. \n
    \n
    FROM python:3.12\n\nWORKDIR /app\n\nCOPY hello.py .\n\nCMD [\"python\", \"hello.py\"]
    \n
      \n
    1. 이미지 빌드 및 실행:
    2. \n
    \n
    docker build -t python-hello .\ndocker run python-hello
    \n

    3을 실행시키면 아래와 같은 결과가 나옵니다.

    \n
    docker build -t python-hello .\n[+] Building 26.1s (8/8) FINISHED                                                                                                 docker:desktop-linux\n => [internal] load build definition from Dockerfile                                                                                              0.0s\n => => transferring dockerfile: 151B                                                                                                              0.0s\n => [internal] load metadata for docker.io/library/python:3.12                                                                                    2.7s\n => [internal] load .dockerignore                                                                                                                 0.0s\n => => transferring context: 2B                                                                                                                   0.0s\n => [1/3] FROM docker.io/library/python:3.12@sha256:05855f5bf06f5a004b0c1a8aaac73a9d9ea54390fc289d3e80ef52c4f90d5585                             22.7s\n (생략)\n => => extracting sha256:3795519dea7759f67ddca8240187a3dd44b924bf57de62a5a77ac2226c7b9d43                                                         0.0s\n => [internal] load build context                                                                                                                 0.0s\n => => transferring context: 98B                                                                                                                  0.0s\n => [2/3] WORKDIR /app                                                                                                                            0.5s\n => [3/3] COPY hello.py .                                                                                                                         0.0s\n => exporting to image                                                                                                                            0.1s\n => => exporting layers                                                                                                                           0.0s\n (생략)\n => => naming to docker.io/library/python-hello:latest                                                                                            0.0s\n => => unpacking to docker.io/library/python-hello:latest                                                                                         0.0s\n\nWhat's next:\n    View a summary of image vulnerabilities and recommendations → docker scout quickview\n\n$ docker run python-hello\nHello, geultto!
    \n

    축하합니다. 당신은 첫 파이썬 컨테이너를 빌드했습니다! 🎉🎉

    \n

    이제 빌드한 이미지의 크기를 확인해봅시다.

    \n
    $ docker images python-hello\nREPOSITORY     TAG       IMAGE ID       CREATED         SIZE\npython-hello   latest    746136719e90   3 minutes ago   1.46GB
    \n

    헬로월드 하나 찍는데 1.46GB 나 쓴다구요?????? 이건 무슨 의미일까요?

    \n

    컨테이너 크기가 커지는 이유

    \n

    컨테이너 크기가 비대한 이유는 아래와 같습니다:

    \n
      \n
    • 기본 파이썬 이미지의 크기\n
        \n
      • 기본 파이썬 인터프리터, 표준 라이브러리, pip 뿐 아니라 개발 도구와 디버깅 도구도 포함될 수 있기 때문입니다.
      • \n
      \n
    • \n
    • 운영체제 레이어와 각종 의존성\n
        \n
      • 기본 OS 파일 시스템, 유틸리티 등이 함께 포함될 수 있기 때문입니다. 저희는 shared tags를 썼으니까요.
      • \n
      \n
    • \n
    • 그런데 여기서 애플리케이션 코드 및 데이터가 들어가면?\n
        \n
      • 프로젝트에 필요한 라이브러리 설치 시 크기 증가
      • \n
      • 프로젝트 파일, 정적 자산 등이 추가될 때마다 크기 증가
      • \n
      \n
    • \n
    \n

    그렇다면 이미지는 현재라면 더 커지는 수 밖에 없겠습니다. 점점 커지는 이미지는 지양해야 할 것 같은 예감이 드는데요. 어떤 단점이 있는지 살펴보았습니다.

    \n
      \n
    • 배포 시간 증가\n
        \n
      • 큰 이미지는 다운로드와 업로드에 더 많은 시간을 소요합니다.
      • \n
      \n
    • \n
    • 스토리지 비용 증가\n
        \n
      • 컨테이너 레지스트리(일종의 컨테이너 저장소입니다)와 호스트 시스템에서 더 많은 공간 차지할 수 있습니다
      • \n
      \n
    • \n
    • 보안 취약점 증가 가능성\n
        \n
      • 불필요한 패키지가 포함될 경우 공격 표면(attack vector, 공격받을 수 있는 pain point를 의미)이 잠재적으로 많아집니다
      • \n
      \n
    • \n
    • 컨테이너 시작 시간 증가\n
        \n
      • 큰 이미지는 로딩에 더 많은 시간 소요
      • \n
      • 앞으로 더 커진다면 더 로딩되는 시간이 길어지겠지요
      • \n
      \n
    • \n
    • 리소스 사용 효율성 저하\n
        \n
      • 불필요한 컴포넌트로 인한 메모리 및 CPU 사용량 증가
      • \n
      \n
    • \n
    \n

    그렇다면 다음 글에서는 컨테이너 크기를 줄이기 위한 방안을 살펴보고, 파이썬 컨테이너 이미지의 특징을 살펴보도록 하겠습니다.

    \n

    긴 글 읽어주셔서 감사합니다.

    \n","fields":{"slug":"/devlog/python/2024-10-13---python-container-101//devlog/python/2024-10-13-python-container-101-pt01","tagSlugs":["/tag/python/","/tag/geultto/"]},"frontmatter":{"date":"2024-10-13T03:00:00.000Z","description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","tags":["python","geultto"],"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","socialImage":{"publicURL":{"publicURL":"/static/f362749d11992f125f0cdfe8205b50ef/sangdo-dong.jpg"}}}}},"pageContext":{"slug":"/devlog/python/2024-10-13---python-container-101//devlog/python/2024-10-13-python-container-101-pt01"}},"staticQueryHashes":["251939775","357378587","401334301"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-template-post-template-tsx","path":"/devlog/python/2024-10-13-python-container-101-pt01","result":{"data":{"markdownRemark":{"id":"b50c5d70-eedf-52b8-a9c3-ef7e46343835","html":"

    이번 게시글에서는 컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너를 구성하기 위한 선택지를 살펴봅니다.

    \n

    이 게시글은, 파이썬으로 서버 개발을 진행한 경험이 있으시다면 보다 쉽게 이해하실 수 있습니다.

    \n

    컨테이너 기술?

    \n

    요즘은 컨테이너로 서비스를 배포하는 것이 굉장히 일상적입니다. 각종 기고문 등에서도 컨테이너를 사용한 배포가 일상화 되어있고, 국내의 큰 회사도 100만개의 컨테이너가 동시에(!) 돌기도 한다고 합니다. 그렇다면 컨테이너가 어떤 것인지 먼저 살펴볼까요?

    \n

    컨테이너 이전에는…

    \n

    과거 서버를 구성할 때는 개발팀(Dev)의 개발 후 품질보증팀(QA), 보안팀(Infosec)의 검증을 거쳐서 운영팀(Ops)이 배포하는 흐름이었습니다. 이러한 개발 방식은 서비스를 기획하고 지속적으로 운영하며 여러 문제를 겪는데요. 첫 번째 문제는, 개발한 코드가 배포되기까지의 흐름이 너무 늦다는 것입니다.

    \n

    우리는 배포에 가까워지며 버그를 패치할 때는 임시방편으로 일정을 맞추기 위한 코드를 짜죠. 이런 ‘기술 부채’들은 지속적으로 쌓이고, 언젠간 해결해야지 하는 방법으로 계속 때우는 것으론 한계가 발생합니다. 근본결함을 수정하기에는 문제 해결에 대한 시간이 너무 짧다는 것입니다.

    \n

    두 번째 문제는 배포와 관리를 하기 위한 서버 관리 비용 또한 고려의 대상이라는 것입니다. 배포를 할 땐 서버 환경을 모두 알고 잘 구성해야 합니다. 하나라도 어긋나면 서버구동이 되지 않을 수 있습니다. 서버를 늘리고 줄이기 위해서는 물리 서버에 동일한 작업을 여러 번 반복하는 것 또한 일입니다.

    \n

    이 두 가지 단점에 대해서는, 후술할 DevOps 개념과 컨테이너가 본격적으로 쓰이기 전인 2011년 IDC와 가트너(Gartner)는 전 세계 GDP의 약 3.1조 달러가 IT에 지출된다고 추정했습니다1.

    \n
    \n

    🍎 tips

    \n

    컨테이너가 등장하기 이전에도 이를 위한 많은 시도가 있었지만, 주제와 어긋나므로 과감히 생략합니다. 관련해서는 이 글2의 단락을 읽어주세요.

    \n
    \n

    컨테이너, IaC, DevOps, let’s go

    \n

    보통 말하는 컨테이너의 정의는 아래와 같습니다.

    \n
    \n

    애플리케이션을 패키징화하고 실행을 격리한다.

    \n
    \n

    다시말해, 서버 구성 환경 하나하나 고정하여 어디서든 동일하게 실행가능한 프로세스 입니다. 좀 뭉뚱그려 말하면 이게 구동되면 서버가 돌 수 있는 것이지요. 그런 컨테이너 기술로 널리 사용되는 것은 단연 Docker 입니다. 컨테이너 기술의 등장으로 인해 기존 배포과정에서의 단점이 훌륭하게 해결되었지요. 실행 당시의 환경을 별도로 격리시켜주고, 종속성을 유지할 수 있게 할 수 있게 되다보니 아래와 같은 장점을 누릴 수 있게 되었습니다.

    \n
      \n
    • 개발환경과 운영환경의 차이점을 최소화 할 수 있습니다.
    • \n
    • 다른 사람이 만든 “서버”를 쉽게 가져다 사용할 수 있습니다.
    • \n
    • 서버 가용성을 확장하기 위해 컨테이너를 한 서버/다른 서버 에서 동시에 구동하여 처리할 수도 있습니다.
    • \n
    \n
    \n🤔 컨테이너 기술이 DevOps에 끼치는 영향\n
    \n

    🍎 tips

    \n

    글의 방향을 이해하는 데는 크게 필요없지만, 만약 더 알아보시고 싶으시다면 아래 내용도 참고해주세요.

    \n

    만일 IaC 중 Terraform에 대해 관심이 있으시다면 저의 다른 연재글을 함께 살펴봐주시면 감사하겠습니다. 🙇

    \n
    \n

    클라우드 컴퓨팅의 시대로 들어오며 이런 장점은 더욱 극대화 되기 시작했습니다. 기존에는 서버실 구성, 각종 배선작업 및 쿨링 시스템 구축을 거의 모든 회사가 직접 해야했으나, 원격지의 서버를 임대하여 사용할 수 있는 시스템이 등장함으로 인해 이런 컨테이너를 통한 장점이 더욱 극대화될 수 있는 환경마저 제공된 것이죠. 심지어는 이런 구성마저도 코드로 관리하여(IaC, Infrastructure as Code) 처리하는 접근법이 대두되기도 합니다.

    \n

    이런 식으로 기존 개발 방식에서 개발팀(Dev)와 운영팀(Ops)의 역할 사이클을 한 번에 줄이고 보다 자주, 그리고 견고하게 배포하도록 하는 과정이 DevOps의 일부라고 할 수 있겠습니다.

    \n
    \n

    컨테이너에 대해

    \n
    \n

    🍎 note

    \n

    이 글 이후로 컨테이너 관련 플랫폼은 Docker(이하 도커)를 사용하도록 하겠습니다.

    \n
    \n

    지금까지 컨테이너에 대한 말이 굉장히 많이 나왔는데요. 그렇다면 이건 어떻게 만들고 구동해볼 수 있을까요? 설명에 앞서 용어부터 정리해봅시다. 컨테이너 기술을 이야기할 때는 흔히 “도커 이미지”와 “도커 컨테이너”라는 용어를 사용하여 실행가능한 형태와 실제 구동중인 형태를 각각 표현합니다. “도커 이미지”에 대한 설계도는 Dockerfile 이구요.

    \n

    \n \n \n \n \n \n \n \n \n \n \n

    귀여운 고래와 함께 보시죠

    \n

    \n

    도커 이미지와 Dockerfile에 대해

    \n

    이미지는 애플리케이션을 실행하는데 필요한 모든 것을 포함하는 ‘불변의 템플릿’입니다. 여기엔 소스 코드, 런타임, 라이브러리, 환경 변수, 설정 파일 등이 포함됩니다. 그리고 이 이미지를 만드는 명세서가 바로 Dockerfile입니다. Dockerfile에는 이미지를 어떻게 만들지 순서대로 적어둡니다. 기준이 되는 이미지부터 우리가 원하는 내용을 추가할 수 있지요. 한번 살펴봅시다.

    \n

    Dockerfile의 각 명령어는 하나의 “레이어”가 되어 이미지를 겹겹이 쌓아갑니다. 각각의 레이어는 그 명령어로 인한 파일 시스템의 변경사항을 담고 있죠. 한번 만들어진 레이어는 읽기 전용이 되어 “불변성”을 보장합니다. 이렇게 모든 레이어가 쌓이면 하나의 이미지가 완성되는 거죠.

    \n

    도커 이미지를 만들기 위한 바탕을 베이스 이미지3라고 부르기도 합니다. 파이썬 베이스 이미지는 Docker Hub에서 확인하실 수 있어요. 필요한 파이썬 버전이 있다면 그에 맞는 값을 바꿔주면 됩니다. 3.12 버전이 필요하면 그 값을 입력하면 되죠. 심지어는 어떤 운영체제에서 구동되는 걸 기대하는지도 지정해줄 수 있습니다.

    \n
    FROM python:3.12            # 앞서 살펴본 베이스 이미지 입니다. 여기서는 파이썬 3.12를 사용해요.\nWORKDIR /app                # 이제부터의 명령어들이 실행될 작업 디렉터리를 지정합니다.\nCOPY hello.py .             # 현재 디렉터리의 hello.py 파일을 컨테이너의 /app 디렉터리로 복사합니다.\nCMD [\"python\", \"hello.py\"]  # 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
    \n

    만들어봅시다!

    \n

    그러면 헬로월드를 출력하는 도커 이미지를 만들어봅시다. Docker Desktop을 설치하고 한번 만들어볼까요!

    \n
      \n
    1. hello.py 파일 생성:
    2. \n
    \n
    print(\"Hello, geultto!\")
    \n
      \n
    1. Dockerfile 생성(위에서 본 내용입니다):
    2. \n
    \n
    FROM python:3.12\nWORKDIR /app\nCOPY hello.py .\nCMD [\"python\", \"hello.py\"]
    \n
      \n
    1. 이미지 빌드:
    2. \n
    \n

    3을 실행시키면 아래와 같은 결과가 나옵니다.

    \n
    docker build -t python-hello .\n[+] Building 26.1s (8/8) FINISHED                           docker:desktop-linux\n => [internal] load build definition from Dockerfile                        0.0s\n => => transferring dockerfile: 151B                                        0.0s\n => [internal] load metadata for docker.io/library/python:3                 2.7s\n => [internal] load .dockerignore                                           0.0s\n => => transferring context: 2B                                             0.0s\n => [1/3] FROM docker.io/library/python:3.12@sha256:<생략>                 22.7s\n (생략)\n => => extracting sha256:<생략>\n => [internal] load build context                                           0.0s\n => => transferring context: 98B                                            0.0s\n => [2/3] WORKDIR /app                                                      0.5s\n => [3/3] COPY hello.py .                                                   0.0s\n => exporting to image                                                      0.1s\n => => exporting layers                                                     0.0s\n (생략)\n => => naming to docker.io/library/python-hello:latest                      0.0s\n => => unpacking to docker.io/library/python-hello:latest                   0.0s\n\nWhat's next:\n    View a summary of image vulnerabilities and recommendations → docker scout quickview
    \n

    축하합니다. 당신은 첫 파이썬 컨테이너를 빌드했습니다! 🎉🎉

    \n

    도커 컨테이너?

    \n

    그렇다면 도커 컨테이너는 무엇일까요? 바로 도커 이미지를 실행한 프로세스를 말합니다. 이 프로세스는:

    \n
      \n
    • 격리된 프로세스 공간 확보
    • \n
    • 호스트로부터 컨테이너 자신만의 독립된 파일시스템을 확보
    • \n
    • 컨테이너 만의 네트워크 환경을 개별적으로 확보
    • \n
    • 심지어 실행 권한도 별도로 부여받을 수 있습니다!
    • \n
    \n

    이런 특성들 덕분에:

    \n
      \n
    • 어떤 환경에서도 동일하게 실행됩니다\n
        \n
      • 내 컴퓨터에서 잘 돌던 게 서버에서도 그대로!
      • \n
      \n
    • \n
    • 다른 프로세스와 충돌 없이 실행됩니다\n
        \n
      • Python 2.7과 3.8이 필요한 프로그램들도 걱정 없이!
      • \n
      \n
    • \n
    • 문제가 생겨도 다른 프로그램에 영향을 주지 않습니다\n
        \n
      • 하나의 컨테이너가 문제가 생겨도 다른 건 멀쩡해요
      • \n
      \n
    • \n
    \n

    그러면 컨테이너를 한번 실행해볼까요?

    \n
    $ docker run python-hello\nHello, geultto!
    \n

    컨테이너 실행 완료! 이제 더 이상 환경에 구애받지 않는 실행환경이 만들어졌어요! 🎉🎉

    \n

    그런데?

    \n

    성공적으로 실행했으니 이제 빌드한 이미지의 크기를 확인해봅시다.

    \n
    $ docker images python-hello\nREPOSITORY     TAG       IMAGE ID       CREATED         SIZE\npython-hello   latest    746136719e90   3 minutes ago   1.46GB
    \n

    헬로월드 하나 찍는데 1.46GB 나 쓴다구요?????? 이건 무슨 의미일까요?

    \n

    컨테이너 크기가 커지는 이유

    \n

    컨테이너 크기가 비대한 이유는 아래와 같습니다:

    \n
      \n
    • 기본 파이썬 이미지의 크기\n
        \n
      • 기본 파이썬 인터프리터, 표준 라이브러리, pip 뿐 아니라 개발 도구와 디버깅 도구도 포함될 수 있기 때문입니다.
      • \n
      \n
    • \n
    • 운영체제 레이어와 각종 의존성\n
        \n
      • 기본 OS 파일 시스템, 유틸리티 등이 함께 포함될 수 있기 때문입니다.
      • \n
      \n
    • \n
    • 그런데 여기서 애플리케이션 코드 및 데이터가 들어가면?\n
        \n
      • 프로젝트에 필요한 라이브러리 설치 시 크기 증가
      • \n
      • 프로젝트 파일, 정적 자산 등이 추가될 때마다 크기 증가
      • \n
      \n
    • \n
    \n

    그렇다면 이미지는 현재라면 더 커지는 수 밖에 없겠습니다. 점점 커지는 이미지는 지양해야 할 것 같은 예감이 드는데요. 어떤 단점이 있는지 살펴보았습니다.

    \n
      \n
    • 배포 시간 증가\n
        \n
      • 큰 이미지는 다운로드와 업로드에 더 많은 시간을 소요합니다.
      • \n
      \n
    • \n
    • 스토리지 비용 증가\n
        \n
      • 컨테이너 레지스트리(일종의 컨테이너 저장소입니다)와 호스트 시스템에서 더 많은 공간 차지할 수 있습니다
      • \n
      \n
    • \n
    • 보안 취약점 증가 가능성\n
        \n
      • 불필요한 패키지가 포함될 경우 공격 표면(attack vector, 공격받을 수 있는 pain point를 의미)이 잠재적으로 많아집니다
      • \n
      \n
    • \n
    • 컨테이너 시작 시간 증가\n
        \n
      • 큰 이미지는 로딩에 더 많은 시간 소요
      • \n
      • 앞으로 더 커진다면 더 로딩되는 시간이 길어지겠지요
      • \n
      \n
    • \n
    • 리소스 사용 효율성 저하\n
        \n
      • 불필요한 컴포넌트로 인한 메모리 및 CPU 사용량 증가
      • \n
      \n
    • \n
    \n

    끝으로

    \n

    그렇다면 다음 글에서는 파이썬 컨테이너 이미지 크기를 줄이기 위한 여러 방안을 살펴보고, 파이썬 컨테이너 이미지 빌드가 가지는 특징을 살펴보도록 하겠습니다.

    \n

    긴 글 읽어주셔서 감사합니다.

    \n
    \n
    \n
      \n
    1. 자세한 내용은 이 링크를, 관련 출처는 이 링크에서 확인할 수 있습니다.
    2. \n
    3. https://www.44bits.io/ko/post/why-should-i-use-docker-container#운영하면서-만들어지는-눈송이-서버들snowflake-servers
    4. \n
    5. 모든 이미지의 베이스 이미지도 있습니다. 참고 링크
    6. \n
    \n
    ","fields":{"slug":"/devlog/python/2024-10-13---python-container-101-pt01//devlog/python/2024-10-13-python-container-101-pt01","tagSlugs":["/tag/python/","/tag/geultto/"]},"frontmatter":{"date":"2024-10-13T03:00:00.000Z","description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","tags":["python","geultto"],"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","socialImage":{"publicURL":{"publicURL":"/static/f362749d11992f125f0cdfe8205b50ef/sangdo-dong.jpg"}}}}},"pageContext":{"slug":"/devlog/python/2024-10-13---python-container-101-pt01//devlog/python/2024-10-13-python-container-101-pt01"}},"staticQueryHashes":["251939775","357378587","401334301"]} \ No newline at end of file diff --git a/page-data/devlog/python/2024-10-26-python-container-101-pt02/page-data.json b/page-data/devlog/python/2024-10-26-python-container-101-pt02/page-data.json new file mode 100644 index 00000000..785c3180 --- /dev/null +++ b/page-data/devlog/python/2024-10-26-python-container-101-pt02/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-template-post-template-tsx","path":"/devlog/python/2024-10-26-python-container-101-pt02","result":{"data":{"markdownRemark":{"id":"061a9359-0ab1-54c0-b908-d915a6174d59","html":"

    이번 게시글에서는 컨테이너 크기를 줄이기 위한 방안을 살펴보고, 파이썬 컨테이너 이미지 빌드가 가지는 특징을 살펴보도록 하겠습니다.

    \n

    빌드 최적화를 해봅시다

    \n

    지난 글에서 빌드된 이미지의 크기를 다시 살펴볼까요?

    \n
    $ docker images python-hello\nREPOSITORY     TAG       IMAGE ID       CREATED         SIZE\npython-hello   latest    746136719e90   3 minutes ago   1.46GB
    \n

    1.46GB인 데는 분명 이유가 있을 겁니다. 그러면 latest 라는 태그가 무엇을 의미하는지부터 살펴볼까요?

    \n

    잠시만, 왜 이렇게 크지?

    \n

    Docker Hub으로 다시 들어가봐서, 어떤 컨테이너가 있나 살펴봅시다.

    \n

    뭔가 되게 많군요. 숫자는 파이썬 버전같은데, - 뒤의 값은 뭔지 알아봅시다.

    \n

    \n \n \n \n \n \n \n \n \n \n \n

    Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (shared tags)

    \n

    \n

    이 값들은 각각 Simple tags, Shared tags 인데요. 이 값은 아래와 같습니다.

    \n
      \n
    • \n

      simple tags: 태그로 기재된 리눅스 배포판 혹은 윈도우즈에서만 동작을 보장하는 컨테이너 이미지 입니다. 이 값을 사용하면 해당 태그에 명시된 플랫폼(리눅스나 윈도우즈 등)의 하나의 이미지 정보(이미지의 구성 정보, 레이어 정보, 실행 환경 등을 담은 매니페스트)에 연결됩니다. 이 경우, 명확히 지정한 플랫폼의 이미지만 사용할 수 있습니다.

      \n
    • \n
    • \n

      shared tags: 여러 운영체제(리눅스 및 다양한 윈도우즈 버전)와 아키텍처에서 동작하는 컨테이너 이미지를 나타냅니다. 이 값을 Docker Engine이 구동되는 환경(운영체제, 아키텍처 등)에 맞는 적절한 이미지를 자동으로 선택해서 pull하게 됩니다. 예를 들어, mongo:4.0 같은 shared tag를 사용하면 Docker Engine이 현재 실행 중인 호스트의 운영체제와 아키텍처에 맞는 이미지를 알아서 가져옵니다.

      \n
    • \n
    \n
    \n🤔 도커의 매니페스트란?\n

    도커 매니페스트는 컨테이너 이미지에 대한 상세 정보를 담고 있는 메타데이터입니다. 여기에는:

    \n
      \n
    • 이미지가 실행될 수 있는 운영체제와 아키텍처
    • \n
    • 이미지를 구성하는 레이어들의 정보
    • \n
    • 이미지의 설정값 (환경 변수, 실행 명령어 등)
    • \n
    \n

    등이 포함됩니다. 도커는 이 매니페스트를 읽어 해당 이미지가 현재 환경에서 실행 가능한지, 어떤 레이어들이 필요한지 등을 파악합니다.

    \n
    \n

    그럼 어떻게 하죠?

    \n

    도커 이미지 크기를 줄이기 위해서는 아래와 같은 과정을 처리할 수 있습니다.

    \n
      \n
    • 가능하면 가벼운 베이스 이미지를 선택할 것
    • \n
    • 멀티-스테이지를 사용해서, 빌드-런타임 환경을 분리할 것
    • \n
    • 다양한 최적화 방안을 고려해보기\n
        \n
      • .dockerignore 파일 작성
      • \n
      • RUN 레이어 최적화
      • \n
      • 나에게 맞는 패키지1/파일을 취사선택하기
      • \n
      \n
    • \n
    \n

    step 1. simple tag를 골라봅시다

    \n

    앞서 말씀드린 latest 는 shared tags 입니다. 구동하려는 호스트에 맞게 구동될 수는 있지만, 최적화는 다른 문제죠. 이럴 땐 최소한의 내용만을 컨테이너를 통한 배포를 수행할 때는 최소한의 내용만 맞추고 배포하는 것이 보다 나은 접근입니다.

    \n

    대표적인 베이스 이미지는 Debian linux 기반의 slimAlpine linux 기반의 alpine이 있습니다.

    \n
      \n
    • slim 이미지는,\n
        \n
      • Debian linux의 최소화 버전이며
      • \n
      • 필수적인 시스템 라이브러리를 갖추고 있습니다
      • \n
      • C 라이브러리 구현체로 glibc 를 사용합니다. 이는 거의 대부분의 라이브러리와 호환됩니다.
      • \n
      \n
    • \n
    • alpine 이미지는,\n
        \n
      • Alpine linux에 대한 최소한의 버전이며
      • \n
      • 필수적인 시스템 라이브러리로 busybox 를 이용합니다
      • \n
      • C 라이브러리 구현체로 musl libc를 사용합니다. 경량버전의 라이브러리를 추구하는 것이 목표이므로, 일부 라이브러리와 호환되지 않을 수도 있습니다.
      • \n
      \n
    • \n
    \n

    그러면 이 둘을 사용해서 각각 빌드해볼까요?

    \n
    \n👨‍💻 `slim` 빌드를 해봅시다. \n
      \n
    1. Dockerfile 을 제작합니다.
    2. \n
    \n
    FROM python:3.12-slim       # slim은 Debian slim 이미지를 의미합니다.\nWORKDIR /app\nCOPY hello.py .\nCMD [\"python\", \"hello.py\"]
    \n
      \n
    1. 빌드를 동일하게 해보고,
    2. \n
    \n
    ocker build -t python-hello:slim .
    \n
      \n
    1. 사이즈를 확인해볼까요?
    2. \n
    \n
    docker images\nREPOSITORY          TAG            IMAGE ID       CREATED         SIZE\npython-hello        slim           2f648897463c   5 seconds ago   212MB\npython-hello        latest         746136719e90   12 days ago     1.46GB
    \n
    \n
    \n👨‍💻 `alpine` 빌드를 해봅시다. \n
      \n
    1. Dockerfile 을 제작합니다.
    2. \n
    \n
    FROM python:3.12-alpine       # alpine은 Alpine 이미지를 의미합니다.\nWORKDIR /app\nCOPY hello.py .\nCMD [\"python\", \"hello.py\"]
    \n
      \n
    1. 빌드를 동일하게 해보고,
    2. \n
    \n
    ocker build -t python-hello:alpine .
    \n
      \n
    1. 사이즈를 확인해볼까요?
    2. \n
    \n
    docker images\nREPOSITORY          TAG            IMAGE ID       CREATED         SIZE\npython-hello        slim           2f648897463c   5 seconds ago   212MB\npython-hello        alpine         37a9f605a036   3 minutes ago   78.4MB\npython-hello        latest         746136719e90   12 days ago     1.46GB
    \n
    \n

    step 2. 멀티-스테이지 사용해보기

    \n

    멀티-스테이지는 하나의 Dockerfile에서 다양한 스테이지로 나누어서 레이어를 쌓는 개념을 의미합니다. 그렇다면 어떤 스테이지가 있는지 살펴볼까요?

    \n
      \n
    • 빌드 스테이지\n
        \n
      • 빌드 도구에 필요한 내용만을 포함합니다
      • \n
      • 빌드 결과를 저장합니다
      • \n
      \n
    • \n
    • 런타임 스테이지\n
        \n
      • 직전 phase에서 저장한 파일들을 복사합니다.
      • \n
      • 빌드 후의 내용을 구동할 최소한의 파일만을 설치합니다
      • \n
      • 본 내용에서는 런타임 스테이지를 run stage, service stage 둘로 나눕니다.\n
          \n
        • 이는 각각 실행환경 구성, 앱 실행환경 구성을 의미합니다.
        • \n
        \n
      • \n
      \n
    • \n
    \n

    그렇다면 멀티-스테이지로 빌드를 수행해볼까요?

    \n

    이번 예시부터는 이 GitHub repo를 사용해보겠습니다.

    \n

    멀티-스테이지가 없다면?

    \n

    그렇다면, 멀티-스테이지 없이 헬로글또를 찍어볼까요?

    \n
    FROM python:3.12-slim\n\nARG POETRY_VERSION=1.6.1\nARG APPLICATION_SERVER_PORT=8000\n\nENV PIP_NO_CACHE_DIR=off \\\n    PIP_DISABLE_PIP_VERSION_CHECK=on \\\n    PIP_DEFAULT_TIMEOUT=100 \\\n    POETRY_VERSION=${POETRY_VERSION} \\\n    POETRY_HOME=\"/opt/poetry\" \\\n    PYTHONUNBUFFERED=1 \\\n    PYTHONDONTWRITEBYTECODE=1 \\\n    PYTHONPATH=/application_root \\\n    POETRY_VIRTUALENVS_IN_PROJECT=true \\\n    POETRY_CACHE_DIR=\"/application_root/.cache\" \\\n    VIRTUAL_ENVIRONMENT_PATH=\"/application_root/.venv\" \\\n    APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT \\\n    PATH=\"/opt/poetry/bin:$PATH\"\n\n# 빌드 도구 설치\nRUN apt-get update \\\n    && apt-get install --no-install-recommends -y \\\n        build-essential\n\n# Poetry 설치\nRUN python -m venv ${POETRY_HOME}\nRUN ${POETRY_HOME}/bin/pip install -U pip setuptools\nRUN ${POETRY_HOME}/bin/pip install \"poetry==${POETRY_VERSION}\"\n\n# 사용자 생성\nRUN groupadd -g 1001 python_application && \\\n    useradd -r -u 1001 -g python_application python_application\n\nWORKDIR ${PYTHONPATH}\nCOPY . ${PYTHONPATH}\nRUN chown python_application:python_application ${PYTHONPATH}\n\nRUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR}\n\nEXPOSE ${APPLICATION_SERVER_PORT}\n\nCOPY ./docker/dev/entrypoint /entrypoint\nRUN sed -i 's/\\r$//g' /entrypoint\nRUN chmod +x /entrypoint\n\nUSER 1001\n\nRUN poetry install --without dev\n\nENTRYPOINT [\"/entrypoint\"]
    \n

    이걸로 만든 이미지의 크기를 살펴봅시다.

    \n
    docker images\nREPOSITORY          TAG                  IMAGE ID       CREATED          SIZE\npython-hello        slim-without-multi   f4be58bb8080   38 seconds ago   700MB
    \n

    멀티-스테이지가 있다면?

    \n

    반대로 멀티-스테이지를 추가해서 헬로글또를 찍어봅시다.

    \n
      \n
    1. 빌드 스테이지
    2. \n
    \n

    빌드 스테이지는 실제 필요한 내용들만을 설치합니다.

    \n
    ### ### ### ### ### ### ###\n# STAGE 0. Prerequisites  #\n### ### ### ### ### ### ###\nARG OFFICIAL_PYTHON_IMAGE=3.12\n\nFROM python:${OFFICIAL_PYTHON_IMAGE}-slim AS build-stage        # debian slim 이미지를 빌드 스테이지로 설정합시다.\nARG POETRY_VERSION=1.6.1                                        # 패키지 매니저로 poetry v1.6.1를 씁니다.\n\nENV PIP_NO_CACHE_DIR=off \\                                      # 최적화 옵션입니다. 자세한 것은 위의 GitHub 링크를 확인해주세요!\n    PIP_DISABLE_PIP_VERSION_CHECK=on \\\n    PIP_DEFAULT_TIMEOUT=100 \\\n    POETRY_VERSION=${POETRY_VERSION} \\\n    POETRY_HOME=\"/opt/poetry\"\n\nRUN apt-get update \\\n    && apt-get install --no-install-recommends -y build-essential \\   # 빌드에 필요한 핵심 내용들만 설치합니다.\n    && rm -rf /var/lib/apt/lists/*\n\n# https://python-poetry.org/docs/#installing-manually\nRUN python -m venv ${POETRY_HOME}                               # 가상환경을 구성하고, poetry를 설치합니다.\nRUN ${POETRY_HOME}/bin/pip install -U pip setuptools\nRUN ${POETRY_HOME}/bin/pip install \"poetry==${POETRY_VERSION}\"
    \n
      \n
    1. Run 스테이지
    2. \n
    \n
      \n
    • 실행환경을 구성하는 중간단계 입니다.
    • \n
    • 필요한 부분만을 복사하고, 빌드도구를 제외합니다.
    • \n
    \n
    ### ### ### ### ###\n# STAGE 1. 'run'  #\n### ### ### ### ###\nFROM python:${OFFICIAL_PYTHON_IMAGE}-slim AS run-stage\n\nENV PATH=\"/opt/poetry/bin:$PATH\"                    # 환경변수를 추가하여, poetry를 쓸 수 있게 구성합니다.\n\nCOPY --from=build-stage /opt/poetry /opt/poetry/    # build-stage에서 필요한 내용만 가져옵니다.
    \n
      \n
    1. Service 스테이지
    2. \n
    \n
      \n
    • 실제 애플리케이션이 구동될 환경을 구성합니다.
    • \n
    • 보안설정, 런타임에 필요한 의존성을 구성하고 서비스를 구동합니다.
    • \n
    • 구동 전 entrypoint 파일을 별도로 두고 이 파일을 entrypoint 로 구성합니다.
    • \n
    \n
    ### ### ### ### ### ###\n# STAGE 2. 'service'  #\n### ### ### ### ### ###\nFROM run-stage AS service-stage\n\nARG APPLICATION_SERVER_PORT=8000\n\n    # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED\nENV PYTHONUNBUFFERED=1 \\\n    # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE\n    PYTHONDONTWRITEBYTECODE=1 \\\n    PYTHONPATH=/application_root \\\n    # https://python-poetry.org/docs/configuration/#virtualenvsin-project\n    POETRY_VIRTUALENVS_IN_PROJECT=true \\\n    POETRY_CACHE_DIR=\"/application_root/.cache\" \\\n    VIRTUAL_ENVIRONMENT_PATH=\"/application_root/.venv\" \\\n    APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT\n\n# 가상환경이 먼저 실행될 수 있도록 PATH의 앞에 추가\n# https://docs.python.org/3/library/venv.html#how-venvs-work\nENV PATH=\"$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH\"\n\n# 권한분리를 위해 처리\nRUN groupadd -g 1001 python_application && \\\n    useradd -r -u 1001 -g python_application python_application\n\n# WORKDIR를 애플리케이션 루트 디렉터리로 지정\n# https://www.uvicorn.org/settings/#development\n# https://docs.docker.com/engine/reference/builder/#workdir\nWORKDIR ${PYTHONPATH}\nCOPY . ${PYTHONPATH}\nRUN chown python_application:python_application ${PYTHONPATH}\n\n# poetry 캐시 디렉터리를 만들고, 권한을 부여함. 링크 참조\n# https://python-poetry.org/docs/configuration/#cache-directory\nRUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR}\n\n# API 엔드포인트에 대해 문서화를 수행\n# https://docs.docker.com/engine/reference/builder/#expose\nEXPOSE ${APPLICATION_SERVER_PORT}\n\n# ENTRYPOINT로 사용할 파일에 대해 복사 후 내용 구성\nCOPY ./docker/dev/entrypoint /entrypoint\nRUN sed -i 's/\\r$//g' /entrypoint\nRUN chmod +x /entrypoint\n\n# 컨테이너 구동 시에 부여하는 권한을 명시함\nUSER 1001\n\n# poetry를 이용하여 의존성 설치\nRUN poetry install --without dev\n\n# Entrypoint 로 추가한 파일을 사용.\n# https://www.docker.com/blog/docker-best-practices-choosing-between-run-cmd-and-entrypoint/\nENTRYPOINT [\"/entrypoint\"]
    \n

    이렇게 되면 용량은 얼마나 줄어들까요?

    \n
    docker images\nREPOSITORY          TAG            IMAGE ID       CREATED          SIZE\npython-hello        slim-multi     4f8e4848dc55   27 minutes ago   324MB
    \n

    절반이나 줄어들었군요!

    \n

    step 2. 빌드 타임을 줄여봅시다

    \n

    멀티-스테이지는 빌드타임이 얼마나 걸리는지 살펴볼까요? 이번에는 외부 패키지를 추가로 설치해서 테스트 해봅시다.\n설치 대상은 pandasmatplotlib 입니다.

    \n
    docker build -t python-hello:slim-multi-2 --no-cache .\n[+] Building 45.6s (20/20) FINISHED                                                                                                    docker:desktop-linux\n => [internal] load build definition from Dockerfile                                                                                                   0.0s\n => => transferring dockerfile: 3.53kB                                                                                                                 0.0s\n => [internal] load metadata for docker.io/library/python:3.12-slim                                                                                    2.6s\n => [internal] load .dockerignore                                                                                                                      0.0s\n => => transferring context: 2B                                                                                                                        0.0s\n => [internal] load build context                                                                                                                      0.0s\n => => transferring context: 87.08kB                                                                                                                   0.0s\n => [build-stage 1/5] FROM docker.io/library/python:3.12-slim@sha256:032c52613401895aa3d418a4c563d2d05f993bc3ecc065c8f4e2280978acd249                  5.6s\n(생략)\n => [build-stage 2/5] RUN apt-get update     && apt-get install --no-install-recommends -y build-essential     && rm -rf /var/lib/apt/lists/*          12.4s\n => [build-stage 3/5] RUN python -m venv /opt/poetry                                                                                                   1.9s \n => [build-stage 4/5] RUN /opt/poetry/bin/pip install -U pip setuptools                                                                                1.1s \n => [build-stage 5/5] RUN /opt/poetry/bin/pip install \"poetry==1.6.1\"                                                                                  5.1s \n => [run-stage 2/2] COPY --from=build-stage /opt/poetry /opt/poetry/                                                                                   0.2s\n => [service-stage 1/9] RUN groupadd -g 1001 python_application &&     useradd -r -u 1001 -g python_application python_application                     0.2s\n => [service-stage 2/9] WORKDIR /application_root                                                                                                      0.0s\n => [service-stage 3/9] COPY . /application_root                                                                                                       0.0s\n => [service-stage 4/9] RUN chown python_application:python_application /application_root                                                              0.1s\n => [service-stage 5/9] RUN mkdir /application_root/.cache && chown python_application:python_application /application_root/.cache                     0.1s\n => [service-stage 6/9] COPY entrypoint /entrypoint                                                                                                    0.0s\n => [service-stage 7/9] RUN sed -i 's/\\r$//g' /entrypoint                                                                                              0.1s\n => [service-stage 8/9] RUN chmod +x /entrypoint                                                                                                       0.1s\n => [service-stage 9/9] RUN poetry install --without dev                                                                                               7.4s\n => exporting to image                                                                                                                                 8.3s\n => => exporting layers                                                                                                                                6.5s\n => => exporting manifest sha256:2e1a026e67ea60a968a576838692cc7661011085b146d3b94bff86e21c10fedd                                                      0.0s\n => => exporting config sha256:f7b5913e1edb9f4566cd1bf1c1f32e0baa757f9fae90fea096917d7241a0fd6d                                                        0.0s\n => => exporting attestation manifest sha256:6482e53034c92e947f0c26372d5a0fc24e24d510ec9a4a5c5ff6901310ef5263                                          0.0s\n => => exporting manifest list sha256:a23299c55409341354951e7931f8bf1f38137fd21391853773255b17062c1c0f                                                 0.0s\n => => naming to docker.io/library/python-hello:slim-multi-2                                                                                           0.0s\n => => unpacking to docker.io/library/python-hello:slim-multi-2                                                                                        1.8s
    \n

    그렇다면, alpine 베이스 이미지로 빌드를 수행해봅시다.

    \n
    docker build -t python-hello:alpine-multi-2 --no-cache .\n[+] Building 90.4s (21/21) FINISHED                                                                                                     docker:desktop-linux\n => [internal] load build definition from Dockerfile                                                                                                    0.0s\n => => transferring dockerfile: 2.18kB                                                                                                                  0.0s\n => [internal] load metadata for docker.io/library/python:3.12-alpine                                                                                   1.4s\n => [internal] load .dockerignore                                                                                                                       0.0s\n => => transferring context: 2B                                                                                                                         0.0s\n => [internal] load build context                                                                                                                       0.0s\n => => transferring context: 85.72kB                                                                                                                    0.0s\n => [build-stage 1/5] FROM docker.io/library/python:3.12-alpine@sha256:38e179a0f0436c97ecc76bcd378d7293ab3ee79e4b8c440fdc7113670cb6e204                 2.3s\n(생략)\n => [build-stage 2/5] RUN apk add --no-cache     gcc     python3-dev                                                                                   12.1s\n => [build-stage 3/5] RUN python -m venv /opt/poetry                                                                                                    2.2s \n => [build-stage 4/5] RUN /opt/poetry/bin/pip install -U pip setuptools                                                                                 1.3s \n => [build-stage 5/5] RUN /opt/poetry/bin/pip install \"poetry==1.6.1\"                                                                                   5.7s \n => [run-stage 2/2] COPY --from=build-stage /opt/poetry /opt/poetry/                                                                                    0.2s\n => [service-stage  1/10] RUN addgroup -g 1001 -S python_application &&     adduser -S -u 1001 -G python_application python_application                 0.1s\n => [service-stage  2/10] WORKDIR /application_root                                                                                                     0.0s\n => [service-stage  3/10] COPY . /application_root                                                                                                      0.0s\n => [service-stage  4/10] RUN chown python_application:python_application /application_root                                                             0.1s\n => [service-stage  5/10] RUN mkdir /application_root/.cache && chown python_application:python_application /application_root/.cache                    0.2s\n => [service-stage  6/10] COPY entrypoint /entrypoint                                                                                                   0.0s\n => [service-stage  7/10] RUN sed -i 's/\\r$//' /entrypoint                                                                                              0.2s\n => [service-stage  8/10] RUN chmod +x /entrypoint                                                                                                      0.1s\n => [service-stage  9/10] RUN apk add --no-cache     g++     openssl                                                                                    8.2s\n => [service-stage 10/10] RUN poetry install --without dev                                                                                             44.2s\n => exporting to image                                                                                                                                 11.8s```\n => => exporting layers                                                                                                                                 9.2s\n => => exporting manifest sha256:6b7bcd80340bf252c06947fde85a4fb53012c3d8bb07ff6dfd3a8b6fe6d1022c                                                       0.0s\n => => exporting config sha256:58c4058d992779af8b0e3aa67ceabd655d234d871e38af0e6996155a56ed953e                                                         0.0s\n => => exporting attestation manifest sha256:e88ed3098ce10fbce9ed2452c82ada1f5ccccb7c9d094b6f2da495754249db26                                           0.0s\n => => exporting manifest list sha256:b0b8cc043f1436abf29e9b45bcbcf618d0838de9d1678086c9b2b5acc1541e9b                                                  0.0s\n => => naming to docker.io/library/python-hello:alpine-multi-2                                                                                          0.0s\n => => unpacking to docker.io/library/python-hello:alpine-multi-2                                                                                       2.6s
    \n

    빌드 시간과 크기에 대해 한번 살펴보죠.

    \n
    docker images\nREPOSITORY     TAG              IMAGE ID       CREATED         SIZE\npython-hello   alpine-multi-2   b0b8cc043f14   2 minutes ago   1.13GB\npython-hello   slim-multi-2     a23299c55409   3 minutes ago   755MB
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    베이스이미지빌드된 이미지 크기소요시간(단위: 초)
    debian slim755 MB45.6
    alpine1.13 GB90.4
    \n
      \n
    • debian 베이스 이미지는 용량, 소요시간 측면 모두에서 안정적이었습니다.
    • \n
    • alpine 베이스 이미지는 빌드시간 자체도 늦고, 크기도 커졌습니다.
    • \n
    \n

    그렇다면 alpine 베이스 이미지는 사용할 수 없는 걸까요? 왜 그런건지 알아보기에 앞서, 앞서 알아봅시다.

    \n

    C 라이브러리 구현체와 빌드의 차이

    \n

    그렇다면 앞서 alpine linux 배포판과 debian 배포판의 차이를 알아봅시다. 이 글에서 살펴볼 둘의 주요 차이점은 C 라이브러리 구현체의 선택입니다. 각각의 특징을 살펴보겠습니다:

    \n

    glibc (Debian 계열)

    \n
      \n
    • 리눅스 생태계의 사실상 표준 구현체입니다
    • \n
    • 대부분의 파이썬 패키지가 glibc 기준으로 빌드되어있으니, 안정성과 호환성이 검증되어 있습니다.
    • \n
    • 그런 이유로 베이스 이미지 크기가 상대적으로 큽니다
    • \n
    \n

    musl (Alpine Linux)

    \n
      \n
    • 경량화된 C 라이브러리 구현체입니다
    • \n
    • 단순한 구현으로 보안 공격 표면이 작습니다
    • \n
    • 베이스 이미지 크기가 매우 작습니다 (Debian 대비 약 1/20)
    • \n
    • 일부 바이너리와 호환성 이슈가 발생할 수 있습니다
    • \n
    \n

    Python Wheels의 발전과 Alpine Linux 지원

    \n

    과거에는 Alpine Linux에서 많은 파이썬 패키지를 설치할 때 소스로부터 직접 빌드해야 했고, 이는 컨테이너 빌드 시간을 길어지게 하는 주요 요소였습니다. 하지만 Python 패키징 생태계의 발전으로 상황이 크게 개선되었습니다.

    \n

    Python 패키징의 발전 과정

    \n

    다양한 배포판에서 파이썬 패키지를 바로 설치할 수 있도록 하기 위해, 아래와 같은 PEP가 지속적으로 제안되어 왔고 또 받아들여졌습니다.

    \n
      \n
    1. PEP 513 (manylinux1): 최초의 호환성 있는 Linux wheel 표준 도입
    2. \n
    3. PEP 571 (manylinux2010): glibc 2.12 기반 호환성 확장
    4. \n
    5. PEP 599 (manylinux2014): 더 새로운 시스템 라이브러리 지원
    6. \n
    7. PEP 600 (Future manylinux): 향후 확장성을 고려한 태그 체계 도입
    8. \n
    9. PEP 656 (musllinux): Alpine Linux 등 musl 기반 배포판 공식 지원
    10. \n
    \n

    PEP 656이 accept 되며, musl 기반의 빌드가 이루어진 파이썬 패키지도 직접 다운로드 받게 되어, 이를 지원하고 빌드한 라이브러리라면 누구나 쓸 수 있게 되었습니다.

    \n

    manylinux?

    \n

    manylinux는 “Python wheels that work on any linux (almost).” 라는 목표를 가지고 다양한 배포판을 타겟으로 빌드하기 위해 시작된 프로젝트 입니다. 원하는 리눅스 배포판에서 라이브러리를 빌드없이 직접 다운로드 받아 쓸 수 있도록 규약을 잡기 시작한 것이라고 이해할 수 있지요(manylinux 링크에서 발췌하였습니다).

    \n
    manylinux\n---\n\nOlder archives: https://groups.google.com/forum/#!forum/manylinux-discuss\n\nThe goal of the manylinux project is to provide a convenient way to distribute binary Python extensions as wheels on Linux. This effort has produced PEP 513 (manylinux1), PEP 571 (manylinux2010), PEP 599 (manylinux2014), PEP 600 (manylinux_x_y) and PEP 656 (musllinux_x_y).
    \n

    PEP 656의 의의

    \n

    Alpine linux와 관련해서는 PEP 656(Platform Tag for Linux Distributions Using Musl)은 위 PEP의 연장선상이라 할 수 있지요. 이 표준이 받아들여지면서, musl 기반의 빌드된 wheel을 배포자가 업데이트 하면 사용자가 즉시 설치할 수 있게 된 것입니다. 이로 인해 alpine linux 기반의 베이스 이미지를 선택해도 빌드 시간 단축 및 의존성 문제를 해결할 수 있게 된 겁니다.

    \n

    이로인해 Alpine 베이스 파이썬 컨테이너를 선택하더라도 빌드 시간 단축과 이미지 크기 최적화의 이점을 누릴 수 있게 되었습니다. 특히 PEP 656 도입 이후에는 많은 패키지가 musllinux wheel을 제공하고 있고, 코어 로직이 Rust로 짜여진 파이썬 패키지들은 크로스플랫폼을 쉽게 지원하기 때문에 이런 부분에서도 선택에 제약이 크게 없습니다.

    \n

    마지막으로

    \n

    그렇지만 여전히 의문입니다. 그러면 언제, 어떤 시기에 적절한 베이스 이미지를 선택하면 될까요? 무턱대고 고르기에는 아무래도 의심이 듭니다. 간단하게나마 있을법한 일을 검증해보고 적절한지 예시 데이터를 보면 더욱 안심이겠죠. 그래서 다음장에는 아래의 상황에서 어떤 베이스 이미지가 좋은지 함께 살펴볼 예정입니다.

    \n
      \n
    • I/O bound 태스크 중심: API 서비스를 만들고, DB에는 1억개의 데이터을 추가한 후, 쿼리 테스트 및 부하 테스트를 수행하여 성능을 리포트
    • \n
    • CPU bound 태스크 중심: 매우 큰 데이터를 pandas로 처리, matplotlib으로 연산하게 구성해보고 성능을 리포트
    • \n
    \n

    긴 글 읽어주셔서 감사합니다.

    \n
    \n
    \n
      \n
    1. 패키지(이 글에서는 파이썬 패키지를 의미)는 pip 등으로 설치할 수 있는 외부 모듈의 모음을 의미합니다. 쉽게 말하자면 파이썬 라이브러리라고 할 수 있지요.
    2. \n
    \n
    ","fields":{"slug":"/devlog/python/2024-10-26---python-container-101-pt02//devlog/python/2024-10-26-python-container-101-pt02","tagSlugs":["/tag/python/","/tag/geultto/"]},"frontmatter":{"date":"2024-10-26T05:08:00.000Z","description":"컨테이너 사이즈 최소화의 필요성과, 최소화 과정 중 파이썬 라이브러리 설치 과정에서의 최적화 제안(PEP 656)을 소개합니다.","tags":["python","geultto"],"title":"[연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화","socialImage":{"publicURL":{"publicURL":"/static/f362749d11992f125f0cdfe8205b50ef/sangdo-dong.jpg"}}}}},"pageContext":{"slug":"/devlog/python/2024-10-26---python-container-101-pt02//devlog/python/2024-10-26-python-container-101-pt02"}},"staticQueryHashes":["251939775","357378587","401334301"]} \ No newline at end of file diff --git a/page-data/index/page-data.json b/page-data/index/page-data.json index d81daac0..d5e6a6d2 100644 --- a/page-data/index/page-data.json +++ b/page-data/index/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":null,"slug":"/devlog/python/2024-10-13---python-container-101//devlog/python/2024-10-13-python-container-101-pt01"},"frontmatter":{"description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","category":null,"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","date":"2024-10-13T03:00:00.000Z","slug":"/devlog/python/2024-10-13-python-container-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2024-09-17---geultto-10th-life-retrospect//retrospect/2024-09-17-geultto-10th-life-retrospect"},"frontmatter":{"description":"글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.","category":"retrospect","title":"[글또10기] 삶의 지도","date":"2024-09-17T01:01:00.000Z","slug":"/retrospect/2024-09-17-geultto-10th-life-retrospect"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-07-04---pt02-ch04//books/unit-testing/2023-07-04-pt02-ch04"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.","category":"books","title":"단위 테스트 (4)","date":"2023-07-04T19:08:04.000Z","slug":"/books/unit-testing/2023-07-04-pt02-ch04"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-07-01---pt01-ch03//books/unit-testing/2023-07-01-pt01-ch03"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.","category":"books","title":"단위 테스트 (3)","date":"2023-07-01T00:44:02.000Z","slug":"/books/unit-testing/2023-07-01-pt01-ch03"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-06-30---pt01-ch02//books/unit-testing/2023-06-30-pt01-ch02"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.","category":"books","title":"단위 테스트 (2)","date":"2023-06-30T20:36:32.000Z","slug":"/books/unit-testing/2023-06-30-pt01-ch02"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-06-28---pt01-ch01//books/unit-testing/2023-06-28-pt01-ch01"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.","category":"books","title":"단위 테스트 (1)","date":"2023-06-28T02:31:14.000Z","slug":"/books/unit-testing/2023-06-28-pt01-ch01"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-18---pt02-ch12//books/cosmic-python/2023-05-18-pt02-ch12"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (12)","date":"2023-05-18T17:44:06.000Z","slug":"/books/cosmic-python/2023-05-18-pt02-ch12"}}}]}},"pageContext":{"limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/","nextPagePath":"/page/1","hasNextPage":true,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":null,"slug":"/devlog/python/2024-10-26---python-container-101-pt02//devlog/python/2024-10-26-python-container-101-pt02"},"frontmatter":{"description":"컨테이너 사이즈 최소화의 필요성과, 최소화 과정 중 파이썬 라이브러리 설치 과정에서의 최적화 제안(PEP 656)을 소개합니다.","category":null,"title":"[연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화","date":"2024-10-26T05:08:00.000Z","slug":"/devlog/python/2024-10-26-python-container-101-pt02"}}},{"node":{"fields":{"categorySlug":null,"slug":"/devlog/python/2024-10-13---python-container-101-pt01//devlog/python/2024-10-13-python-container-101-pt01"},"frontmatter":{"description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","category":null,"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","date":"2024-10-13T03:00:00.000Z","slug":"/devlog/python/2024-10-13-python-container-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2024-09-17---geultto-10th-life-retrospect//retrospect/2024-09-17-geultto-10th-life-retrospect"},"frontmatter":{"description":"글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.","category":"retrospect","title":"[글또10기] 삶의 지도","date":"2024-09-17T01:01:00.000Z","slug":"/retrospect/2024-09-17-geultto-10th-life-retrospect"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-07-04---pt02-ch04//books/unit-testing/2023-07-04-pt02-ch04"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.","category":"books","title":"단위 테스트 (4)","date":"2023-07-04T19:08:04.000Z","slug":"/books/unit-testing/2023-07-04-pt02-ch04"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-07-01---pt01-ch03//books/unit-testing/2023-07-01-pt01-ch03"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.","category":"books","title":"단위 테스트 (3)","date":"2023-07-01T00:44:02.000Z","slug":"/books/unit-testing/2023-07-01-pt01-ch03"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-06-30---pt01-ch02//books/unit-testing/2023-06-30-pt01-ch02"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.","category":"books","title":"단위 테스트 (2)","date":"2023-06-30T20:36:32.000Z","slug":"/books/unit-testing/2023-06-30-pt01-ch02"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/unit-testing/2023-06-28---pt01-ch01//books/unit-testing/2023-06-28-pt01-ch01"},"frontmatter":{"description":"단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.","category":"books","title":"단위 테스트 (1)","date":"2023-06-28T02:31:14.000Z","slug":"/books/unit-testing/2023-06-28-pt01-ch01"}}}]}},"pageContext":{"limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/","nextPagePath":"/page/1","hasNextPage":true,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/1/page-data.json b/page-data/page/1/page-data.json index 427dc68a..684a4a09 100644 --- a/page-data/page/1/page-data.json +++ b/page-data/page/1/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/1","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-18---pt02-ch11//books/cosmic-python/2023-05-18-pt02-ch10"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (11)","date":"2023-05-18T03:41:09.000Z","slug":"/books/cosmic-python/2023-05-18-pt02-ch10"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-07---pt02-ch10//books/cosmic-python/2023-05-07-pt02-ch10"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (10)","date":"2023-05-07T18:41:36.000Z","slug":"/books/cosmic-python/2023-05-07-pt02-ch10"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-06---pt02-ch09//books/cosmic-python/2023-05-06-pt02-ch09"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (9)","date":"2023-05-06T04:24:59.000Z","slug":"/books/cosmic-python/2023-05-06-pt02-ch09"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-17---pt02-ch08//books/cosmic-python/2023-04-17-pt02-ch08"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (8)","date":"2023-04-17T19:22:59.001Z","slug":"/books/cosmic-python/2023-04-17-pt02-ch08"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-17---pt01-ch07//books/cosmic-python/2023-04-17-pt01-ch07"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (7)","date":"2023-04-17T19:22:59.000Z","slug":"/books/cosmic-python/2023-04-17-pt01-ch07"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-16---pt01-ch06//books/cosmic-python/2023-04-16-pt01-ch06"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (6)","date":"2023-04-16T19:09:45.000Z","slug":"/books/cosmic-python/2023-04-16-pt01-ch06"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-16---pt01-ch05//books/cosmic-python/2023-04-16-pt01-ch05"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (5)","date":"2023-04-16T03:26:01.000Z","slug":"/books/cosmic-python/2023-04-16-pt01-ch05"}}}]}},"pageContext":{"limit":7,"offset":7,"pagination":{"currentPage":1,"prevPagePath":"/","nextPagePath":"/page/2","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/1","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-18---pt02-ch12//books/cosmic-python/2023-05-18-pt02-ch12"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (12)","date":"2023-05-18T17:44:06.000Z","slug":"/books/cosmic-python/2023-05-18-pt02-ch12"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-18---pt02-ch11//books/cosmic-python/2023-05-18-pt02-ch10"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (11)","date":"2023-05-18T03:41:09.000Z","slug":"/books/cosmic-python/2023-05-18-pt02-ch10"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-07---pt02-ch10//books/cosmic-python/2023-05-07-pt02-ch10"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (10)","date":"2023-05-07T18:41:36.000Z","slug":"/books/cosmic-python/2023-05-07-pt02-ch10"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-05-06---pt02-ch09//books/cosmic-python/2023-05-06-pt02-ch09"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (9)","date":"2023-05-06T04:24:59.000Z","slug":"/books/cosmic-python/2023-05-06-pt02-ch09"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-17---pt02-ch08//books/cosmic-python/2023-04-17-pt02-ch08"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (8)","date":"2023-04-17T19:22:59.001Z","slug":"/books/cosmic-python/2023-04-17-pt02-ch08"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-17---pt01-ch07//books/cosmic-python/2023-04-17-pt01-ch07"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (7)","date":"2023-04-17T19:22:59.000Z","slug":"/books/cosmic-python/2023-04-17-pt01-ch07"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-16---pt01-ch06//books/cosmic-python/2023-04-16-pt01-ch06"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (6)","date":"2023-04-16T19:09:45.000Z","slug":"/books/cosmic-python/2023-04-16-pt01-ch06"}}}]}},"pageContext":{"limit":7,"offset":7,"pagination":{"currentPage":1,"prevPagePath":"/","nextPagePath":"/page/2","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/10/page-data.json b/page-data/page/10/page-data.json new file mode 100644 index 00000000..d36dd15f --- /dev/null +++ b/page-data/page/10/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/10","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-21---pt01//books/pragmatic-programmer-1st/2018-02-21-pt01"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 1","category":"books","title":"실용주의 프로그래머 pt. 1","date":"2018-02-21T00:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-21-pt01"}}}]}},"pageContext":{"limit":7,"offset":70,"pagination":{"currentPage":10,"prevPagePath":"/page/9","nextPagePath":"/page/11","hasNextPage":false,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/2/page-data.json b/page-data/page/2/page-data.json index c721c530..d2932052 100644 --- a/page-data/page/2/page-data.json +++ b/page-data/page/2/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/2","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-15---pt01-ch04//books/cosmic-python/2023-04-15-pt01-ch04"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (4)","date":"2023-04-15T22:19:24.000Z","slug":"/books/cosmic-python/2023-04-15-pt01-ch04"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-13---pt01-ch03//books/cosmic-python/2023-04-13-pt01-ch03"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (3)","date":"2023-04-13T22:51:20.000Z","slug":"/books/cosmic-python/2023-04-13-pt01-ch03"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-13---pt01-ch02//books/cosmic-python/2023-04-13-pt01-ch02"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (2)","date":"2023-04-13T20:44:23.000Z","slug":"/books/cosmic-python/2023-04-13-pt01-ch02"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-11---pt01-ch01//books/cosmic-python/2023-04-11-pt01-ch01"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (1)","date":"2023-04-11T17:55:00.000Z","slug":"/books/cosmic-python/2023-04-11-pt01-ch01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2023-03-13---from-servlet-to-spring//devlog/docker/2023-03-13-from-servlet-to-spring"},"frontmatter":{"description":"PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.","category":"devlog","title":"서블릿부터 스프링 프레임워크까지","date":"2023-03-13T23:00:00.000Z","slug":"/devlog/docker/2023-03-13-from-servlet-to-spring"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-03-06---chatper13//books/clean-code/2023-03-07-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (13): 동시성(Concurrency)","date":"2023-03-07T22:51:00.000Z","slug":"/books/clean-code/2023-03-07-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-24---chapter12//books/clean-code/2023-02-24-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (12): 창발성(Emergence)","date":"2023-02-24T22:51:00.000Z","slug":"/books/clean-code/2023-02-24-pt01"}}}]}},"pageContext":{"limit":7,"offset":14,"pagination":{"currentPage":2,"prevPagePath":"/page/1","nextPagePath":"/page/3","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/2","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-16---pt01-ch05//books/cosmic-python/2023-04-16-pt01-ch05"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (5)","date":"2023-04-16T03:26:01.000Z","slug":"/books/cosmic-python/2023-04-16-pt01-ch05"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-15---pt01-ch04//books/cosmic-python/2023-04-15-pt01-ch04"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (4)","date":"2023-04-15T22:19:24.000Z","slug":"/books/cosmic-python/2023-04-15-pt01-ch04"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-13---pt01-ch03//books/cosmic-python/2023-04-13-pt01-ch03"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (3)","date":"2023-04-13T22:51:20.000Z","slug":"/books/cosmic-python/2023-04-13-pt01-ch03"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-13---pt01-ch02//books/cosmic-python/2023-04-13-pt01-ch02"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (2)","date":"2023-04-13T20:44:23.000Z","slug":"/books/cosmic-python/2023-04-13-pt01-ch02"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/cosmic-python/2023-04-11---pt01-ch01//books/cosmic-python/2023-04-11-pt01-ch01"},"frontmatter":{"description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.","category":"books","title":"파이썬으로 살펴보는 아키텍처 패턴 (1)","date":"2023-04-11T17:55:00.000Z","slug":"/books/cosmic-python/2023-04-11-pt01-ch01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2023-03-13---from-servlet-to-spring//devlog/docker/2023-03-13-from-servlet-to-spring"},"frontmatter":{"description":"PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.","category":"devlog","title":"서블릿부터 스프링 프레임워크까지","date":"2023-03-13T23:00:00.000Z","slug":"/devlog/docker/2023-03-13-from-servlet-to-spring"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-03-06---chatper13//books/clean-code/2023-03-07-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (13): 동시성(Concurrency)","date":"2023-03-07T22:51:00.000Z","slug":"/books/clean-code/2023-03-07-pt01"}}}]}},"pageContext":{"limit":7,"offset":14,"pagination":{"currentPage":2,"prevPagePath":"/page/1","nextPagePath":"/page/3","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/3/page-data.json b/page-data/page/3/page-data.json index c36e2972..0f56e8ce 100644 --- a/page-data/page/3/page-data.json +++ b/page-data/page/3/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/3","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2023-02-20---assignment-pt02//retrospect/2023-02-20-assignment-pt02"},"frontmatter":{"description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.","category":"retrospect","title":"2023년 과제형 코딩 테스트 후기 (2)","date":"2023-02-20T18:01:00.000Z","slug":"/retrospect/2023-02-20-assignment-pt02"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2023-02-20---assignment-pt01//retrospect/2023-02-20-assignment-pt01"},"frontmatter":{"description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.","category":"retrospect","title":"2023년 과제형 코딩 테스트 후기 (1)","date":"2023-02-20T16:38:00.000Z","slug":"/retrospect/2023-02-20-assignment-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-17---chapter11//books/clean-code/2023-02-17-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (11): 시스템","date":"2023-02-17T22:51:00.000Z","slug":"/books/clean-code/2023-02-17-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-10---chapter10//books/clean-code/2023-02-10-pt10"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.","category":"devlog","title":"클린 코드 스터디 (10): 클래스","date":"2023-02-10T22:55:00.000Z","slug":"/books/clean-code/2023-02-10-pt10"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-10---chapter09//books/clean-code/2023-02-10-pt09"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.","category":"devlog","title":"클린 코드 스터디 (9): 단위 테스트","date":"2023-02-10T22:51:00.000Z","slug":"/books/clean-code/2023-02-10-pt09"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-03---chapter08//books/clean-code/2023-02-03-pt08"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (8): 경계","date":"2023-02-03T22:53:00.000Z","slug":"/books/clean-code/2023-02-03-pt08"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-03---chapter07//books/clean-code/2023-02-03-pt07"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (7): 오류 처리","date":"2023-02-03T22:51:00.000Z","slug":"/books/clean-code/2023-02-03-pt07"}}}]}},"pageContext":{"limit":7,"offset":21,"pagination":{"currentPage":3,"prevPagePath":"/page/2","nextPagePath":"/page/4","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/3","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-24---chapter12//books/clean-code/2023-02-24-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (12): 창발성(Emergence)","date":"2023-02-24T22:51:00.000Z","slug":"/books/clean-code/2023-02-24-pt01"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2023-02-20---assignment-pt02//retrospect/2023-02-20-assignment-pt02"},"frontmatter":{"description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.","category":"retrospect","title":"2023년 과제형 코딩 테스트 후기 (2)","date":"2023-02-20T18:01:00.000Z","slug":"/retrospect/2023-02-20-assignment-pt02"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2023-02-20---assignment-pt01//retrospect/2023-02-20-assignment-pt01"},"frontmatter":{"description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.","category":"retrospect","title":"2023년 과제형 코딩 테스트 후기 (1)","date":"2023-02-20T16:38:00.000Z","slug":"/retrospect/2023-02-20-assignment-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-17---chapter11//books/clean-code/2023-02-17-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (11): 시스템","date":"2023-02-17T22:51:00.000Z","slug":"/books/clean-code/2023-02-17-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-10---chapter10//books/clean-code/2023-02-10-pt10"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.","category":"devlog","title":"클린 코드 스터디 (10): 클래스","date":"2023-02-10T22:55:00.000Z","slug":"/books/clean-code/2023-02-10-pt10"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-10---chapter09//books/clean-code/2023-02-10-pt09"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.","category":"devlog","title":"클린 코드 스터디 (9): 단위 테스트","date":"2023-02-10T22:51:00.000Z","slug":"/books/clean-code/2023-02-10-pt09"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-03---chapter08//books/clean-code/2023-02-03-pt08"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (8): 경계","date":"2023-02-03T22:53:00.000Z","slug":"/books/clean-code/2023-02-03-pt08"}}}]}},"pageContext":{"limit":7,"offset":21,"pagination":{"currentPage":3,"prevPagePath":"/page/2","nextPagePath":"/page/4","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/4/page-data.json b/page-data/page/4/page-data.json index 33e838de..5cbeda3f 100644 --- a/page-data/page/4/page-data.json +++ b/page-data/page/4/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/4","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-27---chapter06//books/clean-code/2023-01-27-pt06"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (6): 객체와 자료구조","date":"2023-01-27T23:11:00.000Z","slug":"/books/clean-code/2023-01-27-pt06"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-27---chapter05//books/clean-code/2023-01-27-pt05"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.","category":"devlog","title":"클린 코드 스터디 (5): 형식 맞추기","date":"2023-01-27T22:51:00.000Z","slug":"/books/clean-code/2023-01-27-pt05"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01//devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01"},"frontmatter":{"description":"PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.","category":"devlog","title":"PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)","date":"2023-01-22T23:57:00.000Z","slug":"/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-13---chapter04//books/clean-code/2023-01-13-pt04"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (4): 주석","date":"2023-01-13T22:52:00.000Z","slug":"/books/clean-code/2023-01-13-pt04"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-13---chapter03//books/clean-code/2023-01-13-pt03"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (3): 함수","date":"2023-01-13T22:51:00.000Z","slug":"/books/clean-code/2023-01-13-pt03"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-06---chapter02//books/clean-code/2023-01-06-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (2): 의미있는 코드","date":"2023-01-06T22:59:00.000Z","slug":"/books/clean-code/2023-01-06-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-06---chapter01//books/clean-code/2023-01-06-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (1): 깨끗한 코드","date":"2023-01-06T22:51:00.000Z","slug":"/books/clean-code/2023-01-06-pt01"}}}]}},"pageContext":{"limit":7,"offset":28,"pagination":{"currentPage":4,"prevPagePath":"/page/3","nextPagePath":"/page/5","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/4","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-02-03---chapter07//books/clean-code/2023-02-03-pt07"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (7): 오류 처리","date":"2023-02-03T22:51:00.000Z","slug":"/books/clean-code/2023-02-03-pt07"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-27---chapter06//books/clean-code/2023-01-27-pt06"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (6): 객체와 자료구조","date":"2023-01-27T23:11:00.000Z","slug":"/books/clean-code/2023-01-27-pt06"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-27---chapter05//books/clean-code/2023-01-27-pt05"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.","category":"devlog","title":"클린 코드 스터디 (5): 형식 맞추기","date":"2023-01-27T22:51:00.000Z","slug":"/books/clean-code/2023-01-27-pt05"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01//devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01"},"frontmatter":{"description":"PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.","category":"devlog","title":"PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)","date":"2023-01-22T23:57:00.000Z","slug":"/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-13---chapter04//books/clean-code/2023-01-13-pt04"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (4): 주석","date":"2023-01-13T22:52:00.000Z","slug":"/books/clean-code/2023-01-13-pt04"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-13---chapter03//books/clean-code/2023-01-13-pt03"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (3): 함수","date":"2023-01-13T22:51:00.000Z","slug":"/books/clean-code/2023-01-13-pt03"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-06---chapter02//books/clean-code/2023-01-06-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.","category":"devlog","title":"클린 코드 스터디 (2): 의미있는 코드","date":"2023-01-06T22:59:00.000Z","slug":"/books/clean-code/2023-01-06-pt01"}}}]}},"pageContext":{"limit":7,"offset":28,"pagination":{"currentPage":4,"prevPagePath":"/page/3","nextPagePath":"/page/5","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/5/page-data.json b/page-data/page/5/page-data.json index 792bd988..b2d2c80b 100644 --- a/page-data/page/5/page-data.json +++ b/page-data/page/5/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/5","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2023-01-04---gatsby-add-image-captions//tips/2023-01-04-gatsby-add-image-captions"},"frontmatter":{"description":"Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.","category":"tips","title":"Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)","date":"2023-01-04T16:35:00.000Z","slug":"/tips/2023-01-04-gatsby-add-image-captions"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2023-01-02---total-commander-101-pt02//tips/2023-01-02-total-commander-101-pt02"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.","category":"tips","title":"토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기","date":"2023-01-02T13:07:29.000Z","slug":"/tips/2023-01-02-total-commander-101-pt02"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2022-12-30---total-commander-101-pt01//tips/2022-12-30-total-commander-101-pt01"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.","category":"tips","title":"토탈 커맨더 입문기 (1) 기본기","date":"2022-12-30T11:43:07.000Z","slug":"/tips/2022-12-30-total-commander-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt09//devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09"},"frontmatter":{"description":"Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers","date":"2022-12-12T05:50:00.000Z","slug":"/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt08//devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08"},"frontmatter":{"description":"Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드","date":"2022-12-12T04:43:39.000Z","slug":"/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-12-10---cloudneta-terraform-101-pt07//devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07"},"frontmatter":{"description":"여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 7주차 - 총복습","date":"2022-12-10T19:34:00.000Z","slug":"/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-27---cloudneta-terraform-101-pt06//devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06"},"frontmatter":{"description":"Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform","date":"2022-11-27T22:19:00.000Z","slug":"/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06"}}}]}},"pageContext":{"limit":7,"offset":35,"pagination":{"currentPage":5,"prevPagePath":"/page/4","nextPagePath":"/page/6","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/5","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/books/clean-code/2023-01-06---chapter01//books/clean-code/2023-01-06-pt01"},"frontmatter":{"description":"2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.","category":"devlog","title":"클린 코드 스터디 (1): 깨끗한 코드","date":"2023-01-06T22:51:00.000Z","slug":"/books/clean-code/2023-01-06-pt01"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2023-01-04---gatsby-add-image-captions//tips/2023-01-04-gatsby-add-image-captions"},"frontmatter":{"description":"Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.","category":"tips","title":"Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)","date":"2023-01-04T16:35:00.000Z","slug":"/tips/2023-01-04-gatsby-add-image-captions"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2023-01-02---total-commander-101-pt02//tips/2023-01-02-total-commander-101-pt02"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.","category":"tips","title":"토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기","date":"2023-01-02T13:07:29.000Z","slug":"/tips/2023-01-02-total-commander-101-pt02"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2022-12-30---total-commander-101-pt01//tips/2022-12-30-total-commander-101-pt01"},"frontmatter":{"description":"OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.","category":"tips","title":"토탈 커맨더 입문기 (1) 기본기","date":"2022-12-30T11:43:07.000Z","slug":"/tips/2022-12-30-total-commander-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt09//devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09"},"frontmatter":{"description":"Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers","date":"2022-12-12T05:50:00.000Z","slug":"/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt08//devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08"},"frontmatter":{"description":"Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드","date":"2022-12-12T04:43:39.000Z","slug":"/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-12-10---cloudneta-terraform-101-pt07//devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07"},"frontmatter":{"description":"여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 7주차 - 총복습","date":"2022-12-10T19:34:00.000Z","slug":"/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07"}}}]}},"pageContext":{"limit":7,"offset":35,"pagination":{"currentPage":5,"prevPagePath":"/page/4","nextPagePath":"/page/6","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/6/page-data.json b/page-data/page/6/page-data.json index 556012c7..dafd61ed 100644 --- a/page-data/page/6/page-data.json +++ b/page-data/page/6/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/6","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-2//devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2"},"frontmatter":{"description":"Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문","date":"2022-11-19T23:52:57.000Z","slug":"/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-1//devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1"},"frontmatter":{"description":"Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문","date":"2022-11-16T03:37:57.000Z","slug":"/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-10---cloudneta-terraform-101-pt04//devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04"},"frontmatter":{"description":"Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여","date":"2022-11-10T04:11:57.000Z","slug":"/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-03---cloudneta-terraform-101-pt03//devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03"},"frontmatter":{"description":"Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안","date":"2022-11-03T21:09:10.000Z","slug":"/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-10-27---cloudneta-terraform-101-pt02//devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02"},"frontmatter":{"description":"Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습","date":"2022-10-27T18:11:00.000Z","slug":"/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-10-20---cloudneta-terraform-101-pt01//devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01"},"frontmatter":{"description":"Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초","date":"2022-10-20T16:34:00.000Z","slug":"/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02//devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02"},"frontmatter":{"description":"OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.","category":"devlog","title":"인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기","date":"2022-10-17T21:50:00.000Z","slug":"/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02"}}}]}},"pageContext":{"limit":7,"offset":42,"pagination":{"currentPage":6,"prevPagePath":"/page/5","nextPagePath":"/page/7","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/6","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-27---cloudneta-terraform-101-pt06//devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06"},"frontmatter":{"description":"Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform","date":"2022-11-27T22:19:00.000Z","slug":"/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-2//devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2"},"frontmatter":{"description":"Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문","date":"2022-11-19T23:52:57.000Z","slug":"/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-1//devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1"},"frontmatter":{"description":"Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문","date":"2022-11-16T03:37:57.000Z","slug":"/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-10---cloudneta-terraform-101-pt04//devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04"},"frontmatter":{"description":"Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여","date":"2022-11-10T04:11:57.000Z","slug":"/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-11-03---cloudneta-terraform-101-pt03//devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03"},"frontmatter":{"description":"Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안","date":"2022-11-03T21:09:10.000Z","slug":"/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-10-27---cloudneta-terraform-101-pt02//devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02"},"frontmatter":{"description":"Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습","date":"2022-10-27T18:11:00.000Z","slug":"/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/terraform/2022-10-20---cloudneta-terraform-101-pt01//devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01"},"frontmatter":{"description":"Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.","category":"devlog","title":"[CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초","date":"2022-10-20T16:34:00.000Z","slug":"/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01"}}}]}},"pageContext":{"limit":7,"offset":42,"pagination":{"currentPage":6,"prevPagePath":"/page/5","nextPagePath":"/page/7","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/7/page-data.json b/page-data/page/7/page-data.json index 4747e8e1..ee34537b 100644 --- a/page-data/page/7/page-data.json +++ b/page-data/page/7/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/7","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01//devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01"},"frontmatter":{"description":"API 서비스가 많이 나누어졌을 때, 인가에 대해 살펴보며 **인가** 에 사용되는 OAuth 2.0 스펙을 알아봅시다.","category":"devlog","title":"인가를 다시 살펴보다 (1) OAuth 2.0 개요와 프로토콜 소개","date":"2022-10-16T21:50:00.000Z","slug":"/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file//tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file"},"frontmatter":{"description":"EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.","category":"tips","title":"제발 한국인이라면 파일 끝에 엔터 칩시다","date":"2022-10-10T19:30:00.000Z","slug":"/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2022-10-08---meaning-of-z-in-shell-script//tips/2022-10-08-meaning-of-z-in-shell-script"},"frontmatter":{"description":"Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.","category":"tips","title":"Bash 스크립트의 문자열 비교에 대해 알아봅시다","date":"2022-10-08T19:30:00.000Z","slug":"/tips/2022-10-08-meaning-of-z-in-shell-script"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-05---considering-http-authn-pt02//devlog/backend/2022-10-05-considering-http-authn-pt02"},"frontmatter":{"description":"JWT의 사용방안과, 세션 쿠키처럼 사용하는 JWT 토큰 사용방식이 과연 타당한 쓰임새인지 살펴봅시다.","category":"devlog","title":"HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?","date":"2022-10-05T22:52:00.000Z","slug":"/devlog/backend/2022-10-05-considering-http-authn-pt02"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-05---considering-http-authn-pt01//devlog/backend/2022-10-05-considering-http-authn-pt01"},"frontmatter":{"description":"HTTP 기본 스펙을 이용한 기초적 인증부터 쿠키와 세션을, 그리고 갑자기 들불처럼 등장한 JWT이 뭔지까지만 살펴봅니다.","category":"devlog","title":"HTTP의 인증에 대해 (1) 인증의 발전사","date":"2022-10-05T22:51:00.000Z","slug":"/devlog/backend/2022-10-05-considering-http-authn-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/python/2022-06-10---python-descriptor-described//devlog/python/2022-06-10-python-descriptor-described"},"frontmatter":{"description":"Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.","category":"devlog","title":"Python의 디스크립터에 대해 (1): 이론","date":"2022-06-10T12:30:00.000Z","slug":"/devlog/python/2022-06-10-python-descriptor-described"}}},{"node":{"fields":{"categorySlug":null,"slug":"/devlog/python/2022-06-09---python-classmethod-and-staticmethod//devlog/python/2022-06-09-python-classmethod-and-staticmethod"},"frontmatter":{"description":"Python의 \"@classmethod\" 와 \"@staticmethod\"에 대해","category":null,"title":"\"@classmethod\" 와 \"@staticmethod\"에 대해","date":"2022-06-09T10:30:00.000Z","slug":"/devlog/python/2022-06-09-python-classmethod-and-staticmethod"}}}]}},"pageContext":{"limit":7,"offset":49,"pagination":{"currentPage":7,"prevPagePath":"/page/6","nextPagePath":"/page/8","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/7","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02//devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02"},"frontmatter":{"description":"OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.","category":"devlog","title":"인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기","date":"2022-10-17T21:50:00.000Z","slug":"/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01//devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01"},"frontmatter":{"description":"API 서비스가 많이 나누어졌을 때, 인가에 대해 살펴보며 **인가** 에 사용되는 OAuth 2.0 스펙을 알아봅시다.","category":"devlog","title":"인가를 다시 살펴보다 (1) OAuth 2.0 개요와 프로토콜 소개","date":"2022-10-16T21:50:00.000Z","slug":"/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file//tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file"},"frontmatter":{"description":"EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.","category":"tips","title":"제발 한국인이라면 파일 끝에 엔터 칩시다","date":"2022-10-10T19:30:00.000Z","slug":"/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2022-10-08---meaning-of-z-in-shell-script//tips/2022-10-08-meaning-of-z-in-shell-script"},"frontmatter":{"description":"Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.","category":"tips","title":"Bash 스크립트의 문자열 비교에 대해 알아봅시다","date":"2022-10-08T19:30:00.000Z","slug":"/tips/2022-10-08-meaning-of-z-in-shell-script"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-05---considering-http-authn-pt02//devlog/backend/2022-10-05-considering-http-authn-pt02"},"frontmatter":{"description":"JWT의 사용방안과, 세션 쿠키처럼 사용하는 JWT 토큰 사용방식이 과연 타당한 쓰임새인지 살펴봅시다.","category":"devlog","title":"HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?","date":"2022-10-05T22:52:00.000Z","slug":"/devlog/backend/2022-10-05-considering-http-authn-pt02"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/backend/2022-10-05---considering-http-authn-pt01//devlog/backend/2022-10-05-considering-http-authn-pt01"},"frontmatter":{"description":"HTTP 기본 스펙을 이용한 기초적 인증부터 쿠키와 세션을, 그리고 갑자기 들불처럼 등장한 JWT이 뭔지까지만 살펴봅니다.","category":"devlog","title":"HTTP의 인증에 대해 (1) 인증의 발전사","date":"2022-10-05T22:51:00.000Z","slug":"/devlog/backend/2022-10-05-considering-http-authn-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/python/2022-06-10---python-descriptor-described//devlog/python/2022-06-10-python-descriptor-described"},"frontmatter":{"description":"Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.","category":"devlog","title":"Python의 디스크립터에 대해 (1): 이론","date":"2022-06-10T12:30:00.000Z","slug":"/devlog/python/2022-06-10-python-descriptor-described"}}}]}},"pageContext":{"limit":7,"offset":49,"pagination":{"currentPage":7,"prevPagePath":"/page/6","nextPagePath":"/page/8","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/8/page-data.json b/page-data/page/8/page-data.json index abf6983b..a0858ec6 100644 --- a/page-data/page/8/page-data.json +++ b/page-data/page/8/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/8","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/docker/2021-09-18---how-to-make-docker-image-securely//devlog/docker/2021-09-18-how-to-make-docker-image-securely"},"frontmatter":{"description":"PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.","category":"devlog","title":"시작부터 배포까지: 도커 패키징의 베스트케이스","date":"2021-09-18T19:00:00.000Z","slug":"/devlog/docker/2021-09-18-how-to-make-docker-image-securely"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-09-05---what-is-wrong-with-my-vscode-tab//tips/2021-09-05-what-is-wrong-with-my-vscode-tab"},"frontmatter":{"description":"우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...","category":"tips","title":"아니 내 탭 어디감?","date":"2021-09-05T19:30:00.000Z","slug":"/tips/2021-09-05-what-is-wrong-with-my-vscode-tab"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-06-03---how-to-use-file-signature-in-pycharm//tips/how-to-use-file-signature-in-pycharm"},"frontmatter":{"description":"매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.","category":"tips","title":"PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기","date":"2021-06-03T09:00:00.000Z","slug":"/tips/how-to-use-file-signature-in-pycharm"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-07-11---how-to-use-pre-commit-hook-vol1//tips/2021-07-11-how-to-use-pre-commit-hook-vol1"},"frontmatter":{"description":"pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.","category":"tips","title":"pre-commit hook, 나도 한번 써보자 (1)","date":"2021-06-03T09:00:00.000Z","slug":"/tips/2021-07-11-how-to-use-pre-commit-hook-vol1"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-02-03---server-maintenance-guide-101//tips/2021-02-03-server-maintenance-guide"},"frontmatter":{"description":"서버 점검과 관련하여","category":"tips","title":"간략히 써본 서버 점검 가이드","date":"2021-02-03T10:17:43.000Z","slug":"/tips/2021-02-03-server-maintenance-guide"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2020-05-22---s3ich4n-1-year-retrospect//retrospect/2020-05-22-s3ich4n-1-year-retrospect"},"frontmatter":{"description":"2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)","category":"retrospect","title":"1년차 회고","date":"2020-05-22T19:30:00.000Z","slug":"/retrospect/2020-05-22-s3ich4n-1-year-retrospect"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/data/2020-03-10---ksqldb-101-pt03//devlog/data/2020-03-10-ksqldb-101-pt03"},"frontmatter":{"description":"ksqlDB을 활용한 오픈소스의 예시를 통해, 보안 이벤트를 실시간으로 걸러내는 방안에 대해 학습해보고 이를 토대로 어떤식으로 활용하면 좋을지 살펴봅시다.","category":"devlog","title":"ksqlDB 101, part 3. 실전 예시: 오픈소스를 통해 살펴보는 실시간 보안 이벤트 탐지 룰","date":"2020-03-10T06:19:00.000Z","slug":"/devlog/data/2020-03-10-ksqldb-101-pt03"}}}]}},"pageContext":{"limit":7,"offset":56,"pagination":{"currentPage":8,"prevPagePath":"/page/7","nextPagePath":"/page/9","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/8","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":null,"slug":"/devlog/python/2022-06-09---python-classmethod-and-staticmethod//devlog/python/2022-06-09-python-classmethod-and-staticmethod"},"frontmatter":{"description":"Python의 \"@classmethod\" 와 \"@staticmethod\"에 대해","category":null,"title":"\"@classmethod\" 와 \"@staticmethod\"에 대해","date":"2022-06-09T10:30:00.000Z","slug":"/devlog/python/2022-06-09-python-classmethod-and-staticmethod"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/docker/2021-09-18---how-to-make-docker-image-securely//devlog/docker/2021-09-18-how-to-make-docker-image-securely"},"frontmatter":{"description":"PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.","category":"devlog","title":"시작부터 배포까지: 도커 패키징의 베스트케이스","date":"2021-09-18T19:00:00.000Z","slug":"/devlog/docker/2021-09-18-how-to-make-docker-image-securely"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-09-05---what-is-wrong-with-my-vscode-tab//tips/2021-09-05-what-is-wrong-with-my-vscode-tab"},"frontmatter":{"description":"우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...","category":"tips","title":"아니 내 탭 어디감?","date":"2021-09-05T19:30:00.000Z","slug":"/tips/2021-09-05-what-is-wrong-with-my-vscode-tab"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-07-11---how-to-use-pre-commit-hook-vol1//tips/2021-07-11-how-to-use-pre-commit-hook-vol1"},"frontmatter":{"description":"pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.","category":"tips","title":"pre-commit hook, 나도 한번 써보자 (1)","date":"2021-06-03T09:00:00.000Z","slug":"/tips/2021-07-11-how-to-use-pre-commit-hook-vol1"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-06-03---how-to-use-file-signature-in-pycharm//tips/how-to-use-file-signature-in-pycharm"},"frontmatter":{"description":"매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.","category":"tips","title":"PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기","date":"2021-06-03T09:00:00.000Z","slug":"/tips/how-to-use-file-signature-in-pycharm"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2021-02-03---server-maintenance-guide-101//tips/2021-02-03-server-maintenance-guide"},"frontmatter":{"description":"서버 점검과 관련하여","category":"tips","title":"간략히 써본 서버 점검 가이드","date":"2021-02-03T10:17:43.000Z","slug":"/tips/2021-02-03-server-maintenance-guide"}}},{"node":{"fields":{"categorySlug":"/category/retrospect/","slug":"/retrospect/2020-05-22---s3ich4n-1-year-retrospect//retrospect/2020-05-22-s3ich4n-1-year-retrospect"},"frontmatter":{"description":"2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)","category":"retrospect","title":"1년차 회고","date":"2020-05-22T19:30:00.000Z","slug":"/retrospect/2020-05-22-s3ich4n-1-year-retrospect"}}}]}},"pageContext":{"limit":7,"offset":56,"pagination":{"currentPage":8,"prevPagePath":"/page/7","nextPagePath":"/page/9","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/page/9/page-data.json b/page-data/page/9/page-data.json index 2200dbdf..907c75bb 100644 --- a/page-data/page/9/page-data.json +++ b/page-data/page/9/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/9","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/data/2020-02-06---ksqldb-101-pt02//devlog/data/2020-02-17-ksqldb-101-pt01"},"frontmatter":{"description":"ksqlDB의 내부 구조인 Apache Kafka의 Kafka Streams를 간략하게 살펴봅시다.","category":"devlog","title":"ksqlDB 101, part 2. Kafka Streams에 대해","date":"2020-02-17T19:00:00.000Z","slug":"/devlog/data/2020-02-17-ksqldb-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/data/2020-02-05---ksqldb-101-pt01//devlog/data/2020-02-05-ksqldb-101-pt01"},"frontmatter":{"description":"ksqlDB를 어느정도 이해하기 위해 필요한 기본지식을 설명하였습니다.","category":"devlog","title":"ksqlDB 101, part 1. 배경지식","date":"2020-02-05T05:14:00.000Z","slug":"/devlog/data/2020-02-05-ksqldb-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2019-04-19---jekyll-liquid-issue//tips/2019-04-19-jekyll-liquid-issue"},"frontmatter":{"description":"Python 코드를 Jekyll에 작성 시, Liquid syntax error가 뜬다면?","category":"tips","title":"Django 코드를 Jekyll에 작성할 때 Liquid syntax error가 뜬다면?","date":"2019-04-19T12:00:00.000Z","slug":"/tips/2019-04-19-jekyll-liquid-issue"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-24---pt04//books/pragmatic-programmer-1st/2018-02-24-pt04"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 4","category":"books","title":"실용주의 프로그래머 pt. 4","date":"2018-02-24T09:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-24-pt04"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-23---pt03//books/pragmatic-programmer-1st/2018-02-23-pt03"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 3","category":"books","title":"실용주의 프로그래머 pt. 3","date":"2018-02-23T09:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-23-pt03"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-21---pt02//books/pragmatic-programmer-1st/2018-02-21-pt02"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 2","category":"books","title":"실용주의 프로그래머 pt. 2","date":"2018-02-21T09:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-21-pt02"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-21---pt01//books/pragmatic-programmer-1st/2018-02-21-pt01"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 1","category":"books","title":"실용주의 프로그래머 pt. 1","date":"2018-02-21T00:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-21-pt01"}}}]}},"pageContext":{"limit":7,"offset":63,"pagination":{"currentPage":9,"prevPagePath":"/page/8","nextPagePath":"/page/10","hasNextPage":false,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-index-template-index-template-tsx","path":"/page/9","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/data/2020-03-10---ksqldb-101-pt03//devlog/data/2020-03-10-ksqldb-101-pt03"},"frontmatter":{"description":"ksqlDB을 활용한 오픈소스의 예시를 통해, 보안 이벤트를 실시간으로 걸러내는 방안에 대해 학습해보고 이를 토대로 어떤식으로 활용하면 좋을지 살펴봅시다.","category":"devlog","title":"ksqlDB 101, part 3. 실전 예시: 오픈소스를 통해 살펴보는 실시간 보안 이벤트 탐지 룰","date":"2020-03-10T06:19:00.000Z","slug":"/devlog/data/2020-03-10-ksqldb-101-pt03"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/data/2020-02-06---ksqldb-101-pt02//devlog/data/2020-02-17-ksqldb-101-pt01"},"frontmatter":{"description":"ksqlDB의 내부 구조인 Apache Kafka의 Kafka Streams를 간략하게 살펴봅시다.","category":"devlog","title":"ksqlDB 101, part 2. Kafka Streams에 대해","date":"2020-02-17T19:00:00.000Z","slug":"/devlog/data/2020-02-17-ksqldb-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/devlog/","slug":"/devlog/data/2020-02-05---ksqldb-101-pt01//devlog/data/2020-02-05-ksqldb-101-pt01"},"frontmatter":{"description":"ksqlDB를 어느정도 이해하기 위해 필요한 기본지식을 설명하였습니다.","category":"devlog","title":"ksqlDB 101, part 1. 배경지식","date":"2020-02-05T05:14:00.000Z","slug":"/devlog/data/2020-02-05-ksqldb-101-pt01"}}},{"node":{"fields":{"categorySlug":"/category/tips/","slug":"/tips/2019-04-19---jekyll-liquid-issue//tips/2019-04-19-jekyll-liquid-issue"},"frontmatter":{"description":"Python 코드를 Jekyll에 작성 시, Liquid syntax error가 뜬다면?","category":"tips","title":"Django 코드를 Jekyll에 작성할 때 Liquid syntax error가 뜬다면?","date":"2019-04-19T12:00:00.000Z","slug":"/tips/2019-04-19-jekyll-liquid-issue"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-24---pt04//books/pragmatic-programmer-1st/2018-02-24-pt04"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 4","category":"books","title":"실용주의 프로그래머 pt. 4","date":"2018-02-24T09:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-24-pt04"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-23---pt03//books/pragmatic-programmer-1st/2018-02-23-pt03"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 3","category":"books","title":"실용주의 프로그래머 pt. 3","date":"2018-02-23T09:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-23-pt03"}}},{"node":{"fields":{"categorySlug":"/category/books/","slug":"/books/pragmatic-programmer-1st/2018-02-21---pt02//books/pragmatic-programmer-1st/2018-02-21-pt02"},"frontmatter":{"description":"실용주의 프로그래머 2nd edition을 읽은 후... pt. 2","category":"books","title":"실용주의 프로그래머 pt. 2","date":"2018-02-21T09:00:00.000Z","slug":"/books/pragmatic-programmer-1st/2018-02-21-pt02"}}}]}},"pageContext":{"limit":7,"offset":63,"pagination":{"currentPage":9,"prevPagePath":"/page/8","nextPagePath":"/page/10","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/sq/d/251939775.json b/page-data/sq/d/251939775.json index ca609502..ff961576 100644 --- a/page-data/sq/d/251939775.json +++ b/page-data/sq/d/251939775.json @@ -1 +1 @@ -{"data":{"allMarkdownRemark":{"group":[{"fieldValue":"PEP","totalCount":1},{"fieldValue":"architecture","totalCount":2},{"fieldValue":"backend","totalCount":17},{"fieldValue":"book_review","totalCount":20},{"fieldValue":"books","totalCount":12},{"fieldValue":"code_quality","totalCount":17},{"fieldValue":"cowork","totalCount":1},{"fieldValue":"data_processing","totalCount":3},{"fieldValue":"ddd","totalCount":12},{"fieldValue":"devlog","totalCount":4},{"fieldValue":"devops","totalCount":11},{"fieldValue":"docker","totalCount":1},{"fieldValue":"gatsby","totalCount":1},{"fieldValue":"geultto","totalCount":1},{"fieldValue":"git","totalCount":1},{"fieldValue":"iac","totalCount":10},{"fieldValue":"java","totalCount":1},{"fieldValue":"jekyll","totalCount":1},{"fieldValue":"life","totalCount":1},{"fieldValue":"linux","totalCount":1},{"fieldValue":"maintenance","totalCount":1},{"fieldValue":"ofm","totalCount":2},{"fieldValue":"pre_commit","totalCount":1},{"fieldValue":"pycharm","totalCount":1},{"fieldValue":"python","totalCount":18},{"fieldValue":"review","totalCount":1},{"fieldValue":"shell","totalCount":1},{"fieldValue":"terraform","totalCount":10},{"fieldValue":"vscode","totalCount":1},{"fieldValue":"web","totalCount":2}]}}} \ No newline at end of file +{"data":{"allMarkdownRemark":{"group":[{"fieldValue":"PEP","totalCount":1},{"fieldValue":"architecture","totalCount":2},{"fieldValue":"backend","totalCount":17},{"fieldValue":"book_review","totalCount":20},{"fieldValue":"books","totalCount":12},{"fieldValue":"code_quality","totalCount":17},{"fieldValue":"cowork","totalCount":1},{"fieldValue":"data_processing","totalCount":3},{"fieldValue":"ddd","totalCount":12},{"fieldValue":"devlog","totalCount":4},{"fieldValue":"devops","totalCount":11},{"fieldValue":"docker","totalCount":1},{"fieldValue":"gatsby","totalCount":1},{"fieldValue":"geultto","totalCount":2},{"fieldValue":"git","totalCount":1},{"fieldValue":"iac","totalCount":10},{"fieldValue":"java","totalCount":1},{"fieldValue":"jekyll","totalCount":1},{"fieldValue":"life","totalCount":1},{"fieldValue":"linux","totalCount":1},{"fieldValue":"maintenance","totalCount":1},{"fieldValue":"ofm","totalCount":2},{"fieldValue":"pre_commit","totalCount":1},{"fieldValue":"pycharm","totalCount":1},{"fieldValue":"python","totalCount":19},{"fieldValue":"review","totalCount":1},{"fieldValue":"shell","totalCount":1},{"fieldValue":"terraform","totalCount":10},{"fieldValue":"vscode","totalCount":1},{"fieldValue":"web","totalCount":2}]}}} \ No newline at end of file diff --git a/page-data/sq/d/63107425.json b/page-data/sq/d/63107425.json index be03a5f7..6b1b22f8 100644 --- a/page-data/sq/d/63107425.json +++ b/page-data/sq/d/63107425.json @@ -1 +1 @@ -{"data":{"images":{"edges":[{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt01/media/01_domain.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/a49d027e7b75350e20b5ab9fcdae33f3/4f368/01_domain.png","srcSet":"/static/a49d027e7b75350e20b5ab9fcdae33f3/e0483/01_domain.png 118w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/320e2/01_domain.png 237w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/4f368/01_domain.png 473w","sizes":"(min-width: 473px) 473px, 100vw"},"sources":[{"srcSet":"/static/a49d027e7b75350e20b5ab9fcdae33f3/380fc/01_domain.avif 118w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/9b99f/01_domain.avif 237w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/6c96d/01_domain.avif 473w","type":"image/avif","sizes":"(min-width: 473px) 473px, 100vw"},{"srcSet":"/static/a49d027e7b75350e20b5ab9fcdae33f3/3c18c/01_domain.webp 118w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/7054d/01_domain.webp 237w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/3c4f6/01_domain.webp 473w","type":"image/webp","sizes":"(min-width: 473px) 473px, 100vw"}]},"width":473,"height":423}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-02-03---server-maintenance-guide-101/media/aa.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#e8e8d8","images":{"fallback":{"src":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/1a361/aa.jpg","srcSet":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/2c33f/aa.jpg 56w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/fa873/aa.jpg 113w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/1a361/aa.jpg 225w","sizes":"(min-width: 225px) 225px, 100vw"},"sources":[{"srcSet":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/4175e/aa.avif 56w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/cb563/aa.avif 113w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/c593a/aa.avif 225w","type":"image/avif","sizes":"(min-width: 225px) 225px, 100vw"},{"srcSet":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/f8744/aa.webp 56w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/26b1c/aa.webp 113w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/252a0/aa.webp 225w","type":"image/webp","sizes":"(min-width: 225px) 225px, 100vw"}]},"width":225,"height":225}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/001-02-problem-found.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/82c50e4650173ff00047c998900a0fe6/a1054/001-02-problem-found.png","srcSet":"/static/82c50e4650173ff00047c998900a0fe6/a44bc/001-02-problem-found.png 443w,\n/static/82c50e4650173ff00047c998900a0fe6/44334/001-02-problem-found.png 886w,\n/static/82c50e4650173ff00047c998900a0fe6/a1054/001-02-problem-found.png 1772w","sizes":"(min-width: 1772px) 1772px, 100vw"},"sources":[{"srcSet":"/static/82c50e4650173ff00047c998900a0fe6/ef3cb/001-02-problem-found.avif 443w,\n/static/82c50e4650173ff00047c998900a0fe6/853fe/001-02-problem-found.avif 886w,\n/static/82c50e4650173ff00047c998900a0fe6/4f726/001-02-problem-found.avif 1772w","type":"image/avif","sizes":"(min-width: 1772px) 1772px, 100vw"},{"srcSet":"/static/82c50e4650173ff00047c998900a0fe6/b7d55/001-02-problem-found.webp 443w,\n/static/82c50e4650173ff00047c998900a0fe6/3da55/001-02-problem-found.webp 886w,\n/static/82c50e4650173ff00047c998900a0fe6/3da8f/001-02-problem-found.webp 1772w","type":"image/webp","sizes":"(min-width: 1772px) 1772px, 100vw"}]},"width":1772,"height":268}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/002_command_toggle.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/b78bc/002_command_toggle.jpg","srcSet":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/58d30/002_command_toggle.jpg 302w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/1ab62/002_command_toggle.jpg 603w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/b78bc/002_command_toggle.jpg 1206w","sizes":"(min-width: 1206px) 1206px, 100vw"},"sources":[{"srcSet":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/25866/002_command_toggle.avif 302w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/64c7b/002_command_toggle.avif 603w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/4c509/002_command_toggle.avif 1206w","type":"image/avif","sizes":"(min-width: 1206px) 1206px, 100vw"},{"srcSet":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/730f1/002_command_toggle.webp 302w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/321c3/002_command_toggle.webp 603w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/5be66/002_command_toggle.webp 1206w","type":"image/webp","sizes":"(min-width: 1206px) 1206px, 100vw"}]},"width":1206,"height":238}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file/media/01_no_newline.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/21519913a8bf7c5b79a5ae0bc583dedc/d9009/01_no_newline.png","srcSet":"/static/21519913a8bf7c5b79a5ae0bc583dedc/bcf47/01_no_newline.png 95w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/666f8/01_no_newline.png 191w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/d9009/01_no_newline.png 381w","sizes":"(min-width: 381px) 381px, 100vw"},"sources":[{"srcSet":"/static/21519913a8bf7c5b79a5ae0bc583dedc/10c9a/01_no_newline.avif 95w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/afe09/01_no_newline.avif 191w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/351f1/01_no_newline.avif 381w","type":"image/avif","sizes":"(min-width: 381px) 381px, 100vw"},{"srcSet":"/static/21519913a8bf7c5b79a5ae0bc583dedc/2fb9c/01_no_newline.webp 95w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/f1621/01_no_newline.webp 191w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/9f2ce/01_no_newline.webp 381w","type":"image/webp","sizes":"(min-width: 381px) 381px, 100vw"}]},"width":381,"height":173}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file/media/02_crlf_lf.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/1bfee06304876faf876ef53c5bbadf3f/3d5ea/02_crlf_lf.jpg","srcSet":"/static/1bfee06304876faf876ef53c5bbadf3f/50142/02_crlf_lf.jpg 42w,\n/static/1bfee06304876faf876ef53c5bbadf3f/23974/02_crlf_lf.jpg 84w,\n/static/1bfee06304876faf876ef53c5bbadf3f/3d5ea/02_crlf_lf.jpg 168w","sizes":"(min-width: 168px) 168px, 100vw"},"sources":[{"srcSet":"/static/1bfee06304876faf876ef53c5bbadf3f/6912c/02_crlf_lf.avif 42w,\n/static/1bfee06304876faf876ef53c5bbadf3f/985e7/02_crlf_lf.avif 84w,\n/static/1bfee06304876faf876ef53c5bbadf3f/67d5a/02_crlf_lf.avif 168w","type":"image/avif","sizes":"(min-width: 168px) 168px, 100vw"},{"srcSet":"/static/1bfee06304876faf876ef53c5bbadf3f/96243/02_crlf_lf.webp 42w,\n/static/1bfee06304876faf876ef53c5bbadf3f/293a9/02_crlf_lf.webp 84w,\n/static/1bfee06304876faf876ef53c5bbadf3f/89bb6/02_crlf_lf.webp 168w","type":"image/webp","sizes":"(min-width: 168px) 168px, 100vw"}]},"width":168,"height":94}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-04---gatsby-add-image-captions/media/01_code_example.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/d68475d82092758bb3e595b7b73d97aa/db879/01_code_example.png","srcSet":"/static/d68475d82092758bb3e595b7b73d97aa/d9bca/01_code_example.png 255w,\n/static/d68475d82092758bb3e595b7b73d97aa/b1384/01_code_example.png 511w,\n/static/d68475d82092758bb3e595b7b73d97aa/db879/01_code_example.png 1021w","sizes":"(min-width: 1021px) 1021px, 100vw"},"sources":[{"srcSet":"/static/d68475d82092758bb3e595b7b73d97aa/dd838/01_code_example.avif 255w,\n/static/d68475d82092758bb3e595b7b73d97aa/6319d/01_code_example.avif 511w,\n/static/d68475d82092758bb3e595b7b73d97aa/47822/01_code_example.avif 1021w","type":"image/avif","sizes":"(min-width: 1021px) 1021px, 100vw"},{"srcSet":"/static/d68475d82092758bb3e595b7b73d97aa/f0ab4/01_code_example.webp 255w,\n/static/d68475d82092758bb3e595b7b73d97aa/d51b0/01_code_example.webp 511w,\n/static/d68475d82092758bb3e595b7b73d97aa/88810/01_code_example.webp 1021w","type":"image/webp","sizes":"(min-width: 1021px) 1021px, 100vw"}]},"width":1021,"height":481.00000000000006}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-06---chapter01/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-13---chapter04/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-27---chapter05/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-27---chapter06/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-03---chapter07/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-03---chapter08/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-10---chapter09/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-10---chapter10/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-17---chapter11/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c667bd99d14a07251b6678d7481e91c2/36c31/001.png","srcSet":"/static/c667bd99d14a07251b6678d7481e91c2/acb06/001.png 212w,\n/static/c667bd99d14a07251b6678d7481e91c2/e3149/001.png 425w,\n/static/c667bd99d14a07251b6678d7481e91c2/36c31/001.png 849w","sizes":"(min-width: 849px) 849px, 100vw"},"sources":[{"srcSet":"/static/c667bd99d14a07251b6678d7481e91c2/f7a73/001.avif 212w,\n/static/c667bd99d14a07251b6678d7481e91c2/f26fb/001.avif 425w,\n/static/c667bd99d14a07251b6678d7481e91c2/46d88/001.avif 849w","type":"image/avif","sizes":"(min-width: 849px) 849px, 100vw"},{"srcSet":"/static/c667bd99d14a07251b6678d7481e91c2/ac669/001.webp 212w,\n/static/c667bd99d14a07251b6678d7481e91c2/f89a4/001.webp 425w,\n/static/c667bd99d14a07251b6678d7481e91c2/90068/001.webp 849w","type":"image/webp","sizes":"(min-width: 849px) 849px, 100vw"}]},"width":849,"height":618}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-17---chapter11/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-24---chapter12/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-03-06---chatper13/media/001.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/65d73/001.jpg","srcSet":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/a0db9/001.jpg 61w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/98748/001.jpg 122w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/65d73/001.jpg 244w","sizes":"(min-width: 244px) 244px, 100vw"},"sources":[{"srcSet":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/84f26/001.avif 61w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/fd589/001.avif 122w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/471d6/001.avif 244w","type":"image/avif","sizes":"(min-width: 244px) 244px, 100vw"},{"srcSet":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/be33f/001.webp 61w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/6881b/001.webp 122w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/47764/001.webp 244w","type":"image/webp","sizes":"(min-width: 244px) 244px, 100vw"}]},"width":244,"height":235}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-03-06---chatper13/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch02/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/0910fd71995de03f54fbe806d2b8ca76/c5cc9/001.png","srcSet":"/static/0910fd71995de03f54fbe806d2b8ca76/02c7a/001.png 349w,\n/static/0910fd71995de03f54fbe806d2b8ca76/37574/001.png 698w,\n/static/0910fd71995de03f54fbe806d2b8ca76/c5cc9/001.png 1396w","sizes":"(min-width: 1396px) 1396px, 100vw"},"sources":[{"srcSet":"/static/0910fd71995de03f54fbe806d2b8ca76/23892/001.avif 349w,\n/static/0910fd71995de03f54fbe806d2b8ca76/8d09d/001.avif 698w,\n/static/0910fd71995de03f54fbe806d2b8ca76/f11b2/001.avif 1396w","type":"image/avif","sizes":"(min-width: 1396px) 1396px, 100vw"},{"srcSet":"/static/0910fd71995de03f54fbe806d2b8ca76/f1c8d/001.webp 349w,\n/static/0910fd71995de03f54fbe806d2b8ca76/719bd/001.webp 698w,\n/static/0910fd71995de03f54fbe806d2b8ca76/d10c9/001.webp 1396w","type":"image/webp","sizes":"(min-width: 1396px) 1396px, 100vw"}]},"width":1396,"height":676}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch02/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/995f7dcb14b4c7f20ac72c39b320e977/20e70/002.png","srcSet":"/static/995f7dcb14b4c7f20ac72c39b320e977/52d0f/002.png 199w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/d20e5/002.png 397w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/20e70/002.png 794w","sizes":"(min-width: 794px) 794px, 100vw"},"sources":[{"srcSet":"/static/995f7dcb14b4c7f20ac72c39b320e977/1436a/002.avif 199w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/f2404/002.avif 397w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/6261e/002.avif 794w","type":"image/avif","sizes":"(min-width: 794px) 794px, 100vw"},{"srcSet":"/static/995f7dcb14b4c7f20ac72c39b320e977/74db7/002.webp 199w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/323b2/002.webp 397w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/c3ddd/002.webp 794w","type":"image/webp","sizes":"(min-width: 794px) 794px, 100vw"}]},"width":794,"height":699}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-13---chapter03/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-06---chapter02/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/07395/001.png","srcSet":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/44d14/001.png 196w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/22e71/001.png 392w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/07395/001.png 784w","sizes":"(min-width: 784px) 784px, 100vw"},"sources":[{"srcSet":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/9d806/001.avif 196w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/667af/001.avif 392w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/f3ada/001.avif 784w","type":"image/avif","sizes":"(min-width: 784px) 784px, 100vw"},{"srcSet":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/c3e2f/001.webp 196w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/8391a/001.webp 392w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/88b7e/001.webp 784w","type":"image/webp","sizes":"(min-width: 784px) 784px, 100vw"}]},"width":784,"height":541}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/bda00491822610ad7a3b356800dad4d3/a970d/002.png","srcSet":"/static/bda00491822610ad7a3b356800dad4d3/cc55c/002.png 201w,\n/static/bda00491822610ad7a3b356800dad4d3/03e0f/002.png 402w,\n/static/bda00491822610ad7a3b356800dad4d3/a970d/002.png 804w","sizes":"(min-width: 804px) 804px, 100vw"},"sources":[{"srcSet":"/static/bda00491822610ad7a3b356800dad4d3/6afe7/002.avif 201w,\n/static/bda00491822610ad7a3b356800dad4d3/213b6/002.avif 402w,\n/static/bda00491822610ad7a3b356800dad4d3/844c8/002.avif 804w","type":"image/avif","sizes":"(min-width: 804px) 804px, 100vw"},{"srcSet":"/static/bda00491822610ad7a3b356800dad4d3/ea485/002.webp 201w,\n/static/bda00491822610ad7a3b356800dad4d3/554a5/002.webp 402w,\n/static/bda00491822610ad7a3b356800dad4d3/53445/002.webp 804w","type":"image/webp","sizes":"(min-width: 804px) 804px, 100vw"}]},"width":804,"height":553}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/003.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/afa82/003.png","srcSet":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/44348/003.png 215w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/7de77/003.png 430w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/afa82/003.png 860w","sizes":"(min-width: 860px) 860px, 100vw"},"sources":[{"srcSet":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/55173/003.avif 215w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/283ff/003.avif 430w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/87ec4/003.avif 860w","type":"image/avif","sizes":"(min-width: 860px) 860px, 100vw"},{"srcSet":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/b284a/003.webp 215w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/7e6f7/003.webp 430w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/22175/003.webp 860w","type":"image/webp","sizes":"(min-width: 860px) 860px, 100vw"}]},"width":860,"height":472}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/f326b97b578fb1d3ac72198cb1ce358c/5226c/001.png","srcSet":"/static/f326b97b578fb1d3ac72198cb1ce358c/da5c7/001.png 221w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/b0b69/001.png 443w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/5226c/001.png 885w","sizes":"(min-width: 885px) 885px, 100vw"},"sources":[{"srcSet":"/static/f326b97b578fb1d3ac72198cb1ce358c/ee409/001.avif 221w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/f30fc/001.avif 443w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/9b9bc/001.avif 885w","type":"image/avif","sizes":"(min-width: 885px) 885px, 100vw"},{"srcSet":"/static/f326b97b578fb1d3ac72198cb1ce358c/4fc4b/001.webp 221w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/5cce9/001.webp 443w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/701cb/001.webp 885w","type":"image/webp","sizes":"(min-width: 885px) 885px, 100vw"}]},"width":885,"height":436}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/003.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/6bc00fb8657ed1cff2897da758c4c668/1ad45/003.png","srcSet":"/static/6bc00fb8657ed1cff2897da758c4c668/14595/003.png 214w,\n/static/6bc00fb8657ed1cff2897da758c4c668/99ea7/003.png 429w,\n/static/6bc00fb8657ed1cff2897da758c4c668/1ad45/003.png 857w","sizes":"(min-width: 857px) 857px, 100vw"},"sources":[{"srcSet":"/static/6bc00fb8657ed1cff2897da758c4c668/8e5aa/003.avif 214w,\n/static/6bc00fb8657ed1cff2897da758c4c668/3f7a1/003.avif 429w,\n/static/6bc00fb8657ed1cff2897da758c4c668/31844/003.avif 857w","type":"image/avif","sizes":"(min-width: 857px) 857px, 100vw"},{"srcSet":"/static/6bc00fb8657ed1cff2897da758c4c668/3b675/003.webp 214w,\n/static/6bc00fb8657ed1cff2897da758c4c668/45e0e/003.webp 429w,\n/static/6bc00fb8657ed1cff2897da758c4c668/5f85e/003.webp 857w","type":"image/webp","sizes":"(min-width: 857px) 857px, 100vw"}]},"width":857,"height":438}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/b6c0103b1f16506967995e1da4c738dd/fb43e/002.png","srcSet":"/static/b6c0103b1f16506967995e1da4c738dd/6fe90/002.png 231w,\n/static/b6c0103b1f16506967995e1da4c738dd/31c86/002.png 461w,\n/static/b6c0103b1f16506967995e1da4c738dd/fb43e/002.png 922w","sizes":"(min-width: 922px) 922px, 100vw"},"sources":[{"srcSet":"/static/b6c0103b1f16506967995e1da4c738dd/5c932/002.avif 231w,\n/static/b6c0103b1f16506967995e1da4c738dd/0b08a/002.avif 461w,\n/static/b6c0103b1f16506967995e1da4c738dd/5de31/002.avif 922w","type":"image/avif","sizes":"(min-width: 922px) 922px, 100vw"},{"srcSet":"/static/b6c0103b1f16506967995e1da4c738dd/1b0d1/002.webp 231w,\n/static/b6c0103b1f16506967995e1da4c738dd/2f4bc/002.webp 461w,\n/static/b6c0103b1f16506967995e1da4c738dd/5302d/002.webp 922w","type":"image/webp","sizes":"(min-width: 922px) 922px, 100vw"}]},"width":922,"height":369}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/004.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/debc3/004.png","srcSet":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/5538a/004.png 155w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/480c9/004.png 311w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/debc3/004.png 621w","sizes":"(min-width: 621px) 621px, 100vw"},"sources":[{"srcSet":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/d4b2f/004.avif 155w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/35c1d/004.avif 311w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/809bb/004.avif 621w","type":"image/avif","sizes":"(min-width: 621px) 621px, 100vw"},{"srcSet":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/3c913/004.webp 155w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/5408d/004.webp 311w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/6836f/004.webp 621w","type":"image/webp","sizes":"(min-width: 621px) 621px, 100vw"}]},"width":621,"height":491}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/005.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/efb79f55bd6037a58f5cf44ae0787424/f10f9/005.png","srcSet":"/static/efb79f55bd6037a58f5cf44ae0787424/39fe4/005.png 157w,\n/static/efb79f55bd6037a58f5cf44ae0787424/80870/005.png 314w,\n/static/efb79f55bd6037a58f5cf44ae0787424/f10f9/005.png 627w","sizes":"(min-width: 627px) 627px, 100vw"},"sources":[{"srcSet":"/static/efb79f55bd6037a58f5cf44ae0787424/6ed6a/005.avif 157w,\n/static/efb79f55bd6037a58f5cf44ae0787424/7fdeb/005.avif 314w,\n/static/efb79f55bd6037a58f5cf44ae0787424/11215/005.avif 627w","type":"image/avif","sizes":"(min-width: 627px) 627px, 100vw"},{"srcSet":"/static/efb79f55bd6037a58f5cf44ae0787424/ede53/005.webp 157w,\n/static/efb79f55bd6037a58f5cf44ae0787424/5139e/005.webp 314w,\n/static/efb79f55bd6037a58f5cf44ae0787424/dc99b/005.webp 627w","type":"image/webp","sizes":"(min-width: 627px) 627px, 100vw"}]},"width":627,"height":513}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/006.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9e08c9b1613989fab3630dd2f8197a21/28c85/006.png","srcSet":"/static/9e08c9b1613989fab3630dd2f8197a21/7e15b/006.png 169w,\n/static/9e08c9b1613989fab3630dd2f8197a21/42a95/006.png 337w,\n/static/9e08c9b1613989fab3630dd2f8197a21/28c85/006.png 674w","sizes":"(min-width: 674px) 674px, 100vw"},"sources":[{"srcSet":"/static/9e08c9b1613989fab3630dd2f8197a21/2e6ca/006.avif 169w,\n/static/9e08c9b1613989fab3630dd2f8197a21/e1160/006.avif 337w,\n/static/9e08c9b1613989fab3630dd2f8197a21/31195/006.avif 674w","type":"image/avif","sizes":"(min-width: 674px) 674px, 100vw"},{"srcSet":"/static/9e08c9b1613989fab3630dd2f8197a21/2ddd1/006.webp 169w,\n/static/9e08c9b1613989fab3630dd2f8197a21/e2e22/006.webp 337w,\n/static/9e08c9b1613989fab3630dd2f8197a21/716b8/006.webp 674w","type":"image/webp","sizes":"(min-width: 674px) 674px, 100vw"}]},"width":674,"height":451}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/007.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/45bc3b761498eec1f1a910b87bdcd298/5c641/007.png","srcSet":"/static/45bc3b761498eec1f1a910b87bdcd298/966a8/007.png 151w,\n/static/45bc3b761498eec1f1a910b87bdcd298/5072c/007.png 302w,\n/static/45bc3b761498eec1f1a910b87bdcd298/5c641/007.png 604w","sizes":"(min-width: 604px) 604px, 100vw"},"sources":[{"srcSet":"/static/45bc3b761498eec1f1a910b87bdcd298/b043b/007.avif 151w,\n/static/45bc3b761498eec1f1a910b87bdcd298/db5bb/007.avif 302w,\n/static/45bc3b761498eec1f1a910b87bdcd298/f89b8/007.avif 604w","type":"image/avif","sizes":"(min-width: 604px) 604px, 100vw"},{"srcSet":"/static/45bc3b761498eec1f1a910b87bdcd298/0d826/007.webp 151w,\n/static/45bc3b761498eec1f1a910b87bdcd298/8a25d/007.webp 302w,\n/static/45bc3b761498eec1f1a910b87bdcd298/80ed4/007.webp 604w","type":"image/webp","sizes":"(min-width: 604px) 604px, 100vw"}]},"width":604,"height":510}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/008.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/db0c93fbc4a05738e073cdfd5c566420/cff96/008.png","srcSet":"/static/db0c93fbc4a05738e073cdfd5c566420/bf0f5/008.png 166w,\n/static/db0c93fbc4a05738e073cdfd5c566420/024e9/008.png 333w,\n/static/db0c93fbc4a05738e073cdfd5c566420/cff96/008.png 665w","sizes":"(min-width: 665px) 665px, 100vw"},"sources":[{"srcSet":"/static/db0c93fbc4a05738e073cdfd5c566420/f7fb8/008.avif 166w,\n/static/db0c93fbc4a05738e073cdfd5c566420/b8576/008.avif 333w,\n/static/db0c93fbc4a05738e073cdfd5c566420/9a174/008.avif 665w","type":"image/avif","sizes":"(min-width: 665px) 665px, 100vw"},{"srcSet":"/static/db0c93fbc4a05738e073cdfd5c566420/38df8/008.webp 166w,\n/static/db0c93fbc4a05738e073cdfd5c566420/5c5df/008.webp 333w,\n/static/db0c93fbc4a05738e073cdfd5c566420/f5329/008.webp 665w","type":"image/webp","sizes":"(min-width: 665px) 665px, 100vw"}]},"width":665,"height":521}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/009.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/e57004ee844fd0e51d5abc873a9d24c0/8a6f2/009.png","srcSet":"/static/e57004ee844fd0e51d5abc873a9d24c0/7f9f1/009.png 179w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/14567/009.png 358w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/8a6f2/009.png 715w","sizes":"(min-width: 715px) 715px, 100vw"},"sources":[{"srcSet":"/static/e57004ee844fd0e51d5abc873a9d24c0/9db08/009.avif 179w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/3a959/009.avif 358w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/c8ce5/009.avif 715w","type":"image/avif","sizes":"(min-width: 715px) 715px, 100vw"},{"srcSet":"/static/e57004ee844fd0e51d5abc873a9d24c0/c6b4c/009.webp 179w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/e8928/009.webp 358w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/d7848/009.webp 715w","type":"image/webp","sizes":"(min-width: 715px) 715px, 100vw"}]},"width":715,"height":455}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/010.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/1e307ab85c4aaee6423c3bafcaa3a098/8394e/010.png","srcSet":"/static/1e307ab85c4aaee6423c3bafcaa3a098/62617/010.png 159w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/8beff/010.png 319w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/8394e/010.png 637w","sizes":"(min-width: 637px) 637px, 100vw"},"sources":[{"srcSet":"/static/1e307ab85c4aaee6423c3bafcaa3a098/73695/010.avif 159w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/660b2/010.avif 319w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/d3bf6/010.avif 637w","type":"image/avif","sizes":"(min-width: 637px) 637px, 100vw"},{"srcSet":"/static/1e307ab85c4aaee6423c3bafcaa3a098/8d0a5/010.webp 159w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/fc715/010.webp 319w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/f6ced/010.webp 637w","type":"image/webp","sizes":"(min-width: 637px) 637px, 100vw"}]},"width":637,"height":546}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/011.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/e8229/011.png","srcSet":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/95049/011.png 172w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/60bb2/011.png 345w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/e8229/011.png 689w","sizes":"(min-width: 689px) 689px, 100vw"},"sources":[{"srcSet":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/853ec/011.avif 172w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/08e9c/011.avif 345w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/83ec2/011.avif 689w","type":"image/avif","sizes":"(min-width: 689px) 689px, 100vw"},{"srcSet":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/5c00d/011.webp 172w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/57336/011.webp 345w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/d1d39/011.webp 689w","type":"image/webp","sizes":"(min-width: 689px) 689px, 100vw"}]},"width":689,"height":551}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-05---considering-http-authn-pt01/media/domado.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg","srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/ce903/domado.jpg 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/be680/domado.jpg 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg 480w","sizes":"(min-width: 480px) 480px, 100vw"},"sources":[{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/51554/domado.avif 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/8b9e3/domado.avif 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/dde18/domado.avif 480w","type":"image/avif","sizes":"(min-width: 480px) 480px, 100vw"},{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/43b57/domado.webp 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/226ed/domado.webp 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/a1501/domado.webp 480w","type":"image/webp","sizes":"(min-width: 480px) 480px, 100vw"}]},"width":480,"height":360}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-05---considering-http-authn-pt02/media/domado.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg","srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/ce903/domado.jpg 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/be680/domado.jpg 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg 480w","sizes":"(min-width: 480px) 480px, 100vw"},"sources":[{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/51554/domado.avif 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/8b9e3/domado.avif 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/dde18/domado.avif 480w","type":"image/avif","sizes":"(min-width: 480px) 480px, 100vw"},{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/43b57/domado.webp 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/226ed/domado.webp 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/a1501/domado.webp 480w","type":"image/webp","sizes":"(min-width: 480px) 480px, 100vw"}]},"width":480,"height":360}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/01-oauth-auth-code.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/04bbd/01-oauth-auth-code.png","srcSet":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/5f41b/01-oauth-auth-code.png 184w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/9f3ee/01-oauth-auth-code.png 369w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/04bbd/01-oauth-auth-code.png 737w","sizes":"(min-width: 737px) 737px, 100vw"},"sources":[{"srcSet":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/f44a4/01-oauth-auth-code.avif 184w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/a1e0d/01-oauth-auth-code.avif 369w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/ab72b/01-oauth-auth-code.avif 737w","type":"image/avif","sizes":"(min-width: 737px) 737px, 100vw"},{"srcSet":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/0e98b/01-oauth-auth-code.webp 184w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/8008c/01-oauth-auth-code.webp 369w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/319bc/01-oauth-auth-code.webp 737w","type":"image/webp","sizes":"(min-width: 737px) 737px, 100vw"}]},"width":737,"height":475.00000000000006}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/02-oauth-password.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c68f9acd46f568aa7ae3e4578a820b50/36cb9/02-oauth-password.png","srcSet":"/static/c68f9acd46f568aa7ae3e4578a820b50/fa60b/02-oauth-password.png 187w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/d87db/02-oauth-password.png 373w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/36cb9/02-oauth-password.png 746w","sizes":"(min-width: 746px) 746px, 100vw"},"sources":[{"srcSet":"/static/c68f9acd46f568aa7ae3e4578a820b50/8e3e9/02-oauth-password.avif 187w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/4e407/02-oauth-password.avif 373w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/e8948/02-oauth-password.avif 746w","type":"image/avif","sizes":"(min-width: 746px) 746px, 100vw"},{"srcSet":"/static/c68f9acd46f568aa7ae3e4578a820b50/ee0f2/02-oauth-password.webp 187w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/a8020/02-oauth-password.webp 373w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/91011/02-oauth-password.webp 746w","type":"image/webp","sizes":"(min-width: 746px) 746px, 100vw"}]},"width":746,"height":413}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/03-oauth-client-creds.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/85b7b29c60834a648b9a206543917a12/f40c1/03-oauth-client-creds.png","srcSet":"/static/85b7b29c60834a648b9a206543917a12/b7986/03-oauth-client-creds.png 143w,\n/static/85b7b29c60834a648b9a206543917a12/7a26e/03-oauth-client-creds.png 287w,\n/static/85b7b29c60834a648b9a206543917a12/f40c1/03-oauth-client-creds.png 573w","sizes":"(min-width: 573px) 573px, 100vw"},"sources":[{"srcSet":"/static/85b7b29c60834a648b9a206543917a12/56b7e/03-oauth-client-creds.avif 143w,\n/static/85b7b29c60834a648b9a206543917a12/12d58/03-oauth-client-creds.avif 287w,\n/static/85b7b29c60834a648b9a206543917a12/90370/03-oauth-client-creds.avif 573w","type":"image/avif","sizes":"(min-width: 573px) 573px, 100vw"},{"srcSet":"/static/85b7b29c60834a648b9a206543917a12/6f2dd/03-oauth-client-creds.webp 143w,\n/static/85b7b29c60834a648b9a206543917a12/0c864/03-oauth-client-creds.webp 287w,\n/static/85b7b29c60834a648b9a206543917a12/47910/03-oauth-client-creds.webp 573w","type":"image/webp","sizes":"(min-width: 573px) 573px, 100vw"}]},"width":573,"height":376}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2023-03-13---from-servlet-to-spring/media/spring.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#4878b8","images":{"fallback":{"src":"/static/f93504191e16f7c297c5b70c579f058d/5671c/spring.jpg","srcSet":"/static/f93504191e16f7c297c5b70c579f058d/d97c6/spring.jpg 153w,\n/static/f93504191e16f7c297c5b70c579f058d/0d2c2/spring.jpg 306w,\n/static/f93504191e16f7c297c5b70c579f058d/5671c/spring.jpg 612w","sizes":"(min-width: 612px) 612px, 100vw"},"sources":[{"srcSet":"/static/f93504191e16f7c297c5b70c579f058d/8af42/spring.avif 153w,\n/static/f93504191e16f7c297c5b70c579f058d/11477/spring.avif 306w,\n/static/f93504191e16f7c297c5b70c579f058d/1c62b/spring.avif 612w","type":"image/avif","sizes":"(min-width: 612px) 612px, 100vw"},{"srcSet":"/static/f93504191e16f7c297c5b70c579f058d/4401b/spring.webp 153w,\n/static/f93504191e16f7c297c5b70c579f058d/aea7f/spring.webp 306w,\n/static/f93504191e16f7c297c5b70c579f058d/9e742/spring.webp 612w","type":"image/webp","sizes":"(min-width: 612px) 612px, 100vw"}]},"width":612,"height":408}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-10-20---cloudneta-terraform-101-pt01/media/terraform01.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/a28f3/terraform01.jpg","srcSet":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/10e28/terraform01.jpg 192w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/c620e/terraform01.jpg 384w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/a28f3/terraform01.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/83c0e/terraform01.avif 192w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/0f3c8/terraform01.avif 384w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/b3741/terraform01.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/23244/terraform01.webp 192w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/d4e33/terraform01.webp 384w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/88eeb/terraform01.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-10-27---cloudneta-terraform-101-pt02/media/terraform02.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/23de681fbb4ea110b56b4f8d37407f1a/a28f3/terraform02.jpg","srcSet":"/static/23de681fbb4ea110b56b4f8d37407f1a/10e28/terraform02.jpg 192w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/c620e/terraform02.jpg 384w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/a28f3/terraform02.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/23de681fbb4ea110b56b4f8d37407f1a/83c0e/terraform02.avif 192w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/0f3c8/terraform02.avif 384w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/b3741/terraform02.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/23de681fbb4ea110b56b4f8d37407f1a/23244/terraform02.webp 192w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/d4e33/terraform02.webp 384w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/88eeb/terraform02.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-03---cloudneta-terraform-101-pt03/media/terraform03.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f76f45557215b30ae70126439a5e8b31/a28f3/terraform03.jpg","srcSet":"/static/f76f45557215b30ae70126439a5e8b31/10e28/terraform03.jpg 192w,\n/static/f76f45557215b30ae70126439a5e8b31/c620e/terraform03.jpg 384w,\n/static/f76f45557215b30ae70126439a5e8b31/a28f3/terraform03.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/f76f45557215b30ae70126439a5e8b31/83c0e/terraform03.avif 192w,\n/static/f76f45557215b30ae70126439a5e8b31/0f3c8/terraform03.avif 384w,\n/static/f76f45557215b30ae70126439a5e8b31/b3741/terraform03.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/f76f45557215b30ae70126439a5e8b31/23244/terraform03.webp 192w,\n/static/f76f45557215b30ae70126439a5e8b31/d4e33/terraform03.webp 384w,\n/static/f76f45557215b30ae70126439a5e8b31/88eeb/terraform03.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-1/media/terraform05.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg","srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/10e28/terraform05.jpg 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/c620e/terraform05.jpg 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/83c0e/terraform05.avif 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/0f3c8/terraform05.avif 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/b3741/terraform05.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/23244/terraform05.webp 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/d4e33/terraform05.webp 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/88eeb/terraform05.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-10---cloudneta-terraform-101-pt04/media/terraform04.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/2ac4339c55aea79af1fad3da4839b5c4/a28f3/terraform04.jpg","srcSet":"/static/2ac4339c55aea79af1fad3da4839b5c4/10e28/terraform04.jpg 192w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/c620e/terraform04.jpg 384w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/a28f3/terraform04.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/2ac4339c55aea79af1fad3da4839b5c4/83c0e/terraform04.avif 192w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/0f3c8/terraform04.avif 384w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/b3741/terraform04.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/2ac4339c55aea79af1fad3da4839b5c4/23244/terraform04.webp 192w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/d4e33/terraform04.webp 384w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/88eeb/terraform04.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-27---cloudneta-terraform-101-pt06/media/terraform06.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/a28f3/terraform06.jpg","srcSet":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/10e28/terraform06.jpg 192w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/c620e/terraform06.jpg 384w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/a28f3/terraform06.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/83c0e/terraform06.avif 192w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/0f3c8/terraform06.avif 384w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/b3741/terraform06.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/23244/terraform06.webp 192w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/d4e33/terraform06.webp 384w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/88eeb/terraform06.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-10---cloudneta-terraform-101-pt07/media/terraform07.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/d22fecedcdae6e3b11af342e075eefde/a28f3/terraform07.jpg","srcSet":"/static/d22fecedcdae6e3b11af342e075eefde/10e28/terraform07.jpg 192w,\n/static/d22fecedcdae6e3b11af342e075eefde/c620e/terraform07.jpg 384w,\n/static/d22fecedcdae6e3b11af342e075eefde/a28f3/terraform07.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/d22fecedcdae6e3b11af342e075eefde/83c0e/terraform07.avif 192w,\n/static/d22fecedcdae6e3b11af342e075eefde/0f3c8/terraform07.avif 384w,\n/static/d22fecedcdae6e3b11af342e075eefde/b3741/terraform07.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/d22fecedcdae6e3b11af342e075eefde/23244/terraform07.webp 192w,\n/static/d22fecedcdae6e3b11af342e075eefde/d4e33/terraform07.webp 384w,\n/static/d22fecedcdae6e3b11af342e075eefde/88eeb/terraform07.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt08/media/terraform08.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/87dffd59448a30f82a571f9cd59a7a82/a28f3/terraform08.jpg","srcSet":"/static/87dffd59448a30f82a571f9cd59a7a82/10e28/terraform08.jpg 192w,\n/static/87dffd59448a30f82a571f9cd59a7a82/c620e/terraform08.jpg 384w,\n/static/87dffd59448a30f82a571f9cd59a7a82/a28f3/terraform08.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/87dffd59448a30f82a571f9cd59a7a82/83c0e/terraform08.avif 192w,\n/static/87dffd59448a30f82a571f9cd59a7a82/0f3c8/terraform08.avif 384w,\n/static/87dffd59448a30f82a571f9cd59a7a82/b3741/terraform08.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/87dffd59448a30f82a571f9cd59a7a82/23244/terraform08.webp 192w,\n/static/87dffd59448a30f82a571f9cd59a7a82/d4e33/terraform08.webp 384w,\n/static/87dffd59448a30f82a571f9cd59a7a82/88eeb/terraform08.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-2/media/terraform05.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg","srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/10e28/terraform05.jpg 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/c620e/terraform05.jpg 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/83c0e/terraform05.avif 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/0f3c8/terraform05.avif 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/b3741/terraform05.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/23244/terraform05.webp 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/d4e33/terraform05.webp 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/88eeb/terraform05.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt09/media/09_001.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c561771300765fd3d3253fbb88a9f75e/cafbd/09_001.jpg","srcSet":"/static/c561771300765fd3d3253fbb88a9f75e/b032a/09_001.jpg 263w,\n/static/c561771300765fd3d3253fbb88a9f75e/83c21/09_001.jpg 525w,\n/static/c561771300765fd3d3253fbb88a9f75e/cafbd/09_001.jpg 1050w","sizes":"(min-width: 1050px) 1050px, 100vw"},"sources":[{"srcSet":"/static/c561771300765fd3d3253fbb88a9f75e/0cd0c/09_001.avif 263w,\n/static/c561771300765fd3d3253fbb88a9f75e/ff275/09_001.avif 525w,\n/static/c561771300765fd3d3253fbb88a9f75e/ebfe9/09_001.avif 1050w","type":"image/avif","sizes":"(min-width: 1050px) 1050px, 100vw"},{"srcSet":"/static/c561771300765fd3d3253fbb88a9f75e/03416/09_001.webp 263w,\n/static/c561771300765fd3d3253fbb88a9f75e/70306/09_001.webp 525w,\n/static/c561771300765fd3d3253fbb88a9f75e/fa37b/09_001.webp 1050w","type":"image/webp","sizes":"(min-width: 1050px) 1050px, 100vw"}]},"width":1050,"height":553}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt09/media/terraform09.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/409d9dd739ee39e19c7e69854258b811/a28f3/terraform09.jpg","srcSet":"/static/409d9dd739ee39e19c7e69854258b811/10e28/terraform09.jpg 192w,\n/static/409d9dd739ee39e19c7e69854258b811/c620e/terraform09.jpg 384w,\n/static/409d9dd739ee39e19c7e69854258b811/a28f3/terraform09.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/409d9dd739ee39e19c7e69854258b811/83c0e/terraform09.avif 192w,\n/static/409d9dd739ee39e19c7e69854258b811/0f3c8/terraform09.avif 384w,\n/static/409d9dd739ee39e19c7e69854258b811/b3741/terraform09.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/409d9dd739ee39e19c7e69854258b811/23244/terraform09.webp 192w,\n/static/409d9dd739ee39e19c7e69854258b811/d4e33/terraform09.webp 384w,\n/static/409d9dd739ee39e19c7e69854258b811/88eeb/terraform09.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-15---cloudneta-terraform-101-pt10/media/terraform10.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/352a581bd14096bcc349ddb9454daac6/a28f3/terraform10.jpg","srcSet":"/static/352a581bd14096bcc349ddb9454daac6/10e28/terraform10.jpg 192w,\n/static/352a581bd14096bcc349ddb9454daac6/c620e/terraform10.jpg 384w,\n/static/352a581bd14096bcc349ddb9454daac6/a28f3/terraform10.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/352a581bd14096bcc349ddb9454daac6/83c0e/terraform10.avif 192w,\n/static/352a581bd14096bcc349ddb9454daac6/0f3c8/terraform10.avif 384w,\n/static/352a581bd14096bcc349ddb9454daac6/b3741/terraform10.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/352a581bd14096bcc349ddb9454daac6/23244/terraform10.webp 192w,\n/static/352a581bd14096bcc349ddb9454daac6/d4e33/terraform10.webp 384w,\n/static/352a581bd14096bcc349ddb9454daac6/88eeb/terraform10.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/pages/contacts/book.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#382828","images":{"fallback":{"src":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/dcf31/book.jpg","srcSet":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/bb5f7/book.jpg 315w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/623af/book.jpg 630w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/dcf31/book.jpg 1260w","sizes":"(min-width: 1260px) 1260px, 100vw"},"sources":[{"srcSet":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/da1a8/book.avif 315w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/a99fe/book.avif 630w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/ccb65/book.avif 1260w","type":"image/avif","sizes":"(min-width: 1260px) 1260px, 100vw"},{"srcSet":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/c4a8b/book.webp 315w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/850b2/book.webp 630w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/c50fe/book.webp 1260w","type":"image/webp","sizes":"(min-width: 1260px) 1260px, 100vw"}]},"width":1260,"height":945}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/001_this_toggle.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/fcfba/001_this_toggle.jpg","srcSet":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/9dc2d/001_this_toggle.jpg 445w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/a88b6/001_this_toggle.jpg 890w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/fcfba/001_this_toggle.jpg 1780w","sizes":"(min-width: 1780px) 1780px, 100vw"},"sources":[{"srcSet":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/c3c5b/001_this_toggle.avif 445w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/a6d01/001_this_toggle.avif 890w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/d5f88/001_this_toggle.avif 1780w","type":"image/avif","sizes":"(min-width: 1780px) 1780px, 100vw"},{"srcSet":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/9b057/001_this_toggle.webp 445w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/6b4bf/001_this_toggle.webp 890w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/81f95/001_this_toggle.webp 1780w","type":"image/webp","sizes":"(min-width: 1780px) 1780px, 100vw"}]},"width":1780,"height":526}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/fromis9_etkyung.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#a88868","images":{"fallback":{"src":"/static/cfb86f6df7147288059b81ad893430de/4a49b/fromis9_etkyung.jpg","srcSet":"/static/cfb86f6df7147288059b81ad893430de/b4dad/fromis9_etkyung.jpg 320w,\n/static/cfb86f6df7147288059b81ad893430de/3440d/fromis9_etkyung.jpg 640w,\n/static/cfb86f6df7147288059b81ad893430de/4a49b/fromis9_etkyung.jpg 1280w","sizes":"(min-width: 1280px) 1280px, 100vw"},"sources":[{"srcSet":"/static/cfb86f6df7147288059b81ad893430de/e2a10/fromis9_etkyung.avif 320w,\n/static/cfb86f6df7147288059b81ad893430de/3d183/fromis9_etkyung.avif 640w,\n/static/cfb86f6df7147288059b81ad893430de/af2d5/fromis9_etkyung.avif 1280w","type":"image/avif","sizes":"(min-width: 1280px) 1280px, 100vw"},{"srcSet":"/static/cfb86f6df7147288059b81ad893430de/c0bcc/fromis9_etkyung.webp 320w,\n/static/cfb86f6df7147288059b81ad893430de/17574/fromis9_etkyung.webp 640w,\n/static/cfb86f6df7147288059b81ad893430de/71d4d/fromis9_etkyung.webp 1280w","type":"image/webp","sizes":"(min-width: 1280px) 1280px, 100vw"}]},"width":1280,"height":720}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/04_compare_done.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/0d98d4a1b6e30993056402fe125bda41/0b6bc/04_compare_done.jpg","srcSet":"/static/0d98d4a1b6e30993056402fe125bda41/5d8dd/04_compare_done.jpg 416w,\n/static/0d98d4a1b6e30993056402fe125bda41/ebe4a/04_compare_done.jpg 832w,\n/static/0d98d4a1b6e30993056402fe125bda41/0b6bc/04_compare_done.jpg 1664w","sizes":"(min-width: 1664px) 1664px, 100vw"},"sources":[{"srcSet":"/static/0d98d4a1b6e30993056402fe125bda41/3f6b3/04_compare_done.avif 416w,\n/static/0d98d4a1b6e30993056402fe125bda41/f9303/04_compare_done.avif 832w,\n/static/0d98d4a1b6e30993056402fe125bda41/cfff2/04_compare_done.avif 1664w","type":"image/avif","sizes":"(min-width: 1664px) 1664px, 100vw"},{"srcSet":"/static/0d98d4a1b6e30993056402fe125bda41/7748d/04_compare_done.webp 416w,\n/static/0d98d4a1b6e30993056402fe125bda41/2d4ec/04_compare_done.webp 832w,\n/static/0d98d4a1b6e30993056402fe125bda41/0cceb/04_compare_done.webp 1664w","type":"image/webp","sizes":"(min-width: 1664px) 1664px, 100vw"}]},"width":1664,"height":816}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/02-2_find_command_done.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/5a5c6993b13dfc7a02cb200c913b58a1/e8401/02-2_find_command_done.jpg","srcSet":"/static/5a5c6993b13dfc7a02cb200c913b58a1/93848/02-2_find_command_done.jpg 397w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/c9972/02-2_find_command_done.jpg 793w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/e8401/02-2_find_command_done.jpg 1586w","sizes":"(min-width: 1586px) 1586px, 100vw"},"sources":[{"srcSet":"/static/5a5c6993b13dfc7a02cb200c913b58a1/84f62/02-2_find_command_done.avif 397w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/213e3/02-2_find_command_done.avif 793w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/dbcb3/02-2_find_command_done.avif 1586w","type":"image/avif","sizes":"(min-width: 1586px) 1586px, 100vw"},{"srcSet":"/static/5a5c6993b13dfc7a02cb200c913b58a1/1469d/02-2_find_command_done.webp 397w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/56e2d/02-2_find_command_done.webp 793w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/90d56/02-2_find_command_done.webp 1586w","type":"image/webp","sizes":"(min-width: 1586px) 1586px, 100vw"}]},"width":1586,"height":916}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/002-no-custom-cmd-found.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2c79841b523bfa8ab9ce6c25438c0894/fe3c6/002-no-custom-cmd-found.jpg","srcSet":"/static/2c79841b523bfa8ab9ce6c25438c0894/2e052/002-no-custom-cmd-found.jpg 396w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/d4265/002-no-custom-cmd-found.jpg 791w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/fe3c6/002-no-custom-cmd-found.jpg 1582w","sizes":"(min-width: 1582px) 1582px, 100vw"},"sources":[{"srcSet":"/static/2c79841b523bfa8ab9ce6c25438c0894/3357a/002-no-custom-cmd-found.avif 396w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/27e4e/002-no-custom-cmd-found.avif 791w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/63fd8/002-no-custom-cmd-found.avif 1582w","type":"image/avif","sizes":"(min-width: 1582px) 1582px, 100vw"},{"srcSet":"/static/2c79841b523bfa8ab9ce6c25438c0894/aa453/002-no-custom-cmd-found.webp 396w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/049ea/002-no-custom-cmd-found.webp 791w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/6ba81/002-no-custom-cmd-found.webp 1582w","type":"image/webp","sizes":"(min-width: 1582px) 1582px, 100vw"}]},"width":1582,"height":915}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/003-2-unzip.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/24e08/003-2-unzip.jpg","srcSet":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/167dc/003-2-unzip.jpg 333w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/7ac78/003-2-unzip.jpg 665w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/24e08/003-2-unzip.jpg 1330w","sizes":"(min-width: 1330px) 1330px, 100vw"},"sources":[{"srcSet":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/c4a52/003-2-unzip.avif 333w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/5859b/003-2-unzip.avif 665w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/28f22/003-2-unzip.avif 1330w","type":"image/avif","sizes":"(min-width: 1330px) 1330px, 100vw"},{"srcSet":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/d791d/003-2-unzip.webp 333w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/19b0c/003-2-unzip.webp 665w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/ba124/003-2-unzip.webp 1330w","type":"image/webp","sizes":"(min-width: 1330px) 1330px, 100vw"}]},"width":1330,"height":555}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/003-zip.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/53e55db587f9f9621b9a21c4d928fff1/24e08/003-zip.jpg","srcSet":"/static/53e55db587f9f9621b9a21c4d928fff1/167dc/003-zip.jpg 333w,\n/static/53e55db587f9f9621b9a21c4d928fff1/7ac78/003-zip.jpg 665w,\n/static/53e55db587f9f9621b9a21c4d928fff1/24e08/003-zip.jpg 1330w","sizes":"(min-width: 1330px) 1330px, 100vw"},"sources":[{"srcSet":"/static/53e55db587f9f9621b9a21c4d928fff1/c4a52/003-zip.avif 333w,\n/static/53e55db587f9f9621b9a21c4d928fff1/5859b/003-zip.avif 665w,\n/static/53e55db587f9f9621b9a21c4d928fff1/28f22/003-zip.avif 1330w","type":"image/avif","sizes":"(min-width: 1330px) 1330px, 100vw"},{"srcSet":"/static/53e55db587f9f9621b9a21c4d928fff1/d791d/003-zip.webp 333w,\n/static/53e55db587f9f9621b9a21c4d928fff1/19b0c/003-zip.webp 665w,\n/static/53e55db587f9f9621b9a21c4d928fff1/ba124/003-zip.webp 1330w","type":"image/webp","sizes":"(min-width: 1330px) 1330px, 100vw"}]},"width":1330,"height":555}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-17---chapter11/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/408ad/002.png","srcSet":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/b82f6/002.png 562w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/3874a/002.png 1124w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/408ad/002.png 2247w","sizes":"(min-width: 2247px) 2247px, 100vw"},"sources":[{"srcSet":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/dfc39/002.avif 562w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/1c94c/002.avif 1124w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/d3706/002.avif 2247w","type":"image/avif","sizes":"(min-width: 2247px) 2247px, 100vw"},{"srcSet":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/2f4cd/002.webp 562w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/4217f/002.webp 1124w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/c8581/002.webp 2247w","type":"image/webp","sizes":"(min-width: 2247px) 2247px, 100vw"}]},"width":2247,"height":1368}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02/media/00_OIDC_diagram.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/e87b7799d999d5459562e5da330a61ac/08814/00_OIDC_diagram.png","srcSet":"/static/e87b7799d999d5459562e5da330a61ac/c2095/00_OIDC_diagram.png 338w,\n/static/e87b7799d999d5459562e5da330a61ac/28917/00_OIDC_diagram.png 677w,\n/static/e87b7799d999d5459562e5da330a61ac/08814/00_OIDC_diagram.png 1353w","sizes":"(min-width: 1353px) 1353px, 100vw"},"sources":[{"srcSet":"/static/e87b7799d999d5459562e5da330a61ac/dca89/00_OIDC_diagram.avif 338w,\n/static/e87b7799d999d5459562e5da330a61ac/f8033/00_OIDC_diagram.avif 677w,\n/static/e87b7799d999d5459562e5da330a61ac/a79f4/00_OIDC_diagram.avif 1353w","type":"image/avif","sizes":"(min-width: 1353px) 1353px, 100vw"},{"srcSet":"/static/e87b7799d999d5459562e5da330a61ac/c0dc4/00_OIDC_diagram.webp 338w,\n/static/e87b7799d999d5459562e5da330a61ac/7d6cd/00_OIDC_diagram.webp 677w,\n/static/e87b7799d999d5459562e5da330a61ac/61c43/00_OIDC_diagram.webp 1353w","type":"image/webp","sizes":"(min-width: 1353px) 1353px, 100vw"}]},"width":1353,"height":784}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/00_SSO_delegation_diagram.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/549e80f403be0429f455ef576795da7a/dfc02/00_SSO_delegation_diagram.jpg","srcSet":"/static/549e80f403be0429f455ef576795da7a/bfda2/00_SSO_delegation_diagram.jpg 236w,\n/static/549e80f403be0429f455ef576795da7a/d498b/00_SSO_delegation_diagram.jpg 473w,\n/static/549e80f403be0429f455ef576795da7a/dfc02/00_SSO_delegation_diagram.jpg 945w","sizes":"(min-width: 945px) 945px, 100vw"},"sources":[{"srcSet":"/static/549e80f403be0429f455ef576795da7a/e69db/00_SSO_delegation_diagram.avif 236w,\n/static/549e80f403be0429f455ef576795da7a/1c7ab/00_SSO_delegation_diagram.avif 473w,\n/static/549e80f403be0429f455ef576795da7a/06e35/00_SSO_delegation_diagram.avif 945w","type":"image/avif","sizes":"(min-width: 945px) 945px, 100vw"},{"srcSet":"/static/549e80f403be0429f455ef576795da7a/b4f82/00_SSO_delegation_diagram.webp 236w,\n/static/549e80f403be0429f455ef576795da7a/8827f/00_SSO_delegation_diagram.webp 473w,\n/static/549e80f403be0429f455ef576795da7a/41285/00_SSO_delegation_diagram.webp 945w","type":"image/webp","sizes":"(min-width: 945px) 945px, 100vw"}]},"width":945,"height":472}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2019-04-19---jekyll-liquid-issue/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/01_edit_via_vscode.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2caa7e254b13d0b8e871f8401071e778/c6633/01_edit_via_vscode.jpg","srcSet":"/static/2caa7e254b13d0b8e871f8401071e778/749ac/01_edit_via_vscode.jpg 321w,\n/static/2caa7e254b13d0b8e871f8401071e778/1e8fc/01_edit_via_vscode.jpg 642w,\n/static/2caa7e254b13d0b8e871f8401071e778/c6633/01_edit_via_vscode.jpg 1284w","sizes":"(min-width: 1284px) 1284px, 100vw"},"sources":[{"srcSet":"/static/2caa7e254b13d0b8e871f8401071e778/e95f0/01_edit_via_vscode.avif 321w,\n/static/2caa7e254b13d0b8e871f8401071e778/8cb5e/01_edit_via_vscode.avif 642w,\n/static/2caa7e254b13d0b8e871f8401071e778/26b3b/01_edit_via_vscode.avif 1284w","type":"image/avif","sizes":"(min-width: 1284px) 1284px, 100vw"},{"srcSet":"/static/2caa7e254b13d0b8e871f8401071e778/9f90b/01_edit_via_vscode.webp 321w,\n/static/2caa7e254b13d0b8e871f8401071e778/a0d7f/01_edit_via_vscode.webp 642w,\n/static/2caa7e254b13d0b8e871f8401071e778/06dd0/01_edit_via_vscode.webp 1284w","type":"image/webp","sizes":"(min-width: 1284px) 1284px, 100vw"}]},"width":1284,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/03-2_setting_command_done.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/249b80fc83d017716fedc343e6f9e8a5/6aaa2/03-2_setting_command_done.jpg","srcSet":"/static/249b80fc83d017716fedc343e6f9e8a5/749ac/03-2_setting_command_done.jpg 321w,\n/static/249b80fc83d017716fedc343e6f9e8a5/cd641/03-2_setting_command_done.jpg 641w,\n/static/249b80fc83d017716fedc343e6f9e8a5/6aaa2/03-2_setting_command_done.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/249b80fc83d017716fedc343e6f9e8a5/e95f0/03-2_setting_command_done.avif 321w,\n/static/249b80fc83d017716fedc343e6f9e8a5/bf0ad/03-2_setting_command_done.avif 641w,\n/static/249b80fc83d017716fedc343e6f9e8a5/398cb/03-2_setting_command_done.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/249b80fc83d017716fedc343e6f9e8a5/9f90b/03-2_setting_command_done.webp 321w,\n/static/249b80fc83d017716fedc343e6f9e8a5/31b9d/03-2_setting_command_done.webp 641w,\n/static/249b80fc83d017716fedc343e6f9e8a5/02956/03-2_setting_command_done.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/001-no-cmd-found.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/31c90f12065accf6deddbcd404608dda/ec1bb/001-no-cmd-found.jpg","srcSet":"/static/31c90f12065accf6deddbcd404608dda/de79a/001-no-cmd-found.jpg 401w,\n/static/31c90f12065accf6deddbcd404608dda/bb5b5/001-no-cmd-found.jpg 803w,\n/static/31c90f12065accf6deddbcd404608dda/ec1bb/001-no-cmd-found.jpg 1605w","sizes":"(min-width: 1605px) 1605px, 100vw"},"sources":[{"srcSet":"/static/31c90f12065accf6deddbcd404608dda/a61ec/001-no-cmd-found.avif 401w,\n/static/31c90f12065accf6deddbcd404608dda/3385b/001-no-cmd-found.avif 803w,\n/static/31c90f12065accf6deddbcd404608dda/8944a/001-no-cmd-found.avif 1605w","type":"image/avif","sizes":"(min-width: 1605px) 1605px, 100vw"},{"srcSet":"/static/31c90f12065accf6deddbcd404608dda/cf857/001-no-cmd-found.webp 401w,\n/static/31c90f12065accf6deddbcd404608dda/215be/001-no-cmd-found.webp 803w,\n/static/31c90f12065accf6deddbcd404608dda/8fbce/001-no-cmd-found.webp 1605w","type":"image/webp","sizes":"(min-width: 1605px) 1605px, 100vw"}]},"width":1605,"height":1270}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/004-01-compress.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/679fb2ffb04485f26bc4fb6318182d8b/6aaa2/004-01-compress.jpg","srcSet":"/static/679fb2ffb04485f26bc4fb6318182d8b/749ac/004-01-compress.jpg 321w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/cd641/004-01-compress.jpg 641w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/6aaa2/004-01-compress.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/679fb2ffb04485f26bc4fb6318182d8b/e95f0/004-01-compress.avif 321w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/bf0ad/004-01-compress.avif 641w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/398cb/004-01-compress.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/679fb2ffb04485f26bc4fb6318182d8b/9f90b/004-01-compress.webp 321w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/31b9d/004-01-compress.webp 641w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/02956/004-01-compress.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/004-02-uncompress.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/79cfcbdf6f1adec340714976a965363c/6aaa2/004-02-uncompress.jpg","srcSet":"/static/79cfcbdf6f1adec340714976a965363c/749ac/004-02-uncompress.jpg 321w,\n/static/79cfcbdf6f1adec340714976a965363c/cd641/004-02-uncompress.jpg 641w,\n/static/79cfcbdf6f1adec340714976a965363c/6aaa2/004-02-uncompress.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/79cfcbdf6f1adec340714976a965363c/e95f0/004-02-uncompress.avif 321w,\n/static/79cfcbdf6f1adec340714976a965363c/bf0ad/004-02-uncompress.avif 641w,\n/static/79cfcbdf6f1adec340714976a965363c/398cb/004-02-uncompress.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/79cfcbdf6f1adec340714976a965363c/9f90b/004-02-uncompress.webp 321w,\n/static/79cfcbdf6f1adec340714976a965363c/31b9d/004-02-uncompress.webp 641w,\n/static/79cfcbdf6f1adec340714976a965363c/02956/004-02-uncompress.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-04---gatsby-add-image-captions/media/02_caption_test.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/5e9974306bf62f9a26c92fa8afe12663/9a8fc/02_caption_test.jpg","srcSet":"/static/5e9974306bf62f9a26c92fa8afe12663/936ea/02_caption_test.jpg 401w,\n/static/5e9974306bf62f9a26c92fa8afe12663/70766/02_caption_test.jpg 803w,\n/static/5e9974306bf62f9a26c92fa8afe12663/9a8fc/02_caption_test.jpg 1605w","sizes":"(min-width: 1605px) 1605px, 100vw"},"sources":[{"srcSet":"/static/5e9974306bf62f9a26c92fa8afe12663/b6e8d/02_caption_test.avif 401w,\n/static/5e9974306bf62f9a26c92fa8afe12663/cdb10/02_caption_test.avif 803w,\n/static/5e9974306bf62f9a26c92fa8afe12663/9a57d/02_caption_test.avif 1605w","type":"image/avif","sizes":"(min-width: 1605px) 1605px, 100vw"},{"srcSet":"/static/5e9974306bf62f9a26c92fa8afe12663/0a50a/02_caption_test.webp 401w,\n/static/5e9974306bf62f9a26c92fa8afe12663/83d18/02_caption_test.webp 803w,\n/static/5e9974306bf62f9a26c92fa8afe12663/37b6f/02_caption_test.webp 1605w","type":"image/webp","sizes":"(min-width: 1605px) 1605px, 100vw"}]},"width":1605,"height":1128}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02/media/01_OIDC_sequence_diagram.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/e75384ebc39dc3c4dfc9779e790af9ca/74306/01_OIDC_sequence_diagram.png","srcSet":"/static/e75384ebc39dc3c4dfc9779e790af9ca/7a115/01_OIDC_sequence_diagram.png 352w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/2004f/01_OIDC_sequence_diagram.png 704w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/74306/01_OIDC_sequence_diagram.png 1407w","sizes":"(min-width: 1407px) 1407px, 100vw"},"sources":[{"srcSet":"/static/e75384ebc39dc3c4dfc9779e790af9ca/3915c/01_OIDC_sequence_diagram.avif 352w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/465ea/01_OIDC_sequence_diagram.avif 704w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/ea8b6/01_OIDC_sequence_diagram.avif 1407w","type":"image/avif","sizes":"(min-width: 1407px) 1407px, 100vw"},{"srcSet":"/static/e75384ebc39dc3c4dfc9779e790af9ca/bf3d1/01_OIDC_sequence_diagram.webp 352w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/ce4f1/01_OIDC_sequence_diagram.webp 704w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/9af41/01_OIDC_sequence_diagram.webp 1407w","type":"image/webp","sizes":"(min-width: 1407px) 1407px, 100vw"}]},"width":1407,"height":1601}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/00_SSO_propagation_diagram.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9a847bcbd3eac8d49d838fb23932f7f9/dfc02/00_SSO_propagation_diagram.jpg","srcSet":"/static/9a847bcbd3eac8d49d838fb23932f7f9/bfda2/00_SSO_propagation_diagram.jpg 236w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/d498b/00_SSO_propagation_diagram.jpg 473w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/dfc02/00_SSO_propagation_diagram.jpg 945w","sizes":"(min-width: 945px) 945px, 100vw"},"sources":[{"srcSet":"/static/9a847bcbd3eac8d49d838fb23932f7f9/e69db/00_SSO_propagation_diagram.avif 236w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/1c7ab/00_SSO_propagation_diagram.avif 473w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/06e35/00_SSO_propagation_diagram.avif 945w","type":"image/avif","sizes":"(min-width: 945px) 945px, 100vw"},{"srcSet":"/static/9a847bcbd3eac8d49d838fb23932f7f9/b4f82/00_SSO_propagation_diagram.webp 236w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/8827f/00_SSO_propagation_diagram.webp 473w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/41285/00_SSO_propagation_diagram.webp 945w","type":"image/webp","sizes":"(min-width: 945px) 945px, 100vw"}]},"width":945,"height":472}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2021-09-20---python-concurrency-101/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2022-06-10---python-descriptor-described/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101/media/02-python-container-shared.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#081818","images":{"fallback":{"src":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/02-python-container-shared.png","srcSet":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/3f48c/02-python-container-shared.png 295w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/77227/02-python-container-shared.png 590w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/02-python-container-shared.png 1180w","sizes":"(min-width: 1180px) 1180px, 100vw"},"sources":[{"srcSet":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b8ed8/02-python-container-shared.avif 295w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c75cc/02-python-container-shared.avif 590w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/0b58c/02-python-container-shared.avif 1180w","type":"image/avif","sizes":"(min-width: 1180px) 1180px, 100vw"},{"srcSet":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/f5a44/02-python-container-shared.webp 295w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c93c8/02-python-container-shared.webp 590w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/02-python-container-shared.webp 1180w","type":"image/webp","sizes":"(min-width: 1180px) 1180px, 100vw"}]},"width":1180,"height":1268}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2022-06-09---python-classmethod-and-staticmethod/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/03-1_compare_before.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/b1615abf3a046611cd25153b873fcdf9/6aaa2/03-1_compare_before.jpg","srcSet":"/static/b1615abf3a046611cd25153b873fcdf9/749ac/03-1_compare_before.jpg 321w,\n/static/b1615abf3a046611cd25153b873fcdf9/cd641/03-1_compare_before.jpg 641w,\n/static/b1615abf3a046611cd25153b873fcdf9/6aaa2/03-1_compare_before.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/b1615abf3a046611cd25153b873fcdf9/e95f0/03-1_compare_before.avif 321w,\n/static/b1615abf3a046611cd25153b873fcdf9/bf0ad/03-1_compare_before.avif 641w,\n/static/b1615abf3a046611cd25153b873fcdf9/398cb/03-1_compare_before.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/b1615abf3a046611cd25153b873fcdf9/9f90b/03-1_compare_before.webp 321w,\n/static/b1615abf3a046611cd25153b873fcdf9/31b9d/03-1_compare_before.webp 641w,\n/static/b1615abf3a046611cd25153b873fcdf9/02956/03-1_compare_before.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/02-1_find_command_no_cmd_found.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/f30e44bbd7976e549e3b426141b39484/c6633/02-1_find_command_no_cmd_found.jpg","srcSet":"/static/f30e44bbd7976e549e3b426141b39484/749ac/02-1_find_command_no_cmd_found.jpg 321w,\n/static/f30e44bbd7976e549e3b426141b39484/1e8fc/02-1_find_command_no_cmd_found.jpg 642w,\n/static/f30e44bbd7976e549e3b426141b39484/c6633/02-1_find_command_no_cmd_found.jpg 1284w","sizes":"(min-width: 1284px) 1284px, 100vw"},"sources":[{"srcSet":"/static/f30e44bbd7976e549e3b426141b39484/e95f0/02-1_find_command_no_cmd_found.avif 321w,\n/static/f30e44bbd7976e549e3b426141b39484/8cb5e/02-1_find_command_no_cmd_found.avif 642w,\n/static/f30e44bbd7976e549e3b426141b39484/26b3b/02-1_find_command_no_cmd_found.avif 1284w","type":"image/avif","sizes":"(min-width: 1284px) 1284px, 100vw"},{"srcSet":"/static/f30e44bbd7976e549e3b426141b39484/9f90b/02-1_find_command_no_cmd_found.webp 321w,\n/static/f30e44bbd7976e549e3b426141b39484/a0d7f/02-1_find_command_no_cmd_found.webp 642w,\n/static/f30e44bbd7976e549e3b426141b39484/06dd0/02-1_find_command_no_cmd_found.webp 1284w","type":"image/webp","sizes":"(min-width: 1284px) 1284px, 100vw"}]},"width":1284,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/exotic_shorthair.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#887868","images":{"fallback":{"src":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg","srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/90ed1/exotic_shorthair.jpg 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/2070e/exotic_shorthair.jpg 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/1aafe/exotic_shorthair.avif 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6707c/exotic_shorthair.avif 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6ee87/exotic_shorthair.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/b5535/exotic_shorthair.webp 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/f5c71/exotic_shorthair.webp 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/0d27e/exotic_shorthair.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":600}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-24---probing-pep-333-3-wsgi-and-asgi-pt02/media/exotic_shorthair.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#887868","images":{"fallback":{"src":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg","srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/90ed1/exotic_shorthair.jpg 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/2070e/exotic_shorthair.jpg 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/1aafe/exotic_shorthair.avif 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6707c/exotic_shorthair.avif 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6ee87/exotic_shorthair.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/b5535/exotic_shorthair.webp 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/f5c71/exotic_shorthair.webp 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/0d27e/exotic_shorthair.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":600}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-25---probing-pep-333-3-wsgi-and-asgi-pt03/media/exotic_shorthair.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#887868","images":{"fallback":{"src":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg","srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/90ed1/exotic_shorthair.jpg 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/2070e/exotic_shorthair.jpg 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/1aafe/exotic_shorthair.avif 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6707c/exotic_shorthair.avif 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6ee87/exotic_shorthair.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/b5535/exotic_shorthair.webp 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/f5c71/exotic_shorthair.webp 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/0d27e/exotic_shorthair.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":600}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/000_preface.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/5222f327748bfaed1ca2537df9f08e27/9307b/000_preface.jpg","srcSet":"/static/5222f327748bfaed1ca2537df9f08e27/982ea/000_preface.jpg 787w,\n/static/5222f327748bfaed1ca2537df9f08e27/21a0b/000_preface.jpg 1574w,\n/static/5222f327748bfaed1ca2537df9f08e27/9307b/000_preface.jpg 3148w","sizes":"(min-width: 3148px) 3148px, 100vw"},"sources":[{"srcSet":"/static/5222f327748bfaed1ca2537df9f08e27/75fcb/000_preface.avif 787w,\n/static/5222f327748bfaed1ca2537df9f08e27/ac616/000_preface.avif 1574w,\n/static/5222f327748bfaed1ca2537df9f08e27/0a097/000_preface.avif 3148w","type":"image/avif","sizes":"(min-width: 3148px) 3148px, 100vw"},{"srcSet":"/static/5222f327748bfaed1ca2537df9f08e27/a3daa/000_preface.webp 787w,\n/static/5222f327748bfaed1ca2537df9f08e27/20d44/000_preface.webp 1574w,\n/static/5222f327748bfaed1ca2537df9f08e27/8ad52/000_preface.webp 3148w","type":"image/webp","sizes":"(min-width: 3148px) 3148px, 100vw"}]},"width":3148,"height":868}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/005-01-zip-cmd.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2d74024f7e9725b43ee27f476bc8ad1c/a4926/005-01-zip-cmd.jpg","srcSet":"/static/2d74024f7e9725b43ee27f476bc8ad1c/a19d6/005-01-zip-cmd.jpg 543w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/4be3c/005-01-zip-cmd.jpg 1085w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/a4926/005-01-zip-cmd.jpg 2170w","sizes":"(min-width: 2170px) 2170px, 100vw"},"sources":[{"srcSet":"/static/2d74024f7e9725b43ee27f476bc8ad1c/b0ed3/005-01-zip-cmd.avif 543w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/ab909/005-01-zip-cmd.avif 1085w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/5bc13/005-01-zip-cmd.avif 2170w","type":"image/avif","sizes":"(min-width: 2170px) 2170px, 100vw"},{"srcSet":"/static/2d74024f7e9725b43ee27f476bc8ad1c/b004a/005-01-zip-cmd.webp 543w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/511a4/005-01-zip-cmd.webp 1085w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/b7329/005-01-zip-cmd.webp 2170w","type":"image/webp","sizes":"(min-width: 2170px) 2170px, 100vw"}]},"width":2170,"height":1586}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-24---chapter12/media/001.jpeg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/3d9505f0b4060dbd2ce2964a777c7bce/859ab/001.jpg","srcSet":"/static/3d9505f0b4060dbd2ce2964a777c7bce/3669b/001.jpg 463w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/7bc15/001.jpg 925w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/859ab/001.jpg 1850w","sizes":"(min-width: 1850px) 1850px, 100vw"},"sources":[{"srcSet":"/static/3d9505f0b4060dbd2ce2964a777c7bce/c7367/001.avif 463w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/d4a47/001.avif 925w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/c5ca0/001.avif 1850w","type":"image/avif","sizes":"(min-width: 1850px) 1850px, 100vw"},{"srcSet":"/static/3d9505f0b4060dbd2ce2964a777c7bce/2c679/001.webp 463w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/8daae/001.webp 925w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/13dc3/001.webp 1850w","type":"image/webp","sizes":"(min-width: 1850px) 1850px, 100vw"}]},"width":1850,"height":1823}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/002_server-middleware-app.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/eb58b/002_server-middleware-app.png","srcSet":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/f8356/002_server-middleware-app.png 353w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/bba45/002_server-middleware-app.png 705w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/eb58b/002_server-middleware-app.png 1410w","sizes":"(min-width: 1410px) 1410px, 100vw"},"sources":[{"srcSet":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/b471f/002_server-middleware-app.avif 353w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/e7335/002_server-middleware-app.avif 705w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/f2baf/002_server-middleware-app.avif 1410w","type":"image/avif","sizes":"(min-width: 1410px) 1410px, 100vw"},{"srcSet":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/851aa/002_server-middleware-app.webp 353w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/c21a1/002_server-middleware-app.webp 705w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/ac104/002_server-middleware-app.webp 1410w","type":"image/webp","sizes":"(min-width: 1410px) 1410px, 100vw"}]},"width":1410,"height":769}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101/media/01-python-container-simple.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#081818","images":{"fallback":{"src":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/01-python-container-simple.png","srcSet":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/cee1b/01-python-container-simple.png 291w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/bb2dc/01-python-container-simple.png 582w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/01-python-container-simple.png 1164w","sizes":"(min-width: 1164px) 1164px, 100vw"},"sources":[{"srcSet":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/aa2a9/01-python-container-simple.avif 291w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/04701/01-python-container-simple.avif 582w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/01-python-container-simple.avif 1164w","type":"image/avif","sizes":"(min-width: 1164px) 1164px, 100vw"},{"srcSet":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/ae6be/01-python-container-simple.webp 291w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/acea3/01-python-container-simple.webp 582w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/01-python-container-simple.webp 1164w","type":"image/webp","sizes":"(min-width: 1164px) 1164px, 100vw"}]},"width":1164,"height":1670}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt01/media/under_construction.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg","srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/de105/under_construction.jpg 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/643b0/under_construction.jpg 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/0b70d/under_construction.avif 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/6172e/under_construction.avif 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/49453/under_construction.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/85e35/under_construction.webp 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/5803e/under_construction.webp 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/dfbe4/under_construction.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2024-09-17---geultto-10th-life-retrospect/media/under_construction.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg","srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/de105/under_construction.jpg 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/643b0/under_construction.jpg 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/0b70d/under_construction.avif 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/6172e/under_construction.avif 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/49453/under_construction.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/85e35/under_construction.webp 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/5803e/under_construction.webp 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/dfbe4/under_construction.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt02/media/under_construction.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg","srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/de105/under_construction.jpg 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/643b0/under_construction.jpg 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/0b70d/under_construction.avif 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/6172e/under_construction.avif 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/49453/under_construction.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/85e35/under_construction.webp 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/5803e/under_construction.webp 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/dfbe4/under_construction.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/005-02-unzip-cmd.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/e78776b3a692228334bebf1a49550d13/1307f/005-02-unzip-cmd.jpg","srcSet":"/static/e78776b3a692228334bebf1a49550d13/80b8d/005-02-unzip-cmd.jpg 538w,\n/static/e78776b3a692228334bebf1a49550d13/f0d7c/005-02-unzip-cmd.jpg 1075w,\n/static/e78776b3a692228334bebf1a49550d13/1307f/005-02-unzip-cmd.jpg 2150w","sizes":"(min-width: 2150px) 2150px, 100vw"},"sources":[{"srcSet":"/static/e78776b3a692228334bebf1a49550d13/953fc/005-02-unzip-cmd.avif 538w,\n/static/e78776b3a692228334bebf1a49550d13/20c8a/005-02-unzip-cmd.avif 1075w,\n/static/e78776b3a692228334bebf1a49550d13/553d6/005-02-unzip-cmd.avif 2150w","type":"image/avif","sizes":"(min-width: 2150px) 2150px, 100vw"},{"srcSet":"/static/e78776b3a692228334bebf1a49550d13/a33c7/005-02-unzip-cmd.webp 538w,\n/static/e78776b3a692228334bebf1a49550d13/a5cb0/005-02-unzip-cmd.webp 1075w,\n/static/e78776b3a692228334bebf1a49550d13/43070/005-02-unzip-cmd.webp 2150w","type":"image/webp","sizes":"(min-width: 2150px) 2150px, 100vw"}]},"width":2150,"height":1590}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/003_wsgi_as_onion.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/d122a/003_wsgi_as_onion.jpg","srcSet":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/3c0ca/003_wsgi_as_onion.jpg 570w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/844e1/003_wsgi_as_onion.jpg 1141w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/d122a/003_wsgi_as_onion.jpg 2281w","sizes":"(min-width: 2281px) 2281px, 100vw"},"sources":[{"srcSet":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/af019/003_wsgi_as_onion.avif 570w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/a4e15/003_wsgi_as_onion.avif 1141w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/8a468/003_wsgi_as_onion.avif 2281w","type":"image/avif","sizes":"(min-width: 2281px) 2281px, 100vw"},{"srcSet":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/c92d5/003_wsgi_as_onion.webp 570w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/b8ef6/003_wsgi_as_onion.webp 1141w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/e6551/003_wsgi_as_onion.webp 2281w","type":"image/webp","sizes":"(min-width: 2281px) 2281px, 100vw"}]},"width":2281,"height":1709}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2020-05-22---s3ich4n-1-year-retrospect/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-21---pt01/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-21---pt02/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-24---pt04/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-23---pt03/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/docker/2021-09-18---how-to-make-docker-image-securely/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/004_example_of_multi_middlewares.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/27d3fbb341af172ca2f5df87e0b442f7/10ca9/004_example_of_multi_middlewares.png","srcSet":"/static/27d3fbb341af172ca2f5df87e0b442f7/f0e06/004_example_of_multi_middlewares.png 885w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/6d073/004_example_of_multi_middlewares.png 1769w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/10ca9/004_example_of_multi_middlewares.png 3538w","sizes":"(min-width: 3538px) 3538px, 100vw"},"sources":[{"srcSet":"/static/27d3fbb341af172ca2f5df87e0b442f7/c2652/004_example_of_multi_middlewares.avif 885w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/5a158/004_example_of_multi_middlewares.avif 1769w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/906ad/004_example_of_multi_middlewares.avif 3538w","type":"image/avif","sizes":"(min-width: 3538px) 3538px, 100vw"},{"srcSet":"/static/27d3fbb341af172ca2f5df87e0b442f7/e61f2/004_example_of_multi_middlewares.webp 885w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/332e0/004_example_of_multi_middlewares.webp 1769w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/d7d10/004_example_of_multi_middlewares.webp 3538w","type":"image/webp","sizes":"(min-width: 3538px) 3538px, 100vw"}]},"width":3538,"height":2041}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt01/media/02_work_in_progress.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#a89888","images":{"fallback":{"src":"/static/f7ec5fef710ac54da2d6134e66147dc5/7a5be/02_work_in_progress.jpg","srcSet":"/static/f7ec5fef710ac54da2d6134e66147dc5/de105/02_work_in_progress.jpg 1000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/643b0/02_work_in_progress.jpg 2000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/7a5be/02_work_in_progress.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/f7ec5fef710ac54da2d6134e66147dc5/0b70d/02_work_in_progress.avif 1000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/6172e/02_work_in_progress.avif 2000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/49453/02_work_in_progress.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/f7ec5fef710ac54da2d6134e66147dc5/85e35/02_work_in_progress.webp 1000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/5803e/02_work_in_progress.webp 2000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/dfbe4/02_work_in_progress.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-06-03---how-to-use-file-signature-in-pycharm/media/pangyo_01.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#183878","images":{"fallback":{"src":"/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg","srcSet":"/static/4644b783d0f0d4821bbffead009ea763/6c903/pangyo_01.jpg 756w,\n/static/4644b783d0f0d4821bbffead009ea763/44670/pangyo_01.jpg 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/051f6/pangyo_01.avif 756w,\n/static/4644b783d0f0d4821bbffead009ea763/46b78/pangyo_01.avif 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/8724c/pangyo_01.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/dd945/pangyo_01.webp 756w,\n/static/4644b783d0f0d4821bbffead009ea763/76fb3/pangyo_01.webp 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/7d916/pangyo_01.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":4032}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-07-11---how-to-use-pre-commit-hook-vol1/media/pangyo_01.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#183878","images":{"fallback":{"src":"/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg","srcSet":"/static/4644b783d0f0d4821bbffead009ea763/6c903/pangyo_01.jpg 756w,\n/static/4644b783d0f0d4821bbffead009ea763/44670/pangyo_01.jpg 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/051f6/pangyo_01.avif 756w,\n/static/4644b783d0f0d4821bbffead009ea763/46b78/pangyo_01.avif 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/8724c/pangyo_01.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/dd945/pangyo_01.webp 756w,\n/static/4644b783d0f0d4821bbffead009ea763/76fb3/pangyo_01.webp 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/7d916/pangyo_01.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":4032}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-28---pt01-ch01/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-01---pt01-ch03/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/photo.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/4c2c993a06ee0fd0ee953020b09128a9/ae1c8/photo.png","srcSet":"/static/4c2c993a06ee0fd0ee953020b09128a9/08932/photo.png 270w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/1fa44/photo.png 540w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/ae1c8/photo.png 1080w","sizes":"(min-width: 1080px) 1080px, 100vw"},"sources":[{"srcSet":"/static/4c2c993a06ee0fd0ee953020b09128a9/3e0da/photo.avif 270w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/ecab3/photo.avif 540w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/caf3c/photo.avif 1080w","type":"image/avif","sizes":"(min-width: 1080px) 1080px, 100vw"},{"srcSet":"/static/4c2c993a06ee0fd0ee953020b09128a9/ede49/photo.webp 270w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/4cb34/photo.webp 540w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/4f506/photo.webp 1080w","type":"image/webp","sizes":"(min-width: 1080px) 1080px, 100vw"}]},"width":1080,"height":1080}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/001_wsgi_ianb.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/372de2bba708d50f0ea0962afc2e0754/04184/001_wsgi_ianb.png","srcSet":"/static/372de2bba708d50f0ea0962afc2e0754/54ce8/001_wsgi_ianb.png 407w,\n/static/372de2bba708d50f0ea0962afc2e0754/1b367/001_wsgi_ianb.png 815w,\n/static/372de2bba708d50f0ea0962afc2e0754/04184/001_wsgi_ianb.png 1629w","sizes":"(min-width: 1629px) 1629px, 100vw"},"sources":[{"srcSet":"/static/372de2bba708d50f0ea0962afc2e0754/78b6c/001_wsgi_ianb.avif 407w,\n/static/372de2bba708d50f0ea0962afc2e0754/439fa/001_wsgi_ianb.avif 815w,\n/static/372de2bba708d50f0ea0962afc2e0754/10129/001_wsgi_ianb.avif 1629w","type":"image/avif","sizes":"(min-width: 1629px) 1629px, 100vw"},{"srcSet":"/static/372de2bba708d50f0ea0962afc2e0754/32393/001_wsgi_ianb.webp 407w,\n/static/372de2bba708d50f0ea0962afc2e0754/8df98/001_wsgi_ianb.webp 815w,\n/static/372de2bba708d50f0ea0962afc2e0754/67b49/001_wsgi_ianb.webp 1629w","type":"image/webp","sizes":"(min-width: 1629px) 1629px, 100vw"}]},"width":1629,"height":1151}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02/media/pomeranian.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg","srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/85aae/pomeranian.jpg 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/64308/pomeranian.jpg 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg 3648w","sizes":"(min-width: 3648px) 3648px, 100vw"},"sources":[{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/b1f04/pomeranian.avif 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/def07/pomeranian.avif 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/8a681/pomeranian.avif 3648w","type":"image/avif","sizes":"(min-width: 3648px) 3648px, 100vw"},{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/fabd0/pomeranian.webp 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/d2b65/pomeranian.webp 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/99098/pomeranian.webp 3648w","type":"image/webp","sizes":"(min-width: 3648px) 3648px, 100vw"}]},"width":3648,"height":2736}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/pomeranian.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg","srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/85aae/pomeranian.jpg 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/64308/pomeranian.jpg 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg 3648w","sizes":"(min-width: 3648px) 3648px, 100vw"},"sources":[{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/b1f04/pomeranian.avif 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/def07/pomeranian.avif 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/8a681/pomeranian.avif 3648w","type":"image/avif","sizes":"(min-width: 3648px) 3648px, 100vw"},{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/fabd0/pomeranian.webp 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/d2b65/pomeranian.webp 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/99098/pomeranian.webp 3648w","type":"image/webp","sizes":"(min-width: 3648px) 3648px, 100vw"}]},"width":3648,"height":2736}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-08---meaning-of-z-in-shell-script/media/snow.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/a987257fb708949394f663b920a257ca/7a5be/snow.jpg","srcSet":"/static/a987257fb708949394f663b920a257ca/de105/snow.jpg 1000w,\n/static/a987257fb708949394f663b920a257ca/643b0/snow.jpg 2000w,\n/static/a987257fb708949394f663b920a257ca/7a5be/snow.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/a987257fb708949394f663b920a257ca/0b70d/snow.avif 1000w,\n/static/a987257fb708949394f663b920a257ca/6172e/snow.avif 2000w,\n/static/a987257fb708949394f663b920a257ca/49453/snow.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/a987257fb708949394f663b920a257ca/85e35/snow.webp 1000w,\n/static/a987257fb708949394f663b920a257ca/5803e/snow.webp 2000w,\n/static/a987257fb708949394f663b920a257ca/dfbe4/snow.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/pages/about/media/me-at-the-cafe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#b8a898","images":{"fallback":{"src":"/static/12554c1a548e676cd9e72d76d2f6a606/68a6f/me-at-the-cafe.jpg","srcSet":"/static/12554c1a548e676cd9e72d76d2f6a606/dfcd4/me-at-the-cafe.jpg 1008w,\n/static/12554c1a548e676cd9e72d76d2f6a606/b97c6/me-at-the-cafe.jpg 2016w,\n/static/12554c1a548e676cd9e72d76d2f6a606/68a6f/me-at-the-cafe.jpg 4032w","sizes":"(min-width: 4032px) 4032px, 100vw"},"sources":[{"srcSet":"/static/12554c1a548e676cd9e72d76d2f6a606/55091/me-at-the-cafe.avif 1008w,\n/static/12554c1a548e676cd9e72d76d2f6a606/f9389/me-at-the-cafe.avif 2016w,\n/static/12554c1a548e676cd9e72d76d2f6a606/7af6b/me-at-the-cafe.avif 4032w","type":"image/avif","sizes":"(min-width: 4032px) 4032px, 100vw"},{"srcSet":"/static/12554c1a548e676cd9e72d76d2f6a606/80cfb/me-at-the-cafe.webp 1008w,\n/static/12554c1a548e676cd9e72d76d2f6a606/66d80/me-at-the-cafe.webp 2016w,\n/static/12554c1a548e676cd9e72d76d2f6a606/5cc0d/me-at-the-cafe.webp 4032w","type":"image/webp","sizes":"(min-width: 4032px) 4032px, 100vw"}]},"width":4032,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file/media/sarang-bang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#685848","images":{"fallback":{"src":"/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg","srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/de105/sarang-bang.jpg 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/643b0/sarang-bang.jpg 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/0b70d/sarang-bang.avif 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/6172e/sarang-bang.avif 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/49453/sarang-bang.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/85e35/sarang-bang.webp 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/5803e/sarang-bang.webp 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/dfbe4/sarang-bang.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/sarang-bang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#685848","images":{"fallback":{"src":"/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg","srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/de105/sarang-bang.jpg 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/643b0/sarang-bang.jpg 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/0b70d/sarang-bang.avif 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/6172e/sarang-bang.avif 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/49453/sarang-bang.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/85e35/sarang-bang.webp 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/5803e/sarang-bang.webp 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/dfbe4/sarang-bang.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/sarang-bang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#685848","images":{"fallback":{"src":"/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg","srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/de105/sarang-bang.jpg 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/643b0/sarang-bang.jpg 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/0b70d/sarang-bang.avif 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/6172e/sarang-bang.avif 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/49453/sarang-bang.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/85e35/sarang-bang.webp 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/5803e/sarang-bang.webp 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/dfbe4/sarang-bang.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/data/2020-02-05---ksqldb-101-pt01/media/j1.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg","srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/4a00f/j1.jpg 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/facf2/j1.jpg 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0d964/j1.avif 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/fc319/j1.avif 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/759e3/j1.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0531b/j1.webp 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/dd848/j1.webp 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/95aac/j1.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/data/2020-02-06---ksqldb-101-pt02/media/j1.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg","srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/4a00f/j1.jpg 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/facf2/j1.jpg 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0d964/j1.avif 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/fc319/j1.avif 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/759e3/j1.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0531b/j1.webp 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/dd848/j1.webp 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/95aac/j1.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/data/2020-03-10---ksqldb-101-pt03/media/j1.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg","srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/4a00f/j1.jpg 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/facf2/j1.jpg 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0d964/j1.avif 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/fc319/j1.avif 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/759e3/j1.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0531b/j1.webp 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/dd848/j1.webp 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/95aac/j1.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-11---pt01-ch01/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch02/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch03/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-17---pt01-ch07/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-16---pt01-ch05/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-15---pt01-ch04/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-16---pt01-ch06/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-17---pt02-ch08/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-06---pt02-ch09/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-07---pt02-ch10/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-18---pt02-ch11/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-18---pt02-ch12/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}}]}}} \ No newline at end of file +{"data":{"images":{"edges":[{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt01/media/01_domain.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/a49d027e7b75350e20b5ab9fcdae33f3/4f368/01_domain.png","srcSet":"/static/a49d027e7b75350e20b5ab9fcdae33f3/e0483/01_domain.png 118w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/320e2/01_domain.png 237w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/4f368/01_domain.png 473w","sizes":"(min-width: 473px) 473px, 100vw"},"sources":[{"srcSet":"/static/a49d027e7b75350e20b5ab9fcdae33f3/380fc/01_domain.avif 118w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/9b99f/01_domain.avif 237w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/6c96d/01_domain.avif 473w","type":"image/avif","sizes":"(min-width: 473px) 473px, 100vw"},{"srcSet":"/static/a49d027e7b75350e20b5ab9fcdae33f3/3c18c/01_domain.webp 118w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/7054d/01_domain.webp 237w,\n/static/a49d027e7b75350e20b5ab9fcdae33f3/3c4f6/01_domain.webp 473w","type":"image/webp","sizes":"(min-width: 473px) 473px, 100vw"}]},"width":473,"height":423}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-02-03---server-maintenance-guide-101/media/aa.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#e8e8d8","images":{"fallback":{"src":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/1a361/aa.jpg","srcSet":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/2c33f/aa.jpg 56w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/fa873/aa.jpg 113w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/1a361/aa.jpg 225w","sizes":"(min-width: 225px) 225px, 100vw"},"sources":[{"srcSet":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/4175e/aa.avif 56w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/cb563/aa.avif 113w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/c593a/aa.avif 225w","type":"image/avif","sizes":"(min-width: 225px) 225px, 100vw"},{"srcSet":"/static/1b52a91236bb4a4ef989c4bb3b638ecf/f8744/aa.webp 56w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/26b1c/aa.webp 113w,\n/static/1b52a91236bb4a4ef989c4bb3b638ecf/252a0/aa.webp 225w","type":"image/webp","sizes":"(min-width: 225px) 225px, 100vw"}]},"width":225,"height":225}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/001-02-problem-found.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/82c50e4650173ff00047c998900a0fe6/a1054/001-02-problem-found.png","srcSet":"/static/82c50e4650173ff00047c998900a0fe6/a44bc/001-02-problem-found.png 443w,\n/static/82c50e4650173ff00047c998900a0fe6/44334/001-02-problem-found.png 886w,\n/static/82c50e4650173ff00047c998900a0fe6/a1054/001-02-problem-found.png 1772w","sizes":"(min-width: 1772px) 1772px, 100vw"},"sources":[{"srcSet":"/static/82c50e4650173ff00047c998900a0fe6/ef3cb/001-02-problem-found.avif 443w,\n/static/82c50e4650173ff00047c998900a0fe6/853fe/001-02-problem-found.avif 886w,\n/static/82c50e4650173ff00047c998900a0fe6/4f726/001-02-problem-found.avif 1772w","type":"image/avif","sizes":"(min-width: 1772px) 1772px, 100vw"},{"srcSet":"/static/82c50e4650173ff00047c998900a0fe6/b7d55/001-02-problem-found.webp 443w,\n/static/82c50e4650173ff00047c998900a0fe6/3da55/001-02-problem-found.webp 886w,\n/static/82c50e4650173ff00047c998900a0fe6/3da8f/001-02-problem-found.webp 1772w","type":"image/webp","sizes":"(min-width: 1772px) 1772px, 100vw"}]},"width":1772,"height":268}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/002_command_toggle.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/b78bc/002_command_toggle.jpg","srcSet":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/58d30/002_command_toggle.jpg 302w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/1ab62/002_command_toggle.jpg 603w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/b78bc/002_command_toggle.jpg 1206w","sizes":"(min-width: 1206px) 1206px, 100vw"},"sources":[{"srcSet":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/25866/002_command_toggle.avif 302w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/64c7b/002_command_toggle.avif 603w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/4c509/002_command_toggle.avif 1206w","type":"image/avif","sizes":"(min-width: 1206px) 1206px, 100vw"},{"srcSet":"/static/f8a0a108f674bf3f21e10b9f9e7700a2/730f1/002_command_toggle.webp 302w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/321c3/002_command_toggle.webp 603w,\n/static/f8a0a108f674bf3f21e10b9f9e7700a2/5be66/002_command_toggle.webp 1206w","type":"image/webp","sizes":"(min-width: 1206px) 1206px, 100vw"}]},"width":1206,"height":238}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file/media/01_no_newline.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/21519913a8bf7c5b79a5ae0bc583dedc/d9009/01_no_newline.png","srcSet":"/static/21519913a8bf7c5b79a5ae0bc583dedc/bcf47/01_no_newline.png 95w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/666f8/01_no_newline.png 191w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/d9009/01_no_newline.png 381w","sizes":"(min-width: 381px) 381px, 100vw"},"sources":[{"srcSet":"/static/21519913a8bf7c5b79a5ae0bc583dedc/10c9a/01_no_newline.avif 95w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/afe09/01_no_newline.avif 191w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/351f1/01_no_newline.avif 381w","type":"image/avif","sizes":"(min-width: 381px) 381px, 100vw"},{"srcSet":"/static/21519913a8bf7c5b79a5ae0bc583dedc/2fb9c/01_no_newline.webp 95w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/f1621/01_no_newline.webp 191w,\n/static/21519913a8bf7c5b79a5ae0bc583dedc/9f2ce/01_no_newline.webp 381w","type":"image/webp","sizes":"(min-width: 381px) 381px, 100vw"}]},"width":381,"height":173}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file/media/02_crlf_lf.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/1bfee06304876faf876ef53c5bbadf3f/3d5ea/02_crlf_lf.jpg","srcSet":"/static/1bfee06304876faf876ef53c5bbadf3f/50142/02_crlf_lf.jpg 42w,\n/static/1bfee06304876faf876ef53c5bbadf3f/23974/02_crlf_lf.jpg 84w,\n/static/1bfee06304876faf876ef53c5bbadf3f/3d5ea/02_crlf_lf.jpg 168w","sizes":"(min-width: 168px) 168px, 100vw"},"sources":[{"srcSet":"/static/1bfee06304876faf876ef53c5bbadf3f/6912c/02_crlf_lf.avif 42w,\n/static/1bfee06304876faf876ef53c5bbadf3f/985e7/02_crlf_lf.avif 84w,\n/static/1bfee06304876faf876ef53c5bbadf3f/67d5a/02_crlf_lf.avif 168w","type":"image/avif","sizes":"(min-width: 168px) 168px, 100vw"},{"srcSet":"/static/1bfee06304876faf876ef53c5bbadf3f/96243/02_crlf_lf.webp 42w,\n/static/1bfee06304876faf876ef53c5bbadf3f/293a9/02_crlf_lf.webp 84w,\n/static/1bfee06304876faf876ef53c5bbadf3f/89bb6/02_crlf_lf.webp 168w","type":"image/webp","sizes":"(min-width: 168px) 168px, 100vw"}]},"width":168,"height":94}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-04---gatsby-add-image-captions/media/01_code_example.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/d68475d82092758bb3e595b7b73d97aa/db879/01_code_example.png","srcSet":"/static/d68475d82092758bb3e595b7b73d97aa/d9bca/01_code_example.png 255w,\n/static/d68475d82092758bb3e595b7b73d97aa/b1384/01_code_example.png 511w,\n/static/d68475d82092758bb3e595b7b73d97aa/db879/01_code_example.png 1021w","sizes":"(min-width: 1021px) 1021px, 100vw"},"sources":[{"srcSet":"/static/d68475d82092758bb3e595b7b73d97aa/dd838/01_code_example.avif 255w,\n/static/d68475d82092758bb3e595b7b73d97aa/6319d/01_code_example.avif 511w,\n/static/d68475d82092758bb3e595b7b73d97aa/47822/01_code_example.avif 1021w","type":"image/avif","sizes":"(min-width: 1021px) 1021px, 100vw"},{"srcSet":"/static/d68475d82092758bb3e595b7b73d97aa/f0ab4/01_code_example.webp 255w,\n/static/d68475d82092758bb3e595b7b73d97aa/d51b0/01_code_example.webp 511w,\n/static/d68475d82092758bb3e595b7b73d97aa/88810/01_code_example.webp 1021w","type":"image/webp","sizes":"(min-width: 1021px) 1021px, 100vw"}]},"width":1021,"height":481.00000000000006}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-06---chapter01/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-06---chapter02/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-13---chapter03/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-13---chapter04/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-27---chapter05/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-01-27---chapter06/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-03---chapter07/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-03---chapter08/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-10---chapter09/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-10---chapter10/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-17---chapter11/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c667bd99d14a07251b6678d7481e91c2/36c31/001.png","srcSet":"/static/c667bd99d14a07251b6678d7481e91c2/acb06/001.png 212w,\n/static/c667bd99d14a07251b6678d7481e91c2/e3149/001.png 425w,\n/static/c667bd99d14a07251b6678d7481e91c2/36c31/001.png 849w","sizes":"(min-width: 849px) 849px, 100vw"},"sources":[{"srcSet":"/static/c667bd99d14a07251b6678d7481e91c2/f7a73/001.avif 212w,\n/static/c667bd99d14a07251b6678d7481e91c2/f26fb/001.avif 425w,\n/static/c667bd99d14a07251b6678d7481e91c2/46d88/001.avif 849w","type":"image/avif","sizes":"(min-width: 849px) 849px, 100vw"},{"srcSet":"/static/c667bd99d14a07251b6678d7481e91c2/ac669/001.webp 212w,\n/static/c667bd99d14a07251b6678d7481e91c2/f89a4/001.webp 425w,\n/static/c667bd99d14a07251b6678d7481e91c2/90068/001.webp 849w","type":"image/webp","sizes":"(min-width: 849px) 849px, 100vw"}]},"width":849,"height":618}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-17---chapter11/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-24---chapter12/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-03-06---chatper13/media/001.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/65d73/001.jpg","srcSet":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/a0db9/001.jpg 61w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/98748/001.jpg 122w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/65d73/001.jpg 244w","sizes":"(min-width: 244px) 244px, 100vw"},"sources":[{"srcSet":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/84f26/001.avif 61w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/fd589/001.avif 122w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/471d6/001.avif 244w","type":"image/avif","sizes":"(min-width: 244px) 244px, 100vw"},{"srcSet":"/static/a8f4bb560aada3dd7d45cc9da0bc25c5/be33f/001.webp 61w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/6881b/001.webp 122w,\n/static/a8f4bb560aada3dd7d45cc9da0bc25c5/47764/001.webp 244w","type":"image/webp","sizes":"(min-width: 244px) 244px, 100vw"}]},"width":244,"height":235}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-03-06---chatper13/media/water.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8d808","images":{"fallback":{"src":"/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg","srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/4778e/water.jpg 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/d850a/water.jpg 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/89e05/water.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/f0afd/water.avif 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/09bce/water.avif 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/0885d/water.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/483b84108696f21f6329d1cecf5d8a3f/6db13/water.webp 200w,\n/static/483b84108696f21f6329d1cecf5d8a3f/a7392/water.webp 400w,\n/static/483b84108696f21f6329d1cecf5d8a3f/4eef9/water.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":427}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch02/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/0910fd71995de03f54fbe806d2b8ca76/c5cc9/001.png","srcSet":"/static/0910fd71995de03f54fbe806d2b8ca76/02c7a/001.png 349w,\n/static/0910fd71995de03f54fbe806d2b8ca76/37574/001.png 698w,\n/static/0910fd71995de03f54fbe806d2b8ca76/c5cc9/001.png 1396w","sizes":"(min-width: 1396px) 1396px, 100vw"},"sources":[{"srcSet":"/static/0910fd71995de03f54fbe806d2b8ca76/23892/001.avif 349w,\n/static/0910fd71995de03f54fbe806d2b8ca76/8d09d/001.avif 698w,\n/static/0910fd71995de03f54fbe806d2b8ca76/f11b2/001.avif 1396w","type":"image/avif","sizes":"(min-width: 1396px) 1396px, 100vw"},{"srcSet":"/static/0910fd71995de03f54fbe806d2b8ca76/f1c8d/001.webp 349w,\n/static/0910fd71995de03f54fbe806d2b8ca76/719bd/001.webp 698w,\n/static/0910fd71995de03f54fbe806d2b8ca76/d10c9/001.webp 1396w","type":"image/webp","sizes":"(min-width: 1396px) 1396px, 100vw"}]},"width":1396,"height":676}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch02/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/995f7dcb14b4c7f20ac72c39b320e977/20e70/002.png","srcSet":"/static/995f7dcb14b4c7f20ac72c39b320e977/52d0f/002.png 199w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/d20e5/002.png 397w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/20e70/002.png 794w","sizes":"(min-width: 794px) 794px, 100vw"},"sources":[{"srcSet":"/static/995f7dcb14b4c7f20ac72c39b320e977/1436a/002.avif 199w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/f2404/002.avif 397w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/6261e/002.avif 794w","type":"image/avif","sizes":"(min-width: 794px) 794px, 100vw"},{"srcSet":"/static/995f7dcb14b4c7f20ac72c39b320e977/74db7/002.webp 199w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/323b2/002.webp 397w,\n/static/995f7dcb14b4c7f20ac72c39b320e977/c3ddd/002.webp 794w","type":"image/webp","sizes":"(min-width: 794px) 794px, 100vw"}]},"width":794,"height":699}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/07395/001.png","srcSet":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/44d14/001.png 196w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/22e71/001.png 392w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/07395/001.png 784w","sizes":"(min-width: 784px) 784px, 100vw"},"sources":[{"srcSet":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/9d806/001.avif 196w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/667af/001.avif 392w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/f3ada/001.avif 784w","type":"image/avif","sizes":"(min-width: 784px) 784px, 100vw"},{"srcSet":"/static/76cdb87ba40bfaf2cdaaeff0c048af60/c3e2f/001.webp 196w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/8391a/001.webp 392w,\n/static/76cdb87ba40bfaf2cdaaeff0c048af60/88b7e/001.webp 784w","type":"image/webp","sizes":"(min-width: 784px) 784px, 100vw"}]},"width":784,"height":541}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/bda00491822610ad7a3b356800dad4d3/a970d/002.png","srcSet":"/static/bda00491822610ad7a3b356800dad4d3/cc55c/002.png 201w,\n/static/bda00491822610ad7a3b356800dad4d3/03e0f/002.png 402w,\n/static/bda00491822610ad7a3b356800dad4d3/a970d/002.png 804w","sizes":"(min-width: 804px) 804px, 100vw"},"sources":[{"srcSet":"/static/bda00491822610ad7a3b356800dad4d3/6afe7/002.avif 201w,\n/static/bda00491822610ad7a3b356800dad4d3/213b6/002.avif 402w,\n/static/bda00491822610ad7a3b356800dad4d3/844c8/002.avif 804w","type":"image/avif","sizes":"(min-width: 804px) 804px, 100vw"},{"srcSet":"/static/bda00491822610ad7a3b356800dad4d3/ea485/002.webp 201w,\n/static/bda00491822610ad7a3b356800dad4d3/554a5/002.webp 402w,\n/static/bda00491822610ad7a3b356800dad4d3/53445/002.webp 804w","type":"image/webp","sizes":"(min-width: 804px) 804px, 100vw"}]},"width":804,"height":553}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/003.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/afa82/003.png","srcSet":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/44348/003.png 215w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/7de77/003.png 430w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/afa82/003.png 860w","sizes":"(min-width: 860px) 860px, 100vw"},"sources":[{"srcSet":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/55173/003.avif 215w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/283ff/003.avif 430w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/87ec4/003.avif 860w","type":"image/avif","sizes":"(min-width: 860px) 860px, 100vw"},{"srcSet":"/static/d74e9f79767f7ccb8392a7b7e5ee2276/b284a/003.webp 215w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/7e6f7/003.webp 430w,\n/static/d74e9f79767f7ccb8392a7b7e5ee2276/22175/003.webp 860w","type":"image/webp","sizes":"(min-width: 860px) 860px, 100vw"}]},"width":860,"height":472}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/001.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/f326b97b578fb1d3ac72198cb1ce358c/5226c/001.png","srcSet":"/static/f326b97b578fb1d3ac72198cb1ce358c/da5c7/001.png 221w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/b0b69/001.png 443w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/5226c/001.png 885w","sizes":"(min-width: 885px) 885px, 100vw"},"sources":[{"srcSet":"/static/f326b97b578fb1d3ac72198cb1ce358c/ee409/001.avif 221w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/f30fc/001.avif 443w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/9b9bc/001.avif 885w","type":"image/avif","sizes":"(min-width: 885px) 885px, 100vw"},{"srcSet":"/static/f326b97b578fb1d3ac72198cb1ce358c/4fc4b/001.webp 221w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/5cce9/001.webp 443w,\n/static/f326b97b578fb1d3ac72198cb1ce358c/701cb/001.webp 885w","type":"image/webp","sizes":"(min-width: 885px) 885px, 100vw"}]},"width":885,"height":436}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/b6c0103b1f16506967995e1da4c738dd/fb43e/002.png","srcSet":"/static/b6c0103b1f16506967995e1da4c738dd/6fe90/002.png 231w,\n/static/b6c0103b1f16506967995e1da4c738dd/31c86/002.png 461w,\n/static/b6c0103b1f16506967995e1da4c738dd/fb43e/002.png 922w","sizes":"(min-width: 922px) 922px, 100vw"},"sources":[{"srcSet":"/static/b6c0103b1f16506967995e1da4c738dd/5c932/002.avif 231w,\n/static/b6c0103b1f16506967995e1da4c738dd/0b08a/002.avif 461w,\n/static/b6c0103b1f16506967995e1da4c738dd/5de31/002.avif 922w","type":"image/avif","sizes":"(min-width: 922px) 922px, 100vw"},{"srcSet":"/static/b6c0103b1f16506967995e1da4c738dd/1b0d1/002.webp 231w,\n/static/b6c0103b1f16506967995e1da4c738dd/2f4bc/002.webp 461w,\n/static/b6c0103b1f16506967995e1da4c738dd/5302d/002.webp 922w","type":"image/webp","sizes":"(min-width: 922px) 922px, 100vw"}]},"width":922,"height":369}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/003.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/6bc00fb8657ed1cff2897da758c4c668/1ad45/003.png","srcSet":"/static/6bc00fb8657ed1cff2897da758c4c668/14595/003.png 214w,\n/static/6bc00fb8657ed1cff2897da758c4c668/99ea7/003.png 429w,\n/static/6bc00fb8657ed1cff2897da758c4c668/1ad45/003.png 857w","sizes":"(min-width: 857px) 857px, 100vw"},"sources":[{"srcSet":"/static/6bc00fb8657ed1cff2897da758c4c668/8e5aa/003.avif 214w,\n/static/6bc00fb8657ed1cff2897da758c4c668/3f7a1/003.avif 429w,\n/static/6bc00fb8657ed1cff2897da758c4c668/31844/003.avif 857w","type":"image/avif","sizes":"(min-width: 857px) 857px, 100vw"},{"srcSet":"/static/6bc00fb8657ed1cff2897da758c4c668/3b675/003.webp 214w,\n/static/6bc00fb8657ed1cff2897da758c4c668/45e0e/003.webp 429w,\n/static/6bc00fb8657ed1cff2897da758c4c668/5f85e/003.webp 857w","type":"image/webp","sizes":"(min-width: 857px) 857px, 100vw"}]},"width":857,"height":438}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/004.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/debc3/004.png","srcSet":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/5538a/004.png 155w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/480c9/004.png 311w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/debc3/004.png 621w","sizes":"(min-width: 621px) 621px, 100vw"},"sources":[{"srcSet":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/d4b2f/004.avif 155w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/35c1d/004.avif 311w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/809bb/004.avif 621w","type":"image/avif","sizes":"(min-width: 621px) 621px, 100vw"},{"srcSet":"/static/046d431fcaf8d57fe57b40cb6d76f1ab/3c913/004.webp 155w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/5408d/004.webp 311w,\n/static/046d431fcaf8d57fe57b40cb6d76f1ab/6836f/004.webp 621w","type":"image/webp","sizes":"(min-width: 621px) 621px, 100vw"}]},"width":621,"height":491}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/005.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/efb79f55bd6037a58f5cf44ae0787424/f10f9/005.png","srcSet":"/static/efb79f55bd6037a58f5cf44ae0787424/39fe4/005.png 157w,\n/static/efb79f55bd6037a58f5cf44ae0787424/80870/005.png 314w,\n/static/efb79f55bd6037a58f5cf44ae0787424/f10f9/005.png 627w","sizes":"(min-width: 627px) 627px, 100vw"},"sources":[{"srcSet":"/static/efb79f55bd6037a58f5cf44ae0787424/6ed6a/005.avif 157w,\n/static/efb79f55bd6037a58f5cf44ae0787424/7fdeb/005.avif 314w,\n/static/efb79f55bd6037a58f5cf44ae0787424/11215/005.avif 627w","type":"image/avif","sizes":"(min-width: 627px) 627px, 100vw"},{"srcSet":"/static/efb79f55bd6037a58f5cf44ae0787424/ede53/005.webp 157w,\n/static/efb79f55bd6037a58f5cf44ae0787424/5139e/005.webp 314w,\n/static/efb79f55bd6037a58f5cf44ae0787424/dc99b/005.webp 627w","type":"image/webp","sizes":"(min-width: 627px) 627px, 100vw"}]},"width":627,"height":513}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/006.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9e08c9b1613989fab3630dd2f8197a21/28c85/006.png","srcSet":"/static/9e08c9b1613989fab3630dd2f8197a21/7e15b/006.png 169w,\n/static/9e08c9b1613989fab3630dd2f8197a21/42a95/006.png 337w,\n/static/9e08c9b1613989fab3630dd2f8197a21/28c85/006.png 674w","sizes":"(min-width: 674px) 674px, 100vw"},"sources":[{"srcSet":"/static/9e08c9b1613989fab3630dd2f8197a21/2e6ca/006.avif 169w,\n/static/9e08c9b1613989fab3630dd2f8197a21/e1160/006.avif 337w,\n/static/9e08c9b1613989fab3630dd2f8197a21/31195/006.avif 674w","type":"image/avif","sizes":"(min-width: 674px) 674px, 100vw"},{"srcSet":"/static/9e08c9b1613989fab3630dd2f8197a21/2ddd1/006.webp 169w,\n/static/9e08c9b1613989fab3630dd2f8197a21/e2e22/006.webp 337w,\n/static/9e08c9b1613989fab3630dd2f8197a21/716b8/006.webp 674w","type":"image/webp","sizes":"(min-width: 674px) 674px, 100vw"}]},"width":674,"height":451}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/007.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/45bc3b761498eec1f1a910b87bdcd298/5c641/007.png","srcSet":"/static/45bc3b761498eec1f1a910b87bdcd298/966a8/007.png 151w,\n/static/45bc3b761498eec1f1a910b87bdcd298/5072c/007.png 302w,\n/static/45bc3b761498eec1f1a910b87bdcd298/5c641/007.png 604w","sizes":"(min-width: 604px) 604px, 100vw"},"sources":[{"srcSet":"/static/45bc3b761498eec1f1a910b87bdcd298/b043b/007.avif 151w,\n/static/45bc3b761498eec1f1a910b87bdcd298/db5bb/007.avif 302w,\n/static/45bc3b761498eec1f1a910b87bdcd298/f89b8/007.avif 604w","type":"image/avif","sizes":"(min-width: 604px) 604px, 100vw"},{"srcSet":"/static/45bc3b761498eec1f1a910b87bdcd298/0d826/007.webp 151w,\n/static/45bc3b761498eec1f1a910b87bdcd298/8a25d/007.webp 302w,\n/static/45bc3b761498eec1f1a910b87bdcd298/80ed4/007.webp 604w","type":"image/webp","sizes":"(min-width: 604px) 604px, 100vw"}]},"width":604,"height":510}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/008.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/db0c93fbc4a05738e073cdfd5c566420/cff96/008.png","srcSet":"/static/db0c93fbc4a05738e073cdfd5c566420/bf0f5/008.png 166w,\n/static/db0c93fbc4a05738e073cdfd5c566420/024e9/008.png 333w,\n/static/db0c93fbc4a05738e073cdfd5c566420/cff96/008.png 665w","sizes":"(min-width: 665px) 665px, 100vw"},"sources":[{"srcSet":"/static/db0c93fbc4a05738e073cdfd5c566420/f7fb8/008.avif 166w,\n/static/db0c93fbc4a05738e073cdfd5c566420/b8576/008.avif 333w,\n/static/db0c93fbc4a05738e073cdfd5c566420/9a174/008.avif 665w","type":"image/avif","sizes":"(min-width: 665px) 665px, 100vw"},{"srcSet":"/static/db0c93fbc4a05738e073cdfd5c566420/38df8/008.webp 166w,\n/static/db0c93fbc4a05738e073cdfd5c566420/5c5df/008.webp 333w,\n/static/db0c93fbc4a05738e073cdfd5c566420/f5329/008.webp 665w","type":"image/webp","sizes":"(min-width: 665px) 665px, 100vw"}]},"width":665,"height":521}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/009.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/e57004ee844fd0e51d5abc873a9d24c0/8a6f2/009.png","srcSet":"/static/e57004ee844fd0e51d5abc873a9d24c0/7f9f1/009.png 179w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/14567/009.png 358w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/8a6f2/009.png 715w","sizes":"(min-width: 715px) 715px, 100vw"},"sources":[{"srcSet":"/static/e57004ee844fd0e51d5abc873a9d24c0/9db08/009.avif 179w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/3a959/009.avif 358w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/c8ce5/009.avif 715w","type":"image/avif","sizes":"(min-width: 715px) 715px, 100vw"},{"srcSet":"/static/e57004ee844fd0e51d5abc873a9d24c0/c6b4c/009.webp 179w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/e8928/009.webp 358w,\n/static/e57004ee844fd0e51d5abc873a9d24c0/d7848/009.webp 715w","type":"image/webp","sizes":"(min-width: 715px) 715px, 100vw"}]},"width":715,"height":455}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/010.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/1e307ab85c4aaee6423c3bafcaa3a098/8394e/010.png","srcSet":"/static/1e307ab85c4aaee6423c3bafcaa3a098/62617/010.png 159w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/8beff/010.png 319w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/8394e/010.png 637w","sizes":"(min-width: 637px) 637px, 100vw"},"sources":[{"srcSet":"/static/1e307ab85c4aaee6423c3bafcaa3a098/73695/010.avif 159w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/660b2/010.avif 319w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/d3bf6/010.avif 637w","type":"image/avif","sizes":"(min-width: 637px) 637px, 100vw"},{"srcSet":"/static/1e307ab85c4aaee6423c3bafcaa3a098/8d0a5/010.webp 159w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/fc715/010.webp 319w,\n/static/1e307ab85c4aaee6423c3bafcaa3a098/f6ced/010.webp 637w","type":"image/webp","sizes":"(min-width: 637px) 637px, 100vw"}]},"width":637,"height":546}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/011.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/e8229/011.png","srcSet":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/95049/011.png 172w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/60bb2/011.png 345w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/e8229/011.png 689w","sizes":"(min-width: 689px) 689px, 100vw"},"sources":[{"srcSet":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/853ec/011.avif 172w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/08e9c/011.avif 345w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/83ec2/011.avif 689w","type":"image/avif","sizes":"(min-width: 689px) 689px, 100vw"},{"srcSet":"/static/28797c9b7a256ed1ae01e0693f9cc1f2/5c00d/011.webp 172w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/57336/011.webp 345w,\n/static/28797c9b7a256ed1ae01e0693f9cc1f2/d1d39/011.webp 689w","type":"image/webp","sizes":"(min-width: 689px) 689px, 100vw"}]},"width":689,"height":551}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-05---considering-http-authn-pt01/media/domado.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg","srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/ce903/domado.jpg 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/be680/domado.jpg 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg 480w","sizes":"(min-width: 480px) 480px, 100vw"},"sources":[{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/51554/domado.avif 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/8b9e3/domado.avif 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/dde18/domado.avif 480w","type":"image/avif","sizes":"(min-width: 480px) 480px, 100vw"},{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/43b57/domado.webp 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/226ed/domado.webp 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/a1501/domado.webp 480w","type":"image/webp","sizes":"(min-width: 480px) 480px, 100vw"}]},"width":480,"height":360}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-05---considering-http-authn-pt02/media/domado.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg","srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/ce903/domado.jpg 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/be680/domado.jpg 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/fdd27/domado.jpg 480w","sizes":"(min-width: 480px) 480px, 100vw"},"sources":[{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/51554/domado.avif 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/8b9e3/domado.avif 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/dde18/domado.avif 480w","type":"image/avif","sizes":"(min-width: 480px) 480px, 100vw"},{"srcSet":"/static/dea51fa8699a4271ec9f6c743a646182/43b57/domado.webp 120w,\n/static/dea51fa8699a4271ec9f6c743a646182/226ed/domado.webp 240w,\n/static/dea51fa8699a4271ec9f6c743a646182/a1501/domado.webp 480w","type":"image/webp","sizes":"(min-width: 480px) 480px, 100vw"}]},"width":480,"height":360}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/01-oauth-auth-code.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/04bbd/01-oauth-auth-code.png","srcSet":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/5f41b/01-oauth-auth-code.png 184w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/9f3ee/01-oauth-auth-code.png 369w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/04bbd/01-oauth-auth-code.png 737w","sizes":"(min-width: 737px) 737px, 100vw"},"sources":[{"srcSet":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/f44a4/01-oauth-auth-code.avif 184w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/a1e0d/01-oauth-auth-code.avif 369w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/ab72b/01-oauth-auth-code.avif 737w","type":"image/avif","sizes":"(min-width: 737px) 737px, 100vw"},{"srcSet":"/static/9d1fd5e124b5e02589bb8b4832aa9cea/0e98b/01-oauth-auth-code.webp 184w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/8008c/01-oauth-auth-code.webp 369w,\n/static/9d1fd5e124b5e02589bb8b4832aa9cea/319bc/01-oauth-auth-code.webp 737w","type":"image/webp","sizes":"(min-width: 737px) 737px, 100vw"}]},"width":737,"height":475.00000000000006}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/02-oauth-password.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c68f9acd46f568aa7ae3e4578a820b50/36cb9/02-oauth-password.png","srcSet":"/static/c68f9acd46f568aa7ae3e4578a820b50/fa60b/02-oauth-password.png 187w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/d87db/02-oauth-password.png 373w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/36cb9/02-oauth-password.png 746w","sizes":"(min-width: 746px) 746px, 100vw"},"sources":[{"srcSet":"/static/c68f9acd46f568aa7ae3e4578a820b50/8e3e9/02-oauth-password.avif 187w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/4e407/02-oauth-password.avif 373w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/e8948/02-oauth-password.avif 746w","type":"image/avif","sizes":"(min-width: 746px) 746px, 100vw"},{"srcSet":"/static/c68f9acd46f568aa7ae3e4578a820b50/ee0f2/02-oauth-password.webp 187w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/a8020/02-oauth-password.webp 373w,\n/static/c68f9acd46f568aa7ae3e4578a820b50/91011/02-oauth-password.webp 746w","type":"image/webp","sizes":"(min-width: 746px) 746px, 100vw"}]},"width":746,"height":413}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/03-oauth-client-creds.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/85b7b29c60834a648b9a206543917a12/f40c1/03-oauth-client-creds.png","srcSet":"/static/85b7b29c60834a648b9a206543917a12/b7986/03-oauth-client-creds.png 143w,\n/static/85b7b29c60834a648b9a206543917a12/7a26e/03-oauth-client-creds.png 287w,\n/static/85b7b29c60834a648b9a206543917a12/f40c1/03-oauth-client-creds.png 573w","sizes":"(min-width: 573px) 573px, 100vw"},"sources":[{"srcSet":"/static/85b7b29c60834a648b9a206543917a12/56b7e/03-oauth-client-creds.avif 143w,\n/static/85b7b29c60834a648b9a206543917a12/12d58/03-oauth-client-creds.avif 287w,\n/static/85b7b29c60834a648b9a206543917a12/90370/03-oauth-client-creds.avif 573w","type":"image/avif","sizes":"(min-width: 573px) 573px, 100vw"},{"srcSet":"/static/85b7b29c60834a648b9a206543917a12/6f2dd/03-oauth-client-creds.webp 143w,\n/static/85b7b29c60834a648b9a206543917a12/0c864/03-oauth-client-creds.webp 287w,\n/static/85b7b29c60834a648b9a206543917a12/47910/03-oauth-client-creds.webp 573w","type":"image/webp","sizes":"(min-width: 573px) 573px, 100vw"}]},"width":573,"height":376}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2023-03-13---from-servlet-to-spring/media/spring.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#4878b8","images":{"fallback":{"src":"/static/f93504191e16f7c297c5b70c579f058d/5671c/spring.jpg","srcSet":"/static/f93504191e16f7c297c5b70c579f058d/d97c6/spring.jpg 153w,\n/static/f93504191e16f7c297c5b70c579f058d/0d2c2/spring.jpg 306w,\n/static/f93504191e16f7c297c5b70c579f058d/5671c/spring.jpg 612w","sizes":"(min-width: 612px) 612px, 100vw"},"sources":[{"srcSet":"/static/f93504191e16f7c297c5b70c579f058d/8af42/spring.avif 153w,\n/static/f93504191e16f7c297c5b70c579f058d/11477/spring.avif 306w,\n/static/f93504191e16f7c297c5b70c579f058d/1c62b/spring.avif 612w","type":"image/avif","sizes":"(min-width: 612px) 612px, 100vw"},{"srcSet":"/static/f93504191e16f7c297c5b70c579f058d/4401b/spring.webp 153w,\n/static/f93504191e16f7c297c5b70c579f058d/aea7f/spring.webp 306w,\n/static/f93504191e16f7c297c5b70c579f058d/9e742/spring.webp 612w","type":"image/webp","sizes":"(min-width: 612px) 612px, 100vw"}]},"width":612,"height":408}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101-pt01/media/01-docker-image-container-explained.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/3e98425217ba1cc676b279553aac1cf6/093fa/01-docker-image-container-explained.png","srcSet":"/static/3e98425217ba1cc676b279553aac1cf6/bf31d/01-docker-image-container-explained.png 500w,\n/static/3e98425217ba1cc676b279553aac1cf6/545d1/01-docker-image-container-explained.png 1000w,\n/static/3e98425217ba1cc676b279553aac1cf6/093fa/01-docker-image-container-explained.png 2000w","sizes":"(min-width: 2000px) 2000px, 100vw"},"sources":[{"srcSet":"/static/3e98425217ba1cc676b279553aac1cf6/8ca01/01-docker-image-container-explained.avif 500w,\n/static/3e98425217ba1cc676b279553aac1cf6/e0dd8/01-docker-image-container-explained.avif 1000w,\n/static/3e98425217ba1cc676b279553aac1cf6/2a8cf/01-docker-image-container-explained.avif 2000w","type":"image/avif","sizes":"(min-width: 2000px) 2000px, 100vw"},{"srcSet":"/static/3e98425217ba1cc676b279553aac1cf6/e38e1/01-docker-image-container-explained.webp 500w,\n/static/3e98425217ba1cc676b279553aac1cf6/51170/01-docker-image-container-explained.webp 1000w,\n/static/3e98425217ba1cc676b279553aac1cf6/1b275/01-docker-image-container-explained.webp 2000w","type":"image/webp","sizes":"(min-width: 2000px) 2000px, 100vw"}]},"width":2000,"height":691}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-10-20---cloudneta-terraform-101-pt01/media/terraform01.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/a28f3/terraform01.jpg","srcSet":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/10e28/terraform01.jpg 192w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/c620e/terraform01.jpg 384w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/a28f3/terraform01.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/83c0e/terraform01.avif 192w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/0f3c8/terraform01.avif 384w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/b3741/terraform01.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/bdc1e3995c1a80c2240d4ff22df2e4f0/23244/terraform01.webp 192w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/d4e33/terraform01.webp 384w,\n/static/bdc1e3995c1a80c2240d4ff22df2e4f0/88eeb/terraform01.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-10-27---cloudneta-terraform-101-pt02/media/terraform02.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/23de681fbb4ea110b56b4f8d37407f1a/a28f3/terraform02.jpg","srcSet":"/static/23de681fbb4ea110b56b4f8d37407f1a/10e28/terraform02.jpg 192w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/c620e/terraform02.jpg 384w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/a28f3/terraform02.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/23de681fbb4ea110b56b4f8d37407f1a/83c0e/terraform02.avif 192w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/0f3c8/terraform02.avif 384w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/b3741/terraform02.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/23de681fbb4ea110b56b4f8d37407f1a/23244/terraform02.webp 192w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/d4e33/terraform02.webp 384w,\n/static/23de681fbb4ea110b56b4f8d37407f1a/88eeb/terraform02.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-03---cloudneta-terraform-101-pt03/media/terraform03.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f76f45557215b30ae70126439a5e8b31/a28f3/terraform03.jpg","srcSet":"/static/f76f45557215b30ae70126439a5e8b31/10e28/terraform03.jpg 192w,\n/static/f76f45557215b30ae70126439a5e8b31/c620e/terraform03.jpg 384w,\n/static/f76f45557215b30ae70126439a5e8b31/a28f3/terraform03.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/f76f45557215b30ae70126439a5e8b31/83c0e/terraform03.avif 192w,\n/static/f76f45557215b30ae70126439a5e8b31/0f3c8/terraform03.avif 384w,\n/static/f76f45557215b30ae70126439a5e8b31/b3741/terraform03.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/f76f45557215b30ae70126439a5e8b31/23244/terraform03.webp 192w,\n/static/f76f45557215b30ae70126439a5e8b31/d4e33/terraform03.webp 384w,\n/static/f76f45557215b30ae70126439a5e8b31/88eeb/terraform03.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-10---cloudneta-terraform-101-pt04/media/terraform04.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/2ac4339c55aea79af1fad3da4839b5c4/a28f3/terraform04.jpg","srcSet":"/static/2ac4339c55aea79af1fad3da4839b5c4/10e28/terraform04.jpg 192w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/c620e/terraform04.jpg 384w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/a28f3/terraform04.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/2ac4339c55aea79af1fad3da4839b5c4/83c0e/terraform04.avif 192w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/0f3c8/terraform04.avif 384w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/b3741/terraform04.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/2ac4339c55aea79af1fad3da4839b5c4/23244/terraform04.webp 192w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/d4e33/terraform04.webp 384w,\n/static/2ac4339c55aea79af1fad3da4839b5c4/88eeb/terraform04.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-1/media/terraform05.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg","srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/10e28/terraform05.jpg 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/c620e/terraform05.jpg 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/83c0e/terraform05.avif 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/0f3c8/terraform05.avif 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/b3741/terraform05.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/23244/terraform05.webp 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/d4e33/terraform05.webp 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/88eeb/terraform05.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-19---cloudneta-terraform-101-pt05-2/media/terraform05.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg","srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/10e28/terraform05.jpg 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/c620e/terraform05.jpg 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/a28f3/terraform05.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/83c0e/terraform05.avif 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/0f3c8/terraform05.avif 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/b3741/terraform05.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/e002d5ded2f8cf0295be48fced9525bd/23244/terraform05.webp 192w,\n/static/e002d5ded2f8cf0295be48fced9525bd/d4e33/terraform05.webp 384w,\n/static/e002d5ded2f8cf0295be48fced9525bd/88eeb/terraform05.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-11-27---cloudneta-terraform-101-pt06/media/terraform06.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/a28f3/terraform06.jpg","srcSet":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/10e28/terraform06.jpg 192w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/c620e/terraform06.jpg 384w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/a28f3/terraform06.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/83c0e/terraform06.avif 192w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/0f3c8/terraform06.avif 384w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/b3741/terraform06.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/c4e4c53e79b94a7e80d5fd02b1b660d8/23244/terraform06.webp 192w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/d4e33/terraform06.webp 384w,\n/static/c4e4c53e79b94a7e80d5fd02b1b660d8/88eeb/terraform06.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-10---cloudneta-terraform-101-pt07/media/terraform07.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/d22fecedcdae6e3b11af342e075eefde/a28f3/terraform07.jpg","srcSet":"/static/d22fecedcdae6e3b11af342e075eefde/10e28/terraform07.jpg 192w,\n/static/d22fecedcdae6e3b11af342e075eefde/c620e/terraform07.jpg 384w,\n/static/d22fecedcdae6e3b11af342e075eefde/a28f3/terraform07.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/d22fecedcdae6e3b11af342e075eefde/83c0e/terraform07.avif 192w,\n/static/d22fecedcdae6e3b11af342e075eefde/0f3c8/terraform07.avif 384w,\n/static/d22fecedcdae6e3b11af342e075eefde/b3741/terraform07.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/d22fecedcdae6e3b11af342e075eefde/23244/terraform07.webp 192w,\n/static/d22fecedcdae6e3b11af342e075eefde/d4e33/terraform07.webp 384w,\n/static/d22fecedcdae6e3b11af342e075eefde/88eeb/terraform07.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt08/media/terraform08.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/87dffd59448a30f82a571f9cd59a7a82/a28f3/terraform08.jpg","srcSet":"/static/87dffd59448a30f82a571f9cd59a7a82/10e28/terraform08.jpg 192w,\n/static/87dffd59448a30f82a571f9cd59a7a82/c620e/terraform08.jpg 384w,\n/static/87dffd59448a30f82a571f9cd59a7a82/a28f3/terraform08.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/87dffd59448a30f82a571f9cd59a7a82/83c0e/terraform08.avif 192w,\n/static/87dffd59448a30f82a571f9cd59a7a82/0f3c8/terraform08.avif 384w,\n/static/87dffd59448a30f82a571f9cd59a7a82/b3741/terraform08.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/87dffd59448a30f82a571f9cd59a7a82/23244/terraform08.webp 192w,\n/static/87dffd59448a30f82a571f9cd59a7a82/d4e33/terraform08.webp 384w,\n/static/87dffd59448a30f82a571f9cd59a7a82/88eeb/terraform08.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-15---cloudneta-terraform-101-pt10/media/terraform10.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/352a581bd14096bcc349ddb9454daac6/a28f3/terraform10.jpg","srcSet":"/static/352a581bd14096bcc349ddb9454daac6/10e28/terraform10.jpg 192w,\n/static/352a581bd14096bcc349ddb9454daac6/c620e/terraform10.jpg 384w,\n/static/352a581bd14096bcc349ddb9454daac6/a28f3/terraform10.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/352a581bd14096bcc349ddb9454daac6/83c0e/terraform10.avif 192w,\n/static/352a581bd14096bcc349ddb9454daac6/0f3c8/terraform10.avif 384w,\n/static/352a581bd14096bcc349ddb9454daac6/b3741/terraform10.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/352a581bd14096bcc349ddb9454daac6/23244/terraform10.webp 192w,\n/static/352a581bd14096bcc349ddb9454daac6/d4e33/terraform10.webp 384w,\n/static/352a581bd14096bcc349ddb9454daac6/88eeb/terraform10.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt09/media/09_001.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c561771300765fd3d3253fbb88a9f75e/cafbd/09_001.jpg","srcSet":"/static/c561771300765fd3d3253fbb88a9f75e/b032a/09_001.jpg 263w,\n/static/c561771300765fd3d3253fbb88a9f75e/83c21/09_001.jpg 525w,\n/static/c561771300765fd3d3253fbb88a9f75e/cafbd/09_001.jpg 1050w","sizes":"(min-width: 1050px) 1050px, 100vw"},"sources":[{"srcSet":"/static/c561771300765fd3d3253fbb88a9f75e/0cd0c/09_001.avif 263w,\n/static/c561771300765fd3d3253fbb88a9f75e/ff275/09_001.avif 525w,\n/static/c561771300765fd3d3253fbb88a9f75e/ebfe9/09_001.avif 1050w","type":"image/avif","sizes":"(min-width: 1050px) 1050px, 100vw"},{"srcSet":"/static/c561771300765fd3d3253fbb88a9f75e/03416/09_001.webp 263w,\n/static/c561771300765fd3d3253fbb88a9f75e/70306/09_001.webp 525w,\n/static/c561771300765fd3d3253fbb88a9f75e/fa37b/09_001.webp 1050w","type":"image/webp","sizes":"(min-width: 1050px) 1050px, 100vw"}]},"width":1050,"height":553}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/terraform/2022-12-12---cloudneta-terraform-101-pt09/media/terraform09.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/409d9dd739ee39e19c7e69854258b811/a28f3/terraform09.jpg","srcSet":"/static/409d9dd739ee39e19c7e69854258b811/10e28/terraform09.jpg 192w,\n/static/409d9dd739ee39e19c7e69854258b811/c620e/terraform09.jpg 384w,\n/static/409d9dd739ee39e19c7e69854258b811/a28f3/terraform09.jpg 768w","sizes":"(min-width: 768px) 768px, 100vw"},"sources":[{"srcSet":"/static/409d9dd739ee39e19c7e69854258b811/83c0e/terraform09.avif 192w,\n/static/409d9dd739ee39e19c7e69854258b811/0f3c8/terraform09.avif 384w,\n/static/409d9dd739ee39e19c7e69854258b811/b3741/terraform09.avif 768w","type":"image/avif","sizes":"(min-width: 768px) 768px, 100vw"},{"srcSet":"/static/409d9dd739ee39e19c7e69854258b811/23244/terraform09.webp 192w,\n/static/409d9dd739ee39e19c7e69854258b811/d4e33/terraform09.webp 384w,\n/static/409d9dd739ee39e19c7e69854258b811/88eeb/terraform09.webp 768w","type":"image/webp","sizes":"(min-width: 768px) 768px, 100vw"}]},"width":768,"height":400}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/pages/contacts/book.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#382828","images":{"fallback":{"src":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/dcf31/book.jpg","srcSet":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/bb5f7/book.jpg 315w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/623af/book.jpg 630w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/dcf31/book.jpg 1260w","sizes":"(min-width: 1260px) 1260px, 100vw"},"sources":[{"srcSet":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/da1a8/book.avif 315w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/a99fe/book.avif 630w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/ccb65/book.avif 1260w","type":"image/avif","sizes":"(min-width: 1260px) 1260px, 100vw"},{"srcSet":"/static/eb3a3a2300ef1b86ae82739a5cb4cccf/c4a8b/book.webp 315w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/850b2/book.webp 630w,\n/static/eb3a3a2300ef1b86ae82739a5cb4cccf/c50fe/book.webp 1260w","type":"image/webp","sizes":"(min-width: 1260px) 1260px, 100vw"}]},"width":1260,"height":945}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/001_this_toggle.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/fcfba/001_this_toggle.jpg","srcSet":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/9dc2d/001_this_toggle.jpg 445w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/a88b6/001_this_toggle.jpg 890w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/fcfba/001_this_toggle.jpg 1780w","sizes":"(min-width: 1780px) 1780px, 100vw"},"sources":[{"srcSet":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/c3c5b/001_this_toggle.avif 445w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/a6d01/001_this_toggle.avif 890w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/d5f88/001_this_toggle.avif 1780w","type":"image/avif","sizes":"(min-width: 1780px) 1780px, 100vw"},{"srcSet":"/static/e55d9dfcac2c80a0112f60bd1ff5a48c/9b057/001_this_toggle.webp 445w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/6b4bf/001_this_toggle.webp 890w,\n/static/e55d9dfcac2c80a0112f60bd1ff5a48c/81f95/001_this_toggle.webp 1780w","type":"image/webp","sizes":"(min-width: 1780px) 1780px, 100vw"}]},"width":1780,"height":526}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/fromis9_etkyung.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#a88868","images":{"fallback":{"src":"/static/cfb86f6df7147288059b81ad893430de/4a49b/fromis9_etkyung.jpg","srcSet":"/static/cfb86f6df7147288059b81ad893430de/b4dad/fromis9_etkyung.jpg 320w,\n/static/cfb86f6df7147288059b81ad893430de/3440d/fromis9_etkyung.jpg 640w,\n/static/cfb86f6df7147288059b81ad893430de/4a49b/fromis9_etkyung.jpg 1280w","sizes":"(min-width: 1280px) 1280px, 100vw"},"sources":[{"srcSet":"/static/cfb86f6df7147288059b81ad893430de/e2a10/fromis9_etkyung.avif 320w,\n/static/cfb86f6df7147288059b81ad893430de/3d183/fromis9_etkyung.avif 640w,\n/static/cfb86f6df7147288059b81ad893430de/af2d5/fromis9_etkyung.avif 1280w","type":"image/avif","sizes":"(min-width: 1280px) 1280px, 100vw"},{"srcSet":"/static/cfb86f6df7147288059b81ad893430de/c0bcc/fromis9_etkyung.webp 320w,\n/static/cfb86f6df7147288059b81ad893430de/17574/fromis9_etkyung.webp 640w,\n/static/cfb86f6df7147288059b81ad893430de/71d4d/fromis9_etkyung.webp 1280w","type":"image/webp","sizes":"(min-width: 1280px) 1280px, 100vw"}]},"width":1280,"height":720}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/04_compare_done.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/0d98d4a1b6e30993056402fe125bda41/0b6bc/04_compare_done.jpg","srcSet":"/static/0d98d4a1b6e30993056402fe125bda41/5d8dd/04_compare_done.jpg 416w,\n/static/0d98d4a1b6e30993056402fe125bda41/ebe4a/04_compare_done.jpg 832w,\n/static/0d98d4a1b6e30993056402fe125bda41/0b6bc/04_compare_done.jpg 1664w","sizes":"(min-width: 1664px) 1664px, 100vw"},"sources":[{"srcSet":"/static/0d98d4a1b6e30993056402fe125bda41/3f6b3/04_compare_done.avif 416w,\n/static/0d98d4a1b6e30993056402fe125bda41/f9303/04_compare_done.avif 832w,\n/static/0d98d4a1b6e30993056402fe125bda41/cfff2/04_compare_done.avif 1664w","type":"image/avif","sizes":"(min-width: 1664px) 1664px, 100vw"},{"srcSet":"/static/0d98d4a1b6e30993056402fe125bda41/7748d/04_compare_done.webp 416w,\n/static/0d98d4a1b6e30993056402fe125bda41/2d4ec/04_compare_done.webp 832w,\n/static/0d98d4a1b6e30993056402fe125bda41/0cceb/04_compare_done.webp 1664w","type":"image/webp","sizes":"(min-width: 1664px) 1664px, 100vw"}]},"width":1664,"height":816}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/002-no-custom-cmd-found.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2c79841b523bfa8ab9ce6c25438c0894/fe3c6/002-no-custom-cmd-found.jpg","srcSet":"/static/2c79841b523bfa8ab9ce6c25438c0894/2e052/002-no-custom-cmd-found.jpg 396w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/d4265/002-no-custom-cmd-found.jpg 791w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/fe3c6/002-no-custom-cmd-found.jpg 1582w","sizes":"(min-width: 1582px) 1582px, 100vw"},"sources":[{"srcSet":"/static/2c79841b523bfa8ab9ce6c25438c0894/3357a/002-no-custom-cmd-found.avif 396w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/27e4e/002-no-custom-cmd-found.avif 791w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/63fd8/002-no-custom-cmd-found.avif 1582w","type":"image/avif","sizes":"(min-width: 1582px) 1582px, 100vw"},{"srcSet":"/static/2c79841b523bfa8ab9ce6c25438c0894/aa453/002-no-custom-cmd-found.webp 396w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/049ea/002-no-custom-cmd-found.webp 791w,\n/static/2c79841b523bfa8ab9ce6c25438c0894/6ba81/002-no-custom-cmd-found.webp 1582w","type":"image/webp","sizes":"(min-width: 1582px) 1582px, 100vw"}]},"width":1582,"height":915}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/02-2_find_command_done.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/5a5c6993b13dfc7a02cb200c913b58a1/e8401/02-2_find_command_done.jpg","srcSet":"/static/5a5c6993b13dfc7a02cb200c913b58a1/93848/02-2_find_command_done.jpg 397w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/c9972/02-2_find_command_done.jpg 793w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/e8401/02-2_find_command_done.jpg 1586w","sizes":"(min-width: 1586px) 1586px, 100vw"},"sources":[{"srcSet":"/static/5a5c6993b13dfc7a02cb200c913b58a1/84f62/02-2_find_command_done.avif 397w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/213e3/02-2_find_command_done.avif 793w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/dbcb3/02-2_find_command_done.avif 1586w","type":"image/avif","sizes":"(min-width: 1586px) 1586px, 100vw"},{"srcSet":"/static/5a5c6993b13dfc7a02cb200c913b58a1/1469d/02-2_find_command_done.webp 397w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/56e2d/02-2_find_command_done.webp 793w,\n/static/5a5c6993b13dfc7a02cb200c913b58a1/90d56/02-2_find_command_done.webp 1586w","type":"image/webp","sizes":"(min-width: 1586px) 1586px, 100vw"}]},"width":1586,"height":916}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-17---chapter11/media/002.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/408ad/002.png","srcSet":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/b82f6/002.png 562w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/3874a/002.png 1124w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/408ad/002.png 2247w","sizes":"(min-width: 2247px) 2247px, 100vw"},"sources":[{"srcSet":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/dfc39/002.avif 562w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/1c94c/002.avif 1124w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/d3706/002.avif 2247w","type":"image/avif","sizes":"(min-width: 2247px) 2247px, 100vw"},{"srcSet":"/static/a97cea6c1f68e9e424d57b35abbf5b3b/2f4cd/002.webp 562w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/4217f/002.webp 1124w,\n/static/a97cea6c1f68e9e424d57b35abbf5b3b/c8581/002.webp 2247w","type":"image/webp","sizes":"(min-width: 2247px) 2247px, 100vw"}]},"width":2247,"height":1368}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/003-2-unzip.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/24e08/003-2-unzip.jpg","srcSet":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/167dc/003-2-unzip.jpg 333w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/7ac78/003-2-unzip.jpg 665w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/24e08/003-2-unzip.jpg 1330w","sizes":"(min-width: 1330px) 1330px, 100vw"},"sources":[{"srcSet":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/c4a52/003-2-unzip.avif 333w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/5859b/003-2-unzip.avif 665w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/28f22/003-2-unzip.avif 1330w","type":"image/avif","sizes":"(min-width: 1330px) 1330px, 100vw"},{"srcSet":"/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/d791d/003-2-unzip.webp 333w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/19b0c/003-2-unzip.webp 665w,\n/static/2df8f9f4eaa2ed66e7bb2d67041e2f22/ba124/003-2-unzip.webp 1330w","type":"image/webp","sizes":"(min-width: 1330px) 1330px, 100vw"}]},"width":1330,"height":555}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/003-zip.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/53e55db587f9f9621b9a21c4d928fff1/24e08/003-zip.jpg","srcSet":"/static/53e55db587f9f9621b9a21c4d928fff1/167dc/003-zip.jpg 333w,\n/static/53e55db587f9f9621b9a21c4d928fff1/7ac78/003-zip.jpg 665w,\n/static/53e55db587f9f9621b9a21c4d928fff1/24e08/003-zip.jpg 1330w","sizes":"(min-width: 1330px) 1330px, 100vw"},"sources":[{"srcSet":"/static/53e55db587f9f9621b9a21c4d928fff1/c4a52/003-zip.avif 333w,\n/static/53e55db587f9f9621b9a21c4d928fff1/5859b/003-zip.avif 665w,\n/static/53e55db587f9f9621b9a21c4d928fff1/28f22/003-zip.avif 1330w","type":"image/avif","sizes":"(min-width: 1330px) 1330px, 100vw"},{"srcSet":"/static/53e55db587f9f9621b9a21c4d928fff1/d791d/003-zip.webp 333w,\n/static/53e55db587f9f9621b9a21c4d928fff1/19b0c/003-zip.webp 665w,\n/static/53e55db587f9f9621b9a21c4d928fff1/ba124/003-zip.webp 1330w","type":"image/webp","sizes":"(min-width: 1330px) 1330px, 100vw"}]},"width":1330,"height":555}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/00_SSO_delegation_diagram.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/549e80f403be0429f455ef576795da7a/dfc02/00_SSO_delegation_diagram.jpg","srcSet":"/static/549e80f403be0429f455ef576795da7a/bfda2/00_SSO_delegation_diagram.jpg 236w,\n/static/549e80f403be0429f455ef576795da7a/d498b/00_SSO_delegation_diagram.jpg 473w,\n/static/549e80f403be0429f455ef576795da7a/dfc02/00_SSO_delegation_diagram.jpg 945w","sizes":"(min-width: 945px) 945px, 100vw"},"sources":[{"srcSet":"/static/549e80f403be0429f455ef576795da7a/e69db/00_SSO_delegation_diagram.avif 236w,\n/static/549e80f403be0429f455ef576795da7a/1c7ab/00_SSO_delegation_diagram.avif 473w,\n/static/549e80f403be0429f455ef576795da7a/06e35/00_SSO_delegation_diagram.avif 945w","type":"image/avif","sizes":"(min-width: 945px) 945px, 100vw"},{"srcSet":"/static/549e80f403be0429f455ef576795da7a/b4f82/00_SSO_delegation_diagram.webp 236w,\n/static/549e80f403be0429f455ef576795da7a/8827f/00_SSO_delegation_diagram.webp 473w,\n/static/549e80f403be0429f455ef576795da7a/41285/00_SSO_delegation_diagram.webp 945w","type":"image/webp","sizes":"(min-width: 945px) 945px, 100vw"}]},"width":945,"height":472}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02/media/00_OIDC_diagram.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/e87b7799d999d5459562e5da330a61ac/08814/00_OIDC_diagram.png","srcSet":"/static/e87b7799d999d5459562e5da330a61ac/c2095/00_OIDC_diagram.png 338w,\n/static/e87b7799d999d5459562e5da330a61ac/28917/00_OIDC_diagram.png 677w,\n/static/e87b7799d999d5459562e5da330a61ac/08814/00_OIDC_diagram.png 1353w","sizes":"(min-width: 1353px) 1353px, 100vw"},"sources":[{"srcSet":"/static/e87b7799d999d5459562e5da330a61ac/dca89/00_OIDC_diagram.avif 338w,\n/static/e87b7799d999d5459562e5da330a61ac/f8033/00_OIDC_diagram.avif 677w,\n/static/e87b7799d999d5459562e5da330a61ac/a79f4/00_OIDC_diagram.avif 1353w","type":"image/avif","sizes":"(min-width: 1353px) 1353px, 100vw"},{"srcSet":"/static/e87b7799d999d5459562e5da330a61ac/c0dc4/00_OIDC_diagram.webp 338w,\n/static/e87b7799d999d5459562e5da330a61ac/7d6cd/00_OIDC_diagram.webp 677w,\n/static/e87b7799d999d5459562e5da330a61ac/61c43/00_OIDC_diagram.webp 1353w","type":"image/webp","sizes":"(min-width: 1353px) 1353px, 100vw"}]},"width":1353,"height":784}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2019-04-19---jekyll-liquid-issue/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/03-1_compare_before.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/b1615abf3a046611cd25153b873fcdf9/6aaa2/03-1_compare_before.jpg","srcSet":"/static/b1615abf3a046611cd25153b873fcdf9/749ac/03-1_compare_before.jpg 321w,\n/static/b1615abf3a046611cd25153b873fcdf9/cd641/03-1_compare_before.jpg 641w,\n/static/b1615abf3a046611cd25153b873fcdf9/6aaa2/03-1_compare_before.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/b1615abf3a046611cd25153b873fcdf9/e95f0/03-1_compare_before.avif 321w,\n/static/b1615abf3a046611cd25153b873fcdf9/bf0ad/03-1_compare_before.avif 641w,\n/static/b1615abf3a046611cd25153b873fcdf9/398cb/03-1_compare_before.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/b1615abf3a046611cd25153b873fcdf9/9f90b/03-1_compare_before.webp 321w,\n/static/b1615abf3a046611cd25153b873fcdf9/31b9d/03-1_compare_before.webp 641w,\n/static/b1615abf3a046611cd25153b873fcdf9/02956/03-1_compare_before.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/001-no-cmd-found.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/31c90f12065accf6deddbcd404608dda/ec1bb/001-no-cmd-found.jpg","srcSet":"/static/31c90f12065accf6deddbcd404608dda/de79a/001-no-cmd-found.jpg 401w,\n/static/31c90f12065accf6deddbcd404608dda/bb5b5/001-no-cmd-found.jpg 803w,\n/static/31c90f12065accf6deddbcd404608dda/ec1bb/001-no-cmd-found.jpg 1605w","sizes":"(min-width: 1605px) 1605px, 100vw"},"sources":[{"srcSet":"/static/31c90f12065accf6deddbcd404608dda/a61ec/001-no-cmd-found.avif 401w,\n/static/31c90f12065accf6deddbcd404608dda/3385b/001-no-cmd-found.avif 803w,\n/static/31c90f12065accf6deddbcd404608dda/8944a/001-no-cmd-found.avif 1605w","type":"image/avif","sizes":"(min-width: 1605px) 1605px, 100vw"},{"srcSet":"/static/31c90f12065accf6deddbcd404608dda/cf857/001-no-cmd-found.webp 401w,\n/static/31c90f12065accf6deddbcd404608dda/215be/001-no-cmd-found.webp 803w,\n/static/31c90f12065accf6deddbcd404608dda/8fbce/001-no-cmd-found.webp 1605w","type":"image/webp","sizes":"(min-width: 1605px) 1605px, 100vw"}]},"width":1605,"height":1270}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/004-01-compress.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/679fb2ffb04485f26bc4fb6318182d8b/6aaa2/004-01-compress.jpg","srcSet":"/static/679fb2ffb04485f26bc4fb6318182d8b/749ac/004-01-compress.jpg 321w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/cd641/004-01-compress.jpg 641w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/6aaa2/004-01-compress.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/679fb2ffb04485f26bc4fb6318182d8b/e95f0/004-01-compress.avif 321w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/bf0ad/004-01-compress.avif 641w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/398cb/004-01-compress.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/679fb2ffb04485f26bc4fb6318182d8b/9f90b/004-01-compress.webp 321w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/31b9d/004-01-compress.webp 641w,\n/static/679fb2ffb04485f26bc4fb6318182d8b/02956/004-01-compress.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/004-02-uncompress.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/79cfcbdf6f1adec340714976a965363c/6aaa2/004-02-uncompress.jpg","srcSet":"/static/79cfcbdf6f1adec340714976a965363c/749ac/004-02-uncompress.jpg 321w,\n/static/79cfcbdf6f1adec340714976a965363c/cd641/004-02-uncompress.jpg 641w,\n/static/79cfcbdf6f1adec340714976a965363c/6aaa2/004-02-uncompress.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/79cfcbdf6f1adec340714976a965363c/e95f0/004-02-uncompress.avif 321w,\n/static/79cfcbdf6f1adec340714976a965363c/bf0ad/004-02-uncompress.avif 641w,\n/static/79cfcbdf6f1adec340714976a965363c/398cb/004-02-uncompress.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/79cfcbdf6f1adec340714976a965363c/9f90b/004-02-uncompress.webp 321w,\n/static/79cfcbdf6f1adec340714976a965363c/31b9d/004-02-uncompress.webp 641w,\n/static/79cfcbdf6f1adec340714976a965363c/02956/004-02-uncompress.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-04---gatsby-add-image-captions/media/02_caption_test.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/5e9974306bf62f9a26c92fa8afe12663/9a8fc/02_caption_test.jpg","srcSet":"/static/5e9974306bf62f9a26c92fa8afe12663/936ea/02_caption_test.jpg 401w,\n/static/5e9974306bf62f9a26c92fa8afe12663/70766/02_caption_test.jpg 803w,\n/static/5e9974306bf62f9a26c92fa8afe12663/9a8fc/02_caption_test.jpg 1605w","sizes":"(min-width: 1605px) 1605px, 100vw"},"sources":[{"srcSet":"/static/5e9974306bf62f9a26c92fa8afe12663/b6e8d/02_caption_test.avif 401w,\n/static/5e9974306bf62f9a26c92fa8afe12663/cdb10/02_caption_test.avif 803w,\n/static/5e9974306bf62f9a26c92fa8afe12663/9a57d/02_caption_test.avif 1605w","type":"image/avif","sizes":"(min-width: 1605px) 1605px, 100vw"},{"srcSet":"/static/5e9974306bf62f9a26c92fa8afe12663/0a50a/02_caption_test.webp 401w,\n/static/5e9974306bf62f9a26c92fa8afe12663/83d18/02_caption_test.webp 803w,\n/static/5e9974306bf62f9a26c92fa8afe12663/37b6f/02_caption_test.webp 1605w","type":"image/webp","sizes":"(min-width: 1605px) 1605px, 100vw"}]},"width":1605,"height":1128}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/02-1_find_command_no_cmd_found.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/f30e44bbd7976e549e3b426141b39484/c6633/02-1_find_command_no_cmd_found.jpg","srcSet":"/static/f30e44bbd7976e549e3b426141b39484/749ac/02-1_find_command_no_cmd_found.jpg 321w,\n/static/f30e44bbd7976e549e3b426141b39484/1e8fc/02-1_find_command_no_cmd_found.jpg 642w,\n/static/f30e44bbd7976e549e3b426141b39484/c6633/02-1_find_command_no_cmd_found.jpg 1284w","sizes":"(min-width: 1284px) 1284px, 100vw"},"sources":[{"srcSet":"/static/f30e44bbd7976e549e3b426141b39484/e95f0/02-1_find_command_no_cmd_found.avif 321w,\n/static/f30e44bbd7976e549e3b426141b39484/8cb5e/02-1_find_command_no_cmd_found.avif 642w,\n/static/f30e44bbd7976e549e3b426141b39484/26b3b/02-1_find_command_no_cmd_found.avif 1284w","type":"image/avif","sizes":"(min-width: 1284px) 1284px, 100vw"},{"srcSet":"/static/f30e44bbd7976e549e3b426141b39484/9f90b/02-1_find_command_no_cmd_found.webp 321w,\n/static/f30e44bbd7976e549e3b426141b39484/a0d7f/02-1_find_command_no_cmd_found.webp 642w,\n/static/f30e44bbd7976e549e3b426141b39484/06dd0/02-1_find_command_no_cmd_found.webp 1284w","type":"image/webp","sizes":"(min-width: 1284px) 1284px, 100vw"}]},"width":1284,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/01_edit_via_vscode.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2caa7e254b13d0b8e871f8401071e778/c6633/01_edit_via_vscode.jpg","srcSet":"/static/2caa7e254b13d0b8e871f8401071e778/749ac/01_edit_via_vscode.jpg 321w,\n/static/2caa7e254b13d0b8e871f8401071e778/1e8fc/01_edit_via_vscode.jpg 642w,\n/static/2caa7e254b13d0b8e871f8401071e778/c6633/01_edit_via_vscode.jpg 1284w","sizes":"(min-width: 1284px) 1284px, 100vw"},"sources":[{"srcSet":"/static/2caa7e254b13d0b8e871f8401071e778/e95f0/01_edit_via_vscode.avif 321w,\n/static/2caa7e254b13d0b8e871f8401071e778/8cb5e/01_edit_via_vscode.avif 642w,\n/static/2caa7e254b13d0b8e871f8401071e778/26b3b/01_edit_via_vscode.avif 1284w","type":"image/avif","sizes":"(min-width: 1284px) 1284px, 100vw"},{"srcSet":"/static/2caa7e254b13d0b8e871f8401071e778/9f90b/01_edit_via_vscode.webp 321w,\n/static/2caa7e254b13d0b8e871f8401071e778/a0d7f/01_edit_via_vscode.webp 642w,\n/static/2caa7e254b13d0b8e871f8401071e778/06dd0/01_edit_via_vscode.webp 1284w","type":"image/webp","sizes":"(min-width: 1284px) 1284px, 100vw"}]},"width":1284,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/03-2_setting_command_done.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/249b80fc83d017716fedc343e6f9e8a5/6aaa2/03-2_setting_command_done.jpg","srcSet":"/static/249b80fc83d017716fedc343e6f9e8a5/749ac/03-2_setting_command_done.jpg 321w,\n/static/249b80fc83d017716fedc343e6f9e8a5/cd641/03-2_setting_command_done.jpg 641w,\n/static/249b80fc83d017716fedc343e6f9e8a5/6aaa2/03-2_setting_command_done.jpg 1282w","sizes":"(min-width: 1282px) 1282px, 100vw"},"sources":[{"srcSet":"/static/249b80fc83d017716fedc343e6f9e8a5/e95f0/03-2_setting_command_done.avif 321w,\n/static/249b80fc83d017716fedc343e6f9e8a5/bf0ad/03-2_setting_command_done.avif 641w,\n/static/249b80fc83d017716fedc343e6f9e8a5/398cb/03-2_setting_command_done.avif 1282w","type":"image/avif","sizes":"(min-width: 1282px) 1282px, 100vw"},{"srcSet":"/static/249b80fc83d017716fedc343e6f9e8a5/9f90b/03-2_setting_command_done.webp 321w,\n/static/249b80fc83d017716fedc343e6f9e8a5/31b9d/03-2_setting_command_done.webp 641w,\n/static/249b80fc83d017716fedc343e6f9e8a5/02956/03-2_setting_command_done.webp 1282w","type":"image/webp","sizes":"(min-width: 1282px) 1282px, 100vw"}]},"width":1282,"height":1016}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/00_SSO_propagation_diagram.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9a847bcbd3eac8d49d838fb23932f7f9/dfc02/00_SSO_propagation_diagram.jpg","srcSet":"/static/9a847bcbd3eac8d49d838fb23932f7f9/bfda2/00_SSO_propagation_diagram.jpg 236w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/d498b/00_SSO_propagation_diagram.jpg 473w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/dfc02/00_SSO_propagation_diagram.jpg 945w","sizes":"(min-width: 945px) 945px, 100vw"},"sources":[{"srcSet":"/static/9a847bcbd3eac8d49d838fb23932f7f9/e69db/00_SSO_propagation_diagram.avif 236w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/1c7ab/00_SSO_propagation_diagram.avif 473w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/06e35/00_SSO_propagation_diagram.avif 945w","type":"image/avif","sizes":"(min-width: 945px) 945px, 100vw"},{"srcSet":"/static/9a847bcbd3eac8d49d838fb23932f7f9/b4f82/00_SSO_propagation_diagram.webp 236w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/8827f/00_SSO_propagation_diagram.webp 473w,\n/static/9a847bcbd3eac8d49d838fb23932f7f9/41285/00_SSO_propagation_diagram.webp 945w","type":"image/webp","sizes":"(min-width: 945px) 945px, 100vw"}]},"width":945,"height":472}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2021-09-20---python-concurrency-101/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2022-06-09---python-classmethod-and-staticmethod/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2022-06-10---python-descriptor-described/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101-pt01/media/03-python-container-shared.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#081818","images":{"fallback":{"src":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/03-python-container-shared.png","srcSet":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/3f48c/03-python-container-shared.png 295w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/77227/03-python-container-shared.png 590w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/03-python-container-shared.png 1180w","sizes":"(min-width: 1180px) 1180px, 100vw"},"sources":[{"srcSet":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b8ed8/03-python-container-shared.avif 295w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c75cc/03-python-container-shared.avif 590w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/0b58c/03-python-container-shared.avif 1180w","type":"image/avif","sizes":"(min-width: 1180px) 1180px, 100vw"},{"srcSet":"/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/f5a44/03-python-container-shared.webp 295w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c93c8/03-python-container-shared.webp 590w,\n/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/03-python-container-shared.webp 1180w","type":"image/webp","sizes":"(min-width: 1180px) 1180px, 100vw"}]},"width":1180,"height":1268}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101-pt01/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-26---python-container-101-pt02/media/02-python-container-shared.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#081818","images":{"fallback":{"src":"/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/77227/02-python-container-shared.png","srcSet":"/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e75b7/02-python-container-shared.png 148w,\n/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/3f48c/02-python-container-shared.png 295w,\n/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/77227/02-python-container-shared.png 590w","sizes":"(min-width: 590px) 590px, 100vw"},"sources":[{"srcSet":"/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/07afe/02-python-container-shared.avif 148w,\n/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/b8ed8/02-python-container-shared.avif 295w,\n/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c75cc/02-python-container-shared.avif 590w","type":"image/avif","sizes":"(min-width: 590px) 590px, 100vw"},{"srcSet":"/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/976f4/02-python-container-shared.webp 148w,\n/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/f5a44/02-python-container-shared.webp 295w,\n/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c93c8/02-python-container-shared.webp 590w","type":"image/webp","sizes":"(min-width: 590px) 590px, 100vw"}]},"width":590,"height":634}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-26---python-container-101-pt02/media/sangdo-dong.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg","srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/0f5ce/sangdo-dong.jpg 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/1f55a/sangdo-dong.jpg 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/035db/sangdo-dong.jpg 3000w","sizes":"(min-width: 3000px) 3000px, 100vw"},"sources":[{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/099ee/sangdo-dong.avif 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/d879d/sangdo-dong.avif 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/e05fd/sangdo-dong.avif 3000w","type":"image/avif","sizes":"(min-width: 3000px) 3000px, 100vw"},{"srcSet":"/static/f362749d11992f125f0cdfe8205b50ef/4f03f/sangdo-dong.webp 750w,\n/static/f362749d11992f125f0cdfe8205b50ef/07142/sangdo-dong.webp 1500w,\n/static/f362749d11992f125f0cdfe8205b50ef/19b60/sangdo-dong.webp 3000w","type":"image/webp","sizes":"(min-width: 3000px) 3000px, 100vw"}]},"width":3000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02/media/01_OIDC_sequence_diagram.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/e75384ebc39dc3c4dfc9779e790af9ca/74306/01_OIDC_sequence_diagram.png","srcSet":"/static/e75384ebc39dc3c4dfc9779e790af9ca/7a115/01_OIDC_sequence_diagram.png 352w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/2004f/01_OIDC_sequence_diagram.png 704w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/74306/01_OIDC_sequence_diagram.png 1407w","sizes":"(min-width: 1407px) 1407px, 100vw"},"sources":[{"srcSet":"/static/e75384ebc39dc3c4dfc9779e790af9ca/3915c/01_OIDC_sequence_diagram.avif 352w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/465ea/01_OIDC_sequence_diagram.avif 704w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/ea8b6/01_OIDC_sequence_diagram.avif 1407w","type":"image/avif","sizes":"(min-width: 1407px) 1407px, 100vw"},{"srcSet":"/static/e75384ebc39dc3c4dfc9779e790af9ca/bf3d1/01_OIDC_sequence_diagram.webp 352w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/ce4f1/01_OIDC_sequence_diagram.webp 704w,\n/static/e75384ebc39dc3c4dfc9779e790af9ca/9af41/01_OIDC_sequence_diagram.webp 1407w","type":"image/webp","sizes":"(min-width: 1407px) 1407px, 100vw"}]},"width":1407,"height":1601}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/exotic_shorthair.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#887868","images":{"fallback":{"src":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg","srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/90ed1/exotic_shorthair.jpg 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/2070e/exotic_shorthair.jpg 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/1aafe/exotic_shorthair.avif 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6707c/exotic_shorthair.avif 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6ee87/exotic_shorthair.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/b5535/exotic_shorthair.webp 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/f5c71/exotic_shorthair.webp 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/0d27e/exotic_shorthair.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":600}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-24---probing-pep-333-3-wsgi-and-asgi-pt02/media/exotic_shorthair.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#887868","images":{"fallback":{"src":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg","srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/90ed1/exotic_shorthair.jpg 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/2070e/exotic_shorthair.jpg 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/1aafe/exotic_shorthair.avif 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6707c/exotic_shorthair.avif 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6ee87/exotic_shorthair.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/b5535/exotic_shorthair.webp 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/f5c71/exotic_shorthair.webp 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/0d27e/exotic_shorthair.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":600}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-25---probing-pep-333-3-wsgi-and-asgi-pt03/media/exotic_shorthair.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#887868","images":{"fallback":{"src":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg","srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/90ed1/exotic_shorthair.jpg 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/2070e/exotic_shorthair.jpg 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/d0b9c/exotic_shorthair.jpg 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/1aafe/exotic_shorthair.avif 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6707c/exotic_shorthair.avif 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/6ee87/exotic_shorthair.avif 800w","type":"image/avif","sizes":"(min-width: 800px) 800px, 100vw"},{"srcSet":"/static/cd9bafcf9a9d29c4caa364c8c74b627e/b5535/exotic_shorthair.webp 200w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/f5c71/exotic_shorthair.webp 400w,\n/static/cd9bafcf9a9d29c4caa364c8c74b627e/0d27e/exotic_shorthair.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":600}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-26---python-container-101-pt02/media/01-python-container-simple.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#081818","images":{"fallback":{"src":"/static/13c8ea80289a195a226aad717c67eb86/69770/01-python-container-simple.png","srcSet":"/static/13c8ea80289a195a226aad717c67eb86/dac8e/01-python-container-simple.png 117w,\n/static/13c8ea80289a195a226aad717c67eb86/95aeb/01-python-container-simple.png 233w,\n/static/13c8ea80289a195a226aad717c67eb86/69770/01-python-container-simple.png 466w","sizes":"(min-width: 466px) 466px, 100vw"},"sources":[{"srcSet":"/static/13c8ea80289a195a226aad717c67eb86/103a1/01-python-container-simple.avif 117w,\n/static/13c8ea80289a195a226aad717c67eb86/a09fc/01-python-container-simple.avif 233w,\n/static/13c8ea80289a195a226aad717c67eb86/abecf/01-python-container-simple.avif 466w","type":"image/avif","sizes":"(min-width: 466px) 466px, 100vw"},{"srcSet":"/static/13c8ea80289a195a226aad717c67eb86/5cba8/01-python-container-simple.webp 117w,\n/static/13c8ea80289a195a226aad717c67eb86/a4da4/01-python-container-simple.webp 233w,\n/static/13c8ea80289a195a226aad717c67eb86/c6011/01-python-container-simple.webp 466w","type":"image/webp","sizes":"(min-width: 466px) 466px, 100vw"}]},"width":466,"height":668}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-09-05---what-is-wrong-with-my-vscode-tab/media/000_preface.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/5222f327748bfaed1ca2537df9f08e27/9307b/000_preface.jpg","srcSet":"/static/5222f327748bfaed1ca2537df9f08e27/982ea/000_preface.jpg 787w,\n/static/5222f327748bfaed1ca2537df9f08e27/21a0b/000_preface.jpg 1574w,\n/static/5222f327748bfaed1ca2537df9f08e27/9307b/000_preface.jpg 3148w","sizes":"(min-width: 3148px) 3148px, 100vw"},"sources":[{"srcSet":"/static/5222f327748bfaed1ca2537df9f08e27/75fcb/000_preface.avif 787w,\n/static/5222f327748bfaed1ca2537df9f08e27/ac616/000_preface.avif 1574w,\n/static/5222f327748bfaed1ca2537df9f08e27/0a097/000_preface.avif 3148w","type":"image/avif","sizes":"(min-width: 3148px) 3148px, 100vw"},{"srcSet":"/static/5222f327748bfaed1ca2537df9f08e27/a3daa/000_preface.webp 787w,\n/static/5222f327748bfaed1ca2537df9f08e27/20d44/000_preface.webp 1574w,\n/static/5222f327748bfaed1ca2537df9f08e27/8ad52/000_preface.webp 3148w","type":"image/webp","sizes":"(min-width: 3148px) 3148px, 100vw"}]},"width":3148,"height":868}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/005-01-zip-cmd.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/2d74024f7e9725b43ee27f476bc8ad1c/a4926/005-01-zip-cmd.jpg","srcSet":"/static/2d74024f7e9725b43ee27f476bc8ad1c/a19d6/005-01-zip-cmd.jpg 543w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/4be3c/005-01-zip-cmd.jpg 1085w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/a4926/005-01-zip-cmd.jpg 2170w","sizes":"(min-width: 2170px) 2170px, 100vw"},"sources":[{"srcSet":"/static/2d74024f7e9725b43ee27f476bc8ad1c/b0ed3/005-01-zip-cmd.avif 543w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/ab909/005-01-zip-cmd.avif 1085w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/5bc13/005-01-zip-cmd.avif 2170w","type":"image/avif","sizes":"(min-width: 2170px) 2170px, 100vw"},{"srcSet":"/static/2d74024f7e9725b43ee27f476bc8ad1c/b004a/005-01-zip-cmd.webp 543w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/511a4/005-01-zip-cmd.webp 1085w,\n/static/2d74024f7e9725b43ee27f476bc8ad1c/b7329/005-01-zip-cmd.webp 2170w","type":"image/webp","sizes":"(min-width: 2170px) 2170px, 100vw"}]},"width":2170,"height":1586}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/clean-code/2023-02-24---chapter12/media/001.jpeg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/3d9505f0b4060dbd2ce2964a777c7bce/859ab/001.jpg","srcSet":"/static/3d9505f0b4060dbd2ce2964a777c7bce/3669b/001.jpg 463w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/7bc15/001.jpg 925w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/859ab/001.jpg 1850w","sizes":"(min-width: 1850px) 1850px, 100vw"},"sources":[{"srcSet":"/static/3d9505f0b4060dbd2ce2964a777c7bce/c7367/001.avif 463w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/d4a47/001.avif 925w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/c5ca0/001.avif 1850w","type":"image/avif","sizes":"(min-width: 1850px) 1850px, 100vw"},{"srcSet":"/static/3d9505f0b4060dbd2ce2964a777c7bce/2c679/001.webp 463w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/8daae/001.webp 925w,\n/static/3d9505f0b4060dbd2ce2964a777c7bce/13dc3/001.webp 1850w","type":"image/webp","sizes":"(min-width: 1850px) 1850px, 100vw"}]},"width":1850,"height":1823}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/002_server-middleware-app.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/eb58b/002_server-middleware-app.png","srcSet":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/f8356/002_server-middleware-app.png 353w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/bba45/002_server-middleware-app.png 705w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/eb58b/002_server-middleware-app.png 1410w","sizes":"(min-width: 1410px) 1410px, 100vw"},"sources":[{"srcSet":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/b471f/002_server-middleware-app.avif 353w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/e7335/002_server-middleware-app.avif 705w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/f2baf/002_server-middleware-app.avif 1410w","type":"image/avif","sizes":"(min-width: 1410px) 1410px, 100vw"},{"srcSet":"/static/ad03458fdaf1f7a27872e1f34f07a8a3/851aa/002_server-middleware-app.webp 353w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/c21a1/002_server-middleware-app.webp 705w,\n/static/ad03458fdaf1f7a27872e1f34f07a8a3/ac104/002_server-middleware-app.webp 1410w","type":"image/webp","sizes":"(min-width: 1410px) 1410px, 100vw"}]},"width":1410,"height":769}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2024-10-13---python-container-101-pt01/media/02-python-container-simple.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#081818","images":{"fallback":{"src":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/02-python-container-simple.png","srcSet":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/cee1b/02-python-container-simple.png 291w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/bb2dc/02-python-container-simple.png 582w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/02-python-container-simple.png 1164w","sizes":"(min-width: 1164px) 1164px, 100vw"},"sources":[{"srcSet":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/aa2a9/02-python-container-simple.avif 291w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/04701/02-python-container-simple.avif 582w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/02-python-container-simple.avif 1164w","type":"image/avif","sizes":"(min-width: 1164px) 1164px, 100vw"},{"srcSet":"/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/ae6be/02-python-container-simple.webp 291w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/acea3/02-python-container-simple.webp 582w,\n/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/02-python-container-simple.webp 1164w","type":"image/webp","sizes":"(min-width: 1164px) 1164px, 100vw"}]},"width":1164,"height":1670}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt01/media/under_construction.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg","srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/de105/under_construction.jpg 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/643b0/under_construction.jpg 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/0b70d/under_construction.avif 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/6172e/under_construction.avif 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/49453/under_construction.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/85e35/under_construction.webp 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/5803e/under_construction.webp 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/dfbe4/under_construction.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt02/media/under_construction.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg","srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/de105/under_construction.jpg 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/643b0/under_construction.jpg 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/0b70d/under_construction.avif 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/6172e/under_construction.avif 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/49453/under_construction.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/85e35/under_construction.webp 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/5803e/under_construction.webp 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/dfbe4/under_construction.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2024-09-17---geultto-10th-life-retrospect/media/under_construction.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg","srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/de105/under_construction.jpg 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/643b0/under_construction.jpg 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/7a5be/under_construction.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/0b70d/under_construction.avif 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/6172e/under_construction.avif 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/49453/under_construction.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/8a6ecc671323d466db1a40007cbe3e72/85e35/under_construction.webp 1000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/5803e/under_construction.webp 2000w,\n/static/8a6ecc671323d466db1a40007cbe3e72/dfbe4/under_construction.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/005-02-unzip-cmd.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/e78776b3a692228334bebf1a49550d13/1307f/005-02-unzip-cmd.jpg","srcSet":"/static/e78776b3a692228334bebf1a49550d13/80b8d/005-02-unzip-cmd.jpg 538w,\n/static/e78776b3a692228334bebf1a49550d13/f0d7c/005-02-unzip-cmd.jpg 1075w,\n/static/e78776b3a692228334bebf1a49550d13/1307f/005-02-unzip-cmd.jpg 2150w","sizes":"(min-width: 2150px) 2150px, 100vw"},"sources":[{"srcSet":"/static/e78776b3a692228334bebf1a49550d13/953fc/005-02-unzip-cmd.avif 538w,\n/static/e78776b3a692228334bebf1a49550d13/20c8a/005-02-unzip-cmd.avif 1075w,\n/static/e78776b3a692228334bebf1a49550d13/553d6/005-02-unzip-cmd.avif 2150w","type":"image/avif","sizes":"(min-width: 2150px) 2150px, 100vw"},{"srcSet":"/static/e78776b3a692228334bebf1a49550d13/a33c7/005-02-unzip-cmd.webp 538w,\n/static/e78776b3a692228334bebf1a49550d13/a5cb0/005-02-unzip-cmd.webp 1075w,\n/static/e78776b3a692228334bebf1a49550d13/43070/005-02-unzip-cmd.webp 2150w","type":"image/webp","sizes":"(min-width: 2150px) 2150px, 100vw"}]},"width":2150,"height":1590}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/003_wsgi_as_onion.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/d122a/003_wsgi_as_onion.jpg","srcSet":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/3c0ca/003_wsgi_as_onion.jpg 570w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/844e1/003_wsgi_as_onion.jpg 1141w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/d122a/003_wsgi_as_onion.jpg 2281w","sizes":"(min-width: 2281px) 2281px, 100vw"},"sources":[{"srcSet":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/af019/003_wsgi_as_onion.avif 570w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/a4e15/003_wsgi_as_onion.avif 1141w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/8a468/003_wsgi_as_onion.avif 2281w","type":"image/avif","sizes":"(min-width: 2281px) 2281px, 100vw"},{"srcSet":"/static/1ecc4e86c60ff30f1adbcbfce7e2adde/c92d5/003_wsgi_as_onion.webp 570w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/b8ef6/003_wsgi_as_onion.webp 1141w,\n/static/1ecc4e86c60ff30f1adbcbfce7e2adde/e6551/003_wsgi_as_onion.webp 2281w","type":"image/webp","sizes":"(min-width: 2281px) 2281px, 100vw"}]},"width":2281,"height":1709}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2020-05-22---s3ich4n-1-year-retrospect/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-21---pt01/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-21---pt02/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-23---pt03/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/pragmatic-programmer-1st/2018-02-24---pt04/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/docker/2021-09-18---how-to-make-docker-image-securely/media/gwangheungchang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282828","images":{"fallback":{"src":"/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg","srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/4a00f/gwangheungchang.jpg 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/facf2/gwangheungchang.jpg 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/3fd2e/gwangheungchang.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0d964/gwangheungchang.avif 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/fc319/gwangheungchang.avif 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/759e3/gwangheungchang.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/5198f5b3f44086ef968903c16c8af0df/0531b/gwangheungchang.webp 756w,\n/static/5198f5b3f44086ef968903c16c8af0df/dd848/gwangheungchang.webp 1512w,\n/static/5198f5b3f44086ef968903c16c8af0df/95aac/gwangheungchang.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/004_example_of_multi_middlewares.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#282838","images":{"fallback":{"src":"/static/27d3fbb341af172ca2f5df87e0b442f7/10ca9/004_example_of_multi_middlewares.png","srcSet":"/static/27d3fbb341af172ca2f5df87e0b442f7/f0e06/004_example_of_multi_middlewares.png 885w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/6d073/004_example_of_multi_middlewares.png 1769w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/10ca9/004_example_of_multi_middlewares.png 3538w","sizes":"(min-width: 3538px) 3538px, 100vw"},"sources":[{"srcSet":"/static/27d3fbb341af172ca2f5df87e0b442f7/c2652/004_example_of_multi_middlewares.avif 885w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/5a158/004_example_of_multi_middlewares.avif 1769w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/906ad/004_example_of_multi_middlewares.avif 3538w","type":"image/avif","sizes":"(min-width: 3538px) 3538px, 100vw"},{"srcSet":"/static/27d3fbb341af172ca2f5df87e0b442f7/e61f2/004_example_of_multi_middlewares.webp 885w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/332e0/004_example_of_multi_middlewares.webp 1769w,\n/static/27d3fbb341af172ca2f5df87e0b442f7/d7d10/004_example_of_multi_middlewares.webp 3538w","type":"image/webp","sizes":"(min-width: 3538px) 3538px, 100vw"}]},"width":3538,"height":2041}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/retrospect/2023-02-20---assignment-pt01/media/02_work_in_progress.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#a89888","images":{"fallback":{"src":"/static/f7ec5fef710ac54da2d6134e66147dc5/7a5be/02_work_in_progress.jpg","srcSet":"/static/f7ec5fef710ac54da2d6134e66147dc5/de105/02_work_in_progress.jpg 1000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/643b0/02_work_in_progress.jpg 2000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/7a5be/02_work_in_progress.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/f7ec5fef710ac54da2d6134e66147dc5/0b70d/02_work_in_progress.avif 1000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/6172e/02_work_in_progress.avif 2000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/49453/02_work_in_progress.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/f7ec5fef710ac54da2d6134e66147dc5/85e35/02_work_in_progress.webp 1000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/5803e/02_work_in_progress.webp 2000w,\n/static/f7ec5fef710ac54da2d6134e66147dc5/dfbe4/02_work_in_progress.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-06-03---how-to-use-file-signature-in-pycharm/media/pangyo_01.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#183878","images":{"fallback":{"src":"/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg","srcSet":"/static/4644b783d0f0d4821bbffead009ea763/6c903/pangyo_01.jpg 756w,\n/static/4644b783d0f0d4821bbffead009ea763/44670/pangyo_01.jpg 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/051f6/pangyo_01.avif 756w,\n/static/4644b783d0f0d4821bbffead009ea763/46b78/pangyo_01.avif 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/8724c/pangyo_01.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/dd945/pangyo_01.webp 756w,\n/static/4644b783d0f0d4821bbffead009ea763/76fb3/pangyo_01.webp 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/7d916/pangyo_01.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":4032}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2021-07-11---how-to-use-pre-commit-hook-vol1/media/pangyo_01.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#183878","images":{"fallback":{"src":"/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg","srcSet":"/static/4644b783d0f0d4821bbffead009ea763/6c903/pangyo_01.jpg 756w,\n/static/4644b783d0f0d4821bbffead009ea763/44670/pangyo_01.jpg 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/fae27/pangyo_01.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/051f6/pangyo_01.avif 756w,\n/static/4644b783d0f0d4821bbffead009ea763/46b78/pangyo_01.avif 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/8724c/pangyo_01.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/4644b783d0f0d4821bbffead009ea763/dd945/pangyo_01.webp 756w,\n/static/4644b783d0f0d4821bbffead009ea763/76fb3/pangyo_01.webp 1512w,\n/static/4644b783d0f0d4821bbffead009ea763/7d916/pangyo_01.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":4032}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-28---pt01-ch01/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-06-30---pt01-ch02/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-01---pt01-ch03/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/unit-testing/2023-07-04---pt02-ch04/media/testcode.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png","srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/acb7c/testcode.png 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/ccc41/testcode.png 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/b5658/testcode.png 1024w","sizes":"(min-width: 1024px) 1024px, 100vw"},"sources":[{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/5a128/testcode.avif 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/65c8c/testcode.avif 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/eb314/testcode.avif 1024w","type":"image/avif","sizes":"(min-width: 1024px) 1024px, 100vw"},{"srcSet":"/static/92fc9ae9b498cada09d7b41384a7fff3/22bfc/testcode.webp 256w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/d689f/testcode.webp 512w,\n/static/92fc9ae9b498cada09d7b41384a7fff3/67ded/testcode.webp 1024w","type":"image/webp","sizes":"(min-width: 1024px) 1024px, 100vw"}]},"width":1024,"height":1024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/photo.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/4c2c993a06ee0fd0ee953020b09128a9/ae1c8/photo.png","srcSet":"/static/4c2c993a06ee0fd0ee953020b09128a9/08932/photo.png 270w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/1fa44/photo.png 540w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/ae1c8/photo.png 1080w","sizes":"(min-width: 1080px) 1080px, 100vw"},"sources":[{"srcSet":"/static/4c2c993a06ee0fd0ee953020b09128a9/3e0da/photo.avif 270w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/ecab3/photo.avif 540w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/caf3c/photo.avif 1080w","type":"image/avif","sizes":"(min-width: 1080px) 1080px, 100vw"},{"srcSet":"/static/4c2c993a06ee0fd0ee953020b09128a9/ede49/photo.webp 270w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/4cb34/photo.webp 540w,\n/static/4c2c993a06ee0fd0ee953020b09128a9/4f506/photo.webp 1080w","type":"image/webp","sizes":"(min-width: 1080px) 1080px, 100vw"}]},"width":1080,"height":1080}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01/media/001_wsgi_ianb.png","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/372de2bba708d50f0ea0962afc2e0754/04184/001_wsgi_ianb.png","srcSet":"/static/372de2bba708d50f0ea0962afc2e0754/54ce8/001_wsgi_ianb.png 407w,\n/static/372de2bba708d50f0ea0962afc2e0754/1b367/001_wsgi_ianb.png 815w,\n/static/372de2bba708d50f0ea0962afc2e0754/04184/001_wsgi_ianb.png 1629w","sizes":"(min-width: 1629px) 1629px, 100vw"},"sources":[{"srcSet":"/static/372de2bba708d50f0ea0962afc2e0754/78b6c/001_wsgi_ianb.avif 407w,\n/static/372de2bba708d50f0ea0962afc2e0754/439fa/001_wsgi_ianb.avif 815w,\n/static/372de2bba708d50f0ea0962afc2e0754/10129/001_wsgi_ianb.avif 1629w","type":"image/avif","sizes":"(min-width: 1629px) 1629px, 100vw"},{"srcSet":"/static/372de2bba708d50f0ea0962afc2e0754/32393/001_wsgi_ianb.webp 407w,\n/static/372de2bba708d50f0ea0962afc2e0754/8df98/001_wsgi_ianb.webp 815w,\n/static/372de2bba708d50f0ea0962afc2e0754/67b49/001_wsgi_ianb.webp 1629w","type":"image/webp","sizes":"(min-width: 1629px) 1629px, 100vw"}]},"width":1629,"height":1151}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-16---considering-authn-and-authz-revisited-pt01/media/pomeranian.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg","srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/85aae/pomeranian.jpg 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/64308/pomeranian.jpg 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg 3648w","sizes":"(min-width: 3648px) 3648px, 100vw"},"sources":[{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/b1f04/pomeranian.avif 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/def07/pomeranian.avif 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/8a681/pomeranian.avif 3648w","type":"image/avif","sizes":"(min-width: 3648px) 3648px, 100vw"},{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/fabd0/pomeranian.webp 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/d2b65/pomeranian.webp 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/99098/pomeranian.webp 3648w","type":"image/webp","sizes":"(min-width: 3648px) 3648px, 100vw"}]},"width":3648,"height":2736}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/backend/2022-10-17---considering-authn-and-authz-revisited-pt02/media/pomeranian.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg","srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/85aae/pomeranian.jpg 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/64308/pomeranian.jpg 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/123de/pomeranian.jpg 3648w","sizes":"(min-width: 3648px) 3648px, 100vw"},"sources":[{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/b1f04/pomeranian.avif 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/def07/pomeranian.avif 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/8a681/pomeranian.avif 3648w","type":"image/avif","sizes":"(min-width: 3648px) 3648px, 100vw"},{"srcSet":"/static/96a8473e2549fd33a3d6cc8b0d8f96be/fabd0/pomeranian.webp 912w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/d2b65/pomeranian.webp 1824w,\n/static/96a8473e2549fd33a3d6cc8b0d8f96be/99098/pomeranian.webp 3648w","type":"image/webp","sizes":"(min-width: 3648px) 3648px, 100vw"}]},"width":3648,"height":2736}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-08---meaning-of-z-in-shell-script/media/snow.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#181818","images":{"fallback":{"src":"/static/a987257fb708949394f663b920a257ca/7a5be/snow.jpg","srcSet":"/static/a987257fb708949394f663b920a257ca/de105/snow.jpg 1000w,\n/static/a987257fb708949394f663b920a257ca/643b0/snow.jpg 2000w,\n/static/a987257fb708949394f663b920a257ca/7a5be/snow.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/a987257fb708949394f663b920a257ca/0b70d/snow.avif 1000w,\n/static/a987257fb708949394f663b920a257ca/6172e/snow.avif 2000w,\n/static/a987257fb708949394f663b920a257ca/49453/snow.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/a987257fb708949394f663b920a257ca/85e35/snow.webp 1000w,\n/static/a987257fb708949394f663b920a257ca/5803e/snow.webp 2000w,\n/static/a987257fb708949394f663b920a257ca/dfbe4/snow.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/pages/about/media/me-at-the-cafe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#b8a898","images":{"fallback":{"src":"/static/12554c1a548e676cd9e72d76d2f6a606/68a6f/me-at-the-cafe.jpg","srcSet":"/static/12554c1a548e676cd9e72d76d2f6a606/dfcd4/me-at-the-cafe.jpg 1008w,\n/static/12554c1a548e676cd9e72d76d2f6a606/b97c6/me-at-the-cafe.jpg 2016w,\n/static/12554c1a548e676cd9e72d76d2f6a606/68a6f/me-at-the-cafe.jpg 4032w","sizes":"(min-width: 4032px) 4032px, 100vw"},"sources":[{"srcSet":"/static/12554c1a548e676cd9e72d76d2f6a606/55091/me-at-the-cafe.avif 1008w,\n/static/12554c1a548e676cd9e72d76d2f6a606/f9389/me-at-the-cafe.avif 2016w,\n/static/12554c1a548e676cd9e72d76d2f6a606/7af6b/me-at-the-cafe.avif 4032w","type":"image/avif","sizes":"(min-width: 4032px) 4032px, 100vw"},{"srcSet":"/static/12554c1a548e676cd9e72d76d2f6a606/80cfb/me-at-the-cafe.webp 1008w,\n/static/12554c1a548e676cd9e72d76d2f6a606/66d80/me-at-the-cafe.webp 2016w,\n/static/12554c1a548e676cd9e72d76d2f6a606/5cc0d/me-at-the-cafe.webp 4032w","type":"image/webp","sizes":"(min-width: 4032px) 4032px, 100vw"}]},"width":4032,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-10-10---why-should-i-put-eol-at-the-end-of-file/media/sarang-bang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#685848","images":{"fallback":{"src":"/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg","srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/de105/sarang-bang.jpg 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/643b0/sarang-bang.jpg 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/0b70d/sarang-bang.avif 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/6172e/sarang-bang.avif 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/49453/sarang-bang.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/85e35/sarang-bang.webp 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/5803e/sarang-bang.webp 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/dfbe4/sarang-bang.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2022-12-30---total-commander-101-pt01/media/sarang-bang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#685848","images":{"fallback":{"src":"/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg","srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/de105/sarang-bang.jpg 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/643b0/sarang-bang.jpg 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/0b70d/sarang-bang.avif 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/6172e/sarang-bang.avif 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/49453/sarang-bang.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/85e35/sarang-bang.webp 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/5803e/sarang-bang.webp 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/dfbe4/sarang-bang.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/tips/2023-01-02---total-commander-101-pt02/media/sarang-bang.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#685848","images":{"fallback":{"src":"/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg","srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/de105/sarang-bang.jpg 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/643b0/sarang-bang.jpg 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/7a5be/sarang-bang.jpg 4000w","sizes":"(min-width: 4000px) 4000px, 100vw"},"sources":[{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/0b70d/sarang-bang.avif 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/6172e/sarang-bang.avif 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/49453/sarang-bang.avif 4000w","type":"image/avif","sizes":"(min-width: 4000px) 4000px, 100vw"},{"srcSet":"/static/98add6ce99d4e33189fb97b2a5ddbc67/85e35/sarang-bang.webp 1000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/5803e/sarang-bang.webp 2000w,\n/static/98add6ce99d4e33189fb97b2a5ddbc67/dfbe4/sarang-bang.webp 4000w","type":"image/webp","sizes":"(min-width: 4000px) 4000px, 100vw"}]},"width":4000,"height":3000}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/data/2020-02-05---ksqldb-101-pt01/media/j1.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg","srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/4a00f/j1.jpg 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/facf2/j1.jpg 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0d964/j1.avif 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/fc319/j1.avif 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/759e3/j1.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0531b/j1.webp 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/dd848/j1.webp 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/95aac/j1.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/data/2020-02-06---ksqldb-101-pt02/media/j1.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg","srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/4a00f/j1.jpg 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/facf2/j1.jpg 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0d964/j1.avif 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/fc319/j1.avif 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/759e3/j1.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0531b/j1.webp 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/dd848/j1.webp 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/95aac/j1.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/devlog/data/2020-03-10---ksqldb-101-pt03/media/j1.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg","srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/4a00f/j1.jpg 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/facf2/j1.jpg 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/3fd2e/j1.jpg 3024w","sizes":"(min-width: 3024px) 3024px, 100vw"},"sources":[{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0d964/j1.avif 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/fc319/j1.avif 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/759e3/j1.avif 3024w","type":"image/avif","sizes":"(min-width: 3024px) 3024px, 100vw"},{"srcSet":"/static/06a6ac3882d79b0e2efd58e03fb2c3d0/0531b/j1.webp 756w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/dd848/j1.webp 1512w,\n/static/06a6ac3882d79b0e2efd58e03fb2c3d0/95aac/j1.webp 3024w","type":"image/webp","sizes":"(min-width: 3024px) 3024px, 100vw"}]},"width":3024,"height":3024}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-11---pt01-ch01/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch02/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-13---pt01-ch03/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-15---pt01-ch04/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-16---pt01-ch05/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-16---pt01-ch06/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-17---pt01-ch07/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-04-17---pt02-ch08/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-07---pt02-ch10/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-06---pt02-ch09/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-18---pt02-ch11/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}},{"node":{"absolutePath":"/home/runner/work/s3ich4n.github.io/s3ich4n.github.io/content/books/cosmic-python/2023-05-18---pt02-ch12/media/universe.jpg","childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#281828","images":{"fallback":{"src":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg","srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/38a9f/universe.jpg 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/fcc26/universe.jpg 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1cf53/universe.jpg 7857w","sizes":"(min-width: 7857px) 7857px, 100vw"},"sources":[{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/cf13d/universe.avif 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/1a63f/universe.avif 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/2f2ea/universe.avif 7857w","type":"image/avif","sizes":"(min-width: 7857px) 7857px, 100vw"},{"srcSet":"/static/66b1d3acbf31f0d2ad20eee928a14aaa/d9271/universe.webp 1964w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/f5f6a/universe.webp 3929w,\n/static/66b1d3acbf31f0d2ad20eee928a14aaa/90297/universe.webp 7857w","type":"image/webp","sizes":"(min-width: 7857px) 7857px, 100vw"}]},"width":7857,"height":7462}}}}]}}} \ No newline at end of file diff --git a/page-data/tag/geultto/page-data.json b/page-data/tag/geultto/page-data.json index f8cf7c84..94151270 100644 --- a/page-data/tag/geultto/page-data.json +++ b/page-data/tag/geultto/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/geultto","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/devlog/python/2024-10-13---python-container-101//devlog/python/2024-10-13-python-container-101-pt01","categorySlug":null},"frontmatter":{"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","date":"2024-10-13T03:00:00.000Z","category":null,"description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","slug":"/devlog/python/2024-10-13-python-container-101-pt01"}}}]}},"pageContext":{"group":"geultto","limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/tag/geultto","nextPagePath":"/tag/geultto/page/1","hasNextPage":false,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/geultto","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/devlog/python/2024-10-26---python-container-101-pt02//devlog/python/2024-10-26-python-container-101-pt02","categorySlug":null},"frontmatter":{"title":"[연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화","date":"2024-10-26T05:08:00.000Z","category":null,"description":"컨테이너 사이즈 최소화의 필요성과, 최소화 과정 중 파이썬 라이브러리 설치 과정에서의 최적화 제안(PEP 656)을 소개합니다.","slug":"/devlog/python/2024-10-26-python-container-101-pt02"}}},{"node":{"fields":{"slug":"/devlog/python/2024-10-13---python-container-101-pt01//devlog/python/2024-10-13-python-container-101-pt01","categorySlug":null},"frontmatter":{"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","date":"2024-10-13T03:00:00.000Z","category":null,"description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","slug":"/devlog/python/2024-10-13-python-container-101-pt01"}}}]}},"pageContext":{"group":"geultto","limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/tag/geultto","nextPagePath":"/tag/geultto/page/1","hasNextPage":false,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/tag/python/page-data.json b/page-data/tag/python/page-data.json index dbab98ef..a10b29d0 100644 --- a/page-data/tag/python/page-data.json +++ b/page-data/tag/python/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/python","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/devlog/python/2024-10-13---python-container-101//devlog/python/2024-10-13-python-container-101-pt01","categorySlug":null},"frontmatter":{"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","date":"2024-10-13T03:00:00.000Z","category":null,"description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","slug":"/devlog/python/2024-10-13-python-container-101-pt01"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-18---pt02-ch12//books/cosmic-python/2023-05-18-pt02-ch12","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (12)","date":"2023-05-18T17:44:06.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-18-pt02-ch12"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-18---pt02-ch11//books/cosmic-python/2023-05-18-pt02-ch10","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (11)","date":"2023-05-18T03:41:09.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-18-pt02-ch10"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-07---pt02-ch10//books/cosmic-python/2023-05-07-pt02-ch10","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (10)","date":"2023-05-07T18:41:36.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-07-pt02-ch10"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-06---pt02-ch09//books/cosmic-python/2023-05-06-pt02-ch09","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (9)","date":"2023-05-06T04:24:59.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-06-pt02-ch09"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-17---pt02-ch08//books/cosmic-python/2023-04-17-pt02-ch08","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (8)","date":"2023-04-17T19:22:59.001Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-17-pt02-ch08"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-17---pt01-ch07//books/cosmic-python/2023-04-17-pt01-ch07","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (7)","date":"2023-04-17T19:22:59.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-17-pt01-ch07"}}}]}},"pageContext":{"group":"python","limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/tag/python","nextPagePath":"/tag/python/page/1","hasNextPage":true,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/python","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/devlog/python/2024-10-26---python-container-101-pt02//devlog/python/2024-10-26-python-container-101-pt02","categorySlug":null},"frontmatter":{"title":"[연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화","date":"2024-10-26T05:08:00.000Z","category":null,"description":"컨테이너 사이즈 최소화의 필요성과, 최소화 과정 중 파이썬 라이브러리 설치 과정에서의 최적화 제안(PEP 656)을 소개합니다.","slug":"/devlog/python/2024-10-26-python-container-101-pt02"}}},{"node":{"fields":{"slug":"/devlog/python/2024-10-13---python-container-101-pt01//devlog/python/2024-10-13-python-container-101-pt01","categorySlug":null},"frontmatter":{"title":"[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해","date":"2024-10-13T03:00:00.000Z","category":null,"description":"컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.","slug":"/devlog/python/2024-10-13-python-container-101-pt01"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-18---pt02-ch12//books/cosmic-python/2023-05-18-pt02-ch12","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (12)","date":"2023-05-18T17:44:06.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-18-pt02-ch12"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-18---pt02-ch11//books/cosmic-python/2023-05-18-pt02-ch10","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (11)","date":"2023-05-18T03:41:09.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-18-pt02-ch10"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-07---pt02-ch10//books/cosmic-python/2023-05-07-pt02-ch10","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (10)","date":"2023-05-07T18:41:36.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-07-pt02-ch10"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-05-06---pt02-ch09//books/cosmic-python/2023-05-06-pt02-ch09","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (9)","date":"2023-05-06T04:24:59.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.","slug":"/books/cosmic-python/2023-05-06-pt02-ch09"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-17---pt02-ch08//books/cosmic-python/2023-04-17-pt02-ch08","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (8)","date":"2023-04-17T19:22:59.001Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-17-pt02-ch08"}}}]}},"pageContext":{"group":"python","limit":7,"offset":0,"pagination":{"currentPage":0,"prevPagePath":"/tag/python","nextPagePath":"/tag/python/page/1","hasNextPage":true,"hasPrevPage":false}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/tag/python/page/1/page-data.json b/page-data/tag/python/page/1/page-data.json index 61fe6368..cdf8715f 100644 --- a/page-data/tag/python/page/1/page-data.json +++ b/page-data/tag/python/page/1/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/python/page/1","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-16---pt01-ch06//books/cosmic-python/2023-04-16-pt01-ch06","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (6)","date":"2023-04-16T19:09:45.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-16-pt01-ch06"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-16---pt01-ch05//books/cosmic-python/2023-04-16-pt01-ch05","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (5)","date":"2023-04-16T03:26:01.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-16-pt01-ch05"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-15---pt01-ch04//books/cosmic-python/2023-04-15-pt01-ch04","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (4)","date":"2023-04-15T22:19:24.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-15-pt01-ch04"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-13---pt01-ch03//books/cosmic-python/2023-04-13-pt01-ch03","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (3)","date":"2023-04-13T22:51:20.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-13-pt01-ch03"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-13---pt01-ch02//books/cosmic-python/2023-04-13-pt01-ch02","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (2)","date":"2023-04-13T20:44:23.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-13-pt01-ch02"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-11---pt01-ch01//books/cosmic-python/2023-04-11-pt01-ch01","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (1)","date":"2023-04-11T17:55:00.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-11-pt01-ch01"}}},{"node":{"fields":{"slug":"/retrospect/2023-02-20---assignment-pt02//retrospect/2023-02-20-assignment-pt02","categorySlug":"/category/retrospect/"},"frontmatter":{"title":"2023년 과제형 코딩 테스트 후기 (2)","date":"2023-02-20T18:01:00.000Z","category":"retrospect","description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.","slug":"/retrospect/2023-02-20-assignment-pt02"}}}]}},"pageContext":{"group":"python","limit":7,"offset":7,"pagination":{"currentPage":1,"prevPagePath":"/tag/python","nextPagePath":"/tag/python/page/2","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/python/page/1","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-17---pt01-ch07//books/cosmic-python/2023-04-17-pt01-ch07","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (7)","date":"2023-04-17T19:22:59.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-17-pt01-ch07"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-16---pt01-ch06//books/cosmic-python/2023-04-16-pt01-ch06","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (6)","date":"2023-04-16T19:09:45.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-16-pt01-ch06"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-16---pt01-ch05//books/cosmic-python/2023-04-16-pt01-ch05","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (5)","date":"2023-04-16T03:26:01.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-16-pt01-ch05"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-15---pt01-ch04//books/cosmic-python/2023-04-15-pt01-ch04","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (4)","date":"2023-04-15T22:19:24.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-15-pt01-ch04"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-13---pt01-ch03//books/cosmic-python/2023-04-13-pt01-ch03","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (3)","date":"2023-04-13T22:51:20.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-13-pt01-ch03"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-13---pt01-ch02//books/cosmic-python/2023-04-13-pt01-ch02","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (2)","date":"2023-04-13T20:44:23.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-13-pt01-ch02"}}},{"node":{"fields":{"slug":"/books/cosmic-python/2023-04-11---pt01-ch01//books/cosmic-python/2023-04-11-pt01-ch01","categorySlug":"/category/books/"},"frontmatter":{"title":"파이썬으로 살펴보는 아키텍처 패턴 (1)","date":"2023-04-11T17:55:00.000Z","category":"books","description":"파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.","slug":"/books/cosmic-python/2023-04-11-pt01-ch01"}}}]}},"pageContext":{"group":"python","limit":7,"offset":7,"pagination":{"currentPage":1,"prevPagePath":"/tag/python","nextPagePath":"/tag/python/page/2","hasNextPage":true,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page-data/tag/python/page/2/page-data.json b/page-data/tag/python/page/2/page-data.json index bfc1f422..60ec7148 100644 --- a/page-data/tag/python/page/2/page-data.json +++ b/page-data/tag/python/page/2/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/python/page/2","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/retrospect/2023-02-20---assignment-pt01//retrospect/2023-02-20-assignment-pt01","categorySlug":"/category/retrospect/"},"frontmatter":{"title":"2023년 과제형 코딩 테스트 후기 (1)","date":"2023-02-20T16:38:00.000Z","category":"retrospect","description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.","slug":"/retrospect/2023-02-20-assignment-pt01"}}},{"node":{"fields":{"slug":"/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01//devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01","categorySlug":"/category/devlog/"},"frontmatter":{"title":"PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)","date":"2023-01-22T23:57:00.000Z","category":"devlog","description":"PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.","slug":"/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01"}}},{"node":{"fields":{"slug":"/devlog/python/2022-06-10---python-descriptor-described//devlog/python/2022-06-10-python-descriptor-described","categorySlug":"/category/devlog/"},"frontmatter":{"title":"Python의 디스크립터에 대해 (1): 이론","date":"2022-06-10T12:30:00.000Z","category":"devlog","description":"Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.","slug":"/devlog/python/2022-06-10-python-descriptor-described"}}},{"node":{"fields":{"slug":"/devlog/python/2022-06-09---python-classmethod-and-staticmethod//devlog/python/2022-06-09-python-classmethod-and-staticmethod","categorySlug":null},"frontmatter":{"title":"\"@classmethod\" 와 \"@staticmethod\"에 대해","date":"2022-06-09T10:30:00.000Z","category":null,"description":"Python의 \"@classmethod\" 와 \"@staticmethod\"에 대해","slug":"/devlog/python/2022-06-09-python-classmethod-and-staticmethod"}}}]}},"pageContext":{"group":"python","limit":7,"offset":14,"pagination":{"currentPage":2,"prevPagePath":"/tag/python/page/1","nextPagePath":"/tag/python/page/3","hasNextPage":false,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file +{"componentChunkName":"component---src-templates-tag-template-tag-template-tsx","path":"/tag/python/page/2","result":{"data":{"site":{"siteMetadata":{"title":"팔공산 창고","subtitle":"Non scholæ sed vitæ discimus."}},"allMarkdownRemark":{"edges":[{"node":{"fields":{"slug":"/retrospect/2023-02-20---assignment-pt02//retrospect/2023-02-20-assignment-pt02","categorySlug":"/category/retrospect/"},"frontmatter":{"title":"2023년 과제형 코딩 테스트 후기 (2)","date":"2023-02-20T18:01:00.000Z","category":"retrospect","description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.","slug":"/retrospect/2023-02-20-assignment-pt02"}}},{"node":{"fields":{"slug":"/retrospect/2023-02-20---assignment-pt01//retrospect/2023-02-20-assignment-pt01","categorySlug":"/category/retrospect/"},"frontmatter":{"title":"2023년 과제형 코딩 테스트 후기 (1)","date":"2023-02-20T16:38:00.000Z","category":"retrospect","description":"2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.","slug":"/retrospect/2023-02-20-assignment-pt01"}}},{"node":{"fields":{"slug":"/devlog/python/2023-01-22---probing-pep-333-3-wsgi-and-asgi-pt01//devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01","categorySlug":"/category/devlog/"},"frontmatter":{"title":"PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)","date":"2023-01-22T23:57:00.000Z","category":"devlog","description":"PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.","slug":"/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01"}}},{"node":{"fields":{"slug":"/devlog/python/2022-06-10---python-descriptor-described//devlog/python/2022-06-10-python-descriptor-described","categorySlug":"/category/devlog/"},"frontmatter":{"title":"Python의 디스크립터에 대해 (1): 이론","date":"2022-06-10T12:30:00.000Z","category":"devlog","description":"Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.","slug":"/devlog/python/2022-06-10-python-descriptor-described"}}},{"node":{"fields":{"slug":"/devlog/python/2022-06-09---python-classmethod-and-staticmethod//devlog/python/2022-06-09-python-classmethod-and-staticmethod","categorySlug":null},"frontmatter":{"title":"\"@classmethod\" 와 \"@staticmethod\"에 대해","date":"2022-06-09T10:30:00.000Z","category":null,"description":"Python의 \"@classmethod\" 와 \"@staticmethod\"에 대해","slug":"/devlog/python/2022-06-09-python-classmethod-and-staticmethod"}}}]}},"pageContext":{"group":"python","limit":7,"offset":14,"pagination":{"currentPage":2,"prevPagePath":"/tag/python/page/1","nextPagePath":"/tag/python/page/3","hasNextPage":false,"hasPrevPage":true}}},"staticQueryHashes":["251939775","357378587","401334301","63107425"]} \ No newline at end of file diff --git a/page/1/index.html b/page/1/index.html index 404c798d..dc7d1e52 100644 --- a/page/1/index.html +++ b/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    \ No newline at end of file +
    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/page/10/index.html b/page/10/index.html new file mode 100644 index 00000000..56a8a5cc --- /dev/null +++ b/page/10/index.html @@ -0,0 +1,81 @@ +Posts - Page 10 - 팔공산 창고 \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html index 9c455bd9..15efb23d 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    devlog

    서블릿부터 스프링 프레임워크까지

    PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    \ No newline at end of file +
    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    devlog

    서블릿부터 스프링 프레임워크까지

    PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 5ea5dd63..4f0f8345 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    \ No newline at end of file +
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index 3f86e7cd..da982c3b 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)

    PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    \ No newline at end of file +
    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)

    PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    \ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html index b803175b..624ae2ed 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    tips

    Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)

    Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.

    Read
    tips

    토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.

    Read
    tips

    토탈 커맨더 입문기 (1) 기본기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    \ No newline at end of file +
    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    tips

    Gatsby 블로그 이미지에 캡션을 추가하는 방법 (w/ gatsby-remark-images)

    Gatsby 블로그 이미지에 캡션을 추가하는 방법에 대해 빠르게 설명드립니다.

    Read
    tips

    토탈 커맨더 입문기 (2) 반디집을 사용한 압축하기/압축풀기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 반디집을 통해 압축하기/압축풀기를 하는 방법에 대해 살펴봅시다.

    Read
    tips

    토탈 커맨더 입문기 (1) 기본기

    OFM의 터줏대감 중 하나인 토탈 커맨더 입문기입니다. 기본적인 사용법에 대해 알아봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    \ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html index dd960254..171dd871 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    devlog

    인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기

    OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.

    Read
    \ No newline at end of file +
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    \ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html index c32cabc0..fe089d6b 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    devlog

    인가를 다시 살펴보다 (1) OAuth 2.0 개요와 프로토콜 소개

    API 서비스가 많이 나누어졌을 때, 인가에 대해 살펴보며 **인가** 에 사용되는 OAuth 2.0 스펙을 알아봅시다.

    Read
    tips

    제발 한국인이라면 파일 끝에 엔터 칩시다

    EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.

    Read
    tips

    Bash 스크립트의 문자열 비교에 대해 알아봅시다

    Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.

    Read
    devlog

    HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?

    JWT의 사용방안과, 세션 쿠키처럼 사용하는 JWT 토큰 사용방식이 과연 타당한 쓰임새인지 살펴봅시다.

    Read
    devlog

    HTTP의 인증에 대해 (1) 인증의 발전사

    HTTP 기본 스펙을 이용한 기초적 인증부터 쿠키와 세션을, 그리고 갑자기 들불처럼 등장한 JWT이 뭔지까지만 살펴봅니다.

    Read
    devlog

    Python의 디스크립터에 대해 (1): 이론

    Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.

    Read

    "@classmethod" 와 "@staticmethod"에 대해

    Python의 "@classmethod" 와 "@staticmethod"에 대해

    Read
    \ No newline at end of file +
    devlog

    인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기

    OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.

    Read
    devlog

    인가를 다시 살펴보다 (1) OAuth 2.0 개요와 프로토콜 소개

    API 서비스가 많이 나누어졌을 때, 인가에 대해 살펴보며 **인가** 에 사용되는 OAuth 2.0 스펙을 알아봅시다.

    Read
    tips

    제발 한국인이라면 파일 끝에 엔터 칩시다

    EOL을 왜 입력해야 하는지 알아보며, 개행문자에 대해 발생한 문제가 함께 떠올라 적절한 해결책을 알아보고자 조사하게 되었습니다.

    Read
    tips

    Bash 스크립트의 문자열 비교에 대해 알아봅시다

    Bash 스크립트를 작성하며 -z 라는 키워드에 대해 알게되었습니다. 더 나아가 쉘 스크립트에선 문자열을 어떻게 다루는지 살펴봅시다.

    Read
    devlog

    HTTP의 인증에 대해 (2) 인증으로 JWT를 쓰는게 맞나?

    JWT의 사용방안과, 세션 쿠키처럼 사용하는 JWT 토큰 사용방식이 과연 타당한 쓰임새인지 살펴봅시다.

    Read
    devlog

    HTTP의 인증에 대해 (1) 인증의 발전사

    HTTP 기본 스펙을 이용한 기초적 인증부터 쿠키와 세션을, 그리고 갑자기 들불처럼 등장한 JWT이 뭔지까지만 살펴봅니다.

    Read
    devlog

    Python의 디스크립터에 대해 (1): 이론

    Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.

    Read
    \ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html index 4f69f389..9074235b 100644 --- a/page/8/index.html +++ b/page/8/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    devlog

    시작부터 배포까지: 도커 패키징의 베스트케이스

    PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.

    Read
    tips

    아니 내 탭 어디감?

    우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...

    Read
    tips

    PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기

    매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.

    Read
    tips

    pre-commit hook, 나도 한번 써보자 (1)

    pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.

    Read
    tips

    간략히 써본 서버 점검 가이드

    서버 점검과 관련하여

    Read
    retrospect

    1년차 회고

    2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)

    Read
    devlog

    ksqlDB 101, part 3. 실전 예시: 오픈소스를 통해 살펴보는 실시간 보안 이벤트 탐지 룰

    ksqlDB을 활용한 오픈소스의 예시를 통해, 보안 이벤트를 실시간으로 걸러내는 방안에 대해 학습해보고 이를 토대로 어떤식으로 활용하면 좋을지 살펴봅시다.

    Read
    \ No newline at end of file +

    "@classmethod" 와 "@staticmethod"에 대해

    Python의 "@classmethod" 와 "@staticmethod"에 대해

    Read
    devlog

    시작부터 배포까지: 도커 패키징의 베스트케이스

    PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.

    Read
    tips

    아니 내 탭 어디감?

    우분투 환경에서 VSCode를 사용하던 시절에 뜬금없이 탭이 사라지는 일이 있었습니다. 해결책이 쉽습니다! 여러분들께서는 부디 헤메는 일이 없길 바랍니다...

    Read
    tips

    pre-commit hook, 나도 한번 써보자 (1)

    pre-commit hook 말만 들었지 실제로 써보지 못했는데, 이참에 써보고 팀원들에게 공유하기 위해 글을 씁니다. 제 1탄입니다.

    Read
    tips

    PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기

    매일 입력하는 파일 설명(시그니처)을 귀찮지 않게 커맨드 하나로 자동입력되게 하는 방안을 찾았습니다. 회사 팀원들과 주변사람들에게만 공유하기는 아까워서 짧은 글을 써봤습니다.

    Read
    tips

    간략히 써본 서버 점검 가이드

    서버 점검과 관련하여

    Read
    retrospect

    1년차 회고

    2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)

    Read
    \ No newline at end of file diff --git a/page/9/index.html b/page/9/index.html index fc2aed06..ce45fa39 100644 --- a/page/9/index.html +++ b/page/9/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -
    devlog

    ksqlDB 101, part 2. Kafka Streams에 대해

    ksqlDB의 내부 구조인 Apache Kafka의 Kafka Streams를 간략하게 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 1. 배경지식

    ksqlDB를 어느정도 이해하기 위해 필요한 기본지식을 설명하였습니다.

    Read
    tips

    Django 코드를 Jekyll에 작성할 때 Liquid syntax error가 뜬다면?

    Python 코드를 Jekyll에 작성 시, Liquid syntax error가 뜬다면?

    Read
    books

    실용주의 프로그래머 pt. 4

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 4

    Read
    books

    실용주의 프로그래머 pt. 3

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 3

    Read
    books

    실용주의 프로그래머 pt. 2

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 2

    Read
    books

    실용주의 프로그래머 pt. 1

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 1

    Read
    \ No newline at end of file +
    devlog

    ksqlDB 101, part 3. 실전 예시: 오픈소스를 통해 살펴보는 실시간 보안 이벤트 탐지 룰

    ksqlDB을 활용한 오픈소스의 예시를 통해, 보안 이벤트를 실시간으로 걸러내는 방안에 대해 학습해보고 이를 토대로 어떤식으로 활용하면 좋을지 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 2. Kafka Streams에 대해

    ksqlDB의 내부 구조인 Apache Kafka의 Kafka Streams를 간략하게 살펴봅시다.

    Read
    devlog

    ksqlDB 101, part 1. 배경지식

    ksqlDB를 어느정도 이해하기 위해 필요한 기본지식을 설명하였습니다.

    Read
    tips

    Django 코드를 Jekyll에 작성할 때 Liquid syntax error가 뜬다면?

    Python 코드를 Jekyll에 작성 시, Liquid syntax error가 뜬다면?

    Read
    books

    실용주의 프로그래머 pt. 4

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 4

    Read
    books

    실용주의 프로그래머 pt. 3

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 3

    Read
    books

    실용주의 프로그래머 pt. 2

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 2

    Read
    \ No newline at end of file diff --git a/pages/about/index.html b/pages/about/index.html index 789ac2fb..0afd5deb 100644 --- a/pages/about/index.html +++ b/pages/about/index.html @@ -155,4 +155,4 @@

    \ No newline at end of file +
    \ No newline at end of file diff --git a/pages/contacts/index.html b/pages/contacts/index.html index 2e47c5d7..da56fdad 100644 --- a/pages/contacts/index.html +++ b/pages/contacts/index.html @@ -80,4 +80,4 @@ }()
    \ No newline at end of file +
    \ No newline at end of file diff --git a/polyfill-d458e180ce0db2ade457.js b/polyfill-93be280e3dbf3699d675.js similarity index 99% rename from polyfill-d458e180ce0db2ade457.js rename to polyfill-93be280e3dbf3699d675.js index 8dd69a5e..4e4f9c75 100644 --- a/polyfill-d458e180ce0db2ade457.js +++ b/polyfill-93be280e3dbf3699d675.js @@ -1,2 +1,2 @@ -(self.webpackChunkgatsby_starter_lumen=self.webpackChunkgatsby_starter_lumen||[]).push([[920],{3534:function(t,e,r){("undefined"!=typeof window?window:void 0!==r.g?r.g:"undefined"!=typeof self?self:{}).SENTRY_RELEASE={id:"a9b71c208e7880aa8d5ea542cbb53e74f6f64ca0"}},8609:function(t,e,r){!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==r.g?r.g:"undefined"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var n=function(t){return t&&t.Math==Math&&t},o=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")(),i=function(t){try{return!!t()}catch(t){return!0}},a=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),u={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,s=c&&!u.call({1:2},1)?function(t){var e=c(this,t);return!!e&&e.enumerable}:u,f={f:s},l=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},h={}.toString,p=function(t){return h.call(t).slice(8,-1)},d="".split,v=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==p(t)?d.call(t,""):Object(t)}:Object,g=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},y=function(t){return v(g(t))},b=function(t){return"object"==typeof t?null!==t:"function"==typeof t},m=function(t,e){if(!b(t))return t;var r,n;if(e&&"function"==typeof(r=t.toString)&&!b(n=r.call(t)))return n;if("function"==typeof(r=t.valueOf)&&!b(n=r.call(t)))return n;if(!e&&"function"==typeof(r=t.toString)&&!b(n=r.call(t)))return n;throw TypeError("Can't convert object to primitive value")},E={}.hasOwnProperty,S=function(t,e){return E.call(t,e)},w=o.document,T=b(w)&&b(w.createElement),R=function(t){return T?w.createElement(t):{}},O=!a&&!i((function(){return 7!=Object.defineProperty(R("div"),"a",{get:function(){return 7}}).a})),x=Object.getOwnPropertyDescriptor,_={f:a?x:function(t,e){if(t=y(t),e=m(e,!0),O)try{return x(t,e)}catch(t){}if(S(t,e))return l(!f.f.call(t,e),t[e])}},A=function(t){if(!b(t))throw TypeError(String(t)+" is not an object");return t},I=Object.defineProperty,j={f:a?I:function(t,e,r){if(A(t),e=m(e,!0),A(r),O)try{return I(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},P=a?function(t,e,r){return j.f(t,e,l(1,r))}:function(t,e,r){return t[e]=r,t},M=function(t,e){try{P(o,t,e)}catch(n){o[t]=e}return e},N="__core-js_shared__",k=o[N]||M(N,{}),U=Function.toString;"function"!=typeof k.inspectSource&&(k.inspectSource=function(t){return U.call(t)});var L,D,C,F=k.inspectSource,B=o.WeakMap,W="function"==typeof B&&/native code/.test(F(B)),z=!1,G=e((function(t){(t.exports=function(t,e){return k[t]||(k[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.9.0",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),K=0,$=Math.random(),V=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++K+$).toString(36)},q=G("keys"),H=function(t){return q[t]||(q[t]=V(t))},Y={};if(W){var X=k.state||(k.state=new(0,o.WeakMap)),J=X.get,Q=X.has,Z=X.set;L=function(t,e){return e.facade=t,Z.call(X,t,e),e},D=function(t){return J.call(X,t)||{}},C=function(t){return Q.call(X,t)}}else{var tt=H("state");Y[tt]=!0,L=function(t,e){return e.facade=t,P(t,tt,e),e},D=function(t){return S(t,tt)?t[tt]:{}},C=function(t){return S(t,tt)}}var et,rt={set:L,get:D,has:C,enforce:function(t){return C(t)?D(t):L(t,{})},getterFor:function(t){return function(e){var r;if(!b(e)||(r=D(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},nt=e((function(t){var e=rt.get,r=rt.enforce,n=String(String).split("String");(t.exports=function(t,e,i,a){var u,c=!!a&&!!a.unsafe,s=!!a&&!!a.enumerable,f=!!a&&!!a.noTargetGet;"function"==typeof i&&("string"!=typeof e||S(i,"name")||P(i,"name",e),(u=r(i)).source||(u.source=n.join("string"==typeof e?e:""))),t!==o?(c?!f&&t[e]&&(s=!0):delete t[e],s?t[e]=i:P(t,e,i)):s?t[e]=i:M(e,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&e(this).source||F(this)}))})),ot=o,it=function(t){return"function"==typeof t?t:void 0},at=function(t,e){return arguments.length<2?it(ot[t])||it(o[t]):ot[t]&&ot[t][e]||o[t]&&o[t][e]},ut=Math.ceil,ct=Math.floor,st=function(t){return isNaN(t=+t)?0:(t>0?ct:ut)(t)},ft=Math.min,lt=function(t){return t>0?ft(st(t),9007199254740991):0},ht=Math.max,pt=Math.min,dt=function(t,e){var r=st(t);return r<0?ht(r+e,0):pt(r,e)},vt=function(t){return function(e,r,n){var o,i=y(e),a=lt(i.length),u=dt(n,a);if(t&&r!=r){for(;a>u;)if((o=i[u++])!=o)return!0}else for(;a>u;u++)if((t||u in i)&&i[u]===r)return t||u||0;return!t&&-1}},gt={includes:vt(!0),indexOf:vt(!1)},yt=gt.indexOf,bt=function(t,e){var r,n=y(t),o=0,i=[];for(r in n)!S(Y,r)&&S(n,r)&&i.push(r);for(;e.length>o;)S(n,r=e[o++])&&(~yt(i,r)||i.push(r));return i},mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Et=mt.concat("length","prototype"),St={f:Object.getOwnPropertyNames||function(t){return bt(t,Et)}},wt={f:Object.getOwnPropertySymbols},Tt=at("Reflect","ownKeys")||function(t){var e=St.f(A(t)),r=wt.f;return r?e.concat(r(t)):e},Rt=function(t,e){for(var r=Tt(e),n=j.f,o=_.f,i=0;i2?arguments[2]:void 0,u=Ut((void 0===a?n:dt(a,n))-i,n-o),c=1;for(i0;)i in r?r[o]=r[i]:delete r[o],o+=c,i+=c;return r},Dt=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())})),Ct=Dt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Ft=G("wks"),Bt=o.Symbol,Wt=Ct?Bt:Bt&&Bt.withoutSetter||V,zt=function(t){return S(Ft,t)||(Ft[t]=Dt&&S(Bt,t)?Bt[t]:Wt("Symbol."+t)),Ft[t]},Gt=Object.keys||function(t){return bt(t,mt)},Kt=a?Object.defineProperties:function(t,e){A(t);for(var r,n=Gt(e),o=n.length,i=0;o>i;)j.f(t,r=n[i++],e[r]);return t},$t=at("document","documentElement"),Vt=H("IE_PROTO"),qt=function(){},Ht=function(t){return" \ No newline at end of file +

    읽어주셔서 감사합니다.

    Published May 22, 2020

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/retrospect/2023-02-20-assignment-pt01/index.html b/retrospect/2023-02-20-assignment-pt01/index.html index 7b9b2c74..51bc968b 100644 --- a/retrospect/2023-02-20-assignment-pt01/index.html +++ b/retrospect/2023-02-20-assignment-pt01/index.html @@ -343,4 +343,4 @@

    늦게 회고하자면, 이 영상 을 함께 보았다면 더 좋았을 것입니다. 이벤트 스토밍을 통해 도메인 간의 유기적인 정보교환 뿐 아니라, 실제 업무를 수행하면서 나올 법한 행위를 수행할 수 있었음을 보여줄 수 있었을 것입니다.
  • 이 부분은 정확히 어떻게 설계할지 몰라서 다른 서비스들을 최대한 참고하였습니다. 도메인 객체가 이렇게 비대해지는 것을 어떻게 제어해야할지도 학습해야겠습니다.
  • -

    Published Feb 20, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 20, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/retrospect/2023-02-20-assignment-pt02/index.html b/retrospect/2023-02-20-assignment-pt02/index.html index 62c869f7..5ffe85a6 100644 --- a/retrospect/2023-02-20-assignment-pt02/index.html +++ b/retrospect/2023-02-20-assignment-pt02/index.html @@ -177,4 +177,4 @@

    이러한 사용례를 현업에서 사용한 바 있으나, 자주 보지않아 놓치게 되곤 합니다. 앞으로는 이런 사항을 토이프로젝트로 미리 구현해놓아야 하겠습니다. -

    Published Feb 20, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 20, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/retrospect/2024-09-17-geultto-10th-life-retrospect/index.html b/retrospect/2024-09-17-geultto-10th-life-retrospect/index.html index c36e0eed..4b688bec 100644 --- a/retrospect/2024-09-17-geultto-10th-life-retrospect/index.html +++ b/retrospect/2024-09-17-geultto-10th-life-retrospect/index.html @@ -97,4 +97,4 @@

    이어서, 기술검증에 대한 간단한 테스트가 실린 글을 자주 기고하고 싶습니다. 특정 상황에서 테스트한 결과를 보여주는 글을 통해, 필요한 내용을 자신이 직접 검증해보는 문화로 이어지는 작은 계기가 되었으면 합니다. 끝으로, 함께 일을하는 사람으로써 느꼈던 내용을 쓰려 합니다. 무슨 장소에 있든 결과를 내기 위해 때로는 의견이 맞지 않을 수 있지요. 하지만 이를 맞추어가며 함께 자라고 나아가는 과정을 꼭 공유하는 것이 목표입니다.

    늦은 밤까지 삶을 돌아볼 수 있게 되어 기쁩니다. 한 번은 이런 시기가 있었으면 했는데 좋은 계기로 진행해볼 수 있게 되어 매우 기쁩니다. 이 글에서 보인 의지가 끊어지지 않고 이어졌으면 좋겠습니다.

    -

    긴 글 읽어주셔서 감사합니다.

    Published Sep 17, 2024

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    긴 글 읽어주셔서 감사합니다.

    Published Sep 17, 2024

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/rss.xml b/rss.xml index 76d674b4..3d1b8bbe 100644 --- a/rss.xml +++ b/rss.xml @@ -1,125 +1,45 @@ -<![CDATA[팔공산 창고]]>http://github.com/dylang/node-rssGatsbyJSSat, 12 Oct 2024 18:21:38 GMT<![CDATA[[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해]]>https://blog.s3ich4n.me/devlog/python/2024-10-13-python-container-101-pt01https://blog.s3ich4n.me/devlog/python/2024-10-13-python-container-101-pt01Sun, 13 Oct 2024 03:00:00 GMT<p>이번 게시글에서는 컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너를 구성하기 위한 선택지를 살펴봅니다.</p> -<h2 id="컨테이너-기술" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B8%B0%EC%88%A0" aria-label="컨테이너 기술 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너 기술?</h2> -<p>요즘은 컨테이너로 서비스를 배포하는 것이 굉장히 일상적입니다. 각종 기고문 등에서도 컨테이너를 사용한 배포가 일상화 되어있고, 국내의 큰 회사도 100만개의 컨테이너가 동시에(!) 돌기도 한다고 합니다. 그렇다면 컨테이너가 어떤 것인지 먼저 살펴볼까요?</p> -<h3 id="컨테이너-이전에는" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9D%B4%EC%A0%84%EC%97%90%EB%8A%94" aria-label="컨테이너 이전에는 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너 이전에는…</h3> -<p>과거 서버를 구성할 때는 개발팀(Dev)의 개발 후 품질보증팀(QA), 보안팀(Infosec)의 검증을 거쳐서 운영팀(Ops)이 배포하는 흐름이었습니다. 이러한 개발 방식은 서비스를 기획하고 지속적으로 운영하며 여러 문제를 겪는데요. 첫 번째 문제는, 개발한 코드가 배포되기까지의 흐름이 너무 늦다는 것입니다.</p> -<p>우리는 배포에 가까워지며 버그를 패치할 때는 임시방편으로 일정을 맞추기 위한 코드를 짜죠. 이런 ‘기술 부채’들은 지속적으로 쌓이고, 언젠간 해결해야지 하는 방법으로 계속 때우는 것으론 한계가 발생합니다. 근본결함을 수정하기에는 문제 해결에 대한 시간이 너무 짧다는 것입니다.</p> -<p>두 번째 문제는 배포와 관리를 하기 위한 서버 관리 비용 또한 고려의 대상이라는 것입니다. 배포를 할 땐 서버 환경을 모두 알고 잘 구성해야 합니다. 하나라도 어긋나면 서버구동이 되지 않을 수 있습니다. 서버를 늘리고 줄이기 위해서는 물리 서버에 동일한 작업을 여러 번 반복하는 것 또한 일입니다.</p> -<p>이 두 가지 단점에 대해서는, 후술할 DevOps 개념과 컨테이너가 본격적으로 쓰이기 전인 2011년 IDC와 가트너(Gartner)는 전 세계 GDP의 약 3.1조 달러가 IT에 지출된다고 추정했습니다<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup>.</p> -<blockquote> -<p>🍎 tips</p> -<p>컨테이너가 등장하기 이전에도 이를 위한 많은 시도가 있었지만, 주제와 어긋나므로 과감히 생략합니다. 관련해서는 이 글<sup id="fnref-2"><a href="#fn-2" class="footnote-ref">2</a></sup>의 단락을 읽어주세요.</p> -</blockquote> -<h3 id="컨테이너-iac-devops-lets-go" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-iac-devops-lets-go" aria-label="컨테이너 iac devops lets go permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너, IaC, DevOps, let’s go</h3> -<p>컨테이너는 정말 쉽게 말하면, 어디서든 구동될 수 있는 서버 환경까지 고정하여 어디서든 동일하게 사용할 수 있도록 구성한 프로세스 입니다. 이게 구동되면 서버가 돌 수 있는 것이지요. 그런 컨테이너 기술로 널리 사용되는 것은 단연 Docker 입니다.</p> -<details> -<summary>(생략가능) Docker와 더 상세한 컨테이너 기술에 대한 정보는 여기에 정리했습니다.</summary> -<blockquote> -<p>🍎 tips</p> -<p>글의 방향을 이해하는 데는 크게 필요없지만, 만약 더 알아보시고 싶으시다면 이 내용을 참고해주세요.</p> -</blockquote> -<ul> -<li> -<p><strong>Docker의 역할과 발전</strong></p> -<ul> -<li>Docker는 컨테이너 기술을 대중화한 선구자 역할을 했습니다.</li> -<li>초기에는 자체적인 도커 엔진을 통해 컨테이너를 관리했습니다.</li> -<li>현재는 내부적으로 <code class="language-text">containerd</code>를 사용하여 컨테이너 런타임을 관리합니다.</li> -</ul> -</li> -<li> -<p><strong><code class="language-text">containerd</code>의 분리와 역할</strong></p> -<ul> -<li><code class="language-text">containerd</code>는 원래 도커 엔진의 핵심 컴포넌트였습니다.</li> -<li>2017년 CNCF(Cloud Native Computing Foundation)에 기부되어 독립 프로젝트가 되었습니다.</li> -<li>2019년 CNCF 졸업 프로젝트가 되었습니다.</li> -<li>컨테이너 이미지 관리, 실행, 네트워킹 등 컨테이너 생애주기 전반을 관리합니다.</li> -<li>Docker뿐만 아니라 쿠버네티스 등 다른 상위 레벨 시스템에서도 직접 사용될 수 있습니다.</li> -</ul> -</li> -<li> -<p><strong>OCI(Open Container Initiative)와 표준화</strong></p> -<ul> -<li>2015년 설립되어 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 개발합니다.</li> -<li>주요 표준: -<ul> -<li>런타임 명세 (runtime-spec)</li> -<li>이미지 명세 (image-spec)</li> -</ul> -</li> -<li>다양한 컨테이너 런타임이 호환성을 유지할 수 있게 합니다.</li> -</ul> -</li> -<li> -<p><strong>다른 주요 컨테이너 기술</strong></p> -<ul> -<li><code class="language-text">CRI-O</code>: 쿠버네티스를 위해 특별히 설계된 컨테이너 런타임입니다. Red Hat과 쿠버네티스 커뮤니티에 의해 개발되었습니다.</li> -<li><code class="language-text">rkt</code>: CoreOS에서 개발한 대안적인 컨테이너 런타임으로, 보안과 모듈성에 중점을 두었습니다. (현재는 개발 중단)</li> -<li><code class="language-text">LXC</code>: 리눅스 커널 수준의 컨테이너화 기술로, 운영 체제 수준의 가상화를 제공합니다.</li> -</ul> -</li> -<li> -<p><strong>컨테이너 기술의 최신 트렌드</strong></p> -<ul> -<li>마이크로서비스 아키텍처의 부상과 함께 컨테이너 기술의 중요성이 더욱 커졌습니다.</li> -<li>서버리스 컴퓨팅에서도 컨테이너 기술이 백엔드로 활용되고 있습니다.</li> -<li>쿠버네티스와 같은 오케스트레이션 도구의 발전으로 컨테이너 관리가 더욱 효율적으로 이루어지고 있습니다.</li> -</ul> -</li> -</ul> -</details> -<p>컨테이너 기술의 대두는 기존에 지적되어왔던 단점을 훌륭하게 해결해주었지요. 실행 당시의 환경을 별도로 격리시켜주고, 종속성을 유지할 수 있게 할 수 있지요. 이렇게 되면 아래와 같은 장점이 있습니다.</p> -<ul> -<li>개발환경과 운영환경 구성 시의 차이점을 최소화 할 수 있습니다.</li> -<li>다른 사람이 만든 “서버”를 쉽게 가져다 사용할 수 있습니다.</li> -<li>서버 가용성을 확장하기 위해 컨테이너를 한 서버/다른 서버 에서 동시에 구동하여 처리할 수도 있습니다.</li> -</ul> -<p>그리고 클라우드 컴퓨팅의 시대로 들어오며 이런 장점은 더욱 극대화 되기 시작했습니다. 기존에는 서버실 구성, 각종 배선작업 및 쿨링 시스템 구축을 거의 모든 회사가 직접 해야했으나, 원격지의 서버를 임대하여 사용할 수 있는 시스템이 등장함으로 인해 이런 컨테이너를 통한 장점이 더욱 극대화될 수 있는 환경마저 제공된 것이죠. 심지어는 이런 구성마저도 코드로 관리하여(IaC, Infrastructure as Code) 처리하는 접근법이 대두되기도 합니다.</p> -<p>이런 식으로 기존 개발 방식에서 개발팀(Dev)와 운영팀(Ops)의 역할 사이클을 한 번에 줄이고 보다 자주, 그리고 견고하게 배포하도록 하는 과정이 DevOps의 일부라고 할 수 있겠습니다.</p> -<blockquote> -<p>이 이상의 DevOps와 IaC에 대한 내용은 본 주제와 어긋날 수 있으니 과감히 생략하겠습니다.</p> -<p>만일 알아보시고 싶으시다면 제가 <a href="https://velog.io/@s3ich4n/series/2022%EB%85%84-Terraform-%EC%8A%A4%ED%84%B0%EB%94%94" target="_blank" rel="nofollow noopener noreferrer">기존에 작성한 글타래</a>를 살펴봐주시면 감사하겠습니다. 🙇</p> -</blockquote> -<h2 id="파이썬-컨테이너에-대해-알아봅시다" style="position:relative;"><a href="#%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4" aria-label="파이썬 컨테이너에 대해 알아봅시다 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>파이썬 컨테이너에 대해 알아봅시다</h2> -<p>그렇다면, 파이썬 컨테이너에 대해 살펴볼까요. 컨테이너는 앞서 언급했듯 어디서든 구동될 수 있는 서버 환경을 구성할 수 있습니다.</p> -<h3 id="파이썬-컨테이너-살펴보기" style="position:relative;"><a href="#%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0" aria-label="파이썬 컨테이너 살펴보기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>파이썬 컨테이너 살펴보기</h3> -<p>저희가 살펴볼 파이썬 컨테이너는 <a href="https://hub.docker.com/_/python" target="_blank" rel="nofollow noopener noreferrer">Docker Hub에서 확인</a>할 수 있습니다. 사이트에 접속해서 어떤 내용이 있나 살펴보죠.</p> +<![CDATA[팔공산 창고]]>http://github.com/dylang/node-rssGatsbyJSFri, 25 Oct 2024 20:24:49 GMT<![CDATA[[연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화]]>https://blog.s3ich4n.me/devlog/python/2024-10-26-python-container-101-pt02https://blog.s3ich4n.me/devlog/python/2024-10-26-python-container-101-pt02Sat, 26 Oct 2024 05:08:00 GMT<p>이번 게시글에서는 컨테이너 크기를 줄이기 위한 방안을 살펴보고, 파이썬 컨테이너 이미지 빌드가 가지는 특징을 살펴보도록 하겠습니다.</p> +<h2 id="빌드-최적화를-해봅시다" style="position:relative;"><a href="#%EB%B9%8C%EB%93%9C-%EC%B5%9C%EC%A0%81%ED%99%94%EB%A5%BC-%ED%95%B4%EB%B4%85%EC%8B%9C%EB%8B%A4" aria-label="빌드 최적화를 해봅시다 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>빌드 최적화를 해봅시다</h2> +<p>지난 글에서 빌드된 이미지의 크기를 다시 살펴볼까요?</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">docker</span> images python-hello +REPOSITORY TAG IMAGE ID CREATED SIZE +python-hello latest 746136719e90 <span class="token number">3</span> minutes ago <span class="token number">1</span>.46GB</code></pre></div> +<p>1.46GB인 데는 분명 이유가 있을 겁니다. 그러면 <code class="language-text">latest</code> 라는 태그가 무엇을 의미하는지부터 살펴볼까요?</p> +<h3 id="잠시만-왜-이렇게-크지" style="position:relative;"><a href="#%EC%9E%A0%EC%8B%9C%EB%A7%8C-%EC%99%9C-%EC%9D%B4%EB%A0%87%EA%B2%8C-%ED%81%AC%EC%A7%80" aria-label="잠시만 왜 이렇게 크지 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>잠시만, 왜 이렇게 크지?</h3> +<p><a href="https://hub.docker.com/_/python" target="_blank" rel="nofollow noopener noreferrer">Docker Hub</a>으로 다시 들어가봐서, 어떤 컨테이너가 있나 살펴봅시다.</p> +<p>뭔가 되게 많군요. 숫자는 파이썬 버전같은데, <code class="language-text">-</code> 뒤의 값은 뭔지 알아봅시다.</p> <p><figure class="gatsby-resp-image-figure" style=""> <span class="gatsby-resp-image-wrapper" - style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; " + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 466px; " > <a class="gatsby-resp-image-link" - href="/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d74fe/01-python-container-simple.png" + href="/static/13c8ea80289a195a226aad717c67eb86/fc1a1/01-python-container-simple.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" - style="padding-bottom: 143.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEXUlEQVRIx41WSXLkNhDs84TUzZ0ACYIAd/a+qLWPJVlyzDhifPDB/39KOqrY24x88KFEEAALWZmVaI3un1/x8f0Hnl7e8frxHS/v3/D6/g27uyfcPb3g8bff8fD1jffQ2tsff6Js57hyIzhh8ilGi+0tf7S9e0K/2GC+3uPu+RXrm3v89fc/eHr9QNHOMV3doOwWHEIVGPuCE0wOiSaB5BjFykBmFrpsIJSBHyeQukCc5nh4fsFyu8e1G+LLxMeVE3CM/RhOKOEEYggaHxGaqoOrl7hKFxirJVy7h5Nv4JotviRznvfLW/jFDr7dwS/2/PTyFTyzhV/cItItnGBIOsqrDqZZQtdLZNUcnizgCsNBY09aOMJ8jvj4zOFE6VAyJVzvH/D88o7V7haPX9/gCzWUFAhM/ncM/BHK0ZUXs2JXboxrLz6RPBCd/KeSv65NDuVyQi9OESQGsW4gTYesXvDTjTOEqkJip1DVHJEq4UuDxPa8x08MoqxiquK8g5PUQ0I3SuFLjVCViLMKsa75o7SYIkgtPJHzhyJvIU3La0FiOTnN+TI/ISTUI+IgLWaolo+Q1QZR1iBrt8i7HVS9QqhqRLpDUi6g6jWkpYMqSDvjdY8Sm56BcB/SH09ohFkNRxQnTkiYEzc8JzChZj6hGYSgCocGT7kfTyVHqoLQNdJyhsSeOSQ+VTlDnJVcKpVM72FimQpqNSr9gsMEYWoh8o4X4rxlIbJqwUJQSWHW8NrAY8ciegcOieOhzQ59SLBpQZFaumFxaKyq5SBM1sBNSi7NjRUjP5bpRorHP7UNlyw0oqzmxJSEnlQOnS5Nj9T2SIopj4O04Kcq5xxEwyXXI7o1qLR6eQ/VbBGZOfzEcm+ResQpvQfE8em9YH5VteADfkpIf1hlVbFviRvvqBxvHCrwRMZzBMCLM5771SncNjSIUgvdrKDrBfMniiU7wY019yUJQTQQv3T40VVEE3F62WIj6h1PDB8GquamJaREOCEhhDS+RMRixIpR0x76nhJPjm0jdIW8XbNH03KOcraHnd7AdFtk9Qq6WcP2O+TNisVJyFmLO96Xtxtep/nBKb5gAcx0D1nMMRYln0YKU8kUTpRxkDiEhjzrEipxWKM9Z4QpAnbKcDkkpmHHEK+RKriJU9sdhNE8L2lPVvF4cND5gmCE0vaMji4B3W5h+j1Us0FarSCLBY/JQXQh5P0euruBqjdI6zUHXRqOrC68LKgNckaTmJaR0WmBzBmtzOuhgWOLay8aVD3EmN69iJOdRKE7jfzKnrVTyGLGTXxUPTb94YpqIXTDLUXl050YcJOXl20zJBSmY9vFds6JiRtqjWPjE3rmTNfnhOSgxCK8cMvBKTn8tGJEpDhtGAeSEdC1RmLRoePI4Nq9LHm4I08/+meVc05C3BGHRx6HuZKvfuKS/Ex72Yb0Mxp+/qEauYeS/KSEn5ZsJ7ab7Rkh9WFA87o5WK5n3zvCnm7vy/9t/gW2CgNi6YDu5gAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + style="padding-bottom: 143.33333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAACXBIWXMAABYlAAAWJQFJUiTwAAAE6ElEQVRIx41WW3ubSAz1626TmPttYIABDNgYMI5vceMm6SZpsl///885uxKO225f9kEeNBfNkXSk8WR/POHb+3d8eXrG0/M3/j49fMWXpxfs7k7YHj7j4esLz//1+o7X9+9o+ltcGy40O/hNJot+zQcOnx/Q9Gusd3fYHU+gi+gwSbno0A5bzNsB1XIFEee4MX02MD0bmlo+y8QRCcK0QFJUELGCF8aQagYniLDZHXB6eIJmufjjWsenqclyYzjQbQ+adRbb/4GwqOaw1Rqf5B7XcgNNHaGpO+jqDldygz/FGkZxgpntYdJYnGBkB+jJBkZ2hJ4d4aQdDGdEOUnyEsmsRVj0iMsBZjiD5ufQg4LFEAU0nyTj+Yt42WXU3fji9qS/3eH59Q3dsMHLtzcEMsWVbrMrU9P9f0J7LZ9dn1wZLq50Bzemy5kzHAHTDaE7AroTXHTDFYyCvk0v5DX9spfiJzhBE5q0ggROXCHIlohmHcK8heaEsMICYdEhqQd46Rw3loDIGshqBTepYQYp4nrN54ywxtQWmNCttkjh5z1EMSCsNpD1FqrZQ+QdzKiEnw+IqlvIao14sUdQrGAEGWS9gavGyz88mJCrgVqg3PyFaH6ElzZImgOy7h5Ze4Qbz+EkC0TVFklzx0Zpj5d1rNuyhKcaiHw5uqxZPkw/QThbwYpqGG7EcmMF7ILB8QuhuyGm1hi3UY84buN6BM2NzzGkQHsRzLCArxZsWBQdNFfCikoEeQdZDewFzX3oXlLDEhkjDrIGuqj4ggml2o1ogWK0QbLYIWvvUHRHyFkPW1YQ5ZbX43pcJ87qXsqxDrL2XIbn0puaHryk4gATCro1KteIygFxtWaDTOCfyuuDxBfd+lHX7DLRhm6KqwF5u2MkMVEjrtgltdggXWyRLjbw0xqypH17qGaHMG9AoC61TFm2hMJ8/wrVP8DLb2H4Kdx0eY7XGnZUwhQFPNWe9RnHlzzxVfMLWs4yZclPSthhDjPIYHkhDC/iDZRFy49hBTEnTzsn8UOn7P/SDyk2TphBdSdkqwfmn5jfM7+IvG7aIJwR6Xv+NgMFXy0RlStGbIqcXb70Q/ohbrlyBiea8Wj4im/TnfA8CthBckkGob/w0Rm9+UDKLgeqRjE8olw/Qs73aA5vWBzeUG6fka0ekQ9PqLYvyPt7qOURYb1Dc3xHc/wb5eYZxfDE8dddOSbFiefI+gfm2LVbQHMTTozuJSxcBY7k+NL8teH9tDau6376gzb0DARpDaHmSMoWSbmESEsWLy5Y9+MCpi8hVMW6LBaXPUEyw80504yQSi5a3MFOW8TtCdnwxGPUfIaoD5DLE8RsgJv1yG+fkfaPkMt7RM0oSXeCEc4/Si9gWjhRDk8WkMUSUd5wkCn79J2UHdNq6mW4MVx+pKhLE5ixMTsXLrJB04/hpi2cpGEkYrZmUpNuyTn3Q+qBnlpyeRITqNsQwe2o4NKlbDNtiIeEMJoN3H3HptkhUHNuvOxBoNgDQkl9jzqN7sVwZMlGqRx/MUgI7aTh7utnLbd36iBEYqpnOkAGr+0YV5qNa93mx4lc/81l/RxDgu3FFaKihSx7ePEMblwymvGdWcKRNZxQ8X7NS3/7G3JGOMbQjhewZA0/6+DnHcJyzQaJaxRLX7UQec/z9CjxW/3fNvYvwn8A+TEY7RVYJ8oAAAAASUVORK5CYII='); background-size: cover; display: block;" ></span> <picture> <source - srcset="/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ac56/01-python-container-simple.webp 240w, -/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d3be9/01-python-container-simple.webp 480w, -/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e46b2/01-python-container-simple.webp 960w, -/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/4b3db/01-python-container-simple.webp 1164w" - sizes="(max-width: 960px) 100vw, 960px" + srcset="/static/13c8ea80289a195a226aad717c67eb86/8ac56/01-python-container-simple.webp 240w, +/static/13c8ea80289a195a226aad717c67eb86/fbab0/01-python-container-simple.webp 466w" + sizes="(max-width: 466px) 100vw, 466px" type="image/webp" /> <source - srcset="/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ff5a/01-python-container-simple.png 240w, -/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e85cb/01-python-container-simple.png 480w, -/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9199/01-python-container-simple.png 960w, -/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d74fe/01-python-container-simple.png 1164w" - sizes="(max-width: 960px) 100vw, 960px" + srcset="/static/13c8ea80289a195a226aad717c67eb86/8ff5a/01-python-container-simple.png 240w, +/static/13c8ea80289a195a226aad717c67eb86/fc1a1/01-python-container-simple.png 466w" + sizes="(max-width: 466px) 100vw, 466px" type="image/png" /> <img class="gatsby-resp-image-image" - src="/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9199/01-python-container-simple.png" + src="/static/13c8ea80289a195a226aad717c67eb86/fc1a1/01-python-container-simple.png" alt="Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)" title="Figure 1. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)" loading="lazy" @@ -134,41 +54,39 @@ <p><figure class="gatsby-resp-image-figure" style=""> <span class="gatsby-resp-image-wrapper" - style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; " + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; " > <a class="gatsby-resp-image-link" - href="/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c83ae/02-python-container-shared.png" + href="/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/fcda8/02-python-container-shared.png" style="display: block" target="_blank" rel="noopener" > <span class="gatsby-resp-image-background-image" - style="padding-bottom: 107.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAABYlAAAWJQFJUiTwAAACpklEQVQ4y4VUSXLbMBDkB2xuIPaFABdtVuWQg1MVH/L/T3UKQ1GiZCk5gABBoNkz0z3F5+8/+PX1Bz8/v2hmyqFkClWnv41X+9tR+LRDGA8w/YRxf0bNDV0s2QLwTmt1BfsfaPHWCLy3AnWn8VZzmhtuUHUKjTDg2j+//AK4yIxaacGUR6s8mA7oTESnezATwU1cmF3YPbJ9ZFzkjQXUo7MDVL+HTkeYdEBrZ1TCE9uVeU3szWuGK2AjHFodCZS7CTLsIPxEa+5mdHaEGY7gfkYlEyomLyD3uSXA/GemArjbQcUjzHCGm35Apw96F2EPM3xA9CeUMhJYuaaBwG4qKLZ52eZjCU1fK1535r4gdPY2Xxnmi8L2MGGg4dKMLCXa60foMFCllYuwcYIJI6Tt6Ts3gZSwSu0acqcDlE+QNtJB6SJVPb9rAoh0WblE+xV3L2VUrMg1t2h1ogLknOl0gvA7dHZC55aR9zqXixJRrnl8kNFNNsrTJdkvYHY8U0FkfyBgM5zAwxGl6G8V3uT8GvJdER4OfCvYE4CnTmHSUVOgdXaL8pSCahXxY5PYsPu3U8wAbkfoeISOe3JKyT3KViw5a+WVafmC5QVQoxEWrerJLdyNi0vsQM7JLmFmoJ9k52SnlJc8bkV9c4qw5JTOJAg3wg4nhPkMk47Q/Q4yzDBpD5VOqNXwLQ1bpsUaQg67lj0qEWhuVKS5lpHWWVL52xszeKeWJ2k8dp6lfeVwhaGRRS1MAJMWnXJouCaZtJfeuH7PQuc6UBe6y2F+LCF76oHSDbBpD5f2MP0M6UcIm2iEcUlBa0ayXL73PGQCdXSw1SO5gfsdmJ3AzET7+Z2HA+Ww7OxS9SfNdiObpR8yk5YmGw+Xnjhf+uNMPyizj6+9UN9VOjP8C74dNHFggjZTAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + style="padding-bottom: 107.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC1klEQVQ4y41V7XKjOBD0CySAQehbCIHAENvx5urux27tVu29/zv1lQZw7MS5ux9TIwk0zHRPD7vvP3/jx6/f+Ov7T/z49TcqaZFVEjlTn+yr81vbNd0BbZxgfMQwn1HUmi5u9lyK6/r/BN097Tld2nONp6LGvta0LphCKQy48SjqD5km/0XgXcqoFBa19qhUi9oEcNuTZ6YDt92ambrLPGPqLvNrwHSQMihlA94coLsTbHyFi2dU9oC8dijY8g5lXmvkTH+d4TWgcKhMBHcjpJ+gwgtkO0H6GcLP4M0EN15onYkOeSUeErYG1KiUh/Av0P0r3OEP+OlPmOEb7WU4wY1vEN0rMh4oWLbBcBMs+d2Cg3gHuzZkBbdU2nJJX/dLRvLdPrBPpEgX4LoRrhvQDjPCMEO5gKYf4cIAYTyM7+DjRO+ppoN0HYQN1Al7bu5L5qaF9hGq6Sm49j1q3dBFG9YANsD4Hkw1yGv7mZDbgGmTSqrMCO5fCDMTLxDtEXWTCFksnaV9JgLB9LF1rhgSKdQ2M1Rqm+GC5vAGE1+h+zNke4Qbv0G0Jzxzj7zid1ndYbgdJByST8EX+al3WxndCPlPpVTSEWapcZNnukFBbOsbZh9L71+U4lC7EcJPVKrtTyjtAVltkZX1glnJlxa7kd5jpaSSV6UwEymobGeSIm9G8uljNp7A/XSnlA2Ku7ZJ+DHlwd0A6Q/w4wVhfoMbzjD9ETrMcMMJOl5QqH6F4vGc3G20J8z2qkMuAvaqR6kj+W1dmQG5aPFUKjztaxp526zMb9pnJcWCSYtKGGhq4pb2XDuUNBsFmDQQ1i/PXUsqEbb9NCt3W8sw5cBtgPIDmniEH46w3QTdjpBNJAuHM0w3ozSRJJfm6MOS85UU5iZUbgL3R2pi1ryAuZlMhBN4e0ahIjJmkD34NdwpZZuHzA7Q3REmnteZOBPrac3siGdmH8zC95L/ATI2OhhUfcsaAAAAAElFTkSuQmCC'); background-size: cover; display: block;" ></span> <picture> <source - srcset="/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ac56/02-python-container-shared.webp 240w, -/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d3be9/02-python-container-shared.webp 480w, -/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e46b2/02-python-container-shared.webp 960w, -/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/2baf0/02-python-container-shared.webp 1180w" - sizes="(max-width: 960px) 100vw, 960px" + srcset="/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ac56/02-python-container-shared.webp 240w, +/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/d3be9/02-python-container-shared.webp 480w, +/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/5ca24/02-python-container-shared.webp 590w" + sizes="(max-width: 590px) 100vw, 590px" type="image/webp" /> <source - srcset="/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ff5a/02-python-container-shared.png 240w, -/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e85cb/02-python-container-shared.png 480w, -/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d9199/02-python-container-shared.png 960w, -/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c83ae/02-python-container-shared.png 1180w" - sizes="(max-width: 960px) 100vw, 960px" + srcset="/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ff5a/02-python-container-shared.png 240w, +/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e85cb/02-python-container-shared.png 480w, +/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/fcda8/02-python-container-shared.png 590w" + sizes="(max-width: 590px) 100vw, 590px" type="image/png" /> <img class="gatsby-resp-image-image" - src="/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d9199/02-python-container-shared.png" - alt="Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)" - title="Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)" + src="/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/fcda8/02-python-container-shared.png" + alt="Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (shared tags)" + title="Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (shared tags)" loading="lazy" decoding="async" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" @@ -176,66 +94,616 @@ </picture> </a> </span> - <figcaption class="gatsby-resp-image-figcaption"><p>Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (simple tags)</p></figcaption> + <figcaption class="gatsby-resp-image-figcaption"><p>Figure 2. 어떤 파이썬 컨테이너가 있나 살펴봅시다 (shared tags)</p></figcaption> </figure></p> -<p>뭔가 되게 많군요. 숫자는 파이썬 버전같은데, <code class="language-text">-</code> 뒤의 값은 뭔지 알아봅시다. 각각 Simple tags, Shared tags 인데요. 이 값은 아래와 같습니다.</p> +<p>이 값들은 각각 Simple tags, Shared tags 인데요. 이 값은 아래와 같습니다.</p> <ul> <li> -<p><code class="language-text">simple tags</code>: 기재된 리눅스 혹은 윈도우즈에서만 동작을 보장하는 컨테이너 이미지임을 의미합니다. 이 값을 사용하면 해당 태그에 명시된 플랫폼(리눅스나 윈도우즈 등)의 하나의 매니페스트에 연결됩니다. 이 경우, 명확히 지정한 플랫폼의 이미지만 사용할 수 있습니다.</p> +<p><code class="language-text">simple tags</code>: 태그로 기재된 리눅스 배포판 혹은 윈도우즈에서만 동작을 보장하는 컨테이너 이미지 입니다. 이 값을 사용하면 해당 태그에 명시된 플랫폼(리눅스나 윈도우즈 등)의 하나의 이미지 정보(이미지의 구성 정보, 레이어 정보, 실행 환경 등을 담은 매니페스트)에 연결됩니다. 이 경우, 명확히 지정한 플랫폼의 이미지만 사용할 수 있습니다.</p> </li> <li> <p><code class="language-text">shared tags</code>: 여러 운영체제(리눅스 및 다양한 윈도우즈 버전)와 아키텍처에서 동작하는 컨테이너 이미지를 나타냅니다. 이 값을 Docker Engine이 구동되는 환경(운영체제, 아키텍처 등)에 맞는 적절한 이미지를 자동으로 선택해서 pull하게 됩니다. 예를 들어, mongo:4.0 같은 shared tag를 사용하면 Docker Engine이 현재 실행 중인 호스트의 운영체제와 아키텍처에 맞는 이미지를 알아서 가져옵니다.</p> </li> </ul> -<h3 id="헬로-글또" style="position:relative;"><a href="#%ED%97%AC%EB%A1%9C-%EA%B8%80%EB%98%90" aria-label="헬로 글또 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>헬로 글또!</h3> -<p>그렇다면, shared tags를 사용해서 헬로월드를 출력하는 도커 이미지를 만들어봅시다.</p> +<details> +<summary>🤔 도커의 매니페스트란?</summary> +<p>도커 매니페스트는 컨테이너 이미지에 대한 상세 정보를 담고 있는 메타데이터입니다. 여기에는:</p> +<ul> +<li>이미지가 실행될 수 있는 운영체제와 아키텍처</li> +<li>이미지를 구성하는 레이어들의 정보</li> +<li>이미지의 설정값 (환경 변수, 실행 명령어 등)</li> +</ul> +<p>등이 포함됩니다. 도커는 이 매니페스트를 읽어 해당 이미지가 현재 환경에서 실행 가능한지, 어떤 레이어들이 필요한지 등을 파악합니다.</p> +</details> +<h3 id="그럼-어떻게-하죠" style="position:relative;"><a href="#%EA%B7%B8%EB%9F%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%98%EC%A3%A0" aria-label="그럼 어떻게 하죠 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>그럼 어떻게 하죠?</h3> +<p>도커 이미지 크기를 줄이기 위해서는 아래와 같은 과정을 처리할 수 있습니다.</p> +<ul> +<li>가능하면 가벼운 베이스 이미지를 선택할 것</li> +<li>멀티-스테이지를 사용해서, 빌드-런타임 환경을 분리할 것</li> +<li>다양한 최적화 방안을 고려해보기 +<ul> +<li><code class="language-text">.dockerignore</code> 파일 작성</li> +<li><code class="language-text">RUN</code> 레이어 최적화</li> +<li>나에게 맞는 패키지<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup>/파일을 취사선택하기</li> +</ul> +</li> +</ul> +<h3 id="step-1-simple-tag를-골라봅시다" style="position:relative;"><a href="#step-1-simple-tag%EB%A5%BC-%EA%B3%A8%EB%9D%BC%EB%B4%85%EC%8B%9C%EB%8B%A4" aria-label="step 1 simple tag를 골라봅시다 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>step 1. simple tag를 골라봅시다</h3> +<p>앞서 말씀드린 <code class="language-text">latest</code> 는 shared tags 입니다. 구동하려는 호스트에 맞게 구동될 수는 있지만, 최적화는 다른 문제죠. 이럴 땐 최소한의 내용만을 컨테이너를 통한 배포를 수행할 때는 최소한의 내용만 맞추고 배포하는 것이 보다 나은 접근입니다.</p> +<p>대표적인 베이스 이미지는 <code class="language-text">Debian linux</code> 기반의 <code class="language-text">slim</code> 과 <code class="language-text">Alpine linux</code> 기반의 <code class="language-text">alpine</code>이 있습니다.</p> +<ul> +<li>slim 이미지는, +<ul> +<li>Debian linux의 최소화 버전이며</li> +<li>필수적인 시스템 라이브러리를 갖추고 있습니다</li> +<li>C 라이브러리 구현체로 <code class="language-text">glibc</code> 를 사용합니다. 이는 거의 대부분의 라이브러리와 호환됩니다.</li> +</ul> +</li> +<li>alpine 이미지는, +<ul> +<li>Alpine linux에 대한 최소한의 버전이며</li> +<li>필수적인 시스템 라이브러리로 <code class="language-text">busybox</code> 를 이용합니다</li> +<li>C 라이브러리 구현체로 <code class="language-text">musl</code> libc를 사용합니다. 경량버전의 라이브러리를 추구하는 것이 목표이므로, 일부 라이브러리와 호환되지 않을 수도 있습니다.</li> +</ul> +</li> +</ul> +<p>그러면 이 둘을 사용해서 각각 빌드해볼까요?</p> +<details> +<summary>👨‍💻 `slim` 빌드를 해봅시다. </summary> +<ol> +<li><code class="language-text">Dockerfile</code> 을 제작합니다.</li> +</ol> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token instruction"><span class="token keyword">FROM</span> python:3.12-slim # slim은 Debian slim 이미지를 의미합니다.</span> +<span class="token instruction"><span class="token keyword">WORKDIR</span> /app</span> +<span class="token instruction"><span class="token keyword">COPY</span> hello.py .</span> +<span class="token instruction"><span class="token keyword">CMD</span> [<span class="token string">"python"</span>, <span class="token string">"hello.py"</span>]</span></code></pre></div> +<ol start="2"> +<li>빌드를 동일하게 해보고,</li> +</ol> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">ocker build <span class="token parameter variable">-t</span> python-hello:slim <span class="token builtin class-name">.</span></code></pre></div> +<ol start="3"> +<li>사이즈를 확인해볼까요?</li> +</ol> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> images +REPOSITORY TAG IMAGE ID CREATED SIZE +python-hello slim 2f648897463c <span class="token number">5</span> seconds ago 212MB +python-hello latest 746136719e90 <span class="token number">12</span> days ago <span class="token number">1</span>.46GB</code></pre></div> +</details> +<details> +<summary>👨‍💻 `alpine` 빌드를 해봅시다. </summary> +<ol> +<li><code class="language-text">Dockerfile</code> 을 제작합니다.</li> +</ol> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token instruction"><span class="token keyword">FROM</span> python:3.12-alpine # alpine은 Alpine 이미지를 의미합니다.</span> +<span class="token instruction"><span class="token keyword">WORKDIR</span> /app</span> +<span class="token instruction"><span class="token keyword">COPY</span> hello.py .</span> +<span class="token instruction"><span class="token keyword">CMD</span> [<span class="token string">"python"</span>, <span class="token string">"hello.py"</span>]</span></code></pre></div> +<ol start="2"> +<li>빌드를 동일하게 해보고,</li> +</ol> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">ocker build <span class="token parameter variable">-t</span> python-hello:alpine <span class="token builtin class-name">.</span></code></pre></div> +<ol start="3"> +<li>사이즈를 확인해볼까요?</li> +</ol> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> images +REPOSITORY TAG IMAGE ID CREATED SIZE +python-hello slim 2f648897463c <span class="token number">5</span> seconds ago 212MB +python-hello alpine 37a9f605a036 <span class="token number">3</span> minutes ago <span class="token number">78</span>.4MB +python-hello latest 746136719e90 <span class="token number">12</span> days ago <span class="token number">1</span>.46GB</code></pre></div> +</details> +<h3 id="step-2-멀티-스테이지-사용해보기" style="position:relative;"><a href="#step-2-%EB%A9%80%ED%8B%B0-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0" aria-label="step 2 멀티 스테이지 사용해보기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>step 2. 멀티-스테이지 사용해보기</h3> +<p>멀티-스테이지는 하나의 <code class="language-text">Dockerfile</code>에서 다양한 스테이지로 나누어서 레이어를 쌓는 개념을 의미합니다. 그렇다면 어떤 스테이지가 있는지 살펴볼까요?</p> +<ul> +<li>빌드 스테이지 +<ul> +<li>빌드 도구에 필요한 내용만을 포함합니다</li> +<li>빌드 결과를 저장합니다</li> +</ul> +</li> +<li>런타임 스테이지 +<ul> +<li>직전 phase에서 저장한 파일들을 복사합니다.</li> +<li>빌드 후의 내용을 구동할 최소한의 파일만을 설치합니다</li> +<li>본 내용에서는 런타임 스테이지를 run stage, service stage 둘로 나눕니다. +<ul> +<li>이는 각각 실행환경 구성, 앱 실행환경 구성을 의미합니다.</li> +</ul> +</li> +</ul> +</li> +</ul> +<p>그렇다면 멀티-스테이지로 빌드를 수행해볼까요?</p> +<p>이번 예시부터는 이 <a href="https://github.com/max-pfeiffer/python-poetry" target="_blank" rel="nofollow noopener noreferrer">GitHub repo</a>를 사용해보겠습니다.</p> +<h3 id="멀티-스테이지가-없다면" style="position:relative;"><a href="#%EB%A9%80%ED%8B%B0-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EA%B0%80-%EC%97%86%EB%8B%A4%EB%A9%B4" aria-label="멀티 스테이지가 없다면 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>멀티-스테이지가 없다면?</h3> +<p>그렇다면, 멀티-스테이지 없이 헬로글또를 찍어볼까요?</p> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token instruction"><span class="token keyword">FROM</span> python:3.12-slim</span> + +<span class="token instruction"><span class="token keyword">ARG</span> POETRY_VERSION=1.6.1</span> +<span class="token instruction"><span class="token keyword">ARG</span> APPLICATION_SERVER_PORT=8000</span> + +<span class="token instruction"><span class="token keyword">ENV</span> PIP_NO_CACHE_DIR=off <span class="token operator">\</span> + PIP_DISABLE_PIP_VERSION_CHECK=on <span class="token operator">\</span> + PIP_DEFAULT_TIMEOUT=100 <span class="token operator">\</span> + POETRY_VERSION=<span class="token variable">${POETRY_VERSION}</span> <span class="token operator">\</span> + POETRY_HOME=<span class="token string">"/opt/poetry"</span> <span class="token operator">\</span> + PYTHONUNBUFFERED=1 <span class="token operator">\</span> + PYTHONDONTWRITEBYTECODE=1 <span class="token operator">\</span> + PYTHONPATH=/application_root <span class="token operator">\</span> + POETRY_VIRTUALENVS_IN_PROJECT=true <span class="token operator">\</span> + POETRY_CACHE_DIR=<span class="token string">"/application_root/.cache"</span> <span class="token operator">\</span> + VIRTUAL_ENVIRONMENT_PATH=<span class="token string">"/application_root/.venv"</span> <span class="token operator">\</span> + APPLICATION_SERVER_PORT=<span class="token variable">$APPLICATION_SERVER_PORT</span> <span class="token operator">\</span> + PATH=<span class="token string">"/opt/poetry/bin:$PATH"</span></span> + +<span class="token comment"># 빌드 도구 설치</span> +<span class="token instruction"><span class="token keyword">RUN</span> apt-get update <span class="token operator">\</span> + &amp;&amp; apt-get install --no-install-recommends -y <span class="token operator">\</span> + build-essential</span> + +<span class="token comment"># Poetry 설치</span> +<span class="token instruction"><span class="token keyword">RUN</span> python -m venv <span class="token variable">${POETRY_HOME}</span></span> +<span class="token instruction"><span class="token keyword">RUN</span> <span class="token variable">${POETRY_HOME}</span>/bin/pip install -U pip setuptools</span> +<span class="token instruction"><span class="token keyword">RUN</span> <span class="token variable">${POETRY_HOME}</span>/bin/pip install <span class="token string">"poetry==${POETRY_VERSION}"</span></span> + +<span class="token comment"># 사용자 생성</span> +<span class="token instruction"><span class="token keyword">RUN</span> groupadd -g 1001 python_application &amp;&amp; <span class="token operator">\</span> + useradd -r -u 1001 -g python_application python_application</span> + +<span class="token instruction"><span class="token keyword">WORKDIR</span> <span class="token variable">${PYTHONPATH}</span></span> +<span class="token instruction"><span class="token keyword">COPY</span> . <span class="token variable">${PYTHONPATH}</span></span> +<span class="token instruction"><span class="token keyword">RUN</span> chown python_application:python_application <span class="token variable">${PYTHONPATH}</span></span> + +<span class="token instruction"><span class="token keyword">RUN</span> mkdir <span class="token variable">${POETRY_CACHE_DIR}</span> &amp;&amp; chown python_application:python_application <span class="token variable">${POETRY_CACHE_DIR}</span></span> + +<span class="token instruction"><span class="token keyword">EXPOSE</span> <span class="token variable">${APPLICATION_SERVER_PORT}</span></span> + +<span class="token instruction"><span class="token keyword">COPY</span> ./docker/dev/entrypoint /entrypoint</span> +<span class="token instruction"><span class="token keyword">RUN</span> sed -i <span class="token string">'s/\r$//g'</span> /entrypoint</span> +<span class="token instruction"><span class="token keyword">RUN</span> chmod +x /entrypoint</span> + +<span class="token instruction"><span class="token keyword">USER</span> 1001</span> + +<span class="token instruction"><span class="token keyword">RUN</span> poetry install --without dev</span> + +<span class="token instruction"><span class="token keyword">ENTRYPOINT</span> [<span class="token string">"/entrypoint"</span>]</span></code></pre></div> +<p>이걸로 만든 이미지의 크기를 살펴봅시다.</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> images +REPOSITORY TAG IMAGE ID CREATED SIZE +python-hello slim-without-multi f4be58bb8080 <span class="token number">38</span> seconds ago 700MB</code></pre></div> +<h3 id="멀티-스테이지가-있다면" style="position:relative;"><a href="#%EB%A9%80%ED%8B%B0-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EA%B0%80-%EC%9E%88%EB%8B%A4%EB%A9%B4" aria-label="멀티 스테이지가 있다면 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>멀티-스테이지가 있다면?</h3> +<p>반대로 멀티-스테이지를 추가해서 헬로글또를 찍어봅시다.</p> +<ol> +<li>빌드 스테이지</li> +</ol> +<p>빌드 스테이지는 실제 필요한 내용들만을 설치합니다.</p> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token comment">### ### ### ### ### ### ###</span> +<span class="token comment"># STAGE 0. Prerequisites #</span> +<span class="token comment">### ### ### ### ### ### ###</span> +<span class="token instruction"><span class="token keyword">ARG</span> OFFICIAL_PYTHON_IMAGE=3.12</span> + +<span class="token instruction"><span class="token keyword">FROM</span> python:<span class="token variable">${OFFICIAL_PYTHON_IMAGE}</span>-slim <span class="token keyword">AS</span> build-stage # debian slim 이미지를 빌드 스테이지로 설정합시다.</span> +<span class="token instruction"><span class="token keyword">ARG</span> POETRY_VERSION=1.6.1 # 패키지 매니저로 poetry v1.6.1를 씁니다.</span> + +<span class="token instruction"><span class="token keyword">ENV</span> PIP_NO_CACHE_DIR=off \ # 최적화 옵션입니다. 자세한 것은 위의 GitHub 링크를 확인해주세요!</span> + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_VERSION=${POETRY_VERSION} \ + POETRY_HOME="/opt/poetry" + +<span class="token instruction"><span class="token keyword">RUN</span> apt-get update <span class="token operator">\</span> + &amp;&amp; apt-get install --no-install-recommends -y build-essential \ # 빌드에 필요한 핵심 내용들만 설치합니다.</span> + &amp;&amp; rm -rf /var/lib/apt/lists/* + +<span class="token comment"># https://python-poetry.org/docs/#installing-manually</span> +<span class="token instruction"><span class="token keyword">RUN</span> python -m venv <span class="token variable">${POETRY_HOME}</span> # 가상환경을 구성하고, poetry를 설치합니다.</span> +<span class="token instruction"><span class="token keyword">RUN</span> <span class="token variable">${POETRY_HOME}</span>/bin/pip install -U pip setuptools</span> +<span class="token instruction"><span class="token keyword">RUN</span> <span class="token variable">${POETRY_HOME}</span>/bin/pip install <span class="token string">"poetry==${POETRY_VERSION}"</span></span></code></pre></div> +<ol start="2"> +<li>Run 스테이지</li> +</ol> +<ul> +<li>실행환경을 구성하는 중간단계 입니다.</li> +<li>필요한 부분만을 복사하고, 빌드도구를 제외합니다.</li> +</ul> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token comment">### ### ### ### ###</span> +<span class="token comment"># STAGE 1. 'run' #</span> +<span class="token comment">### ### ### ### ###</span> +<span class="token instruction"><span class="token keyword">FROM</span> python:<span class="token variable">${OFFICIAL_PYTHON_IMAGE}</span>-slim <span class="token keyword">AS</span> run-stage</span> + +<span class="token instruction"><span class="token keyword">ENV</span> PATH=<span class="token string">"/opt/poetry/bin:$PATH"</span> # 환경변수를 추가하여, poetry를 쓸 수 있게 구성합니다.</span> + +<span class="token instruction"><span class="token keyword">COPY</span> <span class="token options"><span class="token property">--from</span><span class="token punctuation">=</span><span class="token string">build-stage</span></span> /opt/poetry /opt/poetry/ # build-stage에서 필요한 내용만 가져옵니다.</span></code></pre></div> +<ol start="3"> +<li>Service 스테이지</li> +</ol> +<ul> +<li>실제 애플리케이션이 구동될 환경을 구성합니다.</li> +<li>보안설정, 런타임에 필요한 의존성을 구성하고 서비스를 구동합니다.</li> +<li>구동 전 <code class="language-text">entrypoint</code> 파일을 별도로 두고 이 파일을 entrypoint 로 구성합니다.</li> +</ul> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token comment">### ### ### ### ### ###</span> +<span class="token comment"># STAGE 2. 'service' #</span> +<span class="token comment">### ### ### ### ### ###</span> +<span class="token instruction"><span class="token keyword">FROM</span> run-stage <span class="token keyword">AS</span> service-stage</span> + +<span class="token instruction"><span class="token keyword">ARG</span> APPLICATION_SERVER_PORT=8000</span> + + <span class="token comment"># https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED</span> +<span class="token instruction"><span class="token keyword">ENV</span> PYTHONUNBUFFERED=1 <span class="token operator">\</span> + <span class="token comment"># https://docs.python.org/3/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE</span> + PYTHONDONTWRITEBYTECODE=1 <span class="token operator">\</span> + PYTHONPATH=/application_root <span class="token operator">\</span> + <span class="token comment"># https://python-poetry.org/docs/configuration/#virtualenvsin-project</span> + POETRY_VIRTUALENVS_IN_PROJECT=true <span class="token operator">\</span> + POETRY_CACHE_DIR=<span class="token string">"/application_root/.cache"</span> <span class="token operator">\</span> + VIRTUAL_ENVIRONMENT_PATH=<span class="token string">"/application_root/.venv"</span> <span class="token operator">\</span> + APPLICATION_SERVER_PORT=<span class="token variable">$APPLICATION_SERVER_PORT</span></span> + +<span class="token comment"># 가상환경이 먼저 실행될 수 있도록 PATH의 앞에 추가</span> +<span class="token comment"># https://docs.python.org/3/library/venv.html#how-venvs-work</span> +<span class="token instruction"><span class="token keyword">ENV</span> PATH=<span class="token string">"$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH"</span></span> + +<span class="token comment"># 권한분리를 위해 처리</span> +<span class="token instruction"><span class="token keyword">RUN</span> groupadd -g 1001 python_application &amp;&amp; <span class="token operator">\</span> + useradd -r -u 1001 -g python_application python_application</span> + +<span class="token comment"># WORKDIR를 애플리케이션 루트 디렉터리로 지정</span> +<span class="token comment"># https://www.uvicorn.org/settings/#development</span> +<span class="token comment"># https://docs.docker.com/engine/reference/builder/#workdir</span> +<span class="token instruction"><span class="token keyword">WORKDIR</span> <span class="token variable">${PYTHONPATH}</span></span> +<span class="token instruction"><span class="token keyword">COPY</span> . <span class="token variable">${PYTHONPATH}</span></span> +<span class="token instruction"><span class="token keyword">RUN</span> chown python_application:python_application <span class="token variable">${PYTHONPATH}</span></span> + +<span class="token comment"># poetry 캐시 디렉터리를 만들고, 권한을 부여함. 링크 참조</span> +<span class="token comment"># https://python-poetry.org/docs/configuration/#cache-directory</span> +<span class="token instruction"><span class="token keyword">RUN</span> mkdir <span class="token variable">${POETRY_CACHE_DIR}</span> &amp;&amp; chown python_application:python_application <span class="token variable">${POETRY_CACHE_DIR}</span></span> + +<span class="token comment"># API 엔드포인트에 대해 문서화를 수행</span> +<span class="token comment"># https://docs.docker.com/engine/reference/builder/#expose</span> +<span class="token instruction"><span class="token keyword">EXPOSE</span> <span class="token variable">${APPLICATION_SERVER_PORT}</span></span> + +<span class="token comment"># ENTRYPOINT로 사용할 파일에 대해 복사 후 내용 구성</span> +<span class="token instruction"><span class="token keyword">COPY</span> ./docker/dev/entrypoint /entrypoint</span> +<span class="token instruction"><span class="token keyword">RUN</span> sed -i <span class="token string">'s/\r$//g'</span> /entrypoint</span> +<span class="token instruction"><span class="token keyword">RUN</span> chmod +x /entrypoint</span> + +<span class="token comment"># 컨테이너 구동 시에 부여하는 권한을 명시함</span> +<span class="token instruction"><span class="token keyword">USER</span> 1001</span> + +<span class="token comment"># poetry를 이용하여 의존성 설치</span> +<span class="token instruction"><span class="token keyword">RUN</span> poetry install --without dev</span> + +<span class="token comment"># Entrypoint 로 추가한 파일을 사용.</span> +<span class="token comment"># https://www.docker.com/blog/docker-best-practices-choosing-between-run-cmd-and-entrypoint/</span> +<span class="token instruction"><span class="token keyword">ENTRYPOINT</span> [<span class="token string">"/entrypoint"</span>]</span></code></pre></div> +<p>이렇게 되면 용량은 얼마나 줄어들까요?</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> images +REPOSITORY TAG IMAGE ID CREATED SIZE +python-hello slim-multi 4f8e4848dc55 <span class="token number">27</span> minutes ago 324MB</code></pre></div> +<p>절반이나 줄어들었군요!</p> +<h3 id="step-2-빌드-타임을-줄여봅시다" style="position:relative;"><a href="#step-2-%EB%B9%8C%EB%93%9C-%ED%83%80%EC%9E%84%EC%9D%84-%EC%A4%84%EC%97%AC%EB%B4%85%EC%8B%9C%EB%8B%A4" aria-label="step 2 빌드 타임을 줄여봅시다 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>step 2. 빌드 타임을 줄여봅시다</h3> +<p>멀티-스테이지는 빌드타임이 얼마나 걸리는지 살펴볼까요? 이번에는 외부 패키지를 추가로 설치해서 테스트 해봅시다. +설치 대상은 <code class="language-text">pandas</code> 와 <code class="language-text">matplotlib</code> 입니다.</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> build <span class="token parameter variable">-t</span> python-hello:slim-multi-2 --no-cache <span class="token builtin class-name">.</span> +<span class="token punctuation">[</span>+<span class="token punctuation">]</span> Building <span class="token number">45</span>.6s <span class="token punctuation">(</span><span class="token number">20</span>/20<span class="token punctuation">)</span> FINISHED docker:desktop-linux + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build definition from Dockerfile <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring dockerfile: <span class="token number">3</span>.53kB <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load metadata <span class="token keyword">for</span> docker.io/library/python:3.12-slim <span class="token number">2</span>.6s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load .dockerignore <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: 2B <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build context <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: <span class="token number">87</span>.08kB <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">1</span>/5<span class="token punctuation">]</span> FROM docker.io/library/python:3.12-slim@sha256:032c52613401895aa3d418a4c563d2d05f993bc3ecc065c8f4e2280978acd249 <span class="token number">5</span>.6s +<span class="token punctuation">(</span>생략<span class="token punctuation">)</span> + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">2</span>/5<span class="token punctuation">]</span> RUN <span class="token function">apt-get</span> update <span class="token operator">&amp;&amp;</span> <span class="token function">apt-get</span> <span class="token function">install</span> --no-install-recommends <span class="token parameter variable">-y</span> build-essential <span class="token operator">&amp;&amp;</span> <span class="token function">rm</span> <span class="token parameter variable">-rf</span> /var/lib/apt/lists/* <span class="token number">12</span>.4s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">3</span>/5<span class="token punctuation">]</span> RUN python <span class="token parameter variable">-m</span> venv /opt/poetry <span class="token number">1</span>.9s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">4</span>/5<span class="token punctuation">]</span> RUN /opt/poetry/bin/pip <span class="token function">install</span> <span class="token parameter variable">-U</span> pip setuptools <span class="token number">1</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">5</span>/5<span class="token punctuation">]</span> RUN /opt/poetry/bin/pip <span class="token function">install</span> <span class="token string">"poetry==1.6.1"</span> <span class="token number">5</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>run-stage <span class="token number">2</span>/2<span class="token punctuation">]</span> COPY <span class="token parameter variable">--from</span><span class="token operator">=</span>build-stage /opt/poetry /opt/poetry/ <span class="token number">0</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">1</span>/9<span class="token punctuation">]</span> RUN <span class="token function">groupadd</span> <span class="token parameter variable">-g</span> <span class="token number">1001</span> python_application <span class="token operator">&amp;&amp;</span> <span class="token function">useradd</span> <span class="token parameter variable">-r</span> <span class="token parameter variable">-u</span> <span class="token number">1001</span> <span class="token parameter variable">-g</span> python_application python_application <span class="token number">0</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">2</span>/9<span class="token punctuation">]</span> WORKDIR /application_root <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">3</span>/9<span class="token punctuation">]</span> COPY <span class="token builtin class-name">.</span> /application_root <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">4</span>/9<span class="token punctuation">]</span> RUN <span class="token function">chown</span> python_application:python_application /application_root <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">5</span>/9<span class="token punctuation">]</span> RUN <span class="token function">mkdir</span> /application_root/.cache <span class="token operator">&amp;&amp;</span> <span class="token function">chown</span> python_application:python_application /application_root/.cache <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">6</span>/9<span class="token punctuation">]</span> COPY entrypoint /entrypoint <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">7</span>/9<span class="token punctuation">]</span> RUN <span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/\r$//g'</span> /entrypoint <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">8</span>/9<span class="token punctuation">]</span> RUN <span class="token function">chmod</span> +x /entrypoint <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">9</span>/9<span class="token punctuation">]</span> RUN poetry <span class="token function">install</span> <span class="token parameter variable">--without</span> dev <span class="token number">7</span>.4s + <span class="token operator">=</span><span class="token operator">></span> exporting to image <span class="token number">8</span>.3s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting layers <span class="token number">6</span>.5s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting manifest sha256:2e1a026e67ea60a968a576838692cc7661011085b146d3b94bff86e21c10fedd <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting config sha256:f7b5913e1edb9f4566cd1bf1c1f32e0baa757f9fae90fea096917d7241a0fd6d <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting attestation manifest sha256:6482e53034c92e947f0c26372d5a0fc24e24d510ec9a4a5c5ff6901310ef5263 <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting manifest list sha256:a23299c55409341354951e7931f8bf1f38137fd21391853773255b17062c1c0f <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> naming to docker.io/library/python-hello:slim-multi-2 <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> unpacking to docker.io/library/python-hello:slim-multi-2 <span class="token number">1</span>.8s</code></pre></div> +<p>그렇다면, alpine 베이스 이미지로 빌드를 수행해봅시다.</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> build <span class="token parameter variable">-t</span> python-hello:alpine-multi-2 --no-cache <span class="token builtin class-name">.</span> +<span class="token punctuation">[</span>+<span class="token punctuation">]</span> Building <span class="token number">90</span>.4s <span class="token punctuation">(</span><span class="token number">21</span>/21<span class="token punctuation">)</span> FINISHED docker:desktop-linux + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build definition from Dockerfile <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring dockerfile: <span class="token number">2</span>.18kB <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load metadata <span class="token keyword">for</span> docker.io/library/python:3.12-alpine <span class="token number">1</span>.4s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load .dockerignore <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: 2B <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build context <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: <span class="token number">85</span>.72kB <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">1</span>/5<span class="token punctuation">]</span> FROM docker.io/library/python:3.12-alpine@sha256:38e179a0f0436c97ecc76bcd378d7293ab3ee79e4b8c440fdc7113670cb6e204 <span class="token number">2</span>.3s +<span class="token punctuation">(</span>생략<span class="token punctuation">)</span> + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">2</span>/5<span class="token punctuation">]</span> RUN apk <span class="token function">add</span> --no-cache gcc python3-dev <span class="token number">12</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">3</span>/5<span class="token punctuation">]</span> RUN python <span class="token parameter variable">-m</span> venv /opt/poetry <span class="token number">2</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">4</span>/5<span class="token punctuation">]</span> RUN /opt/poetry/bin/pip <span class="token function">install</span> <span class="token parameter variable">-U</span> pip setuptools <span class="token number">1</span>.3s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>build-stage <span class="token number">5</span>/5<span class="token punctuation">]</span> RUN /opt/poetry/bin/pip <span class="token function">install</span> <span class="token string">"poetry==1.6.1"</span> <span class="token number">5</span>.7s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>run-stage <span class="token number">2</span>/2<span class="token punctuation">]</span> COPY <span class="token parameter variable">--from</span><span class="token operator">=</span>build-stage /opt/poetry /opt/poetry/ <span class="token number">0</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">1</span>/10<span class="token punctuation">]</span> RUN addgroup <span class="token parameter variable">-g</span> <span class="token number">1001</span> <span class="token parameter variable">-S</span> python_application <span class="token operator">&amp;&amp;</span> adduser <span class="token parameter variable">-S</span> <span class="token parameter variable">-u</span> <span class="token number">1001</span> <span class="token parameter variable">-G</span> python_application python_application <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">2</span>/10<span class="token punctuation">]</span> WORKDIR /application_root <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">3</span>/10<span class="token punctuation">]</span> COPY <span class="token builtin class-name">.</span> /application_root <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">4</span>/10<span class="token punctuation">]</span> RUN <span class="token function">chown</span> python_application:python_application /application_root <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">5</span>/10<span class="token punctuation">]</span> RUN <span class="token function">mkdir</span> /application_root/.cache <span class="token operator">&amp;&amp;</span> <span class="token function">chown</span> python_application:python_application /application_root/.cache <span class="token number">0</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">6</span>/10<span class="token punctuation">]</span> COPY entrypoint /entrypoint <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">7</span>/10<span class="token punctuation">]</span> RUN <span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/\r$//'</span> /entrypoint <span class="token number">0</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">8</span>/10<span class="token punctuation">]</span> RUN <span class="token function">chmod</span> +x /entrypoint <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">9</span>/10<span class="token punctuation">]</span> RUN apk <span class="token function">add</span> --no-cache g++ openssl <span class="token number">8</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>service-stage <span class="token number">10</span>/10<span class="token punctuation">]</span> RUN poetry <span class="token function">install</span> <span class="token parameter variable">--without</span> dev <span class="token number">44</span>.2s + <span class="token operator">=</span><span class="token operator">></span> exporting to image <span class="token number">11</span>.8s``` + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting layers <span class="token number">9</span>.2s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting manifest sha256:6b7bcd80340bf252c06947fde85a4fb53012c3d8bb07ff6dfd3a8b6fe6d1022c <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting config sha256:58c4058d992779af8b0e3aa67ceabd655d234d871e38af0e6996155a56ed953e <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting attestation manifest sha256:e88ed3098ce10fbce9ed2452c82ada1f5ccccb7c9d094b6f2da495754249db26 <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting manifest list sha256:b0b8cc043f1436abf29e9b45bcbcf618d0838de9d1678086c9b2b5acc1541e9b <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> naming to docker.io/library/python-hello:alpine-multi-2 <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> unpacking to docker.io/library/python-hello:alpine-multi-2 <span class="token number">2</span>.6s</code></pre></div> +<p>빌드 시간과 크기에 대해 한번 살펴보죠.</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> images +REPOSITORY TAG IMAGE ID CREATED SIZE +python-hello alpine-multi-2 b0b8cc043f14 <span class="token number">2</span> minutes ago <span class="token number">1</span>.13GB +python-hello slim-multi-2 a23299c55409 <span class="token number">3</span> minutes ago 755MB</code></pre></div> +<table> +<thead> +<tr> +<th>베이스이미지</th> +<th>빌드된 이미지 크기</th> +<th>소요시간(단위: 초)</th> +</tr> +</thead> +<tbody> +<tr> +<td>debian slim</td> +<td><code class="language-text">755 MB</code></td> +<td><code class="language-text">45.6</code></td> +</tr> +<tr> +<td>alpine</td> +<td><code class="language-text">1.13 GB</code></td> +<td><code class="language-text">90.4</code></td> +</tr> +</tbody> +</table> +<ul> +<li>debian 베이스 이미지는 용량, 소요시간 측면 모두에서 안정적이었습니다.</li> +<li>alpine 베이스 이미지는 빌드시간 자체도 늦고, 크기도 커졌습니다.</li> +</ul> +<p>그렇다면 alpine 베이스 이미지는 사용할 수 없는 걸까요? 왜 그런건지 알아보기에 앞서, 앞서 알아봅시다.</p> +<h2 id="c-라이브러리-구현체와-빌드의-차이" style="position:relative;"><a href="#c-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EA%B5%AC%ED%98%84%EC%B2%B4%EC%99%80-%EB%B9%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4" aria-label="c 라이브러리 구현체와 빌드의 차이 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>C 라이브러리 구현체와 빌드의 차이</h2> +<p>그렇다면 앞서 alpine linux 배포판과 debian 배포판의 차이를 알아봅시다. 이 글에서 살펴볼 둘의 주요 차이점은 C 라이브러리 구현체의 선택입니다. 각각의 특징을 살펴보겠습니다:</p> +<h3 id="glibc-debian-계열" style="position:relative;"><a href="#glibc-debian-%EA%B3%84%EC%97%B4" aria-label="glibc debian 계열 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code class="language-text">glibc</code> (Debian 계열)</h3> +<ul> +<li>리눅스 생태계의 사실상 표준 구현체입니다</li> +<li>대부분의 파이썬 패키지가 <code class="language-text">glibc</code> 기준으로 빌드되어있으니, 안정성과 호환성이 검증되어 있습니다.</li> +<li>그런 이유로 베이스 이미지 크기가 상대적으로 큽니다</li> +</ul> +<h3 id="musl-alpine-linux" style="position:relative;"><a href="#musl-alpine-linux" aria-label="musl alpine linux permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code class="language-text">musl</code> (Alpine Linux)</h3> +<ul> +<li>경량화된 C 라이브러리 구현체입니다</li> +<li>단순한 구현으로 보안 공격 표면이 작습니다</li> +<li>베이스 이미지 크기가 매우 작습니다 (Debian 대비 약 1/20)</li> +<li>일부 바이너리와 호환성 이슈가 발생할 수 있습니다</li> +</ul> +<h2 id="python-wheels의-발전과-alpine-linux-지원" style="position:relative;"><a href="#python-wheels%EC%9D%98-%EB%B0%9C%EC%A0%84%EA%B3%BC-alpine-linux-%EC%A7%80%EC%9B%90" aria-label="python wheels의 발전과 alpine linux 지원 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Python Wheels의 발전과 Alpine Linux 지원</h2> +<p>과거에는 Alpine Linux에서 많은 파이썬 패키지를 설치할 때 소스로부터 직접 빌드해야 했고, 이는 컨테이너 빌드 시간을 길어지게 하는 주요 요소였습니다. 하지만 Python 패키징 생태계의 발전으로 상황이 크게 개선되었습니다.</p> +<h3 id="python-패키징의-발전-과정" style="position:relative;"><a href="#python-%ED%8C%A8%ED%82%A4%EC%A7%95%EC%9D%98-%EB%B0%9C%EC%A0%84-%EA%B3%BC%EC%A0%95" aria-label="python 패키징의 발전 과정 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Python 패키징의 발전 과정</h3> +<p>다양한 배포판에서 파이썬 패키지를 바로 설치할 수 있도록 하기 위해, 아래와 같은 PEP가 지속적으로 제안되어 왔고 또 받아들여졌습니다.</p> +<ol> +<li>PEP 513 (manylinux1): 최초의 호환성 있는 Linux wheel 표준 도입</li> +<li>PEP 571 (manylinux2010): glibc 2.12 기반 호환성 확장</li> +<li>PEP 599 (manylinux2014): 더 새로운 시스템 라이브러리 지원</li> +<li>PEP 600 (Future manylinux): 향후 확장성을 고려한 태그 체계 도입</li> +<li><strong>PEP 656 (musllinux)</strong>: Alpine Linux 등 <code class="language-text">musl</code> 기반 배포판 공식 지원</li> +</ol> +<p>PEP 656이 accept 되며, <code class="language-text">musl</code> 기반의 빌드가 이루어진 파이썬 패키지도 직접 다운로드 받게 되어, 이를 지원하고 빌드한 라이브러리라면 누구나 쓸 수 있게 되었습니다.</p> +<h3 id="manylinux" style="position:relative;"><a href="#manylinux" aria-label="manylinux permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>manylinux?</h3> +<p>manylinux는 “Python wheels that work on any linux (almost).” 라는 목표를 가지고 다양한 배포판을 타겟으로 빌드하기 위해 시작된 프로젝트 입니다. 원하는 리눅스 배포판에서 라이브러리를 빌드없이 직접 다운로드 받아 쓸 수 있도록 규약을 잡기 시작한 것이라고 이해할 수 있지요(<a href="https://github.com/pypa/manylinux" target="_blank" rel="nofollow noopener noreferrer">manylinux 링크</a>에서 발췌하였습니다).</p> +<div class="gatsby-highlight" data-language="markdown"><pre class="language-markdown"><code class="language-markdown"><span class="token title important">manylinux +<span class="token punctuation">---</span></span> + +Older archives: https://groups.google.com/forum/#!forum/manylinux-discuss + +The goal of the manylinux project is to provide a convenient way to distribute binary Python extensions as wheels on Linux. This effort has produced PEP 513 (manylinux1), PEP 571 (manylinux2010), PEP 599 (manylinux2014), PEP 600 (manylinux_x_y) and PEP 656 (musllinux_x_y).</code></pre></div> +<h3 id="pep-656의-의의" style="position:relative;"><a href="#pep-656%EC%9D%98-%EC%9D%98%EC%9D%98" aria-label="pep 656의 의의 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>PEP 656의 의의</h3> +<p>Alpine linux와 관련해서는 PEP 656(Platform Tag for Linux Distributions Using Musl)은 위 PEP의 연장선상이라 할 수 있지요. 이 표준이 받아들여지면서, <code class="language-text">musl</code> 기반의 빌드된 wheel을 배포자가 업데이트 하면 사용자가 즉시 설치할 수 있게 된 것입니다. 이로 인해 alpine linux 기반의 베이스 이미지를 선택해도 빌드 시간 단축 및 의존성 문제를 해결할 수 있게 된 겁니다.</p> +<p>이로인해 Alpine 베이스 파이썬 컨테이너를 선택하더라도 빌드 시간 단축과 이미지 크기 최적화의 이점을 누릴 수 있게 되었습니다. 특히 PEP 656 도입 이후에는 많은 패키지가 musllinux wheel을 제공하고 있고, 코어 로직이 Rust로 짜여진 파이썬 패키지들은 크로스플랫폼을 쉽게 지원하기 때문에 이런 부분에서도 선택에 제약이 크게 없습니다.</p> +<h2 id="마지막으로" style="position:relative;"><a href="#%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C" aria-label="마지막으로 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>마지막으로</h2> +<p>그렇지만 여전히 의문입니다. 그러면 언제, 어떤 시기에 적절한 베이스 이미지를 선택하면 될까요? 무턱대고 고르기에는 아무래도 의심이 듭니다. 간단하게나마 있을법한 일을 검증해보고 적절한지 예시 데이터를 보면 더욱 안심이겠죠. 그래서 다음장에는 아래의 상황에서 어떤 베이스 이미지가 좋은지 함께 살펴볼 예정입니다.</p> +<ul> +<li>I/O bound 태스크 중심: API 서비스를 만들고, DB에는 1억개의 데이터을 추가한 후, 쿼리 테스트 및 부하 테스트를 수행하여 성능을 리포트</li> +<li>CPU bound 태스크 중심: 매우 큰 데이터를 pandas로 처리, matplotlib으로 연산하게 구성해보고 성능을 리포트</li> +</ul> +<p>긴 글 읽어주셔서 감사합니다.</p> +<div class="footnotes"> +<hr> +<ol> +<li id="fn-1">패키지(이 글에서는 파이썬 패키지를 의미)는 <code class="language-text">pip</code> 등으로 설치할 수 있는 외부 모듈의 모음을 의미합니다. 쉽게 말하자면 파이썬 라이브러리라고 할 수 있지요.<a href="#fnref-1" class="footnote-backref">↩</a></li> +</ol> +</div><![CDATA[[연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해]]>https://blog.s3ich4n.me/devlog/python/2024-10-13-python-container-101-pt01https://blog.s3ich4n.me/devlog/python/2024-10-13-python-container-101-pt01Sun, 13 Oct 2024 03:00:00 GMT<p>이번 게시글에서는 컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너를 구성하기 위한 선택지를 살펴봅니다.</p> +<p>이 게시글은, 파이썬으로 서버 개발을 진행한 경험이 있으시다면 보다 쉽게 이해하실 수 있습니다.</p> +<h2 id="컨테이너-기술" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B8%B0%EC%88%A0" aria-label="컨테이너 기술 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너 기술?</h2> +<p>요즘은 컨테이너로 서비스를 배포하는 것이 굉장히 일상적입니다. 각종 기고문 등에서도 컨테이너를 사용한 배포가 일상화 되어있고, 국내의 큰 회사도 100만개의 컨테이너가 동시에(!) 돌기도 한다고 합니다. 그렇다면 컨테이너가 어떤 것인지 먼저 살펴볼까요?</p> +<h3 id="컨테이너-이전에는" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%9D%B4%EC%A0%84%EC%97%90%EB%8A%94" aria-label="컨테이너 이전에는 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너 이전에는…</h3> +<p>과거 서버를 구성할 때는 개발팀(Dev)의 개발 후 품질보증팀(QA), 보안팀(Infosec)의 검증을 거쳐서 운영팀(Ops)이 배포하는 흐름이었습니다. 이러한 개발 방식은 서비스를 기획하고 지속적으로 운영하며 여러 문제를 겪는데요. 첫 번째 문제는, 개발한 코드가 배포되기까지의 흐름이 너무 늦다는 것입니다.</p> +<p>우리는 배포에 가까워지며 버그를 패치할 때는 임시방편으로 일정을 맞추기 위한 코드를 짜죠. 이런 ‘기술 부채’들은 지속적으로 쌓이고, 언젠간 해결해야지 하는 방법으로 계속 때우는 것으론 한계가 발생합니다. 근본결함을 수정하기에는 문제 해결에 대한 시간이 너무 짧다는 것입니다.</p> +<p>두 번째 문제는 배포와 관리를 하기 위한 서버 관리 비용 또한 고려의 대상이라는 것입니다. 배포를 할 땐 서버 환경을 모두 알고 잘 구성해야 합니다. 하나라도 어긋나면 서버구동이 되지 않을 수 있습니다. 서버를 늘리고 줄이기 위해서는 물리 서버에 동일한 작업을 여러 번 반복하는 것 또한 일입니다.</p> +<p>이 두 가지 단점에 대해서는, 후술할 DevOps 개념과 컨테이너가 본격적으로 쓰이기 전인 2011년 IDC와 가트너(Gartner)는 전 세계 GDP의 약 3.1조 달러가 IT에 지출된다고 추정했습니다<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup>.</p> +<blockquote> +<p>🍎 tips</p> +<p>컨테이너가 등장하기 이전에도 이를 위한 많은 시도가 있었지만, 주제와 어긋나므로 과감히 생략합니다. 관련해서는 이 글<sup id="fnref-2"><a href="#fn-2" class="footnote-ref">2</a></sup>의 단락을 읽어주세요.</p> +</blockquote> +<h3 id="컨테이너-iac-devops-lets-go" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-iac-devops-lets-go" aria-label="컨테이너 iac devops lets go permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너, IaC, DevOps, let’s go</h3> +<p>보통 말하는 컨테이너의 정의는 아래와 같습니다.</p> +<blockquote> +<p>애플리케이션을 패키징화하고 실행을 격리한다.</p> +</blockquote> +<p>다시말해, 서버 구성 환경 하나하나 고정하여 어디서든 동일하게 실행가능한 프로세스 입니다. 좀 뭉뚱그려 말하면 이게 구동되면 서버가 돌 수 있는 것이지요. 그런 컨테이너 기술로 널리 사용되는 것은 단연 Docker 입니다. 컨테이너 기술의 등장으로 인해 기존 배포과정에서의 단점이 훌륭하게 해결되었지요. 실행 당시의 환경을 별도로 격리시켜주고, 종속성을 유지할 수 있게 할 수 있게 되다보니 아래와 같은 장점을 누릴 수 있게 되었습니다.</p> +<ul> +<li>개발환경과 운영환경의 차이점을 최소화 할 수 있습니다.</li> +<li>다른 사람이 만든 “서버”를 쉽게 가져다 사용할 수 있습니다.</li> +<li>서버 가용성을 확장하기 위해 컨테이너를 한 서버/다른 서버 에서 동시에 구동하여 처리할 수도 있습니다.</li> +</ul> +<details> +<summary>🤔 컨테이너 기술이 DevOps에 끼치는 영향</summary> +<blockquote> +<p>🍎 tips</p> +<p>글의 방향을 이해하는 데는 크게 필요없지만, 만약 더 알아보시고 싶으시다면 아래 내용도 참고해주세요.</p> +<p>만일 IaC 중 Terraform에 대해 관심이 있으시다면 저의 <a href="https://velog.io/@s3ich4n/series/2022%EB%85%84-Terraform-%EC%8A%A4%ED%84%B0%EB%94%94" target="_blank" rel="nofollow noopener noreferrer">다른 연재글</a>을 함께 살펴봐주시면 감사하겠습니다. 🙇</p> +</blockquote> +<p>클라우드 컴퓨팅의 시대로 들어오며 이런 장점은 더욱 극대화 되기 시작했습니다. 기존에는 서버실 구성, 각종 배선작업 및 쿨링 시스템 구축을 거의 모든 회사가 직접 해야했으나, 원격지의 서버를 임대하여 사용할 수 있는 시스템이 등장함으로 인해 이런 컨테이너를 통한 장점이 더욱 극대화될 수 있는 환경마저 제공된 것이죠. 심지어는 이런 구성마저도 코드로 관리하여(IaC, Infrastructure as Code) 처리하는 접근법이 대두되기도 합니다.</p> +<p>이런 식으로 기존 개발 방식에서 개발팀(Dev)와 운영팀(Ops)의 역할 사이클을 한 번에 줄이고 보다 자주, 그리고 견고하게 배포하도록 하는 과정이 DevOps의 일부라고 할 수 있겠습니다.</p> +</details> +<h2 id="컨테이너에-대해" style="position:relative;"><a href="#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90-%EB%8C%80%ED%95%B4" aria-label="컨테이너에 대해 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>컨테이너에 대해</h2> +<blockquote> +<p>🍎 note</p> +<p>이 글 이후로 컨테이너 관련 플랫폼은 Docker(이하 도커)를 사용하도록 하겠습니다.</p> +</blockquote> +<p>지금까지 컨테이너에 대한 말이 굉장히 많이 나왔는데요. 그렇다면 이건 어떻게 만들고 구동해볼 수 있을까요? 설명에 앞서 용어부터 정리해봅시다. 컨테이너 기술을 이야기할 때는 흔히 “도커 이미지”와 “도커 컨테이너”라는 용어를 사용하여 실행가능한 형태와 실제 구동중인 형태를 각각 표현합니다. “도커 이미지”에 대한 설계도는 <code class="language-text">Dockerfile</code> 이구요.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; " + > + <a + class="gatsby-resp-image-link" + href="/static/3e98425217ba1cc676b279553aac1cf6/e8950/01-docker-image-container-explained.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 34.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABjElEQVQY021PS0sCURi9UO3b9Rdatok2EZjQov5A0LZdmyAIwkUEEVL00KZ8JTaViAZqSgZBY6OUlpb5GMukIsxSxx5j2kw6c7/Q2XZWh8PhPJDDZrWY9LukxULu8LwAAK4Dj3ppmdAbN/WGxZVV8zYJLew7nRpiY43Y0BlNy5p1z+EhGrMEu+d9fdN6u/dINsVTDEVRkfAZRQdO6UD4Mirr1/EEHQi6fUc214GfDiSZNOr3CUj3jlQn4/ZrAKiLEgBUGmBOcZtXLABIGOqiiLGcAEJDLHJVmSOls9CxxLSrYyPW9FM+H7nLZkvcAJlGsxc9hsSo65GIFPPFQiidrQnNU1zlM/f2hqVmB1K4yp3GFzQXHd5jAECs857MJ9LmurZLaOVVYc+9VnhJwjX+J/vVsDIfxiS3FXpY8F5QmQKaPK8p3GXlTkpFPctjvgXx+J6dCbLTNMtWfwGgITVHG5IVNHfTtnjbofKjqZMhrR/B/8AAEgDGuMVah92PP91krteWHzTHeojIhCP6B14NRtjhLb+IAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <picture> + <source + srcset="/static/3e98425217ba1cc676b279553aac1cf6/8ac56/01-docker-image-container-explained.webp 240w, +/static/3e98425217ba1cc676b279553aac1cf6/d3be9/01-docker-image-container-explained.webp 480w, +/static/3e98425217ba1cc676b279553aac1cf6/e46b2/01-docker-image-container-explained.webp 960w, +/static/3e98425217ba1cc676b279553aac1cf6/f992d/01-docker-image-container-explained.webp 1440w, +/static/3e98425217ba1cc676b279553aac1cf6/882b9/01-docker-image-container-explained.webp 1920w, +/static/3e98425217ba1cc676b279553aac1cf6/b84eb/01-docker-image-container-explained.webp 2000w" + sizes="(max-width: 960px) 100vw, 960px" + type="image/webp" + /> + <source + srcset="/static/3e98425217ba1cc676b279553aac1cf6/8ff5a/01-docker-image-container-explained.png 240w, +/static/3e98425217ba1cc676b279553aac1cf6/e85cb/01-docker-image-container-explained.png 480w, +/static/3e98425217ba1cc676b279553aac1cf6/d9199/01-docker-image-container-explained.png 960w, +/static/3e98425217ba1cc676b279553aac1cf6/07a9c/01-docker-image-container-explained.png 1440w, +/static/3e98425217ba1cc676b279553aac1cf6/29114/01-docker-image-container-explained.png 1920w, +/static/3e98425217ba1cc676b279553aac1cf6/e8950/01-docker-image-container-explained.png 2000w" + sizes="(max-width: 960px) 100vw, 960px" + type="image/png" + /> + <img + class="gatsby-resp-image-image" + src="/static/3e98425217ba1cc676b279553aac1cf6/d9199/01-docker-image-container-explained.png" + alt="귀여운 고래와 함께 보시죠" + title="귀여운 고래와 함께 보시죠" + loading="lazy" + decoding="async" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + /> + </picture> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption"><p>귀여운 고래와 함께 보시죠</p></figcaption> + </figure></p> +<h3 id="도커-이미지와-dockerfile에-대해" style="position:relative;"><a href="#%EB%8F%84%EC%BB%A4-%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%99%80-dockerfile%EC%97%90-%EB%8C%80%ED%95%B4" aria-label="도커 이미지와 dockerfile에 대해 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>도커 이미지와 <code class="language-text">Dockerfile</code>에 대해</h3> +<p>이미지는 애플리케이션을 실행하는데 필요한 모든 것을 포함하는 ‘불변의 템플릿’입니다. 여기엔 소스 코드, 런타임, 라이브러리, 환경 변수, 설정 파일 등이 포함됩니다. 그리고 이 이미지를 만드는 명세서가 바로 <code class="language-text">Dockerfile</code>입니다. Dockerfile에는 이미지를 어떻게 만들지 순서대로 적어둡니다. 기준이 되는 이미지부터 우리가 원하는 내용을 추가할 수 있지요. 한번 살펴봅시다.</p> +<p>Dockerfile의 각 명령어는 하나의 “레이어”가 되어 이미지를 겹겹이 쌓아갑니다. 각각의 레이어는 그 명령어로 인한 파일 시스템의 변경사항을 담고 있죠. 한번 만들어진 레이어는 읽기 전용이 되어 “불변성”을 보장합니다. 이렇게 모든 레이어가 쌓이면 하나의 이미지가 완성되는 거죠.</p> +<p>도커 이미지를 만들기 위한 바탕을 베이스 이미지<sup id="fnref-3"><a href="#fn-3" class="footnote-ref">3</a></sup>라고 부르기도 합니다. 파이썬 베이스 이미지는 <a href="https://hub.docker.com/_/python" target="_blank" rel="nofollow noopener noreferrer">Docker Hub</a>에서 확인하실 수 있어요. 필요한 파이썬 버전이 있다면 그에 맞는 값을 바꿔주면 됩니다. <code class="language-text">3.12</code> 버전이 필요하면 그 값을 입력하면 되죠. 심지어는 어떤 운영체제에서 구동되는 걸 기대하는지도 지정해줄 수 있습니다.</p> +<div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token instruction"><span class="token keyword">FROM</span> python:3.12 # 앞서 살펴본 베이스 이미지 입니다. 여기서는 파이썬 3.12를 사용해요.</span> +<span class="token instruction"><span class="token keyword">WORKDIR</span> /app # 이제부터의 명령어들이 실행될 작업 디렉터리를 지정합니다.</span> +<span class="token instruction"><span class="token keyword">COPY</span> hello.py . # 현재 디렉터리의 hello.py 파일을 컨테이너의 /app 디렉터리로 복사합니다.</span> +<span class="token instruction"><span class="token keyword">CMD</span> [<span class="token string">"python"</span>, <span class="token string">"hello.py"</span>] # 컨테이너가 시작될 때 실행할 명령어를 지정합니다.</span></code></pre></div> +<h3 id="만들어봅시다" style="position:relative;"><a href="#%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B4%85%EC%8B%9C%EB%8B%A4" aria-label="만들어봅시다 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>만들어봅시다!</h3> +<p>그러면 헬로월드를 출력하는 도커 이미지를 만들어봅시다. <a href="https://www.docker.com/products/docker-desktop/" target="_blank" rel="nofollow noopener noreferrer">Docker Desktop</a>을 설치하고 한번 만들어볼까요!</p> <ol> <li><code class="language-text">hello.py</code> 파일 생성:</li> </ol> <div class="gatsby-highlight" data-language="python"><pre class="language-python"><code class="language-python"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Hello, geultto!"</span><span class="token punctuation">)</span></code></pre></div> <ol start="2"> -<li><code class="language-text">Dockerfile</code> 생성:</li> +<li><code class="language-text">Dockerfile</code> 생성(위에서 본 내용입니다):</li> </ol> <div class="gatsby-highlight" data-language="dockerfile"><pre class="language-dockerfile"><code class="language-dockerfile"><span class="token instruction"><span class="token keyword">FROM</span> python:3.12</span> - <span class="token instruction"><span class="token keyword">WORKDIR</span> /app</span> - <span class="token instruction"><span class="token keyword">COPY</span> hello.py .</span> - <span class="token instruction"><span class="token keyword">CMD</span> [<span class="token string">"python"</span>, <span class="token string">"hello.py"</span>]</span></code></pre></div> <ol start="3"> -<li>이미지 빌드 및 실행:</li> +<li>이미지 빌드:</li> </ol> -<div class="gatsby-highlight" data-language="bash"><pre class="language-bash"><code class="language-bash"><span class="token function">docker</span> build <span class="token parameter variable">-t</span> python-hello <span class="token builtin class-name">.</span> -<span class="token function">docker</span> run python-hello</code></pre></div> <p>3을 실행시키면 아래와 같은 결과가 나옵니다.</p> <div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell"><span class="token function">docker</span> build <span class="token parameter variable">-t</span> python-hello <span class="token builtin class-name">.</span> -<span class="token punctuation">[</span>+<span class="token punctuation">]</span> Building <span class="token number">26</span>.1s <span class="token punctuation">(</span><span class="token number">8</span>/8<span class="token punctuation">)</span> FINISHED docker:desktop-linux - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build definition from Dockerfile <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring dockerfile: 151B <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load metadata <span class="token keyword">for</span> docker.io/library/python:3.12 <span class="token number">2</span>.7s - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load .dockerignore <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: 2B <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">1</span>/3<span class="token punctuation">]</span> FROM docker.io/library/python:3.12@sha256:05855f5bf06f5a004b0c1a8aaac73a9d9ea54390fc289d3e80ef52c4f90d5585 <span class="token number">22</span>.7s +<span class="token punctuation">[</span>+<span class="token punctuation">]</span> Building <span class="token number">26</span>.1s <span class="token punctuation">(</span><span class="token number">8</span>/8<span class="token punctuation">)</span> FINISHED docker:desktop-linux + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build definition from Dockerfile <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring dockerfile: 151B <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load metadata <span class="token keyword">for</span> docker.io/library/python:3 <span class="token number">2</span>.7s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load .dockerignore <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: 2B <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">1</span>/3<span class="token punctuation">]</span> FROM docker.io/library/python:3.12@sha256:<span class="token operator">&lt;</span>생략<span class="token operator">></span> <span class="token number">22</span>.7s <span class="token punctuation">(</span>생략<span class="token punctuation">)</span> - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> extracting sha256:3795519dea7759f67ddca8240187a3dd44b924bf57de62a5a77ac2226c7b9d43 <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build context <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: 98B <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">2</span>/3<span class="token punctuation">]</span> WORKDIR /app <span class="token number">0</span>.5s - <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">3</span>/3<span class="token punctuation">]</span> COPY hello.py <span class="token builtin class-name">.</span> <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> exporting to image <span class="token number">0</span>.1s - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting layers <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> extracting sha256:<span class="token operator">&lt;</span>생략<span class="token operator">></span> + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>internal<span class="token punctuation">]</span> load build context <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> transferring context: 98B <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">2</span>/3<span class="token punctuation">]</span> WORKDIR /app <span class="token number">0</span>.5s + <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token number">3</span>/3<span class="token punctuation">]</span> COPY hello.py <span class="token builtin class-name">.</span> <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> exporting to image <span class="token number">0</span>.1s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> exporting layers <span class="token number">0</span>.0s <span class="token punctuation">(</span>생략<span class="token punctuation">)</span> - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> naming to docker.io/library/python-hello:latest <span class="token number">0</span>.0s - <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> unpacking to docker.io/library/python-hello:latest <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> naming to docker.io/library/python-hello:latest <span class="token number">0</span>.0s + <span class="token operator">=</span><span class="token operator">></span> <span class="token operator">=</span><span class="token operator">></span> unpacking to docker.io/library/python-hello:latest <span class="token number">0</span>.0s What's next: - View a summary of image vulnerabilities and recommendations → <span class="token function">docker</span> scout quickview - -$ <span class="token function">docker</span> run python-hello -Hello, geultto<span class="token operator">!</span></code></pre></div> + View a summary of image vulnerabilities and recommendations → <span class="token function">docker</span> scout quickview</code></pre></div> <p>축하합니다. 당신은 첫 파이썬 컨테이너를 빌드했습니다! 🎉🎉</p> -<p>이제 빌드한 이미지의 크기를 확인해봅시다.</p> +<h3 id="도커-컨테이너" style="position:relative;"><a href="#%EB%8F%84%EC%BB%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88" aria-label="도커 컨테이너 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>도커 컨테이너?</h3> +<p>그렇다면 도커 컨테이너는 무엇일까요? 바로 도커 이미지를 실행한 프로세스를 말합니다. 이 프로세스는:</p> +<ul> +<li>격리된 프로세스 공간 확보</li> +<li>호스트로부터 컨테이너 자신만의 독립된 파일시스템을 확보</li> +<li>컨테이너 만의 네트워크 환경을 개별적으로 확보</li> +<li>심지어 실행 권한도 별도로 부여받을 수 있습니다!</li> +</ul> +<p>이런 특성들 덕분에:</p> +<ul> +<li>어떤 환경에서도 동일하게 실행됩니다 +<ul> +<li>내 컴퓨터에서 잘 돌던 게 서버에서도 그대로!</li> +</ul> +</li> +<li>다른 프로세스와 충돌 없이 실행됩니다 +<ul> +<li>Python 2.7과 3.8이 필요한 프로그램들도 걱정 없이!</li> +</ul> +</li> +<li>문제가 생겨도 다른 프로그램에 영향을 주지 않습니다 +<ul> +<li>하나의 컨테이너가 문제가 생겨도 다른 건 멀쩡해요</li> +</ul> +</li> +</ul> +<p>그러면 컨테이너를 한번 실행해볼까요?</p> +<div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">docker</span> run python-hello +Hello, geultto<span class="token operator">!</span></code></pre></div> +<p>컨테이너 실행 완료! 이제 더 이상 환경에 구애받지 않는 실행환경이 만들어졌어요! 🎉🎉</p> +<h2 id="그런데" style="position:relative;"><a href="#%EA%B7%B8%EB%9F%B0%EB%8D%B0" aria-label="그런데 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>그런데?</h2> +<p>성공적으로 실행했으니 이제 빌드한 이미지의 크기를 확인해봅시다.</p> <div class="gatsby-highlight" data-language="shell"><pre class="language-shell"><code class="language-shell">$ <span class="token function">docker</span> images python-hello REPOSITORY TAG IMAGE ID CREATED SIZE python-hello latest 746136719e90 <span class="token number">3</span> minutes ago <span class="token number">1</span>.46GB</code></pre></div> @@ -250,7 +718,7 @@ python-hello latest 746136719e90 <span class="token number"& </li> <li>운영체제 레이어와 각종 의존성 <ul> -<li>기본 OS 파일 시스템, 유틸리티 등이 함께 포함될 수 있기 때문입니다. 저희는 shared tags를 썼으니까요.</li> +<li>기본 OS 파일 시스템, 유틸리티 등이 함께 포함될 수 있기 때문입니다.</li> </ul> </li> <li>그런데 여기서 애플리케이션 코드 및 데이터가 들어가면? @@ -289,13 +757,15 @@ python-hello latest 746136719e90 <span class="token number"& </ul> </li> </ul> -<p>그렇다면 다음 글에서는 컨테이너 크기를 줄이기 위한 방안을 살펴보고, 파이썬 컨테이너 이미지의 특징을 살펴보도록 하겠습니다.</p> +<h2 id="끝으로" style="position:relative;"><a href="#%EB%81%9D%EC%9C%BC%EB%A1%9C" aria-label="끝으로 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>끝으로</h2> +<p>그렇다면 다음 글에서는 파이썬 컨테이너 이미지 크기를 줄이기 위한 여러 방안을 살펴보고, 파이썬 컨테이너 이미지 빌드가 가지는 특징을 살펴보도록 하겠습니다.</p> <p>긴 글 읽어주셔서 감사합니다.</p> <div class="footnotes"> <hr> <ol> <li id="fn-1">자세한 내용은 <a href="https://www.itjungle.com/2011/07/11/tfh071111-story03/" target="_blank" rel="nofollow noopener noreferrer">이 링크를</a>, 관련 출처는 <a href="https://readingraphics.com/book-summary-the-devops-handbook/" target="_blank" rel="nofollow noopener noreferrer">이 링크</a>에서 확인할 수 있습니다.<a href="#fnref-1" class="footnote-backref">↩</a></li> <li id="fn-2"><a href="https://www.44bits.io/ko/post/why-should-i-use-docker-container#%EC%9A%B4%EC%98%81%ED%95%98%EB%A9%B4%EC%84%9C-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%A7%80%EB%8A%94-%EB%88%88%EC%86%A1%EC%9D%B4-%EC%84%9C%EB%B2%84%EB%93%A4snowflake-servers" target="_blank" rel="nofollow noopener noreferrer">https://www.44bits.io/ko/post/why-should-i-use-docker-container#운영하면서-만들어지는-눈송이-서버들snowflake-servers</a><a href="#fnref-2" class="footnote-backref">↩</a></li> +<li id="fn-3">모든 이미지의 베이스 이미지도 있습니다. <a href="https://docs.docker.com/build/building/base-images/#creating-a-simple-parent-image-using-scratch" target="_blank" rel="nofollow noopener noreferrer">참고 링크</a><a href="#fnref-3" class="footnote-backref">↩</a></li> </ol> </div><![CDATA[[글또10기] 삶의 지도]]>https://blog.s3ich4n.me/retrospect/2024-09-17-geultto-10th-life-retrospecthttps://blog.s3ich4n.me/retrospect/2024-09-17-geultto-10th-life-retrospectTue, 17 Sep 2024 01:01:00 GMT<p>프로그래밍을 업으로 삼게 된 시절부터, 집에서 글을 쓰는 현재까지 돌아보려 합니다.</p> <h2 id="제1장-프로그래밍에-입문" style="position:relative;"><a href="#%EC%A0%9C1%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90-%EC%9E%85%EB%AC%B8" aria-label="제1장 프로그래밍에 입문 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>제1장: 프로그래밍에 입문</h2> @@ -16573,45 +17043,7 @@ ENTRYPOINT <span class="token punctuation">[</span><spa <li>VSCode의 Show all commands 가 정말 꿀기능 이었습니다. 필요한 커맨드를 찾고 바로 수행할 수가 있네요.</li> </ol> <h2 id="마무리" style="position:relative;"><a href="#%EB%A7%88%EB%AC%B4%EB%A6%AC" aria-label="마무리 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>마무리</h2> -<p>별 것 아닌 내용이지만, 괜히 지웠다 깔 필요 없이 다음번에도 헤메지 않기 위해 메모했습니다. 별 것 아니지만, 여러분들께도 도움이 되길 바랍니다. 감사합니다.</p><![CDATA[PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기]]>https://blog.s3ich4n.me/tips/how-to-use-file-signature-in-pycharmhttps://blog.s3ich4n.me/tips/how-to-use-file-signature-in-pycharmThu, 03 Jun 2021 09:00:00 GMT<p>PyCharm에서 파일 시그니처를 바로 입력하려면?</p> -<p><code class="language-text">Live Templates</code> 기능을 사용하면 보다 손쉽게 사용할 수 있다.</p> -<ol> -<li> -<p>shift 두번 눌러서 액션을 열고 <code class="language-text">Live Templates</code> 를 연다.</p> -</li> -<li> -<p>add를 하되, 파이썬 파일에서만 쓸거니까 파이썬에서 기능을 혀용하도록 한다.</p> -</li> -<li> -<p>이런 식으로 시그니처를 작성한다.</p> -<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"># -# (코드의 전반적인 내용을 설명해 주세요) -# -# @author Seongeun Yu (seongeun.yu@somma.kr) -# @date $DATE$ $TIME$ created. -# @modified $DATE$ $TIME$ modified. -# @copyright MIT License -#</code></pre></div> -<ol> -<li>변수를 저렇게 두면 원하는 함수를 써서 매핑할 수 있다.</li> -</ol> -</li> -<li> -<p><code class="language-text">$DATE$</code>, <code class="language-text">$TIME$</code> 값은 함수를 쓰면 된다. 관련 참고링크는 <a href="https://www.jetbrains.com/help/pycharm/template-variables.html#predefined_functions" target="_blank" rel="nofollow noopener noreferrer">여기</a>:</p> -<ol> -<li><code class="language-text">date()</code> 함수의 파라미터 규격은 자바의 (<a href="https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html" target="_blank" rel="nofollow noopener noreferrer">SimpleDateFormat</a>)을 따라간다.</li> -<li>date, time의 규격은 이렇게 하면 된다. -<ol> -<li>date는? <code class="language-text">date("yyyy/MM/dd")</code></li> -<li>time은? <code class="language-text">date("HH:mm")</code></li> -</ol> -</li> -</ol> -</li> -<li> -<p>파일을 열 때마다 <code class="language-text">sign_s3ich4n</code> 를 한두글자만 치면 자동완성으로 알아서 완성된다.</p> -</li> -</ol><![CDATA[pre-commit hook, 나도 한번 써보자 (1)]]>https://blog.s3ich4n.me/tips/2021-07-11-how-to-use-pre-commit-hook-vol1https://blog.s3ich4n.me/tips/2021-07-11-how-to-use-pre-commit-hook-vol1Thu, 03 Jun 2021 09:00:00 GMT<p>이 글은 pre-commit hook 을 사용하고 전파하기 위해 작성한 시리즈 글입니다.</p> +<p>별 것 아닌 내용이지만, 괜히 지웠다 깔 필요 없이 다음번에도 헤메지 않기 위해 메모했습니다. 별 것 아니지만, 여러분들께도 도움이 되길 바랍니다. 감사합니다.</p><![CDATA[pre-commit hook, 나도 한번 써보자 (1)]]>https://blog.s3ich4n.me/tips/2021-07-11-how-to-use-pre-commit-hook-vol1https://blog.s3ich4n.me/tips/2021-07-11-how-to-use-pre-commit-hook-vol1Thu, 03 Jun 2021 09:00:00 GMT<p>이 글은 pre-commit hook 을 사용하고 전파하기 위해 작성한 시리즈 글입니다.</p> <h2 id="설치-및-설정하기" style="position:relative;"><a href="#%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0" aria-label="설치 및 설정하기 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>설치 및 설정하기</h2> <ol> <li>작업 환경에 맞게 <a href="https://pre-commit.com/#installation" target="_blank" rel="nofollow noopener noreferrer">pre-commit hook을 설치한다</a></li> @@ -16671,7 +17103,45 @@ ENTRYPOINT <span class="token punctuation">[</span><spa <ul> <li><a href="https://pre-commit.com/#usage-in-continuous-integration" target="_blank" rel="nofollow noopener noreferrer">CI 연동</a></li> <li>더 없나 찾아보자</li> -</ul><![CDATA[간략히 써본 서버 점검 가이드]]>https://blog.s3ich4n.me/tips/2021-02-03-server-maintenance-guidehttps://blog.s3ich4n.me/tips/2021-02-03-server-maintenance-guideWed, 03 Feb 2021 10:17:43 GMT<p>서버 점검과 관련하여 좋은글들을 추합한 내용을 공유합니다.</p> +</ul><![CDATA[PyCharm에서 파일 맨 위에 작성하는 주석을 작성하는 매크로 만들기]]>https://blog.s3ich4n.me/tips/how-to-use-file-signature-in-pycharmhttps://blog.s3ich4n.me/tips/how-to-use-file-signature-in-pycharmThu, 03 Jun 2021 09:00:00 GMT<p>PyCharm에서 파일 시그니처를 바로 입력하려면?</p> +<p><code class="language-text">Live Templates</code> 기능을 사용하면 보다 손쉽게 사용할 수 있다.</p> +<ol> +<li> +<p>shift 두번 눌러서 액션을 열고 <code class="language-text">Live Templates</code> 를 연다.</p> +</li> +<li> +<p>add를 하되, 파이썬 파일에서만 쓸거니까 파이썬에서 기능을 혀용하도록 한다.</p> +</li> +<li> +<p>이런 식으로 시그니처를 작성한다.</p> +<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"># +# (코드의 전반적인 내용을 설명해 주세요) +# +# @author Seongeun Yu (seongeun.yu@somma.kr) +# @date $DATE$ $TIME$ created. +# @modified $DATE$ $TIME$ modified. +# @copyright MIT License +#</code></pre></div> +<ol> +<li>변수를 저렇게 두면 원하는 함수를 써서 매핑할 수 있다.</li> +</ol> +</li> +<li> +<p><code class="language-text">$DATE$</code>, <code class="language-text">$TIME$</code> 값은 함수를 쓰면 된다. 관련 참고링크는 <a href="https://www.jetbrains.com/help/pycharm/template-variables.html#predefined_functions" target="_blank" rel="nofollow noopener noreferrer">여기</a>:</p> +<ol> +<li><code class="language-text">date()</code> 함수의 파라미터 규격은 자바의 (<a href="https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html" target="_blank" rel="nofollow noopener noreferrer">SimpleDateFormat</a>)을 따라간다.</li> +<li>date, time의 규격은 이렇게 하면 된다. +<ol> +<li>date는? <code class="language-text">date("yyyy/MM/dd")</code></li> +<li>time은? <code class="language-text">date("HH:mm")</code></li> +</ol> +</li> +</ol> +</li> +<li> +<p>파일을 열 때마다 <code class="language-text">sign_s3ich4n</code> 를 한두글자만 치면 자동완성으로 알아서 완성된다.</p> +</li> +</ol><![CDATA[간략히 써본 서버 점검 가이드]]>https://blog.s3ich4n.me/tips/2021-02-03-server-maintenance-guidehttps://blog.s3ich4n.me/tips/2021-02-03-server-maintenance-guideWed, 03 Feb 2021 10:17:43 GMT<p>서버 점검과 관련하여 좋은글들을 추합한 내용을 공유합니다.</p> <h1 id="작성에-앞서" style="position:relative;"><a href="#%EC%9E%91%EC%84%B1%EC%97%90-%EC%95%9E%EC%84%9C" aria-label="작성에 앞서 permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>작성에 앞서…</h1> <p>이 글은 좋은 글을 가져와 제 입맛에 맞게 정리한 것에 불과합니다. 제 스스로 되새김질 하기 위해 썼기 때문에, 하단의 참조링크를 반드시 보실 것을 권해드립니다.</p> <h1 id="prerequisite" style="position:relative;"><a href="#prerequisite" aria-label="prerequisite permalink" class="anchor before"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Prerequisite</h1> diff --git a/sitemap/sitemap-0.xml b/sitemap/sitemap-0.xml index 73f0b635..d5d07ab2 100644 --- a/sitemap/sitemap-0.xml +++ b/sitemap/sitemap-0.xml @@ -1 +1 @@ -https://blog.s3ich4n.me/tagsdaily0.7https://blog.s3ich4n.me/categoriesdaily0.7https://blog.s3ich4n.me/pages/about/daily0.7https://blog.s3ich4n.me/pages/contacts/daily0.7https://blog.s3ich4n.me/retrospect/2020-05-22-s3ich4n-1-year-retrospectdaily0.7https://blog.s3ich4n.me/retrospect/2023-02-20-assignment-pt01daily0.7https://blog.s3ich4n.me/retrospect/2023-02-20-assignment-pt02daily0.7https://blog.s3ich4n.me/retrospect/2024-09-17-geultto-10th-life-retrospectdaily0.7https://blog.s3ich4n.me/tips/2019-04-19-jekyll-liquid-issuedaily0.7https://blog.s3ich4n.me/tips/2021-02-03-server-maintenance-guidedaily0.7https://blog.s3ich4n.me/tips/how-to-use-file-signature-in-pycharmdaily0.7https://blog.s3ich4n.me/tips/2021-07-11-how-to-use-pre-commit-hook-vol1daily0.7https://blog.s3ich4n.me/tips/2021-09-05-what-is-wrong-with-my-vscode-tabdaily0.7https://blog.s3ich4n.me/tips/2022-10-08-meaning-of-z-in-shell-scriptdaily0.7https://blog.s3ich4n.me/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-filedaily0.7https://blog.s3ich4n.me/tips/2022-12-30-total-commander-101-pt01daily0.7https://blog.s3ich4n.me/tips/2023-01-02-total-commander-101-pt02daily0.7https://blog.s3ich4n.me/tips/2023-01-04-gatsby-add-image-captionsdaily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-06-pt01daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-13-pt03daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-13-pt04daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-27-pt05daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-27-pt06daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-03-pt07daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-03-pt08daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-10-pt09daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-10-pt10daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-17-pt01daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-24-pt01daily0.7https://blog.s3ich4n.me/books/clean-code/2023-03-07-pt01daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-11-pt01-ch01daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-13-pt01-ch02daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-13-pt01-ch03daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-15-pt01-ch04daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-16-pt01-ch05daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-16-pt01-ch06daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-17-pt01-ch07daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-17-pt02-ch08daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-06-pt02-ch09daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-07-pt02-ch10daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-18-pt02-ch10daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-21-pt01daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-18-pt02-ch12daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-21-pt02daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-23-pt03daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-24-pt04daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-06-28-pt01-ch01daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-06-30-pt01-ch02daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-07-01-pt01-ch03daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-07-04-pt02-ch04daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-05-considering-http-authn-pt01daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-05-considering-http-authn-pt02daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02daily0.7https://blog.s3ich4n.me/devlog/docker/2023-03-13-from-servlet-to-springdaily0.7https://blog.s3ich4n.me/devlog/data/2020-02-05-ksqldb-101-pt01daily0.7https://blog.s3ich4n.me/devlog/data/2020-02-17-ksqldb-101-pt01daily0.7https://blog.s3ich4n.me/devlog/data/2020-03-10-ksqldb-101-pt03daily0.7https://blog.s3ich4n.me/devlog/docker/2021-09-18-how-to-make-docker-image-securelydaily0.7https://blog.s3ich4n.me/devlog/python/2022-06-09-python-classmethod-and-staticmethoddaily0.7https://blog.s3ich4n.me/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01daily0.7https://blog.s3ich4n.me/devlog/python/2022-06-10-python-descriptor-describeddaily0.7https://blog.s3ich4n.me/devlog/python/2024-10-13-python-container-101-pt01daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08daily0.7https://blog.s3ich4n.me/category/booksdaily0.7https://blog.s3ich4n.me/category/books/page/1daily0.7https://blog.s3ich4n.me/category/books/page/2daily0.7https://blog.s3ich4n.me/category/devlogdaily0.7https://blog.s3ich4n.me/category/devlog/page/1daily0.7https://blog.s3ich4n.me/category/devlog/page/2daily0.7https://blog.s3ich4n.me/category/devlog/page/3daily0.7https://blog.s3ich4n.me/category/devlog/page/4daily0.7https://blog.s3ich4n.me/category/retrospectdaily0.7https://blog.s3ich4n.me/category/tipsdaily0.7https://blog.s3ich4n.me/category/tips/page/1daily0.7https://blog.s3ich4n.me/tag/pepdaily0.7https://blog.s3ich4n.me/tag/architecturedaily0.7https://blog.s3ich4n.me/tag/backenddaily0.7https://blog.s3ich4n.me/tag/backend/page/1daily0.7https://blog.s3ich4n.me/tag/backend/page/2daily0.7https://blog.s3ich4n.me/tag/book-reviewdaily0.7https://blog.s3ich4n.me/tag/book-review/page/1daily0.7https://blog.s3ich4n.me/tag/book-review/page/2daily0.7https://blog.s3ich4n.me/tag/booksdaily0.7https://blog.s3ich4n.me/tag/books/page/1daily0.7https://blog.s3ich4n.me/tag/code-qualitydaily0.7https://blog.s3ich4n.me/tag/code-quality/page/1daily0.7https://blog.s3ich4n.me/tag/code-quality/page/2daily0.7https://blog.s3ich4n.me/tag/coworkdaily0.7https://blog.s3ich4n.me/tag/data-processingdaily0.7https://blog.s3ich4n.me/tag/ddddaily0.7https://blog.s3ich4n.me/tag/ddd/page/1daily0.7https://blog.s3ich4n.me/tag/devlogdaily0.7https://blog.s3ich4n.me/tag/devopsdaily0.7https://blog.s3ich4n.me/tag/devops/page/1daily0.7https://blog.s3ich4n.me/tag/dockerdaily0.7https://blog.s3ich4n.me/tag/gatsbydaily0.7https://blog.s3ich4n.me/tag/geulttodaily0.7https://blog.s3ich4n.me/tag/gitdaily0.7https://blog.s3ich4n.me/tag/iacdaily0.7https://blog.s3ich4n.me/tag/iac/page/1daily0.7https://blog.s3ich4n.me/tag/javadaily0.7https://blog.s3ich4n.me/tag/jekylldaily0.7https://blog.s3ich4n.me/tag/lifedaily0.7https://blog.s3ich4n.me/tag/linuxdaily0.7https://blog.s3ich4n.me/tag/maintenancedaily0.7https://blog.s3ich4n.me/tag/ofmdaily0.7https://blog.s3ich4n.me/tag/pre-commitdaily0.7https://blog.s3ich4n.me/tag/pycharmdaily0.7https://blog.s3ich4n.me/tag/pythondaily0.7https://blog.s3ich4n.me/tag/python/page/1daily0.7https://blog.s3ich4n.me/tag/python/page/2daily0.7https://blog.s3ich4n.me/tag/reviewdaily0.7https://blog.s3ich4n.me/tag/shelldaily0.7https://blog.s3ich4n.me/tag/terraformdaily0.7https://blog.s3ich4n.me/tag/terraform/page/1daily0.7https://blog.s3ich4n.me/tag/vscodedaily0.7https://blog.s3ich4n.me/tag/webdaily0.7https://blog.s3ich4n.me/daily0.7https://blog.s3ich4n.me/page/1daily0.7https://blog.s3ich4n.me/page/2daily0.7https://blog.s3ich4n.me/page/3daily0.7https://blog.s3ich4n.me/page/4daily0.7https://blog.s3ich4n.me/page/5daily0.7https://blog.s3ich4n.me/page/6daily0.7https://blog.s3ich4n.me/page/7daily0.7https://blog.s3ich4n.me/page/8daily0.7https://blog.s3ich4n.me/page/9daily0.7 \ No newline at end of file +https://blog.s3ich4n.me/tagsdaily0.7https://blog.s3ich4n.me/categoriesdaily0.7https://blog.s3ich4n.me/retrospect/2020-05-22-s3ich4n-1-year-retrospectdaily0.7https://blog.s3ich4n.me/pages/about/daily0.7https://blog.s3ich4n.me/retrospect/2023-02-20-assignment-pt01daily0.7https://blog.s3ich4n.me/retrospect/2023-02-20-assignment-pt02daily0.7https://blog.s3ich4n.me/tips/2019-04-19-jekyll-liquid-issuedaily0.7https://blog.s3ich4n.me/retrospect/2024-09-17-geultto-10th-life-retrospectdaily0.7https://blog.s3ich4n.me/pages/contacts/daily0.7https://blog.s3ich4n.me/tips/2021-02-03-server-maintenance-guidedaily0.7https://blog.s3ich4n.me/tips/2021-07-11-how-to-use-pre-commit-hook-vol1daily0.7https://blog.s3ich4n.me/tips/2021-09-05-what-is-wrong-with-my-vscode-tabdaily0.7https://blog.s3ich4n.me/tips/2022-10-08-meaning-of-z-in-shell-scriptdaily0.7https://blog.s3ich4n.me/tips/how-to-use-file-signature-in-pycharmdaily0.7https://blog.s3ich4n.me/tips/2022-12-30-total-commander-101-pt01daily0.7https://blog.s3ich4n.me/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-filedaily0.7https://blog.s3ich4n.me/tips/2023-01-02-total-commander-101-pt02daily0.7https://blog.s3ich4n.me/tips/2023-01-04-gatsby-add-image-captionsdaily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-06-pt01daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-13-pt03daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-27-pt05daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-13-pt04daily0.7https://blog.s3ich4n.me/books/clean-code/2023-01-27-pt06daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-03-pt07daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-03-pt08daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-10-pt09daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-10-pt10daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-17-pt01daily0.7https://blog.s3ich4n.me/books/clean-code/2023-02-24-pt01daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-11-pt01-ch01daily0.7https://blog.s3ich4n.me/books/clean-code/2023-03-07-pt01daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-13-pt01-ch02daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-13-pt01-ch03daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-15-pt01-ch04daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-16-pt01-ch05daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-17-pt01-ch07daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-16-pt01-ch06daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-04-17-pt02-ch08daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-06-pt02-ch09daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-07-pt02-ch10daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-18-pt02-ch10daily0.7https://blog.s3ich4n.me/books/cosmic-python/2023-05-18-pt02-ch12daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-21-pt01daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-21-pt02daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-23-pt03daily0.7https://blog.s3ich4n.me/books/pragmatic-programmer-1st/2018-02-24-pt04daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-06-28-pt01-ch01daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-06-30-pt01-ch02daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-07-01-pt01-ch03daily0.7https://blog.s3ich4n.me/books/unit-testing/2023-07-04-pt02-ch04daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-05-considering-http-authn-pt02daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-05-considering-http-authn-pt01daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-16-considering-authn-and-authz-revisited-pt01daily0.7https://blog.s3ich4n.me/devlog/backend/2022-10-17-considering-authn-and-authz-revisited-pt02daily0.7https://blog.s3ich4n.me/devlog/docker/2023-03-13-from-servlet-to-springdaily0.7https://blog.s3ich4n.me/devlog/data/2020-02-05-ksqldb-101-pt01daily0.7https://blog.s3ich4n.me/devlog/data/2020-02-17-ksqldb-101-pt01daily0.7https://blog.s3ich4n.me/devlog/data/2020-03-10-ksqldb-101-pt03daily0.7https://blog.s3ich4n.me/devlog/docker/2021-09-18-how-to-make-docker-image-securelydaily0.7https://blog.s3ich4n.me/devlog/python/2022-06-09-python-classmethod-and-staticmethoddaily0.7https://blog.s3ich4n.me/devlog/python/2022-06-10-python-descriptor-describeddaily0.7https://blog.s3ich4n.me/devlog/python/2024-10-13-python-container-101-pt01daily0.7https://blog.s3ich4n.me/devlog/python/2024-10-26-python-container-101-pt02daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-10-20-cloudneta-terraform-101-pt01daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-10-27-cloudneta-terraform-101-pt02daily0.7https://blog.s3ich4n.me/devlog/python/2023-01-22-probing-pep-333-3-wsgi-and-asgi-pt01daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-03-cloudneta-terraform-101-pt03daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-10-cloudneta-terraform-101-pt04daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-2daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-19-cloudneta-terraform-101-pt05-1daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-11-27-cloudneta-terraform-101-pt06daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-12-10-cloudneta-terraform-101-pt07daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-12-12-cloudneta-terraform-101-pt08daily0.7https://blog.s3ich4n.me/devlog/terraform/2022-12-13-cloudneta-terraform-101-pt09daily0.7https://blog.s3ich4n.me/category/booksdaily0.7https://blog.s3ich4n.me/category/books/page/1daily0.7https://blog.s3ich4n.me/category/books/page/2daily0.7https://blog.s3ich4n.me/category/devlogdaily0.7https://blog.s3ich4n.me/category/devlog/page/1daily0.7https://blog.s3ich4n.me/category/devlog/page/2daily0.7https://blog.s3ich4n.me/category/devlog/page/3daily0.7https://blog.s3ich4n.me/category/devlog/page/4daily0.7https://blog.s3ich4n.me/category/retrospectdaily0.7https://blog.s3ich4n.me/category/tipsdaily0.7https://blog.s3ich4n.me/category/tips/page/1daily0.7https://blog.s3ich4n.me/tag/pepdaily0.7https://blog.s3ich4n.me/tag/architecturedaily0.7https://blog.s3ich4n.me/tag/backenddaily0.7https://blog.s3ich4n.me/tag/backend/page/1daily0.7https://blog.s3ich4n.me/tag/backend/page/2daily0.7https://blog.s3ich4n.me/tag/book-reviewdaily0.7https://blog.s3ich4n.me/tag/book-review/page/1daily0.7https://blog.s3ich4n.me/tag/book-review/page/2daily0.7https://blog.s3ich4n.me/tag/booksdaily0.7https://blog.s3ich4n.me/tag/books/page/1daily0.7https://blog.s3ich4n.me/tag/code-qualitydaily0.7https://blog.s3ich4n.me/tag/code-quality/page/1daily0.7https://blog.s3ich4n.me/tag/code-quality/page/2daily0.7https://blog.s3ich4n.me/tag/coworkdaily0.7https://blog.s3ich4n.me/tag/data-processingdaily0.7https://blog.s3ich4n.me/tag/ddddaily0.7https://blog.s3ich4n.me/tag/ddd/page/1daily0.7https://blog.s3ich4n.me/tag/devlogdaily0.7https://blog.s3ich4n.me/tag/devopsdaily0.7https://blog.s3ich4n.me/tag/devops/page/1daily0.7https://blog.s3ich4n.me/tag/dockerdaily0.7https://blog.s3ich4n.me/tag/gatsbydaily0.7https://blog.s3ich4n.me/tag/geulttodaily0.7https://blog.s3ich4n.me/tag/gitdaily0.7https://blog.s3ich4n.me/tag/iacdaily0.7https://blog.s3ich4n.me/tag/iac/page/1daily0.7https://blog.s3ich4n.me/tag/javadaily0.7https://blog.s3ich4n.me/tag/jekylldaily0.7https://blog.s3ich4n.me/tag/lifedaily0.7https://blog.s3ich4n.me/tag/linuxdaily0.7https://blog.s3ich4n.me/tag/maintenancedaily0.7https://blog.s3ich4n.me/tag/ofmdaily0.7https://blog.s3ich4n.me/tag/pre-commitdaily0.7https://blog.s3ich4n.me/tag/pycharmdaily0.7https://blog.s3ich4n.me/tag/pythondaily0.7https://blog.s3ich4n.me/tag/python/page/1daily0.7https://blog.s3ich4n.me/tag/python/page/2daily0.7https://blog.s3ich4n.me/tag/reviewdaily0.7https://blog.s3ich4n.me/tag/shelldaily0.7https://blog.s3ich4n.me/tag/terraformdaily0.7https://blog.s3ich4n.me/tag/terraform/page/1daily0.7https://blog.s3ich4n.me/tag/vscodedaily0.7https://blog.s3ich4n.me/tag/webdaily0.7https://blog.s3ich4n.me/daily0.7https://blog.s3ich4n.me/page/1daily0.7https://blog.s3ich4n.me/page/2daily0.7https://blog.s3ich4n.me/page/3daily0.7https://blog.s3ich4n.me/page/4daily0.7https://blog.s3ich4n.me/page/5daily0.7https://blog.s3ich4n.me/page/6daily0.7https://blog.s3ich4n.me/page/7daily0.7https://blog.s3ich4n.me/page/8daily0.7https://blog.s3ich4n.me/page/9daily0.7https://blog.s3ich4n.me/page/10daily0.7 \ No newline at end of file diff --git a/static/13c8ea80289a195a226aad717c67eb86/103a1/01-python-container-simple.avif b/static/13c8ea80289a195a226aad717c67eb86/103a1/01-python-container-simple.avif new file mode 100644 index 00000000..e56c41b0 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/103a1/01-python-container-simple.avif differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/5cba8/01-python-container-simple.webp b/static/13c8ea80289a195a226aad717c67eb86/5cba8/01-python-container-simple.webp new file mode 100644 index 00000000..6864970d Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/5cba8/01-python-container-simple.webp differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/69770/01-python-container-simple.png b/static/13c8ea80289a195a226aad717c67eb86/69770/01-python-container-simple.png new file mode 100644 index 00000000..f8dcd473 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/69770/01-python-container-simple.png differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/8ac56/01-python-container-simple.webp b/static/13c8ea80289a195a226aad717c67eb86/8ac56/01-python-container-simple.webp new file mode 100644 index 00000000..85be7f5b Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/8ac56/01-python-container-simple.webp differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/8ff5a/01-python-container-simple.png b/static/13c8ea80289a195a226aad717c67eb86/8ff5a/01-python-container-simple.png new file mode 100644 index 00000000..9bd7d829 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/8ff5a/01-python-container-simple.png differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/95aeb/01-python-container-simple.png b/static/13c8ea80289a195a226aad717c67eb86/95aeb/01-python-container-simple.png new file mode 100644 index 00000000..88eaa895 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/95aeb/01-python-container-simple.png differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/a09fc/01-python-container-simple.avif b/static/13c8ea80289a195a226aad717c67eb86/a09fc/01-python-container-simple.avif new file mode 100644 index 00000000..39695a34 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/a09fc/01-python-container-simple.avif differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/a4da4/01-python-container-simple.webp b/static/13c8ea80289a195a226aad717c67eb86/a4da4/01-python-container-simple.webp new file mode 100644 index 00000000..07f4b027 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/a4da4/01-python-container-simple.webp differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/abecf/01-python-container-simple.avif b/static/13c8ea80289a195a226aad717c67eb86/abecf/01-python-container-simple.avif new file mode 100644 index 00000000..df529439 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/abecf/01-python-container-simple.avif differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/c6011/01-python-container-simple.webp b/static/13c8ea80289a195a226aad717c67eb86/c6011/01-python-container-simple.webp new file mode 100644 index 00000000..f526f220 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/c6011/01-python-container-simple.webp differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/dac8e/01-python-container-simple.png b/static/13c8ea80289a195a226aad717c67eb86/dac8e/01-python-container-simple.png new file mode 100644 index 00000000..4aa85f94 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/dac8e/01-python-container-simple.png differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/fbab0/01-python-container-simple.webp b/static/13c8ea80289a195a226aad717c67eb86/fbab0/01-python-container-simple.webp new file mode 100644 index 00000000..f526f220 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/fbab0/01-python-container-simple.webp differ diff --git a/static/13c8ea80289a195a226aad717c67eb86/fc1a1/01-python-container-simple.png b/static/13c8ea80289a195a226aad717c67eb86/fc1a1/01-python-container-simple.png new file mode 100644 index 00000000..f8dcd473 Binary files /dev/null and b/static/13c8ea80289a195a226aad717c67eb86/fc1a1/01-python-container-simple.png differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/0b58c/02-python-container-shared.avif b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/0b58c/03-python-container-shared.avif similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/0b58c/02-python-container-shared.avif rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/0b58c/03-python-container-shared.avif diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/3f48c/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/3f48c/03-python-container-shared.png similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/3f48c/02-python-container-shared.png rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/3f48c/03-python-container-shared.png diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/77227/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/77227/03-python-container-shared.png similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/77227/02-python-container-shared.png rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/77227/03-python-container-shared.png diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ac56/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ac56/02-python-container-shared.webp deleted file mode 100644 index 00894b7d..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ac56/02-python-container-shared.webp and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ff5a/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ff5a/02-python-container-shared.png deleted file mode 100644 index 0eb5dac2..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/8ff5a/02-python-container-shared.png and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/02-python-container-shared.webp deleted file mode 100644 index d6984bfc..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/02-python-container-shared.webp and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/2baf0/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/03-python-container-shared.webp similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/2baf0/02-python-container-shared.webp rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b0c43/03-python-container-shared.webp diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b8ed8/02-python-container-shared.avif b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b8ed8/03-python-container-shared.avif similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b8ed8/02-python-container-shared.avif rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/b8ed8/03-python-container-shared.avif diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c75cc/02-python-container-shared.avif b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c75cc/03-python-container-shared.avif similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c75cc/02-python-container-shared.avif rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c75cc/03-python-container-shared.avif diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c93c8/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c93c8/03-python-container-shared.webp similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c93c8/02-python-container-shared.webp rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c93c8/03-python-container-shared.webp diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d3be9/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d3be9/02-python-container-shared.webp deleted file mode 100644 index 924d1681..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d3be9/02-python-container-shared.webp and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/02-python-container-shared.png deleted file mode 100644 index ab59c293..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/02-python-container-shared.png and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c83ae/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/03-python-container-shared.png similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/c83ae/02-python-container-shared.png rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d5a94/03-python-container-shared.png diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d9199/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d9199/02-python-container-shared.png deleted file mode 100644 index 094c2c3a..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/d9199/02-python-container-shared.png and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e46b2/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e46b2/02-python-container-shared.webp deleted file mode 100644 index 9d093f9f..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e46b2/02-python-container-shared.webp and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e85cb/02-python-container-shared.png b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e85cb/02-python-container-shared.png deleted file mode 100644 index 424e2237..00000000 Binary files a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/e85cb/02-python-container-shared.png and /dev/null differ diff --git a/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/f5a44/02-python-container-shared.webp b/static/1d45d40b2c0ed1c49f1de1b0a02e32f6/f5a44/03-python-container-shared.webp similarity index 100% rename from static/1d45d40b2c0ed1c49f1de1b0a02e32f6/f5a44/02-python-container-shared.webp rename to static/1d45d40b2c0ed1c49f1de1b0a02e32f6/f5a44/03-python-container-shared.webp diff --git a/static/3e98425217ba1cc676b279553aac1cf6/07a9c/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/07a9c/01-docker-image-container-explained.png new file mode 100644 index 00000000..efc215b8 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/07a9c/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/093fa/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/093fa/01-docker-image-container-explained.png new file mode 100644 index 00000000..b80af875 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/093fa/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/1b275/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/1b275/01-docker-image-container-explained.webp new file mode 100644 index 00000000..66f9e841 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/1b275/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/29114/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/29114/01-docker-image-container-explained.png new file mode 100644 index 00000000..b58c28f8 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/29114/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/2a8cf/01-docker-image-container-explained.avif b/static/3e98425217ba1cc676b279553aac1cf6/2a8cf/01-docker-image-container-explained.avif new file mode 100644 index 00000000..352383f6 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/2a8cf/01-docker-image-container-explained.avif differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/51170/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/51170/01-docker-image-container-explained.webp new file mode 100644 index 00000000..dacb7050 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/51170/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/545d1/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/545d1/01-docker-image-container-explained.png new file mode 100644 index 00000000..591392ee Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/545d1/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/882b9/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/882b9/01-docker-image-container-explained.webp new file mode 100644 index 00000000..b7653ce2 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/882b9/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/8ac56/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/8ac56/01-docker-image-container-explained.webp new file mode 100644 index 00000000..165636b7 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/8ac56/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/8ca01/01-docker-image-container-explained.avif b/static/3e98425217ba1cc676b279553aac1cf6/8ca01/01-docker-image-container-explained.avif new file mode 100644 index 00000000..d3867901 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/8ca01/01-docker-image-container-explained.avif differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/8ff5a/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/8ff5a/01-docker-image-container-explained.png new file mode 100644 index 00000000..83a8aa6c Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/8ff5a/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/b84eb/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/b84eb/01-docker-image-container-explained.webp new file mode 100644 index 00000000..66f9e841 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/b84eb/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/bf31d/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/bf31d/01-docker-image-container-explained.png new file mode 100644 index 00000000..71d2f814 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/bf31d/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/d3be9/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/d3be9/01-docker-image-container-explained.webp new file mode 100644 index 00000000..72d0c715 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/d3be9/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/d9199/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/d9199/01-docker-image-container-explained.png new file mode 100644 index 00000000..5e797087 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/d9199/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/e0dd8/01-docker-image-container-explained.avif b/static/3e98425217ba1cc676b279553aac1cf6/e0dd8/01-docker-image-container-explained.avif new file mode 100644 index 00000000..79085cb6 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/e0dd8/01-docker-image-container-explained.avif differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/e38e1/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/e38e1/01-docker-image-container-explained.webp new file mode 100644 index 00000000..18383823 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/e38e1/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/e46b2/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/e46b2/01-docker-image-container-explained.webp new file mode 100644 index 00000000..3620b411 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/e46b2/01-docker-image-container-explained.webp differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/e85cb/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/e85cb/01-docker-image-container-explained.png new file mode 100644 index 00000000..89a4c4da Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/e85cb/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/e8950/01-docker-image-container-explained.png b/static/3e98425217ba1cc676b279553aac1cf6/e8950/01-docker-image-container-explained.png new file mode 100644 index 00000000..b80af875 Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/e8950/01-docker-image-container-explained.png differ diff --git a/static/3e98425217ba1cc676b279553aac1cf6/f992d/01-docker-image-container-explained.webp b/static/3e98425217ba1cc676b279553aac1cf6/f992d/01-docker-image-container-explained.webp new file mode 100644 index 00000000..a9f0c25d Binary files /dev/null and b/static/3e98425217ba1cc676b279553aac1cf6/f992d/01-docker-image-container-explained.webp differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/04701/01-python-container-simple.avif b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/04701/02-python-container-simple.avif similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/04701/01-python-container-simple.avif rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/04701/02-python-container-simple.avif diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/01-python-container-simple.avif b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/02-python-container-simple.avif similarity index 82% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/01-python-container-simple.avif rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/02-python-container-simple.avif index 6ebb7b59..9bda6bd7 100644 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/01-python-container-simple.avif and b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/741f9/02-python-container-simple.avif differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/01-python-container-simple.webp deleted file mode 100644 index 73f5998d..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/01-python-container-simple.webp and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/4b3db/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/02-python-container-simple.webp similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/4b3db/01-python-container-simple.webp rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/7a42f/02-python-container-simple.webp diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ac56/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ac56/01-python-container-simple.webp deleted file mode 100644 index 602a59e6..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ac56/01-python-container-simple.webp and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ff5a/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ff5a/01-python-container-simple.png deleted file mode 100644 index ab243b5a..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/8ff5a/01-python-container-simple.png and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/aa2a9/01-python-container-simple.avif b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/aa2a9/02-python-container-simple.avif similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/aa2a9/01-python-container-simple.avif rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/aa2a9/02-python-container-simple.avif diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/acea3/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/acea3/02-python-container-simple.webp similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/acea3/01-python-container-simple.webp rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/acea3/02-python-container-simple.webp diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/ae6be/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/ae6be/02-python-container-simple.webp similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/ae6be/01-python-container-simple.webp rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/ae6be/02-python-container-simple.webp diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/bb2dc/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/bb2dc/02-python-container-simple.png similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/bb2dc/01-python-container-simple.png rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/bb2dc/02-python-container-simple.png diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/cee1b/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/cee1b/02-python-container-simple.png similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/cee1b/01-python-container-simple.png rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/cee1b/02-python-container-simple.png diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d3be9/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d3be9/01-python-container-simple.webp deleted file mode 100644 index ee2d9e4b..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d3be9/01-python-container-simple.webp and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/01-python-container-simple.png deleted file mode 100644 index 1b978797..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/01-python-container-simple.png and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d74fe/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/02-python-container-simple.png similarity index 100% rename from static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d74fe/01-python-container-simple.png rename to static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9045/02-python-container-simple.png diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9199/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9199/01-python-container-simple.png deleted file mode 100644 index eba1f827..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/d9199/01-python-container-simple.png and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e46b2/01-python-container-simple.webp b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e46b2/01-python-container-simple.webp deleted file mode 100644 index fd3cec52..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e46b2/01-python-container-simple.webp and /dev/null differ diff --git a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e85cb/01-python-container-simple.png b/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e85cb/01-python-container-simple.png deleted file mode 100644 index 925068c5..00000000 Binary files a/static/6d7093f1d4ce49a8a2fe31a4c5427aa7/e85cb/01-python-container-simple.png and /dev/null differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/07afe/02-python-container-shared.avif b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/07afe/02-python-container-shared.avif new file mode 100644 index 00000000..d72c0f91 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/07afe/02-python-container-shared.avif differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/3f48c/02-python-container-shared.png b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/3f48c/02-python-container-shared.png new file mode 100644 index 00000000..e157e598 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/3f48c/02-python-container-shared.png differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/5ca24/02-python-container-shared.webp b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/5ca24/02-python-container-shared.webp new file mode 100644 index 00000000..c5261d52 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/5ca24/02-python-container-shared.webp differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/77227/02-python-container-shared.png b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/77227/02-python-container-shared.png new file mode 100644 index 00000000..4ad7a6fe Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/77227/02-python-container-shared.png differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ac56/02-python-container-shared.webp b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ac56/02-python-container-shared.webp new file mode 100644 index 00000000..1bb38fe6 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ac56/02-python-container-shared.webp differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ff5a/02-python-container-shared.png b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ff5a/02-python-container-shared.png new file mode 100644 index 00000000..0cbd69b1 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/8ff5a/02-python-container-shared.png differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/976f4/02-python-container-shared.webp b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/976f4/02-python-container-shared.webp new file mode 100644 index 00000000..03d8848d Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/976f4/02-python-container-shared.webp differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/b8ed8/02-python-container-shared.avif b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/b8ed8/02-python-container-shared.avif new file mode 100644 index 00000000..aaf29575 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/b8ed8/02-python-container-shared.avif differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c75cc/02-python-container-shared.avif b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c75cc/02-python-container-shared.avif new file mode 100644 index 00000000..b1218119 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c75cc/02-python-container-shared.avif differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c93c8/02-python-container-shared.webp b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c93c8/02-python-container-shared.webp new file mode 100644 index 00000000..c5261d52 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/c93c8/02-python-container-shared.webp differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/d3be9/02-python-container-shared.webp b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/d3be9/02-python-container-shared.webp new file mode 100644 index 00000000..14391c16 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/d3be9/02-python-container-shared.webp differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e75b7/02-python-container-shared.png b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e75b7/02-python-container-shared.png new file mode 100644 index 00000000..dce9c485 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e75b7/02-python-container-shared.png differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e85cb/02-python-container-shared.png b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e85cb/02-python-container-shared.png new file mode 100644 index 00000000..060f11f8 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/e85cb/02-python-container-shared.png differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/f5a44/02-python-container-shared.webp b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/f5a44/02-python-container-shared.webp new file mode 100644 index 00000000..1df03e76 Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/f5a44/02-python-container-shared.webp differ diff --git a/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/fcda8/02-python-container-shared.png b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/fcda8/02-python-container-shared.png new file mode 100644 index 00000000..4ad7a6fe Binary files /dev/null and b/static/c7fe6111e7706fe4a29ae1f54cdd0e5c/fcda8/02-python-container-shared.png differ diff --git a/sw.js b/sw.js index 11de9f1c..cac067db 100644 --- a/sw.js +++ b/sw.js @@ -36,14 +36,14 @@ self.__precacheManifest = [ "url": "styles.1fbe3e33e3d898c35e17.css" }, { - "url": "app-4f7f3a7ad20a05c933d6.js" + "url": "app-ea08e30339acd6ab79af.js" }, { "url": "offline-plugin-app-shell-fallback/index.html", - "revision": "fe235f90210221ea701bb1ad79eaea4e" + "revision": "2b2f92d99739adcba972fe2b37d98e5e" }, { - "url": "polyfill-d458e180ce0db2ade457.js" + "url": "polyfill-93be280e3dbf3699d675.js" }, { "url": "manifest.webmanifest", @@ -157,7 +157,7 @@ const navigationRoute = new NavigationRoute(async ({ event }) => { // Check for resources + the app bundle // The latter may not exist if the SW is updating to a new version const resources = await idbKeyval.get(`resources:${pathname}`) - if (!resources || !(await caches.match(`/app-4f7f3a7ad20a05c933d6.js`))) { + if (!resources || !(await caches.match(`/app-ea08e30339acd6ab79af.js`))) { return await fetch(event.request) } diff --git a/tag/architecture/index.html b/tag/architecture/index.html index 05f49beb..60dfc738 100644 --- a/tag/architecture/index.html +++ b/tag/architecture/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/backend/index.html b/tag/backend/index.html index 870b569f..b7b6679c 100644 --- a/tag/backend/index.html +++ b/tag/backend/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    backend

    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file +

    backend

    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/backend/page/1/index.html b/tag/backend/page/1/index.html index 57291b75..ece6f861 100644 --- a/tag/backend/page/1/index.html +++ b/tag/backend/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    backend

    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    devlog

    서블릿부터 스프링 프레임워크까지

    PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.

    Read
    devlog

    인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기

    OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.

    Read
    \ No newline at end of file +

    backend

    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    devlog

    서블릿부터 스프링 프레임워크까지

    PEP 333을 보고, 자바 진영의 서블릿과 웹 프레임워크의 금자탑인 스프링 프레임워크 까지 함께 알아보게 되었습니다.

    Read
    devlog

    인가를 다시 살펴보다 (2) OpenID Connect 스펙과 OAuth 2.0, OpenID Connect 구현체 살펴보기

    OAuth 2.0에 **인증** 을 추가한 OpenID Connect 스펙을 살펴보고, OpenID Connect의 주요 사항과 개념들, 그리고 유의사항에 대해 확인해보도록 하겠습니다.

    Read
    \ No newline at end of file diff --git a/tag/backend/page/2/index.html b/tag/backend/page/2/index.html index f00b5fb5..efa370d7 100644 --- a/tag/backend/page/2/index.html +++ b/tag/backend/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/book-review/index.html b/tag/book-review/index.html index 7589372e..f899210f 100644 --- a/tag/book-review/index.html +++ b/tag/book-review/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    book_review

    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    \ No newline at end of file +

    book_review

    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    \ No newline at end of file diff --git a/tag/book-review/page/1/index.html b/tag/book-review/page/1/index.html index 4f18c7d8..767dc2d8 100644 --- a/tag/book-review/page/1/index.html +++ b/tag/book-review/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    book_review

    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    \ No newline at end of file +

    book_review

    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    \ No newline at end of file diff --git a/tag/book-review/page/2/index.html b/tag/book-review/page/2/index.html index f4dfa5a3..6e00c129 100644 --- a/tag/book-review/page/2/index.html +++ b/tag/book-review/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    book_review

    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    books

    실용주의 프로그래머 pt. 4

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 4

    Read
    books

    실용주의 프로그래머 pt. 3

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 3

    Read
    books

    실용주의 프로그래머 pt. 1

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 1

    Read
    \ No newline at end of file +

    book_review

    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    books

    실용주의 프로그래머 pt. 4

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 4

    Read
    books

    실용주의 프로그래머 pt. 3

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 3

    Read
    books

    실용주의 프로그래머 pt. 1

    실용주의 프로그래머 2nd edition을 읽은 후... pt. 1

    Read
    \ No newline at end of file diff --git a/tag/books/index.html b/tag/books/index.html index e32d0d45..4d8b8c7e 100644 --- a/tag/books/index.html +++ b/tag/books/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file +

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/books/page/1/index.html b/tag/books/page/1/index.html index 0254036e..a498be96 100644 --- a/tag/books/page/1/index.html +++ b/tag/books/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    \ No newline at end of file +

    books

    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/code-quality/index.html b/tag/code-quality/index.html index ce60fc59..da42186b 100644 --- a/tag/code-quality/index.html +++ b/tag/code-quality/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    code_quality

    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    \ No newline at end of file +

    code_quality

    books

    단위 테스트 (4)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 4, 좋은 테스트의 4대 요소에 대한 내용입니다.

    Read
    books

    단위 테스트 (3)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 3, 단위 테스트 구조에 대한 내용입니다.

    Read
    books

    단위 테스트 (2)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 2, 단위 테스트란 무엇인가에 대한 내용입니다.

    Read
    books

    단위 테스트 (1)

    단위 테스트 를 읽고 이해한 내용을 작성합니다. 챕터 1, 단위 테스트의 목표에 대한 내용입니다.

    Read
    devlog

    클린 코드 스터디 (13): 동시성(Concurrency)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 13장, 동시성(concurrency)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (12): 창발성(Emergence)

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 12장, 창발성(Emergence)에 대해 알아봅니다.

    Read
    devlog

    클린 코드 스터디 (11): 시스템

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 11장, 시스템에 대해 알아봅니다.

    Read
    \ No newline at end of file diff --git a/tag/code-quality/page/1/index.html b/tag/code-quality/page/1/index.html index 13ce26f6..ffe7a85d 100644 --- a/tag/code-quality/page/1/index.html +++ b/tag/code-quality/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    code_quality

    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    \ No newline at end of file +

    code_quality

    devlog

    클린 코드 스터디 (10): 클래스

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 10장, 클래스에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (9): 단위 테스트

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 9장, 단위 테스트에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (8): 경계

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 8장, 경계에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (7): 오류 처리

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 7장, 오류 처리에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (6): 객체와 자료구조

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 6장, 객체와 자료 구조에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (5): 형식 맞추기

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 5장, 형식 맞추기에 대해 살펴봅니다.

    Read
    devlog

    클린 코드 스터디 (4): 주석

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 4장, 주석에 대해 설명합니다.

    Read
    \ No newline at end of file diff --git a/tag/code-quality/page/2/index.html b/tag/code-quality/page/2/index.html index b30923ce..c5719546 100644 --- a/tag/code-quality/page/2/index.html +++ b/tag/code-quality/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    code_quality

    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    \ No newline at end of file +

    code_quality

    devlog

    클린 코드 스터디 (3): 함수

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 3장, 함수에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (2): 의미있는 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 2장, 의미있는 코드에 대해 설명합니다.

    Read
    devlog

    클린 코드 스터디 (1): 깨끗한 코드

    2023년 1월부터 시작한 클린 코드 독파 스터디 후, 매 모임 전 준비하는 게시글을 공유합니다. 이 글은 1장, 깨끗한 코드에 대해 알아봅니다.

    Read
    \ No newline at end of file diff --git a/tag/cowork/index.html b/tag/cowork/index.html index 43ca9d95..70007e98 100644 --- a/tag/cowork/index.html +++ b/tag/cowork/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/data-processing/index.html b/tag/data-processing/index.html index 1f86fc1f..3804fd1f 100644 --- a/tag/data-processing/index.html +++ b/tag/data-processing/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/ddd/index.html b/tag/ddd/index.html index fdd0a684..73aa50c6 100644 --- a/tag/ddd/index.html +++ b/tag/ddd/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    ddd

    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file +

    ddd

    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/ddd/page/1/index.html b/tag/ddd/page/1/index.html index d79464c2..5a66758e 100644 --- a/tag/ddd/page/1/index.html +++ b/tag/ddd/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    ddd

    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    \ No newline at end of file +

    ddd

    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/devlog/index.html b/tag/devlog/index.html index 87a75765..ac99a17a 100644 --- a/tag/devlog/index.html +++ b/tag/devlog/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devlog

    retrospect

    [글또10기] 삶의 지도

    글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    retrospect

    1년차 회고

    2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)

    Read
    \ No newline at end of file +

    devlog

    retrospect

    [글또10기] 삶의 지도

    글또 10기를 지원하며, 개발자로 걸어온 길을 반추해 보았습니다. 어떤 삶을 살았고 앞으로는 어떤 길을 걸어야 할지 생각해 보았습니다. 이 이정표는 역시나 글이겠지요.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    retrospect

    1년차 회고

    2019년 입사부터 약 1년간 어떻게 살아왔는지에 대한 이야기입니다. (노잼)

    Read
    \ No newline at end of file diff --git a/tag/devops/index.html b/tag/devops/index.html index 5084d222..3ed978e3 100644 --- a/tag/devops/index.html +++ b/tag/devops/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devops

    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    \ No newline at end of file +

    devops

    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    \ No newline at end of file diff --git a/tag/devops/page/1/index.html b/tag/devops/page/1/index.html index 099300c0..1c825cf8 100644 --- a/tag/devops/page/1/index.html +++ b/tag/devops/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    devops

    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    devlog

    시작부터 배포까지: 도커 패키징의 베스트케이스

    PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.

    Read
    \ No newline at end of file +

    devops

    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    devlog

    시작부터 배포까지: 도커 패키징의 베스트케이스

    PyCon US 2021 발표영상 중, 파이썬 도커 이미지를 만드는 좋은 방법에 대한 동영상을 번역해봤습니다.

    Read
    \ No newline at end of file diff --git a/tag/docker/index.html b/tag/docker/index.html index efc14994..283d0000 100644 --- a/tag/docker/index.html +++ b/tag/docker/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/gatsby/index.html b/tag/gatsby/index.html index aed46ded..ae9ba84d 100644 --- a/tag/gatsby/index.html +++ b/tag/gatsby/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/geultto/index.html b/tag/geultto/index.html index 5e4f5399..d3327851 100644 --- a/tag/geultto/index.html +++ b/tag/geultto/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/git/index.html b/tag/git/index.html index 16373a78..10356efc 100644 --- a/tag/git/index.html +++ b/tag/git/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/iac/index.html b/tag/iac/index.html index c0c1c0ec..4cac81b6 100644 --- a/tag/iac/index.html +++ b/tag/iac/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    iac

    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    \ No newline at end of file +

    iac

    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    \ No newline at end of file diff --git a/tag/iac/page/1/index.html b/tag/iac/page/1/index.html index 7ff049e0..02eae179 100644 --- a/tag/iac/page/1/index.html +++ b/tag/iac/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    iac

    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    \ No newline at end of file +

    iac

    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    \ No newline at end of file diff --git a/tag/java/index.html b/tag/java/index.html index f83247e3..ce7d751b 100644 --- a/tag/java/index.html +++ b/tag/java/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/jekyll/index.html b/tag/jekyll/index.html index a178b5ac..421d5a7a 100644 --- a/tag/jekyll/index.html +++ b/tag/jekyll/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/life/index.html b/tag/life/index.html index 7e1a6da7..9158137b 100644 --- a/tag/life/index.html +++ b/tag/life/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/linux/index.html b/tag/linux/index.html index ddb59932..c9b4281a 100644 --- a/tag/linux/index.html +++ b/tag/linux/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/maintenance/index.html b/tag/maintenance/index.html index 70e8e532..340f9d28 100644 --- a/tag/maintenance/index.html +++ b/tag/maintenance/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/ofm/index.html b/tag/ofm/index.html index d14b51c6..5ef0a6fb 100644 --- a/tag/ofm/index.html +++ b/tag/ofm/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/pep/index.html b/tag/pep/index.html index 9d927f40..f130154c 100644 --- a/tag/pep/index.html +++ b/tag/pep/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/pre-commit/index.html b/tag/pre-commit/index.html index d2007f5e..ce2d0c67 100644 --- a/tag/pre-commit/index.html +++ b/tag/pre-commit/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/pycharm/index.html b/tag/pycharm/index.html index d1396372..54e62195 100644 --- a/tag/pycharm/index.html +++ b/tag/pycharm/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/python/index.html b/tag/python/index.html index f63491d5..a8b22f10 100644 --- a/tag/python/index.html +++ b/tag/python/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    python

    [연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해

    컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    \ No newline at end of file +

    python

    [연재] 파이썬 컨테이너 선택 제 2형 - 파이썬 컨테이너 최적화

    컨테이너 사이즈 최소화의 필요성과, 최소화 과정 중 파이썬 라이브러리 설치 과정에서의 최적화 제안(PEP 656)을 소개합니다.

    Read

    [연재] 파이썬 컨테이너 선택 제 1형 - 컨테이너에 대해

    컨테이너 기술에 대해 간략히 설명하고, 파이썬 컨테이너는 어떻게 선택할 수 있는지 대해 설명합니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (12)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (11)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 11, 이벤트 기반 아키텍처: 이벤트를 사용한 마이크로서비스 통합에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (10)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 10, 커맨드와 커맨드 핸들러에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (9)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 9, 메시지 버스 톺아보기에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (8)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 8, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/python/page/1/index.html b/tag/python/page/1/index.html index d0be1d13..a4d439f6 100644 --- a/tag/python/page/1/index.html +++ b/tag/python/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    python

    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    \ No newline at end of file +

    python

    books

    파이썬으로 살펴보는 아키텍처 패턴 (7)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 7, 애그리게이트와 일관성 경계에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (6)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 6, 작업단위 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (5)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 5, 높은 기어비와 낮은 기어비의 TDD에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (4)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 4, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (3)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 3, 결합과 추상화에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (2)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 2, 저장소 패턴에 대한 내용입니다.

    Read
    books

    파이썬으로 살펴보는 아키텍처 패턴 (1)

    파이썬으로 살펴보는 아키텍처 패턴을 읽고 이해한 내용을 작성합니다. 챕터 1, 도메인 모델링에 대한 내용입니다.

    Read
    \ No newline at end of file diff --git a/tag/python/page/2/index.html b/tag/python/page/2/index.html index 2fb5c92d..28bfa7cb 100644 --- a/tag/python/page/2/index.html +++ b/tag/python/page/2/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    python

    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    devlog

    PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)

    PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.

    Read
    devlog

    Python의 디스크립터에 대해 (1): 이론

    Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.

    Read

    "@classmethod" 와 "@staticmethod"에 대해

    Python의 "@classmethod" 와 "@staticmethod"에 대해

    Read
    \ No newline at end of file +

    python

    retrospect

    2023년 과제형 코딩 테스트 후기 (2)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 무엇이 모자랐고, 어떤 것을 집중해야할지 배운 내용에 대해 작성하였습니다.

    Read
    retrospect

    2023년 과제형 코딩 테스트 후기 (1)

    2월에 수행한 과제형 코딩 테스트에 대해 리뷰하는 글입니다. 이 글에서는 어떤 사항을 몸으로 익혔고, 무엇을 느꼈는지 주로 작성하였습니다.

    Read
    devlog

    PEP 공부해보기 - PEP 333, PEP 3333에 대하여 (1)

    PEP 시리즈 - PEP 333, PEP 3333 을 탐구합니다.

    Read
    devlog

    Python의 디스크립터에 대해 (1): 이론

    Python의 디스크립터에 대하여 공부한 내용을 정리하고자 글을 작성하였습니다. 2부에서는 실제 오픈소스들의 코드를 보고 해설할 예정입니다.

    Read

    "@classmethod" 와 "@staticmethod"에 대해

    Python의 "@classmethod" 와 "@staticmethod"에 대해

    Read
    \ No newline at end of file diff --git a/tag/review/index.html b/tag/review/index.html index 2f86b6cc..6830d1f8 100644 --- a/tag/review/index.html +++ b/tag/review/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/shell/index.html b/tag/shell/index.html index 59dced4d..bbc5ec21 100644 --- a/tag/shell/index.html +++ b/tag/shell/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/terraform/index.html b/tag/terraform/index.html index 2e088fd1..ab10a112 100644 --- a/tag/terraform/index.html +++ b/tag/terraform/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    terraform

    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    \ No newline at end of file +

    terraform

    devlog

    [CloudNet@] 테라폼 스터디 9주차 - Working with Multiple Providers

    Terraform을 통해 다양한 프로바이더에 대한 배포, 멀티 계정 활용 등에 대한 기본을 학습해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 8주차 - 프로덕션 수준의 테라폼 코드

    Terraform을 프로덕션 레벨 정도로 사용하려면 어느정도는 할 수 있어야하고, 어떤걸 살펴봐야 할까요? 이 포스팅에서는 그 부분을 공부해보았습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 7주차 - 총복습

    여태 스터디를 하며 배웠던 부분에 대한 one-point lesson을 해봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 6주차 - Managing Secrets with Terraform

    Terraform을 사용하며 인프라 프로비저닝 및 배포 시, 민감정보에 대해 관리하는 방안에 대해 작성하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (2) - 조건문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 조건문을 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 5주차 - Terraform의 반복문과 조건문 (1) - 반복문

    Terraform의 타입과 값이 어떻게 쓰이는지 알고있다는 가정 하에, 반복문과 조건문을 사용하여 로직을 표현하는 방법을 담았습니다. 그 중, 반복문을 먼저 살펴봅시다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 4주차 - Terraform의 module에 대하여

    Terraform의 module 에 대한 소개와, 어떻게 활용하는지, 그리고 주의사항과 모듈 버전관리에 대한 내용을 담았습니다.

    Read
    \ No newline at end of file diff --git a/tag/terraform/page/1/index.html b/tag/terraform/page/1/index.html index 9680ff2f..2be10dd7 100644 --- a/tag/terraform/page/1/index.html +++ b/tag/terraform/page/1/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() -

    terraform

    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    \ No newline at end of file +

    terraform

    devlog

    [CloudNet@] 테라폼 스터디 3주차 - Terraform 상태 격리방안

    Terraform 의 상태값에 대한 격리 방안에 대한 내용을 담고있습니다. 아울러 속성값 참고와 내장 함수에 대한 설명을 함께 추가하였습니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 2주차 - Terraform 을 통한 VPC, ALB, ASG 배포 실습

    Terraform 코드를 통해 VPC 구성과 ALB, ASG 설정을 작성하고, 데이터 소스 블록에 대해 학습합니다.

    Read
    devlog

    [CloudNet@] 테라폼 스터디 1주차 - Terraform의 기초

    Terraform의 등장배경과, 간략한 소개, 그리고 기초적인 예시를 통해 어떻게 사용하는지에 대한 내용을 담고 있습니다.

    Read
    \ No newline at end of file diff --git a/tag/vscode/index.html b/tag/vscode/index.html index 998ff85a..9007c382 100644 --- a/tag/vscode/index.html +++ b/tag/vscode/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tag/web/index.html b/tag/web/index.html index 6872aa99..dd17b16b 100644 --- a/tag/web/index.html +++ b/tag/web/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index 9eb9829b..55a15e75 100644 --- a/tags/index.html +++ b/tags/index.html @@ -78,4 +78,4 @@ setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light')); }() - \ No newline at end of file + \ No newline at end of file diff --git a/tips/2019-04-19-jekyll-liquid-issue/index.html b/tips/2019-04-19-jekyll-liquid-issue/index.html index 3bf39a70..cd89445e 100644 --- a/tips/2019-04-19-jekyll-liquid-issue/index.html +++ b/tips/2019-04-19-jekyll-liquid-issue/index.html @@ -89,4 +89,4 @@ {%{% endraw %} endraw %}

    References:

    -

    jekyll issue #4569

    Published Apr 19, 2019

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    jekyll issue #4569

    Published Apr 19, 2019

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2021-02-03-server-maintenance-guide/index.html b/tips/2021-02-03-server-maintenance-guide/index.html index 99b8c15b..3611034d 100644 --- a/tips/2021-02-03-server-maintenance-guide/index.html +++ b/tips/2021-02-03-server-maintenance-guide/index.html @@ -401,4 +401,4 @@

    https://brunch.co.kr/@daniellim/19
  • https://www.mimul.com/blog/linux-server-operations/
  • https://netflixtechblog.com/linux-performance-analysis-in-60-000-milliseconds-accc10403c55
  • -

    Published Feb 3, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Feb 3, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2021-07-11-how-to-use-pre-commit-hook-vol1/index.html b/tips/2021-07-11-how-to-use-pre-commit-hook-vol1/index.html index 95786110..d0459af6 100644 --- a/tips/2021-07-11-how-to-use-pre-commit-hook-vol1/index.html +++ b/tips/2021-07-11-how-to-use-pre-commit-hook-vol1/index.html @@ -138,4 +138,4 @@

    CI 연동
  • 더 없나 찾아보자
  • -

    Published Jun 3, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jun 3, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2021-09-05-what-is-wrong-with-my-vscode-tab/index.html b/tips/2021-09-05-what-is-wrong-with-my-vscode-tab/index.html index 1c39378e..2bcb06d2 100644 --- a/tips/2021-09-05-what-is-wrong-with-my-vscode-tab/index.html +++ b/tips/2021-09-05-what-is-wrong-with-my-vscode-tab/index.html @@ -242,4 +242,4 @@

    VSCode의 Show all commands 가 정말 꿀기능 이었습니다. 필요한 커맨드를 찾고 바로 수행할 수가 있네요.

    마무리

    -

    별 것 아닌 내용이지만, 괜히 지웠다 깔 필요 없이 다음번에도 헤메지 않기 위해 메모했습니다. 별 것 아니지만, 여러분들께도 도움이 되길 바랍니다. 감사합니다.

    Published Sep 5, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    별 것 아닌 내용이지만, 괜히 지웠다 깔 필요 없이 다음번에도 헤메지 않기 위해 메모했습니다. 별 것 아니지만, 여러분들께도 도움이 되길 바랍니다. 감사합니다.

    Published Sep 5, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2022-10-08-meaning-of-z-in-shell-script/index.html b/tips/2022-10-08-meaning-of-z-in-shell-script/index.html index ddc62ca4..3618c451 100644 --- a/tips/2022-10-08-meaning-of-z-in-shell-script/index.html +++ b/tips/2022-10-08-meaning-of-z-in-shell-script/index.html @@ -213,4 +213,4 @@

    extended-test의 패턴 매칭관련 -

    Published Oct 8, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 8, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file/index.html b/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file/index.html index 6d4f6271..d95bc72d 100644 --- a/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file/index.html +++ b/tips/2022-10-10-why-should-i-put-eol-at-the-end-of-file/index.html @@ -231,4 +231,4 @@

    EOL을 넣어야 하는 이유와 운영체제별 EOL(EndOfLine) 차이로 인한 Git 문제 해결 -

    Published Oct 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Oct 10, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2022-12-30-total-commander-101-pt01/index.html b/tips/2022-12-30-total-commander-101-pt01/index.html index 39ffa9a2..40e48048 100644 --- a/tips/2022-12-30-total-commander-101-pt01/index.html +++ b/tips/2022-12-30-total-commander-101-pt01/index.html @@ -485,4 +485,4 @@

    마무리

    -

    이 정도만 해도 제가 쓰는 완전 기본적인 내용은 소개가 된 듯 합니다. 향후에도 괜찮은 내용이 있다면 소개드리겠습니다. 봐주셔서 감사합니다.

    Published Dec 30, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    이 정도만 해도 제가 쓰는 완전 기본적인 내용은 소개가 된 듯 합니다. 향후에도 괜찮은 내용이 있다면 소개드리겠습니다. 봐주셔서 감사합니다.

    Published Dec 30, 2022

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2023-01-02-total-commander-101-pt02/index.html b/tips/2023-01-02-total-commander-101-pt02/index.html index e0b423d6..79fbd0f0 100644 --- a/tips/2023-01-02-total-commander-101-pt02/index.html +++ b/tips/2023-01-02-total-commander-101-pt02/index.html @@ -573,4 +573,4 @@

    반디집 파라미터 -

    Published Jan 2, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jan 2, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/2023-01-04-gatsby-add-image-captions/index.html b/tips/2023-01-04-gatsby-add-image-captions/index.html index e62b76f4..ce2e24e0 100644 --- a/tips/2023-01-04-gatsby-add-image-captions/index.html +++ b/tips/2023-01-04-gatsby-add-image-captions/index.html @@ -203,4 +203,4 @@

    마무리

    그 외에도 여러 옵션이 있습니다. 필요에 따라 플러그인 옵션을 제어하면 보다 입맛에 맞는 블로그 설정을 줄 수 있겠네요. 앞으로도 더 알고 쓰면 좋겠네요.

    -

    짧은 글 읽어주셔서 감사합니다.

    Published Jan 4, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    짧은 글 읽어주셔서 감사합니다.

    Published Jan 4, 2023

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/tips/how-to-use-file-signature-in-pycharm/index.html b/tips/how-to-use-file-signature-in-pycharm/index.html index e3107aa2..b2bb4e16 100644 --- a/tips/how-to-use-file-signature-in-pycharm/index.html +++ b/tips/how-to-use-file-signature-in-pycharm/index.html @@ -116,4 +116,4 @@
  • 파일을 열 때마다 sign_s3ich4n 를 한두글자만 치면 자동완성으로 알아서 완성된다.

  • -

    Published Jun 3, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file +

    Published Jun 3, 2021

    Non scholæ sed vitæ discimus.

    his/him

    \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json index 7ddcee6f..81e0817c 100644 --- a/webpack.stats.json +++ b/webpack.stats.json @@ -1 +1 @@ -{"name":"build-javascript","namedChunkGroups":{"polyfill":{"name":"polyfill","assets":[{"name":"webpack-runtime-de5a94456c9c32f6cdb9.js","size":6185},{"name":"polyfill-d458e180ce0db2ade457.js","size":85235}],"filteredAssets":0,"assetsSize":91420,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":233636},"app":{"name":"app","assets":[{"name":"webpack-runtime-de5a94456c9c32f6cdb9.js","size":6185},{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"app-4f7f3a7ad20a05c933d6.js","size":427094}],"filteredAssets":0,"assetsSize":677826,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":2261018},"component---cache-caches-gatsby-plugin-offline-app-shell-js":{"name":"component---cache-caches-gatsby-plugin-offline-app-shell-js","assets":[{"name":"component---cache-caches-gatsby-plugin-offline-app-shell-js-0c915c7b1bdb5eac4fdf.js","size":535}],"filteredAssets":0,"assetsSize":535,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":1675},"component---src-templates-categories-template-categories-template-tsx":{"name":"component---src-templates-categories-template-categories-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-categories-template-categories-template-tsx-e2d2add397e32e3517ca.js","size":844}],"filteredAssets":0,"assetsSize":600548,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1760065},"component---src-templates-category-template-category-template-tsx":{"name":"component---src-templates-category-template-category-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-category-template-category-template-tsx-078f2adfba160a34229f.js","size":3017}],"filteredAssets":0,"assetsSize":602721,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1767540},"component---src-templates-index-template-index-template-tsx":{"name":"component---src-templates-index-template-index-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-index-template-index-template-tsx-83380c7954c9f6621026.js","size":2985}],"filteredAssets":0,"assetsSize":602689,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1767302},"component---src-templates-not-found-template-not-found-template-tsx":{"name":"component---src-templates-not-found-template-not-found-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-not-found-template-not-found-template-tsx-56fe4d3b015459d56c99.js","size":803}],"filteredAssets":0,"assetsSize":600507,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1759527},"component---src-templates-page-template-page-template-tsx":{"name":"component---src-templates-page-template-page-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-page-template-page-template-tsx-c6c21d7369a9356db3a1.js","size":900}],"filteredAssets":0,"assetsSize":600604,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1760764},"component---src-templates-post-template-post-template-tsx":{"name":"component---src-templates-post-template-post-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"component---src-templates-post-template-post-template-tsx-119cd0258cb38628d01f.js","size":3214}],"filteredAssets":0,"assetsSize":590369,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":1691098},"component---src-templates-tag-template-tag-template-tsx":{"name":"component---src-templates-tag-template-tag-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-tag-template-tag-template-tsx-8d0b3090e775aa3c4584.js","size":3006}],"filteredAssets":0,"assetsSize":602710,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1767584},"component---src-templates-tags-template-tags-template-tsx":{"name":"component---src-templates-tags-template-tags-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-tags-template-tags-template-tsx-30027e87af7d042f3afb.js","size":816}],"filteredAssets":0,"assetsSize":600520,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1759941}},"assetsByChunkName":{"polyfill":["webpack-runtime-de5a94456c9c32f6cdb9.js","polyfill-d458e180ce0db2ade457.js"],"app":["webpack-runtime-de5a94456c9c32f6cdb9.js","framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","app-4f7f3a7ad20a05c933d6.js"],"component---cache-caches-gatsby-plugin-offline-app-shell-js":["component---cache-caches-gatsby-plugin-offline-app-shell-js-0c915c7b1bdb5eac4fdf.js"],"component---src-templates-categories-template-categories-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-categories-template-categories-template-tsx-e2d2add397e32e3517ca.js"],"component---src-templates-category-template-category-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-category-template-category-template-tsx-078f2adfba160a34229f.js"],"component---src-templates-index-template-index-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-index-template-index-template-tsx-83380c7954c9f6621026.js"],"component---src-templates-not-found-template-not-found-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-not-found-template-not-found-template-tsx-56fe4d3b015459d56c99.js"],"component---src-templates-page-template-page-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-page-template-page-template-tsx-c6c21d7369a9356db3a1.js"],"component---src-templates-post-template-post-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","component---src-templates-post-template-post-template-tsx-119cd0258cb38628d01f.js"],"component---src-templates-tag-template-tag-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-tag-template-tag-template-tsx-8d0b3090e775aa3c4584.js"],"component---src-templates-tags-template-tags-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-tags-template-tags-template-tsx-30027e87af7d042f3afb.js"]},"childAssetsByChunkName":{}} \ No newline at end of file +{"name":"build-javascript","namedChunkGroups":{"polyfill":{"name":"polyfill","assets":[{"name":"webpack-runtime-de5a94456c9c32f6cdb9.js","size":6185},{"name":"polyfill-93be280e3dbf3699d675.js","size":85235}],"filteredAssets":0,"assetsSize":91420,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":233636},"app":{"name":"app","assets":[{"name":"webpack-runtime-de5a94456c9c32f6cdb9.js","size":6185},{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"app-ea08e30339acd6ab79af.js","size":427094}],"filteredAssets":0,"assetsSize":677826,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":2261018},"component---cache-caches-gatsby-plugin-offline-app-shell-js":{"name":"component---cache-caches-gatsby-plugin-offline-app-shell-js","assets":[{"name":"component---cache-caches-gatsby-plugin-offline-app-shell-js-0c915c7b1bdb5eac4fdf.js","size":535}],"filteredAssets":0,"assetsSize":535,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":1675},"component---src-templates-categories-template-categories-template-tsx":{"name":"component---src-templates-categories-template-categories-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-categories-template-categories-template-tsx-e2d2add397e32e3517ca.js","size":844}],"filteredAssets":0,"assetsSize":600548,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1760065},"component---src-templates-category-template-category-template-tsx":{"name":"component---src-templates-category-template-category-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-category-template-category-template-tsx-078f2adfba160a34229f.js","size":3017}],"filteredAssets":0,"assetsSize":602721,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1767540},"component---src-templates-index-template-index-template-tsx":{"name":"component---src-templates-index-template-index-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-index-template-index-template-tsx-83380c7954c9f6621026.js","size":2985}],"filteredAssets":0,"assetsSize":602689,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1767302},"component---src-templates-not-found-template-not-found-template-tsx":{"name":"component---src-templates-not-found-template-not-found-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-not-found-template-not-found-template-tsx-56fe4d3b015459d56c99.js","size":803}],"filteredAssets":0,"assetsSize":600507,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1759527},"component---src-templates-page-template-page-template-tsx":{"name":"component---src-templates-page-template-page-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-page-template-page-template-tsx-c6c21d7369a9356db3a1.js","size":900}],"filteredAssets":0,"assetsSize":600604,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1760764},"component---src-templates-post-template-post-template-tsx":{"name":"component---src-templates-post-template-post-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"component---src-templates-post-template-post-template-tsx-119cd0258cb38628d01f.js","size":3214}],"filteredAssets":0,"assetsSize":590369,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":1691098},"component---src-templates-tag-template-tag-template-tsx":{"name":"component---src-templates-tag-template-tag-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-tag-template-tag-template-tsx-8d0b3090e775aa3c4584.js","size":3006}],"filteredAssets":0,"assetsSize":602710,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1767584},"component---src-templates-tags-template-tags-template-tsx":{"name":"component---src-templates-tags-template-tags-template-tsx","assets":[{"name":"framework-481a1b6416c14416b2fb.js","size":225341},{"name":"styles.1fbe3e33e3d898c35e17.css","size":19206},{"name":"5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","size":342608},{"name":"cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","size":12549},{"name":"component---src-templates-tags-template-tags-template-tsx-30027e87af7d042f3afb.js","size":816}],"filteredAssets":0,"assetsSize":600520,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":1759941}},"assetsByChunkName":{"polyfill":["webpack-runtime-de5a94456c9c32f6cdb9.js","polyfill-93be280e3dbf3699d675.js"],"app":["webpack-runtime-de5a94456c9c32f6cdb9.js","framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","app-ea08e30339acd6ab79af.js"],"component---cache-caches-gatsby-plugin-offline-app-shell-js":["component---cache-caches-gatsby-plugin-offline-app-shell-js-0c915c7b1bdb5eac4fdf.js"],"component---src-templates-categories-template-categories-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-categories-template-categories-template-tsx-e2d2add397e32e3517ca.js"],"component---src-templates-category-template-category-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-category-template-category-template-tsx-078f2adfba160a34229f.js"],"component---src-templates-index-template-index-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-index-template-index-template-tsx-83380c7954c9f6621026.js"],"component---src-templates-not-found-template-not-found-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-not-found-template-not-found-template-tsx-56fe4d3b015459d56c99.js"],"component---src-templates-page-template-page-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-page-template-page-template-tsx-c6c21d7369a9356db3a1.js"],"component---src-templates-post-template-post-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","component---src-templates-post-template-post-template-tsx-119cd0258cb38628d01f.js"],"component---src-templates-tag-template-tag-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-tag-template-tag-template-tsx-8d0b3090e775aa3c4584.js"],"component---src-templates-tags-template-tags-template-tsx":["framework-481a1b6416c14416b2fb.js","styles.1fbe3e33e3d898c35e17.css","5576a503ee3134145eb2de8ee0bcd322ef9007e9-d339b2df9a35876e888d.js","cfe4c78499ef4c57d2caa026eb88c0600d550e03-3ecbf5480880d49d59c1.js","component---src-templates-tags-template-tags-template-tsx-30027e87af7d042f3afb.js"]},"childAssetsByChunkName":{}} \ No newline at end of file