2017년 10월 31일 화요일

무라카미 하루키 스크랩


뭔가를 비난한다는 것, 엄격하게 비평하는 것 자체를 잘못이라고 말하는 것이 아니다. 모든 텍스트는 온갖 비평에 열려 있는 것이고, 또 열려 있어야 한다. 다만 내가 여기서 말하고 싶은 것은, 뭔가에 대한 네거티브한 방향의 계몽은 경우에 따라서는 여러 가지 사물을, 때로는 자기 자신까지도, 돌이킬 수 없을 정도로 훼손시켜버리고 만다는 사실이다. 그런 부정에는 보다 크고 따뜻한 포지티브한 '보상'같은 것이 마련되어 있어야 할 것이다. 그러한 뒷받침이 없는 네거티브한 연속적인 언동은, 즉효성이 있는 주사에 중독되는 것과 마찬가지여서, 일단 앞으로 나가기 시작하면 되돌릴 수 없다는 사실을 명심해두지 않으면 안 된다.


물론 내게도 작가나 작품에 대한 기호라는 것이 있다. 사람에 대한 기호도 있다. 하지만 그 옛날에 들었던 테네시 윌리엄스의 강의를 상기할 적마다 '역시 남에 대한 험담은 쓰지 말자.' 하고 절실히 생각한다. 그보다는 차라리 "이건 좋습니다, 아주 재미있습니다." 라고 말하고, 그와 똑같이 생각하고, 재미있다고 기뻐해주는 사람을 비록 소수라도 괜찮으니 발견하고 싶다. 이것은 와세다 대학 문학부가 내게 준 몇 안되는 산 교훈 중 하나이다.


그러나 오늘날의 이 즉흥적 사회에서 그런 유유한 태도를 유지하면서 살다 보면, 때때로 나 자신이 바보처럼 느껴질 때도 있다. 그보다는 목청을 높여서 통렬하게 누군가를 매도하는 쪽이 훨씬 더 스마트하게 보인다. 예를 들어, 작가보다는 비평가 쪽이 똑똑한 것처럼 보인다. 그렇지만 설령 개별 작가가 때로는 어리석게 보인다 하더라도(또 실제로 어리석다 하더라도), 무에서 뭔가를 만들어내는 작업이 얼마나 손이 가는 괴로운 작업인지를 몸소 경험하여 알고 있기 때문에, 그것을 한마디로 "저 녀석은 쓰레기다, 이건 허섭스레기다." 라고 매도해서 끝내버리는 일은 할 수 없다. 작품이 좋은 싫든간에. 이것은 작가로서의 내 생활 태도의 문제이며, 어떤 의미에서는 존엄의 문제이다.


 - 무라카미 하루키, 비밀의 숲 85, 86 페이지에서

2017년 10월 14일 토요일

타임서버에서 시각 가져와서 Unity 에서 사용하기 (NST, NIST)

NIST 타임서버에서 시간가져오기 (NST)

아래와 같은 코드로 가져올 수 있다.
Unity 에서 사용할 수 있다.


using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimeServer : MonoBehaviour {

    [SerializeField]
    private string _comment = "만료시킬 날짜를 적으세요 (한국시각 기준)";

    public int _yyyy, _mm, _dd;
    private DateTime _expireDateTime, _nowServerDateTime, _nowLocalDateTime;
    private TimeSpan _duration;

 // Use this for initialization
 void Start () {

        // 한국 시각
        _duration = System.TimeSpan.FromHours(9);
        _expireDateTime = new DateTime(Mathf.Clamp(_yyyy, 1900, 3000), Mathf.Clamp(_mm, 1,12), Mathf.Clamp(_dd, 1, 31));

        _nowLocalDateTime = DateTime.Now;
        _nowServerDateTime = GetNISTDate().Add(_duration);

        if (Debug.isDebugBuild)
        {
            Debug.LogWarning("만료지정일 : " + _expireDateTime);
            Debug.LogWarning("현재 로컬 시각 :" + _nowLocalDateTime);
            Debug.LogWarning("현재 서버 시각 :" + _nowServerDateTime);
        }

        if (_nowLocalDateTime < _expireDateTime)
        {
            if (_nowServerDateTime < _expireDateTime)
            {
                // Debug.Log("실행");
            }
            else
            {
                // Debug.Log("서버 체크 결과 만료 됨");
            }
        }
        else
        {
            // Debug.Log("로컬 체크 결과 만료 됨");
        }


    }

#region NTPTIME

    //NTP time 을 NIST 에서 가져오기
    // 4초 이내에 한번 이상 요청 하면, ip가 차단됩니다.

    public static DateTime GetDummyDate()
    {
        return new DateTime(2017, 12, 24); //to check if we have an online date or not.
    }

    public static DateTime GetNISTDate()
    {
        System.Random ran = new System.Random(DateTime.Now.Millisecond);
        DateTime date = GetDummyDate();
        string serverResponse = string.Empty;

        // NIST 서버 목록
        string[] servers = new string[] {
        "time.bora.net",
        //"time.nuri.net",
        //"ntp.kornet.net",
        //"time.kriss.re.kr",
        //"time.nist.gov",
        //"maths.kaist.ac.kr",
        "nist1-ny.ustiming.org",
        "time-a.nist.gov",
        "nist1-chi.ustiming.org",
        "time.nist.gov",
        "ntp-nist.ldsbc.edu",
        "nist1-la.ustiming.org"
    };

        // 너무 많은 요청으로 인한 차단을 피하기 위해 한 서버씩 순환한다. 5번만 시도한다.
        for (int i = 0; i < 5; i++)
        {
            try
            {
                // StreamReader(무작위 서버)
                StreamReader reader = new StreamReader(new System.Net.Sockets.TcpClient(servers[ran.Next(0, servers.Length)], 13).GetStream());
                serverResponse = reader.ReadToEnd();
                reader.Close();

                // 서버 리스폰스를 표시한다. (디버그 확인용)
                if (Debug.isDebugBuild)
                    Debug.Log(serverResponse);

                // 시그니처가 있는지 확인한다.
                if (serverResponse.Length > 47 && serverResponse.Substring(38, 9).Equals("UTC(NIST)"))
                {
                    // 날짜 파싱
                    int jd = int.Parse(serverResponse.Substring(1, 5));
                    int yr = int.Parse(serverResponse.Substring(7, 2));
                    int mo = int.Parse(serverResponse.Substring(10, 2));
                    int dy = int.Parse(serverResponse.Substring(13, 2));
                    int hr = int.Parse(serverResponse.Substring(16, 2));
                    int mm = int.Parse(serverResponse.Substring(19, 2));
                    int sc = int.Parse(serverResponse.Substring(22, 2));

                    if (jd > 51544)
                        yr += 2000;
                    else
                        yr += 1999;

                    date = new DateTime(yr, mo, dy, hr, mm, sc);

                    // Exit the loop
                    break;
                }
            }
            catch (Exception e)
            {
                /* 아무것도 하지 않고 다음 서버를 시도한다. */
            }
        }
        return date;
    }
    #endregion
}


아래 코드 원본에서 주석 변경 및 내가 사용하기 위해 수정함.
경로 : https://stackoverflow.com/questions/516788/getting-current-gmt-time