OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】cronについてのまとめとよくあるエラー

## はじめに

- 今回この記事を書こうと思ったのは、最近cronに関して学び直す機会があり、自分自身理解しきれていない部分もあったので今回学んだことを記事としてまとめて自分でも確認し直せるようにしようと思ったからです。

- タイトル通りcronについてのまとめとよくあるエラーについてなので、有識者というよりかは初心者の方に向けた記事になります。

## cronとは
- この内容については、[cronの設定ガイド](https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html)で以下のように説明されています。

> cron とは、ジョブ（スクリプト）を自動実行するためのデーモンプロセスです。
そして、Linux システムの管理を行なう場合、ログのローテートや、バックアップなど、定期的に自動実行したいジョブが数多くあります。
特に、バックアップなどは、システムへの負荷が大きいため、通常は、ユーザからのアクセスが少ない、深夜や早朝に行なわれます。

- これだけの説明を聞くとなんとなく難しそうという気がしますが、「指定した時間に指定したプログラムを動かしてくれるもの」という認識で問題ないと思います。

 - 例えば引用文にあるようにバックアップしたり、webサーバが停止した際に再起動するようにしたりなどができます。(他にも色々あると思いますがあくまでも1例です)

## 解説
- 次に「cronとはどういうものか分かったけど、実際どうやって使うの？」という方向けにプログラムを交えてここからは進めていきます。

### crontabファイルの編集

``` :crontab
crontab -l //crontabのファイルを確認
//ファイルがある場合はここに表示されます。
//ファイルが無い場合は no crontab for am と表示されます。

crontab -e //crontabのファイルの編集
//このコマンドを実行するとviのエディタが開きます。

```

- 次にcrontab - e した後のviの部分を下に書いていきます。
 
 - 書式は 分 時 日 実行ユーザ コマンド の順番になります。
 - 時間を指定しない部分は**＊**で表記します。 
 - 実行ユーザは省略することができます。

``` :vi

30 03 * * * /root/apache_process.sh
//意味としては毎日3時30分ごとに /root/apache_process.sh を実行するとなります。

```

- このようにcrontabを編集し任意のファイルを指定することで一定時間ごとに実行してくれます。
 
 - 最初に引用文を交えて説明しましたがこれを利用することで自動バックアップや自動シャットダウンなどが可能になります。
 
 - もしこの記事を読んで興味が出た方は一度自分で作成してみると勉強にもなりますし面白いと思います。

## よくあるエラー

- cronで設定したシェルスクリプトが動作しないことがあります。その場合は大抵は以下のことが多いです。
 
- そもそもcrondが動作しているのか？
 
``` :command

/etc/rc.d/init.d/crond status //これで動作しているか確認。

/etc/rc.d/init.d/crond start //停止していた場合はこれで起動させます。

```
- 実行ファイルの権限に問題はないか？

``` :command
ls -al //これで権限の確認ができます。

chmod +x 任意のファイル //これで実行権限が付与できます。
// xとは実行のことです。なのでここではxを付与しています。

```
- ログを見て何か問題はないか？

``` :command

cat /var/log/cron //これでlogの確認ができます。

```

## 参考サイト

