Oracleでの管理者パスワード探しとアカウントのロック解除

突然現れたORA-28000エラー。もしくは、ORA-01017 invaild username/passwordというメッセージを見たら? system権限だけが頼りになるはずだ。

WindowsでのOracle環境を前提として書いたものである。

アカウントがロックされました!

SQL> conn ID/パスワード
ERROR:
ORA-28000: the account is locked

このようなエラーが発生して、何の動作もできなくなる場合がある。

これは、連続でパスワードを間違ったときにアカウントがロックされるようになったからである。

こういう場合は、システムアカウントに接近して、解除する必要がある。

システムパスワードも知りません!

SQL> conn system
Enter password:
ERROR:
ORA-01017: invalid username/password; logon denied

一難去ってまた一難。この時はsysdba権限が対策として有効だ。

パスワード無しで入れるのが、不思議なことだが、OSでアドミン権限でログインされていれば、動作できるという。

システムの制御を乗っ取られたら、DBも一緒に無くさないように、sysdba権限に対する追加設定があとで必要になりそうだ。

次のようにしたのである。

SQL> conn /as sysdba
Connected.

結構簡単なものだった。

忘れたパスワード、変えらますか?

次に、それぞれのパスワードの設定をしよう。

SQL> alter user system identified by 새로운비밀번호;

User altered.

こういう方法で、新しいパスワードに設定はできる。systemのところに、hrなどアカウントを入れれば、すぐにパスワードは変更できる。

SQL命令と似たような気がする。

そして、ロックはどう解除するつもりですか?

少々お待ちを。はたして、アカウントは本当にロックになっているのか?次の命令でわかることができる。

SQL> select username, account_status, lock_date from dba_users

結果は長いから、わざと載せないようにした。

SQL> alter user hr account unlock;

User altered.

こうやって、hrアカウントのアンロックはできたのだ。

結論

  • パスワードは忘れないこと。
  • ロックにならないように、DBのアクセスも難しくしよう。
  • 絶対アドミンアカウントでOracleコンソールを開けないようにするか、sysdbaのセキュリティ設定を変えよう。

[번역글] 여성과 모바일 게임: 개발자들을 위한 학습

모바일 게임 제작에서의 시장 기회는 더욱 다양해지고, 포괄적이고, 매력적으로 변하고 있습니다.

지금 200만 개 이상의 안드로이드 장치가 존재하고, 이는 사람들이 예전보다 모바일 게임을 더 많이 한다는 것을 의미합니다. 모바일 게임 사용자의 증가는 특성, 수요, 게임을 할 이유를 늘어나게 만들어왔습니다. 우리의 지난 번 포스트 “누가 모바일 게임을 하는가”에서, 고정관념과 통계보다는, 게임을 할 수요가 충족되는 플레이어들을 마주할 기회에 대해 다루었습니다. 동시에, 게임 커뮤니티에서는 성별과 상호문화주의(inclusivity)에 대한 많은 토론이 있었지만, 그에 반해서 게임을 하는 여성에 대한 경험을 다룬 조사나 토의는 상대적으로 적었습니다.

우리는 이들을 더 이해하기위해, 미국에서 게임을 하는 여성에 대한 인식(perception)과 경험을 이해하기 위한 방대한 연구를 만들기 위해서 게임 지능 프로바이더 Newzoo와 파트너쉽을 맺었습니다. 우리는 다수의 게임 제작사, 비평가, 플레이어와 우리 연구를 문장화할 아카데미와 작업하였습니다. 이러한 상호적인 경험을 통한 이해나 우리의 발견에 대한 요약을 알아보는 것을 통해 이 내용을 파헤쳐봅시다. 개발자로서 여러분의 게임을 더욱 포괄적으로(inclusive) 만들고, 모든 플레이어들에게 어필할 수 있도록 만드는 법을 읽어보세요.

사용자를 알자

모바일 게임을 하는 여성은 플랫폼에 대한 선호도와 양적 의미로 둘 다 명확한 잠재 시장을 갖고 있습니다.  우리 연구 결과에서 미국에서 상당히 많은 수의 여성이 오늘날 모바일 게임을 하고 있습니다(10~65세 사이 65%). 이는 작년 영화관에서 영화를 본 사람(62%)과 책을 읽은 사람(44%)보다 높은 수치입니다. 여성이 다른 엔터테인먼트 형태보다 모바일 게임에 더욱 관여한다는 점은 분명합니다. 연구에 따르면 남성처럼 여성이 모바일 게임 플레이어의 절반을 차지하는 것으로, 모바일 게임을 할 가능성이 높습니다. 다른 플랫폼에 비해 모바일을 더 선호 할뿐만 아니라 여성도 남성보다 더 자주 플레이하는 경향이 있습니다.

게임 개발자로서, 당신의 게임을 여성이 플레이할 기회를 고려하고 있습니까? 여러분의 플레이어를 잘 이해하는 것으로 미개척 시장(untapped markets)에서 사업을 더 키워나갈 기회가 있을 수 있습니다. 그 첫 단계로 몇 퍼센트의 플레이어가 여성일지 측정하고 평가하고 싶으실 것입니다. 여러분의 플레이어 층에 여성이 나타나고 있습니까? 남성 플레이어와 비교해서 사용자 경험에 차이가 있습니까?

같은 점은 새로운 개발자에게도 대두됩니다: 여러분의 게임을 디자인하거나 미래 개발을 고려할 때, 플레이할 사용자 범위를 생각하는 연습은 ‘보편적인’ 플레이어를 중시하는 것보다 더욱 유용할 수 있습니다. 일부 플레이어들에게 유저 경험이 다를 수 있을까요? 사용자에 대한 철저한(thoroughly) 분석과 조사를 통해, 게임을 하는 여성과 같은 소외된(underserved) 사용자를 붙잡을 수 있는 잠재적 강력한 사업을 만들 수 있습니다.

더 포괄적인 게임을 만들기

Google Play에서 인기 있는 게임을 보시면, 대부분의 이미지와 아이콘은 여성이 게임에서 상대적으로 틈새 시장이라는 것을 나타냅니다: Google Play에서 수익을 창출하는 상위 100개의 게임 중에서 앱 아이콘으로 남성 캐릭터인 경우가 여성 캐릭터인 경우보다 44%나 더 많았습니다. 결과적으로 연구는 여성이 게임을 활발하게 함에도 불구하고, 이런 그룹에 속하지 못한다고 느낀다는 것을 알았습니다. 차별화되거나, 소외감을 덜 느끼는, 도안, 캐릭터, 그리고 사진 등을 써서 다른 경쟁작들과 차별화하여 판매를 촉진하고, 잠재적 플레이어에게 도달할 수 있도록 하세요. 아래와 같은 팁을 시도해보세요:

  • 스토어 리스트 실험을 할 때 더 포괄적인 그림을 테스트하세요.
  • 아이콘, 스크린샷, 비디오에 주의를 기울이고, 스토어 환산율에 대한 다른 이미지 테스트를 고려하세요.
  • 여성 캐릭터를 런칭하는 것을 생각해보거나, LiveOps를 구동하는 새로운 걸 테스트해보세요.
  • 사람들이 캐릭터와 공감하는 방식을 추적하고, 진중하게 커뮤니티 피드백에 귀기울이세요.

