仮想通貨ニュース

シグナルをわかりやすく解説

シグナルをわかりやすく解説
  1. ブラウザ側の処理が減ることで、ページ表示が速くなる
  2. スパムを防げる
  3. 無限の可能性 ※こちらにITP対策なども含まれると思われます

シグナルをわかりやすく解説

一般的に GUI プログラミングでは、一つのウィジェットやオブジェクトの状態が変わった際に何かしらの処理を行うために、他のウィジェットやオブジェクトにそれを通知する仕組みが必要です。前回、および前々回のサンプルアプリケーションの場合、ユーザーが Close ボタンを押した際にウィンドウを閉じる処理をするために「ボタンが押された」ことをどこかに通知する必要があります。

シグナルとは

シグナルとは何かが発生したことを他のオブジェクトに通知するための C++ の関数です。

  • ボタンが押された際に発生するシグナル [qt QAbstractButton clicked()]
  • ボタンのオン/オフが切り替わった際に発生するシグナル [qt QAbstractButton "toggled(bool on)"]
  • QLineEdit の内容が変更された際に発生するシグナル [qt QLineEdit "textChanged(const QString &text)"]

ANSI C の割り込み signal(2) とは全く別のものになります。

スロットとは

スロットはシグナルに反応して実行される C++ の関数です。

  • ウィジェットを閉じるスロット [qt QWidget close()]
  • ウィジェットの表示/非表示を切り替えるスロット [qt "" "QWidget::setVisible(bool visible)" l=qwidget m=#visible-prop]
  • ラベルの文字列を変更するスロット シグナルをわかりやすく解説 [qt "" "QLabel::setText(const QString &text)" l=qlabel m=#text-prop]

シグナルとスロットの使用

Qt のプログラミングではシグナルとスロットを"接続"して使用します。この接続により、シグナルが発生した際にスロットが自動的に実行されます。この接続は [qt QObject connect()] を使用して行います。それでは前回使用したサンプルアプリケーションでシグナルをスロットに接続してみましょう。

[1] で QPushButton のインスタンス button が押された際に発生するシグナル clicked() を Example 自身のインスタンス this のウィンドウを閉じるためのスロット close() に接続しています。これにより、Close ボタンが押された際に、Example の close() が実行されウィンドウが閉じるようになります。

Example クラスは QObject の派生クラスなので、connect() の前の QObject:: は省略可能です。
実行をして、Close ボタンをクリックしてみてください。無事にウィンドウが閉じられ、アプリケーションが終了したでしょうか。

シグナルとスロットの接続について

QObject::connect() において、シグナルは SIGNAL マクロで、スロットは SLOT マクロで囲む必要があります。引数については型のみを記述し、const、& や変数名は記述しません。スロットの引数の型と順番は、シグナルの引数の型と順番に正しく対応している必要があります。スロットの引数がシグナルの引数より少ない場合は正しく動作し、余分なシグナルの引数は単純に無視されます。

シグナルとスロットの引数の型が合わなかった場合には接続は失敗します。QObject::connect() は false を返し、実行時に警告が出力されます。これにより、シグナルが発生しスロットが実行される際の引数の型の安全性が確保されます。

生理学研究所 総合生理研究系 生体システム研究部門

大脳基底核で処理された情報は、一部は脳幹に下行するものの、大部分は視床を介して前頭葉を中心に大脳皮質に戻る。したがって、大脳皮質とくに前頭葉と大脳基底核は大脳皮質—大脳基底核ループ(cortico-basal ganglia loop)を構成している(図1, 2) 1) 。このような大脳皮質—大脳基底核ループは、上下肢や体幹の運動をコントロールしている運動ループ(motor loop)以外に、眼球運動ループ(oculomotor loop)、前頭前野ループ(prefrontal loop)、辺縁ループ(limbicloop)など、それぞれ対応する大脳皮質領野と、大脳基底核、視床亜核からなるループが存在している 1,3) 。このようなループを通して、大脳基底核は上下肢の運動ばかりでなく、眼球運動や高次脳機能、情動などもコントロールしている。

3. 大脳基底核の機能

