윈플

제2외국어 +90

일반적으로 Linux 에서는 명령어 : md5sum a.txt 를 통해 체크섬을 구한다.

갑자기 다른 OS에서 체크섬을 구할 때 md5sum 명령어가 동작하지 않아 정리함.

 OS

명령어 

Linux 

md5sum 파일명 

AIX 

csum -h MD5 파일명 

HPUX 

openssl
OpenSSL>md5 파일명 

Solaris

digest -l (리스트 확인 후)
digest -a md5 -v 파일명

(+) Solaris 에서 digest -l 에서 정상적으로 나오지 않는 경우

ex) digest: failed to initialize PKCS #11 framework: CKR_GENERAL_ERROR

1. cryptoadm start 
2. digest -l (정상 동작)

참고 : https://www.oracle.com/technetwork/server-storage/solaris10/documentation/819-3164-150185.pdf

Comment +0

error: conversion from ‘uint64_t {aka long unsigned int}’ to ‘QVariant’ is ambiguous

또는 Conver int64 to QVariant 관련 이슈


> int64 변수를 QVariant 형으로 반환할려고 할 때 위 에러가 발생.


참고 링크 : https://stackoverflow.com/questions/24260034/how-to-convert-an-unsigned-long-int-to-qvariant
위 URL를 보면 오직 long 타입에서 해당 문제가 발생한다고 하는데... 암튼 해결책이 필요했다.


구글링을 좀 더 열심히 해본 결과!

QVariant::fromValue( 변수 ); 을 통해 해결


http://doc.qt.io/qt-5/qvariant.html

여기에서 fromValue 에 대한 좀 더 자세한 설명을 확인 가능.


Comment +0

Fedora 설치 후 파일 확인하는 작업 중에 시간이 맞지 않은 부분이 있었습니다.

timedatectl  status 명령어를 통해 확인한 결과 Time zone이 한국이 아니라 다른 곳으로 되어 있는걸 확인

   Local time: Mon 2017-03-20 17:51:03 EDT

  Universal time: Mon 2017-03-20 08:51:03 UTC

        RTC time: Mon 2017-03-20 08:51:03
       Time zone: America/New_York (EDT, -0400)
   Network time on: yes
  NTP synchronized: yes
      RTC in local TZ: no 


EDT → KST (Korea) 로 변경합니다.
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime 

다시 명령어 timedatectl  status 로 변경된걸 확인합니다.

  Local time: Mon 2017-03-20 17:51:03 KST

  Universal time: Mon 2017-03-20 08:51:03 UTC

        RTC time: Mon 2017-03-20 08:51:03
       Time zone: Asia/Seoul (KST, +0900)
   Network time on: yes
  NTP synchronized: yes
      RTC in local TZ: no 

시간 설정완료.


(+) 다른 Timezone 리스트를 확인하기 위해서는 timedatectl list-timezones 명령어를 사용하면 됩니다.


참고했던 URL 입니다.
구글 키워드 : fedora time sync
http://www.tecmint.com/set-time-timezone-and-synchronize-time-using-timedatectl-command/

Comment +0

가끔씩 빈파일을 만들 필요가 있기 때문에 기록합니다.


[Windows OS]

1. cmd 관리자권한으로 실행
2. fsutil file createnew 파일명 크기[byte]
ex) fsutil file createnew C:\data\test.txt 1024000000
--> test.txt 약 1GB 가량의 txt 파일이 만들어짐

[Linux OS]

1. root 권한으로 실행
2. dd if=/dev/zero of=/파일명 bs=1024 count=102400
ex) dd if=/dev/zero of=/tmp/test.txt bs=1024 count=102400
--> /tmp/test.txt 1GB 파일이 만들어짐



'제2외국어 > 알고가자.' 카테고리의 다른 글

빈용량 파일 만들기(Windows / linux)  (0) 2017.02.28
(tip)정규식  (0) 2013.02.27
OS X Lion Server 사용해보기..  (0) 2012.07.06
[소스관리]VSS, CVS, SVN!  (0) 2012.04.05
Visual Concept?  (0) 2012.03.26

Comment +0

<상황>

