# 5분만에 보는 Swift 인트로

Udacity의 강좌 Intro to iOS App Development with Swift 내용중 Swift에 대한 내용을 정리함



# 목차

1. 변수

2. 조건문

3. 클래스

4. 함수



1. 변수

// Variables

let y = 100             // 상수


var x1:Int = 42         // Int 변수

var x2 = 42             // Int 생략할 있다.


var myString = "Hello"  // string 객체 변수



2. 조건문

// Control Flow

if x < 50 {

    print("x is", x, "and less then 50")

} else {

    print("x is", x, "and greater then or equal to 50")

}



3. 클래스

// Classes

class ViewController : UIViewController {   // class [클래스명] : [상속받을 클래스명]

    // Instance Variables go here

    // Class functions go here

}



4. 함수

// Functions

func printMessage(message : String) {       // func [함수명]([인자명]: [인자타입]) { // 구현부 }

    print(message)

}

printMessage(message: "Oi!")                // 함수명([인자명]: [인자값])



더 많은 Swift 관련 강의가 필요하면

Learn Swift Programming Syntax

를 참조해주세요. (물론 다른강의도 많습니다.)



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

Reference

- https://www.udacity.com/course/intro-to-ios-app-development-with-swift--ud585


'Program Languages > Swift' 카테고리의 다른 글

5분만에 보는 Swift 인트로  (0) 2018.06.05


# 자주 쓸 것 같은 Third-party packages 메모



# 강의에서 추천


  • IPython - A better interactive Python interpreter
  • requests - Provides easy to use methods to make web requests. Useful for accessing web APIs.
  • Flask - a lightweight framework for making web applications and APIs.
  • Django - A more featureful framework for making web applications. Django is particularly good for designing complex, content heavy, web applications.
  • Beautiful Soup - Used to parse HTML and extract information from it. Great for web scraping.
  • pytest - extends Python's builtin assertions and unittest module.
  • PyYAML - For reading and writing YAML files.
  • NumPy - The fundamental package for scientific computing with Python. It contains among other things a powerful N-dimensional array object and useful linear algebra capabilities.
  • pandas - A library containing high-performance, data structures and data analysis tools. In particular, pandas provides dataframes!
  • matplotlib - a 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments.
  • ggplot - Another 2D plotting library, based on R's ggplot2 library.
  • Pillow - The Python Imaging Library adds image processing capabilities to your Python interpreter.
  • pyglet - A cross-platform application framework intended for game development.
  • Pygame - A set of Python modules designed for writing games.
  • pytz - World Timezone Definitions for Python




# Third-party packages 버전 고정법

- 하나의 서드파티 패키지도 여러개의 버전으로 나뉘고 이로인해 문제가 생기는 경우 고정해서 쓴다.

- requirements.txt 파일을 만들어서 고정할 패키지와 버전의 list를 나열한다.

beautifulsoup4==4.5.1
bs4==0.0.1
pytz==2016.7
requests==2.11.1

- 이것을 python에 반영한다.

$ pip3 install -r requirements.txt



Reference:

- https://classroom.udacity.com/courses/ud1110

  1. blueeast 2020.11.17 17:23

    도움되는 글 잘 보고 가여

# 자주 쓸 것 같은 Python Standard libraries 메모



# Python Standard library: https://docs.python.org/3/library/



# 강의에서 추천


  • csv: very convenient for reading and writing csv files
  • collections: useful extensions of the usual data types including OrderedDictdefaultdict and namedtuple
  • random: generates pseudo-random numbers, shuffles sequences randomly and chooses random items
  • string: more functions on strings. This module also contains useful collections of letters like string.digits (a string containing all characters with are valid digits).
  • re: pattern-matching in strings via regular expressions
  • math: some standard mathematical functions
  • os: interacting with operating systems
  • os.path: submodule of os for manipulating path names
  • sys: work directly with the Python interpreter
  • json: good for reading and writing json files (good for web work)




# 상황별

1. 날짜와 시간 관련: datetime

   - https://docs.python.org/3/library/datetime.html



2. 현재의 working directory 바꾸기: os

   os.chdir(path)

   - https://docs.python.org/3/library/os.html



3. csv파일 읽기: csv

>>> import csv
>>> with open('eggs.csv', newline='') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

  - https://docs.python.org/3/library/csv.html



4. zip 파일 압축해제: zipfile

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

   - https://docs.python.org/3/library/zipfile.html



