Lyn
조회 수 2057 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

afree.png

 

TAG •
?

Lyn
조회 수 1721 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

C++ Korea 에서 질문을 하나 받았습니다.

 

왜 아래 코드를 출력하면 결과가 1인가요? 라는 질문이었지요

struct Some
{
public:
    void func()
    {
        int i;
        i = 100;
        cout << i << endl;
    }
};

int main()
{
    cout << "Value : " << &Some::func << endl;
}

 

 

이걸 이해하려면 C++ 의 Type System 을 이해 하면 간단합니다.

 

첫째 :  &Some::func 는 Some의 Member function 으로서 void (Some::*foo)(void) 라는 Member Function Pointer Type을 가집니다.

 

둘째 : cout 은 stdout 을 대상으로 하는 출력 객체 이며 << 연산자에 대해 여러가지 type 으로 overloading 되어 있습니다.
실제 코드를 보면 bool, ushort ,short, int, uint, long, ulong, longlong, ulonglong, float, double, long double, void*, char, whcar_t, char* wchar_t* 에 대해 overloading 되어 있는것을 확인 할 수 있습니다(visual c++ 기준 ostream 헤더). string / wstring 에 대한 overloading 은 ostream 측에서 제공하는 것이 아니라 string 쪽에서 추가로 지원 하는 것이라 ostream 의 일부라 보기는 어렵습니다.

 

셋째 : overloading 된 함수를 호출 할 경우 완전히 매칭 되는 타입의 함수를 호출합니다.

하지만 내가 방금 만든 Class 의 MemberFunction Type 이 미리 준비 되어 있을리가 없겠죠

 

넷째 : 완전히 매칭되는 함수가 없을 경우 변환 가능한 가장 "적절한" type 의 함수로 호출합니다.
 

자 그럼 이제 어떤 type으로 캐스팅이 가능하냐를 봐야 하는데... 일단 정수형과 부동소수점은 딱 봐도 안될 것 같습니다.

문자 / 문자열포인터 역시 가지고 있는것이 string 일리가 없으므로 그렇게 암시적으로 캐스팅 하면 AccessVoliation 의 지름길일 겁니다.

그럼 void* 는 어떨까요? 임의의 pointer를 가지는 type 이지만 Member Function Pointer 만큼은 예외입니다.

void*는 일반적인 포인터 사이즈 이지만 Member Function Pointer 는 그렇지 않습니다. 상속을 어떤 구조로 어떻게 받느냐에 따라 크기가 변하지요

간단한 예로 

 

cout << sizeof(&iostream::flush);

 

를 실행시켜 보면 VC++ x64 기준 16Byte가 나오는 것을 볼 수 있습니다. 경우에 따라 크기가 달라지는 이 시스템은 C++만의 독특한 구현이며 이것이 std::function 이 나오기 전까지 임의의 member function 을 가지는 변수를 선언 할 수 없었던 이유이기도 합니다. 그래서 void* 도 아웃이네요

 

자 그럼 bool 하나만 남았는데... 그럼 Member Function Pointer 가 bool로 캐스팅 될 수 있을까요? 정답은 가능하다 입니다.

어렵게 생각 하실 것 없습니다. 그동안 Function Pointer 를 다루셧던 분들은 아래와 같은 코드를 보거나 혹은 사용해 보셨을 것입니다

 

if(ptr) {

   //dosomething

}

 

이런식으로 ptr 이 nullptr 이 아닌지 체크 하여 사용하는 코드가 가능햇죠. 이 말은 반대로 말하면 ptr이 if 의 조건 이 될 수 있다는 것이며 if 의 조건이 될 수 있다는 말은 C++ 에서는 bool 로 캐스팅 가능 하다는 이야기가 됩니다. 

C++ 표준 라이브러리의 많은 식도 이런식으로 bool 캐스팅을 가능하게 하여 구현했는데 shared_ptr<T> 같은 포인터를 랩핑하는 객체가 대표적입니다. 특정 객체의 사용 가능 여부를 bool 로 캐스팅 하여 체크한다는 아주 단순한 방법을 이용 할 수 있게 하는거지요. 이런 기법을 C++ Safe Bool Idiom 이라고 부릅니다. Classic C++ 에서는 구현이 상당히 복잡했지만 C++11 에 와서는 특히 간단히 구현할 수 있게 되어 더욱 많이 쓰게 되는 방법이 되었지요.

 

자 그럼 Member Function Pointer 가 bool로 캐스팅이 될 수 있다는것은 알았습니다. 그리고 당연히 변수가 아니라 존재하는 Function 의 Pointer를 가져온 것이므로 nullptr 이 아닐것이 확실합니다. 결과적으로 cout << true 의 결과물인 1이 출력 되는 거겠구요.

 

그럼 위 코드에 간단한 함수를 하나 추가 해서 정말 그러한지 테스트를 해 봅시다

 

void foo(void* v)
{
    cout << "ptr";
}

void foo(bool v)
{
    cout << "bool";
}

void foo(int v)
{
    cout << "int";
}

