OmniAICreator/Qiita-1.07M huggingface dataset:
Xamarin.Formのカスタムコントロールをxamlを使って作成し、デザインプレビューを正常に行う

# 概要
Xamarin.Formsでカスタムコントロールを使用すると、そのカスタムコントロールを張り付けた画面のプレビューの表示に失敗することが多くなる。これを回避するために、カスタムコントロールをC#のソースコードのみで作成するのではなく、XAML + コードビハインドで作成する。

## 環境
環境は[こちらのページ](https://qiita.com/sukkyxp/items/804d597039189da521ad)を参照してください。

## コントロールの追加
共通プロジェクトの「Controls」フォルダーを右クリックして「追加」「新しい項目を追加...」をクリックして表示されるダイアログで、「コンテンツビュー」を選択して、名前に「MyLabelControl.xaml」を入力して「追加」をクリックする。

MyLabelControl.xamlを次のように編集する。

```xml:MyLabelControl.xaml
<?xml version="1.0" encoding="UTF-8"?>
<Label xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             FontSize="26"
             TextColor="Black"
             BackgroundColor="Aqua"
             x:Class="CustomeControlTest.Controls.MyLabelControl">
</Label>
```

## ポイント
x:Classの指定は名前空間とクラス名なので、各環境に合わせて修正が必要となる。
FontSize、TextColor、BackgroundColorはこのカスタムコントロールの既定値として設定したい値をLabel要素の属性として追加する。


## コードビハインドの修正

コードビハインドの「MyLabelControl.xaml.cs」は継承元をContentPageからLabelに変更する。


```cs:MyLabelControl.xaml.cs

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace CustomeControlTest.Controls
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MyLabelControl : Label
    {
        public MyLabelControl()
        {
            InitializeComponent();
        }
    }
}
```

以上で、コントロールの作成は完了

## 利用側ソース

MainPage.xamlで次のようにコントロールを利用する

```xml:MainPage.xaml
<?xml version="1.0" encoding="UTF-8"?>
<controls:TemplatePage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="clr-namespace:CustomeControlTest.Controls"
             x:Class="CustomeControlTest.MainPage"
             Title="Access template element demo"
             NavigationPage.HasNavigationBar="False"
             HeaderText="Main"
             FooterText="My Footer"
             ControlTemplate="{StaticResource MyTemplate}"
             >

    <StackLayout Margin="20, 20, 20, 0" BackgroundColor="LightBlue">
        <StackLayout Orientation="Horizontal">
            <Label x:Name="Label1" Text="222" WidthRequest="200" />
            <Entry Text="入力"/>
        </StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label x:Name="Label2" Text="Test2" WidthRequest="200" />
            <Entry Text="入力"/>
        </StackLayout>
        <StackLayout Orientation="Horizontal">
            <controls:MyLabelControl Text="AAA" BackgroundColor="Red"/>
        </StackLayout>
    </StackLayout>

</controls:TemplatePage>
```

これにより、Visual StudioでMainPageのプレビューが正常に描画される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197947/7bbbbe9f-2517-4085-b3e0-75222db4c934.png" width="600px">

## 実行結果

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197947/3a9e4bbc-7be6-9162-d14b-47d61e012fd2.png" width="400px">

なお、コントロールのデフォルトの属性値の設定はMyLabelControl.xaml.csのコンストラクタ内でも設定可能だが、こちらのコードビハインドで実施すると、プレビューが正常に出来なくなる。
【Swift】クロージャまとめ

# はじめに
iOSの開発の初心者にとって`Delegate`に続く厄介な敵がおそらく、このクロージャじゃないでしょうか笑
僕はそうでした笑

なので、今回はこの強敵であるクロージャを攻略したいと思います！！

# クロージャとは
そもそもクロージャとは、なんぞやというとことから始めます。
**ずばり、無名関数！**ですね。
無名関数？ってなる人もいるかもしれないので、実際にコードでみていこうと思います！

###　普通の関数

```Swift
func non_closure(str:String) -> String {
    return "こんにちは\(str)さん"
}

non_closure(str: "佐藤") //出力：こんにちは佐藤さん

```

### クロージャを使ってみる

名前の文字数が少ない順に並び替える処理をどんどん省略しながら書いていきます！

```Swift 
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

var nameArr: [String] = []


//通常のクロージャの書き方
nameArr = names.sorted( by: {(s1: String, s2: String) -> Bool in
    return s1 > s2
} )

//１行でまとめる
nameArr = names.sorted(by: {(s1: String, s2: String) -> Bool in return s1>s2} )

//省略できるところは省略する
//引数、戻り値の型は推論できるので、省略する
nameArr = names.sorted(by: {s1, s2 in return s1>s2})

//戻り値は暗黙に返すため、省略可能
nameArr = names.sorted(by: {s1,s2 in s1>s2})

//＄０などの書き方で、引数の定義自体を省略できる
//$0,$1,$2と引数は自動的に略式で書くことができる
nameArr = names.sorted(by: {$0>$1})

//オペレータ関数をつかうとここまで省略可能
nameArr = names.sorted(by: >)

print(nameArr)
```

# クロージャの使い道

- 引数としてクロージャを用いる
- 関数としての役割も持ちながらも変数として処理したい時

に使います！
購入した動画データ（mov）をメインビジュアルに設定した際につまづいた点

購入した動画データ（mov）をメインビジュアルに設定した際につまづいた点について記載します。

まずmovデータはブラウザ表示（Safari）が出来ません。
このことに気づかずに時間を費やしてしまいました。

解決方法としては、H.264のmp4に変換すればブラウザ表示できるなります。

MACであればiMovieで簡単にMP4への動画変換と圧縮が行えます。
下記のサイトを参考ください。
https://tipstour.net/mac-compress-video

以上です。ご参考になれば幸甚です。
【Git】間違えてmasterブランチで作業してしまったときの対処法

## 本記事の対象者
「作業用ブランチではなく、masterブランチで作業してしまっていた！」
「masterブランチでの作業内容を他のブランチに移行したい！」
そんな方に向けてこの記事を書いています。

※本記事の内容は、コミットしていない作業内容を他のブランチに移行するものなので、コミットした後にmasterブランチで作業してしまったことに気が付いた場合は、以下の記事を参考に`git reset --soft HEAD^`を実行し、適宜対応してください。
https://qiita.com/S42100254h/items/db435c98c2fc9d4a68c2
## Step1.修正内容を確認する
masterブランチで修正した内容を以下のコマンドで確認します。

```
$ git status
```

## Step2.修正内容を別の場所で一時保管する
masterブランチで作業した内容を、別の場所に一旦保管する必要があるので、以下のコマンドを実行します。

```
$ git stash
```
再度`git status`を実行すると、Step1で確認した内容がなくなっていることを確認できます。

### まめ知識①

`git stash`した内容は以下のコマンドを実行することで確認ができます。

```
$ git stash list
```
### まめ知識②
`git stash`した作業内容は複数個保存しておくことができます。（下記は複数回`git stash`を行った後に`git stash list`を実行した結果）

```
stash@{0}: WIP on master: 5668f19 Add DetailArticle page
stash@{1}: WIP on master: 8597bb6 Add ariticles show api
stash@{2}: WIP on master: 149c26f fix article detail design
```

## Step3.新しいブランチに移行
以下のコマンドにより新しいブランチを作成し、

```
$ git checkout -b <ブランチ名>
```
Step2で保管した作業内容を移行するため、以下のコマンドを実行します。

```
$ git stash apply
```
これで保存していた作業内容を新しいブランチへの移行することができました。

### まめ知識③
`git stash apply`を実行すると、最後に`git stash`した作業内容が移行されます。複数個の作業内容を保管している場合は、移行したい内容を以下のように指定する必要があります。

```
$ git stash apply stash@{2}
```


### まめ知識④
一時保管していた作業内容をstash listから全て削除したい場合は、以下のコマンドを実行します。

```
$ git stash clear
```

`git stash list`を実行しても何も表示されないことが確認できます。

## まとめ
以上の３ステップでmasterブランチでの作業内容を新しいブランチに移行することができました！
git stashは、本記事の利用方法以外にも、「急な仕事で他のことをしなければならないが、中途半端なのでコミットしたくない」といった場合に、一時保管しておくといった使い方もできます。
また、git stashに関連するコマンドは他にもたくさんあるので、気になる方は調べてみてください。

## 参考
- https://qiita.com/akasakas/items/768c0b563b96f8a9be9d
- https://hacknote.jp/archives/17111/
create-guten-blockとwp-envで簡単にGutenbergブロック開発を行う

独自にGutenbergブロックを開発したい場合、一般的には、**(1)**Gutenbergブロックの開発プロジェクトと、**(2)**WordPressのテスト環境が必要になります。それぞれ全てをスクラッチで構築しても良いのですが、今回は`create-guten-block`と`wp-env`を使って、簡単に環境を構築する方法を紹介します。
なお、この手順は2020/4/19時点の内容なので、将来はもっと便利な方法が出てきているかもしれません。

# 今回採用した方法と、他の方法
環境構築の方法に正解はなく、色々な方法で環境を構築できます。
参考までに、他の選択肢と、今回採用した方法をのせておきます。（ここにある方法が全てでもありません）

## (1)Gutenbergブロックの開発プロジェクト作成方法

- 全てを自分で作成する<br>ソースファイルやビルド用の環境など全てを自分で構築する方法です。<br>自由な構成ができる反面、環境作成には手間がかかります。

- @wordpress/scriptsを使う方法<br>https://developer.wordpress.org/block-editor/packages/packages-scripts/<br>@wordpress/scriptsを使えばシンプルなGutenbergブロックの環境を作成できます。<br>PHPファイルやSass環境の構築などは自分で行う必要があります。

- create-guten-blockを使う方法（**今回採用した方法**）<br>https://github.com/ahmadawais/create-guten-block<br>create-guten-blockを使うとプラグインのテンプレートやSass環境などが自動で作成されます。<br>基本的にはsrcフォルダ配下のコードを編集していく形になります。


## (2)WordPressのテスト環境の作成方法

- レンタルサーバなどに独自にサーバを立てる<br>一般に公開するときと同じように、テスト用の環境をレンタルサーバなどに用意する方法です。<br>修正したプラグインを都度アップロードする必要があったり、複数環境を作成しづらい…など色々と手間がかかるのでおすすめしません。

- docker-composeでWordPress環境を作成する方法<br>docker-compose.ymlにWordPressやdbコンテナの定義を書いて環境を作成する方法です。<br>この方法を使っている人も多いと思いますが、docker-compose.ymlの編集などが少し面倒です。

- wp-envを使う方法（**今回採用した方法**）<br>https://developer.wordpress.org/block-editor/packages/packages-env/<br>wp-envを使うとプラグインやテーマのフォルダで`wp-env start`とするだけで、WordPressやdb環境が自動で作成され、プラグインやテーマが自動でバインドされた状態になります。<br>内部ではdocker-composeが使われていますが、利用する側はdocker-composeを意識せずに使えます。<br>利用するWordPressのバージョンやポート番号など、細かい設定は`.wp-env.json`を作っておけばOKです。


# 環境準備
事前に次の環境が必要になります。

- Windows 10 Pro（macOSやLinuxなどでも可能なはず）
- Docker Desktop（Docker Composeも自動で入ります）
- Node.js（Docker環境ではなく、Windows側にNode.jsのインストールが必要です）
- wp-envのインストール<br>コマンドプロンプトで`npm install @wordpress/env -g`<br>グローバル環境にインストールしていますが`-g`をつけずにローカルにインストールも可能。<br>ローカルにインストールした場合は、`wp-env`を`npx wp-env`と読み替えてください。


# 具体的な手順
今回はカスタムブロック`my-custom-block`を`S:\my-custom-block`フォルダで開発＆テストする前提の手順になります。

## create-guten-blockで開発プロジェクト作成
コマンドプロンプトを開いて以下のコマンドを実行します。（`#`で始まる部分はコメントです）

```sh
# フォルダに移動
cd /d s:\

# my-custom-blockプロジェクトの作成
npx create-guten-block my-custom-block

# プロジェクトフォルダに移動してsrcフォルダを監視（srcフォルダの内容が変われば自動でビルドされる）
# 終了したい場合はCtrl+C
cd my-custom-block
npm start
```

## wp-envを使ってテストする方法
もう一つ別でコマンドプロンプトを開いて以下のコマンドでWordPress環境を作成します。
ポイントとしては、プラグイン用のフォルダ`S:\my-custom-block`でwp-envコマンドを実行することです。

```sh
# プラグインのフォルダに移動
cd /d s:\my-custom-block

# wp-envでWordPressの実行
# @wordpress/envをローカルにインストールした場合はnpx wp-envで実行
wp-env start
```

WordPressが起動したら、http://localhost:8888/ でWordPressにアクセスできます。
WordPressの`Hello world!`ページが表示されると思うので、管理画面に入りたい場合は`Login`から、User:`admin`、Password:`password`でログインしてください。最初は英語版になっていますが、WordPressの設定から日本語に変更できます。
なお、この時点でmy-custom-blockプラグインは有効になっています。

WordPressを終了させたい場合は`wp-env stop`でOKです。

### wp-envの設定
`wp-env start`を実行するフォルダに`.wp-env.json`を入れておくと、その設定に従ってwp-envの環境が作成されます。今回の例では`S:\my-custom-block\.wp-env.json`になります。
必須ではありませんが、内容も簡単なので、次のような感じで`.wp-env.json`を作っておくことをおすすめします。

```json
{
	"core": null,
	"plugins": [ "." ],
	"port": 10088,
	"testsPort": 10089
}
```

これで、最新のWordPress（`"core":null`）で、ポート番号に10088番が使われるようになります。
コロナウィルスの感染率の推移

# 初めに
私は感染症の専門家ではありませんので、理解した上で読んでください。

コロナウィルスの感染者数が毎日増加しています。
厚生労働省のページには、使いやすいオープンデータがありませんが、オープンデータポータルサイトでデータを公開している県があります。PCR検査数と感染者数のデータがあるので、感染者数の推移を見てみました。

　1週間後のデータでグラフを更新しましたが、先週より感染率が低下していることが読み取れます。

- 更新履歴
　2020/4/19 : 初回投稿
　2020/4/27 : 2020/4/26のデータでグラフを更新

* データ
日本全体のPCR検査人数と感染者数のデータは、厚生労働省がWEBで公開されているのですが、WEBでの表示で使いやすいCSV形式などの数値データになっていません。
一方、各県ごとのデータはCSV形式で公開されている県があります。
　　埼玉県：https://saitama.stopcovid19.jp/

埼玉県のデータが使いやすいので、埼玉県のPCR検査数と感染者数から、感染率の推移を調べました。ただし埼玉県のデータは検査人数ではなく、検査数（延べ人数）と書かれているので、
　　感染率＝感染者数／検査数（延べ人数）
を計算しています。

県ごとのデータフォーマットが統一されていたら、他の県もすぐに調べられるのですが、残念ながら統一されていませんでした。

# 感染率の推移

* パッケージ読み込み

```
import pandas as pd
import matplotlib.pyplot as plt
```

* データ読み込み

```
data = pd.read_csv('data/saitama_kensa_20200418.csv')
data.columns = ['day', 'PCR', 'Confirmed']
print(data.head())
print(data.tail())
```

PCR検査数のデータは、2020/1/31から2020/4/18のデータです。

```
         day  PCR  Confirmed
0  2020/1/31    1          0
1   2020/2/1    1          0
2   2020/2/2    0          0
3   2020/2/3    0          0
4   2020/2/4    1          0
          day  PCR  Confirmed
74  2020/4/14   37          7
75  2020/4/15  110         28
76  2020/4/16  147         21
77  2020/4/17   70          9
78  2020/4/18  100         21
```

* PCR検査数と感染者数の表示

```
plt.plot(data.loc[:,'PCR'])
plt.plot(data.loc[:,'Confirmed'])
plt.xlabel('day')
plt.ylabel('Number')
plt.legend()
plt.savefig('fig1.png')
```
2020/4/19投稿
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561633/28562b7e-2df7-9b68-671d-aa902b13cb0a.png)
2020/4/27投稿
![saitama_kensa_fig1_20200426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561633/517db980-e2f4-7da0-4d55-728045953afb.png)


