set @targets ='1234,1235,1230'; #공백 없이 구분자 , 사용해야 함.

set @items = '102,111,112';

select * from [테이블명] where FIND_IN_SET(id, @items) and FIND_IN_SET(uid, @targets);

update [테이블명] set count=count+4 where FIND_IN_SET(id, @items) and FIND_IN_SET(uid, @targets);

특정 대상을 찾기위해 쿼리문에서 배열 사용자 변수를 설정해 사용하는 방법.


>> 참조

사용자 변수 : https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
FIND_IN_SET : https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_find-in-set


Posted by ngcbbs
,

1) 상품이 제대로 등록 되어 있는지 확인한다. (사용하는 상품ID도 확인. 대소문자도 확인)

2) 상품 정보가 20개 초과 되었는지 확인한다.

 > 20개 초과시 20개씩 나눠서 상품 정보를 요청 해야함.

 > 관련: https://github.com/anjlab/android-inapp-billing-v3/issues/266


잡설) 그나마 인앱 테스트 환경은... 안드로이드가 천국이다...

Posted by ngcbbs
,

1) 기존에 설치된 .net core sdk 가 있으면 제거한다. (yum, apt-get 등으로 가능하면 진행)

> 불가능한 경우 dotnet --info 실행 후 설치된 경로 폴더를 삭제.


2) 새 버전의 .net core sdk 설치.

> https://docs.microsoft.com/ko-kr/dotnet/core/linux-prerequisites?tabs=netcore2x


3) dotnet --version 을 통해서 업데이트가 잘 되었는지 확인.

> 실행되지 않는 경우 2) 단계에서 안내하는 단계중 PATH 설정을 빼먹은것 아닌지 확인.


※ 기존에 설치된 폴더를 제거하지 않은 상태에서 설치한 경우 이전 버전으로 실행 되거나 dotnet 자체가 실행되지 않을 수 있음. 그럴때는 이전 버전의 폴더 제거 후 path 설정을 다시 하면 됨.

'프로그래밍 > .net core' 카테고리의 다른 글

[Centos7] .net core 2.0 설치.  (0) 2018.06.05
[Centos] .net core 2.1 설치 오류...  (0) 2018.06.05
Posted by ngcbbs
,

mysql 에 외부 프로그램(HeidiSQL 등...) 을 사용한 접속 설정이 필요한 경우 다음 쿼리를 참고해 작업하자 :P


// 5.6 이하에서 유저 외부 접속 설정 확인

select host,user,password from mysql.user;


// 5.7 이상에서 유저 외부 접속 설정 확인

select host,user,authentication_string from mysql.user;


// 5.6 이하에서 password 사용하는 경우.

INSERT INTO mysql.user (host,user,password) VALUES ('123.123.123.123','root',password('123456'));

GRANT ALL PRIVILEGES ON *.* TO 'root'@'123.123.123.123';

FLUSH PRIVILEGES;


// 5.7 이상에서 password 컴럼이 없어지고 authentication_string 컬럼을 사용.

INSERT INTO mysql.user (host,user,authentication_string) VALUES ('123.123.123.123','root',password('123456'));

GRANT ALL PRIVILEGES ON *.* TO 'root'@'123.123.123.123';

FLUSH PRIVILEGES;


// 비밀번호 설정없이 추가하는 경우.

INSERT INTO mysql.user (host,user) VALUES ('123.123.123.123','root');

GRANT ALL PRIVILEGES ON *.* TO 'root'@'123.123.123.123';

FLUSH PRIVILEGES;


// 사용 권한 제거시..

DELETE FROM mysql.user WHERE Host='123.123.123.123' AND User='root';

FLUSH PRIVILEGES;


DELETE FROM mysql.user WHERE Host='%' AND User='root';

FLUSH PRIVILEGES;


// 추가로 ip 의 일부만 맞아도 접속 가능하게 할 수 있음 123.123.%.% 또는 전체 허용 % 으로 표시 할 수 있다.

Posted by ngcbbs
,

정말 간단한 node.js 사용한 서버 코드..


- 단순 익명 메세지 채팅이 가능함.


Posted by ngcbbs
,

image = new Image();
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.NearestNeighbor);

음! 이건 버전이나 그런것은 모르겠고 일단 설정하는 모드가 있는듯!

BitmapScalingMode 의 멤버들.. msdn 뽑아옴~

