2020. 6. 17. 23:33

옛날옛날에 번역했던 건데(2006-10-28), 홈페이지가 사라져 이곳으로 그대로 옮겨둔다.


----



Introduction

서문


Science fiction is often described, and even defined, as extrapolative. The science fiction writer is supposed to take a trend or phenomenon of the here-and-now, purify and intensify it for dramatic effect, and extend it into the future. \"If this goes on, this is what will happen.\" A prediction is made. Method and results much resemble those of a scientist who feeds large doses of a purified and concentrated food additive to mice, in order to predict what may happen to people who eat it in small quantities for a long time. The outcome seems almost inevitably to be cancer. So does the outcome of extrapolation. Strictly extrapolative works of science fiction generally arrive about where the Club of Rome arrives: somewhere between the gradual extinction of human liberty and the total extinction of terrestrial life.

SF는 때때로 외삽[각주:1]적이라고 설명되거나 심지어 정의되기도 한다. SF 작가는 지금 여기에서 벌어지는 경향이나 현상을 취해, 극적 효과를 위해 정제하고 응축시켜 그것을 미래로 확장시키는 사람으로 여겨진다. “이런 것이 계속된다면, 이것이 일어날 것이다.” 예측이 만들어진다. 사람이 소량으로 장기간 섭취하면 무슨 일이 일어날 것인가를 예측하기 위해 쥐에게 대량의 정제되고 응축된 식품 첨가제를 먹이는 과학자들의 방법론과 결과를 쏙 빼닮는다. 귀결은 거의 필연적으로 암인 것 같다. 외삽법의 귀결도 마찬가지다. 엄격하게 외삽적인 SF 작품들은 대개 로마 클럽[각주:2]이 도달한 근처에 도달한다― 인간 자유의 점진적인 사멸과 지구 생명체의 전적인 사멸 사이의 어디쯤.

This may explain why many people who do not read science fiction describe it as ‘escapist,’ but when questioned further, admit they do not read it because ‘it\'s so depressing.’

이것이 SF를 읽지 않는 많은 사람들이 그것을 ‘현실도피적’이라고 설명하는 이유일지도 모른다. 하지만 계속 물어보면 그들은 ‘그것이 너무도 비관적’이기 때문에 읽지 않는다고 인정한다.

Almost anything carried to its logical extreme becomes depressing, if not carcinogenic.

거의 무엇이든 논리적인 극한에 이르면, 암을 일으키지는 않는다 해도 비관적이 되고 만다.

Fortunately, though extrapolation is an element in science fiction, it isn\'t the name of the game by any means. It is far too rationalist and simplistic to satisfy the imaginative mind, whether the writer\'s or the reader\'s. Variables are the spice of life.

다행히도, 외삽법은 SF의 한 요소이기는 하지만 결코 핵심적인 것은 아니다. 이것은 정말 너무 합리주의적이고 단순명료하기 때문에, 작가나 독자의 상상력을 만족시키지 못한다. 변수란 인생에 있어 양념과 같은 것이다.

This book is not extrapolative. If you like you can read it, and a lot of other science fiction, as a thought-experiment. Let\'s say (says Mary Shelley) that a young doctor creates a human being in his laboratory; let\'s say (says Philip K. Dick) that the Allies lost the second world war; let\'s say this or that is such and so, and see what happens… In a story so conceived, the moral complexity proper to the modern novel need not be sacrificed, nor is there any built-in dead end; thought and intuition can move freely within bounds set only by the terms of the experiment, which may be very large indeed.

이 책은 외삽적이지 않다. 원한다면 당신은 이 책, 그리고 다른 많은 SF를 하나의 사고실험으로 읽을 수도 있다. (메리 셸리 말대로) 한 젊은 의사가 실험실에서 인간 생명을 창조했다고 해 보자.[각주:3] (필립 K. 딕 말대로) 연합군이 2차 세계대전에서 패배했다고 해 보자.[각주:4] 이것은 이렇고 저것은 저렇다고 해 보고, 무엇이 일어나는지 보라… 이런 이야기에서는, 근대 소설 특유의 윤리적 복잡성이 희생될 필요가 없을 뿐더러, 판에 박힌 진부한 결말도 없다. 사고와 직관은, 실험의 제 조건들에 의해서만 설정된, 실로 매우 광범위할지 모르는 경계 내에서 자유롭게 움직일 수 있다.

The purpose of a thought-experiment, as the term was used by Schrodinger and other physicists, is not to predict the future ― indeed Schrodinger\'s most famous thought-experiment goes to show that the ‘future,’ on the quantum level, cannot be predicted ― but to describe reality, the present world.

슈뢰딩거와 다른 물리학자들이 사용한 용어, 사고실험의 목적은 미래를 예측하는 것이 아니라 ― 실제로 슈뢰딩거의 가장 유명한 사고실험은, 양자 수준에서는 ‘미래’가 예측될 수 없다는 것을 보여주었다 ― 현재 세계에서의 진실을 기술하는 것이다.

Science fiction is not predictive; it is descriptive.

SF는 예측하지 않는다. 기술한다.

Predictions are uttered by prophets (free of charge); by clairvoyants (who usually charge a fee, and are therefore more honored in their day than prophets); and by futurologists (salaried). Prediction is the business of prophets, clairvoyants, and futurologists. It is not the business of novelists. A novelist\'s business is lying.

예측을 말하는 사람은 예언자들(보수를 받지 않는다), 천리안을 가진 사람들(보통 보수를 받으므로, 한창 때에는 예언자들보다 존경받는다), 그리고 미래학자들(월급을 받는다)이다. 예측은 예언자들, 천리안을 가진 사람들, 그리고 미래학자들의 일이다. 그것은 소설가들의 일이 아니다. 소설가의 일은 거짓말하는 것이다.

The weather bureau will tell you what next Tuesday will be like, and the Rand Corporation will tell you what the twenty-first century will be like. I don\'t recommend that you turn to the writers of fiction for such information. It\'s none of their business. All they\'re trying to do is tell you what they\'re like, and what you\'re like ― what\'s going on ― what the weather is now, today, this moment, the rain, the sunlight, look! Open your eyes; listen, listen. That is what the novelists say. But they don\'t tell you what you will see and hear. All they can tell you is what they have seen and heard, in their time in this world, a third of it spent in sleep and dreaming, another third of it spent in telling lies.

기상대에서는 다음주 화요일이 어떠할지 말해줄 것이고, 랜드 연구소[각주:5]에서는 21세기가 어떠할지 말해줄 것이다. 그런 정보를 소설 작가들로부터 기대하지는 말라고 나는 권하고 싶다. 그런 것은 전혀 그들의 일이 아니다. 그들이 하려는 모든 일은 그들이 어떠한지, 당신이 어떠한지 말해주는 것이다 ― 무슨 일이 일어나는지 ― 지금 날씨는 어떤지, 오늘, 이 순간, 비, 햇빛, 봐라! 눈을 떠. 귀 기울여 들어라. 이것이 소설가들이 하는 말이다. 하지만 그들은 당신이 무엇을 보고 듣게 될 것인지 말해주지는 않는다. 그들이 말해줄 수 있는 전부는, 3분의 1은 잠과 꿈으로 보내고 나머지 3분의 1은 거짓말을 하면서 보낸 이 세계의 이 시간 속에서 그들이 보고 들은 것들이다.