* 感染率の推移

日々の感染率は大きく変動しているので、7日間の移動平均も表示します。
移動平均は最初の50日間は10%以下でしたが、その後上昇し20%前後になっています。

```
rate = data.loc[:,'Confirmed']/data.loc[:,'PCR'].fillna(0.0)
rate_ma = rate.rolling(7).mean().fillna(0)
plt.plot(rate * 100, label='rate', linewidth=1)
plt.plot(rate_ma * 100, label='rate_ma', linewidth=3)
plt.ylim(0.0, 30.0)
plt.xlabel('day')
plt.ylabel('Rate(%)')
plt.legend()
plt.savefig('fig2.png')
```

2020/4/19投稿
![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561633/7d875e10-3ac0-3721-80d0-89bcbac98440.png)
2020/4/27投稿
![saitama_kensa_fig2_20200426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561633/f74b1357-e47a-9e09-e87c-96a7c5da0128.png)
2020/4/19のデータでは感染率の移動平均が20%前後ありました。
しかし、2020/4/26のデータでは10%前後に低下してきています。

外出自粛により、感染者数が減ることを期待しています。
Visual Studio Codeから直接FTP(SFTP) 接続する拡張機能(2020/04)

# やること
- Visual Studio Codeから直接FTPを使用する拡張機能のまとめ

