July 02, 2018

日付関係

意外に短い行数で書けたので備忘録的に。

// うるう年判定
var isLeap=(y)=>{
return (y%400==0)?true:(y%100==0)?false:(y%4==0);
};
// 指定された月の前月の日数取得
var getDayCountOfLastMonth=(y, m)=>{
return (m==3)?(isLeap(y)?29:28):((m!=2&&m%5==2)||(m%5==0))?30:31;
};
// 指定された月の日数取得
var getDayCount = (y, m)=>{
return (m==2)?(isLeap(y)?29:28):((m!=1&&m%5==1)||(m%5==4))?30:31;
};
  
Posted by tkturbo at 17:22Comments(0)

June 19, 2018

ES6のクラス・カプセル化とドキュメンテーション

いろいろ考えたのだが、カプセル化に関してはこーゆーのがベストかな。。。


(()=>{
class ArrayList {
constructor(){
let array=[];
// private method はコンストラクタ内でcons methodとして書く
const toArray = () =>{ return array; };
// non-private method はコンストラクタ内でthisキーワードとともに書く
this.add = (item) =>{ toArray().push(item); return this; }
this.get = (index) =>{ return toArray()[index]; }
this.forEach = (callback)=>{ return toArray().forEach(callback); }
this.indexOf = (item) =>{ return toArray().indexOf(item); }
this.toString = () =>{ let str = '[', sep = ''; toArray().forEach(v=>{str+=sep+v;sep=','}); return str+']'; }
}
};
let arr1 = new ArrayList();
arr1.add(1);
arr1.add(2);
arr1.forEach((v)=>{console.log(v);});
console.log(arr1.toString());
})();


ドキュメンテーションに関しては、現時点でNo-Idea。。。orz  
Posted by tkturbo at 02:16Comments(0)

June 06, 2018

cookie操作回り(車輪の再発明)

cookieから値を取り出す/キーを削除する/値を更新するという部分だけ。
「string ←→連想配列」という変換してるだけなんだがな!


var cookielib = {
map : {
get : ()=>{
let entries = document.cookie.split(/; ?/).filter(v=>{return (!(!v));});
let m = {};
entries.forEach(v=>{let p=v.split('=');m[p[0]]=p[1];});
return m;
},
save : (m)=>{
let entry = "";
Object.keys(m).forEach(k=>{entry += k + '=' + m[k] + '; ';});
document.cookie = entry;
},
},
get : (key)=>{
return cookielib.map.get()[key];
},
set : (key, value)=>{
let map = cookielib.map.get();
map[key] = value;
cookielib.map.save(map);
},
remove : (key)=>{
let map = cookielib.map.get();
let map2 = {};
Object.keys(map).forEach(k=>{if(k!=key){map2[k]=map[k];}});
cookielib.map.save(map2);
},
};


  
Posted by tkturbo at 14:59Comments(0)

May 31, 2018

jQuery table行列入れ替え

だいぶ前にteratailの回答で作ったもの。
再参照がめんどくさいので備忘録的に貼っておく。


function switchColsAndRows(tabid){
var cols = [];
var rowIndex = 0;
var maxColSize = 0;
var tab = $('#' + tabid);
// consider colspan value first
tab.find('tr').each(function(){
if(!cols[rowIndex]){ cols[rowIndex] = []; }
var colIndex = 0;
$(this).find('td, th').each(function(){
var colspan = $(this).attr('colspan');
var colsize = (!colspan)?1:parseInt(colspan);
cols[rowIndex][colIndex] = $(this)[0];
for(var k = 1; k < colsize; k++){
cols[rowIndex][colIndex + k]={ omittable:true, rowspan:$(this).attr('rowspan')};
}
colIndex += colsize;
maxColSize = (cols[rowIndex].length > maxColSize)?cols[rowIndex].length:maxColSize;
});
rowIndex++;
});
// consider rowspan value next
for(var i = 0; i < cols.length; i++){
for(var j = 0; j < cols[i].length; j++){
var rowspan = $(cols[i][j]).attr('rowspan');
rowspan = (rowspan)?rowspan:cols[i][j].rowspan;
var rowsize = (!rowspan)?1:parseInt(rowspan);
for(var x = 1; x < rowsize && cols[i+x]; x++){
cols[i+x].splice(j, 0, { omittable : true, rowspan : 1});
}
}
}
tab.empty();
var initAttr = function(elm,name,val){$(elm).removeAttr(name);$(elm).attr(name, val);};
var replaceAttr = function(elm,name1,name2,v1,v2){
v1=$(elm).attr(name1);v2=$(elm).attr(name2);
initAttr(elm,name1,v2);initAttr(elm,name2,v1);
};
// rebuild table
for(var i = 0; i < maxColSize; i++){
var tr = $('');
for(var j = 0; j < cols.length; j++){
if(cols[j] && cols[j][i] && (!cols[j][i].omittable)){
var col = cols[j][i];
replaceAttr(col, 'rowspan', 'colspan');
tr.append(col);
}
}
tab.append(tr[0]);
}
}
  
