갑자계산

C#으로 60갑자(간지干支) 계산식을 세워보자

간지 (干支) : 십간(十干)과 십이지(十二支)를 합쳐서 60주기로 하는 수사입니다.

발상

60간지를 나열한 자료는 쉽게 인터넷 검색으로 구할 수 있지만, 그걸 계산하는 건 많지 않습니다.

요즘 Java를 열심히 배우고 있는 입장에서, 기존에 하던 C#를 까먹어버리면 곤란한 관계로, C#을 오랜만에 활용하여 실력을 썩히지 않도록 노력해야겠다고 다짐했습니다.

그리하여 타임어택 같은 느낌으로 도전하였습니다.

30분 안에 기능 하나는 완성해야 하지 않겠습니까!

접근

수학적인 기존의 지식을 활용하는 것도 유용해보이지만, 배열의 특성을 최대한 활용해보기로 했습니다.

언제 다시 보더라도 쉽게 이해할 수 있는, 구현이 어렵지 않은 코드를 지향하였습니다.

우선, 간지를 각각 배열로 적어봅시다.

static string[] gap = new string[] { "갑", "을", "병", "정", "무", "기", "경", "신", "임", "계" };
static string[] ja = new string[] { "자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해" };

어렵지 않습니다.

구현

연도를 간지로 변환

연도를 간지로 바꿔봅시다. 생각하기 편하게 올해(2017, 정유년)를 기준으로 생각해봅니다.

올해와 목표년도의 차이를 구하고 단순히 각각의 배열 길이로 나누어 나머지를 구하면 됩니다. 그 다음 올해의 간지만큼 더해주면 끝이죠.

하지만 여기서 의외로 연도를 간지로 바꾸는데는 구현에 약간의 애를 먹었는데, 앞으로는 문제 없이 구하는데 거꾸로는 엉뚱한게 나왔던 것입니다.

고민하다가 원인은 음수 처리에 있었다는 걸 알았습니다.

private static string YearToGapja(int i) {
            int cha = i - 2017;
            //기준점을 2017년으로 잡아봅니다.
            int gap_cha = cha % gap.Length;
            int ja_cha = cha % ja.Length;

            gap_cha = (gap_cha + 3) % gap.Length;
            ja_cha = (ja_cha + 9) % ja.Length;

            if (gap_cha < 0) {
                gap_cha = gap.Length + gap_cha;
            }
            if (ja_cha < 0) {
                ja_cha = ja.Length + ja_cha;
            }

            return gap[gap_cha] + ja[ja_cha];
        }

음수 처리로 한 번 더 길이를 더해주면 끝에서부터 음수로 세어간 위치를 구할 수 있습니다. 이렇게 하면 몇 년이고 틀리지 않고 다 구할 수 있죠.

아, 여기서 옥에티가 있군요. 기원전을 지원하는 것입니다. 그냥 해서는 0년이 포함되어버리죠.

private static int MinusToBC(int i) {
    if(i < 0) { //
       return ++i;
    }else if(i == 0) {
       return int.MinValue;
    }
    return i;
}

이렇게 음수에 한해서는 입력값을 실제보다 1 더해주면 됩니다.

0을 입력한 경우를 별도로 구분하기 위해 int.MinValue로 넣어줬습니다. 이는 Int32 범위의 최하 숫자를 가져올 수 있는데, 이걸로 무효한 숫자로 처리하면 크게 유용성에 간섭받지 않고 잘 확인할 수 있습니다.

int.MinValue와 같으면 계산을 포기한다는 구절을 넣는 것으로 충분하죠.

한편, Console.ReadLine()을 통해 입력값을 받는 만큼, 이것이 유효한 숫자인지 판별할 필요가 있습니다.

do {
    Console.Write("희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: ");
    input = Console.ReadLine();
} while ((!int.TryParse(input, out i) && !isGapja(input)) || input == "0");

이를 통해 input이 숫자가 아니거나, 갑자가 아닌 경우 또는 0을 입력한 경우 모두 다시 읽으려고 시도하겠군요.

int.TryParse는 Parse 실패시에 out i 값이 0이라고 합니다.

private static bool isGapja(string input) {
            if (input.Length == 2) {
                if(!(gap.Contains(input[0].ToString()))) {
                    return false;
                }
                if (!(ja.Contains(input[1].ToString()))) {
                    return false;
                }
                return true;
            }
            return false;
        }

위에서 등장한 IsGapja라는 함수를 만들어두면 반복문을 돌 때 input의 간지 유효성을 확인하고 실제 갑자를 갖고 있는지 확인할 수 있습니다.

결과 확인

여기까지 하면 결과가 시원하게 나옵니다.

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 2017
결과: 정유

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 2002
결과: 임오

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 1988
결과: 무진

와우. 이렇게 하였더니 목표 30분보다 10분 빠르게 끝났네요.

하지만 15분 냉장고를 부탁해 컷에는 실패했습니다. 다음에는 분발합시다!

간지를 연도로

그 다음으로 간지를 연도로 변환해보겠습니다. 60년마다 돌아오니까 환갑이라고 하죠. 아무래도 여러 번 있을 것이고, 시작 년도와 끝 년도도 중요하겠죠.

유연한 적용을 위해서 일부러 시작 년도와 끝 년도를 매개변수로 받았습니다.

그리고 이제 끝없는 고민을 합니다. 위의 간지 변환 사례를 역으로 방정식을 세우면 그만일까요?

아무래도 머리가 핑핑돌고 문제가 생겼을 때 어떤 방식을 써야할지 수알못에게 두려움이 비칩니다.

이럴 때는 컴퓨터를 믿고 왕도를 걸어보기로 합니다. 사실 목표 간지와 기준 간지의 차이만큼을 알고 있으면 그 +/- 60만 반복하면 결과가 됩니다.

그러나 목표 간지와 기준 간지 차이를 구하기엔, 쉽지 않습니다. 계산식을 더 많이 고민하면 되겠지만요.

수학자가 아닌 프로그래머에겐, 코드가 더 많은 답을 줍니다.

private static string[] EnumGapja() {
            string[] s = new string[60];
            for(int i = 0; i < 60; i++) {
                s[i] = gap[i % gap.Length] + ja[i % ja.Length];
            }
            return s;
        }

이렇게 하면 위 전역변수를 활용하여 60갑자가 뚝딱 완성됩니다.

나머지가 끊임없이 찬조출연하더군요.

