HTML52017. 2. 16. 14:47


https://medium.com/@daviddentoom/angular-2-lazy-loading-with-webpack-d25fe71c29c1#.ik88lsre3



Home과 About페이지를 갖는 앱이 있다고 하자 대부분의 유저는 About페이지를 거의 열어보지 않을것이다. 자 이게 lazy loading이 필요한 이유이다. About페이지는 미리 로딩할 필요가 없는 것이다.


프로젝트 설정


/app

 app.component.ts

 app.component.html

 app.module.ts

 app.routing.ts

 /home

    home.component.ts

    home.component.html

    home.module.ts

    home.routing.ts  

  /+about --> Lazy loaded module

    about.component.ts

    about.component.html

    about.module.ts

    about.routing.ts



1. 로더 설치


angular2-router-loader를 사용해야 한다. 아래 명령으로 설치한다.


npm install angular2-router-loader--save-dev


이번엔 webpack 설정파일에 로더를 추가한다.


webpack.config.js


loaders: [

  {

    test: /\.ts$/,

    loaders: [

      ‘awesome-typescript-loader’, 

      ‘angular2-template-loader’, 

      ‘angular2-router-loader’]

   },

   ...

]


2. 상위 콤포넌트에 라우팅설정을 추가한다.


보통 라우팅 설정을 자기자신의 모듈내에서 정의한다. lazy loading되는 모듈은 상위콤포넌트 즉 호출하는 모듈에서 설정해주어야 한다.


app.routing.ts

