bookmark_border지식은 절대적인가, 상대적인가?

지식은 절대적인가, 상대적인가?

과거와 현재의 끊임없는 대화 : E. H. 카 : 역사란 무엇인가?(feat. 라쇼몽)

  • 역사를 바라보는 두 가지 관점
    • 절대주의적 역사관 : 과거에 있는 사실을 있는 그대로 객과적으로 기술
    • 상대주의적 역사관 : 과거에 일어난 사실을 기술할 때 자신의 주관이 들어갈 수밖에 없다
  • E.H.카의 ‘역사란 무엇인가’
    • 역사란 과거와 현재의 끊임없는 대화이다.
    • 라쇼몽(일본영화, 1950년)
      • 도적, 사무라이, 사무라이 아내, 나무꾼(목격자) 의 각각 입장에 따른 진술
      • 이 진술 중 하나만 남겨진다면 역사는 그 증언을 토대로 사건을 기록할 것임.

내 이론은 틀릴 수 없어 : 포퍼 : 반증 가능성

  • 과학을 바라보는 입장
    • 절대주의적 과학관
      • 과학적 지식은 합리적이고 객관적
      • 슐리크, 카르납, 포퍼
    • 상대주의적 과학관
      • 과학적 지식도 상대적이고 주관적
      • 헨슨, 쿤, 파이어아벤트

논리실증주의

  • 프레게와 아이슈타인에 의해 논리학, 수학, 물리학이 혁명적으로 발전하자, 이에 자극받아 슐리크, 카르납 등의 논리실증주의자들은 철학에서도 이와 같은 변화가 있어야 한다고 주장
  • 비엔나 서클
  • 경험론의 후예
  • 귀납법
    • 관찰과 경험을 통해 검증 가능한 명제만이 의미가 있고, 검증 불가능한 명제는 의미가 없다.
    • 검증 가능한 과학만이 진짜 학문이고, 검증불가능한 명제(형이상학, 윤리학, 미학, 종교)는 비과학이다.

포퍼의 반증주의

  • 논리실증주의의 두가지 문제점
    • 귀납법의 한계
      • 모든 백조는 하얗다.
    • 구획의 문제
      • 너도 나도 과학. 인문과학, 사회과학, 창조과학, 타로, 침대도 과학.
      • 검증 가능하면 모두 과학인가?
  • 포퍼
    • 오스트리아 출신 과학철학자 및 사회철학자
    • 논리실증주의에 반대
  • 과학이론은 귀납법이 아닌 가설-연역법
    • 귀납법
      • 개별사실 관찰 -> 일반화 -> 과학이론
    • 가설-연역법
      • 가설1 -> 반례1 -> 가설2 -> 반례2 -> 가설3 -> 반증되지 않을때 과학이론
      • 독일 화학자 케쿨레의 벤젠의 구조
  • 검증이 되더라도 과학이 아닐 수 있다.
    • 아들러 심리학
    • 마르크시즘
    • 사이비 과학
  • 틀릴 수 있는 가능성이 있는 이론만이 과학이론이 될 수 있다.
    • 반증 가능성
    • 포퍼의 반증주의

반증주의에 대한 반론

  • 반증할 수 없는 것 천지다
    • 확률에 대한 가설
      • 주사위를 던졌을때 3이 나올 확률은 6분의 1이다. 반증 불가
    • 존재에 대한 가설
      • 외계인이 존재하지 않는다.
    • 반증주의 자체도 반증 가능해야 한다.
  • 뒤엠-콰인 논제
    • 석촌호수 황금색 백조
    • 어떤 가설을 포기해야할지 결정 필요

공통점

  • 관찰과 경험을 통한 과학적 방법론이 친리를 찾는 가장 확실한 방법이라는 점
  • 과학이 모든 학문의 왕좌라는 점

과학, 너마저… : 토머스 쿤 : 패러다임의 전환

  • 과학을 바라보는 두가지 입장
    • 절대주의적 과학관
      • 과학적 지식은 합리적이고 객관적
    • 상대주의적 과학관
      • 과학적 지식도 주관적이고 경험적
  • 토머스 문
    • 1922~1996
    • 과학혁명의 구조
  • 아리스토텔레스는 물질은 불.공기.물.흙의 4원소로 이루어져 있고, 불과 공기의 고향은 하늘이고, 물과 흙의 고향은 땅이어서, 사과가 땅으로 떨어지는 이유는 고향인 땅으로 가려는 것이다.
    • 당시 패러다임은 ‘물질은 자기가 원래 속해 있었던 자리로 돌아가려는 성질이 있다’고 믿음.
  • 과학혁명은 종교의 개종과 같다.
  • 과학혁명이 일어나는 과정
    • 힘과 권위를 가진 나이든 과학자와 젊은 과학자
    • 나이든 과학자들이 죽으면 새로운 패러다임이 힘을 얻음.
  • 과학자들의 반격
    • 과학의 합리성을 완전히 무시
    • 쿤은 한발 물러서서 과학자들이 어느 정도 합리성을 가지고 더 우수한 패러다임을 선택

