HAL/S の COMPOOL はピンが最初から抜かれている手榴弾に例えられるべきだ

"C のポインタの危険性を剥き身のナイフに 例えるなら、HAL/S の COMPOOL はピンが最初から抜かれている手榴弾に例えられるべきだ"

"HAL/S は珍しい、死亡日時がはっきりしたプログラミング言語となる。STS-135 向けのミッショ ン用コード差分の最後のものが書かれた瞬間に、HAL/S の死は確定する。命日は 2011 年 7 月 21 日、 最後のシャトル OV-104 アトランティス搭載の AP-101S から火が落とされる瞬間だった。これより 先、HAL/S でコードが記述されることは二度と無いだろう。"

<本文より> http://www2a.biglobe.ne.jp/~mizuki/tmp/programming_HAL_S_V2a.pdf

序: プログラミング言語に優务は無い、と言う人がいる。 それは今日の、素晴らしい言語が綺羅星のように並び立つ現状に慣れた、恵まれた立場からの発 言である。残念ながらプログラミング言語に優务は存在する。あまりの酷さに頭をかきむしり、製 作者の正気を疑う、そういう言語は存在する。所詮、人が作るものなのだから。 プログラミング言語は決して、チューリング完全を獲得次第速やかにユーザフレンドリーになっ たり、記述の簡潔さを自律的に獲得したりはしない。それらは創造者が与えるものなのだ。 本書では、残念ながら優れた言語とならなかった例として、ひとつのプログラミング言語を紹介 する。

HAL/S は珍しい、死亡日時がはっきりしたプログラミング言語となる。STS-135 向けのミッション用コード差分の最後のものが書かれた瞬間に、HAL/S の死は確定する。命日は 2011 年 7 月 21 日、最後のシャトル OV-104 アトランティス搭載の AP-101S から火が落とされる瞬間だった。これより先、HAL/S でコードが記述されることは二度と無いだろう。

.

.

.

水城徹さんがこれを執筆されてから、丁度 10 年が経過して、数多のソフトウェア言語が生まれそして設計自体も洗練されてきました。 今、私は機械学習モデルの実運用化に関っていて、当時と全く異なる状況ではありますが、改めてこのテキストを読んでいます。

f:id:entre_temps:20210620134035p:plain

(上記の記事より引用させていただきました)

branch not equal

実はこのブログは昔から少しずつ書いていたブログを引き継いでいたりします。

ちょっとイキった名前をつけたブログでしたが、当時は non-OS から rt-OS、embeded-Linux など組み込みシステム、それだけでなく Verilog-HDL や VHDL でデジタル回路も組んでいました。

そのためだいぶ低レイヤーの視点で、また今の世の中からしたら価値のない情報ばかりですので、一新した(つもり)のです。

そこからいくつか、今でも面白なと思うものを転載しようと思います(とはいえ、ほぼ無いですが)。

SuperCollider を Emacs で使う(Scel)

概要

ここ最近、だいぶ久しぶりに SuperCollider や Max を再開し、過去のコードを眺めたり紐解いたりしている(昔は PowerPC だったし、Max/Msp 4 だった)。 今は OSC などアプリケーション間通信プロトコルも整備されているし、Processing や Ableton Max for Live など他のアプリケーションとの連携も容易になってきている。 自分にとっては手慣れた Python が FoxDot のような形で使えるようになってきているのも嬉しい。 何より、Python にも librosa などサウンドプロセッシングのライブラリがあるし、Machine Learning など広大な世界が広がっている。

このような背景で再度始めたわけですが、やはり手慣れたツールでやりたいので EmacsSupercollider を使う環境を準備しました。 その方法を備忘含め記します。

手順

  1. Scel をダウンロード(thanx!)
  2. sclang**.el を .emacs/site-lisp に配置
  3. HelpSource と sc を /Users/<ユーザー名>/Library/Application Support/SuperCollider/Extensions/scide_scel に配置
  4. init.el に path と require を追加
