728x90
반응형

SGD (Stochastic Gradient Descent)

Laplace Mechanism
Gaussian Mechanism
Exponential Mechanism
Local Sensitivity Sampling (LSS)
Multiplicative Weights Exponential Mechanism (MWEM)
High-Dimensional Matrix Mechanism (HDMM)
Multiplicative Weights Update (MWU)
Projected Gradient Descent (PGD)
PrivBayes
DualQuery

 

1. 경사 하강법(Stochastic Gradient Descent, SGD)

장점
연속적인 최적화: SGD는 연속적인 최적화를 통해 합성 데이터를 생성할 수 있어, 쿼리 결과에 대한 차이가 최소화된다.
확장성: 대규모 데이터셋에서도 효과적으로 작동한다.

유연성: 다양한 데이터셋과 쿼리 유형에 적용할 수 있다.
단점
수렴 문제: 학습률(lr)과 같은 하이퍼파라미터에 민감하며, 잘못 설정된 경우 수렴하지 않을 수 있다.
비선형 관계: 데이터의 비선형 관계를 다루는 데 한계가 있을 수 있다.

2. Multiplicative Weights Update (MWU) Mechanism

MWU 메커니즘은 적응적으로 쿼리를 선택하고, 각 쿼리의 응답을 업데이트하는 방법이다. 이 방법은 데이터의 각 레코드에 가중치를 할당하고, 각 쿼리 응답에 따라 가중치를 업데이트한다.
장점
적응적 쿼리 선택: 가장 정보가 많은 쿼리를 선택하여 효율성을 높인다.
프라이버시 보호: 프라이버시 예산을 효율적으로 사용한다.
단점
복잡성: 구현이 복잡하고, 계산 비용이 높을 수 있다.
적용 범위 제한: 일부 특정 쿼리 유형에만 효과적일 수 있다.

3. High-Dimensional Matrix Mechanism (HDMM)

HDMM은 고차원 데이터에 대해 최적화된 방식으로 쿼리를 처리하는 메커니즘이다. 쿼리 집합에 대한 응답을 선형 결합으로 표현하고, 이를 통해 최적의 노이즈 추가 방법을 찾아낸다.
장점
고차원 데이터 처리: 고차원 데이터셋에 대해 효과적으로 작동한다.
최적화된 노이즈 추가: 노이즈 추가를 최적화하여 정확도를 높인다.
단점
계산 복잡성: 계산 비용이 높아 대규모 데이터셋에 적용하기 어려울 수 있다.
제한된 쿼리 유형: 일부 쿼리 유형에 제한적일 수 있다.

4. Projected Gradient Descent (PGD)

PGD는 경사 하강법을 사용하는 투영 메커니즘 중 하나로, 최적화 과정에서 정규화 제약 조건을 적용한다. 이는 주어진 제약 조건 내에서 최적의 해를 찾는 데 효과적이다.
장점
정확도: 제약 조건 내에서 최적화하므로, 정확한 결과를 얻을 수 있다.
제약 조건 적용: 다양한 제약 조건을 쉽게 적용할 수 있다.
단점
수렴 문제: 학습률과 같은 하이퍼파라미터에 민감하며, 잘못 설정된 경우 수렴하지 않을 수 있다.
복잡성: 구현이 복잡할 수 있다.

 

5. Local Sensitivity Sampling (LSS)

주요 개념

국소 민감도 (Local Sensitivity): 특정 데이터셋에서 특정 쿼리에 대한 민감도를 계산한다. 이는 데이터셋의 특정 부분에서 쿼리 결과의 변동성을 측정한다.
노이즈 추가: 민감도에 따라 적절한 노이즈를 추가하여 프라이버시를 보호한다.
장점
효율적 노이즈 추가: 국소 민감도를 사용하여 보다 효율적으로 노이즈를 추가할 수 있다.
높은 정확도: 민감도에 맞춰 노이즈를 추가함으로써 데이터의 유용성을 유지한다.
단점
복잡성: 민감도를 계산하는 과정이 복잡할 수 있다.
특정 쿼리에 맞춤: 특정 쿼리에 대해 민감도를 계산하므로, 모든 유형의 쿼리에 적용하기 어려울 수 있다.

6. Private Gaussian Mechanism (PGM)

PGM은 Gaussian 노이즈를 추가하여 차등 프라이버시를 보장하는 메커니즘이다. Gaussian 노이즈는 데이터의 평균을 중심으로 정규 분포를 따르는 노이즈를 추가한다.
주요 개념
글로벌 민감도 (Global Sensitivity): 데이터셋 전체에서 특정 쿼리에 대한 민감도를 계산한다. 이는 데이터셋에서 최악의 경우에 쿼리 결과가 얼마나 변할 수 있는지를 측정한다.
Gaussian 노이즈: 정규 분포를 따르는 노이즈를 추가하여 프라이버시를 보호한다.
장점
프라이버시 강화: Gaussian 노이즈를 사용하여 데이터의 민감한 정보를 효과적으로 보호할 수 있다.
적용 범위: 다양한 유형의 데이터셋과 쿼리에 적용할 수 있다.
단점
노이즈 크기: 글로벌 민감도를 기준으로 노이즈를 추가하므로, 데이터셋의 크기와 민감도에 따라 노이즈가 커질 수 있다.
데이터 유용성: 노이즈가 커질수록 데이터의 유용성이 떨어질 수 있다.

 

7. PrivBayes

PrivBayes는 차등 프라이버시를 보장하는 베이지안 네트워크 기반의 합성 데이터 생성 기법이다. 원본 데이터의 분포를 학습하고, 그 분포를 기반으로 합성 데이터를 생성한다.
장점
정확한 데이터 생성: 원본 데이터의 통계적 특성을 잘 반영한 합성 데이터를 생성할 수 있다.
유용성: 다양한 데이터 분석 및 머신러닝 모델 학습에 사용할 수 있다.
단점
복잡성: 베이지안 네트워크 학습과 파라미터 추정 과정이 복잡하고 계산 비용이 높을 수 있다.
스케일링 문제: 매우 큰 데이터셋에 적용하기 어려울 수 있다.

8. DualQuery

DualQuery는 차등 프라이버시를 보장하는 데이터 쿼리 응답 기법이다. 이 방법은 데이터의 중요한 통계적 쿼리에 대한 정확한 응답을 제공하기 위해 노이즈를 적응적으로 조절한다.

장점
높은 정확도: 적응적 노이즈 조절을 통해 정확한 쿼리 응답을 제공할 수 있다.
적응성: 중요도가 높은 쿼리에 더 적합한 노이즈 수준을 선택할 수 있다.
단점
복잡성: 적응적 노이즈 조절 및 쿼리 선택 과정이 복잡하고 계산 비용이 높을 수 있다.
제한된 쿼리 응답: 특정 유형의 쿼리에 대해서만 적용할 수 있다.

9. MWEM (Multiplicative Weights Exponential Mechanism)

MWEM은 차등 프라이버시를 보장하면서 데이터의 분포를 추정하기 위한 기법이다. 이 방법은 데이터의 가중치를 반복적으로 업데이트하여 실제 데이터 분포에 가까운 분포를 생성한다.

주요 개념
Multiplicative Weights: 데이터의 각 레코드에 가중치를 할당하고, 반복적으로 업데이트한다.
Exponential Mechanism: 쿼리 응답에 노이즈를 추가하여 차등 프라이버시를 보장한다.
장점
정확한 분포 추정: 반복적인 업데이트를 통해 실제 데이터 분포에 가까운 분포를 생성할 수 있다.
적응성: 다양한 쿼리 유형에 대해 적용할 수 있다.
단점
계산 비용: 반복적인 가중치 업데이트 과정이 복잡하고 계산 비용이 높을 수 있다.
수렴 문제: 반복 과정에서 수렴하지 않을 위험이 있다.

 

상황별추천

대규모 데이터셋:

SGD: 확장성이 좋고, 대규모 데이터셋에서 효과적으로 작동한다.
PGD: 제약 조건이 있는 최적화 문제에 효과적이다.

고차원 데이터셋:

HDMM: 고차원 데이터에 최적화된 방식으로 쿼리를 처리한다.

적응적 쿼리 응답:

MWU: 적응적 노이즈 조절로 높은 정확도를 유지할 수 있다.
DualQuery: 중요한 쿼리에 대한 높은 정확도를 유지할 수 있다.

프라이버시 보호와 데이터 유용성:

MWEM: 반복적인 업데이트를 통한 정확한 분포 추정이 가능한다.
PrivBayes: 원본 데이터의 통계적 특성을 잘 반영한 합성 데이터를 생성할 수 있다.

복잡한 조건부 의존성 처리:

PrivBayes: 베이지안 네트워크를 사용하여 복잡한 조건부 의존성을 처리할 수 있다.

 

PrivBayes: 원본 데이터의 통계적 특성을 잘 반영한 합성 데이터를 생성할 수 있지만, 계산 비용이 높다.
DualQuery: 적응적 노이즈 조절을 통해 높은 정확도의 쿼리 응답을 제공하지만, 구현이 복잡할 수 있다.
MWEM: 다양한 쿼리 유형에 적용할 수 있으며, 반복적인 업데이트를 통해 정확한 분포를 추정할 수 있지만, 계산 비용이 높을 수 있다.

상위호환 관계

1. SGD < PGD

제약 조건을 추가하여 최적화 문제를 해결할 수 있다.

- PGD: 제약 조건을 적용한 경사 하강법, 데이터의 특정 조건을 만족해야 하는 최적화 문제에 적합하다.

2. Laplace < Gaussian Mechanism

고차원 데이터에 적합, 델타 파라미터 사용하여 노이즈를 추가한다.

3. MWU < MWEM

쿼리 응답과 데이터 분포 추정에 대해 더 복잡하고 정밀한 업데이트를 수행한다.