const routes: Routes = [
 { path: '', redirectTo: '/home', pathMatch: 'full',
 { path: 'about', loadChildren: './+about/about.module#AboutModule' }
];


"about" 라우트하나를 설정하고 angular에게 "about"라우트로 페이지를 로드할 수 있도록 알려준다. #AboutModule은 모듈명으로 참조되고 +를 앞에 붙이는 것은 lazy load될거라는 규약이다.


3. Lazy Module 작성


lazy module은 none lazy module과 거의 동일하게 동작한다. 한가지 큰 차이점이 있는데 상위모듈에서 about(/about)경로를 선언했기 때문에 경로를 다시 정의할 필요가 없다. 우리가 해야 하는것은 로드되어야 할 디폴트 콤포넌트를 설정해주는 것이다.


./+about/about.routing.ts

const routes: Routes = [

 { path: '', component: AboutComponent },

];


됐다.

앱을 실행하고 about페이지로 이동하면 새로운 chunk가 로드되는것을 볼수 있을 것이다.



The source code can be found here

Posted by 삼스

댓글을 달아 주세요

HTML52017. 2. 15. 16:06


Ionic Project를 위한 스크립트


설치는 이렇게


npm install @ionic/app-scripts@latest --save-dev


디폴트 설정


아래와 같은 기본설정으로 빠르게 앱을 빌드하게 해준다.

  • Multi-core processing tasks in parallel for faster builds
  • In-memory file transpiling and bundling
  • Transpiling source code to ES5 JavaScript
  • Ahead of Time (AoT) template compiling
  • Just in Time (JiT) template compiling
  • Template inlining for JiT builds
  • Bundling modules for faster runtime execution
  • Treeshaking unused components and dead-code removal
  • Generating CSS from bundled component Sass files
  • Autoprefixing vendor CSS prefixes
  • Minifying JavaScript files
  • Compressing CSS files
  • Copying src static assets to www
  • Linting source files
  • Watching source files for live-reloading
기본설정을 통해 개발에 집중할 수 있게 해준다.

Ionic framework의 소스는 모듈로 구성되어 있고 다양한 번들러와 빌드프로세스로 패키징될 수 있다. 이 프로젝트의 목적은 ionic app을 더 쉽게 개발하게 하기 위한것이다. 

npm Scripts

외부 테스트러너에 의존하기보다 Ionic App Script는 npm script로 실행되는데 적합하다. package.json파일에 아래와 같이 기본설정이 되어 있다.

"scripts": {
    "ionic:build": "ionic-app-scripts build",
    "ionic:serve": "ionic-app-scripts serve"
  },

package.json에 기술된 build script를 실행되도록 하려면 다음과 같이 수행한다.

npm run build

Custom Configuration

개발자에게 대게는 기본설정으로 충분할것이다. 하지만 Ionic App Script는 다양한 테스크들을 설정하거나 오버라이드하는 다양한 방법을 제공한다.  Custom하지 않으면 항상 디폴트가 적용된다.

package.json Config

package.json파일을 Ionic project가 사용하는데 config 프로퍼티가 커스텀 설정을 위해 사용된다. 아래는 그 예이다.

  "config": {
    "ionic_bundler": "rollup",
    "ionic_source_map_type": "source-map",
    "ionic_cleancss": "./config/cleancss.config.js"
  },

Command-line Flags

기억해야 해! 프로젝트의 package.json파일의 scripts프로퍼티에서 ionic-app-scripts를 어떻게 실행했는지. 자 우리는 이제 각 스크립트에 command-line flag들을 추가할 수 있다. 또는 새로운 스크립트를 커스텀플래그와 함께 정의할 수 도 있지.

"scripts": {
    "build": "ionic-app-scripts build --rollup ./config/rollup.config.js",
    "minify": "ionic-app-scripts minify --cleancss ./config/cleancss.config.js",
  },

동일한 커맨드라인 플래그는 npm run에도 동일하게 적용될 수 있지

npm run build --rollup ./config/rollup.config.js

Overriding Config Files

config filepackage.json configcmd-line flag
Babiliionic_exp_babili--babili
CleanCssionic_cleancss--cleancss or -e
Copyionic_copy--copy or -y
Closureionic_closure--closure or -l
Generatorionic_generator--generator or -g
NGCionic_ngc--ngc or -n
Rollupionic_rollup--rollup or -r
Sassionic_sass--sass or -s
TSLintionic_tslint--tslint or -i
UglifyJSionic_uglifyjs--uglifyjs or -u
Watchionic_watch--watch
Webpackionic_webpack--webpack or -w

Overriding Config Values


config valuespackage.json configcmd-line flagdefaultsdetails
root directoryionic_root_dir--rootDirprocess.cwd()The directory path of the Ionic app
src directoryionic_src_dir--srcDirsrcThe directory holding the Ionic src code
www directoryionic_www_dir--wwwDirwwwThe deployable directory containing everything needed to run the app
build directoryionic_build_dir--buildDirbuildThe build process uses this directory to store generated files, etc
temp directoryionic_tmp_dir--tmpDir.tmpTemporary directory for writing files for debugging and various build tasks
node_modules directoryionic_node_modules_dir--nodeModulesDirnode_modulesNode modules directory
ionic-angular directoryionic_angular_dir--ionicAngularDirionic-angularionic-angular directory
ionic-angular entry pointionic_angular_entry_point--ionicAngularEntryPointindex.jsentry point file for ionic-angular
bundlerionic_bundler--bundlerwebpackChooses which bundler to use: webpack or rollup
source map typeionic_source_map_type--sourceMapTypesource-mapChooses the webpack devtool option. eval and source-map are supported
generate source mapionic_generate_source_map--generateSourceMaptrueDetermines whether to generate a source map or not
tsconfig pathionic_ts_config--tsconfig{{rootDir}}/tsconfig.jsonabsolute path to tsconfig.json
app entry pointionic_app_entry_point--appEntryPoint{{srcDir}}/app/main.tsabsolute path to app's entrypoint bootstrap file
app ng module pathionic_app_ng_module_path--appNgModulePath{{srcDir}}/app/app.module.tsabsolute path to app's primary NgModule
app ng module classionic_app_ng_module_class--appNgModuleClassAppModuleExported class name for app's primary NgModule
clean before copyionic_clean_before_copy--cleanBeforeCopyfalseclean out existing files before copy task runs
output js fileionic_output_js_file_name--outputJsFileNamemain.jsname of js file generated in buildDir
output js map fileionic_output_js_map_file_name--outputJsMapFileNamemain.js.mapname of js source map file generated in buildDir
output css fileionic_output_css_file_name--outputCssFileNamemain.cssname of css file generated in buildDir
output css map fileionic_output_css_map_file_name--outputCssMapFileNamemain.css.mapname of css source map file generated in buildDir
bail on lint errorionic_bail_on_lint_error--bailOnLintErrornullSet to true to make stand-alone lint commands fail with non-zero status code
write AoT files to diskionic_aot_write_to_disk--aotWriteToDisknullSet to true to write files to disk for debugging
print dependency treeionic_print_original_dependency_tree--printOriginalDependencyTreenullSet to true to print out the original dependency tree calculated during the optimize step
print modified dependency treeionic_print_modified_dependency_tree--printModifiedDependencyTreenullSet to true to print out the modified dependency tree after purging unused modules
print webpack dependency treeionic_print_webpack_dependency_tree--printWebpackDependencyTreenullSet to true to print out a dependency tree after running Webpack
experimental parse deeplink configionic_experimental_parse_deeplinks--experimentalParseDeepLinksnullSet to true to parse the Ionic 3.x deep links API for lazy loading (Experimental)
experimental manual tree shakingionic_experimental_manual_treeshaking--experimentalManualTreeshakingnullSet to true to purge unused Ionic components/code (Experimental)
experimental purge decoratorsionic_experimental_purge_decorators--experimentalPurgeDecoratorsnullSet to true to purge unneeded decorators to improve tree shakeability of code (Experimental)
experimental closure compilerionic_use_experimental_closure--useExperimentalClosurenullSet to true to use closure compiler to minify the final bundle
experimental babiliionic_use_experimental_babili--useExperimentalBabilinullSet to true to use babili to minify es2015 code
convert bundle to ES5ionic_build_to_es5--buildToEs5trueConvert bundle to ES5 for for production deployments


Posted by 삼스

댓글을 달아 주세요

iOS2017. 1. 31. 13:58


맥과 윈도우에서 모두 사용가능한 드라이브는 NTFS로 하는게 좋을것 같고.

이 경우 맥에서 쓰기가 안되기 때문에 이전에는 Paragon이나 NTFS3G같은걸 사용했는데

마운틴라이언부터는 맥이 기본적으로 기능을 제공한다.

다만 디폴트가 활성이 아니기 때문에 일부 수동으로 조정해주어야 한다.

치사하게스리


/etc/fstab에 라벨를 지정하는 방법이 그것인데 인식시키려고 하는 드라이브명이 'MYDRIVE'라면 아래와 같이 하면 된다


sudo nano /etc/fstab


LABEL=MYDRIVE none ntfs rw,auto,nobrowse


이렇게 한 후 드라이브를 다시 마운트시키면 쓰기가 가능해진다.


다만 Finder에 드라이브아이콘이 나타나지 않을 수 있는데 이 때는 /Volumes 폴더에 직접 접근하거나 터미널에서 아래와 같이 입력해주면 뜰것이다!


open /Volumes/MYDRIVE 


Posted by 삼스

댓글을 달아 주세요

iOS2016. 12. 12. 10:57


Crash Log 콘솔에서 분석하기



크래시 발생 시 크래시데이터 저장위치(iTunes 동기화하면 저장됨)

Mac OS X: ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>


Windows XP: C:\Documents and Settings\<USERNAME>\Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>


Windows Vista or 7: C:\Users\<USERNAME>\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>



아카이브파일은 Devices메뉴에서 Archives탭에서 해당 앱의 Show in Finder로 이동하면 찾을 수 있다.

아카이브에서 dSYM파일과 .app파일을 추출하여 크래시 로그와 동일한 폴더에 위치시킨다.


그러고 콘솔에서 아래와 같이 입력한다.

atos -arch armv6 -o 앱이름.app/앱이름 메모리주소


)

