2020-12-21

Javaのデスクトップアプリで画面が乱れてしまう場合の対処法

最近すっかり見かけなくなったJavaのデスクトップアプリですが、たまにグラフィックドライバとの相性のせいか、画面が乱れてしまうことがあります。その場合は、アプリ(Java)の起動オプションに下記を追記しましょう。

-Dsun.java2d.noddraw=true           

DirectDrawの使用を無効にすることで解決できる場合があります。




2020-11-27

only size-1 arrays can be converted to Python scalarsのエラーが出たら

 初歩的な話ですが、、、数式に基づいてグラフ作成しようと思ったら、表題のように

  • only size-1 arrays can be converted to Python scalars
というエラーに遭遇することがあります(特に初心者の方)。おそらくmathクラスの関数を使っていることが多いでしょう。math関数は配列を引数に受け取ることができませんので、numpyクラスの関数に書き換えましょう。



2020-11-14

Python: ilocで取ってきたデータフレームのデータをnumpyArrayに変換する

下記のようにすればOK。

#reshapeする
x = df.iloc[:, i]
x=x.values.reshape(-1,1)
#または、np.arrayで変換する
x = np.array(df.iloc[:, i])
view raw dfToArray.py hosted with ❤ by GitHub


2020-10-18

Zoomのブレイクアウトルームで画面共有ができない問題について

後期に入って、オンライン実験に取り組んでおり、ブレイクアウトルームを使ってグループで実験に取り組ませています。時々、「画面共有ができません」という学生がちらほら。。現象をまとめると

  • メインセッションでは画面共有ができる
  • ブレイクアウトルームに入ると画面共有ができない
という意味不明な事象が発生。

解決策:Zoomのバージョンをアップさせる
とりあえずの結論として、Zoomをバージョンアップさせることで解決しています。これがホントの原因か、どれくらいのバージョン違いで影響がでるのかは不明です。



2020-09-21

WindowsでC言語の開発環境を用意する

 表題の件を実現するためには、

  • Cコンパイラ環境を用意する
  • 開発用のエディターを用意する
の2点をクリアする必要があります。

Cコンパイラ環境を用意する
以前なら、
  • Visual Studio 等のフリーの開発環境をインストールする
  • 「minGW」と呼ばれるツールを利用する
のが主流でしたが、今なら
  • WSL (Windows Subsystem for Linux)を利用する
が正解かと思います。WSLとは、Windows上で、Linux(Ubuntuが代表的)を動かすことができるMicrosoft社製の環境です。

(1)Ubuntuをインストール
   ここでは詳細を省略しますが、Windows Storeで Ubuntuと入力すれば出てきます。それをクリックすればOKなんですが、細かなシステム設定が必要な場合があります。

(2)ubuntuのシェル上で、以下のコマンドを入力
sudo apt update
sudo apt upgrade -y
sudo apt install build-essential -y

最後のbuild-essential というパッケージが肝で、開発関係の基本的なツールが自動的に入るので便利です。この作業が終わったら、

gcc --version

と打ってみて、gccが入っていることを確認してください。

エディターの用意

エディターは、自分の好きなのを選べばいいです。個人的には、

  • Visual Studio Code (VS Code)

がオススメです。便利な拡張機能が揃っており、特に

  • Remote - WSL
という拡張機能がおすすめで、ubuntuのターミナル上で、code とコマンドを入力すれば、ubuntuのターミナルをVS Code内で呼び出せせます。つまり、VS Codeのターミナル上で gccが直接打てるということです。

その他、VSCodeでCのファイルを開くと、いろいろ拡張機能のインストールを促されますので、インストールしておくとなにかと便利です。



2020-09-19

Googleドキュメントやスライドに数式を綺麗に入れる方法

一般的にWordなどで、レポート、報告書、論文を書くとき、「数式」を入力する時は数式エディターを用います。が、Googleドキュメントやスライドには今のところ数式を入れる機能がありません。Googleスプレッドシートには数式の機能がありますが、ちょっと貧弱です。
結論から言うと、数式を画像化して貼り付けるのがべたーな方法ですが、Wordの数式エディタは画像としてペーストできない問題があります。

