반응형
반응형

이미 존재하는 데이터에 대해서, selectbox로 표현을 하기 위해선 값을 참조하여 option selected 기능까지 구현을 해주어야 한다.


근데 option value값과 같은 데이터가 남아있다면, 편리하게 구현이 가능한데, 텍스트만 남아있고 원하는 데이터가 없는 경우에는 별도로 처리가 필요하다.


1. value 기반의 option selected

var data = "1234";
$('#select_id').val(data);


2. text 기반의 option selected

var txt = "txtData";
$('#select_id option').filter(function() {
    return this.text == txt;
}.attr('selected', true);


filter 기능은 java8부터 지원하는 lambda식에서도 봤던 기능인데, 비슷한 형태로 사용이 가능한 것 같다.

요즘 프론트쪽 개발 요청이 많이 들어와서 앞으로 자주 사용하게될 기능인듯..

반응형
,

[Go] set timezone

개발/Go 2016. 6. 28. 15:28
반응형

클라에서 서버로 시간값을 파라미터로 넘길때나, 서버의 경우 시간값을 상당히 중요시 하기 때문에,

특정 상황에 맞게 timezone변경을 하여야 한다.


외부 라이브러리를 사용하면 좀 더 깔끔하게 변환을 할 수 있겠지만,

귀찮은 관계로.. native 코드로 아래와 같이 구현을 할 수 있다.

아래 코드는 KST(한국시간 UTC+09:00)로 변환하는 과정을 설명하고 있다.

func main() {
    t := time.Now().UTC()    // UTC기준 현재 시간을 가져온다.
    t = t.In(time.FixedZone("KST", 9*60*60)) // 9시간을 더하고, KST라고 부른다.
    t.Format("2006-01-12 15:04:05")   // yyyy-MM-dd HH:mm:ss 형태로 formatting한다. (선택)
}


golang의 경우 따로 특정 타임존에 대한 템플릿이 없고, 위와 같이 만들어 낼 수가 있는 게 특이했고,

String Formatting도 다른 언어는 yyyy-MM-dd 이런식으로 패턴을 적어주어야 하는데, 그냥 숫자만 대충 넣어주면 알아서 바꿔준다.


반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,
반응형

fmt에서 출력하는 콘솔 로그와, log에서 출력하는 파일 로그를 동시에 찍고 싶은 경우가 생겨서,

Printf를 하나의 function으로 만들어서 사용하기로 결정했다.


Printf는 string format과 가변인자를 전달받을 수 있도록 구성되어 있다.

func Printf(format string, v ...interface{}) {
     ...
}


Java의 경우 가변인자를 전달할때 변수명만 넘겨주면, 제대로 동작을 했었기에

아래와 같이 만들어보았다.

func logging(format string, v ...interface{}) {
    fmt.Printf(format, v)
    log.Printf(format, v)
}


테스트를 해본결과 변수 여러개를 넘겼을 경우, 가변인자의 0번째 값만 전달이 되는 현상이 발생을 하였다.


golang에서는 가변인자 전달 시에는 아래와 같이 전달해주는 function에도 ... 를 붙여서 사용해야 한다고 한다.

func logging(format string, v ...interface{}) {
    fmt.Printf(format, v...)
    log.Printf(format, v...)
}


다시 테스트를 해보니, 원하는대로 동작한다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] set timezone  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,
반응형

간단하게 API 호출을 하는 프로그램을 개발해달라는 요청이 있어서, 고민하던 중 Windows / Linux 둘다 돌아가야 하겠고,

여러번 귀찮게 작업 안할 수 있고, 심플하게 개발할 수 있는 Go lang을 선택했다.


다만, 구시대 유물과 같은 XML 기반 서버와의 통신을 해야되는 상황이라, 마샬링과 언마샬링에서 삽질을 조금 했다.


1. Marshal

아래와 같은 데이터를 마샬링할 예정이다.



    aaaaa

    eeee



struct를 생성할 때, 생성할 xml에 대한 meta정보를 넣어주는 것만으로 가능하다. 

package main

import (
	"encoding/xml"
	"fmt"
)

type test struct {
	XMLName xml.Name `xml:"test"`
	Abc     abc      `xml:"abc"`
	Eee     string   `xml:"eee"`
}

type abc struct {
	Key   string `xml:"name,attr"`
	Value string `xml:",chardata"`
}

func main() {
	a := &abc{Key: "tester", Value: "aaaaa"}
	v := &test{Abc: *a, Eee: "eeee"}

	output, err := xml.Marshal(v)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(string(output))
}


2. UnMarshal

위에 만든 데이터를 그대로, 언마샬링 해본다.

package main

import (
	"encoding/xml"
	"fmt"
)

type test struct {
	XMLName xml.Name `xml:"test"`
	Abc     abc      `xml:"abc"`
	Eee     string   `xml:"eee"`
}

