Graviness Blog

算数・数学・科学・電脳・雑記・アホの順の密度で記事が構成されます。
<< March 2024 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
RECENT COMMENT
  • Pyinstallerで生成したexeファイルがZscalerでウィルス誤検出される問題の解消方法
    優乃 (01/16)
  • Pyinstallerで生成したexeファイルがZscalerでウィルス誤検出される問題の解消方法
    KOU (01/15)
  • Pyinstallerで生成したexeファイルがZscalerでウィルス誤検出される問題の解消方法
    優乃 (01/13)
  • Pyinstallerで生成したexeファイルがZscalerでウィルス誤検出される問題の解消方法
    KOU (01/12)
  • IEC 61131-3テキスト → IEC 61131-10 XML変換ソフトウェア Jiecc
    優乃 (01/11)
  • IEC 61131-3テキスト → IEC 61131-10 XML変換ソフトウェア Jiecc
    KOU (01/07)
  • IEC 61131-3テキスト → IEC 61131-10 XML変換ソフトウェア Jiecc
    優乃 (01/05)
  • IEC 61131-3テキスト → IEC 61131-10 XML変換ソフトウェア Jiecc
    KOU (01/05)
  • Smirnov-Grubbs検定を用いる外れ値除去のPython実装
    優乃 (01/05)
  • Smirnov-Grubbs検定を用いる外れ値除去のPython実装
    西村 (01/05)
RECENT TRACKBACK
MOBILE
qrcode
PROFILE
Pyinstallerで生成したexeファイルがZscalerでウィルス誤検出される問題の解消方法

Windows版Python環境Pyinstallerで生成したexeファイルが、会社インフラのアンチウィルスソフトZscalerでトロイの木馬等のウィルスとして誤検出される問題が発生しました。

調べてみると様々な環境のPyinstallerやソフトウェアにて同じ問題が発生しており、特定の環境やソフトウェアの問題ではないことが分かりました(以下)。

どうやら、Pyinstallerのbootloaderモジュールが誤検出されているようです。であれば、アンチウィルスソフトが誤検出しないようにすることが恒久対策となりますが、調べた範囲では、いずれも暫定対策の範囲であり、そうであれば私も一番手軽な問題解消方法を選択したいということで、私は、問題が発生し始めたPyinstaller 6.x系を5.x系にバージョンダウンをする方法をとりました。具体的には、以下のコマンドを実行し、その後はいつも通りにpyintallerを使用して、exeファイルを生成しました。

python -m pip install pyinstaller==5.9

JUGEMテーマ:コンピュータ

Program(|mer|ming) | 21:36 | comments(4) | - | - | - |
IEC 61131-3テキスト → IEC 61131-10 XML変換ソフトウェア Jiecc

IEC 61131-3テキストをIEC 61131-10 XMLに変換するソフトウェア Jiecc

IEC 61131-3テキストをIEC 61131-10 XMLに変換するソフトウェア Jieccをリリースしました。「Jieccのダウンロードと実行方法」からソフトウェアをダウンロードできます。

Jieccの詳しい情報は、上記ページを参照ください。本記事では、Jieccを作った背景や今後の方向性などを示します。

背景

IEC 61131-10は、IEC 61131-3プログラムのXMLフォーマット規格です。IEC 61131-3規格をするXMLフォーマットのソースコードを提供し、PLCメーカーのツールや外部ソフトウェア間のポータビリティ確保を目的としています。Jieccは、この外部ソフトウェアの一つといえます。

もう一つの規格、IEC 61131-3というと、ST・LD・FBD・IL・SFCの5言語をサポート!が注目されがちですが、これは、いわゆるロジック部分のことをいっています。一般的に、ソースコードはロジック部分だけではなく、型・関数・変数宣言の文法、初期化の文法等が含まれます。では、IEC 61131-3には、ロジック部分以外のソースコードの文法規定はないのか、というとそんなことはなく、規格内でBNFで定義された以下に示すような立派な?テキスト表現があります。

TYPE
	t: STRUCT
		m0: INT;
		m1: ARRAY[0..7] OF BOOL;
	END_STRUCT;
END_TYPE
 
// mainプログラム
PROGRAM main
	VAR
		intv: INT;
		ints: ARRAY[0..2] OF INT := [2, 3, 5];
		tv: t;
	END_VAR

FOR intv := 0 OT 2 BY 1 DO
	ints[intv] := intv[intv] + intv;
END_FOR;
END_PROGRAM

即ち、ST言語やIL言語のテキスト言語に限れば※1、IEC 61131-3のソースコード全体はテキストで表現可能であり、XML以前にポータビリティは確保されていたのです※2。特に、型や変数などの宣言の文法は、XMLと比べても圧倒的に少ない記述量です。

このIEC 61131-3のテキスト表現を知って欲しいし、もっと活用してFAの開発生産性を上げたい。Jieccは、このような背景を基に作られました。

