반응형

HTML5 Canvas: Lunch Wheel - javascript 룰렛

 

blog.bramp.net/post/2011/07/27/html5-canvas-lunch-wheel/

 

HTML5 Canvas: Lunch Wheel

In the on going battle to make my lunch time more optimised I decided to learn some Javascript, and how to use the HTML5 Canvas element. Turns out it’s not that hard, and I have now created Click to …

blog.bramp.net

 

blog.bramp.net/wheel/

 

Lunch Wheel

 

blog.bramp.net

<html><head>
<meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible">
<title>Lunch Wheel</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.tinysort.min.js"></script>
<!--[if IE]><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jit/2.0.2/Extras/excanvas.min.js"></script><![endif]-->
<script type="text/javascript">
// Helpers
	shuffle = function(o) {
		for ( var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x)
			;
		return o;
	};

	String.prototype.hashCode = function(){
		// See http://www.cse.yorku.ca/~oz/hash.html		
		var hash = 5381;
		for (i = 0; i < this.length; i++) {
			char = this.charCodeAt(i);
			hash = ((hash<<5)+hash) + char;
			hash = hash & hash; // Convert to 32bit integer
		}
		return hash;
	}

	Number.prototype.mod = function(n) {
		return ((this%n)+n)%n;
	}
</script>
<script type="text/javascript">
venues = {
		"116208"  : "Jerry's Subs and Pizza",
		"66271"   : "Starbucks",
		"5518"    : "Ireland's Four Courts",
		"392360"  : "Five Guys",
		"2210952" : "Uptown Cafe",
		"207306"  : "Corner Bakery Courthouse",
		"41457"   : "Delhi Dhaba",
		"101161"  : "TNR Cafe",
		"257424"  : "Afghan Kabob House",
		"512060"  : "The Perfect Pita",
		"66244"   : "California Tortilla",
		"352867"  : "Pho 75 - Rosslyn",
		"22493"   : "Ragtime",
		"268052"  : "Subway",
		"5665"    : "Summers Restaurant & Sports Bar",
		"129724"  : "Cosi",
		"42599"   : "Ray's Hell Burger"
	};

	$(function() {

		var venueContainer = $('#venues ul');
		$.each(venues, function(key, item) {
			venueContainer.append(
		        $(document.createElement("li"))
		        .append(
	                $(document.createElement("input")).attr({
                         id:    'venue-' + key
                        ,name:  item
                        ,value: item
                        ,type:  'checkbox'
                        ,checked:true
	                })
	                .change( function() {
	                	var cbox = $(this)[0];
	                	var segments = wheel.segments;
	                	var i = segments.indexOf(cbox.value);

	                	if (cbox.checked && i == -1) {
	                		segments.push(cbox.value);

	                	} else if ( !cbox.checked && i != -1 ) {
	                		segments.splice(i, 1);
	                	}

	                	segments.sort();
	                	wheel.update();
	                } )

		        ).append(
	                $(document.createElement('label')).attr({
	                    'for':  'venue-' + key
	                })
	                .text( item )
		        )
		    )
		});

		$('#venues ul>li').tsort("input", {attr: "value"});
	});
