1. 리팩토링
- 프로젝트를 좀 더 편하게(?) 관리하기 위해선 꾸준히 코드 품질 관리를 해줘야 할 것 같다.
- 추후 다른사람이 해당 프로젝트를 담당하게 될 때, 코드(+주석)만으로도 충분히 업무를 처리 할 수 있게 하고,
- 기능 추가에 따른 코드 수정을 엉뚱한 곳에 조건문을 추가하여 '에라 모르겠다! 일단 추가먼저 하자!!'가 아닌 명확한 처리가 가능하도록! 꾸준한 관리가 필요할 것 같다.

2. 새로운 기술
- '유행'하는 기술이라고 무조건 습득할 필요는 없을 것 같다.
- '내가' 추구하는 '개발자'에 필요한 기술이라면 모를까 남들도 한다고, 나까지 할 필요는 없다.
- 그리고 어떤 기술 한가지를 배울 때, 대충이 아닌 제대로 배우자!

3. 여행
- 이번 여행 '친구와 함께하는 비글여행!'
- 일단 맛난거 많이 먹고 죽자!
- 언제나처럼 많은 걸 보고 오자!

4. 아이폰7
- 이것저것 기술이 추가되고, 변화를 추구해서 '3.5 이어폰 단자' 포기. 어떻게 보면 혁명! 허나 이건 혁명보단 '장사'
- 단자가 없어진다는 루머가 돌았을 때! '오!! 뭔가 애플스러운게 나오겠구만!' 이라는 기대가 있었는데, 이건 뭐 남들이 이미 만들었던 형태의 '무선 이어폰'이다. 그것도 번들이 아닌 '비싸다'
- 곧 2년이 되는 내 아이폰.... 좀 더 사랑해줘야겠다.

5. 맥북
- 내 맥북의 슬슬 수명을 다해가고 있다.(난 그렇게 믿고 있다. 바꾸고 싶어서는 절대 아니다)
- 10월 중순쯤 새로운 맥북이 공개될 거 같다.
- 총알 장전하자!

첫 단상은 여기까지!

'개인 > 단상' 카테고리의 다른 글

2018-08-21  (0) 00:07:00
2018-06-05 : Cloud Native Day in seoul  (0) 2018.06.05
2018-05-01  (0) 2018.05.01
Aws re:invent 2017! 후기  (0) 2017.12.02
2016-10-01  (0) 2016.10.01
2016-09-08  (0) 2016.09.08
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

 

(해결책)

-p 를 붙이자

 

ex) mysql -p ******(password)

 

 

'DataBase > Mysql & MariaDB' 카테고리의 다른 글

[Mysql] Create Table like  (0) 2018.04.13
[Mysql] 기억하면 좋은 쿼리 모음  (0) 2018.04.03
[Mysql] 데이터의 암호화, 복호화  (0) 2016.11.17
[Mysql]ERROR 1045 (28000)  (0) 2016.08.23

1. 현재 호스트 확인

hostname


2. 호스트명 변경

vi /etc/sysconfig/network

내에 HOSTNAME="" 안 값을 변경

vi /etc/HOSTNAME

좀전에 넣은 값을 넣음

 

3. 재시작

reboot

 

4. 확인

hostname

 

'OS > Linux' 카테고리의 다른 글

Jdk 8 Install on AWS EC2  (0) 2016.11.17
[Pyton3] python 3.5.2 Install  (0) 2016.09.09
호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23
[AWS S3] s3fs 설치하기(Centos)  (0) 2016.08.18

1. 열린포트 확인 

netstat -anp | grep LISTEN​


2. 포트 열기

 1) iptables 수정

vi ​/etc/sysconfig/​iptables

 

 2) 원하는 포트 추가

iptables -I INPUT -p tcp --dport 포트번호 -j ACCEPT


 3) 적용

service iptables restart​



'OS > Linux' 카테고리의 다른 글

[Pyton3] python 3.5.2 Install  (0) 2016.09.09
호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23
[AWS S3] s3fs 설치하기(Centos)  (0) 2016.08.18
Maven Install  (0) 2016.08.14