※1 日本において忘れてはいけないLD言語をはじめとするグラフィカル言語については、IEC 61131-3のテキスト表現のロジック部分にIEC 61131-10のXML表現を逆導入して解決しようと考えています。私的には、IEC 61131-10には、IEC 61131-3テキストのサブセットとして、グラフィカル言語のロジック部分の表現方法だけを規定して欲しいと考えています。Jieccもこの思想で今後更新していきます。
※2 では、十分かというとそうではなく、プログラミング言語としてのライブラリのポータビリティのためのプロトタイプ宣言やimport構文(依存関係の指定)などが足りていません。

今後の機能強化予定

今後の改善や機能強化については、以下のようなことを考えています。これは、一人じゃ時間的に無理ですね。。。

  1. IEC 61131-3 to 10変換の未実装項目
    1. エラーコードに対応するメッセージを出力する。
    2. METHODやVAR_CONFIGなど、未サポート要素の変換に対応する。
  2. ブラウザ上で変換できるようにする。(サーバサイドで実行する。)
  3. IEC 61131-3テキストをJavaScript言語等のソースコードに変換する。
  4. ST言語部分を実行するインタプリタを作る。
  5. IEC 61131-10 XMLをIEC 61131-3に変換するソフトウェアを作る。
IEC 61131-3 | 15:11 | comments(4) | - | - | - |
等しいとき1、等しくないとき0を得る数式

2つの数x, yが等しいとき1、等しくないとき0を得る数学的な関数\( eq \left( x, y \right) \)を検討します。プログラムではないです。

ChatGPTとも議論しつつ私は次の答えを得ることができました。

\[ \begin{align*} eq \left( x, y \right) &= \left \lfloor \ \frac{1}{1 + {\left( x - y \right)}^2} \right \rfloor \\ &= \left \lfloor \ \frac{1}{1 + \left| x - y\right|} \right \rfloor \\ &= 1 - { \left ( \mathrm{sign} \left ( x - y \right ) \right ) }^2 \\ &= 1 - \left | \mathrm{sign} \left ( x - y \right ) \right| \\ \end{align*} \]

条件分岐なしの数式を得たいと粘りましたが、不連続になることが必須だと分かり、その解はないのだろうと思われます。狙いとしては、一番基礎的な関数で表示することでしたが、符号関数ヘヴィサイドの階段関数床関数・天井関数絶対値関数あたりがそれになるのだろうと考えています。

本件、これが正解!というものはないので、他の答えもあったら教えてください。

数学/算数 | 19:14 | comments(0) | - | - | - |
備忘録

備忘録

JavaScript

  • 平均値や合計値等にFloat64Arrayを使用したが、通常のArrayと比較して、高速化したという有意なデータは得られなかった。(MS Edge)
  • Math.logをconst log = Math.log;などとローカル変数にキャッシュしたlogを使用したが、高速化したという有意なデータは得られなかった。(MS Edge)

Python

  • 代入(左辺)を伴わない内包表記で、消費メモリは単純に増加した。 cygwin python 3.9@202310
  • 配列アクセスにおいて、a[0]とa[-1]のアクセス時間に優位な差は得られなかった。 cygwin python 3.9@202310
未分類 | 22:03 | comments(0) | - | - | - |
フォルダの右クリックメニューに「mintty で開く」を追加する

Windowsフォルダの右クリックメニューからminttyを起動できるようにします。mintty起動時のカレントディレクトリは、そのフォルダです。

フォルダの右クリックメニューに追加される「mintty で開く」の画面です。

方法は、以下のテキストをコピーして、open_with_mintty.regなど、拡張子regのファイルとして保存し、そのregファイルをダブルクリックするだけです。フォルダの右クリックしたときのメニュー(コンテキストメニュー)に「minttyで開く」が表示されるようになります。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\open_wz_mintty]
@="mintty で開く"

[HKEY_CLASSES_ROOT\Directory\shell\open_wz_mintty\command]
@="C:\\cygwin\\bin\\mintty.exe --dir \"%V\" -"

[HKEY_CLASSES_ROOT\Directory\Background\shell\open_wz_mintty]
@="mintty で開く"

[HKEY_CLASSES_ROOT\Directory\Background\shell\open_wz_mintty\command]
@="C:\\cygwin\\bin\\mintty.exe --dir \"%V\" -"

上記、C:\\cygwinの部分は、あなたのcygwinをインストールしたフォルダに修正して使用してください。コンテキストメニューが文字化けしている場合、ファイル保存時の文字コードを確認してください。Shift-JISやCP-932(Notepadの場合ですと、ANSI)であることを確認してください。

なお、HKEY_CLASSES_ROOT\Directory\Backgroundは、フォルダの何もないところを右クリックしたときの動きです。

ちなみにminttyではなく、Windowsフォルダの右クリックメニューからcmd.exe(コマンドプロンプト)を起動できるようにする場合は次の通りです。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\open_wz_cmd]
@="cmd で開く"