private static int[] GapjaToYear(string input, int min, int max) {
            string[] eg = EnumGapja();
            int ifrom_gapja=Array.IndexOf(eg, input);

            //서기 4년은 갑자년.
            //4*60n=갑자
            //4*60n+ifrom_gapja=갑자+ifrom_gapja
            List ilist = new List();
            for (int i = 4 + ifrom_gapja; i < max; i+=60) {
                if(i < min) {
                    continue;
                }
                ilist.Add(i);
            }

            return ilist.ToArray();
        }

이제 한없이 길어지던 코드가 한결 간결해졌습니다.

단순히 60갑자 목록에서 index의 차이만 알게 되는 것으로 추가해야할 년도를 알 수 있습니다.

갑자년이 서기 4년이라고 합니다. 이 갑자년과의 차이 = index라는 걸 쉽게 예측할 수 있으니까요.

min년부터 max년까지 반복문을 돌리면 그만이겠습니다.

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 무자
28년 88년 148년 208년 268년 328년 388년 448년 508년 568년 628년 688년 748년 808년 868년 928년 988년 1048년 1108년 1168년 1228년 1288년 1348년 1408년 1468년 1528년 1588년 1648년 1708년 1768년 1828년 1888년 1948년 2008년 2068년 2128년 2188년 2248년 2308년 2368년 2428년 2488년 2548년 2608년 2668년 2728년 2788년 2848년 2908년 2968년 3028년 3088년 3148년 3208년 3268년 3328년 3388년 3448년 3508년 3568년 3628년 3688년 3748년 3808년 3868년 3928년 3988년 4048년 4108년 4168년 4228년 4288년 4348년 4408년 4468년 4528년 4588년 4648년 4708년 4768년 4828년 4888년 4948년 5008년 5068년 5128년 5188년 5248년 5308년 5368년 5428년 5488년 5548년 5608년 5668년 5728년 5788년 5848년 5908년 5968년 6028년 6088년 6148년 6208년 6268년 6328년 6388년 6448년 6508년 6568년 6628년 6688년 6748년 6808년 6868년 6928년 6988년 7048년 7108년 7168년 7228년 7288년 7348년 7408년 7468년 7528년 7588년 7648년 7708년 7768년 7828년 7888년 7948년 8008년 8068년 8128년 8188년 8248년 8308년 8368년 8428년 8488년 8548년 8608년 8668년 8728년 8788년 8848 년 8908년 8968년 9028년 9088년 9148년 9208년 9268년 9328년 9388년 9448년 9508년 9568년 9628년 9688년 9748년 9808년 9868년 9928년 9988년

:)

전체 소스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Gapja {
    class Program {
        //4 5 6 7 8 9 0 1 2 3
        static string[] gap = new string[] { "갑", "을", "병", "정", "무", "기", "경", "신", "임", "계" };
        static string[] ja = new string[] { "자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해" };
        static void Main(string[] args) {
            //2017 = 정유년 = 4/9

            while (true) {
                string input = ""; int i = 0;
                do {
                    Console.Write("희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: ");
                    input = Console.ReadLine();
                } while ((!int.TryParse(input, out i) && !isGapja(input)) || input == "0");
                i = MinusToBC(i);
                if(i != int.MinValue) {
                    Console.WriteLine("결과: {0}", YearToGapja(i));
                } else {
                    var result = GapjaToYear(input, 1, 10000);
                    foreach(var r in result) {
                        Console.Write("{0}년 ",r);
                    }
                }
                Console.WriteLine();
            }
        }

        private static bool isGapja(string input) {
            if (input.Length == 2) {
                if(!(gap.Contains(input[0].ToString()))) {
                    return false;
                }
                if (!(ja.Contains(input[1].ToString()))) {
                    return false;
                }
                return true;
            }
            return false;
        }

        private static int MinusToBC(int i) {
            if(i < 0) { //
                return ++i;
            }else if(i == 0) {
                return int.MinValue;
            }
            return i;
        }

        private static string YearToGapja(int i) {
            int cha = i - 2017;
            //기준점을 2017년으로 잡아봅니다.
            int gap_cha = cha % gap.Length;
            int ja_cha = cha % ja.Length;

            gap_cha = (gap_cha + 3) % gap.Length;
            ja_cha = (ja_cha + 9) % ja.Length;

            if (gap_cha < 0) {
                gap_cha = gap.Length + gap_cha;
            }
            if (ja_cha < 0) {
                ja_cha = ja.Length + ja_cha;
            }

            return gap[gap_cha] + ja[ja_cha];
        }

        private static string[] EnumGapja() {
            string[] s = new string[60];
            for(int i = 0; i < 60; i++) {
                s[i] = gap[i % gap.Length] + ja[i % ja.Length];
            }
            return s;
        }

        private static int[] GapjaToYear(string input, int min, int max) {
            string[] eg = EnumGapja();
            int ifrom_gapja=Array.IndexOf(eg, input);

            //서기 4년은 갑자년.
            //4*60n=갑자
            //4*60n+ifrom_gapja=갑자+ifrom_gapja
            List ilist = new List();
            for (int i = 4 + ifrom_gapja; i < max; i+=60) {
                if(i < min) {
                    continue;
                }
                ilist.Add(i);
            }

            return ilist.ToArray();
        }
    }
}

[SCIT마스터 작문] 2017年12月26日

IT 기술을 사용한 새로운 광고를 생각해보세요.

일러두기

  • 이 주장은 논리 전개를 위해 선택된 것으로 자신의 생각과 일치하다고 할 수 없습니다.
  • 일본어로 쓴 다음, 한국어로 옮긴 글입니다.

작문

저는 음성 어시스턴트에 의한 정보 제공형 광고가 이제부터 늘어날 것을 상상해보았습니다. 즉, 지금까지 시각에 의존하고 있던 흐름에 반해서, 라디오와 닮은 형식으로 바뀐다는 것입니다.

왜냐하면, N 디스플레이 시대로 텔레비전과 영화관, 스마트폰, 모두 다 광고주의 광고 효과를 보증할 수 없기 때문입니다. 아마존의 에코와 구글 홈, SK텔레콤의 누구 같은 음성 어시스턴트로 추천 제품을 추가하는 것은 간단한 일일 것입니다.

물론, 청각만으로의 광고는 부족하다는 의견도 있습니다. 그러나, 정해진 예산으로 광고를 송출하는데는 한 번으로 높은 효과를 기대할 수 있는 쪽을 선택하는 것이 자연스러울 것입니다.

그러므로 이제부터 음성 어시스턴트에 의한 광고가 IT 기술과 함께 퍼질 것으로 생각합니다.

