2018年10月14日日曜日

JavaScriptで10進数と16進数を変換する方法

JavaScriptで10進数と16進数を変換する方法を紹介します。

まず、16進数を、10進数に変換する方法です。
以下のサンプルコードでは、16進数の"DB"や"0A"を、10進数に変換しています。
    var a = parseInt("DB", 16);
    var b = parseInt("0A", 16);

次に、10進数の数値を16進数の文字列に変換します。
以下のサンプルコードでは、intの変数aを、16進数の文字列に変換しています。
    var c = a.toString(16);

結果、変数cには、16進数の文字列が格納されます。

JavaScriptでExcelファイルを読み込む方法

JavaScriptでエクセルファイルを処理して、分析したい場合があります。その方法を紹介します。

エクセルを処理するライブラリは色々と公開されていますが、以下のサイトで公開されている xlsx.full.min.js を使うことにします。
https://github.com/SheetJS/js-xlsx

以下がサンプルコードです。

// エクセルファイルを処理する関数。inputタグでファイルを受け取り、jQueryのイベントeとして受け取る想定。
function parseExcel(e) {
    var files = e.target.files;
    var file = files[0];
    var reader = new FileReader();
    reader.onload = function (e) {
        var data = e.target.result;
        var wb;
        var arr = fixdata(data);
        wb = X.read(btoa(arr), {
            type: 'base64',
            cellDates: true,
        });
        var output = to_json(wb); // 変数outputにJSON形式のデータが格納される。

        // ここから、JSON形式になったエクセルのデータを処理可能
    };
    reader.readAsArrayBuffer(file);
}

function fixdata(data) {
    var o = "",
        l = 0,
        w = 10240;
    for (; l < data.byteLength / w; ++l) {
 o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
    }
    o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
    return o;
}

function to_json(workbook) {
    var result = {};
    workbook.SheetNames.forEach(function (sheetName) {
        var roa = X.utils.sheet_to_json(
            workbook.Sheets[sheetName],
            {
                raw: true,
            });
        if (roa.length > 0) {
            result[sheetName] = roa;
        }
    });
    return result;
}
fixdataとto_jsonは、おまじないだと思ってもよいでしょう。

正常に処理できれば、変数outputに、JSON形式に変換されたエクセルデータが格納されます。

一度、console.logなどで変換されたデータを出力してみれば、どのような形でデータにアクセスすればよいかが、わかるでしょう。

これで、JavaScriptの豊富なプレゼンテーションライブラリを使い、エクセルデータを可視化することができます!

2018年10月2日火曜日

pukiwikiで、添付できるファイルのサイズを増やす方法

pukiwiki 1.5.1です。

pukiwikiは、デフォルトで、添付できるファイルの最大サイズは2MBです。いまどき2MBなんて、簡単に超えてしまいます。添付できるファイルの最大サイズを増やすためには、phpとpukiwikiの両方の設定変更が必要です。以下、Linuxにpukiwikiをインストールしたという前提で、添付できるサイズを100MBにする方法を説明します。

phpの設定