Texclipで数式を画像化して貼り付ける
TexclipはTexの数式表記を画像(PNG,EPS,SVG)に変換してくれるサイトです。画像をダウンロードしなくてもコピー&ペーストでも貼り付けることができます。ここを利用する際のTIPSは、解像度を600以上にすることをオススメします。そのほうが、スライド内で大きくしても綺麗に見えます。

Texの数式表記を知らない場合は勉強する必要がありますが、Tex自体は理工系の論文執筆ではメジャーなツールですので、知っておいて損はないでしょう。

パワーポイントの数式スライドをインポートする
Texの表記が面倒な場合は、パワーポイントで数式を数式エディタ-で書いておき、そのスライドをGoogleスライドでインポートするという方法です。インポートで数式を画像として読み込んでくれます。数式をスライドの要素として入れる時は、この方法が良いかもしれませんね。
なお、Googleスライドとパワーポイントのスライドの縦横比は一致させてください。そうしないと変な比率で画像になります。


2020-09-06

batファイルを利用したJavaプログラムの起動でコマンドプロンプトを非表示にする

 表題のとおりのTIPSです。下記のようにVBScriptファイルを別途用意してそれを起動すればOKということですね。

Set objWShell = CreateObject("Wscript.Shell")
objWShell.run "cmd /c xxxxx.bat", vbHide


2020-07-03

クラスに格納されているデータをJSON形式に変換する(日本語文字列対応)

表題の通りです。肝は、
  • ensure_ascii=Falseを指定することで日本語対応
  • 正直、何をやっているのか不明(とりあえず動いた)
というところです。
(参考)
def OJEncoder(obj):
class MyEncoder(JSONEncoder):
def default(self, o):
return o.__dict__
return MyEncoder(ensure_ascii=False).encode(obj)
view raw OJEncoder.py hosted with ❤ by GitHub


Python:RealsenseのDepthデータを16bit Grayscale Multi-Tiffで保存する

RealsenseのDepthデータを保存するには、
  1. Realsense Viewerで保存する
  2. 自前のプログラムで保存する
の2つの方法があります。前者については、Realsense Viewerの保存機能を利用することでROS-Bag形式で保存されるのですが、ファイルサイズがでかい。。。しかし、いつのまにかRealsense Viewerの保存オプションに圧縮というのがあって、それを使うと50%くらい圧縮してくれます。まあ、通常はこれをおすすめします。しかし、それでもでかいのでもっとファイルサイズを小さくできないか、、という後者の話が今日のネタです。

前提条件
今回の記事は、
  • Realsense ViewerでROS-Bagファイルとして保存しておく
  • そのROS-BagファイルをMulti-Tiffに変換する
という使い方を前提とします。本来であれば、リアルタイムにMulti-Tiffに変換できたらいいんですが、Pythonだとちょっと厳しい。。。フレームレートが半分以下になります。C#でマルチスレッドで処理すればいけそうですけど、暇な時にトライします(最近Pythonにどっぷりハマっているので、いつになるかは不明)

16bit Grayscale Multi-Tiffで保存する
いろいろ方法はあるのだと思いますが、今回は16bit Grayscale Multi-Tiffで保存する方法です。まあこれが一番ラクでしょう。Depthデータをそのまま放り込めばよくてしかも取り出しそのままでOK。
以下のサンプルプログラムの肝は
です。特に後者が大切です。この記事に限定する話ではないですが、これをFalseにしておかないと、非同期で処理が行われてしまい、フレームレートが落ちます。

画像の表示に注意
16bit Grayscale Multi-Tiffの画像は、
  • Windows10のフォトアプリ
  • ImageJ(オープンソースの画像処理系では有名なソフト)
