OmniAICreator/Qiita-1.07M huggingface dataset:
rails の grouped_options_for_select で selected を指定する方法

## grouped_options_for_select に selected を指定したい

`grouped_options_for_select` の [railsドキュメント](http://railsdoc.com/references/grouped_options_for_select)には`options_for_select` の [rails ドキュメント](http://railsdoc.com/references/options_for_select)にある

```erb
<%= select_tag 'page[name]', options_for_select({"Railsの基礎" => "rails_base", "Rubyの基礎" => "ruby_base"}, :selected => "ruby_base") %>
# <select id="page_name" name="page[name]"><option value="rails_base">Railsの基礎</option> 
# <option value="ruby_base">Rubyの基礎</option></select>
```
のような option に selected を指定するオプションはないようだ。
さてどうしたものか。。。
railsAPI を読んでみると... 

https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-grouped_options_for_select

ふむふむ、メソッドの引数に `selected_key` なるものを option の value を設定することでいけそうだ!

```erb
<%= select_tag 'page[name]', grouped_options_for_select([["基礎", [["Railsの基礎", "rails_base"], ["Rubyの基礎", "ruby_base"]]]], 'ruby_base') %>
# <select id="page_name" name="page[name]"><optgroup label="基礎"><option value="rails_base">Railsの基礎</option> 
# <option value="ruby_base">Rubyの基礎</option></optgroup></select>
```

これで 「Rubyの基礎」が selected の状態になる！

## できそうだなと思ったら粘り強く調べるべし
実のところ僕自身は rails ドキュメントに記載されていなかった時点でできないものだと思い諦めていたところ, 先輩エンジニアの方が協力してくれて見つけることができた。 `options_for_select` では普通に指定できるわけだし `grouped_options_for_select` だからできないというのは確かに違和感があった。次からは rails の素晴らしい機能を信じて深く探してみよう。
【VBA】Outlook365 グループスケジュールフォーム表示

####パブリック関数
```vb
'現在選択されているアイテムを表示する
Public Function アイテム取得()
    Dim aITEM As AppointmentItem  '予定、アポ アイテム
    Dim nSelectCNT As Integer     '選択されている数、ctrl+クリックで複数選択可能なので
    nSelectCNT = Application.ActiveExplorer.Selection.Count '選択された件数
    
    If nSelectCNT = 1 Then
        Set aITEM = Application.ActiveExplorer.Selection.Item(1) 'n番目のitemをセットする
        If TypeName(aITEM) = "AppointmentItem" Then '予定、アポ
            件名 = "件名：" & aITEM.Subject     '件名
            開始 = "開始：" & aITEM.Start       '終了時間
            終了 = "終了：" & aITEM.End         '終了時間
            場所 = "場所：" & aITEM.Location    '場所
            本文 = "本文：" & aITEM.Body        '本文'↑他にも 値、プロパティがある
        End If
    Else
        件名 = "件名："
        開始 = "開始："
        終了 = "終了："
        場所 = "場所："
        本文 = "本文："
    End If
End Function
```
####パブリック変数
```vb
Public 件名 As String
Public 開始 As String
Public 終了 As String
Public 場所 As String
Public 本文 As String
```
####メイン関数
```vb
Sub ユーザーフォーム表示()
    UserForm1.Show vbModeless
End Sub
```
####UserForm1
```vb
Private Sub CommandButton1_Click()
    Call 予定表示
End Sub

Private Sub UserForm_Initialize()
    Call 予定表示
End Sub

Private Function 予定表示()
    Call アイテム取得
    UserForm1.TextBox1.Value = 件名
    UserForm1.TextBox2.Value = 開始
    UserForm1.TextBox3.Value = 終了
    UserForm1.TextBox4.Value = 場所
    UserForm1.TextBox5.Value = 本文
End Function
```
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404228/2448efab-d4fc-31e3-25f7-0ba53ca796ae.png)

###■参考
>[Outlook VBA ActiveExplorer.Selection 選択されているアイテムを知りたい](https://ken3memo.hatenablog.com/entry/20120214/1329170762)
Python3によるGmail送信プログラム

# Python3によるGmail送信について

初心者の方、入門本を終えてみて何をしますか？
Class学びました。関数学びました。良いね。で、だから何？
って状況じゃない？でない方は読み飛ばしを。
僕はこれだった。目的がなくて、ただ単に学校の授業のようなプログラミングって科目だった。
んで、取り敢えず実用性のあるようなものをと。
って事で、Python3によるGmail送信の手法を書いてく。


# CUIによるプログラム
GUIにおけるプログラムも一緒の記事にしようと思ったが、長い投稿は嫌いなのでやめた。
プログラムは書いてあるので、次回に気が向いた時にでも投稿する。
Gmailのセキュリティ保護を軽くしないと動かないため、設定の変更をしてくれ。
これはググって何とかして欲しい。

さて、本題のプログラムに入る。

```Python3
import smtplib
from email.mime.text import MIMEText
import sys

# 使う変数を引数として受け取る。自分のメールアドレスと、パスワードと、相手先のメールアドレスと件名と、本文を取得する事にしている。

def send_mail(my_mail,password,send_addresas,subject,main_text):

# 上から自分のメールアドレス,パスワード,相手のメールアドレス,件名,内容を引数から得る 

    message['From'] = my_mail
    mail_pass = password 
    message['To'] = send_addresas
    message['Subject'] = subject 
    message = MIMEText(main_text)
   
# SMTPという現在のメールアドレス送受信プロトコルを用いる。

    sender = smtplib.SMTP_SSL('smtp.gmail.com')

# Gmailにログインする
    sender.login(my_mail, password)

# 相手にメールを送る手続き
    sender.sendmail(my_mail, send_addresas, message.as_string())

# senderを閉じる    
    sender.quit()



# 自分のメアド、パスワード、送信先メアド、件名、本文を入力する

print('自分のメールアドレスを入力してください:')
my_mail = input()
print('パスワードを入力してください:')
password = input()
print('送信先のメールアドレスを入力してください:')
send_address = input()
print('件名を入力してください:')
subject = input()
print('本文を入力してください:')
main_text = input()

# 何か入力を間違えていた際に、フラグを立てるとか、これでいいのか。など確認のためにフラグを立てると良いかも。筆者もそのようにしたが、Gmailを送るプログラムが目的であるから、分かりづらくなるため省略。
    
# 関数にこれらの情報を投げ込むと、入力が正しければ実行される。一応↑で言ったが、最低限として例外処理
try:
    send_mail(my_mail,password,send_address,subject,main_text)

except:
    print('何らかの問題によりGmailは送信できませんでした。よってプログラムを終了します。')
    sys.exit()
  
print('送信が成功しました')

# try,exceptを書かずに、send_mail(my_mail,password,send_address,subject,main_text)とだけ書いてもヒューマンエラーがなければ問題ないはず

```

# まとめ
と、こんな感じ。これを基に次回はGUIで実装していく予定。何か不明点や問題点などあればコメントや修正リクエストをしてくれ。
書きたい内容はソースコード内に記述したはず。では、気が向くまで。さらば。
gitで「あっやべっ！」ってときに使うコマンド[随時更新]

こんな記事をいちいちググらなくていいようにgitのコマンドはちゃんと覚えましょう

## ブランチを切り忘れた！

まずは

```bash
git stash
```

で現在のワーキングツリーを保存

一応安全のために

```bash
git stash list
```

で保存した変更を確認

確認したら

```bash
git checkout -b'対象のブランチ'

git stash pop
```

これでチェックアウト先のブランチで変更が適用されます。

## 間違ったコミットをした！

```bash
git reset HEAD^
```

ちなみにこのHEADに当たるところはcommitのハッシュ値を指定すればそのコミットまで戻れます(というかそういうコマンドだし)

## gitignore書く前にgit add -Aしちゃった！

ファイルごと行くなら

```bash
git rm '削除対象のファイル'
```

ディレクトリの場合

```bash
git rm -r '削除対象のディレクトリ'
```

ファイル自体は残す場合

```bash
git rm --cached '削除対象のファイル'
```

もしくは

```bash
git reset .
```

ignoreを書いて

```bash
git add .gitignore
```

## コミットメッセージを間違えた

```bash
git commit --amend
```

これでエディタが起動するので修正したいメッセージを直してください

なんかやべって思うことあったら随時追加していきます
コードの共通化を意識する ④ ビュー編

自分がエンジニアバイトをしているところでは週1回Rails勉強会をしています。今回はそのやったところのまとめを残しておきます。
参考書：[現場で使える Ruby on Rails 5速習実践ガイド]
(https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)

## Viewの共通化の方法
Viewでは共通化する部分がロジックとテンプレートの二箇所あります。

##### ロジックの部分
- カスタムヘルパー(app/helpers)に共通処理をまとめる
- Decoratorパターンモデル固有の表示ロジックを分離する

##### テンプレートの部分
- パーシャルテンプレート(render)で画面の一部を共通化する
- レイアウトで画面の大部分を共通化する(ヘッダーとかフッターとか)

## パーシャルテンプレートの共通化
パーシャルはどこのディレクトリに入っているものでも、複数のテンプレートに自由に埋め込むことができる部分的なテンプレートです。パーシャルはどこのディレクトリのものでも呼び出すことは出来ますが、呼び出しているディレクトリと一緒の場所に置いておくのがわかりやすく、管理しやすいです。例えば、ユーザーの画面を扱うUserディレクトリがあり、そこの登録ページで登録フォームをパーシャル化するなら、Userディレクトリ内に__forml.html.slimのような形で作成します。
複数のディレクトリ間で共通化するときは共通用のディレクトリに作成し、そこにパーシャルを配置するとどこから参照しているのかわかりやすく、意図せぬ変更の影響を受けにくくなります。ここで大事なのがパーシャルを共通化するときはHTMLの構造が来ているから共通化するのではなく、**目的の類似性**に着目しましょう。構造だけで共通化すると後々変更があった時、結局共通化を解除する必要が出てきてしまうからです。

## レイアウトで画面の大枠を共通化
個別ファイルごとの共通化ではなく、ヘッダーやフッター、サイドバーのように全てのテンプレートに共通させたい大枠なテンプレートに関しては、layoutディレクトリのようなものを作成し、そこに配置します。application.html.slimファイルに埋め込むことで大枠を共通化し、アクション毎で変化させる際は「yield」メソッドを呼び出した位置に埋め込まれます。

## カスタムヘルパーに共通処理をかく
ヘルパーを利用することで複数のビューで共通処理をまとめることができます。ただヘルパーはデフォルトで全てのコントローラで表示されるビューの中から利用できてしまう為、ヘルパーのメソッド名をアプリケーション全体で意味がとれるようにしたおく必要があります。

## カスタムヘルパーは小さくつくる
カスタムヘルパーを実装する時は一つ、一つのヘルパーを小さな処理に留め、名前もその目的にあったものにするのがいいでしょう。複雑な処理にしたい時はヘルパーを組み合わせることで実装する必要があります。
ヘルパーはどこからでも呼び出せてしまうグローバルな存在のため、一個の処理に対し複数のビューの条件分岐をさせることで、どのビューでも使えるようにしてしまう「何でも屋」のようになりがちです。そうなると余計な処理まで加えることとなり、コードが難解なものになってしまいます。なのでヘルパーを作る時は小さく作るのが重要になってきます。

## 特定のモデルに依存する処理をヘルパーに含めない

```
case record
when Comment
  record.locked?
when Post
  !record.created_at.today?
else
  false end
```

ヘルパー内に特定のモデルのデータやふるまいに依存する処理が入り込むことは以下の問題があります。

- 本来モデルにあるべきコードが分散している状態になる。record.locked?や!record.created_at.today?なんかは本来モデルに置き、呼び出すだけにするのがいい
- CommentやPostのように特定のモデル専用のコードがビューに生まれてしまい、ビジネルロジックが混在してしまう
Cognitoのユーザプール認証で発行されたトークンとAPIGatewayのオーソライザーを使ってAPIに認証を掛ける

## 概要

Cognitoのユーザプール認証で発行されたトークンとAPIGatewayのオーソライザーを使ってAPIに認証を掛ける。

## 流れ

1. Cognitoのユーザプール認証でトークン発行
2. APIGatewayにオーソライザー登録
3. APIGatewayのメソッドにオーソライザーを設定
3. リクエストを投げる時はヘッダに発行されたトークンを設定する

### Cognitoのユーザプール認証でトークン発行

[Cognitoのユーザプールでの認証するところまでを最速でやる](https://qiita.com/k_hoso/items/afe9aa8183b8bf0651a1) 参照

### APIGatewayにオーソライザー登録

APIGatewayから以下の通り入力

* 赤枠は素直にクリック＆入力
* 緑枠は認証で使用したユーザプールを選択すること（サジェストが出るので間違えないと思うけど。。）
* 青枠はリクエストが投げられた時、どのヘッダを使って認証するかの設定（基本、Authorization でいい気がします）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/cec845d7-d342-e3f1-d63e-9a84bd6a5804.png)

### APIGatewayのメソッドにオーソライザーを設定

APIGatewayから適当にメソッドまで生成し、メソッドリクエストの設定で認可を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/7ee5a616-13e5-ef20-56bc-62da5da68824.png)

