설치 및 관련사이트

    NodeJS

        https://nodejs.org/en/

        nodejs : v7.7.4, npm : v4.1.2

    ExpressJS

        https://expressjs.com/

        v4.15.2


시작하기


    링크

        https://expressjs.com/en/starter/installing.html


    작업

        mkdir jwview

        cd jwview

        npm init

            enter 눌러가면서 기본값으로 생성 package.json 생성

        npm install express --save

            express 설치 및 관련 의존성 정보를 package.json에 추가(--save 옵션)


HelloWorld


    작업

        npm init 할때 생성한 main에 일치하는 파일 생성

        index.js 에 아래 소스를 입력


    소스

        var express = require('express')

        var app = express()


        app.get('/', function (req, res) {

        res.send('Hello World!')

        })


        app.listen(3000, function () {

        console.log('Example app listening on port 3000!')

        })

    

    실행

        node index.js


    확인

        http://localhost:3000

            위 링크로 들어가면 Hello World! 라는 문구를 볼 수 있다.


Express Generator ( 익스프레스 생성기 )


    설치

        npm install express-generator -g


    명령어 목록

        express -h

    -h, --help          도움말을 보여준다 

        --version       버전 정보를 보여준다 

    -e, --ejs           ejs 뷰엔진 지원 추가

        --hbs           handlebars 뷰엔진 지원 추가

        --pug           pug 뷰엔진 지원 추가

    -H, --hogan         hogan.js 엔진 지원 추가

    -v, --view <engine> 뷰엔진 지원을 추가한다(ejs|hbs|hjs|jade|pug|twig|vash) (기본은 jade)

    -c, --css <engine>  스타일시트 지원을 추가한다 (less|stylus|compass|sass) (기본은 css )

        --git           .gitignore 에 추가

    -f, --force         강제로 폴더 생성


    예시

        myapp 이라는 이름으로 웹 어플리케이션을 만드려면 

        express --view=pug myapp


    실행

    cd myapp

        debug=myapp:* npm start

        (myapp을 debugging 할것이며, 대상은 *전체, start 스크립트 수행=> package.json에 정의됨)


    폴더구조


        ├── app.js

        ├── bin

        │   └── www

        ├── package.json

        ├── public

        │   ├── images

        │   ├── javascripts

        │   └── stylesheets

        │       └── style.css

        ├── routes

        │   ├── index.js

        │   └── users.js

        └── views

            ├── error.pug

            ├── index.pug

            └── layout.pug


기본 라우팅

http 요청(get, post 등 및 주소 uri)에 따른 처리


app.get('/', function (req, res) {

  res.send('Hello World!')

})


app.post('/', function (req, res) {

  res.send('Got a POST request')

})


get 요청은 주소창을 통해 확인 가능하지만 post 같은 경우는 postman 같은 크롬 확장으로 확인 가능


고정(static) 자원 사용하기


app.use(express.static('public'))


http://localhost:3000/images/kitten.jpg

http://localhost:3000/css/style.css


이후 public 폴더 아래에 존재하는 파일을 위와 같이 사용 가능


app.use(express.static('public'))

app.use(express.static('files'))


위와 같이 하면 1개 이상의 폴더를 지정할 수 있다.


app.use('/static', express.static('public'))


위와 같이 하면 가상경로를 포함하여 지정할 수 있으며 아래와 같이 사용 가능하다.


http://localhost:3000/static/images/kitten.jpg

http://localhost:3000/static/css/style.css


하지만 폴더가 기본적으로 상대적 경로에 존재하므로 아래와 같은 방식으로 보통 사용한다


app.use('/static', express.static(path.join(__dirname, 'public')))


__dirname (현재 경로)에 public 이라는 폴더 경로를 합쳐서 해당 경로를 static 이라는 가상경로에 매칭




Android O 의 새로운 기능알림 알림 채널, 배경 한도, PIP 등



Android O의 새로운 기능 

: 백그라운드 한계, 알림 채널, PIP (picture-in-picture), 자동 채우기, 적응 형 아이콘 및 API 변경 등이 추가되었습니다.


알림 채널. 

사용자는 채널 소개를 통해 알림을보다 효과적으로 제어 할 수 있습니다. 이 채널은 여러 응용 프로그램의 메시지를 그룹화 할 수 있으며 사용자는 채널을 활성화 / 비활성화하거나 잠금 화면에서 중요도, 사운드, 조명, 진동, 가시성 중 하나의 설정을 적용 할 수 있습니다. 알림에는 더 이상 우선 순위가 지정되지 않으며, 알림이 표시되는 방법과 노이즈, 빛 또는 진동과 관련된 채널을 결정하는 새로운 7 가지 중요도가 제공됩니다. 여러 사용자 계정에 채널을 그룹화 할 수 있습니다. 이는 업무용 및 개인용으로 사용되는 장치에서 채널을 관리하는 데 유용합니다.


