'배우는일'에 해당하는 글 37건

계속 되는 예제 따라하기 - 당분간 코드팩토리 님 책.

https://github.com/1day1/flutter-practice-wemet

일단 시작
https://github.com/1day1/flutter-practice-wemet/commit/742c1bcc46aa0b35f9343404a38c765335411a3f

하나씩 개선해 나간다.

 

[개선할 사항]

뭐가 있을까?

1) 날짜를 저장해보자. shared_preferences 같은 것으로 저장해보자.
https://github.com/1day1/flutter-practice-wemet/commit/7e950cd51c26a5c1db77efa9e22ee64de763bc8b

재실행해도 날짜를 기억한다.

2) iOS 시뮬레이터 상에 날짜 선택할때 이상한 부분이 있다.(시뮬레이터에서만 그런가?)

 

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

이번에는 코드팩토리 님의 책을 보면서 따라하고 있다.

책은 보강이 되어 2판이 나왔으니, 혹시 참조
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=332270019

 

Must Have 코드팩토리의 플러터 프로그래밍 2판

플러터 시작을 위한 다트 언어를 기초부터 객체지향, 비동기 프로그래밍, 신규 3.0 문법까지 4개 장에 걸쳐 다룬다. 독자가 꼭 필요한 내용을 학습할 수 있도록 플러터 기본 위젯부터 현업에 유용

www.aladin.co.kr

이번 예제는 복잡하지는 않지만, 개선 부분을 시도해보려고 추가한다.
https://github.com/1day1/flutter-practice-pageview

 

[개선할 부분]

1) 이미지를 assets 으로 등록해서 보여주는 것을 network 에서 가져오는 방식으로 변경
https://github.com/1day1/flutter-practice-pageview/commit/868e7c401119cb3ffec4ecd4dd1a29c78b718090

2) 이미지를 폰의 이미지를 가져와서 보여주는 방식으로 변경.
https://github.com/1day1/flutter-practice-pageview/commit/c1a683e8388d793f60c99ca472d598582e3f9f34

  커밋 하니 여러개가 딸려가네( vs code / android studio 가 git 처리 방식이 다른가?)
  혹시 보실 분은 참조 ( lib/ 아래 코드만 보시면 될 듯 )

  image_picker 를 활용한 방법

3) 위 2)번에서 이미지의 페이지 수 / 페이지 상 위치등도 표시.

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

[따라하기의 필수는 가능한 직접 타이핑 한다]

노마드코더님의 강의는 일단 마지막 따라하기 가 될 듯 하다.
웹툰 강의 : https://nomadcoders.co/flutter-for-beginners/lectures/4159

json 데이터 처리하기 / FutureBuilder / shared_preferences 등 여러가지 유용한 것들
https://github.com/1day1/flutter-practice-webtoon

url_launcher 부분에서 iOS / android 등 설정하는 부분은 좀더 살펴봐야 할 듯 하다.(iOS 가 실행이상)

[iOS 이슈 해결]
iOS 쪽 설정 ( iOS / Runner / Info.plist 수정 후 )

	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>https</string>
	</array>


시뮬레이터 가 이상이 있었는데, cocoapods 를 재설치? 를 해주면 되는 것 같다 (맥 기준 아래 명령)

brew install cocoapods

 

개선할 사항이 있을 듯 하지만, 왠지 디비 연동이 필요할 듯 하다. - 일단 여기서는 패스 .. 다른 강의로..

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

한동안 이런식으로 앱개발 따라하기 를 정리하기로 했다.

[따라하기의 필수는 가능한 직접 타이핑 한다]

기본강의는 노마드코더 님의 강의를 참조
이번강의 : https://nomadcoders.co/flutter-for-beginners/lectures/4154

조금씩 개선해보는 것을 정리한다.

타이머 시작 / 중지 / 리스타트 등의 처리
기본 다크모드 색상으로 / 색상처리 최신버전에 맞게 교정.
https://github.com/1day1/flutter-practice-pomodoro

 

[개선해볼 사항]

1) 다크모드 를 전환할 수 있게. 버튼위치를 어디로 할까?
https://github.com/1day1/flutter-practice-pomodoro/commit/cf2d908b06489cebb321c9b6a6f92af79b652632

2) 온보딩 - onboarding 처리해봤다.
https://github.com/1day1/flutter-practice-pomodoro/commit/0a701eecfcbb7c037670ca4027ebc946df7ad499

온보딩 처리는 https://www.youtube.com/watch?v=BfR_daMJ6I8 강의를 참조했는데,
해당 부분에서 onboarding_info 클래스가 vscode 에서 에러경고로 안되서, set / get 처리 하는 방식으로 수정을 했다.

 

추가 개선사항은 일단 여기까지... 다른 강의로...

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터를 공부하면서, 강의도 보면서 따라 앱 만들기를 하고 있다.

[따라하기의 필수는 가능한 직접 타이핑 한다]

여러강의를 보면서 따라하고, 진행상황을 정리하고자 한다.

이번은 노마드코더 님의 강의 중 한 부분을 따라했다.
https://nomadcoders.co/flutter-for-beginners/lectures/4139 (3강 UI Challenge )

* 깃허브에 기본강의 + 나름의 개선 사항을 적용해봤다.
https://github.com/1day1/flutter-practice-toonflix

wallet 의 카드 부분을 커스텀 위젯으로 만들고, 이 부분을 또 데이터를 넘겨서 처리해봤다.
https://github.com/1day1/flutter-practice-toonflix/blob/main/lib/widgets/wallet.dart

typedef WalletData = ({
  String text1,
  String amount,
  String text3,
  IconData curIcon,
  bool isInverted
});

typedef 로 데이터를 정의하고 ( C/go 등의 구조체 -struct- 와 비슷한 것 같다) 해당 데이터를 List 화 한 후 넘겨주었다.

walletDatas: [
                    (
                      text1: 'Euro',
                      amount: '6 234',
                      text3: 'EUR',
                      curIcon: Icons.euro_rounded,
                      isInverted: false,
                    ),
                    (
                      text1: 'Dollar',
                      amount: '55 124',
                      text3: 'USD',
                      curIcon: Icons.attach_money_outlined,
                      isInverted: true,
                    ),
                    (
                      text1: 'Bitcoin',
                      amount: '1.2894',
                      text3: 'BTC',
                      curIcon: Icons.currency_bitcoin_outlined,
                      isInverted: false,
                    )
                  ]

 

[추가 개선할 부분]

1) curIcon 과 isInverted 도 값을 넘겨줄 필요없이, 내부적으로 처리한다.
2) text1 / text3 도 한쪽만 값을 보내서 처리한다.
=> https://github.com/1day1/flutter-practice-toonflix/commit/ab019691a70aa38a9908cee2a543c351ca51ec59

currencyInfo 를 내부 데이터로 처리했는데, 2차원 Map 의 접근은 못하나?
(예를 들어 currencyInfo['USD']['currency'] 로 바로 접근이 되면 좋은데, 못 찾겠다.)

일단 singleWhere 로 처리함.

3) 위 값을 json 타입으로 가져온다(외부 연동 염두)
=> https://github.com/1day1/flutter-practice-toonflix/commit/2d812367e535f296a8d55b6ec04d29a0c525637e

json 파일을 불러와서 보여지도록 조치함.

 

[일단 여기까지 다른 강의 따라하기로 ..]

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

예전 공부(?)하다가 중단했었는데, 다시 시도 해보려 한다.
이슈가 생기면 처음부터 정리하면서 진행하고자 한다.