“The truth against the world!” ― Yes. Certainly. Fiction writers, at least in their braver moments, do desire the truth: to know it, speak it, serve it. But they go about it in a peculiar and devious way, which consists in inventing persons, places, and events which never did and never will exist or occur, and telling about these fictions in detail and at length and with a great deal of emotion, and then when they are done writing down this pack of lies, they say, There! That\'s the truth!

“세계를 향한 진리!” 그렇다. 확실히. 소설 작가들은, 더 용감해지는 순간에만큼은 진리를 갈망한다― 알고 싶어하고, 말하고 싶어하고, 섬기고 싶어한다. 하지만 그들은 독특하며 우회적인 방식을 택한다. 즉, 전혀 존재하거나 일어나지 않았던 그리고 앞으로도 그러할 사람들, 장소들, 그리고 사건들을 꾸며내고, 이 허구들에 대해 자세하고 장황하게 커다란 양의 감정을 실어 이야기하는 방법으로. 그리고 이 거짓말 보따리를 다 써내린 뒤에 그들은 말한다, 자! 이것이 진리다!

They may use all kinds of facts to support their tissue of lies. They may describe the Marshalsea Prison, which was a real place, or the battle of Borodino, which really was fought, or the process of cloning, which really takes place in laboratories, or the deterioration of a personality, which is described in real textbooks of psychology; and so on. This weight of verifiable place-event-phenomenon-behavior makes the reader forget that he is reading a pure invention, a history that never took place anywhere but in that unlocalisable region, the author\'s mind. In fact, while we read a novel, we are insane ― bonkers. We believe in the existence of people who aren\'t there, we hear their voices, we watch the battle of Borodino with them, we may even become Napoleon. Sanity returns (in most cases) when the book is closed.

그들은 자신의 거짓말투성이를 뒷받침하기 위해 온갖 종류의 사실들을 이용할지도 모른다. 그들은 실재 장소인 마샬시(Marshalsea) 감옥이나, 실제로 싸움이 일어났던 보로디노(Borodino) 전투나, 실제로 실험실에서 행해지는 클로닝 과정이나, 실재 교과서에 설명된 인격 붕괴 등등을 기술할지도 모른다. 이 검증가능한 장소-사건-현상-행위의 무게가 독자로 하여금 작가의 마음이라는 위치 모를 곳에서가 아니면 결코 어디에서도 일어난 적 없는 순전한 허구, 역사를 읽고 있다는 잊게 만드는 것이다. 실제로, 소설을 읽는 동안 우리는 제정신이 아니다. 맛이 가있는 것이다. 우리는 실재하지 않는 사람들의 존재를 믿고, 그들의 목소리를 들으며, 그들과 함께 보로디노 전투를 지켜보기도 한다. 심지어 우리는 나폴레옹이 되기도 한다. 책을 덮은 뒤 (대부분의 경우) 제정신이 돌아온다.

Is it any wonder that no truly respectable society has ever trusted its artists?

이제껏 진실로 훌륭한 어떤 사회도 예술가들을 신뢰하지 않았다는 사실이 조금이라도 놀라운가?

But our society, being troubled and bewildered, seeking guidance, sometimes puts an entirely mistaken trust in its artists, using them as prophets and futurologists.

하지만 우리 사회는 어수선하고 혼란스러워서, 인도자를 추구하는 과정에서 때로는 완전히 실수로 예술가들을 신뢰하기도 한다. 그들을 예언자나 미래학자로 대우하며 말이다.

I do not say that artists cannot be seers, inspired: that the awen cannot come upon them, and the god speak through them. Who would be an artist if they did not believe that that happens? if they did not know it happens, because, they have felt the god within them use their tongue, their hands? Maybe only once, once in their lives. But once is enough.

예술가들이 영감을 가진 선각자자 될 수 없다는 얘기는 아니다― 그들이 신적인 영감[각주:6]을 내려받아 신의 목소리를 전달할 수 없으리라는 얘기도 아니다. 그들이 그런 일이 일어난다는 것을 믿지 않는다면 누가 예술가가 될 것인가? 왜냐하면, 그런 일이 일어난다는 것을 알지 못한다고 해도, 신이 내부에서 자신의 혀, 자신의 손을 사용하는 것을 느꼈는데? 아마도 단 한번, 일생에 있어서 한번일 것이다. 하지만 한번이면 충분하다.

Nor would I say that the artist alone is so burdened and so privileged. The scientist is another who prepares, who makes ready, working day and night, sleeping and awake, for inspiration. As Pythagoras knew, the god may speak in the forms of geometry as well as in the shapes of dreams; in the harmony of pure thought as well as in the harmony of sounds; in numbers as well as in words.

그렇다고 예술가만이 무거운 부담을 졌고 큰 특권을 부여받았다고 말하려는 것은 아니다. 과학자 또한 자나 깨나 낮이나 밤이나 일하며, 영감에 대한 준비를 갖추는, 대비하고 있는 사람이다. 피타고라스가 깨달았듯, 신은 꿈의 형태로뿐만 아니라 기하학의 형태로 말할지도 모르는 것이다. 소리의 조화로뿐만 아니라 순수한 사고의 조화로도, 언어로뿐만 아니라 숫자로도.

But it is words that make the trouble and confusion. We are asked now to consider words as useful in only one way: as signs. Our philosophers, some of them, would have us agree that a word (sentence, statement) has value only in so far as it has one single meaning, points to one fact which is comprehensible to the rational intellect, logically sound, and ― ideally ― quantifiable.

하지만 골칫거리와 혼란을 일으키는 것이 바로 언어이다. 이제 우리는 언어가 오직 하나의 방식으로 사용될 때에만 유용한 게 아닌가 생각하고 있다― 바로 기호 말이다. 우리의 철학자들 중 일부는 단어(문장, 진술)가 하나의 유일한 의미를 가질 때에만, 합리적인 지성인이 이해할 수 있고, 논리적으로 정당하며, 또한 ― 이상적으로는 ― 양화될 수 있는 하나의 사실을 가리킬 때에만 쓸모가 있다고 우리를 설득시키려 할 것이다.

Apollo, the god of light, of reason, of proportion, harmony, number ― Apollo blinds those who press too close in worship. Don\'t look straight at the sun. Go into a dark bar for a bit and have a beer with Dionysios, every now and then.

빛과 이성과 균형, 조화, 수의 신 아폴로. 아폴로는, 숭배심에 너무 가까이 몰려오는 사람들의 눈을 멀게 한다. 태양을 똑바로 바라보지 말라. 가끔은, 잠깐 어두운 바에 들어가 디오니소스와 맥주를 한 잔 나누라.

I talk about the gods, I am an atheist. But I am an artist too, and therefore a liar. Distrust everything I say. I am telling the truth. The only truth I can understand or express is, logically defined, a lie. Psychologically defined, a symbol. Aesthetically defined, a metaphor.

신들을 이야기하고 있지만, 나는 무신론자다. 하지만 나는 예술가이기도 하고, 그러므로 거짓말쟁이이다. 내가 하는 모든 말을 불신하라. 나는 진리를 말하고 있다. 내가 이해하거나 표현할 수 있는 유일한 진리는, 논리학적으로 말해 거짓말뿐이다. 심리학적으로 말하자면 상징. 미학적으로 말하자면 은유.

