iPhoneã«éç¥ãä¸åé£ãã§ããªããªã£ãï¼ãã®åé¡ã®è§£æ¶æ¹æ³ã«ã¤ãã¦
- æ¥ã«iPhoneã«éç¥ãé£ãã§ããªããªã£ã
- ããããã®éç¥ã®ä»çµã¿ã®è©±
- ã§ã¯ããªãéç¥ãé£ãã§ããªããªã£ãï¼
- çµå±ãã©ãããã°è¯ãï¼
- ããã
æ¥ã«iPhoneã«éç¥ãé£ãã§ããªããªã£ã
çªç¶ã ããå
æ¥ææã¡ã®iPhoneã«åã¢ããªããã®éç¥ãä¸åé£ãã§ããªããªã£ãã
ã»Slackã®ãããªä¼è©±ã¢ããªããã®TOæå®ãã
ã»ä»äºã§ä½¿ã£ã¦ãããµã¼ãã¼ç®¡çã¢ããªããã®è¦åã¢ã©ã¼ããã
ã»ç£è¦ã«ã¡ã©ãæ¤ç¥ããä¸å¯©è
ã¢ã©ã¼ããã
ã»ãå¼å½æ³¨æã¢ããªã®å±ãã¾ããéç¥ãã
ãªããã«ãå±ããªãï¼
ä¸æ¹ã§ãå¥ã§ææãã¦ããiPadã«ã¯éç¥ãå±ãã¦ããã
ã¢ããªãéç¥ãé£ã°ããªããªã£ãããã§ã¯ãªãï¼
iPhoneã®ç¶æ
ãé常ã«æªãããï¼
ãã¦ãåé¡ã¯ãããããªã®ã§ããã
ãã®éç¥ãå±ããªãç¾è±¡ã¸ã®å¯¾å¦æ¹æ³ã«ã¤ãã¦ãããã§èª¿ã¹ãã¨ããã
ã»é»æ³¢ç¶æ³ãæªãã®ã§ã¯ï¼
ã»VPNãåã£ã¦ã¿ã¦ï¼
ã»éä¸ã¢ã¼ããONã«ãªã£ã¦ããªãï¼
ã»iPhoneã®éç¥ã®è¨å®ã該å½ã¢ããªã®ç®æã確èªãã¦ã¿ã¦ï¼
ã¨ä¸¦ã³ã
次ã«æ¥ãã®ãã
ã»iPhoneã®OSã®åé¡ãOSãã¼ã¸ã§ã³ã¢ãããã
ã»ç«¯æ«ãæ
éãã¦ãããä¿®çã«åºãã¦ã
ã¨ãªã£ã¦ããã®ã§ã
å¾
ã¤ã®ã ãä»ã«ã試ãã¹ããã¨ãããã
ããæã£ã¦è¨äºãæ¸ããã¨ã«ãã¾ããã
ç°¡åãªè§£æ±ºæ¹æ³ã試ãåã«ãiPhoneãä¿®çã«åºãã¡ãã£ãã大å¤ã§ãããã
ããããã®éç¥ã®ä»çµã¿ã®è©±
ãããããiPhoneã¸ã®pushéç¥ãã©ã®ããã«å®ç¾ããã¦ãããã
ã¢ããªã«ãã£ã¦éãã¾ãããã ããã次ã®ããã«ãªãã§ãããã
ã»ã¢ããªã®ååèµ·åæãã
ã»ã¢ã«ã¦ã³ãç»é²æãã
ã»ãããã¯ãã°ã¤ã³æã«ã
ã»ãããã¯ã¢ããªã§éç¥æ©è½ãæå¹ã«ããéã«ã
端æ«ã®æ
å ±ãåéããã
(ä»®ã«ããã¤ã¹ãã¼ã¯ã³ã¨ã§ãå¼ã³ã¾ãããã)
ãã®åéããéç¥å
ã«å¯¾ãã¦ãã¢ããªã¯éç¥ãéä¿¡ãã¾ãã
ã§ã¯ããªãéç¥ãé£ãã§ããªããªã£ãï¼
iPhoneã®åè¨å®ã確èªãã¦ãåé¡ããªããã¨ãåææ¡ä»¶ã§ããã
ç§ã®å ´åã®åå ã¯ãããã
iPhoneã®å
¨ã¦ã®ã¢ããªã®éç¥ãå±ããªããªã£ããã¨ãã
éç¥ç«¯æ«ã®æ
å ±(ããã¤ã¹ãã¼ã¯ã³)ããªãããã®åå ã§æ¸ãæãã£ã¦ãã¾ã£ã
ã®ã ã¨èãã¦ãã¾ãã
ã¢ããªã¯éå»ã«åéãã端æ«(ããã¤ã¹ãã¼ã¯ã³)ã«å¯¾ãã¦éç¥ãéä¿¡ãããã¨ãã¦ãããã
ãããå¤ãã£ã¦ãã¾ã£ãã®ã§ã
pushéç¥ãããã£ã¦ã®æ¹åã«ç©ºæ¯ããã¦ããã®ã§ã¯ãªããï¼
ããããæ¨æ¸¬ã§ããã
çµå±ãã©ãããã°è¯ãï¼
ãã®åé¡ã®è§£æ±ºæ¹æ³ã¯ã
端æ«æ
å ±(ããã¤ã¹ãã¼ã¯ã³)ãã¢ããªã«åãç´ãããã°è¯ãã
ã¨ãªãã¾ãã
対å¦æ¹æ³ã¯ã¢ããªã«ãã£ã¦ç°ãªãã®ã§ããã
ç°¡åãªæ¹ãã
ã»ã¢ããªã®éç¥æ©è½ãç¡å¹æå¹ã¨åãæ¿ããã
ã»ã¢ããªãããã°ã¢ã¦ããã¦ããããã°ã¤ã³ããã
ã»ã¢ããªãæ¶ãã¦ãåã¤ã³ã¹ãã¼ã«ããã
ã»ã¢ããªãããã°ã¢ã¦ãã次ã«ã¢ããªãæ¶ãããã®å¾ã«åã¤ã³ã¹ãã¼ã«ããã
ã¨ãªãã¾ãã
ããã§ç«¯æ«ã®æ
å ±(ããã¤ã¹ãã¼ã¯ã³)ãåãè¾¼ã¿ç´ãã¦ãããã°è§£æ±ºã
iPhoneã«éç¥ãåã³å±ãããã«ãªãã§ãããã
æå¾ã®ãã¤ãããã¤
"ã»ã¢ããªãããã°ã¢ã¦ãã次ã«ã¢ããªãæ¶ãããã®å¾ã«åã¤ã³ã¹ãã¼ã«ããã"
ã¯ã
åç´ã«ã¢ããªãæ¶ãã¦åã¤ã³ã¹ãã¼ã«ãã¦ãã
ãã°ã¤ã³ç¶æ
ãç¶æãç¶ãã¦ã
端æ«æ
å ±(ããã¤ã¹ãã¼ã¯ã³)ãåãç´ãã¦ãããªãé åºãªã¢ããªåãã®å¯¾å¿ã§ããã
ããã
ã¨ã¯è¨ã£ã¦ããã¢ããªãã¢ã³ã¤ã³ã¹ãã¼ã«ãããã¦ãã
å®æã«ã¢ã³ã¤ã³ã¹ãã¼ã«ã§ããªãã±ã¼ã¹ã¯ããã¨æãã¾ãã
ãã¼ã¿ã®ããã¯ã¢ããã大å¤ã ã£ããã
ãã¨ãéç¥ãéä¿¡ããã¢ããªã沢山ãããããã¨ã
ã¨ã¦ãå
¨é¨ã®iPhoneã®ã¢ããªã«ãããã¦ç´ãã¦ããããªãã
çµå±ãæä½ééç¥ãå¿
è¦ãªããã¤ãã®ã¢ããªã«çµã£ã¦ã
éç¥ãå±ãããã«ä¿®æ£ãè¡ããããªãã¨æãã¾ããã
(ã¨ããã§ã端æ«ã®æ
å ±ãæ¸ãæãã£ã¦ãã¾ã£ãåå ã¨ãã¯ã»ã»)
(ããï¼)
ãã¤ã¹ãã¤ãã®ã©ã¤ã»ã³ã¹æ話 ï¼ã¨ã社å ãã¬ã¼ã³ã§ã®ãã¤ã¹ãã¤ãã®ä½¿ç¨ã«ã¤ãã¦ï¼
- ãã¤ã¹ãã¤ãåç»ãYoutubeã«ã¢ãããã¼ããããªãæ代
- ä¸æ£ãªåç»è»¢è¼ã«æ©ã¾ãããæ代
- ãã¤ã¹ãã¤ãã®ã©ã¤ã»ã³ã¹ãå¤æ´ãããæ代
- 社å ãã¬ã¼ã³ã§ãã¤ã¹ãã¤ãã使ãå ´å
- ããã
ãã¤ã¹ãã¤ãã®ã©ã¤ã»ã³ã¹ã®è©±ããã¾ãã
ãã¤ã¹ãã¤ãã£ã¦ã®ã¯ããããã¢ããªã§ãã
https://www.ah-soft.com/voiceroid/
ä¼è©±ãæ©æ¢°é³å£°ã§èªã¿ä¸ããé³å£°ãã¡ã¤ã«ãä½ãã¢ããªã§ãã
Windowsç¨ã®ã¢ããªã§ãåç»ã«è§£èª¬ãå
¥ããã®ã«ä½¿ç¨ããããã¾ãã
ãã¢ããã£ããã®å£°ã§åç»è§£èª¬ãå
¥ããªãã¦æ¸ãããã«ãªãã¢ããªã ã
å
¥åããéãã«ã¡ãã»ã¼ã¸ãèªã¿ä¸ãã¦ãããããã
è¨ç·´ãã¦ããªãç´ äººãç声ã§è§£èª¬ãããããã
å®å®ãã¦åã調åã§å£°ãä½ãã¦ããããç声ãã楽ã ã£ããããã
ãã¤ã¹ãã¤ãåç»ãYoutubeã«ã¢ãããã¼ããããªãæ代
ãã®æã
ã®ã話ã
Youtubeã«ãã¤ã¹ãã¤ãã使ã£ãåç»ãã¢ãããã¼ãããæã
ããããã®åç»ã«åºåãã¤ãããªãããã®ãã¤ã¹ãã¤ãã¯åç¨ã§ã®å©ç¨æ±ãã¨ããã
ã¨ããã¦ãã¾ããã
ãã¤ã¹ãã¤ãã®åç¨ã©ã¤ã»ã³ã¹ãå¿
è¦ã«ãªããã¨ã
ãã®ãã¤ã¹ãã¤ãã®åç¨ã©ã¤ã»ã³ã¹æã¯ã¨ã¦ããé«ãï¼10ä¸8000åï¼ï¼
ãã¨ãããã
ãã®ãããã©ã¤ã»ã³ã¹ããã¡ãã¨æ±ã人ã¯ã
ã¾ããåç»è¦è´è
ããææããããããããã§ã
Youtubeã«ã¯ããã¤ã¹ãã¤ãåç»ããªããªãã¢ãããã¼ããããªãæ代ãããã¾ããã
ä¸æ£ãªåç»è»¢è¼ã«æ©ã¾ãããæ代
ããã¼ãã
ä¸ã®ä¸ã«ã¯ã©ã¤ã»ã³ã¹ãã¾ã£ããæ°ã«ããªã人ãå±
ãã¾ãã
ä¸æ£ã«åç»ã転è¼ããæ¹ã
ã§ãã
å½¼ãã¯ããã¡ããèºèºãªããåºåä»ãã§åç»ãYoutubeã«è»¢è¼ãã¦ããããã¾ãã
ä¸æ£ãªè»¢è¼ãæ½°ãããã«ãåç»å¶ä½è
æ¬äººã対æã¢ãããã¼ããããã¨ãã§ãã¾ããã
åç¨ã©ã¤ã»ã³ã¹ã¯ãé«ãã®ã§ï¼10ä¸8000åï¼ï¼ï¼ã
Youtubeã«ã¢ãããã¼ããããªãã
åºåæãã§åç»ãã¢ãããã¼ããããã¨ã«ãªãã¾ãããï¼
ä¸æ£è»¢è¼è
ããã¬ããããªã¡ã¼ã®åç»ã§é£ã飯ã¯ã¦ã¡ã¼ãªã¼ãã¨ç¨¼ãã§ãèã§ã
ç¡æã§åç»ãã¢ãããã¼ããã¦ããã
ã¾ã£ã¨ãã«åç»ãä½ã£ã¦ãã人ã¯ãã³ãã¤ãã¼ãã£ã¦æã£ã¡ããã¾ããã
ãã¾ãããæ°ã¯ã§ã¾ããã
ã ããã©ããåç»ãè¦ãå´ããããã¨ã
Youtubeã«åå¨ããªãã£ãåç»ãYoutubeã«ã¢ãããã¼ããããããã§ã
ãããä¸æ£ãªã¢ãããã¼ãåç»ã§ãã£ã¦ãã
è¦è´è
ã«ã¯åã°ãã¦ãã¾ããã§ãã
å°ãã¾ãããã¼ã
ãã¤ã¹ãã¤ãã®ã©ã¤ã»ã³ã¹ãå¤æ´ãããæ代
ãããªæã§ãã
ãã¤ã¹ãã¤ãã®ã©ã¤ã»ã³ã¹ãå¤æ´ããã¾ããã
Youtubeã®åºåä»ãåç»ã¯åç¨æ±ãã¨ããªãï¼
æãè¨å®ããã©ã¤ã»ã³ã¹ã®å®ç¾©ã
æ代ã«åããªããªã£ã¦ããã®ã§å®ç¾©ãå¤ãã¾ã
ã¿ãããªè©±ã§ããã
ãããã¦åºåä»ãã®ãã¤ã¹ãã¤ãåç»ã
Youtubeã«ã¢ãããã¼ããããããã«ãªã£ãã®ã§ããã
ã¡ããã¡ããã
社å ãã¬ã¼ã³ã§ãã¤ã¹ãã¤ãã使ãå ´å
ãã¦ã社å
ãã¬ã¼ã³ãªã©ã§ã
ãã¤ã¹ãã¤ãã使ããããã¨ãããããããã¾ãããã
å®ã¯ãä¸ã§è¿°ã¹ãããã¤ã¹ãã¤ãã®ã©ã¤ã»ã³ã¹ãå¤æ´ãããæã«ã
ã©ã¤ã»ã³ã¹å¤æ´ã«é¢ãã質çå¿çã®çæ¾éãããã
ãã®ä¸ã§ã©ã¤ã»ã³ã¹ã«ã¤ãã¦è²ã
æè¨ããã¾ããã
- 社å ãã¬ã¼ã³ã§ãã¤ã¹ãã¤ãã使ãå ´åãåç¨ã©ã¤ã»ã³ã¹ãå¿ è¦ã¨ãªã
- ãã®åç¨ã©ã¤ã»ã³ã¹ã¯ã声ãã«å¯¾ããã©ã¤ã»ã³ã¹ã§ãããä¾ãã°ãç«ã¡çµµãªã©ã§ãã£ã©ã¯ã¿ã¼ã使ããªããã¾ãå¥ã«ãã£ã©ã¯ã¿ã¼ä½¿ç¨ã®è¨±è«¾ãå¿ è¦ã
ï¼èª¿åã«ã®ã£ã¦çµµãå ¥ããã¨é¢åãªãã¨ã«ãªãã¾ãï¼
ã¨ãããã¨ã§ã
社å
ãã¬ã¼ã³ã§ãã¤ã¹ãã¤ãã¯å®è³ªä½¿ããªãæ°ããã¾ããã
ï¼ããã§æè¨ãããªãã¦ãã社å
ãã¬ã¼ã³ã§ã®ä½¿ç¨ãåç¨æ±ãã«ãªãã®ã¯èªæãªæ°ããã¾ãã
ããã¦ãã®ãã®ã¯ããã§ãããï¼
ããã
ãããã
社å
ãã¬ã¼ã³ã§ãã¼ã«ãã¤ãã®è©±é¡ãè¦ãããã®ã§ã
ãã®è¨äºãæ¸ãæ°ã«ãªã£ãã
ä¸è¨ãç§ã®æ´å²ã®èªèã§ããã
ãã¤ã¹ãã¤ã1ä½ã§8000åãããããã®ã«ã
1ä½æã£ã¦ã人ã¯ãã©ãã4,5ä½æã£ã¦ãããªã®ã«ã
ï¼åè¦ï¼
- çµæããã
- çµæããããã©ã¹
- çµæãããEX
- çµæãããï¼
ã¨åã声ã§ãã¼ã¸ã§ã³éãã§è¤æ°æã£ã¦ã人ãå±
ãããªã®ã«ã
ãã®ä»ã«ããAIããããã¨ãè²·ã£ã¦ã¦ã
ããããè²¢ãã§ãããªã®ã«ã¼ã
ï¼åè¦ï¼
ã¡ãã£ã¨æ®å¿µã§ããã
update.electronjs.orgã使ã£ã¦ãã¢ããªã®èªåæ´æ°æ©è½ããæ°æ¥½ã«çµã¿è¾¼ã
- Electronã®autoUpdater
- update.electronjs.org
- 対å¿ãã¦ããç°å¢
- æ´æ°ç¨ã®ã¢ããªãReleasesã«ç½®ã
- Electronã¢ããªã¸ã®çµã¿è¾¼ã¿ï¼èªåçã«æ´æ°å¦çï¼
- Electronã¢ããªã¸ã®çµã¿è¾¼ã¿ï¼ä»»æã®ã¿ã¤ãã³ã°ã§æ´æ°ï¼
- autoUpdaterãééã£ããã¡ã¤ã«ããã¦ã³ãã¼ãããï¼1æï¼
- çµãã
Electronã®autoUpdater
Electronã«ã¯ãã¢ããªã®æ°ãããã¼ã¸ã§ã³ããã¦ã³ãã¼ããã¦
æ´æ°ããæ©è½ãç¨æããã¦ãã¾ãã
https://www.electronjs.org/docs/api/auto-updater
Electronã¢ããªãããã®æ©è½ã使ãã«ã¯æ¬æ¥ã
ææ°çã¢ããªã®æ
å ±ãè¿ãã¢ãããã¼ããµã¼ãã¼ãå¿
è¦ã«ãªãã®ã§ããã
GitHubã®Releasesã«ææ°ã¢ããªãã¤ããªãç½®ãã¦ããã¢ããª
ã«ã¤ãã¦ã¯ã
Electronå
¬å¼ãã¢ãããã¼ããµã¼ãã¼ãç¨æãã¦ããã¦ããã®ã§ã
ã¢ããªå´ã®ä¿®æ£ã ãã§ãç°¡åã«èªåã¢ãããã¼ãæ©è½ãçµã¿è¾¼ããããã«ãªã£ã¦ãã¾ãã
update.electronjs.org
ãã¡ããå
¬å¼ãç¨æãã¦ãããµã¼ãã¼ã§ã
update.electronjs.org (GitHubã«ãªãã¤ã¬ã¯ã)
ãã®ãµã¼ãã¼ã¯ã次ã®ãã¿ã¼ã³ã®URLãå©ãã¨ãGitHubã®ææ°ãªãªã¼ã¹ã®æ å ±ãåå¾ãã¦è¿ãã¾ãã
https://update.electronjs.org/update/${process.platform}/${app.getVersion()}
ä¾ãã°ãGitHubã®ã¬ãã¸ããªã"taku-o/myukkurivoice"ã§ã
ç¾å¨å®è¡ä¸ã®ã¢ããªã®ãã¼ã¸ã§ã³ã"0.13.6"ã ã¨ããã°ã次ã®URLã«ãªãã¾ããã
ãã®URLããã©ã¦ã¶ã§éãã¨ãJSONå½¢å¼ã§ææ°ãªãªã¼ã¹ã®ãã¼ã¿ãè¿ã£ã¦ããã®ãåããã¾ãã
https://update.electronjs.org/taku-o/myukkurivoice/darwin-x64/0.13.6
{"name":"0.13.7","notes":"- \"MYukkuriVoice ã«ã¤ãã¦\"ãã¤ã¢ãã°ã®è¡¨ç¤ºãä¿®æ£ã\r\n - ãã«ãæã®...
対å¿ãã¦ããç°å¢
update.electronjs.orgã§å¯¾å¿ãã¦ããç°å¢ã¯Linuxç°å¢ä»¥å¤ã§ãã
Linuxã¯é§ç®ãã¼ããã£ãã¼ãæ®å¿µã§ããã
macOSã®ã¢ããªã«ã¤ãã¦ã¯ãã¢ããªã«Developer ID Applicationã®ç½²åãå¿
è¦ã
å®è¡ä¸ã®ã¢ããªãããã¦ããã¦ã³ãã¼ãããæ´æ°ã¢ããªã両æ¹ã«ç½²åãå¿
è¦ã§ãã
ï¼ã¢ããªã«ç½²åãããã¦ããªãã¨ãèªåã¢ãããã¼ããã¨ã©ã¼ã«ãªããï¼
Error: Code signature at URL file:///Users/user/Library/Caches/jp.nanasi.myukkurivoice.ShipIt/update.TdmmDN0/ MYukkuriVoice-darwin-x64/MYukkuriVoice.app/ did not pass validation: ã³ã¼ããªãã¸ã§ã¯ããã¾ã£ããç½²åããã¦ãã¾ãã
Error: Could not get code signature for running application
Catalinaã§ã¯ãã¢ããã«å
¬è¨¼ï¼Notarizationï¼ãå¿
è¦ããï¼
調ã¹ã¦ãã¾ããã
ããããå
¬è¨¼ã®å®è£
ãå¤ãã¦ã¾ã§æ¤è¨¼ããªããã
é¢åã ããããä»æ¹ãªãã(^_^)/
æ´æ°ç¨ã®ã¢ããªãReleasesã«ç½®ã
æ´æ°ç¨ã®ã¢ããªã¯ãzipã§åºãã¦GitHubã®Releasesã«ç½®ãã¦ããã¾ãã https://github.com/taku-o/myukkurivoice/releases/tag/0.13.8
1. ãã¼ã¸ã§ã³çªå·ã®Releasesã¿ã°ãä½ãï¼0.13.8 ã¨ãï¼ 2. æ´æ°ç¨ã®ã¢ããªãzipå½¢å¼ã«ãã¦ã¢ãããã¼ããã 3. zipãã¡ã¤ã«ã®ãã¡ã¤ã«åã¯ãä¾ãã°ãAppName-darwin-x64.zip ã®ãããªå½¢å¼ã«ãã
update.electronjs.orgã¯ãWindowsç°å¢ã¨Macç°å¢ã«å¯¾å¿ãã¦ãã¾ããã
ããã¤ãã¢ãããã¼ãããã¦ããzipãã¡ã¤ã«ã®ãã¡ã
ã©ã®zipãã¡ã¤ã«ããã©ã®ç°å¢ç¨ã®ãã®ãã¯ããã¡ã¤ã«åããå¤æããã¦ãã¾ãã
ãªã®ã§ãzipãã¡ã¤ã«åã«ã¯ãmac, darwin, win32-x64ãªã©å¯¾å¿ç°å¢ã示ãæåãå
¥ãã¦ããã¾ãããã
mac darwin osx win32-ia32 win32-x64
Electronã¢ããªã¸ã®çµã¿è¾¼ã¿ï¼èªåçã«æ´æ°å¦çï¼
Electronã¢ããªã®ã³ã¼ãã«ã¢ããªèªåæ´æ°ã®æ©è½ãçµã¿è¾¼ã¿ã¾ãã
npmã§update-electron-appãå
¥ãã¦ããã¦ã
npm install update-electron-app
ã¢ããªå´ã§ããã®ã³ã¼ããå¼ã³åºãã
require('update-electron-app')()
ç°¡åï¼
Electronã¢ããªã¸ã®çµã¿è¾¼ã¿ï¼ä»»æã®ã¿ã¤ãã³ã°ã§æ´æ°ï¼
ä¸ã®å®è£
ã¯ç°¡åãªã®ã§ãããããããããã¥ã¡ã³ãã«ããã¨ã
10åæ¯ã«æ´æ°ããã§ãã¯ãã«ããããã§ãã
https://www.electronjs.org/docs/tutorial/updates
ãªãã¦ãã£ã(>_<)ï¼
ãããªã«ã¢ããªãé »ç¹ã«æ´æ°ãããããªãã(>_<)ï¼
1ã¶æã«1åæ´æ°ã§ããããã·ãªæ¹ã (>_<)ï¼
ããããå ´åã¯ãcheckForUpdates()ãæåã§å©ãã¦ã
好ããªé »åº¦ã§æ´æ°ããããã¡ãã¥ã¼ããæ´æ°ã§ããããã«ãããè¯ãã§ããããªã
autoUpdater.checkForUpdates();
import {app, dialog, autoUpdater} from 'electron'; // register events autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => { const dialogOptions = { type: 'info', buttons: ['Restart', 'Later'], title: 'Application Update', message: process.platform === 'win32' ? releaseNotes : releaseName, detail: 'æ°ããã¢ããªã®ãã¦ã³ãã¼ããå®äºãã¾ãããã¢ããªãåèµ·åãã¦æ´æ°ãé©ç¨ãã¾ãã', }; dialog.showMessageBox(dialogOptions) .then((result) => { const btnId: number = result.response; if (btnId === 0) { autoUpdater.quitAndInstall(); } }); }); autoUpdater.on('error', (err: Error) => { const dialogOptions = { type: 'error', title: 'Application Version Check Error.', message: 'ã¢ããªã®ã¢ãããã¼ãä¸ã«ã¨ã©ã¼ãçºçãã¾ããã', buttons: ['OK'], defaultId: 0, cancelId: 0, }; dialog.showMessageBox(dialogOptions); }); // setup feed url const server = 'https://update.electronjs.org'; const feed = `${server}/taku-o/myukkurivoice/${process.platform}-${process.arch}/${app.getVersion()}`; autoUpdater.setFeedURL({ url: feed, serverType: 'json', }); // update autoUpdater.checkForUpdates();
ãã£ããcheckForUpdates()ãå®è¡ããã¨ã
ã¢ããªã®æ´æ°å¦çãã¹ãããåºæ¥ãªããããã
å®è¡åã«ã¦ã¼ã¶ã¼ã«ç¢ºèªãã¤ã¢ãã°ãåºãã¦ãããæ¹ãè¯ãããã§ãã
ãããã¯ãä»åä½ãã¦ããã¢ããªã®ãã¼ã¸ã§ã³ãææ°ãã©ãã確èªãã¦ããã¦ããã
ã¢ããªãæ´æ°ãã¦ãè¯ããèãã¦ããã¾ãããã
autoUpdaterãééã£ããã¡ã¤ã«ããã¦ã³ãã¼ãããï¼1æï¼
Electronã®autoUpdaterã¯ããããã次ã®é çªã§å¦çãã¦ãã¾ãã
ï¼Macç°å¢ï¼
1. å®è¡ä¸ã®ã¢ããªã®ç½²åã®ç¢ºèª 2. å®è¡ä¸ã®ã¢ããªãææ°çãã©ãããã§ã㯠3. ææ°ã¢ããªã®ãã¦ã³ãã¼ã 4. zipãã¡ã¤ã«ã®è§£å 5. ææ°ã¢ããªã®ç½²åã®ç¢ºèª 6. ã¢ããªã®å ¥ãæ¿ã
update.electronjs.orgã¯ãããªå®è£
ï¼âï¼ã«ãªã£ã¦ããã®ã§ã
ãã¼ã¿ãã¡ã¤ã«ãªã©ã®ååã«"mac"ã®æåãå
¥ã£ã¦ããã¨ã
æ´æ°ã¢ããªã§ãªããééã£ããã¡ã¤ã«ããã¦ã³ãã¼ããããã¨ãããã¾ããã
ï¼1æï¼
# https://github.com/electron/update.electronjs.org/blob/ed32d4fedca459fb734a5d898d8573f57b605bd4/index.js#L236 const assetPlatform = fileName => { if (/.*(mac|darwin|osx).*\.zip/i.test(fileName)) return 'darwin-x64' if (/win32-ia32/.test(fileName)) return 'win32-ia32' if (/win32-x64|(\.exe$)/.test(fileName)) return 'win32-x64' return false }
ãã¦ã³ãã¼ããããzipãã¡ã¤ã«ã¯ã
次ã®ãããªå ´æã«ä¿åãããå¾ã解åããã
ãã®å¾ãã¢ããªã®ç½²åã®æ¤è¨¼ãè¡ããã¾ãã
/Users/user/Library/Caches/xx.xx.bundleid.ShipIt/update.QCBggxR
ãªã®ã§ã誤ã£ããã¡ã¤ã«ããã¦ã³ãã¼ããã¦ãã¦ã
ç½²åã¨ã©ã¼ãçºçãã¦ããæã¯ã
ãã®ãã£ã¬ã¯ããªãç£è¦ãã¦ããã°ãåé¡ã追ãã¾ãã
ï¼ã¨ã©ã¼ã«ãªã£ãæãããæ¶ããã¡ããã¿ããã§ããã©ãï¼
if (/win32-x64|(\.exe$)/.test(fileName)) return 'win32-x64'
試ãã¦ãã¾ããããã©ããã®ã³ã¼ããè¦ãéãã
Windowsç°å¢ã¯exeå½¢å¼ããããã¿ããã§ããã
èªå·±è§£åå½¢å¼ããµãã¼ãããã¦ããã®ããªï¼
çµãã
Macã®Electronã¢ããªã ã£ãããã
èªåæ´æ°æ©è½ãçµã¿è¾¼ã¾ãªãã¦ããMac App Storeã«åºãã°è¯ããããªãï¼
ãããªãµãã«èãã¦ããææã俺ã«ãããã¾ããã
ã©ããé§ç®ãªã¬ãã¥ã¢ã¼ã«å½ãã£ãæ°ããã¾ãã
審æ»ãéããªãã
話ãéããªãã
ãããã審æ»ã¢ããªã®ãã³ãã«IDãå¤æ´ãã¦ã
ã¬ãã¥ã¼ãã人ãåãæ¿ããããã¨èãå§ãã¦ãã¾ãã
ï¼ããã¾ã§ãèªåã¯æªããªãã¨æ±ºãã¤ããã¹ã¿ã¤ã«ï¼
2020å¹´2æææ°ã®Electronã¢ããªãã¢ããã«å ¬è¨¼(Notarization)対å¿
ã¢ããã«å ¬è¨¼(Notarization)
Macã«ã¯ã¢ããã«å
¬è¨¼ã¨ãããMacã®éè¯ã¢ããªãç½²åããä»çµã¿ãããã
ãã®ã¢ããã«å
¬è¨¼ãéãã¦ãããªãã¨ã
macOS Catalinaã§ã¯ã¢ããªãèµ·åããéããã®ã¢ããªã®èµ·åããããã¯ããã¾ãã
(èµ·åããè¡ã¯ãããããã)
å°ãåãããã«å¯¾å¿ãã¦ãèªåã®Electronã¢ããªã§
ã¢ããã«å
¬è¨¼ãéãã¦ããã®ã§ããã
å®ã¯ããã®æã¯ãå
¬è¨¼ã®æ¡ä»¶ãå°ãç·©ããªã£ã¦ããããã・・・
ã¢ããã«ãmacOSéè¯ã¢ããªã®å ¬è¨¼è¦ä»¶ãä¸æçã«ç·©åãCatalinaã¸ã®ã¹ã ã¼ãºãªç§»è¡ã®ãã https://japanese.engadget.com/2019/09/05/macos-catalina/
ã¾ããããèªå®¶è£½Electronã¢ããªã§ã
ã¢ããã«å
¬è¨¼ãéããªããªã£ã¦ãã¾ã£ãã®ã§ããã¾ããã
(´ã»Ïã»ï½)
ãã®è¨äºã¯ãElectron製ã¢ããªã§ã¢ããã«å
¬è¨¼(Notarization)ãéãã
ãã®æé ã«ã¤ãã¦ã®ã話ã¨ãªãã¾ãã
Xcodeã®ãã¼ã¸ã§ã³
ã¾ãæåã«ãã¢ããã«å
¬è¨¼ãéãã«ã¯ãæ°ããã®Xcodeãå¿
è¦ã§ãã
ãã¼ã¸ã§ã³ãä½ãå ´åã¯Xcode 10以éã«ãã¼ã¸ã§ã³ãä¸ãã¦ããã¾ãããã
App Storeããã¤ã³ã¹ãã¼ã«ã§ããªãå ´åã¯ãApple Developerãããã¦ã³ãã¼ããã¦ãã¦ãã¤ã³ã¹ãã¼ã«ãã¾ãã
https://developer.apple.com/jp/
ä½ã£ãã¢ããªã«ç½²åãã¤ãã
ä½ã£ãã¢ããªã«ç½²åãã¤ãã¾ãã
electron-osx-signã¨ããã©ã¤ãã©ãªã使ããã
codesignã³ãã³ãã§ãElectronã¢ããªã«ç½²åãã¤ãããã¾ãã
https://github.com/electron/electron-osx-sign
ãããããelectron-osx-signã使ããã
electron-builderãelectron-packagerã®ã³ãã³ãã§ã
ãªãã·ã§ã³ã追å ãã¦ç½²åãã¤ããæ¹ã楽ã§ãããã
ããèªåã®å ´åã¯ã
Electronã¢ããªã§DynamicLibraryã使ã£ã¦ãããã
ã¢ããªã«å梱ãã¦ããå¥ã®å®è¡ãã¡ã¤ã«ãå©ãã¦ããããã¦ãã¾ãã¦ã
ã¢ããªã®æ§é ãå°ãç¬ç¹ãªã®ã§ã
codesignã³ãã³ããç´ã«å©ãã¦ç½²åãã¤ãã¦ãã¾ãã
codesign
codesignã³ãã³ãã§ã¢ããã«å
¬è¨¼ç¨ã®ç½²åãã¤ããå ´åã¯ã
次ã®2ã¤ã®ãã©ã¡ã¼ã¿ãã¤ãã¦ãcodesignãå®è¡ãã¾ãã
--options runtime --timestamp
ä¸ã®ã³ã¼ãã¯ãä»®æ³ã³ã¼ãã§ãã
ä»®æ³ã³ã¼ãã§ããã
"ã©ã®ãã¡ã¤ã«ã«å¯¾ãã¦ãã©ã®ãã©ã¡ã¼ã¿ã§codesignãå®è¡ããã"
ã¨ããã®ã大äºãªæ
å ±ãªã®ã§ã
ãã£ã¨ãã®è¨äºãèªã¿ã«æ¥ã人ã«ã¯ããã§ããããã¯ãã»ã»ã»
ã¢ããªåã¨ãIDã¯é©å½ã«èªã¿æ¿ãã¦ãã ããã
APP='MYukkuriVoice' identity='Developer ID Application: Foo Bar (99QXXXXXXX)' PARENT_PLIST='build/darwin.app.plist' CHILD_PLIST='build/darwin.app-child.plist' /usr/bin/codesign --options runtime --timestamp -s "${identity}" -f --entitlements "${CHILD_PLIST}" `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libEGL.dylib` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libswiftshader_libEGL.dylib` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libGLESv2.dylib` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libswiftshader_libGLESv2.dylib` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/crashpad_handler` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Electron Framework.framework` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper (GPU).app/Contents/MacOS/${APP} Helper (GPU)` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper (GPU).app` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper (Plugin).app/Contents/MacOS/${APP} Helper (Plugin)` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper (Plugin).app` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper (Renderer).app/Contents/MacOS/${APP} Helper (Renderer)` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper (Renderer).app` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper.app/Contents/MacOS/${APP} Helper` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/${APP} Helper.app` /usr/bin/codesign --deep --options runtime --timestamp -s "${identity}" -f --entitlements "${CHILD_PLIST}" `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Mantle.framework/Mantle` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Mantle.framework/Versions/A` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/ReactiveCocoa.framework/ReactiveCocoa` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/ShipIt` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Squirrel.framework/Squirrel` `${APP}-darwin-x64/${APP}.app/Contents/Frameworks/Squirrel.framework/Versions/A` # ã¢ããªããèªã¿è¾¼ãã§ããDynamicLibrary # (ãã®ã¢ããªåºæ) /usr/bin/codesign --options runtime --timestamp -s "${identity}" -f --entitlements "${CHILD_PLIST}" `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AqKanji2Koe.framework/Versions/A/AqKanji2Koe` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AqKanji2Koe.framework` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AqUsrDic.framework/Versions/A/AqUsrDic` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AqUsrDic.framework` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AquesTalk10.framework/Versions/A/AquesTalk` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AquesTalk10.framework` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AquesTalk2.framework/Versions/A/AquesTalk2` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AquesTalk2.framework` # ã¢ããªããå®è¡ãã¦ããå¤é¨å®è¡ãã¡ã¤ã«ãã¨ããããèªãã§ããDynamicLibrary # (ãã®ã¢ããªåºæ) /usr/bin/codesign --options runtime --timestamp -s "${identity}" -f `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/maquestalk1-ios` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/secret` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/maquestalk1` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AquesTalk.framework/Versions/A/AquesTalk` `${APP}-darwin-x64/${APP}.app/Contents/Resources/app.asar.unpacked/vendor/AquesTalk.framework` /usr/bin/codesign --options runtime --timestamp -s "${identity}" -f --entitlements "${CHILD_PLIST}" `${APP}-darwin-x64/${APP}.app/Contents/MacOS/${APP}` /usr/bin/codesign --options runtime --timestamp -s "${identity}" -f --entitlements "${PARENT_PLIST}" `${APP}-darwin-x64/${APP}.app`
codesignã³ãã³ãã§ç´æ¥ãElectronã¢ããªãç½²åãããã¨ããã¨ã
対象ã®ãã¡ã¤ã«ãã¨ã¦ãå¤ããªãã¾ããã
ã³ãã³ãã®å®è¡é åºã¯æ°ã«æã»ã©ãå
¥ãæ¿ããã¨é§ç®ãªå ´æãããã¾ãã
次ã®2ã¤ã®ãã¤ããªã¯ã
2020å¹´1æã¾ã§ã¯codesignã§æå®ããªãã¦ãã¢ããã«å
¬è¨¼ãéã£ã¦ããã®ã§ããã
ä»æ(2æ)ã«ãªã£ãããåå¥ã«codesignãã¦ãããªãã¨ã¢ããã«å
¬è¨¼ãéããªããªã£ã¦ãã¾ã£ã¦ãã¾ããã
Electron Framework.framework/Versions/A/Resources/crashpad_handler Squirrel.framework/Versions/A/Resources/ShipIt
entitlements
codesignã³ãã³ãã§æå®ããentitlementsã¯ã
Electronã®å ´åã
com.apple.security.cs.allow-unsigned-executable-memory ãå¿
é ã«ãªãã¾ãã
ããããããã®ã¢ããªã®å ´åã¯DynamicLibraryã使ã£ã¦ããã®ã§ã
ããã¨ã¯å¥ã«ã
com.apple.security.cs.disable-library-validation ã追å ãã¦ãã¾ãã
ã¢ããªã«ãã£ã¦ã¯ãããã以å¤ã«ãå¿
è¦ã¨ãªãæå®ãããã§ãããã
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> </dict> </plist>
å¤ãOSã§ä½ã£ãå®è¡ãã¡ã¤ã«
å¤ãOSã§ãã«ãããå®è¡ãã¡ã¤ã«ãå«ã¾ãã¦ããã¨ãã¢ããã«å ¬è¨¼ãã¨ã©ã¼ã«ãªãã¾ãã ããã解æ¶ããã«ã¯æ°ããå®è¡ãã¡ã¤ã«ãä½ãç´ãå¿ è¦ããããåé¿æ¹æ³ã¯ç¡ãããã§ãã
# ãã®ããã«æããã The binary uses an SDK older than the 10.9 SDK.
ã¢ããªã«ãã£ã¦ã¯ããã®æ¡ä»¶ã®ããã§ãã¢ããã«å
¬è¨¼ãéãããã¦ãéããªããªã£ã¦ãã¾ããã¨ãããããã§ãã
å®è¡ãã¡ã¤ã«ã§ãªããå¤ãOSã§ãã«ãããã©ã¤ãã©ãªã¯ãã¢ããã«å
¬è¨¼ã§ã¨ã©ã¼ã«ã¯ãªãã¾ããã§ããã
å©ãã£ã(>_<)
notarize
codesignã§ç½²åããã¢ããªãã¢ããã«å
¬è¨¼(notarization)ã«éãã¾ãã
調ã¹ãã°åããã¾ããæé ãã¨ã¦ãã¨ã¦ãã¨ã¦ãé¢åãããã
electron-notarizeã©ã¤ãã©ãªã使ãã¨ãããã£ã¨å
¬è¨¼ãéãã¦ã
å®çµã¾ã§å¦çãã¦ãããã®ã§ã
Electronã¢ããªã®ã¢ããã«å
¬è¨¼ã¯ãåºæ¬ãããã使ãã¹ãã ã¨æãã¾ããã
https://github.com/electron/electron-notarize
次ã®ã³ã¼ãã¯gulpã§ãnotarizeãå®è¡ããã³ã¼ãã§ãã
å®è¡çµæãè¿ã£ã¦ããã¾ã§ã¯ãæ¯åæ¯åå°ãæéããããã¾ãã
5åã10åãããã
const gulp = require('gulp'); const notarize = require('electron-notarize').notarize; gulp.task('_notarize', () => { const APP = 'MYukkuriVoice'; const platform = 'darwin'; const APP_PATH = `${APP}-${platform}-x64/${APP}.app`; const bundleId = 'jp.nanasi.foobar'; const teamId = '99QXXXXXXX'; const appleId = DEVELOPER_APPLE_ID; const env = process.env; const password = env.AC_PASSWORD; return notarize({ appBundleId: bundleId, appPath: APP_PATH, appleId: appleId, appleIdPassword: password, ascProvider: teamId, }); });
verify notarization
ã¢ããã«å
¬è¨¼ãéãããã
æ¬å½ã«ã¢ããã«å
¬è¨¼ãéã£ã¦ãããã次ã®ã³ãã³ãã§ç¢ºèªãã¾ãã
# ã¢ããã«å ¬è¨¼ã®å®è¡å±¥æ´ã®è¡¨ç¤º xcrun altool --notarization-history 0 -u '[email protected]' -p 'xxxx-xxxx-xxxx-xxxx' # æå®ã®ã¢ããªãã¢ããã«å ¬è¨¼ãéã£ã¦ããã xcrun stapler validate -v MYukkuriVoice-darwin-x64/MYukkuriVoice.app
ãã¡ããããã§ç¢ºèªãåãã¦ãã¢ããªãåããªããã¨ãããã¾ãã
ãã®å ´åã¯ãåç´ã«ã¢ããªã®ãã°ã§ãªããã°ã
- ã¢ããã«å
¬è¨¼ãéããå¾ã«ã¢ããªãå¤æ´ããã
(ä¸åº¦ãã¢ã³ãã¦ã£ã«ã¹ã½ããã«ãããã¾ãã) - entitlementsã®æå®ã足ããªã
ã®ã©ã¡ãããæªãããã§ãã
ããã
çµããã§ããã¾ããã
èªåã¯ã¾ã macOS Catalinaã«ç§»è¡ãã¦ããªãã®ã§ã
åä½ç¢ºèªãå°ãé¢åã§ãã(´・Ïï½¥`)
Github Actionsã§ããããå°ã£ãã¨ããã¨å¯¾å¿æ¹æ³ã主ã«ã·ã§ã«ã¹ã¯ãªããã使ãGitHub Actions
GitHub Actions
ã¿ãªãããGitHub Actionsã§éãã§ã¾ããï¼
ç§ãæè¿ãGitHub Actionsã§éãã§ãããã§ããã©ã
ããã¤ãå°ããã¨ãããã¾ãã¦ã
ãã®è¨äºã¯ããã®æãå°ã£ããã¨ã®è§£æ±ºã¡ã¢ã§ããã¾ãã
(éãªå°å
¥)
https://help.github.com/ja/actions/automating-your-workflow-with-github-actions
ã·ã§ã«ã¹ã¯ãªããå ã§ãprivateãªnpmã¬ãã¸ããªãnpm install
ãã¬ã¤ãã¼ããªnpmã¬ãã¸ããªãnpm installããã«ã¯ã
.npmrcä½ãã®ãæ©ãã
Settingsã¡ãã¥ã¼ãããSecretsè¨å®ãé¸ãã§ãNPM_AUTH_TOKENãè¨å®ã
ã§ãã£ã¦ããããªæãã
- run: echo "//npm.pkg.github.com/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc - name: npm install run: | npm install
ã·ã§ã«ã¹ã¯ãªããå ã§git clone
actionã§ãªãã¦ãã·ã§ã«ã¹ã¯ãªããã§gitããã
ãã¼ã«ã«ã§åããã«ãã¹ã¯ãªããããã£ã¦ã
ãããGitHub Actionsã§ããã®ã¾ã¾ä½¿ãããã±ã¼ã¹ã®å¯¾å¿æ¹æ³ã
ãã¿ã¼ã³1
git cloneããæãhttpsã§ã¢ã¯ã»ã¹ããã°ãSSHã®è¨å®ã¯è¦ããªãã
git clone [email protected]:taku-o/github-actions-workflow-demo.git â git clone https://github.com/taku-o/github-actions-workflow-demo.git
ãã¿ã¼ã³2
SSHã®ãã¼ãè¨å®ãã¦ããã°ããã©ã¤ãã¼ããªGitHubã¬ãã¸ããªãcloneã§ããã
ã·ã§ã«ã¹ã¯ãªããã§ããããããåã«ã
ssh-key-actionã§ãSSHã®è¨å®ãå
¥ãã¦ããã
- name: ssh key uses: shimataro/ssh-key-action@v1 with: private-key: ${{ secrets.SSH_KEY }} public-key: ${{ secrets.SSH_KEY_PUBLIC }} known-hosts: ${{ secrets.SSH_KNOWN_HOSTS }} - name: git clone run: | git clone [email protected]:taku-o/github-actions-workflow-demo.git
actions/cacheã®limitãå°ããã¦å°ã
actions/cacheã®ãã£ãã·ã¥ã®limitãå°ããã400MBã
容é足ããªãã¦ã大ããªã¢ããªã ã¨ãä¸åãã£ãã·ã¥ãå¹ããªããªãã
ã§ããããããããªãããã«ä¿®æ£ãå
¥ãã ããã
ããæã£ã¦ããç§ã¯ãissueã建ã£ã¦ãã22æ¥çµéãã¦ããã®ãè¦ã¦ã
é³éã§ãã©ã¼ã¯ããã®ã§ãã£ãã
https://github.com/taku-o/github-actions-cache
- name: cache node environment id: cache-node uses: taku-o/[email protected] with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-
1GBã¾ã§å¢ãããã
ãã¡ã ãã³ã¬ãå
é¨ã§tgzãã¦ãã
ãã£ã¦åä½ã§ãã¡ã¤ã«ãµã¤ãºã400MBè¶ãã¦ãGitHub Actionsã®å¶éã«ããã£ã¦æ¶ããã¡ãã(´ã»Ïã»ï½)
ã©ãããããªãããã©ã¡ã¼ã¿å¤åºãã«ããããª
ã£ã¦æè¦ããããããããªãã
ã¢ã¯ã·ã§ã³ã®ãã©ã¼ã¯
ã¢ã¯ã·ã§ã³ã¯GitHub Actions Marketplaceã«å ¬éããªãã¦ã使ããã楽ã§ã¤ã¤ãã
ã§ããGitHub Actionsã®ã¢ã¯ã·ã§ã³ãForkãã¦ãèªåã®ã¬ãã¸ããªã«æã£ã¦ããã¨ã
ã¬ãã¸ããªã®ååã大ãã(?)ãªæãã«ãªã£ã¡ãããã
ã¢ã¯ã·ã§ã³ãForkããå ´åã¯ãåæååå¤æ´å®å®ã ãããã
actions/cache â taku-o/cache â taku-o/github-actions-cache (éªéã«ãªããªãæãã®ååã«)
actions/upload-artifact
actions/upload-artifactã¯zipå½¢å¼ã§ãã¡ã¤ã«ãã¢ãããã¼ãããã
ã§ããæ¢ã«zipãã¡ã¤ã«ãä½ã£ã¦ãå ´åã¯ãããããã®ã¾ã¾ã¢ãããã¼ããã¦æ¬²ãããã ãã
ã£ã¦å°ãæã£ããã©ã
mkdirãmvããã°è¯ãã£ãã ãã ãã
ãããªãã¾ã 許ããã
- name: collect staging built files run: | mkdir built mv release/app.zip built - name: upload built files uses: actions/upload-artifact@master with: name: built path: built
nameã¯ãbuilt.zipã¨zipä»ãã§æå®ããã¨ãbuilt.zip.zipãä½ããããã
æ°ãã¤ããã®ã ã
- name: upload built files uses: actions/upload-artifact@master with: name: built.zip path: built
gitã®branchåãåã
pushãããGitHubã¬ãã¸ããªã®branchã®ååãåãã
GITHUB_REFã®ä¸ã«ååãå
¥ã£ã¦ããã
refs/heads/feature/window-sizeã®ãããªãã©ã¼ãããã
- name: build staging application run: | npx gulp build:staging --branch=${GITHUB_REF#refs/heads/}
Pull Requestãããã³ã¼ããåã
Pull Requestãããã³ã¼ããåãã
Pull Requestãããã³ã¼ãã®ãã¹ããªã©ã§ä½¿ãã
ãã¡ããGITHUB_REFã®ä¸ã«ååãå
¥ã£ã¦ããã
refs/pull/9999/merge
- name: build pr application run: | npx gulp build:pr --pull_request=${GITHUB_REF#refs/}
å®éã«ãPull Requestã®ã³ã¼ããåãè¾¼ãã§ä½¿ãã«ã¯
âã¿ãããªãã¨ããã³ã¼ããæ¸ããã¨ã«ãªãããªï¼
git clone taku-o/github-actions-workflow-demo cd github-actions-workflow-demo git pull origin pull/9999/merge
ããã
çµãããªã®ã ã
ç¶ã»Electron製ã¢ããªã Mac App Store㧠non-public APIã®å©ç¨ã§ rejectãããåé¡ã解決ããã
AppStoreã®ã¬ãã¥ã¼éã£ãã£ã¦
åå
Electron製ã¢ããªã Mac App Storeã¸ã®ç³è«ã§ non-public APIã®å©ç¨ã§ rejectãããåé¡
https://taku-o.hatenablog.jp/entry/2019/11/03/103422
Electronãnon-publicãªAPIãå©ç¨ãã¦ããã®ã§ã
Electron製ã®ã¢ããªãã¿ããªrejectããã¦ããåé¡ããã£ãã®ã ããã©ã
ææ°ã³ã¼ãã§AppStoreã®ã¬ãã¥ã¼ãéã£ãããã§ã解決ã®ã¡ãããã£ãã¿ããã
https://github.com/electron/electron/issues/20027
ããã¡ãã£ã¨ã§ä¿®æ£ãå©ç¨ã§ããããã«ãªãã®ã§ãããã
https://github.com/electron/electron/pull/20965
ã§ããElectron 5以éã対象ãªãã
Electronã®ãã¼ã¸ã§ã³4以ä¸ã¯ããµãã¼ãæã¡åããã¦ãã¾ãã
å½ç¶ä¿®æ£ã¯ç¨æãããªãï¼
Electron 4ç¨ã®Pull Requestãä½ããããã©ã
ä¸ç¬ã§closeããããï¼ï¼
https://github.com/electron/electron/pull/21003
ç§ã使ã£ã¦ãã®ã¯3.1.9ã ã£ãã®ã§ã
ãã®ã¾ã¾ã§ã¯ä¿®æ£ãç¨æãããªãã®ã§ããã
Electron 3ãElectron 4使ã£ã¦ãã人ã¯ã
Electronã®ãã¼ã¸ã§ã³ä¸ãã¾ããããã
ã¨ããããã§Electron 5ã¾ã§ãã¼ã¸ã§ã³ä¸ããã
ã¨ããããã§ãããæ°æ¥ã¯ã
ã¢ããªã§ä½¿ã£ã¦ãã
Electronã®ãã¼ã¸ã§ã³ã¢ããã«å±ãã§ãã¾ããã
Electronã追ã£ã¦ãã人ã¯ç¥ã£ã¦ããã¨æããã©ã
Electronã¯ãã¼ã¸ã§ã³ä¸ãã¦ããããªãåãããããªãã®ã§ããã
èªåã®å ´åã3.1.9 â 5.0.12ã§ã次ã®ãããªåé¡ããã£ãã
(Electron 6ã¸ã®ç§»è¡ãæ¤è¨ãã¦ãã®ã§ãElectron5ç¨ã®å¯¾å¿ã¨ãElectron6ç¨ã®å¯¾å¿ãæ··å¨ãã¦ãã)
node-ffi ã Node 12 ã§ãã«ãã§ããªã
ãã£ã¨ãå¤ãElectron 5ã§ããNode 12.0.0ã§ãã
# ãªãªã¼ã¹ãã¼ããã Upgraded to Chromium 73.0.3683.119, Node.js 12.0.0, and V8 7.3.492.27.
node-ffiã¨ãããã¤ãã£ãã©ã¤ãã©ãªãå®è¡ã§ããã¢ã¸ã¥ã¼ã«ãããã
ä»ã¾ã§ãããå©ç¨ãã¦ããã®ã§ããã
ãã®ã©ã¤ãã©ãªã¯Node 12ã§ã¯ãã«ãã§ããªãã
éçºãæ¢ã¾ã£ã¦ããã
https://github.com/node-ffi/node-ffi
èªåã¯ããããæ¤è¨ããçµæãnode-ffi-napiã«ç§»è¡ãã¾ããã
ã¨ã¦ãè¯ãæãã
https://github.com/node-ffi-napi/node-ffi-napi
menu item role
Electronã®ã¡ãã¥ã¼å®ç¾©ã®roleå®æ°ã大æåå°æåã§å¤ãã£ã¦ãããã
ãããªæãã§ãã¡ãã¡ã
Typescriptã§ã³ã³ãã¤ã«æã«ã¨ã©ã¼ã«ãªã£ã¦ãã
# æç² - {role: 'zoomin'}, - {role: 'zoomout'}, - {role: 'resetzoom'}, + {role: 'zoomIn'}, + {role: 'zoomOut'}, + {role: 'resetZoom'}
Spectron
remote-debugging-portãæå®ããªãã¨ã
Spectronã®ãã¹ãã³ã¼ããåä½ããªããªã£ãã
# æç² describe('dictWindow', function() { this.timeout(10000); before(function() { this.app = new Application({ path: 'App-darwin-x64/App.app/Contents/MacOS/App', chromeDriverArgs: ['remote-debugging-port=9222'], ââââââ ããï¼ env: {DEBUG: 1, NODE_ENV: 'test'}, }); return this.app.start(); });
electron-packager
electron-packagerã§ã¢ããªããã±ã¼ã¸ãä½ã£ã¦ããã®ã§ããã
Electron 6ãããã§ãElectronã®ä½ããçµæ§å¤ãã£ã¦ããããã§ããã
å¤ããã¼ã¸ã§ã³ã®electron-packagerã使ã£ã¦ãã人ã¯ã¢ãããã¼ããå¿
è¦ã§ãããã
https://github.com/electron/electron-packager
ä¸é¨ãã¡ã³ã¯ã·ã§ã³ãéåæã«ãªã£ã¦ã
ä¾ãã°ã
dialog.showMessageBox
ãããåæããéåæå¦çã«ãªã£ã¦ããã
ããããå¤æ´ã¯ããªãªã¼ã¹ãã¼ãã®
Breaking Changesã®é
ã«ç½®ãã¨ãã¦æ¬²ããã
ã°ã£ã¡ãã
æºåå®äºã ã
ã¯ããããããã¢ãããã¼ãã
AquesTalk1 MacãmacOS Catalinaã§32bitãµãã¼ãæã¡åããã¦åããªããªã£ããã©ããªãã¨ããã話
ãªãã
- AquesTalkã¨ããæ©ä¼é³å£°ãä½ãã©ã¤ãã©ãªããã
- macOS Catalinaã§32bitã¢ããªã®ãµãã¼ããæã¡åããã
- AquesTalk1 Macã®ã©ã¤ãã©ãªã¯ãi386ãppcã®universal binaryã ã£ãã®ã§ã
- macOS Catalinaã§ç¡äºãåä½ããªããªã£ã
ã¡ãã£ã¨é å¼µã£ã¦ã¿ã
macOS Catalina以éãã使ããæ©è½ã«ã
iPadã¢ããªãMacã¢ããªã¨ãã¦åããã"Mac Catalyst"ã¨ããæ©è½ãããã
å½åã¯ããã使ã£ã¦ããªãã¨ãããäºå®ã§ããã
iPadã¢ããªãä½ã£ã¦ããã®ãMacã¢ããªã¸ã®å¤æã
ãããããã®æä¸ãiOSçã®AquesTalkãã
Macã¢ããªã§ãã®ã¾ã¾å®è¡ã§ãããã¨ã«æ°ã¥ããã®ã§ãã£ãã
DEã»ï¼«ï¼©ã»ï¼´ï¼¡
(ä»æã®éçºè ã¯åç»ãä½ããããã)
ããã
AquesTalk1 Macã®å£°ä½ãé¢æ°ãããã§ã
unsigned char * AquesTalk_SyntheMV(int idVoice, const char *koe, int iSpeed, int *size)
AquesTalk1 iOSçã®å£°ä½ãé¢æ°ãããã ããã
unsigned char * AquesTalk_Synthe(const char *koe, int iSpeed, int *size)
ããããããªãã足ããªããªã¼ï¼
声(idVoice)é¸ã¹ãªããªã¼ï¼
ã¨ããåé¡ãããã®åé¿æ¹æ³ã«ã¯ãããããªç¡ããããªã