flutter doctor 를 한후 다음과 같은 메시지

[!] Xcode - develop for iOS and macOS (Xcode 15.2)
    ✗ Unable to get list of installed Simulator runtimes.
    
..
..
! Doctor found issues in 1 category.

Xcode 의 시뮬레이터를 설치해준다.

xcodebuild -downloadPlatform iOS

 

다시 flutter doctor 를 해보면 정상적으로 나올 것이다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

맥에서 npm (node) 를 어떤 방법으로 설치하는게 좋은가?

보통 homebrew , nvm 을 주로 쓰는 듯 하다.

맥용 기본 패키지 매니저 같은 것은 없나? ( 우분투의 apt 같은 ..)


https://nodejs.org/ 에서 다운로드해서 설치해도 되는듯 하다.


# 일단 nvm 을 시도해본다.

1. 설치 : https://github.com/creationix/nvm

2. curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

3. 위 명령으로 설치하려고 하니 git 이 없다고 한다. xcode 설치하겠는지 물어본다. (일단 설치 진행.)

4. 다시 위 명령으로 실행. 설치OK. 터미널을 재실행해 보면 된다. (nvm --version 체크)


# node(npm) 을 설치한다.

1. nvm install node   ( nvm install stable 도 동일한 듯 하다)

2. npm install -g @vue/cli  => 최종 하려던 것 - 잘 설치된다.


# vue cli 3 버전 특징.

vue cli ui 를 지원한다. 

$ vue ui  

위 명령을 내리면 브라우저가 뜨면서 설정을 UI 로 할 수 있다. ( 기존  명령창에서 하던 것을 브라우저로 가능)
> 참조 : https://medium.com/@changjoopark/vue-cli-ui-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-9ef31fea4f40



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 나만의 패키지 box 를 만들어 보자.

공개된 box 를 사용하다 보면 조금씩 내 입맛에 맞게 변경하게 된다.
그 상태를 패키지로 만들어 본다.

관련 링크 : https://docs.vagrantup.com/v2/virtualbox/boxes.html

# vagrant package --base {가상머신이름} --output {박스이름}

형태로 만들어 준다. 그렇지만 언제나 우리를 당황하게 만드는 에러메시지

