é·ãéã€ã³ã¿ãŒããããïŒ
èªåèªèº«ã®ããã« ïŒå°ãã§ãè¯ãããããšæã£ãŠãããã
æ lazã®æéããªããªããä»æ¥ã¯ããªãã®å¹žéãªæ¥ã§ãã 21ã®ã¹ãããã§ããã®å€§åãªç®æšãéæããæ¹æ³ã瀺ããŸãã
ç¡æããŒãã¹ïŒ ã€ã³ã¿ãŒãããã«å ããŠãGoogleæ€çŽ¢ãæ¹åããŠããŸãã ãã¶ããGoogleã¯ãã®ã¢ã€ãã¢ãé«ãè©äŸ¡ããæãšå¿ãæäŸããŸãïŒãããããªããç§ã¯ãã®ç 究ããããããŸãïŒã
</åè«>
ãã®èšäºã§ã¯ãã¬ãŒãã¬ãŒã¹ã§ã®ç§èªèº«ã®çµéšã䜿çšããŠãChromeãFireFoxãããã³MS Edgeãã©ãŠã¶ãŒçšã®ãã©ã°ã€ã³ãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãã©ã°ã€ã³ã䜿çšãããšããã©ãŠã¶ã§è¡šç€ºãããããŒãžã«ç¬èªã®JavaScript / CSSãç°¡åã«åã蟌ãããšãã§ããŸãã ããªãã¡ ãã©ãŠã¶æ¡åŒµæ©èœAPI liteããŒãžã§ã³ã®äžçš®ã
æ¥ã®åãã«ããã€ã³ã¿ãŒããããã¯ãããžãŒããããŒãã«ããã¿ãŒã ããŒããŒã®ã¿ã¹ã¯ãäžããããŸããã
ææ¡ããããããã¯ã®äžã§æãç°¡åãªãã®ãéžæããããã«æããŸããïŒãææ°ã®ãã©ãŠã¶ã§ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšããã²ãŒã·ã§ã³ãã 圌女ãæ°ååŸæããããšã¯ãæ®å¿µãªããé
ãããŸããã
TL; DR
誰ãã21ã®ã¹ããããã¹ãŠã«ã€ããŠèªã¿ãããªãå Žåã¯ã5ã€è¡ãããšãã§ããŸãã
ãã©ã°ã€ã³ã³ãŒãã¯
GitHubããããŠã³ããŒãã§ã
ãŸã ã
ãããŠãã®åŸïŒ
- ChromeãéãïŒ// Chromeãã©ãŠã¶ã®æ¡åŒµæ©èœ
- [éçºè
ã¢ãŒã]ã®æšªã«ãããã§ãã¯ããã¯ã¹ããªã³ã«ããŸã
- ãã¢ã³ããã¯ãããæ¡åŒµæ©èœãããŒãããã¯ãªãã¯ããŠããœãŒã¹ã³ãŒããä¿åããããã£ã¬ã¯ããªãéžæããŸãã
- ãã®åŸããCustomActionsããã©ã°ã€ã³ã®ããªãã·ã§ã³ããéžæããŸã
- ãªãã·ã§ã³ãã©ãŒã ã§ã[ãã¢æ§æ]ããã³[ä¿å]ãã¯ãªãã¯ããŸãã

