Reference: https://devcenter.heroku.com/articles/getting-started-with-go#deploy-the-app


0. Prepare your github project containing go app

this is mine: https://github.com/ytkang/golang_chat_bot

for newbee, important thing is your folder is going to be under src folder. so, there is no src or pkg folder in  github (related go structure).


if you already have $GOPATH just skip #1, 2 

1. Make some folder whatever you named, I named it "go"

$mkdir go
$cd go


2. Set gopath

go>$export GOROOT=/usr/local/go
go>$export GOPATH=`pwd`
go>$export PATH=$PATH:$GOPATH/bin


3. Login to heroku

you should install this first. 
https://devcenter.heroku.com/articles/getting-started-with-go#set-up

go>$heroku login


4. Get your project into this folder

go>$go get github.com/ytkang/golang_chat_bot

then, whatever there is an error or not,
"go/src/github.com/ytkang/golang_chat_bot" folder is created.

if you got an import like error when you "go get" then, It will be something occurred from your own module.

you should change your import path to solve this.

if you have folder and files like this,

github.com/ytkang/golang_chat_bot/chat.go
github.com/ytkang/golang_chat_bot/jarvis/jarvis.go

and if chat.go imports jarvis.go, then it should be like this

import github.com/ytkang/jarvis O
import ./jarvis X


4. Deploy to heroku!

go/src/github.com/ytkang/golang_chat_bot>$heroku create
go/src/github.com/ytkang/golang_chat_bot>$git push heroku master

if you got "reject" error something like "failed to detect set buildpack" then you should add "godep"


How to godep

$go get -u github.com/tools/godep   // install

go/src/github.com/ytkang/golang_chat_bot>$godep save  // make godep after this you got Godep folder

go/src/github.com/ytkang/golang_chat_bot>$git add -A; git commit -am "godep added" // important! you should apply this to your github

(after this, retry git push heroku master command. It should work!)


last command

go/src/github.com/ytkang/golang_chat_bot>$heroku open









'Go' 카테고리의 다른 글

How to install Golang on centos  (0) 2018.04.12
LITE IDE setup  (0) 2015.01.28
cannot download, $GOPATH not set  (0) 2015.01.28
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,


std::move가 단지 캐스팅일 뿐이라니?

일단, move 구현을 보자

template<typename _Tp> inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

move가 무엇을 하는지 자세히 보니,

static_cast<typename std::remove_reference<_Tp>::type&&>(__t);

진짜 캐스팅뿐이다. 그렇다. source object가 없어지거나 그런거 아니다.

뭐 값을 대입시킬 객체에는 rvalue reference를 넘겨서 메모리주소를 그대로 전달한다고 치고,


이시점에서 궁금한건 오로지하나,

"뭐지? 그럼 기존 객체는 어떻게 없어지는거야?"

알고보니, 그 답은 rvalue reference 생성자와 대입연산자에 있었다.

rvalue reference 생성자와 대입연산자에서는 source object의 메모리 주소를 dest object에 주고

source object는 nullptr처리하거나 하는것이다.

대표적인 예가 std::string 이다.

assign(basic_string&& __str) { this->swap(__str); return *this; }

보면, source와 dest를 swap하고 있다. 따라서 string을 move시켜보면 move당한 놈은 "" 빈스트링을 갖게된다.

그럼 한번 테스트해볼까? 내가 만든 클레스를 move시킨면 어떻게되는지?

repl.it: https://repl.it/FbVT/0

code:

#include <iostream>
#include <stdlib.h>

class TestMe {

public:
TestMe(){ i = nullptr; }
void set(int& k){ i = &k; }
int get(){ return *i; }
void plus(){ (*i)++; }

private:
int* i;
};

int main()
{
        int test1 = 1;
        TestMe t1;
        t1.set(test1);

TestMe t2(std::move(t1));

t2.plus();
std::cout << "t1: " << t1.get() << std::endl;
std::cout << "t2: " << t2.get() << std::endl;

t1.plus();
std::cout << "t1: " << t1.get() << std::endl;
std::cout << "t2: " << t2.get() << std::endl;   

   return 0;

result:

 t1: 2
 t2: 2
 t1: 3
 t2: 3

아마도 이 결과로부터 유추할수있는건, 

std string처럼 swap같은건 없고 메모리는 일단 복사가되었는데 source object에 대한 후처리는 없다는 것이다. 

따라서 default move constructor가 어떻게 작동하는지 이해하고, 맘에 안든다면 직접 구현해야한다.



References

1) std::string source

