TresGrep æå/æ¹è¡/ã¤ã³ãã³ãä¸æ¬å¤ææ©è½
ãã£ããBlogä¸ã§ã®åç¥ãé ããªã£ã¦ãã¾ãã¾ããããTresGrepã®ã²ã¨ã¤åã®ãã¼ã¸ã§ã³ï¼Ver1.19-2919/10/16ï¼ä»¥éã§ãããã¹ããã¡ã¤ã«ã®æåã¨ã³ã³ã¼ãã£ã³ã°ã»æ¹è¡ã³ã¼ãã»ã¤ã³ãã³ãæåTab/Spaceã®ä¸æ¬å¤æãã§ããããã«ãªãã¾ããã
使ãæ¹
- ãã¡ã¤ã«ãæ¤ç´¢ããä¸è¦§ã«å¤æãããããã¹ããã¡ã¤ã«ã表示ãã¾ãã
â»æ¤ç´¢ã¢ã¼ãããæ¹è¡ã¤ã³ãã³ãæ¤æ»ãã«ãã¦ããã¨ãæ¹è¡ã»ã¤ã³ãã³ãããããããã¡ã¤ã«ããªããã調ã¹ã¦ããã¾ããã»ãã®æ¤ç´¢ã¢ã¼ãã§æ¤ç´¢ãã¦ããã¾ãã¾ããã
- ãã¡ã¤ã«ï¼ã¾ãã¯ãããç®æï¼ã¿ãã§å¤æããããã¡ã¤ã«ãé¸æãã¾ãã
â»Ctrlãã¼ãæ¼ããªãããã¡ã¤ã«ãé¸ã¶ã¨è¤æ°é¸æãShiftãã¼ãæ¼ããªããä¸è¦§ãé¸æããã¨ç¯å²é¸æã§ãã¾ãã - ä¸è¦§ãå³ã¯ãªãã¯ãããæåã»æ¹è¡ã³ã¼ãçå¤æãã®ãµãã¡ãã¥ã¼ãéããå®è¡ãããå¤ææ©è½ã®ã¡ãã¥ã¼ãã¯ãªãã¯ãã¾ãã
- ã¯ãªãã¯ããã¡ãã¥ã¼ã«å¿ãã以ä¸ã®ç»é¢ã表示ããã¾ãã
ããã
ããã
ããã
- ãããã®ç»é¢ããå¤æå¾ã®ã³ã¼ãçãæå®ãã¦ãå¤æå®è¡ããã¯ãªãã¯ããã¨ãå®éã«ãã¡ã¤ã«ãå¤æããã¾ãã
â»å¤æå¾ã®ãã¡ã¤ã«ä¸è¦§ç»é¢ã§ã¯ãæ´æ°ããããã¡ã¤ã«ã®è¡ãè²ä»ãã¨ãªããæåã»æ¹è¡ã»ã¤ã³ãã³ãã»ãã¡ã¤ã«æ´æ°æå»ãªã©ã®å¤æ´ç®æã太åã§è¡¨ç¤ºããã¾ãã
 ãã®ä»è£è¶³ç