# vagrant package --base nhost --output nhost.box
/opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:306:in `id=': undefined method `children' for nil:NilClass (NoMethodError)
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:438:in `state'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/plugins/providers/virtualbox/action/created.rb:11:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builder.rb:116:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `block in run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/util/busy.rb:19:in `busy'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builtin/call.rb:43:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/plugins/providers/virtualbox/action/check_virtualbox.rb:17:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/builder.rb:116:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `block in run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/util/busy.rb:19:in `busy'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/action/runner.rb:66:in `run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:196:in `action_raw'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:173:in `block in action'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/environment.rb:434:in `lock'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:161:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/machine.rb:161:in `action'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/plugins/commands/package/command.rb:83:in `package_vm'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/plugins/commands/package/command.rb:66:in `package_base'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/plugins/commands/package/command.rb:42:in `execute'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/cli.rb:42:in `execute'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/environment.rb:252:in `cli'
        from /opt/vagrant/bin/../embedded/gems/gems/vagrant-1.6.3/bin/vagrant:166:in `<main>'

어! 뭐가 문제지.

답은 --base {가상머신이름}

가상머신 이름을 정확하게 적어줘야 한다.

ls  ~/VirtualBox VMs  안에 가상머신들이 있다. 그 이름(폴더명)을 적어준다.

또는

# VBoxManage list vms

결과는 이런 식이다.
"nhost_default_1406732053960_27414" {196dbe3a-1c2f-4414-83f4-dbb612a67059}


이제 제대로 적어준다.

# vagrant package --base nhost_default_1406732053960_27414 --output nhost.box

다음처럼 박스가 생성된다. 가상머신이 실행중이면 먼저 중지된다.

==> nhost_default_1406732053960_27414: Attempting graceful shutdown of VM...
==> nhost_default_1406732053960_27414: Clearing any previously set forwarded ports...
==> nhost_default_1406732053960_27414: Exporting VM...
==> nhost_default_1406732053960_27414: Compressing package to: /opt/nhost.box

해당 위치에 보면 OOO.box 파일이 생겼을 것이다.


사용은 다음처럼 한다. 추후 vagrant init nhost 로 사용가능하다.

# vagrant box add nhost /opt/nhost.box


==> box: Adding box 'nhost' (v0) for provider:
    box: Downloading: file:///opt/nhost.box
==> box: Successfully added box 'nhost' (v0) for 'virtualbox'!

정상적으로 box 가 등록된다.



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 의 용량이 모자라요. 디스크를 추가해서 늘려보자.

상황 - vagrant 의 가상머신내 용량이 모자란다. 공유폴더로 하려니 권한, owner 설정등의 문제가 있다.

해결방법 : 200G 가상디스크를 생성하고, guest 의 / root 에 LVM logical 디스크를 추가한다.

조건 : 디스크 /dev/sda 로 설정되어 있고, LVM 으로 /dev/mapper/VolGroup-lv_root 가 root 에 마운트되어 있다. LVM 을 이용해 디스크용량을 확장하려는 것이다.


1. Vagrantfile 에 디스크를 생성하는 명령을 넣는다.

  config.vm.provider "virtualbox" do |vb|
    file_to_disk = File.realpath( "." ).to_s + "/disk.vdi"

    if ARGV[0] == "up" && ! File.exist?(file_to_disk)
       puts "Creating 200GB disk #{file_to_disk}."
       vb.customize [
            'createhd',
            '--filename', file_to_disk,
            '--format', 'VDI',
            '--size', 200 * 1024   # 200 GB
            ]
       vb.customize [
            'storageattach', :id,
            '--storagectl', 'SATA',
            '--port', 1, '--device', 0,
            '--type', 'hdd', '--medium',
            file_to_disk
            ]
    end

  end

  config.vm.provision "shell", path: "scripts/add_new_disk.sh"


2. provision 실행명령을 작성한다.

 스크립트 내용 : 추가된 디스크를 fdisk 로 등록하고, LVM logical 디스크로 추가한후 용량을 확장한다.

# cat scripts/add_new_disk.sh
set -e
set -x

if [ -f /etc/disk_added_date ]
then
   echo "disk already added so exiting."
   exit 0
fi


sudo fdisk -u /dev/sdb <<EOF
n
p
1


t
8e
w
EOF

pvcreate /dev/sdb1
vgextend VolGroup /dev/sdb1
lvextend -L +200G /dev/VolGroup/lv_root
resize2fs /dev/VolGroup/lv_root

date > /etc/disk_added_date



3. provision 명령으로 스크립트를 실행한다.

# vagrant provision
==> default: Running provisioner: shell...
    default: Running: /tmp/vagrant-shell20140730-16554-1duycg4.sh
==> default: ++ '[' -f /etc/disk_added_date ']'
==> default: ++ sudo fdisk -u /dev/sdb
==> default: Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
==> default: Building a new DOS disklabel with disk identifier 0x95391d02.
==> default: Changes will remain in memory only, until you decide to write them.
==> default: After that, of course, the previous content won't be recoverable.
==> default: Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
==> default:
==> default: WARNING: The size of this disk is 219.9 TB (219902325555200 bytes).
==> default: DOS partition table format can not be used on drives for volumes
==> default: larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID
==> default: partition table format (GPT).
==> default:
==> default: WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
==> default:          switch off the mode (command 'c')
==> default: .
==> default:
==> default: Command (m for help):
==> default: Command action
==> default:    e   extended
==> default:    p   primary partition (1-4)
==> default: Partition number (1-4):
==> default: First sector (63-4294967295, default 63):
==> default: Using default value 63
==> default: Last sector, +sectors or +size{K,M,G} (63-4294967294, default 4294967294):
==> default: Using default value 4294967294
==> default:
==> default: Command (m for help):
==> default: Selected partition 1
==> default: Hex code (type L to list codes):
==> default: Changed system type of partition 1 to 8e (Linux LVM)
==> default:
==> default: Command (m for help):
==> default: The partition table has been altered!
==> default:
==> default: Calling ioctl() to re-read partition table.
==> default: Syncing disks.
==> default: ++ pvcreate /dev/sdb1
==> default:  
==> default: dev_is_mpath: failed to get device for 8:17
==> default:   Physical volume "/dev/sdb1" successfully created
==> default: ++ vgextend VolGroup /dev/sdb1
==> default:   Volume group "VolGroup" successfully extended
==> default: ++ lvextend -L +200G /dev/VolGroup/lv_root
==> default:   Extending logical volume lv_root to 218.51 GiB
==> default:   Logical volume lv_root successfully resized
==> default: ++ resize2fs /dev/VolGroup/lv_root
==> default: resize2fs 1.41.12 (17-May-2010)
==> default: Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
==> default: old desc_blocks = 2, new_desc_blocks = 14
==> default: Performing an on-line resize of /dev/VolGroup/lv_root to 57280512 (4k) blocks.
==> default: The filesystem on /dev/VolGroup/lv_root is now 57280512 blocks long.
==> default: ++ date

vagrant ssh 를 해보면 정상적으로 용량이 늘어난 것을 볼 수 있다.

% 로그를 보니 200G 가 아닌 200T 로 세팅된 듯 하다. Vagrantfile 쪽의 용량 계산을 잘 못 한듯 하다.
다시 설정을 체크해봐야 겠다.%



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 를 사용하다 보면 GuestAdditions 의 버전이 다른 경우가 있다.

vagrant up 시에 다음과 같은 메시지가 뜬다.

Got different reports about installed GuestAdditions version:
Virtualbox on your host claims:   4.3.10
VBoxService inside the vm claims: 4.3.14
Going on, assuming VBoxService is correct...
GuestAdditions 4.3.14 running --- OK.

host 와 가상머신내의 버전이 다르다.


~/VirtualBox VMs/chef-solo_default_1406182370453_27414 => 다음 위치에서

 vi OOO.vbox 를 열어본다. (진한부분은 box 별로 다를 것이다.)

          <GuestProperty name="/VirtualBox/GuestAdd/Version" value="4.3.14" timestamp="1397926654949278000" flags=""/>
          <GuestProperty name="/VirtualBox/GuestAdd/VersionExt" value="4.3.14" timestamp="1397926654951054000" flags=""/>

위와 같은 항목이 나오는데, 버전부분을 새버전으로 바꿔준다.

vagrant reload 를 해서 다시 실행시켜 본다.


# 몇가지 guest 체크 명령

# vagrant vbguest --status
GuestAdditions 4.3.14 running --- OK.


- 현재 버전 보기.

# VBoxManage guestproperty get aadfe9f8-a351-42b0-832a-af8d7dcbe6be /VirtualBox/GuestAdd/Version
Value: 4.3.14

진한 부분은 /VirtualBox VMs/ 의 해당가상머신의 UUID (OOO.vbox 파일 위쪽에 있음)


- 현재 머신 설정으로 저장하기

# VBoxManage guestproperty set aadfe9f8-a351-42b0-832a-af8d7dcbe6be /VirtualBox/GuestAdd/Version

# VBoxManage guestproperty set aadfe9f8-a351-42b0-832a-af8d7dcbe6be /VirtualBox/GuestAdd/Revisioin

get 을 set 으로 바꿔주면  OOO.vbox 의 내용을 현재 설정으로 바꿔준다.



참고1) 아래 위치는  기본 box 이미지에서 수정할때 사용한다.

~/.vagrant.d/boxes/chef-VAGRANTSLASH-ubuntu-14.04-i386/1.0.0/virtualbox => 다음과 같은 위치에

 vi box.ovf 를 열어보면 위 와 비슷하다. 버전 부분 변경.


참고2) 버전이 다르면 vagrant 가 자동으로 업데이트 해준다. => 크게 의미 없는 듯 함(사용하는게 좋을 듯)

이때 버전업을 하기 싫다면 다음 옵션을 Vagrantfile 에 추가한다.

  config.vbguest.auto_update = false




반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant up 시에 다음과 같은 vboxsf 관련 에러를 보게되면,

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant


다음처럼 guest plugin 을 설치한다.

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.10.0)'!


그리고, vagrant reload 를 한번 해준다.



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 의 기본 메모리가 부족해서 늘려보고자 한다.

설정은 다음과 같다. Vagrantfile 에 추가해준다.

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end

적당한 메모리 값을 넣어준다.

위와 같이 하면 정상정으로 진행될 것이다.



=> 아래 에러는 아마도 cpu 를 2 로 늘렸을때 났던 에러인 듯 하다. 빼고 해도 동일 에러가 나는 이유는 무엇일까?
설정값이 남아있었던 것일까? vagrant destroy 후에 다시 해보니 정상이다.

관련 설정을 한후 vagrant up 을 해보면 다음과 같은 에러가 난다.

# vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'chef/ubuntu-14.04-i386' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2201.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2201 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.


/VirtualBox VMs/chef-solo_default_1406169045971_64274/Logs 에서 VBox.log 를 열어서 보면

00:00:00.070719
00:00:00.070719 ********************* End of CFGM dump **********************
00:00:00.070730 VM: fHMEnabled=true  (configured) fRecompileUser=false fRecompileSupervisor=false
00:00:00.070732 VM: fRawRing1Enabled=false CSAM=true  PATM=true
00:00:00.070842 VMSetError: /home/vbox/vbox-4.3.14/src/VBox/VMM/VMMR3/HM.cpp(532) int HMR3Init(PVM); rc=VERR_VMX_MSR_VMXON_DISABLED
00:00:00.070854 VMSetError: VT-x is disabled in the BIOS.
00:00:00.196099 ERROR [COM]: aRC=NS_ERROR_FAILURE (0x80004005) aIID={8ab7c520-2442-4b66-8d74-4ff1e195d2b6} aComponent={Console} aText={VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED)}, preserve=false
00:00:00.248130 Power up failed (vrc=VERR_VMX_MSR_VMXON_DISABLED, rc=NS_ERROR_FAILURE (0X80004005))

결론은 해당 호스트머신이 CPU 가상화 VT-x 를 지원하지 않는 것이다.

테스트한 머신이 i3 라 가상화 지원을 하지 않아서 그런듯 하다. 메모리만 늘리려 하는데도 안되는 듯 하다.

i5 이상급으로 업그레이드 하거나 다른 머신에서 테스트해야 겠다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

관리하는 서버 대수가 많아지다 보니 모니터링이 쉽지 않다.

서버 호스팅 업체를 통한 기본관리도 가능하지만, 부족한 부분이 있고, 여러 호스팅 업체를 사용하다보면 그것도 불편하다


icinga 로 모니터링 서버를 구축해본다.

웹 모니터링 화면을 접속하면 이런식으로 나온다.

관련글 : https://www.digitalocean.com/community/tutorials/how-to-use-icinga-to-monitor-your-servers-and-services-on-ubuntu-14-04

설정은 위 링크를 참조하기로 하고 특이사항 들을 추가한다.


관련 패키지를 설치하면 몇가지 설정단계를 거친다.

1) 처음에는 mysql root 계정 암호를 넣을 것이다. 적당한 암호를 넣는다.


2) 메일 설정 부분

메일 설정을 해준다. 메일로 알람을 받을 때 쓰는 듯 하다.


3) 관리자 화면에 쓸 icingaadmin 계정 설정

관리용 웹화면의 암호를 입력한다.

다음처럼 추가 패키지들이 설치된다.


다음은 그냥 No 로 넘어가고,


4) icinga-idoutils 관련 설정

icinga-idoutils 의 설정 : 모니터링 데이터에 쓰이는 듯 하다.

여기에서는 mysql 을 쓸 것이다.


초기데이터 설정을 위해 관리자 암호를 물어본다(처음에 설정한 값)


icinga-idoutils 가 쓸 mysql 계정암호를 넣는다.

여기까지 기본설정 완료. 추가로 패키지들이 마저 설치된다.



5) 모니터링 관리자 화면 접속.

난 설정을 포트포워딩 해서 http://localhost:8800/icinga/ 으로 접속했다.

아이디는 icingaadmin 이고, 암호는 설정시 입력한 값을 넣는다.




참고로 난 vagrant 로 가상머신을 만들고, icinga 를 세팅했다.
vagrant 로 세팅후 box 의 80포트를 포트포워딩 하고, 부팅시 자동실행하도록 설정했다.

1) 포트포워딩(Vagrantfile)

config.vm.network :forwarded_port, host: 8080, guest: 80

2) 부팅시 자동실행(vagrant box) : http://blog.1day1.org/543




반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant up 을 하게 되면 virtualbox 가 시작되면서 가상머신이 부팅하게 된다.

기본 설정은 private network 로 되는 듯 하다.


브리지 모드로 하려면

Vagrantfile 에 다음 항목을 넣어준다.

방법1)
config.vm.network "public_network"

방법2)
config.vm.network "public_network", bridge: "eth0"

설정값이 vagrant 버전에 따라 차이가 있는 듯 하다.

config.vm.network :public_network, bridge: "eth0"

위와 같이 옵션을 넣어줘도 되는 듯 하다. ( 구분은 " => 로 하는게 더 쉬워보인다)


비슷하게 포트 포워딩을 하려면 이런식.

config.vm.network :forwarded_port, host: 8080, guest: 80



# vagrant -v
Vagrant 1.6.3

그냥 config.vm.network "public_network" 부분까지만 넣어주면, 네트웍인터페이스(랜카드) 가 여러개이면 선택하는 화면이 나온다.

# vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Available bridged network interfaces:
1) eth0
2) wlan0
3) docker0
    default: What interface should the network bridge to?

=> 매번 선택 해줘야 한다. bridge 옵션으로 network interface 를 정해주면 선택하지 않고 바로 가동할 수 있다.




하위 버전은 아래 명령중 하나로 작동할 듯 함.(아래 설정중 알아서 설정)

config.vm.network :bridged, :bridge => "eth0"

config.vm.network :public_network, :public_network => "wlan0"




반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 를 우분투에 세팅해서 사용중이다.

호스트 머신인 우분투를 재부팅할 때 vagrant box 도 재부팅해보자.


방법1) 이건 해보니 안된다. => 실패!!

vi /etc/rc.local 파일에 다음을 추가

cd /opt/vagrant-box/centos6 && /usr/bin/vagrant up

=> vagrant box 위치로 가서 vagrant up 을 해주는 간단한 스크립트.
  부팅 실행시 rc.local 이 실행되면서 처리되어야 하는데, 안된다.

  아마도 14.04 가 systemd 인가? upstart 인가? 를 사용해서 rcX.d 의 방식이 안되는 것 같다.



방법2) /etc/init 에 스크립트를 만들어준다. => 성공!!

vi /etc/init/vagrant-centos6.conf  파일을 만들어준다.(파일명은 알아서)

description "Start vagrant centos6 box on system startup"
author "uHOWTO"
env VAGRANTUSR=root
env VAGRANTBOXPATH=/opt/vagrant-box/centos6
start on stopped rc
stop on runlevel [016]

pre-start script
    cd ${VAGRANTBOXPATH}
    su -c "/usr/bin/vagrant up" ${VAGRANTUSR}
end script

post-stop script
    cd ${VAGRANTBOXPATH}
    su -c "/usr/bin/vagrant halt" ${VAGRANTUSR}
end script

위 스크립트에서 진한부분을 본인의 설정에 맞게 바꿔준다.

재부팅해보면 정상적으로 vagrant box 도 실행되어 있을 것이다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 이미지를 직접 만들어 쓰는게 답인가?

그냥 별 생각없이 쓰기에는 상관없을 듯 한데, 딱 입맛에 맞는 이미지를 찾으려니 잘 안보인다.
http://www.vagrantbox.eshttps://vagrantcloud.com 이외에 더 좋은 곳이 없을까?

기본 base CentOS 나 Ubuntu 를 깔고, 내 입맛에 맞게 이미지를 만들어 vagrant cloud 에 올려놓고 쓰는게 좋을 듯 하다.

처음부터 vagrant 이미지를 만드는 방법을 찾아봐야 겠다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 를 사용하려면 virtualbox 를 먼저 설치해야 한다.

우분투에서는 apt 패키지로 설치하면 편하다.

관련 링크 : https://www.virtualbox.org/wiki/Linux_Downloads 


apt-key 등록 , apt update 시에 다음과 같은 에러가 나오는 경우가 있다.

W: bzip2:/var/lib/apt/lists/partial/download.virtualbox.org_virtualbox_debian_dists_trusty_contrib_binary-amd64_Packages 파일을 받는데 실패했습니다  해시 합이 맞지 않습니다

W: bzip2:/var/lib/apt/lists/partial/download.virtualbox.org_virtualbox_debian_dists_trusty_contrib_binary-i386_Packages 파일을 받는데 실패했습니다  해시 합이 맞지 않습니다


apt 캐시를 삭제(clean) 해주고,  /var/lib/apt/lists 쪽도 삭제를 한후 다시 시도해본다.

# apt-get clean

# rm /var/lib/apt/lists/*
rm: `/var/lib/apt/lists/partial'를 지울 수 없음: 디렉터리입니다

