2014년 12월 27일 토요일

Visual C# (2) Random number를 이용하여 원을 그리고 picture Box에 image 띄우기

 안녕하세요? 이번 포스팅에서는 지난 포스팅에서 좀 더 발전 시켜 Random number를 이용하여 원을 그리고 그려진 원을 picture box에 올리는 프로그램 입니다.

 우선 작성한 전체 소스는 다음과 같습니다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Circle_Draw_in_picturebox
{
    public partial class Form1 : Form
    {

        public Graphics g; //그림을 그리기 위한 도구인 Graphics 객체 생성
        public double pPi = Math.PI;    // Pi 값을 pPi에 할당.

        Bitmap canvas = new Bitmap(300,300); // 그림이 그려질 객체 생성. 여기서는 300 x 300 pixel로 생성
        Random rnd = new Random(); // Random number를 사용하기 위한 구문. 
        // method 내부가 아닌 class field 영역에서 선언했다는 점을 주목.
        // 이는 Random number의 확률 분포가 더 넓게 퍼지게 하기 위해 중요한 사항.
        // 더 자세한 사항은 다른 사이트 참조.

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            g = Graphics.FromImage(canvas);  //Graphics 객체에 그림이 그려질 canvas 할당
            g.FillRectangle(Brushes.Black, 0, 0, canvas.Width, canvas.Height); //canvas 배경을 Black으로 설정.

            //원을 그리기 위한 변수 설정
            double x0, y0;  //Center of the Circle
            double x1, y1;  //A point that Circle will be drawn.
            double R;       //Radius of circle
            double rad;     //Radian for drawing circle.
            double drad;    //Infinitesimal of radian 
            drad = pPi / 180 * 0.001;

            //원의 중심좌표와 반지름의 값을 Random number로 생성
            x0 = rnd.Next(10, 300); //10과 300 사이의 Random number 생성
            y0 = rnd.Next(10, 300);
            R = rnd.Next(10, 125); //10과 125 사이의 Random number 생성

            for (rad = 0; rad <= 2 * pPi; rad = rad + drad)
            {
                x1 = Math.Round(x0 + R * Math.Cos(rad), 0);
                y1 = Math.Round(y0 + R * Math.Sin(rad), 0);
                g.DrawLine(Pens.LightGoldenrodYellow, new Point((int)x0, (int)y0), new Point((int)x1, (int)y1));
            }

            // Drawn pictures are throw to the pictureBox1
            pictureBox1.Image = canvas;

            //x0, y0, R values are displayed in textBox1.
            textBox1.Text  = "x0 = " + Convert.ToString(x0);
            textBox1.Text += System.Environment.NewLine + "y0 = " + Convert.ToString(y0);
            textBox1.Text += System.Environment.NewLine + "R  = " + Convert.ToString(R);
            
        }
    }
}



결과는 다음과 같습니다.

보시는 것 처럼 Random number를 이용하여 원을 그리고 발생한 그 값 역시 textbox에 출력이 되도록 하였습니다.

그럼 이제 하나씩 자세히 뜯어 보도록 하겠습니다. 각각의 중요한 사항들은 주석에 적어 놓긴 했지만 다시한번 점검!!!


(1) 생성한 그림을 pictureBox에 띄우기.

아직 Image, Bitmap, Graphics 등등 각각의 라이브러리에 대해 개념 정립이 잘 되진 않았지만 주워들은 바에 의하면


  • Bitmap ==> 실제 픽셀을 가진 실체화된 객체를 생성하게 해주는 라이브러리.
  • Image ==> 추상적인 개념의 라이브러리로 Bitmap과 Graphics를 연결해주는 역할? 더 공부가 필요.
  • Graphics ==> 이미지 객체에 그림을 그려주는 도구로써의 역할을 하는 라이브러리.
  • 그래서 결국 그 절차는 다음과 같습니다.


   public Graphics g; //그림을 그리기 위한 도구인 Graphics 객체 생성

   Bitmap canvas = new Bitmap(Width,Height); // 그림이 그려질 객체 생성. 본 소스에서는 300 x 300 pixel로 생성

