'ITWeb/개발일반'에 해당되는 글 490건

  1. 2018.07.04 [Jenkins] Gradle 을 이용한 submodule update 이슈
  2. 2018.06.13 [Shell] rm recursive
  3. 2018.05.30 [Apache Airflow] 설치 및 간단 테스트
  4. 2018.05.03 [Python] virtualenv 구성 맛보기
  5. 2018.05.02 [Spring Framework] SpringMVC + Gradle 템플릿 + Tomcat 연동
  6. 2018.02.13 [Script] uniq string line print on shell
  7. 2018.01.12 [git] git log stats 보기
  8. 2017.12.22 [GC] 관련 링크 모음
  9. 2017.12.12 [Java] Executors 로 간단 multithread 테스트
  10. 2017.11.29 [Java] JVM monitoring 도구

[Jenkins] Gradle 을 이용한 submodule update 이슈

ITWeb/개발일반 2018. 7. 4. 07:53

Jenkins 에서 Gradle 을 이용한 multi project(submodule) build 시 참고사항

젠킨스 소스 관리영역에서 Additional Behaviours 설정을 추가 해줘야 합니다.


- Advanced sub-modules behaviours

여기서 총 세 가지 항목을 선택 하게 됩니다.


- Recursively update submodules

이 설정은 --recursive 옵션을 사용합니다.


- Update tracking submodules to tip of branch

이 설정은 --remote 옵션을 사용합니다.


- Use credentials from default remote of parent repository

이 설정은 parent project 의 credential 을 사용 한다는 의미 입니다. 


여기서 제가 경험한 문제는 submodule 이 업데이트 되지 않는 문제였습니다.

intellij 에서 Project Update 기능과 비슷하다고 보시면 될 것 같은데요.


이 와 같은 기능을 적용하기 위해서는 위 2번째 옵션을 선택해줘야 합니다.


- Update tracking submodules to tip of branch

이 옵션의 의미는 submodules 의 변경된 내용을 업데이트 하기 위한 것입니다.


참고문서)

https://git-scm.com/docs/git-submodule#git-submodule---remote



:

[Shell] rm recursive

ITWeb/개발일반 2018. 6. 13. 19:08

가끔 필요 할때 기억 안나면 쓰세요.


$ find . -type f -name '파일명' -exec rm {} +

:

[Apache Airflow] 설치 및 간단 테스트

ITWeb/개발일반 2018. 5. 30. 09:35

Airflow 를 정상적으로 사용하기 위해서는 MySQL 과 같은 DB 구성이 되어 있어야 합니다.

(설치 되어 있지 않더라도 기본적인 Hello World 수준의 테스트는 가능 합니다.)


Reference)

https://airflow.apache.org/start.html


$ pip install apache-airflow

or 

$ sudo -H pip install apache-airflow --ignore-installed matplotlib

# initdb 하기 전에 mysql 구성 및 database 생성을 해야 합니다.

$ airflow initdb

$ airflow webserver -p 8080


# MySQL 연결

# The SqlAlchemy connection string to the metadata database.

# SqlAlchemy supports many different database engine, more information

# their website

sql_alchemy_conn = mysql+pymysql://root:000000@localhost/airflow


# MySQL Connection URL Syntax

https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-jdbc-url-format.html

protocol//[hosts][/database][?properties]


# Database 와 Table 에 대한 charset 을 아래와 같이 생성해 줘야 합니다.

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


# 터미널에서 실행하고 결과 확인 하기

$ airflow test airflow_tutorial_v01 print_hello 2018-05-08


import datetime as dt


from airflow import DAG

from airflow.operators.bash_operator import BashOperator

from airflow.operators.python_operator import PythonOperator



def print_world():

    print('world')



default_args = {

    'owner': 'me',

    'start_date': dt.datetime(2017, 6, 1),

    'retries': 1,

    'retry_delay': dt.timedelta(minutes=5),

}



