자바스크립트 차트 라이브러리 모음

개인적으로는 하이차트와 amcharts등이 가장 괜찮아 보인다.

nvd3
http://nvd3.org/

c3js
http://c3js.org/

구글 차트
https://developers.google.com/chart/

하이차트
http://www.highcharts.com/

chartjs
http://www.chartjs.org/

amcharts
https://www.amcharts.com

d3
https://github.com/d3/d3/wiki/Gallery

morrisjs
http://morrisjs.github.io/morris.js/

Atom 패키지 multi-cursor

multi-cursor

에디터를 사용하다 보면 같은 선상에 있는 몇 개의 라인에 같은 수정사항을 적용하고 싶을 때가 있다.
이 때 사용하는 것이 multi-cursor패키지이다.

설치 및 실행

패키지 목록에서 검색 후 설치를 하면 따로 실행할 필요는 없다.
대신 따로 입맛에 맞게 단축키를 설정할 수는 있지만, 기본은 option + 위아래 화살표 이다.
입력 후에 esc를 통해 해제해주자.

단축키 목록

Atom 패키지 pigments

pigments

공식 Repo : https://github.com/abe33/atom-pigments

우리가 css에서 작업을 하거나 <style>태그 안에서 스타일 작업을 할 경우에 색을 많이 사용한다.
하지만 그게 무슨 색인지 컬러코드만 보고는 알 수가 없다.

그래서 사용하는 패키지 pigments이다. pigments 패키지는 우리에게 색상 코드에 관한 미리보기를 제공한다.

설치

패키지 검색을 통해 설치한다.

실행

따로 실행하는 것은 없고 색상 코드를 입력하면 자동으로 해당하는 색으로 변하게 된다.

Atom 패키지 Remote-FTP

Remote-FTP

공식 Repo : https://github.com/icetee/remote-ftp

텍스트 에디터를 사용하면서 가장 인기 많은 패키지가 아닐까 싶다. 이름 그대로 원격 서버, FTP에 연결하여 파일(아마 대부분 소스코드일 것이다.)
을 쉽게 주고 받을 수 있게 하는 필수패키지이다. FTP/SFTP 모두 지원한다.

설치

명령어를 이용하는 방법도 있지만, 앞으로 포스팅될 패키지 관련 포스팅에서는 atom 에디터 내부에서 검색을 통해 설치할 것이다.
remote-ftp를 검색하여 설치해보자

설정파일

설정파일에는 두 가지가 있다. (ftp, sftp)

Packages - Remote-FTP - Create FTP config file 또는 Create SFTP config file 을 선택하여
프로젝트에 설정파일을 생성한다.

.ftpconfig라는 파일이 생성되고 다음과 같이 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# SFTP
{
"protocol": "sftp",
"host": "example.com", # 접속하려는 호스트
"port": 22, # 접속하려는 포트
"user": "user", # user name
"pass": "pass", # user의 password
"promptForPass": false,
"remote": "/", # 접속해서 디폴트로 이동할 디렉토리 (홈디렉토리 기준)
"agent": "",
"privatekey": "", # ssh 터널링을 하는 경우 private key
"passphrase": "", # ssh 터널링을 하는 경우 key의 passphrase
"hosthash": "",
"ignorehost": true,
"connTimeout": 10000,
"keepalive": 10000,
"watch":[],
"watchTimeout":500,
"filePermissions":"0644"
}


# FTP
{
"protocol": "ftp",
"host": "example.com", # 접속하려는 호스트
"port": 21, # 접속하려는 포트
"user": "user", # user의 name
"pass": "pass", # user의 password
"promptForPass": false,
"remote": "/", # 접속해서 디폴트로 이동할 디렉토리 (홈디렉토리 기준))
"secure": false,
"secureOptions": null,
"connTimeout": 10000,
"pasvTimeout": 10000,
"keepalive": 10000,
"watch":[],
"watchTimeout":500
}

# (주석)으로 설명한 부분만 잘 작성해주면 접속에 성공한다.

라라벨 인스톨러 설치 (command not found)

라라벨 인스톨러 설치

composer를 사용하여 라라벨 프로젝트를 설치하는 방법도 있지만

laravel new blog 와 같은 명령어를 사용하여 프로젝트를 생성하는 방법도 있다.

1
2
3
$ composer global require "laravel/installer"

$ cd ~

command not found일 경우

위와 같이 컴포저로 라라벨 인스톨러를 전역설치 한 후에 다시 홈 디렉토리로 온다.

.bashrc와 같은 파일을 열고

1
2
3
4
# ~/.bashrc
export PATH="$PATH:$HOME/.composer/vendor/bin"

