æè¿ãUbuntu SDKïŒQtQuickããŒã¹ïŒãšæ²é»ã«é¢ããQtQuick \ QMLãããã¯ã«é¢ããèšäºãããã«å®å šã«è¡šç€ºãããªããªããŸããé åžãããïŒã ç§ã¯ãã®èšäºãæžãããšã§ãã®ç¶æ³ãä¿®æ£ããããã«ç§ã®èœåãæ倧éã«æŽ»çšãããã£ãã®ã§ãïŒ åºå€§ããææ¡ããããšãã䟡å€ã¯ãªãã®ã§ããããããUbuntu SDKã®äžã®ã¢ããªã±ãŒã·ã§ã³ã§ã倧éã®C ++ã³ãŒããQMLã³ãŒãã§ã©ã®ããã«çœ®ãæãããã«ã€ããŠã®è©±ããå§ããŸãããã ãããããªãã«ãšã£ãŠèå³æ·±ããã®ã«ãªã£ãããããããŸããããã«ãããããããªãããããŠããYandex.Diskãªããç§ã¯ã«ããããé¡ãããŸãïŒ

ãšã³ããªãŒ
é ãããå§ããŸãããç°¡åã«è©ŠããŠã¿ãŸã-æ°å¹Žåãç§ã¯MeeGoïŒïŒïŒçšã®ã¯ã©ãŠãã¹ãã¬ãŒãžã®ã¯ã©ã€ã¢ã³ããäœæãããã£ãã®ã§ãã Yandex.DiskãAPIãéããã®ã¯ãã®ç¬éã§ããã C ++ \ Qtã䜿çšããŠWebDAV APIãµãŒãã¹ããã°ããå®è£ ããQMLã䜿çšããŠGUIãå®è£ ããŸããã ã·ã³ãã«ã§ä¿¡é Œæ§ã®é«ãããã°ã©ã ã§ãã»ãšãã©ã®ã¬ãã¥ãŒã¯è¯å®çã§ãïŒãã°ã€ã³æ¹æ³ãããããªãã£ã人ãé€ããŠ= \ïŒã
ãã°ããããŠãUbuntu Phoneã®åºæ¬çãªã¢ããªã±ãŒã·ã§ã³ã®ãªãŒãã³ãœãŒã¹éçºã«åå ããããšã«ããŸãããããããUbuntu SDKã«ç²ŸéããRSSãªãŒããŒãShortsãã«åãçµãã æ¹æ³ã§ãã äžæ¹ãUbuntu App Showdownãè¿ã¥ããŠããŸããã MeeGoããUbuntu Phoneã«ã³ãŒãã転éããã®ã¯å®éã«ã¯ç°¡åãªã®ã§ããPorted Applicationsãã«ããŽãªïŒä»»æã®OSãã移æ€å¯èœïŒã«ã¯ã©ã€ã¢ã³ããšå ±ã«åå ããããšã«ããŸããã æè¡çãªçç±ã§åã¡ãŸããã§ããã ããã«ãããããããçµæã¯Ubuntu Phoneçšã®åªããYandex.Diskã¯ã©ã€ã¢ã³ãã§ããã ããããããã«ãæ¬ ç¹ããããŸãã-C ++ããŒãã¯ARMå°çšã«æ§ç¯ããããããçµæãšããŠãã¯ãã¹ãã©ãããã©ãŒã ã¯ããã±ãŒãžã¬ãã«ã§å€±ãããŸããã
ãããŠã€ãæè¿ãYandexãããæ¬çªç°å¢ã§ã®æ°ãããã©ã€ãREST APIã®ãªãªãŒã¹ã«é¢ããéç¥ãåãåããŸããã ãã®APIãçŽç²ãªJavaScriptã§å®è£ ããããšãããã«èããŸããã ç¥ããªã人ã®ããã«ãQMLïŒå³å¯ã«ã¯èšããŸããïŒã«ã¯JavaScriptãå«ãŸããŠããŸããã€ãŸãããã®èšèªã®ãã¹ãŠã®æ©èœãQtã©ã€ãã©ãªã®æ©èœïŒããããã£ãä¿¡å·ãªã©ïŒãšçµã¿åãããŠäœ¿çšââã§ããŸããæè»ãªçµã¿åããïŒã çµæã¯ãYandex.Diskã¯ã©ã€ã¢ã³ãã®å®å šãªã¯ãã¹ãã©ãããã©ãŒã å®è£ ã«ãªããŸãïŒãã¡ããQtããããã¹ãŠã®ãã©ãããã©ãŒã ïŒã
ããŒã¹ã©ã€ã³ãšç®æš
ãã®ãããYandex.Diskã®ã³ã³ãã³ãã«å¯ŸããŠããŸããŸãªæäœïŒã³ããŒã移åãåé€ããããªãã¯ãªã³ã¯ã®åä¿¡ãªã©ïŒãå®è¡ã§ããæ¢è£œã®ã¢ããªã±ãŒã·ã§ã³ããããŸãã ãããã¯ãŒã¯éšåã¯C ++ \ Qtã䜿çšããŠå®è£ ããã衚瀺ãããããŒã¿ã®ã¢ãã«ãä¿åããŸãã ã¿ã¹ã¯ã¯æ°ãããµãŒãã¹APIã«åãæ¿ããŠãUIã³ãŒããå€æŽããã«JavaScriptã§æ¢ã«å®è£ ããŠããŸãã

