https://m.blog.naver.com/rla99tjr/221862232097

 

[학습] pom.xml 이란..?

저번 시간에 학습했던 web.xml에 이어서 이번 시간에 학습해볼 내용은 pom.xml입니다. pom.xml Spring Pr...

blog.naver.com

https://develop88.tistory.com/entry/Spring40-%EC%8A%A4%ED%94%84%EB%A7%81%ED%95%A0%EB%95%8C-webxml%EA%B3%BC-jsp%ED%8C%8C%EC%9D%BC-%EC%9D%B8%EC%BD%94%EB%94%A9

 

Spring4.0 스프링할때 web.xml과 jsp파일 인코딩

  encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 encodingFilter /* 위에 web.xml에도 맵핑시켜주고 아래 jsp파일은 자신꺼에서 euc-kr을 몽땅 utf-8로 바꾸면 일단 ok

develop88.tistory.com

 

pnpm install                                 

@vaadin/application-theme-plugin is linked to /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/node_modules from /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/target/plugins/application-theme-plugin

@vaadin/build-status-plugin is linked to /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/node_modules from /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/target/plugins/build-status-plugin

@vaadin/theme-live-reload-plugin is linked to /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/node_modules from /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/target/plugins/theme-live-reload-plugin

@vaadin/theme-loader is linked to /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/node_modules from /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/target/plugins/theme-loader

@vaadin/flow-frontend is linked to /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/node_modules from /Users/junhoha/Documents/workspace-spring-tool-suite-4-4.14.0.RELEASE/demo/target/flow-frontend

Already up-to-date

Progress: resolved 417, reused 417, downloaded 0, added 0, done

=================================================================

npm install --yes --quiet pnpm@5.18.10 --shamefully-hoist=true --ignore-scripts        

 

 

npm install -g flowserve                                                                                                                                           

npm WARN deprecated ecstatic@3.3.2: This package is unmaintained and deprecated. See the GH Issue 259.

 

added 56 packages, and audited 57 packages in 3s

 

13 packages are looking for funding

  run `npm fund` for details

 

2 moderate severity vulnerabilities

 

To address all issues (including breaking changes), run:

  npm audit fix --force

 

Run `npm audit` for details.

 

http://www.yes24.com/Product/Goods/3516046

 

실전 OSGi & Spring DM - YES24

자바에 대해서 초급 이상의 지식이 있는 개발자를 대상으로 OSGi를 설명한 책이다. OSGi를 배우는 도중에 발생하는 문제들에 대해서 가능한 많이 설명하고자 노력한 이 책은 OSGi 프레임워크의 기

www.yes24.com

원문: http://beyondj2ee.egloos.com/293629

 

BeyondJ2EE

 

beyondj2ee.egloos.com

최근에 제가 가장 관심을 갖고 있는 분야가 OSGi 입니다.
(특히 Spring DM Server ^^)
OSGi는 오래전부터 그들만의 리그 처럼 묵묵히 조용히 지내고 있었던
기술 이였습니다. 그러다가 최근에 스마트폰 광풍에 힘입어
구글 안드로이가 출시되면서 급 호감을 갖게 되었습니다.
(구글 안드로이드는 OSGi 플랫폼으로 구성되었죠)
거기다가 소형 가전기기 전용 플랫폼이였던 OSGi가
SpringSource에서 차세대 J2EE 플랫폼으로
Spring DM Server를 릴리즈 함으로 이제는 반드시
알아야 할 기술이 되었습니다.
그러면 과연 OSGi는 어느날 갑자기 안드로메다에서 온 기술일까요?
일반 블로그나 사이트에서 OSGi 관련 내용을 보면 개괄적인 내용과
다소 쉽게 이해가 가지 않은 개념(Bundle,Activator,Service)들에
대한 이론적 설명이 많았습니다.
그래서 제가 OSGi를 공부하면서 detail한 설명 보다
개발자로써 조금이나마 전체적인 맥을 잡고 OSGi에
대해서 두려움 없이 접근하시는데 도움이 되고자 말씀
드립니다.

    * OSGi's Feature

Apress Spring DM Server를 보면 아래와 같이 OSGi 특징에 대해서
기술되어 있습니다.

(1) OSGi는 전체 시스템를 restart 하지 않고 각가의 모듈을 동적으로 추가,변경,삭제를
할 수 있습니다.

(2) OSGi는 전체 시스템에 버전이 각각 다른 모듈을 동시에 사용 할 수 있습니다.

(3) OSGi는 각 모듈관에 의존성을 관리 합니다.

(4) OSGi는 SOA처럼 각 모듈을 서비스 레지스터리에 등록해서 필요한 한 곳에서
가져다가 쉽게 재사용 할 수 있습니다.


    * How to Use OSGi

위에서 저도 모르게 OSGi에 대한 개괄적인 설명을 했네요 쩝.
자 이제 글면 과연 OSGi를 어떻게 사용하는지 말씀 드리겠습니다.
외국에서는 OSGi Container라고 얘기를 합니다.
Container라함은 JVM 상에서 오브젝트에 대해서 생명주기
를 관리하는 서버라고 생각 하시면 됩니다.
비슷한 것들이 Servlet Container,EJB Container들이 있습니다.
(급 어려운얘기? Sorry)
쉽게 말해서 Servlet Container에서 동작하는 모듈을 만드려면
그냥 만드는 것이 아니라 Servlet을 만들어야만 동작하듯
OSGi Container도 마찬가지로 Bundle이라는 것을 만들어서 동작을
합니다.
OSGi 기동 방법은
java -jar org.eclipse.osgi._3.4.3....jar -console
이렇게 컨테이너를 띄우고 번들들을 인식하도록 하면 Container가
뜨면서 번들을 초기화 합니다. 마치 Servlet들을 초기화
하듯이 말이죠
이렇게 OSGi Container가 뜨고 나면 콘솔을 통해서 현재 등록된
번들의 상태를 화면을 통해서 볼 수가 있습니다.
마치 DOS상에서 커맨드를 치듯이 말이죠.
명령어를 통해서 번들을 추가하고,수정하고,삭제하고
즉 정리 하면 서블릿 Container 처럼 OSGi Container를
실행하고 OSGi에서 인식할수 있는 bundle 스펙을
구현해서 넣으면 됩니다. 그리고 위에서 동적으로
변경할수 있다는 얘기들은 마치 Servlet를 동적으로 추가,변경,삭제
할 수있다는 얘기와 같습니다.

    * OSGi Container 종류

Servlet 컨테이너도 jetty,tomcat,jboss 처럼 다양하게 있듯이
OSGi 컨테이너도 다양하게 있습니다.
Eclipse에서 제공하는 equinox,Apache에서 제공하는 Felix등
있습니다.
기본적으로 OSGi 스펙들을 구현한 Container들이며
자기 입맛에 맛는 Container를 사용 하시면 됩니다.
저는 개인적으로 아무래도 equinox를 사용합니다.
(이유인즉 spring dm이 이넘을 사용하거든요..)

    * Spring dm Server

SpringSource에서 OSGi 기반 J2EE 플랫폼이 Spring dm 입니다.
제가 정말 궁금한 것은 어떻게 OSGi가 어떻게 웹 어플리케이션을
지원할까 하는 문제 입니다. 물론 OSGi 자체에서 제공하는
Http 서비스가 있습니다.
하지만 제약사항이 많고 다소 허접합니다. 이유인즉
war 형식을 지원하지 않습니다. 아무래도 가전기기에 올라가다
보니 http 기능을 최소화 한것 같습니다.
그래서 우리가 사용하는 war 형태의 어플리케이션을
구동하기를 원합니다.
OSGi를 모른 상태에서 생각이 톰캣안에서 OSGi를 넣는건가
이런 생각을 했습니다.
하지만 그런 개념이 아니였습니다.
대장은 OSGi가 일단 구동 합니다. 그리고 톰캣이나 jetty 서버를
번들화 합니다.(이건 이미 spring source respository에 maven
형태로 되어 있습니다.)
그리고 내가 만든 웹 어플을 번들로 추가 합니다.
즉 OSGi 컨테이너가 구동하고
tomcat server bundle,my war bundle
이렇게 구동합니다. tomcat server bundle은 현재 번들 중에서
패키징이 "war"이거나 "WEB-INF" 디렉토리가 있으면
찾아서 디플로이 합니다.
모든게 OSGi 컨테이너안에서 이루어 집니다.

    * 마무리

참 제가 생각해도 주저리 주저리 적었지만 OSGi에 대해서
블러깅 한다는게 정말 한계가 있네요
앞으로 OSGi 관련해서 틈틈히 블로깅 하려고 합니다.
아무튼 OSGi 컨테이너를 사용하고 거기에 동작하는 모듈 스펙은
bundle이며 컨테이너에서 동작하기 때문에 당연히 생명주기가 있겠죠
생명주기에 맞게 처리 하고 콘솔을 통해서 restart 없이
모듈상태를 바꾸고 이게 대부분이라고 할 수있습니다.
이런 관점으로 OSGi를 생각하고 접근 하시면 좀더 편하게
이해 하실것 같습니다.
우리나라에서 "OSGi & Spring DM" 책이 출간 되었습니다.
개인적으로 이책에 도움을 많이 받았습니다.
소스 중심이라서 좀 지루할 수 있지만 예제가 정말 잘되어
있어서 좋습니다.
꼭 읽어 보시기 바랍니다.

 

 pnpm install                             

Downloading registry.npmjs.org/typescript/4.5.3: 11.3 MB/11.3 MB, done

Downloading registry.npmjs.org/highcharts/9.2.2: 10.4 MB/10.4 MB, done

 WARN  deprecated core-js@2.6.12: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.

 WARN  deprecated source-map-resolve@0.5.3: See https://github.com/lydell/source-map-resolve#deprecated

 WARN  deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.

 WARN  deprecated chokidar@2.1.8: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies

 WARN  deprecated core-js@2.6.12: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.

 WARN  deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated

 WARN  deprecated source-map-url@0.4.1: See https://github.com/lydell/source-map-url#deprecated

 WARN  deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated

 WARN  deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.

 WARN  GET https://registry.npmjs.org/@mapbox%2Funitbezier error (ERR_SOCKET_TIMEOUT). Will retry in 10 seconds. 2 retries left.

Packages: +1103

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Packages are hard linked from the content-addressable store to the virtual store.

  Content-addressable store is at: /Users/junhoha/.pnpm-store/v3

  Virtual store is at:             node_modules/.pnpm

node_modules/.pnpm/fsevents@1.2.13/node_modules/fsevents: Running install script...

node_modules/.pnpm/core-js@2.6.12/node_modules/core-js: Running postinstall script...

node_modules/.pnpm/fsevents@1.2.13/node_modules/fsevents: Running install script, failed in 125ms (skipped as optional)modules/core-js: Running postinstall script, done in 121msm/@vaadin+vaadin-usage-statistics@2.1.2/node_modules/@vaadin/vanode_modules/.pnpm/esbuild@0.12.29/node_modules/esbuild: Running postinstall script, done in 533ms 1103, reused 0, downloaded 1103, added 1103, done

 

dependencies:

+ @polymer/iron-icon 3.0.1

+ @polymer/iron-iconset-svg 3.0.1

+ @polymer/iron-list 3.1.0

+ @polymer/iron-meta 3.0.1

+ @polymer/iron-resizable-behavior 3.0.1

+ @polymer/polymer 3.4.1

+ @vaadin/accordion 23.0.3

+ @vaadin/app-layout 23.0.3

+ @vaadin/avatar 23.0.3

+ @vaadin/avatar-group 23.0.3

+ @vaadin/board 23.0.3

+ @vaadin/bundles 23.0.3

+ @vaadin/button 23.0.3

+ @vaadin/charts 23.0.3

+ @vaadin/checkbox 23.0.3

+ @vaadin/checkbox-group 23.0.3

+ @vaadin/combo-box 23.0.3

+ @vaadin/common-frontend 0.0.17

+ @vaadin/component-base 23.0.3

+ @vaadin/confirm-dialog 23.0.3

+ @vaadin/context-menu 23.0.3

+ @vaadin/cookie-consent 23.0.3

+ @vaadin/crud 23.0.3

+ @vaadin/custom-field 23.0.3

+ @vaadin/date-picker 23.0.3

+ @vaadin/date-time-picker 23.0.3

+ @vaadin/details 23.0.3

+ @vaadin/dialog 23.0.3

+ @vaadin/email-field 23.0.3

+ @vaadin/field-base 23.0.3

+ @vaadin/field-highlighter 23.0.3

+ @vaadin/flow-frontend 1.0.0 <- target/flow-frontend

+ @vaadin/form-layout 23.0.3

+ @vaadin/grid 23.0.3

+ @vaadin/grid-pro 23.0.3

+ @vaadin/horizontal-layout 23.0.3

+ @vaadin/icon 23.0.3

+ @vaadin/icons 23.0.3

+ @vaadin/input-container 23.0.3

+ @vaadin/integer-field 23.0.3

+ @vaadin/item 23.0.3

+ @vaadin/list-box 23.0.3

+ @vaadin/login 23.0.3

+ @vaadin/map 23.0.3

+ @vaadin/menu-bar 23.0.3

+ @vaadin/message-input 23.0.3

+ @vaadin/message-list 23.0.3

+ @vaadin/notification 23.0.3

+ @vaadin/number-field 23.0.3

+ @vaadin/password-field 23.0.3

+ @vaadin/polymer-legacy-adapter 23.0.3

+ @vaadin/progress-bar 23.0.3

+ @vaadin/radio-group 23.0.3

+ @vaadin/rich-text-editor 23.0.3

+ @vaadin/router 1.7.4

+ @vaadin/scroller 23.0.3

+ @vaadin/select 23.0.3

+ @vaadin/split-layout 23.0.3

+ @vaadin/tabs 23.0.3

+ @vaadin/text-area 23.0.3

+ @vaadin/text-field 23.0.3

+ @vaadin/time-picker 23.0.3

+ @vaadin/upload 23.0.3

+ @vaadin/vaadin-accordion 23.0.3

+ @vaadin/vaadin-app-layout 23.0.3

+ @vaadin/vaadin-avatar 23.0.3

+ @vaadin/vaadin-board 23.0.3

+ @vaadin/vaadin-button 23.0.3

+ @vaadin/vaadin-charts 23.0.3

+ @vaadin/vaadin-checkbox 23.0.3

+ @vaadin/vaadin-combo-box 23.0.3

+ @vaadin/vaadin-confirm-dialog 23.0.3

+ @vaadin/vaadin-context-menu 23.0.3

+ @vaadin/vaadin-cookie-consent 23.0.3

+ @vaadin/vaadin-crud 23.0.3

+ @vaadin/vaadin-custom-field 23.0.3

+ @vaadin/vaadin-date-picker 23.0.3

+ @vaadin/vaadin-date-time-picker 23.0.3

+ @vaadin/vaadin-details 23.0.3

+ @vaadin/vaadin-development-mode-detector 2.0.5

+ @vaadin/vaadin-dialog 23.0.3

+ @vaadin/vaadin-form-layout 23.0.3

+ @vaadin/vaadin-grid 23.0.3

+ @vaadin/vaadin-grid-pro 23.0.3

+ @vaadin/vaadin-icon 23.0.3

+ @vaadin/vaadin-icons 23.0.3

+ @vaadin/vaadin-item 23.0.3

+ @vaadin/vaadin-list-box 23.0.3

+ @vaadin/vaadin-list-mixin 23.0.3

+ @vaadin/vaadin-login 23.0.3

+ @vaadin/vaadin-lumo-styles 23.0.3

+ @vaadin/vaadin-material-styles 23.0.3

+ @vaadin/vaadin-menu-bar 23.0.3

+ @vaadin/vaadin-messages 23.0.3

+ @vaadin/vaadin-notification 23.0.3

+ @vaadin/vaadin-ordered-layout 23.0.3

+ @vaadin/vaadin-overlay 23.0.3

+ @vaadin/vaadin-progress-bar 23.0.3

+ @vaadin/vaadin-radio-button 23.0.3

+ @vaadin/vaadin-rich-text-editor 23.0.3

+ @vaadin/vaadin-select 23.0.3

+ @vaadin/vaadin-split-layout 23.0.3

+ @vaadin/vaadin-tabs 23.0.3

+ @vaadin/vaadin-template-renderer 23.0.3

+ @vaadin/vaadin-text-field 23.0.3

+ @vaadin/vaadin-themable-mixin 23.0.3

+ @vaadin/vaadin-time-picker 23.0.3

+ @vaadin/vaadin-upload 23.0.3

+ @vaadin/vaadin-usage-statistics 2.1.2

+ @vaadin/vaadin-virtual-list 23.0.3

+ @vaadin/vertical-layout 23.0.3

+ @vaadin/virtual-list 23.0.3

+ construct-style-sheets-polyfill 3.0.4 (3.1.0 is available)

+ date-fns 2.23.0 (2.28.0 is available)

+ lit 2.1.4 (2.2.1 is available)

 

devDependencies:

+ @vaadin/application-theme-plugin 0.4.2 <- target/plugins/application-theme-plugin

+ @vaadin/build-status-plugin 1.0.0 <- target/plugins/build-status-plugin

+ @vaadin/theme-live-reload-plugin 2.0.0 <- target/plugins/theme-live-reload-plugin

+ @vaadin/theme-loader 0.0.4 <- target/plugins/theme-loader

+ chokidar 3.5.3

+ compression-webpack-plugin 4.0.1 (9.2.0 is available)

+ css-loader 5.2.7 (6.7.1 is available)

+ esbuild-loader 2.15.1 (2.18.0 is available)

+ extra-watch-webpack-plugin 1.0.3

+ extract-loader 5.1.0

+ file-loader 6.2.0

+ fork-ts-checker-webpack-plugin 6.2.1 (7.2.1 is available)

+ glob 7.1.6 (7.2.0 is available)

+ html-webpack-plugin 4.5.1 (5.5.0 is available)

+ lit-css-loader 0.1.0 (1.2.2 is available)

+ loader-utils 2.0.0 (3.2.0 is available)

+ typescript 4.5.3 (4.6.3 is available)

+ webpack 4.46.0 (5.70.0 is available)

+ webpack-cli 4.9.2

+ webpack-dev-server 4.7.4

+ webpack-merge 4.2.2 (5.8.0 is available)

+ workbox-core 6.5.0 (6.5.2 is available)

+ workbox-precaching 6.5.0 (6.5.2 is available)

+ workbox-webpack-plugin 6.5.0 (6.5.2 is available)

eureka.client.register-with-eureka=false

eureka.client.fetch-registry=false

npm install

 

||

 

 

pom.xml

 

<build>

<plugins>

<plugin>

<groupId>com.vaadin</groupId>

<artifactId>vaadin-maven-plugin</artifactId>

<version>${vaadin.version}</version>

<executions>

<execution>

<goals>

<goal>prepare-frontend</goal>

</goals>

</execution>

</executions>

</plugin>

=====================================================================================

출처 : https://www.cleancoder.dev/package-manager-history/

pnpm

 

2017년 1월 그렇게 pnpm이 세상에 나오게 된다. pnpm 은 npm v2에서 사용하던 패키지 처리방식을 차용하기로 하는데, 각 패키지가 각자의 node_modules 를 가지는 구조이다. 대신, npm 처럼 깊어지진 않고 symbolic link 를 사용해서 플랫하게 처리 하여 완전한 플랫형 구조를 가지게 된다.

=========================================================================

curl -fsSL https://get.pnpm.io/install.sh | sh -

source .zshrc

pnpm install

 

-Dvaadin.pnpm.enable=true

 

 

 

npm i -g public-ip                    

 

added 40 packages, and audited 41 packages in 5s

 

10 packages are looking for funding

  run `npm fund` for details

 

found 0 vulnerabilities

static/index.html

 

||

 

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

 

 sudo vim /etc/hosts  

/etc/hosts에서

#::1             localhost 

처럼 주석 처리.

 

 

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Mar 29 08:29:45 KST 2022
There was an unexpected error (type=Internal Server Error, status=500).
Can't assign requested address
java.net.BindException: Can't assign requested address at java.base/sun.nio.ch.Net.connect0(Native Method) at java.base/sun.nio.ch.Net.connect(Net.java:579) at java.base/sun.nio.ch.Net.connect(Net.java:568) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588) at java.base/java.net.Socket.connect(Socket.java:633) at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178) at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:498) at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:603) at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:246) at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:351) at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:373) at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1309) at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1242) at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1128) at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1057) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1665) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589) at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529) at com.vaadin.base.devserver.AbstractDevServerRunner.serveDevModeRequest(AbstractDevServerRunner.java:716) at com.vaadin.flow.server.StaticFileServer.serveStaticResource(StaticFileServer.java:243) at com.vaadin.flow.server.VaadinServlet.serveStaticOrWebJarRequest(VaadinServlet.java:331) at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:286) at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:109) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:711) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:353) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:313) at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:141) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:51) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833)

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

[공지] Swift 에서 SOCANNER로 카테고리를 바꿉니다.  (0) 2024.04.02
MSA 아키텍처 도입  (0) 2023.12.11
game center icon  (0) 2021.06.04
Game Center transcript  (0) 2021.06.04
agreements  (0) 2021.05.29

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

MSA 아키텍처 도입  (0) 2023.12.11
Apple developer program has been updated.  (0) 2021.06.08
Game Center transcript  (0) 2021.06.04
agreements  (0) 2021.05.29
swift log level  (0) 2021.05.28

Hello and welcome to WWDC.
-Hey, everyone.
 I'm Joe.
 -And I'm Michael.
 And we're both designers on the Game Center design team.
 We're here today to talk to you about the new Game Center experience and a whole lot of enhancements we've made to make it more engaging and beautiful for players.
 This session will give you an overview of how to design your game to make the most of Game Center's features.
There are a number of reasons to add Game Center to your game, including social features, where players can add friends and manage their gaming identity.
 Achievements and leaderboards to encourage competition within your game and keep your players coming back for more.
 And a rich multiplayer experience for real time and turn-based games.
 To help you take advantage of all of this, we'll be talking in detail about a number of things, starting with the access point, a consistent and recognizable way for players to access Game Center from within your game.
Let's take a look at this feature by launching a game.
 This is The Coast, an indie game where you have to carefully direct ships away from the shore so they don't crash and lose their precious cargo.
When your game launches, the first thing you'll see is the Game Center welcome banner.
 When this goes away, you'll notice a new UI element appear.
 This is the access point, a clear and easy way for players to access their Game Center information on any game.
The player's avatar serves as the access point for Game Center.
 Tapping or clicking it at any point will launch the new Game Center dashboard.
 It's where players can check out their profile, achievements, leaderboards and other useful information related to your game.
 But we'll get to that in a minute.
You can choose to present just the player's avatar or pair it with bits of helpful information we call "highlights.
" These highlights surface a player's Game Center data, like achievement progress and leaderboard positions.
The access point is pretty flexible.
 You can place it in any corner of the screen that works for your game's UI.
 However, we'd recommend placing it at top left, if possible.
And it works with how your game's designed in both landscape and portrait.
You'll just want to make sure none of your game's UI encroaches upon the area the access point takes at its maximum size.
On iPhone 11 Pro, the access point on portrait games is 62 by 335 points.
 We'd recommend leaving a safe area of 114 points from the top or bottom of the screen that spans the full width.
And for landscape games, it's 62 by 280 points.
It's best to leave a safe area of 91 points from the top or bottom of the screen that spans the full width.
The access point is available across other platforms.
 You can find full details on safe areas for other devices in the Human Interface Guidelines.
Whenever possible, display your access point at your game's main menu.
 Placing it here gives players quick access before they dive into your game.
 Just be sure it appears at the right moment within your game's launch sequence.
 Let any splash screens or cinematics finish before displaying the access point, along with your game's main menu.
If you can't place the access point on your main menu, you could find another place for it that players return to in your game, like on a level select screen or in Settings.
 As you can see, the access point is designed to adapt to your game, but think about how to design your game's UI to feel complementary and fit naturally into the experience.
When the game starts, it's a good idea to hide the access point so players can focus on game play and allow space for any critical in-game controls.
The access point is the best, most consistent way for users to access Game Center from within your game.
 However, you can also link to Game Center using your own custom UI.
 We've provided different icon options to be used within your game-- full color, white and black variants in a variety of formats, all of which you can find in the Apple Design Resources.
 Please use the iconography as provided and don't alter it in any way.
If your custom deep link includes text, please use the correct terminology, Game Center, and don't localize this term.
 And that's the new access point.
 Just a few things to remember: Place the access point on your main menu where possible.
Find the best corner to display your access point.
Surface player information with highlights.
 And ensure safe areas around your access point.
Joe, you're up.
 Thanks, Michael.
 Now let's move on to the dashboard and profile.
Tapping the access point will reveal the dashboard, a jumping-off point into each of the key areas that make up the new Game Center experience.
 The dashboard is presented as a transparent layer on top of your game, and it shows through the color of the screen behind it.
 We recommend that you pause your game or minimize any overly distracting animations when the dashboard is presented.
 The dashboard, along with the rest of the Game Center UI, supports both landscape and portrait orientation, to respect the way your game has been designed.
It has also been designed to feel consistent across iOS, iPadOS, macOS and tvOS.
On tvOS, you can also optionally display artwork on the dashboard.
 This really helps brand the experience and makes it feel more integrated into your game.
 When choosing the artwork to display here, please make sure that it comfortably contrasts with the Game Center UI.
 Consider using transparency to let the background show through.
Make sure that the artwork is simple, clear and reads well at a distance.
 The artwork you use here shouldn't be your app icon.
 Instead, use something different.
 For example, your game's logo or word mark.
 Dashboard artwork is not focusable.
 Here are the specifications for uploading your dashboard artwork.
It must be a TIFF or a PNG file to support transparency.
The image size should be 923 by 150 pixels at 1x.
.
.
1846 by 300 pixels at 2x, at least 72 DPI and in the sRGB color space.
The first section of the dashboard provides access to the profile.
Tapping on this shows players a holistic overview of their Game Center profile-- their friends, friend suggestions and the ability to access their achievements across all of the games they have played.
The profile is always accessible from the dashboard.
 However, you can also optionally provide a button inside your game to link players directly to the profile page.
This could be useful if you want to encourage players to add more friends so that they can better enjoy your game's leaderboard or multiplayer experience.
If you want to provide a link directly to the profile, please use this icon.
 You can style it to work with your game, but do not alter the shape in any way.
 To avoid confusion with the design of the access point, please don't use the player's Game Center avatar for this purpose.
If pairing the link with text, please use the correct language-- Game Center Profile and not "profile" on its own, "account" or anything else.
 And as mentioned before, the term Game Center should not be localized.
However, you can localize the term "profile.
" The accompanying tech session for Game Center will go into detail about how to link to the profile.
And that's the new dashboard and profile.
Let's review what we just talked about.
Remember to pause your game when the Game Center user interface is open.
 You can optionally provide dashboard artwork for tvOS.
And if needed, you can link directly to the Game Center profile from your game.
Now over to Michael for the next section.
 And now on to my personal favorite update to Game Center, achievements, which you'll find in the second section of the dashboard.
I used to love collecting trading cards.
 You just want to get them all, and there's nothing like getting the ones that are hard to find.
 That's exactly why we've redesigned achievements as a collectible card format.
Here, in the redesigned achievements section, players will see a lineup of these cards, representing your game's achievements, which are now grouped by "completed" and "locked.
" There are different kinds of achievements.
 Standard, which are earned straightaway once the requirements are met.
Progressive, which give players a sense of how far away they are from unlocking an achievement.
 And hidden, in which the details remain a mystery until the moment they're unlocked.
Think about how to make the most of these achievement types to improve the experience of playing your game.
And when a player completes any achievement, an image appears in the top portion of the card.
Make sure these images look awesome.
 The Coast has all these great lighthouses from around the world.
 I got this one in Level 5.
 The Passage Lighthouse is in the Great Lakes near Mackinac Island.
 This should be eye-catching, complement your game's look and feel, and make players feel rewarded by getting something special.
 It's a big step in keeping players engaged in your game.
Stay away from using text inside your artwork and upload custom images for each achievement.
 Players love earning unique achievements that remind them of each accomplishment.
And provide an opaque image for each achievement.
 The system automatically crops the image into a circle, so make sure any primary content is centered.
Achievement images are for display only, so they're not focusable.
Order your achievements in a way that reflects the progress of your game play.
 You're allowed up to 100 achievements in a game.
 Be selective about how many you provide.
 It's good to only use what you need to make your game challenging, so earning every one feels rewarding.
And rather than offer all 100 in version one of your game, leave room to add more in later releases to give players a reason to come back.
 There's just a few rules to consider around achievement images.
 It must be a JPEG, TIFF or PNG file, 512 by 512 pixels at 1x, 1024 by 1024 pixels at 2x, at least 72 DPI and in the sRGB color space.
You'll also need to include a title and description text for each of your achievements.
 Make sure they're as clear and succinct as possible so players understand how to earn an achievement at a glance.
And since achievement cards show two lines of your title and description before truncating, try to keep your text under 30 characters to guarantee it will work well across devices.
 Keep your titles initial caps, your description sentence case and avoid using all caps.
And for those final touches to copy, include a second description for when an achievement's been completed.
 And make sure all copy is localized depending on the country or region.
You can also choose to present in-game achievement notifications that give your players an immediate sense of accomplishment.
 We definitely recommend you work these into your game.
 Time these to display right at that moment of completion.
 Like here, in The Coast, as soon as players clear the level.
If you'd like to give players more direct access, you can also provide a custom link into the achievement section of Game Center.
 If you'd like to use iconography, use this, which features the card representation.
 You can style it to work with your game's UI, but don't alter the shape in any way.
Also just be consistent in how you refer to them, using the term "achievements" and not "trophies" or "awards" or anything else.
 That's the new achievement experience.
Let's recap.
Use achievement types to work with your game.
 Design unique, eye-catching images.
 Keep those descriptions clear and succinct.
And incorporate in-game notifications for some of that immediate reward.
Back over to you, Joe.
Thanks, Michael.
 The next section of the dashboard features your game's leaderboards.
A great place to encourage a player to compete with their friends and keep them coming back for more.
Tapping into this section provides an overview of all the leaderboards in your game.
 We recommend that you create leaderboards that best represent the core mechanics of your game play.
 They could be tied to a specific score in your game.
 For example, the longest distance traveled or the total number of coins collected, or alternatively, like in The Coast, each of the leaderboards are tied to a specific geographic region in the game.
Let's focus on the first leaderboard, Crater Lake.
When designing your leaderboard imagery, you should provide unique, eye-catching artwork that is recognizable at a glance.
Ensure that you use different artwork for each leaderboard so that players can differentiate between them.
And also consider how your leaderboards look alongside each other, so that they feel complementary as a set.
For leaderboard image specifications, images must be a JPEG, a TIFF or a PNG file, at 512 by 512 pixels at 1x, 1024 by 1024 pixels at 2x, at least 72 DPI and in the sRGB color space.
On tvOS, leaderboards have a 16-by-9 aspect ratio.
 They're also focusable and support between one and three multilayer images to provide a parallax effect.
During focus on parallax, content around the edges of some layers may be cropped or difficult to see clearly as the image scales and moves.
To ensure that your primary content is always visible, please don't place it close to the edges.
tvOS leaderboard images have different upload specifications.
 Images must be a PNG file, at 659 by 371 pixels at 1x, 1318 by 742 pixels at 2x, at least 72 DPI and in the sRGB color space.
You can find a more detailed overview of how to design focusable layered images for tvOS in the Human Interface Guidelines.
Leaderboards can only show a maximum of two lines before truncating.
 We recommend keeping your leaderboard titles under 30 characters to guarantee that it will work well across all devices and accessibility settings.
Keep titles for your leaderboards initial caps and please avoid using all caps.
Tapping into one of these reveals the scores for the specific leaderboard.
 We have redesigned leaderboards to be focused on friends, the players you care about competing with the most.
Speaking of which, Michael, you've got a bit of catching up to do.
You can also embed the information from your leaderboards directly into your game to give players visibility when it matters the most.
For example, you can give your players a chance to see their position before they start a level, or at the end after they beat their friends' top score.
The Game Center tech session will go into detail about how to embed leaderboard data into your game.
You can also choose to link directly into the leaderboard section of Game Center, or even directly into a specific leaderboard if you want to.
If you'd like to do this, please use the icon that we have provided.
 You can style it to work with your game's UI, but please do not alter the shape in any way.
If accompanying the icon with text, please use the correct language-- "leaderboards," and not "rankings" or "scores" or anything else.
And that's leaderboards.
As a summary of what we just covered, please design unique, eye-catching artwork for each leaderboard.
 tvOS requires a custom 16-by-9 layered artwork.
 Keep your descriptions short and succinct.
 And you can optionally embed leaderboard data into your game and also provide direct links to specific leaderboards.
 Now back to Michael.
Let's touch on multiplayer.
Game Center lets you easily take advantage of its robust set of multiplayer features for real time and turn-based games.
All you'll need is a button as a clear way for players to open the multiplayer lobby.
The new, redesigned lobby makes it simple and easy to jump into a game.
 When the lobby opens, you may want to pause any distracting animation in the background so players can focus on inviting friends.
 Tapping "add" reveals the player picker.
From here, you can see nearby players, friends, recent players and contacts.
Tap a player to add them to the lobby.
And when you're ready, just tap "Invite and Start.
" And if you'd like, you can also implement our multiplayer features without using our UI by building it directly into your game.
 Check out the tech session for more details.
Back over to you, Joe.
Thanks, Michael.
 And now on to the final section.
Game Center is now closely integrated into the App Store.
Visitors to the store will now be able to access their Game Center profile, see their achievements, add friends and browse the games their friends are playing.
Your friends' avatars will now show up on app icons and feature prominently in the game's tab.
Friends playing will also be highlighted on your game's product page.
 You can see them here at the top of the page and also in more detail further down.
 All of this will be enabled by simply integrating your game with Game Center, giving your game a great chance to be featured on the App Store.
 And that takes us to the end.
 Now back to Michael for a summary of everything we've just talked about.
Thanks, Joe.
 And that's the new Game Center experience.
A new way to access Game Center with in-game highlights, the fully redesigned dashboard, our beautiful collectible achievements, our engaging leaderboards and a whole lot more.
 Please remember that everything we discussed can be found in more detail in the Human Interface Guidelines.
We're looking forward to see what you do with Game Center, and we can't wait to play all the games you design.
 Thank you.
 Thanks a lot.

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

Apple developer program has been updated.  (0) 2021.06.08
game center icon  (0) 2021.06.04
agreements  (0) 2021.05.29
swift log level  (0) 2021.05.28
coredata 를 배열로 쓰기  (0) 2021.05.23

APPLE INC.

MACOS SDK AND XCODE AGREEMENT

 

PLEASE READ THIS MACOS SDK AND XCODE AGREEMENT ("LICENSE") CAREFULLY BEFORE USING THE DEVELOPER SOFTWARE (DEFINED BELOW). BY USING THE DEVELOPER SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS LICENSE.  IF YOU ARE ACCESSING THE DEVELOPER SOFTWARE ELECTRONICALLY, SIGNIFY YOUR AGREEMENT TO BE BOUND BY THE TERMS OF THIS LICENSE BY CLICKING THE "AGREE " BUTTON.  IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, DO NOT USE THE DEVELOPER SOFTWARE AND CLICK “DISAGREE”. 

 

IMPORTANT NOTE: To the extent that this software may be used to reproduce materials, it is licensed to you only for reproduction of non-copyrighted materials, materials in which you own the copyright, or materials you are authorized or legally permitted to reproduce. If you are uncertain about your right to copy any material, you should contact your legal advisor.

 

1. General. 

A. The Apple software, tools, utilities, sample or example code, documentation, interfaces, content, data, and other materials accompanying this License, whether on disk, print or electronic documentation, in read only memory, or any other media or in any other form, (collectively, the "Developer Software") are licensed, not sold, to you by Apple Inc. ("Apple") for use only under the terms of this License.  Apple and/or Apple’s licensors retain ownership of the Developer Software itself and reserve all rights not expressly granted to you. The terms of this License will govern any software upgrades provided by Apple that replace and/or supplement the original Developer Software, unless such upgrade is accompanied by a separate license in which case the terms of that license will govern. 

 

B. Title and intellectual property rights in and to any content displayed by or accessed through the Developer Software belongs to the respective content owner. Such content may be protected by copyright or other intellectual property laws and treaties, and may be subject to terms of use of the third party providing such content. This License does not grant you any rights to use such content nor does it guarantee that such content will continue to be available to you.

 

2. Permitted License Uses and Restrictions.

A. License. Subject to the terms and conditions of this License, you are granted a limited, non-exclusive license to use the Developer Software on Apple-branded computers to develop and test application and other software. You may make only as many internal use copies of the Developer Software as reasonably necessary to use the Developer Software as permitted under this License and distribute such copies only to your employees whose job duties require them to so use the Developer Software; provided that you reproduce on each copy of the Developer Software or portion thereof, all copyright or other proprietary notices contained on the original. 

 

B. Other Use Restrictions. The grants set forth in this License do not permit you to, and you agree not to, install, use or run the Developer Software on any non-Apple-branded computer, or to enable others to do so. Except as otherwise expressly permitted by the terms of this License or as otherwise licensed by Apple: (i) only one user may use the Developer Software at a time, and (ii) you may not make the Developer Software available over a network where it could be run or used by multiple computers at the same time. You may not rent, lease, lend, sell, sublicense or otherwise redistribute the Developer Software or exploit any services provided by or through the Developer Software in any unauthorized way. 

 

C. No Reverse Engineering; Limitations. You may not, and you agree not to or to enable others to, copy (except as expressly permitted by this License), decompile, reverse engineer, disassemble, attempt to derive the source code of, decrypt, modify, create derivative works of the Developer Software or any services provided by or through the Developer Software or any part thereof (except as and only to the extent any foregoing restriction is prohibited by applicable law or to the extent as may be permitted by licensing terms governing use of the  Open-Sourced Components or Sample Code). 

 

D. Sample Code. Certain portions of the Developer Software consist of sample or example code provided by Apple ("Sample Code"). You may use, reproduce, modify and redistribute such Sample Code only in accordance with the licensing terms accompanying such Sample Code or related project(s).

 

E. QuickTime Development Software. You may use the QuickTime development software only to develop application software that is compatible with, and runs only on supported macOS and/or Windows platforms with QuickTime installed. Your software application may not interfere with the functionality of QuickTime Player or the QuickTime Plug-in, including but not limited to file type or MIME type associations that are registered to QuickTime.

 

F. Use of System-Provided Images. The system-provided images owned by Apple and documented as such in Apple's Human Interface Guidelines for macOS and iOS ("System-Provided Images") are licensed to you solely for the purpose of developing macOS and iOS applications, respectively, using the Developer Software. Upon termination of this License, you may continue to distribute the System-Provided Images as used within software you developed using the Developer Software; however, you agree to provide to Apple, at Apple's request, a copy of any software you developed using the Developer Software that incorporates any of the System-Provided Images so Apple may determine, in its sole discretion, whether your use of the System-Provided Images complies with these terms.

 

G. Location Services; Consents. 

1. Apple may enable you to access certain location-based application programming interfaces (APIs) (e.g., Core Location) documented by Apple (“Location APIs”) through the Developer Software.  Subject to these terms and conditions, you may use such APIs and services only to enable software programs you develop for use on macOS (“Applications”) to access location data (e.g. the real-time geographic location of a user’s computer) from users who consent to such access. For Applications that use Location APIs or otherwise provide location-based services, you agree that such Applications may not be designed or marketed for automatic or autonomous control of vehicle behavior, or for emergency or life-saving purposes. In addition, Applications that offer location-based services or functionality must notify and obtain consent from an individual before his or her location data is collected, transmitted or otherwise used by the Application. For Applications that use Location APIs for real-time navigation (including, but not limited to, turn-by-turn route guidance and other routing that is enabled through the use of a sensor), you must have an end-user license agreement that includes the following notice: YOUR USE OF THIS REAL TIME ROUTE GUIDANCE APPLICATION IS AT YOUR SOLE RISK. LOCATION DATA MAY NOT BE ACCURATE.

 

2. You agree that neither you nor your Applications will disable, override or otherwise interfere with any Apple-implemented system alerts, warnings, display panels, consent panels and the like, including, but not limited to, those that are intended to notify the user that the user's location data is being collected, transmitted, maintained, processed or used, or intended to obtain consent for such use.  If consent is denied or withdrawn, neither you nor your Applications may collect, transmit, maintain, process or utilize the user's location information or data through the Location APIs. You understand and agree that you and your Applications must comply with all applicable criminal, civil and statutory laws and regulations (including privacy, data collection and location service laws and regulations) in any jurisdictions in which your Applications may be delivered.  You shall be solely responsible for, and Apple shall have no responsibility or liability whatsoever with respect to, any and all claims, suits, liabilities, losses, damages, costs and expenses arising from, related or attributable to, or otherwise involving your Application, including but not limited to your Application’s use of the Location APIs.

 

H. Compliance with Laws. You agree to use the Developer Software and the services in compliance with all applicable laws, including local laws of the country or region in which you reside or in which you download or use the Developer Software or services.

 

3. Transfer. You may make a one-time permanent transfer of all of your license rights to the Developer Software (in its original form as provided by Apple) to another party, provided that: (a) the transfer must include all of the Developer Software, including all its component parts and this License; (b) you do not retain any copies of the Developer Software, full or partial, including copies stored on a computer or other storage device; and (c) the party receiving the Developer Software accepts the terms and conditions of this License. You may not transfer any Developer Software that has been modified or replaced under Section 13 below. All components of the Developer Software are provided as part of a bundle and may not be separated from the bundle and distributed as standalone applications.

 

4. Consent to Use of Data.

A. Diagnostic and Usage Data. If you choose to allow diagnostic and usage collection, you agree that Apple and its subsidiaries and agents may collect, maintain, process and use diagnostic, technical, usage and related information, including but not limited to unique system or hardware identifiers, information about your computer, system and application software, and peripherals, that is gathered periodically to provide and improve Apple’s products and services, facilitate the provision of software updates, product support and other services to you (if any) related to the Developer Software, and to verify compliance with the terms of this License. You may change your preferences for Diagnostics & Usage collection at any time by going to the Diagnostics & Usage setting on your computer and deselecting the checkbox. The Diagnostics & Usage setting is found in the Security & Privacy pane within System Preferences. Apple may use this information, as long as it is collected in a form that does not personally identify you, for the purposes described above. To enable Apple’s partners and third party developers to improve their software, hardware and services designed for use with Apple products, Apple may also provide any such partner or third party developer with a subset of diagnostic information that is relevant to that partner’s or developer’s software, hardware and/or services, as long as the diagnostic information is in a form that does not personally identify you. 

 

B. Privacy Policy. At all times your information will be treated in accordance with Apple’s Privacy Policy, which is incorporated by reference into this License and can be viewed at: http://www.apple.com/legal/privacy/.

 

5. Services; Mac Developer Program.

A. Apple may provide access to services by or through the Developer Software for you to use.  Use of these services may require an Apple ID, may require you to accept additional terms and may be subject to additional fees. If you elect to use such services in conjunction with the Developer Software, your usage of such services will be subject to those additional terms and conditions (e.g., your use of Developer IDs obtained from your Apple Developer Program account will be subject to the applicable Apple Developer Program terms for Developer IDs), but this License will continue to apply to your use of the Developer Software licensed hereunder. If you would like to submit Applications you develop to the Mac App Store, then you must apply to join the Mac Developer Program. More information about Apple’s Developer Programs is available at http://developer.apple.com/. Apple reserves the right to refuse admission to any of its Developer Programs at any time in its sole discretion. 

 

B. You agree that the services contain proprietary content, information and material that is owned by Apple and its licensors, and is protected by applicable intellectual property and other laws, and that you will not use such proprietary content, information or materials in any way whatsoever except for permitted use of the services or in any manner that is inconsistent with the terms of this License or that infringes any intellectual property rights of a third party or Apple. Except to the extent expressly permitted in the applicable terms for the services, You agree not to reproduce, modify, rent, lease, lend, sell, distribute, or create derivative works based on the services, in any manner, and you shall not exploit the services in any unauthorized way whatsoever, including but not limited to, using the services to transmit any malware, or by trespass or burdening network capacity. 

 

C. In addition, services that may be accessed, linked to or displayed through the Developer Software may not be available in all languages or in all countries. Apple makes no representation that any such services would be appropriate or available for use in any particular location. Apple reserves the right to change, suspend, remove, or disable access to any services at any time. In no event will Apple be liable for the removal of or disabling of access to any such services or for any updates, maintenance, warranty, technical or other support for such services. Apple may also impose limits or other restrictions on the use of or access to the services, in any case without notice or liability.  You acknowledge and agree that Apple reserves the right to revoke or remove your access to any services provided by or through the Developer Software at any time in its sole discretion.

 

6. Termination. This License is effective until terminated. Your rights under this License will terminate automatically or cease to be effective without notice from Apple if you fail to comply with any term(s) of this License. In addition, Apple reserves the right to terminate this License if a new version of Apple's operating system software or the Developer Software is released which is incompatible with this version of the Developer Software. Upon the termination of this License, you shall cease all use of the Developer Software and destroy all copies, full or partial, of the Developer Software. Section 2B, 2C, 4, 5B, and 6 through 13 of this License shall survive any termination.

 

7. Disclaimer of Warranties. 

A. YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE DEVELOPER SOFTWARE AND ANY SERVICES PERFORMED BY OR ACCESSED THROUGH THE DEVELOPER SOFTWARE IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU. 

 

B. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE DEVELOPER SOFTWARE AND SERVICES ARE PROVIDED “AS IS” AND “AS AVAILABLE”, WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, AND APPLE AND APPLE'S LICENSORS (COLLECTIVELY REFERRED TO AS “APPLE” FOR THE PURPOSES OF SECTIONS 7 AND 8) HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH RESPECT TO THE DEVELOPER SOFTWARE AND SERVICES, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, QUIET ENJOYMENT, AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS. 

 

C. APPLE DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE DEVELOPER SOFTWARE AND SERVICES, THAT THE FUNCTIONS CONTAINED IN, OR SERVICES PERFORMED OR PROVIDED BY, THE DEVELOPER SOFTWARE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE DEVELOPER SOFTWARE OR SERVICES WILL BE UNINTERRUPTED OR ERROR-FREE, THAT ANY SERVICES WILL CONTINUE TO BE MADE AVAILABLE, THAT THE DEVELOPER SOFTWARE OR SERVICES WILL BE COMPATIBLE OR WORK WITH ANY THIRD PARTY SOFTWARE, APPLICATIONS OR THIRD PARTY SERVICES, OR THAT DEFECTS IN THE DEVELOPER SOFTWARE OR SERVICES WILL BE CORRECTED. INSTALLATION OF THIS DEVELOPER SOFTWARE MAY AFFECT THE USABILITY OF THIRD PARTY SOFTWARE, APPLICATIONS OR THIRD PARTY SERVICES AS WELL AS OTHER APPLE PRODUCTS OR SERVICES.

 

D. YOU FURTHER ACKNOWLEDGE THAT THE DEVELOPER SOFTWARE AND SERVICES ARE NOT INTENDED OR SUITABLE FOR USE IN SITUATIONS OR ENVIRONMENTS WHERE THE FAILURE OR TIME DELAYS OF, OR ERRORS OR INACCURACIES IN THE CONTENT, DATA OR INFORMATION PROVIDED BY, THE DEVELOPER SOFTWARE OR SERVICES COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE, INCLUDING WITHOUT LIMITATION THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, LIFE SUPPORT OR WEAPONS SYSTEMS. 

 

E. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SHOULD THE DEVELOPER SOFTWARE OR SERVICES PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A CONSUMER, SO THE ABOVE EXCLUSION AND LIMITATIONS MAY NOT APPLY TO YOU. 

 

8. Limitation of Liability. TO THE EXTENT NOT PROHIBITED BY APPLICABLE LAW, IN NO EVENT SHALL APPLE BE LIABLE FOR PERSONAL INJURY, OR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, CORRUPTION OR LOSS OF DATA, FAILURE TO TRANSMIT OR RECEIVE ANY DATA OR INFORMATION, BUSINESS INTERRUPTION OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR INABILITY TO USE THE DEVELOPER SOFTWARE OR SERVICES OR ANY THIRD PARTY SOFTWARE, APPLICATIONS, OR SERVICES IN CONJUNCTION WITH THE DEVELOPER SOFTWARE OR SERVICES, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT OR OTHERWISE) AND EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to you for all damages (other than as may be required by applicable law in cases involving personal injury) exceed the amount of fifty dollars ($50.00). The foregoing limitations will apply even if the above stated remedy fails of its essential purpose.

 

9. Export Control. You may not use or otherwise export or re-export the Developer Software except as authorized by United States law and the laws of the jurisdiction(s) in which the Developer Software was obtained. In particular, but without limitation, the Developer Software may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person's List or Entity List. By using the Developer Software, you represent and warrant that you are not located in any such country or on any such list. You also agree that you will not use the Developer Software for any purposes prohibited by United States law, including, without limitation, the development, design, manufacture or production of missiles, nuclear, chemical or biological weapons.

 

10. Government End Users. The Developer Software and related documentation are "Commercial Items", as that term is defined at 48 C.F.R. §2.101, consisting of "Commercial Computer Software" and "Commercial Computer Software Documentation", as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202, as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States.

 

11. Controlling Law and Severability. This License will be governed by and construed in accordance with the laws of the State of California, excluding its conflict of law principles. This License shall not be governed by the United Nations Convention on Contracts for the International Sale of Goods, the application of which is expressly excluded. If for any reason a court of competent jurisdiction finds any provision, or portion thereof, to be unenforceable, the remainder of this License shall continue in full force and effect.  

 

12. Complete Agreement; Governing Language. This License constitutes the entire agreement between you and Apple relating to the use of the Developer Software licensed hereunder and supersedes all prior or contemporaneous understandings regarding such subject matter. No amendment to or modification of this License will be binding unless in writing and signed by Apple.  The parties hereto confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais.

 

13. Third Party Acknowledgements. 

A. Certain components of the Developer Software, and third party open source programs included with the Developer Software, have been or may be made available by Apple on its Open Source web site (http://www.opensource.apple.com/) (collectively the "Open-Sourced Components"). You may modify or replace only these Open-Sourced Components; provided that: (i) the resultant modified Developer Software is used in accordance with the permitted uses set forth above; and (ii) you otherwise comply with the terms of this License and any applicable licensing terms governing use of the Open-Sourced Components. Apple is not obligated to provide any updates, maintenance, warranty, technical or other support, or services for the resultant modified Developer Software. You expressly acknowledge that if failure of or damage to Apple hardware results from modification of the Open-Sourced Components of the Developer Software, such failure or damage is excluded from the terms of the Apple hardware warranty.

 

B. Certain software libraries and other third party software included with the Developer Software are free software and licensed under the terms of the GNU General Public License (GPL) or the GNU Library/Lesser General Public License (LGPL), as the case may be. You may obtain a complete machine-readable copy of the source code for such free software under the terms of the GPL or LGPL, as the case may be, without charge except for the cost of media, shipping, and handling, upon written request to Apple. The GPL/LGPL software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy of the GPL and LGPL is included with the Developer Software.

 

C. The Developer Software includes certain software licensed under the IBM Public License Version 1.0 (IPL) or the Common Public License Version 1.0 (CPL). A copy of the source code for the IPL and CPL licensed software may be found in Apple’s Open Source repository. See Apple's Open Source web site (http://www.opensource.apple.com) for information on how to obtain the source code. THE IPL AND CPL SOFTWARE IS PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER APPLE, IBM NOR ANY OTHER CONTRIBUTOR TO THE  IPL AND CPL SOFTWARE SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, WITHOUT LIMITATION, LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE IPL AND CPL SOFTWARE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

 

EA1422

8/25/2016

 

 

APPLE INC.

MACOS SDK AND XCODE AGREEMENT

 

PLEASE READ THIS MACOS SDK AND XCODE AGREEMENT ("LICENSE") CAREFULLY BEFORE USING THE DEVELOPER SOFTWARE (DEFINED BELOW). BY USING THE DEVELOPER SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS LICENSE.  IF YOU ARE ACCESSING THE DEVELOPER SOFTWARE ELECTRONICALLY, SIGNIFY YOUR AGREEMENT TO BE BOUND BY THE TERMS OF THIS LICENSE BY CLICKING THE "AGREE " BUTTON.  IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, DO NOT USE THE DEVELOPER SOFTWARE AND CLICK “DISAGREE”. 

 

IMPORTANT NOTE: To the extent that this software may be used to reproduce materials, it is licensed to you only for reproduction of non-copyrighted materials, materials in which you own the copyright, or materials you are authorized or legally permitted to reproduce. If you are uncertain about your right to copy any material, you should contact your legal advisor.

 

1. General. 

A. The Apple software, tools, utilities, sample or example code, documentation, interfaces, content, data, and other materials accompanying this License, whether on disk, print or electronic documentation, in read only memory, or any other media or in any other form, (collectively, the "Developer Software") are licensed, not sold, to you by Apple Inc. ("Apple") for use only under the terms of this License.  Apple and/or Apple’s licensors retain ownership of the Developer Software itself and reserve all rights not expressly granted to you. The terms of this License will govern any software upgrades provided by Apple that replace and/or supplement the original Developer Software, unless such upgrade is accompanied by a separate license in which case the terms of that license will govern. 

 

B. Title and intellectual property rights in and to any content displayed by or accessed through the Developer Software belongs to the respective content owner. Such content may be protected by copyright or other intellectual property laws and treaties, and may be subject to terms of use of the third party providing such content. This License does not grant you any rights to use such content nor does it guarantee that such content will continue to be available to you.

 

2. Permitted License Uses and Restrictions.

A. License. Subject to the terms and conditions of this License, you are granted a limited, non-exclusive license to use the Developer Software on Apple-branded computers to develop and test application and other software. You may make only as many internal use copies of the Developer Software as reasonably necessary to use the Developer Software as permitted under this License and distribute such copies only to your employees whose job duties require them to so use the Developer Software; provided that you reproduce on each copy of the Developer Software or portion thereof, all copyright or other proprietary notices contained on the original. 

 

B. Other Use Restrictions. The grants set forth in this License do not permit you to, and you agree not to, install, use or run the Developer Software on any non-Apple-branded computer, or to enable others to do so. Except as otherwise expressly permitted by the terms of this License or as otherwise licensed by Apple: (i) only one user may use the Developer Software at a time, and (ii) you may not make the Developer Software available over a network where it could be run or used by multiple computers at the same time. You may not rent, lease, lend, sell, sublicense or otherwise redistribute the Developer Software or exploit any services provided by or through the Developer Software in any unauthorized way. 

 

C. No Reverse Engineering; Limitations. You may not, and you agree not to or to enable others to, copy (except as expressly permitted by this License), decompile, reverse engineer, disassemble, attempt to derive the source code of, decrypt, modify, create derivative works of the Developer Software or any services provided by or through the Developer Software or any part thereof (except as and only to the extent any foregoing restriction is prohibited by applicable law or to the extent as may be permitted by licensing terms governing use of the  Open-Sourced Components or Sample Code). 

 

D. Sample Code. Certain portions of the Developer Software consist of sample or example code provided by Apple ("Sample Code"). You may use, reproduce, modify and redistribute such Sample Code only in accordance with the licensing terms accompanying such Sample Code or related project(s).

 

E. QuickTime Development Software. You may use the QuickTime development software only to develop application software that is compatible with, and runs only on supported macOS and/or Windows platforms with QuickTime installed. Your software application may not interfere with the functionality of QuickTime Player or the QuickTime Plug-in, including but not limited to file type or MIME type associations that are registered to QuickTime.

 

F. Use of System-Provided Images. The system-provided images owned by Apple and documented as such in Apple's Human Interface Guidelines for macOS and iOS ("System-Provided Images") are licensed to you solely for the purpose of developing macOS and iOS applications, respectively, using the Developer Software. Upon termination of this License, you may continue to distribute the System-Provided Images as used within software you developed using the Developer Software; however, you agree to provide to Apple, at Apple's request, a copy of any software you developed using the Developer Software that incorporates any of the System-Provided Images so Apple may determine, in its sole discretion, whether your use of the System-Provided Images complies with these terms.

 

G. Location Services; Consents. 

1. Apple may enable you to access certain location-based application programming interfaces (APIs) (e.g., Core Location) documented by Apple (“Location APIs”) through the Developer Software.  Subject to these terms and conditions, you may use such APIs and services only to enable software programs you develop for use on macOS (“Applications”) to access location data (e.g. the real-time geographic location of a user’s computer) from users who consent to such access. For Applications that use Location APIs or otherwise provide location-based services, you agree that such Applications may not be designed or marketed for automatic or autonomous control of vehicle behavior, or for emergency or life-saving purposes. In addition, Applications that offer location-based services or functionality must notify and obtain consent from an individual before his or her location data is collected, transmitted or otherwise used by the Application. For Applications that use Location APIs for real-time navigation (including, but not limited to, turn-by-turn route guidance and other routing that is enabled through the use of a sensor), you must have an end-user license agreement that includes the following notice: YOUR USE OF THIS REAL TIME ROUTE GUIDANCE APPLICATION IS AT YOUR SOLE RISK. LOCATION DATA MAY NOT BE ACCURATE.

 

2. You agree that neither you nor your Applications will disable, override or otherwise interfere with any Apple-implemented system alerts, warnings, display panels, consent panels and the like, including, but not limited to, those that are intended to notify the user that the user's location data is being collected, transmitted, maintained, processed or used, or intended to obtain consent for such use.  If consent is denied or withdrawn, neither you nor your Applications may collect, transmit, maintain, process or utilize the user's location information or data through the Location APIs. You understand and agree that you and your Applications must comply with all applicable criminal, civil and statutory laws and regulations (including privacy, data collection and location service laws and regulations) in any jurisdictions in which your Applications may be delivered.  You shall be solely responsible for, and Apple shall have no responsibility or liability whatsoever with respect to, any and all claims, suits, liabilities, losses, damages, costs and expenses arising from, related or attributable to, or otherwise involving your Application, including but not limited to your Application’s use of the Location APIs.

 

H. Compliance with Laws. You agree to use the Developer Software and the services in compliance with all applicable laws, including local laws of the country or region in which you reside or in which you download or use the Developer Software or services.

 

3. Transfer. You may make a one-time permanent transfer of all of your license rights to the Developer Software (in its original form as provided by Apple) to another party, provided that: (a) the transfer must include all of the Developer Software, including all its component parts and this License; (b) you do not retain any copies of the Developer Software, full or partial, including copies stored on a computer or other storage device; and (c) the party receiving the Developer Software accepts the terms and conditions of this License. You may not transfer any Developer Software that has been modified or replaced under Section 13 below. All components of the Developer Software are provided as part of a bundle and may not be separated from the bundle and distributed as standalone applications.

 

4. Consent to Use of Data.

A. Diagnostic and Usage Data. If you choose to allow diagnostic and usage collection, you agree that Apple and its subsidiaries and agents may collect, maintain, process and use diagnostic, technical, usage and related information, including but not limited to unique system or hardware identifiers, information about your computer, system and application software, and peripherals, that is gathered periodically to provide and improve Apple’s products and services, facilitate the provision of software updates, product support and other services to you (if any) related to the Developer Software, and to verify compliance with the terms of this License. You may change your preferences for Diagnostics & Usage collection at any time by going to the Diagnostics & Usage setting on your computer and deselecting the checkbox. The Diagnostics & Usage setting is found in the Security & Privacy pane within System Preferences. Apple may use this information, as long as it is collected in a form that does not personally identify you, for the purposes described above. To enable Apple’s partners and third party developers to improve their software, hardware and services designed for use with Apple products, Apple may also provide any such partner or third party developer with a subset of diagnostic information that is relevant to that partner’s or developer’s software, hardware and/or services, as long as the diagnostic information is in a form that does not personally identify you. 

 

B. Privacy Policy. At all times your information will be treated in accordance with Apple’s Privacy Policy, which is incorporated by reference into this License and can be viewed at: http://www.apple.com/legal/privacy/.

 

5. Services; Mac Developer Program.

A. Apple may provide access to services by or through the Developer Software for you to use.  Use of these services may require an Apple ID, may require you to accept additional terms and may be subject to additional fees. If you elect to use such services in conjunction with the Developer Software, your usage of such services will be subject to those additional terms and conditions (e.g., your use of Developer IDs obtained from your Apple Developer Program account will be subject to the applicable Apple Developer Program terms for Developer IDs), but this License will continue to apply to your use of the Developer Software licensed hereunder. If you would like to submit Applications you develop to the Mac App Store, then you must apply to join the Mac Developer Program. More information about Apple’s Developer Programs is available at http://developer.apple.com/. Apple reserves the right to refuse admission to any of its Developer Programs at any time in its sole discretion. 

 

B. You agree that the services contain proprietary content, information and material that is owned by Apple and its licensors, and is protected by applicable intellectual property and other laws, and that you will not use such proprietary content, information or materials in any way whatsoever except for permitted use of the services or in any manner that is inconsistent with the terms of this License or that infringes any intellectual property rights of a third party or Apple. Except to the extent expressly permitted in the applicable terms for the services, You agree not to reproduce, modify, rent, lease, lend, sell, distribute, or create derivative works based on the services, in any manner, and you shall not exploit the services in any unauthorized way whatsoever, including but not limited to, using the services to transmit any malware, or by trespass or burdening network capacity. 

 

C. In addition, services that may be accessed, linked to or displayed through the Developer Software may not be available in all languages or in all countries. Apple makes no representation that any such services would be appropriate or available for use in any particular location. Apple reserves the right to change, suspend, remove, or disable access to any services at any time. In no event will Apple be liable for the removal of or disabling of access to any such services or for any updates, maintenance, warranty, technical or other support for such services. Apple may also impose limits or other restrictions on the use of or access to the services, in any case without notice or liability.  You acknowledge and agree that Apple reserves the right to revoke or remove your access to any services provided by or through the Developer Software at any time in its sole discretion.

 

6. Termination. This License is effective until terminated. Your rights under this License will terminate automatically or cease to be effective without notice from Apple if you fail to comply with any term(s) of this License. In addition, Apple reserves the right to terminate this License if a new version of Apple's operating system software or the Developer Software is released which is incompatible with this version of the Developer Software. Upon the termination of this License, you shall cease all use of the Developer Software and destroy all copies, full or partial, of the Developer Software. Section 2B, 2C, 4, 5B, and 6 through 13 of this License shall survive any termination.

 

7. Disclaimer of Warranties. 

A. YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE DEVELOPER SOFTWARE AND ANY SERVICES PERFORMED BY OR ACCESSED THROUGH THE DEVELOPER SOFTWARE IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU. 

 

B. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE DEVELOPER SOFTWARE AND SERVICES ARE PROVIDED “AS IS” AND “AS AVAILABLE”, WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, AND APPLE AND APPLE'S LICENSORS (COLLECTIVELY REFERRED TO AS “APPLE” FOR THE PURPOSES OF SECTIONS 7 AND 8) HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH RESPECT TO THE DEVELOPER SOFTWARE AND SERVICES, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, QUIET ENJOYMENT, AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS. 

 

C. APPLE DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE DEVELOPER SOFTWARE AND SERVICES, THAT THE FUNCTIONS CONTAINED IN, OR SERVICES PERFORMED OR PROVIDED BY, THE DEVELOPER SOFTWARE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE DEVELOPER SOFTWARE OR SERVICES WILL BE UNINTERRUPTED OR ERROR-FREE, THAT ANY SERVICES WILL CONTINUE TO BE MADE AVAILABLE, THAT THE DEVELOPER SOFTWARE OR SERVICES WILL BE COMPATIBLE OR WORK WITH ANY THIRD PARTY SOFTWARE, APPLICATIONS OR THIRD PARTY SERVICES, OR THAT DEFECTS IN THE DEVELOPER SOFTWARE OR SERVICES WILL BE CORRECTED. INSTALLATION OF THIS DEVELOPER SOFTWARE MAY AFFECT THE USABILITY OF THIRD PARTY SOFTWARE, APPLICATIONS OR THIRD PARTY SERVICES AS WELL AS OTHER APPLE PRODUCTS OR SERVICES.

 

D. YOU FURTHER ACKNOWLEDGE THAT THE DEVELOPER SOFTWARE AND SERVICES ARE NOT INTENDED OR SUITABLE FOR USE IN SITUATIONS OR ENVIRONMENTS WHERE THE FAILURE OR TIME DELAYS OF, OR ERRORS OR INACCURACIES IN THE CONTENT, DATA OR INFORMATION PROVIDED BY, THE DEVELOPER SOFTWARE OR SERVICES COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE, INCLUDING WITHOUT LIMITATION THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, LIFE SUPPORT OR WEAPONS SYSTEMS. 

 

E. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SHOULD THE DEVELOPER SOFTWARE OR SERVICES PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A CONSUMER, SO THE ABOVE EXCLUSION AND LIMITATIONS MAY NOT APPLY TO YOU. 

 

8. Limitation of Liability. TO THE EXTENT NOT PROHIBITED BY APPLICABLE LAW, IN NO EVENT SHALL APPLE BE LIABLE FOR PERSONAL INJURY, OR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, CORRUPTION OR LOSS OF DATA, FAILURE TO TRANSMIT OR RECEIVE ANY DATA OR INFORMATION, BUSINESS INTERRUPTION OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR INABILITY TO USE THE DEVELOPER SOFTWARE OR SERVICES OR ANY THIRD PARTY SOFTWARE, APPLICATIONS, OR SERVICES IN CONJUNCTION WITH THE DEVELOPER SOFTWARE OR SERVICES, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT OR OTHERWISE) AND EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to you for all damages (other than as may be required by applicable law in cases involving personal injury) exceed the amount of fifty dollars ($50.00). The foregoing limitations will apply even if the above stated remedy fails of its essential purpose.

 

9. Export Control. You may not use or otherwise export or re-export the Developer Software except as authorized by United States law and the laws of the jurisdiction(s) in which the Developer Software was obtained. In particular, but without limitation, the Developer Software may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person's List or Entity List. By using the Developer Software, you represent and warrant that you are not located in any such country or on any such list. You also agree that you will not use the Developer Software for any purposes prohibited by United States law, including, without limitation, the development, design, manufacture or production of missiles, nuclear, chemical or biological weapons.

 

10. Government End Users. The Developer Software and related documentation are "Commercial Items", as that term is defined at 48 C.F.R. §2.101, consisting of "Commercial Computer Software" and "Commercial Computer Software Documentation", as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202, as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States.

 

11. Controlling Law and Severability. This License will be governed by and construed in accordance with the laws of the State of California, excluding its conflict of law principles. This License shall not be governed by the United Nations Convention on Contracts for the International Sale of Goods, the application of which is expressly excluded. If for any reason a court of competent jurisdiction finds any provision, or portion thereof, to be unenforceable, the remainder of this License shall continue in full force and effect.  

 

12. Complete Agreement; Governing Language. This License constitutes the entire agreement between you and Apple relating to the use of the Developer Software licensed hereunder and supersedes all prior or contemporaneous understandings regarding such subject matter. No amendment to or modification of this License will be binding unless in writing and signed by Apple.  The parties hereto confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais.

 

13. Third Party Acknowledgements. 

A. Certain components of the Developer Software, and third party open source programs included with the Developer Software, have been or may be made available by Apple on its Open Source web site (http://www.opensource.apple.com/) (collectively the "Open-Sourced Components"). You may modify or replace only these Open-Sourced Components; provided that: (i) the resultant modified Developer Software is used in accordance with the permitted uses set forth above; and (ii) you otherwise comply with the terms of this License and any applicable licensing terms governing use of the Open-Sourced Components. Apple is not obligated to provide any updates, maintenance, warranty, technical or other support, or services for the resultant modified Developer Software. You expressly acknowledge that if failure of or damage to Apple hardware results from modification of the Open-Sourced Components of the Developer Software, such failure or damage is excluded from the terms of the Apple hardware warranty.

 

B. Certain software libraries and other third party software included with the Developer Software are free software and licensed under the terms of the GNU General Public License (GPL) or the GNU Library/Lesser General Public License (LGPL), as the case may be. You may obtain a complete machine-readable copy of the source code for such free software under the terms of the GPL or LGPL, as the case may be, without charge except for the cost of media, shipping, and handling, upon written request to Apple. The GPL/LGPL software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy of the GPL and LGPL is included with the Developer Software.

 

C. The Developer Software includes certain software licensed under the IBM Public License Version 1.0 (IPL) or the Common Public License Version 1.0 (CPL). A copy of the source code for the IPL and CPL licensed software may be found in Apple’s Open Source repository. See Apple's Open Source web site (http://www.opensource.apple.com) for information on how to obtain the source code. THE IPL AND CPL SOFTWARE IS PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER APPLE, IBM NOR ANY OTHER CONTRIBUTOR TO THE  IPL AND CPL SOFTWARE SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, WITHOUT LIMITATION, LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE IPL AND CPL SOFTWARE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

 

EA1422

8/25/2016

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

game center icon  (0) 2021.06.04
Game Center transcript  (0) 2021.06.04
swift log level  (0) 2021.05.28
coredata 를 배열로 쓰기  (0) 2021.05.23
tableview 에 button 삽입 후 title 가져오기  (0) 2021.05.23

struct _logLevel: OptionSet {

        let rawValue: Int

        static let critical    = _logLevel(rawValue: 1 << 0)

        static let major  = _logLevel(rawValue: 1 << 1)

        static let minor   = _logLevel(rawValue: 1 << 2)

        static let just   = _logLevel(rawValue: 1 << 3)

        static let graph = _logLevel(rawValue: 1 << 4)

        static let current = _logLevel(rawValue: 1 << 5)

        static let fixing = _logLevel(rawValue: 1 << 6)

        static let motion = _logLevel(rawValue: 1 << 7)

        static let network = _logLevel(rawValue: 1 << 8)

        static let network2 = _logLevel(rawValue: 1 << 9)

        static let none = _logLevel(rawValue: 1 << 10)

        static let layer = _logLevel(rawValue: 1 << 11)

        static let json = _logLevel(rawValue: 1 << 12)

        static let share = _logLevel(rawValue: 1 << 13)

        static let guideline = _logLevel(rawValue: 1 << 14)

        static let calendar = _logLevel(rawValue: 1 << 15)

        static let refresh = _logLevel(rawValue: 1 << 16)

        static let location = _logLevel(rawValue: 1 << 17)

        static let all: _logLevel = [.critical, .major, .minor, .just, .graph, .current, .location, .fixing, .motion, .network, .network2, .layer, .json, .share, .guideline, .calendar, .refresh]

    }

 

class GS {

    

    static let s = GS()

    

    var totalScore : Int? = 0

    

    var logLevel: _logLevel = .current

 

 

if GS.s.logLevel == .motion { debugPrint("didSwipe Down") }

 

if GS.s.logLevel == .fixing {

 

 

if(!GS.s.logLevel.contains(.none)) {

 

 

나름 나의 고급 기술인데 오픈한다.

 

로그 레벨을 나눈 것과 아닌 프로젝트의 차이는 트러블슈팅에서 천지차이.

 

 

 

list4c = getCentaur()

currentAnimal = list4c[row].name?.description ?? ""

 

ORM 은 정말 편하다. Objective-C에서는 sql을 직접 다루느라 힘들었는데 말이다.

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

agreements  (0) 2021.05.29
swift log level  (0) 2021.05.28
tableview 에 button 삽입 후 title 가져오기  (0) 2021.05.23
한 번은 사용해 봐야할 iOS 기술 스택  (0) 2021.05.21
Snapkit 실무 코드  (0) 2021.05.20

let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! HomeTableViewCell

        cell.selectionStyle = .none

        let image = UIImage(named:"twodimg_"+"\(indexPath.row+1)")

        cell.feedImageView.image = image

 

        let button = UIButton(frame: CGRect(x: 0, y: 0, width: cellFrame.width, height: cellFrame.height))

        button.setTitle("fff", for: .normal)

        button.titleLabel?.layer.opacity = 0.0;

        button.addTarget(self, action: #selector(onClickCheck(_:)), for: .touchUpInside)

        cell.addSubview(button)

        

        return cell

 

debugPrint("title is", (sender as? UIButton)?.titleLabel?.text)

 

기본 코드다. 이미지만 쓰는 테이블 뷰를 만들고 데이터를 title 로 보내는 것을 만들고 있다. button에 extension을 달아도 되지만 title자체를 쓰지 않으니 타이틀을 텍스트에 실어 보내는.

이미지 번호를 row로 세팅하는 것처럼 객체 배열 번호를 넣어주면 된다.

인터넷 보니 tag 밖에 없어 int 만 전달할 수 없으니 내가 만드는 제품에는 불편해서 생각해 본 아이디어.

https://haningya.tistory.com/33

 

뱅크 샐러드는 어떤 라이브러리를 쓸까?(iOS 유용한 라이브러리)

많고 많은 라이브러리~ 뱅크 샐러드를 쓰다가 재밌는 걸 발견했다ㅋㅋㅋ 개인설정 --> 오픈소스 라이센스 이용고지 --> 스크롤 하면 채용정보가 나타난다ㅋㅋㅋ 커여운 이모티콘과 함께 뱅크 샐

haningya.tistory.com

Alamofire 

AlignedCollectionView

FlowLayout 

Async 

Carte 

ChameleonFramework/Swift 

CSV.swift Firebase/Core 

Firebase/Database 

JTAppleCalendar 

KakaoLink 

NVActivityIndicatorView 

ObjectMapper 

PinLayout 

RealmSwift 

RLMRealm 

RxCocoa 

RxSwift 

SnapKit 

SQLite 

SwiftyJSON 

Then

SnapKit 으로 실무 변환 코드를 써 놓으니 아마 도움 되실 분이 계실 것 같다.




Code 로 View 를 그리기 위한 필수 Pod 이다. SnapKit을 이용하면 코드량이 줄고 가독성이 좋아진다. pod 'SnapKit' 설치 후, import SnapKit 이면 코드 전환이 가능하다.

 

NSLayoutConstraint.activate([

            btnAddDefect.widthAnchor.constraint(equalToConstant: 64),

            btnAddDefect.heightAnchor.constraint(equalToConstant: 64),

            btnAddDefect.leadingAnchor.constraint(equalTo: self.mainView.leadingAnchor, constant: 8),

            btnAddDefect.bottomAnchor.constraint(equalTo: bottomView.topAnchor, constant: -8),

        ])

 

이 코드를 SnapKit을 이용하여, 간결하며 보다 나은 가독성의 코드로 바꿀 수 있다.

 

btnAddDefect.snp.makeConstraints {

            $0.width.equalTo(64)

            $0.height.equalTo(64)

            $0.left.equalTo(self.mainView.snp.left).offset(8)

            $0.bottom.equalTo(bottomView.snp.top).offset(-8)

        }

 

 

Tip : 다국어 적용이 아니면, leading 보다 left를, trailing보다 right를 쓰는 것이 좋다. leading/trailing 의 경우 오른쪽에서 왼쪽으로 쓰는 언어(히브리어, 아랍어) 인 경우 우측 정렬을 우선시 하게 해 준다.

 

그 외 변환 된 다양한 실무 코드를 보자.

 

NSLayoutConstraint.activate([
           slider.widthAnchor.constraint(equalToConstant: 256),
           hjhSlider.heightAnchor.constraint(equalToConstant: 30),
           hjhSlider.leadingAnchor.constraint(equalTo: minusImage.trailingAnchor, constant: 12),
           hjhSlider.trailingAnchor.constraint(equalTo: plusImage.leadingAnchor, constant: -12),
           hjhSlider.centerYAnchor.constraint(equalTo: viewAngleLabel.centerYAnchor),
        ])
      hjhSlider.snp.makeConstraints {
            $0.width.equalTo(256)
            $0.height.equalTo(30)
            $0.left.equalTo(minusImage.snp.left).offset(12)
            $0.right.equalTo(plusImage.snp.right).offset(-12)
            $0.centerY.equalTo(viewAngleLabel.snp.centerY)
        }



NSLayoutConstraint.activate([
            minusImage.widthAnchor.constraint(equalToConstant: 16),
            minusImage.heightAnchor.constraint(equalToConstant: 2.7),
            minusImage.leadingAnchor.constraint(equalTo: viewAngleLabel.trailingAnchor, constant: 4),
            minusImage.centerYAnchor.constraint(equalTo: viewAngleLabel.centerYAnchor),
        ])
        

minusImage.snp.makeConstraints {
            $0.width.equalTo(16)
            $0.height.equalTo(2.7)
            $0.left.equalTo(viewAngleLabel.snp.right).offset(4)
            $0.centerY.equalTo(viewAngleLabel.snp.centerY)
        }

Tip : 레거시 코드 수동 변환 시에는 ^⌘T 로 옆에 탭을 하나 더 열고 작업하는 것이 좋다.

 

NSLayoutConstraint.activate([
            plusImage.widthAnchor.constraint(equalToConstant: 16),
            plusImage.heightAnchor.constraint(equalToConstant: 16),
            plusImage.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -12),
            plusImage.centerYAnchor.constraint(equalTo: viewAngleLabel.centerYAnchor),
        ])
plusImage.snp.makeConstraints {
            $0.width.equalTo(16)
            $0.height.equalTo(16)
            $0.right.equalToSuperview().offset(-12)
            $0.centerY.equalTo(viewAngleLabel.snp.centerY)
        }

Tip : 상위 뷰가 self.view라면 .equalToSuperview를 쓸 수 있다.



NSLayoutConstraint.activate([
            dropDown.heightAnchor.constraint(equalToConstant: 32),
            dropDown.leadingAnchor.constraint(equalTo: self.mtkView.leadingAnchor, constant: 8),
            dropDown.trailingAnchor.constraint(equalTo: self.mtkView.trailingAnchor, constant: -8),
        ])
dropDown.snp.makeConstraints {
            $0.height.equalTo(32)
            $0.left.equalToSuperview().offset(8)
            $0.right.equalToSuperview().offset(-8)
        }





NSLayoutConstraint.activate([
            viewAngleLabel.widthAnchor.constraint(equalToConstant: 30),
            viewAngleLabel.heightAnchor.constraint(equalToConstant: 24),
            viewAngleLabel.leadingAnchor.constraint(equalTo: self.mtkView.leadingAnchor, constant: 12),
            viewAngleLabel.bottomAnchor.constraint(equalTo: self.mtkView.bottomAnchor, constant: -8),
        ])
viewAngleLabel.snp.makeConstraints {
            $0.width.equalTo(30)
            $0.height.equalTo(24)
            $0.left.equalToSuperview().offset(12)
            $0.bottom.equalToSuperview().offset(-8)
        }





NSLayoutConstraint.activate([
            hjh_currentLocation.widthAnchor.constraint(equalTo: self.mtkView.widthAnchor, multiplier:0.4),
            hjh_currentLocation.heightAnchor.constraint(equalToConstant: 32),
            hjh_currentLocation.leadingAnchor.constraint(equalTo: self.mtkView.leadingAnchor),
            hjh_currentLocation.topAnchor.constraint(equalTo: emptyView.bottomAnchor)
        ])
        hjh_currentLocation.snp.makeConstraints({ (ConstraintMaker) in
            ConstraintMaker.width.equalTo(view.frame.width * 0.4)
            ConstraintMaker.height.equalTo(32)
            ConstraintMaker.left.equalToSuperview()
            ConstraintMaker.top.equalTo(bottomView.snp.bottom)
        })




파일 설치

  • python opencv/platforms/ios/build_framework.py ios
  • python opencv/platforms/ios/build_framework.py ios --contrib opencv_contrib
  • python opencv/platforms/ios/build_framework.py ios --contrib opencv_contrib --iphoneos_archs arm64 --iphonesimulator_archs x86_64



- (IBAction)onClickSegmentedControl:(id)sender {

    self.mNmTppg=@"";

    if(self.mDokkaebi.selectedSegmentIndex ==0) {

        mCanYouSeeThisSword = @"H";

    } else if(self.mDokkaebi.selectedSegmentIndex ==1) {

        mCanYouSeeThisSword = @"P";

    }

    [self initializeData];

}




 HPQualityControl2 *v = [[HPQualityControl2 alloc] initWithNibName:@"HPQualityControl2" bundle:[NSBundle mainBundle]];

        if(self.mDokkaebi.selectedSegmentIndex ==0) {

            v.previousSegment = false;

        } else if(self.mDokkaebi.selectedSegmentIndex ==1) {

            v.previousSegment = true;

        }

            if(self.mDokkaebi.selectedSegmentIndex ==0) {

                v.mNm_tppg = _mCdTppg; } else {

                                v.mNm_tppg = _mNmTppg;

                }



  if(self.mDokkaebi.selectedSegmentIndex ==0) {

            [mLblHosh setText:[NSString stringWithFormat:@"→%@ %@호(%@)→%@%ld건", dongNm, nohs, tppgCd, mvin, (long)cntB]];

            [GlobalVar saveToUserDefaults:tppgCd forKey:@"HP_CD_TPPG"];

            } else if(self.mDokkaebi.selectedSegmentIndex ==1) {




'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

한 번은 사용해 봐야할 iOS 기술 스택  (0) 2021.05.21
Snapkit 실무 코드  (0) 2021.05.20
POD  (0) 2021.05.20
List  (0) 2021.05.18
UINavigationBar  (0) 2021.05.18

iOS에서 지난 10년간 히스토리로 POD은 필수가 되어 버렸다.

 

junhoha  ~/Documents/Github/takeTouch   main  pod init
 junhoha  ~/Documents/Github/takeTouch   main  pod install
Analyzing dependencies
Downloading dependencies
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `Touch.xcworkspace` for this project from now on.
Pod installation complete! There are 0 dependencies from the Podfile and 0 total pods installed.

[!] The Podfile does not contain any dependencies.

[!] Automatically assigning platform `iOS` with version `13.0` on target `Touch` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
 junhoha  ~/Documents/Github/takeTouch   main ●

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

Snapkit 실무 코드  (0) 2021.05.20
iOS용 openCV 라이브러리 나왔으면 좋겠다.  (0) 2021.05.20
List  (0) 2021.05.18
UINavigationBar  (0) 2021.05.18
오늘자 troubleshooting  (0) 2020.04.08

 

TableView 만들기 (Swift + Storyboard)

다수의 Xib가 합쳐진 것이 스토리보드(Storyboard)이므로 Objetive-C 와 완전히 동일하다. Objective-C에서와 같이 테이블 뷰를 만들고 뷰 컨트롤러에 추가한다.

 

var dataTblDong = [String]()
var dataTblTppg = [String]()
@IBOutlet weak var mDongTable: UITableView!
@IBOutlet weak var mTypeTable: UITableView!

 

중요한 것은 바뀐 코드 형식이다. 테이블 2개를 만드는 실무 코드를 살펴보자.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.mDongTable {
        return self.dataTblDong.count
    } else if tableView == self.mTypeTable {
        return self.dataTblTppg.count
    }
    return 1
}

데이터를 담을 전역 변수, 혹은 멤버 변수로 빼고 해당 변수의 개수로 리스트 항목(table rows)개수를 반환한다.

 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()

셀은 코드 내부에서 정의 할 수 있다.


UITableViewCell

UITableViewCell 클래스 원형은 다음과 같다.

open class UITableViewCell : UIView, NSCoding, UIGestureRecognizerDelegate {
.
.
.

    // These properties will always return nil when a non-nil `contentConfiguration` is set.
    @available(iOS, introduced: 3.0, deprecated: 100000, message: "Use UIListContentConfiguration instead, this property will be deprecated in a future release.")
    open var imageView: UIImageView? { get } // default is nil.  image view will be created if necessary.

    @available(iOS, introduced: 3.0, deprecated: 100000, message: "Use UIListContentConfiguration instead, this property will be deprecated in a future release.")
    open var textLabel: UILabel? { get } // default is nil.  label will be created if necessary.

    @available(iOS, introduced: 3.0, deprecated: 100000, message: "Use UIListContentConfiguration instead, this property will be deprecated in a future release.")
    open var detailTextLabel: UILabel? { get } // default is nil.  label will be created if necessary (and the current style supports a detail label).
.
.
.

기본적으로 이미지뷰, 텍스트라벨, 세부 텍스트라벨을 가지고 있다. 이에, 따로 추가 없이 텍스트를 지정할 수 있다.

 

    let obj = self.dataTblDong[indexPath.row]
     cell.textLabel?.text = obj

 

텍스트를 지정하고 셀(cell) 을 리턴(return)하면 바로 텍스트를 볼 수 있다. 셀에 다양하게 속성 적용도 가능하다. 

    cell.backgroundColor = .white
    cell.textLabel?.textColor = .darkGray
    cell.selectedBackgroundView?.backgroundColor = .red
    cell.selectedBackgroundView?.tintColor = .blue
    if cell.description != nil { }

 

TIP! : 보다 자세한 내용은 UITableViewCell에서 cmd+option+0 키를 눌러 해당 함수에 대한 빠른 도움(Quick Help)을 보는 것이다. 가장 아래 Open in Developer documentation 링크를 따라가면 Xcode 에서 바로 사용법을 확인할 수 있다.

 

테이블이 2개인 경우 if 문으로 cell 을 세팅한다.

    if tableView == self.mDongTable{
        let obj = self.dataTblDong[indexPath.row]
        cell.textLabel?.text = obj


UIButton

기본으로 제공되는 ImageView를 이용하지 않고 버튼을 삽입 하려면 이미지 사이즈 조절 extension이 필요하다. cell 내부 이미지 사이즈 조절을 위한 extension 이다.

 

extension UIImage {

    func imageResize (sizeChange:CGSize)-> UIImage{
        let hasAlpha = true
        let scale: CGFloat = 0.0 // Use scale factor of main screen

        UIGraphicsBeginImageContextWithOptions(sizeChange, !hasAlpha, scale)
        self.draw(in: CGRect(origin: CGPoint.zero, size: sizeChange))
        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        return scaledImage!
    }
}

https://stackoverflow.com/questions/24709244/how-do-set-a-width-and-height-of-an-image-in-swift

 

UIImage에 붙는 extension 이므로 사용법은 간단하다.

let imgUnChecked = UIImage(named: "hjh_icon_checkbox_none")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
let imgChecked = UIImage(named: "hjh_icon_checkbox_checked")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))



이를 활용하여 다음과 같이 이미지 세팅된 버튼을 삽입 해보자.

      let imgUnChecked = UIImage(named: "hjh_icon_checkbox_none")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        let imgChecked = UIImage(named: "hjh_icon_checkbox_checked")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        
        let btn = UIButton(frame: CGRect(x: 10, y: 10, width: 30, height: 30))
        btn.addTarget(self, action: #selector(customCellButtonTapped), for: .touchUpInside)
        
        btn.setImage(imgUnChecked, for: .normal)
        btn.setImage(imgChecked, for: .selected)
        btn.imageEdgeInsets = UIEdgeInsets(top: 1, left: 6, bottom: 5, right: 2)
        btn.tag = 0
        cell.contentView.addSubview(btn)

 

다른 테이블도 동일하게 적용 가능하다.

        
    } else if tableView == self.mTypeTable
    {
        let obj = self.dataTblTppg[indexPath.row]
        cell.textLabel?.text = obj
        let imgUnChecked = UIImage(named: "hjh_icon_checkbox_none")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        let imgChecked = UIImage(named: "hjh_icon_checkbox_checked")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        let btn = UIButton(frame: CGRect(x: 10, y: 10, width: 30, height: 30))
        btn.addTarget(self, action: #selector(customCellButtonTapped2), for: .touchUpInside)
        btn.imageView?.contentMode = .scaleAspectFit
        btn.setImage(imgUnChecked, for: .normal)
        btn.setImage(imgChecked, for: .selected)
        btn.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
        btn.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        btn.tag = 0
        cell.contentView.addSubview(btn)
    }
    return cell
}

 

TIP! : 필자의 경험상 개발 초기에 UI 관련해서는 중복 코드를 놔두는 것이 좋다. 메소드 추출(Extract Method)을 이용하여 공통 부분을 리팩토링(Refactoring) 한 이후, 개발에서 세부적이고 개별적인 수정 사항에 대해 빠른 대응이 어려워진다. 왜냐면 추출된 공통 부분에서 또 공통 모듈이 추출되기 때문이다. 협업을 하다보면, 최종적으로 하나의 기능만 하는 모듈만 따로 분리되어 재 사용성을 높히는데 의견이 모아진다. 그러나 커스텀 UI와 관련된 부분은 UI Guide Line 이 없는 경우 공통 Method 로 빼는 것을 가장 마지막에 할 작업으로 넘기는 것이 좋다. 최종 코드에서 완벽히 공통된 코드를 D&D 와 메소드로 추출 기능 한 번이면 손쉽게 리팩토링이 가능하다. 그럼에도 불구하고 앱개발 경험이 별로 없이 아키텍트라고 하는 사람들이 앱 코드 수정은 하지 않고 코드 리뷰로 일반적이고 상식적이며 뻔히 알고 있는 이야기로 개발이 된 후, 다시 지속적인 변경된 요구사항 받을 때는 결국 상품과 끝 단의 개발자만 홀로 남게 된다. 재 사용성을 높히고자 했던 많은 작업 때문에 공통 코드의 공통 코드를 따라가며 연결된 파라미터를 다시 코드로 펼치는 작업을 하는 경우가 태반이었다. 매우 아랫단(low level)의 코드를 구현 할 때는 for문을 쓰는 것과 똑같은 코드를 펼치는 작업이 CPU 파이프라인을 타는 부분도 다를 경우가 있어서 reset이 되는 문제가 있었다. Application 단에서 그런 경우를 접하거나 어셈블리 코드로 코드의 형평성을 따질 필요는 없지만 요구 사항에 기민하게 대응하는 것이라면 오히려 경험 많은 개발자의 말을 따르는 편이 좋다. 앱 개발을 안다고 해서 API가 내려 간 그 하부단 운영체제 시스템콜의 시퀀스를 모두 고려할 것이 아니라면 말이다. 요약하자면, 코드 리팩토링은 가장 마지막에 하는 것이 맞다. 시장에서도 완전히 안정화 된 상태. 관련 라이브러리나 실행 시스템의 메이저 버전업은 예상되지 않는 상태. 인수인계 직전 등 내 손에서 코드가 떠나기 전인 마지막을 말한다.

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

iOS용 openCV 라이브러리 나왔으면 좋겠다.  (0) 2021.05.20
POD  (0) 2021.05.20
UINavigationBar  (0) 2021.05.18
오늘자 troubleshooting  (0) 2020.04.08
namedtuple  (0) 2020.04.08

 

 

[기초] Overview

Apple에서 정의하는 UI Navigation Bar의 정의는 화면 최상단의 스크린을 탐색바이다. 이해 쉬운 그림은 다음(https://developer.apple.com/documentation/uikit/uinavigationbar)과 같다. 

실무에서는 Navigation Bar를 없애고 Custom 하게 구성하는 경우가 대부분 이었다. iOS를 직접 만들지 않는 이상 앱 튜닝의 끝은 순정 API라는 말처럼 iOS 업데이트에 자동으로 맞춰주고, 테마(Theme)에 따라 자동 변하는 것의 구현. 정상적인 뷰컨트롤러라이프 사이클과 신기술에 기민하게 대응하기 위해 NavigationBar를 애플에서 제공하는 기본으로 유지하는 경우가 많아졌다. 그러나 여전히 legacy code에서의 사용률은 높기 때문에 기본적 사용법과 더불어 커스터마이징 하는 방법도 살펴본다. API를 소개할 때도 네비게이션 바를 혼용해서 사용되는 프로젝트에서 동작하는 코드를 예제로 실무에서 바로 적용이 가능토록 한다.


Basics

일반적으로 Android 에서 화면 구성 단위는 Activity 이고, iOS에서는 ViewController 이다. Android 에서 startActivity로 화면을 연결한다고 하면, iOS의 경우 pushViewController로 연결한다. 주의할 점은 Activity LifeCycle이던, ViewController LifeCycle 이던 임베디드 환경인 휴대폰에서는 Resource 보존에 더 취약하다는 것이다. 화면 실행 단위별로 세팅된 변수, 메소드 리턴값들이 화면이 바뀌었을 때 100% 그대로 유지된다는 보장은 하기 힘들다. 이 점을 간과하면 앱이 죽는데 이유를 찾지 못하는 경우가 많다. 이에, 안드로이드에서는 SharedPreferences를, iOS 에서는 UserDefaults를 적극 활용한다. SQLite3 로컬 DB 로 통일하기도 하지만 복잡한 모듈에서는 속도가 매우 느린다. 이런 기초를 미리 설명하는 이유는 화면 단위를 PUSH, POP 으로 저장하는 스택(stack)이라고 해도 해당 스택에서 튀어나온(pop) 액티비티 혹은 뷰 컨트롤러가 완벽하게 모든 자원(resource)를 가지고 있을 거라는 추측은 삼가해야 한다는 점이다. 필자는 안드로이드 플랫폼만 수년 간 만들다 앱 개발로 갔을 때 하부에서는 심각하게 고민하는 Resource leak 을 단순히 폰 문제로만 단정하는 경우를 많이 보았다. 그도 그럴 것이 프레임웍은 정적 분석이 필수인데 앱의 경우 다양한 이유로 정적 분석을 하지 않기 때문이었다. 다양한 이유 중 하나는 특별히 큰 기능이 없고, 복잡한 모듈의 경우 통합 플랫폼이나 엔진이라고 불리는 컴포넌트, 라이브러리, 서비스 등의 API 덩어리에 던져 버리기 때문이다. 이에, C/C++ 시니어 프로그래머가 앱 개발로 전직할 경우 가장 안정적인 앱을 만들 수 있다는 선입견이 있다.

UX 설계

인스타그램이 나온지 10년이 넘었는데 갤럭시 패드나, 아이패드 용 앱은 아직 화면이 작다. 즉, 전혀 맞지 않는다. 그럼에도 모바일 기획자라고 하면 모든 모바일 기기에 맞춰서 개발해야 한다는 UX 설계자를 만난다. 모바일 쪽에 깊은 지식이 있는 경우가 아니라 모바일 산업이 대세가 되니 갑자기 전직한 경우, 타블렛과 휴대폰은 화면 크기와 비율이 달라 UX 자체가 바뀌는데도 똑같이 보여야 한다는 생각을 가진 사람을 만난다. 심지어 facebook도 초창기엔 Android와 iOS UI를 다르게 갔었는데 그 사용경험(UX)은 동일하게 유지하였었다. Android와 iOS 모두 각 회사만의 철학이 있다. 그러나 하이브리드 앱을 제창하며 모두 회사가 정한 같은 디자인 이어야 한다는 생각이 있는 것 같다. 그 정도의 생각이 있다면, 운영체제도 만들고 성공한 모바일 폰 개발도 직접 하면 좋겠다는 생각이 많이 든다. 휴대폰 회사에서 제공하는 기본 API로 만들어야 운영체제 자체가 업그레이드 되었을 때 바뀐 UI 컨셉으로 앱의 통일성을 유지할 수 있다. 이 몇 줄 안되는 지식을 몰라 출발점부터 어긋나는 경우가 많았다. 그리고 iOS의 경우 화면 호출 방식이 다음과 같은 stack 방식이다.

 

즉, 유저 화면 이동을 고려할 때 TREE 형태로 구성하고 화면을 노드로 하면 유저 경로 탐색은 DFS를 먼저 고려해야 한다는 것이다. 굳이 정의하지 않아도 모든 ViewController는 NavigationBar를 기본 장착하고 있기 때문에 self 예약어로 접근 가능하다.


API

Swift_커스텀 네비게이션바

처음부터 모든 앱을 만든다면 네비게이션 바 관련 코드는 애플 개발자 사이트 혹은 스택오버플로만 참고하면 된다. 그러나 이미 커스텀네비게이션 바를 사용하는 경우 새로운 ViewController를 삽입할 때는 동작 코드가 궁금해 진다. 커스텀 네비게이션 바를 쓰는 뷰에 다음과 같이 viewWillAppear, viewWillDisappear 이벤트 콜백에 각각 해당 코드를 넣어, 커스텀 네비게이션 바를 유지 해준다.

 

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.navigationController?.navigationBar.isHidden = true
}



override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        self.navigationController?.navigationBar.isHidden = false
}


기본 네비게이션바 장착한 VC

스토리보드에 새로운 뷰를 만들고 연결한 뷰 컨트롤러에서 네비게이션 바를 달기 위한 코드를 살펴본다.

우선, 네비게이션바의 숨김 속성을 false로 해야 한다. 이번에는 메소드를 이용해 보자.

self.navigationController?.setNavigationBarHidden(false, animated: true)

 

제목 내용 변경 코드는 다음과 같다.

self.navigationItem.title = "First View Title"





navigationController?.setNavigationBarHidden(false, animated: true)

 

override func viewDidLoad() {

        super.viewDidLoad()

        self.navigationController?.navigationBar.isHidden = false

}




backItemTitle Icon changing

 

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        
        let button1 = UIBarButtonItem(
            image:  imageLiteral(resourceName: "arrowThinRight"),
            style: .plain,
            target: self,
            action: #selector(self.backBtnTapped(_:))
        )
        self.navigationItem.leftBarButtonItem  = button1
    }
    
    @objc func backBtnTapped(_ sender: UIBarButtonItem) {
        self.navigationController?.popViewController(animated: true)
    }





http://minsone.github.io/programming/ios-custom-imageliteral-on-framework-bundle

imageLiteral



[실전] Obj-C_커스텀 네비게이션바

 

self.title = @"HP 점검";



    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *imgUp = [UIImage imageNamed:@"backward_arrow.png"];
    [back setBackgroundImage:imgUp forState:UIControlStateNormal];
    [back addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchUpInside];
    back.frame = CGRectMake(0, 0, imgUp.size.width, imgUp.size.height);
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithCustomView:back];
    self.navigationItem.leftBarButtonItem = cancelButton;



- (void)cancel:(id)sender
{
    [self.navigationController popViewControllerAnimated:NO];
}



'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

POD  (0) 2021.05.20
List  (0) 2021.05.18
오늘자 troubleshooting  (0) 2020.04.08
namedtuple  (0) 2020.04.08
python.c  (0) 2020.04.08

www.ftc.go.kr/www/cop/bbs/selectBoardList.do?key=202

 

Sorry Page

요청하신 페이지 또는 찾으시는 페이지가 없습니다.항상 더 나은 서비스를 제공하기 위하여 최선을 다하겠습니다.

www.ftc.go.kr

공정거래위원회에 게임 소프트웨어 개발에 대한 표준 계약서가 있네.

해당 카테고리에서 소프트웨어로 찾으면 게임용 밖에 없다.

 

fnd.io/#/us/iphone-app/1530134770-take-puzzle-by-takit-company-limited

 

fnd

Experience the App Store and iTunes Anywhere

fnd.io

https://fnd.io에서 앱을 검색한다.

 

fnd

Experience the App Store and iTunes Anywhere

fnd.io

apps.apple.com/us/app/take-puzzle/id1530134770?app=itunes&ign-mpt=uo%3D4

 

‎TAKE PUZZLE

‎It's unbelievable things that the elementary school student can play the game without any explanation about the rules of the game. Just Play for fun. It's totally free and No-Ads and will be updated forever!

apps.apple.com

그럼 이렇게 링크를 딸 수 있다.

 

또, 참고할 만한 원문:support.google.com/admob/answer/3086746?hl=ko

--> fnd.io 가 낫다.


Google Play

  1. Google Play 스토어 페이지로 이동합니다.
  2. 앱을 검색하여 앱 페이지로 이동합니다.
  3. URL을 복사합니다. Google Play URL은 다음 형식을 사용합니다.

    https://play.google.com/store/apps/details?id=

Apple App Store

  1. Apple App Store 페이지로 이동합니다. 
  2. 앱을 검색하여 앱 페이지로 이동합니다. 
  3. URL을 복사합니다. Apple App Store URL은 다음 형식을 사용합니다.

    http://apps.apple.com//app/<app–name>/id</app–name>

 

'Swift & Python 실무' 카테고리의 다른 글

Whitelabel Error Page  (0) 2022.03.29
게임도 하도급이 많나 보다.  (0) 2020.11.05
AppStore 수출 규정  (2) 2020.09.03
iOS 13 버전 대응 Push 라이브러리 패치 내용  (5) 2020.08.24
Floating Menu  (0) 2020.06.22

수출 규정 준수 정보

앱이 암호화를 사용합니까? Apple의 운영 체제에서 표준 암호화만 사용하는 경우에도 예를 선택하십시오.

 

귀하에게는 수출 규정을 준수해야 할 책임이 있으며 암호화나 면제 상태가 변경될 경우 상기 질문들을 다시 검토해야 합니다. 암호화나 면제 자격에 변동이 없을 경우 Xcode의 대상 속성 테이블에 이 옵션을 지정하십시오. 추가 정보

App Uses Non-Exempt Encryption : No

ATS를 사용하고 있거나 HTTPS를 호출하는 경우 미국 정부에 연말 자가 분류 보고서를 제출해야 합니다. 추가 정보

암호화가 포함된 제품은 수출법에 따라 정식 수출 승인을 받아야 합니다. 이를 따르지 않을 경우 심각한 불이익을 받을 수 있습니다. 추가 정보

 

EDIT INFO SETTINGS

Add export compliance keys

If your app uses encryption, you may be required to provide export compliance documentation in App Store Connect. If your build doesn’t use encryption, you specify this information in Xcode.

You upload the export compliance document and submit it for review using App Store Connect, as described in Provide export compliance documentation for encryption in App Store Connect Help. Once the document is approved, App Store Connect will provide key-value pairs that you can add to the information property list (Info.plist) in your Xcode project. App Review

If you provide the export compliance information in the build, then you don’t need to provide this information later when you distribute your app using TestFlight or submit it to the App Store.

  1. In the Project navigator (

    ), choose the target, then click Info.

  2. In the last row of the target properties table, click the Add button (+).

  3. In the search field, enter the export compliance key followed by the Return character and set its value.

    • If your app is not using encryption, add the App Uses Non-Exempt Encryption (ITSAppUsesNonExemptEncryption) key and set the value to NO.

    • If your app uses encryption, add the App Uses Non-Exempt Encryption (ITSAppUsesNonExemptEncryption) key and set the value to YES.

    • If your app requires export compliance, add the App Encryption Export Compliance Code (ITSEncryptionExportComplianceCode) key and enter the value for this key provided by App Store Connect.

 

 

www.bis.doc.gov/index.php/policy-guidance/encryption/4-reports-and-reviews/a-annual-self-classification

 

a. Annual Self-Classification

An annual self-classification report is a requirement for items exported under License Exception ENC - 740.17(b)(1), UNLESS a Commodity Classification (CCATS) has been submitted for the item. You will need a copy of Supplement No. 8 to Part 742 "Self-Class

www.bis.doc.gov

An annual self-classification report is a requirement for items exported under License Exception ENC - 740.17(b)(1), UNLESS a Commodity Classification (CCATS) has been submitted for the item.

You will need a copy of Supplement No. 8 to Part 742 "Self-Classification Report."

How to create the annual self-classification report in .CSV file format

The table in this sample annual self-classification report  provides an example of the various fields required within the Annual Self-Classification Report as required per Supp. 8 to Part 742, section (b) and demonstrates how various instructions & tips published in Supplement 8 to part 742 works out in practice.
-    First line of the annual self-classification report must consist of the following 12 entries: PRODUCT NAME, MODEL NUMBER, MANUFACTURER, ECCN, AUTHORIZATION TYPE, ITEM TYPE, SUBMITTER NAME, TELEPHONE NUMBER, E-MAIL ADDRESS, MAILING ADDRESS, NON-U.S. COMPONENTS, NON-U.S. MANUFACTURING LOCATIONS.
-    No entry may be left blank.
-    PRODUCT NAME and ECCN must be completed.
-    For MODEL NUMBER and MANUFACTURER, if necessary, enter "NONE" or "N/A".
-    For AUTHORIZATION TYPE, enter ENC or MMKT.
-    For ITEM TYPE, pick from the list of item types provided in the Supp. 8 to Part 742 (a)(6).
-    Column headers SUBMITTER NAME through NON-U.S. MANUFACTURING LOCATIONS relate to the company as a whole, and thus should be entered the same for each product (i.e., only one point of contact, one ‘YES’ or ‘NO’ answer to whether any of the reported products incorporate non-U.S. sourced encryption components, and one list of non-U.S. manufacturing locations, is required for the report). Duplicate this information into each row of the spreadsheet
-    The only permitted use of a comma is the necessary separator between the 12 entries for each line item. The only commas allowed are the ones inserted automatically during spreadsheet conversion.
-    An encryption self-classification report data table created and stored in spreadsheet format can be converted and saved into a comma delimited file (.CSV) format directly from the spreadsheet program.

모피어스 유라클 솔루션 패치중... 

 

1. Push 라이센스 관련 앱 종료 현상 안내

   가. 증상 : iOS 13 버전에서부터 Call Stack 정보가 변경되어 Push 라이센스 체크 로직중에 앱이 종료되는 현상
   나. 원인 : 프로젝트 명에 한글을 포함하고 있을 경우
   다. 조치 : 라이브러리 5.0.3 패치 

 

2. APNS Token 포멧 변경으로 인한 오류

가.  IOS 13에서 부터는 APNS TOKEN 값의 포멧이 변경

1) 기존 포멧 (iOS 12 이하)

<b955bd26 a346e0c2 1dbd8487 7e50ca09 376772c6 e2facee3 e7b39cf8 a9861eec

2) 변경 포멧 (iOS 13 이상)

{length = 32, bytes = 0x7c6c914a b13e408f 3ecab22b 5705e940 ... ae2736fd 5c07a408 }

 

나. 라이브러리 영향도 (푸시 라이브러리 5.0.2 이하 버전 )

1) Xcode10 이하 버전에서 빌드된  :  APNS TOKEN값이 기존 <> 형태와 동일

2) Xcode11 이상 버전에서 빌드한 :  iOS13 단말기에서 변경된  방식으로 값이 넘어와 기존 Push라이브러리에서는 오동작

3. 결론 (case 별 정리)

가.   Xcode10 이하 버전에서 배포한  + 기존 Push 라이브러리 (5.0.2이하) :   iOS13단말기에서 정상 동작

나. Xcode11 이상 버전에서 배포한  + 기존 Push 라이브러리 (5.0.2이하 ) :  iOS13단말기에서 오동작

다. Xcode11 이상 버전에서 배포한  +  최신 Push 라이브러리 (5.0.3이상 ) :  iOS13이하 단말기에서 정상동작

라. Xcode11 이상 버전에서 배포한  +  최신 Push 라이브러리 (5.0.3이상 ) :  iOS13단말기에서 정상동작

 

4. 조치 : 라이브러리 5.0.3 패치  

Xcode 11 이상에서 앱을 배포시에는 반드시, 최신 Push 라이브러리(5.0.3이상) 버전을 사용

 

- 계약된 회사만 배포하는지라 자료 첨부 생략 

 

--------------

최신 샘플 및 라이브러리는 아래 링크를 통해, 다운로드 받을 수 있습니다.

  • #샘플 삭제

1. 개요

Morpheus Push 는 스마트폰 OS에서 지원하는 PNS(Push Notification Server)를 기반으로 한 메세지 전송 플랫폼이다. iOS Client 에서는 UPMC WAS 에서 제공하는 Push API 를 각각 버전 규격에 맞춰 연동하여 원할하게 Push Service 를 운영하기 위한 라이브러리를 제공한다.

2. 용어

APNS

  • Apple Push Notification Service 의 줄임말.

  • Apple 에서 직접 제공하는 영구적인 보안 채널에 공급자를 연결하여 대상 장치에 알림을 보낼 수 있는 서비스.

UPMC

  • Uracle Push Message Center 의 줄임말.

  • Apple APNS 서버와 TLS 인증으로 연결된 APNS Provider 서버를 Server 대 Server 로 연계하여 구동하는 WAS(Web Application Server) 이다.

  • Receiver 라고도 불림

Service 등록

  • APNS 로 부터 Token 을 할당 받고 UPMC 로 Push 서비스를 사용하겠다고 등록하는 절차

Service 해제

  • UPMC 로 Push 서비스를 사용하지 않겠다고 등록을 삭제하는 절차

User 등록

  • UPMC 로 Push 서비스에 대한 사용자를 등록 또는 변경하는 절차

ServiceAndUser 등록

  • UPMC 로 Push 서비스 등록 및 사용자를 등록을 동시에 진행하는 절차

수신 확인

  • 메세지를 제대로 받았을 때 UPMC 로 Ack를 주는 절차

읽음 확인

  • App에서 메세지를 읽었을때 UPMC 로 Ack를 주는 절차

Application ID

  • App의 lic 파일에 포함된 application_id 값으로 앱을 구분하기 위한 코드값.

Client ID

  • 사용자로 등록할 Client 의 고유한 ID (CUID 라고도 함)

  • Email, UserID, Phone Number 또는 Device-UUID 등을 CUID 로 사용

Client Name

  • 사용자로 등록할 Client 의 이름 (CNAME 라고도 함)

  • 사용자의 이름이나 Nickname 또는 Device Name 을 CNAME 으로 사용

GROUPSEQ

– Group Sequence Number 의 준말로 User Group의 고유한 Sequence Number

PSID

– Push Service ID 의 줄임말 - Push 서비스에 대한 고유 ID - APNS에서 할당 받은 Device Token을 사용

3. Push 서비스 절차

버전별 서비스 순서

UPMC 3.5 이하 버전

토큰 요청 => User 등록 => Service 등록 => 메시지 수신

UPMC 3.6 이상 버전

Service 등록 (자동으로 Token 요청) => User 등록 => 메시지 수신

UPMC 4.0 이상 버전

Service 등록 및 사용자 등록 => 메시지 수신

DataFlow Diagram

Sequence Diagram

4. SDK 및 설정 파일

SDK 버전

  • iOS 용 SDK 파일

    • MPushLibrary.framework

      • APNS Push를 활용할 수 있는 라이브러리가 담긴 framework 파일

    • MPushLibrary.bundle

      • MPushLibrary.framework 을 사용함에 있어 필요한 resource가 담긴 bundle 파일

  • SDK 적용 방법

    • XCode Project 에 Library 와 설정 파일에 추가

      • MPushLibrary.framework

      • MPushLibrary.bundle

      • Manifest.xml

      • mcore.mobile.lic

    • 적용시 Project 내 파일이 없는 경우 Copy items if needed 선택

  • 관련 Frameworks 추가

    • XCode Project 설정 > Build Phases > Link Binary With Libraries > UserNotifications.framework 추가

    • iOS10 대응을 위해 추가되는 UserNotifications.framework 을 추가하기 위해서는 XCode 8 이상 필요

플러그인 버전

  • MPush 플러그인 파일

    • MPush.framework

      • MPushLibrary 기반으로 구현된 Morpheus Push Plugin

    • MPush.bundle

      • MPush.framework 을 사용함에 있어 필요한 resource가 담긴 bundle 파일

  • 플러그인 적용 방법

    • IDE 에서 MPush Plugin 을 업데이트 후 적용

공통 설정 파일

  • mcore.mobile.lic

    • Push 라이센스 정보가 담긴 Push 라이센스 파일

    • application_id 값을 Application ID 로 사용

    #Tue Feb 17 09:53:27 KST 2015 application_id=xxx.xxx.xxxx.xxxx expiration_date=xxxx-xx-xx mpsn=hZK................X sn=AhA....E....

    New in version 3.8.1: Library

    • 라이센스 파일을 바탕으로 생성한 Security Indexes 값으로 Push 서비스를 운용하는 중에 생성되는 사용자 또는 단말기의 식별 가능한 데이타를 암호화 하여 저장

  • Manifest.xml

    • Push 구동을 위한 설정 파일

    <manifest useDirectView="false"> ... <settings> <push> <receiver> <log>y</log> <version>x.x</version> <server>http://pushxx.morpheus.co.kr:8080/upmc</server> </receiver> </push> </settings> ... </manifest>

    • settings.push.receiver 에 대한 설정값

    KeyTypeDescription

    log

    String

    Push Service 에 대한 Debugging 로그 출력 여부 ( y / n )

    version

    String

    UPMC Version ( 3.0, 3.5, 3.6, 3.7, 3.8, 4.0 )

    server

    String

    UPMC WAS 서버 URL

5. Push Service 연동

라이브러리 버전

Case #1. Push Notification 관련 UIApplicationDelegate 를 직접 연동

#import <MPushLibrary/PushManager.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... [[PushManager defaultManager] application:application didFinishLaunchingWithOptions:launchOptions]; return YES; } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[PushManager defaultManager] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { [[PushManager defaultManager] application:application didFailToRegisterForRemoteNotificationsWithError:error]; } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { [[PushManager defaultManager] application:application didReceiveLocalNotification:notification]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [[PushManager defaultManager] application:application didReceiveRemoteNotification:userInfo]; } /* // Background 모드에서 호출하는 경우에 사용 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [[PushManager defaultManager] application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; } */ - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [[PushManager defaultManager] application:application didRegisterUserNotificationSettings:notificationSettings]; }