# 結論
- 一番使いやすいのは「[SFTP](https://marketplace.visualstudio.com/items?itemName=liximomo.sftp)」※ただし公開鍵認証にひと癖アリ

結論だけ知りたい人、**以上です**。
以下は、やった点と、はまった点まとめです。

# 候補
- **SFTP**: 一番ダウンロードが多い
- **ftp-simple**: 「ftp」で検索するとVSCodeのおすすめでは一番上に表示
- **ftp-sync**: 紹介サイトで紹介されていた

一番良かったもののリンクは上記「結論」に書いたので、そちらからアクセスしてください。

# 使用感
## SFTP
総評：一番使いやすかった。おすすめ

**Good**
- VSCodeのサイドバーに**リモートディレクトリ確認**用機能が追加され、リモートのファイルを直接確認できる（※Read only）
- VSCode左下に接続状況が表示され、エラーの場合クリックするだけで**簡単にlogが表示**できる

**Bad**
- **ssh-keygenでOpenSSH認証鍵を作っている場合、使えないことがある**

## ftp-simple
総評：自分の環境では**動きませんでした。**マーケットプレイスの☆が3/5なのもわかる気がする。

**Bad**
- 他は「コンフィグ」を選択すると、開いているディレクトリの.vscodeディレクトリに自動的に設定ファイルを作成してくれるが、こちらはtemp領域に設定ファイルを生成してくれるため、任せていると設定ファイルが保存しようとするそばから消える。

## ftp-sync
総評：SFTPに一歩及ばず。画面を超シンプルなままにしたい人は良いかも。

**Good**
- 設定はSFTPと同じでjsonにより可能。

**Bad**
- SFTP同様sshの形式問題でクラッシュしてると思われるが、**クラッシュした場合無言で停止**するので、SFTPよりもlogへのアクセスが面倒


# SFTPのSSH形式問題への対応
SFTPでは、パスフレーズを用いた接続もできますが、自分はSSH使うのに公開鍵使わないのは気持ち悪い人なので、**公開鍵認証**を試しました。

しかし、GitHubなどでは普通に使えているSSHキーが、SFTPでは認証に失敗しました。

原因は「SSHの形式が違う」とのこと。どうやら、私が「ssh-keygen」を使って作った秘密鍵は、Puttygenを使って作った秘密鍵と互換性がなかったようで失敗していました。

対応として、**Puttygenで今使っているSSHキーの秘密鍵をLoadし、OpenSSHにConvertする**ことで対応しました。

以上。
ポンコツプログラマがGOでWebサーバを立ち上げる話

コロナ禍の影響で休日はヒマなのでいっちょ本格的にやってみっかと思い
Goだけ使ってWebサーバを立ててみました。

この手のTIPSは何故かlocalhostで試してるものばかりなので
「いやlocalhostは分かったからクラウドサーバでやった資料ないのかよ」
って気持ちになってしまいます。。。
なんでもかんでもlocalhost:8080って勉強以外に活かせないでしょうに...

## 構築環境
サーバ：EC2(AmazonLinux2)
ドメイン：Route53で会社の開発用ドメインから1個サブドメインを切る
SSL：ここまで出来るか分からんけど一応LetsEncrypt
Go：表現が合ってるか分からんけどApache/PHPの代わり

## 構築手順（やった順）
1. EC2インスタンスを新規作成、サブドメインを切ってAレコードでIPアドレスと紐付け
2. certbot-autoを持ってきてLetsEncryptのSSL証明書を導入
3. Goのインストール 
4. GoでWebサーバの立ち上げ
5. 3000番でアクセスして閲覧出来ることを確認

## 各作業詳細
1,2は端折りまして3から。
特に難しい作業無し
ひとまずrootでやります。

```shell
#wgetで公式からGoのモジュール一式持ってくる
wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
#/usr/local配下にgoを展開
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz
```

shin_developで実行したいのでユーザを切り替えてPATHを追加

```shell
su shin_develop
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64 #コレ出たらOK
```

とりあえずドキュメントルート的なとこでwebサーバ用のファイルを作る

```sh
cd /var/www/golang
mkdir sources && cd sources
vi test.go
```

とりあえず必要最低限（と思われる）のロジックを書く

```go:test.go
package main

import (
    "net/http"
)

func main() {
    fs := http.FileServer(http.Dir("../public_html"))
    http.Handle("/", fs)
    http.ListenAndServe(":3000", nil)
}
```

整形して中身を見てみる（一番やってみたかったやつ）

```sh
go fmt test.go
```

```go:test.go
package main

import (
        "net/http"
)

func main() {
        fs := http.FileServer(http.Dir("../public_html"))
        http.Handle("/", fs)
        http.ListenAndServe(":3000", nil)
}
```

インデントが1個増えた。見づれぇ。
テキトーなhtmlをpublic_htmlに置いて実行してみる。

```sh
go run test.go
```

3000番ポート指定でアクセスしてみる。
ちなみにEC2のセキュリティグループにはもちろん3000番を許可しないとダメ。

![スクリーンショット 2020-04-19 18.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/ebe5ee0c-76da-f392-74d9-c0bd8788705b.png)

出来たっぽい。
今度はビルドしてバイナリファイルを作ってみる

```sh
go build (test.go) #親ディレクトリの名前で出力する場合はgo buildだけでいいっぽい
```

![スクリーンショット 2020-04-19 18.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/47e90a71-b5c4-f61c-0e55-66043a883c47.png)

なんかサイズでけーな、7.6MBもあるけど圧縮する方法とかあるのかな。
バイナリを実行する。

```sh
./test
```

実行中はターミナルのコマンド受け付けてくれなくなるので
ケツに&を付けて別プロセスで実行すると良いらしい。
nodeでいうところのforeverみたいなのはあるんだろうか。
この場合は終了時にプロセスをkillすることをお忘れなく。

```sh
./test &
```

まだhttpなのでSSLを効かせた状態でアクセス出来るようにしたい。
元のソースをちょっとイジる

```go:test.go
func main() {
	fs := http.FileServer(http.Dir("../public_html"))
	http.Handle("/", fs)

	//ここを改変（logも使ってるけど）
	//http.ListenAndServe(":3000", nil)
	err := http.ListenAndServeTLS(
		":3000", 
		"/path/to/CertificateFile",
		"/path/to/CertificateKeyFile",
		nil
	)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}
```

![スクリーンショット 2020-04-19 19.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/0f7dc3c3-9cf1-ac55-d580-b244cd93ef0d.png)

**えぇ...ホントにこんだけでいいの...？**

ただしhttpでのアクセスでエラーが出るようになったので、リダイレクトの設定は入れた方が良さそうな。
ちょっとListenAndServeTLSのパラメータの意味や
マジでこれだけなのかも含めてもうちょっと調査する必要はある。
あとポートが3000って出てるやつとかもだな...(´-`)

**終わり。**
Raspbian BusterでtaggedVLANを使う

ついにGigabit Ethernetを搭載したRaspberry Pi 4でtagged VLANを使いたかったのでその方法のメモです。
taggedVLANの設定と、それぞれのVLANインターフェースに固定IPアドレスの設定を行いました。
OSはraspbian Buster(Debian 10.3)です。

## VLANインターフェースの設定
今回はVLAN100と200を追加します。
まず、 `/etc/network/interfaces.d/` 以下に`vlans`という名前の設定ファイルを作成します（ファイル名は何でも大丈夫だと思います。）

```
sudo vim /etc/network/interfaces.d/vlan
```
 
そして以下の内容を追加します。

``` bash
# VLAN 100 Interface
auto eth0.100
iface eth0.100 inet manual
    vlan-raw-device eth0

# VLAN 200 Interface
auto eth0.200
iface eth0.200 inet manual
    vlan-raw-device eth0
```

## 固定IPアドレスの設定
VLAN200に固定IPアドレスを割り当てました。
` /etc/dhcpcd.conf`に以下の内容を追加します。
こちらは、ラズベリーパイのIPアドレスを固定するときに追加する内容と概ね一緒で、インターフェース名を eth0.`VLAN番号` のようにするだけです。

``` bash
# Leave Physical interface alone 
#（たぶんeth0そのものへDHCPでのIPアドレスの自動割当を無効にする）
denyinterfaces eth0

# Static IP configuration for VLan 200
interface eth0.200
static ip_address=192.168.11.200/24
static routers=192.168.11.1
```

あとは再起動すれば設定が反映されるはずです。

## 参考
以下のサイトを参考にしました。
[https://www.raspberrypi.org/forums/viewtopic.php?t=136719](https://www.raspberrypi.org/forums/viewtopic.php?t=136719)
[https://engineerworkshop.com/2019/12/17/raspberry-pi-vlan-how-to-connect-your-rpi-to-multiple-networks/](https://engineerworkshop.com/2019/12/17/raspberry-pi-vlan-how-to-connect-your-rpi-to-multiple-networks/)
(https://naga-sawa.hatenadiary.org/entry/20171015/1508026724)[https://naga-sawa.hatenadiary.org/entry/20171015/1508026724]
Lenovo ThinkPad X380 Yoga Tips

このページは、Lenovo ThinkPad X380 Yogaの利用に役立つメモです。

# 環境
- OS: Windows 10 Home Ver.1909
- Processor: Intel Core i5
- RAM: 8GB

# 携帯ネットワークが「圏外」？

私のモデルはSIMソケットを内蔵しており、SIMを入れてモバイルネットワークが使えます。
Y!mobileのデータSIMを入れたときに問題が発生。
起動直後に「圏外」になって、通信できないことがあります。
いつもこうなるわけではなく、なるときとならないときがあります。

## 先に結論
対策としては、「1分待てばよい」。

## 解説
起動直後に「圏外」になっていても、1分ほど待っていると、電波をつかみました。
慌てずに待っていればよいだけのことでした。
当初は慌てて再起動を繰り返してみたりしましたが、何のことはない、電波をつかむのに少し待ち時間があるということでした。

# デジタルペン

## 純正ペン

付属のペンが不調になりました。ポインタが飛びまくります。まともに書けません。
そこで純正ペンを購入したときのメモです。
純正ペンの型番等は下記です。

- 製品名: ThinkPad Pen Pro-2
- 製品番号: 4X80K32538
- 対応機種: ThinkPad Yoga 260のものと同等品です。

新しく購入したペンは快調です。
ペアリングなどの手続きなしで、いきなり使えます。

## 互換ペン: Wacom Bamboo Ink

本PCのペンの規格は、ワコムAES(アクティブ静電結合方式)です。
Windows PCのデジタルペンの規格は、MPP(Microsoft Pen protocol)とAESの2種類あるようです
規格が合わないペンは使えません。
実際、間違えて購入したMPP規格のペンは全く反応せず、使えませんでした。

下記のペンは使えました。動作した事例として記録しておきます。

- 製品名: Wacom Bamboo Ink
- 型番: CS323AG0C

その他気がついたことのメモです。

Bamboo Inkは、AESとMPPの両方に対応(切り替え可能)しています。
ペアリング不要ですぐに使えます。
Bamboo Ink側は傾き検知に対応していますが、残念ながら本PC側が傾き検知に未対応です。
純正ペンとの比較としては、同じ筆圧でも、Bamboo Inkの方が線がやや太めになります。

# イーサネット拡張ケーブル

純正のイーサネット拡張ケーブルには、「FRU:04X6435」の表記があります。
これはサービス部品番号(FRU)というもので、型番ではありません。
いわゆる型番に相当する購入部品番号は、「4X90F84315」です。
本製品を追加で購入したい場合は、こちらの番号で検索する方が通販サイトが良くひっかかります。
json.Unmarshal()でやらかした話

## はじめに
[techtrainの課題](https://github.com/CyberAgentHack/techtrain-mission)をやっている途中```post```の実装で詰まったことがあったので備忘録を残しときます．

## 結論

データを```curl```で渡すときはデータ形式がJSONであるかちゃんと確認してからやろう

### 失敗
```bash
curl --location --request POST 'http://localhost:8080/user/create' \
--header 'Content-Type: application/json' \
--data-raw 'hoge'
```

値が取れてない

```bash
2020/04/19 09:27:52 invalid character 'h' looking for beginning of value
2020/04/19 09:27:52 0
2020/04/19 09:27:52
```

## 成功
```bash
curl --location --request POST 'http://localhost:8080/user/create' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "hoge"
}'
```
ちゃんと取れてる

```bash
2020/04/19 09:33:03 0
2020/04/19 09:33:03 hoge
```

## コード

```golang
package main

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"

	_ "github.com/go-sql-driver/mysql"
	"github.com/gorilla/mux"
)