선생님의 코멘트

발상은 좋다고 생각합니다.

부분적으로 표현이 이해하기 어려운 곳이 있습니다.

감상

.

Servers

VPS를 고려하게 되는 이유, 저렴한 VPS 업체 비교

웹 호스팅이 만능이 아닌 이유

웹 호스팅은 꽤 단순합니다. 그냥 사이트를 만들겠다고 마음 먹고 호스팅 업체에 신청하면 저렴한 옵션으로 만들어주죠.

이를테면, Cafe24의 경우엔 신청료가 별도로 있긴 하지만 한달 500원짜리까지도 있습니다. FTP로 접속해서 파일만 올리면 그야말로 홈페이지 셋팅 완료입니다.

이 과정도 생략하기 위해 WordPress나 제로보드 XE, 그누보드도 설치 지원해주는 업체가 많습니다. 이런 곳은 키보드도 별로 두들기지 않고 뚝딱 서버 완성입니다.

하지만 그렇게 해서 뿌듯하게 자신의 사이트를 만든 K씨(갑자기 사례자 등장?)
그는 디스크 사용량만을 고려하여 최저 플랜으로 웹 호스팅을 신청한 다음, 자신의 포트폴리오 사이트를 올려놓고, 면접 이력서를 여러 군데 넣고 본격적인 구직에 뛰어들었습니다.

어느 날, 취직 커뮤니티(Naver CAFE)를 방문한 K씨.

자신의 포트폴리오가 우수 사례로 공유되고 있다는 걸 알게 되자, 내심 뿌듯해했는데요.
그리고 얼마 가지 않아 고작 4번째 댓글에서 생각지도 못한 내용을 발견하게 되었습니다.

안 들어가지는데요.

어라? 하고 자신의 포트폴리오 사이트를 들어가보니, 반갑게 맞아준 건 이런 페이지였습니다.

카페24 트래픽 초과 페이지
카페24 트래픽 초과 페이지

부랴부랴 플랜을 업그레이드하려고 보니, 가격이 월 몇 만원까지 뛰어오르는군요. 트래픽 리셋을 매일매일 유료로 눌러주는 것도 대안이 되지 못합니다.

넉넉한 트래픽과 여유로운 공간, 이 두 가지를 노리려면 역시 가정집에 개인 서버라도 돌려야 하는 걸까요?
슬며시 전기료 걱정도 떠오르는데요.

VPS는 조금만 부지런하면 가장 유리한 옵션

그런 K씨의 지인은 VPS1를 소개해주었습니다. VPS란 것도 처음 듣는데, 들어보니 원격지에 서버 하나가 생기는 거라 하더군요.

호스팅 서버랑 뭐가 다르지 했는데, 이건 온전히 컴퓨터 한 단위를 다룰 수 있다고 합니다.

월 몇 십만 원에서 백만 원인 서버 호스팅은 많이 비싼데요. 이건 서버를 쪼개서 서버로 만든다고 합니다(!)

서버를 한 컴퓨터 안에서 여럿으로 나눌 수 있는 건 가상화 기술이 진보했기 때문입니다.
컴퓨터 속 컴퓨터로 명령어를 별도로 처리해야 했던 과거와 달리 CPU와 주요 장비들이 처음부터 가상화를 대비하고 만들어져서 성능의 저하를 최소화2한다고 합니다.

서버를 빌리는 것이니 가격도 상당하겠지만, 서버는 자유로운 용도로 활용할 수 있으므로 경우에 따라 더 유리할 수 있습니다. 특히 기본 트래픽이나 용량 제공이 그리 적지 않다는 점이 큰 매력입니다.

밑에서 서술하겠지만, 최소 트래픽 용량만 해도 웬만한 웹 호스팅 업체의 최고 플랜 수준입니다.3

하지만 VPS가 모두에게 올바른 답은 아니라는 것

분명 가성비가 좋은 것은 알겠지만, 그렇다고 별다른 지식 없는 사람이 덜컥 VPS를 신청하게 되면 접속부터 헤매게 됩니다.

겨우겨우 접속해도 갓 설치된 Ubuntu4의 검은 콘솔이 너무나 당혹스럽습니다.

최소한 윈도우 설치는 여러 번 해보고, 컴퓨터와 소프트웨어 개념이 어느 정도 있는 사람이면 명령어5와 관련 프로그램을 익히는 것으로 꽤 능숙해질 수 있습니다. (자꾸 까먹어서 문제지만요)

그러니까 검은 화면에서 LAMP(Linux+Apache+MySQL/MariaDB+PHP) 또는 LEMP(Linux+nginX+MySQL/MariaDB+PHP) 구성은 할 줄 알아야 한다는 것이죠. 물론 이에 관한 강좌는 아주아주 많으니 따라하는 것만으로 꽤 손쉽게 완료할 수 있습니다.

다만 문제 해결에서 크게 갈리게 됩니다. 분명 퍼미션(권한) 문제가 여러분을 괴롭힐 것이고요.
그 외 문제 원인을 파악하는데 항상 어려움을 겪는다면, 서버를 운영하려고 했다가 배울 거리만 늘었다고 푸념하게 되실지도 모릅니다.

주요 업체 비교

사실 VPS 업체는 더 세상에 많고, 아래 업체들보다 더 견실한 곳도 더 많을 겁니다.

그러나 어디까지나 제 주관적인 경험을 적고자, 직접 개설해본 적이 있는 곳만 나열해봤습니다.

ConoHa

VPS Conoha
VPS라면 코노하!
모에한 미유키
모에한 미쿠모 코노하

conoha.jp
모에버전6

코노하는 일본의 GMO 인터넷 주식회사에서 운영하는 가상 서버 호스팅 서비스입니다. 모기업도 탄탄하다고 하고, 이곳은 뭐니뭐니해도 무제한 트래픽7이 특징입니다.

글로벌 영업도 활발해서, 한국어는 당연하다는 듯이 홈페이지와 관리 콘솔에서 지원하고 있습니다.

하지만 용도외 사용이거나, DDoS 공격의 표적이 되기라도 하면, 일방적으로 서비스가 해지되며, 이를 해결하기가 무척 까다롭습니다.

또한, 메일로 영문 문의가 가능한데, 전화로 급한 문제를 해결하려고 한다면, 일본어는 필수입니다.

100Mbps 회선만을 지원하여 다소 아쉬운 속도입니다. 그러나 핑, 서버 연산은 또 회선과 별개의 문제죠.

