var char = "냐";
var idx = -1;
var sum = 0;
do {
idx = str.indexOf(char,idx+1);
if(idx != -1)
sum++;
} while (idx != -1);
console.log("\""+char+"\"가 "+sum+"개 있습니다.");
// "냐"가 2개 있습니다.
참고) lastIndexOf() – 뒤에서부터 검색한다.
match(regexp)
물론 이와같이 특정 문자를 문자열에서 알아보는데는 match()함수를 쓰면 간단하다. (정규표현식을 사용한다)
TV에서 스타킹을 보는데 닭이 하나 나와서 재주를 부린다.
놀라운건 이 닭이 마트에서 파는 유정란을 부화한것이라고..
스타킹에 출연한 마트 유정란으로 키운 ‘천재닭 마트’
어렸을때 학교앞에서 병아리를 많이 사서 닭으로 길렀던 기억이 나서..흥분
정말 되는지 테스트해보고도 싶고..
원래 부화기를 DIY해서 만들려면 전구 혹은 히터 그리고 박스나 온도조절기등 어느정도 준비를 해야하는데 마음이 급해서 마침 몇 주 전에 산 요구르트 제조기가 생각났다.
수은온도계와 롯데슈퍼에서 산 유정란 (사진을 못찍었다.)함께 사서 집에 있던 요구르트 제조기에서 부화를 시도하기로 작정
(당일날 찍은사진은 아니지지만)요구르트 제조기가 공간이 좁아서 한알만 시도해야하는 상황..
유정란 10개중 맘에드는 하나만 골랐다.(유정란은 5월 14자 포장된걸 잘 골라 샀다. 너무 오래된건 부화률이 떨어진다고 하여)
제조기는 일정온도를 유지하는 단순한 기계이다. 하지만 40도는 도달하는듯하다.
인터넷에 찾아본 바 부화 적정온도는 37.5 ~ 37.7도
요구르트 제조기 밑쪽이 좀 뜨거운듯 하여 아래 박스로 구조물을 조금 만든뒤 위로 띄워서
못쓰는 수면양말속에 달걀을 넣었다.
수은 온도계가 크기땜에 들어갈 곳이 없어서 ..ㅜ.ㅜ 그냥 방에 온도재는용도로 쓰고
온도를 제대로 재지 못해 난감해 하다 결국 온습도계를 인터넷으로 주문했다.
이 모델은 외부 온도를 같이 잴수 있는 센서와 선이 있는모델이다.
나와같은 상황에선 잘산거같다. 선만 부화기 요구르트 제조기안에 넣으면되니까..
너무 꽉 닫으면 환기가 안되기땜에 항상 살짝씩은 열어두었다.
참고로
요구르트 제조기는 1.5만원.
유정란 10개 4000원
온습도계 1만원 총 3만원이 들었다. (나머지 유정란은 먹었다~~ㅠㅠ)
5월 22일 금요일 (6~7일차)
일주일 정도 지난뒤 Candling(검란 : 불빛에 비춰서 알을 관찰하는것)을 해보았다.
와!! 달걀 껍질이 좀 고르지않고 어두워서인지 잘 보이진 않았는데…사진을찍고보니
선명하진 않지만 실핏줄(vessel)이 보인다.(스마트폰 Flash light로)
진행되고 있구나… 안도의 한숨~ ^__^;
온도는 정확히 맞추기가 힘들었다.
어쩔때 보면 38도를 넘기도 하고 39도가 되어있기도 해서 열어서 식혀주기도하고..
온도계 센서를 알 위쪽에대면 35도대고 아래쪽에 대면 38도가 넘고 그래서…
그냥 감으로 이정도면 되지않을까 의구심가득…진행한 면이 있다.
온도는 28도정도인가 최소 발육이 진행되는 온도만 넘으면 발육이 멈추지는 않는것같다.
하지만 고온에 오래 노출되는것도 위험한.. 그래서 높은온도를 더 무서워했다.
적정온도인 37.7보다 약간높으면 부화가 하루정도 빠르고 약간 적으면 부화가 하루이틀 느리다고 한다.
중간중간 인터넷 검색을 하면서 많은 자료를 보았다.
전란(알을 굴려서 온도나 혈액순환을 돕는거..)을 해주어야 하는데
기계가 없으니 수동으로 해야했다. 거의 매일 해주긴했다.
중간중간 검란을 더 해봤는데 심장이 뛰는건지 발을 움직이는건지 검은게 꿀렁 꿀렁 하는것이
자라고 있는듯 했다. 사실 부화가 첨이고 일반적인 부화방식이 아니라서..
이게 썩고있는건지 의심이 갈때가 한두번이 아니었다는..
6월 4일 목요일 (18~19일차)
저녁에 찍은사진이다.
Air Sac(사진에 보이는 공기층)이 크게 보인다.
18일이 되면 저 에어섹이 커지고 안이 검어진다고
보통 21일이 되면 나온다는데 6월 6일 토요일 전후로 나오지 않을까 기대를 하고있다.
6월 6일 토요일 (21~22일차)
5월 16일에 입란했지만 거의 10시넘은 밤에 한지라 사실상 오늘이 21일차라고 봐도 무방..하지만 아직 파각소식이 없다…머가 잘못된걸까? 온도가 낮아서일 가능성이 있다.. 그리고 전란을 18일째부터는 멈추라고 하는데 이건 기계를 써서 굴릴때 파각하는 애들이 있늘까봐 그런걸로 아는데…. 아닐지도… 어쨋든 난 몇번 좀 뒹굴뒹굴 해줬다..
오늘중에 나왔으면 좋으련만…23일째 나오는 애들도 있다고 하니 기다려봐야겠다..
현재시간 15:30분 – 병아리 소리가 들림 !!!!!!!
껍질 두두리는 소리 (볼륨업)..”똑 똑 똑 똑”…
“삐약 삐약” 소리
6월 7일 일요일 (22~23일차)
새벽2시 드디어 첫 파각 육안으로 확인!!
귀로는 몇시간동안 이어폰마이크를 껍질에 닿게해서 계속 듣고있었다. 녹음도하고..
너무 여리게 톡톡 쪼아서 그렇게 밖에 들리지 않았다.
구두발자국소리 처럼 일정한 비트.. 96비트 Moderato로
“콕-콕-콕-콕….”
거의 쉬질 않더란…어떻게 이럴 수 있는지 신기하다.
그래서 이게 심장박동인가?? 계속 의심했으나 중간중간 쉬는것을 봐서
부리로 쪼는 소리라고 생각…
2초에 3번정도? 계산해본결과 20초에 30번..1분엔 거의 90번 한시간엔 약 500번..10시간엔 5000번..
어제 오후 3시부터라고 쳐도 10시간은 족히 넘었다.
그러니 저게 적어도 오천번은 쪼은거란거다..
난 그것도 모르고 열었다 놨다 뒤집었다..ㅡ.,ㅜ
부화직전에 전란을 하지말란 이유를 이제 알거같다.
아주 작은 힘으로 수없이 한곳을 쪼아서 겨우겨우 파각을 하는것인데..말이다!
나오는 동안 털이 말라 껍질에붙지 않도록 습도조절을 잘해야겠다.
이제 자고 일어나면 ..짜잔?~
오전 10시
죽었다..
내가 너무 마지막에 스트레스를 준것같다.. 부리 위치가 아래쪽인거같은데
굳이 원인을 찾자면 마르지 않게한다고 습도를 너무 높인거같기도하고
알을 깨는데 기력을 다 소진한것같기도 하도..거의 다 깼는데..
결국 죽었다.
RIP..
stooge의 nickname은 변경이 안되었다.
사실 another_stooge 도 변경됬다기 보다는
nickname 요소를 another_stooge객체 자신이 갖고있는 것과 stooge객체에서 상속받은것 두개인것이다.
대신 자신의 요소를 먼저 바라본다. 이를 확인해보기위해 nickname요소를 삭제해본다.
delete
객체의 요소를 삭제할때는 delete를 사용한다.
delete another_stooge.nickname;
이 때 자신의 것만 삭제되고 상속받은 것은 삭제되지 않아 계속 nickname접근이 가능하다.
우리나라 로또추첨방식은 6/45 즉, 45개의 공중에 6개의 공을 선택한다.
45개의 숫자중 6개의 숫자를 무작위로 선택 후 작은번호부터 재배열 하는것이다.
기존의 알고리즘이 난수를 발생하여 45개중 공을 선택하여 기존의 공과 중복이 되는지를 검출했다면
좀더 효율적인 방법이 없을까 하여. 한번 뽑아낸 공은 제외시키고 그 다음공은 나머지 공에서 추출하는 방법을 고민해보았다.
(이 방법이 현실과 닮아 있긴하다)
일단 반복문을 통해 push()로 1 ~ 45번까지 aryLotto 배열에 담는다. 그리고 바로 여섯 번에 걸쳐 공을 꺼내게 되는데
Math.random() 난수발생 후 Math.floor()를 통해 0~44 까지의 임의 숫자를 생성한다. 보통 1~45의 숫자를 선택하기 위해 난수발생후 +1을 해주지만 이번방식은 배열의 위치만을 사용할것이므로 그대로 쓴다.
만약 첫번째 난수로 33가 나왔다면 이는 ’34’이란 숫자가 선택된것이다. (idx 변수에 담았다) 이 34이란 숫자는 나의 로또 번호중 첫번째가 되었다. 이를 배열 myLotto에 push()해서담는다.
담고나서 기존 45개 배열aryLotto에서 선택된 숫자 ’34’ (배열index 로는 33)를 splice()를 통해 삭제한다. splice(idx,1) 에서 첫번째 인자는 배열 index이고 두번째 인자는 갯수이다.(한개의 번호만 제외하는것이므로 1을 사용했다.)
var myLotto = [];
var aryLotto = [];
var idx = 0;
for (var i = 1; i < 46; ++i) aryLotto.push(i)
while (myLotto.length < 6){
idx = Math.floor(Math.random()*aryLotto.length);
myLotto.push(aryLotto[idx]);
aryLotto.splice(idx,1);
}
myLotto.sort(sortNumber);
function sortNumber(a, b) {
return a - b;
}
다시 정리하면 45개의 숫자가 담긴 배열에서 33번째숫자(34)를 선택해서 새배열에 담고 그 33번째 숫자(34)를 삭제한것이다.
이 과정이 5번반복되면 되는데 중요한것은 빠진 숫자만큼 전체갯수가 줄었기때문에 난수발생시 그만큼 숫자를 줄여야 한다. (첨에 45개중에 골랐다면 그담은 44개중에 골라야하므로) 이는 aryLotto의 배열의 길이(aryLotto.length)와 같으므로 난수발생시 이 길이를 곱해주면된다.
5개의 숫자가 담겼다. 하지만 무작위로 선택된 5개의 숫자를 작은 수 부터 정렬하면 좋겠다. javascript에서 sort()라는 정렬함수를 제공하지만 이는 수를 크기별로 정렬하지 못하고 알파벳순으로 정렬한다.(예를들어 5, 11,7,1,3,10,8 를 sort로 정렬하면 1,10,11,3,5,8 로 정렬된다 우리가 기대한 1,3,5,7,8,10,11이 아니다) 그러므로 펑션을 하나 써서 sort를 해주어야한다.
functionsortNumber(a, b) {
returna - b;
}
aryMyLott.sort(sortNumber);
이제 정렬이 제대로 된다.
이로서 javascript를 이용한 중복검사를 하지 않는 로또자동생성 프로그램을 만들어 보았다.이 프로그램에 사용된 js함수를 정리하면 다음과 같다.