2014. 6. 16. 11:01


그누보드는 게시판의 글과 댓글이 하나의 테이블로 되어있습니다. 

게시판에 따라, 따로 테이블로 되어 참조키를 이용하여 불러오는 경우도 있습니다만, 그누보드는 하나의 테이블로 되어있는데, 이는 제목과 내용을 검색하는데 용이한 장점이 있겠습니다. 

그리고 참고로 게시판의 테이블은 그누보드경우 게시판마다 각각의 테이블이 존재합니다. 생성은 관리자에서 게시판 생성시 테이블이 만들어지며, 그 테블명은 config.php 에서 정의된 $g4[write_prefix] 와 생성시 입력한 아이디값 bo_table 값으로 이어져 생성됩니다. 

XE 경우 여러개의 게시판이라도 하나의 테이블로 되어있습니다. 속도가 느리지 않겠냐는 우려에 XE 개발자경우 mysql의 힘을 믿는다는 글귀를 본적있는 듯합니다. 가능한 이야기일겁니다. 

각각 테이블의 게시판과 하나로 된 테이블의 게시판과의 장단점은 분명 있습니다. 

하나로 된 테이블 구조에서 통합적으로 게시글을 불러들일 경우 별 어려움 없이 가능합니다. 

반면 그누보드처럼 게시판수에 따라 테이블이 있다면 이때 통합적으로 게시글을 불러올려면 union 을 써야 하고, 이때 불러들일 field 값을 일일이 줘야 합니다. 이유는, 게시판에 생성되어있는 필드들의 순서값이 다를 수 있어 서로 다른 결과값을 가져올수 있습니다. 만약, 다른 방법이 있다면 알려주시면 감사하겠습니다. 

그누보드 게시판 테이블을 이야기하기전에 위와 같이 언급한데에는 다른 형태의 게시판이 있고 그 차이가 어떤지 아주 간략히라도 이해하는데 도움이 되고자함입니다. 

그누보드에서 일반 게시글인가, 댓글인가 구분을 해주는데 필드명은 wr_is_comment 입니다. 

그럼 게시글만 출력하게되는 목록과 관련된 부분을 한번 보겠습니다. 

bbs/list.php 내 포함된 부분입니다 

1if ($sca || $stx)
2{
3    $sql " select distinct wr_parent from $write_table where $sql_search $sql_order limit $from_record, $board[bo_page_rows] ";
4}
5else
6{
7    $sql " select * from $write_table where wr_is_comment = 0 $sql_order limit $from_record, $board[bo_page_rows] ";
8}
9$result = sql_query($sql);



$sca : 카테고리, $stx : 검색단어 로 검색시 댓글까지 검색을 한다는 것이 보입니다. 그 조건이 아니면? 게시글만 가져온다는 내용입니다. 


그렇다면, 게시글에 대한 댓글은 어떤 연결고리로 불러들일지 궁금해지겠지요. 

wr_parent 입니다. 

댓글들이 가지는 부모의 wr_id 값을 가지는 놈입니다. 

댓글을 예를들기 위해 이제 글내용보기시 로 넘어가면 위 쿼리문에서 본문글을 가져왔으니, 그 아래 댓글을 가져오는 쿼리문이 있을겁니다. 

bbs/view_comment.php 부분입니다. 

1$sql " select * from $write_table where wr_parent = '$wr_id' and wr_is_comment = 1 order by wr_comment, wr_comment_reply ";


'' 카테고리의 다른 글

트위터 부트스트랩 다운로드  (0) 2014.06.16
DISQUS 소셜 댓글 달기  (1) 2014.06.16
남은 글자수 체크  (1) 2012.07.23
Trigger an Error - 오류 발생시키기  (0) 2012.05.19
jQuery Mobile 페이지 이동  (1) 2011.11.03
Posted by 다오나무
안드로이드2014. 6. 3. 15:45

전에 포스팅한 폰갭, 안드로이드 플랫폼 추가하는 중에 에러가 발생하는 경우! 에 이어서 추가로 작성하는 글입니다.


위 글에서는 윈도우 환경에서 에러가 나는 경우에 ant 설치하는 방법에 대해 다루고 있습니다.