QT Creator(4.1.0)가 업데이트된지는 오래되었는데 귀찮아서 미루다 미루다 결국 재설치를 하였습니다.
예전에 만들어놓은 프로젝트를 새로 설치한 QT Creator에서 열어서 확인을 하는 중에 기존에 사용 중이던 Header를 제대로 읽지 못 하는 문제가 있었습니다.


Compile, Run 하는데 문제는 없지만 코드를 짤 때 자동완성 기능을 사용할 수 없는 치명적인 문제!


ex)

#include <QDialog>
#include <QWidget>

이런 기본적인 Header 파일들조차 인식하지 않아서 여러가지 시도를 해보다가,
새로운 프로젝트를 하나 생성 후에 확인 해보니 또 제대로 작동이 되어서 차이점을 찾는 중에 .pro 파일에서 차이점을 찾았습니다.

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

기존 프로젝트 .pro 파일에는 없는 한 줄이 새롭게 만들어진 프로젝트 .pro 파일에 있었는데요 


제가 Qt-4에서 작업 중이 었기 때문에 새롭게 설치한 Qt-5에서 해당 헤더파일들을 제대로 가져오지 못 해서 문제가 발생한 것으로 보여집니다.
Qt-5 Doc : http://doc.qt.io/qt-5/gettingstartedqt.html 에서 확인해도 같은 줄이 들어가 있습니다.



1) 직적 Qt 버전을 설정해주는 방법

QT_VERSION = 5   # this can be 4, set manually

equals(QT_VERSION, 5){
   QT += widgets
}
equals(QT_VERSION, 4) {
   QT += gui
}

2) 자동으로 Qt 버전을 설정하는 방법

greaterThan(QT_MAJOR_VERSION, 4) {
    QT += widgets
} 

참고한 URL : http://stackoverflow.com/questions/18663331/how-to-check-the-selected-version-of-qt-in-a-pro-file



결과적으로 위 두 방법 또는 Qt-5 공식 사이트에서 적혀있는


greaterThan(QT_MAJOR_VERSION, 4): QT += widgets


한 줄을 문제가 발생한 프로젝트의 .pro 파일에 추가한다면 이제 자동완성 기능을 사용하실 수 있습니다. 
(정상적으로 헤더파일을 읽을 수 있기 때문에...)
Success.


Comment +0

QString을 사용하면서 많이 사용되었던 부분들 정리합니다.
계속 추가해 나가겠습니다.


1. QString conver to char*

: 작업할 때 은근히 C라이브러리들이 많아서 C소스에서 QT로 사용할 때 또는 반대로, QString를 char* 로 변환하는 경우가 빈번히 발생
 QString의 자체 함수만으로는 제대로 안 되는 경우가 발생해서 찾아봤습니다.

- QString 의 자체 함수를 사용하는 방식

QString qstrTest = "test";
char *chrTest = qstrTest.toStdString().c_str();


- QByteArray를 사용하는 방식(1)

QString qstrTest = "test";
QByteArray byteArray = qstrTest.toUtf8();
const char *chrTest = byteArray.constData();


- QByteArray를 사용하는 방식(2) 

QString qstrTest = "test";
QByteArray byteArray = qstrTest.toLocal8Bit();
char *chrTest = byteArray.data();

참고 URL : http://doc.qt.io/qt-4.8/qstring.html
Keyword : Converting Between 8-Bit Strings and Unicode Strings

 QString provides the following four functions that return a const char * version of the string as QByteArraytoAscii(),toLatin1(), toUtf8(), and toLocal8Bit().

  • toAscii() returns an 8-bit string encoded using the codec specified by QTextCodec::codecForCStrings (by default, that is Latin 1).
  • toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string.
  • toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a superset of US-ASCII (ANSI X3.4-1986) that supports the entire Unicode character set through multibyte sequences.
  • toLocal8Bit() returns an 8-bit string using the system's local encoding.

To convert from one of these encodings, QString provides fromAscii(), fromLatin1(), fromUtf8(), and fromLocal8Bit(). Other encodings are supported through the QTextCodec class. 


2. QString 에 들어있는 문자열의 라인수 확인하기

: 파일에 있는 데이터 또는 여러 문자열을 합치는 경우 등 QString 안에 있는 문자열의 Line 수를 체크할 필요가 있을 때 사용


- QStringList 와 split를 활용한 콤비네이션!