Member nameDescription
UnspecifiedUse the default bitmap scaling mode, which is Linear.
LowQualityUse bilinear bitmap scaling, which is faster than HighQuality mode, but produces lower quality output. The LowQualitymode is the same as the Linear mode.
HighQualityUse high quality bitmap scaling, which is slower than LowQuality mode, but produces higher quality output. TheHighQuality mode is the same as the Fant mode.
LinearUse linear bitmap scaling, which is faster than HighQuality mode, but produces lower quality output.
FantUse very high quality Fant bitmap scaling, which is slower than all other bitmap scaling modes, but produces higher quality output.
NearestNeighborUse nearest-neighbor bitmap scaling, which provides performance benefits over LowQuality mode when the software rasterizer is used. This mode is often used to magnify a bitmap.

Posted by ngcbbs
,

wxWidgets 을 이용해서 만들었던 간단한 이미지 체크툴을 C# WPF 으로 만들어 보기 위해서 구글링을 통해 알아본 해당 코드들... 음 이미지 동일 여부 판단 하는 부분은 빠져 있지만 다른 잡다한 코드가 많이 있던 wxWidgets + C/C++ 보다는.. 간결한 코드가 나온다 ;ㅂ; (.NET 3.5 가 필요하지..) 농담 아니고 정말-ㅅ- 간단하게 처리된다!;;


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;

namespace WpfEqMask
{
    /// 
    /// Window1.xaml에 대한 상호 작용 논리
    /// 
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        // 이미지 처리방법 관련 (외국) 글.
        // http://10rem.net/blog/2010/03/24/rotating-and-cropping-an-image-in-wpf

        // http://stackoverflow.com/questions/4402828/wpf-cut-and-save-image
        public void MakeRectImage(BitmapImage srcBitmap, int x, int y, int width, int height, string filename)
        {
            TransformGroup transformGroup = new TransformGroup();
            /*
            RotateTransform rotateTransform = new RotateTransform(angle);
            rotateTransform.CenterX = sourceImage.PixelWidth / 2.0;
            rotateTransform.CenterY = sourceImage.PixelHeight / 2.0;
            transformGroup.Children.Add(rotateTransform);
            */
            TranslateTransform translateTransform = new TranslateTransform();
            translateTransform.X = -x;
            translateTransform.Y = -y;
            transformGroup.Children.Add(translateTransform);

            DrawingVisual vis = new DrawingVisual();
            DrawingContext cont = vis.RenderOpen();
            cont.PushTransform(transformGroup);
            cont.DrawImage(srcBitmap, new Rect(new Size(srcBitmap.PixelWidth, srcBitmap.PixelHeight)));
            cont.Close();

            RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
            rtb.Render(vis);

            FileStream stream = new FileStream(filename, FileMode.Create);
            
            PngBitmapEncoder encoder = new PngBitmapEncoder(); // png 포멧으로 저장.
            encoder.Frames.Add(BitmapFrame.Create(rtb));
            encoder.Save(stream);
            stream.Close();
        }

        private void OnDrop(object sender, DragEventArgs e)
        {
            string[] dropFileList = e.Data.GetData(DataFormats.FileDrop, true) as string[];

            string result = result = "Drop File List\n";
            foreach (string file in dropFileList)
            {
                result += file;
                result += "\n";

                string[] bmpFiles = Directory.GetFiles(file, "*.bmp", SearchOption.AllDirectories);
                if (bmpFiles.Length > 0)
                {
                    result += "---------------------\n";
                    result += "폴더내 bmp 목록.\n";

                    foreach (string bmpFile in bmpFiles)
                    {
                        // MyCanvas 에 추가~
                        Image img = new Image();
                        BitmapImage src = new BitmapImage();
                        src.BeginInit();
                        src.UriSource = new System.Uri(bmpFile, System.UriKind.Relative);
                        src.EndInit();
                        img.Source = src;
                        img.Stretch = Stretch.Uniform;

                        try
                        {
                            string rectname = bmpFile;
                            rectname += ".rect.bmp";
                            MakeRectImage(src, 10, 10, 32, 32, rectname);
                            
                            img.Width = src.Width;
                            img.Height = src.Height;
                            MyCanvas.Children.Add(img);
                        }
                        catch (Exception ec)
                        {
                            MessageBox.Show("예외발생" + ec.ToString());
                        }

                        result += bmpFile;
                        result += "\n";

                        MessageBox.Show("로딩 잘되네");
                    }
                }
            }

            MessageBox.Show(result, "결과");
        }
    }
}