그런데, OS X (Mac)에서도 폰갭(Phonegap)에 안드로이드(Android) 플랫폼을 추가하려고 하면 동일한 에러가 발생합니다.

역시 동일하게 ant를 설치해 주어야 합니다.


개념상으로는 윈도우나 OS X 이나 ant 설치하는 방법이 동일하지만, 몇가지 명령어가 다릅니다.

다만, OS X 와 리눅스는 유닉스 계열 운영체제라서 아래 표시하는 방법은 리눅스에서도 동일하게 사용 가능한 방법이라고 보시면 됩니다.


ANT는 아파치에서 주도하는 프로젝트 중 하나로, 소프트웨어 빌드 도구입니다.

이제 설치해 보겠습니다.



ANT를 다운받습니다.


ANT의 설치는 압축을 해제하고 환경변수를 등록하는 것으로 이루어집니다.

http://ant.apache.org/ 에서 바이너리로 다운 받아서 적당한 위치에 압축 해제를 하면 됩니다.


저의 경우에는 /Users/사용자계정명/ 에 압축을 풀었습니다.

일반적으로는 /usr/bin/ 을 많이 사용하는 것 같습니다.


그래서 제 경우에는 결과적으로 /Users/username/apache-ant-1.9.4/ 에 설치가 된 것입니다.


환경변수 추가 전에 ant가 실행되는 것을 테스트 해보고 싶으시면 다음과 같이 하시면 됩니다.


[압축 해제한 디렉토리]/bin/ant -version



ANT 설치된 디렉토리를 환경변수에 지정


단순히 다음과 같이 타이핑 하시면 됩니다.


export ANT_HOME=[압축해제한디렉토리]/ant

export PATH=${PATH}:${ANT_HOME}/bin


ANT_HOME 이란 환경변수에 압축 해제한 곳을 저장하고, PATH 변수에 디렉토리를 추가하는 형태로 작업합니다.

환경변수 지정할 때는 오타 발생하지 않도록 주의해서 작성해 주세요.

Posted by 다오나무
안드로이드2014. 6. 3. 10:28

일본 사이트 : http://whgadget.blog.jp/archives/38140828.html

국내 사이트 : http://android-app-easy.blogspot.kr/2014/05/blog-post.html

'안드로이드' 카테고리의 다른 글

OS X에 ant 설치하기  (0) 2014.06.03
안드로이드 launcher icon 실행 아이콘 사이즈  (0) 2014.01.14
안드로이드 마켓 등록  (0) 2012.07.03
Posted by 다오나무
코드이그나이터2014. 5. 28. 11:26

( /application/system/helper/text_helper.php 파일에 추가 )
// UTF-8 한글자르기 함수
function hc( $str, $n = 50, $end_char = ' ...' )
{
    $CI =& get_instance();
    $charset = $CI->config->item('charset');

    if ( mb_strlen( $str , $charset) < $n ) {
        return $str ;
    }

    $str = preg_replace( "/\s+/iu", ' ', str_replace( array( "\r\n", "\r", "\n" ), ' ', $str ) );

        if ( mb_strlen( $str , $charset) <= $n ) {
            return $str;
        }
        return mb_substr(trim($str), 0, $n ,$charset) . $end_char;
}



[controlloer]
$this->load->helper('text');
$str = '일이삼사오육칠팔구십';

[view]
hc($str, 5);

Posted by 다오나무
AWS2014. 5. 21. 11:04

ColudFront는 AWS에서 제공하는 CDN(Contents Delivery Network) 서비스입니다. S3에 서비스하고자 하는 파일들을 올려놓고 간단한 설정을 통해서 CDN을 이용할 수 있습니다.


Management Console에서 CloudFront메뉴로 들어간 다음 "Create Distribution"을 선택해서 CDN서비스를 시작할 수 있습니다. 서비스 종류에 따라서 다운로드용과 스트리밍용으로 구분이 됩니다. 



스트리밍이야 유투브등의 좋은 무료서비스도 많으니 다운로드를 살펴보도록 하겠습니다.

Download를 선택하고 다음으로 넘어가면 아래와 같은 화면이 나옵니다.