Case #2. <MPushLibrary/AppDelegate+PushManager.h> 로 바로 연동

#import <MPushLibrary/PushManager.h> #import <MPushLibrary/AppDelegate+PushManager.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... [[PushManager defaultManager] application:application didFinishLaunchingWithOptions:launchOptions]; return YES; }

플러그인 버전

Case #1 - Push Notification 관련 UIApplicationDelegate 를 직접 연동

#import <MPush/PushManager.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... [[PushManager defaultManager] application:application didFinishLaunchingWithOptions:launchOptions]; return YES; } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[PushManager defaultManager] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { [[PushManager defaultManager] application:application didFailToRegisterForRemoteNotificationsWithError:error]; } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { [[PushManager defaultManager] application:application didReceiveLocalNotification:notification]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [[PushManager defaultManager] application:application didReceiveRemoteNotification:userInfo]; } /* // Background 모드에서 호출하는 경우에 사용 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [[PushManager defaultManager] application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; } */ - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [[PushManager defaultManager] application:application didRegisterUserNotificationSettings:notificationSettings]; }

Case #2 - <MPush/AppDelegate+PushManager.h> 로 바로 연동

#import <MPush/PushManager.h> #import <MPush/AppDelegate+PushManager.h> - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... [[PushManager defaultManager] application:application didFinishLaunchingWithOptions:launchOptions]; return YES; }