[HKEY_CLASSES_ROOT\Directory\Background\shell\open_wz_cmd\command]
@="cmd.exe \"%V\""

[HKEY_CLASSES_ROOT\Directory\shell\open_wz_cmd]
@="cmd で開く"

[HKEY_CLASSES_ROOT\Directory\shell\open_wz_cmd\command]
@="cmd.exe /k cd \"%V\""
Program(|mer|ming) | 20:44 | comments(0) | - | - | - |
Windowsにて高速にファイルをバックアップするコマンド

Windowsにてファイルをバックアップするコマンドです。Windowsサーバーを含むWindowsの範囲では高速です。

robocopy <同期元フォルダ> <同期先フォルダ> /e /b /z /r:1 /w:1

/e 空のディレクトリを含むサブディレクトリをコピーします。 /b 多少アクセス権がなくてもコピーだけはするモードです。 詳しくは、ググってください。 /z レジューム可能なモードです。何らかの原因でバックアップが中断・停止した場合でも、最初からではなく途中から再開できます。 バックアップ用途よりも、重いファイルをサーバーから取得する用途で重宝します。 /r コピーに失敗したときにリトライする回数です。 デフォルトが百万回のため、大量に同期するときにこれを指定しないと終わらないことがあります。 /w リトライ時間間隔です。 デフォルトが30秒のため、大量に同期するときにこれを指定しないと終わらないことがあります。

e.g. 以下のコマンドは、C:\xフォルダ下のファイル群をC:\yフォルダ下に同期します。例えば、C:\x\aは、C:\y\aにコピーされます。

robocopy C:\x C:\y /e /b /z /r:1 /w:1

e.g. 以下のコマンドは、\\\\a_server\xフォルダ下のファイル群をC:\yフォルダ下に同期します。例えば、\\\\a_server\x\aは、C:\y\aにコピーされます。

robocopy \\a_server\x C:\y /e /b /z /r:1 /w:1

完全同期するコマンドは、上記/e/mirに置き換えた以下のコマンドです。同期元フォルダに存在しないフォルダやファイルを確認なしで削除しますので、十分テストした上で使用してください。

robocopy <同期元フォルダ> <同期先フォルダ> /mir /b /z /r:1 /w:1
Program(|mer|ming) | 22:45 | comments(0) | - | - | - |
ロリポップサーバーでのSSH接続と自動ログイン方法
ロリポップサーバーでのSSH接続と自動ログイン(パスワード毎回入力不要)を、本記事に示す一連のコマンドで一気に実現します。前提として、スタンダードプラン以上でSSHを有効にしてください。Windowsでは、CygwinやWSLなどを使用します。
# ローカル側での作業です。
mkdir ~/.ssh
chmod 700 ~/.ssh
echo 'HostKeyAlgorithms ssh-rsa' >> ~/.ssh/config
echo 'PubkeyAcceptedKeyTypes +ssh-rsa' >> ~/.ssh/config
echo 'UpdateHostKeys no' >> ~/.ssh/config
ssh-keygen -t rsa
# 公開鍵をサーバーへ転送します。
scp -P 2222 ~/.ssh/id_rsa.pub <アカウント名>@<サーバー名>:
	# パスワードを入力します。
ssh <アカウント名>@<サーバー名> -p 2222
	# パスワードを入力します。
# ここからサーバー側での作業です。
mkdir ~/.ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
rm id_rsa.pub
exit
# ここからローカル側での作業です。
# 再度以下を実行しパスワードを求められなかったら、自動ログイン成功です。
ssh <アカウント名>@<サーバー名> -p 2222

上記まででSSH接続と、自動ログインができるはずです。

ここからは応用です。ローカル側からサーバー側へファイル完全同期(rsync -av --delete)するのは以下のコマンドです。完全同期が圧倒的速さ(WinSCPの同期コマンドで5分くらい掛かっていたのが、数秒レベルに!)で終わります。ただし、コマンドを間違うとすべてを失い兼ねませんので、下記コマンドに--dry-run(実際に転送を行わない)を付けています。特に、<ローカル側パス><サーバー側パス>の末尾のスラッシュ有無に気を付けてください。

rsync -av --delete --dry-run -e 'ssh -p 2222' <ローカル側パス> <アカウント名>@<サーバー名>:<サーバー側パス>

具体例:

rsync -av --delete --dry-run -e 'ssh -p 2222' ~/local_homepage/ lolipop.jp-dp01234567@ssh.lolipop.jp:~/web
Web制作 | 10:33 | comments(0) | - | - | - |
Google Code-Prettify for IEC 61131-3

Sample of Google Code-Prettify for IEC 61131-3 Sample of Google Code-Prettify for IEC 61131-3

FA(Factory Automation)のプログラミング言語の国際規格であるIEC 61131-3のGoogle Code-Prettifyのソースコードです。IEC 61131-3のソースコードを読みやすく色分け表示します。