다양한 팀 육성

잠재적인 사람들의 다양한 요구를 충족시키는 제품을 만드는데 필요한 공감과 견해를 갖는 것은 무척 어렵습니다. 자신이 하고 싶은 게임을 만드는 것이 인간의 본성입니다. 잠재적 편견을 줄이려면, 게임 라이프사이클 전반에 걸쳐 여러 단계에서 잠재 플래이어의 광범위한 표현에 대한 피드백을 요청하세요.

또한 개발 팀의 프로필은 다양한 플레이어에게 어필할 수 있는 게임을 만드는 능력에 영향을 줍니다. 여성이 게임을 많이 하고 있음에도 불구하고, 남성이 게임 산업에서 과장되고 있습니다: IDGA에 따르면, 전세계에서 게임 산업의 고작 27.8%만이 여성, 트랜스젠더, 그 외 사람들입니다. 우리에게 응답한 단 23%의 여성과 40%의 남성만이 게임 산업 전반에 동등한 대우와 기회가 있다고 대답하여서, 불균형된 표현이 플레이어들에게 느껴지고 있습니다.

팀 구성원들의 다양한 시각은 넓은 잠재 고객층에게 어필할 수 있는, 진정으로 혁신적이고 흥미진진한 게임을 만들 수 있게 합니다. 팀을 보고 사용자 구성과 비교해보세요. 여러분의 팀이 사용자들을 대표하고 있습니까? 잘 구성되어서 모두에게 어필할 수 있는 게임을 만들 수 있고, 최대의 잠재 고객을 붙잡을 수 있습니까?

이 기회를 활용

모바일 게임을 즐기는 여성의 엄청난 잠재력에도 불구하고, 플레이 습관을 이들이 진정으로 받아들이는 것은 드물다는데 유의할 만합니다. 몇몇 주목할 만한 예외를 제외하고는, 여성이 게임 세계에 속하지 않는다는 인식이 있습니다. 친구들과 게임 이야기를 하거나, 콘텐츠 비용 지불을 하거나, 기꺼이 비용을 내려고 잘 하지 않을 것입니다.

이것이 게임을 하는 여성과 진정으로 소통할 수 있는 좋은 기회라고 생각합니다. 사용자 획득 비용이 증가한 지금, 모든 플레이어와 공감하고 달아오를 수 있는 게임을 만들 수 있는 가능성을 생각하세요.  이것은 여성이 게임에 관여하는 장벽을 인식하고 해결해야만 가능합니다.

앞으로 나아갈 길

스토어 성장과 모바일 게임이 더욱 플레이어에게 다양하고, 포괄적이고, 관여하게 만들어질 좋은 기회가 있다고 생각합니다. 이 기회를 활용하기 위한 첫 단추는 다음과 같습니다.

  • 고객을 파악하세요: 현재와 잠재 고객
  • 게임이 일부 잠재 플레이어를 배제하는 부분을 알아보세요.
  • 팀의 관점과 이것이 게임에 미치는 영향을 평가하세요.
  • 모든 플레이어가 받아들일 수 있는 차기 게임을 만들 수 있는 구상을 하세요.

모바일 게임은 모두를 위한 것입니다. 게임을 하는 여성과 크리에이터로서를 격려하고 힘을 실어주기 위해서, 우리는 게임의 다양성을 촉진하고, 게임을 하는 모든 여성을 격려하고, 진행하는 연구, 프로그램 개발, 파트너쉽을 통해 게임 제작자들의 다음 세대를 지원하는, 새로운 Google Play 이니셔티브인 게임 체인지(CHANGE THE GAME)를 출시합니다.

모바일 개발자로서, 여러분은 미래의 게임이 어떠할지 커다란 영향력을 갖고 있습니다. 여러분이 우리 노력에 참여해서, 게이밍 세계가 더욱 포괄적인 공동체가 되길 희망합니다. 우리 모두 기여하게 되면, 모바일 게임은 오늘날보다 더욱 즐거워질 것입니다.

어떻게 생각하십니까?

개발자가 더욱 포괄적인 게임을 개발하는데 대한 생각이 있으십니까? 원본 댓글에 참여하시거나, 해시태그 #AskPlayDev 로 트윗하시면 Google Play에서 성공하는 방법에 대한 뉴스와 팁을 공유하는 @GooglePlayDev 가 답변해드릴 겁니다.

출처: https://medium.com/googleplaydev/women-and-mobile-games-learnings-for-developers-cc4ac63da3f2

염가 임대료

東京23区の家賃相場 間取り別最安値ランキング【2017年度版】

このポストはリンクを翻訳したものです。
日本語は出所をご覧ください。

出所: https://sumaity.com/press/128/

WebSocket 今日の困惑事例

ブラウザのデベロッパーツールを見ると、まず見えるのはインスペクター機能ですが、それ以外にもネットワークという実用的なタップがあります。

主に、アプリを作るとき、ウェブの情報を持ち出すにはHTMLの要素を分析するのも方法の一つですが、スクリプトを通じてリアルタイムで情報を非同期で持ち出すことの方も珍しくないからです。

特に、有益な情報はスターチックの場合はあまりありません。

 

この場合、ネットワークでは特に何も見つかったHTTPパケットがないのに、活発にデータの更新が行われることがあります。

最近、流行っている仮想貨幣の価値はリアルタイムそのものではないと、まったく意味がありません。リフラッシュなしに、すぐに確認できますね。

これは、HTTPコネクションを通じて非同期でダウンロードは負担が高いので、HTML5で導入されたWebSocketというものが使われているそうです。

WebSocketはコネクトの待機時間とヘッダーの伝送が不要になるため、素早くリアルタイムで情報を受信するのに向いています。

こういう流れとともに、ブラウザでのサポートツールも増えています。

Chromeは代表的な事例で、Canaryから披露した機能はもう正式バージョンにも載せられ、WebSocketの分析は今すぐできます。

しかし、その画面には何もありません

 

 

Nothing Here
Nothing Here

これをどうすればいいでしょうか。

Chromeのインストールがうまくできてないのか、そう悩むしかありませんで敷いた。

Firefoxもネット上では可能だと書かれておりますが、最新バージョンに合わないので、プラグインのインストールができませんでした。

そして、ついにたどり着いた「今回のオチ」は次のようになります。

 

 

Chrome Dev Tools WebSocket
Chrome Dev Tools WebSocket

出所: https://stackoverflow.com/questions/44533111/chrome-59-websocket-frames-no-longer-visible-in-devtools

 

