2018년 10월 31일 수요일

[C#] Dictionary Example

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary dictionary = new Dictionary();

        dictionary.Add("cat", 2);
        dictionary.Add("dog", 1);
        dictionary.Add("llama", 0);
        dictionary.Add("iguana", -1);
    }
}

using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var values = new Dictionary();
        values.Add("A", "uppercase letter A");
        values.Add("c", "lowercase letter C");

        // Use inline "out string" with TryGetValue.
        if (values.TryGetValue("c", out string description))
        {
            System.Console.WriteLine(description);
        }
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Example Dictionary again.
        Dictionary d = new Dictionary()
        {
            {"cat", 2},
            {"dog", 1},
            {"llama", 0},
            {"iguana", -1}
        };
        // Loop over pairs with foreach.
        foreach (KeyValuePair pair in d)
        {
            Console.WriteLine("{0}, {1}", pair.Key, pair.Value);
        }
        // Use var keyword to enumerate dictionary.
        foreach (var pair in d)
        {
            Console.WriteLine("{0}, {1}", pair.Key, pair.Value);
        }
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary d = new Dictionary()
        {
            {"cat", 2},
            {"dog", 1},
            {"llama", 0},
            {"iguana", -1}
        };
        // Store keys in a List.
        List list = new List(d.Keys);
        // Loop through list.
        foreach (string k in list)
        {
            Console.WriteLine("{0}, {1}", k, d[k]);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        var test = new Dictionary();
        test["bird"] = 10;
        test["frog"] = 20;
        test["cat"] = 60;
        int sum = 0;
        const int _max = 1000000;

        // Version 1: use foreach loop directly on Dictionary.
        var s1 = Stopwatch.StartNew();
        for (int i = 0; i < _max; i++)
        {
            foreach (var pair in test)
            {
                sum += pair.Value;
            }
        }
        s1.Stop();

        // Version 2: use foreach loop on Keys, then access values.
        var s2 = Stopwatch.StartNew();
        for (int i = 0; i < _max; i++)
        {
            foreach (var key in test.Keys)
            {
                sum += test[key];
            }
        }
        s2.Stop();
        Console.WriteLine(s1.Elapsed.TotalMilliseconds);
        Console.WriteLine(s2.Elapsed.TotalMilliseconds);
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Use a Dictionary with an int key.
        Dictionary dict = new Dictionary();
        dict.Add(100, "Bill");
        dict.Add(200, "Steve");
        // We can look up the int in the Dictionary.
        if (dict.ContainsKey(200))
        {
            Console.WriteLine(true);
        }
    }
}

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

class Program
{
    static void Main()
    {
        string[] arr = new string[]
        {
            "One",
            "Two"
        };
        var dict = arr.ToDictionary(item => item, item => true);
        foreach (var pair in dict)
        {
            Console.WriteLine("{0}, {1}",
                pair.Key,
                pair.Value);
        }
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary d = new Dictionary();
        d.Add("cat", 1);
        d.Add("dog", 2);
        if (d.ContainsValue(1))
        {
            Console.WriteLine(true); // True.
        }
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary dictionary = new Dictionary();

        // We can assign with the indexer.
        dictionary[1] = 2;
        dictionary[2] = 1;
        dictionary[1] = 3; // Reassign.

        // Read with the indexer.
        // ... An exception occurs if no element exists.
        Console.WriteLine(dictionary[1]);
        Console.WriteLine(dictionary[2]);
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary d = new Dictionary();
        d.Add("cat", 1);
        d.Add("dog", 2);

        d.Remove("cat"); // Removes cat.
        d.Remove("nothing"); // Doesn't remove anything.
    }
}

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Example e = new Example();
        Console.WriteLine(e.GetValue());
    }
}

class Example
{
    Dictionary _d = new Dictionary()
    {
        {1, 1},
        {2, 3},
        {3, 5},
        {6, 10}
    };
    public int GetValue()
    {
        return _d[2]; // Example only.
    }
}

2018년 10월 30일 화요일

[c++] 문자를 숫자로 바꾸는 방법들

프로그램 하다 보면 변환에 대해서 찾아 보는 경우가 많죠.


//case 1
int a = 10;
char *intStr = itoa(a);
std::string str = std::string(intStr);


//case 2
int a = 10;
std::stringstream ss;
ss << a;
std::string str = ss.str();

//case 3
std::string s = std::to_string(42);
std::string s = std::to_stoi(42);


위 세가지 방법중 편한걸 사용하시면 됩니다.

2018년 10월 29일 월요일

std::random_shuffle, std::shuffle

예전에 처리했던 방법
처음부터 순회하면서 랜덤한 위치의 값과 바꾼다.

