diff --git a/2020/404.html b/2020/404.html index 89a1db2..860b113 100644 --- a/2020/404.html +++ b/2020/404.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/_nuxt/37e3623d855b13baa508.js b/2020/_nuxt/a46cbd806a7fabac606b.js similarity index 90% rename from 2020/_nuxt/37e3623d855b13baa508.js rename to 2020/_nuxt/a46cbd806a7fabac606b.js index e25271e..9c87076 100644 --- a/2020/_nuxt/37e3623d855b13baa508.js +++ b/2020/_nuxt/a46cbd806a7fabac606b.js @@ -1 +1 @@ -!function(e){function r(data){for(var r,n,c=data[0],d=data[1],l=data[2],i=0,h=[];i=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function _(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i1&&void 0!==arguments[1]?arguments[1]:[],r=t.$children||[],o=f(r);try{for(o.s();!(e=o.n()).done;){var c=e.value;c.$fetch?n.push(c):c.$children&&w(c,n)}}catch(t){o.e(t)}finally{o.f()}return n}function k(t,e){if(e||!t.options.__hasNuxtData){var n=t.options._originDataFn||t.options.data||function(){return{}};t.options._originDataFn=n,t.options.data=function(){var data=n.call(this,this);return this.$ssrContext&&(e=this.$ssrContext.asyncData[t.cid]),h(h({},data),e)},t.options.__hasNuxtData=!0,t._Ctor&&t._Ctor.options&&(t._Ctor.options.data=t.options.data)}}function j(t){return t.options&&t._Ctor===t||(t.options?(t._Ctor=t,t.extendOptions=t.options):(t=d.a.extend(t))._Ctor=t,!t.options.name&&t.options.__file&&(t.options.name=t.options.__file)),t}function O(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"components";return Array.prototype.concat.apply([],t.matched.map((function(t,r){return Object.keys(t[n]).map((function(o){return e&&e.push(r),t[n][o]}))})))}function P(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return O(t,e,"instances")}function E(t,e){return Array.prototype.concat.apply([],t.matched.map((function(t,n){return Object.keys(t.components).reduce((function(r,o){return t.components[o]?r.push(e(t.components[o],t.instances[o],t,o,n)):delete t.components[o],r}),[])})))}function C(t,e){return Promise.all(E(t,function(){var t=Object(c.a)(regeneratorRuntime.mark((function t(n,r,o,c){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if("function"!=typeof n||n.options){t.next=4;break}return t.next=3,n();case 3:n=t.sent;case 4:return o.components[c]=n=j(n),t.abrupt("return","function"==typeof e?e(n,r,o,c):n);case 6:case"end":return t.stop()}}),t)})));return function(e,n,r,o){return t.apply(this,arguments)}}()))}function L(t){return D.apply(this,arguments)}function D(){return(D=Object(c.a)(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=2;break}return t.abrupt("return");case 2:return t.next=4,C(e);case 4:return t.abrupt("return",h(h({},e),{},{meta:O(e).map((function(t,n){return h(h({},t.options.meta),(e.matched[n]||{}).meta)}))}));case 5:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function R(t,e){return $.apply(this,arguments)}function $(){return($=Object(c.a)(regeneratorRuntime.mark((function t(e,n){var c,l,d,m;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.context||(e.context={isStatic:!0,isDev:!1,isHMR:!1,app:e,payload:n.payload,error:n.error,base:"/",env:{targetBranch:"staging",TARGET_BRANCH:"staging"}},n.req&&(e.context.req=n.req),n.res&&(e.context.res=n.res),n.ssrContext&&(e.context.ssrContext=n.ssrContext),e.context.redirect=function(t,path,n){if(t){e.context._redirected=!0;var r=Object(o.a)(path);if("number"==typeof t||"undefined"!==r&&"object"!==r||(n=path||{},path=t,r=Object(o.a)(path),t=302),"object"===r&&(path=e.router.resolve(path).route.fullPath),!/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path))throw path=F(path,n),window.location.replace(path),new Error("ERR_REDIRECT");e.context.next({path:path,query:n,status:t})}},e.context.nuxtState=window.__NUXT__),t.next=3,Promise.all([L(n.route),L(n.from)]);case 3:c=t.sent,l=Object(r.a)(c,2),d=l[0],m=l[1],n.route&&(e.context.route=d),n.from&&(e.context.from=m),e.context.next=n.next,e.context._redirected=!1,e.context._errored=!1,e.context.isHMR=!1,e.context.params=e.context.route.params||{},e.context.query=e.context.route.query||{};case 15:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function A(t,e){return!t.length||e._redirected||e._errored?Promise.resolve():I(t[0],e).then((function(){return A(t.slice(1),e)}))}function I(t,e){var n;return(n=2===t.length?new Promise((function(n){t(e,(function(t,data){t&&e.error(t),n(data=data||{})}))})):t(e))&&n instanceof Promise&&"function"==typeof n.then?n:Promise.resolve(n)}function T(base,t){var path=decodeURI(window.location.pathname);return"hash"===t?window.location.hash.replace(/^#\//,""):(base&&0===path.indexOf(base)&&(path=path.slice(base.length)),(path||"/")+window.location.search+window.location.hash)}function M(t,e){return function(t,e){for(var n=new Array(t.length),i=0;i=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function _unsupportedIterableToArray(t,e){if(t){if("string"==typeof t)return _arrayLikeToArray(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(t,e):void 0}}function _arrayLikeToArray(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i0)){t.next=18;break}return t.next=18,new Promise((function(t){return setTimeout(t,r)}));case 18:this.$fetchState.error=e,this.$fetchState.pending=!1,this.$fetchState.timestamp=Date.now(),this.$nextTick((function(){return o.$nuxt.nbFetching--}));case 22:case"end":return t.stop()}}),t,this,[[6,11]])})))).apply(this,arguments)}e.a={beforeCreate:function(){Object(c.l)(this)&&(this._fetchDelay="number"==typeof this.$options.fetchDelay?this.$options.fetchDelay:200,o.a.util.defineReactive(this,"$fetchState",{pending:!1,error:null,timestamp:Date.now()}),this.$fetch=h.bind(this),Object(c.a)(this,"created",m),Object(c.a)(this,"beforeMount",d))}}},177:function(t,e,n){t.exports=n(178)},178:function(t,e,n){"use strict";n.r(e),function(t){n(31),n(20),n(29),n(24),n(25),n(30);var e=n(18),r=(n(19),n(124),n(4)),o=(n(28),n(39),n(13),n(9),n(41),n(16),n(127),n(188),n(193),n(195),n(2)),c=n(164),l=n(62),d=n(1),m=n(27),h=n(172),f=n(81);function _(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return y(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 y(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function y(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i2?e-2:0),r=2;r*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-16-9{padding-bottom:56.25%}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.5rem*var(--space-y-reverse))}.space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.5rem*var(--space-x-reverse));margin-left:calc(0.5rem*(1 - var(--space-x-reverse)))}.space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem*var(--space-y-reverse))}.space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem*(1 - var(--space-y-reverse)));margin-bottom:calc(3rem*var(--space-y-reverse))}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-py-black{--bg-opacity:1;background-color:#404a6b;background-color:rgba(64,74,107,var(--bg-opacity))}.bg-py-blue-light{--bg-opacity:1;background-color:#d4d4ff;background-color:rgba(212,212,255,var(--bg-opacity))}.bg-py-orange-light{--bg-opacity:1;background-color:#ffd8a1;background-color:rgba(255,216,161,var(--bg-opacity))}.bg-py-blue-dark{--bg-opacity:1;background-color:#3d40cb;background-color:rgba(61,64,203,var(--bg-opacity))}.bg-py-orange-dark{--bg-opacity:1;background-color:#ee9d2c;background-color:rgba(238,157,44,var(--bg-opacity))}.hover\\:bg-py-black:hover{--bg-opacity:1;background-color:#404a6b;background-color:rgba(64,74,107,var(--bg-opacity))}.hover\\:bg-py-blue-light:hover{--bg-opacity:1;background-color:#d4d4ff;background-color:rgba(212,212,255,var(--bg-opacity))}.hover\\:bg-py-blue-dark:hover{--bg-opacity:1;background-color:#3d40cb;background-color:rgba(61,64,203,var(--bg-opacity))}.group:hover .group-hover\\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-py-black{--border-opacity:1;border-color:#404a6b;border-color:rgba(64,74,107,var(--border-opacity))}.border-py-blue-dark{--border-opacity:1;border-color:#3d40cb;border-color:rgba(61,64,203,var(--border-opacity))}.border-py-orange-dark{--border-opacity:1;border-color:#ee9d2c;border-color:rgba(238,157,44,var(--border-opacity))}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-xl{border-radius:4rem}.rounded-2xl{border-radius:8rem}.rounded-py{border-radius:98px}.rounded-card-head{border-radius:2.35rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-2xl{border-top-right-radius:8rem;border-bottom-right-radius:8rem}.rounded-l-2xl{border-top-left-radius:8rem;border-bottom-left-radius:8rem}.border-solid{border-style:solid}.border-double{border-style:double}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r-4{border-right-width:4px}.border-t{border-top-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.box-border{box-sizing:border-box}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.self-center{align-self:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-1{flex:1 1 0%}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-black{font-weight:900}.h-2{height:.5rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-64{height:16rem}.h-80{height:20rem}.h-120{height:30rem}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.leading-7{line-height:1.75rem}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-0{margin:0}.m-4{margin:1rem}.m-8{margin:2rem}.m-screen{margin:0 calc(50% - 50vw)}.my-0{margin-top:0;margin-bottom:0}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-16{margin-top:4rem;margin-bottom:4rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mr-3{margin-right:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.mt-10{margin-top:2.5rem}.ml-10{margin-left:2.5rem}.mt-12{margin-top:3rem}.mr-12{margin-right:3rem}.mb-12{margin-bottom:3rem}.ml-12{margin-left:3rem}.mt-16{margin-top:4rem}.mb-16{margin-bottom:4rem}.mt-20{margin-top:5rem}.mb-20{margin-bottom:5rem}.mt-24{margin-top:6rem}.mb-24{margin-bottom:6rem}.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-mt-6{margin-top:-1.5rem}.-mt-8{margin-top:-2rem}.-ml-10{margin-left:-2.5rem}.-mt-16{margin-top:-4rem}.max-w-screen-xl{max-width:1280px}.min-h-screen{min-height:100vh}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.object-right{-o-object-position:right;object-position:right}.object-top{-o-object-position:top;object-position:top}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-100{opacity:1}.focus\\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-scroll{overflow-x:scroll}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pt-2{padding-top:.5rem}.pb-4{padding-bottom:1rem}.pl-6{padding-left:1.5rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pt-12{padding-top:3rem}.pb-12{padding-bottom:3rem}.pt-24{padding-top:6rem}.pb-24{padding-bottom:6rem}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.left-1\\/2{left:50%}.left-3\\/4{left:75%}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-right{box-shadow:10px 10px 15px -3px rgba(0,0,0,.1),4px 4px 6px -2px rgba(0,0,0,.05)}.shadow-left{box-shadow:-10px 10px 15px -3px rgba(0,0,0,.1),-4px 4px 6px -2px rgba(0,0,0,.05)}.focus\\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.text-left{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.text-py-black{--text-opacity:1;color:#404a6b;color:rgba(64,74,107,var(--text-opacity))}.text-py-blue-dark{--text-opacity:1;color:#3d40cb;color:rgba(61,64,203,var(--text-opacity))}.hover\\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.hover\\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.hover\\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.hover\\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.hover\\:text-py-blue-light:hover{--text-opacity:1;color:#d4d4ff;color:rgba(212,212,255,var(--text-opacity))}.group:hover .group-hover\\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.hover\\:underline:hover{text-decoration:underline}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.align-middle{vertical-align:middle}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-2{width:.5rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-12{width:3rem}.w-20{width:5rem}.w-24{width:6rem}.w-40{width:10rem}.w-2\\/3{width:66.666667%}.w-1\\/4{width:25%}.w-3\\/4{width:75%}.w-1\\/5{width:20%}.w-4\\/5{width:80%}.w-1\\/6{width:16.666667%}.w-5\\/6{width:83.333333%}.w-8\\/12{width:66.666667%}.w-10\\/12{width:83.333333%}.w-11\\/12{width:91.666667%}.w-full{width:100%}.w-screen{width:100vw}.w-35vw{width:35vw}.w-50vw{width:50vw}.w-70vw{width:70vw}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.gap-2{grid-gap:.5rem;gap:.5rem}.gap-4{grid-gap:1rem;gap:1rem}.row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.grid-flow-row{grid-auto-flow:row}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.rotate-0{--transform-rotate:0}.rotate-180{--transform-rotate:180deg}.translate-x-12{--transform-translate-x:3rem}.translate-x-20{--transform-translate-x:5rem}.-translate-x-12{--transform-translate-x:-3rem}.-translate-x-20{--transform-translate-x:-5rem}.transition-all{transition-property:all}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.transition-colors{transition-property:background-color,border-color,color,fill,stroke}.transition-transform{transition-property:transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}body{font-family:Rounded Mplus\\ 1c,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:unset}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:2dppx),only screen and(-webkit-min-device-pixel-ratio:2){body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@media (min-width:480px){.sm\\:items-start{align-items:flex-start}.sm\\:text-lg{font-size:1.125rem}.sm\\:text-xl{font-size:1.25rem}.sm\\:text-2xl{font-size:1.5rem}.sm\\:text-3xl{font-size:1.875rem}.sm\\:px-8{padding-left:2rem;padding-right:2rem}.sm\\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:768px){.md\\:rounded-full{border-radius:9999px}.md\\:rounded-xl{border-radius:4rem}.md\\:block{display:block}.md\\:inline{display:inline}.md\\:flex-row{flex-direction:row}.md\\:flex-no-wrap{flex-wrap:nowrap}.md\\:items-center{align-items:center}.md\\:justify-end{justify-content:flex-end}.md\\:justify-center{justify-content:center}.md\\:h-40{height:10rem}.md\\:h-56{height:14rem}.md\\:h-120{height:30rem}.md\\:h-auto{height:auto}.md\\:h-full{height:100%}.md\\:text-base{font-size:1rem}.md\\:text-lg{font-size:1.125rem}.md\\:text-xl{font-size:1.25rem}.md\\:text-2xl{font-size:1.5rem}.md\\:text-3xl{font-size:1.875rem}.md\\:text-4xl{font-size:2.25rem}.md\\:text-5xl{font-size:3rem}.md\\:text-6xl{font-size:4rem}.md\\:m-0{margin:0}.md\\:mt-0{margin-top:0}.md\\:mb-0{margin-bottom:0}.md\\:mr-2{margin-right:.5rem}.md\\:mt-4{margin-top:1rem}.md\\:mr-4{margin-right:1rem}.md\\:ml-6{margin-left:1.5rem}.md\\:mr-8{margin-right:2rem}.md\\:ml-10{margin-left:2.5rem}.md\\:ml-12{margin-left:3rem}.md\\:mt-16{margin-top:4rem}.md\\:mt-20{margin-top:5rem}.md\\:mt-24{margin-top:6rem}.md\\:mb-32{margin-bottom:8rem}.md\\:-mt-1{margin-top:-.25rem}.md\\:opacity-100{opacity:1}.md\\:py-4{padding-top:1rem;padding-bottom:1rem}.md\\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\\:px-16{padding-left:4rem;padding-right:4rem}.md\\:pb-0{padding-bottom:0}.md\\:relative{position:relative}.md\\:w-32{width:8rem}.md\\:w-40{width:10rem}.md\\:w-48{width:12rem}.md\\:w-auto{width:auto}.md\\:w-1\\/2{width:50%}.md\\:w-1\\/3{width:33.333333%}.md\\:w-2\\/3{width:66.666667%}.md\\:w-3\\/4{width:75%}.md\\:w-2\\/5{width:40%}.md\\:w-3\\/5{width:60%}.md\\:w-4\\/5{width:80%}.md\\:w-1\\/12{width:8.333333%}.md\\:w-3\\/12{width:25%}.md\\:w-4\\/12{width:33.333333%}.md\\:w-8\\/12{width:66.666667%}.md\\:w-11\\/12{width:91.666667%}.md\\:w-50vw{width:50vw}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\\:translate-x-32{--transform-translate-x:8rem}.md\\:-translate-x-32{--transform-translate-x:-8rem}}@media (min-width:848px){.tb\\:hidden{display:none}.tb\\:flex-row{flex-direction:row}.tb\\:items-center{align-items:center}.tb\\:justify-between{justify-content:space-between}.tb\\:my-4{margin-top:1rem;margin-bottom:1rem}}@media (min-width:992px){.lg\\:flex-row{flex-direction:row}.lg\\:text-2xl{font-size:1.5rem}.lg\\:text-3xl{font-size:1.875rem}.lg\\:text-5xl{font-size:3rem}.lg\\:text-6xl{font-size:4rem}.lg\\:my-3{margin-top:.75rem;margin-bottom:.75rem}.lg\\:mx-8{margin-left:2rem;margin-right:2rem}.lg\\:ml-4{margin-left:1rem}.lg\\:mt-8{margin-top:2rem}.lg\\:ml-10{margin-left:2.5rem}.lg\\:px-12{padding-left:3rem;padding-right:3rem}.lg\\:w-1\\/2{width:50%}.lg\\:w-1\\/3{width:33.333333%}.lg\\:w-1\\/4{width:25%}.lg\\:w-2\\/5{width:40%}.lg\\:w-4\\/5{width:80%}}@media (min-width:1280px){.xl\\:text-3xl{font-size:1.875rem}.xl\\:mt-0{margin-top:0}.xl\\:ml-10{margin-left:2.5rem}.xl\\:w-1\\/3{width:33.333333%}.xl\\:w-3\\/4{width:75%}.xl\\:w-2\\/5{width:40%}.xl\\:w-9\\/12{width:75%}}",""]),t.exports=e},212:function(t,e,n){t.exports=n.p+"img/dc6a3e8.png"},214:function(t,e,n){"use strict";var r=n(77);n.n(r).a},215:function(t,e,n){(e=n(49)(!1)).push([t.i,".border-bottom-blank[data-v-3b7fa2aa]{border-width:2px;border-color:#e2e8f0 #e2e8f0 #fff}.border-top-blank[data-v-3b7fa2aa]{border-width:2px;border-color:#fff #fff #e2e8f0}",""]),t.exports=e},216:function(t,e,n){t.exports=n.p+"img/6f5207b.png"},27:function(t,e,n){"use strict";n.d(e,"b",(function(){return Le})),n.d(e,"a",(function(){return W}));n(19),n(60),n(20),n(13),n(9),n(41);var r=n(4),o=n(23),c=(n(16),n(2)),l=n(64),d=n(105),m=n.n(d),h=n(48),f=n.n(h),_=n(65),y=n(1);"scrollRestoration"in window.history&&(window.history.scrollRestoration="manual",window.addEventListener("beforeunload",(function(){window.history.scrollRestoration="auto"})),window.addEventListener("load",(function(){window.history.scrollRestoration="manual"})));var x=function(){return Object(y.m)(n.e(3).then(n.bind(null,428)))},v=function(){return Object(y.m)(n.e(4).then(n.bind(null,429)))},w=function(){return Object(y.m)(Promise.all([n.e(19),n.e(5)]).then(n.bind(null,425)))},k=function(){return Object(y.m)(n.e(7).then(n.bind(null,430)))},j=function(){return Object(y.m)(n.e(8).then(n.bind(null,426)))},O=function(){return Object(y.m)(n.e(9).then(n.bind(null,427)))},P=function(){return Object(y.m)(n.e(10).then(n.bind(null,431)))},E=function(){return Object(y.m)(Promise.all([n.e(20),n.e(11)]).then(n.bind(null,432)))},C=function(){return Object(y.m)(Promise.all([n.e(21),n.e(12)]).then(n.bind(null,424)))},L=function(){return Object(y.m)(n.e(13).then(n.bind(null,433)))},D=function(){return Object(y.m)(n.e(14).then(n.bind(null,434)))},R=function(){return Object(y.m)(n.e(15).then(n.bind(null,435)))},$=function(){return Object(y.m)(n.e(6).then(n.bind(null,436)))},A=function(){},I=_.a.prototype.push;_.a.prototype.push=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:A,n=arguments.length>2?arguments[2]:void 0;return I.call(this,t,e,n)},c.a.use(_.a);var T={mode:"history",base:decodeURI("/"),linkActiveClass:"nuxt-link-active",linkExactActiveClass:"nuxt-link-exact-active",scrollBehavior:function(t,e,n){var r=!1,o=Object(y.g)(t);(o.length<2&&o.every((function(t){return!1!==t.options.scrollToTop}))||o.some((function(t){return t.options.scrollToTop})))&&(r={x:0,y:0}),n&&(r=n);var c=window.$nuxt;return t.path===e.path&&t.hash!==e.hash&&c.$nextTick((function(){return c.$emit("triggerScroll")})),new Promise((function(e){c.$once("triggerScroll",(function(){if(t.hash){var n=t.hash;void 0!==window.CSS&&void 0!==window.CSS.escape&&(n="#"+window.CSS.escape(n.substr(1)));try{document.querySelector(n)&&(r={selector:n})}catch(t){console.warn("Failed to save scroll position. Please add CSS.escape() polyfill (https://github.com/mathiasbynens/CSS.escape).")}}e(r)}))}))},routes:[{path:"/about/",component:x,pathToRegexpOptions:{strict:!0},name:"about___ja"},{path:"/code-of-conduct/",component:v,pathToRegexpOptions:{strict:!0},name:"code-of-conduct___ja"},{path:"/en/",component:w,pathToRegexpOptions:{strict:!0},name:"index___en"},{path:"/session/",component:k,pathToRegexpOptions:{strict:!0},name:"session___ja"},{path:"/special-booth/",component:j,pathToRegexpOptions:{strict:!0},name:"special-booth___ja"},{path:"/sponsor/",component:O,pathToRegexpOptions:{strict:!0},name:"sponsor___ja"},{path:"/sprint/",component:P,pathToRegexpOptions:{strict:!0},name:"sprint___ja"},{path:"/staff/",component:E,pathToRegexpOptions:{strict:!0},name:"staff___ja"},{path:"/timetable/",component:C,pathToRegexpOptions:{strict:!0},name:"timetable___ja"},{path:"/tutorial/",component:L,pathToRegexpOptions:{strict:!0},name:"tutorial___ja"},{path:"/youth-coder/",component:D,pathToRegexpOptions:{strict:!0},name:"youth-coder___ja"},{path:"/youtube-live/",component:R,pathToRegexpOptions:{strict:!0},name:"youtube-live___ja"},{path:"/en/about/",component:x,pathToRegexpOptions:{strict:!0},name:"about___en"},{path:"/en/code-of-conduct/",component:v,pathToRegexpOptions:{strict:!0},name:"code-of-conduct___en"},{path:"/en/session/",component:k,pathToRegexpOptions:{strict:!0},name:"session___en"},{path:"/en/special-booth/",component:j,pathToRegexpOptions:{strict:!0},name:"special-booth___en"},{path:"/en/sponsor/",component:O,pathToRegexpOptions:{strict:!0},name:"sponsor___en"},{path:"/en/sprint/",component:P,pathToRegexpOptions:{strict:!0},name:"sprint___en"},{path:"/en/staff/",component:E,pathToRegexpOptions:{strict:!0},name:"staff___en"},{path:"/en/timetable/",component:C,pathToRegexpOptions:{strict:!0},name:"timetable___en"},{path:"/en/tutorial/",component:L,pathToRegexpOptions:{strict:!0},name:"tutorial___en"},{path:"/en/youth-coder/",component:D,pathToRegexpOptions:{strict:!0},name:"youth-coder___en"},{path:"/en/youtube-live/",component:R,pathToRegexpOptions:{strict:!0},name:"youtube-live___en"},{path:"/en/session/:id/",component:$,pathToRegexpOptions:{strict:!0},name:"session-id___en"},{path:"/session/:id/",component:$,pathToRegexpOptions:{strict:!0},name:"session-id___ja"},{path:"/",component:w,pathToRegexpOptions:{strict:!0},name:"index___ja"}],fallback:!1};function M(){return new _.a(T)}var S={name:"NuxtChild",functional:!0,props:{nuxtChildKey:{type:String,default:""},keepAlive:Boolean,keepAliveProps:{type:Object,default:void 0}},render:function(t,e){var n=e.parent,data=e.data,r=e.props,o=n.$createElement;data.nuxtChild=!0;for(var c=n,l=n.$nuxt.nuxt.transitions,d=n.$nuxt.nuxt.defaultTransition,m=0;n;)n.$vnode&&n.$vnode.data.nuxtChild&&m++,n=n.$parent;data.nuxtChildDepth=m;var h=l[m]||d,f={};N.forEach((function(t){void 0!==h[t]&&(f[t]=h[t])}));var _={};z.forEach((function(t){"function"==typeof h[t]&&(_[t]=h[t].bind(c))}));var y=_.beforeEnter;if(_.beforeEnter=function(t){if(window.$nuxt.$nextTick((function(){window.$nuxt.$emit("triggerScroll")})),y)return y.call(c,t)},!1===h.css){var x=_.leave;(!x||x.length<2)&&(_.leave=function(t,e){x&&x.call(c,t),c.$nextTick(e)})}var v=o("routerView",data);return r.keepAlive&&(v=o("keep-alive",{props:r.keepAliveProps},[v])),o("transition",{props:f,on:_},[v])}},N=["name","mode","appear","css","type","duration","enterClass","leaveClass","appearClass","enterActiveClass","enterActiveClass","leaveActiveClass","appearActiveClass","enterToClass","leaveToClass","appearToClass"],z=["beforeEnter","enter","afterEnter","enterCancelled","beforeLeave","leave","afterLeave","leaveCancelled","beforeAppear","appear","afterAppear","appearCancelled"],B={props:{error:{type:Object,required:!0}}},U=n(5),W=Object(U.a)(B,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return 404===t.error.statusCode?n("div",{staticClass:"flex flex-col items-center justify-center flex-1"},[n("h1",{staticClass:"flex flex-col w-full"},[n("span",{staticClass:"mb-8 text-4xl italic font-black leading-normal tracking-widest text-center md:text-5xl lg:text-6xl"},[t._v("\n 404\n ")]),t._v(" "),n("span",{staticClass:"font-medium leading-normal tracking-wider text-center sm:text-lg md:text-2xl lg:text-3xl"},[t._v("\n "+t._s(t.$t("error.404"))+"\n ")])]),t._v(" "),n("n-link",{staticClass:"mt-2 text-xl leading-normal tracking-tight text-center text-blue-600 transition-colors duration-100 hover:text-blue-800 md:text-2xl xl:text-3xl",attrs:{to:t.localePath("/")}},[t._v("\n "+t._s(t.$t("error.back"))+"\n ")])],1):n("div",{staticClass:"flex flex-col items-center justify-center flex-1"},[n("h1",{staticClass:"flex flex-col w-full"},[n("span",{staticClass:"mb-8 text-4xl italic font-black leading-normal tracking-widest text-center md:text-5xl lg:text-6xl"},[t._v("\n "+t._s(t.error.statusCode)+"\n ")]),t._v(" "),n("span",{staticClass:"font-medium leading-normal tracking-wider text-center sm:text-lg md:text-2xl lg:text-3xl"},[t._v("\n "+t._s(t.$t("error.else"))+"\n ")])]),t._v(" "),n("n-link",{staticClass:"mt-2 text-xl leading-normal tracking-tight text-center text-blue-600 transition-colors duration-100 hover:text-blue-800 md:text-2xl xl:text-3xl",attrs:{to:t.localePath("/")}},[t._v("\n "+t._s(t.$t("error.back"))+"\n ")])],1)}),[],!1,null,null,null).exports,K=(n(24),n(25),n(51),n(11)),F={name:"Nuxt",components:{NuxtChild:S,NuxtError:W},props:{nuxtChildKey:{type:String,default:void 0},keepAlive:Boolean,keepAliveProps:{type:Object,default:void 0},name:{type:String,default:"default"}},errorCaptured:function(t){this.displayingNuxtError&&(this.errorFromNuxtError=t,this.$forceUpdate())},computed:{routerViewKey:function(){if(void 0!==this.nuxtChildKey||this.$route.matched.length>1)return this.nuxtChildKey||Object(y.c)(this.$route.matched[0].path)(this.$route.params);var t=Object(K.a)(this.$route.matched,1)[0];if(!t)return this.$route.path;var e=t.components.default;if(e&&e.options){var n=e.options;if(n.key)return"function"==typeof n.key?n.key(this.$route):n.key}return/\/$/.test(t.path)?this.$route.path:this.$route.path.replace(/\/$/,"")}},beforeCreate:function(){c.a.util.defineReactive(this,"nuxt",this.$root.$options.nuxt)},render:function(t){var e=this;return this.nuxt.err?this.errorFromNuxtError?(this.$nextTick((function(){return e.errorFromNuxtError=!1})),t("div",{},[t("h2","An error occured while showing the error page"),t("p","Unfortunately an error occured and while showing the error page another error occured"),t("p","Error details: ".concat(this.errorFromNuxtError.toString())),t("nuxt-link",{props:{to:"/"}},"Go back to home")])):(this.displayingNuxtError=!0,this.$nextTick((function(){return e.displayingNuxtError=!1})),t(W,{props:{error:this.nuxt.err}})):t("NuxtChild",{key:this.routerViewKey,props:this.$props})}},H=(n(31),n(29),n(30),{name:"NuxtLoading",data:function(){return{percent:0,show:!1,canSucceed:!0,reversed:!1,skipTimerCount:0,rtl:!1,throttle:200,duration:5e3,continuous:!1}},computed:{left:function(){return!(!this.continuous&&!this.rtl)&&(this.rtl?this.reversed?"0px":"auto":this.reversed?"auto":"0px")}},beforeDestroy:function(){this.clear()},methods:{clear:function(){clearInterval(this._timer),clearTimeout(this._throttle),this._timer=null},start:function(){var t=this;return this.clear(),this.percent=0,this.reversed=!1,this.skipTimerCount=0,this.canSucceed=!0,this.throttle?this._throttle=setTimeout((function(){return t.startTimer()}),this.throttle):this.startTimer(),this},set:function(t){return this.show=!0,this.canSucceed=!0,this.percent=Math.min(100,Math.max(0,Math.floor(t))),this},get:function(){return this.percent},increase:function(t){return this.percent=Math.min(100,Math.floor(this.percent+t)),this},decrease:function(t){return this.percent=Math.max(0,Math.floor(this.percent-t)),this},pause:function(){return clearInterval(this._timer),this},resume:function(){return this.startTimer(),this},finish:function(){return this.percent=this.reversed?0:100,this.hide(),this},hide:function(){var t=this;return this.clear(),setTimeout((function(){t.show=!1,t.$nextTick((function(){t.percent=0,t.reversed=!1}))}),500),this},fail:function(t){return this.canSucceed=!1,this},startTimer:function(){var t=this;this.show||(this.show=!0),void 0===this._cut&&(this._cut=1e4/Math.floor(this.duration)),this._timer=setInterval((function(){t.skipTimerCount>0?t.skipTimerCount--:(t.reversed?t.decrease(t._cut):t.increase(t._cut),t.continuous&&(t.percent>=100||t.percent<=0)&&(t.skipTimerCount=1,t.reversed=!t.reversed))}),100)}},render:function(t){var e=t(!1);return this.show&&(e=t("div",{staticClass:"nuxt-progress",class:{"nuxt-progress-notransition":this.skipTimerCount>0,"nuxt-progress-failed":!this.canSucceed},style:{width:this.percent+"%",left:this.left}})),e}}),J=(n(204),Object(U.a)(H,void 0,void 0,!1,null,null,null).exports),X=(n(206),n(208),n(210),n(136),{props:{isDrawerOpen:{type:Boolean,default:!1}},watch:{isDrawerOpen:function(){this.$refs.transition.performTransition()}}}),G=Object(U.a)(X,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("button",{staticClass:"rounded-lg tb:hidden focus:outline-none focus:shadow-outline",attrs:{role:"button","aria-label":"Open menu","aria-controls":"navigation","aria-expanded":t.isDrawerOpen},on:{click:function(e){return t.$emit("toggleDrawer")}}},[n("svg-transition",{ref:"transition",staticClass:"w-8 h-8",attrs:{trigger:"none",size:{width:20,height:20},"aria-hidden":"true"}},[n("svg",{attrs:{slot:"initial",fill:"currentColor",viewBox:"0 0 20 20"},slot:"initial"},[n("path",{attrs:{"fill-rule":"evenodd",d:"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z","clip-rule":"evenodd"}})]),t._v(" "),n("svg",{attrs:{fill:"currentColor",viewBox:"0 0 20 20"}},[n("path",{attrs:{"fill-rule":"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z","clip-rule":"evenodd"}})])])],1)}),[],!1,null,null,null).exports,Q=(n(28),n(39),{inheritAttrs:!1,props:{enter:{validator:function(t){return["75","100","150","200","300","500","700","1000"].includes(t)},default:"100"},leave:{validator:function(t){return["75","100","150","200","300","500","700","1000"].includes(t)},default:"75"}}}),V={components:{FadeTransition:Object(U.a)(Q,(function(){var t=this.$createElement;return(this._self._c||t)("transition",this._g(this._b({attrs:{name:"fade","enter-active-class":"transition ease-out duration-"+this.enter,"leave-active-class":"transition ease-in duration-"+this.leave,"enter-class":"transform scale-95 opacity-0","leave-class":"transform scale-100 opacity-100","enter-to-class":"transform scale-100 opacity-100","leave-to-class":"transform scale-95 opacity-0"}},"transition",this.$attrs,!1),this.$listeners),[this._t("default")],2)}),[],!1,null,null,null).exports},props:{isDropdownOpen:{type:Boolean,default:!1},emitEvent:{type:String,default:""}}},Y=Object(U.a)(V,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"relative"},[n("div",{staticClass:"relative z-30"},[n("button",{staticClass:"flex flex-row items-center w-full px-4 py-2 mt-2 text-left transition-colors duration-200 bg-transparent rounded-lg md:w-auto md:inline md:mt-0 hover:text-gray-600 focus:text-gray-900 focus:outline-none",on:{click:function(e){return t.$emit(t.emitEvent)}}},[t._t("default"),t._v(" "),n("svg",{staticClass:"inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1",class:{"rotate-180":t.isDropdownOpen,"rotate-0":!t.isDropdownOpen},attrs:{fill:"currentColor",viewBox:"0 0 20 20"}},[n("path",{attrs:{"fill-rule":"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z","clip-rule":"evenodd"}})])],2),t._v(" "),n("fade-transition",[t._t("menu")],2)],1),t._v(" "),t.isDropdownOpen?n("div",{staticClass:"fixed inset-0 z-20 w-screen h-screen",on:{click:function(e){return t.$emit(t.emitEvent)}}}):t._e()])}),[],!1,null,null,null).exports,Z={props:{emitEvent:{type:String,default:""}},computed:{},methods:{judgeNuxtPath:function(path){return!/^https?:\/\//.test(path)}}},tt=Object(U.a)(Z,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"absolute right-0 w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48"},[n("div",{staticClass:"px-2 py-2 bg-white rounded-md shadow"},t._l(t.$t("pages.event-list.content-list"),(function(e){return n("div",{key:e.title},[t.judgeNuxtPath(e.path)?n("n-link",{staticClass:"block px-4 py-2 mt-2 text-sm font-semibold transition-colors duration-200 bg-transparent rounded-lg px- md:mt-0 focus:text-gray-900 hover:text-gray-600 focus:bg-gray-200 focus:outline-none",attrs:{to:t.localePath(e.path)},nativeOn:{click:function(e){return e.stopPropagation(),t.$emit(t.emitEvent)}}},[t._v("\n "+t._s(e.title)+"\n ")]):n("a",{staticClass:"block px-4 py-2 mt-2 text-sm font-semibold transition-colors duration-200 bg-transparent rounded-lg px- md:mt-0 focus:text-gray-900 hover:text-gray-600 focus:bg-gray-200 focus:outline-none",attrs:{href:e.path,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(e.title))])],1)})),0)])}),[],!1,null,null,null).exports,et={computed:{availableLocales:function(){var t=this;return this.$i18n.locales.filter((function(i){return i.code!==t.$i18n.locale}))}}},nt=Object(U.a)(et,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",t._l(t.availableLocales,(function(e){return n("n-link",{key:e.code,staticClass:"flex items-center px-4 py-2 mt-2 transition-colors duration-200 bg-transparent border-2 rounded-lg border-py-black md:mt-0 hover:bg-py-black group",attrs:{to:t.switchLocalePath(e.code)}},[n("i",{staticClass:"mr-2 material-icons group-hover:text-white"},[t._v("translate")]),t._v(" "),n("span",{staticClass:"group-hover:text-white"},[t._v(t._s(e.name))])])})),1)}),[],!1,null,null,null).exports,ot={inheritAttrs:!1,props:{path:{type:String,required:!0}},methods:{isInternalLink:function(path){return!/^https?:\/\//.test(path)}}},at={components:{IsomorphicLink:Object(U.a)(ot,(function(){var t=this,e=t.$createElement;return(t._self._c||e)(t.isInternalLink(t.path)?"nuxt-link":"a",t._g(t._b({tag:"component",attrs:{to:t.isInternalLink(t.path)?t.localePath(t.path):"",href:t.isInternalLink(t.path)?"":t.path,target:t.isInternalLink(t.path)?"":"_blank",rel:t.isInternalLink(t.path)?"":"noopener noreferrer"}},"component",t.$attrs,!1),t.$listeners),[t._t("default")],2)}),[],!1,null,null,null).exports},inheritAttrs:!1,props:{path:{type:String,required:!0}}},it={components:{Hamburger:G,Dropdown:Y,EventList:tt,LocalesList:nt,HeaderLink:Object(U.a)(at,(function(){var t=this.$createElement;return(this._self._c||t)("isomorphic-link",this._g(this._b({staticClass:"px-4 py-2 transition-colors duration-200 bg-transparent border-b-2 border-white focus:outline-none hover:text-gray-600",attrs:{"active-class":"border-b-2 border-py-black",path:this.path}},"isomorphic-link",this.$attrs,!1),this.$listeners),[this._t("default")],2)}),[],!1,null,null,null).exports},data:function(){return{isDrawerOpen:!1,isDropdownOpen:!1,isEventListDropdownOpen:!1,isMobile:!0}},computed:{filteredPages:function(){return Object.filter=function(t,e){return Object.fromEntries(Object.entries(t).filter(e))},Object.filter(this.$i18n.t("pages"),(function(t){var e=Object(K.a)(t,2);e[0];return"/"!==e[1].path}))}},mounted:function(){var t=this;this.$router.beforeEach((function(e,n,r){t.isDrawerOpen=!1,t.isDropdownOpen=!1,r()}));var e=window.matchMedia("(min-width: 848px)");this.updateMatches(e),e.addListener(this.updateMatches)},methods:{updateMatches:function(t){t.matches?this.isMobile=!1:this.isMobile=!0},nextFrame:function(t){window.requestAnimationFrame((function(){return window.requestAnimationFrame(t)}))},enter:function(t){t.style.overflow="hidden",t.style.height="0",this.nextFrame((function(){t.style.height="".concat(t.scrollHeight,"px")}))},leave:function(t){t.style.overflow="hidden",t.style.height="".concat(t.scrollHeight,"px"),this.nextFrame((function(){t.style.height="0"}))},afterEnter:function(t){t.style.height="",t.style.overflow=""},afterLeave:function(t){t.style.height="",t.style.overflow=""},judgeNuxtPath:function(path){return!/^https?:\/\//.test(path)}}},st=(n(214),Object(U.a)(it,(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"flex flex-col max-w-screen-xl mx-auto tb:items-center tb:justify-between tb:flex-row tb:my-4 xl:w-3/4"},[r("div",{staticClass:"flex flex-row items-center justify-between py-4"},[r("n-link",{attrs:{to:t.localePath("/")}},[r("img",{staticClass:"w-40",attrs:{src:n(212)}})]),t._v(" "),r("hamburger",{staticClass:"-mr-1",attrs:{"is-drawer-open":t.isDrawerOpen},on:{toggleDrawer:function(e){t.isDrawerOpen=!t.isDrawerOpen}}})],1),t._v(" "),r("transition",{attrs:{name:"nav","enter-active-class":"transition-all duration-200 ease-out","leave-active-class":"transition-all duration-150 ease-in"},on:{enter:t.enter,"after-enter":t.afterEnter,leave:t.leave,"after-leave":t.afterLeave}},[r("nav",{directives:[{name:"show",rawName:"v-show",value:t.isDrawerOpen||!t.isMobile,expression:"isDrawerOpen || !isMobile"}],staticClass:"flex flex-col pb-4 md:pb-0 md:justify-end tb:flex-row",attrs:{id:"navigation"}},[t._l(t.filteredPages,(function(e){return r("div",{key:e.path,staticClass:"flex flex-col pb-4 md:pb-0 md:justify-end tb:flex-row"},[void 0!==e.path?r("header-link",{staticClass:"mt-2 mr-0 md:mr-2 md:mt-0",attrs:{path:e.path,exact:"/"===e.path}},[t._v("\n "+t._s(e.title)+"\n ")]):t.isMobile?r("div",[r("h5",{staticClass:"block px-4 py-2 mt-2 text-sm bg-transparent md:mt-0"},[t._v("\n "+t._s(t.$t("pages.event-list.title"))+"\n ")]),t._v(" "),t._l(t.$t("pages.event-list.content-list"),(function(e){return r("div",{key:e.title},[t.judgeNuxtPath(e.path)?r("n-link",{staticClass:"block px-4 py-2 mt-2 ml-10 text-sm bg-transparent md:mt-0",attrs:{to:t.localePath(e.path)}},[t._v("\n "+t._s(e.title)+"\n ")]):r("a",{staticClass:"block px-4 py-2 mt-2 ml-10 text-sm bg-transparent md:mt-0",attrs:{href:e.path,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(e.title))])],1)}))],2):r("dropdown",{attrs:{"is-dropdown-open":t.isEventListDropdownOpen,"emit-event":"toggleEventListDropdown"},on:{toggleEventListDropdown:function(e){t.isEventListDropdownOpen=!t.isEventListDropdownOpen}},scopedSlots:t._u([{key:"menu",fn:function(){return[t.isEventListDropdownOpen?r("event-list",{attrs:{"emit-event":"toggleEventListDropdown"},on:{toggleEventListDropdown:function(e){t.isEventListDropdownOpen=!t.isEventListDropdownOpen}}}):t._e()]},proxy:!0}],null,!0)},[t._v("\n "+t._s(t.$t("pages.event-list.title"))+"\n ")])],1)})),t._v(" "),r("locales-list")],2)])],1)}),[],!1,null,"3b7fa2aa",null).exports),ct={},ut=n(106),lt=Object(U.a)(ct,(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"flex flex-col items-center w-full py-8"},[r("section",{staticClass:"flex flex-col items-center justify-center px-4 pt-8 pb-12 m-screen"},[r("h2",{staticClass:"inline mb-12 text-4xl font-bold md:text-6xl"},[t._v("\n Contact\n ")]),t._v(" "),t._l(t.$t("message"),(function(e,i){return r("div",{key:"p-"+i},[r("p",{staticClass:"text-center md:text-xl"},[t._v(t._s(e))])])})),t._v(" "),t._m(0)],2),t._v(" "),r("div",{staticClass:"flex flex-col items-center justify-between w-full max-w-screen-xl mx-auto md:items-center md:flex-row"},[r("h2",{staticClass:"mb-8 text-xl font-semibold tracking-widest text-gray-900 uppercase md:mb-0"},[r("a",{attrs:{href:"https://www.pycon.jp",target:"_blank",rel:"noopener noreferrer"}},[r("img",{staticClass:"w-40",attrs:{src:n(216)}})])]),t._v(" "),t._m(1)])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("a",{staticClass:"px-4 pt-2 pb-4 mt-10 text-2xl font-semibold duration-200 border border-py-black rounded-xl hover:bg-py-black hover:text-py-blue-light transition-color",attrs:{href:"mailto:pyconjp@pycon.jp"}},[e("i",{staticClass:"text-2xl align-middle material-icons"},[this._v("email")]),this._v(" "),e("span",[this._v("pyconjp@pycon.jp")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"flex flex-col items-center justify-end sm:items-start"},[e("h3",{staticClass:"mb-2"},[this._v("主催: 一般社団法人PyCon JP Association")]),this._v(" "),e("h3",{staticClass:"text-center"},[this._v("\n PyCon JP 2020 is a production of the\n "),e("span"),this._v(" "),e("a",{staticClass:"text-blue-400 transition-colors duration-100 hover:text-blue-600",attrs:{href:"https://www.pycon.jp/",target:"_blank",rel:"noopener noreferrer"}},[this._v("\n PyCon JP Association\n ")])])])}],!1,null,null,null);"function"==typeof ut.default&&Object(ut.default)(lt);var pt={components:{PyconHeader:st,PyconFooter:lt.exports},head:function(){return this.$nuxtI18nSeo()}},mt=Object(U.a)(pt,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"flex flex-col min-h-screen"},[e("pycon-header",{staticClass:"w-full px-6 text-gray-800 sm:px-8 md:px-10 lg:px-12"}),this._v(" "),e("main",{staticClass:"container flex flex-col flex-1 px-6 mx-auto sm:px-8 md:px-10 lg:px-12"},[e("nuxt")],1),this._v(" "),e("pycon-footer",{staticClass:"px-6 text-gray-800 bg-py-blue-light sm:px-8 md:px-10 lg:px-12"})],1)}),[],!1,null,null,null).exports;function ht(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return ft(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 ft(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function ft(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i0}},methods:{refreshOnlineStatus:function(){void 0===window.navigator.onLine?this.isOnline=!0:this.isOnline=window.navigator.onLine},refresh:function(){var t=this;return Object(r.a)(regeneratorRuntime.mark((function e(){var n,r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((n=Object(y.h)(t.$route)).length){e.next=3;break}return e.abrupt("return");case 3:return t.$loading.start(),r=n.map((function(e){var p=[];if(e.$options.fetch&&e.$options.fetch.length&&p.push(Object(y.p)(e.$options.fetch,t.context)),e.$fetch)p.push(e.$fetch());else{var n,r=ht(Object(y.e)(e.$vnode.componentInstance));try{for(r.s();!(n=r.n()).done;){var component=n.value;p.push(component.$fetch())}}catch(t){r.e(t)}finally{r.f()}}return e.$options.asyncData&&p.push(Object(y.p)(e.$options.asyncData,t.context).then((function(t){for(var n in t)c.a.set(e.$data,n,t[n])}))),Promise.all(p)})),e.prev=5,e.next=8,Promise.all(r);case 8:e.next=15;break;case 10:e.prev=10,e.t0=e.catch(5),t.$loading.fail(e.t0),Object(y.k)(e.t0),t.error(e.t0);case 15:t.$loading.finish();case 16:case"end":return e.stop()}}),e,null,[[5,10]])})))()},errorChanged:function(){this.nuxt.err&&this.$loading&&(this.$loading.fail&&this.$loading.fail(this.nuxt.err),this.$loading.finish&&this.$loading.finish())},setLayout:function(t){return t&>["_"+t]||(t="default"),this.layoutName=t,this.layout=gt["_"+t],this.layout},loadLayout:function(t){return t&>["_"+t]||(t="default"),Promise.resolve(gt["_"+t])}},components:{NuxtLoading:J}},_t=n(107),yt=n.n(_t),xt=function(t,e){return vt.apply(this,arguments)};function vt(){return(vt=Object(r.a)(regeneratorRuntime.mark((function t(e,n){var r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r={"64x64":"/_nuxt/icons/icon_64.6bc0c7.png","120x120":"/_nuxt/icons/icon_120.6bc0c7.png","144x144":"/_nuxt/icons/icon_144.6bc0c7.png","152x152":"/_nuxt/icons/icon_152.6bc0c7.png","192x192":"/_nuxt/icons/icon_192.6bc0c7.png","384x384":"/_nuxt/icons/icon_384.6bc0c7.png","512x512":"/_nuxt/icons/icon_512.6bc0c7.png"},n("icon",(function(t){return r[t+"x"+t]||""}));case 3:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var wt=n(166),kt=n.n(wt),jt=function(t,e){t.app;e("md",new kt.a("default"))},Ot=n(26),Pt=n(80);Ot.a.autoAddCss=!1,c.a.component("fa",Pt.a),c.a.component("fa-layers",Pt.b),c.a.component("fa-layers-text",Pt.c);var Et=n(47),Ct=n(108),Lt=function(){return Promise.all([n.e(18),n.e(2)]).then(n.bind(null,422))};c.a.component(Ct.a.name,Ct.a);var Dt=function(t,e){var n=null,o=function(){for(var t=arguments.length,e=new Array(t),o=0;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function Gt(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function ae(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i1&&r.sort((function(t,e){return t.score===e.score?e.code.length-t.code.length:e.score-t.score})),r.length?r[0].code:null};function se(object,t){var e=Object.keys(object);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(object);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(object,t).enumerable}))),e.push.apply(e,n)}return e}function ce(t){for(var i=1;i1&&void 0!==j[1]?j[1]:{},l=c.initialSetup,(m=void 0!==l&&l)||!o.i18n.differentDomains){t.next=3;break}return t.abrupt("return");case 3:if(r!==o.i18n.locale){t.next=5;break}return t.abrupt("return");case 5:if(_=o.i18n.locale,m||(o.i18n.beforeLanguageSwitch(_,r),f&&o.i18n.setLocaleCookie(r)),!It.n){t.next=14;break}if(y=n(38),x=y.loadLanguageAsync,!o.i18n.fallbackLocale||r===o.i18n.fallbackLocale){t.next=12;break}return t.next=12,x(e,o.i18n.fallbackLocale);case 12:return t.next=14,x(e,r);case 14:return o.i18n.locale=r,t.next=17,Object(Tt.syncVuex)(d,r,o.i18n.getLocaleMessage(r));case 17:m||o.i18n.onLanguageSwitched(_,r),m||It.t===It.g.NO_PREFIX||(v=o.switchLocalePath(r)||o.localePath("index",r),w=o.router.resolve(v).route,(k=e.route)&&!Object(Tt.isSameRoute)(k,w)&&h(v));case 19:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),k="function"==typeof It.u?Object(It.u)(e):It.u,o.i18n=new Jt.a(k),o.i18n.locale=null,o.i18n.fallbackLocale=k.fallbackLocale||null,o.i18n.locales=It.p,o.i18n.defaultLocale=It.j,o.i18n.differentDomains=It.m,o.i18n.beforeLanguageSwitch=It.i,o.i18n.onLanguageSwitched=It.q,o.i18n.setLocaleCookie=v,o.i18n.getLocaleCookie=x,o.i18n.setLocale=function(t){return w(t)},c.a.prototype.$nuxtI18nSeo=Qt,d&&(d.$i18n=o.i18n,d.state.localeDomains&&o.i18n.locales.forEach((function(t){t.domain=d.state.localeDomains[t.code]}))),j=o.i18n.defaultLocale||null,o.i18n.differentDomains?(O=Object(Tt.getLocaleDomain)(o.i18n,m),j=O||j):It.t!==It.g.NO_PREFIX?(P=Object(Tt.getLocaleFromRoute)(l),j=P||j):f&&(E=x(),It.o.includes(E)&&(j=E)),t.next=24,w(j,{initialSetup:!0});case 24:return o.i18n.__detectBrowserLanguage=Object(r.a)(regeneratorRuntime.mark((function t(){var e,n,r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!It.l){t.next=12;break}if(e=It.l.alwaysRedirect,n=It.l.fallbackLocale,f&&(r=x())||("undefined"!=typeof navigator&&navigator.languages?r=ie(It.o,navigator.languages):m&&void 0!==m.headers["accept-language"]&&(r=ie(It.o,m.headers["accept-language"].split(",").map((function(t){return t.split(";")[0]}))))),!(r=r||n)||f&&!e&&x()){t.next=12;break}if(r===o.i18n.locale){t.next=11;break}return t.next=8,o.i18n.setLocale(r);case 8:return t.abrupt("return",!0);case 11:f&&!x()&&o.i18n.setLocaleCookie(r);case 12:return t.abrupt("return",!1);case 13:case"end":return t.stop()}}),t)}))),t.next=27,o.i18n.__detectBrowserLanguage();case 27:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),le=n(66),pe=n.n(le),de=n(170),me=n.n(de);function he(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return fe(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 fe(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function fe(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i2&&void 0!==arguments[2]?arguments[2]:"common",o=he(Array.isArray(r)?r:[r]);try{for(o.s();!(n=o.n()).done;){var c=n.value;if(!e)return void delete this.defaults.headers[c][t];this.defaults.headers[c][t]=e}}catch(t){o.e(t)}finally{o.f()}},setToken:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"common",r=t?(e?e+" ":"")+t:null;this.setHeader("Authorization",r,n)},onRequest:function(t){this.interceptors.request.use((function(e){return t(e)||e}))},onResponse:function(t){this.interceptors.response.use((function(e){return t(e)||e}))},onRequestError:function(t){this.interceptors.request.use(void 0,(function(e){return t(e)||Promise.reject(e)}))},onResponseError:function(t){this.interceptors.response.use(void 0,(function(e){return t(e)||Promise.reject(e)}))},onError:function(t){this.onRequestError(t),this.onResponseError(t)},create:function(t){return xe(me()(t,this.defaults))}},be=function(){var t=ye[_e];ge["$"+t]=function(){return this[t].apply(this,arguments).then((function(t){return t&&t.data}))}},_e=0,ye=["request","delete","get","head","options","post","put","patch"];_e has been deprecated and will be removed in Nuxt 3, please use instead")),f.a.render(t,e)}})),c.a.component(S.name,S),c.a.component("NChild",S),c.a.component(F.name,F),c.a.use(l.a,{keyName:"head",attribute:"data-n-head",ssrAttribute:"data-n-head-ssr",tagIDKeyName:"hid"});var Ce={name:"page",mode:"out-in",appear:!0,appearClass:"appear",appearActiveClass:"appear-active",appearToClass:"appear-to"};function Le(t){return De.apply(this,arguments)}function De(){return(De=Object(r.a)(regeneratorRuntime.mark((function t(e){var n,r,o,l,path,d;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,M();case 2:return n=t.sent,r=Ee({head:{titleTemplate:"%s - PyCon JP 2020",title:"PyCon JP 2020",base:{href:"router.base"},meta:[{charset:"utf-8"},{name:"viewport",content:"width=device-width, initial-scale=1"},{hid:"description",name:"description",content:"PyCon JP 2020 Python"},{hid:"og:site_name",property:"og:site_name",content:"PyCon JP 2020"},{hid:"og:type",property:"og:type",content:"website"},{hid:"og:url",property:"og:url",content:"https://pycon.jp/2020"},{hid:"og:title",property:"og:title",content:"PyCon JP 2020"},{hid:"og:description",property:"og:description",content:"PyCon JPは、Pythonユーザが集まり、PythonやPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。"},{hid:"og:image",property:"og:image",content:"https://pycon.jp/2020/logo.png"},{hid:"mobile-web-app-capable",name:"mobile-web-app-capable",content:"yes"},{hid:"apple-mobile-web-app-title",name:"apple-mobile-web-app-title",content:"PyCon JP 2020"},{hid:"author",name:"author",content:"Koji Ishimoto"},{hid:"theme-color",name:"theme-color",content:"#3D40CB"}],link:[{rel:"icon",type:"image/x-icon",href:"/favicon.ico"},{rel:"stylesheet",href:"https://fonts.googleapis.com/icon?family=Material+Icons"},{rel:"manifest",href:"/_nuxt/manifest.ea8bab48.json"},{rel:"shortcut icon",href:"/_nuxt/icons/icon_64.6bc0c7.png"},{rel:"apple-touch-icon",href:"/_nuxt/icons/icon_512.6bc0c7.png",sizes:"512x512"},{rel:"prefetch",href:"/_nuxt/news.json",as:"fetch"}],style:[],script:[],htmlAttrs:{lang:"ja"}},router:n,nuxt:{defaultTransition:Ce,transitions:[Ce],setTransitions:function(t){return Array.isArray(t)||(t=[t]),t=t.map((function(t){return t=t?"string"==typeof t?Object.assign({},Ce,{name:t}):Object.assign({},Ce,t):Ce})),this.$options.nuxt.transitions=t,t},err:null,dateErr:null,error:function(t){t=t||null,r.context._errored=Boolean(t),t=t?Object(y.o)(t):null;var n=r.nuxt;return this&&(n=this.nuxt||this.$options.nuxt),n.dateErr=Date.now(),n.err=t,e&&(e.nuxt.error=t),t}}},bt),o=e?e.next:function(t){return r.router.push(t)},e?l=n.resolve(e.url).route:(path=Object(y.f)(n.options.base,n.options.mode),l=n.resolve(path).route),t.next=8,Object(y.s)(r,{route:l,next:o,error:r.nuxt.error.bind(r),payload:e?e.payload:void 0,req:e?e.req:void 0,res:e?e.res:void 0,beforeRenderFns:e?e.beforeRenderFns:void 0,ssrContext:e});case 8:if(d=function(t,e){if(!t)throw new Error("inject(key, value) has no key provided");if(void 0===e)throw new Error("inject('".concat(t,"', value) has no value provided"));r[t="$"+t]=e;var n="__nuxt_"+t+"_installed__";c.a[n]||(c.a[n]=!0,c.a.use((function(){Object.prototype.hasOwnProperty.call(c.a,t)||Object.defineProperty(c.a.prototype,t,{get:function(){return this.$root.$options[t]}})})))},"function"!=typeof yt.a){t.next=12;break}return t.next=12,yt()(r.context,d);case 12:return t.next=15,xt(r.context,d);case 15:return t.next=18,jt(r.context,d);case 18:t.next=21;break;case 21:return t.next=24,Dt(r.context,d);case 24:t.next=27;break;case 27:t.next=30;break;case 30:return t.next=33,Kt(r.context);case 33:if("function"!=typeof ue){t.next=36;break}return t.next=36,ue(r.context,d);case 36:return t.next=39,we(r.context,d);case 39:t.next=42;break;case 42:return t.next=45,Oe(r.context);case 45:t.next=48;break;case 48:return t.abrupt("return",{app:r,router:n});case 49:case"end":return t.stop()}}),t)})))).apply(this,arguments)}},38:function(t,e,n){"use strict";n.r(e),n.d(e,"loadLanguageAsync",(function(){return d})),n.d(e,"validateRouteParams",(function(){return f})),n.d(e,"isSameRoute",(function(){return x})),n.d(e,"getLocaleDomain",(function(){return v})),n.d(e,"getLocaleFromRoute",(function(){return w})),n.d(e,"syncVuex",(function(){return k}));n(19),n(124),n(111),n(52),n(16),n(51),n(41),n(28),n(39);var r=n(11),o=(n(13),n(9),n(136),n(18)),c=n(4),l=n(0);function d(t,e){return m.apply(this,arguments)}function m(){return(m=Object(c.a)(regeneratorRuntime.mark((function t(e,n){var r,o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:(r=e.app).i18n.loadedLanguages||(r.i18n.loadedLanguages=[]),r.i18n.loadedLanguages.includes(n)||(o=r.i18n.locales.find((function(t){return t[l.b]===n})))&&(o[l.d]||console.warn("[".concat(l.f,"] Could not find lang file for locale ").concat(n)));case 3:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var h=function(t){return t&&!Array.isArray(t)&&"object"===Object(o.a)(t)},f=function(t){h(t)?Object.entries(t).forEach((function(t){var e=Object(r.a)(t,2),n=e[0],o=e[1];l.o.includes(n)?h(o)||console.warn("[".concat(l.f,"] Trying to set route params for locale ").concat(n," with a non-object value")):console.warn("[".concat(l.f,"] Trying to set route params for key ").concat(n," which is not a valid locale"))})):console.warn("[".concat(l.f,"] Route params should be an object"))},_=/\/?$/;function y(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!a||!b)return a===b;var t=Object.keys(a),e=Object.keys(b);return t.length===e.length&&t.every((function(t){var e=a[t],n=b[t];return"object"===Object(o.a)(e)&&"object"===Object(o.a)(n)?y(e,n):String(e)===String(n)}))}function x(a,b){return!!b&&(a.path&&b.path?a.path.replace(_,"")===b.path.replace(_,"")&&a.hash===b.hash&&y(a.query,b.query):!(!a.name||!b.name)&&(a.name===b.name&&a.hash===b.hash&&y(a.query,b.query)&&y(a.params,b.params)))}var v=function(t,e){var n=window.location.hostname;if(n){var r=t.locales.find((function(t){return t[l.c]===n}));if(r)return r[l.b]}return null},w=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e="(".concat(l.o.join("|"),")"),n="(?:".concat(l.s).concat(l.k,")?");if(t.name){var r=new RegExp("".concat(l.s).concat(e).concat(n,"$"),"i"),o=t.name.match(r);if(o&&o.length>1)return o[1]}else if(t.path){var c=new RegExp("^/".concat(e,"/"),"i"),d=t.path.match(c);if(d&&d.length>1)return d[1]}return null},k=function(){var t=Object(c.a)(regeneratorRuntime.mark((function t(e){var n,r,o=arguments;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=o.length>1&&void 0!==o[1]?o[1]:null,r=o.length>2&&void 0!==o[2]?o[2]:null,!l.v||!e){t.next=9;break}if(null===n||!l.v.syncLocale){t.next=6;break}return t.next=6,e.dispatch(l.v.moduleName+"/setLocale",n);case 6:if(null===r||!l.v.syncMessages){t.next=9;break}return t.next=9,e.dispatch(l.v.moduleName+"/setMessages",r);case 9:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()},62:function(t,e,n){"use strict";var r={};r.redirect=n(196),r.redirect=r.redirect.default||r.redirect,e.a=r},76:function(t,e,n){var content=n(205);"string"==typeof content&&(content=[[t.i,content,""]]),content.locals&&(t.exports=content.locals);(0,n(50).default)("3191d5ad",content,!0,{sourceMap:!1})},77:function(t,e,n){var content=n(215);"string"==typeof content&&(content=[[t.i,content,""]]),content.locals&&(t.exports=content.locals);(0,n(50).default)("047dbecd",content,!0,{sourceMap:!1})},78:function(t,e){t.exports=function(t){t.options.__i18n=t.options.__i18n||[],t.options.__i18n.push('{"en":{"message":{"p-1":"Please check the FAQ in advance.","p-2":"It is run by volunteers. It takes about a week to answer.","p-3":"Thank you for your patience."}},"ja":{"message":{"p-1":"事前にFAQをご確認いただけますようにお願いします。","p-2":"ボランティアによる運営ですので、回答には1週間程度を要します。","p-3":"何卒お待ちいただけますようにお願いします。"}}}'),delete t.options._Ctor}},81:function(t,e,n){"use strict";n(13),n(31),n(20),n(30),n(29),n(16),n(24),n(25),n(9),n(28),n(39);var r=n(2);function o(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return c(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 c(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,l=!0,d=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return l=t.done,t},e:function(t){d=!0,o=t},f:function(){try{l||null==n.return||n.return()}finally{if(d)throw o}}}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i0},canPrefetch:function(){var t=navigator.connection;return!(this.$nuxt.isOffline||t&&((t.effectiveType||"").includes("2g")||t.saveData))},getPrefetchComponents:function(){return this.$router.resolve(this.to,this.$route,this.append).resolved.matched.map((function(t){return t.components.default})).filter((function(t){return"function"==typeof t&&!t.options&&!t.__prefetched}))},prefetchLink:function(){if(this.canPrefetch()){m.unobserve(this.$el);var t,e=o(this.getPrefetchComponents());try{for(e.s();!(t=e.n()).done;){var n=t.value,r=n();r instanceof Promise&&r.catch((function(){})),n.__prefetched=!0}}catch(t){e.e(t)}finally{e.f()}}}}}}},[[177,16,1,17]]]); \ No newline at end of file diff --git a/2020/_nuxt/3296ff89d2d7c46953db.js b/2020/_nuxt/b5330ccd55a1d495765a.js similarity index 62% rename from 2020/_nuxt/3296ff89d2d7c46953db.js rename to 2020/_nuxt/b5330ccd55a1d495765a.js index 54752f7..25d0686 100644 --- a/2020/_nuxt/3296ff89d2d7c46953db.js +++ b/2020/_nuxt/b5330ccd55a1d495765a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{302:function(e,t,n){var map={"./gold1.png":306,"./gold2.jpg":307,"./gold3.png":308,"./gold4.png":309,"./gold5.png":310,"./gold6.png":311,"./gold7.png":312,"./gold8.png":313,"./media1.png":314,"./media2.png":315,"./media3.jpg":316,"./media4.png":317,"./media5.png":318,"./media6.png":319,"./overview.jpg":320,"./platinum1.jpg":321,"./platinum2.jpg":322,"./platinum3.png":323,"./special1.jpg":324,"./tutorial1.png":325,"./tutorial2.png":326,"./tutorial3.png":327,"./tutorial4.png":328,"./tutorial5.png":329};function o(e){var t=r(e);return n(t)}function r(e){if(!n.o(map,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return map[e]}o.keys=function(){return Object.keys(map)},o.resolve=r,e.exports=o,o.id=302},305:function(e,t,n){"use strict";n(28),n(39);var o={props:{direction:{validator:function(e){return["left","right"].includes(e)},default:"left"},backGroundColor:{type:String,default:"#3D40CB"},size:{validator:function(e){return["small","big"].includes(e)},default:"small"},length:{validator:function(e){return["small","mid","long"].includes(e)},default:"long"},hasTitle:{type:Boolean,default:!0}}},r=n(5),component=Object(r.a)(o,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"relative h-auto shadow-lg m-screen",class:["left"==e.direction?"ml-auto":"mr-auto","long"===e.length?"w-70vw":"","mid"===e.length?"w-50vw":"","small"===e.length?"w-35vw":""],style:{"background-color":e.backGroundColor}},[n("div",{staticClass:"absolute inset-y-0 flex flex-col items-center justify-center h-full overflow-hidden transform",class:["left"===e.direction?"left-0 shadow-left rounded-l-2xl":"right-0 shadow-right rounded-r-2xl","small"===e.size?"w-12":"w-20 md:w-32","left"===e.direction&&"small"===e.size?"-translate-x-12":"right"===e.direction&&"small"===e.size?"translate-x-12":"left"===e.direction&&"big"===e.size?"-translate-x-20 md:-translate-x-32":"translate-x-20 md:translate-x-32"],style:{"background-color":e.backGroundColor}},["small"===e.size?[n("div",{staticClass:"w-4 h-4 mb-4 bg-white rounded-full"}),e._v(" "),n("div",{staticClass:"w-full h-4 bg-white"})]:e._e(),e._v(" "),"big"===e.size?[n("div",{staticClass:"w-8 h-8 mb-8 bg-white rounded-full"}),e._v(" "),n("div",{staticClass:"w-full h-8 bg-white"})]:e._e()],2),e._v(" "),n("div",{staticClass:"flex flex-col px-4 py-8 md:px-16",class:"left"==e.direction?"items-start":"items-end"},["big"===e.size?[n("h3",{directives:[{name:"show",rawName:"v-show",value:!0===e.hasTitle,expression:"hasTitle === true"}],staticClass:"inline mb-6 text-xl font-medium text-white sm:text-2xl lg:text-3xl"},[e._t("title",[e._v("\n 企業スポンサー様募集中\n ")])],2),e._v(" "),n("p",{staticClass:"flex flex-col items-center"},[n("span",{staticClass:"font-light text-white sm:text-lg md:text-xl"},[e._t("content",[e._v("\n PyCon JP 2020を応援して下さるスポンサー様を募集しております\n ")])],2),e._v(" "),e._t("button",[e._m(0)])],2)]:[n("h3",{staticClass:"inline mr-12 text-lg text-white sm:text-xl md:text-3xl",class:["small"===e.size?"font-bold":""]},[e._t("title",[e._v("\n 企業スポンサー様募集中\n ")])],2)]],2)])}),[function(){var e=this.$createElement,t=this._self._c||e;return t("button",{staticClass:"flex items-center px-8 py-6 mt-4 bg-white rounded-full shadow text-py-black"},[t("p",{staticClass:"w-6 h-6 mr-4 rounded-full bg-py-blue-dark"}),this._v("\n スポンサーに申し込む\n ")])}],!1,null,"779222b3",null);t.a=component.exports},306:function(e,t,n){e.exports=n.p+"img/99bcece.png"},307:function(e,t,n){e.exports=n.p+"img/dd45dd2.jpg"},308:function(e,t,n){e.exports=n.p+"img/ae854ec.png"},309:function(e,t,n){e.exports=n.p+"img/27f6409.png"},310:function(e,t,n){e.exports=n.p+"img/ce01760.png"},311:function(e,t,n){e.exports=n.p+"img/55251b4.png"},312:function(e,t,n){e.exports=n.p+"img/bb25a87.png"},313:function(e,t,n){e.exports=n.p+"img/a0e13fe.png"},314:function(e,t,n){e.exports=n.p+"img/1890e59.png"},315:function(e,t,n){e.exports=n.p+"img/b3f75ed.png"},316:function(e,t,n){e.exports=n.p+"img/324cda7.jpg"},317:function(e,t,n){e.exports=n.p+"img/854fea2.png"},318:function(e,t,n){e.exports=n.p+"img/460c85f.png"},319:function(e,t,n){e.exports=n.p+"img/c1b5e69.png"},320:function(e,t,n){e.exports=n.p+"img/3137ddb.jpg"},321:function(e,t,n){e.exports=n.p+"img/04ccde9.jpg"},322:function(e,t,n){e.exports=n.p+"img/0d96493.jpg"},323:function(e,t,n){e.exports=n.p+"img/1f98441.png"},324:function(e,t,n){e.exports=n.p+"img/647925a.jpg"},325:function(e,t,n){e.exports=n.p+"img/09d265d.png"},326:function(e,t,n){e.exports=n.p+"img/31518d1.png"},327:function(e,t,n){e.exports=n.p+"img/c72e2d1.png"},328:function(e,t,n){e.exports=n.p+"img/c97b1b6.png"},329:function(e,t,n){e.exports=n.p+"img/8879f49.png"},332:function(e,t,n){var content=n(369);"string"==typeof content&&(content=[[e.i,content,""]]),content.locals&&(e.exports=content.locals);(0,n(50).default)("23a6dcc3",content,!0,{sourceMap:!1})},333:function(e,t){e.exports=function(e){e.options.__i18n=e.options.__i18n||[],e.options.__i18n.push('{"en":{"sponsor":{"title":"Looking for corporate sponsors","content":"We are looking for sponsors to support PyCon JP 2020.","button":"Apply for Sponsor","subTitle":"sponsor"},"ticket":{"title":"Ticket sales start","content":"Ticket sales for PyCon JP 2020 have started!","button":"Buy a ticket"},"news":{"subtitle":"-news-"},"overview":{"subtitle":"-overview-","contentTitle":"-What is PyConJP?-","content":"PyCon is a conference for Python users to gather, exchange information and interact with Python and software using Python. Through PyCon JP, the goal is to gather Python users together, exchange knowledge and information on various fields related to Python, connect with new friends and communities, and increase work and business opportunities.","button":"Code of conduct"},"conference":{"subtitle":"-conference list-"},"keynote":[{"name":"Seiji Shiba","image":"Shiba_Image.jpg","date":"08/28","description":{"p-1":"In 2017, he began self-taught machine learning, and in the same year, he became the runner-up in the Shogi (Japanese Chess) Den-O tournament he participated in for the first time.","p-2":"The following year, he won the World Computer Shogi Championship even though it was the first time he participated.","p-3":"Since then, he has been a runner-up in the 2019 and 2020 meets and has a phenomenal one-point average ranking in the participating meets.","p-4":"He is a researcher who mainly works on numerical simulations, but most of his recent publications have been about shogi.","p-5":"His hobbies are beer and watching shogi."}},{"name":"Rich Jones","image":"Rich_Image.png","date":"08/29","description":{"p-1":"Rich is the cofounder of Gun.io, a global consulting firm staffed by the best hackers from the Free and Open Source software community.","p-2":"He is the author of Zappa, the leading server-less Python framework, used by thousands of companies and users to save time and money for their web deployments. He has worked on everything from cloud GPU clusters for medical and scientific computing to mobile peer to peer file sharing applications, and on everything in between.","p-3":"In his spare time, he enjoys skateboarding, dirty southern trap music, and Laphroaig."}}],"invited-talk":[{"name":"Tomoko Uchida","image":"Uchida_Image.jpg","date":"08/28","description":{"p-1":"Tomoko completed the master\'s program at the University of Tsukuba Graduate School of Systems and Information Engineering in 2007. ","p-2":"After working for several IT companies, she is currently engaged in research and development of search systems and language processing at the R&D team of LegalForce Inc. In 2015, she released Janome, a Japanese Python morphological analysis library as OSS, and had a presentation on PyCon JP. She is also a committer of Apache Lucene, an OSS search engine library, from 2019. She is interested in information retrieval, machine learning, and natural language processing. She is dreaming of living with her cats in a room with a view of the ocean."}},{"name":"Makoto Tsuyuki","image":"Tsuyuki_Image.jpg","date":"08/29","description":{"p-1":"Makoto moved from the fashion jewelry industry to the IT industry around 2000 and has been working as a software engineer ever since.","p-2":"He has worked on a variety of development projects both for BtoB and BtoC using Python, Java, Perl, Ruby, etc.","p-3":"He has worked not only in development as a software engineer, a chief architect or a technical lead, but also worked outside of development, such as a programming courses teacher and a member of starting up in-house factory.","p-4":"In the past few years, he has been involved in creating a comfortable environment for engineers."}},{"name":"Yuki Iwazaki","image":"Iwazaki_Image.jpg","date":"08/28","description":{"p-1":"Yuki is a Research Engineer at AI Lab on CyberAgent, Inc.","p-2":"After joining the company in 2014 as a server-side engineer, he developed an ad delivery platform, ad rendering engine and effect prediction system using Scala, JavaScript and Python in the Internet Advertising Business.","p-3":"He has been in his current position since 2017 after working in frontend, infrastructure and data analysis.","p-4":"He works in the Creative Research Group and analyzes the impact of streaming from high-dimensional features such as text, images and videos in ads.","p-5":"In RPG games, he likes paper armor attackers like wizards."}},{"name":"Lina Katayose","image":"Katayose_Image.jpg","date":"08/29","description":{"p-1":"Lina Katayose has been interested in aircraft since childhood, and her desire to learn more led her to pursue a master\'s degree in aerospace at Tokai University\'s Graduate School of Engineering, where she studied helicopters and other VTOL(vertical takeoff and landing) aircraft.","p-2":"After finishing the graduate school, she worked on her personal research while working on web-related projects and came across Python. ","p-3":"She has programmed using Python mainly focusing on controlling \\"things\\" around using Raspberry Pi.","p-4":"She attended PyCon JP for the first time in 2016, and after discovering the fun and depth of Python, she joined various communities and made many friends. She joined the PyLadies Tokyo community and now she is an organizer of PyLadies Tokyo.","p-5":"She presented and demonstrated drones and controlling them by Python at PyCon JP 2017 and 2018. ","p-6":"She is known as an international speaker at PyCon Thailand 2019 and talked about PyLadies\' community activities, also has attended in PyCon US and other international PyCon events. ","p-7":"In 2018, she founded moegi, Inc. and develops smartphone applications. She is also researching the uses and problems of the skies not only in Japan but also in the world, and working as a developer in the field of aviation."}},{"name":"Nina Zakharenko","image":"Nina_Zakharenko.jpg","date":"08/28","description":{"p-1":"Nina Zakharenko is a software engineer with over a decade of experience and a newly elected member of the Board of Directors of the PSF. ","p-2":"She currently focuses on Python at Microsoft on the Cloud Developer Advocacy team. ","p-3":"In the past, she’s written software for satellite control computers at HBO, code that\'s helped people connect over their passions at Meetup, and implemented time-wasting features on Reddit. In her spare time, she enjoys tinkering with hardware, LEDs, and wearable electronics.","p-4":"Nina loves teaching developers and has spoken at conferences like PyCon US, PyCon Russia, EuroPython, and DjangoCon in the US and internationally. This year, she\'s very excited to join PyCon Japan remotely for the first time!"}}]},"ja":{"sponsor":{"title":"企業スポンサー募集中","content":"PyCon JP 2020を応援して下さるスポンサーを募集しております","button":"スポンサーに申し込む","subTitle":"スポンサー"},"ticket":{"title":"チケット販売開始","content":"PyCon JP 2020のチケット販売を開始しました!.","button":"チケットを購入する"},"news":{"subtitle":"-お知らせ-"},"overview":{"subtitle":"-概要-","contentTitle":"-PyConJpとは?-","content":"PyConは、Pythonユーザが集まり、PythonやPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。PyConJPの開催を通じて、Pythonの使い手が一堂に集まり、Pythonにまつわる様々な分野の知識や情報を交換し、新たな友達やコミュニティとのつながり、仕事やビジネスチャンスを増やせる場所とすることが目標です。","button":"行動規範"},"conference":{"subtitle":"-会議一覧-"},"keynote":[{"name":"芝世弐","image":"Shiba_Image.jpg","date":"8月28日","description":{"p-1":"2017年に独学で機械学習を始め,同年に初参加の将棋電王トーナメントにて準優勝。翌年には世界コンピュータ将棋選手権に初参加で優勝してしまう。","p-2":"以後,2019年および2020年の大会では準優勝と参加大会の平均順位が1点台という驚異的な強さを誇る。","p-3":"本職は数値シミュレーションを主とする研究者であるが最近の発表は大半将棋に関するものになっている。","p-4":"趣味はビールと将棋観戦。"}},{"name":"Rich Jones","image":"Rich_Image.png","date":"8月29日","description":{"p-1":"RichはGun.ioの共同設立者です。","p-2":"Gun.ioはグローバルなコンサルティングファームで、フリーソフトウェアやオープンソースソフトウェアのコミュニティから来た最も優秀なエンジニア(ハッカー)たちが所属しています。","p-3":"彼は、Pythonにおける主要なサーバレスフレームワーク、Zappaの作者です。","p-4":"Zappaは、何千もの企業やユーザによって使われ、Webデプロイにおける時間と費用を節約しています。彼は医療や科学計算向けのクラウドGPUクラスタからモバイルのピア・ツー・ピアのファイル共有アプリまで、そしてその間にあるあらゆるものに取り組んできました。彼の趣味はスケートボード、サザン・ヒップホップと、ラフロイグを飲むことです。"}}],"invited-talk":[{"name":"打田智子","image":"Uchida_Image.jpg","date":"08/28","description":{"p-1":"2007年に筑波大学大学院システム情報工学研究科の博士前期課程を修了後,いくつかのIT系企業を経て,現在は株式会社 LegalForce の R&D チームで検索システムや言語処理の研究開発に従事。2015年に Python 製日本語形態素解析ライブラリ Janome を OSS として公開し,同年 PyConJP にも登壇。Janome の開発をほそぼそ続けながら,2019年から OSS 検索エンジンライブラリ Apache Lucene のコミッターも務める。興味のある分野は情報検索と機械学習,自然言語処理。海の見える部屋で猫と暮らすのが夢。"}},{"name":"露木誠","image":"Tsuyuki_Image.jpg","date":"08/29","description":{"p-1":"2000年頃にファッションジュエリー業界からIT業界へ移り、以来ソフトウェアエンジニアとして働いています。","p-2":"Python、Java、Perl、Rubyなどのプログラミング言語を用いてB向けC向けを問わずさまざまな開発に従事してきました。","p-3":"ソフトウェアエンジニア・チーフアーキテクト・テックリードなどとして開発に携わるのみならず、プログラミング講習の講師や自社サービス用工場の立ち上げなど、開発から外れた仕事もしてきました。","p-4":"ここ数年はエンジニアが働きやすい環境づくりなどにも関わっています。"}},{"name":"岩崎祐貴","image":"Iwazaki_Image.jpg","date":"08/28","description":{"p-1":"株式会社サイバーエージェント AI Lab Research Engineer。","p-2":"2014年にサーバーサイドエンジニアとして入社後、インターネット広告事業でScala、JavaScript、Pythonを使った配信基盤や広告レンダリングエンジン、効果予測システムを作成。","p-3":"フロント・インフラ・データ分析業務を経て、2017年から現職。","p-4":"クリエイティブリサーチグループにて広告のテキストや画像、動画等の高次元特徴から配信影響を紐解く研究に従事。","p-5":"ゲームでは魔法使いのような紙耐久アタッカーが好き。"}},{"name":"片寄里菜","image":"Katayose_Image.jpg","date":"08/29","description":{"p-1":"片寄里菜さんは、幼い時より航空機に興味があり、もっと学びたいという想いから東海大学工学研究科・航空宇宙学専攻の博士課程前期に進み、ヘリコプターなど垂直離着陸機の研究を行っていました。","p-2":"大学院修了後は、WEB関連の仕事をしながら個人的な研究テーマを進め、Pythonと出会いました。Pythonでは主にRaspberryPiを使ったモノを動かすプログラミングに視点を置き、開発などを行っていました。 ","p-3":"PyConJPには2016年に初参加。Pythonの楽しさや奥深さを知り、様々なコミュニティに参加し友人・知人を増やしたようです。またPyLadiesTokyoコミュニティ参加をきっかけに、今ではスタッフとして活動しています。","p-4":"登壇経験としてPyConJP2017と2018ではドローンとPythonに関する内容で発表・実演を行いました。またPyCon Thailand2019ではPyLadiesのコミュニティ活動に関する海外の登壇経験もあります。PyConUSなど海外のPyConに参加している経験もあり、精力的に活動を行っています。","p-5":"ご自身の仕事は2018年に株式会社moegiを創業し、計測用のスマホアプリなどを開発。日本だけでなく世界の空の活用法や問題点なども調べ、航空機分野の開発者として活躍できるようにと日々活動をしています。"}},{"name":"Nina Zakharenko","image":"Nina_Zakharenko.jpg","date":"08/28","description":{"p-1":"Nina Zakharenkoは10年を超える経験を持つソフトウェアエンジニアであり、PSF(Pythonソフトウェア財団)のBoard of Directorsに新しく選出された一員でもあります。","p-2":"彼女は現在マイクロソフトのCloud Developer AdvocacyチームでPythonを中心に活動しています。","p-3":"これまでに、彼女はHBO(アメリカのケーブルテレビ局)で衛星を制御するコンピュータのソフトウェアを書いたり、Meetupで情熱を持った人々がつながるのを助けるコードを書いたり、Redditで時間の無駄遣いになるような機能を実装したりしてきました。","p-4":"余暇にはハードウェア、LED、身につけられる電子部品をいじって楽しんでいます。","p-5":"Ninaは開発者に教えることが大好きで、PyCon US、PyCon Russia、EuroPython、アメリカでのDjangoConなど国際的にカンファレンスで登壇しています。今年はPyCon JPにリモートではじめて参加することにワクワクしています。"}}]}}'),delete e.options._Ctor}},353:function(e,t,n){"use strict";var o={props:{connpassLink:{type:String,default:""},name:{type:String,default:""},iconImageLink:{type:String,default:""}}},r=n(5),component=Object(r.a)(o,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"flex items-center justify-center p-4 shadow-lg rounded-xl"},[n("a",{staticClass:"flex items-center justify-center",attrs:{href:e.connpassLink,target:"_blank",rel:"noopener noreferrer"}},[e.iconImageLink?n("img",{staticClass:"object-center w-12 h-12 rounded-full",attrs:{src:e.iconImageLink,alt:"Patron Icon"}}):e._e(),e._v(" "),n("p",{staticClass:"ml-2 text-lg font-semibold text-py-black"},[e._v(e._s(e.name))])])])}),[],!1,null,null,null);t.a=component.exports},354:function(e,t,n){var map={"./Iwazaki_Image.jpg":361,"./Katayose_Image.jpg":362,"./Nina_Zakharenko.jpg":363,"./Rich_Image.png":364,"./Shiba_Image.jpg":365,"./Tsuyuki_Image.jpg":366,"./Uchida_Image.jpg":367};function o(e){var t=r(e);return n(t)}function r(e){if(!n.o(map,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return map[e]}o.keys=function(){return Object.keys(map)},o.resolve=r,e.exports=o,o.id=354},358:function(e,t,n){e.exports=n.p+"img/116f4cc.png"},359:function(e,t,n){e.exports=n.p+"img/d810965.png"},360:function(e,t,n){e.exports=n.p+"img/3137ddb.jpg"},361:function(e,t,n){e.exports=n.p+"img/5f96c96.jpg"},362:function(e,t,n){e.exports=n.p+"img/53ebd00.jpg"},363:function(e,t,n){e.exports=n.p+"img/f81133e.jpg"},364:function(e,t,n){e.exports=n.p+"img/e4501d2.png"},365:function(e,t,n){e.exports=n.p+"img/ca7ec35.jpg"},366:function(e,t,n){e.exports=n.p+"img/fff3783.jpg"},367:function(e,t,n){e.exports=n.p+"img/fd77f68.jpg"},368:function(e,t,n){"use strict";var o=n(332);n.n(o).a},369:function(e,t,n){var o=n(49),r=n(370),l=n(371);t=o(!1);var c=r(l);t.push([e.i,".main-color[data-v-32f02066]{color:#404a6b}.main-visual[data-v-32f02066]{background-image:url("+c+");background-size:contain;background-repeat:no-repeat;background-position:50%}.news-area[data-v-32f02066]{background-color:#d4d4ff}.news-overview-content[data-v-32f02066]{border:8px solid #404a6b}.news-overview-icon[data-v-32f02066]{border-color:#404a6b;background-color:#404a6b}.overview-area[data-v-32f02066]{background-color:#ffd8a1}@media screen and (min-width:768px){.main-visual[data-v-32f02066]{width:30vw}}.emotion-mark[data-v-32f02066]{top:-2.5rem;left:5rem}.balloon-1[data-v-32f02066]{height:110px;left:-520px;top:24px;width:110px}.balloon-2[data-v-32f02066]{bottom:-100px;height:184px;left:-240px;width:184px}.balloon-3[data-v-32f02066]{bottom:0;height:110px;right:-100px;width:110px}",""]),e.exports=t},371:function(e,t,n){e.exports=n.p+"img/cea8b91.png"},372:function(e,t,n){"use strict";var o=n(333),r=n.n(o);t.default=r.a},425:function(e,t,n){"use strict";n.r(t);n(19);var o=n(4),r=n(2),l=n(423),c=n(421),d=n(305),m={props:{talkType:{type:String,default:"talk"},mainColor:{type:String,default:"#3D40CB"}}},f=n(5),h=Object(f.a)(m,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("article",{staticClass:"relative"},[n("div",{staticClass:"relative z-10 flex flex-col items-center justify-center bg-white border-8 border-solid rounded-xl",style:{"border-color":e.mainColor}},[n("div",{staticClass:"mx-6 my-4"},[n("div",{staticClass:"flex flex-col items-center justify-center mb-8"},[e._t("image")],2),e._v(" "),n("h2",{staticClass:"text-xl font-bold md:text-2xl"},[e._t("name")],2),e._v(" "),n("p",{staticClass:"mb-4 text-sm md:text-base"},[e._t("date")],2),e._v(" "),n("p",{staticClass:"mb-8 text-sm md:text-base"},[e._t("description")],2)])]),e._v(" "),n("div",{staticClass:"absolute top-0 w-20 h-20 -mt-6 -ml-10 border-4 border-solid rounded-card-head",class:["talk"===e.talkType?"ml-0 left-1/2":"ml-10 left-3/4"],style:{"border-color":e.mainColor,"background-color":e.mainColor}},[e._m(0)])])}),[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"relative"},[t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-6 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-10 bg-white rounded-full"})])}],!1,null,"fb0d45e0",null).exports,v=n(353),x=r.a.extend({components:{PythonBanner:d.a,TalkContent:h,Patron:v.a},asyncData:function(e){return Object(o.a)(regeneratorRuntime.mark((function t(){var n,o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=e.app,"/_nuxt/news.json",t.next=4,n.$axios.$get("/_nuxt/news.json");case 4:return o=t.sent,t.abrupt("return",{news:o});case 6:case"end":return t.stop()}}),t)})))()},data:function(){return{}},methods:{format:function(e){return Object(l.a)(new Date(e),"yyyy.MM.dd")},formatISO:function(e){return Object(c.a)(new Date(e))}},head:function(){return{title:"PyCon JP 2020",titleTemplate:null}}}),y=(n(368),n(372)),_=Object(f.a)(x,(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"main-color"},[o("section",{staticClass:"relative flex items-start justify-center mb-12 h-80 md:h-120 md:items-center"},[o("div",{staticClass:"relative z-10 mt-16 mr-2 md:m-0"},[e._m(0),e._v(" "),o("div",{staticClass:"mt-6 space-y-2"},[e._m(1),e._v(" "),e._m(2),e._v(" "),o("div",{staticClass:"flex items-center"},[o("img",{staticClass:"h-6 mr-2",attrs:{src:n(358)}}),e._v(" "),o("a",{staticClass:"text-2xl text-blue-400",attrs:{href:"https://twitter.com/search?q=%23pyconjp&src=typed_query",target:"_blank",rel:"noopener noreferrer"}},[e._v("#pyconjp")])])])]),e._v(" "),e._m(3)]),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#EE9D2C",size:"big"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n "+e._s(e.$t("ticket.title"))+"\n ")]},proxy:!0},{key:"content",fn:function(){return[e._v("\n "+e._s(e.$t("ticket.content"))+"\n ")]},proxy:!0},{key:"button",fn:function(){return[o("a",{staticClass:"mt-6",attrs:{href:"https://pyconjp.blogspot.com/2020/07/pycon-jp-2020-conference-ticket-on-sale.html",target:"_blank",rel:"noopener noreferrer"}},[o("button",{staticClass:"relative flex items-center px-4 py-2 mt-6 font-medium transition-colors duration-200 bg-white rounded-full shadow group md:px-6 md:py-6 text-py-black focus:outline-none"},[o("p",{staticClass:"w-6 h-6 rounded-full bg-py-orange-dark"}),e._v(" "),o("span",{staticClass:"ml-2 md:text-xl md:ml-6 md:mr-4"},[e._v("\n "+e._s(e.$t("ticket.button"))+"\n ")]),e._v(" "),o("img",{staticClass:"box-border absolute object-cover object-right w-full md:h-auto lg:w-4/5",attrs:{src:n(359)}})])])]},proxy:!0}])}),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center px-4 pt-12 pb-24 mt-24 m-screen news-area"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n NEWS\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v(e._s(e.$t("news.subtitle")))])]),e._v(" "),o("div",{staticClass:"relative flex flex-col items-center justify-center w-full mt-6 bg-white md:w-3/4 rounded-py news-overview-content"},[o("div",{staticClass:"relative z-10 flex flex-col justify-center px-6 py-12 space-y-6 bg-white sm:px-10 md:px-16 rounded-py"},e._l(e.news,(function(t,i){return o("article",{key:i,staticClass:"flex flex-col justify-between md:flex-row"},[o("time",{staticClass:"mb-2 text-lg font-medium text-left text-gray-700 md:text-xl md:mb-0",attrs:{datetime:e.formatISO(t.pubDate[0])}},[e._v("\n "+e._s(e.format(t.pubDate[0]))+"\n ")]),e._v(" "),o("a",{staticClass:"w-full font-light md:ml-12 hover:underline",attrs:{href:t.link,target:"_blank",rel:"noopener noreferrer"}},[e._v("\n "+e._s(t.title[0])+"\n ")])])})),0),e._v(" "),e._m(4)])]),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center px-4 pt-12 pb-24 m-screen overview-area"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n Overview\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v(e._s(e.$t("overview.subtitle")))])]),e._v(" "),o("div",{staticClass:"relative flex justify-center w-full mt-6 md:w-3/4"},[e._m(5),e._v(" "),o("div",{staticClass:"flex flex-col items-center justify-center w-full overflow-hidden bg-white rounded-py news-overview-content"},[o("div",{staticClass:"relative z-10 flex flex-col justify-between w-full bg-white lg:flex-row rounded-py"},[o("div",{staticClass:"flex flex-col flex-1 px-6 py-12 sm:px-10 md:px-16"},[o("h2",{staticClass:"inline mb-2 text-2xl font-semibold md:text-4xl"},[e._v("\n What is PyConJP?\n ")]),e._v(" "),o("h3",{staticClass:"mb-8 text-xl font-medium md:text-2xl"},[e._v("\n "+e._s(e.$t("overview.contentTitle"))+"\n ")]),e._v(" "),o("p",[e._v("\n "+e._s(e.$t("overview.content"))+"\n ")]),e._v(" "),o("nuxt-link",{staticClass:"self-center",attrs:{to:e.localePath("/code-of-conduct")}},[o("button",{staticClass:"flex items-center self-center justify-center px-2 py-2 mt-6 font-medium duration-200 bg-white rounded-full shadow group md:px-6 md:py-6 text-py-black hover:bg-py-black focus:outline-none transition-color"},[o("p",{staticClass:"w-6 h-6 rounded-full bg-py-black group-hover:bg-white"}),e._v(" "),o("span",{staticClass:"mx-4 md:text-xl group-hover:text-white"},[e._v("\n "+e._s(e.$t("overview.button"))+"\n ")])])])],1),e._v(" "),o("img",{staticClass:"box-border object-cover object-right w-full h-64 md:h-auto lg:w-2/5",attrs:{src:n(360)}})])])])]),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center mt-12"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n Conference\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v(e._s(e.$t("conference.subtitle")))])]),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#3D40CB",size:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Keynote\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap justify-around mt-12 mb-12"},e._l(e.$t("keynote"),(function(t,r){return o("talk-content",{key:t.name,staticClass:"w-full md:w-2/3 xl:w-2/5 xl:mt-0",class:[0==r?"mt-8":"mt-20"],attrs:{"talk-type":"talk"},scopedSlots:e._u([{key:"image",fn:function(){return[o("img",{staticClass:"object-cover object-top w-24 h-24 rounded-full md:w-40 md:h-40",attrs:{src:n(354)("./"+t.image)}})]},proxy:!0},{key:"name",fn:function(){return[e._v(e._s(t.name))]},proxy:!0},{key:"date",fn:function(){return[e._v(" "+e._s(t.date)+" ")]},proxy:!0},{key:"description",fn:function(){return e._l(t.description,(function(t,n){return o("p",{key:"p-"+n},[e._v("\n "+e._s(t)+"\n ")])}))},proxy:!0}],null,!0)})})),1),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#EE9D2C",size:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Invited talk\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap justify-around mt-12 mb-12"},e._l(e.$t("invited-talk"),(function(t){return o("talk-content",{key:t.name,staticClass:"w-full mt-16 md:w-2/3 xl:w-2/5",attrs:{"talk-type":"talk","main-color":"#EE9D2C"},scopedSlots:e._u([{key:"image",fn:function(){return[o("img",{staticClass:"object-cover object-top w-24 h-24 rounded-full md:w-40 md:h-40",attrs:{src:n(354)("./"+t.image)}})]},proxy:!0},{key:"name",fn:function(){return[e._v(e._s(t.name))]},proxy:!0},{key:"date",fn:function(){return[e._v(" "+e._s(t.date)+" ")]},proxy:!0},{key:"description",fn:function(){return e._l(t.description,(function(t,n){return o("p",{key:"p-"+n},[e._v("\n "+e._s(t)+"\n ")])}))},proxy:!0}],null,!0)})})),1)],1),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center mb-8 space-y-12"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n Sponsor\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v("-"+e._s(e.$t("sponsor.subTitle"))+"-")])]),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#71A4F1",size:"small",length:"long"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Platinum\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.platinum"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-2/5",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#E3AB4A",sie:"small",length:"mid"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Gold\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.gold"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#818181",size:"small",length:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Silver\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"grid grid-cols-1 gap-4 pb-8 md:grid-cols-2"},e._l(e.$t("sponsor.silver"),(function(t){return o("a",{key:t.companyName,attrs:{href:t.url,target:"_blank",rel:"noopener noreferrer"}},[o("p",{staticClass:"text-2xl break-all"},[e._v("\n "+e._s(t.companyName)+"\n ")])])})),0),e._v(" "),o("python-banner",{staticClass:"mt-16",attrs:{direction:"right","back-ground-color":"#3D40CB",size:"small",length:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n SPECIAL\n ")]},proxy:!0}])}),e._v(" "),o("h3",{staticClass:"mt-6 text-4xl font-medium text-py-black"},[e._v("\n "+e._s(e.$t("sponsor.message.specialSponsor"))+"\n ")]),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.special.cooperation"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{staticClass:"w-full",attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("h3",{staticClass:"mt-16 text-4xl font-medium text-py-black"},[e._v("\n "+e._s(e.$t("sponsor.message.tutorial"))+"\n ")]),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.special.tutorial"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{staticClass:"w-full",attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("h3",{staticClass:"mt-6 text-4xl font-medium text-py-black"},[e._v("\n "+e._s(e.$t("sponsor.message.media"))+"\n ")]),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.special.media"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{staticClass:"w-full",attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("python-banner",{staticClass:"mt-16",attrs:{direction:"right","back-ground-color":"#3F496A",size:"small",length:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n PATRON\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap mt-4 mb-8"},e._l(e.$t("sponsor.patron"),(function(e){return o("Patron",{key:e.name,staticClass:"ml-4",attrs:{"connpass-link":e.connpassLink,name:e.name,"icon-image-link":e.iconImageLink}})})),1)],1)],1)}),[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{staticClass:"text-4xl font-extrabold leading-tight md:text-6xl"},[this._v("\n PyCon JP "),t("br"),this._v("2020 "),t("span",{staticClass:"font-semibold"},[this._v("Online")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{staticClass:"flex items-center text-2xl md:text-3xl"},[t("i",{staticClass:"mr-2 material-icons"},[this._v("location_on")]),this._v("\n Online Conference\n ")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{staticClass:"flex flex-wrap items-center justify-start text-2xl md:text-3xl"},[t("i",{staticClass:"mr-2 text-gray-700 material-icons"},[this._v("event")]),this._v(" "),t("span",{staticClass:"mr-1 font-semibold"},[this._v("2020 08/28 ")]),this._v("(Fri.) /\n "),t("span",{staticClass:"mx-1 font-semibold"},[this._v("29 ")]),this._v("(Sat.)\n ")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"absolute w-screen h-full opacity-25 md:opacity-100 main-visual md:w-50vw md:relative"},[t("div",{staticClass:"absolute hidden rounded-full balloon-1 bg-py-blue-light md:block"}),this._v(" "),t("div",{staticClass:"absolute hidden rounded-full balloon-2 bg-py-orange-light md:block"}),this._v(" "),t("div",{staticClass:"absolute hidden rounded-full balloon-3 bg-py-orange-light md:block"})])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"absolute top-0 w-20 h-20 -mt-8 border-4 border-solid rounded-card-head news-overview-icon"},[t("div",{staticClass:"relative"},[t("div",{staticClass:"absolute w-2 h-2 mt-0 ml-6 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-12 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute text-5xl font-bold emotion-mark"},[this._v("\n !\n ")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"absolute top-0 w-20 h-20 mx-auto -mt-8 border-4 border-solid rounded-card-head news-overview-icon"},[t("div",{staticClass:"relative"},[t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-4 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute w-2 h-2 mt-0 ml-10 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute text-5xl font-bold emotion-mark"},[this._v("\n ?\n ")])])])}],!1,null,"32f02066",null);"function"==typeof y.default&&Object(y.default)(_);t.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{302:function(e,t,n){var map={"./gold1.png":306,"./gold2.jpg":307,"./gold3.png":308,"./gold4.png":309,"./gold5.png":310,"./gold6.png":311,"./gold7.png":312,"./gold8.png":313,"./media1.png":314,"./media2.png":315,"./media3.jpg":316,"./media4.png":317,"./media5.png":318,"./media6.png":319,"./overview.jpg":320,"./platinum1.jpg":321,"./platinum2.jpg":322,"./platinum3.png":323,"./special1.jpg":324,"./tutorial1.png":325,"./tutorial2.png":326,"./tutorial3.png":327,"./tutorial4.png":328,"./tutorial5.png":329};function o(e){var t=r(e);return n(t)}function r(e){if(!n.o(map,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return map[e]}o.keys=function(){return Object.keys(map)},o.resolve=r,e.exports=o,o.id=302},305:function(e,t,n){"use strict";n(28),n(39);var o={props:{direction:{validator:function(e){return["left","right"].includes(e)},default:"left"},backGroundColor:{type:String,default:"#3D40CB"},size:{validator:function(e){return["small","big"].includes(e)},default:"small"},length:{validator:function(e){return["small","mid","long"].includes(e)},default:"long"},hasTitle:{type:Boolean,default:!0}}},r=n(5),component=Object(r.a)(o,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"relative h-auto shadow-lg m-screen",class:["left"==e.direction?"ml-auto":"mr-auto","long"===e.length?"w-70vw":"","mid"===e.length?"w-50vw":"","small"===e.length?"w-35vw":""],style:{"background-color":e.backGroundColor}},[n("div",{staticClass:"absolute inset-y-0 flex flex-col items-center justify-center h-full overflow-hidden transform",class:["left"===e.direction?"left-0 shadow-left rounded-l-2xl":"right-0 shadow-right rounded-r-2xl","small"===e.size?"w-12":"w-20 md:w-32","left"===e.direction&&"small"===e.size?"-translate-x-12":"right"===e.direction&&"small"===e.size?"translate-x-12":"left"===e.direction&&"big"===e.size?"-translate-x-20 md:-translate-x-32":"translate-x-20 md:translate-x-32"],style:{"background-color":e.backGroundColor}},["small"===e.size?[n("div",{staticClass:"w-4 h-4 mb-4 bg-white rounded-full"}),e._v(" "),n("div",{staticClass:"w-full h-4 bg-white"})]:e._e(),e._v(" "),"big"===e.size?[n("div",{staticClass:"w-8 h-8 mb-8 bg-white rounded-full"}),e._v(" "),n("div",{staticClass:"w-full h-8 bg-white"})]:e._e()],2),e._v(" "),n("div",{staticClass:"flex flex-col px-4 py-8 md:px-16",class:"left"==e.direction?"items-start":"items-end"},["big"===e.size?[n("h3",{directives:[{name:"show",rawName:"v-show",value:!0===e.hasTitle,expression:"hasTitle === true"}],staticClass:"inline mb-6 text-xl font-medium text-white sm:text-2xl lg:text-3xl"},[e._t("title",[e._v("\n 企業スポンサー様募集中\n ")])],2),e._v(" "),n("p",{staticClass:"flex flex-col items-center"},[n("span",{staticClass:"font-light text-white sm:text-lg md:text-xl"},[e._t("content",[e._v("\n PyCon JP 2020を応援して下さるスポンサー様を募集しております\n ")])],2),e._v(" "),e._t("button",[e._m(0)])],2)]:[n("h3",{staticClass:"inline mr-12 text-lg text-white sm:text-xl md:text-3xl",class:["small"===e.size?"font-bold":""]},[e._t("title",[e._v("\n 企業スポンサー様募集中\n ")])],2)]],2)])}),[function(){var e=this.$createElement,t=this._self._c||e;return t("button",{staticClass:"flex items-center px-8 py-6 mt-4 bg-white rounded-full shadow text-py-black"},[t("p",{staticClass:"w-6 h-6 mr-4 rounded-full bg-py-blue-dark"}),this._v("\n スポンサーに申し込む\n ")])}],!1,null,"779222b3",null);t.a=component.exports},306:function(e,t,n){e.exports=n.p+"img/99bcece.png"},307:function(e,t,n){e.exports=n.p+"img/dd45dd2.jpg"},308:function(e,t,n){e.exports=n.p+"img/ae854ec.png"},309:function(e,t,n){e.exports=n.p+"img/27f6409.png"},310:function(e,t,n){e.exports=n.p+"img/ce01760.png"},311:function(e,t,n){e.exports=n.p+"img/55251b4.png"},312:function(e,t,n){e.exports=n.p+"img/bb25a87.png"},313:function(e,t,n){e.exports=n.p+"img/a0e13fe.png"},314:function(e,t,n){e.exports=n.p+"img/1890e59.png"},315:function(e,t,n){e.exports=n.p+"img/b3f75ed.png"},316:function(e,t,n){e.exports=n.p+"img/324cda7.jpg"},317:function(e,t,n){e.exports=n.p+"img/854fea2.png"},318:function(e,t,n){e.exports=n.p+"img/460c85f.png"},319:function(e,t,n){e.exports=n.p+"img/c1b5e69.png"},320:function(e,t,n){e.exports=n.p+"img/3137ddb.jpg"},321:function(e,t,n){e.exports=n.p+"img/04ccde9.jpg"},322:function(e,t,n){e.exports=n.p+"img/0d96493.jpg"},323:function(e,t,n){e.exports=n.p+"img/1f98441.png"},324:function(e,t,n){e.exports=n.p+"img/647925a.jpg"},325:function(e,t,n){e.exports=n.p+"img/09d265d.png"},326:function(e,t,n){e.exports=n.p+"img/31518d1.png"},327:function(e,t,n){e.exports=n.p+"img/c72e2d1.png"},328:function(e,t,n){e.exports=n.p+"img/c97b1b6.png"},329:function(e,t,n){e.exports=n.p+"img/8879f49.png"},332:function(e,t,n){var content=n(369);"string"==typeof content&&(content=[[e.i,content,""]]),content.locals&&(e.exports=content.locals);(0,n(50).default)("23a6dcc3",content,!0,{sourceMap:!1})},333:function(e,t){e.exports=function(e){e.options.__i18n=e.options.__i18n||[],e.options.__i18n.push('{"en":{"sponsor":{"title":"Looking for corporate sponsors","content":"We are looking for sponsors to support PyCon JP 2020.","button":"Apply for Sponsor","subTitle":"sponsor"},"ticket":{"title":"Ticket sales start","content":"Ticket sales for PyCon JP 2020 have started!","button":"Buy a ticket"},"news":{"subtitle":"-news-"},"overview":{"subtitle":"-overview-","contentTitle":"-What is PyConJP?-","content":"PyCon is a conference for Python users to gather, exchange information and interact with Python and software using Python. Through PyCon JP, the goal is to gather Python users together, exchange knowledge and information on various fields related to Python, connect with new friends and communities, and increase work and business opportunities.","button":"Code of conduct"},"conference":{"subtitle":"-conference list-"},"keynote":[{"name":"Seiji Shiba","image":"Shiba_Image.jpg","date":"08/28","description":{"p-1":"In 2017, he began self-taught machine learning, and in the same year, he became the runner-up in the Shogi (Japanese Chess) Den-O tournament he participated in for the first time.","p-2":"The following year, he won the World Computer Shogi Championship even though it was the first time he participated.","p-3":"Since then, he has been a runner-up in the 2019 and 2020 meets and has a phenomenal one-point average ranking in the participating meets.","p-4":"He is a researcher who mainly works on numerical simulations, but most of his recent publications have been about shogi.","p-5":"His hobbies are beer and watching shogi."}},{"name":"Rich Jones","image":"Rich_Image.png","date":"08/29","description":{"p-1":"Rich is the cofounder of Gun.io, a global consulting firm staffed by the best hackers from the Free and Open Source software community.","p-2":"He is the author of Zappa, the leading server-less Python framework, used by thousands of companies and users to save time and money for their web deployments. He has worked on everything from cloud GPU clusters for medical and scientific computing to mobile peer to peer file sharing applications, and on everything in between.","p-3":"In his spare time, he enjoys skateboarding, dirty southern trap music, and Laphroaig."}}],"invited-talk":[{"name":"Tomoko Uchida","image":"Uchida_Image.jpg","date":"08/28","description":{"p-1":"Tomoko completed the master\'s program at the University of Tsukuba Graduate School of Systems and Information Engineering in 2007. ","p-2":"After working for several IT companies, she is currently engaged in research and development of search systems and language processing at the R&D team of LegalForce Inc. In 2015, she released Janome, a Japanese Python morphological analysis library as OSS, and had a presentation on PyCon JP. She is also a committer of Apache Lucene, an OSS search engine library, from 2019. She is interested in information retrieval, machine learning, and natural language processing. She is dreaming of living with her cats in a room with a view of the ocean."}},{"name":"Makoto Tsuyuki","image":"Tsuyuki_Image.jpg","date":"08/29","description":{"p-1":"Makoto moved from the fashion jewelry industry to the IT industry around 2000 and has been working as a software engineer ever since.","p-2":"He has worked on a variety of development projects both for BtoB and BtoC using Python, Java, Perl, Ruby, etc.","p-3":"He has worked not only in development as a software engineer, a chief architect or a technical lead, but also worked outside of development, such as a programming courses teacher and a member of starting up in-house factory.","p-4":"In the past few years, he has been involved in creating a comfortable environment for engineers."}},{"name":"Yuki Iwazaki","image":"Iwazaki_Image.jpg","date":"08/28","description":{"p-1":"Yuki is a Research Engineer at AI Lab on CyberAgent, Inc.","p-2":"After joining the company in 2014 as a server-side engineer, he developed an ad delivery platform, ad rendering engine and effect prediction system using Scala, JavaScript and Python in the Internet Advertising Business.","p-3":"He has been in his current position since 2017 after working in frontend, infrastructure and data analysis.","p-4":"He works in the Creative Research Group and analyzes the impact of streaming from high-dimensional features such as text, images and videos in ads.","p-5":"In RPG games, he likes paper armor attackers like wizards."}},{"name":"Lina Katayose","image":"Katayose_Image.jpg","date":"08/29","description":{"p-1":"Lina Katayose has been interested in aircraft since childhood, and her desire to learn more led her to pursue a master\'s degree in aerospace at Tokai University\'s Graduate School of Engineering, where she studied helicopters and other VTOL(vertical takeoff and landing) aircraft.","p-2":"After finishing the graduate school, she worked on her personal research while working on web-related projects and came across Python. ","p-3":"She has programmed using Python mainly focusing on controlling \\"things\\" around using Raspberry Pi.","p-4":"She attended PyCon JP for the first time in 2016, and after discovering the fun and depth of Python, she joined various communities and made many friends. She joined the PyLadies Tokyo community and now she is an organizer of PyLadies Tokyo.","p-5":"She presented and demonstrated drones and controlling them by Python at PyCon JP 2017 and 2018. ","p-6":"She is known as an international speaker at PyCon Thailand 2019 and talked about PyLadies\' community activities, also has attended in PyCon US and other international PyCon events. ","p-7":"In 2018, she founded moegi, Inc. and develops smartphone applications. She is also researching the uses and problems of the skies not only in Japan but also in the world, and working as a developer in the field of aviation."}},{"name":"Nina Zakharenko","image":"Nina_Zakharenko.jpg","date":"08/28","description":{"p-1":"Nina Zakharenko is a software engineer with over a decade of experience and a newly elected member of the Board of Directors of the PSF. ","p-2":"She currently focuses on Python at Microsoft on the Cloud Developer Advocacy team. ","p-3":"In the past, she’s written software for satellite control computers at HBO, code that\'s helped people connect over their passions at Meetup, and implemented time-wasting features on Reddit. In her spare time, she enjoys tinkering with hardware, LEDs, and wearable electronics.","p-4":"Nina loves teaching developers and has spoken at conferences like PyCon US, PyCon Russia, EuroPython, and DjangoCon in the US and internationally. This year, she\'s very excited to join PyCon Japan remotely for the first time!"}}]},"ja":{"sponsor":{"title":"企業スポンサー募集中","content":"PyCon JP 2020を応援して下さるスポンサーを募集しております","button":"スポンサーに申し込む","subTitle":"スポンサー"},"ticket":{"title":"チケット販売開始","content":"PyCon JP 2020のチケット販売を開始しました!.","button":"チケットを購入する"},"news":{"subtitle":"-お知らせ-"},"overview":{"subtitle":"-概要-","contentTitle":"-PyConJpとは?-","content":"PyConは、Pythonユーザが集まり、PythonやPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。PyConJPの開催を通じて、Pythonの使い手が一堂に集まり、Pythonにまつわる様々な分野の知識や情報を交換し、新たな友達やコミュニティとのつながり、仕事やビジネスチャンスを増やせる場所とすることが目標です。","button":"行動規範"},"conference":{"subtitle":"-会議一覧-"},"keynote":[{"name":"芝世弐","image":"Shiba_Image.jpg","date":"8月28日","description":{"p-1":"2017年に独学で機械学習を始め,同年に初参加の将棋電王トーナメントにて準優勝。翌年には世界コンピュータ将棋選手権に初参加で優勝してしまう。","p-2":"以後,2019年および2020年の大会では準優勝と参加大会の平均順位が1点台という驚異的な強さを誇る。","p-3":"本職は数値シミュレーションを主とする研究者であるが最近の発表は大半将棋に関するものになっている。","p-4":"趣味はビールと将棋観戦。"}},{"name":"Rich Jones","image":"Rich_Image.png","date":"8月29日","description":{"p-1":"RichはGun.ioの共同設立者です。","p-2":"Gun.ioはグローバルなコンサルティングファームで、フリーソフトウェアやオープンソースソフトウェアのコミュニティから来た最も優秀なエンジニア(ハッカー)たちが所属しています。","p-3":"彼は、Pythonにおける主要なサーバレスフレームワーク、Zappaの作者です。","p-4":"Zappaは、何千もの企業やユーザによって使われ、Webデプロイにおける時間と費用を節約しています。彼は医療や科学計算向けのクラウドGPUクラスタからモバイルのピア・ツー・ピアのファイル共有アプリまで、そしてその間にあるあらゆるものに取り組んできました。彼の趣味はスケートボード、サザン・ヒップホップと、ラフロイグを飲むことです。"}}],"invited-talk":[{"name":"打田智子","image":"Uchida_Image.jpg","date":"08/28","description":{"p-1":"2007年に筑波大学大学院システム情報工学研究科の博士前期課程を修了後,いくつかのIT系企業を経て,現在は株式会社 LegalForce の R&D チームで検索システムや言語処理の研究開発に従事。2015年に Python 製日本語形態素解析ライブラリ Janome を OSS として公開し,同年 PyConJP にも登壇。Janome の開発をほそぼそ続けながら,2019年から OSS 検索エンジンライブラリ Apache Lucene のコミッターも務める。興味のある分野は情報検索と機械学習,自然言語処理。海の見える部屋で猫と暮らすのが夢。"}},{"name":"露木誠","image":"Tsuyuki_Image.jpg","date":"08/29","description":{"p-1":"2000年頃にファッションジュエリー業界からIT業界へ移り、以来ソフトウェアエンジニアとして働いています。","p-2":"Python、Java、Perl、Rubyなどのプログラミング言語を用いてB向けC向けを問わずさまざまな開発に従事してきました。","p-3":"ソフトウェアエンジニア・チーフアーキテクト・テックリードなどとして開発に携わるのみならず、プログラミング講習の講師や自社サービス用工場の立ち上げなど、開発から外れた仕事もしてきました。","p-4":"ここ数年はエンジニアが働きやすい環境づくりなどにも関わっています。"}},{"name":"岩崎祐貴","image":"Iwazaki_Image.jpg","date":"08/28","description":{"p-1":"株式会社サイバーエージェント AI Lab Research Engineer。","p-2":"2014年にサーバーサイドエンジニアとして入社後、インターネット広告事業でScala、JavaScript、Pythonを使った配信基盤や広告レンダリングエンジン、効果予測システムを作成。","p-3":"フロント・インフラ・データ分析業務を経て、2017年から現職。","p-4":"クリエイティブリサーチグループにて広告のテキストや画像、動画等の高次元特徴から配信影響を紐解く研究に従事。","p-5":"ゲームでは魔法使いのような紙耐久アタッカーが好き。"}},{"name":"片寄里菜","image":"Katayose_Image.jpg","date":"08/29","description":{"p-1":"片寄里菜さんは、幼い時より航空機に興味があり、もっと学びたいという想いから東海大学工学研究科・航空宇宙学専攻の博士課程前期に進み、ヘリコプターなど垂直離着陸機の研究を行っていました。","p-2":"大学院修了後は、WEB関連の仕事をしながら個人的な研究テーマを進め、Pythonと出会いました。Pythonでは主にRaspberryPiを使ったモノを動かすプログラミングに視点を置き、開発などを行っていました。 ","p-3":"PyConJPには2016年に初参加。Pythonの楽しさや奥深さを知り、様々なコミュニティに参加し友人・知人を増やしたようです。またPyLadiesTokyoコミュニティ参加をきっかけに、今ではスタッフとして活動しています。","p-4":"登壇経験としてPyConJP2017と2018ではドローンとPythonに関する内容で発表・実演を行いました。またPyCon Thailand2019ではPyLadiesのコミュニティ活動に関する海外の登壇経験もあります。PyConUSなど海外のPyConに参加している経験もあり、精力的に活動を行っています。","p-5":"ご自身の仕事は2018年に株式会社moegiを創業し、計測用のスマホアプリなどを開発。日本だけでなく世界の空の活用法や問題点なども調べ、航空機分野の開発者として活躍できるようにと日々活動をしています。"}},{"name":"Nina Zakharenko","image":"Nina_Zakharenko.jpg","date":"08/28","description":{"p-1":"Nina Zakharenkoは10年を超える経験を持つソフトウェアエンジニアであり、PSF(Pythonソフトウェア財団)のBoard of Directorsに新しく選出された一員でもあります。","p-2":"彼女は現在マイクロソフトのCloud Developer AdvocacyチームでPythonを中心に活動しています。","p-3":"これまでに、彼女はHBO(アメリカのケーブルテレビ局)で衛星を制御するコンピュータのソフトウェアを書いたり、Meetupで情熱を持った人々がつながるのを助けるコードを書いたり、Redditで時間の無駄遣いになるような機能を実装したりしてきました。","p-4":"余暇にはハードウェア、LED、身につけられる電子部品をいじって楽しんでいます。","p-5":"Ninaは開発者に教えることが大好きで、PyCon US、PyCon Russia、EuroPython、アメリカでのDjangoConなど国際的にカンファレンスで登壇しています。今年はPyCon JPにリモートではじめて参加することにワクワクしています。"}}]}}'),delete e.options._Ctor}},353:function(e,t,n){"use strict";var o={props:{connpassLink:{type:String,default:""},name:{type:String,default:""},iconImageLink:{type:String,default:""}}},r=n(5),component=Object(r.a)(o,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"flex items-center justify-center p-4 shadow-lg rounded-xl"},[n("a",{staticClass:"flex items-center justify-center",attrs:{href:e.connpassLink,target:"_blank",rel:"noopener noreferrer"}},[e.iconImageLink?n("img",{staticClass:"object-center w-12 h-12 rounded-full",attrs:{src:e.iconImageLink,alt:"Patron Icon"}}):e._e(),e._v(" "),n("p",{staticClass:"ml-2 text-lg font-semibold text-py-black"},[e._v(e._s(e.name))])])])}),[],!1,null,null,null);t.a=component.exports},354:function(e,t,n){var map={"./Iwazaki_Image.jpg":361,"./Katayose_Image.jpg":362,"./Nina_Zakharenko.jpg":363,"./Rich_Image.png":364,"./Shiba_Image.jpg":365,"./Tsuyuki_Image.jpg":366,"./Uchida_Image.jpg":367};function o(e){var t=r(e);return n(t)}function r(e){if(!n.o(map,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return map[e]}o.keys=function(){return Object.keys(map)},o.resolve=r,e.exports=o,o.id=354},358:function(e,t,n){e.exports=n.p+"img/116f4cc.png"},359:function(e,t,n){e.exports=n.p+"img/d810965.png"},360:function(e,t,n){e.exports=n.p+"img/3137ddb.jpg"},361:function(e,t,n){e.exports=n.p+"img/5f96c96.jpg"},362:function(e,t,n){e.exports=n.p+"img/53ebd00.jpg"},363:function(e,t,n){e.exports=n.p+"img/f81133e.jpg"},364:function(e,t,n){e.exports=n.p+"img/e4501d2.png"},365:function(e,t,n){e.exports=n.p+"img/ca7ec35.jpg"},366:function(e,t,n){e.exports=n.p+"img/fff3783.jpg"},367:function(e,t,n){e.exports=n.p+"img/fd77f68.jpg"},368:function(e,t,n){"use strict";var o=n(332);n.n(o).a},369:function(e,t,n){var o=n(49),r=n(370),l=n(371);t=o(!1);var c=r(l);t.push([e.i,".main-color[data-v-32f02066]{color:#404a6b}.main-visual[data-v-32f02066]{background-image:url("+c+");background-size:contain;background-repeat:no-repeat;background-position:50%}.news-area[data-v-32f02066]{background-color:#d4d4ff}.news-overview-content[data-v-32f02066]{border:8px solid #404a6b}.news-overview-icon[data-v-32f02066]{border-color:#404a6b;background-color:#404a6b}.overview-area[data-v-32f02066]{background-color:#ffd8a1}@media screen and (min-width:768px){.main-visual[data-v-32f02066]{width:30vw}}.emotion-mark[data-v-32f02066]{top:-2.5rem;left:5rem}.balloon-1[data-v-32f02066]{height:110px;left:-520px;top:24px;width:110px}.balloon-2[data-v-32f02066]{bottom:-100px;height:184px;left:-240px;width:184px}.balloon-3[data-v-32f02066]{bottom:0;height:110px;right:-100px;width:110px}",""]),e.exports=t},371:function(e,t,n){e.exports=n.p+"img/cea8b91.png"},372:function(e,t,n){"use strict";var o=n(333),r=n.n(o);t.default=r.a},425:function(e,t,n){"use strict";n.r(t);n(19);var o=n(4),r=n(2),l=n(423),c=n(421),d=n(305),m={props:{talkType:{type:String,default:"talk"},mainColor:{type:String,default:"#3D40CB"}}},f=n(5),h=Object(f.a)(m,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("article",{staticClass:"relative"},[n("div",{staticClass:"relative z-10 flex flex-col items-center justify-center bg-white border-8 border-solid rounded-xl",style:{"border-color":e.mainColor}},[n("div",{staticClass:"mx-6 my-4"},[n("div",{staticClass:"flex flex-col items-center justify-center mb-8"},[e._t("image")],2),e._v(" "),n("h2",{staticClass:"text-xl font-bold md:text-2xl"},[e._t("name")],2),e._v(" "),n("p",{staticClass:"mb-4 text-sm md:text-base"},[e._t("date")],2),e._v(" "),n("p",{staticClass:"mb-8 text-sm md:text-base"},[e._t("description")],2)])]),e._v(" "),n("div",{staticClass:"absolute top-0 w-20 h-20 -mt-6 -ml-10 border-4 border-solid rounded-card-head",class:["talk"===e.talkType?"ml-0 left-1/2":"ml-10 left-3/4"],style:{"border-color":e.mainColor,"background-color":e.mainColor}},[e._m(0)])])}),[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"relative"},[t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-6 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-10 bg-white rounded-full"})])}],!1,null,"fb0d45e0",null).exports,v=n(353),x=r.a.extend({components:{PythonBanner:d.a,TalkContent:h,Patron:v.a},asyncData:function(e){return Object(o.a)(regeneratorRuntime.mark((function t(){var n,o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=e.app,"/2020/_nuxt/news.json",t.next=4,n.$axios.$get("/2020/_nuxt/news.json");case 4:return o=t.sent,t.abrupt("return",{news:o});case 6:case"end":return t.stop()}}),t)})))()},data:function(){return{}},methods:{format:function(e){return Object(l.a)(new Date(e),"yyyy.MM.dd")},formatISO:function(e){return Object(c.a)(new Date(e))}},head:function(){return{title:"PyCon JP 2020",titleTemplate:null}}}),y=(n(368),n(372)),_=Object(f.a)(x,(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"main-color"},[o("section",{staticClass:"relative flex items-start justify-center mb-12 h-80 md:h-120 md:items-center"},[o("div",{staticClass:"relative z-10 mt-16 mr-2 md:m-0"},[e._m(0),e._v(" "),o("div",{staticClass:"mt-6 space-y-2"},[e._m(1),e._v(" "),e._m(2),e._v(" "),o("div",{staticClass:"flex items-center"},[o("img",{staticClass:"h-6 mr-2",attrs:{src:n(358)}}),e._v(" "),o("a",{staticClass:"text-2xl text-blue-400",attrs:{href:"https://twitter.com/search?q=%23pyconjp&src=typed_query",target:"_blank",rel:"noopener noreferrer"}},[e._v("#pyconjp")])])])]),e._v(" "),e._m(3)]),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#EE9D2C",size:"big"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n "+e._s(e.$t("ticket.title"))+"\n ")]},proxy:!0},{key:"content",fn:function(){return[e._v("\n "+e._s(e.$t("ticket.content"))+"\n ")]},proxy:!0},{key:"button",fn:function(){return[o("a",{staticClass:"mt-6",attrs:{href:"https://pyconjp.blogspot.com/2020/07/pycon-jp-2020-conference-ticket-on-sale.html",target:"_blank",rel:"noopener noreferrer"}},[o("button",{staticClass:"relative flex items-center px-4 py-2 mt-6 font-medium transition-colors duration-200 bg-white rounded-full shadow group md:px-6 md:py-6 text-py-black focus:outline-none"},[o("p",{staticClass:"w-6 h-6 rounded-full bg-py-orange-dark"}),e._v(" "),o("span",{staticClass:"ml-2 md:text-xl md:ml-6 md:mr-4"},[e._v("\n "+e._s(e.$t("ticket.button"))+"\n ")]),e._v(" "),o("img",{staticClass:"box-border absolute object-cover object-right w-full md:h-auto lg:w-4/5",attrs:{src:n(359)}})])])]},proxy:!0}])}),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center px-4 pt-12 pb-24 mt-24 m-screen news-area"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n NEWS\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v(e._s(e.$t("news.subtitle")))])]),e._v(" "),o("div",{staticClass:"relative flex flex-col items-center justify-center w-full mt-6 bg-white md:w-3/4 rounded-py news-overview-content"},[o("div",{staticClass:"relative z-10 flex flex-col justify-center px-6 py-12 space-y-6 bg-white sm:px-10 md:px-16 rounded-py"},e._l(e.news,(function(t,i){return o("article",{key:i,staticClass:"flex flex-col justify-between md:flex-row"},[o("time",{staticClass:"mb-2 text-lg font-medium text-left text-gray-700 md:text-xl md:mb-0",attrs:{datetime:e.formatISO(t.pubDate[0])}},[e._v("\n "+e._s(e.format(t.pubDate[0]))+"\n ")]),e._v(" "),o("a",{staticClass:"w-full font-light md:ml-12 hover:underline",attrs:{href:t.link,target:"_blank",rel:"noopener noreferrer"}},[e._v("\n "+e._s(t.title[0])+"\n ")])])})),0),e._v(" "),e._m(4)])]),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center px-4 pt-12 pb-24 m-screen overview-area"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n Overview\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v(e._s(e.$t("overview.subtitle")))])]),e._v(" "),o("div",{staticClass:"relative flex justify-center w-full mt-6 md:w-3/4"},[e._m(5),e._v(" "),o("div",{staticClass:"flex flex-col items-center justify-center w-full overflow-hidden bg-white rounded-py news-overview-content"},[o("div",{staticClass:"relative z-10 flex flex-col justify-between w-full bg-white lg:flex-row rounded-py"},[o("div",{staticClass:"flex flex-col flex-1 px-6 py-12 sm:px-10 md:px-16"},[o("h2",{staticClass:"inline mb-2 text-2xl font-semibold md:text-4xl"},[e._v("\n What is PyConJP?\n ")]),e._v(" "),o("h3",{staticClass:"mb-8 text-xl font-medium md:text-2xl"},[e._v("\n "+e._s(e.$t("overview.contentTitle"))+"\n ")]),e._v(" "),o("p",[e._v("\n "+e._s(e.$t("overview.content"))+"\n ")]),e._v(" "),o("nuxt-link",{staticClass:"self-center",attrs:{to:e.localePath("/code-of-conduct")}},[o("button",{staticClass:"flex items-center self-center justify-center px-2 py-2 mt-6 font-medium duration-200 bg-white rounded-full shadow group md:px-6 md:py-6 text-py-black hover:bg-py-black focus:outline-none transition-color"},[o("p",{staticClass:"w-6 h-6 rounded-full bg-py-black group-hover:bg-white"}),e._v(" "),o("span",{staticClass:"mx-4 md:text-xl group-hover:text-white"},[e._v("\n "+e._s(e.$t("overview.button"))+"\n ")])])])],1),e._v(" "),o("img",{staticClass:"box-border object-cover object-right w-full h-64 md:h-auto lg:w-2/5",attrs:{src:n(360)}})])])])]),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center mt-12"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n Conference\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v(e._s(e.$t("conference.subtitle")))])]),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#3D40CB",size:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Keynote\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap justify-around mt-12 mb-12"},e._l(e.$t("keynote"),(function(t,r){return o("talk-content",{key:t.name,staticClass:"w-full md:w-2/3 xl:w-2/5 xl:mt-0",class:[0==r?"mt-8":"mt-20"],attrs:{"talk-type":"talk"},scopedSlots:e._u([{key:"image",fn:function(){return[o("img",{staticClass:"object-cover object-top w-24 h-24 rounded-full md:w-40 md:h-40",attrs:{src:n(354)("./"+t.image)}})]},proxy:!0},{key:"name",fn:function(){return[e._v(e._s(t.name))]},proxy:!0},{key:"date",fn:function(){return[e._v(" "+e._s(t.date)+" ")]},proxy:!0},{key:"description",fn:function(){return e._l(t.description,(function(t,n){return o("p",{key:"p-"+n},[e._v("\n "+e._s(t)+"\n ")])}))},proxy:!0}],null,!0)})})),1),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#EE9D2C",size:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Invited talk\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap justify-around mt-12 mb-12"},e._l(e.$t("invited-talk"),(function(t){return o("talk-content",{key:t.name,staticClass:"w-full mt-16 md:w-2/3 xl:w-2/5",attrs:{"talk-type":"talk","main-color":"#EE9D2C"},scopedSlots:e._u([{key:"image",fn:function(){return[o("img",{staticClass:"object-cover object-top w-24 h-24 rounded-full md:w-40 md:h-40",attrs:{src:n(354)("./"+t.image)}})]},proxy:!0},{key:"name",fn:function(){return[e._v(e._s(t.name))]},proxy:!0},{key:"date",fn:function(){return[e._v(" "+e._s(t.date)+" ")]},proxy:!0},{key:"description",fn:function(){return e._l(t.description,(function(t,n){return o("p",{key:"p-"+n},[e._v("\n "+e._s(t)+"\n ")])}))},proxy:!0}],null,!0)})})),1)],1),e._v(" "),o("section",{staticClass:"flex flex-col items-center justify-center mb-8 space-y-12"},[o("div",{staticClass:"flex flex-col items-center"},[o("h2",{staticClass:"inline mb-2 text-4xl font-semibold md:text-6xl"},[e._v("\n Sponsor\n ")]),e._v(" "),o("p",{staticClass:"mb-8 text-xl md:text-2xl"},[e._v("-"+e._s(e.$t("sponsor.subTitle"))+"-")])]),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#71A4F1",size:"small",length:"long"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Platinum\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.platinum"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-2/5",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#E3AB4A",sie:"small",length:"mid"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Gold\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.gold"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("python-banner",{attrs:{direction:"right","back-ground-color":"#818181",size:"small",length:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n Silver\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"grid grid-cols-1 gap-4 pb-8 md:grid-cols-2"},e._l(e.$t("sponsor.silver"),(function(t){return o("a",{key:t.companyName,attrs:{href:t.url,target:"_blank",rel:"noopener noreferrer"}},[o("p",{staticClass:"text-2xl break-all"},[e._v("\n "+e._s(t.companyName)+"\n ")])])})),0),e._v(" "),o("python-banner",{staticClass:"mt-16",attrs:{direction:"right","back-ground-color":"#3D40CB",size:"small",length:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n SPECIAL\n ")]},proxy:!0}])}),e._v(" "),o("h3",{staticClass:"mt-6 text-4xl font-medium text-py-black"},[e._v("\n "+e._s(e.$t("sponsor.message.specialSponsor"))+"\n ")]),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.special.cooperation"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{staticClass:"w-full",attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("h3",{staticClass:"mt-16 text-4xl font-medium text-py-black"},[e._v("\n "+e._s(e.$t("sponsor.message.tutorial"))+"\n ")]),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.special.tutorial"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{staticClass:"w-full",attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("h3",{staticClass:"mt-6 text-4xl font-medium text-py-black"},[e._v("\n "+e._s(e.$t("sponsor.message.media"))+"\n ")]),e._v(" "),o("div",{staticClass:"flex flex-wrap items-center justify-center"},e._l(e.$t("sponsor.special.media"),(function(e){return o("a",{key:e.companyName,staticClass:"w-full m-8 md:w-1/3",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer"}},[o("img",{staticClass:"w-full",attrs:{src:n(302)("./"+e.imagePath)}})])})),0),e._v(" "),o("python-banner",{staticClass:"mt-16",attrs:{direction:"right","back-ground-color":"#3F496A",size:"small",length:"small"},scopedSlots:e._u([{key:"title",fn:function(){return[e._v("\n PATRON\n ")]},proxy:!0}])}),e._v(" "),o("div",{staticClass:"flex flex-wrap mt-4 mb-8"},e._l(e.$t("sponsor.patron"),(function(e){return o("Patron",{key:e.name,staticClass:"ml-4",attrs:{"connpass-link":e.connpassLink,name:e.name,"icon-image-link":e.iconImageLink}})})),1)],1)],1)}),[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{staticClass:"text-4xl font-extrabold leading-tight md:text-6xl"},[this._v("\n PyCon JP "),t("br"),this._v("2020 "),t("span",{staticClass:"font-semibold"},[this._v("Online")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{staticClass:"flex items-center text-2xl md:text-3xl"},[t("i",{staticClass:"mr-2 material-icons"},[this._v("location_on")]),this._v("\n Online Conference\n ")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{staticClass:"flex flex-wrap items-center justify-start text-2xl md:text-3xl"},[t("i",{staticClass:"mr-2 text-gray-700 material-icons"},[this._v("event")]),this._v(" "),t("span",{staticClass:"mr-1 font-semibold"},[this._v("2020 08/28 ")]),this._v("(Fri.) /\n "),t("span",{staticClass:"mx-1 font-semibold"},[this._v("29 ")]),this._v("(Sat.)\n ")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"absolute w-screen h-full opacity-25 md:opacity-100 main-visual md:w-50vw md:relative"},[t("div",{staticClass:"absolute hidden rounded-full balloon-1 bg-py-blue-light md:block"}),this._v(" "),t("div",{staticClass:"absolute hidden rounded-full balloon-2 bg-py-orange-light md:block"}),this._v(" "),t("div",{staticClass:"absolute hidden rounded-full balloon-3 bg-py-orange-light md:block"})])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"absolute top-0 w-20 h-20 -mt-8 border-4 border-solid rounded-card-head news-overview-icon"},[t("div",{staticClass:"relative"},[t("div",{staticClass:"absolute w-2 h-2 mt-0 ml-6 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-12 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute text-5xl font-bold emotion-mark"},[this._v("\n !\n ")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"absolute top-0 w-20 h-20 mx-auto -mt-8 border-4 border-solid rounded-card-head news-overview-icon"},[t("div",{staticClass:"relative"},[t("div",{staticClass:"absolute w-2 h-2 mt-2 ml-4 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute w-2 h-2 mt-0 ml-10 bg-white rounded-full"}),this._v(" "),t("div",{staticClass:"absolute text-5xl font-bold emotion-mark"},[this._v("\n ?\n ")])])])}],!1,null,"32f02066",null);"function"==typeof y.default&&Object(y.default)(_);t.default=_.exports}}]); \ No newline at end of file diff --git a/2020/_nuxt/content/db.json b/2020/_nuxt/content/db.json index 61f95f2..0a8987e 100644 --- a/2020/_nuxt/content/db.json +++ b/2020/_nuxt/content/db.json @@ -1 +1 @@ -{"_env":"NODEJS","_serializationMethod":"normal","_autosave":false,"_autosaveInterval":5000,"_collections":[{"name":"items","unindexedSortComparator":"js","defaultLokiOperatorPackage":"js","_dynamicViews":[],"uniqueNames":[],"transforms":{},"rangedIndexes":{},"_data":[{"body":[{"id":"214734","title":"Opening (Day 1)","room":"#pyconjp","day":"1","no":"","elevator_pitch":"Opening (Day1).\r\nYouTube Live: https://youtu.be/rq1LHsvJmWA\r\n","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"Opening (Day1).\r\nYouTube Live: https://youtu.be/rq1LHsvJmWA\r\n","name":"","profile":""},{"id":"214736","title":"基調講演:芝世弐氏","room":"#pyconjp","day":"1","no":"","elevator_pitch":"Day1 Keynote by Seiji Shiba.\r\nYouTube Live: https://youtu.be/rq1LHsvJmWA","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Keynote","audience_python_level":"","audience_expertise":"","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"芝世弐氏による基調講演です。\r\n\r\nhttps://pyconjp.blogspot.com/2020/06/pycon-jp-2020-announcement-of-keynote.html","name":"芝世弐","profile":"2017年に独学で機械学習を始め,同年に初参加の将棋電王トーナメントにて準優勝。\r\n翌年には世界コンピュータ将棋選手権に初参加で優勝してしまう。\r\n以後,2019年および2020年の大会では準優勝と参加大会の平均順位が1点台という驚異的な強さを誇る。\r\n本職は数値シミュレーションを主とする研究者であるが最近の発表は大半将棋に関するものになっている。\r\n趣味はビールと将棋観戦。\r\n\r\nIn 2017, he began self-taught machine learning, and in the same year, he became the runner-up in the Shogi (Japanese Chess) Den-O tournament he participated in for the first time.\r\nThe following year, he won the World Computer Shogi Championship even though it was the first time he participated.\r\nSince then, he has been a runner-up in the 2019 and 2020 meets and has a phenomenal one-point average ranking in the participating meets.\r\nHe is a researcher who mainly works on numerical simulations, but most of his recent publications have been about shogi.\r\nHis hobbies are beer and watching shogi."},{"id":"202715","title":"2020年代のコンテナ時代のPythonアーキテクチャ&デプロイ","room":"#pyconjp_4","day":"1","no":"1","elevator_pitch":"機械学習をAPIサービスとして実装するか、バッチ処理にするか、はたまた通常のウェブアプリを実装するかによらず、デプロイ手段として重要度が増しているのがコンテナです。ローカルで開発環境を作る上でも便利です。コンテナに適したアプリケーションの作法を学ぶとともに、asyncioを使うことでそのパフォーマンスを引き出します。最後にそれらをコンテナにまとめてデプロイする方法を学びます。","prerequisite_knowledge":"Dockerやコンテナとはなにか?Dockerfileを書ける知識については問わない\r\nクラウドとはなにか?\r\nウェブアプリケーションを何かしら作ったことがある","audience_takeaway":"12 factors appに従った今どきのアプリケーションに求められる特性\r\nPython 3時代のハイパフォーマンスなウェブサービスの実装方法\r\nビルド時間が短く、性能がよく、サイズも良く、セキュリティも高いDockerイメージを作る","talk_format":"Talk(45min)","audience_python_level":"Advanced","audience_expertise":"50%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"クラウドサービスがどんどん拡充されていく中、大きなウェイトを締めてきているのがコンテナです。本番環境で活用している事例も多く、今後導入を考えている人もどんどん増えています。開発環境の一部としての利用もますます増えています。\r\n\r\nhttps://www.publickey1.jp/blog/20/docker142idc_japan.html\r\nhttps://www.jetbrains.com/lp/python-developers-survey-2019/\r\n\r\nコンテナを知ることで、技術革新の高速道路に乗りやすくなります。Pythonの用途は機械学習を中心として広がっていますし、以前からのウェブアプリケーション開発もあります。そのどの用途であっても、APIサーバー、ウェブサービス、バッチを作ることになりますが、それらはコンテナとして動かすことができ、従量課金のサーバーレスといったコンテナネイティブな運用方法に乗せることができます。費用的にも、管理的にもメリットが得られます。\r\n\r\nコンテナで動くアプリケーションにもいくつか作法があります。コンテナという枠の中で動くために自由に触れません。作法に従うことでトラブルを減らすことができますし、コンテナネイティブな設計はシンプルになるため、開発の手間も少なくなります。ウェブフロントエンドのJavaScriptの開発とセットで行う方法など、開発環境、デバッグ方法についても紹介します。\r\n\r\nコンテナ中で動くアプリケーションは特定のCPU/メモリの中で動作します。つまり、CPUを引き出すのがコンテナ時代にはハイパフォーマンスに動くアプリケーションの要件になります。Python2がEOLになることで、Python3のasyncioを活かしやすくなります。すでにasyncioを活かすライブラリがたくさん出ています。asyncioの仕組みや基本を紹介したあとに、Python 3時代の高速なウェブアプリケーションやバッチ処理の実装方法についても紹介します。\r\n\r\n最後に、Dockerイメージの作成方法を学びます。Dockerイメージ作成も、少し知識がないと、色々選択肢があって迷います。用途に合わせた最適なベースイメージを選択する方法、そして今どきのDockerの機能を生かした効率的なDockerfileの書き方を紹介します。\r\n\r\n* 自己紹介(3min)\r\n* コンテナ(15min)\r\n * コンテナとはなにか\r\n * コンテナは開発支援ツール\r\n * コンテナはデプロイツール\r\n * Lambda/Functionsとの違い\r\n * 12 factors appに従ったPythonコンテナの作成\r\n * デバッグ・デプロイ\r\n * コンテナで動くアプリケーションの今どきのログ出力\r\n * 分散トレーシング\r\n* コンテナ時代のモダンPythonアーキテクチャ(15min)\r\n * CPUバウンドとI/Oバウンド\r\n * コンテナやクラウドの性能を引き出すには?\r\n * 3系ならasyncio\r\n * Starlette\r\n * aiohttp\r\n * asyncpgなど\r\n* パッケージングしてデプロイ(10min)\r\n * ビルド時間が短く、性能がよく、サイズも良く、セキュリティも高いイメージを作る\r\n* まとめ(2min)","name":"shibukawa","profile":"Python 2.1ぐらいからのPythonユーザー。エキスパートPythonプログラミングの翻訳者の1人。Python以外にはTypeScript/Go/C++あたり。のユーザー。"},{"id":"213314","title":"Invited talk: The Python Community, Stronger Together","room":"#pyconjp_1","day":"1","no":"1","elevator_pitch":"2020 has been a year like no other in recent memory. A global pandemic has made shelter-in-place the new normal. You can no longer attend local Python meetups, or travel to conferences local or international to see your favorite speakers. Thankfully, the community has adapted, and new opportunities to participate remotely have popped up. Let's learn how to navigate this new landscape and be stronger together,","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(30min)","audience_python_level":"","audience_expertise":"","track":"Community building related to Python","lang_of_talk":"English","lang_of_slide":"English only","description":"Invited talk by Nina Zakharenko\r\n\r\nhttps://pyconjp.blogspot.com/2020/08/invited-talks5.html","name":"Nina Zakharenko","profile":"Nina Zakharenko is a software engineer with over a decade of experience and a newly elected member of the Board of Directors of the PSF. She currently focuses on Python at Microsoft on the Cloud Developer Advocacy team. In the past, she’s written software for satellite control computers at HBO, code that's helped people connect over their passions at Meetup, and implemented time-wasting features on Reddit. In her spare time, she enjoys tinkering with hardware, LEDs, and wearable electronics.\r\n\r\nNina loves teaching developers and has spoken at conferences like PyCon US, PyCon Russia, EuroPython, and DjangoCon in the US and internationally. This year, she's very excited to join PyCon Japan remotely for the first time!"},{"id":"203955","title":"Python 3.9 時代の型安全な Python の極め方","room":"#pyconjp_2","day":"1","no":"1","elevator_pitch":"Python は動的型付き言語ですが、「型ヒント」によって変数などに型を定義できます。型ヒントを活用すれば IDE での補完が強力になったり、静的解析で\"型安全\"にできるなど、動的型付き言語でありながら、型の恩恵を得ることができるのです!\r\n型ヒントの環境は年々進化しています。Python 3.9 でのアップデートや、Google/Microsoft による型チェッカーの公開などもあり、型ヒントを書いたことがあっても最新情報をキャッチアップができていない方も多いと思います。\r\n\r\nJX通信社で型ヒントを数年活用して「型の恩恵」を得てきたスピーカーが、最新の型ヒントの活用方法を紹介します。","prerequisite_knowledge":"Python 3 の基本的な文法。必須ではありませんが、静的型付け言語の経験などがあるとスムーズです。\r\n","audience_takeaway":"- 最新の型ヒントの使い方\r\n- mypy などを活用した、型安全な Python の書き方\r\n- 実務での型ヒントや mypy の活用方法","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"このセッションでは、Python 3.5 で公式サポートされた「型ヒント (Type Hint)」について、2020年現在の最新状況を紹介します。\r\n\r\nPython は動的型付き言語ですが、型ヒントを使うと、ソースコード上の変数などに型の情報を付与できます。サードパーティーツールと組み合わせれば IDE での補完や型の誤りのチェックなど、静的型付き言語のようなメリットが得られます。\r\n実際に、私が所属する JX 通信社では、なるべく \"型安全\" な Python を書いてチーム開発する文化があり、型を意識した Clean Architecture の実践、CI での型チェックなども行ってきました。\r\n\r\nまた、Python の型ヒントを取り巻く環境は年々進化しています。文法自体のアップデートもありますが、typing モジュールや typeshed が拡充されていたり、mypy 以外の型チェックツールも Google や Microsoft によって公開されています。\r\n\r\nこのセッションは、型ヒントを実務で活用してきた経験を活かし、「Python3.9時代」の型ヒントを紹介するのがメインテーマです。主に次のようなトピックを扱います。\r\n1. 型ヒントに関する概要\r\n2. Python 3.9 を想定した型ヒントの使い方\r\n3. 2020年現在のサードパーティーツールによる静的型チェック\r\n4. JX 通信社での実事例\r\n\r\n構成とタイムラインは以下の通りです。\r\n\r\n- 導入 (7min)\r\n - 型ヒントとは何か、何でないか\r\n - 型ヒントでできること\r\n- 型ヒントの書き方 (15min)\r\n - 基本的な書き方\r\n - ジェネリクスなどの高度な型の紹介\r\n - Protocol を使った構造的部分型の紹介\r\n - Python 3.9、3.8 でのアップデート\r\n- サードパーティーツールの活用 (10min)\r\n - mypy の紹介\r\n - pyright、pytypeなどの新しい型チェックツール\r\n - pydantic の活用\r\n- 型ヒントを実務に活かす (10min)\r\n - CI に組み込むときのテクニック\r\n - 型定義されてないライブラリに出会ったとき\r\n- まとめ (1min)\r\n- 質疑応答 (2min)\r\n","name":"yamitzky","profile":"株式会社JX通信社の開発担当役員(CDO)。エンジニアとしては、Scala や Python を使ったデータ解析や TypeScript でのフロントエンド開発などを経験"},{"id":"203572","title":"unittest.mockを使って単体テストを書こう 〜より効率的で安定したテストに〜","room":"#pyconjp_3","day":"1","no":"1","elevator_pitch":"このトークは、Pythonで単体テストを書いたことはあるけれども、モックオブジェクトは知らないという方向けです。\r\n同じテストケースなのに実行結果が異なったり、テストの実行速度が遅くて悩んだことはありませんか。\r\nそんな時の解決策として、モックオブジェクトがあります。\r\nこれはプロダクトコードの一部をテスト用オブジェクトに置き換えるというものです。\r\nこれをPythonで使うには、unittest.mockモジュールを使います。\r\nこのトークでは、モックオブジェクトの基本的な考え方とunittest.mockモジュールの使い方を扱い、\r\n聴衆の方がPythonでモックオブジェクトを適切に使えるようになることを目的としています。","prerequisite_knowledge":"- Pythonで単体テストを書いた経験が必要です。(unittestモジュールでもサードパーティのテストライブラリでもどちらでも構いません)\r\n- unittestモジュールの基本的な文法(assertEqualやassertRaisesなど)を知っている前提なので、単体テスト自体の文法の説明はしません。\r\n- unittest.mockモジュールを利用したことがあると理解しやすいですが、概念や使い方から説明しますので必須ではありません。","audience_takeaway":"モックオブジェクトの考え方\r\n- モックオブジェクトを使う目的\r\n- モックオブジェクトの使い方\r\n- 使い方アンチパターンとその対応策\r\n\r\nunittest.mockモジュールの使い方\r\n- unittest.mockモジュールの基本的な文法\r\n- unittest.mock.Mockとunittest.mock.MagicMockの仕組み\r\n- unittest.mockを使って困ったこととその対策\r\n- datetime.datetime.nowをモックするには\r\n- unittest.mock.patchが当たらない原因と対策\r\n- ある関数が呼ばれたことだけテストするには\r\n- 外部APIへのリクエストを含む関数をテストするには","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"### 話さないこと\r\n* テスト実行に便利なツールの紹介(coverageなど)\r\n* pytestの紹介及びunittestとの比較\r\n* E2Eテスト、結合テストの話\r\n\r\n\r\n### 話すこと\r\n単体テストの目的(3分)\r\n単体テストの目的\r\n単体テストを書くメリット\r\n\r\n単体テストの理想像(3分)\r\n単体テストは下記の条件が揃っているべきです\r\n- 速く実行されます\r\n- 常に同じ条件下で同じことがテストされます\r\n- 外的要因を排除します\r\n- 1つのテストメソッドは1つのことのみを確認していなければなりません\r\n- テスト対象の関数の振る舞いを担保します\r\n\r\n単体テストでモックオブジェクトを使う理由(5分)\r\n- モックオブジェクトを使っていないためテストが失敗したり成功したりする例\r\n- モックオブジェクトの説明\r\n- モックオブジェクトを使った解決策の説明\r\n\r\nPythonのunittest.mockの基本的な使い方(10分)\r\n- 具体的なコードを用いて説明します。\r\n\r\n\r\nunittest.mock.Mockとunittest.mock.MagicMockの仕組み(8分)\r\n- 具体的なコードを用いて説明します。\r\n\r\nモックオブジェクトアンチパターン(5分)\r\n- モックオブジェクトをメンテナンスしない故に、テストは通っているのにバグが発生\r\n- よくテストされた箇所、もしくはテストが不要なほど細分化された箇所のみをモックオブジェクトに置き換えるべきです\r\n- TypeHintで精査して変更した箇所に他の箇所が型違反していないか確認することでアトリビュートの齟齬によるエラーを防げます\r\n\r\n\r\nunittest.mockモジュールを使って困った点とその対策(5分)\r\n- unittest.mock.patchが当たらない\r\n- assert_called_once_withなど、関数が呼ばれたことを確認する方法\r\n- APIのレスポンスをモックオブジェクトに置き換えることで、外部- APIを呼び出す関数の振る舞いをテストします\r\n- datetime.datetime.nowをモックオブジェクトに置き換えられない場合、datetime.datetime.nowを引数に持たせるかPythonの3rdパーティライブラリ「freezegun」を使ってテストします\r\n","name":"みずき","profile":"2018年に趣味でPythonを始め、2019年1月からずっとPythonでWeb開発に従事しています。\r\n2020年4月から現職。"},{"id":"203929","title":"数理最適化×機械学習コラボレーションによる課題解決","room":"#pyconjp_5","day":"1","no":"1","elevator_pitch":"データサイエンスの潮流の中の一つとして、機械学習と数理最適化を組み合わせて課題解決をする流れが出来つつあります。\r\n機械学習の得意なところ、数理最適化での得意なところをコラボレーションさせることによって、データ分析結果から意思決定まで繋げることが可能となります。\r\n具体例としては①メーカーでの需要予測→生産計画立案や物流計画の立案、②人材サービスにおけるスキルシート分析→人材アサイン計画の立案といった例があげられます。このような課題をPythonとPandas、Scikit-Learn、Google OR-Toolsでシームレスに実現することができます。本発表ではGoogle OR-Toolsを使ったコーディング方法、組合せ最適化問題のモデリング、問題分割や計算の高速化方法といった実践的なポイントを事例とともに説明します。","prerequisite_knowledge":"機械学習という言葉を聞いたことがある\r\n数理最適化という言葉を聞いたことがある","audience_takeaway":"Pythonの機械学習/数理最適化ライブラリの名前、使い方、それらを組み合わせた課題解決方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"データサイエンスの潮流の中の一つとして、機械学習と数理最適化を組み合わせて課題解決をする流れが出来つつあります。\r\n本発表では、Pythonによる機械学習と数理最適化の組み合わせにより課題解決をする方法をご紹介します。\r\n\r\n機械学習では、与えられたデータについての判別、分類、予測といったことを得意としています。対して、数理最適化では制約条件と、目的とする評価指標を定義し、その評価指標を最大化(もしくは最小化)する最適解を導きだす、意思決定をするといったことを得意としています。これまでは、何かのデータをそのまま使って数理最適化で意思決定をすることが実施されてきましたが、近年ではデータの蓄積やデジタルトランスフォーメーションにより、ユーザの抱えている問題が複雑化高度化して、解決すべき課題も難しくなってきています。\r\n\r\n一例を挙げてみると、メーカーが販売計画や物流計画を作成するとき、元となる過去のデータから、未来の状態を予測して意思決定をしなければなりません。また、過去のデータが文書データである場合には、最適化で利用できるよう数値に変換をしなければなりません。このように、機械学習や自然言語処理を活用して変換や予測した結果を用い、数理最適化で意思決定をすることでデータ分析から、計画立案という意思決定までをPythonを使って実現することができます。\r\n\r\n本発表では、弊社での取り組みの一つとして、簡単な自然言語処理と数理最適化を組み合わせた事例を紹介いたします。弊社では人材派遣業をおこなっておりますが、エンジニアの採用という業務の中で、効率よく面接計画を立案しなければならないという課題がありした。実際には、ベテランの営業管理者が、営業担当者のスキルと採用応募者のスキルを照らし合わせ、マッチングの高い組合せでスケジュールの合う担当者を割り当てる、といった作業を毎日実施していました。\r\n\r\n営業担当者のスキルとしては、金融、製造といった業種、PythonやJavaといったプログラミング言語、プロジェクトマネージャや、プロジェクトリーダー、SE、PL、PG、データサイエンティストといった担当領域など、いくつかのベクトルがあり、同ように、エンジニア側にもいくつかのベクトルがありました。これらの過去データを機械学習にかけてマッチング度を算出し、営業担当者と採用応募者の面接可能日時を制約条件として、全体的なマッチング度が最も高い面談スケジュールを立案することが可能となります。その効果として、営業部全体での業務負荷低減と効率的な人材確保を期待することができます。\r\n\r\n必要なものはPythonとPandas、Scikit-Learn、Google OR-Toolsという誰もが利用できるPythonパッケージです。本発表では事例の他に、Google OR-Toolsを使った基礎的なプログラミングから、組合せ最適化問題のモデリング、問題の分割や計算の高速化といった実践的なポイントも事例とともに紹介いたします。","name":"鈴木 庸氏","profile":"株式会社リーディングエッジ社にて、PythonとOR-Toolsによる需要予測/物流計画最適化を担当しています。Python3スキルアップ教科書の共同著者、オペレーションズリサーチ学会員。\r\n\r\ntwitter -url:https://twitter.com/suzuki_youji"},{"id":"215380","title":"PyCon JP Association 運営会議(公開型)","room":"#pyconjp","day":"1","no":"","elevator_pitch":"一般社団法人PyCon JP Association の公開運営会議を開催します。\r\n\r\nZoomでの配信となります(YouTube Liveでは配信されません)。connpassチケットをお持ちの方は、connpassの「参加者への情報」に記載のURL一覧からアクセスください。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"一般社団法人PyCon JP Association の公開運営会議を開催します。\r\n\r\nZoomでの配信となります(YouTube Liveでは配信されません)。connpassチケットをお持ちの方は、connpassの「参加者への情報」に記載のURL一覧からアクセスください。\r\n\r\n---\r\n\r\n参加にあたって特に前提知識やPythonスキルは不要です。","name":"","profile":""},{"id":"203640","title":"Machine Learning Outside the Kaggle Lines","room":"#pyconjp_5","day":"1","no":"2","elevator_pitch":"Kaggle competitions are great, but what do you do when you have a cool idea for your own machine-learning project? Learn about all the dirty data, bugs of others, and keeping it all running, when building from zero to production. Hear about the mistakes that I've made so you can avoid them yourself.","prerequisite_knowledge":"This talk is for people who are familiar with the popular tools of machine learning in Python, but have little experience with real-world machine learning projects or applications. They know about, and probably have used, libraries such as Numpy, Pandas, Scikit-Learn, and Tensorflow, but mostly in the the context of a class project or Kaggle competition.","audience_takeaway":"From this talk, the audience will learn more about the challenges and pitfalls that come with building their own machine learning applications from scratch, so as to better avoid them and increase their chances of producing a complete, successful project.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":"Machine learning is more art than science, and it isn't alway clear how you go from Kaggle competitions to building your own machine learning project from scratch. You have a cool idea, but how do you turn it into an application that you can show off to your friends, basking in the warmth of their envy? More importantly, what mistakes do you need to avoid in order to keep the hope of such basking alive?\r\n\r\nCome along and hear of my missteps, assumptions exposed and exploded, and the unpleasant surprises that come from doing machine learning in the wild. You'll learn about how to deal with haphazard data entry, depending on the kindness of strangers, boxes of different shapes and sizes, and, finally, what to do when all of this changes, because it will.\r\n\r\nIf you're interested in machine learning and are familiar with the basic tools and techniques, but are unsure of how to take a project idea to production, this talk will at least show you what not to do and how not to do it.\r\n\r\nOutline:\r\n1. Introduction (2 mins)\r\n * Explain Aussie Rules Football, footy tipping, and inspiration for the project.\r\n * Set up structure of the talk: two seasons-worth of work, with what I did wrong in season one, and how I did it better (but not perfectly) for season two.\r\n2. Understanding the Problem (2 mins)\r\n * Season one: I just built a model to predict winners and losers.\r\n * I didn't realise that one has to predict margins as well.\r\n * Season two: I built a model to predict margins.\r\n3. Collecting the Data (5 mins)\r\n * Season one: I wrote my own web scraper.\r\n * Season two: I imported data from a package that did the web scraping for me.\r\n * It's good to share the work rather than go it alone.\r\n * Use the right tool for the job: importing data from an R package can be less work than getting it yourself.\r\n * Season one: I panicked and changed my data source, because the original source didn't update at the beginning of the week.\r\n * Season two: I updated data in accordance with scheduled updates to websites.\r\n * It's important to understand the source of data in addition to the data itself.\r\n4. Cleaning the Data (5 mins)\r\n * Season one: I filled and/or dropped blank data and hoped for the best.\r\n * Season two: I added a lot of assertions about the shape and content of data to raise errors early.\r\n * Explicit assertions about your assumptions catch buggy data that wouldn't raise errors otherwise.\r\n * With dynamic data sources, unexpected bugs pop up regularly; static unit tests won't catch them.\r\n5. Model Selection (2 mins)\r\n * Season one: I started with multi-layer RNNs, because deep learning is the best, right?\r\n * Season two: I tested a wide variety of model types, and NNs didn't have the best performance.\r\n * Test your assumptions, because sometimes the results will surprise you.\r\n * Interpretability and maintainability matter, because this isn't something you turn in for the best possible score then forget about.\r\n6. The Joy of Production (5 mins)\r\n * Season one: I deployed to Heroku right before the season started, and it didn't work.\r\n * Some C libraries weren't available in that environment.\r\n * I deployed a Docker container to make sure all dependencies were in production.\r\n * Season two: I deployed a container to Heroku right before the season started, and it didn't work.\r\n * New player data set was too big and exceeded the free-tier memory limit.\r\n * I paid for a larger server, until I could change the app's architecture.\r\n * Know the differences between local and production environments, especially the limitations of the latter.\r\n7. Conclusion (2 mins)\r\n * Season one: despite the mistakes, I won my office footy tipping competition by one whole point.\r\n * Season two: despite the improvements, I lost my office footy tipping competition by five points.\r\n * Doing things the right way improves your chances, but doesn't guarantee victory.","name":"Craig Franklin","profile":"Craig is a professional web developer by way of digital marketing and an amateur data scientist by way of wanting to understand what in the world all these numbers mean. Writing Ruby by day, his passion projects are centered around sports, data, and machine learning, all for the ultimate prize of bragging rights. Originally from the suburbs of Seattle, WA, he currently lives in Melbourne, Australia."},{"id":"203235","title":"PythonからGolangに変更してから再びPythonに戻った理由","room":"#pyconjp_2","day":"1","no":"2","elevator_pitch":"会社でPythonでGolangを使うことに決めましたが、Pythonに戻った経験を共有します。\r\nそして1ヶ月ぶりにPythonを使ってMirco Serviceをランチすることができました。\r\nなぜGolangに移ることに決め、戻ってきた理由を共有します。\r\nMirco Serviceの2つをリリースし、PythonとGolangを一緒に使用した経験をもとに、Pythonがなぜこのように生産性が良く、愛されるのかについて話します。","prerequisite_knowledge":"PythonでHTTP Request(requests), JsonやXMLを使用する方法。\r\n\r\nDjangoサーバーを作った経験があれば良いですが、なくても理解する上で大きな無理はなさそうです。\r\n\r\nそして、Golangに関する基本的な知識があればやはりいいです。 DDDやMSAについて聞いたことがある人なら理解するのに役立つでしょうが、メインテーマではないので大丈夫です。","audience_takeaway":"PythonがGolangに比べて持つ強みは何か(Pythonの魅力)!\r\n\r\nMicro Serviceに合わせて言語を選択する方法\r\n\r\nPythonでNetwork Requestを送り、Json/XMLを処理する方法\r\n\r\nGolangという言語の簡単な使い方","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"BUZZVIL(my company)ではPythonとGolangを使用してMonolithic ArchitectureでMicro Service Architectureとして、漸進的に変えています。\r\nしたがって、新たに製作するMicro ServiceをGolangで作ったが、すでに使用していたPythonに比べ、不便な点が多かったです。 したがって、Micro Serviceの発売まで長い時間がかかるようになりました。\r\nその次のMicro Serviceは再びPythonを使用するようになり、はるかに短い期間内にオープンが可能になりました。\r\nその過程でどのような点がプロジェクトの進行に影響を与え、Pythonのどんな点が生産性、恒常を持ってくるのか分析しました。\r\n\r\n\r\n導入\r\n- 自己紹介(3min)\r\n- 会社がMonolithicからMSAに移った背景について (4min)\r\n\r\n1. Type System (8min)\r\n1-1. Introduce Golang.\r\n1-2. Duck Typing / Structural Typing\r\n1-3. Functional Programming\r\n\r\n2. HTTP Client (8min)\r\n2-1. Python requests\r\n2-2. Golang net/http\r\n2-3. What is the difference?\r\n2-4. Concurrency\r\n\r\n3. Handling JSON (8min)\r\n3-1. Python json\r\n3-2. Golang encoding/json\r\n3-3. What is the difference?\r\n3-4. XML の場合どうなるか。\r\n\r\n4. 開発環境(8min)\r\n4-1.ORMではどう違うか\r\n4-2. Package 管理者(pip / go mod)\r\n4-3. Lint / Test / Etc\r\n\r\n\r\n仕上げ\r\n\r\n- 現在のプロジェクト結果(2~3min)\r\n- 質疑応答(3min)","name":"Las","profile":"恋人に従ってプログラミングを学ぶとプログラマーになった人。 プログラミングを教える高校を出てすぐ会社で仕事中。"},{"id":"203891","title":"Pythonパッケージの影響を歴史から理解してみよう!","room":"#pyconjp_4","day":"1","no":"2","elevator_pitch":"distutils、easy_install、setuptools、pip、tox、venv、pipenv、poetry などの Python パッケージツールの起源を考えたことがありますか? このトークでは、「Pythonソフトウェア Distribution」の歴史を紹介します。\r\n\r\nコミュニティが Python パッケージを提案する以前、どのように大企業は Python パッケージを作成していたか、ご存知ですか?このトークでは、とある大企業が自作Pythonパッケージシステム運用に苦戦した過去、そこから学んだ教訓、そして最終的にコミュニティのPythonパッケージを採用した理由について紹介します。\r\n\r\nPython パッケージの歴史や、大企業が苦戦したPythonパッケージシステム運用話について興味があれば、ぜひ参加してください。","prerequisite_knowledge":"【Prerequisite knowledge】\r\n- Basic experience in python packaging. Related technical terms: distutils, setuptools, pip, and PyPI.\r\n\r\n【Optional knowledge】\r\n- Newer Python packaging tools: bento, twine, flit, pipenv, and poetry.\r\n- Famous PEP mentioned in Outline of Description.","audience_takeaway":"- Well-organized history timeline with detail. \r\n- Learn the history of python packaging and the reason behind different solutions.\r\n- Learn the build system experience from the speaker, and be able to make right decision in the first place if they meet similar problem in the near future.","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"There's a [talk by Dustin](https://www.youtube.com/watch?v=na0hQI5Ep5E) presented similar \"time travel\" content from community perceptive. In this talk, I will present the impact of the evolvement of python packaging and provide my company as an example which built before Python community had Python packaging solution.\r\n\r\nThe talk contains 2 parts: History (Fact) and Treatment (Action).\r\n\r\nIn the 1st section, I will cover history of \"Python Software Distribution\" along with few PEP and their corresponding tools, including Metadata (RFC822, PEP241, 314, 345, 426, 459, 566), Database (PEP262, 376, 427, 440), and Runtime (PEP405, 374, 582) and share my insight from the history.\r\n\r\nIn the 2nd section, I will talk about the treatment for company started before those idiomatic tools built, our learned lessons, and available treatments in 2020.\r\n\r\n---\r\n\r\nOutline and timeline are as follows.\r\n\r\n1.自己紹介と動機 【3分】\r\n2.Python パッケージの歴史 【18分】\r\n - Python1(2.5分)\r\n - ソースコードを他の人と共有するには?\r\n - Python2(3.5分)\r\n - メタデータ (PEP241 & PEP314 & PEP345 / distutils / setuptools)\r\n - Python Package Index (easy_install)\r\n - ソフトウェア Distribution (PEP262)\r\n - Python3 (5.5分)\r\n - より良いメタデータ (PEP426 & PEP459 & PEP566)\r\n - パッケージの依存関係管理 (PEP386 & PEP440 & PEP508)\r\n - PyPI がパッケージのホスティングを開始 (pip / twine / bento / flit)\r\n - ソフトウェア Distribution (PEP376 / PEP425 & 427 & 491)\r\n - Python2+3 & Other Problems(5.5分)\r\n - 複数 Python バージョンのサポート (tox / virtualenv / PEP405/pipenv)\r\n - 複数 OS での Python のサポート (PEP513 & PEP517 & PEP571 / Conda & Anaconda (2014))\r\n - Poetry: 1つのツールですべてを処理 (PEP517 & PEP518 & PEP582)\r\n3. 歴史から学ぶこと 【4分】\r\n - Python パッケージの進化\r\n4.コミュニティが Python パッケージを解決する前の挑戦 【12分】\r\n - Python パッケージに標準はない\r\n - ゼロからパッケージシステムを構築する\r\n - 弊社のパッケージシステムの概用\r\n - 弊社のパッケージシステムの教訓\r\n - なぜ古いOSを維持するのか?\r\n - コミュニティソリューションに移行する理由\r\n - コミュニティソリューションはより速く確実に拡張される\r\n5.コミュニティが Python パッケージを解決した後の挑戦 【5分】\r\n - 企業とコミュニティの理想的な関係\r\n - メタデータ標準の数 ∝ ツールの数\r\n - 2020 年に Python アプリケーションを作成したら...\r\n - PyPI へパッケージをアップロードしたかったら...\r\n6.まとめ 【3分】\r\n\r\n---\r\n\r\n7.Python パッケージの歴史に関する資料【0分】\r\n - 歴史\r\n - Dustin Ingram @ SciPy 2018: Inside the Cheeseshop: How Python Packaging Works\r\n - Kenneth Reitz @ PyCon 2018: Pipenv: The Future of Python Dependency Management\r\n - Clinton Roy @ Kiwi PyCon X (2019): The Packaging Lifecycle with Poetry\r\n - History of packaging written by Martijn Faassen\r\n- パッケージ\r\n - Dave Forgac @ PyOhio 2015: Python Packaging from Init to Deploy\r\n - Elana Hashman @ PyCon 2019: The Black Magic of Python Wheel\r\n - Official Document: Packaging binary extensions (2013)\r\n- デプロイ(仮想環境)\r\n - Carl Meyer @ PyCon 2011: Reverse-engineering Ian Bicking's brain: inside pip and virtualenv\r\n - Bernat Gabor @ EuroPython 2019: Status quo of virtual environments","name":"Kir Chou","profile":"A code monkey builds search services in Amazon jungle. This will be the 4th year of his presence in PyCon JP."},{"id":"213320","title":"招待講演:ある個人開発 OSS の歩み:5 歳になった Janome のこれまでと,これから","room":"#pyconjp_1","day":"1","no":"2","elevator_pitch":"2015年に生まれた Janome は,今年で開発5年目となりました。PyConJP 2015での発表から,これまでに行ってきた機能開発や改善について,技術的な解説を交えつつ振り返ります。また,今後追加していきたい機能や,個人開発のモチベーションをゆるく長く保ち続けるコツについてもお話できればと思います。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(45min)","audience_python_level":"","audience_expertise":"","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"打田智子氏による招待講演です。\r\n\r\nhttps://pyconjp.blogspot.com/2020/08/invited-talks1.html","name":"打田智子","profile":"2007年に筑波大学大学院システム情報工学研究科の博士前期課程を修了後,いくつかのIT系企業を経て,現在は株式会社 LegalForce の R&D チームで検索システムや言語処理の研究開発に従事。2015年に Python 製日本語形態素解析ライブラリ Janome を OSS として公開し,同年 PyConJP にも登壇。Janome の開発をほそぼそ続けながら,2019年から OSS 検索エンジンライブラリ Apache Lucene のコミッターも務める。興味のある分野は情報検索と機械学習,自然言語処理。海の見える部屋で猫と暮らすのが夢。"},{"id":"203810","title":"関数型Pythonアンチパターン","room":"#pyconjp_3","day":"1","no":"2","elevator_pitch":"今日関数型プログラミングは一般的技法になりつつあります。うまく取り入れれば、状態変化によるバグを追放し、簡潔なコードを書けるでしょう。\r\nただし、Pythonの特性を考慮せぬまま他の言語の関数型スタイルを真似ると、趣味的で読みづらいコードになりかねません。\r\nこのトークでは、Pythonで実用的なコードを書く上で、たとえ関数型であっても避けるべき書き方を紹介します。具体的には、以下のアンチパターン/パターンを扱います。\r\n\r\n* 長い式、複雑なlambdaを書く/式を名付ける\r\n* map・filterを多用する/内包を使う\r\n* 内包やreduceを濫用する/ループを書き、隠蔽する\r\n* クロージャを濫用する/適切にクラスを定義する","prerequisite_knowledge":"Pythonの基礎的な文法の理解。\r\n関数型プログラミングについての基礎知識や、関数型言語を扱った経験があると理解しやすいですが、必須ではありません。","audience_takeaway":"* 関数型プログラミングとは何かという抽象的な理解\r\n* 関数型プログラミングで可読性を壊さないようにするTips\r\n* Pythonicで実用的なコードにおいて、内包表記や高階関数を活用するTips","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"まずトークの目標として、いわゆる関数型言語に似たコードを書く方法ではなく、実用的な関数型プログラミングの方法を追求することを述べます。ただし何が良いコードか、Pythonicなコードかということに客観的基準はないことを強調しておきます。\r\n次に関数型プログラミングを次の2点によって定義し、その利点を説明します。\r\n\r\n* 高階関数の多用: 抽象的で簡潔なコードを書ける\r\n* 状態変化の追放: バグを減らし、テストしやすくする\r\n\r\nそして、Pythonで実用的関数型プログラミングを行う上で避けるべき三つのアンチパターンを紹介します。\r\n一つ目、「長い式、複雑なlambdaを書く」。他の言語における関数型の書き方をまねようとすると、高階関数をずらずら連ね、複雑なラムダ式を書くことになりがちです。ですがPythonは、式の改行がしづらく、ラムダ式も煩雑な言語です。PEP8による一行の文字数制限も厳しいです。むしろ、式は適切に区切り、ラムダ式はローカル関数にして、説明的な名前をつけるとPythonらしいでしょう。\r\n二つ目、「map/filterを多用する」。状態変化なしにコレクション処理を行おうとしたとき、一般的な言語ではmap/filter等を使いますが、Pythonではこの限りではありません。Pythonでは普通内包表記を多用します。イニシャライザにイテレータを取れば自作クラスでも内包表記に近い書き方ができますし、ローカル関数と組み合わせれば複雑な内包もシンプルに書けます。\r\n三つ目、「内包やreduceを濫用する」。Pythonで関数型のプログラムを書こうとして、複雑なreduceや内包表記を書くと読みづらくなりがちです。Guidoもreduceより、状態変化を含むforループを好んでいました。たとえ状態変化を含んではいても、コードを関数に切り出し、変化を隠蔽できれば、実質的には関数型プログラミングと同じであり、可読性も高まります。\r\n四つ目、「クロージャを濫用する」。関数型スタイルにおいては、しばしばクロージャを返す高階関数を使います。ただしPythonにおいては、クラス定義によってほぼ同じ機能を実現できます。オブジェクト指向に慣れた人には、むしろそちらの方が読みやすいでしょう。チームメンバーの好みと相談しつつ、状態変化があったり一定程度複雑な場合はクラス定義に書き換えるといいでしょう。\r\n\r\n構成とタイムラインは以下です。\r\n\r\n* 導入(5分)\r\n - 自己紹介\r\n - 問題設定\r\n* 関数型プログラミングの定義(5分)\r\n - 高階関数の多用\r\n - 状態変化の追放\r\n* アンチパターン1: 長い式、複雑なlambdaを書く(3分)\r\n - アンチパターンの例\r\n - 長い式がPythonっぽくない理由\r\n - 式を区切り名付ける\r\n* アンチパターン2: map/filterを多用する(5分)\r\n - アンチパターンの例\r\n - 内包表記を使う例\r\n - 独自クラスで内包表記っぽく書く\r\n - ローカル関数と組み合わせる\r\n - map/filterが便利なケース\r\n* アンチパターン3: 内包やreduceを濫用する(4分)\r\n - アンチパターンの例\r\n - 状態変化+forを関数に隠蔽する\r\n - 関数に切り出せば状態変化も問題ない\r\n* アンチパターン4: クロージャを濫用する(5分)\r\n - アンチパターンの例\r\n - オブジェクトに書き換える\r\n - \\_\\_call\\_\\_を使う\r\n - 使い分けを考える\r\n* まとめ(1分)\r\n* 質疑応答(2分)","name":"佑京 鈴木","profile":"株式会社ピコラボにて受託研究開発に従事するプログラマ。"},{"id":"203756","title":"Django + SQLAlchemy: シンプルWay","room":"#pyconjp_3","day":"1","no":"3","elevator_pitch":"DjangoのORMはとても便利です。しかし、SQLならすぐに書ける「サブクエリをINNER JOINする」「1つのテーブルを2回OUTER JOINする」といったクエリをDjango ORMで表現するのは苦手です。生のSQLを書いてDjangoで実行する方法もありますが、動的にSQLを組み替えるのが難しくなったりSQL Injectionのリスクもあるためお勧めできません。SQLAlchemyを使えば、この問題を解決できます。このトークでは、SQLAlchemyでSQLの組み立てる方法と、Django上で安全に実行する方法について紹介します。","prerequisite_knowledge":"Django ORM, SQL","audience_takeaway":"SQLAlchemyの使い方、Djangoとうまく組み合わせて使う方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"DjangoのORMはとても便利ですが、少し複雑なクエリを組み立てようとすると急に難しくなってしまうことがあります。例えば、サブクエリの結果をINNER JOINしたい場合や、1つのテーブルを2回OUTER JOINしたい場合などは、SQLならすぐに書けるのにDjango ORMで表現するのがとても難しかったり、不可能だったりします。このような場合にSQLを直接書いて `Model.objects.raw()` や `execute()` で実行する方法もありますが、この方法では動的にSQLを組み替えるのが難しくなったりSQL Injectionのリスクもあります。\r\nこのトークでは、SQLAlchemyをSQL表現言語として使う事でSQLの組み立てをプログラムで行い、Django上で安全に実行する方法を紹介します。\r\n\r\nアジェンダ\r\n\r\n* Django ORMで表現が難しいSQLの例\r\n* SQLを直接書いてrawやexecuteで実行する例と問題点\r\n* SQLAlchemyの紹介と簡単な実行例\r\n* 複雑なSQLをSQLAlchemyで組み立てる\r\n* SQLAlchemyとDjangoの連携\r\n","name":"shimizukawa","profile":"BeProud所属。一般社団法人PyCon JP 会計理事。2003年からPythonを使い始め、Python mini Hack-a-thonなどPython関連イベント運営のかたわら、国内外のカンファレンスへ登壇しPython技術情報を発信するなど、公私ともにPythonとその関連技術の普及活動を行っている。最近Drone飛ばし始めました。\r\n著書/訳書:『自走プログラマー(2020年 技術評論社刊)』『Pythonプロフェッショナルプログラミング第3版(2018 秀和システム刊)』『エキスパートPythonプログラミング 改訂2版(2018 アスキードワンゴ刊)』『独学プログラマー(2018 アスキードワンゴ刊)』『Sphinxをはじめよう第2版(2017 オライリー・ジャパン刊)』。\r\n"},{"id":"203309","title":"I can't believe it's still here!","room":"#pyconjp_4","day":"1","no":"3","elevator_pitch":"\"I can't believe this piece of code is still here!\"\r\n\r\nYou may shout it out when you see a function should have been deprecated in 3 years ago. The function may be created by your ex-colleagues but no one manages it after his / her leave. It may hit the system now, or just silently stay in the great number of source files. You may still ponder the next move - remove it now, or let it stay there until the application retirement. The talk will dives into this scenario and purpose a systematic approach, [auto-deprecator](https://github.com/auto-deprecator/auto-deprecator), to resolve the problem.","prerequisite_knowledge":"No prerequisite is required.","audience_takeaway":"- The target audience are those who cares about software quality, ranging from open source project contributors to enterprise application product owner. \r\n\r\n- The audience can have a high level view on removing a dead code without much effort.","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"English","lang_of_slide":"English only","description":"### Introduction (2 mins)\r\n\r\n### Case study (3 mins)\r\n\r\nThe introduction is a case study of Knight Capital Group incident in 2012. The incident was a major stock market disruption caused by the group and led to a huge trading loss in the firm. The root cause was an expired application called Power Peg accidentally running after the market open, and the application was running for 45 minutes until the team discovered and shut it down. The case is a good example to illustrate how a technical debt of unused codes can turn into a financial debt in a company.\r\n\r\n### Analysis (5 mins)\r\n\r\nMost developers are smart and passionate in programming, but why do they tend to keep a dead source code in the project? \r\n\r\nFirst the following myths will be deserted in the talk.\r\n\r\nMyth:\r\n\r\n- Lack of diligence and attitude\r\n\r\n- Lack of incentive\r\n\r\n- Lack of development time and resource\r\n\r\nThen the following reasons will be gone through\r\n\r\n- Uncertainty and indefinite business value to clean technical debt\r\n\r\n- Unclear usage from the clients and downstream processes on the existing application\r\n\r\n- Missing tools / systematic approach to remove unused codes\r\n\r\n### Approach (7 mins)\r\n\r\nThe talk will separate the timeline to retire an unused function into three stages: Warning, Expired and Cleaning.\r\n\r\n1. Warning\r\n\r\nThe stage requires to alert the developers and users the future deprecation of the code. If the piece of code is used in the closed system, the developers should head up the team on it. The easiest way is to put the concerned developer into the pull requests to review. A message, an email, or a release notes is also an appropriate approach.\r\n\r\nIf it is public for the users or the depending systems, it can first give a deprecation warning when it is called. The product owner should also plan ahead the expiry version and execute it in the future. Finally, a conversation with the potentially impacted clients is a direct approach.\r\n\r\nAlso, releasing the software with versions aligned with [SemVer 2.0](https://semver.org/) can give a big hints for the users of choosing a proper version to install.\r\n\r\n2. Expired\r\n\r\nIn the expired stage, the user should get an exception when the deprecated function is called. In the interactive usage, the user migrate the deprecated function to the suggested one in the exception message. For the downstream process, if its developers are not aware of the deprecation plan before the expired stage, they can still work around the exception with a specified handling, e.g. injecting environment variable.\r\n\r\n3. Cleaning\r\n\r\nAfter the expired stage, the deprecated function should be removed from the code base. It is easy to execute, but also easy to forget the execution in the stage. If it requires the manual effort to proceed this process, the team has to strive a good balance on the deprecation frequency. For example, in pandas, the deprecations will only be enforced in major releases, so that the team can focus on functionity enhancement and bug fix in the minor versions.\r\n\r\n### Auto deprecator (5 mins)\r\n\r\nThe library [auto-deprecator](https://github.com/auto-deprecator/auto-deprecator) will be introduced as a systematic approach to the approach mentioned before. The section will go though some code examples about how the library can tackle the problem pragmatically. I will also compare the library `auto-deprecator` with other open source libraries, e.g. [deprecated](https://github.com/tantale/deprecated) \r\n\r\n1. Warning\r\n\r\nDeveloper can put a Python decorator on the function or class method to warn the users the expiry version and migrated function name. To customize the handling method to align with the team practice, the default warning behavior, i.e. throwing `DeprecatedWarning`, can be modified.\r\n\r\nMeanwhile, the downstream processes can test the impact of the deprecated function by injecting the environment variable `DEPRECATED_VERSION`.\r\n\r\n2. Expired\r\n\r\nThe nightmare for the developers is once the function is deprecated, the clients or the developers of the downstream processes call in and ask back the function. They may not be aware of the deprecation schedule, or they do not have sufficient development resource to handle it in time. The environment variable `DEPRECATED_VERSION` is the last safeguard to this situation.\r\n\r\n3. Cleaning\r\n\r\nThe script `auto-deprecate` in the library can be added in the continuous integration / continuous delivery flow. Before releasing the package, the script removes all the expired source codes, and run all the unit test cases. It saves the development time to manually execute the code removal in a systematic approach.\r\n\r\n### Conclusion (3 mins)\r\n\r\n### Q&A (5 mins)","name":"Gavin Chan","profile":"Gavin Chan is a principal quantitative developer in AXA Investment Managers Chorus Ltd with 7+ years of experience in software development and finance industry."},{"id":"203588","title":"Python × AWS × Serverless 初学者が次の一歩を踏み出すためのテクニック","room":"#pyconjp_2","day":"1","no":"3","elevator_pitch":"サーバーレスが界隈でホットな話題になってゆくなか、初学者であった私は興味を持ちつつも中々チュートリアルの次に進めずにいました。入門編の次の一歩を踏み出すための情報源が少なく、何から始めたらよいのかがわからなかったのです。この状況は私が観測する限り現在も続いており、多くの初学者が同じ悩みを持っているのではないかと思います。\r\n\r\n私が業務経験やプライベートの開発において得た知見の一部を紹介することで、以前までの私と同様の悩みを抱えていたエンジニアの助けになればと思います。","prerequisite_knowledge":"[1] デコレータに関する知識\r\n自力で実装できる必要はないが、どのようなものであるかは知っていること。\r\nロギング周辺の話題で扱います。\r\n\r\n[2] AWS Lambda に関する知識\r\n資料等で概要を知っているのであれば、それでも構いません。\r\nHello world レベルでも、経験があると望ましいです。\r\nIAM等の周辺知識は不要です。\r\n\r\n[3] Serverless Framework もしくはそれに類するフレームワーク(※)の利用経験\r\nデプロイまでのチュートリアル程度の経験があると望ましいです。\r\nしかし、冒頭に簡単に説明はするので必須ではないと考えています。\r\n(※) ... AWS SAM, Terraform, Zappa など","audience_takeaway":"・サーバーレス開発におけるプロジェクト構成\r\n・ローカルとクラウドの両方で動作する、開発やすいコードのあり方\r\n・運用時に役に立つロガーの作り方","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Serverless Framework が普及したことで、サーバーレス開発を取り巻く環境は大きく進化しました。ごく簡単なボットアプリケーションやAPIサービスであれば、極めて短時間で自身のコードをデプロイすることができます。\r\n\r\nしかし、そのような入門体験を終えた後、次の足場を見失ってしまう初学者も多いのではないかと思います。ひとつの理由は、サーバーレス開発におけるイディオム、あるいはプラクティスと呼べる情報源が比較的少ないことにひとつの理由があるのではないかと、私は考えています。\r\n\r\nそこで、このセッションでは発表者が業務で得た知見を交えつつ、サーバーレス開発をより豊かにするノウハウをご紹介します。\r\n構成とタイムラインは以下の通りです。\r\n\r\n・導入 (2min)\r\n ・自己紹介\r\n ・本発表のモチベーション\r\n・AWSにおけるサーバーレスアプリケーション構築の基本 (3min)\r\n ・イベント駆動アーキテクチャへのシフト\r\n・Serverless Framework 基本のおさらい (3min)\r\n ・Hello world / プロジェクト作成からLambda Function のデプロイまで\r\n・プロジェクト構成の一例 (5min)\r\n・python-dotenv と serverless-dotenv-plugin の活用 (7min)\r\n ・ステージごとの変数管理\r\n ・ローカルとクラウドの両方で動作するコード\r\n・ロギングのプラクティス (7min)\r\n ・トレース可能なIDを付与する\r\n ・JSONロガーを用意する\r\n ・ハンドラ関数にロギング用デコレータをアタッチする\r\n・まとめ (1min)\r\n・質疑 (2min)","name":"hassaku","profile":"株式会社サーバーワークス所属。ここ1年ほど、MSP(マネージド・サービス・プロバイダ)事業に関わるプロダクトの保守と開発をやっています。\r\n\r\n技術同人誌「実践 AWS CDK - TypeScript でインフラもアプリも! (技術書典9 出典作品)」の共同著者です。\r\nhttps://booth.pm/ja/items/1881928"},{"id":"203453","title":"PythonでXBRL形式の財務情報を扱おう","room":"#pyconjp_5","day":"1","no":"3","elevator_pitch":"コロナ禍に見舞われた今年、上場企業の財務状況の変化に興味を持つ方が増えているのではないでしょうか。\r\nこのトークでは、Python製OSSであるArelleを利用し、XBRL形式の有価証券報告書から欲しい情報を取得する方法を共有します。","prerequisite_knowledge":"- 何らかのパッケージを使ってPythonでスクリプトを書いた経験。\r\n- XML形式のデータを解析したこと、財務諸表を読んだことがあるとトークがより理解しやすいですが、必須ではありません。","audience_takeaway":"- Python製OSS Arelleの使い方\r\n- XBRLの基礎知識\r\n- 金融庁EDINETから有価証券報告書などのデータを取得する方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"XBRLとは、各種事業報告用の情報を作成・流通・利用できるように標準化されたXMLベースの言語です。\r\n日本では上場企業などに対し、有価証券報告書などの書類をXBRL形式で提出することを(原則)義務付けており、そのデータは金融庁のEDINETという電子開示システムで公開されています。\r\n\r\n1社の過去数年の実績推移や2社比較などを行う場合は、無償公開されている分析用サービスを利用すると手間が掛からず便利でしょう。 \r\nしかし、ある業種の企業全体をまとめて扱ったり公開サービスで提供されていない分析を行ったりしたいケースもあると思います。そのような時には自分で必要なデータを作成する必要があります。\r\n\r\nそのデータの作成方法と、必要な前提知識をこのトークで紹介します。 \r\n \r\nXBRLの解析には Arelle というPython製のOSSを使用します。Arelle は XBRL International というXBRLを開発・保守する組織により、XBRL仕様に準拠したレポート使用ソフトウェアとして認定されています。 \r\nArelleを活用することで仕様の複雑なXBRLの解析が楽になります。 \r\nしかし、その使い方が分かる情報は現状では少ないです。 \r\nこのトークでは、上記のデータ作成例を通して、Arelleの主要な機能の使い方も紹介していきます。\r\n \r\n処理対象として、EDINETで公開されている上場企業の有価証券報告書(または四半期報告書)を使用します。 \r\n財務分析はトーク対象外です。 \r\n\r\n構成とタイムラインは以下のとおりです。 \r\n※多少変更する可能性があります\r\n\r\n+ 導入 (2min)\r\n - 自己紹介\r\n - きっかけ\r\n\r\n+ XBRL (4min)\r\n - XBRLとは\r\n - 基本構造\r\n  - タクソノミ\r\n  - インスタンス\r\n\r\n+ EDINET (4min)\r\n - EDINETとは\r\n - EDINETタクソノミ\r\n - 提出者別タクソノミ\r\n - 必須項目\r\n\r\n+ Python製OSS: Arelle (3min)\r\n - Arelleとは\r\n - ArelleでXBRLを解析するメリット\r\n\r\n+ 財務三表の概要 (3min)\r\n\r\n+ 複数企業の財務データをまとめて扱う際の注意点 (2min)\r\n\r\n+ PythonでXBRL形式の有価証券報告書を扱おう (10min)\r\n - EDINETからデータ取得(EDINET API)\r\n - XBRLデータから欲しい情報を取得(Arelle)\r\n  - 会社情報、提出書類情報\r\n  - 財務情報\r\n - 出力\r\n\r\n+ まとめ (1min)\r\n+ 質疑応答 (1min)","name":"Miyasaka Eriko","profile":"経理歴3年、現在はデータ分析系の業務と趣味でPythonを使っています。"},{"id":"213316","title":"招待講演:続・小さく始めて大きく育てるMLOps2020","room":"#pyconjp_1","day":"1","no":"3","elevator_pitch":"乱立するJupyter Notebook、身元不明なデータ、再現しない学習結果、引き継ぎできない実験コード…\r\nそんな課題を解決するべく、今日から始められるMLOpsを紹介します。\r\n趣味の機械学習から研究室での実験管理、プロダクトでの運用まで、広く参考になれば幸いです。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(30min)","audience_python_level":"","audience_expertise":"","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"岩崎祐貴氏による招待講演です。\r\n\r\nhttps://pyconjp.blogspot.com/2020/08/pycon-jp-2020-3-announcement-of-invited.html","name":"岩崎祐貴","profile":"株式会社サイバーエージェント AI Lab Research Engineer。\r\n2014年にサーバーサイドエンジニアとして入社後、インターネット広告事業でScala、JavaScript、Pythonを使った配信基盤や広告レンダリングエンジン、効果予測システムを作成。\r\nフロント・インフラ・データ分析業務を経て、2017年から現職。\r\nクリエイティブリサーチグループにて広告のテキストや画像、動画等の高次元特徴から配信影響を紐解く研究に従事。\r\nゲームでは魔法使いのような紙耐久アタッカーが好き。"},{"id":"215383","title":"スペシャルブースツアー","room":"#pyconjp","day":"1","no":"","elevator_pitch":"スペシャルブースを紹介するコーナーです。\r\nconnpassチケットをお持ちの方は、connpassページの「参加者への情報」のURL一覧からアクセスしてください。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"スペシャルブースを紹介するコーナーです。\r\nconnpassチケットをお持ちの方は、connpassページの「参加者への情報」のURL一覧からアクセスしてください。\r\n","name":"","profile":""},{"id":"203925","title":"Exploring Biasness in Indian Media","room":"#pyconjp_5","day":"1","no":"4","elevator_pitch":"Recognition of bias in Indian Media poses a serious challenge due to the existence of various regional languages, political parties and huge population with different mindsets. I addressed this by finding out the kind of stories selected by media and find out the ideology that it promotes.","prerequisite_knowledge":"Target audience having introduction about ML methods would be great but it is not necessary.","audience_takeaway":"After watching this talk, audience will get to know about Topic Modelling and how to solve a unsupervised learning problem statement. This talk mainly covers the approach we took from the ground up which will be beneficial for beginners.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":" Introduction\r\nWe will discuss what is Biasness and why is it important. We will also discuss with some examples from India Media context to get a brief about data.\r\n \r\n Basics\r\nWe will mainly discuss about Topic Modelling and go brief on Latent Dirichlet Allocation Algorithm. We will implement LDA using gensim.models.ldamodel.\r\n\r\n Methodology\r\nWe will go over how we approached Biasness for Indian Media Context. All our experiments in this project were carried out using Python and it's different libraries. \r\n\r\nIn the end we will talk about the results and takeaway from the project.\r\n\r\nOutline:\r\n1. Intro to Bias and Types of Bias [5 Min]\r\n2. Brief about Indian media and Dataset Introduction[2 Min]\r\n3. Into to Topic Modelling [3 Min]\r\n4. Approach Outline[10 Min]\r\n * Why we used latent dirichlet allocation and Demo\r\n * Our Methodology\r\n5. Takeaways and What does the results signify?[5 Min]\r\n6. Q&A [5 Min]","name":"prashant0598","profile":"Prashant is a distinguished full-stack data scientist, skilled in application of machine learning techniques for solving data based problems. Currently, a final year undergraduate Computer Science student and also a Data Science Intern at Guavus . He is an experienced open source developer and have also mentored for SCoRE Lab. He began his career as Data Science Intern at PwC where he worked with Logistics client to automate their internal process and drive sales .\r\n\r\nPrashant is Co-Organiser of Local Python Community group called PyJaipur, which is largest technical group in that state. He is an active community guy and loves to share and learn as much he can by organizing Meetup and networking with individuals."},{"id":"203875","title":"GAE/Python2 to Python3 Migration Journey","room":"#pyconjp_2","day":"1","no":"4","elevator_pitch":"本セッションでは、Google App Engine (GAE) の Python 2.7 で構築されたアプリケーションを、 Python 3.7 基盤に移行していく際の戦略・戦術についてお話します。GAE/Python2とPython3は、基盤の設計思想が大きく異なるため、単なる言語バージョン更新ではなく、アプリケーションの根幹となるライブラリ・アーキテクチャの刷新が必要なプロジェクトです。APIエンドポイントが300個ほどあるアプリケーションを、安定稼働させながら順次移行していくために編み出した戦術・戦略についてお話します。","prerequisite_knowledge":"Webアプリケーション開発を行った経験がある","audience_takeaway":"大規模なアプリケーション・アーキテクチャの変更を、安全・確実に進めるためのナレッジ","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"本セッションでは、Google App Engine の第一世代ランタイムである Python 2.7 で構築されたアプリケーションを、第二世代ランタイムである Python 3.7 に移行していく際の戦略・戦術についてお話します。\r\n\r\nGoogle App Engine (GAE) は、 Google が提供するWebアプリケーション実行基盤です。 GAEそのものは、Google Cloud ブランドが登場する以前の 2008年から提供されている歴史あるサービスです。\r\nGAEの第一世代(Python2.7)と第二世代(Python3.7)の間では、アプリケーション構築のアプローチが大きく異なります。第一世代ランタイムでは、アプリケーション開発に必要となる多くの機能(データベース、非同期タスク、スケジューラ、全文検索、キャッシュ等)が AppEngine SDK に統合されており、対応するライブラリを import するだけで利用することができました。第二世代ランタイムでは、各機能に対応する後継のクラウドサービスを1つずつ自分で選択して組み込む形へと変化しました。\r\n\r\nこのように、GAE/Python2 から GAE/Python3 への移行は、単なる言語バージョンの更新プロジェクトではなく、アプリケーションの根幹となるライブラリ・アーキテクチャの刷新を必要とするプロジェクトです。私達の開発するアプリケーションは、300個近いAPIエンドポイントを持っており、これらを一度に全て切り替えることは困難です。安定稼働させながら、順次移行していくために編み出した以下のような戦術・戦略についてお話する予定です。\r\n\r\n- API単位での部分移行戦略\r\n- アプリケーション基盤ライブラリのギャップを埋めるための独自ライブラリ整備\r\n- 型ヒント等を活用した堅いプログラミング\r\n- 実データでの互換性チェック環境の構築\r\n- など\r\n\r\n構成・タイムライン\r\n - はじめに・自己紹介 - 5分\r\n - 背景 - 5分\r\n - GAE移行の戦略 - 7分\r\n - GAE移行の戦術 - 8分\r\n - まとめ - 5分\r\n","name":"Akira Yumiyama","profile":"株式会社レヴィ CTO として「変化に強いシステム設計」を広めるためサービス開発を行いつつ、技術顧問としても活動している"},{"id":"203941","title":"Pythonで始める負荷試験","room":"#pyconjp_4","day":"1","no":"4","elevator_pitch":"Webシステム運用時に避けては通れない工程のひとつに負荷試験があります\r\n負荷試験に用いられるツールには様々なツールが存在しますが、\r\nどのツールを用いても以下のようなことに直面するのではないでしょうか?\r\n\r\n複雑なシナリオを書かざるを得ない状況\r\nアプリケーションの更新に合わせてシナリオも更新しなくてはいけない状況\r\nチームメンバーへシナリオを共有しなくてはいけない状況\r\n様々な境界値や条件を指定してテストをしなくてはいけない状況\r\nテスト結果を共有しなくてはいけない状況\r\n\r\nこれらに対してPythonを用いてチーム開発の現場で取り組んだ内容を、\r\n実例を元にデモを交えてご紹介させて頂きます","prerequisite_knowledge":"Pythonを用いてwebアプリケーションを作成した経験\r\n負荷試験を行った経験があるとより理解が深まると思いますがMUSTではありません","audience_takeaway":"・Pythonを用いて負荷試験を行う方法\r\n・Locustの操作方法\r\n・負荷試験手法ならびに結果を俗人化させない方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"JMeterやGatlingなど負荷試験では様々なツールが用いられています\r\nしかし、Locustを用いた負荷試験の実例は他ツールに比べて数が少ないのが現状です\r\nまた、Webシステムに対して負荷試験を行う際に直面する「複雑なシナリオ作成」・「境界値の変更」だけでなく\r\nチームメンバーへの「シナリオの共有」・「結果の共有」をどのように実現したか\r\n実際の事例を元に本発表でお伝えさせて頂ければと思います\r\n構成とタイムラインは以下のとおりです\r\n- 自己紹介(1分)\r\n- Locustの紹介(5分)\r\n - インストール方法\r\n - シナリオの書き方・起動の仕方\r\n- 活用方法(10分)\r\n - なぜLocustを使おうとしたか\r\n - 他のツールとの比較検討\r\n - 負荷試験実施\r\n - 境界値の変え方\r\n - テスト条件変更方法\r\n - シナリオの更新・共有\r\n - テスト結果の共有\r\n - どんなメリット・デメリットがあったか\r\n- デモンストレーション(10分)\r\n- まとめ(3分)\r\n- 質疑応答(1分)","name":"Yusuke Nishio","profile":"株式会社ブレインパッド,Webアプリケーションエンジニア\r\nリスティング広告運用自動化ツールの開発に従事"},{"id":"201618","title":"What happens behind execution of an `import` statement?","room":"#pyconjp_1","day":"1","no":"4","elevator_pitch":"Have you ever spent 10-15 minutes debugging ImportErrors, ModuleNotFoundErrors, without reaching anywhere? Would you want to learn about what happens from the moment Python parses 'import x', to the point when you execute a function of 'x' module? Let's dig into the internals of the Python's import system.","prerequisite_knowledge":"Syntactic knowledge of Python\r\nShould have come across import/$PYTHONPATH related errors\r\nIf you don't know either and still like the talk idea, please follow [this](https://gist.github.com/plant99/9fee5dbe73f25d4da9c7fb956a36b889) gist to 'intentionally' come across the errors :)","audience_takeaway":"An understanding of the import system's mechanics, which helps to quickly debug and fix path/import related errors.\r\nKnowledge of import hooks, to build custom import related plugins.","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Python core","lang_of_talk":"English","lang_of_slide":"English only","description":"TL;DR\r\n\r\nThis talk follows this template to explain what goes on in the background when you execute from spam import ham, or any other import statement. Additionally, it discusses import hooks and how use them.\r\n\r\n\r\nIntroduction\r\n\r\nEvery Python script involves import statements. And if you develop software with Python, you might already have come across import and path related errors like ImportError, ModuleNotFoundError, etc.\r\nIt's important to know the import mechanics, both for general knowledge, and to develop custom plugins to tweak the import system. In this talk, we'd discuss in detail about how the import system works, its components and what tasks they perform respectively.\r\n\r\n\r\nWho should attend this talk?\r\n\r\nThis talk is most suitable for beginner to intermediate level Pythonistas.\r\n\r\n\r\nHow does the talk proceed?\r\n\r\n- The talk starts with packages in Python, and how to organize Python files in order to make them distributable, and importable.\r\nIt proceeds to discuss about $PATH and $PYTHONPATH, and how they are used to enable system-wide imports, and how capable are Python's path based import handlers, if they let a programmer import from remote URIs, etc.\r\n- Different types of packages such as regular packages, namespace packages, frozen modules, etc. are discussed.\r\n- After that, some key components are introduced i.e sys.modules and how modules are refreshed and regulated in runtime, what finders and loaders are, and what 'import protocol' is, sys.meta_path, sys.path_hooks\r\n- The talk then goes in detail about finders, the default finders in Python, spec object, and its functioning.\r\n- After finders, loaders are discussed with sample code, explaining the steps involved from processing a spec, and creating, executing, and loading a module to sys.modules.\r\n- After finders and loaders, 'import hooks' are discussed i.e how Python allows injection of custom components to handle a pre-defined import statement.\r\n- This follows a demonstration of import hooks, implementation of a meta_path finder Class which protects importing of modules from an http server with a token exchange. (So the source code is protected, and it can be logged who requested the source code by a signature to act against misuse.)\r\n- The demonstration is followed by listing some important use cases of import hooks, and how folks have used it in the past.\r\n\r\n\r\nWhat can someone get out of this talk?\r\n\r\nAn understanding of the import system's mechanics, which helps to quickly debug and fix path/import related errors.\r\nKnowledge of import hooks, to build custom import related plugins.\r\n\r\n\r\nOutline\r\n\r\nTime Duration - Topic\r\n\r\n0 - 4 Introduction to packages and how to organize packages\r\n\r\n4 - 7 Types of packages in python, and the default ones the import system supports.\r\n\r\n7 - 12 Components of import system - sys.modules - finders and loaders - chronology of import related tasks\r\n\r\n12 - 15 Finders, examples of finders, and how they function, find_spec function\r\n\r\n15 - 17 sys.meta_path, sys.path_hooks in detail\r\n\r\n17 - 19 Introduction to PEP 302, and import hooks\r\n\r\n19 - 22 explain loaders with template code\r\n\r\n23 - 25 code walkthrough and demonstration of an implementation of import hooks\r\n\r\n25 - 26 briefly cover 'importing of submodules' topic with an example\r\n\r\n26 - 28 present use-cases of import hooks, and usage in industry, conclude.\r\n\r\n28 - 30 Q&A","name":"Shivashis","profile":"Shivashis Padhi is a senior, majoring Computer Science and Engineering at National Institute of Technology, Tiruchirappalli, India.\r\n\r\nHe loves earth and atmospheric sciences and pursues them as hobby. With a desire to contribute more directly towards research in these areas, he has developed a keen interest in Geographic Information Systems over time.\r\n\r\nWith ~3 years of experience as a student software developer associated with a multitude of student organization(Python Software Foundation - GSoC'20, Delta Force), small and large scale startups(Grofers, Flytbase Labs, Gmetri), he lives by a simple policy, 'learn and build to make the world a better place'."},{"id":"202389","title":"量子コンピュータと現行コンピュータ、解法や解の違いは?~ナップサック問題を考える~","room":"#pyconjp_3","day":"1","no":"4","elevator_pitch":"Pythonを使用し、注目を集める最先端の量子コンピューティング技術を取り扱います。\r\n量子コンピューティングの中でも特に量子アニーリングを使用し、組合せ最適化問題に取り組みます。組合せ最適化問題の一つであるナップサック問題を例題に取り上げ、量子コンピューティングフレームワークのBlueqatで解を求めます。\r\nまたこれに並行して、現行のコンピュータを使用した組み合わせ最適化問題の一般的な計算ツールであるGoogle OR-ToolsソルバーをPythonでプログラミングし、解を求めます。\r\n組合せ最適化問題について知るとともに、その解法として量子アニーリングや汎用ソルバー、それぞれのプログラミング手法とその実行結果を学び、検証します。","prerequisite_knowledge":"必須ではありませんが、量子アニーリングやナップサック問題が何かを知っていると理解しやすくなります。","audience_takeaway":"量子アニーリングと組合せ最適化の関係、ナップサック問題の解法、BlueqatやOR-Toolsの使い方など","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Pythonを使用して量子コンピューティングを取り扱います。今、最も注目を集める最先端技術の一つとして、量子コンピューターがあげられます。今回は、特にその機能の一つである量子アニーリングを取り上げ、組合せ最適化問題を解きます。\r\n\r\n量子アニーリングは組合せ最適化問題に特化した量子コンピューティング技術です。量子アニーリングを実行するにあたり、MDR社(東京)からオープンソースで提供されているBlueqat(ブルーキャット)を使用します。BlueqatはPythonで動作する量子コンピューティング専用のフレームワークです。\r\n\r\n組合せ最適化問題とは、ある課題を解決する際に、その構成要素に対して、選択する/選択しないや、数量を超えない、最大値/最小値を求める、等の条件のもとで最良の解を求める問題で、工場の生産計画や勤務シフトスケジュール、物流配送など幅広い分野でビジネス課題として取り組まれています。この組合せ最適化問題の中でも特に基本的な問題であるナップサック問題を例題に取り上げ、最適解を求めます。\r\n\r\n量子コンピューティングの一方で、現行のコンピュータ上でアルゴリズムを組み、解を計算し最適解を求める取り組みも盛んに行われています。このような最適化問題を解くための専用ソフトウェアとして、ソルバーと呼ばれるツールが多数開発されています。今回は、これらの中からGoogle社によりフリーで提供されているGoogle OR-Toolsを使用して、同じナップサック問題を解きます。Google OR-ToolsはPythonでプログラミングするソルバーです。\r\n\r\n最後に、量子アニーリングにより算出した解と、ソルバーにより算出した解を比較し、結果を検証します。\r\n\r\n今回の取り組みを通して、組合せ最適化問題について知るとともに、その解法として量子アニーリングや汎用ソルバーがあること、またそれぞれのPythonによるプログラミングと解の算出の仕方、さらにそれぞれの解の結果について学ぶことができればと思います。\r\n\r\n<主な流れ>\r\n\r\n1.今回の取り組みの概要\r\n2.組合せ最適化問題とナップサック問題について\r\n3.量子コンピュータと量子アニーリングについて\r\n4.Blueqatによる量子アニーリング解法\r\n5.現行コンピュータと汎用ソルバーについて\r\n6.Google OR-Toolsによる解法\r\n7.両者の解の比較検証とまとめ","name":"田端 哲朗","profile":"システムエンジニアとして金融や通信など様々な分野のシステム開発に携わっています。"},{"id":"203956","title":"Combining ayncio and threads in the same application","room":"#pyconjp_3","day":"1","no":"5","elevator_pitch":"In recent years, the asyncio environment in Python has matured a lot. Something which is often considered an issue, though, is combining code which does not support asynchronous execution with otherwise async code. The talk will show that this is not really a major problem anymore and can indeed be used to bring blocking code or threaded code into the async world as well.","prerequisite_knowledge":"Some knowledge about asyncio and threading would be useful, but is not essential.","audience_takeaway":"The talk will show that combining async and threaded code is not really a major problem anymore, allowing you to use both in your applications.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"English","lang_of_slide":"English only","description":"Subtitle: Writing a Discord bot which streams YouTube videos to channels\r\n\r\nIn recent years, the asyncio environment in Python has matured a lot. Something which is often considered an issue, though, is combining code which does not support asynchronous execution with otherwise async code. The talk will show that this is not really a major problem anymore and can indeed be used to bring blocking code or threaded code into the async world as well.\r\n\r\nThe practical example is a Discord bot implementation, which uses asyncio for handling requests, with a threaded application using the VLC to create snapshots of YouTube live streams at regular intervals. The snapshots are then sent to a Discord channel to give a preview of the various talk sessions held online. We will use this bot at EuroPython 2020 on our Discord server.","name":"Marc-Andre Lemburg","profile":"Marc-Andre is the CEO and founder of eGenix.com, a Python-focused project and consulting company based in Germany. He has a degree in mathematics from the University of Düsseldorf.\r\n\r\nHis work with and for Python started in 1994. In 1997, he became a Python Core Developer. He designed and implemented the Unicode support in Python and continued to maintain the Python Unicode implementation for more than a decade, after it first appeared in Python 2.0. He also authored the well-known mx Extensions, e.g. mxTextTools, mxDateTime and mxODBC, which are now distributed and maintained through eGenix.com.\r\n\r\nMarc-Andre currently is Chair of the EuroPython Society (EPS) which organizes the EuroPython conference series and support the Python community in Europe.\r\n\r\nHe is also a founding member and Fellow of the Python Software Foundation (PSF) and has served on the PSF Board several times.\r\n\r\nToday, Marc-Andre spends most of his time consulting and managing large-scale customer projects heavily relying on Python and databases. More details are available on http://www.malemburg.com/."},{"id":"203444","title":"PySnooper - Never use print for debugging again","room":"#pyconjp_1","day":"1","no":"5","elevator_pitch":"I had an idea for a debugging solution for Python that doesn't require complicated configuration like PyCharm. I released PySnooper as a cute little open-source project that does that, and to my surprise, it became a huge hit overnight, hitting the top of Hacker News, r/python and GitHub trending. In this talk I'll go into:\r\n\r\n * How PySnooper can help you debug your code.\r\n * How you can write your own debugging / code intelligence tools.\r\n * How to make your open-source project go viral.\r\n * How to use PuDB, another debugging solution, to find bugs in your code.\r\n * A PEP idea for making debuggers easier to debug.","prerequisite_knowledge":"Basic Python development","audience_takeaway":" * Learn how to use PySnooper to debug your code\r\n * Learn how to use PuDB to debug your code\r\n * Learn how to communicate your open-source project to others","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"English","lang_of_slide":"English only","description":"A new debugging solution for Python that became a huge hit overnight","name":"Ram Rachum","profile":"Ram Rachum is a software developer specializing in Python. When he's not writing his biography in the third person, he's doing consulting work for clients big and small, giving Python training to teams that would like to deepen their Python skills, and organizing the bi-monthly PyWeb-IL conference.\r\n\r\nPython training: http://pythonworkshops.co/"},{"id":"203877","title":"Pythonソースコードの構造可視化とそれがもたらすもの","room":"#pyconjp_2","day":"1","no":"5","elevator_pitch":"1万行を超えるようなアプリケーションの開発に途中からジョインしたとき、最初に何をしますか?\r\nコードの全体像が分からなくて困ったことはないでしょうか。\r\nこのトークではそういった場面で役に立つ、Pythonコードの依存関係を明らかにするツールを紹介します。\r\nこのツールを作るきっかけや、このツールによって何が明らかにできるかを紹介し、それがソフトウェア開発の中でどのように役立てられるか、についてお話ししたいと思います。","prerequisite_knowledge":"Pythonを使ってアプリケーション開発を行った経験がある","audience_takeaway":"Pythonアプリケーションコードの全体像を捉える方法とその意味や活かし方。","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"このセッションではPythonコードの構造(パッケージ間の依存関係など)を可視化するツール(jig-py)についてお話しします。\r\n新しくプロジェクトに参加し全体像を素早く把握したい場合や、コードのアーキテクチャを見直す場合に、全体の関係性を俯瞰して見ることが役に立ちます。\r\n\r\n## 背景\r\n\r\nこのツールを作るきっかけとして、500以上のPythonファイルで構成されるアプリケーションのPython2/3移行プロジェクトに参加しました。アプリケーション基盤の都合でPython2アプリケーションの一部を切り出して、新たなPython 3アプリケーションを作成し、置き換えていく必要がありました。\r\n\r\n最初に移行するべき対象を見つけ出すため、簡易的なスクリプトで各パッケージ間の依存関係を明らかにしました。それにより最初に手をつけるべき対象を見いだすことができ、無事プロジェクトを進めることができました。\r\n\r\nさらに、実際に可視化して見ると循環参照のような望ましくない構造や、依存が多すぎるモジュールなど改善に生かす手がかりが得られることにも気づきました。\r\n\r\nこれがこのツールとして作っていこうと思ったきっかけです。\r\n\r\n## jig-py について\r\n\r\nJavaにはjigという素晴らしい可視化ツールがあり、そちらを参考にjig-pyというツールを作成しています。jig-py では以下の情報が分かりやすく把握できることを目指しています。\r\n\r\n\r\n・パッケージ同士の依存関係\r\n  ・パッケージ階層レベルに応じたグルーピング\r\n・クラス同士の依存関係\r\n\r\n## 可視化がなぜ重要か\r\n\r\nソフトウェア開発は単純な作業ではなく複雑なプロジェクトです。そして、プロジェクトをゴールに向かわせるためには、次に何をすべきかを示す戦略が重要です。さらに、有効な戦略を立てるためには現状を正しく把握することが欠かせません。\r\n\r\nこれが、なぜ可視化することが重要か、の答えになります。\r\n\r\nパッケージやクラスといった大きい単位で構造を明らかにすることで、コード1行1行の詳細度では追うことのできない大きなレベルでの戦略を立てることができるようになります。\r\n\r\n例えば、\r\n\r\n・健全/不健全な構造の把握\r\n・変更リスクの高いデンジャーゾーンの把握\r\n\r\nこれにより、テスト戦略や、次期機能開発の生産性向上のための改善領域選び、新人の適切なアサイン領域選びなど、建設的な意思決定が行えるようになります。\r\n\r\nそして、それを複数の人、チームでの共通認識として認識できるようになることも重要です。\r\n定点観測し、活動のフィードバックとして利用することで、組織的にも前進させることができるようになります。\r\n\r\n\r\n構成とタイムラインは以下の通りです。\r\n\r\n・導入(1min)\r\n ・自己紹介\r\n・背景(3min)\r\n ・jig-pyを作るに至ったきっかけ\r\n ・名前の由来\r\n・jig-pyの可視化によってわかること(12min)\r\n・可視化がなぜ重要か(10min)\r\n ・開発戦略\r\n ・エンジニア組織の生産性、健全な文化づくり\r\n・まとめ(2min)\r\n ・発表内容のまとめ、今後の展望など\r\n・質疑応答(2min)","name":"yosu","profile":"LAPRAS所属。クローラー開発をメインにGAE/Python開発のお手伝いなども。"},{"id":"203963","title":"Pythonではじめるソフトウェア無線","room":"#pyconjp_4","day":"1","no":"5","elevator_pitch":"ソフトウェア無線を知っていますか?\r\nソフトウェア無線は無線通信に関わる処理の多くを、回路ではなくソフトウェアによる信号処理で実現したものです。\r\n\r\n現在、安価なSDR受信機、OSSなSDR処理系やツールの登場によってソフトウェアエンジニアが電波の世界を覗き、さらには弄ることができる機会が飛躍的に増えています。そして、その中ではPythonが重要な役割を果たしています。\r\n\r\n本セッションではUniversal Radio Hacker, GNURadio, Pothoswareの3つを紹介しつつ、それらの中でPythonがどう使われているか、そして活用方法として独自の処理やアプリケーション開発をするためのステップを解説します。\r\n\r\n見えない電波が見えるの楽しいよ!","prerequisite_knowledge":"特にありません","audience_takeaway":"・ソフトウェア無線についての概略知識\r\n・電波から無線通信プロトコルまでの処理・解析方法の概略知識\r\n・Pythonを使ったソフトウェア無線アプリケーションの開発方法\r\n","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Anything else basically which doesn’t fall into the types of topics above","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"ソフトウェア無線(SDR - Software Defined Radio)の概要と応用例を紹介しつつ、各種実装の中で使われているPythonの用法と活用方法を解説します。","name":"Taisuke Yamada","profile":"普段はJupyter NotebookでPythonをいじっている都内勤務のエンジニア。Pythonだとpython-ucdevをPyPIで公開中。気になる言語はJuliaとRust。この発表は完全に趣味です!"},{"id":"203110","title":"スポーツデータを用いた特徴量エンジニアリングと野球選手の成績予測 - PythonとRを行ったり来たり","room":"#pyconjp_5","day":"1","no":"5","elevator_pitch":"2001年以降のメジャーリーグの成績データを駆使して野球選手の成績予測をする, をテーマに\r\n\r\n・スポーツデータを駆使した特徴量エンジニアリング\r\n・統計的なアプローチを使った野球選手の成績予測\r\n・PythonとRの使い分け・違い\r\n\r\nをデータサイエンスという文脈で紹介します.","prerequisite_knowledge":"【MUST(最低限知っていて欲しい前提知識)】\r\n・野球のルール. プロ野球や高校野球などをたまに楽しむぐらいのリテラシー(アウト・三振・四球・ヒットなど最低限のルールを知っている).\r\n・SQLやRを使ったデータ分析. 特に特徴量エンジニアリングや前処理の経験.\r\n\r\n【あると良い ※任意】\r\n・スポーツデータを扱った分析の経験\r\n・マネーボールを読んだことがある","audience_takeaway":"・分析・機械学習でやりたいタスクに合わせた特徴量エンジニアリングの勘どころ.\r\n・特徴量エンジニアリングを行う際のPython/R/SQLの使い分け.\r\n・PandasやplotlyなどのPyDataライブラリとGCP(BigQueryなど)を組み合わせたデータサイエンス環境のベストプラクティス.\r\n・スポーツデータを用いたデータサイエンスの基本. ルール・記録のドメイン知識を特徴量までに持ってくるあたり.\r\n","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"データサイエンスをする人々にとって, 生データを解析し分析可能な数値化を行う「特徴量エンジニアリング」「前処理」は必要不可欠かつ大切なタスクです.\r\n\r\nその中でもスポーツデータサイエンスは特徴量エンジニアリング・前処理のやりがいがあるテーマであり, 中には「野球データサイエンスの応用で別の分野の分析に役立てる」というシグナルアンドノイズのような事例もあります.\r\n\r\nこの発表では, 「特徴量エンジニアリングの勘どころ」「野球選手の成績予測モデル作成と検証」を通じて, スポーツデータサイエンスのみならず, データサイエンス全般に役立つノウハウや知見を「野球の時間」を通じて紹介いたします.\r\n\r\nPython周りだとPandasやplotly, データサイエンス関連だとBigQueryの知見が得られるかと思います.\r\n\r\n【Outline】\r\n\r\n- 自己紹介・野球の統計分析の基本(5min)\r\n- 特徴量エンジニアリング #とは(10min)\r\n - \t生データの数値化\r\n - 泥臭い泥臭いアンド泥臭いタスクをシュッとこなす\r\n - Python/R/SQLを適切に使い分ける\r\n- 野球選手の成績予測アルゴリズムとその実践(15min)\r\n - 第一人者のネイト・シルバーがやったモデル\r\n - shinyorke(わたし)がやろうとしているアプローチ\r\n - PythonとBigQueryでガツッと特徴量抽出\r\n - 分析そしてその結果は...!?\r\n- まとめ\r\n\r\n【補足】\r\n2001〜2019年のメジャーリーグの公開データセットを元に予測を行います(日本のプロ野球ではありません).","name":"shinyorke","profile":"株式会社JX通信社のシニアエンジニアで主にデータ基盤・SRE周りを担当.\r\n\r\n個人としては, スタートアップの技術顧問としてデータ基盤に関するコンサルティングおよび, 「野生の野球データサイエンティスト」として野球データの分析や考察をブログ・登壇で発表しています.\r\n\r\nPythonは2011年からデータサイエンス・Webアプリケーション開発などなどで活用.\r\n\r\nなお, 一部のPython使いから「野球の人」と呼ばれている模様."},{"id":"202785","title":"Python で作る演劇稽古用 Web アプリ","room":"#pyconjp_2","day":"1","no":"6","elevator_pitch":"自分だけのアイデアを持っていても、何から手を付けてどう形にしたら良いか分からないといった経験を、多くの人が持って\r\nいるのではないでしょうか。\r\nそんな時、まず Python で出来ないかを考えてみるのも良いと思います。\r\nこのトークでは、スマホや Excel 向けに作ったアプリを Python で Web アプリとして作り直すことにした、私の心境を\r\nお話しします。\r\nアイデアを形にする時、Python という選択肢があることを知っていただければと思います。\r\nまた、機械学習で分類器をつくるのに、決定木のような気軽に試せるモデルがあることもご紹介します。","prerequisite_knowledge":"- Web アプリの基本的な概念。\r\n- 機械学習の基本的な概念。","audience_takeaway":"- アイデアを形にする時に、まずは Python で作ってみるという選択肢。\r\n- Web Framework (Django) で、一人でどれくらいの物が作れるのかの目安。\r\n- テキスト分類器のモデルに Deep Learning ではなく決定木を選んだ事例とその理由。","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"個人的に演劇稽古用 Web アプリの制作に取り組んでいます。\r\n最初はスマホアプリとスプレッドシートで作っていたのですが、すべてを Python で作り直すことにしたので、その経緯と、\r\n現在取り組んでいる課題をご紹介します。\r\n根本的な発想は、台本をデータとしてフォーマット化し、稽古や制作のプロセスに利用するという事です。\r\n最初にフォーマットを決めて、そのフォーマットを読み込んで表示するスマホ用の台本ビューアアプリを作りました。\r\nその後、シーンごとの出番を抽出して稽古プランを立てるための Excel マクロを作りました。\r\nしかし結局どちらもやめて、Python (+ Django) で、Web アプリとして作り直すことにしました。\r\n前半ではその経緯についてお話しします。\r\n後半では現在取り組んでいる、「適当に書いた台本をこのシステムのフォーマットに変換するツール」についてお話しします。\r\nテキストを入力して「セリフ」や「ト書き」「柱」といった、「行の種類」を予測するモデルを作っています。\r\n作者によって「どういうつもりで文書を整形しているか」が違うので、ファイルごとの特徴量と行ごとの特徴量を設計して、\r\n決定木による分類をしています。\r\n- 導入(2min)\r\n - 自己紹介\r\n - 私の個人プロジェクトについて\r\n- プロジェクトのこれまでの経緯 (5min)\r\n - 昔の話#1: スマホアプリで台本ビューアを作った。\r\n - 昔の話#2: スプレッドシートで稽古プランツールを作った。\r\n - その後、Python のみで作ることにして設計し直した。\r\n - Web Framework (Django) を使って、すべて Web アプリにする事にした。\r\n- 現在取り組んでいる課題(5min)\r\n - 台本をデータとして扱うには、決まったフォーマットになっている必要がある。\r\n - 自動でフォーマットするフォーマッタを作ろうとしている。\r\n - 行の種類 (セリフ, ト書き等) を予測するのに、Deep Learning は使わず具体的な特徴量を設計する事にした。\r\n- 今後の課題 (1min)\r\n - Web アプリでありながらオフラインにも対応したビューアを作りたい。\r\n- まとめ (1min)\r\n- 質疑応答 (1min)","name":"satamame","profile":"- iOS アプリの開発 (実務 + 趣味)\r\n- Android アプリの開発 (趣味)\r\n- Django による Web アプリの開発 (実務 + 趣味)\r\n- 演劇 (趣味)"},{"id":"203793","title":"Pythonで競プロをしよう!〜入門者が知っておくべき高速化Tips〜","room":"#pyconjp_4","day":"1","no":"6","elevator_pitch":"最近AtCoderを中心に、競技プログラミングの人気が高まっています。\r\nC++で参加している人が一番多いですが、Pythonで参加している人もかなり増えています。\r\nPythonは書きやすい一方でC++と比べてしまうと実行速度が遅く、Logicは正しくてもPythonだとTLE(Time Limited Exceeded, 時間超過)してしまうことも少なくありません。\r\nしかし実際にはPythonでも高速化が可能で、ほぼ全ての問題がPython(/PyPy)でAC(Accepted, 正解)することができると知られています。\r\n本セッションでは、Pythonで競技プログラミングをする際に把握しておくべき様々な高速化Tipsを紹介し、競技プログラミングにPythonで参加するハードルを少しでも下げることが目的です。","prerequisite_knowledge":"* 標準入出力の扱い、List/Dictといった基本的なデータ構造の利用経験といったPythonの基礎\r\n* 競技プログラミングの概要\r\n* AtCoderなどに実際にPythonで参加した経験があるとなおよい\r\n","audience_takeaway":"* Pythonでコードを書く際の高速化Tips\r\n* 計算量に関する意識\r\n","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"基本的には各種Tipsを具体的に紹介していく形を考えています。\r\n手元で実験した結果などを示しながら紹介をしていこうと考えています。\r\n\r\n\r\n入力関連の高速化 (2min)\r\n* `input`よりも`sys.stdin.readline`の方が早くなる話\r\n\r\nPythonの各種操作の計算量について (3min)\r\n* list\r\n* set/dict\r\n\r\n再帰に関する話 (1min)\r\n* `RecursionError`に注意しよう\r\n\r\nソートの速度について (2min)\r\n* listのlistのソートはそもそも遅いが、`operator.itemgetter`を使うと早くなる話\r\n\r\nPythonとPyPy (5min)\r\n* Pyenvによる導入\r\n* 両者の長所・短所\r\n * 「for/whileを多用している場合はPyPyにするだけで圧倒的に高速になるが、一方で再帰の場合はPythonの方が早い」など\r\n\r\n質疑・応答(2min)","name":"Kevinrobot34","profile":"東京大学理学系研究科卒業後、株式会社ナウキャストに入社。\r\n業務ではPythonを使いビッグデータの分析やデータ処理のためのパイプライン構築を行っている。\r\nまた趣味でPythonを使い競技プログラミングをしている。"},{"id":"203665","title":"オルタナティブデータを用いた消費行動の分析 ~2月のトイレットペーパーパニックを例に~","room":"#pyconjp_5","day":"1","no":"6","elevator_pitch":"新型コロナウィルス感染拡大は、私たちの日常生活や消費行動に大きな影響を与えている。感染防止に一定の効果があるとされるマスクだけでなく、トイレットペーパーといった日用品も極端な品薄となる現象も見られた。\r\nこのセッションでは、オルタナティブデータの一つであるPOSデータ(POSレジで商品が販売されたときに記録されるデータ)とPythonでのデータ分析や可視化ツールを用いて、新型コロナの影響で日本の消費行動がどのように変化したかについての細かい分析をしてみたい。\r\nまた、分析を通して、Pythonが提供する魅力的なデータサイエンティスト向けツールを紹介したい。具体的には、Shapely, Pandas, Plotly, Keplerを使う予定がある。","prerequisite_knowledge":"Pandasでデータの読み込み方や基本的な扱い方\r\n基本的な統計の知識\r\n","audience_takeaway":"Pandasの時系列分析の機能とShapelyの位置情報の機能\r\nPlotlyやKeplerでデータの可視化する方法\r\nデータでストーリーを作り方\r\nオルタナティブデータの知識","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"1. 自己紹介\r\n2. オルタナティブデータについて\r\n3. 分析の事例(事例の解説、シンプルなコードの例、データの可視化)\r\n a)POSデータを使って、すぐに売り切れになった商品の種類を検知する。\r\n b)店舗の位置情報を用いて、売り切れになるまでのプロセスを調査する。\r\n 例えば、ある店舗のマスクやトイレットペーパーが売り切れると、近隣店舗の販売にも影響するのだろうか?\r\n c) マスク価格と関連性のある要素を調査する。\r\n例えば、店舗の所在地とマスク価格に関連性は見られるだろうか?\r\n結論、質問","name":"djentleman","profile":"イギリス出身、東京在住のデータエンジニア/データサイエンティストです。\r\nポーツマス大学でコンピューターサイエンスを履修し、ロンドンにあるオルターナティブデータのベンチャー企業Huq Industriesで3年間働いた後、去年10月に来日してFintechベンチャー企業のナウキャストに入社しました。現在、オルターナティブデータを用いて投資家の意思決定を支援するプロダクトに取り組んでいます。"},{"id":"203919","title":"スタッフとしてコードを書こう!〜Code for PyCon JP and yourself〜","room":"#pyconjp_3","day":"1","no":"6","elevator_pitch":"PyCon JP 2020のスタッフ活動で、私はPythonも書くことにしました。\r\n手を動かすことで自身の成長につなげたかったからです。\r\nコードを書いた結果、力がついたと感じるだけでなく、Pythonが代わりにやってくれるのでスタッフとしてできることも増えました。\r\n私の取り組みを共有し、スタッフ活動もPython使いとしての成長の場となることを共有したいと思います。","prerequisite_knowledge":"PyCon JPのスタッフ活動についての知識は不要です。\r\nPythonの文法は理解していて、自動化やWebアプリ開発などに取り組んでいる方は、発表を聞いた後にPyCon JPスタッフ活動により興味を持っていただけるのではないかと考えています\r\n(特に自動化レシピ本に取り組んだ経験やDjangoのチュートリアルに取り組んだ経験があると話がわかるでしょう)","audience_takeaway":"・コミュニティへの活動の中でコードを書いた例(Googleスプレッドシートの読み取り、Slackへの投稿、DjangoでのWebアプリ開発)\r\n・スタッフ=コードを書いて自分の成長にもコミュニティにも貢献する機会という見方","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Community building related to Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"この15分のトークでは、Python使いとしての成長を考える方がスタッフ活動の中でコードを書くヒントを提供します。\r\nスタッフ活動はコミュニティに貢献する素晴らしい活動だと思いますが、その時間はコードを書けないというイメージもあるように感じます。\r\nそんなことはなくて、スタッフもPython使いとして成長できる機会になると伝えたいです\r\n(結果、2021は多くのスタッフがPythonの力を付けられたらいいなと思っています)\r\n\r\n示す例は2つあります。\r\n\r\n1. 通知の自動化の例\r\n2. プロポーザルのレビューに使うWebアプリの開発\r\n\r\n1はGoogleスプレッドシートを読み取り、集計したり条件に当てはまる行を抽出してSlackに通知するスクリプトです。\r\nスプレッドシートのアクセスには`gspread`を使い、Slack投稿は標準ライブラリの`urllib`を使っています。\r\nAWS Lambdaの関数にして、定期実行するように設定しています。\r\n\r\n2はDjango製のWebアプリです。\r\nプロポーザルの募集に使ったサービスのレビュー機能が使いにくかったため、手を動かして実装しました。\r\nログインはSlackアカウントで行います。\r\n選択したプロポーザルを閲覧して、評価を入力できます。\r\nプロポーザルを条件(例:英語/日本語)で絞り込む機能も実装しました。\r\nプロポーザルの募集に使ったサイトからエクスポートしたデータをDjangoアプリに取り込む(loaddata)ために、JSONに変換するツールも作りました。\r\n\r\n## タイムライン\r\n\r\n- 自己紹介(1分)\r\n- なぜコードを書くことにしたか(2分)\r\n- 1 通知の自動化の紹介(5分)\r\n- 2 レビュー用Webアプリの紹介(5分)\r\n- まとめ 「スタッフとしてコードを書いて自分の成長にもつなげよう」(1分)\r\n- 質疑(1分)","name":"nikkie","profile":"PyCon JP staff (2019~)。2020はコンテンツチームリーダー。自然言語処理に取り組むデータサイエンティストでもある"},{"id":"203558","title":"ラズパイ3BのCPUでリアルタイム物体検出","room":"#pyconjp_1","day":"1","no":"6","elevator_pitch":"Raspberry Pi 3Bにカメラを繋ぎリアルタイムに物体検出を行うことを目指し、2年ほど開発を続けてきました。\r\n現時点でNeural Compute Stickにも内臓GPUにも頼らず、CPU処理のみで11FPSのbounding box detectionを行えるようになっています。\r\n\r\nこのトークでは、実機でリアルタイム物体検出のデモを行った後、高速な物体検出を実現するために行ったことを\r\n「検出モデル」「実行環境整備」の2つの観点から紹介します。\r\n画像処理・物体検出を行っている方、Pythonでデータ処理を行っている方にとって、処理速度向上のヒントになれば幸いです。","prerequisite_knowledge":"必須ではありませんが\r\n・Deep Learningによる画像認識を行ったことがあり、要求される計算量の多さを知っていること\r\n・Raspberry Pi上でCPU性能を求められるアプリケーションを実行したことがあり、Raspberry Piの性能の低さを知っていること\r\n・multiprocessingモジュールについての知識\r\nの3点の知識があると、内容をより楽しめます。","audience_takeaway":"・代表的な物体検出モデルの概要\r\n・速度に特化した物体検出モデルの作り方\r\n・精度向上に繋がるかもしれない、画像認識モデル学習上の工夫\r\n・ONNX RuntimeをRaspberry Piに導入し、高速な推論を行う方法\r\n・Python3.8で導入されたshared memoryを使用し、multiprocessingでのプロセス間のデータ受け渡しを高速化する方法","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Embedding python in hardware","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Raspberry Pi 3Bにカメラを繋ぎリアルタイムに物体検出を行うことを目指し、2年ほど開発を続けてきました。現時点では\r\n1. カメラから画像を取得\r\n2.「人」「動物」「乗り物」の3クラスを検出\r\n3. 各クラスの位置を示す四角形を画像に追加し、ディスプレイに描画\r\nが、CPU処理のみで11FPSで実行できるようになっています。\r\nMobileNet SSDやTinyYOLOなどの軽量な物体検出モデルでも3FPSを下回ることを考えると、速度面だけを見れば非常に高速です。\r\n\r\n高速化の試行錯誤を経て得た知見を「検出モデル」「実行環境整備」の2つの観点から紹介します。\r\n\r\n■検出モデル\r\nDeeplearningを用いた物体検出モデルであるYOLOをベースにネットワークを軽量・簡素化することで、より高速なモデルの作成を目指しました。\r\nネットワークを軽量化するとどうしても精度が下がりますが、少しでも精度悪化を緩和するために学習手法を試行錯誤し、\r\n・既に知られている「学習が進んだらミニバッチサイズを大きくすると良い」を自動化する実装\r\n・転移学習を繰り返し行うと精度が上がるという知見\r\nを得ました。\r\n\r\n■実行環境整備\r\n検出モデルを軽量化することに加え、効率よく処理を実行できるよう\r\n・モデルをonnxにexportし、高速な推論エンジンであるONNX Runtimeで推論を行う\r\n・画像撮影と検出結果描画を検出とは別のプロセスで動作させ、最も時間のかかる検出処理がブロックされないようにする\r\nとしました。\r\nプロセス間のデータ受け渡しはmultiprocessing.Queueを使うのが便利ですが、\r\nSharedMemoryを使うことでQueueよりも高いFPSが得られることが分かりました。\r\nまた、Python3.8自体がPython3.7より性能が高く、SharedMemoryを使うためにPythonのバージョンを上げただけで\r\nコードの改変なしに性能向上を得ることができました。\r\n\r\n\r\n構成とタイムラインは下記を予定しています。\r\n\r\n■導入(3分)\r\n・自己紹介\r\n・何をしたいのか\r\n・実機デモ\r\n\r\n■軽量な認識モデルの作成(6分)\r\n・代表的な物体検出モデルの紹介(R-CNN/YOLO/SSD)\r\n・今回作成したYOLOベースのモデル紹介\r\n・精度を上げるための学習手法の工夫\r\n - 学習の進み具合に応じて自動的にミニバッチサイズを増やす\r\n - 転移学習を反復的に行う\r\n\r\n■高速に推論を行うための環境構築(5分)\r\n・推論を高速に行うためのONNX Runtime導入\r\n・multiprocessingモジュールによるデータの処理パイプライン化\r\n・最新のPythonは最速のPython\r\n - 3.8から導入されたshared memoryによる、高速なプロセス間データ受け渡し\r\n - Python自体の速度改善\r\n\r\n■質疑応答(1分)","name":"Yutaka Nakano","profile":"全文検索とログデータの集計処理を生業とするサーバサイドエンジニアです。"},{"id":"214739","title":"Closing (Day 1)","room":"#pyconjp_1","day":"1","no":"","elevator_pitch":"1日目のクロージングです。\r\nDay1 Closing.\r\nYouTube Live: https://youtu.be/taVDsm4bqC8","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"1日目のクロージングです。\r\nDay1 Closing.\r\nYouTube Live: https://youtu.be/taVDsm4bqC8\r\n","name":"","profile":""},{"id":"214735","title":"Opening (Day 2)","room":"#pyconjp","day":"2","no":"","elevator_pitch":"2日目のオープニングです。\r\nOpening (Day2).\r\nYouTube Live: https://youtu.be/-ewM4Wz50wA","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"Opening (Day2).\r\nYouTube Live: https://youtu.be/-ewM4Wz50wA\r\n","name":"","profile":""},{"id":"214737","title":"Keynote: Mr. Rich Jones","room":"#pyconjp","day":"2","no":"","elevator_pitch":"Day2 Keynote by Rich Jones.\r\nYouTube Live: https://youtu.be/-ewM4Wz50wA","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Keynote","audience_python_level":"","audience_expertise":"","track":"Web programming (including web frameworks)","lang_of_talk":"English","lang_of_slide":"English only","description":"Keynote by Rich Jones\r\n\r\nhttps://pyconjp.blogspot.com/2020/06/pycon-jp-2020-2-announcement-of-keynote.html","name":"Rich Jones","profile":"Rich is the cofounder of Gun.io, a global consulting firm staffed by the best hackers from the Free and Open Source software community. He is the author of Zappa, the leading server-less Python framework, used by thousands of companies and users to save time and money for their web deployments. He has worked on everything from cloud GPU clusters for medical and scientific computing to mobile peer to peer file sharing applications, and on everything in between. In his spare time, he enjoys skateboarding, dirty southern trap music, and Laphroaig.\r\n\r\nRichはGun.ioの共同設立者です。\r\nGun.ioはグローバルなコンサルティングファームで、フリーソフトウェアやオープンソースソフトウェアのコミュニティから来た最も優秀なエンジニア(ハッカー)たちが所属しています。\r\n彼は、Pythonにおける主要なサーバレスフレームワーク、Zappaの作者です。\r\nZappaは、何千もの企業やユーザによって使われ、Web開発における時間と費用を節約しています。彼は医療や科学計算向けのクラウドGPUクラスタからモバイルのピア・ツー・ピアのファイル共有アプリまで、そしてその間にあるあらゆるものに取り組んできました。彼の趣味はスケートボード、サザン・ヒップホップと、ラフロイグを飲むことです。"},{"id":"203959","title":"ASGI(非同期サーバゲートウェイインターフェース)の概要","room":"#pyconjp_3","day":"2","no":"1","elevator_pitch":"大成功した WSGI に後継の仕様が出たらしい。そんな話をご存知でしょうか。\r\n\r\nサーバーとフレームワークのエコシステムが独立して存在しているWSGI ですが、WSGIは WebSocketや新しい async/await 構文をサポートできていません。\r\n\r\nその問題を解決したWSGI のスピリチュアルな後継であるASGI は、WebSocketと非同期サポートが組み込まれています。\r\n\r\nこのセッションでは、よくわからないけど気になる存在のASGIについて、WSGIと対比しながら実際のコードを交えて概要を紹介したいと思います。\r\n","prerequisite_knowledge":"Pythonを使ってWebアプリケーションを実装し、WSGIを使ったWebサーバ環境を構築したことがある経験。\r\nトークで扱うASGIについて、Read the Docsを一読いただいていると理解しやすいと考えますが、必須ではありません。\r\n","audience_takeaway":"* WSGIとASGIの違い\r\n* ASGIでできることの理解\r\n* ASGIサーバ導入の前提知識","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"ASGI(非同期サーバゲートウェイインターフェース)の概要を、WSGIとの違いの比較を交えて紹介します。\r\n\r\n- 導入(3min)\r\n - 自己紹介\r\n\r\n- WSGIについて(15min)\r\n - 概要 (基本のコードの紹介)\r\n - WSGIエコシステムサーバ(Gunicorn, uWSGI, mod_wsgi)とFramework (Flask, Django2.x)\r\n - WSGI の制限例: WebSocket\r\n\r\n- ASGIについて(25min)\r\n - ASGIの紹介(基本のコードの紹介)\r\n - ASGIの開発と歴史\r\n - ASGI 機能、WebSocket、HTTP/2\r\n - ASGIのエコシステムサーバ(Hypercorn, Daphne, Uvicorn) とFramework(Starlette, Django3.x, Quart)","name":"Junya Fukuda","profile":"Pythonエンジニア\r\nPyCon Kyushu 2020 Kumamoto トーク採択"},{"id":"203111","title":"Pythonで作る機械学習システムパターン","room":"#pyconjp_5","day":"2","no":"1","elevator_pitch":"Pythonを用いた機械学習のモデル開発事例は多数ありますが、そのモデルをビジネスやシステムに組み込み、運用する事例は多くありません。機械学習を有効活用するためにはシステム化することが必要と考え、そうした問題意識から、機械学習システムのデザインパターン集を公開しました。本セッションでは、機械学習システムのグランドデザインおよびPythonによる機械学習デザインパターンの実装例を説明し、システムの運用や改善ノウハウを共有します。プラットフォームにはKubernetesを活用し、機械学習の学習からテスト、QAを行い、推論器をリリースして運用するまでの一連の流れを説明します。","prerequisite_knowledge":"- 機械学習の基礎知識\r\n- Webアプリケーションの基礎知識","audience_takeaway":"- 機械学習を実用化する方法\r\n- Pythonによる機械学習ワークフローおよびWebアプリケーション開発\r\n- ログ設計\r\n- システムの運用ノウハウ","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"本セッションでは機械学習のモデルを実用化するためのノウハウをPythonによる実装を交えて説明します。\r\nPythonを用いた機械学習のモデル開発事例は多数ありますが、そのモデルをビジネスやシステムに組み込み、運用する事例は多くありません。機械学習を有効活用するためにはシステム化することが必要と考え、そうした問題意識から、機械学習システムのデザインパターン集を公開しました。\r\nhttps://github.com/mercari/ml-system-design-pattern\r\n\r\n機械学習システムのグランドデザインおよびPythonによる機械学習デザインパターンの実装例を説明し、システムの運用や改善ノウハウを共有します。プラットフォームにはKubernetesを活用し、機械学習の学習からテスト、QAを行い、推論器をリリースして運用するまでの一連の流れを説明します。\r\n\r\n構成とタイムラインは以下のとおりです(45分想定)。\r\n1. 自己紹介(5分)\r\n2. 機械学習システムデザインパターンの紹介(10分)\r\n- 機械学習をシステムに組み込むための課題\r\n- 課題解決のアプローチ\r\n- デザインパターンの意義\r\n- 機械学習システムのコンポーネント\r\n3. 機械学習システムの実装、リリース、運用方法(25分)\r\n- 学習パイプライン\r\n- モデルの評価\r\n- 推論器の実装\r\n- リリース前QAおよびパフォーマンスチューニング\r\n- A/Bテスト\r\n- 評価\r\n4. まとめと質疑応答(5分)","name":"Yusuke Shibui","profile":"株式会社メルカリ\r\nMLOps, Image Search & Edge AI\r\n文学修士(イギリス旅行史) →富士通→IBM→SAS→パナソニック→株式会社メルカリ\r\n■ 機械学習によるサービス改善\r\n■ 機械学習プラットフォーム開発\r\n■ Edge AI\r\n写真の物体検出結果:猫:0.55 犬:0.45 人間:0.60 謎:0.40"},{"id":"203899","title":"Understanding Python's Debugging Internals","room":"#pyconjp_2","day":"2","no":"1","elevator_pitch":"During this session, we’ll share how debugging actually works in Python, delving into how Python debugging looks like from the inside. We will discuss the differences between CPython and PyPy interpreters, as well as explaining the underlying debugging mechanism, and ultimately how to utilize this knowledge at work.","prerequisite_knowledge":"Use and understand Python","audience_takeaway":"The differences between CPython and PyPy interpreters, understanding performance benchmarks, the sys.set_trace function (how to use it and alternatives to it) and ultimately how to utilize this knowledge.","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Python core","lang_of_talk":"English","lang_of_slide":"English only","description":"Ever wondered how Python debugging looks on the inside? On our journey to building a Python debugger, we learned a lot about its internals, quirks and more. During this session, we’ll share how debugging actually works in Python. We’ll discuss the differences between CPython and PyPy interpreters, explain the underlying debugging mechanism and show you how to utilize this knowledge at work and up your watercooler talks game.","name":"Liran Haimovitch","profile":"Liran is the Co-Founder and CTO of Rookout. He’s an advocate of modern software methodologies like agile, lean and devops. Liran’s passion is to understand how software actually works. When he's not thinking of code, he's usually diving or hiking."},{"id":"203063","title":"レトロゲームエンジン「Pyxel」でゲームプログラミングをはじめよう!","room":"#pyconjp_4","day":"2","no":"1","elevator_pitch":"レトロゲームエンジン「Pyxel」をご存知ですか?\r\nPyxelはドット絵を使ったゲームを簡単に作成できる、Pythonのライブラリです。\r\nシンプルでわかりやすい命令と、画像と音楽の制作ツールも同梱されている手軽さから、全世界でユーザーが増えており、GitHubでは7000スターを獲得、全言語のゲームエンジン中Top10入りしています。\r\n本トークでは、Pyxelの開発者本人(日本人です)が、Pyxelの導入方法、付属ツールを使ったゲーム素材の作り方、Pyxelを使った本格的なゲームプログラミングの方法について解説します。\r\nPyxelで手軽に楽しくゲームプログラミングを始めましょう!","prerequisite_knowledge":"Pythonによる簡単なプログラムの作成経験","audience_takeaway":"・レトロゲームエンジンPyxelの使用方法\r\n・ゲームプログラミングの基本的な考え方\r\n・Pyxelを使ったゲームプログラミングの方法\r\n・Pyxelを使ったゲーム素材(画像・サウンド)の作成方法","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"GUI and games","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"Python向けレトロゲームエンジン「Pyxel」を使ったゲームプログラミングの方法について、導入方法から本格的なゲームの作り方まで、以下のステップに分けて説明します。\r\n\r\n1. Pyxelの概要と導入 (5分)\r\n - Fantasy Consoleについて\r\n - Pyxelの特長・制作事例\r\n - Pyxelの導入方法\r\n\r\n2. Pyxelを使ったお絵描きプログラムの作成 (8分)\r\n - お絵描きプログラムの作り方\r\n - 基本的なAPI\r\n - お絵描きプログラムの実践\r\n\r\n3. 付属ツールを使った素材の作成 (5分)\r\n - Pyxelのリソースデータについて\r\n - Pyxel Editorの機能紹介\r\n - 画像データの作成方法\r\n - サウンドデータの作成方法\r\n\r\n4. 本格的なゲームプログラミングの方法 (9分)\r\n - ゲームプログラムの考え方\r\n - ゲームプログラミングに必要な仕組み\r\n - Pyxelでの作成例\r\n - ゲームジャンルごとのポイント紹介\r\n\r\n5. まとめ (3min)\r\n - 解説内容のまとめ\r\n - Pyxelの今後","name":"Takashi Kitao","profile":"元ゲーム開発者。メタルギアソリッドのプランナー、PS2向けロボットシューティング「Zone of Enders」シリーズのゲームデザインとメインプログラマーを担当。\r\n現在は電機メーカーにてAR/VR技術を研究開発中。\r\nレトロゲームエンジンPyxelの開発者。2018年、GitHubデイリーランキングにて全世界の開発者中1位を獲得(ただし3日間だけ…)"},{"id":"213322","title":"招待講演:Metaclass?Descriptor?完全に理解した()あなたに","room":"#pyconjp_1","day":"2","no":"1","elevator_pitch":"Python3.6で追加されたとあるダンダーメソッドが、DescriptorやMetaclassに大きく影響を与えました。\r\nというのはどういうことなのか。完全に理解したあなたと私のために、metaclassとdescriptorの復習から始めます。\r\n存在は知っているけれどどう使われてるの?となりがちなMetaclassとDescriptorを「ちゃんと」理解していきましょう。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(45min)","audience_python_level":"Advanced","audience_expertise":"","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"露木誠氏による招待講演です。\r\n\r\nhttps://pyconjp.blogspot.com/2020/08/invited-talks2.html","name":"露木誠","profile":"2000年頃にファッションジュエリー業界からIT業界へ移り、以来ソフトウェアエンジニアとして働いています。\r\nPython、Java、Perl、Rubyなどのプログラミング言語を用いてB向けC向けを問わずさまざまな開発に従事してきました。\r\nソフトウェアエンジニア・チーフアーキテクト・テックリードなどとして開発に携わるのみならず、プログラミング講習の講師や自社サービス用工場の立ち上げなど、開発から外れた仕事もしてきました。\r\nここ数年はエンジニアが働きやすい環境づくりなどにも関わっています。"},{"id":"214742","title":"ランチタイムセッション(パネルディスカッション)","room":"#pyconjp","day":"2","no":"","elevator_pitch":"Day2ランチタイムにスペシャルパネルディスカッションを開催します。ここでしか聞けないような話題が盛りだくさんです。ランチを食べながら是非お聞きください。Zoomの他YouTube Liveでも参加いただけます。\r\nYouTube Live: https://youtu.be/-ewM4Wz50wA","prerequisite_knowledge":"とくになし。","audience_takeaway":"-","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Day2ランチタイムにスペシャルパネルディスカッションを開催します。\r\nYouTube Live: https://youtu.be/-ewM4Wz50wA\r\n\r\nここでしか聞けないような話題が盛りだくさん。ここだけの裏話も聞けるかも。\r\nランチタイムが始まったらご飯を準備いただき、ご飯を食べながらお聞きください。\r\n\r\n視聴にあたって前提知識やPythonスキルは不要です。どなたでもお楽しみいただけます。","name":"","profile":""},{"id":"203053","title":"How to Transform Research Oriented Code into Machine Learning APIs with Python","room":"#pyconjp_5","day":"2","no":"2","elevator_pitch":"Recently, Python engineers have more opportunities to work with data scientists than before. At the same time, they are often faced with the research-oriented code written by researchers or data scientists. In order to integrate this code with systems such as APIs, python engineers need to additionally write the code or refactor it, and make them work on the server.\r\n\r\nThis talk covers the gap between the research-oriented code and production code of machine learning API. What is the gap between them? How it can be implemented based on real-world python code? How can the code validate whether the dataset is correct ? How can machine learning models be continuously inspected? Audiences can earn the answers to these questions from this talk.","prerequisite_knowledge":"1) The audiences can be engineers, data scientists, or researchers at junior or middle level who use python.\r\n2) This talk could be more beneficial for people who have experience to be involved with AI / ML projects.\r\n\r\nTech Stacks that it might be good for audiences to have:\r\n- Basic understanding of python grammar \r\n- Knowledge about python for analysis use\r\n- Architecture of RESTful API\r\n- Experience exploratory analyzing data or doing data mining with python","audience_takeaway":"One of the major things that the talk can provide could be that audiences would learn each responsibility of each role in AI / ML projects and process to implement AI / ML products, and the better or best practices of ML API implementation.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":"Introduction\r\n\r\nWhy do I talk about this topic ? (1 minute)\r\n- The Four Steps to transform Research Oriented Code into \r\n- Machine Learning APIs with Python (1 minute)\r\n\r\nMain Talk (+ sample codes and explanations in each section)\r\n\r\n1) Understand what code you look at and make, and how to handle the code. (6 minutes)\r\n- What is Research Oriented Code ?\r\n- What are ML APIs ?\r\n- How should engineers handle research oriented code ?\r\n\r\n2) Modularize research oriented code (6 minutes)\r\n- Categorize research oriented code into preparation code, preprocessing code, and ML code\r\n- Break them out into functions and make them testable\r\n- Clarify input and output of the code, and define URI\r\n\r\n3) Refactor research oriented code (6 minutes)\r\n- Prepare for refactoring by understanding requirements of each code and taking notes about them\r\n- Simplify I/O code in preparation code\r\n- Transform coding style with pandas into purely pythonic code in preprocessing code\r\n\r\n4) Check the ML APIs can work correctly on the server (6 minutes)\r\n- Write decorators to automatically check parameters\r\n- Set up production-like environments\r\n- Suggest a tiny example of CI/CD environments for ML APIs.\r\n\r\nSummarize the talk\r\n\r\nQuickly review the four steps to transform Research Oriented \r\n- Code into Machine Learning APIs with Python (1 minute)\r\n- Share the useful resources and tips related to what is mentioned in the talk. (1 minute)","name":"Tetsuya Jesse Hirata","profile":"Tetsuya is a software engineer based in Tokyo. He has been involved with several AI/ML projects in EdTech domain and has mainly been implementing ML APIs and ML Ops environment. Prior to this, he used to research the relationships between online learning behaviors and learning outcomes at the UCL Institute of Education (IOE) in the UK. His interest is in how to bridge the gap between data science and engineering.\r\n\r\nhttps://www.linkedin.com/in/tetsuya-hirata-a31b52134/\r\nhttps://twitter.com/JesseTetsuya\r\nhttps://medium.com/@JesseTetsuya"},{"id":"203900","title":"Sphinx はどのように Python コードからドキュメントを生成するのか","room":"#pyconjp_4","day":"2","no":"2","elevator_pitch":"Sphinx では Python コードからドキュメントを生成するために、静的解析や動的解析といったアプローチを用いてプログラムをあらゆる側面から解析しています。本セッションではその手法を紹介します。Python コードから得られる情報を元に、あなたも便利なツールを作ってみませんか。","prerequisite_knowledge":"* Python のプログラムを開発した経験があること\r\n* Python の型ヒントを使ったことがあるとなおよい","audience_takeaway":"* Python オブジェクトが持つメタデータの知識\r\n* 動的解析、静的解析の方法","talk_format":"Talk(30min)","audience_python_level":"Advanced","audience_expertise":"0%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"English only","description":"Sphinx は Python の公式ドキュメントや numpy, pandas, django など数多くのプロジェクトで利用されているドキュメント生成ツールです。\r\n\r\nSphinx が広く利用されている理由のひとつに Python プログラムからのドキュメント自動生成(autodoc)があります。ドキュメント自動生成機能を用いると、手元の Python コードからかんたんにドキュメントを生成できます。本セッションではこのドキュメント自動生成機能がどのように実装されているのかにフォーカスを当て、Python プログラムの動的解析および静的解析の実装方法をご紹介します。\r\n\r\n発表内容:\r\n* Sphinx とはなにか\r\n* Python コードからドキュメントを生成する\r\n* Python オブジェクトから情報を抽出する (動的解析)\r\n* Python のスペシャルメソッドを理解する\r\n* PEP を読む\r\n* Python コードから情報を抽出する (静的解析)\r\n* AST の使い方\r\n* Python のバージョン差と戦う\r\n* 質疑応答","name":"tk0miya","profile":"(株)タイムインターメディア CTO。Sphinx-Users.jpの運営のひとり。ドキュメンテーションツールSphinxのコミッター、作図ツールblockdiagの作者。他にも数多くのSphinx拡張(プラグイン)を開発している、ドキュメンテーションツールを主戦場とするOSS開発者。 著書:「Sphinxをはじめよう第2版(2017 オライリー・ジャパン刊)」。"},{"id":"203858","title":"チーム開発立ち上げにやっておいたほうがいいソース管理の方法","room":"#pyconjp_3","day":"2","no":"2","elevator_pitch":"プログラミングを動かす上で必要なことはアルゴリズムだけではなく、綺麗に書くこと、そしてそれらをチェックする正しい仕組みが必要です。\r\n特にチーム開発の場合、正しく動いていたとしても人によって書き方がばらばらになってしまい、結果として見にくいソースになってしまうことがあります。\r\nそれらを防ぐ方法としてPythonのコード規約(PEP8など)と仕組み(flake8, black, pre-commitなど)があります。\r\nここではそれらの使い方だけはなく仕組みも紹介しようと思います。","prerequisite_knowledge":"Pythonの初級文法","audience_takeaway":"(特に)チーム開発時におけるコード管理の方法","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Pythonのソースコードを綺麗に保つためのいくつかの方法について説明します。\r\n- 対象\r\n - チーム開発で新規プロジェクトを立ち上げる方\r\n - ソース管理はきっちりやりたい方(\"\"と''が混在して欲しくない等)\r\n - 耳学問でpep8とかflake8とか訊いたことがあるけどよく分からない方\r\n - formatterで内容は分からないけど適当に他のプロジェクトで使ってるものを使い回してる方\r\n\r\nこの登壇ではPythonのコーディング規約であるPEP8に付いての簡単な説明から、flake8のようなラッパーツール、\r\nblackのようなformatterそしてそれらを自動で適用させるためのpre-commit、そしてそこに導入するべき他のformatter(mypyやseed-isort-configなど)に付いて簡単に説明し、ソースをどのように修正してくれるのかなどを実例を示しながら説明していきたいと思います。\r\n\r\n構成とタイムラインは以下のとおりです。\r\n- 導入(3min)\r\n - 自己紹介\r\n - 問題意識\r\n - チーム開発の場合、どうしても個人の癖がでてしまい、全体としてルールが統一がされていないことがある。 また開発環境の違いによっては警告がでる人と出ない人の差などがあり不快感もある。\r\n レビューの際もそうした本質的ではない部分で指摘することは時間の無駄となっている。\r\n- Pythonのコーディング規約pep8に付いて(5min)\r\n - pep8とはなにか?\r\n - 実例紹介\r\n- formatterについて(10min)\r\n - autopepについての説明と実例\r\n - blackについての説明と実例\r\n − yapfについての説明と実例\r\n - それぞれの比較\r\n- pre-commitでformatterを自動化(8min)\r\n - 指定方法の実例\r\n - 上記の他に指定しておくといいものの紹介\r\n - seed-isort-confingやmypyなど\r\n - まとめ (1min)\r\n- 質疑応答 (3min)\r\n","name":"yuuki nakajima","profile":"Python歴5年、主にDjangoを書きつつインフラの面倒も見たりするミニフルスタックエンジニア"},{"id":"203648","title":"ひとりで作る画像検索システム","room":"#pyconjp_2","day":"2","no":"2","elevator_pitch":"これは、画像をクエリとする検索に興味を持っている人のためのトークです。画像そのものをクエリとする画像検索のノウハウはまだまだ多くありません。画像を画像で検索する技術は、ユーザー体験を向上させる可能性を持っています。アップロードした画像からユーザーの入力を補助したり、ユーザーの求める商品と似たような見た目の商品を推薦したり、ユーザーへより良い体験を提供できます。\r\n\r\n本トークでは、画像検索システムを構築するために必要な原理の紹介と、実際に検討した Python パッケージを紹介します。","prerequisite_knowledge":"・Python の何らかのパッケージを使ってプログラムを作成した経験\r\n・Python で画像処理をした経験があれば、すぐに実践できると思いますが、必須ではありません","audience_takeaway":"・類似画像検索に必要な知識やシステム構成\r\n・画像処理や検索に便利なパッケージ","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"画像検索の手法は2つに大別できます。画像に紐付いたテキスト情報を検索するTBIR(Text Based Information Retrieval)と、画像そのものをクエリとして検索するCBIR(Contents Based Information Retrieval)の2つです。\r\n\r\n本トークでは、個人でCBIRの画像検索システムを Python で作成した事例を紹介します。\r\n\r\n画像検索システムを作るためには、画像処理及びベクトル検索の知識と技術が必要です。幸いにも Python は画像処理やベクトルを簡単に扱えるパッケージが豊富にあります。\r\n\r\n私は、画像検索がどのように実現されうるか独自に調査し、得た知識を使って画像検索システムを作成しました。\r\n\r\n本トークでは、画像検索を実現するために調査して得た原理や、実際に使用検討したパッケージに関連する知見を共有します。\r\n\r\n構成とタイムラインは以下のとおりです。\r\n\r\n・導入(5min)\r\n・・自己紹介\r\n・・類似画像検索の課題\r\n・画像検索の手法(10min)\r\n・・画像が似ているとはどういうことか\r\n・・特徴量の抽出と検索が重要な技術ポイント\r\n・・抽出の手法とライブラリ(pHash, AKAZE, DNNなど)\r\n・・検索の手法とライブラリ(faiss, nmslib, annoyなど)\r\n・画像検索システムを作る(10min)\r\n・・システム構成(ユースケース図とシーケンス図)\r\n・・Python で画像から特徴量を抽出する\r\n・・Python で特徴量を検索できるようにインデックスする\r\n・・特徴量抽出と登録を定期実行する\r\n・・選定したライブラリのアルゴリズム\r\n・まとめ (1min)\r\n・質疑応答 (4min)","name":"康貴 山際","profile":"学生時代に画像収集や画像処理を趣味で始める。ピクシブ株式会社にウェブエンジニアとして入社し、広告配信システム開発運用に携従事。\r\n趣味が高じて、屋内での画像処理に関して武蔵野大学と共同研究し、のちに同大学の客員研究員となる。\r\nその後、OLTA株式会社にウェブエンジニアとして入社し、クラウドファクタリングの事業に従事している。"},{"id":"213317","title":"招待講演:過去2回の登壇内容からのPython×ドローンの進化、 アップデート内容と今後について展望","room":"#pyconjp_1","day":"2","no":"2","elevator_pitch":"過去2年(2017,2018)のPyConJP発表からの進化・進捗などをまとめて、Pythonとドローンをどのように扱い、活用すべきかを自身の経験も踏まえてお話をします。\r\n2017年および2018年の発表時には何ができて、何が問題・不足したのか。そしてその後はどのように解決したのか。\r\n果たしてPythonとドローンの組み合わせは良かったのか?\r\n現在市販されているミニドローン「Tello」がPythonでプログラミングできます。では、実際にどのような動作ができるのかを調査しまとめます。\r\n最後に、ハードウェアとソフトウェアの両方を実験して感じたことをまとめ、トークします。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(30min)","audience_python_level":"","audience_expertise":"","track":"Embedding python in hardware","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"片寄里菜氏による招待講演です。\r\n\r\nhttps://pyconjp.blogspot.com/2020/08/invited-talks4.html","name":"片寄里菜","profile":"片寄里菜さんは、幼い時より航空機に興味があり、もっと学びたいという想いから東海大学工学研究科・航空宇宙学専攻の博士課程前期に進み、ヘリコプターなど垂直離着陸機の研究を行っていま\r\n大学院修了後は、WEB関連の仕事をしながら個人的な研究テーマを進め、Pythonと出会いました。Pythonでは主にRaspberryPiを使ったモノを動かすプログラミングに視点を置き、開発などを行っていました。\r\nPyConJPには2016年に初参加。Pythonの楽しさや奥深さを知り、様々なコミュニティに参加し友人・知人を増やしたようです。またPyLadiesTokyoコミュニティ参加をきっかけに、今ではスタッフとして活動しています。\r\n登壇経験としてPyConJP2017と2018ではドローンとPythonに関する内容で発表・実演を行いました。またPyCon Thailand2019ではPyLadiesのコミュニティ活動に関する海外の登壇経験もあります。PyConUSなど海外のPyConに参加している経験もあり、精力的に活動を行っています。\r\nご自身の仕事は2018年に株式会社moegiを創業し、計測用のスマホアプリなどを開発。日本だけでなく世界の空の活用法や問題点なども調べ、航空機分野の開発者として活躍できるようにと日々活動をしています。"},{"id":"202353","title":"BLEでロボットトイを制御しよう","room":"#pyconjp_3","day":"2","no":"3","elevator_pitch":"STEAM教育が流行る中、教材として様々なモノが増えてきています。\r\n\r\nこれらの教材にはGUIを用いたプログラミング環境や開発者向けのAPIが公開されています。\r\nしかし、これらの教材はおもちゃのように動くモノが多く、低いレイヤーの制御が必要なので、Webアプリケーション開発者には取っつきづらいこともあります。\r\n\r\nこのトークでは、教材が公開している技術仕様をもとにpythonでBLE制御するユースケースを共有します。\r\n\r\nOSSで公開されているライブラリを用いた2つの方法でBLEを制御する方法が理解できます。","prerequisite_knowledge":"pythonを用いた開発を行ったことがある経験\r\n\r\nBLEの知識があった方がトークの内容を理解しやすいと考えますが、必須の前提知識はありません。","audience_takeaway":"python でのバイナリデータ操作の仕方\r\nBLE 操作の基礎知識\r\npyobjc を用いた BLE 操作の仕方","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"まず導入で、トークの目的について話します。\r\n\r\nSTEAM 教育が流行る中、教材として様々なモノが増えてきています。\r\nこれらの教材には GUI を用いたプログラミング環境や開発者向けの API が公開されています。\r\nしかし、低いレイヤーの制御が必要なので、取っつきづらいこともあります。\r\nこれらを解決する一助とすることが目的です。\r\n\r\nいくつか教材があるのですが、STEAM 教育のコンテンツとしては実際に動いた方が分かりやすいと\r\n考えているので、Cozmo や toio が良いと考えています。Cozmo はサービスが停止しているため、\r\n今回は toio を用いた例で説明を行いたいと思います。\r\n\r\n今回のトークのため、toio を制御するライブラリを作成しました。\r\n実際に Python で BLE ライブラリを操作するためにはバイナリデータを扱うので、\r\n基本的な利用方法(bytes、bytearray や struct)について説明します。\r\nBLE ライブラリとしては Adafruit_BluefruitLE と bleak の 2 つで実際の制御するコードを説明します。\r\n\r\nここで1つ課題が発生します。toio には toio.js という typescript で書かれたライブラリがあり、\r\nそれと同じような振る舞いを考えていたのですが、上記の2つのライブラリではうまく動作しませんでした。\r\nこれらを解決するために2つライブラリが利用している「pyobjc」というライブラリを用いて制御する\r\nことを考えました。\r\n最後に pyobjc を用いた BLE の制御方法についてコードで説明します。\r\n\r\n\r\n- はじめに(2min)\r\n - 自己紹介\r\n- 導入(3min)\r\n - 本トークの目的\r\n - 様々な教材\r\n- BLE ライブラリ で 制御する(10min)\r\n - バイナリデータを扱う\r\n - BLE を操作する\r\n - BLE ライブラリ で発生した課題\r\n- pyobjc で制御する(12min)\r\n - pyobjc とは\r\n - corebluetooth を制御する\r\n- まとめ(3min)","name":"sandfish03","profile":"SaaS企業でサーバサイドエンジニアをやっています。\r\n仕事ではpython使ってはいないですが、pythonが好きです。"},{"id":"203923","title":"Cloud RunとFastAPIで、ChatBotをミニマムスタートしよう","room":"#pyconjp_4","day":"2","no":"3","elevator_pitch":"Chatbotの開発・運用には様々なアプローチが存在しています。今回は、「Slackbotの開発」のユースケースとして、「Cloud Run + Fast API」というパターンをプロダクトの特性を活かしつつ紹介します。\r\nこのユースケースを通じて、Cloud Runの使いどころや、非同期処理(async)の利点・利用例をふんわり理解しましょう。","prerequisite_knowledge":"- Dockerの基礎知識(build, run, pushの概要がわかる程度)\r\n- (要求度:低)上記を元にした、DockerコンテナベースでのPython Webアプリケーションの知識","audience_takeaway":"- Cloud Runの使い方\r\n- Fast APIを用いたアプリケーションの作り方\r\n- Slackbotを始めとした、チャットボット用のWebアプリケーション開発時の基本的な作法例","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"新型コロナウイルスの影響もあり、チャットプラットフォームは今までより更に一段重要性が上がってきています。\r\n個人・企業を問わず様々なレイヤーの人が、「チャットボット」を作るようになってくるのではないでしょうか。\r\n\r\n今回は、「GCP上にFastAPIを使ってSlackbotを開発する」という主題を元に、Chatbotをスタートさせる事例と勘所を紹介します。\r\n\r\n\r\n- 起: 自己紹介\r\n- 起: 今回の主題\r\n - 「Google Cloud Run上」に「Fast APIをベースにしたWebapp」として「Slackbot」を開発・提供する\r\n - この組み合わせを選んだ理由(概要レベル)\r\n- 承: Google Cloud Run\r\n - Cloud Runとはなにか\r\n - どんな特性があるか\r\n - 今回、なぜこれを使うか\r\n- 承: Slackbot\r\n - 現在のSlackbotの動向\r\n - RTMPではなくEventAPIを選ぶということ\r\n- 承: Fast API\r\n - Fast APIとはなにか(ミニマムな使い方)\r\n - どんな特性があるか(本題に近い部分を中心に)\r\n - 今回、なぜこれを使うか\r\n- 承: 実例を交えた解説\r\n - デモ\r\n - エンドポイントの開発\r\n - メッセージに応じて振る舞いを変える\r\n - Slackbot用APIの制約との戦い\r\n- 転: 悩ましい部分\r\n- (転: 派生する未来)\r\n- 結: まとめ","name":"Kazuya Takei","profile":"ニジボックス所属のインフラ寄りバックエンド系スタックフルエンジニア。 興味にリソースを振りがちで、最近はSphinxとFastAPI系に戯れてる機会が多め"},{"id":"201486","title":"Your Escape Plan From Numpy + Cython","room":"#pyconjp_2","day":"2","no":"3","elevator_pitch":"In this talk, a math equation will be given as a benchmark. Instead of optimizing it with Cython (painful and unpythonic), I will give three Pythonic solutions to accelerate NumPy. At the end, the pros and cons of three solutions will be given as well as some recommendations based on my experience.","prerequisite_knowledge":"The audience must have some development experience with NumPy.","audience_takeaway":"* Three pythonic solutions to boost NumPy performance with little modification\r\n* A big picture of performance improvement of three commonly used NumPy accelerate solutions: CuPy, Numba, and Pythran\r\n* Which solution should be applied first in different scenarios\r\n* Bonus: an interesting solution: Transonic","talk_format":"Talk(30min)","audience_python_level":"Advanced","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":"If you've been a data scientist or researcher long enough, you must have encountered a situation where your NumPy code ran quickly on small datasets in a testing environment but performed poorly on real-world datasets (100x larger or more). In this talk, I will introduce three Pythonic solutions to improve NumPy performance drastically without modifying too many codes.\r\n\r\nAt the beginning of the talk, a math equation: logsumexp, which is widely used in machine learning, will be illustrated. I will show how it is implemented with pure NumPy and use it as a benchmark so we can compare it to three proposed solutions at the end of the talk.\r\n\r\nThen, three solutions: CuPy, Numba, and Pythran will be presented in separate sections. In each section, I will give a brief introduction to the solution and show how to apply this solution to our benchmark code.\r\n\r\nAt the end of the talk, I will compare these solutions from different aspects:\r\n* How much performance is boosted after each solution is applied\r\n* Ease to apply on your existing code (including the ease of debugging)\r\n* Limitations of each solution\r\n* Which solution should be applied first in given scenarios\r\n\r\nLast but not the least, I will show a relatively new but interesting solution: Transonic to the audience so they can give it a try on their side project.\r\n\r\nOutline and timeline are as follows:\r\n- Introduction (4 min)\r\n - Self-introduction\r\n - Explain why this issue is important but painful\r\n - Explain logsumexp in math equation\r\n - Show how logsumexp is implemeted by Numpy\r\n- Solution 1: CuPy (4 min)\r\n - Introduce how to use CuPy and its limitation\r\n - Show how logsumexp is implemeted by CuPy\r\n- Solution 2: Numba (4 min)\r\n - Introduce how to use it and its limitation\r\n - Show how logsumexp is implemeted by Numba\r\n- Solution 3: Pythran (4 min)\r\n - Introduce how to use it and its limitation\r\n - Show how logsumexp is implemeted by Pythran\r\n- Compare three solutions (11 min) \r\n - Show performance differences among solutions\r\n - Share my experience on these solutions\r\n - Give some recommendations on choosing solutions based on different scenarios\r\n- Bonus, Takeaways, and QA (3 min)\r\n - Briefly mention \"transonic\" project (a combined solution of CuPy, Numba and Pythran)\r\n - Takeaways\r\n - QA","name":"clyang","profile":"A Python performance tuning enthusiast tweaks ML platform for Cybersecurity company. Meanwhile, I'm also a cybersecurity hobbyist poking websites on the Internet."},{"id":"203938","title":"広島における地域 Python コミュニティの立ち上げ方と続け方","room":"#pyconjp_1","day":"2","no":"3","elevator_pitch":"PyCon JP は毎年東京でカンファレンスを開催するだけではなく、\r\nPython Boot Camp の開催や地域イベントの支援などの取り組みも行っています。\r\nそれらの制度をどのように活用しながら、\r\n自分の地域で Python のコミュニティ活動を立ち上げて、続けていけばいいでしょうか?\r\nこのような活動はどんな人に向いているでしょうか?\r\nどんなメリットがあるでしょうか?\r\nこのトークでは一緒に活動を続けている仲間で、広島のコミュニティ活動を紹介します。\r\n「自分も地元で Python のコミュニティ活動をやってみたい」\r\nという人に一歩踏み出すきっかけになっていただけると嬉しいです。","prerequisite_knowledge":"なし","audience_takeaway":"- PyCon JP が行っている地域コミュニティ支援\r\n- 地域 Python / PyCon (mini) イベントの運営\r\n- Python Boot Camp の開催とフォローアップ\r\n- 他の地域 Python コミュニティや PyCon JP コミュニティとのつながり方\r\n- IT勉強会のオンライン化のもたらすチャンスと地域コミュニティの役割\r\n- 広島のコミュニティのメンバーによる体験談や技術紹介","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Community building related to Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"広島では 2015 年に PyCon mini Hiroshima カンファレンスを、\r\n2016年に Python Boot Camp を開催し、\r\n毎月の小規模の勉強会とほぼ毎年のカンファレンスを継続しています。\r\n私たちは PyCon JP の制度や支援に支えられ、\r\nまた県内外の Python 関係者に支えられてきました。\r\n仲間が増えるとイベントも運営しやすくなり、\r\n全国の人とつながる機会もさらに増えていきます。\r\n2020年は多くのIT勉強会がオンラインで開催されており、\r\n地方コミュニティの役割も変化していきそうです。\r\nこのトークでは広島の Python コミュニティの経験から、\r\n地方でのコミュニティ活動の立ち上げや継続に役立つこと、\r\nそして現状や今後の予定を紹介します。\r\n\r\n構成とタイムラインは以下のとおりです。\r\n\r\n- 広島での活動の紹介(10分)\r\n - PyCon mini Hiroshima\r\n - Python Boot Camp\r\n - すごい広島 with Python\r\n - PyCon JP への参加\r\n- 共同発表者のトーク(5分)\r\n - いままで紹介したネタを振り返る\r\n- 共同発表者のトーク(5分)\r\n - カンファレンスの参加者がスタッフになって気づいたこと\r\n- 共同発表者のトーク(5分)\r\n - 東京のコミュニティから広島に移動した話\r\n- クロージング(2分)\r\n - 地域 Python コミュニティで得たもの\r\n - PyCon mini Hiroshima の今後\r\n- 質疑応答(3分)\r\n","name":"Takuya Nishimoto, REI SUYAMA, Ryo Mitsuda, Takayuki Kaisen","profile":"Takuya Nishimoto:\n2011年まで大学教員。現在は広島在住。NVDA 日本語チーム(オープンソースのスクリーンリーダー)、PyCon mini Hiroshima などのコミュニティ、ウェブアクセシビリティのWG委員、ソフトウェア開発者、技術チームのマネージャーなどとして活動中。2018年に株式会社シュアルタ設立。\r\n\n\nREI SUYAMA:\n尾道が好きになり東京から尾道の向島に引っ越してきたフルリモートのプログラマ。学生時代からずっとPython好き。シンプルなコード、シンプルな設計を目指してます。\n\nRyo Mitsuda:\n広島のITコミュニティで広く活動しています。 また、毎週水曜日に「すごい広島」というもくもく会を主催しています。\n\nTakayuki Kaisen:\nPythonプログラマ"},{"id":"203164","title":"最先端自然言語処理ライブラリの最適な選択と有用な利用方法","room":"#pyconjp_5","day":"2","no":"3","elevator_pitch":"ここ数年、日本語を解析対象とする自然言語処理ライブラリが多く公開されています。BERTを手軽に利用できるTransformersなど、最先端の言語処理技術を利用できるライブラリの多くは、Pythonライブラリとして提供されています。しかし、多くのライブラリがリリースされる反面、ユーザー側の選択肢は増え、情報収集を含む技術選定コストが増加していることも事実です。そこで、本トークでは、日本語を解析対象とするPythonライブラリを整理し、利用シーンごとにライブラリを最適に選択する方法を説明します。日本語の文書分類タスクを通じて、コードの実装方法を説明し、各ライブラリの特徴や利点を解説します。","prerequisite_knowledge":"Python の基本的な使い方のみ知識として求めます。自然言語処理に関する知識は求めません。本トークでは、Google Colab で利用可能なサンプルコードを GitHub 上に公開することで、Python の前提知識によらず最先端の自然言語処理を体験できる内容を準備します。","audience_takeaway":"1. 自然言語処理の概要\r\n2. 日本語言語処理における前処理の実装方法とその Tips\r\n3. BERT を含む最先端文書分類モデルの実装方法\r\n4. 利用シーンごとに最適な言語処理ライブラリを選択する方法\r\n5. 最先端の言語処理技術を Python ライブラリ化する方法","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"## トーク概要\r\nここ数年、日本語を解析対象とする自然言語処理ライブラリが多く公開されています。例えば、BERT を手軽に利用できる [Transformers](https://huggingface.co/transformers/index.html#) 、ニューラル言語処理向けトークナイザの [SentencePiece](https://github.com/google/sentencepiece) や単語依存構造解析が可能な [GiNZA](https://megagonlabs.github.io/ginza/) など、最先端の言語処理技術を利用できるライブラリの多くは Python ライブラリとして提供されています。しかし、多くの Python ライブラリが世界中からリリースされる反面、ユーザー側のライブラリの選択肢は増え、情報収集を含む技術選定コストも増加しているかと思われます。\r\n\r\nそこで、本トークでは自然言語処理の最新の研究動向を踏まえ、日本語を解析対象とする Python ライブラリを整理し、各利用シーン(Web開発、研究開発、勉強用)ごとに最適なライブラリを選択する方法を説明します。具体的には、文書分類タスクを通じて、コードの実装方法をチュートリアル形式で説明することにより、各ライブラリの特徴や利点を解説します。また、ライブラリの使い方を説明するだけではなく、映画レビューのデータセットを利用したライブラリの検証結果(精度、実行速度)を含め、どのように最先端の技術を Python ライブラリ化しているのか、Python ライブラリ実装の観点から見た特徴も解説します。\r\n\r\nオンライン開催の利点を最大限に活用できるよう、本トークで説明するサンプルコードは Google Colab で利用可能な形式で GitHub 上に公開し、Python の前提知識によらず最先端の自然言語処理を体験できる内容を提供します。\r\n\r\n\r\n## タイムラインと紹介ライブラリの一覧\r\n- 導入(2min)\r\n - 自己紹介\r\n - 本トークの概要と目的説明\r\n- 日本語言語処理における前処理の実装方法(10min)\r\n - 前処理の概要とその重要性の説明\r\n - 形態素解析器とサブワードトークナイザの紹介([mecab-python3](https://github.com/SamuraiT/mecab-python3), [Janome](https://mocobeta.github.io/janome/), [nagisa](https://github.com/taishi-i/nagisa), [Stanza](https://github.com/stanfordnlp/stanza), [SudachiPy](https://github.com/WorksApplications/SudachiPy), [spaCy](https://spacy.io/), [GiNZA](https://megagonlabs.github.io/ginza/), [Juman++](https://github.com/ku-nlp/jumanpp), [KyTea](http://www.phontron.com/kytea/index-ja.html), [SentencePiece](https://github.com/google/sentencepiece))\r\n - 各解析器の機能比較\r\n - 各解析器の実行速度比較\r\n - 各利用シーン(Web開発、研究開発、勉強用)を想定した前処理機能の実装方法の説明\r\n- 映画レビューを分類する文書分類モデルの実装方法(14min)\r\n - 文書分類タスクの説明と応用事例の紹介\r\n - 学習器と分類アルゴリズムの紹介([scikit-learn](https://scikit-learn.org/stable/), [spaCy](https://spacy.io/), [Transformers](https://huggingface.co/transformers/index.html#), [AllenNLP](https://github.com/allenai/allennlp), [FLAIR](https://github.com/flairNLP/flair))\r\n - 検証用データセットの説明([Yahoo Movie Reviews](https://github.com/dennybritz/sentiment-analysis))\r\n - 各利用シーン(Web開発、研究開発、勉強用)を想定した文書分類モデルの実装方法と最適なライブラリの選択方法の説明\r\n- まとめ(2min)\r\n- 質疑応答(2min)","name":"池田 大志","profile":"奈良先端科学技術大学院大学 自然言語処理学研究室(松本研)出身。 現在は企業にて、自然言語処理に関する研究開発に従事。"},{"id":"215384","title":"スペシャルブースツアー","room":"#pyconjp","day":"2","no":"","elevator_pitch":"スペシャルブースを紹介するコーナーです。\r\nconnpassチケットをお持ちの方は、connpassページの「参加者への情報」のURL一覧からアクセスしてください。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"スペシャルブースを紹介するコーナーです。\r\n\r\n","name":"","profile":""},{"id":"202455","title":"How to plot unstructured mesh file on Jupyter Notebook","room":"#pyconjp_1","day":"2","no":"4","elevator_pitch":"It is very important to plot the unstructured mesh and its data in scientific calculations. In Python, matplotlib is widely used to display results. However, there is not enough information abount plotting 2D and 3D unstructured grid meshes. This talk introduce the use of mayavi2 with the use of meshio and matplotlib and explains how to use them.","prerequisite_knowledge":"Jupyter Notebook\r\nmatplotlib","audience_takeaway":"- How to read unstructured mesh data and how visualize in Jupyter Notebook.\r\n- How to use mayavi2\r\n- How to use meshio and matplotlib\r\n- Developing information about meshioplt ","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Anything else basically which doesn’t fall into the types of topics above","lang_of_talk":"English","lang_of_slide":"English only","description":"- Introduction (1min)\r\n- Using library (10min)\r\n - mayavi2\r\n - meshio and matplotlib\r\n- Examples (10min)\r\n - plotting unstructured 2D mesh and data\r\n - plotting unstructured 3D mesh and data\r\n- development of meshioplt (5min)\r\n- Summary (1min)\r\n- Questions and answers (3min)","name":"Tetsuo Koyama","profile":"ARK Information Systems, INC. - Software Engineer (2012-)"},{"id":"203957","title":"NumPy/pandas使いのためのテスト自動化入門","room":"#pyconjp_5","day":"2","no":"4","elevator_pitch":"本トークでは、Pythonを使って数値実験やデータ処理を行う人に対して、NumPyやpandasに備わっているテスト機能について紹介します。\r\nJupyterNotebook上で試行錯誤しながらデータを扱う人にとって、テスト自動化の習慣は馴染みが薄いかもしれません。しかし書き捨てのコードが増えてくると、プログラムの結果に自信が持てなくなってきます。そんなとき、テストが自動化された.pyファイルに処理を移せると、本来の実験や分析に集中できるようになります。\r\n開発と実験のテストでは、同じ部分もあれば異なる部分もあります。 本トークでは、NumPyやpandasのテストについてTipsを紹介します。","prerequisite_knowledge":"- NumPyやpandasを使った経験があること","audience_takeaway":"- NumPyやpandasを扱うプログラムをテストする上でのTips\r\n","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"本トークでは、Pythonを使って数値実験やデータ処理を行う人を対象に、NumPyやpandasに備わっているテストのための機能について紹介します。\r\n\r\n▼内容\r\n1. 導入 (30秒)\r\n2. Jupyter Notebookから.pyへ (3分)\r\n - データ使いでもテストを書くメリット\r\n - 開発におけるテストとの違い\r\n - テストを書きやすいところ\r\n3. pytest (2分)\r\n4. NumPyのためのテスト (4分)\r\n5. pandasのためのテスト (4分)\r\n6. まとめ (30秒)","name":"Tomoko Furuki (@komo_fr)","profile":"大学では知能情報メディアを専攻し、就職後はメーカーにてソフトウエア開発とPythonによるデータ活用のPoCや機械学習の取り組みを経験。科学技術計算分野へのPythonの活用に関心があり、現在は民間の会社でPythonを使ったデータ解析を、大学では研究のためのソフトウエア開発に従事。"},{"id":"202771","title":"Pythonによる機械翻訳モデルの構築","room":"#pyconjp_4","day":"2","no":"4","elevator_pitch":"ディープラーニングの知識や実装経験はあるが、チュートリアルレベルから抜け出せない人に向けて、より実践的な内容にステップアップするための知見を紹介します。近年登場しているモデルは複雑化しており、その実装にはコーディングだけではなく、理論の理解、マシンリソースに関する知見が必須です。でもどうしたら難しい理論を理解し、マシンを適切に使いこなせるようになるのでしょうか、それはPythonと一緒に学ぶことです。このセッションでは、Pythonコードから理論を紐解き、理解する方法を紹介します。また、Google Colabで実際に手を動かしながらGPUやTPUの使用方法について解説します。","prerequisite_knowledge":" - TensorFlowの使用経験\r\n - ディープラーニングに関する基本的な知識\r\n - 自然言語処理に関する基本的な知識(尚可)","audience_takeaway":" - 実践的なディープラーニングの実装手法\r\n - 機械翻訳やTransformerなどの自然言語処理に関する知識\r\n - Google Colabの使い方\r\n - TPU(Tensor Processing Unit)を使用したモデルの実装方法\r\n - ハンズオンで使用するコード","talk_format":"Hands-on session(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"このセッションでは、Pythonで日本語を英語に翻訳する機械翻訳モデルを構築することを通して、実践的なディープラーニングの実装方法について学びます。まず、Transformerについて解説します。TransformerはBERTやGPT-2などに応用されており、近年の自然言語処理モデルを理解するためには欠かせない技術となっています。続いてソースコードリーディングを行い、Transformerに関する理解を深めます。ディープラーニングには数学がつきものですが、Pythonコードと一緒にモデルを追うことで、より直感的に理論を理解することができます。また、Google Colabを用いたハンズオンでは、TPUを使用するためのコードをPythonで実装します。ディープラーニングの効率的な学習にはGPUが必要ですが、最近はGPUだけでは計算しきれないモデルが登場しています。TPUはそういったモデルに有効であり、使いこなせるようになれば、ディープラーニング実装の幅が広がります。\r\n\r\n\r\n発表の構成は以下の通りです。\r\n\r\n# 導入(10min)\r\n - 自己紹介\r\n - このセッションの概要\r\n - Google Colabで実際にコードを動かしてみよう\r\n - 参加者はGPUで学習を実行し、機械翻訳でどんなことができるのかを確認します\r\n\r\n# Transformerの解説(10min)\r\n - Transformerのモデルアーキテクチャを示す図を用いて解説\r\n - モデルの概要や機械翻訳の仕組みを解説\r\n\r\n# ソースコードリーディング(10min)\r\n - Transformerのモデルアーキテクチャを示す図とPythonのソースコードを照らし合わせながら解説\r\n - ソースコードと同時に見ることで、理論の理解を深めます\r\n \r\n# TPUで学習してみよう(10min)\r\n - TPUとは何か、GPUとの違いを説明します\r\n - TPUで学習するためのコードをPythonで実装します\r\n \r\n# 質疑応答(5min)","name":"Kento","profile":"株式会社リーディング・エッジ社所属\r\n自然言語処理とディープラーニングに関する研究開発をしています"},{"id":"203568","title":"Spec-driven development for REST API","room":"#pyconjp_3","day":"2","no":"4","elevator_pitch":"API開発において、利用者向けのドキュメント\r\n及び操作UIを提供するのは思いの外、大変な作業です。\r\n特に内部向けのAPI開発の場合は時間もリソースも限られがちの為、あまり大掛かりなことはできません。\r\n今回はconnexionを使うことでそれを実現したのでご紹介致します。\r\n","prerequisite_knowledge":"RESTful APIの仕様、構造\r\nflask開発の経験\r\nswagger(OpenAPI)-uiの仕様\r\nYAML記法","audience_takeaway":"swagger-ui付きweb APIの作り方\r\n(及びサンプル)","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"PyCon JPのスタッフ活動ではSlackやGoogleドライブなどのツールを使います。\r\nツールについてイケていないと感じた点をPythonで解消した例を2つ紹介します。\r\n\r\n基盤運用に向けて様々なAPI、wrapper開発が必要となります。\r\n元々、ネットワーク機器・サーバ機器・ストレージ機器が持つAPIを利用するための\r\n中間APIとして利用する為、かけられる工数、ドキュメント量の制限(少ない方が良い)等の制約があります。\r\n\r\n従って、pythonに詳しくない人が容易に動作や仕様を想像できるような開発物が求められる為、\r\n試行錯誤した結果、connexionというものに行き着きました。\r\nPyConJPの中で恐縮ではありますが、よりPythonらしくない開発を行うことで\r\nPythonらしく無い人にもすんなり扱えるツールのご紹介ができればと思います。\r\n\r\n構成とタイムラインは以下のとおりです。\r\n※サンプルでは、構成を箇条書きで示し、大きな項目に所要時間の見積もりを付けることにします。\r\n\r\n- 導入(2min)\r\n - 自己紹介\r\n - Python開発に至った経緯を紹介\r\n - 問題意識\r\n- connexionを用いたweb API開発(10min)\r\n - API開発と操作ツールの同時開発(リリース)が求められる現場\r\n - なぜ、connexionか\r\n - できるだけ簡易なパッケージでなければならない\r\n - connexionを用いた開発の仕方\r\n - swagger.ymlを書き、そこからコードを呼ぶ\r\n\t- 開発例紹介\r\n - まとめ (1min)\r\n- 質疑応答 (2min)","name":"ainamori","profile":"Akira Inamori\r\n - 大学卒業後、SI企業にて数年勤務した後にIIJへ入社。\r\n - IIJにて主に動画配信プラットフォームの設計・構築・運用に携わる\r\n - 動画配信基盤の構築・運用に辺りpuppet, Chef, Ansibleを経てpython nativeでの自動化に取り組む\r\n - 4年間のUS駐在を経て現在は社内向け基盤システム担当部署に帰任。現在はpythonにて社内システムの操作ツール、API開発を行う"},{"id":"203944","title":"詳解デコレータ ~実用的なデコレータを理解しよう~","room":"#pyconjp_2","day":"2","no":"4","elevator_pitch":"pythonビギナーの方は、デコレータの理解や利用を後回しにしてしまうのではないでしょうか。\r\n無理に使わなくても問題ありませんが、コードの読みやすさや量、繰り返し発生する認証処理などにはデコレータが向いています。\r\nデコレータ記法に苦手意識のある方、これまで使ってこなかった方は、この機会に理解を深め、使えるようになりましょう。","prerequisite_knowledge":"市販のPython入門レベルのテキストを読み終えたレベル\r\nこれからPythonでweb開発を始めたい人","audience_takeaway":"デコレータの理解と使い方\r\nデコレータが使えるシチュエーションの知識","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"flask開発ではデコレータ記法が必須であり、それ以外にも応用の幅が広いデコレータですが、python入門書では基礎レベルを超えるためページ数が割かれていない感があります。入門者が自力で理解し使いこなせるようになるのは少しハードルが高いように感じるため、実用的なコード例を紹介しデコレータに親しんで欲しいと思います。\r\n\r\nまず、デコレータの文法を手短におさらいし、シンタックスシュガーを使った表現まで解説します。\r\n\r\n次に、実際にデコレータが使われるシーンを紹介します。\r\n例1:ラッパーとしての利用、ログの記録、関数のパラメータを表示etc.\r\n例2:flaskの使用例から、ルーティング、ログイン認証の実装を紹介\r\n\r\n最後に、デコレータが2つ以上ある場合の解説をします。\r\n日々使っていないと混乱してしまうと思うので、補足的に解説します。\r\n\r\n\r\n- 導入 (2min)\r\n - 自己紹介\r\n - 課題意識\r\n- デコレータの文法 (5min)\r\n - 高階関数の書き方、@を使った書き方\r\n- デコレータの実用例 (5min)\r\n - 既存関数のwraping, 具体例2つ程度、\r\n - flaskでのデコレータ利用例、ルーティング、ログイン認証\r\n - 2つ以上のデコレータがある場合\r\n- まとめ(1min)\r\n- 質疑応答(2min)","name":"Yosuke Nakabayashi","profile":"実務経験のないアマチュアpythonista\r\nはやくプロのpythonistaになりたい"},{"id":"202587","title":"Python(Cython) & OpenMPで高速並列処理","room":"#pyconjp_2","day":"2","no":"5","elevator_pitch":"Pythonは遅いからCで組むといった言葉を時折耳にします。\r\nパフォーマンスは重要ですが、Pythonの豊富なパッケージを天秤にかけると悩ましいです。\r\nCythonを使えば、Pythonを使ってC言語に匹敵する速度を出すことが出来ます。更にOpenMPを使うことでループを並列化できます。\r\nこれらのツールは一般的なPCは勿論のこと、スーパーコンピューターでも利用できます。\r\nPythonの組みやすさと、Cの速さで膨大な計算に対処することを目指します。","prerequisite_knowledge":"* 並列処理についての基礎的な知識\r\n* Linux OSについての基礎的な知識","audience_takeaway":"* Python(Cython)とOpenMPを使用した並列処理の方法\r\n* CythonとOpenMPの手軽な導入方法(LinuxOS or GoogleColab)\r\n* 簡単なPython(Cython & OpenMP)サンプルソースとそのURL\r\n* スーパーコンピューターをトライアルユースする方法","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Anything else basically which doesn’t fall into the types of topics above","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":" 当セッションはCython(Python)とOpenMPの導入情報の説明をメインとして行います。\r\n Cythonは変数や関数の定義、GILの扱いが少し特殊ですが、Pythonコードと共存できますし、pipで簡単にインストールできるので、\r\nPythonを使い慣れている方であれば、すぐにキャッチアップ出来ると考えております。\r\n 並列処理の手法は沢山ありますが、今回はOpenMPを題材とします。Cythonにモジュールが用意されているので簡単に利用できます。\r\nこれはスーパーコンピュータで利用されているツールの一つですが限定的に利用されるようなものではありません。\r\n自宅ですぐに動作を試すことも出来ます。\r\n Cython及びOpenMPはJupyter Notebook(GoogleColab)でも利用できるのでコードと実行結果をお見せしながら説明していきます。\r\n 最後に、スーパーコンピューターのトライアルユースについて簡単に紹介します。\r\n一般のユーザーでも気軽に試すことが出来ることを実感頂いて、敷居を少し低くします。\r\n 商用利用など本格的な運用については色々と制約があるので、あまり踏み込みません。\r\nまずは体験してみて、継続利用についてはその後に各自が考えるという前提に立ちます。\r\n 将来的な利用を視野に入れ、普段からハイスペックマシンを活用出来るようなコードの組み方に慣れておくことに価値を感じて頂きたいと思います。\r\n\r\n### 構成\r\n\r\n#### 1. はじめに(1min)\r\n\r\n* 自己紹介\r\n* きっかけ\r\n\r\n#### 2. Cython(6min)\r\n\r\n* Cythonとは\r\n* インストール手順\r\n* Python構文と、Cython独自の構文を織り交ぜたコードの書き方\r\n* コンパイルと実行の方法\r\n* Jupyter Notebook(GoogleColab)での実行方法\r\n\r\n#### 3. OpenMP(6min)\r\n\r\n* OpenMPとは\r\n* インストール手順\r\n* prangeの使い方\r\n* コンパイルと実行の方法\r\n* Jupyter Notebook(GoogleColab)での実行方法\r\n\r\n### 4. スーパーコンピュータ(2min)\r\n\r\n* トライアルユースについて\r\n* 使用感について","name":"kenichi yoshimura","profile":"「pythonはいいぞ」という言葉を見かけたのが全ての始まりでした。\r\n今ではしがないプログラマです。"},{"id":"203945","title":"Python、ときどきRust","room":"#pyconjp_3","day":"2","no":"5","elevator_pitch":"これまでPythonで性能を改善するために、CやC++を使うことには、なかなか踏み切れなかったりしていませんでしたか?\r\n数年前に登場したRustは、速度や品質、並列の三拍子を揃え、ここ最近、注目を浴びている言語で、CやC++のように自分でガベージコレクションをしなくてもいいのも特徴です。 PythonからこのRustを呼び出すことで、処理を高速化させたり、逆に便利なPythonパッケージをRustから呼び出す方法を理解することで、生産性を落とさずに安全で高速なソフトウェア開発をする方法についてお話しします。","prerequisite_knowledge":"Rustというプログラム言語があることを知ってる人。\r\nPythonのようなスクリプト言語には、常にパフォーマンス問題がつきまとっていることを認識している人。","audience_takeaway":"これまでよりも堅牢で信頼性の高いソフトウェアを開発する方法。","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"PythonからRustを呼んだり、逆にRustからPythonを呼ぶことで、これまでよりも生産性を高めながら性能や品質の高いアーキテクチャを準備する方法についてお話しします。","name":"あべんべん","profile":"Institution for a Global Society(IGS)株式会社に所属(上席研究員)。今から13年前にIron Pythonを使って宇宙で実験する制御装置の開発に初めてPythonを使ったのがきっかけで、それ以降も適材適所で幅広く利用。\r\nStart Python Clubやfin-pyなど8つのコミュニテイでスタッフの活動や、Pythonなどの技術書やビジネス書の監修・執筆・翻訳・査読なども行う。\r\nTwitter: @abenben"},{"id":"203893","title":"インメモリー ストリーム活用術","room":"#pyconjp_1","day":"2","no":"5","elevator_pitch":"Pythonで巨大なテキストファイルやバイナリファイルを扱った経験はありませんか?標準モジュールであるioモジュールに含まれるインメモリー ストリームStringIOおよびBytesIOを使えば効率的に扱えるかもしれません。本発表ではインメモリー ストリームの便利な使い方やその限界についてお話します。","prerequisite_knowledge":"Pythonでテキストファイルやバイナリファイルを取り扱った経験は必須です。具体的には組み込み関数openを使ったことがある人が対象です。\r\nインメモリー ストリームに関しては説明するので前提知識は不要です。","audience_takeaway":"- ioモジュールでテキストファイルやバイナリファイルを効率的に扱える方法、StringIOやBytesIOの限界について知ることができる\r\n- 普段の業務に応用できる\r\n- Pythonの標準モジュールの便利さを知ることができる。","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"Pythonファイルオブジェクトを扱う標準的な方法は組み込み関数openですが、その背後にはioモジュールが存在します。\r\nioモジュールはPythonのストリーム(file オブジェクト)を扱うためのモジュールで、その中にインメモリストリームであるStringIOとBytesIOが含まれます。\r\n本発表では、StringIOとBytesIOの使い方や実務を通して得た経験を伝えたいと思います。\r\n\r\n- Pythonでファイルを扱う普通の方法:open()\r\n - open()は便利である\r\n - open()はDisk IOを伴う\r\n- インメモリー ストリームStringIOおよびBytesIO\r\n - メモリ上のIOなので十分高速\r\n - メモリ上に載せるので巨大すぎると大変\r\n- ケーススタディ:インターネット経由で巨大なファイルを取得して加工して戻す\r\n - 巨大なファイルをディスクに書き込むと時間がかかる\r\n - 大規模な分散システム基盤は使いたくないしそもそも存在しなかった\r\n - StringIOとBytesIOを駆使してメモリ上でZIP圧縮まで行う\r\n- まとめ","name":"Hayao Suzuki","profile":"電気通信大学大学院 情報理工学研究科 総合情報学専攻 博士前期課程修了、修士(工学)。\r\n株式会社アイリッジにてスマートフォンアプリのバックエンドサーバーをPythonやDjangoで開発している。"},{"id":"203888","title":"機械学習の実装から考えるオブジェクト指向","room":"#pyconjp_5","day":"2","no":"5","elevator_pitch":"機械学習のモデルに関する実装をする中で、その複雑性に頭を抱える人は多いのではないでしょうか。\r\nこのトークでは、複雑な機械学習の実装を少しでも見通しよくするために、オブジェクト指向がどのように使用されているかについて2つ共有したいと思います。\r\n1つ目はオブジェクト指向の三大要素について、機械学習の実装とどう関わっているか概念的なところを説明します。\r\n2つ目は画像認識のモデルを例に実装において実際にオブジェクト指向がどのように機能しているかの説明したいと思います。\r\nこのトークを聞くことで、機械学習モデルの実装におけるオブジェクト指向の使用イメージをつかめることでしょう。","prerequisite_knowledge":"Pythonや何らかのプログラミング言語\r\n機械学習の実装経験","audience_takeaway":"・オブジェクト指向の三大要素である継承、カプセル化、ポリモーフィズムについての知識\r\n・三大要素が機械学習の実装で実際に使用されている場面\r\n・機械学習の実装においてオブジェクト指向が有意義であること","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"機械学習のその処理の複雑さから実装が複雑になりがちです。\r\nオブジェクト指向を意識して書くことで複雑な処理でも見通しが良くなり、メンテナンス性も向上したのでその話をさせていただきたいと思います。\r\n\r\nまず、最初に機械学習の実装におけるオブジェクト指向の説明をします。\r\n特に機械学習のモデルの実装をする上で、モデルによって共通する部分というのは少なからずできてくるので、それらをオブジェクト指向を使ってどのように実装しているかを話します。\r\n\r\n次に、実際に実装例を画像認識のモデルを用いて説明します。\r\nそれぞれのモデルの実装の中で、どこがオブジェクト指向の要素なのかを紐解いていきます。\r\n\r\n# 導入(3min)\r\n## 自己紹介\r\n## 問題意識\r\n\r\n# 機械学習の実装におけるオブジェクト指向(6min)\r\n## 機械学習の実装は複雑\r\n## その解決方法としてのオブジェクト指向\r\n## オブジェクト指向の三大要素\r\n## 使用される場面\r\n\r\n# 実装例(3min)\r\n## 物体検出と超解像と姿勢推定を具体例に説明\r\n\r\n# まとめ (1min)\r\n# 質疑応答 (2min)","name":"はんぺん","profile":"# 自己紹介\r\n- はんぺん([@hampen2929](https://twitter.com/hampen2929))\r\n\r\n# 経歴\r\n- 2015年3月\t 東北大学工学部卒業\r\n- 2016年\t Fraunhofer IISB (ドイツ留学)\r\n- 2018年3月 東北大学大学院工学研究科卒業\r\n- 2018年4月〜現在\tIT系企業ので機械学習エンジニア\r\n\r\n# テニス歴\r\n- 2013年11月\t 宮城県大会・準優勝(シングルス)\r\n- 2014年2月\t 宮城県学生選抜大会・ベスト4(シングルス)\r\n- 2014年5月\t 東北地区大会・ベスト8(シングルス)\r\n- 2014年5月\t 東北地区大会・準優勝(ダブルス)\r\n- 2014年8月\t 全日本学生テニス選手権大会出場(ダブルス)\r\n- 2018年11月 \t宮城県選抜ダブルス選手権大会ベスト4\r\n\r\n# 興味\r\n- 機械学習\r\n- テニス\r\n- 画像処理\r\n- 動画分析\r\n\r\n# 趣味\r\n- テニスのフォームの分析\r\n- テニスの試合映像からの人の位置と姿勢、ボールの位置、コートの位置の検出\r\n\r\n# 連絡先\r\n- yuya.mochimaru.ym@gmail.com\r\n\r\n# URL\r\nhttps://github.com/hampen2929/bio\r\n"},{"id":"214740","title":"Closing (Day 2)","room":"#pyconjp_1","day":"2","no":"","elevator_pitch":"2日目のクロージングです。\r\nDay2 Closing.\r\nYouTube Live: https://youtu.be/7HCJD4oxfuo","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"2日目のクロージングです。\r\nDay2 Closing.\r\nYouTube Live: https://youtu.be/7HCJD4oxfuo","name":"","profile":""},{"id":"215531","title":"Online Party","room":"#pyconjp_1","day":"2","no":"","elevator_pitch":"Zoomでのオンラインパーティを開催します。\r\n飲み物・食べ物は各自ご用意をお願いします。\r\n※connpassチケットが必要です。connpassページの「参加者への情報」に記載のURL一覧よりアクセスください。\r\n\r\nWe are planning Online Party. Details will be updated here.\r\nPrepare drinks & foods by yourself.\r\n* connpass ticket is required. See URL list on \"information for ticket holder(参加者への情報)\" on the connpass page for the URL.","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"","description":"Zoomでのオンラインパーティを開催します。\r\n飲み物・食べ物は各自ご用意をお願いします。\r\n※connpassチケットが必要です。connpassページの「参加者への情報」に記載のURL一覧よりアクセスください。\r\n\r\nWe are planning Online Party. Details will be updated here.\r\nPrepare drinks & foods by yourself.\r\n* connpass ticket is required. See URL list on \"information for ticket holder(参加者への情報)\" on the connpass page for the URL.\r\n\r\n","name":"","profile":""}],"dir":"/","path":"/talks","extension":".csv","slug":"talks","createdAt":"2021-09-23T12:10:23.200Z","updatedAt":"2021-09-23T12:10:23.200Z","meta":{"version":0,"revision":0,"created":1632399701704},"$loki":1}],"idIndex":[1],"maxId":1,"_dirty":true,"_nestedProperties":[],"transactional":false,"asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"cloneObjects":false,"cloneMethod":"deep","changes":[],"_fullTextSearch":{"ii":{"title":{"_store":true,"_optimizeChanges":true,"docCount":0,"docStore":[],"totalFieldLength":0,"root":{}},"description":{"_store":true,"_optimizeChanges":true,"docCount":0,"docStore":[],"totalFieldLength":0,"root":{}},"slug":{"_store":true,"_optimizeChanges":true,"docCount":1,"docStore":[[0,{"fieldLength":1}]],"totalFieldLength":1,"root":{"k":[116],"v":[{"k":[97],"v":[{"k":[108],"v":[{"k":[107],"v":[{"k":[115],"v":[{"d":{"df":1,"dc":[[0,1]]}}]}]}]}]}]}},"text":{"_store":true,"_optimizeChanges":true,"docCount":0,"docStore":[],"totalFieldLength":0,"root":{}}}}}],"databaseVersion":1.5,"engineVersion":1.5,"filename":"content.db","_persistenceAdapter":null,"_persistenceMethod":null,"_throttledSaves":true} \ No newline at end of file +{"_env":"NODEJS","_serializationMethod":"normal","_autosave":false,"_autosaveInterval":5000,"_collections":[{"name":"items","unindexedSortComparator":"js","defaultLokiOperatorPackage":"js","_dynamicViews":[],"uniqueNames":[],"transforms":{},"rangedIndexes":{},"_data":[{"body":[{"id":"214734","title":"Opening (Day 1)","room":"#pyconjp","day":"1","no":"","elevator_pitch":"Opening (Day1).\nYouTube Live: https://youtu.be/rq1LHsvJmWA\n","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"Opening (Day1).\nYouTube Live: https://youtu.be/rq1LHsvJmWA\n","name":"","profile":""},{"id":"214736","title":"基調講演:芝世弐氏","room":"#pyconjp","day":"1","no":"","elevator_pitch":"Day1 Keynote by Seiji Shiba.\nYouTube Live: https://youtu.be/rq1LHsvJmWA","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Keynote","audience_python_level":"","audience_expertise":"","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"芝世弐氏による基調講演です。\n\nhttps://pyconjp.blogspot.com/2020/06/pycon-jp-2020-announcement-of-keynote.html","name":"芝世弐","profile":"2017年に独学で機械学習を始め,同年に初参加の将棋電王トーナメントにて準優勝。\n翌年には世界コンピュータ将棋選手権に初参加で優勝してしまう。\n以後,2019年および2020年の大会では準優勝と参加大会の平均順位が1点台という驚異的な強さを誇る。\n本職は数値シミュレーションを主とする研究者であるが最近の発表は大半将棋に関するものになっている。\n趣味はビールと将棋観戦。\n\nIn 2017, he began self-taught machine learning, and in the same year, he became the runner-up in the Shogi (Japanese Chess) Den-O tournament he participated in for the first time.\nThe following year, he won the World Computer Shogi Championship even though it was the first time he participated.\nSince then, he has been a runner-up in the 2019 and 2020 meets and has a phenomenal one-point average ranking in the participating meets.\nHe is a researcher who mainly works on numerical simulations, but most of his recent publications have been about shogi.\nHis hobbies are beer and watching shogi."},{"id":"202715","title":"2020年代のコンテナ時代のPythonアーキテクチャ&デプロイ","room":"#pyconjp_4","day":"1","no":"1","elevator_pitch":"機械学習をAPIサービスとして実装するか、バッチ処理にするか、はたまた通常のウェブアプリを実装するかによらず、デプロイ手段として重要度が増しているのがコンテナです。ローカルで開発環境を作る上でも便利です。コンテナに適したアプリケーションの作法を学ぶとともに、asyncioを使うことでそのパフォーマンスを引き出します。最後にそれらをコンテナにまとめてデプロイする方法を学びます。","prerequisite_knowledge":"Dockerやコンテナとはなにか?Dockerfileを書ける知識については問わない\nクラウドとはなにか?\nウェブアプリケーションを何かしら作ったことがある","audience_takeaway":"12 factors appに従った今どきのアプリケーションに求められる特性\nPython 3時代のハイパフォーマンスなウェブサービスの実装方法\nビルド時間が短く、性能がよく、サイズも良く、セキュリティも高いDockerイメージを作る","talk_format":"Talk(45min)","audience_python_level":"Advanced","audience_expertise":"50%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"クラウドサービスがどんどん拡充されていく中、大きなウェイトを締めてきているのがコンテナです。本番環境で活用している事例も多く、今後導入を考えている人もどんどん増えています。開発環境の一部としての利用もますます増えています。\n\nhttps://www.publickey1.jp/blog/20/docker142idc_japan.html\nhttps://www.jetbrains.com/lp/python-developers-survey-2019/\n\nコンテナを知ることで、技術革新の高速道路に乗りやすくなります。Pythonの用途は機械学習を中心として広がっていますし、以前からのウェブアプリケーション開発もあります。そのどの用途であっても、APIサーバー、ウェブサービス、バッチを作ることになりますが、それらはコンテナとして動かすことができ、従量課金のサーバーレスといったコンテナネイティブな運用方法に乗せることができます。費用的にも、管理的にもメリットが得られます。\n\nコンテナで動くアプリケーションにもいくつか作法があります。コンテナという枠の中で動くために自由に触れません。作法に従うことでトラブルを減らすことができますし、コンテナネイティブな設計はシンプルになるため、開発の手間も少なくなります。ウェブフロントエンドのJavaScriptの開発とセットで行う方法など、開発環境、デバッグ方法についても紹介します。\n\nコンテナ中で動くアプリケーションは特定のCPU/メモリの中で動作します。つまり、CPUを引き出すのがコンテナ時代にはハイパフォーマンスに動くアプリケーションの要件になります。Python2がEOLになることで、Python3のasyncioを活かしやすくなります。すでにasyncioを活かすライブラリがたくさん出ています。asyncioの仕組みや基本を紹介したあとに、Python 3時代の高速なウェブアプリケーションやバッチ処理の実装方法についても紹介します。\n\n最後に、Dockerイメージの作成方法を学びます。Dockerイメージ作成も、少し知識がないと、色々選択肢があって迷います。用途に合わせた最適なベースイメージを選択する方法、そして今どきのDockerの機能を生かした効率的なDockerfileの書き方を紹介します。\n\n* 自己紹介(3min)\n* コンテナ(15min)\n * コンテナとはなにか\n * コンテナは開発支援ツール\n * コンテナはデプロイツール\n * Lambda/Functionsとの違い\n * 12 factors appに従ったPythonコンテナの作成\n * デバッグ・デプロイ\n * コンテナで動くアプリケーションの今どきのログ出力\n * 分散トレーシング\n* コンテナ時代のモダンPythonアーキテクチャ(15min)\n * CPUバウンドとI/Oバウンド\n * コンテナやクラウドの性能を引き出すには?\n * 3系ならasyncio\n * Starlette\n * aiohttp\n * asyncpgなど\n* パッケージングしてデプロイ(10min)\n * ビルド時間が短く、性能がよく、サイズも良く、セキュリティも高いイメージを作る\n* まとめ(2min)","name":"shibukawa","profile":"Python 2.1ぐらいからのPythonユーザー。エキスパートPythonプログラミングの翻訳者の1人。Python以外にはTypeScript/Go/C++あたり。のユーザー。"},{"id":"213314","title":"Invited talk: The Python Community, Stronger Together","room":"#pyconjp_1","day":"1","no":"1","elevator_pitch":"2020 has been a year like no other in recent memory. A global pandemic has made shelter-in-place the new normal. You can no longer attend local Python meetups, or travel to conferences local or international to see your favorite speakers. Thankfully, the community has adapted, and new opportunities to participate remotely have popped up. Let's learn how to navigate this new landscape and be stronger together,","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(30min)","audience_python_level":"","audience_expertise":"","track":"Community building related to Python","lang_of_talk":"English","lang_of_slide":"English only","description":"Invited talk by Nina Zakharenko\n\nhttps://pyconjp.blogspot.com/2020/08/invited-talks5.html","name":"Nina Zakharenko","profile":"Nina Zakharenko is a software engineer with over a decade of experience and a newly elected member of the Board of Directors of the PSF. She currently focuses on Python at Microsoft on the Cloud Developer Advocacy team. In the past, she’s written software for satellite control computers at HBO, code that's helped people connect over their passions at Meetup, and implemented time-wasting features on Reddit. In her spare time, she enjoys tinkering with hardware, LEDs, and wearable electronics.\n\nNina loves teaching developers and has spoken at conferences like PyCon US, PyCon Russia, EuroPython, and DjangoCon in the US and internationally. This year, she's very excited to join PyCon Japan remotely for the first time!"},{"id":"203955","title":"Python 3.9 時代の型安全な Python の極め方","room":"#pyconjp_2","day":"1","no":"1","elevator_pitch":"Python は動的型付き言語ですが、「型ヒント」によって変数などに型を定義できます。型ヒントを活用すれば IDE での補完が強力になったり、静的解析で\"型安全\"にできるなど、動的型付き言語でありながら、型の恩恵を得ることができるのです!\n型ヒントの環境は年々進化しています。Python 3.9 でのアップデートや、Google/Microsoft による型チェッカーの公開などもあり、型ヒントを書いたことがあっても最新情報をキャッチアップができていない方も多いと思います。\n\nJX通信社で型ヒントを数年活用して「型の恩恵」を得てきたスピーカーが、最新の型ヒントの活用方法を紹介します。","prerequisite_knowledge":"Python 3 の基本的な文法。必須ではありませんが、静的型付け言語の経験などがあるとスムーズです。\n","audience_takeaway":"- 最新の型ヒントの使い方\n- mypy などを活用した、型安全な Python の書き方\n- 実務での型ヒントや mypy の活用方法","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"このセッションでは、Python 3.5 で公式サポートされた「型ヒント (Type Hint)」について、2020年現在の最新状況を紹介します。\n\nPython は動的型付き言語ですが、型ヒントを使うと、ソースコード上の変数などに型の情報を付与できます。サードパーティーツールと組み合わせれば IDE での補完や型の誤りのチェックなど、静的型付き言語のようなメリットが得られます。\n実際に、私が所属する JX 通信社では、なるべく \"型安全\" な Python を書いてチーム開発する文化があり、型を意識した Clean Architecture の実践、CI での型チェックなども行ってきました。\n\nまた、Python の型ヒントを取り巻く環境は年々進化しています。文法自体のアップデートもありますが、typing モジュールや typeshed が拡充されていたり、mypy 以外の型チェックツールも Google や Microsoft によって公開されています。\n\nこのセッションは、型ヒントを実務で活用してきた経験を活かし、「Python3.9時代」の型ヒントを紹介するのがメインテーマです。主に次のようなトピックを扱います。\n1. 型ヒントに関する概要\n2. Python 3.9 を想定した型ヒントの使い方\n3. 2020年現在のサードパーティーツールによる静的型チェック\n4. JX 通信社での実事例\n\n構成とタイムラインは以下の通りです。\n\n- 導入 (7min)\n - 型ヒントとは何か、何でないか\n - 型ヒントでできること\n- 型ヒントの書き方 (15min)\n - 基本的な書き方\n - ジェネリクスなどの高度な型の紹介\n - Protocol を使った構造的部分型の紹介\n - Python 3.9、3.8 でのアップデート\n- サードパーティーツールの活用 (10min)\n - mypy の紹介\n - pyright、pytypeなどの新しい型チェックツール\n - pydantic の活用\n- 型ヒントを実務に活かす (10min)\n - CI に組み込むときのテクニック\n - 型定義されてないライブラリに出会ったとき\n- まとめ (1min)\n- 質疑応答 (2min)\n","name":"yamitzky","profile":"株式会社JX通信社の開発担当役員(CDO)。エンジニアとしては、Scala や Python を使ったデータ解析や TypeScript でのフロントエンド開発などを経験"},{"id":"203572","title":"unittest.mockを使って単体テストを書こう 〜より効率的で安定したテストに〜","room":"#pyconjp_3","day":"1","no":"1","elevator_pitch":"このトークは、Pythonで単体テストを書いたことはあるけれども、モックオブジェクトは知らないという方向けです。\n同じテストケースなのに実行結果が異なったり、テストの実行速度が遅くて悩んだことはありませんか。\nそんな時の解決策として、モックオブジェクトがあります。\nこれはプロダクトコードの一部をテスト用オブジェクトに置き換えるというものです。\nこれをPythonで使うには、unittest.mockモジュールを使います。\nこのトークでは、モックオブジェクトの基本的な考え方とunittest.mockモジュールの使い方を扱い、\n聴衆の方がPythonでモックオブジェクトを適切に使えるようになることを目的としています。","prerequisite_knowledge":"- Pythonで単体テストを書いた経験が必要です。(unittestモジュールでもサードパーティのテストライブラリでもどちらでも構いません)\n- unittestモジュールの基本的な文法(assertEqualやassertRaisesなど)を知っている前提なので、単体テスト自体の文法の説明はしません。\n- unittest.mockモジュールを利用したことがあると理解しやすいですが、概念や使い方から説明しますので必須ではありません。","audience_takeaway":"モックオブジェクトの考え方\n- モックオブジェクトを使う目的\n- モックオブジェクトの使い方\n- 使い方アンチパターンとその対応策\n\nunittest.mockモジュールの使い方\n- unittest.mockモジュールの基本的な文法\n- unittest.mock.Mockとunittest.mock.MagicMockの仕組み\n- unittest.mockを使って困ったこととその対策\n- datetime.datetime.nowをモックするには\n- unittest.mock.patchが当たらない原因と対策\n- ある関数が呼ばれたことだけテストするには\n- 外部APIへのリクエストを含む関数をテストするには","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"### 話さないこと\n* テスト実行に便利なツールの紹介(coverageなど)\n* pytestの紹介及びunittestとの比較\n* E2Eテスト、結合テストの話\n\n\n### 話すこと\n単体テストの目的(3分)\n単体テストの目的\n単体テストを書くメリット\n\n単体テストの理想像(3分)\n単体テストは下記の条件が揃っているべきです\n- 速く実行されます\n- 常に同じ条件下で同じことがテストされます\n- 外的要因を排除します\n- 1つのテストメソッドは1つのことのみを確認していなければなりません\n- テスト対象の関数の振る舞いを担保します\n\n単体テストでモックオブジェクトを使う理由(5分)\n- モックオブジェクトを使っていないためテストが失敗したり成功したりする例\n- モックオブジェクトの説明\n- モックオブジェクトを使った解決策の説明\n\nPythonのunittest.mockの基本的な使い方(10分)\n- 具体的なコードを用いて説明します。\n\n\nunittest.mock.Mockとunittest.mock.MagicMockの仕組み(8分)\n- 具体的なコードを用いて説明します。\n\nモックオブジェクトアンチパターン(5分)\n- モックオブジェクトをメンテナンスしない故に、テストは通っているのにバグが発生\n- よくテストされた箇所、もしくはテストが不要なほど細分化された箇所のみをモックオブジェクトに置き換えるべきです\n- TypeHintで精査して変更した箇所に他の箇所が型違反していないか確認することでアトリビュートの齟齬によるエラーを防げます\n\n\nunittest.mockモジュールを使って困った点とその対策(5分)\n- unittest.mock.patchが当たらない\n- assert_called_once_withなど、関数が呼ばれたことを確認する方法\n- APIのレスポンスをモックオブジェクトに置き換えることで、外部- APIを呼び出す関数の振る舞いをテストします\n- datetime.datetime.nowをモックオブジェクトに置き換えられない場合、datetime.datetime.nowを引数に持たせるかPythonの3rdパーティライブラリ「freezegun」を使ってテストします\n","name":"みずき","profile":"2018年に趣味でPythonを始め、2019年1月からずっとPythonでWeb開発に従事しています。\n2020年4月から現職。"},{"id":"203929","title":"数理最適化×機械学習コラボレーションによる課題解決","room":"#pyconjp_5","day":"1","no":"1","elevator_pitch":"データサイエンスの潮流の中の一つとして、機械学習と数理最適化を組み合わせて課題解決をする流れが出来つつあります。\n機械学習の得意なところ、数理最適化での得意なところをコラボレーションさせることによって、データ分析結果から意思決定まで繋げることが可能となります。\n具体例としては①メーカーでの需要予測→生産計画立案や物流計画の立案、②人材サービスにおけるスキルシート分析→人材アサイン計画の立案といった例があげられます。このような課題をPythonとPandas、Scikit-Learn、Google OR-Toolsでシームレスに実現することができます。本発表ではGoogle OR-Toolsを使ったコーディング方法、組合せ最適化問題のモデリング、問題分割や計算の高速化方法といった実践的なポイントを事例とともに説明します。","prerequisite_knowledge":"機械学習という言葉を聞いたことがある\n数理最適化という言葉を聞いたことがある","audience_takeaway":"Pythonの機械学習/数理最適化ライブラリの名前、使い方、それらを組み合わせた課題解決方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"データサイエンスの潮流の中の一つとして、機械学習と数理最適化を組み合わせて課題解決をする流れが出来つつあります。\n本発表では、Pythonによる機械学習と数理最適化の組み合わせにより課題解決をする方法をご紹介します。\n\n機械学習では、与えられたデータについての判別、分類、予測といったことを得意としています。対して、数理最適化では制約条件と、目的とする評価指標を定義し、その評価指標を最大化(もしくは最小化)する最適解を導きだす、意思決定をするといったことを得意としています。これまでは、何かのデータをそのまま使って数理最適化で意思決定をすることが実施されてきましたが、近年ではデータの蓄積やデジタルトランスフォーメーションにより、ユーザの抱えている問題が複雑化高度化して、解決すべき課題も難しくなってきています。\n\n一例を挙げてみると、メーカーが販売計画や物流計画を作成するとき、元となる過去のデータから、未来の状態を予測して意思決定をしなければなりません。また、過去のデータが文書データである場合には、最適化で利用できるよう数値に変換をしなければなりません。このように、機械学習や自然言語処理を活用して変換や予測した結果を用い、数理最適化で意思決定をすることでデータ分析から、計画立案という意思決定までをPythonを使って実現することができます。\n\n本発表では、弊社での取り組みの一つとして、簡単な自然言語処理と数理最適化を組み合わせた事例を紹介いたします。弊社では人材派遣業をおこなっておりますが、エンジニアの採用という業務の中で、効率よく面接計画を立案しなければならないという課題がありした。実際には、ベテランの営業管理者が、営業担当者のスキルと採用応募者のスキルを照らし合わせ、マッチングの高い組合せでスケジュールの合う担当者を割り当てる、といった作業を毎日実施していました。\n\n営業担当者のスキルとしては、金融、製造といった業種、PythonやJavaといったプログラミング言語、プロジェクトマネージャや、プロジェクトリーダー、SE、PL、PG、データサイエンティストといった担当領域など、いくつかのベクトルがあり、同ように、エンジニア側にもいくつかのベクトルがありました。これらの過去データを機械学習にかけてマッチング度を算出し、営業担当者と採用応募者の面接可能日時を制約条件として、全体的なマッチング度が最も高い面談スケジュールを立案することが可能となります。その効果として、営業部全体での業務負荷低減と効率的な人材確保を期待することができます。\n\n必要なものはPythonとPandas、Scikit-Learn、Google OR-Toolsという誰もが利用できるPythonパッケージです。本発表では事例の他に、Google OR-Toolsを使った基礎的なプログラミングから、組合せ最適化問題のモデリング、問題の分割や計算の高速化といった実践的なポイントも事例とともに紹介いたします。","name":"鈴木 庸氏","profile":"株式会社リーディングエッジ社にて、PythonとOR-Toolsによる需要予測/物流計画最適化を担当しています。Python3スキルアップ教科書の共同著者、オペレーションズリサーチ学会員。\n\ntwitter -url:https://twitter.com/suzuki_youji"},{"id":"215380","title":"PyCon JP Association 運営会議(公開型)","room":"#pyconjp","day":"1","no":"","elevator_pitch":"一般社団法人PyCon JP Association の公開運営会議を開催します。\n\nZoomでの配信となります(YouTube Liveでは配信されません)。connpassチケットをお持ちの方は、connpassの「参加者への情報」に記載のURL一覧からアクセスください。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"一般社団法人PyCon JP Association の公開運営会議を開催します。\n\nZoomでの配信となります(YouTube Liveでは配信されません)。connpassチケットをお持ちの方は、connpassの「参加者への情報」に記載のURL一覧からアクセスください。\n\n---\n\n参加にあたって特に前提知識やPythonスキルは不要です。","name":"","profile":""},{"id":"203640","title":"Machine Learning Outside the Kaggle Lines","room":"#pyconjp_5","day":"1","no":"2","elevator_pitch":"Kaggle competitions are great, but what do you do when you have a cool idea for your own machine-learning project? Learn about all the dirty data, bugs of others, and keeping it all running, when building from zero to production. Hear about the mistakes that I've made so you can avoid them yourself.","prerequisite_knowledge":"This talk is for people who are familiar with the popular tools of machine learning in Python, but have little experience with real-world machine learning projects or applications. They know about, and probably have used, libraries such as Numpy, Pandas, Scikit-Learn, and Tensorflow, but mostly in the the context of a class project or Kaggle competition.","audience_takeaway":"From this talk, the audience will learn more about the challenges and pitfalls that come with building their own machine learning applications from scratch, so as to better avoid them and increase their chances of producing a complete, successful project.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":"Machine learning is more art than science, and it isn't alway clear how you go from Kaggle competitions to building your own machine learning project from scratch. You have a cool idea, but how do you turn it into an application that you can show off to your friends, basking in the warmth of their envy? More importantly, what mistakes do you need to avoid in order to keep the hope of such basking alive?\n\nCome along and hear of my missteps, assumptions exposed and exploded, and the unpleasant surprises that come from doing machine learning in the wild. You'll learn about how to deal with haphazard data entry, depending on the kindness of strangers, boxes of different shapes and sizes, and, finally, what to do when all of this changes, because it will.\n\nIf you're interested in machine learning and are familiar with the basic tools and techniques, but are unsure of how to take a project idea to production, this talk will at least show you what not to do and how not to do it.\n\nOutline:\n1. Introduction (2 mins)\n * Explain Aussie Rules Football, footy tipping, and inspiration for the project.\n * Set up structure of the talk: two seasons-worth of work, with what I did wrong in season one, and how I did it better (but not perfectly) for season two.\n2. Understanding the Problem (2 mins)\n * Season one: I just built a model to predict winners and losers.\n * I didn't realise that one has to predict margins as well.\n * Season two: I built a model to predict margins.\n3. Collecting the Data (5 mins)\n * Season one: I wrote my own web scraper.\n * Season two: I imported data from a package that did the web scraping for me.\n * It's good to share the work rather than go it alone.\n * Use the right tool for the job: importing data from an R package can be less work than getting it yourself.\n * Season one: I panicked and changed my data source, because the original source didn't update at the beginning of the week.\n * Season two: I updated data in accordance with scheduled updates to websites.\n * It's important to understand the source of data in addition to the data itself.\n4. Cleaning the Data (5 mins)\n * Season one: I filled and/or dropped blank data and hoped for the best.\n * Season two: I added a lot of assertions about the shape and content of data to raise errors early.\n * Explicit assertions about your assumptions catch buggy data that wouldn't raise errors otherwise.\n * With dynamic data sources, unexpected bugs pop up regularly; static unit tests won't catch them.\n5. Model Selection (2 mins)\n * Season one: I started with multi-layer RNNs, because deep learning is the best, right?\n * Season two: I tested a wide variety of model types, and NNs didn't have the best performance.\n * Test your assumptions, because sometimes the results will surprise you.\n * Interpretability and maintainability matter, because this isn't something you turn in for the best possible score then forget about.\n6. The Joy of Production (5 mins)\n * Season one: I deployed to Heroku right before the season started, and it didn't work.\n * Some C libraries weren't available in that environment.\n * I deployed a Docker container to make sure all dependencies were in production.\n * Season two: I deployed a container to Heroku right before the season started, and it didn't work.\n * New player data set was too big and exceeded the free-tier memory limit.\n * I paid for a larger server, until I could change the app's architecture.\n * Know the differences between local and production environments, especially the limitations of the latter.\n7. Conclusion (2 mins)\n * Season one: despite the mistakes, I won my office footy tipping competition by one whole point.\n * Season two: despite the improvements, I lost my office footy tipping competition by five points.\n * Doing things the right way improves your chances, but doesn't guarantee victory.","name":"Craig Franklin","profile":"Craig is a professional web developer by way of digital marketing and an amateur data scientist by way of wanting to understand what in the world all these numbers mean. Writing Ruby by day, his passion projects are centered around sports, data, and machine learning, all for the ultimate prize of bragging rights. Originally from the suburbs of Seattle, WA, he currently lives in Melbourne, Australia."},{"id":"203235","title":"PythonからGolangに変更してから再びPythonに戻った理由","room":"#pyconjp_2","day":"1","no":"2","elevator_pitch":"会社でPythonでGolangを使うことに決めましたが、Pythonに戻った経験を共有します。\nそして1ヶ月ぶりにPythonを使ってMirco Serviceをランチすることができました。\nなぜGolangに移ることに決め、戻ってきた理由を共有します。\nMirco Serviceの2つをリリースし、PythonとGolangを一緒に使用した経験をもとに、Pythonがなぜこのように生産性が良く、愛されるのかについて話します。","prerequisite_knowledge":"PythonでHTTP Request(requests), JsonやXMLを使用する方法。\n\nDjangoサーバーを作った経験があれば良いですが、なくても理解する上で大きな無理はなさそうです。\n\nそして、Golangに関する基本的な知識があればやはりいいです。 DDDやMSAについて聞いたことがある人なら理解するのに役立つでしょうが、メインテーマではないので大丈夫です。","audience_takeaway":"PythonがGolangに比べて持つ強みは何か(Pythonの魅力)!\n\nMicro Serviceに合わせて言語を選択する方法\n\nPythonでNetwork Requestを送り、Json/XMLを処理する方法\n\nGolangという言語の簡単な使い方","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"BUZZVIL(my company)ではPythonとGolangを使用してMonolithic ArchitectureでMicro Service Architectureとして、漸進的に変えています。\nしたがって、新たに製作するMicro ServiceをGolangで作ったが、すでに使用していたPythonに比べ、不便な点が多かったです。 したがって、Micro Serviceの発売まで長い時間がかかるようになりました。\nその次のMicro Serviceは再びPythonを使用するようになり、はるかに短い期間内にオープンが可能になりました。\nその過程でどのような点がプロジェクトの進行に影響を与え、Pythonのどんな点が生産性、恒常を持ってくるのか分析しました。\n\n\n導入\n- 自己紹介(3min)\n- 会社がMonolithicからMSAに移った背景について (4min)\n\n1. Type System (8min)\n1-1. Introduce Golang.\n1-2. Duck Typing / Structural Typing\n1-3. Functional Programming\n\n2. HTTP Client (8min)\n2-1. Python requests\n2-2. Golang net/http\n2-3. What is the difference?\n2-4. Concurrency\n\n3. Handling JSON (8min)\n3-1. Python json\n3-2. Golang encoding/json\n3-3. What is the difference?\n3-4. XML の場合どうなるか。\n\n4. 開発環境(8min)\n4-1.ORMではどう違うか\n4-2. Package 管理者(pip / go mod)\n4-3. Lint / Test / Etc\n\n\n仕上げ\n\n- 現在のプロジェクト結果(2~3min)\n- 質疑応答(3min)","name":"Las","profile":"恋人に従ってプログラミングを学ぶとプログラマーになった人。 プログラミングを教える高校を出てすぐ会社で仕事中。"},{"id":"203891","title":"Pythonパッケージの影響を歴史から理解してみよう!","room":"#pyconjp_4","day":"1","no":"2","elevator_pitch":"distutils、easy_install、setuptools、pip、tox、venv、pipenv、poetry などの Python パッケージツールの起源を考えたことがありますか? このトークでは、「Pythonソフトウェア Distribution」の歴史を紹介します。\n\nコミュニティが Python パッケージを提案する以前、どのように大企業は Python パッケージを作成していたか、ご存知ですか?このトークでは、とある大企業が自作Pythonパッケージシステム運用に苦戦した過去、そこから学んだ教訓、そして最終的にコミュニティのPythonパッケージを採用した理由について紹介します。\n\nPython パッケージの歴史や、大企業が苦戦したPythonパッケージシステム運用話について興味があれば、ぜひ参加してください。","prerequisite_knowledge":"【Prerequisite knowledge】\n- Basic experience in python packaging. Related technical terms: distutils, setuptools, pip, and PyPI.\n\n【Optional knowledge】\n- Newer Python packaging tools: bento, twine, flit, pipenv, and poetry.\n- Famous PEP mentioned in Outline of Description.","audience_takeaway":"- Well-organized history timeline with detail. \n- Learn the history of python packaging and the reason behind different solutions.\n- Learn the build system experience from the speaker, and be able to make right decision in the first place if they meet similar problem in the near future.","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"There's a [talk by Dustin](https://www.youtube.com/watch?v=na0hQI5Ep5E) presented similar \"time travel\" content from community perceptive. In this talk, I will present the impact of the evolvement of python packaging and provide my company as an example which built before Python community had Python packaging solution.\n\nThe talk contains 2 parts: History (Fact) and Treatment (Action).\n\nIn the 1st section, I will cover history of \"Python Software Distribution\" along with few PEP and their corresponding tools, including Metadata (RFC822, PEP241, 314, 345, 426, 459, 566), Database (PEP262, 376, 427, 440), and Runtime (PEP405, 374, 582) and share my insight from the history.\n\nIn the 2nd section, I will talk about the treatment for company started before those idiomatic tools built, our learned lessons, and available treatments in 2020.\n\n---\n\nOutline and timeline are as follows.\n\n1.自己紹介と動機 【3分】\n2.Python パッケージの歴史 【18分】\n - Python1(2.5分)\n - ソースコードを他の人と共有するには?\n - Python2(3.5分)\n - メタデータ (PEP241 & PEP314 & PEP345 / distutils / setuptools)\n - Python Package Index (easy_install)\n - ソフトウェア Distribution (PEP262)\n - Python3 (5.5分)\n - より良いメタデータ (PEP426 & PEP459 & PEP566)\n - パッケージの依存関係管理 (PEP386 & PEP440 & PEP508)\n - PyPI がパッケージのホスティングを開始 (pip / twine / bento / flit)\n - ソフトウェア Distribution (PEP376 / PEP425 & 427 & 491)\n - Python2+3 & Other Problems(5.5分)\n - 複数 Python バージョンのサポート (tox / virtualenv / PEP405/pipenv)\n - 複数 OS での Python のサポート (PEP513 & PEP517 & PEP571 / Conda & Anaconda (2014))\n - Poetry: 1つのツールですべてを処理 (PEP517 & PEP518 & PEP582)\n3. 歴史から学ぶこと 【4分】\n - Python パッケージの進化\n4.コミュニティが Python パッケージを解決する前の挑戦 【12分】\n - Python パッケージに標準はない\n - ゼロからパッケージシステムを構築する\n - 弊社のパッケージシステムの概用\n - 弊社のパッケージシステムの教訓\n - なぜ古いOSを維持するのか?\n - コミュニティソリューションに移行する理由\n - コミュニティソリューションはより速く確実に拡張される\n5.コミュニティが Python パッケージを解決した後の挑戦 【5分】\n - 企業とコミュニティの理想的な関係\n - メタデータ標準の数 ∝ ツールの数\n - 2020 年に Python アプリケーションを作成したら...\n - PyPI へパッケージをアップロードしたかったら...\n6.まとめ 【3分】\n\n---\n\n7.Python パッケージの歴史に関する資料【0分】\n - 歴史\n - Dustin Ingram @ SciPy 2018: Inside the Cheeseshop: How Python Packaging Works\n - Kenneth Reitz @ PyCon 2018: Pipenv: The Future of Python Dependency Management\n - Clinton Roy @ Kiwi PyCon X (2019): The Packaging Lifecycle with Poetry\n - History of packaging written by Martijn Faassen\n- パッケージ\n - Dave Forgac @ PyOhio 2015: Python Packaging from Init to Deploy\n - Elana Hashman @ PyCon 2019: The Black Magic of Python Wheel\n - Official Document: Packaging binary extensions (2013)\n- デプロイ(仮想環境)\n - Carl Meyer @ PyCon 2011: Reverse-engineering Ian Bicking's brain: inside pip and virtualenv\n - Bernat Gabor @ EuroPython 2019: Status quo of virtual environments","name":"Kir Chou","profile":"A code monkey builds search services in Amazon jungle. This will be the 4th year of his presence in PyCon JP."},{"id":"213320","title":"招待講演:ある個人開発 OSS の歩み:5 歳になった Janome のこれまでと,これから","room":"#pyconjp_1","day":"1","no":"2","elevator_pitch":"2015年に生まれた Janome は,今年で開発5年目となりました。PyConJP 2015での発表から,これまでに行ってきた機能開発や改善について,技術的な解説を交えつつ振り返ります。また,今後追加していきたい機能や,個人開発のモチベーションをゆるく長く保ち続けるコツについてもお話できればと思います。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(45min)","audience_python_level":"","audience_expertise":"","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"打田智子氏による招待講演です。\n\nhttps://pyconjp.blogspot.com/2020/08/invited-talks1.html","name":"打田智子","profile":"2007年に筑波大学大学院システム情報工学研究科の博士前期課程を修了後,いくつかのIT系企業を経て,現在は株式会社 LegalForce の R&D チームで検索システムや言語処理の研究開発に従事。2015年に Python 製日本語形態素解析ライブラリ Janome を OSS として公開し,同年 PyConJP にも登壇。Janome の開発をほそぼそ続けながら,2019年から OSS 検索エンジンライブラリ Apache Lucene のコミッターも務める。興味のある分野は情報検索と機械学習,自然言語処理。海の見える部屋で猫と暮らすのが夢。"},{"id":"203810","title":"関数型Pythonアンチパターン","room":"#pyconjp_3","day":"1","no":"2","elevator_pitch":"今日関数型プログラミングは一般的技法になりつつあります。うまく取り入れれば、状態変化によるバグを追放し、簡潔なコードを書けるでしょう。\nただし、Pythonの特性を考慮せぬまま他の言語の関数型スタイルを真似ると、趣味的で読みづらいコードになりかねません。\nこのトークでは、Pythonで実用的なコードを書く上で、たとえ関数型であっても避けるべき書き方を紹介します。具体的には、以下のアンチパターン/パターンを扱います。\n\n* 長い式、複雑なlambdaを書く/式を名付ける\n* map・filterを多用する/内包を使う\n* 内包やreduceを濫用する/ループを書き、隠蔽する\n* クロージャを濫用する/適切にクラスを定義する","prerequisite_knowledge":"Pythonの基礎的な文法の理解。\n関数型プログラミングについての基礎知識や、関数型言語を扱った経験があると理解しやすいですが、必須ではありません。","audience_takeaway":"* 関数型プログラミングとは何かという抽象的な理解\n* 関数型プログラミングで可読性を壊さないようにするTips\n* Pythonicで実用的なコードにおいて、内包表記や高階関数を活用するTips","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"まずトークの目標として、いわゆる関数型言語に似たコードを書く方法ではなく、実用的な関数型プログラミングの方法を追求することを述べます。ただし何が良いコードか、Pythonicなコードかということに客観的基準はないことを強調しておきます。\n次に関数型プログラミングを次の2点によって定義し、その利点を説明します。\n\n* 高階関数の多用: 抽象的で簡潔なコードを書ける\n* 状態変化の追放: バグを減らし、テストしやすくする\n\nそして、Pythonで実用的関数型プログラミングを行う上で避けるべき三つのアンチパターンを紹介します。\n一つ目、「長い式、複雑なlambdaを書く」。他の言語における関数型の書き方をまねようとすると、高階関数をずらずら連ね、複雑なラムダ式を書くことになりがちです。ですがPythonは、式の改行がしづらく、ラムダ式も煩雑な言語です。PEP8による一行の文字数制限も厳しいです。むしろ、式は適切に区切り、ラムダ式はローカル関数にして、説明的な名前をつけるとPythonらしいでしょう。\n二つ目、「map/filterを多用する」。状態変化なしにコレクション処理を行おうとしたとき、一般的な言語ではmap/filter等を使いますが、Pythonではこの限りではありません。Pythonでは普通内包表記を多用します。イニシャライザにイテレータを取れば自作クラスでも内包表記に近い書き方ができますし、ローカル関数と組み合わせれば複雑な内包もシンプルに書けます。\n三つ目、「内包やreduceを濫用する」。Pythonで関数型のプログラムを書こうとして、複雑なreduceや内包表記を書くと読みづらくなりがちです。Guidoもreduceより、状態変化を含むforループを好んでいました。たとえ状態変化を含んではいても、コードを関数に切り出し、変化を隠蔽できれば、実質的には関数型プログラミングと同じであり、可読性も高まります。\n四つ目、「クロージャを濫用する」。関数型スタイルにおいては、しばしばクロージャを返す高階関数を使います。ただしPythonにおいては、クラス定義によってほぼ同じ機能を実現できます。オブジェクト指向に慣れた人には、むしろそちらの方が読みやすいでしょう。チームメンバーの好みと相談しつつ、状態変化があったり一定程度複雑な場合はクラス定義に書き換えるといいでしょう。\n\n構成とタイムラインは以下です。\n\n* 導入(5分)\n - 自己紹介\n - 問題設定\n* 関数型プログラミングの定義(5分)\n - 高階関数の多用\n - 状態変化の追放\n* アンチパターン1: 長い式、複雑なlambdaを書く(3分)\n - アンチパターンの例\n - 長い式がPythonっぽくない理由\n - 式を区切り名付ける\n* アンチパターン2: map/filterを多用する(5分)\n - アンチパターンの例\n - 内包表記を使う例\n - 独自クラスで内包表記っぽく書く\n - ローカル関数と組み合わせる\n - map/filterが便利なケース\n* アンチパターン3: 内包やreduceを濫用する(4分)\n - アンチパターンの例\n - 状態変化+forを関数に隠蔽する\n - 関数に切り出せば状態変化も問題ない\n* アンチパターン4: クロージャを濫用する(5分)\n - アンチパターンの例\n - オブジェクトに書き換える\n - \\_\\_call\\_\\_を使う\n - 使い分けを考える\n* まとめ(1分)\n* 質疑応答(2分)","name":"佑京 鈴木","profile":"株式会社ピコラボにて受託研究開発に従事するプログラマ。"},{"id":"203756","title":"Django + SQLAlchemy: シンプルWay","room":"#pyconjp_3","day":"1","no":"3","elevator_pitch":"DjangoのORMはとても便利です。しかし、SQLならすぐに書ける「サブクエリをINNER JOINする」「1つのテーブルを2回OUTER JOINする」といったクエリをDjango ORMで表現するのは苦手です。生のSQLを書いてDjangoで実行する方法もありますが、動的にSQLを組み替えるのが難しくなったりSQL Injectionのリスクもあるためお勧めできません。SQLAlchemyを使えば、この問題を解決できます。このトークでは、SQLAlchemyでSQLの組み立てる方法と、Django上で安全に実行する方法について紹介します。","prerequisite_knowledge":"Django ORM, SQL","audience_takeaway":"SQLAlchemyの使い方、Djangoとうまく組み合わせて使う方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"DjangoのORMはとても便利ですが、少し複雑なクエリを組み立てようとすると急に難しくなってしまうことがあります。例えば、サブクエリの結果をINNER JOINしたい場合や、1つのテーブルを2回OUTER JOINしたい場合などは、SQLならすぐに書けるのにDjango ORMで表現するのがとても難しかったり、不可能だったりします。このような場合にSQLを直接書いて `Model.objects.raw()` や `execute()` で実行する方法もありますが、この方法では動的にSQLを組み替えるのが難しくなったりSQL Injectionのリスクもあります。\nこのトークでは、SQLAlchemyをSQL表現言語として使う事でSQLの組み立てをプログラムで行い、Django上で安全に実行する方法を紹介します。\n\nアジェンダ\n\n* Django ORMで表現が難しいSQLの例\n* SQLを直接書いてrawやexecuteで実行する例と問題点\n* SQLAlchemyの紹介と簡単な実行例\n* 複雑なSQLをSQLAlchemyで組み立てる\n* SQLAlchemyとDjangoの連携\n","name":"shimizukawa","profile":"BeProud所属。一般社団法人PyCon JP 会計理事。2003年からPythonを使い始め、Python mini Hack-a-thonなどPython関連イベント運営のかたわら、国内外のカンファレンスへ登壇しPython技術情報を発信するなど、公私ともにPythonとその関連技術の普及活動を行っている。最近Drone飛ばし始めました。\n著書/訳書:『自走プログラマー(2020年 技術評論社刊)』『Pythonプロフェッショナルプログラミング第3版(2018 秀和システム刊)』『エキスパートPythonプログラミング 改訂2版(2018 アスキードワンゴ刊)』『独学プログラマー(2018 アスキードワンゴ刊)』『Sphinxをはじめよう第2版(2017 オライリー・ジャパン刊)』。\n"},{"id":"203309","title":"I can't believe it's still here!","room":"#pyconjp_4","day":"1","no":"3","elevator_pitch":"\"I can't believe this piece of code is still here!\"\n\nYou may shout it out when you see a function should have been deprecated in 3 years ago. The function may be created by your ex-colleagues but no one manages it after his / her leave. It may hit the system now, or just silently stay in the great number of source files. You may still ponder the next move - remove it now, or let it stay there until the application retirement. The talk will dives into this scenario and purpose a systematic approach, [auto-deprecator](https://github.com/auto-deprecator/auto-deprecator), to resolve the problem.","prerequisite_knowledge":"No prerequisite is required.","audience_takeaway":"- The target audience are those who cares about software quality, ranging from open source project contributors to enterprise application product owner. \n\n- The audience can have a high level view on removing a dead code without much effort.","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"English","lang_of_slide":"English only","description":"### Introduction (2 mins)\n\n### Case study (3 mins)\n\nThe introduction is a case study of Knight Capital Group incident in 2012. The incident was a major stock market disruption caused by the group and led to a huge trading loss in the firm. The root cause was an expired application called Power Peg accidentally running after the market open, and the application was running for 45 minutes until the team discovered and shut it down. The case is a good example to illustrate how a technical debt of unused codes can turn into a financial debt in a company.\n\n### Analysis (5 mins)\n\nMost developers are smart and passionate in programming, but why do they tend to keep a dead source code in the project? \n\nFirst the following myths will be deserted in the talk.\n\nMyth:\n\n- Lack of diligence and attitude\n\n- Lack of incentive\n\n- Lack of development time and resource\n\nThen the following reasons will be gone through\n\n- Uncertainty and indefinite business value to clean technical debt\n\n- Unclear usage from the clients and downstream processes on the existing application\n\n- Missing tools / systematic approach to remove unused codes\n\n### Approach (7 mins)\n\nThe talk will separate the timeline to retire an unused function into three stages: Warning, Expired and Cleaning.\n\n1. Warning\n\nThe stage requires to alert the developers and users the future deprecation of the code. If the piece of code is used in the closed system, the developers should head up the team on it. The easiest way is to put the concerned developer into the pull requests to review. A message, an email, or a release notes is also an appropriate approach.\n\nIf it is public for the users or the depending systems, it can first give a deprecation warning when it is called. The product owner should also plan ahead the expiry version and execute it in the future. Finally, a conversation with the potentially impacted clients is a direct approach.\n\nAlso, releasing the software with versions aligned with [SemVer 2.0](https://semver.org/) can give a big hints for the users of choosing a proper version to install.\n\n2. Expired\n\nIn the expired stage, the user should get an exception when the deprecated function is called. In the interactive usage, the user migrate the deprecated function to the suggested one in the exception message. For the downstream process, if its developers are not aware of the deprecation plan before the expired stage, they can still work around the exception with a specified handling, e.g. injecting environment variable.\n\n3. Cleaning\n\nAfter the expired stage, the deprecated function should be removed from the code base. It is easy to execute, but also easy to forget the execution in the stage. If it requires the manual effort to proceed this process, the team has to strive a good balance on the deprecation frequency. For example, in pandas, the deprecations will only be enforced in major releases, so that the team can focus on functionity enhancement and bug fix in the minor versions.\n\n### Auto deprecator (5 mins)\n\nThe library [auto-deprecator](https://github.com/auto-deprecator/auto-deprecator) will be introduced as a systematic approach to the approach mentioned before. The section will go though some code examples about how the library can tackle the problem pragmatically. I will also compare the library `auto-deprecator` with other open source libraries, e.g. [deprecated](https://github.com/tantale/deprecated) \n\n1. Warning\n\nDeveloper can put a Python decorator on the function or class method to warn the users the expiry version and migrated function name. To customize the handling method to align with the team practice, the default warning behavior, i.e. throwing `DeprecatedWarning`, can be modified.\n\nMeanwhile, the downstream processes can test the impact of the deprecated function by injecting the environment variable `DEPRECATED_VERSION`.\n\n2. Expired\n\nThe nightmare for the developers is once the function is deprecated, the clients or the developers of the downstream processes call in and ask back the function. They may not be aware of the deprecation schedule, or they do not have sufficient development resource to handle it in time. The environment variable `DEPRECATED_VERSION` is the last safeguard to this situation.\n\n3. Cleaning\n\nThe script `auto-deprecate` in the library can be added in the continuous integration / continuous delivery flow. Before releasing the package, the script removes all the expired source codes, and run all the unit test cases. It saves the development time to manually execute the code removal in a systematic approach.\n\n### Conclusion (3 mins)\n\n### Q&A (5 mins)","name":"Gavin Chan","profile":"Gavin Chan is a principal quantitative developer in AXA Investment Managers Chorus Ltd with 7+ years of experience in software development and finance industry."},{"id":"203588","title":"Python × AWS × Serverless 初学者が次の一歩を踏み出すためのテクニック","room":"#pyconjp_2","day":"1","no":"3","elevator_pitch":"サーバーレスが界隈でホットな話題になってゆくなか、初学者であった私は興味を持ちつつも中々チュートリアルの次に進めずにいました。入門編の次の一歩を踏み出すための情報源が少なく、何から始めたらよいのかがわからなかったのです。この状況は私が観測する限り現在も続いており、多くの初学者が同じ悩みを持っているのではないかと思います。\n\n私が業務経験やプライベートの開発において得た知見の一部を紹介することで、以前までの私と同様の悩みを抱えていたエンジニアの助けになればと思います。","prerequisite_knowledge":"[1] デコレータに関する知識\n自力で実装できる必要はないが、どのようなものであるかは知っていること。\nロギング周辺の話題で扱います。\n\n[2] AWS Lambda に関する知識\n資料等で概要を知っているのであれば、それでも構いません。\nHello world レベルでも、経験があると望ましいです。\nIAM等の周辺知識は不要です。\n\n[3] Serverless Framework もしくはそれに類するフレームワーク(※)の利用経験\nデプロイまでのチュートリアル程度の経験があると望ましいです。\nしかし、冒頭に簡単に説明はするので必須ではないと考えています。\n(※) ... AWS SAM, Terraform, Zappa など","audience_takeaway":"・サーバーレス開発におけるプロジェクト構成\n・ローカルとクラウドの両方で動作する、開発やすいコードのあり方\n・運用時に役に立つロガーの作り方","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Serverless Framework が普及したことで、サーバーレス開発を取り巻く環境は大きく進化しました。ごく簡単なボットアプリケーションやAPIサービスであれば、極めて短時間で自身のコードをデプロイすることができます。\n\nしかし、そのような入門体験を終えた後、次の足場を見失ってしまう初学者も多いのではないかと思います。ひとつの理由は、サーバーレス開発におけるイディオム、あるいはプラクティスと呼べる情報源が比較的少ないことにひとつの理由があるのではないかと、私は考えています。\n\nそこで、このセッションでは発表者が業務で得た知見を交えつつ、サーバーレス開発をより豊かにするノウハウをご紹介します。\n構成とタイムラインは以下の通りです。\n\n・導入 (2min)\n ・自己紹介\n ・本発表のモチベーション\n・AWSにおけるサーバーレスアプリケーション構築の基本 (3min)\n ・イベント駆動アーキテクチャへのシフト\n・Serverless Framework 基本のおさらい (3min)\n ・Hello world / プロジェクト作成からLambda Function のデプロイまで\n・プロジェクト構成の一例 (5min)\n・python-dotenv と serverless-dotenv-plugin の活用 (7min)\n ・ステージごとの変数管理\n ・ローカルとクラウドの両方で動作するコード\n・ロギングのプラクティス (7min)\n ・トレース可能なIDを付与する\n ・JSONロガーを用意する\n ・ハンドラ関数にロギング用デコレータをアタッチする\n・まとめ (1min)\n・質疑 (2min)","name":"hassaku","profile":"株式会社サーバーワークス所属。ここ1年ほど、MSP(マネージド・サービス・プロバイダ)事業に関わるプロダクトの保守と開発をやっています。\n\n技術同人誌「実践 AWS CDK - TypeScript でインフラもアプリも! (技術書典9 出典作品)」の共同著者です。\nhttps://booth.pm/ja/items/1881928"},{"id":"203453","title":"PythonでXBRL形式の財務情報を扱おう","room":"#pyconjp_5","day":"1","no":"3","elevator_pitch":"コロナ禍に見舞われた今年、上場企業の財務状況の変化に興味を持つ方が増えているのではないでしょうか。\nこのトークでは、Python製OSSであるArelleを利用し、XBRL形式の有価証券報告書から欲しい情報を取得する方法を共有します。","prerequisite_knowledge":"- 何らかのパッケージを使ってPythonでスクリプトを書いた経験。\n- XML形式のデータを解析したこと、財務諸表を読んだことがあるとトークがより理解しやすいですが、必須ではありません。","audience_takeaway":"- Python製OSS Arelleの使い方\n- XBRLの基礎知識\n- 金融庁EDINETから有価証券報告書などのデータを取得する方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"XBRLとは、各種事業報告用の情報を作成・流通・利用できるように標準化されたXMLベースの言語です。\n日本では上場企業などに対し、有価証券報告書などの書類をXBRL形式で提出することを(原則)義務付けており、そのデータは金融庁のEDINETという電子開示システムで公開されています。\n\n1社の過去数年の実績推移や2社比較などを行う場合は、無償公開されている分析用サービスを利用すると手間が掛からず便利でしょう。 \nしかし、ある業種の企業全体をまとめて扱ったり公開サービスで提供されていない分析を行ったりしたいケースもあると思います。そのような時には自分で必要なデータを作成する必要があります。\n\nそのデータの作成方法と、必要な前提知識をこのトークで紹介します。 \n \nXBRLの解析には Arelle というPython製のOSSを使用します。Arelle は XBRL International というXBRLを開発・保守する組織により、XBRL仕様に準拠したレポート使用ソフトウェアとして認定されています。 \nArelleを活用することで仕様の複雑なXBRLの解析が楽になります。 \nしかし、その使い方が分かる情報は現状では少ないです。 \nこのトークでは、上記のデータ作成例を通して、Arelleの主要な機能の使い方も紹介していきます。\n \n処理対象として、EDINETで公開されている上場企業の有価証券報告書(または四半期報告書)を使用します。 \n財務分析はトーク対象外です。 \n\n構成とタイムラインは以下のとおりです。 \n※多少変更する可能性があります\n\n+ 導入 (2min)\n - 自己紹介\n - きっかけ\n\n+ XBRL (4min)\n - XBRLとは\n - 基本構造\n  - タクソノミ\n  - インスタンス\n\n+ EDINET (4min)\n - EDINETとは\n - EDINETタクソノミ\n - 提出者別タクソノミ\n - 必須項目\n\n+ Python製OSS: Arelle (3min)\n - Arelleとは\n - ArelleでXBRLを解析するメリット\n\n+ 財務三表の概要 (3min)\n\n+ 複数企業の財務データをまとめて扱う際の注意点 (2min)\n\n+ PythonでXBRL形式の有価証券報告書を扱おう (10min)\n - EDINETからデータ取得(EDINET API)\n - XBRLデータから欲しい情報を取得(Arelle)\n  - 会社情報、提出書類情報\n  - 財務情報\n - 出力\n\n+ まとめ (1min)\n+ 質疑応答 (1min)","name":"Miyasaka Eriko","profile":"経理歴3年、現在はデータ分析系の業務と趣味でPythonを使っています。"},{"id":"213316","title":"招待講演:続・小さく始めて大きく育てるMLOps2020","room":"#pyconjp_1","day":"1","no":"3","elevator_pitch":"乱立するJupyter Notebook、身元不明なデータ、再現しない学習結果、引き継ぎできない実験コード…\nそんな課題を解決するべく、今日から始められるMLOpsを紹介します。\n趣味の機械学習から研究室での実験管理、プロダクトでの運用まで、広く参考になれば幸いです。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(30min)","audience_python_level":"","audience_expertise":"","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"岩崎祐貴氏による招待講演です。\n\nhttps://pyconjp.blogspot.com/2020/08/pycon-jp-2020-3-announcement-of-invited.html","name":"岩崎祐貴","profile":"株式会社サイバーエージェント AI Lab Research Engineer。\n2014年にサーバーサイドエンジニアとして入社後、インターネット広告事業でScala、JavaScript、Pythonを使った配信基盤や広告レンダリングエンジン、効果予測システムを作成。\nフロント・インフラ・データ分析業務を経て、2017年から現職。\nクリエイティブリサーチグループにて広告のテキストや画像、動画等の高次元特徴から配信影響を紐解く研究に従事。\nゲームでは魔法使いのような紙耐久アタッカーが好き。"},{"id":"215383","title":"スペシャルブースツアー","room":"#pyconjp","day":"1","no":"","elevator_pitch":"スペシャルブースを紹介するコーナーです。\nconnpassチケットをお持ちの方は、connpassページの「参加者への情報」のURL一覧からアクセスしてください。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"スペシャルブースを紹介するコーナーです。\nconnpassチケットをお持ちの方は、connpassページの「参加者への情報」のURL一覧からアクセスしてください。\n","name":"","profile":""},{"id":"203925","title":"Exploring Biasness in Indian Media","room":"#pyconjp_5","day":"1","no":"4","elevator_pitch":"Recognition of bias in Indian Media poses a serious challenge due to the existence of various regional languages, political parties and huge population with different mindsets. I addressed this by finding out the kind of stories selected by media and find out the ideology that it promotes.","prerequisite_knowledge":"Target audience having introduction about ML methods would be great but it is not necessary.","audience_takeaway":"After watching this talk, audience will get to know about Topic Modelling and how to solve a unsupervised learning problem statement. This talk mainly covers the approach we took from the ground up which will be beneficial for beginners.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":" Introduction\nWe will discuss what is Biasness and why is it important. We will also discuss with some examples from India Media context to get a brief about data.\n \n Basics\nWe will mainly discuss about Topic Modelling and go brief on Latent Dirichlet Allocation Algorithm. We will implement LDA using gensim.models.ldamodel.\n\n Methodology\nWe will go over how we approached Biasness for Indian Media Context. All our experiments in this project were carried out using Python and it's different libraries. \n\nIn the end we will talk about the results and takeaway from the project.\n\nOutline:\n1. Intro to Bias and Types of Bias [5 Min]\n2. Brief about Indian media and Dataset Introduction[2 Min]\n3. Into to Topic Modelling [3 Min]\n4. Approach Outline[10 Min]\n * Why we used latent dirichlet allocation and Demo\n * Our Methodology\n5. Takeaways and What does the results signify?[5 Min]\n6. Q&A [5 Min]","name":"prashant0598","profile":"Prashant is a distinguished full-stack data scientist, skilled in application of machine learning techniques for solving data based problems. Currently, a final year undergraduate Computer Science student and also a Data Science Intern at Guavus . He is an experienced open source developer and have also mentored for SCoRE Lab. He began his career as Data Science Intern at PwC where he worked with Logistics client to automate their internal process and drive sales .\n\nPrashant is Co-Organiser of Local Python Community group called PyJaipur, which is largest technical group in that state. He is an active community guy and loves to share and learn as much he can by organizing Meetup and networking with individuals."},{"id":"203875","title":"GAE/Python2 to Python3 Migration Journey","room":"#pyconjp_2","day":"1","no":"4","elevator_pitch":"本セッションでは、Google App Engine (GAE) の Python 2.7 で構築されたアプリケーションを、 Python 3.7 基盤に移行していく際の戦略・戦術についてお話します。GAE/Python2とPython3は、基盤の設計思想が大きく異なるため、単なる言語バージョン更新ではなく、アプリケーションの根幹となるライブラリ・アーキテクチャの刷新が必要なプロジェクトです。APIエンドポイントが300個ほどあるアプリケーションを、安定稼働させながら順次移行していくために編み出した戦術・戦略についてお話します。","prerequisite_knowledge":"Webアプリケーション開発を行った経験がある","audience_takeaway":"大規模なアプリケーション・アーキテクチャの変更を、安全・確実に進めるためのナレッジ","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"本セッションでは、Google App Engine の第一世代ランタイムである Python 2.7 で構築されたアプリケーションを、第二世代ランタイムである Python 3.7 に移行していく際の戦略・戦術についてお話します。\n\nGoogle App Engine (GAE) は、 Google が提供するWebアプリケーション実行基盤です。 GAEそのものは、Google Cloud ブランドが登場する以前の 2008年から提供されている歴史あるサービスです。\nGAEの第一世代(Python2.7)と第二世代(Python3.7)の間では、アプリケーション構築のアプローチが大きく異なります。第一世代ランタイムでは、アプリケーション開発に必要となる多くの機能(データベース、非同期タスク、スケジューラ、全文検索、キャッシュ等)が AppEngine SDK に統合されており、対応するライブラリを import するだけで利用することができました。第二世代ランタイムでは、各機能に対応する後継のクラウドサービスを1つずつ自分で選択して組み込む形へと変化しました。\n\nこのように、GAE/Python2 から GAE/Python3 への移行は、単なる言語バージョンの更新プロジェクトではなく、アプリケーションの根幹となるライブラリ・アーキテクチャの刷新を必要とするプロジェクトです。私達の開発するアプリケーションは、300個近いAPIエンドポイントを持っており、これらを一度に全て切り替えることは困難です。安定稼働させながら、順次移行していくために編み出した以下のような戦術・戦略についてお話する予定です。\n\n- API単位での部分移行戦略\n- アプリケーション基盤ライブラリのギャップを埋めるための独自ライブラリ整備\n- 型ヒント等を活用した堅いプログラミング\n- 実データでの互換性チェック環境の構築\n- など\n\n構成・タイムライン\n - はじめに・自己紹介 - 5分\n - 背景 - 5分\n - GAE移行の戦略 - 7分\n - GAE移行の戦術 - 8分\n - まとめ - 5分\n","name":"Akira Yumiyama","profile":"株式会社レヴィ CTO として「変化に強いシステム設計」を広めるためサービス開発を行いつつ、技術顧問としても活動している"},{"id":"203941","title":"Pythonで始める負荷試験","room":"#pyconjp_4","day":"1","no":"4","elevator_pitch":"Webシステム運用時に避けては通れない工程のひとつに負荷試験があります\n負荷試験に用いられるツールには様々なツールが存在しますが、\nどのツールを用いても以下のようなことに直面するのではないでしょうか?\n\n複雑なシナリオを書かざるを得ない状況\nアプリケーションの更新に合わせてシナリオも更新しなくてはいけない状況\nチームメンバーへシナリオを共有しなくてはいけない状況\n様々な境界値や条件を指定してテストをしなくてはいけない状況\nテスト結果を共有しなくてはいけない状況\n\nこれらに対してPythonを用いてチーム開発の現場で取り組んだ内容を、\n実例を元にデモを交えてご紹介させて頂きます","prerequisite_knowledge":"Pythonを用いてwebアプリケーションを作成した経験\n負荷試験を行った経験があるとより理解が深まると思いますがMUSTではありません","audience_takeaway":"・Pythonを用いて負荷試験を行う方法\n・Locustの操作方法\n・負荷試験手法ならびに結果を俗人化させない方法","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"JMeterやGatlingなど負荷試験では様々なツールが用いられています\nしかし、Locustを用いた負荷試験の実例は他ツールに比べて数が少ないのが現状です\nまた、Webシステムに対して負荷試験を行う際に直面する「複雑なシナリオ作成」・「境界値の変更」だけでなく\nチームメンバーへの「シナリオの共有」・「結果の共有」をどのように実現したか\n実際の事例を元に本発表でお伝えさせて頂ければと思います\n構成とタイムラインは以下のとおりです\n- 自己紹介(1分)\n- Locustの紹介(5分)\n - インストール方法\n - シナリオの書き方・起動の仕方\n- 活用方法(10分)\n - なぜLocustを使おうとしたか\n - 他のツールとの比較検討\n - 負荷試験実施\n - 境界値の変え方\n - テスト条件変更方法\n - シナリオの更新・共有\n - テスト結果の共有\n - どんなメリット・デメリットがあったか\n- デモンストレーション(10分)\n- まとめ(3分)\n- 質疑応答(1分)","name":"Yusuke Nishio","profile":"株式会社ブレインパッド,Webアプリケーションエンジニア\nリスティング広告運用自動化ツールの開発に従事"},{"id":"201618","title":"What happens behind execution of an `import` statement?","room":"#pyconjp_1","day":"1","no":"4","elevator_pitch":"Have you ever spent 10-15 minutes debugging ImportErrors, ModuleNotFoundErrors, without reaching anywhere? Would you want to learn about what happens from the moment Python parses 'import x', to the point when you execute a function of 'x' module? Let's dig into the internals of the Python's import system.","prerequisite_knowledge":"Syntactic knowledge of Python\nShould have come across import/$PYTHONPATH related errors\nIf you don't know either and still like the talk idea, please follow [this](https://gist.github.com/plant99/9fee5dbe73f25d4da9c7fb956a36b889) gist to 'intentionally' come across the errors :)","audience_takeaway":"An understanding of the import system's mechanics, which helps to quickly debug and fix path/import related errors.\nKnowledge of import hooks, to build custom import related plugins.","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Python core","lang_of_talk":"English","lang_of_slide":"English only","description":"TL;DR\n\nThis talk follows this template to explain what goes on in the background when you execute from spam import ham, or any other import statement. Additionally, it discusses import hooks and how use them.\n\n\nIntroduction\n\nEvery Python script involves import statements. And if you develop software with Python, you might already have come across import and path related errors like ImportError, ModuleNotFoundError, etc.\nIt's important to know the import mechanics, both for general knowledge, and to develop custom plugins to tweak the import system. In this talk, we'd discuss in detail about how the import system works, its components and what tasks they perform respectively.\n\n\nWho should attend this talk?\n\nThis talk is most suitable for beginner to intermediate level Pythonistas.\n\n\nHow does the talk proceed?\n\n- The talk starts with packages in Python, and how to organize Python files in order to make them distributable, and importable.\nIt proceeds to discuss about $PATH and $PYTHONPATH, and how they are used to enable system-wide imports, and how capable are Python's path based import handlers, if they let a programmer import from remote URIs, etc.\n- Different types of packages such as regular packages, namespace packages, frozen modules, etc. are discussed.\n- After that, some key components are introduced i.e sys.modules and how modules are refreshed and regulated in runtime, what finders and loaders are, and what 'import protocol' is, sys.meta_path, sys.path_hooks\n- The talk then goes in detail about finders, the default finders in Python, spec object, and its functioning.\n- After finders, loaders are discussed with sample code, explaining the steps involved from processing a spec, and creating, executing, and loading a module to sys.modules.\n- After finders and loaders, 'import hooks' are discussed i.e how Python allows injection of custom components to handle a pre-defined import statement.\n- This follows a demonstration of import hooks, implementation of a meta_path finder Class which protects importing of modules from an http server with a token exchange. (So the source code is protected, and it can be logged who requested the source code by a signature to act against misuse.)\n- The demonstration is followed by listing some important use cases of import hooks, and how folks have used it in the past.\n\n\nWhat can someone get out of this talk?\n\nAn understanding of the import system's mechanics, which helps to quickly debug and fix path/import related errors.\nKnowledge of import hooks, to build custom import related plugins.\n\n\nOutline\n\nTime Duration - Topic\n\n0 - 4 Introduction to packages and how to organize packages\n\n4 - 7 Types of packages in python, and the default ones the import system supports.\n\n7 - 12 Components of import system - sys.modules - finders and loaders - chronology of import related tasks\n\n12 - 15 Finders, examples of finders, and how they function, find_spec function\n\n15 - 17 sys.meta_path, sys.path_hooks in detail\n\n17 - 19 Introduction to PEP 302, and import hooks\n\n19 - 22 explain loaders with template code\n\n23 - 25 code walkthrough and demonstration of an implementation of import hooks\n\n25 - 26 briefly cover 'importing of submodules' topic with an example\n\n26 - 28 present use-cases of import hooks, and usage in industry, conclude.\n\n28 - 30 Q&A","name":"Shivashis","profile":"Shivashis Padhi is a senior, majoring Computer Science and Engineering at National Institute of Technology, Tiruchirappalli, India.\n\nHe loves earth and atmospheric sciences and pursues them as hobby. With a desire to contribute more directly towards research in these areas, he has developed a keen interest in Geographic Information Systems over time.\n\nWith ~3 years of experience as a student software developer associated with a multitude of student organization(Python Software Foundation - GSoC'20, Delta Force), small and large scale startups(Grofers, Flytbase Labs, Gmetri), he lives by a simple policy, 'learn and build to make the world a better place'."},{"id":"202389","title":"量子コンピュータと現行コンピュータ、解法や解の違いは?~ナップサック問題を考える~","room":"#pyconjp_3","day":"1","no":"4","elevator_pitch":"Pythonを使用し、注目を集める最先端の量子コンピューティング技術を取り扱います。\n量子コンピューティングの中でも特に量子アニーリングを使用し、組合せ最適化問題に取り組みます。組合せ最適化問題の一つであるナップサック問題を例題に取り上げ、量子コンピューティングフレームワークのBlueqatで解を求めます。\nまたこれに並行して、現行のコンピュータを使用した組み合わせ最適化問題の一般的な計算ツールであるGoogle OR-ToolsソルバーをPythonでプログラミングし、解を求めます。\n組合せ最適化問題について知るとともに、その解法として量子アニーリングや汎用ソルバー、それぞれのプログラミング手法とその実行結果を学び、検証します。","prerequisite_knowledge":"必須ではありませんが、量子アニーリングやナップサック問題が何かを知っていると理解しやすくなります。","audience_takeaway":"量子アニーリングと組合せ最適化の関係、ナップサック問題の解法、BlueqatやOR-Toolsの使い方など","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Pythonを使用して量子コンピューティングを取り扱います。今、最も注目を集める最先端技術の一つとして、量子コンピューターがあげられます。今回は、特にその機能の一つである量子アニーリングを取り上げ、組合せ最適化問題を解きます。\n\n量子アニーリングは組合せ最適化問題に特化した量子コンピューティング技術です。量子アニーリングを実行するにあたり、MDR社(東京)からオープンソースで提供されているBlueqat(ブルーキャット)を使用します。BlueqatはPythonで動作する量子コンピューティング専用のフレームワークです。\n\n組合せ最適化問題とは、ある課題を解決する際に、その構成要素に対して、選択する/選択しないや、数量を超えない、最大値/最小値を求める、等の条件のもとで最良の解を求める問題で、工場の生産計画や勤務シフトスケジュール、物流配送など幅広い分野でビジネス課題として取り組まれています。この組合せ最適化問題の中でも特に基本的な問題であるナップサック問題を例題に取り上げ、最適解を求めます。\n\n量子コンピューティングの一方で、現行のコンピュータ上でアルゴリズムを組み、解を計算し最適解を求める取り組みも盛んに行われています。このような最適化問題を解くための専用ソフトウェアとして、ソルバーと呼ばれるツールが多数開発されています。今回は、これらの中からGoogle社によりフリーで提供されているGoogle OR-Toolsを使用して、同じナップサック問題を解きます。Google OR-ToolsはPythonでプログラミングするソルバーです。\n\n最後に、量子アニーリングにより算出した解と、ソルバーにより算出した解を比較し、結果を検証します。\n\n今回の取り組みを通して、組合せ最適化問題について知るとともに、その解法として量子アニーリングや汎用ソルバーがあること、またそれぞれのPythonによるプログラミングと解の算出の仕方、さらにそれぞれの解の結果について学ぶことができればと思います。\n\n<主な流れ>\n\n1.今回の取り組みの概要\n2.組合せ最適化問題とナップサック問題について\n3.量子コンピュータと量子アニーリングについて\n4.Blueqatによる量子アニーリング解法\n5.現行コンピュータと汎用ソルバーについて\n6.Google OR-Toolsによる解法\n7.両者の解の比較検証とまとめ","name":"哲朗 田端","profile":"システムエンジニアとして金融や通信など様々な分野のシステム開発に携わっています。"},{"id":"203956","title":"Combining ayncio and threads in the same application","room":"#pyconjp_3","day":"1","no":"5","elevator_pitch":"In recent years, the asyncio environment in Python has matured a lot. Something which is often considered an issue, though, is combining code which does not support asynchronous execution with otherwise async code. The talk will show that this is not really a major problem anymore and can indeed be used to bring blocking code or threaded code into the async world as well.","prerequisite_knowledge":"Some knowledge about asyncio and threading would be useful, but is not essential.","audience_takeaway":"The talk will show that combining async and threaded code is not really a major problem anymore, allowing you to use both in your applications.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"English","lang_of_slide":"English only","description":"Subtitle: Writing a Discord bot which streams YouTube videos to channels\n\nIn recent years, the asyncio environment in Python has matured a lot. Something which is often considered an issue, though, is combining code which does not support asynchronous execution with otherwise async code. The talk will show that this is not really a major problem anymore and can indeed be used to bring blocking code or threaded code into the async world as well.\n\nThe practical example is a Discord bot implementation, which uses asyncio for handling requests, with a threaded application using the VLC to create snapshots of YouTube live streams at regular intervals. The snapshots are then sent to a Discord channel to give a preview of the various talk sessions held online. We will use this bot at EuroPython 2020 on our Discord server.","name":"Marc-Andre Lemburg","profile":"Marc-Andre is the CEO and founder of eGenix.com, a Python-focused project and consulting company based in Germany. He has a degree in mathematics from the University of Düsseldorf.\n\nHis work with and for Python started in 1994. In 1997, he became a Python Core Developer. He designed and implemented the Unicode support in Python and continued to maintain the Python Unicode implementation for more than a decade, after it first appeared in Python 2.0. He also authored the well-known mx Extensions, e.g. mxTextTools, mxDateTime and mxODBC, which are now distributed and maintained through eGenix.com.\n\nMarc-Andre currently is Chair of the EuroPython Society (EPS) which organizes the EuroPython conference series and support the Python community in Europe.\n\nHe is also a founding member and Fellow of the Python Software Foundation (PSF) and has served on the PSF Board several times.\n\nToday, Marc-Andre spends most of his time consulting and managing large-scale customer projects heavily relying on Python and databases. More details are available on http://www.malemburg.com/."},{"id":"203444","title":"PySnooper - Never use print for debugging again","room":"#pyconjp_1","day":"1","no":"5","elevator_pitch":"I had an idea for a debugging solution for Python that doesn't require complicated configuration like PyCharm. I released PySnooper as a cute little open-source project that does that, and to my surprise, it became a huge hit overnight, hitting the top of Hacker News, r/python and GitHub trending. In this talk I'll go into:\n\n * How PySnooper can help you debug your code.\n * How you can write your own debugging / code intelligence tools.\n * How to make your open-source project go viral.\n * How to use PuDB, another debugging solution, to find bugs in your code.\n * A PEP idea for making debuggers easier to debug.","prerequisite_knowledge":"Basic Python development","audience_takeaway":" * Learn how to use PySnooper to debug your code\n * Learn how to use PuDB to debug your code\n * Learn how to communicate your open-source project to others","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"English","lang_of_slide":"English only","description":"A new debugging solution for Python that became a huge hit overnight","name":"Ram Rachum","profile":"Ram Rachum is a software developer specializing in Python. When he's not writing his biography in the third person, he's doing consulting work for clients big and small, giving Python training to teams that would like to deepen their Python skills, and organizing the bi-monthly PyWeb-IL conference.\n\nPython training: http://pythonworkshops.co/"},{"id":"203877","title":"Pythonソースコードの構造可視化とそれがもたらすもの","room":"#pyconjp_2","day":"1","no":"5","elevator_pitch":"1万行を超えるようなアプリケーションの開発に途中からジョインしたとき、最初に何をしますか?\nコードの全体像が分からなくて困ったことはないでしょうか。\nこのトークではそういった場面で役に立つ、Pythonコードの依存関係を明らかにするツールを紹介します。\nこのツールを作るきっかけや、このツールによって何が明らかにできるかを紹介し、それがソフトウェア開発の中でどのように役立てられるか、についてお話ししたいと思います。","prerequisite_knowledge":"Pythonを使ってアプリケーション開発を行った経験がある","audience_takeaway":"Pythonアプリケーションコードの全体像を捉える方法とその意味や活かし方。","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"このセッションではPythonコードの構造(パッケージ間の依存関係など)を可視化するツール(jig-py)についてお話しします。\n新しくプロジェクトに参加し全体像を素早く把握したい場合や、コードのアーキテクチャを見直す場合に、全体の関係性を俯瞰して見ることが役に立ちます。\n\n## 背景\n\nこのツールを作るきっかけとして、500以上のPythonファイルで構成されるアプリケーションのPython2/3移行プロジェクトに参加しました。アプリケーション基盤の都合でPython2アプリケーションの一部を切り出して、新たなPython 3アプリケーションを作成し、置き換えていく必要がありました。\n\n最初に移行するべき対象を見つけ出すため、簡易的なスクリプトで各パッケージ間の依存関係を明らかにしました。それにより最初に手をつけるべき対象を見いだすことができ、無事プロジェクトを進めることができました。\n\nさらに、実際に可視化して見ると循環参照のような望ましくない構造や、依存が多すぎるモジュールなど改善に生かす手がかりが得られることにも気づきました。\n\nこれがこのツールとして作っていこうと思ったきっかけです。\n\n## jig-py について\n\nJavaにはjigという素晴らしい可視化ツールがあり、そちらを参考にjig-pyというツールを作成しています。jig-py では以下の情報が分かりやすく把握できることを目指しています。\n\n\n・パッケージ同士の依存関係\n  ・パッケージ階層レベルに応じたグルーピング\n・クラス同士の依存関係\n\n## 可視化がなぜ重要か\n\nソフトウェア開発は単純な作業ではなく複雑なプロジェクトです。そして、プロジェクトをゴールに向かわせるためには、次に何をすべきかを示す戦略が重要です。さらに、有効な戦略を立てるためには現状を正しく把握することが欠かせません。\n\nこれが、なぜ可視化することが重要か、の答えになります。\n\nパッケージやクラスといった大きい単位で構造を明らかにすることで、コード1行1行の詳細度では追うことのできない大きなレベルでの戦略を立てることができるようになります。\n\n例えば、\n\n・健全/不健全な構造の把握\n・変更リスクの高いデンジャーゾーンの把握\n\nこれにより、テスト戦略や、次期機能開発の生産性向上のための改善領域選び、新人の適切なアサイン領域選びなど、建設的な意思決定が行えるようになります。\n\nそして、それを複数の人、チームでの共通認識として認識できるようになることも重要です。\n定点観測し、活動のフィードバックとして利用することで、組織的にも前進させることができるようになります。\n\n\n構成とタイムラインは以下の通りです。\n\n・導入(1min)\n ・自己紹介\n・背景(3min)\n ・jig-pyを作るに至ったきっかけ\n ・名前の由来\n・jig-pyの可視化によってわかること(12min)\n・可視化がなぜ重要か(10min)\n ・開発戦略\n ・エンジニア組織の生産性、健全な文化づくり\n・まとめ(2min)\n ・発表内容のまとめ、今後の展望など\n・質疑応答(2min)","name":"yosu","profile":"LAPRAS所属。クローラー開発をメインにGAE/Python開発のお手伝いなども。"},{"id":"203963","title":"Pythonではじめるソフトウェア無線","room":"#pyconjp_4","day":"1","no":"5","elevator_pitch":"ソフトウェア無線を知っていますか?\nソフトウェア無線は無線通信に関わる処理の多くを、回路ではなくソフトウェアによる信号処理で実現したものです。\n\n現在、安価なSDR受信機、OSSなSDR処理系やツールの登場によってソフトウェアエンジニアが電波の世界を覗き、さらには弄ることができる機会が飛躍的に増えています。そして、その中ではPythonが重要な役割を果たしています。\n\n本セッションではUniversal Radio Hacker, GNURadio, Pothoswareの3つを紹介しつつ、それらの中でPythonがどう使われているか、そして活用方法として独自の処理やアプリケーション開発をするためのステップを解説します。\n\n見えない電波が見えるの楽しいよ!","prerequisite_knowledge":"特にありません","audience_takeaway":"・ソフトウェア無線についての概略知識\n・電波から無線通信プロトコルまでの処理・解析方法の概略知識\n・Pythonを使ったソフトウェア無線アプリケーションの開発方法\n","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Anything else basically which doesn’t fall into the types of topics above","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"ソフトウェア無線(SDR - Software Defined Radio)の概要と応用例を紹介しつつ、各種実装の中で使われているPythonの用法と活用方法を解説します。","name":"Taisuke Yamada","profile":"普段はJupyter NotebookでPythonをいじっている都内勤務のエンジニア。Pythonだとpython-ucdevをPyPIで公開中。気になる言語はJuliaとRust。この発表は完全に趣味です!"},{"id":"203110","title":"スポーツデータを用いた特徴量エンジニアリングと野球選手の成績予測 - PythonとRを行ったり来たり","room":"#pyconjp_5","day":"1","no":"5","elevator_pitch":"2001年以降のメジャーリーグの成績データを駆使して野球選手の成績予測をする, をテーマに\n\n・スポーツデータを駆使した特徴量エンジニアリング\n・統計的なアプローチを使った野球選手の成績予測\n・PythonとRの使い分け・違い\n\nをデータサイエンスという文脈で紹介します.","prerequisite_knowledge":"【MUST(最低限知っていて欲しい前提知識)】\n・野球のルール. プロ野球や高校野球などをたまに楽しむぐらいのリテラシー(アウト・三振・四球・ヒットなど最低限のルールを知っている).\n・SQLやRを使ったデータ分析. 特に特徴量エンジニアリングや前処理の経験.\n\n【あると良い ※任意】\n・スポーツデータを扱った分析の経験\n・マネーボールを読んだことがある","audience_takeaway":"・分析・機械学習でやりたいタスクに合わせた特徴量エンジニアリングの勘どころ.\n・特徴量エンジニアリングを行う際のPython/R/SQLの使い分け.\n・PandasやplotlyなどのPyDataライブラリとGCP(BigQueryなど)を組み合わせたデータサイエンス環境のベストプラクティス.\n・スポーツデータを用いたデータサイエンスの基本. ルール・記録のドメイン知識を特徴量までに持ってくるあたり.\n","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"データサイエンスをする人々にとって, 生データを解析し分析可能な数値化を行う「特徴量エンジニアリング」「前処理」は必要不可欠かつ大切なタスクです.\n\nその中でもスポーツデータサイエンスは特徴量エンジニアリング・前処理のやりがいがあるテーマであり, 中には「野球データサイエンスの応用で別の分野の分析に役立てる」というシグナルアンドノイズのような事例もあります.\n\nこの発表では, 「特徴量エンジニアリングの勘どころ」「野球選手の成績予測モデル作成と検証」を通じて, スポーツデータサイエンスのみならず, データサイエンス全般に役立つノウハウや知見を「野球の時間」を通じて紹介いたします.\n\nPython周りだとPandasやplotly, データサイエンス関連だとBigQueryの知見が得られるかと思います.\n\n【Outline】\n\n- 自己紹介・野球の統計分析の基本(5min)\n- 特徴量エンジニアリング #とは(10min)\n - \t生データの数値化\n - 泥臭い泥臭いアンド泥臭いタスクをシュッとこなす\n - Python/R/SQLを適切に使い分ける\n- 野球選手の成績予測アルゴリズムとその実践(15min)\n - 第一人者のネイト・シルバーがやったモデル\n - shinyorke(わたし)がやろうとしているアプローチ\n - PythonとBigQueryでガツッと特徴量抽出\n - 分析そしてその結果は...!?\n- まとめ\n\n【補足】\n2001〜2019年のメジャーリーグの公開データセットを元に予測を行います(日本のプロ野球ではありません).","name":"shinyorke","profile":"株式会社JX通信社のシニアエンジニアで主にデータ基盤・SRE周りを担当.\n\n個人としては, スタートアップの技術顧問としてデータ基盤に関するコンサルティングおよび, 「野生の野球データサイエンティスト」として野球データの分析や考察をブログ・登壇で発表しています.\n\nPythonは2011年からデータサイエンス・Webアプリケーション開発などなどで活用.\n\nなお, 一部のPython使いから「野球の人」と呼ばれている模様."},{"id":"202785","title":"Python で作る演劇稽古用 Web アプリ","room":"#pyconjp_2","day":"1","no":"6","elevator_pitch":"自分だけのアイデアを持っていても、何から手を付けてどう形にしたら良いか分からないといった経験を、多くの人が持って\nいるのではないでしょうか。\nそんな時、まず Python で出来ないかを考えてみるのも良いと思います。\nこのトークでは、スマホや Excel 向けに作ったアプリを Python で Web アプリとして作り直すことにした、私の心境を\nお話しします。\nアイデアを形にする時、Python という選択肢があることを知っていただければと思います。\nまた、機械学習で分類器をつくるのに、決定木のような気軽に試せるモデルがあることもご紹介します。","prerequisite_knowledge":"- Web アプリの基本的な概念。\n- 機械学習の基本的な概念。","audience_takeaway":"- アイデアを形にする時に、まずは Python で作ってみるという選択肢。\n- Web Framework (Django) で、一人でどれくらいの物が作れるのかの目安。\n- テキスト分類器のモデルに Deep Learning ではなく決定木を選んだ事例とその理由。","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"個人的に演劇稽古用 Web アプリの制作に取り組んでいます。\n最初はスマホアプリとスプレッドシートで作っていたのですが、すべてを Python で作り直すことにしたので、その経緯と、\n現在取り組んでいる課題をご紹介します。\n根本的な発想は、台本をデータとしてフォーマット化し、稽古や制作のプロセスに利用するという事です。\n最初にフォーマットを決めて、そのフォーマットを読み込んで表示するスマホ用の台本ビューアアプリを作りました。\nその後、シーンごとの出番を抽出して稽古プランを立てるための Excel マクロを作りました。\nしかし結局どちらもやめて、Python (+ Django) で、Web アプリとして作り直すことにしました。\n前半ではその経緯についてお話しします。\n後半では現在取り組んでいる、「適当に書いた台本をこのシステムのフォーマットに変換するツール」についてお話しします。\nテキストを入力して「セリフ」や「ト書き」「柱」といった、「行の種類」を予測するモデルを作っています。\n作者によって「どういうつもりで文書を整形しているか」が違うので、ファイルごとの特徴量と行ごとの特徴量を設計して、\n決定木による分類をしています。\n- 導入(2min)\n - 自己紹介\n - 私の個人プロジェクトについて\n- プロジェクトのこれまでの経緯 (5min)\n - 昔の話#1: スマホアプリで台本ビューアを作った。\n - 昔の話#2: スプレッドシートで稽古プランツールを作った。\n - その後、Python のみで作ることにして設計し直した。\n - Web Framework (Django) を使って、すべて Web アプリにする事にした。\n- 現在取り組んでいる課題(5min)\n - 台本をデータとして扱うには、決まったフォーマットになっている必要がある。\n - 自動でフォーマットするフォーマッタを作ろうとしている。\n - 行の種類 (セリフ, ト書き等) を予測するのに、Deep Learning は使わず具体的な特徴量を設計する事にした。\n- 今後の課題 (1min)\n - Web アプリでありながらオフラインにも対応したビューアを作りたい。\n- まとめ (1min)\n- 質疑応答 (1min)","name":"satamame","profile":"- iOS アプリの開発 (実務 + 趣味)\n- Android アプリの開発 (趣味)\n- Django による Web アプリの開発 (実務 + 趣味)\n- 演劇 (趣味)"},{"id":"203793","title":"Pythonで競プロをしよう!〜入門者が知っておくべき高速化Tips〜","room":"#pyconjp_4","day":"1","no":"6","elevator_pitch":"最近AtCoderを中心に、競技プログラミングの人気が高まっています。\nC++で参加している人が一番多いですが、Pythonで参加している人もかなり増えています。\nPythonは書きやすい一方でC++と比べてしまうと実行速度が遅く、Logicは正しくてもPythonだとTLE(Time Limited Exceeded, 時間超過)してしまうことも少なくありません。\nしかし実際にはPythonでも高速化が可能で、ほぼ全ての問題がPython(/PyPy)でAC(Accepted, 正解)することができると知られています。\n本セッションでは、Pythonで競技プログラミングをする際に把握しておくべき様々な高速化Tipsを紹介し、競技プログラミングにPythonで参加するハードルを少しでも下げることが目的です。","prerequisite_knowledge":"* 標準入出力の扱い、List/Dictといった基本的なデータ構造の利用経験といったPythonの基礎\n* 競技プログラミングの概要\n* AtCoderなどに実際にPythonで参加した経験があるとなおよい\n","audience_takeaway":"* Pythonでコードを書く際の高速化Tips\n* 計算量に関する意識\n","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"基本的には各種Tipsを具体的に紹介していく形を考えています。\n手元で実験した結果などを示しながら紹介をしていこうと考えています。\n\n\n入力関連の高速化 (2min)\n* `input`よりも`sys.stdin.readline`の方が早くなる話\n\nPythonの各種操作の計算量について (3min)\n* list\n* set/dict\n\n再帰に関する話 (1min)\n* `RecursionError`に注意しよう\n\nソートの速度について (2min)\n* listのlistのソートはそもそも遅いが、`operator.itemgetter`を使うと早くなる話\n\nPythonとPyPy (5min)\n* Pyenvによる導入\n* 両者の長所・短所\n * 「for/whileを多用している場合はPyPyにするだけで圧倒的に高速になるが、一方で再帰の場合はPythonの方が早い」など\n\n質疑・応答(2min)","name":"Kevinrobot34","profile":"東京大学理学系研究科卒業後、株式会社ナウキャストに入社。\n業務ではPythonを使いビッグデータの分析やデータ処理のためのパイプライン構築を行っている。\nまた趣味でPythonを使い競技プログラミングをしている。"},{"id":"203665","title":"オルタナティブデータを用いた消費行動の分析 ~2月のトイレットペーパーパニックを例に~","room":"#pyconjp_5","day":"1","no":"6","elevator_pitch":"新型コロナウィルス感染拡大は、私たちの日常生活や消費行動に大きな影響を与えている。感染防止に一定の効果があるとされるマスクだけでなく、トイレットペーパーといった日用品も極端な品薄となる現象も見られた。\nこのセッションでは、オルタナティブデータの一つであるPOSデータ(POSレジで商品が販売されたときに記録されるデータ)とPythonでのデータ分析や可視化ツールを用いて、新型コロナの影響で日本の消費行動がどのように変化したかについての細かい分析をしてみたい。\nまた、分析を通して、Pythonが提供する魅力的なデータサイエンティスト向けツールを紹介したい。具体的には、Shapely, Pandas, Plotly, Keplerを使う予定がある。","prerequisite_knowledge":"Pandasでデータの読み込み方や基本的な扱い方\n基本的な統計の知識\n","audience_takeaway":"Pandasの時系列分析の機能とShapelyの位置情報の機能\nPlotlyやKeplerでデータの可視化する方法\nデータでストーリーを作り方\nオルタナティブデータの知識","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"1. 自己紹介\n2. オルタナティブデータについて\n3. 分析の事例(事例の解説、シンプルなコードの例、データの可視化)\n a)POSデータを使って、すぐに売り切れになった商品の種類を検知する。\n b)店舗の位置情報を用いて、売り切れになるまでのプロセスを調査する。\n 例えば、ある店舗のマスクやトイレットペーパーが売り切れると、近隣店舗の販売にも影響するのだろうか?\n c) マスク価格と関連性のある要素を調査する。\n例えば、店舗の所在地とマスク価格に関連性は見られるだろうか?\n結論、質問","name":"djentleman","profile":"イギリス出身、東京在住のデータエンジニア/データサイエンティストです。\nポーツマス大学でコンピューターサイエンスを履修し、ロンドンにあるオルターナティブデータのベンチャー企業Huq Industriesで3年間働いた後、去年10月に来日してFintechベンチャー企業のナウキャストに入社しました。現在、オルターナティブデータを用いて投資家の意思決定を支援するプロダクトに取り組んでいます。"},{"id":"203919","title":"スタッフとしてコードを書こう!〜Code for PyCon JP and yourself〜","room":"#pyconjp_3","day":"1","no":"6","elevator_pitch":"PyCon JP 2020のスタッフ活動で、私はPythonも書くことにしました。\n手を動かすことで自身の成長につなげたかったからです。\nコードを書いた結果、力がついたと感じるだけでなく、Pythonが代わりにやってくれるのでスタッフとしてできることも増えました。\n私の取り組みを共有し、スタッフ活動もPython使いとしての成長の場となることを共有したいと思います。","prerequisite_knowledge":"PyCon JPのスタッフ活動についての知識は不要です。\nPythonの文法は理解していて、自動化やWebアプリ開発などに取り組んでいる方は、発表を聞いた後にPyCon JPスタッフ活動により興味を持っていただけるのではないかと考えています\n(特に自動化レシピ本に取り組んだ経験やDjangoのチュートリアルに取り組んだ経験があると話がわかるでしょう)","audience_takeaway":"・コミュニティへの活動の中でコードを書いた例(Googleスプレッドシートの読み取り、Slackへの投稿、DjangoでのWebアプリ開発)\n・スタッフ=コードを書いて自分の成長にもコミュニティにも貢献する機会という見方","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Community building related to Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"この15分のトークでは、Python使いとしての成長を考える方がスタッフ活動の中でコードを書くヒントを提供します。\nスタッフ活動はコミュニティに貢献する素晴らしい活動だと思いますが、その時間はコードを書けないというイメージもあるように感じます。\nそんなことはなくて、スタッフもPython使いとして成長できる機会になると伝えたいです\n(結果、2021は多くのスタッフがPythonの力を付けられたらいいなと思っています)\n\n示す例は2つあります。\n\n1. 通知の自動化の例\n2. プロポーザルのレビューに使うWebアプリの開発\n\n1はGoogleスプレッドシートを読み取り、集計したり条件に当てはまる行を抽出してSlackに通知するスクリプトです。\nスプレッドシートのアクセスには`gspread`を使い、Slack投稿は標準ライブラリの`urllib`を使っています。\nAWS Lambdaの関数にして、定期実行するように設定しています。\n\n2はDjango製のWebアプリです。\nプロポーザルの募集に使ったサービスのレビュー機能が使いにくかったため、手を動かして実装しました。\nログインはSlackアカウントで行います。\n選択したプロポーザルを閲覧して、評価を入力できます。\nプロポーザルを条件(例:英語/日本語)で絞り込む機能も実装しました。\nプロポーザルの募集に使ったサイトからエクスポートしたデータをDjangoアプリに取り込む(loaddata)ために、JSONに変換するツールも作りました。\n\n## タイムライン\n\n- 自己紹介(1分)\n- なぜコードを書くことにしたか(2分)\n- 1 通知の自動化の紹介(5分)\n- 2 レビュー用Webアプリの紹介(5分)\n- まとめ 「スタッフとしてコードを書いて自分の成長にもつなげよう」(1分)\n- 質疑(1分)","name":"nikkie","profile":"PyCon JP staff (2019~)。2020はコンテンツチームリーダー。自然言語処理に取り組むデータサイエンティストでもある"},{"id":"203558","title":"ラズパイ3BのCPUでリアルタイム物体検出","room":"#pyconjp_1","day":"1","no":"6","elevator_pitch":"Raspberry Pi 3Bにカメラを繋ぎリアルタイムに物体検出を行うことを目指し、2年ほど開発を続けてきました。\n現時点でNeural Compute Stickにも内臓GPUにも頼らず、CPU処理のみで11FPSのbounding box detectionを行えるようになっています。\n\nこのトークでは、実機でリアルタイム物体検出のデモを行った後、高速な物体検出を実現するために行ったことを\n「検出モデル」「実行環境整備」の2つの観点から紹介します。\n画像処理・物体検出を行っている方、Pythonでデータ処理を行っている方にとって、処理速度向上のヒントになれば幸いです。","prerequisite_knowledge":"必須ではありませんが\n・Deep Learningによる画像認識を行ったことがあり、要求される計算量の多さを知っていること\n・Raspberry Pi上でCPU性能を求められるアプリケーションを実行したことがあり、Raspberry Piの性能の低さを知っていること\n・multiprocessingモジュールについての知識\nの3点の知識があると、内容をより楽しめます。","audience_takeaway":"・代表的な物体検出モデルの概要\n・速度に特化した物体検出モデルの作り方\n・精度向上に繋がるかもしれない、画像認識モデル学習上の工夫\n・ONNX RuntimeをRaspberry Piに導入し、高速な推論を行う方法\n・Python3.8で導入されたshared memoryを使用し、multiprocessingでのプロセス間のデータ受け渡しを高速化する方法","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Embedding python in hardware","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Raspberry Pi 3Bにカメラを繋ぎリアルタイムに物体検出を行うことを目指し、2年ほど開発を続けてきました。現時点では\n1. カメラから画像を取得\n2.「人」「動物」「乗り物」の3クラスを検出\n3. 各クラスの位置を示す四角形を画像に追加し、ディスプレイに描画\nが、CPU処理のみで11FPSで実行できるようになっています。\nMobileNet SSDやTinyYOLOなどの軽量な物体検出モデルでも3FPSを下回ることを考えると、速度面だけを見れば非常に高速です。\n\n高速化の試行錯誤を経て得た知見を「検出モデル」「実行環境整備」の2つの観点から紹介します。\n\n■検出モデル\nDeeplearningを用いた物体検出モデルであるYOLOをベースにネットワークを軽量・簡素化することで、より高速なモデルの作成を目指しました。\nネットワークを軽量化するとどうしても精度が下がりますが、少しでも精度悪化を緩和するために学習手法を試行錯誤し、\n・既に知られている「学習が進んだらミニバッチサイズを大きくすると良い」を自動化する実装\n・転移学習を繰り返し行うと精度が上がるという知見\nを得ました。\n\n■実行環境整備\n検出モデルを軽量化することに加え、効率よく処理を実行できるよう\n・モデルをonnxにexportし、高速な推論エンジンであるONNX Runtimeで推論を行う\n・画像撮影と検出結果描画を検出とは別のプロセスで動作させ、最も時間のかかる検出処理がブロックされないようにする\nとしました。\nプロセス間のデータ受け渡しはmultiprocessing.Queueを使うのが便利ですが、\nSharedMemoryを使うことでQueueよりも高いFPSが得られることが分かりました。\nまた、Python3.8自体がPython3.7より性能が高く、SharedMemoryを使うためにPythonのバージョンを上げただけで\nコードの改変なしに性能向上を得ることができました。\n\n\n構成とタイムラインは下記を予定しています。\n\n■導入(3分)\n・自己紹介\n・何をしたいのか\n・実機デモ\n\n■軽量な認識モデルの作成(6分)\n・代表的な物体検出モデルの紹介(R-CNN/YOLO/SSD)\n・今回作成したYOLOベースのモデル紹介\n・精度を上げるための学習手法の工夫\n - 学習の進み具合に応じて自動的にミニバッチサイズを増やす\n - 転移学習を反復的に行う\n\n■高速に推論を行うための環境構築(5分)\n・推論を高速に行うためのONNX Runtime導入\n・multiprocessingモジュールによるデータの処理パイプライン化\n・最新のPythonは最速のPython\n - 3.8から導入されたshared memoryによる、高速なプロセス間データ受け渡し\n - Python自体の速度改善\n\n■質疑応答(1分)","name":"Yutaka Nakano","profile":"全文検索とログデータの集計処理を生業とするサーバサイドエンジニアです。"},{"id":"214739","title":"Closing (Day 1)","room":"#pyconjp_1","day":"1","no":"","elevator_pitch":"1日目のクロージングです。\nDay1 Closing.\nYouTube Live: https://youtu.be/taVDsm4bqC8","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"1日目のクロージングです。\nDay1 Closing.\nYouTube Live: https://youtu.be/taVDsm4bqC8\n","name":"","profile":""},{"id":"214735","title":"Opening (Day 2)","room":"#pyconjp","day":"2","no":"","elevator_pitch":"2日目のオープニングです。\nOpening (Day2).\nYouTube Live: https://youtu.be/-ewM4Wz50wA","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"Opening (Day2).\nYouTube Live: https://youtu.be/-ewM4Wz50wA\n","name":"","profile":""},{"id":"214737","title":"Keynote: Mr. Rich Jones","room":"#pyconjp","day":"2","no":"","elevator_pitch":"Day2 Keynote by Rich Jones.\nYouTube Live: https://youtu.be/-ewM4Wz50wA","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Keynote","audience_python_level":"","audience_expertise":"","track":"Web programming (including web frameworks)","lang_of_talk":"English","lang_of_slide":"English only","description":"Keynote by Rich Jones\n\nhttps://pyconjp.blogspot.com/2020/06/pycon-jp-2020-2-announcement-of-keynote.html","name":"Rich Jones","profile":"Rich is the cofounder of Gun.io, a global consulting firm staffed by the best hackers from the Free and Open Source software community. He is the author of Zappa, the leading server-less Python framework, used by thousands of companies and users to save time and money for their web deployments. He has worked on everything from cloud GPU clusters for medical and scientific computing to mobile peer to peer file sharing applications, and on everything in between. In his spare time, he enjoys skateboarding, dirty southern trap music, and Laphroaig.\n\nRichはGun.ioの共同設立者です。\nGun.ioはグローバルなコンサルティングファームで、フリーソフトウェアやオープンソースソフトウェアのコミュニティから来た最も優秀なエンジニア(ハッカー)たちが所属しています。\n彼は、Pythonにおける主要なサーバレスフレームワーク、Zappaの作者です。\nZappaは、何千もの企業やユーザによって使われ、Web開発における時間と費用を節約しています。彼は医療や科学計算向けのクラウドGPUクラスタからモバイルのピア・ツー・ピアのファイル共有アプリまで、そしてその間にあるあらゆるものに取り組んできました。彼の趣味はスケートボード、サザン・ヒップホップと、ラフロイグを飲むことです。"},{"id":"203959","title":"ASGI(非同期サーバゲートウェイインターフェース)の概要","room":"#pyconjp_3","day":"2","no":"1","elevator_pitch":"大成功した WSGI に後継の仕様が出たらしい。そんな話をご存知でしょうか。\n\nサーバーとフレームワークのエコシステムが独立して存在しているWSGI ですが、WSGIは WebSocketや新しい async/await 構文をサポートできていません。\n\nその問題を解決したWSGI のスピリチュアルな後継であるASGI は、WebSocketと非同期サポートが組み込まれています。\n\nこのセッションでは、よくわからないけど気になる存在のASGIについて、WSGIと対比しながら実際のコードを交えて概要を紹介したいと思います。\n","prerequisite_knowledge":"Pythonを使ってWebアプリケーションを実装し、WSGIを使ったWebサーバ環境を構築したことがある経験。\nトークで扱うASGIについて、Read the Docsを一読いただいていると理解しやすいと考えますが、必須ではありません。\n","audience_takeaway":"* WSGIとASGIの違い\n* ASGIでできることの理解\n* ASGIサーバ導入の前提知識","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"ASGI(非同期サーバゲートウェイインターフェース)の概要を、WSGIとの違いの比較を交えて紹介します。\n\n- 導入(3min)\n - 自己紹介\n\n- WSGIについて(15min)\n - 概要 (基本のコードの紹介)\n - WSGIエコシステムサーバ(Gunicorn, uWSGI, mod_wsgi)とFramework (Flask, Django2.x)\n - WSGI の制限例: WebSocket\n\n- ASGIについて(25min)\n - ASGIの紹介(基本のコードの紹介)\n - ASGIの開発と歴史\n - ASGI 機能、WebSocket、HTTP/2\n - ASGIのエコシステムサーバ(Hypercorn, Daphne, Uvicorn) とFramework(Starlette, Django3.x, Quart)","name":"Junya Fukuda","profile":"Pythonエンジニア\nPyCon Kyushu 2020 Kumamoto トーク採択"},{"id":"203111","title":"Pythonで作る機械学習システムパターン","room":"#pyconjp_5","day":"2","no":"1","elevator_pitch":"Pythonを用いた機械学習のモデル開発事例は多数ありますが、そのモデルをビジネスやシステムに組み込み、運用する事例は多くありません。機械学習を有効活用するためにはシステム化することが必要と考え、そうした問題意識から、機械学習システムのデザインパターン集を公開しました。本セッションでは、機械学習システムのグランドデザインおよびPythonによる機械学習デザインパターンの実装例を説明し、システムの運用や改善ノウハウを共有します。プラットフォームにはKubernetesを活用し、機械学習の学習からテスト、QAを行い、推論器をリリースして運用するまでの一連の流れを説明します。","prerequisite_knowledge":"- 機械学習の基礎知識\n- Webアプリケーションの基礎知識","audience_takeaway":"- 機械学習を実用化する方法\n- Pythonによる機械学習ワークフローおよびWebアプリケーション開発\n- ログ設計\n- システムの運用ノウハウ","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"本セッションでは機械学習のモデルを実用化するためのノウハウをPythonによる実装を交えて説明します。\nPythonを用いた機械学習のモデル開発事例は多数ありますが、そのモデルをビジネスやシステムに組み込み、運用する事例は多くありません。機械学習を有効活用するためにはシステム化することが必要と考え、そうした問題意識から、機械学習システムのデザインパターン集を公開しました。\nhttps://github.com/mercari/ml-system-design-pattern\n\n機械学習システムのグランドデザインおよびPythonによる機械学習デザインパターンの実装例を説明し、システムの運用や改善ノウハウを共有します。プラットフォームにはKubernetesを活用し、機械学習の学習からテスト、QAを行い、推論器をリリースして運用するまでの一連の流れを説明します。\n\n構成とタイムラインは以下のとおりです(45分想定)。\n1. 自己紹介(5分)\n2. 機械学習システムデザインパターンの紹介(10分)\n- 機械学習をシステムに組み込むための課題\n- 課題解決のアプローチ\n- デザインパターンの意義\n- 機械学習システムのコンポーネント\n3. 機械学習システムの実装、リリース、運用方法(25分)\n- 学習パイプライン\n- モデルの評価\n- 推論器の実装\n- リリース前QAおよびパフォーマンスチューニング\n- A/Bテスト\n- 評価\n4. まとめと質疑応答(5分)","name":"Yusuke Shibui","profile":"株式会社メルカリ\nMLOps, Image Search & Edge AI\n文学修士(イギリス旅行史) →富士通→IBM→SAS→パナソニック→株式会社メルカリ\n■ 機械学習によるサービス改善\n■ 機械学習プラットフォーム開発\n■ Edge AI\n写真の物体検出結果:猫:0.55 犬:0.45 人間:0.60 謎:0.40"},{"id":"203899","title":"Understanding Python's Debugging Internals","room":"#pyconjp_2","day":"2","no":"1","elevator_pitch":"During this session, we’ll share how debugging actually works in Python, delving into how Python debugging looks like from the inside. We will discuss the differences between CPython and PyPy interpreters, as well as explaining the underlying debugging mechanism, and ultimately how to utilize this knowledge at work.","prerequisite_knowledge":"Use and understand Python","audience_takeaway":"The differences between CPython and PyPy interpreters, understanding performance benchmarks, the sys.set_trace function (how to use it and alternatives to it) and ultimately how to utilize this knowledge.","talk_format":"Talk(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Python core","lang_of_talk":"English","lang_of_slide":"English only","description":"Ever wondered how Python debugging looks on the inside? On our journey to building a Python debugger, we learned a lot about its internals, quirks and more. During this session, we’ll share how debugging actually works in Python. We’ll discuss the differences between CPython and PyPy interpreters, explain the underlying debugging mechanism and show you how to utilize this knowledge at work and up your watercooler talks game.","name":"Liran Haimovitch","profile":"Liran is the Co-Founder and CTO of Rookout. He’s an advocate of modern software methodologies like agile, lean and devops. Liran’s passion is to understand how software actually works. When he's not thinking of code, he's usually diving or hiking."},{"id":"203063","title":"レトロゲームエンジン「Pyxel」でゲームプログラミングをはじめよう!","room":"#pyconjp_4","day":"2","no":"1","elevator_pitch":"レトロゲームエンジン「Pyxel」をご存知ですか?\nPyxelはドット絵を使ったゲームを簡単に作成できる、Pythonのライブラリです。\nシンプルでわかりやすい命令と、画像と音楽の制作ツールも同梱されている手軽さから、全世界でユーザーが増えており、GitHubでは7000スターを獲得、全言語のゲームエンジン中Top10入りしています。\n本トークでは、Pyxelの開発者本人(日本人です)が、Pyxelの導入方法、付属ツールを使ったゲーム素材の作り方、Pyxelを使った本格的なゲームプログラミングの方法について解説します。\nPyxelで手軽に楽しくゲームプログラミングを始めましょう!","prerequisite_knowledge":"Pythonによる簡単なプログラムの作成経験","audience_takeaway":"・レトロゲームエンジンPyxelの使用方法\n・ゲームプログラミングの基本的な考え方\n・Pyxelを使ったゲームプログラミングの方法\n・Pyxelを使ったゲーム素材(画像・サウンド)の作成方法","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"GUI and games","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"Python向けレトロゲームエンジン「Pyxel」を使ったゲームプログラミングの方法について、導入方法から本格的なゲームの作り方まで、以下のステップに分けて説明します。\n\n1. Pyxelの概要と導入 (5分)\n - Fantasy Consoleについて\n - Pyxelの特長・制作事例\n - Pyxelの導入方法\n\n2. Pyxelを使ったお絵描きプログラムの作成 (8分)\n - お絵描きプログラムの作り方\n - 基本的なAPI\n - お絵描きプログラムの実践\n\n3. 付属ツールを使った素材の作成 (5分)\n - Pyxelのリソースデータについて\n - Pyxel Editorの機能紹介\n - 画像データの作成方法\n - サウンドデータの作成方法\n\n4. 本格的なゲームプログラミングの方法 (9分)\n - ゲームプログラムの考え方\n - ゲームプログラミングに必要な仕組み\n - Pyxelでの作成例\n - ゲームジャンルごとのポイント紹介\n\n5. まとめ (3min)\n - 解説内容のまとめ\n - Pyxelの今後","name":"Takashi Kitao","profile":"元ゲーム開発者。メタルギアソリッドのプランナー、PS2向けロボットシューティング「Zone of Enders」シリーズのゲームデザインとメインプログラマーを担当。\n現在は電機メーカーにてAR/VR技術を研究開発中。\nレトロゲームエンジンPyxelの開発者。2018年、GitHubデイリーランキングにて全世界の開発者中1位を獲得(ただし3日間だけ…)"},{"id":"213322","title":"招待講演:Metaclass?Descriptor?完全に理解した()あなたに","room":"#pyconjp_1","day":"2","no":"1","elevator_pitch":"Python3.6で追加されたとあるダンダーメソッドが、DescriptorやMetaclassに大きく影響を与えました。\nというのはどういうことなのか。完全に理解したあなたと私のために、metaclassとdescriptorの復習から始めます。\n存在は知っているけれどどう使われてるの?となりがちなMetaclassとDescriptorを「ちゃんと」理解していきましょう。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(45min)","audience_python_level":"Advanced","audience_expertise":"","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"露木誠氏による招待講演です。\n\nhttps://pyconjp.blogspot.com/2020/08/invited-talks2.html","name":"露木誠","profile":"2000年頃にファッションジュエリー業界からIT業界へ移り、以来ソフトウェアエンジニアとして働いています。\nPython、Java、Perl、Rubyなどのプログラミング言語を用いてB向けC向けを問わずさまざまな開発に従事してきました。\nソフトウェアエンジニア・チーフアーキテクト・テックリードなどとして開発に携わるのみならず、プログラミング講習の講師や自社サービス用工場の立ち上げなど、開発から外れた仕事もしてきました。\nここ数年はエンジニアが働きやすい環境づくりなどにも関わっています。"},{"id":"214742","title":"ランチタイムセッション(パネルディスカッション)","room":"#pyconjp","day":"2","no":"","elevator_pitch":"Day2ランチタイムにスペシャルパネルディスカッションを開催します。ここでしか聞けないような話題が盛りだくさんです。ランチを食べながら是非お聞きください。Zoomの他YouTube Liveでも参加いただけます。\nYouTube Live: https://youtu.be/-ewM4Wz50wA","prerequisite_knowledge":"とくになし。","audience_takeaway":"-","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Day2ランチタイムにスペシャルパネルディスカッションを開催します。\nYouTube Live: https://youtu.be/-ewM4Wz50wA\n\nここでしか聞けないような話題が盛りだくさん。ここだけの裏話も聞けるかも。\nランチタイムが始まったらご飯を準備いただき、ご飯を食べながらお聞きください。\n\n視聴にあたって前提知識やPythonスキルは不要です。どなたでもお楽しみいただけます。","name":"","profile":""},{"id":"203053","title":"How to Transform Research Oriented Code into Machine Learning APIs with Python","room":"#pyconjp_5","day":"2","no":"2","elevator_pitch":"Recently, Python engineers have more opportunities to work with data scientists than before. At the same time, they are often faced with the research-oriented code written by researchers or data scientists. In order to integrate this code with systems such as APIs, python engineers need to additionally write the code or refactor it, and make them work on the server.\n\nThis talk covers the gap between the research-oriented code and production code of machine learning API. What is the gap between them? How it can be implemented based on real-world python code? How can the code validate whether the dataset is correct ? How can machine learning models be continuously inspected? Audiences can earn the answers to these questions from this talk.","prerequisite_knowledge":"1) The audiences can be engineers, data scientists, or researchers at junior or middle level who use python.\n2) This talk could be more beneficial for people who have experience to be involved with AI / ML projects.\n\nTech Stacks that it might be good for audiences to have:\n- Basic understanding of python grammar \n- Knowledge about python for analysis use\n- Architecture of RESTful API\n- Experience exploratory analyzing data or doing data mining with python","audience_takeaway":"One of the major things that the talk can provide could be that audiences would learn each responsibility of each role in AI / ML projects and process to implement AI / ML products, and the better or best practices of ML API implementation.","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":"Introduction\n\nWhy do I talk about this topic ? (1 minute)\n- The Four Steps to transform Research Oriented Code into \n- Machine Learning APIs with Python (1 minute)\n\nMain Talk (+ sample codes and explanations in each section)\n\n1) Understand what code you look at and make, and how to handle the code. (6 minutes)\n- What is Research Oriented Code ?\n- What are ML APIs ?\n- How should engineers handle research oriented code ?\n\n2) Modularize research oriented code (6 minutes)\n- Categorize research oriented code into preparation code, preprocessing code, and ML code\n- Break them out into functions and make them testable\n- Clarify input and output of the code, and define URI\n\n3) Refactor research oriented code (6 minutes)\n- Prepare for refactoring by understanding requirements of each code and taking notes about them\n- Simplify I/O code in preparation code\n- Transform coding style with pandas into purely pythonic code in preprocessing code\n\n4) Check the ML APIs can work correctly on the server (6 minutes)\n- Write decorators to automatically check parameters\n- Set up production-like environments\n- Suggest a tiny example of CI/CD environments for ML APIs.\n\nSummarize the talk\n\nQuickly review the four steps to transform Research Oriented \n- Code into Machine Learning APIs with Python (1 minute)\n- Share the useful resources and tips related to what is mentioned in the talk. (1 minute)","name":"Tetsuya Jesse Hirata","profile":"Tetsuya is a software engineer based in Tokyo. He has been involved with several AI/ML projects in EdTech domain and has mainly been implementing ML APIs and ML Ops environment. Prior to this, he used to research the relationships between online learning behaviors and learning outcomes at the UCL Institute of Education (IOE) in the UK. His interest is in how to bridge the gap between data science and engineering.\n\nhttps://www.linkedin.com/in/tetsuya-hirata-a31b52134/\nhttps://twitter.com/JesseTetsuya\nhttps://medium.com/@JesseTetsuya"},{"id":"203900","title":"Sphinx はどのように Python コードからドキュメントを生成するのか","room":"#pyconjp_4","day":"2","no":"2","elevator_pitch":"Sphinx では Python コードからドキュメントを生成するために、静的解析や動的解析といったアプローチを用いてプログラムをあらゆる側面から解析しています。本セッションではその手法を紹介します。Python コードから得られる情報を元に、あなたも便利なツールを作ってみませんか。","prerequisite_knowledge":"* Python のプログラムを開発した経験があること\n* Python の型ヒントを使ったことがあるとなおよい","audience_takeaway":"* Python オブジェクトが持つメタデータの知識\n* 動的解析、静的解析の方法","talk_format":"Talk(30min)","audience_python_level":"Advanced","audience_expertise":"0%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"English only","description":"Sphinx は Python の公式ドキュメントや numpy, pandas, django など数多くのプロジェクトで利用されているドキュメント生成ツールです。\n\nSphinx が広く利用されている理由のひとつに Python プログラムからのドキュメント自動生成(autodoc)があります。ドキュメント自動生成機能を用いると、手元の Python コードからかんたんにドキュメントを生成できます。本セッションではこのドキュメント自動生成機能がどのように実装されているのかにフォーカスを当て、Python プログラムの動的解析および静的解析の実装方法をご紹介します。\n\n発表内容:\n* Sphinx とはなにか\n* Python コードからドキュメントを生成する\n* Python オブジェクトから情報を抽出する (動的解析)\n* Python のスペシャルメソッドを理解する\n* PEP を読む\n* Python コードから情報を抽出する (静的解析)\n* AST の使い方\n* Python のバージョン差と戦う\n* 質疑応答","name":"tk0miya","profile":"(株)タイムインターメディア CTO。Sphinx-Users.jpの運営のひとり。ドキュメンテーションツールSphinxのコミッター、作図ツールblockdiagの作者。他にも数多くのSphinx拡張(プラグイン)を開発している、ドキュメンテーションツールを主戦場とするOSS開発者。 著書:「Sphinxをはじめよう第2版(2017 オライリー・ジャパン刊)」。"},{"id":"203858","title":"チーム開発立ち上げにやっておいたほうがいいソース管理の方法","room":"#pyconjp_3","day":"2","no":"2","elevator_pitch":"プログラミングを動かす上で必要なことはアルゴリズムだけではなく、綺麗に書くこと、そしてそれらをチェックする正しい仕組みが必要です。\n特にチーム開発の場合、正しく動いていたとしても人によって書き方がばらばらになってしまい、結果として見にくいソースになってしまうことがあります。\nそれらを防ぐ方法としてPythonのコード規約(PEP8など)と仕組み(flake8, black, pre-commitなど)があります。\nここではそれらの使い方だけはなく仕組みも紹介しようと思います。","prerequisite_knowledge":"Pythonの初級文法","audience_takeaway":"(特に)チーム開発時におけるコード管理の方法","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"Pythonのソースコードを綺麗に保つためのいくつかの方法について説明します。\n- 対象\n - チーム開発で新規プロジェクトを立ち上げる方\n - ソース管理はきっちりやりたい方(\"\"と''が混在して欲しくない等)\n - 耳学問でpep8とかflake8とか訊いたことがあるけどよく分からない方\n - formatterで内容は分からないけど適当に他のプロジェクトで使ってるものを使い回してる方\n\nこの登壇ではPythonのコーディング規約であるPEP8に付いての簡単な説明から、flake8のようなラッパーツール、\nblackのようなformatterそしてそれらを自動で適用させるためのpre-commit、そしてそこに導入するべき他のformatter(mypyやseed-isort-configなど)に付いて簡単に説明し、ソースをどのように修正してくれるのかなどを実例を示しながら説明していきたいと思います。\n\n構成とタイムラインは以下のとおりです。\n- 導入(3min)\n - 自己紹介\n - 問題意識\n - チーム開発の場合、どうしても個人の癖がでてしまい、全体としてルールが統一がされていないことがある。 また開発環境の違いによっては警告がでる人と出ない人の差などがあり不快感もある。\n レビューの際もそうした本質的ではない部分で指摘することは時間の無駄となっている。\n- Pythonのコーディング規約pep8に付いて(5min)\n - pep8とはなにか?\n - 実例紹介\n- formatterについて(10min)\n - autopepについての説明と実例\n - blackについての説明と実例\n − yapfについての説明と実例\n - それぞれの比較\n- pre-commitでformatterを自動化(8min)\n - 指定方法の実例\n - 上記の他に指定しておくといいものの紹介\n - seed-isort-confingやmypyなど\n - まとめ (1min)\n- 質疑応答 (3min)\n","name":"yuuki nakajima","profile":"Python歴5年、主にDjangoを書きつつインフラの面倒も見たりするミニフルスタックエンジニア"},{"id":"203648","title":"ひとりで作る画像検索システム","room":"#pyconjp_2","day":"2","no":"2","elevator_pitch":"これは、画像をクエリとする検索に興味を持っている人のためのトークです。画像そのものをクエリとする画像検索のノウハウはまだまだ多くありません。画像を画像で検索する技術は、ユーザー体験を向上させる可能性を持っています。アップロードした画像からユーザーの入力を補助したり、ユーザーの求める商品と似たような見た目の商品を推薦したり、ユーザーへより良い体験を提供できます。\n\n本トークでは、画像検索システムを構築するために必要な原理の紹介と、実際に検討した Python パッケージを紹介します。","prerequisite_knowledge":"・Python の何らかのパッケージを使ってプログラムを作成した経験\n・Python で画像処理をした経験があれば、すぐに実践できると思いますが、必須ではありません","audience_takeaway":"・類似画像検索に必要な知識やシステム構成\n・画像処理や検索に便利なパッケージ","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"画像検索の手法は2つに大別できます。画像に紐付いたテキスト情報を検索するTBIR(Text Based Information Retrieval)と、画像そのものをクエリとして検索するCBIR(Contents Based Information Retrieval)の2つです。\n\n本トークでは、個人でCBIRの画像検索システムを Python で作成した事例を紹介します。\n\n画像検索システムを作るためには、画像処理及びベクトル検索の知識と技術が必要です。幸いにも Python は画像処理やベクトルを簡単に扱えるパッケージが豊富にあります。\n\n私は、画像検索がどのように実現されうるか独自に調査し、得た知識を使って画像検索システムを作成しました。\n\n本トークでは、画像検索を実現するために調査して得た原理や、実際に使用検討したパッケージに関連する知見を共有します。\n\n構成とタイムラインは以下のとおりです。\n\n・導入(5min)\n・・自己紹介\n・・類似画像検索の課題\n・画像検索の手法(10min)\n・・画像が似ているとはどういうことか\n・・特徴量の抽出と検索が重要な技術ポイント\n・・抽出の手法とライブラリ(pHash, AKAZE, DNNなど)\n・・検索の手法とライブラリ(faiss, nmslib, annoyなど)\n・画像検索システムを作る(10min)\n・・システム構成(ユースケース図とシーケンス図)\n・・Python で画像から特徴量を抽出する\n・・Python で特徴量を検索できるようにインデックスする\n・・特徴量抽出と登録を定期実行する\n・・選定したライブラリのアルゴリズム\n・まとめ (1min)\n・質疑応答 (4min)","name":"康貴 山際","profile":"学生時代に画像収集や画像処理を趣味で始める。ピクシブ株式会社にウェブエンジニアとして入社し、広告配信システム開発運用に携従事。\n趣味が高じて、屋内での画像処理に関して武蔵野大学と共同研究し、のちに同大学の客員研究員となる。\nその後、OLTA株式会社にウェブエンジニアとして入社し、クラウドファクタリングの事業に従事している。"},{"id":"213317","title":"招待講演:過去2回の登壇内容からのPython×ドローンの進化、 アップデート内容と今後について展望","room":"#pyconjp_1","day":"2","no":"2","elevator_pitch":"過去2年(2017,2018)のPyConJP発表からの進化・進捗などをまとめて、Pythonとドローンをどのように扱い、活用すべきかを自身の経験も踏まえてお話をします。\n2017年および2018年の発表時には何ができて、何が問題・不足したのか。そしてその後はどのように解決したのか。\n果たしてPythonとドローンの組み合わせは良かったのか?\n現在市販されているミニドローン「Tello」がPythonでプログラミングできます。では、実際にどのような動作ができるのかを調査しまとめます。\n最後に、ハードウェアとソフトウェアの両方を実験して感じたことをまとめ、トークします。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"Invited talk(30min)","audience_python_level":"","audience_expertise":"","track":"Embedding python in hardware","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"片寄里菜氏による招待講演です。\n\nhttps://pyconjp.blogspot.com/2020/08/invited-talks4.html","name":"片寄里菜","profile":"片寄里菜さんは、幼い時より航空機に興味があり、もっと学びたいという想いから東海大学工学研究科・航空宇宙学専攻の博士課程前期に進み、ヘリコプターなど垂直離着陸機の研究を行っていま\n大学院修了後は、WEB関連の仕事をしながら個人的な研究テーマを進め、Pythonと出会いました。Pythonでは主にRaspberryPiを使ったモノを動かすプログラミングに視点を置き、開発などを行っていました。\nPyConJPには2016年に初参加。Pythonの楽しさや奥深さを知り、様々なコミュニティに参加し友人・知人を増やしたようです。またPyLadiesTokyoコミュニティ参加をきっかけに、今ではスタッフとして活動しています。\n登壇経験としてPyConJP2017と2018ではドローンとPythonに関する内容で発表・実演を行いました。またPyCon Thailand2019ではPyLadiesのコミュニティ活動に関する海外の登壇経験もあります。PyConUSなど海外のPyConに参加している経験もあり、精力的に活動を行っています。\nご自身の仕事は2018年に株式会社moegiを創業し、計測用のスマホアプリなどを開発。日本だけでなく世界の空の活用法や問題点なども調べ、航空機分野の開発者として活躍できるようにと日々活動をしています。"},{"id":"202353","title":"BLEでロボットトイを制御しよう","room":"#pyconjp_3","day":"2","no":"3","elevator_pitch":"STEAM教育が流行る中、教材として様々なモノが増えてきています。\n\nこれらの教材にはGUIを用いたプログラミング環境や開発者向けのAPIが公開されています。\nしかし、これらの教材はおもちゃのように動くモノが多く、低いレイヤーの制御が必要なので、Webアプリケーション開発者には取っつきづらいこともあります。\n\nこのトークでは、教材が公開している技術仕様をもとにpythonでBLE制御するユースケースを共有します。\n\nOSSで公開されているライブラリを用いた2つの方法でBLEを制御する方法が理解できます。","prerequisite_knowledge":"pythonを用いた開発を行ったことがある経験\n\nBLEの知識があった方がトークの内容を理解しやすいと考えますが、必須の前提知識はありません。","audience_takeaway":"python でのバイナリデータ操作の仕方\nBLE 操作の基礎知識\npyobjc を用いた BLE 操作の仕方","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Case studies (excluding web programming or machine learning)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"まず導入で、トークの目的について話します。\n\nSTEAM 教育が流行る中、教材として様々なモノが増えてきています。\nこれらの教材には GUI を用いたプログラミング環境や開発者向けの API が公開されています。\nしかし、低いレイヤーの制御が必要なので、取っつきづらいこともあります。\nこれらを解決する一助とすることが目的です。\n\nいくつか教材があるのですが、STEAM 教育のコンテンツとしては実際に動いた方が分かりやすいと\n考えているので、Cozmo や toio が良いと考えています。Cozmo はサービスが停止しているため、\n今回は toio を用いた例で説明を行いたいと思います。\n\n今回のトークのため、toio を制御するライブラリを作成しました。\n実際に Python で BLE ライブラリを操作するためにはバイナリデータを扱うので、\n基本的な利用方法(bytes、bytearray や struct)について説明します。\nBLE ライブラリとしては Adafruit_BluefruitLE と bleak の 2 つで実際の制御するコードを説明します。\n\nここで1つ課題が発生します。toio には toio.js という typescript で書かれたライブラリがあり、\nそれと同じような振る舞いを考えていたのですが、上記の2つのライブラリではうまく動作しませんでした。\nこれらを解決するために2つライブラリが利用している「pyobjc」というライブラリを用いて制御する\nことを考えました。\n最後に pyobjc を用いた BLE の制御方法についてコードで説明します。\n\n\n- はじめに(2min)\n - 自己紹介\n- 導入(3min)\n - 本トークの目的\n - 様々な教材\n- BLE ライブラリ で 制御する(10min)\n - バイナリデータを扱う\n - BLE を操作する\n - BLE ライブラリ で発生した課題\n- pyobjc で制御する(12min)\n - pyobjc とは\n - corebluetooth を制御する\n- まとめ(3min)","name":"sandfish03","profile":"SaaS企業でサーバサイドエンジニアをやっています。\n仕事ではpython使ってはいないですが、pythonが好きです。"},{"id":"203923","title":"Cloud RunとFastAPIで、ChatBotをミニマムスタートしよう","room":"#pyconjp_4","day":"2","no":"3","elevator_pitch":"Chatbotの開発・運用には様々なアプローチが存在しています。今回は、「Slackbotの開発」のユースケースとして、「Cloud Run + Fast API」というパターンをプロダクトの特性を活かしつつ紹介します。\nこのユースケースを通じて、Cloud Runの使いどころや、非同期処理(async)の利点・利用例をふんわり理解しましょう。","prerequisite_knowledge":"- Dockerの基礎知識(build, run, pushの概要がわかる程度)\n- (要求度:低)上記を元にした、DockerコンテナベースでのPython Webアプリケーションの知識","audience_takeaway":"- Cloud Runの使い方\n- Fast APIを用いたアプリケーションの作り方\n- Slackbotを始めとした、チャットボット用のWebアプリケーション開発時の基本的な作法例","talk_format":"Talk(30min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"新型コロナウイルスの影響もあり、チャットプラットフォームは今までより更に一段重要性が上がってきています。\n個人・企業を問わず様々なレイヤーの人が、「チャットボット」を作るようになってくるのではないでしょうか。\n\n今回は、「GCP上にFastAPIを使ってSlackbotを開発する」という主題を元に、Chatbotをスタートさせる事例と勘所を紹介します。\n\n\n- 起: 自己紹介\n- 起: 今回の主題\n - 「Google Cloud Run上」に「Fast APIをベースにしたWebapp」として「Slackbot」を開発・提供する\n - この組み合わせを選んだ理由(概要レベル)\n- 承: Google Cloud Run\n - Cloud Runとはなにか\n - どんな特性があるか\n - 今回、なぜこれを使うか\n- 承: Slackbot\n - 現在のSlackbotの動向\n - RTMPではなくEventAPIを選ぶということ\n- 承: Fast API\n - Fast APIとはなにか(ミニマムな使い方)\n - どんな特性があるか(本題に近い部分を中心に)\n - 今回、なぜこれを使うか\n- 承: 実例を交えた解説\n - デモ\n - エンドポイントの開発\n - メッセージに応じて振る舞いを変える\n - Slackbot用APIの制約との戦い\n- 転: 悩ましい部分\n- (転: 派生する未来)\n- 結: まとめ","name":"Kazuya Takei","profile":"ニジボックス所属のインフラ寄りバックエンド系スタックフルエンジニア。 興味にリソースを振りがちで、最近はSphinxとFastAPI系に戯れてる機会が多め"},{"id":"201486","title":"Your Escape Plan From Numpy + Cython","room":"#pyconjp_2","day":"2","no":"3","elevator_pitch":"In this talk, a math equation will be given as a benchmark. Instead of optimizing it with Cython (painful and unpythonic), I will give three Pythonic solutions to accelerate NumPy. At the end, the pros and cons of three solutions will be given as well as some recommendations based on my experience.","prerequisite_knowledge":"The audience must have some development experience with NumPy.","audience_takeaway":"* Three pythonic solutions to boost NumPy performance with little modification\n* A big picture of performance improvement of three commonly used NumPy accelerate solutions: CuPy, Numba, and Pythran\n* Which solution should be applied first in different scenarios\n* Bonus: an interesting solution: Transonic","talk_format":"Talk(30min)","audience_python_level":"Advanced","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"English","lang_of_slide":"English only","description":"If you've been a data scientist or researcher long enough, you must have encountered a situation where your NumPy code ran quickly on small datasets in a testing environment but performed poorly on real-world datasets (100x larger or more). In this talk, I will introduce three Pythonic solutions to improve NumPy performance drastically without modifying too many codes.\n\nAt the beginning of the talk, a math equation: logsumexp, which is widely used in machine learning, will be illustrated. I will show how it is implemented with pure NumPy and use it as a benchmark so we can compare it to three proposed solutions at the end of the talk.\n\nThen, three solutions: CuPy, Numba, and Pythran will be presented in separate sections. In each section, I will give a brief introduction to the solution and show how to apply this solution to our benchmark code.\n\nAt the end of the talk, I will compare these solutions from different aspects:\n* How much performance is boosted after each solution is applied\n* Ease to apply on your existing code (including the ease of debugging)\n* Limitations of each solution\n* Which solution should be applied first in given scenarios\n\nLast but not the least, I will show a relatively new but interesting solution: Transonic to the audience so they can give it a try on their side project.\n\nOutline and timeline are as follows:\n- Introduction (4 min)\n - Self-introduction\n - Explain why this issue is important but painful\n - Explain logsumexp in math equation\n - Show how logsumexp is implemeted by Numpy\n- Solution 1: CuPy (4 min)\n - Introduce how to use CuPy and its limitation\n - Show how logsumexp is implemeted by CuPy\n- Solution 2: Numba (4 min)\n - Introduce how to use it and its limitation\n - Show how logsumexp is implemeted by Numba\n- Solution 3: Pythran (4 min)\n - Introduce how to use it and its limitation\n - Show how logsumexp is implemeted by Pythran\n- Compare three solutions (11 min) \n - Show performance differences among solutions\n - Share my experience on these solutions\n - Give some recommendations on choosing solutions based on different scenarios\n- Bonus, Takeaways, and QA (3 min)\n - Briefly mention \"transonic\" project (a combined solution of CuPy, Numba and Pythran)\n - Takeaways\n - QA","name":"clyang","profile":"A Python performance tuning enthusiast tweaks ML platform for Cybersecurity company. Meanwhile, I'm also a cybersecurity hobbyist poking websites on the Internet."},{"id":"203938","title":"広島における地域 Python コミュニティの立ち上げ方と続け方","room":"#pyconjp_1","day":"2","no":"3","elevator_pitch":"PyCon JP は毎年東京でカンファレンスを開催するだけではなく、\nPython Boot Camp の開催や地域イベントの支援などの取り組みも行っています。\nそれらの制度をどのように活用しながら、\n自分の地域で Python のコミュニティ活動を立ち上げて、続けていけばいいでしょうか?\nこのような活動はどんな人に向いているでしょうか?\nどんなメリットがあるでしょうか?\nこのトークでは一緒に活動を続けている仲間で、広島のコミュニティ活動を紹介します。\n「自分も地元で Python のコミュニティ活動をやってみたい」\nという人に一歩踏み出すきっかけになっていただけると嬉しいです。","prerequisite_knowledge":"なし","audience_takeaway":"- PyCon JP が行っている地域コミュニティ支援\n- 地域 Python / PyCon (mini) イベントの運営\n- Python Boot Camp の開催とフォローアップ\n- 他の地域 Python コミュニティや PyCon JP コミュニティとのつながり方\n- IT勉強会のオンライン化のもたらすチャンスと地域コミュニティの役割\n- 広島のコミュニティのメンバーによる体験談や技術紹介","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Community building related to Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"広島では 2015 年に PyCon mini Hiroshima カンファレンスを、\n2016年に Python Boot Camp を開催し、\n毎月の小規模の勉強会とほぼ毎年のカンファレンスを継続しています。\n私たちは PyCon JP の制度や支援に支えられ、\nまた県内外の Python 関係者に支えられてきました。\n仲間が増えるとイベントも運営しやすくなり、\n全国の人とつながる機会もさらに増えていきます。\n2020年は多くのIT勉強会がオンラインで開催されており、\n地方コミュニティの役割も変化していきそうです。\nこのトークでは広島の Python コミュニティの経験から、\n地方でのコミュニティ活動の立ち上げや継続に役立つこと、\nそして現状や今後の予定を紹介します。\n\n構成とタイムラインは以下のとおりです。\n\n- 広島での活動の紹介(10分)\n - PyCon mini Hiroshima\n - Python Boot Camp\n - すごい広島 with Python\n - PyCon JP への参加\n- 共同発表者のトーク(5分)\n - いままで紹介したネタを振り返る\n- 共同発表者のトーク(5分)\n - カンファレンスの参加者がスタッフになって気づいたこと\n- 共同発表者のトーク(5分)\n - 東京のコミュニティから広島に移動した話\n- クロージング(2分)\n - 地域 Python コミュニティで得たもの\n - PyCon mini Hiroshima の今後\n- 質疑応答(3分)\n","name":"Takuya Nishimoto, REI SUYAMA, Ryo Mitsuda, Takayuki Kaisen","profile":"Takuya Nishimoto:\n2011年まで大学教員。現在は広島在住。NVDA 日本語チーム(オープンソースのスクリーンリーダー)、PyCon mini Hiroshima などのコミュニティ、ウェブアクセシビリティのWG委員、ソフトウェア開発者、技術チームのマネージャーなどとして活動中。2018年に株式会社シュアルタ設立。\n\n\nREI SUYAMA:\n尾道が好きになり東京から尾道の向島に引っ越してきたフルリモートのプログラマ。学生時代からずっとPython好き。シンプルなコード、シンプルな設計を目指してます。\n\nRyo Mitsuda:\n広島のITコミュニティで広く活動しています。 また、毎週水曜日に「すごい広島」というもくもく会を主催しています。\n\nTakayuki Kaisen:\nPythonプログラマ"},{"id":"203164","title":"最先端自然言語処理ライブラリの最適な選択と有用な利用方法","room":"#pyconjp_5","day":"2","no":"3","elevator_pitch":"ここ数年、日本語を解析対象とする自然言語処理ライブラリが多く公開されています。BERTを手軽に利用できるTransformersなど、最先端の言語処理技術を利用できるライブラリの多くは、Pythonライブラリとして提供されています。しかし、多くのライブラリがリリースされる反面、ユーザー側の選択肢は増え、情報収集を含む技術選定コストが増加していることも事実です。そこで、本トークでは、日本語を解析対象とするPythonライブラリを整理し、利用シーンごとにライブラリを最適に選択する方法を説明します。日本語の文書分類タスクを通じて、コードの実装方法を説明し、各ライブラリの特徴や利点を解説します。","prerequisite_knowledge":"Python の基本的な使い方のみ知識として求めます。自然言語処理に関する知識は求めません。本トークでは、Google Colab で利用可能なサンプルコードを GitHub 上に公開することで、Python の前提知識によらず最先端の自然言語処理を体験できる内容を準備します。","audience_takeaway":"1. 自然言語処理の概要\n2. 日本語言語処理における前処理の実装方法とその Tips\n3. BERT を含む最先端文書分類モデルの実装方法\n4. 利用シーンごとに最適な言語処理ライブラリを選択する方法\n5. 最先端の言語処理技術を Python ライブラリ化する方法","talk_format":"Talk(30min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"## トーク概要\nここ数年、日本語を解析対象とする自然言語処理ライブラリが多く公開されています。例えば、BERT を手軽に利用できる [Transformers](https://huggingface.co/transformers/index.html#) 、ニューラル言語処理向けトークナイザの [SentencePiece](https://github.com/google/sentencepiece) や単語依存構造解析が可能な [GiNZA](https://megagonlabs.github.io/ginza/) など、最先端の言語処理技術を利用できるライブラリの多くは Python ライブラリとして提供されています。しかし、多くの Python ライブラリが世界中からリリースされる反面、ユーザー側のライブラリの選択肢は増え、情報収集を含む技術選定コストも増加しているかと思われます。\n\nそこで、本トークでは自然言語処理の最新の研究動向を踏まえ、日本語を解析対象とする Python ライブラリを整理し、各利用シーン(Web開発、研究開発、勉強用)ごとに最適なライブラリを選択する方法を説明します。具体的には、文書分類タスクを通じて、コードの実装方法をチュートリアル形式で説明することにより、各ライブラリの特徴や利点を解説します。また、ライブラリの使い方を説明するだけではなく、映画レビューのデータセットを利用したライブラリの検証結果(精度、実行速度)を含め、どのように最先端の技術を Python ライブラリ化しているのか、Python ライブラリ実装の観点から見た特徴も解説します。\n\nオンライン開催の利点を最大限に活用できるよう、本トークで説明するサンプルコードは Google Colab で利用可能な形式で GitHub 上に公開し、Python の前提知識によらず最先端の自然言語処理を体験できる内容を提供します。\n\n\n## タイムラインと紹介ライブラリの一覧\n- 導入(2min)\n - 自己紹介\n - 本トークの概要と目的説明\n- 日本語言語処理における前処理の実装方法(10min)\n - 前処理の概要とその重要性の説明\n - 形態素解析器とサブワードトークナイザの紹介([mecab-python3](https://github.com/SamuraiT/mecab-python3), [Janome](https://mocobeta.github.io/janome/), [nagisa](https://github.com/taishi-i/nagisa), [Stanza](https://github.com/stanfordnlp/stanza), [SudachiPy](https://github.com/WorksApplications/SudachiPy), [spaCy](https://spacy.io/), [GiNZA](https://megagonlabs.github.io/ginza/), [Juman++](https://github.com/ku-nlp/jumanpp), [KyTea](http://www.phontron.com/kytea/index-ja.html), [SentencePiece](https://github.com/google/sentencepiece))\n - 各解析器の機能比較\n - 各解析器の実行速度比較\n - 各利用シーン(Web開発、研究開発、勉強用)を想定した前処理機能の実装方法の説明\n- 映画レビューを分類する文書分類モデルの実装方法(14min)\n - 文書分類タスクの説明と応用事例の紹介\n - 学習器と分類アルゴリズムの紹介([scikit-learn](https://scikit-learn.org/stable/), [spaCy](https://spacy.io/), [Transformers](https://huggingface.co/transformers/index.html#), [AllenNLP](https://github.com/allenai/allennlp), [FLAIR](https://github.com/flairNLP/flair))\n - 検証用データセットの説明([Yahoo Movie Reviews](https://github.com/dennybritz/sentiment-analysis))\n - 各利用シーン(Web開発、研究開発、勉強用)を想定した文書分類モデルの実装方法と最適なライブラリの選択方法の説明\n- まとめ(2min)\n- 質疑応答(2min)","name":"池田 大志","profile":"奈良先端科学技術大学院大学 自然言語処理学研究室(松本研)出身。 現在は企業にて、自然言語処理に関する研究開発に従事。"},{"id":"215384","title":"スペシャルブースツアー","room":"#pyconjp","day":"2","no":"","elevator_pitch":"スペシャルブースを紹介するコーナーです。\nconnpassチケットをお持ちの方は、connpassページの「参加者への情報」のURL一覧からアクセスしてください。","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"スペシャルブースを紹介するコーナーです。\n\n","name":"","profile":""},{"id":"202455","title":"How to plot unstructured mesh file on Jupyter Notebook","room":"#pyconjp_1","day":"2","no":"4","elevator_pitch":"It is very important to plot the unstructured mesh and its data in scientific calculations. In Python, matplotlib is widely used to display results. However, there is not enough information abount plotting 2D and 3D unstructured grid meshes. This talk introduce the use of mayavi2 with the use of meshio and matplotlib and explains how to use them.","prerequisite_knowledge":"Jupyter Notebook\nmatplotlib","audience_takeaway":"- How to read unstructured mesh data and how visualize in Jupyter Notebook.\n- How to use mayavi2\n- How to use meshio and matplotlib\n- Developing information about meshioplt ","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Anything else basically which doesn’t fall into the types of topics above","lang_of_talk":"English","lang_of_slide":"English only","description":"- Introduction (1min)\n- Using library (10min)\n - mayavi2\n - meshio and matplotlib\n- Examples (10min)\n - plotting unstructured 2D mesh and data\n - plotting unstructured 3D mesh and data\n- development of meshioplt (5min)\n- Summary (1min)\n- Questions and answers (3min)","name":"Tetsuo Koyama","profile":"ARK Information Systems, INC. - Software Engineer (2012-)"},{"id":"203957","title":"NumPy/pandas使いのためのテスト自動化入門","room":"#pyconjp_5","day":"2","no":"4","elevator_pitch":"本トークでは、Pythonを使って数値実験やデータ処理を行う人に対して、NumPyやpandasに備わっているテスト機能について紹介します。\nJupyterNotebook上で試行錯誤しながらデータを扱う人にとって、テスト自動化の習慣は馴染みが薄いかもしれません。しかし書き捨てのコードが増えてくると、プログラムの結果に自信が持てなくなってきます。そんなとき、テストが自動化された.pyファイルに処理を移せると、本来の実験や分析に集中できるようになります。\n開発と実験のテストでは、同じ部分もあれば異なる部分もあります。 本トークでは、NumPyやpandasのテストについてTipsを紹介します。","prerequisite_knowledge":"- NumPyやpandasを使った経験があること","audience_takeaway":"- NumPyやpandasを扱うプログラムをテストする上でのTips\n","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"0%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"本トークでは、Pythonを使って数値実験やデータ処理を行う人を対象に、NumPyやpandasに備わっているテストのための機能について紹介します。\n\n▼内容\n1. 導入 (30秒)\n2. Jupyter Notebookから.pyへ (3分)\n - データ使いでもテストを書くメリット\n - 開発におけるテストとの違い\n - テストを書きやすいところ\n3. pytest (2分)\n4. NumPyのためのテスト (4分)\n5. pandasのためのテスト (4分)\n6. まとめ (30秒)","name":"Tomoko Furuki (@komo_fr)","profile":"大学では知能情報メディアを専攻し、就職後はメーカーにてソフトウエア開発とPythonによるデータ活用のPoCや機械学習の取り組みを経験。科学技術計算分野へのPythonの活用に関心があり、現在は民間の会社でPythonを使ったデータ解析を、大学では研究のためのソフトウエア開発に従事。"},{"id":"202771","title":"Pythonによる機械翻訳モデルの構築","room":"#pyconjp_4","day":"2","no":"4","elevator_pitch":"ディープラーニングの知識や実装経験はあるが、チュートリアルレベルから抜け出せない人に向けて、より実践的な内容にステップアップするための知見を紹介します。近年登場しているモデルは複雑化しており、その実装にはコーディングだけではなく、理論の理解、マシンリソースに関する知見が必須です。でもどうしたら難しい理論を理解し、マシンを適切に使いこなせるようになるのでしょうか、それはPythonと一緒に学ぶことです。このセッションでは、Pythonコードから理論を紐解き、理解する方法を紹介します。また、Google Colabで実際に手を動かしながらGPUやTPUの使用方法について解説します。","prerequisite_knowledge":" - TensorFlowの使用経験\n - ディープラーニングに関する基本的な知識\n - 自然言語処理に関する基本的な知識(尚可)","audience_takeaway":" - 実践的なディープラーニングの実装手法\n - 機械翻訳やTransformerなどの自然言語処理に関する知識\n - Google Colabの使い方\n - TPU(Tensor Processing Unit)を使用したモデルの実装方法\n - ハンズオンで使用するコード","talk_format":"Hands-on session(45min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"このセッションでは、Pythonで日本語を英語に翻訳する機械翻訳モデルを構築することを通して、実践的なディープラーニングの実装方法について学びます。まず、Transformerについて解説します。TransformerはBERTやGPT-2などに応用されており、近年の自然言語処理モデルを理解するためには欠かせない技術となっています。続いてソースコードリーディングを行い、Transformerに関する理解を深めます。ディープラーニングには数学がつきものですが、Pythonコードと一緒にモデルを追うことで、より直感的に理論を理解することができます。また、Google Colabを用いたハンズオンでは、TPUを使用するためのコードをPythonで実装します。ディープラーニングの効率的な学習にはGPUが必要ですが、最近はGPUだけでは計算しきれないモデルが登場しています。TPUはそういったモデルに有効であり、使いこなせるようになれば、ディープラーニング実装の幅が広がります。\n\n\n発表の構成は以下の通りです。\n\n# 導入(10min)\n - 自己紹介\n - このセッションの概要\n - Google Colabで実際にコードを動かしてみよう\n - 参加者はGPUで学習を実行し、機械翻訳でどんなことができるのかを確認します\n\n# Transformerの解説(10min)\n - Transformerのモデルアーキテクチャを示す図を用いて解説\n - モデルの概要や機械翻訳の仕組みを解説\n\n# ソースコードリーディング(10min)\n - Transformerのモデルアーキテクチャを示す図とPythonのソースコードを照らし合わせながら解説\n - ソースコードと同時に見ることで、理論の理解を深めます\n \n# TPUで学習してみよう(10min)\n - TPUとは何か、GPUとの違いを説明します\n - TPUで学習するためのコードをPythonで実装します\n \n# 質疑応答(5min)","name":"拳人 川崎","profile":"株式会社リーディング・エッジ社所属\n自然言語処理とディープラーニングに関する研究開発をしています"},{"id":"203568","title":"Spec-driven development for REST API","room":"#pyconjp_3","day":"2","no":"4","elevator_pitch":"API開発において、利用者向けのドキュメント\n及び操作UIを提供するのは思いの外、大変な作業です。\n特に内部向けのAPI開発の場合は時間もリソースも限られがちの為、あまり大掛かりなことはできません。\n今回はconnexionを使うことでそれを実現したのでご紹介致します。\n","prerequisite_knowledge":"RESTful APIの仕様、構造\nflask開発の経験\nswagger(OpenAPI)-uiの仕様\nYAML記法","audience_takeaway":"swagger-ui付きweb APIの作り方\n(及びサンプル)","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"0%","track":"Web programming (including web frameworks)","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"PyCon JPのスタッフ活動ではSlackやGoogleドライブなどのツールを使います。\nツールについてイケていないと感じた点をPythonで解消した例を2つ紹介します。\n\n基盤運用に向けて様々なAPI、wrapper開発が必要となります。\n元々、ネットワーク機器・サーバ機器・ストレージ機器が持つAPIを利用するための\n中間APIとして利用する為、かけられる工数、ドキュメント量の制限(少ない方が良い)等の制約があります。\n\n従って、pythonに詳しくない人が容易に動作や仕様を想像できるような開発物が求められる為、\n試行錯誤した結果、connexionというものに行き着きました。\nPyConJPの中で恐縮ではありますが、よりPythonらしくない開発を行うことで\nPythonらしく無い人にもすんなり扱えるツールのご紹介ができればと思います。\n\n構成とタイムラインは以下のとおりです。\n※サンプルでは、構成を箇条書きで示し、大きな項目に所要時間の見積もりを付けることにします。\n\n- 導入(2min)\n - 自己紹介\n - Python開発に至った経緯を紹介\n - 問題意識\n- connexionを用いたweb API開発(10min)\n - API開発と操作ツールの同時開発(リリース)が求められる現場\n - なぜ、connexionか\n - できるだけ簡易なパッケージでなければならない\n - connexionを用いた開発の仕方\n - swagger.ymlを書き、そこからコードを呼ぶ\n\t- 開発例紹介\n - まとめ (1min)\n- 質疑応答 (2min)","name":"ainamori","profile":"Akira Inamori\n - 大学卒業後、SI企業にて数年勤務した後にIIJへ入社。\n - IIJにて主に動画配信プラットフォームの設計・構築・運用に携わる\n - 動画配信基盤の構築・運用に辺りpuppet, Chef, Ansibleを経てpython nativeでの自動化に取り組む\n - 4年間のUS駐在を経て現在は社内向け基盤システム担当部署に帰任。現在はpythonにて社内システムの操作ツール、API開発を行う"},{"id":"203944","title":"詳解デコレータ ~実用的なデコレータを理解しよう~","room":"#pyconjp_2","day":"2","no":"4","elevator_pitch":"pythonビギナーの方は、デコレータの理解や利用を後回しにしてしまうのではないでしょうか。\n無理に使わなくても問題ありませんが、コードの読みやすさや量、繰り返し発生する認証処理などにはデコレータが向いています。\nデコレータ記法に苦手意識のある方、これまで使ってこなかった方は、この機会に理解を深め、使えるようになりましょう。","prerequisite_knowledge":"市販のPython入門レベルのテキストを読み終えたレベル\nこれからPythonでweb開発を始めたい人","audience_takeaway":"デコレータの理解と使い方\nデコレータが使えるシチュエーションの知識","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"flask開発ではデコレータ記法が必須であり、それ以外にも応用の幅が広いデコレータですが、python入門書では基礎レベルを超えるためページ数が割かれていない感があります。入門者が自力で理解し使いこなせるようになるのは少しハードルが高いように感じるため、実用的なコード例を紹介しデコレータに親しんで欲しいと思います。\n\nまず、デコレータの文法を手短におさらいし、シンタックスシュガーを使った表現まで解説します。\n\n次に、実際にデコレータが使われるシーンを紹介します。\n例1:ラッパーとしての利用、ログの記録、関数のパラメータを表示etc.\n例2:flaskの使用例から、ルーティング、ログイン認証の実装を紹介\n\n最後に、デコレータが2つ以上ある場合の解説をします。\n日々使っていないと混乱してしまうと思うので、補足的に解説します。\n\n\n- 導入 (2min)\n - 自己紹介\n - 課題意識\n- デコレータの文法 (5min)\n - 高階関数の書き方、@を使った書き方\n- デコレータの実用例 (5min)\n - 既存関数のwraping, 具体例2つ程度、\n - flaskでのデコレータ利用例、ルーティング、ログイン認証\n - 2つ以上のデコレータがある場合\n- まとめ(1min)\n- 質疑応答(2min)","name":"Yosuke Nakabayashi","profile":"実務経験のないアマチュアpythonista\nはやくプロのpythonistaになりたい"},{"id":"202587","title":"Python(Cython) & OpenMPで高速並列処理","room":"#pyconjp_2","day":"2","no":"5","elevator_pitch":"Pythonは遅いからCで組むといった言葉を時折耳にします。\nパフォーマンスは重要ですが、Pythonの豊富なパッケージを天秤にかけると悩ましいです。\nCythonを使えば、Pythonを使ってC言語に匹敵する速度を出すことが出来ます。更にOpenMPを使うことでループを並列化できます。\nこれらのツールは一般的なPCは勿論のこと、スーパーコンピューターでも利用できます。\nPythonの組みやすさと、Cの速さで膨大な計算に対処することを目指します。","prerequisite_knowledge":"* 並列処理についての基礎的な知識\n* Linux OSについての基礎的な知識","audience_takeaway":"* Python(Cython)とOpenMPを使用した並列処理の方法\n* CythonとOpenMPの手軽な導入方法(LinuxOS or GoogleColab)\n* 簡単なPython(Cython & OpenMP)サンプルソースとそのURL\n* スーパーコンピューターをトライアルユースする方法","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Anything else basically which doesn’t fall into the types of topics above","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":" 当セッションはCython(Python)とOpenMPの導入情報の説明をメインとして行います。\n Cythonは変数や関数の定義、GILの扱いが少し特殊ですが、Pythonコードと共存できますし、pipで簡単にインストールできるので、\nPythonを使い慣れている方であれば、すぐにキャッチアップ出来ると考えております。\n 並列処理の手法は沢山ありますが、今回はOpenMPを題材とします。Cythonにモジュールが用意されているので簡単に利用できます。\nこれはスーパーコンピュータで利用されているツールの一つですが限定的に利用されるようなものではありません。\n自宅ですぐに動作を試すことも出来ます。\n Cython及びOpenMPはJupyter Notebook(GoogleColab)でも利用できるのでコードと実行結果をお見せしながら説明していきます。\n 最後に、スーパーコンピューターのトライアルユースについて簡単に紹介します。\n一般のユーザーでも気軽に試すことが出来ることを実感頂いて、敷居を少し低くします。\n 商用利用など本格的な運用については色々と制約があるので、あまり踏み込みません。\nまずは体験してみて、継続利用についてはその後に各自が考えるという前提に立ちます。\n 将来的な利用を視野に入れ、普段からハイスペックマシンを活用出来るようなコードの組み方に慣れておくことに価値を感じて頂きたいと思います。\n\n### 構成\n\n#### 1. はじめに(1min)\n\n* 自己紹介\n* きっかけ\n\n#### 2. Cython(6min)\n\n* Cythonとは\n* インストール手順\n* Python構文と、Cython独自の構文を織り交ぜたコードの書き方\n* コンパイルと実行の方法\n* Jupyter Notebook(GoogleColab)での実行方法\n\n#### 3. OpenMP(6min)\n\n* OpenMPとは\n* インストール手順\n* prangeの使い方\n* コンパイルと実行の方法\n* Jupyter Notebook(GoogleColab)での実行方法\n\n### 4. スーパーコンピュータ(2min)\n\n* トライアルユースについて\n* 使用感について","name":"kenichi yoshimura","profile":"「pythonはいいぞ」という言葉を見かけたのが全ての始まりでした。\n今ではしがないプログラマです。"},{"id":"203945","title":"Python、ときどきRust","room":"#pyconjp_3","day":"2","no":"5","elevator_pitch":"これまでPythonで性能を改善するために、CやC++を使うことには、なかなか踏み切れなかったりしていませんでしたか?\n数年前に登場したRustは、速度や品質、並列の三拍子を揃え、ここ最近、注目を浴びている言語で、CやC++のように自分でガベージコレクションをしなくてもいいのも特徴です。 PythonからこのRustを呼び出すことで、処理を高速化させたり、逆に便利なPythonパッケージをRustから呼び出す方法を理解することで、生産性を落とさずに安全で高速なソフトウェア開発をする方法についてお話しします。","prerequisite_knowledge":"Rustというプログラム言語があることを知ってる人。\nPythonのようなスクリプト言語には、常にパフォーマンス問題がつきまとっていることを認識している人。","audience_takeaway":"これまでよりも堅牢で信頼性の高いソフトウェアを開発する方法。","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"50%","track":"Tips of development with Python","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"PythonからRustを呼んだり、逆にRustからPythonを呼ぶことで、これまでよりも生産性を高めながら性能や品質の高いアーキテクチャを準備する方法についてお話しします。","name":"あべんべん","profile":"Institution for a Global Society(IGS)株式会社に所属(上席研究員)。今から13年前にIron Pythonを使って宇宙で実験する制御装置の開発に初めてPythonを使ったのがきっかけで、それ以降も適材適所で幅広く利用。\nStart Python Clubやfin-pyなど8つのコミュニテイでスタッフの活動や、Pythonなどの技術書やビジネス書の監修・執筆・翻訳・査読なども行う。\nTwitter: @abenben"},{"id":"203893","title":"インメモリー ストリーム活用術","room":"#pyconjp_1","day":"2","no":"5","elevator_pitch":"Pythonで巨大なテキストファイルやバイナリファイルを扱った経験はありませんか?標準モジュールであるioモジュールに含まれるインメモリー ストリームStringIOおよびBytesIOを使えば効率的に扱えるかもしれません。本発表ではインメモリー ストリームの便利な使い方やその限界についてお話します。","prerequisite_knowledge":"Pythonでテキストファイルやバイナリファイルを取り扱った経験は必須です。具体的には組み込み関数openを使ったことがある人が対象です。\nインメモリー ストリームに関しては説明するので前提知識は不要です。","audience_takeaway":"- ioモジュールでテキストファイルやバイナリファイルを効率的に扱える方法、StringIOやBytesIOの限界について知ることができる\n- 普段の業務に応用できる\n- Pythonの標準モジュールの便利さを知ることができる。","talk_format":"Talk(15min)","audience_python_level":"Intermediate","audience_expertise":"50%","track":"Python core","lang_of_talk":"Japanese","lang_of_slide":"Both","description":"Pythonファイルオブジェクトを扱う標準的な方法は組み込み関数openですが、その背後にはioモジュールが存在します。\nioモジュールはPythonのストリーム(file オブジェクト)を扱うためのモジュールで、その中にインメモリストリームであるStringIOとBytesIOが含まれます。\n本発表では、StringIOとBytesIOの使い方や実務を通して得た経験を伝えたいと思います。\n\n- Pythonでファイルを扱う普通の方法:open()\n - open()は便利である\n - open()はDisk IOを伴う\n- インメモリー ストリームStringIOおよびBytesIO\n - メモリ上のIOなので十分高速\n - メモリ上に載せるので巨大すぎると大変\n- ケーススタディ:インターネット経由で巨大なファイルを取得して加工して戻す\n - 巨大なファイルをディスクに書き込むと時間がかかる\n - 大規模な分散システム基盤は使いたくないしそもそも存在しなかった\n - StringIOとBytesIOを駆使してメモリ上でZIP圧縮まで行う\n- まとめ","name":"Hayao Suzuki","profile":"電気通信大学大学院 情報理工学研究科 総合情報学専攻 博士前期課程修了、修士(工学)。\n株式会社アイリッジにてスマートフォンアプリのバックエンドサーバーをPythonやDjangoで開発している。"},{"id":"203888","title":"機械学習の実装から考えるオブジェクト指向","room":"#pyconjp_5","day":"2","no":"5","elevator_pitch":"機械学習のモデルに関する実装をする中で、その複雑性に頭を抱える人は多いのではないでしょうか。\nこのトークでは、複雑な機械学習の実装を少しでも見通しよくするために、オブジェクト指向がどのように使用されているかについて2つ共有したいと思います。\n1つ目はオブジェクト指向の三大要素について、機械学習の実装とどう関わっているか概念的なところを説明します。\n2つ目は画像認識のモデルを例に実装において実際にオブジェクト指向がどのように機能しているかの説明したいと思います。\nこのトークを聞くことで、機械学習モデルの実装におけるオブジェクト指向の使用イメージをつかめることでしょう。","prerequisite_knowledge":"Pythonや何らかのプログラミング言語\n機械学習の実装経験","audience_takeaway":"・オブジェクト指向の三大要素である継承、カプセル化、ポリモーフィズムについての知識\n・三大要素が機械学習の実装で実際に使用されている場面\n・機械学習の実装においてオブジェクト指向が有意義であること","talk_format":"Talk(15min)","audience_python_level":"Beginner","audience_expertise":"50%","track":"Data Science / Machine Learning","lang_of_talk":"Japanese","lang_of_slide":"Japanese only","description":"機械学習のその処理の複雑さから実装が複雑になりがちです。\nオブジェクト指向を意識して書くことで複雑な処理でも見通しが良くなり、メンテナンス性も向上したのでその話をさせていただきたいと思います。\n\nまず、最初に機械学習の実装におけるオブジェクト指向の説明をします。\n特に機械学習のモデルの実装をする上で、モデルによって共通する部分というのは少なからずできてくるので、それらをオブジェクト指向を使ってどのように実装しているかを話します。\n\n次に、実際に実装例を画像認識のモデルを用いて説明します。\nそれぞれのモデルの実装の中で、どこがオブジェクト指向の要素なのかを紐解いていきます。\n\n# 導入(3min)\n## 自己紹介\n## 問題意識\n\n# 機械学習の実装におけるオブジェクト指向(6min)\n## 機械学習の実装は複雑\n## その解決方法としてのオブジェクト指向\n## オブジェクト指向の三大要素\n## 使用される場面\n\n# 実装例(3min)\n## 物体検出と超解像と姿勢推定を具体例に説明\n\n# まとめ (1min)\n# 質疑応答 (2min)","name":"はんぺん","profile":"# 自己紹介\n- はんぺん([@hampen2929](https://twitter.com/hampen2929))\n\n# 経歴\n- 2015年3月\t 東北大学工学部卒業\n- 2016年\t Fraunhofer IISB (ドイツ留学)\n- 2018年3月 東北大学大学院工学研究科卒業\n- 2018年4月〜現在\tIT系企業ので機械学習エンジニア\n\n# テニス歴\n- 2013年11月\t 宮城県大会・準優勝(シングルス)\n- 2014年2月\t 宮城県学生選抜大会・ベスト4(シングルス)\n- 2014年5月\t 東北地区大会・ベスト8(シングルス)\n- 2014年5月\t 東北地区大会・準優勝(ダブルス)\n- 2014年8月\t 全日本学生テニス選手権大会出場(ダブルス)\n- 2018年11月 \t宮城県選抜ダブルス選手権大会ベスト4\n\n# 興味\n- 機械学習\n- テニス\n- 画像処理\n- 動画分析\n\n# 趣味\n- テニスのフォームの分析\n- テニスの試合映像からの人の位置と姿勢、ボールの位置、コートの位置の検出\n\n# 連絡先\n- yuya.mochimaru.ym@gmail.com\n\n# URL\nhttps://github.com/hampen2929/bio\n"},{"id":"214740","title":"Closing (Day 2)","room":"#pyconjp_1","day":"2","no":"","elevator_pitch":"2日目のクロージングです。\nDay2 Closing.\nYouTube Live: https://youtu.be/7HCJD4oxfuo","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"Both","description":"2日目のクロージングです。\nDay2 Closing.\nYouTube Live: https://youtu.be/7HCJD4oxfuo","name":"","profile":""},{"id":"215531","title":"Online Party","room":"#pyconjp_1","day":"2","no":"","elevator_pitch":"Zoomでのオンラインパーティを開催します。\n飲み物・食べ物は各自ご用意をお願いします。\n※connpassチケットが必要です。connpassページの「参加者への情報」に記載のURL一覧よりアクセスください。\n\nWe are planning Online Party. Details will be updated here.\nPrepare drinks & foods by yourself.\n* connpass ticket is required. See URL list on \"information for ticket holder(参加者への情報)\" on the connpass page for the URL.","prerequisite_knowledge":"","audience_takeaway":"","talk_format":"","audience_python_level":"","audience_expertise":"","track":"","lang_of_talk":"","lang_of_slide":"","description":"Zoomでのオンラインパーティを開催します。\n飲み物・食べ物は各自ご用意をお願いします。\n※connpassチケットが必要です。connpassページの「参加者への情報」に記載のURL一覧よりアクセスください。\n\nWe are planning Online Party. Details will be updated here.\nPrepare drinks & foods by yourself.\n* connpass ticket is required. See URL list on \"information for ticket holder(参加者への情報)\" on the connpass page for the URL.\n\n","name":"","profile":""}],"dir":"/","path":"/talks","extension":".csv","slug":"talks","createdAt":"2020-10-11T06:45:20.210Z","updatedAt":"2020-10-11T06:45:20.210Z","meta":{"version":0,"revision":0,"created":1606828155153},"$loki":1}],"idIndex":[1],"maxId":1,"_dirty":true,"_nestedProperties":[],"transactional":false,"asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"cloneObjects":false,"cloneMethod":"deep","changes":[],"_fullTextSearch":{"ii":{"title":{"_store":true,"_optimizeChanges":true,"docCount":0,"docStore":[],"totalFieldLength":0,"root":{}},"description":{"_store":true,"_optimizeChanges":true,"docCount":0,"docStore":[],"totalFieldLength":0,"root":{}},"slug":{"_store":true,"_optimizeChanges":true,"docCount":1,"docStore":[[0,{"fieldLength":1}]],"totalFieldLength":1,"root":{"k":[116],"v":[{"k":[97],"v":[{"k":[108],"v":[{"k":[107],"v":[{"k":[115],"v":[{"d":{"df":1,"dc":[[0,1]]}}]}]}]}]}]}},"text":{"_store":true,"_optimizeChanges":true,"docCount":0,"docStore":[],"totalFieldLength":0,"root":{}}}}}],"databaseVersion":1.5,"engineVersion":1.5,"filename":"content.db","_persistenceAdapter":null,"_persistenceMethod":null,"_throttledSaves":true} \ No newline at end of file diff --git a/2020/_nuxt/f6e58993164507db62c5.js b/2020/_nuxt/f6e58993164507db62c5.js new file mode 100644 index 0000000..efce7f0 --- /dev/null +++ b/2020/_nuxt/f6e58993164507db62c5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{0:function(t,e,n){"use strict";n.d(e,"u",(function(){return r})),n.d(e,"p",(function(){return o})),n.d(e,"j",(function(){return c})),n.d(e,"s",(function(){return l})),n.d(e,"k",(function(){return d})),n.d(e,"t",(function(){return m})),n.d(e,"n",(function(){return h})),n.d(e,"r",(function(){return f})),n.d(e,"l",(function(){return _})),n.d(e,"m",(function(){return y})),n.d(e,"h",(function(){return x})),n.d(e,"v",(function(){return v})),n.d(e,"i",(function(){return w})),n.d(e,"q",(function(){return k})),n.d(e,"f",(function(){return j})),n.d(e,"b",(function(){return O})),n.d(e,"e",(function(){return P})),n.d(e,"c",(function(){return E})),n.d(e,"d",(function(){return C})),n.d(e,"g",(function(){return L})),n.d(e,"a",(function(){return D})),n.d(e,"o",(function(){return R}));var r={fallbackLocale:"ja",silentTranslationWarn:!0,messages:{ja:{pages:{index:{title:"PyCon JP 2020",path:"/"},"code-of-conduct":{title:"行動規範",path:"code-of-conduct"},"event-list":{title:"イベント一覧","content-list":[{title:"タイムテーブル",path:"timetable"},{title:"スペシャルブース",path:"special-booth"},{title:"チュートリアル",path:"tutorial"},{title:"スプリント",path:"sprint"},{title:"ユースコーダーワークショップ",path:"youth-coder"},{title:"YouTube Live配信一覧",path:"youtube-live"}]},sponsor:{title:"スポンサー",path:"sponsor"},news:{title:"お知らせ",path:"https://pyconjp.blogspot.com/search/label/pyconjp2020"},staff:{title:"スタッフ",path:"staff"}},language:"English",error:{404:"お探しのページが見つかりません。",else:"エラーが発生しました",back:"トップページに戻る"},sponsor:{platinum:[{companyName:"株式会社リーディング・エッジ社(Python Start Lab Online)",url:"https://startlab.jp/",imagePath:"platinum1.jpg",description:"先端技術分野で最も採用されているPythonは、これまではアンテナ感度の高い一部のITエンジニアだけが習得していましたが、いまや経営層や広く一般の方までもが注目するプログラミング言語になってきました。私たちPython Start Lab Onlineは、IT未経験からエンジニアになりたい人だけでなく、だれもが使えるプログラミング言語としてPythonを選択できる世の中にすることを目指し、ITエンジニアスクールを運営しています。Pythonに関わるひとりでも多くの人と向き合い、成長の機会をつくる教育事業を通してPythonistaに貢献してゆきたいと考えています。",recruitInformation:""},{companyName:"HENNGE株式会社",url:"https://hennge.com/jp/",imagePath:"platinum2.jpg",description:"HENNGEは、変化する働き⽅の最前線にいます。私たちは変⾰をもたらすテクノロジーの⼒を活⽤し、それを誰もが安全に利⽤できるように提供しています。クラウドセキュリティサービス「HENNGE One」を利⽤することで、お客様はどこからでもクラウドの⼒を安全に活⽤し、柔軟な作業環境を導⼊することが可能になります。クラウドセキュリティを活⽤することで、従業員はよりスマートに仕事に集中し、仕事の質を向上させ、ビジネスの成果を上げることができます。",recruitInformation:"事業の成⻑に伴いソフトウェアエンジニアを募集しています。私たちHENNGEは「テクノロジーの解放」をビジョンに、テクノロジーとその利⽤におけるギャップの橋渡し役として、お客様に新しい価値を提供することを使命としています。10カ国以上から集まった仲間とともに、アーリーアダプターとして新しいテクノロジーやフレームワークに⾃ら触れ、得られた成果を⾼品質なサービスとしてお客様に届けるチームに加わっていただける⽅からの応募をお待ちしております。"},{companyName:"日本マイクロソフト株式会社",url:"https://azure.microsoft.com/ja-jp/",imagePath:"platinum3.png",description:"MicrosoftはPythonistaを応援しています! オンライン上の共同開発環境であるAzure NotebooksやVisual Studio Codespaces、アプリケーションを開発する皆様には、Azure Functionsの拡張機能としてステートフル関数を記述できるDurable FunctionsのPythonのサポートも開始されました(プレビュー版)。Functionフロー管理ができます! Pythonistaに向けて今後も機能追加/改修を行っていきます! お楽しみに!",recruitInformation:""}],gold:[{companyName:"一般社団法人Pythonエンジニア育成推進協会",url:"https://www.pythonic-exam.com/",imagePath:"gold1.png",description:"Pythonエンジニア認定基礎試験に加え、6月よりPython3エンジニア認定データ分析試験を開始しました。全国200か所で通年受験が可能です。受験料金は1万円(税抜)で学生は半額です。学習後のチェックにいかがでしょうか?",recruitInformation:""},{companyName:"株式会社アイリッジ",url:"https://iridge.jp/",imagePath:"gold2.jpg",description:"「Tech Tomorrow」をミッションに、自社プロダクト開発やスマートフォンアプリの受託開発を行なっています。 Python/Djangoを使ったO2O/OMOソリューション「FANSHIP」を始めとして、アプリのバックエンドサーバー、業務を改善するちょっとしたスクリプトまでPythonで開発しています。技術カンファレンスへの協賛や、個人の取組に関する週次のもくもく会・FlyHigh Friday、月次の集中開発・Issue Bashなどの社内勉強会も活発で、技術力向上に積極的です。",recruitInformation:""},{companyName:"株式会社ブレインパッド",url:"https://www.brainpad.co.jp/",imagePath:"gold3.png",description:"2004年創業来、「データ活用の促進を通じて持続可能な未来をつくる」をミッションに掲げ、クライアントに対して、ビジネス・顧客体験・オペレーションにおいて先進的で実践的なデータ活用支援をおこなっています。分析業務に必要となる分析基盤の構築や関連ソフトウェアの開発・販売など、データ活用に関するソリューションを総合的に提供しており、国内トップクラスのレコメンドエンジン搭載プライベートDMP Rtoasterをはじめとした、デジタルマーケティング領域のプロダクトを開発する、Pythonエンジニアを募集しています!",recruitInformation:""},{companyName:"株式会社いい生活",url:"https://www.e-seikatsu.info/",imagePath:"gold4.png",description:'いい生活は「すべての人の生活に関わる"不動産市場"を、テクノロジーでより良いものへ。」をミッションに掲げ、不動産業界で起きている情報の格差、非効率性を改善するサービスの提供を行っています。不動産ビジネスの生産性向上のための「ESいい物件One」、住まいに関するコミュニケーションをサポートする「pocketpost」などを開発しています。いい生活は、ITサービスを通じて、住まい・不動産の分野において、もっと多くの「幸せ」や「いい生活」を実現してまいります。',recruitInformation:""},{companyName:"株式会社ビザスク",url:"https://visasq.co.jp/",imagePath:"gold5.png",description:"ビザスクは、求める知見を持つアドバイザーから直接話が聞ける1時間からのスポットコンサルサービスを主軸に、企業の課題を解決するナレッジプラットフォームとして大手企業の新規事業開発や、ベンチャー企業の市場調査と様々な場面で利用されております。既に国内外で10万人以上のアドバイザーが登録していますが、これをさらに20万人、100万人と成長させ、グローバル展開も積極的に進めていきます。Python/Django、Vue.js、Elasticsearch、GCPと新しい技術を取り入れ開発を進めています。Pythonエンジニア募集中です!",recruitInformation:""},{companyName:"株式会社日本システム技研",url:"https://jsl.co.jp",imagePath:"gold6.png",description:"株式会社日本システム技研(JSL)は「「技術力×人間力」で社会から注目され続ける企業になること」をビジョンに長野でPythonとAWSを中心としたWebの業務を中心に開発をしています。積極的に外部への情報発信を行うためコワーキングスペースGEEKLAB.NAGANO(ギークラボ・ナガノ)を運営しています。GEEKLAB.NAGANOは、PythonやDjango、AWS、ディープラーニング、IoTなど新しい技術に関心があるエンジニアが集まり勉強会を開催しています。",recruitInformation:""},{companyName:"株式会社LegalForce",url:"https://www.legalforce.co.jp/",imagePath:"gold7.png",description:"LegalForceはAIを用いたクラウド型契約書レビュー支援ソフトウェア 「LegalForce」を提供しています。契約書をアップロードすると、自動で契約書に含まれるリスクに対してアラートを出し、修正文例をサジェストします。開発はPythonやRuby、JavaScriptを中心としており、FlaskやFastAPIを用いたWebアプリケーションやElasticsearchを用いた検索システム、BigQueryを用いたデータ基盤、MLOps基盤、自然言語処理システムの開発を行っています。Pythonエンジニアを積極募集中!!",recruitInformation:""},{companyName:"ジョンソン・エンド・ジョンソン 日本法人グループ",url:"https://www.jnj.co.jp/",imagePath:"gold8.png",description:"私たちは、健康こそが豊かな人生の基盤であり、社会の繁栄と発展を促す源であると考え、すべての世代の、人生のあらゆる段階の人々の健康を支えてきました。世界最大級のヘルスケア企業としての強みを活かし、誰もがどこにいても心身の健康と健全な環境を享受できるよう、私たちのこころと科学の力、画期的な発想力を融合させ、ヘルスケアを飛躍的に進化させるべく取り組んでいます。私たちは今、データの力を活用して更に成長しています。データ分析や機械学習を駆使して、日本から世界へ製品やサービスを発信する仲間を探しています。",recruitInformation:""}],silver:[{companyName:"株式会社オープングルーヴ",url:"https://tracpath.com/"},{companyName:"Nexedi",url:"https://www.nexedi.com/"},{companyName:"OLTA株式会社",url:"https://corp.olta.co.jp"},{companyName:"Classi株式会社",url:"https://corp.classi.jp/"},{companyName:"株式会社ビープラウド",url:"https://www.beproud.jp/"},{companyName:"Supership株式会社",url:"https://supership.jp/"},{companyName:"株式会社JX通信社",url:"https://jxpress.net/"},{companyName:"株式会社スカラコミュニケーションズ",url:"https://scala-com.jp/"}],special:{cooperation:[{companyName:"株式会社チェリオコーポレーション",url:"https://www.cheerio.co.jp/",imagePath:"special1.jpg",description:"",recruitInformation:""}],tutorial:[{groupName:"Python駿河",url:"https://py-suruga.connpass.com/",imagePath:"tutorial1.png",description:"Python Boot Camp in 静岡県藤枝市の開催をきっかけにPython駿河(するが)が誕生しました!プログラミング言語Pythonに興味のある方のために、様々なテーマで勉強会を開催していくことが目標です。主に静岡県中部地方を中心として活動していく予定です。"},{groupName:"Unagi.py",url:"https://unagi-py.connpass.com/",imagePath:"tutorial2.png",description:"Unagi.pyは、主に浜名湖の周辺に生息しているIT技術者で構成されているPython勉強会コミュニティーです。勉強会は、浜松市を主な拠点とし豊橋・湖西・磐田・掛川・静岡市での開催も考えています。内容については、参加者の興味次第でその毎回テーマを決めてやってます。何か今が旬の話題がありましたら、是非、いっしょに勉強しましょう!また、勉強会以外にもオンラインでSlack にて情報交換や勉強会フォローを行っています。"},{groupName:"はんなりPythonの会",url:"https://hannari-python.connpass.com/",imagePath:"tutorial3.png",description:"はんなりPythonの会は京都のPythonコミュニティです。毎月第3金曜日に勉強会を開催しています。入門者、初心者にやさしい会です。kyoto.py の後継コミュニティです。はんなりPythonの会 公式ブログにて勉強会の様子など様々な情報をお知らせしています。オンラインでの交流などはComunity Chatで行っています。"},{groupName:"PyData Osaka",url:"https://medium.com/pydata-osaka",imagePath:"tutorial4.png",description:"PyData Osaka はデータ分析に関わるユーザやツールの開発者のためのグループであり、関西を中心に活動しています。主にPythonを使ったツールを取り上げることが多いですが、Pythonに限定せず、他のプログラミング言語やデータ分析のための一般的な技術、例えばデータ前処理、機械学習、可視化など、データ分析に関わる内容を広く扱っています。アイデアを共有し共に学んでいくための場として活用していただければと思っています。"},{groupName:"PyCon mini Hiroshima",url:"https://hiroshima.pycon.jp/2020/",imagePath:"tutorial5.png",description:"私たちの今回のテーマは「つながろう Python」です。「つながる Python」は PyCon JP 2012 のテーマでした。 Python はいろいろな技術やシステムをつなぐ手段として、便利なツールです。 一方で Python でつながった人や組織やコミュニティも、 私たちの経験、宝物になりました。今回は広島から、私たちの地域に向けて、また地域を超えて、 Python の技術とコミュニティを愛する人たちに「つながろう」と呼び掛けます。"}],media:[{name:"株式会社オライリー・ジャパン",url:"https://www.oreilly.co.jp/index.shtml",imagePath:"media1.png"},{name:"アイティメディア株式会社",url:"https://www.atmarkit.co.jp/",imagePath:"media2.png"},{name:"株式会社技術評論社",url:"https://gihyo.jp/",imagePath:"media3.jpg"},{name:"株式会社インプレス",url:"https://thinkit.co.jp/",imagePath:"media4.png"},{name:"株式会社翔泳社",url:"https://codezine.jp/",imagePath:"media5.png"},{name:"ログミー株式会社",url:"https://logmi.jp/tech",imagePath:"media6.png"}]},message:{specialSponsor:"特別協賛",tutorial:"チュートリアル",media:"メディアスポンサー"},patron:[{name:"GitHub30",connpassLink:"https://connpass.com/user/salamander_jp/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/158194/d3a036a32afb40dd97eb38eb66f20ca4.jpg"},{name:"あべんべん",connpassLink:"https://connpass.com/user/abenben/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/5763/944658953c344f7ea74907af1c3dd394.jpg"},{name:"shimizukawa",connpassLink:"https://connpass.com/user/shimizukawa/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/16/d01c102f0c5e46edaa775099752ada0c.png"},{name:"kioto",connpassLink:"https://connpass.com/user/takaneh/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/46790/04a1d74cec424258aee178925b2e38c9.jpg"},{name:"hrsano645",connpassLink:"https://connpass.com/user/hrsano645/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/12331/eb425b2ce2264885bb04c68d057af320.jpg"},{name:"h_tsk",connpassLink:"https://connpass.com/user/h_tsk/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/4897/5c2d7bd653ab4752ac998e43f6821779.jpg"},{name:"_stakaya",connpassLink:"https://connpass.com/user/_stakaya/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/117340/826beef3b6e44df69312354a5a3546ff.jpg"},{name:"rokujyouhitoma",connpassLink:"https://connpass.com/user/rokujyouhitoma/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/248/1bfbb312cb4c432597f418a0c5034644.jpeg"},{name:"佐藤 治夫",connpassLink:"https://connpass.com/user/haru860/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/8/c25ca78c194c4e55b46025b52aff9437.jpg"},{name:"jbking",connpassLink:"https://connpass.com/user/jbking/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/94/a9480b3253cb46dfba1829ade86746c7.jpeg"},{name:"tell-k",connpassLink:"https://connpass.com/user/tell-k/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/1/47bef409c76d43979794b19845e676ca.png"},{name:"kohei_sakamoto",connpassLink:"https://connpass.com/user/kohei_sakamoto/",iconImageLink:""}]}},en:{pages:{index:{title:"PyCon JP 2020",path:"/"},"code-of-conduct":{title:"Code of Conduct",path:"code-of-conduct"},"event-list":{title:"Event List","content-list":[{title:"TimeTable",path:"timetable"},{title:"Special Booth",path:"special-booth"},{title:"Tutorial",path:"tutorial"},{title:"Sprint",path:"sprint"},{title:"Youth Coder Workshop",path:"youth-coder"},{title:"YouTube Live Delivery List",path:"youtube-live"}]},sponsor:{title:"Sponsor",path:"sponsor"},news:{title:"News",path:"https://pyconjp.blogspot.com/search/label/pyconjp2020"},staff:{title:"Staff",path:"staff"}},language:"日本語",error:{404:"Page not found",else:"Sorry, something went wrong",back:"Back to Homepage"},sponsor:{platinum:[{companyName:"株式会社リーディング・エッジ社(Python Start Lab Online)",url:"https://startlab.jp/",imagePath:"platinum1.jpg",description:"私たちPython Start Lab Onlineは、IT未経験からエンジニアになりたい人だけでなく、だれもが使えるプログラミング言語としてPythonを選択できる世の中にすることを目指し、ITエンジニアスクールを運営しています。Pythonに関わるひとりでも多くの人と向き合い、成長の機会をつくる教育事業を通してPythonistaに貢献してゆきたいと考えています。",recruitInformation:""},{companyName:"HENNGE株式会社",url:"https://hennge.com/jp/",imagePath:"platinum2.jpg",description:"HENNGE is at the forefront of the changing workplace. In a world of constant change, weharness the power of transformative technology and make it accessible and secure for all.Cloud security service “HENNGE One” enables customers to adopt flexible workenvironments and safely harness the power of the cloud from any location. With cloudsecurity taken care of, employees are free to focus on working smarter, improving qualityand achieving business results.",recruitInformation:"As our business continues to grow, we are looking for talented software engineers to join ourteam.Under our vision, “liberation of technology”, HENNGE’s mission is to deliver new values tocustomers by bridging the gap between technology and its usage. We are looking forengineers who wish to join the team with members from over 10 countries. We try newtechnology and frameworks as early adopters and deliver the result to our customers bymaking it high-quality services."},{companyName:"日本マイクロソフト株式会社",url:"https://azure.microsoft.com/ja-jp/",imagePath:"platinum3.png",description:"Microsoft is cheering for Pythonista! In addition to the online collaborative development environments Azure Notebooks and Visual Studio Codespaces, application developers now also have support for Python in Durable Functions, an extension to Azure Functions that allows you to write stateful functions (in preview). Functions flow management is now available! We’ll continue to add/modify features for Pythonista in the future! Stay tuned!",recruitInformation:""}],gold:[{companyName:"一般社団法人Pythonエンジニア育成推進協会",url:"https://www.pythonic-exam.com/",imagePath:"gold1.png",description:"Pythonエンジニア認定基礎試験に加え、6月よりPython3エンジニア認定データ分析試験を開始しました。全国200か所で通年受験が可能です。受験料金は1万円(税抜)で覚張は半額です。学習後のチェックにいかがでしょうか?",recruitInformation:""},{companyName:"株式会社アイリッジ",url:"https://iridge.jp/",imagePath:"gold2.jpg",description:"「Tech Tomorrow」をミッションに、自社プロダクト開発やスマートフォンアプリの受託開発を行なっています。 Python/Djangoを使ったO2O/OMOソリューション「FANSHIP」を始めとして、アプリのバックエンドサーバー、業務を改善するちょっとしたスクリプトまでPythonで開発しています。技術カンファレンスへの協賛や、個人の取組に関する週次のもくもく会・FlyHigh Friday、月次の集中開発・Issue Bashなどの社内勉強会も活発で、技術力向上に積極的です。",recruitInformation:""},{companyName:"株式会社ブレインパッド",url:"https://www.brainpad.co.jp/",imagePath:"gold3.png",description:"2004年創業来、「データ活用の促進を通じて持続可能な未来をつくる」をミッションに掲げ、クライアントに対して、ビジネス・顧客体験・オペレーションにおいて先進的で実践的なデータ活用支援をおこなっています。分析業務に必要となる分析基盤の構築や関連ソフトウェアの開発・販売など、データ活用に関するソリューションを総合的に提供しており、国内トップクラスのレコメンドエンジン搭載プライベートDMP Rtoasterをはじめとした、デジタルマーケティング領域のプロダクトを開発する、Pythonエンジニアを募集しています!",recruitInformation:""},{companyName:"株式会社いい生活",url:"https://www.e-seikatsu.info/",imagePath:"gold4.png",description:'いい生活は「すべての人の生活に関わる"不動産市場"を、テクノロジーでより良いものへ。」をミッションに掲げ、不動産業界で起きている情報の格差、非効率性を改善するサービスの提供を行っています。不動産ビジネスの生産性向上のための「ESいい物件One」、住まいに関するコミュニケーションをサポートする「pocketpost」などを開発しています。いい生活は、ITサービスを通じて、住まい・不動産の分野において、もっと多くの「幸せ」や「いい生活」を実現してまいります。',recruitInformation:""},{companyName:"株式会社ビザスク",url:"https://visasq.co.jp/",imagePath:"gold5.png",description:"ビザスクは、求める知見を持つアドバイザーから直接話が聞ける1時間からのスポットコンサルサービスを主軸に、企業の課題を解決するナレッジプラットフォームとして大手企業の新規事業開発や、ベンチャー企業の市場調査と様々な場面で利用されております。既に国内外で10万人以上のアドバイザーが登録していますが、これをさらに20万人、100万人と成長させ、グローバル展開も積極的に進めていきます。Python/Django、Vue.js、Elasticsearch、GCPと新しい技術を取り入れ開発を進めています。Pythonエンジニア募集中です!",recruitInformation:""},{companyName:"株式会社日本システム技研",url:"https://jsl.co.jp",imagePath:"gold6.png",description:'Japan System Laboratory Co.,Ltd. (JSL) "To become a company that continues to attract attention from society with" technical power x human power in NaganoWith the vision, we are developing mainly web operations centered on Python and AWS.We operate the coworking space GEEKLAB.NAGANO to actively disseminate information to the outside.At GEEKLAB.NAGANO, engineers who are interested in new technologies such as Python, Django, AWS, deep learning, and IoT gather to hold study sessions.',recruitInformation:""},{companyName:"株式会社LegalForce",url:"https://www.legalforce.co.jp/",imagePath:"gold7.png",description:"LegalForce offers a cloud-based contract review software using AI.When a contract is uploaded, alerts pop-up showing problematic clauses and modifications are suggested.We use Python, Ruby, and JavaScript to develop our software in web applications using Flask and FastAPI, search systems using Elasiticsearch, Data Infrastructure using BigQuery, MLOps, NLP systems.We are actively recruiting Python engineers!! ",recruitInformation:""},{companyName:"ジョンソン・エンド・ジョンソン 日本法人グループ",url:"https://www.jnj.co.jp/",imagePath:"gold8.png",description:"We believe good health is the foundation of vibrant lives and thriving communities, and have kept people well at every age and every life stage. As the world's largest health care company, we strive to create healthier communities and put a healthy mind, body and environment within reach of everyone, everywhere. We are blending our heart, science and ingenuity to profoundly change the trajectory of health for humanity. We are growing in a data-driven way and looking for data scientists to our team. YOU will be the pioneer to deliver products and services.",recruitInformation:""}],silver:[{companyName:"株式会社オープングルーヴ",url:"https://tracpath.com/"},{companyName:"Nexedi",url:"https://www.nexedi.com/"},{companyName:"OLTA株式会社",url:"https://corp.olta.co.jp"},{companyName:"Classi株式会社",url:"https://corp.classi.jp/"},{companyName:"株式会社ビープラウド",url:"https://www.beproud.jp/"},{companyName:"Supership株式会社",url:"https://supership.jp/"},{companyName:"株式会社JX通信社",url:"https://jxpress.net/"},{companyName:"株式会社スカラコミュニケーションズ",url:"https://scala-com.jp/"}],special:{cooperation:[{companyName:"株式会社チェリオコーポレーション",url:"https://www.cheerio.co.jp/",imagePath:"special1.jpg",description:"",recruitInformation:""}],tutorial:[{groupName:"Python駿河",url:"https://py-suruga.connpass.com/",imagePath:"tutorial1.png",description:"Python Boot Camp in 静岡県藤枝市の開催をきっかけにPython駿河(するが)が誕生しました!プログラミング言語Pythonに興味のある方のために、様々なテーマで勉強会を開催していくことが目標です。主に静岡県中部地方を中心として活動していく予定です。"},{groupName:"Unagi.py",url:"https://unagi-py.connpass.com/",imagePath:"tutorial2.png",description:"Unagi.pyは、主に浜名湖の周辺に生息しているIT技術者で構成されているPython勉強会コミュニティーです。勉強会は、浜松市を主な拠点とし豊橋・湖西・磐田・掛川・静岡市での開催も考えています。内容については、参加者の興味次第でその毎回テーマを決めてやってます。何か今が旬の話題がありましたら、是非、いっしょに勉強しましょう!また、勉強会以外にもオンラインでSlack にて情報交換や勉強会フォローを行っています。"},{groupName:"はんなりPythonの会",url:"https://hannari-python.connpass.com/",imagePath:"tutorial3.png",description:"はんなりPythonの会は京都のPythonコミュニティです。毎月第3金曜日に勉強会を開催しています。入門者、初心者にやさしい会です。kyoto.py の後継コミュニティです。はんなりPythonの会 公式ブログにて勉強会の様子など様々な情報をお知らせしています。オンラインでの交流などはComunity Chatで行っています。"},{groupName:"PyData Osaka",url:"https://medium.com/pydata-osaka",imagePath:"tutorial4.png",description:"PyData Osaka はデータ分析に関わるユーザやツールの開発者のためのグループであり、関西を中心に活動しています。主にPythonを使ったツールを取り上げることが多いですが、Pythonに限定せず、他のプログラミング言語やデータ分析のための一般的な技術、例えばデータ前処理、機械学習、可視化など、データ分析に関わる内容を広く扱っています。アイデアを共有し共に学んでいくための場として活用していただければと思っています。"},{groupName:"PyCon mini Hiroshima",url:"https://hiroshima.pycon.jp/2020/",imagePath:"tutorial5.png",description:"私たちの今回のテーマは「つながろう Python」です。「つながる Python」は PyCon JP 2012 のテーマでした。 Python はいろいろな技術やシステムをつなぐ手段として、便利なツールです。 一方で Python でつながった人や組織やコミュニティも、 私たちの経験、宝物になりました。今回は広島から、私たちの地域に向けて、また地域を超えて、 Python の技術とコミュニティを愛する人たちに「つながろう」と呼び掛けます。"}],media:[{name:"O'Reilly Japan, Inc.",url:"https://www.oreilly.co.jp/index.shtml",imagePath:"media1.png"},{name:"ITmedia Inc.",url:"https://www.atmarkit.co.jp/",imagePath:"media2.png"},{name:"Gijutsu-Hyohron Co., Ltd",url:"https://gihyo.jp/",imagePath:"media3.jpg"},{name:"Impress Corporation",url:"https://thinkit.co.jp/",imagePath:"media4.png"},{name:"SHOEISHA",url:"https://codezine.jp/",imagePath:"media5.png"},{name:"Logmi, Inc.",url:"https://logmi.jp/tech",imagePath:"media6.png"}]},message:{specialSponsor:"Special Sponsor",tutorial:"Tutorial",media:"Media Sponsor"},patron:[{name:"GitHub30",connpassLink:"https://connpass.com/user/salamander_jp/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/158194/d3a036a32afb40dd97eb38eb66f20ca4.jpg"},{name:"あべんべん",connpassLink:"https://connpass.com/user/abenben/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/5763/944658953c344f7ea74907af1c3dd394.jpg"},{name:"shimizukawa",connpassLink:"https://connpass.com/user/shimizukawa/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/16/d01c102f0c5e46edaa775099752ada0c.png"},{name:"kioto",connpassLink:"https://connpass.com/user/takaneh/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/46790/04a1d74cec424258aee178925b2e38c9.jpg"},{name:"hrsano645",connpassLink:"https://connpass.com/user/hrsano645/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/12331/eb425b2ce2264885bb04c68d057af320.jpg"},{name:"h_tsk",connpassLink:"https://connpass.com/user/h_tsk/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/4897/5c2d7bd653ab4752ac998e43f6821779.jpg"},{name:"_stakaya",connpassLink:"https://connpass.com/user/_stakaya/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/117340/826beef3b6e44df69312354a5a3546ff.jpg"},{name:"rokujyouhitoma",connpassLink:"https://connpass.com/user/rokujyouhitoma/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/248/1bfbb312cb4c432597f418a0c5034644.jpeg"},{name:"佐藤 治夫",connpassLink:"https://connpass.com/user/haru860/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/8/c25ca78c194c4e55b46025b52aff9437.jpg"},{name:"jbking",connpassLink:"https://connpass.com/user/jbking/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/94/a9480b3253cb46dfba1829ade86746c7.jpeg"},{name:"tell-k",connpassLink:"https://connpass.com/user/tell-k/",iconImageLink:"https://connpass-tokyo.s3.amazonaws.com/user/1/47bef409c76d43979794b19845e676ca.png"},{name:"kohei_sakamoto",connpassLink:"https://connpass.com/user/kohei_sakamoto/",iconImageLink:""}]}}}},o=[{code:"ja",iso:"ja",name:"日本語"},{code:"en",iso:"en",name:"English"}],c="ja",l="___",d="default",m="prefix_except_default",h=!1,f=null,_={useCookie:!0,cookieDomain:null,cookieKey:"i18n_redirected",alwaysRedirect:!0,fallbackLocale:null},y=!1,x="https://pycon.jp/2020",v={moduleName:"i18n",syncLocale:!1,syncMessages:!1,syncRouteParams:!0},w=function(){return null},k=function(){return null},j="nuxt-i18n",O="code",P="iso",E="domain",C="file",L={PREFIX:"prefix",PREFIX_EXCEPT_DEFAULT:"prefix_except_default",PREFIX_AND_DEFAULT:"prefix_and_default",NO_PREFIX:"no_prefix"},D="nuxtI18n",R=["ja","en"]},1:function(t,e,n){"use strict";n.d(e,"k",(function(){return y})),n.d(e,"m",(function(){return x})),n.d(e,"l",(function(){return v})),n.d(e,"e",(function(){return w})),n.d(e,"b",(function(){return k})),n.d(e,"r",(function(){return j})),n.d(e,"g",(function(){return O})),n.d(e,"h",(function(){return P})),n.d(e,"d",(function(){return E})),n.d(e,"q",(function(){return C})),n.d(e,"j",(function(){return L})),n.d(e,"s",(function(){return R})),n.d(e,"n",(function(){return A})),n.d(e,"p",(function(){return I})),n.d(e,"f",(function(){return T})),n.d(e,"c",(function(){return M})),n.d(e,"i",(function(){return S})),n.d(e,"o",(function(){return N})),n.d(e,"a",(function(){return H}));n(60),n(31),n(20),n(29),n(28),n(39);var r=n(11),o=(n(61),n(132),n(198),n(18)),c=(n(24),n(25),n(111),n(201),n(51),n(19),n(4)),l=(n(30),n(13),n(9),n(41),n(16),n(23)),d=n(2);function m(object,t){var e=Object.keys(object);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(object);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(object,t).enumerable}))),e.push.apply(e,n)}return e}function h(t){for(var i=1;i=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function _(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i1&&void 0!==arguments[1]?arguments[1]:[],r=t.$children||[],o=f(r);try{for(o.s();!(e=o.n()).done;){var c=e.value;c.$fetch?n.push(c):c.$children&&w(c,n)}}catch(t){o.e(t)}finally{o.f()}return n}function k(t,e){if(e||!t.options.__hasNuxtData){var n=t.options._originDataFn||t.options.data||function(){return{}};t.options._originDataFn=n,t.options.data=function(){var data=n.call(this,this);return this.$ssrContext&&(e=this.$ssrContext.asyncData[t.cid]),h(h({},data),e)},t.options.__hasNuxtData=!0,t._Ctor&&t._Ctor.options&&(t._Ctor.options.data=t.options.data)}}function j(t){return t.options&&t._Ctor===t||(t.options?(t._Ctor=t,t.extendOptions=t.options):(t=d.a.extend(t))._Ctor=t,!t.options.name&&t.options.__file&&(t.options.name=t.options.__file)),t}function O(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"components";return Array.prototype.concat.apply([],t.matched.map((function(t,r){return Object.keys(t[n]).map((function(o){return e&&e.push(r),t[n][o]}))})))}function P(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return O(t,e,"instances")}function E(t,e){return Array.prototype.concat.apply([],t.matched.map((function(t,n){return Object.keys(t.components).reduce((function(r,o){return t.components[o]?r.push(e(t.components[o],t.instances[o],t,o,n)):delete t.components[o],r}),[])})))}function C(t,e){return Promise.all(E(t,function(){var t=Object(c.a)(regeneratorRuntime.mark((function t(n,r,o,c){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if("function"!=typeof n||n.options){t.next=4;break}return t.next=3,n();case 3:n=t.sent;case 4:return o.components[c]=n=j(n),t.abrupt("return","function"==typeof e?e(n,r,o,c):n);case 6:case"end":return t.stop()}}),t)})));return function(e,n,r,o){return t.apply(this,arguments)}}()))}function L(t){return D.apply(this,arguments)}function D(){return(D=Object(c.a)(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=2;break}return t.abrupt("return");case 2:return t.next=4,C(e);case 4:return t.abrupt("return",h(h({},e),{},{meta:O(e).map((function(t,n){return h(h({},t.options.meta),(e.matched[n]||{}).meta)}))}));case 5:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function R(t,e){return $.apply(this,arguments)}function $(){return($=Object(c.a)(regeneratorRuntime.mark((function t(e,n){var c,l,d,m;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return e.context||(e.context={isStatic:!0,isDev:!1,isHMR:!1,app:e,payload:n.payload,error:n.error,base:"/2020/",env:{targetBranch:"master",TARGET_BRANCH:"master"}},n.req&&(e.context.req=n.req),n.res&&(e.context.res=n.res),n.ssrContext&&(e.context.ssrContext=n.ssrContext),e.context.redirect=function(t,path,n){if(t){e.context._redirected=!0;var r=Object(o.a)(path);if("number"==typeof t||"undefined"!==r&&"object"!==r||(n=path||{},path=t,r=Object(o.a)(path),t=302),"object"===r&&(path=e.router.resolve(path).route.fullPath),!/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path))throw path=F(path,n),window.location.replace(path),new Error("ERR_REDIRECT");e.context.next({path:path,query:n,status:t})}},e.context.nuxtState=window.__NUXT__),t.next=3,Promise.all([L(n.route),L(n.from)]);case 3:c=t.sent,l=Object(r.a)(c,2),d=l[0],m=l[1],n.route&&(e.context.route=d),n.from&&(e.context.from=m),e.context.next=n.next,e.context._redirected=!1,e.context._errored=!1,e.context.isHMR=!1,e.context.params=e.context.route.params||{},e.context.query=e.context.route.query||{};case 15:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function A(t,e){return!t.length||e._redirected||e._errored?Promise.resolve():I(t[0],e).then((function(){return A(t.slice(1),e)}))}function I(t,e){var n;return(n=2===t.length?new Promise((function(n){t(e,(function(t,data){t&&e.error(t),n(data=data||{})}))})):t(e))&&n instanceof Promise&&"function"==typeof n.then?n:Promise.resolve(n)}function T(base,t){var path=decodeURI(window.location.pathname);return"hash"===t?window.location.hash.replace(/^#\//,""):(base&&0===path.indexOf(base)&&(path=path.slice(base.length)),(path||"/")+window.location.search+window.location.hash)}function M(t,e){return function(t,e){for(var n=new Array(t.length),i=0;i=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function _unsupportedIterableToArray(t,e){if(t){if("string"==typeof t)return _arrayLikeToArray(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(t,e):void 0}}function _arrayLikeToArray(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i0)){t.next=18;break}return t.next=18,new Promise((function(t){return setTimeout(t,r)}));case 18:this.$fetchState.error=e,this.$fetchState.pending=!1,this.$fetchState.timestamp=Date.now(),this.$nextTick((function(){return o.$nuxt.nbFetching--}));case 22:case"end":return t.stop()}}),t,this,[[6,11]])})))).apply(this,arguments)}e.a={beforeCreate:function(){Object(c.l)(this)&&(this._fetchDelay="number"==typeof this.$options.fetchDelay?this.$options.fetchDelay:200,o.a.util.defineReactive(this,"$fetchState",{pending:!1,error:null,timestamp:Date.now()}),this.$fetch=h.bind(this),Object(c.a)(this,"created",m),Object(c.a)(this,"beforeMount",d))}}},177:function(t,e,n){t.exports=n(178)},178:function(t,e,n){"use strict";n.r(e),function(t){n(31),n(20),n(29),n(24),n(25),n(30);var e=n(18),r=(n(19),n(124),n(4)),o=(n(28),n(39),n(13),n(9),n(41),n(16),n(127),n(188),n(193),n(195),n(2)),c=n(164),l=n(62),d=n(1),m=n(27),h=n(172),f=n(81);function _(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return y(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 y(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function y(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i2?e-2:0),r=2;r*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-16-9{padding-bottom:56.25%}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.5rem*var(--space-y-reverse))}.space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.5rem*var(--space-x-reverse));margin-left:calc(0.5rem*(1 - var(--space-x-reverse)))}.space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem*var(--space-y-reverse))}.space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem*(1 - var(--space-y-reverse)));margin-bottom:calc(3rem*var(--space-y-reverse))}.bg-transparent{background-color:transparent}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-py-black{--bg-opacity:1;background-color:#404a6b;background-color:rgba(64,74,107,var(--bg-opacity))}.bg-py-blue-light{--bg-opacity:1;background-color:#d4d4ff;background-color:rgba(212,212,255,var(--bg-opacity))}.bg-py-orange-light{--bg-opacity:1;background-color:#ffd8a1;background-color:rgba(255,216,161,var(--bg-opacity))}.bg-py-blue-dark{--bg-opacity:1;background-color:#3d40cb;background-color:rgba(61,64,203,var(--bg-opacity))}.bg-py-orange-dark{--bg-opacity:1;background-color:#ee9d2c;background-color:rgba(238,157,44,var(--bg-opacity))}.hover\\:bg-py-black:hover{--bg-opacity:1;background-color:#404a6b;background-color:rgba(64,74,107,var(--bg-opacity))}.hover\\:bg-py-blue-light:hover{--bg-opacity:1;background-color:#d4d4ff;background-color:rgba(212,212,255,var(--bg-opacity))}.hover\\:bg-py-blue-dark:hover{--bg-opacity:1;background-color:#3d40cb;background-color:rgba(61,64,203,var(--bg-opacity))}.group:hover .group-hover\\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-py-black{--border-opacity:1;border-color:#404a6b;border-color:rgba(64,74,107,var(--border-opacity))}.border-py-blue-dark{--border-opacity:1;border-color:#3d40cb;border-color:rgba(61,64,203,var(--border-opacity))}.border-py-orange-dark{--border-opacity:1;border-color:#ee9d2c;border-color:rgba(238,157,44,var(--border-opacity))}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-xl{border-radius:4rem}.rounded-2xl{border-radius:8rem}.rounded-py{border-radius:98px}.rounded-card-head{border-radius:2.35rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-2xl{border-top-right-radius:8rem;border-bottom-right-radius:8rem}.rounded-l-2xl{border-top-left-radius:8rem;border-bottom-left-radius:8rem}.border-solid{border-style:solid}.border-double{border-style:double}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r-4{border-right-width:4px}.border-t{border-top-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.box-border{box-sizing:border-box}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.self-center{align-self:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.flex-1{flex:1 1 0%}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-black{font-weight:900}.h-2{height:.5rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-64{height:16rem}.h-80{height:20rem}.h-120{height:30rem}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.leading-7{line-height:1.75rem}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-0{margin:0}.m-4{margin:1rem}.m-8{margin:2rem}.m-screen{margin:0 calc(50% - 50vw)}.my-0{margin-top:0;margin-bottom:0}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-16{margin-top:4rem;margin-bottom:4rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mr-3{margin-right:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.mt-10{margin-top:2.5rem}.ml-10{margin-left:2.5rem}.mt-12{margin-top:3rem}.mr-12{margin-right:3rem}.mb-12{margin-bottom:3rem}.ml-12{margin-left:3rem}.mt-16{margin-top:4rem}.mb-16{margin-bottom:4rem}.mt-20{margin-top:5rem}.mb-20{margin-bottom:5rem}.mt-24{margin-top:6rem}.mb-24{margin-bottom:6rem}.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-mt-6{margin-top:-1.5rem}.-mt-8{margin-top:-2rem}.-ml-10{margin-left:-2.5rem}.-mt-16{margin-top:-4rem}.max-w-screen-xl{max-width:1280px}.min-h-screen{min-height:100vh}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.object-right{-o-object-position:right;object-position:right}.object-top{-o-object-position:top;object-position:top}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-100{opacity:1}.focus\\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-x-scroll{overflow-x:scroll}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pt-2{padding-top:.5rem}.pb-4{padding-bottom:1rem}.pl-6{padding-left:1.5rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pt-12{padding-top:3rem}.pb-12{padding-bottom:3rem}.pt-24{padding-top:6rem}.pb-24{padding-bottom:6rem}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.left-1\\/2{left:50%}.left-3\\/4{left:75%}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-right{box-shadow:10px 10px 15px -3px rgba(0,0,0,.1),4px 4px 6px -2px rgba(0,0,0,.05)}.shadow-left{box-shadow:-10px 10px 15px -3px rgba(0,0,0,.1),-4px 4px 6px -2px rgba(0,0,0,.05)}.focus\\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.text-left{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.text-py-black{--text-opacity:1;color:#404a6b;color:rgba(64,74,107,var(--text-opacity))}.text-py-blue-dark{--text-opacity:1;color:#3d40cb;color:rgba(61,64,203,var(--text-opacity))}.hover\\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.hover\\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.hover\\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.hover\\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.hover\\:text-py-blue-light:hover{--text-opacity:1;color:#d4d4ff;color:rgba(212,212,255,var(--text-opacity))}.group:hover .group-hover\\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.hover\\:underline:hover{text-decoration:underline}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.align-middle{vertical-align:middle}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-2{width:.5rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-12{width:3rem}.w-20{width:5rem}.w-24{width:6rem}.w-40{width:10rem}.w-2\\/3{width:66.666667%}.w-1\\/4{width:25%}.w-3\\/4{width:75%}.w-1\\/5{width:20%}.w-4\\/5{width:80%}.w-1\\/6{width:16.666667%}.w-5\\/6{width:83.333333%}.w-8\\/12{width:66.666667%}.w-10\\/12{width:83.333333%}.w-11\\/12{width:91.666667%}.w-full{width:100%}.w-screen{width:100vw}.w-35vw{width:35vw}.w-50vw{width:50vw}.w-70vw{width:70vw}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.gap-2{grid-gap:.5rem;gap:.5rem}.gap-4{grid-gap:1rem;gap:1rem}.row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.grid-flow-row{grid-auto-flow:row}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.rotate-0{--transform-rotate:0}.rotate-180{--transform-rotate:180deg}.translate-x-12{--transform-translate-x:3rem}.translate-x-20{--transform-translate-x:5rem}.-translate-x-12{--transform-translate-x:-3rem}.-translate-x-20{--transform-translate-x:-5rem}.transition-all{transition-property:all}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.transition-colors{transition-property:background-color,border-color,color,fill,stroke}.transition-transform{transition-property:transform}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}body{font-family:Rounded Mplus\\ 1c,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:unset}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:2dppx),only screen and(-webkit-min-device-pixel-ratio:2){body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@media (min-width:480px){.sm\\:items-start{align-items:flex-start}.sm\\:text-lg{font-size:1.125rem}.sm\\:text-xl{font-size:1.25rem}.sm\\:text-2xl{font-size:1.5rem}.sm\\:text-3xl{font-size:1.875rem}.sm\\:px-8{padding-left:2rem;padding-right:2rem}.sm\\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:768px){.md\\:rounded-full{border-radius:9999px}.md\\:rounded-xl{border-radius:4rem}.md\\:block{display:block}.md\\:inline{display:inline}.md\\:flex-row{flex-direction:row}.md\\:flex-no-wrap{flex-wrap:nowrap}.md\\:items-center{align-items:center}.md\\:justify-end{justify-content:flex-end}.md\\:justify-center{justify-content:center}.md\\:h-40{height:10rem}.md\\:h-56{height:14rem}.md\\:h-120{height:30rem}.md\\:h-auto{height:auto}.md\\:h-full{height:100%}.md\\:text-base{font-size:1rem}.md\\:text-lg{font-size:1.125rem}.md\\:text-xl{font-size:1.25rem}.md\\:text-2xl{font-size:1.5rem}.md\\:text-3xl{font-size:1.875rem}.md\\:text-4xl{font-size:2.25rem}.md\\:text-5xl{font-size:3rem}.md\\:text-6xl{font-size:4rem}.md\\:m-0{margin:0}.md\\:mt-0{margin-top:0}.md\\:mb-0{margin-bottom:0}.md\\:mr-2{margin-right:.5rem}.md\\:mt-4{margin-top:1rem}.md\\:mr-4{margin-right:1rem}.md\\:ml-6{margin-left:1.5rem}.md\\:mr-8{margin-right:2rem}.md\\:ml-10{margin-left:2.5rem}.md\\:ml-12{margin-left:3rem}.md\\:mt-16{margin-top:4rem}.md\\:mt-20{margin-top:5rem}.md\\:mt-24{margin-top:6rem}.md\\:mb-32{margin-bottom:8rem}.md\\:-mt-1{margin-top:-.25rem}.md\\:opacity-100{opacity:1}.md\\:py-4{padding-top:1rem;padding-bottom:1rem}.md\\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\\:px-16{padding-left:4rem;padding-right:4rem}.md\\:pb-0{padding-bottom:0}.md\\:relative{position:relative}.md\\:w-32{width:8rem}.md\\:w-40{width:10rem}.md\\:w-48{width:12rem}.md\\:w-auto{width:auto}.md\\:w-1\\/2{width:50%}.md\\:w-1\\/3{width:33.333333%}.md\\:w-2\\/3{width:66.666667%}.md\\:w-3\\/4{width:75%}.md\\:w-2\\/5{width:40%}.md\\:w-3\\/5{width:60%}.md\\:w-4\\/5{width:80%}.md\\:w-1\\/12{width:8.333333%}.md\\:w-3\\/12{width:25%}.md\\:w-4\\/12{width:33.333333%}.md\\:w-8\\/12{width:66.666667%}.md\\:w-11\\/12{width:91.666667%}.md\\:w-50vw{width:50vw}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\\:translate-x-32{--transform-translate-x:8rem}.md\\:-translate-x-32{--transform-translate-x:-8rem}}@media (min-width:848px){.tb\\:hidden{display:none}.tb\\:flex-row{flex-direction:row}.tb\\:items-center{align-items:center}.tb\\:justify-between{justify-content:space-between}.tb\\:my-4{margin-top:1rem;margin-bottom:1rem}}@media (min-width:992px){.lg\\:flex-row{flex-direction:row}.lg\\:text-2xl{font-size:1.5rem}.lg\\:text-3xl{font-size:1.875rem}.lg\\:text-5xl{font-size:3rem}.lg\\:text-6xl{font-size:4rem}.lg\\:my-3{margin-top:.75rem;margin-bottom:.75rem}.lg\\:mx-8{margin-left:2rem;margin-right:2rem}.lg\\:ml-4{margin-left:1rem}.lg\\:mt-8{margin-top:2rem}.lg\\:ml-10{margin-left:2.5rem}.lg\\:px-12{padding-left:3rem;padding-right:3rem}.lg\\:w-1\\/2{width:50%}.lg\\:w-1\\/3{width:33.333333%}.lg\\:w-1\\/4{width:25%}.lg\\:w-2\\/5{width:40%}.lg\\:w-4\\/5{width:80%}}@media (min-width:1280px){.xl\\:text-3xl{font-size:1.875rem}.xl\\:mt-0{margin-top:0}.xl\\:ml-10{margin-left:2.5rem}.xl\\:w-1\\/3{width:33.333333%}.xl\\:w-3\\/4{width:75%}.xl\\:w-2\\/5{width:40%}.xl\\:w-9\\/12{width:75%}}",""]),t.exports=e},212:function(t,e,n){t.exports=n.p+"img/dc6a3e8.png"},214:function(t,e,n){"use strict";var r=n(77);n.n(r).a},215:function(t,e,n){(e=n(49)(!1)).push([t.i,".border-bottom-blank[data-v-3b7fa2aa]{border-width:2px;border-color:#e2e8f0 #e2e8f0 #fff}.border-top-blank[data-v-3b7fa2aa]{border-width:2px;border-color:#fff #fff #e2e8f0}",""]),t.exports=e},216:function(t,e,n){t.exports=n.p+"img/6f5207b.png"},27:function(t,e,n){"use strict";n.d(e,"b",(function(){return Le})),n.d(e,"a",(function(){return W}));n(19),n(60),n(20),n(13),n(9),n(41);var r=n(4),o=n(23),c=(n(16),n(2)),l=n(64),d=n(105),m=n.n(d),h=n(48),f=n.n(h),_=n(65),y=n(1);"scrollRestoration"in window.history&&(window.history.scrollRestoration="manual",window.addEventListener("beforeunload",(function(){window.history.scrollRestoration="auto"})),window.addEventListener("load",(function(){window.history.scrollRestoration="manual"})));var x=function(){return Object(y.m)(n.e(3).then(n.bind(null,428)))},v=function(){return Object(y.m)(n.e(4).then(n.bind(null,429)))},w=function(){return Object(y.m)(Promise.all([n.e(19),n.e(5)]).then(n.bind(null,425)))},k=function(){return Object(y.m)(n.e(7).then(n.bind(null,430)))},j=function(){return Object(y.m)(n.e(8).then(n.bind(null,426)))},O=function(){return Object(y.m)(n.e(9).then(n.bind(null,427)))},P=function(){return Object(y.m)(n.e(10).then(n.bind(null,431)))},E=function(){return Object(y.m)(Promise.all([n.e(20),n.e(11)]).then(n.bind(null,432)))},C=function(){return Object(y.m)(Promise.all([n.e(21),n.e(12)]).then(n.bind(null,424)))},L=function(){return Object(y.m)(n.e(13).then(n.bind(null,433)))},D=function(){return Object(y.m)(n.e(14).then(n.bind(null,434)))},R=function(){return Object(y.m)(n.e(15).then(n.bind(null,435)))},$=function(){return Object(y.m)(n.e(6).then(n.bind(null,436)))},A=function(){},I=_.a.prototype.push;_.a.prototype.push=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:A,n=arguments.length>2?arguments[2]:void 0;return I.call(this,t,e,n)},c.a.use(_.a);var T={mode:"history",base:decodeURI("/2020/"),linkActiveClass:"nuxt-link-active",linkExactActiveClass:"nuxt-link-exact-active",scrollBehavior:function(t,e,n){var r=!1,o=Object(y.g)(t);(o.length<2&&o.every((function(t){return!1!==t.options.scrollToTop}))||o.some((function(t){return t.options.scrollToTop})))&&(r={x:0,y:0}),n&&(r=n);var c=window.$nuxt;return t.path===e.path&&t.hash!==e.hash&&c.$nextTick((function(){return c.$emit("triggerScroll")})),new Promise((function(e){c.$once("triggerScroll",(function(){if(t.hash){var n=t.hash;void 0!==window.CSS&&void 0!==window.CSS.escape&&(n="#"+window.CSS.escape(n.substr(1)));try{document.querySelector(n)&&(r={selector:n})}catch(t){console.warn("Failed to save scroll position. Please add CSS.escape() polyfill (https://github.com/mathiasbynens/CSS.escape).")}}e(r)}))}))},routes:[{path:"/about/",component:x,pathToRegexpOptions:{strict:!0},name:"about___ja"},{path:"/code-of-conduct/",component:v,pathToRegexpOptions:{strict:!0},name:"code-of-conduct___ja"},{path:"/en/",component:w,pathToRegexpOptions:{strict:!0},name:"index___en"},{path:"/session/",component:k,pathToRegexpOptions:{strict:!0},name:"session___ja"},{path:"/special-booth/",component:j,pathToRegexpOptions:{strict:!0},name:"special-booth___ja"},{path:"/sponsor/",component:O,pathToRegexpOptions:{strict:!0},name:"sponsor___ja"},{path:"/sprint/",component:P,pathToRegexpOptions:{strict:!0},name:"sprint___ja"},{path:"/staff/",component:E,pathToRegexpOptions:{strict:!0},name:"staff___ja"},{path:"/timetable/",component:C,pathToRegexpOptions:{strict:!0},name:"timetable___ja"},{path:"/tutorial/",component:L,pathToRegexpOptions:{strict:!0},name:"tutorial___ja"},{path:"/youth-coder/",component:D,pathToRegexpOptions:{strict:!0},name:"youth-coder___ja"},{path:"/youtube-live/",component:R,pathToRegexpOptions:{strict:!0},name:"youtube-live___ja"},{path:"/en/about/",component:x,pathToRegexpOptions:{strict:!0},name:"about___en"},{path:"/en/code-of-conduct/",component:v,pathToRegexpOptions:{strict:!0},name:"code-of-conduct___en"},{path:"/en/session/",component:k,pathToRegexpOptions:{strict:!0},name:"session___en"},{path:"/en/special-booth/",component:j,pathToRegexpOptions:{strict:!0},name:"special-booth___en"},{path:"/en/sponsor/",component:O,pathToRegexpOptions:{strict:!0},name:"sponsor___en"},{path:"/en/sprint/",component:P,pathToRegexpOptions:{strict:!0},name:"sprint___en"},{path:"/en/staff/",component:E,pathToRegexpOptions:{strict:!0},name:"staff___en"},{path:"/en/timetable/",component:C,pathToRegexpOptions:{strict:!0},name:"timetable___en"},{path:"/en/tutorial/",component:L,pathToRegexpOptions:{strict:!0},name:"tutorial___en"},{path:"/en/youth-coder/",component:D,pathToRegexpOptions:{strict:!0},name:"youth-coder___en"},{path:"/en/youtube-live/",component:R,pathToRegexpOptions:{strict:!0},name:"youtube-live___en"},{path:"/en/session/:id/",component:$,pathToRegexpOptions:{strict:!0},name:"session-id___en"},{path:"/session/:id/",component:$,pathToRegexpOptions:{strict:!0},name:"session-id___ja"},{path:"/",component:w,pathToRegexpOptions:{strict:!0},name:"index___ja"}],fallback:!1};function M(){return new _.a(T)}var S={name:"NuxtChild",functional:!0,props:{nuxtChildKey:{type:String,default:""},keepAlive:Boolean,keepAliveProps:{type:Object,default:void 0}},render:function(t,e){var n=e.parent,data=e.data,r=e.props,o=n.$createElement;data.nuxtChild=!0;for(var c=n,l=n.$nuxt.nuxt.transitions,d=n.$nuxt.nuxt.defaultTransition,m=0;n;)n.$vnode&&n.$vnode.data.nuxtChild&&m++,n=n.$parent;data.nuxtChildDepth=m;var h=l[m]||d,f={};N.forEach((function(t){void 0!==h[t]&&(f[t]=h[t])}));var _={};z.forEach((function(t){"function"==typeof h[t]&&(_[t]=h[t].bind(c))}));var y=_.beforeEnter;if(_.beforeEnter=function(t){if(window.$nuxt.$nextTick((function(){window.$nuxt.$emit("triggerScroll")})),y)return y.call(c,t)},!1===h.css){var x=_.leave;(!x||x.length<2)&&(_.leave=function(t,e){x&&x.call(c,t),c.$nextTick(e)})}var v=o("routerView",data);return r.keepAlive&&(v=o("keep-alive",{props:r.keepAliveProps},[v])),o("transition",{props:f,on:_},[v])}},N=["name","mode","appear","css","type","duration","enterClass","leaveClass","appearClass","enterActiveClass","enterActiveClass","leaveActiveClass","appearActiveClass","enterToClass","leaveToClass","appearToClass"],z=["beforeEnter","enter","afterEnter","enterCancelled","beforeLeave","leave","afterLeave","leaveCancelled","beforeAppear","appear","afterAppear","appearCancelled"],B={props:{error:{type:Object,required:!0}}},U=n(5),W=Object(U.a)(B,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return 404===t.error.statusCode?n("div",{staticClass:"flex flex-col items-center justify-center flex-1"},[n("h1",{staticClass:"flex flex-col w-full"},[n("span",{staticClass:"mb-8 text-4xl italic font-black leading-normal tracking-widest text-center md:text-5xl lg:text-6xl"},[t._v("\n 404\n ")]),t._v(" "),n("span",{staticClass:"font-medium leading-normal tracking-wider text-center sm:text-lg md:text-2xl lg:text-3xl"},[t._v("\n "+t._s(t.$t("error.404"))+"\n ")])]),t._v(" "),n("n-link",{staticClass:"mt-2 text-xl leading-normal tracking-tight text-center text-blue-600 transition-colors duration-100 hover:text-blue-800 md:text-2xl xl:text-3xl",attrs:{to:t.localePath("/")}},[t._v("\n "+t._s(t.$t("error.back"))+"\n ")])],1):n("div",{staticClass:"flex flex-col items-center justify-center flex-1"},[n("h1",{staticClass:"flex flex-col w-full"},[n("span",{staticClass:"mb-8 text-4xl italic font-black leading-normal tracking-widest text-center md:text-5xl lg:text-6xl"},[t._v("\n "+t._s(t.error.statusCode)+"\n ")]),t._v(" "),n("span",{staticClass:"font-medium leading-normal tracking-wider text-center sm:text-lg md:text-2xl lg:text-3xl"},[t._v("\n "+t._s(t.$t("error.else"))+"\n ")])]),t._v(" "),n("n-link",{staticClass:"mt-2 text-xl leading-normal tracking-tight text-center text-blue-600 transition-colors duration-100 hover:text-blue-800 md:text-2xl xl:text-3xl",attrs:{to:t.localePath("/")}},[t._v("\n "+t._s(t.$t("error.back"))+"\n ")])],1)}),[],!1,null,null,null).exports,K=(n(24),n(25),n(51),n(11)),F={name:"Nuxt",components:{NuxtChild:S,NuxtError:W},props:{nuxtChildKey:{type:String,default:void 0},keepAlive:Boolean,keepAliveProps:{type:Object,default:void 0},name:{type:String,default:"default"}},errorCaptured:function(t){this.displayingNuxtError&&(this.errorFromNuxtError=t,this.$forceUpdate())},computed:{routerViewKey:function(){if(void 0!==this.nuxtChildKey||this.$route.matched.length>1)return this.nuxtChildKey||Object(y.c)(this.$route.matched[0].path)(this.$route.params);var t=Object(K.a)(this.$route.matched,1)[0];if(!t)return this.$route.path;var e=t.components.default;if(e&&e.options){var n=e.options;if(n.key)return"function"==typeof n.key?n.key(this.$route):n.key}return/\/$/.test(t.path)?this.$route.path:this.$route.path.replace(/\/$/,"")}},beforeCreate:function(){c.a.util.defineReactive(this,"nuxt",this.$root.$options.nuxt)},render:function(t){var e=this;return this.nuxt.err?this.errorFromNuxtError?(this.$nextTick((function(){return e.errorFromNuxtError=!1})),t("div",{},[t("h2","An error occured while showing the error page"),t("p","Unfortunately an error occured and while showing the error page another error occured"),t("p","Error details: ".concat(this.errorFromNuxtError.toString())),t("nuxt-link",{props:{to:"/"}},"Go back to home")])):(this.displayingNuxtError=!0,this.$nextTick((function(){return e.displayingNuxtError=!1})),t(W,{props:{error:this.nuxt.err}})):t("NuxtChild",{key:this.routerViewKey,props:this.$props})}},H=(n(31),n(29),n(30),{name:"NuxtLoading",data:function(){return{percent:0,show:!1,canSucceed:!0,reversed:!1,skipTimerCount:0,rtl:!1,throttle:200,duration:5e3,continuous:!1}},computed:{left:function(){return!(!this.continuous&&!this.rtl)&&(this.rtl?this.reversed?"0px":"auto":this.reversed?"auto":"0px")}},beforeDestroy:function(){this.clear()},methods:{clear:function(){clearInterval(this._timer),clearTimeout(this._throttle),this._timer=null},start:function(){var t=this;return this.clear(),this.percent=0,this.reversed=!1,this.skipTimerCount=0,this.canSucceed=!0,this.throttle?this._throttle=setTimeout((function(){return t.startTimer()}),this.throttle):this.startTimer(),this},set:function(t){return this.show=!0,this.canSucceed=!0,this.percent=Math.min(100,Math.max(0,Math.floor(t))),this},get:function(){return this.percent},increase:function(t){return this.percent=Math.min(100,Math.floor(this.percent+t)),this},decrease:function(t){return this.percent=Math.max(0,Math.floor(this.percent-t)),this},pause:function(){return clearInterval(this._timer),this},resume:function(){return this.startTimer(),this},finish:function(){return this.percent=this.reversed?0:100,this.hide(),this},hide:function(){var t=this;return this.clear(),setTimeout((function(){t.show=!1,t.$nextTick((function(){t.percent=0,t.reversed=!1}))}),500),this},fail:function(t){return this.canSucceed=!1,this},startTimer:function(){var t=this;this.show||(this.show=!0),void 0===this._cut&&(this._cut=1e4/Math.floor(this.duration)),this._timer=setInterval((function(){t.skipTimerCount>0?t.skipTimerCount--:(t.reversed?t.decrease(t._cut):t.increase(t._cut),t.continuous&&(t.percent>=100||t.percent<=0)&&(t.skipTimerCount=1,t.reversed=!t.reversed))}),100)}},render:function(t){var e=t(!1);return this.show&&(e=t("div",{staticClass:"nuxt-progress",class:{"nuxt-progress-notransition":this.skipTimerCount>0,"nuxt-progress-failed":!this.canSucceed},style:{width:this.percent+"%",left:this.left}})),e}}),J=(n(204),Object(U.a)(H,void 0,void 0,!1,null,null,null).exports),X=(n(206),n(208),n(210),n(136),{props:{isDrawerOpen:{type:Boolean,default:!1}},watch:{isDrawerOpen:function(){this.$refs.transition.performTransition()}}}),G=Object(U.a)(X,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("button",{staticClass:"rounded-lg tb:hidden focus:outline-none focus:shadow-outline",attrs:{role:"button","aria-label":"Open menu","aria-controls":"navigation","aria-expanded":t.isDrawerOpen},on:{click:function(e){return t.$emit("toggleDrawer")}}},[n("svg-transition",{ref:"transition",staticClass:"w-8 h-8",attrs:{trigger:"none",size:{width:20,height:20},"aria-hidden":"true"}},[n("svg",{attrs:{slot:"initial",fill:"currentColor",viewBox:"0 0 20 20"},slot:"initial"},[n("path",{attrs:{"fill-rule":"evenodd",d:"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z","clip-rule":"evenodd"}})]),t._v(" "),n("svg",{attrs:{fill:"currentColor",viewBox:"0 0 20 20"}},[n("path",{attrs:{"fill-rule":"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z","clip-rule":"evenodd"}})])])],1)}),[],!1,null,null,null).exports,Q=(n(28),n(39),{inheritAttrs:!1,props:{enter:{validator:function(t){return["75","100","150","200","300","500","700","1000"].includes(t)},default:"100"},leave:{validator:function(t){return["75","100","150","200","300","500","700","1000"].includes(t)},default:"75"}}}),V={components:{FadeTransition:Object(U.a)(Q,(function(){var t=this.$createElement;return(this._self._c||t)("transition",this._g(this._b({attrs:{name:"fade","enter-active-class":"transition ease-out duration-"+this.enter,"leave-active-class":"transition ease-in duration-"+this.leave,"enter-class":"transform scale-95 opacity-0","leave-class":"transform scale-100 opacity-100","enter-to-class":"transform scale-100 opacity-100","leave-to-class":"transform scale-95 opacity-0"}},"transition",this.$attrs,!1),this.$listeners),[this._t("default")],2)}),[],!1,null,null,null).exports},props:{isDropdownOpen:{type:Boolean,default:!1},emitEvent:{type:String,default:""}}},Y=Object(U.a)(V,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"relative"},[n("div",{staticClass:"relative z-30"},[n("button",{staticClass:"flex flex-row items-center w-full px-4 py-2 mt-2 text-left transition-colors duration-200 bg-transparent rounded-lg md:w-auto md:inline md:mt-0 hover:text-gray-600 focus:text-gray-900 focus:outline-none",on:{click:function(e){return t.$emit(t.emitEvent)}}},[t._t("default"),t._v(" "),n("svg",{staticClass:"inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1",class:{"rotate-180":t.isDropdownOpen,"rotate-0":!t.isDropdownOpen},attrs:{fill:"currentColor",viewBox:"0 0 20 20"}},[n("path",{attrs:{"fill-rule":"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z","clip-rule":"evenodd"}})])],2),t._v(" "),n("fade-transition",[t._t("menu")],2)],1),t._v(" "),t.isDropdownOpen?n("div",{staticClass:"fixed inset-0 z-20 w-screen h-screen",on:{click:function(e){return t.$emit(t.emitEvent)}}}):t._e()])}),[],!1,null,null,null).exports,Z={props:{emitEvent:{type:String,default:""}},computed:{},methods:{judgeNuxtPath:function(path){return!/^https?:\/\//.test(path)}}},tt=Object(U.a)(Z,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"absolute right-0 w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48"},[n("div",{staticClass:"px-2 py-2 bg-white rounded-md shadow"},t._l(t.$t("pages.event-list.content-list"),(function(e){return n("div",{key:e.title},[t.judgeNuxtPath(e.path)?n("n-link",{staticClass:"block px-4 py-2 mt-2 text-sm font-semibold transition-colors duration-200 bg-transparent rounded-lg px- md:mt-0 focus:text-gray-900 hover:text-gray-600 focus:bg-gray-200 focus:outline-none",attrs:{to:t.localePath(e.path)},nativeOn:{click:function(e){return e.stopPropagation(),t.$emit(t.emitEvent)}}},[t._v("\n "+t._s(e.title)+"\n ")]):n("a",{staticClass:"block px-4 py-2 mt-2 text-sm font-semibold transition-colors duration-200 bg-transparent rounded-lg px- md:mt-0 focus:text-gray-900 hover:text-gray-600 focus:bg-gray-200 focus:outline-none",attrs:{href:e.path,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(e.title))])],1)})),0)])}),[],!1,null,null,null).exports,et={computed:{availableLocales:function(){var t=this;return this.$i18n.locales.filter((function(i){return i.code!==t.$i18n.locale}))}}},nt=Object(U.a)(et,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",t._l(t.availableLocales,(function(e){return n("n-link",{key:e.code,staticClass:"flex items-center px-4 py-2 mt-2 transition-colors duration-200 bg-transparent border-2 rounded-lg border-py-black md:mt-0 hover:bg-py-black group",attrs:{to:t.switchLocalePath(e.code)}},[n("i",{staticClass:"mr-2 material-icons group-hover:text-white"},[t._v("translate")]),t._v(" "),n("span",{staticClass:"group-hover:text-white"},[t._v(t._s(e.name))])])})),1)}),[],!1,null,null,null).exports,ot={inheritAttrs:!1,props:{path:{type:String,required:!0}},methods:{isInternalLink:function(path){return!/^https?:\/\//.test(path)}}},at={components:{IsomorphicLink:Object(U.a)(ot,(function(){var t=this,e=t.$createElement;return(t._self._c||e)(t.isInternalLink(t.path)?"nuxt-link":"a",t._g(t._b({tag:"component",attrs:{to:t.isInternalLink(t.path)?t.localePath(t.path):"",href:t.isInternalLink(t.path)?"":t.path,target:t.isInternalLink(t.path)?"":"_blank",rel:t.isInternalLink(t.path)?"":"noopener noreferrer"}},"component",t.$attrs,!1),t.$listeners),[t._t("default")],2)}),[],!1,null,null,null).exports},inheritAttrs:!1,props:{path:{type:String,required:!0}}},it={components:{Hamburger:G,Dropdown:Y,EventList:tt,LocalesList:nt,HeaderLink:Object(U.a)(at,(function(){var t=this.$createElement;return(this._self._c||t)("isomorphic-link",this._g(this._b({staticClass:"px-4 py-2 transition-colors duration-200 bg-transparent border-b-2 border-white focus:outline-none hover:text-gray-600",attrs:{"active-class":"border-b-2 border-py-black",path:this.path}},"isomorphic-link",this.$attrs,!1),this.$listeners),[this._t("default")],2)}),[],!1,null,null,null).exports},data:function(){return{isDrawerOpen:!1,isDropdownOpen:!1,isEventListDropdownOpen:!1,isMobile:!0}},computed:{filteredPages:function(){return Object.filter=function(t,e){return Object.fromEntries(Object.entries(t).filter(e))},Object.filter(this.$i18n.t("pages"),(function(t){var e=Object(K.a)(t,2);e[0];return"/"!==e[1].path}))}},mounted:function(){var t=this;this.$router.beforeEach((function(e,n,r){t.isDrawerOpen=!1,t.isDropdownOpen=!1,r()}));var e=window.matchMedia("(min-width: 848px)");this.updateMatches(e),e.addListener(this.updateMatches)},methods:{updateMatches:function(t){t.matches?this.isMobile=!1:this.isMobile=!0},nextFrame:function(t){window.requestAnimationFrame((function(){return window.requestAnimationFrame(t)}))},enter:function(t){t.style.overflow="hidden",t.style.height="0",this.nextFrame((function(){t.style.height="".concat(t.scrollHeight,"px")}))},leave:function(t){t.style.overflow="hidden",t.style.height="".concat(t.scrollHeight,"px"),this.nextFrame((function(){t.style.height="0"}))},afterEnter:function(t){t.style.height="",t.style.overflow=""},afterLeave:function(t){t.style.height="",t.style.overflow=""},judgeNuxtPath:function(path){return!/^https?:\/\//.test(path)}}},st=(n(214),Object(U.a)(it,(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"flex flex-col max-w-screen-xl mx-auto tb:items-center tb:justify-between tb:flex-row tb:my-4 xl:w-3/4"},[r("div",{staticClass:"flex flex-row items-center justify-between py-4"},[r("n-link",{attrs:{to:t.localePath("/")}},[r("img",{staticClass:"w-40",attrs:{src:n(212)}})]),t._v(" "),r("hamburger",{staticClass:"-mr-1",attrs:{"is-drawer-open":t.isDrawerOpen},on:{toggleDrawer:function(e){t.isDrawerOpen=!t.isDrawerOpen}}})],1),t._v(" "),r("transition",{attrs:{name:"nav","enter-active-class":"transition-all duration-200 ease-out","leave-active-class":"transition-all duration-150 ease-in"},on:{enter:t.enter,"after-enter":t.afterEnter,leave:t.leave,"after-leave":t.afterLeave}},[r("nav",{directives:[{name:"show",rawName:"v-show",value:t.isDrawerOpen||!t.isMobile,expression:"isDrawerOpen || !isMobile"}],staticClass:"flex flex-col pb-4 md:pb-0 md:justify-end tb:flex-row",attrs:{id:"navigation"}},[t._l(t.filteredPages,(function(e){return r("div",{key:e.path,staticClass:"flex flex-col pb-4 md:pb-0 md:justify-end tb:flex-row"},[void 0!==e.path?r("header-link",{staticClass:"mt-2 mr-0 md:mr-2 md:mt-0",attrs:{path:e.path,exact:"/"===e.path}},[t._v("\n "+t._s(e.title)+"\n ")]):t.isMobile?r("div",[r("h5",{staticClass:"block px-4 py-2 mt-2 text-sm bg-transparent md:mt-0"},[t._v("\n "+t._s(t.$t("pages.event-list.title"))+"\n ")]),t._v(" "),t._l(t.$t("pages.event-list.content-list"),(function(e){return r("div",{key:e.title},[t.judgeNuxtPath(e.path)?r("n-link",{staticClass:"block px-4 py-2 mt-2 ml-10 text-sm bg-transparent md:mt-0",attrs:{to:t.localePath(e.path)}},[t._v("\n "+t._s(e.title)+"\n ")]):r("a",{staticClass:"block px-4 py-2 mt-2 ml-10 text-sm bg-transparent md:mt-0",attrs:{href:e.path,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(e.title))])],1)}))],2):r("dropdown",{attrs:{"is-dropdown-open":t.isEventListDropdownOpen,"emit-event":"toggleEventListDropdown"},on:{toggleEventListDropdown:function(e){t.isEventListDropdownOpen=!t.isEventListDropdownOpen}},scopedSlots:t._u([{key:"menu",fn:function(){return[t.isEventListDropdownOpen?r("event-list",{attrs:{"emit-event":"toggleEventListDropdown"},on:{toggleEventListDropdown:function(e){t.isEventListDropdownOpen=!t.isEventListDropdownOpen}}}):t._e()]},proxy:!0}],null,!0)},[t._v("\n "+t._s(t.$t("pages.event-list.title"))+"\n ")])],1)})),t._v(" "),r("locales-list")],2)])],1)}),[],!1,null,"3b7fa2aa",null).exports),ct={},ut=n(106),lt=Object(U.a)(ct,(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"flex flex-col items-center w-full py-8"},[r("section",{staticClass:"flex flex-col items-center justify-center px-4 pt-8 pb-12 m-screen"},[r("h2",{staticClass:"inline mb-12 text-4xl font-bold md:text-6xl"},[t._v("\n Contact\n ")]),t._v(" "),t._l(t.$t("message"),(function(e,i){return r("div",{key:"p-"+i},[r("p",{staticClass:"text-center md:text-xl"},[t._v(t._s(e))])])})),t._v(" "),t._m(0)],2),t._v(" "),r("div",{staticClass:"flex flex-col items-center justify-between w-full max-w-screen-xl mx-auto md:items-center md:flex-row"},[r("h2",{staticClass:"mb-8 text-xl font-semibold tracking-widest text-gray-900 uppercase md:mb-0"},[r("a",{attrs:{href:"https://www.pycon.jp",target:"_blank",rel:"noopener noreferrer"}},[r("img",{staticClass:"w-40",attrs:{src:n(216)}})])]),t._v(" "),t._m(1)])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("a",{staticClass:"px-4 pt-2 pb-4 mt-10 text-2xl font-semibold duration-200 border border-py-black rounded-xl hover:bg-py-black hover:text-py-blue-light transition-color",attrs:{href:"mailto:pyconjp@pycon.jp"}},[e("i",{staticClass:"text-2xl align-middle material-icons"},[this._v("email")]),this._v(" "),e("span",[this._v("pyconjp@pycon.jp")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"flex flex-col items-center justify-end sm:items-start"},[e("h3",{staticClass:"mb-2"},[this._v("主催: 一般社団法人PyCon JP Association")]),this._v(" "),e("h3",{staticClass:"text-center"},[this._v("\n PyCon JP 2020 is a production of the\n "),e("span"),this._v(" "),e("a",{staticClass:"text-blue-400 transition-colors duration-100 hover:text-blue-600",attrs:{href:"https://www.pycon.jp/",target:"_blank",rel:"noopener noreferrer"}},[this._v("\n PyCon JP Association\n ")])])])}],!1,null,null,null);"function"==typeof ut.default&&Object(ut.default)(lt);var pt={components:{PyconHeader:st,PyconFooter:lt.exports},head:function(){return this.$nuxtI18nSeo()}},mt=Object(U.a)(pt,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"flex flex-col min-h-screen"},[e("pycon-header",{staticClass:"w-full px-6 text-gray-800 sm:px-8 md:px-10 lg:px-12"}),this._v(" "),e("main",{staticClass:"container flex flex-col flex-1 px-6 mx-auto sm:px-8 md:px-10 lg:px-12"},[e("nuxt")],1),this._v(" "),e("pycon-footer",{staticClass:"px-6 text-gray-800 bg-py-blue-light sm:px-8 md:px-10 lg:px-12"})],1)}),[],!1,null,null,null).exports;function ht(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return ft(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 ft(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function ft(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i0}},methods:{refreshOnlineStatus:function(){void 0===window.navigator.onLine?this.isOnline=!0:this.isOnline=window.navigator.onLine},refresh:function(){var t=this;return Object(r.a)(regeneratorRuntime.mark((function e(){var n,r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((n=Object(y.h)(t.$route)).length){e.next=3;break}return e.abrupt("return");case 3:return t.$loading.start(),r=n.map((function(e){var p=[];if(e.$options.fetch&&e.$options.fetch.length&&p.push(Object(y.p)(e.$options.fetch,t.context)),e.$fetch)p.push(e.$fetch());else{var n,r=ht(Object(y.e)(e.$vnode.componentInstance));try{for(r.s();!(n=r.n()).done;){var component=n.value;p.push(component.$fetch())}}catch(t){r.e(t)}finally{r.f()}}return e.$options.asyncData&&p.push(Object(y.p)(e.$options.asyncData,t.context).then((function(t){for(var n in t)c.a.set(e.$data,n,t[n])}))),Promise.all(p)})),e.prev=5,e.next=8,Promise.all(r);case 8:e.next=15;break;case 10:e.prev=10,e.t0=e.catch(5),t.$loading.fail(e.t0),Object(y.k)(e.t0),t.error(e.t0);case 15:t.$loading.finish();case 16:case"end":return e.stop()}}),e,null,[[5,10]])})))()},errorChanged:function(){this.nuxt.err&&this.$loading&&(this.$loading.fail&&this.$loading.fail(this.nuxt.err),this.$loading.finish&&this.$loading.finish())},setLayout:function(t){return t&>["_"+t]||(t="default"),this.layoutName=t,this.layout=gt["_"+t],this.layout},loadLayout:function(t){return t&>["_"+t]||(t="default"),Promise.resolve(gt["_"+t])}},components:{NuxtLoading:J}},_t=n(107),yt=n.n(_t),xt=function(t,e){return vt.apply(this,arguments)};function vt(){return(vt=Object(r.a)(regeneratorRuntime.mark((function t(e,n){var r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r={"64x64":"/2020/_nuxt/icons/icon_64.6bc0c7.png","120x120":"/2020/_nuxt/icons/icon_120.6bc0c7.png","144x144":"/2020/_nuxt/icons/icon_144.6bc0c7.png","152x152":"/2020/_nuxt/icons/icon_152.6bc0c7.png","192x192":"/2020/_nuxt/icons/icon_192.6bc0c7.png","384x384":"/2020/_nuxt/icons/icon_384.6bc0c7.png","512x512":"/2020/_nuxt/icons/icon_512.6bc0c7.png"},n("icon",(function(t){return r[t+"x"+t]||""}));case 3:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var wt=n(166),kt=n.n(wt),jt=function(t,e){t.app;e("md",new kt.a("default"))},Ot=n(26),Pt=n(80);Ot.a.autoAddCss=!1,c.a.component("fa",Pt.a),c.a.component("fa-layers",Pt.b),c.a.component("fa-layers-text",Pt.c);var Et=n(47),Ct=n(108),Lt=function(){return Promise.all([n.e(18),n.e(2)]).then(n.bind(null,422))};c.a.component(Ct.a.name,Ct.a);var Dt=function(t,e){var n=null,o=function(){for(var t=arguments.length,e=new Array(t),o=0;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function Gt(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function ae(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i1&&r.sort((function(t,e){return t.score===e.score?e.code.length-t.code.length:e.score-t.score})),r.length?r[0].code:null};function se(object,t){var e=Object.keys(object);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(object);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(object,t).enumerable}))),e.push.apply(e,n)}return e}function ce(t){for(var i=1;i1&&void 0!==j[1]?j[1]:{},l=c.initialSetup,(m=void 0!==l&&l)||!o.i18n.differentDomains){t.next=3;break}return t.abrupt("return");case 3:if(r!==o.i18n.locale){t.next=5;break}return t.abrupt("return");case 5:if(_=o.i18n.locale,m||(o.i18n.beforeLanguageSwitch(_,r),f&&o.i18n.setLocaleCookie(r)),!It.n){t.next=14;break}if(y=n(38),x=y.loadLanguageAsync,!o.i18n.fallbackLocale||r===o.i18n.fallbackLocale){t.next=12;break}return t.next=12,x(e,o.i18n.fallbackLocale);case 12:return t.next=14,x(e,r);case 14:return o.i18n.locale=r,t.next=17,Object(Tt.syncVuex)(d,r,o.i18n.getLocaleMessage(r));case 17:m||o.i18n.onLanguageSwitched(_,r),m||It.t===It.g.NO_PREFIX||(v=o.switchLocalePath(r)||o.localePath("index",r),w=o.router.resolve(v).route,(k=e.route)&&!Object(Tt.isSameRoute)(k,w)&&h(v));case 19:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),k="function"==typeof It.u?Object(It.u)(e):It.u,o.i18n=new Jt.a(k),o.i18n.locale=null,o.i18n.fallbackLocale=k.fallbackLocale||null,o.i18n.locales=It.p,o.i18n.defaultLocale=It.j,o.i18n.differentDomains=It.m,o.i18n.beforeLanguageSwitch=It.i,o.i18n.onLanguageSwitched=It.q,o.i18n.setLocaleCookie=v,o.i18n.getLocaleCookie=x,o.i18n.setLocale=function(t){return w(t)},c.a.prototype.$nuxtI18nSeo=Qt,d&&(d.$i18n=o.i18n,d.state.localeDomains&&o.i18n.locales.forEach((function(t){t.domain=d.state.localeDomains[t.code]}))),j=o.i18n.defaultLocale||null,o.i18n.differentDomains?(O=Object(Tt.getLocaleDomain)(o.i18n,m),j=O||j):It.t!==It.g.NO_PREFIX?(P=Object(Tt.getLocaleFromRoute)(l),j=P||j):f&&(E=x(),It.o.includes(E)&&(j=E)),t.next=24,w(j,{initialSetup:!0});case 24:return o.i18n.__detectBrowserLanguage=Object(r.a)(regeneratorRuntime.mark((function t(){var e,n,r;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!It.l){t.next=12;break}if(e=It.l.alwaysRedirect,n=It.l.fallbackLocale,f&&(r=x())||("undefined"!=typeof navigator&&navigator.languages?r=ie(It.o,navigator.languages):m&&void 0!==m.headers["accept-language"]&&(r=ie(It.o,m.headers["accept-language"].split(",").map((function(t){return t.split(";")[0]}))))),!(r=r||n)||f&&!e&&x()){t.next=12;break}if(r===o.i18n.locale){t.next=11;break}return t.next=8,o.i18n.setLocale(r);case 8:return t.abrupt("return",!0);case 11:f&&!x()&&o.i18n.setLocaleCookie(r);case 12:return t.abrupt("return",!1);case 13:case"end":return t.stop()}}),t)}))),t.next=27,o.i18n.__detectBrowserLanguage();case 27:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),le=n(66),pe=n.n(le),de=n(170),me=n.n(de);function he(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return fe(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 fe(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,c=!0,l=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){l=!0,o=t},f:function(){try{c||null==n.return||n.return()}finally{if(l)throw o}}}}function fe(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i2&&void 0!==arguments[2]?arguments[2]:"common",o=he(Array.isArray(r)?r:[r]);try{for(o.s();!(n=o.n()).done;){var c=n.value;if(!e)return void delete this.defaults.headers[c][t];this.defaults.headers[c][t]=e}}catch(t){o.e(t)}finally{o.f()}},setToken:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"common",r=t?(e?e+" ":"")+t:null;this.setHeader("Authorization",r,n)},onRequest:function(t){this.interceptors.request.use((function(e){return t(e)||e}))},onResponse:function(t){this.interceptors.response.use((function(e){return t(e)||e}))},onRequestError:function(t){this.interceptors.request.use(void 0,(function(e){return t(e)||Promise.reject(e)}))},onResponseError:function(t){this.interceptors.response.use(void 0,(function(e){return t(e)||Promise.reject(e)}))},onError:function(t){this.onRequestError(t),this.onResponseError(t)},create:function(t){return xe(me()(t,this.defaults))}},be=function(){var t=ye[_e];ge["$"+t]=function(){return this[t].apply(this,arguments).then((function(t){return t&&t.data}))}},_e=0,ye=["request","delete","get","head","options","post","put","patch"];_e has been deprecated and will be removed in Nuxt 3, please use instead")),f.a.render(t,e)}})),c.a.component(S.name,S),c.a.component("NChild",S),c.a.component(F.name,F),c.a.use(l.a,{keyName:"head",attribute:"data-n-head",ssrAttribute:"data-n-head-ssr",tagIDKeyName:"hid"});var Ce={name:"page",mode:"out-in",appear:!0,appearClass:"appear",appearActiveClass:"appear-active",appearToClass:"appear-to"};function Le(t){return De.apply(this,arguments)}function De(){return(De=Object(r.a)(regeneratorRuntime.mark((function t(e){var n,r,o,l,path,d;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,M();case 2:return n=t.sent,r=Ee({head:{titleTemplate:"%s - PyCon JP 2020",title:"PyCon JP 2020",base:{href:"router.base"},meta:[{charset:"utf-8"},{name:"viewport",content:"width=device-width, initial-scale=1"},{hid:"description",name:"description",content:"PyCon JP 2020 Python"},{hid:"og:site_name",property:"og:site_name",content:"PyCon JP 2020"},{hid:"og:type",property:"og:type",content:"website"},{hid:"og:url",property:"og:url",content:"https://pycon.jp/2020"},{hid:"og:title",property:"og:title",content:"PyCon JP 2020"},{hid:"og:description",property:"og:description",content:"PyCon JPは、Pythonユーザが集まり、PythonやPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。"},{hid:"og:image",property:"og:image",content:"https://pycon.jp/2020/logo.png"},{hid:"mobile-web-app-capable",name:"mobile-web-app-capable",content:"yes"},{hid:"apple-mobile-web-app-title",name:"apple-mobile-web-app-title",content:"PyCon JP 2020"},{hid:"author",name:"author",content:"Koji Ishimoto"},{hid:"theme-color",name:"theme-color",content:"#3D40CB"}],link:[{rel:"icon",type:"image/x-icon",href:"/favicon.ico"},{rel:"stylesheet",href:"https://fonts.googleapis.com/icon?family=Material+Icons"},{rel:"manifest",href:"/2020/_nuxt/manifest.10c6494a.json"},{rel:"shortcut icon",href:"/2020/_nuxt/icons/icon_64.6bc0c7.png"},{rel:"apple-touch-icon",href:"/2020/_nuxt/icons/icon_512.6bc0c7.png",sizes:"512x512"},{rel:"prefetch",href:"/2020/_nuxt/news.json",as:"fetch"}],style:[],script:[],htmlAttrs:{lang:"ja"}},router:n,nuxt:{defaultTransition:Ce,transitions:[Ce],setTransitions:function(t){return Array.isArray(t)||(t=[t]),t=t.map((function(t){return t=t?"string"==typeof t?Object.assign({},Ce,{name:t}):Object.assign({},Ce,t):Ce})),this.$options.nuxt.transitions=t,t},err:null,dateErr:null,error:function(t){t=t||null,r.context._errored=Boolean(t),t=t?Object(y.o)(t):null;var n=r.nuxt;return this&&(n=this.nuxt||this.$options.nuxt),n.dateErr=Date.now(),n.err=t,e&&(e.nuxt.error=t),t}}},bt),o=e?e.next:function(t){return r.router.push(t)},e?l=n.resolve(e.url).route:(path=Object(y.f)(n.options.base,n.options.mode),l=n.resolve(path).route),t.next=8,Object(y.s)(r,{route:l,next:o,error:r.nuxt.error.bind(r),payload:e?e.payload:void 0,req:e?e.req:void 0,res:e?e.res:void 0,beforeRenderFns:e?e.beforeRenderFns:void 0,ssrContext:e});case 8:if(d=function(t,e){if(!t)throw new Error("inject(key, value) has no key provided");if(void 0===e)throw new Error("inject('".concat(t,"', value) has no value provided"));r[t="$"+t]=e;var n="__nuxt_"+t+"_installed__";c.a[n]||(c.a[n]=!0,c.a.use((function(){Object.prototype.hasOwnProperty.call(c.a,t)||Object.defineProperty(c.a.prototype,t,{get:function(){return this.$root.$options[t]}})})))},"function"!=typeof yt.a){t.next=12;break}return t.next=12,yt()(r.context,d);case 12:return t.next=15,xt(r.context,d);case 15:return t.next=18,jt(r.context,d);case 18:t.next=21;break;case 21:return t.next=24,Dt(r.context,d);case 24:t.next=27;break;case 27:t.next=30;break;case 30:return t.next=33,Kt(r.context);case 33:if("function"!=typeof ue){t.next=36;break}return t.next=36,ue(r.context,d);case 36:return t.next=39,we(r.context,d);case 39:t.next=42;break;case 42:return t.next=45,Oe(r.context);case 45:t.next=48;break;case 48:return t.abrupt("return",{app:r,router:n});case 49:case"end":return t.stop()}}),t)})))).apply(this,arguments)}},38:function(t,e,n){"use strict";n.r(e),n.d(e,"loadLanguageAsync",(function(){return d})),n.d(e,"validateRouteParams",(function(){return f})),n.d(e,"isSameRoute",(function(){return x})),n.d(e,"getLocaleDomain",(function(){return v})),n.d(e,"getLocaleFromRoute",(function(){return w})),n.d(e,"syncVuex",(function(){return k}));n(19),n(124),n(111),n(52),n(16),n(51),n(41),n(28),n(39);var r=n(11),o=(n(13),n(9),n(136),n(18)),c=n(4),l=n(0);function d(t,e){return m.apply(this,arguments)}function m(){return(m=Object(c.a)(regeneratorRuntime.mark((function t(e,n){var r,o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:(r=e.app).i18n.loadedLanguages||(r.i18n.loadedLanguages=[]),r.i18n.loadedLanguages.includes(n)||(o=r.i18n.locales.find((function(t){return t[l.b]===n})))&&(o[l.d]||console.warn("[".concat(l.f,"] Could not find lang file for locale ").concat(n)));case 3:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var h=function(t){return t&&!Array.isArray(t)&&"object"===Object(o.a)(t)},f=function(t){h(t)?Object.entries(t).forEach((function(t){var e=Object(r.a)(t,2),n=e[0],o=e[1];l.o.includes(n)?h(o)||console.warn("[".concat(l.f,"] Trying to set route params for locale ").concat(n," with a non-object value")):console.warn("[".concat(l.f,"] Trying to set route params for key ").concat(n," which is not a valid locale"))})):console.warn("[".concat(l.f,"] Route params should be an object"))},_=/\/?$/;function y(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!a||!b)return a===b;var t=Object.keys(a),e=Object.keys(b);return t.length===e.length&&t.every((function(t){var e=a[t],n=b[t];return"object"===Object(o.a)(e)&&"object"===Object(o.a)(n)?y(e,n):String(e)===String(n)}))}function x(a,b){return!!b&&(a.path&&b.path?a.path.replace(_,"")===b.path.replace(_,"")&&a.hash===b.hash&&y(a.query,b.query):!(!a.name||!b.name)&&(a.name===b.name&&a.hash===b.hash&&y(a.query,b.query)&&y(a.params,b.params)))}var v=function(t,e){var n=window.location.hostname;if(n){var r=t.locales.find((function(t){return t[l.c]===n}));if(r)return r[l.b]}return null},w=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e="(".concat(l.o.join("|"),")"),n="(?:".concat(l.s).concat(l.k,")?");if(t.name){var r=new RegExp("".concat(l.s).concat(e).concat(n,"$"),"i"),o=t.name.match(r);if(o&&o.length>1)return o[1]}else if(t.path){var c=new RegExp("^/".concat(e,"/"),"i"),d=t.path.match(c);if(d&&d.length>1)return d[1]}return null},k=function(){var t=Object(c.a)(regeneratorRuntime.mark((function t(e){var n,r,o=arguments;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=o.length>1&&void 0!==o[1]?o[1]:null,r=o.length>2&&void 0!==o[2]?o[2]:null,!l.v||!e){t.next=9;break}if(null===n||!l.v.syncLocale){t.next=6;break}return t.next=6,e.dispatch(l.v.moduleName+"/setLocale",n);case 6:if(null===r||!l.v.syncMessages){t.next=9;break}return t.next=9,e.dispatch(l.v.moduleName+"/setMessages",r);case 9:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()},62:function(t,e,n){"use strict";var r={};r.redirect=n(196),r.redirect=r.redirect.default||r.redirect,e.a=r},76:function(t,e,n){var content=n(205);"string"==typeof content&&(content=[[t.i,content,""]]),content.locals&&(t.exports=content.locals);(0,n(50).default)("3191d5ad",content,!0,{sourceMap:!1})},77:function(t,e,n){var content=n(215);"string"==typeof content&&(content=[[t.i,content,""]]),content.locals&&(t.exports=content.locals);(0,n(50).default)("047dbecd",content,!0,{sourceMap:!1})},78:function(t,e){t.exports=function(t){t.options.__i18n=t.options.__i18n||[],t.options.__i18n.push('{"en":{"message":{"p-1":"Please check the FAQ in advance.","p-2":"It is run by volunteers. It takes about a week to answer.","p-3":"Thank you for your patience."}},"ja":{"message":{"p-1":"事前にFAQをご確認いただけますようにお願いします。","p-2":"ボランティアによる運営ですので、回答には1週間程度を要します。","p-3":"何卒お待ちいただけますようにお願いします。"}}}'),delete t.options._Ctor}},81:function(t,e,n){"use strict";n(13),n(31),n(20),n(30),n(29),n(16),n(24),n(25),n(9),n(28),n(39);var r=n(2);function o(t,e){var n;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return c(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 c(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0,r=function(){};return{s:r,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}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 o,l=!0,d=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return l=t.done,t},e:function(t){d=!0,o=t},f:function(){try{l||null==n.return||n.return()}finally{if(d)throw o}}}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i0},canPrefetch:function(){var t=navigator.connection;return!(this.$nuxt.isOffline||t&&((t.effectiveType||"").includes("2g")||t.saveData))},getPrefetchComponents:function(){return this.$router.resolve(this.to,this.$route,this.append).resolved.matched.map((function(t){return t.components.default})).filter((function(t){return"function"==typeof t&&!t.options&&!t.__prefetched}))},prefetchLink:function(){if(this.canPrefetch()){m.unobserve(this.$el);var t,e=o(this.getPrefetchComponents());try{for(e.s();!(t=e.n()).done;){var n=t.value,r=n();r instanceof Promise&&r.catch((function(){})),n.__prefetched=!0}}catch(t){e.e(t)}finally{e.f()}}}}}}},[[177,16,1,17]]]); \ No newline at end of file diff --git a/2020/_nuxt/manifest.10c6494a.json b/2020/_nuxt/manifest.10c6494a.json new file mode 100644 index 0000000..22a4195 --- /dev/null +++ b/2020/_nuxt/manifest.10c6494a.json @@ -0,0 +1 @@ +{"name":"PyCon JP 2020","short_name":"pycon.jp.2020","description":"PyCon JPは、Pythonユーザが集まり、PythonやPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。","icons":[{"src":"/2020/_nuxt/icons/icon_64.6bc0c7.png","sizes":"64x64","type":"image/png"},{"src":"/2020/_nuxt/icons/icon_120.6bc0c7.png","sizes":"120x120","type":"image/png"},{"src":"/2020/_nuxt/icons/icon_144.6bc0c7.png","sizes":"144x144","type":"image/png"},{"src":"/2020/_nuxt/icons/icon_152.6bc0c7.png","sizes":"152x152","type":"image/png"},{"src":"/2020/_nuxt/icons/icon_192.6bc0c7.png","sizes":"192x192","type":"image/png"},{"src":"/2020/_nuxt/icons/icon_384.6bc0c7.png","sizes":"384x384","type":"image/png"},{"src":"/2020/_nuxt/icons/icon_512.6bc0c7.png","sizes":"512x512","type":"image/png"}],"start_url":"https://pycon.jp/2020","display":"standalone","background_color":"#d4d4ff","theme_color":"#3D40CB","lang":"ja","title":"PyCon JP 2020","og:title":"PyCon JP 2020","scope":"https://pycon.jp/2020"} \ No newline at end of file diff --git a/2020/_nuxt/manifest.ea8bab48.json b/2020/_nuxt/manifest.ea8bab48.json deleted file mode 100644 index a5c79ac..0000000 --- a/2020/_nuxt/manifest.ea8bab48.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"PyCon JP 2020","short_name":"pycon.jp.2020","description":"PyCon JPは、Pythonユーザが集まり、PythonやPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。","icons":[{"src":"/_nuxt/icons/icon_64.6bc0c7.png","sizes":"64x64","type":"image/png"},{"src":"/_nuxt/icons/icon_120.6bc0c7.png","sizes":"120x120","type":"image/png"},{"src":"/_nuxt/icons/icon_144.6bc0c7.png","sizes":"144x144","type":"image/png"},{"src":"/_nuxt/icons/icon_152.6bc0c7.png","sizes":"152x152","type":"image/png"},{"src":"/_nuxt/icons/icon_192.6bc0c7.png","sizes":"192x192","type":"image/png"},{"src":"/_nuxt/icons/icon_384.6bc0c7.png","sizes":"384x384","type":"image/png"},{"src":"/_nuxt/icons/icon_512.6bc0c7.png","sizes":"512x512","type":"image/png"}],"start_url":"https://pycon.jp/2020","display":"standalone","background_color":"#d4d4ff","theme_color":"#3D40CB","lang":"ja","title":"PyCon JP 2020","og:title":"PyCon JP 2020","scope":"https://pycon.jp/2020"} \ No newline at end of file diff --git a/2020/_nuxt/news.json b/2020/_nuxt/news.json index e4f554a..73a19bb 100644 --- a/2020/_nuxt/news.json +++ b/2020/_nuxt/news.json @@ -1 +1 @@ -[{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-2010553420421661154","$":{"isPermaLink":"false"}}],"pubDate":["Mon, 12 Apr 2021 02:30:00 +0000"],"atom:updated":["2021-04-12T11:30:00.200+09:00"],"category":[{"_":"proposal","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"staff","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"talks","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020を支えたツール sessionize について | Thank you, sessionize! Part 2/2"],"description":["

皆さん、こんにちは。
PyCon JP 2021座長(2020ではコンテンツチームリーダー)のnikkieです。

PyCon JP 2020ではトークの公募にsessionizeというツールを使いました。
このツールはカンファレンスの運営をとても助けてくれたと感じています。
他のスタッフや、他のカンファレンススタッフに知見を共有するために、記事を書きます。

  • Part 1/2(前回):sessionize選定の経緯、費用、よかった点(2/5) 
  • Part 2/2(本記事):よかった点(3/5)・sessionizeのデメリット

 

sessionize推しポイント

この記事で取り上げる3番以降は、PaperCallよりもカンファレンスの運営をサポートしてくれた機能です。


3. Schedule Builder

なんと、sessionize上では、採択したトークを配置してタイムテーブルが作れます

 

\"\"
sessionize上でタイムテーブル作成
 

トークのカテゴリや聴衆のPythonレベルなどで色分けを変えられるので、バランスを見るのにも助かりました。
この機能もありがたかったです。

\"\"
Track(トークのカテゴリ)で色分けした例

4. API / Embed

3で作ったタイムテーブルはHTMLに埋め込んだり、APIとして公開したりできます。
PyCon jP 2020サイトは公開を急ぎ(Done is better than perfect)、当初はsessionizeのタイムテーブル埋め込み機能を使いました。
参考:PyCon JP 2020 システムチーム振り返り【技術編】   

\"\"
HTML埋め込み・APIのエンドポイントを作成

HTML埋め込みやAPI公開の裏には、マスタデータをsessionizeで一元管理できる機能があります。

2019ではPaperCallからトークのデータをエクスポートし、サイト表示用のデータを組成していました。
トークの内容の変更が発生すると、エクスポートしたデータを修正し、サイトの表示を更新するというように、データの整合性を取る作業が大変でした😫

2020は、sessionizeの機能を使って、スピーカーに期限付きで編集を許可するという運用にしました。
これによりスタッフがデータの整合性を取る作業から解放されました。
スピーカーの方にとっても、直すと短時間でPyCon JPサイトに反映されるというのはよかったのではないかと考えています。


5. サポートの回答が速い

FAQもありますが、使い方の細かい点については解消できないこともありました。
そんなときはEメールでサポートに質問できて助かりました。
英語で書く必要はありますが、詰まったら質問すると、翌日には回答が返ってきます。
使い方がわからず準備が進まないということはありませんでした。


sessionizeのデメリット

 

1. PaperCallと同様のレビューはできなかった

PyCon JP 2019では各プロポーザルについて、Yes(採択すべき) / Maybe(採択できる) / No(採択すべきでない) の3段階で評価し、採択会議では評価の高いものから議論して採択を決めました。
これはPaperCallのレビュー機能で提供されています。

2020でも同様のレビューを実施したかったのですが、sessionizeではサポートされていませんでした(※1)。
そこで、「ないものは作ろう」とPaperCall相当のレビューシステムを内製して対応しました。
sessionizeからエクスポートしたデータをレビューシステムにインポートしています。

(※1) sessionizeのレビューは3つプロポーザルを取り出し、その3つに順位をつけることを繰り返すというものです。だいぶ複雑なので、20-30人のレビュアーでうまくできるか懸念がありました

なお、「PaperCallと同様のレビューをサポートしてほしい」とフィードバックしたところ、サポートした機能が2020年末にベータリリースしたようです!
まだ触っていませんが、これは楽しみですね🤩

2. レビュー中の質問 / フィードバックは送れない

PaperCallではプロポーザルに対して、レビュアーから質問やフィードバックが送れます(※2)。
2019年はトーク公募期間とレビュー期間が重なっており、トーク公募締切より前にレビューしたプロポーザルについては質問やフィードバックを送ることがありました。

sessionizeにはそのような機能はありません。
2020年はトークの募集期間とレビュー期間を切り分け、プロポーザルにフィードバックを一律で送らないという方針で進めました。

(※2) これはレビュー中の1:1のやり取りのための機能だと思います。投稿者全体に連絡するというユースケースをPaperCallは想定していないようで、他に機能がないので、一人ひとりにやむなく「真心送信」(Part 1/2 参照)しました(真心送信のマネは、全くオススメしません)


終わりに

PyCon JP 2020を支えたツールの1つ sessionize、よさそうと感じた方は、ぜひ使ってみてください。
PaperCallを使っていて感じたペインが、かなり解消されました。
興味を持った方、無料で試せますよ!

Thank you sessionize!


"],"link":["http://pyconjp.blogspot.com/2021/02/thankyou-sessionize-part2.html"],"author":["noreply@blogger.com (Takuya Futatsugi)"],"media:thumbnail":[{"$":{"xmlns:media":"http://search.yahoo.com/mrss/","url":"https://lh3.googleusercontent.com/-k1iDWGKLZKQ/YHEoZcWJaiI/AAAAAAAAAWw/7hwELQxV7i0U2YxeXd0bHqFxAXY7OqXIACLcBGAsYHQ/s72-c/sessionize-3-schedule-builder.png","height":"72","width":"72"}}],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-5800549610578550213","$":{"isPermaLink":"false"}}],"pubDate":["Wed, 03 Mar 2021 03:00:00 +0000"],"atom:updated":["2021-03-03T12:00:03.158+09:00"],"category":[{"_":"proposal","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"staff","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"talks","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020を支えたツール sessionize について | Thank you, sessionize! Part 1/2"],"description":["

皆さん、こんにちは。
PyCon JP 2021座長(2020ではコンテンツチームリーダー)のnikkieです。

PyCon JP 2020ではトークの公募にsessionizeというツールを使いました。
このツールはカンファレンスの運営をとても助けてくれたと感じています。
他のスタッフや、他のカンファレンススタッフに知見を共有するために、記事を書きます。

  • Part 1/2(本記事):sessionize選定の経緯、費用、よかった点(2/5) 
  • Part 2/2:よかった点(3/5)・sessionizeのデメリット(近日公開予定)


プロポーザルの運用には専用のツールが必要

PyCon JPのカンファレンスの中心は、皆さんから公募したトークです。

近年のPyCon JPには100件以上のトークの応募(=プロポーザル)があります。
トークの応募だけであればGoogleフォームで済むかもしれませんが、プロポーザルのレビューや採択まで行う場合、Googleフォームで運用するのは厳しい状況です。

2019年はPaperCallというツールを使っていました。
トークの応募フォームから、プロポーザルのレビュー、そして採択までサポートしたツールです。
各地のPyConでも使われていますね。

ですが、私個人としてはPaperCallは機能が弱いと感じていました。
PaperCallは採択後の運用をあまりサポートしません。
2019年はGoogleフォームなどを組合せた運用を経験しました。
ツールの機能が弱いために、スタッフの作業が増えてしまっているという印象を受けました。

この課題感を2020 座長のnishiさんやPyCon JP Associationボードメンバーにも共有したところ、各地のPyConで使っているツール一覧を教わりました。
いくつか見て候補を絞り、試用した末に、2020年はsessionizeを使う決定をしました。


費用:無料で始められる!

sessionizeはPaperCallと同じく、無料で使い始められます
有料にしたときの金額もPaperCallと同じです($499)。

PaperCallの無料利用には制限があります(PaperCall pricing)が、sessionizeは無料で全機能使えるようでした(sessionize pricing)。

無料でテストイベントを作って色々試し、PaperCallよりできることが多くてよさそうと判断できたので、使いました。

使ってみてよかった点(全5点)を共有していきます。


sessionize推しポイント

 

1. プロポーザルのフォームをカスタマイズできる!

 
PaperCallは自由記述中心のフォームのため、あまりにも短くレビューしづらいものもありました(ref: 改善案1:自由に書けたがゆえにプロポーザルの分量がまちまちだった問題について)。
レビューに必要な情報が盛り込まれていないプロポーザルをなくすために、2020ではフォームの記述項目を細かく分けました。
これはsessionizeのフォームカスタマイズ機能のおかげで実現しました。

\"\"
sessionizeでは、自由記述欄や選択欄を自由に追加できます

トーク応募用フォーム作成機能で、追加の質問項目を設定できます。


2. Mass mailing!!

 
私個人にとってPaperCallが一番イケていなかった点は、スピーカー(トーク採択に承諾した方)への連絡機能が弱かったことです。
個別のプロポーザルに対してしかメッセージを送ることができず、スタッフは手動でスピーカー一人ひとりに連絡を送信しました😫
※この作業はスタッフの中で「真心送信」と呼ばれ、「2020では繰り返さない」と振り返りで固く誓われました
(PaperCallはメッセージのユースケースをレビュー中の個別のフィードバックのみと限定しているような印象です)

sessionizeではスピーカーへのEメール連絡がばっちりサポートされています!
全体にEメールを送れるのはもちろん、何人か選んで送信することもできます(例:未回答の方を絞ってリマインド)。

\"\"
スピーカー全体にも、選んだ何人かにも、メール送信できます!
 
メールのドラフトや、送ったメール文面の保存もサポートされており、スピーカー連絡周りは非常に助けられました。


sessionizeの推しポイント(よかった点)はまだまだ挙げられます。
続きは、Part 2/2 で共有します。
興味を持った方は、ぜひ無料で試してみてください!

"],"link":["http://pyconjp.blogspot.com/2021/02/thankyou-sessionize-part1.html"],"author":["noreply@blogger.com (Takuya Futatsugi)"],"media:thumbnail":[{"$":{"xmlns:media":"http://search.yahoo.com/mrss/","url":"https://lh3.googleusercontent.com/-7-cBTQyz3r0/YDtivfg8voI/AAAAAAAAAU4/SzKiLZHlgPchWySwfVpPgX0ZoP_p1T6kwCLcBGAsYHQ/s72-c/ses%251Csionize-1-customized-form.png","height":"72","width":"72"}}],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-8142674326327049188","$":{"isPermaLink":"false"}}],"pubDate":["Tue, 16 Feb 2021 07:00:00 +0000"],"atom:updated":["2021-02-17T09:18:59.243+09:00"],"category":[{"_":"accounting","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020 収支報告"],"description":["

こんにちは。PyCon JP 2020(前年)座長のnishiです。

昨年8月に開催されたカンファレンスの収支レポートがまとまりましたので、当Blogで報告します。他のイベント開催者の方々の参考になれば幸いです。

PyCon JP 2020は、厳しい世情の中での準備・開催となりましたが、最終的には赤字になることなく会計を締めることができました。
これは、参加者の皆さん・スポンサーの皆さん・そしてスタッフの皆さんのご協力のおかげです。本当にありがとうございました。

例年同様、PyCon JP 2020のスタッフ活動はボランティアであり、収支データにもスタッフへの給料・報酬といった項目はありません。
また、黒字となった金額については、一般社団法人PyCon JPの会計を介して、「日本国内のPythonユーザのために、Pythonの普及及び開発支援」に利用されます。

収支概要

項目 金額[千円]
売上 スポンサー協賛収入 5,872
チケット売上 830
小計 6,702
支出 通信費(インターネット関連費) 1,912
広告宣伝費 285
支払報酬(通訳・講師等) 1,169
その他 278
小計 3,644
純損益 3,058

詳細データは、こちらから参照可能です。
※上記資料上の各項目は切り捨て値のため、各項目の合計と小計の値が一致しない部分があります。また、当Blog記事では、便宜上、端数を「その他」に寄せて表示しています。

PyCon JP 2020の予算管理・会計を振り返って

PyCon JP 2020のイベント会計は、結果的には、想定以上の黒字となりました。
しかし活動を振り返ると、イベントの準備期間中に突如発生した「新型コロナウイルス感染症(COVID-19)」の影響により、予算組みと予算管理が非常に難しい1年でした。

物理会場での開催準備の取りやめ、未経験のオンライン開催の準備、そしてその切替作業を急ピッチで行わなければならないということが2020年のスタッフ活動の特徴でした。
カンファレンスを継続的に開催していくことはPyCon JPの大きな方針の1つであり、そのためには単年で赤字にならないことが重要です。
しかし、初のオンライン開催の準備を進めるにあたっては、何にどの程度コストがかかるのか、スポンサーの申込みはどの程度あるのか、物理開催で準備していたもの(会場費用等)のキャンセル料がどうなるのか等、未知数のものが多く、予算組みと予算の管理が難航しました。

今回、収支を黒字で終えることができた大きな要因は、スタッフのコスト意識の高さ・努力と、最終的に用意したスポンサープランの応募が埋まったことです。
(例年そうなのですが)ボランティアスタッフであるにも関わらず、スタッフのコスト意識が高く、余分なコストや割高な発注等が発生しませんでした。会場費用等の物理開催準備時の様々な発注についても、そのキャンセル料を最小限に抑えることができました。
また、COVID-19による社会・経済不安の中、スポンサーシップへの応募が少ないことを覚悟・想定して予算組みをしていましたが、最終的には多数の応募をいただくことができました。
加えて、備品や施設の提供等、スポンサー応募とは違う形でご支援をいただいた企業さんの助けも大きかったです。

PyCon JP 2020は、厳しい世情の中での準備・開催でしたが、エンジニアのコミュニティ活動に理解のある企業の皆さん、スタッフ一人ひとりの意識と努力のおかげで、赤字になること無くイベント収支を着地させることができました。
改めまして、ありがとうございました。

PyCon JP 2021について

今年もPyCon JP 2021に向けてのスタッフ活動が始まっていて、スタッフの募集も開始しています。
お試し見学についてのお知らせもありますので、スタッフ活動に興味がある方は是非下記のリンクから詳細をご覧ください。
- PyCon JP 2021 スタッフ募集のお知らせ

"],"link":["http://pyconjp.blogspot.com/2021/03/pyconjp2020-financial-statement.html"],"author":["noreply@blogger.com (Unknown)"],"thr:total":["0"],"georss:featurename":["Tokyo, Japan"],"georss:point":["35.6761919 139.6503106"],"georss:box":["7.3659580638211537 104.49406060000001 63.986425736178845 174.8065606"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-9201885818713884221","$":{"isPermaLink":"false"}}],"pubDate":["Sat, 09 Jan 2021 09:00:00 +0000"],"atom:updated":["2021-01-09T18:00:00.259+09:00"],"category":[{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["[PyCon JP 2020] 回答いただいた参加者アンケートの結果を共有します(全体編:オンラインカンファレンスについて)"],"description":["

こんにちは。
PyCon JP 2021 座長の二木(nikkie)です。

PyCon JP 2020終了時に参加者の方に回答いただいたアンケートについて報告します。
今回は、全体編です(2020/09/15 (JST)までの回答を集計。アンケートの回答総数は120でした)。
オンラインカンファレンスはいかがだったのでしょうか?

関連情報

参加者アンケートは4つに分けて記事にしています: 

また、PyCon JP 2020の参加者数は以下の記事にまとまっています:
https://pyconjp.blogspot.com/2020/09/2020-participants.html

本イベントへの参加方法と、主にどこから視聴したかを教えてください

\"Forms

回答の92%がチケットを購入した参加者です(赤 + 青)


本イベントは有料で開催されましたが、値段は適切だったと思いますか?

\"Forms

「安すぎる」(赤)が 29.6% でした。
適正価格として挙げていただいた回答をPyCon JP 2021の企画に活かしていきます。

 

カンファレンス2日目のパーティについて満足度を教えてください

\"Forms

パーティーに参加いただいた方からは普通以上のフィードバックです!
Zoomのブレイクアウトルーム機能を使ってランダムなグループを作りましたが、ポジティブ・ネガティブ両方の声をいただいています。

 

今後も、日本で開催されるPyConに参加したいと思いますか?

\"Forms

アンケートで一番嬉しかったのが100% Yesのこの回答です!

ダメなところをダメと言ってくださるフィードバックは貴重です。
ですが、ダメ出しに向き合うのには、結構がんばりがいるとも感じています。
いろいろなフィードバックを受け止めながらアンケートを見ていたのですが、この結果を見て「2021も頑張ろう」と思いました!

 

PyCon JP 2020への自由な意見

多数見られた声

  • オンライン開催ありがとうございました!
  • 次回はオフラインで/ハイブリッド

 

意見を見て、PyCon JPからのイベントの情報発信が不足しているのかもしれないと思いました(「〇〇の情報を知りたかった」)。
現状はこのPyCon JP BlogやPyCon JPのサイトをウォッチしてもらい、必要な情報を探して読み込んでもらう形式です。
事前の情報発信に力を入れるというのは一案かもしれません。


全体編は以上です。
参加者の皆さま、アンケート回答ありがとうございました / Thank you to all the participants for answering the questionnaire.


PyCon JP 2021企画中!

PyCon JP 2021はいつやるかがまだ決まっていません。
現在はPyCon JP 2020の経験者を中心に、企画を進めています。
直近の様子:https://pyconjp.blogspot.com/2020/12/pycon-jp-2021-mtg12.html

作業会の予定は以下のconnpassページで確認できます(随時更新されます)。
https://pyconjp-staff.connpass.com/
作業会には「スタッフ枠」以外に「賑やかし枠」があり、スタッフ活動に興味ある方の参加は大歓迎です。

アンケートの回答内容についてもPyCon JP 2021の企画に活かしていきます!

 

"],"link":["http://pyconjp.blogspot.com/2021/01/pyconjp2020-online-feedback.html"],"author":["noreply@blogger.com (Takuya Futatsugi)"],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-7899408396170212647","$":{"isPermaLink":"false"}}],"pubDate":["Thu, 07 Jan 2021 09:00:00 +0000"],"atom:updated":["2021-01-07T18:00:05.290+09:00"],"category":[{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"talks","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["[PyCon JP 2020] 回答いただいた参加者アンケートの結果を共有します(トーク・企画編)"],"description":["

こんにちは。
PyCon JP 2021 座長の二木(nikkie)です。

PyCon JP 2020終了時に参加者の方に回答いただいたアンケートについて報告します。
今回は、トークや企画についてです(2020/09/15 (JST)までの回答を集計。アンケートの回答総数は120でした)。
2019年版と比較しても面白いかもしれませんね。

関連情報

参加者アンケートは4つに分けて記事にしています: 


講演(Keynote/Talk/LT)の満足度

\"Forms
  • 満足 + 大体満足を合わせると86.2%
  • すこし不満 は 3.7%でした

多数いただいた声

  • カンファレンス 2日目のRichさんのキーノートへの感想
  • Zoomでのトークの質問のしづらさについて


来年度の講演で聴きたい分野

\"Forms
  • Data Science / Machine Learning が61.1%で最多
  • Tips of development with Python(50.4%)、Python core(49.6%)が続きます

Pythonは幅広い分野で使えますが、どんな分野でも適用できるPythonを使った開発tipsやPythonのcoreについての発表へのニーズがあるようですね!


来年度はどのPythonレベルの講演を聴きたいか教えてください

\"Forms

最多はIntermediateで71.9%、次点がAdvanced 58.8%でした。
2020はAdvancedのトークは数本でしたので、来場者のニーズとは乖離がありますね。
Advancedのトークを増やすアイデアは考えたいと思います。


講演以外ではどの企画が面白かったですか

\"Forms

スペシャルブーススタンプラリーは楽しんでいただけたようですね。
ですが、「スペシャルブースは中が見えず、入るハードルが高い」という声も多数いただきました。
これは2021で改善していきたいですね。


企画の満足度を教えてください

\"Forms
  • 満足 + 大体満足を合わせると74.2%
  • すこし不満 は 3.6%でした

 

トーク・企画編は以上です。
参加者の皆さま、アンケート回答ありがとうございました / Thank you to all the participants for answering the questionnaire.


PyCon JP 2021企画中!

PyCon JP 2021はいつやるかがまだ決まっていません。
現在はPyCon JP 2020の経験者を中心に、企画を進めています。
直近の様子:https://pyconjp.blogspot.com/2020/12/pycon-jp-2021-mtg12.html

作業会の予定は以下のconnpassページで確認できます(随時更新されます)。
https://pyconjp-staff.connpass.com/
作業会には「スタッフ枠」以外に「賑やかし枠」があり、スタッフ活動に興味ある方の参加は大歓迎です。

アンケートの回答内容についてもPyCon JP 2021の企画に活かしていきます!"],"link":["http://pyconjp.blogspot.com/2021/01/pyconjp2020-program-feedback.html"],"author":["noreply@blogger.com (Takuya Futatsugi)"],"thr:total":["0"]}] \ No newline at end of file +[{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-2230378891772763678","$":{"isPermaLink":"false"}}],"pubDate":["Sun, 25 Oct 2020 12:35:00 +0000"],"atom:updated":["2020-10-25T21:35:47.872+09:00"],"category":[{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"tutorial","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020 チュートリアル振り返り【データ分析編】"],"description":["

はじめに

みなさん、こんにちは。PyCon JP 2020コンテンツチーム、チュートリアル担当のあっきーです。2020年8月30日に開催された「オープンデータを使って、Pythonでデータ分析」の振り返りブログになります。当日のチュートリアルの概要を記載していますので、当日参加頂けなかった方も雰囲気を感じて頂けると思います(´∀`*)

チュートリアルの詳細な情報は下記を参照ください
オープンデータを使って、Pythonでデータ分析

アーカイブ動画はこちらです
PyCon JP 2020 Tutorial データ分析編

イントロダクション

今回のチュートリアルでは下記コンテンツを扱います。
  • 貿易収支データの分析
  • 家計調査データの分析
  • 地理データの可視化

データ分析の手法として、機械学習やデータの可視化について丁寧に解説頂きました。
今回のコンテンツは全てGitHub上のコンテンツとして作成されているので、ハンズオン後の復習にも利用できるように配慮頂いております。また、ハンズオンで扱いきれなかったライブラリの基礎的な使い方についての解説資料も同梱されています。自己学習に最適な内容となってますので、ぜひぜひチェックしてみてください。



貿易収支データの分析

資料はこちらです。

扱う内容は以下になります。
  • 日本の貿易収支データの取得(command)
  • データの読み込み(sqlite3 / pandas)
  • データの整形(pandas) 
  • データの可視化(plotly/dash)
  • 国別のクラスタリング(sklearn)

個人的にはあまり.dbファイルを扱ったことがなかったので、pandasからクエリの実行ができることは初めて知りました。また、欠損値に対してmap関数で処理する部分も非常に勉強になりました。
可視化部分についてはPlotly ExpressもDashも使ったことがなかったので基本的な可視化の流れを知ることができたのは良かったです。ツリーマップはなかなか興味深いなーと思いました。

図:ツリーマップのグラフ


また、Dashを使うと簡単に可視化Webアプリケーションが作成できる部分も魅力的だなと感じました。

図:作成したDashアプリケーション

データを取得し、データを読み込み、データを整形し、データを可視化する、というデータ分析の基本的な流れを一通り学べる充実した内容だと思います。

教師なし学習:クラスタリング

データ分析に機械学習の手法を取り入れることで、より踏み込んだ分析ができるようになります。今回は教師なし学習のクラスタリングについて解説頂きました。クラスタリング結果を見ると、リーマンショック後に輸出量が回復している国とあまり回復していない国で分かれていることに気づけて、なるほどなーと思いました。


図:輸出量データを5クラスターに分類した場合

家計調査データの分析

資料はこちらです。
家計調査データの分析

午後の部の最初は家計調査データの分析です。
目的は以下になります。
  • 支出額の費目毎の分布の違いを見る
  • 支出額からどういう世帯か予測する機械学習のモデルを作る

扱う内容は下記になります。
  • データの読み込み(pandas)
  • データの理解(pandasの基本的な使い方、記述統計量の理解)
  • データの可視化(箱ひげ図、ヒストグラム、Ridgeline plot)
  • Dashによるアプリケーション作成

記述統計量、ヒストグラムなどデータ分析の基礎的な内容について実際に手を動かしながら学ぶことができます。また、こちらのチュートリアルでも最終的にはDashを用いたアプリケーションを実装しています。



機械学習:2クラス分類

家計の情報から3大都市圏に住んでいるかどうかを判定するモデルを作成してみます。機械学習を用いてモデルを作成する基礎を学ぶことができます。取り扱っている内容の一部は下記になります。
  • 目的変数、説明変数とは
  • データをテストデータと訓練データに分割する方法
  • 線形SVM、非線形SVM
  • ハイパーパラメータ
  • スケーリング

機械学習:多クラス分類

各世代の年代を予測するモデルの作成を行います。勾配ブースティングの手法を用いてモデルを作成し、混同行列の作成まで実施します。

図:与えられたデータから世帯の年代を推定した結果の混同行列

地理データ分析

資料はこちらです。

地理データ分析の目次は以下になります。
  • 第1部 大阪市内の平均路線価の可視化
  • 第2部 平均路線価と自転車盗難数の可視化
  • 第3部 平均路線価の可視化と自転車盗難数データのより正確な可視化

第1部 大阪市内の平均路線価の可視化

大阪市内の平均路線価をグラフィカルに可視化します。実際の可視化は下記のような結果になります。

図:大阪の平均路線価の可視化

第2部 平均路線価と自転車盗難数の可視化

第1部ではマップに対して1つの情報のみを可視化しました。第2部では路線価と自転車盗難数の両方を可視化してみます。
このパートでは、pandasにおけるグループバイ、テーブルのマージ、インデックスの再振り分け等についても併せて解説頂いています。

図:路線価と自転車盗難数の可視化

第3部 平均路線価の可視化と自転車盗難数データのより正確な可視化

第2部では市町村界の可視化がタイル状になっていましたが、もう少し正確に市町村界の可視化を実施してみます。

図:平均路線価と自転車盗難数の正確な可視化

最後に

データ分析の基本的な内容から応用的な内容まで幅広く扱って頂き、とても学ぶことが多いコンテンツだと思います。チュートリアルを当日参加された方も、まだアーカイブ動画を視聴されていない方も、この記事をきっかけにぜひご覧ください(≧∇≦*)。
"],"link":["http://pyconjp.blogspot.com/2020/10/pycon-jp-2020_25.html"],"author":["noreply@blogger.com (Hiroya Akita)"],"media:thumbnail":[{"$":{"xmlns:media":"http://search.yahoo.com/mrss/","url":"https://1.bp.blogspot.com/-_jjZvx8w5Uk/X4xgDHmLgqI/AAAAAAAAEB4/NFrys4cS7RkIrgAQ1wVRv8RR5J9Ib0T5gCLcBGAsYHQ/s72-c/Snag_6054936.png","height":"72","width":"72"}}],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-6519929323981168745","$":{"isPermaLink":"false"}}],"pubDate":["Thu, 15 Oct 2020 16:31:00 +0000"],"atom:updated":["2020-10-16T01:31:45.357+09:00"],"category":[{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"tutorial","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020 チュートリアルアンケート結果"],"description":["

はじめに

みなさん、こんにちは。コンテンツチームチュートリアル担当のあっきーです。今年の2020年8月30日に開催したチュートリアルのアンケート結果について共有します。

チュートリアルコンテンツの情報は下記をご参照ください。

PyCon JP 2020 チュートリアル

内容が長文になりますので、ご了承ください。

参加者情報

  • Pythonの開発エコシステムを学ぼう Slack Bot編
    • connpassチケット(Zoom参加権): 20人[完売]
    • 当日Zoom参加者:10人
    • 当日ユニーク視聴数: 118人
  • オープンデータを使って、Pythonでデータ分析
    • connpassチケット(Zoom参加権): 20人[完売]
    • 当日Zoom参加者:6人
    • 当日ユニーク視聴数: 156人

アンケート結果

総回答数:20件

難易度は適切でしたか?
(1:簡単、5:難しい)


今回の講座をどこで知りましたか?


今回の講座の満足度を教えてください。
(1:不満、5:満足)


今回のチュートリアルの良かったところを教えてください。

  • オンラインだったので移動コストがかからなかったのと講演者の話が聴きやすく資料も見易かった。
  • 講師の方がとても丁寧でわかりやすかったです。
  • 手順を追って動作を確認できたので、大変に分かりやすかったです。
  • 進行が丁寧
  • googleコラボラトリは受講者の環境と関係ないため、初心者には受けやすいのではないでしょうか。ストーリーというかシナリオが良かったと思います。特に、AI系が徐々にステップアップしているところが上手いと思いました。
  • slackボットの作り方がざっくりわかったところ
  • 関連する事柄を一通り体験できること。内容・手順を説明するだけでなく、実際に手を動かして手本を見せてくれること。ドキュメントやチュートリアル自体のアーカイブとして残っていること。
  • GitHub 上の Binder に環境が整っており、途中でつまづくことがなかった
  • 新しいことを知ることができとても良かった
  • slackbotだけかと思ったらドキュメンテーションまであっておなかいっぱいでした
  • 新しい知識を得た
  • 途中、詰まって聞き逃したところがありましたが、後から復習できる環境を用意して頂いていたので、ありがたかったです。
  • やってるときの生の声、考え方がわかるところが良かった。
  • mapboxという面白いサービスを知った
  • Mapboxの使い方がわかったことです。
  • 凄い内容だった

講師のみなさんに一言お願いいたします。

  • ありがとうございます。
  • とても有意義な講義をありがとうございます。当日のみならず準備などたいへんだったと思います。今後ともよろしくお願いいたします。
  • とても、よかったです。
  • 楽しく学習できました。ありがとうございました。
  • お忙しい中、準備含めてどうも有り難うございました。
  • 準備および運営等,大変おつかれさまでございました。ありがとうございました!
  • 構想、準備、そして当日まで、全力を尽くしてやっていただき、ありがとうございました。
  • お疲れさまでした
  • オンラインチュートリアルは初めての経験とのことで大変な苦労があったことと思いますが、とても良い体験ができました。不満な点などあるはすがありません。ありがとうございました。また機会がありましたら、是非参加させていただきたいです。
  • とても分かりやすく勉強になりました。ありがとうございました。
  • 大変な準備有難うございました
  • 準備は大変ご苦労様でした
  • 比較的、身近な題材でしたので使いどころがイメージしやすかった点でよかったです。
  • 楽しく聞かせてもらいました。時間を割いていただきありがとうございます。
  • ハンズオンの難易度はちょうど良かったですし、内容も良かったと思います。
  • 今後とも宜しくお願いします。

今後チュートリアルを行うとして、参加したい分野があれば教えてください。


次回、チュートリアルを受けるとしたらどのくらいの難易度を希望しますか?
(1:簡単、5:難しい)



その他、PyCon JPへのご意見/ご感想などありましたらご記入お願いします。

  • いつも楽しみにしています。
  • 引き続きPythonコミュニティの盛り上がりを応援してゆきたいと思います。
  • お疲れさまでした
  • お疲れ様でした。とても楽しく学べる時間でした。ありがとうございます。
  • 今後も期待しています
  • 適性や難易度を表示してほしい
  • 今年はチュートリアルしか参加できませんでしたが、セッションの資料と動画をアップして頂いているので、ありがたいです。
  • 今後もチュートリアルを継続して実施していただけるとうれしいです。

最後に

今年のチュートリアルは初めてのオンライン開催ということで良かった点も悪かった点も様々あったかと思います。皆さんのご意見を参考にしながら、今後の活動に生かすことができるように頑張っていきます。(ง •̀ω•́)ง✧
"],"link":["http://pyconjp.blogspot.com/2020/10/pycon-jp-2020_16.html"],"author":["noreply@blogger.com (Hiroya Akita)"],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-3672503681570258762","$":{"isPermaLink":"false"}}],"pubDate":["Thu, 15 Oct 2020 16:30:00 +0000"],"atom:updated":["2020-10-16T01:30:02.554+09:00"],"category":[{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"system","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"website","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020 システムチーム振り返り【技術編】"],"description":["

 はじめに

みなさん、こんにちは。システムチームのあっきーです。PyCon JP 2020のシステムチームの活動について紹介するブログの第3弾です。以前の投稿は下記から参照ください。

PyCon JP 2020 システムチーム振り返り【スケジュール編#1】

PyCon JP 2020 システムチーム振り返り【スケジュール編#2】

本投稿ではPyCon JP 2020のWebサイトをどのように作ってるのか、その裏側について紹介します。少しでも皆さんのお役に立てるような情報を公開できるように頑張って書きましたので是非参考にして頂ければ幸いです。(*^▽^*)


フロントエンド側

最終的なフロントエンドの使用技術は下記になります。

  • Nuxt.js(axios,i18n,content)
  • Tailwind CSS

実際のリポジトリは下記になりますので、興味ある方はご確認ください。

pycon.jp.2020.ui

技術選定についていろいろと議論した結果、Reactよりも使用経験者が多いNuxt.jsを採用することになりました。また、Vuetify等のフレームワークを使用する案も出ましたが、フレームワーク自体の習得が必要なため少しハードルが高いという結論に至りました。Tailwind CSSは通常のCSSの知識があれば利用可能であるため、比較的ハードルが低いと感じ採用しました。

PyCon JP 2020のサイトは原則WebサイトからのAPI呼び出しは実施せずにビルド時にデータを埋め込み、静的サイトとしてジェネレートしてホスティングする仕組みを採用しています。ページの性質として動的なコンテンツがほとんどないので、デプロイ時に静的サイトとしてジェネレートする方がメリットが多いと考えたためです。

具体的にはPyCon JP Blogの最新のブログ記事のタイトルとセッションデータを埋め込んでいます。ブログ記事はBloggerのAPI経由で、セッションデータはsessionizeのAPI経由でデータを取得しています。

上記構成の場合、ブログ情報とセッション情報はビルド、デプロイ作業を実施しないと内容が更新されません。内容の更新については深夜に1回自動でビルド、デプロイするような仕組みを導入しています。

バックエンド側

次にバックエンドの技術について説明します。

【AWSを採用した理由】

原則リソースはAmazon Web Services(以下AWS)で作成することにしています。複数人で開発を進める場合、アカウント周りがしっかりしていないと共通のアカウントを使いまわす、という運用になってしまうこともあります。アカウント管理をしっかりできるように、少ない人数で回せるようにという事でクラウドメインでの方針としています。Google Cloud PlatformではなくAWSを選んだ理由としては詳しい人が多かったからです。

【ホスティング環境について】

開発環境のホスティングはsurgeを使っています。GitHub Actionsでsurgeへの自動デプロイの設定をしているので、developブランチへマージされたら自動的に開発環境のデプロイが実行されます。ステージング環境と本番環境はAWS Amplify Consoleを使っています。こちらもstagingブランチとmasterブランチにマージされたら自動的にデプロイされるように設定しています。

【セッションデータの管理について】

セッションデータはsessionizeというサービスで管理しています。API経由でセッションデータを取得することができるので、ビルド時にセッションデータを取得し、フロントエンド側で利用しやすいように整形しています。このセッションデータ整形プログラムはPythonで作られています。

【トラブルシューティング】

セッションごとの固有URLについて

自分の気になるセッション、良かったセッションをTwitter等で公開する場合、セッションごとの固有URLがあると便利です。この機能は開催直前に発覚し、急遽実装しました( ° ω ° ; )基本的にはVue Routerのクエリパラメータ($route.query)の機能を使って実装しています。

サイトURLがサブディレクトリ構成だった

PyCon JPのサイトは年度ごとのサブドメインではなくnginxのサブディレクトリ構成となっています(https://pycon.jp/2020/)。通常のNuxtの設定だとサブディレクトリには対応できないのでBase URLを本番環境のみ変更するような仕組みを入れています。

参考:API: router プロパティ
https://ja.nuxtjs.org/api/configuration-router/

多言語対応、セッションデータ整形、読み込みなどなどいろいろと紹介したい実装もあるのですが、長くなりそうなのでこの辺で(o´・ω・`o)ノシ

トラブルも多かったですが、いろいろな方のサポートのおかげで無事サイトが完成し、皆さんにお届けすることができました。この内容が少しでも皆さんのお役に立てれば幸いです。ヾ(*´∀`*)ノ

"],"link":["http://pyconjp.blogspot.com/2020/10/pycon-jp-2020.html"],"author":["noreply@blogger.com (Hiroya Akita)"],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-3721922720248615128","$":{"isPermaLink":"false"}}],"pubDate":["Mon, 05 Oct 2020 14:00:00 +0000"],"atom:updated":["2020-10-05T23:00:49.127+09:00"],"category":[{"_":"conference","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020 参加者数について"],"description":["

こんにちは!PyCon JP 2020 事務局チームです。
8/28(金)-29(土)に開催されました。PyCon JP 2020 の参加者数に関して報告します。

カンファレンス 8/28(金)- 29(土)

  • Zoom参加権チケット(有料)数: 631
  • YouTube Live(無料) 2日間ユニーク視聴者数: 2,988
    ※YouTube Analyticsによる集計値。各日/各動画のユニーク視聴者数の合算ではなく、両日該当期間設定した際のchannel全体ユニーク視聴者数(2日視聴した人も1人とカウント)

その他イベント

  • チュートリアル 8/30(日)
    • Pythonの開発エコシステムを学ぼう Slack Bot編
      • connpassチケット(Zoom参加権): 20人[完売]
      • 当日ユニーク視聴数: 118人
    • オープンデータを使って、Pythonでデータ分析
      • connpassチケット(Zoom参加権): 20人[完売]
      • 当日ユニーク視聴数: 156人
  • スプリント 8/22(土)-30(日)
    • 参加者: 15人
  • ユースコーダーワークショップ 8/30(日)
    • connpassチケット: 16組

初のオンライン開催にも関わらず、たくさんのご参加ありがとうございました。
現地開催には現地開催の良さがありますが、オンライン開催により、東京近郊以外の方や自宅/オフィスを離れることが難しい方等、参加者全員が同じ環境・条件で参加できるカンファレンス・イベントが開催できたのは大きな進化だと考えています。

来年以降についてはまだなにも決まっていないですが、今年培ったオンラインカンファレンス・オンラインイベントの知見を活かして、さらにバージョンアップしたカンファレンスになっていきます。

カンファレンスのセッションは、一部を除いて下記URLよりアーカイブを視聴可能です。
- PyCon JP 2020(YouTube PlayList)

"],"link":["http://pyconjp.blogspot.com/2020/09/2020-participants.html"],"author":["noreply@blogger.com (Unknown)"],"media:thumbnail":[{"$":{"xmlns:media":"http://search.yahoo.com/mrss/","url":"https://1.bp.blogspot.com/-GJVw3DTIIPc/X1cq0QykXEI/AAAAAAAAAv8/g5X79aKDO7YloggeZ6yYk_ZsWKsyrifkQCLcBGAsYHQ/s72-c/pyconjp2020.png","height":"72","width":"72"}}],"thr:total":["0"]},{"guid":[{"_":"tag:blogger.com,1999:blog-1711203921350230994.post-2777765578906129524","$":{"isPermaLink":"false"}}],"pubDate":["Wed, 30 Sep 2020 13:45:00 +0000"],"atom:updated":["2020-10-01T01:10:03.315+09:00"],"category":[{"_":"pyconjp2020","$":{"domain":"http://www.blogger.com/atom/ns#"}},{"_":"system","$":{"domain":"http://www.blogger.com/atom/ns#"}}],"title":["PyCon JP 2020 システムチーム振り返り【スケジュール編#2】"],"description":["

はじめに

皆さんこんにちは。PyCon JP 2020システムチームの振り返りブログ第2弾です。今年のシステムチームの活動の裏側について紹介しちゃいます。前回のブログの続きになりますので、もしよければ前回のブログもご覧ください。

前回のブログはこちら
PyCon JP 2020 システムチーム振り返り【スケジュール編#1】

スケジュール編#2

2020/6 - 7
この期間で本番サイト実装の実装、公開を行いました。当初は6月15日公開の予定でしたがトラブルが発生し、最終的にWebサイトの初回公開は7月7日となりました。このあたりの技術的な話は別の投稿で、、、
デザインチームとシステムチームともに進捗が遅れている認識があったため、必要であれば毎週進捗確認のミーティングを実施してカバーしてました。デザインのやり取りはAdobe XDを使用することでだいぶコミュニケーションの齟齬が無くなりスムーズに進めることができました。

【ワンポイント】
メンバー全員がボランティアということであまり頻繁に打ち合わせを設定することは控えてました。ですがスケジュールがピンチということで、毎週の進捗、認識合わせの打ち合わせを実施したのですが結果的には成功だったと思っています。必要であればその場でのコミュニケーション、各週の進捗打ち合わせをすることも大切だと学びました。

2020/8初旬-本番まで
この時期には具体的なコンテンツの内容が確定し始める段階でした。スポンサー情報や行動規範の内容、キーノートの情報などを本番に反映しはじめ、そろそろセッションの内容も確定し実装を進める段階でした。タイムテーブルページの実装工数がかなり多かったため、タイムテーブルページは2段階で公開する方針となりました。

1段階目はsessionizeの埋め込みタイムテーブルを表示し、並行して本番用のタイムテーブルを実装するように進めました。


2段階目の公開で本番用のタイムテーブルに差し替えました。


実はsessionize埋め込みタイムテーブルと本番用のタイムテーブルを別々のパスで作成していたため、以前のパス(/session/)でアクセスすると前のタイムテーブルが見えてしまう、という状態でした。既にいろいろな記事等でタイムテーブルのリンクを記載していたため、現状のサイトでは本番用のタイムテーブル(/timetable/)にリダイレクトするように変更してます。;(´◦ω◦`):

2020/8/28-29 イベント本番
イベント本番で不具合が発覚することを想定し、システムチームのメンバーは常に対応できるようにしていました。実はTwitterで要望頂いていたセッションモーダルをESCキーで閉じるようにする修正は当日修正して当日デプロイしてました(ง •̀ω•́)ง✧


また、スピーカの方がアップロードされた資料は、スピーカの発表終了後数時間後にWebサイトに反映していたことをご存じでしょうか?当日に本番デプロイを何度も何度も実施していたので、システムチームとしてはヒヤヒヤしっぱなしでしたΣ(; ゚Д゚)ウハッ


【ワンポイント】
不具合修正、資料のアップロードなど本番時のWebサイトの修正が結構ありました。詳細は別記事でまとめる予定ですが、ビルド、デプロイ回りをできるだけ自動化することで、本番時の修正もスムーズに実施できたと思います。

2020/9 イベント終了後
スピーカーの方の発表資料の更新と、YouTubeの動画URLの修正作業を実施しました。当日のYouTube Liveは長時間の一つの動画でしたが、セッションごとに分割した動画へのリンクに修正したものへ修正してます。皆さんぜひ見てくださいね。


最後に

振り返ってみると1年近く活動してましたね。当初からスケジュールはしっかりしようとはしてましたが、初めてのことも多く結果的にWebサイトの公開も遅れてしまいました。PyCon JP 2021の開催はまだ確定ではありませんが、今年の知見を活かしてもっとより良いイベントにできるように頑張りたいと思います。(๑•̀ㅂ•́)و✧

"],"link":["http://pyconjp.blogspot.com/2020/09/pycon-jp-2020-system-looking-back-2.html"],"author":["noreply@blogger.com (Hiroya Akita)"],"media:thumbnail":[{"$":{"xmlns:media":"http://search.yahoo.com/mrss/","url":"https://1.bp.blogspot.com/-3w_6TOG5ssI/X3BCM1NorwI/AAAAAAAAD9Q/1aTWnSR_zfMhXFSQnIdmuqldOgppDH0eQCLcBGAsYHQ/s72-c/Snag_f00f2f5.png","height":"72","width":"72"}}],"thr:total":["0"]}] \ No newline at end of file diff --git a/2020/about/index.html b/2020/about/index.html index 89a1db2..860b113 100644 --- a/2020/about/index.html +++ b/2020/about/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/code-of-conduct/index.html b/2020/code-of-conduct/index.html index 89a1db2..860b113 100644 --- a/2020/code-of-conduct/index.html +++ b/2020/code-of-conduct/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/about/index.html b/2020/en/about/index.html index 89a1db2..860b113 100644 --- a/2020/en/about/index.html +++ b/2020/en/about/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/code-of-conduct/index.html b/2020/en/code-of-conduct/index.html index 89a1db2..860b113 100644 --- a/2020/en/code-of-conduct/index.html +++ b/2020/en/code-of-conduct/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/index.html b/2020/en/index.html index 89a1db2..860b113 100644 --- a/2020/en/index.html +++ b/2020/en/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/session/index.html b/2020/en/session/index.html index 89a1db2..860b113 100644 --- a/2020/en/session/index.html +++ b/2020/en/session/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/special-booth/index.html b/2020/en/special-booth/index.html index 89a1db2..860b113 100644 --- a/2020/en/special-booth/index.html +++ b/2020/en/special-booth/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/sponsor/index.html b/2020/en/sponsor/index.html index 89a1db2..860b113 100644 --- a/2020/en/sponsor/index.html +++ b/2020/en/sponsor/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/sprint/index.html b/2020/en/sprint/index.html index 89a1db2..860b113 100644 --- a/2020/en/sprint/index.html +++ b/2020/en/sprint/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/staff/index.html b/2020/en/staff/index.html index 89a1db2..860b113 100644 --- a/2020/en/staff/index.html +++ b/2020/en/staff/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/timetable/index.html b/2020/en/timetable/index.html index 89a1db2..860b113 100644 --- a/2020/en/timetable/index.html +++ b/2020/en/timetable/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/tutorial/index.html b/2020/en/tutorial/index.html index 89a1db2..860b113 100644 --- a/2020/en/tutorial/index.html +++ b/2020/en/tutorial/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/youth-coder/index.html b/2020/en/youth-coder/index.html index 89a1db2..860b113 100644 --- a/2020/en/youth-coder/index.html +++ b/2020/en/youth-coder/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/en/youtube-live/index.html b/2020/en/youtube-live/index.html index 89a1db2..860b113 100644 --- a/2020/en/youtube-live/index.html +++ b/2020/en/youtube-live/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/index.html b/2020/index.html index 89a1db2..860b113 100644 --- a/2020/index.html +++ b/2020/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/session/1/index.html b/2020/session/1/index.html index 89a1db2..860b113 100644 --- a/2020/session/1/index.html +++ b/2020/session/1/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/session/2/index.html b/2020/session/2/index.html index 89a1db2..860b113 100644 --- a/2020/session/2/index.html +++ b/2020/session/2/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/session/index.html b/2020/session/index.html index 89a1db2..860b113 100644 --- a/2020/session/index.html +++ b/2020/session/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/sitemap.xml b/2020/sitemap.xml index 4ff12fd..f0414f0 100644 --- a/2020/sitemap.xml +++ b/2020/sitemap.xml @@ -1 +1 @@ -https://pycon.jp/2020/session/1https://pycon.jp/2020/session/2https://pycon.jp/2020/about/https://pycon.jp/2020/code-of-conduct/https://pycon.jp/2020/en/https://pycon.jp/2020/session/https://pycon.jp/2020/special-booth/https://pycon.jp/2020/sponsor/https://pycon.jp/2020/sprint/https://pycon.jp/2020/staff/https://pycon.jp/2020/timetable/https://pycon.jp/2020/tutorial/https://pycon.jp/2020/youth-coder/https://pycon.jp/2020/youtube-live/https://pycon.jp/2020/en/about/https://pycon.jp/2020/en/code-of-conduct/https://pycon.jp/2020/en/session/https://pycon.jp/2020/en/special-booth/https://pycon.jp/2020/en/sponsor/https://pycon.jp/2020/en/sprint/https://pycon.jp/2020/en/staff/https://pycon.jp/2020/en/timetable/https://pycon.jp/2020/en/tutorial/https://pycon.jp/2020/en/youth-coder/https://pycon.jp/2020/en/youtube-live/https://pycon.jp/2020/ \ No newline at end of file +https://pycon.jp/2020/2020/session/1https://pycon.jp/2020/2020/session/2https://pycon.jp/2020/2020/about/https://pycon.jp/2020/2020/code-of-conduct/https://pycon.jp/2020/2020/en/https://pycon.jp/2020/2020/session/https://pycon.jp/2020/2020/special-booth/https://pycon.jp/2020/2020/sponsor/https://pycon.jp/2020/2020/sprint/https://pycon.jp/2020/2020/staff/https://pycon.jp/2020/2020/timetable/https://pycon.jp/2020/2020/tutorial/https://pycon.jp/2020/2020/youth-coder/https://pycon.jp/2020/2020/youtube-live/https://pycon.jp/2020/2020/en/about/https://pycon.jp/2020/2020/en/code-of-conduct/https://pycon.jp/2020/2020/en/session/https://pycon.jp/2020/2020/en/special-booth/https://pycon.jp/2020/2020/en/sponsor/https://pycon.jp/2020/2020/en/sprint/https://pycon.jp/2020/2020/en/staff/https://pycon.jp/2020/2020/en/timetable/https://pycon.jp/2020/2020/en/tutorial/https://pycon.jp/2020/2020/en/youth-coder/https://pycon.jp/2020/2020/en/youtube-live/https://pycon.jp/2020/2020/ \ No newline at end of file diff --git a/2020/special-booth/index.html b/2020/special-booth/index.html index 89a1db2..860b113 100644 --- a/2020/special-booth/index.html +++ b/2020/special-booth/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/sponsor/index.html b/2020/sponsor/index.html index 89a1db2..860b113 100644 --- a/2020/sponsor/index.html +++ b/2020/sponsor/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/sprint/index.html b/2020/sprint/index.html index 89a1db2..860b113 100644 --- a/2020/sprint/index.html +++ b/2020/sprint/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/staff/index.html b/2020/staff/index.html index 89a1db2..860b113 100644 --- a/2020/staff/index.html +++ b/2020/staff/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/timetable/index.html b/2020/timetable/index.html index 89a1db2..860b113 100644 --- a/2020/timetable/index.html +++ b/2020/timetable/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/tutorial/index.html b/2020/tutorial/index.html index 89a1db2..860b113 100644 --- a/2020/tutorial/index.html +++ b/2020/tutorial/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/youth-coder/index.html b/2020/youth-coder/index.html index 89a1db2..860b113 100644 --- a/2020/youth-coder/index.html +++ b/2020/youth-coder/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/2020/youtube-live/index.html b/2020/youtube-live/index.html index 89a1db2..860b113 100644 --- a/2020/youtube-live/index.html +++ b/2020/youtube-live/index.html @@ -1,9 +1,9 @@ - PyCon JP 2020 - PyCon JP 2020 + PyCon JP 2020 - PyCon JP 2020
Loading...
- + diff --git a/locales/en.json b/locales/en.json index ac23323..f51b3dd 100644 --- a/locales/en.json +++ b/locales/en.json @@ -15,6 +15,10 @@ "title": "TimeTable", "path": "timetable" }, + { + "title": "Special Booth", + "path": "special-booth" + }, { "title": "Tutorial", "path": "tutorial" diff --git a/locales/ja.json b/locales/ja.json index 06bb56c..e0229fd 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -15,6 +15,10 @@ "title": "タイムテーブル", "path": "timetable" }, + { + "title": "スペシャルブース", + "path": "special-booth" + }, { "title": "チュートリアル", "path": "tutorial"