type abc struct {
	Key   string `xml:"name,attr"`
	Value string `xml:",chardata"`
}

func main() {
	a := &abc{Key: "tester", Value: "aaaaa"}
	v := &test{Abc: *a, Eee: "eeee"}

	output, err := xml.Marshal(v)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(string(output))

	var t test
	err = xml.Unmarshal(output, &t)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(t)
}


attr, chardata 등을 잘 활용하면, xml 데이터를 손쉽게 다룰 수 있는 것 같다.

추가로 xml.Name이 struct 변수에서 생략된 경우, struct Name으로 자동인식하게 된다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] set timezone  (0) 2016.06.28
[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,

[Go] SyntaxHighlighter

개발/Go 2016. 6. 28. 10:32
반응형

최신버전의 SyntaxHighlighter가 golang을 지원하지 않았다.


하지만, 역시 누군가 만들어둔게 있어서 이걸 스크립트 부분에 붙여넣으니 잘 동작을 했다.


/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 *
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
;(function()
{
    // CommonJS
    typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
 
    function Brush()
    {
        var funcs   =   'make';
 
        var keywords =  'break case chan const continue default defer else fallthrough for func go ' +
                        'goto if import interface map package range return select struct switch type var ';
 
        this.regexList = [
            { regex: SyntaxHighlighter.regexLib.singleLineCComments,    css: 'comments' },          // one line comments
            { regex: SyntaxHighlighter.regexLib.multiLineCComments,     css: 'comments' },          // multiline comments
            { regex: SyntaxHighlighter.regexLib.doubleQuotedString,     css: 'string' },            // double quoted strings
            { regex: SyntaxHighlighter.regexLib.singleQuotedString,     css: 'string' },            // single quoted strings
            { regex: /^var \w+/g,                                       css: 'variable' },          // variables
            { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi,             css: 'value' },         // numbers
            { regex: new RegExp(this.getKeywords(funcs), 'gmi'),        css: 'functions' },         // common functions
            { regex: new RegExp(this.getKeywords(keywords), 'gm'),      css: 'keyword' }            // keyword
            ];
 
        this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
    };
 
    Brush.prototype = new SyntaxHighlighter.Highlighter();
    Brush.aliases   = ['golang'];
 
    SyntaxHighlighter.brushes.Golang = Brush;
 
    // CommonJS
    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
})();


위 구문을 <script></script> 부분에 추가한 후,

<pre class="brush:golang"></pre> 이런식으로 사용을 하면 된다.


물론 위 구문을 그대로 복사해서 .js 파일로 만든 후, 업로드하여 script부분에서는 src에 파일 경로를 넣어 참조하게끔하는 방법이 훨씬 간단하다.

(회사라 파일 업로드가 안되는 관계로...)


반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
[Go] 간단한 채팅 서버  (0) 2016.06.11
,
반응형

간단하게 http post 통신을 하는 프로그램을 작성하던 도중, 로그 로테이트 정도는 필요하겠다 싶어서, 찾아봤더니

LumberJack이라는 훌륭한 오픈소스가 있었다. (https://github.com/natefinch/lumberjack)


External Library이기 때문에, 설치를 해주어야 한다.


1. 설치

$ go get gopkg.in/natefinch/lumberjack.v2


2. 사용법

import "log"
import "gopkg.in/natefinch/lumberjack.v2"

func main() {
        log.SetOutput(&lumberjack.Logger{
		Filename:   "./logs/test.log",   // 경로
		MaxSize:    500, // Megabytes단위
		MaxBackups: 3, // MaxAge에 의해서 지워져도, 몇개까지 파일을 유지할지 (이게 필요한가 싶기도함;;)
		MaxAge:     30, // 며칠동안 유지할지
	})
}


Go가 대세라 그런지, 기존 언어에서 썼던 라이브러리나 알고리즘을 검색하면,

정말 많이 나오는거 같아서 이질감이 없어서 좋은거같다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
[Go] 간단한 채팅 서버  (0) 2016.06.11
,
반응형

SSL 인증서 설치 후, 기존 http 요청은 더이상 필요가 없기 때문에, http로 들어온 요청을 모두 https로 강제로 Redirect 시키는 방법에 대해 알아 보았다. 


1. mod_rewrite library를 사용하도록 설정한다.

$ a2enmod rewrite


2. 아래와 같은 구문을 설정에 추가한다.

<VirtualHost *:80>
    ...
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    ...
</Virtualhost>


3. Apache2를 재시작해준다.

$ service apache2 restart


반응형

'개발 > Linux, System' 카테고리의 다른 글

[CentOS] overcommit_memory  (0) 2017.01.16
[Linux] cp 명령어 overwrite  (0) 2016.07.12
[Linux] History logging 시간 남기기  (0) 2016.06.22
[Apache2] SSL 인증서 적용  (1) 2016.06.17
[Nginx] SSL 인증서 적용  (0) 2016.06.17
,
반응형

Linux에 문제가 발생하면, upstart log, syslog, history를 먼저 추적을 하는 것이 보통인데,

upstart log, syslog는 시간이 남아 있기 때문에, 언제 발생한 상황인지 추적이 가능하다.


다만, history의 경우 기본 설정으로 사용하면 커맨드 목록만 나오고, 시간이 안나오기 때문에

어떤 커맨드를 입력 후 문제가 발생했는지 찾기가 어렵다.


아래와 같이 환경변수를 추가해주면, history에서도 시간 값을 남길 수 있다.


/etc/profile 파일을 연다.

$ vi /etc/profile


가장 하단에 아래 구문을 추가해준다.

HISTTIMEFORMAT="%F %T -- "
export HISTTIMEFORMAT


적용한다.

$ source /etc/profile


확인

$ history

 1000  2016-06-22 16:39:37 -- exit
 1001  2016-06-22 16:39:56 -- history
 1002  2016-06-22 16:41:14 -- cat /etc/profile
 1003  2016-06-22 16:43:34 -- vi /etc/profile
 1004  2016-06-22 16:43:43 -- cat /etc/profile
 1005  2016-06-22 16:45:24 -- history

기존에 history목록에 나왔던 커맨드 들은 현재 시간으로 세팅이 되고, 이후 커맨드부터는 현재 System의 시간이 보여지게 된다.

반응형

'개발 > Linux, System' 카테고리의 다른 글

[Linux] cp 명령어 overwrite  (0) 2016.07.12
[Apache2] Rewrite Engine을 이용한 Http Https Redirect  (1) 2016.06.23
[Apache2] SSL 인증서 적용  (1) 2016.06.17
[Nginx] SSL 인증서 적용  (0) 2016.06.17
[Linux] sudo 권한  (0) 2016.06.10
,
반응형

ipv6 주소를 number형태로 바꾸면, int, long 범위를 훌쩍 넘어가버리는 38자리의 수가 반환이 된다.


java코드에서는 BigDecimal로 세팅을 하여, 핸들링이 가능한데, Mysql에서는 BigDecimal이라는 게 없고,

Decimal 이라는 Type이 존재를 한다.


아래와 같이 Decimal Type의 컬럼을 만들어서 사용을 하면 된다.

Decimal (길이, 소수점 자리 수) 형태로 만들어주어야 한다.



CREATE TABLE `test` (
  `test_decimal` decimal(64,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
반응형
,

[PHP5] ipv6 to number

개발/PHP 2016. 6. 21. 10:27
반응형

누군가 만들어놓고 간, PHP 서비스를 입사하자마자 떠맡았고, 

KPI니 뭐니 하면서, 기능 추가를 해야할 일이 있었는데, ipv6 주소를 받아다가 decimal format으로 변경해야할 일이 있었다.


역시 PHP라 구글에서 나돌아다니는 코드가 많았는데, 희한하게 geoip legacy파일에서 정의되어 있는 ipv6를 number로 변환한 값과는 조금 다르거나, 바이너리 형태로 리턴이 되어 알아볼 수 없는 형태로 나오는 경우가 많았다.


그러던 중 gmp_strval과 gmp_init을 사용하여 바이너리를 String으로 변경할 수 있는 라이브러리를 발견하여 시도해보니, 잘 동작을 해서 

php-gmp 라이브러리를 설치 후 작업을 시작하게 되었다.


1. php-gmp 설치

 - 당연한 얘기지만 사전에 php, php-fpm 등이 설치되어 있어야 하며, 아래 커맨드로 설치를 할 수 있는데

php-fpm 서비스가 몇초간 내려갔다가 올라오므로, 서비스 downtime이 발생하니 주의해야 한다.

$ apt-get install php-gmp


2. ipv6 address를 number로 변경하는 함수 구현

function ipv6_numeric($ipv6) {
    $ip_n = inet_pton($ipv6);
    $bits = 15;

	$ipv6long = 0;

    while($bits >= 0){
    $bin = sprintf("%08b",(ord($ip_n[$bits])));

        if($ipv6long) {
            $ipv6long = $bin . $ipv6long;
        } else {
            $ipv6long = $bin;
        }
        $bits--;
    }
    return gmp_strval(gmp_init($ipv6long, 2), 10);
}


3. ip address가 ipv6인지 ipv4인지 판단하는 함수 구현

function is_ipv6($ip) {
    return strpos($ip, ":") === false ? 4 : 6;
}


반응형

'개발 > PHP' 카테고리의 다른 글

[PHP5] error logging  (0) 2016.12.07
[PHP] mail function 호출 시 unable to qualify my own domain name  (0) 2016.11.28
,
반응형