- $http 서비스를 이용해 json을 웹으로 가져오기.
| ||
| <meta charset="utf-8"> | ||
| <title>Angular.js Example</title> | ||
| <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.min.js"></script> | ||
| <script> | ||
| var countryApp = angular.module('countryApp', []); | ||
| countryApp.controller('CountryCtrl', function ($scope, $http){ | ||
$http.get('countries.json').success(function(data) { | ||
| $scope.countries = data; | ||
| }); | ||
| }); | ||
| </script> | ||
| </head> | ||
| <body ng-controller="CountryCtrl"> | ||
| <table> | ||
| <tr> | ||
| <th>Country</th> | ||
| <th>Population</th> | ||
| </tr> | ||
| <tr ng-repeat="country in countries"> | ||
| <td>{{country.name}}</td> | ||
| <td>{{country.population}}</td> | ||
| </tr> | ||
| </table> | ||
| </body> | ||
| </html> |
'All Category'에 해당되는 글 500건
- 2015.07.29 angular, http로 json가져오기.
- 2015.07.27 scala 동기화 에러 방지 예제
- 2015.07.22 scala 문법 요약
- 2015.07.20 java 7 nio2 + etc
- 2015.07.20 java 8 오픈
- 2015.07.18 Functional Programming How?
- 2015.07.10 특징
- 2015.06.29 node.js http/udp Server&client
- 2015.06.24 EOP
- 2015.06.16 SPA (single page application)
- 2015.06.11 keepAlive 스크립트
- 2015.06.09 vrrp 및 ping -b가 안될때
- 2015.06.08 Scala 특징
- 2015.06.03 디폴트 Xmx Xms 확인
- 2015.06.02 Service onStartCommand
- 2015.06.01 GC
- 2015.05.20 USIM
- 2015.05.20 PuID, PrID
- 2015.05.20 HSS
- 2015.05.20 커널 upgrade
- 2015.05.14 HP의 ILO
- 2015.05.06 Call Transfer종류 & Replaces
- 2015.04.30 Strict Route vs Loose Route
- 2015.04.30 hold flow & bearer open & field정리
- 2015.04.22 lsof
- 2015.04.22 XPath : 간단히 XML 파싱.
- 2015.04.22 java REGEX (regular expression)
- 2015.04.17 va_list 가변파라미터
- 2015.04.16 라우팅 설정.
- 2015.04.14 pthread
전통적인 consumer/supplier 예제를 간단히 변형해서
2개의 은행에서 각자 고객 수자를 관리하다가
전체 고객의 합을 구하는 형태를 문제가 있게 OLD한 방법으로 일부러 작성해보면 다음과 같다.
///////////////////////////////////////////////////////////////
class Bank {
var numKid:Int = 0
var numAdult:Int = 0
var numAged:Int = 0
def addNum (k:Int,a:Int,g:Int) = {
numKid += k
numAdult += a
numAged += g
Main.totalKid += numKid //no need on FP
Main.totalAdult += numAdult
Main.totalAged += numAged
}
}
////global FOR: Bank Sum total : OLD ///////////////
var totalAll:Int = 0 //NO NEED on FP
var totalKid:Int = 0
var totalAdult:Int = 0
var totalAged:Int = 0
// main
def main(args:Array[String]) = {
//// Bank Sum total :OLD ///////////////
val actorBank1 = actor {
val bank1 = new Bank
while (true) {
bank1.addNum(0, 1, 0)
Thread.sleep(10)
}
}
val actorBank2 = actor {
val bank2 = new Bank
while (true) {
bank2.addNum(2, 2, 1)
Thread.sleep(10)
}
}
//WHEN WANT TO PRINT
while (true) {
//SUM
Main.totalAll = Main.totalKid + Main.totalAdult + Main.totalAged //SUM
//NO MATCH?
if( totalAll != (totalKid+totalAdult+totalAged))
println("total:" + totalAll + ", Kid:" + totalKid + ", Adult:" + totalAdult + ", Aged:" + totalAged)
Thread.sleep(20)
}
이게 돌다보면 totalALL합이 맞지 않는 경우가 자주발생하도록 한 코드인데..
FP 스타일로 바꿔보면 다음과 같다.
================================> FP Style 로 전환
1. 가능하면 tuple을 이용
2. 전체적인 합 같은 totalAll 같은 변수를 아예 없앤다.
(그 외에 좀 더 sum2Bank같은 함수를 sum리턴안하게 좀 하고 싶은데.. 연구 중.)
class Bank {
var numKAG = (0,0,0)
def addNum (k:Int,a:Int,g:Int):Unit = {
numKAG = (numKAG._1 + k, numKAG._2 + a, numKAG._3 + g)
}
}
def sum2Bank (b1:Tuple3[Int,Int,Int], b2:Tuple3[Int,Int,Int] ) = {
val sum = ( b1._1 + b2._1, b1._2 + b2._2, b1._3 + b2._3 )
sum
}
def main(args:Array[String]) = {
//// Bank Sum total :OLD ///////////////
val bank1 = new Bank
val bank2 = new Bank
val actorBank1 = actor {
while (true) {
bank1.addNum(0, 1, 0)
Thread.sleep(10)
}
}
val actorBank2 = actor {
while (true) {
bank2.addNum(2, 2, 1)
Thread.sleep(10)
}
}
//WHEN WANT TO PRINT
while (true) {
//SUM
val sum = sum2Bank(bank1.numKAG, bank2.numKAG)
val totalAll = sum._1 + sum._2 + sum._3
//Always MATCH cause there is no toalALL variable
if( totalAll != (sum._1 + sum._2 + sum._3))
println("total:" + totalAll + ", Kid:" + sum._1)
Thread.sleep(20)
}
}
var (x,y,z) = (1,2,3) //튜플 선언
(1 to 5).map( 2 * ) // Vector(2,4,6,8,10)임. 2 * _ 에서 마지막에 _은 생략 가능
import java.util.Date //java도 import 해서 사용가능
1 :: List(2,3) // List(1,2,3) 과 동일 연결연산자cons
(1 to 5) // Range(1, 2, 3, 4, 5)
(1 until 6) // Range(1, 2, 3, 4, 5)
(1 to 10 by 2) // Range(1, 3, 5, 7, 9)
_ > 4 // v => v > 4 와 같은 predicate 임.
nio2 참고사이트: copy, move, readAllLines, Files.walkFileTree(Path, FileVisitor<T> ), WatchService,
기타7 문법 참고사이트:
1. try-with-resource,
File nFile=new File("abc.txt");
try ( InputStream in = new FileInputStream(nFile) ){
}catch (Exception e){
}
2. String in case,
case "abc":
그 외 될 뻔하다가 적용 안된 거.
A.(multi) catch (|),
B. ?(return null when null).
C.멀티Collection생성자, //ex: new ArrayList {"one", "two", "three"}; => 1.8에서도 안 됨.
java 5와 java8은 major release이다.
java 5에서 generic, concurrent, annotation, JMX, enum, boxing/unboxing, static import 등의 기능이 update되었다면
java8에서의 핵심update는 FP 이다. 참고사이트
1. <java.uitl.function 에 추가된 함수형 인터페이스>
- Function <T, R> - T를 입력으로 R을 출력으로 반환
- Predicate <T> - T를 입력으로 boolean을 출력으로 반환
- Consumer <T> - T를 입력으로 아무것도 반환하지 않는다
- Supplier <T> - 입력을 취하지 않고 T를 반환
- BinaryOperator <T> - 2 개의 T를 입력으로 하나의 T를 출력으로 반환
=> c++의 unary operator override수준이 아니라서 별로 쓸일 없어 보이지만..
minBy, maxBy는 사용하면 stream구문 없이 사용할 수 있어서 편할 듯 함.
REF
2. <java.util.stream>
- 배열,리스트,맵 등 Collection을 stream으로 다룰 수 있게 된다.
그리고
-interface에 abstract method뿐 아니라 body추가.
-OOM을 많이 유발하단 PermGen 이 사라짐.
- Date변환법이 좀 추가: LocalDateTime 과 Duration이 쓰기 좋겠네요. REF-SITE
<FP 기법>
1. carry Over : tail recursive 처럼 결과값을 계속 넘기는 방식. (carry Over: 그냥 영어임.)
2. predicate : 함수는 f()로 표현. Boolean을 리턴하는 함수는 predicate 이라고 부름.
(이것도 scala에선 그냥 영어임. java엔 Predicate존재)
=> p()를 이용해 함수 input param들을 필터처럼 거를 수 있음
<FP기법 예제 - 1.carryOver>
object Main{
def total(list: List[Int]) = { //기존 sum함수
var sum = 0
for (i <- list) { sum += i }
sum
}
def totalFP(list:List[Int]) = { //부분합을 계속 넘기면서 합을 해나가는 방식. foldLeft함수가 첫번째 param으로 carryOver로 계속 받아 주면서 iterate를 제공.
list.foldLeft(0) { (carryOver,v) => carryOver + v }
}
def main(args:Array[String]) = {
println(totalFP(List(1,2,3,4,5)))
}
}
<FP기법 예제 - 2.Predicate>
def totalFP(list:List[Int] , p:Int => Boolean) = {
list.foldLeft(0) { (carryOver,v) => if (p(v)) carryOver + v else carryOver }
}
def main(args:Array[String]) = {
println(totalFP(List(1,2,3,4,5),{ v => v % 2 == 0 })) //짝수인 2,4 만 적용되서 합이 6 이 나옴.
}추가적으로 v => v > 4 같은 predicate은 _ > 4 로 표시 가능
그리고 아래 3가지들이 scala에서 좀 특별하다.
trait - java의 Interface와 비슷하지만, class특성도 지님.
<trait특성 >
- extends 로도 with 로도 사용가능하다. 심지어는 구현body가 존재해도 된다.
- with의 경우에는 여러가지 trait가 사용가능하며, with A, with B의 경우 B가 먼저 적용된다.
- override abstract라는 키워드를 사용하여 기존 def를 추상화하여 사용할 수도 있다.
- Class 가 아니고 인스턴스에도 사용가능 : with Friends
xml - xml이 1등급 고객임. "" 필요없음
actor - thread + 큐 : 수천개의 actor를 만들어도 된다
자세한 건 여기클릭: hillarious indian guy
1. html tag에 ng-app 표시.
<html ng-app>
2. script 소스 삽입
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js">
</script>
여기에 있는 콜백이 html이 모두 로드된 후에, 브라우저로부터 호출되면
앵규러는 ng-app 지시어를 찾게 된다. 찾게되면 DOM의 최상위에 부트스트랩을 건다.
단계적으로 보면,
A.dependency injection을 위한 인젝터들이 생성되고
B. 인젝터는 root-scope를 생성하고
C. ng-app의 루토요소를 시작점으로 삼아 하위요소들을 컴파일한다.
3. ng 기본 문법 : 참고사이트Curran (10번 exam)
| |
<html ng-app> <head> <meta charset="utf-8"> | |
| <title>Angular.js Example</title> | |
| <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.min.js"></script> | |
| <script> | |
| function NameCtrl($scope){ | |
| $scope.firstName = 'John'; | |
| $scope.lastName = 'Smith'; | |
| } | |
| </script> | |
| </head> | |
| <body ng-controller="NameCtrl"> | |
| First name:<input ng-model="firstName" type="text"/> | |
| Last name:<input ng-model="lastName" type="text"/> | |
| Hello {{firstName}} {{lastName}} | |
| </body> | |
| </html> |
4. ng-repeat 예제
<script>
functin phoneListControler($scope)
{
$scope.phones=[
{"name":"Gal5",
"num":"010-2222-3333"
},
]
}
</script>
<body ng-controller="phonListController">
<div ng-repeat="phone in phones">
<p >이름: {{phone.name}} </p>
</div>
Click:초보자안내사이트들
<설치방법:install>
1. node-xx.linux-x86.tar.gz 바이너리파일 다운로드 http://nodejs.org/download
2. 압축풀고 README파일 참조. path와 lib path만 설정하면 될 듯한데.
# ln -s /usr/local/nodejs/v0.x.x/bin/node /usr/local/bin/node
<실행방법>
$> node httpSvr.js
<모듈 설치방법>
$ npm intall -g blabla (-g 안하려면.. httpSvr.js가 있는 곳에서 실행해야 그 밑에 node_modules 폴더가 생기면서 설치됨)
==httpSvr.js=====
==> express모듈을 사용하면 웹서버가 더 쉬워짐: 참고사이트
var http = require('http');
var server = http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type' : 'text/plain' });
res.end('Hello World');
});
server.listen(8000);
===udpSvr.js===========================================================
var PORT = 33333;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
server.on('listening', function () {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ":" + address.port);
});
server.on('message', function (message, remote) {
console.log('Svr Log:'+remote.address + ':' + remote.port +' - ' + message);
});
server.bind(PORT, HOST);
==udpClient.js==========================================
var PORT = 33333;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var message = new Buffer('My KungFu is Good!');
var client = dgram.createSocket('udp4');
client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
if (err) throw err;
console.log('UDP message sent to ' + HOST +':'+ PORT);
client.close();
});
scala로 EOP (Expression Oriented Programming)을 하기에 좋다.
http://alvinalexander.com/scala/best-practice-think-expression-oriented-programming-eop
SPA를 위한 여러가지 framework들이 있지만, framework없이 간단한 library로만
js SPA를 구현하는 방법이 있다.
http://tutorialzine.com/2015/02/single-page-app-without-a-framework/
handlebars.js 를 사용한다.
간혹 네트웍이 몇초간 접속 안하면
세션이 끊어지도록 구축된 경우가 있다.
이런 경우 네트웍이 끊어지지 않도록 계속 연결을 물고 있으면 편하므로
아래와 같은 sell script를 만들어 연결을 유지하곤 한다.
#!/bin/sh
while sleep 2; do
telnet server_ip server_port << EOF
quit (서버에서 결종료 명령어.. 없으면 안써도 될듯)
EOF
done
vrrp가 A/B 서버간에 메시지를 broadcating하는데
근래 OS들이 이 broadcast들을 default로는 막는 경우가 존재한다.
조치:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
<<
JAVA: bytecode는 interpre언어이나.. 실행시 JIT Compiler가 기계어로 바꿔서 실행하므로 compile언어라고 본다.
Scala는 이와 동일하게 javabytecode로 바꾸는 방식을 그대로 따르며, 완전한 java bytecode를 이용한다. >>
이름에서 나와있듯이 scalable한 언어이다.
아래 1번 scalable이 6번 안전성과 관계를 좀 더 살펴봐야 할 것 같은데
어쨌던 Functional 언어의 등장 자체가
multi-core에서 안전성을 가지기 위해서 이므로..
6번의 안전성을 기반으로 1번 확장성도 가지게 된다고 개인적으로 보고 있다.
<Scala의 특징>
1. scalable
2. pure Object-Oriendted (java는 primitive가 Object가 아님)
3. Functional 언어
- Assignment를 없애서, 참조투명성(REFERENTIAL TRANSPARENCY) 을 확보.
4. Java 호환.
5. 함수도 객체.
6. future-Proof
7.Fun
< 기본 문법>
def : function이나 method를 선언할때 사용
val : reasign이 불가능한 상수를 선언할때 사용
var: reasign이 가능한 변수를 선언할때 사용
exam )
def helloWorld = println("hello world.")
val foo: Int = 1
var bar = "test"
<case Class>
new 없이 쓸 수 있고, getter필요없이 바로 .value 로 access.
Several Example : http://alvinalexander.com/scala/
<Flat Map>
http://alvinalexander.com/scala/collection-scala-flatmap-examples-map-flatten
You can use the following command to find out the defaults on the system where your applications runs.
java -XX:+PrintFlagsFinal -version
Look for the options MaxHeapSize (for -Xmx) and InitialHeapSize for -Xms.
On a Unix/Linux system, you can do
java -XX:+PrintFlagsFinal -version | grep HeapSize
android로 간단한 서비스 구현시 필요한 건 다음 2~3가지 정도이다.
1. extends Service
2. onStartCommand (return START_STICKY)
3. onBind {return null;} ==>Bind형 서비스 용도 : AIDL과 함께 사용하는 참고 사이트
4. onDestroy
서비스에서 제일 중요한 함수는 onStartCommand라고 할 수 있는데
최초 실행시에는 onCreate->onStartCommand순으로 호출되고
실행중 재호출시에는 onStartCommand로 바로 호출되기 때문이다..
서비스의 onStartCommand에는 3가지 return type을 가질수 있다.
보통은 특정파라미터가 없다면, START_STICKY를 쓰면 된다. (자동 재구동)
|
|
GC(Garbage Collection)에는 serial방식과 Parallel방식이 있는데
single thread (32bit window)등 특수환경에서만 serial방식이 쓰이고, 대부분 Parallel 방식이 쓰인다.
serial방식의 경우, 어플리케이션을 freezing시켜 버린다.
GC의 중요한 2가지 기능별 분류:
CMS GC(concurrent-mark-sweep) :
- 동시에 여러Thread를 이용해서 mark하고 sweep.
- 일반적으로 STW(Stop-The-World)를 유발하지 않지만 아래2가지 경우 STW 발생가능..
a. Initial Root 마킹
b. 동작중에 앱의 heap 상태 변경으로 재구동 필요시
G1 GC(Garbage first Collector - JDK1.7u4 에서 4GB 이상 heap을 우선처리하기 위해 등장 함)
- JDK1.8u20 에서는 string dup제거 로직도 추가됨
추가로,
Java8에선 PermGen (class 메타데이타 저장소)가 없어짐. OOM을 많이 유발하던 부분임.
CMS GC의 버그는 1.7에서 해결되었으며,
G1 GC의 버그는 1.8에서 해결됨. : 슬라이드 30페이지
Public User ID: 국제적으로 통용하기 위한 ID로서, 공용ID인 만큼, 명함이나 출판물에 찍어서 교환해도 되는 고유Id이다.
tel Uri 혹은 Sip Uri로 표시한다.
- tel:+821012345678
- sip:john.doe@ims.korea.com
Private User ID: 통신사 내에서 쓰기위한 용도이다.
< Puid와 Prid의 관계 >
PuID는 폰마다 하나씩 존재해야 하지만,
PrID는 하나를 만들어 여러개의 폰에 공용으로 사용할 수 있다.
PrID는 sip:joe@mytelecom.com 형태로 쓰면 된다.
<GRUU>
폰을 위해 GRUU(Grobally Routable User agent URI)를 사용할 수 있으며
GRUU를 여러개 만들어서 폰하나에 GRUU 2개를 할당할 수도 있다.
즉 Phone1- GRUU1 - Puid1
- GRUU2 - Puid2
Phone2 - GRUU3 /
와 같은 형태로 다대다 매핑이 가능하다.
IMS의 기본 Invite Flow를 보면 다음과 같다.
Phone1-----> P-CSCF --> S-CSCF --> I-CSCF--> S-CSCF --> P-CSCF --> Phone2
|
|
V
HSS (레지된 S-CSCF 조회)
이 그림에서 HSS의 용도를 보면
I-CSCF가 HSS를 통해서 Phone2가 등록된 S-CSCF를 찾는다.
HSS: 사용자 마스터 DB이며, 사용자 인증/보안용 암호화, 호제어, 세션관리 등 모든 기능을 한다.
HLR: HSS의 일부로서 CS/PS도메인을 제공하는 역할.
-> VLR은 로밍전용 HLR이라고 보면 된다.
User Profile: 부가서비스만 별도로 빼서 작게 관리하기도 함.
CentOS 6.3을
커널 2.6.32-279에서 2.6.32-358.14.1 로 update해보았다.
일단 binary를 받을 수 있는 URL은
-기본 버전: http://vault.centos.org/6.4/os/x86_64/Packages/ kernel-xx-.14.1.el6.x86_64.rpm
-update 버전: http://vault.centos.org/6.4/updates/x86_64/Packages/ kernel-xx.el6.x86_64.rpm
최초에 기본버전이 나오고 마이너 update버전이 나오게 되므로
보통 update버전을 많이 설치하는 것으로 보인다.
kernel은 간단하게 rpm -ivh xx.rpm으로 설치가 된다.
하지만 dependecy문제가 발생하게 되므로
1. kernel-firmware-xx.xx 먼저설치
2. kernel-devel-xx.xx 설치
3. kernel rpm 설치.. 옵션을 --nodeps를 주면 dependency없이 설치 가능.
서버가 접속이 안될 경우를 대비해
HP에서는 ILO (Integrated Light Out) 기능을 제공 한다.
독립적인 Ethernet포트를 이용해
OS에서 사용하는 것과 다른 IP어드레스와 user/비번을 제공한다.
1. ssh 터미널로 초기접속하게되면 아래와 같은 커서가 뜨게 된다.
=====================================
</>hpiLO->
2. 웹브라우저로 https://서버IP 로 접속하면
웹기반 GUI가 제공된다.
==> 접속후 보통 Remote Console (IRC)로 파워 on/off, OS설치, keyboard 입력 등의 작업을 한다.
IRC를 뛰우면 OS 로그인 prompt가 기본적으로 뜨고.. 상단메뉴에 PowerSwitch / Virtual Drives / Keyboard 가 존재한다.
Call Transfer에는 다음과 같은 3가지 종류가 있다.
1. Blind Transfer
- 제 3자 상태의 확인 없이 무조건 돌려주기
2. UnScreened Transfer
- 제3자에게 통화를 해보고 신호가 가는지 확인해서 돌려주기
3. Screened Transfer
- 제 3자와 통화를 직접해서 돌려주겠다고 말까지 한 후, 돌려주기.
<구현 방식>
1. Blind Transfer
- IP-PBX가 REFER메시지를 처리하는 방식이 일반적인 것 같고,
A단말에서 REFER를 처리하는 방법도 있다.(단말이 REFER지원해야 함)
2. (Un)Screened Transfer
- IP-PBX가 INVITE(with REPLACES)를 보내는 방법도 있고
IP-PBX에서 ReINVITE만을 사용하는 방식도 있다.
<Invite with REPLACES 예제>
Alice Alice Parking
phone1 phone2 Bob Place
| | | |
|<===============================>| |
| | | |
| Alice transfers Bob to Parking Place |
| | | |
|------------REFER/200----------->| *1 *2 |
|<--NOTIFY/200 (trying)-----------|--INVITE/200/ACK-->|
|<--NOTIFY/200 (success)----------|<=================>|
|------------BYE/200------------->| |
| | | |
| | | |
| Alice later retrieves call from another phone |
| | | |
| *3 |-INV w/Replaces->| |
| |<--200-----------| |
| |---ACK---------->|----BYE/200------->|
| |<===============>| |
| | | |
Message *1: Bob-> Parking Place
INVITE sip:parkingplace@example.org SIP/2.0
To: <sip:parkingplace@example.org>
From: <sip:bob@example.org>;tag=7743
Call-ID: 425928@bobster.example.org
CSeq: 1 INVITE
Contact: <sip:bob@bobster.example.org>
Referred-By: <sip:alice@phone1.example.org>
Message *2: Parking Place -> Bob
SIP/2.0 200 OK
To: <sip:parkingplace@example.org>;tag=6472
From: <sip:bob@example.org>;tag=7743
Call-ID: 425928@bobster.example.org
CSeq: 1 INVITE
Contact: <sip:parkplace@monopoly.example.org>
Message *3: Alice@phone2 -> Bob
INVITE sip:bob@bobster.example.org
To: <sip:bob@example.org>
From: <sip:alice@phone2.example.org>;tag=8983
Call-ID: 09870@phone2.example.org
CSeq: 1 INVITE
Contact: <sip:alice@phone2.example.org>
Require: replaces
Replaces: 425928@bobster.example.org;to-tag=7743;from-tag=6472
<SIP 메시지 포맷>
INVITE <sip:Request URI>
Via:
Route: 처음에는 UE가 P-CSCF 주소를 넣음.<1차 경유지>
나중에는 UE가 Record-Route에서 읽은 걸 여기다 넣어 줌.
(요즘 다 Loose Route 방식임)
<Route 방식 비교>
Strict Route: <RFC2543>
Requset-URI가 항상 next-hop을 지니는 방식으로 매번 Request-URI를 overwrite하게 됨.
따라서, 진짜 Request-URI는 마지막 Route에 적어줘야 함.
Loose Route: <RFC3261>
Request-URI는 항상 그대로 이며,
최상 Route로 무조건 전달. ==> Request-URI가 다음 목적지가 아니라는 점에서 큰 변화였음.
(Strict Route를 Loose Route로 바꾸는건 backword compatibility 유지하기에는 오버헤드가 큼)
<통화 중 HOLD>
hold기능이 볼때마다 헤깔려서, 잊지 않기 위해서 정리해 보면
A-B단말이 통화중에
1.A가 invite(sendOnly)를 올리면 MS(미디어서버)가 이를 받아 B로 invite(sendOnly)를 보내고
2. B는 invite(recvOnley)로 응답.
3. MS가 A로 recvOnly응답
최종적으로는 A는 MS에다가 말하는 구조가 되고
MS는 B로 음악(hold음)을 틀 수 있는 구조로 된다.
<Bearer open>
BS(Bearer Service) 오픈: P-CSCF가 P_CRF로 요청하면 P_CRF가 AccesS GW의 BS Manager를 통해
단말의 BS Manager같 통신해서 IP-CANnectivity가 연결됨.
<Invite의 각종 필드>
-Privacy: id 이면 발신자표시 금지, 로서 P-Asserted-Identity ( P-CSCF 에서 세팅 )를 상대 단말로 보낼 수 없다
-일반적으로 Reinvite는 to태그가 달라야.. 미디어갱신이 됨 (최근 많이 사용되는 아프로텍 단말은 제외)
Via : Response가 정확하게 trace-back되도록 지나간 경로를 그대로 기록. - 히스토리라서 CSCF들 다기록.
Record-Route : Request가 빠르게 따라가도록 Route경로를 기록.
CSCF들은 Via와 Record-Route를 같이 add함. (I-CSCF는 Via만 기록. Record-Route는 제외..
I-CSCF는 서치만 하고 서치가 끝난게 실제 기록된 Route임.)
Serivce-Route: REGI된 S-CSCF를 S-CSCF가 직접 200 OK에 적어 줌. (UE가 기록해 뒀다가 Invite시에 Route에 직접 이용한다는데..
P-CSCF가 자기주소를 기록하는 Path와 반대 )
Contact: UE간 직접 SIP 접근하기 위함. ( SDP의 C[커넥션 IP]과 차이점은 없나? - 같겠지만 미디어는 주로 C를 사용할 듯. )
그 외에도 callee audio/video카파 및, I-CSI , temp- GRUU , IARI(MMTel-ICSI)
ㅁ ICSI (IMS - Communication Service Identification), IARI (IMS-Application Reference Indentification),
Accept-Contact: 발신자의 Preference.
ICSI가 P-Preferred-Service헤더에 있을 경우, S-CSCF가 이걸 P-Asserted-Service로 치환.
I-CSCF는 LIR(diameter Location Info Request)을 통해 HSS를 직접 조회. (HSS가 2개이상인 경우에는 SLF도 필요)
list of Open File. 특정파일을 access하고 있는 프로세서들을 나열한다.
예)
$lsof mylogfile
$lsof /proc
XML파싱 방법에는 문서전체를 로드해서 하는 DOM방식과, 문서를 순차적으로 읽으면서 하는 SAX(Simple Api 4 Xml)방식이 있다. 참고사이트
JDom등의 별도 라이브러리를 쓰는 경우도 있지만,
내장된 XPath가 워낙 간단해서 입문자는 무조건 이방식으로 하면 될 것으로 보인다. 이 XPath는 기존의 DOM 방식이나 SAX방식이 아닌
XDM(Xml Data Model)방식으로 불리는데, 굳이 Dom/SAX와 비교하자면 Dom방식에 약간 더 가깝다고 볼 수 있을 것 같다.
<사용방식>
//어딘가 Web에 연결해서
HttpURLConnection con = (HttpURLConnection)apiUrl.openConnection();
con.setRequestMethod("GET");
//using XPath 로 파싱.
InputSource is = new InputSource( new InputStreamReader(con.getInputStream()));
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(is);
XPath xpath = XPathFactory.newInstance().newXPath();
zone = (String)xpath.evaluate("/result/zoneName", doc, XPathConstants.STRING);
String offTime = (String)xpath.evaluate("/result/gmtOffset", doc, XPathConstants.STRING);
time = timeAdd(timeCords[0], offTime);
1. 몇가지 Regex 샘플.
A."no it's all right lag" 제거 => str.replaceAll ("no (.*)lag", "A")
B. "Availability in 20 days"; 20만 발췌 => str.replaceAll("\\D+", "");
2. json 을 파싱할 때, 필요한 Regex 2개이다. (\=역슬래쉬)
String normal = json.replaceAll("[{\"}]", ""); //remove {,", }
String[] kvset = normal.split(",\\s*"); //split with , and * means space exist or not
표현식 | 설명 |
^ | 문자열의 시작 |
$ | 문자열의 종료 |
. | 임의의 한 문자 (문자의 종류 가리지 않음) 단, \ 는 넣을 수 없음 |
* | 앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없거나 하나있음 |
[] | 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다. |
{} | 횟수 또는 범위를 나타낸다. |
() | 소괄호 안의 문자를 하나의 문자로 인식 |
| | 패턴 안에서 or 연산을 수행할 때 사용 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | 숫자 [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자 |
\ | 정규표현식 역슬래시(\)는 확장 문자 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미 |
(?i) | 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
가변 파라미터를 받아서 사용하는 방법: (vprintf로 출력가능 한데)
=> 약간 변조하고 싶을 때에는 vsprintf를 사용하면 된다...
#include <stdarg.h>
void logPRINTD(const char* format, ...){
char str[512];
va_list args;
va_start(args, format);
vsprintf(str, format, args); //str로 옮기기
strcat(str,"\n"); ///////////////////// str에 \n 더하기
va_end(args);
//str로 하고싶은일 하기. bla bla
}
리눅스에서 실제 라우팅이 되는지 체크하는 명령어는
$traceroute 123.45.123.45 이다.
라우팅이 안되어 있다면
$route add -net 125.159.63.14 netmask 255.255.255.255 gw 14.63.134.254 dev eth4 명령으로 추가가능.
삭제시에는
$ route del -net 118.49.2.0 netmask 255.255.255.0 명령어로 사용.
라우팅 테이블 확인은
$route 명렁어이다. 추가와 삭제 후에 이 명령어로 확인하면 된다.
(맥북에서는 $netstat -nr 이 비슷하네요)
=====껐다켜도 되게 하려면 아래 정보 추가=================
/etc/sysconfig/network-scripts/route-eth4
ADDRESS0=14.63.237.0
GATEWAY0=10.217.80.1
NETMASK0=255.255.255.0
참조: http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Beginning/PthreadApiReference
Thread의 상태:
PTHREAD_CREATE_JOINABLE : 다른 thread끝나고 동작하는 thread. (exit나 join을 호출을 통해서 자원을 반납해야 하는 thread.)
PTHREAD_CREATE_DETACHED : 독립적으로 동작하므로 종료시점 체크필요없고, 종료시 자동자원반납.
<구조체>
typedef long pthread_t;
struct pthread_attr {
void *stackaddr;
size_t stacksize;
int detachstate;
struct sched_param param;
int inheritsched;
int contentionscope;
};
typedef struct pthread_attr pthread_attr_t;
#define PTHREAD_CREATE_JOINABLE 0 #define PTHREAD_CREATE_DETACHED 1
<예제 - 심플 detatched thread 생성. >
pthread_t id;
pthread_attr_t attributes;
// initialize thread attributes
pthread_attr_init(&attributes)
pthread_attr_setdetachstate( &attributes, PTHREAD_CREATE_DETACHED);
//create a new thread
pthread_create( &myId, &attributes, startFunc, args); //args는 startFunc로 전달.
pthread_attr_destroy(&attributes); //자원해제