4. LSS < PGM

국소 민감도를 사용하여 노이즈 추가하는 방식에서, 글로벌 민감도를 기반으로 Gaussian 노이즈를 추가한다.

 


High-Dimensional Matrix Mechanism (HDMM)
PrivBayes
DualQuery

 

 

728x90
728x90
728x90
반응형

1. 원핫 인코딩 (One-Hot Encoding)

설명: 각 범주를 이진 벡터로 변환한다. 각 벡터는 하나의 1과 나머지 0으로 구성된다.
장점: 단순하고 직관적, 범주 간 순서나 크기를 가정하지 않음
단점: 차원이 높아질 수 있음, 범주가 많을 경우 메모리 사용량이 증가함
적합성: 많은 노이즈를 추가해야 하는 경우가 많아질 수 있으며, 고차원 데이터는 계산 복잡도를 증가시킬 수 있다.

2. 레이블 인코딩 (Label Encoding)

설명: 각 범주를 고유한 정수로 매핑한다.
장점: 단순하고 메모리 효율적, 차원이 증가하지 않음
단점: 범주 간 순서나 크기를 가정하게 되어 모델이 이를 잘못 해석할 수 있음
적합성: 범주 간의 순서나 크기 정보가 노출될 수 있어 적합하지 않을 수 있다.

3. 순서 인코딩 (Ordinal Encoding)

설명: 범주형 데이터를 순서가 있는 정수로 변환한다.
장점: 순서가 있는 데이터를 잘 표현할 수 있음, 메모리 효율적
단점: 범주 간의 거리를 동일하게 가정, 범주 간 순서가 중요하지 않은 경우 부적절할 수 있음
적합성: 순서가 중요한 경우 유용하지만, 범주 간 순서 정보가 노출될 수 있어 적합하지 않을 수 있다.

4. 바이너리 인코딩 (Binary Encoding)

설명: 각 범주를 고유한 숫자로 매핑하고, 이 숫자를 이진수로 변환한다.
장점: 차원이 원핫 인코딩보다 낮음, 원핫 인코딩과 레이블 인코딩의 중간 정도의 복잡도와 메모리 사용량을 가짐
단점: 복잡도가 증가할 수 있음, 일부 정보가 손실될 수 있음
적합성: 차원이 적당히 낮고, 범주 간의 순서 정보가 직접적으로 노출되지 않아 적합하다.

 

바이너리 인코딩은, 
차원 감소: 원핫 인코딩보다 낮은 차원을 가지므로 계산 복잡도가 줄어든다.
정보 노출 최소화: 범주 간의 순서나 크기 정보가 직접적으로 노출되지 않는다.
프라이버시 보호: 적당한 수준의 노이즈를 추가하여 프라이버시를 보호할 수 있다.

 

728x90
728x90
728x90
반응형

CAPEX: Capital Expenditures, 자본적 지출

- 미래의 이윤 창출, 가치의 취득을 위해 지출된 투자 과정에서의 비용

- 설비 투자 비용

 

OPEX: Operating Expenditure, 업무지출/운영비용

- 갖춰진 설비를 운영하는 데 드는 제반 비용

- 운영 및 유지보수 비용

 

GRE(Generic Routing Encapsulation)

라우팅이 불가능한 패킷을 라우팅 가능한 패킷의 내부에 넣어서 전송할 때 사용하는 터널링 프로토콜


시스템 점검

방법1) 작업 관리자의 성능 > 리소스 모니터 열기

방법2) cmd > resmon

 

Windows CPU 사용률 확인

cmd > wmic cpu get loadpercentage

cmd > tasklist (작업 목록: 실행 중인 프로세스 및 관련 CPU 사용량 목록)

 

Windows Mem 확인

cmd > wmic os get FreePhysicalMemory

cmd > systeminfo | find "사용 가능한 실제 메모리"

 

Windows Disk 확인

cmd > wmic diskdrive get deviceid, model, size

[윈도우키 + R] diskmgmt.msc

 

Windows 시스템 정보

cmd > msinfo32

 

Linux CPU 사용량 확인

top

glance

 

Linux Mem 확인

vmstat

 

Linux Disk 용량 확인

df (disk free): 파일 시스템의 사용 가능 공간 표시, FileSystem / Mounted on

df . : 현재 디렉토리가 포함된 파티션의 남은 용량 확인

du (disk usage): 해당 디렉토리(파일)의 디스크 크기확인 명령어

* 파일 시스템: 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제

* 마운트: 디스크와 같은 물리적인 장치를 특정 위치, 즉 디렉터리에 연결시켜 주는 것

- 보조기억장치나 파일 시스템이 다른 디스크를 /의 하위 디렉터리로 연결하여 사용 가능하게 해주는 명령어

 

crontab

특정 작업을 주기적으로 실행하기 위해 사용(cron table)

시스템에 동작하는 crontab 전체 목록 조회: /etc/crontab 파일 확인

 

-e (edit user's crontab), crontab 내용 입력/수정

-l (list user's crontab), 현재 로그인한 user의 cron 목록 조회

-r (delete user's crontab), ctontab 내용 삭제

-i (prompt before deleting user's crontab), crontab 내용 삭제 전 확인 문구 띄우기

-u : 특정 user의 crontab을 설정할 때

 

적용 후 restart

service cron restart
service crond restart  // cron이 재시작되지 않을 경우

 

Server에 하드웨어 정보 확인

dmidecode(Desktip Management Interface) 사용

: 서버의 모든 하드웨어 정보를 확인할 수 있음, 시스템 정보가 모두 출력됨

 

/opt 폴더 내 서버 정보 폴더명 확인 가능 (e.g., HP, Dell)

/proc/version 파일 내 Linux version, Ubuntu/CentOS 정보 확인 가능 (혹은 uname -a)

코드명(Codename) 확인(focal, bionic, ...)

lsb_release -c

 

yum: Redhat 계열

apt-get: 레드햇 엔터프라이즈 페도라 CentOS 데비안, 우분투 계열

 

 

[참고]

dmidecode

https://blessu1201.github.io/2020/08/10/serverhw.html

HP UX 시스템 정보 및 점검 명령어

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hymne&logNo=221260066306 

 

 

728x90
728x90

'Development > Linux' 카테고리의 다른 글

[Linux] 리눅스 기본 시스템 명령어  (0) 2023.01.10
[SSH] ping test smtp  (0) 2022.11.14
[Github] 기초 사용법  (0) 2022.11.08
[SSH] 리눅스 서버 원격 접속  (0) 2022.11.07
[리다이렉션] Linux File Descriptor  (0) 2022.11.07
728x90
반응형
목차
1. 객체지향 프로그래밍
2. 클래스와 인스턴스

  1) 클래스 정의
  2) 클래스 생성
  3) 필드(field)
  4) 메서드(method)
  5) self: 메서드가 가져야 할 첫 번째 매개변수
  6) 인스턴스(instance)
  7) 인스턴스의 필드와 메서드
3. 왜 객체지향 프로그래밍인가?
  1) 상속
  2) 다형성
4. 이후 학습이 필요한 내용

[Review] (7주차) 모듈과 패키지

2023.01.21 - [Development/Python] - [Python] 03 모듈과 패키지 - week.07

 

[Python] 03 모듈과 패키지 - week.07

목차 1. 모듈 - 변수와 함수, 코드를 모아둔 하나의 .py파일 1) 모듈 불러오기 - import ① math: 수학 연산 ② random: 랜덤한 숫자를 선택 2) 모듈 사용하기 - . + 모듈 속 함수/변수 3) 모듈 만들기 - .py 확

sarahee.tistory.com


1. 객체지향 프로그래밍

Point I
프로그래밍 방식의 전환! 프로그램이 객체와 객체의 상호작용이라면?

Point II
객체(Object) : 성질과 할 수 있는 행동이 담긴 자료


2. 클래스와 인스턴스

Point I
클래스(Class) : 객체를 만들 수 있는 

에어컨이 가져야 할 속성 : 희망온도, 바람속도, ...
에어컨이 할 수 있는 행동 : 온도 높이기/낮추기, 바람속도 조절, ...

Point II
클래스 생성 : class 클래스이름:으로 생성

class Aircon: 
#Aircon 클래스를 생성

Point III
필드(field) : 객체가 가지고있는 성질 → 변수

class Aircon:
    temp = 20 #희망온도 변수
    wind_speed = 1 #바람속도 변수

Point IV
메서드(method) : 객체가 할 수 있는 행동 → 함수

class Aircon:
    def wind_speed_up(self): #바람속도를 증가시키는 함수
        self.wind_speed = self.wind_speed + 1

Point V
self: 메서드라면 가져야하는 첫 번째 매개변수
Q : 왜 self가 필요할까?
A : self는 객체 자신을 의미하며, 메서드가 호출될 때 self 자리에 객체 자신을 인자에 넣음

Point VI
인스턴스(Instance) : 객체를 만드는 틀(클래스)로 만든 객체

Point VII
인스턴스의 생성 : 인스턴스 이름 = 클래스 이름()

crystal = Aircon() 
#Aircon의 성질을 가진 객체 crystal 생성

Point VIII
인스턴스의 필드와 메서드 : 인스턴스.field/method 형태로 사용

crystal = Aircon()
print(crystal.temp) #20
print(crystal.wind_speed) #1

crystal.wind_speed_up() #메서드 호출
print(crystal.wind_speed) #2

3. 왜 객체지향 프로그래밍인가?

Point I
기존의 코딩스타일로는 표현할 수 없었던 상황을 표현 가능하게 해줌

Point II
상속 : 한 클래스의 속성을 다른 클래스가 이어받는 것

class Tree:
    height = 0
    leaf_size = 0
...

class CherryBlossom(Tree): #Tree의 성질을 그대로 계승
    height = 25 # 벚꽂나무에 맞게 값을 재조정
    leaf_size = 1

# 마치 부모와 자식처럼 코드를 관리 가능
# 현실 세계의 객체 구조와 유사

Point III
다형성 : 같은 이름의 코드가 다양한 역할을 하는 것

class CherryBlossom(Tree):
    height = 25
    leaf_size = 1

class Mugunghwa(Tree):
    height = 1
    leaf_size = 5

# 같은 height, leaf_size 변수가 있지만
# class마다 가지는 값이 다름
# 같은 이름으로 각 객체의 값을 관리할 수 있음

4. 이후 학습이 필요한 내용

  • 데이터를 효과적으로 담는 방법인 데이터구조나, 문제를 효율적으로 해결할 수 있는 알고리즘
  • 데이터분석을 진행하기 위한 기초인 Numpy/Pandas
  • 웹사이트의 내용을 정보를 가져오는 데이터 크롤링
  • 문자열에서 유의미한 정보를 추출하는 정규 표현식

 

728x90
728x90
728x90
반응형
목차
1. 모듈
  - 변수와 함수, 코드를 모아둔 하나의 .py파일
  1) 모듈 불러오기
    - import
    ① math: 수학 연산
    ② random: 랜덤한 숫자를 선택
  2) 모듈 사용하기
    - . + 모듈 속 함수/변수
  3) 모듈 만들기
    - .py 확장자
2. 패키지
  - 모듈을 폴더 단위로 관리하는 것
  - from A import func: 불러올 장소(A) 와 불러올 변수/함수(func)를 명시한 것
  - 폴더(디렉토리)와 모듈로 구성되는 세트

[Review] (6주차) 함수와 메서드

2022.11.08 - [Development/Python] - [Python] 02 함수와 메서드 - week.06

 

[Python] 02 함수와 메서드 - week.06

목차 1. 함수 1) 내장 함수 ① max(), min() ② sum(), len() ③ def 2) 매개변수 3) 전역변수 4) 지역변수 2. 메서드 [Review] (5주차) 기초 자료형2 2022.09.05 - [Development/Python] - [Python] 01 기초 자료형 II - week.05 [Pyt

sarahee.tistory.com


1. 모듈

Point I
특정 목적을 가진 함수, 자료, 코드의 모임

Point II
모듈 불러오기 - import 키워드를 이용해서 모듈을 사용

import random
#random 모듈을 불러옴

Point III
모듈 사용하기 - .을 쓴 후에 모듈 속 함수/변수를 사용

import random

print(random.randrange(0, 2))
#0 이상 2 미만 수 중 하나를 임의로 출력

Point IV
모듈 만들기 - .py확장자의 파이썬 파일로 생성

## price.py
americano = 4100
cafe_latte = 4600
...

## main.py
import price
print(price.americano)
# 4100

Point V
모듈 예시 I - math수학 연산을 도와주는 모듈

math.cos는 삼각함수 코사인 연산을 하는 함수

import math

print(math.cos(0))
# cos(0)인 1.0을 출력

Point VI
모듈 예시 II - random랜덤한 숫자를 선택하는 함수가 담긴 모듈

import random

print(random.randrange(1, 10))
# 1~9 중 하나를 랜덤으로 출력

2. 패키지

Point I
모듈을 폴더(디렉토리) 단위로 관리하는 것

Point II
import vs from-import
import A : 불러올 장소(A)만을 명시한 것

import A
A.func()

# A 안의 함수 func를 사용하기 위해선 A.func() 꼴로 사용

from A import func : 불러올 장소(A)와 불러올 변수/함수(func)를 명시한 것

from A import func
func()

# A 안의 함수 func을 사용하기 위해선 func() 꼴로 사용  

Point III
모듈 vs 패키지
모듈 : 변수와 함수, 코드를 모아둔 하나의 .py파일
패키지 : 폴더(디렉토리)와 모듈로 구성되는 세트

# [예시] 파이썬으로 게임 패키지를 만든다면?
game/ #폴더
    __init__.py 
    audio/
    sprite/
    script/
        __init__.py
        move.py #모듈
        attack.py
    ...

[Next] (8주차) 객체의 세계로

2023.01.21 - [Development/Python] - [Python] 04 객체의 세계로 - week.08

 

[Python] 04 객체의 세계로 - week.08

목차 1. 객체지향 프로그래밍 2. 클래스와 인스턴스 1) 클래스 정의 2) 클래스 생성 3) 필드(field) 4) 메서드(method) 5) self: 메서드가 가져야 할 첫 번째 매개변수 6) 인스턴스(instance) 7) 인스턴스의 필

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

[기본 명령어]

명령어 설명 위치 입력
whatis 명령어의 간단한 설명 보기 /usr/bin/whatis whatis [명령어]
man 매뉴얼 보기 /usr/bin/man man [option] [섹션] [명령어]
arch 컴퓨터 종류 알기 /bin/arch -

[시스템 명령어]

명령어 설명 위치 입력
w 접속한 사용자 정보 조회 /usr/bin/w  
ulimit 시스템 제한   ulimit [option] [제한]
ulimit [리소스] [최대치]
uname 시스템 정보 확인 /bin/uname uname [option]

w: 서버에 접속한 사용자의 접속 정보와 작업에 대한 정보 확인

arch: 시스템의 CPU에 대한 정보 확인

ulimit: 시스템 리소스에 대해 최대 한계를 지정

uname: 시스템에 대한 정보 출력(하드웨어 타입, 호스트명, 운영체제 릴리즈 번호 등의 정보 확인)


[ulimit 명령어 옵션]

option 의미 option 의미
-a 현재 시스템의 제한 사항을 모두 출력 -c 코어 파일의 최대 크기 출력
-d 프로세스의 데이터 세그먼트의 최대 크기 출력 -f 쉘이 만들 수 있는 파일의 최대 크기 출력
-m 상주 설정 최대 크기 출력 -s 최대 스택 크기 출력
-t 초 단위의 최대 CPU 시간 출력 -p 512바이트 블록 단위로 파이프의 크기
-n 열 수 있는 파일의 수 -u 단일 사용자에게 허용하는 프로세스의 최대 개수
-v 쉘에 허용하는 가상 메모리의 최대량 -S 소프트 제한 출력
-H 하드 제한 출력    

[uname 명령어 옵션]

option 의미 option 의미
-a 모든 정보 출력 -m 하드웨어 타입 출력
-n 호스트명 출력 -r 운영체제의 릴리즈 번호를 출력
-s 운영체제 이름 출력 -v 운영체제 버전 출력

 

 

728x90
728x90

'Development > Linux' 카테고리의 다른 글

[시스템 점검] Window/Linux system - CAPEX/OPEX  (0) 2023.06.23
[SSH] ping test smtp  (0) 2022.11.14
[Github] 기초 사용법  (0) 2022.11.08
[SSH] 리눅스 서버 원격 접속  (0) 2022.11.07
[리다이렉션] Linux File Descriptor  (0) 2022.11.07
728x90
반응형

3초 이내로 timeout

timeout = 3
socket.setdefaulttimeout(timeout)

 

현재 스크립트 파일이 실행되는 상태 파악

- main 함수 실행

if __name__ == "__main__":
	main()

 

strftime(): 날짜 형식을 변환하는 메서드

time = datetime.datetime.now()
strtime = self.time.strftime('%Y-%m-%d %H:%M:%S')
print("origin-time:", time, "/ string-time:", strtime)
origin-time: 2022-11-09 10:47:48.387960 / string-time: 2022-11-09 10:47:48

server information 빈 array 만들고,

server result success/fail dictionary 구조

import paramiko
import getpass
import socket
import datetime
import os
import sys

timeout = 3
socket.setdefaulttimeout(timeout)

class maintenance:
    def __init__(self, ser_info):
        self.port = 22
        self.ser = ser_info
        self.time = datetime.datetime.now()
        self.systime = self.time.strftime('%y%m%d_%H%M%S')
        print(self.systime)
        self.ssh_connection()
        
    def ssh_connection(self):
        try:
            # ssh server connected class - present pc: client
            ssh = paramiko.SSHClient()
            # ssh session key rule: paramiko.AutoAddPolicy()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            
            server = '192.168.5.132'
            user = input("Username: ")
            pwd = getpass.getpass("Password: ")
            
            # ssh server connect
            ssh.connect(server, port=22, username=user, password=pwd)
            print('--------------- SSH Connected ---------------\n')
            
            # ssh route directory/file list check
            stdin, stdout, stderr = ssh.exec_command('df -h')
            print(''.join(stdout.readlines()))
            
            self.system_check(server, user, pwd)
            
            ssh.close()
        except Exception as err:
            print(err)
    
    def system_check(self, server, user, pwd):
        
        # if server == '192.168.5.132':
        #     file_name = 'server_#1'
        try:
            ser_result_success = {}
            ser_result_fail = {}
            msg_text = ''
            
            print('--------------- ping test ---------------')
            # -n: number of packet transmissions(1)
            response = os.system("ping -n 1 " + server)
            if response == 0:
                Netstatus = "Network Active"
            else:
                Netstatus = "Network Error"
            file_name = self.save_results(server, Netstatus)
            
        except Exception as err:
            print(err)

    def save_results(self, server, ping_result):
        try:
            # realpath, abspath
            BASE_DIR = os.path.dirname(os.path.abspath(__file__))
            w_file_name = f'{self.systime}_{server}_result.log'
            print(BASE_DIR)
            with open(os.path.join(BASE_DIR, w_file_name), 'w') as f:
                # for k, v in ping_result.items():
                doc = f"{ping_result}"
                f.write(doc)
                
        except Exception as err:
            print(err)
            
    # def send_mail(self, server, ):
    #     return 0
def main():
    
    # system arguments value (default 1)
    print(sys.argv, len(sys.argv))
    
    # c:/Users/user/Desktop/sehee/system/git/sshtest.py
    ser_check_file = sys.argv[0]
    # []: Array / {}: Dictionary / (): Tuple    
    ser_info = []

    with open(ser_check_file, 'r') as file:
        lines = file.read().splitlines()
        for line in lines:
            line = line.split(",")
            ser_info.append(line)
    
    # maintenance(ser_info).ssh_connection()
    maintenance(ser_info)

# main script run
if __name__ == "__main__":
    main()

 

실행 명령어 exec_command를 입력하게 되면, 값을 tuple 형식으로 세 개를 받아옴

stdin, stdout, stderr

 

메일 전송 프로토콜

SMTP를 사용하기 위해 필요한 smtplib 모듈 import

MIME 클래스: 이메일과 함께 전송할 파일을 텍스트 형식으로 변환해주는 역할

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

 

Google 계정 관리 > 보안 > 2단계 인증 > 비밀번호 입력(로그인) > 2단계 인증 후

앱 비밀번호 > 비밀번호 입력(로그인) > 앱 선택: 메일 / 기기 선택: Windows 컴퓨터 > 생성

파일 생성하여 첨부

attachment = open(BASE_DIR+'\\'+file_name, 'rb')
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= "+file_name)
msg.attach(part)

 

728x90
728x90
728x90
반응형
목차
1. 함수
  1) 내장 함수
    ① max(), min()
    ② sum(), len()
    ③ def
  2) 매개변수
  3) 전역변수
  4) 지역변수
2. 메서드

[Review] (5주차) 기초 자료형2

2022.09.05 - [Development/Python] - [Python] 01 기초 자료형 II - week.05

 

[Python] 01 기초 자료형 II - week.05

목차 1. 시퀀스 활용 1) pop() 2) count() 3) split() 4) join() 2. Tuple(튜플) 3. Dictionary(사전형) 1) range() 2) for-range(a, b) 3) for-range(a) 4. while 1) 변수 수정 2) break문 [Review] (4주차) 반복문 2022.08.08 - [Development/Python]

sarahee.tistory.com


1. 함수

Point I
특정 기능을 수행하는 코드(들의 모임)

함수이름(인자) 형태로 사용

Point II
내장 함수형식에 맞춰서 편리하게 사용

Point III
max(), min() - 시퀀스의 최댓값최솟값을 구하는 함수

print(max([1, 2, 3]))
#3

print(min([-1, -2, -3]))
#-3

Point IV
sum(), len()- 시퀀스의 과 길이를 구하는 함수

odds = [1, 3, 5, 7, 9, 11]
print(sum(odds))
#36

print(len(odds))
#6

Point V
def 키워드 : 함수를 정의할 때 사용

def function_name():
    ....

Point VI
매개변수 : 함수 외부에서 내부로 값을 전달할 때 사용되는 변수
함수를 정의할 때 괄호 안에 써주는 것

def function(var1, var2, ...):
    ...

Point VII
인자 : 함수 외부에서 내부로 전달한 값(자료)
함수를 사용할 때 괄호 안에 써주는 것

def function(var1, var2):
    #이때 var1, var2는 매개변수
        ...

function(1, 2)
#이때 1, 2은 인자

Point VIII
전역변수 : 어디서든지 사용 가능한 변수
지역변수 : 특정 구문 안에서 정의한 변수

x = 1 #전역변수
def func():
    x = 2 #지역변수
    print(x)

Tip
print() 함수의 형식

print(data, end="\n", sep=" ")

data에는 출력할 자료를, end에는 data 출력 이후 출력할 문자열 삽입 (기본값은 줄바꿈 문자 "\n")

sep에는 data가 여러개인 경우, 각 data 사이에 출력할 문자열 삽입 (기본값은 공백 한 칸에 " ")

이때, end와 sep은 "end=", "sep="형식으로 인자를 전달해야 함

 

예시

print(1, 2, 3, end="")
print(4, 5, 6, sep="")

## 실행 결과 ##
1 2 3456

2. 메서드

Point I
특정 자료에 대해 특정 기능을 하는 코드
특정 자료.메서드이름(인자) 형태로 사용

Point II
함수 vs 메서드
함수 : 특정 기능을 하는 코드 (자료에 독립)
메서드 : 특정 자료에 대해 특정 기능을 하는 코드 (자료에 종속)

odd = [7, 2, 3, 5]

# 함수
max(odd)
print(odd)

# 메서드
odd.append(11)
odd.sort()

[Next] (7주차) 모듈과 패키지

2023.01.21 - [Development/Python] - [Python] 03 모듈과 패키지 - week.07

 

[Python] 03 모듈과 패키지 - week.07

목차 1. 모듈 - 변수와 함수, 코드를 모아둔 하나의 .py파일 1) 모듈 불러오기 - import ① math: 수학 연산 ② random: 랜덤한 숫자를 선택 2) 모듈 사용하기 - . + 모듈 속 함수/변수 3) 모듈 만들기 - .py 확

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

https://git-scm.com/download/win

 

Git - Downloading Package

Download for Windows Click here to download the latest (2.38.1) 32-bit version of Git for Windows. This is the most recent maintained build. It was released 20 days ago, on 2022-10-18. Other Git for Windows downloads Standalone Installer 32-bit Git for Win

git-scm.com

Click here to download 클릭하여 Git Bash 설치

모두 기본 설정으로 넘긴 후

기본 폴더 우클릭 > Git Bash Here 실행

깃허브에 저장소 작성 또는 복제

git init
git clone

git config --global user.name "username"
git config --global user.email email@email.com
git config --list

로컬 저장소에 sshtest.py 파일 추가

git add .: 현재 및 하위 디렉토리의 모든 파일 index 추가

git add sshtest.py
git add .

로컬 저장소에 파일 추가/변경 사항 기록

설명: ssh connection test

설명 변경(수정): change description

git commit -m "ssh connection test"
git commit --amend -m "change description"

git status

Github의 Repository 추가하여 copy 후

원격 저장소의 정보(주소) 추가

git remote add origin https://github.com/sehee1122/SystemMaintenance.git

로컬 저장소의 변경 사항을 원격 저장소에 반영

git push origin master

Sign in with a code를 선택할 경우
Sign in with your browser

Authorize

branch 생성됨, 이후

git merge <branch>
git pull <remote> <branch>

git merge master
git pull origin master

branch 변경(변경할 브랜치 작성(e.g. main, master))

git checkout <branch>

전체 과정

 

728x90
728x90
728x90
반응형

GRE Tunnel

Generic Routing Encapsulation, 패킷을 캡슐화(또는 터널링)하여 공용 네트워크를 통해 패킷을 전송할 수 있는 안전한 전용 경로 제공

 

paramiko 패키지: SSH 연결(기본 포트: 22)

실행: a i s o

Ubuntu에 해당 패키지가 깔리지 않을 경우, 패키지 조회

E: Unable to locate package

Ubuntu Packages Search

 

SSH server 설치

sudo apt-get install ssh
vi /etc/ssh/sshd_config

관리자 계정 root로 로그인이 가능하도록 다음 코드 입력

PermitRootLogin yes

이후 SSH 서버 실행

sudo service ssh start

실행 상태 및 프로세스 정보 확인

service ssh status
ps -ef | grep sshd
sudo netstat -ntlp | grep sshd

ifconfig로 내부 IP 주소 확인(192.168.5.132)

Windows에서 PuTTY로 확인했을 때, 다음과 같이 key exchange algorithm 오류

1) Ubuntu(서버)에서 putty 설치(선택)

2) UFW 방화벽 시스템의 SSH 포트 open

sudo apt install -y putty
sudo ufw allow ssh

다시 Windows에서 접속

ssh (계정명)@(서버IP)

> yes > 비밀번호 입력

코드 작성하여 실행하면 다음과 같이 파일 시스템 디스크 공간(df) 정보 확인

pip install paramiko
import paramiko
import getpass

try:
    # ssh server connected class - present pc: client
    ssh = paramiko.SSHClient()
    # ssh session key rule: paramiko.AutoAddPolicy()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    server = '192.168.5.132'
    user = input("Username: ")
    pwd = getpass.getpass("Password: ")
    
    # ssh server connect
    ssh.connect(server, port=22, username=user, password=pwd)
    print('ssh connected\n')
    
    # ssh route directory/file list check
    stdin, stdout, stderr = ssh.exec_command('df -h')
    print(''.join(stdout.readlines()))
    
    ssh.close()
except Exception as err:
    print(err)


참고 자료

Troubleshooting “E: Unable to locate package” Error on Ubuntu [Beginner’s Tutorial]

 

 

 

728x90
728x90
728x90
반응형

Find 결과에서 Permission denied 제거하기

find / -name "filename" 2>&1 | grep -v Permission

표준 출력: stdout

표준 에러: stderr

리다이렉션

Redirection, 방향을 변경하는 것

파일로 표준 입력을 받고, 파일로 표준 출력을 받는 등의 기능

리다이렉션 기호 형태 의미
< [명령어] < [파일] 파일의 내용을 명령어의 입력으로 사용
> [명령어] > [파일] 명령어의 결과(표준 출력)를 파일에 덮어씀
>> [명령어] >> [파일] 명령어의 결과를 파일에 추가

 기본 형태

형태 의미
[명령어] 1> [파일] [명령어] > [파일] 과 같은 의미, 표준 출력을 [파일]에 덮어씀
[명령어] 2> [파일] [명령어] 실행 시, 에러가 발생한다면 → 에러 내용을 [파일]에 덮어씀
[명령어] 1> [파일A] 2> [파일B] [명령어] 실행 시, 결과는 [파일A]에, 에러는 [파일B]에 덮어씀
[명령어] 1> [파일] 2> [파일] [명령어] 실행 시, 표준 출력과 에러를 모두 [파일]에 씀

활용 형태

형태  
[명령어] 1> [파일] 2> /dev/null [명령어] 실행 시, 결과는 [파일]에 쓰고, 에러는 출력하지 않고 버림

/dev/null: 리눅스의 휴지통(해당 파일로 이동되는 순간 완전히 삭제, Shift + Delete와 동일)

표준 에러가 표시되지 않고 삭제됨

형태  
[명령어] > [파일] 2>&1
[명령어] &> [파일] ([명령어] >& [파일])
[명령어] 실행 시, 표준 출력과 에러 모두 [파일]에 씀

표준 출력을 파일에 쓰고, 표준 에러를 &1로 보냄(>)

&1: 백그라운드(&)로 표준 출력(1)을 보내라는 의미 - 화면에 보이지 않게

→ 표준 에러(2)를 백그라운드(&)로 표준 출력(1)에 보내라(1)는 의미


참고 자료

Linux 리다이렉션(표준 출력, 표준 에러 활용)

 

 

728x90
728x90
728x90
반응형

Kali Linux 한글 설정

$ su
# apt-get update
# apt-get install fonts-nanum -y
# apt-get install fcitx-lib* -y
# apt-get install fcitx-hangul -y
# reboot

Kali Linux 영어 설정

$ export LANG=C; xdg-user-dirs-gtk-update

Update Names

재부팅

예전 이름 유지(K)


How To Uninstall ibus-hangul on Kali Linux

패키지만 제거

sudo apt-get remove ibus-hangul

종속된 내용 제거

sudo apt-get -y autoremove ibus-hangul

구성 및 데이터 제거

sudo apt-get -y purge ibus-hangul

구성, 데이터 및 모든 종속성 제거

sudo apt-get -y autoremove --purge ibus-hangul

apt-get remove fcitx-hangul -y
sudo apt-get -y autoremove --purge fcitx-hangul

home 디렉토리의 .bashrc 파일 수정

 

현재 설정된 언어 확인

echo $LANG

영어: en_US.UTF-8

한글: ko_KR.UTF-8

 

언어 설정 변경

LANG=en_US.UTF-8

언어 설정 영구 적용

/home/sehee/.bashrc 파일의 마지막에 해당 명령어 추가

export LANG=en_US.UTF-8

 

728x90
728x90

'Development > Linux' 카테고리의 다른 글

[Linux] 리눅스 기본 시스템 명령어  (0) 2023.01.10
[SSH] ping test smtp  (0) 2022.11.14
[Github] 기초 사용법  (0) 2022.11.08
[SSH] 리눅스 서버 원격 접속  (0) 2022.11.07
[리다이렉션] Linux File Descriptor  (0) 2022.11.07
728x90
반응형
목차
1. 시퀀스 활용
  1) pop()
  2) count()
  3) split()
  4) join()
2. Tuple(튜플)
3. Dictionary(사전형)
  1) range()
  2) for-range(a, b)
  3) for-range(a)
4. while
  1) 변수 수정
  2) break문

[Review] (4주차) 반복문

2022.08.08 - [Development/Python] - [Python] 04 반복문 - week.04

 

[Python] 04 반복문 - week.04

목차 1. 반복문 2. for-sequence문 3. for-range()문 1) range() 2) for-range(a, b) 3) for-range(a) 4. while 1) 변수 수정 2) break문 [Review] (3주차) 리스트 2022.07.28 - [Development/Python] - [Python]..

sarahee.tistory.com


1. 시퀀스 활용

Point I
list.pop(i) : 인덱스 i의 원소를 제거 후 반환

lst = [1, 2, 3, 4, 5]
box = lst.pop(0) # lst에서 1을 제거 후 반환, 이 경우에는 변수 box에 대입
print(lst) 
# [2, 3, 4, 5]

print(box)
# 1 

Point II
seq.count(d) : 시퀀스 내부의 자료 d의 개수를 반환

carrot = "Hi Rabbit!"
print(carrot.count("i"))

## 실행 결과 ##
2

Point III
str.split(c) : 문자열 c를 기준으로 문자열 str을 쪼개서 리스트를 반환

ours = "나,너,우리"
print(ours.split(","))
# ['나', '너', '우리']

Point IV
str.join(list) : str을 기준으로 list를 합쳐서 문자열을 반환

coffee = ['a', 'm', 'e', 'r', 'i', 'c', 'a', 'n', 'o']
print("".join(coffee)) # 빈 문자열("")을 기준으로 합치기
# americano

2. Tuple(튜플)

Point I
여러 자료를 담을 수 있으면서, 변하지 않는 자료형

Point II
() - 소괄호로 묶어 표현

tup = (1, 2, 3, 4, 5)

Point III
원소가 하나라면 반드시 원소 뒤에 ,을 적어주어야함

tup_one = (1,)

Point IV
시퀀스 자료형의 성질을 지님

cute = ('c', 'a', 't')
print(cute[1])  #인덱싱
#'a'

print(cute[1:]) #슬라이싱
#('a', 't')

print('e' in cute) #in연산자
#False

print(len(cute)) #len연산자
#3

print(cute + ('e', 'g', 'o', 'r', 'y')) #연결연산
#('c', 'a', 't', 'e', 'g', 'o', 'r', 'y')

print(cute * 3) #반복연산
#('c', 'a', 't', 'c', 'a', 't', 'c', 'a', 't')

Point V
자료를 추가, 삭제, 변경할 수 없음

hero = ("ant", "man")
hero.append("wasp") #Error
hero.remove("man") #Error
hero[0] = "iron" #Error

3. Dictionary(사전형)

Point I
짝꿍(Key → Value)이 있는 자료형

Point II
{} - 중괄호로 묶어서 표현

hp = {"gildong" : "010-1234-5678"}

Point III
key를 알면 value를 알 수 있음

dic = {"apple":"사과", "banana":"바나나"}
print(dic["apple"])
# 사과

Point IV
del 키워드로 Dictionary의 원소 삭제
리스트의 원소를 삭제하는 것도 가능

dic = {"apple":"사과", "banana":"바나나"}
del dic["apple"]
print(dic)
# {"banana":"바나나"}

Point V
Key는 변할 수 없는 자료형이여야 함

dic = {[1, 3, 5]:"odd"} #Error
dic = {(2, 4, 6):"even"} 

[Next] (6주차) 함수와 메서드

2022.11.08 - [Development/Python] - [Python] 02 함수와 메서드 - week.06

 

[Python] 02 함수와 메서드 - week.06

목차 1. 함수 1) 내장 함수 ① max(), min() ② sum(), len() ③ def 2) 매개변수 3) 전역변수 4) 지역변수 2. 메서드 [Review] (5주차) 기초 자료형2 2022.09.05 - [Development/Python] - [Python] 01 기초 자료형 II - week.05 [Pyt

sarahee.tistory.com

 

728x90
728x90

'Development > Python' 카테고리의 다른 글

[Python] 03 모듈과 패키지 - week.07  (0) 2023.01.21
[Python] 02 함수와 메서드 - week.06  (0) 2022.11.08
[Python] 04 반복문 - week.04  (0) 2022.08.08
[Python] 03 리스트 - week.03  (0) 2022.07.28
[Python] 02 조건문 - week.02  (0) 2022.07.22
728x90
반응형

[Review] (9주차) 실습

2022.08.26 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.09

 

[Swift] iOS 앱 개발(Xcode) Byte Degree - week.09

[Review] (8주차) 실습 2022.08.26 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.08 [Swift] iOS 앱 개발(Xcode) Byte Degree - week.08 [Review] (7주차) 실습 2022.08.25 - [Develop..

sarahee.tistory.com


2-5번째 내비게이션 탭 연동하기

첫번째로, 네번째 탭 연결

Main 탭의 Custom Class - Class, Identify - Storyboard ID 설정(CharViewController → FrameworkListViewController)

Inherit Module From Target 체크

 

기존 코드

//
//  MainTabBarController.swift
//  CarrotHomeTab
//
//  Created by sehee on 2022/08/24.
//

import UIKit

// 1. 탭이 눌릴 때마다, 그에 맞는 네비게이션 바를 구성하고자 함
// - 탭이 눌리는 것을 감지
// - 감지 후에, 그 탭에 맞게 네비게이션 바 구성 업데이트 필요


// 3. 앱이 시작할 때, 네비게이션바 아이템 설정을 완료하고 싶음
// - 네비게이션 바를

class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        updateNavigaitionItem(vc: self.selectedViewController!)
        //self.selectedIndex
        //self.selectedViewController
    }
    
    private func updateNavigaitionItem(vc: UIViewController) {
        switch vc {
        case is HomeViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "정자동",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let searchConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "magnifyingglass"),
                handler: { print("--> search tapped") })
            
            let searchItem = UIBarButtonItem.generate(with: searchConfig, width: 30)
            
            let feedConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "bell"),
                handler: { print("--> feed tapped") })
            let feedItem = UIBarButtonItem.generate(with: feedConfig, width: 30)
            
            //let titleItem = UIBarButtonItem(title: "정자동", style: .plain, target: nil, action: nil)
            //let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [feedItem, searchItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        case is MyTownViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "정자동",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let feedConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "bell"),
                handler: { print("--> feed tapped") })
            let feedItem = UIBarButtonItem.generate(with: feedConfig, width: 30)
            
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [feedItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        case is ChatViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "채팅",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let feedConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "bell"),
                handler: { print("--> feed tapped") })
            let feedItem = UIBarButtonItem.generate(with: feedConfig, width: 30)
            
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [feedItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        case is MyProfileViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "나의 당근",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let settingConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "magnifyingglass"),
                handler: { print("--> setting tapped") })
            
            let settingItem = UIBarButtonItem.generate(with: settingConfig, width: 30)
            
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [settingItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        default:
            let titleConfig = CustomBarItemConfiguration(
                title: "정자동",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            //let titleItem = UIBarButtonItem(title: "정자동", style: .plain, target: nil, action: nil)
            //let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = []
            navigationItem.backButtonDisplayMode = .minimal
        }
    }
}

// 2. 각 탭에 맞게 네비게이션바 아이템 구성하기
// - 홈: 타이틀, 피드, 서치
// - 동네활동: 타이틀, 피드
// - 내 근처: 타이틀
// - 채팅: 타이틀, 피드
// - 나의 당근: 타이틀, 설정

extension MainTabBarController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        print("--> 어떤 vc가 선택:\(viewController)")
        
        updateNavigaitionItem(vc: viewController)
    }
}

변경사항

1) default display mode 및 FrameworkListViewController

2) 하단 extension의 print문은 주석 처리

        case is FrameworkListViewController:
            navigationItem.largeTitleDisplayMode = .always
            navigationItem.title = "애플"
            navigationItem.leftBarButtonItem = nil
            navigationItem.rightBarButtonItems = nil
            navigationItem.backButtonDisplayMode = .minimal
            
        default:
            navigationItem.largeTitleDisplayMode = .always
            navigationItem.title = nil
            navigationItem.leftBarButtonItem = nil
            navigationItem.rightBarButtonItems = nil
            navigationItem.backButtonDisplayMode = .minimal
        }

Cannot find type 'FrameworkListViewController' in scope

참고: 9주차 > Part8. 실전 프로젝트_Ch02. 당근 홈탭 리스트 따라해보기(Carrot Home) (1) > 07. 프로젝트 당근 홈탭 리스트 따라하기 (홈 구성하기) 07 (07:40~08:45)

Editor > Refactor to Storyboard... 클릭하여 AppleFramework.storyboard 생성 등

해결되지 않음

 

폴더를 복사 붙여넣기할 때, Create groups, Copy items if needed 체크 

다음과 같이 채팅 부분의 아이콘이 사라지며, 다음과 같은 소스 오류 코드 생성

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

→ 해당 View를 스토리보드 Connection Inpsector에서 ViewController에 연결해주지 않아서 발생

 

다섯번째 탭도 동일하게 설정

 

 

728x90
728x90
728x90
반응형

[Review] (8주차) 실습

2022.08.26 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.08

 

[Swift] iOS 앱 개발(Xcode) Byte Degree - week.08

[Review] (7주차) 실습 2022.08.25 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.07 [Swift] iOS 앱 개발(Xcode) Byte Degree - week.07 [Review] (6주차) 실습 2022.07.22 - [Develop..

sarahee.tistory.com


지금까지 구현한 내용

1) 각 탭 구성

2) 탭 별 다른 내비게이션 아이템 설정

3) Home의 Search, Feed, List 등 모두 구성

4) 서버로부터 받은 내용으로 List 구현

앞으로 구현할 내용

Detail view 구성


DetailViewModel.swift 및 ItemInfoDetails.swift 생성

 

HomeViewController에서 viewModel 설정

vc.viewModel = DetailViewModel(network: NetworkService(configuration: .default), itemInfo: item)
collectionView.delegate = self

extension HomeViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let item = viewModel.items[indexPath.item]
        viewModel.itemTapped.send(item)
    }
}

디자인 라벨 등 구성(완료)

코드 수정 방법

option key를 누르고, 커서 드래그 이후 좌우 방향키 이용하여 사용하지 않는 코드 삭제(혹은 생성 가능)

    // User
    @IBOutlet weak var userThumbnail: UIImageView!
    @IBOutlet weak var userNickName: UILabel!
    @IBOutlet weak var userLocation: UILabel!
    @IBOutlet weak var userTemperature: UILabel!
    
    // Item
    @IBOutlet weak var itemThumbnail: UIImageView!
    @IBOutlet weak var itemInfoTitle: UILabel!
    @IBOutlet weak var itemInfoDescription: UILabel!

KingFisher import하여 image 적용

상세뷰 우측 상단에 아이콘 삽입

DetailViewController의 viewDidLoad 함수에 configureNavigationBar() 추가

    override func viewDidLoad() {
        super.viewDidLoad()
        configureNavigationBar()
        bind()
        viewModel.fetch()
    }

Editor > Edit All in Scope (control + command + E)

가격 라벨 추가

@IBOutlet weak var itemPriceLabel: UILabel!

self.itemPriceLabel.text = "\(self.formatNumber(details.item.price))원"

extension DetailViewController {
    private func formatNumber(_ price: Int) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        let result = formatter.string(from: NSNumber(integerLiteral: price)) ?? ""
        return result
    }

중간에 separate line 추가하여 완료

상세 오류 수정 #1

문제: 내용(Item Info Description)이 두 줄밖에 보이지 않는 현상

해결: Label Lines: 2 → 0 설정

상세 오류 수정 #2

문제: Detail View의 스크롤이 되지 않는 현상

Align Top to: Safe Area Equals: 44 삭제 및 Stack View 확인

Horizontal - Trailing/Leading Space to: Superview

Vertical - Bottom/Top Space to: Superview

설정하여 해결, 첫번째 내비게이션 바 완성

 

728x90
728x90
728x90
반응형

[Review] (7주차) 실습

2022.08.25 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.07

 

[Swift] iOS 앱 개발(Xcode) Byte Degree - week.07

[Review] (6주차) 실습 2022.07.22 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.06 [Swift] iOS 앱 개발(Xcode) Byte Degree - week.06 [Review] (5주차) 실습 2022.07.16 - [Dev/Swi..

sarahee.tistory.com


오류 시, Main.storyboard 삭제 후 다시 붙여넣기

Home UI 설정하기

Editor > Refactor to Storyboard... - Home

command + N > Swift - HomeViewModel

 

홈의 텍스트 및 버튼 삭제

Home 구성

Cocoa Touch Class 생성(Class: ItemInfoCell, Subclass of: UICollectionViewCell)

//
//  HomeViewController.swift
//  CarrotHomeTab
//
//  Created by sehee on 2022/08/24.
//

import UIKit
import Combine

// - 홈의 뷰 모델 만들기(리스트 가져오고, 아이템 탭 했을 때의 행동 정의)
// - 뷰 모델은 리스트 가져오기

class HomeViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!
    
    let viewModel: HomeViewModel = HomeViewModel(network: NetworkService(configuration: .default))
    var subscriptions = Set<AnyCancellable>()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configureCollectionView()
        bind()
        viewModel.fetch()
    }
    
    private func configureCollectionView() {
        
    }
    
    private func bind() {
        viewModel.$items
            .receive(on: RunLoop.main)
            .sink { items in
                //self.applyItems(items)
                print("--> update collection view \(items)")
            }.store(in: &subscriptions)
        
        viewModel.itemTapped
            .sink { item in
                let sb = UIStoryboard(name: "Detail", bundle: nil)
                let vc = sb.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
                //vc.viewModel = DetailViewModel(network: NetworkService(configuration: .default), itemInfo: item)
                self.navigationController?.pushViewController(vc, animated: true)
            }.store(in: &subscriptions)
    }
}

Snapshot 설정하여 내부 페이지 확인

오류 수정 #1

Thread 1: "[<CarrotHomeTab.ItemInfoCell 0x7fd8d7846620> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key descriptionLable."

→ Xcode 내 코드에 연결시킨 button을 찾을 수 없음

뷰 내의 인스펙터가 연결 코드 정보와 상이하여 발생(연결 이후 라벨을 변경한 경우, Lable → Label)

ItemInfoCell 내 연결정보 변경

class ItemInfoCell: UICollectionViewCell {
    
    @IBOutlet weak var thumbnail: UIImageView!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    @IBOutlet weak var numOfChatLabel: UILabel!
    @IBOutlet weak var numOfLikeLabel: UILabel!

그래도 불가...

Referencing Outlets 해당 부분을 x

오류 수정 #2

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

→ 1번과 동일한 문제

반복하여 연결 코드 삭제 후 재입력

해결

 

// - 좌우 패딩 필요

// - 셀에서, 콤마 표시하게끔 넘버 포매팅

// - 셀에서, 이미지 세팅하기 (+ cornerRadius 설정)

// - 셀에서, 콤마 표시하게끔 넘버 포매팅, formatNumber 변경
	func configure(item: ItemInfo) {
        titleLabel.text = item.title
        descriptionLabel.text = item.location
        priceLabel.text = "\(formatNumber(item.price))원"
        
        numOfChatLabel.text = "\(item.numOfChats)"
        numOfLikeLabel.text = "\(item.numOfLikes)"
    }

    private func formatNumber(_ price: Int) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
//        formatter.numberStyle = .currencyPlural
//        formatter.locale = Locale(identifier: "ko-KR")
        let result = formatter.string(from: NSNumber(integerLiteral: price)) ?? ""
        return result
    }

 

Kingfisher download

Kingfisher: 원격 저장소,  쉽게 말해서 고유의 URL 주소를 가지고 있는 이미지를 앱 내에서 보여지게 해주는 라이브러리

project에서 CarrotHomeTab 선택, 상단바 Package Dependencies 선택, + 버튼 눌러서 Searching All Sources

혹은 File > Add Packages...

패키지 파일 존재하지 않음, 별도 다운로드 필요

 

File > Swift Packages > Add Package Dependency
Add https://github.com/onevcat/Kingfisher.git
Select "Up to Next Major" with "7.0.0"

 

https://github.com/wwood/kingfisher-download

 

GitHub - wwood/kingfisher-download: Easier download/extract of FASTA/Q read data and metadata from the ENA, NCBI, AWS or GCP.

Easier download/extract of FASTA/Q read data and metadata from the ENA, NCBI, AWS or GCP. - GitHub - wwood/kingfisher-download: Easier download/extract of FASTA/Q read data and metadata from the EN...

github.com

git clone https://github.com/wwood/kingfisher-download
cd kingfisher-download
conda env create -n kingfisher -f kingfisher.yml
conda activate kingfisher
cd bin
export PATH=$PWD:$PATH
kingfisher -h

Swift 내장 패키지 파일이 아니므로 Add Local... 불가

해당 URL 입력하여 download

https://github.com/wwood/kingfisher-download

다시 설치

https://github.com/onevcat/Kingfisher

 

GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web.

A lightweight, pure-Swift library for downloading and caching images from the web. - GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web.

github.com

Dependency Rule: Up to Next Major Version

import Kingfisher

        thumbnail.kf.setImage(
            with: URL(string: item.thumbnailURL),
            placeholder: UIImage(systemName: "hands.sparkles.fill")
        )

다음과 같이 생성(완료)


Storyboard에서 바로 깨어난 시점에서, 이미지의 모서리를 둥글게 설정

    override func awakeFromNib() {
        super.awakeFromNib()
        thumbnail.layer.cornerRadius = 10
        thumbnail.layer.masksToBounds = true
        thumbnail.tintColor = .systemGray
    }

잘못된 URL(이미지가 있는 서버 URL이 아닌)를 선택했을 때, place holder가 보여야 함

        thumbnail.kf.setImage(
//            with: URL(string: item.thumbnailURL),
            with: URL(string: ""),
            placeholder: UIImage(systemName: "hands.sparkles.fill")
        )

 

 

728x90
728x90
728x90
반응형

[Review] (6주차) 실습

2022.07.22 - [Development/Swift] - [Swift] iOS 앱 개발(Xcode) Byte Degree - week.06

 

[Swift] iOS 앱 개발(Xcode) Byte Degree - week.06

[Review] (5주차) 실습 2022.07.16 - [Dev/Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.05 [Xcode] iOS Swift 앱 개발 Byte Degree - week.05 [Review] (4주차) 실습 2022.07.10 - [Dev/Swift] - [Xco..

sarahee.tistory.com


당근 페이지(CarrotHomeTab)

Class: HomeViewController, DetailViewController 구성 (Subclass: UIViewController)

Main의 View Controller에서 상단바 Editor > Embed In > Navigation Controller / Tab Bar Controller 클릭

Class: MainNavigationViewController(UINavigationController), MainTabBarController(UITabBarController)

이후 Class 연결

DetailViewController의 Storyboard는 별도로 생성

    @IBAction func ctaButtonTapped(_ sender: Any) {
        let sb = UIStoryboard(name: "Detail", bundle: nil)
        let vc = sb.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
        navigationController?.pushViewController(vc, animated: true)
    }

실행했을 때 다음과 같은 에러 발생

Main의 entry point 설정

우측 Is Initial View Controller 체크 및 좌측 시작 화살표 확인

다시 실행하면 다음과 같이 UI 생성

Navigation Bar 조절 및 하단 이미지 등 UI 변경

홈: HomeViewController

동네 생활: MyTownViewController 생성 및 연결

내 근처 (설정하지 않음)

채팅: ChatViewController 생성 및 연결

나의 당근: MyProfileViewController 생성 및 연결

 

추가 구성

탭이 눌릴 때마다, 그에 맞는 네비게이션 바를 구성하고자 함
- 탭이 눌리는 것을 감지
- 감지 후에, 그 탭에 맞게 네비게이션 바 구성 업데이트 필요

import UIKit

class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "hello", style: .plain, target: nil, action: nil)
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
        
        delegate = self
    }
}

extension MainTabBarController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        print("--> 어떤 vc가 선택:\(viewController)")
        
        switch viewController {
        case is HomeViewController:
            let titleItem = UIBarButtonItem(title: "정자동", style: .plain, target: nil, action: nil)
            let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItem = feedItem
            
        case is MyTownViewController:
            let titleItem = UIBarButtonItem(title: "정자동", style: .plain, target: nil, action: nil)
            let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItem = feedItem
            
        case is ChatViewController:
            let titleItem = UIBarButtonItem(title: "채팅", style: .plain, target: nil, action: nil)
            let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItem = feedItem
            
        case is MyProfileViewController:
            let titleItem = UIBarButtonItem(title: "나의 당근", style: .plain, target: nil, action: nil)
            let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItem = feedItem
            
        default:
            let titleItem = UIBarButtonItem(title: "당근 당근", style: .plain, target: nil, action: nil)
            let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItem = feedItem
        }
    }
}

CustomBarItem 생성

MainTabBar 구성 변경하여 좌측 상단 text UI 설정


우측 상단 Item 개수 조절

MainTabBarController, delegate = self 하단에...

// 각 탭에 맞게 네비게이션바 아이템 구성하기
// - 홈: 타이틀, 피드, 서치
// - 동네활동: 타이틀, 피드
// - 내 근처: 타이틀
// - 채팅: 타이틀, 피드
// - 나의 당근: 타이틀, 설정

let searchConfig = CustomBarItemConfiguration(image: UIImage(systemName: "magnifyingglass"), handler: { print("--> search tapped") })
let searchView = CustomBarItem(config: searchConfig)
let searchItem = UIBarButtonItem(customView: searchView)

let feedConfig = CustomBarItemConfiguration(image: UIImage(systemName: "bell"), handler: { print("--> feed tapped") })
let feedView = CustomBarItem(config: feedConfig)
let feedItem = UIBarButtonItem(customView: feedView)

하단 let feedItem 삭제 및 수정

navigationItem.leftBarButtonItem = titleItem
navigationItem.rightBarButtonItems = [feedItem, searchItem]

 

실행하여 search 확인

            let searchConfig = CustomBarItemConfiguration(image: UIImage(systemName: "magnifyingglass"), handler: { print("--> search tapped") })
            let searchView = CustomBarItem(config: searchConfig)
            NSLayoutConstraint.activate([
                searchView.widthAnchor.constraint(equalToConstant: 30)
            ])
            
            let searchItem = UIBarButtonItem(customView: searchView)
            
            let feedConfig = CustomBarItemConfiguration(image: UIImage(systemName: "bell"), handler: { print("--> feed tapped") })
            let feedView = CustomBarItem(config: feedConfig)
            NSLayoutConstraint.activate([
                feedView.widthAnchor.constraint(equalToConstant: 30)
            ])
            
            let feedItem = UIBarButtonItem(customView: feedView)

UIBarButtonItem+CustomView 생성(command + N)

//
//  MainTabBarController.swift
//  CarrotHomeTab
//
//  Created by sehee on 2022/08/24.
//

import UIKit

// 1. 탭이 눌릴 때마다, 그에 맞는 네비게이션 바를 구성하고자 함
// - 탭이 눌리는 것을 감지
// - 감지 후에, 그 탭에 맞게 네비게이션 바 구성 업데이트 필요


// 3. 앱이 시작할 때, 네비게이션바 아이템 설정을 완료하고 싶음
// - 네비게이션 바를

class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        updateNavigaitionItem(vc: self.selectedViewController!)
        //self.selectedIndex
        //self.selectedViewController
    }
    
    private func updateNavigaitionItem(vc: UIViewController) {
        switch vc {
        case is HomeViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "정자동",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let searchConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "magnifyingglass"),
                handler: { print("--> search tapped") })
            
            let searchItem = UIBarButtonItem.generate(with: searchConfig, width: 30)
            
            let feedConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "bell"),
                handler: { print("--> feed tapped") })
            let feedItem = UIBarButtonItem.generate(with: feedConfig, width: 30)
            
            //let titleItem = UIBarButtonItem(title: "정자동", style: .plain, target: nil, action: nil)
            //let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [feedItem, searchItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        case is MyTownViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "정자동",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let feedConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "bell"),
                handler: { print("--> feed tapped") })
            let feedItem = UIBarButtonItem.generate(with: feedConfig, width: 30)
            
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [feedItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        case is ChatViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "채팅",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let feedConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "bell"),
                handler: { print("--> feed tapped") })
            let feedItem = UIBarButtonItem.generate(with: feedConfig, width: 30)
            
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [feedItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        case is MyProfileViewController:
            let titleConfig = CustomBarItemConfiguration(
                title: "나의 당근",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            let settingConfig = CustomBarItemConfiguration(
                image: UIImage(systemName: "magnifyingglass"),
                handler: { print("--> setting tapped") })
            
            let settingItem = UIBarButtonItem.generate(with: settingConfig, width: 30)
            
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = [settingItem]
            navigationItem.backButtonDisplayMode = .minimal
            
        default:
            let titleConfig = CustomBarItemConfiguration(
                title: "정자동",
                handler: { })
            
            let titleItem = UIBarButtonItem.generate(with: titleConfig)
            
            //let titleItem = UIBarButtonItem(title: "정자동", style: .plain, target: nil, action: nil)
            //let feedItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
            navigationItem.leftBarButtonItem = titleItem
            navigationItem.rightBarButtonItems = []
            navigationItem.backButtonDisplayMode = .minimal
        }
    }
}

// 2. 각 탭에 맞게 네비게이션바 아이템 구성하기
// - 홈: 타이틀, 피드, 서치
// - 동네활동: 타이틀, 피드
// - 내 근처: 타이틀
// - 채팅: 타이틀, 피드
// - 나의 당근: 타이틀, 설정

extension MainTabBarController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        print("--> 어떤 vc가 선택:\(viewController)")
        
        updateNavigaitionItem(vc: viewController)
    }
}

내비게이션 바 UI 설정

//
//  MainNavigationViewController.swift
//  CarrotHomeTab
//
//  Created by sehee on 2022/08/24.
//

import UIKit

class MainNavigationViewController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let backImage = UIImage(systemName: "arrow.backward")
        navigationBar.backIndicatorImage = backImage
        navigationBar.backIndicatorTransitionMaskImage = backImage
        navigationBar.tintColor = .white
    }
}

 

 

728x90
728x90
728x90
반응형
목차
1. 반복문
2. for-sequence문
3. for-range()문
  1) range()
  2) for-range(a, b)
  3) for-range(a)
4. while
  1) 변수 수정
  2) break문

[Review] (3주차) 리스트

2022.07.28 - [Development/Python] - [Python] 03 리스트 - week.03

 

[Python] 03 리스트 - week.03

목차 1. 리스트 활용 1) append(d) 2) insert(i, d) 3) remove(d) 4) sort() 2. 시퀀스 자료형 1) 인덱싱, 슬라이싱 2) in: 멤버 조회 3) len: 길이 확인 4) 연결(+), 반복(*) [Review] (2주차) 조건문 2022.07.22..

sarahee.tistory.com


1. 반복문

어떠한 조건이나 범위 내에서 어떠한 명령을 반복적으로 수행하는 것


2. for-sequence문

Point I
원소로 반복하는 방법
시퀀스의 원소를 하나씩 변수에 넣어가면서 명령 실행

nums = [1, 2, 3, 4, 5]
for i in nums:
    print(2*i)
        
## 실행 결과 ##
2
4
6
8
10

3. for - range()문

Point I
range() : 숫자 시퀀스를 만들어주는 함수

  • range(a, b) : a 이상 b 미만의 숫자 시퀀스를 만들어 줌
  • range(a) : 0이상 a미만의 숫자 시퀀스를 만들어줌

Point II
for-range(a, b)범위로 반복 (a 이상 b 미만)

#1 이상 11 미만의 범위 반복
for i in range(1, 11): 
    print(i)
    
## 실행 결과 ##
1
2
...
9
10

Point III
for-range(a) : 횟수로 반복 (a번)

#5회 반복
for i in range(5): 
    print("안녕!")
        
## 실행 결과 ##
안녕!
안녕!
안녕!
안녕!
안녕!

4. while

Point I
while 조건 : 조건이 True(참)인 동안 명령 실행

num = []
i = 0
while len(num) < 5:
    num.append(i)
    i = i+1
print(num)

## 실행 결과 ##
[0, 1, 2, 3, 4]

Point II
조건이 True일 동안 명령을 수행하므로, 반복이 끝나도록 코드를 작성해야 함
조건식에 들어가는 변수 수정, break문 사용 등이 있음

i = 0
while True: #break가 없다면 무한루프!
    print(i)
    if i >= 10:
        break #i가 10보다 커지면 탈출!
    i = i + 1

## 실행 결과 ##
0
1
2
...
9
10

[Next] (5주차) 기초 자료형2

2022.09.05 - [Development/Python] - [Python] 01 기초 자료형 II - week.05

 

[Python] 01 기초 자료형 II - week.05

목차 1. 시퀀스 활용 1) pop() 2) count() 3) split() 4) join() 2. Tuple(튜플) 3. Dictionary(사전형) 1) range() 2) for-range(a, b) 3) for-range(a) 4. while 1) 변수 수정 2) break문 [Review] (4주차) 반복..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

디렉토리 내 실행 파일이 있음에도 파일을 찾지 못하는 경우

bash: ./[실행할 파일]: No such file or directory

64bit OS에서 32bit library 설치 없이, 32bit를 사용하는 실행 파일을 사용할 경우 발생

혹은 library 파일 연결이 불가한 경우

CPU: 64bit
File: 32bit

실행 파일과 CPU 포맷이 달라서 생기는 오류

sudo dpkg --add-architecture i386
sudo apt-get update

 

1) 패키지 설치(64bit에서도 32bit 파일을 실행할 수 있도록)

$ sudo apt-get install libc6-i386 lib32gcc1

dpkg: unrecoverable fatal error, aborting:
 files list file for package 'librpmio8' is missing final newline
E: Sub-process /usr/bin/dpkg returned an error code (2)

해결방안: librpmio8 목록 파일을 다시 만들어줌

sudo apt-get install --reinstall --download-only librpmio8

파일명 확인: librpmio8_4.14.2.1+dfsg1-1build2_amd64.deb

root@ubuntu:/var/cache/apt/archives# ls | grep librpmio8
librpmio8_4.14.2.1+dfsg1-1build2_amd64.deb
dpkg -c /var/cache/apt/archives/librpmio8_4.14.2.1+dfsg1-1build2_amd64.deb | \
awk '{if ($6 == "./"){ print "/."; } else if \
(substr($6, length($6), 1) == "/"){print \
substr($6, 2, length($6) - 2); } else { print \
substr($6, 2, length($6) - 1);}}' > \
/var/lib/dpkg/info/librpmio8.list

 

debugedit 패키지 파일 error에 대해, 동일하게 설정

debugedit_4.14.2.1+dfsg1-1build2_amd64.deb

dpkg -c /var/cache/apt/archives/debugedit_4.14.2.1+dfsg1-1build2_amd64.deb | \
awk '{if ($6 == "./"){ print "/."; } else if \
(substr($6, length($6), 1) == "/"){print \
substr($6, 2, length($6) - 2); } else { print \
substr($6, 2, length($6) - 1);}}' > \
/var/lib/dpkg/info/debugedit.list

libpython2.7:amd64 파일, ...

dpkg -c /var/cache/apt/archives/libpython2.7-stdlib_2.7.18-1~20.04.3_amd64.deb | \
awk '{if ($6 == "./"){ print "/."; } else if \
(substr($6, length($6), 1) == "/"){print \
substr($6, 2, length($6) - 2); } else { print \
substr($6, 2, length($6) - 1);}}' > \
/var/lib/dpkg/info/libpython2.7:arm64.list


libpython2.7_2.7.18-1~20.04.3_amd64.deb
libpython2.7-minimal_2.7.18-1~20.04.3_amd64.deb
libpython2.7-stdlib_2.7.18-1~20.04.3_amd64.deb
Try to fix it with

# rm /var/lib/dpkg/info/libopenjp2*
# dpkg --configure -a
# apt update
# apt upgrade

After that run Plesk update fix with:

# plesk installer --select-release-current --reinstall-patch --upgrade-installed-components

 

실행이 불가한 경우,

2) 64비트에서 32비트 컴파일이 동작 가능하도록 패키지 설치

$ sudo apt-get install ia32-libs g++-multilib

3) 추가 설치

$ sudo apt-get install lib32ncurses5, g++-multilib

정상 설치 및 실행

 

 

728x90
728x90

'Development > error' 카테고리의 다른 글

[Error] Ubuntu yum 설치 오류_Command 'yum' not found  (0) 2022.07.15
728x90
반응형
목차
1. 리스트 활용
  1) append(d)
  2) insert(i, d)
  3) remove(d)
  4) sort()
2. 시퀀스 자료형
  1) 인덱싱, 슬라이싱
  2) in: 멤버 조회
  3) len: 길이 확인
  4) 연결(+), 반복(*)

[Review] (2주차) 조건문

2022.07.22 - [Development/Python] - [Python] 02 조건문 - week.02

 

[Python] 02 조건문 - week.02

목차 1. 입력 1) 변수 2) 형 변환 2. 논리 자료형(Boolean Data) 1) 논리 자료형 2) 비교 연산자 3) 논리 연산자 3. 조건문 1) if문 2) elif문 3) else문 [Review] (1주차) 기초 자료형 2022.07.10 - [Dev/Python]..

sarahee.tistory.com


1. 리스트 활용

Point I
list.append(d) : 자료 d를 list의 마지막 원소 뒤에 추가

alphabet = ['A', 'B', 'C']
alphabet.append('D')
print(alphabet)

## 출력 결과 ##
['A', 'B', 'C', 'D']

Point II
list.insert(i, d) : 인덱스 i에 자료 d를 삽입

num_eng = ["one", "two", "four", "five"]
num_eng.insert(2, "three")
print(num_eng)

## 출력 결과 ##
["one", "two", "three", "four", "five"]

Point III
list.remove(d) : 인덱스 0부터 조회하여 처음 나오는 자료 d를 제거

ice_cream = ["Mother is Alien", "Mint Choco", "NY Cheese Cake", "Mint Choco"]
ice_cream.remove("Mint Choco")
print(ice_cream)

## 실행 결과 ##
["Mother is Alien", "NY Cheese Cake", "Mint Choco"]

Point IV
list.sort() : 리스트를 오름차순/사전순으로 정렬

digit = [0, 3, 6, 9, 1, 4, 7, 2, 5, 8]
digit.sort()
print(digit)

## 실행 결과 ##
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2. 시퀀스 자료형

Point I
순서가 있는 자료형 → 리스트, 문자열 등이 이에 속함

Point II
인덱싱, 슬라이싱이 가능

prime_num = [2, 3, 5, 7, 9, 11]
prime_num[0] 
# 2

prime_num[1:4] 
# [3, 5, 7]
...

Point III
멤버 조회 in

prime_num = [2, 3, 5, 7, 9, 11]
2 in prime_num  
#True

4 in prime_num  
#False

Point IV
길이 확인 len

word = "Antidisestablishmentarianism"
len(word)  
#28

Point V
연결(+)반복(*)

mouse = ["Mickey"]
mice = mouse + ["Minnie"]  
#["Mickey", "Minnie"]

disney = ["Mickey"]*3 
#["Mickey", "Mickey", "Mickey"]

[Next] (4주차) 반복문

2022.08.08 - [Development/Python] - [Python] 04 반복문 - week.04

 

[Python] 04 반복문 - week.04

목차 1. 반복문 2. for-sequence문 3. for-range()문 1) range() 2) for-range(a, b) 3) for-range(a) 4. while 1) 변수 수정 2) break문 [Review] (3주차) 리스트 2022.07.28 - [Development/Python] - [Python]..

sarahee.tistory.com

 

728x90
728x90

+ Recent posts