ホーム » 2018 » 4月 (ページ 2)

月別アーカイブ: 4月 2018

2018年4月
1234567
891011121314
15161718192021
22232425262728
2930  

最新の投稿(電子情報)

アーカイブ

カテゴリー

緊急連絡システムとメール分析システム

私が管理している丹南地区緊急連絡システムで、利用者の方から『「受信確認」作業をしているのに、記録されていない…』との相談を受ける。

メール分析システム

上記の現象は、昨年度に行った迷惑メールの分析システム対策が原因であった。

緊急連絡システムでは、ユーザに送った文面の末尾に URL を添付し、その URL をユーザにアクセスしてもらうことで、受信確認を行っている。

一方、連絡システムで、ユーザがメールアドレスを変更したり、ユーザ登録にミスがあると、相手に届かないメールが発生する。最近のメールシステムでは、プロバイダが迷惑メールの分析をすることがあり、この分析処理の中でメール内のURLを、分析システムがアクセスしていると思われる。

コレ以外にも、チャット表示形式のメールアプリでは、届いたメールの概要を確認するために、文中のURLをアクセスするものもある。このような処理が行われると、ユーザがメールを読んでいないのに、受信確認の URL をアクセスされ、受信確認が済んだことになってしまう。

最初、この現象を把握し状況を確認したら、このような分析システムの多くは逆引きできないIPアドレスからアクセスしていることが判明した。そこで、逆引きできないIPアドレスからの受信確認は、アクセス履歴を保存しないように改良を行っていた。

さらなる対策

しかし、今回相談を受け確認を行った所、逆引きできないIPアドレスの中に、通常のユーザからのアクセスも含まれていることが分かった。

そこで、今回以下のような改良を行った。

逆引きできないアドレスからのアクセスの場合には、以下のような送信フォームを表示し、ユーザが「確認」ボタンを押すことで受信確認の記録を行うようにした。

この方法は、ユーザが受信確認のために2回ボタンを押す必要があるが、止む終えないかな。

macOSのOneDriveでキーチェーンのパスワード

OneDrive アプリの更新がかかったら、「キーチェーンが一致しない」というエラーで OneDrive が起動しなくなった。

対応法法を調べると、キーチェーンのリセットとか書いてあるので色々と調べたけど、いい方法がない。グダグダ考えてもアプリの一時的な問題かと思い、macOS を再起動かけたら、普通に起動してくれた。

はぁ…

高専ライブ:2018年4月15日(第570回)

収録放送でお送りしました。

  • オリエンテーション合宿の話
  • 乗り物の話
  • サイエンス共和国 第27回「テラヘルツの話」
  • ディズニーランドの話

担当:田中(2C,MC)、山野(2EI,MIX)、西島(4EI)、中島(4C),西(教員)

オブジェクト指向(2018) / ガイダンス

専攻科2年のオブジェクト指向プログラミングの授業の1回目。最初に授業全般の概要を説明した後、オブジェクト指向の歴史とC言語の構造体の説明。

オブジェクト指向プログラミングの歴史