# 이것을 추가한다.

또는 명령어를 활용하여

1
echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc

그리고 추가된 한 줄을 반영해야 한다.

1
source ~/.bashrc

source명령어를 이용하여 반영해도 되고, 터미널을 종료 후 다시 실행해도 적용된다.

~/.bashrc가 없다면 ~/.bash_profile등에 추가하여도 무관하다.

라즈베리파이 nginx 로그의 주기를 설정하기

서버에 설치된 데몬마다 로그를 생성하는데, 각 데몬별로 로그 주기를 정할 수 있는 곳이
/etc/logrotate.d이다.

1
2
$ cd /etc/logrotate.d
$ vi nginx

이중 nginx를 vi 에디터로 열어서 다음과 같이 수정하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#/var/log/nginx/*.log {
# weekly
# missingok
# rotate 52
# compress
# delaycompress
# notifempty
# create 0640 www-data adm
# sharedscripts
# prerotate
# if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
# run-parts /etc/logrotate.d/httpd-prerotate; \
# fi \
# endscript
# postrotate
# invoke-rc.d nginx rotate >/dev/null 2>&1
# endscript
#}

/var/log/nginx/*.log {
daily
rotate 365
copytruncate
delaycompress
compress
dateext
notifempty
missingok
}

테스트

1
2
$ logrotate —force /etc/logrotate.d/nginx
$ cd /var/log/nginx

nginx 웹서버를 실행 후 생성되는 로그를 확인해보자.
로그 경로는 nginx 설정에 있다.

php 이번 달 날짜 리스트 구하기

해당 월의 모든 날짜를 구하는 것이다.

달력 등에 관련된 것을 사용할 때 유용하다.

1
2
3
<?php

date('t', [옵션 : date 형식의 날짜]);

예제

1
2
3
4
5
6
7
8
<?php

$dates = array();
$todayDate = '2017-07-21';

for($i = 0; $i <= date('t', strtotime($todayDate)); $i++) {
array_push($dates, str_pad($i, 2, '0', STR_PAD_LEFT));
}

mysql 커스텀 정렬

mysql에서 특정 값들을 내 마음대로 정렬하고 싶을 때 다음과 같이 사용한다.

1
2
3
SELECT *
FROM 테이블명
ORDER BY FIELD(필드명, '값1', '값2', '값3');

라라벨(Laravel) 컴포저(Composer) 명령어

컴포저 명령어 리스트입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 라라벨 프로젝트 생성
composer create-project laravel/laravel folder_name

# composer.json 내용을 토대로 빌드(패키지 설치)
composer install

# 패키지 업데이트
composer update

# autoload 파일을 리프레시
composer dump-autoload [--optimize]

composer self-update

# 패키지 추가 및 설치
composer require [options] [--] [vendor/packages]...

Swift 프로토콜(protocol)

꼼꼼한 재은씨의 Swift3 기본편을 보며 Swift 문법 내용을 정리한 내용입니다.

프로토콜 : 객체의 설계도

클래스나 구조체가 어떤 기준을 만족하거나 특수한 목적을 다성하기 위해 구현해야 하는 메소드와 프로퍼티의 목록이다. 자바의 interface와 비슷한 개념이다. (이렇게 이해하니 쉬운 개념으로 와닿았다.)

각 이벤트를 관리하기 위해 대리자(delegate)를 지정하여 이벤트 처리를 위임하고, 실제 이벤트 발생 시, 지정된 대리자가 콜백 메소드를 호출해주는 델리게이트 패턴(Delegate Pattern)을 많이 사용하는데, 이 때 사용되는 것이 바로 프토콜이다.

기능에 대한 명세가 적혀 있어서 프로토콜 코드를 보면 어떤 기능을 어떻게 구현해야 하는지를 알 수 있다.

프토콜은 부모 클래스는 아니다. 프로토콜은 대상 클래스 전체를 책임지지 않으며, 일부 기능의 형식을 담당한다.

프로토콜의 정의

protocol 키워드를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
protocol protocolName {
<구현해야할 프로퍼티 명세 1>
<구현해야할 프로퍼티 명세 2>
<구현해야할 프로퍼티 명세 3>

<구현해야할 메소드 명세 1 >
<구현해야할 메소드 명세 2 >
<구현해야할 메소드 명세 3 >
}

// 구조체, 클래스, 열거형, 익스텐션을 프로토콜로 구현할 수 있다.

프로토콜 프로퍼티

프로토콜에 선언되는 프로퍼티에는 초기값을 할당할 수 없다. 프로퍼티 종류 또한 구분하지 않는다. 프로퍼티의 종류, 이름, 변수/상수 구분, 타입, 읽기/쓰기 가능 여부를 정의한다.

1
2
3
4
5
6
7
8
9
10
11
12
protocol SomePropertyProtocol {
var name : String { get set } // 읽고 쓰기 가능
var descriptioin : String { get } // 읽기 가능
}

// 구현
struct RubyMember : SomePropertyProtocol {
var name = "아모개"
var description : String {
return "Name : \(self.name)"
}
}

프로토콜 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protocol SomeMethodProtocol {
func run(command : String)
func showResult(param : Int) -> String
}

// 구현
struct RubyService : SomeMethodProtocol {
func run(command : String) {
if command == "start" {
print("시작")
}
}

func showResult(param : Int) -> String {
return "Result : \(param)"
}
}

mutating, static 사용

구조체 내 메소드가 프로퍼티를 변경하는 경우, 메소드 앞에 반드시 mutating 키워드를 붙여 이 메소드가 프로퍼티 값을 수정하는 메소드임 을 표시하도록 강제한다. 메소드가 만약 프로토콜에서 선언된 메소드라면 반드시 프로토콜에 mutating 키워드가 추가되어 있어야 한다.

클래스와 같은 참조 타입은 mutating 키워드 없이 자유롭게 메소드 내의 프로퍼티를 수정할 수 있지만, 구조체나 열거형은 프로토콜의 메소드에 mutating 키워드가 추가되어 있지 않을 경우 프로퍼티 값을 변경할 수 없다. 억지로 키워드를 붙인다면 오류가 날 것이다.

보통 mutating 키워드가 붙지 않는 경우는 다음과 같은 경위다.

  • 구조체나 열거형 등 값 타입의 객체에서 내부 프로퍼티의 값을 변경하기 원치 않을 때
  • 주로 클래스를 대상으로 간주하고 작성된 프로토콜일 때

프로토콜의 초기화 메소드

일반적인 메소드와 비슷하게 초기화하는 것이 가능하다. 실행블록 없이 이름과 매개변수 등을 작성한다.

1
2
3
4
protocol initProtocol {
init()
init(cmd : String)
}

초기화 메소드 작성 시 유의사항은 외부매개변수명까지는 완전히 일치해야 한다는 점이다. 임의로 변경 시 프로토콜을 제대로 구현하지 않은 것으로 간주된다. 그리고 클래스에서 초기화 메소드를 구현할 때는 required 키워드를 붙여야 한다.

  • 구현되는 초기화 메소드의 이름과 매개변수명은 프로토콜의 명세에 작성된 것과 완전히 일치해야 한다.
  • 프로토콜 명세에 선언된 초기화 메소드는 그것이 기본 제공되는 초기화 메소드여도 직접 구현해야 한다.
  • 클래스에서 초기화 메소드를 구현할 때는 required 키워드를 붙여야 한다.

또다른 예시를 살펴보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//initProtocol은 위에서 보았던 프로토콜에서 참조한 것이다.

struct SInit : initProtocol {
var cmd : String

init() {
self.cmd = "start"
}

init(cmd : String) {
self.cmd = cmd
}
}

class CInit : initProtocol {
var cmd : String

required init() {
self.cmd = "start"
}

required init(cmd : String) {
self.cmd = cmd
}
}

타입으로서의 프로토콜

때로는 프로토콜이 타입으로서의 역할을 할 때도 있다. 마치 프로토콜을 상위 클래스 타입으로 간주하여 사용하는 것과 유사하다.

  • 상수나 변수, 그리고 프로퍼티의 타입으로 사용할 수 있음
  • 함수, 메소드 또는 초기화 구문에서 매개변수 타입이나 반환 타입으로 프로토콜을 사용할 수 있음
  • 배열이나 사전, 혹은 다른 컨테이너의 타입으로 사용할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
protocol Wheel {
func spin()
func hold()
}

class Bicycle : Wheel {
var moveState = false

func spin() {
self.pedal()
}

func hold() {
self.pullBreak()
}

func pedal() {
self.moveState = true
}

func pullBreak() {
self.moveState = false
}
}

일반적인 경우 Bicycle 클래스는 다음과 같이 초기화된다.

1
2
3
4
5
let trans = Bicycle()

trans.moveState
trans.spin()
...

let trans : Wheel = Bicycle()

이 경우는 trans가 사용할 수 있는 프로퍼티와 메소드에 제한이 생긴다.

trans.spin()
trans.hold()

기존에 Wheel이라는 프로토콜에 존재하던 메소드만 사용이 가능하게 된다.