などを利用することで表示できますが、個人的には後者がおすすめです。マウス操作で各ピクセルの画素値を表示してくれますので。なお、画像はほぼ真っ黒に見えると思います。その理由は、16bitだと0mm~65536mmの距離を記録できるわけですが、デプスデータは、せいぜい6000mmがMax。16bitの濃淡は表示される段階で8bitに変換されますので、ほぼ黒側(0側)に近いことになりますからね。目を凝らしてみると、黒の濃淡がわかるはずです。

# -*- coding: utf-8 -*-
# use tiffile library
# https://pypi.org/project/tifffile/
import pyrealsense2 as rs
import numpy as np
import tifffile
#1280*720
resX=1280
resY=720
# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_device_from_file('depth10sec.bag')
config.enable_stream(rs.stream.depth, resX, resY, rs.format.z16, 30)
# Init
profile = pipeline.start(config)
playback = profile.get_device().as_playback()
playback.set_real_time(False) # <--- very important setting to get all frames
depth_sensor = profile.get_device().first_depth_sensor()
depth_scale = depth_sensor.get_depth_scale()
count=0
oldTimeStamp=0
try:
# for first frame
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
currentTimestamp = depth_frame.timestamp
i=0
while (True):
depth_frame = frames.get_depth_frame()
if not depth_frame:
continue
# Get Depth data
depth_image = np.asanyarray(depth_frame.get_data())
#Save multi-Tiff
tifffile.imsave('depth16.tif', depth_image, compress=6, append=True)
print(i)
i +=1
# フレーム待ち(Depth & Color)
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
oldTimeStamp=currentTimestamp
currentTimestamp = depth_frame.timestamp
if oldTimeStamp>=currentTimestamp:
break
finally:
pipeline.stop()


2020-06-04

GAS:Google Document内でマウス選択した箇所を取ってくる方法

タイトルの通り、Google Document内でマウス選択した箇所を取ってくる方法のメモ書きです。
  • selection.getRangeElementsではマウス選択した領域を含むElementがかえってきます。Elementの単位はドキュメント内部で勝手に決まってる感じですが、改行などが入ると別のElementとして扱われるようです。
  • 上記をそのまま出力すると、そのElementの全ての文字が返ってくるので、getStartOffset()とgetEndOffsetInclusive()でマウス選択した範囲の始点終点をとってきています。
var selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
var elements = selection.getRangeElements();
text= elements[0].getElement().asText().getText();
text = text.substring(elements[0].getStartOffset(),elements[0].getEndOffsetInclusive());
DocumentApp.getUi().alert(text);
}


2020-05-04

GAS:自分が参加しているクラスの情報を取得する(Google Classroom API)

Google Classroomは何かとUIが不便なので、個人的にGASでアプリやツールを作り始めています。というわけで、メモ書き。。。下記のサンプルでクラス情報を取り出すことができます。まあ特に特筆するところはないですね。なお、
  • 自分の参加しているクラスしか取得はできない
  • ドメイン管理者は全クラスが取得できる
となっています。

function getClassList(){
var optionalArgs = {
pageSize: 100 //クラスの数が多い場合はここを増やす
};
var response = Classroom.Courses.list(optionalArgs);
var courses = response.courses;
if (courses && courses.length > 0) {
for (i in courses) {
var course = courses[i];
Logger.log(course.name);
Logger.log(course.id);
}
return course;
} else {
Logger.log('クラスが見つかりません');
return null;
}
}
view raw getClassList.gs hosted with ❤ by GitHub


2020-05-03

Hangouts Meet でパワーポイントスライドの画面共有の注意事項

前回の記事
がやたらとアクセスが多いことに気づいたので追加記事です(ネタも古くなってますし)。

パワーポイントスライドショー実行時にあいかわらず問題あり?
この半年は私はMeetを使う時は基本的にGoogleスライドを共有して使っていたので、「Meet +パワーポイント」の組み合わせはあまりやってなかったんです。で、あらためて試してみると、相変わらずパワーポイントとの画面共有が弱いですね。どうやら
  • スライドショー時の画面共有範囲は、元のパワーポイントのウィンドウの位置とサイズに影響される