ããã ãã§ããããšãã°ãgoogle.comãHabrãéããããæ§æãä¿®æ£ããããã¹ã¯ãªãããæäœãããã§ããŸãã
次ã¯åæ
çãªäœè«ã®ããæ¡åŒµçã§ããè±åœã®ç§åŠè
ã®ç 究ãä¿¡ããŠããå Žåãçç¶ã®ã€ã³ã¿ãŒããããŠãŒã¶ãŒã¯ã圌ãã圌ã«æšãŠããæ
å ±ã®éããéãã5-10ã®ãµã€ããããªãå±
å¿å°ã®è¯ãã€ã³ã¿ãŒãããã®äžçãäœæããŸãã
èªããã®ã¯æ²ããã§ãããããé¡ãèŠããšããã®éåžžã«çç¶ã®ãŠãŒã¶ãŒãèŠãŸããïŒãã°ãã¡ããããã®èšäºãèªãã§ãããªããã€ãšãããã€ã ããäœã£ãŠãã ããããããªããã°ç§ã®å¹ŸäœåŠã¯èŠããã§ãããïŒã
ããããç§ã®9幎åã®ãµã€ããå®ç§ã§ã¯ãªãã£ãããšã«æ°ä»ãã®ã¯ããã«æ²ããããšã§ããã ãããã£ãŠãã³ãŒã¹ã¯ãŒã¯ã®äžç°ãšããŠãïŒãã®ä»ã®ã€ã³ã¿ãŒããããšãšãã«ïŒããããããè¯ãããããšã決å®ãããŸããã
ã»ãšãã©ã®å Žåãããã«ã¯JavaScriptã§3ã4è¡ãCSSã§2ã3è¡ã®ã¿ãèšè¿°ããå¿
èŠããããŸããã
æåã®èª¿æ»ãšåè°ã®åŸããã©ãŠã¶ã¡ãŒã«ãŒã¯æ©èœãæ¡åŒµããæ段ãéããŠãã®ãããªæ©äŒãæäŸããããšãæããã«ãªããŸããã
ãŠã£ãã·ã¥ãªã¹ããå®çŸ©ããŸãã
- ãµã€ããéããšããã®ãµã€ãã«é¢é£ä»ãããããŠãŒã¶ãŒJã¹ã¯ãªãããå°å
¥ãããŸã
- ã«ã¹ã¿ã ã¹ã¯ãªããã¯ãèšå®ããŒãžã§æ§æãããŸãã
- ãã©ãŠã¶ã®ããŒã«ããŒã«ãã¿ã³ãè¿œå ããŠãæ§æããã°ããåŒã³åºããŸã
åç
§æ¡ä»¶ãå®çŸ©ãããã³ãŒãã£ã³ã°ãéå§ããŸãã
ã¹ããã1ã©ã¡ãã®åŽãèŠããã«ãã£ãŠãæãã®åã«
getstartedãèªãã ããéã«å€ãã£ããããŸãã
ã¹ããã2ãããžã§ã¯ãã®æ§é ã決å®ããŸã
options.html
options.js
popup.html
popup.js
background.js
manifest.json
icon.png
images
images\icon128.png
images\icon16.png
images\icon48.png
ã¹ããã3ãããã§ã¹ããäœæããŸãã
{ "name": "CustomActions", "description": "plugin for CustomActions", "version": "1.0", "background" : { "scripts": ["background.js"] }, "icons": { "128": "images/icon128.png", "16": "images/icon16.png", "48": "images/icon48.png" }, "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "permissions": [ "webRequest", "tabs", "activeTab", "http://*/*", "https://*/*", "storage", "unlimitedStorage", "contextMenus", "<all_urls>" ], "browser_action": { "default_title": "Custom Actions Injection plugin", "default_icon": "icon.png", "default_popup": "popup.html" }, "commands": { "cmd-exec-1": { "suggested_key": { "default": "Ctrl+Q" }, "description": "Custom Action #1" }, "cmd-exec-2": { "suggested_key": { "default": "Ctrl+B" }, "description": "Custom Action #2" }, "cmd-exec-3": { "suggested_key": { "default": "Ctrl+Y" }, "description": "Custom Action #3" } }, "options_page": "options.html", "manifest_version": 2 }
ã¹ããã4ç§ã¯options.htmlãã©ãŒã ã«åãçµãã§ããŸãã
åã®ã»ãã·ã§ã³ã«åå ããã®ãäžæè°ã§ã¯ãããŸããã ã³ãŒã¹ãWeb Design 2.0ãã®knockout.jsã®æçšãªç¥è
ãã¡ã€ã«knockout-3.4.1.jsãšknockout.mapping-latest.jsããããžã§ã¯ãæ§é ã«è¿œå ããŸãã
äœãåäœããŸããã æããŸãã å©ãã«ã¯ãªããŸããã 矀ãã Chromeæ¡åŒµæ©èœã¯ããã¯ã¢ãŠãã奜ãŸãªãããšãããããŸããã
æãããããã§ã¹ããæŽæ°ããŸãã
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
ã¹ããã5ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããšããŠèŠåŽããåŸãã€ã³ã¹ãã¬ãŒã·ã§ã³ãçãŸããŸãã
ã¯ãã ãããã¹ãŠãåŒãåºããŸãïŒ//èšå®
ç§ãã¡ã¯å·šäººã®è©ã®äžã«ç«ã£ãŠãç©äºã¯è¡ããŸããïŒ
ã¹ããã6ããŒã¿ãä¿åããå¿
èŠããããŸãã
chrome.storageã«ã€ããŠèªãã
chrome.storage.syncãšchrome.storage.localãéžæããããšã®ãžã¬ã³ã
chrome.storage.syncã¯ããé
åçã§ãããå³ããå¶éããããŸãã
å¥ã®æŽå¯-ç§ã¯ãã¹ããããžã§ã¯ããæã£ãŠããã®ã§ãããŒã«ã«ã¯ãã¹ãŠã§ãã
ãããã§ã¹ããæ¯é
ããŠãå¶éã«åé¡ããªãããã«ããŸãã
ãããŠãchrome.storage.local.setã䜿çšããŠæ§æãä¿åããŸãã
chrome.storage.local.set(items, function () { self.status('Items saved.'); setTimeout(function () { self.status(''); }, 750); });
ã¹ããã7ä¿åãããæ§æã¯background.jsã§ãªããŒãããå¿
èŠãããããšãç解ããŠããŸãããã©ã®ããã«???
ãããçãã«ããã«chrome.runtime.sendMessageïŒ
chrome.storage.local.set(items, function () { self.status('Items saved.'); setTimeout(function () { self.status(''); }, 750); chrome.runtime.sendMessage({ command: 'refreshConfig' }); });
ããã³chrome.runtime.onMessageïŒ
chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { onCommand(request.command); });
ã¹ããã8popup.jsãéããŸãã éããŸãã ããäžåºŠéããŸãã ãããŠ7åã äœãæ確ã§ã¯ãããŸããã
ç§ã¯ãã äžäººã§ããïŒ åŸ
ã¡ã«åŸ
ã£ãæãæ¥ãŠã
ãµã³ãã«ã«ã€ãŸããããç®ã«èŠããªãGoogleã¯ãŒã«ãŒã®ãããã§ã
貎éãªç¥èã®çŠrubãããéããŸãã æåŸã«ãæ£ããäŸãèŠã€ããŠãéæ³ã®çµã¿åããACVïŒCtrl-A / Ctrl-C / Ctrl-VïŒã䜿çšããŸãã 13æéåŸ-ãžã§ãã¯å®äºããŸããã
ã¹ããã9ããã§ã¯ãäž»èŠéšåã§ããã€ã³ã¿ãŒã»ãããšå®è£
ã«é²ã¿ãŸãããã
ã€ã³ã¿ãŒã»ãã¿ãŒ-chrome.tabs.onUpdatedïŒ
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { var url = ''; if (changeInfo && changeInfo.url) url = changeInfo.url.toLowerCase(); else if (tab && tab.url) url = tab.url.toLowerCase();
ããã³ããŒããŒ-chrome.tabs.executeScriptïŒ
if (item.sourceType == 'InjectCSS') chrome.tabs.insertCSS(item.output == 'Owner tab' ? tabId : null, { code: item.data }); else chrome.tabs.executeScript(item.output == 'Owner tab' ? tabId : null, { code: item.source });
ãã¹ãŠãæã£ãããç°¡åã«ãªããŸããããããã§ãç§ãæãã§ãããããé·ããªããŸããã
æ£èŠè¡šçŸãšåŒã°ããæ°ããçŽ æŽãããäžçãçºèŠããŸããã é£ããããšãç°¡åã«ã§ããããšãããããŸããã
ã¹ããã10ãã¹ãŠæºåå®äºã§ãã ããªãã¯æ£çŽã«çšŒãã 5ã€ã«è¡ãããšãã§ããŸã...
...ããã»ã©éããªãã 5ã€ã§ã¯ãªããå€æ°ã®ã³ã¡ã³ããšæ¹åããããããŸããã
æé 11æãç°¡åãªãã®ããå§ããŸããããpopup.jsã§ãçŸåšã®ãµã€ããè¿œå ãæ©èœã®ãµããŒããè¿œå ããŸã
æã£ãã»ã©ç°¡åã§ã¯ãããŸãããpopup.jsããoptions.jsã«ããŒã¿ã転éããå¿
èŠããããŸãã
ã¡ãã»ãŒãžããã£ããããæ¡åŒµã¹ãã¬ãŒãžã«ä¿åããŠèªã¿è¿ãã®ã«3æéãè²»ãããŸããããçµå±ãè³¢ã人ã¯äžãç»ããªãã§ã圌ã¯ãããè¿åããããšã«ããŸããã
ã¯ãšãªæååã¯ããã®æ²ãã¿ã«å¯Ÿããçãã§ãã
æé 12次ã®æ©èœã¯ããè€éã§ãã³ã³ããã¹ãã¡ãã¥ãŒã®ãµããŒããè¿œå ããŸãã
äŸã¯åã³ä¿åãããŸãã ãã¹ãŠããããããç°¡åã§ããããšãå€æããŸãã-chrome.contextMenus.createïŒ
chrome.contextMenus.create({ id: item.id, contexts: ["page", "frame", "selection"], title: item.name, onclick: function (info, tab) { onCommand(info.menuItemId); } });
æé 13ç§ã¯å
åãä¿¡ããŠããŸããããããã¯å¹žããªäžæ©ã§ã¯ãããŸããã§ããã
ãããããŒã䜿çšããŠé話ããµããŒãããå¿
èŠããããŸãã
äŸã®ããã«ãã¹ãŠãè¡ãããããã§ã¹ããä¿®æ£ããŸãïŒ
"commands": { "cmd-exec-1": { "suggested_key": { "default": "Ctrl+Q" }, "description": "Custom Action #1" } }
chrome.commands.onCommandã䜿çšããŸãã
chrome.commands.onCommand.addListener(onCommand);
åäœããŸããã 2æ¥éãšå€ãšå»çä»å
¥ã®åŸãèšå®ããŒãžãäžã«ã¹ã¯ããŒã«ãããšãå¿
èŠãªèšå®ãžã®ç®ç«ããªããªã³ã¯ãèŠã€ãããŸããã

ããã¯ç¬ãåè¬ãããå Žæã§ãã 圌女èªèº«ã®ããã ã圌女ã¯ããŸãã«ãå€ãã®äŸãæãããããã«ãªã³ã¯ãããã次ã®ç»é¢ã«èµ°ã£ãã
ã¹ããã14ç§ãã¡ã®zavlabã«ã¯ãè±èªã®æåž«ã§ãã劻ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¿»èš³ãå¿
èŠã§ãã è±èªãåŠã¶å¿
èŠããããŸãã
æè¡ãå©ãã«ãªããŸãã Google翻蚳察è±èªæåž«-ã¹ã³ã¢1ïŒ0ã§Googleã®ç掻ãæ¯æŽïŒ
æé 15ç§ãã¡ã¯åã³5人ããã©ããŒããŠããŸãããç§ã®å¿ã§ã¯ãã§ã«4人ã«åæããŠããŸãã
ç§ã¯ãªãã¡ã¯ã¿ãªã³ã°ãšããæ°ããåèªãè¿ããŸãïŒãã以åã¯ãFACToringãšããåèªããç¥ããŸããã§ãããç¹ã«ãããžã§ã¯ãã®æåã«ããèšã£ãŠããŸããïŒã
ãŸããè¿œå ã®èŠä»¶ã¯ãããã°ã©ã ã䜿ãããããããã¢æ§æãšãµã³ãã«ãäœæããããšã§ãã
Zavlabã¯ã圌ã®è±èªã®åŠ»ã«å ããŠãUX / UIéšéã®æ人ãããããã§ãã
ããããgoogle-examplesã®è¯ã人ã
ãæãåºããŠã圌女ã¯ã»ãšãã©æµæããŸããã§ããã
æé 16ãªãã¡ã¯ã¿ãªã³ã°ã¯çµäºããŸããã ã³ãŒãã®å
ã®ããŒãžã§ã³ã®ã«ããŒã®äžã«é ãããŠãããã°ã®æ°ã¯é©ãã¹ãããšã§ãããã®èšèãããããèŠããŠããå¿
èŠããããŸãã
ã¹ããã17lorem ipsumã®äŸãè¿œå ããŸãã 誰ããããã¢ããã€ã¹ããŸãããïŒ ã©ãã³èªã®å
çïŒ
èŠä»¶ïŒããŒã®çµã¿åãããã¯ãªãã¯ãããšããã©ãŒã ã®ãã£ãŒã«ãã«loremèšèªã®æç« ãå
¥åããŸãã
ããŸããã£ãããã§ãã
var loremDemoData = { names: [ { firstName: "Victoria", lastName: "Veit", email: "Victoria.Veit@noreply.ru" }, { firstName: "Gisele", lastName: "Gillard", email: "Gisele.Gillard@noreply.ru" }, { firstName: "Edmund", lastName: "Edelson", email: "Edmund.Edelson@noreply.ru" }, { firstName: "Joey", lastName: "Janelle", email: "Joey.Janelle@noreply.ru" } ], lorem: [ "Orem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet purus condimentum, porta nulla sed, consequat felis. Phasellus quis condimentum odio. Maecenas scelerisque vehicula leo, sit amet tristique tellus molestie sed. Aenean lacus lorem, feugiat semper imperdiet a, vehicula ac orci. Pellentesque ac nisi commodo, pellentesque lorem quis, fringilla tellus. Fusce bibendum erat sit amet libero maximus rutrum. Integer dictum nibh sodales efficitur congue. Mauris nulla libero, hendrerit eget dictum nec, aliquam eu mi. Donec ipsum nisi, bibendum et consequat eu, imperdiet eget nisl. Duis tincidunt nibh et nibh tempor, quis mattis mi vulputate.", "Suspendisse quis eleifend lectus. Sed nec vehicula elit. Praesent ac sollicitudin diam. Nam at venenatis lectus. Fusce condimentum tortor nec augue vestibulum tempus. Nullam faucibus vehicula lorem, et mollis justo dapibus a. Proin sagittis velit in lectus vehicula, id eleifend urna hendrerit. Integer rhoncus dui sed enim sollicitudin, a finibus magna fermentum.", "Fusce at urna vitae magna semper scelerisque id volutpat tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed ut elit nisl. Duis sit amet ante accumsan nibh ultricies pharetra at vitae purus. Donec a felis eget ipsum euismod tempus. Donec elementum vel tortor vel efficitur. Nunc tristique, magna hendrerit sagittis placerat, odio sem commodo ligula, eu aliquam arcu elit sit amet diam. Etiam ultrices vehicula auctor." ], loremShort: [ "Morbi nec sollicitudin augue.", "Suspendisse sagittis fringilla aliquam.", "Curabitur malesuada dolor.", "Praesent quis lacus neque. Duis vitae vehicula felis" ] };
function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; } var name = data.names[getRandomInt(0, data.names.length)]; var hadEmail = false; var t = document.querySelectorAll('input[type=text], textarea'); for (var i = 0, l = t.length; i < l; i++) { var e = t[i]; var ro = e.getAttribute('readonly'); if (e.disabled || ro === '' || ro === 'true' || ro == '1') continue; var loremTxt = data.lorem[getRandomInt(0, data.lorem.length)]; var loremShort = data.loremShort[getRandomInt(0, data.loremShort.length)]; var na = ('' + e.name).toLowerCase(); var ia = ('' + e.id).toLowerCase(); if (na == 'firstname' || ia == 'firstname' || na == 'fname' || ia == 'fname') e.value = name.firstName; else if (na == 'lastname' || ia == 'lastname' || na == 'lname' || ia == 'lname') e.value = name.lastName; else if (!hadEmail && (na.indexOf('email') >= 0 || ia.indexOf('email') >= 0)) { e.value = name.email; hadEmail = true; } else { e.value = (e.tagName == 'TEXTAREA' ? loremTxt : loremShort); } }
ã¹ããã18次ã®äŸã¯ããµã€ãhabrahabr.ruçšã§ã
èŠä»¶ïŒãµã€ããéããšããæ§æã«ãªã¹ããããŠããããããã³äŒæ¥ã®èšäºãé衚瀺ã«ããŸãã äŒç€Ÿã«ä»£ãã£ãŠæžãããèšäºã«ã€ããŠã¯ãç¬ç«ããèè
ã«ãã£ãŠæžãããèšäºãšã¯æããã«ç°ãªããã®ã«ããŠãã ããã
ãã®éçšã§ãHabrãšGiktaymsã®ååšã«ã€ããŠåŠã³ãŸããã ç§ã¯ãããã«ã€ããŠåã«ç¥ã£ãŠããã§ãããããã¹ãŠãå°ãªããšã2åé«éã ã£ãã§ãããã ãã³ã¹ãããã§èªæžã3æ¥ééãããŸããã 圌女ã¯æšå¹Žã ãèšäºããã¹ã¿ãŒããŸãããããŸã ããããã®èå³æ·±ãããšããããŸãïŒ
次ã®ã¢ãã€ã³ãã¡ã³ãã§ãç§ã®å¿ççæ³å£«ã¯ç§ã®èŠçã«ã€ããŠã®èšäºãæžãããã«å§ããŸããã 圌ã¯ãããã¯ãã®ã³ãŒã¹ã§ã®äœæ¥ã«ãã£ãŠåŒãèµ·ããããå¿ççãã©ãŠãã®æ²»çã«ãããéèŠãªã¹ãããã ãšèšããŸãã
èšäºã®äœæãé©åãªé å€ã®æåã«çœ®ãæããææ¡ã«ã€ããŠã圌ã¯æåŠããŸããã æåŸã«ãç§ã¯äžžè¬ã«åæããŸããããèšäºãæžããšããæ¡ä»¶ã§ã 座ã£ãŠããŸãã ç§ã¯æžããŠããŸãã
èšäºã®æ¹ãã³ãŒããããæžããããããšãããããŸããã ãã¶ãããã¥ã¯ãã¯èªè
ã§ã¯ãªããäœå®¶ã§ããïŒ
{ "showCompanies": [ "yandex", "mosigra" ], "hideCompanies": [ "hashflare" ], "hideHubs": [ "lib" ] }
function hideParent(el) { if (el.classList && el.classList.contains('post_teaser')) el.style.display = 'none'; else if (el.parentElement) hideParent(el.parentElement); } function sanitizeParent(el) { if (el.classList && el.classList.contains('post_teaser')) { el.querySelectorAll('img').forEach(function (img) { img.style.display = 'none'; }); el.querySelectorAll('.post__body_crop').forEach(function (chld) { chld.style.maxHeight = '4em'; chld.style.overflow = 'hidden'; el.addEventListener('mouseover', function () { chld.style.maxHeight = "inherit"; chl d.querySelectorAll('img').forEach(function (img) { img.style.display = 'block'; }); }, false); el.addEventListener('mouseout', function () { chld.style.maxHeight = "4em"; chld.querySelectorAll('img').forEach(function (img) { img.style.display = 'none'; }); }, false); }); el.querySelectorAll('.post__title a').forEach(function (titl) { titl.style.color = '#707040'; }); } else if (el.parentElement) sanitizeParent(el.parentElement); } document.querySelectorAll('a[href*="https://geektimes.ru/hub/"]').forEach(function (el) { var hub = el.getAttribute('href').replace(/^.*\.ru\/hub\//, '').replace(/\/.*$/, ''); if (data && data.hideHubs && data.hideHubs.indexOf(hub) >= 0) hideParent(el); }); document.querySelectorAll('a[href*="https://geektimes.ru/company/"], a[href*="https://habrahabr.ru/company/"]').forEach(function (el) { var company = el.getAttribute('href').replace(/^.*\.ru\/company\//, '').replace(/\/.*$/, ''); if (data) { if (data.hideCompanies && data.hideCompanies.indexOf(company) >= 0) { hideParent(el); return; } else if (data.showCompanies && data.showCompanies.indexOf(company) >= 0) return; } sanitizeParent(el); });
ã¹ããã19ã€ã³ã¿ãŒããããããŸãããé¢çœãã¢ã€ãã¢ãèŠã€ããGoogleæ€çŽ¢ã®äŸãšããŠãããå®è£
ããããšã«ããŸããã
ãã¶ã圌ã¯ã€ãã·ã¢ããã«æè¬ããäºçŽ°ãªããšãéžã¶ã®ããããã§ãããã
æ©èœïŒGoogleãéããšãæãé »ç¹ã«äœ¿çšãããåèªãšãµã€ãã®ãªã¹ããå«ãããŒã«ãããã衚瀺ããããã°ããæ€çŽ¢ã§ããŸãã
Harbã®äŸã«åŸã£ãŠãããã¯ããã€ãã®ãã³ã»ã³ã¹ã§ãã
var googleDemoData = [ { "keywords": "python", "title": "python" }, { "keywords": "javascript", "title": "javascript" }, { "keywords": "php", "title": "php" }, { "keywords": "mysql", "title": "mysql" }, { "keywords": "site:stackoverflow.com", "title": "at stackoverflow.com" }, { "keywords": "site:developer.mozilla.org", "title": "at developer.mozilla.org" }, { "keywords": "site:developer.chrome.com", "title": "at developer.chrome.com" }, { "keywords": "site:habrahabr.ru", "title": "at habrahabr.ru" } ];
function ggSetTimeRange() { var elemId = this.getAttribute('data-range'); var timeLimit = document.querySelector('#' + elemId + ' a'); if (timeLimit) timeLimit.click(); } function ggReplaceAndSearch() { var kw = this.getAttribute('data-search'); if (document.location.href.indexOf('chrome-search://') == 0 || document.location.href.indexOf('https://www.google.com/_/chrome/newtab?') == 0) { document.location.href = "https://www.google.com/search?q=" + encodeURIComponent(kw); return; } var inputText = document.querySelector('input[name="q"]'); if (inputText) { setTimeout(function () { var keyword = '' + inputText.value; if (kw.indexOf('site:') >= 0 && keyword.indexOf('site:') >= 0) { keyword = keyword.replace(/ *site:[^ ]+/, ''); } else if (keyword.indexOf(kw) >= 0) return; kw = ' ' + kw; if (kw.indexOf('site:') >= 0) { inputText.value = keyword + ' ' + kw; setTimeout(function () { var btn = document.querySelector('form[action="/search"]'); if (btn) { btn.submit(); } else { btn = document.querySelector('button[name="btnK"]'); if (btn) { btn.click(); } } }, 100); } else { inputText.value = kw + ' ' + keyword; var strLength = ('' + inputText.value).length; inputText.setSelectionRange(strLength, strLength); } }, 200); setTimeout(function () { inputText.focus(); }, 100); }; }; var ggHelper = document.getElementById('ggHelper'); if (!ggHelper) { var helperHtml = '<div id="ggHelper" style="position: fixed; ' + 'box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); ' + 'background-color: #f0f0f0; border-radius: 2px; flex: 1; ' + 'padding: 0.7em 1em 0.3em 1em; right: 1em; top: 12em; width: 13em; height: ' + (data.length + 4) + 'em; ' + 'font-size: 13px;">' + '<ul style="list-style-type: none; margin: 0; padding: 0;">'; data.forEach(function(dataItem ) { helperHtml += '<li style="text-align: left; cursor: pointer;"><a href="javascript: return false;" data-search="' + dataItem.keywords + '" class="gg-keyword">' + dataItem.title + '</a></li>'; }); helperHtml += '<li style="margin: 0.5em;"><hr size="1" style="height: 1px; border-color: #e0e0e0;"></li>'; helperHtml += '<li style="cursor: pointer;">' + '<a href="javascript: return false;" data-range="qdr_w" class="gg-range">week</a> :: ' + '<a href="javascript: return false;" data-range="qdr_m" class="gg-range">month</a> :: ' + '<a href="javascript: return false;" data-range="qdr_y" class="gg-range">year</a> :: ' + '<a href="javascript: return false;" data-range="qdr_" class="gg-range">any</a></li>'; helperHtml += '</ul></div>'; var bodyTag = document.querySelector('body'); if (bodyTag) { var e = document.createElement('div'); e.innerHTML = helperHtml; bodyTag.appendChild(e.firstChild); document.querySelectorAll('#ggHelper .gg-keyword').forEach(function (el) { el.addEventListener('click', ggReplaceAndSearch); }); document.querySelectorAll('#ggHelper .gg-range').forEach(function (el) { el.addEventListener('click', ggSetTimeRange); }); } }
ã¹ããã20ããŒããŒã®éºèšã«ãããšãç§ã¯ã¬ãã¥ãŒçšã®ã³ãŒããå°é家ã°ã«ãŒãã«éä¿¡ããŸããã å€å®-ãã¹ãŠãæžãæããŸãã æ³£ããŠããããæ³£ããŠã
é£çµ¡åŸãå°ãªããšã6ã€ã®ãã°ãèŠã€ãããŸããã ã¬ãã¥ãŒã¯åã§ãïŒ ãã®èšèãèŠããŠããå¿
èŠããããŸãã
ã³ãŒããèŠããšããæãã«ãªããããã«æžãããŠããããšãšãã®çç±ãç解ãå§ããŸããã
ã¹ããã21ãã¹ãŠæºåå®äºã§ãã
ç§ã¯ããã5ã«é²ã¿ã4ã€ãé Œãã«ããŸããã3ã€ã«ã¯åæããŸãã ãã以äžã®åŒ·ãã¯ãããŸããã
3é±éã®ç掻ãçŸä»£ã®æè¡ãšã®æŠãã«æã蟌ãŸããŸãã
é 匵ã£ãŠïŒ
PS :. æåŸã«ãstackoverflow.comã®äœæè
ãšãŠãŒã¶ãŒã«å¿ããæè¬ããŸãã
äœæåã®äœåãã©ã®ãããªãã®ãæ³åã§ããŸããã ãããŠãWebã®åºçŸåïŒTNBã®æ å
ãç§ã¯Webã®äœæåŸã«çãŸããŸããïŒãããã°ã©ããŒã®è·æ¥ã¯ããããæãèœã¡èŸŒãã§ãããåäœé¢ç©ãããã®æé«ã¬ãã«ã®èªæ®ºè
ã§ããã
ä»ã§ããé äžã®ãã¹ãŠã®æ€çãåŒãè£ãããå Žåãããã°ãããã«æªãå ŽåããããŸãã
PPS :. æ¹å€ã¯å€§æè¿ã§ãã ã©ãã§ãã
ã¢ããããŒã1 ã 圌ãã¯ç§ã«4 ++ãšè©äŸ¡ããŸããã
ãStackOverflowã§ã®çäœãå€ãããããšããæèšãã1ã€ã®ããŒã«ãåŒããŸããããHabréã®èšäºã«ãã©ã¹ãè¿œå ããŸããã 2çªç®ã®ãã©ã¹ã«ã€ããŠã®è³ªåã«ã圌ã¯åœŒã®å£ã²ããäžæè°ã«ç¬ããŸãã
ã¢ããããŒã2 ã 2ã€ã®è¯ããã¥ãŒã¹ã
æåã®ãã® ã ãããã¯ãŒã¯æè¡ã®å
çã¯ããåéãšå
±æãæ©èœãè¿œå ãããšãè©Šéšã«èªåçã«åæ ŒãããšçŽæããŸããã é§åšå¡ã®ã°ã«ãŒãããªãã¿ã®ãªãèšèã話ããŸããã
ç§ã¯åº§ã£ãŠãnode.jsãå«ç
ããŠããŸãããã£ã³ããŒã³ã¯å«ç
ã ãã§ãªãã飲é
ãéå§ããå¿
èŠããããŸãã ããã«ãªãã§ã¯ç解ã§ããŸããã
é²ã®äžãžã Herokaã§å¿
èŠã§ããïŒ ãã€ãã®ããã«åŒãæž¡ãæ¹ãè¯ããããããŸãã-ãããŒããããšã¢ã€ãŒã³ã ãããŠãå¥åº·ã¯ããé«äŸ¡ã§ãã
äºçªç® ã ã³ã¡ã³ãã®æ祚çµæã«åºã¥ããŠ3ã€ã®è¿œå æ©èœãè¿œå ããå ŽåãZavlabã¯æ¥å¹Žçºæ¿ã¬ãŒããçžæ®ºããããšãçŽæããŸããã
ãããã£ãŠãæ©èœãæ¹åããæ¹æ³ã«ã€ããŠã¢ã€ãã¢ãããå Žåã¯ãææ¡ãæ祚ããŠãã ããã æ°ãããã¢æ©èœããã³ãã¬ãŒãããŸãã¯UIã®ããªãããŒãªãã®ãªã©ã䜿çšã§ããŸãã
ã¯ã€ã«ããªãã¡ã³ã¿ãžãŒã声ã«åºããŠãã ããã
3çªç® ã ãããããŸãããã°ãåæ¥èšŒæžã¯äœãã®ããã«äœããããã§ããããïŒ
ã¢ããããŒã3 ã ãã£ãïŒ ãã«ã§ã®æåã®çµŠäžã ä»äºãšæ
è¡ã®ããã°ã©ã ã§ã¯ãå°å
ã®ãã¯ããã«ãæçã§è±èªãå匷ããŠããŸãã
åŠãã æåã®ã€ãã£ãªã ïŒãèçã®äžã®ããã¢ãã å€ã®çµãããŸã§ã«ã¯æµfluentã«ãªããšæããŸãã
ç§ã¯ãã«ã«60ãæããŸãããŒãã®æ°ã¯ãå°åã»ã³ã¿ãŒã®ããã°ã©ããŒã«ãšã£ãŠæé«ã®ãªãã¡ãŒãšç«¶åããŸãã å°åºã»ã³ã¿ãŒã§ã¯ãä¿æ°Nãå
¥åããå¿
èŠããããŸãã
Nã¯å°ãããããŸãããMãåãå¿
èŠããããŸãã
å°é家ã®ã°ã«ãŒãã¯éãã«é ãããããããŸããããå°çãããšç§ãã¡ãéšãç«ãŠãããšã瀺åããŠããã 圌ãã¯ãã€ããæã£ãŠããããšãèŠæ±ããŠããŸãã ãããã21æ³ã§ãªã人ã«ãšã£ãŠã¯ã楜åšã販売ããŠããªãã®ã§ãã©ãããã°ããã®ãããããŸããã
ç§ã¯ããããæããŸãã
ãã¶ãç§ã®æçã¯æçã§ããïŒ ç§ã¯ç¥æ¯ãæžããcheburechnyãéãããã€ãšãããã€ãååŒããŸãã ãããŠãç¡æã®ãã¯ããã«ãã®ãã€ãšããã§ã¯ãç§ã¯ééããªãéåžžã«çç¶ã®ãŠãŒã¶ãŒã®ãŸãŸã§ãã
ã¢ããããŒã4 ã æ³çäŒæ¯ã®ä»£ããã«ãç§ã¯ç ããªãå€ã®ããã°ã©ãã³ã°ã2åéãããŸããïŒãããŠããã®2æ¥éã®çµæãæåã®çµŠäžãã¹ã¿ãŒããã¯ã¹ã«åŒãäžããŸããïŒããããã§ããã©ã°ã€ã³ãFireFoxãšMS Edgeã«å€æããŸããã
FireFoxã¯ã»ãšãã©æµæããŸããã§ããã GitHubãã
ã³ãŒããŸãã¯
æ¢è£œã®ãã©ã°ã€ã³ãããŠã³ããŒãã§ããŸãã
ãœãŒã¹ããã®ããŠã³ããŒããèš±å¯ããã«ã¯ãweb-extã䜿çšããããèšå®ã䜿çšããå¿
èŠããããŸãã

å®æãããã©ã°ã€ã³ãããŠã³ããŒãããã«ã¯ïŒ

ãããŠãMS Edgeã¯ãã¹ãŠã®æ足ã«å¯ãããã£ãŠãã»ãšãã©è©°ãŸããŸããã§ããã ç§ã¯èŸãããã£ãã®ã§ãããåæãããçºæ¿ã¬ãŒãã®æ©æ¢°ã¯ãŸã 匱ç¹ã匷ã¿ã«åã€ããšãèš±ããŠããŸããã§ããã
ããã¥ã¡ã³ãããã®èšèïŒMicrosoft Edgeæ¡åŒµæ©èœã¯çŸåšãããã©ã«ãã®ããªã·ãŒå¶éã®ã¿ããµããŒãããŠããŸãïŒscript-src 'self'; object-src 'self'ããªãã·ã§ã³ã®åœ¢åŒã§ã®ããã¯ã¢ãŠãã®äœ¿çšã«çµæ¢ç¬Šãæã€ã è§åºŠã«å€æããå¿
èŠããããŸããã ãŸããåéºãªãã§ã¯ãããŸããã
ããããå¥è·¡ãèµ·ãããæçµçã«ãã¹ãŠãèµ·ãããŸããã ã³ãŒãã¯
GitHubããååŸã§ããŸãã
aboutïŒflagsã§éçºãæå¹ã«ããå¿
èŠããããŸã

ãã®åŸãããŒã«ã«ã§äœ¿çšããããã«ããŠã³ããŒãã§ããŸãã

StackOverflowã«æ¢ã«æè¬ããŠããŸããïŒ ããäžåºŠããã®ç¥èã®å®åº«ã®åã§åžœåãè±ããŸãã