Oh, it\'s lovely to be invited to participate in Futurological Congresses where Systems Science displays its grand apocalyptic graphs, to be asked to tell the newspapers what America will be like in 2001, and all that, but it\'s a terrible mistake. I write science fiction, and science fiction isn\'t about the future. I don\'t know any more about the future than you do, and very likely less.

아, 시스템 과학이 장대한 묵시록적 그래프를 보여주는 미래학 회의에 초대받고, 신문기자들로부터 미국이 2001년에 어떤 모습일지 가르쳐달라는 질문을 받는 등, 그런 일들은 유쾌한 일이다. 그러나 그것은 끔찍한 실수이다. 나는 SF를 쓰지만, SF는 미래를 다루지 않는다. 나는 당신보다 미래에 대해 조금도 더 잘 알지 못한다. 아마 더 모를 것이다.

This book is not about the future. Yes, it begins by annnouncing that it\'s set in the ‘Ekumenical Year 1490-97,’ but surely you don\'t believe that?

이 책은 미래를 다루지 않는다. 그렇다, 이 책은 배경이 ‘에큐멘력 1400~97’임을 밝히며 시작되지만, 당신은 정말 이것을 믿는가?

Yes, indeed the people in it are androgynous, but that doesn\'t mean that I\'m predicting that in a millennium or so we will all be androgynous, or announcing that I think we damned well ought to be androgynous. I\'m merely observing, in the peculiar, devious, and thought-experimental manner proper to science fiction, that if you look at us at certain odd times of day in certain weathers, we already are. I am not predicting, or prescribing. I am describing. I am describing certain aspects of psychological reality in the novelist\'s way, which is by inventing elaborately circumstantial lies.

그렇다, 사실 이 책의 사람들은 자웅동체이지만, 그렇다고 내가 천년이나 그쯤 뒤에 우리가 자웅동체가 될 것이라고 예측하고 있거나, 혹은 우리가 응당 자웅동체가 되도록 저주받은 것 같다고 밝히고 있는 것은 아니다. 난 단지 SF 고유의 독특하고 우회적이며 사고실험적인 방법으로, 당신이 어떤 날씨 하에서 어떤 시간들 틈틈이 살고 있는 우리를 바라봤을 때, 우리는 이미 그렇게 되어있다고 말하고 있을 뿐이다. 나는 예측하지도, 규정하지도 않는다. 나는 기술한다. 나는 심리학적 진실의 어떤 양상을, 상세한 거짓말들을 정성들여 꾸며내는 소설가의 방식으로 기술하는 것이다.

In reading a novel, any novel, we have to know perfectly well that the whole thing is nonsense, and then, while reading, believe every word of it. Finally, when we\'re done with it, we may find ― if it\'s a good novel ― that we\'re a bit different from what we were before we read it, that we have been changed a little, as if by having met a new face, crossed a street we never crossed before. But it\'s very hard to say just what we learned, how we were changed.

소설, 어떠한 소설을 읽을 때에도, 우리는 모든 것이 넌센스라는 사실을 완벽하게 숙지해야 하지만, 그럼에도 읽는 동안에는 그 말들을 하나하나 믿어야 한다. 마침내 다 읽었을 때 우리는 ― 그것이 좋은 소설이라면 ― 자신이 책을 읽기 전과 조금 달라졌음을, 조금 변화했음을 깨달을지도 모른다. 마치 우리가 새로운 얼굴을 만남으로 인해, 전에 전혀 가본 적 없는 거리에 발을 들여놓음으로 인해 달라지듯 말이다. 하지만 우리가 배운 게 무엇인지, 우리가 어떻게 달라졌는지를 말하기란 무척 어렵다.

The artist deals with what cannot be said in words.

예술가는 언어로 말할 수 없는 것들을 다룬다.

The artist whose medium is fiction does this in words. The novelist says in words what cannot be said in words.

소설이 매개인 예술가들은 이것을 언어를 통해 한다. 소설가들은 언어로 말할 수 없는 것들을 언어로 말한다.

Words can be used thus paradoxically because they have, along with a semiotic usage, a symbolic or metaphoric usage. (They also have a sound ― a fact the linguistic positivists take no interest in. A sentence or paragraph is like a chord or harmonic sequence in music: its meaning may be more clearly understood by the attentive ear, even though it is read in silence, than by the attentive intellect).

언어가 이렇게 역설적으로 사용될 수 있는 것은, 기호학적인 용법과 더불어 상징적 혹은 은유적 용법도 가지고 있기 때문이다. (또 소리도 있다. 언어실증주의자들은 관심이 없는 사실이지만. 문장이나 문단은 음악에 있어 화음이나 화성 진행과 같은 것이다― 소리내지 않고 읽더라도, 주의 깊은 지력을 가진 사람보다는 주의 깊은 청력를 가진 사람이 그 의미를 더 명료하게 이해할 것이다.)

All fiction is metaphor. Science fiction is metaphor. What sets it apart from older forms of fiction seems to be its use of new metaphors, drawn from certain great dominants of our contemporary life ― science, all the sciences, and technology, and the relativistic and the historical outlook, among them. Space travel is one of these metaphors; so is an alternative society, an alternative biology; the future is another. The future, in fiction, is a metaphor.

모든 소설은 은유다. SF는 은유다. 그것이 기존 소설 형태와 차별화되는 것은, 우리 동시대 삶에서 한 커다란 지배력을 가진 것들― 즉 과학, 모든 분야의 과학, 그리고 테크놀로지, 또 상대주의적이고 역사적인 견해 등의 것들로부터 가져온 새로운 은유들을 사용하기 때문일 것이다. 우주 여행은 그런 은유들 중에 하나다. 대안 사회론[각주:7]이나, 대안 생물학[각주:8]도 그렇다. 미래 또한 그렇다. 소설에 있어 미래란, 은유다.

A metaphor for what?

무엇을 위한 은유인가?

If I could have said it non-metaphorically, I would not have written all these words, this novel; and Genly Ai would never have sat down at my desk and used up my ink and typewriter ribbon in informing me, and you, rather solemnly, that the truth is a matter of the imagination.

이것을 은유적이지 않게 말할 수 있었다면, 나는 이 모든 말들, 이 소설을 쓰지 않았을 것이다. 또 겐리 아이가 나, 그리고 당신에게 다소 엄숙하게, 진리란 상상의 문제임을 알리기 위해 내 책상에 앉아 내 잉크와 타자기 리본을 소모하지도 않았을 것이다.



Ursula K. Le Guin