という仕様になってますね。つまり、以下のとおりです(学生画面はスマホアプリです)。これらはパワーポイントのウィンドウを共有した場合の挙動です。

これはなかなか気づかないバグなので気をつけてください。ちなみに全画面共有にしておけばこの問題は発生しません。


GAS: GoogleSheet上の画像にスクリプトを動的に割り当てる

GoogleSheet上でアプリを作成する時、画像にスクリプトを割り当ててボタン代わりにするのはよくあるTIPSです。しかし最近、
  • 画像に割り当てたはずのスクリプト設定が消える
という問題が頻発するようになり(一時的なバグかも知れませんが)、どうしたものかと考えた結果が今回の記事内容です。表題のとおり画像へのスクリプト割当は、GAS上で動的に設定できるようです。(画像の配置もGASでできるようです)

注意点:画像は挿入したものにする
Sheet上にボタン代わりの画像を置く時、【図形描画】アプリを使って画像を作成するのがラクですが、この方法だとSheet上の画像を認識することができないためダメです。つまり、
  1. ボタンとなる画像をファイルとして作成しておく
  2. Sheetに画像挿入のよりその画像ファイルを置く
となります。この手順を踏むことで、画像がGoogle Driveに格納されてidを持ち、GASで扱えるようになるのでしょう。なお、複数の画像を配置した場合、どのオブジェクトがどの画像かの特定する必要があるので、代替テキストの情報を利用するといいでしょう。
下記のサンプルは、画像にtestというメソッドを割り当てています。

function assignScriptToImage() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var images =sheet.getImages();
images[0].assignScript("test");
}
function test(){
Browser.msgBox("aaa");
}


2020-03-31

PythonでFirebaseを用いる際のサービスアカウント情報の設定

最近、ボチボチとGAEとかFirebaseとか、いわゆるGCP周りのサービスを触っているのですが、それらを利用するための認証系のところがいまいち理解できてなくて、急にプログラムが認証できなくなったりして、、、ということがあったのでメモ書きです。

エラーの例
以下のようなエラーがでた場合、認証系のところでトラブってることになります
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or
explicitly create credential and re-run the application.

サービスアカウントの設定方法
GCPの管理画面でサービスアカウントキーを作成してダウンロード(jsonファイル)しておきます。認証設定しないといけない箇所は
  • 環境変数の設定
  • CREDENTIALS情報の読み込み
の2つです。実は、前者の環境変数を設定しておけばコード内に認証情報を明示的に指定する必要はありません。環境変数の設定はシェルで設定するPythonかプログラムで明示的に設定するかのいずれかですが、認証ファイルの情報をコード内で明示的に書かないほうがいいので、シェルで環境変数を設定するのがベターです。Pythonの場合は下記の通りです。

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import os
#環境変数
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './xxxxx-credentials.json'
#credentialsの読み込み
cred = credentials.Certificate('xxxxx-credentials.json')
firebase_admin.initialize_app(cred)
db = firestore.Client()


2020-03-11

Python:OpenCVで動画再生時の各フレームの絶対時間を取得する方法

OpenCVで再生している動画(mp4など)に対して、「○時○分○秒の動画を再生したい」という時の各フレームの絶対時間を利用したい場合、そのフレームの絶対時間がわかればいいんですが、どうやら記録されていないようです。そこで、次のアプローチが考えられます。

再生開始時からの経過時間は取得できる
cv2.CAP_PROP_POS_MSECを利用することで、再生中のフレームの経過時間(相対時間)を取得できます。つまり、動画の再生開始の絶対時間さえわかれば、この時間をプラスすることで再生時間がわかります。

再生開始時間を取得するには
動画ファイルの保存時間が1つの手がかりになりますが、それは動画が終了した時の時間になります。ただ、経過時間はわかるわけですから逆算すれば求めることができるでしょう。ただし、ファイルのタイムスタンプは秒が最小ですので、ミリ秒単位での誤差(最大999ミリ)が生じます。

