개발정리를 위한 개발로그, 발로그!

2015.02.01 20:28 "코드 이그나이터 관련" 포스팅 이후에 약 2년의 시간이 흘렀다.


그 이후에 내가 얻은 것 무엇이고, 잃은 것은 무엇인가

많은 생각이 든다. 


어제 친구들을 만났다. 

각자의 자리에서 열심히 하고 있구나, 의미 없는 시간을 보내지 않고 의미 있는 시간을 보냈다면 후회가 든다.


아직 늦지 않았다.

지금부터 다시 시작하면 된다.


친구들도 만나고, 이야기를 하고 나의 자리에서 최선을 다하자.


비판 보다는 긍정을,

절망 보다는 희망을,

혼자 보다는 우리를 이야기 하며 살자.


완벽해지려 하지 않고, 

집중하고 내가 잘하는 것을 잘하자.


--


영리하게 살자. 해야할 것은 언젠간 해야 한다.


-- 


영어를 잘해야 한다.

표현하지 못하면 의미가 없다.


--


오픈소스 관련해서 도움을 많이 받았다.

공유하자. 내가 얻은 것들을.


2016년 12월 10일 - 과거로부터 청산하자. 





지난 주, PHP 익스텐션 - ImagemagicK(http://www.imagemagick.org/) 를 설치하다가, PHP 버전이 맞지 않아 업그레이드를 하였더니 잘 돌아가던 웹사이트가 동작하지 않았다. 

에러로그를 찾아보았더니 코드이그나이터 에러란다.

PHP 5.6에서 일부 로직이 바뀌어서, 코드 이그나이터의 Core 부분을 수정해야 동작한다고...


이 문제가 해결된 코드이그나이터가 있을까 싶어서, 오피셜 사이트에 들어갔는데 주인이 바뀌었다고 리다이렉팅, 
버전은 2.2대를 벗어나지 못하고 2.2.1

- 3.0은 RC가 나왔는데 언제 나올지는 미정인듯하다.

그래서 결국 PHP를 5.5로 다운그레이드. ㅋ
(시간적 여유가 좀 있었다면 5.5->5.6 업그레이드가 되면서 어디가 바뀌었는지 알아보고싶었지만 ㅠ 시간관계상 다음기회로)


관련된 자료를 이것저것 찾아보다가 우연찮게 최근에 Laravel이라는 프레임웍이 주목 받고 있다는 사실을 알게되었다.

이참에 갈아탈까 하는 생각에, 어떻게 쓰는 아이고 어떤 장점이 있는지 찾아보려다가 일단 GG.. ( http://laravel.com/docs/4.2/controllers ) 생각보다 복잡한 부분이 있다. 코드이그나이터와 비교해서 딱히 이런 부분이 더 낫다 안좋다 한눈에 알수 없는..ㅋ

첫 인상은 나름 모던한 느낌이 있다.


코드이그나이터 vs 라라벨


이렇게 포스팅을 한번 해봐야겠음! ㅋ 








'시작전!' 카테고리의 다른 글

Angular Material - HTML 기반 Material 디자인 라이브러리  (0) 2014.12.25

하나씩 풀어보고자 한다.

SRM 144 DIV 1 ( 300 - Point 문제 ) 


- 문제 링크는 어떻게 하는지 몰라서 패스!


처음엔 DFS, BFS 류의 서치인줄 알았으나 생각해보니 그런 류의 문제는 아니였음

사실상 문제 속에 답이 있어서, 처음에 헛다리 안짚고 진행하면 문제가 없음


내 풀이 방법은 아래와 같음

( 암호화 전의 String을 B, 암호화 후의 String을 E라 하겠음) 

E를 통해 B를 알아내는 문제


B의 첫번째 값을 0 혹은 1로 가정하고 진행.


P[i] 번째 값은 B[i-1] + B[i] + B[i+1] , 큰 의미는 없지만 수식으로 나타내면 P[i] = B[i-1] + B[i] + B[i+1];


P[0] = B[0] ( 이 값을 0 혹은 1 로 가정 ) + B[1];

이렇게 B[1]을 구할 수 있음, P는 이미 알고 있기 때문에


이제 문제되는 부분은 B가 올바르게 구해졌는지 아닌지 체크

- P[i] - B[i-1] - B[i] = B[i+1]; -> 이렇게 구한 값이 0 혹은 1이 아니면 올바르게 추출되지 않았다고 판단하면 된다. 


어렵게 생각하면 어렵지만 정말 쉬운 문제! 




예전에 포스팅하였던, 


HTML 기반 Material 디자인 라이브러리(?) - Angular Material 을 자세히 알아보기 전에 

Angular JS에 대해 알아봐야 할 것 같아, 글을 남긴다.


Angular JS는 Javascript MVW Framework 라고 하는군. ( MVW에 관련해서는 이곳을 참조 - https://plus.google.com/+AngularJS/posts/aZNVhj355G2 ) Model - View - Whatever ... ㅋ


어떻게 사용하는지, 간단한 예제는 다른 곳에도 나와 있는 곳이 많이 있으므로 이 부분도 링크로 대체 

- http://inspiredjw.tistory.com/28 

위의 링크에서 보면 jQuery를 먼저 로딩하면 AngularJS에서 제공하는 jqLite를 사용하지 않고 jQuery를 사용해서 DOM 접근을 한다니 참고!


사실 이 포스팅해서 명확히 하고 싶은 부분은, 자바스크립트로 MVVM 패턴 혹은 , MVW 혹은 MVC 패턴을 어떻게 구축하느냐는 것이다.



3
4
5
6
7
8
9
10
<!doctype html>
<html ng-app>
  <head>
    <script src="http://code.angularjs.org/angular-1.0.0rc10.min.js"></script>
  </head>
  <body>
      <input type="text" ng-model="yourName">
      <p>안녕하세요, {{yourName}} !!!</p>
  </body>
</html>

- 출처 : http://www.nextree.co.kr/p3241/

- Angular JS로 위와 같이 개발, 코딩이 가능하다고 하는데 위처럼 쓰기는 쉬워도 막상 저렇게 AngularJS 같은 무언가를 개발을 하려고 하면 답이 없다. 


그래서 지금은 가장 간단한 형태의 MVVM 패턴, 라이브러리를 구축해보고자 한다.

HTML은 아래같이 구성하겠다.



  <div data-value="helloworld"></div>


  화면엔 그냥 

  helloworld 만 출력 


개발 편의상 DOM Selector는 jQuery를 사용하도록 하겠다.




- 일단 위와 같이 작성하면 1차 목표는 달성.

하지만 위와 같이 구현하였을 경우 MVC, MVVM 등 관련 적용과는 굉장히 거리가 있어 보인다. ( 단순히 특정 DOM을 선택해서 데이터를 직접 입력하는 방식이기 때문에 )


Javascript 상으로 MVVM 패턴을 적용하려면 먼저 Javascript object와 DOM의 연결? 이 필요하다.

일단 HTML을 아래와 같이 변경하겠다.


 <div data-value="wow"></div>

<div data-value="wow2"></div>


위의 두 DIV를 Javascript Object wow, wow2에 연결하겠다. MVVM 패턴을 적용해서 이야기하면 View를 HTML로 위와 같이 구성하고 ViewModel을 wow, wow2 로 각각 설정하겠다.




HTML 상으로 각각의 value를 표현해야하기 때문에 위의 Object에 value 프로퍼티를 추가하도록 하겠다.


이제 HTML(View), Object(View Model) 를 연결하는 코드를 추가해보자. 반복되는 코드가 예상되므로 별도 Object로 작성을 한뒤 wow, wow2에 Apply하는 방식으로 제작을 하겠다. ( 이부분은 기존 jQuery, knockout을 일부 참조 하였다 )

먼저 공통코드 ( 편의상 Pattern으로 명명 )



이제 wow, wow2에 커스텀 함수를 추가하겠다. update라고 하겠음 

이제 위에서 작성하였던 document ready 함수를 일부 수정하겠다. 이제 요정도 했으면 어느정도 최소한의 MVVM 패턴을 구성했다 할 수 있겠다.ㅋ.. 



동작 과정을 조금 정리하면

기본 함수를 Pattern에 적용해 놓고, wow, wow2 object를 구성 이제 각각 object에 Pattern 을 apply한다.

apply후 Object 각각 에 커스텀 함수를 추가하고 document ready 시점에 해당 object와 html view를 연결한다. ( 바인드라 하는게 더 나으려나.. ) 전체 소스를 붙여넣는 것으로 이번 포스팅은 마무리! 다음에는 ViewModel이 업데이트 되는 시점에 View를 변경하는 코드를 작성해보겠다.





어제 작성한 코드 중에 나름 필요한 코드가 있어 이곳에 다시 업로드


안드로이드 스크린 사이즈 가져오기 ( Fullscreen size ) 

  public int [] getScreenSize(Activity context) {

        Display display = context.getWindowManager().getDefaultDisplay();
        int [] realSize = new int[2];

        if (Build.VERSION.SDK_INT >= 17){
            DisplayMetrics realMetrics = new DisplayMetrics();
            display.getRealMetrics(realMetrics);
            realSize[0] = realMetrics.widthPixels;
            realSize[1] = realMetrics.heightPixels;
        } else if (Build.VERSION.SDK_INT >= 14) {
            try {
                Method mGetRawH = Display.class.getMethod("getRawHeight");
                Method mGetRawW = Display.class.getMethod("getRawWidth");
                realSize[0] = (Integer) mGetRawW.invoke(display);
                realSize[1] = (Integer) mGetRawH.invoke(display);
            } catch (Exception e) {
                realSize[0] = display.getWidth();
                realSize[1] = display.getHeight();
            }
        } else {
            realSize[0] = display.getWidth();
            realSize[1] = display.getHeight();
        }
        return realSize;
    }


* 하단 시스템 바(System bar)가 있는 폰에서 나름 필요한 코드가 아닌가 싶음. 

* 안드로이드 버전 14 이하(4.0)에서 원활히 동작 


제목이 길다.


알고리즘 실력이 점점 떨어지는 것 같아. 예전에 구입하였던 프로그래밍 대회에서 배우는 알고리즘 문제해결전략이라는 책을 다시 보던 중 정리 차원에서 남긴다.

제목 그대로 1차원 배열에서 연속된 부분에서 그 합이 최대인 구간의 값을 구하면 되는 문제.

책에 제시된 샘플은 

[-7, 4, -3, 6, 3, -8, 3, 4]

답은 4,-3,6,3 구간으로 , 합을 구했을 경우 10이 나온다.


이 문제를 처음접했을때 가장 쉽게드는 생각은 다 구해서 최대 구간과 값을 구한다.

-> 가장 무식한 방법이 아닐까 싶다. 그래도 가장 확실히 구할 수 있다 라는 것에는 의심의 여지가 없다.


간단히 코드를 작성해보면 

int 결과 = 0;

for ( int i = 0 ; i < Array크기 ; i++ )  {

  int Sum = 0 ; 

   for ( int j = i ; j < Array크기 ; j++ )  

   Sum += Array[j];

   비교후 가장 큰 값 저장

  } 

}

<- 결과 리턴 


코드 보기가 약간 그지같긴 하지만 어쩔 수 없다,.


이렇게 진행하였을 경우 N제곱이 소비되기 때문에 큰 값이 들어오면 처리할 수가 없다.

그럼 2번째 방법으로 생각할 수 있는건, 어케어케 구하면서 진행하는 것이다. (?) 보통 동적 프로그래밍으로 코드를 작성하려면 나름 타당한 수식을 생각해서 이를 코딩으로 구현해야하기 때문에 곰곰히 생각을 해보았다. 요런건 보통 점화식을 통해 해결하는 경우가 많아 살짝 잘라서 생각을 해보았는데,

A 배열의 최대 부분합을 B 배열이라고 하면 B배열의 제일 왼쪽 혹은 오른쪽을 i 인덱스라 했을때 아래와 같이 표현할 수 있다. (편의상 제일 오른쪽 인덱스를 i라 하겠음 )


B = B[i-1](임의로 표현) + B[i] 


요렇게 하면 나름 타당한 점화식이라 할 수 있겠다. 초기 코드만 살짝 잘 처리해주면 큰 문제가 없을꺼 같다.

for ( int i = 0 ; i < 크기 ;  i++ ) {

 합 = max( 합 , 0 ) + A[i];

 결과 = max( 합, 기존 최대값 ) 

}

결과 리턴...


확실히 글로 쓰니 생각 정리가 명확히 된다.

이제 비슷한 문제 다시 리뷰하면서 생각을 좀 더 구체화 해보자! 







집에 오던 길에 HTML, JS, CSS 기반으로 Material 디자인 적용을 쉽게 도와주는 라이브러리를 만들어 볼까 생각했는데,

구글링을 해보니, 이미 있네.. ㅋ




생각했던 것들이 거의 완벽하게 구현되어 있어, 나중에 비슷하게 구현할 일 있으면 써야겠다싶어 샘플 코드를 보니 커스텀태그, 어트리뷰트 등 다양한 HTML5의 피쳐들을 사용하는 것 같아 자세히 알아 보고자 이곳에 킵해놓는다.

Angularjs Materai ( https://material.angularjs.org )

메뉴 구성은 

LAYOUT 

THEMING 

SERVICES

DIRECTIVES


하나씩 챙겨봅시다. 





'시작전!' 카테고리의 다른 글

코드이그나이터에 관한 아주 짧막한 생각..  (0) 2015.02.01

PHP로 Datetime 익스텐션을 만들고 있었는데, 아래에도 언급하였지만 Github에도 등록을 하는 게 나을꺼 같아, Github에 등록된 다른 라이브러리를 찾아보다 묘한 파일을 하나 발견하게 되었다.



composer.json  


거의 모든 PHP 라이브러리가 해당 파일을 포함하고 있었다. 뭔가해서 다시 구글링을 해보니 아래의 사이트를 발견!


나도 왠지 이아이를 반드시 써야할 것 같은 의무감이 들어 Getting Started를 클릭하여 하나하나씩 읽어보았다.


1. Dependency management 

- 컴포저는 프로젝트 베이스로 패키지 또는 라이브러리를 관리한다.  

- npm, bundler 에서 영감을 받았다. (개념적으로 이해하기 어려운 분들은 컴포저(composer)가 npm,bundler와 비슷한 역할을 한다고 생각하시면 될듯)

- 컴포저를 통해 특정 라이브러리의 디펜던시 문제를 해결할 수 있다. 

( 간단히 정리해보면 A라이브러리가 있고, A가 B라이브러리에 디펜던시가 있을때 개발자는 A만 INCLUDE해도 컴포져를 통해 발생할 수 있는 문제를 해결할 수 있다. 컴포져가 알아서 디펜던시가 있는 라이브러리 혹은 프로젝트를 다운받아 설치해준다.  )


2. Declaring dependencies

- 위에서 컴포저의 개념에 관해 간단히 설명했고 이제 어떻게 사용하는지 알아보자!

Sample : 

- monolog 라는 라이브러리를 사용해야 하는 경우 , 프로젝트 내에 composer.json를 생성하고 아래와 같이 파일을 생성한다.

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}

https://github.com/Seldaek/monolog

monolog/monolog <- 라이브러리 이름 

1.2.* <- 필요한 라이브러리 버전 


이렇게 composer.json 파일을 생성하고,  composer가 설치되어있다는 가정하에

php composer.phar install

쉘에서 위와 같이 입력하면 

해당 프로젝트 내에 vendor/monlog/monolog 로 관련 파일들이 추가 된다.


이제 monolog를 작업 중인 프로젝트 내에 포함하려면 

require 'vendor/autoload.php';

요렇게 기재하면 된다. 이제 해당 라이브러리를 php내에서 사용할 수 있다.


이 정도까지 알아보니, 왜 github의 php 라이브러리들이 composer.json을 작성하여 업데이트 하는지 이해가 된다. json 포맷이나 어떤식으로 디펜던시를 찾아서 처리하는지 궁금한 부분이 있지만 일단 오늘은 여기까지.


3. System Requirements 

- 컴포저는 PHP 5.3.2 이상에서 동작함!

- 컴포저는 윈도우, 리눅스, OSX에서 원활히 돌아감.



설치 방법은 굉장히 쉽기 때문에 링크로 대체! 

https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx


--


확실히 PHP는 특정 라이브러리 INCLUDE 나 REQUIRE 과정이 한번 꼬여버리면 답도 없어서 npm같은 프로그램이 있었으면 했는데, 이미 있었구나.. ㅋ


composer, 한번 잘 써 봅시다! 


주말 남는 시간을 어떻게 활용할까 고민하다가 평소에 자주 쓰는 함수들을 모아 PHP 라이브러리를 만들겠다고 결심, 기왕이면 오픈소스로 개발하는 것이 나을 꺼 같아, 깃허브에 계정을 생성하고 기존 PHP 라이브러리들을 찾아보았다.


이것 저것 보던 중에 나름의 개발룰이 있다는 것을  알게되었고, 조금 더 명확하게 알고자 여러 검색 엔진을 통해 관련 자료들을 찾아보았다. 


영어가 능숙하지 않기 때문에, 처음엔 국내 검색엔진을 통해 자료들을 찾았는데 아쉽게도 원하는 정보를 구할수가 없었다.  같은 검색어를 구글에 넣어보았더니, 어렵지 않게 원하는 정보를 찾을 수 있었다. ( 물론 해석에 시간이 소요되긴 했다. )

이런 활동 중 몇가지 느낀 점이 있어 블로그에 글을 남긴다.


1. 확실히 구글이 낫다.

 최근에 국내 포털들의 검색 품질이 많이 좋아졌다고는 하나,  전문적(?)인 지식을 검색함에 있어 구글의 활용도는 압도적이다. 확실히 더 넓고 깊은 느낌을 준다.( 거기에 개인적으로 네이버의 섹션별(블로그, 카페, 뉴스 이런형식으로 구분되는) 검색 결과 방식을 그리 선호하지 않는다. )


2. 대한민국에 아직은 "빨리" 사용하고자 하는 분들이 많다.

 사실 이 생각이 들어 이 글을 쓰게되었다. 네이버, 다음 등에서 특정 모듈, 라이브러리가 어떤 것인지 찾아보려했지만 원하는 정보는 아쉽게도 없었다. 물론 관련 검색 결과는 많이 나왔지만 대부분 이 라이브러리를 어떻게 프로젝트 내에 포함시킬수 있는지만 적혀있는 곳이 대부분 이었다. (특정함수, 메소드 사용을 위해) 

 검색된 결과를 보며, 아직은 라이브러리, 모듈을 어떻게 "빨리" "사용"하는 부분에만 집중되어 있구나 라는 생각이 절로 들었다. ( 내 검색 실력이 미숙해서 일수도 있다.)

 물론 이런 부분이 "나쁘다", "안좋다" 평가할 순 없겠지만 아쉬운 것은 사실이다.


3. 생각보다 굉장히 쓸만한 코드가 많이 올라와 있다. 하지만 거기까지...

 생각했던 몇가지 기능들을 이미 구현한 사례가 있을까 싶어 찾아보았는데 생각외로 비슷한 함수들을 제작해놓으신 분들이 많이 계셨다. ( 한국어 사이트 기반 ) 하지만 아쉬운점은 거기까지 였다는 점. 이를 조금 더 정리해서 모듈화, 라이브러리화 하였으면 이곳에서도 어쩌면 jQuery , CodeIgniter같은 글로벌 프레임웍이 나오지 않았을까 하는 아쉬움이 든다. (한국의 3D IT 문화와 빨리빨리 문화가 결합하여 이런 결과가 나온것이 아닌가 하는 생각이 들기도 한다.)


 삐딱하게 쓴 글이기는 하나, 검색을 하며 느낀 점은 확실히 있다. 나아지고 있다는 점이다. 국내 개발 환경이 열악함을 인지하고 개선하고자 하는 분들이 많이 계신것 같다.

미약하게나마 나도 도움이 되었으면 한다.


블로그를 더 열심히 운영해야하는 이유도 생겼다.


다들 화이팅!




안녕하세요, 개인 개발자(?) 입니다.

약간의 여유가 있어 

개발하고자 하는 이런 저런 것들을 정리해야하는 것이 나을 것 같아 블로그를 개설하게 되었습니다.

최선을 다해 정리해보도록 하겠습니다.


아마 주로 언급될 내용은 PHP, Javascript, CSS, C#, Android 쪽이 아닐까 합니다.

잘 부탁합니다.