OmniAICreator/Qiita-1.07M huggingface dataset:
AWS初めてメモ

# 2019年AWS Innovate AWSomeDayの個人的なまとめ。

## なんでクラウド？
オンプレミスと比べて。。。

- 調達という作業工程が無い。
- サイジングを考えなくても後でスケーリングできる。
- バースト時にも自動でサイジングできる。
- データセンターレベルの耐障害性とかはAWS側で考えるから不要。

以下、AWSの基本と大事な単語だけ。

## 基本、仮想サーバ周り

### リージョン
データセンターのグループみたいなもの。
システム構築時はリージョンを指定する必要がある。
リージョンには2つ以上のAZが配置されている。

### AZ(Availability Zone)
AWSのデータセンターだと思えばよさそう。
各AZは地理的、設備的に独立しており複数のAZで1リージョンを構成することで可用性を上げている。
後述するVPCとかはAZをまたがってネットワークが組めるため、
AZを意識するシーンではAZを跨ってリソース配置する必要がある。

### VPC(Amazon Virtual Private Cloud)
仮想プライベートネットワークサービス。
DMZを作ったり、ACLでトラフィック制御等もできる。

### EC2(Amazon Elastic Compute Cloud)
Cが2個でEC2。PaaSサービス。時間単位でのサーバ貸し。
インスタンスタイプという名前でタイプが分かれている。
M5とかなら汎用的、CPU最適化のC5とか、メモリ最適化だったり、ハイIOとかだったり。

### ELB(Elastic Load Balancing)
仮想ロードバランサー。
L7でロードバランスするALB(ApplicationLoadBalancer)
L4でロードバランスするNLB(NetworkLoadBalancer)から選ぶ。
リクエスト単位ならALB、パケット単位でバーストが激しいならL4選ぶということだと思う。

### Amazon EC2 AutoScaling
EC2を特定の条件(平均CPU使用率や時刻等)でスケールアウト、スケールインする仕組み。
状況監視を行うAmazonCloudWatchにトリガを仕掛けてELBも含めてスケールするとかできる。

## ストレージ、DB
### EBS(Amazon Elastic Block Store)
EC2のローカルストレージだと思えばよい。
スナップショットがとれたり、自動でAZ内でレプリケートされたりオンプレとは微妙に違う。
また、EC2と同様ボリュームタイプがあり、SSDでIO優先にしたりバリエーションも出せる。

### S3(Amazon Simple Storage Service)
HTTP/HTTPSでアクセスするストレージサービス。
堅牢性イレブンナインと言われたらこれのこと。リージョン内のAZ3箇所にレプリケートして担保しているらしい。
EBSのスナップショットやEC2のOSイメージとかもここに入れてたりするらしい。

### RDS(Amazon Relational Database)
RDBのクラウドサービス。DBインスタンス生成までをフルマネージドで提供する。
現時点でサポートしているDBMSは以下6つ。
Aurora/Oracle/SQLServer/MySQL/PostgreSQL/MariaDB
自動バックアップがデフォルトで有効になっており、最大35日まで保持される。
手動の場合はいつもどおりダンプをS3に置くことになる。
AZを跨いだレプリケート(マルチAZ)もデフォルトで実施しており、可用性考慮もおまかせ。

## セキュリティの基礎
### VPCのネットワーク制御機能
**ネットワークACL**
VPCのサブネットに対して設定可能なACL機能
**セキュリティグループ**
AWSの各種サービスリソースに対して設定するセキュリティ設定方法。
ロールのような概念で複数のセキュリティ設定を名前をつけて登録、インスタンスに関連付ける。
また、インスタンスに設定したセキュリティグループを指定して、セキュリティグループ同士での設定も行える。

### IAM(AWS Identity and Access Management)
AWSの管理コンソールのアカウント(課金アカウント)とは別の概念。
IAMポリシー(権限)をAWSリソースやIAMアカウント、IAMロールに紐付けることで権限管理を行う機能。
ユーザとかではなくAWSリソースに権限をつける（例えばS3更新されたらラムダを蹴るみたいなことをする場合に人ではなくS3バケットに特定のラムダを蹴る権限を付与してAWSリソース側に認可を寄せてしまうとか）等独特の考え方がありそう。
また、フェデレーティッドユーザ(他の認証サービスを利用したSSOで認証されたユーザ)の管理もIAMでやるらしい。