6. Push APIs

Initialize with delegate

[[PushManager defaultManager] initializeWithDelegate:delegate]

  • Push Manager 를 시작하면서 delegate(대리자) 을 등록

  • 등록된 delegate 을 통해 message 수신 등 push 와 괸련된 business logic controller 역활을 대행

  • delegate 이 등록되지 않으면 앱이 시작되면서 전달받은 push message 들은 자동으로 지연 전달됨

Changed in version 3.6.4.

Parameters

  • delegate (id<PushManagerDelegate>) – delegate 값, NotNull

Register Service

[[PushManager defaultManager] registerService:activity completionHandler:^(BOOL success) {}];

  • Token 을 자동 요청하고 서비스 등록

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • token (NSString) – token string 값, NotNull

  • completionHandler (BlockHandler) – Service 등록 완료 후 호출, Nullable

[[PushManager defaultManager] registerService:activity token:@"TOKEN-STRING" completionHandler:^(BOOL success) {}];

  • 직접 Token 값을 전달하여 서비스 등록

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • token (NSString) – token string 값, NotNull

  • completionHandler (BlockHandler) – Service 등록 완료 후 호출, Nullable

  • activity 가 UIViewController 가 아닌 경우 (id) 로 casting 하여 전달

[[PushManager defaultManager] registerService:(id)activity completionHandler:^(BOOL success) {}];

