Tomcat8 catalina MessageDispatch15Interceptor class not found


Tomcat 으로 클러스터링을 하는데, 왜인지 모르게 클러스터를 찾지 못하는 문제가 발생합니다 


제가 사용하는 버전은 8.5.12 버전입니다.


그런데 8.5.12 에서 8.0.42 버전으로 다운그레이드 하니 저런 문제는 없어졌네요 .


아마 버전업 하면서 클래스명이 바뀐것 같은데, 이것때문에 시간 엄청 썻네요 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

사실, 언제부터인가 Python을 쓰다보니,,

그래도 가장 편했던 언어는 JAVA 언어였는데, 요즘 너무 어렵네요 


여러여러 관점에서 다른 원격지에서 생성되는(로그든 어떤거든) 데이터를 수집하기 위해서 API를 서버가 필요한 상황이였습니다(저 같은경우는 사용자 브라우저에서 생성된 로그 데이터의 경우 입니다.)


일단 제가 사용하는 조합은 


Python 2.7에서(Pyenv 로 3으로 올려서 사용했는데, 중간에 소스가 꼬여버리는 바람에) + Flask + Guicorn + Supervisor.d를 이렇게 사용하고 있습니다.


주변 케이스를 찾아보면 현 해당 케이스에서는  Node.js 를 기반으로 긍정적으로 평가하는것 같지만, 굳이 이걸 사용하는건 Python 이 편하기 때문에


먼저 SSL 키를 확보합니다.(확보되어 있다고 가정하고, 구입 또는 letsencrypt를 통해 무료로 발급받았다고 가정) 



먼저 필요한 패키지(?) 모듈들은 이거고 설치는 pip를 통해서 했습니다.

from flask import Flask, request, Response
from flask_cors import CORS, cross_origin
from OpenSSL import SSL


Flask 는 다음과 같이 사용합니다.

app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})


여기서  CORS를 한이유는 , 저 같은경우 데이터가 브라우저들을 통해서 넘어오는 상황이여서 크로싱 브라우징 이슈를 해결하기 위해 사용하였습니다 


context = SSL.Context(SSL.SSLv3_METHOD)
cert = 'cert.pem'
pkey = 'privkey.pem'
context.use_privatekey_file(pkey)
context.use_certificate_file(cert)


그다음 HTTPS 사용하기 위해서 다음과 같이 하였습니다. 만약 이옵션을 제거하면 HTTP REST API 가 됩니다 


if __name__ == "__main__":
app.run(host='0.0.0.0', port='58080', ssl_context=(cert, pkey))

 

app.run 을 할때 ssl_context를 넣어주면 https로 작동하게 됩니다. 



@app.route("/", methods=['POST'])
@cross_origin()
def api(): data = str(request.get_data())

resp = Response(data)
resp.headers['Access-Control-Allow-Credentials'] = 'true'
return resp

request.get_data()와 같은 형태로 해당 api 주소의 /을 post로 넘겨온 데이터를 받습니다 이제 여기서 저 같은경우에 데이터를 좀더 수정하고 시간을 붙여서 다른 장소로 다시 넘깁니다


그리고 resp부분은 받은 내용에 대해서 그대로 다시 리턴합니다... 데이터를 보내오는 쪽에서 그렇게 해달라고 하더군요. 

사실 웹쪽을 잘모르는데, 제가 다시 보낸다고 해도, header를 저런식으로 안붙여주면 다른쪽에서 받지를 못하더군요.. 


사실 잡설이긴하지만,,, 저 같은 경우는 HDP 플랫폼으로 하둡 데이터를 처리하였는데, Cloudera CDH 쪽 하는 친구의 말을 들어보면 supervisor.d 가 데몬을 키고 끄고 이런 소리를 하길래 superviosr.d 가 클라우데라쪽의 어떤 프로젝트 인줄 알았습니다. 


제대로 이해한거면 supervisor.d는 파이썬의 프로젝트인것 같더군요 (http://supervisord.org/Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.)


보통의 경우 Flask 를 단독으로 띄워서 사용하지는 않는다고 하는것 같습니다. 사실 이번엔 제가 이건 처음이여서 다른것을 참고 하다보니요 아직 wsgi 의 개념은 잘이해는 안가는데 flask+guicorn 조합으로 사용하는것 같습니다.( http://flask.pocoo.org/docs/0.12/deploying/wsgi-standalone/)


그다음 supervisor.d 에는 다음과 같이 적용을 시켰습니다 


[program:api]

command = gunicorn -w5 --certfile=cert.pem --keyfile=privkey.pem api:app -b 0.0.0.0:58080 --pythonpath /root/api

;directory = /root/api

user = root

numprocs=1

autostart=true

autorestart=true



일단 이걸로 사용하다가 ,  다음에는 이걸 사용하다가 Node.js 로 해봐야겠네요.. 


Node.js가 그렇게 좋다는데....(멍)

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License



AWS 에 Putty로 PEM 키를 읽어들일려고 할때 , couldn't load private key unexpected end of file 오류가 난다면


현재 사용하고 있는 Putty 버전에 버그가 잇는것입니다.


http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 에서 최신버전을 받아서 다시 시도하시면 해결 되십니다. 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

어떤 작업을 하는중이였는데, 40만 row가 들어있는 테이블을 MySQL로 지지고 볶고 있었습니다.

필요에 따라서는 테이블간 Join을 하였는데


주변 친한 형님이 왜 그렇게 하냐고 Merge를 하라고 하더군요..

찾아보니..MySQL에서는 동일한 기능이 ON DUPLICATE KEY UPDATE 이거였는데,,


결국에는 제가 하는 어떤 작업을 위해서는 Insert + Select + ON DUPLICATE KEY UPDATE 를 같이 써야 되는구조여서 한참 구글링을 하다가 옆나라 블로그에서 찾았네요 ..




INSERT INTO total (id,count) SELECT id, count 

     FROM (SELECT id, count FROM daily GROUPBYdate) t

ON DUPLICATE KEY UPDATE count = t.count


http://d.hatena.ne.jp/pullphone/20121203/1354502080



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Error Messages

Invalid username or password

The default username / password to use when logging in to phpVirtualBox is admin / admin. 
See: https://sourceforge.net/p/phpvirtualbox/wiki/Authentication%20in%20phpVirtualBox/

Some users have reported issues logging in if the PHP engine can't write to its session folder. It is impossible to cover all the possible PHP configurations here, so difficult to give direct guidance. I suggest you google "php failed to write session data" adding your operating system to the search.

https://sourceforge.net/p/phpvirtualbox/wiki/Common%20phpVirtualBox%20Errors%20and%20Issues/


기본적으로 계정설정하는것 말고, 웹인터페이스 자체의 암호는 admin/admin 입니다


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

The forwarded port configuration expects two parameters, the port on the guest and the port on the host. Example:

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080
end

This will allow accessing port 80 on the guest via port 8080 on the host.

For most providers, forwarded ports by default bind to all interfaces. This means that other devices on your network can access the forwarded ports. If you want to restrict access, see the guest_ip and host_ip settings below.

https://www.vagrantup.com/docs/networking/forwarded_ports.html


결국에는 Virtue Box에서 돌아가는가지만, 개발을 위해 멀티 클러스터 환경(그래봤자 4노드)를 구현 했지만, SSH말고 다른 통신 포트를 포워딩 하기 위해 찾아보니, 매우 쉽게 포워딩 가능 


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

지금도 진행중이지만, 발생할수 있는 경우의 수를 계산할일이 생겼는데, 

이제는 산수도 헷갈리는 문제가 발생하였습니다. 


경우의 수를 쉽게 구하는 방법이 있습니다.(예를들면 M이라는 갯수가 있을때 N개씩 뽑을대 발생할수 있는 McN) 경우의 수,, 표현식이 맞는지 잘모르겠지만..


예전에 울프럼알파? 수학용 검색엔진이 있다고 언듯들은적 있는데, 바로 계산해주네요 




그리고 만약 자바에서 할경우에는, 하마타면 로직을 만들뻔 했지만 combinatoricslib 라이브러리가 존재,

https://code.google.com/p/combinatoricslib


            <dependency>

<groupId>com.googlecode.combinatoricslib</groupId>

<artifactId>combinatoricslib</artifactId>

<version>2.0</version>

</dependency>



홈페이지에는 참고할만한 내용이 없을 정도로 라이브러리 자체가 심플하게 구성되어 있네요 \

 // Create the initial vector of (apple, orange)
   
ICombinatoricsVector<String> initialVector = Factory.createVector(
     
new String[] { "apple", "orange" } );

   
// Create a multi-combination generator to generate 3-combinations of
   
// the initial vector
   
Generator<String> gen = Factory.createMultiCombinationGenerator(initialVector, 3);

   
// Print all possible combinations
   
for (ICombinatoricsVector<String> combination : gen) {
     
System.out.println(combination);
   
}

  

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

오늘 심각한 고민을 했습니다  ... 자바는 그냥 갔다 버려야되나..


Parallel Python 이거 써보고 할말을 잃었습니다. 생각보다 너무 쉽고.


Parallel Python을 사용하기 위해서는 대략 다음 절차를 수행하시면 됩니다.



연산을 하려는 노드, Master노드에 Parallel Python 설치(http://www.parallelpython.com/) [현재 저같은경우 Python 2.7을 사용하고 있습니다.]


그다음 연산하려는 모든 노드에서 네트웍 대역이 같다면, ppserver.py -a (이 의미는 실제 코드 설명할때 설명0


그리고 마스터 노드에서 병렬처리할 코드를 작업하시면 됩니다.


큰틀은 다음과 같습니다. 


가장 중요한 부분은 ppserver= ppservers=("*",) 입니다. 앞에서 ppserver.py -a  한이유와 같은데, 만약 같은 네트워크 대역폭에 있으면 알아서 감지합니다. 


 job_server.submit(mysum,(100,),callback=sum.result) 


실행할 함수?, 그리고 Parameter, 콜백 함수 입니다. 


만약 이럴경우, 병렬로 돌릴때 그 모듈이 돌아가기 위해 필요한 모듈이 있다고 가정할대, 예를들명 mysum을 연산할때 파이선의 math 모듈이 반드시 필요하다 그럴경우에는 modules = ("math","sys")와 같이 파라메터를 넣어주시면 됩니다.


파이썬이 이렇게 강력할줄이야.. 




import sys,thread
import pp
class myTest:
def __init__(self):
self.value=0
self.lock = thread.allocate_lock()

def result(self, value):
self.lock.acquire()
self.value += value
self.lock.release()


def mysum(n):
result=0
for i in range(1,1000):
result+=i
return result



sum = myTest()

ppserver= ppservers=("*",)

job_server = pp.Server(ppservers=ppservers)
job1 = job_server.submit(mysum,(100,),callback=sum.result)

job_server.print_stats()

job_server.wait()

print "result is "+str(sum.value)

job_server.print_stats()


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. Favicon of http://navisphere.net BlogIcon 룬룬 2016.01.03 15:19 신고

    오늘은 드디어 아는 뭔가가 나와서 반가운 마음이 드네요.
    먼저 복 많이 받으시고요. :) 늘 은은히 이어가는 인연이 즐겁습니다.

    저는 전공이 컴퓨터비전, 패턴인식, 머신러닝에 가까운 사람입니다.
    파이썬도 많이들 쓰더라구요. 아마 MATLAB이 유료이기에 그 대안으로 사용되는 분위기가 아니었나 싶습니다.

    저 또한 처음에는 고가의 MATLAB에서 벗어나보고자 배우기 시작한 것이 Python이고 말씀하신 부분, 그 명쾌하게 한줄로 해결되는 듯한 그 부분에 인상이 깊은 언어로 남아있습니다. 배우기 쉽고 수천의 이미 준비된 라이브러리들.. 그렇지 않을 수가 없었죠. :)

    병렬처리라고 하면 제 머릿속에서는 GPU를 이용한 것들이 먼저 떠오르는데 써주신 Parallel Python은 MPI 같은 환경을 말하는 것인가봅니다.
    어쨌든 Python의 편리함은 부정할 수 없는 것 같고요.

    개인적으로 조금 배우고 써보면서 느낀 점을 단 점 위주로 말씀드려보고자 합니다. 사용하실 때 감안을 해보면 좋을 것 같습니다.
    분야 때문에 환경이 좀 다를 수도 있을 것 같기도 해요.

    1. 빠른 결과를 보기 위한 실험용으로는 최적입니다.
    말씀드렸듯 이미 준비된 모듈들이 너무나도 많습니다. 단순 wrapper들도 많고요.

    2. 짜임새 있는 구조로 아름다운 코드를 만들기는 힘든 것 같습니다.
    제가 실력이 모자라 그런 느낌을 받았을 수도 있는데, 스크립트 언어 특성상 그 부분에 이르러서야 오류가 나기 때문에 아까운 시간들을 놓칠 때가 많습니다.
    단순 문법이나 사용상 오류들을 잡는데 시간을 많이 보냈던 것 같습니다. C/C++에서는 빌드조차 안될 것 같은 그런 오류들 말이에요.
    모듈간 연동시에도 크게 검사 과정이 없기 때문에 코드의 크기가 커질 수록 다루기가 힘든 물건이 되어버리는 것 같습니다.

    3. Type 문제
    제게는 이것이 가장 큰 문제로 다가왔습니다.
    사용하다보면 Numpy 등에서 새로 정의된 Type들을 사용하게 되는데, 이것과 기존 Type 혹은 다른 모듈의 Type들이 혼용되기 시작하면 사람이 이를 다루지 못하는 시기가 오게 됩니다.
    C/C++에서는 강력한 Type 검사를 통해 막아주고 있는 부분인데요, MATLAB등은 Matrix, Cell, Dictionary 정도로 제한이 되고 있는 부분이고요.


    아마 지금은 첫줄 같은 고민을 하시긴 해도, 결국 Java를 선택하는 날이 오시리라 믿습니다.


    그럼에도 매력적인 언어임에는 틀림이 없는 것 같습니다.
    어차피 도구니까요. 적절한 목적에 잘 사용하면 되겠죠. :D

    어제 동생과 이야기하다가 나온 것인데,
    Perl 같은 스크립트가 커지면 Python정도로 확장했다가 더 큰 규모가 필요해지면 기존 언어로 가는게 적절한 순서가 아닐까 싶네요.


    오늘은 살짝 넘어서 이야기한 것 같나요? 아는게 나오니 신이 나서... 넓은 마음으로 봐주시고요. :)
    휴일에도 공부하시는 모습에 박수를 보냅니다. 짝짝짝.


    • Favicon of http://redeyesofangel.tistory.com BlogIcon Yuika eizt 2016.01.03 15:43 신고

      새해 복 많이 받으세요 :)

      생각해보면 가벼운 MPI 같은 느김이 맞을것 같습니다. 저 같은 경우는 MPI같은 것과는 거리가 멀고(아마..) (대강들어본적은 있습니다... 학교 다닐대 배울기회가 있었지만,, 수업이 빡세다고해서.. 선택을 안했지만요..)

      요즘에는 학교에서 나와서 빅데이터를 처리하는데 사용하는 Hadoop(MapReduce,Hbase, Hive ...) 안에 있는것들과 Storm 이런 위주로 사용하고 있네요..

      그러다 보니, 가끔식 어떤 데이터들을 처리할대 한개 컴퓨터에서 돌릴때 약간쫌 꼼수로 MapReduce로 나누어서 돌리거나 그러는데... 약간 사이비이네요. 너무 불편했는데,, 어제 파이선이 보이는것입니다..

      사실 어제는 신기했는데,, 전 이걸 그대로 쓰려는게 아니라 제가 하고 싶은 작업에 응용을 해보고 싶은데.. 별로 재밌게 진행되지는 않는것 같네요..

      어디선가 잘 안돌아가는것 같은데..사실 중간중간 검증하면서 하고 든요.. 에러를 내보내는 상황도 아니라서 약간은 애매하네요

      편리하지만 말씀해주신 것들은 염두해 두고 ,, 사용해 봐야겠네요 ㅎㅎ

      감사합니다. :)