Posted by ngcbbs
,

비주얼 스튜디오를 사용해서 프로그램을 개발해서 배포를 한뒤에 자주 접하게 되는 문제는 '재배포' 관련 문제들이 많다. 사용자 컴퓨터에 프로그램 실행을 위해 필요한 재배포 패키지가 설치되어 있지 않을때 여러가지 유형으로 에러가 발생한다. 재배포 패키지 설치 유무에 따라서 대략 4가지 정도로 나뉘는것 같고 아래와 같다.

1. 프로그램 정상 동작. (필요한 재배포 패키지가 모두 잘 설치된 경우.)
2. 프로그램 정상 동작. (재배포 패키지가 없는데도 잘되는 경우. !!!? 좋아하지 말자. 그냥 운이 좋을뿐!?)
3. sxs ?????? 오류. (재배포 패키지가 설치되지 않음.)
4. 0x000000 ?????? 오류. (재배포 패키지가 설치되지 않음. 혹은 꼬임. 주로 프로그램과 포함되는 라이브러리간의 재배포 패키지에 사용된 버전이 다른경우.)

(혹시 다른 경우가 있다면 알려주시면 좋겠습니다^^)

위와 같은 형태로 대부분 나타난다. 이전에 스마트한 재배포 메모 글에서 비주얼 스튜디오에 적용된 vcredist 의 최신 버전으로 설정하는 방법을 적어 놓았는데. 다시 살펴보면

_BIND_TO_CURRENT_VCLIBS_VERSION 에 0 or 1 값을 적용해서 자신의 비주얼 스튜디오에 적용된 vcredist 의 버전을 결정할 수 있다. (프로그램 컴파일시 전처리기 설정 부분에 넣어주면 됨.)

_BIND_TO_CURRENT_VCLIBS_VERSION=0      <-    최초(?) 기본 버전을 포함하도록 한다.
_BIND_TO_CURRENT_VCLIBS_VERSION=1      <-    최신 버전을 포함하도록 한다.

자 그럼 자신의 개발 환경에서 vcredist 버전이 어떻게 되는지 확인해 보려면 어떻게 하면 될까? 가장 무식한 방법은 위의 전처리기 설정을 하고 비주얼 스튜디오에서 제공하는 유틸리티 mt.exe 를 이용해서 생성된 프로그램(프로그램에 manifest 가 포함된 경우)에서 추출해 볼 수 있다.

mt.exe -inputresource:test.exe -out:test.result.txt

위와 같이 실행하면(mt.exe 를 실행하기 위해서는 visual studio 명령 프롬프트에서 실행가능하다) out.result.txt 파일에 manifest 정보가 저장된다. 자신을 괴롭히고 싶다면 _BIND_TO_CURRENT_VCLIBS_VERSION 설정을 바꿨을때 마다 해보길 바란다..(=ㅂ=ㅋ)

더 간단한 방법으로는 비주얼 스튜디오가 설치된 폴더에서 crt 관련 헤더가 있는 파일을 열어보면 된다. 아마 각 버전마다 설치된 경로에 따라 다르겠지만 대략 아래와 같을테니 경로는 참고해 주세요.

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt\src\crtassem.h

위의 파일을 열어보면 _CRT_ASSEMBLY_VERSION 매크로가 정의되어 있는 부분을 찾을 수 있는데 거기에 적힌 버전이 현재 자신의 비주얼 스튜디오에서 적용가능한 vcredist 버전을 알 수 있겠다. 대략 아래와 같은 모습...


#ifndef _CRT_ASSEMBLY_VERSION
#if _BIND_TO_CURRENT_CRT_VERSION
#define _CRT_ASSEMBLY_VERSION "9.0.30729.6161"
#else  /* _BIND_TO_CURRENT_CRT_VERSION */
#define _CRT_ASSEMBLY_VERSION "9.0.21022.8"
#endif  /* _BIND_TO_CURRENT_CRT_VERSION */
#endif  /* _CRT_ASSEMBLY_VERSION */