大脳基底核の出力部である淡蒼球内節・黒質網様部は、GABA作動性の抑制性ニューロンで成り立っており、高頻度(数十Hz)で持続的に発射しているので、投射先である視床や脳幹のニューロンは、常に抑制された状態にある(図3)。大脳皮質からの入力によって、線条体ニューロンが活動すると、線条体—淡蒼球内節・黒質網様部投射は抑制性なので、淡蒼球内節・黒質網様部ニューロンは一時的に抑制される。その結果、出力部からの連続した抑制が一時的に除かれ(シグナルをわかりやすく解説 脱抑制、disinhibition)、投射先である視床ニューロンや、その先にある大脳皮質が興奮する。その結果、必要な運動が引き起こされる 5) 。

随意運動の際の、線条体、視床下核、淡蒼球内節・黒質網様部、視床の活動性の時間的変化を図の両側に、空間的分布を図の中央に示す。直接路は、淡蒼球内節・黒質網様部のうち、必要な運動に関連している領域(中央部分)を抑制し、その結果、視床を脱抑制することによって必要な運動のみを引き起こす。ハイパー直接路・間接路は、淡蒼球内節・黒質網様部に、時間的・空間的に広い興奮をもたらす。その結果、視床の中央部においては、運動の開始と終了を明確化するとともに、視床の周辺部においては抑制を強め、不必要な運動を抑制している。興奮性ニューロンを白で、抑制性ニューロンを黒で示す。(Nambu A. ProgBrain Res 2002 6) より)

4. 大脳基底核疾患の病態

大脳基底核疾患は、運動の多寡によって、パーキンソン病(Parkinson's disease)のように無動・寡動を来す運動減少症(hypokinetic disorder)と、ヘミバリスム(hemiballism)、ハンチントン病(Huntington's disease)、ジストニア(シグナルをわかりやすく解説 ジストニー、dystonia)などのように不随意運動を伴う運動過多症(hyperkinetic disorder)とに大別される。さらに、筋緊張が亢進あるいは低下しているのかを考えて、大脳基底核疾患を運動と筋緊張の平面上にプロットすると、統一的に分類できる(図4)。大脳基底核疾患の病態は、ハイパー直接路・直接路・間接路の活動性のバランスが崩れ大脳基底核の出力部の発射頻度が変化することにより、説明することができる(図5) 4) 。

パーキンソン病の場合、黒質緻密部のドパミン作動性ニューロンが変性・脱落し、ドパミンによる線条体の直接路ニューロンへの興奮性入力と、間接路ニューロンへの抑制性入力がなくなる 4) 。その結果、運動遂行時に大脳皮質から線条体に入力が入っても、直接路ニューロンが十分、興奮しなくなる。一方、間接路ニューロンが大きく興奮するようになる。このような変化によって、淡蒼球内節の抑制が減少し、また周辺の興奮が増大し、その結果、視床を十分、脱抑制できなくなり、運動減少となる(図5A) 8) 。

ヘミバリスムは視床下核の出血や梗塞で起こり、ハイパー直接路・間接路を介するシグナルが減少している。ハンチントン病では線条体の間接路ニューロンが脱落し、間接路を介するシグナルが減少している。これらの経路は、運動を明確に終止したり不必要な運動を抑制する機能を持っているので、運動過多になる(図5B) 4) 。ジストニアの場合は、直接路・間接路を介するシグナルが増強している。運動遂行時に線条体から淡蒼球内節への抑制性入力が増大し、淡蒼球内節が強く抑制される。その結果、視床・大脳皮質が大きく脱抑制され、運動過多になる(図5C) 9) 。また、増大した抑制性入力は広く淡蒼球内節を抑制し、主働筋と拮抗筋の共収縮や運動に必要のない遠隔筋の収縮(オーバーフロー現象)を引き起こす。ジスキネジア(dyskinesia)の場合は、線条体でドパミンが過剰に働き、直接路と間接路のバランスがパーキンソン病とは逆の状態になり、運動過多になる。

大脳基底核疾患では身体症状が強調されるが、このような変化は運動ループ以外の他ループにも起こっており、上下肢の運動ばかりでなく、眼球運動、高次機能、情動なども障害される。例えばパーキンソン病では認知機能障害、うつが、ドパミン補充療法、脳深部刺激療法(deep brain stimulation, DBS)の副作用として脱抑制性の行動異常(病的賭博、性行動亢進、反復常同行動、L-ドパ依存など)が出現する。

    シグナルをわかりやすく解説
  • パーキンソン病の場合は、直接路の活動性低下、ハイパー直接路・間接路の活動性亢進により、淡蒼球内節・黒質網様部の抑制が減少し、その結果、視床の脱抑制が減少し、運動を起こせなくなり運動減少(無動)を生じる。
  • ヘミバリスム、ハンチントン病の場合は、視床下核から淡蒼球内節・黒質網様部への興奮性入力が減少し、その結果、運動を明確に終止したり不必要な運動を抑制できなくなり、運動過多(不随意運動)を生じる。
  • ジストニアの場合は、直接路の活動性亢進により、淡蒼球内節・黒質網様部の抑制が亢進し、その結果、視床の脱抑制が亢進し、運動過多(不随意運動)を生じる。