잠깐동안 예제를 따라해보면서 해본 느낌은.. 


잘 모르겠지만 엄청 간단합니다. 


먼저 Parallel Python에서 http://www.parallelpython.com/content/view/18/32/ 에서 다운 받아서, pp를 다운받아서, 돌아갈 머신과 마스터 노드에 python setup.py install 하면 끝..


그리고 사용방법은 계산노드(slave)에서 ppserver.py -a(auto discovery) 하면 끝.. 물론 포트를 지정해 준다면 -p 옵션을 사용하면됩니다. 


그런다음 마스터 노드에서 다음과 같은 방법으로 하면됩니다.  (지금 같은경우는 1master node, 1slave node로 구성된 케이스)



import sys,thread
import pp
class myTest:
def __init__(self):
self.value=0
self.lock = thread.allocate_lock()

def result(self, value):
self.lock.acquire()
self.value += value
self.lock.release()


def mysum(n):
result=0
for i in range(1,1000):
result+=i
return result



sum = myTest()

ppserver= ppservers=("*",)

job_server = pp.Server(ppservers=ppservers)
job1 = job_server.submit(mysum,(100,),callback=sum.result)

job_server.print_stats()

job_server.wait()

print "result is "+str(sum.value)

job_server.print_stats()

#ppservers = ("10.0.0.1",)