5. 실행시간 측정: cProfile

   - https://docs.python.org/3/library/profile.html

   - 작은 수행일때는 timeit도 많이 쓴다.

      https://docs.python.org/3/library/timeit.html



Reference:

- https://classroom.udacity.com/courses/ud1110

- https://docs.python.org/3/library/

virtualenv에 OpenAI gym 설치하기(MAC OS)



1단계: virtualenv로 가서 pip 명령을 이용해 설치한다.

$ source [설치한 경로]/bin/activate

(설치폴더이름) $ pip3 install gym

이렇게 하면 minimal 로 설치가 되며 이 단계 만으로 실행할 수 있는 환경은 다음과 같다.

- algorithmic

- toy_text

- classic_control (you'll need pyglet to render though)



끝.

2단계: atari 등은 성공하면 업데이트 예정.



reference:

https://github.com/openai/gym

# Python 언어 Syntax 요약(feat. Java)

간략히 Java를 기준으로 염두해 두어야 할 것들을 정리해본다.



0. 주석(comment)

 의미 

 Python

 비고

 한줄 주석

 # Python

 // Java

 여러줄 주석

 ''' Python '''

 """ Python """

 /* Java */



1. 연산자(Operator)

 의미

 Python

 비고

 덧셈, 뺄셈, 곱셈 나눗셈 등

 아래 나열되지 않는 대부분의 것들

 Java와 동일

 - 나눗셈을 하면 Float이 된다. Java처럼 int로 나오고 싶으면 // 이렇게 두번 쓰면 된다.

 

 제곱(거듭제곱)

 ** 라는 연산기호가 있다.

 Java에서는 Math.pow()를 사용하는 편

 연산자 Convention

 덧셈, 뺄셈같은 상대적 후순위 계산은 띄어쓰기를 하고

 곱셈, 나눗셈은 띄어쓰기 하지 않는다.

 ex) 1 + 2*3




2. 자료형

 의미 

 Python

 비고

 Integer, Float

 Integer, Float으로 double이나 short, char 같은 개념을 통합했다.

 하지만 선언시 자료형을 미리 정의하지 않는다.

 float의 경우는 2진수로 표현할 수 있는 근사값 형태로 저장되는데 이 때문에 10진수를 2진수로 변환할 때 생기는 loss가 있다.

 ex) 0.1 + 0.1 + 0.1 != 0.3

 

 Boolean

 대문자로 시작하는 True, False를 쓴다.

 하지만 선언시 자료형을 미리 정의하지 않는다.

 부정을 표현할때 "!" 대신 "not" 을 쓴다.


 String

 string(immutable)

 Java와 달리 ''로도 String을 묶을 수 있다(큰따옴표, 작은따옴표 둘다 동일하게 사용)

 특이하게도 string을 곱셈할 수 있는데 "hippo" *3 하면

"hippohippohippo" 가 된다.

 

 list

 tuple(immutable), list(mutable) 두가지 형태가 built-in으로 존재한다.

 - 서로 형변환 할 수 있다.

 1. list

 - list[start_index : end_index] 라는 구역의 개념으로 slicing과 replacing이 가능하다

 - list의 요소를 쉽게 찾아볼 수 있다.

    ex) if a in some_list:

 2. tuple

 - return 인자가 여러개 일때 이 형태로 보내주는 것이고 이렇게 Unpacking이 쉽다.

 Linked-list가 속도가 낫냐 Array-list가 낫냐 같은 결정은 그리 중요하지 않다는 뜻인가 보다...

 Set

 set 라는 명칭으로 built-in 되어 있다.

 list처럼 for 문을 돌 수 있다.

 ex) for item in set:

 이제 어떤 Set을 쓰느냐는 중요하지 않은 것이다...

 Map

 dictionary 라는 명칭으로 built-in 되어 있다.

 list처럼 for 문을 돌 수 있다.

 ex) for item in set: >> key가 하나씩 된다.

 이제 어떤 Map을 쓰느냐는 중요하지 않은 것이다...