여기서 Origin Domain Name에 원본 파일이 있는 S3 bucket을 입력합니다. 해당 텍스트 박스를 클릭하면 그림과 같이 현재 자신이 보유하고 있는 S3의 목록이 나타납니다.


여기서 보면 S3 뿐만 아니라 Elastic Load Balancers도 선택할수 있습니다.

Elastic Load Balancers(ELB)는 AWS에서 제공하는 로드밸런서입니다. 이것역시 가상이며, 이 로드밸런서에 EC2를 할당해서 사용할 수 있습니다. CloudFront를 ELB에 설정하면 정적인 웹페이지에 CDN을 적용할 수 있습니다. 그러나 실제 웹페이지를 구성하다보면 페이지는 대부분동적으로 구성되게 됩니다. 그래서 CloudFront에 ELB를 적용하려면 웹페이지를 개발할때 잘 설계해서 개발해야 합니다.

S3목록을 선택하면 Origin ID는 자동으로 입력됩니다. 다음단계로 넘어가면 CloudFront에 대한 설정을 할 수 있습니다.

여기서 Path Pattern은 선택된 Bucket에서 어떤 대상들에게 CloudFront를 적용할 것인지를 나타냅니다. 기본설정은 해당 Bucket의 전체 객체에 적용하는 것이고, 생성한 다음에 CloudFront 관리화면에서 변경할 수 있습니다.

HTTP와 HTTPS 프로토콜을 모두 사용할 것인지 HTTPS 만 사용할 것인지 선택할 수 있고, Cache를 어떻게 관리할 것인지 선택할 수 있습니다. Use Origin Cache Headers를 선택하면 원본헤더에 있는 Cache-Control정보를 이용하고 Customize를 선택하면 직접 TTL 값을 입력해서 관리할 수 있습니다 .

마지막으로 Forward Query Strings는 동적인 페이지에 대해서는 지원을 하지 않는 CloudFront에서 나름의 방법으로 동적인 페이지를 지원해주는 방법입니다. Yes를 선택하면 URL을 입력할때 GET 방식으로 URL뒤에 요청을하는 파라메터를 인식해서 자동으로 구분해서 CDN을 적용해 줍니다. 그러나 POST방식은 인식하지 않습니다. 이 옵션을 No로 선택하면 캐싱성능이 개선됩니다. 다음으로 넘어갑니다.


Alternate Domain Names는 CloudFront에 CNAME을 적용하는 것입니다. CloudFront를 적용하게되면  Coludfront.net에 대한 주소가 생성되게 되는데 사용자가 원하는 도메인 명을 사용하고 싶을때 이부분을 설정하면 됩니다.

Default Root Object는 CloudFront에 접속했을때 루트객체를 어떤것으로 할 것인지에 대한 것입니다.

Logging은 On을 선택하면 S3에 자동으로 CloudFront파일들에 대한 로깅정보가 남게 됩니다.

Comments는 주석입니다.

Distribution State는 CloudFront를 사용할것인지 아닌지에 대한 설정입니다.

모든 설정을 하고 다음으로 넘어가서 설정내용을 확인한 다음에 Create 버튼을 선택해서 CloudFront를 생성합니다.



CloudFront가 생성된 화면입니다. 여기서 붉은박스가 쳐져 있는 부분을 선택해서 세부설정 정보를 볼 수 있습니다.



위의 화면에서 Domain Name이라고 되어 있는 부분이 CloudFront 가 적용된 주소입니다.

사용자가 S3에 있는 객체에 접근할때 원래의 S3주소가 아니라 위에 있는 Domain Name에 있는 정보를 이용해서 접근하게 한다면 자동으로 CDN이 적용되게 됩니다. 이로써 CloudFront를 사용할 수 있게 되었습니다.

CloudFront를 사용하면서 한가지 주의할점은 CDN이다보니 데이터들이 캐시가 되는데 원본(예를들어 S3)에 있는 데이터들을 업데이트 하더라도 캐시된 데이터에 즉시 반영되지 않는다는 점입니다. 캐시된 데이터는 24시간뒤에 원본의 변경내역을 확인해서 반영하도록 됩니다. 그러나 실제 사용하다보면 즉시 변경내역을 반영해야할 일이 있는데요.