å¤æåãã¡ã¤ã«ã®ããã¯ã¢ãããåããããªæ©è½ã¯ããã¾ãããå¿ è¦ã«å¿ãæåã§éé¿ãã¦ããããã«ãã¦ãã ããã
ãã¡ã¤ã«ä¸è¦§ã¿ãã§æåã³ã¼ãã»æ¹è¡ã»ã¤ã³ãã³ãã®ç¶æ ã確èªããªãããã¡ã¤ã«ãå¤æã§ããã®ãå°å³ã«ä¾¿å©ã§ãã
æ¹è¡ã³ã¼ãããããããªã£ã¦ããã¡ã¤ã«ã»ã¤ã³ãã³ããå¤ãªãã¡ã¤ã«ãªã©ããæ¹è¡ã¤ã³ãã³ãæ¤æ»ãã§æ¤ç´¢ãã¦ãããç®æã¿ããè¦ãã¨å ·ä½çãªå ´æã¾ã§ç¹å®ã§ãã¾ãã
Â
ãã®ä¸æ¬å¤ææ©è½ã§ãããå身ã½ããã®HNXgrepã§ããã¡ã¤ã«å½¢å¼å¤æãã¡ãã¥ã¼ã§æä¾ãã¦ããã«ããããããTresGrepã§æªæä¾ã®ã¾ã¾ã«ãªã£ã¦ããå¯ä¸ã«ãã¦ããæå³æéè¦ã®æ©è½ã§ãã¦ãä½è èªèº«ãæ¹è¡ã³ã¼ãçãå£ãã¦ãã¾ã£ããã¡ã¤ã«ã®å¾©æ§ã«ãã使ã£ã¦ãã¾ããã»ã»ã»ã»ã
TresGrepã§åçæ©è½ãå©ç¨ã§ããããã«ãªã£ãã®ã§ãHNXgrepã®å ¬éã«ã¤ãã¦ã¯ããããããï¼Windows7ã®ãµãã¼ãçµäºããããå¥æ©ã«ï¼çµäºã«ããããã¨èãã¦ããã¾ãã
Â
Dapperç¨ã¯ã¨ãªãã«ãå èµDBã¢ã¯ã»ã¹ã©ã¤ãã©ãªãDapperAidã
C#ç¨ã®æ¡å¼µã©ã¤ãã©ãªãGitHub/Nugetã§å
¬éãã¾ããã
github.com
www.nuget.org.NETFramework4.5以éã.NETCore2.0以éã.NETStandard2.0以éã«å¯¾å¿ãã¦ãã¾ãã
DBãã¼ãã«ã¨åãæ§é ã®ï¼Dapperåãã®ï¼POCOã¯ã©ã¹ãå®ç¾©ãã¦ããã¨ãã©ã¤ãã©ãªå èµã®ã¯ã¨ãªãã«ãã«ããé©åãªSelectã»Insertã»Updateã»Deleteçã®SQLãèªåçæãããã¡ã½ããå¼ã³åºãã ãã§SQLãè¨è¿°ãããã¨ãªãDBãã¼ã¿ãåç §æ´æ°ã§ããããã«ãªãã¾ãã
- åå¾/æ´æ°å¯¾è±¡ã®ãã¼ã¿ã¯ãPOCOãªãã¸ã§ã¯ãã®Keyé
ç®ã®å¤ãã¾ãã¯ãPOCOã¯ã©ã¹ã«å¯¾ããã©ã ãå¼ã§æå®ãã¾ãã
æå®ããå 容ããã¼ã¿åå¾/æ´æ°SQLã®Whereæ¡ä»¶å¼ã«å¤æããã¾ãã - å¿
è¦ãªç®æã ãææ¸ãã®SQLãæ··å¨ããããããªãã¨ãã§ãã¾ãã
ã©ã ãå¼ã§ã¯è¡¨ç¾ããããªãWhereæ¡ä»¶å¼ããµãã¯ã¨ãªãOrderByæ¡ä»¶ã»Offset/Limitæå®ãWithå¥ãDistinctæå®ããã¼ã¿æ´æ°æã®ã«ã©ã ããã©ã«ãå¤ããªã©ãæå®ã§ãã¾ãã - GroupByæå®ãä¼´ãéè¨ã¯ã¨ãªããè¤æ°ã®ãã¼ãã«ãjoinããçµæãåå¾ãããããªã¯ã¨ãªã«ã¤ãã¦ããåå¾ã«ã©ã ãFROMå¥ã®å 容ã®ã¿SQLãææ¸ãï¼POCOã¯ã©ã¹ã®å±æ§ã«è¨å®ï¼ãããã¨ã§ãã¡ã½ããå¼ã³åºãã§å®è¡å¯è½ã¨ãªãã¾ãã
- ã¯ã¨ãªãã«ããçæããSQLã®ç¢ºèªãªã©ã«å©ç¨ã§ããããã°åºåæ©è½ã¤ãã®DbConnectionãªãã¸ã§ã¯ããæä¾ãã¾ãã
- DBMSãã¨ã®ç¸éã«ããç¨åº¦å¯¾å¿ãã¦ãã¾ãã
ãã©ã¡ã¼ã¿ãã¼ã«ã¼ã»ã«ã©ã åçèå¥åã®ã¨ã¹ã±ã¼ãæ¹æ³ã»inæ¡ä»¶æå®ã»insertèªåæ¡çªå¤ææ¡æ¹æ³ããªã©ã«ã¤ãã¦ãDBMSæ¯ã®æ¹è¨ãèæ ®ããSQLãçæå®è¡ããã¾ãã
ç¾ç¶ã§ã¯PostgreSQLã»MySQLã»Oracleã»SQLServcerã»MS-Accessã»SQLCEã»SQLiteã»DB2ã«å¯¾å¿ãã¦ãã¾ãã
ã¾ãããããDapperåãã®DBæä½æ¯æ´ã©ã¤ãã©ãªã§ãããç¹ã«ä¸è¨2ã»3ãå®ç¾ã§ããããã«ã¡ãã£ã¨å·¥å¤«ãã¦ãã¾ãã
DBã¢ã¯ã»ã¹ã®SQLãæ¸ããã«ãã¼ã¿ã®åç
§æ´æ°ãè¡ããããããã©ãã©ããã¦ãSQLãææ¸ãããªããã°ãªããªãç®æã¯ãã³ãã¤ã³ãã§SQLãæ¸ãããï¼ãã®é¨å以å¤ã¯èªåçæãããSQLã«ä»»ãããï¼ã¨ããæ¹ã«åãã¦ããã©ã¤ãã©ãªãã¨æãã¾ãã
使ãæ¹ï¼ãªãã¡ã¬ã³ã¹ã¯GitHubã®ããããã¼ã¸ã«è¨è¼ãã¦ããã¾ãï¼ä¸éå端ã«è±èªã§ãããä¾ç¤ºãã¦ããã½ã¼ã¹ã³ã¼ããè¦ãã°ã ããããããã¨æãã¾ãï¼ããããããã°ã試ããã ããã
â»2019/4/13æç¹ã®ãã¼ã¸ã§ã³ã¯0.8.1ãåºæ¬æ©è½ãã²ã¨ã¨ããåããã¨ã¯ç¢ºèªãã¦ãã¾ãããDBMSãã¨ã®æå確èªãæ¡ä»¶å¼çã®ãã¾ãã¾ãªããªã¨ã¼ã·ã§ã³ã®åä½ç¢ºèªã¯ã¾ã ä¸ååãªç¶æ
ã§ãã
ä¸å
·åçãè¦ã¤ããæ¹ã¯GitHubã®Issueããã®ããã°ã¸ã®ã³ã¡ã³ãã§å ±åããã ããã¨å¤§å¤å©ããã¾ãã
ãgitignore対象ãSkipããã£ã«ã¿æ©è½è¿½å
TresGrep Ver.1.13ã«ã¦ã.gitignoreã«ããGit管çå¤ã¨ãããã¡ã¤ã«çãæ¤ç´¢å¯¾è±¡å¤ã¨ãããgitignore対象ãSkipããã£ã«ã¿ã追å ãã¾ããã
Gitãã¤ã³ã¹ãã¼ã«ãã¦éçºä½æ¥çãè¡ã£ã¦ããæ¹åãã®æ©è½ã§ããgitignoreã®è¨å®ããã£ãããã¦ããã°ãéçºè¨èªï¼éçºç°å¢ãªã©ã«å¿ãããã£ã«ã¿ããã¡ãã¡ä½ããã¨ããå¿
è¦ãªãã¡ã¤ã«ã ããæ¤ç´¢ã§ããããã«ãªãã¯ãã§ãã
2019/02/06(æ°´)ä»ã§Vectorã©ã¤ãã©ãªã«åæ ããããã¦ã³ãã¼ãã§ããããã«ãªãäºå®ã§ãã
gitignore対象å¤å®ã®ã½ã¼ã¹ã³ã¼ãï¼ãªã¢ã«ã¿ã¤ã æ¤ç´¢æã®å¶ç´ã«ã¤ãã¦
gitignore対象ãå¦ãã®å¤å®ã®ã½ã¼ã¹ã³ã¼ããï¼ä¸é¨Blogæ²è¼ç¨ã«æç´ãããããã§ï¼å
¬éãã¾ãã
å¤å®ã«ã¯ãgit check-ignoreãã³ãã³ããå©ç¨ãã¦ãã¾ãããTresGrepでgitignore指定ファイルを検索対象外 - hnx8のブログããC#で特定フォルダ内のgitignore対象ではないファイル/サブフォルダを一括で取得する - hnx8のブログãã§ç´¹ä»ããã½ã¼ã¹ã³ã¼ãããã¼ã¹ã¨ãã¦ãã¾ãããTresGrepã®ãããªGrepãã¼ã«ã«çµã¿è¾¼ãã«ããã£ã¦ã¯git check-ignoreã³ãã³ãã®å®è¡æè¦æéããããããã¦å®ç¨ã«èããªãã£ãããã以ä¸ã®ãããªã½ã¼ã¹ã³ã¼ãã§gitignoreå¤å®çµæããã£ãã·ã¥ããããã«å®è£
ãã¦ããã¾ããï¼ååæ¤ç´¢æã¯ã©ããã¦ãé
ããªã£ã¦ãã¾ãã¾ããããã£ããæ¤ç´¢å®è¡ããå¾ã®ãªã¢ã«ã¿ã¤ã æ¤ç´¢ã§ã¯ãã£ãã·ã¥ããã¨ã«gitignoreå¤å®ãè¡ãã®ã§é常éãã®æ¤ç´¢ããã©ã¼ãã³ã¹ãå¾ããã¾ãï¼
ããªã¢ã«ã¿ã¤ã æ¤ç´¢ãONã§å³ææ¤ç´¢ãã¦ããå ´åã¯ã.gitignoreãã¡ã¤ã«ã®æ¸ãæããªã©ã«ããç¡è¦ãã¹ããã¡ã¤ã«ã®ç¯å²ãå¤ãã£ã¦ããTresGrepã®æ¤ç´¢çµæã«ã¯ãã ã¡ã¯åæ ããã¾ããã
(1) ãæ¤ç´¢å®è¡ããã¿ã³ãã¯ãªãã¯ãã¦æ示çã«æ¤ç´¢ãããç´ã
(2) ãã£ã«ã¿ãgitignore対象ãSkipããé¸æããªãã
(3) TresGrepãä¸å®æéï¼ï¼åï¼ãªã«ãæä½ããæ¾ç½®ãããâVer1.15(2019.06.07)ã§åããã
(4) TresGrepããã£ããçµäºã»åèµ·åãã
ã®ããããã®æä½ãè¡ãã¨ãææ°ã®.gitignoreã®è¨å®ãTresGrepã«ãåæ ããã¾ãã
/// <summary> /// C#ã§ç¹å®ã®ãã¡ã¤ã«/ãã©ã«ãã.gitignore対象ã¨ãªã£ã¦ãããå¤å®ï¼å¤å®çµæãã£ãã·ã¥ããï¼ /// </summary> class GitIgnoreChecker { /// <summary> /// å¼æ°ã§æå®ããããã¡ã¤ã«/ãã£ã¬ã¯ããªãgitignore対象ãªãtrueãè¿ãã¾ãã /// </summary> /// <param name="fsi">調ã¹ã対象ã®ãã¡ã¤ã«/ãã£ã¬ã¯ããª</param> /// <returns>gitignore対象ãªãtrue</returns> public bool IsGitignored(FileSystemInfo fsi) { // ä¸å®æé(æ¢å®ã§ã¯ï¼å)çµéããã調æ»çµæã®ãã£ãã·ã¥ãåæåããªãã DateTime now = DateTime.Now; if (now - LastAccessTime > TimeSpan.FromMinutes(GitIgnore_CacheExpireMinutes)) { ClearCache(); } LastAccessTime = now; // æ¢ç´¢å¯¾è±¡ãã£ã¬ã¯ããªãææ¡ string dirName = Path.GetDirectoryName(fsi.FullName); if (dirName == null) { // ãã ãC:\ãªã©ã®ã«ã¼ããã£ã¬ã¯ããªã¯GetDirectoryName()çµæãnullã¨ãªããgitignore対象ã§ã¯ãªãã¨ã¿ãªã return false; } // ãã®ãã£ã¬ã¯ããªã®GitIgnore対象æ å ±ãææ¡(â»ãã£ã¬ã¯ããªåã®Keyã¯ãã¹ã¦å°æåã¨ãã¦ãã) Dictionary<string, bool> gitignoreMap; if (!CacheMap.TryGetValue(dirName.ToLower(), out gitignoreMap) || (gitignoreMap != null && !gitignoreMap.ContainsKey(fsi.Name))) { // ååºã®ãã£ã¬ã¯ã㪠or ãã£ãã·ã¥ã«ãã®ãã¡ã¤ã«ã®gitignoreæ å ±ããªãã£ãå ´åã¯ãMapãçæãã¦ä¿å gitignoreMap = CreateGitignoreMap(dirName); CacheMap[dirName.ToLower()] = gitignoreMap; } // gitignore対象ãªãtrueãè¿ã bool ignored; return (gitignoreMap != null && gitignoreMap.TryGetValue(fsi.Name, out ignored) && ignored); } /// <summary>gitignoreå¤å®ã«ä½¿ç¨ããgit.exeã®ãã«ãã¹</summary> /// <remarks>ä»®ã«ç´å¤ã¨ãã¦ãããgitã¤ã³ã¹ãã¼ã«å ã«å¿ããå¤ãè¨å®ãããã¨ã</remarks> public static string GitExe_Path = @"C:\Program Files\Git\cmd\git.exe"; /// <summary>gitignoreå¤å®çµæãã£ãã·ã¥ã®æå¹æé</summary> /// <remarks>ä»®ã«ç´å¤ã¨ãã¦ãããé©åãªå¤ãè¨å®ãããã¨ã</remarks> public static int GitIgnore_CacheExpireMinutes = 180; /// <summary>ç´åã«IsGitignored()ã¡ã½ãããå¼ã³åºãããéã®æå»</summary> /// <remarks>CacheMapãä¸å®æéçµéå¾ã«ã¯ãªã¢ãããã使ç¨</remarks> private DateTime LastAccessTime = DateTime.MinValue; /// <summary> /// åãã£ã¬ã¯ããªã®gitignore対象調æ»çµæããã£ãã·ã¥ããããã®Map /// ï¼key=親ãã£ã¬ã¯ããªå(ãã«ãã¹,ãã¹ã¦å°æå)ãvalue=ï¼key=ãã¡ã¤ã«å,value=gitignore対象ãå¦ãã表ãMapï¼ï¼ /// </summary> /// <remarks>ä¸å®æéçµéå¾ã«ã¯ãªã¢ããã</remarks> private ConcurrentDictionary<string, Dictionary<string, bool>> CacheMap; /// <summary> /// åãã£ã¬ã¯ããªã®gitignore対象調æ»çµæããã£ãã·ã¥ããããã®Mapãåæåã¯ãªã¢ãã¾ãã /// </summary> public void ClearCache() { CacheMap = new ConcurrentDictionary<string, Dictionary<string, bool>>(); } /// <summary> /// ãã®ãã£ã¬ã¯ããªå ã®å ¨ãã¡ã¤ã«/ãµããã£ã¬ã¯ããªã«ã¤ãã¦gitignore対象ã§ãããå¦ãã調ã¹ãMapã«ãã¦è¿ãã¾ãã /// </summary> /// <param name="dirName">ãã£ã¬ã¯ããªåãã«ãã¹</param> /// <returns> /// key=ãã¹ãªããã¡ã¤ã«å/ãµããã£ã¬ã¯ããªåãvalue=gitignore対象ãªãtrue/å¦ãªãfalseãã®Mapã /// ãã ããã®ãã£ã¬ã¯ããªãgit管çå¤çã§gitignore対象ãå¦ããææ¡ã§ããªãã£ãå ´åã¯ãMapã®ãããã«nullãè¿ãã¾ãã /// </returns> private Dictionary<string, bool> CreateGitignoreMap(string dirName) { // ãã®ãã£ã¬ã¯ããªå ã®å ¨ã¨ã³ããªãã親ãã¹ãªãã«ãã¦listã«ã¤ãã List<string> entries = new List<string>(); foreach (string path in Directory.GetFileSystemEntries(dirName)) { entries.Add(Path.GetFileName(path)); } // git check-ignoreã³ãã³ãã§gitignore対象ã¨ãªã£ã¦ãããã¡ã¤ã«çã調ã¹ãã対象ã¯stdinããæå® ProcessStartInfo psInfo = new ProcessStartInfo(GitExe_Path, "check-ignore --stdin") { CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, WorkingDirectory = dirName, }; using (Process p = Process.Start(psInfo)) { // stdoutããç¡è¦ãã¹ããã¡ã¤ã«ã®ä¸è¦§ãOutputDataReceivedã¤ãã³ãã§åãåããããã«ããlistã«èç©ãã List<string> ignoredNames = new List<string>(); p.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { ignoredNames.Add(e.Data); } }; p.BeginOutputReadLine(); // 調ã¹ã対象ã®ãã¡ã¤ã«ããã¹ã¦stdinã§å¼ã渡ãï¼gitignore対象ãªãstdoutã«ãã®ãã¡ã¤ã«åãåºåãããï¼ using (StreamWriter sw = p.StandardInput) { foreach (string entry in entries) { sw.Write(entry + "\n"); } } // ã³ãã³ãå®è¡çµäºã¾ã§å¾ ã¡ãææªã§ã10ç§ã§å¼·å¶çµäº if (!p.WaitForExit(10000)) { p.Kill(); } p.CancelOutputRead(); // æ»ãå¤ãæ±ºå® if (p.ExitCode <= 1) { // gitã³ãã³ãæå Dictionary<string, bool> ret = new Dictionary<string, bool>(); foreach (string entry in entries) { // â»ãªãã.gitãã£ã¬ã¯ããªã¯check-ignoreã³ãã³ãã§ã¯gitignore対象ã«ã¯å«ã¾ãã¦ããªãããç¡è¦ãããã£ã¬ã¯ããªã§ããã¨ã¿ãªãã ret[entry] = (ignoredNames.Contains(entry) || entry == ".git"); } return ret; } else { // gitã³ãã³ã失æãgit管çå¤ã®ãã©ã«ãã§ããã¨ã¿ãªã return null; } } } }
ã½ã¼ã¹ã³ã¼ãã®å©ç¨ã»æ¹å¤ã»ç§»æ¤ã¯ãèªç±ã«ã©ããã
ã¾ãã©ãªãããWinMerge ã§gitignoreæå®ãã¡ã¤ã«ãæ¯è¼å¯¾è±¡å¤ã«ãããããªãã©ã°ã¤ã³ãä½ããæ¹ããããï¼ãããããããªãã©ã°ã¤ã³ãä½ããã®ãã©ãã調ã¹ã¦ããã¾ãããï¼ããã²ã¨ãä½ã£ã¦å
¬éãã¦ããã ããã°ã¨ãæãã¾ãã
C#ã§ç¹å®ãã©ã«ãå ã®gitignore対象ã§ã¯ãªããã¡ã¤ã«/ãµããã©ã«ããä¸æ¬ã§åå¾ãã
ååã®è¨äºãC#で特定のファイルorフォルダがgitignore対象かを判定する(単一ファイル編) - hnx8のブログãã§ã¯åä¸ã®ãã¡ã¤ã«/ãã©ã«ããgitignore対象ãã©ããã調ã¹ãæ¹æ³ãç´¹ä»ãã¾ããã
git check-ignore ã³ãã³ãã§ã¯ã³ãã³ããã©ã¡ã¼ã¿æå®ã§è¤æ°ã®ãã¡ã¤ã«çãæå®ãã¦gitignore対象ã«ãªã£ã¦ããããã¾ã¨ãã¦èª¿ã¹ããã¨ãã§ããã®ã§ãç¹å®ãã£ã¬ã¯ããªå
ã®å
¨ãã¡ã¤ã«/ãµããã©ã«ããgitignore対象ãã©ãããä¸æ¬ã§å¤å®ãããããªã¡ã½ããã«ãã¦ã¿ã¾ãããã
git check-ignoreコマンドの実行結果 ã§ãããæå®ãããã¡ã¤ã«/ãã©ã«ãã®ãã¡gitignore対象ã ã£ããã®ã«ã¤ãã¦ãã¹åãæ¨æºåºåã¸ã¨åºåãããããã«ãªã£ã¦ãããæ¨æºåºåã«å«ã¾ãã¦ãããã©ã«ã/ãã¡ã¤ã«ãgitignore対象ã ã¨å¤å®ãããã¨ãã§ãã¾ãã
ã¾ãã調ã¹ãããã¡ã¤ã«/ãã©ã«ãã¯ã--stdinããªãã·ã§ã³ãæå®ãããã¨ã§æ¨æºå
¥åãã(\nåºåãã§)ã¾ã¨ãã¦æå®ãããã¨ãã§ãã¾ãã
ä»åã¯ï¼å¯¾è±¡ãã¹æ°ãå¤ãããå ´åã«ã³ãã³ããã©ã¡ã¼ã¿ã®åæ°ä¸éã«å¼ã£ãããå¯è½æ§ãããã®ã§ï¼ã--stdinãã§å¯¾è±¡ãæå®ããæ¨æºåºåã¸ã®åºåçµæã¯OutputDataReceived ã¤ãã³ãã§é次åãåãããããããã§ã½ã¼ã¹ã³ã¼ããæ¸ããã¨ã«ãã¾ãã
DirectoryInfoã«å¯¾ããæ¡å¼µã¡ã½ããã¨ãã¦å®ç¾©ãã¦ã¿ã¾ããã
DirectoryInfo.GetFiles() ã DirectoryInfo.EnumerateFiles() ãªã©ã¨åããããªè¦é ã§å©ç¨ã§ãã¾ãã
/// <summary> /// C#ã§.gitignore対象ã¨ãªã£ã¦ããªããã¡ã¤ã«çã®ä¸è¦§ãåå¾ããããã®æ¡å¼µã¡ã½ãã /// </summary> static class GitIgnoreExtension { /// <summary>gitignoreå¤å®ã«ä½¿ç¨ããgit.exeã®ãã«ãã¹</summary> /// <remarks>ä»®ã«ç´å¤ã¨ãã¦ãããgitã¤ã³ã¹ãã¼ã«å ã«å¿ããå¤ãè¨å®ãããã¨ã</remarks> public static string GitExe_Path = @"C:\Program Files\Git\cmd\git.exe"; /// <summary> /// ãã®ãã£ã¬ã¯ããªç´ä¸ã§.gitignore対象ã«æå®ããã¦ããªããã¡ã¤ã«ã®ä¸è¦§ãè¿ãã¾ãã /// </summary> /// <param name="dir">ãã£ã¬ã¯ããª</param> /// <param name="searchPattern">æ¤ç´¢ãã¿ã¼ã³ã æ¢å®ã®ãã¿ã¼ã³ã¯ "*" ã§ããã¹ã¦ã®ãã¡ã¤ã«ãè¿ããã¾ãã</param> /// <returns>searchPattern ã«ä¸è´ãããã¡ã¤ã«ã®ä¸è¦§ã</returns> public static FileInfo[] GetNotIgnoredFiles(this DirectoryInfo dir, string searchPattern = "*") { return EnumerateNotIgnoredFiles(dir, searchPattern).ToArray(); } /// <summary> /// ãã®ãã£ã¬ã¯ããªç´ä¸ã§.gitignore対象ã«æå®ããã¦ããªããã¡ã¤ã«ãåæãã¾ãã /// </summary> /// <param name="dir">ãã£ã¬ã¯ããª</param> /// <param name="searchPattern">æ¤ç´¢ãã¿ã¼ã³ã æ¢å®ã®ãã¿ã¼ã³ã¯ "*" ã§ããã¹ã¦ã®ãã¡ã¤ã«ãè¿ããã¾ãã</param> /// <returns>searchPattern ã«ä¸è´ãããã¡ã¤ã«ã®åæã</returns> public static IEnumerable<FileInfo> EnumerateNotIgnoredFiles(this DirectoryInfo dir, string searchPattern = "*") { return EnumerateNotIgnoredFiles(dir, dir.GetFiles(searchPattern)); } /// <summary> /// ãã®ãã£ã¬ã¯ããªç´ä¸ã§.gitignore対象ã«æå®ããã¦ããªããµããã£ã¬ã¯ããªãåæãã¾ãã /// </summary> /// <param name="dir">ãã£ã¬ã¯ããª</param> /// <param name="searchPattern">æ¤ç´¢ãã¿ã¼ã³ã æ¢å®ã®ãã¿ã¼ã³ã¯ "*" ã§ããã¹ã¦ã®ãã£ã¬ã¯ããªãè¿ããã¾ãã</param> /// <returns>searchPattern ã«ä¸è´ãããã£ã¬ã¯ããªã®åæã</returns> public static IEnumerable<DirectoryInfo> EnumerateNotIgnoredDirectories(this DirectoryInfo dir, string searchPattern = "*") { return EnumerateNotIgnoredFiles(dir, dir.GetDirectories(searchPattern)); } /// <summary> /// ãã®ãã£ã¬ã¯ããªç´ä¸ã§.gitignore対象ã«æå®ããã¦ããªããã¡ã¤ã«ããã³ãã£ã¬ã¯ããªãåæãã¾ãã /// </summary> /// <param name="dir">ãã£ã¬ã¯ããª</param> /// <param name="searchPattern">æ¤ç´¢ãã¿ã¼ã³ã æ¢å®ã®ãã¿ã¼ã³ã¯ "*" ã§ããã¹ã¦ã®ãã¡ã¤ã«ããã³ãã£ã¬ã¯ããªãè¿ããã¾ãã</param> /// <returns>searchPattern ã«ä¸è´ãããã¡ã¤ã«ããã³ãã£ã¬ã¯ããªã®åæã</returns> public static IEnumerable<FileSystemInfo> EnumerateNotIgnoredFileSystemInfos(this DirectoryInfo dir, string searchPattern = "*") { return EnumerateNotIgnoredFiles(dir, dir.GetFileSystemInfos(searchPattern)); } /// <summary> /// (private)å¼æ°ã§æå®ããããã£ã¬ã¯ããªå ã®ãã¡ã¤ã«çã®ãã¡ã.gitignore対象ã«ãªã£ã¦ããªããã®ãåæãã¾ãã /// </summary> /// <typeparam name="T">FileInfo/DirectoryInfo/FileSystemInfoã®ãããã</typeparam> /// <param name="dir">ãã£ã¬ã¯ããª</param> /// <param name="items">調ã¹ã対象ã®ãã¡ã¤ã«ç</param> /// <returns>.gitignore対象ã«ãªã£ã¦ããªããã¡ã¤ã«çã®åæ</returns> private static IEnumerable<T> EnumerateNotIgnoredFiles<T>(DirectoryInfo dir, IList<T> files) where T : FileSystemInfo { // git check-ignoreã³ãã³ãã§gitignore対象ã¨ãªã£ã¦ãããã¡ã¤ã«çã調ã¹ãã対象ã¯stdinããæå® ProcessStartInfo psInfo = new ProcessStartInfo(GitExe_Path, "check-ignore --stdin") { CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, WorkingDirectory = dir.FullName, }; using (Process p = Process.Start(psInfo)) { // stdoutããç¡è¦ãã¹ããã¡ã¤ã«ã®ä¸è¦§ãOutputDataReceivedã¤ãã³ãã§åãåã£ã¦listã«èç© List<string> ignoredNames = new List<string>(); p.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { ignoredNames.Add(e.Data); } }; p.BeginOutputReadLine(); // 調ã¹ã対象ã®ãã¡ã¤ã«ããã¹ã¦stdinã§å¼ã渡ã using (StreamWriter sw = p.StandardInput) { foreach (T fi in files) { sw.Write(fi.Name + "\n"); } } // ã³ãã³ãå®è¡çµäºã¾ã§å¾ ã¡ãææªã§ã10ç§ã§å¼·å¶çµäº if (!p.WaitForExit(10000)) { p.Kill(); } p.CancelOutputRead(); // ç¡è¦ãã¹ããã¡ã¤ã«ã®ä¸è¦§ã«å«ã¾ãã¦ããªããã®ãåæãã¦è¿ã foreach (T fi in files) { // â»git管çå¤ã®ãã£ã¬ã¯ããªçã§æ»ãå¤ã0ã§ã1ã§ããªãå ´åããç¡è¦ãã¹ããã¡ã¤ã«ã¨ã¯ã¿ãªããªã if ((!ignoredNames.Contains(fi.Name) && fi.Name != ".git") || p.ExitCode > 1) { yield return fi; } } } } }
æ°ã«ãªã git check-ignore ã³ãã³ãã®å®è¡æè¦æéã§ããã調ã¹ã対象ã®ãã¡ã¤ã«/ãã©ã«ãæ°ã«ãããããä¸å®ã®ããã§ãèªåã®ç°å¢ã§ã¯ã³ãã³ãå®è¡ï¼åãããããããæ°åmSecç¨åº¦ã¨ãªãã¾ããã
TresGrepã§gitignoreæå®ãã¡ã¤ã«ãæ¤ç´¢å¯¾è±¡å¤
C#ã§ç¹å®ã®ãã¡ã¤ã«ãgitignore対象ããå¤å®ããã®å®è£ ãTresGrepã«ãåãè¾¼ãã§ãçµã¿è¾¼ã¿ãã£ã«ã¿ã¨ãã¦ä½¿ç¨ã§ããããæ©è½è¿½å ã試ã¿ã¦ã¿ã¾ããã
ç»é¢è¡¨ç¤ºããããã¼ã«ãã³ãã®ã¨ããããã£ã«ã¿ãgitignore対象ãSkipããé¸æããã¨ãgitignoreã§ç¡è¦ããããã«è¨å®ããã¦ãããã¡ã¤ã«çã¯TresGrepã§ã®æ¤ç´¢å¯¾è±¡å¤ã¨ãªãã¾ãã
ããããã©ã¼ãã³ã¹ãè³ããããã¾ãããHDDç°å¢ã§1ç§éã«20ï½50ãã¡ã¤ã«ãããããå¦çã§ãããå®ç¨ã«èããªããªã£ã¦ãã¾ãã¾ããã»ã»ã»ã
ä»ã®ã¾ã¾ã ã¨ãã®æ©è½ã¯ãªãªã¼ã¹ã§ããªãã®ã§ãããã©ã¼ãã³ã¹æ¹åã§ããªãããã°ãã試è¡é¯èª¤ãã¦ã¿ããã¨ã«ãã¾ãã
â2019.02.02追è¨ï¼æ¹åã®ããæ£å¼æ©è½è¿½å ãã¾ããã
ããgitignore対象ãSkipããã£ã«ã¿æ©è½è¿½å - hnx8ã®ããã°
C#ã§ç¹å®ã®ãã¡ã¤ã«orãã©ã«ããgitignore対象ããå¤å®ãã(åä¸ãã¡ã¤ã«ç·¨)
C#ã¨ãããã»ã¨ãã©gitã³ãã³ãã®tipsã«ãªã£ã¦ãã¾ãã¾ãããç¹å®ã®ãã¡ã¤ã«/ãã©ã«ãã.gitignoreãã¡ã¤ã«ã«ããgit管ç対象å¤ã«ãªã£ã¦ãããã©ããã¯ããgit check-ignoreãã³ãã³ããå©ç¨ãã¦ä»¥ä¸ã®ãããªã½ã¼ã¹ã³ã¼ãã§èª¿ã¹ããã¨ãã§ãã¾ãã
string GitExePath = @"C:\Program Files\Git\cmd\git.exe"; /// <summary> /// git check-ignoreã³ãã³ãã§gitignore対象ã¨ãªã£ã¦ãããå¦ãã調ã¹ã /// </summary> /// <param name="fsi">調ã¹ã対象ã®ãã¡ã¤ã«(FileInfo)ã¾ãã¯ãã©ã«ã(DirectoryInfo)</param> /// <returns>trueï¼gitignoreæå®ãããfalseï¼gitignoreæå®ãªããnullï¼ããããgit管çå¤</returns> bool? IsGitIgnored(FileSystemInfo fsi) { ProcessStartInfo psInfo = new ProcessStartInfo(GitExePath); psInfo.Arguments = "check-ignore -q \"" + fsi.FullName + "\""; psInfo.CreateNoWindow = true; psInfo.UseShellExecute = false; psInfo.WorkingDirectory = (fsi is FileInfo ? (fsi as FileInfo).DirectoryName : fsi.FullName); using (Process p = Process.Start(psInfo)) { p.WaitForExit(); if (p.ExitCode == 0) { return true; // gitignore対象 } if (p.ExitCode == 1) { return false; // gitignore対象ã§ã¯ãªã } if (p.ExitCode == 128) { return null; // ããããgit管çå¤ã ã£ããç } // gitã³ãã³ãã®å¼ã³åºãã«å¤±æããå ´åãªã©ã¯çµäºã³ã¼ããããã«å¥(9009ãªã©)ã«ãªã throw new Exception(); };
git check-ignoreã³ãã³ãã¯ã«ã¬ã³ããã£ã¬ã¯ããªãgit管çä¸ã®ãã£ã¬ã¯ããªã«ãªã£ã¦ããªãã¨ãfatal: not a git repository (or any of the parent directories)ãã¨ã¨ã©ã¼ã«ãªã£ã¦ãã¾ãã®ã§ãWorkingDirectoryï¼Processå®è¡æã®ã«ã¬ã³ããã£ã¬ã¯ããªï¼ãæå®ãã¦å®è¡ããããã«ãã¦ãã¾ãã
ãªããgit check-ignoreã³ãã³ãã¯å®è¡çµæãè¿ã£ã¦ããã¾ã§ããªãå¾
ãããã¾ãï¼1åã®ã³ãã³ãå®è¡ã«ããããæ°åmSecç¨åº¦ãããã¾ãï¼ã
調ã¹ãããã¡ã¤ã«ã®æ°ãå°ãªããã°ãã®ã½ã¼ã¹ã®ããæ¹ã§ãå®ç¨ä¸ã®åé¡ã¯ãªãã§ããããããã¨ãã°ç¹å®ã®ãã£ã¬ã¯ããªå
ã®å
¨ãã¡ã¤ã«/ãµããã£ã¬ã¯ããªã®å
容ãä¸æ¬ã§èª¿ã¹ãã®ã§ããã° 別のアプローチ ãã¨ãã»ããããã§ãããã
â2019/02/02追è¨ï¼ç¶ãã®è¨äºãC#で特定フォルダ内のgitignore対象ではないファイル/サブフォルダを一括で取得する - hnx8のブログããæ¸ãã¾ããã
â2019/02/02追è¨ï¼ åä¸ãã¡ã¤ã«ã®gitignoreå¤å®å¦çãæ¹åããTresGrepã«çµã¿è¾¼ã¿ã¾ãããã「gitignore対象をSkip」フィルタ機能追加 - hnx8のブログãã«ã¦ã½ã¼ã¹ã³ã¼ãä¾ãå
¬éãã¦ãã¾ãã
ThinkPad A485 è³¼å ¥
æã¡éã³ã§ãã¦ããããã¹ããã¯ã®ããPCã欲ãããªããæ°ãã«ThinkPad A485ãè³¼å ¥ãã¦ãã¾ãã¾ããã
 ã¾ã åºæ¬çãªã»ããã¢ããããããããã¦ãã¾ããããç¾ç¨PCã¨ããã¹ã¦ãã¾ãã«ãå¿«é©ã«ãªã£ãã®ã§å¢ãã§ç°¡æã¬ãã¥ã¼ã®ãããªã¡ã¢è¨äºãèµ·ããã¦ã¿ã¾ããÂ