Register User

[[PushManager defaultManager] registerUser:activity, clientUID:@"CUID" clientName:@"CNAME" completionHandler:^(BOOL success) {}];

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • clientUID (NSString) – Client ID 값, NotNull

  • clientName (NSString) – Client Name 값, NotNull

  • completionHandler (BlockHandler) – User 등록 완료 후 호출, Nullable

Register Service and User

[[PushManager defaultManager] registerServiceAndUser:activity, clientUID:@"CUID" clientName:@"CNAME" completionHandler:^(BOOL success) {}];

Changed in version 4.0.0.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • clientUID (NSString) – Client ID 값, NotNull

  • clientName (NSString) – Client Name 값, NotNull

  • completionHandler (BlockHandler) – User 등록 완료 후 호출, Nullable

Unregister Service

[[PushManager defaultManager] unregisterService:activity completionHandler:^(BOOL success) {}];

  • 서비스 해제

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • completionHandler (BlockHandler) – Service 해제 완료 후 호출, Nullable

Register Group

[[PushManager defaultManager] registerGroup:activity groupSequenceNumber:@"GROUP-NUMBER" completionHandler:^(BOOL success) {}];

  • 현재 등록된 User 를 Group 에 등록

  • 서버에 등록된 Group Sequence Number 값을 알고 있어야 등록 가능

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • groupSequenceNumber (NSString) – Group Sequence Number 값, NotNull

  • completionHandler (BlockHandler) – Group 등록 완료 후 호출, Nullable

