using System;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace ReservedShutdown
{
class Program
{
static void Main(string[] args)
{
string timeString;
if (args.Length >= 1)
{
timeString = args[0];
}
else
{
Console.Write("종료 시각을 입력하세요(##:##:##): ");
timeString = Console.ReadLine().Trim();
}
Regex r = new Regex("^(\\d{2}:){2}\\d{2}$");
if (r.IsMatch(timeString))
{
r = new Regex("(\\d{2}):(\\d{2}):(\\d{2})");
var match = r.Match(timeString);
int h, m, s;
h = int.Parse(match.Groups[1].Value);
m = int.Parse(match.Groups[2].Value);
s = int.Parse(match.Groups[3].Value);
if (h < 0 || m < 0 || s < 0)
{
Console.WriteLine("잘못 입력하셨습니다.");
return;
}
if (s >= 60)
{
int tmp = s / 60;
m += tmp;
s -= 60;
}
if (m >= 60)
{
int tmp = m / 60;
h += tmp;
m -= 60;
}
int seconds = h * 3600 + m * 60 + s;
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += Tick;
worker.RunWorkerAsync(seconds);
Console.ReadLine();
}
else
{
Console.WriteLine("잘못 입력하셨습니다.");
System.Threading.Thread.Sleep(5000);
}
}
static long lastTick = 0;
private static void Tick(object sender, DoWorkEventArgs e)
{
int seconds = (int)e.Argument;
long now = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
long dest = now + seconds;
while ((now = DateTime.Now.Ticks / TimeSpan.TicksPerSecond) <= dest)
{
if (lastTick + 1 <= now)
{
Console.Clear();
int h, m, s;
int remain = (int)(dest - now);
h = remain / 3600;
m = remain / 60 % 60;
s = remain % 60;
Console.WriteLine($"종료까지 {h:00}시간 {m:00}분 {s:00}초 남았습니다.");
lastTick = now;
}
}
Console.Clear();
var process = new System.Diagnostics.Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/c shutdown -s -t 0";
process.Start();
}
}
}
C# 코딩 중 평소 볼 수 없던 생소한 현상이 발생했습니다. 분명 메모리는 남아도는데(32기가바이트 중 26기가바이트 사용 가능) 프로그램이 돌다가 OutOfMemory 예외를 던지며 죽어버리는 현상이었죠. List 에 수많은 파싱된 데이터를 넣는 작업 중이었습니다. 그래서 메모리 프로파일러를 잘 관찰해보니 2GB의 메모리를 사용하면 무조건 뻗어버리는 현상을 발견했고, 왜 그럴까 생각해보다가 문득 예전 XP에서 4기가 메모리를 달아도 32비트 운영체제의 한계 아닌 한계로 3기가 조금 넘게밖에 인식을 못 했던 것이 생각났습니다. 생각은 자연스럽게 컴파일이 32비트로 됐구나! 쪽으로 넘어갔고 프로젝트 설정에 보니 빌드 항목에 해당되는 체크박스가 있더군요. 현재 메모리가 남아도는데도 OutOfMemory 예외가 뜬다면 100% 저게 체크된 상태일 겁니다. 그림과 같이 체크 해제 하신 후 실행하시면 특별한 경우가 아닌 이상 컴퓨터 메모리가 바닥날 때까지 저 예외를 볼 일 없게 될겁니다.
USB 장치 인식 실패 보기만 해도 짜증나는 제목이죠. USB 장치 인식 실패. 원인은 여러가지가 있을 수 있습니다. USB 컨트롤러가 고장이거나, USB 케이블이 단선됐거나, 전원 공급이 원활하지 않거나. 하지만 뒷쪽에 꽂으면 괜찮은데 앞에 꽂으면 USB 장치 인식을 실패한다면? 십중팔구 전원 문제입니다. 불안정한 전원 공급 본체 앞쪽에 달려 있는 USB 포트는 메인보드에 다이렉트로 붙어 있는 뒷쪽과 달리 메인보드에서 케이블 하나를 거쳐 전면 패널에 연결 됩니다. 게다가, 이 케이블과 연결되는 메인보드의 부분은 주로 메인보드에 전원이 연결되는 부분과 정 반대쪽에 있기 때문에 , 저가형 불량 메인보드에선 아예 회로 자체가 잘못돼 전원이 제대로 전달되지 않는 경우도 있습니다. 이렇게 메인보드 자체의 문제일 경우엔 어쩔 수 없지만, 그게 아니라면 몇 가지 시도해 볼 수 있는 방법이 있습니다. USB 포트 청소 전원 공급이 불안정한 이유 중 하나가 될 수 있는 포트 내부의 먼지. 접촉 단자 사이에 먼지가 끼어 전류를 방해하거나 합선시키기도 합니다. 우선 USB 포트를 청소해주세요. 오래된 USB 케이블 교체 USB 케이블이 오래된 경우, 접촉면이 휘거나 벌어져 제대로 꽉 맞물리지 않거나, 싸구려라면 심할 경우 접히고 접히다 단선된 상태일 수도 있습니다. 오래된 USB 케이블은 교체해주세요. 메인보드의 USB 선 연결 상태 확인 메인보드를 보면, 파워가 연결되는 부분과 정 반대쪽(주로 맨 아래쪽)에 위와 같이 생긴 USB 커넥터가 연결돼 있을 겁니다. 못 찾겠으면, 본체 전면 패널쪽에서 이어져 오는 선중에 위와 같이 생긴걸 찾아보세요. 저걸 빼서 대충 후후 불고 다시 꽂아주시기 바랍니다. 항상 꽂혀 있는 것이라 정성스레 청소할 필욘 없어요. 단, 저 케이블 어딘가가 접혀있다면 꼭 펴주세요. USB 절전 모드 사용 안 함 ...
블로그를 옮기면서 카드캡터 사쿠라 OST를 포함해 테일즈위버 OST 역시 까먹고 안 옮겼었네요. 소름... 블로그 조회수의 대부분을 차지하는 두 개를 안 옮겼었다니! 게임보다 OST들으러 들어간다는 테일즈 위버(Tales Weaver)의 모든 OST 모음집입니다. FLAC파일을 재생할 수 있는 플레이어가 필요합니다... 만 요새는 웬만해선 다 재생해주죠. 즐감하세요.
댓글
댓글 쓰기