/etc/phpディレクトリ以下に、post_max_sizeというパラメータや、upload_max_filesizeというパラメータが書かれているphp.iniファイルがいくつかあります。以下、grepコマンドで、ファイルを検索してみます。
$ grep -R post_max  /etc/php/7.0/*
/etc/php/7.0/apache2/php.ini:post_max_size = 100M
/etc/php/7.0/cli/php.ini:post_max_size = 100M
/etc/php/7.0/fpm/php.ini:post_max_size = 100M
$ grep -R max_filesize  /etc/php/7.0/*
/etc/php/7.0/apache2/php.ini:upload_max_filesize = 100M
/etc/php/7.0/cli/php.ini:upload_max_filesize = 100M
/etc/php/7.0/fpm/php.ini:upload_max_filesize = 100M
上記のように、全て 100M という値に設定しましょう。

pukiwikiの設定

pukiwikiの設定は、plugin/attach.inc.phpで行います。 以下のように、upload_max_filesizeパラメータと、PLUGIN_ATTACH_MAX_FILESIZEパラメータを、100MBに設定しましょう。
ini_set('upload_max_filesize', '100M');

// Max file size for upload on script of PukiWikiX_FILESIZE
define('PLUGIN_ATTACH_MAX_FILESIZE', (1024 * 1024 * 1024)); // default: 100MB

これで、100MBのファイルを添付できるようになりました。もちろん200MBでも300MBでも大丈夫だと思います。そこはお好きなように設定してください。

2018年10月1日月曜日

Pythonで、.pycファイルや__pycache__ディレクトリを作らないようにする方法

Pythonはデフォルトで、クラスファイルをコンパイルした .pyc ファイルを作ります。Python 3系だと、__pycache__ディレクトリを自動的に作成して、その下に .pyc ファイルを作ります。

一度 .pyc ファイルを作っておけば、次回から、スクリプトの実行が少し速くなります。

ただし、スクリプトをこまめに変更する場合は、結局毎回コンパイルするので、あまり .pyc ファイルを保存しておく意味がありません。また、ディレクトリに勝手にファイルやディレクトリを作られると、ちょっとうざいです。git statusとかすると、untrackedなファイルとして表示されたりしますし。gitignoreしておけばいいのかもしれませんが、、、

ともかく、勝手にファイルやディレクトリを作ってほしくない場合は、環境変数に以下を追加しましょう。
export PYTHONDONTWRITEBYTECODE=1
これで、.pycファイルが作られなくなります。

bashを使っている場合は、.bashrcファイルの最後のあたりに、上記の設定を追加しておきましょう。これで、ログインしなおせばOKです。byobuとかscreenを使ってる場合は、一度terminateして、もう一度byobuscreenを実行しましょう。


2018年9月30日日曜日

Pythonで最大値や最小値を求める方法

Pythonで最大値や最小値を求める方法を説明します。

Pythonにはmaxminという関数がデフォルトで用意されており、これらの関数を使うことで、最大値や最小値を求めることができます。

以下がサンプルコードです。

print(max(1, 5))
print(max(10, 5, -3))

print(min(1, 5))
print(min(10, 5, -3))
これを実行すると、以下のようになります。
$ python hoge.py
5
10
1
-3
最大値や最小値が求められていることがわかります。

ちなみに、以下のように、配列を渡すこともできます。
print(max([1, 3, 5, 2]))

上記のコードを実行すると、5が出力されます。

Pythonで時間を測る方法

Pythonで時間を測る方法を紹介します。

ある処理にかかる時間を計測するための簡単な方法は、timeモジュールを使う方法です。以下がサンプルコードです。

import time

start = time.time() # 開始時刻

# 何かしらの処理
#  :
#  :

elapsedTime = time.time() - start
print("経過時間 " + str(elapsedTime) + " 秒")

これで、「何かしらの処理」にかかった時間を、単位=秒で計測できます。

上記のコードは、Python 3.5で動作を確認しています。

2018年9月22日土曜日

Windws 10で、マウスホイールの方向を逆にする方法

Windws 10で、マウスホイールの方向を逆にする方法を紹介します。

最近はスマホの操作になれたこともあって、マウスホイールを上に回したら、下にスクロールしてくれないと気持ち悪いです。でも、ふつうにUSBマウスをパソコンにつなぐと、上に回したら上スクロールします。というわけで、逆にする方法を紹介します。
  • ウィンドウズボタン+Xを押して、デバイスマネージャを選択
  • マウスのプロパティを選択
  • 詳細タブを選択
  • プロパティとしてハードウェアIDを選択
  • ハードウェアIDを確認(VID_XXX&PID_XXXXという値)
  • ウィンドウズボタン+Xを押して、ファイル名を指定して実行を選択
  • regedit と入力し、レジストリエディターを起動。
  • HKEY_LOCAL_MACHINE → SYSTEM → CurrentControlSet → Enum → HID → 確認したハードウェアIDのフォルダ、の順でフォルダを開いていく。
  • さらに、謎の数字が羅列してあるフォルダの下にあるDevice Parametersをクリック
  • 右側に表示されるパラメータのFlipFlopWheelを右クリックして、修正を選択
  • 値のデータ1にして、OKをクリック
  • レジストリエディターを閉じる
  • USBマウスを抜いて、挿す。これでホイールの方向が逆になっているはず!

ちなみに、マウスのハードウェアIDは、USBポートごとに異なります。つまり、別の場所にマウスを挿すなら、別途、設定が必要です。

また、ウィンドウズアップデートすると、この設定がリセットされる場合もあります。
その場合も再設定が必要です。←これが、非常にめんどう。。。

2018年2月2日金曜日

ApacheでBasic認証を設定する方法

Apache HTTPサーバを立ち上げたあと、特定のページに認証を設定する方法を紹介します。

Ubuntu 16.04です。

まず、.htpasswdを作成します。.htpasswdは、ユーザ名とパスワードを記録するファイルです。

$ sudo htpasswd -b -m -c .htpasswd username password

これで、カレントディレクトリに .htpasswd が作成されます。上記の username と password は、任意のユーザ名とパスワードを指定してください。

このファイルを/var/www/htmlに置くとします。

次に、Apacheの設定ファイルを編集します。apt-getでインストールしたなら、Apacheの設定ファイルは /etc/apache2/apache2.conf だと思います。

<Directory "/var/www/html/">
        AuthType Basic
        AuthName "Enter username and password"
        AuthUserFile /var/www/html/.htpasswd
        Require user username
</Directory>

このように、認証の種類(Basic)、認証時のダイアログに表示する文章、.htpasswdへのパス、認証するユーザ名を指定します。
Authには、さきほど作成した.htpasswdへのパスを指定しましょう。また、Require userには、.htpasswdファイル作成時に指定したユーザ名を指定しましょう。

これでApacheを再起動して、ブラウザから/var/www/htmlディレクトリにアクセスすると(厳密には、ブラウザから、/var/www/htmlディレクトリにマップされているURLにアクセスすると)、認証ダイアログが表示されます。

Apacheの再起動は以下です。

$ sudo service apache2 restart

2018年2月1日木曜日

Windows 10で画面が真っ黒になった場合の対処法

Windowsアップデートをして、再起動。
そして、ログイン画面にてパスワードを入力。ログインしたら、、、

画面が真っ黒に!

マウスのカーソルは表示されているのですが、画面が真っ黒になりました。

正直、焦りましたが、マウスカーソルは動くので、、、とりあえずCtrl+Alt+Delを押してみました。すると、ちゃんと画面が表示されて、タスクマネージャを実行できました。

真っ暗な画面にタスクマネージャだけが表示されている状況。

タスクマネージャの「ファイル」から、「新しいタスクの実行」を選択し、"control"と入力すると、コントロールパネルを起動できます。今度はコントロールパネルが表示されました!以前として、画面は真っ黒ですが。

コントロールパネルで、「システムとセキュリティ」をクリック。
そして、「コンピュータの一般的な問題のトラブルシューティング」をクリックします。すると、「問題の診断」が実行できます。

僕の場合は、この診断で、「再起動して、Windowsアップデートを再実行してください」というメッセージが出ました。

確かにタスクマネージャを見てると、画面は真っ黒なのに、通信はしてるんですよね。更新用のファイルをダウンロードしてたのかな?

言われた通りに再起動すると、「更新プログラムの適用処理」が実行されて、結果、画面がちゃんと表示されました!良かった~

なお、「問題の診断」する前は、強制終了⇒起動を何回か実行したのですが、そのときは「更新プログラムの適用処理」は始まらなかったです。なので、「問題の診断」を実行したことが、良かったのかもしれません。



mpi4pyを使い、pythonでMPIプログラミング

PythonでMPIを使うライブラリとして、mpi4pyがあります。
その使い方を簡単に紹介します。

インストールは、例えばUbuntuなら以下のようにインストールできます。

$ sudo apt-get install python-mpi4py

mpi4pyを使ったプログラムについて紹介していきます。

from mpi4py import MPI

comm = MPI.COMM_WORLD

rank = comm.Get_rank()
print("rank " + str(rank))

numCores = comm.Get_size()
print("num cores " + str(numCores))

MPI.COMM_WORLDを実行すると、並列処理が始まります。
Get_rankメソッドで、スレッドのID (rank)を取得できます。IDは0始まりです。

if rank == 0:
  xxxx
else:
  yyyy

このように、スレッドIDに応じて処理を分けることができます。
また、Get_sizeメソッドで、いくつのスレッドが実行されているかを取得できます。

スレッド間で同期を取りたい場合は、barrierメソッドを使います。

comm.barrier()

これで、スレッドの処理がここ(barrierメソッドの内部)でいったん止まります。全てのスレッドが、barrierメソッドを呼び出すまで、処理が先に進みません。全てのスレッドがここに到達すると、せーので全スレッドが次の処理に向けて動き出します。

スレッド間でデータを交換する方法として最も単純なのは、sendメソッドとrecvメソッドです。

if rank == 0:
   data1 = 50
   comm.send(data1, dest=1, tag=23)
if rank == 1:
   data2 = comm.recv(source=0, tag=23)

sendメソッドで、データを送れます。上の例では、data1という変数を送っています。どのスレッドに送るかは、IDで指定します。上の例だと、スレッド0からスレッド1に送っています。tagは、交換するデータのIDです。たくさんのデータをやりとりする場合はデータにIDを振っておくと、recvする側は、受け取りたいデータを指定して受け取れます。

recvメソッドでデータを受け取ります。誰から受け取るかを、引数sourceで指定します。上の例だと、スレッド0からのデータ(ID=23)を受け取ろうとします。

これで、スレッド1の変数data2には、50という値が格納されます。

mpi4pyを使ったプログラムは、以下のようにmpiexecコマンドを使って実行できます。
以下は、run-mpi-app.pyというプログラムを、4スレッドで実行する例になります。

mpiexec -n 4 python run-mpi-app.py

pukiwiki 1.5.1で、フォントサイズを変更する方法

pukiwiki 1.5.1をインストールして使っているのですが、デフォルトだと、なんだかちょっと、文字が小さい気がします。僕だけでしょうか。

もう少し文字が大きいほうが目に優しいかな~なんて思うわけです。

pukiwikiのサイト全体のフォントサイズを変更するには、設定ファイルを修正する必要があります。pukiwikiを展開したディレクトリ以下の"skin/pukiwiki.css.php"を修正します。

body,td {
        color:black;
        background-color:white;
        margin-left:2%;
        margin-right:2%;
        font-size:90%;
        font-family:verdana, arial, helvetica, Sans-Serif;
}
pukiwiki.css.phpには、上のようなcssが書かれています。

ここの"font-size"のパーセンテージを変えれば、フォントサイズを変更できます。デフォルトでは90%になっているので、文字を大きくしたければ、例えば100%とかに設定すればOKです。

個人的には95%がちょうどよいです。

フォントサイズを変更するだけで、意外なほどに可視性が向上することもあります。自分にちょうどよいフォントサイズを見つけましょう~。


pukiwiki 1.5.1の管理者パスワードを設定する方法

pukiwikiはPHPとApacheがあれば、すぐに使える便利なwikiソフトです。

デフォルトの状態だと、編集やファイルの添付に、管理者パスワードが必要です。
凍結解除にも、管理者パスワードが必要です。初期状態だと、何を入力しても、パスワードエラーになる設定になっているので、pukiwikiをインストールしあとは、まずは管理者パスワードを設定しましょう。

管理者パスワードの設定は、簡単です。展開後のルートディレクトリにあるpukiwiki.ini.phpで、"adminpass"という変数を設定すればOKです。

初期状態でadminpassは、以下のように設定されています。

$adminpass = '{x-php-md5}!';

これを、例えば、以下のように編集します。
$adminpass = 'pass';

これで、"pass" が、管理者パスワードになります。
これで凍結解除できるはずです。

2018年1月2日火曜日

Python3でプログラムの実行時間を計測する方法

Python3でプログラムの実行時間を計測する方法を紹介します。

以下は、timeモジュールを利用した計測方法です。
import time

start = time.time()
time.sleep(3)
finish = time.time()
print(finish - start)
以下は実行結果です。
3.0009043216705322

time.time()で、タイムスタンプを取得できます(単位は秒)。
計測したい処理の開始前と開始後にtime.time()を実行し、その差を計算すれば、それが実行時間となります。

先ほどのサンプルコードでは、3秒間スリープさせているので、実行時間は、ほぼ3秒になります。

Pythonのfor文

Pythonのfor文の使い方を紹介します。

まず最初に、rangeを使う方法です。
for i in range(3):
    print(i)
実行結果は以下です。
0
1
2
このように、rangeでXを指定すると、0から(X-1)までループします。

次に、もう一つのrangeの使い方。
for i in range(2, 6):
    print(i)
実行結果は以下です。
2
3
4
5
rangeで2つの値(X,Y)を指定すると、Xから(Y-1)までループします。

続いて、リストを使ってループさせる方法。
vals = [1, 5, 7, 9, 11]
for v in vals:
    print(v)
実行結果は以下です。
1
5
7
9
11

リストを指定すると、リストの最初から最後までループします。

Pythonで引数を受け取る方法

Pythonで引数を受け取る方法を紹介します。

Pythonで引数を受け取るには、sysモジュールをimportします。
import sys

def usage_and_exit():
    print("""
USAGE: python test.py [filename]
    """)
    sys.exit(-1)

args = sys.argv
if len(args) != 2:
    usage_and_exit()

filename = args[1]

sys.argvが引数のリストです。
argvの最初の要素(上記プログラムだとargs[0])には、実行中のスクリプトが格納されています。なので、通常、スクリプトの引数は2つ目の要素から格納されることになります。

上記のサンプルコードでは、引数のリストのサイズをチェックして、サイズが2じゃなかったら(引数が1個指定されていない場合)、usageを表示して、プログラムを終了するようにしています。

プログラムの終了は、sys.exitで可能です。

以下は引数を処理するサンプルコードになります。

import sys

# 引数の配列を取得
args = sys.argv

for i, arg in enumerate(args):
    if arg == "-a":
        argA = args[i+1]
    elif arg == "-b":
        argB = args[i+1]
   

sys.argv で、引数の配列を取得できます。そのあと、forループで引数を処理しています。上のサンプルコードの名前が hoge.py だとすると、以下のように実行する想定です。

$ python hoge.py -a 50 -b 100

これで、変数argAに50が、変数argBに100が代入されます。

グラフのデータを作成するプログラム「Rudy」

グラフのデータを作成するプログラム「Rudy」を紹介します。

Stanford大学のStefan E. Karischさんが作成したプログラムで、Stanford大学のウェブサイトからダウンロードできます。gb_lib.crudy.cをダウンロードすればOKです。

readmeに書いてあるように、以下でコンパイルできます。
$ gcc gb_lib.c rudy.c -lm -o rudy

rudyは色々なグラフのデータを作成できます。

以下は、ノード数5の完全グラフを作成する例です (完全グラフとは、全てのノード(vertex)が、全てのノードとつながっている(辺を持つ)グラフのこと)。
$ ./rudy -clique 5
5 10
1 5 4
1 4 3
1 3 2
1 2 1
2 5 3
2 4 2
2 3 1
3 5 2
3 4 1
4 5 1
一行目はノード数とエッジ数です。二行目以降は、[ノードID ノードID エッジの重み]です。ノードIDは1始まりです(0始まりではない)。エッジの重みの最大値は、(ノード数 - 1)で決まります。

以下は、ノード数5の平面グラフを作成する例です (平面グラフとは、辺(エッジ)同士が交差しないグラフのこと)。
$ ./rudy -planar 5 40 3.1415
5 4
1 4 1
1 3 1
2 5 1
3 4 1
40というのは、グラフの密度です。0~100で指定できます。密度が大きいほど、エッジの数が増えます。3.1415というのは、乱数のシード(seed)です。たぶん、適当に指定しても大丈夫です(笑

以下はランダムグラフを作成する例です。
$ ./rudy -rnd_graph 5 60 42221
5 5
1 3 1
1 2 1
2 4 1
3 5 1
4 5 1
引数の意味は、平面グラフのときと同じです(ノード数、密度、シード)。

2017年12月30日土曜日

Python 3で、ファイルの文字列を読み込む方法

Pythonでファイルの文字列を読み込み方法を紹介します。

以下のサンプルコードは、sample.datというファイルを読み込み、一行ずつ出力します。

filename = "sample.dat"

with open(filename) as f:
    line = f.readline().strip() # 一行読み込み、かつ、改行を削除
    while line:
        print(line)
        line = f.readline().strip()

"with open..."でファイルを読み込むことで、いちいちcloseメソッドを呼ばなくても勝手にファイルを閉じてくれます。

また、readline関数で、ファイルを読み込んだ後に、strip関数で改行を削除しています。

Python 3で、組み合わせの一覧を求める方法

Python 3で組み合わせを計算する方法を紹介します。

組み合わせの総数の求め方は、確か、高校で習うはずで、簡単です。たとえば、ここに書いてあります。一方、その全ての組み合わせを求めるアルゴリズムは、少し複雑です。が、Pythonのライブラリを使えば、その複雑さを気にせずに組み合わせを求めることができます。Python最高ですね(笑

以下のサンプルコードでは、組み合わせの候補(4個)から、3個を選択する全ての組み合わせを求めて、出力します。

import itertools

# 組み合わせの候補
s = ['1','2','3','4']

# 組み合わせをもとめて、リストとして取得
patterns = list(itertools.combinations(s, 3));

# 組み合わせを表示
for p in patterns:
    print(p)
実行すると以下が出力されます。
('1', '2', '3')
('1', '2', '4')
('1', '3', '4')
('2', '3', '4')

2017年12月28日木曜日

Microsoft Office PowerPoint 2013でよく使うショートカット

Microsoft Office PowerPointでよく使うショートカットを紹介します。ちなみに、PowerPoint 2013です。

  • Ctrl+s 保存
  • Ctrl+c コピー
  • Ctrl+x 切り取り
  • Ctrl+v 貼り付け
  • Ctrl+z 元に戻す
  • Ctrl+y 同じ操作を繰り返す
  • 図形やテキストボックスを選択してCtrl+Shift+< 文字を小さくする
  • 図形やテキストボックスを選択してCtrl+Shift+> 文字を大きくする

また、以下はショートカットではないですが、よく使うキー操作です。

Shiftを押したまま、図形などをドラッグ&ドロップ -> 真上(真下)、または、真右(真左)のみに図形を動かすことができる(図形が斜めに動かないので、綺麗にスライドできる)。

Ctrlを押したまま、図形などをドラッグ&ドロップ -> 図形をコピーする。

Microsoft Office 2013で、保護ビューを無効にする方法


ネットワークを経由してパワーポイントのファイルを開くと、デフォルトでは、保護モードで開きます。そのため、編集するためには保護モードを解除する必要があります。

保護モードは、セキュリティ上は有効な機能なのかもしれませんが、いちいち保護モードを解除するのがめんどくさい場合もあります。例えば、プライベートに設置した共有サーバ上のパワーポイントファイルを開くのに、いちいち「保護モード」で開いてはめんどうでしょう。

以下の設定を行うと、保護モードを無効にできます。なお、Microsoft Office 2013 Power Pointでの設定になります。

  1. 「ファイル」タブを選択
  2. 「オプション」を選択 -> ダイアログが開く
  3. 「セキュリティセンター」を選択
  4. 「セキュリティセンターの設定」を選択 -> ダイアログが開く
  5. 「保護ビュー」を選択
  6. 右側の3つのチェックボックスの、上2つ(インターネットから取得したファイルに対して保護ビューを有効にする、と、安全でない可能性のある場所のファイルに対して、保護ビューを有効にする)の、チェックを外す。
  7. 「OK」をクリック

ちなみに、エクセルやワードも同じように設定することが可能です。

JavaScriptで10進数と16進数を変換する方法

JavaScriptで10進数と16進数を変換する方法を紹介します。 まず、16進数を、10進数に変換する方法です。 以下のサンプルコードでは、16進数の"DB"や"0A"を、10進数に変換しています。 var a = pa...