デジカメの記録メディア

デジカメで画像を記録する部分をメディア(メモリーカード)という
記録メディアにはSDカード、コンパクトフラッシュ、xDピクチャーカード、メモリースティックなどがある
デジカメの機種によってどのメディアを使うか決まっている

### SDメモリーカード
サンディスク、松下、東芝が開発
32GB
Class 2 :読み書き時のデータ転送速度が最低 2MB/ 秒
Class 4 :読み書き時のデータ転送速度が最低 4MB/ 秒
Class 6 :読み書き時のデータ転送速度が最低 6MB/ 秒

### コンパクトフラッシュ
サンディスク提唱
コントローラーICとフラッシュメモリICを実装

### xDピクチャーカード
オリンパス、富士フイルム、東芝が共同開発

### メモリースティック
ソニー開発

HDD、メモリー系は東芝強いな〜
san disk

しかし、今はクラウドの時代なのに、未だにメモリーカードに保存している意味がわからんな。

デジカメのレンズの仕組み

レンズとは?
-> 光を屈折させるガラスやプラスチックで作られた薄い部品
-> レンズそのものだけでなく、ピント調整や光の量を調整する部品も合わせたレンズシステム全体を指すことが多い
-> 光の通り方をコンピュータで計算し、最適な像ができるよう設計している
-> ピント合わせはレンズの全部または一部を前後させる
-> ヘリコイド、カムなどがある
-> レンズにはフィルムやセンサーに届く光の量を調節する仕組みもあり、「しぼり」という
-> 凹レンズは近視、凸レンズは遠視。凸凹レンズは通常組み合わせる

レンズの材質、大きさ、厚み、曲面の具合、レンズの組み合わせなどによって、レンズを通過する光はさまざまに変化する

### オートフォーカス
– 距離を測るには三角測量という方法が使われる。これは、一つの辺の長さと二つの頂点の角度が決まれば、三角形が定まる、という原理に基づく
– ファインダーから被写体を覗き、カメラの中にある小さな鏡をAが映るように回転させる
– デジカメでは、コントラスト検出方式というピント合わせ技術が用いられる
  センサに写る像を調べながらレンズを前後に動かし、最もコントラストが高くなる位置にレンズを止める仕組み
  多くのデジカメでは、ピントを調べる場所をいくつも用意して、ピントの合い方を計算して調整している
– 位相差検出式のオートフォーカスも一般的

### しぼりとシャッター
– 完全に開いてから完全に閉じるまでの露出時間をシャッタースピードという
– しぼりは感光材料に一度に当たる光の量を調整する仕組み

### レンズ
– センサーサイズや構造により焦点距離やレンズが異なる

### 材質
プリズムやハーフミラーなど光を透過させる光学ガラス、ミラーに使われる基板ガラス、屈折率や波長分散が細分化されるレンズ用ガラスに分けられる
アクロマティックレンズは屈折率の波長分散の小さいガラスと波長分散の大きいガラスを組み合わせることで、色収差を補正している

レンズ設計 例

焦点距離:200mm
イメージサークル:φ43.2(像高21.6mm)
Fナンバー:5.6
レンズ全長(第1面~像面):180mm以下
レンズ枚数:4枚以下
バックフォーカス:45mm以上

F値は小さいほどボケを活かした撮影が得意

### レンズの種類
(1)ズームレンズ
 ズームできる範囲によってレンズの種類が分かれている
(2)単焦点レンズ
 撮れる距離が決まっている
 美しいボケ味を出したり暗い場所が得意

### 写す範囲
焦点距離によって「広角レンズ(35mm以下)」「標準レンズ(50mm前後)」「望遠レンズ(200mm以上)」に分類できる
「○○mm」の数字が大きいほど被写体に近づいたようになる
「18-55mm」など二つの数字が書いてあるのがズームレンズ

被写体との距離が決まっているシステムの場合は、その焦点距離に合わせたレンズを設計すれば良さそうですね。
CVで、ジェスチャ認識など被写体が動く想定の場合は、精度を上げるには被写体が動くから、ピントを合わせる必要がある。
んん、ちょっと待てよ。
イメージセンサーで光電変換を行ってるわけだけど、凹レンズの制御は自動でできるってこと?

あれ、こう考えると、画像処理のアルゴリズムだけでなく、レンズの設計の問題も出てくる??

ソフトウェアのコピーレフトライセンスと非コピーレフト

OSS ライセンスの大まかな違い
– コピーレフトライセンス(GPLなど)の場合、配布者にソースコード公開の義務を負う
– 準コピーレフトライセンス(GNU Lesser General Public Licenseなど)は動的リンクとして使用した場合は、そこ以外の部分にはLGPLライセンスを適応させなくていい
– 非コピーレフトライセンス(MIT, Apache Licenseなど)の場合、成果物のソースコードを公開する義務を負わない(非公開にできる)

### Licenses一覧
– Apache License 2.0
 L 非コピーレフト型ライセンス
 L 著作権表示と免責事項表示の保持を求めている。
 L 使用、商用利用、改変、複製、公開、再配布、改変したものの配布、サブライセンス、アプリケーションへの埋め込み、特許技術の利用は可能
 L Trademarksに商標の使用を許可しない
 L 他のライセンスに比べるとルールが緩め
 L 利用割合 13%
 L Spring, Tomcat, Apache HTTP SERVER

– GNU General Public License v3.0
 L コピーレフト型ライセンス
 L ライセンシの派生物まで同じライセンスを求める
 L ライセンサが配布するOSSをライセンシが他のソフトウェアと組み合わせた場合、 ライセンサはライセンシに組み合わせ先のソフトウェアにまで同じライセンスの適用を要求
 L 著作権表示を保持しなければならない+無保証
 L GPLライセンスのオープンソース・フリーソフトウェアは、誰でも自由に複製・改変・頒布することが許可されている
 L 利用割合 14%
 L MySQL(GPL)

– MIT License
 L 非コピーレフト型ライセンス
 L 再配布時には著作権表示を残す+無保障
 L ザブライセンスや著作権者の許諾に関する内容が細かく記載されている
 L 利用割合 38%

– BSD 2-Clause “Simplified” License
 L 非コピーレフト型ライセンス
 L 再配布時には著作権表示を残す
 L 無保証
– BSD 3-Clause “New” or “Revised” License
 L 非コピーレフト型ライセンス
– Creative Commons Zero v1.0 Universal
 L 「著作権者のクレジット(名前)表記」のみが絶対の条件とされ、他に3つの使用条件を組み合わせる事で、著作権者の希望に沿ったランセンスを明示できる
– Eclipse Public License 2.0
– GNU Affero General Public License v3.0
 L コピーレフト型ライセンス
– GNU General Public License v2.0
 L コピーレフト型ライセンス
– GNU Lesser General Public License v2.1
 L 準コピーレフト型ライセンス
 L 動的リンクとして使用した場合は、そこ以外の部分にはLGPLライセンスを適応させなくていい
 L ライブラリやモジュールによく使用される
– GNU Lesser General Public License v3.0
 L 準コピーレフト型ライセンス
– Mozilla Public License 2.0

ライセンスは非常にセンシティブなところですな。

laravel 6.x 確認画面を挟んだstorage画像の保存処理

Laravelでは画像はstorageフォルダに格納する
Webからのアクセスを許すには、public/storageからstorage/app/publicへシンボリックリンクを張る必要がある
https://readouble.com/laravel/6.x/ja/filesystem.html

### 駄目な例
moveコマンドで、public配下に格納

UsersController.php

if($file = $request->file('file')){
            $name = $file->getClientOriginalName();
            $file->move('./images/tmp/', $name);
            $inputs['path'] = $name;

### 格納先・読み込み元をstorageに修正
$ php artisan storage:link
// ./public/storageが./storage/app/publicへのリンクとなる

UsersController.php

if($file = $request->file('file')){
            $name = $file->getClientOriginalName();
            // $file->move('./images/tmp/', $name);
            $file->storeAs('./public/images/tmp/', $name);
            $inputs['path'] = $name;

confirm.blade.php

<img src="{{ $inputs&#91;'path'&#93; ? asset('/storage/images/tmp/' . $inputs&#91;'path'&#93;) : 'https://placehold.jp/100x100.png' }}" class="img-icon">

確認画面で戻るボタンが押された場合は、Storage::deleteで削除する。確認画面で登録完了ボタンが押された場合は、画像の前部にCarbonでtimestampを付けて、prdフォルダに移動させる。画像のpathはDBに格納する。

UsersController.php

use Illuminate\Support\Facades\Storage;
use Carbon\Carbon;
public function store(Request $request)
    {
        $action = $request->get('action');
        $inputs = $request->except('action');

        if($action == '戻る'){
            Storage::delete('public/images/tmp/'.$inputs['profile_img']);
            return redirect()->action('UsersController@create')->withInput($inputs);
        }
        $timestamp = Carbon::now()->timestamp;
        $path = $timestamp.'_'.$inputs['profile_img'];
        Storage::move('public/images/tmp/'.$inputs['profile_img'], 'public/images/prd/'.$path);
        return 'done';
    }

ドキュメントを読む限り、storageに格納した方がファイルシステムの使う上で都合が良いように見えます。

Laravel6.x バリデーションのエラーメッセージを日本語化

### 初期(デフォルト)のメッセージ
./config/app.php

'locale' => 'ja',

$ php artisan make:request CreateUserRequest
CreateUserRequest.php

public function authorize()
    {
        return true;
    }
public function rules()
    {
        return [
            'name' => 'required',
        ];
    }

UsersController.php

public function confirm(CreateUserRequest $request)
    {
        return $request->all();
    }

view.blade.php

@if ($errors->has('name'))
  <br><span class="error">{{ $errors->first('name') }}</span>
@endif

エラーメッセージ
validation.required

### 英語のメッセージを複製
./resources/lang/ja/validation.php を作成
./resources/lang/en/validation.php の内容を ja/validation.php に複製

エラーメッセージ
The name field is required.

### 日本語メッセージにカスタマイズ
./resources/lang/ja/validation.php

'required' => ':attributeは必須です。',
'attributes' => [
        'last_name'=>'名前',
    ],

エラーメッセージ
名前は必須です。

バリデーションの仕様、メッセージに関しては、Wiki・Excelなどでステークホルダー全員で共有しながら管理することが多いでしょう。大規模なアプリケーションになるとバリデーションの数も増えてくるので、管理方法も工夫したい。

HDDとSSDの違いは?

EBSは、SSD、HDDどちらもありますが、さて、タコができているかもしれませんが違いは。

HDD
HDDはHard Disk Driveの略で、電磁的に書き込み・読み込みする
プラッタと呼ばれる磁性体に塗られた円盤が入っており、ヘッドで書き込み、読み込みする
プラッタの回転数が多いほど、短時間で大量データ処理が可能
回転数はrpmという単位で表示される、1分間のプラッタ回転数(1分間に約7200~15000回転)
磁気ヘッド先端の電磁石がディスク表面のブロックの磁気方向を変えてデータを書き込む。書き込まれたデータは磁気リーダで読みこむ。読み込みはレコードの仕組みに似ている
電波ノイズを軽減する数値計算用アルゴリズムを改良している
保存できるデータ量が大きく、容量単価が安価だが、衝撃に弱く消費電力が大きい
機械駆動式のため、徐々に壊れる
トラックまでヘッドを移動させる「シーク時間」とセクターが来るまで待つ「回転待ち」時間を要する
SEAGATE, Toshiba, Western Digital
レーザーを使ってディスク表面にピンポイントで熱を与えてデータを書き込むheat assisted magnetic recording、HAMRが開発中。Bit Pattern Mediaが実用化すれば20TビットのHDDなども

SSD
Solid State Driveで半導体素子メモリを使ったドライブ
メモリーチップ内蔵。メモリチップはデータを記憶するICチップ
SSDの構造は、コントローラとNAND型フラッシュメモリ
衝撃に強く、発熱、消費電力が少ない、読み書きの速度が早く作動音がない。
HDDより小さく、軽い。ただし容量が少なく、容量単価の価格が高い
フラッシュメモリのセルも徐々に劣化する。1千~1万回で劣化
CFD、Samsung, Silicon-Power, Transcend
真性半導体、P型半導体、N型半導体に変化し、シリコンウエハーの表面に電子回路パターンを多層形成する
電子回路パターンはNAND型:否定論理積、NOR型:否定論理和
セル内部のフローティングゲートで電子を貯めているため、電源を切っても記憶できる
セルは、絶縁膜、フローティングゲート、トンネル酸化膜、シリコン基盤
SSDコントローラがNAND FLASHを制御
ウェアレベリング処理で、セルの負担を軽減 エラー補正機能やブロックの消去回数なども管理している
SSDは数百メガバイト/秒の転送速度で、HDDの50〜150MB/Sを大きく上回る NANDフラッシュメモリを平行動作

デュアルストレージ
SSDとHDDを両方搭載
SSDにはOSを入れ、HDDにはソフトやデータ保存を行う
e.g. M.2 SSD 256GB Serial ATAIII M.2規格+1TB Serial ATAII 5400rpm

ヨドバシカメラなどをいくと、windowsのノートはデュアルストレージがかなり売られていた。SSD256GB + HDD1T or 2TBが多い。
OSXはSSDだけども、デュアルになってくのだろうか。。

GitLab

GitLabはグループ・プライベートレポジトリが作れる
無償版Community Editionと有償版Enterprise Editionがある
Railsで作成されている

gitlabにgithubのアカウントでログインしようとしたら、Invalid Login or password。おかしいなと思ったら、”sigin in with”のところでauthする必要があったのね。

使い方はgithubと似ていそうですね。

フーリエ変換

import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt

N = 2**20
dt = 0.0001
f1, f2 = 5, 8
A1, A2 = 5, 0
p1, p2 = 0, 0

t = np.arange(0, N*dt, dt)
freq = np.linspace(0, 1.0/dt, N)

y = A1*np.sin(2*np.pi*f1*t + p1) + A2*np.sin(2*np.pi*f2*t + p2)

yf = fft(y)/(N/2)

plt.figure(2)
plt.subplot(211)
plt.plot(t, y)
plt.xlim(0, 1)
plt.xlabel("time")
plt.ylabel("amplitude")

plt.subplot(212)
plt.plot(freq, np.abs(yf))
plt.xlim(0, 10)
#plt.ylim(0, 5)
plt.xlabel("frequency")
plt.ylabel("amplitude")
plt.tight_layout()
plt.savefig("01")

ちょっと待て、
scipyって何?
matplotlibの基本的な使い方は?

ベクトルの内積

対応する成分同士を掛け算してそれらの和を取る
ベクトルとベクトルの内積はスカラーになる
内積の記号はが多い

直行条件とは、なす数が90°(cos90°=0)

法線ベクトル:全ての接線と直交するベクトル

Your PostgreSQL is too old

[vagrant@localhost ipa]$ yum list installed | grep postgres
postgresql.x86_64 8.4.20-8.el6_9 @base
postgresql-devel.x86_64 8.4.20-8.el6_9 @base
postgresql-libs.x86_64 8.4.20-8.el6_9 @base
postgresql96.x86_64 9.6.15-1PGDG.rhel6 @pgdg96
postgresql96-devel.x86_64 9.6.15-1PGDG.rhel6 @pgdg96
postgresql96-libs.x86_64 9.6.15-1PGDG.rhel6 @pgdg96
postgresql96-server.x86_64 9.6.15-1PGDG.rhel6 @pgdg96

psqlが8.4を読み込んでいるため、「Your PostgreSQL is too old」のエラーが出る

まず、psqlにログインして、実行ファイルを探します
[vagrant@localhost ipa]$ su – postgres
パスワード:
-bash-4.1$ which -a psql
/usr/bin/psql