...

     g = Graphics.FromImage(canvas); //Graphics 객체에 그림이 그려질 canvas 객체 할당.
     g.FillRectangle(Brushes.Black, 0, 0, canvas.Width, canvas.Height); //
...
     g.DrawLine(Pens.LightGoldenrodYellow, new Point((int)x0, (int)y0), new Point((int)x1, (int)y1));
...
      pictureBox1.Image = canvas; //그려진 그림이(canvas) pictureBox에 출력될 수 있도록 할당.



Bitmap과 Graphics 객체를 각자 생성해주고, Bitmap 객체에 Graphics를 이용하여 원하는 그림을 그려넣어준 후, pictureBox에 Bitmap 객체(여기서는 canvas)를 할당해 줌.



(2) Random number creator (난수 생성)

 난수 생성 방법은 다음과 같습니다.
using System;
Random rnd = new Random(); // Random number를 사용하기 위한 구문
...
       //난수를 생성하여 변수에 대입.
       x0 = rnd.Next(10, 300);
       y0 = rnd.Next(10, 300);
       R = rnd.Next(10, 125);

Random 객체이름 = new Random(); 이와 같은 방법으로 선언 후
변수 = 객체이름.Next(범위); 의 방법으로 난수 생성 후 대입.

난수 생성에 대한 내용도 깊이 파자면 한도 끝도 없는 것 같지만... OTL

for loop 구문 등 반복적으로 난수를 사용해야 하는 경우에는 class field 단위에서 선언 후 method 안에서 개별적으로 사용해 주는 것이 좋다고 합니다.

자세한 내용은 아래 사이트 참조
http://topnanis.tistory.com/226



(3) textBox 사용하기

using System;
    //x0, y0, R values are displayed in textBox1.
     textBox1.Text  = "x0 = " + Convert.ToString(x0);
     textBox1.Text += System.Environment.NewLine + "y0 = " + Convert.ToString(y0);
     textBox1.Text += System.Environment.NewLine + "R  = " + Convert.ToString(R);



  • textBox1.Text = 문자열; 의 형태로 사용 가능합니다.
  • 내가 단순히 표시하고자 하는 문자는 따옴표" "를 사용하여 입력 
  • textBox1.Text += 문자열; 로 사용하는 이유는 +를 사용하지 않으면 기존의 내용이 삭제 되고 계속 refresh 됨. +를 해줌으로써 그 다음에 연결해서 출력됨.
  • System.Environment.NewLine을 넣어 주는 것은 [enter]를 쳐주는 것과 같은 기능. "\r\n"의 방법으로도 같은 효과를 발생시킴.
  • 여기서 중요!! 만약 프로그램 내부에서 사용한 변수를 출력하고 싶으면??  ==> Convert.ToString(변수)의 방법으로 출력을 해주어야 합니다. 왜냐하면 모니터 상에서 글자를 출력하기 위해서는 프로그램 내부에서 사용하던 숫자들을 (이들 숫자들은 0과1로 조합된 그야말로 순수한 숫자) 사람이 인식 가능한 [문자열]로 출력해 주기 위해서는 데이터형의 전환이 필요한데 이 기능을 해주는 것이 ToString 입니다.
  • 이외에도 문자열을 숫자로 바꿔주는 기능들도 있으니 더 찾아 보면 좋을 것 같네요. 

2014년 12월 24일 수요일

Visual C# (1) sin과 cos을 이용한 원 그리기 프로그램



요즘 회사 프로젝트 때문에 새롭게 visual c#을 공부하고 있습니다. 제가 공부하면서 작성하는 코드를 하나씩 포스팅 해보도록 하겠습니다. 참고로 저는 학부 때 c를 이용해서 기본적인 전산물리 문제를 풀어 본 경험이 있습니다.