# rm /var/lib/apt/lists/partial/*

# apt-get clean

# apt-get update


뭔가 안된다.

이게 아닌가?

네트웍이 불안해서 그런가?
    => 이게 답인 것 같다. 지금 해보니 해당 에러가 없어졌다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

요즘 서버 자동화에 대한 구상을 하고 있다.

여러가지 방법이 있어 상황에 맞는 좋은 방법을 찾고 있다.

docker / vagrant / chef / puppet 등을 체크하고 있다.

관리해야 하는 서버가 수십대 규모에서 수백대 규모로 넘어가는 상황에서는 수작업/스크립트 만으로는 처리가 어렵다. 미리 미리 체크해서 상황이 발생했을 때 빠른 대처를 할 생각이다.


# digital ocean 의 서비스를 활용.

서비스쪽에서는 amazon 이 최고이긴 하지만, 비용문제가 있다. 계산법 복잡한 부분도 있다.
설정 부분도 그렇고, 초보가 접근하기에는 좀 부담스럽다.

디지털오션은 그 부분에서 간략화되어 있다는 느낌이다.

디지털오션 서비스를 체험하려면 관련글을 참조(2개월무료사용글 => http://blog.1day1.org/498 )

droplet 까지 생성을 해봤다면 다음으로 넘어가보자.

미리 세팅한(OS + your service app) droplet 를 스냅샷(snapshot)으로 만들 수 있다.

기본으로는 해당 지역(San Francisco) 에 생성이 되는데, 다른 지역에도 같은 이미지를 배포하고 싶으면 다른 지역으로 전송할 수 있다. 전송하는 시간이 좀 길다. 20G 정도 밖에 안되는데, 꽤 오랜 시간이 걸린다.
미리 미리 타지역으로 배포를 해놓는 것이 좋다.( 이 시간 때문에 다른 서비스도 고려중이다)

일단 스냅샷을 만든후


# droplet 을 저장이미지를 사용해본다.

  지역을 선택하고 My Images 에 저장된 이미지가 보인다. 그것을 선택한다.
  SSH Key 도 미리 등록해 놓으면 로그인도 바로 할 수 있으니 편하다.


기존에 droplet 생성 -> 서비스 app 세팅 하는데, 스크립트를 이용해서 보통 20~30 / 테스트까지 하면 1시간정도 필요했었다. 그런데, 이미지를 이용하면 거의 5분이내로 서비스 가동이 완료된다. 무지 편해졌다.
서비스 배포 시간을 줄이며 그 만큼 빠른 대응을 할 수 있다.

디지털오션쪽에서는 API 도 제공하기 때문에 위 시간에서 더 줄일 수 있을 듯 하다.
(https://developers.digitalocean.com)


내가 한 방법이 최상이라고는 할 수 없다. 서비스 앱의 종류 / 복잡도에 따라 또 달라질 수 있다.

설정등이 서버마다 바뀌거나, 복잡한 부분은 chef 나 puppet 등을 사용해야 할 것이다.

처음에는 간단한 것부터 조금씩 복잡한 부분에 대한 자동화시스템을 구축해볼 예정이다.




반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

우분투 14.04 시스템에 btrfs 를 사용하고 있다.

SSD raid 에 LVM 으로 나눠서 쓰고 있다. 일반적인 사용형태보다는 좀 복잡할 것이다.
(물론 아주 특이한 케이스는 아니다)

docker 를 테스트 하던 중.

docker pull 로  이미지 몇개 설치하지 않았는데, 디스크가 꽉차는 현상이 발생했다.
크롬이 비정상 종료되길래 왜 그러지 싶었다. 그냥 아무 생각없이 재부팅하니. 정상부팅되지 않았다.

순간 멘붕.

허걱! 다시 OS를 깔아야 하나. 데이터 만이라도 살려야 하는데.
중요데이터는 Dropbox 로 동기화 하고 있으니 별 상관은 없지만, 또 세팅을 다시하려니 힘이 쭉.

single 모드로 다시 부팅을 해보고 점검을 해봤다.

주요 메시지는

Incrementally starting RAID arrays...
mdadm: CREATE user root not found
mdadm: CREATE group root not found
Incrementally started RAID arrays.

이런식의 메시지가 계속 무한루프 된다. 위 메시지를 검색 해봤는데, 별다른 원인을 못찾겠다.


docker 를 테스트 하던중 용량 관련 메시지 No space left on device  => 디스크 full 일때 나오는 익숙한(?) 메시지
를 봤었다. 그것과 관련이 있을 것 같다.

# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_root-lv_root  131G   46G   84G  36% /
none                         4.0K     0  4.0K   0% /sys/fs/cgroup
udev                         3.9G  4.0K  3.9G   1% /dev
tmpfs                        791M  1.3M  789M   1% /run
none                         5.0M     0  5.0M   0% /run/lock
none                         3.9G  156K  3.9G   1% /run/shm
none                         100M   44K  100M   1% /run/user

그러나 시스템 용량은 충분했다. 어떤 다른 이유인것 같다.


docker pull dockerfile/mongodb

등의 명령을 내리면, 이미지를 다운로드하고 컨테이너를 생성한다.

# docker pull dockerfile/mongodb
Pulling repository dockerfile/mongodb
6c03df111896: Download complete
511136ea3c5a: Download complete
5e66087f3ffe: Download complete
4d26dd3ebc1c: Download complete
d4010efcfd86: Download complete
99ec81b80c55: Download complete
b261bc65cd23: Download complete
42404685406e: Download complete
6cc69450fe19: Download complete
efc4fbcd007f: Download complete
2baeb2edbf92: Download complete
ecd5c1cc18ac: Download complete
1f089cc15e82: Download complete
9c1219bb985c: Download complete
d5885db18d17: Download complete
f1b2b4374c6b: Download complete
c0cda6b780cd: Download complete
42f2a60d100f: Download complete

이때 docker 는 btrfs 인 경우 subvolume (스냅샷?) 기능 을 이용하는 것 같다.

/var/lib/docker/btrfs/subvolumes 에 생성이 된다.

btrfs subvolume list /

을 해보면 아무것도 없어야 한다. 그런데, docker pull 후에 다시 명령을 해보면.

# btrfs sub list /
ID 386 gen 94278 top level 5 path var/lib/docker/btrfs/subvolumes/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158
ID 387 gen 94278 top level 5 path var/lib/docker/btrfs/subvolumes/5e66087f3ffe002664507d225d07b6929843c3f0299f5335a70c1727c8833737
ID 388 gen 94279 top level 5 path var/lib/docker/btrfs/subvolumes/4d26dd3ebc1c823cfa652280eca0230ec411fb6a742983803e49e051fe367efe
ID 389 gen 94280 top level 5 path var/lib/docker/btrfs/subvolumes/d4010efcfd86c7f59f6b83b90e9c66d4cc4d78cd2266e853b95d464ea0eb73e6
ID 390 gen 94281 top level 5 path var/lib/docker/btrfs/subvolumes/99ec81b80c55d906afd8179560fdab0ee93e32c52053816ca1d531597c1ff48f
ID 391 gen 94282 top level 5 path var/lib/docker/btrfs/subvolumes/b261bc65cd23e8399c39ef0b77d732ddf6ca9679d4cea0ad1cdaca715c4a0d81
ID 392 gen 94283 top level 5 path var/lib/docker/btrfs/subvolumes/42404685406e72d29e3b349605d34cb88590cfcfabb06b9925628f2949c2eb89
ID 393 gen 94284 top level 5 path var/lib/docker/btrfs/subvolumes/6cc69450fe1990579c13d444495dcfec342955712481647fcb73d5a8e6184f33
ID 394 gen 94285 top level 5 path var/lib/docker/btrfs/subvolumes/efc4fbcd007ff7a202ead05932a48f62301464b8f1bc1449f3a8f9b5c26d9515
ID 395 gen 94286 top level 5 path var/lib/docker/btrfs/subvolumes/2baeb2edbf92488d7bbd4723368aeb2e86045f7ed6310b5924cec2d3c3ff8710
ID 396 gen 94287 top level 5 path var/lib/docker/btrfs/subvolumes/ecd5c1cc18ac86e88dd6420161d5812ef6cd31c1a0ce252d071d4481996502fc
ID 397 gen 94288 top level 5 path var/lib/docker/btrfs/subvolumes/1f089cc15e82571690524c3633dc361ba526d25fed072e09607fac7ee1178098
ID 398 gen 94289 top level 5 path var/lib/docker/btrfs/subvolumes/9c1219bb985cb5ceb0a602ad943c9dd5b83cf0f16d3cd05730113fe0af37d0be
ID 399 gen 94290 top level 5 path var/lib/docker/btrfs/subvolumes/d5885db18d17c3e473f310ab7723a1c6b4c29a14b9a8db54bfd795466bee1da3
ID 400 gen 94291 top level 5 path var/lib/docker/btrfs/subvolumes/f1b2b4374c6b1813549a4436c190f4e0ab04168eee3244e08931b63c96b943c1
ID 401 gen 94292 top level 5 path var/lib/docker/btrfs/subvolumes/c0cda6b780cdb2c400b470371baea2149ac4caef980d4685465f0ef13eb2af6c
ID 402 gen 94293 top level 5 path var/lib/docker/btrfs/subvolumes/42f2a60d100fcbda388b76bb69270fc057565ab4bdf5d68072b30b225669e5f4
ID 403 gen 94293 top level 5 path var/lib/docker/btrfs/subvolumes/6c03df11189668e549ac34464dbdbef563144f92eeb89246afaa1029b92cfd7d

위 처럼 많은 subvolume 이 생성된 것을 볼 수 있다.
ID 값이 동일한 것(진한부분)을 보니 ID 당 서브볼륨을 생성해서 관리하나 보다.


파일용량을 체크해보면 다음과 같다.

# btrfs file df /
Data, single: total=127.21GiB, used=44.64GiB
System, DUP: total=8.00MiB, used=20.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=1.50GiB, used=1.02GiB
Metadata, single: total=8.00MiB, used=0.00

서브볼륨은 어느 부분에 영향을 주는지 확인해봐야 겠다.

아무튼.

docker rmi dockerfile/mongodb

명령으로 docker 이미지를 삭제하면 해당 subvolume 도 삭제된다.


개별적으로 subvolume 을 삭제하려면

btrfs sub del var/lib/docker/btrfs/subvolumes/6c03df11189668e549ac34464dbdbef563144f92eeb89246afaa1029b92cfd7d

으로 삭제해준다.( 부팅이 안되서 usb 우분투 로 부팅하고, 해당 서브볼륨을 위 처럼 하나씩 삭제해줬다)


btrfs 에 좀더 알기전까지는 조심해야 겠다.

다음부터 docker 는 vagrant 기반의 vm 내에서 테스트 해봐야 겠다.



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant cloud 를 사용하려고 한다.( 기존 http://www.vagrantbox.es 를 사용하고 있었다.)

vagrantbox 에는 그리 많지 않아서 vagrant cloud (https://vagrantcloud.com) 를 사용하려 한다.


vagrant cloud 를 사용하려면 1.5 버전 이상에서 사용가능한 듯 하다.

우분투 14.04 기본패키지는 1.4.3 버전이다.( 다음처럼 에러가 난다.)

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The box 'hfm4/centos7' could not be found.



# 최신 버전으로 업그레이드 한다.

우분투 패키지를 다운받아서 설치했다.( http://www.vagrantup.com/downloads.html )

deb 파일이라 다운로드 하면 자동으로 우분투소프트웨어센터로 설치된다.

업그레이드 하면 된다.

버전을 확인해본다.

$ vagrant -v
Vagrant 1.6.3


vagrant cloud 에서 이미지를 찾아서 설치/가동 해본다.

가입은 쉽다. 가입후 에 Discover 메뉴에서 찾고자 하는 box 를 검색해본다.(가입안해도 될려나?)
그냥 box init 용도로만 사용하려면 가입은 안해도 되나보다.


원하는 box 를 찾았으면 vagrant init  명령을 내린다.

vagrant init hfm4/centos7

위 명령을 하면 Vagrantfile 이 생긴다.
이 파일을 기준으로 vagrant up 시 이미지등을 생성하고, 자동실행하게 된다.


# vagrant up

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hfm4/centos7' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hfm4/centos7'
    default: URL: https://vagrantcloud.com/hfm4/centos7
==> default: Adding box 'hfm4/centos7' (v1.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hfm4/centos7/version/1/provider/virtualbox.box
    default: Progress: 10% (Rate: 1239k/s, Estimated time remaining: 0:09:02)

위와 같이 진행이 된다.


위와 같이 진행하다가 다음과 같은 에러가 나온다.

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant


다음처럼 guest plugin 을 설치한다.

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.10.0)'!

정상적으로 되면

vagrant ssh

로 접속해본다. vagrant 속에서 다음 명령을 해준다.

sudo ln -s /opt/VBoxGuestAdditions-4.3.12/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions

4.3.12 => 버전은 차이가 있을 것이다.

뭔가 계속 에러가 난다. box 패키징이 잘 못된것인가?


다른 박스로 해봤다.( https://vagrantcloud.com/chef/centos-6.5 )

다른 박스로 해보니 정상적이다.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'chef/centos-6.5' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
GuestAdditions 4.3.12 running --- OK.
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /user/develop/vagrant/chef-centos-6.5
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.


vagrant cloud 쪽의 box 들이 모두 검증된 것은 아닌것 같다.
각자 취사 선택해서 사용해야 겠다.




반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

git 를 로컬에서 사용해도 좋습니다.

그런데, 원격 저장소를 사용하면 뭔가 있어보입니다.

원격저장소를 직접 구현해도 되지만, 일단 이미 구축된 서비스를 사용해봅시다.

여기서는 bitbucket 을 사용합니다. ( https://bitbucket.org )

가입과정은 건너띄고 바로 저장소를 생성합니다.

Name 만 넣으면 끝. Repository type 은 Git 로 하면 됩니다.


나의 로컬저장소 를 원격에 올려봅니다.

저장소 디렉토리에서 다음 명령으로 원격저장소를 등록해 줍니다.

git remote add origin git@bitbucket.org:myid/test-myproject.git

해당 정보는 .git/config 파일에 저장이 됩니다.


이제 로컬의 commit 정보를 원격저장소에 push 해줍니다.

git push -u origin --all

완료가 되면 bitbucket 에 등록된 것을 볼 수 있습니다.



추가) ssh key 를 등록하면 편합니다.

bitbucket 메뉴에서 Manage Account > Secutiry > SSH keys 메뉴에서 ssh key 를 등록해 둡니다.





반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

버전관리는 필수가 되었죠.

그중에 git 이 가장 나은 것 같아요.
뭐 나혼자 쓰니 아무거나 써도 됩니다.

http://rogerdudler.github.io/git-guide/index.ko.html

간편하게 쓸 수 있습니다.


gui 툴은 ubuntu 에서 별로네요. 윈도우용은 그나마 쓸만한데

console 명령을 정리합니다.

[간편 사용하기]

# git init

# git add .

# git commit

일단 이거면 됩니다. 위 링크의 이 그림이 핵심이죠.

그다음은 좀더 발전한 것이죠. 차차 익히기로 해요.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

서버관리.

ssh 접속해서 관리할 수 있는 서버의 수는 제한적이다.
스크립트를 작성해서 관리하는 것도 한계가 있다.

자동화 툴을 사용해야 한다.

여러가지 이지만, 하나씩 알아보고 적당한 놈을 찾아보기로 한다.

후보로

1. 모니터링 : Icinga

=> 설정 관련글 : http://blog.1day1.org/547


2. 서버 자동화 : Chef

한번에 여러개를 다 해볼 수는 없고, 일단 후보 먼저 검증해 볼 예정이다.


일단 작은 부분의 관리 부터 검증해봐야 겠다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

tishadow 를 사용할 때 수정된 파일을 감지해서 자동으로 빌드/업데이트 해준다.

ts @ run -u

위 명령을 내렸을떄, 우분투 14.04 에서 에러가 나는 문제가 있다.

다음과 같은 에러가 나는 경우.( 참조 : http://blog.1day1.org/523 )

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: watch ENOSPC
    at errnoException (fs.js:1024:11)
    at FSWatcher.start (fs.js:1056:11)
    at Object.fs.watch (fs.js:1081:11)
    at Gaze._watchDir ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:279:30)
    at {홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:336:10
    at iterate ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/helper.js:52:5)
    at Object.forEachSeries ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/helper.js:66:3)
    at Gaze._initWatched ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:332:10)
    at Gaze.add ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:167:8)
    at new Gaze ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:68:10)

관련 자료를 찾아보니 리눅스의 inotify 관련 설정때문이다. 더 정확히 max_user_watches 값이다.

다음 명령으로 해당값을 알 수 있다.

$ cat /proc/sys/fs/inotify/max_user_watches

8192

위 값을 늘려주면 된다.


다음과 같이 명령으로 max_user_watches 값을 늘려준다.( 값은 본인의 상황에 따라 )

$ echo fs.inotify.max_user_watches=65536 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
fs.inotify.max_user_watches=65536
fs.inotify.max_user_watches = 65536


이제 다시 tishadow 의 자동감지를 해보자. 다음처럼 나오면 정상이다.

$ ts @ run -u
[INFO] Beginning Build Process
[INFO] Compiling Alloy for android
[WARN] Nothing to update.



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vagrant 로 우분투 테스트 환경을 구성해보자.

타이타늄 세팅에 이상한 부분이 있어서 vagrant 로 센드박스를 만들어 테스트 하기로 한다.


1. vagrant 설치

우분투에는 기본 패키지로 등록되어 있다.

apt-get install vagrant


2. 우분투 14.04 를 vm 으로 세팅한다.

vagrant box add trusty https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

공개된 패키지 URL 은 http://www.vagrantbox.es 에서 찾을 수 있다.


3. vm 을 기본 환경을 만든다.

$ mkdir ubuntu14.04

$ cd ubuntu14.04

$ vagrant init trusty


A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

ubuntu14.04 디렉토리에 vagrant 파일이 생성되어 있을 것이다. 해당 디렉토리가 기본 실행환경이 된다.


4. vm 환경을 실행해본다.

$ vagrant up

다음처럼 실행되는 화면을 볼 수 있다.

Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'trusty'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Mounting shared folders...
[default] -- /vagrant


5. 가상머신 으로 접속해본다.(ssh)

$ vagrant ssh

다음처럼 가상머신으로 접속된다.

Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-30-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sat Jun 28 17:29:31 UTC 2014

  System load:  0.96              Processes:           89
  Usage of /:   2.7% of 39.34GB   Users logged in:     0
  Memory usage: 16%               IP address for eth0: 10.0.2.15
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


vagrant@vagrant-ubuntu-trusty-64:~$


이제 테스트 환경은 갖추어졌다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

titanium 개발시 TI sutdio 와 tishadow 를 이용해서 개발하면 편리하다.

eclipse 기반의 TI sutdio 가 좋기는 한데, 자신이 쓰는 편집기를 쓰고 싶을 수도 있다.

나의 경우 sublime text 를 쓴다. 그래서 관련 빌드 환경구성 및 사용법을 정리하고자 한다.


다음의 단계로 진행한다.

1) tishadow 실행환경으로 빌드하기 위해 build 를 별도위치에 생성한다.

자신의 프로젝트 위치에서 다음 명령을 내린다.

$ ts appify -d build/appify

다음과 비슷한 결과를 얻게 된다.

[INFO] Beginning Build Process
[INFO] Compiling Alloy for android
[INFO] 35 file(s) bundled.
[INFO] Bundle Ready: {자신의 프로젝트 위치}/build/tishadow/dist/project01.zip
[INFO] Creating new app...
[INFO] TiShadow app ready



다음을 진행하기 전에 android 기기가 연결되어 있는지 확인.

⟫ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
44db4d4c        unauthorized

=> 이렇게 나오면 안된다. device 라고 정상적으로 나와야 함. ( http://blog.1day1.org/518 를 참조)
  usb 연결을 끊었다가 다시 연결한다.

⟫ adb devices
List of devices attached
44db4d4c        device

OK 이제 정상으로 나왔다.


2) appify 방식으로 빌드한다.(실행위치 build/appify => 1)에서 정한 위치)

