2017년 6월 23일 금요일

Xcode 9.0 beta2, iOS 11.0 beta2 테스트 중입니다.

아직은 베타2이지만 9월에 정식버전이 출시됩니다. 새로운 프레임웍도 들어오고 언어도 Swift 4.0으로 변경되었습니다. 
Core ML, ARKit은 계속 자료를 모으고 학습을 해야 할 분야 입니다. 
기존 코드를 가지고 테스트하고 있는데 없어진 코드는 거의 없고 추가된 클래스와 코드들이 많아서 에러는 많이 나지 않네요. 
시뮬레이터에 보면 홈버튼이 추가되었습니다. Files앱이 새로 추가된게 눈에 띄네요. 








2017년 6월 22일 목요일

왕좌의 게임 시즌 7 예고편, 특수효과편

https://www.clien.net/service/board/park/10895888?po=0&od=T31&sk=&sv=&category=&groupCd=

WWDC 2017 What's new Cocoa Touch영상입니다.

What's new Cocoa Touch영상입니다. 아래의 링크를 클릭하시면 됩니다.

https://developer.apple.com/videos/play/wwdc2017/201/

새로운 마진 레이아웃에 대한 설명입니다.



NavigationBar에 서치바가 추가되고 Large Title속성이 추가되었습니다.



new iPad Pro에서 소개하던 drag & drop기능입니다. 델리게이트 기반으로 추가합니다.
UIDragInterraction, UIDropInterraction으로 제공됩니다.


파일 관리에 대한 기능이 대폭 추가되었습니다. 로컬파일, 클라우드에 대한 파일을 엑세스 할 수 있습니다.



네비게이션바에 큰글씨의 타이틀, 서치바가 눈에 띕니다.




2017년 6월 21일 수요일

WWDC 2017 ARKit영상입니다.

키노트 영상에서 86:50초에 AR소개 영상이 나옵니다.
https://www.apple.com/apple-events/june-2017/


https://developer.apple.com/videos/play/wwdc2017/602/

이케아 가구를 물리적인 위치위에 가상으로 올리는 데모등이 나옵니다.
영상을 보면 ARFrame, ARTracking등의 클래스 이름이 눈에 들어옵니다.
사용자가 위치를 변경하면 해당 위치를 트래킹해서 물리적인 영상위에 가상 물체들이
움직이는 것이 보입니다. 추가되는 코드도 많지 않습니다.
영상에서 13:50초, 19:30초에 첫번째데모와 활용 데모등이 나옵니다.





새로 추가된 템플릿을 통해 프로젝트를 만들고 Content에서 SceneKit을 선택하면 됩니다.

 뷰컨트롤러에 새로운 델리게이트가 추가 채택됩니다.





WWDC 2017에서 발표된 Core ML입니다.

아직은 베타 버전만 설치하고 테스트를 많이 못해보고 있습니다.

https://developer.apple.com/videos/play/wwdc2017/703/

아직 영상을 못보신 분들은 위의 링크를 타고 들어가면 됩니다. 맥에서 보거나 아니면 사파리에서 플레이해야 합니다.

애플이 공개한 4개의 미리 트레이닝 된 모델들이 있습니다.

https://developer.apple.com/machine-learning/



첫번째 화면은 Vision API입니다. 카메라로 물체를 촬영하면 하단에 어떤 객체인지를 감지해서 알려줍니다.


비전 API도 있고 NLP(자연어 처리)등을 지원합니다.


다양한 활용방향입니다. 엔진 오픈소스로 공개되고 파이썬으로 되어 있네요.


모델을 만들고 아래와 같이 뷰컨트롤러에 코딩을 추가하면 됩니다. Super easy~~



2017년 6월 19일 월요일

WWDC 2017 키노트 영상입니다.

https://www.youtube.com/watch?v=oaqHdULqet0

6월초에 영상을 지금 보고 있습니다.
원래는 하드웨어에 대한 소개가 wwdc에서는 거의 없었는데 대거 신규 하드웨어들을
소개하고 있습니다. 흥미로운 것은 머신러닝에 대한 내용이 곳곳에 소개되고
ARKit, CoreML등이 소개된 부분입니다.
new iPad Pro 10.5인치에 파일과 드래그&드롭, 멀티 태스킹에 대한 부분도 멋집니다.
증강현실 데모는 1:30분부터
1:59분에는 새로운 아이패드 프로에 대한 광고 영상이 나옵니다.
마지막 새로운 하드웨어는 HomePod에 대한 소개입니다. 아마존의 알렉사와
MS의 하만카돈 기반의 코타나와 애플의 Hi Siri의 흥미진진한 싸움입니다.

iOS 11의 컨트롤 센터 UI가 상당히 많이 변경되었습니다.


레이웨더리치에서 추천하는 10개의 영상 소개 입니다.
https://www.raywenderlich.com/164732/top-10-wwdc-2017-videos

Swift 4 변경된 내용에 대한 소개입니다.
https://www.raywenderlich.com/163857/whats-new-swift-4