백그라운드 제한. 

Android O는 배터리 수명과 성능을 향상시키기 위해 더 많은 백그라운드 제한을 도입합니다. 새 제한의 영향을받는 영역은 암시 적 브로드 캐스트, 백그라운드 서비스 및 위치 업데이트입니다. 백그라운드에서 실행중인 서비스는 몇 분 후에 중지됩니다. 이러한 서비스를 사용하는 응용 프로그램은 제한없는 서비스를 시작할 수있는 몇 분 동안 임시 허용 목록에 배치 될 수 있습니다. 이는 우선 순위가 높은 메시지, 브로드 캐스트 수신시 또는 통지에서 보류중인 인 텐트를 실행할 때와 같이 사용자가 볼 수있는 작업을 응용 프로그램이 처리해야하는 경우에 발생합니다.

위치 업데이트와 관련하여 백그라운드에서 실행되는 응용 프로그램은 매 시간마다 이러한 업데이트를 수신합니다. 응용 프로그램은 포 그라운드로 응용 프로그램을 가져 오거나, 포 그라운드 서비스를 사용하거나, Geofencing API를 사용하거나 수동 위치 수신기를 사용하여이 동작을 변경할 수 있습니다.



PIP (Picture-in-picture). 

Android TV에서 이미 사용 가능하며 PIP는 이제 Android로 가져와 다른 활동 내에서 활동을 표시 할 수 있습니다. PIP는 Android N에 도입 된 멀티 윈도우의 특별한 경우이며 특히 동영상 콘텐츠를 재생하는 데 적합합니다.

자동 완성 프레임 워크. Android O는 사용자가 시간을 절약하고 양식 작성 작업을 반복하지 않기 위해 애플리케이션이 데이터 및 자동 완성 양식을 저장하는 데 사용할 수있는 프레임 워크를 도입합니다. 로그인 데이터 또는 신용 카드 정보 사용에 대한 예가 포함됩니다.


적응 형 아이콘. 

다양한 기기의 실행 프로그램은 둥근 모양, 사각형 모양, squircle 모양 등 다른 모양의 아이콘을 표시 할 수 있습니다. Android O는 배경과 전경을위한 두 개의 이미지 레이어와 마스크로 시작 아이콘을 만듭니다. 이 아이콘은 시각 효과를 지원합니다.

멀티 디스플레이. 개발자는 여러 디스플레이가있는 장치에서 활동을 한 디스플레이에서 다른 디스플레이로 이동할 수 있습니다.


자바. 

Android O에는 OpenJDK 8의 java.time과 OpenJDK 7의 java.nio.file 및 java.lang.invoke가 포함되어 있습니다. 일부 벤치 마크에서는 런타임 성능이 최대 2 배 향상되었습니다.

Android O의 다른 개선 사항에는 XML의 글꼴 리소스, 앱의 광역 색상, 고품질 Bluetooth 오디오 코덱, WiFi 인식, 키보드 탐색, WebView 개선 등이 있습니다.


Google은이 Android 미리보기 버전은 완전히 안정적이지 않으며 후속 버전은 다음 달에 발행 될 것입니다. 

Android O 용으로 개발하려면 Android Studio 2.4 Canary가 필요합니다. 

Android의 새 버전은 에뮬레이터 또는 여러 Nexus 및 Pixel 기기에서 테스트 할 수 있습니다.


출처 : https://www.infoq.com/news/2017/03/android-o?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global




css 전처리기 sass 대 less 대 stylus  위 3개 중 당신의 선택은 ??


원문 링크 

https://code.tutsplus.com/tutorials/sass-vs-less-vs-stylus-preprocessor-shootout--net-24320


위 글을 읽어보면 사람 취향 타는 거 같은 느낌이다. 


문법 - 괄호를 써도 되고 안써도 되고 / 3개 거의 유사

변수 - @ $ 없거나 / prefix의 차이 정도

포함하기(Nesting) - 모두 동일, css와 비교하면 너무 좋은 기능임

가따쓰기(Mixins) - 한번 정의하여 사용한 것을 다른곳에 재사용하는 기능, sass는 어노테이션으로 지정, 나머지 둘은 그냥 쓰면 됨