録画時に細工をする
もし、動画録画のアプリケーションに細工ができるなら、録画開始時間を記録しておくとよいでしょう。録画アプリケーションをOpenCV等を利用して作成して、各フレームの時間を記録することもできると思います。どちらがスマートかは As you likeで。。。。

2020-03-09

Python:TkInterを用いてウェブカメラの映像を表示する(OpenCV利用)

前回の記事では、OpenCVのGUIを利用してウェブカメラの映像を表示しましたが、今回はPythonの標準的GUIライブラリであるTkInterを用いて表示してみます。

プログラムのポイント
ポイントは次の2点です。
  • TkInterでの表示形式に画像を変換する
  • TkInterのafter関数を利用して再帰的にループ処理を実現する
このプログラムだと、FPSの数値もほぼ変わりません(数値的にも若干落ちているような気もするという程度)。GUIを操作してもフレーム読み込みの処理が止まりませんので、OpenCVだけのよりはこちらのほうがいいかもしれません。

root=tk.Tk()
root.title("RGB Recorder")
root.geometry("800x600")
root.resizable(width=False, height=False)
canvas=tk.Canvas(root, width=640, height=480, bg="white")
canvas.pack()
def update():#update
global img
global camera
ret, frame =camera.read()
#TkInterで表示できる形式に変換する
img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
canvas.create_image(w/2,h/2,image=img)
root.after(1,update) #本関数を再帰的に呼び出す
#Cameraの設定などは省略してます
update()
root.mainloop()


2020-03-07

Python: Webカメラの映像をOpenCVを用いて表示&録画する

OpenCVを用いて通常のWebカメラの映像を表示&録画するサンプルです。この程度の処理であれば、Pythonでも速度は問題なく出ます。利用したカメラの仕様が30FPSでしたが、このプログラムを計測するとほぼ30FPS出ることを確認しました。(ただし、シングルスレッドなので、ウィンドウ操作をするとFPSがガクンと落ちます)
コーディングにおいて特筆するべきところは、以下の通り。
  • VideoWriter_fourcc関数で動画のフォーマットを決める(どんなフォーマットがあるかは調べてみましょう)
  • readメソッドの戻り値は、読み込みのTrue/Falseとフレーム
#!/usr/bin/env python
from PIL import Image
import cv2 as cv
# FPS
fps = 30
# Frame size
WIDTH=1920
HEIGHT=1080
size = (WIDTH, HEIGHT)
#Setting recording format
fourcc = cv.VideoWriter_fourcc(*'XVID')
#fourcc = cv.VideoWriter_fourcc('M', 'J', 'P', 'G')
#Recording file Setting
video = cv.VideoWriter('sample.avi', fourcc, fps, size)
#Camera Setting
camera = cv.VideoCapture(0)
camera.set(cv.CAP_PROP_FRAME_WIDTH, WIDTH)
camera.set(cv.CAP_PROP_FRAME_HEIGHT, HEIGHT)
try:
while True:
#frame read
_, frame = camera.read()
cv.imshow('image', frame)
#record frame
video.write(frame)
key = cv.waitKey(1)
if key == 27: # ESC key for closing
video.release()
f.close()
break
except KeyboardInterrupt:
print("Close me? -> Enter ESC")


2020-03-04

Python: RealsenseのRGBとデプスのカメラ映像をOpenCVを利用して表示する

おちラボではMicrosoft Kinectを利用したソフトウェア開発をしていますが、御存知の通りKinectは要求するマシンスペックが高いので、なかなか使いづらいというのがあります。単純にデプスカメラとして使うなら、IntelのRealSenseがオススメです。

SDKとライブラリのインストール
リンク先を見てもらえばわかりますが(特にpyrealsense2の方)、Windows環境では何も気にすることなくSDKをとってきて、ライブラリはpipでインストールできます。Macの場合、いろいろ手間がかかりますね。
なおSDKについては、旧ライブラリでは各種認識系のサンプルプログラムが掲載されていたようですが、2.0になってからはないようです。おそらく、認識系のやつはサードパーティの優秀なライブラリを使ってねということなんでしょう(OpenPoseとかOpenFaceとか)。

