codeigniter 3.x 버전을 설치하기 위한 방법 중 하나로 composer를 활용하였다.
그런데 RuntimeException이 아래와 같이 씨뻘건 경고로 표시됐다.

require-dev.mikey179/vfsStream is invalid, it should not contain uppercase characters. Please use mikey179/vfsstream instead.

mikey179/vfsStream is invalid

구글링하여 https://github.com/TYPO3/Fluid/issues/432 내용을 보고 해결한 문제는
대문자가 포함되면 안된다는 것이다.
composer.json에 설정된 mikey179/vfsStream를  mikey179/vfsstream 으로 수정 후 해결되었다.

해결하고 난 뒤에 깨달은 사실은 경고 문구를 그대로 해석만 해도 해결할 수 있었다는 것이다.

it should not contain uppercase characters. Please use mikey179/vfsstream instead.
대문자를 포함하지 않아야합니다. 대신 mikey179/vfsstream을 사용하십시오.

암튼, 수정된 composer.json 의 내용은 다음과 같다.

        "description": "The CodeIgniter framework",
        "name": "codeigniter/framework",
        "type": "project",
        "homepage": "https://codeigniter.com",
        "license": "MIT",
        "support": {
                "forum": "http://forum.codeigniter.com/",
                "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki",
                "slack": "https://codeigniterchat.slack.com",
                "source": "https://github.com/bcit-ci/CodeIgniter"
        },
        "require": {
                "php": ">=5.3.7"
        },
        "suggest": {
                "paragonie/random_compat": "Provides better randomness in PHP 5.x"
        },
        "require-dev": {
                "mikey179/vfsstream": "1.1.*",
                "phpunit/phpunit": "4.* || 5.*"
        }

 

파이썬 selenium으로 게시물을 자동등록하는 프로그램을 사용 중에
yum 패키지 업데이트후 아래 같이 크롬드라이버 버전이 지원되지 않는 오류가 발생하였다.

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 80

 

처음 개발 당시 selenium이 잘 작동되는 소스 코드를 사용하기 위해
구버전 크롬드라이버를 일부러 다운로드 받아 설치해서 쓰고 있었는데,
패키지 업데이트 중에 해당 드라이버까지 업데이트가 된 것이 문제인 것 같았다.

윈도우 pc에서 사용하는 크롬드라이버라면 크롬브라우저를 설정함으로 해결할 수 있는데,
리눅스 상에서 크롬드라이버라 몇가지 찾아서 확인해야 한다.
현재 리눅스에서 크롬드라이버 버전을 찾아서 적용하던지, 아니면 맞는 버전을 새로 다운로드해야 한다.

// 크롬드라이버를 모두 찾는다.
]# find / -name 'chromedriver'

// 검색된 크롬드라이버들 버전을 확인하여 현재 필요한 버전를 사용한다.
]# /root/.wdm/drivers/chromedriver/linux64/87.0.4280.20/chromedriver --version

// 기존 사용하던 크롬드라이버 경로에 복사해서 사용하면 된다.
]# cp /root/.wdm/drivers/chromedriver/linux64/87.0.4280.20/chromedriver /home/python/

버전이 잘 맞는 크롬드라이버를 찾아서 교체해줬다면 위 에러가 해결된다.

 

참조 : codechacha.com/ko/selenium-chromedriver-version-error/

git에 대용량 파일을 추가하고 관리할 수 있도록 셋팅이 필요하다.
큰 이미지 파일이나 압축된 대용량의 파일이 있을 경우 git을 사용하는데 제한이 생긴다.
git lfs로 용량 제한을 완화시킬 수 있다.

git-lfs rpm 파일을 다운로드 받아 패키지 관리자로 설치하고, git에 설치해서 사용하면 된다.
* 최신 rpm 파일 검색 : github.com/git-lfs/git-lfs/releases

## Ubuntu 리눅스

#] curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
#] sudo apt-get install git-lfs
#] git lfs install
## Mac OSX

#] brew install git-lfs
#] git lfs install
## RHEL/CentOS

#] curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
#] sudo yum install git-lfs
#] git lfs install

사용법은 대상 디렉토리나 파일을 track으로 지정하면 된다.

## my_big_image 디렉토리의 파일을 lfs에 적용한다.
#] git lfs track "my_big_image/*"
 or
## my_big_image 디렉토리 안의 zip 파일을 lfs에 적용한다.
#] git lfs track "my_big_image/*.zip"

## 기존 git사용 방식대로 사용하면 됨.
#] git add .
#] git commit -m "lfs setting"
#] git push -u origin master

 

참조 : github.com/git-lfs/git-lfs

datepicker를 사용하는 등록 폼에서, 편집시에는 datepicker에 등록된 날짜를 변경하지 않도록 방지하고

form으로는 해당 값을 넘기는 방법.

$('input[name=dateBox]').attr("readonly",true);

위 코드는 해당 input box에 키보드 입력을 막고, datepicker만 사용할 수 있도록 한다.

readonly하지 않으면 의도하지 않은 날짜형식이 입력되어 오류를 발생할 수 있다.

$('input[name=dateBox]').datepicker('disable');

datepicker 기능을 차단하고, input box를 지워버린다.

편집 폼에서 사용하면, 원래 있는 값이 삭제되어 등록된 날짜를 변경하지 않도록 하는 기능을 할 수 없다.

 

따라서, 편집 화면에서 등록 폼은 유지하되, 등록된 날짜를 변경하지 않으면 다음과 같이 한다.

$('input[name=dateBox]').datepicker('disable').removeAttr('disabled')

우선 disable로 datepicker 기능을 차단하고, diabled 어트리뷰트를 빼주어 input box 기능을 enable시키는 것이다.

 

 

참조 : blog.naver.com/antimidal/220948493757

리눅스 파일 복사 명령어 cp
서버와 서버간 파일 복사 명령어 scp

# scp <로컬서버 복사할 대상파일or디렉토리> <원격서버 계정>@<원격서버 아이피>:<원격서버 저장할 경로>

# scp ./home/my_file.txt root@123.123.123.123:/home/
# scp <원격서버 계정>@<원격서버 아이피>:<원격서버 복사할 대상파일or디렉토리> <로컬서버 저장할 위치>

# scp -r root@123.123.123.123:/home/ ./home/mydirectory

scp 사용시 유용한 옵션을 소개하자면,

  • -r : 지정한 디렉토리의 하위 디렉토리까지 복사
  • -v : 진행사항 표시
  • -F <설정파일> : 지정한 설정파일을 사용
  • -P <포트> : 지정한 포트로 접속

 

참조 : blog.naver.com/antimidal/80131450823

1. 파일명, 유저, 그룹으로 검색

# find ./ -name "file.txt"    // 현위치 이하에서 file.txt 찾기

# find ./ -name "*html"       // 현위치 이하에서 html로 끝나는 파일 찾기

# find ./ -user "user"        // 현위치 이하에서 소유자가 user인 파일 찾기

# find ./ -group "root"       // 현위치 이하에서 root 그룹인 파일 찾기

# find ./ -newer "file.txt"   // file.txt 보다 늦게 생성된 파일 찾기

 

2. 파일 속 내용 중 검색

// html로 끝나는 파일들 중 search text가 포함된 파일 찾기

# find ./ -name "*.html" | xargs egrep "search text"    

# grep ./ -r "search text"

 

3. 검색 결과 처리

// 현위치 이하에서 파일 내용에 search text가 포함된 파일을 찾아 삭제
# grep ./ -rl "search text" | xargs rm
 
// html으로 끝나고, 파일 내용에 search text가 들어간 파일을 찾아서 result_file.txt 파일에 리스트 저장
# find ./ -name "*.html" | xargs egrep "search text" > result_file.txt

// asp 확장자를 찾아서 확장자를 php로 교체
# find ./ -name "*.asp" -exec rename .asp .php {} \;

// file로 시작하는 txt 파일명 앞에 add_ 를 붙여서 복사본 파일을 생성
# ls file*.txt | xargs -I '{}' cp '{}' 'add_{}'

 

참조: blog.naver.com/antimidal/220041200248

 

[Linux] find 명령 정리

## find 대상경로 옵션 대상1. 파일을 찾기 ## find . -name "myfile.html" ---> 현재 경로 이하에서 my...

blog.naver.com

 

언젠가 한번쯤은 필요한 기능으로,

해당 디렉토리 내에 있는 모든 파일 중 특정한 확장자를 찾아, 확장자를 바꾸는 파이썬 코드이다.

아래 코드를 change.py 파일로 만들어서, 대상 파일들이 있는 디렉토리에 넣고 파이썬을 실행시키면

"mp4" 확장자를 "mp3" 확장자로 변경한다.

 

import glob
import os.path

files = glob.glob("*.mp4")
for x in files:
    if not os.path.isdir(x):
        filename = os.path.splitext(x)
        try:
            os.rename(x,filename[0] + '.mp3')
        except:
            pass

ssh 접속 프로그램 중 기본 중의 기본은 putty!

그러나 Xshell 등 타사 유료 프로그램을 사용하다보면 putty의 단점이 보인다.

세션 관리 어려움, 여러 창 띄울때 탭 지원 안됨.

이런 단점을 완화할 수 있는 SuperPutty를 발견. 역시 무료.

매크로를 등록하면 원격서버 자동 로그인까지 지원하는 강력한 장점이 있음.

더 자세한 설명은 여기서..

https://ttend.tistory.com/23

 

Putty를 강력하고 편리하게 SuperPutty - 탭기능, 디렉토리별 세션관리

PuTTY를 사용해서 여러 세션을 동시에 접속해야 할 경우 화면이 다소 복잡해진다. PuTTy 창 3개를 띄운 화면인데. 노트북을 사용하고 있어서 더 좁아보인다. ㅜㅜ 창 두어개 이상 띄워놓을 일도 많고.. 또 한가지..

ttend.tistory.com

 

단, 자동 로그인을 설정하는데 바로 안되고, 설정에서 한가지 체크해야 할 것이 있음. SuperPutty 공식 깃허브에 질문과 답변이 올라와 있음. 

https://github.com/jimradford/superputty/issues/706

 

SuperPutty stops at password prompt when invoked with command line · Issue #706 · jimradford/superputty

I have consulted the built-in help and have tried to invoke SuperPutty in two different ways. In each case, the remote system is waiting for the password to be supplied. Here are the two different ...

github.com

 

결국은 Tools > Otions > GUI 에서 맨 아래 Security 관련 어쩌구에 체크해주면 됨.

 

그리고 세션 등록 할때 아래와 같이 Login Username 계정을, Extra Putty Argument-pw 패스워드를 등록하면 됨.

 

서버를 어느 나라의 시간대로 운영을 할 것인지 설정함. 

시스템 시간, 로그 저장시간, 크론 도는 시간에 모두 적용됨.


/usr/share/zoneinfo에 있는 리스트 중 원하는 국가명을 선택해서

/etc/localtime 파일에 교체(또는 링크)하면 변경됨.


1. 현재 시간 확인

# date

2018. 09. 11. (화) 10:22:34 KST

2. 상해시간으로 설정

# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

- ln : 링크를 설정함. -s는 심볼릭링크 옵션 , -f는 강제 처리 옵션 (기존에 localtime 파일이 있으면 f옵션이 필요함.)

- 아래처럼 파일을 복사해서 처리해도 됨. '덮어쓰기' 할 것인지 물을때, y

# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

cp: overwrite `/etc/localtime'? y


3. 바뀐 시간 확인 - CST 확인됨.

# date

2018. 09. 11. (화) 09:22:30 CST

4. 한국시간으로 설정

# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

- 아래처럼 파일을 복사해서 처리해도 됨. '덮어쓰기' 할 것인지 물을때, y

# cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

cp: overwrite `/etc/localtime'? y

5. 바뀐 시간 확인 - KST 확인됨.

# date

2018. 09. 11. (화) 10:22:34 KST


참고 : http://gyuha.tistory.com/196



* CentOs7일 경우 아래와 같은 방법으로 처리함.


1. 타임존 리스트 확인

# timedatectl list-timezones

2. 원하는 타임존으로 설정

# timedatectl set-timezone Asia/Seoul

3. 바뀐 타임 확인

# timedatectl

4. 로그와 크론 도는 시간에 새로 바뀐 시간에 적용하기 위해 프로세스 재시작.

# systemctl restart crond

# systemctl restart rsyslog


어느 디비 내의 모든 테이블 정보가 필요할 때가 있다. 디비 스키마 문서화라든지의 경우..


https://dev.mysql.com/doc/mysql-infoschema-excerpt/5.7/en/ 를 참고하여,

INFORMATION_SCHEMA 의 여러 옵션 중에서 다른 건 필요할 때 살펴볼만하고..

TABLES와 COLUMNS가 유용하게 쓰였다.


우선, 디비 내 테이블 정보

-- 현재 선택된 디비의 모든 테이블 정보 조회

SHOW TABLE STATUS;

-- 현재 선택된 디비의 해당 테이블에 대한 정보 조회

SHOW TABLE STATUS WHERE NAME='테이블명';


-- TABLE_SCHEMA에 매칭되는 디비명에 대한 모든 테이블 정보 조회

* 테이블이 많은 경우 주의

SELECT *  FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = '디비명';


-- TABLE_NAME에 매칭되는 테이블명에 대한 테이블 정보 조회

SELECT *  FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_NAME = '테이블명';


테이블의 컬럼 정보

-- 입력된 테이블명에 매칭되는 테이블 컬럼 정보 조회

SHOW FULL COLUMNS FROM 테이블명;


-- TABLE_SCHEMA에 매칭되는 디비명에 대한 모든 테이블 컬럼 정보 조회

* 테이블이 많은 경우 주의

SELECT *  FROM INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_SCHEMA='디비명';


-- TABLE_NAME에 매칭되는 테이블명에 대한 테이블 컬럼 정보 조회

SELECT *  FROM INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_NAME='테이블명';


응용은 알아서..

+ Recent posts