void Shuffle(int * index, int nMax)
{
int i, n;
int tmp;

for (i=nMax-1;i>=0;i--)
{
n = rand() % nMax;
tmp = index[i];
index[i] = index[n];
index[n] = tmp;
}
}


요즘은 아래와 같이 코딩으로 처리한다.

#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(v.begin(), v.end(), g);

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
}

Result :
10 6 8 7 2 3 4 9 5 1


자세한 내용과 다른 방법을 알고 싶으면 아래를 살펴 보면 된다.

Defined in header <algorithm>

template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );

template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc& r );


template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r );


template< class RandomIt, class URBG >
void shuffle( RandomIt first, RandomIt last, URBG&& g );




내부적으로 처리 방법을 보면 특별하지 않다. 이미 익히 알고 있는 방법과 다르지 않다.

template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last )
{
    typename std::iterator_traits<RandomIt>::difference_type i, n;
    n = last - first;
    for (i = n-1; i > 0; --i) {
        using std::swap;
        swap(first[i], first[std::rand() % (i+1)]);
    }
}

template<class RandomIt, class RandomFunc>
void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r)
{
    typename std::iterator_traits<RandomIt>::difference_type i, n;
    n = last - first;
    for (i = n-1; i > 0; --i) {
        using std::swap;
        swap(first[i], first[r(i+1)]);
    }
}


template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g)
{
    typedef typename std::iterator_traits<RandomIt>::difference_type diff_t;
    typedef std::uniform_int_distribution<diff_t> distr_t;
    typedef typename distr_t::param_type param_t;
 
    distr_t D;
    diff_t n = last - first;
    for (diff_t i = n-1; i > 0; --i) {
        using std::swap;
        swap(first[i], first[D(g, param_t(0, i))]);
    }
}

PHP 활성화 하기

PHP 활성화 하기

1. php 활성화를 위해 아파치 설정파일을 연다.
sudo nano /etc/apache2/httpd.conf

2. LoadModule php5_module 이란 글로 시작하는 부분을 찾아서 # 을 제거해준다.
3. 아파치를 재시작한다.
4. 테스트 php 파일을 작성해서 테스트 해보자.
index.php
<?php phpinfo(); ?> 

index.php 경우 아래와 같은 경고 문고 뜨면
PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Seoul' for 'KST/9.0/no DST' instead in /usr/share/doc/squirrelmail-1.4.22/phpinfo.php on line 2

date.timezone = ## 변경 전
date.timezone = Asia/Seoul ## 변경 후
date.timezone = Asia/Seoul ## 변경 후

리눅스 vi 명령어

vi로 일을 불러온 직후의 상로, 입력 모드에서는 [esc] 를 를 시 진입한다. 

0. vi 기본

명령 모드

입력 모드에서 명령 모드로 다시 전환하려면 Esc 키를 누르기만 하면 됩니다. ESC 키를 누르고 문자를 입력하려고 하면 비프음만 날 뿐 입력은 되지 않을 것입니다. 
리눅스에서는 명령모드가 따로 있습니다. 명령모드는 편집모드라고도 하는데, 글을 입력시키는 방법이 아닌 수정과 편집을 할 수 있는 상태임을 기억해 두어야 합니다. 즉, 명령모드에서는 복사,삭제, 붙이기. . .등의 작업이 이루어 집니다. 또한, 입력모드를 통해 삽입 등 잘못된 명령을 내렸을 때 'u'라는 명령어를 통해서 Undo, 즉 복구가 가능하게 할 수 있습니다. 

콜론 모드

명령모드에서 콜론 모드로 전환하려면 ':'명령을 실행시키면 됩니다. 콜론 모드는 vi에서 사용할 수 있는 명령어들을 이용하는 곳입니다. 윈도우 환경에서라면 메뉴 바와 같은 역할을 한다고 볼 수 있습니다. 파일을 저장하거나 vi를 종료하는 등의 일을 수행할 수 있습니다. 콜론 모드로 들어가려면 Esc를 누른 후 ":"를 누르면 됩니다. 콜론 모드에 들어가게 되면 화면 아래쪽에 ':' 표시가 나타나게 되며, 여기서 원하는 작업에 해당하는 명령을 입력하고 Enter 키를 치면 됩니다. 아래 그림에서 아래쪽에 ":wq"라는 표시가 눈에 뜨일 것입니다. ":" 이 상태가 바로 앞에서 말한 콜론모드의 형태입니다. 

1. vi 실행하기

셀상에서 vi [파일명]를 입력하면 새로운 문서를 편집할 수 있는 환경이 만들어 집니다. 