もう言葉が必要ありません。無事で、データの分析を終えました。

 

これからの問題はこれをどうやってクライアントから接続するかですね。

できたら、ここに方法を整理してみましょう。

 

갑자계산

C#で干支の計算式を建ててみよう

干支 : 十干と十二支を組み合わせた60を周期とする数詞です。

始まり

60の干支を並んだ資料は簡単に手に入れますが。これを直接計算する方法について押してくれる資料はあまりありません。

最近はJavaばかり学んでいるカリキュラムなので、もともとしていたC#をすべて忘れては困るので、C#の知識と経験を少しでも生かしてみないとと思いました。

それで、タイムアタックのように挑んでみました。目標は三十分です。

アプローチ

数学的に美しい方法を探るのもいいことですが、アレイの特徴を活用することにしました。

いつ見ても、また理解できるし、難しくないコードがいいですね。

まず、干支をアレイとして書いてみます。

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は?

このブログでは韓国の場合を想定しています。例示や説明が日本と合わない部分にご注意ください。

Webホスティングが万能ではないこと

Webホスティングはなかなか単純なサービスです。ただ、サイトが欲しいと思ってホスティングサービスに申し込めば、安い価格でセッティングしてくれます。

例えば、韓国のホスティングサービスであるCafe24の場合には申し込み代がありますが、月に約50円くらいです。FTPで接続して、ファイルさえアップロードしたら、ホームページの出来上がりです。

この過程も省略するため、WordpressやゼロボードXE、他の掲示板ソフトもサポートしてくれるサービスが少なくありません。こういう場合、キーボードをあまり叩かなくても早速サイトの完成ですね。

ところが、そうして自慢の自己紹介サイトを作り上げたKさん…(いきなり実例の登場?)
彼はディスクの容量だけを考えて、最低プランでWebホスティングを申し込んだ後、自分のポートフォリオサイトでアップロードして、面接の履歴書をあちこちに叩き込んで、就職活動に突入しました。

ある日、就職コミュを訪れたKさん。

ある企業の担当者の共有で自分のサイトが優秀事例として書かれておりましたので、誰にも知られずに喜んでいました。
そして、それから数時間後、たった四つ目のコメントで思ってもみなかった内容を目にすることになりました。

入れませんが。

あれ?として、自分のポートフォリオのサイトを入ってみたら、迎えてくれたのはこのページでした。

Cafe24のトラフィック超過のお知らせ
Cafe24のトラフィック超過のお知らせ

あたふたプランのアップグレードのために比較してみると、なんと、価格は月に数千円ぐらいに急上昇します。トラフィックのリセットもあまり安い方法ではありません。

十分なトラフィックと余裕のあるスペース、この二つを狙うには、やはり家の中の個人サーバーでしょうか。
そしたら、電気代はどうなるんでしょうか。

VPSは少しスマートであればメリットあり

そういうKさんは知り合いからVPS1のことを聞きました。VPSというのも初めてなのに、聞いてみれば、リモートに自分のサーバーが一つできるらしいですね。

Hostingサーバーとは何が違うかとしたら、これは完全にパソコン1個ができるそうです。

月に数万円から十万円もするサーバーホスティングとは違って、これはサーバーを分けてまたサーバーにする仕組みです。

サーバーを一つのコンピューターのの中で分けられるのは、仮想化技術の進歩に秘密があります。
パソコンの中のパソコンでコマンドを別途に処理しなければならなかった過去とは違って、CPUと主な装置が最初から仮想化に備えて作られているので、性能の損失を最少2にするそうです。

サーバーを借りるのだから、価格も半端ではないと思いますが、サーバーは自分の好きなままに使えるので、場合によっては有利なところがあります。特に、基本トラフィック提供量が少なくないことが魅力です。

繰り返して説明することになりますが、最初のトラフィック容量だけでも、ほとんどのWeb Hostingサービスの最高プランに匹敵します。3

しかしVPSが全員の答えではないこと

たしかに、コストパフォーマンスがいいというのは分かるものの、だとして特に知識を持ってない人がVPSから持つことになったら、接続から戸惑うことになります。

やっと接続しても、インストール直後のUbuntu4の黒い画面は困惑そのものです。

せめて、Windowsのインストールは何度かしていて、コンピューターとソフトに関した概念がある程度ある人なら、コマンド5と関連ソフトに慣れることで熟達できるようです。(いつも忘れてしまうことがみんなの問題ですね)

 

だから、黒い画面でLAMP(Linux+Apache+MySQL/MariaDB+PHP)あるいはLEMP(Linux+nginX+MySQL/MariaDB+PHP)の構成はできなくちゃですね。もちろん、これについての講座はいろいろありますので、従うことでなかなか手軽にできます。

ただし、問題解決でまた挑戦になると思います。きっとPermisson(権限)問題がみんなを苦しめることになります。
それ以外にも、問題の原因を把握するのに苦労するとしたら、サーバーを運用しようとしてから、習うことばかりになったと苦情が増えるかもしれません。

主なサービス会社の比較

実はVPSのサービスは世の中に多くあり、下のサービスよりよくて、メジャーな会社もあるでしょう。

しかし、どこまでも自分の意見を披露するため、直接解説してみた(お金がかかった)所だけを並べました。

ConoHa

VPS Conoha
VPSならコノハ!
모에한 미유키
萌え萌え美雲このは

conoha.jp
萌えページ6

コノハは日本のGMOインターネット株式会社で運営している仮想サーバーホスティングサービスです。親企業も丈夫だとのことで、ここはなによりも無制限トラフィック7が特徴です。

グロバル営業も活発になっていて、韓国語も当然のようにホームページと管理コンソールでサポートしております。

しかし、用途以外の使用か、DDoS攻撃の的になったら、一方的にサービスが解除されるし、これを解決するにはすごく難しいと言われます。

それに、メールで日本語と英語の問い合わせもできますが、韓国人には高い壁となるのは電話での日本語ですね。

100Mbpsの回線のみ使用されていますので、少々残念なところです。でも、Pingとサーバー演算はまた回線とは別の問題です。

変にドンくさいところがあります。東京を選んでもそうです。それに、これが時間により変わってくるのが、オーバーブッキング8が疑われる部分があります。

利用金額はクレジットでチャージするか、クレジットカードをリンクできます。

サーバーをオフにしても、維持費用が同じくかかります。

ConoHa 컨트롤 패널
ConoHa コントロールパンネル
ConoHa Japan Plan
ConoHa Japan Plan

メリット

  • CPU 快適
  • 贅沢なトラフィック
  • オタク向けのデザインあり(別のメニュー)。 オタクではない人は普通のメニューが基本。