아직 저도 배우는 단계라 하나씩 하나씩 수정 해 나가면서 프로그램을 계속 개선해 나가겠습니다.


우선은 sin 과 cos을 이용하여 원을 그리는 프로그램 입니다.

아주 단순한 코딩임에도 불구하고 제가 원하는 방식의 코드가 예상외로 찾기 힘들었습니다. 그래서 몇 가지 사이트를 참조해서 단순하게 새로 코딩을 하였습니다.

 제가 원하는 기능은 sin과 cos을 이용하여 원을 그리는 것인데, 단순히 원 테두리만 그리는 것이 아니라 안이 채워진 형태로 그리고자 했습니다.


 원을 그리는 방법은 다음의 사이트를 참조했습니다.

http://hhjae84.tistory.com/50
http://www.dreamincode.net/forums/topic/164701-drawing-shapes-with-sin-cos-values/




 제가 원하는 기능은 sin과 cos을 이용하여 원을 그리는 것인데, 단순히 원 테두리만 그리는 것이 아니라 속이 채워진 형태로 그리고자 했습니다. 이렇게 그리기 위해서 ellipse를 사용할 수도 있지만 이렇게 그리게 되면 theta에 따른 변화를 줄 수가 없어 배제 하였습니다.



x=R*cos(theta)
y=R*sin(theta)

위의 단순한 수식을 이용하였습니다. R은 원의 반지름이 입니다.

제가 원을 그린 방식은 원점을 지정하고 원점으로부터 거리가 R인 지점까지 일정한 theta만큼 변화시키며 선을 긋는 방식입니다. 사실 엄밀히 말하면 무수히 많은 선을 방사형으로 긋는 것인데 theta의 변화량이 점차 작아짐에 따라 원에 가까워지는 원리를 이용하였습니다. 이 방법은 추후에 변경해야 할지도 모르지만 현재론 이 방법이 제가 원하는 쓰임새엔 가장 근접한 것 같습니다.








다음은 실행 결과입니다.










-------------------------------------------------------------
[참고]
30도 간격으로 선을 그을 때



10도 간격으로 선을 그을 때



5도 간격으로 선을 그을 때


1도 간격으로 선을 그을 때

2014년 12월 18일 목요일

리오(생후10개월) - 치코 해피스낵 식탁의자,



 이전엔 이렇게 생긴 의자를 썼었는데, 아이가 금방 싫증내며 일어나려고 했었습니다.

 베이비캠프 접이식 원목 식탁의자

하지만 의자를 바꾸고 나니 앉아 있는 걸 굉장히 좋아하네요.

쿠션도 좋고 안전장치도 잘 되어 있고(하지만 우리 리오는 안전장치를 싫어하죠..ㅠ.ㅜ)

무엇보다 간편히 접을 수 있다는 것이 큰 장점이네요.








이제 조만간 혼자 밥 먹는 연습을 시켜야 겠어요~






블로그포스트에 애드센스 달 때 문제점



 

블로그포스트 (구글 블로거)는 기본적으로 구글의 블로그 서비스이기 때문에 애드센스를 첨부하기가 쉬운 장점이 있습니다. 라고 얘기를 하지만!!!

직접 애드센스를 첨부하기 위해 이리저리 해 본 결과 약간의 문제점이 있더군요.

분명히 애드센스를 제대로 설정한 것 같음에도 불구하고 제대로 애드센스가 작동을 하지 않는 문제 인데요.

분명 처음 한 번은 잘 되었던 것 같은데 블로그의 설정을 계속 이것저것 바꾸기 시작하면서 애드센스 광고가 제대로 나오지 않았었습니다.

그래서 무엇이 문제일까 한창을 고민해보고 이것저것 해보니, 애드센스를 적용시킬 때 어떤 방법으로 적용시키는지에 따라 작동 유무가 결정되는 것 같습니다.