iyosam-ui-MacBook-Pro:Crash leeyosam$ atos -arch armv7 -o MobileApp-iPad.app/MobileApp-iPad 0x26000 [엔터키입력]

-[DSVCResultSearchViewController monthButtonTouchesUpInside:] (in MobileApp-iPad) (DSVCResultSearchViewController.m:241)

Posted by 삼스

댓글을 달아 주세요

HTML52016. 10. 6. 14:12


http://www.joshmorony.com/a-simple-guide-to-navigation-in-ionic-2/



Ionic1이나 Angular1 백그라운드가 다면 URL, state등으로 라우팅을 Ionic2에서도 사용은 가능하다 하지만 많은 주의가 필요하므로 권장하지 않는다.

Ionic2는 View를 push/pop하는 네비게이션 스택으로 운영된다.


이를 구현하는 방법을 배우기 전에 어떻게 동작하는지에 대해 먼저 이해해보자.


Push/Pop


root page가 고양이 그림이 그려진 종이가 테이블에 올려져 있다고 상상해보자.

이제 개그림이 그려진 종이를 올려보자. 그러면 개그림이 제일 위에 있게 된다. 그리고 고양이는 여전히 개그림 아래에 놓여져 있게 된다.

이번에 소그림이 그려진 종이를 올려보자. 소그림이 제일 위에 있고 고양이과 개그림도 여전히 놓여져 있다.