이상하게 다소 느립니다. 도쿄를 골라도요. 그리고 이게 널뛰기를 하는 걸 보니, 오버부킹8이 의심스러운 점도 있습니다.

이용 금액은 크레딧으로 충전하거나, 신용카드를 연결할 수 있습니다. (해외 결제)

서버를 꺼도 크레딧이 소모됩니다.

ConoHa 컨트롤 패널
ConoHa 컨트롤 패널
ConoHa Japan Plan
ConoHa Japan Plan

장점

  • CPU 혜자
  • 트래픽 혜자
  • 덕후를 위한 덕후 디자인 제공(별도 메뉴). 덕후 취향 아닌 분들을 위한 담담한 버전(기본값).

단점

  • 이상하게 느린 속도. 널뛰는 접속 속도. 높은 핑.
  • 상담, 문제해결이 어려움. 친절하지만 사무적인 상담원
  • 기능이 많은 것 같지만 기능이 적은 관리 콘솔. API를 이용하라지만 관련 안내는 전무함.
  • 리모트 뷰(원격 서버 그래픽 표시) 도구가 없음. SSH 죽으면 막막함.

솔직히 말해 덕후 취향 노리든 말든 느린 건 용서가 안 됨

Vultr

Vultr
Vultr

vultr.com

Vultr는 다른 VPS 업체에 비해 신생인 편에 속하나, 높은 업타임으로 높은 신뢰도를 기록하고 있는 업체입니다.

문제가 발생하면 군말없이 크레딧을 얹어주며 보상해주고, 평소에도 추천인 링크로, 많으면 페이백까지도 시켜주는 혜자 정책을 취하고 있습니다.

링크를 타고 가입하면 깎아주는 시절도 있었는데 지금 이 글을 올리는 시점에는 딱히 이벤트가 없는 것 같습니다. 사이트를 직접 확인해보세요.

관리 콘솔이 단순하면서 관리하기 편하고, 필수적인 요소를 모두 갖고 있습니다.

스냅샷 저장에 과금하지 않으며 별도로 제약 사항도 없습니다. 서버 인스턴스를 복제하는데 써먹을 수도 있고, 문제 생겼을 때 롤백하는 가장 편리한 방법입니다. 스냅샷 생성과 적용(복원)도 10분 내외로 끝날 정도로 빠릅니다.

10Gbps의 빠른 회선을 갖고 있으며, 전세계 여러곳에 서버를 갖고 있어 원하는 곳을 골라 만들면 유용합니다.

뉴저지에 만들면 무료로 블록 스토리지를 제공합니다. 블록 스토리지를 연결하면 추가 하드디스크를 연결한 것처럼 용량을 확장할 수 있고, 데이터를 안전하게 보관할 수 있습니다.

도쿄에 만들면 ConoHa 부럽지 않은데, 여기는 회선은 멀쩡한데 오버부킹이 또 심하게 의심됩니다. 회선의 상태는 좋다는 것을 테스트 사이트에서 직접 확인할 수 있죠.9

이용 금액은 크레딧으로 결제하거나, 해외 결제 카드를 연결 가능합니다.

서버를 꺼도 크레딧이 소모됩니다.

장점

  • 편리한 관리자 콘솔
  • 혜자스러운 크레딧 제공, 다운 시간 피해 보상
  • 웹상에서 서버 그래픽 콘솔 제공
  • 스냅샷 생성 가능

단점

  • 참을 수 있을 정도의 느린 속도
  • 도쿄 지역의 높은 사용률, 낮은 서버 준비율(오버부킹을 예상할 수 있는 Availability Low 표시가 있음)
    • 가까운 도쿄가 이러니 국내에서 활용하기엔 점점 부적합해지는 경향이 있습니다.
    • 태평양 건너 뉴저지랑 비슷할 때도 있으니 절레절레

Somagu

Somagu
Somagu

somagu.com

소마구는 미꾸라지를 운영하는 미꾸라지네트웍스에서 커스텀 VPS 상품을 2017년 하반기에 출시하면서 시작했습니다.

절제된 디자인과 절제된 기능인데 비해, NoVNC 등 여러 방법으로 서버를 제어할 수 있는 수단을 제공하고, 고성능으로 옵션을 올려도 높은 비용을 요구하지 않습니다. 부업의 자신감?

한국에서 서비스하려면 한국에 있다는 지리적 강점으로, 속도가 상당히 빠릅니다.

서버의 소재지를 공개하셨는데, 경남 함안군 칠서면 구포리 62-34(…)로 공장 내부 서버랙에서 돌아가고 있다고 합니다.

직접 관리하는 게 아니라 가족에게 위탁하고 상태를 원격으로 점검하시는 것으로 보이는데, 이 탓에 문제 대응이 느리며, 포럼에 문의를 남기면 답변에 약 3일 이상은 각오해야 합니다.

하지만 이에도 장점이 있는데, 관리 UI에 없는 기능이라도 부탁하면 관리자께서 편의를 봐주신다는 점이죠. 오히려 세심한 하부 부분에선 관리를 맡긴다는 면에서 급하지 않은 서비스에 더 적합할 수 있겠습니다. (OS 위의 일은 사용자가 알아서 해야겠지만요)

장점

  • 성능 대비 무척 저렴한 가격
  • 국내 서비스의 쾌적함 (KT망)
  • Toss로 크레딧 지불 가능

단점

  • 느린 문제/문의 대응
  • 불안한 업타임, 전력 문제
    • 부정기적인 일대 전력 점검으로 서버가 꺼지는 경우가 있음
    • 서버 일부에 문제가 있다고 하셨으며, 교체 작업으로 인해 2017년 12월 기준 일시적으로 고사양 신청이 중단된 것으로 보임
  • 관리 도구의 기능 부재
    • 스냅샷 생성 기능이 별도로 없음
    • 관리 콘솔에선 컴퓨터 켜고 끄기, 원격 접속 정보 제공이 거의 대부분의 기능
  • 스위치 기반의 연결인데 포트 점유가 있는 듯
    • 같은 외부 포트를 여러 사용자가 같이 쓸 수 없는 것으로 보임
    • 20개로 제공된 포트 내에서 웹 UI를 통해 관리해야 함
    • 80 / 443 포트와 같은 HTTP에 대해서는 가상 호스트 방식으로 매핑해줌 (웹서버 동작에 이상은 없음)
    • 모든 원격 연결이 10.0.0.1 같은 내부 스위치 IP로 넘어옴. 방문자 IP 구분 불가. (X-Forwarded라도 ㅠㅠ)