void foo(double v)
{
    cout << "double";
}

int main()
{
    foo(&Some::func);
}

 

결과물은 당연히 bool이 나오게 됩니다.

 

참고자료 : C++ Idioms/Safe bool https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool

TAG •
?

2018.02.07 11:20

Kotlin 공부 후기

Lyn
조회 수 1234 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

코틀린 혼자서 사용해 본 지 한달이 좀 넘은거 같아서 일단 느낀점 정리..

 

1. property 는 자바 Bean과 호환성이 있는건 좋다. 문제는 자바에서 만든 property 를 코틀린쪽에서 부를 때인데 setFoo / getFoo 를 호출 하는 것도 가능하고, 대입도 가능하다 보니 혼란이 온다...

 

1-2. 대체 안드로이드 API가 왜 이딴식으로 만들어져 있는지는 모르겠지만 ... set / get 이 아니라 set / is 로 매칭되는 애들이 많은데 이런 경우에는 코틀린에서 property 취급을 해주지 않아서 setFoo 를 호출해야 한다..

 

2. 이유는 모르겠지만 JVM 이 delegate를 지원하지 않고 (자바보다 먼저 나온 언어들도 되는건데 ㅡㅡ;) 인터페이스를 구현해서 넘기는 식으로 구현해 오니 생긴 사이드이펙트인데 자바의 lambda 와 마찬가지로 kotlin의 lambda 도 매소드가 하나인 interface 구현의 syntax suger 라서 여러개의 함수를 가진 인터페이스를 구현해서 넘겨야 하는 라이브러리들을 사용할때 별 도움이 안된다. (Ex : 안드로이드의 ViewPager.OnPageChangeListener 같은거...) 

 

3. Java는 기본이 상속가능 / 오버라이딩 가능인데 코틀린은 반대라서 기존 리플렉션을 이용하는 라이브러리를 사용하려면 기껏 언어의 안정성을 위해 설계한 기본을 무시하고 일일히 다 open 해줘야 한다. 특히 Spring 같은 유명 프레임워크를 사용할때 치명적이다.. (뭐 몽땅 open 해주는 후처리용 도구가 있다고 하는데 난 개인적으로 컴파일 끝난 다음에 바이너리를 수정하는 식의 도구 별로 안좋아한다..)

 

4. Java는 기본이 Nullable 인데 코틀린은 기본이 NotNull이라서 기존 라이브러리를 호출할 때 foo?.boo?.zoo 처럼 ?!의 향연이 되거나 foo!! 와 같은 연산자로 언어가 도배가 되기 시작한다.

 

5. 이름으로 Parameter 호출하는 기능이 Java로 만든 코드에서는 동작하지 않는다. (IntelliJ 에서는 예쁘게 이름 띄워 주는데 내가 쓰는건 안된다 =_=)

 

6. 아직 kapt 가 불안정한듯. clean 하고 나면 잘 되는경우가 많다

 

7. 내가 서버프로그래머라서 그럴지 모르겠는데 NotNull이 막상 써보니 그다지 메리트가 없다. 무의미한 값이 나타나는 것 보다는 차라리 죽어주는게 버그를 빨리 찾아주는 것 같다

 

7-2. NotNull이 코틀린의 스펙일뿐 VM 에서 전혀 지원 하지 않다보니 리플렉션을 통해서 Null을 넣어버리면 NullPointerException 이 뜬다 (심지어 코틀린 입장에선 익셉션 발생 하기 전에 체크도 못한다... 어쩌라고) 문제는 데이터를 다루는 많은 라이브러리들이 그렇게 한다는거다

 

8. 확장 함수는 정말 편하다... Delphi 쓰던 시절부터 C#을 쓰는 지금까지 애용하던 기능. C++에서도 Mixin 같은 기법을 이용해서 많이들 썼었는데..

 

9. TypeSafety는 JVM의 한계 때문인지 별로 나아진게 없다

 

https://realm.io/products/realm-database/ 와 https://realm.io/blog/realm-4-3-0-released-w-first-class-support-for-kotlin/ 

에서 가져온 예제코드를 언어별로 보면

 

C#의 경우 Name 이라는 변수명을 컴파일타임에 체크 할 수 있다.(사실 linq 를 지원해도 되는데 relam 이 안하는거같다... 사실 앱스토어의 제약때문에 linq의 기능중 일부가 먹통이라 일부러 뺐을수도 있지만... iOS 지원할 안할경우엔 편한데)

var dogs = realm.All<Dog>().Where(d => d.Name.Contains("Fido"));

 

자바의 경우는 

RealmResults dogs = realm.where(Dog.class).in("name", new String[] {"Larry","Curly","Moe"}).findAll();

 

코틀린의 경우도 

val dogs = realm.where<Dog>().in("name", arrayOf("Larry", "Curly", "Moe"))

 

처럼 "name" 이라는 변수가 문자열로 넘어가게 되어 오타와 같은 실수에서 자유롭지 못하다

 