Unregister Group

[[PushManager defaultManager] unregisterGroup:activity groupSequenceNumber:@"GROUP-NUMBER" completionHandler:^(BOOL success) {}];

  • 현재 등록된 User 를 Group 에서 해제

  • 서버에 등록된 Group Sequence Number 값을 알고 있어야 해제 가능

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • groupSequenceNumber (NSString) – Group Sequence Number 값, NotNull

  • completionHandler (BlockHandler) – Group 해제 완료 후 호출, Nullable

Send Message

[[PushManager defaultManager] send:activity clientUID:@"CUID" message:@"PUSH-MESSAGE" serviceCode:@"SERVICE-CODE" ext:@"EXT-DATA-JSON-STRING" completionHandler:^(BOOL success) {}];

  • 앱에서 직접 Remote Push 발송 요청

  • ServiceCode 는 서버에 미리 등록 후 발송

Changed in version 3.6.4.

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • clientUID (NSString) – Client ID 값, NotNull

  • message (NSString) – 발송할 Push Message, NotNull

  • serviceCode (NSString) – 발송 Service Code, NotNull

  • ext (NSString) – 확장 데이타로 발송할 String 으로 변환된 JSON 데이타를 전달, NotNull

  • completionHandler (BlockHandler) – Group 해제 완료 후 호출, Nullable