最初のプログラム言語のFortran(科学技術計算向け)の頃は、処理を記述するだけだったけど、 COBOL(商用計算向け)ができた頃には、データをひとまとめで扱う「構造体」(C言語ならstruct …}の考えができた。 その後のALGOLの頃には、処理をブロック化して扱うスタイル(C言語なら{ 文 … }の複文で 記述する方法ができて、処理の構造化・データの構造化ができる。これが「構造化プログラミング(structured programming)」 の始まりとなる。
この後、様々なプログラム言語が開発され、C言語などもできてきた。 一方で、シミュレーションのプログラム開発(例simula)では、 シミュレーション対象(object)に対して、命令するスタイルの書き方が生まれ、 データに対して命令するという点で、擬人法のようなイメージで直感的にも分かりやすかった。 これがオブジェクト指向の始まりとなる。

この考え方を導入した言語の1つが Smalltalk であり、この環境では、プログラムのエディタも Smalltalk で記述したりして、オブジェクト指向がGUIのプログラムと親和性が良いことから普及が拡大する。

C言語にこのオブジェクト指向を取り入れて、C++が開発される。さらに、この文法をベースとした、 Javaなどが開発される。最近の新しい言語では、どれもオブジェクト指向の考えが使われている。

構造体の導入

C++でのオブジェクト指向は、構造体の表記がベースになっているので、まずは構造体の説明。

// 構造体の宣言
struct Person {      // Personが構造体につけた名前
   char name[ 20 ] ; // 要素1
   int  phone ;      // 要素2
} ;                  // 構造体定義とデータ構造宣言を
                     // 別に書く時は「;」の書き忘れに注意
// 構造体変数の宣言
struct Person saitoh ;
struct Person data[ 10 ] ;
// 実際にデータを参照 構造体変数.要素名
strcpy( saitoh.name , "t-saitoh" ) ;
saitoh.phone = 272925 ;
for( int i = 0 ; i < 10 ; i++ ) {
   scanf( "%d%s" , data[ i ].name , &(data[ i ].phone) ) ;
}

情報構造論ガイダンス

情報構造論のガイダンス

プログラム作成でのポイント

この授業で恒例の、プログラムを作る場合に何に気をつけてプログラムを作成するかを聞いてみた。今年は、以下に示す3要素をうまく答えてくれたかな。

  • プログラムの速度
  • プログラムのわかり易さ
  • メモリの使用量

プログラムを作る場合、この3要素がトレードオフの関係にある。プログラムの速度を優先すると、プログラムが分かり難くなったり、メモリを大量浪費するものだったりする。

プログラム例

例えば、配列の中から、目的データを探すプログラムの場合、最もスタンダードなプログラムは以下の方法であろう。

// ((case-1))
// 単純サーチ O(N)
#define SIZE 1024
int a[ SIZE ] ; // 配列
int size ;      // 実際のデータ数(Nとする)
int key ;       // 探すデータ
for( int i = 0 ; i < size ; i++ )
   if ( a[i] == key )
      break ;

しかし、もっと早く探したいのであれば、2分探索法を用いるだろう。

// ((case-2))
// 2分探索法 O(log N)
int L=0 , R=size ; // プログラムは複雑になった 
while( L != R ) {
   int M = (L + R) / 2 ;
   if ( a[M] == key )
      break ;
   else if ( a[M] < key )
      L = M + 1 ;
   else
      R = M ;
}

でももっと速いプログラムとしたければ、

// ((case-3))
// 添字がデータ O(1)
// 探すデータが電話番号 272925 のような 6 桁ならば
int a[ 1000000 ] ;
a[ key ] に保存
// 処理速度はクソ速いけど、メモリは大量消費

良いプログラムを作るとは

プログラムを作る時には、メモリが大量に使えるのなら、速いものを使えばいい。だけど実際には、そのシステムには限られた予算があるだろう。

実際には、限られる予算から、メモリやCPUが決まり、その会社の人員やら経験やらで、プログラム開発に使える時間がきまる。プログラムをデザインするとは、限られた条件の中で、適切な速度のコンピュータ、適切な量のメモリでコンピュータを用意し、限られた納期の中でシステムを完成させることである。

動作時間の予測

ここで、プログラムの実行時間を細かく分析してみる。例えば、前節のcase-1単純サーチをフローチャートで表せば、以下のように表せるだろう。フローチャートの各部の実行回数は、途中で見つかる場合があるので、最小の場合・最大の場合を考え平均をとってみる。また、その1つ1つの処理は、コンピュータで機械語で動くわけだから、処理時間を要する。この時間を とする。

この検索処理全体の時間 を考えると、平均時間とすれば、以下のように表せるだろう。

ここで例題

この単純サーチのプログラムを動かしてみたら、N=1000で、5μ秒かかったとする。では、N=10000であれば、何秒かかるだろうか?

感のいい学生であれば、直感的に 50μ秒 と答えるだろうが、では、Tβ,Tα は何秒だったのだろうか? 上記のT(N)=Tα+N ✕ Tβ に当てはめると、N=1000,T(N)=5μ秒の条件では、連立方程式は解けない。

ここで一番のポイントは、データ処理では N が小さな値の場合はあまり考えない。N が巨大な値であれば、Tαは、1000Tβに比べれば微々たる値という点である。よって

で考えれば良い。これであれば、T(1000)=5μ秒=Tβ×1000 よって、Tβ=5n秒となる。この結果、T(10000)=Tβ×10000=50μ秒 となる。

猫バカ

新入生歓迎会の教員紹介で、猫バカ認定を頂いたので、昨日の写真を上げとこう。

うわぁ、黒猫ちゃん、極悪そうに写ってるな。

高専ライブ:2018年4月8日(第569回)

  • 入学式の話
  • 健康の話
  • サイエンス共和国 第26回「壮大な借金の話」

担当:水島(4C,MC),越後(2E,MIX)、田中(2C)、中村(教員)

高専ライブ:2018年4月1日(第568回)

  • うその話
  • 桜の話
  • サイエンス共和国 第25回「新幹線の重さの話」
  • 高専ライブの話

担当:坂田(2C,MC)、西島(4EI,MIX)、山野(2EI)、西(教員)