원치 않는 결과는 거부한다 : 핸슨 : 관찰의 이론 의존성

  • 오리일까, 토끼일까?
  • 관찰의 이론 의존성
    • 관찰 -> 가설 -> 실험 -> 이론
    • 관찰과 실험의 결과가 관찰자의 배경지식에 따라 왜곡될 수 있다.
    • 관찰의 이론 의존성
  • 원하지 않는 관측 결과를 거부한다.
  • 이미 관측한 결과도 왜곡한다.
    • 자동차 사고영상. 50km/h(그냥 사고) vs. 60km/h (사망한 사고)

과연 그게 당연할까? : 푸코 : 말, 지식, 광기

  • 미셸 푸코
    • 프랑스 철학자 (1926~1984)
    • 지식, 권력, 억압에 관한 많은 이론 제시
    • 지식의 문제, 권력의 문제, 종교의 문제
  • 스웨덴 린네의 생물 분류 vs. 중국 청나라의 분류

플라톤의 에피스테메

동굴안 동굴밖
현실세계
감각으로 경험하는 가시계(Visible)
사물을 눈에 비치는 대로
잘못된 인식
이데아 세계
이성으로 인식하는 가지계(Intelligible)
사물을 있는 그대로
참된 인식
독사(Doxa) 에피스테메(Episteme)
  절대적 보편적 진리

푸코의 에피스테메

  • 지식의 고고학
    • 지식도 신석기 시대에는 신석기 시대형 지식이 있었고, 청동기 시대에는 청동기 시대형, 철기 시대에는 철기 시대형 지식이 있으며, 그 지식들 사이에는 불연속적인 단절이 있었다.
    • 또한 유럽과 아시아에서 나오는 유물이 다르듯, 같은 시대라도 지역에 따라 통용되는 지식이 다르다.
  • 푸코의 시대별 구분
    • 16세기에는 ‘유사성’이라는 키워드로 지식을 구성
      • 호두를 먹으면 머리가 좋아진다.
    • 17세기 ‘표상’, 19세기 ‘주체’
    • 플라톤의 에피스테메는 절대적 지식이지만, 푸코에게 절대적 보편적 지식이나 진리는 없다.
    • 푸코의 에피스테메는 특정지역, 특정시기에 지식을 구성하는 키워드 즉 무의식적 인식체계이다.
  • 광기의 역사
    • 광기의 개념이 시대에 따라 달라졌다.
    • 주체, 이성, 합리성의 개념 등도 시대의 산물로 어느 시대나 통용되는 개념이 아니다.
    • 즉, 보편적인 것, 자연스러운 것, 우리가 당연하다고 생각하는 것들이 사실 아니다.
쿤의 패러다임 푸코의 에피스테메

과학(물리학)에 적용

과학, 철학, 문화 등 모든분야에 적용되는 인식 체계
의식적 작용 무의식 속에서 작동 (알아채지 못함)
나름 합리적 기준으로 선택 합리적 기준 없음
  • 권력의 은밀한 지배
    • 「감시와 처벌」
    • 18세기 후반 감금형과 강제노등 등이 도입
    • 죄수들은 불안과 공포를 느끼며 권력의 시선을 내면화하고 스스로 자기검열을 하게 됨
    • “감옥이 학교나 공장, 병원과 비슷하고, 이들이 감옥과 닮았다고 해서 놀라운 일인가.”
    • 우리 자신이 학교에서, 직장에서 일상생활에서조차 권력의 시선을 내면화해서 스스로 자기검열을 하고 있다는 것.

비슷한 동물끼리 묶기

고양이과 동물 vs. 사육가능한 동물

bookmark_borderOpenfire

Openfire 설치

  • 시놀로지 도커에 설치
  • gizmotronic/openfire
  • 볼륨 설정 (파일 : 마운트)
    • /volume1/docker/openfire : var/lib/openfire
    • /volume1/log/openfire : /var/log/openfire
  • 포트설정
    • 5222, 5223, 9090, 9091, 7070, 7443, 7777