10. 자바쪽 라이브러리에서 type을 사용해야 할때 Foo::class.java 처럼 추가적인 키워드를 넘겨줘야 하는건 귀찮다... java라는 이름을 볼 때 마다 커피가 땡긴다.

 

11. var, val 은 편하다. 일단 type 추론을 해줘서 길고 긴 클래스명 안써도 된다는건 기본이고, mutable 과 immutable 을 구별 해 놓은것은 실수를 방지하는데 큰 도움이 된다. 문제는 이것도 Reflection을 사용하는 라이브러리에 변수가 넘어가면 사실상 무의미하다는거다 =_=;

 

결론 : 코틀린 언어 자체는 괜찮다. 난 C#이 최고의 언어라고 생각하고 있는데 만약 JVM 위에서 개발 해야 하는데 java는 병신같아서 못쓰겠다면 scala 보다는 kotlin 이 좀 더 나은선택이라고 생각한다. 일단 제작사가 개발툴회사다보니 지원이 빵빵하고, 안드로이드의 공식 언어이기도 하니 확실하게 써먹을만한 플랫폼도 있다.

 

하지만 현실적으론 안드로이드가 아닌 다른 용도로 쓸 거라면 좀 더 고민을 해야할 것 같다. ORM도 아직 JetBrain 에서 만드는 Exposed 조차 알파버전 수준이고 웹프레임워크인 ktor 역시 마찬가지다. java 와의 차이점 때문에 기존 java 라이브러리나 프레임워크를 쓰려면 불편함이 많은 상태에서(scala 보단 낫지만) kotlin 으로 만들어진 베이스 코드가 없다는건 치명적이다. play framework 라는 걸출한 킬러어플리케이션이 있는 scala와는 차이가 심하다. 물론 모든 코드를 밑바닥부터 직접 다 만들어서 쓸 거라면 아무 상관 없겠다.

 

fin

 
TAG •
?

Lyn
조회 수 1144 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

WPF 에는 표처럼 오브젝트를 배치할 수 있는 Grid 라는 Layout 컨테이너가 존재한다

 

그런데 이 컨테이너는 Layout 만 잡아 줄 뿐 표처럼 선을 그려주는 기능은 없... 진 않지만 내장되어 있는 ShowGridLines 는 사실상 UI 디버깅 용도 외에는 쓰기 힘들정도로 심각하게 기능이 구리다.

 

그래서 유명하신 정성태님이 아래와 같은 글을 쓰셧다

 

WPF - Grid 컨트롤의 ShowGridLine 개선

 

윗 링크의 글을 보면 아래와 같은 부분이 있다

 

"생각 자체는 그리 어렵지 않습니다. 예를 들어, 가로선을 그을 때(Row별로) 컬럼 단위만큼 그리며 진행하다가 다음번 그려야 될 곳이 RowSpan으로 되어 있으면 그 구획은 긋지 말고 건너뛰면 됩니다. 세로선도 마찬가지겠지요."

 

그리고 해당 컨트롤을 구현한 솔루션이 링크되어 있는데... 실제로는 구현이 반대로 되어 있다. Element 를 뒤져 가며 Span 된 부분을 건너뛰는 것이 아니라 Span 이 아닌 부분을 그리는 식으로. 사실 이렇게 하더라도 저 위 샘플에선 전혀 문제가 없이 나오는데... 문제는 저 Grid에 어떤 Element 도 없는 "빈칸" 이 존재할 경우 그 부분은 아예 Border 가 그려지지 않는다는 것이다...

 

그래서 위에 인용한 글 대로 Skip 하는 식으로 변형을 해서 쓰기로 했고, 그 코드를 공개한다

 

public class BorderGrid : Grid
{
    public BorderGrid() : base()
    {

    }

    public Thickness CellPadding
    {
        get
        {
            return (Thickness)this.GetValue(CellPaddingProperty);
        }
        set
        {
            this.SetValue(CellPaddingProperty, value);
        }
    }

    public static readonly DependencyProperty CellPaddingProperty =
        DependencyProperty.Register("CellPadding", typeof(Thickness), typeof(BorderGrid),
            new FrameworkPropertyMetadata(new Thickness(0.0, 0.0, 0.0, 0.0), FrameworkPropertyMetadataOptions.AffectsArrange,
            OnCellPaddingChanged)
        );

    static void OnCellPaddingChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
    {
        BorderGrid grid = (dependencyObject as BorderGrid);
        foreach (UIElement uiElement in grid.Children)
        {
            ApplyMargin(grid, uiElement);
        }
    }

    protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
    {
        FrameworkElement childElement = visualAdded as FrameworkElement;
        ApplyMargin(this, childElement);

        base.OnVisualChildrenChanged(visualAdded, visualRemoved);
    }

    public static void ApplyMargin(BorderGrid PaddingGrid, UIElement element)
    {
        FrameworkElement childElement = element as FrameworkElement;
        Thickness cellPadding = PaddingGrid.CellPadding;

        BorderGrid childPaddingGrid = element as BorderGrid;
        if (childPaddingGrid != null)
        {
            childPaddingGrid.CellPadding = cellPadding;
        }
        else
        {
            if (childElement != null)
            {
                childElement.Margin = cellPadding;
            }
        }
    }