3. Built-in Method:  built-in method로 대부분 해결이 된다.

 의미

 Python

 비고

 length

 len(): 문자열의 길이, 배열의 길이 등을 잰다

 

 type check

 type(): 자료형 type을 본다

 

 type casting

 int() 등: 자료형을 casting하고 string -> int 같은 변환도 담당한다.

 

 String 변형

 String 내부 method도 있으니 찾아서 활용하면 된다.

 - .count([찾을단어]): 찾을단어가 몇번 들어갔는지...

 - etc...

 https://docs.python.org/3/library/stdtypes.html#string-methods

 List에서 max/min 값 찾기

 max() / min()

 

 정렬

 sorted()

 Quick, Merge, Bubble 뭐 이런건 의미 없구나...

 string 배열 하나로 합치기

 [join 할때 사이에 들어갈 string].join([join시킬 string 배열])

 ex) "-".join(["This", "is", "Sparta"])

      This-is-Sparta

 - 배열에 int 같은거 들어가 있으면 오류남. string-only list

 Java에서는 StringBuilder로 해결했던 편...

 string에 단어 첫글자 대문자로 변경

 [space가 들어간 string].title()

 ex) "first last".title()

       First Last

 



4. 조건문, 반복문, brace: 이것은 예제를 보는것이 낫다.

 의미

 Python 

 Java

 brace

 특정 조건에 대한 ":" 그 밑의 탭(Indentation) 들어간 것으로 구분

 {}로 묶음

 if

 if [조건]:

 if ([조건])

 for

 for item in input_list:

 for i in range(100):

 for each 처럼 쓰거나

 for (int i = 0; i < 100; i++) 처럼 쓰거나...




Reference:

- Introduction to Python: https://www.udacity.com/course/introduction-to-python--ud1110


Custom Annotation 만들기



Gson 이라는 클래스를 쓸때 @SerializedName("fieldName") 라는 쓰는 경우가 있고

이러한 Annotation의 원리가 궁금했다.


1. interface앞에 @를 붙여서 Annotation Interface를 선언한다.

2. Annotation을 구현한다. (Annotation 사용자의 경우)

3. Reflection을 이용하여 객체나 class에서 선언된 필드나 메소드를 찾고 적절한 동작을 구현한다.

의 순서로 접근하면 된다.



1. interface앞에 @를 붙여서 Annotation Interface를 선언한다.

@Inherited

@Documented

@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 JVM에 의해서 참조가 가능합니다.

//@Retention(RetentionPolicy.CLASS) // 컴파일러가 클래스를 참조할 때까지 유효합니다.

//@Retention(RetentionPolicy.SOURCE) // 어노테이션 정보는 컴파일 이후 없어집니다.

@Target({

        ElementType.PACKAGE, // 패키지 선언시

        ElementType.TYPE, // 타입 선언시

        ElementType.CONSTRUCTOR, // 생성자 선언시

        ElementType.FIELD, // 멤버 변수 선언시

        ElementType.METHOD, // 메소드 선언시

        ElementType.ANNOTATION_TYPE, // 어노테이션 타입 선언시

        ElementType.LOCAL_VARIABLE, // 지역 변수 선언시

        ElementType.PARAMETER, // 매개 변수 선언시

        ElementType.TYPE_PARAMETER, // 매개 변수 타입 선언시

        ElementType.TYPE_USE // 타입 사용시

})


public @interface CustomAnnotation {

    

    String name() default "default";

    String value() default "default";

}

- name(), value()가 attribute명이자 getter가 된다.

- default는 필드값을 안채우거나 하나만 쓸때 채워지는 값이다.

- interface위의 필드(Target, Retention 등)는 주석을 보거나 실생활에 쓰이고 있는 case를 참고하는것이 좋겠다.


1-1. 사용사례

 @Override

 package java.lang;

 ...

 @Target(ElementType.METHOD)

 @Retention(RetentionPolicy.SOURCE)

 public @interface Override {

 }

 @SerializedName

 package com.google.gson.annotations;

 ...

 @Retention(RetentionPolicy.RUNTIME)

 @Target({ElementType.FIELD})

 public @interface SerializedName {

     String value();

 }

@Test 

 package org.junit;

 ...

 @Retention(RetentionPolicy.RUNTIME)

 @Target({ElementType.METHOD})

 public @interface Test {

   Class<? extends Throwable> expected() default Test.None.class;

   long timeout() default 0L;

   public static class None extends Throwable {

        private static final long serialVersionUID = 1L;

        private None() {

        }

    }

}

- Override 주석을 보면 그 유명한 Effective Java의 저자 조슈아 블로치(Joshua Bloch)이고 Java 1.5부터 반영된것으로 보인다!!



2. Annotation을 구현한다. (Annotation 사용자의 경우)

public class CustomAnnotationImpl {

    @CustomAnnotation("aaa")

    private String name;


    @CustomAnnotation(value="ccc", name="bbb")

    private String value;


