반응형


JSP에서 자바 코드를 써서 image orientation을 먼저 알아내고,

orientation 숫자를 기준으로 회전해야 할 각도를 구해서 CSS가 회전을 수행하는 방식이다.



1. 필요한 라이브러리 다운로드 및 적용


이미지의 EXIF 정보에서 orientation을 알아내야 하기 때문에 Metadata-extractor를 쓴다.


[직접 다운로드 또는 사용법 설명]

https://github.com/drewnoakes/metadata-extractor


[Maven]

<dependency>
  <groupId>com.drewnoakes</groupId>
  <artifactId>metadata-extractor</artifactId>
  <version>2.9.1</version>
</dependency>

[Gradle]

 - dependencies에 추가

compile group: 'com.drewnoakes', name: 'metadata-extractor', version: '2.9.1'



2. 소스코드 작성


2-1. Metadata-extractor 기반의 자바 코드:


Java의 File 오브젝트를 사용해서 이미지 파일의 메타데이터 알아내는 Java 클래스를 정의한다.


import java.io.File;

import java.io.IOException;


import com.drew.imaging.ImageMetadataReader;

import com.drew.imaging.ImageProcessingException;

import com.drew.metadata.Directory;

import com.drew.metadata.Metadata;

import com.drew.metadata.MetadataException;

import com.drew.metadata.exif.ExifIFD0Directory;


public class ImageUtil {

/**

* Gets the orientation of an image (usually photo).

* Outputs:

* 6: rotate 90,

* 1: original (no change)

* 3: rotate 180,

* 8: rotate 270,

* others: original (no change)

* @param in a File object to check

* @return orientation value

* @throws IOException

*/

public static int getOrientation(File in) throws IOException {

int orientation = 1;

Metadata metadata;

Directory directory;

try {

metadata = ImageMetadataReader.readMetadata(in);

directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);

if(directory != null){

orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);

}

} catch (ImageProcessingException e) {

System.err.println("[ImgUtil] could not process image");

e.printStackTrace();

} catch (MetadataException e) {

System.err.println("[ImgUtil] could not get orientation from image");

e.printStackTrace();

}

return orientation;

}

public static int getDegreeForOrientation(int orientation){

int degree = 0;

switch(orientation){

case 6:

degree = 90; break;

case 1:

degree = 0; break;

case 3:

degree = 180; break;

case 8:

degree = 270; break;

default:

degree = 0; break;

}

return degree;

}

}



2-2. CSS 정의


실제로 이미지 회전을 수행하는 CSS 코드를 작성한다. 

html 파일에서 <head> 태그 안에 넣거나, 별도로 쓰는 css파일에 추가한다.


<style type="text/css">

.rotate90 {

   -webkit-transform: rotate(90deg);

   -moz-transform: rotate(90deg);

   -o-transform: rotate(90deg);

   -ms-transform: rotate(90deg);

   transform: rotate(90deg);

}

.rotate180 {

   -webkit-transform: rotate(180deg);

   -moz-transform: rotate(180deg);

   -o-transform: rotate(180deg);

   -ms-transform: rotate(180deg);

   transform: rotate(180deg);

}