Read Message

[[PushManager defaultManager] read:activity messageUniqueKey:@"MESSAGE-UNIQUE-KEY" seqNo:@"SEQUENCE-NUMBER" completionHandler:^(BOOL success) {}];

  • 읽음 확인 발송

  • payload 에 전달된 messageuniquekey 값과 seqno 값을 추출하여 전달

  • payload 에 messageuniquekey 은 Receiver 3.5 버전 이하에서만 전달됨

Deprecated since version 3.6: Receiver

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • messageUniqueKey (NSString) – Message Unique Key 값, NotNull

  • seqNo (NSString) – Sequence Number 값, NotNull

  • completionHandler (BlockHandler) – 읽음 확인 발송 완료 후 호출, Nullable

[[PushManager defaultManager] read:activity notification:userInfo completionHandler:^(BOOL success) {}];

  • 읽음 확인 발송

  • didReceiveRemoteNotification: 로 전달된 userInfo 를 그대로 전달

New in version 3.6: UPMC

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • userInfo (NSDictionary) – 수신된 Notification 데이타, NotNull

  • completionHandler (BlockHandler) – 읽음 확인 발송 완료 후 호출, Nullable

Read Message for Enterprise

PushManagerBadgeOption

ConstantDescription

PushManagerBadgeOptionKeep