2) std::remove_reference

3) What are rvalues, lvalues, xvalues, glvalues, and prvalues?


블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

gunicorn vs uwsgi

python 2017. 1. 20. 19:29

- 보통 퍼포먼스를 보면 아무래도 pure C기반의 uwsgi가 pure python인 gunicorn보다 빨라보입니다. 간혹 uwsgi가 느리다는 비교가있는데 이는 gunicorn은 워커를 gevent로 하면 몽키패치를 지가 app서버에 해버리는데 반해 uwsgi는 app서버 코드에 몽키패치를 해줘야함을 모르고 테스트할 결과로 보여지네요.

- 사용성 측면에서 uwsgi가 좀더 복잡하고 코어 갯수에 따라 configure를 잘못하면 오히려 성능저하가될 우려가 보이네요.

- 도큐먼트는 gunicorn이 훨깔끔


*참고로 gunicorn, uwsgi모두 앞단에 nginx를 쓰는케이스가 많이 있습니다. 이는
DDos 공격방지, static file전송 효율성등때문이라고 합니다. 그리고 gunicorn document에서도 말하고 있는 nginx buffering기능때문입니다. 

nginx에도 설명이 잘나와있지만 nginx buffering에 대해 좀더 설명하자면,

client - nginx - app servers

이 구조에서 client에 response를 전송하는데 nginx buffer가 없고 클라이언트가 response 패킷을 천천히 받으면 그 영향이 app server한테까지 끼쳐서 그 process는 블락이되어 다른 패킷을 처리 못하게 됩니다. 

하지만 nginx buffer가 있다면 nginx는 app server에게 response패킷을 모두 받을때까지 client에게 응답하지 않고 app server에게 다 받은후 client에게 응답을 보냅니다. 따라서 slow client를 만나더라도 app server는 블락이 되지않을 수 있는것이죠.


*추가로 볼만한것