.rotate270 {

   -webkit-transform: rotate(270deg);

   -moz-transform: rotate(270deg);

   -o-transform: rotate(270deg);

   -ms-transform: rotate(270deg);

   transform: rotate(270deg);

</style>



2-3. JSP 소스코드


먼저 2-1에서 만든 자바 클래스를 JSP에 import한다.

<%@ page import="ImageUtil이_포함된_패키지_이름.*" %>



<%

String filePath = "이미지_파일의_경로";

File f = new File(filePath);

int orientation = ImageUtil.getOrientation(f);

int degree = ImageUtil.getDegreeForOrientation(orientation);


if(degree != 0){

%>

<img src="이미지_파일의_경로" class="rotate<%=degree%>">

<%

} else {

%>

<img src="이미지_파일의_경로">

<%

}

%>




반응형
블로그 이미지

Bryan_

,
반응형

Tested OS: Ubuntu 14.04 또는 Ubuntu 16.04

MySQL version: 5.5~5.7



설정 파일(my.cnf)과 mysql 콘솔에서의 설정 두 가지를 적용하면 된다.


/etc/mysql/my.cnf 또는 /etc/mysql/mysql.conf.d/mysqld.cnf 파일에서

bind-address에 원래 127.0.0.1로 되어 있는 것을 0.0.0.0으로 바꾼다.


bind-address = 0.0.0.0



참고로, root 계정을 외부에서 접속할 수 있게 만드는 것은 그다지 좋은 방법이 아니다. 따라서 외부 접속용 계정을 따로 만들고, 그 계정이 특정 데이터베이스에만 접근할 수 있도록 설정해 주는 것이 좋다.


*DB 생성


mysql> create database testdb;


*사용자 생성


mysql> create user 'testuser'@'%' identified by 'testpassword';



*생성한 사용자의 접근 권한 설정


 - 로컬 접속:


mysql> grant all privileges on testdb.* to 'testuser'@localhost identified by 'testpassword';


 - 외부 접속:


mysql> grant all privileges on testdb.* to 'testuser'@'%' identified by 'testpassword';



MySQL 서비스 재시작:


$ sudo service mysql restart


반응형
블로그 이미지

Bryan_

,
반응형

별 생각없이 블로그 관리자 페이지에 들어갔는데, 티스토리에서 2016년도 블로그 결산을 만들어서 보여 주었다.



어느새 블로그 개설한 지 9년이 넘었다는 것을 새삼스레 알게 되었다.

사실 제대로 블로그에 글을 쓰기 시작한 것은 2013년 하반기부터지만, 그 전에도 띄엄띄엄 글을 쓰며 명맥을 유지했었던 기억이 난다.


의외로 "상위 10% 부지러너"라는 태그가 붙었는데, 어떤 기준인지는 잘 모르겠다. 매일매일 1건 이상 포스팅을 열심히 하는 파워블로거도 아주 많을 텐데, 아마 그런 블로거들은 상위 1% 태그가 붙었겠지? ㅎㅎ


그리고 블로그에 워낙 재미없는 글만 쓰다 보니 방문자 수가 그리 많은 편은 아닌 것 같다. (보기 나름이겠지만) 보통은 내가 맞닥뜨린 문제를 해결하고, 기억해 뒀다가 다음에 같은 문제를 재빨리 해결하려는 목적으로 시작했기 때문에 정보전달 위주의 글밖에 없고, 그래서 사진도 별로 없다. ㅡㅡ;; 그래도 이 재미없는 블로그에 검색으로 21만 명이 방문한 것은 신기하다.





조회수가 높은 글은 조금 의외인데, 실제로 검색 키워드 순위가 높은 글은 다른 포스팅이기 때문이다. 아마도 2015년, 2014년에 작성했던 글을 제외해서 그런 것일 수도 있다. 2016년 결산 페이지니깐...


2016년에 썼던 글 중에서는 그냥 일기처럼 속상한 심정이나 고민중인 주제, 사회적인 문제에 대한 나만의 생각 같은 것을 길게 쓴 것이 오히려 내가 연구/코딩하는 과정에서 생긴 문제 해결 방법을 쓴 글들보다 더 조회수가 많이 잡혔다. 어찌보면 당연한 것이기도 하다. 전공자들 중에서도 특정 연구주제나 일반인들이 잘 쓰지도 않는 특정한 개발 도구에 대한 내용을 공들여서 써 봤자 애초에 그 글을 검색하는 사람 수 자체가 워낙에 적을 테니까.


댓글은... 1년 통틀어 29개의 댓글이 달렸다고 한다... ㅋㅋㅋ

뭐 댓글을 원하거나 소통을 하려는 블로그가 아니니까.

이웃과 소통하고 소소한 일상을 즐겁게 공유하는 블로그가 되기에는 너무 늦었...ㅠㅠ


아무튼 소박하게나마 이 재미없는 블로그를 결산해 준 티스토리에게 감사해요~ :)