ï¼è³¼å ¥ããPCã®æ§æï¼
ããã»ããµ | AMD Ryzen5 PRO 2500U - AMD Radeon Vega8ã°ã©ãã£ãã¯ã¹ |
---|---|
液æ¶ã¢ãã¿ | 1920x1080 FHD 14.0åIPSæ¶²æ¶ |
ã¹ãã¬ã¼ã¸ | Intel 2.5inch SATA SSD 180GB / (2ndãã©ã¤ããªã) |
ã¡ã¢ãª | 8GB x1 / (2ã¹ãããç®ã¯ç©ºã) |
ããã¤ã¹ | ããã¯ã©ã¤ãä»ãæ¥æ¬èªãã¼ãã¼ããæç´ã»ã³ãµã¼ãããã«ã¡ã©ããï¼WWANã»ã¹ãã¼ãã«ã¼ããªã¼ãã¯ãªãï¼ |
é»æºé¡ | å èµ3+èé¢å¤ä»3ã»ã«ããããªã¼ã45W USB Type-C ACã¢ããã¿ |
ãã®ä»I/F | USB Type-C x 2ãUSB3.0 x 2ãHDMIãæç·LANãã¼ããWiFi/Bluetoothãã¤ã¤ãã³/ãã¤ã¯ã¸ã£ãã¯ãSDã«ã¼ããªã¼ãã¼ |
OS | Windows10ï¼ããªã¤ã³ã¹ãã¼ã«ã¯Homeâèªåã§Proãã¯ãªã¼ã³ã¤ã³ã¹ãã¼ã« |
AMD製CPUæè¼ãã·ã³ã¯åãã¦ã®è³¼å ¥ã§ããIntelCPUã®ãã°ï¼ãã°å¯¾çã«ä¼´ãããã©ã¼ãã³ã¹æªåï¼ããã°ããåã¾ããªããã«ãè¦ããã¾ãRyzenã®æ§è½/ä¾¡æ ¼ã®è©å¤ãèãã¦è©¦ãã¦ã¿ãããªãã¾ããã
èªåã注æããã¨ãã¯Lenovoç´è²©ã¿ã¤ã ã»ã¼ã«55%å¼ãã§ï¿¥78,732ã§ãããæ ¼å®ã§ããï¼ã¨æ¸ããã¨æã£ãããä¾¡æ ¼comã¢ãã«ãã«ã¹ã¿ãã¤ãºãã2ndãã©ã¤ããªãã«ããã¨ãã£ã¨å®ããªãã¾ããã»ã»ã»12/2æç¹ã§ã¯SSDã§ãªãHDDæè¼ã¢ãã«ã§è¯ããã°6ä¸åå°ã§è²·ããããã§ãï¼
ï¼å°çã»ã»ããã¢ããæç¹ã§ã®ææ³ï¼
â»å人ã®ææ³ã§ããåºæ¬çã«ç¾ç¨PCï¼2013å¹´è³¼å ¥ã®ThinkPad E430cï¼1366x768ã®TN液æ¶ã»HDDã»ã¡ã¢ãª4GBï¼ã¨ã®æ¯è¼ã«ãªã£ã¦ãã¾ãã®ã§çµ¶è³Onlyã«ãªãã¾ããããããåèã«ãªãã¾ããã
- ThinkPadä¸ä¸ä½æ©ç¨®ã®T480ã¨åçã®çä½ã使ã£ã¦ãã ããã£ã¦è³ªæãããã§ããå»ä¾¡çã®E430cã ã¨ã¡ãã£ã¨å®ã£ã½ããã©ã¹ããã¯ï¼ã ã£ãã®ã§ãããA485ã®ã¯è¦ãç®ããããå¿å°ãããã強度ããã£ãããã¦ããæãã§ãã
- ãã¼ãã¼ãã®æã¡ãããã»ãã©ãã¯ãã¤ã³ãã¯ThinkPadãªãã§ã¯ããããE430cã®ãã®ããï¼ã©ã³ã¯ä¸ãªã®ãããã¨ãE430cã®çµå¹´å£åãªã®ãããã¼æä½é³ã極ãã¦éããæéµæãï¼ã¡ãã£ã¨è»½ããªæ°ããã¾ããï¼ã¸ããªå¤ä»ããã¼ãã¼ããããã£ã½ã©è¯ãã§ããMacBookProã¿ãããªãããããã¼ãã¼ãï¼TouchBarã¿ãããªã¯ã½ãã¨æ¯ã¹ãã¨é²æ³¥ã®å·®ã
ããã¯ã©ã¤ãä»ããã¼ãã¼ããé¸ãã ããããCAPSLOCKãFNLOCKã®LEDã©ã³ããè¦èªã§ããã®ãâã§ãã - æç´èªè¨¼ãè¶
絶ã«ä¾¿å©ã§ããA485ã®æç´ã»ã³ãµã¼ã¯ã«ã¼ã½ã«ãã¼ãâãã®å³é£ã«ä»ãã¦ãã¦ããã®ã§ãããããã¯ï¼äººå·®ãæãä¸æã§ã¯ãªãï¼å°æã®æç´ãç»é²ãã¦ä½¿ãããã®ããã§ããæè¿ã®æç´ãªã¼ãã¼ã¯æãæ»ãããå¿
è¦ããªãããã§ãæã®åããæãã®ã¾ã¾ã»ã³ãµã«æãç½®ãã¦ãåé¡ãªãæç´èªè¨¼ãéãã¾ããå³æãã¼ã ãã¸ã·ã§ã³ããå°æã伸ã°ãã¦ã»ã³ãµã«ãµããã ãã§ãã°ã¤ã³ã§ããã®ã«ã¯ã¡ãã£ã¨æåãã¾ããã
ï¿¥1,080ã®ä¾¡å¤ã¯ååã«ããã¨æãã¾ãã - 液æ¶ãæ®éã«è¯ãã§ããFHDã§æ¡å¤§ç100%表示ã§å¸¸ç¨ã§ãããã§ããï¼å人çã«ã¯14ã¤ã³ãæªæºã§FHDã ã¨è§£å度ãç´°ãããã¦ç®ã«è¾ãããªã®ã§14ã¤ã³ãã®A485ãé¸ãã ã®ã§ãããA485ãããã®è³ªã®æ¶²æ¶ãªã13.3/12.5ã¤ã³ãã®FHDã§ãããããªï¼ã¨ãæãã¾ããï¼
- SSDã¯SSDSC2KF180G8L(Intel 540s/Pro 5400sã®åçªããã)ã§ãããå½ããåã§ããHDDã¨æ¯ã¹ãã¨çéãWindowsã®ã¤ã³ã¹ãã¼ã«ãæ°ååããããã«çµãããèµ·åãæ©ããã§ãããSSDã ãã§ãæ°ãããã·ã³ãè²·ã£ã¦ããã£ãã¨æãã¾ããã
CrystalDiskMarkã¯ãããªæãã
SATA3ã§ã¯ãªãNVMeã®SSDãé¸ã¹ã°ãã£ã¨æ©ãã®ã§ãããããèªåã¯ããã¾ã§ã®éãã¯å¿ è¦ãªãã®ã§ããã§ååã
- ç¡ç·LANã¯Realtekã®8822BE/æç·LANãRealtekã§ããä»ã®ã¨ããç¹ã«ãã©ãã«ããªãè¯å¥½ã«ä½¿ãã¦ãã¾ãã
- Ryzenã®ããã©ã¼ãã³ã¹ã¯ã¾ã å®æã§ãã¦ãã¾ããï¼CPUãã¯ã¼/ã°ã©ãã£ãã¯ã¹ãå¿
è¦ã¨ãããããªä½æ¥ã¯è¡ã£ã¦ããªãã®ã§ï¼ãã²ã¨ã¾ãCPU-Zã®çµæãè²¼ã£ã¦ããã¾ãã
- çºç±ï¼ãã¡ã³é³ã«ã¤ãã¦ããOSã¤ã³ã¹ãã¼ã«ã»CPU-Zç¨åº¦ã®ä½¿ãæ¹ã§ã¯ç±ããªããããªãã¨ããªãããã¡ã³é³ãï¼ãã¾ã®ã¨ããã¯ï¼ã»ã¨ãã©ããã¾ããã
æ§è½ãè¯ãåç±ãæ¿ãããããRyzenãªã®ã§PCã®æ¸©åº¦ãä¸ãããªããæ°ã«ãªãã¨ããã§ã¯ããã¾ãããTã·ãªã¼ãºã®çä½ã使ã£ã¦ããï¼æ¾ç±è¨è¨ããã£ãããã¦ãããã¨ãæå¾ ãããã§ãã
- éãï¼åãã§ãããå®éã«æã«æã£ã¦ã¿ã¦ããããªãæã¡éãã§ä½¿ã£ã¦ãããããªãã¨æãããµã¤ãºã§ãããããæ¯è¼å¯¾è±¡ãæªãã ãã§ãããE430cã¯éã2.15Kg/åã28.5~31.5mmã§ã¨ã¦ããããªããã©éã«å
¥ããæ°ã«ãªãã¾ããã§ããã
æ¯æ¥ã ã¨ã¡ãã£ã¨è¾ããã§ããï¼ããããç¨éãªãã¾ã¨ããªã¢ãã¤ã«ãã¼ããè²·ãã¹ãï¼ãæã æã¡éã¶ããããªãA485ã§ã大ä¸å¤«ã ã¨æãã¾ããã - ããããªã¼ã®æã¡ã¯æªæ¤è¨¼ã§ããIntelã®CPUã¨æ¯ã¹ãã¨é»æ± æã¡ãæªãã¨ã¯èãã¾ãããèªåã®ç¨éã ã¨ããããå¿ è¦ãªãé»æºã¢ããã¿ãã¨æã¡éã¶ã®ã§ç¡åé¡ã
4ã³ã¢8ã¹ã¬ããã§Intelã®i5-8250U(ãªããi7-8550U)ã«å¹æµããCPUãThinkPadTã·ãªã¼ãºã¨åçã®è¨è¨ã®çä½ãFHDã»ã¡ã¢ãª8GBã»SSD180GB(ä¸å¿Intel)ã®ãã·ã³ã8ä¸å以ä¸ã§è²·ããã¨ããã³ã¹ãããã©ã¼ãã³ã¹ã®è¯ãã«ã¯ç®ãè¦å¼µããã®ãããã¾ãã
USBãã¼ããï¼TypeCãæ§æ¥ã®3.0ãï¼ååãªãã¼ãæ°ããããã¡ã¢ãªã¹ããããm2ã¹ãããã空ããããä»å¾ã®å¢å¼·ã«ãèãããã¾ãã
ããã¦ãªã«ããèªåã«ã¨ã£ã¦ã¯ç¾PCã§æãã¦ã解å度ã»ãã£ã¹ã¯ã¢ã¯ã»ã¹é度ã®ä¸æºãä¸æ°ã«è§£æ¶ãããã®ãä½ãã大ããã¦ãããè²·ãç©ããã¦å¤§æºè¶³ã§ããã
â»ã¾ã ãã»ã©ä½¿ãè¾¼ãã§ããªãæç¹ã§ã®ææ³ã§ããå¾æ¥ãããã°ãã使ãè¾¼ãã§ããæ°ãã«è¨äºãä¸ããã»ã»ã»ããããã¾ããã