with DAG('airflow_tutorial_v01',

         default_args=default_args,

         schedule_interval='0 * * * *',

         ) as dag:


    print_hello = BashOperator(task_id='print_hello',

                               bash_command='echo "hello"')

    sleep = BashOperator(task_id='sleep',

                         bash_command='sleep 5')

    print_world = PythonOperator(task_id='print_world',

                                 python_callable=print_world)



print_hello >> sleep >> print_world


일부 테스트가 부족한 부분이 있기 때문에 그냥 참고 정도만 하세요.

:

[Python] virtualenv 구성 맛보기

ITWeb/개발일반 2018. 5. 3. 12:07

먼저 무작정 하다 보면 에러 부터 경험 할때가 많이 있습니다.

Anaconda 를 설치 해 놓고 잊고 있었는데 에러 부터 나와서 뭐지 했내요.


python virtualenv 구성 시 아레와 같은 에러 발생시 해결 방법



$ virtualenv venv

New python executable in /Users/xxx/Work/apps/venv/bin/python

Installing setuptools, pip, wheel...

  Complete output from command /Users/xxx/Work/apps/venv/bin/python - setuptools pip wheel:

  Traceback (most recent call last):

  File "<stdin>", line 4, in <module>

  File "/Users/xxx/anaconda2/lib/python2.7/tempfile.py", line 32, in <module>

    import io as _io

  File "/Users/xxx/anaconda2/lib/python2.7/io.py", line 51, in <module>

    import _io

ImportError: dlopen(/Users/xxx/Work/apps/venv/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder

  Referenced from: /Users/xxx/Work/apps/venv/lib/python2.7/lib-dynload/_io.so

  Expected in: flat namespace

 in /Users/xxx/Work/apps/venv/lib/python2.7/lib-dynload/_io.so

----------------------------------------

...Installing setuptools, pip, wheel...done.

Traceback (most recent call last):

  File "/Users/xxx/anaconda2/bin/virtualenv", line 11, in <module>

    sys.exit(main())

  File "/Users/xxx/anaconda2/lib/python2.7/site-packages/virtualenv.py", line 712, in main

    symlink=options.symlink)

  File "/Users/xxx/anaconda2/lib/python2.7/site-packages/virtualenv.py", line 953, in create_environment

    download=download,

  File "/Users/xxx/anaconda2/lib/python2.7/site-packages/virtualenv.py", line 904, in install_wheel

    call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=SCRIPT)

  File "/Users/xxx/anaconda2/lib/python2.7/site-packages/virtualenv.py", line 796, in call_subprocess

    % (cmd_desc, proc.returncode))

OSError: Command /Users/xxx/Work/apps/venv/bin/python - setuptools pip wheel failed with error code 1


Reference)

https://github.com/certbot/certbot/issues/2850


$ pip uninstall virtualenv

$ conda install virtualenv


# 아래와 같이 하면 실행한 위치에 venv 라는 폴더가 생성이 됩니다.

$ virtualenv venv --distribute

New python executable in /Users/xxx/Work/apps/venv/bin/python

copying /Users/xxx/anaconda2/bin/python => /Users/xxx/Work/apps/venv/bin/python

copying /Users/xxx/anaconda2/bin/../lib/libpython2.7.dylib => /Users/xxx/Work/apps/venv/lib/libpython2.7.dylib

Installing setuptools, pip, wheel...done.


# 가상환경 실행

$ source venv/bin/activate

(venv) MacBook-Pro-2:apps xxx$


# 가상환경 빠져나오기

(venv) MacBook-Pro-2:apps xxx$ deactivate


# python 버전별 가상환경 실행

$ virtualenv venv --python=python2.7

or

$ python -m virtualenv venv


$ virtualenv venv --python=python3.6

or

$ python3 -m virtualenv venv


# 가상환경에서 필요한 package 구성 후 설치 모듈을 구성 합니다. (requirements.txt)

$ virtualenv venv2.7 --python=python2.7

Running virtualenv with interpreter /Users/xxx/anaconda2/bin/python2.7