⟫ ti build -p android -T device

다음 명령으로 빌드하면 최종 폰에서 앱이 설치되고 실행된다.


3) 개발환경과 앱의 appify 가 통신하기 위한 server 실행.

⟫ ts server
[DEBUG] TiShadow server started. Go to http://localhost:3000

앱쪽으로 javascript 코드를 넘겨주는 역할의 서버를 실행한다.(기본포트 3000 을 이용한다)
실행위치는 아무곳이나 상관없다.


연결이 이상한 것 같아 host 를 지정해줬다.

⟫ ts config --host 192.168.0.33

다음 파일에 저장이 된다.
$ cat ~/.tishadow.json
{
    "host": "192.168.0.33"
}

⟫ ts server
[DEBUG] TiShadow server started. Go to http://192.168.0.33:3000

http://192.168.0.33:3000 로 접속해보면 연결된 device 가 보여야 한다.

안보인다. 뭔가 이상하다.

프로젝트가 이상한 것 같아. 다른 정상적인 프로젝트로 다시 해봤다.
아래처럼 Devices 부분에 연결된 장치가 보여야 정상이다.


4) 코드 변경을 감지하여 자동으로 빌드하고 server 로 업로드한다. (실행위치 프로젝트 )

⟫ ts run
[INFO] Beginning Build Process
[INFO] Compiling Alloy for android
[INFO] 35 file(s) bundled.
[INFO] BUNDLE sent.