그외 상속(Extends), 내포(Import), 연산자(Operator) 등이 존재 하는데 거의 다 비슷한 느낌이다.


그래서 결론은 ??

개발에 있어서 필수 사항은 아니지만 SASS, LESS, STYLUS 등의 전처리를 통해 많은 시간을 절약할 수 있다 합니다.

그리고 다양한 전처리기를 사용해보고 자신에게 맞는 것을 고르라고 하네요


전 개인적으로 less 사용중 훗...



상황 연출 ...


1
factory.setTriggers( aaaTrigger().getObject(),bbbTrigger().getObject() );
cs


와 같이 트리거를 2개 설정 해놓음 하지만 이후 aaa트리거만 사용하기 위해 코드를 아래와 같이 변형


1
factory.setTriggers( aaaTrigger().getObject() );
cs


그리고 수행을 해보면 둘다 2개의 트리거가 동작하는 것을 볼 수 있음 ;;;


그래서 H2 DB에 접속하여 


QRTZ_TRIGGERS 테이블에서 트리거명 조회 이후 아래와 같이 트리거를 제거하면 된다.


1
delete QRTZ_TRIGGERS where TRIGGER_NAME = 'bbbTrigger'
cs


그러면 트리거가 도중에 중단 되는 것을 로그를 통해 확인할 수 있음.



하지만 ... 위와 같이 하면 다시 2개로 트리거를 복구하면 테이블에 해당트리거가 추가가 안됨 ;; 그래서 


1
2
factoryBean.setStartDelay(Long.MAX_VALUE);
factoryBean.setRepeatCount(0);
cs


위와 같이 사용하지 않을 경우에는 시작시간을 최대로 늘리고 반복카운트를 0으로 설정하는 방법을 차선책으로 해봤음.


아니면 job 을 execute 할 때 해당 메소드를 내부에 실행할 대상을 제거하는 방법도 좋은 거 같음. 언젠간 다시 쓸것이니... 