(dolist (dir (list
              "/sbin"
              "/usr/sbin"
              ...
              "~/Applications/SuperCollider/SuperCollider.app/Contents/MacOS"
))

(require 'sclang)

私はこれにショートカットを足しています。

(defun my-sclang-mode-init ()
  (local-set-key "\C-c\C-b" 'sclang-server-boot)
  )
(add-hook 'sclang-mode-hook 'my-sclang-mode-init)

参考までに最後にデフォルトのキーマップやコマンドを載せておきます。

使い方

Supercollider は起動しておく必要はありません。 Emacs から sclang-start で起動します。

M-x sclang-start
compiling class library...
    Found 850 primitives.
    Compiling directory '/Users/<ユーザー名>/Applications/SuperCollider/SuperCollider.app/Contents/Resources/SCClassLibrary'
    Compiling directory '/Users/<ユーザー名>/Library/Application Support/SuperCollider/Extensions'
    Compiling directory '/Users/<ユーザー名>/Library/Application Support/SuperCollider/downloaded-quarks/BatLib'
    Compiling directory '/Users/<ユーザー名>/Library/Application Support/SuperCollider/downloaded-quarks/FoxDot'
    numentries = 1272073 / 19323360 = 0.066
    5751 method selectors, 3360 classes
    method table size 20776064 bytes, big table size 154586880
    Number of Symbols 14863
    Byte Code Size 438094
    compiled 563 files in 1.63 seconds
compile done
localhost : setting clientID to 0.
internal : setting clientID to 0.
Emacs: Initializing lisp interface.
Class tree inited in 0.02 seconds


*** Welcome to SuperCollider 3.11.0. *** For help type C-c C-y.
Emacs: Index help topics in 0.445 seconds
Emacs: Built symbol table in 0.0247 seconds

忘れずに server を boot して

M-x sclang-server-boot
server 'localhost' unresponsive, rebooting ...
'/quit' message sent to server 'localhost'.
Booting server 'localhost' on address 127.0.0.1:57110.
Found 0 LADSPA plugins
Number of Devices: 5
   0 : "外部"
   1 : "外部"
   2 : "MacBook Airの"
   3 : "MacBook Airのス"
   4 : "ZoomAudioD"

"外部" Input Device
   Streams: 1
      0  channels 1

"外部" Output Device
   Streams: 1
      0  channels 2

SC_AudioDriver: sample rate = 44100.000000, driver's block size = 512
SuperCollider 3 server ready.
Requested notification messages from server 'localhost'
localhost: server process's maxLogins (1) matches with my options.
localhost: keeping clientID (0) as confirmed by server process.
Shared memory server interface initialized

これで準備は OK です。 試しに SuperCollider Workspace (scratch のようなインタラクション用のサンドボックス) にこれを打ち込み、実行します。

{ LFSaw.ar([160, 160 + 12.midicps], 0, 0.2) }.plot(0.1);
M-x sclang-eval-region-or-line

ちゃんとプロットもされます。

f:id:entre_temps:20210620104057p:plain
scel

最後に

コマンドはこれくらいあるので、ほぼ開発する上においては不自由しないでしょう。何より Emacs が使えるのが私は嬉しいと思っています。いつもながら、開発してくれている方々に感謝です。

Possible completions are:
sclang-beginning-of-defun 
sclang-browser-beginning-of-link 
sclang-browser-follow-link 
sclang-browser-mode 
sclang-browser-mouse-follow-link 
sclang-browser-next-link
sclang-browser-previous-link 
sclang-browser-quit 
sclang-class-tree 
sclang-clear-post-buffer 
sclang-complete-symbol 
sclang-customize
sclang-dump-full-interface 
sclang-dump-interface 
sclang-edit-dev-source 
sclang-edit-help-code 
sclang-edit-help-file 
sclang-edit-html-help-file
sclang-electric-brace 
sclang-electric-slash 
sclang-electric-star 
sclang-end-of-defun 
sclang-eval-defun 
sclang-eval-document
sclang-eval-expression 
sclang-eval-line 
sclang-eval-region 
sclang-eval-region-or-line 
sclang-find-definitions 
sclang-find-help
sclang-find-help-in-gui 
sclang-find-primitive 
sclang-find-references 
sclang-goto-help-browser 
sclang-help-minor-mode 
sclang-help-mode
sclang-help-mode-beginning-of-defun 
sclang-help-mode-end-of-defun 
sclang-index-help-topics 
sclang-kill 
sclang-main-run 
sclang-main-stop
sclang-minor-mode 
sclang-mode 
sclang-mouse-next-server 
sclang-next-server 
sclang-open-help-gui 
sclang-pop-definition-mark
sclang-recompile 
sclang-server-boot 
sclang-server-display-default 
sclang-server-dump-osc 
sclang-server-free-all 
sclang-server-make-default
sclang-server-pause-recording 
sclang-server-prepare-for-record 
sclang-server-quit 
sclang-server-reboot 
sclang-server-record 
sclang-server-stop-recording
sclang-set-server-latency 
sclang-show-method-args 
sclang-show-post-buffer 
sclang-show-server-latency 
sclang-show-server-panel 
sclang-start
sclang-stop 
sclang-switch-to-workspace 
sclang-toggle-debug-command-handler 
sclang-update-server-info

勘を取り戻したら FoxDot や Python や他のアプリケーションとの通信含め色々とトライしたいと思っています。

Arduino IDE で構造体宣言があるにも関わらず 'not declared in this scope' エラーが発生する

概要

タイトルのとおりですが、Arduino IDEC/C++ の文法に則って記述した構造体宣言があるにも関わらず 'not declared in this scope' でコンパイルエラーが発生する場合があります。
この原因と解決方法を書いておきます。

現象

sketch.ino こコードの一部を記載しますが、構造体が関数の前に宣言されており、C/C++ の文法に則っています。

typedef struct _T_NUM{
  uint8_t  status;
  uint16_t peak;
} T_NUM;

void get_num(T_NUM* _que)
{
  ....
  return;
}

しかしながら、Arduino IDEコンパイルをすると次のコンパイルエラーとなります。

sketch:159:22: error: variable or field 'get_num' declared void
 void get_num(T_NUM* _que)
                      ^~~~~
sketch:159:22: error: 'T_NUM' was not declared in this scope
sketch:159:29: error: '_que' was not declared in this scope

原因

Arduino IDEコンパイル時にスケッチを元に独自の方法で関数プロトタイプ宣言などを挿入して C ソースコードを生成します。
ここで、構造体宣言の関数プロトタイプ宣言の順が前後してしまい、あたかも宣言されていないかのようになってしまうということです。

対策

いくつかあるのですが、私が有効だった方法は「宣言をヘッダーに書き、インクルードする」です。

宣言をヘッダーに書き、インクルードする。

先程の sketch を sketch.io と header.h に分割し、 header.h を sketch.io からインクルードします。

<header.h>

#ifndef HEADER_H
#define HEADER_H

typedef struct _T_NUM{
  uint8_t  status;
  uint16_t peak;
} T_NUM;

#endif

<sketch.ino>

// コード頭で
#include "header.h"

...

void get_num(T_NUM* _que)
{
  ....
  return;
}

Arduino IDEC/C++ の煩雑な部分を隠蔽して実装をしやすくしてくれるのですが、Arduino IDE のやってくれる部分とぶつかってしまう場合があるということですね。

プロトタイプ宣言をあえて前に挟む

もう一つの方法が紹介されていました。
sketch.ino に関数プロトタイプ宣言を敢えてします。

typedef struct _T_NUM{
  uint8_t  status;
  uint16_t peak;
} T_NUM;

void get_num(T_NUM* _que); // これを敢えて書くことで、IDE が宣言を自動的に挿入しないようにする。
void get_num(T_NUM* _que)
{
  ....
  return;
}

ただし、私はこの方法がうまく機能しなかったので、IDE の version などによるのかもしれません。

リファレンス

この内容は全てこの QA から抜粋しました。

forum.arduino.cc

SOC2 (Service and Organization Controls 2) 保証報告書

概要

業務で必要になったため、「SOC2 (Service and Organization Controls 2) 保証報告書」について簡単にまとめ、参考サイトも貼っておきます。

上記サイトから私の興味があった点だけピックアップしたものですので、詳細は掘り下げていただければと思います。

SOC2 とは

SOC2(Service and Organization Controls 2)は、受託業務のセキュリティ・可用性・処理のインテグリティ・機密保持に係る内部統制の監査で、サイバーセキュリティのリスクマネジメント統制に関する報告書の実質的なグローバルスタンダードです。

簡単に言うと、この報告書は受託業務のサービス提供会社の内部統制について、独立した監査法人公認会計士が第三者の立場から検証した結果が記されたものです。
したがって、外部のクラウドサービスを利用するにあたって、そのサービスの運営会社を業務委託先として評価する際に、内部統制の視点からの有用な報告書だと言えます。

ISMS との違い

日本では ISMS情報セキュリティマネジメントシステム)の認証を取得している企業も多いかと思います。 定期的に、ISMS 監査があるのでデスク周りに機密書類を置かないようにしてください、などのアナウンスが回ってくることもあるでしょう。

まずSOC2は、外部から『保証報告書として提供』されるものであり、ISMSのような何らかの「認証を取得する」ものではありません。ここがピンとこない方もいるのでは。

ISMSは、情報セキュリティに対するマネジメントシステムの仕組みが、そのクラウドサービスを運営している企業にある一定以上の水準で『存在する』ことを証明しているだけで、そのサービスそのものがどういう内部統制で運営されているかを知ることができません。また、監査で部分的に問題が見つかっても改善されていれば証明書が発行されます。一体どのような不適合が見つかったのか、何がどう改善されたのかを知る手段がありません。

SOC2保証報告書は、内部統制の仕組みが詳細に記述されているため、入手して読めば、そのクラウドサービスのセキュリティ設計や運用に関する具体的な手続きについて知ることができます。また、監査で検出された内容がありのまま記載されています。原則として、報告書はそのまま提出するルール(抜粋等はNG)なので、そのサービスを利用して問題ないかどうかの判断材料として有効だと言えるでしょう。

SOC2 保証報告書は ISMS のように認証ではないため、実際のドキュメントは数十ページにわたる監査項目と実際の内部統制の仕組みの詳細が細かく記されています。
ですのでクラウドのシステム構成、ネットワークアーキテクチャや HR のロール(オンボーディング、トレーニングやセパレーション)、さらに様々な IT オペレーションについての仕組みが記述されています。
そのため、ISMS のように「内部統制の仕組みがある」ことが証明されているだけの認証よりも、もう一段深く踏み込んだ報告となっています。

まとめ

これから SOC2 保証報告書を取得しようとしている方だけでなく、SOC2 を取得している企業のサービスを利用している方も いるでしょう。
よくセキュリティ部門から聞かれるのが「ISMS と何が違うの? ISMS 認証取得していないけど大丈夫(SOC2で大丈夫)?」といったことかと思いますが、基本的に ISMS と同等に(か、それ以上に)そのサービスの運営会社を業務委託先として評価する際に有用なものです。

ほとんどこちらの記事から抜粋させていただきました。
cloudpack.media

anaconda + screen で activate 時にエラー発生

始めに

私は screen 環境をよく使うのですが、新しい環境で anaconda を初めて使うときなどによく発生するエラーとして以下があります。

何度もハマっている(のに忘れる)ため、備忘のため書いておこうと思います。

エラーについて

どういう時に発生するかと言うと、

1. anaconda を install します。

参考:https://entre-temps.hatenablog.com/entry/setup_machinelearning_env

2. 新しい env を作ります。

$ conda create -n py36_base python=3.6
$ conda info -e
# conda environments:
#
base                  *  /anaconda3
py36_base                /anaconda3/envs/py36_base

3. screen で使おうと、起動し conda activate py36_base するとエラーが発生します。

~ $ conda activate py36_base

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

原因

何が原因でこれが起こるかというと、要するに .bash_profile を screen はデフォルトではロードしないのです。

.bash_profile には下記の anaconda の初期設定スニペットがインストール時に自動的に追記されます。

そのため、ここがロードされないと正常に環境変数などが設定されないことになり、先程のエラーに繋がります。

# added by Anaconda3 2019.10 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/opt/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
# . "/opt/anaconda3/etc/profile.d/conda.sh"  # commented out by conda initialize
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda init <<<

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

解決方法

至極単純で、.screenrc に次の一行を加え、screen 起動時に .bash_profile を読むように設定すれば解決します。 https://serverfault.com/questions/226783/how-to-tell-gnu-screen-to-run-bash-profile-in-each-new-window/226788

shell -$SHELL

以上です。

ラズパイでパスワードを忘れた際のリセット方法

この記事の内容

しばらく箪笥にしまっていたラズパイを久々に引っ張り出してきてログインしようとしたらパスワードを忘れて、ということがよく起こります。
ここでは、パスワードをリセットする方法について書きます。

ラズパイでパスワードを忘れた際の方法

必要なもの

  • ディスプレイ
  • キーボード

環境

Raspberry Pi 2 Model B V1.1

$ cat /etc/debian_version
9.3

手順

ほぼこちらを参考に、少しコマンドエラーを修正しました。 https://canalier.com/raspberry-pi%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%BF%98%E3%82%8C%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6/

# /Volumes/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait init=/bin/sh
# su
root@(none):/# mount -rw -o remount /dev/mmcblkop2 /
...... EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)

root@(none):/# pwconv
root@(none):/# passwd pi