デメリット

  • 不思議な遅さ。不定の接続スピード、高いPing
  • 問い合わせ、問題の解決が難しい。親切なのに事務的な職員
  • 機能が多いようで、実は少ないウェブコンソール。APIを利用したらできることは多い方だが、入門者には向いていない
  • リモートビュー(リモート サーバー グラフィック 表示)なし。SSH不具合でもあったら接続不能。

ぶっちゃけ、オタク向けかどうかよりはスピードが大事でしょう?

Vultr

Vultr
Vultr

vultr.com

Vultrは他のVPSサービスより歴史は短い方ですが、長いアップタイムで高い信頼度を誇っています。

問題があったら、すぐに保障のクレジットをくれるし、普段から勧誘者リンクで、Paybackも可能なお得な政策を持っています。

リンクを通じて申し込むと両方割引してくれたごろもありましたが、今は特にイベントがないようです。サイトを直接見てください。

管理コンソールは簡単で、必須要素全部含んでいます。

Snapshotセーブに課金がありませんし、リミットも特に決まっておりません。サーバーのインスタンスを複製するにも使えるし、問題があったとき、Rollbackする一番容易い方法です。Snapshotの生成と適用(復元)も5分ぐらいで終わるくらいです。

10Gbpsの速い回線でサービスしているので、全世界に広まっているサーバーどこでも選んで作ればいいです。

New Jerseyでは無料でブロック ストレージを提供しています。ブロック ストレージをリンクすると追加ハードディスクを繋げたように、拡張できて、データも安全に保管できます。

東京のサーバーもありますので、ConoHaと同じく使用できます。しかし、ここも回線は速いのに、サーバーのオーバーブッキングが疑われます。回線の状態はテストサイトで直接確認できます。

利用金額はクレジットをチャージするか、クレジットカードを使えます。

サーバーをオフにしても、課金されます。

メリット

  • 楽な管理者コンソール
  • 贅沢なクレジットカード提供。ダウン時間の保障
  • Web上でサーバーグラフィックコンソールの提供
  • スナップショットの生成可能。リミット無し

デメリット

  • 我慢できるほど遅い
  • 東京地域の高い使用率、低いサーバー準備率(オーバーブッキングの予測できるAvailability Low表示)
    • 太平洋渡って、アメリカ東部のNew Jerseyと変わらない時もあるくらい

Somagu

Somagu
Somagu

somagu.com

SomaguはMudfishを運営しているミクラジネットワークスという会社を建ててから、カスタムVPSサービスを2017年始めました。

淡々なデザインと機能に比べて、NoVNCなどいろいろな方法でサーバーをコントロールできるようにしています。高性能にオプションを上げても、高い費用を要求しません。趣味でしょうかね

信頼できる韓国のISPであるKTの回線で、スピードは快適な方です。

サーバーの場所が田舎だと言われていて、運営者とも距離があるそうです。フォーラムでの問い合わせの回答は三日以上かかるのが自然です。

これにもメリットがありますが、管理UIにない機能でも、納得できるくらいなら、直接見てくれるところです。潜在なカスタマイズが必要ならば、こちらも是非使ってみることです。対応言語は韓国語と英語です。

メリット

  • コストパフォーマンスの優れているところ
  • 韓国では最適なスピード (KT網)
  • Tossでクレジットが買える

デメリット

  • 遅い問い合わせの対応
  • 不安なアップタイム、電気問題
    • 地域が田舎なため、余儀なく点検したり、あまり無誠意な電気会社の製作。
    • 一部のサーバーに問題が続いていて交換中なので、一時的にハイクラスのプランがなくなっている
  • 管理機能の不便
    • スナップショット生成無し
    • 管理コンソールではパソコンのオンオフ、リモートアクセス情報提供くらいがすべて
  • スイッチを通るのに、独立した気がしない
    • 同じ外部ポートを複数のユーザーが使えない
    • 20個に限られたポート数
    • 80 / 443はHTTP仮想ホスト方式でマップ (Webサーバーとして問題なし)
    • すべてのコネクションは10.0.0.1だと表示。訪問者の見分け不能。(X-Forwardedもない)

IwinV

IwinV
IwinV

iwinv.kr

2002年から始めて、長年発展し続けていたノーハウを持っている会社で、2014年赤字のアイビホストも引き受けるなど、積極的にビジネスの領域を広めています。VPSはiwinvというところで管理しています。

このサービスの利点は幅広いオプション、安い価格です。

メリット

  • 仮想コアー、リアルコアー、独占コアー三つの分類になっている詳細スペック
    • 仮想コアーとは、CPU Coreを仮想でまた分けたのであって、多数のユーザーに提供するための方法です。他の使用者のコアー使用率により、パフォーマンスは違います。
    • リアルコアーの使用はCPUが仮想化による性能の損失(10%以内だと言う)のみに限られ、他ユーザーに関係なく利用できます。9
    • 独占サーバーが当然もっとも高いが、他者より安い方
  • ポートの開放、リソース現状の把握などをして異常状態のお知らせができる
    • ただし、テキストは発想費用があるので、Telegramが進められます。

デメリット

  • あまりプロモーションがないこと

結論

VPSというのが安くなり、可視化されたばかりなので、なかなか情報を得ることは難しいと思います。

しかし、Linuxに前より馴染んで、大型サーバーに依存しない自分だけのセキュリティー対策を工夫するには、もう避けられない流れだと思います。

なのに、それはどこまでも自分に合うかどうかを確かめてから決めることでしょう。数人がそろって、一つのVPSに挑んでみることも柔軟な使用方だと思います。

現時点ではこのサイトはIwinVを使用しております。

Galaxy Note 7

[翻訳]aptX vs. aptX HD: 何が違う?

3.5mm ヘッドホンプラグが絶滅の寸前の今、aptX HDが変化を見出します。

Bluetoothについて読んだ人なら、数多い英語と数字で秘密まみれのスペックに呆れたはずです。この中から、一番最新のものはaptX HDですが、変な名前の後にHDが付いています。HDが高鮮明だというのは皆様もご存じだと思いますが、ではaptXは何でしょうか。aptX(高鮮明を含めて)がaptX HDとは何が違うでしょうか。

こういうことが気になるのはあなただけではありません。一緒に調べましょう。

aptXとは何?

hbs910
hbs910

aptXは352Kbpsで4:1圧縮率で16ビット/44.1kHzのオーディオとの伝送ができるBluetoothオーディオコーデックです。

あまり役に立つ内容ではありませんが、これが皆様の気になるaptXのスペックです。これは(皆様の携帯やパソコン、A/Vレシーバー、その他のBluetoothオーディオの伝送可能な)デバイスがオーディオを“CD水準”音質で伝送するということです。オリジナルのサウンドがCD音質以上なら、サウンドはより豊かに聞こえます。

もともとのaptXコーデックはCD水準の音質を約束して、それにほぼ同じく到達しました。