서버에서 관리되는 counting 하나 줄여 count 를 유지시킴

PushManagerBadgeOptionReset

서버에서 관리되는 counting 을 0으로 reset

PushManagerBadgeOptionUpdate

서버에서 관리되는 counting 을 특정 count 로 업데이트

PushManagerBadgeOptionForce

서버에서 관리되는 counting 을 Update API 를 통해 특정 count 로 업데이트

[[PushManager defaultManager] read:activity notification:userInfo badgeOption:PushManagerBadgeOption completionHandler:^(BOOL success) {}];

  • 엔터프라이즈 버전에서 읽음 확인 발송

  • badge 정책을 badge option 으로 전달

New in version 4.0EE: UPMC

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • userInfo (NSDictionary) – 수신된 Notification 데이타, NotNull

  • badgeOption (PushManagerBadgeOption) – 수신된 Notification 데이타, NotNull

  • completionHandler (BlockHandler) – 읽음 확인 발송 완료 후 호출, Nullable

Example:

[[PushManager defaultManager] read:activity notification:userInfo badgeOption:PushManagerBadgeOptionKeep completionHandler:^(BOOL success) { }]; or [[PushManager defaultManager] read:activity notification:userInfo badgeOption:PushManagerBadgeOptionReset completionHandler:^(BOOL success) { }];

[[PushManager defaultManager] read:activity notification:userInfo badgeOption:badgeOption badge:badge completionHandler:^(BOOL success) {}];

  • 엔터프라이즈 버전에서 읽음 확인 발송

  • 읽음 확인에 대한 counting 을 특정 badge 값으로 업데이트

  • 최소 1이상, 최대 1000 값

New in version 4.0EE: UPMC

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • userInfo (NSDictionary) – 수신된 Notification 데이타, NotNull

  • badgeOption (PushManagerBadgeOption) – 수신된 Notification 데이타, NotNull

  • badge (NSNumber) – 업데이트할 counting 값, 1-1000

  • completionHandler (BlockHandler) – 읽음 확인 발송 완료 후 호출, Nullable

Example:

[[PushManager defaultManager] read:activity notification:userInfo badgeOption:PushManagerBadgeOptionUpdate badge:@(10) completionHandler:^(BOOL success) { }];

- (void)update:(UIViewController *)activity badge:(NSNumber *)badge completionHandler:(PushManagerNetworkCompletionHandler)handler

  • 읽음 확인에 대한 counting 을 강제로 특정 badge 값으로 업데이트

  • 최소 1이상, 최대 1000 값

New in version 4.0EE: UPMC

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • badge (NSNumber) – 업데이트할 counting 값, 1-1000

  • completionHandler (BlockHandler) – 읽음 확인 발송 완료 후 호출, Nullable

Example:

[[PushManager defaultManager] update:self badge:@(3) completionHandler:^(BOOL success) { }];

7. PushManager Delegate

PushStatus

Push Message 가 발송된 상태값

ConstantDescription

START

Push Message 로 앱을 시작한 경우

ACTIVE

Application Forground Status 에서 Push Message 를 받은 경우

BACKGROUND

Application Background Status 에서 Push Message 가 전달된 경우

Delegate 설정

Push Message 수신을 대행하는 대리자를 등록

- (void)initilaizeWithDelegate:(id <PushManagerDelegate>)delegate {}Parameters

  • delegate (PushManagerDelegate) – PushManager 의 역활을 대행할 대리자 등록

Example:

[[PushManager defaultManager] initializeWithDelegate:self];

Push Message 수신 처리

- (void)manager:(PushManager *)manager didReceiveRemoteNotification:(NSDictionary *)userInfo status:(NSString *)status {}

Deprecated since version 3.7.4: Library

Parameters

  • manager (PushManager) – PushManager Instance, NotNull

  • userInfo (NSDictionary) – 수신된 Notification 데이타, NotNull

  • status (PushStatus) – 수신된 Notification 의 상태, NotNull

- (void)manager:(PushManager *)manager didReceiveUserNotification:(NSDictionary *)userInfostatus:(NSString *)status messageUID:(NSString *)messageUID {}

New in version 3.7.4: Library

Parameters

  • manager (PushManager) – PushManager Instance, NotNull

  • userInfo (NSDictionary) – 수신된 Notification 데이타, NotNull

  • status (PushStatus) – 수신된 Notification 의 상태, NotNull

  • messageUUID (NSString) – 앱에서 부여한 수신된 메세지의 고유 ID, NotNull

Example:

- (void)manager:(PushManager *)manager didReceiveUserNotification:(NSDictionary *)userInfo status:(NSString *)status messageUID:(NSString *)messageUID { PushManager *manager = [PushManager defaultManager]; NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; if ( [apsInfo objectForKey:@"badge"] ) { NSNumber *badge = [apsInfo objectForKey:@"badge"]; // 뱃지 숫자 변경 manager.notificationCenter.badgeNumber = badge; // 뱃지 숫자 초기화 manager.notificationCenter.badgeNumber = [NSNumber numberWithInteger:0]; } // 읽음 확인 [manager read:self notification:notification.userInfo completionHandler:^(BOOL success) { NSString *message = ( ! success ) ? @"Confirming Read-Message is FAIL !!" : @"Confirming Read-Message is SUCCESS !!"; NSLog( @"%@", message ); }]; // 알림 메세지 NSString *title = [NSString stringWithFormat:@"PUSH (%@)", status]; NSString *message = [apsInfo objectForKey:@"alert"]; if ( NSClassFromString(@"UIAlertController") ) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"취소" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { }]]; [alert addAction:[UIAlertAction actionWithTitle:@"확인" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]]; UIViewController *viewController = [[UIApplication sharedApplication] keyWindow].rootViewController; if ( viewController.presentedViewController ) { viewController = viewController.presentedViewController; } [viewController presentViewController:alert animated:YES completion:^{ }]; } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"취소" otherButtonTitles:@"확인", nil]; [alert show]; } }

8. APNS Push Payload

UPMC 에서 APNS 로 발송되는 Payload JSON 형태

APNS Payload Keys (APN)

APNS 로 보내지는 JSON dictionary object 에 기본적으로 정의되는 aps 대한 키값 정의

KeyValue TypeDescription

alert

String

Push Message 내용

badge

Number

앱 아이콘에 Badge 표시, 값이 정의되지 않으면 변경되지 않음

sound

String

Library/Sounds 폴더에 있는 파일명을 정의하면 알림시 Sound 와 함께 알림. 값이 정의되지 않으면 default 로 처리

UPMC Payload Keys (MPS)

APNS 로 보내지는 JSON dictionary object 에 UPMC에서 추가정의되는 mps 대한 키값 정의

KeyValue TypeDescription

appid

String

발송 타겟의 Application ID 

sender

String

발송 주체 ( admin, device-android, device-ios )

seqno

Number

DB 처리되고 있는

ext

String

확장 데이타, 보통 JSON String 형태로 전달. 만약 데이타가 대용량(Rich)인 경우 서버에서 데이타를 HTML형태로 생성하여 해당 URL을 전달

senddate

String

발송된 시간

messageuniquekey

String

발송된 메세지의 고유키

db_in

String

DB Insert 여부 (“Y” or “N”)

pushkey

String

발송 대상에 대한 고유 키, 4.0EE 버전에서 출력

History:

  • 3.6 : senddate 추가

  • 3.7 : messageuniquekey 제외, db_in 추가

Example:

  • Simple Data Push

{ "aps": { "alert": "", "badge": 1, "sound": "alert.aif" }, "mps": { "appid": "com.uracle.push.test", "seqno": "104", "sender": "admin", "senddate": "2016041417", "db_in": "N", "ext": "", "pushkey": "2b9256f6f959240f4dc5ea2f7ed4095ca693884d" } }

  • Rich Data Push

{ "aps": { "alert": "", "badge": 1, "sound": "alert.aif" }, "mps": { "appid": "com.uracle.push.test", "seqno": "387", "sender": "admin", "senddate": "2016041417", "db_in": "N", "ext": "http://domain.com:8080/resources/totalInfo/0414172200_msp.html", "pushkey": "2b9256f6f959240f4dc5ea2f7ed4095ca693884d" } }

9. APNS 인증서 발급시 주의사항

"1. 인증서가 만료(폐기)되었거나 발급받는 도중에 오류가 있으면, 처음부터 다시 발급받아볼 것" "2. java apns 라이브러리와 맞는 jdk를 사용 할 것(서버 실행시 java7을 사용하지말고 java6을 사용해볼 것)" "3. p12 파일을 생성할 때 인증서 1개만 내보내기로 생성할 것"

10. MUTABLE-CONTENT 수신확인 (iOS10 이상)

  • 앱이 Background 또는 종료 상태일 경우에 Push Message가 mutable-content:1 타입으로 올 경우 Notification Service Extention에서 메시지를 우선 처리할수 있다.

  • iOS10 미만 단말기에서는 기존과 동일하게 처리.

Notification Service Extention

  1. File -> New -> Target 선택
  2. Notification Service Extention 선택
  3. Product Name을 자유롭게 설정
  4. Activate를 선택하면 Notification Service Extention Target 항목이 추가
  5. 추가된 NotificationService.m 파일에 Push 관련 처리

NotificationService.m 파일에서의 수신확인

  1. Push 관련 라이브러리 파일들 Target Membership에 NotificationService 타켓 추가

  2. #import <MPushLibrary/MPushLibrary.h> 추가

  3. didReceiveNotificationRequest 메서드 내에 feedback 메서드 추가

Example:

// NotificationService 쪽에서 메시지 수신시 들어오는 이벤트 - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; //PushManager 초기화 PushManager *manager = [PushManager defaultManager]; //Keychain Sharing을 통해 feedback시 필요한 정보를 획득 //키체인 공유 외에도 앱그룹등을 통한 방법으로도 공유가 가능 (app과 extension 사이에 데이터 공유) NSString *app_identifier = [NSString stringWithFormat:@"%@.pushDic", @"com.uracle.push.demo.NotificationService"]; NSDictionary *pushDic = [KeychainController loadValueForKey:app_identifier forAccessGroup:@"com.uracle.push.demo.NotificationService"]; //관련정보가 없을 경우에는 feedback처리 없이 완료 if(pushDic == nil) { self.contentHandler(self.bestAttemptContent); return; } else { //데이터 공유시의 값의 정보 출처 샘플 //[pushDic setObject:[PushManager defaultManager].info.clientUID forKey:@"cuid"]; //[pushDic setObject:[PushManager defaultManager].info.pushServiceID forKey:@"psid"]; //[pushDic setObject:[PushManager defaultManager].info.host forKey:@"host"]; NSString *cuid = [pushDic objectForKey:@"cuid"]; NSString *psid = [pushDic objectForKey:@"psid"]; NSString *host = [pushDic objectForKey:@"host"]; if(host) { //서버 호스트 정보를 셋팅 [manager.info changeHost:host]; } if(cuid && psid) { //feedback API 호출 //push메시지 객체와 cuid, psid값이 필요 [manager feedback:self notification:self.bestAttemptContent.userInfo clientUID:cuid psID:psid completionHandler:^(BOOL success) { //앱에서 중복으로 feedback처리를 하지 않도록 메시지 객체에 feedback 정보에 대한 값을 셋팅후 전달 NSMutableDictionary *userInfo = [self.bestAttemptContent.userInfo mutableCopy]; [userInfo setObject:@"true" forKey:@"feedback"]; self.bestAttemptContent.userInfo = userInfo; self.contentHandler(self.bestAttemptContent); }]; } else { self.contentHandler(self.bestAttemptContent); } } }

11. Marketing Push API

  • Manifest.xml

    • Manifest.xml 에 umpc 정보를 추가한다

    <manifest useDirectView="false"> ... <settings> <push> <umpc> <!-- umpc 서버 정보 --> <server></server> <!-- 타임아웃 정보 --> <timeout>30000</timeout> </umpc> </push> </settings> ... </manifest>

Update Session

[[PushManager defaultManager] updateSession:activity cuid:@"CUID" completionHandler:^(BOOL success, NSDictionary *body) {}];

  • 세션 업데이트

  • ClientID 값을 추출하여 전달

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • cuid (NSString) – ClientID 값, NotNull

  • completionHandler (BlockHandler) – 세션 업데이트 발송 완료 후 호출, Nullable

Example:

[[PushManager defaultManager] updateSession:activity cuid:[PushManager defaultManager].info.clientUID completionHandler:^(BOOL success, NSDictionary *body) { }];

Update Purchase

[[PushManager defaultManager] updatePurchase:activity id:"CAMPAIGN-ID" cuid:@"CUID" completionHandler:^(BOOL success, NSDictionary *body) {}];

  • 구매 이력 업데이트

  • payload 에 전달된 Campaign 값을 추출하여 전달

  • ClientID 값을 추출하여 전달

Parameters

  • activity (UIViewController) – 호출하는 화면 전달, NotNull

  • id (NSString) – Campaign ID 값, NotNull

  • cuid (NSString) – ClientID 값, NotNull

  • completionHandler (BlockHandler) – 구매 이력 업데이트 발송 완료 후 호출, Nullable

Example:

[[PushManager defaultManager] updatePurchase:activity id:@"730" cuid:[PushManager defaultManager].info.clientUID completionHandler:^(BOOL success, NSDictionary *body) { }];

'Swift & Python 실무' 카테고리의 다른 글

아이가 그린 그림으로 앱을 하나 올렸다.  (1) 2020.11.03
AppStore 수출 규정  (2) 2020.09.03
Floating Menu  (0) 2020.06.22
마지막 오늘의 무료 앱  (0) 2019.04.01
앱스토어 무료 앱 31일  (0) 2019.03.31

https://github.com/tinymind/LSFloatingActionMenu

 

tinymind/LSFloatingActionMenu

LSFloatingActionMenu is floating action button component of material design for iOS. - tinymind/LSFloatingActionMenu

github.com

 

      [self showMenuFromButton:sender withDirection:LSFloatingActionMenuDirectionUp position:location];

 

Adding location field.

 

Add a flag to open once when The screen is clicked.

 

@property (nonatomic, assign) BOOL singTap2OpenFloatingMenu;

 

-(void)tapDetected:(UITapGestureRecognizer *)sender{

.

.

.

    if(_singTap2OpenFloatingMenu) {

        [self showMenuFromButton:sender withDirection:LSFloatingActionMenuDirectionUp position:location];

        _singTap2OpenFloatingMenu = false;

    }

 

Making a button to be disabled.

To add logs.

 

    } closeHandler:^{

        [self.actionMenu removeFromSuperview];

        self.actionMenu = nil;

//        button.hidden = NO;

        NSLog(@"menu is closed");

    }];

 

calculating the position to the point of touch.

 

self.actionMenu.startPoint = position; //button.center;

        NSLog(@"position %f %f", position.x, position.y);

    

Adding a menu on the image.

 

//    [self.view addSubview:self.actionMenu];

    [myImage addSubview:self.actionMenu];

 

LSFloatingActionMenu-master.zip
0.26MB

 

    self.actionMenu = [[LSFloatingActionMenu alloc] initWithFrame:self.view.bounds direction:direction menuItems:menus menuHandler:^(LSFloatingActionMenuItem *item, NSUInteger index) {

       

    NSLog(@"Click at index %d", (int)index);

 

whoops!

only the self.view is able to get the index.

 

'Swift & Python 실무' 카테고리의 다른 글

AppStore 수출 규정  (2) 2020.09.03
iOS 13 버전 대응 Push 라이브러리 패치 내용  (5) 2020.08.24
마지막 오늘의 무료 앱  (0) 2019.04.01
앱스토어 무료 앱 31일  (0) 2019.03.31
앱스토어 무료 앱 30일  (0) 2019.03.31

오늘자 troubleshooting

byHAJUNHOJul 17. 2018

관련 강의가 있어 우선, 환경 세팅을 진행하였다. VMWARE에 UBUNTU 18.04 설치.

같은 컴퓨터에서 20명 우분투 환경 설정하는데 버그가 이렇게 다양하게 나오는지 황당했다.

 

VTx Enabling 문제

-> hp elite 8300은 특이하게 Security -> System Security에 해당 옵션이 들어 있어서 황당. 보통은 CPU 혹은 system 의 Advanced Setting에 들어있는데 말이다. 본디 가상화 메뉴가 바이오스 버전인 줄 알고 2013 버전 바이오스를 2018 버전으로 업데이트까지 했었음 ㅠㅠ

 

네트워크가 막힌 상태에서 VMWARE player 14 설치가 안 되는 버그

-> 14 버전에서 설치 시 네트워크로 뭘 체크하나 봄. vmware player 12 버전으로 해결

 

ubuntu 18.04에서 lock 파일로 apt 동작 안 하는 문제

-> 백그라운드에서 자주 쓰나? lock파일 삭제(캐시 폴더에서도 삭제)로 해결

 

네트워크 연결 후 apt-get 실행 시 모두 같은 환경인데 몇몇만 실행 안 되는 문제

-> 동일 IP에서 너무 많은 요청이라 막는 듯. /etc/apt/sources.list에서 us.ubuntu블라블라를 kr.ubuntu로 모두 수정하여 해결

 

build-essential 설치를 못하는 문제 및 기타

-> 리눅스의 bash shell이 어색한 친구들 문제. history 보고 하나씩 해결

 

모두 LOG가 남는 문제라 쉬운 troubleshooting.

 

LOG 남겨

아래 명령어는 알아두자~

https://www.tecmint.com/useful-basic-commands-of-apt-get-and-apt-cache-for-package-management/ 

25 Useful Basic Commands of APT-GET and APT-CACHE for Package Management

www.tecmint.com

 

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

List  (0) 2021.05.18
UINavigationBar  (0) 2021.05.18
namedtuple  (0) 2020.04.08
python.c  (0) 2020.04.08
decision science - 2  (0) 2020.04.08

from collections import namedtuple
# or
import collections

param4tuple = ['name', 'age', 'sex', 'address', 'phoneNumber']
personcardskim = namedtuple('whatever1', param4tuple, defaults=(None,) * len(param4tuple))
person001 = personcardskim('Eddie')
print('person001 =', person001)

personcardskim2 = namedtuple('whatever2', 'name age sex address phoneNumber')
person002 = personcardskim2('joe', '34', 'male', 'korea', '01022223333')

print('person002 =',  person002)

difficultTuple = namedtuple('whatever3', ['name', 'age', 'sex'])
person003 = difficultTuple('helloman', '18', 'male')
print('person003 = ', person003)

importTuple = collections.namedtuple('whatever4', 'name age sex', defaults=(None,) * 3)
person004 = importTuple('haha')
print('person004 = ', person004)

 

 

 

 


 

person001.name

Out[3]: 'Eddie'

person002.name

Out[4]: 'joe'

person003.name

Out[5]: 'helloman'

person004.name

Out[6]: 'haha'

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

UINavigationBar  (0) 2021.05.18
오늘자 troubleshooting  (0) 2020.04.08
python.c  (0) 2020.04.08
decision science - 2  (0) 2020.04.08
지금 최고의 AI 스피커는?  (0) 2020.04.08

파이썬 답다.

 

/* Minimal main program -- everything is loaded from the library */

 

#include "Python.h"

 

extern DL_EXPORT(int) Py_Main(intchar **);

 

int

main(int argc, char **argv)

{

 return Py_Main(argc, argv);

}

 

 

 

헤더는

 

#ifndef Py_PYTHON_H

#define Py_PYTHON_H

/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */

 

 

/* Enable compiler features; switching on C lib defines doesn't work

   here, because the symbols haven't necessarily been defined yet. */

#ifndef _GNU_SOURCE

# define _GNU_SOURCE1

#endif

 

/* Forcing SUSv2 compatibility still produces problems on some

   platforms, True64 and SGI IRIX begin two of them, so for now the

   define is switched off. */

#if 0

#ifndef _XOPEN_SOURCE

# define _XOPEN_SOURCE500

#endif

#endif

 

/* Include nearly all Python header files */

 

#include "patchlevel.h"

#include "config.h"

 

#ifdef HAVE_LIMITS_H

#include <limits.h>

#endif

 

/* config.h may or may not define DL_IMPORT */

#ifndef DL_IMPORT/* declarations for DLL import/export */

#define DL_IMPORT(RTYPE) RTYPE

#endif

#ifndef DL_EXPORT/* declarations for DLL import/export */

#define DL_EXPORT(RTYPE) RTYPE

#endif

 

#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE)

#define _SGI_MP_SOURCE

#endif

 

#include <stdio.h>

#ifndef NULL

#   error "Python.h requires that stdio.h define NULL."

#endif

 

#include <string.h>

#include <errno.h>

#ifdef HAVE_STDLIB_H

#include <stdlib.h>

#endif

#include <assert.h>

 

#include "pyport.h"

 

#include "pymem.h"

 

#include "object.h"

#include "objimpl.h"

 

#include "pydebug.h"

 

#include "unicodeobject.h"

#include "intobject.h"

#include "longobject.h"

#include "floatobject.h"

#ifndef WITHOUT_COMPLEX

#include "complexobject.h"

#endif

#include "rangeobject.h"

#include "stringobject.h"

#include "bufferobject.h"

#include "tupleobject.h"

#include "listobject.h"

#include "dictobject.h"

#include "methodobject.h"

#include "moduleobject.h"

#include "funcobject.h"

#include "classobject.h"

#include "fileobject.h"

#include "cobject.h"

#include "traceback.h"

#include "sliceobject.h"

 

#include "codecs.h"

#include "pyerrors.h"

 

#include "pystate.h"

 

#include "modsupport.h"

#include "ceval.h"

#include "pythonrun.h"

#include "sysmodule.h"

#include "intrcheck.h"

#include "import.h"

 

#include "abstract.h"

 

#define PyArg_GetInt(v, a)PyArg_Parse((v), "i", (a))

#define PyArg_NoArgs(v)PyArg_Parse(v, "")

 

/* Convert a possibly signed character to a nonnegative int */

/* XXX This assumes characters are 8 bits wide */

#ifdef __CHAR_UNSIGNED__

#define Py_CHARMASK(c)(c)

#else

#define Py_CHARMASK(c)((c) & 0xff)

#endif

 

#include "pyfpe.h"

 

/* These definitions must match corresponding definitions in graminit.h.

   There's code in compile.c that checks that they are the same. */

#define Py_single_input 256

#define Py_file_input 257

#define Py_eval_input 258

 

#ifdef HAVE_PTH

/* GNU pth user-space thread support */

#include <pth.h>

#endif

#endif /* !Py_PYTHON_H */

 

python은 C로 만들어 졌다.

 

 

https://www.python.org/downloads/source/

Python Source Releases for Source release

The official home of the Python Programming Language

www.python.org

 

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

오늘자 troubleshooting  (0) 2020.04.08
namedtuple  (0) 2020.04.08
decision science - 2  (0) 2020.04.08
지금 최고의 AI 스피커는?  (0) 2020.04.08
ML 학습 결과는 늘 같을까?  (0) 2020.04.08

 

 

통계 6 시그마 AHP 시뮬레이션... 뭘 과학적으로 분석한다는 도구는 참 많다. 인공지능도 그중 하나고.

 

이 매거진 처음에 쓴 글에서 가장 중요한 고려 인자는 햇볕을 좋아하는 x이고 100차원이던 200차원이던 그 x가 최상단에 위치하고 앞에 붙는 계수(가중치)에 관계없이 결정에 가장 큰 비중을 차지하는 거대한 고려 사항임에도 틀림이 없을 것이다. 그리고 그 상황은 데이터 전 처리하는 사람은 모르고 넘어갈 가능성이 크고 그냥 raw 데이터만으로 컴퓨터에게 돌려도 센서 데이터가 없어서 이미 누락되어 틀린 상태로 머신 러닝이 시작될 가능성이 크다.

 

그래서 이 매거진을 만들었다.

 

좀 더 쉽게 말하면,

 

인간은 분석될 만큼 단순하지가 않다는 뜻이다. 아마 300년 뒤에는 가능 할런지도 모른다. 그것도 모든 학문과 언어에 통달한 단 1명의 인간이 나와서 인공지능 평가 방법을 만들어 둔다는 가정하에.

 

얼마 안 되는 아르바이트비 가지고, 월급 몇 푼 가지고, 퇴직금 가지고, 사람 조정하려는 사람.

 

일전에 최저 시급 올라서 직원을 다 자를 수밖에 없었고, 죽음까지 결심했다는 사람이 SNS에 글을 올렸을 때 감성팔이 느낌이 나서 싫었다. 최저 시급도 못 줄 만큼 능력 없는 사람이 사업을 하는 것이라면, 당연히 그동안 아르바이트비 쥐어 짜내서 연명했을 것이라는 게 내 논리고, 그런 사람은 사업하지 말고 최저 시급 줄 수 있는 사람 밑에 들어가서 일해야 한다는 생각이다. 그리고 당장은 최저 시급을 불법으로 못 주더라도 따로 남아 있을 만한 대화가 가능한 종업원, 그런 커뮤니케이션이 가능할 정도로 정말 가족같이 생각한 사장이라면 아닌 사장이 다 망해서 경쟁이 줄어 곧 사정이 나아질 만큼 기다릴 수 있을 거라는 생각이다. 간단히 그냥 "가족"과 일한다고 생각하면 이해 쉬운 이야기. 그러나 "함께 일한다"가 아니라 "남의 밑에 들어간다는 생각"을 가진 만큼 사장과 일하는 사람을 나누는 인간 무리가 아예 이 사회에서 뿌리 뽑혀야 한다는 생각이었다. 최저 시급이 크게 오른 지 얼마 안 되었고 사람들의 원성이 자자했던 터라 내가 털릴 수도 있는 입장이었지만, 난 정말 시급 1700원에도 일해 봤었고 그렇게 한 달을 모아봤자 R차(바이크) 3번 빌리면 끝이었다.(그때 오토바이 너무 좋아했기에...) 지금은 어떨 땐 한 달 번 돈으로도 그때 빌리던 R차 3대를 살 수 도 있지만 그때 내 생활은 정말 라면이 전부였다.

 

https://www.youtube.com/channel/UCwx6n_4OcLgzAGdty0RWCoA

워크맨-Workman

��워크맨 인력소 상암점�� � NOW On-Air � [워크맨] 매주 금 오후 6시 ❤꿀잼영상 상시대기❤업계 최고 재미 보장❤ ✔청소.인력.식당.요리.철거.공장.물류 ✔그 외 모든 job것들 ✔200% 부려먹기 가능 ❌장난사절❌ ☎상세 비즈니스 문의☎ lululala.ad@jtb...

www.youtube.com

 

워크맨이라는 youtube가 있다. 정말 많은 일을 소개해 주는데 최저 시급만 주는 일도 많다. 법으로 정해 놓지 않았다면 무조건 그 밑으로 줬을 거라는 생각이다. 내 주변에도 사업하는 사람이 많아서 내가 이렇게 적어 두면 나중에 멀어질 사람들이 있다. 안타깝지만. 정말 최저의 생활을 조금이라도 경험해 본 사람이라면. 지금부터 내가 하는 말을 잘 들었으면 한다.

 

내 어머니는 평생 힘든 일만 하고 사셨고 지금도 그러시다. 최저 시급 도입되고 사람 많이 잘라내어서 힘든 일 하시는데 더 힘들어지셨다. 그리고 뽑는 사람들도 불법적으로 최저 시급 안 줄 수 있는 불법 체류 외국인들 뿐이라 말도 안 통해서 더 힘들어지셨다. 저번 달에도 150 정도 부쳐 드리긴 했지만 나도 월급쟁이고 아이를 키우고 있는 입장이라 나 역시 힘들다. 그러나 최근 구하신 직장에서 그나마 먹고살 수 있는 돈을 받으셨다.

 

어머니께서 현 정부 욕할 때에도 난 반박했다. 그렇다고 문재인이 알아 달라는 것은 아니다. 난 일단 바른말한다. 그게 어머니께서 내가 가르쳐 주신 부분이고 내 기억력이 이 나이가 되어도 좋다는 이야기를 듣는 것은 현실과 타협하며 끊임없이 자신을 속이지 않았기 때문이라는 믿음 때문이다. 그래서 그나마 선방하면서 살아갈 수 있다. 그리고 어머니를 단 한 번도 부끄럽다고 생각해 본 적이 없고 숨길 것도 없기에 내 모든 이야기들은 SNS에 늘 올리고는 했다. 어머니와 유튜브 찍기도 했고. 그만큼 남의 삶도 함부로 이야기하지 않는다. 그래서 이 글에 쓸 수 있다.

 

밤샘 개발하다 보면 밤에 나와 밤새도록 청소하시고 아침에 퇴근하시는 아주머니를 본다. 기업에 아무리 오래 일해도 못 만날 분들이다. 그분들이 몇 개월마다 교대를 하고 어떤 어려움이 있는지 대화 한 번 나눠볼 사람은 기업에 일하는 사람 중에도 몇 없다. 그러나 기업의 대표는 뭐 온갖 어려움 겪고 스트레스받는 것처럼 해서 나중에 큰돈 들어왔을 때 자기 몫은 95% 나머지 모두는 5%로만 해도 크게 생각한다.

 

당신들 없으면 오뚝이 회장 같은 사람이 경쟁 안 하고 독점해서 더 좋은 세상을 만들어도 된다. 그래서 난 한편으로는 사회주의 공산주의를 옹호한다. 그러나 이미 체재 경쟁에서 민주주의가 이겨버린 이유는 어떤 놈이던 그 자리에 가면 대부분 더러운 독재자가 되어 버리는 게 99% 기 때문이다. 주변에서 쉽게 볼 수 있는 졸부만 봐도 그렇다.  그런 졸부들의 결정에는 늘 과학적 근거를 붙인다. 무슨 ㅂㅅ 같은 계산식을 들이대고 말이다.

 

 

최근 타다 뿐 아니라 배달업에 종사하시는 분들의 정차 시간을 계산하는 솔루션이 자주 보인다. 내가 7년 전 삼성전자 본사 재직 시절 중소기업 사장님들을 위해 기획하고 진행했었던 교육이 있는데 그때 이미 삼성 로지텍에서 해당 솔루션을 보았었다. 시간이 꽤 흐르면 그런 솔루션은 사라지겠지 했는데 이제 어느 곳에서나 볼 수 있다. 난 중요한 것은 실적이라고 생각한다. 그런 솔루션을 보유한 기업에서 종사하는 사람들은 재택근무는 있어서도 안되고, 의자에 센서 달아서 그냥 의자에 얼마나 오래 앉아 있었는지를 평가해야 한다고 생각한다.

 

만약 그런 시스템을 만든다고 해도 만든 사람과 운영하는 사람들은 비밀 서약서를 쓰고 그 데이터는 정말 너~무 심하게 일 안 하는 사람을 골라서 면담 대상자로 올릴 때만 쓰도록 해야 한다.

 

고속도로에서 사고 나면 그 누구도 멈추지 않는데 그나마 덤프트럭이나 큰 화물차 운전하시는 분이 사람들을 많이 돕는다고 한다. 내가 운전자고 내 정차 시간을 감시하는 시스템이 있다면 처음엔 사람 도와주겠지만, 저런 차가운 시스템을 돌리는 회사는 뭔가 항의할 피드백 시스템이 없을 것이다. 그래서 나중에는 점점 도와주지 않을 것이다. 

 

피드백이 있다고? 있으면 아마 본인 인증해야 할 것이고 본인 인증 다 하면 팝업 차단되었다고 할 것이다. 팝업 풀고 처음부터 다시 인증받으면 무슨 프로그램을 설치하라고 할 것이고 프로그램 다 설치하고 나면 알 수 없는 오류로 종료되겠지. 그렇게 피해 본 사람들은 이야기할 힘이 없는 게 아니라 채널이 없다. 난 이런 류의 시스템을 만들고 인간보다 낫다며 진보시키지 않는 결정들이 싫다. 실적이 나오고 돈이 벌리면 피드백을 돌아보기보다 그 실적으로 번 돈으로 회식하는 똑같은 삶의 방식, 문화가 싫다. 모바일에다가 트렌디한 일을 하다 보니 그렇게 생각하는 사람들과 요즘엔 일일이 싸우기 귀찮고 말 섞기도 싫어서 이 매거진을 만들었다. 상종하기 싫어서 말 안 하는 사람들을 호구로 생각하는 사람들이 읽었으면 해서 말이다.

 

이 매거진은 평범한 사람들의 대변인 노릇을 해 줄 거라고는 생각지 않는다. 이런 부분에서는 워낙 기분파이기도 해서 수만의 조회수가 나오는 글도 쉽게 지운적이 있다는 것은 오랜 구독자 혹은 떠난 구독자들이 잘 알고 있다. 물론, 내가 싫어서 떠나는 것이 아니라 본인의 삶의 순간순간들이 중요하다는 취지로 늘 쓰기 때문이다.

 

내가 계속 그리고 지우며 앞으로 나가는 이유는 독립운동으로 우리나라를 지키셨던 수많은 독립투사, 의사, 열사가 남겨주신 보물에 대한 작은 보답이기도 하다. 그분들께서 그런 의사 결정을 하고 수많은 졸부들은 이름을 남기지도 못하는데 돈도 없이 지금까지도 남을 이름을 남긴 그 의사 결정에 대해서는 어떤 과학적 근거를 들이댈 수 있는가?

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

namedtuple  (0) 2020.04.08
python.c  (0) 2020.04.08
지금 최고의 AI 스피커는?  (0) 2020.04.08
ML 학습 결과는 늘 같을까?  (0) 2020.04.08
텔레그램은 해킹 가능할까?  (2) 2020.04.08

나이가 들면 약간 애매한 선에 서는 것이 사는 게 편하다. 그러나 할 말은 하고 살아야 한다. 이번 글은 약간 일기 형식으로 적어야 겠다.

 

처남에게는 미안하지만 SK NUGU는 좀 아닌 것 같았다. 그러나 처남에게 줄 때는 카카오 스피커보다는 낫다고 생각해서 줬다.

 

https://youtu.be/fOs7-zHq01I

 

이 동영상이 그 증거라 하겠다. 조용히 말해도 안되어서 아이가 먼저 스피커에 달라 붙었고, 온 가족이 다 달라 붙은 경우. 내가 개그 포인트를 넣었을 때 부터 찍어 재미있는 영상. 앞 부분을 안 잘랐으면 완전한 디스였겠지.

 

그러나 2020년이 된 지금은 최고의 AI 스피커라고 말하고 싶다.

 

3일 전 만나 배 아플 때까지 같이 고기를 처묵 한 학교 후배가 카카오 브레인이 있어서 카카오 이야기를 하는 것은 아니다. 난 가족에게 까지도 할 말은 하고 산다. 그러나 확실히 지금은 최고의 AI 스피커이다. 그래서 집에 2개 내 숙소에 1개 고장 나면 바로 바꿀 1개를 보유 중이다. 뭐, 일부러 많이 산 것은 아니다. 난 뭘 사도 늘 2개 이상을 산다. 키보드(리얼포스임에도 2개)나 마우스(로지텍 여러 개), 신발도 2개 이상 씩... 병은 아니고 버는 돈이 일 년에 억이 넘어가면 작은 물건에는 뭘 사고 그 물건 때문에 뭔가 지체되는 게 돈이 더 아까워서.

 

카카오미니C AI 블루투스스피커

-37% 49,000원, 무료배송. 리뷰 4.7점, 42개

ohou.se

 

이 쇼핑몰은 당연히 아는 곳이 아니다. 그냥 인터넷 검색해서 나와서 그냥 넣었다.

마흔이 되니 그냥 뭐 할 때마다 주변에서는 나에게 다른 이유는 찾는데 난 그냥 아직도 이유 없이 산다.

 

보통 제품 리뷰할 때 제품에 대해 꼼꼼하게 리뷰하는 글이 많다. 난 내가 솔직한 사람이라고 생각한 사람이 뭘 사면 그냥 믿고 따라 사는데 구독자 중에 그런 분이 좀 계셔서 장모님께도 선물한 AI 스피커라고 해 본다. 다만, 업데이트 이후 최근 음악 듣기 구입하셨던 장모님과의 휴대폰 페어링이 깨져서 다시 연결하고 알려 드릴 때 집어던질 뻔 하긴 했다. 딱 한 번이라 넘어가야 할 듯.

 

내가 쓰는 기능은 몇 개 없는데 너무 자주 쓰고, 너무 편하다.

 

1. xx시 x분에 알람 맞춰줘. 

2. 많이 본 뉴스

3. SBS 뉴스

4. KBS 뉴스(MBC는 서비스 안된다)

5. 날씨

6. 내일 날씨

7. 조용히 해(아이에게는 안 쓰고 여기 스트레스 품)

8. 알람 모두 지워줘.

9. 휴대폰 찾아줘.

 

지금 최고의 AI 스피커라고 말하는 이유는 그동안 ML로 음성 인식 서비스를 제공하는 스피커의 지인 찬스 써 가며 다 써보니 한국어는 구글 홈이 좋았다. 사실 내가 참고로 삼은 그 집은 구글 홈에 방송뿐 아니라 IoT, 음악 감상까지 모두 결합을 했기에... 그러나 3D 게임보다 2D 게임이 재미가 있듯.

 

집에서 모니터링 스피커(프리 소너스 셉터 8+우퍼)로 음악을 듣고, 150만 원짜리 바워스앤윌킨스 헤드폰과 아스텔 앤 컨으로 길거리에서 음악 듣는 나로서는 그냥 지금 AI 스피커라고 하는 애들에 대한 기대는 딱히 없다. (에어팟 프로는 와이프가 쓴다. 나는 아직 유선이 좋다 ^^;;) 애플도 돼도 안 하는 닥터드레 정도야 인수했지만 B&W나 베어다이내믹 같은 회사를 인수하기는 힘들다고 생각한다.(그래도 닥터드레 솔로 헤드셋은 2개 있긴 하다. 솔로만 음질 괜찮.) 최근 보스와 B&W 헤드셋을 친구에게 선물 줬는데 딱히 돈 때문에 뭘 선물하거나 선택하라고 하고 싶지도 않다. 그래서 최근에는 카카오 미니 스피커 선물하는 게 취미다.

 

이 글에서 가장 중요한 글자는 [지금]이다.

 

카카오가 하드웨어 제작에도 도전을 해서 많이 밀어주고 싶은 마음이지만 내심 드는 생각은 결국엔 하드웨어도 잘 만들고, 소프트웨어도 우수한 애플이 음성 인식 시장은 통일하지 않겠냐는 생각이다.

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

python.c  (0) 2020.04.08
decision science - 2  (0) 2020.04.08
ML 학습 결과는 늘 같을까?  (0) 2020.04.08
텔레그램은 해킹 가능할까?  (2) 2020.04.08
맥북으로 머신러닝 되나요?  (0) 2020.04.08

+ Recent posts