- Backend Architechtures(https://gist.github.com/ngocphamm/5849994)

- ELB+nginx+appservers(http://amazonwebservices21.blogspot.kr/2015/07/system-architecture-to-deploy-django.html)

'python' 카테고리의 다른 글

flask gevent spawn use a lot of memory  (0) 2017.04.05
websocket with gunicorn  (0) 2017.03.03
flask async response  (0) 2017.01.04
functools.wraps에 대해  (0) 2015.04.15
Apple Push Notification Service(APNs) python modules  (0) 2015.04.07
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

flask async response

python 2017. 1. 4. 12:05

Gevent monkey patch makes requests to react asynchronous.

Environment: mac OS 10.11.5, python 3.5.2, gevent==1.1.2, requests==2.12.4

Example:

from flask import Flask

from gevent.pywsgi import WSGIServer
from gevent import monkey

import requests
# need to patch sockets to make requests async
monkey.patch_all()

app = Flask(__name__) # pylint: disable=invalid-name
app.debug = True


@app.route('/test')
def test(requests_counter=[0]): # pylint: disable=dangerous-default-value
"""Asynchronous non-blocking streaming of relatively large (14.5MB) JPG
of Seattle from wikimedia commons.
"""
requests_counter[0] += 1
request_num = requests_counter[0]
url = 'http://www.google.com'
app.logger.debug('started %d', request_num)
rsp = requests.get(url)
app.logger.debug('finish %d', request_num)

return rsp.text


def main():
http = WSGIServer(('', 5000), app.wsgi_app)
http.serve_forever()


if __name__ == '__main__':
main()

Result:

started 1

started 2

started 3

started 4

started 5

started 6

finish 4

finish 5

finish 3

finish 6

finish 1

finish 2

'python' 카테고리의 다른 글

websocket with gunicorn  (0) 2017.03.03
gunicorn vs uwsgi  (0) 2017.01.20
functools.wraps에 대해  (0) 2015.04.15
Apple Push Notification Service(APNs) python modules  (0) 2015.04.07
Getting specific timezone timestamp from time string  (0) 2015.01.20
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

[펌] http://www.nexpert.net/353

글 싣는 순서

1. Secure IP Telephony의 개요 
2. 암호화 (Encryption)와 인증 (Authentication)
3. 전자서명 (Digital Signature)
4. PKI의 이해
5. Cisco Secure IP Telephony의 이해 
6. TLS & SRTP


Encryption(암호화)와 Hash(해쉬)의 차이
암호화는 암호화 알고리즘을 이용하고, 인증은 해쉬함수를 이용하여 Verification Data를 만들어 원문에 태그(Tag)를 붙여서 전송하므로 해쉬함수를 이용합니다. 암호화 알고리즘과 해쉬 함수의 동작 방식을 이해하면, 암호화와 인증의 차이를 이해할 수 있습니다. . 

위의 왼쪽 그림은 암호화 알고리즘의 동작방식을 설명한 것이며, 암호화는 기본적으로 양방향 통신을 전제로 하므로 암호화와 복호화가 가능해야 합니다. 복호화되지 않는 암호화는 의미가 없는 것입니다. 위의 오른쪽 그림은 헤쉬함수의 동작 방식을 설명한 것이며, 헤쉬는 메세지를 고정된 길의의 문자열로 변환합니다. 헤슁을 통해 생성된 Message Digest는 복호화될 필요가 없습니다. 헤쉬는 메세지마다 다른 내용의 Message Digest를 만들기 때문에 메세지의 지문(fingerprint)으로 볼 수 있습니다. 

정리하면, 암호화는 복호화를 전제로 양방향 통신을 위한 것이며, 헤쉬는 고정된 길이의 문자열을 생성하고 복호화를 할 수 없습니다. 


해쉬의 이해
해쉬는 가변길이의 데이타를 고정된 길이의 문자열로 변환하는 역할을 하며, 복화화가 되지 않으므로 원문을 알수 없습니다.  대표적인 해쉬 알고리즘은 MD5 (Message Digest)와 SHA (Secure Hash Algorism)가 있습니다. 

아래그림의 왼쪽 그림은 일반적인 해쉬 과정입니다. 

일반적으로 헤쉬는 보안상의 문제가 있습니다. 원문을 헤슁하여 Varification Data를 붙여서 전송하는 것이 일반적인데 전송 과정에서 누군가가 원문을 변환한 후에 Varification Data를 붙여서 수신자에게 보낸다면 수신자는 메세지의 변경 여부를 알지 못합니다. 

그래서, 위의 오른쪽 그림과 Secret Key를 추가하여 Verification Data를 생성하는 것입니다. 원문메세지에 보안키를 추가하여 Verification Data를 생성합니다. 이를 MAC (Message Authentication Code)라고 합니다. 전송과정에서 보안키를 모르는 제 삼자가 메세지를 변경하게되면 수신자는 이를 검출할 수 있습니다. MAC은 인증과 무결성을 동시에 제공할 수 있으며, 암호화에 비해 연산이 빠르다는 장점이 있습니다.  MAC은 생성 방식에 따라 다양하게 나눌 수 있는 데 IP Telephony에서는 HMAC (Hash-based MAC)을 주로 사용합니다. 

여기서 대표적인 해쉬 알고리즘인 MD5와 SHA-1에 대해 초 간단하게 살펴보겠습니다. 

  • MD5(Message Digest)
    Rivers가 개발한 메세지 요약 알고리즘으로 큰 메세지를 압축해야 하는 전자서명 응용프로그램을 위해 개발되었으며, 최대 128 bit의 고정길이로 요약 가능합니다. 이름에서 보듯이 MD 5는 다섯번째를 의미하며, MD2는 8bit 컴퓨터를 위해 MD4와 MD5는 32bit 컴퓨터용으로 개발되었습니다. 

    MD5는 과거에 라우터의 IOS에서 패스워드를 헤슁할 때 많이 쓰던 방식입니다. 보안이 취약하여 이제는 거의 쓰지 않습니다. 


  •  SHA (Secure Hasj Algorism)
    미국 국가 안전 보장국 (NSA)에서 개발하였습니다. 1993년에 최초 개발된 함수는 SHA-0로, 후에 SHA-0를 변형한 함수는 SHA-1으로, 그 후에 발표된 SHA-224, SHA-256, SHA-384, SHA-512를 묶어서 SHA-2 라고 합니다.  이 중  SHA-1이 가장 많이 쓰이며, TLS 및 SSL, IPSec에서 사용합니다.  

    SHA-0과 SHA-1는 최대 160bit의 고정길이로 요약하고, SHA-2는 사용 함수의 뒤 숫자 만큼 가능합니다. SHA는 MD5보다는 느리지만, 강화된 보안을 제공하므로 많이 사용합니다. 

헤쉬된 Verification Data 또는 MAC은 복호화가 되지 않으므로 수신자는 원문을 같은 방법으로 헤쉬합니다. 그래서 헤쉬된 값을 비교하여 결과를 확인합니다. 


암호화의 이해
암호화는 크게 암호화와 복호화에 같은 키를 사용하는 대칭 암호화 (Symmetirx Encryption)과 서로 다른 키를 사용하는 비대칭 암호화(Asymmetirc Encryption)로 나누어집니다. 대칭 암호화의 대표적인 알고리즘은 DES, 3DES, AES과 있으며, 비대칭 암호화의 대표적인 알고리즘은 RSA입니다. 

대칭 암호화 알고리즘은 빠르다는 장점이 있지만, 송신자와 수신자가 같은 키를 사용해야만 하고, 기기마다 다른키를 가지고 있으며, 자주 키를 바꾸어야 하기 때문에 관리가 어렵다는 단점이 있습니다. 대칭 암호화 알고리즘은 Email,SRTP, HTTPS 등의 어플리케이션에서 많은 양의 데이타를 처리하기 위해 사용합니다.  대표적인 대칭 알고리즘인 DES와 AES에 대해 초 간단하게 살펴보겠습니다.

  • DES (Data Encryption Standard)
    미국 NIST (미 표준 기술 연구소)에서 정한 암호이며, 키 길이가 56비트로 너무 짧고 특히나 슈퍼키가 존재할 수 있다는 의심을 받고 있습니다. 3 DES는 DES를 세번 반복하는 것입니다. DES는 이제 역사속으로 사라지는 암호화 알고리즘 입니다. 


  • AES (Advanced Encryption Standard)
    미국 NIST에서 정한 암호이며, 32배수의 키 길이를 사용하나 128bit의 키 길이가 대세입니다. AES는 특히 무료로 공개되었기에 대부분의 보안 장비에서 사용하고 있습니다. AES는 Secure IP Telephony에서 가장 중요한 알고리즘으로 SRTP 및 Signaling 등에서 사용합니다. 




비대칭 암호화 알고리즘은 너무 느린다는 단점은 있지만, 매우 안전하며, 키 관리가 단순하다는 장점이 있습니다. 따라서 적은 양의 데이타를 처리하는 데 주로 사용됩니다. 대표적인 비대칭 암호화 알고리즘인 RSA에 대해 초간단하게 살펴보겠습니다. 

  • RSA 
    RSA는 Rivest, Shamir, Adleman라는 세명이 과학자에 의해 개발되었으며, 세 사람의 앞글자를 따서 이름을 만들었습니다. RSA의 키길이는 1024 또는 2048bit를 이용합니다. RSA는 소인수 분해를 기초로 만들어 졌습니다.  소인수분해는 하나의 숫자를 작은 소수의 곱으로 나누는 것입니다. 소인수 분해가 획기적으로 빠르게 할 수 있는 양자컴퓨터가 반들어지기 전까지는 대세 프로토콜입니다. 
     
    일반적인 공개키(Public Key) 알고리즘은 송신자가 수신자의 공개키로 암호화하여 전송하고, 수신자는 자신의 개인키(Private Key)로 복호화하므로 개인키를 가진 한 사람만이 암호화된 내용을 확인할 수 있습니다. 그러나, RSA는 개인키로 암호화하여 공개키로 복호화할 수 있습니다.개인키로 암호화는 단 한명 만이 할 수 있고, 공개키를 가진 누구든지 볼 수 있으므로 전자서명에 활용됩니다. 



암호화에 대해 정리하게습니다. 단순하게 대칭 암호화 알고리즘인 AES는 대용량 데이타를 처리하기 위해 사용하고, 비대칭 암호화 알고리즘인 RSA는 소용량 데이타를 처리하기 위해 사용한다.

====

서버쪽에선 보통 기본 패킷 인코드/디코드에서 비교적 빠른 AES를 쓰고, 로그인 인증에 SHA해시를 사용한다.

'서버 교양' 카테고리의 다른 글

python 3.5 flask gevent async requests test  (0) 2017.04.07
Logstash install  (0) 2017.03.17
Docker overview  (0) 2015.06.13
SSL 인증서 발급  (0) 2015.03.04
글로벌 푸시 시스템 구성하기  (0) 2015.01.16
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

when you are comparing string from DB and Excel or CSV or .. file,

then, Just try to change file encode type to UTF-8.

or

try to match encoding type between two strings.

블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

JIT vs Interpreter

분류없음 2016. 10. 25. 19:33

http://www.differencebetween.net/technology/difference-between-jit-and-interpreter/

JIT방식은 그 코드 block이 사용(호출)될때 machine code로 변환해서 사용하고 이미 한번 machine code로 변환한것은 캐싱해두었다가 변환하는 과정없이 실행한다.

Script언어의 Interpreter방식은 미리 컴파일된 함수들을 가지고 있고, code를 line by line으로 해석해서 이 함수들에게 던져준다. 

'분류없음' 카테고리의 다른 글

[cpp] std::move는 단지 캐스팅일 뿐이라고?  (0) 2017.02.08
Same string but different length  (0) 2016.10.28
git pushed merge cancel  (0) 2015.04.13
[encoding] javascript write to csv  (0) 2015.04.11
APNS python failure and feedback  (0) 2015.04.06
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

zscore list copy

redis 2016. 10. 12. 17:48

#zscore, zrevrange

https://stackoverflow.com/questions/9282822/is-it-possible-to-duplicate-a-redis-sorted-set#

http://redis.io/commands/zunionstore

zadd foo 1 a
zadd foo 2 b
zunionstore bar 1 foo
zrange bar 0 -1
1) "a" 
2) "b"