    Pen line = new Pen(Brushes.Black, 2);
    protected override void OnRender(System.Windows.Media.DrawingContext dc)
    {
        base.OnRender(dc);

        BorderGrid customGrid = this.Parent as BorderGrid;
        if (customGrid == null)
        {
            dc.DrawRectangle(null, line, new Rect(0, 0, this.ActualWidth, this.ActualHeight));
        }

        double linePoint = 0;
        double posFrom = 0.0;
        double posTo = 0.0;

        int rowCount = Math.Max(this.RowDefinitions.Count, 1);
        int columnCount = Math.Max(this.ColumnDefinitions.Count, 1);

        bool[,] rowCellIgnoreStatus;
        bool[,] columnCellIgnoreStatus;

        GetRowLineCellStatus(rowCount, columnCount, out rowCellIgnoreStatus, out columnCellIgnoreStatus);

        if (this.ColumnDefinitions.Count != 0)
        {
            for (int row = 0; row < rowCount - 1; row++)
            {
                var r = this.RowDefinitions[row];

                linePoint += r.ActualHeight;
                for (int column = 0; column < columnCount; column++)
                {
                    bool ignoreLine = rowCellIgnoreStatus[row + 1, column];
                    posTo += this.ColumnDefinitions[column].ActualWidth;

                    if (ignoreLine == false)
                    {
                        dc.DrawLine(line, new Point(posFrom, linePoint), new Point(posTo, linePoint));
                    }

                    posFrom = posTo;
                }

                posFrom = 0.0;
                posTo = 0.0;
            }
        }

        linePoint = 0;
        posFrom = 0.0;
        posTo = 0.0;

        if (this.RowDefinitions.Count != 0)
        {
            for (int column = 0; column < columnCount - 1; column++)
            {
                var r = this.ColumnDefinitions[column];

                linePoint += r.ActualWidth;
                for (int row = 0; row < rowCount; row++)
                {
                    bool ignoreLine = columnCellIgnoreStatus[row, column + 1];
                    posTo += this.RowDefinitions[row].ActualHeight;

                    if (ignoreLine == false)
                    {
                        dc.DrawLine(line, new Point(linePoint, posFrom), new Point(linePoint, posTo));
                    }

                    posFrom = posTo;
                }

                posTo = 0.0;
                posFrom = 0.0;
            }
        }
    }

    private void GetRowLineCellStatus(int rowCount, int columnCount, out bool[,] rowCellIgnoreStatus, out bool[,] columnCellIgnoreStatus)
    {
        rowCellIgnoreStatus = new bool[rowCount, columnCount];
        columnCellIgnoreStatus = new bool[rowCount, columnCount];

        foreach (UIElement element in this.Children)
        {
            int row = Grid.GetRow(element);
            int column = Grid.GetColumn(element);

            int spanCount = Grid.GetColumnSpan(element);

            for (int span = 1; span < spanCount; span++)
            {
                try
                {
                    columnCellIgnoreStatus[row, column + span] = true;
                }
                catch (Exception)
                {
                    //
                }
            }

            spanCount = Grid.GetRowSpan(element);
            for (int span = 1; span < spanCount; span++)
            {
                rowCellIgnoreStatus[row + span, column] = true;
            }
        }
    }
}

 

TAG •
?

Lyn
조회 수 883 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

얼마전 .net 4.7이 출시되어 시간난김에 구경하는데

 

DirectX Dependency

The .NET Framework 4.7 now uses DirectX 11 components for WPF. These components are available as part of the operating system in recent versions of Windows including Windows 10, Windows Server 2016, Windows 8.1, and Windows Server 2012 R2.

 

같은 내용이 있네요

 

DX11은 Windows 7 에서도 지원 하는데, 7 지원을 빼버린거 보니 슬슬 끝물인가봅니다

TAG •
?

Lyn
조회 수 818 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Original : https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-selecting-the-jdk-version-the-ide-will-run-under?page=3

 

 

Windows

JDK (JetBrains Runtime) is bundled with all the product installers and it's recommended that you will use the provided JDK version unless there are any specific issues. Since 2017.1 version 64-bit JDK is bundled by default on all the systems (32-bit JDK can be downloaded on Windows by the installer if needed).

JetBrains Runtime (based on OpenJDK) can be also downloaded separately, but you normally don't need to do it. 

<product>.exe uses this JDK search sequence:

  1. IDEA_JDK / PHPSTORM_JDK / WEBIDE_JDK / PYCHARM_JDK / RUBYMINE_JDK / CLION_JDK / DATAGRIP_JDK environment variable (depends on the product, WEBIDE_JDK applies to both WebStorm and PhpStorm before version 2016.1)

  2. idea.config.path\<product>.jdk file
  3. ..\jre directory
  4. system Registry
  5. JDK_HOME environment variable
  6. JAVA_HOME environment variable