### リクエストを投げる時はヘッダに発行されたトークンを設定する

※認証で取得したIDトークン = cognitoUser.signInUserSession.idToken.jwdTokenの値

Authorizationヘッダに認証で取得したIDトークンを付与しないと↓

```json-doc:ResponseBody
{
    "message": "Unauthorized"
}
```
※ステータスは401

Authorizationヘッダに認証で取得したIDトークンを付与すると200 OK

## 参考

[公式](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)
AWSとAndroidとDARTSLIVE-200s

# はじめに
Food Tech Hackathonというハッカソン↓に参加しました。
https://cookpad.connpass.com/event/131371/
ダーツをして刺さった箇所の晩ご飯の作り方が表示されるAndroidアプリ↓を作りました。
https://youtu.be/g9nZOD5v4Z0
この記事では設計や実装方法を書いています。
ハッカソンのことはブログ↓を書いたので、よかったら読んでください。
https://yoppiex.hatenablog.com/entry/2019/06/12/002550

# 全体の構成とフロー
## 全体の構成
![dartsdesign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/f52a10dc-fbe0-4194-03c1-7b3d0d25aa44.png)
こんな構成になっています。
スマホはダーツボードのDARTSLIVE-200s(以下、200s)をBluetoohキーボードとして認識していました。
楽天レシピAPIを叩いて取得した情報を元に、「晩ご飯-作り方URL」のセットを作り事前にDynamoDBに入れています。

## 全体のフロー
1. AndroidアプリがAPI経由でランダムに生成された21個の「晩ご飯-作り方URL」セットを取得
2. Androidアプリが1~20,50の番号と晩ご飯を表示
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/b0d3c280-8716-3e5e-6f7b-58af5e7cc7bb.png)

3. 人が200sに矢をさす
4. Androidアプリがささった箇所をBluetooth経由で取得して表示
5. 画面遷移後、あらかじめAPI経由で取得していた作り方URLのページをAndroidアプリがWebViewで表示

# API(AWS)
## 利用したAWSのサービス
- APIGateway
- Lambda
- DynamoDB

API作成時の3点セットです。
ググったらいっぱい構築手順が出てくるので詳しくは書きません。

