LibreOfficeで他のドキュメントのマクロ(Function)を実行する

Calcを使用して「test.ods」から「呼び出されるドキュメント.ods」のFunctionを呼び出して結果を取得するのが目的。Version: LibreOffice 6.4.7.2

呼び出されるドキュメント.odsのFunctionは下記の通り。

Function Test(a, b)
    Print a
    b = "test3"
    Test = 1
End Function

test.odsから呼び出して結果を取得する。

Dim document As Object
document = StarDesktop.loadComponentFromURL(ConvertToUrl("/home/user/Desktop/呼び出されるドキュメント.ods"), "_blank", 0, Array())
Dim scriptProvider As Object
scriptProvider = document.getScriptProvider()
Dim url As String
url ="vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document"
Dim script As Object
script = scriptProvider.getScript(url)
Dim args As Object
args = array("test1", "test2")
Dim argsAfterFinishing As Object
argsAfterFinishing = array()
'test1と1が表示される
Print script.invoke(args, 0, argsAfterFinishing)
'test2が表示される
Print args(1)
'test3が表示される
Print argsAfterFinishing(1)

ドスパラのVF-AD4でplymouth後のOEMロゴを非表示にする

LinuxMint20.1をインストールしたが、plymouthが表示される前と表示された後にOEMロゴが出て、なんか格好悪いので、plymouth後のロゴは非表示にしたい。

…
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fbcon=nodefer"
…

OEMロゴは出なくなったけど、「drm:intel_cpu_fifo_underrun_irq_handler [i915]] *ERROR* CPU pipe A FIFO underrun」とか出るようになった。よく分からないし、普通に動くので下記のように追記して非表示にする。

…
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fbcon=nodefer loglevel=0"
…

Ubuntu18.04で特定のウィンドウに常にフォーカスを与える

端末を1つの用途(アプリケーション)専用にする場合、キーボード操作を常に1つのウィンドウで処理したい場面が結構ある。もっとスマートな方法があるだろうけど、とりあえずwmctrlコマンドをcronに登録して1分ごとに専用ウィンドウにフォーカスを行うことにした。

wmctrlのインストール。

# apt install wmctrl

cronに登録。

* * * * * export DISPLAY=:0 && /usr/bin/wmctrl -a ウィンドウタイトル

LibreOfficeでPostgreSQLデータベースにJDBCで接続

On Error Goto ErrorHandler
'Properties
Dim properties(2) As New com.sun.star.beans.PropertyValue
properties(0).Name = "user"
properties(0).value = "UserName"
properties(1).Name = "password"
properties(1).value = "Pass"
properties(2).name = "JavaDriverClass"
properties(2).value = "org.postgresql.Driver"
'Driver manager
Dim driverManager As Object
driverManager = createUnoService("com.sun.star.sdbc.DriverManager")
'Connection
Dim connection As Object
connection = driverManager.getConnectionWithInfo("jdbc:postgresql://192.168.0.1:5432/database-name", properties())
'Statement
Dim statement As Object
statement = connection.createStatement()
'Execute and number of update records
Print statement.executeUpdate("DELETE FROM table1;")
'ResultSet
Dim resultSet As Object
resultSet = statement.executeQuery("SELECT * FROM table2;")
While resultSet.Next
    Print resultSet.getString(1)
Wend
'Close
statement.close()
connection.close()
connection.dispose()
Exit Sub
'Error handle
ErrorHandler:
If IsNull(statement) = false Then
    If statement.isClosed() = false Then
        statement.close()
    End If
End If
If IsNull(connection) = false Then
    If connection.isClosed() = false Then
        connection.close()
        connection.dispose()
    End If
End If
If InStr(Error$, "org.postgresql.Driver") > 0 Then
    MsgBox("ツール→オプション→LibreOffice→詳細→クラスパスからPostgreSQLのJDBCドライバーを追加してください。", 64, "初期設定")
Elseif Len(Error$) > 0 Then
    MsgBox(Error$, 16, "エラー")
End If

LibreOffice Calcでダイアログを作成して表示する