ソースコード: Google Code-Prettify for IEC 61131-3

使い方は簡単です。以下のようにscriptを読み込む2行を記述し、IEC 61131-3のソースコードをclassにprettyprint lang-iec_61131_3を指定したpreタグ内に記述します。scriptファイルは必要に応じて、ダウンロードして使用してください。

実際の例は、IEC 61131-3 ST言語や、Sample of Google Code-Prettify for IEC 61131-3を参照ください。

...
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script>
<script src="https://www.graviness.com/js/google_code-prettify/lang-iec_61131_3.js"></script>
...
<pre class="prettyprint linenums lang-iec_61131_3">
// ここにIEC 61131-3のソースコードを記述します。
</pre>

日本のIEC 61131-3のユーザ数かつ、Google Code-Prettifyを認知している人数かつ、認知していても検索して見つかるとは思ってもいないという意味で、ここに訪れた人は超レアと思います。コメントください笑

JUGEMテーマ:学問・学校

IEC 61131-3 | 23:35 | comments(0) | - | - | - |
IEC 61131-3 ST言語

IEC 61131-3 ST言語
FA(Factory Automatin)のプログラミング言語であるIEC 61131-3 ST言語のページを作成しました。IEC 61131-3 ST言語についての詳しい情報を記載していきます。

IEC 61131-3の普及に少しでもお役に立てればと思っていますが、まだ工事中ばかりです。IEC 61131-3規格は膨大ですので、このページもゆっくり更新していきます。更新履歴は、本ブログに記載していきます。

更新履歴

2023/10/18
VAR_CONFIG、プラグマについて書きました。
2023/9/24
部分アクセス演算子について書きました。
2023/4/1
演算子の一覧表、制御文の目次を書きました。
2023/3/5
可変長配列、構造体の初期化、配列の初期化について書きました。
2022/11/11
基本データ型と列挙型について書きました。
2022/10/2
コンテンツ「IEC 61131-3 ST言語」をリリースしました。
IEC 61131-3 | 18:20 | comments(0) | - | - | - |
Youtubeの高く評価した動画を一括自動削除する方法

先日、私のYoutubeの「高く評価した動画」がリアルタイムで増えていく現象に遭遇しました😨。現象に気づく以前にも増え続けていたようで、身に覚えない海外の「高く評価した動画」が5000件以上登録されていました。

アカウント乗っ取られた!?とも思いましたが、、、Googleのアクティビティ確認しても不正なものは見当たりませんでした。

原因は、Webブラウザのある拡張アプリであり、その拡張アプリをインストールすると、Webブラウザを開くだけで、バックグラウンドで、高く評価した動画をYouTubeに登録し続けるようになっていました。(※見に覚えのない動画の「閲覧履歴」もリアルタイムで増えていました😨)

当該拡張アプリを無効にすることにより、「高く評価した動画」が増えていく現象はなくなりましたが、、、問題は、5000件以上登録された「高く評価した動画」群が残っていることです。

本投稿時点で、Youtubeに「高く評価した動画」を一括削除する機能はありません。一つの「高く評価した動画」をWebブラウザ上から消すのに、2クリック必要です(高く評価した動画のケバブボタンクリックし、その後削除をクリック)。5000件以上の削除なんてやってられん、ということで、「高く評価した動画」を自動で削除するプログラムを準備しました(以下)。

const DELAY_AFTER_CLICK = 100;const INTERVAL_ITEMS = 500;function remove(ls) {	ls.forEach(function(l, i) {		setTimeout(function() {			l.click();			setTimeout(function() {				Array.from(document.querySelectorAll('yt-formatted-string.ytd-menu-service-item-renderer')).pop().click();				l._touched = true;			}, DELAY_AFTER_CLICK);		}, i * INTERVAL_ITEMS);	});	return ls.length * INTERVAL_ITEMS + 1;}function removeAll() {	const ls = Array.from(document.querySelectorAll('ytd-playlist-video-renderer.ytd-playlist-video-list-renderer yt-icon.ytd-menu-renderer')).filter(function(l) {return (l._touched === void 0);});	if(ls.length == 0)		scrollBy(0, 100 * 512);	setTimeout(function() {removeAll();}, remove(ls));}removeAll();

このプログラムは、「YouTube アカウント単位で高く評価した動画をまとめて一括削除する方法」のプログラムの改良版です。当該サイトのプログラムよりも自動化されていて、一度に表示できない量の動画一覧についてもプログラムで自動スクロールして次々と登録を削除していきます。使い方も当該サイトを参考にしてください。

※本プログラムは、Youtubeが出力するデータに依存しており、Youtubeのアップデートにより本プログラムが正常に動作しなくなる可能性があります。