- 어슐러 K. 르 귄



  1. extrapolation. 과거에서 현재까지의 자료를 사용해 미래를 연역하는 수법으로, 원래 통계 예측에 이용된다. SF에서는 시간적으로 미래만을 한정하지 않고, 어느 상황을 설정할 때 이런 조작이 이루어진다. 과학적 문화적 움직임 또는 트렌드를 논리적으로 미래에까지 확장시킴으로써 실현가능성이 높은 세계를 상상해내는 과정을 말한다. 그러나 외삽은 어디까지나 현재 알려진 지식체계와 모순되지 않는 범위 내에서만 가능하다.(http://wiki.sfreaders.org/ 발췌) [본문으로]
  2. Club of Rome. 과학 기술의 진보와 이에 따르는 인류의 위기를 분석하여 그 대책을 세우는 것을 목적으로 하는 국제적인 민간 단체. 1968년 세계 각국의 지식인들이 로마에 모여 결성하였다. [본문으로]
  3. Mary Shelley가 1818년 쓴 [프랑켄슈타인(Frankenstein)]. [본문으로]
  4. Philip K. Dick이 1962년 쓴 [높은 성의 사나이(The Man in the High Castle)]. [본문으로]
  5. RAND Corporation. 1948년 설립된 미국의 대표적인 정치, 외교, 군사정책 연구소이자 세계적인 싱크탱크기관. 비영리 민간연구소로서 연구소 주도의 리서치뿐만 아니라 공공, 기업을 대상으로 리서치서비스를 제공하고 있다. [본문으로]
  6. awen. 웨일스 지방의 고어로 muse와 유사한 의미. [본문으로]
  7. alternative society. 국내 사전에는 ‘신사회(현재의 사회와는 다른 질서와 가치관을 지닌 사회)’로 풀이. 위키 사전(영문) 참고: http://en.wikipedia.org/wiki/Alternative_society [본문으로]
  8. alternative biology. 이론적이거나 비(非)전통적인 생명 형태, 즉 비세포적 생명, 비탄소기반 생명, 지구외 생명, 사이보그 생명, 인공 생명 등을 다루는 학문. (http://en.wikipedia.org/wiki/Alternative_biology 발췌번역) [본문으로]

'' 카테고리의 다른 글

[철학의 위안](구판) 중에서  (0) 2011.01.28
Posted by 필유
하드웨어2020. 4. 19. 18:59

2018년 8월 폰을 처음 사고 카메라 성능에 절망해서 구글 카메라 설치하는 법을 줄곧 찾다가 부트로더 언록(폰 초기화 필요)이 필요하다고 해서 포기한 적이 있다.


근데 오늘 안드 10으로 업데이트(20-4-14 OTA) 후 그 사실을 그만 잊어버리고 부트로더를 언록해버렸다... 이상하게도 문자와 통화 내역이 8개월 정도 백업이 안 돼서 걔네는 날렸다...


기왕 했으니 기록 차원에서 방법을 적어둔다. 요약하면, 크게는 다음 글을 보고 따라 했지만, 개선(?)할 부분들이 좀 있다.

https://www.thecustomdroid.com/enable-camera2-api-xiaomi-mi-a2-lite-guide/



먼저 준비물들. 위 글에는 아직 안드 10 펌웨어(boot image)가 없는데, 공식 순정 롬은 다음 글 등을 참고해서 받을 수 있다.

https://t.me/MIUI11_Updates/1001


이걸 받으면 zip 안에 payload.bin이 있는데, 그건 payload_dumper를 이용하면 boot.img를 추출할 수 있다(깃허브 설명에는 protobuf 패키지만 설치하면 된다고 써 있으나 실행해보니 bs4diff도 필요하다고 해서 걔도 설치를 했다).

https://github.com/vm03/payload_dumper


그다음 안드로이드 SDK 플랫폼 도구(adb, fastboot 등)가 없다면 필요하다. 오늘 기준으로 공식 사이트에는 29.0.5까지만 있는데 구글링으로 나온 게 29.0.6이라 난 그걸 썼다.

https://developer.android.com/studio/releases/platform-tools


끝으로 magisk를 미리 폰에 설치해두자. apk 하나만 폰에 옮기고 설치하면 된다.

https://github.com/topjohnwu/Magisk



준비물이 준비됐다면,

1. 앞서 글 등을 참고해 부트로더를 언록한다. 폰이 초기화되니 데이터를 잘 백업해두자. PC에서 플랫폼 도구가 있는 폴더에서 다음 명령 사용.

adb reboot bootloader

fastboot oem unlock


2. 이제 재부팅하고 순정 boot.img를 폰으로 옮긴 다음 magisk로 그 파일을 패치한다. 그러면 magisk_patched.img 요런 파일이 생길 거임.


3. 그 파일을 다시 PC로 옮겨서 해당 부트로더로 부팅한다. 이게 임시로 루팅하는 방법의 핵심이다(혹시라도 루팅을 계속 유지하려면 boot 대신 flash boot를 쓰면 되지만... 그건 우리가 바라는 게 아니다).

fastboot boot magisk_patched.img

fastboot reboot


4. 폰을 재부팅하면 임시로 루팅된 상태다. 여기서 magisk를 실행하면 추가 설치가 일어난다. 재부팅하지 말 것.


5. 루팅된 상태니 구글 카메라를 사용하기 위한 Camera2 API 빌드프롭 수정을 해보자. 앞서 글에서는 루트 권한 때문에 termux 같은 앱을 깔라고 하지만, 굳이 그럴 필요는 없고 magisk의 설정에서 '셸'에 슈퍼유저 권한을 주면 된다(옛날에는 셸에서 루트 권한 없이도 빌드프롭 수정이 됐던 것 같은데 어쨌든 지금은 아니다). 그다음 adb로 셸에 들어가면 루트 권한으로 빌드프롭 수정이 가능하다.

adb shell

su -c "setprop persist.vendor.camera.HAL3.enabled 1"


6. 웹에는 빌드프롭 수정에 대해 여러 말이 많은데, 난 저 한 줄만 추가하는 걸로 충분하다고 결론을 냈다. eis 관련 항목을 추가해야 하나 고민했지만 A2 Lite는 기본적으로 eis가 켜져 있으니 추가할 필요 없고, 구글 카메라 포트에 따라 다를 수는 있겠지만 내가 설치한 포트는 잘 작동했으니 persist.vendor.camera.stats.test도 추가할 필요는 없을 듯하다.


과학적으로 Camera2 API가 활성화됐는지 확인하려면 빌드프롭 수정 전에 Camera2 API ProbeManual Camera Compatibility 같은 앱을 깔아서 실행해보자. 전자는 하드웨어 지원 수준이 LEGACY로 나오고, 후자는 모든 항목에 X가 뜰 것이다. 빌드프롭에 저거 한 줄을 추가한 다음 재부팅하고 다시 실행해보면 전자는 LEVEL_3으로 나오며, 후자는 모든 항목에 O가 뜬다.


7. 빌드프롭 수정 후 재부팅하면 빌드프롭은 수정됐으나 루팅은 풀린 상태다. magisk는 삭제하고, 다음 사이트에서 포트를 골라보자.

https://www.celsoazevedo.com/files/android/google-camera/


최근에는 안정화도 많이 된 모양이다. 난 그냥 제일 처음 떠 있는 게 최신이길래 DMGC_7.3.020_ver.4.3.apk를 받아서 설치했는데, 모든 기능이 아주 잘 작동했다.


순정 카메라는 걔대로 여전히 잘 작동했고, 오픈 카메라에서는 API를 Camera2 API로 변경이 가능했다.


앞서 글에서 부트로더 언록은 OTA에 영향을 미치지 않는다고 했고, 루팅된 상태도 아니니 다음 OTA는 아무 문제 없이 잘되리라 기대해본다. 혹시 안 되면 추후 업데이트.

-> 5월 말에 OTA 떴고 적용도 완료. 문제없다.






Posted by 필유
응용프로그램2018. 9. 13. 01:08

아래 방법은 1) 불편하고 2) 부정확하다. 2018년 공주대학교 레이텍 워크숍에서 편리하고 정확한 프로그램이 공개되었으므로 그 방법을 이용하자.


