分数の表示

分数表示をするには、分母と分子の最大公約数での約分が必要です。ユークリッド互除法という古くからある解法を用いることで、javascript で分数の表示を実装することができます。今のところ、係数入力には整数しか対応していません。

以下、参照  JavaScript 第6版 より

function memoize(f) {
  var cache = {};
  return function() {
    var key = arguments.length + Array.prototype.join.call(arguments,",");
    if (key in cache) return cache[key];
    else return cache[key] = f.apply(this, arguments);
  };
}
function gcd(m,n) {
  var t;
  if (m < n) t=n, n=m, m=t;
  while(n != 0) t=n, n = m%n, m=t;
    return m;
}
function output() {
  var gcdmemo = memoize(gcd);
  var a1= document.getElementById('a').value;
  var b1= document.getElementById('b').value;
  var c1= document.getElementById('c').value;
  var d1= document.getElementById('d').value;
  var p1= document.getElementById('p').value;
  var q1= document.getElementById('q').value;
  var x1= d1*p1-b1*q1, y1 = a1*q1-c1*p1;
  var z = a1*d1-b1*c1, z1 = Math.abs(z);
  if(z1 == 0) {
    document.getElementById('x').innerHTML = "x = " + a1 + 
        "x + " + b1 + "y = " + p1 + " のすべての解です。";
    document.getElementById('y').innerHTML = "y = " + a1 + 
        "x + " + b1 + "y = " + p1 + " のすべての解です。";
    return false;
  }
  if(Math.abs(gcdmemo(x1,z1)) == z1) {
    document.getElementById('x').innerHTML = "x = " + 
        x1/gcdmemo(x1,z);
    if(Math.abs(gcdmemo(y1,z1)) == z1) {
      document.getElementById('y').innerHTML = "y = " + 
        y1/gcdmemo(y1,z);
    }
    else {
      if(z/gcdmemo(y1,z) > 0) {
        document.getElementById('y').innerHTML = "y = " + 
        y1/gcdmemo(y1,z) + "/" + z/gcdmemo(y1,z);
      }
      else {
      document.getElementById('y').innerHTML = "y = " +
         (-1)*y1/gcdmemo(y1,z) + "/" + Math.abs(z/gcdmemo(y1,z));
      }
    }
  }
  else {
    if(z/gcdmemo(x1,z) > 0) {
      document.getElementById('x').innerHTML = "x = " + 
        x1/gcdmemo(x1,z) + "/" + z/gcdmemo(x1,z);
    }
    else {
      document.getElementById('x').innerHTML = "x = " + 
        (-1)*x1/gcdmemo(x1,z) + "/" + Math.abs(z/gcdmemo(x1,z));
    }
    if(Math.abs(gcdmemo(y1,z1)) == z1) {
      document.getElementById('y').innerHTML = "y = " + 
        y1/gcdmemo(y1,z);
    }
    else {
      if(z/gcdmemo(y1,z) > 0) {
        document.getElementById('y').innerHTML = "y = " + 
        y1/gcdmemo(y1,z) + "/" + z/gcdmemo(y1,z);
      }
      else {
        document.getElementById('y').innerHTML = "y = " + 
        (-1)*y1/gcdmemo(y1,z) + "/" + Math.abs(z/gcdmemo(y1,z));
      }
    }
  }
}


追記)分母の符号処理にバグを発見しました。謹んで訂正致します。しかしながら依然、分子か分母またそのいずれもマイナス値だった時のユークリッド互除法の符号処理に疑問があります。

連立1次方程式

いきなり n元1次方程式を解こうとすると、n次行列の逆行列とかLU分解法など、線形代数を本格的にやるハメになるので中学レベルから始めます。

参考URL: 連立方程式 – 高精度計算サイト

function output() {
  var a1= document.getElementById('a').value;
  var b1= document.getElementById('b').value;
  var c1= document.getElementById('c').value;
  var d1= document.getElementById('d').value;
  var p1= document.getElementById('p').value;
  var q1= document.getElementById('q').value;
  var x1= d1*p1-b1*q1, y1 = a1*q1-c1*p1;
  var z = a1*d1-b1*c1, z1 = Math.abs(z);
  if(z1 == 0) {
    document.getElementById('x').innerHTML = "x = " + a1 + "x + " + b1 + "y = " + p1 + " のすべての解です。";
    document.getElementById('y').innerHTML = "y = " + a1 + "x + " + b1 + "y = " + p1 + " のすべての解です。";
    return false;
  }
  else {
    document.getElementById('x').innerHTML = "x = " + x1/z;
    document.getElementById('y').innerHTML = "y = " + y1/z;
    return false;
  }
}

今は、結果を分数で表示できないか試行錯誤中です。

jQuery の記述

jQueryを使ったスライダーの作り方とその仕組み

のコピペでスミマセン。センセンシャル。

jQuery はDOMが操作可能になるまで待機させるために、ready()メソッドに入れ子で記述すると良いとのこと。これだけは伝えたかった。