type UserCreateRequest struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
}

func userCreateRequest(w http.ResponseWriter, r *http.Request) {
	reqBody, _ := ioutil.ReadAll(r.Body) // []uint8 byte stream
	userCreReq := &UserCreateRequest{}
	err := json.Unmarshal(reqBody, &userCreReq)
	if err != nil {
		log.Printf(err.Error())
	}
	log.Printf("%d\n", userCreReq.Id)
	log.Printf("%s", userCreReq.Name)
}

func handleRequests() {
	myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc("/user/create", userCreateRequest).Methods("POST")
	log.Fatal(http.ListenAndServe(":8080", myRouter))
}

func main() {
	handleRequests()
}
```

## さいごに
サーバーサイドほんと分からないところでエラーを起こすので失敗するたびに備忘録を残したい
あとpostmanいいですよ～

## 資料
- [invalid character 'W' looking for beginning of value: SyntaxError](https://it-akumi.hatenablog.com/entry/2019/01/23/123201)
- [Package json](https://golang.org/pkg/encoding/json/#Unmarshal)
【NestJS】Swagger（OpenAPI）の@ApiBodyの定義を書く

# 環境

- [NestJS 7.0.7](https://nestjs.com/)
- [@nestjs/swagger 4.5.1](https://github.com/nestjs/swagger)

# ドキュメント

↓に、書き方の説明はありますが、実際に書こうとした時に情報が足りなかったので、備忘録として残しておきます。
https://docs.nestjs.com/recipes/swagger#raw-definitions

# 書き方例

`schema`の下に、`type`と`properties`を書いていきます。

```javascript

  @ApiBody({
    schema: {
      type: 'object',
      properties: {
        name: { type: 'string', example: 'yourNameComesHere' },
        isPublished: { type: 'boolean' },
        sig: {
          type: 'object',
          properties: {
            v: { type: 'number' },
            r: { type: 'string' },
            s: { type: 'string' },
            sender: { type: 'string' },
          },
        },
      },
    },
  })
```
Amazon Redshiftの”、[バージョンアップグレードの許可] ”はCLIでないと無効化できない。

Amazon Redshiftには他のAWSマネージドサービスと一緒で、
内部コンポーネントの強制的なアップグレードが走る。

マネジメントコンソール上だと各クラスタを選択度の”メンテナンスとモニタリング”タブ内から
バージョンアップグレードの許可の現在設定値を確認できる。

※デフォルトのallow-version-upgrade（バージョンアップグレードの許可）はtrueなのでマネジメントコンソールで作成した場合は”はい”が初期値

上記のバージョンアップグレードは無効化したい場合はawscliでの操作が必要。

https://docs.aws.amazon.com/cli/latest/reference/redshift/modify-cluster.html

具体的には上記のドキュメント通り、

```
awscli modify-cluster --cluster-identifier <clsuter名>　―-no-allow-version-upgrade
```
で無効化できる。

ただ管理ガイドに記載の通り
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/redshift-mgmt.pdf


>エンジンの新しいバージョンが利用可能になったときに、クラスターの Amazon Redshift エンジンを自
動的にアップグレードするかどうかを指定するには、[バージョンアップグレードの許可] 設定を使用しま
す。この設定はデータベースバージョンのアップグレードには影響しません。データベースバージョン
は、クラスターに指定したメンテナンス期間中にアップグレードされます。Amazon Redshift エンジン
のアップグレードはメジャーバージョンのアップグレードで、Amazon Redshift データベースのアップグ
レードはマイナーバージョンアップグレードです。バージョンの自動アップグレードは、メジャーバー
ジョンに対してのみ無効にできます。マイナーバージョンアップグレードのメンテナンスウィンドウの詳
細については、「メンテナンスウィンドウ (p. 13)」を参照してください。

と記載があったり完全にRedshiftのバージョンアップを無効化することはできないので、
（マイナーバージョンアップの遅延もドキュメントによると最大45日後ろにすることしかできない。）
それを考慮した運用が必要のようです。
merge文とdual表でUPSERT

SQL初心者が頑張って勉強中です。
今回はmerge文とdual表を使ってUPSERTする方法をアウトプットしたいと思います。

#UPSERTとは、
UPSERTはINSERTとUPSERTを合体して、一つの文にしたような処理を指すもので、UPSERTという構文はない。
該当する行がない時はINSERTして、ある時はUPDATEしたいときの処理をUPSERTということがある。

#merge文でUPSERT
merge文を使えばUPSERTができる。
例えば、ユーザーワークテーブルにあるデータとユーザーマスタにあるデータをmergeするときはこんな感じ。
ワークテーブルのユーザーIDがユーザーマスタにあったら、UPDARTして、なかったらINSERTしてくれる。

```
MERGE INTO ユーザーマスタ T1 --登録先のデータ
USING (
  --登録元のデータ
  SELECT
    S1.ユーザーID
    ,S1.氏名
    ,S1.パスワード
  FROM
    一時ユーザーテーブル S1
  
)
ON (
  --登録先のデータと登録元のデータを結合
  --(登録元のデータが登録先に登録されているかどうかの判定)
  T1.ユーザーID = S1.ユーザーID
)
WHEN MATCHED THEN
  --登録先すでに存在している場合
  UPDATE SET
    T1.氏名 = S1.氏名
    ,T1.パスワード = S1.パスワード
WHEN NOT MATCHED THEN
  --登録先に存在しない場合
    INSERT
        (ユーザーID, 氏名, パスワード)
    VALUES
        (S1.ユーザーID, S1.氏名, S1.パスワード)