변경 분만 빌드후 전송 (아래처럼 변경내용이 없으면 나오는 메시지는 정상)

⟫ ts run -u
...
[WARN] Nothing to update.




[아래 부분 실패]  => 해결책 : http://blog.1day1.org/533

자동 코드감지 ( @ 부분을 추가)

⟫ ts @ run -u


정상동작해야 하는데 뭔가 이상하다. 다음과 같은 에러가 발생.

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: watch ENOSPC
    at errnoException (fs.js:1024:11)
    at FSWatcher.start (fs.js:1056:11)
    at Object.fs.watch (fs.js:1081:11)
    at Gaze._watchDir ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:279:30)
    at {홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:336:10
    at iterate ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/helper.js:52:5)
    at Object.forEachSeries ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/helper.js:66:3)
    at Gaze._initWatched ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:332:10)
    at Gaze.add ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:167:8)
    at new Gaze ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:68:10)

node 패키지에 이상이 있는 것인가? 윈도우 쪽에서는 정상작동했다.

일단 수동으로 ts run 은 가능하니, 일단 여기까지. 추후 문제되는 부분을 확인해봐야 겠다.




5) sublime text 등 자신의 편집기로 개발

자신이 쓰는 편집기로 개발하면 된다. 소스 수정 후에  ts run -u 명령으로 빌드 => 전송 하여 바로 앱의 변경사항을 확인할 수 있다. 처음부터 빌드 하는 방식보다 편하고 빠르게 개발할 수 있다.



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