명령어 동작 
vi file file을 연다 
vi file1 file2file1 과 file2 를 차례로 연다 
view file file을 읽기 모드로 연다 
vi -R file file을 읽기 모드로 연다 
vi + filefile을 열때 커서가 file 본문의 마지막 행에 위치한다. 
vi +n file file을 열어 n행에 위치한다. 
vi -r file손상된 파일 회복


2. 입력모드 전환 명령어

글자를 입력하기 위해서는 입력모드로 가야하는데, 'i'를 입력하면, 하단에 --INSERT--가 나오면서, 글자를 입력할 수 있는 
입력모드로 바뀝니다. 
입력 모드로 들어가는 대표적인 방법은 i 키를 누르는 것이지만, 이외에도 몇 가지 방법이 더 있습니다. 

명령어 동작 
커서 있는데서 입력모드 전환 
I커서 왼쪽, 행의 처음에 몬자 삽입 
커서 있는 줄 끝에서 입력모드 전환 
A커서 오른쪽, 행의 끝에 문자 삽입 
커서 있는 줄 아래에 빈 줄 삽입 
커서 있는 줄 위에 빈 줄을 삽입 
덮어쓰기 모드로 전환 


3. 커서의 이동

명령모드 상태에서 커서를 마음대로 움직일 수 있습니다. 

명령어 동작 
^, 0 줄의 처음으로 이동 
줄의 끝으로 이동 
H 화면 맨 위로 이동 
M화면의 중간으로 이동 
화면 맨 아래로 이동 
다음 단어 끝으로 커서 이동 
e다음 단어 앞으로 커서 이동
b  이전 단어로 이동 
shift + ↑ 한 페이지 앞으로 이동 
shift + ↓한 페이지 뒤로 이동 
3l , 3G현재 커서 위치한 행에서 3번째 행으로 이동 
Ctrl + i한 화면 위로 이동 
Ctrl + b한 화면 아래로 이동 
Ctrl + d반 화면 위로 이동 
Ctrl + u반 화면 아래로 이동 
Ctrl + e한 줄씩 위로 이동 
Ctrl + y한 줄씩 아래로 이동 


4. 삭제

명령어 동작 
한 문자 삭제 
5x커서가 있는 위치부터 5개의 문자를 삭제 
d + ↑ 커서있는 줄, 윗줄 2줄 삭제 
d + ↓ 커서잇는 줄, 아래줄 2줄 삭제 
dw 한 단어 삭제 
dd 한 줄 삭제 
5dd커서가 있는 라인부터 5개의 라인 삭제 
db커서의 위치에서 거꾸로 한 단어 삭제 
한줄 내에서 커서있는 뒤 모두 삭제 
바로 전에 수행한 명령을 취소 
:5,10ㅇ5~10번째 행 삭제 


5. 복사와 붙여넣기

명령어동작
yy현재 줄을 버퍼로 복사 
버퍼에 있는 내용을 커서 뒤에 삽입 
P버퍼에 있는 내용을 커서 앞에 삽입 
3y 현재 줄에서부터 아래로 3줄 복사 
:5, 10y5~10줄을 버퍼로 복사 
:30pu30행에 버퍼 내용을 삽입 
현재 커서가 위치해 있는 단어 복사 
3yy현재 행을 기준으로 3번째 행까지 n행 복사 


6. 문자열 찾기

명령어동작
/namename 문자열 찾기 
n다음 name으로 이동
Nn과 같으며 역방향으로 이동 


7. 문자열 대체

명령어 동작 
:s/str/rep현재 행의 str을 rep로 대체
:l,.s/str/rep/ 1부터 현재 행의 str을 rep로 대체 
:%s/str/rep/g 파일 전체 str을 rep로 전부 대체 
:.$/aaa/bbb커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체 


8. 파일 저장 및 불러오기

종료 명령은 앞에서 잠깐 콜론 모드에서 이루어 집니다. 
편집한 데이터를 저장하고 종료하려면, wq(Write and Quit)를 입력합니다. 

명령어 동작 
:w 지정된 파일에 저장 
:wq, :x, ZZ 지정된 파일에 저장하고 vi를 종료 
:w php.ini php.ini 파일에 저장 
 :q저장하지 않고 종료 
:q!저장하지 않고 강제 종료 
:wq php.ini php.ini에 저장하고 vi를 종료 
:r php.ini php.ini의 내용을 현재 커서가 있는데로 불러온다. 
:e php.ini 현재의 화면을 지우고 새로운 파일 php.ini를 불러온다. 
:5,10 w php.ini 5~10 줄까지의 내용을 php.ini에 저장


9. 기타

명령어 동작 
:set nu행 번호 보여주기 
:set nonu 행 번호 보여주기 취소 
 .바로 전에 실행한 명령어 재 실행 
 Ctrl + l불필요한 화면 정리후 다시 표시