'redis' 카테고리의 다른 글

redis sentinel  (0) 2015.11.30
[Redis] HSET vs SET  (0) 2015.01.09
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

mssql deadlock

카테고리 없음 2016. 8. 11. 17:30

Stored procedure 에서 transaction을 걸때 isolation level을 잘못 쓰면 select 할때도 락을걸어 다른 프로시져에서 기다리게 만든다.

Isolation level:
https://support.microsoft.com/ko-kr/kb/601430

위 상황이 확률이 높고.. 여러개의 procedure들간 테이블 업데이트 순서가 달라도 발생가능성이 있다고 한다.

데드락인 상황을 그려보면,

SP1
Begin tran
Update A
Update B

SP2
Begin tran
Update B
Update A

이 두 프로시져가 다수 호출되는 서비스라면 서로 우연찮게 같은 row를 고치려고 할때 각각의 프로시져가 커밋될때까지 기다리는 데드락 상황이 올수있다.
이와같은 업데이트가 아니더라도 isolation level을 잘못 셋팅하면 셀렉트도 발생시키는 원인이 될수 있다.





블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

원문: http://oyc.yale.edu/philosophy/phil-176#sessions

Lecture 5 - Arguments for the Existence of the Soul, Part III: Free Will and Near-Death Experiences [January 30, 2007] 