CD音質と“CD水準”音質の違いに注目することです。これは圧縮のためにできた表現です。aptXは他のBluetooth オーディオ コーデックのように、オーディオを送って装置(皆様のヘッドホンや他のスピーカー)でを受け取るに圧縮と解除が使用されます。データを圧縮して送らなければならない理由は、Bluetoothがステレオ オーディオの伝送には十分に速くないからです。aptXコーデックは音の遅延を減らすのに重点を持ちました。

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

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

続きを読む “[翻訳]aptX vs. aptX HD: 何が違う?”

PocoTube on Omnia II

PocoTube (2010)

PocoTube on Omnia II
Omnia2 PocoTube App

オフライン状態で、選択した路線での電車の位置を教えてくれるWindows Mobileアプリ。

 

開発動機

韓国ではPDAフォンからスマートフォンに移動する過渡期に、相変わらず地下鉄アプリはただ駅の間の所要時間を重ねて計算することだけであった。ソウルに地下鉄9号線が2009年開通した以降、韓国にも急行概念が人々の混乱を招くことになった。1そして、どの電車が速いか、より高度の情報提供が必要になった。そういうニーズを満たせるアプリを一人で作ろうと決めた。

続きを読む “PocoTube (2010)”

excercise1

簡単に解いてみるJava急テスト

よりにもよって、季節の変わり目で、鼻水で頭はフラフラしている最中ですが、Javaの実力検証のためのテストを受けることになりました。

みんな解けるくらいの簡単なものだと言いましたが、必ずしもみんなそう思うわけにはいかないので、長い時間があっても手間取っていた人もいました。

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()もいいアイデアですね。

続きを読む “簡単に解いてみるJava急テスト”

[SCITマスター作文] 2017年12月18日

IT業界の10年後はどのようになっていると思いますか。

あらかじめ

  • この主張は論理の展開のために選ばれたもので、自分の考えと一致しているとは言えません。
  • 日本語で書いてから、韓国語に翻訳する順になりました。

作文

私はすべての都市がIoTによって、理できる時代になっていると思います。

なぜなら、ITの進歩により、一つ一つの各要素に自己管理異常の報告を任せるようになって、人手がかからない施設のメンテナンスができるからです。

たとえば、私が実際展示場で見たものでは、スマート・マンホールがあって、圧力や温度、水量などがリアルタイムでわかることがあります。難しい工事がなくても、無線で可能だと言われました。

ですから、私は経済的なIoT都市ができていると思います。

先生の修正コメント

.

感想

.

spring

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

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

Spring MVC 범위

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

続きを読む “[번역글] Spring MVC 모델과 세션 애트리뷰트의 이해”

正規表現レファレンス

はじめ