## AWS Well-Architected Framework
過去事例から作成したQA形式の設計ベストプラクティス集。
こういうものがあるということを知ることが大事。
ベストプラクティスに沿っていない場合にどのようなリスクが考えられるのかとかを把握するために一読したほうがよさそう。
[AWS Well-Architected](https://aws.amazon.com/jp/architecture/well-architected/)
Unityで映像制作Tips（3Dキャラクターモデル編）

#自己紹介
こんにちはゆずです。@Yuzu_Unity


#はじめに
今回はUnityというよりは3DCGのお話です。

#目次
1.[アニメーションのローパスフィルター](#アニメーションのローパスフィルター)
2.[ブレンドシェイプ式関節補助](#ブレンドシェイプ式関節補助)
3.[テクスチャブレンド機能](#テクスチャブレンド機能)

##アニメーションのローパスフィルター
Neuron等のモーションキャプチャー等を利用すると
加速度センサーの読み取りは途切れ途切れでノイズがあるため
動きがカクカクになる場合があります。なのでローパスフィルターを通します。
※なお動きが滑らかになるのでやりすぎは注意

Unityには線形補完する関数があるためそれを用います。
Vector3.Lerp　
Quaternion.Lerp

???.Lerp(前フレームの値,現在のフレームの値,保管数値（0～1）)
保管数値にはTime.deltaTime×好きなfloat値
実際に動かして調整するといいと思います。

```c#:TransformLowPass.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformLowPass : MonoBehaviour
{
    public float value;
    public Transform[] bone;
    private Vector3[] tmppos;
    private Quaternion[] tmprot;

    // Start is called before the first frame update
    void Start()
    {
        tmppos = new Vector3[bone.Length];
        tmprot = new Quaternion[bone.Length];
         for(int i=0; i<bone.Length; i++)
        {
            tmppos[i] = bone[i].localPosition;
            tmprot[i] = bone[i].localRotation;
        }
    }
    
    private void LateUpdate()
    {
        for (int i = 0; i < bone.Length; i++)
        {
            tmppos[i] =Vector3.Lerp(tmppos[i], bone[i].localPosition,value*Time.deltaTime);
            tmprot[i] =Quaternion.Lerp(tmprot[i], bone[i].localRotation,value*Time.deltaTime);

            bone[i].localPosition = tmppos[i];
            bone[i].localRotation = tmprot[i];
        }
    }
}
```

##ブレンドシェイプ式関節補助
3DCGでは関節などに補助ボーンを入れたりして
関節のねじれを修正したり回転時の縮小を直したりします。

Unityにおけるねじれ
UnityのHumanoidにはねじれ対策として
自動的に親に回転値を渡す仕組みがあります。
90度以上ねじれると破綻しますが、それ以下の動きの場合なら
自前で補助ボーンを必要としないといった利点があります。
なので今回はねじれは対策を行いません。


関節の出っ張りをブレンドシェイプ式でなおす。
崩壊3rdでも使われているようですが、関節を曲げた時のメッシュを用意し
それをブレンドシェイプとして設定し曲げ具合によりブレンドします。
(崩壊3rdでは45度90度の二つのブレンドシェイプを用意しているようです。)
補助ボーンを作成するより完成したモデルがあるならコストはないので採用します。

ボーンの回転値に合わせてブレンドシェイプを制御します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ブレンドシェイプ式補助 <a href="https://t.co/IfRNL8Hofx">pic.twitter.com/IfRNL8Hofx</a></p>&mdash; ゆず (@Yuzu_Unity) <a href="https://twitter.com/Yuzu_Unity/status/1124610102193819649?ref_src=twsrc%5Etfw">2019年5月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##テクスチャブレンド機能

基本的には以前の記事を用います。
このパラメータをブレンドシェイプの値で操作します。
https://qiita.com/Yuzu_Unity/items/2c4e0a19b8fc8dd64209

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">テクスチャブレンド機能 <a href="https://t.co/WAnUMIVqD0">pic.twitter.com/WAnUMIVqD0</a></p>&mdash; ゆず (@Yuzu_Unity) <a href="https://twitter.com/Yuzu_Unity/status/1124610203658285059?ref_src=twsrc%5Etfw">2019年5月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#まとめ
DCCツールではある機能がUnityではないといったことはよくありますが、
Unityではスクリプトが作成しやすいのでその機能を簡単に作れるのがいいですね。
S3のプロパティの活用

S3のプロパティについて、まとめて観た。

[Amazon S3](https://qiita.com/leomaro7/items/e6bfc93f03ca4235f14a) で基本について書いているのでこちらも参考に。

##1.バージョンニング##

バージョン管理して複数のバージョンを確認する

##2.サーバアクセスログ記録##

バケットのアクセスに対するログを取得することができます。

なお、記録する際は以下のことが推奨されている。

- 単一のAWSアカウント
- 同じリージョン　※ログ記録が有効になっている場合、ログはソースバケットと同じ AWS リージョンのバケットに保存されます。
- ソースバケットとターゲットバケットは異なるものにする

[Amazon S3 サーバーアクセスのログ記録](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/ServerLogs.html#LogDeliveryBestEffort)


##3.Static website hosting##

静的ウェブホスティングサイトを作成する。

[独自ドメインを使用して、静的ウェブサイトを作成する（Route 53 + S3）](https://qiita.com/leomaro7/items/2afc2336b8d6da829dbe)

##4.オブジェクトレベルのログ記録##

オブジェクト単位でログを有効化して記録することができる。（有料）

##5.デフォルト暗号化##

バケットのオブジェクトに対してデフォルトで暗号化をかける。

[AWS S3デフォルト暗号化をやってみた](https://qiita.com/leomaro7/items/ac2263f07a3635bd6359)

##6.オブジェクトのロック##

削除ができないように設定する。バケットを作るときに作成する必要がある。

##7.Tags##

タグを作成して、管理する。

##8.Transfer acceleration##

エッジロケーションを使って、高速でクライアントとデータのやりとりをする。

- クライアントと S3 バケットの間で長距離にわたるファイル転送を高速、簡単、安全に行えるようにするバケットレベルの機能。
- Amazon CloudFront の世界中に点在するエッジロケーションを利用する。
- エッジロケーションに到着したデータは、最適化されたネットワークパスで Amazon S3 にルーティングされる。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/transfer-acceleration.html

##9.Event##

SNS,SQS,Lambdaを使って連動する。

##10.リクエスタ支払い##

データを使う側に支払ってもらう。
【超初心者向け】OS(Ubuntu,CentOS etc.)とWebサーバ(Apache,Nginx etc.)と開発言語(PHP,Ruby etc.)の関係

#内容
この記事では初心者向け（非エンジニア向け）にOSとWEBサーバと開発言語の関係についてザックリと図解します。

#背景
私はプログラミング初心者なのですが、独学非エンジニアなので体系だった知識がなく、変な所で検索ワードが分からなく迷宮入りしたりすることがしばしばあります。

今回背景としてこのような状況になり、そもそもNginxとOSの関係ってなに？となったので自分の頭の整理様に書きます。

- 自作ツールをHerokuからレンタルサーバーに移したいな
- テスト環境にもう一つサーバ借りるの何がいいのかな？
- sshできるレンタルサーバーと出来ないレンタルサーバー、PHPしか使えないサーバーどう違うんだ？


#図解
細かいことが間違っているかも知れませんが、僕と同じく初学者の方にはApacheとかNginxとかよく聞くけど、それがWEBサーバー（HTTPサーバー）というものであること、そしてその立ち位置を理解してもらう手助けになれば嬉しいです。OSや開発言語の話しってローカルでいじってると結構出てくるけど、意外にWEBサーバーの話しがでない気がしています。
<img width="592" alt="スクリーンショット 2019-05-04 18.16.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244525/43634cfa-c3c0-a410-56b6-39941a397964.png">

#これ読んだら理解できる
私の拙い図をさっとみてなんとなく分類ができたら詳しいことはこの2つの記事を読みましょう笑
https://knowledge.sakura.ad.jp/7938/
https://shared-blog.kddi-web.com/server/18/


#その他
ssh、FTPでのファイルの上げ方の違いや、レンタルとVPSとクラウドなどサーバー提供の仕方の違いについてはたくさん初心者向けの記事があるので、そこらへんもあやふやな初心者同盟の皆さんは別の記事で見てみてください。
flashメッセージが表示しない

####flashメッセージでハマりました。覚書として書きます。

環境：
Rails 5.2.3
Ruby 2.6.2

```ruby:tasks_controller.rb
// 省略
    if @task.save
      redirect_to tasks_path, success: "タスクを投稿しました"
    else
      render :new
    end
// 省略
```
```ruby:views/tasks/index.htnl.erb
<%= flash[:success] %>
// 省略
```
どんなにがんばってもflashメッセージが表示せず。
そんな時の[現場Rails!](https://book.mynavi.jp/ec/products/detail/id=93905)
>redirect_toのオプションに直接渡すことのできるFlashのキー（名前）は、デフォルトでは:noticeと:alertのみ

今回のようにsuccessというキーだと以下のようにする必要があった。

```ruby:tasks_controller.rb
// 省略
    if @task.save
      redirect_to tasks_path, flash: {success: "タスクを投稿しました"}
    else
      render :new
    end
// 省略
```
これで無事解決！
Nuxt2.6でTypescriptを使ってみる

#はじめに
Nuxt2.6でTypescriptに対応されたようです。

今までは`nuxt-ts`を使ってTypescriptに対応していました
Nuxt2.6からはTypescriptに対応されたので、`nuxt`でできるということ！
実際に使ってみました。

#0.環境

下記のバージョンで動作しています。

```
$ npm -version
6.9.0

$ node -v
12.1.0

$ nvm --version
0.34.0
```

#1.初期化

`nuxt-sample`というフォルダを作成して、`npm install`で`package.json`を作成します。

```
$ mkdir nuxt-sample
$ cd nuxt-sample

$ npm init
```

#2.npxインストール

npxをインストールされていない方は、下記のようにインストールしてください。

```
$ npm install -g npx
```

#3.create-nuxt-app

Nuxt.js プロジェクトの雛形を作成します。

```
$ npx create-nuxt-app
```

自分の環境では、`nuxt`のバージョンが2.4になっていました。
バージョンを2.6へ上げてみたいと思います。

#5.ncuをインストールする

nuxtのバージョンを上げるために`npm-check-updates`をインストールします。

```
$ npm install -g npm-check-updates
```

#6.nuxtのバージョンを2.6へ更新する

`ncu`を使用して、`nuxt`を更新しましょう。

```
$ ncu    //更新するものを確認する
$ ncu -u //package.jsonを更新する
$ npm install //更新したものをインストールする
```

#7. Typescriptをインストール
必要なものをインストールします。

```
$ npm install typescript ts-node @nuxt/typescript vue-property-decorator
```

#8. tsconfig.jsonの作成

`nuxt-sample/tsconfig.json`を作成します。

```tsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "types": [
      "@types/node",
      "@nuxt/vue-app"
    ],
    "paths": { "@/*": [ "./*" ], "~/*": [ "./*" ] },
    "experimentalDecorators": true   
  },
}
```

#9. nuxt.config.tsへ変更
`nuxt.config.js`から`nuxt.config.ts`へ変更します。

中身は下記のように変更します。

```nuxt.config.ts
import NuxtConfiguration from '@nuxt/config'

const config: NuxtConfiguration = {
  // Type or Press `Ctrl + Space` for autocompletion
}

export default config
```

#10 Typescriptへ変更

`script`に`lang="ts"`とつけると、typescriptとして使えます。
`nuxt-sample/pages/index.vue`を下記のように変更します。

```index.vue
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import Logo from '~/components/Logo.vue'

@Component({
  components: {
    Logo
  }
})
export default class Index extends Vue {
}
</script>
```

`nuxt-sample/components/Logo.vue`に下記を追加します。

```Logo.vue
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component
export default class Logo extends Vue {
}
</script>
```

#11. 動作

ローカルホスト上で動作してみましょう。

```
npm run dev
```

`http://localhost:3000/`へアクセスすると、NuxtがTypescriptで動作しています。

<img width="913" alt="nuxt.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317035/9f15a431-d8db-3e5c-1a9c-5632f77b1a51.png">


#おわりに
最初の設定をクリアするとtypescriptとして動作するようになるので、nuxtも使いやすくなりますね。
node.jsはバージョンによって動作しないことが多いので、バージョンをしっかりと管理することが大事かと思います。
php-master-changes 2019-05-03

今日は interbase 非バンドル化にともなう pdo_firebird のテスト修正、不要なファイルの削除、リクエストメソッドをビルトインサーバのログへ含めるようにする修正、typo の修正があった！

# 2019-05-03
## KalleZ: Rewrite PDO_Firebird tests to not depend on ext/interbase
- https://github.com/php/php-src/commit/c9599c1c726e3bce8ce5a80c1ac8ee2c81bffb61
- [7.4~]
- ext/pdo_firebird のテストを[非バンドル化された](https://qiita.com/sj-i/items/bed28b55a4d4e58e5f99#kallez-move-extinterbase-to-pecldatabaseinterbase) ext/interbase に依存しないよう修正

## KalleZ: PDO_Firebird test update, round 2
- https://github.com/php/php-src/commit/1c893b89bdb2b8bd5608c14cd0930727db6ba409
- [7.4~]
- ↑の続き

## peter279k: Remove test-pcntl script
- https://github.com/php/php-src/commit/826e4aca59c778cb8ea8926e3ea8dbd6c81c9253
- [7.4~]
- ext/pcntl で、使われていない test-pcntl.php を削除

## simonwelsh: Include the request method in CLI server logs
- https://github.com/php/php-src/commit/6e3438bc62ad453259e8372dae3975cb80780546
- [7.4~]
- sapi/cli で、リクエストメソッドをビルトインサーバのログへ含めるよう修正

## KalleZ: NEWS
- https://github.com/php/php-src/commit/fdb16f8c20bf19046027facf14c9caa00b79167c
- [7.4~]
- ↑の NEWS への追記

## cmb69: Fix comment
- https://github.com/php/php-src/commit/508892e266a97ffbe2a18233d8cf4c964400e675
- [7.4~]
- ext/curl で、コメントのバージョン表記の typo を修正
php-master-changes 2019-05-02

この日は interbase の非バンドル化、アロー関数の実装マージ、CURL_VERSION_* の定数サポートを追加する修正があった！

# 2019-05-02
## KalleZ: Move ext/interbase to pecl/database/interbase
- https://github.com/php/php-src/commit/b458fcb87f8759c18e9cfe48bc54a9ce96eedf94
- [7.4~]
- ext/interbase を[バンドル拡張から外し PECL へ移動](https://wiki.php.net/rfc/deprecate-and-remove-ext-interbase)

## KalleZ: Remove this leftover
- https://github.com/php/php-src/commit/26c96f9e8d5c06ab9463ab88b9dc6651183d2d3a
- ext/interbase の残ってたファイルの削除

## KalleZ: NEWS for ext/interbase unbundling
- https://github.com/php/php-src/commit/c8a20dfdcaff52a2d43114305f4e4fd5f8c08140
- [7.4~]
- NEWS に interbase 非バンドル化のむね追記

## KalleZ: Fix typo
- https://github.com/php/php-src/commit/9cbf5ebf8baaa2a150a606a251ff52a6986951f6
- [7.4~]
- typo の修正

## KalleZ: Remove some more interbase leftovers
- https://github.com/php/php-src/commit/eaab0a2b6f6f61bc0b8c42579a74a626b179a070
- [7.4~]
- interbase の残骸の削除

## KalleZ: Okay, too quick to merge, these are only relevant to 7.4
- https://github.com/php/php-src/commit/421846611143ef64951dba4f887ce65a77768e84
- interbase についての変更の記述は 8.0 用のドキュメントには必要なかったので削除

## cmb69: Don't try to disable the already removed ext/interbase
- https://github.com/php/php-src/commit/fe9165449ddc2195a9489b678c78b7d95c812e78
- AppVeyor で interbase 無効化の記述を削除（拡張自体がバンドルされなくなったので）

## nikic: Implement arrow functions
- https://github.com/php/php-src/commit/f3e5bbe6f37ce52a9ecd42812389e6aaf3aa2892
- [7.4~]
- 先日 51:8 で受理された[アロー関数](https://wiki.php.net/rfc/arrow_functions_v2)の実装マージ

## phansys: Add more missing CURL_VERSION_* constants
- https://github.com/php/php-src/commit/6b73e692c976bdfdc710741cd983a9b33c13b3e7
- [7.3~]
- ext/curl で、足りなかった CURL_VERSION_* の定数サポートの追加
ExpressのRoutingをネストして書くためのライブラリー作ったので共有


Expressで以下のように、loginしてるかどうか、adminかどうかをチェックする認証のミドルウェアを挟みたい場合に、以下のように記述していました。

ただ、Expressのミドルウェアは記述の順番に依存して、正しく認証が機能しているかどうか、上から読んでいかなければならず可読性が低いと感じました。

```typescript:users-router.ts

const express = require('express');
const usersRouter = express.Router();


usersRouter.use('/users', [ isLoginGuard ]);
usersRouter.get('/users/:id', find);
usersRouter.put('*', isAdminGuard);
usersRouter.put(':id', update)
usersRouter.post(':id', isAdminGuard)
usersRouter.post(':id', create)
usersRouter.delete(':id', isAdminGuard)
usersRouter.delete(':id', destroy)



```

なので、以下のようにネストして記述できる routingBuilder という関数を作ってみました。
ネストさせることで見通しがよくなり、ミドルウェアの範囲が一目瞭然になります。

```typescript:users-router.ts
const express = require('express');
const usersRouter = express.Router();

routingBuilder(usersRouter, builder => {
    // /users配下全てに isLoginGuard ミドルウェアーを適用
    builder.use('/users', [isLoginGuard], builder => {
        
        builder.get('/:id', find); // Get /users/:id にfindミドルウェアを適用
        
        // PUT /users/* 配下 全てに isAdminGuard ミドルウェアーを適用
        builder.put('*', [isAdminGuard], builder => {
            // PUT /users/:id に update ミドルウェアを適用
            builder.put('/:id', update);
        });

        // POST /users/* 配下 全てに isAdminGuard ミドルウェアーを適用
        builder.post('*', [isAdminGuard], builder => {
            // POST /users/:id に create ミドルウェアを適用
            builder.post('/', create);
        });

        // DELETE /users/* 配下 全てに isAdminGuard ミドルウェアーを適用
        builder.delete('*', [isAdminGuard], builder => {
            // DELETE /users/:id に create ミドルウェアを適用
            builder.delete('/:id', [destroy]);
        });

    });
});

```

ソースコード
https://github.com/programmerkgit/routing-builder

`npm install routing-builder`でインストールできます。
rubyでカレンダーを作ろう

rubyでカレンダーを作ってみました。

<b>仕様</b>
・カレンダーは日曜日から始まり土曜日で終わる。
・年と月を引数として受け取り、その月のカレンダーを返す。

<b>僕のコード</b>

```rb
require 'date'
TRANSLATE_MONTH = {
  1 => 'January',
  2 => 'Feburary',
  3 => 'March',
  4 => 'April',
  5 => 'May',
  6 => 'June',
  7 => 'July',
  8 => 'August',
  9 => 'September',
  10 => 'October',
  11 => 'November',
  12 => 'December'
}

WEEK_DAY = {
  0 => 'Sun ',
  1 => 'Mon ',
  2 => 'Tue ',
  3 => 'Wed ',
  4 => 'Thu ',
  5 => 'Fri ',
  6 => 'Sat'
}

def make_calendar(year,month)
  start_day = Date.new(year,month,1)
  end_day = Date.new(year,month,-1)

  puts "\t#{TRANSLATE_MONTH[month]} #{year}"
  
  WEEK_DAY.each do |key,value|
    if Sat?(key)
      puts value
    else
      print value
    end
  end

  (start_day..end_day).each do |d|
    if d.day == 1
      if Sat?(d.wday)
        puts "#{d.day.to_s.rjust(space(d.wday))} "
      else
        print "#{d.day.to_s.rjust(space(d.wday))} "
      end
    else
      if d.day >= 10
        if Sat?(d.wday)
          puts one_space(d.day)
        else
          print one_space(d.day)
        end
      else
        if Sat?(d.wday)
          puts two_space(d.day)
        else
          print two_space(d.day)
        end
      end
    end
  end
end

#曜日ごとに異なるスペースを渡す
def space(d)
  4 * (d + 1) - 1
end

#土曜日ならtrueを返す
def Sat?(d)
  d == 6
end

#一文字スペースを作る
def one_space(d)
   " #{d} "
end

#2文字スペースを作る
def two_space(d)
   "  #{d} "
end
```

<b>苦労した点</b>
・1日は曜日に合わせて左側に空白を作らないといけないところ
・数字間を揃えたいため、1~9と10~では左側の空白の度合いを変えたところ
・上記の２つ+土曜日なら改行させるという合計３つの条件分岐があったので全体的に似たようなコードがあるように思われる。

<b>まとめ</b>
実はこれ作るのに午前中いっぱい使いました、、、（泣)
まだまだ改善の余地はあるだろうけど、やはり出来た時の感動は素晴らしい!!!!!

<b>追記</b>
皆さんのアドバイスにより改良したコードを載せます。

```rb
require 'date'
TRANSLATE_MONTH = {
  1 => 'January',
  2 => 'Feburary',
  3 => 'March',
  4 => 'April',
  5 => 'May',
  6 => 'June',
  7 => 'July',
  8 => 'August',
  9 => 'September',
  10 => 'October',
  11 => 'November',
  12 => 'December'
}

WEEK_DAY = {
  0 => 'Sun ',
  1 => 'Mon ',
  2 => 'Tue ',
  3 => 'Wed ',
  4 => 'Thu ',
  5 => 'Fri ',
  6 => 'Sat'
}

def make_calendar(year,month)
  first_day = Date.new(year,month,1)
  second_day = Date.new(year,month,2)
  end_day = Date.new(year,month,-1)

  puts "\t#{TRANSLATE_MONTH[month]} #{year}"

  WEEK_DAY.each do |key,value|
    print value
    puts if sat?(key)
  end

  print "#{'1'.rjust(space(first_day.wday))} "
  puts if sat?(first_day.wday)

  (second_day..end_day).each do |d|
    print "%3d" % d.day
    if sat?(d.wday)
      puts
    else
      print ' '
    end
  end
end

#曜日ごとに異なるスペースを渡す
def space(d)
  4 * (d + 1) - 1
end

#土曜日ならtrueを返す
def sat?(d)
  d == 6
end
```

if修飾子を使い、DRYになるように意識しました。。
Raspberry Pi Zero WHに接続した物理ボタン（LCD HAT）にキーバインドする方法

# 対象
以下のジョイスティック＋ボタンのついたデバイスへのキーバインドの方法を記載しています。

ラズパイ用 1.3インチ IPS液晶 - 240×240解像度/SPI接続/LCD HAT（ドライバ：ST7789）
https://www.amazon.co.jp/dp/B07KVMK2DZ

# 手順
## 必要なシェルスクリプトを取得
以下のシェルスクリプトをコピーして、ラズパイにretrogame.shとして保存してください。

https://github.com/adafruit/Raspberry-Pi-Installer-Scripts/blob/master/retrogame.sh

## 取得したシェルスクリプトの実行
```
sudo bash retrogame.sh
```

スクリプト実行後、どの製品を使用しているか問われますので、6番の`6. Six buttons + joystick`を選択してください。
（ボタンは3つしかありませんが、この製品を選択できないので仕方なく`6. Six buttons + joystick`を選択します）

その後、再起動を求められますので再起動します。

## 必要な設定
`/boot/retrogame.cfg`を設定します。
ここに記載されている内容は左から、キーボードの該当するキー、ラズパイのピン番号、コメントです。

例えば以下のように設定すると、ジョイスティックのキーがそれぞれ上下左右のキーボードにバインドされ、KEY3（ピン番号16番）がENTERにバインドされます。
 
```
LEFT       5  # Joypad left
RIGHT     26  # Joypad right
UP         6  # Joypad up
DOWN      19  # Joypad down
#LEFTCTRL  4  # 'A' button
#LEFTALT  25  # 'B' button
#Z        11  # 'X' button
#X        21  # 'Y' button
#GND       6  # Spare ground point for 'Y' button
#SPACE    16  # 'Select' button
ENTER     16  # 'Start' button
#ESC   16 26  # Hold Start+Select to exit ROM
```

PIN番号はマニュアルに記載していますが、必要な部分だけを以下に抜粋しました。
https://www.waveshare.com/w/upload/6/6b/1.3inch_lcd_hat_user_manual_en.pdf

| PIN | Raspberry Pi | Description |
|:-------:|:-------:|:--------:|
|KEY1|P21|Button 1GPIO|
|KEY2|P20|Button 2GPIO|
|KEY3|P16|Button 3GPIO|
|Joystick Up|P6|Joystick up|
|Joystick Down|P19|Joystick down|
|Joystick Left|P5|Joystick left|
|Joystick Right|P26|Joystick right|
|Joystick Press|P13|Joystick press|





# 関連
Raspberry Pi Zero WHにディスプレイを接続し、デスクトップ画面を表示する方法
https://qiita.com/hanzawak/items/0788aefc281a0363c3a0
【PowerApps】DatePicker(日付の選択)コントロールで得られる日付データの形式がアプリ実行環境により異なる

# はじめに

いつ頃かを境に、PowerAppsアプリをWeb版とAndroidアプリ版のいずれで実行するかによって、DatePicker(日付の選択コントロール)で得られる日付データの形式が以下の通り異なるようになっていた。

### Web版の場合は`yyyy年M月d日`形式となる

- PowerAppsアプリ画面  
DatePickerに表示されている日付形式が`yyyy年M月d日`となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/d21438f0-5637-8495-d99e-2690c3c543b1.png)

- FlowのPowerAppsトリガー側への出力結果画面  
PowerAppsでDatePickerで取得しFlowへ出力した日付データ（「argtndata_入力」の値）の形式が`yyyy年M月d日`となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/bfc0ad8b-2816-14fc-cd1c-b76fbd99d72b.png)

### Androidアプリ版の場合は`yyyy/MM/dd`形式となる

- アプリ画面  
DatePickerに表示されている日付形式が`yyyy/MM/dd`となっている。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/2a4331da-fc04-7eac-62fc-f8b1c5419594.png" width=70%>

- FlowのPowerAppsトリガー側への出力結果画面  
PowerAppsでDatePickerで取得しFlowへ出力した日付データ（「argtndata_入力」の値）の形式が`yyyy/MM/dd`となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/04af681c-c09e-ac02-1674-0765148835cc.png)

# 影響

Flow側でPowerAppsから出力された日付データに対して文字列位置をもとに年だけ・月だけ・日だけを取り出す処理（`substring`関数など）をしている場合は、Web版からのアプリ実行時にDatePickerで一桁月や一桁日の日付を選択した際の文字列位置がアプリ版の場合と異なるため、年・月・日の取得に失敗する。

例えば、アプリ実行時にDatePickerで一桁月や一桁日の日付（例：2019/5/4）を選択した場合、Web版では`2019年5月4日`、Androidアプリ版では`2019/05/04`が取得される。

よって、日付データから月だけを取得するための関数を`substring(＜日付データ＞,5,2)`としている場合は、Web版で実行時は`5月`、Androidアプリ版で実行時は`05`が取得され、アプリの実行環境によって取得される値が異なってしまう。

ここで、月を取得する関数に`formatDateTime(＜日付データ＞,'MM')`を利用した場合は、いずれの環境でアプリを実行しても`05`が取得できる。

# 結論

特段の理由がない場合は、Web版とAndroidアプリ版のいずれでの実行にも堪えうるように、Flowでの日付データからの年だけ・月だけ・日だけの取得には`formatDateTime`関数を利用するべきである。
Leetcode #69: Sqrt(x)

Use binary search 

```swift
func mySqrt(_ x: Int) -> Int {
    if x <= 1 {
        return x
    }
    var start = 0
    var end = x
    while start <= end {
        var mid = (start + end) / 2
        if x / mid == mid {
            return mid
        } else if x / mid < mid {
            end = mid - 1
        } else {
            start = mid + 1
        }
    }
    return end
}
```
Alfred3 おすすめワークフロー 7選 + 1

Macの初期設定で最初に入れるアプリがAlfred3という程Alfredが好きです。
業務でとても助けられている、おすすめAlfredワークフローを紹介します。

# 1. [Quick Translate](https://github.com/nkmr-jp/alfred-quick-translate)
Google翻訳を手軽にAlfredのランチャーから利用できます。
テキスト入力からの翻訳だけでなく、選択範囲からの翻訳とかも出来ます。
こちらのQiita記事でも紹介されています。開発ありがとうございます！
https://qiita.com/nkmr_jp/items/ee47d0ef7f39816062a8

![quick translate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/792fa1ea-3efc-15d3-0479-1ea265312867.gif)

# 2. [Fakeum](https://github.com/deanishe/alfred-fakeum)

フォームの入力データのテスト、カンプのあて字、単体テストのダミーテキストを入力する際にとても便利。
名前、住所、電話番号、パラグラフと入力したい形式に合わせたダミーテキストを簡単に生成、クリップボードにコピーしてくれます。
localを設定することで、日本語対応も簡単です。
裏でPythonの[Facker](https://github.com/joke2k/faker)を使っているので、それに合わせてクエリを投げればOK。

![fakenum.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/ff3a8375-fdb6-ceac-c259-54e844fee766.gif)


# 3. [TinyPNG](http://www.packal.org/workflow/tinypng)
画像圧縮でお馴染みにの[TinyPNG](https://tinypng.com/)をAlfredのランチャー上から実行できます。
ファイルを選択して、ランチャーからTinyPNGを実行するだけ。しばらく待つと、同ディレクトリに圧縮画像がダウンロードされます。
最高に便利。

![tinypng.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/b8ae0958-5307-9536-ce8a-5a5fc74ca62b.gif)


# 4. [alfred-emoji](https://github.com/sindresorhus/alfred-emoj)
エンジニアのコミュニケーションに欠かせない絵文字。その絵文字をAlfredのランチャー上から簡単に検索、クリップボードへのコピペが出来ます。
なんと入力テキストからDeepLearningで関連する絵文字を探してくれるという優れもの。無駄に凄い。

![emoji.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/bf31f1f8-b17b-46ad-144d-c43d241a1d1b.gif)

# 5. [alfred-terminalfinder](https://github.com/LeEnno/alfred-terminalfinder)
Finderで開いているディレクトリをターミナルで開きたい（またはその逆）というシチュエーションは結構あると思います。
そんな時に便利なのがこのworkflowsしかも、標準でiTerm2と、pathFinderにも対応しています。

![fi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/b757bb19-4a1d-5546-50ce-c1cf8a9c7768.gif)

# 6. [Font Awesome](https://github.com/ruedap/alfred-font-awesome-workflow)
Font AwesomeのアイコンをAlfredのランチャー上から検索、貼り付けできます。
コピー形式が多数選べて、文字コードからCSSのclass名、イラレ、フォトショでそのまま貼り付けできるデータなども取得出来ます。

![fa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/85e929da-9685-8369-f6a8-03b16b3abe2f.gif)


# 7. [Dash](https://github.com/Kapeli/Dash-Alfred-Workflow)
様々なAPIリファレンスをまとめるDashをAlfred上からインクリメントに検索できます。
コードリーディングで知らないメソッドを見つけた時に、高速で検索できるのでとても便利。
Dashでドキュメントを追加すると言語ごとのAlfredの検索キーワードが自動的に追加されます。

![dash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/6ee225db-c4a7-a116-de97-d32075bc45da.gif)


# + 1 [alfred-workflows](https://github.com/zenorocha/alfred-workflows)
最後に+αで紹介するのが「alfred-workflows」。そののまんま便利なworkflowsを一括でインストールできるおまとめworkflowsです。
とりあえずこれ入れとけば大抵OK。こちらで紹介したworkflowsの一部も自動で入ります。

# 終わりに
以上、Alfred3 おすすめWorkflows7選+αでした。
その他にも、おすすめのWorkflowsあれば是非コメント等で教えて頂きたいです！！
Leetcode #70: Climbing Stairs

Solution: dynamic programming

Time Complexity: O(n)
Space Complexity: O(n)

```swift
func climbStairs(_ n: Int) -> Int {
    if n == 1 {
        return 1
    }
    if n == 2 {
        return 2
    }
    var dp = Array(repeating: 1, count: n+1)
    dp[1] = 1
    dp[2] = 2
    for i in 3...n {
        dp[i] = dp[i-1] + dp[i-2]
    }
    return dp[n]
}
```
ハック技術: KaliLinux on Docker

「[#ゆるいハッキング大会](https://twitter.com/hashtag/%E3%82%86%E3%82%8B%E3%81%84%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E5%A4%A7%E4%BC%9A )」に参加した。
ハッキング熱が高まった。

「[ハッキング・ラボのつくりかた](https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%A9%E3%83%9C%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%8B%E3%81%9F-%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E4%BD%93%E9%A8%93%E5%AD%A6%E7%BF%92-IPUSIRON/dp/4798155306)」を勢いで購入。

今回は、KaliLinuxのセットアップ。

## お約束
本記事は、
・防御の為に敵の攻撃を知る
・技術力向上
を目的としている為、記載内容を悪用する事は禁じます。
記載内容を実行した結果として生じた全ての事に、私は一切責任を負いません。

## セットアップ

### 0.自分のノートPC
　HP HP Spectre x360 Convertible 13-ac0XX/827E, BIOS F.31 04/27/2017
　Linux dsnote 4.15.0-48-generic #51~16.04.1-Ubuntu SMP Fri Apr 5 12:01:12 UTC 2019 x86_64 GNU/Linux

### 1. Kali on Docker 環境構築
#####・docker kali linux

```
 $ git clone https://github.com/tmxak/kali-linux-docker
 $ cd kali-linux-docker
 $ sudo docker build -t kali-docker .
 $ sudo docker run -it -d --rm --name kali kali-docker /bin/bash
 $ sudo docker exec -it kali /bin/bash
 # apt-get update && apt-get install kali-linux kali-linux-wireless kali-linux-top10
 # exit
 $ sudo docker commit <container id> my-kali-linux:1
 $ sudo docker run -it -d --rm --name kali --net="host" --privileged my-kali-linux:1 /bin/bash
```
　(https://unix.stackexchange.com/questions/381155/how-to-get-access-to-host-wifi-interface-from-docker-container
 
　dockerの場合は、カーネルはホストカーネルを利用している為、コンテナ側ではドライバ設定は不要。
　ホスト側でドライバ設定。

### おわり
次は、
[ハック技術: Windows7ハック #1 Vagrant VirtualBoxで環境セットアップ編 (on Ubuntu) - Qiita](https://qiita.com/rivarten/items/414ddb9173d6afae3d6b)
#Django の shell で モデルをオートロードする方法

# pip

```
pip install django-extensions
```

# settings

```
INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
)
```

# exe

```
./manage.py shell_plus
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1618








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
datePickerDialog の使い方 - kotlin

# 概要
ボタンタップで datePicker を表示するやり方をメモ。

# activity_main.xml
ボタンを配置。

```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="datePicker" android:id="@+id/btn"/>

</androidx.appcompat.widget.LinearLayoutCompat>
```

# MainActivity.kt
- ボタンタップで datePicker 表示
- 日付選択したらトースト表示

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val calender = Calendar.getInstance()
        val year = calender.get(Calendar.YEAR)
        val month = calender.get(Calendar.MONTH)
        val day = calender.get(Calendar.DAY_OF_MONTH)

        btn.setOnClickListener {
            val dtp = DatePickerDialog(this,DatePickerDialog.OnDateSetListener{view,y,m,d ->
                Toast.makeText(this, "日付を選択しました"+y+m+d,Toast.LENGTH_LONG).show()
                }, year,month,day
            )
            dtp.show()
        }
    }
```
Swift Q&A集

swiftに関するよくある質問をまとめてみました。
##Double型を使用した際、小数点以下の桁数が不安定に表示されるのですが、どうすれば直りますか？
表示の問題なので、基本的には気にする必要はない。
気になる場合は、小数点の桁数を揃えるなどして表示してあげるのが１つ方法としてある。
>ex)ラベルにnumberの数字を表示させる処理を書く際に、
label.text = String(number)
ではなく、
label.text = String(format: “%.2f”, number)
としてあげると、＊小数点以下の桁数を揃えて表示＊できる (.2というのが小数点以下の桁数を表す)！

あとは、以下のリンクのように、四捨五入や切り捨てを使う手もいいかもしれない。
https://picolica.com/2017/02/23/swift3-ceil-floor/

##@IBOutletと@IBActionの違いはなんですか？
@IBOutlet
>変数varに対してつける。(静的)
自分がおいたUIパーツに名前をつけるイメージ。

@IBAction
>関数funcに対してつける。(動的)
関数(=複数の処理をまとめたものに名前をつけたもの)をButtonなどのアクションを起こす系のパーツに紐づけるイメージ。

**IBの意味と必要性について**
>IBとは、Interface Builderの略で、文字通りアプリのインターフェースを構築するツールを指す。
iPhoneやiPadでは、さまざまなアプリで共通する画面や共通するボタンをがある。Appleでは、どんなアプリでも共通した操作性を実現できるようにUIKitというフレームワークが用意されている。これによりiOSアプリは、ユーザーが直感的に扱える、操作性の高いものとなっている。

>しかし、なぜ共通した操作性があった方がよいのか？

>例えば「スイッチ」というものをイメージしてみると、人によっていろんなデザインの「スイッチ」が思い浮かぶが、その中にはとても斬新なデザインの「スイッチ」があるかもしれない。
でも、その斬新なデザインは一見すると他の人には「スイッチ」と分からないかもしれないし、そういうデザインは、どのように操作するのかも分かりにくい。直感的に操作できるアプリは、誰が見ても分かるデザインの部材によって構成されている。そしてAppleは、ユーザーにとって操作性の良いアプリを開発者が生み出しやすいように上述したUIKitを用意したのである。

>UIとはユーザー・インターフェースの略だが、UIKitはボタン、スイッチ、スライダー、ラベルといったものから、文章、画像、地図、Webページなどさまざまなユーザーインターフェースの部材を扱っている。
こうしたアプリを構成する部材を便宜的にオブジェクトと表現し、このUIに関するオブジェクトをグラフィカルに組み合わせて、アプリの画面を設計するツールがまさにInterfaceBuilderである。
##
dotnetでcsharpのプログラムを動かしてみた。

# 概要

https://twitter.com/gtk2k/status/1124520356826402816
このツイットが目に止まった。

で、やってみようとしたら、色々詰まったので、メモがてら記事を書こうと思います。

## 流れ

mcsでexe作成 -> monoで実行
unityで利用くらいはしてた。

xcodeでbundle作ってリンクとかもしてた。

exe作成で攻めようと思ったらリンクが詰まったので、dotnetsdk使ってプロジェクトを作って作成の方向に進んでみた。

で、一応問題のプログラムが実行できたので、めでたしめでたしという流れ

## 環境メモ

MacOS Mojave 10.14.4

```
$ mono --version
Mono JIT compiler version 5.20.1.19
$ nuget
NuGet Version: 4.7.0.5148
$ dotnet --version
2.2.106
```

# mcsで失敗した話

とりあえず、csharpのライブラリを使うコードを書くのが初めてでよくわからなかったので、調べてみた。
問題のコードは、Json.Netが必要らしいので、それを使うコードをまず書こうと思う。

で、どうやらnugetというのを使うといいらしい。

```
$ brew install nuget
```
brewでnugetを入手。
monoは初めからbrewで入れてた

nugetを使った開発をテストするために
https://qiita.com/aosho235/items/a1a31201c49b86081806
この記事を参考に、せめてみた。

```
$ nuget install RestSharp
```
を実行したら、RestSharp.106.6.9が入った。
lib/net452とlib/netstandard2.0の2つがあるけど
記事を参考にnet452を使って動作させたら、ちゃんと動作した。

続いてJson.Netをnugetで入手してみた。
(注：本来はNewtonsoft.Jsonを使うべきでした)

```
$ nuget install Json.Net
```

するとlib/netstandard2.0のみ入ってました。
ん？

同じようにリンクさせたところ、コンパイルエラーが発生してどうしても次に進めませんでした。

ここでmonoで実行するのはギブアップ
(注：Newtonsoft.Jsonには、lib/net20 35 40 45...とあるので、このまま進めても行けた公算が高いです。)

# dotnetsdkでやってみた話

```
$ brew cask install dotnet-sdk
```
すると、/usr/local/share/dotnet/dotnetが実行したいコマンドになるので、pathを通しておく

```
$ export PATH=/usr/local/share/dotnet/:$PATH
```

## プロジェクトを作っていく

```
$ cd ~/Documents/csharp/
$ mkdir youtubeURLTest
$ cd youtubeURLTest
$ dotnet new console
```

## Newtonsoft.Jsonを追加する。

```
$ dotnet add package Newtonsoft.Json
```

## コードを追加

あとは、youtubeurl.csというファイルを作って
https://gist.github.com/gtk2k/4de29765b3f08bba21b8b39be7e9e980
これをコピペ

Program.csを

```
using System;
using System.Threading.Tasks;

namespace nugetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            AsyncMethod().Wait();
        }
        private static async Task<int> AsyncMethod()
        {
            Console.WriteLine("Hello World!");
            var urls = await YoutubeURL.Get("EGGAOgWXQVs");
            Console.WriteLine(urls.Formats.Length);
            Console.WriteLine(urls.Formats[0]["url"]);
            Console.WriteLine("Done!");
            return 1;
        }
    }
}
```
こんな感じにする。

## 実行

```
$ dotnet run
```

で、実行したら、なんらかのデータが取得できた。

# mcsリトライ

おまけ、mcsでコンパイルしてみた。

## コンパイルして

```
$ nuget install Newtonsoft.Json
$ export MONO_PATH=./Newtonsoft.Json.12.0.2/lib/net45/
$ mcs -r:./Newtonsoft.Json.12.0.2/lib/net45/Newtonsoft.Json.dll Program.cs youtubeurl.cs
```

これでProgram.exeができた。

## 実行

```
$ mono Program.exe
```

で、同じことが一応できた。

おしまい。
sumyを使って青空文庫を要約してみる

# sumyを使って青空文庫を要約してみる

## TL;DR

テキスト要約モジュールである[sumy](https://github.com/miso-belica/sumy)を使って青空文庫の書籍を要約してみました。

`sumy`を使う部分は[け日記 - Python: LexRankで日本語の記事を要約する](https://ohke.hateblo.jp/entry/2018/11/17/230000)を参考にさせていただきました。
同記事ではTokenizerに`Janome`を使用していますが、今回は[ginza(spacy)](https://github.com/megagonlabs/ginza)を使用しています。

### 実行環境

* Python 3.6.8
* sumy 0.7.0
* ginza(spacy) 1.0.2
* beautifulsoup4 4.7.1

## ソースコード

### spacyのロード

```python
import spacy

nlp = spacy.load('ja_ginza_nopn')
```

### 青空文庫のスクレイピング

```python
from urllib import request
from bs4 import BeautifulSoup
import bs4

# urlに要約対象とする書籍のURLを指定します。以下は「だしの取り方 by 北大路魯山人」のURLです。
url = 'https://www.aozora.gr.jp/cards/001403/files/49986_37674.html'
html = request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
body = soup.select('.main_text')
```

```python
text = ''
for b in body[0]:
    if type(b) == bs4.element.NavigableString:
        text += b
        continue
    # ルビの場合、フリガナは対象にせずに、漢字のみ使用します。
    text += ''.join([e.text for e in b.find_all('rb')])
```

### 分析用コーパスの準備

活用などで表記が異なると違う単語として計算されてしまうため、分析用コーパスではレンマ化します。

```python
corpus = []
originals = []
doc = nlp(text)
for s in doc.sents:
    originals.append(s)
    tokens = []
    for t in s:
        tokens.append(t.lemma_)
    corpus.append(' '.join(tokens))

print(len(corpus))
print(len(originals))
```

### sumyによる要約

```python
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer

# 連結したcorpusを再度tinysegmenterでトークナイズさせる
parser = PlaintextParser.from_string(''.join(corpus), Tokenizer('japanese'))

summarizer = LexRankSummarizer()
summarizer.stop_words = [' ']  # スペースも1単語として認識されるため、ストップワードにすることで除外する

# sentencres_countに要約後の文の数を指定します。
summary = summarizer(document=parser.document, sentences_count=3)

# 元の文を表示
for sentence in summary:
    print(originals[corpus.index(sentence.__str__())])
```

## まとめ

`だしの取り方 by 北大路魯山人`を3行で要約すると以下のようになりました。良いだしを取るためには、鉋(かんな)から準備しましょう。

```
どんなふうに削ったのがいいだしになるかというと、削ったかつおぶしがまるで雁皮紙のごとく薄く、ガラスのように光沢のあるものでなければならない。
現在、鉋でかつおぶしを削っているのは料理屋のみであって、たいがいは道具もなくて我慢しているようである。
鉋があっても、切れない場合が多いし、それを使用して削れないと思うくらいなら、日本料理をやめた方がいい。
```

`蜘蛛の糸 by 芥川龍之介`の場合は以下のとおりです。

```
陀多は両手を蜘蛛の糸にからみながら、ここへ来てから何年にも出した事のない声で、「しめた。
ところがふと気がつきますと、蜘蛛の糸の下の方には、数限もない罪人たちが、自分ののぼった後をつけて、まるで蟻の行列のように、やはり上へ上へ一心によじのぼって来るではございませんか。
が、そう云う中にも、罪人たちは何百となく何千となく、まっ暗な血の池の底から、うようよと這い上って、細く光っている蜘蛛の糸を、一列になりながら、せっせとのぼって参ります。
```

## 参考文献

* [け日記 - Python: LexRankで日本語の記事を要約する](https://ohke.hateblo.jp/entry/2018/11/17/230000)
* [sumy](https://github.com/miso-belica/sumy)
* [ginza(spacy)](https://github.com/megagonlabs/ginza)
R01〜R02 にかけての首都圏の技術書同人イベント

令和元年〜二年あたりの首都圏の技術系（が参加できそうな）同人誌即売会を、ウェブでざっと探すとこんな感じだった。ちょっと平成も入っている。イベントのウェブサイトは表の下。

|イベント開催日|サークル参加〆切|イベント名
|:--|:--|:--|
|2019/04/06	|3月？	|おもしろ同人誌バザール＠東京六本木|
|2019/04/14	|1/31	|技術書典６＠東京池袋|
|2019/04/28	|1/10	|(M3-2019春)＠東京平和島|
|2019/05/03	|4月？	|銭けっと２＠埼玉川口|
|2019/05/06	|10/27	|(文芸フリマ東京 28＠東京平和島)|
|2019/05/12	|3/12	|コミティア128＠東京青海（≠ 梅）|
|2019/06/27	|5/7	|サンクリ2019 Summer＠東京池袋|
|2019/07/12	|4/24	|技書博＠東京蒲田|
|2019/08/12	|2/20	|コミケ96＠東京有明|
|2019/08/25	|6/18	|コミティア129＠東京青海（≠ 梅）|
|2019/10/27	|6月上	|(M3-2019秋)＠東京平和島|
|2019/10？	|7月?	|技術書典７？|
|2019/11/3	|9月？	|サンクリ2019 Autumn＠東京池袋|
|2019/11/24	|8/19	|(文芸フリマ東京 29＠東京平和島)|
|2019/11/24	|9/17	|コミティア130＠東京青海（≠ 梅）|
|2019/11/	|9月？	|おもしろ同人誌バザール＠神保町|
|2019/12/31	|8月	|コミケ97＠東京有明|
|2020/03/01	|1月？	|(M3-2020春)＠東京平和島|
|2020/03？	|1月？	|サンクリ2020 Spring？＠東京池袋|
|2020/02？	|1月？	|コミティア131？＠東京青海（≠ 梅）|
|2020/05/上	|12月？	|コミケ98コミティア132＠東京有明|
|2020/06？	|4月？	|サンクリ2020 Summer？＠東京池袋|
|2020/11？	|9月？	|サンクリ2020 Autumn？＠東京池袋|
|2020/12/31	|8月？	|コミケ99＠東京有明|
|2021/08/	|2月？	|コミケ100＠東京有明|

- [おもしろ同人誌バザール](http://hanmoto1.wixsite.com/omojin)
- [技術書典](https://techbookfest.org)
- [Ｍ３](http://www.m3net.jp)
- [銭けっと](https://zeniket.jimdofree.com)
- [文芸フリマ](https://bunfree.net)
- [コミティア](https://www.comitia.co.jp)
- [サンクリ](http://www.creation.gr.jp)
- [技書博](https://gishohaku.dev)
- [コミックマーケット](https://www.comiket.co.jp)
Chromeでファイルのダウンロードが終了したら自動でシャットダウン

以下のとおりに`shutdown-on-download-complete.sh`ファイルを作成し`sudo bash shutdown-on-download-complete.sh`実行するとダウンロードが完了次第自動でシャットダウンします。

```bash:shutdown-on-download-complete.sh
source ~/.config/user-dirs.dirs

while [ -f $XDG_DOWNLOAD_DIR/*.crdownload ]
do
  sleep 1
done

systemctl poweroff -i
```

# メモ
```bash
wget https://gist.githubusercontent.com/GitHub30/e269254548fa9ef7eba43eb464f0e310/raw/0c012689c7a1aae1c6fa0522facaac4d1ea862a1/shutdown-on-download-complete.sh \
    && bash shutdown-on-download-complete.sh
```
初心者がpython Anaconda GUIで、簡単にOpenCVをインストールしてみる

## 背景
pythonで画像検出をやってみたいと思い、いろいろ調べていたところ、OpenCVを使うのが良さそう。ということで、まずは、opencvを使う環境を整えます。

## 環境
MacOS Mojave ver10.14.4
Anaconda Navigator 1.9.7
※Anacondaのインストールは、[こちら](https://qiita.com/satoshi-iwaki/items/e431b4182e50a2918a17)を参考にさせていただきました


## 手順
##### Anacondaの起動
メニュー画面から、Anacondaを起動します。
![スクリーンショット 2019-05-04 15.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288322/5c2289c1-129f-01d6-f70b-7602bdd25de6.png)

##### 環境設定
Anacondaを起動したら、左のメニューバーの「Enviroment」を開きます。
![スクリーンショット 2019-05-04 15.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288322/99e22ade-5da8-a10a-c32d-6093db1da50c.png)

・インストールしたい環境を選択
・「Not Installed」を選択
・検索窓（Search Packages)に、「opencv」と入力
![スクリーンショット 2019-05-04 15.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288322/3fd40e60-3ade-2773-b0e0-b9f84db1431e.png)

・opencvの左横のチェックボックスをチェックする
・画面右下の「Apply」で決定
![スクリーンショット 2019-05-04 15.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288322/95442162-257d-3064-0908-780340a813f6.png)

・関連パッケージが表示されるので、「Apply」で決定
・しばらく待つと、インストール完了！
![スクリーンショット 2019-05-04 15.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288322/f2a8429b-cb12-8ec4-2c91-710249e9c226.png)

## 確認
・「Installed」を選択すると、「opencv」がインストールされているのが確認できます
![スクリーンショット 2019-05-04 15.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288322/ee7ad4d8-cf9f-77e1-a317-359510c4c6c8.png)

・また、JupiterNotebookを開いて、下記を実行するとエラー無く、読み込まれていることが分かります。

```python
import cv2 as opcv
print(opcv.__version__)
#3.4.2（←実行結果）
```

## 終わりに
Anacondaを使用して、OpenCVをインストールできました！
これで、OpenCVで画像解析ライフが満喫できます！！
[Flutter] 令和を初めて、WindowsでDesktop Embedding使ってみた。

皆様こんにちは～～令和！始まりました
令和最初のポストはFlutterです。Flutterを使ってDesktopアプリも動かす！こと、
ご存知でしょうか？

意外と簡単でした。最初はなんかBuildしたり、gnやninjaインストールしたりして、大変でした。

# 試した結果から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/1a057b00-edc9-d6f0-9b85-7508230942ab.png)

# 方法。

## Cloneしましょう。
```terminal

> git clone https://github.com/flutter/flutter
> git clone https://github.com/google/flutter-desktop-embedding
```

## example Folderに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/68d85d9c-3f14-c829-45b1-fed5a15e1193.png)


## Terminalでこれを

```terminal

> set ENABLE_FLUTTER_DESKTOP=true

```


## pubspec.yaml 

```yaml
environment:
  sdk: '>=2.0.0 <3.0.0'
```

## 後、Flutter run だけ、

```terminal
> flutter run 

Launching lib/main.dart on Windows in debug mode...
Building Windows application...
Syncing files to device Windows...                               1,181ms

🔥  To hot reload changes while running, press "r". To hot restart (and rebuild state),
press "R".
```

軽くて早くていいです。
fuchsia　時代来るのか？
chromebook(ChromeOS)で拡張機能をバックアップする

# 1.ターミナルを開く
chromeを起動した状態でctrl+alt+tでターミナルを開きます。
shellコマンドを実行して、bashを叩けるようにします。

```bash
#略
crosh>shell
chronos@localhost / $ 
```

# 2.拡張機能をバックアップする
chromeOSでは　/home/user/ユーザ名/Extentions/拡張機能名　にパッケージが配置されています。これをコピーしてバックアップを取ります。

```bash
chronos@localhost / $ cp -r /home/user/XXXX/Extentions/YYYextention/ /home/user/XXXX/Downloads/
```
Railsチュートリアル経験者が引っかかりやすい、Railsのページが表示できないトラブル

## 概要
Railsチュートリアルを完了して、さあイチからアプリ作成に取り掛かろうとしたところ、
`rails server`でサーバーを起動してもブラウザから表示できない。

### 表示できない理由
どうやら、接続を受け付けるIPアドレスがlocalhostのみとなっていることが原因。

```titile:今回
# rails s
=> Booting Puma
=> Rails 5.1.7 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

```title:Railsチュートリアル時
# rails s      
=> Booting Puma
=> Rails 5.1.7 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.5.1-p57), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

`* Listening on`の項目が、Railsチュートリアル時には`tcp://0.0.0.0:3000`だったのに、
今回は`tcp://localhost:3000`となっている。
`* Listening on 〜`の箇所は、Railのサーバーが接続を受け付けるIPアドレスを表している。
ここに記載されたIPでないと接続してもページは表示されない。

`* Listening on tcp://localhost:3000`
この場合には、localhostからの接続のみを受け付けている。
自分はDockerでRails環境を構築していたので、localhostとは見なされなかったようですが、
環境によっては普通に使えるかも知れません。

`* Listening on tcp://0.0.0.0:3000`
`0.0.0.0`は全てのIPアドレスを意味する。
なのでこの場合は、どのIPアドレスからでも接続できることを意味する。

### 解決方法
#### その１ rails server のbindオプションを使う。
railsサーバー起動時にbindオプションを使えば、リスニングするIPを指定することができる。
`rails server --bind=0.0.0.0` もしくは　`rails s -b 0.0.0.0`。

#### その２ config/boot.rb書き換える
毎度bindオプションを指定するのが面倒ならば、config/boot.rbでデフォルト設定を変更するという方法もあるらしい。
[rails s -b 0.0.0.0が面倒な場合のメモ - Qiita]
(https://qiita.com/cancel/items/9b8ada73e03d873f810a)

#### その３ gem 'puma'のバージョンを変える
そもそも何故Railsチュートリアルの時には、bindオプションを指定しなくても良かったのか？
config/boot.rbを書き換えてもいない。
調べてみると、Gemfileを書き換えてbundle updateを実行した後は、
デフォルトで`* Listening on tcp://0.0.0.0:3000`となっているようだ。
なので、Gemfileで指定したgemのどれかが、デフォルトのリスニングIPアドレスの設定を変えているはず。
もっとも可能性の高そうな、gem 'puma'だけをRailsチュートリアルと同じ'3.9.1'にし、bundle update。

```title:Gemfile
source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.7'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use Puma as the app server
gem 'puma', '3.9.1'
・
・
```


結果、デフォルトのリスニングIPアドレスが変わっていることが確認できた。

#### 補足
Railsのバージョンが4.2になった時、デフォルトのリスニングIPアドレス設定が変わったということがあったらしい。
[rails sで起動したサーバにブラウザからアクセスできない - Qiita](https://qiita.com/tmf16/items/bb789a45c0f456eac11f)
［Android］ScrollViewでスクロールしたときにエフェクトを出す

ScrollViewだと上端・下端でスクロールしたときにエフェクトが出ない。
次のようにoverScrollModeをalwaysに変更してやるとエフェクトが出るようになる。

```xml
<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="always">

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
        <TextView
                android:text="SAMPLE TEXT"
                android:layout_margin="16dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
    </LinearLayout>
</ScrollView>
```

![scrollview (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/99118c0d-10ef-38b0-4fbf-4d4e55ebe6ee.gif)
Rails チュートリアル  第9章　学習内容のメモ

# 本章の趣旨
- 8章で実装した基本的なログイン機能に加えて、ラウザを再起動した後でもすぐにログインできる機能 (remember me) を実現する

# 9.1 Remember me 機能
- 8章ではsessionメソッドを用いてcookieにユーザIDを保存したが、sessionメソッドではブラウザを閉じるとデータが消えてしまう
- 永続的なcookieを作成するために、cookiesメソッドを用いて記憶トークンを作成する
- データベースの情報を抜き取られた場合に備えて、記憶トークンはハッシュ化してデータベースに保存する
- トークン生成用メソッドの追加


```ruby:app/models/user.rb
  def User.new_token
    SecureRandom.urlsafe_base64
  end
```

- ハッシュ化したトークンをデータベースに保存する


```ruby:app/models/user.rb
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end
```

- cookiesメソッドでは有効期限を設定できる
- Railsでは20年で期限切れになるcookies設定を行うための特別なメソッドが用意されている

`cookies.permanent[:remember_token] = remember_token`

- ユーザIDをcookieに保存する。IDが見られることを防ぐために署名つきcookieを使用する

`cookies.signed[:user_id] = user.id`

- 記憶トークンと同じく、ユーザIDも永続化させる必要があるためsignedとpermanentをメソッドチェーンで繋ぐ

`cookies.permanent.signed[:user_id] = user.id`

- 以下のようにcookiesからユーザを取り出せるようになる

`User.find_by(id: cookies.signed[:user_id])`
iphoneでなぜか文字が大きくなる問題

##結論

```CSS
html,body {
 -webkit-text-size-adjust: 100%;
 -ms-text-size-adjust: 100%;
}
```

文字サイズの自動調整をさせたくない部分に-webkit-text-size-adjustを指定することで解決します。
もともとiphoneに搭載されている文字の自動調整のせいで文字が大きくなってしまうようです。
リセットCSSにはデフォルトで組み込まれてることが多いのですが、そうでなかった場合はここを確認したほうがいいです。

#参考

[iPhone版Safariで文字サイズがおかしくなるときは-webkit-text-size-adjust: 100%; を指定する](https://m.designbits.jp/13031617/)
イベントの参加者のイベント一覧を表示する拡張機能

connpassのイベントの参加者のイベント一覧を表示する拡張機能です。

あるイベントの参加者が他にどのようなこと(イベント)に興味があるのか分かります。

# デモ
`https://connpass.com/user/`で始まるユーザーのページ(例 [https://connpass.com/user/test/](https://connpass.com/user/test/))に移動してください。
![Screenshot from 2019-05-04 15-13-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/cb3cf5d2-584f-cd47-5178-04baedc082df.png)

右上にイベントのURLを入れてください。
![Screenshot from 2019-05-04 15-16-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/e19f2cb6-9e25-2dde-b503-c54c720d60ef.png)

日付の右の人数は２つイベント間で重複する参加者の数です。

[YouTubeのリンク](https://youtu.be/dzvElVHLj2I)
[![YouTube](https://img.youtube.com/vi/dzvElVHLj2I/maxresdefault.jpg)](https://youtu.be/dzvElVHLj2I)



# インストール
予め[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)をインストールしておく必要があります。

以下のインストールを押してインストールしてください。

[インストール](https://gist.github.com/GitHub30/9aabbba006613f0a0b33f2e70e6fe376/raw/688c41be4729edd168a7b4f80878ace05bbb17db/connpass-event-applicants-event-list.user.js)


ソースコード
https://gist.github.com/GitHub30/9aabbba006613f0a0b33f2e70e6fe376
GWから始めるMackerel入門

オレイリーの「入門 監視」で付録に記載があった「Mackerel」に触発され戯れたときのメモ書き

## Mackerelって何？

株式会社はてなが開発したSaaS型のサーバ監視サービス。
本来監視システム構築するのに監視サーバを立てる必要があるが、その手間がないのがメリット。

## Mackerelの料金の話

以下に記載がある通り、２つの料金がある。
制限のあるフリープラン（無料）とスタンダードプラン（有料）。

https://mackerel.io/ja/pricing/

## Mackerelのインストール方法

４ステップで完了。インストールするとき面倒な設定は一切不要。

１　Mackerelでユーザーを作成する
２　Mackerelの画面よりオーガニゼーションを作成
３　Mackerelの画面よりエージェントをインストールを選択
※　Amazon LinuxやCentOSやWindowsといったOSを選択
４　発行されたエージェントのコマンドを入力

## MackerelでCPUの監視設定

MackerelはGUIベースで監視設定を行う。
画面より「Monitors」を選択。
メトリックから「CPU」を選択。閾値を黄色を７０％、赤色を９０％に設定。
これで監視設定が完了。

※　監視は、CPU以外にもディスクやメモリなどが可能。

## MackerelでCPUアラート通知くるかテスト

実際にCPUに負荷をかけて、アラート時の動作を確認。
今回、負荷テストツールである「Stress」を使用する。
監視対象：CentOS

※　Windowsの場合、CPUSTRES.EXEという負荷ツールがある。

#### 監視サーバに以下のコマンドを実行

```sh
yum install -y stress
```

#### インストール確認

```sh
stress --version
ーーーーーーーーー
stress 1.0.4
```

#### 負荷テスト実行

例1）　Stressツールより１０プロセス３分間CPUに負荷をかけるコマンド

```sh
stress --cpu 10 --timeout 3m
```

例2）　Stressツールより２プロセス３分間メモリーに２Gバイトの負荷をかけるコマンド

```sh
stress --vm 2 --vm-bytes 2G  --timeout 3m
```

「Mackerel」の画面を確認するとAlertが発生していることがわかる。
stressは、ディスクやメモリにも負荷が与えることも可能。

## その他運用で必要そうなTips

「Mackerel」のヘルプページ
https://mackerel.io/ja/docs/

ヘルプページにはSlackにアラートを通知するといった記事が掲載されている。
https://mackerel.io/ja/docs/entry/howto/alerts/slack

HTTPステータスの監視やSSL証明書の監視も可能。

## Slackで通知を受け取ったときのイメージ

![Slack_Mackerel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/17ad6971-f622-8ffc-5a45-61af88e73312.png)
Windows10開発環境構築メモ

# Windows10環境構築メモ
個人用のメモです。新しいWindowsの環境構築をする際に参考にしたリンク集です。
随時更新していく予定です。


# Docker 関係
### Docker for Windows
https://qiita.com/anikundesu/items/7ecf20b7e8a60f8439a8


# Git 関係
### SourceTree
https://qiita.com/otakeuchi/items/d9719d7bd78a97feb4f4


# Go 関係
### Golang, dep
https://qiita.com/yoskeoka/items/0dcc62a07bf5eb48dc4b

### Delve
https://qiita.com/murachi1208/items/ba44c650c13da78c60fd

# Hugo 関係
### Hugo
https://qiita.com/ninoseki/items/17531f3eef77375fc451

# Java 関係
### Coretto
Amazon版JDK
https://qiita.com/segur/items/0f799a61e4ee793d75d6

### STS
Java Springフレームワーク専用エディタ
https://qiita.com/segur/items/4cd283d9763a1953f336


# Node.js 関係
### nodist, Node.js, npm
https://qiita.com/maitake9116/items/d14a50214305aeb2194c


# PHP 関係
### PHP, Composer, Laravel
https://qiita.com/homhom99/items/3161ed3eb8ea0e6ba14e


# Python 関係
### Python, pip
https://qiita.com/segur/items/23f276320216c3aa7cf7


# Ruby 関係
### Ruby, Bundler
https://qiita.com/kono/items/e2dbb3b43f5f6204a62b


# Unity 関係
### Unity Hub, Unity
https://qiita.com/qtminuro/items/7c05668133a59d94933e


# その他
### Chocolatey 
MacでいうHomebrewのようなもの

- https://qiita.com/konta220/items/95b40b4647a737cb51aa
- https://qiita.com/geotrader/items/33b5db1832bb42979ba9

### Visual Studio Code
https://qiita.com/ntkgcj/items/e77331932c7983dea830