<product>64.exe uses this JDK search sequence:

  1. IDEA_JDK_64/ PHPSTORM_JDK_64 / WEBIDE_JDK_64 / PYCHARM_JDK_64 / RUBYMINE_JDK_64 / CLION_JDK_64 / DATAGRIP_JDK_64 environment variable
  2. idea.config.path\<product>64.jdk file
  3. ..\jre64 directory
  4. system Registry
  5. JDK_HOME environment variable
  6. JAVA_HOME environment variable

It’s also possible to start the IDE with <product>.bat file located in the bindirectory, it uses the following JDK search sequence:

  1. IDEA_JDK / PHPSTORM_JDK / WEBIDE_JDK / PYCHARM_JDK / RUBYMINE_JDK / CLION_JDK / DATAGRIP_JDK environment variable (depends on the product)
  2. idea.config.path\<product>64.jdk file
  3. idea.config.path\<product>.jdk file
  4. ..\jre64 directory
  5. ..\jre directory
  6. JDK_HOME environment variable
  7. JAVA_HOME environment variable
Environment variable must point to the JDK installation home directory, for example:
c:\Program Files (x86)\Java\jdk1.8.0_112
  • The actual JDK version used by the IDE can be verified in Help | Aboutdialog (open any project to access the menu).
  • Define IDEA_JDK / PHPSTORM_JDK / WEBIDE_JDK / PYCHARM_JDK / RUBYMINE_JDK/ CLION_JDK / DATAGRIP_JDK variable depending on the product to override the default version from IDE_HOME\jre.
  • Use Rapid Environment Editor to add/edit the variables, it will detect incorrect paths.
?

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

놀것들 저장하는 서버로 전락해버렸네...

 

이걸 어째야하나 ...

?

Lyn
조회 수 731 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

http://blog.gaerae.com/2017/11/mozilla-microsoft-google-w3c-samsung-mdn-web-docs.html

 

문서화 잘해주던 MS가 참가하니 좀 더 나아지지 않을까 싶다..... 라고 생각하다가도 요즘 MS 보면 구글스러워 져서 걱정이 앞선다.

문서화 대충 안정화 대충 일단 던져놓고 유저들이 디버깅하게 만들기, 만들다가 중간에 버리기 등등 ...

?

Lyn
조회 수 668 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

프로그래밍의 정석 [10/100] : https://lunapiece.net/Article/14008162

서버/인프라 엔지니어를 위한 DevOps [9/100] https://lunapiece.net/Article/14008157

모던C++로 배우는 동시성 프로그래밍 [8/100] https://lunapiece.net/Article/14008135

프로그래밍의 정석 - 프로그래머가 반드시 알아야할 101가지 원리원칙 [7/100] https://lunapiece.net/Article/14008094

Node.js 마이크로 서비스 코딩공작소 [6/100] https://lunapiece.net/Article/14008120

Java 9 모듈 프로그래밍 [5/100] https://lunapiece.net/FreeBoard/14008145

스타트 스프링 부트 [4/100] https://lunapiece.net/Article/14008117

제대로 배우는 Angular 4 [3/100] https://lunapiece.net/Article/14008103 

모두의 딥러닝 [2/100] https://lunapiece.net/Article/14008107

파이썬 동시성 프로그래밍 [1/100] https://lunapiece.net/Article/14008035

 

?

Lyn
조회 수 664 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

Lyn
조회 수 646 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

1.PNG
 

 

  1.  본인의 수준
  •  Python : 대충 그럭저럭 프로젝트 하는 수준
  •  CUDA : 예전에 한번 프로젝트 진행 해본 수준
  •   Multi Thread / 비동기 : 전문가 수준

2. 썰

  • 일단 번역이 굉장히 어색해서 읽는데 거부감이 듬
  • 책 구성이 이상하다. 이슈를 던진 후 설명도 안하고 다음 예제로 넘어가는 식. 독자가 궁금해 할 만한 내용에 대해 제대로 설명이 안되어있다,  애초에 저자가 자기가 쓰고 있는 내용을 이해는 하고 있나 싶은 수준
  • 책 두께에 비해 너무 많은 내용을 다룬다. 키워드 하나 던지고 예제하나 보여주고 다음내용으로 넘어가는 식. 예제도 도움이 되는 내용이 없다
  • 역자는 학생이고, 저자도 책의 출간 시점을 생각하면 아마도 이 책도 졸업학기 내지는 졸업 직후 씌여진 것 같은데 좀 더 알고서 책을 썼으면 좋았겠다.

3. 점수

  • 1.0 / 5.0

4. 한줄평

  • 프로그래밍에 대해 쌩판 모르는데 키워드만 빨리 캐치하고 싶은 사람이 아니면 시간이 아깝다. 그런데 사실 이정도는 구글 검색만 해도 나온다.

 

 

?

Lyn
조회 수 619 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

3.jpg

 

1. 본인의 수준

  • Web : 대충 그럭저럭 프로젝트 하는 수준(주로 vue.js 이용)
  • Angluer : 기본적인 수준
  • TypeScript : 중급 수준