slave서버를 입력 하는 방법인데 ppserver("*",) 이 방법은 Master노드와 같은 대역에 있을대 저렇게 하면, 자동으로 인식이됨 저 코드의 경우 1master node에서 1 slave노드에게 계산하라고 해서 callback 한 결과를 보여주고 있습니다. 


Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |        100.00 |       0.0000 |     0.000000 | local

Time elapsed since server creation 0.00300002098083

1 active tasks, 8 cores


result is 499500

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |        100.00 |       0.0010 |     0.001000 | local

Time elapsed since server creation 0.00399994850159

0 active tasks, 8 cores



몇가지 궁금한게 생겼는데,, 결국에는 RabiitMq같은 Queue는 필요없을것 같은데,, 다중 노드는 어떻게 명령을 내려야되는거며, 어떻게 중간에 합치는게 따로 있나.  그리고 어짜피 쓰레드는 길(GIL)이 걸릴테니, 멀티프로세싱으로 하고 싶은데,, 이것도 되려나.. (답은 간단하더군요)

결론은 파이썬 신기합니다. . 

추가:: 방금전에 해본결과로는 결국에는 작동하는 로컬밖에 나오지 않았습니다. 
사실 몇가지 실험을 해보았는데, 결론은 다음과 같았다  이번에는 모든 10노드를 전부 기동시키고 
연산작업을... 한 1000개를 걸어보았습니다. 

Job execution statistics:
 job count | % of all jobs | job time sum | time per job | job server
        26 |         16.15 |      28.5401 |     1.097695 | 192.168.1.203:60000
        28 |         17.39 |      26.5884 |     0.949585 | 192.168.1.206:60000
         8 |          4.97 |       5.8869 |     0.735865 | 192.168.1.204:60000
         8 |          4.97 |       4.0038 |     0.500477 | 192.168.1.100:60000
         6 |          3.73 |       4.7484 |     0.791398 | 192.168.1.201:60000
        13 |          8.07 |      13.5061 |     1.038933 | 192.168.1.207:60000
        10 |          6.21 |      10.0583 |     1.005829 | 192.168.1.209:60000
        26 |         16.15 |      77.0360 |     2.962923 | local
        36 |         22.36 |      35.4551 |     0.984865 | 192.168.1.208:60000


결과는 다음과 같은데 10노드가 전부 활동하지는 않습니다... 예상에는 알아서 스케쥴링을 하거나, 현재의 상황을 찍었을때 찰나에는 다른 노드에서 일을하지 않고 있거나 그런것 같습니다. 

이 결과를 찾기 위해 이짓 저짓을 많이 해봤는데, 

어쩌면 이 당연한 사실을 찾기위해 몇시간을 순간 날렸네요.

결국은 파이썬이 신기하네요. 하지만 전 그래도 Java가 좋아요,,

스칼라도 공부해야되는데..





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

몇가지 처리해야할 작업이 있습니다. 


몇 가지 케이스에 대해 계속 테스트를 해보고 있지만. 이걸 Hadoop MapReduce로 처리하는것은 정말 성능이 안나오더군요. 흔히 말한는 반복적인 작업... 이걸 Storm, 또는 Spark를 통해 해결해 보고 싶지만. 현재 사정상 신규아키텍처를 도입하는데 문제가 있어서... 


물론,,, 현재 환경은 HDP(Hortonworks Data Platform)2.3 이기 때문에, 설치하거나 실행하는데, 문제는 아닙니다. Storm 같은경우 Topology를 만들면 되겠지만.. 약간 제가 생각하는 작업에는 불리할것 같고.. Spark쪽은 아직 제가 지식이 부족해서 시간대비 성과가 부족할것 같은 생각 때문입니다.


물론, 전 아직까지는 언어중에 Java가 좋지만, 요즘 왠만한 귀찮은 작업들은 Python으로 하고 있었는데(사실 과거에는 Perl도 배워보고 싶엇지만..) 너무 강력해서 계속 쓰게 되네요. 솔찍히 Java로 10줄 만들걸 파이선으로 3줄이면 표현이 되거든요..


사실 이렇게 하다가 고민이 생겼습니다. 다중 노드(현재 저 같은 경우는 10노드 + 추가 2노드) Produce Consumer 패턴?으로 로 작업을 병렬로 처리해보고 싶었는데, 이걸 프로그램으로 하나하나 만들기도 모하고,, 이러저런 고민이 많았는데,,


파이선이 해결해 주었네요 http://www.parallelpython.com/ 몇가지 고민은 Master Node에서 Slave 노드로 작업을 어떻게 넘겨주느냐 여부인데,, 자체적인 Queue가 있는것인지, 아님 외부 Queue를 이용해야하는지 봐봐야겠네요..


지금 RabbitMQ와 Kafaka를 동시에 보고 있는데,,, 제가 제대로 알고 있다면 Kafakfa는 Consumer에게 전달된 메세지가 어떤것인지에 대한 보장??꼭 UDP같은 성격이라... 의 문제가 있어서... 텍스트들을 보다 보면,, 케이스에 따라서는 RabbitMQ를 추천하시더군요 


일단은 이번포스팅의 목적은 파이선에서 병렬 처리를 쉽게 해주는 방법이 있는데,, 그것은 parallel python 입니다.


파이썬 짱짱,, 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

현재 사용중인 리눅스는 Centos6 64bit 이고 MySQL 버전은 기본 5.1 버전입니다. 


5.7로 업그레이드 하기 위해서는 다음과 같은 절차로 진행하시면 되십니다. 


먼저 MySQL 사이트에 들어가서 RPM 을 바운받아 YUM repo를 추가합니다. 


