블로그 이미지
훅크선장

카테고리

분류 전체보기 (362)
사진이야기 (23)
펭귄컴퓨팅 (121)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
홈베이킹&홈쿠킹 (2)
잡다한것들 (15)
Total
Today
Yesterday

달력

« » 2024.4
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

공지사항

태그목록

최근에 올라온 글

1. vagrant 설치 : with Brew on Mac OS X 
user@Mac ~ % /bin/bash -c "$(curl -fsSL  https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

user@Mac ~ % brew tap hashicorp/tap
user@Mac ~ % brew install vagrant

※ vagrant 설치 : CentOS 7 Linux
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install vagrant

2. ambari-vagrant git clone
user@Mac ~ % git clone https://github.com/u39kun/ambari-vagrant.git

3. /etc/hosts 호스트 추가(설치할 os 버전 부분만)
user@Mac ~ % cat ambari-vagrant/append-to-etc-hosts.txt
※ vagrant의 모든 호스트가 들어있는 파일로, 여기서는 # centos 7.4 부분만 필요하다.

 

user@Mac ~ % sudo vi /etc/hosts
...
# centos 7.4
192.168.74.101 c7401.ambari.apache.org c7401
192.168.74.102 c7402.ambari.apache.org c7402
192.168.74.103 c7403.ambari.apache.org c7403
192.168.74.104 c7404.ambari.apache.org c7404
192.168.74.105 c7405.ambari.apache.org c7405
192.168.74.106 c7406.ambari.apache.org c7406
192.168.74.107 c7407.ambari.apache.org c7407
192.168.74.108 c7408.ambari.apache.org c7408
192.168.74.109 c7409.ambari.apache.org c7409
192.168.74.110 c7410.ambari.apache.org c7410
...


4. vagrant private key 생성
user@Mac ~ % vagrant ~/.vagrant.d/insecure_private_key

5. pre-configured VM 사용하기 
user@Mac ~ % cd ambari-vagrant/centos7.4/
user@Mac ~ % vi Vagrantfile 

(dev-bootstrap.sh이 있는  line 29  주석 해제)
...

c7401.vm.provision :shell, :path => "dev-bootstrap.sh"

...

6. dev-bootstrap.sh 파일 수정 
※ ambari build 를 위한 적절한 버전의 소프트웨어 사용 설정
user@Mac ~ % vi dev-bootstrap.sh

...
wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.gz
tar zxvf node-v8.11.2-linux-x64.tar.gz
mv node-v8.11.2-linux-x64 /usr/share/node
/usr/share/node/bin/npm install -g brunch
...
wget https://archive.apache.org/dist/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz
tar zxvf apache-maven-3.5.3-bin.tar.gz
mv apache-maven-3.5.3 /usr/share/maven
...


7.VM 생성
user@Mac ~ % cd

user@Mac ~ % cd ambari-vagrant/centos7.4/
user@Mac ~ % cp ~/.vagrant.d/insecure_private_key .
user@Mac ~ % vagrant up c7401

※ vagrant VM을 전체 삭제하려면,
user@Mac ~ % vagrant destroy -f

6.VM 접속
user@Mac ~ % vagrant ssh c7401

7. root 유저로 변환
[vagrant@c7401 ~]$ sudo su -

8. Ambari 2.7.5.0 버전 다운로드 및 mvn 버전 세팅
# wget https://www-eu.apache.org/dist/ambari/ambari-2.7.5/apache-ambari-2.7.5-src.tar.gz
# tar xfvz apache-ambari-2.7.5-src.tar.gz
# cd apache-ambari-2.7.5-src
# mvn versions:set -DnewVersion=2.7.5.0.0
# pushd ambari-metrics
# mvn versions:set -DnewVersion=2.7.5.0.0
# popd

9. Ambari rpm build

1) 개발 패키지 설치 

# yum install python-devel.x86_64

 

2) ambari-admin 폴더의 pom.xml 수정 

# cd ambari-admin/

# vi pom.xml

...

          <nodeVersion>v8.11.2</nodeVersion>
          <npmVersion>5.6.0</npmVersion>

...

# cd ..

 

3) ambari-metrics 폴더의 pom.xml 수정 (line 42-50)

# cd ambari-metrics/

# vi pom.xml

...

    <hbase.tar>https://archive.apache.org/dist/hbase/2.0.2/hbase-2.0.2-bin.tar.gz</hbase.tar>
    <hbase.folder>hbase-2.0.2</hbase.folder>
    <hadoop.tar>https://archive.apache.org/dist/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz</hadoop.tar>
    <hadoop.folder>hadoop-3.1.4</hadoop.folder>
    <hadoop.version>3.1.4</hadoop.version>
    <grafana.folder>grafana-6.7.4</grafana.folder>
    <grafana.tar>https://dl.grafana.com/oss/release/grafana-6.7.4.linux-amd64.tar.gz</grafana.tar>
    <phoenix.tar>https://downloads.apache.org/phoenix/apache-phoenix-5.0.0-HBase-2.0/bin/apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz</phoenix.tar>
    <phoenix.folder>apache-phoenix-5.0.0-HBase-2.0-bin</phoenix.folder>

...

# cd ..

 

4) ambari-metrics/ambari-metrics-timelineservice 폴더의 pom.xml 수정 (line 929)

# cd ambari-metrics/ambari-metrics-timelineservice/

# vi pom.xml

...

 file="${project.build.directory}/embedded/${phoenix.folder}/phoenix-5.0.0-HBase-2.0-server.jar

...

# cd ..


5) Build

# mvn -B clean install rpm:rpm -DnewVersion=2.7.5.0.0 -DbuildNumber=5895e4ed6b30a2da8a90fee2403b6cab91d19972 -DskipTests -Dpython.ver="python >= 2.6" -Drat.numUnapprovedLicenses=600

 

[INFO] Scanning for projects...
...

...

...