2. 썰

  • 기본적으로 책의 테마 자체가 공식 문서에서 잘 나오지 않은 부분을 다루는 것으로 하였다고 한다. 실제 내용도 그렇다. 공식 문서를 그대로 출력해서 책으로 만든 경우도 가끔 보는데, 개인적으로 그건 그냥 종이낭비라고 밖에 생각 되지 않는다. 웹에 있는 공식 문서는 웹에서 보자(계속 갱신되니 비교적 최신 정보를 볼수있다는 장점도 있고)
  • Modern Web 개발에 대해 어느정도 알고 있는 상태에서 읽을 수 있다. Javascript 로 웹개발 하는데 컴파일을 한다고 했을때 이상해 하지 않을 정도의 지식은 필요하다.
  • TS 관련 내용은 없다. MS문서를 보고 TS에 대해서 공부를 어느정도 해 놔야 한다
  • 자주 쓰이는 기술의 유래, 간단한 예제, 설명, 문제 해결법이 잘 짜여져서 나와 있다.
  • 중간에 PC의 스크린샷이 가끔 나오는데, 해상도가 높지 않아 흐릿하여 알아보기 힘들다. 스크린샷을 좀 작게 찍었으면 좋았을것 같다.
  • 바로 전에 읽은 책이 컬러였다 보니 흑백 코드 보기 힘들어서 좀 아쉽다
  • 혹시 내가 아는것 중 빠진 부분이 있는지 생각해봐도 찾기 힘들만큼 Anguler 4 에 대해 전방위적으로 다루고 있다. 책이 얇다고(전방위적으로 다루는 것 치곤 400페이지가 채 되지 않는다) 내용이 부실하진 않다.

 

3. 점수

  • 4.0 / 5.0

4. 한줄평

 

  • Modern Web 을 대충 알면서 Angluar 를 공부하려고 하면 이 책을 선택해도 후회가 없을것이다
?

Lyn
조회 수 614 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

01.jpg

 

 

오랫만에 개발서적과 소설을 제외한 작품을 읽었다. 

 

이번 책은 1486년 초판이 나오고 최근에서야 한국어로 번역된 "말레우스 말레피카룸" 이다.

이 책은 실제 현실에 있었던 마녀사냥의 근거가 된 책이라 할 수 있다.

원서는 아래와 같이 생겼다

05.jpg

 

 

앞으로 이 책은 한국에서 이야기하는 카톨릭과 개신교에서 써먹은 책이다. 고로 아래부터는 기독교 라고 하면 그 둘을 지칭한다 구별하기 귀찮으니까.

이 책을 설명 하려면 아브라함 계통의 종교(유대교, 기독교, 이슬람교) 에서 인간이 언제부터 신에 대한 진실을 까먹었냐부터 이야기 해야 할 것 같다. 뭐 일단 세 종교가 하는 말을 다 믿는걸로 하자... 구별하기 귀찮으니가 

 

유대교는... 음 잘 모르지만 대충 기원전 40세기~35세기에 처음 생겼다고 한다. 그리고 예수가 세상에 나타난게 대충 1세기초, 무함마드가 가브레엘에게 계시를 받은게 대충 7세기다. 이것만 보면 대충 유대교는 4000년, 기독교는 600년, 이슬람교는 1400년 이상 다음 계시자가 나타나기 전까지 시간을 벌었다. 물론 주류의 해석대로 다음 계시자가 아직 나타나지 않았다는 전제하에서... 자기가 예수와 동격이라는 사람들이 하도 많으니까. 어쨋든 이렇게 보면 기독교가 유난히 다음 계시자 까지의 시간이 짧다. 

 

그럼 600년 만에 진실을 잊었느냐... 라고 하면 기독교에는 한가지 사건이 더 있다. 바로 325년에 있었던 제 1차 니케아 공의회 이다(예루살렘 공의회는 신약에도 씌여 있는만큼 예수의 말이 잊혀진 이후라고 보기가 어렵지 않나 생각한다. 심지어 베드로도 살아있었고)

1차 니케아 공의회는 바로 기독교의 교리를 "토론" 해서 정한 회의이다. 만약 진실이 잊혀지지 않았다면 이런 회의 따윈 필요가 없을거다. 뭐 어쩔순 없을거다 이미 예수가 죽은지 몇백년이 흐른데다 지금처럼 종이가 발에 채이는 시기도 아니고 인터넷이 있는 시대도 아니니 잊어먹는게 당연하다. 당장 망한지 얼마 안된 조선시대의 자료도 진실을 몰라서 연구를해야하는판에. 뭐 어쨋든 325년 시점엔 이미 다 잊어졌다는거고, 공의회로부터 교리를 체계적으로 정리하기 시작한다.

 