<script type="text/javascript">
$(document).ready(function() {
・・・(jQueryの記述
});
</script>

https://stuffy.mydns.jp/~gusachan/javascript/slider.html

JavaScript BMIの判定

久々に JavaScript に触ってみましたが、onClick が効かなくて焦りました。コードのタイプミスが原因でした。他にもHTMLタグのid が予約語や変数名と被るとかいった事でもダメみたいですね。

https://stuffy.mydns.jp/~gusachan/javascript/BMI.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript">
function calcBMI() {
  var shincho = document.getElementById("height");
  var tiju = document.getElementById("weight");
  var hantei = document.getElementById("result");
  var h = shincho.value/100, w = tiju.value;
  var bmi = w/h/h;
  if (bmi < 18.5) {
    hantei.innerHTML = "痩せすぎ";
  }
  else if (bmi < 25) {
    hantei.innerHTML = "普通";
  }
  else if (bmi < 30) {
    hantei.innerHTML = "肥満度1";
  }
  else if (bmi < 35) {
    hantei.innerHTML = "肥満度2";
  }
  else if (bmi <40) {
    hantei.innerHTML = "肥満度3";
  }
  else if (bmi >= 40) {
    hantei.innerHTML = "肥満度4";
  }
}
</script>
</head>
<body>
<form>身長を入力してください。<input type="text" size="4" id="height"> cm<br>
体重を入力してください。<input type="text" size="4" id="weight"> kg<br>
<input type="button" value="計算" onClick="calcBMI()"></form>
判定:<div id="result"></div>
</body>
</html>

Kaspersky2017

EPSON 機をWindows7 からリカバリーしてWindows10 に再アップグレード、Kaspersky の最新版をダウンロード、インストール、アクティベーション。ここまで、レジストリからキーボードレイアウト変更、IMEの再インストール、パスワード、グループポリシーの設定、バックアップまで完了しました。Kaspersky2017の新機能、セキュアコネクションはWi-Fi接続時のプライバシーを保護する機能らしいです。

 

参考URL:

Windows7でのキーボードレイアウトの指定  untitled document

Windows 10で日本語キーボードが101英語キーボードと認識されてしまう問題

パーソンオブインタレスト一挙放送

「パーソンオブインタレスト:シーズン1-5」
2017年2月18日(土) 12:00~

ひかりTVのAXNチャンネルで一挙放送がされますね。CMなしの永久保存版。見逃したエピソードも録画してまとめてチェック。

パーソン・オブ・インタレスト | AXN Japan

今月のお買い物

BUFFALO Giga対応 金属筺体 電源内蔵 8ポート ブラック スイッチングハブ LSW5-GT-8NS/BK

https://www.amazon.co.jp/gp/product/B00I5871QU/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1

光ネクストのスループットに適した、Giga対応のベストセラー1位のスイッチングハブ。以前に予備としてストックしていたのですが、NTTルータのPPPoEブリッジに充てたため、宅内LAN配線のためもう1台必要となったものでした。

これで、ひかりTVのストリーミングもスムーズに鑑賞できそうです。

RTX810でひかりTV

取りあえず去年から放置していたYAMAHAルーター RTX810 を置いてみました。古い無線ルーターを押し入れから引っ張り出してインターネットには繋がったのですけどね。この段階では、ひかりTVのチューナーがルーティングできません。コンソールから以下のコマンドを打ちます。

WANのインタフェースの設定
(LAN2ポートを使用)
pp select 1
pp always-on on
pppoe use lan2
pp auth accept pap chap
pp auth myname (ISPに接続するID) (ISPに接続するパスワード)
ppp lcp mru on 1454
ppp ipcp ipaddress on
ppp ipcp msext on
ip pp mtu 1438
ip pp nat descriptor 1
pp enable 1
ip route default gateway pp 1
ひかりTVの設定 ipv6 route default gateway dhcp lan2
ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan1 mld router version=2
ipv6 lan2 address dhcp
ipv6 lan2 dhcp service client
ipv6 lan2 mld host version=2
ngn type lan2 ntt
NATの設定 nat descriptor type 1 masquerade
DHCPの設定 dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.0.3-192.168.0.100/24
DNSの設定 dns server select 1 dhcp lan2 aaaa .
dns server select 2 pp 1 any . restrict pp 1
dns private address spoof on
# save
# restart

してルーター配下に接続できました。^^);

参考URL:

http://jp.yamaha.com/products/network/solution/flets/flets_other_service/television/

YAMAHAルーターRTX810の設置完了に関する詳細

http://www.5cho-me.com/wordpress/172156

Windows10 ショートカット

[Windows]+[H] 共有(いまいち何のガジェットか分かりません。)

[Windows]+[F] フィードバックHub(サポセンですね。)

[Windows]+[S] コルタナさん(PCに向かってしゃべるの恥ずかしい。)

[Windows]+[W] Windows Ink ワークスペース(タッチデバイス向け?)

[Windows]+[T] アクセシビリティ(ユニバーサルデザイン大事。)

[Windows]+[I] 設定(まだ詳しい隠れセッティングがありそう。)

[Windows]+[P] スクリーン設定

[Windows]+[X] 各種ツールの一覧(すごく便利。)

Windows7の頃から使い倒している、タスクバーのピン止めアプリの起動に[Windows]+[数字キー]は便利ですね。

タイマー制御

intervalID = setInterval(function, milliseconds) メソッドで繰り返される関数の呼び出しを止めるには、clearInterval(id)に戻り値を指定します。例えば、要素の属性値onclick に

onclick=”clearInterval(intervalID)”

JS のコードに関数を指定して呼び出す方法もありますが入れ子になっていると上手く行かないこともあります。

https://stuffy.mydns.jp/~gusachan/javascript/stopwatch.html