Chapter 1. The Dualist's Stance on Free Will and the Soul's Existence [00:00:00]

 physicalist의 관점에서, 우리는 그냥 미화된 로봇의 일종이다. 대부분의 공상과학 영화에서 나오는 여러가지 것들을 할수 있는 그런. 또한 우리는 그냥 미화된 physical object라고 볼 수도있다. 좀 더 넓게 말하자면, 그들은 결정론에 의존할 것이다. 그저 자연의 법칙을 따르는 physical object, 정해져있는 형태를 따라서 어떻게 말하자면 정해져있는 시스템을 따라서 처음 시작부터 같은 흐름으로 자연에 법칙에 따라서 흘러가는 것이라고. 그래서 마치 테이프를 되돌려서 들으면 똑같은 소리가 나오듯, 시간에 따라서 그저 정해진 환경에 따라서 움직이고 변화하는 것이라고.

직관적으로 볼때, 사람이 자유의지를 가지지 않고 이미 정해져 있는 법칙을 따른다는 것이 꽤 타당성이 있어 보일 수 있다. 왜냐하면, 사람은 같은 장소, 같은 시간, 같은 상황에 처했을때 다른 선택을 하지 못한다는 것이다. 정해져있는 법칙을 따른다는 것과 자유의지를 가졌다는 것은 공존할 수 없다. 모든 physical object는 결정론을 따른다. 사람은 정말로 자유의지를 가졌는가?

지난 강의에서 마지막에 얘기했던 논의거리를 보자. 4번의 결론을 얻기 위해서는 3개의 전제가 필요했다. 근데 우리가 자유의지를 가졌다는 것이 설득력 있어 보이지 않는다. 그래서 우리는 순수 physical object가 아니라는 결론을 얻기 힘들다.

하지만 아직 각각의 전제들은 그럴싸한 논의 거리다.


Chapter 2. Determinism and Free Will Cannot Coexist – Inspecting Incompatibility [00:04:57]