이제 개그림을 보려면 쌓여진 종이의 맨위 그림을 버리면 된다. 이어서 고양이그림을 보려면 한번더 맨위의 그림을 버리면 된다.

히스토리를 관리하는 아주 편리한 네비게이션방안이고 차일드뷰가 많은 경우 이해하기 쉽다. 하지만 항상 그런것은 아니다. 어떤 경우는 바로 이전페이지가 아니라 다른 페이지로 이동하고자 할 경우도 발생하기 마련이다(로그인 페이지에서 메인페이지로 이동하는경우).

이 경우 우린느 root page를 변경할 수 있다. 

위 예에서 소그림을 root page로 할 수 있다.


언제 push하고 언제 root page로 해야 하나?


현재뷰의 차일드로 전환하고자 하는 경우 또는 새로운 뷰에서 이전뷰로 돌아오기를 원한다면 push를 해야한다.

현재뷰의 차일드가 아니거나 애플리케이션의 다른 섹션으로의 이동이라면 root page를 변경해야 한다.

root page와 root component는 다르다. root component(보통 app.component.ts)가 root page를 정의한다. 


Ionic2 네비게이션 기초


NavController를 import해야 한다.


import { NavController } from 'ionic-angular';


그리고 생성자에서 inject해야 한다.


@Component ({

  templateUrl: 'home.html',

})

export clas MyPage {

  constructor(public navCtrl: NavController) {


  }

}


NavController의 레퍼런스가 생기고 클래스내 어디에서든지 사용이 가능하다. 이제 어떻게 push/pop을 하는지 보자


페이지를 push하려면 


this.navCtrl.push(SecondPage);


앞에서 inject한 navCtrl로 push하였다. 이렇게 하려면 SecondPage가 import되어야 한다.


import { SecondPage } from '../second-page/second-page';


이제 코드내에서 push를 호출하면 새로운 페이지가 표시될것이고 nav bar에 자동으로 백버튼이 생성이 될것이다.

pop을 언제 할것인지 고민하지 말라. 백버튼을 누르면 알어서 pop해줄것이다.


수동으로 이전 페이지로 이동하고자 한다면 명시적으로 pop을 호출한다.


this.navCtrl.pop();


이번엔 root page를 변경한는 방법이다. app.ts에 rootPage를 정의하였을 것이다.


rootPage: any = MyPage;


root component의 rootPage변수에 root page를 셋팅할것이다. root page를 변경하려면 NavController의 setRoot함수를 호출하면 그만이다.


this.navCtrl.setRoot(SecondPage);



Ionic2에서 페이지간 데이터 전송


모바일애플리케이션에서는 보통 페이지간의 데이터를 전달할 방법이 필요하다. Ionic2에서는 NavParams로 가능하다. push로 페이지 호출할때 파라메터를 생성하여 전달하는 방법이 있다. 이 방법은 setRoot시에도 동일하게 적용된다.


this.navCtrl.push(SecondPage, { thing1: data1, thing2: data2});


추가 파라메터가 더해진것 말고 이전과 사용법이 동일하다. 호출되는 페이지에서는 NavParams를 생성자에서 inject해야 한다.


import { Component } from '@angular/core';

import { NavController, NavParams } from 'ionic-angular';


@Component ({ templateUrl: 'second-page.html'})

export class SecondPage {

  constructor(public navCtrl: NavController, public navParams: NavParams) {


  }

}


이제 파라메터에 접근하려면 아래와 같이 하면 된다.


this.navParams.get('things');


Posted by 삼스

댓글을 달아 주세요

Linux2015. 9. 15. 13:20


http://docs.gstreamer.com/display/GstSDK/Installing+the+SDK


GstreamerSDK는 리눅스배포판별로 바이너리 패키지셋을 제공한다. 배포판 중에 Ubuntu에 대한 자세항 설명을 기술할거다.

소스코드를 다운로드하고 직접 빌드해서 환경을 설정할 수 도 있다.


다운로드 및 SDK 설치


1. Ubuntu 12.04(Precise Pangolin) 설치

2. gstreamer-sdk.list를 apt source list에 추가

SDK의 repository정보를 apt source list에 추가해주어야 한다.

