tag:blogger.com,1999:blog-33208496212890757612024-03-05T03:33:25.841-08:00A Software Engineering Blog: Tips, Code and Tutorialsscottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.comBlogger59125tag:blogger.com,1999:blog-3320849621289075761.post-28277838434552118752019-09-15T00:10:00.002-07:002019-09-15T00:10:25.563-07:00Largest Profit from Daily Stock DataThe problem is to take an array of daily stock prices and find the maximum profit from buying one day and selling on a later day (I assume, you cannot buy and sell on the same day and that you must pick one day to buy and one day to sell).
<br />
<br />
Basically, my algorithm sets buy dates and walks through the array until a date with a lesser value than the buy date occurs. If there are any dates between the buy date and the lesser value date, then the maximum value on these dates is considered the sell date for that buy date. If there are no dates between the buy date and the lesser value date, then the lesser value date becomes the sell date for the buy date. The lesser value date then becomes the next buy date.
<br />
<br />
Example 1. As an example, consider this array: 9, 10, 12, 11, 9, 5, 7, 10, 8, 4, 1, 3, 2. This array then becomes [9, 12][5, 10][4, 1][1, 3]. 9 is the first buy date and the first lesser value date is 5, so 12 becomes the first sell date (max value between 9 and 5). 5 becomes the second buy date and the second lesser value date is 4, so 10 becomes the second buy date (max value between 5 and 1). 4 is the third buy date and 1 is the third lesser value date, so 1 becomes the third sell date (no dates in between). Finally, 1 becomes the fourth buy date and there is no fourth lesser value date, so 3 becomes the fourth sell date (max value after 1). Therefore, the max profit is 10-5=5.
<br />
<br />
Example 2. Consider this array: 10, 8, 7, 4. This array becomes [10, 8][8, 7][7, 4]. 10 is the first buy date, 8 is the first lesser value date, so 8 becomes the first sell date (no dates in between). 8 is the second buy date, 7 is the second lesser value date, so 7 becomes the second sell date (no dates in between). 7 is the third buy date, 4 is the third lesser value date, so 4 becomes the third sell date (no dates in between). Therefore, the max profit is 7-8=-1.
<br />
<br />
Why does this work?<br />
<br />
Let v_n denote the stock price on the nth day, where 0 <= n < N. Let H be the set of all pairs (B, S) such that:<br />
P1) 0 <= B < N<br />
P2) 0 <= S < N<br />
P3) B < S<br />
P4) For any other values p, q such that:<br />
i) 0 <= p < N<br />
ii) 0 <= q < N<br />
iii) p < q<br />
Then v_q - v_p <= v_S - v_B<br />
<br />
In other words, the Bth and Sth day represent the buy and sell dates respectively that will result in the maximum profit.<br />
<br />
Now suppose, we have b, s, e such that:<br />
T1) 0 <= b < N<br />
T2) 0 <= s < N<br />
T3) 0 <= e < N<br />
T4) b < s<br />
T5) s <= e<br />
T6) For every j such that 0 <= j < b, then v_b < v_j<br />
T7) For every j such that b <= j <= e, then v_b <= v_j and v_j <= v_s<br />
<br />
Then, only one of the following can be true:<br />
Q1) (b,s) is in H<br />
Q2) For every j, k such that 0 <= j < N, b <= k <= e, (j, k) is not in H<br />
<br />
Suppose (b,s) is not in H and there exists j, k such that 0 <= j < N, b <= k <= e where (j, k) is in H. If (j, k) is in H, then by P3, 0 <= j < k <=e. By T4, 0 <= j < b or b <= j < k <= e. Then, by T6 and T7, v_b <= v_j. By T7, v_k <= v_s. Let p, q satisfy i), ii) and iii). Then, v_s - v_b >= v_k - v_j >= v_q - v_p. Therefore, (b,s) is in H, a contradiction.<br />
<br />
Here, I have proven that if we find values b, s, e that satisfy properties 1) - 7), then either (b,s) provides the maximum profit by buying and selling on those days or selling on any days from b to e, including b and e, will not provide the maximum profit. In other words, selling on any day from b to e, can only yield as much profit as selling on day s. This allows us to rule out many days as potential selling days. Also, if s happens to be the day to sell that will yield the most profit, buying on any day from 0 to s - 1, including 0 and s-1, can only yield as much profit as buying on day b.<br />
<br />
Source
<br />
<br />
<pre auto="" courier="" monospace="" new="" overflow:="" style="border: 1px dashed #008def; font-size: 13px; line-height: 18px; padding: 15px; text-align: left;"><span style="color: #7b0052; font-weight: bold;">package</span> algorithm;
<span style="color: #3f5fbf;">/**
* Assume stock prices are given in an array and you can pick one day to buy and a different day to sell
* The sell day must be after the buy day
* What is the profit from the best buy and sell?
* @author sizu
*
*/</span>
<span style="color: #7b0052; font-weight: bold;">public</span> <span style="color: #7b0052; font-weight: bold;">class</span> BestBuyAndSell <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">public</span> <span style="color: #7b0052; font-weight: bold;">static</span> <span style="color: #7b0052; font-weight: bold;">void</span> main(String[] args) <span style="color: #7b0052; font-weight: bold;">throws</span> Exception <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> maxProfit1 = findMaxProfit(<span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>9, 8, 12, 5, 9, 10, 1, 2<span style="color: #d3171b; font-weight: bold;">}</span>);
System.out.println(<span style="color: #2a00ff;">"maxProfit1:"</span>+maxProfit1); <span style="color: #3f7f5f;">// 5
</span>
<span style="color: #7b0052; font-weight: bold;">int</span> maxProfit2 = findMaxProfit(<span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>15, 9, 8, 6, 3<span style="color: #d3171b; font-weight: bold;">}</span>);
System.out.println(<span style="color: #2a00ff;">"maxProfit2:"</span>+maxProfit2); <span style="color: #3f7f5f;">// -1
</span>
<span style="color: #7b0052; font-weight: bold;">int</span> maxProfit3 = findMaxProfit(<span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>9, 8, 12, 5, 9, 10, 1, 15<span style="color: #d3171b; font-weight: bold;">}</span>);
System.out.println(<span style="color: #2a00ff;">"maxProfit3:"</span>+maxProfit3); <span style="color: #3f7f5f;">//14
</span> <span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">private</span> <span style="color: #7b0052; font-weight: bold;">static</span> <span style="color: #7b0052; font-weight: bold;">int</span> findMaxProfit(int[] priceArray) <span style="color: #7b0052; font-weight: bold;">throws</span> Exception <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">if</span>(priceArray.length < 2) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">throw</span> <span style="color: #7b0052; font-weight: bold;">new</span> Exception (<span style="color: #2a00ff;">"invalid argument"</span>);
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">int</span> currentMax = priceArray[1] - priceArray[0]; <span style="color: #3f7f5f;">// Arbitrarily to buy on day 1, sell on day 2
</span> <span style="color: #7b0052; font-weight: bold;">int</span> min = priceArray[0];
Integer max = <span style="color: #7b0052; font-weight: bold;">null</span>;
<span style="color: #3f7f5f;">// O(n)
</span> <span style="color: #7b0052; font-weight: bold;">for</span>(<span style="color: #7b0052; font-weight: bold;">int</span> i=1; i<priceArray.length; i++) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> currentVal = priceArray[i];
<span style="color: #7b0052; font-weight: bold;">if</span>(currentVal < min) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">if</span>(max != <span style="color: #7b0052; font-weight: bold;">null</span>) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> profit = max - min;
<span style="color: #7b0052; font-weight: bold;">if</span>(profit > currentMax) <span style="color: #d3171b; font-weight: bold;">{</span>
currentMax = profit;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span> <span style="color: #7b0052; font-weight: bold;">else</span> <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> profit = currentVal - min;
<span style="color: #7b0052; font-weight: bold;">if</span>(profit > currentMax) <span style="color: #d3171b; font-weight: bold;">{</span>
currentMax = profit;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span>
min = currentVal;
max = <span style="color: #7b0052; font-weight: bold;">null</span>;
<span style="color: #d3171b; font-weight: bold;">}</span> <span style="color: #7b0052; font-weight: bold;">else</span> <span style="color: #7b0052; font-weight: bold;">if</span> (max == <span style="color: #7b0052; font-weight: bold;">null</span>) <span style="color: #d3171b; font-weight: bold;">{</span>
max = currentVal;
<span style="color: #d3171b; font-weight: bold;">}</span> <span style="color: #7b0052; font-weight: bold;">else</span> <span style="color: #7b0052; font-weight: bold;">if</span> (currentVal > max) <span style="color: #d3171b; font-weight: bold;">{</span>
max = currentVal;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">if</span>(max != <span style="color: #7b0052; font-weight: bold;">null</span>) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> profit = max - min;
<span style="color: #7b0052; font-weight: bold;">if</span>(profit > currentMax) <span style="color: #d3171b; font-weight: bold;">{</span>
currentMax = profit;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">return</span> currentMax;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span></pre>
<br />
Output
<br />
<br />
<pre auto="" courier="" monospace="" new="" overflow:="" style="border: 1px dashed #008def; font-size: 13px; line-height: 18px; padding: 15px; text-align: left;">maxProfit1:5
maxProfit2:-1
maxProfit3:14</pre>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-12573996462077600482019-09-09T20:25:00.000-07:002019-09-09T20:29:06.607-07:00MergesortMergesort implementation from <a href='https://en.wikipedia.org/wiki/Merge_sort'>en.wikipedia.org</a>.
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'><span style='font-weight:bold;color:#7B0052;'>package</span> algorithm;
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>class</span> mergesort <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> main(String[] args) <span style='font-weight:bold;color:#D3171B'>{</span>
System.out.println(<span style='color:#2A00FF'>"Case I"</span>);
int[] numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>3, 7, 8, 5, 2, 1, 9, 5, 4<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
mergesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case II"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>9, 8, 7, 6, 5, 4, 3, 2, 1<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
mergesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case III"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>5, 5, 5, 5, 5, 5, 5, 5, 5<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
mergesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case IV"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>1, 2, 3, 4, 5, 6, 7, 8, 9<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
mergesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printArray(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers, String text) <span style='font-weight:bold;color:#D3171B'>{</span>
String out = <span style='color:#2A00FF'>"{"</span>;
String del = <span style='color:#2A00FF'>""</span>;
<span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=start; i < end + 1; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
out = out + del + numbers[i] + <span style='color:#2A00FF'>""</span>;
del = <span style='color:#2A00FF'>","</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
out = out + <span style='color:#2A00FF'>"}"</span>;
System.out.println(text+<span style='color:#2A00FF'>":"</span>+out);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='color:#3F7F5F'>// O(n log n)
</span> <span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> mergesort(int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
int[] temparray = <span style='font-weight:bold;color:#7B0052;'>new</span> int[numbers.length];
<span style='color:#3F7F5F'>// Outer loop is O(log n) - Divide and Conquer
</span> mergesortAlgorithm(0, numbers.length - 1, numbers, temparray);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> mergesortAlgorithm(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers, int[] temparray) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(end == start) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>return</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> numbersInFirstHalf = (end - start + 1)/2; <span style='color:#3F7F5F'>// This is Math.floor
</span> <span style='font-weight:bold;color:#7B0052;'>int</span> firstHalfStart = start;
<span style='font-weight:bold;color:#7B0052;'>int</span> firstHalfEnd = start + numbersInFirstHalf - 1;
<span style='font-weight:bold;color:#7B0052;'>int</span> secondHalfStart = start + numbersInFirstHalf;
<span style='font-weight:bold;color:#7B0052;'>int</span> secondHalfEnd = end;
<span style='color:#3F7F5F'>// Outer loop is O(log n) - Divide and Conquer
</span> mergesortAlgorithm(firstHalfStart, firstHalfEnd, numbers, temparray);
mergesortAlgorithm(secondHalfStart, secondHalfEnd, numbers, temparray);
mergeSorted(start, end, numbers, temparray, firstHalfStart, firstHalfEnd, secondHalfStart, secondHalfEnd);
<span style='color:#3F7F5F'>// Copy sorted back into original
</span> copyArrayElements(start, end, temparray, start, numbers);
printArray(start, end, numbers, <span style='color:#2A00FF'>"sorted_subarray"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> mergeSorted(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers,
int[] temparray, <span style='font-weight:bold;color:#7B0052;'>int</span> firstHalfStart, <span style='font-weight:bold;color:#7B0052;'>int</span> firstHalfEnd,
<span style='font-weight:bold;color:#7B0052;'>int</span> secondHalfStart, <span style='font-weight:bold;color:#7B0052;'>int</span> secondHalfEnd) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> tempindex = start;
<span style='font-weight:bold;color:#7B0052;'>int</span> firstNum = numbers[firstHalfStart];
<span style='font-weight:bold;color:#7B0052;'>int</span> secondNum = numbers[secondHalfStart];
<span style='color:#3F7F5F'>// Inner loop is O(n)
</span> <span style='font-weight:bold;color:#7B0052;'>while</span>(<span style='font-weight:bold;color:#7B0052;'>true</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(firstNum < secondNum) <span style='font-weight:bold;color:#D3171B'>{</span>
temparray[tempindex] = firstNum;
tempindex++;
firstHalfStart++;
<span style='font-weight:bold;color:#7B0052;'>if</span>(firstHalfStart == firstHalfEnd + 1) <span style='font-weight:bold;color:#D3171B'>{</span>
copyArrayElements(secondHalfStart, secondHalfEnd, numbers, tempindex, temparray);
<span style='font-weight:bold;color:#7B0052;'>return</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
firstNum = numbers[firstHalfStart];
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
temparray[tempindex] = secondNum;
tempindex++;
secondHalfStart++;
<span style='font-weight:bold;color:#7B0052;'>if</span>(secondHalfStart == secondHalfEnd + 1) <span style='font-weight:bold;color:#D3171B'>{</span>
copyArrayElements(firstHalfStart, firstHalfEnd, numbers, tempindex, temparray);
<span style='font-weight:bold;color:#7B0052;'>return</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
secondNum = numbers[secondHalfStart];
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> copyArrayElements(<span style='font-weight:bold;color:#7B0052;'>int</span> fromStart, <span style='font-weight:bold;color:#7B0052;'>int</span> fromEnd, int[] from,
<span style='font-weight:bold;color:#7B0052;'>int</span> toStart, int[] to) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=fromStart; i<=fromEnd; i++)<span style='font-weight:bold;color:#D3171B'>{</span>
to[toStart] = from[i];
toStart++;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span></pre>
Output
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'>Case I
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,8,5,2,1,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>3,7<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,8<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,7,8<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>4,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>4,5,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,4,5,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
Case II
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>9,8,7,6,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>8,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>6,7<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>4,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
Case III
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
Case IV
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>3,4<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,6<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>8,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
sorted_subarray:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span></pre>scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-37174112858116246212019-09-08T18:27:00.004-07:002019-09-09T16:40:20.404-07:00TreesortTreesort implementation via<br />
<a href="https://en.wikipedia.org/wiki/Tree_sort">en.wikipedia.org</a>.
Treesort is O(n log n). The outer loop iterates over each element putting it into the tree which is O(n). The inner loop inserts into the tree in O(log n). To print the loop takes O(n), touching each node once. This is O(n + n log n) = O(n log n).
<br />
<br />
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'><span style='font-weight:bold;color:#7B0052;'>package</span> algorithm;
<span style='font-weight:bold;color:#7B0052;'>import</span> java.util.LinkedHashSet;
<span style='font-weight:bold;color:#7B0052;'>import</span> java.util.Set;
<span style='font-weight:bold;color:#7B0052;'>import</span> java.util.Stack;
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>class</span> treesort <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> main(String[] args) <span style='font-weight:bold;color:#D3171B'>{</span>
System.out.println(<span style='color:#2A00FF'>"Case I"</span>);
int[] numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>3, 7, 8, 5, 2, 1, 9, 5, 4<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
treesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case II"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>9, 8, 7, 6, 5, 4, 3, 2, 1<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
treesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case III"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>5, 5, 5, 5, 5, 5, 5, 5, 5<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
treesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case IV"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>1, 2, 3, 4, 5, 6, 7, 8, 9<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
treesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printArray(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers, String text) <span style='font-weight:bold;color:#D3171B'>{</span>
String out = <span style='color:#2A00FF'>"{"</span>;
String del = <span style='color:#2A00FF'>""</span>;
<span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=start; i < end + 1; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
out = out + del + numbers[i] + <span style='color:#2A00FF'>""</span>;
del = <span style='color:#2A00FF'>","</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
out = out + <span style='color:#2A00FF'>"}"</span>;
System.out.println(text+<span style='color:#2A00FF'>":"</span>+out);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printHeap(TreeSortNode rootNode, String text) <span style='font-weight:bold;color:#D3171B'>{</span>
Set<TreeSortNode> currentNodes = <span style='font-weight:bold;color:#7B0052;'>new</span> LinkedHashSet<TreeSortNode>();
Set<TreeSortNode> nextNodes = <span style='font-weight:bold;color:#7B0052;'>new</span> LinkedHashSet<TreeSortNode>();
currentNodes.add(rootNode);
<span style='font-weight:bold;color:#7B0052;'>boolean</span> foundChildNode = <span style='font-weight:bold;color:#7B0052;'>true</span>;
<span style='font-weight:bold;color:#7B0052;'>while</span>(foundChildNode) <span style='font-weight:bold;color:#D3171B'>{</span>
foundChildNode = <span style='font-weight:bold;color:#7B0052;'>false</span>;
String out = <span style='color:#2A00FF'>""</span>;
String del = <span style='color:#2A00FF'>""</span>;
<span style='font-weight:bold;color:#7B0052;'>for</span>(TreeSortNode currentNode: currentNodes) <span style='font-weight:bold;color:#D3171B'>{</span>
String printedValue = <span style='color:#2A00FF'>""</span> + currentNode.value;
<span style='font-weight:bold;color:#7B0052;'>if</span>(currentNode.value == <span style='font-weight:bold;color:#7B0052;'>null</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
printedValue = <span style='color:#2A00FF'>"X"</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
out = out + del + printedValue;
del = <span style='color:#2A00FF'>" "</span>;
<span style='font-weight:bold;color:#7B0052;'>if</span>(currentNode.left != <span style='font-weight:bold;color:#7B0052;'>null</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
nextNodes.add(currentNode.left);
foundChildNode = <span style='font-weight:bold;color:#7B0052;'>true</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
TreeSortNode placeHolder = <span style='font-weight:bold;color:#7B0052;'>new</span> TreeSortNode();
nextNodes.add(placeHolder);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(currentNode.right != <span style='font-weight:bold;color:#7B0052;'>null</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
foundChildNode = <span style='font-weight:bold;color:#7B0052;'>true</span>;
nextNodes.add(currentNode.right);
foundChildNode = <span style='font-weight:bold;color:#7B0052;'>true</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
TreeSortNode placeHolder = <span style='font-weight:bold;color:#7B0052;'>new</span> TreeSortNode();
nextNodes.add(placeHolder);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
System.out.println(text+<span style='color:#2A00FF'>":"</span>+out);
currentNodes = nextNodes;
nextNodes = <span style='font-weight:bold;color:#7B0052;'>new</span> LinkedHashSet<TreeSortNode>();
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='color:#3F7F5F'>// O(n log n)
</span> <span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> treesort(int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(numbers.length < 1) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>return</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
TreeSortNode root = <span style='font-weight:bold;color:#7B0052;'>new</span> TreeSortNode();
root.value = numbers[0];
printHeap(root, <span style='color:#2A00FF'>"root"</span>);
<span style='color:#3F7F5F'>// O(n) on outer loop
</span> <span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=1; i<numbers.length; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
TreeSortNode newNode = <span style='font-weight:bold;color:#7B0052;'>new</span> TreeSortNode();
newNode.value = numbers[i];
insertNode(newNode, root);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='color:#3F7F5F'>// O(n) convert tree to array
</span> printTreeToArray(root, numbers);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> insertNode(TreeSortNode newNode, TreeSortNode root) <span style='font-weight:bold;color:#D3171B'>{</span>
TreeSortNode parentNode = root;
<span style='font-weight:bold;color:#7B0052;'>boolean</span> inserted = <span style='font-weight:bold;color:#7B0052;'>false</span>;
<span style='color:#3F7F5F'>// O(log n) on inner loop to insert into tree
</span> <span style='font-weight:bold;color:#7B0052;'>while</span>(!inserted) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(newNode.value < parentNode.value) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(parentNode.left == <span style='font-weight:bold;color:#7B0052;'>null</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
parentNode.left = newNode;
inserted = <span style='font-weight:bold;color:#7B0052;'>true</span>;
printHeap(root, <span style='color:#2A00FF'>"left_insert"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
parentNode = parentNode.left;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span> <span style='color:#3F7F5F'>// newNode.value >= parentNode.value
</span> <span style='font-weight:bold;color:#7B0052;'>if</span>(parentNode.right == <span style='font-weight:bold;color:#7B0052;'>null</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
parentNode.right = newNode;
inserted = <span style='font-weight:bold;color:#7B0052;'>true</span>;
printHeap(root, <span style='color:#2A00FF'>"right_insert"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
parentNode = parentNode.right;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printTreeToArray(TreeSortNode root, int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> index = 0;
Stack<TreeSortNode> stack = <span style='font-weight:bold;color:#7B0052;'>new</span> Stack<TreeSortNode>(); <span style='color:#3F7F5F'>// In stack if haven't printed
</span> TreeSortNode analyzeNode = root;
System.out.println(<span style='color:#2A00FF'>"root.value:"</span>+root.value);
<span style='color:#3F7F5F'>// O(n) to traverse the tree
</span> <span style='font-weight:bold;color:#7B0052;'>while</span>(<span style='font-weight:bold;color:#7B0052;'>true</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(analyzeNode != <span style='font-weight:bold;color:#7B0052;'>null</span>) <span style='font-weight:bold;color:#D3171B'>{</span>
stack.push(analyzeNode);
analyzeNode = analyzeNode.left;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(stack.isEmpty()) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>break</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
analyzeNode = stack.pop();
<span style='font-weight:bold;color:#D3171B'>}</span>
numbers[index] = analyzeNode.value;
printArray(0, index, numbers, <span style='color:#2A00FF'>"tree_to_array"</span>);
index++;
analyzeNode = analyzeNode.right;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>class</span> TreeSortNode <span style='font-weight:bold;color:#D3171B'>{</span>
Integer value;
TreeSortNode left;
TreeSortNode right;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span></pre>
Output
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'>Case I
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,8,5,2,1,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
root:3
right_insert:3
right_insert:X 7
right_insert:3
right_insert:X 7
right_insert:X X X 8
left_insert:3
left_insert:X 7
left_insert:X X 5 8
left_insert:3
left_insert:2 7
left_insert:X X 5 8
left_insert:3
left_insert:2 7
left_insert:1 X 5 8
right_insert:3
right_insert:2 7
right_insert:1 X 5 8
right_insert:X X X X X X X 9
right_insert:3
right_insert:2 7
right_insert:1 X 5 8
right_insert:X X X X X 5 X 9
left_insert:3
left_insert:2 7
left_insert:1 X 5 8
left_insert:X X X X 4 5 X 9
root.value:3
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
Case II
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>9,8,7,6,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
root:9
left_insert:9
left_insert:8 X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:6 X X X X X X X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:6 X X X X X X X
left_insert:5 X X X X X X X X X X X X X X X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:6 X X X X X X X
left_insert:5 X X X X X X X X X X X X X X X
left_insert:4 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:6 X X X X X X X
left_insert:5 X X X X X X X X X X X X X X X
left_insert:4 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:3 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:6 X X X X X X X
left_insert:5 X X X X X X X X X X X X X X X
left_insert:4 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:3 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:9
left_insert:8 X
left_insert:7 X X X
left_insert:6 X X X X X X X
left_insert:5 X X X X X X X X X X X X X X X
left_insert:4 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:3 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
left_insert:1 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
root.value:9
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
Case III
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
root:5
right_insert:5
right_insert:X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:X X X X X X X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:5
right_insert:X 5
right_insert:X X X 5
right_insert:X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 5
root.value:5
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
Case IV
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
root:1
right_insert:1
right_insert:X 2
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:X X X X X X X 4
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:X X X X X X X 4
right_insert:X X X X X X X X X X X X X X X 5
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:X X X X X X X 4
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 6
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:X X X X X X X 4
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 6
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 7
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:X X X X X X X 4
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 6
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 7
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 8
right_insert:1
right_insert:X 2
right_insert:X X X 3
right_insert:X X X X X X X 4
right_insert:X X X X X X X X X X X X X X X 5
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 6
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 7
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 8
right_insert:X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 9
root.value:1
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8<span style='font-weight:bold;color:#D3171B'>}</span>
tree_to_array:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span></pre>scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-90879549210974803772019-09-07T18:41:00.003-07:002019-09-09T16:39:21.165-07:00HeapsortThis implementation comes from <a href="https://en.wikipedia.org/wiki/Heapsort">en.wikipedia.org</a>.
The outer loop runs O(n) times and the inner loop is O(log n) so the whole algorithm is O(n log n).<br />
<br />
In general, quicksort would be faster to implement in practice because heapsort is actually not a divide and conquer algorithm, which is true O(log n).<br />
<br />
Here, we implemented the sift down method which repairs a broken heap. This is O(n/2*2) since the inner loop iterates through all parent nodes (only half the nodes) but compares to both children. The number of parent nodes decreases by 1 each time the inner loop executes. This implementation is O(n^2/2) = O(n^2).<br />
<br />
--------<br />
-------<br />
------<br />
-----<br />
----<br />
---<br />
--<br />
-<br />
<br />
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'><span style='font-weight:bold;color:#7B0052;'>package</span> algorithm;
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>class</span> heapsort <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> main(String[] args) <span style='font-weight:bold;color:#D3171B'>{</span>
System.out.println(<span style='color:#2A00FF'>"Case I"</span>);
int[] numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>3, 7, 8, 5, 2, 1, 9, 5, 4<span style='font-weight:bold;color:#D3171B'>}</span>;
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
heapsort(numbers);
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case II"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>9, 8, 7, 6, 5, 4, 3, 2, 1<span style='font-weight:bold;color:#D3171B'>}</span>;
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
heapsort(numbers);
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case III"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>5, 5, 5, 5, 5, 5, 5, 5, 5<span style='font-weight:bold;color:#D3171B'>}</span>;
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
heapsort(numbers);
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case IV"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>1, 2, 3, 4, 5, 6, 7, 8, 9<span style='font-weight:bold;color:#D3171B'>}</span>;
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
heapsort(numbers);
printArrayAndHeap(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printArrayAndHeap(<span style='font-weight:bold;color:#7B0052;'>int</span> i, <span style='font-weight:bold;color:#7B0052;'>int</span> j, int[] numbers, String text) <span style='font-weight:bold;color:#D3171B'>{</span>
printArray(i,j,numbers, text);
printHeap(i,j,numbers);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printArray(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers, String text) <span style='font-weight:bold;color:#D3171B'>{</span>
String out = <span style='color:#2A00FF'>"{"</span>;
String del = <span style='color:#2A00FF'>""</span>;
<span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=start; i < end + 1; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
out = out + del + numbers[i] + <span style='color:#2A00FF'>""</span>;
del = <span style='color:#2A00FF'>","</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
out = out + <span style='color:#2A00FF'>"}"</span>;
System.out.println(text+<span style='color:#2A00FF'>":"</span>+out);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printHeap(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> depth = (<span style='font-weight:bold;color:#7B0052;'>int</span>) Math.ceil((Math.log(end+2)/Math.log(2)));
<span style='font-weight:bold;color:#7B0052;'>int</span> currentLevel = 0;
<span style='font-weight:bold;color:#7B0052;'>while</span>(currentLevel < depth) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> firstAtCurrentLevel = (<span style='font-weight:bold;color:#7B0052;'>int</span>) Math.pow(2, currentLevel) - 1;
<span style='font-weight:bold;color:#7B0052;'>int</span> firstAtNextLevel = (<span style='font-weight:bold;color:#7B0052;'>int</span>) Math.pow(2, currentLevel + 1) - 1;
String heapout = <span style='color:#2A00FF'>""</span>;
<span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> index = firstAtCurrentLevel; index < firstAtNextLevel; index++) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(index <= end) <span style='font-weight:bold;color:#D3171B'>{</span>
heapout = heapout + <span style='color:#2A00FF'>" "</span> + numbers[index];
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
System.out.println(<span style='color:#2A00FF'>"level:"</span>+currentLevel+<span style='color:#2A00FF'>" heap:"</span>+heapout);
currentLevel++;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='color:#3F7F5F'>// O(n^2)
</span> <span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> heapsort(int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='color:#3F7F5F'>// O(n) on outer loop
</span> <span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=0; i<numbers.length; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
bubbleUpLargestAndPlaceAtEnd(0, numbers.length - 1 - i, numbers);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> bubbleUpLargestAndPlaceAtEnd(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(end == 0) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>return</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> startingIndex = (<span style='font-weight:bold;color:#7B0052;'>int</span>) Math.floor(end+1/2) - 1;
<span style='color:#3F7F5F'>// O(n) on inner loop - Though n decreases - Fixing broken heap is O(n)
</span> <span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=startingIndex; i > -1; i--) <span style='font-weight:bold;color:#D3171B'>{</span>
swapParentWithLargestChild(start, end, numbers, i);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='color:#3F7F5F'>// Move largest from 0th place to end of array
</span> <span style='font-weight:bold;color:#7B0052;'>int</span> largest = numbers[start];
<span style='font-weight:bold;color:#7B0052;'>int</span> last = numbers[end];
numbers[end] = largest;
numbers[start] = last;
printArrayAndHeap(start, end, numbers, <span style='color:#2A00FF'>"put_largest_at_end"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> swapParentWithLargestChild(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end,
int[] numbers, <span style='font-weight:bold;color:#7B0052;'>int</span> i) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> parent = numbers[i];
<span style='font-weight:bold;color:#7B0052;'>if</span>(i*2 + 2 <= end) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> rightChild = numbers[i*2 + 2];
<span style='font-weight:bold;color:#7B0052;'>if</span>(rightChild > parent) <span style='font-weight:bold;color:#D3171B'>{</span>
numbers[i] = rightChild;
numbers[i*2 + 2] = parent;
parent = rightChild;
printArrayAndHeap(start, end, numbers, <span style='color:#2A00FF'>"swap_right_child"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>if</span>(i*2 + 1 <= end) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> leftChild = numbers[i*2 + 1];
<span style='font-weight:bold;color:#7B0052;'>if</span>(leftChild > parent) <span style='font-weight:bold;color:#D3171B'>{</span>
numbers[i] = leftChild;
numbers[i*2 + 1] = parent;
printArrayAndHeap(start, end, numbers, <span style='color:#2A00FF'>"swap_left_child"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span></pre>
Output
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'>Case I
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,8,5,2,1,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 7 8
level:2 heap: 5 2 1 9
level:3 heap: 5 4
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,9,5,2,1,8,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 7 9
level:2 heap: 5 2 1 8
level:3 heap: 5 4
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>9,7,3,5,2,1,8,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 9
level:1 heap: 7 3
level:2 heap: 5 2 1 8
level:3 heap: 5 4
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,3,5,2,1,8,5,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 3
level:2 heap: 5 2 1 8
level:3 heap: 5 9
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,8,5,2,1,3,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 8
level:2 heap: 5 2 1 3
level:3 heap: 5
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,4,5,2,1,3,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 8
level:1 heap: 7 4
level:2 heap: 5 2 1 3
level:3 heap: 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,7,4,5,2,1,3,8<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 7 4
level:2 heap: 5 2 1 3
level:3 heap: 8
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>7,5,4,5,2,1,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 7
level:1 heap: 5 4
level:2 heap: 5 2 1 3
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,4,5,2,1,7<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 5 4
level:2 heap: 5 2 1 7
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,5,3,5,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 5 3
level:2 heap: 5 2 1
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>5,4,3,5,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 4 3
level:2 heap: 5 2 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,4,3,5,2,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 4 3
level:2 heap: 5 2 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,5,3,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 5 3
level:2 heap: 4 2
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,1,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 5 1
level:2 heap: 4 2
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>5,3,1,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 3 1
level:2 heap: 4 2
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>2,3,1,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 3 1
level:2 heap: 4 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,4,1,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 4 1
level:2 heap: 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,2,1,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 2 1
level:2 heap: 3
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 2 1
level:2 heap: 4
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
level:2 heap: 4 5 5 7
level:3 heap: 8 9
Case II
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>9,8,7,6,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 9
level:1 heap: 8 7
level:2 heap: 6 5 4 3
level:3 heap: 2 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,8,7,6,5,4,3,2,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 8 7
level:2 heap: 6 5 4 3
level:3 heap: 2 9
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>7,8,1,6,5,4,3,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 7
level:1 heap: 8 1
level:2 heap: 6 5 4 3
level:3 heap: 2
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,1,6,5,4,3,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 8
level:1 heap: 7 1
level:2 heap: 6 5 4 3
level:3 heap: 2
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>2,7,1,6,5,4,3,8<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 7 1
level:2 heap: 6 5 4 3
level:3 heap: 8
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,7,3,6,5,4,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 7 3
level:2 heap: 6 5 4 1
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,7,4,6,5,3,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 7 4
level:2 heap: 6 5 3 1
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,2,6,5,3,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 2
level:2 heap: 6 5 3 1
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>7,4,2,6,5,3,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 7
level:1 heap: 4 2
level:2 heap: 6 5 3 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,4,2,6,5,3,7<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 4 2
level:2 heap: 6 5 3 7
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,4,3,6,5,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 4 3
level:2 heap: 6 5 2
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,5,3,6,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 5 3
level:2 heap: 6 4 2
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,6,3,5,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 6 3
level:2 heap: 5 4 2
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>3,6,1,5,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 6 1
level:2 heap: 5 4 2
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>6,3,1,5,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 6
level:1 heap: 3 1
level:2 heap: 5 4 2
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>2,3,1,5,4,6<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 3 1
level:2 heap: 5 4 6
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,4,1,5,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 4 1
level:2 heap: 5 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,5,1,4,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 5 1
level:2 heap: 4 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>5,2,1,4,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 2 1
level:2 heap: 4 3
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 2 1
level:2 heap: 4 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>3,4,1,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 4 1
level:2 heap: 2
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,3,1,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 3 1
level:2 heap: 2
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>2,3,1,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 3 1
level:2 heap: 4
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 2 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
level:2 heap: 4 5 6 7
level:3 heap: 8 9
Case III
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5 5 5
level:3 heap: 5 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5 5 5
level:3 heap: 5 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5 5 5
level:3 heap: 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5 5 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 5 5
level:2 heap: 5 5 5 5
level:3 heap: 5 5
Case IV
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
level:2 heap: 4 5 6 7
level:3 heap: 8 9
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,9,5,6,7,8,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
level:2 heap: 9 5 6 7
level:3 heap: 8 4
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,7,9,5,6,3,8,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 7
level:2 heap: 9 5 6 3
level:3 heap: 8 4
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,5,7,9,2,6,3,8,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 5 7
level:2 heap: 9 2 6 3
level:3 heap: 8 4
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,9,7,5,2,6,3,8,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 9 7
level:2 heap: 5 2 6 3
level:3 heap: 8 4
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>7,9,1,5,2,6,3,8,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 7
level:1 heap: 9 1
level:2 heap: 5 2 6 3
level:3 heap: 8 4
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>9,7,1,5,2,6,3,8,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 9
level:1 heap: 7 1
level:2 heap: 5 2 6 3
level:3 heap: 8 4
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,1,5,2,6,3,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 1
level:2 heap: 5 2 6 3
level:3 heap: 8 9
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,1,8,2,6,3,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 1
level:2 heap: 8 2 6 3
level:3 heap: 5
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,3,8,2,6,1,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 3
level:2 heap: 8 2 6 1
level:3 heap: 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,7,6,8,2,3,1,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 7 6
level:2 heap: 8 2 3 1
level:3 heap: 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,8,6,7,2,3,1,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 8 6
level:2 heap: 7 2 3 1
level:3 heap: 5
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>6,8,4,7,2,3,1,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 6
level:1 heap: 8 4
level:2 heap: 7 2 3 1
level:3 heap: 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>8,6,4,7,2,3,1,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 8
level:1 heap: 6 4
level:2 heap: 7 2 3 1
level:3 heap: 5
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>5,6,4,7,2,3,1,8<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 6 4
level:2 heap: 7 2 3 1
level:3 heap: 8
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>5,7,4,6,2,3,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 7 4
level:2 heap: 6 2 3 1
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>7,5,4,6,2,3,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 7
level:1 heap: 5 4
level:2 heap: 6 2 3 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,5,4,6,2,3,7<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 5 4
level:2 heap: 6 2 3 7
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>1,6,4,5,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 6 4
level:2 heap: 5 2 3
swap_right_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,6,1,5,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 6 1
level:2 heap: 5 2 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>6,4,1,5,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 6
level:1 heap: 4 1
level:2 heap: 5 2 3
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>3,4,1,5,2,6<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 4 1
level:2 heap: 5 2 6
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,1,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 5 1
level:2 heap: 4 2
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>5,3,1,4,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 5
level:1 heap: 3 1
level:2 heap: 4 2
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>2,3,1,4,5<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 3 1
level:2 heap: 4 5
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,4,1,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 4 1
level:2 heap: 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>4,2,1,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 4
level:1 heap: 2 1
level:2 heap: 3
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,4<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 3
level:1 heap: 2 1
level:2 heap: 4
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
swap_left_child:<span style='font-weight:bold;color:#D3171B'>{</span>2,1<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 2
level:1 heap: 1
put_largest_at_end:<span style='font-weight:bold;color:#D3171B'>{</span>1,2<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
level:0 heap: 1
level:1 heap: 2 3
level:2 heap: 4 5 6 7
level:3 heap: 8 9</pre>scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-14329530656294499742019-09-07T15:47:00.004-07:002019-09-09T16:36:38.892-07:00BubblesortBubble sort based on <a href="https://en.wikipedia.org/wiki/Bubble_sort">en.wikipedia.org</a>.
This algorithm is O(n^2) because the inner loop has O(n) comparisons and the outer loop runs O(n) times. The inner loop can be optimized to reduce by 1 each time. Also, when no swaps are made, it can exit. This is O(n^2/2 - k^2/2) = O(n^2).<br />
<br />
--------<br />
-------<br />
------<br />
-----<br />
----<br />
<br />
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'><span style='font-weight:bold;color:#7B0052;'>package</span> algorithm;
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>class</span> bubblesort <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>public</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> main(String[] args) <span style='font-weight:bold;color:#D3171B'>{</span>
System.out.println(<span style='color:#2A00FF'>"Case I"</span>);
int[] numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>3, 7, 8, 5, 2, 1, 9, 5, 4<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
bubblesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case II"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>9, 8, 7, 6, 5, 4, 3, 2, 1<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
bubblesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case III"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>5, 5, 5, 5, 5, 5, 5, 5, 5<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
bubblesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
System.out.println(<span style='color:#2A00FF'>"Case IV"</span>);
numbers = <span style='font-weight:bold;color:#7B0052;'>new</span> int[] <span style='font-weight:bold;color:#D3171B'>{</span>1, 2, 3, 4, 5, 6, 7, 8, 9<span style='font-weight:bold;color:#D3171B'>}</span>;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"pre_sort"</span>);
bubblesort(numbers);
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"post_sort"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> printArray(<span style='font-weight:bold;color:#7B0052;'>int</span> start, <span style='font-weight:bold;color:#7B0052;'>int</span> end, int[] numbers, String text) <span style='font-weight:bold;color:#D3171B'>{</span>
String out = <span style='color:#2A00FF'>"{"</span>;
String del = <span style='color:#2A00FF'>""</span>;
<span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=start; i < end + 1; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
out = out + del + numbers[i] + <span style='color:#2A00FF'>""</span>;
del = <span style='color:#2A00FF'>","</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
out = out + <span style='color:#2A00FF'>"}"</span>;
System.out.println(text+<span style='color:#2A00FF'>":"</span>+out);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='color:#3F7F5F'>// O(n^2)
</span> <span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> bubblesort(int[] numbers) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> n = numbers.length; <span style='color:#3F7F5F'>// First optimization is that nth largest number is put in place on nth iteration, so no need to check last n after n iterations
</span> <span style='font-weight:bold;color:#7B0052;'>boolean</span> swapped = <span style='font-weight:bold;color:#7B0052;'>false</span>; <span style='color:#3F7F5F'>// Second optimization is that if no swap occurs, the array is already sorted, so can exit
</span>
<span style='color:#3F7F5F'>// O(n)
</span> <span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> i=0; i < numbers.length; i++) <span style='font-weight:bold;color:#D3171B'>{</span>
swapped = lookForSwaps(numbers, n);
<span style='font-weight:bold;color:#7B0052;'>if</span>(!swapped) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>return</span>;
<span style='font-weight:bold;color:#D3171B'>}</span>
n = n - 1;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>boolean</span> lookForSwaps(int[] numbers, <span style='font-weight:bold;color:#7B0052;'>int</span> n) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> first = numbers[0];
<span style='font-weight:bold;color:#7B0052;'>boolean</span> swapped = <span style='font-weight:bold;color:#7B0052;'>false</span>;
<span style='color:#3F7F5F'>// O(n) on inner loop - Though n decreases
</span> <span style='font-weight:bold;color:#7B0052;'>for</span>(<span style='font-weight:bold;color:#7B0052;'>int</span> j=1; j < n; j++) <span style='font-weight:bold;color:#D3171B'>{</span>
<span style='font-weight:bold;color:#7B0052;'>int</span> second = numbers[j];
<span style='font-weight:bold;color:#7B0052;'>if</span>(first > second) <span style='font-weight:bold;color:#D3171B'>{</span>
swap(numbers, j, first, second);
swapped = <span style='font-weight:bold;color:#7B0052;'>true</span>;
<span style='font-weight:bold;color:#D3171B'>}</span> <span style='font-weight:bold;color:#7B0052;'>else</span> <span style='font-weight:bold;color:#D3171B'>{</span>
first = second;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>return</span> swapped;
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#7B0052;'>private</span> <span style='font-weight:bold;color:#7B0052;'>static</span> <span style='font-weight:bold;color:#7B0052;'>void</span> swap(int[] numbers, <span style='font-weight:bold;color:#7B0052;'>int</span> j, <span style='font-weight:bold;color:#7B0052;'>int</span> first,
<span style='font-weight:bold;color:#7B0052;'>int</span> second) <span style='font-weight:bold;color:#D3171B'>{</span>
numbers[j-1] = second;
numbers[j] = first;
printArray(0, numbers.length - 1, numbers, <span style='color:#2A00FF'>"swapped"</span>);
<span style='font-weight:bold;color:#D3171B'>}</span>
<span style='font-weight:bold;color:#D3171B'>}</span></pre>
Output
<pre style='text-align: left; border: 1px dashed #008DEF; line-height: 18px; padding: 15px; font-size: 13px; font-family:'Courier New', Courier, monospace; overflow: auto;'>Case I
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,8,5,2,1,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,5,8,2,1,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,5,2,8,1,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,5,2,1,8,9,5,4<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,5,2,1,8,5,9,4<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,7,5,2,1,8,5,4,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,7,2,1,8,5,4,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,2,7,1,8,5,4,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,2,1,7,8,5,4,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,2,1,7,5,8,4,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,5,2,1,7,5,4,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,5,1,7,5,4,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,5,7,5,4,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,5,5,7,4,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,5,5,4,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>2,3,1,5,5,4,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>2,1,3,5,5,4,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>2,1,3,5,4,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,5,4,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,5,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
Case II
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>9,8,7,6,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,9,7,6,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,9,6,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,6,9,5,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,6,5,9,4,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,6,5,4,9,3,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,6,5,4,3,9,2,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,6,5,4,3,2,9,1<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>8,7,6,5,4,3,2,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,8,6,5,4,3,2,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,6,8,5,4,3,2,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,6,5,8,4,3,2,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,6,5,4,8,3,2,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,6,5,4,3,8,2,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,6,5,4,3,2,8,1,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>7,6,5,4,3,2,1,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>6,7,5,4,3,2,1,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>6,5,7,4,3,2,1,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>6,5,4,7,3,2,1,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>6,5,4,3,7,2,1,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>6,5,4,3,2,7,1,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>6,5,4,3,2,1,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>5,6,4,3,2,1,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>5,4,6,3,2,1,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>5,4,3,6,2,1,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>5,4,3,2,6,1,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>5,4,3,2,1,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>4,5,3,2,1,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>4,3,5,2,1,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>4,3,2,5,1,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>4,3,2,1,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,4,2,1,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,4,1,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>3,2,1,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>2,3,1,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>2,1,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
swapped:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
Case III
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>5,5,5,5,5,5,5,5,5<span style='font-weight:bold;color:#D3171B'>}</span>
Case IV
pre_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span>
post_sort:<span style='font-weight:bold;color:#D3171B'>{</span>1,2,3,4,5,6,7,8,9<span style='font-weight:bold;color:#D3171B'>}</span></pre>scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-43340085531355201142019-09-07T15:28:00.000-07:002019-09-09T16:35:29.105-07:00QuicksortThis shows an implementation of Quicksort as described at <a href="https://en.wikipedia.org/wiki/Quicksort">en.wikipedia.org</a>.
This algorithm has average runtime of O(n log n). This is because the pivot is compared to each element in the partition which is O(n) comparisons. Also, the divide and conquer methodology causes log n partitions to be created.
<br />
<pre>--------
---|-----
-|--|---|--
|-|-|--|-|-|-
-|-
</pre>
<br />
<pre auto="" courier="" monospace="" new="" overflow:="" style="border: 1px dashed #008def; font-size: 13px; line-height: 18px; padding: 15px; text-align: left;"><span style="color: #7b0052; font-weight: bold;">package</span> algorithm;
<span style="color: #7b0052; font-weight: bold;">public</span> <span style="color: #7b0052; font-weight: bold;">class</span> quicksort <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">public</span> <span style="color: #7b0052; font-weight: bold;">static</span> <span style="color: #7b0052; font-weight: bold;">void</span> main(String[] args) <span style="color: #d3171b; font-weight: bold;">{</span>
System.out.println(<span style="color: #2a00ff;">"Case I"</span>);
int[] numbers = <span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>3, 7, 8, 5, 2, 1, 9, 5, 4<span style="color: #d3171b; font-weight: bold;">}</span>;
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"pre_sort"</span>);
quicksort(numbers);
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"post_sort"</span>);
System.out.println(<span style="color: #2a00ff;">"Case II"</span>);
numbers = <span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>9, 8, 7, 6, 5, 4, 3, 2, 1<span style="color: #d3171b; font-weight: bold;">}</span>;
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"pre_sort"</span>);
quicksort(numbers);
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"post_sort"</span>);
System.out.println(<span style="color: #2a00ff;">"Case III"</span>);
numbers = <span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>5, 5, 5, 5, 5, 5, 5, 5, 5<span style="color: #d3171b; font-weight: bold;">}</span>;
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"pre_sort"</span>);
quicksort(numbers);
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"post_sort"</span>);
System.out.println(<span style="color: #2a00ff;">"Case IV"</span>);
numbers = <span style="color: #7b0052; font-weight: bold;">new</span> int[] <span style="color: #d3171b; font-weight: bold;">{</span>1, 2, 3, 4, 5, 6, 7, 8, 9<span style="color: #d3171b; font-weight: bold;">}</span>;
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"pre_sort"</span>);
quicksort(numbers);
printArray(0, numbers.length - 1, numbers, <span style="color: #2a00ff;">"post_sort"</span>);
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">private</span> <span style="color: #7b0052; font-weight: bold;">static</span> <span style="color: #7b0052; font-weight: bold;">void</span> printArray(<span style="color: #7b0052; font-weight: bold;">int</span> start, <span style="color: #7b0052; font-weight: bold;">int</span> end, int[] numbers, String text) <span style="color: #d3171b; font-weight: bold;">{</span>
String out = <span style="color: #2a00ff;">"{"</span>;
String del = <span style="color: #2a00ff;">""</span>;
<span style="color: #7b0052; font-weight: bold;">for</span>(<span style="color: #7b0052; font-weight: bold;">int</span> i=start; i < end + 1; i++) <span style="color: #d3171b; font-weight: bold;">{</span>
out = out + del + numbers[i] + <span style="color: #2a00ff;">""</span>;
del = <span style="color: #2a00ff;">","</span>;
<span style="color: #d3171b; font-weight: bold;">}</span>
out = out + <span style="color: #2a00ff;">"}"</span>;
System.out.println(text+<span style="color: #2a00ff;">":"</span>+out);
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #3f7f5f;">// O(n log n)
</span> <span style="color: #7b0052; font-weight: bold;">private</span> <span style="color: #7b0052; font-weight: bold;">static</span> int[] quicksort(int[] numbers) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> start = 0;
<span style="color: #7b0052; font-weight: bold;">int</span> end = numbers.length - 1;
<span style="color: #3f7f5f;">// O(log n) on outer loop - recursion - O(log n) number of partitions
</span> partitionpivot(start, end, numbers);
<span style="color: #7b0052; font-weight: bold;">return</span> numbers;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">private</span> <span style="color: #7b0052; font-weight: bold;">static</span> <span style="color: #7b0052; font-weight: bold;">void</span> partitionpivot(<span style="color: #7b0052; font-weight: bold;">int</span> start, <span style="color: #7b0052; font-weight: bold;">int</span> end, int[] numbers) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> walker = start;
<span style="color: #7b0052; font-weight: bold;">int</span> pivot = end;
<span style="color: #7b0052; font-weight: bold;">if</span>(start >= end) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">return</span>;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">int</span> pivotnumber = numbers[pivot];
<span style="color: #3f7f5f;">// O(n) on inner loop
</span> <span style="color: #7b0052; font-weight: bold;">while</span>(walker < pivot) <span style="color: #d3171b; font-weight: bold;">{</span>
<span style="color: #7b0052; font-weight: bold;">int</span> walkernumber = numbers[walker];
<span style="color: #7b0052; font-weight: bold;">if</span>(walkernumber > pivotnumber) <span style="color: #d3171b; font-weight: bold;">{</span>
swapWalkerPivotAndNotProcessedNumber(numbers, walker, walkernumber, pivot, pivotnumber);
printArray(start, end, numbers, <span style="color: #2a00ff;">"pivot_move"</span>);
pivot--;
<span style="color: #d3171b; font-weight: bold;">}</span> <span style="color: #7b0052; font-weight: bold;">else</span> <span style="color: #d3171b; font-weight: bold;">{</span>
walker++;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #3f7f5f;">// O(log n) on outer loop - recursion - O(log n) number of partitions
</span> partitionpivot(0, pivot - 1, numbers);
partitionpivot(pivot + 1, end, numbers);
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #7b0052; font-weight: bold;">private</span> <span style="color: #7b0052; font-weight: bold;">static</span> <span style="color: #7b0052; font-weight: bold;">void</span> swapWalkerPivotAndNotProcessedNumber(int[] numbers,
<span style="color: #7b0052; font-weight: bold;">int</span> walker, <span style="color: #7b0052; font-weight: bold;">int</span> walkernumber, <span style="color: #7b0052; font-weight: bold;">int</span> pivot, <span style="color: #7b0052; font-weight: bold;">int</span> pivotnumber) <span style="color: #d3171b; font-weight: bold;">{</span>
numbers[pivot] = walkernumber;
numbers[walker] = numbers[pivot - 1]; <span style="color: #3f7f5f;">// when walker == pivot - 1, this does nothing
</span> numbers[pivot - 1] = pivotnumber;
<span style="color: #d3171b; font-weight: bold;">}</span>
<span style="color: #d3171b; font-weight: bold;">}</span></pre>
Output
<br />
<pre auto="" courier="" monospace="" new="" overflow:="" style="border: 1px dashed #008def; font-size: 13px; line-height: 18px; padding: 15px; text-align: left;">Case I
pre_sort:<span style="color: #d3171b; font-weight: bold;">{</span>3,7,8,5,2,1,9,5,4<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>3,5,8,5,2,1,9,4,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>3,9,8,5,2,1,4,5,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>3,1,8,5,2,4,9,5,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>3,1,2,5,4,8,9,5,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>3,1,2,4,5,8,9,5,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>5,5,9,7,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>5,5,7,9,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>8,9<span style="color: #d3171b; font-weight: bold;">}</span>
post_sort:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,4,5,5,7,8,9<span style="color: #d3171b; font-weight: bold;">}</span>
Case II
pre_sort:<span style="color: #d3171b; font-weight: bold;">{</span>9,8,7,6,5,4,3,2,1<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>2,8,7,6,5,4,3,1,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>3,8,7,6,5,4,1,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>4,8,7,6,5,1,3,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>5,8,7,6,1,4,3,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>6,8,7,1,5,4,3,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>7,8,1,6,5,4,3,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>8,1,7,6,5,4,3,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,8,7,6,5,4,3,2,9<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,3,7,6,5,4,2,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,4,7,6,5,2,3,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,5,7,6,2,4,3,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,6,7,2,5,4,3,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,7,2,6,5,4,3,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,7,6,5,4,3,8<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,4,6,5,3,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,5,6,3,4,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,6,3,5,4,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,6,5,4,7<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,5,4,6<span style="color: #d3171b; font-weight: bold;">}</span>
pivot_move:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,4,5,6<span style="color: #d3171b; font-weight: bold;">}</span>
post_sort:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,4,5,6,7,8,9<span style="color: #d3171b; font-weight: bold;">}</span>
Case III
pre_sort:<span style="color: #d3171b; font-weight: bold;">{</span>5,5,5,5,5,5,5,5,5<span style="color: #d3171b; font-weight: bold;">}</span>
post_sort:<span style="color: #d3171b; font-weight: bold;">{</span>5,5,5,5,5,5,5,5,5<span style="color: #d3171b; font-weight: bold;">}</span>
Case IV
pre_sort:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,4,5,6,7,8,9<span style="color: #d3171b; font-weight: bold;">}</span>
post_sort:<span style="color: #d3171b; font-weight: bold;">{</span>1,2,3,4,5,6,7,8,9<span style="color: #d3171b; font-weight: bold;">}</span></pre>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-77712283783817299972018-02-08T19:48:00.000-08:002018-02-08T19:48:33.944-08:00Running CURL through Java: Windows and Linux ExecutionsNormally, the environment variables are set through envp and the command is broken up into separate strings.<br />
<br />
However, when on Windows, all the envp and command strings should be concatenated and then processed through Git Bash. Here is the implementation.<br />
<br />
<br />
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: rgb(255, 255, 255); font-family: "courier new", courier; font-size: 10pt; padding: 0px;">
<div style="color: black;">
<strong><span style="color: #7f0055;">package</span></strong> com.mycompany.util;
</div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.BufferedReader;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.BufferedWriter;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.File;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.FileReader;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.FileWriter;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.IOException;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.InputStream;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.InputStreamReader;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.OutputStream;
</div>
<div style="color: black;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.PrintWriter;
</div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> CurlHelperGeneric {
</div>
<div style="color: black;">
</div>
<div style="color: black;">
<span style="color: #2040a0;">/**
<br /> * USERNAME=sizu
<br /> RSA_TOKEN=myRSAToken
<br /> http_proxy=http:<span style="color: #3f7f5f;">//myproxy.com:8080/ https_proxy=http://<span style="font-size: 13.3333px;">myproxy</span>.com:8080/ curl --proxy-header "Proxy-Authorization: Basic $(echo -n "USERNAME:$RSA_TOKEN" | openssl enc -base64 -e)" "https://myservice.com/registry/v1/service" -k </span></span></div>
<span style="color: #3f7f5f;"><br /></span> http_proxy=http:<span style="color: #3f7f5f;">//<span style="color: #3f7f5f; font-size: 13.3333px;">myproxy</span>.com:8080/ https_proxy=http://<span style="color: #3f7f5f; font-size: 13.3333px;">myproxy</span>.com:8080/ curl --proxy-header 'Proxy-Authorization: "+helper.getBasic()+"' 'https://<span style="color: #3f7f5f; font-size: 13.3333px;">myservice</span>.com/registry/v1/service' -k
</span><br />
* <strong style="color: black;">@param</strong> args
<br />
* <strong style="color: black;">@throws</strong> Exception
<br />
*/
<br />
<div style="color: black;">
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main (String[] args) <strong><span style="color: #7f0055;">throws</span></strong> Exception {
</div>
<div style="color: black;">
</div>
<div style="color: black;">
CurlHelperGeneric helper = <strong><span style="color: #7f0055;">new</span></strong> CurlHelperGeneric();
</div>
<div style="color: black;">
String[] cmdArray = <strong><span style="color: #7f0055;">new</span></strong> String[] {
</div>
<div style="color: black;">
<span style="color: #2a00ff;">"curl"</span>,
</div>
<div style="color: black;">
<span style="color: #2a00ff;">"--proxy-header"</span>,
</div>
<div style="color: black;">
<span style="color: #2a00ff;">"Proxy-Authorization: Basic c2lXXXXXXzEyMjAwMjQyMTI2OA=="</span>,
</div>
<div style="color: black;">
<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//myservice.com/v1/pools",
</span><br /> <span style="color: #2a00ff;">"-k"</span>
<br /> };
<br /> String[] envp = <strong><span style="color: #7f0055;">new</span></strong> String[]{
<br /> <span style="color: #2a00ff;">"http_proxy=http:<span style="color: #3f7f5f;">//<span style="font-size: 13.3333px;">myproxy</span>.com:8080/",
</span><br /> <span style="color: #2a00ff;">"https_proxy=http:<span style="color: #3f7f5f;">//<span style="font-size: 13.3333px;">myproxy</span>.com:8080/"
</span><br /> };
<br />
<br /> String output = helper.runCommand(cmdArray, envp);
<br />
<br /> System.out.println(<span style="color: #2a00ff;">"Output:"</span>+output);
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> String runCommand(String[] cmdArray, String[] envp) {
<br /> String os = System.getProperty(<span style="color: #2a00ff;">"os.name"</span>);
<br /> <strong><span style="color: #7f0055;">if</span></strong>(os.toUpperCase().contains(<span style="color: #2a00ff;">"WINDOWS"</span>)) {
<br /><span style="color: #3f7f5f;">// String[] cmdArray = new String[] {
</span><br /><span style="color: #3f7f5f;">// "C:\\Users\\sizu\\AppData\\Local\\Programs\\Git\\bin\\sh.exe",
</span><br /><span style="color: #3f7f5f;">// "--login",
</span><br /><span style="color: #3f7f5f;">// "-i",
</span><br /><span style="color: #3f7f5f;">// "-c",
</span><br /><span style="color: #3f7f5f;">// "http_proxy=http://<span style="font-size: 13.3333px;">myproxy</span>.com:8080/ https_proxy=http://<span style="font-size: 13.3333px;">myproxy</span>.com:8080/ curl --proxy-header 'Proxy-Authorization: "+proxyAuthorization+"' '"+httpString+"' -k",
</span><br /><span style="color: #3f7f5f;">// };
</span><br /><span style="color: #3f7f5f;">// String[] envp = new String[]{};
</span><br />
<br /> String curlCommandToRunThroughGit = <span style="color: #2a00ff;">""</span>;
<br /> <strong><span style="color: #7f0055;">for</span></strong>(<strong><span style="color: #7f0055;">int</span></strong> i=0; i<envp.length; i++) {
<br /> curlCommandToRunThroughGit = curlCommandToRunThroughGit + envp[i] + <span style="color: #2a00ff;">" "</span>;
<br /> }
<br /> <strong><span style="color: #7f0055;">for</span></strong>(<strong><span style="color: #7f0055;">int</span></strong> i=0; i<cmdArray.length; i++) {
<br /> curlCommandToRunThroughGit = curlCommandToRunThroughGit + <span style="color: #2a00ff;">"'"</span> + cmdArray[i] + <span style="color: #2a00ff;">"' "</span>; <span style="color: #3f7f5f;">// Wrap Authorization and https String with single quotes
</span><br /> }
<br />
<br /> cmdArray = <strong><span style="color: #7f0055;">new</span></strong> String[] {
<br /> <span style="color: #2a00ff;">"C:\\Users\\sizu\\AppData\\Local\\Programs\\Git\\bin\\sh.exe"</span>,
<br /> <span style="color: #2a00ff;">"--login"</span>,
<br /> <span style="color: #2a00ff;">"-i"</span>,
<br /> <span style="color: #2a00ff;">"-c"</span>,
<br /> curlCommandToRunThroughGit,
<br /> };
<br /> envp = <strong><span style="color: #7f0055;">new</span></strong> String[]{};
<br /> }
<br />
<br />
<br />
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> Process process = Runtime.getRuntime().exec(cmdArray, envp);
<br /> StreamGobbler errorGobbler = <strong><span style="color: #7f0055;">new</span></strong> StreamGobbler(process.getErrorStream()); <span style="color: #3f7f5f;">// Gobble Stream even if not used
</span><br /> StreamGobbler outputGobbler = <strong><span style="color: #7f0055;">new</span></strong> StreamGobbler(process.getInputStream());
<br /> errorGobbler.start();
<br /> outputGobbler.start();
<br /> <strong><span style="color: #7f0055;">int</span></strong> processComplete = process.waitFor(); <span style="color: #3f7f5f;">// Wait for process to finish
</span><br />
<br /><span style="color: #3f7f5f;">// System.out.println("ERR:"+errorGobbler.streamContent.toString());
</span><br /><span style="color: #3f7f5f;">// System.out.println("OUT:"+outputGobbler.streamContent.toString());
</span><br />
<br /> <strong><span style="color: #7f0055;">return</span></strong> outputGobbler.streamContent.toString();
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> <strong><span style="color: #7f0055;">return</span></strong> <strong><span style="color: #7f0055;">null</span></strong>;
<br /> }
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">class</span></strong> StreamGobbler <strong><span style="color: #7f0055;">extends</span></strong> Thread {
<br /> InputStream is;
<br />
<br /> StreamGobbler(InputStream is) {
<br /> <strong><span style="color: #7f0055;">this</span></strong>.is = is;
<br /> }
<br />
<br /> StringBuilder streamContent = <strong><span style="color: #7f0055;">new</span></strong> StringBuilder();
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">void</span></strong> run() {
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> InputStreamReader isr = <strong><span style="color: #7f0055;">new</span></strong> InputStreamReader(is);
<br /> BufferedReader br = <strong><span style="color: #7f0055;">new</span></strong> BufferedReader(isr);
<br /> String line=<strong><span style="color: #7f0055;">null</span></strong>;
<br /> <strong><span style="color: #7f0055;">while</span></strong> ( (line = br.readLine()) != <strong><span style="color: #7f0055;">null</span></strong>) {
<br /> streamContent.append(line);
<br /> }
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (IOException ioe) {
<br /> ioe.printStackTrace();
<br /> }
<br /> }
<br /> }
<br />}
</span></span></span></div>
<div style="border-top: 1px dashed rgb(204, 204, 204); color: black; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-16528677513577297172018-02-07T11:57:00.002-08:002018-02-07T11:57:17.684-08:00Running CURL Through JavaSometimes, for whatever reason, curl and Java will not execute the same way. In some cases, a Java request will work, while in other cases a curl request will work. Or, you may know how to make one use case work but not the other.<br />
<br />
<br />
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">package</span></strong> com.mycompany.util;
<br />
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.BufferedReader;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.BufferedWriter;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.File;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.FileReader;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.FileWriter;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.IOException;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.InputStream;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.InputStreamReader;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.OutputStream;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.PrintWriter;
<br />
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> CurlHelper {
<br />
<strong><span style="color: #7f0055;">public</span></strong> String gitExecutable = <span style="color: #2a00ff;">"C:\\Users\\sizu\\AppData\\Local\\Programs\\Git\\bin\\sh.exe"</span>;
<br />
<strong><span style="color: #7f0055;">public</span></strong> String fileToRunCurl = <span style="color: #2a00ff;">"C:\\command.bat"</span>;
<br />
<strong><span style="color: #7f0055;">public</span></strong> String outputFile = <span style="color: #2a00ff;">"C:\\command.txt"</span>;
<br />
<strong><span style="color: #7f0055;">public</span></strong> String curlCommand;
<br />
<br />
<strong><span style="color: #7f0055;">private</span></strong> String fullCommand;
<br />
<strong><span style="color: #7f0055;">private</span></strong> String output = <strong><span style="color: #7f0055;">null</span></strong>;
<br />
<br />
<span style="color: #2040a0;"></span>
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main (String[] args) <strong><span style="color: #7f0055;">throws</span></strong> Exception {
<br />
<br />
<span style="font-size: 13.3333px;">CurlHelper </span>helper = <strong><span style="color: #7f0055;">new</span></strong> <span style="font-size: 13.3333px;">CurlHelper </span>();<br />
helper.curlCommand = <span style="color: #2a00ff;">"http_proxy=http://myproxy.mycompany.com:8080/ https_proxy=http://myproxy.mycompany.com:8080/ curl --proxy-header 'Proxy-Authorization: Basic c2XXXXXwMzEyMjAwMjIyMDkzOA==' 'https://myapiendpoint.mycompany.com:8080/solr/prod/select?rows=10000&format=json' -k";
<br />
<br /> System.out.println(<span style="color: #2a00ff;">"Output:"</span>+helper.runCurlCommandViaGitBash());
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> String runCurlCommandViaGitBash() {
<br /> fullCommand = <span style="color: #2a00ff;">"\"</span><span style="color: #2a00ff;">"+gitExecutable+"</span>\<span style="color: #2a00ff;">" --login -i -c \"</span><span style="color: #2a00ff;">"+curlCommand+"</span> > <span style="color: #2a00ff;">'<span style="color: #2a00ff;">"+outputFile+"</span>'</span>\<span style="color: #2a00ff;">""</span>;
<br /> createCommandFile();
<br /> executeCommand();
<br /> readOutputFile();
<br />
<br /> <strong><span style="color: #7f0055;">return</span></strong> output;
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">private</span></strong> <strong><span style="color: #7f0055;">void</span></strong> createCommandFile() {
<br /> <span style="color: #3f7f5f;">// Step 1: Write command in command.bat
</span><br /> File fileToCreate = <strong><span style="color: #7f0055;">new</span></strong> File(fileToRunCurl);
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> <strong><span style="color: #7f0055;">if</span></strong>(fileToCreate.getParentFile() != <strong><span style="color: #7f0055;">null</span></strong> && !fileToCreate.exists()) {
<br /> fileToCreate.getParentFile().mkdirs();
<br /> }
<br /> FileWriter fw = <strong><span style="color: #7f0055;">new</span></strong> FileWriter(fileToCreate);
<br /> BufferedWriter bw = <strong><span style="color: #7f0055;">new</span></strong> BufferedWriter(fw);
<br /> bw.write(fullCommand);
<br /> bw.close();
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception e) {
<br /> e.printStackTrace();
<br /> }
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">private</span></strong> <strong><span style="color: #7f0055;">void</span></strong> executeCommand() {
<br /> System.out.println(<span style="color: #2a00ff;">"executeCommand START"</span>);
<br /> <span style="color: #3f7f5f;">// Step 2: Execute command.bat
</span><br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> String[] cmdArray = <strong><span style="color: #7f0055;">new</span></strong> String[1];
<br /> cmdArray[0] = fileToRunCurl;
<br />
<br /> Process process = Runtime.getRuntime().exec(cmdArray, <strong><span style="color: #7f0055;">null</span></strong>, <strong><span style="color: #7f0055;">new</span></strong> File(<span style="color: #2a00ff;">"C:\\"</span>));
<br /> System.out.println(<span style="color: #2a00ff;">"executeCommand B"</span>);
<br />
<br /> <span style="color: #3f7f5f;">// WHEN RUNNING RUNTIME EXEC MULTIPLE TIMES (Over 1000 Runs) WOULD FREEZE - CLEAR ERROR AND OUTPUT STREAMS: https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2
</span><br /> <span style="color: #3f7f5f;">// any error message?
</span><br /> StreamGobbler errorGobbler = <strong><span style="color: #7f0055;">new</span></strong> StreamGobbler(process.getErrorStream(), <span style="color: #2a00ff;">"ERR"</span>);
<br />
<br /> <span style="color: #3f7f5f;">// any output?
</span><br /> StreamGobbler outputGobbler = <strong><span style="color: #7f0055;">new</span></strong> StreamGobbler(process.getInputStream(), <span style="color: #2a00ff;">"OUT"</span>);
<br />
<br /> <span style="color: #3f7f5f;">// kick them off
</span><br /> errorGobbler.start();
<br /> outputGobbler.start();
<br /> <span style="color: #3f7f5f;">// WHEN RUNNING RUNTIME EXEC MULTIPLE TIMES (Over 1000 Runs) WOULD FREEZE - CLEAR ERROR AND OUTPUT STREAMS: https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2
</span><br />
<br /> <strong><span style="color: #7f0055;">int</span></strong> processComplete = process.waitFor(); <span style="color: #3f7f5f;">// Sometimes the process would never complete. // Could add logic to monitor ERR stream and call process.destroy() if necessary.
</span><br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception e) {
<br /> e.printStackTrace();
<br /> }
<br /> System.out.println(<span style="color: #2a00ff;">"executeCommand FINISH"</span>);
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">private</span></strong> <strong><span style="color: #7f0055;">void</span></strong> readOutputFile() {
<br /> output = <span style="color: #2a00ff;">""</span>;
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> FileReader fr = <strong><span style="color: #7f0055;">new</span></strong> FileReader(<strong><span style="color: #7f0055;">new</span></strong> File(outputFile));
<br /> BufferedReader br = <strong><span style="color: #7f0055;">new</span></strong> BufferedReader(fr);
<br /> String sCurrentLine;
<br /> <strong><span style="color: #7f0055;">while</span></strong> ((sCurrentLine = br.readLine()) != <strong><span style="color: #7f0055;">null</span></strong>) {
<br /> output = output + sCurrentLine + <span style="color: #2a00ff;">'\n'</span>;
<br /> <span style="color: #3f7f5f;">//System.out.println(sCurrentLine);
</span><br /> }
<br /> br.close();
<br /> fr.close();
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception e) {
<br /> e.printStackTrace();
<br /> }
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">class</span></strong> StreamGobbler <strong><span style="color: #7f0055;">extends</span></strong> Thread
<br /> {
<br /> InputStream is;
<br /> String type;
<br /> OutputStream os;
<br />
<br /> StreamGobbler(InputStream is, String type)
<br /> {
<br /> <strong><span style="color: #7f0055;">this</span></strong>(is, type, <strong><span style="color: #7f0055;">null</span></strong>);
<br /> }
<br /> StreamGobbler(InputStream is, String type, OutputStream redirect)
<br /> {
<br /> <strong><span style="color: #7f0055;">this</span></strong>.is = is;
<br /> <strong><span style="color: #7f0055;">this</span></strong>.type = type;
<br /> <strong><span style="color: #7f0055;">this</span></strong>.os = redirect;
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">void</span></strong> run()
<br /> {
<br /> <strong><span style="color: #7f0055;">try</span></strong>
<br /> {
<br /> PrintWriter pw = <strong><span style="color: #7f0055;">null</span></strong>;
<br /> <strong><span style="color: #7f0055;">if</span></strong> (os != <strong><span style="color: #7f0055;">null</span></strong>)
<br /> pw = <strong><span style="color: #7f0055;">new</span></strong> PrintWriter(os);
<br />
<br /> InputStreamReader isr = <strong><span style="color: #7f0055;">new</span></strong> InputStreamReader(is);
<br /> BufferedReader br = <strong><span style="color: #7f0055;">new</span></strong> BufferedReader(isr);
<br /> String line=<strong><span style="color: #7f0055;">null</span></strong>;
<br /> <strong><span style="color: #7f0055;">while</span></strong> ( (line = br.readLine()) != <strong><span style="color: #7f0055;">null</span></strong>)
<br /> {
<br /> <strong><span style="color: #7f0055;">if</span></strong> (pw != <strong><span style="color: #7f0055;">null</span></strong>)
<br /> pw.println(line);
<br /> System.out.println(type + <span style="color: #2a00ff;">">"</span> + line);
<br /> }
<br /> <strong><span style="color: #7f0055;">if</span></strong> (pw != <strong><span style="color: #7f0055;">null</span></strong>)
<br /> pw.flush();
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (IOException ioe)
<br /> {
<br /> ioe.printStackTrace();
<br /> }
<br /> }
<br /> }
<br />}
</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
<br />
This code give credit to <a href="https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2">www.javaworld.com</a> for creating the Stream Gobbler, without which the process would block for for loops, running this curl helper thousands of times. The Stream Gobbler, makes sure the error and output streams do not get clogged up.
<br />
<br />
Sometimes using http proxies might be easier in curl than java. Also, you might have rsa tokens that need to be Base 64 encoded to access the proxy. Below will only work if USERNAME and RSA_TOKEN are system variables.<br />
<br />
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
http_proxy=http:<span style="color: #3f7f5f;">//myproxy.mycompany.com:8080/ https_proxy=http://<span style="font-size: 13.3333px;">myproxy.mycompany.com</span>:8080/ curl --proxy-header "Proxy-Authorization: Basic $(echo -n "$USERNAME:$RSA_TOKEN" | openssl enc -base64 -e)" "https://myservice.com/registry/v1/service" -k</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
Or you might encode the Authorization in Java, prior to using the CurlHelper above.
<br />
<br />
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> String getBasicFromUsernameAndRSAToken() {
<br />
String basic_auth = <strong><span style="color: #7f0055;">new</span></strong> String(org.apache.commons.codec.binary.Base64.encodeBase64((<span style="color: #2a00ff;">"USERNAME:RSA_TOKEN"</span>).getBytes()));
<br />
<strong><span style="color: #7f0055;">return</span></strong> <span style="color: #2a00ff;">"Basic "</span> + basic_auth;
<br />
}<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
In some cases, you will have proxy authentication and authentication.
<br />
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
"curl <span style="color: #2a00ff;">'https:<span style="color: #3f7f5f;">//myservice.mycompany.com/api/query/Applications' -H 'Authorization: ll/V1nJzd3kl4q9Y/ln7XXXXXX2sInDmAKnSzp6HMSon0YlfDMXNbJrUw9OWDmL'"</span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-41590800610165793562017-09-15T12:59:00.001-07:002017-09-15T12:59:14.924-07:00Pagination, Search and Filter<span id="goog_936093211"></span><a href="https://www.blogger.com/"></a><span id="goog_936093212"></span>Often times developers will implement a pagination to reduce the number of results. However, it is always important to remember that pagination must be coupled with a search feature. Otherwise, people lose one of the best capabilities that is available when all the results are available.<br />
<br />
Today, I will add code based on <a href="https://www.w3schools.com/howto/howto_js_filter_table.asp">https://www.w3schools.com/howto/howto_js_filter_table.asp</a> and <a href="https://ebay.gitbooks.io/mindpatterns/content/navigation/pagination.html">https://ebay.gitbooks.io/mindpatterns/content/navigation/pagination.html</a> .<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSsmmEZymZ6wjuH8GBbhT3y-0NWYFg89A_zIiCSD5bp9hF1Rr1Li96qCsASPa4Ko48I0oQGF4tyyNSbg3SQkwlbu_Q-vURiownAwy2BzP66WMKqEu0qmwXRglXPNYu0RbFmXGUrQ8eu2k/s1600/Search.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="341" data-original-width="839" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSsmmEZymZ6wjuH8GBbhT3y-0NWYFg89A_zIiCSD5bp9hF1Rr1Li96qCsASPa4Ko48I0oQGF4tyyNSbg3SQkwlbu_Q-vURiownAwy2BzP66WMKqEu0qmwXRglXPNYu0RbFmXGUrQ8eu2k/s640/Search.PNG" width="640" /></a></div>
<br />
This design includes the following:<br />
<br />
<ul>
<li>A function is provided to filter given the row from the table and the filter string</li>
<li>A label is added after the pagination to show which results are being displayed</li>
<li>Query parameters allowed for a filter string, page number to display and results per page</li>
<li>Disabled or hidden pagination elements when not applicable</li>
<li>The current page is always in the middle of the pagination module</li>
<li>The table holds the source of truth for the page and resultsPerPage attributes</li>
<li>The input holds the source of truth for the filter string</li>
<li>5 numbers and 2 arrows are allowed in the pagination module</li>
</ul>
<div>
See code here <a href="https://gist.github.com/anonymous/42757dc9bc70017d77df62b9c411e38f">https://gist.github.com/anonymous/42757dc9bc70017d77df62b9c411e38f</a> using <a href="http://gist.github.com/">http://gist.github.com/</a></div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-92135638890182884292016-07-23T00:37:00.002-07:002016-07-23T00:37:52.081-07:00Find longest sublist of distinct words<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">package</span></strong> test;
<br />
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.ArrayList;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.Arrays;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.HashMap;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.List;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.Map;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.junit.Assert;
<br />
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> LongestDistinctWords {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<br />
List<String> resultA = <strong><span style="color: #7f0055;">new</span></strong> LongestDistinctWords().occurences(<strong><span style="color: #7f0055;">new</span></strong> ArrayList<String>());
<br />
System.err.println(<span style="color: #2a00ff;">"resultA:"</span>+resultA);
<br />
Assert.assertEquals(resultA, Arrays.asList());
<br />
<br />
List<String> resultB = <strong><span style="color: #7f0055;">new</span></strong> LongestDistinctWords().occurences(Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"House"</span>,<span style="color: #2a00ff;">"House"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Cat"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultB:"</span>+resultB);
<br />
Assert.assertEquals(resultB, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"House"</span>));
<br />
<br />
List<String> resultC = <strong><span style="color: #7f0055;">new</span></strong> LongestDistinctWords().occurences(Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"Dog"</span>,<span style="color: #2a00ff;">"Hello"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultC:"</span>+resultC);
<br />
Assert.assertEquals(resultC, Arrays.asList(<span style="color: #2a00ff;">"Test"</span>, <span style="color: #2a00ff;">"My"</span>, <span style="color: #2a00ff;">"Hello"</span>, <span style="color: #2a00ff;">"Dog"</span>));
<br />
<br />
List<String> resultD = <strong><span style="color: #7f0055;">new</span></strong> LongestDistinctWords().occurences(Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"Dog"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultD:"</span>+resultD);
<br />
Assert.assertEquals(resultD, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"Dog"</span>));
<br />
<br />
List<String> resultE = <strong><span style="color: #7f0055;">new</span></strong> LongestDistinctWords().occurences(Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"And"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"And"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hi"</span>,<span style="color: #2a00ff;">"How"</span>,<span style="color: #2a00ff;">"Are"</span>,<span style="color: #2a00ff;">"Hi"</span>,<span style="color: #2a00ff;">"Yes"</span>,<span style="color: #2a00ff;">"We"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultE:"</span>+resultE);
<br />
Assert.assertEquals(resultE, Arrays.asList(<span style="color: #2a00ff;">"And"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hi"</span>,<span style="color: #2a00ff;">"How"</span>,<span style="color: #2a00ff;">"Are"</span>));
<br />
<br />
List<String> resultF = <strong><span style="color: #7f0055;">new</span></strong> LongestDistinctWords().occurences(Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"And"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"And"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hi"</span>,<span style="color: #2a00ff;">"How"</span>,<span style="color: #2a00ff;">"Are"</span>,<span style="color: #2a00ff;">"Hi"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"We"</span>,<span style="color: #2a00ff;">"Can"</span>,<span style="color: #2a00ff;">"See"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultF:"</span>+resultF);
<br />
Assert.assertEquals(resultF, Arrays.asList(<span style="color: #2a00ff;">"How"</span>,<span style="color: #2a00ff;">"Are"</span>,<span style="color: #2a00ff;">"Hi"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"We"</span>,<span style="color: #2a00ff;">"Can"</span>,<span style="color: #2a00ff;">"See"</span>));
<br />
}
<br />
<br />
<span style="color: #2040a0;">/**
<br /> * Find longest sublist of distinct words
<br /> * <strong>@param</strong> words
<br /> * <strong>@return</strong>
<br /> */</span>
<br />
<strong><span style="color: #7f0055;">public</span></strong> List<String> occurences(List<String> words) {
<br />
Integer longestStart = 0;
<br />
Integer longestEnd = 0;
<br />
Map<String, Integer> indexAfterWordLastSeenMap = <strong><span style="color: #7f0055;">new</span></strong> HashMap<String, Integer>();
<br />
Integer currentStart = 0;
<br />
Integer currentEnd = 0;
<br />
<strong><span style="color: #7f0055;">for</span></strong>(String word: words) {
<br />
Integer lastSeen = indexAfterWordLastSeenMap.get(word);
<br />
<strong><span style="color: #7f0055;">if</span></strong>(lastSeen != <strong><span style="color: #7f0055;">null</span></strong> && lastSeen > currentStart) {
<br />
<strong><span style="color: #7f0055;">if</span></strong>(currentEnd - currentStart > longestEnd - longestStart) {
<br />
longestStart = currentStart;
<br />
longestEnd = currentEnd;
<br />
}
<br />
currentStart = lastSeen;
<br />
}
<br />
currentEnd++;
<br />
indexAfterWordLastSeenMap.put(word, currentEnd);
<br />
}
<br />
<strong><span style="color: #7f0055;">if</span></strong>(currentEnd - currentStart > longestEnd - longestStart) {
<br />
longestStart = currentStart;
<br />
longestEnd = currentEnd;
<br />
}
<br />
<strong><span style="color: #7f0055;">return</span></strong> words.subList(longestStart, longestEnd);
<br />
}
<br />
}
<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-41176520643884287882016-07-23T00:04:00.000-07:002016-07-23T00:04:01.958-07:00Parsing a list of words and searching for most common occurences<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">package</span></strong> test;
<br />
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.ArrayList;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.Arrays;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.HashMap;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.LinkedList;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.List;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.ListIterator;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.Map;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.junit.Assert;
<br />
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> KthOccurence {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<br />
List<String> resultA = <strong><span style="color: #7f0055;">new</span></strong> KthOccurence().occurences(4, <strong><span style="color: #7f0055;">new</span></strong> ArrayList<String>());
<br />
System.err.println(<span style="color: #2a00ff;">"resultA:"</span>+resultA);
<br />
Assert.assertEquals(resultA, Arrays.asList(<strong><span style="color: #7f0055;">null</span></strong>, <strong><span style="color: #7f0055;">null</span></strong>, <strong><span style="color: #7f0055;">null</span></strong>, <strong><span style="color: #7f0055;">null</span></strong>));
<br />
<br />
List<String> resultB = <strong><span style="color: #7f0055;">new</span></strong> KthOccurence().occurences(4, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"House"</span>,<span style="color: #2a00ff;">"House"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Jeep"</span>,<span style="color: #2a00ff;">"Cat"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultB:"</span>+resultB);
<br />
Assert.assertEquals(resultB, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"House"</span>,<span style="color: #2a00ff;">"Time"</span>,<span style="color: #2a00ff;">"Jeep"</span>));
<br />
<br />
List<String> resultC = <strong><span style="color: #7f0055;">new</span></strong> KthOccurence().occurences(1, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"Dog"</span>,<span style="color: #2a00ff;">"Hello"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultC:"</span>+resultC);
<br />
Assert.assertEquals(resultC, Arrays.asList(<span style="color: #2a00ff;">"My"</span>));
<br />
<br />
List<String> resultD = <strong><span style="color: #7f0055;">new</span></strong> KthOccurence().occurences(2, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"Dog"</span>,<span style="color: #2a00ff;">"Hello"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultD:"</span>+resultD);
<br />
Assert.assertEquals(resultD, Arrays.asList(<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"My"</span>));
<br />
<br />
List<String> resultE = <strong><span style="color: #7f0055;">new</span></strong> KthOccurence().occurences(3, Arrays.asList(<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"My"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"Dog"</span>,<span style="color: #2a00ff;">"Hello"</span>));
<br />
System.err.println(<span style="color: #2a00ff;">"resultE:"</span>+resultE);
<br />
Assert.assertEquals(resultE, Arrays.asList(<span style="color: #2a00ff;">"Test"</span>,<span style="color: #2a00ff;">"Hello"</span>,<span style="color: #2a00ff;">"My"</span>));
<br />
}
<br />
<br />
<span style="color: #2040a0;">/**
<br /> * Example: Find the 50 most common words from a book
<br /> * <strong>@param</strong> K - Number of distinct words to return with highest redundancy
<br /> * <strong>@param</strong> words - List of words with repeated words
<br /> * <strong>@return</strong> - Ordered list of highest repeated words
<br /> */</span>
<br />
<strong><span style="color: #7f0055;">public</span></strong> List<String> occurences(Integer K, List<String> words) {
<br />
Map<String, Integer> countMap = <strong><span style="color: #7f0055;">new</span></strong> HashMap<String, Integer>();
<br />
<br />
LinkedList<String> trackedList = <strong><span style="color: #7f0055;">new</span></strong> LinkedList<String>(); <span style="color: #3f7f5f;">// smallest to largest count in list
</span><br />
<strong><span style="color: #7f0055;">for</span></strong>(<strong><span style="color: #7f0055;">int</span></strong> i=0; i<K; i++) {
<br />
trackedList.add(<strong><span style="color: #7f0055;">null</span></strong>);
<br />
}
<br />
countMap.put(<strong><span style="color: #7f0055;">null</span></strong>, 0);
<br />
<br />
<strong><span style="color: #7f0055;">for</span></strong>(String currentWord: words) {
<br />
Integer currentCount = countMap.get(currentWord);
<br />
<strong><span style="color: #7f0055;">if</span></strong>(currentCount == <strong><span style="color: #7f0055;">null</span></strong>) {
<br />
currentCount = 1;
<br />
} <strong><span style="color: #7f0055;">else</span></strong> {
<br />
currentCount++;
<br />
}
<br />
countMap.put(currentWord, currentCount);
<br />
<br />
ListIterator<String> iterator = trackedList.listIterator();
<br />
<strong><span style="color: #7f0055;">while</span></strong>(iterator.hasNext()) { <span style="color: #3f7f5f;">// O(K) to walk through linked list
</span><br />
String nextIteration = iterator.next();
<br />
<br />
<strong><span style="color: #7f0055;">if</span></strong>(currentCount < countMap.get(nextIteration)) { <span style="color: #3f7f5f;">// If
</span><br />
iterator.previous();
<br />
<strong><span style="color: #7f0055;">break</span></strong>;
<br />
}
<br />
<br />
<strong><span style="color: #7f0055;">if</span></strong>(currentWord.equals(nextIteration)) { <span style="color: #3f7f5f;">// if come across word, remove it
</span><br />
iterator.remove(); <span style="color: #3f7f5f;">// O(1) to remove from linked list
</span><br />
}
<br />
}
<br />
<span style="color: #3f7f5f;">// location of iterator is insertion point
</span><br />
iterator.add(currentWord); <span style="color: #3f7f5f;">// O(1) to add to linked list
</span><br />
<strong><span style="color: #7f0055;">if</span></strong>(trackedList.size() > K) { <span style="color: #3f7f5f;">// An insertion occurred without a remove
</span><br />
trackedList.removeFirst(); <span style="color: #3f7f5f;">// O(1) to remove first from linked list
</span><br />
}
<br />
}
<br />
<br />
<strong><span style="color: #7f0055;">return</span></strong> trackedList;
<br />
}
<br />
}
<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-68326096456509282522016-04-19T15:33:00.001-07:002016-04-19T15:39:07.418-07:00Hello World Javascript Extension for Chrome and Firefox<h2>
Developing a Chrome Extension</h2>
<div>
The folder structure will be as follows:</div>
<div>
<ul>
<li>src</li>
<ul>
<li>content</li>
<ul>
<li>HelloWorld.js</li>
<li>rightClickMenuForGoogleChrome.js</li>
</ul>
<li>manifest.json</li>
</ul>
</ul>
</div>
<div>
<h3>
HelloWorld.js</h3>
</div>
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<span style="color: #3f7f5f;">// Main function
</span><br />
HelloWorld=function() {
<br />
alert(<span style="color: #2a00ff;">'Hello World'</span>);
<br />
};<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<h3>
rightClickMenuForGoogleChrome.js</h3>
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
HelloWorldImportJS = <span style="color: #2a00ff;">"content/HelloWorld.js"</span>;
<br />
<br />
<span style="color: #3f7f5f;">// To get all these menus to work, there are a few differences between Firefox and Chrome Extensions
</span><br />
<span style="color: #3f7f5f;">// gContextMenu is defined when using Firefox extension and in this case, DocumentFunction should return gContextMenu.gContextMenu.target.ownerDocument instead of document
</span><br />
<br />
chrome.contextMenus.create({
<br />
id: <span style="color: #2a00ff;">'helloWorldTool'</span>,
<br />
title: <span style="color: #2a00ff;">"Hello World Tool"</span>,
<br />
contexts:[<span style="color: #2a00ff;">"all"</span>]
<br />
});
<br />
chrome.contextMenus.create({
<br />
id: <span style="color: #2a00ff;">'helloWorld'</span>,
<br />
parentId: <span style="color: #2a00ff;">'helloWorldTool'</span>,
<br />
title: <span style="color: #2a00ff;">"Run Hello World"</span>,
<br />
contexts:[<span style="color: #2a00ff;">"all"</span>],
<br />
onclick: function(info, tab){
<br />
chrome.tabs.executeScript(tab.id, {file:HelloWorldImportJS}, function() {
<br />
chrome.tabs.executeScript(tab.id, {code:<span style="color: #2a00ff;">"HelloWorld();"</span>});
<br />
});
<br />
}
<br />
});<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<h3>
manifest.json</h3>
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
{
<br />
<span style="color: #2a00ff;">"manifest_version"</span>: 2,
<br />
<span style="color: #2a00ff;">"name"</span>: <span style="color: #2a00ff;">"Hello World Tool"</span>,
<br />
<span style="color: #2a00ff;">"short_name"</span>: <span style="color: #2a00ff;">"HWT"</span>,
<br />
<span style="color: #2a00ff;">"description"</span>: <span style="color: #2a00ff;">"Hello World Tool Description."</span>,
<br />
<span style="color: #2a00ff;">"version"</span>: <span style="color: #2a00ff;">"1.0"</span>,
<br />
<span style="color: #2a00ff;">"minimum_chrome_version"</span>: <span style="color: #2a00ff;">"38"</span>,
<br />
<span style="color: #2a00ff;">"permissions"</span>: [
<br />
<span style="color: #2a00ff;">"contextMenus"</span>,
<br />
<span style="color: #2a00ff;">"tabs"</span>,
<br />
<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">/<span style="color: #3f7f5f;">/*/*",
</span><br /> "https:<span style="color: #3f7f5f;">//*/</span>*" ],
</span><br /> <span style="color: #2a00ff;">"background"</span>: {
<br /> <span style="color: #2a00ff;">"scripts"</span>: [
<br /> <span style="color: #2a00ff;">"content/rightClickMenuForGoogleChrome.js"</span>
<br /> ]
<br /> }
<br />}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
<h3>
Chrome Web Store Publishing</h3>
<ul>
<li>Zip content and manifest.json.</li>
<li>Rename as "HelloWorldTool.Chrome.zip"</li>
<li>Login to <a class="external-link" href="https://chrome.google.com/webstore/developer/dashboard" rel="nofollow" style="background-color: white; color: #2266bb; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px;">https://chrome.google.com/webstore/developer/dashboard</a></li>
<li>Add New Item</li>
<li>Choose File, HelloWorldTool.Chrome.zip, Upload</li>
<li>Category: Developer Tools, Language: English</li>
<li>Publish Changes: Cost is $5</li>
</ul>
<h3>
Try It Out</h3>
<div>
<ul>
<li>Go to the link to the Published Extension and click "Add to Chrome"</li>
<li>Add to Chrome</li>
<li>Right click pages and test "Run Hello World"</li>
</ul>
</div>
<div>
<h2>
Developing a Firefox Extension</h2>
</div>
<div>
<div>
The folder structure will be as follows:</div>
<div>
<ul>
<li>src</li>
<ul>
<li>content</li>
<ul>
<li>HelloWorld.js</li>
<li>rightClickMenuForFirefox.xul</li>
</ul>
<li>chrome.manifest</li>
<li>install.rdf</li>
</ul>
</ul>
</div>
<div>
<h3>
HelloWorld.js</h3>
</div>
</div>
<div>
See above.</div>
<h3>
rightClickMenuForFirefox.xul</h3>
<div>
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<?xml version=<span style="color: #2a00ff;">"1.0"</span>?>
<br />
<overlay id=<span style="color: #2a00ff;">"helloWorldToolOverlay"</span>
<br />
xmlns=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
</span><br /> <statusbar id=<span style="color: #2a00ff;">"status-bar"</span>>
<br /> <statusbarpanel id=<span style="color: #2a00ff;">"mypanel"</span> label=<span style="color: #2a00ff;">""</span>/>
<br /> </statusbar>
<br /> <script type=<span style="color: #2a00ff;">"application/x-javascript"</span> src=<span style="color: #2a00ff;">"chrome:<span style="color: #3f7f5f;">//helloWorld/content/HelloWorld.js"/>
</span><br /> <span style="color: #3f7f5f;">// This is for the right click menu.
</span><br /> <popup id=<span style="color: #2a00ff;">"contentAreaContextMenu"</span>>
<br /> <menuseparator id=<span style="color: #2a00ff;">"helloWorldSeparator"</span> insertafter=<span style="color: #2a00ff;">"context-stop"</span>/>
<br /> <menu id=<span style="color: #2a00ff;">"helloWorldTool"</span> label=<span style="color: #2a00ff;">"Hello World Tool"</span> insertafter=<span style="color: #2a00ff;">"context-stop"</span>>
<br /> <menupopup>
<br /> <menuitem id=<span style="color: #2a00ff;">"helloWorld"</span> label=<span style="color: #2a00ff;">"Run Hello World"</span> oncommand=<span style="color: #2a00ff;">"HelloWorld();"</span>/>
<br /> </menupopup>
<br /> </menu>
<br /> </popup>
<br /></overlay></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
</div>
<h3>
chrome.manifest</h3>
<div>
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
content helloWorld content/ contentaccessible=yes
<br />
overlay chrome:<span style="color: #3f7f5f;">//browser/content/browser.xul chrome://helloWorld/content/rightClickMenuForFirefox.xul</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
</div>
<h3>
install.rdf</h3>
<div style="background: #ffffff; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #ffffff; color: black; font-family: "courier new" , "courier"; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<?xml version=<span style="color: #2a00ff;">"1.0"</span>?>
<br />
<RDF:RDF xmlns:em=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.mozilla.org/2004/em-rdf#"
</span><br /> xmlns:NC=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//home.netscape.com/NC-rdf#"
</span><br /> xmlns:RDF=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.w3.org/1999/02/22-rdf-syntax-ns#">
</span><br /> <RDF:Description RDF:about=<span style="color: #2a00ff;">"urn:mozilla:install-manifest"</span>
<br /> em:id=<span style="color: #2a00ff;">"helloWorldTool@helloWorld.com"</span>
<br /> em:version=<span style="color: #2a00ff;">"1.0"</span>
<br /> em:name=<span style="color: #2a00ff;">"Hello World Tool"</span>
<br /> em:type=<span style="color: #2a00ff;">"2"</span>
<br /> em:unpack=<span style="color: #2a00ff;">"true"</span>
<br /> em:description=<span style="color: #2a00ff;">"Hello World Tool Description."</span>
<br /> em:creator=<span style="color: #2a00ff;">"scottizu@gmail.com"</span>
<br /> em:homepageURL=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.ebay.com"
</span><br /> >
<br /> <em:targetApplication RDF:resource=<span style="color: #2a00ff;">"rdf:#$RI.6J3"</span>/>
<br /> </RDF:Description>
<br /> <RDF:Description RDF:about=<span style="color: #2a00ff;">"rdf:#$RI.6J3"</span>
<br /> em:id=<span style="color: #2a00ff;">"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"</span>
<br /> em:minVersion=<span style="color: #2a00ff;">"1.5"</span>
<br /> em:maxVersion=<span style="color: #2a00ff;">"45.*"</span> />
<br /></RDF:RDF></span></span></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
<h3>
Firefox Web Store Publishing</h3>
<ul>
<li>Zip content, chrome.manifest and install.rdf</li>
<li>Rename as "HelloWorldTool.Firefox.pre.xpi"</li>
<li>Login to https://addons.mozilla.org/en-US/developers/</li>
<li>Submit an Add-on</li>
<li>Choose File, HelloWorldTool.Firefox.pre.xpi, Upload</li>
<li>Category: Web Development, Mozilla Public License, version 2.0, Preliminary Review</li>
</ul>
<div>
If you want to distribute by yourself, you can install the extension. Then go to the installation folder: (C:\Users\sizu\AppData\Roaming\Mozilla\Firefox\Profiles\2xrz9a7g.default-1451441818907\extensions\helloWorldTool@helloWorld.com ). If it has a META-INF folder, this contains the digital signature for the Firefox Extension. Zip the content, META-INF, chrome.manifest, install.rdf file and rename "HelloWorldTool.Firefox.xpi". You can go to 'about:addons' in Firefox, click the settings wheel, Install Add on and select this file. The extension will then show in 'about:addons'.</div>
<h3>
Try It Out</h3>
<div>
<ul>
<li>Go to the link to the Published Extension in Firefox and click Add to Firefox</li>
<ul>
<li>https://addons.mozilla.org/en-US/developers/addon/hello-world-tool/versions/1850966</li>
<li>https://addons.mozilla.org/en-US/firefox/addon/hello-world-tool/</li>
</ul>
<li>Add to Firefox</li>
<li>Right click pages and test "Run Hello World"</li>
</ul>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-27392605309349733182016-01-14T22:24:00.000-08:002016-01-14T22:25:33.681-08:00Firefox and Chrome Extensions and Automatic Updateshttps://developer.mozilla.org/en-US/docs/Extension_Versioning,_Update_and_Compatibility<br />
https://developer.mozilla.org/en-US/Add-ons/Distribution<br />
https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm<br />
C:\Users\sizu\AppData\Roaming\npm\node_modules\jpm\bin\jpm<br />
https://addons.mozilla.org/en-US/developers/addon/api/key/<br />
<br />
TOPIC 1 - XPI SIGNATURE CREATION<br />
<br />
To digitally sign the Firefox extension, you will need to get some Firefox credentials: JWT issuer, JWT secret. These can be received after signing up by...<br />
<br />
https://addons.mozilla.org/en-US/firefox/users/login?to=/en-US/developers/addon/api/key/ Tools->Manage API Keys->Generate New Credentials (JWT issuer, JWT secret)<br />
<br />
To create the .xpi file (extension file), you can do so with the jpm tool. You should first download NPM, which you can use in Git Bash (needs to be downloaded too).<br />
<br />
STEP 1: Then, you can run 'npm install jpm --global' in Git Bash.<br />
<br />
STEP 2: After, you may create a package.json file using 'jpm init'. After this is created, you should add additional fields beyond title, name, etc. I added an id (@my_izu_extension), homepage, icon and main (picked a random js file in my content folder).<br />
<br />
ERROR 1: I had an error with "Using existing install.rdf", since I had manually created this. I just moved this into a backup folder after copying its contents to the package.json file, in the appropriate format.<br />
<br />
ERROR 2: I had an Invalid addon ID. You can use a GUID or any string with '@'. I chose the later and used the ID '@my_izu_extension'.<br />
<br />
STEP 3: Run 'jpm sign --api-key ${JWTissuer} --api-secret ${JWT secret}'.<br />
<br />
Note: Here replace the ${xxx} with the credentials from the Firefox site (https://addons.mozilla.org/en-US/developers/addon/api/key/)<br />
<br />
TOPIC 2 - AUTOMATIC UPDATES FOR FIREFOX EXTENSION<br />
<br />
STEP 1: Firefox Updates over http. Download McCoy from https://developer.mozilla.org/en-US/docs/Mozilla/Projects/McCoy. Keys->Create New Key. Right Click New Key->Copy Public Key.<br />
<br />
STEP 2: This goes into the Firefox install.rdf file as updateKey. (put this in package JSON as updateKey, right along with id, title, name, etc).<br />
<br />
Note: If using an install.rdf file, this can be done automatically with Extension->Add Key to Install Manifest and finding install.rdf file.<br />
<br />
STEP 3:<br />
<br />
To create an FirefoxUpdates.rdf file by copying it from here:<br />
https://developer.mozilla.org/en-US/docs/Extension_Versioning,_Update_and_Compatibility<br />
<br />
Delete the first <RDF:li> tag since you will use the second one which since the updateLink will be over http. Change the id to match yours (mine was '@my_izu_extension').<br />
<br />
Add an updateLink and updateInfoURL (these will need to be hosted somewhere).<br />
<br />
You can generate the updateHash with openssl as follows 'openssl dgst -sha256 @my_izu_extension.xpi > updateHash.txt'<br />
<br />
STEP 4:<br />
<br />
This will run openssl and create a hash in the file updateHash.txt. Something like this...<br />
<br />
SHA256(my_izu_extension.xpi)= 2aefcd04c56f060bcfc53acfe96a87af120ed05933ab7969c91642847aa445df<br />
<br />
Copy the hash and add it to the updateHash field but add the prefix 'sha256:'. Something like this...<br />
<br />
<div>
<em:updateHash>sha256:2aefcd04c56f060bcfc53acfe96a87af120ed05933ab7969c91642847aa445df</em:updateHash></div>
<br />
STEP 5: Then, add the updateHash into the FirefoxUpdates.rdf file by Update->Sign Update Manifest.<br />
<br />
STEP 6: Upload the new @my_izu_extension.xpi file and FirefoxUpdates.rdf file appropriately.<br />
<div>
<br /></div>
<div>
RECAP. Here's my setup. I have a package.json with a my updateURL (pointing to where I will store the FirefoxUpdates.rdf file) and updateKey (generated by McCoy). After adding these, I use jpm to create the @my_izu_extension.xpi file.</div>
<div>
<br /></div>
<div>
I create/modify the update.rdf file to include updateLink (pointing to where I will store the .xpi file). I create a hash of the @my_izu_extension.xpi file (using openssl), then modify the updateHash field in FirefoxUpdates.rdf. Finally, I digitally sign the FirefoxUpdates.rdf file using McCoy which adds the digital signature.</div>
<div>
<br /></div>
<div>
Last, I upload both the @my_izu_extension.xpi file and the FirefoxUpdates.rdf file to their appropriate locations. I host them both in the same folder, both hosted by a Tomcat Server.</div>
<div>
<br /></div>
<div>
TOPIC 3 - AUTOMATIC UPDATES FOR GOOGLE CHROME EXTENSION</div>
<div>
<br /></div>
<div>
STEP 1: Modify the manifest.json file to add an update_url field right along side the name, description, etc.</div>
<div>
<br /></div>
<div>
STEP 2: Create an update.xml file like the one shown here: https://developer.chrome.com/extensions/autoupdate</div>
<div>
<br /></div>
<div>
I get the app id by using the chrome://extensions page, with Developer mode checked and use 'Load unpacked extension' which loads the extension and gives me the ID (aka appID).</div>
<div>
<br /></div>
<div>
STEP 3: Upload the update.xml file to where the update_url points.</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-90667557083193033612016-01-12T15:49:00.002-08:002016-01-12T15:49:43.211-08:00Running Javascript in Firefox and Google ChromeSuppose I want to run the printHelloWorldError function from this code in Firefox or Google Chrome. There are several ways to do it.<br />
<br />
This code will add a div tag to the body tag of the page with the message 'Hello World'.
<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
var err=function(e){
<br />
var s=e.description;
<br />
<strong><span style="color: #7f0055;">if</span></strong>(!s){
<br />
s=String(e);
<br />
}
<br />
var d=DocumentFunction().createElement(<span style="color: #2a00ff;">"div"</span>);
<br />
d.id=<span style="color: #2a00ff;">"print_err"</span>;
<br />
d.innerHTML=s;
<br />
d.style.color=<span style="color: #2a00ff;">"red"</span>;
<br />
DocumentFunction().body.appendChild(d);
<br />
};
<br />
var DocumentFunction;
<br />
var printHelloWorldError=function(){
<br />
DocumentFunction = function() {
<br />
<strong><span style="color: #7f0055;">return</span></strong> document;
<br />
};
<br />
err(<span style="color: #2a00ff;">'HelloWorld'</span>);
<br />
};<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
<b>Option 1 - From Firefox/Google Chrome Console</b><br />
<br />
Edit the code above to add a line with this at the end: 'printHelloWorldError();' (don't include the single quotes). Right click any page, Inspect (the element), Find the Console. Paste the modified code in the console and hit Enter. You should see the words 'Hello World' at the bottom of the page.<br />
<br />
<b>Option 2 - From the Firefox/Google Chrome Browser</b><br />
<br />
Edit the code above to add a line with this at the beginning: 'javascript:' and this at the end 'printHelloWorldError();'. Add it to Notepadd++. Highlight the code and either drag it onto the Firefox address bar or right above the Google Chrome tab.<br />
<br />
<b>Option 3 - From the Firefox/Google Chrome Bookmark</b><br />
<br />
If you drag and drop the edited code (with 'javascript:' at the beginning and 'printHelloWorldError();' at the end) into the Firefox address bar from Notepad++, it will reformat the Notepadd++ code into a single line like this:<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
javascript:var err=function(e){ var s=e.description; <strong><span style="color: #7f0055;">if</span></strong>(!s){ s=String(e); } var d=DocumentFunction().createElement(<span style="color: #2a00ff;">"div"</span>); d.id=<span style="color: #2a00ff;">"print_err"</span>; d.innerHTML=s; d.style.color=<span style="color: #2a00ff;">"red"</span>; DocumentFunction().body.appendChild(d);};var DocumentFunction;var printHelloWorldError=function(){ DocumentFunction = function() { <strong><span style="color: #7f0055;">return</span></strong> document; }; err(<span style="color: #2a00ff;">'Hello World'</span>);};printHelloWorldError();<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
You can right click the Firefox Brower, show the Bookmark Toolbar, create a New Bookmark with the name 'Print Error' and for the location enter the above code. Then, anytime you hit this bookmark, the code will execute.<br />
<br />
In Google Chrome, Add a new bookmark by using 'Bookmark this page' from the hamburger menu. Then, edit the bookmark and change the url to the code above (condensed one liner code with javascript: to indicate to run javascript code and printHelloWorldError(); to actually call the function).<br />
<br />
<b>Option 4a - From a Right Click Menu added through a Firefox Extension</b><br />
<br />
Create an install.rdf file.<br />
<br />
For other options like hompageURL, optionsURL, aboutURL, iconURL (ie em:iconURL="chrome://mypackage/content/myicon.png") which use the chrome.manifest file, see <a href="https://developer.mozilla.org/en-US/Add-ons/Install_Manifests">developer.mozilla.org</a><br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<?xml version=<span style="color: #2a00ff;">"1.0"</span>?>
<br />
<RDF:RDF xmlns:em=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.mozilla.org/2004/em-rdf#"
</span><br /> xmlns:NC=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//home.netscape.com/NC-rdf#"
</span><br /> xmlns:RDF=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.w3.org/1999/02/22-rdf-syntax-ns#">
</span><br />
<br /> <RDF:Description RDF:about=<span style="color: #2a00ff;">"urn:mozilla:install-manifest"</span>
<br /> em:id=<span style="color: #2a00ff;">"scottizu@gmail.com"</span>
<br /> em:version=<span style="color: #2a00ff;">"0.1"</span>
<br /> em:name=<span style="color: #2a00ff;">"Print Error"</span>
<br /> em:unpack=<span style="color: #2a00ff;">"true"</span>
<br /> em:description=<span style="color: #2a00ff;">"Prints an error on the page."</span>
<br /> em:creator=<span style="color: #2a00ff;">"scottizu"</span>>
<br /> <em:targetApplication RDF:resource=<span style="color: #2a00ff;">"rdf:#$RI.6J3"</span>/>
<br /> </RDF:Description>
<br /> <RDF:Description RDF:about=<span style="color: #2a00ff;">"rdf:#$RI.6J3"</span>
<br /> em:id=<span style="color: #2a00ff;">"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"</span>
<br /> em:minVersion=<span style="color: #2a00ff;">"1.5"</span>
<br /> em:maxVersion=<span style="color: #2a00ff;">"*.*"</span> />
<br /></RDF:RDF></span></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
<br />
Note: The ID needs to either be an e-mail address or a GUID. See link above for more details.<br />
<br />
Create a chrome.manifest file.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
content mypackage mycontent/ contentaccessible=yes
<br />
overlay chrome:<span style="color: #3f7f5f;">//browser/content/browser.xul chrome://mypackage/content/rightClickMenuForFirefox.xul</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
Create a folder called mycontent. In it, create a file called rightClickMenuForFirefox.xul<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<?xml version=<span style="color: #2a00ff;">"1.0"</span>?>
<br />
<overlay id=<span style="color: #2a00ff;">"myoverlay"</span>
<br />
xmlns=<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
</span><br />
<br /> <script type=<span style="color: #2a00ff;">"application/x-javascript"</span> src=<span style="color: #2a00ff;">"chrome:<span style="color: #3f7f5f;">//mypackage/content/printError.js"/>
</span><br />
<br /> <span style="color: #3f7f5f;">// This is for the right click menu.
</span><br /> <popup id=<span style="color: #2a00ff;">"contentAreaContextMenu"</span>>
<br /> <menuitem id=<span style="color: #2a00ff;">"printError"</span> label=<span style="color: #2a00ff;">"Print Error"</span> insertafter=<span style="color: #2a00ff;">"context-stop"</span> oncommand=<span style="color: #2a00ff;">"printHelloWorldErrorForRightClick();"</span>/>
<br /> </popup>
<br /></overlay></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
<br />
Modify the printError.js file to add a method printHelloWorldErrorForRightClick. The challenge in the right click menu for Firefox and Chrome is getting access to the document for the page. This is why there is a function named DocumentFunction whose job is to return the document for the page. This way, we can see the change on the web page we are looking at.<br />
<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
var err=function(e){
<br />
var s=e.description;
<br />
<strong><span style="color: #7f0055;">if</span></strong>(!s){
<br />
s=String(e);
<br />
}
<br />
var d=DocumentFunction().createElement(<span style="color: #2a00ff;">"div"</span>);
<br />
d.id=<span style="color: #2a00ff;">"print_err"</span>;
<br />
d.innerHTML=s;
<br />
d.style.color=<span style="color: #2a00ff;">"red"</span>;
<br />
DocumentFunction().body.appendChild(d);
<br />
};
<br />
var DocumentFunction;
<br />
var printHelloWorldError=function(){
<br />
DocumentFunction = function() {
<br />
<strong><span style="color: #7f0055;">return</span></strong> document;
<br />
};
<br />
err(<span style="color: #2a00ff;">'Hello World'</span>);
<br />
};
<br />
var printHelloWorldErrorForRightClick=function(){
<br />
DocumentFunction = function() {
<br />
<strong><span style="color: #7f0055;">return</span></strong> gContextMenu.target.ownerDocument;
<br />
};
<br />
err(<span style="color: #2a00ff;">'Hello World (RC)'</span>);
<br />
};<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
Here is the file structure.<br />
<br />
- install.rdf<br />
- chrome.manifest<br />
- mycontent<br />
- rightClickMenuForFirefox.xul<br />
- printError.js<br />
<br />
Highlight, install.rdf, chrome.manifest, mycontent, right click, send to, Compressed (zipped) folder. Rename the new file as RightClickMenuForFirefox.xpi. Go to Firefox 'about:config', 'I'll be careful, I promise', search for xpinstall.signatures.required, set to false so the new extension won't need signing. Go to Firefox address bar and type 'about:addons', click Extensions and drag the file RightClickMenuForFirefox.xpi on this page. Firefox will install this unsigned Extension, restart. From there, you should be able to right click any page and select 'Print Error'.<br />
<br />
There are many other things that you can do with the Firefox Extension such as adding an icon, adding a skin, etc.<br />
<br />
You can also configure menus as well as menu items. Just add something like this with appropriate closing menu and menupopup closing tags.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<menu id=<span style="color: #2a00ff;">"mymenu"</span> label=<span style="color: #2a00ff;">"Error Menu"</span> insertafter=<span style="color: #2a00ff;">"context-stop"</span>>
<br />
<menupopup>
<br />
<br />
<menu id=<span style="color: #2a00ff;">"Error Sub Menu"</span> label=<span style="color: #2a00ff;">"Print Error Menu"</span>>
<br />
<menupopup>
<br />
<menuitem id=<span style="color: #2a00ff;">"printError1"</span> label=<span style="color: #2a00ff;">"Print Error 1"</span> oncommand=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff; font-size: 13.3333px;">printHelloWorldErrorForRightClick</span><span style="color: #2a00ff;">();"</span>/><br />
<menuitem id=<span style="color: #2a00ff;">"printError2"</span> label=<span style="color: #2a00ff;">"Print Error 2"</span> oncommand=<span style="color: #2a00ff;">"</span><span style="color: #2a00ff; font-size: 13.3333px;">printHelloWorldErrorForRightClick2</span><span style="color: #2a00ff;">();"</span>/><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
<b>Option 4b - From a Right Click Menu added through a Google Chrome Extension</b><br />
<b><br /></b>
In the mycontent folder, create a file called manifest.json<br />
<br />
Note: I debated whether to store this in the same directory as install.rdf, but the Chrome packager uses a folder, which in this case will be mycontent, so that the .crx file created will be at the same level as install.rdf. This is unfortunate and the only difference is that the scripts value would be mycontent/rightClickMenuForGoogleChrome.js instead of rightClickMenuForGoogleChrome.js and execute script command would have to have mycontent/printError.js instead of printError.js if the manifest.json was up one level.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
{
<br />
<span style="color: #2a00ff;">"manifest_version"</span>: 2,
<br />
<span style="color: #2a00ff;">"name"</span>: <span style="color: #2a00ff;">"Print Error"</span>,
<br />
<span style="color: #2a00ff;">"description"</span>: <span style="color: #2a00ff;">"Prints an error on the page."</span>,
<br />
<span style="color: #2a00ff;">"version"</span>: <span style="color: #2a00ff;">"0.1"</span>,
<br />
<span style="color: #2a00ff;">"minimum_chrome_version"</span>: <span style="color: #2a00ff;">"38"</span>,
<br />
<span style="color: #2a00ff;">"permissions"</span>: [
<br />
<span style="color: #2a00ff;">"contextMenus"</span>,
<br />
<span style="color: #2a00ff;">"tabs"</span>,
<br />
<span style="color: #2a00ff;">"http:<span style="color: #3f7f5f;">/<span style="color: #3f7f5f;">/*/*",
</span><br /> "https:<span style="color: #3f7f5f;">//*/</span>*" ],
</span><br /> <span style="color: #2a00ff;">"background"</span>: {
<br /> <span style="color: #2a00ff;">"scripts"</span>: [
<br /> <span style="color: #2a00ff;">"rightClickMenuForGoogleChrome.js"</span>
<br /> ]
<br /> }
<br />}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
<br />
Create a file rightClickMenuForGoogleChrome.js<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
printErrorMenu = function(info, tab){
<br />
chrome.tabs.executeScript(tab.id, {file:<span style="color: #2a00ff;">"printError.js"</span>}, function() {
<br />
chrome.tabs.executeScript(tab.id, {code:<span style="color: #2a00ff;">"printHelloWorldError();"</span>});
<br />
});
<br />
};
<br />
<br />
chrome.contextMenus.create({
<br />
id: <span style="color: #2a00ff;">'printError'</span>,
<br />
title: <span style="color: #2a00ff;">"Print Error"</span>,
<br />
contexts:[<span style="color: #2a00ff;">"all"</span>],
<br />
onclick: printErrorMenu
<br />
});<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
Here is the file structure.<br />
- mycontent<br />
- rightClickMenuForGoogleChrome.js<br />
- printError.js<br />
- manifest.json<br />
<br />
Go to Google Chrome, in address bar type 'chrome://extensions', select Developer mode, Load unpacked extension, select the mycontent folder.<br />
<br />
You can also package with the Pack extension (Developer mode must be checked). Browse to mycontent folder as extension root directory (leave private key field empty). This will create a .crx file and .pem file. The .pem file is a private key file but is not needed if the field was left empty. Later, you can drag and drop this .crx file directly onto the 'chrome://extensions' page.<br />
<br />
You can also add other menu options to run more code. Just make sure the appropriate onclick methods are defined.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
chrome.contextMenus.create({
<br />
id: <span style="color: #2a00ff;">'parentMenu'</span>,
<br />
title: <span style="color: #2a00ff;">"Error Menu"</span>,
<br />
contexts:[<span style="color: #2a00ff;">"all"</span>]
<br />
});
<br />
chrome.contextMenus.create({
<br />
id: <span style="color: #2a00ff;">'printError1'</span>,
<br />
parentId: <span style="color: #2a00ff;">'</span><span style="color: #2a00ff; font-size: 13.3333px;">parentMenu</span><span style="color: #2a00ff;">'</span>,
<br />
title: <span style="color: #2a00ff;">"Print Error 1"</span>,
<br />
contexts:[<span style="color: #2a00ff;">"all"</span>],
<br />
onclick: printErrorMenu<br />
});
<br />
chrome.contextMenus.create({
<br />
id: <span style="color: #2a00ff;">'</span><span style="color: #2a00ff; font-size: 13.3333px;">printError2</span><span style="color: #2a00ff;">'</span>,
<br />
parentId: <span style="color: #2a00ff;">'</span><span style="color: #2a00ff; font-size: 13.3333px;">parentMenu</span><span style="color: #2a00ff;">'</span>,
<br />
title: <span style="color: #2a00ff;">"Print Error 2"</span>,
<br />
contexts:[<span style="color: #2a00ff;">"all"</span>],
<br />
onclick: printErrorMenu2<br />
});<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-20954032206530167422016-01-03T12:29:00.003-08:002016-01-03T12:30:46.203-08:00Field Programmable Gate Arrays and Other Space Tech InitiativesI am reading the book "Elon Musk" a biography and several things hit me well. One is that our industrial might has long since been gone from the 1940's. As such, I went to New Mexico attracted to strengthening that industrial might.
<br><br>
Also, our talented engineers are focused rather than solving world problems, on making money, often drawn to software and financial industries.
<br><br>
Here are some posting based on reconfiguring satellites in space, based on small payloads rather than large payloads.
<br><br>
Unfortunately, my experience with the industry is that a person could wait 7 years to launch their work, and their work might be part of phase 12 of 17. If phase 1, failed or the launch failed, that person would have to wait another 7 years for a next launch. Elon Musk seems to be determined to bring the agility of Silicon Valley to the aerospace industry. A noble quest.
<br><br>
I also saw a large amount of fluff, with no substantial technology behind it, which was a turn off to this industry. Real break throughs and transparency are important to me.
<br><br>
<a href='https://drive.google.com/file/d/0B9pC9EpixPYFb0dUd2hpd3BpczA/view?usp=sharing'>Abstract</a>
<br><a href='https://drive.google.com/file/d/0B9pC9EpixPYFWkZqMzFOVzhUaXM/view?usp=sharing'>Implementing Data Reduction Techniques in
Recon gurable Computing Platforms</a>
<br><a href='https://drive.google.com/file/d/0B9pC9EpixPYFYWpqU3c5cWE0Q1k/view?usp=sharing'>Orbital Mechanics</a>
<br><a href='https://drive.google.com/file/d/0B9pC9EpixPYFZnl4Y2d6R1NfTEU/view?usp=sharing'>Polarization</a>
<br><br>
As far as solar technologies, while at ITT, in 2008, I worked with peers to create a proposal for a Broad Agency Announcement (BAA). We created a satellite design exploring capabilities of hybrid power systems involving solar power and electromagnetic tethers. We proposed methods for propelling the satellite using electromagenetic and momentum tether configurations to avoid the need for rocket fuel.scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-36357056539133066332016-01-03T12:08:00.001-08:002016-01-03T12:12:19.532-08:00Real Time Visualization of Raw Sound from Microphone Input using HTML5From <a href='http://www.smartjava.org/content/exploring-html5-web-audio-visualizing-sound'>www.smartjava.org</a> ...
<br><br>
In order to use the webkitGetUserMedia method, your html code needs to be deployed on a server. That means, you can't just open the html in Google Chrome. This is unfortunate. However, you can deploy onto a server doing these three steps.
<br><br>
<br>1. Install Tomcat 7 - http://mirror.symnds.com/software/Apache/tomcat/tomcat-7/v7.0.54/bin/apache-tomcat-7.0.54.exe
<br>2. Go to the Task Manager, Services Tab, Services and start Tomcat
<br>3. Open http://localhost:8080 in Chrome
<br><br>
You should see the index.jsp page that was installed with Tomcat. This would normally be in the "C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT" directory.
<br><br>
Create and html file named volume.html with the following contents:
<br><br>
<div style="background:#FFFFFF;BORDER-TOP: #000 1px dashed;BORDER-BOTTOM: #000 1px dashed;BORDER-LEFT: #000 1px dashed;BORDER-RIGHT: #000 1px dashed;PADDING-BOTTOM: 3px; MARGIN: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; "><div style="background:#FFFFFF; font-family: Courier New, Courier; font-size: 10pt; COLOR: #000000; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><html>
<br><head>
<br>
<br><script type=<font color="#2a00ff">"text/javascript"</font>>
<br>
<br>function canvasDrawLine(oPosX, oPosY, fPosX, fPosY) {
<br> var ctx = getCanvas().getContext(<font color="#2a00ff">'2d'</font>);
<br> ctx.beginPath();
<br> ctx.moveTo(oPosX, oPosY);
<br> ctx.lineTo(fPosX, fPosY);
<br> ctx.stroke();
<br>}
<br>
<br>function canvasDrawSquare(ulPosX, ulPosY, lrPosX, lrPosY) {
<br> canvasDrawLine(ulPosX, ulPosY, ulPosX, lrPosY);
<br> canvasDrawLine(ulPosX, lrPosY, lrPosX, lrPosY);
<br> canvasDrawLine(lrPosX, lrPosY, lrPosX, ulPosY);
<br> canvasDrawLine(lrPosX, ulPosY, ulPosX, ulPosY);
<br>}
<br>
<br>function canvasInitialize(width, height) {
<br> <font color="#3f7f5f">// Set canvas parameters
</font><br> getCanvas().width = width;
<br> getCanvas().height = height;
<br>
<br> <font color="#3f7f5f">// Outline
</font><br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).clearRect(0,0,width,height);
<br> canvasDrawSquare(0,0,width,height);
<br>}
<br>
<br>function getAverageVolume(array) {
<br> var values = 0;
<br> <font color="#3f7f5f">// get all the frequency amplitudes
</font><br> <strong><font color="#7f0055">for</font></strong> (var i = 0; i < array.length; i++) {
<br> values += array[i];
<br> }
<br> <strong><font color="#7f0055">return</font></strong> values / (array.length);
<br>}
<br>
<br>function onSuccess(stream) {
<br> var context = <strong><font color="#7f0055">new</font></strong> webkitAudioContext();
<br> var mediaStreamSource = context.createMediaStreamSource(stream);
<br>
<br> var analyser = context.createAnalyser();
<br> analyser.smoothingTimeConstant = 0.3;
<br> analyser.fftSize = 1024;
<br>
<br> var javascriptNode = context.createScriptProcessor(2048, 1, 1);
<br>
<br> javascriptNode.onaudioprocess = function(e) {
<br> <font color="#3f7f5f">//var sample = e.inputBuffer.getChannelData(0);
</font><br>
<br> <font color="#3f7f5f">// get the average, bincount is fftsize / 2
</font><br> var array = <strong><font color="#7f0055">new</font></strong> Uint8Array(analyser.frequencyBinCount);
<br> analyser.getByteFrequencyData(array);
<br>
<br> <font color="#3f7f5f">// calculate average
</font><br> var average = getAverageVolume(array)
<br>
<br> <font color="#3f7f5f">// print value out
</font><br> log(average);
<br>
<br> <font color="#3f7f5f">// draw green bar
</font><br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).strokeStyle=<font color="#2a00ff">'#000000'</font>;
<br> canvasInitialize(200,200);
<br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).strokeStyle=<font color="#2a00ff">'#00ff00'</font>;
<br> canvasDrawSquare(10, 150, 20, 150-average*5);
<br> };
<br>
<br> <font color="#3f7f5f">// stream -> mediaSource -> analyser -> javascriptNode -> destination
</font><br> mediaStreamSource.connect(analyser);
<br> analyser.connect(javascriptNode);
<br> javascriptNode.connect(context.destination);
<br>}
<br>
<br>function onError() {
<br> alert(<font color="#2a00ff">'Error'</font>);
<br>}
<br>
<br>function log(logVal) {
<br> getLog().innerHTML = logVal + <font color="#2a00ff">'\n<br>'</font>;
<br>}
<br>
<br>function getCanvas() {
<br> <strong><font color="#7f0055">return</font></strong> document.getElementById(<font color="#2a00ff">'mycanvas'</font>);
<br>}
<br>
<br>function getLog() {
<br> <strong><font color="#7f0055">return</font></strong> document.getElementById(<font color="#2a00ff">'mylog'</font>);
<br>}
<br>
<br>function documentReady() {
<br> <strong><font color="#7f0055">if</font></strong>(navigator.getUserMedia) {
<br> navigator.getUserMedia({video: <strong><font color="#7f0055">false</font></strong>, audio: <strong><font color="#7f0055">true</font></strong>}, onSuccess, onError);
<br> } <strong><font color="#7f0055">else</font></strong> <strong><font color="#7f0055">if</font></strong>(navigator.webkitGetUserMedia) {
<br> navigator.webkitGetUserMedia({video: <strong><font color="#7f0055">false</font></strong>, audio: <strong><font color="#7f0055">true</font></strong>}, onSuccess, onError);
<br> }
<br>}
<br></script>
<br></head>
<br>
<br><body onload=<font color="#2a00ff">"documentReady();"</font>>
<br> <canvas id=<font color="#2a00ff">"mycanvas"</font>></canvas>
<br> <div id=<font color="#2a00ff">"mylog"</font>></div>
<br></body>
<br></html><div style="text-align:right;BORDER-TOP: #ccc 1px dashed"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div></div></div>
<br><br>
Without stopping Tomcat, copy this file into the ROOT directory, specified above and open the http://localhost:8080/volume.html in Google Chrome. You should see a message that allows you to access the Microphone. Then you should see a green box along with changing numbers that indicate the volume.
<br /><br />This post was reposted from <a href="https://scottizu.wordpress.com/2014/06/23/real-time-visualization-of-raw-sound-from-microphone-input-using-html5/">scottizu.wordpress.com</a>, originally written on June 23rd, 2014.scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com3tag:blogger.com,1999:blog-3320849621289075761.post-20129910337409688402016-01-03T11:46:00.000-08:002016-01-03T12:10:46.218-08:00Real Time Visualization of a Spectrogram
From <a href='http://www.smartjava.org/content/exploring-html5-web-audio-visualizing-sound'>www.smartjava.org</a>.
<br><br>
This code needs to be added to a Tomcat server to work. This allows the microphone in Chrome to be connected. See <a href='http://sizustech.blogspot.com/2016/01/real-time-visualization-of-raw-sound.html'>Real Time Visualization of Raw Sound from Microphone Input using HTML5</a>.
<br><br>
Some notes on this, that not all frequencies are shown in this. Also, the shift method, copies what is on the canvas and then pastes it a few pixels over, based on the shift parameters.
<br><br>
<div style="background:#FFFFFF;BORDER-TOP: #000 1px dashed;BORDER-BOTTOM: #000 1px dashed;BORDER-LEFT: #000 1px dashed;BORDER-RIGHT: #000 1px dashed;PADDING-BOTTOM: 3px; MARGIN: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; "><div style="background:#FFFFFF; font-family: Courier New, Courier; font-size: 10pt; COLOR: #000000; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><html>
<br><head>
<br><script type=<font color="#2a00ff">"text/javascript"</font>>
<br>
<br>function interpolate(x, x0, xf, y0, yf) {
<br> <font color="#3f7f5f">// (x - x0)/(xf - x0) = (y - y0)/(yf - y0)
</font><br> <font color="#3f7f5f">// y = ( (x-x0)/(xf-x0) ) * (yf-y0) + y0
</font><br> <strong><font color="#7f0055">return</font></strong> Math.floor( ( (x-x0)/(xf-x0) ) * (yf-y0) + y0 );
<br>}
<br>
<br><font color="#3f7f5f">// colors:['#000000', '#ff0000', '#ffff00', '#ffffff']
</font><br><font color="#3f7f5f">// positions:[0, 64-1, 192-1, 255]
</font><br><font color="#3f7f5f">// 0 = parseInt('00', 16), 256-1 = parseInt('ff', 16)
</font><br>function findColor(val) {
<br> var r, rDec, g, gDec, b, bDec;
<br> <strong><font color="#7f0055">if</font></strong>(val < 64) {
<br> rDec = interpolate(val, 0, 64-1, 0, 256-1);
<br> r = rDec.toString(16);
<br> g = <font color="#2a00ff">'00'</font>;
<br> b = <font color="#2a00ff">'00'</font>;
<br> } <strong><font color="#7f0055">else</font></strong> <strong><font color="#7f0055">if</font></strong> (val < 192) {
<br> r = <font color="#2a00ff">'ff'</font>;
<br> gDec = interpolate(val, 64, 192-1, 0, 256-1);
<br> g = gDec.toString(16);
<br> b = <font color="#2a00ff">'00'</font>;
<br> } <strong><font color="#7f0055">else</font></strong> {
<br> r = <font color="#2a00ff">'ff'</font>;
<br> g = <font color="#2a00ff">'ff'</font>;
<br> bDec = interpolate(val, 192, 256-1, 0, 256-1);
<br> b = bDec.toString(16);
<br> }
<br> <strong><font color="#7f0055">return</font></strong> <font color="#2a00ff">'#'</font>+r+g+b;
<br>}
<br>
<br>function canvasFillCoordinate(leftX, topY, val) {
<br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).fillStyle = findColor(val);
<br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).fillRect(leftX, topY, 1, 1);
<br>}
<br>
<br>function canvasInitialize(width, height) {
<br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).strokeStyle=<font color="#2a00ff">'#000000'</font>;
<br>
<br> <font color="#3f7f5f">// Set canvas parameters
</font><br> getCanvas().width = width;
<br> getCanvas().height = height;
<br>
<br> <font color="#3f7f5f">// Outline
</font><br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).clearRect(0,0,width,height);
<br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).rect(0,0,width,height);
<br> getCanvas().getContext(<font color="#2a00ff">'2d'</font>).stroke();
<br>}
<br>
<br>function onSuccess(stream) {
<br> <font color="#3f7f5f">// stream -> mediaSource -> javascriptNode -> destination
</font><br> var context = <strong><font color="#7f0055">new</font></strong> webkitAudioContext();
<br> var mediaStreamSource = context.createMediaStreamSource(stream);
<br> var analyser = context.createAnalyser();
<br> analyser.smoothingTimeConstant = 0.3;
<br> analyser.fftSize = 2048;
<br> var javascriptNode = context.createScriptProcessor(2048, 1, 1);
<br> mediaStreamSource.connect(analyser);
<br> analyser.connect(javascriptNode);
<br> javascriptNode.connect(context.destination);
<br>
<br> javascriptNode.onaudioprocess = createProcessBuffer(analyser);
<br>}
<br>
<br>function createProcessBuffer(analyser) {
<br> canvasInitialize(1024,1024);
<br> var time = 0;
<br> <strong><font color="#7f0055">return</font></strong> function processBuffer() {
<br> time = time + 1;
<br> <strong><font color="#7f0055">if</font></strong>(time > 1000) {
<br> canvasInitialize(1024,1024);
<br> time = 0;
<br> }
<br>
<br> var fftData = <strong><font color="#7f0055">new</font></strong> Uint8Array(analyser.frequencyBinCount);
<br> analyser.getByteFrequencyData(fftData);
<br>
<br> var average = 0;
<br> var min = 200;
<br> var max = 50;
<br> <strong><font color="#7f0055">for</font></strong>(var freq=0; freq<fftData.length; freq++) {
<br> var sample = fftData[freq];
<br> canvasFillCoordinate(time, freq, sample);
<br> average = average + sample;
<br> }
<br> average = average/fftData.length;
<br> getLog().innerHTML = <font color="#2a00ff">'FFT Length:'</font>+fftData.length + <font color="#2a00ff">' Average:'</font> + average + <font color="#2a00ff">'\n<br>'</font>;
<br> };
<br>}
<br>
<br>function onError() {
<br> alert(<font color="#2a00ff">'Error'</font>);
<br>}
<br>
<br>function getLog() {
<br> <strong><font color="#7f0055">return</font></strong> document.getElementById(<font color="#2a00ff">'mylog'</font>);
<br>}
<br>
<br>function getCanvas() {
<br> <strong><font color="#7f0055">return</font></strong> document.getElementById(<font color="#2a00ff">'mycanvas'</font>);
<br>}
<br>
<br>function documentReady() {
<br> var dataObject = {video: <strong><font color="#7f0055">false</font></strong>, audio: <strong><font color="#7f0055">true</font></strong>}; <font color="#3f7f5f">// dataObject.video, dataObject.audio
</font><br> <strong><font color="#7f0055">if</font></strong>(navigator.getUserMedia) {
<br> navigator.getUserMedia(dataObject, onSuccess, onError);
<br> } <strong><font color="#7f0055">else</font></strong> <strong><font color="#7f0055">if</font></strong>(navigator.webkitGetUserMedia) {
<br> navigator.webkitGetUserMedia(dataObject, onSuccess, onError);
<br> }
<br>}
<br></script>
<br></head>
<br><body onload=<font color="#2a00ff">"documentReady();"</font>>
<br> <canvas id=<font color="#2a00ff">"mycanvas"</font>></canvas>
<br> <div id=<font color="#2a00ff">"mylog"</font>></div>
<br></body>
<br></html>
<br><div style="text-align:right;BORDER-TOP: #ccc 1px dashed"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div></div></div>
<br /><br />This post was reposted from <a href="https://scottizu.wordpress.com/2014/06/24/real-time-visualization-of-a-spectrogram/">scottizu.wordpress.com</a>, originally written on June 24th, 2014.
<br><br>
I was curious to see if this code still worked and how quickly I could get up and running with this after over a year. It turns out the code froze after drawing the spectrogram for a few seconds, after I started making chirping sounds to see the effect on the real time visualization. A good sign was that I was able to get up and running fairly quickly. I have updated the code and it seems to work better. Here's what I did.
<br><br>
To run the Tomcat 7.0 server, I right clicked the task bar, Task Manager, Services Tab, Hit the Services Button, found Apache Tomcat 7.0, selected it, clicked start (this all worked because I had previously installed Apache Tomcat on my machine).
<br><br>
To add the file, I created a new file, "spectrogram.html", edited the file to add the code above, then dropped it into the folder "C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT" which is Tomcat 7.0's root directory.
<br><br>
I opened Google Chrome and went to http://localhost:8080/spectrogram.html.
<br><br>
Related to <a href='http://sizustech.blogspot.com/2016/01/a-tutorial-for-real-time-pitch.html'>A Tutorial for Real Time Pitch Detection</a>.scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-31477980809706933762016-01-03T11:18:00.000-08:002016-01-03T11:19:30.006-08:00Eigenvalue Estimates and Sampling for Time-Frequency Localization OperatorsHere is a document that discusses the relationship between the fourier transform and the discrete fourier transform. This can be used to help improve methods for pitch detection: <a href="https://drive.google.com/file/d/0B9pC9EpixPYFWlBKaXVwNEdLT1E/view?usp=sharing">Eigenvalue Estimates and Sampling for Time-Frequency Localization Operators</a>
<br><br>
This document describes a pitch detection algorithm created for Tartini: <a href='http://www.cs.otago.ac.nz/tartini/papers/A_Smarter_Way_to_Find_Pitch.pdf'>A Smarter Way to Find Pitch</a>
<br><br>
Download Post Script Viewer: I think I used GPL Ghostscript (gs\gs9.05\bin\gswin32.exe) which will help create PDFs from LaTex.
<br><br>
Download MiKTeX: <a href='http://miktex.org/download'>miktex.org</a>
<br>Installer: <a href='http://mirrors.ctan.org/systems/win32/miktex/setup/basic-miktex-2.9.5105.exe'>mirrors.ctan.org</a>
<br>
Download TeXnic Center: <a href='http://www.texniccenter.org/'>www.texniccenter.org</a>
<br>
32-bit Installer: <a href='http://sourceforge.net/projects/texniccenter/files/TeXnicCenter/2.02%20Stable/TXCSetup_2.02Stable_Win32.exe/download'>sourceforge.net</a>
<br /><br />This post was reposted from <a href="https://scottizu.wordpress.com/2014/06/26/eigenvalue-estimates-and-sampling-for-time-frequency-localization-operators/"></a>, originally written on June 26th, 2014.
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-75819737241941476412016-01-03T11:11:00.000-08:002016-01-03T11:24:05.166-08:00A Tutorial for Real Time Pitch Detection with HTML5Over the past year, I have been working on analyzing music. Some notes will be posted here for future work and reference.
<br><br>
The first document, is in PDF format and is a tutorial for people to find their way into signal processing. It is meant to allow HTML5 coding to utilize Google Chrome for real time pitch detection.
<br><br>
Unfortunately, the work is incomplete. The last 3 pages (27-29) are just notes. I meant to include two additional proofs regarding the fact that the circular Auto Correlation function can be obtained by taking the Fourier Transform, taking the square root of its magnitude (also pointwise multiplication by the complex conjugate) and taking the inverse Fourier Transform. While this produces edge effects, one may also calculate the Auto Correlation function, which can be obtained by zero padding the signal and then taking the circular Auto Correlation function for the zero padded signal.
<br><br>
<a href="https://drive.google.com/file/d/0B9pC9EpixPYFUGpJRHRGeUNsNGs/view?usp=sharing">PitchDetection</a>
<br><br>
Also, an interesting look at the 50's Progression on the piano, and a short song I wrote which looks at various harmonies played above the bass progression.
<br><br>
<a href="https://drive.google.com/file/d/0B9pC9EpixPYFaDJZRmFXbkR2b0U/view?usp=sharing">My_Song</a>
<br><br>
Ideally, this work could morph into real time pitch and beat detection.
<br /><br />This post was reposted from <a href="https://scottizu.wordpress.com/2014/08/29/a-tutorial-for-real-time-pitch-detection-with-html5/">scottizu.wordpress.com</a>, originally written on August 29th, 2014.scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-10550802652694036792015-11-13T14:55:00.003-08:002015-11-13T14:56:13.880-08:00The Jira Auto FilerThis code uses the JIRA Rest API to gather information about issue types. It also builds curl commands as well as links for bug filing.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">import</span></strong> java.io.File;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.FileInputStream;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.FileOutputStream;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.InputStream;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.io.OutputStream;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.security.KeyStore;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.security.MessageDigest;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.security.cert.CertificateException;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.security.cert.X509Certificate;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.ArrayList;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.HashSet;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.List;
<br />
<strong><span style="color: #7f0055;">import</span></strong> java.util.Set;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.SSLContext;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.SSLException;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.SSLSocket;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.SSLSocketFactory;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.TrustManager;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.TrustManagerFactory;
<br />
<strong><span style="color: #7f0055;">import</span></strong> javax.net.ssl.X509TrustManager;
<br />
<span style="color: #3f7f5f;">//Include dependency in pom.xml file
</span><br />
<span style="color: #3f7f5f;">//<dependency>
</span><br />
<span style="color: #3f7f5f;">//<groupId>net.sourceforge.htmlunit</groupId>
</span><br />
<span style="color: #3f7f5f;">//<artifactId>htmlunit</artifactId>
</span><br />
<span style="color: #3f7f5f;">//<version>2.13</version>
</span><br />
<span style="color: #3f7f5f;">//</dependency>
</span><br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.commons.codec.binary.Base64;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.CloseableHttpResponse;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.HttpGet;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.impl.client.DefaultHttpClient;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.util.EntityUtils;
<br />
<span style="color: #3f7f5f;">//Include dependency in pom.xml file
</span><br />
<span style="color: #3f7f5f;">//<dependency>
</span><br />
<span style="color: #3f7f5f;">// <groupId>org.json</groupId>
</span><br />
<span style="color: #3f7f5f;">// <artifactId>json</artifactId>
</span><br />
<span style="color: #3f7f5f;">// <version>20080701</version>
</span><br />
<span style="color: #3f7f5f;">//</dependency>
</span><br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONArray;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONObject;
<br />
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> JiraAutoFiler {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> String JIRA_HOST = <span style="color: #2a00ff;">"jira.com"</span>;
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> String JIRA_USERNAME = <span style="color: #2a00ff;">"myusername"</span>;
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> String JIRA_PASSWORD = <span style="color: #2a00ff;">"password"</span>;
<br />
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> IssueTypeAttributes addJIRAIssueInformation(String projectKey, String issueTypeID) {
<br />
IssueTypeAttributes issueTypeAttributes = <strong><span style="color: #7f0055;">new</span></strong> IssueTypeAttributes();
<br />
issueTypeAttributes.projectKey = projectKey;
<br />
issueTypeAttributes.issueTypeID = issueTypeID;
<br />
<br />
<strong><span style="color: #7f0055;">try</span></strong> {
<br />
System.out.println(<span style="color: #2a00ff;">"Step 1a: Setup Authentication Information"</span>);
<br />
<br />
System.out.println(<span style="color: #2a00ff;">"Step 1b: Install SSL Certificate"</span>);
<br />
SSLHandler.setupSSLContextByInstallingCertification(JIRA_HOST);
<br />
<br />
System.out.println(<span style="color: #2a00ff;">"Step 2: Query Server for Projects"</span>);
<br />
HttpGet httpGet = <strong><span style="color: #7f0055;">new</span></strong> HttpGet(<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//"+JIRA_HOST+"/rest/api/2/issue/createmeta?projectKeys="+issueTypeAttributes.projectKey+"&issuetypeIds="+issueTypeAttributes.issueTypeID+"&expand=projects.issuetypes.fields");
</span><br /> String basic_auth = <strong><span style="color: #7f0055;">new</span></strong> String(Base64.encodeBase64((JIRA_USERNAME+<span style="color: #2a00ff;">":"</span>+JIRA_PASSWORD).getBytes())); <span style="color: #3f7f5f;">//
</span><br /> httpGet.addHeader(<span style="color: #2a00ff;">"Authorization"</span>, <span style="color: #2a00ff;">"Basic "</span> + basic_auth);
<br /> CloseableHttpResponse response = <strong><span style="color: #7f0055;">new</span></strong> DefaultHttpClient().execute(httpGet);
<br /> String projectResponsJSON = EntityUtils.toString(response.getEntity());
<br /> response.close();
<br /> System.out.println(<span style="color: #2a00ff;">"projectResponse:"</span>+projectResponsJSON);
<br />
<br /> JSONObject metaData = <strong><span style="color: #7f0055;">new</span></strong> JSONObject(projectResponsJSON);
<br /> JSONArray projects = metaData.getJSONArray(<span style="color: #2a00ff;">"projects"</span>);
<br /><span style="color: #3f7f5f;">// holder.errorMessages = holder.errorMessages + projects.toString();
</span><br /> JSONObject project = projects.getJSONObject(0);
<br /><span style="color: #3f7f5f;">// holder.errorMessages = holder.errorMessages + project.toString();
</span><br /> issueTypeAttributes.jiraProjectName = project.getString(<span style="color: #2a00ff;">"name"</span>);
<br /> issueTypeAttributes.jiraProjectID = project.getString(<span style="color: #2a00ff;">"id"</span>);
<br /> JSONArray issuetypes = project.getJSONArray(<span style="color: #2a00ff;">"issuetypes"</span>);
<br /> JSONObject issuetype = issuetypes.getJSONObject(0);
<br /> issueTypeAttributes.issueName = issuetype.getString(<span style="color: #2a00ff;">"name"</span>);
<br /> JSONObject fields = issuetype.getJSONObject(<span style="color: #2a00ff;">"fields"</span>);
<br />
<br /> <strong><span style="color: #7f0055;">for</span></strong>(String fieldName: JSONObject.getNames(fields)) {
<br /> JSONObject fieldJSON = fields.getJSONObject(fieldName);
<br /> IssueTypeFieldAttributes field = <strong><span style="color: #7f0055;">new</span></strong> IssueTypeFieldAttributes();
<br /> field.fieldName = fieldName;
<br /> field.fieldDisplayName = fieldJSON.getString(<span style="color: #2a00ff;">"name"</span>);
<br /> field.isRequired = fieldJSON.getBoolean(<span style="color: #2a00ff;">"required"</span>);
<br /> JSONObject schema = fieldJSON.getJSONObject(<span style="color: #2a00ff;">"schema"</span>);
<br /> field.type = schema.getString(<span style="color: #2a00ff;">"type"</span>);
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> JSONArray allowedValues = fieldJSON.getJSONArray(<span style="color: #2a00ff;">"allowedValues"</span>);
<br /> <strong><span style="color: #7f0055;">for</span></strong> (<strong><span style="color: #7f0055;">int</span></strong> i = 0; i < allowedValues.length(); i++) {
<br /> JSONObject allowedValueJSON = allowedValues.getJSONObject(i);
<br /> IssueTypeFieldAllowedValue allowedValue = <strong><span style="color: #7f0055;">new</span></strong> IssueTypeFieldAllowedValue();
<br /> allowedValue.valueID = allowedValueJSON.getString(<span style="color: #2a00ff;">"id"</span>);
<br /> allowedValue.valueName = allowedValueJSON.getString(<span style="color: #2a00ff;">"value"</span>);
<br /> field.allowedValues.add(allowedValue);
<br /> }
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {}
<br />
<br /> issueTypeAttributes.fields.add(field);
<br /> }
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">return</span></strong> issueTypeAttributes;
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">class</span></strong> IssueTypeAttributes{
<br /> <strong><span style="color: #7f0055;">public</span></strong> String projectKey;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String issueTypeID;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String jiraProjectName;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String jiraProjectID;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String issueName;
<br /> <strong><span style="color: #7f0055;">public</span></strong> List<IssueTypeFieldAttributes> fields = <strong><span style="color: #7f0055;">new</span></strong> ArrayList<IssueTypeFieldAttributes>();
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> String buildCURLCommand() {
<br /> String curlCommand = <span style="color: #2a00ff;">"curl -k -H \"</span>Content-Type: application/json\<span style="color: #2a00ff;">" -D- -X POST --data \'{\"</span>fields\<span style="color: #2a00ff;">": {"</span>;
<br /> curlCommand = curlCommand + <span style="color: #2a00ff;">"\"</span>project\<span style="color: #2a00ff;">":{\"</span>key\<span style="color: #2a00ff;">":\"</span><span style="color: #2a00ff;">"+projectKey+"</span>\<span style="color: #2a00ff;">"}, \"</span>issuetype\<span style="color: #2a00ff;">": {\"</span>id\<span style="color: #2a00ff;">":\"</span><span style="color: #2a00ff;">"+issueTypeID+"</span>\<span style="color: #2a00ff;">"}"</span>;
<br /> <strong><span style="color: #7f0055;">for</span></strong>(IssueTypeFieldAttributes field: fields) {
<br /> <strong><span style="color: #7f0055;">if</span></strong>(field.isRequired && (field.type.equals(<span style="color: #2a00ff;">"string"</span>) || field.type.equals(<span style="color: #2a00ff;">"array"</span>))) {
<br /> String defaultValue = <strong><span style="color: #7f0055;">null</span></strong>;
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> defaultValue = <span style="color: #2a00ff;">"{\"</span>id\<span style="color: #2a00ff;">":\"</span><span style="color: #2a00ff;">"+field.allowedValues.get(0).valueID+"</span>\<span style="color: #2a00ff;">"}"</span>;
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> defaultValue = <span style="color: #2a00ff;">"\"</span>Test\<span style="color: #2a00ff;">""</span>;
<br /> }
<br /> <strong><span style="color: #7f0055;">if</span></strong>(field.type.equals(<span style="color: #2a00ff;">"string"</span>)) {
<br /> curlCommand = curlCommand + <span style="color: #2a00ff;">", \"</span><span style="color: #2a00ff;">"+field.fieldName+"</span>\<span style="color: #2a00ff;">":"</span>+defaultValue;
<br /> } <strong><span style="color: #7f0055;">else</span></strong> <strong><span style="color: #7f0055;">if</span></strong> (field.type.equals(<span style="color: #2a00ff;">"array"</span>)) {
<br /> curlCommand = curlCommand + <span style="color: #2a00ff;">", \"</span><span style="color: #2a00ff;">"+field.fieldName+"</span>\<span style="color: #2a00ff;">":["</span>+defaultValue+<span style="color: #2a00ff;">"]"</span>;
<br /> }
<br /> }
<br /> }
<br /> curlCommand = curlCommand + <span style="color: #2a00ff;">"}}\' https:<span style="color: #3f7f5f;">//"+JIRA_HOST+"/rest/api/2/issue -u "+JIRA_USERNAME;
</span><br /> <strong><span style="color: #7f0055;">return</span></strong> curlCommand;
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> String buildJSPALink() {
<br /> String jspaLink = <span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//"+JIRA_HOST+"/secure/CreateIssueDetails!init.jspa?";
</span><br /> jspaLink = jspaLink + <span style="color: #2a00ff;">"pid="</span>+ jiraProjectID +<span style="color: #2a00ff;">"&issuetype="</span>+issueTypeID;
<br /> <strong><span style="color: #7f0055;">for</span></strong>(IssueTypeFieldAttributes field: fields) {
<br /> <strong><span style="color: #7f0055;">if</span></strong>(field.isRequired && (field.type.equals(<span style="color: #2a00ff;">"string"</span>) || field.type.equals(<span style="color: #2a00ff;">"array"</span>))) {
<br /> String defaultValueID = <strong><span style="color: #7f0055;">null</span></strong>;
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> defaultValueID = field.allowedValues.get(0).valueID;
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> defaultValueID = <span style="color: #2a00ff;">"Test"</span>;
<br /> }
<br /> jspaLink = jspaLink + <span style="color: #2a00ff;">"&"</span>+field.fieldName+<span style="color: #2a00ff;">"="</span>+defaultValueID;
<br /> }
<br /> }
<br /> <strong><span style="color: #7f0055;">return</span></strong> jspaLink;
<br /> }
<br /> }
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">class</span></strong> IssueTypeFieldAttributes{
<br /> <strong><span style="color: #7f0055;">public</span></strong> String fieldName;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String fieldDisplayName;
<br /> <strong><span style="color: #7f0055;">public</span></strong> Boolean isRequired;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String type;
<br /> <strong><span style="color: #7f0055;">public</span></strong> List<IssueTypeFieldAllowedValue> allowedValues = <strong><span style="color: #7f0055;">new</span></strong> ArrayList<IssueTypeFieldAllowedValue>();
<br /> }
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">class</span></strong> IssueTypeFieldAllowedValue{
<br /> <strong><span style="color: #7f0055;">public</span></strong> String valueID;
<br /> <strong><span style="color: #7f0055;">public</span></strong> String valueName;
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">class</span></strong> SSLHandler{
<br />
<br /> <span style="color: #2040a0;">/**
<br /> * Should be called right before connection
<br /> *
<br /> * Installs C:\Program Files\Java\jdk1.7.0_51\jre\lib\security\jssecacerts file
<br /> * <strong>@param</strong> host
<br /> * <strong>@throws</strong> Exception
<br /> */</span>
<br /> <strong><span style="color: #7f0055;">static</span></strong> Set<String> hostsInstalled = <strong><span style="color: #7f0055;">new</span></strong> HashSet<String>();
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> setupSSLContextByInstallingCertification(String host) {
<br /> <strong><span style="color: #7f0055;">if</span></strong>(hostsInstalled.contains(host)) {
<br /> <strong><span style="color: #7f0055;">return</span></strong>;
<br /> } <strong><span style="color: #7f0055;">else</span></strong> {
<br /> hostsInstalled.add(host);
<br /> }
<br /> System.out.println(<span style="color: #2a00ff;">"Installing SSLContext Certification into Java Home..."</span>);
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> <strong><span style="color: #7f0055;">int</span></strong> port = 443;
<br /> <strong><span style="color: #7f0055;">char</span></strong>[] passphrase = <span style="color: #2a00ff;">"changeit"</span>.toCharArray();
<br />
<br /> <strong><span style="color: #7f0055;">char</span></strong> SEP = File.separatorChar;
<br /> File file = <strong><span style="color: #7f0055;">new</span></strong> File(<span style="color: #2a00ff;">"jssecacerts"</span>);
<br /> <strong><span style="color: #7f0055;">if</span></strong> (file.isFile() == <strong><span style="color: #7f0055;">false</span></strong>) {
<br /> File dir = <strong><span style="color: #7f0055;">new</span></strong> File(System.getProperty(<span style="color: #2a00ff;">"java.home"</span>) + SEP
<br /> + <span style="color: #2a00ff;">"lib"</span> + SEP + <span style="color: #2a00ff;">"security"</span>);
<br /> file = <strong><span style="color: #7f0055;">new</span></strong> File(dir, <span style="color: #2a00ff;">"jssecacerts"</span>);
<br /> <strong><span style="color: #7f0055;">if</span></strong> (file.isFile() == <strong><span style="color: #7f0055;">false</span></strong>) {
<br /> file = <strong><span style="color: #7f0055;">new</span></strong> File(dir, <span style="color: #2a00ff;">"cacerts"</span>);
<br /> }
<br /> }
<br />
<br /> System.out.println(<span style="color: #2a00ff;">"Loading KeyStore "</span> + file + <span style="color: #2a00ff;">"..."</span>);
<br /> InputStream in = <strong><span style="color: #7f0055;">new</span></strong> FileInputStream(file);
<br /> KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
<br /> ks.load(in, passphrase);
<br /> in.close();
<br />
<br /> TrustManagerFactory tmf =
<br /> TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
<br /> tmf.init(ks);
<br /> <strong><span style="color: #7f0055;">final</span></strong> X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
<br /> <strong><span style="color: #7f0055;">final</span></strong> List<X509Certificate> chainList = <strong><span style="color: #7f0055;">new</span></strong> ArrayList<X509Certificate>();
<br />
<br /> TrustManager tm = <strong><span style="color: #7f0055;">new</span></strong> X509TrustManager() {
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">void</span></strong> checkClientTrusted(X509Certificate[] arg0, String arg1)
<br /> <strong><span style="color: #7f0055;">throws</span></strong> CertificateException { }
<br /> <strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">void</span></strong> checkServerTrusted(X509Certificate[] arg0, String arg1)
<br /> <strong><span style="color: #7f0055;">throws</span></strong> CertificateException {
<br /> chainList.clear();
<br /> <strong><span style="color: #7f0055;">if</span></strong>(arg0 != <strong><span style="color: #7f0055;">null</span></strong>) {
<br /> <strong><span style="color: #7f0055;">for</span></strong> (<strong><span style="color: #7f0055;">int</span></strong> i = 0; i < arg0.length; i++) {
<br /> chainList.add(arg0[i]);
<br /> }
<br /> }
<br /> defaultTrustManager.checkServerTrusted(arg0, arg1); }
<br /> <strong><span style="color: #7f0055;">public</span></strong> X509Certificate[] getAcceptedIssuers() { <strong><span style="color: #7f0055;">return</span></strong> <strong><span style="color: #7f0055;">null</span></strong>; }
<br /> };
<br />
<br /> SSLContext context = SSLContext.getInstance(<span style="color: #2a00ff;">"TLS"</span>);
<br /> context.init(<strong><span style="color: #7f0055;">null</span></strong>, <strong><span style="color: #7f0055;">new</span></strong> TrustManager[]{tm}, <strong><span style="color: #7f0055;">null</span></strong>);
<br /> SSLSocketFactory factory = context.getSocketFactory();
<br />
<br /> System.out.println(<span style="color: #2a00ff;">"Opening connection to "</span> + host + <span style="color: #2a00ff;">":"</span> + port + <span style="color: #2a00ff;">"..."</span>);
<br /> SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
<br /> socket.setSoTimeout(10000);
<br /> <strong><span style="color: #7f0055;">try</span></strong> {
<br /> socket.startHandshake();
<br /> System.out.println(<span style="color: #2a00ff;">"No errors, certificate is already trusted"</span>);
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (SSLException e) { }
<br /> socket.close();
<br />
<br /> <strong><span style="color: #7f0055;">if</span></strong> (chainList.isEmpty()) {
<br /> System.out.println(<span style="color: #2a00ff;">"Could not obtain server certificate chain"</span>);
<br /> <strong><span style="color: #7f0055;">return</span></strong>;
<br /> }
<br />
<br /> System.out.println(<span style="color: #2a00ff;">"Server sent "</span> + chainList.size() + <span style="color: #2a00ff;">" certificate(s):"</span>);
<br />
<br /> MessageDigest sha1 = MessageDigest.getInstance(<span style="color: #2a00ff;">"SHA1"</span>);
<br /> MessageDigest md5 = MessageDigest.getInstance(<span style="color: #2a00ff;">"MD5"</span>);
<br /> <strong><span style="color: #7f0055;">for</span></strong> (<strong><span style="color: #7f0055;">int</span></strong> i = 0; i < chainList.size(); i++) {
<br /> X509Certificate cert = chainList.get(i);
<br /> System.out.println
<br /> (<span style="color: #2a00ff;">" "</span> + (i + 1) + <span style="color: #2a00ff;">" Subject "</span> + cert.getSubjectDN());
<br /> System.out.println(<span style="color: #2a00ff;">" Issuer "</span> + cert.getIssuerDN());
<br /> sha1.update(cert.getEncoded());
<br /> System.out.println(<span style="color: #2a00ff;">" sha1 "</span> + toHexString(sha1.digest()));
<br /> md5.update(cert.getEncoded());
<br /> System.out.println(<span style="color: #2a00ff;">" md5 "</span> + toHexString(md5.digest()));
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">int</span></strong> k = 0;
<br /> X509Certificate cert = chainList.get(k);
<br /> String alias = host + <span style="color: #2a00ff;">"-"</span> + (k + 1);
<br /> ks.setCertificateEntry(alias, cert);
<br />
<br /> File dir = <strong><span style="color: #7f0055;">new</span></strong> File(System.getProperty(<span style="color: #2a00ff;">"java.home"</span>) + SEP
<br /> + <span style="color: #2a00ff;">"lib"</span> + SEP + <span style="color: #2a00ff;">"security"</span>);
<br /> file = <strong><span style="color: #7f0055;">new</span></strong> File(dir, <span style="color: #2a00ff;">"jssecacerts"</span>);
<br /> OutputStream out = <strong><span style="color: #7f0055;">new</span></strong> FileOutputStream(file);
<br /> ks.store(out, passphrase);
<br /> out.close();
<br />
<br /> System.out.println(<span style="color: #2a00ff;">"Installed SSLContext Certification into Java Home: "</span>+file.getAbsolutePath());
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) { }
<br /> }
<br />
<br /> <strong><span style="color: #7f0055;">private</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">final</span></strong> <strong><span style="color: #7f0055;">char</span></strong>[] HEXDIGITS = <span style="color: #2a00ff;">"0123456789abcdef"</span>.toCharArray();
<br />
<br /> <strong><span style="color: #7f0055;">private</span></strong> <strong><span style="color: #7f0055;">static</span></strong> String toHexString(<strong><span style="color: #7f0055;">byte</span></strong>[] bytes) {
<br /> StringBuilder sb = <strong><span style="color: #7f0055;">new</span></strong> StringBuilder(bytes.length * 3);
<br /> <strong><span style="color: #7f0055;">for</span></strong> (<strong><span style="color: #7f0055;">int</span></strong> b : bytes) {
<br /> b &= 0xff;
<br /> sb.append(HEXDIGITS[b >> 4]);
<br /> sb.append(HEXDIGITS[b & 15]);
<br /> sb.append(<span style="color: #2a00ff;">' '</span>);
<br /> }
<br /> <strong><span style="color: #7f0055;">return</span></strong> sb.toString();
<br /> }
<br /> }
<br />}</span></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-71496537292313132862015-11-05T11:16:00.001-08:002015-11-19T07:54:56.339-08:00Calculating Loan Amortization with Monthly Compounding and Quarterly PaymentsSay you have a loan for $100,000 and the interest rate is 17.7802%. Payments are made quarterly in the amount of $10,500. Here would be your payment schedule.<br />
<br />
<pre>
</pre>
month:0 before interest balance:100000<br />
month:0 after interest balance:101481.68333333333 interest:1481.6833333333332<br />
month:1 before interest balance:101481.68333333333<br />
month:1 after interest balance:102985.32052166945 interest:1503.637188336111<br />
month:2 before interest balance:102985.32052166945<br />
month:2 after interest balance:104511.23685161893 interest:1525.9163299494892<br />
month:2 after payment balance:94011.23685161893 payment:10500<br />
month:3 before interest balance:94011.23685161893<br />
month:3 after interest balance:95404.18567950989 interest:1392.9488278909623<br />
month:4 before interest balance:95404.18567950989<br />
month:4 after interest balance:96817.77359802557 interest:1413.5879185156846<br />
month:5 before interest balance:96817.77359802557<br />
month:5 after interest balance:98252.30641313191 interest:1434.532815106345<br />
month:5 after payment balance:87752.30641313191 payment:10500<br />
month:6 before interest balance:87752.30641313191<br />
month:6 after interest balance:89052.51771187088 interest:1300.2112987389733<br />
month:7 before interest balance:89052.51771187088<br />
month:7 after interest balance:90371.99402472138 interest:1319.4763128505053<br />
month:8 before interest balance:90371.99402472138<br />
month:8 after interest balance:91711.02079818667 interest:1339.0267734652925<br />
month:8 after payment balance:81211.02079818667 payment:10500<br />
month:9 before interest balance:81211.02079818667<br />
month:9 after interest balance:82414.31095818327 interest:1203.2901599965987<br />
month:10 before interest balance:82414.31095818327<br />
month:10 after interest balance:83635.43006793218 interest:1221.1191097489084<br />
month:11 before interest balance:83635.43006793218<br />
month:11 after interest balance:84874.64229601038 interest:1239.2122280782062<br />
month:11 after payment balance:74374.64229601038 payment:10500<br />
month:12 before interest balance:74374.64229601038<br />
month:12 after interest balance:75476.63897513665 interest:1101.9966791262698<br />
month:13 before interest balance:75476.63897513665<br />
month:13 after interest balance:76594.96375539142 interest:1118.3247802547705<br />
month:14 before interest balance:76594.96375539142<br />
month:14 after interest balance:77729.85856752776 interest:1134.8948121363421<br />
month:14 after payment balance:67229.85856752776 payment:10500<br />
month:15 before interest balance:67229.85856752776<br />
month:15 after interest balance:68225.99217694638 interest:996.1336094186308<br />
month:16 before interest balance:68225.99217694638<br />
month:16 after interest balance:69236.8853320335 interest:1010.8931550871183<br />
month:17 before interest balance:69236.8853320335<br />
month:17 after interest balance:70262.75672251736 interest:1025.8713904838517<br />
month:17 after payment balance:59762.756722517355 payment:10500<br />
month:18 before interest balance:59762.756722517355<br />
month:18 after interest balance:60648.25152841544 interest:885.4948058980858<br />
month:19 before interest balance:60648.25152841544<br />
month:19 after interest balance:61546.86656327005 interest:898.6150348546101<br />
month:20 before interest balance:61546.86656327005<br />
month:20 after interest balance:62458.79622732693 interest:911.9296640568783<br />
month:20 after payment balance:51958.79622732693 payment:10500<br />
month:21 before interest balance:51958.79622732693<br />
month:21 after interest balance:52728.661051227864 interest:769.8648239009318<br />
month:22 before interest balance:52728.661051227864<br />
month:22 after interest balance:53509.93283391373 interest:781.271782685868<br />
month:23 before interest balance:53509.93283391373<br />
month:23 after interest balance:54302.78059039169 interest:792.8477564779606<br />
month:23 after payment balance:43802.78059039169 payment:10500<br />
month:24 before interest balance:43802.78059039169<br />
month:24 after interest balance:44451.79908993609 interest:649.0184995444018<br />
month:25 before interest balance:44451.79908993609<br />
month:25 after interest balance:45110.43398841849 interest:658.6348984824014<br />
month:26 before interest balance:45110.43398841849<br />
month:26 after interest balance:45778.82777041922 interest:668.3937820007319<br />
month:26 after payment balance:35278.82777041922 payment:10500<br />
month:27 before interest balance:35278.82777041922<br />
month:27 after interest balance:35801.5482816889 interest:522.7205112696732<br />
month:28 before interest balance:35801.5482816889<br />
month:28 after interest balance:36332.01385565397 interest:530.4655739650708<br />
month:29 before interest balance:36332.01385565397<br />
month:29 after interest balance:36870.33924961755 interest:538.3253939635822<br />
month:29 after payment balance:26370.33924961755 payment:10500<br />
month:30 before interest balance:26370.33924961755<br />
month:30 after interest balance:26761.06417122259 interest:390.72492160504163<br />
month:31 before interest balance:26761.06417122259<br />
month:31 after interest balance:27157.578398870235 interest:396.5142276476433<br />
month:32 before interest balance:27157.578398870235<br />
month:32 after interest balance:27559.96771174323 interest:402.38931287299374<br />
month:32 after payment balance:17059.96771174323 payment:10500<br />
month:33 before interest balance:17059.96771174323<br />
month:33 after interest balance:17312.742410000177 interest:252.77469825694746<br />
month:34 before interest balance:17312.742410000177<br />
month:34 after interest balance:17569.26242883208 interest:256.5200188319043<br />
month:35 before interest balance:17569.26242883208<br />
month:35 after interest balance:17829.58326202968 interest:260.3208331976001<br />
month:35 after payment balance:7329.583262029679 payment:10500<br />
<br />
Here is the algorithm used to calculate this:<br />
<br />
<br />
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<html>
<br />
<body>
<br />
<pre>
<br />
<script>
<br />
<strong><span style="color: #7f0055;">function</span></strong> log(arg) {
<br />
document.body.innerHTML = document.body.innerHTML + arg + <span style="color: #2a00ff;">'\n<br>'</span>;
<br />
}
<br />
<strong><span style="color: #7f0055;">function</span></strong> <strong><span style="color: #7f0055;">clear</span></strong>() {
<br />
document.body.innerHTML = <span style="color: #2a00ff;">''</span>;
<br />
}
<br />
<br />
var rate = .177802;
<br />
var balance = 100000;
<br />
var payment = 10500;
<br />
<br />
<strong><span style="color: #7f0055;">for</span></strong>(var i=0; i<12; i++){
<br />
<strong><span style="color: #7f0055;">for</span></strong>(var j=0; j<3; j++) {
<br />
log(<span style="color: #2a00ff;">'month:'</span>+(i*3+j)+<span style="color: #2a00ff;">' before interest balance:'</span>+balance);
<br />
var interest = balance*rate/12;
<br />
balance = balance + interest;
<br />
log(<span style="color: #2a00ff;">'month:'</span>+(i*3+j)+<span style="color: #2a00ff;">' after interest balance:'</span>+balance+' <span style="font-size: 10pt;">interest:' + interest);</span><br />
<br />
<strong><span style="color: #7f0055;">if</span></strong>(j == 2) {
<br />
balance = balance - payment;
<br />
log(<span style="color: #2a00ff;">'month:'</span>+(i*3+j)+<span style="color: #2a00ff;">' after payment balance:'</span>+balance<span style="font-size: 10pt;">+</span><span style="color: #2a00ff;">' payment:'</span><span style="font-size: 10pt;"> + payment);</span><br />
}
<br />
}
<br />
}
<br />
<br />
</script>
<br />
</pre>
<br />
</body>
<br />
</html><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com4tag:blogger.com,1999:blog-3320849621289075761.post-35662185619171161812015-10-09T18:09:00.002-07:002015-10-09T18:09:19.503-07:00Making Sense of Sonar Qube Stats like Unit Test Coverage, Line Coverage and Condition Coverage<div>
<br /></div>
In Sonar Cube, the equations for "Coverage", "Line Coverage" and "Condition Coverage" are given as:<br />
<br />
<b>"Coverage"</b><br />
coverage = ( (conditions_to_cover - uncovered_conditions) + (lines_to_cover - uncovered_lines) ) / ( conditions_to_cover + lines_to_cover )<br />
<br />
<b>"Line Coverage"</b><br />
line_coverage = (lines_to_cover - uncovered_lines) / (lines_to_cover)<br />
<br />
<b>"Condition Coverage"</b><br />
branch_coverage = (conditions_to_cover - uncovered_conditions) / (conditions_to_cover)<br />
<br />
These equations are written using the metric values, so that you can query sonar to get the values for a given project. References include <a href="http://docs.sonarqube.org/display/SONAR/Metric+definitions">docs.sonarqube.org</a> and <a href="http://www.slideshare.net/keheliya/sonar-metrics">www.slideshare.net</a>.<br />
<br />
<b>AKA</b><br />
Several of these terms have synonyms, so keep in mind:<br />
<ul>
<li>2B = conditions_to_cover</li>
<li>CT + CF = conditions_to_cover - uncovered_conditions</li>
<li>Condition Coverage = Branch Coverage</li>
<li>Condition Coverage = (CT + CF) / (2*B)</li>
<li>Coverage = (CT + CF + LC) / (2*B + EL)</li>
<li>Line Coverage = LC /EL</li>
</ul>
<div>
The 7 parameters above all have to do with Unit Test Coverage. The 7 parameters for Integration Test Coverage and Overall Test Coverage are listed here.</div>
<div>
<br /></div>
<div>
<b>"Unit Test Coverage"</b></div>
<div>
<ul>
<li>conditions_to_cover</li>
<li>uncovered_conditions</li>
<li>lines_to_cover</li>
<li>uncovered_lines</li>
<li>coverage</li>
<li>line_coverage</li>
<li>branch_coverage</li>
</ul>
</div>
<div>
<b>"Integration Test Coverage"</b></div>
<div>
<ul>
<li>it_conditions_to_cover</li>
<li>it_uncovered_conditions</li>
<li>it_lines_to_cover</li>
<li>it_uncovered_lines</li>
<li>it_coverage</li>
<li>it_line_coverage</li>
<li>it_branch_coverage</li>
</ul>
</div>
<div>
<b>"Overall Test Coverage"</b></div>
<div>
<ul>
<li>overall_conditions_to_cover</li>
<li>overall_uncovered_conditions</li>
<li>overall_lines_to_cover</li>
<li>overall_uncovered_lines</li>
<li>overall_coverage</li>
<li>overall_line_coverage</li>
<li>overall_branch_coverage</li>
</ul>
<div>
<b>Use Drilldown HTML Page</b><br />
You can use the drilldown to find values for these specific metrics. Just substitute your sonar domain (replace my.sonar.com) and project key (replace My-Project-Name) and the metric you are interested in (replace line_coverage).<br />
<b><br /></b></div>
</div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
http:<span style="color: #3f7f5f;">//my.sonar.com/drilldown/measures/My-Project-Name?metric=line_coverage </span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<div>
<b><br /></b>
<b>Query using Sonar REST API</b></div>
The format for the query is:
<br />
<div>
<br /></div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
http:<span style="color: #3f7f5f;">//{sonarDomain}/api/resources?resource={keyOrID}&metrics={metrics}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<div>
<br /></div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
http:<span style="color: #3f7f5f;">//my.sonar.com/api/resources?resource=55555&metrics=ncloc,conditions_to_cover,uncovered_conditions,lines_to_cover,uncovered_lines,coverage,line_coverage,branch_coverage,it_conditions_to_cover,it_uncovered_conditions,it_lines_to_cover,it_uncovered_lines,it_coverage,it_line_coverage,it_branch_coverage,overall_conditions_to_cover,overall_uncovered_conditions,overall_lines_to_cover,overall_uncovered_lines,overall_coverage,overall_line_coverage,overall_branch_coverage</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
<b>Combining Projects</b><br />
One nice thing about using these variables, rather than using the percentages is that you can combine any number of projects and re-calculate coverage. For instance, if you have 3 projects and you would like to calculate "Unit Test Coverage", you could use an equation like the following to sum the projects values to get a total.<br />
<br />
<ul>
<li><span style="color: orange;">conditions_to_cover_total </span>= <span style="color: blue;">conditions_to_cover_1 </span>+ <span style="color: #9fc5e8;">conditions_to_cover_2 </span>+ <span style="color: #3d85c6;">conditions_to_cover_3</span></li>
<li><span style="color: orange;">uncovered_conditions_total </span>= <span style="color: blue;">uncovered_conditions_1 </span>+ <span style="color: #9fc5e8;">uncovered_conditions_2 </span>+ <span style="color: #3d85c6;">uncovered_conditions_3</span></li>
<li><span style="color: orange;">lines_to_cover_total </span>= <span style="color: blue;">lines_to_cover_1 </span>+ <span style="color: #9fc5e8;">lines_to_cover_2 </span>+ <span style="color: #3d85c6;">lines_to_cover_3</span></li>
<li><span style="color: orange;">uncovered_lines_total </span>= <span style="color: blue;">uncovered_lines_1 </span>+ <span style="color: #9fc5e8;">uncovered_lines_2 </span>+ <span style="color: #3d85c6;">uncovered_lines_3</span></li>
</ul>
<div>
Then, you can use the formula to calculate an overall coverage:</div>
<ul>
<li><span style="color: orange;">coverage_total </span>= ( (<span style="color: orange;">conditions_to_cover_total </span>- <span style="color: orange;">uncovered_conditions_total</span>) + (<span style="color: orange;">lines_to_cover_total </span>- <span style="color: orange;">uncovered_lines_total</span>) ) / ( <span style="color: orange;">conditions_to_cover_total </span>+ <span style="color: orange;">lines_to_cover_total </span>)</li>
</ul>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com2tag:blogger.com,1999:blog-3320849621289075761.post-46781835473373669442015-08-07T13:26:00.000-07:002015-08-07T13:26:24.467-07:00Google API Uploading FilesSee also http://www.sizustech.blogspot.com/2015/08/getting-started-with-google-drive-api.html on how to generate Auth Tokens. You will need that for this next section as Auth Tokens will be referenced using ${AuthToken}<br />
<h2>
Upload Dummy File (curl)</h2>
Open Git Bash and execute the following command after replacing the Auth Token
<br />
<div>
<br /></div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Content-Type: plain/text"</span> -H <span style="color: #2a00ff;">"Authorization: Bearer ${AuthToken}"</span> -D- -X POST --data <span style="color: #2a00ff;">"Test adding this content into a new file"</span> https://www.googleapis.com/upload/drive/v2/files?uploadType=media > testUploadResponse.txt<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
For example, the command might look like this...
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Content-Type: plain/text"</span> -H <span style="color: #2a00ff;">"Authorization: Bearer ya29.yAFLSqN1xaR9EKuMrcJu6iLMt9PyaRqotTK01PbaPjd7gZZMtqE9XgFgHz3A5IEwKV7-"</span> -D- -X POST --data <span style="color: #2a00ff;">"Test adding this content into a new file"</span> https://www.googleapis.com/upload/drive/v2/files?uploadType=media > testUploadResponse.txt<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
Go to http://www.google.com/drive under the account for which the Auth Token was created and search for a file Untitled. If you open this file in a text editor like Notepad, you will see the contents inside the file as "Test adding this content into a new file"
<br />
<h2>
Upload Dummy File (Java)</h2>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.CloseableHttpResponse;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.HttpPost;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.impl.client.DefaultHttpClient;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.util.EntityUtils;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.entity.StringEntity;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONObject;
<br />
<br />
<span style="color: #3f7f5f;">// Step 2 - UPLOAD THE FIRST FILE
</span><br />
<span style="color: #3f7f5f;">// curl -k -H "Content-Type: plain/text" -H "Authorization: Bearer ya29.yAFLSqN1xaR9EKuMrcJu6iLMt9PyaRqotTK01PbaPjd7gZZMtqE9XgFgHz3A5IEwKV7-" -D- -X POST --data "Test adding this content into a new file" https://www.googleapis.com/upload/drive/v2/files?uploadType=media > testUploadResponse.txt
</span><br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> UploadTheFirstFile {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<strong><span style="color: #7f0055;">try</span></strong> {
<br />
String token = <span style="color: #2a00ff;">"ya29.yAFLSqN1xaR9EKuMrcJu6iLMt9PyaRqotTK01PbaPjd7gZZMtqE9XgFgHz3A5IEwKV7-"</span>;
<br />
HttpPost httpPost = <strong><span style="color: #7f0055;">new</span></strong> HttpPost(<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//www.googleapis.com/upload/drive/v2/files?uploadType=media");
</span><br /> httpPost.addHeader(<span style="color: #2a00ff;">"Authorization"</span>, <span style="color: #2a00ff;">"Bearer "</span>+token);
<br /> httpPost.addHeader(<span style="color: #2a00ff;">"Content-Type"</span>, <span style="color: #2a00ff;">"plain/text"</span>);
<br />
<br /> StringEntity entity = <strong><span style="color: #7f0055;">new</span></strong> StringEntity(<span style="color: #2a00ff;">"Test adding this content into a new file"</span>);
<br /> httpPost.setEntity(entity);
<br />
<br /> CloseableHttpResponse response = <strong><span style="color: #7f0055;">new</span></strong> DefaultHttpClient().execute(httpPost);
<br /> String jsonResponse = EntityUtils.toString(response.getEntity());
<br /> response.close();
<br /> System.out.println(<span style="color: #2a00ff;">"jsonResponse:"</span>+jsonResponse);
<br />
<br /> JSONObject jsonObject = <strong><span style="color: #7f0055;">new</span></strong> JSONObject(jsonResponse);
<br /> String id = jsonObject.getString(<span style="color: #2a00ff;">"id"</span>);
<br /> System.out.println(<span style="color: #2a00ff;">"Created resource... ID: "</span>+id);
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> }
<br /> }
<br />}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
<br />
<h2>
Create a Folder for your Uploads (curl)</h2>
You can parse the JSON response to find the id for an existing folder. However, for this example, we will create a folder for storage call "My Upload Folder".<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer {<span style="color: brown;">$AuthToken</span>}"</span> -H <span style="color: #2a00ff;">"Content-Type:application/json"</span> --data <span style="color: #2a00ff;">'{"title":"My Upload Folder","mimeType":"application/vnd.google-apps.folder"}'</span> https://www.googleapis.com/drive/v2/files > folderResponse.txt<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
The JSON response will contain the folder id, title and mimeType. You can look in the folderResponse.txt file for these.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
{ ... <span style="color: #2a00ff;">"id"</span>: <span style="color: #2a00ff;">"0B9pC9EpixPYFNk9WMWtmT1duQUk"</span> ... <span style="color: #2a00ff;">"title"</span>: <span style="color: #2a00ff;">"My Upload Folder"</span> ... <span style="color: #2a00ff;">"mimeType"</span>: <span style="color: #2a00ff;">"application/vnd.google-apps.folder"</span> ... }</div>
<br />
Note: We will use this folder ID in this blog post as {$folderID}.<br />
<h2>
Create a Folder for your Uploads (Java)</h2>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.CloseableHttpResponse;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.HttpPost;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.impl.client.DefaultHttpClient;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.util.EntityUtils;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.entity.StringEntity;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONObject;
<br />
<br />
<span style="color: #3f7f5f;">// curl -k -H "Authorization: Bearer {$AuthToken}" -H "Content-Type:application/json" --data '{"title":"My Upload Folder","mimeType":"application/vnd.google-apps.folder"}' https://www.googleapis.com/drive/v2/files > folderResponse.txt
</span><br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> CreateTheFirstFolder {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<strong><span style="color: #7f0055;">try</span></strong> {
<br />
String token = <span style="color: #2a00ff;">"ya29.yAGZ79jCXHvo8jSGOIBgT3Rxbk6Ot1ca1kh6zF_qfpwbnlDF4gdwbN-KCJR0hKxBXo81"</span>;
<br />
HttpPost httpPost = <strong><span style="color: #7f0055;">new</span></strong> HttpPost(<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//www.googleapis.com/drive/v2/files");
</span><br /> httpPost.addHeader(<span style="color: #2a00ff;">"Authorization"</span>, <span style="color: #2a00ff;">"Bearer "</span>+token);
<br /> httpPost.addHeader(<span style="color: #2a00ff;">"Content-Type"</span>, <span style="color: #2a00ff;">"application/json"</span>);
<br />
<br /> JSONObject json = <strong><span style="color: #7f0055;">new</span></strong> JSONObject();
<br /> json.put(<span style="color: #2a00ff;">"title"</span>, <span style="color: #2a00ff;">"My Upload Folder"</span>);
<br /> json.put(<span style="color: #2a00ff;">"mimeType"</span>, <span style="color: #2a00ff;">"application/vnd.google-apps.folder"</span>);
<br />
<br /> StringEntity entity = <strong><span style="color: #7f0055;">new</span></strong> StringEntity(json.toString());
<br /> httpPost.setEntity(entity);
<br />
<br /> CloseableHttpResponse response = <strong><span style="color: #7f0055;">new</span></strong> DefaultHttpClient().execute(httpPost);
<br /> String jsonResponse = EntityUtils.toString(response.getEntity());
<br /> response.close();
<br /> System.out.println(<span style="color: #2a00ff;">"jsonResponse:"</span>+jsonResponse);
<br />
<br /> JSONObject jsonObject = <strong><span style="color: #7f0055;">new</span></strong> JSONObject(jsonResponse);
<br /> String id = jsonObject.getString(<span style="color: #2a00ff;">"id"</span>);
<br /> System.out.println(<span style="color: #2a00ff;">"Created resource... ID: "</span>+id);
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> }
<br /> }
<br />}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
<br />
The output was
<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
Created resource... ID: 0B9pC9EpixPYFNk9WMWtmT1duQUk</div>
<h2>
<span style="font-size: small; font-weight: normal;">Note: We will use this folder ID in this blog post as {$folderID}.</span></h2>
<h2>
Upload a Text File (curl)</h2>
Now, we will add a title, provide the folder using the parent key and provide the content in a single curl command. This will require creating a multi part request.<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ${AuthToken}"</span> -H <span style="color: #2a00ff;">'Content-Type: multipart/form-data; boundary="foo_bar_baz"'</span> --data <span style="color: brown;">$<span style="color: #2a00ff;">'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{"title": "My File.txt","parents":[{"kind":"driv<span style="color: #3f7f5f;">e#fileLink","id":"${folderID}"}]}\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r\nThis is in the file\r\n--foo_bar_baz--' https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart</span></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: brown;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ya29.yAG2xVUntrdwwY9DnwiWeRme6A6unAMDr1uiouTekpV5ee6LS9UnM9iISB-GGNJGZK7b"</span> -H <span style="color: #2a00ff;">'Content-Type: multipart/form-data; boundary="foo_bar_baz"'</span> --data <span style="color: brown;">$<span style="color: #2a00ff;">'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{"title": "My File.txt","parents":[{"kind":"driv<span style="color: #3f7f5f;">e#fileLink","id":"0B9pC9EpixPYFNk9WMWtmT1duQUk"}]}\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r\nThis is in the file\r\n--foo_bar_baz--' https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart</span></span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: brown;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
<br />
The boundaries of the multi parts are marked with --foo_bar_baz and the spaces "\r\n" have to be exactly as is otherwise you will get an error "Missing end boundary in multi part body". You also have to use the $ character to make sure these are processed as expected.<br />
<h3>
Upload a Text File (curl) - Stitching Together a Multipart Request</h3>
<div>
This is example is used to give an easy example of stitching together a mutli part form. This is useful for stitching together files. Note that the cat command in linux will prepend a "\n", so if you look closely, one of the "\n" characters is removed.</div>
<div>
<br /></div>
<div>
Below, you will have to add replace the ${AuthToken} and the ${folderID}.</div>
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
touch txtDataFile.txt
<br />
<br />
echo $<span style="color: #2a00ff;">'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{<span style="color: #2a00ff;">"title"</span>: <span style="color: #2a00ff;">"My File.txt"</span>,<span style="color: #2a00ff;">"parents"</span>:[{<span style="color: #2a00ff;">"kind"</span>:<span style="color: #2a00ff;">"drive#fileLink"</span>,<span style="color: #2a00ff;">"id"</span>:<span style="color: #2a00ff;">"${folderID}"</span>}]}\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r'</span> >> txtDataFile.txt
<br />
<br />
cat TestUpload.txt >> txtDataFile.txt
<br />
<br />
echo $<span style="color: #2a00ff;">'\r\n--foo_bar_baz--'</span> >> txtDataFile.txt
<br />
<br />
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ${AuthToken}"</span> -H <span style="color: #2a00ff;">'Content-Type: multipart/form-data; boundary=<span style="color: #2a00ff;">"foo_bar_baz"</span>'</span> --data-binary <span style="color: #2a00ff;">"@txtDataFile.txt"</span> https:<span style="color: #3f7f5f;">//www.googleapis.com/upload/drive/v2/files?uploadType=multipart</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
For example...<br />
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
touch txtDataFile.txt
<br />
<br />
echo $<span style="color: #2a00ff;">'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{<span style="color: #2a00ff;">"title"</span>: <span style="color: #2a00ff;">"My File.txt"</span>,<span style="color: #2a00ff;">"parents"</span>:[{<span style="color: #2a00ff;">"kind"</span>:<span style="color: #2a00ff;">"drive#fileLink"</span>,<span style="color: #2a00ff;">"id"</span>:<span style="color: #2a00ff;">"0B9pC9EpixPYFNk9WMWtmT1duQUk"</span>}]}\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r'</span> >> txtDataFile.txt
<br />
<br />
cat TestUpload.txt >> txtDataFile.txt
<br />
<br />
echo $<span style="color: #2a00ff;">'\r\n--foo_bar_baz--'</span> >> txtDataFile.txt
<br />
<br />
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ya29.xwHjsm--zQ6Wi5qD6mAoMfnDcNdCl0FvaUN8TuAwCvMJ4-YYq2ozj1vKCE1aAGECW4s8"</span> -H <span style="color: #2a00ff;">'Content-Type: multipart/form-data; boundary=<span style="color: #2a00ff;">"foo_bar_baz"</span>'</span> --data-binary <span style="color: #2a00ff;">"@txtDataFile.txt"</span> https:<span style="color: #3f7f5f;">//www.googleapis.com/upload/drive/v2/files?uploadType=multipart</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<h2>
Upload a Text File (Java)</h2>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.CloseableHttpResponse;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.HttpPost;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.impl.client.DefaultHttpClient;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.util.EntityUtils;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.entity.StringEntity;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONArray;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONObject;
<br />
<br />
<span style="color: #3f7f5f;">// curl -k -H "Authorization: Bearer ya29.xwHjsm--zQ6Wi5qD6mAoMfnDcNdCl0FvaUN8TuAwCvMJ4-YYq2ozj1vKCE1aAGECW4s8" -H 'Content-Type: multipart/form-data; boundary="foo_bar_baz"' --data $'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{"title": "My File.txt","parents":[{"kind":"drive#fileLink","id":"0B9pC9EpixPYFNk9WMWtmT1duQUk"}]}\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r\nThis is in the file\r\n--foo_bar_baz--' https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart
</span><br />
<span style="color: #3f7f5f;">//
</span><br />
<span style="color: #3f7f5f;">// touch txtDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// echo $'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{"title": "My File.txt","parents":[{"kind":"drive#fileLink","id":"0B9pC9EpixPYFNk9WMWtmT1duQUk"}]}\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r' >> txtDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// cat TestUpload.txt >> txtDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// echo $'\r\n--foo_bar_baz--' >> txtDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// curl -k -H "Authorization: Bearer ya29.xwHjsm--zQ6Wi5qD6mAoMfnDcNdCl0FvaUN8TuAwCvMJ4-YYq2ozj1vKCE1aAGECW4s8" -H 'Content-Type: multipart/form-data; boundary="foo_bar_baz"' --data-binary "@txtDataFile.txt" https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart
</span><br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> CreateADataFileToUploadATextFile {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<strong><span style="color: #7f0055;">try</span></strong> {
<br />
String accessToken = <span style="color: #2a00ff;">"ya29.xwHjsm--zQ6Wi5qD6mAoMfnDcNdCl0FvaUN8TuAwCvMJ4-YYq2ozj1vKCE1aAGECW4s8"</span>;
<br />
HttpPost httpPost = <strong><span style="color: #7f0055;">new</span></strong> HttpPost(<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//www.googleapis.com/upload/drive/v2/files?uploadType=multipart");
</span><br /> httpPost.addHeader(<span style="color: #2a00ff;">"Authorization"</span>, <span style="color: #2a00ff;">"Bearer "</span>+accessToken);
<br /> httpPost.setHeader(<span style="color: #2a00ff;">"Content-Type"</span>,<span style="color: #2a00ff;">"multipart/related; boundary=foo_bar_baz"</span>);
<br />
<br /> JSONObject json = <strong><span style="color: #7f0055;">new</span></strong> JSONObject();
<br /> json.put(<span style="color: #2a00ff;">"title"</span>, <span style="color: #2a00ff;">"My File.txt"</span>);
<br /> JSONArray parents = <strong><span style="color: #7f0055;">new</span></strong> JSONArray();
<br /> JSONObject parent = <strong><span style="color: #7f0055;">new</span></strong> JSONObject();
<br /> parent.put(<span style="color: #2a00ff;">"kind"</span>, <span style="color: #2a00ff;">"drive#fileLink"</span>);
<br /> parent.put(<span style="color: #2a00ff;">"id"</span>, <span style="color: #2a00ff;">"0B9pC9EpixPYFNk9WMWtmT1duQUk"</span>);
<br /> parents.put(parent);
<br /> json.put(<span style="color: #2a00ff;">"parents"</span>, parents);
<br />
<br /> String fileContent = <span style="color: #2a00ff;">"Contents of Test Upload File"</span>;
<br />
<br /> StringEntity str=<strong><span style="color: #7f0055;">new</span></strong> StringEntity(<span style="color: #2a00ff;">"--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n"</span>+json.toString()+<span style="color: #2a00ff;">"\r\n--foo_bar_baz\r\nContent-Type: plain/text\r\n\r\n"</span>+fileContent+<span style="color: #2a00ff;">"\r\n--foo_bar_baz--"</span>);
<br /> httpPost.setEntity(str);
<br />
<br /> CloseableHttpResponse response = <strong><span style="color: #7f0055;">new</span></strong> DefaultHttpClient().execute(httpPost);
<br /> String jsonResponse = EntityUtils.toString(response.getEntity());
<br /> response.close();
<br /> System.out.println(<span style="color: #2a00ff;">"jsonResponse:"</span>+jsonResponse);
<br />
<br /> JSONObject jsonObject = <strong><span style="color: #7f0055;">new</span></strong> JSONObject(jsonResponse);
<br /> String id = jsonObject.getString(<span style="color: #2a00ff;">"id"</span>);
<br /> System.out.println(<span style="color: #2a00ff;">"Created resource... ID: "</span>+id);
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> }
<br /> }
<br />}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
<h2>
Upload an Image File (curl)</h2>
The main difference between this and the last example is the data is larger and the Content-Type is image/jpeg instead of text/plain.
<br />
<div>
<br /></div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
touch jpgDataFile.txt
<br />
<br />
echo $<span style="color: #2a00ff;">'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{<span style="color: #2a00ff;">"title"</span>: <span style="color: #2a00ff;">"My JPG.jpg"</span>,<span style="color: #2a00ff;">"parents"</span>:[{<span style="color: #2a00ff;">"kind"</span>:<span style="color: #2a00ff;">"drive#fileLink"</span>,<span style="color: #2a00ff;">"id"</span>:<span style="color: #2a00ff;">"0B9pC9EpixPYFNk9WMWtmT1duQUk"</span>}]}\r\n--foo_bar_baz\r\nContent-Type: image/jpeg\r\n\r'</span> >> jpgDataFile.txt
<br />
<br />
cat TreeHouse15.jpg >> jpgDataFile.txt
<br />
<br />
echo $<span style="color: #2a00ff;">'\r\n--foo_bar_baz--'</span> >> jpgDataFile.txt
<br />
<br />
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ya29.yAG2xVUntrdwwY9DnwiWeRme6A6unAMDr1uiouTekpV5ee6LS9UnM9iISB-GGNJGZK7b"</span> -H <span style="color: #2a00ff;">'Content-Type: multipart/form-data; boundary=<span style="color: #2a00ff;">"foo_bar_baz"</span>'</span> --data-binary <span style="color: #2a00ff;">"@jpgDataFile.txt"</span> https:<span style="color: #3f7f5f;">//www.googleapis.com/upload/drive/v2/files?uploadType=multipart</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<h2>
Uploading an Image Data URI (Java)
</h2>
<div>
To make things a little more interesting, we will use a Data URI for this example.</div>
<div>
<br /></div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">import</span></strong> org.apache.commons.codec.binary.Base64;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.CloseableHttpResponse;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.HttpPost;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.impl.client.DefaultHttpClient;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.util.EntityUtils;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.entity.StringEntity;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONArray;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.json.JSONObject;
<br />
<br />
<span style="color: #3f7f5f;">// rm jpgDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// touch jpgDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// echo $'--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{"title": "My JPG.jpg","parents":[{"kind":"drive#fileLink","id":"0B9pC9EpixPYFNk9WMWtmT1duQUk"}]}\r\n--foo_bar_baz\r\nContent-Type: image/jpeg\r\n\r' >> jpgDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// cat TreeHouse15.jpg >> jpgDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// echo $'\r\n--foo_bar_baz--' >> jpgDataFile.txt
</span><br />
<span style="color: #3f7f5f;">// curl -k -H "Authorization: Bearer ya29.xwFXZu-7vgVrcLyfzd1dZOLy3zjoifxGd6-luVgCJw_o8rMNrIGoGqQLfoPhDjtzgs80" -H 'Content-Type: multipart/form-data; boundary="foo_bar_baz"' --data-binary "@jpgDataFile.txt" https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart
</span><br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> CreateADataFileToUploadAnImageFile {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<strong><span style="color: #7f0055;">try</span></strong> {
<br />
String accessToken = <span style="color: #2a00ff;">"ya29.yAG2xVUntrdwwY9DnwiWeRme6A6unAMDr1uiouTekpV5ee6LS9UnM9iISB-GGNJGZK7b"</span>;
<br />
HttpPost httpPost = <strong><span style="color: #7f0055;">new</span></strong> HttpPost(<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//www.googleapis.com/upload/drive/v2/files?uploadType=multipart");
</span><br /> httpPost.addHeader(<span style="color: #2a00ff;">"Authorization"</span>, <span style="color: #2a00ff;">"Bearer "</span>+accessToken);
<br /> httpPost.setHeader(<span style="color: #2a00ff;">"Content-Type"</span>,<span style="color: #2a00ff;">"multipart/related; boundary=foo_bar_baz"</span>);
<br />
<br /> JSONObject json = <strong><span style="color: #7f0055;">new</span></strong> JSONObject();
<br /> json.put(<span style="color: #2a00ff;">"title"</span>, <span style="color: #2a00ff;">"My JPG.jpg"</span>);
<br /> JSONArray parents = <strong><span style="color: #7f0055;">new</span></strong> JSONArray();
<br /> JSONObject parent = <strong><span style="color: #7f0055;">new</span></strong> JSONObject();
<br /> parent.put(<span style="color: #2a00ff;">"kind"</span>, <span style="color: #2a00ff;">"drive#fileLink"</span>);
<br /> parent.put(<span style="color: #2a00ff;">"id"</span>, <span style="color: #2a00ff;">"0B9pC9EpixPYFNk9WMWtmT1duQUk"</span>);
<br /> parents.put(parent);
<br /> json.put(<span style="color: #2a00ff;">"parents"</span>, parents);
<br />
<br /> String dataURI = <span style="color: #2a00ff;">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD<span style="color: #3f7f5f;">///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC";
</span><br /> String encodingPrefix = <span style="color: #2a00ff;">"base64,"</span>;
<br /> <strong><span style="color: #7f0055;">int</span></strong> contentStartIndex = dataURI.indexOf(encodingPrefix) + encodingPrefix.length();
<br /> <strong><span style="color: #7f0055;">byte</span></strong>[] imageData = Base64.decodeBase64(dataURI.substring(contentStartIndex));
<br /> String fileContent = <strong><span style="color: #7f0055;">new</span></strong> String(imageData);
<br />
<br /> StringEntity str=<strong><span style="color: #7f0055;">new</span></strong> StringEntity(<span style="color: #2a00ff;">"--foo_bar_baz\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n"</span>+json.toString()+<span style="color: #2a00ff;">"\r\n--foo_bar_baz\r\nContent-Type: image/jpeg\r\n\r\n"</span>+fileContent+<span style="color: #2a00ff;">"\r\n--foo_bar_baz--"</span>);
<br /> httpPost.setEntity(str);
<br />
<br /> CloseableHttpResponse response = <strong><span style="color: #7f0055;">new</span></strong> DefaultHttpClient().execute(httpPost);
<br /> String jsonResponse = EntityUtils.toString(response.getEntity());
<br /> response.close();
<br /> System.out.println(<span style="color: #2a00ff;">"jsonResponse:"</span>+jsonResponse);
<br />
<br /> JSONObject jsonObject = <strong><span style="color: #7f0055;">new</span></strong> JSONObject(jsonResponse);
<br /> String id = jsonObject.getString(<span style="color: #2a00ff;">"id"</span>);
<br /> System.out.println(<span style="color: #2a00ff;">"Created resource... ID: "</span>+id);
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> }
<br /> }
<br />}</span></span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></span></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com1tag:blogger.com,1999:blog-3320849621289075761.post-90487682399725089822015-08-07T11:43:00.002-07:002015-08-07T11:47:49.404-07:00Getting Started with the Google Drive API<h2>
Step 1. Create a Client ID </h2>
See also <a href="https://developers.google.com/drive/web/credentials?hl=en#retrieve_oauth_20_credentials">Retrieve and Use OAuth 2.0 Credentials</a>.<br />
<ul>
<li>Go to <a class="external-link" href="https://console.developers.google.com/" rel="nofollow">https://console.developers.google.com/</a></li>
<li>Switch to appropriate Google account</li>
<li>Click on ENABLE APIS in the "Enable Google APIs for use in your apps</li>
<li>Named the project "Upload Project" and agreed to the terms</li>
<li>Click Drive API and hit Enable API</li>
<li>Click Credentials in left nav</li>
<li>Click Create new Client ID</li>
<li>Select Web Application</li>
<li>In the form for Consent Screen, name the product "Upload Project"</li>
<li>Click Save</li>
<li>Click Create Client ID</li>
<li>You will get "Client ID", "Client secret", "Redirect URIs" and "JavaScript origins"</li>
</ul>
<div>
Note: We will used ${clientID} to represent the client ID in this post.</div>
<h2>
Step 2. Generate a new Auth Token</h2>
<div>
For protocol information about OAuth protocol and workflow, see https://developers.google.com/identity/protocols/OAuth2?csw=1</div>
<div>
<br /></div>
<div>
For REST endpoint information on the oauth2 REST API used here, see https://developers.google.com/identity/protocols/OAuth2WebServer</div>
<div>
<br /></div>
<div>
For parameter information on Auth Token scopes for Google Drive API access, see https://developers.google.com/drive/v2/reference/files/insert</div>
<div>
<br /></div>
<div>
For parameter information on Auth Token scopes for You Tube API access, see https://developers.google.com/youtube/v3/guides/auth/client-side-web-apps</div>
<ul>
<li>In developer console, edit settings and change Redirect URIs to <a class="external-link" href="http://localhost/" rel="nofollow" style="background-color: white; color: #2266bb; font-family: Arial, Helvetica, sans-serif; font-size: 13.3333330154419px; line-height: 19.0476188659668px;">http://localhost</a></li>
<li>The URL needed to generate the Auth Token looks something like this:</li>
<ul>
<li>https://accounts.google.com/o/oauth2/auth?client_id=****nko08rm1s2qebr300ll3a0kakm3aue.apps.googleusercontent.com&redirect_uri=http://localhost&scope=https://www.googleapis.com/auth/drive&response_type=token</li>
</ul>
</ul>
<ul><ul></ul>
<li>Open Google Chrome and enter this is the browser, after replacing ${clientID}</li>
<ul>
<li>https://accounts.google.com/o/oauth2/auth?client_id=${clientID}&redirect_uri=http://localhost&scope=https://www.googleapis.com/auth/drive&response_type=token</li>
</ul>
<li>Go through the flows to sign in (Username, Password, User Consent)</li>
<li>The URL in the Browser will contain the Google API access token which will be something like this:</li>
<ul>
<li>http://localhost/#access_token=ya29.xwHjsm--zQ6Wi5qD6mAoMfnDcNdCl0FvaUN8TuAwCvMJ4-YYq2ozj1vKCE1aAGECW4s8&token_type=Bearer&expires_in=3600</li>
</ul>
<li>The access token would then be something like this:</li>
<ul>
<li>ya29.xwHjsm--zQ6Wi5qD6mAoMfnDcNdCl0FvaUN8TuAwCvMJ4-YYq2ozj1vKCE1aAGECW4s8</li>
</ul>
</ul>
<div>
Note: In this post, we will refer to this Auth Token using ${AuthToken}</div>
<div>
<h2>
Step 3. List all files (curl)</h2>
</div>
<div>
Open Git Bash command line and execute the following. This will create a file filesResponse.txt with all the files in google drive.</div>
<div>
<br /></div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ${AuthToken}"</span> https://www.googleapis.com/drive/v2/files > filesResponse.txt<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
curl -k -H <span style="color: #2a00ff;">"Authorization: Bearer ya29.xwE3y4ErpmdEXVS3v02hC-DEm2gz05ZwpjOvrmdOXOcCSz0YALOH9A1Qc4YHQGnFPqjN"</span> https://www.googleapis.com/drive/v2/files > filesResponse.txt<br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<a href="http://www.togotutor.com/code-to-html/shell-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></div>
</div>
</div>
<br />
You will get a json response with a ton of information.<br />
<h2>
Alternate Step 3: List all files (Java)</h2>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<div style="background: #FFFFFF; color: black; font-family: Courier New, Courier; font-size: 10pt; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.CloseableHttpResponse;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.client.methods.HttpGet;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.impl.client.DefaultHttpClient;
<br />
<strong><span style="color: #7f0055;">import</span></strong> org.apache.http.util.EntityUtils;
<br />
<span style="color: #3f7f5f;">// Step 1 - LIST ALL FILES TO TEST GOOGLE DRIVE API
</span><br />
<span style="color: #3f7f5f;">// curl -k -H "Authorization: Bearer ya29.xwE3y4ErpmdEXVS3v02hC-DEm2gz05ZwpjOvrmdOXOcCSz0YALOH9A1Qc4YHQGnFPqjN" https://www.googleapis.com/drive/v2/files > files.txt
</span><br />
<span style="color: #3f7f5f;">//<!-- Shipping with selenium-htmlunit-driver 2.41.0 -->
</span><br />
<span style="color: #3f7f5f;">//<!-- Includes httpclient 4.3.1 org.apache.http.client.methods.CloseableHttpResponse -->
</span><br />
<span style="color: #3f7f5f;">//<!-- Includes httpmime 4.3.1 org.apache.http.entity.mime -->
</span><br />
<span style="color: #3f7f5f;">//<!-- Includes commons-lang3 3.1 org.apache.commons.lang3.exception.ExceptionUtils -->
</span><br />
<span style="color: #3f7f5f;">//<dependency>
</span><br />
<span style="color: #3f7f5f;">// <groupId>net.sourceforge.htmlunit</groupId>
</span><br />
<span style="color: #3f7f5f;">// <artifactId>htmlunit</artifactId>
</span><br />
<span style="color: #3f7f5f;">// <version>2.13</version>
</span><br />
<span style="color: #3f7f5f;">//</dependency>
</span><br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">class</span></strong> ListAllFiles {
<br />
<strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> main(String[] args) {
<br />
<strong><span style="color: #7f0055;">try</span></strong> {
<br />
String token = <span style="color: #2a00ff;">"ya29.yAFLSqN1xaR9EKuMrcJu6iLMt9PyaRqotTK01PbaPjd7gZZMtqE9XgFgHz3A5IEwKV7-"</span>;
<br />
HttpGet httpGet = <strong><span style="color: #7f0055;">new</span></strong> HttpGet(<span style="color: #2a00ff;">"https:<span style="color: #3f7f5f;">//www.googleapis.com/drive/v2/files");
</span><br /> httpGet.addHeader(<span style="color: #2a00ff;">"Authorization"</span>, <span style="color: #2a00ff;">"Bearer "</span>+token);
<br /> CloseableHttpResponse response = <strong><span style="color: #7f0055;">new</span></strong> DefaultHttpClient().execute(httpGet);
<br /> String jsonResponse = EntityUtils.toString(response.getEntity());
<br /> response.close();
<br /> System.out.println(<span style="color: #2a00ff;">"jsonResponse:"</span>+jsonResponse);
<br /> } <strong><span style="color: #7f0055;">catch</span></strong> (Exception ex) {
<br /> ex.printStackTrace();
<br /> }
<br /> }
<br />}</span><br />
<div style="border-top: #ccc 1px dashed; text-align: right;">
<span style="color: #2a00ff;"><a href="http://www.togotutor.com/code-to-html/java-to-html.php" target="_blank">Code Formatted by ToGoTutor</a></span></div>
</div>
</div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0tag:blogger.com,1999:blog-3320849621289075761.post-64384376260774431212015-07-30T10:25:00.001-07:002015-07-30T10:28:21.164-07:00A Simple Image Overlay Example<div style="background-color: white; border: 0px; color: #373737; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 24.375px; margin-bottom: 1.625em; outline: 0px; padding: 0px; vertical-align: baseline;">
From <a href="http://jquerytools.org/demos/" style="border: 0px; color: #1982d1; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">jquerytools.org</a>…</div>
<div style="background-color: white; border: 0px; color: #373737; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 24.375px; margin-bottom: 1.625em; outline: 0px; padding: 0px; vertical-align: baseline;">
This example uses jquery 1.2.7. Create a file “<span class="skimlinks-unlinked" style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">test.html</span>” and edit with a text editor. Add the following code.</div>
<div style="background: #FFFFFF; border-bottom: #000 1px dashed; border-left: #000 1px dashed; border-right: #000 1px dashed; border-top: #000 1px dashed; margin: 0px; padding-bottom: 3px; padding-left: 4px; padding-right: 4px;">
<html><br />
<head><br />
<meta charset="UTF-8" /><br />
<title>Image Overlay Example</title><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><script src="http://cdn.jquerytools.org/1.2.7/full/jquery.tools.min.js"></script><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></head><br />
<body><br />
<p><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><button class="modalInput" rel="#myID">Show Image</button><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><!-- yes/no dialog --><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><div class="modal" id="myID" style="display:none;padding:15px;border:2px solid #333;-webkit-border-radius:6px;"><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><image src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" /><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><button class="close">Close</button><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></div><br />
</p><br />
<br />
<script><br />
$(document).ready(function() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$(".modalInput").overlay({<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// some mask tweaks suitable for modal dialogs<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mask: {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>color: '#ebecff',<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>loadSpeed: 200,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>opacity: 0.9<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>},<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>closeOnClick: false,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fixed: false<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>});<br />
});<br />
</script><br />
</body><br />
</html></div>
scottizuhttp://www.blogger.com/profile/10418376745836514559noreply@blogger.com0