Windows 10 Shared Folder Login Failure

Windows 10으로 올라오고나서 일반적으로 SMB 공유설정을 했을때 안드로이드 기기에서 로그인이 안되는 문제들이 간혹 발생하곤 했다. (되는 어플이 있고 안되는어플이 있다. 왜 그런지는 확실힌 모르겠지만 아래 방법을 자동으로 적용하는거같다..?) 임시 방편으로 패스워드 공유를 사용안함으로 하면 잘 되긴하지만 사용자 계정으로 보안이 되지않고 익명으로만 접근이 가능하다.

아무래도 로컬계정이 아닌 마소계정을 사용하면서 생긴 문제 같았는데 해결방법을 잘 못찾다가 오늘에서야 방법을 찾아서 남겨본다.

방법은 간단하다 연결시 **도메인네임**에 연결하려는 장치이름(호스트네임..?)을 입력해주면 잘 동작하는것 같다.

login

Cloud Sync Application

요즘은 자료를 로컬에만 저장하지 않고 클라우드 서비스를 이용하여 어디서나 접근할 수 있도록 하는게 대세다. 그래서 관련 서비스들이 여러가지 나와있는데 해당 서비스들에 대한 개별 클라이언트를 받아서 사용하기엔 종류가 너무 많기 때문에 이를 통합적으로 관리해주는 어플리케이션이 필요하다. 이 포스트에서는 관련 프로그램들이 어떤 것이 있는지 알아보고 각각의 기능을 확인, 비교 해보자.

여기서 다루는 프로그램은 Free tier 기능 위주로 확인하도록 한다.
추가적인 Paid tier 가 있는 경우는 추가기능을 스샷같은것으로 정리한다.
클라우드에 자료를 업 & 다운 할 수 있고 여러 클라우드 서비스를 통합적으로 관리할 수 있도록 하는 Application을 대상으로 한다.