9090 : http web administration
9091 : the secured administration respectively
5222 : Client Port
5223 : Client SSL Port
5269 : s2s, Remote servers can exchange packets with this server on port
5229 : for SparkWeb
7070 : HTTP binding Port
7443 : HTTP binding SSL Port
7777 : File transfer proxy
5347 : External Component
  • http://192.168.219.150:9090/
    • 관리자 계정 : admin
  • 사용자 추가 페이지
    • Registration 플러그인 추가
    • Users/Groups > Users > Registration Properties > Enable users to register via a web page at http://xmpp.kr:9090/plugins/registration/sign-up.jsp

bookmark_borderCordova Todo List

Cordova Todo List 프로젝트

mytodolist 프로젝트 생성 및 시험

D:\cordova>
> cordova create mytodolist com.example.mytodolist MyTodoList
> cd mytodolist
> cordova platform add android
> cordova run android

NodeJS 서버

index.js

var todos = [];

클라이언트

mytodolist.js

var todos = [];

$.ajax("http://localhost:3000/todos").done(function(result) {
    console.log(result);

    todos = result;
    for (const todo of todos) {
        $(".contents ul").append(liTemplate(todo.text, todo.checked));
    }
});

$("#addButton").click(function() {
    var text = $("#inputBox").val();
    todos.push({ text: text, checked: false });
    $("#inputBox").val("");
    console.log(todos);

    $(".contents ul").append(liTemplate(text, false));
    saveTodos();
});

function liTemplate(text, checked) {    
    var li = $('<li></li>');

    alert(text);
    li.attr('value', text);
    li.append(inputTemplate(text, checked));
    li.append(text);
    li.append(buttonTemplate());

    li.click(function(event) {
        var el = $(event.target);
        var index = el.index("li");
        console.log(index);
    
        if (el.is("button")) {
            todos.splice(index, 1);
            $("li")[index].remove();
        }
        else if (el.is("input[type='checkbox']")) {
            var isChecked = el.is(":checked");
            if (isChecked) {
                $($("li")[index]).addClass("checked");
                todos[index].checked = true;
            } else {
                $($("li")[index]).removeClass("checked");
                todos[index].checked = false;
            }
        }

        saveTodos();
    });    

    return li;
}

function inputTemplate(text, checked) {
    var inputTag = $('<input type="checkbox" id="checkBox">');
    inputTag.attr('checked', checked);
    return inputTag;
}

function buttonTemplate(text) {
    var buttonTag = $('<button id="delButton">X</button>');
    return buttonTag;
}

빌드 및 시험

> npm run start

npm ERR! Missing script: "start"
==>
package.json
"scripts": {
    "start": "node index.js"
  },

Error: Cannot find module 'express'
==>
> npm install -save express

> cordova run android

플러그인 설치

날짜선택 플러그인

알림 플러그인

function onSuccess(date) {
    var text = $("#inputBox").val();
    todos.push({ text: text, checked: false, date: date });
    $("#inputBox").val("");
    console.log(todos);

    $(".contents ul").append(liTemplate(text, false, date));
    saveTodos();
}

$("#addButton").click(function() {
    datePicker.show(options, onSuccess, onError);
});

bookmark_borderCordova

Cordova

  • 오픈소스 하이브리드 앱 개발 도구
  • 웹 기술을 이용해 개발
  • 윈도우, OS X, 리눅스에서 사용 가능
  • 안드로이드, iOS, Mac OS X, 윈도우 등 멀티 플랫폼 지원
  • 플러그인을 통한 확장
  • Cordova 의 한계
    • 네이티브 앱에 비해 성능이 떨어짐
    • 플러그인 개발의 어려움

Cordova의 작동원리

Cordova 개발환경

  • NodeJS / Cordova
  • 플랫폼 별 요구사항
    • 안드로이드: JDK, 안드로이드 SDK
  • JDK 다운로드 및 설치
  • 안드로이드 스튜디오 설치
  • Cordova 설치
    • > npm install –g cordova
    • > cordova –version
  • 새 Cordova 프로젝트 생성
    • > cordova create hello com.example.hello HelloWord
    • > cd hello
  • 안드로이드 에뮬레이터 생성
    • > More Actions > Virtual Device Manager > Create virtual device > Pixcel2 > download >
    • > cordova platform add android@8.0.0
    • > cordova run android
      • Android SDK의 경로를 찾지 못하는 문제
        • ANDROID_SDK_ROOT=undefined (recommended setting)
        • > More Actions > SDK Manager > Android SDK Location 확인
        • set ANDROID_SDK_ROOT=C:\Users\user\AppData\Local\Android\Sdk
      • Gradle 을 찾지 못하는 문제
      • javac 를 찾지 못하는 문제
        • Failed to run “javac -version”, make sure that you have a JDK version 8 installed.
        • set PATH=%PATH%;C:\SDK\jdk1.8.0_321\bin;
    • Android Emulator가 띄워져 있는 상태에서 실행
    • 영구적 PATH 등록 : 설정 > 정보 > 고급 시스템 설정 > 환경 변수 > 시스템 변수 > path 에 추가
      • C:\SDK\gradle-7.2\bin
      • C:\SDK\jdk1.8.0_321\bin

코도바 플러그인 설치 및 사용

Cordova 플러그인 설치

Cordova 플러그인

  • NodeJS 의 NPM 과 같이 Cordova 의 기능을 확장
  • 웹 앱에서 OS 기능을 사용하려면 플러그인이 필요
  • OS 종속 코드와 자바스크립트 인터페이스로 이루어짐

Cordova 플러그인 설치 및 삭제

Cordova 배터리 상태 플러그인

  • 디바이스의 배터리 잔량 확인
    • batterystatus 이벤트 -> status.level
  • 디바이스의 충전상태 확인
    • batterystatus 이벤트 -> status.isPlugged
  • 디바이스의 배터리 경고 확인
    • batterylow 이벤트
    • batterycritical 이벤트
  • 플러그인 설치
    > cordova plugin add –save cordova-plugin-battery-status

index.html

    <body>
        <div>
            <span id="battery">100</span>%
        </div>
        <script src="cordova.js"></script>
        <script src="js/jquery-3.4.1.min.js"></script>
        <script src="js/index.js"></script>
    </body>

deviceready 이벤트

  • Cordova 플러그인이 모두 로드 된 후 발생
  • window.addEventListener 함수를 통해 등록
  • 플러그인은 deviceready 이벤트 발생 이후 사용하여야 함

index.js

var battery = $("#battery");

window.addEventListener('deviceready', function() {
    window.addEventListener('batterystatus', function(status) {
        battery.text(status.level);
    }, true);
}, true);
  • Virtual Device Manager > AVD 실행
  • > cordova run android

Cordova 카메라 플러그인

  • 디바이스의 카메라로 사진을 찍어 불러오기
  • 디바이스의 이미지 라이브러리에서 사진 불러오기
    • getPicture 함수
      camera.getPicture(success, error, options)
      • success : 사진을 불러오는데 성공했을 때 실행되는 콜백함수
      • error : 사진 불러오기에 실패했을 때 실행되는 콜백함수
      • options : 사진을 가져오기 위한 option 객체
쿤의 패러다임 푸코의 에피스테메

과학(물리학)에 적용

과학, 철학, 문화 등 모든분야에 적용되는 인식 체계
의식적 작용 무의식 속에서 작동 (알아채지 못함)
나름 합리적 기준으로 선택 합리적 기준 없음

  • 카메라 플러그인 설치
    > cordova plugin add –save cordova-plugin-camera
  • 설치 플러그인 확인
    > cordova plugin list
        <button id="btnTakePic">사진 찍기</button>
        <button id="btnLoadPic">사진 불러오기</button>
        <div>
            <img id="image"/>
        </div>

index.js

var battery = $("#battery");
var image = $("#image");

options = {
    quality: 80,
    correctOrientation: true
}

window.addEventListener('deviceready', function() {
    window.addEventListener('batterystatus', function(status) {
        battery.text(status.level);
    }, true);

    $("#btnTakePic").click(load(1));
    $("#btnLoadPic").click(load(2));
}, true);

function load(sourceNum) {
    return function() {
        navigator.camera.getPicture(
            function(imageUri) {
                image.attr('src', imageUri);
            },
            function(error) {
                alert('에러발생!');
            },
            {
                sourceType: sourceNum,
                ...options,
            }
        );
    }
}

펼침연산자

            {
                sourceType: sourceNum,
                ...options,
            }
아래와 동일
            {
                sourceType: sourceNum,
                quality: 80,
                correctOrientation: true
            }
  • 배열이나 객체를 피연산자로 받음
  • 피연산자로 전달된 배열이나 객체를 펼침
  • 다른 배열이나 객체에 값을 복사해 추가할 경우 사용
var arr = [1, 2, 3];
console.log([...arr, 4, 5]);

var obj = { a:0, b:2 }
console.log({...obj, c:5});