Posted by tkturbo at 01:24Comments(0)プログラミング

May 30, 2018

javascript Promise おさらい

こうすると順次実行できるらしい。


var testfunc = (delay, resolvedValue)=>{
return new Promise((resolve, reject)=>{
let pid = setTimeout(()=>{
console.log(pid + ":" + delay);
clearTimeout(pid);
resolve(resolvedValue);
},delay);
});
};
testfunc(3000).then((resolvedValue)=>{
return testfunc(2000);
}).then((resolvedValue)=>{
return testfunc(1000);
});


「thenの中でPromiseオブジェクトを返すfunctionをキックする」というのがポイント。  
Posted by tkturbo at 01:44Comments(0)プログラミング

March 15, 2011

放射線量の単位に関する個人的まとめ。(変換スクリプト付き)

放射線量について報道されたりWeb上で散見する、

ミリシーボルト毎時(mSv/h)
マイクロシーボルト毎時(μSv/h)
ナノシーボルト毎時(nSv/h)
ナノグレイ毎時(nGy/h)

…といった単位を「ミリシーボルト毎年(mSv/year)」に換算するスクリプトを組んでみた。
計算時の定数として、JNFL環境モニタリング 解説( http://www.jnfl.co.jp/monitoring/kaisetsu/spatial-nGyh.html )に記載の

1 Gy/h = 0.8 Sv/h

…という値を用いている。

「放射能汚染が怖い」という人たち向けに危険度の比較対象として、

放射能関連施設従事者の上限被爆量(年平均):50 mSv/year
深刻な健康被害が見込まれる被爆量(年平均):100 mSv/year

…というのを挙げておく。
不安があれば各市町村の役所などに連絡して除染処理の相談などをすればいいと思う。

報道したり見聞きしたりした放射線量の値を下のテキスト入力欄に入力し、その値についている単位を下の選択ボックスから選んでボタンを押してもらえればその値の年間換算した「ミリシーボルト毎年(mSv/year)」がポップアップで表示される。

なおPCからしか使えないはずなのでご了承願いたい。

  
Posted by tkturbo at 17:44Comments(0)TrackBack(0)プログラミング

May 31, 2010

個人的なBookmarklet

最近、画面が明るすぎて目が痛くなることが多いので、画面の背景を黒く、文字列を白く表示するBookmarkletを書いてみた。

以下、ソース。






追記:上のBookmarkletだとstylesheetを設定している内部Elementの色が変わらないので、対応版。







さらに追記:「Bookmarklet」を「Scriptlet」と誤記してしまっていたので修正。ついでに<a>タグは背景色青になるようにしてみた。





  
Posted by tkturbo at 16:52Comments(0)TrackBack(0)プログラミング

April 15, 2010

Ajax関連の個人的メモ。

XMLHttpRequest#sendの引数「form」には「name=value」形式のRequestParameter文字列をセットする。
日本語文字列を送信するには「encodeURI」関数でURLエンコードしてやればOK。

具体的な記述例:

var url="/somecgi";
var method = "POST";
var isAsynchronous = true;

var httpEquiv = "Content-Type";
var content = "application/x-www-form-urlencoded";

var japanese = "あいうえお";
var english = "ABCDE";

var form = "val1="
+ encodeURI(japanese)
+ "&val2="
+ encodeURI(english);

xmlHttpRequest.open(method, url, isAsynchronous);
xmlHttpRequest.setRequestHeader(httpEquiv, content);
xmlHttpRequest.send(encodeURI(form));
  
Posted by tkturbo at 16:35Comments(0)TrackBack(0)etc(from_2005-12-25)

August 21, 2009

タッチタイピング練習スクリプト。

javascriptで書いてみた。かな入力の練習スクリプトだったりするw

# Operaではなぜか不正な動作をするので注意orz

今回はとりあえずホームポジションの練習だけ。

たぶん、飽きるまでバージョンアップをしていく予定。

「start」ボタンを押すと始まるが、100回正しく打鍵できないと終了できないので注意w


お題:
回答:




ソースが見たければ以下からどぞノシ

  続きを読む
Posted by tkturbo at 01:44Comments(0)TrackBack(0)

July 17, 2009

「ラングトンのアリ」

ラングトンのアリの描画 - どう書く?org

ラングトンのアリを描画してください。ラングトンのアリは、以下のような動きをする、セル・オートマトンです。(Wikipediaより引用)
- 黒いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。
- 白いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。
詳しくはWikipedia等で調べるか、参考ページに拙作のデモがありますのでご覧下さい。

参考: JavaScriptでラングトンの蟻

wikipedia : ラングトンのアリ

出題元のjavascriptが読み込み時重いので、改変してみた。

てなわけで↓以下をごろうじろ。



…その内メモリやCPUの空き容量を食い尽くすので放置しすぎ注意☆


ソースを見たい方は以下の「続きを読む」からどぞ↓
  続きを読む
Posted by tkturbo at 03:17Comments(0)TrackBack(0)プログラミング

June 23, 2009

ナンバープレース or 数独 の解法スクリプト - 改訂版

一部バグやら、問題を解くために推測をするロジックを追加。
たぶんこれでパーペキ。













...で、例によって以下はソース。

2009-06-23:一部修正
  続きを読む
Posted by tkturbo at 01:22Comments(0)TrackBack(0)プログラミング

June 20, 2009

ナンバープレース or 数毒 の開放スクリプト

表題のとおり、NumberPlaceないし数毒と呼ばれるパズルを解くプログラムを書いてみた。
下の9×9のマス目にお題となる数字を入れて「test」ボタンを押すと問題を解く形式。









...あまりきれいではないが、プログラムソースが見たい人は下の追記部分を参照のこと。
  続きを読む
Posted by tkturbo at 11:49Comments(0)TrackBack(0)プログラミング

May 26, 2009

10進数→16進数

おまけ。

この記事の対になるやつ。

DEC:
HEX:

…以下がソース。

<div sytle="display:none">
<script type="text/javascript"><!-- //
/* --------------------------------------------------------------------------- */
String.prototype.toCharArray=function(){
var arr = new Array(this.length);
for(var i = 0; i < this.length; i++){ arr[i] = this.charAt(i); };
return arr;
};
/* --------------------------------------------------------------------------- */
function DivisionHelper(strnum){
this.strnum=strnum;
};
/* --------------------------------------------------------------------------- */
DivisionHelper.prototype={
strnum : "",
quotient : "",
residue : 0,
divideBy : null
};
/* --------------------------------------------------------------------------- */
DivisionHelper.prototype.divideBy=function(div){
var arr = this.strnum.toCharArray();
this.quotient = "";
var strcalc = "";
for(var i = 0; i < arr.length; i++){
strcalc += arr[i];
var numc = parseInt(strcalc,10);
if(numc < div){
this.quotient+="0";
continue;
}else{
this.quotient+=""+(Math.floor(numc/div));
strcalc = ""+(numc%div);
}
}
this.quotient = this.quotient.replace(/^0+/, "");
if(this.quotient.length < 1) this.quotient="0";
this.residue= strcalc.length > 0 ? parseInt(strcalc,10) : 0;
return this;
};
/* --------------------------------------------------------------------------- */
function decimal2hex(decimalstr){
var quotient = decimalstr;
var template = "0123456789ABCDEF";
var hexstr = "";
while(true){
var dh = new DivisionHelper(quotient);
dh.divideBy(16);
hexstr = template.charAt(dh.residue) + hexstr;
if(dh.quotient == "0") break;
quotient = dh.quotient;
}
hexstr = hexstr.replace(/^0+/, "");
return hexstr == "" ? "0" : hexstr;
};
/* --------------------------------------------------------------------------- */
var decRegexp=/^([0-9])+$/;
/* --------------------------------------------------------------------------- */
function executeDec2Hex(){
var val = document.getElementById("decInput").value;
if(!val.match(decRegexp)){
alert("unmatch:" + val);
return;
}
document.getElementById("hexOutput").value="0x"+decimal2hex(val);
};
/* --------------------------------------------------------------------------- */
// --></script>
</div>
<div>
<div>DEC:</div>
<input type="text" id="decInput" style="width:100%"></input>
</div>
<div>
<input type="button" onclick="javascript:executeDec2Hex()" value="transform" />
</div>
<div>
<div>HEX:</div>
<input type="text" id="hexOutput" style="width:100%"></input>
</div>


…これまた何桁まで計算できるかはjavascriptの実装者に聞いてくれw  
Posted by tkturbo at 00:47Comments(0)TrackBack(0)プログラミング

16進数→10進数

またもや「どう書く?org( http://ja.doukaku.org/ )」のお題から。

16進数を10進数表記に直すというもの。

HEX:
DEC:


・・・以下がソース。

<div style="display:none">
<script type="text/javascript"><!-- //
/* --------------------------------------------------------------------------- */
String.prototype.toCharArray=function(){
var arr = new Array(this.length);
for(var i = 0; i < this.length; i++){ arr[i] = this.charAt(i); };
return arr;
};
/* --------------------------------------------------------------------------- */
function add(strnum1, strnum2){
var arr1 = strnum1.toCharArray().reverse();
var arr2 = strnum2.toCharArray().reverse();
var max = (arr1.length > arr2.length ? arr1.length : arr2.length) - 1;
var strsum = "";
for(var i = 0, up = 0; i <= max; i++){
var c1 = i < arr1.length ? parseInt(arr1[i],10) : 0;
var c2 = i < arr2.length ? parseInt(arr2[i],10) : 0;
c1 += up;
c1 += c2;
up = Math.floor(c1/10);
c1 %= 10;
strsum = c1 + strsum;
if(i == max) strsum = up+strsum;
}
return strsum;
};
/* --------------------------------------------------------------------------- */
function sum(arr){
var strsum = "";
for(var i = 0; i < arr.length; i++){
strsum = add(strsum, arr[i]);
}
return strsum.replace(/^0*/,"");
};
/* --------------------------------------------------------------------------- */
function multiple(a, b){
var arr_a = a.toCharArray().reverse();
var arr_b = b.toCharArray().reverse();
var arr_c = new Array(arr_b.length);
var max = arr_a.length-1;
for(var i = 0, zeropad=""; i < arr_b.length; i++,zeropad+="0"){
var str_c = "";
for(var j = 0, up=0; j<arr_a.length; j++){
var c = (parseInt(arr_a[j], 10) * parseInt(arr_b[i],10));
c+=up;
up = Math.floor(c/10);
c %= 10;
str_c = c+str_c;
if(j==max && up>0) str_c=up+str_c;
}
str_c+=zeropad;
arr_c[i] = str_c;
}
return sum(arr_c);
};
/* --------------------------------------------------------------------------- */
function hex2decimal(hexstr){
var template = "0123456789ABCDEF";
var arr = hexstr.toUpperCase().substring(2).toCharArray().reverse();
for(var i = 0, hex="1"; i < arr.length; i++, hex=multiple(hex,"16")){
var numc = "" + template.indexOf(arr[i]);
var mult = multiple(numc, hex);
arr[i] = mult;
}
var decstr=sum(arr);
if(decstr.length==0) desctr="0";
return decstr;
};
/* --------------------------------------------------------------------------- */
var hexRegexp=/^0x([0-9A-Fa-f])+$/;
/* --------------------------------------------------------------------------- */
function executeHex2Dec(){
var val = document.getElementById("hexInput").value;
if(!val.match(hexRegexp)){
alert("unmatch:" + val);
return;
}
document.getElementById("decOutput").value=hex2decimal(val);
};
/* --------------------------------------------------------------------------- */
// --></script>
</div>
<div>
<div>HEX:</div>
<input type="text" id="hexInput" style="width:100%"></input>
</div>
<div>
<input type="button" onclick="javascript:executeHex2Dec()" value="transform" />
</div>
<div>
<div>DEC:</div>
<input type="text" id="decOutput" style="width:100%"></input>
</div>

…とりあえず、300桁や400桁は即変換可能なわけだが、最大何桁まで変換できるかはjavascriptの配列や文字列の最大長によるので私はよくわららんw
  
Posted by tkturbo at 00:32Comments(0)TrackBack(0)プログラミング

May 22, 2009

ケブンッリジ関数

詳細は以下↓

「確かに“読めてしまう”コピペに2ch住人が「人間すげー」と驚く」
http://www.itmedia.co.jp/news/articles/0905/08/news021.html

以下、ソース。


<script type="text/javascript"><!-- //
/* ---------------------------------------------------------------- */
function randomSort(a,b){ return (Math.random()-0.5); };
/* ---------------------------------------------------------------- */
Array.prototype.push2=function(obj){ this.push(obj); return this; };
/* ---------------------------------------------------------------- */
Array.prototype.unshift2=function(obj){
this.unshift(obj);
return this;
};
/* ---------------------------------------------------------------- */
Array.prototype.shuffle=function(){ return this.sort(randomSort); };
/* ---------------------------------------------------------------- */
Array.prototype.concatToString=function(){
var text="";
for(var i=0; i<this.length; i++){ text+=this[i]; }
return text;
};
/* ---------------------------------------------------------------- */
var regexp=/[  \??\!!\..。。\r\n\t]/;
/* ---------------------------------------------------------------- */
String.prototype.tokenize=function(regexp){
var arr=new Array(1);
arr[0]="";
for(var i=0,t=0;i<this.length;i++){
var c=this.charAt(i);
if(c.match(regexp)){
arr.push2(c).push2("");
t+=2;
}else{ arr[t]+=c; }
}
return arr;
};
/* ---------------------------------------------------------------- */
String.prototype.toCharArray=function(){
var arr = new Array(this.length);
for(var i=0; i<this.length; i++) arr[i]=this.charAt(i);
return arr;
};
/* ---------------------------------------------------------------- */
String.prototype.applyCambridgeMethod=function(){
if(this.length<=3)return this;
var max=this.length-1;
var arr = this.toCharArray();
return arr.slice(1,max).shuffle()
.unshift2(arr[0]).push2(arr[max]).concatToString();
};
/* ---------------------------------------------------------------- */
function transform(){
var ta_input=document.getElementById("ta_input");
var ta_output=document.getElementById("ta_output");
var arr = ta_input.value.tokenize(regexp);
for(var i = 0; i< arr.length; i++){
arr[i]=arr[i].applyCambridgeMethod();
}
ta_output.value=arr.concatToString();
};
// --></script>
</div>
<textarea id="ta_input" style="width:100%;height:50%">こんにちは みなさん おげんき ですか? わたしは げんき です。
この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか
にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば
じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて
わざと もじの じゅんばん を いれかえて あります。
どうです? ちゃんと よめちゃう でしょ?
ちゃんと よめたら はんのう よろしく</textarea>
<div style="height:20px">
<input type="button" onclick="javascript:transform()" value="transform" />
</div>
<textarea id="ta_output" style="width:100%;height:50%" value=""></textarea>
  
Posted by tkturbo at 03:13Comments(0)TrackBack(0)プログラミング

November 18, 2008

「恋愛ジャンキー」???

livedoor ニュース - 結婚しても「恋」がしたい!【独女通信】

久々に「読んでて吐き気を催す記事」だったので。

「今度合コンに行きたいんだけど、予定はないの?」と、友人の啓子さん(36歳)から連絡を受けた百合(35歳)さんは驚いた。なぜなら啓子さんは、小学生の娘がいる立派な既婚女性。そこで、今さら合コンで何を求めているのかと問うと、彼女は「もう一度恋がしてみたい」と真剣に訴えたのだそうだ。


恋愛体験を求めるあまり、10歳年下の男性と関係を持ってしまったというのは、同じく小学生2人の子供を持つ弥生さん(38歳)。相手は、職場で知り合った取引先の独身男性だ。


↑自分の行為に罪悪感がないならカミングアウトすればよろし。

その結果は修羅場となるだけだろうが。

通常これらの行為は「不貞行為」として離婚の原因になったりする。

一方的な浮気による離婚は、浮気した側(およびその浮気相手)に慰謝料が請求されるのだが、そういった事例をこの記事の記者は知らないのか?あえて無視しているのか?

知らないのなら無知を恥じるべき。「一般常識」について30年勉強してから出直してきて欲しい。

知っていて書いてるなら、「不貞行為」の幇助。記者の正気を疑う。


弥生さんは、自らを「恋愛ジャンキー」と称して笑った。


↑違います。

「自分の欲望をコントロールできない」という症状の、単なる精神異常者です。

精神科のお世話になることを推奨します。  
Posted by tkturbo at 09:53Comments(0)TrackBack(0)etc(from_2005-12-25)