[odrive](https://www.odrive.com/)
odrive

[AirExplorer](http://www.airexplorer.net/en/)
airexplore

[Syncthing](https://syncthing.net/)
OpenSource. Freeware.

[otixo](http://www.otixo.com/)
otixo

[AGORA](https://agora.co/)
(써보고싶은데 가입이 안된당……)

이외에 추천할만한 클라우드 통합 싱크 Application이 있으면 댓글이나 메일주세요. 🙂

MySQL Basic Log

### mysqld
* mysqld start

“`
160114 14:51:46 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
160114 14:51:46 InnoDB: Initializing buffer pool, size = 8.0M
160114 14:51:46 InnoDB: Completed initialization of buffer pool
160114 14:51:46 InnoDB: Started; log sequence number 0 44243
160114 14:51:46 [Note] Event Scheduler: Loaded 0 events
160114 14:51:46 [Note] /usr/libexec/mysqld: ready for connections.
Version: ‘5.1.73-log’ socket: ‘/var/lib/mysql/mysql.sock’ port: 3306 Source distribution
“`

* mysqld shutdown

“`
# 에러나서 종료
160113 15:40:32 [Warning] ‘–log’ is deprecated and will be removed in a future release. Please use ”–general_log’/’–general_log_file” instead.
160113 15:40:32 [Warning] ‘–log-update’ is deprecated and will be removed in a future release. Please use ‘–log-bin’ instead.
160113 15:40:32 [Warning] ‘–log_slow_queries’ is deprecated and will be removed in a future release. Please use ”–slow_query_log’/’–slow_query_log_file” instead.
160113 15:40:32 [ERROR] The update log is no longer supported by MySQL in version 5.0 and above. It is replaced by the binary log.
^G/usr/libexec/mysqld: File ‘/var/log/mysql/mysql-bins.index’ not found (Errcode: 2)
160113 15:40:32 [ERROR] Aborting

160113 15:40:32 [Note] /usr/libexec/mysqld: Shutdown complete

# 정상 종료
160114 14:51:41 [Note] /usr/libexec/mysqld: Normal shutdown

160114 14:51:41 [Note] Event Scheduler: Purging the queue. 0 events
160114 14:51:43 InnoDB: Starting shutdown…
160114 14:51:44 InnoDB: Shutdown completed; log sequence number 0 44243
160114 14:51:44 [Note] /usr/libexec/mysqld: Shutdown complete
“`

* setting error – ERROR

“`
160113 15:40:32 [ERROR] The update log is no longer supported by MySQL in version 5.0 and above. It is replaced by the binary log.
^G/usr/libexec/mysqld: File ‘/var/log/mysql/mysql-bins.index’ not found (Errcode: 2)
160113 15:40:32 [ERROR] Aborting
“`
* setting error – WARNING

“`
160113 15:40:41 [Warning] ‘–log’ is deprecated and will be removed in a future release. Please use ”–general_log’/’–general_log_file” instead.
160113 15:40:41 [Warning] ‘–log-update’ is deprecated and will be removed in a future release. Please use ‘–log-bin’ instead.
160113 15:40:41 [Warning] ‘–log_slow_queries’ is deprecated and will be removed in a future release. Please use ”–slow_query_log’/’–slow_query_log_file” instead.
“`

### mysql query log
* connect

“`
160114 11:00:13 2 Connect [email protected] on mysqltest
2 Query show databases
2 Query show tables
2 Field List dd
2 Query show variables
“`

* database select

“`
160119 16:11:21 8 Query SELECT DATABASE()
8 Init DB mysqltest
8 Query show databases
8 Query show tables
8 Field List dd
8 Field List tableName
8 Field List tableName2
“`

* query – select

“`
160114 15:37:11 2 Query insert into tablename(time) values(20131111)
2 Query select * from tablename
160114 15:37:29 2 Query insert into tablename(time) values(20131111)
2 Query select * from tablename
“`

* query – create

“`
160114 15:29:48 2 Query create table if not exists tablename
160114 15:30:17 2 Query create table if not exists tablename(id int)
160114 11:02:17 2 Query create database asdfqwer
“`

* query – delete

“`
160114 15:37:56 2 Query delete from tablename where time=2013-11-11
160114 15:38:04 2 Query delete from tablename where time=20131111
“`

* query – insert

“`
160114 15:35:37 2 Query insert into tablename(test) values(11111111111111)
160114 15:35:44 2 Query insert into tablename(test) values(111tt)
160114 15:36:08 2 Query insert into tablename(test) values(1111)
2 Query select * from tablename
2 Query –)
160114 15:36:43 2 Query insert into tablename(test) values(1111)
2 Query select * from tablename
160114 15:36:49 2 Query insert into tablename(test) values(11111111111111)
2 Query select * from tablename
160114 15:36:57 2 Query insert into tablename(time) values(11111111111111)
2 Query select * from tablename

“`

* query – update

“`
160119 16:51:51 10 Query update tablename SET time=20020808 WHERE test=1111
“`

* query – alter

“`
160114 15:32:22 2 Query alter table tablename add test
160114 15:33:12 2 Query alter table tablename add column test
160114 15:33:20 2 Query alter table tablename add column test 11
160114 15:33:25 2 Query alter table tablename add column test int
160114 15:33:32 2 Query alter table tablename add column test integer
“`

* query – set

“`
160119 16:43:39 9 Query SET GLOBAL general_log = ‘OFF’
“`

* query – drop

“`
160114 15:29:26 2 Query drop table if exists tablename
160114 11:02:22 2 Query drop database asdfqwer
2 Query SELECT DATABASE()
“`

### mysql-slow
* 설정한 시간 이상 지연된 쿼리
“`
# Time: 160119 16:11:31
# [email protected]: root[root] @ localhost []
# Query_time: 8.000282 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
use mysqltest;
SET timestamp=1453187491;
select sleep(8);
“`

Error using npapi plugin on 64bit chrome

\"\"

현재 크롬 데브채널을 사용하면 위에 보이는 것처럼 64bit 버전이라고 뜬다.

얼마전에 윈도우7,8 데브채널을 사용하는 사람들에게 크롬을 64bit 버전으로 그냥 올려버린것이다.

근데 여기서 문제가 발생하는데 금융사나 몇몇사이트들이 멀티브라우저 지원하겠다고 내놓은 플러그인들이 동작을 안한다.

 

일단 한번 업데이트가 끝나면 스테이블이나 베타채널로 바꿔도 롤백이 되지는 않으니 삭제후에 다시 설치를 해야한다. 아 귀찮아.


 

04일 수정

크로미움에 이슈등록을 했더니. 머지됐다고 메일이 왔다. 확인해보니 플러그인에서 64비트를 지원해야된다고… 플러그인 업데이트를 하란다 ㅠㅠ 그래서 넥슨이랑 금융사에 일단 문의를 보내둿다. 언제 업데이트 될지는 미지수.

그리고 크롬에서는 올해(2014)말까지 npapi를 아예 퇴출시킨다는 방향이라서 네이티브 어플리케이션과 통신은 nmapi 사용을 권장한덴다. 자세한건 모르니 링크만 걸어두고 끝내겟다.

http://www.chromium.org/developers/npapi-deprecation
http://developer.chrome.com/extensions/messaging.html#native-messaging

JDBC를 이용한 JSP – MySQL 연동

우리는 앞서 MySQL의 기본 사항에 대해 배울 때 “명령 프롬프트”를 통해 “mysql” 클라이언트 프로그램을 실행함으로써 데이터베이스 서버에 접속하고 몇몇 데이터 조작을 위한 명령을 실행하였다. 이 과정은 크게 네 가지 단계로 나누어 생각할 수 있다.

먼저 데이터베이스 서버로의 연결 단계이다. 이 단계는 “명령 프롬프트”에서 다음 명령을 실행하고 암호를 입력함으로써 이루어진다.
mysql  -u  jsp  -p
이 명령은  데이터베이스 사용자 “jsp”가 클라이언트 프로그램을 이용 서버에 연결 데이터 조작을 할 수 있도록 한다. 이 때 서버와의 연결을 위해 주어지는 정보는 세 가지다. 첫 째 사용자아이디, 둘 째 비밀번호, 그리고 데이터베이스 서버가 실행되고 있는 컴퓨터 정보다. 위 명령에서 컴퓨터 정보는 주어지지 않았지만 실제로는 “-h” 옵션 뒤에 도메인네임 또는 IP 주소와 같은 컴퓨터 이름을 줄 수 있으며 이 옵션이 생략되면 “-h localhost”가 주어진 것과 동일하다. 따라서 위 명령은
mysql  -u  jsp  -p  -h localhost
와 같다.
둘 째 데이터베이스 서버로의 연결이 완료되면 다음 명령을 이용 사용하고자 하는 데이터베이스를 선택해야 한다.
use  jsp ;
이 명령은 MySQL 서버가 관리하고 있는 데이터베이스 중 “jsp” 를 사용하겠다는 의미이다. 만약 데이터베이스를 선택하지 않고 쿼리를 실행할 때 많은 경우 데이터베이스가 선택되지 않았다는 오류 메세지를 출력한다.
데이터베이스를 선택한 후에는
SELECT, INSERT, DELETE, UPDATE, CREATE, DROP, ALTER

 

등과 같은 한 각종 SQL 명령을 실행 데이터를 조작한다.
마지막으로 원하는 데이터조작이 완료됐으면 데이터베이스 클라이언트와 서버 사이의 연결은 끊는다. 이 처럼 연결, 데이터베이스 선택, 쿼리실행, 연결종료 네 단계 과정이 하나의 주기로 이루어진다. JSP 프로그램에서도 이와 같이 네 단계의 과정을 통해 데이터베이스와의 연동이 이루어진다. 그러면 간단한 회원가입 폼과 프로그램을 통해 JSP와 데이터베이스를 연동하는 방법을 살펴보자.
아래 “MemberJoin.html”은 가입을 위해 회원정보를 입력하는 HTML 폼이다.

 

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<form action=”MemberJoin.jsp” method=”post”>
<table>
<tr>
<td>회원아이디</td>
<td><input type=”text” size=”10″ maxlength=”16″ name=”userid“></td>
</tr>
<tr>
<td>비밀번호</td>
<td>
<input type=”password” size=”10″ maxlength=”16″ name=”userpwd1“>
<input type=”password” size=”10″ maxlength=”16″ name=”userpwd2“>
</td>
</tr>
<tr>
<td>이름</td>
<td><input type=”text” size=”10″ maxlength=”20″ name=”username“></td>
</tr>
<tr>
<td>주민등록번호</td>
<td>
<input type=”text” size=”6″ maxlength=”6″ name=”jumin1“> –
<input type=”password” size=”7″ maxlength=”7″ name=”jumin2“>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<input type=”submit” value=”등록”>
<input type=”reset” value=”초기화”>
</td>
</tr>
</table>
</form>
</body>
</html>

사용자 삽입 이미지

MemberView.html 실행결과

 

이 폼에서 회원 정보를 입력받는 창의 이름을 기억하자. 이 폼에 입력된 정보는 “등록” 버튼을 클릭하면 아래 “MemberJoin.jsp” 프로그램으로 전달한다. 그러면 “MemberJoin.jsp”는 데이서베이스 서버와 연결, 데이터베이스 선택의 단계를 거쳐 입력된 정보를 데이터베이스 테이블에 저장하기 위한 쿼리를 실행한 다음 데이터베이스 서버와의 연결을 종료하면 된다. 그러면 각 단계별로 JSP에서 어떻게 처리하는지 살펴보자.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
pageEncoding=”EUC-KR”%>
<%@ page import = “java.sql.*” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<%request.setCharacterEncoding(“euc-kr”);String userId   = request.getParameter(“userid”);
String userPwd1 = request.getParameter(“userpwd1”);
String userPwd2 = request.getParameter(“userpwd2”);
String userName = request.getParameter(“username”);
String jumin1   = request.getParameter(“jumin1”);
String jumin2   = request.getParameter(“jumin2”);Class.forName(“com.mysql.jdbc.Driver“);Connection conn = null;
Statement  stmt = null;

String url = “jdbc:mysql://localhost:3306/jsp?user=jsp&password=your_password“;
String sql = “INSERT INTO members VALUES (‘”
+ userId +”‘, md5(‘”+ userPwd1 +”‘),'”+ userName +”‘,'”+ jumin1 +”‘,md5(‘”+ jumin2 +”‘))”;
System.out.print(sql);
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
stmt.execute(sql);
stmt.close();
conn.close();
%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<table>
<tr>
<td>회원아이디</td>
<td><%= userId %></td>
</tr>
<tr>
<td>비밀번호</td>
<td><%= userPwd1 %></td>
</tr>
<tr>
<td>이름</td>
<td><%= userName %></td>
</tr>
<tr>
<td>주민등록번호</td>
<td><%= jumin1 %>-<%= jumin2 %></td>
</tr>
</table>
</body>
</html>

먼저 데이터베이스와의 연동을 위해 JDBC 드라이버를 로딩해야 한다. 드라이버의 로딩은 “Class.forName” 메소드를 이용한다. 프로그램에서 보면

Class.forName(“com.mysql.jdbc.Driver“);
부분이 드라이버를 로딩하는 부분이다. 이 메소드를 실행하기 위해 필요한 파라메터는 값은 드라이버를 다운로드 할 때 매뉴얼에 함께 제공되며, MySQL 드라이버의 경우 “com.mysql.jdbc.Driver” 이다. 드라이버가 성공적으로 로딩되어야 JSP와 데이터베이스와 연동 프로그램을 작성할 수 있다.
드라이버가 로딩 됐으면 “DriverManager.getConnection” 메소드를 이용 JSP와 데이터베이스 서버와의 연결을 실행한다. 이 메소드를 실행하기 위해 필요한 파라메터 역시 드라이버 배포시 매뉴얼에 함께 제공되며 드라이버 별로 고유한 패턴을 가지는데 MySQL의 경우 다음과 같은 형식을 가진다.
“jdbc:mysql://hostname:3306/databasename?user=userid&password=userpassword

 

이를 커넥션스트링이라 하는데 프로그램에서 사용된 커넥션스트링
jdbc:mysql://localhost:3306/jsp?user=jsp&password=your_password

 

를 살펴보면 “localhost”에 접속하라는 의미이며, 사용자 아이디는 “jsp”, 비밀번호는 “your_password” 그리고 사용하려는 데이터베이스는 “jsp” 임을 알 수 있다. “DriverManager.getConnection” 메소드에 의해 연결된 결과는 Connection 클래스 객체를 생성한 후 저장한다.
conn = DriverManager.getConnection(url);

 

데이터베이스 선택과 함께 서버와의 연결이 이루어지면 쿼리실행 단계에 들어간다. 이 프로그램은 회원가입을 위한 프로그램이므로 만약 입력된 회원정보가 입력 창에
hong
1234
12345
Hong Gil Dong
123456
7654321
순으로 입력 됐다면 다음과 같은 SQL을 만들어 실행하여 회원정보를 테이블에 저장해야 한다.
INSERT INTO members VALUES
(‘hong’, md5(‘1234’), ‘Hong Gil Dong’, ‘123456’, md5(‘7654321’))
위 SQL 에서 md5(‘1234’)와 md5(‘7654321’)은 ‘1234’, ‘7654321’을 암호화 알고리즘인 MD5 알고리즘을 사용하여 암호화 하라는 의미이다. 그러므로 members 테이블에 비밀번호와 주민등록번호 뒷 자리는 암호화되어 ‘1234’, ‘7654321’이 아닌 전혀 다른 값으로 저장된다. 프로그램에서 회원 정보는 “request.getParameter” 메소드를 이용 전달받으며,
“INSERT INTO members VALUES (‘”
+ userId +”‘, md5(‘”+ userPwd1 +”‘),'”+ userName +”‘,'”+ jumin1 +”‘,md5(‘”+ jumin2 +”‘))”

 

부분이 회원정보를 테이블에 저장하기위한 “INSERT” 문을 만드는 부분이다. JSP 프로그램에서 데이터 조작을 위한 SQL 문을 만든 후에는 Connection 객체의 메소드 “createStatement”를 이용 Statement 객체를 생성한 후 이 객체의 “execute” 메소드를 이용 쿼리를 실행한다.
stmt = conn.createStatement();
stmt.execute(sql);

 

쿼리 실행 후 모든 데이터 조작이 마무리되면 Statment 객체와 Connection 객체의 “close” 메소드를 이용 할당된 자원을 돌려주고 연결을 끊는다.
stmt.close();
conn.close();

 

사용자 삽입 이미지

MemberJoin.jsp 실행결과

다음 프로그램 “MemberView.jsp”는 “members” 테이블에 저장된 레코드를 출력하는 JSP 프로그램이다. 테이블 검색을 위해서 사용하는 SQL은 “SELECT” 문이다. “SELECT” 문은 “INSERT”, “DELETE”,”UPDATE” 문과는 달리 처리해야 하는 부분이 더 필요하다. “SELECT” 문을 실핼할 때도 서버연결, 데이터베이스 선택, 쿼리실행, 연결끊기의 네 단계가 필요하다. 그러나 “SELECT” 문의 경우 검색된 결과를 사용자에게 출력해야 하기 때문에 쿼리실행 후 검색된 레코드를 반복문을 통해 추출하고 출력하는 부분이 추가된다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
pageEncoding=”EUC-KR”%>
<%@ page import = “java.sql.*” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<%
Class.forName(“com.mysql.jdbc.Driver”);Connection conn = null;
Statement  stmt = null;
ResultSet  rs = null;String url = “jdbc:mysql://localhost:3306/jsp?user=jsp&password=your_password”;
String sql = “SELECT userid, username, jumin1 FROM members”;
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();rs = stmt.executeQuery(sql);
%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%
while (rs.next()) {
%>
아이디 : <%= rs.getString(“userid”) %><br />
이름 : <%= rs.getString(“username”) %><br />
주민등록 : <%= rs.getString(“jumin1”) %><br />
<%
}
%>
</body>
</html>
<%
stmt.close();
conn.close();
%>

위 프로그램을 살펴보면 ResultSet 객체 rs를 선언하고 있다. 이 객체는 쿼리실행 단계에서 그 결과를 저장한다. 이 때 “SELECT” 문의 실행을 위해 stmt.execute가 아닌 stmt.executeQuery 메소드를 사용하고 있음에 주목하자. 저장된 결과는 ResultSet 형으로 검색된 모든 레코드를 가지고 있다. 여기서 각각의 레코드로 접근을 하기 위해서는 “next” 메소드를 이용한다. “next” 메소드가 호출되면 현 레코드에서 다음 레코드로 커서를 이동한다. 커서란 레코드를 가리키는 포인터를 의미한다. 만약 마지막 레코드인 경우 false를 돌려준다. 그러므로 반복문을 이용하면 모든 레코드를 읽을 수 있다.

현재 레코드에서 각 필드값을 얻기 위해서는 “rs.getString” 메소드를 사용한다. 파라메터로는 해당 테이블의 필드명을 준다. 다음은 “MemberView.jsp”를 실행한 결과이다.

사용자 삽입 이미지

MemberView.jsp 실행결과

 

출처는 여기!