다운로드 후 다음 명령으로 추가한다.

sudo cp gstreamer-sdk.list /etc/apt/sources.list.d/

3. GPG key추가 및 레포지트리 리프레시

이어서 apt repository의 GPG key가 추가되어야 하고 목록이 리프레시 되어야 한다.

wget -q -O - http://www.freedesktop.org/software/gstreamer-sdk/sdk.gpg | sudo apt-key add -

sudo apt-get update

4. SDK 설치

이제 새 레포지트리가 활성화되었다. 아래 명령으로 SDK를 설치하면 된다.

sudo apt-get install gstreamer-sdk-dev


개발환경 설정


빌드시 컴파일러는 하이브러리드를 반드시 특정 위치에 있어야 한다.  시스템에 설치된 Gstreamer와의 충돌을 방지하기 위해 비표준 위치(/opt/gstreamer-sdk)에 설치 된다.  쉘스크립트인 gst-sdk-shell은 SDK로 빌드하기 위한 필요한 환경변수들을 설정해준다.

/opt/gstreamer-sdk/bin/gst-sdk-shell

한가지더 필요한 개발환경은 gcc compiler와 text editor이다. SDK로 앱 코드를 빌드할 때 gcc command에 아래 내용을 반드시 추가해 주어야 한다.

'pkg-config --cflags --libs gstreamer-0.10'

다른 gstreamer library를 사용하고 있다면 예를 들어 video 라이브러리 같은... gstreamer-0.10뒤에 추가해주어야 한다.

'pkg-config --cflags --libs gstreamer-0.10 gstreamer-video-0.10'

빌드 시 libtool이 필요한 경우 즉 automake/autoconf를 사용하는 경우라면 configure 스크립트를 gst-sdk-shell환경으로부터 실행해야 한다.

SDK경로를 포함시킬 수 있는 방법이 있는데 그렇게 하면 gst-sdk-shell로부터 실행할 필요가 없다. gcc옵션에 다음과 같이 추가하면 된다.

-Wl, -rpath=/opt/gstreamer-sdk/lib 'pkg-config --cflags --libs gstreamer-0.10'

libtool을 사용하는 경우라면 자동으로 -Wl과 -rpath를 추가해줄것이기 때문에 걱정이 필요없다.


튜터리얼 소스코드 받기


git clone git://anongit.freedesktop.org/gstreamer-sdk/gst-sdk-tutorials

/opt/gstreamer-sdk/share/gst-sdk/tutorials


튜터리얼 빌드하기


시스템과 충돌없이 올바른 라이브러리로 빌드하기 위해서 Gstreamer SDK shell로 먼저 진입해야 한다. /opt/gstreamer-sdk/bin/gst-sdk-shell 을 실행하여 쉘로 진입하라.

그리고 튜터리얼 코드가 있는 폴더로 이동해서 아래 명령으로 빌드하면 된다.


gcc basic-tutorial1-1.c -o basic-tutorial-1 'pkg-config --cflags --libs gstreamer-0.10'


사용하려고 하는 라이브러리에 따라서 pkg-config에 추가가 더 되어야 한다.  튜터리얼코드의 아랫부분에는 필요한 라이브러리들이 순서대로 기술되어 있을 것이다.


앱 배포

배포할 앱은 반드시 필요한 라이브러리들이 함께 있어야 한다. 몇가지 옵션이 있다.

한가지는 shared sdk를 설치할거라면 앱은 /opt/gstreamer-sdk에 두고 .desktop파일을 /usr/share/applications에 만들어 두는 것이다. 문제없이 동작하게 하려면 -Wl, -rpath=/opt/gstreamer-sdk/lib 파라메터로 앱이 빌드되어 있어야 한다.

또는 wrapper script를 사용하는것이다. 이는 필요한 환경변수를 셋팅하고 나서 앱을 생성한다. 그리고 .desktop file을 /usr/share/applications에 생성한다. 가장 많이 사용되는 접근법이고 -WL, -rpath파라메터를 요구하지 않고 더 효율적이다. gst-sdk-shell파일을 둘러보아서 스크립트가 멀 하는지 알아보길 바란다.


Posted by 삼스

댓글을 달아 주세요

iOS2015. 8. 31. 14:53



호스트 연결전에 DNS Name resolving피하기


