平凡エンジニアからの出発

一に努力、二に理想、三に積小為大。

【E資格対策】Python入門

( ..)φメモメモ

型変換

x = 1.2345
int(x)

for文

for i in range(10):
  # 処理

for j in range(開始, 終了, 変化):
  # 処理

list

pythonのリストは色々な型を詰められる

list = ["str1" , 1, "str2", 2]
list.append("str3")
list.append(3)
list ### ['str1', 1, 'str2', 2, 'str3', 3]と表示される
リスト名[開始 : 終了 : 変化]  

※終了の条件は≦(以下)ではなく、<(未満)
※変化の項をなくすと、+1の意味

リストのインデックスは正と負2種類の指定方法が存在する

  • ​先頭から数える場合は正(一番左は0)
  • 最後尾から数える場合は負(一番右は-1)

csv取り込み

import csv
with open('XXXXX.csv', encoding="utf-8_sig") as f:
    loader = csv.reader(f)
    # loaderはcsvのインスタンスを保持
    for line in loader:
        # lineには列の要素、配列として取り出せる

【Android講座】第4回 ライフサイクルと画面遷移



Lesson 4で学ぶこと

  • ライフサイクルについて
  • 画面遷移(Activity間)
  • Step by Stepで実装
    ↓ Lesson4 アプリ
f:id:atuyan39:20210509002617p:plain:w300f:id:atuyan39:20210509002621p:plain:w300

ライフサイクルについて

developer.android.com

画面遷移(Activity間)

Activityの開始

Intent intent = new Intent(context, SubActivity.class);
startActivity(intent);

Activityの終了

finish();

Lesson 4 Step by Step実装

基本の流れ

  1. 画面作成(Activityやlayoutの追加)
  2. 画面調節(パーツの追加や位置調節)
  3. イベント処理(ボタン押下された等)
  4. 画面更新(表示する、消去する等)

画面作成

EmptyActivityを選択して、新規にLesson4Activity.javaLesson4SubActivity.javaを追加する

画面修正

それぞれの画面にTextViewとButtonを配置する

イベント処理&画面更新

◆Lesson4Activity.java

Button button = findViewById(R.id.lesson4_button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // SubActivityの開始
        Intent intent = new Intent(getApplicationContext(), Lesson4SubActivity.class);
        startActivity(intent);
    }
});

◆Lesson4SubActivity.java

Button button = findViewById(R.id.lesson4_sub_button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // SubActivityの終了
        finish();
    }

code

Lesson 4 · atuyan39/AndroidLesson@251756d · GitHub

【Android講座】第3回 ListViewの基本的な使い方



Lesson 3で学ぶこと

  • パーツ(ListView)について
  • Step by Stepで実装
    ↓ Lesson3 アプリ
f:id:atuyan39:20210501194316p:plain:w300f:id:atuyan39:20210501194321p:plain:w300

パーツについて

ListView

要素(Item)をリスト上に表示するView

developer.android.com

◆ListViewの実装方法

  1. Itemを用意する
    ArrayListやarray-stringで定義する
  2. Adapterを用意する
    →ArrayAdapterにリストItemのレイアウトを設定して、1で作成したItemをセットする
  3. ListViewに表示する
    →ListViewに2で作成したAdapterをセットする

Androidでは、下記のテキストが一つ入るItemのリストを用意されている。
android.R.layout.simple_list_item_1.xml : TextViewが一つ配置されているシンプルなリスト。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

Lesson 3 Step by Step実装

基本の流れ

  1. 画面作成(Activityやlayoutの追加)
  2. 画面調節(パーツの追加や位置調節)
  3. イベント処理(ボタン押下された等)
  4. 画面更新(表示する、消去する等)

画面作成

EmptyActivityを選択して、新規にLesson3Activity.javaを追加する

画面修正

ListViewを配置する

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Lesson3Activity">

    <ListView
        android:id="@+id/lesson3_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="161dp"
        tools:layout_editor_absoluteY="303dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

ListViewを取得

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lesson3);
    // Viewを取得
    ListView listView = findViewById(R.id.lesson3_list_view);
}

Adapterを作成

    // Adapterを作成する//////////////////////////////////////////////////////////
    // 方法1 : 表示するリストを動的に作成
    List<String> listItems = new ArrayList<>();
    listItems.add("月曜日");
    listItems.add("火曜日");
    listItems.add("水曜日");
    ListAdapter adapter1 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listItems);
    // 方法2 : 表示するリストを静的に作成
    ListAdapter adapter2 = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.week)
    // 方法3 : 方法2の別の方法。Resourceからの参照する際に使える。
    ListAdapter adapter3 = ArrayAdapter.createFromResource(this, R.array.week, android.R.layout.simple_list_item_1);
    ////////////////////////////////////////////////////////////////////////////