http://dev.mysql.com/downloads/repo/yum/



MySQL ComunityMySQL Comunity



  1. wget http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm :: 설치 
  2. /etc/init.d/mysqld stop :: mysql 정지 
  3. yum remove mysql mysql-server* 기존 mysql 삭제
  4. yum install mysql-server :: 5.7 설치 
  5. /etc/init.d/mysqld start ::  mysql 시작
    1. 만약 이때 failed 가 뜨면 tail /var/log/mysqld 확인해서 문제 요소 해결(저의 경우에는 [ERROR] unknown variable 'default-character-set=utf8' 이런 오류가 떠서, my.cnf에서 관련설정들을 주석 처리하였습니다..)
  6. mysql_upgrade -u root -p
  7. MySQL 사용


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

맥에서 작업을 하다가 설정을 bashrc에 반영시키려고 했는데, 작동을 안하더군요. 


구글에서 찾아보니 , 맥에서는 bashrc 대신 bash_profile을 사용한다고 하네요 


http://superuser.com/questions/244964/mac-os-x-bashrc-not-working


In OSX, .bash_profile is used instead of .bashrc.

And yes, the .bash_profile file should be located in /Users/YourName/
(In other words, ~/.bash_profile)

For example, /Users/Aaron/.bash_profile

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Study > OSX' 카테고리의 다른 글

맥(osx,mac,macbook pro,mini,air)에서 bashrc 안될때  (0) 2015.10.14
맥 OS 한영키 마음대로 사용하기  (0) 2013.04.11

리눅스로 작업을 하다가, ubuntu를 자주 사용했을 경우는 sudo를 썻지만, 레드헷계열을 사용하다 보니 

root을 많이 사용하게 되네요


이때, 몇가지 고민이 되는데, 사내에 있는 서버들을 사내의 ip대역에서만 root 계정을 접근하게 하고 싶고 나머지 대역에서는 접근하지 못하게 할 수 있을까 하고 생각이 들었는데,


정말로 쉽네요. 



/etc/ssh/sshd_config에서 

 PermitRootLogin yes 바꾸고

 AllowUsers root@192.168.200.* 

이런식으로 바꿔버리면 root에 대해서 192.168.200.* 대역에서만 들어올수 있습니다


만약 저기에 대역을 추가하고 싶다면 AllowUsers root@192.168.200.* root@203.203.203.333 이렇게 추가하면 된다는데, 실제로는 해보지 않았습니다. 위에 방법으로 해보니 , 해당 대역에서만 root로 들어가지네요. 





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Reference

http://jeromejaglale.com/doc/spring4_tutorial


백엔드 쪽 작업에 익숙해서, 프론트쪽에 대한 제대로 된 지식이 없어 Spring MVC 4.0 공부하는데 무슨 소리인지 통 감이 안오더군요. 찾아보니 쉽게 설명해논 블로그가 있어서 링크를 겁니다. 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License



오랜만에 설치해서 그런지 헷갈렸네요.


설치 apt-get install gpac 


사용법 MP4Box (소문자인줄 알다가 뻘짓함.)



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

개인적인 용도로 클라우드 서비스를 이용해서 리눅스 서버 한대를 이용하고 있습니다.