호스트에 접속하는 적절한 방법은 DNS 명을 받는 CFHost나 CFNetService같은 API가 있다. 앱에서 DNS name으로 리졸브된 ip주소로 접속을 한다고 해도 이 방법은 피해야 한다. DNS lookup은 보통 여러개의 IP주소를 반환하며 어떤 IP주소가 가장 좋은 연결을 제공하는지 알 수 없다.

최근의 대부분의 컴퓨터나 모바일디바이스들은 멀티홈을 가진다. 즉 WiFi + Ethernet이거나 3G + WiFi이거나 하는 환경이 많다. 하지만 모든 호스트가 모든 컨넥션에서 유효한것은 아니다. 예를 들어 iPhone으로 Apple TV를 제어하려고 하는 경우 App TV는 Wifi망에 있고 폰은 3G망에 있다면 이는 연결이 불가하다.

디바이스와 서버가 모두 멀티IP주소를 가지고 있다면 서버에 연결할 가장 좋은 IP주소는 어떤 네트웍에 연결되어 있느냐에 따라 결정된다. 예를 들어 가정의 멀티미디어 서버가 LAN과 WiFi IP주소를 모두 가지고 있다면 OS에서 더 빠른 네트웍을 감지할 수 있을것이며 프로그램이 이 주소를 통해 연결가능할것이다.

서버가 IPv4와 IPv6를 모두 지원하면 두 프로토콜을 사용함으로 인해 도달하지 못할 수 있다. host-name-basedAPI를 사용하여 OS는 동시에 시도를 할 수 있고 첫번째것으로 성공시킬수 있다. 앱이 먼저 찾아낸 IP주소가 어떤 주소냐에 따라서 연결이 안될 가능성 도 있다.

구형 서버로  IPv6를 지원하지 않는 경우에 AAAA형식의 IPv6주소로 접을을 요청하면 동기로 호출되는 DNS조회는 요청시간내내 블럭될것이다.(디폴트는 30초) . 만일 호스트명을 취하는 API를 사용하면 OS는 IPv4와 IPv6요청이 동시에 수행되는지 사용자가 알수 없게 할것이고 내부적으로 IPv4연결이 완성되면 IPv6연결시도는 취소할것이다.

Bonjours를 사용해서 서비스를 게시하는 경우(DHCP는 동작하지 않음) 앱이 해당서비스를 찾아서 IP주소를 얻어내었다면 해당 디바이스가 IP주소를 유지하는 동안에는 유효하다. 하지만 DHCP서비스가 다시 온라인이 되게 되면 IP주소는 변경되고 이전 IP주소는 더이상 유효하지 않게 된다. 만일 게시이름으로 연결을 시도하게 된다면 앱에서는 서버가 최종적으로 언어진 IP주소로 계속 연결을 할 수 있게 될것이다.

DNS Name 해결하기를 직접 피할수 없다면 먼저 CFHost API가 요구사항에 만족하는지 확인해보아야 한다. 이는 싱글주소 대신에 호스트에 주어진 모든 주소목록을 제공한다. CFHost가 만족시키지 못한다면 DNS Service Discovery API를 사용하라.



Posted by 삼스

댓글을 달아 주세요

iOS2015. 8. 31. 13:38



