æã®GitHub
ãããªã®ãœãŒã¹
Dã«æ¥ããã£ãã
äž»ãªçç±ã¯ãå ã®ããã°æçš¿ãGoãRustãªã©ã®éçã«åæå®ãããèšèªãæ¯èŒããNimãCrystalã«æ¬æãè¡šããŠèšåãããããã®ã«ããŽãªã«åé¡ãããDã«ã€ããŠã¯èšåããŠããªãã£ãããã§ããã§ããããæ¯èŒãé¢çœããªããšæããŸãã
ç§ã¯èšèªãšããŠDã奜ãã§ãä»ã®ããŸããŸãªããã°æçš¿ã§èšåããŠããŸãã
ããŒã«ã«ç°å¢
ãã®ããã¥ã¢ã«ã«ã¯ããªãã¡ã¬ã³ã¹ã³ã³ãã€ã©ã§ããDMDãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããæ¹æ³ã«é¢ããåºç¯ãªæ å ±ãå«ãŸããŠããŸããWindowsãŠãŒã¶ãŒã¯ã€ã³ã¹ããŒã©ãŒãå ¥æã§ããmacOSãŠãŒã¶ãŒã¯èªäœã䜿çšã§ããŸããUbuntuã§ã¯ãaptãªããžããªãè¿œå ããéåžžã®ã€ã³ã¹ããŒã«ã«åŸããŸãããããã«ãããDMDã ãã§ãªãããããããã±ãŒãžãããŒãžã£ãŒãååŸã§ããŸãã
Rustãã€ã³ã¹ããŒã«ããã®ã§ãå§ããã®ãã©ãã»ã©ç°¡åããç¥ãããšãã§ããŸããããšãŠãç°¡åãªããšã«é©ããŸãããã€ã³ã¿ã©ã¯ãã£ãã€ã³ã¹ããŒã©ãŒãå®è¡ããã ãã§ãæ®ãã¯åŠçãããŸããããã¹ã«ã/ .cargo / binãè¿œå ããå¿ èŠããããŸãããå€æŽãæå¹ã«ããã«ã¯ãã³ã³ãœãŒã«ãåèµ·åããå¿ èŠããããŸããã
ç·šéè ã«ãããµããŒã
ç§ã¯Vimã§Hashtrackãåé¡ãªãäœæããŸããããããã¯ãããããæšæºã©ã€ãã©ãªã§äœãèµ·ãã£ãŠããã®ãã«ã€ããŠããçšåºŠã®èããããããã§ããæ£ããããã±ãŒãžããã€ã³ããŒãããªãã£ãã·ã³ãã«ã䜿çšããããééã£ãåŒæ°ã§é¢æ°ãåŒã³åºããããããããåžžã«ããã¥ã¡ã³ããéããŠããŸãããæšæºã©ã€ãã©ãªã®å Žåãåã«ãimportstd;ããšæžãããšãã§ããããšã«æ³šæããŠãã ããããããŠãããªãã®åŠåã§ãã¹ãŠãæã£ãŠããŸãããã ãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã®å Žåã¯ããèªèº«ã§è¡ã£ãŠãã ããã
ããŒã«ãããã®ç¶æ ã«èå³ããã£ãã®ã§ããæ°ã«å ¥ãã®IDEã§ããIntellijIDEAã®ãã©ã°ã€ã³ã調ã¹ãŸãããç§ã¯ãããèŠã€ããŸãããããŠãããã€ã³ã¹ããŒã«ããŸããããŸããDCDãšDScannerãããããã®ãªããžããªã®ã¯ããŒã³ãäœæããŠãã«ãããæ£ãããã¹ãæãããã«IDEAãã©ã°ã€ã³ãæ§æããŠã€ã³ã¹ããŒã«ããŸããã詳现ã«ã€ããŠã¯ããã®ããã°æçš¿ã®äœæè ã«åãåãããŠãã ããã
æåã¯ããã€ãã®åé¡ãçºçããŸããããIDEãšãã©ã°ã€ã³ãæŽæ°ããåŸã«ä¿®æ£ãããŸãããç§ãééããåé¡ã®1ã€ã¯ã圌女ãèªåã®ããã±ãŒãžãèªèã§ããããããããæªå®çŸ©ããšããŠããŒã¯ãç¶ããããšã§ãããåŸã§ãããããèªèãããããã«ããmodulepackage_module_name;ããé 眮ããå¿ èŠãããããšã«æ°ä»ããŸããããã¡ã€ã«ã®å é ã«ãããŸãã
å°ãªããšãç§ã®ãã·ã³ã§ã¯ã.lengthãèªèãããªããšãããã°ããŸã ãããšæããŸãã Githubã§åé¡ãéããã®ã§ãããã§ãã©ããŒã§ããŸãèå³ãããã°ã
Windowsã䜿çšããŠããå ŽåãVisualDã«ã€ããŠè¯ãããšãèããããšããããŸãã
ããã±ãŒãžç®¡ç
Dubã¯ãDã®äºå®äžã®ããã±ãŒãžãããŒãžã£ãŒã§ããcode.dlang.orgããäŸåé¢ä¿ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãããã®ãããžã§ã¯ãã§ã¯ãcURLã䜿çšããããªãã£ããããHTTPã¯ã©ã€ã¢ã³ããå¿ èŠã§ãããæçµçã«ã2ã€ã®äŸåé¢ä¿ãrequestsãšãã®äŸåé¢ä¿ãcachetoolsã«ãªããŸããããããã«ã¯ç¬èªã®äŸåé¢ä¿ããããŸãããããããäœããã®çç±ã§ã圌ã¯ããã«12ã®äŸåé¢ä¿ãéžæ
ããŸãããDubã¯ããããå éšã§äœ¿çšããŠãããšæããŸãããããã«ã€ããŠã¯ããããããŸããã
Rustã¯ããããã®ç®±ïŒçŽ228ïŒãããŠã³ããŒãããŸããããããã¯ããããRustããŒãžã§ã³ãç§ã®ãã®ãããå€ãã®æ©èœãåããŠããããã§ããããšãã°ã圌ã¯rpasswordãããŠã³ããŒãããŸãããããã¯ãPythonã®getpassé¢æ°ãšåæ§ã«ã端æ«ã«å ¥åãããšãã«ãã¹ã¯ãŒãæåãé衚瀺ã«ããããŒã«ã§ãã
ã©ã€ãã©ãª
graphqlã«ã€ããŠã»ãšãã©ç解ããŠããªãã®ã§ãã©ãããå§ããã°ããã®ãããããŸããã§ããã code.dlang.orgã§ãgraphqlããæ€çŽ¢ãããšããgraphqldããšããååã®å¯Ÿå¿ããã©ã€ãã©ãªãèŠã€ãããŸããããããããããç 究ããåŸãããã¯å®éã®ã¯ã©ã€ã¢ã³ããšãããããvibe.dãã©ã°ã€ã³ã®ããã«èŠããããã«æããŸããã
Firefoxã§ãããã¯ãŒã¯èŠæ±ã調ã¹ãåŸããã®ãããžã§ã¯ãã§ã¯ãHTTPã¯ã©ã€ã¢ã³ãã䜿çšããŠéä¿¡ããgraphqlèŠæ±ãšå€æãç°¡åã«ã·ãã¥ã¬ãŒãã§ããããšã«æ°ä»ããŸãããå¿çã¯ãstd.jsonããã±ãŒãžã«ãã£ãŠæäŸãããããŒã«ã䜿çšããŠè§£æã§ããåãªãJSONãªããžã§ã¯ãã§ãããã®ããšã念é ã«çœ®ããŠãç§ã¯HTTPã¯ã©ã€ã¢ã³ããæ¢ãå§ããèŠæ±ã«èœã¡çããŸãããããã¯äœ¿ããããHTTPã¯ã©ã€ã¢ã³ãã§ãããããã«éèŠãªããšã«ãããçšåºŠã®æç床ã«éããŠããŸãã
ãããã¯ãŒã¯ã¢ãã©ã€ã¶ãŒããã®éä¿¡èŠæ±ãã³ããŒããŠãå¥ã ã®.graphqlãã¡ã€ã«ã«è²Œãä»ãããããã€ã³ããŒãããŠãé©åãªå€æ°ãšãšãã«éä¿¡ããŸããããããžã§ã¯ãã®å¿ èŠã«å¿ããŠããŸããŸãªãšã³ããã€ã³ããšæ§æãæ¿å ¥ãããã£ããããã»ãšãã©ã®æ©èœãGraphQLRequestæ§é ã«çµã¿èŸŒãŸããŸããã
ãœãŒã¹
struct GraphQLRequest
{
string operationName;
string query;
JSONValue variables;
Config configuration;
JSONValue toJson()
{
return JSONValue([
"operationName": JSONValue(operationName),
"variables": variables,
"query": JSONValue(query),
]);
}
string toString()
{
return toJson().toPrettyString();
}
Response send()
{
auto request = Request();
request.addHeaders(["Authorization": configuration.get("token", "")]);
return request.post(
configuration.get("endpoint"),
toString(),
"application/json"
);
}
}
ããããã±ãã亀æã¹ããããã§ãã次ã®ã³ãŒãã¯èªèšŒãåŠçããŸãã
struct Session
{
Config configuration;
void login(string username, string password)
{
auto request = createSession(username, password);
auto response = request.send();
response.throwOnFailure();
string token = response.jsonBody
["data"].object
["createSession"].object
["token"].str;
configuration.put("token", token);
}
GraphQLRequest createSession(string username, string password)
{
enum query = import("createSession.graphql").lineSplitter().join("\n");
auto variables = SessionPayload(username, password).toJson();
return GraphQLRequest("createSession", query, variables, configuration);
}
}
struct SessionPayload
{
string email;
string password;
//todo : make this a template mixin or something
JSONValue toJson()
{
return JSONValue([
"email": JSONValue(email),
"password": JSONValue(password)
]);
}
string toString()
{
return toJson().toPrettyString();
}
}
ãã¿ãã¬æ³šæ-ç§ã¯ãããŸã§ãããè¡ã£ãããšããããŸããã
ãã¹ãŠã¯æ¬¡ã®ããã«è¡ãããŸããmainïŒïŒé¢æ°ã¯ãã³ãã³ãã©ã€ã³åŒæ°ããConfigæ§é ãäœæãããããSessionæ§é ã«æ¿å ¥ããŸããããã«ãããloginãlogoutãããã³statusã³ãã³ãã®æ©èœãå®è£ ãããŸãã createSessionïŒïŒã¡ãœããã¯ã察å¿ãã.graphqlãã¡ã€ã«ããå®éã®ã¯ãšãªãèªã¿åããããã«äŒŽã£ãŠå€æ°ãæž¡ãããšã«ãããgraphQLã¯ãšãªãäœæããŸããç§ã¯èªåã®ãœãŒã¹ã³ãŒããgraphQLã®çªç¶å€ç°ãšã¯ãšãªã§æ±æããããªãã£ãã®ã§ããããã.graphqlãã¡ã€ã«ã«ç§»åããã³ã³ãã€ã«æã«enumãšimportã䜿çšããŠã€ã³ããŒãããŸãããåŸè ã§ã¯ãstringImportPathsïŒããã©ã«ãã§ã¯view /ïŒãæãã³ã³ãã€ã©ãã©ã°ãå¿ èŠã§ãã
loginïŒïŒã¡ãœããã«é¢ããŠã¯ããã®å¯äžã®è²¬ä»»ã¯HTTPèŠæ±ãéä¿¡ããå¿çãåŠçããããšã§ãããã®å Žåãããã»ã©æ éã§ã¯ãããŸããããæœåšçãªãšã©ãŒãåŠçããŸãã次ã«ãããŒã¯ã³ãæ§æãã¡ã€ã«ã«æ ŒçŽããŸããããã¯ãå®éã«ã¯åªããJSONãªããžã§ã¯ãã«ãããŸããã
throwOnFailureã¡ãœããã¯ãã¯ãšãªã©ã€ãã©ãªã®ã³ã¢æ©èœã®äžéšã§ã¯ãããŸãããããã¯å®éã«ã¯ãããã€ãã®è¿ éã§æ±ããšã©ãŒåŠçãè¡ããã«ããŒé¢æ°ã§ãã
void throwOnFailure(Response response)
{
if(!response.isSuccessful || "errors" in response.jsonBody)
{
string[] errors = response.errors;
throw new RequestException(errors.join("\n"));
}
}
Dã¯UFCSããµããŒãããŠãããããthrowOnFailureïŒå¿çïŒæ§æã¯response.throwOnFailureïŒïŒãšããŠæžãçŽãããšãã§ããŸããããã«ãããsendïŒïŒãªã©ã®ä»ã®ã¡ãœããåŒã³åºãã«ç°¡åã«åã蟌ãããšãã§ããŸãããããžã§ã¯ãå šäœã§ãã®æ©èœã䜿ããããŠããå¯èœæ§ããããŸãã
ãšã©ãŒåŠç
Dã¯ããšã©ãŒåŠçã«é¢ããŠã¯äŸå€ãåªå ããŸããçè«çæ ¹æ ã¯ããã§è©³çŽ°ã«èª¬æãããŠããŸããç§ãæ°ã«å ¥ã£ãŠããããšã®1ã€ã¯ãæ瀺çã«æ¥ç¶ããªãéããæªåŠçã®ãšã©ãŒãæçµçã«ãããã¢ããããããšã§ããããããåçŽåããããšã©ãŒåŠçããéããããšãã§ããçç±ã§ããããšãã°ã次ã®è¡ã§ïŒ
string token = response.jsonBody
["data"].object
["createSession"].object
["token"].str;
configuration.put("token", token);
å¿çæ¬æã«ããŒã¯ã³ãŸãã¯ããã«ã€ãªãããªããžã§ã¯ããå«ãŸããŠããªãå ŽåãäŸå€ãã¹ããŒãããŸããããã¯ãã¡ã€ã³é¢æ°ã§ããã«ãããŠãŒã¶ãŒã®åã§ççºããŸãã Goã䜿çšããå Žåã¯ããã¹ãŠã®ã¹ãããã§ãšã©ãŒã«éåžžã«æ³šæããå¿ èŠããããŸãããããŠãççŽã«èšã£ãŠãé¢æ°ãåŒã³åºããããã³ã«errïŒ= Nullã®å Žåã«æžã蟌ãã®ã¯é¢åãªã®ã§ãåã«ãšã©ãŒãç¡èŠããããªãã§ãããããã ããGoã«ã€ããŠã®ç§ã®ç解ã¯åå§çã§ãããã³ã³ãã€ã©ããšã©ãŒãªã¿ãŒã³ã§äœãããªãããšã§ããªãã«å ããŠãé©ããªãã®ã§ãééã£ãŠããå Žåã¯é æ ®ãªãèšæ£ããŠãã ããã
å ã®ããã°æçš¿ã§èª¬æãããŠããéã³ãã¹ã¿ã€ã«ã®ãšã©ãŒåŠçã¯èå³æ·±ããã®ã§ããã Dæšæºã©ã€ãã©ãªã«ã¯ãã®ãããªãã®ã¯ãªããšæããŸããããµãŒãããŒãã£ã®ã©ã€ãã©ãªãšããŠå®è£ ããããšã«ã€ããŠã¯è°è«ããããŸããã
Webãœã±ãã
ãŠã©ããã³ãã³ãã®å®è£ ã«websocketã䜿çšããªãã£ãããšãç°¡åã«ææããããšæããŸããVibe.dã®websocketã¯ã©ã€ã¢ã³ãã䜿çšããããšããŸããããæ¥ç¶ãéãç¶ãããããããã·ã¥ãã©ãã¯ããã¯ãšã³ãã§ã¯æ©èœããŸããã§ãããçµå±ãç§ã¯ãããå«ãããŠããã«ããããããã埪ç°ããŒãªã³ã°ãæ¯æããŠãããæšãŠãŸãããã¯ã©ã€ã¢ã³ãã¯å¥ã®WebãµãŒããŒã§ãã¹ãããŠããåäœããŠããã®ã§ãå°æ¥ããã«æ»ãå¯èœæ§ããããŸãã
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³
CIã®å Žåãã¢ãŒãã£ãã¡ã¯ãã®æé©åããããã«ãã確å®ã«ããŠã³ããŒããããããã«ãéåžžã®ãã©ã³ããã«ããšãã¹ã¿ãŒãªãªãŒã¹ã®2ã€ã®ãã«ããžã§ããèšå®ããŸããã
çŽ åçã¯çµã¿ç«ãŠæéã瀺ããŠããŸããäŸåé¢ä¿ã®ããŒããèæ ®ã«å ¥ããŸããäŸåé¢ä¿ãªãã§åæ§ç¯ã4ç§
ã¡ã¢ãªæ¶è²»
å ã®ããã°æçš¿ã§èª¬æãããŠããããã«ã/ usr / bin / time -v ./hashtrack--listã³ãã³ãã䜿çšããŠã¡ã¢ãªäœ¿çšéã枬å®ããŸãããã¡ã¢ãªäœ¿çšéããŠãŒã¶ãŒããã©ããŒããŠããããã·ã¥ã¿ã°ã«äŸåãããã©ããã¯ããããŸããããdub build -breleaseã§ã³ã³ãã€ã«ãããDããã°ã©ã ã®çµæã¯æ¬¡ã®ãšããã§ãã
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ10036
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ10164
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ9940
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ10060
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ10008
æªããªããããã·ã¥ãã©ãã¯ãŠãŒã¶ãŒã§GoããŒãžã§ã³ãšRustããŒãžã§ã³ãå®è¡ãããšããã次ã®çµæãåŸ
ãããŸãããgobuild -ldflags "-s -w"ã§ãã«ããããGoïŒ
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ13684貚ç©ãã«ãã§ã³ã³ãã€ã«ãããé-ãªãªãŒã¹ïŒ
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ13820
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ13904
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ13796
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ13600
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ9224UpdïŒRedditãŠãŒã¶ãŒskocznymrocznyã¯ãLDCããã³GDCã³ã³ãã€ã©ãŒã®ãã¹ããæšå¥šããŸãããçµæã¯æ¬¡ã®
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ9192
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ9384
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ9132
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ9168
ãšããã§ããdubbuild-brelease --compiler = ldc2ã«ãã£ãŠã³ã³ãã€ã«ãããLDC1.22ïŒã«ã©ãŒåºåãšgetpassãè¿œå ããåŸïŒ
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ7816
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ7912
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ7804
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ7832
æ倧垞é§ã»ãããµã€ãºïŒkãã€ãïŒïŒ7804
Dã«ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããŸãããã¹ããŒããã€ã³ã¿ãŒãããã³æè¿ã§ã¯Rustã«è§Šçºãããå®éšçãªã¡ã¢ãªç®¡çæ¹æ³ããµããŒãããŠããŸãããããã®é¢æ°ãæšæºã©ã€ãã©ãªãšã©ã®çšåºŠçµ±åãããŠãããå®å šã«ã¯ããããªããããGCã«ã¡ã¢ãªãåŠçãããããšã«ããŸãããã³ãŒããæžããŠãããšãã«ã¡ã¢ãªæ¶è²»ã«ã€ããŠèããŠããªãã£ãããšãèãããšãçµæã¯ããªãè¯ããšæããŸãã
ãã€ããªãµã€ãº
Rust, cargo build --release: 7.0M
D, dub build -b release: 5.7M
D, dub build -b release --compiler=ldc2: 2.4M
Go, go build: 7.1M
Go, go build -ldflags "-s -w": 5.0M
.. â , , . Windows dub build -b release 2 x64 ( 1.5M x86-mscoff) , Rust Ubuntu18 - openssl, ,
Dã¯ããã®ãããªã³ãã³ãã©ã€ã³ããŒã«ãäœæããããã®ä¿¡é Œã§ããèšèªã ãšæããŸããæšæºã©ã€ãã©ãªã«ã¯å¿ èŠãªãã®ã®ã»ãšãã©ãå«ãŸããŠãããããå€éšã®äŸåé¢ä¿ã«ã¯ããŸãè¡ããŸããã§ãããã³ãã³ãã©ã€ã³åŒæ°ã®è§£æãJSONã®åŠçããŠããããã¹ããHTTPãªã¯ãšã¹ãã®éä¿¡ïŒcURLã䜿çšïŒãªã©ã¯ãã¹ãŠãæšæºã©ã€ãã©ãªã§å©çšã§ããŸããæšæºã©ã€ãã©ãªã«å¿ èŠãªãã®ããªãå Žåã¯ããµãŒãããŒãã£ã®ããã±ãŒãžãååšããŸããããã®é åã«ã¯ãŸã æ¹åã®äœå°ããããšæããŸããäžæ¹ãNIHã®èãæ¹ãããã§çºæãããŠããªãå ŽåããŸãã¯ãªãŒãã³ãœãŒã¹éçºè ãšããŠç°¡åã«åœ±é¿ãäžãããå Žåã¯ãééããªãDãšã³ã·ã¹ãã ã
æ°ã«å ¥ãã¯ãã§ããç§ãDã䜿çšããçç±
- ã¯ã