XOR 연산을 자기자신 혹은 0과 했을 때 어떠한 결과가 나타나는지 알아보자


XOR 연산이란?

XOR 연산이란 bit단위에서는 아래의 예시처럼 서로의 비트가 다르면 1 같으면 0의 결과를 나타내는 연산자입니다.

1^1 = 0
1^0 = 1
0^1 = 1
0^0 = 0


XOR 연산을 자신과 했을 때

XOR 연산을 자신과 하면 결과는 0이 됩니다.


int a = 10;

a^=a

printf("%d", a);

결과 :


$ 0


XOR 연산을 0과 했을 때

XOR 연산을 0과 하면 결과는 자기자신이 됩니다.


int a = 10;

a^=0

printf("%d", a);

결과 :


$ 10


업데이트(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')


참고자료