일단 협업을 하면서 다른 개발자의 컴퓨터에서 재배포 관련 문제가 발생할 경우 crtassem 의 최신/기본 버전이 같은지 확인해 보는것이 좋다. 그리고 기본 버전이 같다면 개발중일때는 기본 버전을 사용해서 개발하는것도 나쁘지 않다. (물론 사용되는 라이브러리들도 모두 재컴파일 해야하지만...). 마지막으로 빌드 컴퓨터가 따로 마련되어 있다면 그 컴퓨터에서는 최신 vcredist 를 사용하게 하고. (포함되는 라이브러리도 같이 컴파일 해줘야 겠지?) 그에 맞는 재배포 패키지도 함께 설치되도록 설치 프로그램을 만들면 되지 않을까?

(음 개발버전과 출시버전의 vcredist 가 다른경우에 발생할 문제가 있을 수 있을지도 모르겠다. 그러면 아예 이전 vcredist 의 버그나 문제점을 감수하고 그냥 옜날 버전을 쓰는것도... 한 방법이 될 수 있겠다;;;)

아무튼 대략적인 재배포 문제 관련된걸 정리해 놓음! (다음은! 설치 프로그램에서 어떤 재배포 패키지가 설치되어 있는지 알아보는 방법을 정리해 보쟈~)


Posted by ngcbbs
,

어제에 이은 C# 공부중 예제들~ 추상메소드, 인터페이스, 보호클래스(상속불가), 모든 클래스들은 c#에 의해서 System.Object 를 상속, 프로퍼티(별칭 프로퍼티를 통해 데이터에 접근할 수 있도록 하는것 읽기/쓰기 제어), 인덱서(객체 자체에 [] 연산자를 지정해 해당 데이터에 접근할 수 있도록하는것. 대략 읽기만 가능?)



using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*
 * 추상 메소드! 그리고 인터페이스.
 */
namespace test3
{
    // 추상메소드 : 파생되는 클레스에 특정 메소드를 만들도록 강요할 수 있음.
    abstract class Animal
    {
        abstract public void Walk();
    }

    class Person : Animal
    {
        public override void Walk()
        {
            System.Console.WriteLine("사람 걷다.");
        }
    }

    class Robot : Animal
    {
        override public void Walk() // override 키워드의 순서가 참 거슬렸었음. 이렇게도 되나?(된다)
        {
            System.Console.WriteLine("로봇 걷다.");
        }
    }

    // 인터페이스 : 클래스는 다중상속 불가. 인터페이스를 통해 1개이상 상속이 가능하다고 함.
    interface IAnimal
    {
        void Walk();
    }

    interface IUserSkill
    {
        void Dance();
    }

    class Person2 : IAnimal, IUserSkill // 1개 이상이라고 하는게 요런걸 말하는건가!?
    {
        public void Walk()
        {
            System.Console.WriteLine("사람2 걷다.");
        }

        public void Dance()
        {
            System.Console.WriteLine("사람2 춤춘다.");
        }
    }

    class Person3 : IAnimal
    {
        public void Walk()
        {
            System.Console.WriteLine("사람3 걷다.");
        }
    }

    // 보호클래스 : sealed 키워드가 적용되면 어떤 클래스도 SealAnimal 을 상송받을 수 없다고 하네요.
    sealed class SealAnimal
    {
        public string Name;
        public void Walk()
        {
            System.Console.WriteLine("보호된(?!) 동물 클래스 걷다.");
        }
    }

    // 모든 c# 의 클래스는 System.Object 클래스를 상속 받는다.
    // System.Object 의 주요 메소드.
    // > Equals() : 객체가 같은지 판단.
    // > GetHashCode() : 고유 해시 반환.
    // > GetType() : 타입 반환.
    // > ToString() : 객체 문자열 반환.
    // > Finalize() : 객체 소멸전에 작업할 코드 수행.
    // > MemberwiseClone() : 객체의 복사본을 만듬.

    // 프로퍼티 : 이를 통해서 클래스의 멤버변수에 대해서 읽기/쓰기 속성을 지정할 수 있다.
    // 멤버 변수가 private 로 선언되었을지라도..
    class Ayo
    {
        private int nData;
        private ArrayList aData = new ArrayList();

        public void push_back(int value)
        {
            aData.Add(value);
        }

        public int Data // 이게 프로퍼티라고 한다. 음... 뭔가 타이핑이 더 많아 진거 같기도 하고 생략된거 같기도 하다.
        {
            get { return nData; }
            set { nData = value; }
        }