    CustomAnnotationImpl(String name, String value) {

        this.name = name;

        this.value = value;

    }


    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }


    public String getValue() {

        return value;

    }


    public void setValue(String value) {

        this.value = value;

    }


    @CustomAnnotation("print")

    public void printNameAndValue() {

        System.out.println("name=" + name + ", value=" + value);

    }

}

- 1에서처럼 매개변수가 여러개로 선언했으나 @CustomAnnotation("aaa")인 경우는 매개변수 선언 순서상의 마지막에 할당되는 것 같다.



3. Reflection을 이용하여 객체나 class에서 선언된 필드나 메소드를 찾고 적절한 동작을 구현한다.

 Field 찾기

         for (Field field : fieldArray) {

            String fieldName = field.getName();

            CustomAnnotation testAnnotation = field.getAnnotation(CustomAnnotation.class);

            Annotation[] annotationArray = field.getDeclaredAnnotations();

            boolean isAnnotationPresent = field.isAnnotationPresent(CustomAnnotation.class);


            if (testAnnotation != null) {

                field.setAccessible(true);

                

                if (obj != null) {

                    String fieldValue = (String)field.get(obj);

                    field.set(obj, "33");

                    fieldValue = (String)field.get(obj);

                }

            }

        }

 Method 찾기

         for (Method method : methodArray) {

            String methodName = method.getName();

            CustomAnnotation testAnnotation = method.getAnnotation(CustomAnnotation.class);

            Annotation[] annotationArray = method.getDeclaredAnnotations();

            boolean isAnnotationPresent = method.isAnnotationPresent(CustomAnnotation.class);

            

            if (testAnnotation != null) {                

                if (obj != null) {

                    method.invoke(obj);

                }

            }

        }

- 하지만 Reflection은 성능이 좋지 않다는 치명적인 단점이 있다. 매개변수의 타입체킹도 런타임에 되서 위험할 수도 있고...

  잘 쓰면 괜찮다고는 하지만 그만큼 적절한가를 따져야 한다.



위 내용에 대한 코드는 github에서 확인하실 수 있습니다.

https://github.com/ndukwon/Duk_Java_library/tree/master/src/com/duk/lab/java/annotation



Reference:

- http://jdm.kr/blog/216

- https://medium.com/@ggikko/java-%EC%BB%A4%EC%8A%A4%ED%85%80-annotation-436253f395ad

- https://www.javatpoint.com/custom-annotation






'Program Languages > Java' 카테고리의 다른 글

Custom Annotation 만들기  (0) 2017.06.26
Loop 문법과 속도  (0) 2017.06.26

Loop 문법과 속도



필자는 ArrayList를 즐겨쓰기 때문에 for문을 어떻게 쓰건 거의 상관없지만

LinkedList를 쓴다면 for문에 따라 속도영향이 있다.



0. list가 다음과 같이 있다고 가정

List<Integer> linkedList = new LinkedList<>();

List<Integer> arrayList = new ArrayList<>();


for (int i = 0; i < 100000; i++) {

linkedList.add(i);

arrayList.add(i);

}



1. 기본 3항 for문: 'for ( ;  ; )'

for (int i = 0; i < list.size(); i++) {

Integer value = list.get(i);

}

- 시간: 5382ms (arraylist의 경우: 4ms)



2. for each문: 'for (a : A)'

for (Integer value : list) {

}

- 시간: 2ms (arraylist의 경우: 4ms)

- JAVA 5에서 추가됨



3. while + iterator 문: 'while (iterator.hasNext())'

Iterator<Integer> iterator = list.iterator();


while (iterator.hasNext()) {

Integer value = iterator.next();

}

- 시간: 3ms (arraylist의 경우: 3ms)



4. 'forEach()' 문

list.forEach((value) -> {

});

- 시간: 42ms (arraylist의 경우: 46ms)

JAVA 8에서 추가됨

- 조금느릴 수 있지만 Parallel을 지원한다.



5. 결론

- linkedList의 경우: for-each문, while + iterator 문 이 빠르다.

- arrayList의 경우: 크게 차이없다.



위 내용에 대한 코드는 github에서 확인하실 수 있습니다.

https://github.com/ndukwon/Duk_Java_library/blob/master/src/com/duk/lab/java/FundamentalTest.java



Reference:

- https://dzone.com/articles/devoxx-2012-java-8-lambda-and


'Program Languages > Java' 카테고리의 다른 글

Custom Annotation 만들기  (0) 2017.06.26
Loop 문법과 속도  (0) 2017.06.26