그 이후(혹은 그 이전부터) 사실상 (현대의 관점에서) 개막장 판타지 소설이나 다름없는 기독교 성경의 오류를 땜빵하기 위해 신학이라는 학문을 연구하고 반복되는 공의회로 계속 자신들의 교리를 보강해 나간다... 기독교 성경이라는 숨길 수 없는 존재가 있는 이상 교리의 보강이라는 것은 결국 말이 안되는것을 말이 되게 하는 궤변을 만들어 놓는 것 뿐이다. 일종의 논문디펜스라고 해야하나. 이렇게 공격당할땐 저렇게 대응하고 저렇게 공격할땐 또 이렇게 대응하라고 하는 내용들을 쌓아 가는 것이다. 삼국지에 나오는 양수가 조식에게 만들어 줬다는 문답서가 이런식이 아니었을까...

 

뭐 어쨋든 하고싶었던 얘기는 이 책은 최소 325년~1486년 이라는 천년이 넘는 시간동안 쌓아온 궤변의 모음서라 할 수 있다.

어떻게 사람을 마녀라고 몰아가는지, (마녀라고 찍힌 사람이) 어떻게 대응하면 어떻게 대응하는지, 어떤식으로 마녀라는걸 증명하는지 아주 자세하게 나와 있다(위 사진으론 알 수 없지만 책 생각보다 꽤 두껍다) 물론 대응하는 내용이 말이 되는건 아니다 (...) 말이 되면 이 책이 법률서겠지. 정말 판타지소설에서나 볼법한 다양한 단어를 구경할 수 있다(그 유명한 서큐버스 처럼).

 

사실 꽤 흥미진진하게 읽었지만 스토리가 있는 책이 아니기 때문에 감동이나 그런것은 없다. 궤변으로 꽉 찬 책이지만 이 책이 말싸움 연습하는데 도움이 될 것 같지도 않다. 너무 내용이 병신같아서... 이 책에 나온대로 해서 말싸움을 한다면 이길순 있을 것 같다. 상대가 이런말을 하겠지만 말이다 "말이 통하지 않으니 이길 자신이 없다" 라고. 사실 이 책을 아주 잘 설명하는 방법은 책의 일부분을 보여주는 것이라 생각한다. 몇 페이지만 읽어도 이 책이 어떤 책인지 금새 알 수 있을테니까. 그래서 아마도 법률적으로 문제 없을 만큼만 책의 일부를 발췌하여 첨부한다. 흥미가 있다면 꼭 한번 읽어보도록

 

 

02.jpg

 

03.jpg

 

04.jpg

 

 

TAG •
?

Lyn
조회 수 605 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

TAG •
?

Lyn
조회 수 588 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

닫을까 ...

?

Lyn
조회 수 580 추천 수 0 댓글 1
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

바쁜일이 많아서 오랫만에 올립니다

 

4.jpg

 

1. 본인의 수준

  • Java : 중급
  • Spring : 초급
  • Web : 대충 그럭저럭 프로젝트 가능 한 수준

2. 썰

  • 책이 흑백이다. 그런데 중간중간 코드나 개발 툴 스크린샷이 상당히 많은편이라 거슬린다
  • 코드 정리 상태가 좀 어색하다. 스크린샷으로 된 코드가 여기저기 있는 편인데 이미지의 해상도까지 상당히 낮아서 가독성에 문제가 있다
  • 툴 조합이 이클립스 + Maven 이다. 추세가 안드로이드를 따라 IntelliJ + Gradle 인 경우가 많은데 올드한 느낌
  • 내용은 딱 예전에 한참 유행하던 php로 게시판 따라만들기와 같다. 딱히 Spring 에 사용되는 기술이나, boot 에서 생긴 차이점 같은것을 깊이 전달하지 않는다. 그저 맨땅에 헤딩하는 사람이 웹개발을 하기 위한 최소한의 내용만 존재한다.
  • 기본적인 내용 외에 공부가 될 만한 내용은 딱히 없다.
  • 책이 표지부터 내부까지  전반적으로 예쁘지 않다.  책장에 예쁘게 정리해두고 뿌듯함을 느끼기엔 많이 부족하다(아마도 자비출판이라 그럴지도)

3. 점수

  • 2.5 / 5.0

4. 한줄평

  • Java는 들어봣는데 Spring 이 뭔지도 모르지만 일단 Spring으로 웹개발을 해야하는 상황에 처한 초보 개발자라면 사볼만 하다. Spring에 대한 지식이 조금이라도 있다면 다른 책을 알아봐라
?
  • profile
    Lyn 2019.02.08 02:46
    https://www.namgarambooks.co.kr/21

Lyn
조회 수 563 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 

2.PNG

 

 

1. 본인의 수준

 

  • Python : 대충 그럭저럭 프로젝트 하는 수준 
  • 딥러닝 : 알파고가 뭔지는 아는 수준
  • 텐서플로 : 예제 코드 돌려본 수준
  • 수학 : 공대 1학년 수준의 지식만 있음

