반응형
반응형

Table의 데이터가 많아 지는 경우, 스크롤을 내리다보면, THead부분이 보이지 않아서 

대부분은 Table의 Height를 고정시켜서 스크롤을 시키는 등의 방법을 사용하는데,

FloatThead라고, 스크롤이 되서 THead가 안보이는 순간에 화면 상단에 Label형태로 THead의 텍스트를 표시해주는 편리한 라이브러리가 있었다.


사용법도 매우 간단하고, Table의 Height를 지정하지 않아도 되기 때문에, 사용상으로 더 편리하고

가장 중요한건 기존의 코드를 변경하지 않아도 되는 점이다.


일단 아래 링크를 참조하여 js파일을 받아서 사용을 했고,

http://mkoryak.github.io/floatThead/


페이지 초기화 구문에서 $('#테이블명').floatThead(); 으로 해주면 알아서 상단에 THead를 띄워준다.

반응형
,
반응형

최근에 MS에서 인수하여 Hot한 Xamarin을 해보기로 하였다.


VS2015와의 연동에 특화되어 있는지라, VS2013에서는 조금 헤매고 삽질을 하여, 그 과정을 정리한다.


1. VS2013 서비스팩 최신버전

 - VS2013에 들어가서 도구 - 확장 및 업데이트 - 업데이트



2. Xamarin Installer 

 - https://www.xamarin.com  사이트에 방문하여, 상단의 탭 찾으려고 하지말고, 아래로 조금만 스크롤하면 Download Xamarin 버튼이 있다.)

 - 다운로드만 해두자..


3. Microsoft Build Tools 2015 설치

 - https://www.microsoft.com/ko-kr/download/details.aspx?id=48159 에서 받으면된다.

 - 이걸 설치하는 이유는, Xamarin Installer가 설치도중 뿜어낼 예외상황을 방지하기 위해서라고 보면 될 것 같다.

 - 그리고, VS버전이 2013이라고, Build Tools를 2013으로 설치하면, Xamarin Installer님께서 설치되었다고 인지를 못하니, 2015 무조건 최신버전으로 설치해주자.


4. Xamarin Installer 실행

 - 2번에서 다운받은 Installer를 실행하자.

 - 실행도중, 에러 팝업이 나오면서 Xamarin.VisualStudio_4.1.1.1.msi  비슷하게 생긴 msi파일을 받아서 수동으로 더블클릭하라는 팝업이 나온다. (이것저것 삽질하면서 해결하다보니 캡쳐를 못함;)

 - 하이퍼링크가 걸려있으니. 클릭하여 다운받아서 설치를 하자. (이 과정에서 Microsoft Build Tools 2015가 설치되어있지 않다면, 설치하라는 안내 팝업이 나오며, 설치가 중단된다.)

 - 설치를 다 했으면, Xamarin Installer를 다시 실행하던, Retry를 해서 재개해주자.


MS에서도 아직 불안정하다고 얘기하는 Xamarin이라 다른 예외상황들이 있을 것 같은데, 본인은 위에 작성한 과정으로 전부 해결이 되었다.



반응형
,
반응형

특정 환경에서 cp 명령어 -f 옵션이 먹지 않는 경우가 있는데,

이런 경우 아래와 같이 백슬래쉬를 하나 넣어주면 해결이 된다.


$ \cp -rf test.txt a.txt
반응형
,
반응형

기본적으로 팝업을 구현할 때 window.open을 통해 뜨는 팝업을 좋아하지 않아서, modal을 이용한 LayerPopup으로 구현을 하는 편인데,

단순히 팝업을 하나 출력할 때는 아무문제 없는데, 데이터를 주고 받아야하는 경우가 있다. 데이터 편집 등.. seq 값을 넘겨야하는 경우라고 이해하면 편할 것 같다.


a 태그를 이용하여, custom attribute를 선언하여 주고받을 수 있는 방법이 있어서, 그 방법에 대해 알아본다.

편의상 LayerPopup만드는법은 생략하고, LayerPopup의 id는 testModal로 했다고 가정한다.


1. 데이터를 넘길 a 태그 작성

<a href="#" data-toggle="modal" data-target="#testModal" data-id="1">


2. modal (LayerPopup)을 누른 후 data-id 불러오기

$(document).ready(function() {		
    $('#testModal').on('show.bs.modal', function(event) {			
        var seq = $(event.relatedTarget).data('id');
    });
});


이와 같이 구현하면, a 태그를 눌러서 뜬 modal에서 데이터를 받아서 활용이 가능하다. 

data-id는 정해진건 아닌거 같고, data-{변수} 형태로 넘길 수 있는 것 같다.

반응형
,
반응형

이미 존재하는 데이터에 대해서, 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
,
반응형