</script>
<script type="text/javascript">
// WHEEL!
	var wheel = {

		timerHandle : 0,
		timerDelay : 33,

		angleCurrent : 0,
		angleDelta : 0,

		size : 290,

		canvasContext : null,

		colors : [ '#ffff00', '#ffc700', '#ff9100', '#ff6301', '#ff0000', '#c6037e',
		           '#713697', '#444ea1', '#2772b2', '#0297ba', '#008e5b', '#8ac819' ],

		//segments : [ 'Andrew', 'Bob', 'Fred', 'John', 'China', 'Steve', 'Jim', 'Sally', 'Andrew', 'Bob', 'Fred', 'John', 'China', 'Steve', 'Jim'],
		segments : [],

		seg_colors : [], // Cache of segments to colors
		
		maxSpeed : Math.PI / 16,

		upTime : 1000, // How long to spin up for (in ms)
		downTime : 17000, // How long to slow down for (in ms)

		spinStart : 0,

		frames : 0,

		centerX : 300,
		centerY : 300,

		spin : function() {

			// Start the wheel only if it's not already spinning
			if (wheel.timerHandle == 0) {
				wheel.spinStart = new Date().getTime();
				wheel.maxSpeed = Math.PI / (16 + Math.random()); // Randomly vary how hard the spin is
				wheel.frames = 0;
				wheel.sound.play();

				wheel.timerHandle = setInterval(wheel.onTimerTick, wheel.timerDelay);
			}
		},

		onTimerTick : function() {

			wheel.frames++;

			wheel.draw();

			var duration = (new Date().getTime() - wheel.spinStart);
			var progress = 0;
			var finished = false;

			if (duration < wheel.upTime) {
				progress = duration / wheel.upTime;
				wheel.angleDelta = wheel.maxSpeed
						* Math.sin(progress * Math.PI / 2);
			} else {
				progress = duration / wheel.downTime;
				wheel.angleDelta = wheel.maxSpeed
						* Math.sin(progress * Math.PI / 2 + Math.PI / 2);
				if (progress >= 1)
					finished = true;
			}

			wheel.angleCurrent += wheel.angleDelta;
			while (wheel.angleCurrent >= Math.PI * 2)
				// Keep the angle in a reasonable range
				wheel.angleCurrent -= Math.PI * 2;

			if (finished) {
				clearInterval(wheel.timerHandle);
				wheel.timerHandle = 0;
				wheel.angleDelta = 0;

				$("#counter").html((wheel.frames / duration * 1000) + " FPS");
			}

			/*
			// Display RPM
			var rpm = (wheel.angleDelta * (1000 / wheel.timerDelay) * 60) / (Math.PI * 2);
			$("#counter").html( Math.round(rpm) + " RPM" );
			 */
		},

		init : function(optionList) {
			try {
				wheel.initWheel();
				wheel.initAudio();
				wheel.initCanvas();
				wheel.draw();

				$.extend(wheel, optionList);

			} catch (exceptionData) {
				alert('Wheel is not loaded ' + exceptionData);
			}

		},

		initAudio : function() {
			var sound = document.createElement('audio');
			sound.setAttribute('src', 'wheel.mp3');
			wheel.sound = sound;
		},

		initCanvas : function() {
			var canvas = $('#wheel #canvas').get(0);

			if ($.browser.msie) {
				canvas = document.createElement('canvas');
				$(canvas).attr('width', 1000).attr('height', 600).attr('id', 'canvas').appendTo('.wheel');
				canvas = G_vmlCanvasManager.initElement(canvas);
			}

			canvas.addEventListener("click", wheel.spin, false);
			wheel.canvasContext = canvas.getContext("2d");
		},

		initWheel : function() {
			shuffle(wheel.colors);
		},

		// Called when segments have changed
		update : function() {
			// Ensure we start mid way on a item
			//var r = Math.floor(Math.random() * wheel.segments.length);
			var r = 0;
			wheel.angleCurrent = ((r + 0.5) / wheel.segments.length) * Math.PI * 2;

			var segments = wheel.segments;
			var len      = segments.length;
			var colors   = wheel.colors;
			var colorLen = colors.length;

			// Generate a color cache (so we have consistant coloring)
			var seg_color = new Array();
			for (var i = 0; i < len; i++)
				seg_color.push( colors [ segments[i].hashCode().mod(colorLen) ] );

			wheel.seg_color = seg_color;

			wheel.draw();
		},

		draw : function() {
			wheel.clear();
			wheel.drawWheel();
			wheel.drawNeedle();
		},

		clear : function() {
			var ctx = wheel.canvasContext;
			ctx.clearRect(0, 0, 1000, 800);
		},

		drawNeedle : function() {
			var ctx = wheel.canvasContext;
			var centerX = wheel.centerX;
			var centerY = wheel.centerY;
			var size = wheel.size;

			ctx.lineWidth = 1;
			ctx.strokeStyle = '#000000';
			ctx.fileStyle = '#ffffff';

			ctx.beginPath();

			ctx.moveTo(centerX + size - 40, centerY);
			ctx.lineTo(centerX + size + 20, centerY - 10);
			ctx.lineTo(centerX + size + 20, centerY + 10);
			ctx.closePath();

			ctx.stroke();
			ctx.fill();

			// Which segment is being pointed to?
			var i = wheel.segments.length - Math.floor((wheel.angleCurrent / (Math.PI * 2))	* wheel.segments.length) - 1;

			// Now draw the winning name
			ctx.textAlign = "left";
			ctx.textBaseline = "middle";
			ctx.fillStyle = '#000000';
			ctx.font = "2em Arial";
			ctx.fillText(wheel.segments[i], centerX + size + 25, centerY);
		},

		drawSegment : function(key, lastAngle, angle) {
			var ctx = wheel.canvasContext;
			var centerX = wheel.centerX;
			var centerY = wheel.centerY;
			var size = wheel.size;

			var segments = wheel.segments;
			var len = wheel.segments.length;
			var colors = wheel.seg_color;

			var value = segments[key];
			
			ctx.save();
			ctx.beginPath();

			// Start in the centre
			ctx.moveTo(centerX, centerY);
			ctx.arc(centerX, centerY, size, lastAngle, angle, false); // Draw a arc around the edge
			ctx.lineTo(centerX, centerY); // Now draw a line back to the centre

			// Clip anything that follows to this area
			//ctx.clip(); // It would be best to clip, but we can double performance without it
			ctx.closePath();

			ctx.fillStyle = colors[key];
			ctx.fill();
			ctx.stroke();

			// Now draw the text
			ctx.save(); // The save ensures this works on Android devices
			ctx.translate(centerX, centerY);
			ctx.rotate((lastAngle + angle) / 2);

			ctx.fillStyle = '#000000';
			ctx.fillText(value.substr(0, 20), size / 2 + 20, 0);
			ctx.restore();

			ctx.restore();
		},

		drawWheel : function() {
			var ctx = wheel.canvasContext;

			var angleCurrent = wheel.angleCurrent;
			var lastAngle    = angleCurrent;

			var segments  = wheel.segments;
			var len       = wheel.segments.length;
			var colors    = wheel.colors;
			var colorsLen = wheel.colors.length;

			var centerX = wheel.centerX;
			var centerY = wheel.centerY;
			var size    = wheel.size;

			var PI2 = Math.PI * 2;

			ctx.lineWidth    = 1;
			ctx.strokeStyle  = '#000000';
			ctx.textBaseline = "middle";
			ctx.textAlign    = "center";
			ctx.font         = "1.4em Arial";

			for (var i = 1; i <= len; i++) {
				var angle = PI2 * (i / len) + angleCurrent;
				wheel.drawSegment(i - 1, lastAngle, angle);
				lastAngle = angle;
			}
			// Draw a center circle
			ctx.beginPath();
			ctx.arc(centerX, centerY, 20, 0, PI2, false);
			ctx.closePath();

			ctx.fillStyle   = '#ffffff';
			ctx.strokeStyle = '#000000';
			ctx.fill();
			ctx.stroke();

			// Draw outer circle
			ctx.beginPath();
			ctx.arc(centerX, centerY, size, 0, PI2, false);
			ctx.closePath();

			ctx.lineWidth   = 10;
			ctx.strokeStyle = '#000000';
			ctx.stroke();
		},
	}

	window.onload = function() {
		wheel.init();

		var segments = new Array();
		$.each($('#venues input:checked'), function(key, cbox) {
			segments.push( cbox.value );
		});

		wheel.segments = segments;
		wheel.update();

		// Hide the address bar (for mobile devices)!
		setTimeout(function() {
			window.scrollTo(0, 1);
		}, 0);
	}