正規表現(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;

レファレンス

続きを読む “正規表現レファレンス”

yeon.me TLS

[翻訳] SSLとTLSの配布のベストプラクティス

SSL / TLS驚くほど簡単な技術です。配布しやすいし、ダメな時以外はただスムースに動作します。ただ、問題は暗号化は普通性格に配布しにくいところです。TLSが適切な保安を保証するためには、システム管理者は必ず正しいサーバー設定とアプリの配布に気を引き締めなくてはなりません。

2009年、TLSがどう使われているか、TLSツールとドキュメントをどうやって改善するかを知るために、私たちはSSL Labsで働き始めました。その結果、いくつかの目標を達成しました。TLS使用に対する世界的な統計とオンライン評価ツールを作りましたが、ドキュメントの不足はまだまだ見えています。この文書はこの問題の解決のための第一歩です。

私たちのゴールは安全なサイトとウェブアプリケーションを配布するために、管理者とプログラマーができる限り最少の時間をかけるように、明確で簡潔なマニュアルを提供することです。明確さのために、私たちは完成度を削って、そして特定のトピックも飛ばしておきます。実用的で習いやすくするのにポイントを置きました。もっと詳しい説明が必要な方には、第6章から役に立つ情報を提供します。

yeon.me TLS

続きを読む “[翻訳] SSLとTLSの配布のベストプラクティス”

[SCITマスター作文] 2017年12月11日

ドラえもんの新しい道具を発明するとしたらどんな道具が欲しいですか。

あらかじめ

  • この主張は論理の展開のために選ばれたもので、自分の考えと一致しているとは言えません。
  • 日本語で書いてから、韓国語に翻訳する順になりました。

作文

私はドラえもんの新しい道具を発明するとしたら、「何でも残せる思い出のディスケットフロッピ」が一番欲しいと思います。ここで「ディスケット」は何故か「USB」より慣れた気がしたので、決めてみました。

なぜこの道具が必要かというと、今の道具であるカメラやレコーダー、カムコーダーは限界があるからです。「思い出のディスケット」さえ持っていれば、いつでもその時に入って、体験ができます。首を動かしたり、歩き回ったりして、その記憶をずっと楽しんでみたいと思ったときは誰でもあるはずです。

もし、私がこの道具を使えるとしたら、旅行の時をまた体験したいです。なかなか行けない、アメリカの眩しい砂を歩いてみるのは、夢とは段違いでしょう。

ですから、私は記憶を形にする「思い出のディスケット」が欲しいと思います。

先生の修正コメント

いいですね~ 私もその道具一度使ってみたいです!いつに戻ろうかな…

感想

自分も知らないままで、書き込まれる作文もあります。これはまさに自然そのもので書かれました。しかし、漢字の間違いにも鈍くなるのは気を抜けてはいけない理由です。

Ubuntu 16.04 + NginXにTomcatを載せてみよう

Tomcatはその生まれながらApacheとのお揃いという気分なので、Nginxのインストールのとき、まったく考えたことがなかった。

しかし、SCITマスターでも習い続けているので、いずれにせよ講義室のパソコンをサーバーに出せないので、Nginxが起動されているこのサーバーにJSPの機能を追加することが一番自然な流れだと思う。

Cafe24という韓国のホスティングサービスでも一時はサービス中断になるほど、古い技術だが、PHPと共存することもあるらしい。

やはり、PHPのバージョン4あるいは5みたい古くなり、伝統さえ感じてしまいそうだが、こちらもレガシーとかなんとかで、バージョンを全部同時に配布している。

すでにNginxが設定済みであると仮定する。

  1. Tomcatをインストールする。
    1. # apt-get update
      # apt-get install tomcat8
  2. はいっ、ここでインストールはおしまい。
  3. 手早くhomeディレクトリから、ウェブルートに入るために、シンボリックリンクを作る。
    1. # ln -s /var/lib/tomcat8/webapps/ ~/webapps
  4. Tomcatが起動中か確かめて、起動してない場合、実行する。
    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とServletがスムースに動くのが見えたら成功だ。

Remote FXを有効にして、設置、設定する方法

このドキュメントはリモートデスクトップとHyper-Vセッションで、 RemoteFxを有効にする方法について説明します。これにより、ユーザーはRemoteFXの技術を使って、より進歩した経験ができます。

要求バージョン

  • RemoteFXが可能なWindowsベースOS (2008 R2、2012、2012 R2など)

説明

次の情報は様々なMicrosoftの資料から収集されたものです。要するに、要求事項と、セッションあるいはVMベースのRemote Desktop Services(以下RDS)のリリースの時、RemoteFXを有効にする方法と設定を表します。

セッションベースのRDSの配布

セッションベースのRDSの配布に必要なもの

  • RemoteFXサーバーのプロセスはストリーミングSIMDエクステンション2(SSE2)命令をサポートしなければなりません。
  • RDセッションホストサーバーとクライアントの間にLAN速度のコネクションがおすすめられます。

設定

リモートデスクトップセッションホストロールが必須です。
(サーバーマネージャー > 役割と機能の追加 > リモートデスクトップサービス > リモートデスクトップセッションホスト)

ローカル グループ ポリシー エディター

ローカル グループ ポリシー エディター

続いて、次のグループポリシーを設定します。 (gpedit.mscをアドミニストレーターの権限で実行します)

コンピューターの構成\管理用テンプレート\Windows コンポーネント\リモートデスクトップ サービス\リモートデスクトップ セッションホスト\リモート セッション環境

設定

  • 色の解像度を制限するクライアント互換または32 ビット設定
  • RemoteFXを有効にする

リモートデスクトップセッションホスト設定からでも、カラーの設定はできます。

RemoteFXサーバーを再起動しなければなりません。

VMベースRDSの配布

VMベースRDSに対する要求事項

  • Hyper-VベースVMの配布
  • SLATができるプロセッサー (Intel: Extended Page Tables (EPT), AMD: Nested Page Tables (NPT))
  • GPU (RemoteFXサーバーにすくなくとも一つ以上のGPUがついていること。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年の付き合いがなかったら、私は狭い世界から抜け出せなかったと思います。そして、その人に韓国という存在を考えさせるてもらえる形になって、私は誰よりも影響を受けたり、また与えたりしたのではないかと、今はそう思っています。

先生の修正コメント

幼い頃からそのような経験ができてよかったですね!

一分に縮めよう

私は隣に住んでいた日本人家族の全員だと思います。特に、おじさんとその娘さんは、私が日本について興味を持つようになったきっかけ、そのものでした。
なぜなら、手振りと単語を交えながら、丁寧にコミュニケーションをしようとする真剣さに、私が日本語を習ってみようとする理由になったからです。
たしかに、隣に外国人が住んでいたことは普段ありうることかも知れません。しかし、軍隊に入ったとき、その娘さんが韓国語を含む返信してくれました。遠くからみてくれているという事実だけでも、大変な状況の中、心が癒されることがあると初めて気づきました。
初めての日本人家族との10年の付き合いがなかったら、私は狭い世界から抜け出せなかったと思います。

感想

.

[SCITマスター作文] 2017年11月27日

最近よく国際化やグローバル化という言葉が使われていますが、本当の国際化とは何だと思いますか。

あらかじめ

  • この主張は論理の展開のために選ばれたもので、自分の考えと一致しているとは言えません。
  • 日本語で書いてから、韓国語に翻訳する順になりました。

作文

私は本当の国際化とは何だと思うかというと、まるで同じ国のように互いにバリアーがなくなることだと思います。

なぜなら、人々の心が割られた分けられたままでは、常に行われている貿易さえ、争いの種になりがちだからです。関税をいくら減らしても、互いの利害の均衡を取ることは、危ういことです。

そこには、心の問題もあって、国という価値観にはめられてしまい、喧嘩になることもあります。私はネットでコメントやツイッターのつぶやきで、国と自分を同じ目線で見ながら、余計なことを言いまくるところをよく見たことがあります。

グローバルが次なる時代に進むためには、経済と政治の他に、人々が他国を他者に見ないことから始まらめなければならないと思います。

ですから、本当の国際化とは、心のバリアーがなくなることだと思います。

先生の修正コメント

構成があまり良くないですね。

話題がネットや貿易など一つに絞られていないのが気になります。

2段落目は貿易が盛んになって経済的にはグローバル化がすすんでいるが、心理的・精神的には進んでいない

3段落目はネットでの例

というように書いてはどうでしょうか?

書き直し

私は本当の国際化とは何だと思うかについて、私たちが今目の前に実感している概念とは違うところがあると思います。これはいったい何を言うのか、はっきり一言で表すには難しいところがありますが、いずれにせよ、避けられない未来でもあります。もう始まった国際化の過渡期だからある問題を乗り越えることだからです。

まず、今までのいわゆるグローバル化の問題は、強国によって左右されることが多かったところです。歴史的に強国はテクノロジーとパワーを武器にしたけど、今は経済と文化が世界を支配する原動力になってきました。艦隊に脅されていた時代から、アイフォンやウィンドウズなどがなければ、生活が成り立たない時代に変わりました。

しかし、情報の交流はこれをひっくり返そうとしています。弱小国や団体から行われる革命やテロは、さらなる危機を生み出しています。実在する暴力がなくても、変化は感じられます。国境もないと言っていたネットでは、人々は国で分けられて、いつも争っていることはすぐ見られます。これは他国人を警戒して、他者にしか見ていないからではないでしょうか。

ですから、これからは、共存を語らなければなりません。本当の国際化とは、地球上の世界人という認識を個人一人一人がしていて、ともに気楽にあらゆる問題を解決していくことだと思います。

感想

初めてのリテイクでしたのが、すごくショックでした。書き直すことで、文章の構成はよくなったと思いますが、その難易度と抽象的表現は発表の途中、散々口を噛んでしまうことになりました。何とか誤魔化したことでしょうか。

[SCITマスター作文] 2017年11月20日

韓国の大学進学率は70%以上と言われ、世界でも最高レベルですが、あなたには大学進学率が高いことはいいことだと思いますか。あなたの意見を述べてください。

あらかじめ

  • この主張は論理の展開のために選ばれたもので、自分の考えと一致しているとは言えません。
  • 日本語で書いてから、韓国語に翻訳する順になりました。

作文

私は、大学の進学率が70%を超えていることについて、社会的には問題がないと言えないと思います。なぜなら、大学に入るための努力や費用などがあまりにも多く求められているからです。ここまでしても、卒業したら、大学の専攻をほとんど生かすことはありません。使わないまま、「大卒」というタイトルしか残らないということです。私も私を含めて、友達も全員に近いほど、専攻を深く考えたことがなく、成績に合う大学と専攻を選んで、今は厳しい就職難で、まったく別の仕事をしています。

大学は学問の先端であり、養成所とは違います。ですから、私はただ進学率が70%を超えていることはよくないと思います。

感想

大失敗のスピーチでした。話に進みがまとまらなくて、言葉にしてもピンと来なくなり、自分がさっき何を言ったか忘れてしまうくらいでした。

[SCITマスター作文] 2017年11月13日

学校の教科を一つ増やすなら

あらかじめ

  • この主張は論理の展開のために選ばれたもので、自分の考えと一致しているとは言えません。
  • 日本語で書いてから、韓国語に翻訳する順になりました。

作文

学校の教科を一つ増やすなら、どんな教科が必要かというと、なによりも社会常識が必要だと思います。これは、生活で知らなくてはいけない家庭経済、制度、法律などを含める教科で、社会という総合教科とは違いがあります。

この教科がなぜ必要かというと、私たちが住んでいる社会は、すべての知識と制度を理解しているという前提で成り立っているのに、それに対して、私たちはあまりにも法律を知っていない知らないからです。

たしかに、法と制度、経済は常に変化を重ねていくものだから、学校で学ぶことは難しいと思われるかも知れません。しかし、たまにニュースで初めて知ってしまうよりは、予め常識として、知っていた方がいいと思います。

感想

思った以上に発表がスムースにできた週でした。話になってもおかしくない構成が必要な理由を知りました。

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

Ajenti 설치

시스템 현황을 보여주는 ajenti 콘솔은 강력하고, 유용하게 쓰일 수 있다. 콘솔에서 처리해야할 상당 부분을 건너뛸 수 있고, 현재 서비스가 잘 돌고 있는지 위젯을 만들어서 직접 관리할 수 있다.

공식 사이트는 이곳이며, 설치 매뉴얼이 있긴 하나, 정말로 부실하므로 큰 도움이 되지 않는다.

$ curl https://raw.githubusercontent.com/ajenti/ajenti/master/scripts/install.sh | sudo bash -s -

이걸로 충분하다고 한다.

python 의존성 관련된 오류가 발생하는 경향이 있다. 다행히 별 문제가 없었지만, 케이스가 발견되는대로 여기 내용을 추가해나가야겠다.

설치가 완료되면, sudo 권한을 얻지 못하는 문제를 해결해야할 필요가 있다. 다음 명령으로 conf 파일을 편집할 수 있다.

$ sudo nano /etc/ajenti/config.yml

바인드 포트를 잘 확인하고 지정한다. 기본 포트는 port: 8000이라고 되어 있듯이, 8000번 포트를 사용한다. restricted_user: 계정 이름 이렇게 입력해주고 저장해야만 나중에 1 incorrect password attempt 오류를 피할 수 있다.

$ sudo firewall-cmd --permanent --zone=public --add-port=8000/tcp
$ sudo firewall-cmd --reload

이 명령으로 포트도 확실하게 열어둔다.

 

다 되었으면 실행해본다.

$ sudo systemctl start ajenti

웹에서 구동은 다음 주소에서 가능하다.

http://서버주소:8000

서버 OS 계정으로 로그인할 수 있다. ssh 계정과 동일하다고 보면 된다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

PHP 7.1 설치

홈디렉토리에 역시 저장소 파일을 받아서 등록하자. 기본 php 저장소 역시 너무 구버전이라 remi-release-7으로 갈아치울 필요가 있다.

$ cd ~
$ wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ rpm -Uvh remi-release-7.rpm
$ yum-config-manager --enable remi-php71
$ sudo yum install php php-devel php-fpm php-gd php-mbstring php-pdo php-pecl-swoole php-cli php-intl php-soap php-tidy php-xml php-xmlrpc

쓸만한 php 모듈을 모두 등록한 경우이며, 필요에 따라 가감할 수 있다.

다음으로 php-fpm 연동이다.

$ sudo nano /etc/php.ini

cgi.fix_pathinfo를 찾아서 =0으로 바꿔준다. 이는 필수적인 PHP 보안 설정이라고 한다.

이어서 php-fpm.d 설정을 한다.

$ sudo nano /etc/php-fpm.d/www.conf
listen = /var/run/php-fpm/php-fpm.sock
user = nobody
group = nobody

각각 내부에 listen = / user = / group = 항목이 다 들어 있으므로 복붙하지 말고, 찾아서 해당 부분을 각각 수정해야 한다.

다 되었으면 실행해본다.

$ sudo systemctl start php-fpm

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

maria db 설치

$ cd /etc/yum.repos.d/
$ sudo nano MariaDB.repo

이렇게 입력하면 yum 패키지 원본으로 MariaDB 저장소를 새로 지정할 수 있다. 이렇게 하지 않으면, 기본으로 있는 패키지는 너무 구버전이다.

# MariaDB 10.2 CentOS repository list - created 2017-11-06 14:03 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

저장하고 다음 명령을 실행한다.

$ sudo yum update

이제 설치한다.

$ sudo yum install MariaDB-server MariaDB-client

이렇게 하면 자동으로 패스워드 설정 페이지가 나온다. 접속에 필요한 정보니 신중하게 설정하면 된다.

$ sudo systemctl start mariadb

mariadb가 시작된다.

다음 글에서 이어집니다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

기본 시스템 설정

root인 김에 막바지 작업을 끝마치자. 도메인을 갖고 있다면 시스템을 도메인과 일치시키는 편이 관리하기에 수월할 것이다.

# hostname mydomain.net

이어서 hosts 파일도 수정한다.

# nano /etc/hosts

127.0.0.1 / ::1인 첫 항목을 바꿔버린다.

# nano /etc/sysconfig/network

여기서도 HOSTNAME= 오른쪽의 이름을 나의 도메인으로 맞춘다.

해외든 국내든 서버가 어디에 있어도 대한민국 대상으로 서비스한다면 서버 시계도 맞춰주면 좋을 것이다. 다음 방법으로 금세 시간대를 맞출 수 있다.

# timedatectl set-timezone Asia/Seoul

참고로, 가능한 시간대를 모두 출력하려면 다음 명령을 통해 볼 수 있다.

# timedatectl list-timezones

대륙을 알고 있다면 뒤에 | grep Asia 이런식으로 적어주면 더 간략하게 필요한 정보만 추려낼 수 있을 것이다. 이제 root 로그인은 종료해도 괜찮다.

Nginx 빌드

이 절부터는 처음에 만든 신규 계정으로 로그인하고 진행한다.

yum install nginx로 순식간에 설치되는 것이 nginx의 장점이거늘, 여기서는 직접 빌드에 도전해본다. 원래 빌드는 관련 의존성 패키지를 다 깔아주고, 경로도 맞춰줘야 하는 등 무척 까다로운 과정을 거쳐야 한다. 그러나 Nginx는 비교적 쉬운 작업으로 빌드가 가능하다는 점, 또 빌드를 통해서만 원하는 추가 모듈을 깔아줄 수 있다는 점에서 언젠가 꼭 거쳐야 할 과정이라고 생각한다.

gzip이나 기타 유용한 모듈을 쓰려면 빌드 방법은 꼭 알아둘 필요가 있다.

$ sudo yum install gcc-c++ pcre-devel zlib-devel make unzip libxml2-devel libxslt-devel gd-devel GeoIP GeoIP-devel perl

시행착오 끝에 빌드시 괴롭히는 것들을 다 깔 수 있었다.

$ wget https://zlib.net/zlib-1.2.11.tar.gz
$ wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
$ tar -xzvf ./zlib-1.2.11.tar.gz
$ tar -xzvf ./openssl-1.1.0g.tar.gz
$ tar -xzvf ./pcre-8.41.tar.gz

의존성 있는 라이브러리들도 같이 준비해준다. 공식 홈페이지에서 최신 버전으로 맞추는 편이 좋다. 다만, perl 같은 경우엔 메이저 버전이 높은 것으로 하면 문제가 생길 수 있다.

$ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --build=CentOS --builddir=nginx-1.13.6 --with-select_module --with-poll_module --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-stream_ssl_preread_module --with-compat --with-pcre=../pcre-8.41 --with-pcre-jit --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.0g --with-openssl-opt=no-nextprotoneg --add-module=../ngx_pagespeed-1.12.34.3

make 하기 전 설정 과정을 거친다. 여기서 의존성 체크를 당하고, 에러가 나면 구글링하면서 또 해결을 해야 한다. 무사히 끝나면 make가 남는다.

$ sudo make
$ sudo make install

에러가 나지 않기를 기원한다. 참고로 512MB에서 make시 fatal error가 발생했다. 램이 부족하면 죽어버리는 모양이다. vps라서 업그레이드는 간단했다만, 다운그레이드가 안 돼서 좀 그렇다.

$ sudo groupadd nobody
$ sudo useradd -g nobody nobody

Nginx 서버에서 사용할 계정을 만들어야 한다. 방문자가 파일을 확인하게 되는 기본 사용자인 만큼, 보안을 최대한 고려하여 필요한 권한만 제공되어야 한다.

손수 빌드할 경우 서비스로 등록되지 않는다. 서비스 등록을 위한 과정을 거치면, 부팅시 자동으로 웹 서버가 기동된다.

$ sudo nano /lib/systemd/system/nginx.service

여기에 다음 내용을 붙여넣자.

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
			
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
$ sudo systemctl enable nginx
$ sudo systemctl start nginx

이렇게 하면 실행된다.

다음 글에서 이어집니다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

root 수정

처음 VPS 서버가 생성되면, root 계정과 비밀번호를 관리 패널에서 알 수 있다. 그러나 root를 로그인할 수 있게 두고, ssh를 기본 포트로 쓰면 IP는 쉽게 알 수 있으므로 전세계에서 공격이 들어오게 된다.

따라서 안전하게 서버를 운영하고, 공격자를 막기 위해서는 본인만의 설정을 만들고 관리자 계정을 비활성화하여 서버 권한 탈취를 막아야 한다.
왼쪽에 $인지 #인지 여부로 쉽게 루트 권한인지를 알 수 있다.

putty로 연결하는 법까지는 알고 있다고 하고, putty 접속을 마친 다음 작업을 시작한다. 주로 쓸 계정을 새로 만들 것이다. 여기서는 myadmin이라고 하자.

# useradd myadmin
# passwd myadmin

비밀번호를 새로 셋팅하는 화면이 뜬다.

# nano /etc/sudoers

이걸 실행하면 sudo 명령을 쓸 수 있는 계정을 선언할 수 있다. 다음 부분을 추가하자.

myadmin       ALL=(ALL)       ALL
myadmin    ALL=NOPASSWD: /usr/libexec/openssh/sftp-server

첫째 줄 따로 모여 있는데 내려가면서 비슷한 명령끼리 모아서 새로 한 줄씩 추가하면 된다.
NOPASSWD라고 쓰여 있는 두 번째 줄은 WinSCP 설치시 유용한 기능인데, 이를 통해 WinSCP에서 myadmin으로 접속해도 sudo를 친 것과 동일한 효과를 얻을 수 있다.

nano 에디터를 저장하는 방법은 Ctrl+O를 누르는 것이다.

ssh 포트 변경

우선 패키지를 처음으로 설치하기 전에 패키지 목록을 업데이트하자.

# yum update

가까운 미러 사이트를 저절로 검색하면서 이것저것 다운로드 받을 것이다. 그걸로 할 일은 충분하다.

이어서 CentOS 7에서 netstat을 설치하는 법은 간단하다. netstat을 통해 열린 포트르 확인할 수 있다.

# yum install net-tools

Install y/n에서 당연히 y를 쳐야 하는 것은 기본이다.

# netstat -anp | grep LISTEN | grep sshd

이렇게 치면 LISTEN이라고 표기된 sshd 포트만을 찾아볼 수 있다.

tcp        0      0 0.0.0.0:22            0.0.0.0:*               LISTEN      825/sshd

숫자는 다를 수 있지만 :22 라고 쓰인 부분에서 22번 포트가 열린 것을 확인할 수 있다.

# cat /etc/ssh/sshd_config | egrep ^\#?Port

여기서 Port 22 라는 글자가 보인다면 이 파일은 타겟이 확실하다.

# nano /etc/ssh/sshd_config

nano 편집기가 뜨면 Ctrl+W 키를 눌러서 port를 찾아서 해당 문구를 주석처리(# 붙이기)하고 밑줄에 같은 형식으로 추가한다. 원하는 포트를 1234로 가정하면 다음과 같다.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
Port 1234
#AddressFamily any

Ctrl+W를 또 눌러서 permit이라고 쳐본다. PermitRootLogin 항목이 뜰 것이다.

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

해당 부분의 주석(#) 표기를 해제하고, no라고 바꿔서 저장한다.

# service sshd start

이 명령을 써서 sshd 서비스를 재시작한다. 현재 sshd로 로그인되어 있는 세션이 풀리지는 않는다. 다음 번 로그인 때 설정이 적용되어 기존 셋팅으로 로그인이 안 될 것이다.

방화벽 설정

잠깐, 아직 연결을 종료해서는 안 된다. 기본적으로 켜져 있는 방화벽 관련 설정을 맞춰야만 한다. 그렇지 않으면 시스템이 모르는 포트로 접속시 바로 차단된다.

# firewall-cmd --permanent --zone=public --add-port=2123/tcp

firewall-cmd 명령에 포트 번호와 프로토콜, 항구적 설정임을 명시하여 config에 추가하는 것이다.

앞으로도 포트를 쓰는 모든 서비스는 이렇게 포트를 열어줘야만 정상 접속이 가능해진다. 예를 들어, 우리는 HTTP/HTTPS 서버를 운영할 것이므로, 다음과 같은 명령도 미리 실행해줘야 웹 서버로서 기능을 할 것이다.

# firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

이렇게 미리 정의된 서비스를 허용할 수도 있다.

# firewall-cmd --reload

모든 과정이 끝나면 –reload를 해야만 변경 사항이 적용된다.

다음 글에서 이어집니다.