객체지향 프로그래밍 (Object Oriented Programming) 의 특징



1. 캡슐화(Encapsulation)

- 은닉화(data hiding)를 포함하는 개념

- data를 private으로 하고 외부에서는 Method에 의한 접근만 허용하는 것

The idea of encapsulation is to keep classes separated and prevent them from having tightly coupled with each other.

- 강한 커플링을 방지하여 분리된 class로 두기 위함 -> 추후 변화에 대한 유연성

- 실사용 예: Hash table



2. 상속(Inheritance)

Inheritance is the mechanism by which an object acquires the some/all properties of another object.

- 다른 객체의 속성이나 기능을 물려받는 개념

- 계층적 구조



3. 다형성(Polymorphism)

Polymorphism is the capability of a method to do different things based on the object that it is acting upon. In other words, polymorphism allows you define one interface and have multiple implementations.

- 하나의 Method(같은이름)의 기능을 다양하게 할 수 있다.

- Overloading을 통해 method의 static 다형성을 지원

- Overriding을 통해 상위 method의 dynamic 다형성을 지원



4. 추상화(Abstraction)

- 유사한 클래스의 공통점을 묶어 하나의 추상클래스로 만드는 것



Reference:

- https://stackify.com/oops-concepts-in-java/

- https://www.tutorialspoint.com/java/java_encapsulation.htm

- http://beginnersbook.com/2013/03/oops-in-java-encapsulation-inheritance-polymorphism-abstraction/



virtualenv에 matplotlib 설치하기(MAC OS)


1단계: virtualenv로 가서 pip 명령을 이용해 설치한다.

$ source [설치한 경로]/bin/activate

(설치폴더이름) $ pip3 install matplotlib

이렇게 하면 알아서 depentent library도 설치해가며 완료가 된다.



2단계: import matplotlib as plt 해도 에러가 난다.

Traceback (most recent call last):

  File "/Users/[user]/workspace/learning_TensorFlow/cpu_python3/learning_lab3_1.py", line 3, in <module>

    import matplotlib.pyplot as plt

  File "/Users/[user]/tf_py_3/lib/python3.6/site-packages/matplotlib/pyplot.py", line 115, in <module>

    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()

  File "/Users/[user]/tf_py_3/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup

    globals(),locals(),[backend_name],0)

  File "/Users/[user]/tf_py_3/lib/python3.6/site-packages/matplotlib/backends/backend_macosx.py", line 19, in <module>

    from matplotlib.backends import _macosx

RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

설치를 했는데 이건 또 뭔가...

이건 https://github.com/dsmbgu8/image_annotate.py/issues/4 에 잘 나와있다.

3단계에서 해결해보자.



3단계: matplotlib의 backend를 변경해준다.

1) 스크립트 상에서

import matplotlib

matplotlib.use('TkAgg')

import matplotlib.pyplot as plt


2) virtualenv bash 상에서

(설치폴더이름) $ echo "backend: TkAgg" >> ~/.matplotlib/matplotlibrc



4단계: matplotlib의 backend가 뭐길래...

- Graph등을 그릴때 Python을 실행하는 환경에 대한 지원을 해주는 부분이고 이것을 입맛대로 골라서 쓰면된다.

  설명대로라면 어떤이는 콘솔에서 띄우고 싶고, 어떤이는 툴에서 띄우고 싶고, 어떤이는 서버에서 띄우고...

  이런 다양한 환경을 지원하는 것이 "backend" 라고 한단다.

- 다양한 backend는 https://matplotlib.org/faq/usage_faq.html 에서 확인할 수 있다.



Reference

- https://github.com/dsmbgu8/image_annotate.py/issues/4

- https://stackoverflow.com/questions/29433824/unable-to-import-matplotlib-pyplot-as-plt-in-virtualenv

- https://matplotlib.org/faq/usage_faq.html

  1. 294boy@gmail.com 2018.02.19 16:46

    슨상님 감사합니다

bash 명령어로 설치한 virtualenv 독립환경 Pycharm과 연결시키기


두가지 방법이 있다.

1. Pycharm으로 virtualenv 독립환경을 생성

2. 이미 만들어진 virtualenv 독립환경을 Pycharm으로 가져오기


1번은 당연하고

2번도 당연하지만 필자에겐 생소해서 정리해 본다.


# Pycharm > Preference > Project:your_project > Project Interpreter > 원하는 Interpreter를 선택



끝.

+ Recent posts