イベント処理

ボタンが押下された際の処理を追加

    // ListItemが押下された時の処理を追加する
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            TextView textView = (TextView) view;
            Toast.makeText(Lesson3Activity.this, textView.getText(), Toast.LENGTH_SHORT).show();
        }
    });

画面更新

    // 作成したAdapterをListViewに表示
    listView.setAdapter(adapter1);

code

Lesson 3 · atuyan39/AndroidLesson@ef9363d · GitHub

【Udemyメモ】ホワイトハッカー入門

Udemy講義のメモ www.udemy.com

セクション1 はじめに

ホワイトハッカーについて学ぼう

セクション2 情報セキュリティとホワイトハッカー

ホワイトハッカーとは

ホワイトハッカー(Ethical Hacker)の役割

  • 防御
  • 監視
  • 検出
  • 分析
  • 対応

知識×技術×倫理観

ホワイトハッカーはクライアントから承諾を得ていること!!
プロフェッショナルとしての自覚と行動が必要!

攻撃方法だけではく、防御する方法を学ぶ必要もある。

ハッカーとクラッカー

クラッカー:クライムハッカー

Q . なぜ攻撃するのか?
A . 攻撃の方法と脆弱性がわかり、攻撃するだけの動機があるから。
攻撃 = 方法 + 脆弱性 + 動機
→動機 > 倫理感を上回ったとき、攻撃になる

情報セキュリティの基礎

セキュリティの三大要件

  • C : Confidentiality 機密性
  • I : Integrity 完全性・整合性
  • A : Availability 可用性

例)宝箱
この三つの要求を満たすためにセキュリティの技術がある

セキュリティポリシー
国や自治体の法律や規制あった上で。
その後、基準・規格、ガイドラインの作成がいる。

例) * ISO/IEC 27XXXX セキュリティに関する国際規格 * PCI-DSS クレジットカード業界のセキュリティ規格

セキュリティの検証と評価

脆弱性の管理・評価はMUST
ペネトレーションテスト

情報セキュリティの防御

  • 予防フェーズ
  • 運用フェーズ
  • 対処フェーズ(インシデント沖田と大木)

影響範囲
リスクレベル
リスクマトリックス

防御方法の検討
多層防御→情報資産に至るまでのそれぞれの層で防御する

  • ネットワークファイアウォール
    →ステートフルマルチレイヤインスペクションファイアウォールで全部の層を見るのが主流

  • IDS/IPS

    • IDSは侵入の検出のみ
    • IPSは侵入を検出し、防止する
    • ネットワーク型・ホスト側がある。
  • UTM
    複数のセキュリティ検知技術を統合する

  • WAF
    Web Application Firewall

  • サンドボックスハニーポット
    誘いこんで、その手口をIPSにフィードバックする

  • 監視・分析
    False Positive → 誤検知・過剰検知
    False Negative → 見落とし(あってはならない)

  • 評価・検証
    IH&R (Incident Handing and Respone)
    フォレンジック調査

ハッキングの手法

CEHにおけるハッキングフェーズ

  • 偵察 (Reconnaissance)
    公開されている情報
  • スキャニング (Scanning)
    不正アクセスになりうる情報
  • アクセス権の取得 (Gaining Access)
    認証機能を利用する。権限昇格。
  • アクセスの維持 (Maintaing Access)
    いつでも入れるように、バックドアを作る
  • 痕跡の消去 (Clearing Tracks)
    侵入した痕跡を消す

かならず準備をするハッカーたち。
偵察行為、深い情報を得ていく。効率がいいから。
効率の良い攻撃→アクセス権の取得が少ない。
ソーシャルエンジニアリングを使い効果的にやることが多い。

攻撃の目的と手法

動機によって目的(目標)は変わる。
例)ECサイト。アクセス権<DOS攻撃

攻撃の対象(効率が良いものを選ぶ)

ホワイトハッキングの活用

攻撃者と同等のスキルを持っている ↓ 脆弱性管理のフェーズ