- [ある日突然cronの設定を行った](https://qiita.com/yasuaki0206/items/306c859f0854dd0cfabf)

- [cronで監視しよう！](http://ash.jp/linux/unyo/09.htm)

- [cronの動作についていろいろ検証してみた](https://qiita.com/ti39dx/items/29a8a91cc46e68f7e07c)

- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 cron ](https://wa3.i-3-i.info/word11748.html)

- [crontabの使い方](https://saba.omnioo.com/note/1233/crontab%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
 
## 最後に
今回cronについてのまとめとよくあるエラーについての記事を書きました。
こういうOSの内部で動いているプログラム1つについて色々調べてみると「奥が深いなぁ」と思わせられる反面自分の知識の足りなさを痛感します。
今後もこういう風に勉強したことや再度学ぶ機会があったものに関しては積極的にアウトプットしていきたいと思っています。
Firebase/Performanceをpod installしようとしたらエラー出てきた話

↓pod installしようとしたらこんな感じのエラーが出る。
[!] [Xcodeproj] Generated duplicate UUIDs:
PBXNativeTarget

↓そのままXcodeでビルドしようとするとこんなエラーが出る。
Undefined symbol: _OBJC_CLASS_$_GULObjectSwizzler

↓解決策のリンク。
https://github.com/firebase/firebase-ios-sdk/issues/4419

↓結論、これをpodに追加すると解決した。
pod 'GoogleUtilities'

以上メモでした。
Ubuntu20.04でラップトップのディスプレイを閉じてもサスペンドせずに外部ディスプレイ一枚で使えるようにする

## UPDATE

この設定を使わなくてもできる環境もありそう。まずは何も設定せずに試してみてほしい。

## 環境

* Dell XPS 13 7390(2020)

## 概要

MacBookシリーズは外部ディスプレイを接続してラップトップ本体の液晶を閉じると外部ディスプレイのみで使用することができます。これを同じことをUbuntuでやる方法を説明します。

## /etc/UPower/UPower.confの編集

UPower.confの最下行に下記の一行を追加します。

```
ignoreLid=true
```

## upowerサービスの再起動

設定ファイルを編集したらupowerサービスを下記のコマンドで再起動します。

```
sudo service upower restart
```
WindoesのGit diff等で日本語を表示する方法

# はじめに

WindowsのGitで日本語が含まれるファイルをdiff等で表示しようとした際に、\nnn等の文字列にエスケープされてしまい、正しく表示されなかった。

# 設定方法

下記のコマンドでGitで表示される、日本語が表示される。

```sh:Gitの日本語化設定
git config --global core.quotepath false
```
GASでソースコードを秘匿する方法

# はじめに
GASで処理した結果をスプレッドシートで他人に見せたいが、そのGASでの処理内容は見せたくない。
ということがしばしば起こります。

例えば、何らかのWebサービスにログインした結果をスプレッドシートに出して他人に見せたいが
ログインに必要なIDパスワードは知られたくない。などなど。

本記事のようにすることで、
他人にソースコードを見せないようにすることができます。

# 実現方法
やり方をざっくりいうと、以下のようにします。

* スプレッドシートとスクリプトを別々に管理する。
* スプレッドシートには他人への閲覧権限を与える。
* スクリプトの権限は自分のみにする。

ちなみに
スプレッドシートとくっついたスクリプトを[Container-bound Scripts](https://developers.google.com/apps-script/guides/bound)、
今回のように別々で管理するスクリプトを[Standalone Scripts](https://developers.google.com/apps-script/guides/standalone)と言います。

# サンプル
スクリプトで生成した「Hello World」という文字列をスプレッドシートに表示させるというサンプルを通して
具体的にどうするか見ていきましょう。


## スプレッドシート
### 準備
新規でスプレッドシートを作ります。
名前を適当につけます。
ここでは「HelloWorldSheet」という名前にします。

### 権限設定
HelloWorldSheetのスプレッドシートは他人に見せたいので、
招待したり、URLを知っている人に公開にしたりと
適当に権限を設定します。

### スプレッドシートID
スクリプトからスプレッドシートを指定するときにHelloWorldSheetのスプレッドシートIDを使います。
スプレッドシートのURLは
`https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXX/edit#gid=0`
のようになっていますが、`XXXXXXXXXXXXXXXXXXXXXXXX`の部分がスプレッドシートのIDになります。
スクリプトで使うのでメモっておきます。

## スクリプト
### 準備
Standalone Scriptでスクリプトを作ります。
Googleドライブを開き、
__新規 ＞ その他 ＞ Google Apps Script__
でスクリプトを作成します。

### ソースコード
```Javascript:コード.gs
const SPREADSHEET_ID = 'XXXXXXXXXXXXXXXXXXXXXXXX'; // HelloWorldSheetのID
function myFunction() {
  const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  sheet.getRange('A1').setValue('Hello World');
}
```
通常のContainer-bound Scriptsの場合はgetActiveSpreadsheet()で書き込み対象のシートを取得していたのですが、__openById()__でIDを指定しているところが要注意です。

### 権限設定
このスクリプトのソースコードを見られたくないので、権限は自分のみにします。

## 完了
スクリプトで myFunction() を実行すると、HelloWorldSheetのA1にHello Worldと表示されます。
もちろん、他のアカウントでスクリプトを見ようとしても権限がないので
ソースコードは見られませんし、処理結果のスプレッドシートは他アカウントから見ることができます。

# おわりに

ログインに必要なIDパスワードを隠すのであれば[UserProperties](https://developers.google.com/apps-script/guides/properties)をうまく使えばできそうなのですが、
[GUI上であらかじめ設定しておくということができない](https://officeforest.org/wp/2019/04/30/google-apps-script%E3%81%A7%E4%BD%BF%E3%81%86%E6%83%85%E5%A0%B1%E3%81%AF%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%82%88%E3%81%86/)ようで、
現状ではこのように処理部分と表示とを分ける方法しかなさそうです。

他にいい方法があれば教えていただけると幸いです。
sortをいれるとUnexpected side effect in computed propertyってエラー

Vue.jsで
`Unexpected side effect in "xxx" computed property`
というエラーがでたのでメモ

computedで配列をsortして返そうとしたらエラー

```js
computed: {
  members() {
    return this.xxx.sort((a, b) => {
      if (a < b) return -1
      if (a > b) return 1
      return 0
    })
  }
}
```

↓

```js
computed: {
  members() {
    return this.xxx.slice().sort((a, b) => {
      if (a < b) return -1
      if (a > b) return 1
      return 0
    })
  }
}
```

これでエラー回避できた。
UE4のビルドしたパッケージに任意のファイルを配置する

例えば以下のようにプロジェクト内のtest.txtをshippingビルドでのみパッケージ内に配置したい場合

* コピー元：プロジェクト直下にあるtest.txt
* 配置先(Win64の場合)：ビルドしたパッケージのWindowsNoEditor/[プロジェクト名]/Binaries/Win64

Build.csに以下のように記述する。

```csharp
if (Target.Configuration == UnrealTargetConfiguration.Shipping)
{
    RuntimeDependencies.Add("$(BinaryOutputDir)/test.txt", Path.Combine(ModuleDirectory, "..", "..", "test.txt"));
}
```

## 参照サイト

* [サードパーティ ライブラリ | Unreal Engine Documentation](https://docs.unrealengine.com/ja/Programming/BuildTools/UnrealBuildTool/ThirdPartyLibraries/index.html)

## その他

以下のサイトのようにuprojectでのPostBuildStepsでcopyを使う方法も検討してみたがビルド先のディレクトリがとれない感じなのでやめた。

[Pre/Post build step in UBT - UE4 AnswerHub](https://answers.unrealengine.com/questions/411431/prepost-build-step-in-ubt.html)
[基礎] スクラッチとは？　子供向けプログラミング教材？

最近スクラッチという言葉がIT界隈で使われるようになりましたが、英語力のない私はScracthとは子供向けプログラミング教材のことだと誤解していました！

**スクラッチとは１から新しいものを作ることを意味します。**

おしまい。
discord.py+gspreadで出退勤を管理してみる

# 背景
自宅作業をしながら、出社している感を出すために、discordで何かできないかなぁと考えて、ボイスチャンネルに入っている時を出社、抜けたら退社したみたいなことができるbotを作ってみた。

# 作成物
![kintai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49447/1901b3ba-40f1-8aac-96df-034339a16e1c.gif)


## 使った技術
* discord.py
* gspread

# やったこと

* ボイスチャンネルのin/outの検知
* google spread sheetへの保存
* テキストへのリアクション付与

## ボイスチャンネルのin/outの検知
`discord.Clinent`の`on_voice_state_update(self, member, before, after)`を用いて検知

```python

async def on_voice_state_update(self, member, before, after):
  if(before.channel is None):
    # ボイスチャンネルにinした時の処理
    start_work(member)
  elif(after.channel is None):
    # ボイスチャンネルからoutした時の処理
    end_work(member)
```

## google spread sheetへの保存
ⅰ. spread sheetを適当なところに作る(説明略)
ⅱ. GCPでサービスアカウント作成＋driveAPI/sheetsAPIの有効化
ⅲ. Pythonにて実装

### GCPでサービスアカウント作成＋driveAPI/sheetsAPIの有効化
[こちらのサイト](https://tanuhack.com/operate-spreadsheet/)を参考に行いました。

ⅰ.で作成したspread sheetに作成したサービスアカウントを共同編集者として招待しておく。また、ここで保存した秘密鍵のファイル名を仮に`himitsu.json`としておく。

### Pythonにて実装
以下のように実装した。

```python

import json
import gspread
from oauth2client.service_account import ServiceAccountCredentials


def register(record: Dict[str, str]):
  scope = [
              'https://spreadsheets.google.com/feeds',
              'https://www.googleapis.com/auth/drive'
          ]
  credentials = ServiceAccountCredentials.from_json_keyfile_name('himitsu.json', scope)
  gc = gspread.authorize(credentials)
  
  workbook = gc.open_by_key('作成したspread sheetのkey')
  sheet = workbook.sheet1

  sheet.insert_row(list(record.values()))
```

## テキストへのリアクション付与
保存できたこととかがわかったほうが良いと思ったので、一番最新の投稿にリアクションするようにしました。

`discord.Message`の`add_reaction(emoji)`を用いて実装。また、一番最近の投稿を取得するためには`discord.TextChannel`の`history(*)`を用いた。

```python
import discord

class Clinet(discord.Client)
  def success_reaction(self, member, is_end=False)
    channel = self.get_channel('discordのテキストチャンネルのid')
    async for msg in channel.history(limit=10):
        if msg.author == member:
            await msg.add_reaction("👍") if is_end else await msg.add_reaction("👀")
            break
```

# 感想
次は、出勤情報のサマリーを出す機能を作ってみよう。

# 参考サイト
* https://tanuhack.com/operate-spreadsheet/
* https://discordpy.readthedocs.io/ja/latest/
go修行13日目 Package

## Package

- 1階層

```
awesomeProject/
├── main.go
└── mylib
    └── math.go
```

### main.go

```golang

package main

import (
	"awesomeProject/mylib"
	"fmt"
)

func main() {
	s := []int{1, 2, 3, 4, 5}
	fmt.Println(mylib.Average(s))
}
```

### math.go

```golang
package mylib

func Average(s []int) int {
	total := 0
	for _, i := range s {
		total += i
	}
	return int(total / len(s))
}
```

### 結果

```
3
```

- 2階層

### 階層

```
awesomeProject/
├── main.go
└── mylib
    ├── human.go
    ├── math.go
    └── under
        └── sub.go
```

### main.go

```golang
package main

import (
	"awesomeProject/mylib"
	"awesomeProject/mylib/under"
	"fmt"
)

func main() {
	s := []int{1, 2, 3, 4, 5}
	fmt.Println(mylib.Average(s))

	mylib.Say()
	under.Hello()
}
```

### math.go

```golang
package mylib

func Average(s []int) int {
	total := 0
	for _, i := range s {
		total += i
	}
	return int(total / len(s))
}
```

### human.go

```golang

package mylib

import "fmt"

func Say() {
	fmt.Println("Human!")
}
```

### sub.go

```golang

package under

import "fmt"

func Hello() {
	fmt.Println("Hello!")
}
```

### 出力

```
3
Human!
Hello!
```

## Public,Private

- 外部から利用する場合には`Public`のように頭は大文字

### main.go

```golang
package main

import (
	"awesomeProject/mylib"
	"awesomeProject/mylib/under"
	"fmt"
)

func main() {
	s := []int{1, 2, 3, 4, 5}
	fmt.Println(mylib.Average(s))

	mylib.Say()
	under.Hello()
	person := mylib.Person{Name: "Mike", Age: 20}
	fmt.Println(person)

	fmt.Println(mylib.Public)
	fmt.Println(mylib.private)
}

```

### human.go

```golang
package mylib

import "fmt"

var Public string = "Public"
var private string = "private"

type Person struct {
	Name string
	Age  int
}

func Say() {
	fmt.Println("Human!")
}
```

### 出力

- `private`は頭が小文字でunexpotedと出ている

```
.\main.go:19:14: cannot refer to unexported name mylib.private
.\main.go:19:14: undefined: mylib.private
```
新しい開発様式

[2020年、（3歳1歳と）私のリモートワーク](https://qiita.com/e99h2121/items/c8878d027603745a6426)
[在宅育児（と勤務）を支える技術](https://qiita.com/e99h2121/items/475045cabd005a7add57)
[子連れで在宅育児（と在宅勤務）を開始して１か月が経ちました](https://qiita.com/e99h2121/items/cb7471fd833b086b7233)
[緊急事態宣言が解除されてリモートワークはどうなるのか](https://qiita.com/e99h2121/items/086822c3f74ebca75364)

の続編、6月の開発期間を終了しての振り返りです。


## 振り返るにあたって

[子連れで在宅育児（と在宅勤務）を開始して１か月が経ちました](https://qiita.com/e99h2121/items/cb7471fd833b086b7233)
[緊急事態宣言が解除されてリモートワークはどうなるのか](https://qiita.com/e99h2121/items/086822c3f74ebca75364)
でも書きましたが、開発チームでは1か月毎に振り返りを行い、

- 失敗
- 問題、改善点
- そして成功、良かった点

を皆で前向きに発表して次に生かすということを行っています。


## 成功

今月、私のアウトプットは以下でした。

- [Log4j 1.2.12 のadditivity, ConsoleAppender](https://qiita.com/e99h2121/items/d92b84e43678cbcdf874) に係る修正
- バッチジョブ基盤、環境整備周りの機能修正 を出荷
- 他、緊急度の高い不具合の修正準備
- [ハングの原因になる箇所を修正準備](https://qiita.com/e99h2121/items/88d5579a8ce670061468)

その他: 

- [WindowsローカルのAWS SDKでJavaプログラムを動かす](https://qiita.com/e99h2121/items/7b153c12f61470ffdf48)
- そのほかバッチジョブ基盤修正検討



## 失敗

失敗というか、改善すべき点を考えてみました。

今月も、１度だけオフィスに忘れ物を取りに出社した日を除き、完全在宅勤務を継続。
現在の社会的な状況を考えるとこれがいわゆる「新しい日常」として定着する見込みです。つまり今月感じる不都合はその場しのぎで「来月はどうにかなるといいね」と楽観的にとらえるより、むしろ継続的に解決策を考えたほうが良い、と思っています。

いまのままで良くないと思うのは、以下の人とのかかわりだと思っています。


**1. チーム以外の人との雑談チャネル**
**2. チームの中で、まだ仕事し始めて日が浅い人との雑談チャネル**


## 改善したい点

### 用語集

会話のベースとなるものを作りたいなと！
世代間ギャップ、チーム間のちょっとしたギャップも埋めたい。もともとチームのWikiにあったものがいつの間にか古くなっているので、改めてまとめたい。

開発の中で 略語/独自語/一般的な意味とは違う特別の意味で使われている語 を中心に、知りたい語をあればRowを追加 → 誰かが埋めたり埋めて貰ったりとする編集自由形式のもの

### Qiitaの会 

Qiita書きを好む人々の集まりを、継続。

### 読書会

いつの間にか無くなっていた気がするので、チーム横断的に老若男女、やりたい人を募って輪読会など。本を探したい。


## まとめ

[先月の暗中模索感](https://qiita.com/e99h2121/items/086822c3f74ebca75364)から比べると、保育園も再開し、いくらか集中できるようになりました。生活ペースを整えつつ7月も頑張ります。
【PowerApps】一定時間経過で自動的にページ遷移する方法

#・はじめに#
今回紹介するのは、タイマーを利用して「一定時間経過したら自動的にページ遷移する方法」です。
「一定時間同じ画面を表示したままの場合、TOPの画面に戻る」などの場合に有効です。

イメージとしてはこんな感じ。
![自動的にページ遷移.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/430f0246-13e7-e4f3-21e5-48ea39695161.gif)
ちょっとしたアイデアとして参考にして頂ければと思います。

**　※本記事は、はてなブログに移行しました。
　記事は最新化して情報も追加しています。よろしければそちらをご覧ください。**

　[くらっちのクラウド日記](https://kurattyodiary.hatenablog.com/entry/AutoSendPage)
ActiveRecordを使うときは頭にSQLを描こう

みなさん、ActiveRecordを使う時に頭にSQLが浮かんでいますか？

ActiveRecordはとても便利でSQLを意識することなくDBにアクセスしてデータを取得したり、更新したりすることができます。
そのためついつい実装時にSQLを意識せずに書いてしまうことがあります。

実装時はActiveRecordを使うことで素のSQLを意識しなくてもよいのですが、最終的に実行する時にはSQLが実行されています。
そのため実際に発行されるSQLをみると、こんなSQL発行されるのと驚くことがあります。

SQLを思い浮かべながら書いていたら回避できる実装例をいくつか挙げてみます。

# 無駄なテーブルをJOINしている

下記のようなモデルがあったとします。

```ruby
def User < ApplicationRecord
  has_many :user_organizations
end

def UserOrganization < ApplicationRecord
  belongs_to :user
  belongs_to :organization
end

def Organization < ApplicationRecord
  has_many :user_organizations
end
```

『organization_idで絞り込んだuserモデルを取得してください。』と言われた時にどのように実装しますか？

```ruby
target_organization_id = 1
users = User.join(user_organizations: :organization)
  .where(user_organizations: { organization: { id: target_organization_id }})
```

この実装は指定された通りに正しく動作します。発行されるSQLは下記の通り

```SQL
SELECT `users`.*
FROM `users`
  INNER JOIN `user_organizations` ON `user_organizations`.`user_id` = `users`.`id`
  INNER JOIN `organizations` ON `organizations`.`id` = `user_organizations`.`organization_id`
WHERE `organization`.`id` = 1
```

このSQLをみてどう思いますか？
よく考えるとorganizationsテーブルをJOINしなくてもできることに気づくと思います。
改善後のSQLは下記の通り。

```SQL
SELECT `users`.*
FROM `users`
  INNER JOIN `user_organizations` ON `user_organizations`.`user_id` = `users`.`id`
WHERE `user_organizations`.`organization_id` = 1
```

これを実現するActiveRecordは下記の通り。

```ruby
target_organization_id = 1
users = User.join(:user_organizations)
  .where(user_organizations: { organization_id: target_organization_id })
```

ActiveRecordのモデル中心に実装を考えると、最初の実装のようについ指定されたidがあるモデルまでJOINしてしまいがちです。
実際にコードレビューをしていてもこのような実装はよく見かけます。
SQLはJOINが少なければ少ないほどパフォーマンスはよくなるので、できる限りJOINが少なくて済むように意識してActiveRecordを実装するようにしましょう。

# eager_loadのLEFT OUTER JOIN 

先ほどと同様に『organization_idで絞り込んだuserモデルを取得してください。』に加えて、後に`user.exam_organization`を使いたいのでキャッシュしておきたい場合、どのように実装しますか？

先ほどの実装のままだと、exam_organizationsがキャッシュされていないのでexam_organizationを取得するたびにSQLが発行されてしまい、N+1になってしまいます。
そこで下記のようにjoinsをeager_load(またはincludes)に変更することでキャッシュされるようになります。

```ruby
target_organization_id = 1
users = User.eager_load(:user_organizations)
  .where(user_organizations: { organization_id: target_organization_id })
```

これで無事キャッシュされるようになるのですが、発行されるSQLをみてみるとINNER JOINがLEFT OUTER JOINに変わってしまっていることに気づきます。

```SQL
SELECT `users`.id AS t0_r0, ...(全カラム列挙される。長いので省略)
FROM `users`
  LEFT OUTER JOIN `user_organizations` ON `user_organizations`.`user_id` = `users`.`id`
WHERE `user_organizations`.`organization_id` = 1
```

SQLを考えずにRailsを書いている場合、INNER JOINで良いところが今回の例のようにLEFT OUTER JOINになっていても気にしないことが多い気がします。
ただSQLが頭に浮かんでいると、必ずデータがある結合なのにLEFT OUTER JOINを選ぶことはあり得ないので違和感しかないです。
このような場合は下記のようにjoinsも追記することでINNER JOINで結合しつつデータをキャッシュすることができます。

```ruby
target_organization_id = 1
users = User.eager_load(:user_organizations).joins(:user_organizations)
  .where(user_organizations: { organization_id: target_organization_id })
```

# 最後に
いくつか例を上げてみましたが、どちらもSQLを頭に浮かべながら書いていたら簡単に避けれるようなものばかりです。
多少非効率なことをしていても大抵の場合は問題なく動くので気づかないことが多いですが、積み重ねでパフォーマンスに差が出たりするので、これまでActiveRecordを使う時にSQLを意識してこなかった方も発行されるSQLを意識してみると良いと思います。
【備忘】Google Colaboratoryでカスタムモジュールをインポート

## 手順
**1. Google Driveをマウント**

```python
from google.colab import drive
drive.mount('/content/drive')
```

**2. sys.pathl.append()でパスを通してインポート**

例として次のようなファイル構成だったとします。

- My Drive
    - colab Notebooks
        - module
            - utils.py
            - my_modules.py

※：「MY Drive」がGoogle Driveのルートディレクトリ

このファイル構成でカスタムモジュールをimportするには次のように`sys.path.append()`でモジュールの親ディレクトリまでのパスをシステムに伝える必要があります。

```python
import sys
ROOT_PATH = 'drive/My Drive/ colab Notebooks/module/'
sys.path.append(ROOT_PATH)

import utils
import my_modules
```

これで`ModuleNotFoundError: No module named 'utils'`のようなエラーが出なければOK。


## モジュールの変更を反映する

Google Drive を再度マウントする必要がある。 Google Colaboratory のメニュータブから「Factory reset runtime」を選択し、ランタイムをリセットする。 そしていつものようにマウントするためのコードを実行すれば良い。

```python
from google.colab import drive
drive.mount('/content/drive')
```

認証コードを入力してマウントが完了すれば、変更が反映されているはずです。



以上
Apache2 で Basic認証

Apache2.4 でBasic 認証をする方法です。
.htacess を使う方法です。

http://hostname/tmp/test にBasic 認証をかけるとすると、
サーバーの Root が /var/www であると、

```text:/var/www/tmp/test/.htaccess
AuthUserFile /var/www/tmp/test/.htpasswd
AuthName "Basic Auth"
AuthType Basic
Require valid-user
```

パスワードの作成　ユーザーは scott

```bash
htpasswd -c .htpasswd scott
```

ブラウザーで、http://tmp/test にアクセスすると、 

![basic_jun29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f6965e07-429a-0b40-e2cf-5a1afc7529b2.png)

.htacess を使わない時は、Apache2 の設定ファイルで

```text
<Directory "/var/www/tmp/test">
	AuthUserFile /etc/apache2/.htpasswd
	AuthName "Basic Auth"
	AuthType Basic
	Require valid-user
</Directory>
```
知らなかった！クルなGithub機能

#GitHubと親しくなりたい！:two_women_holding_hands:
まだ、GitHubの機能を10%も生かしてないと最近感じていました。GitHubの知らない機能を少しづつ学んで行きたいと思いました。今日整理する内容は[ Zach Holman ](https://zachholman.com/about)(2012年当時はGitHubで働いていました)が説明するGitHubとgitの隠した機能の説明の映像とGitHubの公式blogを参考致しました。彼に関してもっと知りたい方は下記の参考リンクに個人ブログアドレスがありますのでご参考ください(興味深い開発者なので）。映像が古いなので、もし修正事項やもっとクルな機能があればコメントに残してください。

参考先：
- [ Aloha Ruby Conference 2012 (by Zach Holman)](https://amara.org/en/videos/7ryCRiFnAAzK/info/aloha-ruby-conference-2012-git-and-github-secrets-by-zach-holman/)![filefinder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/aa8ceb26-a433-6b63-d8ee-0842a68ca979.png)
- [ GitHub Blog ](https://github.blog/)


##Ignore Whitespace

任意の diff URL に `?w=1` を追加すると、変更内容はスペース。だけで削除され、変更されたコードだけが表示されます。
<img width="618" alt="IgnoreWhiteSpace.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/7738aef5-8a65-bbaf-514b-151617e25f5a.png">
最近は新`Diff settings`ボタンを使用して、表示内容を自動的に変更することができます。
![IgnoreWhiteSpace2 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/85b89924-08c4-1d09-ffe0-668a26c9e8be.png)


##Adjust Tab Space
GitHubのデフォルトのタブサイズは8スペースです。diff またはファイル URL に `?ts=4` を追加すると、タブ文字はデフォルトの 8ではなく4スペース幅で表示されます。`=`文字の後には４だけでなく、ご希望に合わせて調整できます。あるいは、Chromeの拡張機能により、独自のプリファレンスを設定できます。 タブサイズ設定は、ログインしているすべてのChromeブラウザで同期されます。

![customTabSize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/63200a8a-147a-7743-a052-ed94b932d4e1.png)

download先：[ chrome web store ](https://chrome.google.com/webstore/detail/github-custom-tab-size/jcjfkmdkcaopkioccnpbhiemfcmpnghe)

##file finder 
任意のリポジトリで`t`を押してアクセスし、検索するファイル名を入力したらファイルを簡単に探すことができます。

![filefinder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/43eec25b-4403-5828-7443-bb0e9d172af0.png)

Octooreeと呼ばれるこのブラウザの拡張子もディレクトリのナビゲートや、おなじみのツリーのような構造でファイルを開くのに役立ちます。
![Screen Shot 2020-06-28 at 18.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/c18ce4ca-af52-1543-67f8-821814ad3137.png)

download先：[ octotree ](https://www.octotree.io/)

##A numbers game
リポジトリのメタデータを分析してメトリックを引き出すことは、時には便利です。`git shortlog -sn`でコマンドラインからコミットカウントで作成者のリストを順番に生成できます。
また、`git shortlog -sn --no-merges`でマージコミットを除外することもできます。

もしそれがパブリックリポジトリなら、GitHub High Scoresはリポジトリの貢献者を昔のアーケードのような画面で見ることができます。
![Screen Shot 2020-06-28 at 18.58.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/16b01b1a-30b9-76b9-845b-1b39f7e31a30.png)

##How to Summarize
バグの解決には長いエラー ログや詳細なプログラム出力を追加することが役立ちますが、縦方向のスペースがページを占める場合は、`<details>` タグと `<summary>` タグの使用を検討してください。

```
<details>
 <summary>Summary Content</summary>
 ...this is hidden, collapsable content...
</details>
```
![Screen Shot 2020-06-28 at 19.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/aa711c97-e314-142a-783f-f5c7a91b7b6a.png)
Library :vs: Framework

#LibraryとFrameworkの違い
FrameworkとLibraryの正確な違いについて聞かれたとき、説明ができませんでした。
説明を探していたところ、簡略でIT初心者の目線で説明した映像があるので、共有しようと思います。 映像のデフォルト字幕は韓国語ですが、英語で説明しているので機会があれば参考にしてください。 もちろん映像の内容を整理した記事を見てもいいでしょう。

:tv: 映像のurl
<https://www.youtube.com/watch?v=t9ccIykXTCM&t=43s>

#両方とも他の誰かが使ったコード

LibraryとFrameworkは両方とも他の誰かが使ったコードですが、必要に応じ、プロジェクトに適切に適用します。
どちらも外部のものでプロジェクトを迅速に完成させるために使用します。

#基本的な違い:コントロール権限は誰に？
結論的に言えば、誰が誰をコントロールするのか？という観点で違いがあります。

つまり、__コードのコントロール権限と決定権限が「私に」あるのか__:vs: __誰かが決めた規則に従ってコーディングをしているのか__が両方の明確な差です。

###:point_up: コントロール権限は**「私に」**ある → Library 
__例) jQuery__
jQueryはウェブサイトにインタラクティブな要素を挿入できるようにします。 もし**「私が」**ウェブサイト制作のためのコーディングをしている時、必要なときに**「私が」**jQueryを呼び出します。Libraryは簡単に代替できます。 ご希望の場合、jQueryを他のLibraryに変更可能であり、このような変更がプロジェクトを破壊したりはしません。 Libraryは、単に時間の節約のため、あるいは効率性のために呼ぶことです。

###:v: コントロール権限は「**私に」**無い → Framework
__例) django__
一方、Frameworkはプログラマーが呼び出すものではありません。 Frameworkがプログラマーを呼ぶものです。
Frameworkで仕事をする時は、Frameworkのルールに従わなければなりません。 **「私は」**コードのルールを決める立場ではありません。 Frameworkが私がどうすればいいのか教えてくれます。 つまり、Frameworkがどこにテンプレートを入れるか、コントローラを入れるか、ビューを入れるかなどのルールを知らせてくれます。 規則に従って作業すれば正常に作動します。 ここで私がコントロールする部分はありません。 ただ規則に従うだけです。django Frameworkは規則が本当に多いです。 円滑な作動のためなら、すべてのルールを遵守しなければなりません。 例えば、djangoでアドミンパネルを作りたい場合は、無条件コードをadmin.pyに作成する必要があります。 もしURLを変えたいならファイル名url.pyに行かなければなりません。 djangoが始める時、admin.pyとurl.pyを読むからです。 **「私は」**これを変更することはできません。 これはdjangoが持っているルールだからです。 このようなルールを守ってこそ、ウェブサイトのアドミンパネルとURLが作動するようになります。 このように**「私は」**djangoを呼び出していません。 django文書を参照しながら書かれた規則に従ってコードを定義すれば、djangoがうまく定義された作業を実行するだけです。

####:bangbang:簡単に要約すると
> Frameworkは**「私を」**呼ぶこと。 そして、必ず従わなければならない規則がついてくる。
Libraryとは、**「私が」**呼び出したいときに呼ぶもの。

#議論の争点になっている → ReactJS
ReactJS公式ウェブサイトでは、ReactJSがLibrary と定義されています。
![Screen Shot 2020-06-28 at 1.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/6bb876ed-504e-8985-cc83-ddacfbe20346.png)
アプリケーションのUIをビルドする時、リアクトを呼び出すので、この場合には**「私が」**リアクトを呼ぶのです。 また、リアクトをルール（フォルダ構造、コンポーネント名など）がついてきません。しかし、**「リアクトが」**プログラマーのコンポーネントを呼び出すことはします。この場合、**「リアクトが"」コンポーネントを歌っていて、ルールを知らせるのでリアクトをFrameworkとも見ることができます(Vue.jsも該当)。
現時点までも論争になっている争点です。
Open Source使用時の注意点:no_entry_sign:

#Open Source Licenseとは？
プロジェクトによってよくOpen Sourceを利用して開発します。 Open Sourceは無料で使用(明確に話しますと無料では無いんですが)でき開発に便利であるというメリットがありますが、当該Open Sourceがどのようなライセンスを持つかによって、商業的な利用が制限や作成したコードを公開する義務が生じます。 ですから、使用するOpen SourceのLicenseについてよく検討し、使用するかどうかを決めなければなりません。私は本当に簡単な部分だけ整理しているので詳しい内容はオープンソースソフトウェアの使用を奨励するために作られた団体公式ウェブサイト、[Open Source Initiative](https://opensource.org/)を参考お願い致します。

#良く使える Open Source License
<font color="LightSeaGreen">- Less Common</font>
<font color="LightCoral">- Most Common</font>

|Open Source Licenseの種類 | 参考URL |
|:----------|:----------:|----------:|
| <font color="LightCoral">Apache License 2.0</font> | https://www.apache.org/licenses/LICENSE-2.0|
| BSD 3 - Clause "New" or "Revised" license | https://choosealicense.com/licenses/bsd-3-clause/ |
| BSD 2 - Clause "simplified" or "FreeBSD" license | https://opensource.org/licenses/BSD-2-Clause | 
| <font color="LightCoral">GNU General Public License (GPL)</font> | https://www.gnu.org/licenses/gpl-3.0.html |
| <font color="LightSeaGreen">GNU Library of "Lesser" General Public License (LGPL)</font>| https://www.gnu.org/licenses/lgpl-3.0.html | 
| <font color="LightCoral">MIT License</font> | https://opensource.org/licenses/MIT |
| Mozila Public License 2.0 | https://www.mozilla.org/en-US/MPL/2.0/ | 
| Common Development and Distribution License | https://opensource.org/licenses/CDDL-1.0 |
| <font color="LightSeaGreen">Eclipse public License</font> | https://www.eclipse.org/legal/epl-2.0/ |

##GNU General Public License(GPL)
GPLが適用されたSWを利用して改良されたSWを開発した場合、開発したSWのソースコードも公開しなければなりません。
![gpl.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/a6e6286a-8a71-121d-f0e7-86fb84895703.jpeg)


##Apache License 2.0
ソースコード公開は不要です。 ただし、再配布する場合は、Apache License 2.0コピーの提供、Apacheにより開発されたことに対する著作権表示、保証責任がないなどの表示を義務づけます。
![apache.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/9680db48-7c08-610a-d299-32b47e8070ba.png)


##MIT License
MIT Licenseに従うソフトウェアを改造した製品を必ずオープンソースで配布しなければならないという規定はなく、GNL一般公衆Licenseの厳しさを避けたいユーザに人気があります。
![MIT-License.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/a2c190d9-1b6f-6bd0-0a0c-296964a90366.png)
2020にはフォローしなければならないコーディングブログ

普通、知らない知識があればQiita、Stack Overflow、Githubなどを参考にする方です。 また、より詳しい技術の知識が必要であればGoogleなどの有名なIT企業の技術ブログを参考にしたり、UdemyもしくはCourseraの受講をしますが、海外では主にどんなサイトを参考にするのか気になりました。上位グループ順位のサイトの中から私の好みを基準として5つだけ選んで簡単な説明をまとめ見ました。
参考先：https://blog.feedspot.com/programming_blogs/

#:desktop: [FreeCodeCamp](https://www.freecodecamp.org/)
2014年にQuincy Larsonによって設立された`FreeCodeCamp`は非営利団体である。 `FreeCodeCamp`は現在、プログラミングとウェブ開発に関する知識に磨きをかけるのに最適なフリーコーディングプラットフォームの一つです。

#:desktop: [Khan Academy](https://www.khanacademy.org/)
初心者コーダが学習目的で言及している、広く使われているサイトの一つです。
この分野最大のプラットフォームでもあります。 若いプログラマがコーディング目標を達成するのに役立つ練習練習や指導ビデオをたくさん用意しています。

#:desktop: [Geeks for Geeks](https://www.geeksforgeeks.org/)
これは巨大な技術組織のインタビューを断ち切ろうとしているプログラミングソフトウェアエンジニアに憧れるオンラインジャーナルです。 このサイトの主な目的は、ミーティングで通常質問されるプログラミング/アルゴリズムに関する問い合わせに回答することです。 これはクライアントから投稿されたブログで、アマチュア開発者が自分のミーティングの出会いを投稿します。

#:desktop: [Daivid Walsh](https://davidwalsh.name/)
David WalshはMozilaの首席ウェブエンジニアで、MoTools Javascript Frameworkのセンターデザイナーです。
主にCSS、jQuery、JavaScript、PHP、MySQL関連の記事だけでなく、その他にも数多くの知識に関するすばらしい記事も発見できます。 DavidのオンラインジャーナルはHTML/5、JS、CSSに彼の好みを反映しており、彼の多量の相談と知識はフロントエンドの開発を進化させるほど影響力が大きいです。 特に、オープンソースへの貢献と実験改善などに対する彼の絶え間ない努力のおかげで、オンラインジャーナルは多くの人々に信頼され、尊敬されています。

#:desktop: [Code Better](http://codebetter.com/)
このblogは名前の意味の通りに運用しています。多くのコード事例と革新的な技術を最も早く発見できるブログだと思います。 効率性を重視する代表的なブログです。 CodeBetter ブログは開発者にソフトウェア開発におけるより良いツール、方法論及び慣行を紹介する一つの主要目標を持っています。 このブログは、無分別な情報投稿を行いません。 実際に関連性のある技術的なコンテンツに焦点を当てています。 他のブログとの差別点は作動しないことについて書くことを避け、それを批判するのに時間を浪費しないという点です。 彼らは何が効率的なのか、あるいは時間を投資する価値があるのかを判断することに焦点を当てます。 このブログでは純粋に個人的な経験と知識を基に文を載せるため、情報面で確実に信頼されることができます。 特にマイクロソフト技術に集中する開発者に広く知られています。
vistaでquartus その11

#概要

vistaでquartusやってみた。
serialに、fifoとoneshotを導入してみた。

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#iverilog実行結果

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/68a9591e-9ea6-5cc7-38aa-5ee140ae886a.png)


#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dd5280c1-b15c-7aca-c561-ed15e517b6e8.png)


#サンプルコード


```

`timescale 1ns / 1ps


module fifo(input clk, input rst, input put, input get, input [7:0] data, output reg [7:0] out, output empty, output reg start);
	reg [7:0] mem[32:0];
	reg [4:0] rd_pos;
	reg [4:0] wr_pos;
	assign empty = ((wr_pos - rd_pos) == 0) ? 1'b1 : 1'b0;
	assign full = ((wr_pos - rd_pos) == 32) ? 1'b1 : 1'b0;
	always @(posedge clk or negedge rst)
	begin
		if (!rst)
		begin
			wr_pos <= 0;
			rd_pos <= 0;
			start <= 0;
		end
		else
		begin
			if (put & full == 1'b0)
			begin
				mem[wr_pos] <= data;
				wr_pos <= wr_pos + 1;
			end
			if (get & empty == 1'b0)
			begin
				out <= mem[rd_pos];
				rd_pos <= rd_pos + 1;
				start <= 1;
			end
			else
			begin
				start <= 0;
			end
		end
	end
endmodule

module oneshot(input clk, input rst, input in, output reg out);
	reg prev = 0;
	always @(posedge clk)
	begin
		if (in ^ prev)
			out <= in;
		else
			out <= 0;
		prev <= in;
	end
endmodule

module test2(input clk, input rst, output tx);
	localparam NEXT = 4'b0000;
	localparam DONE = 4'b1111;
	wire [7:0] out;
	reg [3:0] n = 0;
	reg [7:0] char;
	reg [3:0] state = NEXT;
	reg put = 0;
	tx2 tx2(.clk(clk), .rst(rst), .start(start), .data(out), .tx(tx), .busy(busy), .get(get));
	oneshot one0(.clk(clk), .rst(rst), .in(get), .out(get2));
	fifo fifo0(.clk(clk), .rst(rst), .put(put), .get(get2), .data(char), .out(out), .empty(empty), .start(start));
	always @(posedge clk or negedge rst)
	begin
		if (!rst)
		begin
			state <= NEXT;
			n <= 0;
		end
		else if (put)
		begin
			put <= 0;
		end
		else if (state == NEXT)
		begin
			state <= 1;
		end
		else if (state != DONE)
		begin
			if (n == 10)
			begin
				state <= DONE;
			end
			else
			begin
				char <= 48 + n;
				put <= 1;
				n <= n + 1;
			end
		end
	end
endmodule

module test;
	reg clk,
		rst;
	test2 u(.clk(clk), .rst(rst), .tx(tx));
	initial
	begin
		clk = 0;
		rst = 1;
		#1
			rst = 0;
		#1
			rst = 1;
		#10000
			$finish;
	end
	always
	begin
		#1
			clk = ~clk;
	end
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, u);
	end
endmodule




```


以上。
[Web開発] よく使う正規表現まとめ

# はじめに

簡単にコーピして使える、よく使う正規表現（個人的）を紹介致します。



## 英文字（小文字）、数字、 "-"、 "_" のみに構成され、長さは「2～10」

``` 
/^[a-z0-9_-]{2,10}$/ 
```

##  英文字（大文字小文字）と数字のみに構成

``` 
/[a-zA-Z0-9]/
```

##  UUID

``` 
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/
```

##  ASCIIコード

``` 
/[ -~]/
```

##  MACアドレス

``` 
/^[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}$/
```

##  IPアドレス(IPv4)

``` 
/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/
```

##  IPアドレス(IPv6)

``` 
/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/
```

##  e-mail(基本)

``` 
/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
```

##  e-mail(RFC5322)

``` 
/\b[\w.!#$%&’*+\/=?^`{|}~-]+@[\w-]+(?:\.[\w-]+)*\b/
```

##  e-mail(精密)

``` 
/(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/
```

##  パスワード(最小8文字以上、英文字（大文字小文字）、数字、特集文字, 各最小１つ以上)

``` 
 /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$/
```

##  URL（プロトコル含）

``` 
 /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#()?&//=]*)/ 
```

##  URL（プロトコルオプション）

``` 
 /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/ 
```

##  HTMLタグ

``` 
 /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
```
``` 
 /<\/?[\w\s]*>|<.+[\W]>/ 
```
``` 
 /<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)/
```

##  ハイパーリンク

``` 
 /(?!<a\sname=\"([\w\s\d\-\.\#]+)\"><\/a>)<a\sname=\"([\w\s\d\-\.\#]+)\">(.*?)<\/a>/
```

##  数字のみ

``` 
/^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/
```

##  Webサイトハイパーリンク

``` 
/<a\s+(?:[^>]*)href=\"((?:https:\/\/|http:\/\/)(?:.*?))">(?:.*?)<\/a>/
```

##  数字と英文字（大文字小文字）のみ（空白文字なし）

``` 
/^[a-zA-Z0-9]*$/
```

##  数字と英文字（大文字小文字）のみ（空白文字あり）

``` 
/^[a-zA-Z0-9 ]*$/
```

##  英文字（大文字小文字）のみ

``` 
/[a-zA-Z]/
```

##  年月日（yyyy-mm-dd）

``` 
/^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/
```


# 備考

* 正規表現式をし、他の人が作成した正規表現式をテスト出来るサービス（http://gskinner.com/RegExr/ ）

* 正規表現式を可視化出来るサービス（http://www.regexper.com/）
初めて社内勉強会（LT）に参加してみて思った事

先日、社内で勉強会が開催されました。よくIT企業で聞く「LT」ってやつですね。
個人的には働いて初めての経験。それまで「LT」とは聞いていたけれど「LT」ってなんやねんと。


### LTとは
>LTとはLightning Talks（ライトニングトーク）の略です。 "Lightning"は英語で"稲妻"という意味。 ... "稲妻トーク"の名の通り、LTはいわば「短いプレゼンテーション」のことです。 勉強会やイベント、カンファレンスなどで行われる5分程度の短いプレゼンテーションなんかは、LTです

そんな重くない勉強会って感じやな。
テーマも自由で、普段勉強している事とか業務知識とか自分たちが喋りたいことを喋ってOKの感じ。
今回は初回ということもあってライトな感じで、業務後にお酒を飲みつつ、好きな食べ物を摘みつつ参加自由で開催されました。社内LTの企画者は弊社のサーバーサイドエンジニア（@yuta-ron）です。＼ありがとう／

## 社内LTで実際に話したテーマとか

LTって実際に何を話せば良いんやと。
今回の社内LTでは登壇者は8人でやって、以下のようなテーマでやりました。


- [skyticket観光ガイドにWeb Storiesを実装しました](https://qiita.com/f-umebara/items/f32673ac7ea17270dc07)（フロントエンジニア兼デザイナー　@f-umebara
- ブラックハットSEOについて @adv-r-terazawa
- DDD x Laravel（サーバーサイドエンジニア　@yuta-ron
- Git Merge完全に理解した（サーバーサイドエンジニア　@わし
- Nuxt.jsを使用したYoutube埋め込み方法 （フロントエンジニア
- 自宅警備員環境改[Open VPNの話] @y-nakazawa-adven
- 簡易的なDoS攻撃やってみた（インフラエンジニア　@j_matsumoto
- 社内事情[こちらは社外秘のためタイトル非公開]（サーバーサイドエンジニアマネージャー）　@sakamonture

サーバー側からもフロント側からも両方参加していたのでバランス的にも結構良い感じ。
技術的な話もちらほらありつつですが、結構ライトな感じで行いました。
展開した資料は各自のQiitaで公開されると思う、、、よ多分

自分が話した内容は「Git Merge完全に理解した」というテーマで行いました。
弊社では開発にGitHubを使用していますが、GitHubではプルリクを出したときにMergeボタンを押します。そのボタンには実は3種類のmergeがあって「用途によってこう使い分けると良いやでー」って事を簡易的な資料で展開しました。

### 「社内勉強会の意義とは」　そもそもなんで社内で勉強会する必要あるの？

- モチベーションアップ
- コミニュケーション（あんまり喋ったことのない人同士での意見交換とか
- 単純な知識アップ

個人的にはこの3つかなと。
特にモチベアップとか、知識レベルのアップは結構重要。1人で勉強していても良いんですが、だんだん1人相撲をやっているみたいで、あんまり個人的にはモチベが上がりません。知識レベルのアップも同様に、僕はサーバーサイドエンジニアとして働いていますが、最近のフロント事象とか触りくらいしか知らず、その中でフロントエンジニアのモダンな知識を現役で使っている人から、ちゃんと知識を共有されるのは貴重だと思っています。

コミュニケーションも然り、プロジェクト的に全く関わらない人も結構社内にいるので、そういう人たちと意見交換だったり、話せたりするのは非常にメリット。今後仕事で関わるときにも楽だと思いました。 昨今、コロナ事情があるのでリモートワークなどで社内に人がいないといった会社も多いですが、そんな中だからこそこういった取り組みが良いのかなと。

### 今後はどうしていくべきなのか

今回は初回ということもあり、社内の人だけで結構ライトな感じで行いましたが、外部の人にも参加してもらおうとか、Youtubeで配信とか、どんどん外部の人に公開していこうという流れになっています。

社内に知識を留めておくのは非常に勿体ないと感じる派なので、積極的に展開していく方が会社のエンジニア事情も分かると思いますし、無駄に広報サイトを使うよりよっぽど宣伝になるんじゃないかと。（実際にQiitaのランキングに載っている会社とか、広報サイトではあんまりみたことないけど、Qiitaで知ったとかもあるし）

「LTやるぞ」となるとネタを探すために勉強したり、単純にアウトプットを意識した思考や資料なども考える必要があるので、そこらへんも勉強になる。昨今ではコロナ事情もあるので、社内でやるには難しいかもしれませんが、Zoomを使用したりで「リモートLT」とか是非やってみたい。リモートLTなら人前で話すの苦手ーっていう人でもライトに参加出来るのかなと。

#### 社内勉強会を続けていくために

真面目すぎると個人的には続かない印象がありました。やっぱりお酒飲みながら、好きなご飯を食べながら、開催する側も参加する側も楽しくメリットがないと続かないだろうと。ここら辺はもうちょい模索ですね。積極的に勉強をやっている会社さんの意見も是非聞いてみたい。次回の開催は7月予定！！
[Web開発] Web開発する際に、有用なサービス

# はじめに

今から紹介をするサービスは個人的にWeb開発する際に、有用だと思ったサービスです。



## codepen

フロントエンドコードを構築、テスト、および検出するのに最適なサービスです。
CodePenは、フロントエンドデザイナーと開発者のためのソーシャル開発環境です。 
Web サイトの構築と導入、作業の成果の誇示、学習とデバッグのためのテスト ケースの構築、インスピレーションの獲得が出来ます。

https://codepen.io/

## devdocs

開発する際に、HTMLやJavascript等する際に、気になるメッソド等説明やコードを確認出来ます。

https://devdocs.io/

## remixicon

シンプルなアイコンシステム
Remixアイコンは、デザイナーや開発者向けオープンソースのニュートラルスタイルのシステムシンボルのセットです。
これらのアイコンは、個人用と商業用の両方で無料で利用出来ます。

https://remixicon.com/

## caniuse

caniuseはAlexis Deveriaによって構築され、管理されており、Web開発コミュニティによって時々アップデートが提供されています。 
簡単にHTMLやCSSをブラウザことにサーポタ情報を教えてくれるサービスです。

https://caniuse.com/

## mockaroo

独自の仕様に基づいてランダムに生成された大量のテストデータをすばやく簡単にダウンロードし、SQL または CSV 形式を使用してテスト環境に直接ロード出来ます。

https://www.mockaroo.com/


# 備考

* 特にありません。
Nuxt TypeScript でデコレーターを使わずにミックスインする方法

まず、普通にJavaScriptで書いた場合このようになります。

```~/plugins/mixins.js
export const delayMixin = {
  methods: {
    $delay(ms): Promise {
      return new Promise((resolve) => setTimeout(resolve, ms));
    },
  },
});
```

```Component.vue
<script>
import { delayMixin } from '~/plugins/mixins';

export default {
  mixins: [delayMixin],
  methods: {
    async animate() {
      await this.$delay(100);
      // ...
    },
  }
};
</script>
```

TypeScriptで書いた場合。
Vue.extendにして、Vueの型を拡張するようにします。

```~/plugins/mixins.ts
import Vue from 'vue';
export const delayMixin = Vue.extend({
  methods: {
    $delay(ms: number): Promise<void> {
      return new Promise<void>((resolve) => setTimeout(resolve, ms));
    },
  },
});
```
Vueインスタンスの `this` に
`as InstanceType<typeof Mixinの型>` として型を拡張します。

```Component.vue
<script lang="ts">
import Vue from 'vue';
import { delayMixin } from '~/plugins/mixins';

export default Vue.extend({
  mixins: [delayMixin],
  methods: {
    async animate() {
      await (this as InstanceType<typeof delayMixin>).$delay(100);
      // ...
    },
  }
});
</script>
```

ビルド時に.vueファイルを認識してくれない場合には、以下のようなvue-shims.d.tsを用意して読み込ませます。

```vue-shims.d.ts
declare module '*.vue' {
  import Vue from 'vue';
  export default Vue;
}
```

同じ要領で、Vueの親コンポーネントから子コンポーネントのメソッドを呼び出したいときには、以下のようにすればTypeScriptの型チェックでエラーがでなくなります。

```TheParent.vue
<template>
  <div>
    <TheChild ref="childRef" />
  </div>
</template>

<script lang="ts">
import Vue from 'vue';
import TheChild from '~/components/TheChild.vue';

export default Vue.extend({
  components: {
    TheChild
  },
  methods: {
    foo() {
      (this.$refs.childRef as InstanceType<typeof TheChild>).doChildMethod();
    }
  }
});
</script>

```
C#／WPFで変更前後の差分表示のできる、ファイル名変更ソフトを作った。

# 概要

2020年にもなってファイル名変更ソフトを新しく作りました。名前はFileRenamerDiffです。
この記事では、作った動機とソフトの機能紹介をします。
C#/.NET Core/WPFで作成しました。使用した技術などは[こちらの記事](https://qiita.com/soi/items/aa82eb68577d339dd6af)を参照ください。

![screenshot_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/fdcfa4e3-f1ba-a5c6-702b-2e0c2635f840.png)

# なぜ作ったか
ファイル名変更ソフトを使ったことのあるかたは多いと思います。私自身も今までは別のソフトウェアを使っていました。
ただ、その中でいくつかの不満があり、それに対応したソフトウェアが見つかりませんでした。
具体的には以下のようなものです。

- 変更前後での差分表示：ファイル名が長い場合にどこが変わったかの確認が大変だった
- 重複判定：プレビューで確認してから、ファイル名変更時にファイル名重複で処理が中断するとツライ
- 設定パターン数の制限：削除＆置換パターンの数に制限があると何回も設定を変えて処理する必要がある。
- デザイン：ユーティリティソフトにありがちな灰色ばっかの画面は好きになれない

そこで、これらの不満を解消したソフトを自分で新しく作ることにしました。

# 機能紹介
基本的な使い方は以下のとおりです。

1. ファイル名を変更したいフォルダをドラッグアンドドロップまたはダイアログで指定
1. ファイル名の削除・置換パターンを指定
1. プレビューで変更内容を確認
1. 実際にファイル名を保存 

## 変更前後での差分表示
ファイル名変更前後での差分をGitのDiffっぽく表示しました。ソフト名通りにこれが一番作りたかった機能です。

![screenshot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/9dd09296-5d7e-6c42-fea9-5c99af619161.png)

## 制限数なしの正規表現による削除＆置換パターン
制限数なしで削除＆置換パターンを作れます。正規表現も使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/5822133f-649e-9934-2145-1ddb9a0d50db.png)

## 変更後のファイル名重複判定
プレビュー時点でファイル名の重複を判定して、警告してくれる機能です。
重複があるままだと、保存できません。

![screenshot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/3719e46f-1466-0e79-fe4f-8116ecf36d66.png)

## その他の機能
#### Light/Darkテーマ切り替え
設定でLightテーマ、Darkテーマを切り替えできます。
![screenshot_Dark-Light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/5fc4c9b9-bda9-b6a4-5803-af0f40a4ab7e.png)

#### 任意のファイルをエクスプローラーで開く機能
重複判定時などに、このファイル名だけ手直ししたい、といった時にそのファイルのディレクトリをエクスプローラーで開く機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/7b181650-c51b-2f58-5195-7ea30dc50f00.png)


#### よく使うパターン集
削除・置換でよく使うパターン集です。これはまだ数が少ないので、これから増やしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/47b7101e-a986-70e8-091a-999d4ad14090.png)

#### ファイル・フォルダをリネーム対象にするか選択可能
ファイルだけorフォルダだけリネームしたい時があるので選択できるようにしました。

#### 拡張子での除外判定
iniファイルなど、特定の拡張子をリネーム対象から除外する機能です。

#### 変更あり・重複ありのみ表示
変更のあるファイル名だけ・重複のあるファイル名だけ、に表示をしぼりこむ機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/3dfcd193-7f08-6d95-8b86-3829b0a1939f.png)

#### 多言語対応
英語・日本語・中国語・ロシア語・ドイツ語に対応しています。
基本はDeepLです。
英語と中国語はなんとなく分かるから、ドイツ語とロシア語は知り合いに聞ける人がいるから選びました。

#### Microsoftストアでの公開
一度やってみたかった。思ったよりも簡単でした。この方法などは後日記事にします。

# ダウンロード
ソフトウェアは以下の場所から入手できます。

### Microsoft Store (Windows 10 のみ)

[Microsoft Store](https://www.microsoft.com/store/apps/9PH9DKV5XVDB)

### Portable version (Windows 7以降）

[GitHub RELEASEの最新版からどうぞ](https://github.com/soi013/filerenamerdiff/releases).

- `FileRenamerDiff_app_win-x64~` は x64(64bit) OS用
- `FileRenamerDiff_app_win-x86~` は x86(32bit) OS用

# まとめ
自分が欲しかったソフトを作ってみました。よかったら使ってみてください。
使ってみた感想、バグや機能要望などがあれば、ここのコメント欄やGitHubのIssueに書いてくれると嬉しいです。
シグモイド関数

```C#
private void button_Click(object sender, EventArgs e)
{
    var x = np_arange(-5.0, 5.0, 0.1);
    var y = sigmoid(x);

    var plt = new Chart();
    plt_plot(plt, x, y);
    plt_xlim(plt, -6.0, 6.0);
    plt_ylim(plt, -0.1, 1.1);
    plt_show(plt);
}

private U[] np_arange<T, U>(T start, T end, U step) where T : struct where U : struct
{
    var start_ = Convert.ToDouble(start);
    var end_ = Convert.ToDouble(end);
    var step_ = Convert.ToDouble(step);

    return Enumerable.Range(0, (int)((end_ - start_) / step_ + 1)).Select(x => (U)(dynamic)(start_ + x * step_)).ToArray();
}

private double[] sigmoid<T>(T[] x) where T : struct
{
    return x.Select(n => 1 / (1 + Math.Exp(-Convert.ToDouble(n)))).ToArray();
}

private void plt_plot<T, U>(Chart plt, T[] x, U[] y) where T : struct where U : struct
{
    var x_ = x.Select(n => Convert.ToDouble(n)).ToArray();
    var y_ = y.Select(n => Convert.ToDouble(n)).ToArray();

    plt.Size = new System.Drawing.Size(500, 350);

    plt.ChartAreas.Add("area");
    plt.Legends.Add("legend");
    plt.Series.Add("line");

    plt.ChartAreas["area"].AxisX.MajorGrid.Enabled = false;
    plt.ChartAreas["area"].AxisX.LabelStyle.Format = "0.0";
    plt.ChartAreas["area"].AxisX.Minimum = x_.First();
    plt.ChartAreas["area"].AxisX.Maximum = x_.Last();

    plt.ChartAreas["area"].AxisY.MajorGrid.Enabled = false;
    plt.ChartAreas["area"].AxisY.LabelStyle.Format = "0.0";
    plt.ChartAreas["area"].AxisY.Minimum = y_.First();
    plt.ChartAreas["area"].AxisY.Maximum = y_.Last();

    plt.Series["line"].ChartType = SeriesChartType.Line;

    foreach (var n in x.Zip(y, Tuple.Create))
    {
        plt.Series["line"].Points.AddXY(n.Item1, n.Item2);
    }
}

private void plt_xlim(Chart plt, double minimum, double maximum)
{
    plt.ChartAreas["area"].AxisX.IntervalOffset = 0.0;
    plt.ChartAreas["area"].AxisX.Minimum = minimum;
    plt.ChartAreas["area"].AxisX.Maximum = maximum;
    plt.ChartAreas["area"].AxisX.Interval = 2;
}

private void plt_ylim(Chart plt, double minimum, double maximum)
{
    plt.ChartAreas["area"].AxisY.IntervalOffset = 0.1;
    plt.ChartAreas["area"].AxisY.Minimum = minimum;
    plt.ChartAreas["area"].AxisY.Maximum = maximum;
    plt.ChartAreas["area"].AxisY.Interval = 0.2;
}

private void plt_show(Chart plt)
{
    Bitmap bitmap = new Bitmap(plt.Width, plt.Height);
    plt.DrawToBitmap(bitmap, new Rectangle(System.Drawing.Point.Empty, plt.Size));
    Cv2.ImShow("plot", BitmapConverter.ToMat(bitmap));
}
```
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662099/b5d144d5-f1b7-6d7b-dd04-c974703b1849.png)

参考文献:
斎藤康毅(2016)『ゼロから作るDeep Learning』オライリー・ジャパン
Red Hat OpenShift on IBM Cloud: OpenShiftクラスターにコマンド一発でログインする方法

#1. はじめに
Red Hat OpenShift on IBM CloudのOpenShiftクラスターにocコマンドでログインするために、毎回IBM Cloud PortalにログインしてToken情報取得してるわー、Tokenがタイムアウトする度にこの作業するのは面倒だわーっていう人に向けての記事です。APIキーを事前に取得しておけばこういう作業は都度必要なくなります。

- IBM Cloud PortalにログインしてOpenShiftクラスターの画面に移動し、Token情報を発行する<br><img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4e820164-4a7e-5a1f-9b81-93df49bed2d3.png">
- 以下の画面からコピペ<br><img width="1276" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/07d6e6fe-3f7e-b424-c0be-aa034f99896c.png">

#2. 事前準備

要は[ここ](https://cloud.ibm.com/docs/openshift?topic=openshift-access_cluster#access_api_key)に記載があります。


```shell-session:APIキーを取得する。このキーは２度と発行されることはないのでメモしておく。
$ ibmcloud iam api-key-create myAPIKey
Creating API key myAPIKey under xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx as xxxxxxx@xx.xxx.xxx...
OK
API key myAPIKey was created

Please preserve the API key! It cannot be retrieved after it's created.

ID            ApiKey-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Name          myAPIKey
Description
Created At    2020-05-02T05:36+0000
API Key       <API Key>
Locked        false
```
```shell-session:.bashrcに環境変数に保管し、有効化する
$ vi .bashrc
export APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
alias oclogin="oc login -u apikey -p $APIKEY"

$ . .bashrc
```

#3. はじめてOpenShiftクラスターにログインする際の設定
```shell-session:IBMCloudにAPIKeyを使ってログインし、クラスター構成情報を事前に取得しておく
$ ibmcloud login --apikey $APIKEY
API endpoint: https://cloud.ibm.com
Region: us-south
Authenticating...
OK

Targeted account IBM (yyyyyyyyyyyyyyyyy) <-> zzzzzzz


API endpoint:      https://cloud.ibm.com
Region:            us-south
User:              xxxxxxx@xx.xx.xx
Account:           IBM (yyyyyyyyyyyyyyyyy) <-> zzzzzzz
Resource group:    No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
CF API endpoint:
Org:
Space:

$ ibmcloud oc cluster config -c myrokscluster43
OK
The configuration for myrokscluster43 was downloaded successfully.

Added context for myrokscluster43 to the current kubeconfig file.
You can now execute 'kubectl' commands against your cluster. For example, run 'kubectl get nodes'.
```

#4. OpenShiftクラスターへのログイン方法

```shell-session
$ oclogin
Login successful.

You have access to 67 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "syasuda".
```
javascriptでラジオボタンの値を取得する


機能を実装する上で、

「ラジオボタンのチェックによって、挙動を変更する処理をしたい」

という要望があったのでメモを残します。

##HTML

ワークアウトメニューとして、3つのトレーニング種目を用意しました。

```html:index.html
 <h2>【ワークアウトメニュー】</h2>
 <ul>
   <form name="typeForm">
     <li class="menu"><input type="radio" name="type" value="pushup" checked="checked">腕立て</li>
     <li class="menu"><input type="radio" name="type" value="situp">腹筋</li>
     <li class="menu"><input type="radio" name="type" value="squat">スクワット</li>
   </form>
 </ul>
```
3つの中から、ユーザーに1つを選んでもらいます。

##Javascript

`checkType()`で、ラジオボタンの要素を取得して変数に格納します。
（※コメントでご指摘いただいた点を修正しました。）

```javascript:script.js
let checkedType;

function checkType() {
      if (document.typeForm.type.checked) {
        checkedType = document.typeForm.type.value;
      }
};

```

Chrome DevToolsのコンソールで確認すると`document.typeForm.type.value`に選んだ種目の`value`の値が表示されていることがわかります。

![Screen Shot 0032-06-29 at 19.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/a977ac4b-647b-687d-7b26-8763cf50a8ac.png)


### 参考
[\<input type="radio">/MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/radio)
[JavaScriptでチェックボックスの選択状態を取得する/UX MILK](https://uxmilk.jp/38891)
MagicLeap開発備忘録

個人的な備忘録、場合によっては情報が古い可能性もあり

- [テスト用に作成したアプリのアンインストール方法](https://qiita.com/matsumotokaka11/items/db953864984538e2afcc)
- [コントローラのイベント取得方法](https://qiita.com/matsumotokaka11/items/a1585de2c325aaac29f2)
- [ハンドトラッキングの実装](https://qiita.com/matsumotokaka11/items/ca596998853c9f4bdd7a)
- [MagicLeapToolKitを利用したハンドトラッキングの実装](https://qiita.com/matsumotokaka11/items/262fd194fcea5ae95fae)
- [MagicLeapでTextMeshProのSpriteAssetが片目が描画されないときに確認したいこと](https://qiita.com/matsumotokaka11/items/5508597b0eb668f0734a)
- [MagicLeapToolKitを利用したハンドジェスチャの検出方法](https://qiita.com/matsumotokaka11/items/dd8b41b3a843c7c98e3e)
- [MagicLeapで床にオブジェクトを配置する方法](https://qiita.com/matsumotokaka11/items/a4cc2a3012f5efed2379)
- [MagicLeapで任意の平面にオブジェクトを置く方法](https://qiita.com/matsumotokaka11/items/d8ed687094538261b4a9)
- [MagicLeapのEyeトラッキングの使い方( 超簡単サンプル )](https://qiita.com/matsumotokaka11/items/4abf3167d22b7a6c821d)
- [AdventCalendar : 全集中・Magic Leapの呼吸 肆ノ型 手入力 "かすたむ じぇすちゃ"](https://qiita.com/matsumotokaka11/items/dfe78436d7f16be015c7)
- [全集中・Magic Leapの呼吸 弐拾参ノ型 線点 "はんど ぽいんたぁ"](https://qiita.com/matsumotokaka11/items/eb9808f920ad5560276f)

:qiitan:
(自分用)Flask_AWS_2(AWS上でFlaskをインストール/動かす)

# 項目
1. AWSにFlaskをインストール
2. 実際に動かしてみる

# 1.AWSにFlaskをインストール
- 前回でもうPythonは入れてあると言う前提

```bash:ターミナル
# ホームディレクトリへ
$$ cd

# Python仮想環境を作る(myenvは他の名前でもよいぞ)
$$ python3 -m venv myenv

# Python仮想環境を有効化する
$$ source myenv/bin/activate
# 左の環境名だったりの所に(myenv) と表示されれば成功

# pipを一応最新にしておく
$$ pip install --upgrade pip

# Flaskをインストール
$$ pip install flask

# ちゃんとpipにモジュールがあるか確認
$$ pip freeze
```

# 2.実際に動かしてみる
```bash:ターミナル
# pyファイルを作成、今回はApacheで動かすので/var/www/htmlの中に作る
$$ vi /var/www/html/test.py
```


```python:test.py
# 何度でも言うが'i'で入力モード、入力が終わったら'esc'、':wq'で保存終了
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello():
    return 'Hello World!'
 
if __name__ == '__main__':
# Flaskはホストが'0.0.0.0'じゃないと動かないらしい、ここ周りは必須
    app.run(host='0.0.0.0')
```

```bash:ターミナル
# ブラウザで動かす!
$$ python3 /var/www/html/test.py

# http://AWSで設定したパブリックIPアドレス:5000に接続でHello!してるはず

# Python仮想環境の終了
$$ deactivate
```

# 3.終わりに
- 取り敢えずFLaskは動いた！
- 長すぎる道のりだった
- あとはMySQLにPythonから接続出来るかを頑張れば
- 本チャン！
- 遠すぎた橋