QString qstrTest = readFile(Path);                    // 특정 함수를 통해 파일을 읽어들인다고 가정 QStringList qstrList_Lines = qstrTest.split('\n');    // QStringList 를 통해 '\n' 기준으로 위에서 읽어들인 문자열을 자릅니다! qDebug() << qstrTest;                                 // 문자열 확인 qDebug() << "Count : " << qstrList_Lines.count();     // '\n' 으로 제대로 잘려져있는지 확인

for(int i=0; i<qstrList_Lines.count(); i++)

{

qDebug() << "[" + i + "] " + qstrList_Lines.at(i);         // 기존 문자열과 비교해보기

}



Comment +1

moc_classname.cpp:(.text+0x31): undefined reference to `classname::functionname()'
collect2: error: ld returned 1 exit status
Makefile:191: recipe for target 'project_name' failed


해당 함수가 .h 선언되었지만 실제 .cpp에서 정의되지 않아서 생긴 문제였다.
빠른 해결 다행;;

Comment +0

리눅스 + QT로 코딩을 할 때, 아무생각 없이 파일 관련된 부분들을 다 .sh 파일로 만들어서 구현을 했습니다.
system()을 사용하면 결과값을 알 수 없기 때문에 QProcess 를 사용해서 .sh 스크립트로 결과값 받는 방식

일단 system()을 너무 많이 사용하는 것도 좋은건 아니지만 무엇보다 파일이 단순히 있는지 없는지 확인할 때,

ls, ll + grep 명령어를 통해 확인하는 방법보다는 access() 또는 qt에서 제공하는 라이브러리를 사용하는 방식이 더 좋다고 합니다.
( ls, ll + grep을 통해 확인 시에는 해당 파일의 쓸데없는 정보까지 얻어오는 과정이 포함되기 때문에 ... )


예를들어 /home/file.txt 파일을 확인합니다.

1. access() 

if( 0==access("/home/file.txt",0))
{
       qDebug() << "existed";


2. QFile을 사용한 방법

QFile file("/home/file.txt"); 

if( file.exists() )
{
       qDebug() << "existed";       


파일 삭제도
rm 명령어를 쉘스크립트로 사용하는 방법보다는 자체 라이브러리를 사용하자.

if( file.remove() )
{
       qDebug() << "removed";
}


기억용으로다가 정리.

Comment +0

우분투 데스크탑 14.04 버전을 설치 후,

커널 4.x.x 을 올리는 과정 중에 make modules_install 시에 발생한 메시지입니다.



Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.



해당 메시지를 무시하고 부팅하는 경우엔

update-grub가 제대로 되지않았기 때문에 부팅이 제대로 되지 않습니다.


+ 커널을 올리는 과정 중 'make modules_install or make install' 에는 update-grub 과정이 포함되어 있습니다.


해당 문제는 메시지 그대로 /etc/default/grub 에서


GRUB_DEFAULT="0"
GRUB_HIDDEN_TIMEOUT="0"
GRUB_HIDDEN_TIMEOUT_QUIET="true"
GRUB_TIMEOUT="10"
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

밑줄친 GRUB_HIDDEN_TIMEOUT 옵션과 GRUB_TIMEOUT 옵션을 동시에 사용할 수 없기 때문에 발생한 메시지.

둘 중 하나의 옵션을 #으로 주석처리 해준후  update-grub 또는 make module_instll 을 다시 해준다면 해당 메시지 없이 부팅도 

정상적으로 됩니다.



**2016, GRUB2 이후부터 

GRUB_HIDDEN_TIMEOUT

GRUB_HIDDEN_TIMEOUT_QUIET

위 두 옵션이 GRUB_TIMEOUT_STYLE=[menu|countdown|hidden] 로 대체되었다고 합니다.


참고 URL : http://askubuntu.com/questions/475993/grub-update-warning-in-ubuntu-14-04

Comment +0

윈도우7에서 삼바로 네트워크 스토리지를 연결해서 사용할 때, 

연결된 후에 안에 내용물이 바로 안 보여지는 문제가 있습니다. 


보통 파일을 새로 생성하거나, 로그인 창을 통해 접속할 경우(즉, 자격증명이 활성화 되어 있지 않은 경우)에 바로 보여지지만 분명히 불편한 사항입니다.


해당 이슈로 구글링을 해보니, 
http://serverfault.com/questions/482174/slow-shared-folder-refresh-on-windows-7
https://technet.microsoft.com/ko-kr/library/ff686200(v=ws.10).aspx

마이크로소프트에서도 권장사항으로 되어있었습니다.
아래는 마이크로소프트 URL의 마지막 부분을 복사붙여넣기 했습니다.



권장 사항

리디렉터의 메타데이터 캐싱이 응용 프로그램 오동작의 원인으로 의심되는 경우 다음과 같은 순서로 캐시를 사용하지 않도록 설정하여 응용 프로그램에 영향을 미치는 캐시를 확인합니다. 파일 정보 캐시를 사용하지 않도록 설정하면 클라이언트 성능에 심각한 영향을 미칠 수 있으며 서버에 전송되는 메타데이터 요청의 수가 증가할 수 있습니다.

  1. 디렉터리 캐시, DirectoryCacheLifetime을 0으로 설정합니다.

  2. 파일을 찾을 수 없음 캐시, FileNotFoundCacheLifetime을 0으로 설정합니다.

  3. 파일 정보 캐시, FileInfoCacheLifetime을 0으로 설정합니다.


[해결책]

레지스트리(regedit)에서 HKLM SYSTEM\CurrentControlSet\services\Lanmanworkstation\Parameters 에서 위 항목들을 새롭게 추가시켜줍니다.

ps. 꼭 윈도우7에서 한정되서 발생한 이슈가 아닌것 같습니다. 

Comment +1

Linux-Ubuntu에서 사용된 하드웨어 정보 얻는 명령어

Driver 정보얻기

lspci -k


1. 메인보드 
전반적인 정보 : dmidecode -t baseboard
제조사 : dmidecode -s baseboard-manufacturer
제품이름 : dmidecode -s baseboard-product-name

2. CPU 정보
dmidecode -s processor-Version

3. 그래픽카드
lspci | grep VGA

4. 메모리 
cat /proc/meminfo | grep MemTotal
free | grep Mem

5. 하드디스크 정보
fdisk -l

6. 네트워크 카드
lspci | grep Ethernet 또는 lspci | grep Network

Comment +0

UEFI 방식으로 Windows 설치 시,

자동으로 생기는 Windows Boot Manager 


MBR방식으로 다시 윈도우를 설치해보거나,
Linux로 부팅해서 GPT 파티션 정보를 지워도 보고
Windows 설치 시 [shift+f10] -> diskpart -> clean all 로 파티션 정보를 날려보와도 사라지지 않고

msconfig에 boot manager에 대한 정보도 표시되지 않아서 어떻게 지우나 했는데.


고민하던 찰나 Bios Update를 통해 해결.


Comment +2

  • 으악 2016.08.12 05:03

    저도 동일한문제로 고생중이네요.. 바이오스를 초기화해도 업데이트해도 해결이안되서 화나죽겠어요

    • 혹시 msconfig로 시스템 구성->부팅에 들어가셔도 표시안되시나요?
      그러면 최종적으로 bcdedit 하는 방법이 있는데... 여기 한번 가서 봐보세요
      http://poeta.tistory.com/68

make 컴파일을 할 때 -j 옵션을 통해 속도를 향상 시키는 방법이 있습니다.

example) make -j [CPU Core 수 * 2] 
(CPU Core가 8일 경우 16)

CPU Core 수를 확인하는 방법

1. nproc

2. lscpu


3. less /proc/cpuinfo

: lscpu 명령어보다 더 자세히 나옮니다.

끝.


Google Search : Ubuntu CPU Core count
참고 : http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

Comment +0


1. isset변수에 값이 존재하고, NULL 이 아닌지를 확인.
             
변수가 존재하고 NULL 이 아닌 값을 가지고 있으면 TRUE를 리턴합니다.
             그 외에는 FALSE를 리턴합니다.

- bool isset()

2. empty : 변수 비어있는지 확인.

- bool empty()

3. is_null : 변수가 NULL인지를 확인

- bool is_null()

4. unset 변수를 제거

- void unset()




'제2외국어 > PHP' 카테고리의 다른 글

[php]isset, empty, is_null, unset 함수  (0) 2014.12.12
[php]파일을 문자열로 읽기.  (0) 2013.08.07
[php]mySQL 사용  (0) 2013.04.03
간단한 PHP문법  (0) 2013.04.02

Comment +0

apt-get install 을 사용하기 위해서 apt-get update(apt-get list를 최신으로 바꾸는 작업)해야 하는데

가끔씩 오류가 나는 경우가 있습니다.

" Failed to fetch URL~"


해당 미러 서버를 교체

vi /etc/apt/sources.list

[Find/Replace] 명령어 사용하기
- %s/ftp.daum.net/ftp.neowiz.com/g
%s/ftp.daum.net/in.archive.ubuntu.com/g

ftp.daum.net  -> ftp.neowiz.com -> in.archive.ubuntu.com

위 순서대로 바꿔보시길 바랍니다.


만약에 3개가 모두 안 된다면!

ping or host 명령어로 인터넷 DNS 서버가 제대로 작동되는지 확인해야 합니다.

ping or host URL 명령어시 Unknown host 시에는 
vi /etc/resolve.conf 에서

nameserver 8.8.8.8
nameserver 8.8.4.4

추가한 후에 
/etc/init.d/networking restart
네트워크 설정을 적용하고 다시 ping or host 명령어 확인 후 해보시길 바랍니다.


Comment +0

인터넷 설정하기 위해서 수정해야할 곳
/etc/network/interface


auto eth0
iface eht0 inet static

ADDRESS ~
NETMASK ~
GATEWAY ~
DNS-NAMESERVERS ~

인터넷 확인하기
ifconfig [옵션 -a]

장비 올리기
ifup eth0 
or
ifconfig eth0 up

장비 내리기
ifdown eth0 
or
ifconfig eth0 down


위 명령어로는 장비를 올리고 내리기만 하지 interface에 있는 내용을 업데이트 하지 않기 때문에
서비스를 재시작 해야 한다.
/etc/init.d/networking restart

그리고 ping 명령어로 인터넷 확인하기 끝.


ping URL 명령어시 Unknown host 시에는 
vi /etc/resolve.conf 에서

nameserver 8.8.8.8
nameserver 8.8.4.4

추가 후에
/etc/init.d/networking restart 
다시 ping 명령어 확인.


+ 인터넷 Rule 파일 위치
/etc/udev/rules.d/~-net.rules 파일이 인터넷 설정 정보를 가지고 있다.



Comment +0

우분투를 설치한 후.

부팅이 안 되는 경우가 있습니다.
이럴때는 그래픽 카드를 빼고 내장 그래픽 카드로 부팅을 했는데 된다면,
그래픽 카드가 원인이라는걸 알 수 있습니다.


1. BIOS 업데이트.
2. 해당 그래픽카드 업데이트.
3. 해상도 변경.
등 여러 방법을 시도해봤지만....  되지 않았지만 찾아냈습니다.


그래픽 카드를 빼고 부팅을 하시던지, 아니면 그래픽 카드를 낀 상태에서 리커버리 모드에서 부팅을 합니다.

grub 설정을 수정합니다.

/etc/default/grub 에서 부팅에 

vi /etc/default/grub


GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"

qw로 저장한 후

grup-update 로 설정을 업데이트 하고 재부팅.

결과를 확인해봅시다.


Comment +1


iOS 7으로 업데이트 되면서 추가된 기능과 새로운 등록과정이 생겼습니다.
공부할 꺼 및 업데이트 해야할 것들 ㅠ


Device Enrollment Program
: 이전 방식이 BYOD( Bring Your Own Device)를 위한 거였다면, 새로운 등록 방식은 회사에서 지급하는 폰을 위한 방식입니다.
( 시대에 역행'?' 하는 것 아닌가라는 생각도 들긴하는데 해당 케이스가 많았기 때문에 선택한 것 같습니다. )

[ Flow ]
- 기업이 Apple에게 폰을 구매
- 해당 폰(갯수에 상관없이)을 일괄적으로 등록을 해줍니다.
- MDM(Third-party) 서버는 이미 등록된 디바이스를 Web Service를 통해 사용하면 됩니다.


( 프로파일을 통해 등록하는 과정이 없어진건 아니고, 새로운 방법이 추가 된것 뿐입니다. )

[ 장점 ]
- 어떻게 보면 프로파일 설치하여 MDM 서버에 등록하는 과정이 필요없이, Apple에서 일괄적으로 해주기 때문에 간편합니다.
- 모든 장비는 supervised 상태입니다. ( Apple Configurator를 통해서만 가능했던 부분. )
- 실제로 크롬의 확장 프로그램 ( OAuth, Advanced Rest Client )를 통해 테스트 해봤는데 정말 간단합니다.

WWDC에서 발표했던 문서에서 크게 달라진건 없어보입니다.

Managed App Enhancements

• Silent installation

• App configuration

• App feedback

• Managed Open In


Single Sign On

• Generalize use of credentials across system

■ Stored in one place

■ Used for multiple apps

• Credentials

• Matching URL prefixes

• Allowed app identifiers


Per-app VPN

• Individual apps can establish VPN to remote services

•More focused than system-wide VPN

■ Secure data always goes through your network

■ End user data does not go through your network

• Managed apps configured during installation


FileVault ( Mac )

• Prevent users from disabling FileVault

• Individual recovery key escrow

■ https:// URL destination for recovery key

■ PKCS1 certificate payload to encrypt recovery key

■ Must be in a system profile

■ Only one payload per system

• Institutional recovery key rotation


AirPlay Mirroring
• Command

■ Begin mirroring to a destination

• Payload

■ Destination whitelist

■ Destination passwords


제가 참고한 사이트입니다.
- 프로토콜 문서는 Enterprise Program을 가입하시면 다운받으실 수 있습니다.

iOS 7: What it means for Enterprise, Education, and Government
MobileIron 
Air-Watch



'제2외국어 > iOS Enterprise.' 카테고리의 다른 글

iOS 7 MDM features.  (5) 2013.10.03
MDM vendor CSR signing  (0) 2012.08.07
Configuration Profile ??  (0) 2012.08.07
Apple Push Certificate Portal.  (0) 2012.07.20
[iOS] Mobile Deviec Management, MDM에 관해  (0) 2012.02.14

Comment +5

자신이 만들 앱이 인터넷을 사용한다면, 인터넷이 연결되었는지를 확인하여 사용자에게 알려야합니다. 
그리고 Web Application을 생각 중이시라면, 중간 중간 Loading 부분을 인디게이터로 표현해주어야 하며,
에러에 관련된 처리는 당연한 부분입니다.

그래서 이번엔 인터넷 상태를 확인하고, 인디게이터는 언제 애니메이션을 키고 꺼야 되는지, 그리고 에러 처리는 어떻게 해야하는지 정리해봤습니다.


1. 인터넷 연결 상태 확인하기.

***Reachability

The Reachability sample application demonstrates how to use the SystemConfiguration framework to monitor the network state of an iOS device. In particular, it demonstrates how to know when IP can be routed and when traffic will be routed through a Wireless Wide Area Network (WWAN) interface such as EDGE or 3G.

: 쉽게 말해 'SystemConfiguration' framework 사용하여 인터넷 상태를 알려주는 샘플코드 되시겠습니다.


먼저 이 샘플코드를 활용하여 간단히 네트워크 상태를 체크하는 함수를 만들어봤습니다.

 
#pragma mark Check Network

- (BOOL) connectedToNetwork
{
    /*
     www.apple.com URL을 통해 인터넷 연결 상태를 확인합니다.
     ReachableViaWiFi && ReachableViaWWAN 
     : Wi-fi와 3G 둘다 안된다면 인터넷이 연결되지 않은 상태입니다.
     */
    
	Reachability *r = [Reachability reachabilityWithHostName:@"www.apple.com"];
	NetworkStatus internetStatus = [r currentReachabilityStatus];
	BOOL internet;
    
	if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) {
		internet = NO;
	} else {
		internet = YES;
	}
	return internet;
}


+ 물론 위 소스를 사용하기 위해서는
* SystemConfiguration.framework 를 추가하셔야 합니다.
* Reachability.h 와 
Reachability.m 소스가 프로젝트 안에 있어야 합니다.
Reachability.h 를 import 하셔야 합니다.

위 소스를 간단히 살펴보면, 'www.apple.com' 라는 url을 통하여 3G와 Wifi를 구분하지 않고 단순히 인터넷 사용 가능 유무를 검사합니다.
( 사용가능 YES, 사용불가 NO )


3G 와 Wifi 를 구분하려면?
: 당연히 &&로 묶여있는 if문을 나누어 주면 됩니다. ^_^;


2. UIWebView.

: <UIWebViewDelegate> 를 통해 아래 4개의 함수를 사용하여 에러처리 및 UIActivityIndicatorView를 처리할 예정입니다.


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
: Delegate가 연결된 WebView안에서 요청이 있는 경우, 이 함수를 통해 어떤 url로 링크를 타는지 알 수 있습니다.
+ 예를들어 웹뷰를 통해 무언가를 검색했을 때, 검색어를 가져온다던지 기타 등등

UIWebViewNavigationType{
    UIWebViewNavigationTypeLinkClicked,            // 링크 클릭 : 0
    UIWebViewNavigationTypeFormSubmitted,      // 양식 제출 : 1
    UIWebViewNavigationTypeBackForward,         // 뒤로, 앞으로 : 2
    UIWebViewNavigationTypeReload,                  // 새로고침 :3
    UIWebViewNavigationTypeFormResubmitted,   // 양식 다시 제출 :4
    UIWebViewNavigationTypeOther                     //  기타 :5
};

- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView
*)webView;
: 위 두함수는 웹뷰가 시작되고, 끝났을 때 호출됩니다. 이 함수를 이용해서 
UIActivityIndicatorView 애니메이션을 언제 시작하 끝낼지 생각할 필요가 없게됬습니다.


- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
: 딱 봐도 이 함수가 error가 발생할 때 호출되는 함수입니다. 
- error.description : error 코드 포함하여 error에 대한 설명이 포함되어있습니다.
- error.code : error 코드를 알 수 있습니다. ( 아래 더보기를 통해 종류를 보시기 바랍니다. )

+ error code = -1009 인터넷이 연결안되어 있을 때 나는 코드입니다.


"Timeout" 처리하기

: 인터넷은 연결되어 있는 상태지만, 신호가 약하거나 잘못된 Wi-Fi를 물고 있는 경우 생길 수 있는 Timeout 처리에 관한 부분입니다.

( 1 ) WebView가 시작하는  webViewDidStartLoad에서 NSTimer를 지정한 시간에 함수를 호출하도록 설정합니다.
( 2 ) 
webViewDidFinishLoad에서는 NSTimer를 invalidate를 시켜줍니다. ( 정상적으로 종료되었다는 의미이므로 )


- (void)timeoutWebview
{
    NSLog(@"Timeout 20sec");
    UIAlertView *timeAlertView = [[UIAlertView alloc]initWithTitle:@"Timeout" message:@"20sec" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil, nil];
    [timeAlertView show];
    // Timeout Check 20초 이상 걸린다면, 화면에 뿌려주기
}

- (void)webViewDidStartLoad:(UIWebView *)webView
{
    NSLog(@"StartLoad");
    
    // Timer시작
    timer = [NSTimer scheduledTimerWithTimeInterval:20.0 target:self selector:@selector(timeoutWebview) userInfo:nil repeats:NO];
    
    
    // Start Loading
    loadingIndicator.hidden = NO;
    [loadingIndicator startAnimating];
}



- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSLog(@"FinishLoad");
    
    // 정상적으로 웹이 됬다면 Timer 종료
    [timer invalidate];
    
    // Stop Loading
    [loadingIndicator stopAnimating];
    loadingIndicator.hidden = YES;
}




3. NSURLRequest

NSURL *_url = [NSURL URLWithString:URL];
NSURLRequest *request = [NSURLRequest requestWithURL:_url];

기본적으로 위와 같이 사용하지만, 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL]                                                                                                                      cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                                                       timeoutInterval:60.0];

이와 같이 NSMutableURLRequest를 사용해서 timeout 을 설정하는 방식을 더 많이 사용합니다.

마찬가지로 <NSURLConnectionDelegate> 를 사용해서

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
: 연결 오류가 났을 때 호출 되며 이곳에서 에러 처리를 해주시면 됩니다.
+ UIWebView에서의 Error와 코드는 같습니다.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
: 연결 성공했을 때
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
: 연결 한 후에 데이터를 받을 때
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
: 데이터를 다 받았을 때 

- 인디게이터 부분은 연결에 성공하여서 데이터를 다 받을때까지로 할지, 아니면 연결 이후에 데이터를 받기 시작한 후 다 받을때 까지로 할지 정하시면 됩니다.


+ 추가적으로 response를 통해 Status Code를 통해 확인하는 방법입니다.
단순하게 200(Success) , 400(Bad Request)로 구분할 수 있습니다.

 
NSURLResponse *response;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSLog(@"return statecode : %d",[(NSHTTPURLResponse *)response statusCode]);




지금까지 앱에서 인터넷을 사용할 때, 기본적으로 처리해야 하는 부분을 봤습니다.만 아래 링크를 통해서
좀 더 알아보시기 바랍니다.


내가 만든 앱 문제는 없을까?
웹(Web) .vs 앱(APP) 어떤 것을 선택할 것인가?
- 모바일 앱 기획시 고려사항
- 애플의 하이브리드앱 제재는 정당한가?



'제2외국어 > iOS' 카테고리의 다른 글

[iOS] Network check and error handling  (0) 2013.08.21
[iOS]custom Cell - Edit 사용 시 밀리지 않는 문제  (0) 2013.06.20
[iOS]통화하기  (0) 2013.05.29
[iOS]Font 관련하여..  (0) 2013.04.26
[iOS] Multitasking : Location  (0) 2013.01.29
[iOS] Multitasking : Audio  (0) 2013.01.24

Comment +0


PHP에서 파일을 문자열로 읽는방법을 모와봤습니다.




1. 원하는 크기만큼 (현재 :1000byte )읽는 방법
: 크기를 지정했기 때문에 딱 그만큼만 읽습니다.
- 문자열이 그보다 작다면 다 읽을 것이요, 크면 짤릴 것이오~

$fp = fopen("document.txt","r");
$fr = fread($fp,1000);
fclose($fp);
echo $fr;

2. 1번보다는 유동적으로 사이즈크기를 통해 읽는 방법
: 딱 해당 파일의 문자열 크기만큼 읽기 때문에 좋은 방법입니다.

$fp = fopen("document.txt","r");
$fr = fread($fp, filesize("document.txt"));
fclose($fp);
echo $fr;

3. 한 글자씩 읽는 방법
: fgetc() 함수를 통해 한 글자씩 읽습니다.


$fp = fopen("document.txt","r");
while( !feof($fp) )
fclose($fp);
echo $doc_data;


4. 한 라인씩 읽는 방법
: fgets() 함수를 통해 한 라인씩 읽습니다. 


$fp = fopen("document.txt","r");
while( !feof($fp) )
    $doc_data = fgets($fp);
fclose($fp);
echo $doc_data;


5. implode 함수를 사용해서 읽는 방법

: implode함수는 주어진 배열을 문자열로 반환해주는 함수입니다.

string implode ( array $pieces )
string implode ( string $glue , array $pieces 

저희는 연결문자($glue)를 공백으로 했기때문에 공백없이 그대로~  문자열로 반환합니다. 
+ 정반대의 기능을 가진 explode함수도 있습니다.
array explode ( string $delimiter , string $string [, int $limit ] )


$doc = file("document.txt");
$doc_data = implode("", $doc);
echo $doc_data;


6. join 함수를 사용해서 읽는 방법
: join 함수는 5.에서 사용한 implude 함수의 별칭입니다. 
$doc_data = join('', file("document.txt"));
echo $doc_data;




1 ~ 4 번의 방법은 fopen() 함수( 파일이나 URL을 여는 함수입니다. )를 통해서 파일을 열고,
fread(), fgetc(), fgets() 함수들을 통해서 파일을 읽는 방법으로 다른 언어와 마찬가지로.....
open이 있으면 close는 필수인 거 다 아시죠? 

참조 : www.php.net 


'제2외국어 > PHP' 카테고리의 다른 글

[php]isset, empty, is_null, unset 함수  (0) 2014.12.12
[php]파일을 문자열로 읽기.  (0) 2013.08.07
[php]mySQL 사용  (0) 2013.04.03
간단한 PHP문법  (0) 2013.04.02

Comment +0