REST APIã®å®è£
WebãµãŒãã¹APIãå®è£ ããããã®ç°¡åãªææ³ãéçºããŸããã ããã¯ãããããã£ãšã¡ãœããã®ã«ã¹ã¿ã ã»ããã§éåžžã«è»œéãªQtObjectåã䜿çšããããšã§æ§æãããŠããŸãã æŠç¥çã«ã¯ã次ã®ããã«ãªããŸãã
QtObject { id: yadApi signal responseReceived(var resObj, string code, int requestId) property string clientId: "2ad4de036f5e422c8b8d02a8df538a27" property string clientPass: "" property string accessToken: "" property int expiresIn: 0 // Public methods... // Private methods... }
responseReceivedã·ã°ãã«ã¯ãXMLHttpRequestããã®éåæå¿çãå°çãããã³ã«APIãªããžã§ã¯ãã«ãã£ãŠéä¿¡ãããŸãïŒä»¥äžãåç §ïŒã ãaccessTokenãããã³ãexpiresInãããããã£ã¯ãå€éšããã®OAuthã«ããæ¿èªåŸã«èšå®ãããŸãïŒWebViewã¯ãã®ã¿ã¹ã¯ã®ãã°ã€ã³ããŒãžã§äœ¿çšãããŸã-yadApi URLã«ããŒã¯ã³ã®åä¿¡ãèŠæ±ããã¯ãªãã¯ããŠãããŒã¿ãå ¥åããããã«ãŠãŒã¶ãŒã«èŠæ±ããæåãããšããŒã¯ã³ãåä¿¡ããŸãïŒåœŒã®ç涯ïŒã
ãããŠãããã«å ¬éAPIã¡ãœããã®1ã€ããããŸã-ãã¡ã€ã«ã®åé€ïŒ
function remove(path, permanently) { if (!path) return var baseUrl = "https://cloud-api.yandex.net/v1/disk/resources?path=" + encodeURIComponent(path) if (permanently) baseUrl += "&permanently=true" return __makeRequst(baseUrl, "remove", "DELETE") }
ããã¯éåžžã«ç°¡åã§ã-èŠæ±URLã¯æž¡ããããã©ã¡ãŒã¿ãŒãã圢æããã__ makeReuqestå éšã¡ãœããã«æž¡ãããŸãã 次ã®ããã«ãªããŸãã
function __makeRequst(request, code, method) { method = method || "GET" var doc = new XMLHttpRequest() var task = {"code" : code, "doc" : doc, "id" : __requestIdCounter++} doc.onreadystatechange = function() { if (doc.readyState === XMLHttpRequest.DONE) { var resObj = {} if (doc.status == 200) { resObj.request = task resObj.response = JSON.parse(__preProcessData(code, doc.responseText)) } else { // Error resObj.request = task resObj.isError = true resObj.responseDetails = doc.statusText resObj.responseStatus = doc.status } __emitSignal(resObj, code, doc.requestId) } } doc.open(method, request, true) doc.setRequestHeader("Authorization", "OAuth " + accessToken) doc.send() return task }
äžèšã®ã³ãŒãã§ã¯ãçŽæãããXMLHttpRequestãèŠãããšãã§ããçµæãåŸãããã«ã·ã°ãã«ãéä¿¡ããŸãã ããã«ãèŠæ±ãªããžã§ã¯ããçæãããŸã-ããã¯ãªãã¬ãŒã·ã§ã³ã³ãŒããèå¥åãããã³XMLHttpRequestèªäœã§ãã å°æ¥çã«ã¯ããã£ã³ã»ã«ãçµæã®åŠçãªã©ã«äœ¿çšã§ããŸãã çªç¶èª°ããã__emitSignalãã«èå³ãæã€ããã«ãªã£ãå Žå-ããã¯ç°¡åã«å®è£ ãããŸãïŒ
function __emitSignal(resObj, operationCode, requestId) { responseReceived(resObj, operationCode, requestId) }
ãã®ãããªã³ãŒãã¯ãä¿¡å·ã®éä¿¡ããã°ã«èšé²ããŠååããããã«äœ¿çšã§ããŸãã å éšé¢æ°ã__preProcessDataãã«ã€ããŠã¯ãäœãããŸããïŒïŒïŒãããã¯å°æ¥ã®ããã¯ããŒã¯ã§ãã å®éãããã«é¢ããŠã¯ç§ãèŠãçµéšããåŠãã ãšããããšã§ããSteamAPIã䜿çšããå Žåã64ãããã®æ°å€ãåŒçšç¬Šã§å²ãŸããŠããªããŠããJSON'eã®åçã«ãªãããšããããŸãã ãã®çµæãJavaScriptã¯ããããäºéã§ãããšèªèãã粟床ã倱ãããé·çãããæ²ãã¿ã®æ²ãã¿ã倱ããŸãïŒ è§£æ±ºçã¯ãå ¥åããŒã¿ã®ååŠçãæ°åã®åŒçšãããã³æååãšåæ§ã«ãããã䜿çšããããšã§ããã
æŠããŠããã¹ãŠ-ã²ãšã€ãã€ãå¿ èŠãªãã¹ãŠã®APIã¡ãœãããå®è£ ãããŸãããã€ãŸãããã©ã«ããŒã®äœæãã³ããŒã移åãåé€ãèªã¿èŸŒã¿ã宣äŒã®ã¹ããŒã¿ã¹ã®å€æŽã§ãã åèšã§ã140è¡ïŒïŒïŒã®ã³ãŒãè¡ãQML \ JSã«ãããWebDAVãããã³ã«å®è£ ã®C ++ \ Qtã«ããä»ã®1,000è¡ã®ã³ãŒããæ©èœçã«å®å šã«çœ®ãæããŸããã
ã¬ã€ã€ãŒå®è£
C ++ã§ã®WebDAVãããã³ã«ã®å®è£ ã¯éåžžã«ã·ã³ãã«ã§ééçã§ããããQMLããçŽæ¥äœ¿çšããã®ã¯äžäŸ¿ã§ããã å€ãããŒãžã§ã³ã§ã¯ãç¹å¥ãªBridgeã¯ã©ã¹ã仲ä»ãšããŠäœæããïŒååã¯la KOïŒããµãŒãã¹ã§ã®äœæ¥ã容æã«ãªããŸãã æ°ããããŒãžã§ã³ã§ã¯ãã®ã¢ãããŒããæŸæ£ãããå€ãBridgeãåãã¡ãœãããšããããã£ã®ã»ãããæã€åãååã®æ°ããQMLã¿ã€ãã«æ éã«çœ®ãæããŸãã ããã°ãç¬èªã®APIãç¶æããããã«ãUIã¯åãé¢æ°ãåŒã³åºãç¶ããŸãããå®å šã«ç°ãªããšã³ãã£ãã£ã®ãã®ã§ãã ç¹°ãè¿ããŸãããæŠç¥çã«ã¯æ¬¡ã®ããã«ãªããŸãã
QtObject { id: bridgeObject property string currentFolder: "/" property bool isBusy: taskCount > 0 property int taskCount: 0 property var tasks: [] function slotMoveToFolder(folder) { if (isBusy) return // .... code } function slotDelete(entry) { __addTask(yadApi.remove(entry)) } property QtObject yadApi: YadApi { id: yadApi onResponseReceived: { __removeTask(resObj.request) switch (resObj.request.code) { case "metadata": // console.log(JSON.stringify(resObj)) if (!resObj.isError) { var r = resObj.response currentFolder = __checkPath(r.path) // Filling model } // !isError break; case "move": case "copy": case "create": case "delete": case "publish": case "unpublish": __addTask(yadApi.getMetaData(currentFolder)) break; } // API property ListModel folderModel: ListModel { id: dirModel } }
ãããã£ãŠãèªåã®ã¯ã©ã¹ã眮ãæããã«ã¯ããcurrentFolderãããã³ãisBusyãããããã£ãå¿ èŠã§ããã æåã®ããããã£ã¯ãããã²ãŒã·ã§ã³çšã®çŸåšã®ãã£ã¬ã¯ããªãã¹ãæ ŒçŽããããã«äœ¿çšãããŸãã ãslotMoveToFolderãã¡ãœããã§ææ°ã«ç¶æãããŸãã ãŸããå®è¡ããããªã¯ãšã¹ãïŒ__addTaskã__ removeTaskãtasksé åãšãã®taskCountã®é·ãïŒãèæ ®ããŠãããã€ãã®ããããã£ãšã¡ãœãããè¿œå ãããŸããã ãã QOã§ããå¿ èŠã¯ãªããé åã«é·ãããããšèšã£ãŠãã ãã-ããããã£ã«ãããQMLã§ãã€ã³ãã£ã³ã°ãå®è¡ã§ããŸãããã®ã±ãŒã¹ã¯ãå°æ¥çã«ã¯isBusyã§ã®ã¿äœ¿çšãããŸã ïŒã 以åã®ããã«é¢æ°ã®åœåãæ®ããŸãã-ãã¹ãããããã¬ãã£ãã¯ã¹ã§å§ãŸããŸãïŒã¯ã©ã¹ã®C ++ããŒãžã§ã³ã§ã¯ã2ã€ã®æ¹æ³ã§QMLããã¡ãœããã®å¯èŠæ§ãéæã§ããŸããïŒããããã¹ãããã«ããããQ_INVOKABLEã䜿çšããŸãïŒã ç°¡æœã«ããããã«ãåã³ãæå®ããããã£ã¬ã¯ããªã«åé€ããŠç§»åããæ¹æ³ã®ã¿ãæ®ããŸãããä»ã®ãã¹ãŠã¯ããœãŒã¹ã³ãŒãã®ãã«ããŒãžã§ã³ã«ãååšããŸãã ã¿ã€ãBridgeã®ã¡ãœããã¯ãUIããçŽæ¥åŒã³åºãããŸãã
æ°ããBridgeã®æ©èœã®1ã€ã¯ãäžèšã®APIã®å®è£ ã§ã-YadApiã ãŸããäœæã®å Žæã§ãæäœã®å®äºã«é¢ããã·ã°ãã«ããªãã¹ã³ããé¢é£ããã¢ã¯ã·ã§ã³ãå®è£ ããŸãã ãããã£ãŠãããšãã°ãååãå€æŽãŸãã¯åé€ãããšããã£ã¬ã¯ããªã®å 容ããªããŒããããŸãã
ããŒã¿ã¢ãã«dirModelã«ã¯ç¹ã«æ³šæãæãããŸãã 以åã®å®è£ ã§ã¯ãå€å žçãªã·ããªãªã«åŸã£ãŠQAbstractItemModelããç¶æ¿ãããFolderModelã¯ã©ã¹ããããŸãã-ç§èªèº«ã®åœ¹å²ïŒQtã«ç²ŸéããŠãã人ãªã誰ã§ãå°ãªããšã圌ãã話ããŠããããšãç解ããã§ãããïŒãªã©ãå°å ¥ããŸãã çŸåšããããã¯ãã¹ãŠãJSãªããžã§ã¯ããæ ŒçŽã§ããæšæºã®ListModelã䜿çšããŠç°¡åã«ç Žæ£ãããŠããŸãã ãã®ã¢ãã«ã¯æ¬¡ã®ããã«å ¥åãããŸãã
dirModel.clear() var items = r._embedded.items for(var i = 0; i < items.length; i++) { var itm = items[i] var o = { /* All entries attributes */ "href" : __checkPath(itm.path), "isFolder" : itm.type == "dir", "displayName" : itm.name, "lastModif" : itm.modified, "creationDate" : itm.created, /* Custom attributes */ "contentLen" : itm.size ? itm.size : 0, "contentType" : itm.mime_type ? itm.mime_type : "", "publicUrl" : itm.public_url ? itm.public_url : null, "publicKey" : itm.public_key ? itm.public_key : null, "isPublished" : itm.public_key ? true : false, "isSelected" : false, "preview" : itm.preview } dirModel.append(o) }
äºææ§ã®ããã«ãã¢ãã«ã®ããããã£åãå€ãããŒãžã§ã³ã®ãŸãŸã«ããŠããå¿ èŠããããŸããã ããã¯ãã¢ãã«ã®C ++å®è£ ã§éåžžã«å€§ããªã¯ã©ã¹ãåŸããšããããšã§ã¯ãããŸããããæšæºã¢ãã«ãšãã®ãããªå°ããªãã¶ã€ã³ã䜿çšããŠãããåãé€ãããšã¯éåžžã«çŽ æŽãããã§ãïŒ
ãããã«
æçµçã«ãYandex.Diskã¯ã©ã€ã¢ã³ãã§C ++ãå®å šã«æŸæ£ããŸããã ç§ã¯ããã©ã¹ã«äœãæªããã®ããããšããäºå®ã«æ±ºããŠåŸåããããŸããã ããïŒ ç§ã®èšäºã®ç®çã¯ãçŽç²ãªQMLã®å¯èœæ§ã瀺ãããšã§ãã-äž»èŠãªã¿ã¹ã¯ã¯UIãéçºããããšã§ããïŒå®éã«ã¯ãã®èšäºã§ã¯èª¬æããŠããŸãããïŒãæ¬åœã«å€ãã®ããšãã§ããŸãã ãŸããã³ãŒãã¯ã·ã³ãã«ã§æ確
ãæž èŽããããšãããããŸããïŒ ã³ãŒãã¯launchpad'eã«ãããŸãã
PSQuestionsãæè¿ããŸããèšäºã®äžéšããã詳现ã«å ¬éãããã®ã§ããã°ããé¡ãããŸãïŒ
PSS次ã®èšäºã§ã¯ãUbuntu SDKã®äž»èŠãªåŽé¢ãšããŒã«ã«åãçµãäºå®ã§ãã