Titanium 개발. 모바일 개발 tishadow 로 편하게 하자

개발과정

코딩 => 빌드 => 디바이스 확인:(에뮬 or 폰)

의 과정을 거친다.

Titanium 개발시 빌드 과정을 조금이나마 줄일 수 있다.


관련자료

http://tidev.tistory.com/27
http://codejong.net/post/51276937188/tishadow
http://tidev.kr/t/tishadow/306


설치는 쉽다. npm 패키지 인스톨하면 된다.

npm install tishadow -g

쉘상에서 ts 명령을 내려보면 정상적으로 사용준비가 된 것이다.


titanium 에서 --shadow 옵션이 되게 하기 위해. 다음 명령을 내려준다.

$ ts express
[INFO] Titanium CLI hook installed. Now use the `--shadow` flag when buliding your project for express tishadow development


TI sutio 에서 프로젝트를 만들고, 워크스페이스에서 해당 프로젝트 위치로 이동해서 다음과 같은 명령을 내려준다.

ti build -p android -T device --shadow

다음과 같은 에러 메시지가 나온다면.

[INFO]  Building App...
[INFO]  Starting TiShadow server
[INFO]  Starting Watch...
[ERROR] TiShadow watch exited.


위와 같은 에러가 안나야 정상이다. 뭔가 꼬인 것 같다.
일단 수동으로 처리하는 방법으로 진행한다.(http://blog.1day1.org/523)

=> 이 문제의 해결방법 ( http://blog.1day1.org/533 )

위 에러의 상세내용은 다음과 같다.

⟫ ts @ run -u

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: watch ENOSPC
    at errnoException (fs.js:1024:11)
    at FSWatcher.start (fs.js:1056:11)
    at Object.fs.watch (fs.js:1081:11)
    at Gaze._watchDir ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:279:30)
    at {홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:336:10
    at iterate ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/helper.js:52:5)
    at Object.forEachSeries ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/helper.js:66:3)
    at Gaze._initWatched ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:332:10)
    at Gaze.add ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:167:8)
    at new Gaze ({홈}/lib/node_modules/tishadow/node_modules/gaze/lib/gaze.js:68:10)