New python executable in /Users/xxx/Work/apps/venv2.7/bin/python2.7

copying /Users/xxx/anaconda2/bin/python2.7 => /Users/xxx/Work/apps/venv2.7/bin/python2.7

copying /Users/xxx/anaconda2/bin/../lib/libpython2.7.dylib => /Users/xxx/Work/apps/venv2.7/lib/libpython2.7.dylib

Also creating executable in /Users/xxx/Work/apps/venv2.7/bin/python

Installing setuptools, pip, wheel...done.

MacBook-Pro-2:apps xxx$ source venv2.7/bin/activate

(venv2.7) MacBook-Pro-2:apps xxx$

(venv2.7) MacBook-Pro-2:apps xxx$ pip install boto3

Collecting boto3

  Downloading https://files.pythonhosted.org/packages/24/ec/7e3c056775ac725b31a7d5d38e6f7f93ac793f50c35a2cd36b4446be426c/boto3-1.7.12-py2.py3-none-any.whl (128kB)

    100% |████████████████████████████████| 133kB 518kB/s

Collecting s3transfer<0.2.0,>=0.1.10 (from boto3)

  Using cached https://files.pythonhosted.org/packages/d7/14/2a0004d487464d120c9fb85313a75cd3d71a7506955be458eebfe19a6b1d/s3transfer-0.1.13-py2.py3-none-any.whl

Collecting jmespath<1.0.0,>=0.7.1 (from boto3)

  Using cached https://files.pythonhosted.org/packages/b7/31/05c8d001f7f87f0f07289a5fc0fc3832e9a57f2dbd4d3b0fee70e0d51365/jmespath-0.9.3-py2.py3-none-any.whl

Collecting botocore<1.11.0,>=1.10.12 (from boto3)

  Downloading https://files.pythonhosted.org/packages/8e/d7/8b4b54f82a1a137f520d8b04f6c7b87b5f4762818100d1f38a0234fbf17c/botocore-1.10.12-py2.py3-none-any.whl (4.2MB)

    100% |████████████████████████████████| 4.2MB 2.6MB/s

Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from s3transfer<0.2.0,>=0.1.10->boto3)

  Downloading https://files.pythonhosted.org/packages/2d/99/b2c4e9d5a30f6471e410a146232b4118e697fa3ffc06d6a65efde84debd0/futures-3.2.0-py2-none-any.whl

Collecting python-dateutil<3.0.0,>=2.1; python_version >= "2.7" (from botocore<1.11.0,>=1.10.12->boto3)

  Downloading https://files.pythonhosted.org/packages/0c/57/19f3a65bcf6d5be570ee8c35a5398496e10a0ddcbc95393b2d17f86aaaf8/python_dateutil-2.7.2-py2.py3-none-any.whl (212kB)

    100% |████████████████████████████████| 215kB 3.8MB/s

Collecting docutils>=0.10 (from botocore<1.11.0,>=1.10.12->boto3)

  Downloading https://files.pythonhosted.org/packages/50/09/c53398e0005b11f7ffb27b7aa720c617aba53be4fb4f4f3f06b9b5c60f28/docutils-0.14-py2-none-any.whl (543kB)

    100% |████████████████████████████████| 552kB 3.8MB/s

Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1; python_version >= "2.7"->botocore<1.11.0,>=1.10.12->boto3)

  Downloading https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl

Installing collected packages: six, python-dateutil, jmespath, docutils, botocore, futures, s3transfer, boto3

Successfully installed boto3-1.7.12 botocore-1.10.12 docutils-0.14 futures-3.2.0 jmespath-0.9.3 python-dateutil-2.7.2 s3transfer-0.1.13 six-1.11.0

(venv2.7) MacBook-Pro-2:apps xxx$ pip freeze > requirements.txt

(venv2.7) MacBook-Pro-2:apps xxx$ deactivate

MacBook-Pro-2:apps xxx$ cat requirements.txt

boto3==1.7.12

botocore==1.10.12

docutils==0.14