우선 제가 제가 처음 애드센스를 부착할 때의 방법입니다.

블로거 메인 레이아웃에서 가젯 추가를 누른 후 애드센스를 다는 방법을 이용했었습니다.











 

이렇게 적용하고 실제 애드센스가 작동하기 까지는 시간이 걸리더군요.

 

아 그렇게 잘 되는 구나 생각을 했습니다.

 

문제는 그 다음부터 인데요, 블로그 레이아웃을 계속 수정해나가기 시작하면서 애드센스 크기가 블로그 레이아웃과는 맞지 않아 위와 같은 방법으로 삽입해준 애드센스를 아래 그림과 같이 블로그 메인 페이지의 편집을 눌러 수정을 시도했습니다.



 


그렇게 크기를 바꿔주고 저장을 누르면 아래와 같이




[입력 내용 중 오류를 수정해 주세요]
라고 뜨더라구요. 뭐 그래도 되겠지 하고는 창을 닫고 애드센스 크기가 변경 되겠지라고 세월아 네월아 기다리는데…

 

불러도 대답없는 메아리만 공허하게… 아무런 반응이 없었습니다.

 

그래서 폭풍 검색을 해보았는데,,,

 

또 다른 애드센스 적용 방법이 있더군요. 구글 블로거 외에 애드센스를 달 때 모두들 일반적으로 쓰는 소스코드를 이용한 방법인데요.

 

방법은 다음과 같습니다.


1.구글 애드센스 페이지로 이동



2. [내 광고] 클릭

3. [새 광고 단위] 클릭


4. 자신에게 맞는 설정 후 [저장 및 코드 생성] 클릭

5. 소스 코드 복사

6. 소스 코드 삽입 후 [저장]








이렇게 하니 간단히 지금과 같은 애드센스가 추가가 되는군요.


 

문제를 정리하자면 이렇습니다. [가젯추가]에서 [애드센스]를 선택해서 광고를 넣으면 처음 한번은 잘 적용 되지만, 그 다음 편집을 할 때는 애드센스의 광고 설정이 변하지 않기 때문에 블로그에서 띄우고 싶어하면 설정이랑 실제 애드센스에서의 광고 설정이 다름으로 인한 문제인 것 같습니다.

 

그래서 결론은 현재론 그냥 HTML/JavaScript를 선택 후 소스 코드 복사가 가장 쉽고 편하고 되는 방법인 것 같습니다.

 

이 부분 어서 구글에서 수정해주었으면 좋겠군요.

 


 

2014년 12월 14일 일요일

A Color set for presentation













 


R
65
133
189
215
101
217
203
147
G
65
117
219
113
140
212
157
129
B
65
101
92
100
143
189
122
111
HTML Hex
#414141
#857565
#bddb5c
#d77164
#658c8f
#d9d4bd
#cb9d7a
#93816f


 












R
65
133
189
215
101
217
203
147
G
65
117
219
113
140
212
157
129
B
65
101
92
100
143
189
122
111
HTML Hex
#414141
#857565
#bddb5c
#d77164
#658c8f
#d9d4bd
#cb9d7a
#93816f

 


2014년 12월 13일 토요일

Pythons for scientific computing and data science



 

Anaconda or Canopy Python

 

Download Anaconda
http://continuum.io/downloads


 


 

아나콘다에 포함된 패키지들
BiopythonNumpy
BitArrayOpenCV
CubesPandas
DiscoPySAL
GdataPySam
h5pyPyTables
HDF5SciPy
Imaging(PIL)Scikit-Image
LxmlScikit-Learn
MatplotlibSpyder
MPI4PyStatsmodels
MPICH2SymPy
NetworkXTheano
NumExpr

 


 

이 중에서 내가 주로 사용할 것은 Matplotlib와 Numpy, SciPy, Spyder, PIL 정도 일 것 같다.

 

Features
  • All the premium Python packages needed for science, engineering and business intelligence.
  • Scalable storage and computation with Disco Map-Reduce and Disco Distributed File System (DDFS) (64-bit Linux).
  • Mix-and-match different versions of Python, NumPy, SciPy and other packages in isolated environments and easily switch between them.
  • conda command: Innovative package manager tool for Python packages like yum, apt-get, or a "dynamic Maven" for Python and other languages. Great for solving enterprise integration and application deployment challenges.

 


 


 

Anaconda è Scientific Python 통합패키지
자세한 설명은 다음 사이트 참조 è
https://medium.com/@younggun/anaconda-fe67e9c9709d


 

설치형 파이썬, portable python

 


 

참조 사이트 : http://docs.continuum.io/anaconda/index.html

파이썬 괜찮은 라이브러리 모음

https://freepythontips.wordpress.com/2013/07/30/20-python-libraries-you-cant-live-without/


포토샵 설치 시 씨디 넣으라고 하면서 안 될때




포토샵을 설치하려고 할 때 [계속하려면 디스크 Photoshop CC 2014_x64을(를) 삽입하십시오.]

라는 문구가 뜨면서 설치가 안될때, 많이 당황하셨지요?

저도 참 많이 당황 했는데요, 다음과 같은 간단한 방법으로 해결 했습니다.

설치 시 iso나 lcd 등 가상 드라이브를 이용하여 설치 하셨을 텐데요, 가상 드라이브의 [Adobe CC 2014]에

포함된 모든 파일을 하드드라이브로 복제 후 하드드라이브의 setup을 눌러서 설치 하시면 위와 같은 문제 없이 해결 됩니다.


 

http://www.justin.my/2010/08/solvedplease-insert-disk-adobemastercollection5-trial-english-to-continue/


위의 사이트를 통해 문제 해결 방법을 알았구요, 위 사이트에 달린 댓글 중에는 setup.xml 파일의 <media> 다음부터 </media> 까지의 내용을 삭제 하면 해결된다는 답변도 있는데 이 방법으론 저는 성공하지 못 했습니다.

그냥 처음 말씀 드린 방법으로 쉽게 해결 했습니다.

위 사이트 내용을 토대로 보면 위의 방법은 CC, CS 등 여러가지 photoshop 버전에서 다 통용되는 것 같습니다.

유익한 내용 되셨길 바랍니다.

 


 

2014년 12월 12일 금요일

Rio's Doridori. (Shaking head in Korean words) - 10 months baby


Rio really likes to shake head. 


2014년 8월 11일 월요일

MIT 스타트업 바이블






창업의 세 가지 이유
학생들에게 왜 기업가정신에 관심을 보이는지 물으면 대게는 다양한 이유를 쏟아낸다. 어떤 학생은 몇 년간 한 분야에 몸담다 보니 변화의 필요성을 느껴서라고 말한다. 자신의 역량을 최대한 발휘해 사회에 큰 영향을 미치고자 하는 학생도 많다. 누구의 지시도 받지 않고 독립적으로 일하기 위해 혹은 특허를 상용화하기 위해 방법을 찾는 이들도 있다. 삶의 질을 개선할 참신한 아이디어가 있는데 혹시 다른 사람도 흥미를 보이지 않을까 하는 호기심에서 비롯된 관심도 있다.
 창업을 결심하는 동기는 크게 세 가지로 요약할 수 있다.

1)     번뜩이는 아이디어가 있다: 일부에 불과할지도 모르지만 이들은 세상을 바꿀 창의적인 발상 또는 기존의 익숙한 방식을 혁신하는 창의적 아이템을 발견해 아이디어의 사업화 과정을 직접 주도하고자 한다.
2)     기술을 가지고 있다: 이들은 획기적인 기술을 개발해 기술 상용화 혹은 기술 진보 가속화로 사회에 긍정적인 영향을 미치고 싶어 한다. 보통 자신이 직접 개발하지는 않았지만 시장 잠재력이 큰 신기술을 알고 있다.
3)     열정을 마음껏 펼치고 싶다: 열정적인 사람은 자신의 역량을 최대한 끌어올리기 위해 스스로를 밀어붙이고 채찍질하는 데 익숙하며 자신감도 충만하다. 이들은 기업가의 삶이야말로 세상에 의미 있는 발자취를 남기는 길이라는 신념을 갖고 있다. 특히 다른 사람 밑에서 일하기 싫어하고 자신의 운명을 통제하려는 경향이 있다.