위 부분때문에 정상실행되지 않는다.





반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

docker 를 어떻게 하면 잘 활용할 수 있을까?

여러가지 방향을 생각해본다.

vagrant 와는 다르게 linux 전용이라 구성에 제약이 따른다.


1. 최대의 성능.

배포용 : 개발머신(linux / docker 호스트)  => docker 이미지

개발용 : 개발PC(win/mac/linux) => 개발환경(linux / docker) + docker pull  <= 배포 이미지

  [필요사항] 배포용 머신이 팀 또는 개인이 보유하고 있어야 한다.

  [장점] linux 머신에 docker 를 바로 세팅해서 최대 성능을 낸다.
  [단점] 리눅스 환경의 개발PC 가 아니면 원격으로 접속해서 개발해야 한다.


2. 관리의 편의.

배포용 : 개발머신(docker 호스트)  => docker 이미지

개발용 : 개발PC+개발환경[ vagrant (docker) ] + docker pull  <= 배포 이미지

  [장점] 개발PC 의 OS 에 상관없이 개발환경을 세팅가능하다.(win / mac)
  [단점] vagrant(vm) 을 활용하기 때문에 성능저하가 있다.



# 개발이 완료된 후 서비스용 설정

기본 구성은 다음과 같이 하려 한다.

서비스서버(docker) + docker pull  <= 배포이미지

서비스서버 를 AWS / DigitalOcean / GoogleCloud 등의 가상서버로 세팅해도 되고, 서버호스팅의 리얼서버를 이용해도 된다.

클라우드는 성능저하가 있겠지만, 빠른배포 와 편의성을 잘 따져보고 결정하면 되겠다.

충분한 테스트를 해보고 결정하는 것이 좋겠다.


디지털오션쪽에 2개월정도 무료사용가능하니 먼저 테스트해봐야 겠다.
(512M 짜리 * 2개 => 1개월 , 4개 => 2주? , 8개 => 1주일정도? )


(무료 사용은 => 링크 참조)

테스트 해보고 사용해도 되겠다 판단이 되면, Core 를 늘려서 서비스용으로 활용해도 되겠다.


# 서비스 시나리오.

서비스용으로 10대의 클라우드 서버에 배포하는 시나리오를 만들고 테스트 해봐야 겠다.

그러고 보니 docker 모니터링툴도 필요하겠다. (관련 자료도 찾아봐야 겠네)


자동화에 필요한 사항은 다양한 시나리오 사례가 만들어지면, 재미있을 것 같다.


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

docker 를 우분투에 설치해봤다. 이제 기본 컨테이너 환경을 구성해보자.

- Centos 를 테스트로 구성해본다.

docker search centos

를 해보면, centos 관련 저장소에 있는 이미지들의 리스트를 보여준다.(무지 많다.)

- 아래 처럼 리스트가 많이 나온다. (docker hub 에 등록된 이미지 인듯함)

- 맨 위의 공식 이미지로 해보자.

docker pull centos

- 다음처럼 이미지를 다운받는 화면을 볼 수 있다.


- 완료가 되면 docker 컨테이너 환경으로 들어가 본다.

기본 호스트로 사용하고 있는 구조와 다르다. ubuntu 안에 centos 의 가상환경을 만들어 준것이다.


- 설치된 이미지를 확인해본다.

# docker images

다음 처럼 로컬에 설치한 이미지들을 볼 수 있다.

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               e54ca5efa2e9        2 days ago          276.1 MB
centos              centos6             0c752394b855        11 days ago         124.1 MB
centos              latest              0c752394b855        11 days ago         124.1 MB
centos              6.4                 539c0211cd76        14 months ago       300.6 MB



참조 : http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/


반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

docker 를 설치해본다.

우분투 14.04 에서는 간편하다. 이미 우분투 공식패키지로 등록이 되어 있다.

apt-get install docker.io


그러나 공식패키지는 버전업이 느리다.

# docker.io --version

Docker version 0.9.1, build 3600720


빠르게 버전업하는 패키지는 공식사이트의 배포버전을 사용하면 좋다.

echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list

apt-get update

apt-get install lxc-docker

한번에 끝내기

curl -s https://get.docker.io/ubuntu/ | sudo sh

위 스크립트를 받아서 실행하는 방법이다.

Docker version 1.0.1, build 990021a

최신버전으로 설치된다.


간단한 테스트.

# docker run ubuntu:14.04 /bin/echo 'Hello World'

다음과 같은 명령을 내리면.. 로컬이미지를 찾고,
없으면 저장소에서 찾아서 설치한 후 echo 'Hello World' 를 실행하게 된다.

Unable to find image 'ubuntu:14.04' locally
Pulling repository ubuntu
e54ca5efa2e9: Download complete
511136ea3c5a: Download complete
d7ac5e4f1812: Download complete
2f4b4d6a4a06: Download complete
83ff768040a0: Download complete
6c37f792ddac: Download complete
Hello World


하위 버전은 다음을 참조.

http://docs.docker.io.s3-website-us-west-2.amazonaws.com/installation/ubuntulinux/



반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,