Eclipse에서 Window - Preferences 에서 'encod'로 검색 



 

 

1. pom

<!-- WebSocket -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>

2. java source 

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Set;

@ServerEndpoint(value = "/websocket/chat/{clientId}")
public class ChatAnnotation {

private static final Set<ChatAnnotation> connections = new CopyOnWriteArraySet<>();

private String nickname;
private Session session;

@OnOpen
public void start(@PathParam("clientId") String clientId, Session session) {
this.nickname = clientId;
this.session = session;
connections.add(this);
}

@OnClose
public void end() {
connections.remove(this);
}

@OnMessage
public void incoming(String message) {
// Never trust the client
String filteredMessage = String.format("%s: %s", nickname, message.toString());
broadcast(filteredMessage);
}

@OnError
public void onError(Throwable t) throws Throwable {
//log.error("Chat Error: " + t.toString(), t);
}

private static void broadcast(String msg) {
for (ChatAnnotation client : connections) {
try {
synchronized (client) {
String message = "{clId:'" + client.nickname + "',msg:'" + msg + "'}";
client.session.getBasicRemote().sendText(filter(message));
}
} catch (IOException e) {
connections.remove(client);
try {
client.session.close();
} catch (IOException e1) {
// Ignore
}
String message = String.format("* %s %s", client.nickname, "has been disconnected.");
broadcast(message);
}
}
}

private static String filter(String message) {

if (message == null)
return (null);

char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("&lt;");
break;
case '>':
result.append("&gt;");
break;
case '&':
result.append("&amp;");
break;
case '"':
result.append("&quot;");
break;
default:
result.append(content[i]);
}
}
return (result.toString());

}
}

3. jsp page

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<style type="text/css">
.scrollup {
position: fixed;
bottom: 0px;
right: 0px;
z-index: 99999;
text-align: right;
padding-right: 10px;
}
.chat{
list-style: none;
margin: 0;
padding: 0;
}

.chat li{
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 1px dotted #B3A9A9;
}

.chat li.left .chat-body{margin-left: 60px;}
.chat li.right .chat-body{margin-right: 60px;}


.chat li .chat-body p
{
margin: 0;
color: #777777;
}

.panel .slidedown .glyphicon, .chat .glyphicon
{
margin-right: 5px;
}

.panel-body
{
overflow-y: scroll;
height: 250px;
}

::-webkit-scrollbar-track
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
background-color: #F5F5F5;
}

::-webkit-scrollbar
{
width: 12px;
background-color: #F5F5F5;
}

::-webkit-scrollbar-thumb
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #555;
}
</style>
<script type="text/javascript">
var chat = {};
chat.socket = null;
chat.connect = (function(host) {
if ('WebSocket' in window) {
chat.socket = new WebSocket(host);
} else if ('MozWebSocket' in window) {
chat.socket = new MozWebSocket(host);
} else {
chatContent.append('Error: WebSocket is not supported by this browser.', 'left');
return;
}

chat.socket.onopen = function () {
chatContent.append('Info: WebSocket connection opened.', 'left');
document.getElementById('chat').onkeydown = function(event) {
if (event.keyCode == 13) {
chat.sendMessage();
}
};
};

chat.socket.onclose = function () {
document.getElementById('chat').onkeydown = null;
chatContent.append('Info: WebSocket closed.', 'left');
};

chat.socket.onmessage = function (message) {
chatContent.append(message.data, 'right');
};
});
chat.initialize = function() {
if (window.location.protocol == 'http:') {
//console.log(window.location.host);
chat.connect('ws://' + window.location.host + '/websocket/chat/${login_empnm}');
} else {
chat.connect('wss://' + window.location.host + '/websocket/chat/${login_empnm}');
}
};

chat.sendMessage = (function() {
var message = document.getElementById('chat').value;
if (message != '') {
chat.socket.send(message);
document.getElementById('chat').value = '';
}
});
var chatContent = {};
chatContent.append = (function(message,addClassNm){
var chatContainer = document.getElementById('chat_li');
var li = document.createElement('li');
var span = document.createElement('span');
span.style.wordWrap = 'break-word';


console.log("msg : "+message);
span.innerHTML = message;


span.className = "pull-"+addClassNm
li.appendChild(span);
li.className = "clearfix ";
li.className = li.className +" "+addClassNm;
chatContainer.appendChild(li);

document.getElementById('chat_body').scrollTop = document.getElementById('chat_body').scrollHeight;

while (chatContainer.childNodes.length > 25) {
chatContainer.removeChild(chatContainer.firstChild);
}
});