"1. 우리는 자유의지를 가졌다. 이 첫번째 전제는 우리가 영혼을 가졌다라는 것을 증명할 수 있는 것이다. 우리는 지난시간 우리가 정말 자유의지를 가졌는가?에 대해서 이야기했다. 이번에는 자유의지에 대해서 다시 얘기해 본다.

몇몇 철학자들은 우리가 자유의지를 가졌다고 믿는것은 환상일 뿐이라고 말한다. 실제로는 그렇지 않다고. 왜 그럴까? 그들은 아마도 이렇게 말할 것이다. 

“음 글쎄, 우린 그냥 물질적인 존재이고, 결정론이 우리에게 진실이니까. 결정론을 따르는 object는 자유의지를 가질수 없기 때문에 우리는 자유의지를 갖지 않았어. 우리는 그저 자유의지를 가졌다는 환상속에서 움직이는 물질적인 존재에 불과해. 생각해봐, 너는 자유의지를 볼 수도 없고 너의 마음을 자세히 들여다 볼수도 없고, 네가 자유의지를 가졌다는 것도 볼수 없자나. 그래 우리는 다르게 행동할 수 있을것 같지만 그것은 환상일거야.” 

이런식으로 생각하는 철학자들이 있고, 자유의지를 가졌다는 것을 부정하고 그렇게 결론짓는다면, 우리는 더이상 영혼의 존재를 증명하기 위해서 이 논의(전제1에 대한)를 들고 있을 필요가 없다. 이것은 이 논의를 피하기 위한 방법이다. 그렇지만, 나(교수)는 첫번째 전제가 사실이라고 생각한다. 

아직 2개의 전제가 남아있다. 3번 전제를 보자. “모든 순수 물질적인 시스템은 결정론을 따른다.”
자유의지와 결정론을 양립할 수 없다는 말이다. 하지만 만약 자유의지와 결정론이 양립할 수 있다면? 자유의지와 함께 결정론을 따른다면? 3번 전제역시 rejected될 수 있다.

사실 고백하자면, 3번 전제는 실증적 과학에 대한 주장이다(17세기). 그러나, 양자 역학(19세기)의 표준해석에 따르면 물리학의 기본법칙들은 사실 결정론을 따르지 않는다고 한다.

이것이 무슨말일까? 우리가 방사성 물질을 가지고 있다고 해보자. 그리고 이 물질은 다음 24시간 안에 반감할 가능성이 80%라고 하자. 이 말은, 20%는 반감이 안될 수 있다는 말이다.          

하지만, 결정론을 따른다면, 일정한 주기나 법칙에 의해서 정확하게 결정된 데로 동작해야 한다. 그러나 방사성 물질은 이렇게 반감하지 않는다. 
기초 물리학 레벨에서는 결정론을 따르지 않고 확률론을 따른다. 그리고 이것이 사실이라면 3번 전제는 거짓이 된다. 모든 물질적 존재가 결정론을 따르는 것이 아니기 때문에 이것이 우리가 순수 물질적 존재라는 가능성을 배제해주진 않는다. 따라서 결정론과 자유의지를 함께 가질순 없지만, 순수 물질적존재이며, 자유의지를 가질수도 있다는 말이다.

2번째 전제를 보자, “결정론을 따르지 않는 것은 자유의지를 갖는다” 그러나, 몇몇 철학자들은, 자유의지와 결정론. 둘은 양립할 수도 있다라고 생각한다. 따라서, 우리가 결정론을 따른다고 해서 우리가 자유의지를 가졌다는 것을 배제할 수 없다는 것이다. 즉, 결정론과 자유의지는 양립할 수 있다는 주장이다.

이 주장을 따른다면, 즉, 우리는 결정론을 따르며 자유의지를 갖고 또한 여전히 순수 물리적 존재일 수 있다는 것이다. 오늘, 여러분이 이 양립가능성을 믿게 하기 위해서 나(교수)는 아무말도 하지 않았고, 앞으로도 하지 않을 것이다. 

하지만 요점은, 우리가 자유의지를 가졌다는것을 설명하기 위해서 영혼이 존재한다고 성급하게 믿지 말아야 한다는 것이다. 영혼의 존재를 결론짓기 위해서는 많은 전제들을 필요로 한다. 그리고 각각의 전제들은 난해할 수 있다. 각각의 전제들에 대해서 많은 철학적 견해와 과학적 근거가 있을 수 있다. 앞으로 영혼의 존재를 증명해 나가는 것은 여러분의 몫이다.


Chapter 3. Positing the Soul's Existence for Near-Death Experiences [00:15:22]

...


블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,