脆弱性の検出
資産の優先順位付け
評価(攻撃)
レポート(検出した脆弱性
軽減と改善(改善できるか?)
検証(効果があるかを確かめる。評価と同じことを行う)

やることは同じ。

ホワイトハッキング ハッキング
脆弱性の検出 スキャニング
資産の優先順位付け 列挙
評価 攻撃
レポート -
軽減と改善 -
検証 攻撃

脆弱性の評価は必要不可欠!!!
教育・助言も仕事の内。

【AndroidTraining】ListView 3

Lesson

ListView 3

Training

下記の仕様を満たすアプリを作りましょう。

  • 独自List(ImageViewとTextView)を作成して表示する

Snap Shot

f:id:atuyan39:20210428005905p:plain:w300

Step by Step

1. 新規に画面を追加

ListViewを配置する

activity_training_list_view_actvity2.xmlを見る

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TrainingListViewActivity2">

    <ListView
        android:id="@+id/list_view_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout> 

2. 独自リストのレイアウト作成

ImageViewとTextViewを配置する

image_text_list_item.xmlを見る

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/list_item_image"
        android:layout_width="70dp"
        android:layout_height="70dp"
        app:srcCompat="@android:drawable/alert_dark_frame"
        android:contentDescription="@string/list_item_image_description" />

    <TextView
        android:id="@+id/list_item_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical" />
</LinearLayout> 

3. 独自リストのアイテムを格納するクラスを作成

ImageTextListItem.javaを見る

/**
 * ImageViewとTextが配置されたリストに使うアイテム
 */
public class ImageTextListItem {
    private Bitmap mImage;
    private String mText;

    /**
     * Constructor.
     *
     * @param image 画像
     * @param text テキスト
     */
    public ImageTextListItem(@NonNull Bitmap image, @NonNull String text) {
        mImage = image;
        mText = text;
    }

    // alt + insert(Getter and Setter)で自動追加できる
    public Bitmap getImage() {
        return mImage;
    }

    public void setImage(Bitmap mImage) {
        this.mImage = mImage;
    }

    public String getText() {
        return mText;
    }

    public void setText(String mText) {
        this.mText = mText;
    }
}

4. ArrayAdapterを継承した独自リストのためのAdaperクラスを作成

ImageTextListAdapter.javaを見る

/**
 * {@link ImageTextListItem}のアダプター。
 */
public class ImageTextListAdapter extends ArrayAdapter<ImageTextListItem> {

    private final int mResource;
    private final List<ImageTextListItem> mItems;
    private final LayoutInflater mInflater;

    /**
     * {@inheritDoc}
     */
    public ImageTextListAdapter(@NonNull Context context, int resource, @NonNull List<ImageTextListItem> items) {
        super(context, resource, items);

        mResource = resource;
        mItems = items;
        mInflater = LayoutInflater.from(context);
    }

    /**
     * {@inheritDoc}
     */
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View view;

        if (convertView != null) {
            view = convertView;
        } else {
            view = mInflater.inflate(mResource, null);
        }

        // リストに表示するアイテムを取得
        ImageTextListItem item = mItems.get(position);

        // Imageを設定
        ImageView image = view.findViewById(R.id.list_item_image);
        image.setImageBitmap(item.getImage());

        // Textを設定
        TextView text = view.findViewById(R.id.list_item_text);
        text.setText(item.getText());

        return view;
    }
}

5. 独自リストの中身を作成と表示

TrainingListViewActivity2.javaを見る

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_training_list_view_actvity2);

    // ListViewを取得
    ListView listView = findViewById(R.id.list_view_2);

    // リストに表示するアイテムを作成
    ArrayList<ImageTextListItem> listItems = new ArrayList<>();
    for (int i = 0; i < 3; i++) {
        Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.gohan);
        String text = "List item " + i;
        ImageTextListItem item = new ImageTextListItem(image, text);
        listItems.add(item);
    }

    // 作成したリストを表示する
    ImageTextListAdapter adapter = new ImageTextListAdapter(this, R.layout.image_text_list_item, listItems);
    listView.setAdapter(adapter);
}

Code

ListView 2 · atuyan39/AndroidTraining@d202ae9 · GitHub

Reference

qiita.com

Memo

先人の知恵はすごい。
そして、ListView3だったのに、ListView2でコード作っている。
うまい管理方法を最終的には見つけたいが、今は気のまま実装しよう。

【Android講座】第2回 EditText, Log, Toastの基本について



Lesson 2で学ぶこと

  • パーツ(EditText)について
  • Log出力
  • Toast表示について
  • Step by Stepで実装
    ↓ Lesson2 アプリ
f:id:atuyan39:20210424195256p:plain:w300f:id:atuyan39:20210424195301p:plain:w300

パーツについて

EditText

ユーザーの入力を補助するView

developer.android.com

Lesson 2 Step by Step実装