ソースコードとポイント
1. configの設定
ここでどのストリームを読み込むのかを設定します。解像度やフレームレートなどを決めますが、それ以外のパラメーターについてもconfigで設定するんだと思います。

2.開始後はループ処理で
pipelineクラスを呼び出してstart呼び出し後、ループでフレームを呼び出します。

3.フレームの変換
numpyのasanyarrayで配列変換。depthフレームの場合は、CV2.applyColorMapでカラーマップに変換

あとの処理は通常のOpenCVプログラミングの世界、、ということで思った以上に簡単です。C#でKinectのプログラムを書いたときは、もっと面倒だったような気がしますが。。。。
以下にサンプルを載せます。クリックで全表示です。

import pyrealsense2 as rs
import numpy as np
import cv2
# Configulation of Realsense
config = rs.config()
#The case of reading from bag gile
config.enable_device_from_file('xxxx.bag')
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
# start
pipeline = rs.pipeline()
pipeline.start(config)
try:
while True:
frames = pipeline.wait_for_frames()
color_frame = frames.get_color_frame()
depth_frame = frames.get_depth_frame()
if not color_frame or not depth_frame:
continue
# translation to OpenCV Format
color_image = np.asanyarray(color_frame.get_data())
depth_image = np.asanyarray(depth_frame.get_data())
# depth image to Colormap
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.08), cv2.COLORMAP_JET)
# Show Color images
cv2.namedWindow('color_image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('color_image', color_image)
# Show Depth images
cv2.namedWindow('depth_image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('depth_image', depth_colormap)
#enter q key to exit
key = cv2.waitKey(1) & 0xff
if key == ord("q"):
break
#If it does not work, try below code
#cv2.waitKey(1)
finally:
pipeline.stop()


2020-03-03

OpenFaceを入れてみた(Windows編)


うちは歴史的にKinect使ってモーションとか顔とかの認識をしてきたので、知識がそこで止まってしまっていたのですが、今さらOpenPoseとかOpenFaceとかCV系(画像認識系)のガチンコの方々が作られたライブラリを試すことになり、、、、いや、すごいですよ!!OpenFace!!!

公式ページはこちらっ!
OpenFaceというキーワードで調べると、
の2つが引っかかります。雰囲気的に後者のほうがCMUのラボのライブラリっぽい感じでで由緒正しいような気がしたのですが、違いました。前者のほうが現在も更新しているライブラリです。作者の方もIEEEで学会発表しているアカデミックな方で、今はMicrosoftのSenior Scientistのようです。

インストール方法
公式サイトに行くと、WIKIにいけって書いてあるのでそこへ移動します。
Windowsの場合、バイナリがあるのでそれをダウンロードして展開しましょう。単なるZIPファイルですので展開したら使えます。

モデルファイルのダウンロード
展開したら使えますと書きましたが、正確に言うと顔認識するためのモデルファイルが必要です。モデルファイルは、展開したファイルの中で
  • download_models.ps1
というPowerShell Scriptファイルを実行することで入手します。コマンドプロンプトではなく、PowerShellのコマンドプロンプトを開いて実行(上記ファイル名を入力するだけ)してください。

アプリ構成
Pythonとかのライブラリを想像していたのですが、そういうものはなく(私の勘違いでなければ)、顔画像解析のアプリケーションを提供していてそれを使ってねという感じですね。アプリは、
  • GUIアプリ系
  • コマンドラインアプリ系
と2系統に分かれている感じで、コマンドライン系のアプリは、他のプログラムから呼び出したりする時に使うのでしょう。

OpenFaceの使い方
OpenFaceOffline.exeというのがGUIアプリの記録ツールのようです。GUI系のアプリを動かすとリアルタイムに認識するんですが、想像以上に軽量ですごいです!Kinectとかで同じことをしようと思ったらマシンパワーがすごく必要で手元にあるノートPC(超ハイスペックです)でも重くてだめだったんですが、、、CV系の研究者の技術の高さには感心します。
扱うデータとしては、
  • 動画ファイル
  • イメージファイル
  • ウェブカメラ
からの入力を受け付けるようです。イメージファイルについては、ディレクトリ指定すると複数枚を一括して処理するようです。解析結果は、Processedディレクトリに保存されています。何が記録されるのかは、GUI画面のメニューで指定することができます。

なお、ソースコードを眺めると、Socket経由で呼び出すPythonのサンプルプログラムみたいなのが書いてました。そういう連携方法もあるんですね。後でチェックです。ただ、個人的には自分のGUIアプリ内でリアルタイムの処理を書きたいので、そうなるとソースコードを解読するしかないか、、、

とにかく、OpenFaceは凄いです。お試しあれ!


2020-02-28

gist-embedを利用してGithub Gistのソースコード埋め込みをコントロールする


※このネタは今はうまく動作しなくなっているのでボツです※

本サイトでは、サンプルソースコードをGitHub Gistを利用して管理することにしてますが、欠点としては、Gistのデフォルトの埋め込みコードでは、全ての行数が表示されるのがあります。これを解決するJavaScriptライブラリとして gist-embed があります。

gist-embedとは
ネットでググるといろいろ出てきますが、リンク先がリンク切れになってますね(2020/02/28現在)。で、サイトが変わってるようです。
使い方
上記サイトを見ればわかりますが、
  • Scriptタグを埋め込む
  • Codeタグを使って埋め込む (例:<code data-gist-id="******"></code>)
  • 必要に応じてオプションを指定する
    (行を指定する場合、data-gist-lineを指定すればOK)   
非常に簡単です。欠点としてはちょっと動作が遅くなるかな、、という気がするだけですね。

bloggerで設定する場合
限定的なネタになりますが、bloggerでScriptタグを埋め込みたい場合は、
  • 管理画面からテーマを選択
  • ブログで使用中のテーマを選び、編集を押す
  • 適当な場所に記述する
でOKです。


2020-02-22

GAEにFlaskアプリをデプロイする

以前に
という記事で、zappaを利用してAWSにFlaskのウェブアプリをデプロイする手順を書きましたが、GAEだと思いの外、簡単だったので紹介します。

前提条件
  • GCP(Google Cloud Plaform)はすでに使えるように登録していて、GAEを利用するGCPのプロジェクトもすでに設定済みであることとします。(この辺りの話はどこかググってください)
  • ローカルでFlaskが動く環境を作っておきましょう
  • Google Cloud SDKもダウンロードしておいてください

サンプルプログラム
参考にしているサンプルはgitでダウンロードしてください。
  • git clone https://github.com/GoogleCloudPlatform/python-docs-samples
この中で、下記のファイルがサンプルです。
  • python-docs-samples/appengine/standard_python37/hello_world
これを用いて説明します。なお、コードは触ることはないでしょう。

ファイル構成
ここで利用するファイルは下記です
  • main.py・・・プログラム本体
  • app.yaml・・・設定ファイル
  • requirements.txt ・・・ライブラリ情報
  • libディレクトリ ・・・外部ライブラリをいれる場合に必要?
Flask関係の知識があれば、特別なファイルではないことに気づくかと思います。

デプロイ方法
とりあえず、普通のFlaskファイルなのでローカルで動くことを確認したうえで、デプロイしましょう。何も触らなくても動くはずです。コンソールで下記のGCPコマンドを打つだけです。カレントディレクトリはそのファイルがある場所に移動しておいてください。
  •  gcloud app deploy
ディレクトリ下の全てのファイルをアップしようとするので注意してください。実行は、URLを入力するか
  • gcloud app browse
を入力してください。

ちょっとGAEを再び使おうかと思ったり、、、
GAEは10年近く前に流行って、それから料金体系が改悪されて以降、個人的にあまり触らなくなり、最近はノータッチでしたが、ちょっとサーバーレス系の開発することになり、ふと思い立ったら使い勝手も良くなってました。GAEブームがまた来てもいいんじゃないでしょうか。。。


2020-02-07

古いAccessファイル(mdbファイル)をCSVに変換する手順

※本記事はOpenOfficeを利用します。OpenOfficeは更新が止まっててセキュリティホールもあるので(今はLibreOfficeだよ)インストールはオススメできない、、、というコメントを頂きましたが、本記事で紹介する技がLibreOfficeではできませんでしたので、ご自身の責任の上で緊急的な用途としてOpenOfficeを利用されればと思います(2020/02/10)

20年ほど前の昔の研究をリバイバルすることになりまして、そのためにはデータベースに保存してある情報を使わないといけないことに気づき、、、「そういえばACCESSで作ってたなぁ。開かなかったらどうしよう(笑)」と軽い気持ちで考えてみたものの、そのままでは開かないことが明らかになり、かなり苦労したのでメモ書きです。この技もいつまで使えるのかが要注意なので、古いネタを残している人は早めに移行しておきましょう。

必要なソフト
  • OpenOffice Base
  • OpenOffice Calc
  • JRE 32bit版
Microsoftは対応していない
まず、本家のMicrosoftはACCESS97とかその辺りの古いMDBファイルを開く手段を残してません。2010年辺りの古さなら対応しているようですが。。ここは諦めましょう。

OpenOffice Baseなら開くが。。。
Microsoft Office対抗馬のOpenOfficeなら開きます。そのかわり
  • 既存のデーターベースに接続
という形式で開くことになります。ここは注意点が1つあり、この方法で開いてその後にodbファイルを保存しても、データの本体はmdbファイルにあるということです。また、Baseにはcsvで保存とかcsvで出力という機能がありません。また
  • 編集できるテーブルとかできないテーブルとかある
  • コピペとかもできない
という感じで、実質見るだけ。ちょっとつらい。

odbファイルに移植する
odbファイルとして保存し直すにはどうすればいいか。。。下の図にあるように、左側に元ファイル、右側に新規に作成したodbファイルと並べて、テーブルを手作業(ドラッグ&ドロップ)で置いていくしかないようです。データの保存状態によってはうまく移行できないかもしれません。



Office Calcに移植してcsvに保存する
odbにしたところでBaseにはcsv変換機能がないわけですから、どうすればいいかというと、Calcに頼ります。つまりCalcに読み込ませることが最終ゴールであり、Calcに読み込ませるにはデータをodbファイルとして保存しておく必要があったということです。

で、この移植作業の方法ですが、手作業です。。。下記のように、baseとCalcを並べて
  • BaseのテーブルをCalcのあるシートのセルへドラッグ&ドロップ
することで、データがペーストされます。




JRE32bit版が必要です
OpenOfficeはJavaの機能を使ってるんですかね?どうもJRE32bit版がないと、フル機能が使えないようです。64bit版ではダメですよ。

以上の方法でとりあえずデータベースを復活できそうなので、個人的にはまあ一安心なんですが。。。互換性問題、、なかなか難しいですねぇ。



2020-02-04

Excelのルビ振り機能を有効に使う

Excelのルビ振り機能にはちょっと変わった制約があります。
  • フォントリボン→ふりがなボタンによりルビ振りを呼び出す場合、シートに直接手入力した文字でないとルビを振ってくれない。つまりコピー&ペーストした文字についてはルビを振ってくれない
  • VBAでSetphonetic関数を使用すれば、コピー&ペーストした文字についてもルビ振りが可能(ただしWindowsのみ、Macでは不可)
なんでこんな事になってるんですかね?下記はSetphonetic関数の呼び出し例です。

Sub test()
With Range("A1:A10")
.SetPhonetic
.Phonetics.Visible = True
End With
End Sub
view raw SetPhonetic.vbs hosted with ❤ by GitHub