chat.initialize();

function chkMyMsg(msgJson){

}
</script>
<div>
<p>

</p>
<div id="console-container">
<div id="console"></div>
</div>
</div>


<div class="scrollup span4">
<div class="row-fluid">
<div class="box dark">
<header>
<h5>Chat</h5>
<div class="toolTip">
<a class="btn btn-primary btn-small" data-toggle="collapse" data-parent="#accordion"
href="#collapseOne" style="margin-top: 5px; margin-right: 2px;">
Open
</a>
</div>
</header>
<div class="body collapse" id="collapseOne">
<div class="panel-body" id="chat_body">
<ul id="chat_li" class="chat"></ul>
</div>
<div>
<div class="input-group">
<input type="text" placeholder="type and press enter to chat" id="chat" >
<span class="input-group-btn">
<button class="btn btn-warning btn-sm" id="btn-chat">
Send</button>
</span>
</div>
</div>
</div>
</div>
</div>
</div>

 

 


'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

1. telegram bot

 - 2015년 6월 24일 텔레그램 봇 api 공식 발표

 - 기존에는 telegram-cli를 활용한 봇이 많았음

 - 어떤 차이점이 있을까?

 구분

telegram-cli 

telegram-bot 

 지원

오픈소스커뮤니티(비공식) 

텔레그램(공식)

 통신 API

텔레그램 API 

bot API 

 계정

실제 유저 계정 

Bot 계정 

 UI

메시지

메시지, 커스텀 키보드 

 

 


2. Bot 만들기

 - https://telegram.me/botfather 주소로 접속해서 @BotFather 사용자를 추가함

 - 대화창에 들어가면 아래와 같이 화면이 활성화 됨.

 

 * /help를 통해 사용가능한 명령어를 확인할 수 있음.

 - /newbot 메시지를 보내서 봇을 등록할 수 있음.(봇 이름, 봇 아이디 순으로 등록한다. 봇 이름은 한글도 사용가능함)

 - 등록을 하면 봇 api 사용에 필요한 token을 보내줌. (꼭 필요한 값이므로 저장해 놓는 것이 좋다.)

 

3-1. node.js

 -npm 설치 

npm install node-telegram-bot 


- source code

/**

 * Created by geunspage on 2015-10-05.

 */

var Bot = require('node-telegram-bot');

var bot = new Bot({

    token: 'your_bot_token'

}).on('message', function (message) {

        if(message.text == '/test'){

            bot.sendMessage({

                chat_id: message.chat.id,

                text: 'geuns Test : ' + message.text

            });

        }else if(message.text == 'Hello'){

            bot.sendMessage({

                chat_id: message.chat.id,

                text: message.text +' World geuns Telegram Bot'

            });

 

        }else if(message.text == 'time'){

            bot.sendMessage({

                chat_id: message.chat.id,

                text: 'cur '+new Date()

            });

 

        }

        console.log(message);

    })

    .start(); 



4. 실행 화면

 

5. 기타

 - 서버 모니터링 등 여러 분야에서 활용 가능할 것 같음.

 - 생각보다 샘플들이 많아서 본인 입맛에 맞춰서 수정 가능할 듯.

 - 

 

6. 참고 URL

 - https://core.telegram.org/bots/api

 - http://bakyeono.net/post/2015-08-24-using-telegram-bot-api.html

 - https://github.com/depoio/node-telegram-bot




'프로그래밍 > 개인프로젝트' 카테고리의 다른 글

[AppStore Viewer] 1. 세팅하기.  (0) 2018.04.17
[Github] Github 페이지 활용하기.  (0) 2017.02.06
텔레그램 봇 활용하기 -1  (0) 2016.08.23

1. su와 su - 의 차이

ex) su - root

ex) su root

 

