8월, 2018의 게시물 표시

후지 필름 x-pro2

 후지 필름의 x-pro2를 중고로 구매했다. 바디는 첫 중고 구매라 걱정을 했는데 판매자의 인상과 x-pro2의 만듬새를 보니 믿음이 갔다.  x-pro2는 후지 필름의 rf 스타일 플래그쉽 미러리스 카메라이다. 특징은 하이브리드 뷰파인더, rf 스타일, 수동 방식의 다이얼이 대표적일 것이다.  이미 a7m2라는 걸출한 미러리스 카메라를 가지고 있음에도 불구하고 x-pro2를 구매한 것은... 이뻐서이다. 그리고 다른 조건 중 하나는 렌즈가 무거워서. 풀프레임 렌즈는 물리-광학적인 사유에 있어서 렌즈의 크기를 줄이는데 한계가 있다. 다시 말하면 풀프레임보다 작은 aps-c 사이즈에 부합하는 렌즈는 더 작게 만들 수 있다는 것이다. 그래, 렌즈 무거워서 못 들고 다니겠더라.   렌즈가 가벼우니 바디를 드는데 손도 덜 아프고 덜 무겁고, 렌즈 들고다닐 가방도 더 가볍고 다른 것(노트북과 패드)도 넣을 수 있고 등등. 화질에 집착해서 풀프레임 사용했는데, 생각이 조금 바뀌니 aps-c가 적당해 보인다. (절대 예전에 포서드에 추억이 남아서가 아니다... 아아 추억의 포서드...) 화질을 원하면 역시 중형... (기다려라 gfx)  그리고 후지 특성상 디자인도 이쁘고 렌즈들도 저렴한 라인(이지만 저렴하지 않지만)임에도 불구하고 화질이 준수하기 때문에 스냅에 정말 좋다고 생각된다. 이래 저래 내 사진 활동에 잘 맞아서 마음에 든다.   내 사진 활동은 이쁜 카메라다. 앞으로 더 열심히 사진 활동 해야지.

소재, 내가 가진 것은 무엇?

글을 쓰려면 소재가 필요하다. 내가 가지고 있는 소재는 무엇일까? 아무런 조건 없이 단어를 나열해 보자 개발, 리덕스, 리액트, 아폴로 클라이언트, 아폴로 서버, graphQL, node.js, mongoDB, database, algorithm, 사진, 포토샵, 라이트룸, 자전거, 모터사이클, 엔진, 글쓰기, 서핑, 여행, 의류, 의복 소재, 온열생리학, 요리, 전자 기기, 깃, 깃 허브, aws, 선형대수, 인스타그램, 미드, 취업, 밴드, 노래, 음악, 날씨, 기상, 수학, 물리, 과학... 정도 밖에 없다니 많다면 많지만 이것 보다도 더 많을 줄 알았는데 하나 씩 이야기를 해보면 좋겠지

A7R2, 고화소의 매력과 함정

A7R2는 2015년에 소니에서 출시한 카메라 바디이다. 42백만 화소의 고화소 이미지 촬영을 지원하며 센서는 이면조사로 만들어진 36mm * 24mm의 풀프레임 사이즈의 소형 카메라 중 제일 큰 센서로 높은 수광성을 보여준다. 2018년 7월 기준, 신품을 220만원 가량에 구매할 수 있다.  라고 하는 거고 나도 갖고 싶다. 나의 카메라는 A7M2로 풀프레임-24백만화소-갭리스 센서이다. 충분히 좋은 카메라지만 대형인쇄와 풍경사진에 욕심이 나면서 고화소 카메라를 원하게 됐다. 그리고 장비 탓 하는건 하수가 하는 짓이지.  아 근데 난 돈이 없잖아. 그리고 고화소 카메라면 렌즈도 고화소를 지원할 만큼 성능이 좋아야 하니까 허접한 나의 카메라 렌즈로는 ... 결국 렌즈도 다시 사야하고... 아주 개판이구만. 거지 거지 거지. 누가 브루주아의 취미라고 하던데... 하긴 맞지. 아닌 것 같으면서도 맞는 듯. 뭔가 중산층의 취미 정도면 괜찮겠구만. 나는 아직도 정신 못 차린 것 같다.