아마존이나, 유클라우드 같은 서비스도 있지만 너무 가격이 비싸서 저 같은경우는 Ramnode(http://www.ramnode.com/)를 이용하고 있는데 

최고 작은 사이즈의 인스턴스의 경우 1년에 15달러 정도 합니다.

(사실 서버가 여러군데 있는데, 아시아에는 없습니다. 시애틀에 있는 서버를 이용중인데 속도가 좀 느리긴 합니다. 하지만 VPN과 개인적인 Proxy용으로 만든거라 나름 쓸만합니다. )



ramnoderamnode



여러 리눅스 배포판을 제공하는데, 지금은 데비안7을 사용하고 있습니다. 분명히도 우분투도 데비안 계열이였는데,Vim을 사용하니 흑백 화면만 나오는것입니다. 해결방법은 간단합니다. 데미안 위키에 간단하게 나와있네요. vimrc를 열어서 syntax를 on으로 만드시면 됩니다. 


https://wiki.debian.org/vim

Vim supports syntax highlighting. To activate it open up

/etc/vim/vimrc

and uncomment the line

" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
syntax on


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

db.runCommand({ "enablesharding" : "database" })

{

"ok" : 0,

"errmsg" : "enableSharding may only be run against the admin database.",

"code" : 13

}


만약 MongoDB를 사용하다 샤딩을 설정하려다 저런 오류를 발생하면, 지금 Admin 인지 확인해보세요


use admin


또는 Mongos host:port/admin

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

잠깐 일때문에 Mongodb를 보고 있었는데, 


몽고디비 안에 document 생성시간을 알아야될 필요가 생겼습니다.


생각해보니 따로 date필드를 만들어 시간값을 넣은것도 아니고....


찾아보니 document생성할때 기본적으로 생성되는 _id로 시간을 구할수 있다고 하네요


https://steveridout.github.io/mongo-object-time/ 사이트에가서 생성된 _id를 집어넣으면 자동적으로 시간으로 변환해줍니다. 





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

http://jsonlint.com/


JSON 정렬, 유효성 검사

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

2012/06/22 - [Study/Linux] - 인트라넷 또는 클러스터 구성시 우분투 apt-get 사용방법


사실 제가 과거에 apt-cache를 이용해서 내부 인터넷 클러스터 환경에서 Ubuntu apt-get 을 사용할수 있는 방법을 포스팅 한적이 있습니다. 사실 클러스터 환경을 운용하다보니 제 개인적인 생각으로는 효율적이지는 않았습니다.

왜냐하면, 가끔씩 컴파일 할 일이 생길때 ant를 실행할때 외부 인터넷 연결을 필요로 하거나, 또는 외부 wget같은걸로 외부에서 받아올려고 할때는 안됩니다.


그래서 결정한것은 마스터 , 1번 외부노드로 연결되는 서버에 Proxy를 구축하는 방법입니다. 사실 정확하게는 기억이 안나는데,브릿지를 구성하는 방법이 잇긴한데, 제가 설정을 작못해서 그런지, 느리더군요.


squid3는 설치 방법이 간단해서(약간 차이나긴 하지만 ubuntu 10.04, 12.04의 경우 데몬 스크립트가 생성되는데 14.04에서는 생성이 안되는것 같더군요) 이건 다음 포스팅에서 해보는걸로 하고 하고 만약 squid3가 설치되어 있다는 가정하에 apt-get으로 적용시키는 방법에 대해 설명 드리겠습니다


/etc/apt/apt.conf 에 이런식으로 적용하시면 되십니다. (apt.conf라는 파일이 아마 없을것 같습니다. 이건 생성해주시면 되십니다.)



http://askubuntu.com/questions/23666/apt-get-does-not-work-with-proxy



Acquire::http::proxy "http://User:Password@host:port/";
Acquire::ftp::proxy "ftp://User:Password@host:port/";
Acquire::https::proxy "https://User:Password@host:port/";

일딴 저 같은경우는 인증정보가 없기때문에, 실제 이런식으로 작성하였습니다.


Acquire::http::proxy "http://192.168.0.1:3128/"; Acquire::https::proxy "http://192.168.0.1:3128/"; Acquire::ftp::proxy "http://192.168.0.1:3128/";

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Hadoop을 1.0 버전때에서 사용해봐서 2.0 버전을 공부해보려고 StandAlone 모드로 설치하던 중에 발생한 문제입니다.


물론 이러한 경우가 아니라도 적용이 가능할것 같습니다.


ssh-keyges -t rsa -P ""

이렇게 해서 id_rsa 와 id_rsa.pub 가 생성된후 authorized_keys를 생성한다음

ssh localhost로 한다음에 접속하려고 하니 권한이 없다고 뜨는것입니다.


ssh-server를 다시 실행해봐도 안되고, 지금 제가 사용하는 버전이 Ubuntu 14.04 LTS 데스크톱 버전입니다.

(주로 Hadoop MapReduce 관련 작업을 할때 윈도우에서 이클립스에서 Maven에 올려서 작업했는데, 리눅스에서 하면 MR작업을 바로 걸수 있다고해서, 데스크탑 모드로 약간은 뻘짓하는중입니다.)


리눅스 특성인지, 제가 제대로 이해한건지는 모르겠지만. SSH-keygen 으로 키를 생성하였을때 로그인한 세션에는 바로 적용이 안되는것 같습니다?? 물론 다음 세션부터는 로그인할때 자동적으로 설정들을 읽어와서 그런건지 

ssh 가 RSA 키로 접속이 안되는 일은 발생은 안하였습니다.


만약 저와 같은 리눅스 데스크톱 버전에서 하시는거면 한번 logout한다음 다시 시도해보세요 .


그리고, 과거에 제가 몇몇 관련이슈를 포스팅한적이 잇으니 참고해주요


2012/01/09 - [Study/Linux] - ssh RSA로 접속 불가능시


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License


우분투 서버용 버전만 계속 사용하다가, 노트북에 Ubuntu 14.04 데스크톱 버전을 설정하였는데, 그 사이에 변경이 있던건지는 잘모르겠지만, 설정 위치가 살짝 바뀐것 같습니다. 우분투 guest session 을 없애는 방법을 검색했더니 역시 구글신..

 2012/02/09 - [Study/Linux] - 우분투 11.10 손님(Guest) 막기



http://askubuntu.com/questions/451526/removing-guest-session-at-login-in-ubuntu-14-04


Just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command(s) below:

sudo nano /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf

Add the following line, save and close.

allow-guest=false

Reboot, and you're set.

enter image description here


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License




몇일간 R에 대해서 수업 들으면서 느낀것..


빅데이터 분석으로 R은 만능은 아님(R자체가 데이터를 메모리에 로드해서 사용하기 때문에 만약 컴퓨터가 가진 메모리보다 데이터가 크다면..?) --> 이래서 데이터를 읽어올때 한줄씩 읽어오는 방법도 사용

    --> 때에 따라서는 전처리 단계 필요, 또 R이 오픈소스 이다보니까, R에서 전처리 단계에서 속도가 느려서 

          이를 개선한 Revolution R(현재 7버전) 이라는게 있음,,(유료인가..?..)

    또는 하둡을 이용해서 해결, Rhive, Rhadoop, 등등 

    ++ Java에서 R호출가능, R에서 자바호출가능(?)



그런데 어느정도 전처리된 단계가 있고 R로 처리를 하면 자동적으로 환상적인 Visualization 대박인듯..

(할게 많구나..)


R관련 재미있는 사이트 : http://www.rdatamining.com/







저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Study > R programming' 카테고리의 다른 글

R 프로그래밍  (0) 2014.08.11
R 프로그래밍  (0) 2014.07.27



사실, 졸업전에 어떻게 기회가 되어서 R프로그래밍을 배우고 있습니다. 전,, 여태까지 R 프로그래밍이 Hadoop MapReduce를 쉽게 하기 위한 방법론? 또는 그런 제품, 관련된거라고 생각했는데, 정말로 잘못알고 있었던거네요. 물론 외국쪽에 자료가 많겠지만. 


국내쪽 커뮤티니 주소 첨부합니다. 

http://r-project.kr/ R 한국 사용자모임

https://www.facebook.com/groups/krstudy/ 페이스북 R 사용자 그룹



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Study > R programming' 카테고리의 다른 글

R 프로그래밍  (0) 2014.08.11
R 프로그래밍  (0) 2014.07.27

최근에 학교에서 이런저런것을 진행하면서 자바로 무엇인가 만들때는, 쌩으로 짜지 않고 최대한 라이브러리를 이용하려고 하고 있습니다.(일딴 검증되었으니까,.?,, 제가 짜면 괜히 느려질것 같은 그런 문제점도..) 


물론 JVM위에서 돌아가기때문에 C언어 같은 네이티브에 가까운 속도의 문제를 기대하는건 아니지만. (사실은 어떻게 하다보니.. 자바를 쓰다보니까.. 익숙해져서요..)


보통의 자바책의 맨 뒷장(예를 들어 학교 학부과정에서 쓸만한 책들,, 정말 래퍼런스 책말고..)에 보면 보통 가장 많이 나오는것중 하나가 MySQL을 이용한 프로그램 예제들입니다.


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
import java.sql.*;
 
public class MyDBHelper {
 
 public static void main(String[] args) {
  
  Connection conn;
  Statement stmt;
  
  try {
   Class.forName("com.mysql.jdbc.Driver");
  }catch(ClassNotFoundException e) {
   System.err.print("ClassNotFoundException: ");
  }
  
  try {
   String jdbcaAddress = "jdbc:mysql://localhost:3306/mydb";l
   String id = "user";
   String pass = "userpasswd";
   
   conn = DriverManager.getConnection(jdbcUrl, Id, pass)
   
   stmt = conn.createStatement();   
   
   
   stmt.close();

   conn.close();
  }catch(SQLException e) {
   System.out.println("SQLException: " + e.getMessage());
  } 
 }
}


흔히 말하면, 이런식의 예제였죠... 그런데 요즘 이런저런것을 찾다가 Apache Commons 라는것을 알게되었습니다. 여기서 DButils라는 패키지를 제공하는데 https://commons.apache.org/proper/commons-dbutils/

한예로 들면 이곳에서 제공하는 DButils를 이용하면 다음과 같아집니다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public MysqlHelper(String url, String user, String passwd) {
 
        String driver = "com.mysql.jdbc.Driver";
 
        if (!DbUtils.loadDriver(driver)) {
 
            logger.fatal("Failed Loading JDBC Driver!");
            System.exit(1);
 
        }
 
        try {
            connection = DriverManager.getConnection(url, user, passwd);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }


DButils로 DB를 연결하면 이런식의 모양이 나옵니다. 별로 자바책에서 나오는 예제하고 달라지는건 없습니다. Dbutils라는것이 연결된것 빼고는.  약간 미리 적어놓자면, 보통의 자바책이라는곳에서 DB에 Query를 날리기 위해서 String 을 이용해서 SQL를 만드는 약간의 노가다 작업이 있었는데, 이게 DButils를 이용하면 생각보다 쉽게 해결됩니다. 그 다음 포스트에서 DButils를 이용한 Select, Insert, Update 예제를 올려보도록 하겠습니다. 


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

흔히 자바책에서 말하길, 자바는 JVM에서 동작하기 때문에 한번 컴파일 하면 모든 OS에서 돌아간다는 것입니다. 


지금 어떤걸 간단히 만들다가 약간의 고민에 빠졌습니다.


예를들어 윈도우에서 파일을 다루면 C:\\data\\file.jpg 이런식으로 File f = new File("C:\\data\\file.jpg");

이런식으로 해야되는데 리눅스에서는 윈도우하는 달리 / 이렇게 간다는 차이점이 있습니다.


그래서 처음에는 System.getProperty("os.name"); 해서 OS 이름을 뽑아내서, 각 OS별로 맞추어야 했는데.

제가 바보였습니다.

File.separator를 사용하면 되는거였습니다. 


쉽게  File f = new File("C:\\data\\file.jpg"); 

이런상황에서는 File f = new File("C:"+File.separator+"data"+File.separator+"file.jpg"); 이러면 되네요


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

일단, 자료를 저장하기 위해, Class A라는것을 만들었습니다.

자료를 담아야할 그릇이 있어서. 지금 이걸 bytearray로 이용해서 다른쪽 컴터로 보낸다음 거기서 열어봐야되는데.

분명 예전에 배울때, serialize 하고 했던것 같아서 보고 있었는데,  제 생각에는 소스가 길었던걸로 생각했는데, 딱 두줄이네요


자바 내에서도 기본적인 기능이 있지만. 




역시나 구글신

https://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array


The best way to do it is to use ApacheUtils:

To Serialize:

byte[] data = SerializationUtils.serialize(yourObject);

deserialize:

YourObject yourObject = (YourObject) SerializationUtils.deserialize(byte[] data)

Regards

사랑해요 스택 오버플로 ㅠㅠㅠㅠ 아파치 라이브러리를 이용하면 딱두줄이면 되네요. 필요하신분은 라이브러리를 받으시면 되겠지만 Maven을 이용하시면


                <dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>3.3.2</version>

</dependency>


아래 내용을 입력해주시면 됩니다. 


참고로. 만약 내가 Class A라는 것을 사용해서 사용하는데 이걸 그냥 bytearray로 변환시키면 Cast 오류가 납니다.


반드시, public class A implements Serializable 사용하시려는 클래스에다가 Serializable 을 implements 하하셔서 사용해야합니다. 




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

 이것저것을 하다가 이클립스에 메이븐을 이용해서 톰켓에 Deploy하던중 생긴 문제입니다. 


Source: http://fanshuyao.iteye.com/blog/1688314


중국어는 못하지만, 영어로 Thank you 라고 남겨놓고 싶었으나, 답글도 어떻게 다는지 모르겠네요 


답은 간단합니다. 


<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
    
    <Loader delegate="true" /> 
     

</Context>




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License


 Clear


앱스토어

https://itunes.apple.com/kr/app/clear-tasks-to-do-list/id493136154?mt=8



appstore 공식 설명 보기



정확히 말씀드리면, 오늘의 무료로 소개해드렸지만, 몇일전에도 무료로 풀렸던 아이폰 앱니다. 소개를 드리자면 간단하게 정말 심플한 to-do list를 관리하는 앱입니다. 


이 앱이 여러가지 리뷰를 보면 호불호가 갈리기 때문에 약간의 설명을 첨부해 드립니다. 


일단 제가 이 앱을 선택해서 사용하는 이유는 저 같은경우 메모 또는 이런저런 정보 저장을 위해서 크게 3가지 앱을 사용합니다.


에버노트 ,네이버 메모, pocket(물론 이글에서는 pocket의 설명을 하기에는 애매하니 일단 제외하는 방향으로 하겠습니다. 제가 나중에 포스팅할 예정이지만 pocket같은경우 혹시 read it later라는 앱을 아시는 분이 계시는지 모르겠습니다 . 그 서비스가 이름이 바껴서 서비스 되는거라고 생각하시면 편합니다.)


일단 저 같은경우, todo list를 관리 할 방법이 필요했습니다. 물론 지금 에버노트 또는 네이버 메모로 하는 방법이 존재하지만, 이미 각 앱들끼리 역활을 정해서 사용중이라 애매한 위치였습니다. 그러던 도중에 to do 앱을 여러가지를 알아보았는데


제가 가장 비교해보았던것이 wunderlist와 clear였습니다. clear는 현재 무료로 풀려서 앱스토어를 통해 받을수 있습니다. 즉 한시적이라는 말인데,



wunderlist는 기본적으로 무료고 에버노트처럼 기능확장을 위해 유료를 이용하는 서비스 입니다. wunderlist는 각 모바일 기기(안드로이드 계열이라던지, 아이폰, 윈도우 ) 또 그리고 컴퓨터용 앱까지(윈도우, 맥, 리눅스) 모든 종류를 제공합니다. 즉 언제 어디서나 wunderlist 클라우드를 통하여 todo list를 공유할수 있습니다.


하지만 생각해보니까, evernote네이버 메모가 현재 동일한 기능을 제공하고,  todo list를 관리하지만 광범위하게 , 모든 기기에서 볼필요는 없을것 같아서 , 만약 to do list라도 한줄로 적을수 있는것을 굳이 모든 컴퓨터에서 할 필요가 없다고 생각하였습니다. 만약 길어지면 네이버 메모, 더 길어지면 에버노트에 하면 되기 때문입니다. 그런 목적때문에 clear를 선택하게 되었습니다.


그렇다고 clear가 다른 기기들과 공유 안되느냐? 물론 이건 약간 제한적이지만 clear가 icloud를 이용하기 때문에 이용하시는 애플 기기들끼리는 공유가 가능합니다.


만약 디자인이 예쁘면서, 간단한 to do list 앱을 원하신다면 지금 한시적으로 풀려있는 clear가 좋은 해법이 될것 같습니다. 


그리고 , 좀더 빠른 무료 앱을 정보를 원하신다면 아래 포스팅을 보시고 팟게이트를 이용해보세요

(제작자 아닙니다, 사용해 보니 정말로 좋아서 추천 드립니다.)


2014/03/05 - [Information] - 추천하는 오늘만 무료 팟게이트(PodGate) Pro (무료앱 정보 얻을수 있는 앱)



- 참고 포스팅 -


2013/07/19 - [Book] - 에버노트를 처음 사용하는 분들에게 추천하는 책 , 에버노트 파워북

2013/02/15 - [Information] - 최고의 메모 프로그램 네이버 메모,

2011/12/29 - [Information] - 에버노트(evernote) 파이어폭스용 Clearly가 나왔습니다.

2013/07/19 - [Book] - 에버노트를 처음 사용하는 분들에게 추천하는 책 , 에버노트 파워북

2013/07/19 - [Information] - 에버노트5 베타 윈도우 버전 공개!!

2011/12/11 - [Information] - 모든것을 기억하는 방법 에버노트





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License



https://itunes.apple.com/kr/app/izip+/id820901032?mt=8


아이짚은 파일을 쉽게 관리해주는 전문 앱입니다.

•파일을 ZIP-포맷으로 압축.
•사진과 동영상을 사진첩으로 압축.
•비밀번호로 차단되고 AES로 암호화된 ZIP 파일 등 ZIP 포맷에서 파일 불러오기와 열기.
• 수 많은 기타 압축 형태 파일 불러와 열기: RAR, 7Z, TAR, GZIP.
•여러 가지 문서 형태 열어 보기: DOC, 엑셀, PPT, PDF, TXT, RTF, 페이지, JPG, GIF, PNG, 동영상 등.
• ZIP 파일에 파일 추가하기.
• 이메일로 파일 전송하기.
• 타 앱에서 파일 열기
•포토 앨범에서 사진과 동영상 Zip 파일로 압축/이메일 전송.
• 페이스북/트위터에 사진 공유하기.
• 포토 앨범에 이미지 저장하기.
• 드롭박스, 박스, 그리고 구글드라이브로/에서 파일 전송 및 다운로드. 
• 문서 인쇄.
• 아이튠즈로 파일 다운로드/업로드.
• 단순 비밀번호나 AES 암호로 파일 압축하기.



핸드폰을 안드로이드에서 아이폰 5S로 바꿨습니다.. 안드로이드하고 많이 다르지만,, 생각보다 편리하네요..

안드로이드에서도 찾아보면 이벤트성으로 무료로 풀리는 앱들이 있었는데, 가끔씩 무료로 풀리는 앱들이 있으면 포스팅 하겠습니다. izip+라고 무료로 풀린앱인데, 저 같은경우는 앱스토어에서 알집을 받아 쓰고 있네요 필요한분 받아서 사용해보세요 





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
1234···9

+ Recent posts

티스토리 툴바