futures==3.2.0

jmespath==0.9.3

python-dateutil==2.7.2

s3transfer==0.1.13

six==1.11.0


만들어진 requirements.txt 파일을 가지고 설치는 아래와 같이 하시면 됩니다.


$ pip install -r requirements.txt 

or

$ pip3 install -r requirements.txt 


:

[Spring Framework] SpringMVC + Gradle 템플릿 + Tomcat 연동

ITWeb/개발일반 2018. 5. 2. 18:33

매니저 역할을 오래 하다 보면 개발 감각이 떨어 지는건 어쩔수 없는 일인 것 같습니다.

SpringMVC 를 이용한 기본 웹 개발도 이제는 거북이 수준이 되어 가고 있는 것 같아 잊지 않기 위해 기록해 봅니다.


요즘 워낙 좋은 Tool, IDE 들이 많이 나와 있고. Git 검색만 해봐도 찾던 소스가 너무나도 많이 나옵니다.

아래는 Intellij community 버전을 이용해서 웹프로젝트 템플릿을 생성하는 예제 입니다.


각 단계별 코드별 설명은 작성 하지 않았습니다.

이유는 여긴 제가 그냥 혼자 기록하고 공부하는 공간이고, 누구를 가르치기에 너무 많은 무림고수 들이 계셔서 어쭙잖은 설명은 그냥 아래 레퍼런스로 대신 합니다.


References)

https://github.com/HowookJeong/springmvc-gradle-template

https://tomcat.apache.org/tomcat-9.0-doc/config/context.html

https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#spring-web


Step 1)

Intellij 를 실행 하고 매뉴에서 아래와 같이 선택을 합니다.


File -> New -> Project -> Gradle -> Java -> Next


GroupId -> org.project.web

ArtifactId -> springmvc-gradle-template

Next


Step 2)

SpringMVC Framework 틀을 만들기 위해 필요한 폴더와 파일들을 아래와 같이 생성을 합니다.


2-1) Community 버전으로는 gradle webapp 추가가 안되기 때문에 별도로 생성 합니다.

Make webapp directory

src/main/webapp


2-2) Make WEB-INF directory

src/main/webapps/WEB-INF

web.xml

dispatcher-servlet.xml


2-3) jsp template 사용을 위해서 WEB-INF 아래 jsp 폴더를 생성 합니다.

Make jsp directory

src/main/webapps/WEB-INF/jsp


2-4) Resource 구성을 합니다.

Make resources directory

src/main/resources/beans

bo-bean.xml

dao-bean.xml

src/main/resources/context

applicationContext.xml

applicationContext-mybatis.xml

src/main/resources/mybatis

config.xml

jdbc.properties

src/main/resources/sql

example.xml

log4j.xml


2-5) Package 구성을 합니다.

Make packages

org.project.web.bo

org.project.web.controllor

org.project.web.dao

org.project.web.model


여기까지 하셨으면 기본 empty project 생성은 끝났습니다.

이제 필요한 코드와 설정을 해보도록 하겠습니다.


Step 3)

이제 필요한 코드들을 생성해 보도록 하겠습니다.


3-1) web.xml 설정하기



3-2) dispatcher-servlet.xml 설정하기



3-3) log4j.xml 설정하기



3-4) mybatis/config.xml 설정하기



3-5) mybatis/jdbc.properties 설정하기



3-6) build.gradle 설정하기



이제 application 구현을 위한 코드 생성을 해보겠습니다.


3-7) controller/ExampleController


3-8) bo/ExampleBO


3-9) bo/ExampleBOImpl


3-10) dao/ExampleDAO


3-11dao/ExampleDAOImpl


3-12) model/ExampleModel



코드 구현을 했으니 이제 resources 설정을 하도록 하겠습니다.


3-13) beans/bo-bean.xml


3-14) beans/dao-bean.xml


3-15) context/applicationContext.xml


3-16) context/applicationContext-mybatis.xml


3-17) sql/example.xml