基本の流れ

  1. 画面作成(Activityやlayoutの追加)
  2. 画面調節(パーツの追加や位置調節)
  3. イベント処理(ボタン押下された等)
  4. 画面更新(表示する、消去する等)

画面作成

EmptyActivityを選択して、新規にLesson2Activity.javaを追加する

画面修正

TextView, EditText, Buttonを配置する

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Lesson2Activity">

    <TextView
        android:id="@+id/lesson2_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toTopOf="@+id/lesson2_edit_text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/lesson2_edit_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="@string/lesson2_edit_hint"
        android:autofillHints="@string/lesson2_edit_hint"
        app:layout_constraintBottom_toTopOf="@+id/lesson2_button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/lesson2_text_view" />

    <Button
        android:id="@+id/lesson2_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/lesson2_button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/lesson2_edit_text" />
</androidx.constraintlayout.widget.ConstraintLayout>

イベント処理

ボタンが押下された際の処理を追加

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lesson2);
    // Viewを取得
    TextView textView = findViewById(R.id.lesson2_text_view);
    EditText editText = findViewById(R.id.lesson2_edit_text);
    Button button = findViewById(R.id.lesson2_button);
    // Button押下時の処理を追加
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // ボタン押下時の処理を追加
        }
    });
}

画面更新

// Log出力
Log.d(TAG, "input text:" + editText.getText());
// TextViewに入力されたテキストを表示させる
textView.setText(editText.getText());
// Toast表示
Toast.makeText(getApplicationContext(), editText.getText(), Toast.LENGTH_SHORT).show();

code

Lesson 2 · atuyan39/AndroidLesson@8ba2e3c · GitHub

【AndroidTraining】ViewModel 1

Lesson

ViewModel 1

Mission

下記の仕様を満たすアプリを作りましょう。

  • ViewModelを使い、カウントアップさせる

Snap Shot

◆テスト

  • 画面を回転しても、カウントアップが継続すること
  • 画面がバックグラウンドへ移動しても、カウントアップが継続すること
f:id:atuyan39:20210420231021p:plain:w300f:id:atuyan39:20210420231027p:plain:w300

Step by Step

1 . テンプレートから、New > Activity > Fragment + ViewModelを選択して、TrainingViewModelActivityを新規に追加する
f:id:atuyan39:20210420231033p:plain:w600

2 . FragmentのレイアウトファイルにTextView, Buttonを追加する
3 . ◆ViewModelの実装を行う
4 . LiveDataを定義する

private MutableLiveData<String> mText;

5 . ViewからLiveDataを取得できるようにメソッド追加

@NonNull
public MutableLiveData<String> getText() {
    if (mText == null) {
        mText = new MutableLiveData<>();
        // 必要であれば、初期化する。
        // setValueはメインスレッドからLiveDataに通知する際に使う。
        mText.setValue("Ready?");
    }
    return mText;
}

6 . ボタン押下を契機とする、非同期の処理を追加(カウントアップ)

public void onClickButton() {
    new Thread(() -> {
        for (int i = 0; ; i++) {
            String text = "count:";
            try {
                Thread.sleep(THREAD_SLEEP_TIME);
                // postValueはメインスレッド以外からLiveDataに通知する際に使う。
                mText.postValue(text + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

7 . ◆View(Fragment)の実装を行う

8 . ViewModelProviderを取得し、TrainingViewModelのインスタンスを保持する

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // テンプレートだとonActivityCreatedでViewModelの生成をしているが、
    // 再描画されても同じViewModelを使えるようにonCreateへ移動(公式もonCreate推奨)
    mViewModel = new ViewModelProvider(this).get(TrainingViewModel.class);
}

9 . onCreateView内でレイアウトを指定する(テンプレート作成される)

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.vm1_main_fragment, container, false);
}

10 . Viewの取得とButton押下時の処理を追加

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // Viewを取得
    TextView textView = view.findViewById(R.id.vm1_text_view);
    Button mButton = view.findViewById(R.id.vm1_button);
    // Buttonの押下時の処理を追加
    mButton.setOnClickListener(v -> mViewModel.onClickButton());
}

11 . LiveDataの取得と監視、そして変更時のTextViewへの描画を行う

    // LiveDataの取得と監視
    mViewModel.getText().observe(this, new Observer<String>() {
        @Override
        public void onChanged(String s) {
            // LiveDataに変更があった時の処理を追加
            textView.setText(s);
        }
    });

Code

ViewModel 1 · atuyan39/AndroidTraining@c774d64 · GitHub

Reference

developer.android.com

developer.android.com

Memo

ViewModelは大きいテーマの一つなので、学びを深めていきたい。