diff --git a/batch-service/cloudbuild-trend-article-crawler.yaml b/batch-service/cloudbuild-trend-article-crawler.yaml new file mode 100644 index 00000000..a8687adc --- /dev/null +++ b/batch-service/cloudbuild-trend-article-crawler.yaml @@ -0,0 +1,26 @@ +substitutions: + _IMAGE: 'asia-northeast1-docker.pkg.dev/geek-picks-staging/trend-article-crawler/latest' + _JOB_NAME: 'trend-article-crawler' + _REGION: 'asia-northeast1' +steps: +# Build the container image +- name: 'gcr.io/cloud-builders/docker' + args: ['build', '-t', 'gcr.io/$PROJECT_ID/$_IMAGE',' -f ', 'Dockerfile.trend-article-crawler', '.'] +# Push the container image to Container Registry +- name: 'gcr.io/cloud-builders/docker' + args: ['push', 'gcr.io/$PROJECT_ID/$_IMAGE'] +# Deploy container image to Cloud Run +- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + entrypoint: gcloud + args: + - 'run' + - 'jobs' + - 'deploy' + - '$_JOB_NAME' + - '--image' + - 'gcr.io/$PROJECT_ID/$_IMAGE' + - '--region' + - '$_REGION' + - '--execute-now' +images: +- gcr.io/$PROJECT_ID/$_IMAGE \ No newline at end of file diff --git a/sample/package-lock.json b/sample/package-lock.json deleted file mode 100644 index 0795dae1..00000000 --- a/sample/package-lock.json +++ /dev/null @@ -1,1245 +0,0 @@ -{ - "name": "sample", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sample", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "axios": "^1.6.8", - "cheerio": "^1.0.0-rc.12", - "jsdom": "^24.0.0", - "rss-parser": "^3.13.0" - }, - "devDependencies": { - "@types/jsdom": "^21.1.6", - "@types/node": "^20.11.30", - "nodemon": "^3.1.0", - "ts-node": "^10.9.2", - "typescript": "^5.4.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/jsdom": { - "version": "21.1.6", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.6.tgz", - "integrity": "sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.16.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nodemon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", - "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" - }, - "node_modules/rss-parser": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", - "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", - "dependencies": { - "entities": "^2.0.3", - "xml2js": "^0.5.0" - } - }, - "node_modules/rss-parser/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "engines": { - "node": ">=18" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/sample/package.json b/sample/package.json deleted file mode 100644 index 4963a2db..00000000 --- a/sample/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "sample", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "npm run build:live", - "build": "tsc -p .", - "build:live": "nodemon --watch 'src/**/*.ts' --exec \"ts-node\" src/index.ts", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@types/jsdom": "^21.1.6", - "@types/node": "^20.11.30", - "nodemon": "^3.1.0", - "ts-node": "^10.9.2", - "typescript": "^5.4.3" - }, - "dependencies": { - "axios": "^1.6.8", - "cheerio": "^1.0.0-rc.12", - "jsdom": "^24.0.0", - "rss-parser": "^3.13.0" - } -} diff --git a/sample/src/apis/devto.ts b/sample/src/apis/devto.ts deleted file mode 100644 index d4509e2e..00000000 --- a/sample/src/apis/devto.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { convertRssToJson } from "./rss"; - -export const fetchDevTo = async () => { - const data = await convertRssToJson("https://dev.to/feed"); - console.log("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥"); - console.log(data); - return data; -}; diff --git a/sample/src/apis/hatena.ts b/sample/src/apis/hatena.ts deleted file mode 100644 index f8b51beb..00000000 --- a/sample/src/apis/hatena.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { convertRssToJson } from "./rss"; - -export const fetchHatena = async () => { - const data = await convertRssToJson("https://b.hatena.ne.jp/hotentry/it.rss"); - // console.log("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥"); - return data; -}; diff --git a/sample/src/apis/qiita.ts b/sample/src/apis/qiita.ts deleted file mode 100644 index 5b6df040..00000000 --- a/sample/src/apis/qiita.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { convertRssToJson } from "./rss"; - -export const fetchQiita = async () => { - const data = await convertRssToJson( - "https://qiita.com/popular-items/feed.atom" - ); - console.log("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥"); - console.log(data); - return data; -}; diff --git a/sample/src/apis/rss.ts b/sample/src/apis/rss.ts deleted file mode 100644 index 2e38c617..00000000 --- a/sample/src/apis/rss.ts +++ /dev/null @@ -1,58 +0,0 @@ -import Parser from "rss-parser"; -import { Rss } from "../types/rss"; -import axios from "axios"; -import { JSDOM } from "jsdom"; - -const parser = new Parser(); - -export const convertRssToJson = async (url: string) => { - const feed = await parser.parseURL(url); - const rssList: Rss[] = []; - for await (const item of feed.items) { - if (!item?.link) return; - const image = !!item.link ? await getOgpImage(item.link) : ""; - const newRss: Rss = { - date: item?.date || "", - title: item?.title || "", - link: item?.link || "", - contentEncoded: item?.["content:encoded"] || "", - contentEncodedSnippet: item?.["content:encodedSnippet"] || "", - dcDate: item?.["dc:date"] || "", - content: item?.content || "", - contentSnippet: item?.contentSnippet || "", - rdfAbout: item?.["rdf:about"] || "", - isoDate: item?.isoDate || "", - image: image, - }; - rssList.push(newRss); - } - - return rssList; -}; - -export const getOgpImage = async (url: string) => { - let image = ""; - try { - const encodedUri = encodeURI(url); - const headers = { "User-Agent": "bot" }; - const res = await axios.get(encodedUri, { headers: headers }); - const html = res.data; - const dom = new JSDOM(html); - const meta = dom.window.document.head.querySelectorAll("meta"); - - const ogp = [...meta] - .filter((element: Element) => element.hasAttribute("property")) - .reduce((previous: any, current: Element) => { - const property = current.getAttribute("property")?.trim(); - if (!property) return; - const content = current.getAttribute("content"); - previous[property] = content; - return previous; - }, {}); - image = ogp["og:image"] as string; - } catch (e) { - console.log(e); - } - - return image; -}; diff --git a/sample/src/apis/zenn.ts b/sample/src/apis/zenn.ts deleted file mode 100644 index 070f7000..00000000 --- a/sample/src/apis/zenn.ts +++ /dev/null @@ -1,67 +0,0 @@ -import axios from "axios"; -import { load } from "cheerio"; - -import { ZennArticle } from "../types/zenn"; -import { convertRssToJson } from "./rss"; - -export const fetchZennV2 = async () => { - const data = await convertRssToJson("https://zenn.dev/feed"); - console.log("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥"); - console.log(data); - return data; -}; - -export const fetchZenn = async () => { - const url = "https://zenn.dev/"; - - const { data } = await axios.get(url); - - const $ = load(data); - const raw = $("script[id=__NEXT_DATA__]").html() ?? ""; - if (raw === undefined) return {}; - const rawData = JSON.parse(raw).props.pageProps.dailyTechArticles; - - const articles: ZennArticle = rawData.map((article: any) => { - const newArticle: ZennArticle = { - id: article.id, - postType: article.postType, - title: article.title, - slug: article.slug, - commentsCount: article.commentsCount, - likedCount: article.likedCount, - bodyLettersCount: article.bodyLettersCount, - articleType: article.articleType, - emoji: article.emoji, - isSuspendingPrivate: article.isSuspendingPrivate, - publishedAt: article.publishedAt, - bodyUpdatedAt: article.bodyUpdatedAt, - sourceRepoUpdatedAt: article.sourceRepoUpdatedAt, - pinned: article.pinned, - path: article.path, - }; - - if (article.user) { - newArticle.user = { - id: article.user.id, - username: article.user.username, - name: article.user.name, - avatarSmallUrl: article.user.avatarSmallUrl, - }; - } - - if (article.publication) { - newArticle.publication = { - id: article.publication.id, - name: article.publication.name, - displayName: article.publication.displayName, - avatarSmallUrl: article.publication.avatarSmallUrl, - pro: article.publication.pro, - avatarRegistered: article.publication.avatarRegistered, - }; - } - - return newArticle; - }); - - return articles; -}; diff --git a/sample/src/index.ts b/sample/src/index.ts deleted file mode 100644 index 7f0c0e8d..00000000 --- a/sample/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { fetchZenn, fetchZennV2 } from "./apis/zenn"; -// import { fetchHatena } from "./apis/hatena"; -import { fetchQiita } from "./apis/qiita"; -import { fetchDevTo } from "./apis/devto"; - -// fetchZenn(); -// fetchHatena(); -// fetchZennV2(); -// fetchDevTo(); diff --git a/sample/src/rss/data.json b/sample/src/rss/data.json deleted file mode 100644 index b14a77be..00000000 --- a/sample/src/rss/data.json +++ /dev/null @@ -1,390 +0,0 @@ -[ - { - "date": "2024-03-19T03:53:51Z", - "title": "個人サイトの再来なるか、趣味の記録に特化したメモブログサービスをMozillaがリリース【やじうまWatch】", - "link": "https://internet.watch.impress.co.jp/docs/yajiuma/1577361.html", - "contentEncoded": "
\"\" 個人サイトの再来なるか、趣味の記録に特化したメモブログサービスをMozillaがリリース【やじうまWatch】