2017년 6월 16일 금요일

마이크로소프트의 에저(Azure)에 있는 모바일 앱(Mobile App) Quickstart와 Xamarin.Forms를 결합하면 5분만에 서버와 클라이언트 개발이 5분만에 해결됩니다~~

주말에 테스트하면서도 놀라고 있습니다. ~~
요즘 같이 일하는 강사들과 같이 많이 얘기하고 있는 부분이 클라우드에 대한 내용입니다. 이제 개발자들이 작성하는 코드의 많은 부분이 클라우드로 올라가고 있습니다. 앱과 웹, 머신러닝이 결합되는 시대가 바로 코앞에 다가와 있네요.
이미 MS는 준비가 많이 되어 있습니다. 에저 펑션까지 말하고 있는 상태입니다. 실제 경험해보면 놀라움의 연속입니다.

아래는 제가 사용하는 에저 계정에서 Mobile App Quickstart템플릿을 찾아서 서비스를 올리고 클라이언트 코드를 받는 작업입니다.




배포하는데 약간 시간이 걸립니다. 한 5분정도 걸린 것 같습니다. 잠시 커피 한잔 하고 오면 됩니다.~~


이 화면보면 웃음이 나옵니다. 자마린 폼스 앱을 만들어 줍니다. 코드를 뜯어보니 개발자가 직접 개발하는 것과 크게 다르지 않습니다.


macOS에 설치한 Visual Studio for mac을 사용해서 솔루션을 오픈합니다. 사용하지 않는 UWP등의 프로젝트를 과감하게 삭제하고 빌드한 후에 실행하면 됩니다.




2017년 6월 9일 금요일

Visual Studio for mac으로 작성된 계산기 앱 소스 입니다.

자마린 스튜디오가 비주얼 스튜디오로 흡수되었습니다.
얼마전 정식 버전이 출시되었죠...
수업용 예제로 사용할 계산기 전체 소스입니다.
C# 코드 + XAML 태그로 구성되어 있습니다.
Xamarin Forms로 만들면 원소스를 아이폰, 안드로이드폰, 윈도우폰 등에서 사용할 수 있습니다.







MainPage.xaml 의 태그들

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="Calculator.MainPage">

    <Grid Padding="5,0" RowSpacing="1"
        ColumnSpacing="1" BackgroundColor="Black">
        <Grid.RowDefinitions>
            <Grid.RowDefinition Height="2*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Label FontAttributes="Bold" 
                FontSize="48" 
                BackgroundColor="Black" Text="0"
                TextColor="White" 
                HorizontalTextAlignment="End" 
                VerticalTextAlignment="Center"
            LineBreakMode="NoWrap" Grid.ColumnSpan="4" />
        <Button Text="7" Grid.Row="1" Grid.Column="0"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="8" Grid.Row="1" Grid.Column="1"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="9" Grid.Row="1" Grid.Column="2"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />

        <Button Text="4" Grid.Row="2" Grid.Column="0"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="5" Grid.Row="2" Grid.Column="1"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="6" Grid.Row="2" Grid.Column="2"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />

        <Button Text="1" Grid.Row="3" Grid.Column="0"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="2" Grid.Row="3" Grid.Column="1"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="3" Grid.Row="3" Grid.Column="2"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />
        <Button Text="0" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" />

        <Button Text="/" Grid.Row="1" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" />
        <Button Text="X" Grid.Row="2" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" />
        <Button Text="-" Grid.Row="3" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" />
        <Button Text="+" Grid.Row="4" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" />

        <Button Text="C" Grid.Row="5" Grid.Column="0"
                BackgroundColor="#808080" TextColor="White"
                FontSize="36" BorderRadius="0" />

        <Button Text="=" Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" />
    </Grid>

</ContentPage>