시침과 분침 사이의 각도를 표현


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
<script>
/*
    링크
    https://codefights.com/challenge/BMAqHPYhhPdHTd7pz
    문제 
    시침과 분침 사이의 각도를 표현해라
    - 각도는 180을 넘을 수는 없음
    - 시간표현은 HH:MM:SS 로 표현
    예제
    in : 12:00:00
    out : 0
    in : 07:00:00
    out : 150
    in : 11:19:41
    out : 93
*/
    function timeDegrees(t) {
 
        // 시간정보를 나눠서 넣어둠 [0] : 시, [1] : 분, [2] : 초
        p = t.split(':')
 
        // 입력된 시간 기준으로 흐르는 각도의 값  (초침-분침-시침)
        a = (p[2* 720 / 60 - p[1]) / 60 - p[0+ 24
 
        // 12시간 기준으로 
        a %= 12
 
        // 180을 넘을 수 없으므로 예각의 값을 가져온다
        a = a < ? a : 12 - a
 
        // 소숫점 이하 버림 처리
        return a * 30 | 0
    }
</script>
cs



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
<script>
/*
    링크
    https://codefights.com/challenge/SCgGQZE8ogJDTKmDp
    문제 
    입력 받은 배열의 중복을 제거하라 !
    예제
    in : [1,1,2,2,3,3,]
    out : [1,2,3]
    in : [1,1,1]
    out : [1]
*/
    function deDup(a){
        r = []
        for(i in a){
 
            // 참이면 && 구문도 수행
            // 배열 내부의 값을 배열에서 못찾으면 넣어준다
            r.indexOf(x=a[i]) < && r.push(x)
        }
        return r
    }
</script>
cs


비트코인 채굴이란 ?


비트코인 노드를 운영하는 네트워크 참가자들은 채굴자(광부, 마이너)라 불린다. 이들은 최근 거래를 수집해 데이터 블록 형태로 정리하며, 이 과정을 10분마다 반복한다.


그리고 채굴자들은 블록을 발견한 대가로 비트코인을 받아간다.


이더리움 또한 비슷함.


비트코인, 이더리움 둘다 비슷하며 아직은 화폐보단 주식에 가까운것 같다 개인적으로는 하루만에 가격이 ... 훅 올랐다 내렸다 뭐 그리기도 하니...


나도 함 해볼까 ?


2년전 비트코인 채굴 관련 영상을 유투브에서 찾아 봤는데 공장 단위로 PC를 가동하면서 얻는 수익이 어마 어마 함...


전기세 1억에 수익 16억 ... 물론 인건비에 기타 등등의 비용이 들어가긴 하겠지만... 역시 이런 것에 먼저 눈을 뜨신 분들은 엄청난거 같다.


여기서 함정... 채굴은 난이도는 시간이 흐르면 흐를수록 힘들어 지고 있음.


요즘 채굴관련 글을 보면 대중적인 PC 기준 대략 하루에 100원 -_-; 정도를 벌 수 있다고 함. ( 전기세 대비 수지타산이 안맞음 ... )


관련 영상



그리고 유투브에서 bitcoin mining 등과 같은 단어로 검색해 보면 다양한 영상을 볼 수 있을 것이다.





콘솔에서 화면캡춰를 하는 방법을 찾아보는 도중 ... webkit2png 라는 python으로 만든 유용한 프로그램을 찾아 냈습니다. ㅋ



#1 brew 설치


https://brew.sh/ 사이트에 접속하여 설치 방법을 참조

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


=> 소스 다운 받아 설치하는 스크립트 임.


#2 유틸 설치

$ brew install webkit2png


$ webkit2png https://google.co.kr

Fetching https://google.co.kr ...

 ... done


설치 후 위와 같이 실행하면 해당 실행 경로에 png 가 생성된 것을 볼 수 있다.


#3 문제 해결 HTTP


그런데 https 주소는 잘 되는데 http 로 시작하는 주소는 캡춰가 안되는 것을 확인 할 수 있다.



[사진 1 : http 로 시작하는 주소 캡춰 안되는 것 ]



[사진 2 : 소스 수정 ]


$ sudo vi /usr/local/bin/webkit2png


이후 ssl_check 로 검색한 다음 2번째 라인을 주석 처리하고 3번째 라인을 추가한 다음 wq! 로 저장하고 나오면 됩니다.

(읽기 전용파일이라 wq!로 강제 저장하고 나와야 됨)


그러면 이후부터 http로 시작하는 사이트 또한 옵션을 줘서 캡춰 할 수 있습니다.


너무 길다 싶으니 나중에 alias를 줘서 쫌 짧게 만들어서 호출 하면 될듯..


그리고 로컬 파일 한글 깨짐 문제도 있는데 이건 뭐 나중에 ... 



#4 결과물

$ webkit2png --ignore-ssl-check --js=JS http://www.naver.com


[별칭 alias 예시 : .profile 에 추가해서 사용하면 좋아요 ^^]

alias cap='webkit2png --ignore-ssl-check --js=JS $1'


$ cap http://www.naver.com



[썸네일 형태(위) / 전체 캡춰(아래) ]







http://convertico.com/



참고로 스카피는 패킷 조작 프로유틸 프로그램이다

( Scapy is a powerful interactive packet manipulation program.  )


아래 소스를 예) scapy.sh 와 같이 만든 후 실행 권한 준 이후 ( chmod +x scapy.sh ) 실행하면 자동 빌드 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
echo "We need root permissions to install libdnet"
sudo echo "OK"
curl -"https://bootstrap.pypa.io/get-pip.py"
python get-pip.py --user
PIP_BIN=$HOME/Library/Python/2.7/bin/pip
$PIP_BIN install scapy --user
$PIP_BIN install pypcap --user
curl -L https://github.com/dugsong/libdnet/archive/libdnet-1.12.zip -o libdnet-1.12.zip
unzip libdnet-1.12.zip
cd libdnet-libdnet-1.12
./configure
make
sudo make install
cd python
python setup.py install --user
cs


출처 : https://dustin.li/2016/08/scapy-on-mac-os-x/


서버 프로그램 작성 / 동작 확인 완료


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
# server 
# scapy is needed
# source from : http://blog.naver.com/netatom/220323580811
import socket
import time
from optparse import OptionParser
from scapy.all import *
import timeit
 
HOST='127.0.0.1'
PORT=8888
 
def tcp_recv(host,port):
    su = socket.socket(socket.AF_INET)
    su.bind((host,port))
    su.listen(1)
 
    connect, address = su.accept()
    print 'Connected by ',address
    while 1:
        data = connect.recv(1024)
        start_time = time.time()
        if not data: break
        connect.sendall(data)
        su.close()
    connect.close()
    end_time = time.time()
    check_time = end_time - start_time
    return check_time
 
if __name__ == "__main__":
    y = 0
    for x in range(0,5):
        y = y  + tcp_recv(HOST, PORT)
        print y
        print "Received %d" % (x)
    print 'average time : ', y/3
 
cs


+ Recent posts