```
では、mergeしたいデータはテーブル上にない場合はどうするのか？
（例えば、画面からEXCELファイルをアップロードして、ファイルに書いてある内容をUPSERTしたいとき）

#DUAL表を使う
dual表とは、、、

DUAL 表とは、オラクル固有のディクショナリ表の 1つで、DUMMY カラムだけで作成されている。
DUMMY カラムには 'X' という 1 レコードだけが存在する。
DUAL 表のオーナは SYS であるが、 PUBLIC シノニム宣言によって すべてのユーザーから DUAL としてアクセスが可能になっている。
DUAL 表は通常の1 レコードの表とは異なりオプティマイザによって、特別な 実行計画 (FAST_DUAL) が生成される。
一般的な使い方としては、SQL での関数の呼び出しや確認に使用される
（SHIFT the Oracleより抜粋）

どうやら、ダミーカラムしかなくて、具体的なデータを持たせるテーブルとは全く異なり、関数を使ったり、動作確認をするため
偽物テーブルみたいな便利な存在らしい、、、。
画面上から受け取ったデータは、このdual表を使ってUPSERTすることができる。
こんな感じ、、、

```
MERGE INTO ユーザーマスタ A
  USING (SELECT ? ユーザーID, ? 氏名, ? パスワード FROM DUAL) B 
  ON ( A.ユーザーID=B.ユーザーID ) 
WHEN MATCHED THEN 
  UPDATE SET
    A.氏名 = B.氏名
    ,A.パスワード = B.パスワード
WHEN NOT MATCHED THEN
   INSERT
        (ユーザーID, 氏名, パスワード)
    VALUES
        (B.ユーザーID, B.氏名, B.パスワード)
```

例えば画面から受け取った情報をlistに入れて、prepareStatementとdual表を使えばいい感じにUPSERTできるはず、、、！

#参考文献
https://lightgauge.net/database/sqlserver/2446/
https://omachizura.com/2016/06/sql-merge.html
https://www.drk7.jp/MT/archives/lite/001386.html
【Unity】テキストのONとOFFを交互に切り替えるボタンを作る

#環境
Unity 2019.3.7f1

#はじめに
ONとOFFが交互に切り替わるボタン作りたいそこのあなた！
**今から作ります!**

#実装までのステップ

全6ステップです。
1.ボタンを作成
2.空のゲームオブジェクトを作成
3.スクリプトを作成
4.空のゲームオブジェクトに作ったスクリプトをアタッチ
5.空のゲームオブジェクトのスクリプトにボタンのテキストをアタッチ
6.ボタンにスクリプトの関数を割り当て

**1.ボタンを作成**
ボタンを作成したら勝手にCanvasが生成され、その中にボタンが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/e478bf98-76e0-bfed-edc1-f0fb9a093532.png)
　
ボタンのテキストをONに変更しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/cfa26b94-2184-3636-b780-b234fe34ec8a.png)

**2.空のゲームオブジェクトを作成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/8d4cd7e6-a39c-75e7-174c-0e2b1ab5d1e0.png)

**3.スクリプトを作成**
新規スクリプトを作成しスクリプトの名前は適当にtestとつけます。

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを使うため追加

public class test : MonoBehaviour
{
    [SerializeField] private Text on_off_text;//ボタンのテキストをアタッチ
    private bool on_off_button_bool;//bool型の変数on_off_button_boolを宣言


    void Start()
    {
        on_off_button_bool = true;//初期設定
    }

    //ボタンを押したら実行する関数　実行するためにはボタンへ関数登録が必要
    public void Push_Button_Change()
    {
        on_off_button_bool = !on_off_button_bool;// !で反対の意味にするtrueならfalse 、falseであらばtrueになる。

        //on_off_button_boolがtrueだったら処理
        if (on_off_button_bool == true)
        {
            on_off_text.text = "ON";//テキスト変更
        }

        //on_off_button_boolがtrueではないなら処理
        else
        {
            on_off_text.text = "OFF";//テキスト変更
        }
    }
}
```


 
　 
**4.空のゲームオブジェクトに作ったスクリプトをアタッチ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/105b02c8-0e49-86ae-5cf4-c7e467af2423.png)

**5.空のゲームオブジェクトのスクリプトにボタンのテキストをアタッチ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/1750c725-4489-a13e-a829-7d0f30ffad30.png)

**6.ボタンにスクリプトの関数を割り当て**
ボタンオブジェクトのインスペクターのButtonコンポーネントで関数を割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/67f69835-c90e-6f7e-91b4-0c52d526c0ad.png)

　
**実行結果**
ボタンを押すたびにテキストがONとOFFに切り替わります。
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/afSokv9EBN">pic.twitter.com/afSokv9EBN</a></p>&mdash; Maru＠個人アプリ開発者 (@Maru60014236) <a href="https://twitter.com/Maru60014236/status/1251805394244005888?ref_src=twsrc%5Etfw">April 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

#おわりに
今回は作業内容だけとしておきます。
もっと簡単にできる方法があると思うので教えてください。
RxSwiftのObservableメソッドのメモ

RxSwiftを学ぶ上でObservableメソッドとしていくつか現れてくるので、アウトプットとしてまとめたいと思います。

## 1. Observable

処理を記述する“起点”で、宣言しておくものと覚えておく。（理解が浅い）

## 2. from

Observableインスタンスを生成するためのメソッド。
fromの他にも、一つだけの要素を渡すjustや複数の要素を渡すofもある。

```sample.swift
  // 1つの要素
  Observable.just("アップル")

  // 複数要素
  Observable.of("a", "b", "c", "d")
```

## 3. map
配列のmapと同様、加工ができる。
※mapやfromなどのメソッドを“Operator”と呼んでいるらしい。

Observable.mapの戻り値はObservable<Result>であり、以下がサンプルです。

```sample.swift
  .map({ price in
      Int(price * tax)
  })
```
この状態だと、返り値はObservable<Int>になります。

## 4. subscribe
subscribeは購読という意味。
イメージとしては、subscribeを呼び出すことでmapやfromで記述した処理が動き出して、各要素がObserverに渡されていく。以下参考文献からの引用コードです。

```sample.swift
  .subscribe(onNext: { [weak self] _ in
      self?.increment()
  })
```

クロージャで書くことができ、onNextはObserverに渡される時に呼び出される。

## 5. disposed
subscribeによって動作している処理を停止して、Observableが内部で保持しているObserverを開放するメソッド。
引数にインスタンス変数として定義したdisposeBagを入れることで、表示中のViewControllerが破棄(deinit)されたタイミングでdisposeBag自身もと購読が破棄される。

```sample.swift
    @IBOutlet weak var countButton: UIButton!
    private let disposeBag: DisposeBag = DisposeBag()

    private func bindButtonToValue() {
        countButton.rx.tap
            .subscribe(onNext: { [weak self] _ in
                self?.increment()
            })
            .disposed(by: disposeBag)
    }

    func increment() {
       省略...
    }
```

## 所感
理解が難しい内容ほどアウトプットして理解を怠らないようにしなければならない。
rxの理解がまだまだなのでこれからもアウトプットして質を高めていく。

## 参考資料
http://open8tech.hatenablog.com/entry/2019/04/03/111100
https://www.2nd-walker.com/2020/01/30/beginning-of-rxswift-2/
業務が捗るスプシ/Excel芸〜ピボットテーブル〜

#これは
データ分析で役に立つ、非エンジニアでも使える関数などをまとめます。今回はピボットテーブルです。

#クロス分析とは[^1]
クロス分析とは、
>データを2、3個の項目にしぼって、それらに属しているものがどのような関連を持っているかを分析する手法です。