이때는 위 메뉴에서 Invalidations를 이용하면 됩니다.


Invalidations 메뉴에서 Create Invalidation 메뉴를 선택한 다음에 나오는 Create Invalidation창에 변경내역을 바로 적용하려는 객체들의 정보를 입력하고 Invalidate버튼을 눌러서 작업을 시작하면 원본의 변경내역이 캐시에 직접 반영되게 됩니다.

Invalidations기능은 한달에 1000개의 객체까지 무료이고 1000개가 넘어가면 과금이 됩니다. 또한 Invalidate 작업이 진행되는 동안 누군가가 해당 캐시에 접근하게되면 지우는것과 CloudFront를 이용하는 작업이 동시에 진행되게 되서 시간이 지연되거나 Invalidate작업이 여러번 일어날수도 있습니다.

Posted by 다오나무
우분투2014. 4. 2. 23:56

1. Java 설치

     1) 우분투에 오라클jdk를 설치하기 위해서는 아래 명령어를 입력하면 자동으로 설치가 됩니다.

sudo apt-get install oracle-jdk7-installer 

제거할 경우 : sudo apt-get remove 패키지명

 

     2) 패키지를 찾을수 없다고 나올경우

         아래 명령어를 입력하여 패키지 목록을 업데이트 합니다.

sudo apt-get install python-software-properties

sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update

         업데이트가 완료되었으면 설치가 가능합니다.  

 

2. Java 설치 확인

java -version


java version "1.7.0_51"

Java(TM) SE Runtime Environment (build 1.7.0_51-b13)

Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

    위와 유사한 메시지를 출력해주면 설치가 완료상태를 확인할 수 있습니다.

 

3. Tomcat7 설치

sudo apt-get install tomcat7

 

4. Tomcat 버전 확인

sh /usr/share/tomcat7/bin/version.sh

 

Using CATALINA_BASE:   /usr/share/tomcat7

Using CATALINA_HOME:   /usr/share/tomcat7

Using CATALINA_TMPDIR: /usr/share/tomcat7/temp

Using JRE_HOME:        /usr

Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar

Server version: Apache Tomcat/7.0.42

Server built:   Aug 1 2013 01:42:03

Server number:  7.0.42.0

OS Name:        Linux

OS Version:     3.11.0-12-generic

Architecture:   amd64

JVM Version:    1.7.0_51-b13

JVM Vendor:     Oracle Corporation

ubuntu@ip-172-31-22-219:/usr/share/tomcat7/bin$ cd ~

ubuntu@ip-172-31-22-219:~$ sh /usr/share/tomcat7/bin/version.sh

Using CATALINA_BASE:   /usr/share/tomcat7

Using CATALINA_HOME:   /usr/share/tomcat7

Using CATALINA_TMPDIR: /usr/share/tomcat7/temp

Using JRE_HOME:        /usr

Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar

Server version: Apache Tomcat/7.0.42

Server built:   Aug 1 2013 01:42:03

Server number:  7.0.42.0

OS Name:        Linux

OS Version:     3.11.0-12-generic

Architecture:   amd64

JVM Version:    1.7.0_51-b13

JVM Vendor:     Oracle Corporation

    위와 유사한 메시지를 출력해주면 설치가 완료상태를 확인할 수 있습니다.

 

5. Tomcat 서비스 구동

sudo service tomcat7 start

 

6. 웹 브라우져로 구동 확인

 

 

Posted by 다오나무
안드로이드2014. 1. 14. 18:51

drawable-hdpi 72 * 72

drawable-ldpi 32 * 32

drawable-mdpi 48 * 48

drawable-xhdpi 96 * 96

drawable-xxhdpi 144 * 144

'안드로이드' 카테고리의 다른 글

OS X에 ant 설치하기  (0) 2014.06.03
안드로이드 22.3 다운그레이드  (0) 2014.06.03
안드로이드 마켓 등록  (0) 2012.07.03
Posted by 다오나무
우분투2013. 12. 11. 17:45

sudo apt-get install php5-curl sudo /etc/init.d/apache2 restart

 


http://ubuntuforums.org/showthread.php?t=391313

 