</script>
</head>
<body>
<div id="venues" style="float:left"><ul><li><input id="venue-257424" name="Afghan Kabob House" value="Afghan Kabob House" type="checkbox" checked="checked"><label for="venue-257424">Afghan Kabob House</label></li><li><input id="venue-66244" name="California Tortilla" value="California Tortilla" type="checkbox" checked="checked"><label for="venue-66244">California Tortilla</label></li><li><input id="venue-207306" name="Corner Bakery Courthouse" value="Corner Bakery Courthouse" type="checkbox" checked="checked"><label for="venue-207306">Corner Bakery Courthouse</label></li><li><input id="venue-129724" name="Cosi" value="Cosi" type="checkbox" checked="checked"><label for="venue-129724">Cosi</label></li><li><input id="venue-41457" name="Delhi Dhaba" value="Delhi Dhaba" type="checkbox" checked="checked"><label for="venue-41457">Delhi Dhaba</label></li><li><input id="venue-392360" name="Five Guys" value="Five Guys" type="checkbox" checked="checked"><label for="venue-392360">Five Guys</label></li><li><input id="venue-5518" name="Ireland's Four Courts" value="Ireland's Four Courts" type="checkbox" checked="checked"><label for="venue-5518">Ireland's Four Courts</label></li><li><input id="venue-116208" name="Jerry's Subs and Pizza" value="Jerry's Subs and Pizza" type="checkbox" checked="checked"><label for="venue-116208">Jerry's Subs and Pizza</label></li><li><input id="venue-352867" name="Pho 75 - Rosslyn" value="Pho 75 - Rosslyn" type="checkbox" checked="checked"><label for="venue-352867">Pho 75 - Rosslyn</label></li><li><input id="venue-22493" name="Ragtime" value="Ragtime" type="checkbox" checked="checked"><label for="venue-22493">Ragtime</label></li><li><input id="venue-42599" name="Ray's Hell Burger" value="Ray's Hell Burger" type="checkbox" checked="checked"><label for="venue-42599">Ray's Hell Burger</label></li><li><input id="venue-66271" name="Starbucks" value="Starbucks" type="checkbox" checked="checked"><label for="venue-66271">Starbucks</label></li><li><input id="venue-268052" name="Subway" value="Subway" type="checkbox" checked="checked"><label for="venue-268052">Subway</label></li><li><input id="venue-5665" name="Summers Restaurant &amp; Sports Bar" value="Summers Restaurant &amp; Sports Bar" type="checkbox" checked="checked"><label for="venue-5665">Summers Restaurant &amp; Sports Bar</label></li><li><input id="venue-512060" name="The Perfect Pita" value="The Perfect Pita" type="checkbox" checked="checked"><label for="venue-512060">The Perfect Pita</label></li><li><input id="venue-101161" name="TNR Cafe" value="TNR Cafe" type="checkbox" checked="checked"><label for="venue-101161">TNR Cafe</label></li><li><input id="venue-2210952" name="Uptown Cafe" value="Uptown Cafe" type="checkbox" checked="checked"><label for="venue-2210952">Uptown Cafe</label></li></ul></div>
<div id="wheel">
<canvas height="600" id="canvas" width="1000"></canvas>
</div>
<div id="stats">
<div id="counter">30.278136368970777 FPS</div>
</div>


</body></html>
반응형
반응형

Bootstrap - admin LTE

 

version 3 :adminlte.io/themes/dev/AdminLTE/index3.html

 

AdminLTE 3 | Dashboard 3

12% CONVERSION RATE 0.8% SALES RATE 1% REGISTRATION RATE

adminlte.io

version 2 : adminlte.io/themes/AdminLTE/index2.html

 

AdminLTE 2 | Dashboard

Sales: 1 Jan, 2014 - 30 Jul, 2014

adminlte.io

반응형
반응형

 

 

powerbi.microsoft.com/ko-kr/why-power-bi/

 

Power BI를 사용해야 하는 이유 - 기능과 이점 | Microsoft Power BI

셀프 서비스 및 엔터프라이즈 분석 통합 단일 플랫폼에서 셀프 서비스 및 엔터프라이즈 데이터 분석 요구 사항을 모두 충족하세요. 강력한 의미 체계 모델, ALM(애플리케이션 수명 주기 관리) 툴

powerbi.microsoft.com

Power BI youtube : www.youtube.com/user/mspowerbi

 

Microsoft Power BI

Power BI is a business analytics service that enables you to see all of your data through a single pane of glass. Live Power BI dashboards and reports includ...

www.youtube.com

파트너 쇼케이스 : powerbi.microsoft.com/ko-kr/partner-showcase/

 

파트너 쇼케이스 | Microsoft Power BI

파트너가 Power BI를 어떻게 활용하고 있는지 확인 비즈니스 데이터에 적합한 BI 솔루션을 찾고 싶나요? Microsoft의 인증 파트너는 많은 수의 업계 및 기술 분야에서 다양한 환경을 갖추고 있습니다.

powerbi.microsoft.com

데이터 인사이트의 시각화 사례 : app.powerbi.com/view?r=eyJrIjoiNGU3ODUyYzEtZGZhYS00NWM0LTg0MGItNzRlMzhmMWY2MmM1IiwidCI6IjUyMmEwZjg5LWFlNTgtNDNiNi04MjFiLTJiMDZjZWNjN2Q4YSIsImMiOjEwfQ%3D%3D

 

Power BI Report

Report powered by Power BI

app.powerbi.com

 

 

 

Agile Analytics - HR Analytics : 

powerbi.microsoft.com/ko-kr/partner-showcase/agile-analytics-hr-analytics/

 

파트너 쇼케이스 | Microsoft Power BI

Power BI 파트너가 되고 싶으세요? 팀에서 인증 파트너의 역할이 중요합니다. 회사의 인재들이 전 세계의 Power BI 사용자와 연결하여 경험을 공유하며 새로운 비즈니스 기회를 확대할 수 있습니다.

powerbi.microsoft.com

 

반응형

'프로그래밍' 카테고리의 다른 글

정량평가 vs 정성평가  (0) 2020.11.25
The Expert - 7 RED Lines  (0) 2020.11.25
구글, 수수료 30% 인상 전격 연기  (0) 2020.11.23
쿠팡 상품공유시 리워드 시작.  (0) 2020.11.23
네이버 클라우드 구인 중  (0) 2020.11.23
반응형

ASP - random 적용 난수 발생

 

	Function fncRandom_str()
		Dim str_rnd, strlen_rnd, rnd_r, rnd_i, rnd_ds, serialCode, nLength '사용되는 변수를 선언
	
		str_rnd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" '랜덤으로 사용될 문자 또는 숫자

		strlen_rnd = 7 '랜덤으로 출력될 값의 자릿수 ex)해당 구문에서 10자리의 랜덤 값 출력
        
        nLength = Len( str_rnd )
		Randomize '랜덤 초기화
		For rnd_i = 1 To strlen_rnd '위에 선언된 strlen_rnd 랜덤 코드 생성
			rnd_r = Int((nLength - 1 + 1) * Rnd + 1)  ' 36은 str의 문자갯수

			serialCode = serialCode + Mid(str_rnd,rnd_r,1)
		Next
		fncRandom_str = serialCode
	
        'Response.Write  random_str()
	End Function
반응형
반응형

AWSOME DAY 온라인 컨퍼런스

 

 

AWSome Day 온라인 컨퍼런스는 AWS 클라우드를 시작하기 위한 가장 기본적인 필수 입문 교육 과정입니다. 컴퓨팅, 스토리지, 데이터베이스 및 네트워크 등 AWS의 핵심 서비스와 AWS 클라우드 활용의 기초에 대해 확인해보세요! AWSome Day 온라인은 IT 전문가, 기업 경영진, 시스템 엔지니어, 시스템 관리자, 개발자, 그리고 솔루션 아키텍트 등을 위한 이상적인 내용으로 구성되어 있습니다.

 

kr-resources.awscloud.com/awsome-day-online-conference

 

AWSOME DAY 온라인 컨퍼런스

AWSome Day 온라인 컨퍼런스는 AWS 클라우드를 시작하기 위한 가장 기본적인 필수 입문 교육 과정입니다. 컴퓨팅, 스토리지, 데이터베이스 및 네트워크 등 AWS의 핵심 서비스와 AWS 클라우드 활용의

kr-resources.awscloud.com

 

반응형
반응형

세상이 변하면 성공 방정식도 변하게 됩니다.
어제의 성공방정식만 믿고 있는 사람은 내일의 패배자가 됩니다.
이제는 많이 아는 사람이 성공하는 것이 아니라,
늘 언제나 부족하다는 지적 겸손으로 모든 것에 호기심을 가지고
끊임없이 배움을 실천하는 사람들이 미래의 주인이 됩니다.
- 젠슨 황, 엔디비아 CEO


그동안은 많이 배운 사람이 성공하던 시기였습니다.
그러나 이제는 과거의 경험과 지식이 오히려 미래의 발목을 잡을 가능성이
점점 더 커지고 있습니다. 많이 배워서 많이 아는 사람이 아닌,
많이 배우려고 하는 사람, 호기심이 많고 끝없이 질문하는 사람이
승자가 되는 시대가 되었습니다.

반응형
반응형

아버지보다 오래도록 살아남은 몸이시다

쓸고 또 쓰는 일이
티 안 나게 티 나지만

쓸수록 닳고 닳아져 와불처럼 누우셨다


- 박화남의 시집《황제 펭귄》에 실린 시〈몽당 빗자루〉(전문)에서 -


* 라떼는...
빗자루 하나도 참으로 귀했습니다.
솔기가 남지 않은 몽당 빗자루가 될 때까지
쓸고 또 쓸었습니다. 그러다가 도저히 더는 쓸 수
없게 되면 그때서야 비로소 와불처럼 누웠습니다.
아버지가 세상을 떠났어도 몽당 빗자루는
아직도 그 자리에 누워 있습니다.

반응형

'생활의 발견 > 아침편지' 카테고리의 다른 글

'그저 건강하게 있어달라'  (0) 2020.11.26
간디가 기억하는 '나의 어머니'  (0) 2020.11.25
올바른 배움의 자세  (0) 2020.11.23
잠깐의 여유  (0) 2020.11.23
잠깐의 여유  (0) 2020.11.23

+ Recent posts