5. 定位脳手術の治療メカニズム

しかし、DBSの作用メカニズムは良くわかっていない 10, 11) 。DBSには、持続時間の短い(数十µs)高頻度(100Hz以上)刺激が用いられるが、このような高頻度連続刺激が、局所のニューロン活動を抑制することによって症状を改善させるという説と、興奮させることによって症状を改善させるという説がある。パーキンソン病では運動時の視床下核・淡蒼球内節の活動性が亢進しているが、高頻度連続刺激を加えることにより、このような亢進した活動が次の核に伝達されるのを遮断すると解釈した方が良いかもしれない 12) 。

Perl Hackers Hub

シグナルには特定の現象が発生した場合にOSが送信してくるものや, デーモンプロセスを制御するためにユーザが送信するものなど, さまざまなものが存在します。Perlでプログラムを書く際によく取り扱うシグナルは表1のとおりですが, これ以外にもPOSIXで規定されているもの, OSごとに独自のものがあり, manなどを参照することで確認できます (注8⁠ ) ⁠。それぞれのシグナルを受信した場合のデフォルトの動作がなんであるかについても, これらのドキュメントに記載があります。また, Perlにおけるシグナルの取り扱い方について詳しくは, perldoc perlipc を参照してください。

表1 主なシグナル

シグナル名意味
SIGHUP主に設定ファイルの再読み込みを要求するために使用
SIGINT割り込みを要求 シグナルをわかりやすく解説 (Ctrl-Cが押された場合など)
SIGKILLプロセスを強制終了
SIGPIPE閉じられたパイプやソケットに書き込もうとした
SIGALRMalarmで設定した時間が経過
SIGTERMプロセスの終了を要請
SIGCHLD子プロセスが終了

ネットワークプログラムとSIGPIPE

「私の書いたサーバが突然死するんです。どうしてでしょうか」 という質問を受けることがあります。これは多くの場合, SIGPIPEの処理を忘れていることが原因です。SIGPIPEとは, 切断されたネットワークソケットなどにデータを書き込もうとした際に送出されるUNIXシグナルです。特に設定しない限り, プロセスはSIGPIPEを受け取ると強制終了されます。そのため, 通信が突然切断される可能性のあるTCPサーバにおいては, SIGPIPEを無視するよう設定する必要があります。

シグナルとErrno::EINTR

シグナルハンドラ (%SIGの各要素の値) として 'IGNORE' をセットした場合, シグナルは無視され, プロセスは何事もなかったかのように処理を継続します。

一方でサブルーチンを指定した場合は, シグナルを受信した段階でそのサブルーチンが呼び出されます。また, ネットワーク通信などを行うシステムコールが実行中だった場合は, その処理は中断されます。例として, 次のコードを見てみましょう。

alarm関数は, シグナルをわかりやすく解説 指定した時間 (単位:秒) が経過したあとに自分自身のプロセスに対してSIGALRMを送信するようOSに依頼する関数です。 $SIG にサブルーチンがセットされているので, SIGALRMを受信した段階で, ただちにシグナルハンドラ (この例では空のサブルーチン) が実行され, そのままsleepの処理が中断されます。また, $! にはシグナルを受信したためにシステムコールの実行が中断されたことを示すエラーコードErrno::EINTRがセットされます。

ただし先述したように, シグナルハンドラが 'IGNORE' だった場合は, sleepの実行は中断されないという点に注意してください。

alarmを使った通信のタイムアウト処理

sleepを中断するよりも実際的な例としては, ネットワーク通信のタイムアウト処理を挙げることができます。次のコードは, alarmを用いてソケットからの読み込みについてタイムアウト処理を行っています。

alarmを使ったタイムアウト処理のメリット/ デメリット

alarmを使ってタイムアウト処理を行うことのメリットは, ほとんどすべてのシステムコールに対してタイムアウトを設定できるという点にあります。一方, デメリットとしては, プロセス全体で1個のタイマーしか持てないため, 階層化されたプログラムにおいて使いにくいという点が挙げられます (注9⁠ ) ⁠。

そのため, alarm (とシグナルを使ったタイムアウト処理) はモジュールレベルではなくアプリケーションレベルでのタイムアウト処理に使われる一方, ネットワーク通信のようなモジュールレベルで実現可能なタイムアウト処理については, select関数を使って実装される場合が多いです。

注9) alarmの戻り値を利用することで (あるいは, より細かな操作を行うための関数であるTime::HiRes::setitimerを呼び出すことで⁠ ) ⁠, 階層化されたタイマーを実現することも不可能ではないのですが, 煩雑な処理が必要になります。

2-10 アナログ信号とデジタル信号とは


私たちの身の回りの信号はほとんどがアナログ信号です。アナログ信号とデジタル信号との間には
インターフェースとして特別な回路が必要です。では,なぜデジタル信号が必要になるのでしょうか?
それは,デジタル信号を扱う回路(以下デジタル回路)は,アナログ信号を扱う回路
(以下アナログ回路)に比べて,小型化や低消費電力化を実現できるからです。また,デジタル信号は シグナルをわかりやすく解説
劣化に強いというメリットもあります。アナログ信号は前述のように中間の値を持つ信号です。

アナログ信号を作る素子の微妙な変化(ばらつき)で信号がくずれる恐れがあります。
素子の微妙な変化による影響を抑えるためには,素子のサイズをある程度大きくする必要があります。
これは素子を小さくすることができないことを意味します。また,中間電圧を出し続けるためには常に
電流を流し続ける必要があるうえ,電流が大きくなるといったトレードオフも顕在化します。

デジタル信号は,最大値か最小値の二値しか存在せず,素子のONかOFFで作り出せます。そのため
素子に多少のばらつきがあったとしても大きな問題になりません。これは素子を小型化することが
できること意味します。さらに,アナログ信号ではないため電流を流し続ける必要がなく,
低消費電流化が可能になります。

信号の劣化についても話をしましょう。アナログ信号は前述のように中間の値を持つ信号です。
これは,1と0の間に0.3や0.75といった小数点以下の数字が存在することを意味しています。
信号を保存する場合や,通信する場合を考えてください。たとえば保存する場合,0.75を
保存したつもりが数年後に0.7になっていたら,もともとのデータは保存されたと言えるでしょうか?
たとえば通信する場合,0.3を送ったつもりが0.4で届いたら,もともとのデータは送られたと
言えるでしょうか?アナログ信号は劣化するという弱みがあります。

一方,デジタル信号は1か0しかありません。0.5付近にしきい値があり,0.5以上であれば1と
判別され,0.5未満であれば0と判別されます。さきほどの例を振り返ってみましょう。1を
保存したつもりが数年後に0.9になったとしても,しきい値0.5以上なので1と判別されます。0を
送ったつもりが0.1で届いたとしても,しきい値0.5未満なので0と判別されます。このように
デジタル信号は劣化に強いという特徴があります。だからデジタル信号が使われているわけですね。

デジタル信号でどのように情報を保存している?

では,0と1しかないデジタルデータでどのようにして様々な情報を保存しているでしょうか?それは0と1
の組み合わせです。たとえばASCIIという文字コードでアルファベットのaを0と1で表現してみると
01100001となります。ASCIIだけでなく様々な文字コードが存在しています。文字コードだけでなく画像
や音楽もすべて0と1の組み合わせで再現可能です。このようにしてデジタル信号で情報を保存している
わけですね。

マイコン内部の信号は?

マイコン内部ではどちらの信号が使われているでしょうか?実は,マイコン内部は上記で述べたように
再現性に優れるデジタル信号で処理をしています。しかし,私たちの身の回りの信号はほとんどが
アナログ信号です。そのため,マイコンに入力する時は,アナログ⇒デジタル変換(A/D変換)に信号を
変換し,デジタル信号にしてから演算など複雑な処理を行っていきます。その結果をマイコンから
アナログとして出力する場合には,デジタル⇒アナログ変換(D/A変換)します。そのため,A/D変換や
D/A変換はマイコンにとって重要な機能になります。

【入門編】Google Analytics 4(GA4)が遂に登場!2つのポイントで誕生の経緯を分かりやすく解説(後編)

2020年10月14日にGoogle Analytics 4(通称:GA4)が正式にリリースされました。これまで多くのサイト運営者に利用されてきたユニバーサル アナリティクス(通称:UA・旧GA)に代わりGoogle Analyticsの新たなスタンダードとして、GA4の活用が期待されて.

ポイント2:個人情報保護強化の潮流(プライバシーファーストの時代)

google_analytics4_background_beginner2_point2

はじめにGoogle アナリティクス 4(以下、GA4)と個人情報保護の話に直接的な関係性があるのか疑問に思われる方も少なからず居られるのではないでしょうか。Googleは、個人情報として使用または認識できるデータをGoogleへ送信することをポリシーで禁止していますし、Google Analyticsも個人情報は取得していません。
アナリティクスヘルプ「個人情報(PII)を送信しないようにする方法はこちら」
https://support.google.com/analytics/answer/6366371

ブラウザによるトラッキング対策も加速しており、iOSでは既に3rd party cookieを完全にブロック、Chromeも3rd party cookieを2022年末までに停止することを発表しています。
GAは1st party cookieを利用してデータを取得していますが、Cookieの保存期間が短くなったことでユーザー数が増加しているように見える等、数値が正確に計測できない事象も発生しています。

この様なプライバシーファーストの潮流が強まるなか、いま我々は、
「ユーザーの意思を尊重してパーソナルデータをセキュアに管理しつつ、多様化するニーズの中で一人ひとりの行動や心理の変化に合わせてパーソナライズすることで「顧客体験(CX)」を最適化する」
というハードルの高いことを要求されているのです。

更にかみ砕いてしまえば 「時代が求める適切な方法でデータを取得・管理しながら、サービスの最適化を図っていく」 必要があるのです。

1.Google Tag Managerの新機能サーバーサイドタグ(SSGTM)の登場

特にiOSではトラッキング防止機能としてITP(Intelligent Tracking Prevention)という機能を実装しており、1st party cookieに関してもJavaScriptによって発行された場合、Cookieが1日または7日で削除されてしまいます。
※Cookieが削除されると、削除後にユーザーが再訪した場合、新規ユーザーとして計測されてしまう。

この様なCookieの削除によって正確な数値が計測できないという問題を解決するため、GoogleはGoogle Tag Manager(通称GTM)というタグ管理ツールに新たな新機能を追加することで、GAで正確な数値を計測できるようにしています。

初心者向けと題した記事のためGoogle Tag Managerのサーバーサイド設定については詳細を割愛しますが、概要は以下の通りです。

GAのタグをサイトに埋め込む際、①GAのタグを直接HTMLに追加する方法と②Google Tag Manager(通称GTM)を経由して追加する方法の2パターンがあります。

このうち、後者の②Google Tag Managerを経由してGAのタグを設置し、更に新機能であるサーバーサイドタグ設定を使用すると、1st party cookieの有効期限が無限に設定できるのです。

これにより1日ないし7日で削除されていた1st party cookieが継続して使用できることで、ユーザー数をはじめとした数値が正確に計測できます。

その他にも、Google Tag Managerのサーバーサイド設定については開発者が以下のようなメリットをあげています。

  1. ブラウザ側の処理が減ることで、ページ表示が速くなる
  2. スパムを防げる
  3. 無限の可能性 ※こちらにITP対策なども含まれると思われます

<備考>
ちなみにsimo ahavaさんが運営している以下のサイトもおすすめです。
ブラウザ毎のCookieの取り扱いなどを一覧にしてくれています。
Cookie Status
https://www.cookiestatus.com/

2.Cookielessに対応していく(将来)

google_analytics4_background_beginner2_cookieless

先程GTMのサーバーサイド設定で有効期限のない1st party cookieを発行できる話をしましたが、Googleは将来的にCookieless(Cookieそのものを使用しない)にも対応する可能性がでてきました。
Googleは以前から「プライバシーサンドボックス(Privacy Sandbox)」という構想を発表し、3rd party cookie廃止以降もターゲティングや広告効果の測定ができることを目指していました。
最近では「Dovekey」といった仕組みを発表し、リターゲティングができる仕組みも考えているようです。
GitHub「Dovekey」
https://github.com/google/ads-privacy/tree/master/proposals/dovekey

3.Googleシグナルを活用した分析(将来)

サイト側 シグナルをわかりやすく解説
⇒ GAでGoogleシグナルの収集を有効にする必要がある

ユーザー側
⇒ Googleアカウントにログインしている
⇒ GA広告のパーソナライズをオンにしている

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる