2023幎ã«äœæããç€Ÿå æ¥åæ¯æŽã·ã¹ãã ããŸãšããŠã¿ã
ä»å¹Žã® IVRy Advent Calendar ã¯çŽ çœå¯ŸææŠãè¡ã£ãŠããŸãïŒ
æ ªåŒäŒç€Ÿ IVRy ïŒã¢ã€ããªãŒïŒ 瀟å¡çªå· 7 çª ãšã³ãžãã¢ã®ãã«ããŒã§ãã
ç§ã¯æ®æ®µ IVRy ã§ã¯ããã³ããšã³ããšã¢ãã€ã«ã¢ããªã®éçºãæ
åœããŠããŸãã
ä»åã¯ç§ã 2023幎ã«äœæããç€Ÿå æ¥åæ¯æŽã·ã¹ãã ããŸãšããŠç޹ä»ããŸãã
2023幎ã«äœæããæ¥åæ¯æŽã·ã¹ãã
äžéšå宿ã§éçºãããã®ãå«ã¿ãŸãããåºæ¬çã«ã¯æ¥åæéå€ã«ç§ãæå¿ãšããŠåãçµãã ãã®ã§ãã
æç³»åã«æ²¿ã£ãŠç޹ä»ããŠãããŸãã
| ææ | ã·ã¹ãã | å©çšé »åºŠ | è£è¶³ |
|---|---|---|---|
| 1,2æ | Slack Reaction éèš | æ1,2å | æåãã®è¡šåœ°æã«å©çšã®ä»ãä»»æã®ãªã¢ã¯ã·ã§ã³ãæ°ã«ãªã£ãéã«å©çš |
| 3æ | ã³ã©ã èšäºã® Textlint | é±1åä»¥äž | æ¯é±å ¬éããŠããã³ã©ã èšäºã® Pull Request æåºæã«å©çš |
| 5æ | VoIP Push éç¥ã®èªåçä¿¡ãã¹ã | æ¯æ¥ | æ¯æ¥æŒå€åãã皌åäž |
| 6æ | ã¡ã³ã¿ã«ãã«ã¹ãã§ã㯠| é±1å | ã¢ã³ã±ãŒãéä¿¡ãé±1åãåçåä»ã¯åžžæçšŒåäž |
| 9æ | ç¹å®ã® Slack ãã£ã³ãã«çŸ€ã«äžæ¬åå | äžæ | Workspace å ã®å šãŠãŒã¶ãŒã«å ¬éããŠããããé »åºŠã¯äžæ |
| 9æ | åãããªã Slack ãã£ã³ãã«ã®èªåã¢ãŒã«ã€ã | æ1å | ææ«ã«äºåãæåã«ã¢ãŒã«ã€ãå®è¡ |
| 10æ | OCR ååºèªåæžãèµ·ãã | äžå®æ | å±ç€ºäŒé嬿éäžã¯æ°ååäœã§å®è¡ |
Slack Reaction éèš
æšå¹Žã®ã¢ããã³ãã«ã¬ã³ããŒã«ãŠãåŒç€Ÿã®å®ããŠãã Value ãæ ¹ä»ãããç®çã§ 3ã€ã® Value ããããã® Slack ã«ã¹ã¿ã çµµæå ãäœæãã誰ãäœçŸã§ããŠãããéèšããŠç«¶ãåããä»çµã¿ãäœããŸããã
ãã®åŸ 1,2æã«æ¹è¯ãå ããŸããŠããªã¢ã¯ã·ã§ã³ã è²°ã£ã / ããã人ãããããéèšã§ããããã«ãããšå
±ã«ãã¹ãã¬ããã·ãŒãã«æžãåºãããã«ããŸããã
ãšããã®ãã玹ä»ãã ãŠãŒã¶ãŒæ¯ã® reactions.list ãååŸããŠéèšããåŠçã§ã¯å
šãŠã®ãªã¢ã¯ã·ã§ã³ãååŸã§ããŠããããå®è¡æã«åŒæ°ã«æå®ããŠããªããã®ãé£ãªãéèšã§ããå©ç¹ãããã®ã§æŽ»çšããŸããã

ã³ãã³ãã§æå®ãããªã¢ã¯ã·ã§ã³ã®äžã§å·Šããå€ãé ãç¶ããŠæå®ãããŠããªããã®ãå€ãé ã«äžŠã³ãŸã[1]
çµæãšã㊠1幎çµã£ãä»ã§ãæ§ã ãªçšéã§éèšçµæã楜ããã§ããããŠãããšèªè² ããŠããŸãã
ã¹ãã¬ããã·ãŒãã«æžãåºãéã«ã·ã¹ãã ã®çµµæåãšã«ã¹ã¿ã çµµæåããããã衚瀺ããéšåã«çµæ§èŠæŠããŸããã
ã·ã¹ãã çµµæåã¯å¯Ÿå¿ããããå°éã«äœæããã«ã¹ã¿ã çµµæå㯠emoji.list ã§ååŸãã ç»åURL ãã¹ãã¬ããã·ãŒãã® image颿° ãçšããŠè¡šç€ºããããã«ããŠããŸãã
ãã®ä» è¡ãšåã®åºå® ãäžèЧæ§ãèæ
®ããå¹
調æŽãªã©ã API ã§è¡ãããšãããèŠåŽããŸããã
ã³ã©ã èšäºã® Textlint
3æã«ã³ã©ã èšäºã®éçšæ¹åã«ã€ããŠç޹ä»ããèšäºãæžããŸããã
ãã¡ãã¯ããã«éèŠããªããªãããšæãããæè¿è¡ã£ã倧éã®ãªã©ã€ãã§å€§æŽ»èºããŠãã Textlint ã®ä»çµã¿ããã£ãŠå©ãããŸããã

å
æ¥å€§éã® lint error ãåºã PR äžã®ãã£ããã£
3æã«éçšãèŸããã©
å ¥çš¿ããŒã«ã®éçºã¯åªå é äœãäžãããå®çŸã§ããŠããŸããã
ãšèšã£ãŠããã®ã¯æ±ºããŠåã§ã¯ãªãã®ã§ãããéçºã¡ã³ããŒãå¢ããŠä»ã§ã¯äžéšã§ãã CMS ã«ç§»è¡ãå®äºããŠãã¬ãã¥ãŒãå¯èœãªç¶æ
ãšãªã£ãŠããŸãã
æ¬åœã«ãã£ãšããéã® 1幎ã§ãããè¿ã
éçºãæ
åœããã¡ã³ããŒã®ããã¯ããã°ãšããŠç޹ä»ã§ããããšæããŸãã
VoIP Push éç¥ã®èªåçä¿¡ãã¹ã
5æã«çä¿¡éç¥ã«é¢ããé害ãçºçãããŠããŸã£ãããšããã£ããã§ VoIP Push éç¥ã®çä¿¡ã宿çã«ç¢ºèªããä»çµã¿ãäœããŸããã[2]
ä»ãæ¯æ¥ 瀟å
ã«åžžèšããŠãã宿©ãéç¥ãåããŠãããå
æ¥ äººå¡å¢å ã«äŒŽããããã¯ãŒã¯å¢åŒ·å¯Ÿå¿ã§ç€Ÿå
ãããã¯ãŒã¯ãæ°æé忢ããŠããéã«ã¯ç¡äºã«ïŒïŒïŒã¢ã©ãŒããäžããŠããŸããã
ãã®ã·ã¹ãã ã®ãã°ããã£ããš Slack ã«åãããŠããããšã«ãã£ãŠã客æ§ããã®ãéç¥ãæ¥ãªãããšããåãåãããåããŠãå
šäœåœ±é¿ã§ã¯ãªããšç¢ºä¿¡ãæã£ãŠå¿ç©ããã«ããããã®ã§å©ãã£ãŠããŸãã
ã¡ã³ã¿ã«ãã«ã¹ãã§ãã¯
瀟å¡ã®ã¡ã³ã¿ã«é¢ã®ã¢ã©ãŒããæ©æ¢°çã«æ€ç¥ããä»çµã¿ãšããŠæ¯é± çŸåšã®èª¿åã5æã§åã Slack BOT ã代衚 奥西ã®èŠæãåããŠéçºãã詊éšéçšããŠããŸãã[3]

æ¯é± 5æã®è³ªåã DM ã§å±ããŠåçããŠããæ§å
ãã®ã·ã¹ãã 㯠6æã«éå¬ãã 第1åIVRyéçºå宿 ã«ãŠäœæããŸãããå®è³ªéçºæé㯠4,5æéãšã¿ã€ãã ã£ãããããããªãããã«äºå調æ»çè¡ã£ãäžã§èšã¿ç¡äºæéå ã«ä»äžããããšãã§ããŸããã
ãã®æåã㊠Slack ã® Block Kit Builder ã䜿ã£ãŠã¿ãã®ã§ããè¡šç€ºãæŽããäœéšã®è¯ãã«é©ããŸããã[4]
ç¹å®ã® Slack ãã£ã³ãã«çŸ€ã«äžæ¬åå
åŒç€Ÿãæ²ããŠãã Vision 㯠We make âWork is Funâ from now ããåãããšã¯ã楜ããããåžžèã«å€ããŠããã ã§ããŠãå€é 㫠楜ããåãããã«å šå¡ã§è©±ãåãå Ž ãæ°åèšããããŸããããã®éã«åèªã® times ãã£ã³ãã«ãæå¹å©çšãããšãšãã«ãæ°ããå ¥ã£ãŠããäººãæ¢åã® times ãã£ã³ãã«ã«æ°è»œã«å ¥ã£ãŠäº€æµã§ãããšè¯ããšãã話ãåºãã®ã§ Slack 次äžä»£ãã©ãããã©ãŒã ã䜿ã£ãŠäœæããŠã¿ãŸããã
1. èµ·åã³ãã³ã

slash command ã§å®è¡ããéã®ãã£ããã£
2. ãã©ãŒã èµ·å

æ¡ä»¶ãæå®ãããã©ãŒã ãèµ·åããŠããæ§å
3. æ€çŽ¢çµæã®è¡šç€ºãšäžæ¬åå

æ¡ä»¶ã«å¿ããŠæ€çŽ¢çµæã衚瀺ãã1件以äžåå å¯èœãªãã£ã³ãã«ãããã° Join ãã¿ã³ã衚瀺ãããæ§å
詳ããã¯ä»¥äžã®èšäºã§ç޹ä»ããŠããŸãã
å æ¥ã ããã°ã©ãã®ãã«ãªã¢ãŒãã¯ãŒã¯ã«ããžã£ã¬ãåããŠããçç±ãšãã®å眪 ã«ãŠä»¥äžã®ãããªè©±ãããè峿·±ãæèŠããŸããã
æ¥åã ãã®é¢ä¿ã§ã¯èŠããããªãåŽé¢ãé瀺ããæ©äŒãäœãããšãè²ã ãšæš¡çŽ¢ãããŠããæä»£ã ãšèšããã§ãããã
åãããªã Slack ãã£ã³ãã«ã®èªåã¢ãŒã«ã€ã
åŒç€Ÿã¯ Slack ã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã掻çºãªã®ã§ Slack ãã£ã³ãã«ãæ¥å€å¢ãç¶ããŠããŸãã
æŸã£ãŠãããšãšãã§ããªãæ°ã«ãªã£ãŠããŸãããã100æ¥éåãããªããã£ã³ãã«ã¯ã¢ãŒã«ã€ãããŠã»ãããšããèŠæãåããŠéçºããŸããã
Slack 次äžä»£ãã©ãããã©ãŒã ã®ç޹ä»èšäºã§è§Šãã ãã§ãã玹ä»ããŠããŸãã
æåŸã®å®è¡ãã°ãèŠããšçŸåšã¢ã¯ãã£ããªãããªãã¯ãã£ã³ãã«æ°ã¯ 475 ããããã§ãã玹ä»èšäºå ã® 9ææç¹ã§ 418ãã£ã³ãã«ãã 21ãã£ã³ãã«ã¢ãŒã«ã€ãããŠããããšãã 3ã¶æã§ 78ãã£ã³ãã«å¢ããèšç®ã«ãªããŸãã

æåã«å®è¡ãããŠããæ§å
OCR ååºèªåæžãèµ·ãã
代衚 奥西ãšã® 1on1 ã«ãŠç€Ÿå
æ¥åã®å°ãããšãçžè«ã»éçŽãããã£ã³ãã«ããããšè¯ããããšãã話ã«ãªã ãã®å Žã§ #corporate-bpr [5]ãšãããã£ã³ãã«ãäœæããŸããã
ãã£ã³ãã«ã®æå³ãå
±æããéã«å³åº§ã«å°ãããšããããŠãããã®ã ããŒã±ã¿ãŒã®æ³å±± ã§ããã
å
容ãšããŠã¯
- äžå®æã§åå ããŠããå±ç€ºäŒã«ãŠé æŽããååºãã¹ãã£ãã§åã蟌㿠Google Drive ã«ã¢ããããŒãããŠãã
- ãããå¯èœãªéãæ©ãæåèµ·ããããŠã¹ãã¬ããã·ãŒãã«ãŸãšããã
- ãããã£ã SaaS ã¯ãããããããããšã¯æ¥µããŠã·ã³ãã«ãªã®ã§ç°¡åã«ã§ãããªã瀟å ã§å®çµããã
ãšãããã®ã§ããã
ãã®æç¹ã§ GPT-4V ã¯ãŸã çºè¡šãããŠããããGoogle Drive ã® OCR ã䜿ãããã§ãããš Qiita ã®ãªã³ã¯ä»ãã§å
±æãããã®ã§ããã®ãŸãŸã ãšæ¥œãããªãã®ã§ãã£ãããªããš google/clasp (Command Line Apps Script Projects) ã䜿ã£ãŠéçºããŠã¿ãŸããã
ãµã³ãã«ç»å

Google Drive ã«çšæãããµã³ãã«ç»å
ãµã³ãã«ç»åãåŠçããŠããæ§å

æªåŠçã®ãã¡ã€ã«ãããã°ããã¹ãå & ã¹ãã¬ããã·ãŒããæŽæ°ãããŠäºåºŠç®ä»¥éã¯ã¹ããã
ãã£ããå®è£ 玹ä»
clasp ãã€ã³ã¹ããŒã«åŸã clasp login clasp create ãè¡ããŸãã
package.json ãš appsscript.json ã¯ãããªæãã«ãªããŸããã
package.json
{
...
"scripts": {
"lint": "eslint 'src/**/*.ts' && prettier --check '**/*.{js,ts,json}'",
"lint:fix": "eslint --fix 'src/**/*.ts' && prettier --write '**/*.{js,ts,json}'",
"test": "jest --watch",
"push": "yarn lint && clasp push"
},
"devDependencies": {
"@types/google-apps-script": "1.0.70",
"@types/jest": "29.5.5",
"@types/node": "20.6.3",
"@typescript-eslint/eslint-plugin": "6.7.2",
"@typescript-eslint/parser": "6.7.2",
"eslint": "8.49.0",
"eslint-config-prettier": "9.0.0",
"eslint-plugin-import": "2.28.1",
"jest": "29.7.0",
"prettier": "3.0.3",
"ts-jest": "29.1.1",
"ts-loader": "9.4.4",
"ts-node": "10.9.1",
"typescript": "5.2.2"
}
}
src/appsscript.json
drive ãããã¡ã€ã«ãèªã¿èŸŒãã§ documents ã§ããã¹ãåããçµæã spreadsheets ã§æžã蟌ãã®ã§ä»¥äžã®ããã«ãªããŸããã
{
"timeZone": "Asia/Tokyo",
"dependencies": {
"enabledAdvancedServices": [
{
"userSymbol": "Drive",
"serviceId": "drive",
"version": "v2"
},
{
"userSymbol": "Document",
"serviceId": "docs",
"version": "v1"
}
]
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/documents",
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets"
]
}
ãã£ãŠããããšã¯ããã ãã§ãã
- Drive ã®æå®ããããã©ã«ãå
ã®å¯Ÿè±¡ãã¡ã€ã«ïŒPDF ãš ç»åïŒãæ¢ã
- ãã®æ æ¢ã«ããã¹ãåæžã¿ã®ãã®ã¯é€å€ãã
- 察象ãã¡ã€ã«ã®å Žåäžæçã« Document ãšããŠä¿åã㊠ORC ã§ããã¹ããååŸãã
- çµæãæå®ããã Spreadsheet ã«æžã蟌ã
- å床åŠçããªãããã«å¯Ÿè±¡ãã¡ã€ã«ã®ååã«ããã¹ãåæžã¿ prefix ãä»äžãã[6]
src/main.ts
// OCR çµæãæžã蟌ãã·ãŒãåã¯ãããã®å Žåã§ãããã§èšå®ãããŠããæåå
const SHEET_NAME = "OCR";
// OCR æžã¿ã®ãã¡ã€ã«åã«ã¯ãã® prefix ãã€ãã
// ãããã€ããŠãããã¡ã€ã«ã¯åŠçãããªã
const OCR_PREFIX = "[OCR]";
// ãã©ã«ãIDãšã¹ãã¬ããã·ãŒãIDã 1ãã¢ãšããŠè€æ°æå®å¯èœ
const FOLDER_ID_AND_SPREADSHEET_ID_MAP = {
// eslint-disable-next-line @typescript-eslint/naming-convention
"folder-id-1": "spreadsheet-id-1",
"folder-id-2": "spreadsheet-id-2",
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const main = () => {
for (const [folderId, spSheetId] of Object.entries(FOLDER_ID_AND_SPREADSHEET_ID_MAP)) {
const sheet = getSheetBySpreadSheetIdAndName(spSheetId, SHEET_NAME);
const folder = getFolderById(folderId);
const files = folder.getFiles();
console.log(`ãã©ã«ãïŒ${folderId}ïŒå
ã®å
šãã¡ã€ã«ãèµ°æ»ããŸã`);
let count = 0;
while (files.hasNext()) {
count++;
const file = files.next();
const mimeType = file.getMimeType();
console.log(`\tâ ${count.toString().padStart(3, " ")}. ãã¡ã€ã« ${file.getName()} (mimeType: ${mimeType})ãåŠçããŸã`);
// pdf ãšç»å以å€ã¯ã¹ããã & OCRæžã¿ã®ãã¡ã€ã«ã¯ã¹ããã
if (!(mimeType === "application/pdf" || mimeType.startsWith("image")) || file.getName().startsWith(OCR_PREFIX)) {
console.log(`\t\tâ OCR察象ã§ã¯ãªãã®ã§ã¹ãããããŸã`);
continue;
}
console.log(`\t\tâ OCRã«ãããŸã`);
const ocrText = getOcrText(file);
const fileName = OCR_PREFIX + file.getName();
const hyperLink = `=HYPERLINK("${file.getUrl()}", "${fileName}")`;
const readableDate = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm:ss");
console.log(`\t\tâ OCRçµæãæžã蟌ã¿ãŸã`);
sheet.appendRow([hyperLink, readableDate, ocrText]);
// æåŸã« PREFIX ãã€ã㊠OCRæžã¿ã®ãã¡ã€ã«ã«ãªããŒã ãã
file.setName(fileName);
console.log(`\t\tâ å®äºããã®ã§ãã¡ã€ã«åã ${fileName} ã«å€æŽããŸãã`);
}
console.log(`ãã©ã«ãïŒ${folderId}ïŒå
ã®å
šãã¡ã€ã«ïŒ${count}ïŒãèµ°æ»ããŸãã`);
}
};
// ç»åãŸãã¯PDFãã¡ã€ã«ãOCRã«ãããŠããã¹ãåãããã®ãè¿ã
const getOcrText = (targetFile: GoogleAppsScript.Drive.File) => {
const mediaData = targetFile.getBlob();
//Driveã«äžæçã«äœæããããã¥ã¡ã³ãæ
å ±
const resource = {
title: "tmpDocForOCR",
mimeType: targetFile.getMimeType(),
};
// OCRæ©èœããªã³ & èšèªã¯æ¥æ¬èª
// ref: https://developers.google.com/drive/api/reference/rest/v2/files/insert#query-parameters
const optionalArgs = {
ocr: true,
ocrLanguage: "ja",
};
const docFile = Drive.Files?.insert(resource, mediaData, optionalArgs);
const docFileID = docFile?.id;
if (!docFile || !docFileID) return "error";
const doc = DocumentApp.openById(docFileID);
const ocrText = doc.getBody().getText();
//äœæããããã¥ã¡ã³ããåé€
Drive.Files?.remove(docFileID);
return ocrText;
};
const getFolderById = (folderId: string) => {
const folder = DriveApp.getFolderById(folderId);
if (!folder) {
throw new Error(`æå®ããããã©ã«ãïŒ${folderId}ïŒãååšããŸãã`);
}
return folder;
};
const getSheetBySpreadSheetIdAndName = (spreadSheetId: string, sheetName: string) => {
const spreadSheet = SpreadsheetApp.openById(spreadSheetId);
if (!spreadSheet) {
throw new Error(`æå®ãããã¹ãã¬ããã·ãŒãïŒ${spreadSheetId}ïŒãååšããŸãã`);
}
const sheet = spreadSheet.getSheetByName(sheetName);
if (!sheet) {
const newSheet = spreadSheet.insertSheet(sheetName);
newSheet.appendRow(["ãã¡ã€ã«å", "OCRå®è¡æ¥æ", "OCRçµæããã¹ã"]);
return newSheet;
}
return sheet;
};
ãã® Apps Script ã¯ååå®è¡æã« å®è¡è ã® Auth ãåãã«æ¥ãã®ã§æ åœè ã Apps Script ã®ç®¡çè ã«è¿œå ããŠå®è¡ & ããªã¬ãŒãèšå®ããŠãããã°ä»»æã®å®è¡ééã§èªç±ã«æåèµ·ããã§ããŸããPDF ãš ç»åã©ã¡ãã察å¿ããŠããã®ã§æ§ã ãªçšéã«å¯Ÿå¿ã§ãããšæããŸãã
ã²ãšéãå®è£ ãå®äºã㊠Azure OpenAI ãšé£æºãããããªãšããã¿ã€ãã³ã°ã§ ã¹ããããããã« Bard 䜿ã£ããã©ãïŒãšå©èšããã ããŠçé¡ã«ãªã£ãã®ã¯å ç·ã§ããç¡ç¥ã£ãŠæãã§ããã[7]
ãšã¯ãããæ®æ®µæ¥åã§é¢ããã®å°ãªãæ¹ãšæ°è»œã«èŠä»¶ç話ããªããé²ããããŠæ¥œããã£ãã§ãã
ãŸãšããšæ¥å¹Žã®æ±è²
æ¥åã«ã¯åçŽã ãã©æéãèŠããé¡ã®ãã®ãå€ã
ãããŸããç§ã®èªæã蟌ããæããšããŠãDX ãæ²ããã¹ã¿ãŒãã¢ããã«ãã以äžãå調ãªä»äºãããªãããšã«æ
£ããäžäººäžäººãæ¥åã®äžã§å¹çåã§ããèŠçŽ ããªããæ¥ã
èããªããŠã¯ãããªããšæã£ãŠããŸãã
ãããããã£ãããå°ãã§ãäžããããŠãããè¯ããªãšæã£ãŠä»å¹ŽãïŒå¹Žç€Ÿå
æ¥åãæå©ãã§ãããã®ãäœã£ããã #corporate-bpr ãã£ã³ãã«ãäœã£ããããŠããŸããã
å
æ¥éå¬ããã第2åéçºå宿ã§ã¯ #corporate-bpr ãã£ã³ãã«ã§äžãã£ãŠããå°ãããšã åŒç€Ÿ1人ç®ãšã³ãžãã¢ã® å°ç¬ ããµã¯ããšå®è£
ã»è§£æ±ºããŠãããšãŠãé Œãããã£ãã§ãã
ããããŠæ¯ãè¿ã£ãŠã¿ããšçµéšãå®åã®äžè¶³ã§äŒæ¥ãäžžã è²»ãããããšãªã©ãæãåºããŠæããã蟌ã¿äžããŠããŸãããæ¥å¹Žã¯ãã£ãš AI ãæŽ»çšããŠãããã©ãããæžããããã粟é²ãããã§ãã
以äžãæ¥å¹Žãããã°ããŸãïŒ
We are hiring!!
æåŸã«ãIVRy ã§ã¯äžç·ã«åã仲éãçµ¶è³åéäžã§ãã
ä»ã®æ é èª¿ã«æé·ããŠããŠããŸãããä»åŸã®æŽãªãæé·ã®ããã«ã¯å§åçã«ä»²éãäžè¶³ããŠããŸããçããŸã®ãå¿åãåŸ
ã¡ããŠãããŸãïŒ
-
ãã®ããä»ã®äžäœã®ãªã¢ã¯ã·ã§ã³ãç®ç«ã£ãŠ value ã®ãªã¢ã¯ã·ã§ã³ãå°ãªãèŠããŸãããæ¯æ¥æ°ä»¶ãã€ã¯ä»ããŠããæ ¹ä»ããŠããŠããŸãã â©ïž
-
ç§ãæ¥åæéå€ã§äœã£ããã®ãããªç°¡çŽ ãªãã®ã ãã§ãªããTwilio ã®ã¢ã©ãŒããå¥ã®ã¢ãã¿ãªã³ã°ã·ã¹ãã ãå ã ååšããŠãããèŠèœãšããŠããŸã£ãåå çãã¹ãã¢ãŒãã äŒè°ã¯ç€Ÿå ã§å®æœããŸãã â©ïž
-
瀟å¡ã®ãã©ã€ãã·ãŒä¿è·ã®ããæ å ±ã®åãæ±ãã«ã¯ååæ³šæããŠããŸã â©ïž
-
äžç¹ãããã©ãããããæ©ãã èšæ¶ã ãããã®ã§ããå¿ããŠããŸããŸãã... â©ïž
-
BPR: Business Process Re-engineering â©ïž
-
ãã¡ã€ã«ãåé€ãããã¯ç§»åã§ãè¯ãã£ãã®ã§ããã䜿çšè ãæ··ä¹±ããªãããã«æ¹åãšããŸããã â©ïž
-
å®è£ ææã®æ°é±éåã«ã¯çºè¡šãããŠããããã§ã â©ïž
Discussion