Web | 14:29 | comments(0) | - | - | - |
[Python] XML要素の行番号を付加・取得する ( xml.etree.ElementTree を使用)
Python の xml.etree.ElementTree にて、XML要素の行番号を付加するプログラムです。パース後、各XML要素から行番号を取得できます。
line_numbering_xml_parser.py
import sys
# see https://stackoverflow.com/questions/6949395/is-there-a-way-to-get-a-line-number-from-an-elementtree-element
sys.modules['_elementtree'] = None
import xml.etree.ElementTree as ET

class LineNumberingXMLParser(ET.XMLParser):
	def _start(self, *args, **kwargs):
		e = super(self.__class__, self)._start(*args, **kwargs)
		e._start_line_number = self.parser.CurrentLineNumber
		e._start_column_number = self.parser.CurrentColumnNumber
		e._start_byte_index = self.parser.CurrentByteIndex
		return e

	def _end(self, *args, **kwargs):
		e = super(self.__class__, self)._end(*args, **kwargs)
		e._end_line_number = self.parser.CurrentLineNumber
		e._end_column_number = self.parser.CurrentColumnNumber
		e._end_byte_index = self.parser.CurrentByteIndex
		return e

def walk(node):
	print(f"{node.tag}:{node._start_line_number}.{node._start_column_number}")
	for child_node in node:
		walk(child_node)

if __name__ == '__main__':
	tree = ET.parse('./sample.xml', parser=LineNumberingXMLParser())
	node = tree.getroot()
	walk(node)
sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<note>
	<to>Tove</to>
	<from>Jani</from>
	<heading>Reminder</heading>
	<body>Don't forget me this weekend!</body>
</note>
実行結果
$ python3 line_numbering_xml_parser.py
note:2.0
to:3.2
from:4.2
heading:5.2
body:6.2
xml.etree.ElementTree.parseメソッド呼び出しで、行番号対応しているparser(LineNumberingXMLParser)を指定することがポイントです。

JUGEMテーマ:コンピュータ

Program(|mer|ming) | 19:27 | comments(0) | - | - | - |
Easy statistics 〜すぐに使えるデータの可視化・分析ツール〜

Easy statistics 〜すぐに使えるデータの可視化・分析ツール〜 Easy statistics 〜すぐに使えるデータの可視化・分析ツール〜 Easy statistics 〜すぐに使えるデータの可視化・分析ツール〜 Easy statistics 〜すぐに使えるデータの可視化・分析ツール〜

Easy statisticsはすぐに使えるデータの可視化・分析ツールです。データの箱ひげ図、散布図、ヒストグラム、主要な統計量、SPLOM、回帰分析結果、およびt検定などの各種検定結果をまとめて表示します。

使い方は、データを入力して、[Generate]ボタンを押すだけです。本ツールの特徴は、縦方向・横方向を気にせずに適当にデータを入力しても、それなりに解釈して結果を表示することです。これにより、データがあれば、すぐに可視化することができます。複数データ群に対応しています。

機能

データが2群以上のとき、上記に加えて次を表示します。

  • 散布図行列(SPLOM)・相関行列。相関係数(Correlation)、単回帰直線、および決定係数(寄与度、Contribution rate)も併記します。
  • 重回帰分析結果。線形重回帰式、選定基準としての決定係数(寄与率)、自由度修正済決定係数、対数尤度、AIC、exact AIC、BIC、F値、RMSE、MAE、MAPEの値。
  • バートレット検定(Bartlett test)(等分散性の検定)の結果。p値が小さいとき、母分散は異なる可能性が高いです。
  • 一元配置分散分析(ANOVA)の結果。p値が小さいとき、母平均は異なる可能性が高いです。
  • データの対応のある一元配置分散分析(Paired ANOVA)の結果。p値が小さいとき、母平均は異なる可能性が高いです。

データが2群のとき、さらに次を表示します。

データの入力方法

データの入力方法について、区切り文字には、タブ、コンマ、又は空白を使用できます。表示サンプルの"sample1"や"sample2"のようにデータセットの名前を入力することができます。データセットの名前を"y"や"〜:y"、又は"y:〜"とすると、当該データを目的変数とする重回帰分析を行います。

ソースコードについて

本ツールは、以下の3つのライブラリを使用しています。

また、シャピロ・ウィルク検定はR言語のソースコードから、ランクの計算はPython言語のソースコードから、など一部のJavaScriptソースコードは、他言語のライブラリから移植しています。