프레젠테이션 및 프로그램은 해당 페이지에서 받을 수 있다. 진짜 너무나 편리함...

From HWP to LaTeX ( http://wiki.ktug.org/wiki/wiki.php/LaTeXWorkshop/2018 )






hml-equation-parser에 대한 소개는 다음 기사 참고.
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20161229092520

윈도우가 아니라면 다음 글을 참고.
https://jomno.github.io/hwp-%EC%88%98%EC%8B%9D%EC%9D%84-LaTex%EB%A1%9C(hml-equation-parser)/

다음은 윈도우 파이썬 3.6 기준.

0. 추출할 hwp 파일을 한글에서 hml로 저장한다(다른 이름으로 저장). 편의상 파일명은 test.hml로 바꾼다.

1. hml-equation-parser를 설치한다. pip로 하면 됨. 당연한 얘기지만 virtualenv를 사용하면 더 좋다. 그건 알아서.

    pip install hml-equation-parser

2. python 실행
    python

3. 파서 샘플 코드는 다음과 같다.
    import hml_equation_parser as hp
    doc = hp.parseHmlSample("test.hml")

    doc = hp.convertEquationSample(doc)
    string = hp.extract2HtmlStrSample(doc)

    import codecs
    f = codecs.open("test.html", "w", "utf8")
    f.write(string)
    f.close()


4. 근데 한국어(cp949) 윈도우에서 이걸 실행하면 2행에서 악명 높은 UnicodeDecodeError가 날 거다. 따라서 다음 코드를 먼저 실행하고 샘플 코드를 실행. 출처는 https://stackoverflow.com/a/34345136/6153990
    import _locale
    _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])


5. 이제 test.html 파일이 생겼다. 보니까 100% 완벽한 건 아니지만(\가 생략되는 등) 뭐 어쩔 수 없지.

6. 파서에서 html에 기본적으로 MathJax를 심어놓았으므로 해당 span들만 추출하면 된다. 해당 html 파일을 브라우저로 열고 개발자 도구(F12)에서 다음 코드 실행.
    (() => {
      const els = [...document.body.querySelectorAll('script[id^="MathJax-Element-"')];
      const eqs = els.map(el => '$$' + el.textContent + '$$');
 
      let doc = window.open('', '어흥', 'width=512, height=1024').document;
      let pre = doc.createElement('pre');
      pre.textContent = eqs.join('\n');
      doc.body.appendChild(pre);
    })();


7. 팝업 차단을 해제하면 새 창이 하나 뜰 거다. 이제 그걸 전체 선택하고 텍스트 파일에 복붙하면 끝.

8. https://www.mathjax.org/#demo 혹은 http://www.codecogs.com/eqnedit.php 요런 곳에 가서 실험해보면 된다.

9. 매스타입 등에 쓰려면 MathML으로 추출하는 게 편할 텐데 그러면 6번 코드 2~3행을 다음과 같이 변경. 근데 변환 결과가 완벽하지 않아서 더 불편할 것 같음...
      const els = [...document.body.querySelectorAll('span[id^="MathJax-Element-"')];
      const eqs = els.map(el => el.getAttribute('data-mathml'));



Posted by 필유
응용프로그램2017. 4. 26. 09:00

지각을 얼마나 하건 간에, 나는 나 나름대로 내 업무 시간이나 패턴을 신경 쓰고 있다.


이직 1년 후 능률이 바닥을 치던 때, 시간 관리를 위해 매닉타임(ManicTime)을 설치했다. 사실 설치하고 나서 뭔가 극적으로 달라진 건 없지만... 뭐랄까, 자신이 어떻게 시간을 보내고 있는지 점검하는 정도의 의미는 있었던 듯하다. 곧 윈도우도 다시 설치해야 하고 해서, 이 글을 마지막으로 더는 매닉타임을 쓰지는 않을 거다.


2015년 6월 21일부터 기록을 시작해 2017년 4월 22일까지 자료를 뽑았다. 이하 평균 계산에서 사무실에 출근하지 않은 날(즉 PC를 전혀 켜지 않은 날)은 포함하지 않았다.


먼저 근무 시간. 보다시피 2015년 6월부터 10월까지는 야근을 한 날이 많았다. 그렇다고 주구장창 야근만 한 건 또 아니라서 그래프가 상당히 들쑥날쑥하다. 월별 평균 상위 세 개는 15년 8월이 10.03시간, 15년 10월이 9.99시간, 15년 7월이 9.86시간이다. 하위 세 개는 17년 4월 8.46시간, 16년 12월 8.59시간, 16년 11월 8.66시간이다. 15년 평균은 9.64시간, 16년은 9.24시간, 17년은 8.76시간으로 계속 하락 중이다. 아주 바람직하군.


매닉타임은 사용 시간, 자리 비움 시간, 세션 잠금 시간도 기록한다. 보통 자리를 비울 때 PC를 잠그는 편인데, 정말 급한 일이 있어 그냥 자리를 비우거나 잠그는 걸 잊을 때도 간혹 있어서 (그리고 PC를 잠그고 자빠져 잘 때도 있어서) 100% 정확한 데이터는 아니다. 월별 평균 상위 세 개는 16년 5월, 15년 7월, 8월로 각 6.60, 6.40, 6.39시간이었다. 야근한 날이 많았으니 PC 앞에 앉아 있는 시간도 긴 게 당연해 보인다. 하위는 16년 4월, 9월, 17년 4월로 5.39, 5.33, 5.25시간이었다. 이것도 당연하겠지.


사용 시간 / (자리 비움 시간 + 세션 잠금 시간)의 비율도 구해봤다. 아마도 근무 시간이 길어서인지 15년 6월, 7월이 2.06, 2.08로 제일 높았고 17년 3월이 2.04였다. 즉 나같이 생산성 높은(에헴) 사람조차 PC 앞에 앉아 있는 시간이 자리를 비운 시간보다 길어야 2배라는 소리다. 하위는 16년 4월, 9월, 6월로 각 1.25, 1.38, 1.50이었다. 특히 16년 4월은 PC 사용은 5.39시간인데 세션 잠금이 3.94시간이었다. 16년 9월도 PC 사용은 5.33시간에 세션 잠금은 3.59시간. 세션 잠금 중 1시간은 무조건 점심시간이지만 나머지는? 회의, 회의, 그리고 회의. 이 회사는 PC로 하지 않는 잡무는 적은 편이므로 결정적으로 회의가 문제다. 시기상 부서 차원에서 분기별로 하는 회의 준비에 시간을 많이 썼던 것 같다. 물론 잔 시간도 포함되었겠지만 맨날 자는 건 아니니까...


다음은 많이 쓴 응용프로그램. 이 회사는 구글 앱스로 일하다 보니 크롬 사용량이 가장 크다. 구글 앱스 외의 모든 웹 검색(및 딴짓)에는 파폭을 쓴다. 워드, 애크러뱃은 원고 작업이다. 나는 이 회사 와서 교정지를 출력해서 교정본 일이 거의 없으므로 워드, 애크러뱃, 파폭 쓴 시간이 곧 내 주무 시간이다. 5번 윈도우는 뭔지 잘 모르겠다. 아이들 상태를 말하는 것 같기도. 6번은 맨날 쓰는 텍스트 편집기고, 7번은 코딩할 때만 쓰는 아톰 편집기다. 8번은 엑셀, 9번은 명령 프롬프트(주로 각종 개발 환경 설정 시 사용)였다. 10번은 마감 때 외주자와 채팅용으로 쓰는 카카오톡이다. 카톡 따위, 마감 아닐 때는 켜지도 않는다.


참고로 11위~20위는 다음과 같다. 노트패드++는 회사 사이트에 미출간 원고를 HTML로 올릴 때 주로 썼다(그런데도 12시간이라니 새삼 내가 얼마나 노가다를 했는지 느껴진다). 이클립스는 자바, 스칼라 다루는 원고 만질 때 썼다. 전에도 썼듯 이 두 언어만은 아톰보다 이클립스가 편하다. 오픈 캡쳐(1.4.4)는 수년간 사용 중인 완소 캡처 도구.


다음은 응용프로그램에 상관없이 많이 쓴 문서. 예상대로 구글 문서, 지메일, 구글 검색이 상위에 있고 15번에 캘린더도 있다. 4번 트렐로는 팀에서 기획 용도로 쓰는 웹 서비스다. 5번 나무위키는... 할 말이 없습니다. 6번은 구글 시트용 스크립트 코딩에, 7번은 구글 드라이브 파일 정리에 많은 시간을 썼음을 보여준다. 정말 이 회사 처음 왔을 때는 구글 드라이브에 계층구조 따윈 없고 혼돈의 카오스 그 자체였다. 8번 스택오버플로... 이것도 좀 찔린다. 9번은 기획 활동을 위해 페이스북에서 보낸 시간으로 이해하면 되겠다. 절대 놀려고 들어간 게 아님. 어차피 친구도 몇 없다. 그 밖에 서점이나 영어 위키백과가 있고, 11번, 14번은 마감한 원고, 16번은 요즘 열심히 보고 있는 원고다. 아 이 원고를 생각하니 갑자기 마음이 무거워지네.


이상이 매닉타임 무료 버전이 제공하는 네 가지 주요 통계다. 시간 관리에 관심이 있다면 한 번쯤(3~6개월) 사용해보고 자기진단에 활용하는 것도 괜찮을 거다. 설치하면 항상 백그라운드에서 아무 알림도 없이 돌아가고, 트레이에 떠 있는 걸 클릭하면 이상과 같은 통계를 확인하고 엑셀로 내보낼 수 있다. 분석은 귀찮지만 내가 무슨 프로그램을 많이 썼고 무슨 문서를 많이 봤는지 같은 걸 보는 건 의외로 재미있다.


물론 브라우저나 텍스트 편집기를 여러 개 쓸수록 더 정확한 패턴을 알 수 있다. 회사 PC에서도 비발디랑 페일문을 쓰긴 하는데, 특정 원고 볼 때만 쓰고 방치하다 보니 통계에는 잡히지 않았다. 앞으로는 일상적인 용도를 정해서 자주 사용하는 게 좋겠다는 생각이 든다.


이걸 해당 기간에 마감한 원고와 비교해서 보면 어떤 책에 시간을 더 들였는지도 대략적으로 알 수 있겠지만, 그렇게까지 분석하기는 귀찮다. 애초에 집에서 일한 시간은 포착되지 않으니 의미가 없다.


그러니까, 내가 지각을 많이 한다고 내 업무 태도에도 관심이 없는 건 아니라고. (두 번 말했다.)


이 포스트에 사용한 엑셀 파일은 이거. 백업용.

https://www.dropbox.com/s/34z21uuzwk5xben/report.xlsx?dl=0


Posted by 필유
응용프로그램2017. 2. 1. 22:38

문장부호 중점(·)을 수식에서 내적(곱하기) 기호로 사용해도 되는가? 결론만 말하면 그렇다.


위키백과를 보면 중점(같이 생긴 부호)은 여러 가지가 있다. 일반적으로 국문 문장부호로 사용하는 게 이 중점(·)이다. 유니코드로는 00b7. 윈도우 한글 입력기에서는 ㄱ을 입력하고 한자 키를 누르면 두 번째 페이지 8번째에 있다.


이거랑 비슷한 녀석으로 불릿(•)이 있다. 더 크다. 유니코드로 2022. 주로 목록을 표시할 때 목록 앞머리에 쓴다.


위의 위키백과에 따르면 이 둘은 레이텍에서는 각각 \textperiodcentered\textbullet이다.


얘네 둘까지는 혼돈이 없는데, 수식으로 가면 복잡해진다. 위 두 가지의 수식 버전에 해당하는 점 연산자(⋅)와 불릿 연산자(∙)가 있다. 유니코드에서 각각 22c52219다. 레이텍으로 치면 각각 \cdot\bullet이다.


이런 걸 고민하는 게 나뿐만은 아니다. 텍 스택오버플로에 관련 질답이 있었다. 해당 답변을 건단히 정리한 게 이상의 내용이다.


여기부터는 내 문제. 내가 애용하는 모 레이텍 렌더링 사이트에서 \cdot을 입력하면 pdf 결과가 중점(00b7)으로 출력된다는 거다. \bullet을 입력하면 그냥 불릿(2022)으로 출력된다.


게다가 점 연산자와 불릿 연산자를 입력하면 아예 제대로 렌더링이 안 된다.



이 사이트는 레이텍의 표준 서체와도 같은 Computer/Latin Modern 서체(위키백과) 등을 사용하는데, 글리프를 직접 확인해보니 이 옛날(?) 서체들에는 22c5와 2219 글리프가 없었다(한편, 오라일리 같은 외국 출판사에서는 종종 수식에 STIX 서체(위키백과)를 사용한다. STIX 서체에는 22c5와 2219 글리프를 포함해 엄청나게 많은 글리프가 들어 있다).


결론적으로 그렇다고 한 건... 사실 점(불릿) 연산자와 중점(불릿)을 시각적으로 구분하는 것은 불가능하기 때문이다. 따라서 문단 수식을 조판하는 데에는 여전히 저 사이트를 이용해도 문제는 없어 보인다. 물론 더 정확히 하려면 뭔가 다른, 제대로 된 레이텍 렌더링 방법을 찾아야 한다. 근데 이러면 나 한 몸 편하자고 온라인으로 레이텍 렌더링하는 게 무슨 의미가 있느냐고...


*추가:

위 사이트 말고 다른 레이텍 렌더링 사이트에서는 중점과 점 연산자가 잘 구분되어 렌더링되고 pdf로 출력하면 제대로 된 글리프가 나온다. 예제 파일. 이걸 pdf로 출력하고 그 pdf에서 텍스트를 복사해서 워드 같은 데 붙여넣기해보면 글리프가 다른 걸 확인할 수 있다.


게다가 이 사이트는 컴파일러를 고를 수도 있다. 이게 왜 유용하냐면... 유니코드에는 그리스문자 델타(Δ)와 증분 기호(∆)가 별도로 들어 있는데(각각 03942206) 후자를 레이텍으로 쓰려면 unicode-math 같은 패키지가 필요하고 이 패키지는 pdflatex가 아니라 xelatex나 lualatex에서만 사용할 수 있다. 위 사이트에서는 이들 여러 컴파일러를 모두 사용할 수 있다.





Posted by 필유
응용프로그램2016. 7. 8. 11:14

옛날 글에 썼듯 크롬은 컨트롤+탭으로 최근 탭 간 이동을 할 수 없다. 크롬이 처음 나왔을 때부터 지금까지 단 한 번도 지원된 적이 없다. 이슈 리포트는 이런 문서 등을 참고. 이에 여러 확장기능이 나왔으나 Ctrl+Tab이 아니라 다른 단축키를 사용하는 꼼수밖에 없었다. 혹은 오토핫키를 쓰거나. 어쨌든 구글은 이걸 지원할 생각이 없다.


이에 최근 나온 방법이 있다. Ctrl+Tab MRU라는 확장기능을 깐다. 일단 현재는 이걸 깔면 Ctrl+Y로 최근 탭으로 이동할 수 있다(물론 구글이 언젠가 이것도 막을지 모른다). 이제 이 확장기능의 단축키를 Ctrl+Tab으로 바꾸면 된다.


물론 구글 설정에서는 단축키로 탭을 지정할 수 없다. 이에 해당 확장기능 설명 페이지에 적힌 방법은 이렇다. 윈도우 기준.

  1. 크롬을 끈다.
  2. %LOCALAPPDATA%\Google\Chrome\User Data\Default로 이동
  3. Preferences 파일을 열고 Ctrl+YCtrl+Tab으로 바꾼다(Ctrl+Shift+YCtrl+Shift+Tab으로).
  4. 파일을 저장하고 크롬을 켠다. Preferences 파일은 UTF8로 된 JSON 파일이다. 인코딩이 잘못되면 설정이 날아가버리니(경험담) 잘 모르겠으면 백업해두는 게 좋다.
  5. 크롬을 켠다.
  6. 구글 확장기능 단축키 설정에 가서 'Ctrl+탭'으로 표시되는 걸 확인한고 [확인]을 누른다.

정확하지는 않지만, 1~5번까지만 거치고 6번 과정을 생략하면 크롬 종료 시 해당 단축키가 리셋되는 듯하다. 나는 그냥 부팅할 때마다 실행되는 배치 파일에서 Preferences 파일을 수정하게 해놨다. 먼저 아무 곳에나 파워셸 파일을 하나 만든다.

(Get-Content $args[0] -Encoding UTF8) -replace "Ctrl\+Y", "Ctrl+Tab" -replace "Ctrl\+Shift\+Y", "Ctrl+Shift+Tab" | Set-Content $args[0] -Encoding UTF8


그다음 부팅할 때마다 실행되는 배치 파일에 다음과 같이 추가.

Powershell -noprofile -executionpolicy bypass -file 앞에서_만든_파워셸_파일.ps1 "%LOCALAPPDATA%\Google\Chrome\User Data\Default\Preferences"


파워셸 말고 그냥 배치 파일로도 가능할 것 같은데 뭔가 생각보다 복잡해서 그냥 포기했다.


Posted by 필유
프로그래밍2016. 7. 6. 14:04

1. 여러 블로그에 있듯, 먼저 Docker toolbox for Windows를 설치한다. 이런 문서 등을 참고.


2. 그다음 %DOCKER_TOOLBOX_INSTALL_PATH%에 가서 다음과 같이 start.sh를 실행하고

"%ProgramFiles%\Git\bin\bash.exe" --login -i start.sh

3. 한참 기다리고(첫 실행 시) 고래 그림이 뜨면 끝. cmd를 열고 도커용 환경변수를 설정한다. 물론 배치 파일 내에서 실행할 경우 %i는 %%i로 바꿔야 한다.

FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO %i


4. 이제 도커로 다음과 같이 텐서플로 이미지를 실행하고, 브라우저에서 주피터로 실습을 하면 된다.

docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-devel



단, 구글이 제공하는 도커 이미지는 텐서플로 0.8과 파이썬 2.7용만 있는 듯하다. 이건 그렇다 쳐도 pandas나 seaborn 같은 파이썬 라이브러리가 들어 있지 않아 매번 새로 설치하기가 번거로웠다. 따라서 도커로 새로 자신만의 이미지를 만들고 쓰는 게 나을 듯. 예를 들어 Dockerfile.을 다음과 같은 식으로 작성한다.

FROM gcr.io/tensorflow/tensorflow:latest-devel
RUN pip install seaborn
RUN pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
RUN git clone https://github.com/rickiepark/tfk-notebooks.git
CMD jupyter notebook

pandas는 seaborn의 디펜던시이므로 seaborn 설치 시 같이 설치된다. 위에 예로 쓴 깃허브 노트북은 텐서플로 코리아 블로그 운영자의 저장소이다. 위에서는 텐서플로 0.9+파이썬 2.7 바이너리 패키지를 골랐다. 다른 패키지는 텐서플로 설치 문서를 참고.


이제 이 Dockerfile.을 어디 빈 폴더에 넣고 새로운 이미지로 빌드한다.

docker build -t merong .

merong은 새 이미지의 이름(태그)이다. 빌드 후에는 위의 4단계에서 실행할 이미지를 새 이미지 이름으로 바꾼다.

docker run -it -p 8888:8888 merong



추가: 물론 변경한 파일 내용을 계속 기록하고 싶다면 도커 컨테이너를 계속해서 갱신해야 한다. 가령 컨테이너 이름을 dev로 정해서 쓴다고 하면 다음과 같은 식으로. 사실 도커를 처음 쓰다 보니 다른 사람들은 어떻게 쓰는지 모르겠다(...).

docker run -it -p 8888:8888 --name=dev merong:dev
docker commit dev merong:dev
docker rm dev


사족으로, 이 환경에서 virtualenv를 설치하고 파이썬 3 환경으로 바꾸는 시도를 했으나, matplotlib였던가 pandas였던가가 설치되지 않았다. 포기하고 2.7 기준으로 쓰기로 함.



Posted by 필유
프로그래밍2016. 4. 8. 17:38

지난 글과 비슷한데, 이번에는 그루비(Groovy) 파일을 테스트하는 방법. 테스트는 JUnit을 이용하며, 그루비에는 이게 내장되어 있어 별도로 설치할 필요는 없다.


원리는 스칼라 때와 같다. groovy.bat를 호출하면 실행만 하고 끝나므로 테스트가 불가능하므로, 컴파일 먼저 하고 테스트를 하게 수정하는 거다. groovy.bat를 보면 .groovy 파일을 실행하는 부분은 다음과 같다.

"%DIRNAME%\startGroovy.bat" "%DIRNAME%" groovy.ui.GroovyMain %*

여기 위에 한 줄을 추가한다.


call "%DIRNAME%\startGroovy.bat" "%DIRNAME%" org.codehaus.groovy.tools.FileSystemCompiler %*

스칼라 때와 마찬가지로 groovyc.bat 파일에서 컴파일하는 부분을 가져온 거다. ScalaTest는 테스트 대상이 다른 클래스를 참조할 경우 .class 파일이 필요했는데 그루비는 그렇지는 않았다. 참조되는 클래스를 먼저 컴파일해야 테스트 파일도 실행된다. 단지 소스 파일과 다른 어딘가-_-에 생성되는 듯.


이제 아톰에서 자바를 실행하기만 하면 현재 작업하는 책에 나오는 4개 언어를 다 아톰만 가지고 쓸 수 있게 되는 셈인데... 유감스럽게도 자바는 워낙 프로젝트 기반이고 라이브러리가 많아 아톰에서 일일이 설정하는 게 더 불편할 듯싶어 포기.


자바와 스칼라는 이클립스(스칼라 IDE), 자바스크립트는 웹스톰, 나머지 언어는 아톰, 이 정도로 개발(!?) 환경을 정리할 수 있을 듯.



Posted by 필유
프로그래밍2016. 4. 6. 18:12

요즘 아톰(Atom) 에디터에 푹 빠져 모든 언어(및 마크다운, 아스키독 등 문서)를 이 에디터에서 돌려보고 있다. 자세한 건 나중에 다시 쓰고...


클로저 파일을 프로젝트 만들지 않고 파일 단위로 아톰에서 실행하기 위해 라이닝겐 배치 파일을 수정한 건 이미 깃허브에 올렸고, 오늘은 스칼라 파일이 여러 개 있을 때 실행하는 방법이다. 덧붙여 스칼라테스트(ScalaTest)도 지원하게 했다. 이건 딱히 깃허브에 올릴 수가 없어(전에 올린 것도 사실 PR 보내기도 좀 거시기한 수정이었다만) 일단 여기에 올린다.


수정 방법. scala.bat를 보면 .scala 파일을 실행하는 부분은 다음과 같다.


"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %*


여길 이렇게 고친다.


set _SCALA_FILE=%~n1

set _SCALA_FILE_PATH=%~dp1


"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.Main  %*

cd %_SCALA_FILE_PATH%

"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %_SCALA_FILE%

if %ERRORLEVEL%==0 goto end

"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" org.scalatest.run %~n1

goto end


설명-_-하자면... .scala 파일을 단순히 실행하는 게 아니라, .class 파일로 컴파일한 다음에 실행한다. 실행 결과 오류가 나지 않았다면 종료하고, 오류가 났다면 해당 클래스를 스칼라테스트로 다시 실행한다.


findstr /c:"import org.scalatest." "%1" > nul
if %ERRORLEVEL% == 0 goto RUN_TEST
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %*
goto end

:RUN_TEST
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" org.scalatest.run %~n1
goto end

테스트가 들어 있는 파일도 그냥 오류가 나지 않을 수 있어, 그냥 대상 파일 안에 org.scalatest를 임포트하는 텍스트가 있으면 테스트로, 아니면 그냥 실행하도록 바꿨다.


스칼라테스트(scalatest ... .jar) 파일은 스칼라의 라이브러리 폴더에 이미 있다고 가정하고 따로 클래스패스를 지정하지는 않았다.


그냥 무식한 방법. 컴파일 시 생성된 .class 파일은 지우지 않고 뒀다. 클로저와는 달리, 여러 파일 실행 시 클래스 파일이 있어야 한다.


물론 스칼라 IDE에서 스칼라테스트 플러그인을 받아서 함께 사용하는 게 더 깔끔하다. 근데 그러려면 프로젝트를 만들고 어쩌고 해야 하니까 그게 귀찮을 뿐.


Posted by 필유
응용프로그램2015. 12. 9. 20:00

Noto Sans라는 서체가 있다. 구글과 어도비가 만들었다. 고정폭 서체도 있다. Mono가 붙는다. 물론 CJK(한중일) 버전도 있다. CJK 안에서 각 언어별 서체가 또 따로 있다. 한글은 KR. 그래서 다 합치면 Noto Sans Mono CJK KR이 된다.

https://www.google.com/get/noto/help/cjk/

 

고정폭 서체라 관심이 컸는데, 막상 워드 같은 데서 PDF를 만들어보니 임베딩(서브세팅)이 '제대로' 안 된다. 워드 자체 기능 및 애크러뱃(디스틸러) 둘 다 결과는 조금 다르지만 어쨌든 제대로는 안 된다. 혹시나 해서 해당 서체 깃허브 저장소에 문의했는데 워드 '2010'에서는 트루타입 '기반의' 서체만 임베딩이 된다는 답변을 들었다. 해당 서체는 오픈타입. 워드 2013은 되나 모르겠는데, 없어서 모름.

https://github.com/googlei18n/noto-cjk/issues/51

 

직접적인 관련이 있는 건 아니지만, 나중에 찾아보니 오픈타입 임베딩이 가능한 PDF 버전은 1.6 이상이다(근데 워드 2010 자체 기능으로 저장한 PDF의 버전은 기본값이 1.5고 옵션으로 1.4로도 저장할 수 있다).

http://community.zmags.com/articles/Knowledgebase/Difference-between-full-embedded-fonts-and-embedded-subset-1277814749518

 

안 된다고 넘어가면 될 일이긴 한데 뭔가 열받아서, 해당 서체를 지정한 HTML 파일을 만들고 파폭 및 크롬에서 애크러뱃으로 인쇄해봤다. 우선 파폭에서는 임베딩도 안 되고 결과물이 아예 비어 있었다.

 

크롬은 자체 PDF 저장 기능이 있다. 이걸로 만든 PDF는 버전이 1.4였다. 임베딩이 되긴 되는데 타입 3의 알 수 없는 서체 몇 개로 임베딩이 되고, 텍스트를 긁으면 이상한 문자가 나온다.

 

크롬 자체 PDF 저장 기능으로 저장한 PDF 문서 속성 중 글꼴
크롬 자체 PDF 저장 기능으로 저장한 PDF 문서 속성 중 글꼴

 

다음으로, 크롬에서도 애크러뱃을 통해 만들어봤다. 임베딩은 안 되고, 텍스트는 아웃라인(!)으로 저장된다(그래도 파폭보다는 낫네).

 

그래서 도대체 이 서체 임베딩을 제대로 지원하는 윈도우용 프로그램이 있긴 한 건가 싶었지만... 인디자인 CC 2014에서 해보니 역시나 잘만 된다(PDF 1.7에서 오픈타입으로 볼드 및 레귤러 각각 서브세팅). 다른 프로그램에선 임베딩은 포기하는 게 마음 편할 듯. 일반 사용자에게는 중요한 일도 아닐 테고.

 

추가:

워드 자체 저장 기능, 즉 파일>다른 이름으로 저장>pdf 선택 말고, 애크러뱃을 깔면 같이 깔리는 오피스용 애드온인 PDFMaker를 이용하니 오픈타입은 아니지만 임베딩이 되고 텍스트도 제대로 긁히는 걸 확인했다. 레귤러 하나만 타입1(CID) 형태로 서브세팅되는데, 볼드는 '가짜 볼드'로 처리하는 게 아닐까 추측.

 

Acrobat>PDF 작성
Acrobat>PDF 작성

 

디스틸러를 두고 굳이 애드온을 써서 해야 하나 싶긴 한데 어쩔 수가 없네. 워드(오피스)에서 PDF 만들 일이 있다면 디스틸러 말고 PDFMaker를 쓰는 걸 권한다.

 

 

 

 

Posted by 필유