[INFO] Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.W4O5wJ
[INFO] + umask 022
[INFO] + cd /root/apache-ambari-2.7.5-src/ambari-infra/ambari-infra-manager-it/target/rpm/ambari-infra-manager-it/BUILD
[INFO] + /usr/bin/rm -rf /root/apache-ambari-2.7.5-src/ambari-infra/ambari-infra-manager-it/target/rpm/ambari-infra-manager-it/buildroot
[INFO] + exit 0
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Ambari Main 2.7.5.0.0 .............................. SUCCESS [  4.795 s]
[INFO] Apache Ambari Project POM .......................... SUCCESS [  0.172 s]
[INFO] Ambari Web ......................................... SUCCESS [ 54.736 s]
[INFO] Ambari Views ....................................... SUCCESS [  2.374 s]
[INFO] Ambari Admin View .................................. SUCCESS [  6.410 s]
[INFO] ambari-utility 1.0.0.0-SNAPSHOT .................... SUCCESS [ 33.500 s]
[INFO] ambari-metrics ..................................... SUCCESS [  1.068 s]
[INFO] Ambari Metrics Common .............................. SUCCESS [  9.894 s]
[INFO] Ambari Metrics Hadoop Sink ......................... SUCCESS [ 10.069 s]
[INFO] Ambari Metrics Flume Sink .......................... SUCCESS [  2.123 s]
[INFO] Ambari Metrics Kafka Sink .......................... SUCCESS [  2.115 s]
[INFO] Ambari Metrics Storm Sink .......................... SUCCESS [  3.453 s]
[INFO] Ambari Metrics Storm Sink (Legacy) ................. SUCCESS [  3.210 s]
[INFO] Ambari Metrics Collector ........................... SUCCESS [07:29 min]
[INFO] Ambari Metrics Monitor ............................. SUCCESS [  2.178 s]
[INFO] Ambari Metrics Grafana ............................. SUCCESS [  9.604 s]
[INFO] Ambari Metrics Host Aggregator ..................... SUCCESS [ 22.365 s]
[INFO] Ambari Metrics Assembly ............................ SUCCESS [03:35 min]
[INFO] Ambari Service Advisor 1.0.0.0-SNAPSHOT ............ SUCCESS [ 27.628 s]
[INFO] Ambari Server ...................................... SUCCESS [  01:15 h]
[INFO] Ambari Functional Tests ............................ SUCCESS [  2.111 s]
[INFO] Ambari Agent ....................................... SUCCESS [-58.-229 s]
[INFO] ambari-logsearch ................................... SUCCESS [  1.735 s]
[INFO] Ambari Logsearch Appender .......................... SUCCESS [  4.152 s]
[INFO] Ambari Logsearch Config Api ........................ SUCCESS [  0.403 s]
[INFO] Ambari Logsearch Config JSON ....................... SUCCESS [  0.398 s]
[INFO] Ambari Logsearch Config Solr ....................... SUCCESS [ 12.952 s]
[INFO] Ambari Logsearch Config Zookeeper .................. SUCCESS [  1.690 s]
[INFO] Ambari Logsearch Config Local ...................... SUCCESS [  0.197 s]
[INFO] Ambari Logsearch Log Feeder Plugin Api ............. SUCCESS [  9.075 s]
[INFO] Ambari Logsearch Log Feeder Container Registry ..... SUCCESS [  9.950 s]
[INFO] Ambari Logsearch Log Feeder ........................ SUCCESS [01:01 min]
[INFO] Ambari Logsearch Web ............................... SUCCESS [01:14 min]
[INFO] Ambari Logsearch Server ............................ SUCCESS [  02:27 h]
[INFO] Ambari Logsearch Assembly .......................... SUCCESS [  4.325 s]
[INFO] Ambari Logsearch Integration Test .................. SUCCESS [02:39 min]
[INFO] ambari-infra ....................................... SUCCESS [  1.036 s]
[INFO] Ambari Infra Solr Client ........................... SUCCESS [ 12.429 s]
[INFO] Ambari Infra Solr Plugin ........................... SUCCESS [ 29.353 s]
[INFO] Ambari Infra Manager ............................... SUCCESS [01:34 min]
[INFO] Ambari Infra Assembly .............................. SUCCESS [  1.477 s]
[INFO] Ambari Infra Manager Integration Tests 2.7.5.0.0 ... SUCCESS [ 51.914 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:53 h
[INFO] Finished at: 2021-06-30T04:58:54Z
[INFO] ------------------------------------------------------------------------

Posted by 훅크선장
, |

참고 : https://linuxize.com/post/how-to-setup-ssh-tunneling/

 

SSH 접속이 가능한 SSHD 서버를 원격에 가지고 있다면, 그 SSHD 서버를 이용하여 다양한 네트워크 서비스를 이용할 수 있다. 쉽게 말하면, SSHD 서버가 있다면 그 서버가 속해 있는 네트워크에 어떤 포트로든 접속할 수 있고, SSHD 서버를 통하여 현재 내가 접속한 네트워크에도 트래픽을 가져올 수도 있다. 가장 이해하기 쉬운 예제를 들면, 방화벽이 가로막고 있더라도 SSHD 서버에만 접속할 수 있다면, 어떤 포트 번호를 사용하는 네트워크 통신이든 연결시킬 수 있다. 

 

SSH Tunneling은 총 세 가지 방식이 있는데, 아마 대부분은 접속을 시작하는 컴퓨터가 SSH 클라이언트이기 때문에, 아래의 세 가지 방식 중에서 Local Port Forwarding과 Dynamic Port Forwarding을 주로 이용하게 될 것이다. 단순하게 한 두개의 포트를 사용하는 서비스를 이용한다면 Local Port Forwarding이면 충분하고, SSHD 서버를 마치 Proxy 서버 같이 쓰고 싶다면 Dynamic Port Forwarding을 사용하면 된다.

 

1. Local Port Forwarding

여기서 Local 이라는 단어의 의미는 현재 접속을 시작한 컴퓨터(SSH 명령어를 실행한 컴퓨터)에 포트가 열리고, 그 포트를 접속하면 원격에 있는 SSHD 서버를 통하여 SSHD 서버가 있는 네트워크의 포트로 통신이 연결된다는 의미이다.

즉,  “현재 컴퓨터의 열린 포트번호 -> SSHD 서버 -> 목적지 서버의 포트번호”의 연결이 이루어진다.

ssh 명령어는 다음과 같은 형식인데, 

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

 

  • [LOCAL_IP:]LOCAL_PORT - 현재 컴퓨터(Local)의 IP 주소와 포트 번호이다.  LOCAL_IP를 지정하지 않으면, 현재 컴퓨터의 모든 IP주소와 연결된다. LOCAL_IP는 특별한 경우가 아니면 지정하지 않는다.
  • DESTINATION:DESTINATION_PORT - 최종 목적지의  호스트명 또는  IP 주소와 포트번호를 지칭한다. 만약 SSHD 서버의 특정 포트 번호가 목적지라면, DESTINATION에는 localhost 또는 127.0.01 이라고 쓰면 된다. ※주목할 점은 여기서 localhost는 SSHD 서버 자체를 의미한다는 것이다. (현재 컴퓨터인  LOCAL 과 구분해야 한다.)
  • [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다. 
  • 만약에 원격 SSHD 서버의 ssh 서비스 포트가 22번이 아니라면, 명령어에 -p 옵션과 ssh 서비스 포트번호를 지정하여야 한다.

 

예제로 들면, 공인 IP주소 167.136.64.2 인 SSHD 서버가 연결되어 있는 내부망에 IP주소가 192.168.100.20인 웹 서버가 포트번호 7000번에 동작하고 있다면, 현재 컴퓨터 클라이언트에서는 그 내부망 웹 서버에 바로 접속할 수 없지만, 다음의 명령어를 통해서 현재 컴퓨터의 8080번 포트를 열고, SSHD 서버를 거쳐 내부망 웹서버의 7000번 포트에 연결할 수 있다.

ssh  -L  8080:192.168.100.20:7000  user@167.136.64.2  

정상적인 접속이 된다면, SSH 연결화면에서 쉘 명령어도 입력할 수 있다. 

접속화면 없이, 터널링(포트 포워딩)만을 실행하고자 한다면 다음과 같이 -N -f 옵션을 추가할 수도 있다. 

ssh  -L  8080:192.168.100.20:7000  -N  -f user@167.136.64.2  

  • -f 는 ssh 명령어의 백그라운드 실행을 의미
  • -N 은 ssh 접속화면, 쉘 프롬프트 화면이 없는 것을 의미

 

ssh 명령어가 실행되고, 접속이 정상적이라면

현재 컴퓨터에서 웹브라우저를 띄우고, http://127.0.0.1:8080 으로 접속하면, 바로 원격 내부망에 있는 http://192.168.100.20:7000 에 접속한 것과 동일한 화면이 나타날 것이다.

 

2.  Remote Port Forwarding

여기서 Remote 라는 의미는 원격에 있는 SSHD 서버쪽에 포트를 여는 것이다. 즉 이 방식은 앞에 설명한 Local Port Forwarding과 완전히 반대 개념으로, SSHD 서버쪽 포트번호로 들어오는 연결을 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크의 특정 포트번호로 이어주는 것이다. SSH 클라이언트인 현재 컴퓨터로 원격 SSHD 서버쪽의 네트워크 연결이 들어오는 개념으로 Local Port Forwarding과 비교해서 네트워크 전송 방향이 반대라고 생각하면 된다.

Remote Port Forwarding은 우선 SSHD 서버 쪽의 설정이 필요하다.

sshd_config 파일에서 AllowTcpForwarding과 GatewayPorts, 두 개의 옵션을 활성화 해야 한다.

일반적인 Linux 서버에서 /etc/ssh/sshd_config 파일에는 다음과 같이 옵션이 주석으로 설정되어 있는데,

...

#AllowTcpForwarding yes

#GatewayPorts no

...

Remote Port Forwarding이 가능하게 하려면, 다음과 같이 바꿔서 옵션을 활성화해야만 한다.

...

AllowTcpForwarding yes

GatewayPorts yes

...

옵션이 바뀌었으면, SSHD 서비스를 재시작해야만 한다.

systemctl restart sshd  또는 service sshd restart   명령어를 root 권한으로 실행한다.

 

Remote Port Forwarding은  “SSHD 서버의 열린 포트번호 -> 현재 컴퓨터(SSH 클라이언트) -> 목적지 서버의 포트번호”의 연결이 이루어진다. 여기서 목적지 서버란 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 존재하는 서버를 말한다. Remote Port Forwarding에서 최종 목적지는 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 있는 것이며, Local Port Forwarding 과 왜 반대라고 하는 지를 이해할 것이라고 본다. Local Port Forwarding에서는 목적지 서버가 SSHD 서버의 연결된 네트워크에 존재한다.

 

ssh 명령어는 다음과 같은 형식인데, 

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER Copy

  • [REMOTE:]REMOTE_PORT - SSHD 서버의 IP 주소와 포트 번호, REMOTE가 지정되지 않으면, SSHD 서버가 가지는 모든 IP주소와 연결될 수 있다는 의미이다. 실제 특별한 경우가 아니면 REMOTE를 지정할 필요가 없다.
  • DESTINATION:DESTINATION_PORT - 최종 목적지의  호스트명 또는  IP 주소와 포트번호를 지칭한다. 최종 목적지는 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 존재해야 한다.
  • [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다. 
  • 만약에 원격 SSHD 서버의 ssh 서비스 포트가 22번이 아니라면, 명령어에 -p 옵션과 ssh 서비스 포트번호를 지정하여야 한다.

 

예제로 들면, 현재 컴퓨터(SSH 클라이언트)가 존재하는 유무선공유기 내부망에 IP주소 172.16.8.1 이라는 웹서버가 8000번 포트로 웹 서비스를 하고 있는데, 67.136.64.2 인 SSHD 서버가 연결되어 있는 내부망에서 SSHD 서버의 5000번 포트를 통하여 웹서비스에 접속하고 싶다면 다음의 명령어를 실행한다.

SSHD 서버가 연결되어 있는 내부망에 존재하는 어떤 컴퓨터에서 현재 컴퓨터(SSH 클라이언트)가 존재하는 유무선공유기 내부망에 접속하는 상황이 그리 많지는 않겠지만, 이런 통신 연결도 가능하다는 것을 보여주는 예제이다.

ssh  -R  5000:172.16.8.1:8000  user@167.136.64.2

정상적인 접속이 된다면, SSH 연결화면에서 쉘 명령어도 입력할 수 있다. 

접속화면 없이, 터널링(포트 포워딩)만을 실행하고자 한다면 다음과 같이 -N -f 옵션을 추가할 수도 있다. 

ssh  -R  5000:172.16.8.1:8000  -N -f user@167.136.64.2

※ 네트워크 연결이 반대로 이루어지므로,  [SSHD 서버에 열릴 포트번호]:[현재 SSH 클라이언트가 속한 네트워크내의 최종 목적지 서버 IP]:[최종 목적 포트번호] 의 순서를 잘 기억해야 한다.

 

3. Dynamic Port Forwarding

Dynamic Port Forwarding은 Local Port Forwarding과 유사한 네트워크 연결을 구성한다. 그러나 하나의 포트 번호와 하나의 포트 번호를 연결하는 것이 아니라, SOCKS Proxy 서버와 같이 동작하여 단일 포트를 접속하는 것이 아니라, 모든 포트 번호를 지원한다.

실제로 SOCKS Proxy 서비스를 위한 서비스 포트만 지정되고, SOCKS Proxy가 동작하면 어떤 목적지 포트 번호이든 사용할 수 있다.

 

ssh 명령어는 다음과 같은 형식이다. 

ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

  • [LOCAL_IP:]LOCAL_PORT - 현재 컴퓨터(Local)의 IP 주소와 포트 번호이다.  LOCAL_IP를 지정하지 않으면, 현재 컴퓨터의 모든 IP주소와 연결된다. LOCAL_IP는 특별한 경우가 아니면 지정하지 않는다.
  • [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다.

 

예제로 들면, 공인 IP주소 167.136.64.2 인 SSHD 서버가 연결되어 있는 네트워크 내부망으로 연결가능한 SOCKS Proxy server를 현재 컴퓨터(SSH 클라이언트)의 8080번 포트로 구성하는 명령어는 다음과 같다.

ssh  -D  8080  -N  -f user@167.136.64.2  

 

이제는 현재 컴퓨터(SSH 클라이언트)에 구성된 SOCKS Proxy  서비스 8080번 포트를 통하면, 바로 SSHD 서버가 연결되어 있는 모든 내부망 네트워크로 접속할 수 있다는 것이다.

 

SOCKS Proxy 서비스를 이용하려면, 사용하려면 서비스 클라이언트 프로그램, 일반적으로 웹 브라우저에서 SOCKS Proxy 설정을 해주면 가능하다. SOCKS Proxy 설정은 간단하니, 인터넷에서 검색해서 찾아서 설정하기를 바란다.

현재 컴퓨터(SSH 클라이언트)에서 SOCKS Proxy 서버의 IP 주소는 127.0.0.1 그리고 포트번호는 앞에서 -D 옵션으로 지정한 8080을 넣어주면 된다.

다음의 링크에서 여러 클라이언트 프로그램에서의 SOCKS Proxy 설정을 참고하기 바란다.

https://websetnet.net/ko/how-to-use-windows-10-socks5-proxy-settings/

 

 

Posted by 훅크선장
, |

참조 1: www.programmersought.com/article/36393758843/
참조 2: stackoverflow.com/questions/47031394/scrapy-file-download-how-to-use-custom-filename
https:stackoverflow.com/questions/54737465/unable-to-rename-downloaded-images-through-pipelines-without-the-usage-of-item-p/54741148#54741148
참조 3: docs.scrapy.org/en/latest/topics/media-pipeline.html
참조 4: coderecode.com/download-files-scrapy/
참조 5: heodolf.tistory.com/19

www.hanumoka.net/2020/07/11/python-20200711-python-scrapy-selenium/

iosroid.tistory.com/28

 

scrapy 프로젝트를 생성하고 나서, 다음의 과정을 수행한다.

$ scrapy startproject apt_collection

$ scrapy genspider -t basic reports_spider github.com

 

 

1. items.py 파일에 아이템을 추가한다.
디폴트로 생성되어 있는 아이템 클래스를 그대로 이용할 수도 있고, 새로운 아이템 클래스를 생성해도 된다.
보통 디폴트 아이템 클래스는 아무것도 없다.

class AptCollectionItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

    pass

 

그래서, 새로운 아이템 클래스를 생성한다.
반드시 필요한 항목은 files와 file_urls 이다. 
일반파일을 다운로드하려면 FilesPipeline을 이용하는 것이고, 이미지 파일을 다운로드 하려면 ImagesPipeline을 이용하는 것이다.
현재는 일반파일을 다운로드 하는 것이므로, 아래는 FilesPipeline을 이용하는 경우를 설명한다.

class reportItem(scrapy.Item):
    title = scrapy.Field()   # 제목
    date = scrapy.Field()  # 날짜
    publisher = scrapy.Field()  # 작성회사명
    url = scrapy.Field() # 원본 URL
    files = scrapy.Field() # file_urls에 지정된 파일들에 대한 다운로드 결과가 저장되는 항목으로, 파일 1개에 대해서, url, path, checksum, status 가  dictionary 형태로 저장된다. ex) [{'url': 'http://.....', 'path': 'abcdefg.pdf', 'checksum': '2f88dd877d61e287fc1135a7ec0a2fa5', 'status': 'downloaded'}]

    file_urls = scrapy.Field()  # URL을 기준으로 scrapy가 다운로드 저장할 파일의 목록 ※ 반드시 List 자료형으로 넘겨줘야 함!!

 

files와 file_urls를 scrapy.Field()로 정의하면 된다.

※ files와 file_urls 이름을 바꾸고 싶다면,  settings.py에서 아래와 같이 정의하면 된다.

#DEFAULT_FILES_URLS_FIELD = 'file_urls'
#DEFAULT_FILES_RESULT_FIELD = 'files'

ImagesPipeline을 이용하는 경우라면, images와 image_urls 명칭을 사용한다.

    image_urls = scrapy.Field()

    images = scrapy.Field()

 

images와 image_urls 명칭을 바꾸고 싶다면, settings.py에서 아래와 같이 정의하면 된다.
IMAGES_URLS_FIELD = 'field_name_for_your_images_urls'
IMAGES_RESULT_FIELD = 'field_name_for_your_processed_images'

 

2. settings.py에 있는 ITEM_PIPELINES 설정을 해준다.

robots.txt 방어가 있을 수 있으니, 

ROBOTSTXT_OBEY = False

로, 설정을 바꾸는 것을 잊지 않도록 한다.


디폴트의 ITEM_PIPELINES은 다음과 같다.
#ITEM_PIPELINES = 

#    'apt_collection.pipelines.AptCollectionPipeline': 300,
#}

또는,

ITEM_PIPELINES = {

        'scrapy.pipelines.images.ImagesPipeline': 1,

        'scrapy.pipelines.files.FilesPipeline': 1,

}

이렇게 되어 있을 것인데, 이를 파일을 다운로드하도록, 바꾸어줘야 한다. 

ITEM_PIPELINES = {

        'apt_collection.pipelines.AptCollectionPipeline': 1

}

FILES_STORE = r'./download' # 파일이 저장되는 경로를 지정

이런 식으로 바꾸던가, 아니면, 

ITEM_PIPELINES = {

         'my.pipelines.MyFilesPipeline': 200,

         'scrapy.pipelines.files.FilesPipeline': None,

}

기존에 있는 FilesPipeline 들은 모두 None 처리해주거나, 아예 지우는 것이 매우 중요하다.
FILES_STORE 변수를 지정해서, 다운로드 되는 파일들이 저장되는 경로를 지정할 수 있다. 항상 하는 것이 좋다.

3. pipelines.py에 있는 파이프라인을 재정의한다.
디폴트로 생성되는 파이프라인은 다음과 같이 되어 있다.

class AptCollectionPipeline:
    def process_item(self, item, spider):

        return item
    
이것을 다음과 같이, FilesPipeline 이나 ImagesPipeline 을 가지도록 다시 써야한다.
Class 라인에서 Pipeline 클래스 이름 옆에 반드시 (FilesPipeline)이나 (ImagesPipeline) 구문이 추가되어야 한다.
FilesPipeline과 ImagesPipeline 모듈 임포트도 해준다.

from scrapy.pipelines.files import FilesPipeline
from scrapy.pipelines.files import ImagesPipeline

class AptCollectionPipeline(FilesPipeline):
    # 디폴트 처리를 주석처리하고, 파일명을 정해진 규칙대로 지정하기 위한 Override 함수 정의
    def file_path(self, request, response=None, info=None, *, item=None):
        file_name: str = request.url.split("/")[-1] # 파일 수집 URL에 파일명이 있는 경우에는 URL 에서 파일명을 추출해서 사용

        #file_name : str = request.meta['filename'] # 메타 정보를 이용하여, 이전 request 함수에서 파일명을 전달받은 수 있음

        #file_name: str = item['filename']  # 추출되는 Item의 항목에 별도의 파일명을 지정할 수 있다면, 그 파일명을 가져와, 저장하는 파일 이름으로 사용 가능(파일의 저장 경로는 settings.py에 설정되어 있음!)
        # print("filename :  ", file_name)
        return file_name

Pipeline을 재정의하면서, 반드시 필요한 파일명 지정에 대한 함수를 Override 하게 해야 한다.

파일명을 spider 함수쪽에서 item 항목으로 전달하거나, 또는 meta 항목에 넣어서 전달할 수도 있다.
아니면, request.url 쪽의 내용을 파싱해서 사용하는 방법도 있다.
또는, 다운로드 대상 파일 URL을 수집요청하는 호출 쪽에서 meta 값을 다음과 같이 정의해서 넘겨주면 된다.

        meta = {'filename': item['name']}
        yield Request(url=file_url, meta=meta)

 

※ get_media_requests 함수도 Override 해야한다는 의견도 있는데, 확인해보니 각 Item에 수집되는 파일이 1개 인 경우에는 아무 상관이 없었다. 또한 한 Item에서 수집되는 파일이 여러개이더라도, 파일명을 위의 file_path 함수에서와 같이 url로부터 추출되는 경우라면 이상이 없었다. 그러나 한 Item에서 여러개의 파일이 수집되어야 하고, 파일명을 별도로 지정해야 하는 경우에는 get_media_requests 함수에서 파일명을 file_path로 넘겨줘야만 하므로, 다음과 같이  get_media_requests 함수를 재정의해서 추가해야 한다. 
※ v2.3 버전에서는 item 이 파이프라인으로 정상적으로 넘어오지 않는 것 같은 현상이 있다. get_media_requests 함수를 반드시 정의해서 meta 값을 Request 인자로 사용해야만 했다. v2.4에서는 get_media_requests 함수가 없이 file_path 만 재 정의하여도 잘 동작하였다.
  def get_media_requests(self, item, info):
      for idx, file_url in enumerate(item['file_urls']):  # 수집되어야할 파일들의 URL은 반드시 List 자료형으로 입력된다.
     #print("filename : ", item['file_names'][idx])
     yield scrapy.Request(file_url, meta={'filename': item['file_names'][idx]}) # 각각 다운받을 파일  URL에 대한 요청을 하면서, meta 딕셔너리 값의 하나로 파일명 리스트에서 순번에 맞게 파일명을 넘겨준다. 이것때문에 이 함수를 재정의하였다.

        
※ 파일이 다운로드 되고나서, 처리를 해주는 함수도 있다. (아마 파일이 정상적이지 않은지 확인하는 방법으로 유용할 듯 하다.)
from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem

 

def item_completed(self, results, item, info):
    file_paths = [x['path'] for ok, x in results if ok]
    if not file_paths:
        raise DropItem("Item contains no files")
    adapter = ItemAdapter(item)
    adapter['file_paths'] = file_paths
    return item
    
4. spider 함수에서 item을 생성하면, Scrapy에 의해 파일이 자동으로 수집된다.

            item['file_urls'] = [url_1, url_2, url_3] # URL을 기준으로 scrapy가 다운로드 저장할 파일의 목록 ※ 반드시 List 자료형으로 넘겨줘야 함!!
            yield item

 

5. 만약 crawl 하는 과정에서 파일 다운로드가 되지 않고, 302 에러가 발생한다면, 파일 다운로드 URL이 redirect되는 경우이므로, 

settings.py 파일안에, 아래의 변수를 추가하면 해결된다.

 

MEDIA_ALLOW_REDIRECTS = True

Posted by 훅크선장
, |

www.nxp.com/design/software/development-software/codewarrior-development-tools/run-control-devices/codewarrior-tap:CW_TAP

 

CodeWarrior® TAP | NXP

Distributor Name Region Inventory Inventory Date Upon selection of a preferred distributor, you will be directed to their web site to place and service your order. Please be aware that distributors are independent businesses and set their own prices, terms

www.nxp.com

NXP 사의 JTAG Debugger인 CodeWarrior TAP 장비에는 반드시 케이블을 연결해야만, 장비 디버깅이 가능하다.

왜냐하면, CodeWarrior TAP 장비에 연결포트는 30pin 이고, 우리가 일반적인으로 보고 있는 디버깅 대상 장비(표준 개발 장비)는 보통 20pin 이나 16pin과 같은 표준 JTAG 포트를 쓰기 때문이다.

무슨 이유인지 몰라도, CodeWarrior TAP  장비의 전용 케이블들은 본 장비와 별도로 구매해야 하고, 가격도 70달러 즈음이라 안 살 수가 없다는 것이 날벼락이다.

 

표준 JTAG 포트와 같이 pin map을 알려주면, JTAG 포트가 표준이 아닌 장비에도 JTAG 케이블 없이 바로 장비 포트에 연결해서 사용할 있을 것 같은데... 케이블 팔아서 부자되려고 하는지? 30pin의 pin map을 공개하지 않고 있다. (아무리 찾아봐도 안보인다!!) 

 

결국 NXP가 판매하는 전용 케이블, 16pin JTAG 케이블인 CWH-CTP-COP-YE 를 구해서, Pin Map을 그려보았다.

www.nxp.com/design/software/development-software/codewarrior-development-tools/run-control-devices/power-architecture-processor-cop-probe-tips-for-codewarrior-tap:CWH-CTP-COP-YE

 

Pin Map of CWH-CTP-COP-YE :

Posted by 훅크선장
, |

[재료]

양파 1/2, 대파 1/2, 샐러리 1/2, 파프리카 1/2

마늘 6, (다진마늘 1 스푼), 청양고추 1, 

포두부 3, 닭가슴살 150g

숙주 120g, 달걀 1, 레몬즙 약간만

 

멸치액젓 1Ts, 간장 1/2Ts, 굴소스 1Ts, 3Ts , 설탕 2ts

 

  1. 양파, 대파, 샐러리, 파프리카를 얇게 썰어준다.
  2. 닭가슴살도 얇게 썰어준다. 소금과 후추로 약간 간을 해둔다.
  3. 마늘을 얇게 편썰기하고, 청양고추도 얇게 썰어준다.
  4. 포두부를 끝부터 말아서, 썬다. 그리고 손으로 각각 풀어준다.
  5. 물에 소금 약간을 넣고, 포두부를 조금씩 풀어서 넣어주고 30초간 데친다. (건져서 찬물로 씻어두면 식감이 좋다고 하는데안해봤다.)
  6. 양념장을 만든다. 청양고추 것을 넣어둔다.
  7. 양파, 샐러리, 대판, 파프리카를 기름에 볶는다. 숨이 죽을때까지, 굽듯이 충분히 볶아준다.
  8. 야채에 윤기가 나기 시작하면, 마늘을 넣어준다. (다진 마늘 스푼을 추가해도 좋다~) ※ 마늘의 전분때문에 타지 않도록 눌러붙지 않도록 하기 위해서 나중에 넣는다.
  9. 닭가슴살을 넣고 굽듯이 한쪽이 완전히 익을때까지 두었다가 뒤집는다.
  10. 양념장을 넣고 끓인다.
  11. 건두부 데친 물을 1국자 넣어서, 국물이 졸이게 중불이하로 서서히 끓인다.
  12. 다른 팬에 기름을 살짝 두르고, 숙주를 살짝만 볶아준다. 소금과 후추를 살짝 추가한다.
  13. 데친 숙주를 덜어내고, 계란을 볶는다.
  14. 계란은 살짝 익으면, 전체를 저어주어 스크램블 형태로 만들고, 불을 끄고 잔불로만 나머지를 살짝 익힌다.
  15. 포두부를 넣고, 비빈다. 이때 국물이 너무 없다면, 포두부 데친 물을 넣고 강한 불로 끓여준다. 
  16. 마지막에 레몬즙 살짝 투하 (없어도 상관없어요.)
  17. 접시에 포두부 볶음을 담고, 위에 데친 숙주와 주변부에 스크램블된 달걀을 배치한다.

국물의 점도를 유지하는 것이 중요함~~!!

Posted by 훅크선장
, |

[재료]

두부 100g 

청양고추 1 

홍고추 1 

고추기름 2Ts 

다진 마늘 1Ts 

두반장 1Ts 

굴소스 1/2Ts

추가 : 양파 반개와 대파 반개를 썰어서 넣는게 좋다.

 

 

1. 건두부는 썰어 뜨거운 물에 데쳐 찬물에 씻어 물기를 제거한다.

2. 청양고추, 홍고추는 어슷 썰어 준다.

3. 프라이팬에 고추기름, 다진 마늘을 넣고 볶는다.

4. 마늘의 향이 나면, 건두부와 고추를 넣는다.

건두부 넣기전에, 양파와 대파도 같이 넣고 볶아준 다음에, 

    건두부와 고추를 넣는다.

5. 두반장, 굴소스를 넣고 볶는다.

 

-주의사항

* 간이 조금 강할 수도 있어서 두반장은 절반만 먼저 넣으세요.

Posted by 훅크선장
, |

Arduino에 비해, 성능이 훨씬 낫다고 하는 ESP32를 배워보고 있다.

참고할만한 정보를 모아봤다.

 

1. 맥에서 프로그래밍 환경 설정

docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/macos-setup.html#install-prerequisites

 

Standard Setup of Toolchain for Mac OS - ESP32 - — ESP-IDF Programming Guide latest documentation

© Copyright 2016 - 2020, Espressif Systems (Shanghai) CO., LTD

docs.espressif.com

2. ESP32로 IoT 장치를 만드는 정보가 모아진 곳 

esp32.net/

 

The Internet of Things with ESP32

Created by Espressif Systems, ESP32 is a low-cost, low-power system on a chip (SoC) series with Wi-Fi & dual-mode Bluetooth capabilities! The ESP32 family includes the chips ESP32-D0WDQ6 (and ESP32-D0WD), ESP32-D2WD, ESP32-S0WD, and the system in package (

esp32.net

3. ESP32 개발보드 공부를 시작하기 좋은 곳 

randomnerdtutorials.com/getting-started-with-esp32/

 

Getting Started with the ESP32 Development Board | Random Nerd Tutorials

This is a getting started guide for the ESP32 Development board. The ESP32 is the ESP8266 sucessor. Loaded with new features: WiFi, Bluetooth, dual core, ...

randomnerdtutorials.com

4. ESP32에서 별도의 UART 송수신 예제인 UART_ECHO 실험을 할때, 문제가 되는 부분인 가상 에뮬레이터 설정에 관련된 내용이 맞게 쓰여진 참고 사이트 (일본어)

tech.yoshimax.net/archives/107

 

[ESP32-EVB][esp-idf][UART] サンプルの uart_echo を試してみる – yoshimax::tech

ESP32-EVBを使って、esp-idfのuart_echoサンプルを試してみたいと思います。 esp-idf/examples/peripherals/uart_echo/main/uart_echo_example_main.c サンプルをコピーします $ cp -r esp-idf/examples/peripherals/uart_echo ./ $ cp -r

tech.yoshimax.net

5. ESP32 교육을 듣게된 계기가 된 온라인 워크숍의  자료 공유 장소인 밴드 

band.us/band/80474328/attachment

 

(온라인 워크숍) ESP32 (초급+중급 과정) | 밴드

밴드는 그룹 멤버와 함께 하는 공간입니다. 동호회, 스터디, 주제별 모임을 밴드로 시작하세요.

band.us

6. 실습에 사용된 ESP32보드와 센서 쉴드 구매한 곳 

mechasolution.com/shop/goods/goods_view.php?goodsno=577245&category=

mechasolution.com/shop/goods/goods_view.php?goodsno=583929&category=

(센서 쉴드만 사면 된다. 코어보드 살 필요 없다!!)

 

전자부품 전문 쇼핑몰 메카솔루션입니다.

국내 최대 전자부품 쇼핑몰, 아두이노 키트, 라즈베리파이 등 당일발송, 예제 제공, 쇼핑 그 이상을 제공합니다.

mechasolution.com

 

Posted by 훅크선장
, |

이미 유·무선공유기가 존재하는 환경에서 특정한 이유로 무선 접속 반경을 넓혀야만 하는 경우가 종종 발생한다. 

※ 대표적으로 아파트에서 거실에 있는 유·무선공유기의 무선신호가 화장실등에 특정지역에서 너무 속도가 안나오는 상황!

 

인터넷 회선을 이미 공유해서, 하나의 유·무선공유기로 사용하고 있는데, 무선 접속 반경을 넓히는 방법은 두 가지가 있다.

1) 무선 신호를 중계해주는 Wireless Extender 등을 사용하는 방법

   - Wireless Extender, WiFi Range Extender, Wifi repeater 등의 이름으로 불리는 장비를 하나 사면 된다. 

   - 가격이 비싸지 않고, 손쉽게 무선 접속 반경을 늘릴 수 있다. 전기만 있으면 되므로, 아주 편리한 방법이다.

   - 무선 장치의 특성으로, 거리 제한이 있고 유선에 비해서 속도가 떨어지고 동시접속의 한계가 존재한다. (일반 개인의 가정에서는 신경쓸 필요가 없는 단점이다!)

※ 일반 가정의 경우에는 그냥 1번 방법을 추천한다. 2번은 소규모 사업장이나 정말 속도에 목매는 사람에게만 권장한다. 

2) 유선 연결이 가능한 또다른 공유기(구형 모델이더라도 가능)를 가지고 Dumb AP(또는  Bridged AP)로 만들어서, 유선과 무선 네트워크를 모두 확장하는 방법 

   - 집에서 놀고 있는 구형 공유기를 가지고, 네트워크를 공부할 수 있는 좋은 사례가 된다?!

   - 유선 네트워크와 무선 네트워크 둘 다를 확장할 수 있으며, 네트워크 속도가 단순 무선 확장방식(1번 방법)보다는 빠르다.

   - 유선이 연결되는 거리안에서 자유롭게 넓은 범위로 무선네트워크 반경을 확장할 수 있으며, 네트워크를 체계적으로 관리가 가능하다.(네트워크를 잘 아는 사람에게만 유리한 것이다.)

 

2번 경우를 가정하고, 기존에 운영하고 있는 유·무선공유기(이후 “메인 라우터”라고 지칭)이외에 구형의 OpenWRT가 설치된 유·무선공유기를 대상으로 작업하는 것을 설명한다.

 

0. 사전 준비

    - 최대한 최신 OpenWRT 펌웨어를 설치한 유·무선공유기를 준비한다.

    - Dumb AP(또는  Bridged AP)는 WAN 포트를 사용하지 않는다.

       ※ WAN 포트를 LAN 포트를 용도변경해서 사용할 수 있기도 하지만, 보통 4개 정도인 유선 LAN 포트가 사용하기에 충분하기에 굳이 어렵게 설정을 변경해서 WAN 포트를 사용하지 않아도 된다. 괜히 나중에 설정을 복구할때 헷갈릴 수도 있다!

    - 무선 네트워크 설정은 웹 UI에서 하는 것이 훨씬 편리하다.

    - 유선 네트워크 설정을 바꾸는 작업은 맨 마지막에 하며, 가능하면 SSH 접속을 이용해서 command line 명령으로 하는 것이 좋다.

    - 공유기의 LAN 포트와 작업하는 컴퓨터를 연결하고,(WAN은 절대 연결하지 않는다!) 공유기에 로그인 한다.

 

1. 무선 네트워크 설정

LUCI 기반의 웹 환경에서 로그인해서, 무선 네트워크를 먼저 설정한다. 메인라우터의 무선 설정과 동일하게 설정해도 되지만, 물리적인  주파수 채널은 다르게 해주는 것이 좋다.

 

2. LAN 영역에서 DHCP와 IPv6 비활성화 

Network → Interfaces 화면으로 가서 LAN interface 를 선택한다.

 “Ignore interface: Disable DHCP for this interface.” 항목을 찾아서, 체크 선택을 한다. 그리고 “IPv6 Settings” 탭으로 이동해서 모든 것을 “disabled”로 선택한다. IPv6 관련 기능은 아예 안쓰는 것으로 해야한다.

 

3. 방화벽과 DNSmasq, 그리고 odhcpd 비활성화

System → Startup 메뉴로 이동한 다음, Startup scripts 목록에 있는 firewall, dnsmasq, odhcpd을 disable 시킨다.

맨 아래에 있는 Save and Apply 버튼을 눌러서 적용시킨다.

 

4. 메인라우터와의 Bridged 네트워크를 설정

다시 Network → Interfaces 화면으로 가서 LAN interface 를 선택한다.

이제 유선 네트워크를 실제로 바꾸는 곳이다. 가능하면 SSH 상에서 Command line 명령이라, 설정파일 수정으로 하는 것이 좋지만,

어쪌 수 없다면, 웹 UI 상에서 “IPv4 address”는  메인라우터 IP 주소의 다음번으로 선정하는 것이 좋다. 예를 들어 OpenWRT 장비의 기본 IP 주소는 192.168.1.1 인데, 그대로 사용하고 있다면, 추가로 연결되는  Dump AP의 주소는 192.168.1.2 를 선정하는 것이 좋다. 해당 네트워크 대역의 마지막 IP 주소인 192.168.1.254도 괜찮은 선택이다.

Gateway는 메인라우터의 IP 주소, 일반적인 OpenWRT의 메인라우터를 그대로 쓰고 있다면, 위에 말한 바와 같이 192.168.1.1을 적는다.

Netmask는 대부분 255.255.255.0 로,

DNS는 국내 KT의 DNS IP 주소인 168.126.63.1 또는 국외 구글의 DNS IP 주소인 8.8.8.8 을 적어두면 된다. 우선순위는 바꾸어도 상관없다.

 

위의 4번 유선네트워크 설정 과정은 SSH 상에서 작업은 다음과 같이 설정파일을 직접 수정하여 빠르게 한꺼번에 할 수도 있지만,

설정파일 내용을 잘 이해하기 어려운 경우에는 권장하지 않는다.

 

4. 유선네트워크 설정(/etc/config/network)

/etc/config/network 파일에 들어가서, 아래와 같이  ipaddr, netmask, gateway, dns를 수정·추가해준다.

Dump AP의 IP 주소는 192.168.1.2 이고, 메인라우터의 IP 주소는 192.168.1.1 이다.

config interface 'lan'

           option type 'bridge'

           option ifname 'eth0.1'

           option proto 'static'

           option ipaddr '192.168.1.2'

           option netmask '255.255.255.0'

           option gateway '192.168.1.1'

           option dns '192.168.1.1'

           option ip6assign '60'

 

설정이 완료되었으면, 장비의 네트워크 서비스만을 재시작 하거나, 아니면 장비를 재부팅한다.

root@OpenWRT:~# /etc/init.d/network restart

 

또는

 

root@OpenWRT:~# reboot

 

이제 dump AP의 랜 포트중의 하나와 메인라우터의 랜 포트중의 하나를 랜선으로 연결해준다. 그러면 유선이든 무선이든 메인라우터에도 접근할 수 있고, 인터넷도 사용할 수 있다. Dump AP로의 접근은 앞에서 설정한  Dumb AP IP 주소로 쉽게 할 수 있다.

Posted by 훅크선장
, |

Go 언어 연습을 위해서, CentOS 7 Linux 환경에서 Go 언어 환경을 설치해 본 것입니다.

 

0. GoLang 설치하기 

# cd

# wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz

# tar -zxvf go1.14.2.linux-amd64.tar.gz 

# mv go/ /usr/local/

 

GoLang 사용을 위한 환경변수 설정 

# cd

# vi .bashrc

다음을 추가한다.

export PATH=/usr/local/go/bin:$PATH

 

Go 언어 테스트해보기

# vi helloworld.go

예제 파일 내용을 다음과 같이 만든다.

package main

import "fmt"

func main() {
fmt.Println("Hello World")
}

 

# go build helloworld.go

# ./helloworld

Hello World

 

1. 기존 vim 패치키 제거 

# yum remove vim-common vim-enhanced vim-filesystem vim-minimal

 

2. 필요한 라이브러리 등 설치 

# yum install gcc make ncurses ncurses-devel cmake

# yum install ctags git tcl-devel  ruby ruby-devel  lua lua-devel  luajit luajit-devel  python python-devel  perl perl-devel  perl-ExtUtils-ParseXS  perl-ExtUtils-XSpp  perl-ExtUtils-CBuilder  perl-ExtUtils-Embed

 

3. vim 8 다운로드 및 빌드와 설치 

# cd

# git clone https://github.com/vim/vim.git

# cd vim

# ./configure --with-features=huge --enable-multibyte --enable-rubyinterp  --enable-python3interp --enable-perlinterp --enable-luainterp

# make

# make install

 

설치가 완료되면, 버전 확인하기

# vim --version

 

4. Pathogon은 vim 플러그인과 런타임 파일을 쉽게 관리 할 수 있도록 도와주는 vim 환경관리 툴이다. 먼저 pathogon을 설치한다.
~/.vim/autoload 디렉토리 밑에 vim-pathogon을 클론(clone)한다.

# mkdir -p ~/.vim/autoload

# cd ~/.vim/autoload
# git clone https://github.com/tpope/vim-pathogen.git
pathogen.vim을 ~/.vim/autoload 디렉토리에 복사한다.

# cp vim-pathogen/autoload/pathogen.vim ./


아래와 같이 vim-go 스크립트를 다운로드 한다.

# mkdir -p ~/.vim/bundle

# cd ~/.vim/bundle
# git clone https://github.com/fatih/vim-go.git

 

홈 디렉토리에 .vimrc 파일을 생성하고, 다음과 같이 작성한다.

# vi ~/.vimrc 
execute pathogen#infect()
syntax on
filetype plugin indent on

vim을 실행하고 :GoInstallBinaries명령을 실행하면, vim-go 관련된 플러그인들이 자동으로 설치된다.

 

4. YouCompleteMe(이하 YCM)은 VIM을 위한 자동코드완성 엔진이다. YCM은 C, C++, Object-C, Object-C++, CUDA, Python2, Pyton3, C#, Go 등 다양한 언어에 대한 자동완성기능을 제공한다.
YCM을 클론하고 컴파일 한다. Go 자동완성을 지원하고 싶다면 --go-completer 를 컴파일 옵션으로 설정해야 한다.

 

# cd ~/.vim/bundle
# git clone https://github.com/Valloric/YouCompleteMe.git
# cd ~/.vim/bundle/YouCompleteMe
# git submodule update --init --recursive
# ./install.sh --go-completer 

 

5.Tagbar
Tagbar 플러그인을 이용해서 현재 파일의 태그를 탐색해서, 코드의 대략적인 구조를 빠르게 살펴볼수 있다.

#cd ~/.vim/bundle
# git clone https://github.com/majutsushi/tagbar.git

 

6. NerdTree
NERDTree는 Vim용 파일 탐색기다. 이 플러그인은 디렉토리의 구조를 계층적으로 보여줘서, 파일을 쉽게 탐색하고 편집할 수 있도록 도와준다.

# cd ~/.vim/bundle
# git clone https://github.com/scrooloose/nerdtree.git

 

 

참조 사이트 : 

https://golang.org/dl/

 

Downloads - The Go Programming Language

Downloads After downloading a binary release suitable for your system, please follow the installation instructions. If you are building from source, follow the source installation instructions. See the release history for more information about Go releases

golang.org

https://www.joinc.co.kr/w/man/12/golang/Start

 

golang 시작하기 - 개발환경 만들기

 

www.joinc.co.kr

http://www.programmersought.com/article/6244238683/

 

Centos7 install vim8.0 + YouCompleteMe + support python 3.6 - Programmer Sought

Install python3.6:https://blog.csdn.net/wanormi/article/details/82900782 Upgrade vim and gcc Upgrade gcc sudo yum install centos-release-scl -y sudo yum install devtoolset-3-toolchain -y sudo yum install gcc-c++ sudo scl enable devtoolset-3 bash Upgrade vi

www.programmersought.com

https://phoenixnap.com/kb/how-to-install-vim-centos-7

 

How to Install Vim 8.2 on CentOS 7? (Latest Version)

You don't need to wait for the latest version of Vim to appear in official repositories. In tutorial learn how to install Vim 8.2 on CentOS 7. Get Started!

phoenixnap.com

 

Posted by 훅크선장
, |

참조 : https://www.ostechnix.com/bat-a-cat-clone-with-syntax-highlighting-and-git-integration/

 

Bat - A Cat Clone With Syntax Highlighting And Git Integration

Bat command is a clone to the cat command, with some additional cool features such as syntax highlighting, git integration and automatic paging etc.

www.ostechnix.com

리눅스에서의 cat 명령어를 대체하는  rust 기반의 bat 이라는 명령어를 설치하는 과정입니다.

 

1. 먼저 rust 환경을 설치합니다.

# curl https://sh.rustup.rs -sSf |sh

# source $HOME/.cargo/env

 

2. 필요 패키지 설치

# yum install clang

 

3. bat 빌드와 설치 

# cargo install bat

 

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

실제 진행상황

[root@server ~]# curl https://sh.rustup.rs -sSf |sh

info: downloading installer

 

Welcome to Rust!

 

This will download and install the official compiler for the Rust

programming language, and its package manager, Cargo.

 

It will add the cargo, rustc, rustup and other commands to

Cargo's bin directory, located at:

 

  /root/.cargo/bin

 

This can be modified with the CARGO_HOME environment variable.

 

Rustup metadata and toolchains will be installed into the Rustup

home directory, located at:

 

  /root/.rustup

 

This can be modified with the RUSTUP_HOME environment variable.

 

This path will then be added to your PATH environment variable by

modifying the profile files located at:

 

  /root/.profile

/root/.bash_profile

 

You can uninstall at any time with rustup self uninstall and

these changes will be reverted.

 

Current installation options:

 

 

   default host triple: x86_64-unknown-linux-gnu

     default toolchain: stable

               profile: default

  modify PATH variable: yes

 

1) Proceed with installation (default)

2) Customize installation

3) Cancel installation

>1

 

info: profile set to 'default'

info: default host triple is x86_64-unknown-linux-gnu

info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'

info: latest update on 2020-03-12, rust version 1.42.0 (b8cedc004 2020-03-09)

info: downloading component 'cargo'

info: downloading component 'clippy'

info: downloading component 'rust-docs'

 12.0 MiB /  12.0 MiB (100 %)  11.1 MiB/s in  1s ETA:  0s

info: downloading component 'rust-std'

 17.1 MiB /  17.1 MiB (100 %)  10.9 MiB/s in  1s ETA:  0s

info: downloading component 'rustc'

 58.6 MiB /  58.6 MiB (100 %)  11.1 MiB/s in  5s ETA:  0s

info: downloading component 'rustfmt'

info: installing component 'cargo'

info: installing component 'clippy'

info: installing component 'rust-docs'

 12.0 MiB /  12.0 MiB (100 %)   7.4 MiB/s in  1s ETA:  0s

info: installing component 'rust-std'

 17.1 MiB /  17.1 MiB (100 %)  11.8 MiB/s in  1s ETA:  0s

info: installing component 'rustc'

 58.6 MiB /  58.6 MiB (100 %)  11.5 MiB/s in  5s ETA:  0s

info: installing component 'rustfmt'

info: default toolchain set to 'stable'

 

  stable installed - rustc 1.42.0 (b8cedc004 2020-03-09)

 

 

Rust is installed now. Great!

 

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH

environment variable. Next time you log in this will be done

automatically.

 

To configure your current shell run source $HOME/.cargo/env

[root@server ~]# source $HOME/.cargo/env

[root@server ~]# yum install

clang

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

 * base: mirror.kakao.com

 * extras: mirror.kakao.com

 * updates: mirror.kakao.com

Resolving Dependencies

--> Running transaction check

---> Package clang.x86_64 0:3.4.2-8.el7 will be installed

--> Processing Dependency: llvm(x86-64) = 3.4.2-8.el7 for package: clang-3.4.2-8.el7.x86_64

--> Processing Dependency: libLLVM-3.4.so()(64bit) for package: clang-3.4.2-8.el7.x86_64

--> Running transaction check

---> Package llvm.x86_64 0:3.4.2-8.el7 will be installed

---> Package llvm-libs.x86_64 0:3.4.2-8.el7 will be installed

--> Finished Dependency Resolution

 

Dependencies Resolved

 

=================================================================================================================================================

 Package                            Arch                            Version                                Repository                       Size

=================================================================================================================================================

Installing:

 clang                              x86_64                          3.4.2-8.el7                            extras                           19 M

Installing for dependencies:

 llvm                               x86_64                          3.4.2-8.el7                            extras                          1.3 M

 llvm-libs                          x86_64                          3.4.2-8.el7                            extras                          7.6 M

 

Transaction Summary

=================================================================================================================================================

Install  1 Package (+2 Dependent packages)

 

Total download size: 28 M

Installed size: 93 M

Is this ok [y/d/N]: y

Downloading packages:

(1/3): llvm-libs-3.4.2-8.el7.x86_64.rpm                                                                                   | 7.6 MB  00:00:01     

(2/3): llvm-3.4.2-8.el7.x86_64.rpm                                                                                        | 1.3 MB  00:00:01     

(3/3): clang-3.4.2-8.el7.x86_64.rpm                                                                                       |  19 MB  00:00:03     

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

Total                                                                                                            8.6 MB/s |  28 MB  00:00:03     

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

  Installing : llvm-libs-3.4.2-8.el7.x86_64                                                                                                  1/3 

  Installing : llvm-3.4.2-8.el7.x86_64                                                                                                       2/3 

  Installing : clang-3.4.2-8.el7.x86_64                                                                                                      3/3 

  Verifying  : clang-3.4.2-8.el7.x86_64                                                                                                      1/3 

  Verifying  : llvm-libs-3.4.2-8.el7.x86_64                                                                                                  2/3 

  Verifying  : llvm-3.4.2-8.el7.x86_64                                                                                                       3/3 

 

Installed:

  clang.x86_64 0:3.4.2-8.el7                                                                                                                     

 

Dependency Installed:

  llvm.x86_64 0:3.4.2-8.el7                                            llvm-libs.x86_64 0:3.4.2-8.el7                                           

 

Complete!

[root@server ~]# cargo install bat

    Updating crates.io index

  Installing bat v0.13.0

   Compiling libc v0.2.69

   Compiling memchr v2.3.3

   Compiling proc-macro2 v1.0.10

   Compiling unicode-xid v0.2.0

   Compiling cfg-if v0.1.10

   Compiling syn v1.0.17

   Compiling proc-macro2 v0.4.30

   Compiling lazy_static v1.4.0

   Compiling unicode-xid v0.1.0

   Compiling autocfg v1.0.0

   Compiling serde v1.0.106

   Compiling regex-syntax v0.6.17

   Compiling byteorder v1.3.4

   Compiling bitflags v1.2.1

   Compiling pkg-config v0.3.17

   Compiling log v0.4.8

   Compiling unicode-width v0.1.7

   Compiling version_check v0.1.5

   Compiling glob v0.3.0

   Compiling ucd-trie v0.1.3

   Compiling matches v0.1.8

   Compiling rustc-demangle v0.1.16

   Compiling vec_map v0.8.1

   Compiling ansi_term v0.11.0

   Compiling quick-error v1.2.3

   Compiling strsim v0.8.0

   Compiling smallvec v1.3.0

   Compiling maplit v1.0.2

   Compiling either v1.5.3

   Compiling bindgen v0.50.1

   Compiling syn v0.15.44

   Compiling liquid-error v0.19.0

   Compiling termcolor v1.1.0

   Compiling shlex v0.1.1

   Compiling proc-macro-hack v0.5.15

   Compiling encoding_index_tests v0.1.4

   Compiling peeking_take_while v0.1.2

   Compiling anymap v0.12.1

   Compiling doc-comment v0.3.3

   Compiling crc32fast v1.2.0

   Compiling percent-encoding v1.0.1

   Compiling ryu v1.0.3

   Compiling version_check v0.9.1

   Compiling adler32 v1.0.4

   Compiling deunicode v1.1.0

   Compiling unicode-segmentation v1.6.0

   Compiling safemem v0.3.3

   Compiling itoa v0.4.5

   Compiling percent-encoding v2.1.0

   Compiling xml-rs v0.8.2

   Compiling same-file v1.0.6

   Compiling linked-hash-map v0.5.2

   Compiling fnv v1.0.6

   Compiling lazycell v1.2.1

   Compiling ansi_term v0.12.1

   Compiling shell-words v0.1.0

   Compiling wild v2.0.2

   Compiling unicode-bidi v0.3.4

   Compiling encoding-index-singlebyte v1.20141219.5

   Compiling encoding-index-japanese v1.20141219.5

   Compiling encoding-index-simpchinese v1.20141219.5

   Compiling encoding-index-tradchinese v1.20141219.5

   Compiling encoding-index-korean v1.20141219.5

   Compiling thread_local v1.0.1

   Compiling humantime v1.3.0

   Compiling line-wrap v0.1.1

   Compiling miniz_oxide v0.3.6

   Compiling pest v2.1.3

   Compiling walkdir v2.3.1

   Compiling itertools v0.8.2

   Compiling unicode-normalization v0.1.12

   Compiling yaml-rust v0.4.3

   Compiling encoding v0.2.33

   Compiling aho-corasick v0.7.10

   Compiling bstr v0.2.12

   Compiling content_inspector v0.2.4

   Compiling num-traits v0.2.11

   Compiling num-integer v0.1.42

   Compiling quote v0.6.13

   Compiling nom v4.2.3

   Compiling error-chain v0.12.2

   Compiling quote v1.0.3

   Compiling idna v0.1.5

   Compiling idna v0.2.0

   Compiling clang-sys v0.28.1

   Compiling fxhash v0.2.1

   Compiling base64 v0.10.1

   Compiling pest_meta v2.1.3

   Compiling jobserver v0.1.21

   Compiling atty v0.2.14

   Compiling term_size v0.3.1

   Compiling time v0.1.42

   Compiling flate2 v1.0.14

   Compiling termios v0.3.2

   Compiling clicolors-control v1.0.1

   Compiling dirs-sys v0.3.4

   Compiling textwrap v0.11.0

   Compiling cc v1.0.50

   Compiling url v1.7.2

   Compiling dirs v2.0.2

   Compiling url v2.1.1

   Compiling clap v2.33.0

   Compiling cexpr v0.3.6

   Compiling regex v1.3.6

   Compiling chrono v0.4.11

   Compiling proc-quote-impl v0.2.2

   Compiling pest_generator v2.1.3

   Compiling env_logger v0.6.2

   Compiling console v0.10.0

   Compiling globset v0.4.5

   Compiling proc-quote v0.2.2

   Compiling backtrace-sys v0.1.35

   Compiling libloading v0.5.2

   Compiling libz-sys v1.0.25

   Compiling libgit2-sys v0.12.3+1.0.0

   Compiling ansi_colours v1.0.1

   Compiling serde_derive v1.0.106

   Compiling backtrace v0.3.46

   Compiling pest_derive v2.1.0

   Compiling failure v0.1.7

   Compiling which v2.0.1

   Compiling git2 v0.13.2

   Compiling onig_sys v69.2.0

   Compiling onig v5.0.0

   Compiling liquid-value v0.19.1

   Compiling serde_json v1.0.51

   Compiling plist v0.4.2

   Compiling bincode v1.2.1

   Compiling liquid-interpreter v0.19.0

   Compiling liquid-compiler v0.19.0

   Compiling syntect v3.3.0

   Compiling liquid-derive v0.19.0

   Compiling liquid v0.19.0

   Compiling bat v0.13.0

    Finished release [optimized] target(s) in 1m 43s

  Installing /root/.cargo/bin/bat

   Installed package `bat v0.13.0` (executable `bat`)

[root@server ~]#

 

Posted by 훅크선장
, |