        // 인덱서 aData[0] 이런식이 된다는것인듯! 좋아 보이긴 한다.
        public int this[int index]
        {
            get { return (int)aData[index]; }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            // 추상메소드 테스트
            Person p = new Person();
            Robot r = new Robot();

            p.Walk();
            r.Walk();

            // 인터페이스 테스트
            Person2 p2 = new Person2();
            Person3 p3 = new Person3();
            p2.Walk();
            p3.Walk();
            p2.Dance();

            // 배열!
            Person3[] p3array = new Person3[2];
            p3array[0] = p3;
            p3array[1] = new Person3();

            for (int i = 0; i < 2; ++i)
            {
                p3array[i].Walk();
            }

            foreach (Person3 it in p3array) // 익숙해져 보자!~
            {
                it.Walk();
            }

            Ayo aa2 = new Ayo(); // 항상 생성해 줘야하는건 C/C++ 에 비해서 성가신거 같다. 아직까진...
            aa2.Data = 32;
            System.Console.WriteLine("nData 의 값은? " + aa2.Data);

            aa2.push_back(10);
            aa2.push_back(15);
            aa2.push_back(20);

            System.Console.WriteLine("0 = " + aa2[0]);
            System.Console.WriteLine("1 = " + aa2[1]);
            System.Console.WriteLine("2 = " + aa2[2]);
        }
    }
}
Posted by ngcbbs
,

게임코디 연제 강좌로 올라온 온라인 공개 책(문서)를 보면서 작성한것...

위임과 C/C++ 에서의 상속과 C#의 상속이 어떻게 다른지 살펴볼 수 있는 예제 코드... 공개 책(문서)에는 서로 따로 표시하고 있었는데 그다지 나눠서 보지 않아도 너무 간결한게 좋아 보인다. (사실 전에는 뭐여 이상한 키워드가 마구 생겼잖아 했었지..)


using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Linq;
using System.Text;
using System.IO;

namespace ToolboxTestApp3
{
    class MissileTurret
    {
        public string Name;
        public GameWorld refGameWorld;
        public MissileTurret(GameWorld world)
        {
            refGameWorld = world;
            refGameWorld.dg_object += new GameWorld.dg_FindEnemy(FindEnemy); // 위임(다중)
        }

        public virtual void FindEnemy()
        {
            System.Console.WriteLine("미사일터렛({0}) 적발견!!", Name);
        }

        public virtual void Update()
        {
            System.Console.WriteLine("미사일터렛({0})", Name);
        }
    }

    class JustTurret : MissileTurret
    {
        public JustTurret(GameWorld world)
            : base(world) // C/C++ 에서는 부모 CLASS 의 이름을 써줘야 했지만 base 로 ok.
        {
        }

        public override void FindEnemy()
        {
            System.Console.WriteLine("터렛({0}) 적발견!!", Name);
        }

        public override void Update()
        {
            // 부모의 함수를 호출하고 싶다면 base.Update() 를 호출하면 됨.
            System.Console.WriteLine("터렛({0})", Name);
        }
    }

    class GameWorld
    {
        public ArrayList gameObjects = new ArrayList();

        // 위임 선언
        public delegate void dg_FindEnemy();

        // 위임객체
        public dg_FindEnemy dg_object;

        public void Update()
        {
            int nCount = gameObjects.Count;
            for (int i = 0; i < nCount; ++i)
            {
                ((MissileTurret)gameObjects[i]).Update();
            }

            //////////////////////////////////////////////////////////////////////////
            Random r = new Random();
            int nRet = r.Next(100);
            if (nRet > 50)
            {
                if (dg_object != null)
                {
                    System.Console.WriteLine("Subject 에 연결된 Observer 개수: " + dg_object.GetInvocationList().Length);
                    dg_object();
                }
            }
            else
            {
                System.Console.WriteLine("랜덤숫자~: " + nRet);
            }
        }
    }

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            GameWorld world = new GameWorld();

            MissileTurret turret1 = new MissileTurret(world);
            turret1.Name = "터렛1";

            JustTurret turret2 = new JustTurret(world);
            turret2.Name = "터렛2";

            MissileTurret turret3 = new MissileTurret(world);
            turret3.Name = "터렛3";

            world.gameObjects.Add(turret1);
            world.gameObjects.Add(turret2);
            world.gameObjects.Add(turret3);

            bool bLoop = true;
            while (bLoop)
            {
                Thread.Sleep(1000);
                System.Console.WriteLine("게임시작~");
                world.Update();
            }
        }
    }
}


Posted by ngcbbs
,