스마일서브 (IwinV)

IwinV
IwinV

iwinv.kr

2002년부터 설립되어 오랫동안 발전시켜온 노하우를 갖고 있는 회사인데, 2014년 적자 업체 아이비호스트도 인수하는 등 적극적인 사업 확장 중입니다. VPS 분야는 iwinv에서 별도로 관리중입니다.

이 업체의 강점은 다양한 옵션, 저렴한 가격입니다.

장점

  • 가상코어, 리얼코어, 단독서버로 3단계로 나눈 상세 스펙 선택 가능
    • 가상코어란 CPU Core를 가상으로 다시 쪼갠 것으로, 다수 사용자에게 제공하기 위한 방법입니다. 타 사용자의 Core 사용량에 따라 크게 널뛰게 됩니다.
    • 리얼코어 사용시 CPU가 가상화로 인한 감쇠(10% 이내라고 주장)만 있고, 타 사용자의 간섭을 크게 줄일 수 있습니다.10
    • 단독서버가 당연히 제일 비싸지만, 그래도 타사보다 많이 저렴한 편
  • 포트 개방, 리소스 현황 파악 및 설정 상태 도달시 문자, 텔레그램, 이메일 통보 가능
    • 단, 문자는 문자 발송비에 대해 선충전후발송이므로, 텔레그램을 사용하는 편이 좋음. 자세한 설명이 실려 있음.
  • 기본 웹 방화벽 제공. OS도 방화벽 제공.
  • 웹상에서 서버 그래픽 콘솔 제공.
  • 스냅샷 생성 가능. 무료 생성 한도는 신청 인스턴스(서버) 용량의 2배까지만.
  • 신용/체크카드 후불형 결제
  • 블로터 등 유명 사이트들과 같은 IDC 센터 사용 (문제 발생 요인이 적음)

단점

  • 추가로 싸게 만들 프로모션은 딱히 눈에 띄지 않음
  • 부족한 결제 옵션

결론

VPS라는 것이 저렴해지고 가시화된지 오래되지 않아서 정보를 모으기 쉽지 않습니다.

그러나 리눅스에 보다 익숙해지고, 대형 서버에 의존하지 않는 자신만의 보안 대책을 강구하기 위해서라도 피할 수 없는 흐름인 것 같습니다.

하지만 어디까지나 본인에게 맞는지 따져보고서 결정할 일이겠죠. 여럿이 모여서 하나의 VPS를 신청해보는 것도, 사양이 허락한다면 꽤 유연한 사용 방법이지 않을까 생각합니다.

현시점에서 이 사이트는 스마일서브넷을 사용중입니다.

Galaxy Note 7

[번역글]aptX vs. aptX HD: 차이점에 대해서

3.5mm 헤드폰 플러그가 멸종 위기에 처한 지금, aptX HD가 변화를 만들어 낼 수 있습니다.

블루투스에 대해 읽어보셨다면, 수많은 글자와 숫자와 비밀스런 스펙을 마주하셨을 겁니다. 이들 중 가장 최신은 aptX HD 인데, 이상한 이름 뒤에 HD가 붙었습니다. HD가 “고선명”이라는 건 다들 아실텐데, 그러면 aptX는 또 뭘까요? aptX(고선명 사양을 포함해서)가 aptX HD랑 뭐가 다를까요?

이런 질문을 하는 사람은 여러분만이 아닙니다. 같이 알아보도록 합시다.

aptX가 무엇입니까?

hbs910
hbs910

aptX는 352kbps에서 4:1 압축률로 16비트/44.1kHz 오디오를 전송할 수 있는 블루투스 오디오 코덱입니다.

그다지 도움이 되진 않지만, 이게 여러분이 궁금해하는 aptX의 사양입니다. 이는 (여러분의 폰이나 컴퓨터, A/V 리시버 또는 그 외 블루투스 오디오를 전송할 수 있는) 장치가 오디오를 “CD 수준” 음질로 전송한다는 것입니다. 원본 소리가 CD 음질 이상이면, 소리가 훨씬 좋게 들립니다.

본래의 aptX 코덱은 CD 수준의 음질을 약속했고, 거의 그에 도달했습니다.

CD 음질과 “CD 수준” 음질의 차이에 주목하세요. 이는 압축때문에 생긴 표현입니다. aptX는 다른 블루투스 오디오 코덱처럼, 오디오를 보내고 장치(여러분의 헤드폰이나 다른 스피커)에서 받는 재생 과정에 압축과 압축 해제를 사용합니다. 데이터를 압축하고 전송해야 하는 이유가 있는데, 그것은 바로 블루투스가 스테레오 오디오 전송을 하기에 충분히 빠르지 않기 때문이란 점입니다. aptX 코덱은 소리 지연을 줄이는데 중점을 두었는데, 지연이란 소리를 보낸 후 들을 때까지 걸리는 시간을 말합니다.

음악을 듣는다면, 지연은 크게 문제가 되지 않습니다. 폰을 쓰면서 헤드폰에 상당항 딜레이가 있더라도 눈치채지 못할 수 있습니다. 하지만 동영상을 본다면 확실히 얘기가 달라집니다. 영상이 약간 구닥다리 더빙처럼 느껴지고 배우들의 립싱크가 맞질 않는 걸 쉽게 느낄 수 있습니다.

Read More

PocoTube on Omnia II

PocoTube (2010)

PocoTube on Omnia II
Omnia2 PocoTube App

PocoTube 는 오프라인 상태에서, 선택한 노선에서 전철의 현위치를 알려주는 Windows Mobile 앱입니다.

개발 동기

PDA폰에서 스마트폰으로 넘어가는 과도기에, 여전히 지하철 앱은 단순히 역간 소요 시간을 더해주는 선에서 그 역할이 머무르고 있었습니다. 서울시에 지하철 9호선이 들어오면서 지하철 급행이라는 개념이 추가되자, 나중에 오는 열차가 어느 역부터 더 빨리 가게 되는지, 보다 더 고도화된 정보 제공이 필요하게 되었습니다. 열차가 언제 오고, 어떤 추월 관계를 갖는지, 언제 도착하는지 알려주는데 특화된 앱을 만들기로 결정했습니다.

개발 언어 및 도구

  • C#
  • Microsoft Visual Studio 2008 (Dreamspark)
  • .NET Compact Framework 3.5

Read More

excercise1

짧게 풀어보는 Java 급 테스트

