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이 있으면 댓글이나 메일주세요. 🙂

Get system info using sigar library in java

제일 기본적인 정보(CPU, Memory, Disk)만 가져오는 소스코드를 작성해보았다. 가져온 정보를 JSON 형식으로 변환해서 반환한다. json simple 라이브러리가 필요하다.

좀더 간단하게 짤 수 있을거같은데…

“`java
import org.hyperic.sigar.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class Usage {
public static Sigar sigar = null;
Usage(){
sigar = new Sigar();
}

public JSONObject getCPUUsage() throws SigarException {

CpuPerc cpu = sigar.getCpuPerc();
CpuPerc[] cpus = sigar.getCpuPercList();

// cpu array
JSONArray cpuArray = new JSONArray();

JSONObject cpuTotal = new JSONObject();
// usage array
JSONArray usageArray = new JSONArray();
JSONObject usage = new JSONObject();
usage.put(“USER”, CpuPerc.format(cpu.getUser()));
usage.put(“SYS”, CpuPerc.format(cpu.getSys()));
usage.put(“IDLE”, CpuPerc.format(cpu.getIdle()));
usageArray.add(0, usage);
cpuTotal.put(“Total”, usageArray);
cpuArray.add(0, cpuTotal);

for (int i = 0; i < cpus.length; i++){ JSONObject cpuItem = new JSONObject(); // usage array JSONArray cpuUsageArray = new JSONArray(); JSONObject cpuUsage = new JSONObject(); cpuUsage.put("USER", CpuPerc.format(cpus[i].getUser())); cpuUsage.put("SYS", CpuPerc.format(cpus[i].getSys())); cpuUsage.put("IDLE", CpuPerc.format(cpus[i].getIdle())); cpuUsageArray.add(0, cpuUsage); cpuItem.put("CPU " + i, cpuUsageArray); cpuArray.add(i+1, cpuItem); } JSONObject cpuItems = new JSONObject(); cpuItems.put("CPU", cpuArray); return cpuItems; } public JSONObject getMemUsage() throws SigarException { Mem mem = sigar.getMem(); JSONArray usageArray = new JSONArray(); JSONObject usage = new JSONObject(); usage.put("Total", format(mem.getTotal())); usage.put("Used", format(mem.getUsed())); usage.put("UsedPercent", format_percent(mem.getUsedPercent())); usage.put("Free", format(mem.getFree())); usage.put("FreePercent", format_percent(mem.getFreePercent())); usageArray.add(0, usage); JSONObject memItem = new JSONObject(); memItem.put("Memory", usageArray); return memItem; } public JSONObject getDiskUsage() throws SigarException { FileSystem[] fs = sigar.getFileSystemList(); FileSystemUsage fsu = null; JSONArray diskArray = new JSONArray(); int diskCount = 0; // total data; long total = 0, used = 0, free = 0; double usedPercent = 0.0; for(int i = 0; i < fs.length; i++){ try { fsu = sigar.getMountedFileSystemUsage(fs[i].getDirName()); // mount size 가 0인 더미부분은 스킵한다. (linux) if (fsu.getTotal() == 0) continue; } catch (SigarException e) { System.out.print(e.getMessage()); continue; } // total data total += fsu.getTotal(); used += fsu.getUsed(); usedPercent += fsu.getUsePercent(); free += fsu.getFree(); JSONObject diskItem = new JSONObject(); JSONArray diskUsageArray = new JSONArray(); JSONObject diskUsage = new JSONObject(); diskUsage.put("Total", format_giga(fsu.getTotal())); diskUsage.put("Used", format_giga(fsu.getUsed())); diskUsage.put("UsedPercent", format(fsu.getUsePercent())); diskUsage.put("Free", format_giga(fsu.getFree())); diskUsage.put("FSType", fs[i].getSysTypeName()); diskUsageArray.add(0, diskUsage); diskItem.put(fs[i].getDirName(), diskUsageArray); diskArray.add(diskCount++, diskItem); } // disk total data JSONObject diskTotalItem = new JSONObject(); JSONArray diskTotalUsageArray = new JSONArray(); JSONObject diskTotalUsage = new JSONObject(); diskTotalUsage.put("Total", format_giga(total)); diskTotalUsage.put("Used", format_giga(used)); diskTotalUsage.put("UsedPercent", format((usedPercent/diskCount))); diskTotalUsage.put("Free", format_giga(free)); diskTotalUsageArray.add(0, diskTotalUsage); diskTotalItem.put("Total", diskTotalUsageArray); diskArray.add(diskCount, diskTotalItem); JSONObject diskItems = new JSONObject(); diskItems.put("Disk", diskArray); return diskItems; } private String format_percent(double value) { return String.format("%.2f%%", value); } private String format_giga(long value) { return String.format("%.2fGB", (double)value / 1024 / 1024); } private String format(long value) { return Long.toString(new Long(value / 1024)); } private String format(double value) { return String.format("%.0f%%",value*100); } } ``` 각 메소드를 호출시 아래와 같은 형식으로 결과값이 나온다. ##### getCPUUsage() ```json { "CPU": [{ "Total": [{ "IDLE": "100.0%", "USER": "0.0%", "SYS": "0.0%" }] }, { "CPU 0": [{ "IDLE": "100.0%", "USER": "0.0%", "SYS": "0.0%" }] }, { "CPU 1": [{ "IDLE": "100.0%", "USER": "0.0%", "SYS": "0.0%" }] }, { "CPU 2": [{ "IDLE": "100.0%", "USER": "0.0%", "SYS": "0.0%" }] }, { "CPU 3": [{ "IDLE": "100.0%", "USER": "0.0%", "SYS": "0.0%" }] }] } ``` ##### getMemUsage() ```json { "Memory": [{ "Used": "3167720", "Total": "4073188", "UsedPercent": "75.61%", "Free": "905468", "FreePercent": "24.39%" }] } ``` ##### getDiskUsage() ```json { "Disk": [{ "C:\\": [{ "Used": "357.81GB", "Total": "698.54GB", "UsedPercent": "52%", "FSType": "NTFS", "Free": "340.72GB" }] }, { "Y:\\": [{ "Used": "58.49GB", "Total": "118.04GB", "UsedPercent": "50%", "FSType": "NTFS", "Free": "59.55GB" }] }, { "Z:\\": [{ "Used": "2927.31GB", "Total": "3664.62GB", "UsedPercent": "80%", "FSType": "NTFS", "Free": "737.31GB" }] }, { "Total": [{ "Used": "3343.61GB", "Total": "4481.20GB", "UsedPercent": "61%", "Free": "1137.59GB" }] }] } ```

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);
“`

Nested Hashmap or Hashtable in Java

중첩된 Map 사용하기.

“`java
Hashtable>> pattern = new Hashtable>>();