[^1]: [AIBeacon 用語集＞クロス分析](https://www.aibeacon.jp/yougo/%E3%82%AF%E3%83%AD%E3%82%B9%E5%88%86%E6%9E%90/)

##どういう時に使うの
例えばこういう表があったとき[^2]、いつ何がいくつ売れたかなど、クロス分析してひとつのテーブル（表）に可視化できたら良いですよね。
スプシ(Google Spreadsheet)やExcelでは、ピボットテーブルを使うことで簡単にクロス分析を行うことができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/0160bbcf-273c-ca1a-24aa-14b3d56a3f0e.png" width=750>

[^2]: この記事に使用したデータセットは、[こちら](http://mt-soft.sakura.ne.jp/)のサイトの無料練習教材を拝借したものです。ありがとうございます。

#ピボットテーブルの作り方
##前提
今回は、主にスプシを使ってピボットテーブルのやり方についてまとめます。
スプシとExcelは、基本的な操作に大きな違いはありません。
ただ、ピボットテーブルについては若干お作法が変わるところもあるので、必要に応じて注釈を入れていきます。

##データを選択する
範囲選択について、Macは `⌘ + Shift`、Winは `ctrl + Shift`のショートカットキーが使えます。
###注意点
クロス分析では、範囲選択したデータの一番上の行のデータセットが項目として認識されます。
そのため、項目名が記されている行から範囲選択する必要があります。
![スクリーンショット 2020-04-19 17.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/9e0d6626-d0f2-7d0e-6a3c-a2338185561c.png)

##スプシ＞「データ」タブ＞「ピボットテーブル」[^3]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/a9dbb80e-81e4-c67b-8f5f-a40d4669a944.png" width=700>

###余談
「ピボットテーブル」を押下するとこういうモーダル↓が出てきます。個人的には生データを侵食したくないので新しいシートで作ることが多いです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/ad5e84fe-4158-29c4-c1e8-3624dbddf06f.png" width=300>


[^3]: Excelの場合は、「データ」タブではなく「挿入」タブにピボットテーブルが入っています。

##欲しい情報を行、列、値に追加する
これについては直感的な操作が可能だと思うので、あえてこちらから何か言及するようなことはしません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388931/eef7c1e3-1bcb-65b7-f47c-400a1c508c35.png" width=1000>

#ピボットテーブルを装飾したい時
範囲選択して、別のシートに「**値のみ**」コピーしましょう。

#
あやしいサイトの3分調査方法(初心者向け)

ふと怪しいサイトを見つけてしまったときに、どのくらい危険かをなんとなく3分くらいで調査する方法です。
本格的な調査の必要があるかどうかの判断材料の一つとして使えると思います。
なお、白の証明をするものではないので、ご注意ください。

## 役立つケース
* ネットサーフィンをしていて、いつの間にか変なサイトにアクセスしてしまい、不安になってしまったとき
* プロキシログを確認すると、見慣れないサイトへのアクセス履歴があり、不安になってしまったとき

## 活用サイト
| サイト名 | 概要 | URL |
| ---- | ---- | ---- |
|  aguse.jp | URLやメールヘッダー等を分析し、関連情報を表示するサイト | https://www.aguse.jp/ |
|  VirusTotal | ファイルやURL等の分析、マルウェア判定をできるサイト | https://www.virustotal.com/gui/home/url |
|  AlienVault - Open Threat Exchang | IoC(Indicator of Compromise)※情報を交換できるプラットフォーム | https://otx.alienvault.com/ |
※攻撃されたことを示す痕跡の情報であり、代表的なものとしてURL、Domain、IPアドレス、ハッシュ値等がある。

## 活用方法（例）
* 調査対象URL(自分のブログのURL、無害なもの)  
  https://moneymog.hatenablog.com/

### aguse.jp
サイトの外観等の基本情報を調べます。

1-1. URLの入力
　　<img width="275" alt="1-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/1c86b485-5b46-2cb1-8d3a-ac3b420b45b8.png">

1-2. サイト概要の確認
<img width="479" alt="1-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/ed96ac30-8e60-b724-e4c1-3e09b9d0c9a5.png">

1-3. ブラックリストの合致の有無を確認(今回はマッチなし)
<img width="482" alt="1-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/1e024c79-a6cd-16ac-59a2-c46d3e208746.png">

(参考)合致する場合の表示
<img width="483" alt="1-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/ecfd3d75-2b48-18d2-5c81-2c9c3b79292e.png">

### VirusTotal
アンチウイルス等のエンジンによる判断結果を確認します。

2-1.URLの入力
<img width="360" alt="2-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/3894ba6d-19b3-d53e-3970-b851a07da21e.png">

2-2.悪意判定を確認(今回は0/80で検知なし)
<img width="629" alt="2-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/4f7d69f9-f4ac-cd72-b44f-f3eceeb97702.png">

(参考)検知がある場合の表示
<img width="641" alt="2-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/ec4772f9-9b89-48ec-d3f1-e5064f6a1fe6.png">

### AlienVault - Open Threat Exchang
ドメインに関係する攻撃情報を確認します。

3-1. ドメインを入力(虫眼鏡をクリックしてから入力)
<img width="416" alt="3-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/ccbdaf7d-5ec4-f81b-9836-eb8f809971f6.png">

3-2. Related Plusesの有無の確認(今回はなし)
<img width="826" alt="3-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/cc94d474-0738-7aed-24b7-4a8a13683c9a.png">

(参考)Related Plusesがある場合の表示
<img width="678" alt="3-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43704/27029e2b-11a0-e2f8-311b-a191221cc534.png">

##
各ブログ（[はてブ](https://moneymog.hatenablog.com/)、[Qiita](https://qiita.com/moneymog)、[Note](https://note.com/moneymog)）の更新やセキュリティニュース等を
Twitter（[@moneymog](https://twitter.com/moneymog)）でお知らせしています。
よろしければ、フォローください。
Python外部モジュールimportについて＜超初心者向け＞

#はじめに

pythonを書いていると、importと書かれた下記のような記述が必ずと言ってよいほど登場します。

```.py
import sys
```
おまじない的にコピぺして使っていたのですが、だんだん避けては通れなくなってきたのでちゃんと調べてみました。

##目次
- モジュールとは
- 基本のimport
- fromを使ったimport
- 複数オブジェクト(関数）のimport方法
- *（ワイルドカード）を使ったimport
- モジュール読み込みとオブジェクト読み込みの違い
- 別名でのimport

---
##モジュールとは
Pythonでは関数やクラスなどをまとめて書いたファイルをモジュールと呼びます。.pyファイルの事です。
モジュールを複数まとめたものをライブラリと呼ぶようです。
Pythonには標準ライブラリが存在していて、importすることで利用可能となります。

##基本のimport
そのモジュールを読み込むのが`import`です。以下のように`import <モジュール名>`とするとモジュールがmodule型のオブジェクトとしてインポートされます。

```.py
import math
```

mathがモジュールとしてインポートされている事は`type`でプリントするとわかります。

```.py
import math
print type(math)

>>>  
<type 'module'> 
>>>
```

##fromを使ったimport
モジュール内の関数やクラスを直接importする事も可能です。
`from <モジュール名> import <関数名>`でインポートできます。
importした関数は、名前を指定する事で実行可能です。
関数に限らず変数、クラスをimportすることもあるので、以下では <オブジェクト>と表記します。

```.py
from math import pi 
print(pi) 
>>>
3.141592653589793
>>>
```
オブジェクトを指定してimportした場合、mathモジュールはインポートされていません。

```.py
from math import pi 
print type(math)

>>> 
NameError: name 'math' is not defined
>>> 
```

####複数オブジェクトのimport方法
複数のオブジェクトを同時にimportすることも可能です。

```.py
from math import pi, radians
```


モジュールを読み込むときは、PIP8では下記の記述が推奨されてるとのことで、注意が必要です。

```.py
# NG 
import os, sys 
# OK 
import os 
import sys
```


##*（ワイルドカード）を使ったimport
*（ワイルドカード）を使うと全てのオブジェクトをimport可能です。ただし少々乱暴なimport方法なのであまり推奨されないようです。


```.py
from math import *
```

##モジュール読み込みとオブジェクト読み込みの違い
モジュールだけを読み込んだ時と、オブジェクトを読み込んだときでは、実行時の記述が異なります。

####モジュールのみの読み込みの時
モジュールのみを読み込んだときは、関数を実行する際に`＜モジュール名＞.＜オブジェクト名＞`という指定が必要になります。

```.py
import math
print(math.pi)#＜モジュール名＞.＜オブジェクト名＞
```
####オブジェクトの読み込み時
オブジェクトを読み込んだときは、`＜オブジェクト名＞`のみの指定で実行可能です。

```.py
from math import pi
print(pi)#＜オブジェクト名のみ＞
```

####間違い例
モジュールだけを読み込んだ状態で、直接オブジェクト名だけを指定するとエラーになります。

```.py
import math
print(pi)
```

##別名でのimport
モジュールやオブジェクトに任意の名前を付けて呼び出す事も可能です。

```.py
import math as m
print(m.pi)
```

```.py
from math import pi as pai
print(pai)
```


##参考にしたサイト
https://note.nkmk.me/python-import-usage/
CMOS回路の読み方

# CMOS回路を論理式に置き換える
 - 原理は今回は考えずにどのようにCMOS回路を読むかについてのみ書きます。


回路を論理式にするときの共通のルールは

|**直列**|**AND**|
|:--|:--|
|**並列**|**OR**|

直列で接続されているときは論理積
並列で接続されているときは論理和
になります。

加えて、pMOSとnMOSでは異なった独自のルールが存在するので区別する必要があります。
出力Yを基準として、下にnMOSを集めた回路・上にpMOSを集めた回路になっているので区別できます。

nMOS・ｐMOSに対してそれぞれ１つずつルールをおぼえるだけです。
(実際には多くのルールが違いますが、今回は回路を読むための最低限です。)

|                  |ルール|
|:-----------------|:-------------------------|
| pMOS             |入力が0のときにONになる|
| nMOS             |全ての条件が満たされたときに出力0|

入力が0の時にpMOSはONになるので入力を反転させる必要があります。
nMOSでは、論理式が満たされたときに出力が0になるので、nMOS全体の論理式を反転させる必要があります。

簡略化すると下記の表になります。

|                  |ルール|
|:-----------------|:-------------------------|
| pMOS             |各入力を反転|
| nMOS             |nMOS全体の論理式を反転|


下記のCMOS NANDゲートを例として、これは本当にNAND回路なのか確認します。
<img width="273" alt="スクリーンショット 2020-04-19 17.36.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584992/e4be1b4c-fd64-1670-2bbb-605f468995f1.png">

- nMOS側
　Qn1とQn2が直列接続されているのでA・Bになります。
  nMOSのルールである**全体の論理式を反転**を行うと、Y = NOT(A・B)になります。
　NANDの形になってます。

- pMOS側
　Qp1とQp2が並列接続されているのでA+Bになります。
  pMOSのルールである**入力を反転**を行います。
  Y = NOT(A) + NOT(B) となり、出力Yはドモルガンの法則を適用すると
  Y = NOT(A・B)となり、ｐMOS側もNANDの形になってます。

このように、pMOS側, nMOS側がともにNANDの形になっている必要があり、それを上記で示すことができました。

## おまけ
なぜpMOS側とnMOS側両方が同じ形になっている必要があるのかと思った人もいると思います。
これは、CMOSが、pMOSとnMOSがお互いを補完するように作成されているからです。
片方ががONの時はもう片方はOFFになっているので、消費電力をおさえることができます。
これ以上は原理の部分に触れる必要があるので、詳しくは時間があるときに追記します。
Hadoopまとめ

# Hadoop

##How it all started?
The large-scale process such as a search engine system that can index 1 million pages costs a tons of money and running cost. Meanwhile, a paper described about the architecture of the __Google's distributed file system__ was published in 2003. Later in 2004, Google published one more paper that introduced __MapReduce__. Finally, these 2 papers led to the **hadoop**.

##General architecture of hadoop
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/71923694-0dec-3252-1723-3b6848659f47.png)

Hadoop architecture is similar to the Bob's restaurant. 
Let's say that there is a restaurant which struggles with dealing with many orders by only 1 chef. To solve this problem, Bob hires much more chefs to distribute the task into those chefs(__Distributed File System__).
 
Everything is going well, but there occurs another problem. Since each chef trys to access the very food shelf, the food shelf becomes the bottle neck of the whole process. In order to solve this, Bob divided each chef into 2 hierarchies(__Junior__ and __Head chef__). Each __Junior__ chef will do small task, prepare the ingredient(ex. prepare sauce, cook meat, vegetable..). Then, all those task will be derived to the each __head__ chef, that will combine all the task and done the process(__Map Reduce__).

## How Hadoop provides the solution to the Big Data problem
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/9fb918ad-55b1-d62e-0407-7a16b1feed2a.png)

## Hadoop Core Component
One is __HDFS(storage)__(Hadoop Distributed File System) and another one is __YARN(Processing)__. 

###HDFS
The main components of HDFS are __NameNode__ and __DataNode__. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/156c6ea7-e470-9803-3c0f-338fd5400bbe.png)

__NameNode__ maintains the information of each __DataNode__.

###YARN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/388fe412-adac-5f4a-9bf1-35e24354da39.png)



https://www.edureka.co/blog/hadoop-tutorial/
Djangoにおけるフォーム

# はじめに

ここでは、djangoにおけるフォームの設定の基本について解説します。

# forms.pyの追加

```python:forms.py
from django import forms

from .models import SampleModel


class SampleForm(forms.ModelForm):

    char_sample = forms.CharField(widget=forms.TextInput(attrs={'size': 300}))

    class Meta:
        model = SampleModel
        fields = ('char_sample', 'text_sample')
```

フォームのクラスを設定することで、モデルで設定したフォームにより細かな設定を行うことができます。
`Meta`クラスでは、対象とするモデルと、表示するフィールドを明記します。


# まとめ

ここでは、Djangoのフォームのクラスの設定について解説しました。
次回はビューについて取り上げる予定です。
はじめてのDockerHubリポジトリ登録

#はじめに
何も面白い話ではないのですが、DockerHubにはじめてイメージをリポジトリ登録したので
記念に残します。

# 前提条件
・Docker.comのアカウントを持っていること

# 手順
1.ローカルPCよりDokcer起動
2.ローカルPCよりDocker.comへログイン
3.ローカルリポジトリにリモートリポジトリの名前を使ってタグ付け
4.DockerHubへリポジトリ登録
5.DockerHubのWebサイトへ行って登録具合を確認する

# 手順（詳細）
## 1.ローカルPCよりDokcer起動
　自分の環境はWindowsなのでDocker Quick Terminalを起動。

## 2.ローカルPCよりDocker.comへログイン
docker loginを実行するとID/PW聞かれるので入力するだけでOK。
今回のリポジトリ先はDockerHubということもあり、リポジトリを特に指定する必要なし。

```:Docker
watyanabe:~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: watyanabe164
Password:
WARNING! Your password will be stored unencrypted in /home/vagrant/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
watyanabe:~$
```
## 3.ローカルリポジトリにリモートリポジトリの名前を使ってタグ付け
最初にimagesを確認。手元にcentos:7があったのでこれをリモートリポジトリにUPすることにした。
リモートに上げるために、タグ付けをする必要があり、
自分のDockerHubのアカウントを前につけてやる必要があるようだ。

docker tagで登録したのちに再度docker imagesすると、IMAGE IDが同じでTAGの異なIMAGEが出来上がったことが確認できた。
```:Docker
watyanabe:~$ docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
centos                                    7                   5e35e*******        5 months ago        203MB

watyanabe:~$ docker tag centos:7 watya*****/centos:7

watyanabe:~$ docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
centos                                    7                   5e35e*******        5 months ago        203MB
watya*****/centos                       7                   5e35e*******        5 months ago        203MB
watyanabe:~$
```
## 4.DockerHubへリポジトリ登録
登録方法は簡単で、docker pushでOK。意外とあっけない。

```:Docker
watyanabe:~$ docker push watya*****/centos:7
The push refers to repository [docker.io/watya*****/centos]
77b174a6a187: Mounted from library/centos
7: digest: sha256:285bc*********************************************************** size: 529
watyanabe:~$
```

## 5.DockerHubのWebサイトへ行って登録具合を確認する
ローカルPCでの作業が完了したのでDockerHubへ登録っぷりを確認。
ログイン直後のトップ画面にいい感じで確認できました。

https://hub.docker.com/repositories
![コメント 2020-04-19 174357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/73134f93-fa79-9817-a2da-691c3ea0d493.png)

で、登録されたイメージの詳細画面はコチラ。
![コメント 2020-04-19 174425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c1bb2328-b82b-cb5d-9592-fefbfafd4cd6.png)

大したことしてないのにいい感じで登録できてなんだかすごい！
さすがDockerHub。

# おわりに
リポジトリ登録が思った以上に簡単だったのでほっとした。
今回はとりあえずやってみた的な感じだけど、結構出番はありそうな感じ。
DevOpsとは何か？

参考記事
https://www.buildinsider.net/enterprise/devops/01


名にはともあれ最初は読み方から学びましょう。
読み方は「デブオプス」。

DevOpsはツールベンダーやユーザーコミュニティが多角的な視点で解釈することで依然はっきりとした「DevOpsとはこう！」といった厳密な定義は存在していない。
そんな中でもわかりやすく解説していただけている記事を参考にしながら自分が後から見てしっかり理解できるレベルに咀嚼してアウトプットしていきます。

##そもそもDevOpsとはなんなのか。
一言でいうと、
「開発・運用するソフトウェア/システムでビジネス価値向上を目指して確実かつ迅速にエンドユーザーに届け続ける」
という概念そのもの。

もう少し噛み砕くと。
ソフトウェアやシステムを創造するうえで、
・開発＝開発チーム（Development）
・運用＝運用チーム（Operations）
ざっくり分けると上記2つのチームに分かれる。
この2つのチームが協調性をもってビジネスとしての価値向上を目指すことはもちろん。
そのビジネスの価値を確実により迅速にエンドユーザーへ届けることを指した概念なのです。



この概念自体の原典であるプレゼンテーションが下記のURLからご覧いただけます。
https://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr

##DevOpsで生じる問題。
開発・運用の２つのチームはそもそもそれぞれの役割が違う為、対立が起こりやすい。
この対立構造は上記のプレゼンテーションでも触れられています。
　＂Devの役割が“システムに新しい機能を追加する”である一方、Opsの役割は“システムの安定稼働”である。
　　そのため、Devが新しい機能を追加したくても、Opsはシステムの安定稼働のために変更を加えたがらない、
　　という対立構造が作られてしまっていた。＂
つまりは同じミッションである「システムによってビジネスの価値をより高めるだけでなく、そのビジネスの価値をより確実かつ迅速にエンドユーザーに届け続ける」を掲げているにも関わらずそれぞれの手段が対立しているためにお互いのミッション達成に悪影響を及ぼしている。

この問題を解決する為にツールと組織文化の観点から以下のような解決方法を提示しています。
###【ツール】
①　自動化されたインフラストラクチャ（Automated infrastructure）
　　インフラの構築を自動化する。よく使われるツールにはAnsibleやChef,Dockerなど。
②　バージョン管理システムの共有（Shared version control）
　　GitやMercurialなどの同じバージョン管理システムをDevとOpsで共有する。
③　ワンステップによるビルドとデプロイ（One step build and deploy）
　　手順書などを使い、手動でビルドやデプロイをするのではなく、ビルドやデプロイを自動化する。
　　よく使われるツールやサービスにJenkinsやCapistranoなどがある。
④　フィーチャーフラグ（Feature flags）
　　コード中の機能の有効／無効を設定ファイルで管理する。
⑤　メトリクスの共有（Shared metrics）
　　取得したメトリクスの結果をダッシュボードでお互いに共有する。
　　よく使われているサービスにはNew RelicやApplication Insightsなど
⑥　IRCとインスタントメッセンジャーのBot（IRC and IM robots）
　　SlackやHipChatなどのチャットツールに自動的にビルドやデプロイのログ、
　　アラート内容を投稿する仕組みを作ることで情報をお互いに共有する。

###【組織文化】
Ⓐ　お互いを尊重する（Respect）
　　一緒に働く相手のことを心から思いやる。相手を一人の人間として扱い、能力や功績を評価する。
Ⓑ　お互いを信頼する（Trust）
　　自分以外の人は優秀で、正しいことをすると信じる。信じて仕事を任せる。
Ⓒ　失敗に対して健全な態度をとる（Healthy attitude about failure）
　　新しいことに挑戦すれば自ずと失敗は起こってしまうもの。
　　失敗は起こるものであり、相手のミスだと責めるものではない。
Ⓓ　相手を非難しない（Avoiding Blame）
　　相手に非があると断じて言葉で責めるのではなく、次に同じ問題が起こらないように建設的な批判を行う。

ここまで提唱されている案を多々記載してきましたが、すでに冒頭にてDevOpsを一言で表したとおり方向性としては
「開発・運用するソフトウェア/システムでビジネス価値向上を目指して確実かつ迅速にエンドユーザーに届け続ける」
を目指すために提唱された概念そのもの。
開発・運用の両方面から足りないところや未熟な部分を改善していきましょうよ。という事。

ただ、ここで取り上げた「ツールと組織文化」の他にも様々なパターンで要素分けされたいくつかのDevOpsの考え方が提唱されている。※詳細は参考記事を参照願います。

では、これまで「DevOpsとはこういうもの」といった視点で見てきましたが、次回は逆にDevOpsについて誤認しているケースを見ながらより立体的に理解できるようにしていきたいと思います。
【PHP】スコープごとの変数の呼び出し方（$this->、$GLOBALS['']）

# 概要
変数の呼び出し方です。
グローバル変数（クラスより外）は、$GLOBALS[' '] で呼ぶ。
プロパティ（クラス内、かつメソッドの外）は、$this->で呼ぶ。
ローカル変数（スコープ内）は、宣言した変数をそのまま呼ぶ。
ただし、グローバル変数はあまり使わない方が良いとされています。

# 出力の例
クラスを定義して同ファイル内で実行まで記述することはないですが、処理の流れに沿ったサンプルとして書きます。

```php:

<?php

$var = 'global value';

class SimpleClass
{
  // プロパティの宣言
  public $var = 'property value';

  // メソッドの宣言
  public function displayVar() {
    $var = 'local value';
    echo $GLOBALS['var']. PHP_EOL;  // 'global value'を出力
    echo '<br>';
    echo $this->var. PHP_EOL;  // 'property value'を出力
    echo '<br>';
    echo $var. PHP_EOL;  // 'local value'を出力
  }
}

$sample = new SimpleClass;
$sample->displayVar();
```

PHP_EOLは改行文字で＜br＞ではないためブラウザで出力する際は改行表示されません。
そのため改行に"＜br＞"をechoしています。

```:出力イメージ
global value
property value
local value
```

# 別例
こちらも処理の流れに沿ったサンプルとして書きます。
にしてもメソッドの下に実行コードを書くのは気持ち悪い...

```php:

<?php

$var = 'global value';

class SimpleClass
{
  // プロパティの宣言
  public $var = 'property value';

  // メソッドの宣言
  public function displayVar() {
    $var = 'local value';
    echo $var;  // 'local value'を出力
  }
}

echo $var. '<br>';  // 'global value'を出力
$sample = new SimpleClass;
echo $sample->var. '<br>';  // 'property value'を出力
$sample->displayVar();
```

```:出力イメージ
global value
property value
local value
```
【#0 自己紹介】自分のWebサイトを持ちたい！！とずっと思っていたので作ってみた

# 誰ですか
初めまして。東京でエンジニアもどきをやっています、 @tom_ogashi です。
大学までは完全に文系の道を歩んでいましたが、就活で紆余曲折の末この業界に転がり込みまして、そろそろ3年目になろうかという頃合いです。

# この記事は何
自分のWebサイトを持つことが夢だったので、それを叶える記事です。

実は1年ほど前に転職活動を行いまして（色々あって結局転職するまでには至りませんでしたが）、その際に自身の技術や人となりをアピール出来るような場がインターネット上に欲しい、否、**必須である**と痛感いたしました。

インターネット上で自身の技術や人となりをアピールするためには、やはり発信拠点が欲しくなります。
そこで、まずはホームページを作ろうと思い立ちました。
また、ホームページの更新や成果物についての発信を行う場がきっと欲しくなるので、TwitterとGitHubのアカウントもいま作りました。何事も勢いは大事です。

ホームページを作ろうと思い立ってから1年のタイムラグが発生している理由は、ありません。
色々と適当な理由を付けて延期してきたプロジェクトを、いま始動させたくなった、ただそれだけです。
**何事も勢いは大事です**。

また、プロジェクトを始動させると決意した以上、完遂させたいと考えるのが人の常です。
なので、逃げ場をなくすためにQiitaにこのような記事を投稿する運びとなりました。

# どんな人に読んでほしいのか
当方、東京でエンジニアをやっていると書きましたが、業務内容はもっぱらExcel屋さんです。
また、就職するまでパソコンはそれなりに触っていましたが、プログラミング等は就職してから学習を始めました。
ですので、私と同じような境遇の方、そんな方に一連の記事を読んでいただいて、願わくば参考にしていただければと、そう考えています。
また、エンジニアの諸先輩方におかれましては、温かい目で見守っていただきたい、その上で、万が一アドバイスを頂けるようなことがあれば、私はとても幸せでございます。

# 実際に何をするのか
とりあえず、逃げ場を無くそうキャンペーンと題して、ドメインの取得とサーバーのレンタルをしようと思います。
ドメイン取得後は、モチベーション維持のために超単純なWebサイトをHTMLベタ打ちでも何でもいいので作ってみることにします。いま決めました。
それ以降は、超単純なWebサイトを少しずつ充実させていければいいな～と思っています。

# 締めのあいさつ
ひとまず、本日は簡単な自己紹介と決意表明を以て記事を締めさせていただきます。
次回はドメインの取得とサーバーのレンタルをやります。**絶対やります。多分。**

それでは、ご清聴ありがとうございました。
C# 基礎プログラミング100本ノック～11-15本目～

#こんばんは

本日も基礎プログラミング100本ノックやっていきます！

前回→[6-10本目](https://qiita.com/K_Hisui/items/87fa2b229bdb04401a10)
次回→[16-20本目](https://qiita.com/K_Hisui/items/df4d6e53d0f7f3657f0e)

#11本目
>Hello World!を10回繰り返して表示するプログラムを作成せよ。

~~~Sample.cs
const int NUMBER_OF_TIMES = 10;

for (int i = 0; i < NUMBER_OF_TIMES; i++)
{
    Console.WriteLine("HELLO, WORLD");
}
~~~

#12本目
>整数値を入力させ、その値の回数だけHello World!を繰り返して表示するプログラムを作成せよ。

~~~Sample.cs
int numberOfTimes;

Console.Write("繰り返し回数を指定してください：");

numberOfTimes = int.Parse(Console.ReadLine());

for (int i = 0; i < numberOfTimes; i++)
{
    Console.WriteLine("HELLO, WORLD");
}
~~~

#13本目
>整数値を入力させ、0から入力値まで数を1ずつ増やして表示するプログラムを作成せよ。

~~~Sample.cs
int numberOfTimes;

Console.Write("繰り返し回数を指定してください：");

numberOfTimes = int.Parse(Console.ReadLine());

for (int i = 0; i <= numberOfTimes; i++)
{
    Console.WriteLine(i);
}
~~~

#14本目
>整数値を入力させ、入力値から0まで数を1ずつ減らして表示するプログラムを作成せよ。

~~~Sample.cs
int numberOfTimes;

Console.Write("繰り返し回数を指定してください：");

numberOfTimes = int.Parse(Console.ReadLine());

for (int i = numberOfTimes; i >= 0; i--)
{
    Console.WriteLine(i);
}
~~~

#15本目
>整数値を入力させ、0から入力値を超えない値まで2ずつ増やして表示するプログラムを作成せよ。

~~~Sample.cs
int numberOfTimes;

Console.Write("繰り返し回数を指定してください：");

numberOfTimes = int.Parse(Console.ReadLine());

for (int i = 0; i <= numberOfTimes; i+=2)
{
    Console.WriteLine(i);
}
~~~

今日はスラスラ出来る内容でしたね～
明日はどうなるやら...

#リンク
[基礎プロI 100本ノック 基礎編](http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)