2. 썰

  • 딥러닝에 관한 이론과 실제 코드를 간단한 수학과 예제로 쉽게 설명 하고 있음. 내가 다른 머신러닝 관련 책을 보면서 첫페이지에서 부터 멘붕하게만들었던 어려운 수학 공식이 나오지 않는다(기껏해야 편미분 수준). 하나의 문제를 던진 후 해결방식을 제한하는 방식의 구성으로 소설처럼 쭉쭉 읽어 나갈 수 있었다. 고수준의 라이브러리(keras) 를 사용하면서 중간에 tf 만을 사용해 개념설명을 따로 해주는것도 좋았음.
  • 파이썬 관련 내용은 없다. 만약 프로그래머가 아니라 연구를 목적으로 이 책을 볼 경우에는 파이썬 기본 지식은 다른 책에서 배우고 와야 한다. 하지만 그리 어려운 코드가 나오지 않아 일단 무시해도 될듯
  • 지도학습에 대해서만 다룬다. 비지도학습이나 강화학습관련 내용은 없다. 이건 저자가 의대에서 연구중이라 그런듯
  • 이 책을 읽고나면 이정도면 나도 딥러닝 할수 있겠다는 근자감이 생긴다. 입문서로는 최고
  • 코드와 그래프에 색이 입혀져 있어 굉장히 가독성이 좋다. 

 

3. 점수

  • 4.5 / 5.0

4. 한줄평

  • 머신러닝은 천재들이나 하는거라고 생각하고 포기했던 나같은 사람에게 나도한번 해볼까? 라는 생각을 들게 만드는 좋은 책
?

Lyn
조회 수 533 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

6.jpg

 

1. 본인의 수준

  • Node.js : 초급
  • Back-End : 전문가

2. 썰

  • 책 앞에 써있는 말이 맞긴 맞다. 장애 처리, 보안, 로그수집, 배포까지 만들면서 공부할 수 있는 책이다
  • 내용이 너무 기본적이다. 그 옛날 TmaxOS 발표회 가서 OS기초강의 듣던 기분. micro service 에 관심이 있는 수준이면 전혀 필요 없을만한 내용으로 페이지를 채우고 있다.
  • 얼마안되는 이론설명 -> 그걸 node.js 로 아주 대충 구현해 본다는 구성을 하고 있다. 이런식으로 대충 만든 코드로 서비스를 구성하는 없다고 봐도 좋기에 별 도움이 되지 않는다.
  • 코드의 수준이 낮아 node.js나 javascript 코딩 스타일을 공부하기에도 도움이 되지 않는다. 고전적인 방식으로 코딩되어 있어 callback hell 에 빠진 코드와 함께 쌩초짜용 네트워크 샘플에서만 볼듯한 dilimitor 를 이용하여 길이를 판정하는 tcp 패킷 형태까지 볼수 있다

3. 점수

  • 1.5 / 5.0

4. 한줄평

  • 이걸 보느니 그냥 SlideShare 가서 검색해보고 공부해라 시간이 아깝다. 뭘 봐야 할지 모르겟으면 뒤에 있는 링크 따라가서 보고 공부해라 
  • https://www.slideshare.net/charsyam2/presentations

     

?

Lyn
조회 수 510 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

우분투 LTS 버전 나온지 좀 된 김에 서버 옮김..

 

CentOs4 -> Windows 2008 -> -> Windows 2008 R2 -> Windows 2012 R2 -> Ubuntu 16.04 -> Ubuntu 18.04 로의 이전 프로세스를 밟은... 듯?

겸사겸사 인증서도 만료되어있길래 갱신..

 

?

Lyn
조회 수 465 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

5.jpg

 

1. 본인의 수준

  • Java : 중급
  • 자바 모듈시스템 : 들어만봤음

2. 썰

  • 툴을 넷빈즈로 설명 하고 있다. 한국에서 일반적으로는 잘 사용하지 않는 도구라 어색
  • 초반 절반 정도는 헤드퍼스트식 구성이라 이런 형태의 구성을 좋아하지 않는 나같은 사람에겐 별로
  • 모듈 시스템이 등장한 이유와 과정이 차근차근 잘 설명되어 있음
  • 각 상황별로 발생 할 수 있는 오류에 대해 자세히 설명 해 주는 부분이 맘에 들었음
  • 모듈이라는걸로 책 한권을 채울려다 보니 힘들었는지 쓸데없는 잡소리가 있고, 쓸데없이 자세한 부분이 있다
  • 어차피 페이지 낭비할거였으면 저자가 책의 범위를 벗어난다고 생략한 jmod 구조 같은걸 좀 써줬으면 좋았을텐데
  • 읽다보니 현존하는 자바 생태계(오픈소스 부분 말고 벤더와 위원회가 하던부분) 가 얼마나 무개념으로 발전 해 왔는지 잘 알거같음. 벤더가 해야 할 일을 안해서 외부인들이 땜빵으로 만들어온 생태계이다보니...
  • Gradle 관련 내용이 없고 Ant/Maven 내용만 있다. Gradle 이 모듈을 지원하기 전에 만들어진 책이라고 하니 이해하고 넘어갈만한 부분

3. 점수

  • 4.0 / 5.0

4. 한줄평

  • 자바 모듈 시스템을 이해하려면 이 책이면 충분하다
?

Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8