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% 저게 체크된 상태일 겁니다. 그림과 같이 체크 해제 하신 후 실행하시면 특별한 경우가 아닌 이상 컴퓨터 메모리가 바닥날 때까지 저 예외를 볼 일 없게 될겁니다.
안녕하세요? 혼살입니다. 블로그에 정말 오랜만에 글을 씁니다. 일하고 겜하고 일하고 겜하고 집에 박혀서 매일 똑같은 일상을 보내다 보니 블로그에 글을 오랫동안 안 쓰고 있었네요. 대부분 근황은 유튜브 동영상으로 대체하다 보니 더욱 더 그랬던 것 같습니다. 하지만 이번엔 영상보다 글로 남기는 게 더 유익할 것 같아 간만에 글을 쓰게 되었습니다. 바로 MySQL Data Types & Java Data Types 매칭! 현재 진행중인 외주 작업 중 SET 타입을 Java에선 어떻게 처리하나 찾아보다가 잘 정리된 블로그 글 을 발견해 나중에 손쉽게 찾기 위해 제 블로그에도 씁니다. 위 링크에 들어가시면 테이블로 잘 정리돼 있으니 한 번 들어가 보시는것도 괜찮겠네요. 왼쪽은 MySQL, 오른쪽은 Java의 데이터 타입입니다. BIT <-> Boolean TINYINT <-> Integer BOOL/BOOLEAN (TINYINT(1)) <-> Integer SMALLINT <-> Unsigned 상관없이 Integer MEDIUMINT <-> Integer, Unsinged라면 Long INT <-> Integer, Unsigned라면 Long BIGINT <-> Long, Unsigned라면 java.math.BigInteger FLOAT <-> Float DOUBLE <-> Double DECIMAL <-> java.math.BigDecimal DATE <-> java.sql.Date DATETIME <-> java.sql.Timestamp TIMESTAMP <-> java.sql.Timestamp TIME <-> java.sql.Timestamp YEAR <-> yearsIsDateType이 설정됐다면 java.sql.Date, 아니라면 Short CHA
블로그를 옮기면서 카드캡터 사쿠라 OST를 포함해 테일즈위버 OST 역시 까먹고 안 옮겼었네요. 소름... 블로그 조회수의 대부분을 차지하는 두 개를 안 옮겼었다니! 게임보다 OST들으러 들어간다는 테일즈 위버(Tales Weaver)의 모든 OST 모음집입니다. FLAC파일을 재생할 수 있는 플레이어가 필요합니다... 만 요새는 웬만해선 다 재생해주죠. 즐감하세요.
댓글
댓글 쓰기