화면 구성을 위한 데코레이션으로 jsp 코드를 작성해 보겠습니다.


3-18) WEB-INF/jsp/exampleView.jsp


:

[Script] uniq string line print on shell

ITWeb/개발일반 2018. 2. 13. 13:26

파일에 id 목록이 들어 있고 여기서 unique 한 id 들만 출력하고 싶을 경우 아래와 같이 사용 하시면 편하게 찾으 실 수 있습니다.


Tips)

$ sort id_list.log | uniq


Ref)

http://www.tutorialspoint.com/unix_commands/sort.htm

http://www.tutorialspoint.com/unix_commands/uniq.htm

:

[git] git log stats 보기

ITWeb/개발일반 2018. 1. 12. 15:45

그냥 제가 보고 싶은 형태로 구성하기 위해 스크립트 만들어 봤습니다.

참고문서)

https://git-scm.com/docs/git-log

https://git-scm.com/docs/pretty-formats


#!/usr/bin/env bash


DAYS_AGO=$1

DATE=`date -v -"$DAYS_AGO"d +%F`

PWD=`pwd`


echo "Date : $DATE" > "git-stats-$DATE.log"

# This script must exist under git repository.


echo "[Commit Statistics]" >> "git-stats-$DATE.log"

# total commit stats

USER_COUNT=`git log --before="$DATE 23:59:59" --after="$DATE 00:00:00" --format='%aN %ce' | sort -u | wc -l`

echo "Total Commit Users : $USER_COUNT" >> "git-stats-$DATE.log"

git log --shortstat --before="$DATE 23:59:59" --after="$DATE 00:00:00" | grep -E "fil(e|es) changed" | awk '{files+=$1; inserted+=$4; deleted+=$6} END {print "files changed: ", files, "lines inserted: ", inserted, "lines deleted: ", deleted }' >> "git-stats-$DATE.log"

echo "" >> "git-stats-$DATE.log"


echo "[Committers]" >> "git-stats-$DATE.log"

# commit user list

git log --before="$DATE 23:59:59" --after="$DATE 00:00:00" --format='%aN %ce' | sort -u >> "git-stats-$DATE.log"

echo "" >> "git-stats-$DATE.log"


echo "[Commit Logs]" >> "git-stats-$DATE.log"

# each user commit stats

git log --before="$DATE 23:59:59" --after="$DATE 00:00:00" --all --pretty=format:'"%an", "%aD", "%s",' --shortstat --no-merges >> "git-stats-$DATE.log"


:

[GC] 관련 링크 모음

ITWeb/개발일반 2017. 12. 22. 12:44
:

[Java] Executors 로 간단 multithread 테스트

ITWeb/개발일반 2017. 12. 12. 11:54

이전 글의 참고 문서들을 먼저 보시면 좋습니다.

http://jjeong.tistory.com/1296

package hello.executors;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class HelloExecutors {

public static class HelloCallableThread implements Callable<Integer> {
int input;

public HelloCallableThread(int input) {
this.input = input;
}

@Override
public Integer call() throws Exception {
return input + 1;
}
}

public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(4);
Set<Callable<Integer>> callables = new HashSet<Callable<Integer>>();

callables.add(new HelloCallableThread(1));
callables.add(new HelloCallableThread(2));
callables.add(new HelloCallableThread(3));
callables.add(new HelloCallableThread(4));

List<Future<Integer>> futures = executorService.invokeAll(callables);

for(Future<Integer> future : futures){
System.out.println("future.get = " + future.get());
}

executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.SECONDS);
}
}


:

[Java] JVM monitoring 도구

ITWeb/개발일반 2017. 11. 29. 10:33


JMX 를 통한 JVM monitoring 도구

$ jvisualvm

실행 후 remote connection 을 하시고 접속 정보는 접속할 host 명과 JMX port 를 넣으시면 됩니다.

Tools -> Plugins 를 선택 하셔서 필요한 plugin 을 몽땅 설치 하시면 편리 합니다.

: