プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

創作人物履歴書var1.5.1

変更履歴です。

①基本情報の備考欄を空けたファイルが取り込まれない
→取り込まれていなかった(バグ)修正しました。
②年表側と基本情報の名前の統一したい
→データ取込画面にて人物名リストを作成しました。
③エクセル年表の時期未定が取込まれない
→特定の場所の取込が全体的にできていなかった(バグ)修正しました。
④年齢は現状修正できない
→変更可能にしました。
⑤削除・更新画面の作成
→作成しました。
⑥ヘルプ画面に動画
→動画作成してアプリ上から見れるようにしました。
⑦アプリ名表示バグ
→作成しました。
⑧複数回更新すると、チェック画面の表示がおかしくなる問題(テスト中に発見)
→修正しました。

創作人物履歴書

動作↓

創作人物履歴書の動作動画

アプリ制作したので、要望等話し合う場所。
コメントに、バグなどありましたら報告ください。

6月4日・・・var1.0公開

7月21日・・・var1.5.1公開
※var1.0からアップデートの場合は、一旦アプリを削除してインストールし直してください。
動作を見やすくするため、データの持ち方を変更しました。課金はされません。
変更内容→創作人物履歴書var1.5.1 - プログラミングと日々思ったことなど

swiftでcheckboxの続き

swiftでのcheckboxについてとその周辺 - プログラミングと日々思ったことなど

これの続きです。

何となく分かったので、少しいじって別の処理を追加しようとしたところ、できなかったのでもう一度コードを読み直します。

YSCheckBoxGroupView.swiftのコードがミソのような気がする。

metricsDictionaryという変数の中に、Dictionary型に[String:CGFloat]。
viewsDictionaryに、[String:UIView]が入っている。
Dictionary型について:【swift入門 文法編】辞書(Dictionary型)をマスターする|新卒エンジニアの開発日記
addSubview・・・Viewの上に別のViewを表示

btnLabelsに配列(labels:ViewControllerで任意で決める)が入るので、配列の数と同じ数のViewが追加されている。
1個目のfor文でView(addSubview)とviewsDictionaryに値を入れている
2個目のfor文の中にUIEdgeInsets(余白調整)にcheckboxをaddSubviewしている
参考:UIButton内テキスト位置を微調整する - 自堕落なぺぇじ
   Visual Format Languageを使う【Swift3.0】 - Qiita

何でUIViewを置いた後にchckboxを追加しているのかがわからなかったのですが、チェックできる範囲(タップした時に反応する範囲)を広げるためにUIViewを置いている。
Visual Format Languageを慣れていった方が良い

swiftでのcheckboxについてとその周辺

最近swiftを使っています。
swiftにはcheckboxがデフォルトのUIライブラリには存在していないため、自作しなければいけません。
色々記事を見ている中で、こんな記事がありました。

qiita.com

このcheckboxの作り方を詳しく見てみると、わからない部分があったので検索しながら、どのように作られているのか書いていきます。

・checkboxの基礎となるファイルは5つ

①YSCheckBox.h
ヘッダファイル(定数や宣言などを書くファイル、ソースファイルを作るための部品のようなもの)
ヘッダファイルがあるのは、オリジナルのCocoa Touch Frameworkを作成するために外部に提供する内容を書く必要があるため。
ここではコンパイルする時に必要な変数。
参考:The Pragmatic Ball boy

②YSCheckBox.swift
checkboxの形・on/offの時の動きが書いてある。
CGFloat・・・座標、サイズ(縦横など)の数値を入れる型。
CAShapeLayer・・・ベクター画像(線を用いて図形を描画・管理した画像)を表示する
CGRect・・・座標(CGPoint)とサイズ(CGSize)を持つ型
UIBezierPath・・・アプリで図形を描画する時に使うクラス
→CGPath をセットすることで形状を表現
lineWidth・・・線の幅
fillColor・・・背景の色
strokeColor・・・線の色
insertSublayer・・・レイヤー(階層)の順番を決められる。これでViewの階層も操れる。
参考:Swift - CAGradientLayerでグラデーションを実装する際のCALayerの扱いについて|teratail

func drawSelectedCircle()・func clearSelectedCircle() の中で、fillMaxPath()を呼び出している(戻り値は指定サイズ半径のUIBezierPath)

func drawSelectedCircle()・func clearSelectedCircle() の中で、fillMinPath()を呼び出している(戻り値は半径0のUIBezierPath)

③YSCheckBoxModel.swift
プロトコル(具体的な処理内容は書かず、クラスや構造体が実装するプロパティとメソッドを定義する機能)が書かれてある
func ysCheckBoxModelDidSetが書かれてあって、selectedArrにappend(配列の要素を追加)している。

④YSCheckBoxGroupView.swift
enumerated・・・配列のインデックスを取ってくる
UIView.translatesAutoresizingMaskIntoConstraints・・・viewのフレームの大きさ、配置(x, y, width, height)を直接操作するか、自動にするか
参考:A-Liaison BLOG: Auto Layout と Manual Layout を混載させるときに役立つ UIView.translatesAutoresizingMaskIntoConstraints プロパティの話
"V:|-"・・・ビューの場所を設定
btnLabelsにcheckboxの数が入っている
②でボタンの形自体を作っていて、④で実際の配置を決めている。

⑤YSCheckBoxViewController.swift
実際にcheckboxを使う時に、呼び出すファイル。
②、③、④を呼び出している
btnLabelsに表示させる配列の要素が入り、checkBoxGroupViewに飛んで要素数が数えられる。

実際に使う時に、ViewControllerから幅などを設定できるが、デフォルトでも設定されているのでその数で配置される。

少し分かったので、明日マージンの値を取って同じx軸でy軸が違う場所に文字が書けるかやってみます。

WEPとWPA【セキュリティ】

今回は、WiFiのセキュリティ(ワイヤレスセキュリティープロトコル)についてです。
WEPとWPA
WEP
RC4アルゴリズムをベースとした共通鍵暗号を採用している。
・64bitまたは128bitの共通鍵を使用
WPA
・4way Handshakeを用い、テンポラリーキー(PTK)を作成。
4way Handshakeとは、暗号鍵を交換する手順。無線AP(無線LANアクセスポイント)と無線クライアントのMACアドレス、etcの情報から一意の鍵を作る。
参考:
https://milestone-of-se.nesuke.com/nw-advanced/nw-security/krack/
無線LANの基本とセキュリティ技術 | 技術コラム集 | [技術コラム集]組込みの門 | ユークエスト株式会社

Beaconってどこかで聞いたことある用語だったのですが、定期的にAPがいるよ!って呼びかけるのためのパケットだったんですね。
WEPは弱点が多い(パケットを収集すると、WEPキーが解読できる。①秘密鍵が同じ②それが場合によって40bitしかない③IVの数値が暗号化されずデータに付加され送られる④IVに対して実際に毎回異なる数値を使用していたとしても、 データのやり取りで数時間で一巡、また同じ数値を使う)
IVというのは、initialization vectorの略で、初期値ベクターなんていう。RC4を使用して暗号化データを生成すると、同時に生成されるもの。24bitの乱数になる。
詳しくないのですが、24bitって少ないような。それが脆弱性を産むってことでしょうか。
このWEP・WPAという方法で生成される鍵を解析するために、aircrack-ngを使ってみます。
aircrack-ngはBackTrackに含まれているものです。
BackTrackとは、VMWareイメージの名前です。とうとうVMWare使わなきゃいけない時が来たか・・・。
が、現在はBackTrackはなく、後継としてKali Linuxがリリースされている。
というわけで、VMWareを入れてKali LInuxを入れた。
f:id:boa0203:20191122140154p:plain
入れました。
次に無線LANアダプラをMonitor modeにします。
無線LANアダプタはAPからの発信を受け取る機械で、Monitor modeはデータの送受信を行わず、無線LAN上を流れるパケットを監視するだけの特別なモードのことです。

airmon-ng start wlan0

これをすると、こんな文が出て来ました。
kill them using 'airmon-ng check kill' before putting the card in monitor mode, they will interfere by chaning channels and sometimes putting the interface back in managed mode.
カードをモニターモードにする前に「airmon-ng check kill」を使用してそれらを強制終了すると、チャネルを変更したり、インターフェイスをマネージモードに戻したりして干渉します。

説明ってことでいいんでしょうかね。

iwconfig

これは無線LANインターフェース設定用コマンドです。
しかし、これを叩くと
no wireless extensions.
え、拡張機能ないの・・・

ifconfig -a

で、システムが検出したすべてのネットワークインターフェイスを一覧表示。 出てくるethとかloはインターフェース名。
ethはイーサネット(データリンク名:直接接続された機器間で通信するためのプロトコルやネットワークをさす言葉)の場合振られる名前、loは説明があったので引用します。

「ローカルループバック」と呼ばれる特別な仮想インタフェースだ。eth0などとの違いはこうだ。eth0もloもホスト自身だが、eth0にはネットワークインタフェースの実体がある。loはOSのプロトコルスタックスタックが必ず提供することになっており、ネットワークインタフェースを全く設置していない場合にも、このloだけは存在する。そうした初期状態であっても仮想的にネットワークのテストなどに使えるように用意されているのだ。loのIPアドレスとして必ず127.0.0.1が割り当てられる。当然このIPアドレスを用いて外部と通信することはできない。

引用元:
ifconfig 〜(IP)ネットワーク環境の確認/設定を行う:ネットワークコマンドの使い方 - @IT
プロトコルスタックは、コンピュータ上で、通信を実現するための一連の通信プロトコル群を実装しているモジュール(プログラム部品)のこと。
※色々いじる前に、sources.list(パッケージ(ソフトのこと)をどこから取得するかが書かれているファイル)を確認した方がいいかも。自分のlistは空になっていたんで、ここに書いてあるミラーサーバ指定を自分で書き込まなければいけなかった。
ifconfigでネットワークを見ると、wlanがない。よく見るとmacからwifi飛ばしているのに、debianから見ると、有線になっている。
そのあと無線にならないか試行錯誤しましたが、結局無線にすることができなかったのでaircrack-ngを使って解析することはできませんでした。
そもそも仮想PCだとできないのか?ラズパイに入れて解析したらできたのか?
消化不良なので、続編書くかもしれないです。

Windowsコマンド集など【復習】

次回からは自分で対処できるように残します。

nbtstat --NetBIOS情報の表示
nbtstat -c でIPアドレスとか、キャッシュとか見れました。
nbtstat -a でNetBIOS名で指定したリモート・コンピュータのNetBIOS名テーブルを表示します。

ipconfig Windowsのネットワーク設定が見れます

DNS
ドメイン名とIPアドレスの対応付け、メールの宛先ホストを支持するためのシステム。

UDPTCP
トランスポート層プロトコル
TCPは、コネクション型で信頼性のあるトランスポート層プロトコル。両端のホスト間で到達性を保証する。
対してUDPは信頼性はない。パケット数が少ない通信や、ブロードキャストやマルチキャストの通信、ビデオや音声などのマルチメディア通信に向いている。


参考:
DNSのしくみ - ネットワークエンジニアを目指して
インターネット10分講座 DNS - JPNIC
@IT:DNS Tips:DNSがUDPを使うのはなぜですか?

タクトスイッチを使った電子工作【ラズパイ】

勉強になりました:


https://www.fabshop.jp/lesson3-controlling-led-with-switch/


【電子工作】プルアップ回路とプルダウン回路とは?(危険回路についても) - Qiita


マイコン入門 LEDの点灯・消灯制御方法【入出力ポート機能】

参考書通りにタクトスイッチを動かしてみようと色々やっていたのですが、うまく行かないので色々調べました。

まず①通りに行いました。
f:id:boa0203:20191007154624j:plain:w300
f:id:boa0203:20191007154651j:plain:w300

抵抗が見合った大きさになっているのかが心配ですが、ちゃんと動きました。
①のプログラムの中で、以下のような分岐があります。

if GPIO.input(BtnPin) == GPIO.LOW:
print ('...led on')
GPIO.output(LedPin, GPIO.LOW)
else:
print ('led off...')
GPIO.output(LedPin, GPIO.HIGH)

ここがよくわからなかった。
①記事の中で、プルアップ抵抗をプログラム上で設定しており、ボタンが押されていない時には3.3Vがかかっている。そのため、ボタンを押さなければ入力はHigh(3.3V)になっているのでelseにいくといったような説明があります。

プルアップ抵抗というのは、②の記事の内容がわかりやすいのでみて欲しいです。
ショート回路(ボタンの抵抗値がないためショートしてしまう)・オープン回路(インプットがボタンが押されていない時にどこにもいけなくなってしまう)の説明があります。
ショート回路・オープン回路にならないために、抵抗をかませる(→プルアップ・プルダウン抵抗)が必要なのです。

プルアップ・プルダウン抵抗は理解し、疑問は再び①のプログラム分岐に戻ります。

if GPIO.input(BtnPin) == GPIO.LOW:
print ('...led on')
GPIO.output(LedPin, GPIO.LOW)
else:
print ('led off...')
GPIO.output(LedPin, GPIO.HIGH)

プルアップ抵抗を設定しているので、スイッチを押さなければ常に3.3Vが流れているのはわかりました。
しかしLOWの時、(スイッチが押されたとき)にLEDは光ります。
LOWの時は0Vになっているのに、何故outputにGPIO.LOWを入れると光るのでしょうか。

そこで③を見ます。
③でLEDの光る構造がわかります。
LEDは電位差が生じることにより、電源から電流が放出されマイコン側に流れ込みLEDが点灯します。
常に流れているのは3.3Vで、GPIOの出力を0Vにする。
そこで電位差が生じるので電流が流れてLEDが点灯する、という理解を今しています。

ここまで調べた後、参考書のタクトスイッチを動かしてみました。
プルアップ抵抗を変えるとちゃんと動作したので、良かったです。