아래는 애플뉴스스(https://developer.apple.com/news/?id=08282015a)의 전문이다.

Supporting IPv6 in iOS 9

August 28, 2015


At WWDC 2015 we announced that iOS 9 will support IPv6-only network services. All apps submitted to the App Store must support IPv6 starting in early 2016. To make sure your app is compatible, use the networking frameworks (e.g., “NSURLSession”), avoid use of IPv4-specific APIs, and avoid hard-coded IP addresses. Before submitting your app, test for compatibility.

To learn more, read Supporting IPv6 DNS64/NAT64 Networks and watch Your App and Next Generation Networks.


WWDC2015에서 이미 언급했다는데 iOS9부터 IPv6-only network service를 지원할거라나. 코드상에 웹서비스 주소를 도메인주소를 사용하고 있다면 문제가 안되겠지만 ip주소를 사용하고 있다면 문제가 될거란다. 내년(2016) 초부터 앱스토어가 지원을 시작할거라는데 이 얘기인즉슨 그런 앱들을 리젝을 놓겠다는건지 정확히 모르겠다. 무슨 지혼자 잘났다고 IPv6를 강제한단 말인가? 장비부터 해서 갑자기 강제하면 분명히 혼란과 혼돈이 있을것인제...

무튼 IPv4전용 API는 하드코딩된 IP주소를 모두 피해야 한다. 기존 앱들은 물론 다 바까야겠지.

자 그럼 불평만 할떄가 아니다 기존앱들은 그리고 새로운앱들은 또 어떻게 대응해야 할까를 연구해보자...

만일 앱이 high-level network api를 즉 NSURLSession이나 CFNetwork frameworkd의 API들을 사용하고 연결은 도메인명으로 하고 있다면 아무것도 할게 없다.

만일 도메인명으로 연결하고 있지 않다면 가이드(Avoid Resolving DNS Names Before Connectiing to Host)를 참고







Posted by 삼스

댓글을 달아 주세요

iOS2015. 8. 28. 16:12


http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/


App Transport Security Technote


앱과 웹서비스간의 보안을 더 향상시킬 수 있는 기능이다.

디폴트연결 요구사항들로 구성한다. 이 요구사항은 보안연결을 위한 최적의 구성을 기술한다.

App은 이 동작에 대해 오버라이드하거나 기능을 아예 꺼버릴 수 있다.

iOS 9.0, OSX 10.11 이후부터 지원한다.


디폴트 동작

iOS 9.0과 OSX 10.11에서 돌아가는 앱에서 NSURLConnection, CFURL 또는 NSURLSession을 이용한 모든 통신은 Transport security의 디폴트 동작을 사용한다.

이 요구사항에 부합하지 않은 모든 연결을 실패할것이다.


ATS 필수 요구사항

- 서버는 Transport Layer Security(TLS) protocol version 1.2이상을 지원해야 한다.

- 암호화는 forward secrecy를 지원하는것들로 제한된다.

- 인증서는 반드시 SHAR256이나 더 발전된 해시알고리즘을 사용해야 한다. 잘못된 인증서는 실패한다.


허용된 암호화

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA


예외

디폴트 동작에 대한 예외를 info.plist파일을 통해서 정의할 수 있다. 해당 예외에 대한 키값들을 사용하거나 기능을 끌 수 있다. 다음은 키값들과 키값에 해당하는 타입들을 나타내었다.



NSAppTransportSecurity   Dictionary

    NSAllowsArbitraryLoads   Boolean

    NSExceptionDomains Dictionary

        <domain-name-for-exception-as-string> Dictionary

            NSExceptionMinimumTLSVersion String

            NSExceptionRequiresForwardSecrecy Boolean

            NSExceptionAllowsInsecureHTTPLoads Boolean

            NSIncludesSubdomains Boolean

            NSThirdPartyExceptionMinimumTLSVersion String

            NSThirdPartyExceptionRequiresForwardSecrecy Boolean

            NSThirdPartyExceptionAllowsInsecureHTTPLoads         Boolean



NSAppTransportSecurity

  디폴트동작을 오버라이드할 셋팅값들을 포함하는 딕셔너리이다. info.plist의 최상위 key값


NSAllowArbitraryLoads

  NSExceptionDomains 딕셔너리에 리스터업되지 않는 도메인들에 대한 ATS를 사용할지 boolean 값으로 정의한다.

  디폴트값은 NO이고 모든 연결들에 대해 ATS를 요구한다.


NSExceptionDomains

  ATS 예외 도메인들의 딕셔너리이다. 각 키는 예외할 도메인명을 담은 문자열이다. named domain이며 예를 들면 www.google.com같은것이다.


NSExceptionMinimumTLSVersion

  최소 TLS버전으로 TLSv1.0, TLSv1.1, TLSv1.2 가 있다. TLSv1.2가 디폴트값이다.


NSExceptionRequiresForwardSecrecy

  도메인이 지원하는 암호화 요구사항을 오버라이드 한다. YES가 디폴트이며 디폴트동작에서 정의한 암호화로 제한다.

  No이면 다음 암호화가 추가된다.


TLS_RSA_WITH_AES_256_GCM_SHA384

TLS_RSA_WITH_AES_128_GCM_SHA256

TLS_RSA_WITH_AES_256_CBC_SHA256

TLS_RSA_WITH_AES_256_CBC_SHA

TLS_RSA_WITH_AES_128_CBC_SHA256

TLS_RSA_WITH_AES_128_CBC_SHA


NSExceptionAllowsInsecureHTTPLoads

  No가 디폴트값이며 모든 연결이 HTTPS를 사용할지 결정한다. 이 키값으로 도메인이 인증서없이 접근하거나 self-signed로 접근하거나, 만료되거나 호스트명 미스매치 인증으로 접근가능하도록 할 수 있다.

  

NSIncludeSubdomains

  No가 디폴트 값이며 최상위 레벨 도메인의 모든 서브도메인에도 적용할지 결정한다.


NSThirdPartyExceptionMinimumTLSVersion

NSThirdPartyExceptionRequiresForwardSecrecy

NSThirdPartyExceptionAllowsInsecureHTTPLoads

  개발자에의해 앱서비스가 컨트롤되지 않는 도메인의 경우 사용된다. <- 먼소린지???



Posted by 삼스

댓글을 달아 주세요

Linux2015. 8. 27. 09:24



sudo apt-get update

sudo apt-get upgrade

sudo apt-get install bison

sudo apt-get install g++

sudo apt-get install flex



/*1. flex 설치

flex download

tar xfv flex-2.5.39.tar.bz2

./configure 

make

sudo make insatll

*/


2. glib 설치

glib download : http://ftp.acc.umu.se/pub/gnome/sources/glib/2.46/glib-2.46.0.tar.xz

dependencies

- pkgconfig : http://www.freedesktop.org/software/pkgconfig/

- libiconv : http://www.gnu.org/software/libiconv/

- gettext : http://www.gnu.org/software/gettext/


2.1 pkgconfig

pkgconfig download

wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.19.tar.gz

./configure

make

sudo make install


export PKG_CONFIG_PATH=/usr/local/bin/pkg-config 를 ~/.bash_profile에 추가


2.2 libiconv

libiconv downloa

http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

./configure

make

sudo make install



2.3 gettext

gettext download

wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.6.tar.xz

./configure

make

sudo make install


2.4 libffi

libffi download

ftp://sourceware.org/pub/libffi/libffi-3.2.tar.gz

./configure

make

sudo make install



2.4 glib

glib download

wget http://ftp.gnome.org/pub/gnome/sources/glib/2.44/glib-2.44.1.tar.xz

sudo apt-get install zlib1g-dev

//sudo apt-get install libffi-dev


./configure --with-libiconv

make

sudo make install


아래 에러가 발생할 수 있다.

error while loading shared libraries: libiconv.so.2: cannot open shared object file:


/usr/local/lib에 libiconv.so.2가 있음에도 불구하고 link가 연결이 제대로 안되는 경우가 있다.

ldd $(which iconv)를 입력해서 아래와 같이 나오면 이런 경우이다.

녀애 

$ ldd $(which iconv)

linux-gate.so.1 => (0xb77b1000)

/usr/local/lib/preloadable_libiconv.so (0xb76cc000)

libiconv.so.2 => not found

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74f7000)

/lib/ld-linux.so.2 (0xb77b2000)


이 떄는 다음 명령을 한번 실행한다.


sudo ldconfig -v


다시 ldd명령을 수행하면 정상적으로 링크가 걸린것을 확인할 수 있다.


ldd $(which iconv)

linux-gate.so.1 => (0xb77b4000)

/usr/local/lib/preloadable_libiconv.so (0xb76cf000)

libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0xb75c1000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7416000)

/lib/ld-linux.so.2 (0xb77b5000)



3. liboil

liboil download

http://liboil.freedesktop.org/download/liboil-0.3.17.tar.gz

./configure

make

make install


4. gstreamer

아래 패키지들을 모두 다운로드 및 설치 진행(http://gstreamer.freedesktop.org/data/src)

./configure && make && sudo make install

gstreamer

gst-plugins-base

gst-plugins-good/bad/ugly

gst-ffmpeg는 deprecated됨. gst-libav설치(https://bugzilla.gnome.org/show_bug.cgi?id=676260)

sudo apt-get yasm  nasm 먼저 설치 후 진행

순서로 설치


mp3파일 재생 테스트

gst-launch-1.0 playbin uri=file:///home/leeyosam/gmediarender/iu-knee.mp3

이 때 아래와 같은 에러가 날 수 있다.

gst-launch-1.0: symbol lookup error: gst-launch-1.0: undefined symbol: _gst_date_time_type

이 경우 ldconfig를 실행해주면 된다.

sudo ldconfig




Posted by 삼스

댓글을 달아 주세요