ホーム » 2013 (ページ 3)
年別アーカイブ: 2013
緊急連絡システムの”~”の文字化け対策
緊急連絡システムの利用者の方から、 「URL内の”~”が文字化けして、利用者確認のURLにアクセスできない」といった トラブルがあるとのご指摘を受けた。
その方の話をまとめると、緊急連絡システムの末尾に付けられる利用者確認のURLの行が、 Docomo の SPモードメールなどで、” ̄”に書き換えられてしまうため、らしい。
送信:http://XXX.fukui-nct.ac.jp/~emc/alive.php?..... 受信:http://XXX.fukui-nct.ac.jp/ ̄emc/alive.php?.....
URLの中の”~”は、ホームディレクトリを表すために、広く一般的に用いられている URL の 記号文字であり、こんなものを書き換えてしまう SP モードメールがアホと叫びたいけど、 なんらかの対応を…と考えてみた。
緊急連絡システムのプログラムに、大きな変更を加えたくないので、 URLを “~”無しでもアクセスできるように変更し、 メール送信時に、”/~emc/…” で送信すべき場所を “~”無しのURLの ”/emc/…” で送信するように変更した。
RewriteEngine on RewriteRule ^emc/(.*)$ /~emc/\ [L]
2013年11月3日(第345回)
- まるよし Train Pops ~ 国語と遊ぼう! 第29便 「ちりとてちん」
- これからの季節の天気の話
- 食べ物の話
- おめでとうの話
担当:前田勝(4EI)、山野(2C)、五味(教員)
学生ものづくりプロジェクトによるLED照明
卒業研究で、太陽電池パネルの電力を利用した、電子情報棟非常階段のLEDによる夜間照明を作成中です。
学生のものづくり技術を、学校内の環境改善に実際に活用することを通して、 ものづくり技術を高めるプロジェクトとして作成しています。
ワード境界,共用体,列挙型
構造体の演習に引き続き、構造体の応用について説明する。
ワード境界
構造体の配列をメモリに格納する場合、ワード境界が問題となる。 最近のコンピュータでは、CPUの速度に比べ主記憶の速度は遅いため、 メモリを効率よくアクセスする必要がある。 このために、メモリ上のデータは、ワード単位で一括して読み書きされる。
struct Data { char a[ 5 ] ; int b ; short int c ; } ; struct Data array[ 10 ] ;
上記のような構造体があったとして、メモリー上に以下のように配置されていると、 array[0].b を参照する際には、04行と08行の2回のメモリアクセスがあって、 メモリ参照速度が低下する。
ワードアライメントを無視した配置 |
ワードアライメントした配置 |
このような、データを読み書きする際の、ワードの塊の境を「ワード境界」と呼ぶ。 また、右図のように、ワード境界をまたがないようにデータを配置することを、 ワードアライメントと呼ぶ。
もし、処理速度の低下より、メモリの有効利用が必要であれば、VC++であれば、”#pragma pack”や”gccの”__attribute__((packed))”などを指定する。
共用体
プログラムを作っていると、データが「名前と年齢」か「名前と住所」のどちらかで、 「名前と年齢と住所」が揃うことはない…という場合もある。この際に、”struct ..{ char name[] ; int age ; char addr[] } ; ” では、かならず3つのデータを覚えてしまい、メモリの無駄が発生するのが問題となる場合がある。 このようなときに使うのが共用体である。共用体では、中身のいずれかを覚えるために使う。 また、要素の記憶場所は共有される。
union AgeOrAddr { int age ; char addr[ 30 ] ; } ; struct NameAndAgeOrAddr { char name[ 20 ] ; union AgeOrAddr age_addr ; } ;
データの記憶場所が同じことを確認するために、以下の様な処理を実行した結果も示す。
union A { char s[4] ; int x ; } ; union A a ; // 文字列の代入 strcpy( a.s , "ABC" ) ; printf( "%8x\n" , a.x ) ; // 配列の代入 a.x = 0x12345678 ; a.s[2] = 0x99 ; printf( "%8x\n" , a.x ) ; (( 実行結果 )) 00434241 // 実験したコンピュータは Intel Xeon 11995678 // この結果より、リトルエンディアン なのが判る。
この結果は、CPUの内部が、ビッグエンディアン(68系,SPARC)か、リトルエンディアン(x86系)によって異なる。また、この順番はCPUの異なる間のネットワーク通信でも問題となることが多く、ネットワーク通信では、ビッグエンディアンを用いることになっている。
列挙型
カレンダーの処理などで、週のデータを扱う場合、日:0,月:1,火:2… と番号を振って その番号に応じてプログラムを記述する場合がある。
(( わかりにくいプログラム )) int week = なにかの週番号 ; if ( week == 3 ) { // 3がマジックナンバー 水曜日の処理 ; } (( わかりやすいプログラム )) #define SUN 0 #define MON 1 #define TUE 2 : if ( week == WED ) { // 読んでいて意味が判る 水曜日の処理 ; } (( でも週と月を整数型で扱っているだけ )) #define JAN 1 #define FEB 2 #define MAR 3 int week = 週の番号 ; week = FEB ; // エラーにはならないけど、意味的に間違い。
列挙型は、以下の様な使い方をすることで、シンプルな書き方で定数に意味をもたせることができる。このため、型の間違いの確認もできる。
enum Week { SUN , MON , TUE , ... SAT } ; enum Month { JAN , FEB , MAR , APR , MAY , ... DEC } ; enum Week week = 何らかの曜日 ; if ( week == WED ) { 水曜日の処理 ; } switch( week ) { case MON : 月曜の処理 ; break ; case WED : 水曜の処理 ; break ; // この書き方をすると、月水以外の処理が記載されていない // ことをコンパイラが警告してくれる。 } week = FEB ; // エラー:週の変数に月の値を代入することはできない。
sambaでファイルを作れても消せない
修理に出していた、学科のバックアップ用のNASが戻ってきたので、 改めて学科データの保存のための設定を行う。
samba経由でアクセスするための設定は、簡単に復旧できたが、 「ファイルを作っても消せない」という変な状況が発生。 色々やっている内に「この症状どっかで体験したよな…」というわけで、 自宅サーバの設定ファイルやらを確認するけど、思い出せない…
デジャブじゃないよな…とも思いながら、ググったら見た覚えのある 設定追加項目を発見。 OSXのファイル共有で、sambaをアクセスすると、 ファイルを作れても消せないというネタが見つかる。
[global] acl check permissions = no
こういう微妙な設定は、blog にでも残さないと、 もう一度デジャブ体験することになる…
2013年10月27日(第344回)
高専祭スペシャル!!
福井高専内のスタジオから生放送!
- まるよし Train Pops ~ 国語と遊ぼう! 第28便 「弁論大会」
まるよしさんが高専スタジオから生出演でコーナーをお送りしました。
コーナーゲスト:福井高専 畑野さん(2M) - 福井高専 高専祭のお伝えしました
ゲスト:国語科 中村先生
担当:前田勝(4EI)、松島(2C)、五味(教員)、西(教員)
MacBookAir OS X Mavericks
iOSの新機種なども出たようだけど、これに合わせて、 OSX Mavericks が無料で出た様子。 ということで、iMac に入れてみた。 iMacでインストール中には、「ディスクが壊れていて、インストール出来ない」 といった表示がでて、びびったけど、ディスクユーティリティで 修復をかけたら、無事インストールができた。
今、2台目ということで、MacBook Air にインストール中。
Mavericksって、マイナーバージョンアップかと思って、 気軽に適用したけど、10.8.x → 10.9 だったのね。 お陰で、プリンタ(Canon LBP3300)が動かなくなった。 メーカーページを見ると、11月中頃にはドライバ公開って出ていた。 ということで、当面は、卒研室のプリンタを借りることになりそう。
でも、頻繁に卒研室も面倒なので、Parallels の Windows7 に、 LBP3300のドライバ入れてみた。ちょいと面倒だけど、いちいちコピーするよりは楽かな。