更新履歴

  • 2023/04/16 統計量に、範囲を追加した。各結果の説明文をデフォルトOFFにした。出力する項目を選択できるようにした(デフォルト全て出力)。
  • 2023/04/01 統計量に、最頻値、四分位数を追加した。
  • 2023/03/18 統計量、線形回帰分析の結果の説明を強化。説明部の数式にMathJaxを使用。統計量に、幾何平均、調和平均を追加。
  • 2022/11/06 入力データのリバース機能、常用対数適用機能、10の冪乗関数適用機能を追加した。
  • 2022/10/30 Excelからコピペしたときに区切り文字の推測を間違えて解析エラーになるのを解消した。
  • 2022/1/6 重回帰式において、総当たり法の結果を表示するようにした(Table. All variables combination)。標準化残差の絶対値が大きいセルを色付きで表示するようにした。
  • 2021/11/14 90%や95%など、信頼係数を選択できるようにした。散布図行列で、真の回帰式の信頼区間を表示するようにした。重回帰式で、予測値の信頼区間を表示するようにした。テコ比、自由度二重調整済決定係数を表示するようにした。
  • 2021/10/31 母平均・母分散の信頼区間、データの対応のある一元配置分散分析、バートレット検定、データの対応のないt検定、回帰分析(線形単回帰式・線形重回帰式)に対応した。入力データにlog・expを適用する機能に対応した。
  • 2021/10/24 データの対応がない場合の一元配置分散分析に対応した。
  • 2021/10/17 利用可能な入力データのパターンを増やした。入力データが利用不可能なときにエラーを表示するようにした。入力データの転置(Transpose)機能に対応した。散布図行列に対応した。
  • 2021/9/18 モバイル時の表示を最適化した。サンプルのデータ数が不揃いのときに対応した。半角スペース区切りに対応した。
  • 2021/7/27 Easy statisticsをリリースしました。
統計 | 17:36 | comments(0) | - | - | - |
文字参照変換のJavaScript実装

文字参照変換のJavaScript実装です。

文字参照変換のJavaScriptソースコード
/**
 * Encode character references.
 *
 * e.g.
 *     encodeCER('<a>')  --> '&#x3C;&#x61;&#x3E;'
 *     encodeCER("<\n>") --> '&#x3C;&#xA;&#x3E;'
 *     encodeCER('叱') --> '&#x53F1;'
 *     encodeCER('𠮟') --> '&#x20B9F;' // Support surrogate pairs.
 *     encodeCER("\x00") --> '&#x0;'
 *     encodeCER('<a>', {dec: true}) --> '&#60;&#97;&#62;'
 *     encodeCER('<a>', {sym: true}) --> '&lt;&#x61;&gt;'
 */
function encodeCER(x [, options]) {...}

/**
 * Decode character references.
 *
 * e.g.
 *     decodeCER('&#x3C;d&#105;v&gt;') --> '<div>'
 *     decodeCER('&none;') --> '&none;'
 *     decodeCER('&lt;') --> '<'
 *     decodeCER('&LT;') --> '<'
 *     decodeCER('&Lt;') --> '≪'
 *     decodeCER('&lT;') --> '<lT;'
 *     decodeCER('&#x53F1;') --> '叱'
 *     decodeCER('&#x20B9F;') --> '𠮟' // Support surrogate pairs.
 *     decodeCER('&lt;&none;&gt;', err = {})
 *         --> '<&none;>', err[10] === 'unknown symbol name.' // Output the error causes and positions.
 */
function decodeCER(x [, errors]) {...}

JavaScriptソースコード

https://www.graviness.com/app/charref/charref.js

ソースコードには、エンコード・デコードの二つの関数 encodeCER, decodeCER があります。10進数値文字参照(e.g. &#60;)、16進数値文字(e.g. &#x3C;)、文字実体参照(e.g. &lt;)や、サロゲートペアにも対応しています。文字実体参照の対応表は、13.5 Named character references@WHATWGを参照しました。

なお、デコード関数(decodeCER)は入力文字列の構文や文字実体参照等が間違っていても処理を停止せず、それなりの文字列を返しますが、error引数により、間違っていた箇所や原因を知ることができます。

Webツール 文字参照変換器

文字参照変換器
本実装を活用したWebツール「文字参照変換器」も作成しました。活用ください。

続きを読む >>
Web制作 | 23:46 | comments(0) | - | - | - |
住宅ローン借り入れにおいて頭金にするか投資するか

※本記事は、数学は好きですが算数とお金の計算は苦手な著者(優乃)が道楽で書いています。作成には慎重を期しておりますが演算結果を保証するものではありません。特に、結果は本記事のパラメータにより大きく変わります。

住宅ローンを組むときに、手持ち資金を頭金するのが良いのか、頭金にせずに投資して資産運用するのが良いのかは、難しい問題です。本記事では、それを数式で表して比較してみます。

最初に結論を書くと、何が良いかはケース・バイ・ケースです。簡単なパラメータ入力をもとに計算するリンクを作ったので、何が良さそうかは自身のケースで試してみてください。

JUGEMテーマ:経済全般

続きを読む >>
- | 22:21 | comments(0) | - | - | - |
書籍: 数値データ適合分布 一般化ラムダ分布の利用

書籍「数値データ適合分布 一般化ラムダ分布の利用」を読みました。

ざっくり言うと「未知の数値データ群を近似する確率密度関数が求めたいケースなどにおいて、様々な形(確率密度関数の形状)を表現できる一般化ラムダ関数をおすすめする。そして、一般化ラムダ関数の同定における尤度関数値の最大化では、いわゆる平均値や分散値などを用いるのではなく、L積率という代表値を用いることにより方程式が数値解析せずに解くことができるからおすすめするよ。」ということです。

本書は、数式の展開は比較的丁寧な印象です。私的には、次の概念や公式を得ることができました。

* 分布が既知のある数値データ群を小さい(大きい)順に並べた順序統計量について、k番目や中央値等の期待値を元の分布関数から求めることができること。

* 平均値や分散値に似た特性をもつL積率という統計量。

特に分散や尖度、歪度など分布の特徴を表す数値が、積率等の要約した値の線形結合になっているので、恐らく何らかの代表値を線形結合した値も意味があるだろうと、順序統計量を線形結合したL積率という値を定義している考え方も興味深かったです。

元の分布が不明な場合において、分布を近似する式を知りたいケースで活用できると思われます。さらに発展させて、最小値や最大値を知るために極値統計学とつなげてみたいですね。

JUGEMテーマ:学問・学校

感想 | 22:09 | comments(0) | - | - | - |
パスワード用のランダムな文字列を表示するWebツール - Random String for Password

パスワード用のランダムな文字列
パスワード用ランダム文字列(Random String for Password)

更新するたびにランダムな文字列を表示するWebツールです。パスワードや暗証番号など用途に合わせて、任意の長さの文字列部分を選択して使用してください。

表示されているランダムな文字列は、あなたのパソコンで暗号強度の強い乱数値 (window.crypto.getRandomValues)を使用し生成されています。ネットワーク上にデータが流れることもありませんので、安全に使用できます。

仕様

  • 選択した文字列部分のパスワード強度を10段階で表示します。
    • パスワードの強度の値は、zxcvbnを使用し、Math.min(1.0, Math.max(0.0, (zxcvbn(password).guesses_log10 - 2) / 10))で得ます。詳細は、passwordStrength関数@applib.jsを参照ください。
  • 文字列を選択すると即座にクリップボードへコピーします。
  • 表示される文字列群は、特性の異なる3つのブロックがあります。上から順に次の規則があります。
    • アルファベット大文字・小文字・数字で構成されます。ただし、似ている文字(2ZzDOo0Q9qgadSsCcVvUuWwKkXx8B6bI1lji)を含みません。
    • 数字のみで構成されます。
    • アルファベット大文字・小文字・数字・記号文字(!#$%&()*+-<=>?@_)で構成されます。ただし、似ている文字(2ZzDOo0Q9qgadSsCcVvUuWwKkXx8B6bI1l|/\ji;:,."'`^~)を含みません。

動機

とにかくランダムな文字列を得たい目的で訪れるユーザにとっては、大量のランダム文字から好きなところを選ぶほうが早くて便利ではないかと考え、このアプリを作りました。選ぶと同時にパスワードとしての強度を表示するので確実で安心です。

更新履歴

  • 似ている文字の定義を変更。1Il|/\OoQ92Zz[{]}"'^`~:;,. --> 2ZzDOo0Q9qgadSsCcVvUuWwKkXx8B6bI1l|/\ji;:,."'`^~

関連情報

JUGEMテーマ:インターネット

続きを読む >>
Web制作 | 22:14 | comments(0) | - | - | - |
個人WebサイトのGoogle AdSense審査に合格した私の方法

Google AdSenseの審査について検索すると個人Blogの対策方法は載っていますが、個人Webサイトの対策方法はあまり見かけませんでした。

私の個人Webサイトのgraviness.comについて、再審査で合格したのでその記録を記載します。時系列は次の通りです。

  • 1月2日、Google AdSenseの審査申し込む。
  • 1月4日、不合格通知届く(理由: 価値の低い広告枠)。
  • 1月10日、graviness.comのサイト全体に手を加える。
  • 1月13日、再度Google AdSenseの審査申し込む。
  • 1月15日、合格通知届く。

上記の1月10日に、どう手を加えたから審査に合格したのか。手を加えた内容は以下の通りです。

  1. graviness.com内のすべてのhtmlファイルにGoogle AdSenseコードを記述していたのを主要なhtmlファイルに絞って記述した。
  2. graviness.comのトップ頁について、作成中、と書いていたのを削除した。
  3. すべてのhtmlファイルについて、metaタグのcopyrightを正しく記載しなおした。
  4. すべてのhtmlファイルについて、管理者のe-mailアドレスや、管理者の名前の表記が揺れていたのを統一した。

おそらく一番効いたのは、"1"です。例えば、JavaScript Samplesの個々のコンテンツにもGoogle AdSenseコードを(自動)挿入していたので、"価値の低い広告枠"を含む頁が大量に検出され、総合的にも"価値の低い広告枠"と判定されたのだと思います。

そして、"2"です。審査対象のトップページにいきなり"このサイトは作成途中です"なんて堂々と書いていたらアカンですよね笑

以上、Blogでない個人WebサイトでGoogle AdSenseの審査に合格した記録でした。ご参考まで。

JUGEMテーマ:インターネット

Web | 18:00 | comments(0) | - | - | - |
微分方程式 f'(x) = f(x+1) を解く話

表題の「微分方程式 \( f'(x)=f(x+1) \)」は超超基礎的な「微分方程式 \( f'(x)=f(x) \)」の一箇所だけを変えた方程式です。もちろん\( f'(x)=f(x) \)の解は、\( f(x)=Ae^{x} \)です。表題の式もこのノリで解いてみましょう。\( y=f(x) \)と表記すると表題の式は

\[ \frac{dy}{dx}=y(x+1) \]

と表記でき、ここで、\( z=x+1 \)とおくと、合成関数の微分より\( \frac{dy}{dx}=\frac{dy}{dz}\frac{dz}{dx} \)なので

\[ \begin{align*}\frac{dy}{dz}\frac{dz}{dx}&=y(z)\\\therefore\frac{dy}{dz}&=y(z)\;\because\frac{dz}{dx}=1\\\therefore y&=Ae^{z}\\\therefore f(z)&=Ae^z\ \\\therefore f(x+1)&=Ae^{x+1}\\\therefore f(x)&=Ae^x \end{align*} \]

んっ?!?!?!?!?!

「微分方程式 \( f'(x)=f(x) \)」の解と同じになってしまいました。もちろん、これは正しい式ではありません。実際代入してみると、\( f'(x)=Ae^{x},\;f(x+1)=Ae^{x+1} \)となり両辺は等しくありません。

※上記操作のどこが間違っているのかは依然として分かっていません。どなたか、どこが間違っているのか教えてください!

さて、\( f'(x)=f(x+1) \)は簡単には解けないことが分かりました。表題の式は超超基本的な微分方程式を\( +1 \)だけずらしていることがポイントですが、少しずらした値とそのときの傾きが等しいことを考えると、実は\( +1 \)を\( +\pi / 2 \)に変えた微分方程式の解について下式が成り立つことが分かります。

\[ f(x)=A\cos(x)\rightarrow f'(x)=f\left(x+\frac{\pi}{2}\right) \]

実際、\( 左辺 = f'(x)=-A\sin(x) \)、\( 右辺 = f(x+\pi/2)=A\cos(x+\pi/2)=-A\sin(x) \)となり両辺は等しく成り立ちます。これをヒントにx軸でスケーリングするなど、\( +1 \)に関連する定周期の周期関数を考えればうまくいくかと思えば、、、これもうまくいきません。

私は「ただ\( +1 \)だけずれているだけで、値とそのときの微分の値が等しい関数なので、ネイピア数を底とする指数関数が関連しているだろう」と推測し、\( f(x)=Ae^{Bx} \)の形式で表題の式が成り立つ\( A,B \)を求めるアプローチとしました。

前置きが非常に長くなりました。以降で表題の式を一般化した次の微分方程式の解を導出します。

\[ f'(x)=af(x+b) \]

JUGEMテーマ:学問・学校

続きを読む >>
数学/算数 | 10:44 | comments(2) | - | - | - |
Webブラウザ互換性向上をサポートするpolyfill.io

https://polyfill.io/は、あるWebブラウザが未実装の規格関数の実装を提供する。

Web作成者側で、あるWebブラウザが未サポートの関数があるために互換性が損なわれるのであれば、例えば、Internet ExplorerはArray.fromメソッドが未サポートなので、この場合、次のようにHTMLに記述するだけで良い。

<script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from"></script>

polyfill.min.jsにArray.fromに実装が記述されているため、Internet Explorerであっても互換性が保たれる。

ここでは、Array.fromを未サポートのInternet Explorerのケースを示した。では、その他のサポート済ブラウザではpolyfill.min.jsはどうなるかというと、内容は空である。サポート済ブラウザを使うユーザに対して品質に影響はない。

Ref. Create a pollyfill bundle@https://polyfill.io/

JUGEMテーマ:インターネット

Web制作 | 23:48 | comments(0) | - | - | - |
cygwin環境のgitで差分確認にWinMergeを使う

cygwin環境のgitにおいて、差分をWinMergeで確認できるようにするには.gitconfigファイルに次を追加する。

[diff]
	tool = windiff
[difftool "windiff"]
	cmd = ¥"C:/Program Files/WinMerge/WinMergeU.exe¥" -r -u -x -e -wl -wr -dl "Local" -dr "Remote" ¥"`cygpath -am ¥"$LOCAL¥"`¥" ¥"`cygpath -am ¥"$REMOTE¥"`¥"
[alias]
	wd = difftool --no-symlinks --no-prompt --dir-diff --tool=windiff

あとはcygwin上でgit wdと打つとWinMergeが起動し、変更前が左側ペイン、変更後が右側ペインに表示される。


JUGEMテーマ:コンピュータ


Program(|mer|ming) | 18:34 | comments(0) | - | - | - |

(C) 2024 ブログ JUGEM Some Rights Reserved.