2021年11月4日木曜日

特定のライングループに定期的にメッセージを送る方法について

あまプロではちょっとしたメッセージの自動送信ツールを開発する事があります。
作る途中にちょっとはまったんで、あメログ。

あまプロは曜日と月の回数に選って開催する教室を決めています。
例えば第一木曜日と第一金曜日が武庫教室…の様な感じです。
こうしないと、月毎に開催教室が変わってしまい管理だ煩雑になるので、曜日で決めています。
例えば2021年10月7日(木)は第2週の木曜日ですが、第一木曜日になります( -"-)。
第一木曜日(武庫教室)と第二木曜(伊丹昆陽教室)とでは大違いなんで、間違うと生徒さんに迷惑が掛かってしまいます。
かと言って、毎回カレンダで確認するもの面倒やし…。

そこであまプロでは GASとLINE NOTIFYを使って各教室の開催前に指定したグループにメッセージを送るサービスを作ってみました。
当日が第何曜日(第何週の曜日ではない)を取得するのがちょっとややこしかったですが…

Math.floor( ( new Date( t.getFullYear( ), t.getMonth( ), 1).getDay( ) + new Date( ).getDate( ) - 1) / 7) + ( new Date( t.getFullYear( ), t.getMonth( ), 1).getDay( ) > new Date( ).getDay( )? 0: 1)

 こんな感じで取得出来ました。
ワンライナで記述しているので解り難いですが、変数を使って整理すると

let t = new Date( );
let f = new Date( t.getFullYear( ), t.getMonth( ), 1);
let n = Math.floor( ( f.getDay( ) + t.getDate( ) - 1) / 7) + ( f.getDay( ) > t.getDay( )? 0: 1);

 こんな感じです。

 第何曜日かが取得できれば、後はそれをトリガで実行するだけで、教室前に「第何曜日と教室」のメッセージを送る事ができました!

グーグルさんラインさん、有り難う。

2021年10月16日土曜日

Ubuntu21.10へのアップグレードについて

あまプロではUbuntuを使って授業をしてます。
先日、Ubuntuの新バージョンがリリースされましたので、アップグレードしました。
特に嵌った所は無かってん嵌ったので、アップグレードの様子をあメログ。













 アップグレード完了!

追記

アップグレードの際にウィンドウシステムがWaylandに切り替わってしまいました。

その為、FirefoxのWebGLが無効になりScratchやヤフー地図等のサービスが利用できなくなってしまいました…。
何か前にもアップグレードの時にウィンドウシステムがWaylandに切り替わって同じ現象が発生した記憶が…。
これの解決方法は、一度ログアウトして、ユーザ選択してパスワード入力時に右下のオプションでUbuntu on Xorgを選択するとウィンドウシステムがX11になって、解決します。


2021年9月11日土曜日

表計算の数式で複数行複数列から検索する方法について

 あまプロでは表計算アプリの関数(数式)の授業を行う事が有ります。
先日の授業でちょっとハマったんであメログ。

 例えば、部門毎の列が有りまして、各行に人が入っているシート(部門シート)が有るとします。

別のシートで、人がどの部門に入っているかを数式で取得したいとします。

vlookupやhlookupやmatch等の検索系の関数は1行1列の範囲内からしか検索できなくて、今回の様な複数行複数列からの検索ができません。
で、どないするかというとsumproduct( )とcolumn( )とindex( )(とif( ))を使います。

これには行列式の知識が要るのですが、簡単に説明すると、行と列の範囲に比較を行います。
今回は検索したい人で比較します。
すると、論理値(TrueFalse)の行列(表みたいなの)が返ります。
数式はデバックできないので…頭の中で想像するしかないんですが、まぁ行列が返されます。

返された論理値の行列に、columnで取得した部門の行列をかける(乗算)と、該当する部門がTrueの論理値の行列が返ります。

該当する部門がTrueの論理値の行列をsumproductに渡すと、行列の積の和である部門の列番号が返ります。

最後にindexで列番号を指定して、人が所属する部門を取得する…こんな流れになります。

=IF(
  SUMPRODUCT( 部門.$A$2:$C$5 = A2) = 1,
    INDEX(
      部門.$A$1:$C$1,
      1,
      SUMPRODUCT(
        ( 部門.$A$2:$C$5 = A2) * COLUMN( 部門.$A$1:$C$1)
      )
    ),
  "なし"
)

仕上げに該当部門無しの場合のifを加えて完成です。

意外と使える場面が有ると考えますので、試してみて下さい。
環境はUbuntu21.04+Libreoffice7.1で確認しました。



2021年5月18日火曜日

Scratchの向きと三角関係について

あまプロではScratchを使ってプログラミングをお教えする事が有ります。
先日、スクラッチの角度(向き)ではまったので、あメログ。

Scratchではスプライトの角度(向き)は算数(数学)の角度と少し違います。
一周360°は同じなんですが、

 算数       Scratch  
  90°        0°   
180° ┼ 0°(360°)  -90° ┼ 90°  
  270°       180°(-180°)

こんな感じです。
算数は左回りで増えるんですが、Scratchは右回りで増えるんですね…。
ちなみに、スプライトの向きの初期値は90°(右向き)です。

 で、問題は三角関係を使う時なんです。
スプライトを円運動さしたり、上下さしたり、左右さしたりしたい時にsinやcosを使います。
上でScratchの向きは算数と違うと書きましたが、三角関数の時は算数と同じになるんですね…。

つまり、
90°のsinは0
ではなくて1になります。
なもんで90°のcosは0になります。

ややこしい!
サンプルはこちらです。

2021年5月8日土曜日

LibreOfficeBasicの配列追加について

あまプロではLibreOfficeBasicを使ってマクロを作る事が有ります。
LibreOfficeBasicの配列追加で少し嵌まったんであメログ。

LibreOfficeBasicで配列を追加するにはReDim Preserveを使います。
例えば配列の末尾に一つ追加するのはこちら。

Sub test
    Dim stringArray( 0) As String
    stringArray( 0) = "文字列0"
    Redim Preserve stringArray( Ubound( stringArray) + 1)
    stringArray( 1) = "文字列1"
    
    Msgbox stringArray( 0) &" "& stringArray( 1)
End Sub
↑を実行するとこうなります。

意図した通りです。

なんですが、Functionの戻り値で配列を受け取る時は要注意です。
String型なんで、配列の戻り値もStringにすんのかなと考え

Function addArray( stringArray As String) As String
    Redim Preserve stringArray( Ubound( stringArray) + 1)
    addArray = stringArray
End Function

Sub test
    Dim stringArray( 0) As String
    stringArray( 0) = "文字列0"
    stringArray = addArray( stringArray)
    stringArray( 1) = "文字列1"
    
    Msgbox stringArray( 0) &" "& stringArray( 1)
End Sub
↑を実行してみると

BASICランタイムエラー!オブジェクト変数は設定できていません。

実行エラーになります。
ほなVariant型にすんのかなと考え

Function addArray( stringArray As String) As Variant
    Redim Preserve stringArray( Ubound( stringArray) + 1)
    addArray = stringArray
End Function

Sub test
    Dim stringArray( 0) As Variant
    stringArray( 0) = "文字列0"
    stringArray = addArray( stringArray)
    stringArray( 1) = "文字列1"
    
    Msgbox stringArray( 0) &" "& stringArray( 1)
End Sub

↑を実行しても同じく

BASICランタイムエラー!オブジェクト変数は設定できていません。

実行エラー…。
色々試した挙げ句VariantをStringで受け取ると良ぇ様です。

Function addArray( stringArray As String) As Variant
    ReDim Preserve stringArray( Ubound( stringArray) + 1)
    addArray = stringArray
End Function

Sub test
    Dim stringArray( 0) As String
    stringArray( 0) = "文字列0"
    stringArray = addArray( stringArray)
    stringArray( 1) = "文字列1"
    
    Msgbox stringArray( 0) &" "& stringArray( 1)
End Sub

↑を実行すると

意図した通りになりました。
でも、VariantをVariantで受け取っても動く場合が有るんすよね…良ぉ解らん。

マクロ本体はGithubで公開しています。

環境はバージョン: 6.4.7.2 Build ID: 1:6.4.7-0ubuntu0.20.04.1です。

2021年1月30日土曜日

Dell Latitude E6320にUbuntu 20.04 LTSをインストールするとwi-fiに接続できないについて

 あまプロでは生徒のノートパソコンにUbuntuを使っています。
先日、Ubuntuのネット接続て嵌ったのてあメログ。

生徒用に買うたDell Latitude E6320にUbuntu 20.04.1 LTSをインストールしました。
インストール完了後に再起動を行って、再起動後まではwi-fiがつながっていました。
しかし、その後の更新でシステムエラーが発生し、その再起動後にwi-fiがつながらなくなってしまいました…。
wi-fiの物理スイッチをOn/Offしても変化なし、再起動しても変化なし…。

色々調べてみると、無線装置のbcmwl packageにバグが有るらしく、既にバグ報告が登録されてました。
他の方の投稿で、新しい版のbcmwl packageをインストールすると解決したというのを見掛けたので、試してみると無事に再起動後にwi-fiに繋がりました…。

良かった良かった。

2021年1月22日金曜日

FujitsuパソコンにUbuntuをインストールについて

 あまプロでは生徒のノートパソコンのOSにUbuntuを使っています。

先日、Ubuntuのインストールで嵌まったんであメログ。

先ず、ここからisoファイルをダウンロードして、ブータブルUSBを作成します。

 次にBIOSで起動デバイスの優先順位を選択し、USBメモリを上位にします。(ここは一般的なBIOSと同じ)

次にレガシーUSBサポートを有効にします(ここも一般的なBIOSと同じ)
次にセキュリティの管理者用パスワードを設定して、取り外し可能なディスクからの起動を「常に可能」にする(ここがFujitsu特有)

上記三点の設定を行わないと、USBから起動してくれませんでした…。

Ubuntuのインストールが終われば、上記設定は元に戻しても構いません。