Posted by 다오나무
iOS2013. 12. 1. 16:01

일반적으로 cURL을 이용하여 HTTP 프로토콜 데이터를 POST 방식으로 보내는 PHP 함수는 다음과 같습니다.

  1. function https_post($uri$postdata)  
  2. {  
  3.     $ch = curl_init($uri);  
  4.     curl_setopt($ch, CURLOPT_POST, true);  
  5.     curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);  
  6.     $result = curl_exec($ch);  
  7.     curl_close($ch);  
  8.     return $result;  
  9. }  

하지만, 이 방식은 결과값이 전달 될 때 까지 블럭(block) 된다는 것이 문제입니다. 따라서 결과값이 불필요한 경우에는 요청을 보내고 잊어버리면 그만입니다. 아쉽게도 PHP의 cURL 라이브러리는 비동기 처리를 지원하지 않습니다. 따라서 직접 소켓을 오픈하여 요청을 보내야 합니다.

  1. function curl_request_async($url$params$type='POST')  
  2. {  
  3.     foreach ($params as $key => &$val)  
  4.     {  
  5.         if (is_array($val))  
  6.             $val = implode(','$val);  
  7.         $post_params[] = $key.'='.urlencode($val);  
  8.     }  
  9.     $post_string = implode('&'$post_params);  
  10.   
  11.     $parts=parse_url($url);  
  12.   
  13.     if ($parts['scheme'] == 'http')  
  14.     {  
  15.         $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno$errstr, 30);  
  16.     }  
  17.     else if ($parts['scheme'] == 'https')  
  18.     {  
  19.         $fp = fsockopen("ssl://" . $parts['host'], isset($parts['port'])?$parts['port']:443, $errno$errstr, 30);  
  20.     }  
  21.   
  22.     // Data goes in the path for a GET request  
  23.     if('GET' == $type)  
  24.         $parts['path'] .= '?'.$post_string;  
  25.   
  26.     $out = "$type ".$parts['path']." HTTP/1.1\r\n";  
  27.     $out.= "Host: ".$parts['host']."\r\n";  
  28.     $out.= "Content-Type: application/x-www-form-urlencoded\r\n";  
  29.     $out.= "Content-Length: ".strlen($post_string)."\r\n";  
  30.     $out.= "Connection: Close\r\n\r\n";  
  31.     // Data goes in the request body for a POST request  
  32.     if ('POST' == $type && isset($post_string))  
  33.         $out.= $post_string;  
  34.   
  35.     fwrite($fp$out);  
  36.     fclose($fp);  
  37. }  

위 코드는 인터넷에 부유 중인 것을 HTTPS (HTTP Secure) 프로토콜도 지원하도록 수정 한 것입니다. 이 방법을 이용하면 전송 할 데이터를 소켓으로 방출 한 후에 곧바로 함수가 리턴됩니다. 즉, 데이터를 받기 위한 추가적인 처리를 프로세스가 감당 할 필요가 없다는 것을 의미합니다.

만약 빠른 응답 속도를 보장 받는 것이 최우선 과제라면 다음과 같이 프로세스를 백그라운드로 실행 하게 만들 수도 있겠습니다. 단, 아래 코드는 POSIX 계열에서만 사용 가능합니다.

  1. function curl_post_async($uri$params)  
  2. {  
  3.         $command = "curl ";  
  4.         foreach ($params as $key => &$val)  
  5.                 $command .= "-F '$key=$val' ";  
  6.         $command .= "$uri -s > /dev/null 2>&1 &";  
  7.         passthru($command);  
  8. }  

이 방식은 지체 없이 curl 프로세스를 백그라운드로 구동하기 때문에 소요 시간이 거의 없다고 볼 수 있습니다.

'iOS' 카테고리의 다른 글

apple push notification 쉽고 간단하게 구축하는 easy apns  (0) 2013.07.10
셀 높이 조절  (0) 2013.06.25
앱 정보 가져오기 (앱이름, 버전)  (0) 2013.06.19
스토리보드 커스텀 셀 (공개)  (0) 2013.06.12
유니코드 출력  (0) 2013.02.01
Posted by 다오나무
기타2013. 9. 14. 18:05

 

Posted by 다오나무