#action Blog 블로그 더하기 ##Blog {{{#!blog hyacinth 2015-02-26T07:34:22 python isnumeric ##blog-desc 파이썬으로 백엔드를 만드는 중에 cmd 파라미터로 숫자를 받는 부분이 있었는데 유효한 값 체크를 위한 str.isnumeric() 부분에서 음수가 들어올 때 통과를 못했다. 하도 어이가 없어서 여기에 대해 IRC에 말해봤다. 파이썬으로 백엔드를 만드는 중에 cmd 파라미터로 숫자를 받는 부분이 있었는데 유효한 값 체크를 위한 [[Code(str.isnumeric())]] 부분에서 음수가 들어올 때 통과를 못했다. 하도 어이가 없어서 여기에 대해 IRC에 말해봤다. {{{#!irccolor [16:15] 18<jaeholee_18> ㅋㅋㅋㅋㅋㅋㅋㅋㅋ [16:17] 20<hyacinth^talk>30 음수 붙은 건 숫자 아닌가요? [16:17] 20<hyacinth^talk>30 print (u"-5").isnumeric() 하니까 [16:17] 20<hyacinth^talk>30 False 내뱉는 거 보니까 [16:17] 20<hyacinth^talk>30 헐.. . [16:18] 18<ditto18> isnumeric 자체가 원래 한 글자에만 먹는거 아닌가요 [16:19] 18<ditto18> Return True if there are only numeric characters in S [16:21] 20<hyacinth^talk>30 5.5 같은 것도 False 떨어지는 거 보니까 [16:21] 20<hyacinth^talk>30 문자열 처음부터 끝까지 읽어서 0~9 아니면 [16:22] 20<hyacinth^talk>30 False인가보네요 [16:22] 20<hyacinth^talk>30 진짜 숫자 판단하는 건 직접 만들라 이건가 [16:22] 20<hyacinth^talk>30 ... [16:22] 18<lifthrasiir18> float을 통과하면 되죠 뭐 [16:23] 18<lifthrasiir18> 어차피 1e30000 같은 걸 받고 싶은 건 아니잖아요? [16:23] 20<hyacinth^talk>30 아 그래도 되겠구나 [16:23] 18<ditto18> 그리고 isnumeric은 문제가 Ⅲ 같은 것도 [16:23] 18<ditto18> True로 떨어져요 [16:23] 18<ditto18> ㅋㅋㅋ [16:24] 18<kkung18> NUMERIC [16:24] 20<hyacinth^talk>30 ditto//... 진짜네요 [16:24] 18<ditto18> ¾ [16:24] 18<Yurumechan18> 애초에 [16:24] 18<ditto18> 이것도 True ㅋㅋㅋ [16:24] 18<Yurumechan18> 유니코드 문자 체크라서 [16:24] 18<ditto18> 넹 [16:24] 18<Yurumechan18> 별 이상한게 다 잡힘 [16:24] 18<kkung18> 一 이것도 [16:25] 18<kkung18> true인가요 그럼 [16:25] 18<Yurumechan18> isdecimal인가도 마찬가지 [16:25] 18<changwoo18> 네[ 한글도 isalpha() True [16:25] 18<Yurumechan18> isdecimal은 [16:25] 18<Yurumechan18> 아 isdigit에 합쳐져 있나 [16:25] 18<Yurumechan18> 여튼 아랍 문자가 잡힌다거나... [16:25] 18<kkung18> >>> u'一'.isnumeric() [16:25] 18<kkung18> True [16:25] 18<kkung18> 과연 [16:25] 20<hyacinth^talk>30 무섭다 [16:25] 20<hyacinth^talk>30 호러 [16:25] 18<ditto18> ㄲㄲ [16:25] 18<kkung18> >>> u'일'.isnumeric() [16:25] 18<kkung18> False [16:25] 18<kkung18> 차별하네 [16:25] 18<kkung18> (?) [16:25] 18<ditto18> work [16:26] 18<Yurumechan18> 뜻문자의 장... 아니 단점 [16:32] 18<changwoo18> >>> u'𐅉'.isnumeric() [16:32] 18<changwoo18> True [16:32] 18<changwoo18> 꼼꼼하네요 [16:33] 18<ditto18> 저게 무슨 글자죠? ㅠㅠ [16:33] 18<ditto18> greek acrophonic attic ten talents [16:33] 18<changwoo18> 고대그리스숫자..라네요 [17:23] 18<jeyraof^18> 쩐다 [17:23] 18<jeyraof^18> isnumeric() [17:24] 18<kkung18> '一' 집어 넣으면 1 나오는 라이브러리 같은거 만들면 재밌을꺼 같군요 [17:25] 18<kkung18> '一 + 2' 같은걸 만들 수 있을텐데 [17:25] 18<kkung18> 근데 순전히 다 노가다 해야하는건가 [17:25] 18<kkung18> unicode db에 저런건 없나 [17:25] 18<ditto18> 제가 알기론 있는데 [17:25] 18<kkung18> http://www.charbase.com/3192-unicode-ideographic-annotation-one-mark [17:25] 18<kkung18> 그러게요 [17:26] 18<kkung18> 'numeric value' [17:26] 18<ditto18> >>> unicodedata.numeric(u'一') [17:26] 18<ditto18> 1.0 [17:26] 18<ditto18> ㅋㅋㅋㅋ [17:32] 18<토성구름18> https://github.com/karipe/plusplus/blob/master/plusplus.py 이런 쓸데없는 거 만들다가 귀찮아서 버린 적이... }}} > The following methods are present only on unicode objects: >  > unicode.isnumeric() >  > Return True if there are only numeric characters in S, False otherwise. Numeric characters include digit characters, and all characters that have the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION ONE FIFTH. > [https://docs.python.org/2/library/stdtypes.html#string-methods Python documentation]   http://hyacinth.byus.net/moniwiki/pds/TsukkomiGathering/%ED%97%88%EB%AC%B4_02.jpg?width=300 멍... 아, '숫자 문자'를 판단하는 거구나 파이썬 isnumeric()은 문자열이 유니코드 상에서 숫자 문자(u'四', u'¾' 분수, u'𐅉' 고대 그리스 숫자 (...) 등)로만 이루어져 있는지 판단하는 것이었는데 내가 의미를 잘못 생각했다. 쓸모있는 기능이긴 하지만 내가 필요했던 건 아니었다. 음수까지 대응할 수 있는 대안을 찾아봤는데 형 변환 할 때 예외처리를 사용하는 방법이 나아 보인다. http://stackoverflow.com/questions/736043/checking-if-a-string-can-be-converted-to-float-in-python {{{#!gcode def isfloat(value): try: float(value) return True except ValueError: return False }}} 결과 목록 {{{#!gcode Command to parse Is it a float? Comment print(isfloat("")) False print(isfloat("1234567")) True print(isfloat("NaN")) True nan is also float print(isfloat("NaNananana BATMAN")) False print(isfloat("123.456")) True print(isfloat("123.E4")) True print(isfloat(".1")) True print(isfloat("1,234")) False print(isfloat("NULL")) False case insensitive print(isfloat(",1")) False print(isfloat("123.EE4")) False print(isfloat("6.523537535629999e-07")) True print(isfloat("6e777777")) True This is same as Inf print(isfloat("-iNF")) True print(isfloat("1.797693e+308")) True print(isfloat("infinity")) True print(isfloat("infinity and BEYOND")) False print(isfloat("12.34.56")) False Two dots not allowed. print(isfloat("#56")) False print(isfloat("56%")) False print(isfloat("0E0")) True print(isfloat("x86E0")) False print(isfloat("86-5")) False print(isfloat("True")) False Boolean is not a float. print(isfloat(True) True Boolean is a float print(isfloat("+1e1^5")) False print(isfloat("+1e1")) True print(isfloat("+1e1.3")) False print(isfloat("+1.3P1")) False print(isfloat("-+1")) False print(isfloat("(1)")) False brackets not interpreted }}} }}} [[HTML(
)]] http://hyacinth.byus.net/img/flower.jpg [[HTML(
)]] {{{#!blog hyacinth 2015-02-17T02:15:59 디큐브시티 핫트랙스 헤드폰 청음 attachment:150215_1.jpg?width=640 일요일에 신도림 디큐브시티 들렀는데 지하 1층에 핫트랙스가 개점해 있었다. 지난 달부터 공사중이었는데 규모가 꽤 큰 편이었다. 헤드폰, 이어폰이 청음 가능한 상태로 의외로 많이 준비되어 있었다. 최근 출시되어서 못 들어본 헤드폰들도 있어서 헤드폰 위주로 들어봤다. 의도치 않은 청음기가 되어버렸다... attachment:150215_2.jpg?width=640 아래는 간단한 들어본 후기. 오르바나 라이브2 - 착용감은 편한 편. 영혼없는 소리. 다르게 말하면 조금 심심한 소리. 평이 좋았던 걸로 기억하는데 약간 실망했다. 가성비가 좋다는 의미였는 듯. 오르바나 골드 - 머리에 너무 끼어서 착용감이 아주 불편하다. 저역 소리가 너무 울린다. attachment:150215_3.jpg?width=640 젠하이저 Urbanite - 박력있는 소리인데 조금 부담스럽다. 젠하이저 Momentum - 균형있는 소리에 해상력 뛰어나다. 소리 좋다. 그런데 좌우 소리 균형이 안 맞았다. 전시된 물건이라 단선될 수는 있는 일이지만 조금 더 생각하면 전시 중 단선된 헤드폰이 있다면 그건 내구성이 부족하다는 얘기가 아닐까? 다른 헤드폰들도 손을 안 타는 건 아닐테니까. 외관 디자인 멋지다. 젠하이저 Momentum OE - 해상력은 괜찮은데 베이스가 약간 강조됨. 부담되는 정도는 아님. 나쁘지 않다. 젠하이저 PX88 - 무게가 대단히 가볍다. 소리도 가볍다. 헤드폰보다는 이어폰 소리 같다. attachment:150215_4.jpg?width=640 소니 S70AP - 해상력 떨어짐. 그저 8만 원대 아웃도어 헤드폰 소리. 소니 MDR-1 - 무게가 가볍고 헤드 움직임이 자유로워서 편하다. 크기에 비해 아웃도어에도 부담없는 디자인. 소리는 보통 수준, 나쁜 편은 아님. 그런데 재미없는 소리. ##attachment:150215_5.jpg?width=400 DEADMAU5 - 닥터 드레 헤드폰이 떠오르는 뭔가 OEM스러운 브랜드. 소리는 값싼 패션 헤드폰 급. 기억에 남지도 않는다. 슈어 SRH145 - 슈어에서 나온 아웃도어 헤드폰. 소리는 가격대 수준. 보스 사운드링크 OE - 전형적인 보스 소리. 30만 원대 보스 스피커에서 나는 소리하고 대단히 비슷하다. 만듦새가 디테일한 부분까지 마감이 상당히 좋다. 전원 들어가고 볼륨 조절 버튼도 있는 걸 보니 블루투스도 되는 듯. 오디오 테크니카 ATH-MSR7 - 오테가 소니와 하이 레졸루션 오디오 제휴 맺고 만든 게 이 헤드폰이다. 저역이 부족한 듯. 그렇다고 고음이 쏘는 것도 아니고. 전체적으로 어딘가 부족한 소리. 한마디로 일반적인 오테보다는 소니 소리다. 내 취향은 아님. 오늘 들어본 헤드폰 중 들을만 했던 건 젠하이저 모멘텀 밖에 없었다. 전문 청음샵처럼 100만 원 넘는 고가 헤드폰은 하나도 없고 모두 중저가 헤드폰이긴 하지만 신도림 인근 살고 있다면 청음샵 대신 한 번 방문해도 괜찮을 듯 하다. ''2016.10.01. 추가 ─ 결국 이 날 경험으로 나중에 보스 사운드링크 AE2를 구매했다. 보스 소리를 워낙 좋아해서...'' }}} [[HTML(
)]] http://hyacinth.byus.net/img/flower.jpg [[HTML(
)]] {{{#!blog hyacinth 2015-02-16T08:45:48 윈도우 현재 배경화면 그림 파일을 탐색기로 열어주는 스크립트 윈도우 배경화면을 한동안 같은 그림으로 쓰고 있었는데 문득 지겨워져서 그림 폴더에서 30초 간격으로 랜덤으로 바뀌게 설정해놓았다. 그러다보니 설정된 배경화면의 원본 이미지를 보고 싶을 때가 있었는데 그림 폴더에 그림이 수천 장 있었기 때문에 원본을 찾기 힘들었다. 그렇다... 난 이런 그림이나, attachment:150216_2.jpg?width=500 이런 그림이, attachment:150216_3.jpg?width=500 배경화면이 되었을 때 (분명 내가 저장해둔 사진이긴 하겠지만) 전체 그림이 어떻게 생겼는지 신경쓰여 참을 수가 없었던 것이다. 그래서 원본 이미지를 바로 찾을 수 있는 스크립트를 만들었다. 윈도우 배경화면의 위치는 레지스트리 [[Code(HKCU\Software\Microsoft\Internet Explorer\Desktop\General\WallpaperSource)]]에 그림 파일 경로가 저장되어있다. 아래는 이 값을 VBS로 읽어 그림 파일과 탐색기 상 위치를 열어주는 스크립트다. PROFIT! attachment:wallpaper.vbs {{{#!gcode Option Explicit Const strValuePath = "HKCU\Software\Microsoft\Internet Explorer\Desktop\General\WallpaperSource" Dim wshShell Set wshShell = WScript.CreateObject("WScript.Shell") On Error Resume Next Dim strPath strPath = wshShell.RegRead(strValuePath) Dim fso Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists(strPath) Then wshShell.Run """" & strPath & """" wshShell.Run "explorer /select,""" & strPath & """" End If }}} }}} [[HTML(
)]] http://hyacinth.byus.net/img/flower.jpg [[HTML(
)]] {{{#!blog hyacinth 2015-02-13T01:50:19 자주 이러면 잠수함에서 감자 깎아야 하는 프로그래머 다음은 C#에서 비동기로 HTTP 요청를 보내는 코드의 일부다. 머리 노란 애들이 작성한 코드를 볼 때 유니코드 인코딩 부분은 가장 찾기 흔한 실수 중 하나다. {{{#!gcode string postData = contents; // Convert the string into a byte array. byte[] byteArray = Encoding.UTF8.GetBytes(postData); // Write to the request stream. postStream.Write(byteArray, 0, postData.Length); postStream.Close(); // Start the asynchronous operation to get the response request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); }}} 이 코드는 UTF-8 인코딩으로 2바이트 이상 되는 문자를 전송하려고 하면 프로그램이 죽는다. 영어로만 전송을 하면 이상을 알아차리기 힘든 코드다. 이렇게 수정되어야 한다. [[Code(postStream.Write(byteArray, 0, postData.Length);,#color:#990000#)]] [[Code(postStream.Write(byteArray, 0, byteArray.Length);,#color:#38761D#)]] UTF-8에서 영어 알파벳은 1바이트기 때문에 postData.Length도 문제가 없었겠지만 바이트 스트림이라면 문자열 길이보다 길어질 수 있기 때문에 바이트 길이로 보내야 한다. 기껏 문자열에서 유니코드 바이트로 바꿔놓고 프로래머가 쓰다가 졸았나보다. }}} [[HTML(
)]] http://hyacinth.byus.net/img/flower.jpg [[HTML(
)]] {{{#!blog hyacinth 2015-02-05T09:26:28 올해의 주제 조금 늦었지만 올해도 한 해의 개인적인 주제를 골라본다. 작년은 "100% 알지 못하는 건 전혀 모르는 것과 같다."였다(링크: [wiki:Blog/2014-01?action=blog&value=978b5e3e0962545b45c0dfcfec72191b 신년을 맞아]). 올해도 비슷한 맥락이지만 조금 더 구체적인 말을 골라봤다. > "설명하거나 글자로 남기지 못한다면, 당신은 그것에 대해서 잘 알고 있지 못한 것이다." 어떤 지식을 남에게 쉽게 설명하기 위해선 글이나 말로 풀어쓰는 분량의 10배 정도는 자세히 알고 있어야 한다고 말한다. 나도 경험적으로 그렇게 느끼기도 한다. 설명하기 어렵다는 말은 그만큼 그 일에 대해서 잘 모르기 때문에 정리하기 어렵다는 말과 같다. 결국 어떤 도메인이든 지식은 깊게 알고 있어야 한다는 점에서 작년에 고른 주제와 비슷하다. 차이가 있다면 작년은 '알아야 한다'에서 그쳤지만 올해는 '알고나서 설명한다'까지 나아갔다는 점이다. ##새해에 이런 주제를 생각하는 건 단지 이런 방향으로 조금 더 바로 갈 수 있도록 목표를 정하는 것이다. }}} [[HTML(
)]] http://hyacinth.byus.net/img/flower.jpg [[HTML(
)]]