P39
…..

 스타트업의 첫 번째 과제는 흔히 생각하는 것처럼 제품 설계, 개발자 고용, 영업 전문가 영입이 아니다. 가장 우선시해야 할 것은 철저하게 고객지향적인 관점에서 미충족 수요를 발견하고 그 기반 위에 사업을 설계하는 일이다.


2014년 8월 10일 일요일

강신주의 '노자 혹은 장자'




장주의 집은 가난해서, 그는 감하우에게 곡식을 빌리려고 갔다. 그 제후가 말했다.
좋다. 나는 곧 내 땅에서 나오는 세금을 얻게 되는데, 너에게 삼백 금을 빌려주겠다. 그래도 되겠는가?”
그러자 장주는 화를 내면서 다음과 같이 말했다.
제가 어제 이곳으로 올 때, 길 중간에서 소리치는 무엇인가가 있었습니다. 제가 마차바퀴 자국을 돌아다보니, 거기에는 잉어가 있었습니다. 저는 그 잉어에게 잉어 아닌가! 너는 무엇하고 있는가?’라고 물었습니다. 그러자 잉어는 저는 동해의 왕국에서 파도를 담당하는 신하인데, 당신은 한 국자의 물로 나를 살릴 수 없겠습니까?’라고 말했습니다. 그래서는 저는 잘 말했습니다. ‘좋다. 나는 지금 남쪽으로 오나라와 월나라의 왕에게 유세하러 가는 중이니, 서강의 물길을 네가 있는 곳으로 향하도록 하겠다. 그래도 되겠는가?’ 그러자 그 잉어는 화를 내면서 말했습니다. ‘저는 없으면 살 수 없는 그런 것을 잃었습니다. 제게는 살 수 있는 곳이 지금 없습니다. 제가 필요로 하는 것은 나를 살릴 수 있는 한 국자의 물입니다. 만일 그것이 당신이 말할 수 있는 전부라면, 당신은 건어물 진열대에서 저를 찾는 것이 나을 것입니다.’”

장자 <외물(外物)>


철학은 크게 두 종류로 나뉜다. 그 하나가 세계와 인간을 포괄적으로 설명할 수 있다고 인정되는 보편적이고 합리적인 체계를 설정하려고 노력하는 철학이라면, 다른 하나는 이런 보편성과 합리성을 회의하면서 실존적 사태에 주어진 것만을 기술하려는 철학이다. 편의상 전자를 합리적 철학이라 부르고, 후자는 기술적 철학이라 부르자. 물론 우리는 여기서 단순히 주어진 세계와 인간에 대해 합리적으로 설명하려는 합리적 철학을 넘어서는 새로운 종류의 합리적 철학이 있을 수 있다는 것을 지적해야만 한다. 지금은 존재하지 않지만 앞으로 도래해야만 할 합리적 체계를 모색하고 이것을 도달해야 할 이념으로 설정하는 실천적인 합리적 철학도 충분히 가능하니까 말이다. 이 점에서 우리는 합리적 철학도 설명적인 합리적 철학과 실천적인 합리적 철학으로 나누어야 할 것이다.

 장자의 철학은 분명 합리적 철학이라기보다는 기술적 철학에 가깝다. 장자 철학의 이런 성격은 그가 항상 반복적으로 우리의 삶은 우리가 알지 못하는 데 그쳐야 지극한 것이다.’ 라고 ….

Test

First test
10/Aug/2014