반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 14.04 또는 16.04

MySQL: 5.5 또는 5.7


우분투(Ubuntu)에서 MySQL Server 설치를 하고 나면 기본 설정으로 

127.0.0.1 주소에 포트 번호 3306으로 접속하게 되어 있다.

접속하는 포트 번호를 다른 숫자로 변경하려면 설정 파일을 수정하면 된다.


수정할 파일은 /etc/mysql 에서 하위 디렉토리 구조에 따라서 다르다.

하위 폴더에 mysql.conf.d 디렉토리가 있는 경우에는 /etc/mysql/mysql.conf.d/mysqld.cnf 파일을 수정하고,

그런 폴더가 없으면 /etc/mysql/my.cnf 파일을 수정한다.


아니면 /etc/mysql/my.cnf 파일에 !includedir /etc/mysql/mysql.conf.d/ 이런 내용이 적혀 있는데 그 디렉토리에 설정파일이 있다.



내용 중에서, [mysqld] 로 시작하는 부분에서 port = 3306 으로 되어 있는 부분을 원하는 번호로 고친다.


[mysqld]

#

# * Basic Settings

#

user        = mysql

pid-file    = /var/run/mysqld/mysqld.pid

socket      = /var/run/mysqld/mysqld.sock

port        = 43306

basedir     = /usr

datadir     = /var/lib/mysql

tmpdir      = /tmp

lc-messages-dir = /usr/share/mysql

skip-external-locking 



설정 파일을 저장하고, 서비스를 재시작하면 적용된다.


$ sudo service mysql restart




반응형
블로그 이미지

Bryan_

,
반응형


정말 놀랐다.

OpenSSL 같이 전세계 인터넷에 막대한 영향력을 미치는 프로젝트가 최근(2014년)까지도 고작 2명의 핵심 프로그래머가 자기 희생을 해 가면서 지켜 왔다는 사실을 모르고 있었다. 제아무리 오픈소스라 해도 어느 마음씨 좋은(?) 큰 규모의 재단의 도움으로 비교적 안정적으로 운영되리라 막연하게 믿고만 있었는데, 내가 너무 이상적이었을 수 있겠다.


그리고 중국은 정말... 함부로 평가할 수가 없는 것 같다.

OpenSSL에 단일 기부금액으로 최고치, 그것도 프로젝트 시작 이래로 이전과 비교할 수 없는 압도적인 규모의 기부금을 조건 없이 후원한 사람이 중국의 소프트웨어 회사 대표라니.


비록 내가 중국을 바라볼 때마다 감정적으로 받아들이기 어려운 몇 가지 특징들부터 떠오르는 것을 어찌할 수 없지만, 한편으로는 우리나라와 비교하기에 이미 아득하게 큰 나라에 거주하는 수많은 사람들 중에서 내가 상상할 만한 모든 종류의 사람은 다 존재한다고 보는 것이 타당할 것이다.


나는 어떤 사람이 될 수 있을까?

소신을 지키는 사람이 되고 싶다면 내가 지키고 싶은 소신은 도대체 무엇인가?


사실 OpenSSL 프로젝트의 자리를 끝까지 지켜 온 스티브 마퀴스처럼, 인생을 어느 정도 살아본 후에야 내릴 수 있는 과감한 결정을 지금 내가 성급하게 내릴 필요는 없을 지도 모른다. 지금의 내가 없어도 세상이 잘 돌아가고, 내가 나만의 스타일로 슈퍼히어로가 되어야 할 부분이 아직은 보이지 않는다. (당연하지 졸업이 급하니까 @_@)


적어도 무엇이 되었든 간에 나의 경제적 변화에 연연하지 않을 만큼의 열정과, 남들도 내 열정을 인정해 주기 위한 최소한의 실력은 갖고 싶다.


(그런 실력을 위해서 일단 내 논문부터 빨리 끝내 보자. ㅡㅡ)


반응형
블로그 이미지

Bryan_

,