root로 로그인을 변경한다는 것은 동일하다

 

그러나 

 

"su" 만 사용할 경우 root 권한에 포함되어 있는 환경변수는 하나도 가져오지 않음. 

 

즉, 어떠한 환경변수도 포함하지 않고 단지 로그인 계정만 바꿈

 

"su -"의 경우 환경변수까지 다 가져옵니다. 또한 su - root를 하면 기본 /root 디렉토리로 이동해 있을 것이다.

 


'OS > Linux' 카테고리의 다른 글

호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23
[AWS S3] s3fs 설치하기(Centos)  (0) 2016.08.18
Maven Install  (0) 2016.08.14
Webserver 'nginx' install on Centos 6.5  (0) 2016.08.14

1. Mongoose 란?

 - mongoose는 ODM Framework 이다.

 - rdb에서 편하게 사용하기 위해 만들어진 'ORM'과 같은 개념을 nosql에서는 'ODM'이라고 부른다.


2. Mongoose Install

npm install mongoose



3. Sample Source

var mongoose = require('mongoose');

var schema = mongoose.Schema;


mongoose.connect('mongodb://localhost/mongoose');


var TestSchma = new schema({

    title : String,  

    hit_cnt : Number, 

    date : Date    

});


var TestModel = mongoose.model('test', TestSchma);


var testM = new TestModel();


testM.title = "Mongoose Test Data";

testM.hit_cnt = 0;

testM.date = new Date();


testM.save(function (err) {

    if (err) throw err; 

    

console.log('true');

});


TestModel.find({}, function(err, data){

if (err) throw err;

console.log(data);

});



'프로그래밍 > Node.js' 카테고리의 다른 글

npm에서 --save, --save-dev 옵션  (0) 2018.05.02
Mongoose 사용하기.  (0) 2016.08.22

아래 소스는 간단한 파일업로드 기능에 ajax를 추가한 간단한 예제 코드 입니다.


1. JAVA Code

 1) Controller

package kr.geun.bootStartSample.www.controller;


import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.multipart.MultipartFile;


@Controller

public class FileUploadController {

    private static final Logger LOG = LoggerFactory.getLogger(FileUploadController.class);


    private final String UPLOADPATH = "C:\\temp";


    /**

     * File Upload Page

     * 

     * @return

     */

    @RequestMapping(value = "/fileupload", method = RequestMethod.GET)

    public String fileUpload() {

        return "fileupload";

    }


    /**

     * File Save

     * 

     * @param uploadfile

     * @return

     */

    @RequestMapping(value = "/fileupload", method = RequestMethod.POST)

    public ResponseEntity<?> fileUpload(@RequestParam("uploadFile") MultipartFile uploadfile) {

        

        try {

            String fileNm = uploadfile.getOriginalFilename();

            String filePath = UPLOADPATH + File.separator + fileNm;


            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(filePath)));

            stream.write(uploadfile.getBytes());

            stream.close();


        } catch (Exception e) {

            LOG.error(e.getMessage(), e);

            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

        }


        return new ResponseEntity<>(HttpStatus.OK);

    }

}



 2) Jsp

- HTML Code(fileupload.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>

<form id="upload_file_frm" onsubmit="return false;">

<table>

<tr>

<th>Upload File </th>

<td>

<input id="upload_file" type="file" name="uploadFile" accept="*" />

</td>

<td>

<button id="upload_file_btn">Upload Btn</button>

</td>

</tr>

<tr>

<td colspan="3" id="uload_result_msg"></td>

</tr>

</table>

</form>


- Javascript

<script type="text/javascript">

$(document).ready(function(){

$("#upload_file_btn").click(function(){

uploadFileFunc();

});

});

function uploadFileFunc(){

$.ajax({

url:"/fileupload",

type: "POST",

data: new FormData($("#upload_file_frm")[0]),

enctype: 'multipart/form-data',

        processData: false,

        contentType: false,

        cache: false,

        success: function () {

            $("#uload_result_msg").text("File Upload Success");

        },

        error: function () {

            $("#uload_result_msg").text("File Upload Error");

        }

});

}

</script>


+ Recent posts