(이벤트를 모두 연결한 MainPage.xaml 코드)
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="Calculator.MainPage">

    <Grid Padding="5,0" RowSpacing="1"
        ColumnSpacing="1" BackgroundColor="Black">
        <Grid.RowDefinitions>
          <RowDefinition Height="2*" />
          <RowDefinition Height="*" />
          <RowDefinition Height="*" />
          <RowDefinition Height="*" />
          <RowDefinition Height="*" />
          <RowDefinition Height="*" />
       </Grid.RowDefinitions>

       <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
       </Grid.ColumnDefinitions>
        
        <Label x:Name="resultText" 
                FontAttributes="Bold" 
                FontSize="48" 
                BackgroundColor="Black" Text="0"
                TextColor="White" 
                HorizontalTextAlignment="End" 
                VerticalTextAlignment="Center"
            LineBreakMode="NoWrap" Grid.ColumnSpan="4" />
        <Button Text="7" Grid.Row="1" Grid.Column="0"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
               Clicked="OnSelectNumber" />
        <Button Text="8" Grid.Row="1" Grid.Column="1"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
               Clicked="OnSelectNumber" /> 
        <Button Text="9" Grid.Row="1" Grid.Column="2"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
               Clicked="OnSelectNumber" />

        <Button Text="4" Grid.Row="2" Grid.Column="0"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
                Clicked="OnSelectNumber" />
        <Button Text="5" Grid.Row="2" Grid.Column="1"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
               Clicked="OnSelectNumber" />
        <Button Text="6" Grid.Row="2" Grid.Column="2"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
               Clicked="OnSelectNumber" />

        <Button Text="1" Grid.Row="3" Grid.Column="0"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0"
               Clicked="OnSelectNumber" /> 
        <Button Text="2" Grid.Row="3" Grid.Column="1"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" 
               Clicked="OnSelectNumber" /> 
        <Button Text="3" Grid.Row="3" Grid.Column="2"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" 
               Clicked="OnSelectNumber" /> 
        <Button Text="0" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3"
               BackgroundColor="White" TextColor="Black"
               FontSize="36" BorderRadius="0" 
               Clicked="OnSelectNumber" /> 

        <Button Text="/" Grid.Row="1" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" 
                Clicked="OnSelectOperator" />
        <Button Text="X" Grid.Row="2" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" 
                Clicked="OnSelectOperator" />
        <Button Text="-" Grid.Row="3" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" 
                Clicked="OnSelectOperator" />
        <Button Text="+" Grid.Row="4" Grid.Column="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0" 
                Clicked="OnSelectOperator" />

        <Button Text="C" Grid.Row="5" Grid.Column="0"
                BackgroundColor="#808080" TextColor="White"
                FontSize="36" BorderRadius="0" 
                Clicked="OnClear" />

        <Button Text="=" Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="3"
                BackgroundColor="#FFA500" TextColor="White"
                FontSize="36" BorderRadius="0"
                Clicked="OnCalculate" />
    </Grid>

</ContentPage>

(로직이 모두 추가된 MainPage.xaml.cs파일)
using System;
using System.Collections.Generic;

using Xamarin.Forms;

namespace Calculator
{
    public partial class MainPage : ContentPage
    {
int currentState = 1;
string mathOperator;
double firstNumber, secondNumber;

        public MainPage()
        {
            InitializeComponent();
            //reset하는 코드추가 
            OnClear(this, null); 
        }
void OnSelectNumber(object sender, EventArgs e)
{
Button button = (Button)sender;
string pressed = button.Text;

if (this.resultText.Text == "0" || currentState < 0)
{
this.resultText.Text = "";
if (currentState < 0)
currentState *= -1;
}

this.resultText.Text += pressed;

double number;
if (double.TryParse(this.resultText.Text, out number))
{
this.resultText.Text = number.ToString("N0");
if (currentState == 1)
{
firstNumber = number;
}
else
{
secondNumber = number;
}
}
}

void OnSelectOperator(object sender, EventArgs e)
{
currentState = -2;
Button button = (Button)sender;
string pressed = button.Text;
mathOperator = pressed;
}

void OnClear(object sender, EventArgs e)
{
firstNumber = 0;
secondNumber = 0;
currentState = 1;
this.resultText.Text = "0";
}

void OnCalculate(object sender, EventArgs e)
{
if (currentState == 2)
{
var result = SimpleCalculator.Calculate(firstNumber, secondNumber, mathOperator);

this.resultText.Text = result.ToString("N0");
firstNumber = result;
currentState = -1;
}
}

    }
}

(SharedResources.cs파일)
using System;
using Xamarin.Forms; 

namespace Calculator
{
    public static class SharedResources
    {
        public static Color OpButtonBkColor
        {
            get { return Color.FromRgb(0xff, 0xa5, 0);  }
        }
    }
}



2017년 6월 8일 목요일

8월에 오픈할 자마린 프로그래밍 과정을 준비하고 있습니다.

작년부터 자료를 수집하고 조금씩 준비하고 있던 자마린 프로그래밍 과정입니다.
한국 마이크로소프트에 모여서 몇달간 같이 스터디도 하고 발표도 했습니다. 조금씩 정리도 되고 틀이 잡혀가네요.

azure에 ASP.NET MVC  기반의  Web API를 사용해서 GET/PUT/POST/DELETE메서드를 구현해서 json으로 통신하도록 준비한 웹사이트 입니다.


매우 저렴하게 구할 수 있는 중국산 안드로이드 타블렛입니다. 50에서 60불 수준입니다. ZTE Trek2 입니다. C#으로 짠 안드로이드 앱을 배포했습니다. 


C#으로 짠 아이폰앱을 6S plus에 배포했습니다. 


요즘 많이 들리는 RAG에 대한 멋진 정리가 있어서 공유합니다. ㅎㅎ

 작년에는 ChatGPT가 크게 유행을 했는데 올해는 Gen AI, LLM, 랭체인등이 유행하고 있습니다. ㅎㅎ  RAG라는 단어도 상당히 많이 들리고 있습니다. 멋진 정리의 링크입니다.  https://brunch.co.kr/@ywkim36/146?...