## 楽天レシピAPI
晩ご飯の名称と作り方を[楽天レシピAPI](https://webservice.rakuten.co.jp/api/recipecategorylist/)で取得しました。
1回のアクセスで取得できる晩ご飯は4こです。

```json
{
  "result": [
    {
      "recipeId": 1760028309,
      "recipeTitle": "ご飯がすすむ！鶏むね肉のねぎ塩焼き",
      "recipeUrl": "https://recipe.rakuten.co.jp/recipe/1760028309/",
      ...
    },
    {
      "recipeId": 1390015585,
      "recipeTitle": "ご飯がすすむ♪ 豚肉となすの味噌炒め☆",
      "recipeUrl": "https://recipe.rakuten.co.jp/recipe/1390015585/",
      ...
    },
    {
      "recipeId": 1180006148,
      "recipeTitle": "ささみときゅうりの中華風酢の物",
      "recipeUrl": "https://recipe.rakuten.co.jp/recipe/1180006148/",
      ...
    },
    {
      "recipeId": 1570002039,
      "recipeTitle": "お酢で疲労回復☆手羽元のさっぱり煮",
      "recipeUrl": "https://recipe.rakuten.co.jp/recipe/1570002039/",
      ...
    }
  ]
}
```
Androidアプリに21こ(ダーツの性質上1~20,50)の晩ご飯を表示することになります。
しかし、詳しく調べられていないですが1秒以内に複数回叩くとアクセスできなくなりました。
よって、あらかじめ楽天レシピAPIを叩いて事前にDynamoDBに`recipeTitle`と`recipeUrl`が対のレコードを複数作ることにしました。

## API
DynamoDBにある全レコードを取得して、
ランダムに`recipeTitle`と`recipeUrl`が対になってるデータを21こ生成し返します。

# Androidアプリ
## Androidアプリと200s
スマホは200sをBluetoohキーボードとして認識していたので、AndroidSDKにあるキーイベントを取得する`dispatchKeyEvent`というメソッドを利用しました。
dispatchKeyEventは常にキー入力を監視していて、イベントが発生した際に呼び出されるメソッドです。
200sに矢がささる時もdispatchKeyEventが呼び出されました。

## 200sの調査
200sに矢が刺さった時に「外側Single」「内側Single」「Double」「Triple」「Bull」「InBull」それぞれで違う数字がキー入力されます。
どんな数字がキー入力されるかをログ出力して調査しました。
82箇所調査する必要があり、骨が折れる作業でした。
どこに矢が刺さるとどんな数字がスマホに送られてくるかがわかるとdispatchKeyEvent内で条件分岐をさせればOKです。

# 最後に
他にも200sを使っていろんなゲームが作れそうです。
何か良さそうなネタがあれば作るので教えてください！
NuxtのSPAでページ遷移のたびにページのタイトルを取得する

## やりたかったこと

ポートフォリオを鋭意製作中で、レビューをもらうために公開してるので見てほしいんですが、見て分かる通りこのサイトは複数のページを上部のボタンによって遷移するようにしています、今回やりたかったのは見ているページによってヘッダーの状態を変えるということです。

[ポートフォリオ](https://myportfolio-d549f.web.app)

## やったこと
人に教えてもらったところ、どうやら現在のページの状態は

```js
$nuxt.route.name
```

なのでまず単純に

```layouts/default.vue
<script>
export default {
    data () {
        return {
            pageTitle: $nuxt.$route.name
        }
    }
}
</script>
```

みたいにしてみました、すると読み込んだ最初のページタイトルは取得できましたが、遷移してもそのままの状態になってしまいました。

これはSPAなので、layoutの要素はページ遷移しても更新されないからです。

なのでページ遷移の際に毎回 `pageTitle` を更新するように `watch` を起きます。
これでページ遷移のたびに要素の更新を監視してLayoutに渡すことができます。

```layouts/default.vue
<script>
export default {
    watch: {
        '$route': function(to, from) {
            //遷移元と遷移先のパスが違った場合に発火する
            if(to.path !== from.path) {
                this.pageTitle = $nuxt.$route.name
            }
        }
    },
    data () {
        return {
            pageTitle: $nuxt.$route.name
        }
    }
}
</script>
```

これでページ遷移のたびに現在のページの情報をLayoutに伝えることができました。

もしかしたらこれより良いやり方があるかもしれないので、わかる方いればコメント等で教えてくださると幸いです。
ローカル環境でvue.js

こんにちは。
巷を賑わせているvue.jsを使ってみました。ただしローカルの環境で！

vue.jsを始めるときって大体、npm installやら、node.jsが絡んできて、
ローカルサーバ立てたりとかしないといけない感じがして、敷居がとても高く感じることありませんか？

でも、もっと手軽に簡単に使ってみたいときとか、事情があってnode環境作れないって人とかとか。
意外に多いんじゃないかと思うんですよね。

なので、今回はローカル環境でvue.jsを使ってみたときのことをまとめてみたいと思います。

## 準備
まず初めに、vue.js本体を入手する必要があります。[公式サイト](https://jp.vuejs.org/)にアクセスして、手に入れましょう！
CDN経由で使いたい場合も、[ここ](https://jp.vuejs.org/v2/guide/installation.html)に記載されているようにhtmlファイルに組み込んでください。

```index.html
<html>
  <head>
    <!-- 自分の環境に配置したvue.jsを指定 -->
    <script src="./vue.min.js"></script>

    <!-- もしくはCDN経由で読み込み -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  </head>

  ・・・

</html>
```

準備はこれだけです。簡単ですね。

## 実際に使ってみる
vue.jsの準備ができれば、早速使ってみましょう。
基本的には、vue.jsもjavascriptなので、scriptタグ内に処理を記述していくことになります。
以下のサンプルソースを載せてみます。

```index.html
<html>

  ...

  <body>
    <div class="contents">
      {{ message }}
      <button v-on:click="test_function">test</button>
      <div v-if="str === '1' ">
          if分岐できるよ
      </div>
    </div>
  <script>
    var app = new Vue({
      el: ".contents",
      data: {
         message: "test",
         str: "2",
      },
      methods:{
         test_function: function(event){
            alert( "test" );
         }
      },
    })
  </script>
  </body>
</html>
```

elはhtmlのエレメントを指定することができ、dataの中に変数を記載し、methodの中に関数を記述します。
dataのなかで宣言した変数を、{{ 変数 }}として指定することで、htmlないで使用することができます。

このとき、注意しなければならないポイントは、elにどのエレメントを指定しているか？です。
vue.jsの場合、ここで指定したエレメントのスコープ中でしかdataに指定した変数およびmethodsの関数を利用することができません。

あとは、v-on:clickで関数を呼び出したり、v-ifで条件分岐させたり、思うようにvueを使いましょう。

vue.js使って静的なサイトを作ってみました。
[QRコードを生成するツール](http://home.project.oe-project.com/services/qr_code.html)
vue.jsと、vue-qriouslyに独自に手を加えたもの、bootstrapも使ってみています。

vue-qriouslyはQRコードを生成するためのライブラリで、bootstrapは言わずもがなcssのフレームワークですね。
上記に関しても、いずれ記事を書いてみたいと思います。
【VB.NET】WPFタイトルバーのないフォームをドラッグで移動する

#C#でのやり方しか書いていなくて辛い
基本的にC#でできることはVB.NETでできることは分かったのですが、あまりにも情報が少なすぎて辛い。
タイトル通り本来のタイトルバーのあるフォームを消しつつもドラッグをしてフォームを動かせるようにします

#xamlでフォームを消し、動かしたい図形を設定する

```xml:Window.xaml

<Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        WindowStyle="None"
        AllowsTransparency="True"
        Background="Transparent"
        Title="MainWindow" Height="308.033" Width="190.203">

    <Canvas>
        <Thumb DragDelta="MoveWindow" Width="186" Height="308" >
            <Thumb.Template>
                <ControlTemplate>
                    <Rectangle Width="180" Height="301" RadiusX="5" RadiusY="5" Fill="White" Margin="0,0,0,0" Stroke="Blue" />
                </ControlTemplate>
            </Thumb.Template>
        </Thumb>
    </Canvas>
</Window>

```

![c5afc3bcd0f113472939ff488d00414d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361263/fa6c0ebd-1026-a95a-1342-90136dc1c533.png)

###本来のフォームを削除
WindowStyle="None"→枠を削除
AllowsTransparency="True"→ウィンドウを透明にできるようする
Background="Transparent"→本来のウィンドウを透明に

###少し小さめのフォームをRectangleで作成
< Thumb >：ユーザーがドラッグできるコントロールを作成
< Rectangle >：ドラッグする図形としてRectangleを指定


###< Thumb > に設定してあるDragDeltaイベントを記述

```vb:drag&drop.vb
Public Class Window1
    Public Sub MoveWindow(sender As Object, e As Primitives.DragDeltaEventArgs)
        Left += e.HorizontalChange
        Top += e.VerticalChange
    End Sub
End Class
```

![oklri-ix83s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361263/657b1174-a193-1f47-cc44-452e02f02e64.gif)

これで動くようになりました。

#参考
###C#版
https://como-2.hatenadiary.org/entry/20110511/1305129674
IBM CloudにDockerコンテナをpushしてみた

IBM CloudにDockerコンテナをpushしてみたときの備忘録です。


事前準備
---
- IBM CLI(command-line interface) 
- IBM Cloud Kubernetes Service plug-in  
 * `ibmcloud plugin install container-service -r Bluemix`でインストール可能
 * `ibmcloud plugin list`で確認が可能  
- IBM Cloud Kubernetes Service plug-in  
 * `ibmcloud plugin install container-registry -r Bluemix`でインストール可能 
 * `ibmcloud plugin list`で確認が可能
- Docker

IBM Cloudにログイン
---
```
ibmcloud login
```

Container RegistryにDockerをPush
---
```
//自分用のネームスペースを作成
ibmcloud cr namespace-add <my_namespace>

//Dockerイメージをbuild
docker build --tag registry.ng.bluemix.net/<my_namespace>/XXX <dockerファイル>

//イメージが出来ていることを確認
docker images

//イメージをIBM CloudにPush
docker push registry.ng.bluemix.net/<namespace>/XXX
```

所感
---
これでIBM Cloud上にDockerイメージは設置できました。
非常に簡単でした。
リトライ処理の効率的アプローチ「Exponential Backoff」の概要とGoによる実装


こんにちはpo3rinです。実装していると通信のリトライを実装したくなることがあると思います。(僕は実際に LINE BotのRate Limitに引っかかり、リトライ機構を実装する必要がありました) 今回は、通信先サーバーに過度の負荷をかけないようにするためのリトライ手法「Exponential Backoff」の実装方法について説明します。

## Exponential Backoff とは

少しCloud IoT Coreよりですが、GCPのドキュメントに良い解説がありますので参考に。
https://cloud.google.com/iot/docs/how-tos/exponential-backoff

リトライの際に一定間隔で処理を再試行すると、通信を受け取る側のサーバーに大きな負荷がかかる可能性があります。そこで「Exponential Backoff」という考え方が出てきます。「Exponential Backoff」はクライアントが通信に失敗した際に要求間の遅延を増やしながら定期的に再試行するアプローチです。一般的なエラー処理戦略として知られています。

例えば

* 1回目のリクエスト失敗、1 + random_number_milliseconds 秒待って再試行。
* 2回目のリクエスト失敗、2 + random_number_milliseconds 秒待って再試行。
* 3回目のリクエスト失敗、4 + random_number_milliseconds 秒待って再試行。
* ...(任意回数、待機時間を指数的に増加させながら再試行)

と待機時間を指数関数的に増加させていきます。そして任意の最大再試行回数まで再試行します。これでサーバの負荷を軽減したり、無駄なリクエストも省けます。結果的にリトライ成功可能性が上がります。

日本語だとここの解説が良いでしょう
https://note.mu/artrigger_jp/n/n0795148b062d

## Goによる実装

例としてGoによる実装を見ていきます。簡単に実装できることが分かると思います。

```go
// Exponential Backoff Algorism for retry
func Retry() error {
    var retries int
    maxRetries := 5

    for {
        err = Something()
        if err != nil {
            if retries > maxRetries {
                return err
            }

            waitTime := (2 << retries) + rand.Intn(1000)/1000
            time.Sleep(time.Duration(waitTime) * time.Second)

            retries++
            continue
        }
        break
    }
    return nil
}
```

当然、maxRetriesは実装によって変わります。これで Retry の待機時間を指数関数的に増やしていけます。Retry機構を実装する際には是非この実装を試してみてください。
h2loadで負荷試験を行う

##1.目的
PHPやpythonでWEBアプリを作成すると、レスポンスの性能が気になるところです。なので、ある程度の接続ユーザがアプリにアクセスする場合には、負荷試験は必須です。ベンチマークを計測ツールを使いたいと思います。

負荷試験のツールを検索していると、Apache Bench や wrkなどが有名どころのようですが、 
[h2load で HTTP/2.0 に対応した負荷試験を実施する](http://sig9.hatenablog.com/entry/2017/12/25/000000)の記事で、h2loadという便利そうなツールがあることを知りました。

この記事に従って負荷試験ができるか試したみた件を投稿します。

##2.環境

| カテゴリ    | バージョンなど       |
|:-----------|:-----------------|
| platform   | windows 10 64bit home             |
| os         | ubuntu18.04 (wsl)           |


今回の環境は、windows10のWSL(ubuntu)にh2loadをインストールしました。

##3.インストール

```
sudo apt-get update -y
sudo apt-get install -y nghttp2
```

##4.負荷試験

以下は、python + responder + sqlalchemy(postgresql)のユーザマスタ（4件登録済み）の全件検索を、ベンチマークしています。

```
h2load -p http/1.1  -c 100 -n 1000 http://localhost:5042/users/findall
starting benchmark...
spawning thread #0: 100 total client(s). 1000 total requests
Application protocol: http/1.1
progress: 10% done
progress: 20% done
progress: 30% done
progress: 40% done
progress: 50% done
progress: 60% done
progress: 70% done
progress: 80% done
progress: 90% done
progress: 100% done

finished in 4.64s, 215.31 req/s, 682.95KB/s
requests: 1000 total, 1000 started, 1000 done, 1000 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 1000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 3.10MB (3248000) total, 62.50KB (64000) headers (space savings 0.00%), 3.01MB (3153000) data
                     min         max         mean         sd        +/- sd
time for request:   258.96ms    530.11ms    450.46ms     49.15ms    77.20%
time for connect:     2.89ms     29.32ms     16.05ms      7.52ms    61.00%
time to 1st byte:   374.88ms    492.22ms    428.80ms     35.73ms    55.00%
req/s           :       2.15        2.31        2.21        0.06    71.00%
```

参考サイトにもありますが、h2loadのオプションを掲載しておきます。

| オプション | 意味 | 指定可能な値
|:---|:--------|:------------------------------
| -n | 総リクエスト数。 リクエスト数がこの値に到達するまで、リクエストし続ける | 整数を指定
| -c | クライアント数。 並行して実行するクライアントの数 | 整数を指定
| -m | クライアント当たりの、最大ストリーム並列数 | 整数を指定
| -p | プロトコル。 通常は HTTP バージョンを自動調整するが、明示的に特定バージョン指定したい場合に利用する | h2c や http/1.1

以上
OculusQuestでOVR Metrics Toolを使ってFPSを表示する

# はじめに
最近OculusQuest向けにUnityでアプリを作っているのですが、FPSを見るためにOVR Metrics Toolを使ってみました。

#開発環境
OVR Metrics Tool 1.3
Unity2019.1.4f1

#手順
1.[OVR Metrics Tool](https://developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-ovrmetricstool/)からツールをダウンロードします。
2. ダウンロードしたファイルを解凍するとOVRMetricsTool.apkがあるので、adbを使用してOculusQuestにインストールします。
3. インストール後、以下のコマンドを実行します
adb shell setprop debug.oculus.notifPackage com.oculus.ovrmonitormetricsservice
adb shell setprop debug.oculus.notifClass com.oculus.ovrmonitormetricsservice.PanelService
adb shell am force-stop com.oculus.ovrmonitormetricsservice
4. OculusQuest上でOVRMetricsToolを実行すると設定画面が表示されるので、Enable Persistent Overlayを有効に変更し、ヘッドセットを再起動します(電源ボタン長押し)。
5. このあとOculusQuest上で、他のアプリを実行中もFPS等の情報がオーバーレイで表示されるようになります。
![screen20190611222546_Trim_250x200.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/b093c85f-d57c-0f4a-24ab-506099d8c237.gif)
コマンドライン基礎 1/2 - Mac ver. -

◯◯◯gateで学んだコマンドラインをまとめる。

コマンドラインとは、CUI(Terminal等)を使用してコンピューターに命令していく技術だ。
Webエンジニアに必須の技術のため、このページでまとめる。

◯◯◯gateでコマンドラインを学んだが、ノートを取るのがめんどくさい…
そういう時などにこのページを参考にしてほしい。

（ここで紹介するコマンド一覧 : https://qiita.com/Yuki0531/items/89d91884b8a041bff2c4 ）


###デスクトップにディレクトリとファイルを作ろう！

  今回は、わかりやすいデスクトップにディレクトリを作る。
  1.まずはディレクトリの作成先を指定する。

```
$ cd Desktop
```
　＝＞"cd" + "お好みのディレクトリ"
　※"$"は、自分では入力しない


これで、保存先をデスクトップに指定した。
2.次は、新しいディレクトリを作る。

```
$ mkdir portfolio
```
　＝＞"mkdir" + "ファイルの名前"

これで"portfolio"という名のディレクトリを作った。
3.次は、"portfolio"の中に"index.html"というファイルを作りたい。
  その為に、portfolioを指定し直す。
　　（今は 1.の操作でデスクトップが指定されているから。）

```
$ cd portfolio
```
　＝＞"cd" + "あなたが開きたいディレクトリ"

　"portfolio"というディレクトリを指定する。
　そして、以下のコマンドで"index.html"というファイルを作成する。

```
$ touch index.html
```
　＝＞"touch" + "ファイルの名前"

  これで"portfolio"というディレクトリの中に"index.html"というファイルを作成した。

  今のあなたの指定しているファイルは以下のコマンドで確認できる。

```
$ pwd
```
　＝＞"pwd"

  "portfolio"の中にいることが確認できる。
　　そして、"portfolio"の中身一覧は以下のコマンドで確認できる。

```
$ ls
```
　＝＞"ls"
 "index.html"のみ保存されていることが確認できる。



###親ディレクトリと子ディレクトリの間を行き来しよう


```
$ mkdir tutorial
```
　＝＞"mkdir" + "tutorial"
 
 "portfolio"ディレクトリの中に"tutorial"というディレクトリを作ろう。
 "portfolio"が親ディレクトリ ＞ "tutorial"が子ディレクトリになる。
　cd コマンドをで"tutorial"に移動しよう。


```
$ cd tutorial
```

このあと、親ディレクトリ"portfolio"に戻るときはどうするか？
"cd portfolio"ではない。

```
$ cd
```
 =>"cd"

 cdのみ入力してhomeディレクトリに戻ることができる。

```
$ cd ..
```
 =>"cd" + ".."

 cd ..を入力して親ディレクトリに戻ることができる。


つづく。。。
特定の画面でスクリーンショットを禁止する方法

たった1行だけの処理なのですが、忘れてしまうことも多いので備忘録を兼ねて。

```kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_video)

        // スクリーンショットを禁止したい画面のActivityにこの1行を追加する
        window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
    }

}
```
【Nuxt頻出パッケージ】自分の使っているpackage.jsonを公開してみる

## 【Nuxt頻出パッケージ】自分の使っているpackage.jsonを公開してみる
Nuxtでサービスを3つほど作って来ましたが、いつも導入している基本的なパッケージ群があるなと感じて来ました。

そこで現在の私の`package.json`を公開します。基本的なものしかありません。
読者の方の、新しいパッケージとの出会いが生まれれば幸いです。

```json:package.json
{
  "name": "nuxt-blog-service",
  "version": "1.0.0",
  "description": "My praiseworthy Nuxt.js project",
  "author": "ToshioAkaneya",
  "private": true,
  "scripts": {
    "dev": "cross-env HOST=0.0.0.0 PORT=3000 nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "heroku-postbuild": "npm run build"
  },
  "dependencies": {
    "@nuxtjs/axios": "^5.0.0",
    "@nuxtjs/google-adsense": "^1.1.3",
    "@nuxtjs/google-analytics": "^2.0.2",
    "@nuxtjs/pwa": "^2.6.0",
    "@nuxtjs/sentry": "^2.2.1",
    "actioncable": "^5.2.2",
    "cross-env": "^5.2.0",
    "fs": "^0.0.1-security",
    "moment": "^2.23.0",
    "net": "^1.0.2",
    "node-sass": "^4.11.0",
    "nuxt": "^2.4.2",
    "pug": "^2.0.3",
    "pug-loader": "^2.4.0",
    "pug-plain-loader": "^1.0.0",
    "request-promise": "^4.2.2",
    "sass-loader": "^7.1.0",
    "tls": "^0.0.1",
    "vue-nl2br": "^0.1.1"
  },
  "devDependencies": {
    "@nuxtjs/sitemap": "^0.2.0",
    "@nuxtjs/vuetify": "^0.5.1",
    "nodemon": "^1.11.0"
  }
}

```
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
今日は何のゴミ出しの日かをLineに通知してくれるプログラムを作ってみた

朝ゴミを出すのを忘れちゃう、今日が何のゴミの日かを忘れちゃう一人暮らし初心者(私みたいな)用に、朝Lineに今日は何のゴミを出せば良いのかを通知してくれるプログラムを実装してみました。

以下のプログラムをcronを用いて通知してほしい時間に定期実行することで、Lineに通知が届き、ゴミ出しを忘れることを防止できるはず、、、です。

```garbage_notify.py
import datetime
import requests
 
weekday = datetime.date.today().weekday()
                                                                                                                                                                                                            
def send(message):
  url = "https://notify-api.line.me/api/notify"
  access_token = 'Your Access Token'#自身のアクセストークン(ページ下の記事参照)
  headers = {'Authorization': 'Bearer ' + access_token}
  payload = {'message': message}
  requests.post(url, headers = headers, params = payload)
 
def garbage_day():
  if weekday == 0 or weekday == 4:#0:月曜、4:金曜
    send('今日は燃えるゴミの日')
  elif weekday == 1:#1:火曜
    send('今日はプラスチックの日')
  elif weekday == 3:#3:木曜
    send('今日は紙の日')
  elif weekday == 5:#5:土曜
    send('今日は缶・ビン・ペットボトルの日')
  else:pass
 
if __name__ == "__main__":
  garbage_day()
```

cronの書き方は以下の記事を参考にしてください。
https://qiita.com/tossh/items/e135bd063a50087c3d6a

Line notifyの書き方は以下の記事を参考にしました。アクセストークンの取得方法を参考にしてください。
https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9

Qiita初心者なので、書き方がおかしい点、間違っている点等あればご指摘いただけると幸いです。
Windows10：コマンドラインから録音する方法（SoX）

#コマンドラインから録音したかった
- 引数でファイル名を指定したかった
- wav形式で保存したかった
- よくわからんVectorアプリは入れたくなかった（偏見）

##  SoX（Sound eXchange）をインストールする

- 公式サイトからダウンロード
    -  https://sourceforge.net/projects/sox/
 - インストール後、環境変数にPath設定
 - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204514/047d16e3-9bab-ddfd-d1bd-c59636cf045f.png)


## 結論

### 録音開始

- 以下のコマンドで録音できた。

```
sox -t waveaudio default -b 16 -c 1 -e signed-integer -r 16000 --endian little -t wav - > output.wav
```
```
-t ファイルの形式（wav | mp3 | row 等）
-b　量子化ビット数 ( 8 | 16 )
-c  チャネル数 (1 | 2) 
-e  標本符号化(signed-integer | unsigned-integer）
-r  標本化周波数 (8000 | 16000 | 48000 等）
-- endian エンディアン (little | big )
- 標準出力
```

### 録音終了

- **Ctrl+C** で録音が終了する

## 余談

Windows10標準のWindowsアプリ版ボイスレコーダーは、コマンドラインから次のコマンドで起動することができる。

```
explorer.exe shell:appsFolder\Microsoft.WindowsSoundRecorder_8wekyb3d8bbwe!App
```
【excel】 左から○○番目の文字列から特定の文字列までを抽出する

#### 初投稿
***

新しく配属された現場用に作ったExcelです。
今までの現場では、Excelに強い人がいて、どんどん便利Excelを作ってくれていたので、わたしは何にもすることがなかったのですが、新しい現場はドキュメントがひどい。。。泣

せっかくのチャンスなのでExcelのスキルも高めて生きたいと思います！

サーバのディレクトリ構成をExcelに書き残すのに、lsの結果から、ユーザとグループを抽出する関数を書きました。

#### 使用した関数
***
・MID関数
・FIND関数
・LEN関数
・LEFT関数
・RIGHT関数
・SUBSUTITUTE関数


#### ゴール
下記の文字列がひとつのセル(I9セル)に入っていた時、左の「root」と右の「root」を別々のセルに抽出します。
　※左から2番目の半角スペース(「9」と「root」の間)から4番目の半角スペース(「root」と「4096」の間)までを抽出します。
***
drwxr-xr-x. 9 root root      4096 Jun  7 10:55 apache-tomcat-8.5.41-src
***

１．まずは「H9」セルに下記関数を入力し、rootからrootまでを抽出(正確には「 root」から「root 」まで)

=MID(I9,FIND(" ",I9)+2,FIND(" ",I9))

２．「G9」セルに下記関数を入力し、右側のrootを抽出

=RIGHT(H9,LEN(H9)-FIND(" ",H9,FIND(" ",H9)+1))

３．「F9」セルに下記関数を入力し、左側のrootを抽出

=LEFT(H9,LEN(H9)-FIND(" ",H9,FIND(" ",H9)+1))


***
以上で、所有者の「root」とグループの「root」が抽出できたと思います！

後はrootの前後に半角スペースが入っているので、SUBSUTITUE関数で消そうと思います。

***
１．「E9」セルに下記関数を入力し、右側の「root」の前後の半角スペースを置換して削除
=SUBSTITUTE(G9," ","")

２．「D9」セルに下記関数を入力、左側の「root」の前の半角スペースを置換して削除
=SUBSTITUTE(F9," ","")
unity2019で、新たに作成したSceneに配置したオブジェクトが暗い色で表示される問題

環境：Unity2019.1.5f1
参考URL：https://www.facebook.com/groups/unityuserbsj/permalink/1072034813006157/

……問題というか、仕様？

# 現象
新規プロジェクト作成時に最初からあるシーンでは配置したオブジェクトが暗い色で表示されることはないが、新たに作成したシーンでは暗い色で表示される。

# 原因
原因はWindow > Rendering > LightingSettings > (一番下)Auto Generate。
これはシーンごとの設定であり、最初からあるシーンではこれがONなのでライティングが即座に反映される。
しかし追加したシーンではこれがOFFなのでライティングが反映されていない。(unity2018までは既定値ONだったが、unity2019はOFFに変わった？)
Auto GenerateをONにしているとシーン移動のとき暗くなる問題が起きることが多かったようなので、仕様が変わったということなのかもしれない。

# 対策
Auto GenerateをONにするか、その横のGenerateLightingボタンを押す。
ラズパイを使ったnas作り(挑戦中)

ラズベリーパイに表示されたipアドレスを使いopenmediavaultの管理画面に飛べないのですが家のパソコンが無線だからいけないのでしょうか？ルーターにパスコンをじかに繋がないと管理画面が開けないなんてことあるのでしょうか？
リモートデスクトップ環境をUbuntu 18.04 LTSで作成する

リモートデスクトップで接続できるGUI環境をUbuntu 18.04 LTSで構築する手順です。

なぜそんなことをしようかと思ったかというと、新しいmac bookを買うお金がなかったのでクラウドにインスタンス作って時間単位で利用することにしました。

はじめてやったときは情報に溺れて大変だったので、ミニマムの手順を書き残しておきます。

## 利用したクラウドサービス
Google Compute Engine
ブートディスク：Ubuntu 18.04 LTS(amd64 bionic image built on 2019-05-30)

## 手順

UbuntuデスクトップとRDPサーバーをインストール

```bash
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install ubuntu-desktop xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp
```

ロケール/タイムゾーン設定

```bash
sudo apt-get -y install language-pack-ja
sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
sudo timedatectl set-timezone Asia/Tokyo
```

リモート接続用にユーザーを作成

```bash
sudo adduser your_user_name
sudo gpasswd -a your_user_name sudo
```

このまま接続すると `Authentication is required to create a color managed device.` というダイアログが表示されて進めないので、回避する設定を記載する。
参考: https://new.seei.biz/authentication-is-required-to-create-a-color-managed-device-in-xrdp/

```bash
$ cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla  
[Netowrkmanager]  
Identity=unix-user:*  
Action=org.freedesktop.color-manager.create-device  
ResultAny=no  
ResultInactive=no  
ResultActive=yes  
EOF
```

ここで再起動しておく

```bash
sudo reboot
```

## 接続確認
リモートデスクトップクライアントから接続します。
macからは、Microsoft Remote Desktop 8 を利用しました。
上記手順で作成したリモート接続用のユーザーで認証してください。

## おわりに
この手順だけリモートデスクトップ接続できるようになりました。

日本語入力をできるようにしたりなど、初期設定としてやりたいことはまだいろいろあるのですが、リモートデスクトップ接続できればあとはどうにでもなると思うのでここまでにします。
"情報をそしゃくする力"ってあるのかもしれない

# 情報は食べ物である
人が日々食べ物を食べて（そしゃくして）、エネルギーに変えて、体を形作っているように、
エンジニアは日々情報をそしゃくして、コードを書いて、プロダクトを作っていると言える。

エンジニアにとってそしゃく対象となる情報は幅広い。以下に分類してみた。

### 案件に固有のもの（自分が作成したものを含む）
 - 要件
 - 既存のコード
 - 既存のドキュメント
 - メンバーの意見

※「案件」＝自分が関わっているプロジェクト　くらいの意味にとっていただけるとありがたい。

### 案件と関係なく存在するもの
- 自分の中に存在するもの
    - 過去に書いたコード、プロダクト
    - その他の引き出し
    - 形になってないアイデア
- 他人の中に存在するもの
    - 世の中に存在するプロダクト、サービス、オープンソース
    - インターネッツの記事
    - 公式ドキュメント
    - 本
    - 勉強会etc...

# 人がもし無限の"情報をそしゃくする力"を持っていたら？
まずどんなライブラリのドキュメントを読んでも意味がわかる。必ずしも仔細はわかっていなくてもよくて、提供されている情報をそしゃくして自分のものにできているので、自分のプロダクトに正しく反映することができる。あるいはプロダクトに合わない/必要ないから、導入するのをやめる判断だってすることができる。

また、顧客が示した要件をまるっと理解できる。しかし必ずしも理解を示す必要はなく、要件をそしゃくしてみて、妥当でない箇所があれば顧客にそれを指摘することで、リスクを未然に防ぐことができる。

既存のコードをそしゃくすれば、リファクタリングもエンハンスも思いのままだ。（情報を無限にそしゃくする力を持つ人間の書いたコードに、リファクタリングの余地が残っているとは思えないが。）

世の中のサービスに目を向ければ、サービスをそしゃくして模倣することだってできるし、逆に今世の中に存在しないサービスを作り出すことだってできる。無限に"情報をそしゃくする"とは、そういうことだ。

かように、無限の"情報をそしゃくする力"を持つ人はまた、無限に近い生産性を有していることだろう。きっとバラ色のエンジニアライフを送っているに違いない。（それでもなおエンジニアを続けているかどうかは定かでないが。）

実際には、人の"情報をそしゃくする力"は有限であり、結果として「そしゃくできない」「自分のものにできない」情報が存在する。しかしそれを、"情報をそしゃくする力"を高めてそしゃくできるようになることで、人の生産性は上がるはずではないか。というのがこの記事の主旨である。


# 何をもって"情報をそしゃくする力"を高めたとするか、また、その方法は何か

これがわかれば苦労はしない、というのがこの記事の二番目の主旨である。自分も今よりもっと"情報をそしゃくする力"を高めたい。その方法が知りたい。

食べ物の食べ方を人から教わらないように、情報のそしゃくの仕方自体を、人から教わることもあまりないように思う。

また、情報というのは誰にでもわかることがよしとされ、どろっどろにそしゃく済みの情報が供されることも少なくないのだが、"そしゃくする力をつける"という観点では、これはためにならないだろう。

つまり、新人教育のような場面においては、段階的に少しずつ情報を固くしていってそしゃく力をつけさせることができれば、それは単にそしゃく済みの情報を与えるよりも、優れた教育カリキュラムとなる可能性がある。

ここまではわかっているのだが、その方法がわからない…「段階的に少しずつ情報を固くしていく」って、具体的にどうすればいいか全く想像がつかない。何かピンと来た方は、コメントをお願いします。自分がそしゃくできる程度の固さで！
OSバージョンを意識せずServiceをフォアグラウンド実行する方法

ほぼタイトルのままですが、Serviceをフォアグラウンド実行する際に、OSバージョンを意識せず実装する方法です。

何てことはないのですが、`ContextCompat`クラスに`startForegroundService(context, intent)`というメソッドがあるので、それを使うだけです。
[ContextCompat#startForegroundService(context, intent)](https://developer.android.com/reference/android/support/v4/content/ContextCompat.html#startForegroundService(android.content.Context,%20android.content.Intent))

処理としては、OSバージョンによって`context.startForegroundService(intent)`と`context.startService(intent)`を呼び分けています。

```java:ContextCompat.java
/**
 * startForegroundService() was introduced in O, just call startService
 * for before O.
 *
 * @param context Context to start Service from.
 * @param intent The description of the Service to start.
 *
 * @see Context#startForegroundService(Intent)
 * @see Context#startService(Intent)
 */
public static void startForegroundService(@NonNull Context context, @NonNull Intent intent) {
    if (Build.VERSION.SDK_INT >= 26) {
        context.startForegroundService(intent);
    } else {
        // Pre-O behavior.
        context.startService(intent);
    }
}
```
malleability問題について

###malleability問題
---
トランザクション展性、トランザクション・マレアビリティ問題とはビットコイン全体における脆弱性の一つである。実際に世界最大の仮想通貨取引所であったマウントゴックスの攻撃にも利用されたとされている。簡単にいうと***ハッシュを変えた同等のトランザクションを本来のトランザクションよりも先にブロックに取り込むことで"トランザクションがブロックチェーンに取り込まれないまま彷徨っているように監督者に見せる"***ことでトランザクションを何度も再送することができたのである。つまり、第三者によってトランザクションIDが書き換えられてしまうのである。
>https://bitcoin.peryaudo.org/malleability.html
#方法
txIDの生成の際にINPUTとOUTPUTを合わせたデータをハッシュにするわけだが、これを意味を変えずに改竄しようとするのは不可能に近い(ハッシュ関数の不可逆性)従って***"重要でないデータに手を加える"***ことで、意味はほぼ同じデータが完成する。この方法で、もし取引所が顧客による引出履歴をtxIdで管理している場合、一度作成したtxIdを改ざんすることで、あたかもそのトランザクションがビットコイン・ネットワークに承認されてないかのように取引所側に見せかけることが出来てしまう。
>https://btcnews.jp/3j4cddby12067/
#改善策
Segwitを用いた対策
下記の記事で簡単にまとめています。
https://qiita.com/shoukitsuda0310/items/e8b07229e8c98e46635e
Leetcode #226: Invert Binary Tree

Solution 1: Recursively

```swift
func invertTree(_ root: TreeNode?) -> TreeNode? {
    if root == nil {
        return nil
    }
    if root?.left == nil && root?.right == nil {
        return root
    }
    var rightNode = root?.right
    var leftNode = root?.left
    root?.left = invertTree(rightNode)
    root?.right = invertTree(leftNode)
    return root
}
```

Solution 2: Iteratively

```swift
func invertTree(_ root: TreeNode?) -> TreeNode? {
    if root == nil {
        return nil
    }
    var queue = [root!]
    while !queue.isEmpty {
        let current = queue.removeFirst()
        let tmp = current.left
        current.left = current.right
        current.right = tmp
        if current.left != nil {
            queue.append(current.left!)
        }
        if current.right != nil {
            queue.append(current.right!)
        }
    }
    return root
}
```
<input>要素を使うときにおすすめする属性

入力フォームを作成するときは、`<input>`要素を使うかと思います。
ユーザからなにかを情報を入力してもらうときには、入力のしやすいフォームでなければなりません。
そこで、&lt;input&gt;要素を使う場面に応じておすすめする属性を紹介していきます。

## 年齢を入力してもらうとき
年齢確認の際に必要なもので、お申し込みフォームや登録フォームなどで年齢を入力してもらう機会があります。
数値（年齢）を入力してもらうときは、`type="number"`属性を使うことで数値を入力してもらうことができるのですが、最初から入力に制限をかけることができます。

```form.html
<input type="number" min="18">
```

**これで、18歳以下の方はこのフォームに入力できなくなりました。**
`min`属性とは別に、`max`属性という制限のかけ方もあります。
`max`属性は`max`属性で設定した値以上の入力を制限することができるようになります。

## 入力フォームに漏れがあったとき
どうしても入力してもらいたい情報（名前など）があったとします。
その場合に、フォームに入力漏れがあった状態でボタンをクリックされても別のページに移動せずに、そのページのまま注意喚起してくれるのが`required`属性です。

```form.html
<form action="xxx.php" method="post">
  <input type="text" required>
  <input type="submit" value="送信">
</form>
```

これで、ユーザの入力漏れで送信ボタンを押したとしても、自動でページの移動を阻止してくれます。

## 番外編（管理者・ユーザそれぞれ別操作）
例えば、管理者とユーザの二種類の悪性タイプが存在するとします。
その場合、管理者は入力フォームに入力できますが、ユーザからは閲覧・コピーのみの動作しかしてほしくない場合と仮定します。
そのときに使うべきなのが、`readonly`属性です。
※PHPを使います

```form.php
<?php
const ADMINISTRATOR = 1; // 管理者
const USER = 2;          // ユーザ
?>

<input type="text" 
<?php
if (defined('USER')) { // ユーザをチェック
  readonly
}
?>
>
```

こうすることで、ユーザからは入力操作はできず読み取り専用とすることができます。
これは、`<textarea></textarea>`でも有効です。
SpringBootのテストを書く際のアノテーションのメモ

# 概要
SpringBootのテストで使用する各アノテーションの簡単なメモと参考リンク
JUnit5を使用

# 試行時に使用したライブラリ

```build.gradle
testImplementation('org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE'){
		exclude module: 'junit'
	}
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.2'
```
# 参考文献
- [SpringBoot Reference Doc. 2.1.5.RELEASE](https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-testing)
- [JUnit5 ユーザーガイド](https://oohira.github.io/junit5-doc-jp/user-guide/)

# @SpringBootTest
DIコンテナにBeanとして登録するコンポーネントをテストしたり、mock化する場合に宣言する

- DIコンテナ（`ApplicationContext`）を生成する
 - これをつけないとテストしたいクラスを`@Autowired`できない
- `webEnvironment`属性を設定するとテスト実行時にサーバーを立ち上げる
 - デフォルトだとサーバーを立ち上げずに、Mock Web環境を提供


[46.3 Testing Spring Boot Applications](https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications)

# @WebMvcTest
`@Controller`や`@RestController`のテストをする場合に宣言する

- `@Controller`コンポーネントのみを対象にDIコンテナ（`ApplicationContext`）を生成する
- `MockMvc`を`@Autowired`できるようにしてくれる

[46.3.10 Auto-configured Spring MVC Tests](https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-mvc-tests)

# @RestClientTest
Http通信するコンポーネントをテストする場合に宣言する

- `MockRestServiceServer`を`@Autowired`できるようにしてくれる

[46.3.20 Auto-configured REST Clients](https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-client)
Django逆引きチートシート（Model編）

## テーブルの設定
### テーブル名を設定したい
モデルクラスのMetaクラスに記述する

```models.py
from django.db import models 

class Product(models.Model):
    ### 略 ###

    class Meta:
        db_table = "products" # テーブル名を指定
```

## カラムの定義
### カラムを定義したい
モデルクラスに記述する

```models.py
from django.db import models 

class Product(models.Model):
    # *Field()でカラム名(name)と型(text)を設定する
    name = models.TextField()
```

| データ | DB(postgresql)のカラム型 | 書き方 |
| --- | --- | --- |
| 自動採番(4byte整数) | `serial` | `AutoField()` |
| ４byte整数 | `integer` | `IntegerField()` |
| 精度付き実数 | `numeric(<精度>, <桁数>)` | `DecimalField(max_digits=<精度>, decimal_places=<桁数>)`|
| 日付 | `date` | `DateField()` |
| 時刻 | `time` | `TimeField()` |
| 日付＋時刻 | `timestamp` | `DateTimeField()` |
| テキスト（文字数制限なし）
) | `text` | `TextField()` |
| 文字列（文字数制限あり）| `character varying(<文字数>)` | `CharField(max_length=<文字数>)` |
| 論理値 | `boolean` | `BooleanField()` |

### 主キー（プライマリキー）を設定したい
フィールド定義のキーワード引数で`primary_key=True`とする

### 一意性制約を設定したい
フィールド定義のキーワード引数で`unique=True`とする

### NOT NULL制約をオフにしたい
フィールド定義のキーワード引数で`null=True`とする

### デフォルト値を設定したい
フィールド定義のキーワード引数で`default=<デフォルト値>`とする

### 〜〜区分、〜〜コードなどを設定したい
フィールド定義のキーワード引数で`choises=[("01", "登録"), ("02", "解除"), ("03", "取消")]`のようにタプルのリストを指定する

### インデックスを作成したい
フィールド定義のキーワード引数で`index=True`とする

### データベースのカラム名を指定した
フィールド定義のキーワード引数で`db_column=<カラム名>`とする

### insertのときに自動で登録タイムスタンプが入るようにしたい
- カラム定義は`DateTimeField`を使用する
- フィールド定義のキーワード引数で`auto_now_add=True`とする

### updateのときに自動で更新タイムスタンプが入るようにしたい
- カラム定義は`DateTimeField`を使用する
- フィールド定義のキーワード引数で`auto_now=True`とする

## 関連の定義
### 1:1関連を設定したい
モデルクラスに記述する

```models.py
from django.db import models 

class OrderDetail(models.Model):  
    # このようにOneToOneField()でカラム名(変数名をproductとすればカラム名はproduct_idとなる)を設定する
    product = models.OneToOneField(Product, on_delete=models.CASCADE) 
```

### 1:N関連を設定したい
モデルクラスに記述する（`N`側に`1`側エンティティの外部キーを設定する）

```models.py
from django.db import models 

class OrderDetail(models.Model):  
    # ForeignKey()でカラム名(変数名をorderとすればカラム名はorder_idとなる)を設定する
    order = models.ForeignKey(Order, on_delete=models.CASCADE) 
```
Goのポインタ・メモリ・アドレス

# メモリ
変数や関数をどんどん突っ込んでいくことができる大きな箱のようなものです。

```go
func main() {
// 定義した変数はメモリに保管される
 memo := "メモです"
 date := 20190611
}

```


# アドレス

メモリ空間の中にある一つ一つ番地ののことです。
それぞれの番地にある処理、データを読み込んで実行します。
その名のとおり、メモリ空間それぞれの住所のようなものです。

## 定義した変数のアドレスを見てみる

```go
func main() {
// 定義した変数はメモリに保管される
 memo := "メモです"
 date := 20190611

// memoとdateが補完されているアドレスを表示する
 fmt.Println(&memo)
 fmt.Println(&date)
}

// memoのアドレス
0xc000092030 

// dateのアドレス
0xc000094000
```


# ポインタ

アドレスを変数として保管することができるメモリを作成するのに使用します。


```go 
func main(){
 memo := "メモです"
 date := 20190611

// ポインタを使用することでメモリにmemoとdateのアドレスを保管することができる。
 var pointer *string = &memo
 var pointer2 *int = &date

 fmt.Println(pointer)
 fmt.Println(pointer2)

// memoのアドレス
0xc000092030 

// dateのアドレス
0xc000094000


// ポインタのアドレスも見てみる
 fmt.Println(&pointer)
 fmt.Println(&pointer2)

// pointerのアドレス
0xc00000e010

// pointer2のアドレス
0xc00000e018
}

```

`pointer`と`poiner2`は**アドレスを保管している変数**なので、`memo` `date`のアドレスとは違っていますね。

## アドレスからメモリを参照する

```go
func main(){
 memo := "メモです"
 date := 20190611

 var pointer *string = &memo
 var pointer2 *int = &date

 fmt.Println(*pointer)
 fmt.Println(*pointer2)
}
// fmt.Println(*pointer)の結果
 メモです

// fmt.Println(*pointer2)の結果
 20190611
```

`pointer`変数には`memo`のアドレスが格納されています。
そのため、 `*pointer`としてあげることでアドレスに関連するメモリの中身を参照することができます。
Linux grepコマンドと正規表現

###grepコマンド
ファイルの中からデータを検索する。
|(パイプ)grepとすることで標準入力から入ったデータに対して検索を行うことができる。

```grep [オプション] 検索条件 [指定ファイル]```

###正規表現

正規表現を用いることでより高度な検索をすることができる。

>
^ →行頭を表す
$ →行末を表す
. →任意の一字を意味する
* →直前文字の 0 回以上の繰り返しを意味する
[...] →.. の中の任意の一字を意味する
[^...] →.. の文字が含まれないことを意味する。
¥ →正規表現の記号をエスケープする。

ex)

```
$ grep ^xy /etc/*
:
/etc/services:xyplex-mux 173/tcp
```

上記のコマンドは/etc配下にあるファイルで行頭がxyで始まるものを検索している。


###オプション

-e
文字列を検索パターンとして扱う

-i
検索パターンと入力ファイルの双方で英大文字と小文字の区別をしない

-v
検索パターンとマッチしなかった行を選択する

ex)

```
$ grep -i hostname /etc/*
(/etc ディレクトリにある、大文字または小文字の hostname という文字列を含むファイル)
/etc/rc.sysinit: HOSTNAME=localhost
（略）
/etc/rc.sysinit: # Reset the hostname.
（略）
$ grep abc /etc/* | grep -v tcp
(/etc ディレクトリにある、 abc という文字列を含むが tcp という文字列は含まないファイル)
（略）
/etc/services:abcvoice-port 3781/udp # ABCvoice server port
```


またよく使う例として、標準出力に対してgrepで検索をかけることが多い。
ex)

```
$ ls /usr/bin/ | grep -e d$
:
:
xxd
yppasswd
```

/user/binにあるコマンドを一覧表示（標準出力）し、その中からファイル名がdで終わるファイルを検索している。
SwiftUI サンプルコード（フリマアプリ）

# 概要
* SwiftUIのサンプルコード
    * Home : 商品一覧画面（Grid）
    * List : 商品一覧画面（List）
    * Detail : 商品詳細画面

# UI
![](https://github.com/menomoto/SwiftUI_sample/blob/master/Auction/auction.gif?raw=true)

# github
https://github.com/menomoto/SwiftUI_sample/tree/master/Auction

# 課題
* Tabbarにアイコンとテキスト（「Home」など）の両方を表示することができない？
* Homeの旧CollectionViewのようなUIは 「ScrollView + StackView」 で実装しているが微妙。
    * [ListStyle](https://stackoverflow.com/questions/56474019/how-to-change-liststyle-in-list)でCollectionViewのスタイルは無い？
Leetcode #189: Rotate Array

```swift
func rotate(_ nums: inout [Int], _ k: Int) {
    if nums.isEmpty {
        return
    }
    let k = k % nums.count
    var count = 0
    for i in stride(from: 0, to: nums.count, by: 1) {
        var index = i
        var previous = nums[i]
        repeat {
            let tmp = nums[index]
            nums[index] = previous
            previous = tmp
            index = (index + k) % nums.count
            count += 1
        } while index != i
        nums[index] = previous
        if count == nums.count {
            break
        }
    }
}
```
Weblogicのコンソールを日本語表記にしたいときの対応方法

プロジェクトメンバでWeblogicのコンソールが英語なのが自分だけであることに気が付きました。
英語はできないので日本語にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/6f4db529-7a4d-a5fa-ffe0-3b7a45ed314e.png)

- 環境
    - Windows10 64bit
    - Chrome

# 1.Chromeの設定で日本語を設定する
1. Chromeの設定ページを開く
2. [詳細設定▼]を開く
3. [言語] > 言語の一覧 > [日本語]の横にある![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/19641700-aa38-4812-dd84-1265c4fe0412.png)をクリック
4. [トップに移動]で一覧の一番上に[日本語]を持ってくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/4327b1c0-8e2e-832e-a288-ad0d0d31a99a.png)

# 2.Weblogicのコンソールページをリロードすると日本語になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/7c7b5791-dbf3-929b-8371-75da231149d9.png)
Leetcode #219: Contains Duplicate II

```swift
func containsNearbyDuplicate(_ nums: [Int], _ k: Int) -> Bool {
    var dict = [Int: Int]()
    for (index, num) in nums.enumerated() {
        if let value = dict[num] {
            if abs(value-index) <= k {
                return true
            }
            dict[num] = index
        } else {
            dict[num] = index
        }
    }
    return false
}
```
ActiveSupportのHash拡張のsliceの挙動を誤認した

```ruby

names_hash = {a: "alice", b: "bob", c: "charlie", d: "dave", e: "eve"}
valid_keys = [:a,:b,:c,:d]
names_hash.slice(valid_keys)
# => {}
```

こんな感じのコードを書いて「あれれ〜期待した通り動かないぞ〜」とか言ってハマってしまった。

原因は`slice`の引数にあって[公式ドキュメント](https://apidock.com/rails/ActiveSupport/CoreExtensions/Hash/Slice)のサンプルコードが↓だったので

```ruby
def search(criteria = {})
  assert_valid_keys(:mass, :velocity, :time)
end

search(options.slice(:mass, :velocity, :time))
# search(options.slice([:mass, :velocity, :time])) と等価だと思ってた
```

引数に配列を渡してやれば自動展開されるだろうと期待したら実はそうじゃなくてちゃんとArray渡すときはこうしろよ！って書かれてた。

```ruby
valid_keys = [:mass, :velocity, :time]
search(options.slice(*valid_keys))
```

[rails/activesupport/lib/active_support/core_ext/hash/slice.rb](https://github.com/rails/rails/blob/4dcb46182a4aaa57f44f3eb722c1db54fa0ff843/activesupport/lib/active_support/core_ext/hash/slice.rb)のコードを確認したらArrayかどうかではなく展開された可変長引数を受け取るようになっていた。



なので自動展開は当然されず、当然与えられた引数はただの配列なので常に`false`が返ってしまい`{}`となったということでした。

```ruby
has_key?([:a,:b,:c,:d])
# => false
```

なのでちゃんと展開した状態で渡してあげるように修正をしたところ期待した値がちゃんと取れました。
ちゃんちゃん。

```ruby
names_hash.slice(*[:a,:b,:c,:d])
=> {:a=>"alice", :b=>"bob", :c=>"charlie", :d=>"dave"}
```

## まとめ

公式ドキュメントはちゃんと最後まで目を通そう。
そして、こういう凡ミスすると型がほしいなという気持ちになる。
[PostgreSQL] あるスキーマの名前に . を含むインデックスを削除する

# やりたいこと

とある事情で名前に `.` を含むインデックスが存在した。これを削除したい。

# 例

`myschema` というスキーマの `girls` テーブルに存在する `myprefix.index_girls_on_room_no` という名前のインデックスを削除する。

```sql
mydb=# DROP INDEX myschema.myprefix.index_girls_on_room_no; -- in public schema
ERROR:  cross-database references are not implemented

mydb=# SET search_path TO myschema;
mydb=# DROP INDEX myprefix.index_girls_on_room_no; -- in myschema schema
ERROR:  schema "myprefix" does not exist
```

:sob:

```sql
mydb=# DROP INDEX myschema."myprefix.index_girls_on_room_no";
```

インデックス名を `""` でくくると成功した :tada:
Leetcode #216: Combination Sum III

```swift
func combinationSum3(_ k: Int, _ n: Int) -> [[Int]] {
    var answer = [[Int]]()
    var combination = [Int]()
    helper(k, n, 1, &combination, &answer)
    return answer
}

private func helper(_ k: Int, _ n: Int, _ index: Int, _ combination: inout [Int], _ answer: inout [[Int]]) {
    if k == 0 {
        if n == 0 {
            answer.append(combination)
        }
        return
    }
    for i in stride(from: index, through: 9, by: 1) {
        combination.append(i)
        helper(k-1, n-i, i+1, &combination, &answer)
        combination.removeLast()
    }
}
```
rails new コマンドで最小構成のAPIをつくるときのメモ

# はじめに
Railsで最小構成のAPIサーバーを作りたいときの自分用メモ

# 環境
- Rails 5.2

# rails new コマンド
不要なものはskipさせる

```
$ rails new <アプリ名> --database=postgresql --api --skip-yarn --skip-action-mailer --skip-active-storage --skip-action-cable --skip-sprockets --skip-javascript --skip-turbolinks --skip-test --skip-bundle
```

# さいごに
Railsはフルスタックなフレームワークといわれているけど、APIサーバーもサクッと建てられるので便利