\"個人サイトの再来なるか、趣味の記録に特化したメモブログサービスをMozillaがリリース【やじうまWatch】\"

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "個人サイトの再来なるか、趣味の記録に特化したメモブログサービスをMozillaがリリース【やじうまWatch】", - "dcDate": "2024-03-19T03:53:51Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://internet.watch.impress.co.jp/docs/yajiuma/1577361.html", - "isoDate": "2024-03-19T03:53:51.000Z", - "image": "https://internet.watch.impress.co.jp/img/iw/list/1577/361/yajiuma-watch_1.png" - }, - { - "date": "2024-03-19T01:38:42Z", - "title": "AIボイチェンソフト「Voidol 1」が無償化", - "link": "https://pc.watch.impress.co.jp/docs/news/1577403.html", - "contentEncoded": "
\"\" AIボイチェンソフト「Voidol 1」が無償化

\"AIボイチェンソフト「Voidol

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "AIボイチェンソフト「Voidol 1」が無償化", - "dcDate": "2024-03-19T01:38:42Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://pc.watch.impress.co.jp/docs/news/1577403.html", - "isoDate": "2024-03-19T01:38:42.000Z", - "image": "https://pc.watch.impress.co.jp/img/pcw/list/1577/403/01.jpg" - }, - { - "date": "2024-03-19T02:03:42Z", - "title": "『言いたいことはわかるが、その言い方で味方になってくれる人は少ないと思う』みたいな話はインターネットには大変多い", - "link": "https://togetter.com/li/2334491", - "contentEncoded": "
\"\" 『言いたいことはわかるが、その言い方で味方になってくれる人は少ないと思う』みたいな話はインターネットには大変多い

\"『言いたいことはわかるが、その言い方で味方になってくれる人は少ないと思う』みたいな話はインターネットには大変多い\"

九条水音 @mizune 魔界戦線チャンネルで配信しているプリ☆チャンアイドルです。noteを中心にキラッと配信してます。アイドルアニメ、大好き!アイドルネーム:九条ミズネ note→note.com/mizune note.mu/mizune

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "『言いたいことはわかるが、その言い方で味方になってくれる人は少ないと思う』みたいな話はインターネットには大変多い\n\n九条水音 @mizune 魔界戦線チャンネルで配信しているプリ☆チャンアイドルです。noteを中心にキラッと配信してます。アイドルアニメ、大好き!アイドルネーム:九条ミズネ note→note.com/mizune note.mu/mizune", - "dcDate": "2024-03-19T02:03:42Z", - "content": "九条水音 @mizune 魔界戦線チャンネルで配信しているプリ☆チャンアイドルです。noteを中心にキラッと配信してます。アイドルアニメ、大好き!アイドルネーム:九条ミズネ note→note.com/mizune note.mu/mizune", - "contentSnippet": "九条水音 @mizune 魔界戦線チャンネルで配信しているプリ☆チャンアイドルです。noteを中心にキラッと配信してます。アイドルアニメ、大好き!アイドルネーム:九条ミズネ note→note.com/mizune note.mu/mizune", - "rdfAbout": "https://togetter.com/li/2334491", - "isoDate": "2024-03-19T02:03:42.000Z", - "image": "https://s.togetter.com/ogp2/48b91d2e88026b819b811a9c78a64a7b-1200x630.png" - }, - { - "date": "2024-03-19T02:00:17Z", - "title": "なぜオフショア開発でベトナムがひとり勝ちしているのか?", - "link": "https://offshore.icd.co.jp/blog/offshore-vietnam", - "contentEncoded": "
\"\" なぜオフショア開発でベトナムがひとり勝ちしているのか?

\"なぜオフショア開発でベトナムがひとり勝ちしているのか?\"

あなたは今、オフショアを検討しているが、様々な国の選択肢がある中で、なぜ「ベトナム」というワードをよく聞くのか気になっているところではないでしょうか。まず大前提として「ベトナム」を第一候補として取り上げるのは間違いないでしょう。 それではなぜ、ベトナムを第一候補として取り上げて良いのか?まさに、ベ...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "なぜオフショア開発でベトナムがひとり勝ちしているのか?\n\nあなたは今、オフショアを検討しているが、様々な国の選択肢がある中で、なぜ「ベトナム」というワードをよく聞くのか気になっているところではないでしょうか。まず大前提として「ベトナム」を第一候補として取り上げるのは間違いないでしょう。 それではなぜ、ベトナムを第一候補として取り上げて良いのか?まさに、ベ...", - "dcDate": "2024-03-19T02:00:17Z", - "content": "あなたは今、オフショアを検討しているが、様々な国の選択肢がある中で、なぜ「ベトナム」というワードをよく聞くのか気になっているところではないでしょうか。まず大前提として「ベトナム」を第一候補として取り上げるのは間違いないでしょう。 それではなぜ、ベトナムを第一候補として取り上げて良いのか?まさに、ベ...", - "contentSnippet": "あなたは今、オフショアを検討しているが、様々な国の選択肢がある中で、なぜ「ベトナム」というワードをよく聞くのか気になっているところではないでしょうか。まず大前提として「ベトナム」を第一候補として取り上げるのは間違いないでしょう。 それではなぜ、ベトナムを第一候補として取り上げて良いのか?まさに、ベ...", - "rdfAbout": "https://offshore.icd.co.jp/blog/offshore-vietnam", - "isoDate": "2024-03-19T02:00:17.000Z", - "image": "https://offshore.icd.co.jp/blog/wp-content/uploads/2024/03/オフショア_ベトナム_05.jpg" - }, - { - "date": "2024-03-19T04:11:53Z", - "title": "RAGの実装戦略まとめ - Qiita", - "link": "https://qiita.com/jw-automation/items/045917be7b558509fdf2", - "contentEncoded": "
\"\" RAGの実装戦略まとめ - Qiita

\"RAGの実装戦略まとめ

それでは以下、簡単なデモを含めながら個別に説明していきます。 1. ハイブリッドサーチ こちらは、性質の異なる複数の検索方式(例えばベクトル検索とキーワード検索)を組み合わせて検索精度を向上させる手法になります。 各検索方式単体の場合に比べ、性質の異なる検索方式を組み合わせ、ある種いいとこ取りをする事...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "RAGの実装戦略まとめ - Qiita\n\nそれでは以下、簡単なデモを含めながら個別に説明していきます。 1. ハイブリッドサーチ こちらは、性質の異なる複数の検索方式(例えばベクトル検索とキーワード検索)を組み合わせて検索精度を向上させる手法になります。 各検索方式単体の場合に比べ、性質の異なる検索方式を組み合わせ、ある種いいとこ取りをする事...", - "dcDate": "2024-03-19T04:11:53Z", - "content": "それでは以下、簡単なデモを含めながら個別に説明していきます。 1. ハイブリッドサーチ こちらは、性質の異なる複数の検索方式(例えばベクトル検索とキーワード検索)を組み合わせて検索精度を向上させる手法になります。 各検索方式単体の場合に比べ、性質の異なる検索方式を組み合わせ、ある種いいとこ取りをする事...", - "contentSnippet": "それでは以下、簡単なデモを含めながら個別に説明していきます。 1. ハイブリッドサーチ こちらは、性質の異なる複数の検索方式(例えばベクトル検索とキーワード検索)を組み合わせて検索精度を向上させる手法になります。 各検索方式単体の場合に比べ、性質の異なる検索方式を組み合わせ、ある種いいとこ取りをする事...", - "rdfAbout": "https://qiita.com/jw-automation/items/045917be7b558509fdf2", - "isoDate": "2024-03-19T04:11:53.000Z", - "image": "https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9UkFHJUUzJTgxJUFFJUU1JUFFJTlGJUU4JUEzJTg1JUU2JTg4JUE2JUU3JTk1JUE1JUUzJTgxJUJFJUUzJTgxJUE4JUUzJTgyJTgxJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz00OGM3ZDViYTVhZDYzNDljN2RmZDM2YWViN2UzMTJhNw&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTcxNiZ0eHQ9JTQwanctYXV0b21hdGlvbiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTMyJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZDhhOTZhMTFhNDA4NzMyZjc0ZmM3N2YwOWNiMjhmMjM&blend-x=142&blend-y=491&blend-mode=normal&s=bdd91c628d57624685318560a6532fb2" - }, - { - "date": "2024-03-18T17:40:34Z", - "title": "WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport | RxDB - JavaScript Database", - "link": "https://rxdb.info/articles/websockets-sse-polling-webrtc-webtransport.html", - "contentEncoded": "
\"\" WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport | RxDB - JavaScript Database

\"WebSockets

For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, long-polling was the only option available. ...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport | RxDB - JavaScript Database\n\nFor modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, long-polling was the only option available. ...", - "dcDate": "2024-03-18T17:40:34Z", - "content": "For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, long-polling was the only option available. ...", - "contentSnippet": "For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, long-polling was the only option available. ...", - "rdfAbout": "https://rxdb.info/articles/websockets-sse-polling-webrtc-webtransport.html", - "isoDate": "2024-03-18T17:40:34.000Z", - "image": "https://rxdb.info/img/rxdb_social_card.png" - }, - { - "date": "2021-07-22T23:28:58Z", - "title": "はじめに | ちいさな Web ブラウザを作ってみよう", - "link": "https://browserbook.shift-js.info/intro/", - "contentEncoded": "
\"\" はじめに | ちいさな Web ブラウザを作ってみよう

\"はじめに

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "はじめに | ちいさな Web ブラウザを作ってみよう", - "dcDate": "2021-07-22T23:28:58Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://browserbook.shift-js.info/intro/", - "isoDate": "2021-07-22T23:28:58.000Z", - "image": "https://browserbook.shift-js.info/banner.png" - }, - { - "date": "2024-03-19T00:47:47Z", - "title": "日頃の作業を自動化して得られたもの - Pepabo Tech Portal", - "link": "https://tech.pepabo.com/2024/03/19/merit-of-automation/", - "contentEncoded": "
\"\" 日頃の作業を自動化して得られたもの - Pepabo Tech Portal

\"日頃の作業を自動化して得られたもの

minne事業部のnissyiです。私は最近、運用・開発業務の時間を確保するために、便利なツールを導入したり、ちょっとしたプログラムを書いて自動化したりしています。今回は、日頃の業務の自動化を進めたことで得られたものについて書きます。 自動化を進めたことで得られたもの 身近なところで自動化は可能 自動化の損益...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "日頃の作業を自動化して得られたもの - Pepabo Tech Portal\n\nminne事業部のnissyiです。私は最近、運用・開発業務の時間を確保するために、便利なツールを導入したり、ちょっとしたプログラムを書いて自動化したりしています。今回は、日頃の業務の自動化を進めたことで得られたものについて書きます。 自動化を進めたことで得られたもの 身近なところで自動化は可能 自動化の損益...", - "dcDate": "2024-03-19T00:47:47Z", - "content": "minne事業部のnissyiです。私は最近、運用・開発業務の時間を確保するために、便利なツールを導入したり、ちょっとしたプログラムを書いて自動化したりしています。今回は、日頃の業務の自動化を進めたことで得られたものについて書きます。 自動化を進めたことで得られたもの 身近なところで自動化は可能 自動化の損益...", - "contentSnippet": "minne事業部のnissyiです。私は最近、運用・開発業務の時間を確保するために、便利なツールを導入したり、ちょっとしたプログラムを書いて自動化したりしています。今回は、日頃の業務の自動化を進めたことで得られたものについて書きます。 自動化を進めたことで得られたもの 身近なところで自動化は可能 自動化の損益...", - "rdfAbout": "https://tech.pepabo.com/2024/03/19/merit-of-automation/", - "isoDate": "2024-03-19T00:47:47.000Z", - "image": "https://tech.pepabo.com/blog/2024/03/19/merit-of-automation/eye_catch.jpg" - }, - { - "date": "2024-03-19T01:08:48Z", - "title": "会計システムのアーキテクチャとモデリング ~会計というドメインを Rust で表現している話~ - CADDi Tech Blog", - "link": "https://caddi.tech/2024/03/19/095020", - "contentEncoded": "
\"\" 会計システムのアーキテクチャとモデリング ~会計というドメインを Rust で表現している話~ - CADDi Tech Blog

\"会計システムのアーキテクチャとモデリング

はじめに こんにちは。 バックエンドエンジニアの松本です。今回は、会計システムの開発を通じて、 CADDi におけるプロダクト開発の様子を紹介します。 2024年3月現在、CADDiでは2つのサービスを提供しています。1つは図面データ活用クラウド「CADDi Drawer」で、もう1つは加工品製造サービス「CADDi Manufacturing」で...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "会計システムのアーキテクチャとモデリング ~会計というドメインを Rust で表現している話~ - CADDi Tech Blog\n\nはじめに こんにちは。 バックエンドエンジニアの松本です。今回は、会計システムの開発を通じて、 CADDi におけるプロダクト開発の様子を紹介します。 2024年3月現在、CADDiでは2つのサービスを提供しています。1つは図面データ活用クラウド「CADDi Drawer」で、もう1つは加工品製造サービス「CADDi Manufacturing」で...", - "dcDate": "2024-03-19T01:08:48Z", - "content": "はじめに こんにちは。 バックエンドエンジニアの松本です。今回は、会計システムの開発を通じて、 CADDi におけるプロダクト開発の様子を紹介します。 2024年3月現在、CADDiでは2つのサービスを提供しています。1つは図面データ活用クラウド「CADDi Drawer」で、もう1つは加工品製造サービス「CADDi Manufacturing」で...", - "contentSnippet": "はじめに こんにちは。 バックエンドエンジニアの松本です。今回は、会計システムの開発を通じて、 CADDi におけるプロダクト開発の様子を紹介します。 2024年3月現在、CADDiでは2つのサービスを提供しています。1つは図面データ活用クラウド「CADDi Drawer」で、もう1つは加工品製造サービス「CADDi Manufacturing」で...", - "rdfAbout": "https://caddi.tech/2024/03/19/095020", - "isoDate": "2024-03-19T01:08:48.000Z", - "image": "https://cdn.user.blog.st-hatena.com/default_entry_og_image/159376513/1709270017315899" - }, - { - "date": "2024-03-19T03:42:28Z", - "title": "情シス子会社が「オンプレ全部無くします」と強引にクラウド化を推進し、エグい転送量に「遅い」「仕事にならないよ」「マジで遅いだけ」「遅い」と口々に怒られた", - "link": "https://togetter.com/li/2334540", - "contentEncoded": "
\"\" 情シス子会社が「オンプレ全部無くします」と強引にクラウド化を推進し、エグい転送量に「遅い」「仕事にならないよ」「マジで遅いだけ」「遅い」と口々に怒られた

\"情シス子会社が「オンプレ全部無くします」と強引にクラウド化を推進し、エグい転送量に「遅い」「仕事にならないよ」「マジで遅いだけ」「遅い」と口々に怒られた\"

vorotamoroz aka きみのぶ @vorotamoroz ルートビアが好きな、医療とかやってたけど結局機械メーカーにいる人。情報処理安全確保支援士。コンテンツとかアプリとかなんやかんや作ってます。Obsidianは良いぞ。Self-hosted LiveSyncやTagFolderの作者です。 fancy-syncing.vrtmrz.net vorotamoroz aka きみのぶ @vorotamo...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "情シス子会社が「オンプレ全部無くします」と強引にクラウド化を推進し、エグい転送量に「遅い」「仕事にならないよ」「マジで遅いだけ」「遅い」と口々に怒られた\n\nvorotamoroz aka きみのぶ @vorotamoroz ルートビアが好きな、医療とかやってたけど結局機械メーカーにいる人。情報処理安全確保支援士。コンテンツとかアプリとかなんやかんや作ってます。Obsidianは良いぞ。Self-hosted LiveSyncやTagFolderの作者です。 fancy-syncing.vrtmrz.net vorotamoroz aka きみのぶ @vorotamo...", - "dcDate": "2024-03-19T03:42:28Z", - "content": "vorotamoroz aka きみのぶ @vorotamoroz ルートビアが好きな、医療とかやってたけど結局機械メーカーにいる人。情報処理安全確保支援士。コンテンツとかアプリとかなんやかんや作ってます。Obsidianは良いぞ。Self-hosted LiveSyncやTagFolderの作者です。 fancy-syncing.vrtmrz.net vorotamoroz aka きみのぶ @vorotamo...", - "contentSnippet": "vorotamoroz aka きみのぶ @vorotamoroz ルートビアが好きな、医療とかやってたけど結局機械メーカーにいる人。情報処理安全確保支援士。コンテンツとかアプリとかなんやかんや作ってます。Obsidianは良いぞ。Self-hosted LiveSyncやTagFolderの作者です。 fancy-syncing.vrtmrz.net vorotamoroz aka きみのぶ @vorotamo...", - "rdfAbout": "https://togetter.com/li/2334540", - "isoDate": "2024-03-19T03:42:28.000Z", - "image": "https://s.togetter.com/ogp2/475d99cc4148b36611aaab60e61c0085-1200x630.png" - }, - { - "date": "2024-03-19T08:44:40Z", - "title": "OS標準の強力ファイル複製コマンド「robocopy」を活用したGUI定期バックアップソフト/指定した日・曜日・時刻に自動実行、メール通知にも対応【レビュー】", - "link": "https://forest.watch.impress.co.jp/docs/review/1575012.html", - "contentEncoded": "
\"\" OS標準の強力ファイル複製コマンド「robocopy」を活用したGUI定期バックアップソフト/指定した日・曜日・時刻に自動実行、メール通知にも対応【レビュー】

\"OS標準の強力ファイル複製コマンド「robocopy」を活用したGUI定期バックアップソフト/指定した日・曜日・時刻に自動実行、メール通知にも対応【レビュー】\"

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "OS標準の強力ファイル複製コマンド「robocopy」を活用したGUI定期バックアップソフト/指定した日・曜日・時刻に自動実行、メール通知にも対応【レビュー】", - "dcDate": "2024-03-19T08:44:40Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://forest.watch.impress.co.jp/docs/review/1575012.html", - "isoDate": "2024-03-19T08:44:40.000Z", - "image": "https://forest.watch.impress.co.jp/img/wf/list/1575/012/image_top.png" - }, - { - "date": "2024-03-18T11:54:35Z", - "title": "たった2つのステップを意識するだけで書けない単体テストがほぼなくなる - Qiita", - "link": "https://qiita.com/_mi/items/ce66aa922ee46b00ab2d", - "contentEncoded": "
\"\" たった2つのステップを意識するだけで書けない単体テストがほぼなくなる - Qiita

\"たった2つのステップを意識するだけで書けない単体テストがほぼなくなる

はじめに この記事は レガシーコード改善ガイド: 保守開発のためのリファクタリング を参考に手を動かしてみて、ある程度自分の中で体系的にまとまった知識のアウトプットです。 この記事で扱う内容 この記事で扱うのは主にレガシーコードで単体テストを書く際のハードルになりがちな 依存関係の排除 に関する手法を紹介...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "たった2つのステップを意識するだけで書けない単体テストがほぼなくなる - Qiita\n\nはじめに この記事は レガシーコード改善ガイド: 保守開発のためのリファクタリング を参考に手を動かしてみて、ある程度自分の中で体系的にまとまった知識のアウトプットです。 この記事で扱う内容 この記事で扱うのは主にレガシーコードで単体テストを書く際のハードルになりがちな 依存関係の排除 に関する手法を紹介...", - "dcDate": "2024-03-18T11:54:35Z", - "content": "はじめに この記事は レガシーコード改善ガイド: 保守開発のためのリファクタリング を参考に手を動かしてみて、ある程度自分の中で体系的にまとまった知識のアウトプットです。 この記事で扱う内容 この記事で扱うのは主にレガシーコードで単体テストを書く際のハードルになりがちな 依存関係の排除 に関する手法を紹介...", - "contentSnippet": "はじめに この記事は レガシーコード改善ガイド: 保守開発のためのリファクタリング を参考に手を動かしてみて、ある程度自分の中で体系的にまとまった知識のアウトプットです。 この記事で扱う内容 この記事で扱うのは主にレガシーコードで単体テストを書く際のハードルになりがちな 依存関係の排除 に関する手法を紹介...", - "rdfAbout": "https://qiita.com/_mi/items/ce66aa922ee46b00ab2d", - "isoDate": "2024-03-18T11:54:35.000Z", - "image": "https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9JUUzJTgxJTlGJUUzJTgxJUEzJUUzJTgxJTlGJUVGJUJDJTkyJUUzJTgxJUE0JUUzJTgxJUFFJUUzJTgyJUI5JUUzJTgzJTg2JUUzJTgzJTgzJUUzJTgzJTk3JUUzJTgyJTkyJUU2JTg0JThGJUU4JUFEJTk4JUUzJTgxJTk5JUUzJTgyJThCJUUzJTgxJUEwJUUzJTgxJTkxJUUzJTgxJUE3JUU2JTlCJUI4JUUzJTgxJTkxJUUzJTgxJUFBJUUzJTgxJTg0JUU1JThEJTk4JUU0JUJEJTkzJUUzJTgzJTg2JUUzJTgyJUI5JUUzJTgzJTg4JUUzJTgxJThDJUUzJTgxJUJCJUUzJTgxJUJDJUUzJTgxJUFBJUUzJTgxJThGJUUzJTgxJUFBJUUzJTgyJThCJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1iMDQ4ZDZkYWRiNzk1NDFjYjg0MDI3MDI2ZGQ2NGQzNQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTcxNiZ0eHQ9JTQwX21pJTIwaW4lMjAlRTYlQTAlQUElRTUlQkMlOEYlRTQlQkMlOUElRTclQTQlQkVXb3JrcyUyMEh1bWFuJTIwSW50ZWxsaWdlbmNlJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzImdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0yM2ExOTBmYWQ2NjlhMjNkZTM3Zjk1YWVkYjI2MTNiYg&blend-x=142&blend-y=491&blend-mode=normal&s=baf2bd09551ee5b05d70ae759f4344c3" - }, - { - "date": "2024-03-18T22:18:23Z", - "title": "NVIDIA、1パッケージに2ダイの新型GPU「Blackwell」。AI性能は学習4倍、推論30倍に", - "link": "https://pc.watch.impress.co.jp/docs/news/1577301.html", - "contentEncoded": "
\"\" NVIDIA、1パッケージに2ダイの新型GPU「Blackwell」。AI性能は学習4倍、推論30倍に

\"NVIDIA、1パッケージに2ダイの新型GPU「Blackwell」。AI性能は学習4倍、推論30倍に\"

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "NVIDIA、1パッケージに2ダイの新型GPU「Blackwell」。AI性能は学習4倍、推論30倍に", - "dcDate": "2024-03-18T22:18:23Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://pc.watch.impress.co.jp/docs/news/1577301.html", - "isoDate": "2024-03-18T22:18:23.000Z", - "image": "https://pc.watch.impress.co.jp/img/pcw/list/1577/301/001.jpg" - }, - { - "date": "2024-03-18T23:28:36Z", - "title": "大学院入学の年齢について – AIシステム医科学@国立 東京医科歯科大学 【Shimizu Lab】", - "link": "https://shimizuhideyuki-lab.org/age-limitation/", - "contentEncoded": "
\"\" 大学院入学の年齢について – AIシステム医科学@国立 東京医科歯科大学 【Shimizu Lab】

\"大学院入学の年齢について

【PIを目指すための修行開始時期について】 私達の大学院受け入れ条件の1は「将来的に博士号取得を経て学術/産業/医療界でのPrincipal Investigator (アカデミアの教授・企業の研究本部長等)を本気で目指している方」です。本気でPIを目指すためにはearly careerのうちから覚悟を決めて&情熱を持って修業しなければなり...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "大学院入学の年齢について – AIシステム医科学@国立 東京医科歯科大学 【Shimizu Lab】\n\n【PIを目指すための修行開始時期について】 私達の大学院受け入れ条件の1は「将来的に博士号取得を経て学術/産業/医療界でのPrincipal Investigator (アカデミアの教授・企業の研究本部長等)を本気で目指している方」です。本気でPIを目指すためにはearly careerのうちから覚悟を決めて&情熱を持って修業しなければなり...", - "dcDate": "2024-03-18T23:28:36Z", - "content": "【PIを目指すための修行開始時期について】 私達の大学院受け入れ条件の1は「将来的に博士号取得を経て学術/産業/医療界でのPrincipal Investigator (アカデミアの教授・企業の研究本部長等)を本気で目指している方」です。本気でPIを目指すためにはearly careerのうちから覚悟を決めて&情熱を持って修業しなければなり...", - "contentSnippet": "【PIを目指すための修行開始時期について】 私達の大学院受け入れ条件の1は「将来的に博士号取得を経て学術/産業/医療界でのPrincipal Investigator (アカデミアの教授・企業の研究本部長等)を本気で目指している方」です。本気でPIを目指すためにはearly careerのうちから覚悟を決めて&情熱を持って修業しなければなり...", - "rdfAbout": "https://shimizuhideyuki-lab.org/age-limitation/", - "isoDate": "2024-03-18T23:28:36.000Z" - }, - { - "date": "2024-03-19T08:07:22Z", - "title": "生成AIが画像1枚から高品質3Dモデルの映像を作成する「Stable Video 3D」が公開/Stability AIが「Stable Video Diffusion」の技術を応用した生成モデルを開発", - "link": "https://forest.watch.impress.co.jp/docs/news/1577638.html", - "contentEncoded": "
\"\" 生成AIが画像1枚から高品質3Dモデルの映像を作成する「Stable Video 3D」が公開/Stability AIが「Stable Video Diffusion」の技術を応用した生成モデルを開発

\"生成AIが画像1枚から高品質3Dモデルの映像を作成する「Stable

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "生成AIが画像1枚から高品質3Dモデルの映像を作成する「Stable Video 3D」が公開/Stability AIが「Stable Video Diffusion」の技術を応用した生成モデルを開発", - "dcDate": "2024-03-19T08:07:22Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://forest.watch.impress.co.jp/docs/news/1577638.html", - "isoDate": "2024-03-19T08:07:22.000Z", - "image": "https://forest.watch.impress.co.jp/img/wf/list/1577/638/image-top2.png" - }, - { - "date": "2024-03-19T09:39:54Z", - "title": "文字起こしAI「オートメモ」に要約機能 議事録作成時間を8割削減", - "link": "https://www.watch.impress.co.jp/docs/news/1577672.html", - "contentEncoded": "
\"\" 文字起こしAI「オートメモ」に要約機能 議事録作成時間を8割削減

\"文字起こしAI「オートメモ」に要約機能 議事録作成時間を8割削減\"

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "文字起こしAI「オートメモ」に要約機能 議事録作成時間を8割削減", - "dcDate": "2024-03-19T09:39:54Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://www.watch.impress.co.jp/docs/news/1577672.html", - "isoDate": "2024-03-19T09:39:54.000Z", - "image": "https://www.watch.impress.co.jp/img/ipw/list/1577/672/automemo_01.jpg" - }, - { - "date": "2024-03-19T00:29:36Z", - "title": "技術戦略策定のための Fact 収集術 - スタディサプリ Product Team Blog", - "link": "https://blog.studysapuri.jp/entry/2024/03/19/fact-gathering-for-tech-strategy", - "contentEncoded": "
\"\" 技術戦略策定のための Fact 収集術 - スタディサプリ Product Team Blog

\"技術戦略策定のための

こんにちは。@chaspy です。プロダクト開発部の技術戦略グループのマネージャをしています。 技術戦略グループでは、日頃開発する上での課題の投げ込みや議論、解決するための計画をボトムアップで行っています。技術戦略グループの活動については過去のアウトプットもご覧ください。 blog.studysapuri.jp また、本稿の...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "技術戦略策定のための Fact 収集術 - スタディサプリ Product Team Blog\n\nこんにちは。@chaspy です。プロダクト開発部の技術戦略グループのマネージャをしています。 技術戦略グループでは、日頃開発する上での課題の投げ込みや議論、解決するための計画をボトムアップで行っています。技術戦略グループの活動については過去のアウトプットもご覧ください。 blog.studysapuri.jp また、本稿の...", - "dcDate": "2024-03-19T00:29:36Z", - "content": "こんにちは。@chaspy です。プロダクト開発部の技術戦略グループのマネージャをしています。 技術戦略グループでは、日頃開発する上での課題の投げ込みや議論、解決するための計画をボトムアップで行っています。技術戦略グループの活動については過去のアウトプットもご覧ください。 blog.studysapuri.jp また、本稿の...", - "contentSnippet": "こんにちは。@chaspy です。プロダクト開発部の技術戦略グループのマネージャをしています。 技術戦略グループでは、日頃開発する上での課題の投げ込みや議論、解決するための計画をボトムアップで行っています。技術戦略グループの活動については過去のアウトプットもご覧ください。 blog.studysapuri.jp また、本稿の...", - "rdfAbout": "https://blog.studysapuri.jp/entry/2024/03/19/fact-gathering-for-tech-strategy", - "isoDate": "2024-03-19T00:29:36.000Z", - "image": "https://cdn-ak.f.st-hatena.com/images/fotolife/q/quipper-ja/20240316/20240316120607.png" - }, - { - "date": "2024-03-19T05:15:00Z", - "title": "Microsoft、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 | gihyo.jp", - "link": "https://gihyo.jp/article/2024/03/garnet", - "contentEncoded": "
\"\" Microsoft、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 | gihyo.jp

\"Microsoft、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開

Microsoft⁠⁠、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 Microsoftは2024年3月18日、同社の研究所が開発を進めてきた次世代の高速キャッシュシステム「Garnet」をGitHub上でオープンソースとして公開した。 Introducing Garnet – an open-source, next-generation, faster cache-store f...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "Microsoft、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 | gihyo.jp\n\nMicrosoft⁠⁠、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 Microsoftは2024年3月18日、同社の研究所が開発を進めてきた次世代の高速キャッシュシステム「Garnet」をGitHub上でオープンソースとして公開した。 Introducing Garnet – an open-source, next-generation, faster cache-store f...", - "dcDate": "2024-03-19T05:15:00Z", - "content": "Microsoft⁠⁠、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 Microsoftは2024年3月18日、同社の研究所が開発を進めてきた次世代の高速キャッシュシステム「Garnet」をGitHub上でオープンソースとして公開した。 Introducing Garnet – an open-source, next-generation, faster cache-store f...", - "contentSnippet": "Microsoft⁠⁠、次世代高速キャッシュストアシステム「Garnet」をオープンソースとして公開 Microsoftは2024年3月18日、同社の研究所が開発を進めてきた次世代の高速キャッシュシステム「Garnet」をGitHub上でオープンソースとして公開した。 Introducing Garnet – an open-source, next-generation, faster cache-store f...", - "rdfAbout": "https://gihyo.jp/article/2024/03/garnet", - "isoDate": "2024-03-19T05:15:00.000Z", - "image": "https://gihyo.jp/assets/images/ICON/2024/2232_garnet.png" - }, - { - "date": "2024-03-19T09:19:25Z", - "title": "人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー", - "link": "https://logmi.jp/business/articles/330280", - "contentEncoded": "
\"\" 人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー

\"人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー\"

The Singularity Is Nearer 人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー 世界的なイノベーション&クリエイティブの祭典として知られる「SXSW(サウス・バイ・サウスウエスト)」。2024年も各界のクリエイターやリーダー、専門家らが多数登壇し、最先端の...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー\n\nThe Singularity Is Nearer 人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー 世界的なイノベーション&クリエイティブの祭典として知られる「SXSW(サウス・バイ・サウスウエスト)」。2024年も各界のクリエイターやリーダー、専門家らが多数登壇し、最先端の...", - "dcDate": "2024-03-19T09:19:25Z", - "content": "The Singularity Is Nearer 人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー 世界的なイノベーション&クリエイティブの祭典として知られる「SXSW(サウス・バイ・サウスウエスト)」。2024年も各界のクリエイターやリーダー、専門家らが多数登壇し、最先端の...", - "contentSnippet": "The Singularity Is Nearer 人類が500歳まで生きることも可能に レイ・カーツワイル氏が予測する、2029年までに起こりうるブレイクスルー 世界的なイノベーション&クリエイティブの祭典として知られる「SXSW(サウス・バイ・サウスウエスト)」。2024年も各界のクリエイターやリーダー、専門家らが多数登壇し、最先端の...", - "rdfAbout": "https://logmi.jp/business/articles/330280", - "isoDate": "2024-03-19T09:19:25.000Z", - "image": "https://img.logmi.jp/article_images/VDH3PG17V6bxzxdTqMWugW.jpg" - }, - { - "date": "2024-03-19T00:17:09Z", - "title": "高速道路の出口案内のようなQAエンジニアでありたい ─自動テストより前にやるべきことがあると気づいた話 - Findy Engineer Lab", - "link": "https://findy-code.io/engineer-lab/nihonbuson", - "contentEncoded": "
\"\" 高速道路の出口案内のようなQAエンジニアでありたい ─自動テストより前にやるべきことがあると気づいた話 - Findy Engineer Lab

\"高速道路の出口案内のようなQAエンジニアでありたい

皆様こんにちは。QAエンジニアのブロッコリーこと風間裕也(@nihonbuson)と申します。私は本業で株式会社10XのQAエンジニアとして勤務する一方、副業としてB-Testingを開業し、さまざまな会社でQAに関する相談に乗ったり、登壇や執筆活動を行っています。 また社外活動として、ソフトウェアテスト技術振興協会(ASTER)...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "高速道路の出口案内のようなQAエンジニアでありたい ─自動テストより前にやるべきことがあると気づいた話 - Findy Engineer Lab\n\n皆様こんにちは。QAエンジニアのブロッコリーこと風間裕也(@nihonbuson)と申します。私は本業で株式会社10XのQAエンジニアとして勤務する一方、副業としてB-Testingを開業し、さまざまな会社でQAに関する相談に乗ったり、登壇や執筆活動を行っています。 また社外活動として、ソフトウェアテスト技術振興協会(ASTER)...", - "dcDate": "2024-03-19T00:17:09Z", - "content": "皆様こんにちは。QAエンジニアのブロッコリーこと風間裕也(@nihonbuson)と申します。私は本業で株式会社10XのQAエンジニアとして勤務する一方、副業としてB-Testingを開業し、さまざまな会社でQAに関する相談に乗ったり、登壇や執筆活動を行っています。 また社外活動として、ソフトウェアテスト技術振興協会(ASTER)...", - "contentSnippet": "皆様こんにちは。QAエンジニアのブロッコリーこと風間裕也(@nihonbuson)と申します。私は本業で株式会社10XのQAエンジニアとして勤務する一方、副業としてB-Testingを開業し、さまざまな会社でQAに関する相談に乗ったり、登壇や執筆活動を行っています。 また社外活動として、ソフトウェアテスト技術振興協会(ASTER)...", - "rdfAbout": "https://findy-code.io/engineer-lab/nihonbuson", - "isoDate": "2024-03-19T00:17:09.000Z", - "image": "https://cdn-ak.f.st-hatena.com/images/fotolife/b/blog-media/20240318/20240318181638.jpg" - }, - { - "date": "2024-03-19T02:46:34Z", - "title": "ZOZOTOWNのネットワークをDirect Connect 10Gから100Gに移行した話 - ZOZO TECH BLOG", - "link": "https://techblog.zozo.com/entry/zozo-dx100g", - "contentEncoded": "
\"\" ZOZOTOWNのネットワークをDirect Connect 10Gから100Gに移行した話 - ZOZO TECH BLOG

\"ZOZOTOWNのネットワークをDirect

はじめに こんにちは、技術本部SRE部フロントSREブロックの柳田です。オンプレミスとクラウドの構築・運用に携わっています。 ZOZOTOWNでは、既存システムのリプレイスプロジェクトを進行中です。リプレイス過渡期の現在、オンプレミスのネットワークとAWSのデータセンターを直接専用線で接続し、安定した高速通信を実現...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "ZOZOTOWNのネットワークをDirect Connect 10Gから100Gに移行した話 - ZOZO TECH BLOG\n\nはじめに こんにちは、技術本部SRE部フロントSREブロックの柳田です。オンプレミスとクラウドの構築・運用に携わっています。 ZOZOTOWNでは、既存システムのリプレイスプロジェクトを進行中です。リプレイス過渡期の現在、オンプレミスのネットワークとAWSのデータセンターを直接専用線で接続し、安定した高速通信を実現...", - "dcDate": "2024-03-19T02:46:34Z", - "content": "はじめに こんにちは、技術本部SRE部フロントSREブロックの柳田です。オンプレミスとクラウドの構築・運用に携わっています。 ZOZOTOWNでは、既存システムのリプレイスプロジェクトを進行中です。リプレイス過渡期の現在、オンプレミスのネットワークとAWSのデータセンターを直接専用線で接続し、安定した高速通信を実現...", - "contentSnippet": "はじめに こんにちは、技術本部SRE部フロントSREブロックの柳田です。オンプレミスとクラウドの構築・運用に携わっています。 ZOZOTOWNでは、既存システムのリプレイスプロジェクトを進行中です。リプレイス過渡期の現在、オンプレミスのネットワークとAWSのデータセンターを直接専用線で接続し、安定した高速通信を実現...", - "rdfAbout": "https://techblog.zozo.com/entry/zozo-dx100g", - "isoDate": "2024-03-19T02:46:34.000Z", - "image": "https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20240315/20240315094819.jpg" - }, - { - "date": "2024-03-19T08:27:44Z", - "title": "ZOZOTOWNにおけるマーケティングメール配信基盤の構築 - ZOZO TECH BLOG", - "link": "https://techblog.zozo.com/entry/mass-mail-delivery", - "contentEncoded": "
\"\" ZOZOTOWNにおけるマーケティングメール配信基盤の構築 - ZOZO TECH BLOG

\"ZOZOTOWNにおけるマーケティングメール配信基盤の構築

はじめに こんにちは、MA部の松岡(@pine0619)です。MA部ではマーケティングオートメーションシステムの開発・運用に従事しています。 ZOZOTOWNでは、マーケティングオートメーションシステム(以下、MAシステム)を使い、メールやLINE、アプリプッシュ通知といったチャネルへのキャンペーンを配信しています。 MA部で...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "ZOZOTOWNにおけるマーケティングメール配信基盤の構築 - ZOZO TECH BLOG\n\nはじめに こんにちは、MA部の松岡(@pine0619)です。MA部ではマーケティングオートメーションシステムの開発・運用に従事しています。 ZOZOTOWNでは、マーケティングオートメーションシステム(以下、MAシステム)を使い、メールやLINE、アプリプッシュ通知といったチャネルへのキャンペーンを配信しています。 MA部で...", - "dcDate": "2024-03-19T08:27:44Z", - "content": "はじめに こんにちは、MA部の松岡(@pine0619)です。MA部ではマーケティングオートメーションシステムの開発・運用に従事しています。 ZOZOTOWNでは、マーケティングオートメーションシステム(以下、MAシステム)を使い、メールやLINE、アプリプッシュ通知といったチャネルへのキャンペーンを配信しています。 MA部で...", - "contentSnippet": "はじめに こんにちは、MA部の松岡(@pine0619)です。MA部ではマーケティングオートメーションシステムの開発・運用に従事しています。 ZOZOTOWNでは、マーケティングオートメーションシステム(以下、MAシステム)を使い、メールやLINE、アプリプッシュ通知といったチャネルへのキャンペーンを配信しています。 MA部で...", - "rdfAbout": "https://techblog.zozo.com/entry/mass-mail-delivery", - "isoDate": "2024-03-19T08:27:44.000Z", - "image": "https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20240306/20240306152055.jpg" - }, - { - "date": "2024-03-19T04:49:18Z", - "title": "私が退学を決めた理由 – AIシステム医科学@国立 東京医科歯科大学 【Shimizu Lab】", - "link": "https://shimizuhideyuki-lab.org/why-i-quit-university/", - "contentEncoded": "
\"\" 私が退学を決めた理由 – AIシステム医科学@国立 東京医科歯科大学 【Shimizu Lab】

\"私が退学を決めた理由

ここにはご本人に「私が大学院をやめた理由」を書いてもらっています。多様な価値観・考え方に触れて、みなさん自身のキャリアを考える機会としてください。 退学を決めた理由 博士課程在籍期間: 2023.4.3-5 (3日間)、以後 休学の後に退学 大きな理由としては自分の価値観が変わったことです。 学問の追求と社会貢献はと...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "私が退学を決めた理由 – AIシステム医科学@国立 東京医科歯科大学 【Shimizu Lab】\n\nここにはご本人に「私が大学院をやめた理由」を書いてもらっています。多様な価値観・考え方に触れて、みなさん自身のキャリアを考える機会としてください。 退学を決めた理由 博士課程在籍期間: 2023.4.3-5 (3日間)、以後 休学の後に退学 大きな理由としては自分の価値観が変わったことです。 学問の追求と社会貢献はと...", - "dcDate": "2024-03-19T04:49:18Z", - "content": "ここにはご本人に「私が大学院をやめた理由」を書いてもらっています。多様な価値観・考え方に触れて、みなさん自身のキャリアを考える機会としてください。 退学を決めた理由 博士課程在籍期間: 2023.4.3-5 (3日間)、以後 休学の後に退学 大きな理由としては自分の価値観が変わったことです。 学問の追求と社会貢献はと...", - "contentSnippet": "ここにはご本人に「私が大学院をやめた理由」を書いてもらっています。多様な価値観・考え方に触れて、みなさん自身のキャリアを考える機会としてください。 退学を決めた理由 博士課程在籍期間: 2023.4.3-5 (3日間)、以後 休学の後に退学 大きな理由としては自分の価値観が変わったことです。 学問の追求と社会貢献はと...", - "rdfAbout": "https://shimizuhideyuki-lab.org/why-i-quit-university/", - "isoDate": "2024-03-19T04:49:18.000Z" - }, - { - "date": "2024-03-18T15:15:26Z", - "title": "macOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで", - "link": "https://www.publickey1.jp/blog/24/macos_sonoma_144javaapplemac.html", - "contentEncoded": "
\"\" macOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで

\"macOS

macOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで オラクルは、Appleシリコン搭載のMacでmacOS Sonoma 14.4にアップデートを行うと、Java 8以降のすべてのバージョンでJavaが予期せず終了する現象が発生するとして、Macユーザーに注意喚起を行っています。 今の...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "macOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで\n\nmacOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで オラクルは、Appleシリコン搭載のMacでmacOS Sonoma 14.4にアップデートを行うと、Java 8以降のすべてのバージョンでJavaが予期せず終了する現象が発生するとして、Macユーザーに注意喚起を行っています。 今の...", - "dcDate": "2024-03-18T15:15:26Z", - "content": "macOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで オラクルは、Appleシリコン搭載のMacでmacOS Sonoma 14.4にアップデートを行うと、Java 8以降のすべてのバージョンでJavaが予期せず終了する現象が発生するとして、Macユーザーに注意喚起を行っています。 今の...", - "contentSnippet": "macOS Sonoma 14.4にアップデートするとJavaがクラッシュするとオラクルが注意喚起。Appleシリコン搭載Macで オラクルは、Appleシリコン搭載のMacでmacOS Sonoma 14.4にアップデートを行うと、Java 8以降のすべてのバージョンでJavaが予期せず終了する現象が発生するとして、Macユーザーに注意喚起を行っています。 今の...", - "rdfAbout": "https://www.publickey1.jp/blog/24/macos_sonoma_144javaapplemac.html", - "isoDate": "2024-03-18T15:15:26.000Z", - "image": "https://www.publickey1.jp/2024/sonoma144_java01.png" - }, - { - "date": "2024-03-19T02:06:54Z", - "title": "Conventional CommitsとCHANGELOGの自動生成でリリースのユーザ影響をわかりやすくした話 - ドワンゴ教育サービス開発者ブログ", - "link": "https://blog.nnn.dev/entry/2024/03/19/110000", - "contentEncoded": "
\"\" Conventional CommitsとCHANGELOGの自動生成でリリースのユーザ影響をわかりやすくした話 - ドワンゴ教育サービス開発者ブログ

\"Conventional

ドワンゴ教育事業 バックエンドエンジニアのtakuminishです。 現在、私は教材入稿ツールの開発チームに所属しています。 教材入稿ツールは昨年の2023年06月に社内向けに正式リリースされた比較的新しいツールであり、リリース当初はリリースノートに関する運用について検討が進んでいませんでした。 リリースノートは開...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "Conventional CommitsとCHANGELOGの自動生成でリリースのユーザ影響をわかりやすくした話 - ドワンゴ教育サービス開発者ブログ\n\nドワンゴ教育事業 バックエンドエンジニアのtakuminishです。 現在、私は教材入稿ツールの開発チームに所属しています。 教材入稿ツールは昨年の2023年06月に社内向けに正式リリースされた比較的新しいツールであり、リリース当初はリリースノートに関する運用について検討が進んでいませんでした。 リリースノートは開...", - "dcDate": "2024-03-19T02:06:54Z", - "content": "ドワンゴ教育事業 バックエンドエンジニアのtakuminishです。 現在、私は教材入稿ツールの開発チームに所属しています。 教材入稿ツールは昨年の2023年06月に社内向けに正式リリースされた比較的新しいツールであり、リリース当初はリリースノートに関する運用について検討が進んでいませんでした。 リリースノートは開...", - "contentSnippet": "ドワンゴ教育事業 バックエンドエンジニアのtakuminishです。 現在、私は教材入稿ツールの開発チームに所属しています。 教材入稿ツールは昨年の2023年06月に社内向けに正式リリースされた比較的新しいツールであり、リリース当初はリリースノートに関する運用について検討が進んでいませんでした。 リリースノートは開...", - "rdfAbout": "https://blog.nnn.dev/entry/2024/03/19/110000", - "isoDate": "2024-03-19T02:06:54.000Z", - "image": "https://cdn-ak.f.st-hatena.com/images/fotolife/d/dw_takuminish/20240311/20240311095757.png" - }, - { - "date": "2024-03-19T02:31:01Z", - "title": "仕事なんて6万円ちょっとのIntel N100ノートPCで十分だった ~パソコン工房「STYLE-15FH111-N-UCEX」[Sponsored]", - "link": "https://pc.watch.impress.co.jp/docs/topic/pckoubou_review/1576979.html", - "contentEncoded": "
\"\" 仕事なんて6万円ちょっとのIntel N100ノートPCで十分だった ~パソコン工房「STYLE-15FH111-N-UCEX」[Sponsored]

\"仕事なんて6万円ちょっとのIntel

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "仕事なんて6万円ちょっとのIntel N100ノートPCで十分だった ~パソコン工房「STYLE-15FH111-N-UCEX」[Sponsored]", - "dcDate": "2024-03-19T02:31:01Z", - "content": "", - "contentSnippet": "", - "rdfAbout": "https://pc.watch.impress.co.jp/docs/topic/pckoubou_review/1576979.html", - "isoDate": "2024-03-19T02:31:01.000Z", - "image": "https://pc.watch.impress.co.jp/img/pcw/list/1576/979/1.jpg" - }, - { - "date": "2024-03-19T00:56:33Z", - "title": "CSSでスタイルクエリ(@container style())を使えるようになると、実装がいろいろ便利になる", - "link": "https://coliss.com/articles/build-websites/operation/css/superpowered-container-style-queries.html", - "contentEncoded": "
\"\" CSSでスタイルクエリ(@container style())を使えるようになると、実装がいろいろ便利になる

\"CSSでスタイルクエリ(@container

コンテナクエリがすべてのモダンブラウザの安定版でサポートされ、メディアクエリに代わり、コンテナクエリを使用する機会も増えてきたと思います。 コンテナクエリは親コンテナに基づいてスタイルを定義できるものですが、親のサイズによるクエリだけではありません。親のスタイル値によるクエリ(スタイルクエリ)も可...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "CSSでスタイルクエリ(@container style())を使えるようになると、実装がいろいろ便利になる\n\nコンテナクエリがすべてのモダンブラウザの安定版でサポートされ、メディアクエリに代わり、コンテナクエリを使用する機会も増えてきたと思います。 コンテナクエリは親コンテナに基づいてスタイルを定義できるものですが、親のサイズによるクエリだけではありません。親のスタイル値によるクエリ(スタイルクエリ)も可...", - "dcDate": "2024-03-19T00:56:33Z", - "content": "コンテナクエリがすべてのモダンブラウザの安定版でサポートされ、メディアクエリに代わり、コンテナクエリを使用する機会も増えてきたと思います。 コンテナクエリは親コンテナに基づいてスタイルを定義できるものですが、親のサイズによるクエリだけではありません。親のスタイル値によるクエリ(スタイルクエリ)も可...", - "contentSnippet": "コンテナクエリがすべてのモダンブラウザの安定版でサポートされ、メディアクエリに代わり、コンテナクエリを使用する機会も増えてきたと思います。 コンテナクエリは親コンテナに基づいてスタイルを定義できるものですが、親のサイズによるクエリだけではありません。親のスタイル値によるクエリ(スタイルクエリ)も可...", - "rdfAbout": "https://coliss.com/articles/build-websites/operation/css/superpowered-container-style-queries.html", - "isoDate": "2024-03-19T00:56:33.000Z", - "image": "https://coliss.com/wp-content/uploads-202401/2024031601@2x.png" - }, - { - "date": "2024-03-19T02:00:18Z", - "title": "オフショア開発を成功させるための実践的な進め方【5ステップ】", - "link": "https://offshore.icd.co.jp/blog/offshore-flow", - "contentEncoded": "
\"\" オフショア開発を成功させるための実践的な進め方【5ステップ】

\"オフショア開発を成功させるための実践的な進め方【5ステップ】\"

自社の売上をぐんっと増加させるため、より効果的な開発の進め方を知りたいと思いませんか。 せっかく開発の仕事が取れても開発できるエンジニアがいない。そして売上の機会損失。 このような悪循環に陥ってないだろうか。 これだけサービスがありふれた時代にそんなもったいないことはもうやめましょう。 それでは何が...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "オフショア開発を成功させるための実践的な進め方【5ステップ】\n\n自社の売上をぐんっと増加させるため、より効果的な開発の進め方を知りたいと思いませんか。 せっかく開発の仕事が取れても開発できるエンジニアがいない。そして売上の機会損失。 このような悪循環に陥ってないだろうか。 これだけサービスがありふれた時代にそんなもったいないことはもうやめましょう。 それでは何が...", - "dcDate": "2024-03-19T02:00:18Z", - "content": "自社の売上をぐんっと増加させるため、より効果的な開発の進め方を知りたいと思いませんか。 せっかく開発の仕事が取れても開発できるエンジニアがいない。そして売上の機会損失。 このような悪循環に陥ってないだろうか。 これだけサービスがありふれた時代にそんなもったいないことはもうやめましょう。 それでは何が...", - "contentSnippet": "自社の売上をぐんっと増加させるため、より効果的な開発の進め方を知りたいと思いませんか。 せっかく開発の仕事が取れても開発できるエンジニアがいない。そして売上の機会損失。 このような悪循環に陥ってないだろうか。 これだけサービスがありふれた時代にそんなもったいないことはもうやめましょう。 それでは何が...", - "rdfAbout": "https://offshore.icd.co.jp/blog/offshore-flow", - "isoDate": "2024-03-19T02:00:18.000Z", - "image": "https://offshore.icd.co.jp/blog/wp-content/uploads/2024/02/アイキャッチ_進め方_06.jpg" - }, - { - "date": "2024-03-19T06:02:28Z", - "title": "Google Research、1枚の人物画像からその人物が話す動画を生成するAI「VLOGGER」発表", - "link": "https://www.itmedia.co.jp/news/articles/2403/19/news138.html", - "contentEncoded": "
\"\" Google Research、1枚の人物画像からその人物が話す動画を生成するAI「VLOGGER」発表

\"Google

人物画像ごとにトレーニングする必要はなく、口元だけでなく、瞬きなどの顔全体の表情の変化や、上半身画像の場合、手のジェスチャーも表現できる。 80万個のアイデンティティの以前のデータセットより「1桁大きいく、動的なジェスチャーを備えた」新しいデータセット「MENTOR」に基づいてトレーニングした。 研究者らは...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "Google Research、1枚の人物画像からその人物が話す動画を生成するAI「VLOGGER」発表\n\n人物画像ごとにトレーニングする必要はなく、口元だけでなく、瞬きなどの顔全体の表情の変化や、上半身画像の場合、手のジェスチャーも表現できる。 80万個のアイデンティティの以前のデータセットより「1桁大きいく、動的なジェスチャーを備えた」新しいデータセット「MENTOR」に基づいてトレーニングした。 研究者らは...", - "dcDate": "2024-03-19T06:02:28Z", - "content": "人物画像ごとにトレーニングする必要はなく、口元だけでなく、瞬きなどの顔全体の表情の変化や、上半身画像の場合、手のジェスチャーも表現できる。 80万個のアイデンティティの以前のデータセットより「1桁大きいく、動的なジェスチャーを備えた」新しいデータセット「MENTOR」に基づいてトレーニングした。 研究者らは...", - "contentSnippet": "人物画像ごとにトレーニングする必要はなく、口元だけでなく、瞬きなどの顔全体の表情の変化や、上半身画像の場合、手のジェスチャーも表現できる。 80万個のアイデンティティの以前のデータセットより「1桁大きいく、動的なジェスチャーを備えた」新しいデータセット「MENTOR」に基づいてトレーニングした。 研究者らは...", - "rdfAbout": "https://www.itmedia.co.jp/news/articles/2403/19/news138.html", - "isoDate": "2024-03-19T06:02:28.000Z", - "image": "https://image.itmedia.co.jp/news/articles/2403/19/cover_news138.jpg" - }, - { - "date": "2024-03-08T08:02:27Z", - "title": "claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件|池田 亮平", - "link": "https://note.com/profound/n/na3cbeafa7ec9", - "contentEncoded": "
\"\" claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件|池田 亮平

\"claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件|池田

claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件 ひと言で結論を言うと、昨日はclaude3に衝撃を受けて、興奮して眠れませんでした…。 四の五の言わずにアウトプットを見せちゃいたいんですが、 ●打合せをZoom録画 ↓ ●録音データをCLOVA noteに放り込んでテキスト...

\"はてなブックマーク \"はてなブックマークに追加\"

", - "contentEncodedSnippet": "claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件|池田 亮平\n\nclaude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件 ひと言で結論を言うと、昨日はclaude3に衝撃を受けて、興奮して眠れませんでした…。 四の五の言わずにアウトプットを見せちゃいたいんですが、 ●打合せをZoom録画 ↓ ●録音データをCLOVA noteに放り込んでテキスト...", - "dcDate": "2024-03-08T08:02:27Z", - "content": "claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件 ひと言で結論を言うと、昨日はclaude3に衝撃を受けて、興奮して眠れませんでした…。 四の五の言わずにアウトプットを見せちゃいたいんですが、 ●打合せをZoom録画 ↓ ●録音データをCLOVA noteに放り込んでテキスト...", - "contentSnippet": "claude3を使ってみたら、ライティングの仕事が無くなるかもしれない瞬間を目の当たりして、衝撃を受けた件 ひと言で結論を言うと、昨日はclaude3に衝撃を受けて、興奮して眠れませんでした…。 四の五の言わずにアウトプットを見せちゃいたいんですが、 ●打合せをZoom録画 ↓ ●録音データをCLOVA noteに放り込んでテキスト...", - "rdfAbout": "https://note.com/profound/n/na3cbeafa7ec9", - "isoDate": "2024-03-08T08:02:27.000Z", - "image": "https://assets.st-note.com/production/uploads/images/133265739/rectangle_large_type_2_c410ab55acf2d835cb80dff1554d0cf6.png?fit=bounds&quality=85&width=1280" - } -] diff --git a/sample/src/types/rss.ts b/sample/src/types/rss.ts deleted file mode 100644 index 6b2f6ae3..00000000 --- a/sample/src/types/rss.ts +++ /dev/null @@ -1,28 +0,0 @@ -export type Rss = { - date: string; - title: string; - link: string; - contentEncoded: string; - contentEncodedSnippet: string; - dcDate: string; - content: string; - contentSnippet: string; - rdfAbout: string; - isoDate: string; - image: string; -}; - -// export type Ogp = { -// date: string; -// fbAppId: string; -// ogType: string; -// ogLocale: string; -// "og:site_name": "PC Watch"; -// "og:url": "https://pc.watch.impress.co.jp/docs/news/1577403.html"; -// "og:title": "AIボイチェンソフト「Voidol 1」が無償化 "; -// "og:description": " クリムゾンテクノロジー株式会社は、AIボイスチェンジャーソフト「Voidol 1」およびVoldol 1を音楽制作ソフト上で動作させる「Voidol Plugin Package」を3月より無償化した。"; -// "og:image": "https://pc.watch.impress.co.jp/img/pcw/list/1577/403/01.jpg"; -// "article:published_time": "2024-03-19T10:22:31+09:00"; -// "article:modified_time": "2024-03-19T11:28:29+09:00"; -// "article:tag": "ソフトウェア/アプリ,他ソフト/アプリ,その他"; -// }; diff --git a/sample/src/types/zenn.ts b/sample/src/types/zenn.ts deleted file mode 100644 index f0a3dfc8..00000000 --- a/sample/src/types/zenn.ts +++ /dev/null @@ -1,35 +0,0 @@ -export type ZennArticle = { - id: number; - postType: string; - title: string; - slug: string; - commentsCount: number; - likedCount: number; - bodyLettersCount: number; - articleType: string; - emoji: string; - isSuspendingPrivate: boolean; - publishedAt: string; - bodyUpdatedAt: string; - sourceRepoUpdatedAt: string; - pinned: boolean; - path: string; - user?: ZennUser; - publication?: ZennPublication; -}; - -type ZennUser = { - id: number; - username: string; - name: string; - avatarSmallUrl: string; -}; - -type ZennPublication = { - id: number; - name: string; - displayName: string; - avatarSmallUrl: string; - pro: boolean; - avatarRegistered: boolean; -}; diff --git a/sample/tsconfig.json b/sample/tsconfig.json deleted file mode 100644 index 9cebad6b..00000000 --- a/sample/tsconfig.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - "lib": [ - "es6", - "dom" - ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - "rootDir": "src" /* Specify the root folder within your source files. */, - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - "resolveJsonModule": true /* Enable importing .json files. */, - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "lib" /* Specify an output folder for all emitted files. */, - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -}