업데이트(2019.03.15): 사례 추가 및 객체를 이용한 코드로 변경

Java List에서 for문을 사용할 때 index를 가져오는 방법을 알아보자


환경

  • Java


상황

  • for-each문을 이용해 반복문을 실행할 때 객체의 index를 알고 싶은 상황
  • 앱을 개발할 때 sqlite3를 통해서 음악 자료들을 가져와서 ArrayList에 객체로 담아두었을 때 특정 조건에 해당하는(조건문을 통해) 객체들의 Index를 가져오고 싶은 상황에서 아래 코드로 개선하였습니다.
  • 사실, for-each가 아닌 일반적인 for문을 이용하면 해당 i번째를 index로 이용하면 됩니다.
  • 다음 아래와 같은 Class가 있고 해당 Class로 객체를 만들었다고 가정
public class Test{
    String name;
    String strVal;
    int intVal;
    public Test(){

    }
    public Test(String name, String strVal, int intVal){
        this.name = name;
        this.strVal = strVal;
        this.intVal = intVal;
    }
}


(방법1) ArrayList에서 객체의 index 가져오기

index 변수를 이용

  • 반복문을 진행하기 전에 index라는 변수를 선언하고 반복문을 진행하면서 index를 증가시킵니다.

// 객체들을 담는 리스트
ArrayList<Test> arrayList = new ArrayList<Test>();
// index를 저장할 리스트(특별한 용도는 없이 본문에서는 index를 저장하기 위해 사용)
ArrayList<Integer> arrayIndexList = new ArrayList<Integer>();

// index 변수를 선언
int index = 0;
for (Test element : arrayList){
    if(element.intVal == 3){
        arrayIndexList.add(index);
    }
    // index 증가
    index++;
}


(방법2) ArrayList에서 객체의 index 가져오기

indexOf 함수를 이용

  • 특정 객체를 참조하는 변수가 있을 때 해당 변수를 사용하면 indexOf(객체변수)를 이용해서 해당 객체의 index를 자료구조 안에서 찾을 수 있습니다.
  • indexOf()함수는 자료구조에서 하나하나 객체와 비교해가면서 값을 찾기 때문에 O(n)의 복잡도를 갖게 되며 for-each를 사용할 때 객체의 index를 알고 싶다면 위에 (방법1)을 쓰는 방향이 좋다고 합니다.

// 객체들을 담는 리스트
ArrayList<Test> arrayList = new ArrayList<Test>();
// index를 저장할 리스트(특별한 용도는 없이 본문에서는 index를 저장하기 위해 사용)
ArrayList<Integer> arrayIndexList = new ArrayList<Integer>();

for (Test element : arrayList){
    if(element.intVal == 3){
        // 아래처럼 indexOf(객체) 함수를 이용
        arrayIndexList.add(arrayList.indexOf(element));
    }
}


참고자료

Short Circuit Evaluation에 대해서 간단하게 알아보자


환경

  • C, C++


Short Circuit Evaluation이란?

  • Short Circuit Evaluation이란 AND 혹은 OR의 연산에 있어서 결과가 확실하게 예측이 되었을 때 뒤에 나머지 연산을 실행하지 않고 답을 내버리는 경우를 의미합니다.


AND 연산의 경우

  • AND연산의 경우에 false가 우선 나와버리면 AND 뒤에 나오는 연산은 생략이됩니다.

OR 연산의 경우

  • OR연산의 경우에 true가 우선 나와버리면 OR 뒤에 나오는 연산은 생략이됩니다.


Short Circuit Evaluation 예제

구체적인 예시는 아래 코드와 같습니다.

AND 연산의 경우

#include <stdio.h>

int main (){
	int pass = 0;
	int i = 0;

	if(pass && i++){} //i++이 실행되지 않습니다.

	printf("pass: %d i: %d\n", pass, i);

	return 0;
}

결과는 아래와 같습니다.

$ ./and_example
$ pass: 0 i: 0


OR 연산의 경우

#include <stdio.h>

int main (){
	int pass = 1;
	int i = 0;

	if(pass || i++){} //i++이 실행되지 않습니다.

	printf("pass: %d i: %d\n", pass, i);

	return 0;
}

결과는 아래와 같습니다.

$ ./or_example
$ pass: 1 i: 0

Kingfisher를 사용할 때 요청 url에 한국어가 들어가 있을 때 어떻게 처리하는지 알아보자


환경

  • Swift
  • Cocoa Pods
  • Xcode and Emulator


Kingfisher

Kingfisher란 홈페이지에 있는 문구를 인용하면 “A lightweight, pure-Swift library for downloading and caching images from the web.”라고 나와있다.

아주 간단하게 웹에 있는 url을 통해서 이미지를 불러오는 라이브러리라고 할 수 있습니다.

아주 간단한 예는 아래와 같습니다.

example.swift


let url = URL(string: "url_of_your_image")
imageView.kf.setImage(with: url)


Kingfisher에서 요청 할 때 url에 한국어가 포함되어 있을 때

프로젝트를 진행하는데 url에 한국어가 있을 때 이미지를 로딩하지 못하는 상항이 발생하였는데 다음 아래와 같이 간단한 코드를 통해서 해결이 가능하다. addingPercentEncoding을 이용하면 된다.

example.swift


// 원하는 urlString을 addingPercentEncoding을 통해 바꿔줍니다.
let urlString = urlString?.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)

// 그 후 원하는 ImageView에 적용시키시면 됩니다.
imageView.kf.setImage(with: URL(string: urlString), placeholder: defaultImg, options: [.transition(ImageTransition.fade(0.5))])

Circle CI에서 코드에서 실행된 결과물을 이미지로 저장해보자


환경

  • Python
  • Selenium
  • Circle CI and Project


Circle Artifact

Circle CI에서 원할 때 화면을 캡처해서 저장할 수 있다.

기본적으로 Circle CI에서 CIRCLE_ARTIFACTS라는 환경변수를 따로 저장해두는데 이 환경변수 값을 불러와서 저장이 가능하다. 사진을 저장하는 예제는 아래와 같다.

  • os.environ['CIRCLE_ARTIFACTS'] + '/name.png'의 형식에서 name.png에 다른 이름 형식을 넣어서 원하는 형식으로 저장 할 수 있다.

example.py

if 'CIRCLE_ARTIFACTS' in os.environ:
    # dirver = Selenium Web Browser
    driver.get_screenshot_as_file(os.environ['CIRCLE_ARTIFACTS'] + '/name.png')


참고자료

Nginx에서 sites-available 폴더에 .conf 파일을 추가해서 가상서버를 만들어보자.


환경 및 선수조건

  • Nginx(nginx/1.10.0 (Ubuntu))
  • Nginx의 기본 사용법 및 서버 블록에 대한 이해


Nginx의 기본 파일과 폴더들

Ubuntu에서 apt-get을 통해 nginx 설치하기 및 간단한 정리에서 간단하게 정리를 해두긴 했지만 설정을 하기에 앞서서 간단하게 몇가지 기본 폴더들과 파일들을 보고 가겠습니다.

  • sites-available: 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분입니다. 가상 서버를 사용하거나 사용하지 않던간에 그에 대한 설정 파일들이 위치하는 곳입니다.
  • sites-enabled: sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더입니다. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅합니다.
  • nginx.conf: Nginx에 관한 설정파일로 Nginx 설정에 관한 블록들이 작성되어 있으며 이 파일에서 sites-enabled 폴더에 있는 파일들을 가져옵니다.


nginx 가성서버 파일 생성

위에서 말씀드린대로 sites-available에 가상 서버 환경 파일을 작성하시면 됩니다.

가상 서버 환경 파일을 만들고 vim으로 열어줍니다.

$ cd /etc/nginx/sites-available
$ sudo touch [virtual_server_conf_file_name]
$ sudo vim [virtual_server_conf_file_name]


Nginx 가상서버 파일 작성

열어둔 설정 파일에 아래처럼 기본적인 블록들을 작성합니다.

[domain name], [upstream name] 그리고 [web root directory path]는 원하는 서버 환경에 따라서 넣어주시면 됩니다.

간단하게 server block만 추가하면 아래와 같습니다.

virtual_server_conf_file_name(no SSL)

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;

        server_name [domain name];

        location / {
            try_files $uri $uri/ =404;
        }
}


아래는 SSL을 적용한 저희 서비스의 모습입니다.

virtual_server_conf_file_name(SSL)

upstream [upstream name] {
    server unix://[unix socket file path];
}

server {
    listen 443 ssl;

    root [web root directory path];
    index index.html index.htm;

    server_name [domain name];

    # SSL Setting below
    ...
    # SSL Setting above

    location / {
        try_files $uri $uri/ =404;
    }

    location /api {
        ...
    }

    # SSL Setting (Let's Encrypt)
    location ~ /.well-known {
            allow all;
    }
}

server {
    listen 80;
    listen [::]:80;

    server_name [domain name]];
    return 301 https://$host$request_uri;
}


이제 sites-available에 있는 파일들에 대해서 sites-enabled에 symlink를 추가합시다.

$ cd /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/[config file name] /etc/nginx/sites-enabled/
$ sudo ln -s /etc/nginx/sites-available/[config file name] /etc/nginx/sites-enabled/


Nginx 재시작하기

이제 Nginx에 문법이 제대로 되어있는지 확인하고 재시작을 합니다.

제대로 재시작이 완료가 되면 OK라고 나와야 합니다.

$ sudo nginx -t

// 재시작은 아래에 있는 명령어 중 하나로 실행하시면 됩니다.
$ sudo service nginx restart
$ sudo systemctl restart nginx
$ sudo /etc/init.d/nginx restart