고화소와 대형인화

이미지
고화소는 좋다. 해상도도 높고 편집의 자유도가 높으며 특히 인화시 인화 용지 크기에 자유도가 높다. 다시 말하자면 사진을 더 크게 인화할 수 있다.  단점으로는 동일한 크기의 센서에 다 많은 화소가 필요하니 픽셀 피치가 줄어들고 그로 인해 수광성이 줄어든다.  그리고 소니는 그러한 약점을 이면조사라는 설계 구조적인 방향으로 극복하려고 했다. 이면조사로 인해서 픽셀 피치가 더 큰 센서와 비슷하게 개당 픽셀의 수광성을 유지할 수 있었다. 때문에 소니의 고화소 소형 카메라는 준중형카메라로서 대형인화를 위해 사용할 수 있었다. 그러면 소니의 고화소 소형 카메라가 있으면 대형 인화를 할 수 있는가? 전혀. 인화는 생각보다 굉장히 복잡하고 불편한 과정을 겪는다. 사진을 찍고 보정하고 인화해야 한다. 사진을 찍을 때는 보정 폭이 넓을 수록 좋고 그런 카메라는 고가다. 보정을 하기 위해서는 색상을 충분히 지원하는 10bit 그래픽 카드가 있고 성능이 충분한 컴퓨터가 필요하다. 또한 그 색상을 표현 할 수 있고 틀어지는 색상 표현을 조정할 수 있는 모니터가 필요하다. 그리고 주변의 잡광을 막을 수 있는 공간이 필요하다. 마지막으로 믿고 맡길 수 있는 인쇄소를 알아 봐야 한다. 인쇄 기계, 염료, 노하우 등으로 색감과 해상력이 달라지기 때문이다. 이 모든 과정을 거치어야 정말 인화한다고 볼 수 있다. 인터넷 인화 업체에 맡기면 100% 색이 틀어지기 때문에 어떠한 목적을 가지고 대형 인화를 하기가 매우 ... 비 목적적?이다.   난 비용적인 측면과 24백만 화소로 인해서 포기했다. 내가 가진 카메라는 24백만 화소의 카메라로 현 시대에서 고화소 카메라라고 보긴 힘들다. 하지만 과거의 필름 카메라나 혹은 초기의 디지털 카메라는 24백만 화소가 되지 않음에도 불구하고 좋은 사진, 대형 인화를 충분히 해냈다. 결국 고화소 카메라의 문제가 아니라 나의 안목과 편집 실력의 문제다. 그러니까 열심히 찍기나 하자. ...

Redux, connect를 이해해 보기

리덕스를 배운다 react와 함께 사용하는 방법을 공부 중이다. react의 state를 redux에 옮겨서 사용하면 single source를 유지하기 용이하기 때문에 매우 훌륭하다고 생각된다.  다만 react의 state와 redux의 state 저장소인 store는 너무 다른 느낌을 나에게 준다. store는 어떤 서버의 저장소 같은 느낌이다. 실은 redux 자체가 서버와 같은 느낌을 준다. reducer를 통해서 schema와 같은 명령을 내려줘야 할 뿐만 아니라 action으로 type구분도 해줘야 하니 말이다.  redux를 이해하는데 많은 고충이 따르지만 제일 힘들었던 것은 dispatch를 component에서 어떻게 불러오가 였다. 여러 문서를 뒤져서 (뒤질 필요도 없이 공식 문서를 보면 됐지만) 확인한 결과 react-redux의 connect가 제일 편리한 방법인 것 같다. connect로 component를 export하기 전에 씌우면 dispatch가 props로 내려지기 때문에 바로 사용 가능하다. 그리고 여기서 밝혀지는 나의 오해. dispatch 명령은 즉각적으로 dispatch를 통한 값을 return하지 않는다! 즉, dispatch(action, [option]).map 같은거 하면 오류가 생김. 다시 차분히 코드를 보니 data를 가져오기 위해서는 connect에서 (store의) state를 통해 가져오던가 혹은 getState로 가져왔어야 하는 것. - 멍청함이 하늘을 찌른다.  그러면 이제부터 특정 user가 접근 가능한 data를 시작 할 때 받아오고 redux의 store에서 관리할 수 있을 것이다. component마다 필요한 data는 connect에 function을 적용해서 filter를 적용하고  그 뒤에 data를 props로 내리면 사용하기 훨씬 편하지 않을까...

React-Apollo-mongoose-JWT

드디어! 아폴로와 몽구스로 jwt 서비스를 (내 나름대로) 만들었다!  전혀 완벽하게 이해하는 발끝에 때만큼도 미치지 못했지만  어쨌든 하나 하나 나열해보자 데이터 베이스 mlab 서비스를 통해서 mongoDB를 대신한다. 데이터 베이스 - 스키마 연결 mongoose로 데이터 모델을 만들고,  graphQL로 만들어 놓은 스카마를 mlab의 접속 경로로 연결한다.  스키마 작성 graphQL을 이용해서 스키마를 작성한다. MODEL.findOne({name: args.name, password: args.password})를 이용해서 ID(name)과 password가 일치할 경우만 데이터를 가져올 수 있도록 한다. jwt 삽입 스키마에 jwt 모듈을 사용해서 data입력시 token이 입력되고 mutation에서는 token과 연결된 정보를 불러올 수 있도록 한다. 여기서 query가 아니라 mutation이 매우 매우 중요하다. 나중에 불러와야 할 때 알게 된다. 이쯤 되면 백엔드는 완성이다.  프론트 엔드를 알아보자 app.js react-apollo를 이용해서 서버의 데이터를 가져온다. ApolloClient에 서버의 주소를 입력해서 서버와 연결하고 ApolloProvider로 전체에 데이터를 제공한다. ApolloProvider에는 client로 서버와 꼭 연결해 주어야 한다! query 작성 server 이외에 react에서 사용될 query를 따로 작성해야한다. apollo-boost의 gql을 통해서 작성한다. 꽤 복잡해서 예시로 적는게 좋을 것 같다. const getTokenMutation = gql`   mutation GetToken($name: String, $pw: String) {     token(name: $name, pw: $pw) ...

서버에 파일 저장하기 - blob

blob은 big large object로 file 타입의 데이터를 나타내는데 사용되는 간접적인 객체이다. <input>의 type을 file로 하면 ( <input type="file">)하면 file을 input 할 수 있게 된다. 이 file을 미리보기를 위해 사용하거나 다른 곳으로 전송하기 위해서 blob을 사용한다. blob을 만드는 방법은 blob constructor  ( blob() )을 통해서 만들어 낸다. 이 후 이 blob을 통해서 file 타입의 데이터를 유용할 수 있다. file 데이터를 미리보기로 사용하기 위해서 url이 필요하다면 URL.createObjectURL()을 이용하면 된다. blob으로 만들어진 데이터를 다시 file로 해석 하기 위해서는 filereader 를 사용하면 된다. blob은 slice()로 잘라낼 수 있다. 이는 데이터 베이스나 통신 프로토콜 마다 다른 데이터 용량 한계에 맞추어서 사용하는데 이용된다. server에 image를 올리기 위해 blob을 사용하지만, 사이즈가 매우 클 수 있다. 이를 위해서 canvas를 통해서 converting을 하고 올릴 수 있다. ( stackoverflow ) 위의 방법을 통해서 파일을 올리고 다시 해석 할 수 있다.  이를 통해서 image를 올리려고 한다. 몇 가지 문제점을 살펴보자. image를 input(file)을 통해서 올리면 가로가 길고 세로가 짧은 방향으로 (혹은 exif 데이터의 rotate가 0' 일 때)로 고정되어 사용된다.  input으로 바로 올라간 file의 데이터는 변경되지 않는다. 다시 말하면 image 파일의 데이터가 필요 이상으로 큰 경우 너무 과도한 데이터를 서버에 저장하게 되는 것이고 이는 통신에서 속도에도 영향을 주게 된다. 이를 해결하기 위해서 각각 답을 찾아보자 exif-js, react-native-exif, rea...