가뜩이나 환절기에 콧물 시큰시큰이라 머리가 띵한데 Java 실력 체크를 위한 시험을 보게 되었습니다.

다들 풀 수 있는 수준으로 나온다고 하지만, 모두에게 그러리라는 법은 없기 때문에, 넉넉한 시간에도 불구하고 끙끙대시는 분들이 많았습니다.

문제는 총 8문제였습니다.

Java 문제 1. 일의 자리를 1로 바꾸는 코드를 작성하라.

문제 1

public class Exercise1 {

	public static void main(String[] args) {
		int num = 333;
		int num2 = (int)Math.round((double)(Math.floor((float)num*0.1f)))*10+1;
		System.out.println(num2);
	}

}

사실 num / 10 * 10이 훨씬 쉽긴 합니다만, 나름 이유가 있어서라고 생각했는데… 풀고나니 참 쓸데 없는 짓을 했구나 싶은 부분입니다.

어떤 분은 String으로 바꾸고 치환하고 Integer.parseInt() 했다고 하시네요. 아… 제가 머리가 굳었나봅니다. 세상은 참신한 방법이 널리고 널렸어요.

Read More

[SCIT마스터 작문] 2017年12月18日

IT 업계의 10년 후 모습은 어떨까요?

일러두기

  • 이 주장은 논리 전개를 위해 선택된 것으로 자신의 생각과 일치하다고 할 수 없습니다.
  • 일본어로 쓴 다음, 한국어로 옮긴 글입니다.

작문

저는 모든 도시가 IoT에 의해서 관리 가능한 시대가 되어 있을 거라 생각합니다.

왜냐하면, IT 진보에 의해 하나하나 각 요소에 자기 관리와 이상 상태 보고를 맡길 수 있게 되어서, 사람 손을 필요로 하지 않는 유지보수가 가능하기 때문입니다.

예를 들어, 제가 전시장에서 본 것 중에는 스마트 맨홀이 있어서, 압력과 온도, 수량 등을 실시간으로 알 수 있는 것도 있습니다. 어려운 공사 없이도, 무선으로 가능하다고 합니다.

그러므로, 저는 경제적인 IoT 도시가 되어 있을 것이라 생각합니다.

선생님의 코멘트

.

감상

.

spring

[번역글] Spring MVC 모델과 세션 애트리뷰트의 이해

자바 웹 애플리케이션 개발자로서, 여러분은 요청 (HttpServletRequest)과 세션 (HttpSession) 범위를 바로 배우셨을 겁니다. 이들 범위와 데이터, 객체 다루기를 이해하는 것은자바에서 웹 애플리케이션을 디자인하고 빌드하는데 중요한 요소입니다. [리퀘스트와 세션의 범위에 대해서는 스택 오버플로우 게시물을 참조하면 빠르게 배울 수 있습니다]

Spring MVC 범위

Spring MVC에서 웹 애플리케이션을 시작했을 때, Spring 모델과 세션 애트리뷰트는 이해하기 어려웠습니다. 특히, HTTP 리퀘스트와 세션 범위, 거기서 애트리뷰트에 관해서 말입니다. Spring 모델 요소는 세션이나 요청에서 똑같이 나타날까요? 그렇다면, 어떻게 제어할까요? 이 글에서, Spring의 MVC 모델과 세션이 동작하는 것을 파헤치도록 하겠습니다.

Read More

정규식 레퍼런스

도입