for (int i = 0; i < reader.numDocs(); i++) { Document doc = reader.document(i); if (!pattern.containsKey(doc.get("Type"))){ pattern.put(doc.get("Type"), new Hashtable>());
}
if (!pattern.get(doc.get(“Type”)).containsKey(doc.get(“Sub-Type”))){
pattern.get(doc.get(“Type”)).put(doc.get(“Sub-Type”), new Hashtable());
}
pattern.get(doc.get(“Type”)).get(doc.get(“Sub-Type”)).put(doc.get(“Pattern-Id”), doc.get(“Pattern”));
}
“`

개별 해시테이블을 관리할 필요가 있는 게 아니라면 익명 객체를 생성하는게 편하다.

nodejs

[The Node Beginner Book (Korean version) » A comprehensive Node.js tutorial](http://www.nodebeginner.org/index-kr.html)

nodejs의 기초를 배우기에 충분하다!

웹사이트 만드는 기본 모듈들.
“`javascript
http.createServer(function(request, response) {}).listen(port);
url.parse(request.url).pathname;
querystring.parse(postData).dataName;
“`

Windows Remote Desktop Shortcut

Remote Desktop Services Shortcut Keys

The following is a list of the Remote Desktop Services shortcut keys.

Shortcut key Description
ALT+PAGE UP Switches between programs from left to right.
ALT+PAGE DOWN Switches between programs for right to left.
ALT+INSERT Cycles through the programs in the order they were started.
ALT+HOME Displays the Start menu.
CTRL+ALT+BREAK Switches the client between full-screen mode and window mode.
CTRL+ALT+END Brings up the Windows Security dialog box.
ALT+DELETE Displays the Windows menu.
CTRL+ALT+MINUS SIGN (-) Places a snapshot of the active window, within the client, on the Remote Desktop Session Host (RD Session Host) server clipboard (provides the same functionality as pressing ALT+PRINT SCREEN on the local computer).
CTRL+ALT+PLUS SIGN (+) Places a snapshot of the entire client windows area on the RD Session Host server clipboard (provides the same functionality as pressing PRINT SCREEN on the local computer).

Linux vsftpd 500 error

아오 빡쳐

 

vsftpd에서 anonymous 계정의 업로드 및 폴더생성을 허용했는데 저 에러가 난다면 일단 설정을 확인하자.

“`
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
chown_uploads=YES
chown_username=”anonymous 용 계정명”
anon_root=”anonymous 계정의 루트”
“`

설정이 제대로 되어있는지 확인하고도 안된다면

“`
setsebool -P ftp_home_dir 1
service vsftpd restart
“`

해당 명령어를 쳐보자.

안된다면 SELinux를 끄자.

그래도 안되면…. 모르겟다ㅏㅏㅏㅏㅏ ㅠㅠ