「ツール」→「マクロ」→「ダイアログの管理」から追加した”Dialog1″を表示してダイアログ内のテキストフィールドの値を取得するコード。ちなみにダイアログをコードで閉じるにはdialogオブジェクトのendexecute()メソッドを呼ぶ。

'Show dialog
DialogLibraries.LoadLibrary("Standard")
dialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
dialog.execute()
'Get text
Dim textField As Object
textField = dialog.getControl("TextField1")
Dim value As String
value = textField.getText()

docker-composeでPHPとMySQLの開発環境を作る

dockerとdocker-composeをインストールする。

# apt install docker.io docker-compose

下記のymlファイルを作成する。

version: '3'

services:
    php:
        image: php:7.3-apache
        volumes: 
            - /home/user/docker/test/www:/var/www/html
        ports:
            - "80:80"
        container_name: test-php
    mysql:
        image: mysql:5.7
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
        volumes:
            - /home/user/docker/test/mysql:/var/lib/mysql
        ports:
            - "3306:3306"
        environment: 
            MYSQL_ROOT_PASSWORD: rootpassword
            MYSQL_DATABASE: test
            MYSQL_USER: test
            MYSQL_PASSWORD: password
        container_name: test-mysql

コンテナを作成して起動する。

# cd /home/user/docker/test/
# docker-compose up -d

作成済みのコンテナを起動する。
※docker-compose.ymlが存在する場所で実行する

# docker-compose start

作成済みのコンテナを停止する。
※docker-compose.ymlが存在する場所で実行する

# docker-compose stop

コンテナを停止して削除する。
※docker-compose.ymlが存在する場所で実行する

# docker-compose down

KDE neonのEclipseがエラーを繰り返し表示する

新たにKDE neonをクリーンインストールした状態でEclipseを起動して、.javaを編集すると下記のエラーが繰り返し表示され、使えなかった。色々調べてみたけど、どうも汎用的なメッセージらしく、1つずつ試した結果、結局はインプットメソッドの設定が不十分なことが原因だった。アホくさい。

org.eclipse.swt.SWTError: No more handles
	at org.eclipse.swt.SWT.error(SWT.java:4725)
	at org.eclipse.swt.SWT.error(SWT.java:4614)
	at org.eclipse.swt.SWT.error(SWT.java:4585)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:532)
	at org.eclipse.swt.widgets.Control.drawBackground(Control.java:235)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:6800)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:6132)
	at org.eclipse.swt.internal.gtk.GTK._gtk_main_do_event(Native Method)
	at org.eclipse.swt.internal.gtk.GTK.gtk_main_do_event(GTK.java:4166)
	at org.eclipse.swt.widgets.Display.eventProc(Display.java:1429)
	at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
	at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:1585)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4661)
	at org.eclipse.ui.statushandlers.WorkbenchErrorHandler.showStatusAdapter(WorkbenchErrorHandler.java:84)
	at org.eclipse.ui.statushandlers.WorkbenchErrorHandler.handle(WorkbenchErrorHandler.java:52)
	at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handle(IDEWorkbenchErrorHandler.java:105)
	at org.eclipse.ui.internal.WorkbenchErrorHandlerProxy.handle(WorkbenchErrorHandlerProxy.java:34)
	at org.eclipse.ui.statushandlers.StatusManager.handle(StatusManager.java:214)
	at org.eclipse.ui.statushandlers.StatusManager.handle(StatusManager.java:256)
	at org.eclipse.ui.statushandlers.StatusManager.handle(StatusManager.java:266)
	at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopException(WorkbenchAdvisor.java:325)
	at org.eclipse.ui.internal.Workbench$1.eventLoopException(Workbench.java:488)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.handle(PartRenderingEngine.java:1195)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1185)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1062)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:635)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:559)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:155)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:660)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:597)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1468)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1441)

下記コマンドで不足している言語パッケージをインストールする。

# apt install $(check-language-support)

使用するインプットメソッドにfcitxを指定して再起動したら直った。

$ im-config -n fcitx