정규식 (正規式, Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어입니다. 이걸 잘 써야 당장 코드 라인이 줄겠죠. 지금부터 정규식 사용법을 구체적으로 알아보고, 활용 방안의 예시를 베껴서 기록하고자 합니다.

정규식 쓰임

    • PHP의 preg_match 함수
      • $subject = "abcdef";
        $pattern = '/^def/';
        preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
        print_r($matches);
        
    • C#의 RegEx 클래스
      • class TestRegularExpressionValidation
        {
            static void Main()
            {
                string[] numbers = 
                {
                    "123-555-0190", 
                    "444-234-22450", 
                    "690-555-0178", 
                    "146-893-232",
                    "146-555-0122",
                    "4007-555-0111", 
                    "407-555-0111", 
                    "407-2-5555", 
                };
        
                string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";
        
                foreach (string s in numbers)
                {
                    System.Console.Write("{0,14}", s);
        
                    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
                    {
                        System.Console.WriteLine(" - valid");
                    }
                    else
                    {
                        System.Console.WriteLine(" - invalid");
                    }
                }
        
                // Keep the console window open in debug mode.
                System.Console.WriteLine("Press any key to exit.");
                System.Console.ReadKey();
            }
        }
        /* Output:
              123-555-0190 - valid
             444-234-22450 - invalid
              690-555-0178 - valid
               146-893-232 - invalid
              146-555-0122 - valid
             4007-555-0111 - invalid
              407-555-0111 - valid
                407-2-5555 - invalid
        */
    • Java의 RegEx 클래스
      • import java.util.regex.Matcher;
        import java.util.regex.Pattern;
        
        public class RegexMatches {
        
           public static void main( String args[] ) {
              // String to be scanned to find the pattern.
              String line = "This order was placed for QT3000! OK?";
              String pattern = "(.*)(\\d+)(.*)";
        
              // Create a Pattern object
              Pattern r = Pattern.compile(pattern);
        
              // Now create matcher object.
              Matcher m = r.matcher(line);
              if (m.find( )) {
                 System.out.println("Found value: " + m.group(0) );
                 System.out.println("Found value: " + m.group(1) );
                 System.out.println("Found value: " + m.group(2) );
              }else {
                 System.out.println("NO MATCH");
              }
           }
        }
  • javascript 리터럴 또는 RegExp 클래스
    • var myRe = /d(b+)d/g;
      var myArray = myRe.exec("cdbbdbsbz");
  • URL Rewrite Rule
    • rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/blog/sitemap$2.xml" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/blog/index.php?xml_sitemap=params=$2" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/blog/index.php?xml_sitemap=params=$2;zip=true" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/blog/index.php?xml_sitemap=params=$2;html=true" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/blog/index.php?xml_sitemap=params=$2;html=true;zip=true" last;

정규식 레퍼런스

Read More

yeon.me TLS

[번역글] SSL과 TLS 배포 모범 사례

SSL / TLS는 놀라울만큼 간단한 기술입니다. 배포하기 쉬우며, 안 될 때를 제외하면 그냥 쉽게 작동합니다. 가장 큰 문제는 암호화가 보통 올바르게 배포되기 쉽지 않다는 점입니다. TLS가 적절한 보안을 보장하려면, 시스템 관리자와 개발자는 반드시 올바른 서버 설정과 앱 배포에 노력을 기울여야만 합니다.

2009년, TLS가 어떻게 쓰이는지, TLS 도구와 문서를 어떻게 개선할지를 알기 위해서 우리는 SSL Labs에서 일하기 시작했습니다. 그 결과 몇 가지 목표에 달성했는데, TLS 사용에 대한 전세계적인 통계와 온라인 평가 도구를 만들었으나, 문서 부족은 여전히 눈에 띕니다. 이 문서는 그 문제의 해법을 위한 첫 걸음입니다.

우리 목표는 안전한 사이트와 웹 애플리케이션을 배포하는데, 관리자와 프로그래머가 가능한 최소의 시간을 들이도록 명확하고 간결한 설명서를 제공하는 것입니다. 명확함을 추구하고자, 우리는 완성도를 희생하고, 특정 추가 주제도 건너뜁니다. 실질적이고 따라하기 쉬운데 요점을 두었습니다. 더 자세한 정보를 원하시는 분께는, 6장에서 유용한 정보를 제공합니다.

yeon.me TLS

Read More

[SCIT마스터 작문] 2017年12月11日

도라에몽의 새로운 도구를 발명한다면 어떤 도구가 갖고 싶습니까?

일러두기

  • 이 주장은 논리 전개를 위해 선택된 것으로 자신의 생각과 일치하다고 할 수 없습니다.
  • 일본어로 쓴 다음, 한국어로 옮긴 글입니다.

작문

저는 도라에몽의 새로운 도구를 발명한다면, ‘무엇이든 남길 수 있는 추억의 디스켓’을 가장 갖고 싶다고 생각합니다. 여기서 ‘디스켓’은 어째서인지 ‘USB’보다 익숙한 것 같아서 결정하였습니다.

왜 이 도구가 필요하냐면, 지금의 도구인 카메라와 레코더, 캠코더는 한계가 있기 때문입니다. ‘추억의 디스켓’만 갖고 있으면, 언제든지 그 때로 들어가서, 체험할 수 있습니다. 고개를 돌리거나, 걸어다니거나 해서, 그 기억을 계속 즐기고 싶다고 생각한 적은 누구나 있을 것입니다.

혹시 제가 그 도구를 사용할 수 있다면, 여행했을 때를 다시 체험해보고 싶습니다. 좀처럼 갈 수 없는 미국의 눈부신 모래 해변을 걸어보는 것은 꿈과는 크게 다를 것입니다.

그러므로, 저는 기억을 형태로 만드는 ‘추억의 디스켓’을 갖고 싶습니다.

선생님의 코멘트

근사하네요~ 저도 그 도구 한 번 사용해보고 싶네요. 언제로 돌아갈까…

감상

저도 모르는 사이에 쓰이는 글도 있습니다. 이게 바로 그런 글이었습니다. 그러나 한자 실수에도 둔해진다는 점은 마음을 놓아서는 안 되는 이유일 것입니다.

Ubuntu 16.04 + NginX에 Tomcat을 끼얹어보자

Tomcat은 기본적으로 Apache랑 한 세트라는 느낌인데, 그래서 Nginx를 설치할 때는 전혀 어울리지 않는다고 생각해서 얼씬도 하지 않았다.

그러나 SCIT마스터에서도 계속 배우고 있는 진도 과정이기도 하고, 결국 Java를 어딘가에 올려서 프로젝트할 필요는 있기에, Nginx에 JSP 기능을 다는 것은 어느 정도 피할 수 없는 선택이었다.

Cafe24에서도 한때 철수했다가 지금은 다시 서비스 하는 모양인데, JSP 호스팅과 PHP가 공존하는 서비스도 있고 (cafe24 메뉴에서 64비트 JSP 호스팅 서비스가 그렇다) PHP가 빠진 대신 tomcat이 7에서 8 버전으로 올라갔다. 이 무슨 생색이냐

역시 PHP 구 버전 보는 것 같이 하나 같이 구닥다리 냄새가 나지만, 이쪽도 레거시 때문인지 좀처럼 버전을 올리지 못하고 여러 가지를 동시에 유지하고 있는 것 같다. Tomcat 9이 있는데 그리 관심 받지 못하는 것이 그걸 증명한다.

이미 Nginx가 셋팅되어 있는 환경에 요점만 적으면서 정리해둔다.

        1. 톰캣을 깐다.
          1. # apt-get update
            # apt-get install tomcat8
        2. 더 이상 깔 것은 없어 보인다.
        3. 편하게 home 디렉토리에서 웹 루트로 들어갈 수 있도록 심볼릭 링크를 생성한다.
          1. # ln -s /var/lib/tomcat8/webapps/ ~/webapps
        4. 톰캣이 정상적으로 구동중인지 확인하고, 구동중이지 않으면 실행한다.
          1. # service tomcat8 status
            # service tomcat8 start
        5. nginx.conf (보통 /etc/nginx에 위치) 열고 파일을 수정한다. include가 있는 형식이면 server 절을 include에서 찾아야 할 수 있으니 유의.
          1. 파일 내용에서 http절에 다음줄을 추가한다. /etc/tomcat8/server.xml의 내용을 참고하여 올바른 포트(기본값 8080)를 지정한다.
            1. # for tomcat jsp
                  upstream tomcat {
                      ip_hash;
                      server 127.0.0.1:8080;
                  }
          2. server절을 다음 내용으로 고친다. name이 겹치면 기존의 server 절을 없앨 필요가 있다.
            1. server { # MY DOMAIN
                      listen       80;
                      server_name  mydomain.net;
              
                      location / {
                          proxy_set_header    HOST $http_host;
                          proxy_set_header    X-Real-IP $remote_addr;
                          proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                          proxy_set_header    X-Forwarded-Proto $scheme;
                          proxy_set_header    X-NginX-Proxy true;
              
                          proxy_pass http://tomcat;
                          proxy_redirect  off;
                          charset utf-8;
                      }
              }
        6. nginx -t 를 실행하여 ok 사인을 확인한 다음 service nginx reload로 적용한다.
        7. 위 server_name과 같은 도메인을 입력하여 잘 작동하는지 확인한다.

apt-get install tomcat8-examples 해서 예제를 깔아주면 JSP와 서블릿이 부드럽게 돌아가는 것을 확인할 수 있다.

8080을 굳이 칠 필요가 없고, 기존의 php 서버와도 충분히 공존할 수 있음을 확인했다. 이제 SSL이 적용되어도 잘 되는지, 신규 도메인 적용 후 확인해볼 필요가 있겠다.

덧… 당연히 SSL / TLS 적용도 무사히 성공했다. 이제 서비스도 같이 할 수 있을 것이다.

Remote FX를 활성화하고 설정하는 방법

이 문서는 RemoteFx를 원격 데스크톱과 Hyper-V 세션에서 활성화하는 방법을 설명합니다. 이를 통해 사용자들은 RemoteFX 기술을 사용할 수 있고, 더 나은 경험을 할 수 있습니다.

필요한 버전

  • RemoteFX가 가능한 Windows 기반 운영 체제 (2008 R2, 2012, 2012 R2 등)

설명

다음 정보는 다양한 Microsoft 자료에서 수집된 내용입니다. 요약하자면 요구 사항과, 세션 또는 VM 기반 RDS 배포시 RemoteFX를 활성화하기 위한 방법과 설정을 나타냅니다.

세션 기반 RDS 배포

세션 기반 RDS 배포에 필요한 것

  • RemoteFX 서버의 프로세서는 스트리밍 SIMD 확장 2 (SSE2) 명령을 지원해야 합니다.
  • RD 세션 호스트 서버와 클라이언트 사이에 LAN 수준의 빠른 연결이 권장됩니다.

설정

원격 데스크톱 세션 호스트 역할이 반드시 설치되어야 합니다.
(서버 관리자 > 역할 추가 > 원격 데스크톱 서비스 > 원격 데스크톱 세션 호스트)

그룹 정책

다음 그룹 정책을 이어서 설정하세요. (gpedit.msc를 관리자 권한으로 실행하여 바꿀 수 있습니다)

컴퓨터 관리\관리 도구\Windows 구성 요소\터미널 서비스\원격 데스크톱 세션 호스트\원격 세션 환경

설정

  • 최대 색상 깊이클라이언트 호환 또는 32비트로 설정
  • RemoteFX를 활성화

원격 데스크톱 세션 호스트 설정에서도 첫 옵션을 바꿀 수 있습니다.

RemoteFX 서버를 다시 시작해야합니다.

VM 기반 RDS 배포

VM 기반 RDS에 대한 요구 사항

  • Hyper-V 기반 VM 배포
  • SLAT 활성화된 프로세서, (인텔: Extended Page Tables (EPT), AMD: Nested Page Tables (NPT))
  • GPU (최소 하나 이상의 GPU가 RemoteFX 서버에 필요합니다. GPU 드라이버는 DirectX 9.0c 또는 10.0을 지원해야 합니다. GPU가 여럿 있는 경우 설치된 GPU는 같아야 합니다. GPU는 시스템 메모리와 별도로 충분한 비디오 메모리를 갖고 있어야 합니다.
  • RD 세션 호스트 서버와 클라이언트 사이에는 LAN 이상의 속도 연결이 권장됩니다.

설정

  • 원격 데스크톱 가상화 호스트 코어 서비스와 RemoteFX 서비스 역할이 설치되어야 합니다.
    (서버 관리자 > 역할 추가 > 원격 데스크톱 서비스 > 원격 데스크톱 가상화 호스트)
  • (Hyper-V 서버에) 그래픽 카드 드라이버 설치

참고: RemoteFX 서버에 최신 그래픽 카드 드라이버가 설치되어 있도록 합니다.

Hyper-V 설정

  1. Hyper-V 관리자를 엽니다.
  2. 가상 컴퓨터에서 원하는 가상 컴퓨터에서 오른쪽 클릭하고, 설정에 들어갑니다.
  3. RemoteFX 3D 비디오 어댑터를 추가합니다.
  4. 가상 컴퓨터가 시작되지 않았다면 시작하고, 그 다음 연결합니다.
  5. 로컬 관리자 그룹 사용자로 로그온합니다.
  6. RemoteFX 3D 비디오 어댑터 드라이버가 설치됩니다. 시스템을 재시작할 것으로 뜨면, 재시작합니다.
  7. 그렇게 하면, 가상 컴퓨터는 RDP로만 접속할 수 있습니다. (Hyper-V연결 화면은 그래픽 어댑터가 비활성화될 때까지는 더 이상 작동하지 않습니다)

원본: http://2x.helpserve.com/knowledgebase/article/View/233/10/how-to-enable-and-configure-remote-fx

[SCIT마스터 작문] 2017年12月4日

지금까지 인생에서 가장 영향을 받은 사람은 누구입니까? 어떤 영향을 받았습니까?

일러두기

  • 이 주장은 논리 전개를 위해 선택된 것으로 자신의 생각과 일치하다고 할 수 없습니다.
  • 일본어로 쓴 다음, 한국어로 옮긴 글입니다.

작문

저는 이웃으로 살고 있던 일본인 가족 모두라고 생각합니다. 특히, 아저씨와 딸은 제가 일본에 대해 흥미를 갖게 된 계기 그 자체였습니다. 그것은 지금까지 연속된 이사 속에서도 가장 인간미를 실감할 수 있던 이웃 가족이었습니다.

예를 들어, 일본에서 사온 선물이 있으면, 우선 우리들에게 나눠준다든가, 서로의 어린 아이들을 보살펴준다든가, 아무렇지 않게 말을 거는 일도 있었습니다. 손짓과 단어를 섞어가면서, 진지하게 소통하려고 하는 정성은 일본어를 배워보게 마음 먹은 이유가 되었습니다.

물론 이웃에 외국인이 살았다는 것은 흔히 있을 수 있는 일일지도 모릅니다. 게다가 그 가족이 일본에 귀국한 이후 소식이 끊겼던 시기도 있었습니다. 그러나 군대에 들어가서 매년 도착한 연하장에 대한 답장 형식으로 보내보니, 그 딸이 한국어를 섞어서 답장해주었습니다. 멀리서 지켜봐주고 있다는 사실만으로, 힘든 상황 속에서 마음에 위안이 된다는 것을 처음으로 알게 되었습니다.

처음 일본인 가족과의 10년 인연이 없었다면, 저는 좁은 세계에서 빠져나가지 못했을 것이라 생각합니다. 그리고 그 사람에게도 한국이라는 존재를 기억하게 해주는 모양이어서, 저는 누구보다도 영향을 받고, 또 주기도 한 게 아닌가 하고, 지금은 그렇게 생각하고 있습니다.

선생님의 코멘트

어릴 적부터 참 좋은 경험을 갖게 되었네요!

감상

.