OmniAICreator/Qiita-1.07M huggingface dataset:
TornadeFXでメインのウインドウを閉じたり閉じたときの処理を実装する

tornadoFXで出てくるメインウィンドウを閉じいたときの処理で詰まったのでメモ
#方法
primaryStageのclose()[閉じるとき]やsetOnCloseRequest()またはshowingProperty().addListener()[閉じる処理を書くとき]を呼ぶ

```kotlin:Main.kt

import tornadofx.*
class Main:App(MyView::class)

class MyView :View() {
    override val root = Form()
    val textfield = textfield ("hello world")
    init{
        with(root){
            fieldset{
                textfield
                //閉じるボタン
                button { action { primaryStage.close() } }
            }
        }
        //プログラム上から閉じたらこっちは呼ばれない
        //primaryStage.setOnCloseRequest { e -> println("close")}
        //こっちだとプログラム上で消しても呼ばれる
        primaryStage.showingProperty().addListener {obs,oldValue,newValue->
            if (oldValue == true && newValue == false) {
                println("close")
            }
        }
    }
}
```
#説明
Appのコンストラクタで指定してるのはJavaFXでいうところのStageに乗せるSceneなので、指定してるViewでcloseしても意味がない。Viewが載っているStageにprimaryStageでアクセスできるので、それのclose()を呼べば閉じる。

消したときの処理も同様。ただし、onCloseRequestはプログラム上からcloseしたときは反応しない(ウインドウ上のXボタンを押したときのみ)ので、[このページ](https://torutk.hatenablog.jp/entry/20170613/p1)で言われているようにshowingProperty()を使ったほうがいい。

#あとがき
javaFXとの対応関係が解れば当たり前の話だったけど、main周りがかなり違って対応関係が解らずかなり詰まった。

#参考
https://torutk.hatenablog.jp/entry/20170613/p1
browse the state of the art in machine learning まとめ

# survey
# Semantic Segmentation
## Encoder-Decoder with Atrous SeparableConvolution for Semantic Image Segmentation
[論文](https://arxiv.org/pdf/1802.02611v3.pdf)
[コード](https://github.com/tensorflow/models/tree/master/research/deeplab)

![](https://camo.qiitausercontent.com/39201cf819490a216c88caa39fc2bd2b2be83e7b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3133303737312f31663464656435392d373035322d326539322d616463662d6631306433373031643133622e706e67)

概要
-　画像からの物体のセグメンテーションを目的とした手法

貢献
-　アトラス空間ピラミッドプーリングとEncoder Decoderを用いて高速かつオブジェクト境界を鮮明化
-　Encoder Decoderにトレードオフ（精度対ランタイム）が可能な仕組みを導入
-　セグメンテーションタスクへのXceptionの導入
-　PASCAL VOC 2012データセットでSOTA

アトラス畳み込み
![](https://camo.qiitausercontent.com/00f08f9496acaaa8772e29338f09e9738313fc03/687474703a2f2f626c6f672e717572652e61692f6173736574732f696d616765732f7365676d656e746174696f6e2d7265766965772f64696c617465645f636f6e762e706e67/)
-　カーネル内に余裕をもたせることにより，空間的な次元を減らすことなく、視野を指数関数的に増大することができます

空間ピラミッドプーリング
![](https://camo.qiitausercontent.com/1641103b3d05942546dc40e40be23de94a984a5c/68747470733a2f2f63646e2d616b2e662e73742d686174656e612e636f6d2f696d616765732f666f746f6c6966652f742f74746c672f32303136303231352f32303136303231353230303131372e6a7067)
-　様々なサイズのカーネルによって算出された特徴を組み合わせて用いる
-　セグメンテーションで良い結果を残している

感じたこと
-　空間ピラミッドプーリングがセグメンテーション以外でも有用かが気になる
-　複雑な画像のセグメンテーションはうまく行ってない見たい
-　そこそこ単純なやつに対しては最強っぽい
FileMaker//COTOHA-APIで感情分析するカスタムAppを作成する

先日COTOHAのハンズオンに参加してきましたので、忘れないうちに復習しました
インターフェイスの作成ってファイルメーカーは簡単で助かります

[COTOHA API](https://api.ce-cotoha.com/contents/index.html)のサイトでアカウント登録する→for Developerアカウントは無料で使えますので、データ量とかあまり気にしなくて良さそうです

##FileMakerで感情分析APIを使う
<img width="1090" alt="アカウントホーム.png" src="https://qiita-image-store.s3.amazonaws.com/0/181254/d652cc1c-9052-cf37-94ab-031497dfe33d.png">
アカウントを作成すると、固有の情報を割り当ててもらえますので、ここからスタートします

ファイルメーカーのレイアウトはこんな感じで簡単に作りました
<img width="875" alt="レイアウト画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/181254/399656c0-eb20-9ff7-4320-cae180ac339c.png">

左側の"Text"フィールドに分析したいテキストを入れて、**Cotoha感情分析**ボタンを押すと、"ResponseJSON"に結果が返ってくる。というとりあえずシンプルなやつを作りました

##アクセストークン取得
curlオプションの設定を今後ショートカットするためにスクリプトをここで保存

```FileMaker:アクセストークン取得スクリプト
# --------------------------------------------
# access_tokenを取得する
# --------------------------------------------

#access_tokenを要求するために必要なデータセット
変数を設定 [ $access_data ; 値: JSONSetElement ( $access_data ; ["grantType"; "client_credentials" ; 1]; ["clientId"; Cotoha::Developer Client id ; 1]; ["clientSecret"; Cotoha::Developer Client secret ; 1] ) ]

#curlオプションを使ってaccess_tokenを取得 
URL から挿入 [ SSL 証明書の検証 ; 選択 ; ダイアログあり: オフ ; Cotoha::access_token ; Cotoha::Access Token Publish URL ; cURL オプション: "-X POST -H \"Content-Type: application/json\" -d " & $access_data ] 

#結果はJSON形式で返ってくる。"access_token"以外の情報はいらないので、それだけをaccess_tokenフィールドに挿入する
計算結果を挿入 [ 選択 ; Cotoha::access_token ; JSONGetElement ( Cotoha::access_token; "access_token" ) ] 
```
アクセストークンの取得に成功した場合に返ってくるJSONファイルは以下の形式です

```JSON:getAccessToken
{
"access_token": "アクセストークン",
 "token_type": "bearer",
 "expires_in": "残り有効期限(秒)" ,
 "scope": "" ,
 "issued_at": "トークン発行日時(エポックタイムからの経過ミリ秒数)"
}
```
有効時間が24時間なので、起動時や実行時に取得する必要があります

##テキストを分析する

```FileMaker:感情分析
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
# 感情分析API
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
変数を設定 [ $requestData ; 値: JSONSetElement ( $requestData ; ["sentence";Cotoha::Text;1]) ] 

#感情分析APIを呼び出す
変数を設定 [ $API ; 値: //呼び出すAPIを設定 "sentiment" ] 

#URLを設定
変数を設定 [ $requestURL ; 値: Cotoha::Developer API Base URL & $API ] 

#curl文を生成
変数を設定 [ $curl ; 値: "-X POST -H \"Content-Type: application/json\"" & " -H \"Authorization:Bearer " & Cotoha::access_token & "\"" & " -d " &　$requestData ] 

URL から挿入 [ SSL 証明書の検証 ; 選択 ; ダイアログあり: オフ ; $responseJSON ; $requestURL ; cURL オプション: $curl ] 

#JSONデータを整形する
フィールド設定 [ Cotoha::ResponseJSON ; JSONFormatElements ( $responseJSON ) ] 
```

取得した結果をどう料理するか、それはまた次回
StyleCop.AnalyzersをCLIで使いたい

## 結論から言うと
今はできませんが、動くものを開発中です

## StyleCop.Analyzers とは
RoslynベースのC#のコードに対する静的解析ツールです。
コーディング規約に違反していないかをチェック/修正まで行ってくれます
.NET Core/Roslyn などと同じくOSSとして公開されています
[StyleCop.Analyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers)

## 使用方法
VisualStudio/Rider などの統合開発環境を使用している場合は容易に使用できます
導入方法は VisualStudioであれば、`NuGet Package Manager` などから導入可能です
残念ながらVS Codeはサポートされていません

## CLIで動かす同期
CIやgit commit hookなどでチェックしたいからです
その他に筆者はVS Code派なので...
特にコーディング規約に関わることはレビューで指摘するのは不毛ですので、
出来る限りPull/Merge Requestなどが上がった時点で自動的にチェックしたいという思いがあります

## CLIで動くStyleCopのツール郡は存在している
StyleCop.Analyzersの前身プロジェクトで、StyleCopというものがあります
[StyleCop](https://github.com/StyleCop/StyleCop)

StyyleCop自身はCLIで動作し、静的解析としては必要十分な条件を満たしています
ただし、既に死んでいるプロジェクトです
StyleCop.Analyzersは開発が続けられており、新しいルールなども追加されています
また、StyleCopにはコードを修正する機能はありませんが、StyleCop.Analyzersにはあります

## StyleCop.AnalyzersのCLIツールはあるのか
現時点ではありません
ただし、以下のようなIssuも上がっており、そのうち正式にサポートされるかもしれません
[CLI?](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2571)

ですが、いつ実装されるかもわからないものを待つのは辛いです

## 何度かトライして諦めていた
実は結構前からトライしていたのですが、StyleCop.Analzyersをビルドするために `.NET Framework` が必要でした
.NET FramworkはWindowsしかサポートしておらず、Mac/LinuxではStyleCop.Analyzersと依存しているライブラリ群をビルドしようとするとエラーとなり諦めていましたが、ようやく周辺環境も整ってきてビルドできるようになりました
`Microsoft.Build.Locator` はβ版ではありますが使用できます

## なので作ってみた (まだ出来上がっていない)
進捗率は50%程度ですが、以下のように出力することができました
試しに解析してみたのは、gRPCのC#のソースコードです

```bash
dotnet StyleCopAnalyzersCmd.dll -d ./grpc/src/csharp
```
というようなコマンドで使えるようにしたいなと思ってますが、コマンド名がダサいので何か良い案があれば...

![22abbc5e9839723ace571c8413a1ca31.png](https://qiita-image-store.s3.amazonaws.com/0/16583/64cdbc3d-c692-e0b4-d730-5016e20be443.png)


## 余談
まだチェックだけで、コードの修正までは出来ていませんが、チェック処理がある程度ものになった時点で公開したいと思います
CLIツールを作るのに、CySharpさんのMicroBatchFrameworkが非常に便利です

GitHubに公開する際にはこのツールを作るための苦労話なども記載しないと思います
StyleCop.Analyzersの機能の全てがinternalで容易にアクセスできないのが非常に辛い。。。
AWSで簡易なSFTPサーバー構築 - SFTPサーバー設定

ec2-userでSSHログイン

#### rootユーザに変更
```
$ sudo su -
```

#### ユーザー作成
```
# useradd ユーザー名
```
#### rootユーザーからexit
```
# exit
```

#### 作成したユーザーに変更
```
$ sudo su 作成したユーザー名
```

#### 作成したユーザーのホームディレクトリに移動
```
$ cd /home/作成したユーザー名
```

#### .sshディレクトリ作成
```
$ mkdir .ssh
```

#### .sshディレクトリのパーミッション(権限)を700に変更
```
$ chmod 700 .ssh
```

#### .sshの直下にauthorized_keysファイル作成
```
$ touch .ssh/authorized_keys
```

#### authorized_keysファイルのパーミッションを600に変更
```
$ chmod 600 .ssh/authorized_keys
```

#### 秘密鍵公開鍵の準備
#### Puttygenで公開鍵のスクリーンをドラッグしてコピー
#### authorized_keysに公開鍵を貼り付け
```
cat >> .ssh/authorized_keys
```
入力モードになるので、(Puttyの場合)Shift + insertボタン押下
Enter
:q + Enter
でプロンプトに戻る

#### 別のPuttyセッションを立上、作成したユーザー名で作成した秘密鍵でログインできることを確認

#### sftpコマンドでのみ接続を許可させる
authorized_keysの先頭に下記の記載を追加し、改行を入れる。
```/home/[user_dir]/.ssh/authorized_keys
command="internal-sftp"
```

あとはこちらの記事を参考にできました。ありがとうございます。

https://qiita.com/rjge/items/221727f010f63be07ff4
Swift MkMapViewで地図アプリ作成してみた（06）- スケールバーとコンパスを追加する

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#スケールバーを表示する

スケールを変更すると自動でスケールバーを表示する。

```swift:ViewController.swift：スケールバーを表示する
// スケールバーの表示
let scale = MKScaleView(mapView: mapView)
scale.frame.origin.x = 15
scale.frame.origin.y = 45
scale.legendAlignment = .leading
self.view.addSubview(scale)
```

legendAlignmentに設定できる値は以下の通り。

| 1 | 2 |
|:--|:--|
|.leading  |0を左起点にする |
|.trailing |0を右起点にする |

<img width="597" alt="scale.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/c9e3ece4-486a-aa92-69ce-dc2ff8b47af3.png">

#コンパスを表示する

```swift:ViewController.swift：コンパスを表示する
// コンパスの表示
let compass = MKCompassButton(mapView: mapView)
compass.compassVisibility = .adaptive
compass.frame = CGRect(x: width - 50, y: 150, width: 40, height: 40)
self.view.addSubview(compass)
// デフォルトのコンパスを非表示にする
mapView.showsCompass = false
```

compassVisibilityに設定できる値は以下の通り。

| 1 | 2 |
|:--|:--|
|.hidden   |常に非表示 |
|.visible  |常に表示　 |
|.adaptive |地図の方位を動かしたとき（ノースアップでない時）だけ表示。 |

#デバイスで実行した結果

![device.png](https://qiita-image-store.s3.amazonaws.com/0/362635/ecb9725e-e43c-b619-d2f9-4a35e13fc08e.png)

#補足
前回の記事で設定したトラッキングモードを変更するボタンの位置を変えている。
[Swift MkMapViewで地図アプリ作成してみた（04）- トラッキングモードを切り替える（自作ボタン）](https://qiita.com/rain_00_00_09/items/d6fad14a81250c2a346b)
[Swift MkMapViewで地図アプリ作成してみた（05）- トラッキングモードを切り替える（MKUserTrackingButton）](https://qiita.com/rain_00_00_09/items/a239d6e4ae893673f18f)

```swift:ViewController.swift：トラッキングボタンの位置を変更
trakingBtn.frame = CGRect(x:width - 50, y:100, width:40, height:40)
```

#参考文書
[iOS 11で大幅に強化されたMapKit](https://qiita.com/koogawa/items/9ea87bc0f28605b02588)
Nuxt.jsでTSXを使う

# 事前準備
- Nuxt.js + TypeScript 環境
- Webpackのextensionsに```.tsx```が入っていること

※ この記事は既に **Nuxt.js + TypeScript** 環境が整ってる前提の記事になります。

http://kasheight.hatenablog.jp/entry/2018/12/nuxt-typescript
環境構築はこちらの記事が非常にわかりやすかったです。

# 実装
## tsconfig.json
```json:tsconfig.json
{
  "compilerOptions": {
    "jsx": "preserve"
  },
  "include": [
    "src/**/*.tsx" 
  ]
}
```

```compilerOptions``` に```"jsx": "preserve"``` を追加します。

## HelloWorld.tsx

```tsx:HelloWorld.tsx
import Vue, { CreateElement, VNode } from "vue"

interface IData{
  isShow: boolean
}

export default Vue.extend({
  data(): IData {
    return {
      isShow: true
    }
  },
  render(h: CreateElement): VNode {
    return (
      <div>
        <h1>I am a tsx component.</h1>
        {this.isShow && <h2>Hello World</h2> }
      </div>
    )
  }
})
```
特にパッケージなどは追加せずに```tsx``` が使えます。

## HelloWorld.vue

```<script lang="tsx"></script>```
と書くことで```.vue```でも```tsx``` が使えるようです。


(propsが正常に動作しないためvue-tsx-supportを使ったほうがよさそう...)
Dockerのexposeとpublishの違い

:gear:dockerのexposeとpublishの違いを簡単にまとめます。

## publish
publishは、コンテナのportをホストマシンに公開するために利用します。
例

```
#docker run --publish ホストマシンのport:コンテナのport image

docker run nignx_image --publish=80:3000
```

これで、ホストマシンのport80と、containerのport3000をバインドします。
## expose
Exposeははポートの**公開をするわけではなく**、**ドキュメンテーション**の役割を果たします。

>The EXPOSE instruction informs Docker that the container listens on the >specified network ports at runtime. EXPOSE does not make the ports of >the container accessible to the host.
解説(https://docs.docker.com/engine/reference/builder/#expose)

コンテナ内部で利用されているportのうち、ホストマシンにバインドされる意図のあるportをexposeに記述しておくことで、どのportをpublishすれば良いかが分かりやすくなります。

exposeはコンテナ間でポートを公開すると理解され記述されているケースが多いですが、exposeの指定をせずとも他のコンテナからアクセスは可能です。

## Exposeが機能するケース

-Pオプションを利用すると、exposeした全てのportを公開することができます。

```
docker run nginx_image --expose=80 --expose=443 -P
```
=> port80と443をdockerのホストマシンに公開
タスクスケジューラでexe実行時、コンソール画面を出さない2つの解決策

## 解決したい問題
Windowsサービスを作って、そのexeをタスクスケジューラに登録をして定期的に動かしたい。
しかし毎回コンソール画面が出てしまう。どうしよう…。

## 解決策1
①exeを実行するbatを作って、
②batを動かすvbsを作って、
③そのvbsをタスクスケジューラに登録する。
>
C:\hoge.exe
C:\hoge.bat
C:\hoge.vbs


```hoge.bat
@echo off
call "C:\hoge.exe"
```


```hoge.vbs
Dim oShell
Set oShell = WScript.CreateObject("WSCript.shell")
oShell.run  """"+"C:\hoge.bat"+"""",0
Set oShell = Nothing
```
　
※hoge.vbsの三行目
`oShell.run  """"+"C:\hoge.bat"+"""",0`みたくダブルクオーテーションで囲っている理由は、開発時のPathに 【`C:\Users\hoge\Documents\Visual Studio 2015\`】みたく空白が入っていた為。

## 解決策2（状況が限られる）
タスクスケジューラ登録時のセキュリティオプションで、
”ユーザーがログオンしているかどうかにかかわらず実行する(W)”にチェックを入れる。

<img width="" alt="2019-03-07_21h14_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/184925/d6bdd537-5233-8427-c8cd-c4bd7846bca5.png">

ここにチェックを入れておけば、実行時にコンソールが出なくなる。
ログオンしているユーザと、タスク実行時に使うユーザを変えることでも出来るらしい。

## あとがき
テスト環境では解決策1であるプログラムを動かしていたが、そのプログラムを入れる先は必ず`”ユーザーがログオンしているかどうかにかかわらず実行する(W)”にチェックを入れる。`となっていたため、最終的にbatとvbsがいらなくなった。
他にコンソールを出さない方法があればご教授願いたい。
gasからgetリクエストを送る

簡単です。
これで終わり

```javascript:GAS
function myFunction() {
  var url = "ここにurlを入れる";
  UrlFetchApp.fetch(webhook_url);
}
```

<img width="730" alt="スクリーンショット 2019-03-07 21.20.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/cf40c573-8a6f-7289-4945-75361174b56a.png">
gasを始めよう

gasのエディタまでの行き方紹介するぞ

## 1. 「スプレッドシート」と検索してスプレッドシートにいく

そして、スプレッドシートのページに行く
<img width="978" alt="スクリーンショット 2019-03-07 21.10.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/36f64e2b-814c-29c6-eeec-639185203e3d.png">


## 2. スクリプトエディタを開く

「ツール」→「スクリプトエディタ」からスクリプトエディタを開く

<img width="1436" alt="スクリーンショット 2019-03-07 21.11.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/dd592d26-e380-3cb9-c358-72cbbf3c7a18.png">

## 3. コードを書く

あとは他のキータをみるのだ
<img width="1252" alt="スクリーンショット 2019-03-07 21.13.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/c0268850-6f48-2f4d-eaf0-2b8c9d054797.png">
【Rails】boolean型のカラムのバリデーション方法

boolean型のカラムのバリデーションをするときは

```
validates :status, presence: true
```
これではfalseの時にエラーが出てしまいます。
presenceというバリデーションはblank?が偽であることを検証するためfalseで反応してしまうからです。

##正しいboolean型のバリデーション

```
validates :status, inclusion: {in: [true, false]}
```

これでtrueとfalse以外に反応するバリデーションができます。
AWSで簡易なSFTPサーバー構築 - 初期設定

AWSに簡易なSFTPサーバーを立てようとして何度も失敗したので、正しい手順を記録化する話

### EC2インスタンスを立てる

#### 立てる過程でKey pair作成
#### AWSコンソールで、秘密鍵をダウンロード
#### ローカルマシンにPuttyとPuttygenをインストール
#### PuttygenでConversionメニューからImport Key. ダウンロードした秘密鍵ファイル.pemを選択。Save private keyで、open-ssh形式の秘密鍵ファイル.ppkを保存

#### Puttyにセッション作成
AWSコンソールにて対象インスタンスに接続ボタンを押すと表示されるパブリックDNSが接続先DNS
Authに上で作ったOpen SSH形式の秘密鍵.ppkを設定

Open押下でSSHログイン

初期はec2-userであり、rootではない

### yum アップデート

```
$ sudo yum update -y
```

### gitをインストール
'''
$ sudo yum -y install git
'''

### Python3をインストール

```
$ sudo yum install python3
```

### Pyenvのインストール
```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

### Pathを通す
```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

### コマンドが通るか確認
```
$ pyenv -v
```

### 必要な依存関係のインストール
```
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y
```

### python3.7の場合は以下も必要
```
sudo yum install libffi-devel
```

### pythonのインストール
```
pyenv install 3.7.1
```

### バージョンの切替
```
$ pyenv global 3.7.1
$ pyenv rehash
```

### 確認
```
$ python --version
```
3.7.1になっていれば成功
デバイスファイルのシンボリックリンク作成方法

USB仕様の力センサを2個使いたい時に右と左でそれぞれ個別に認識する方法。

デバイスにはidVendorやserialが割り当てられているので、それらに関する設定を書く。

>\# FFS055YA501U6 SN: 1803043
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="1803043", SYMLINK+="fss055ya0"

> \# FFS055YA501U6 SN: 1803044
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="1803044", SYMLINK+="fss055ya1"

それぞれのATTRSは
> udevadm info -a -n /dev/ttyACM0 | grep idVensor

といったようにATTRS{}の{}の中身でgrepして調べる。
Azure WebApps(Linux)で特定ディレクトリをアクセス制限する

[Azure WebApps](https://azure.microsoft.com/ja-jp/services/app-service/web/)はデフォルトで[アクセス制限機能](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-ip-restrictions)を持っています。
頻繁にメニューが変更されるのでここだと特定しにくいのですが、2019/03/07時点では『設定』→『ネットワーク』→『アクセス制限』から指定可能です。

しかし、これはサイト全体へのアクセス制限です。

そうではなく、特定のディレクトリだけ制限したい、要するに`.htaccess`で`Require ip`って書きたいんじゃという情報が全然見当たらなかったので調べたけどいまいちわからなかったメモ。
そもそもLinux版WebAppsの情報自体少ない。

# 目的

特定のディレクトリだけ、指定したIPアドレス以外からは接続不可にしたい。

ちなみに`Order deny,allow`はもはや古い書き方なので、今後は使わないようにしましょう。


# 試してみる

```htaccess:.htaccess
Require ip 8.8.8.8
```

普通のサーバであれば、これでIPアドレス8.8.8.8からの接続は許可、それ以外は拒否されます。

が、WebAppでこう書くと、Allowしたつもりのホストからの接続も拒否されます。

何故かというと、WebAppsのサーバに辿り着く前にREMOTE_ADDRが書き換えられています。
REMOTE_ADDRには本来はクライアントのIPアドレスが入ってくるのですが、WebApp上では`172.16.0.1`のようなローカルアドレスに書き換えられていました。
元々のIPアドレスはHTTP_X_CLIENT_IPに入っていました。

ということで、接続元IPアドレスとしてHTTP_X_CLIENT_IPを見るようにすれば解決するでしょう。


```htaccess:.htaccess
Require env HTTP_X_CLIENT_IP 8.8.8.8
```

動きませんでした。

どうやら`Require env`は[環境変数が存在するかどうかしか見ない](https://httpd.apache.org/docs/current/ja/mod/mod_authz_core.html#requiredirectives)ようです。
従って、一度SetEnvIfで一時変数を作る必要があるみたいです。

```htaccess:.htaccess
SetEnvIf HTTP_X_CLIENT_IP "8.8.8.8" valid_ip
Require env valid_ip
```

こっちも動かない。

SetEnvIfの引数には[一部の環境変数しか指定できない](https://httpd.apache.org/docs/current/ja/mod/mod_setenvif.html)みたいです。
なんで。


# 解決方法

```htaccess:.htaccess
Require expr http('X-CLIENT-IP') -ipmatch '8.8.8.8'
```

わかんねーよハゲ。

このhttpとかipmatchとかは[公式マニュアル](https://httpd.apache.org/docs/current/mod/mod_authz_core.html)に全く書かれておらず、[正規表現の項目](https://httpd.apache.org/docs/current/expr.html#functions)にあります。
というか何故変数名がアンダーバーとかハイフンとかCamelCaseとかバラバラなのだ。

あと、この例だと環境変数の頭の`HTTP-`が勝手に消えるんだけど、`HTTP-`から始まらない、たとえば`SERVER-ADDR`あたりを引っかけたい場合はどうすればいいんだろう。
試しに`Require expr req_novary('REQUEST-METHOD') -strmatch 'GET'`とか書いてみても動かなかった。


# `%`構文が使えない

[正規表現の例](https://httpd.apache.org/docs/current/expr.html#examples)では、

```htaccess:.htaccess
<If "%{HTTP_HOST} == 'example.com'">
	Require all denied
</If>
```

のような例が載っています。
このように、一部の環境変数は`%{HOGE}`で取得できます。

しかしHTTP_X_CLIENT_IPを使おうとするとInternal Server Errorになります。

```htaccess:.htaccess
<If "%{HTTP_X_CLIENT_IP} != '8.8.8.8'">
	Require all denied
</If>
```

`%`構文はSERVER_PROTOCOLやHTTP_USER_AGENTやQUERY_STRINGやHTTP_COOKIEには使用可能。
SERVER_SIGNATUREやHTTP_CONNECTIONやHTTP_X_CLIENT_IPやPHP_SELFには使用不可。

PHP_SELFはともかく、他の使える環境変数と使えない環境変数の違いがわからない。
htaccessに来た時点では定義されてない値とかだろうか。
この違いは何処を見ればわかるのだろう。
【Swift4.2】EnumEnumerable が使えなくなっていた、、

## Xcode10対応

Swift4.2が登場してからかなりお世話になっていた[CaseIterable](https://developer.apple.com/documentation/swift/caseiterable)

これ自体はかなり助けられていたのだが、、

2019/03以降のXcode10対応が必須となって、保守していたアプリをXcode10に対応させる必要が生じた、、
[Xcode10対応について](https://developer.apple.com/news/?id=09122018c)

Xcode9.4.1からXcode10.1でビルドしたが、、まさかの[EnumEnumerable](https://qiita.com/sgr-ksmt/items/c1c6a91324cf12151256)のCasesが取得できない、、という自体が発生。

影響範囲を抑えた修正をしたかったが、方法が見当たらなかったので、CaseIterableへの変更にて対応した

もし、なにか情報いただけましたら、教えてください。

## Xcode v10.1 にはしたいけれど、 Swift v4.2 にはすぐにはできないというケースの場合

Xcode 10 から hashValue の扱いが変わっていて、紹介されている EnumEnumerable が動作しません。

[stackoverflowの記事](https://stackoverflow.com/questions/24007461/how-to-enumerate-an-enum-with-string-type/49588446#49588446)が参考になります。hashValue を使わないで実現している方法の紹介です。

## 参考資料
[Swift4.0→4.2でEnumEnumerableが不要になった](https://qiita.com/go0425/items/be085341a1753a9ed33e)

## 変更履歴
2019/03/10　@AnzNetJp の助言により、EnumEnumerableのXcode10版について追記しました。
No.043【Python】pass文の定義と使用方法

![python-logo-master-v3-TM-flattened.png](https://qiita-image-store.s3.amazonaws.com/0/336067/8fb9f6aa-57f7-dc4b-b4bf-a648969d315c.png)

####今回は、pass文ついて書いていきます。
I'll write about "pass contexts"

###■ pass文とは
&emsp;Definition of pass contexts


     pass：ヌル操作のため、pass を実行されても、何も起きない。
     構文法的には文が必要。コードとしては何も実行したくない場合はPlace holderとして使用可能
```
　Python：関数定義のdef文や条件分岐のif文などでは中身の省略は不可
　記述する必要があるが、何も実行させたくない場合にpass文を使用する
```

###■ pass文とcontinue文の違い
&emsp;Differences between pass and continue contexts

```
>>> # while またはfor ループで使われるcontinue文
>>> # それ以降の処理を行われない → continue文の後に記述された処理は実行されない
>>> 
>>> for i  in range(5):
	print(i)
	if i == 1:
		continue
		print("CONTINUE")

		
0
1
2
3
4
```

```
>>> # pass文の場合
>>> # pass文の後の記述は、処理が続けて実行される
>>> 
>>> for i in range(5):
	print(i)
	if i == 1:
		pass
		print("PASS")

		
0
1
PASS
2
3
4
```

###■ 空の関数やクラスを定義
&emsp;Definition of blank function and class

``` 
>>> # 関数またはクラスの定義を先に行い、
>>> # 実装を後回しにする場合にからの関数やクラスを定義することがある
>>> # def文の中を何もないとエラーになる
```

```
>>> # pass文を書くことで、何もしない空の関数の定義が可能
>>> 
>>> def empty_func():
	pass

>>> # クラスの定義でも同様である
>>> 
>>> class EmptyClass():
	pass
```
```
>>> # 一行だけの場合はコロンの後に改行せずにそのまま書いても文法上問題ない
>>> 
>>> def empty_func_one_line(): pass
>>> class EmptyClassOneLine(): pass
```


###■ 空のファイルを作成
&emsp;Create black files


```
>> # ファイルを新規作成する場合：with文と書き込みモードwのopen()を使う
>>> 
>>> # 通常：write()メソッドでファイルの内容を書き込む
>>> # pass文：空のファイルを作成できる
>>> 
>>> with open("temp/empty.txt", "w"):
	pass
>>> 
>>> 
>>> # １行で書くことも可能
>>> 
>>> with open('temp/empty.txt', 'w'): pass
```

###■ 条件分岐で何も実行しないことを明示
&emsp;Indicate nothing with conditional branch

```
>>> # 実装を後回しにsする場合
>>> # 何も実行しないことを明示し、コードの意図が分かりやすくする場合
>>> 
>>> a =6
>>> 
>>> if a % 2 == 0:
	print("Even")
else:
	pass

Even
```

###■ 例外処理で何もしない場合
&emsp;The case of Exception handling with nothing

``` 
>>> # コード実行時にエラーが発生する時点で、エラーが出力され、処理が終了する
>>> 
>>> def divide(a, b):
	print(a / b)

	
>>> divide(1, 0)
Traceback (most recent call last):
  File "<pyshell#90>", line 1, in <module>
    divide(1, 0)
  File "<pyshell#89>", line 2, in divide
    print(a / b)
ZeroDivisionError: division by zero
``` 

``` 
>>> # tryを使うことで例外を捕捉
>>> 
>>> # 処理は終了せず、継続する
>>> 
>>> def divide_exception(a,b):
	try:
		print(a / b)
	except ZeroDivisionError as e:
		print("ZeroDivisionError: ", e)

		
>>> divide_exception(1, 0)
ZeroDivisionError:  division by zero

```
 
``` 
SyntaxError: invalid character in identifier
>>> # 例外を捕捉した上で何も処理しない場合は、pass文を使用する
>>> 
>>> def divide_exception_pass(a, b):
	try:
		print(a / b)
	except ZeroDivisionError as e:
		pass

	
>>> divide_exception_pass(1, 0)
>>> 
>>> 
``` 

随時に更新していきますので、<br>定期的な購読をよろしくお願いします。
I'll update my article at all times.
So, please subscribe my articles from now on.

本記事について、<br>何か要望等ありましたら、気軽にメッセージをください！
If you have some requests, please leave some messages! by You-Tarin
httpd.conf中身構成

おはようございます、こんにちわ、こんばんわ

勉強したこと、連携します。何かの役に立てば幸いです

#1.設定ファイル（/etc/httpd/conf/httpd.conf）の基本

Apache の設定ファイルは、/etc/httpd/conf/httpd.conf です。この設定ファイルは、大きく 3 つのセクションに分けてディレクティブ（設定項目）が記述されています

#セクション壱：Global Environment

Apache サーバープロセスの全般的な制御（グローバルな設定）を行うためのディレクティブを指定する

#セクション弐：'Main' server configuration

バーチャルホストでないメインサーバーの設定を行うためのディレクティブを指定する。ここで指定した値は、バーチャルホストの初期値として反映されます。バーチャルホストとは物理的に一台のコンピュータで複数の Web サイトを公開するための機能です

#セクション参：Virtual Hosts

各バーチャルホスト毎の設定を行うためのディレクティブを指定する

以上です！！
MovableType7の記事インポートでエラーが出たお話。

古いMTの記事を新しいMTにお引越しがしたい。
mt5をmt7に移設するらしい。

移設先でmt7にバージョンアップしてからテンプレートの修正が入っていたのでさぁ大変。
バージョンが二つも古いのに無事にインポートできるのか！？
marcodiの挑戦が今始ま

①

```
インポートの途中でエラーが発生しました : 状態は正しくありません 。インポートファイルを確認してください。
```

　
②

```
Failed to execute INSERT INTO mt_entry (entry_allow_comments, entry_allow_pings, entry_atom_id, entry_author_id, entry_authored_on, entry_basename, entry_blog_id, entry_category_id, entry_class, entry_comment_count, entry_convert_breaks, entry_created_by, entry_created_on, entry_excerpt, entry_keywords, entry_modified_by, entry_modified_on, entry_ping_count, entry_pinged_urls, entry_status, entry_tangent_cache, entry_template_id, entry_text, entry_text_more, entry_title, entry_to_ping_urls, entry_unpublished_on, entry_week_number, entry_current_revision) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) with allow_comments, allow_pings, atom_id, author_id, authored_on, basename, blog_id, category_id, class, comment_count, convert_breaks, created_by, created_on, excerpt, keywords, modified_by, modified_on, ping_count, pinged_urls, status, tangent_cache, template_id, text, text_more, title, to_ping_urls, unpublished_on, week_number, current_revision: DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x99\x84</...' for column 'entry_text'
```

ｱｯﾊｲ


まず①について考える。



####原因となる箇所を特定する####

エクスポートしたファイルを開いて紐解く。

```
AUTHOR: foo
TITLE: くさなぎきょう
BASENAME: foo_111
STATUS: 
ALLOW COMMENTS: 1
CONVERT BREAKS: __default__
ALLOW PINGS: 1
DATE: 10/19/2030 05:06:16 AM
-----
BODY:
ボディがお留守
-----
EXTENDED BODY:
ボディががら空き
-----
EXCERPT:

-----
KEYWORDS:

-----

COMMENT:
AUTHOR: comment_user
EMAIL: 
IP: 127.0.0.1
URL: 
DATE: 10/19/2030 06:06:16 AM
コメントがあればCOMMENT:～↓の-----まで
1コメントとして取り扱われる
-----

-----
--------
```

mt5ではこのブロックが何個も縦に連なった状態でエクスポートされます。

ではエラーが出た記事はどうなってるか。

```
AUTHOR: foo
TITLE: 
BASENAME: foo_111
STATUS: 
ALLOW COMMENTS: 1
CONVERT BREAKS: __default__
ALLOW PINGS: 1
DATE: 12/31/2012 11:42:45 PM
-----
BODY:

-----
EXTENDED BODY:

-----
EXCERPT:

-----
KEYWORDS:

-----


-----
--------
```

下書きを作ってすぐ放置されたものと思われる。

```
AUTHOR: foo
TITLE: 
BASENAME: foo_111
STATUS: Draft
ALLOW COMMENTS: 1
CONVERT BREAKS: richtext
ALLOW PINGS: 1
DATE: 12/31/2012 11:42:45 PM
-----
BODY:

-----
EXTENDED BODY:

-----
EXCERPT:

-----
KEYWORDS:

-----


-----
--------
```
mt7で下書きをエクスポートするとこの通り。
STATUSに値が入っていないないとエラーになります。
このあたりはバージョンアップで変わったのかもしれませんね。

####原因解消にあたる####

この下書きがいらないならそのブロックを消してしまってOK。
下書きを残す場合は`STATUS: Draft`としてしまうと良いでしょう。

まずはエディタで修正したインポートファイルを開き、改行コードをLFにする。
**改行コードをLFにする。**
**改行コードをLFにする。**
**改行コードをLFにする。**
**改行コードが異なると正常に読み込んでくれません。**

正規表現込みでgrepをかけて該当箇所を適宜解消していく

```
STATUS: \n
```

あとはインポートするだけ！



次に②

####原因となる箇所を特定する####
エラー文言からはインサートエラーであるのが伺えます。
インポートテキストから該当記事をみると

🙄

これ。

####原因解消にあたる####
今回MySqlでの作業になりますが、顔文字をデータベースに登録するには設定を変更する必要あり。
雑な誘導ではありますが、以下の記事がとても参考になります。

[MySQL5.5で🍣絵文字🐟を挿入/検索する](https://qiita.com/suzuki_sh/items/f02fc88a8514fd23a47e)


以上、お役に立てましたら幸いです。


**備考**
最期までインポートしてるのにエラーの出るファイルがあるのﾅﾝﾃﾞ???
→原因不明、そもそも改行コードを変えると正常に取り込まず終了する。。
凡ミスっぽいけどどうなんだろう

記事消す量が多いとtimeoutしちゃうﾅﾝﾃﾞ????
→DB設定の変更で解決します
DjangoのAbstractBaseUserでのエラー|Unknown field(s) (username) specified

カスタムユーザーをAbstractBaseUserを使って作成し、adminで表示しようと際のエラー。

#これ
<img width="1182" alt="スクリーンショット 2019-03-07 19.57.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/345335/fb63c98b-5897-5e64-1528-7613b82687a9.png">

[Admin]→[user]→[user　detail]
ユーザー詳細の変更をしようとした際に出現


#エラー内容
```
FieldError at /admin/appauth/user/XXXXXXXXXXXXXXXXXXXX/change/
Unknown field(s) (username) specified for User. Check fields/fieldsets/exclude attributes of class MyUserAdmin.
```

Djangoでカスタムユーザーモデルを利用しようした際に「えーいなんのこっちゃ精神」でAbstractBaseUserを使った際にちょっとつまずいた。
したかったことは、Adminページでusernameをfieldsetsで表示すること。
`class User(AbstractBaseUser, PermissionsMixin):
`
ググると、stackoverflowでmodelの型関係かと思ったが違った。

```python:appauth(任意)/models.py

username = models.CharField(
        _('username'),
        max_length=150,
        blank=True,
        null=True,
        unique=True,
        help_text=_(
            'Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("そのユーザーネームはすでに存在しています。"),
        },
    )
```
blankとか,nullとかをごにょごにょしてみたが、どうも違う。

#Djangoのドキュメントを読みましょう
該当はこの辺り
https://docs.djangoproject.com/ja/2.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project

抜粋:
You should also define a custom manager for your user model. If your user model defines username, email, is_staff, is_active, is_superuser, last_login, and date_joined fields the same as Django's default user, you can just install Django's UserManager; however, if your user model defines different fields, you'll need to define a custom manager that extends BaseUserManager providing two additional methods:

Djangoのdefault userでusernameとか新たに定義したい時はUserManagerを使って、違うfieldとして定義しましょう、的な。

私もよく読めてないので、一度読み返します。


#解決策

とりあえず、別物として定義。

拡張して定義するのが正解だと思うけど認証をメールを使ってそれをusernameとしていることがあるので一時的にこれで対処.
(一度勉強し直す必要アリ)

```python:appauth(任意)/models.py

user_name = models.CharField( #usernameをuser_nameに変更
        _('username'),
        max_length=150,
        blank=True,
        null=True,
        unique=True,
        help_text=_(
            'Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("そのユーザーネームはすでに存在しています。"),
        },
    )
```

これで、


```python:appauth(任意)/admin.py
.
@admin.register(User)
class MyUserAdmin(UserAdmin):
    fieldsets = (
        (None, {'fields': ( 'user_name')}),
```

とかで一旦は解決
djangoで作った静的ページのサイトマップ（url）を作成する方法

かなりハマったのでメモ・・・


やることだけ書いていきます。


## settings.pyを編集

以下の内容を追記します

```python
SITE_ID = 1

以下略

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',　←これと
    'django.contrib.sitemaps',　←これ
    'bootstrap4',
]

```


## urls.pyを編集（settings.pyが置かれてるディレクトリのやつ）

```py

from django.contrib.sitemaps.views import sitemap
from .sitemaps import StaticViewSitemap


sitemaps = {
    'static': StaticViewSitemap,
}

 urlpatterns = [
    path('', views.index, name='index'),
    path('kuso/', include('kuso.urls', namespace='kuso')),
    path('admin/', admin.site.urls),
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
 ]
```

```
sitemaps = {
    'static': StaticViewSitemap,
}
```
と

```
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
```

を追加する感じです。

## sitemaps.pyを作成（settings.pyが置かれてるディレクトリに）

```python
from django.contrib import sitemaps
from django.urls import reverse

class StaticViewSitemap(sitemaps.Sitemap):
    priority = 0.5
    changefreq = 'weekly'

    def items(self):
        return ['kuso:kasu']

    def location(self, item):
        return reverse(item)
```

気にするべきところは、

```py
    def items(self):
        return ['kuso:kasu']
```

の指定の仕方で、
urls.pyで書いたnamespaceとnameを指定する必要があります。
これがわからなくてだいぶハマりました。
（もともとnamespaceを設定すらしていなかったので・・・）


ここまで設定すれば、


`http://hogehoge.com/sitemap.xml`

にアクセスすると、

`http://hogehoge.com/kuso/kasu`

っていうURLが記載されたsitemapが表示されるはずです。（kuso:kasuは
nameなのでURLと同じであるとは限りませんが）


そんな感じです。
quickrun.vimで非同期実行している時に実行中かどうか分かるようにする

#概要
[quickrun.vim](https://github.com/thinca/vim-quickrun)+[vimproc.vim](https://github.com/Shougo/vimproc.vim)でプログラムをvim内で非同期実行する際に実行中であれば、statuslineにRunning...と表示する。
#環境
```
#nvim -v                                                                                                                                       [18:32:44]
NVIM v0.3.4
Build type: Release
LuaJIT 2.1.0-beta3
# head -n 4 quickrun.vim
" Run commands quickly.
" Version: 0.7.0
" Author : thinca <thinca+vim@gmail.com>
" License: zlib License
vimproc.vim
ver 9.3 (https://github.com/Shougo/vimproc.vim/releases)
```

#はじめに
quickrun.vim+vimproc.vimでプログラムをvim内で素早く非同期実行できることはよく知られていますし、使われている方も多いと思います。
非同期実行ができることでプログラムの実行中にもvimが使えてとても便利です。
しかし、便利になった半面、使っているとこんな疑問が湧き上がります。
#これ今実行してるのか...?
非同期実行によって実行中にvimが使えなくなることがなくなりました。
が、その代わり自由に移動できるので、今実行しているのか分かりません。逆に実行していると思って待っていたら実行されていなかったこともあります。贅沢な悩みですが、結構困ります。
#対処法
実行中にvimで以下のコマンドを実行すると、実行中の場合は1、実行中で無い場合は0が返されることが分かりました。

```vim
:echo  quickrun#is_running()
```
しかし、いちいち何度もこのコマンドを実行するのは面倒です。
実行中の時だけstatuslineに実行中であることを表示しましょう。

```vim:init.vim
function! My_running()
	if quickrun#is_running()
		return " Running... "
	else
		return ""
	endif
endfunction

set laststatus=2
set statusline=%F%m%r%h%w\%=
"statuslineの設定の表示したいところにこの行を追加---------
set statusline+=%{My_running()}
"-------------------------------------------------
set statusline+=%l/%L
```
>![Screenshot from 2019-03-07 19-30-09.png](https://qiita-image-store.s3.amazonaws.com/0/332794/54dd8ca5-b435-52e2-959b-ca7326bcf292.png)
分かり辛いけど右下にRunning...の文字が表示されています。

これで実行中のときだけstatuslineにRunning...の文字が表示されたと思います。
一件落着。
#最後に
初めてvimscriptいじりました。関数名の最初は大文字なんですね。(一敗)
こうした方がいいとかここ違うぞとかあれば是非コメントお願いします。
Unity TextMeshの表示順(sortOrder)を変更する


TextMeshをがSpriteRendererより前に表示したいけど、sortOrderがいじれない事にきずいた。
SpriteRenderer側をいじれば解決するが、そうしたくないのでググったらMeshRendererコンポーネントをいじればOKでした。

```csharp

textMeshObj.gameObject.GetComponent<TextMesh>().sortingOrder = 2;
```

ではなく
↓

```csharp
textMeshObj.gameObject.GetComponent<MeshRenderer>().sortingOrder = 2;
```

MeshRendererをいじればよいとの事。
落ち着いて考えたら描画部分はMeshRendererなので当たり前か汗

参考にさせて頂いたサイト
https://answers.unity.com/questions/595634/3d-textmesh-not-being-drawn-properly-in-a-2d-game.html
SQLで重複除去の重複条件に複数カラムを使用する際

結構色々情報があって迷ってしまうんだけど、以下が一番楽コスパ良いと思う。

条件に使うカラムを文字結合して擬似的に1カラムと見なして、その擬似カラムにDISTINCTをかける。

```
SELECT DISTINCT column1 || ',' || column2, column3, column4
FROM table1;
```
git コマンドでデフォルトブランチ名を取得する

## デフォルトブランチとは？

GitHub や Bitbucket では、リポジトリの設定画面からデフォルトブランチを設定できます。「デフォルトブランチ」は「メインブランチ」「ベースブランチ」などと呼ばれることもあります。

デフォルトブランチの設定は、主に以下の場面で使われます。

- `git clone` した時にデフォルトでチェックアウトされるブランチ
- ブラウザでリポジトリを開いた時に最初に表示されるブランチ
- プルリクエスト作成時の標準のマージ先ブランチ

何も設定しないと「master」ブランチがデフォルトブランチとなります。

### 2020/10/07 追記:

2020年10月、GitHub は今後新たに作成するリポジトリのデフォルトブランチ名を「main」に変更すると発表しました。これまでは「master」でした。

つまりリポジトリの作成時期によってもデフォルトブランチが変わることになりますが、今後その判定としてもデフォルトブランチ名を取得したいケースが出てくるかもしれません。

- 参考: [GitHub、これから作成するリポジトリのデフォルトブランチ名が「main」に。「master」から「main」へ変更 － Publickey](https://www.publickey1.jp/blog/20/githubmainmastermain.html)

## デフォルトブランチの取得コマンド

### 方法1: git remote show を使う方法 (おすすめ)

```sh
git remote show origin | grep 'HEAD branch' | awk '{print $NF}'
```

origin に設定したリポジトリ (GitHub など) にリモートの詳細情報を問い合わせ、その中に含まれるデフォルトブランチ名の部分のみを抽出して出力するコマンドです。

ネットワークアクセスが発生しますが、確実に最新のデフォルトブランチ名を取得できます。

### 方法2: git symbolic-ref を使う方法

こちらの方法はリモートと情報を同期してからデフォルトブランチ名を出力する流れになっており、2コマンドに別れています。

```sh
# リモートから最新のデフォルトブランチの情報を取得し、
# ローカルの .git/refs/remotes/origin/HEAD に同期する
git remote set-head origin --auto

# 同期したデフォルトブランチを表示する
git symbolic-ref refs/remotes/origin/HEAD | awk -F'[/]' '{print $NF}'
```

**なぜ同期が必要か**

`git symbolic-ref refs/remotes/origin/HEAD` コマンドは実質的にローカルの .git/refs/remotes/origin/HEAD ファイルの内容を表示するコマンドです。

`git clone` をするとその時点のデフォルトブランチの情報がこのファイルに書き込まれますが、clone の以後にデフォルトブランチの設定を変更したりしても更新されず古い情報が残ります。

また Git の仕様上、このファイルが常に存在することは保証されていません。存在していない状態で `git symbolic-ref refs/remotes/origin/HEAD` すると「fatal: ref refs/remotes/origin/HEAD is not a symbolic ref」といったエラーが発生します。 

そのため事前にデフォルトブランチの情報を同期する必要があります。

## 参考

- [github \- git \- how to get default branch? \- Stack Overflow](https://stackoverflow.com/questions/28666357/git-how-to-get-default-branch/44750379)
Openpyxlを使って、エクセルのマージ作業を自動化したときに躓いたポイント 


※2018年の6月くらいにメモっていたのですが、今更ながら投稿し忘れていたので遅れて投稿。
　2.5.1～2.5.4あたりのVLのものを使っていたと思いますが、もはや環境も残っていないため不明です。
　少し古いopenpyxlのため情報も古い可能性がありますが、許してくださいませ。

# 背景・はじめに
　私のプロジェクトでは、さまざまな大人達の都合もあって、
　テストの項目書などをいちいちエクセルで毎回毎回作成していました。
　
　この報告書は、一種の職人芸によって作られていたのですが、
　この崇高な作業も、openpyxl様のおかげで、ほぼ自動化されていました。
　そこで今回は、自動化で躓いたポイントを書きたいと思います。

## 1. 関数で参照される値を取得する
### やり方
値を参照する場合、はdata_only=Trueを設定しましょう。
以下は、indirect関数で値を読み込んでいるセルから、"数値"を参照する場合の例です。

```python
inwb = load_workbook(line.replace('\n',''),data_only=True)
inws = inwb['sheetname']
print(inws.cell(1,1).value)
```

出力

```
100
```

逆に数式をそのまま参照したい場合は、workbookを読み込む際、デフォルトのままにするとよいです。

```python
inwb = load_workbook(line.replace('\n',''))

inws = inwb['sheetname']
print(inws.cell(1,1).value)
```

出力

```
　=INDIRECT($B4&"!H2")
```

## 2. セルのマージと、書式の設定
### やり方
マージをするときは、merge_cells を使います。
また、罫線やテキストの配置などは、cell単位でいろいろとできるようです。

ここで注意が1点。
マージした後のセルに罫線を引いたりする場合は、すべてのセルに線を引く必要があります。
文字の位置なども指定があれば、↓のようにまとめて設定すると楽だと思います。

```python
#セルのスタイル変更用の関数
from openpyxl.styles import Border, PatternFill, Font, Alignment

def set_styles(set_cell):
    set_cell.alignment = (
        wrap_text = True,          #行の折り返し
        horizontal = 'general',    #中央ぞろえ
        vertical = 'top'           #上ぞろえ
    )
    set_cell.border = Border(top=thin, left=thin, right=thin, bottom=thin)  #罫線
    set_cell.fill = PatternFill(fill_type='solid', fgColor='FFFDDFD0')  #塗りつぶし
    
#セルのマージ処理
outputws.merge_cells(ROW_START, COL_START, ROW_END, COL_END)

#マージした範囲に、スタイルを適用する。
for i in range(ROW_START, ROW_END):
    for j in range(COL_START, COL_END):
        set_styles(outputws.cel(i, j))
```
## その他 気が付いた注意事項
行の追加の機能 (insert_rows()やinsert_cols()) という便利機能もあるのですが、これはうまく使えずあきらめました。
行の追加自体はできるのですが、"スタイル"などは行の追加とともにずれてはくれません。なので結局使わずじまいでした。

ということで、行の追加を使いたい場合は、実装の際、テキストの入力処理と整形する処理を分離して、
スタイル設定などは最後にまとめてやるような工夫が必要かもしれません。


## その他 参考・役に立ったもの 
　Python openpyxlでExcelを操作: 
　https://qiita.com/tftf/items/07e4332293c2c59799d1
　
　公式？　
　http://openpyxl.readthedocs.io/en/stable/index.html
　※webの記事は古いものが混じっているみたいです。
　　旧版だと大変だったものが最新版だと楽に実装できるようになっているものもあります。
　　非互換もありますので、細かなスタイルの設定などなど、公式の情報を読んだほうがよいと思います。
  
　https://openpyxl.readthedocs.io/en/stable/_modules/index.html
　こっちのページに、モジュールの一覧があります。とりあえず困ったときに見るのにおすすめ

※投稿時点ですと、xlwings ってものあるみたいですね。今から始める方はxlwingsを使うのもよいかもしれません。
　https://qiita.com/yniji/items/b38bc312e860027108ac
CentOS 6にTorqueをセットアップ


# CentOS 6にTorqueをセットアップする際のメモ

計算サーバは１台でヘッドノード兼用とする。

http://www.fiatlux.co.jp/faq/build/html/MFmyPresto_Other_Torque.html
の方法でもいいが、ソースビルドしたくないのでyumを使う。

ホスト名が設定されているか

```
$ hostname
```

で確認する。
※localhost.localdomainではダメ
※ホスト名が数字から始まっているとダメ

ホスト名からIPアドレスが引けないと問題になるので、予め設定しておいたほうが良い。
IPアドレス: 192.168.0.10
ホスト名: HostA
の場合、/etc/hostsに

```
192.168.0.10	HostA
```

を追加する。
※ループバックアドレス(127.0.0.1)ではダメ

```
# yum install -y epel-release
# yum install -y torque-client torque-mom torque-server torque-scheduler

# create-munge-key

# pbs_server -t create -f -D &
# pbs_server_pid=$!

# kill $pbs_server_pid

# echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes
# hostname > /etc/torque/server_name
# echo "nodes=0" > /var/lib/torque/mom_priv/mom.layout
```

/var/lib/torque/mom_priv/configが

```
$pbsserver localhost
```
になっていたので、

```
$pbsserver HostA
```
に変更。

```
# service munge start
# service pbs_server start
# service trqauthd start
# service pbs_sched start
# service pbs_mom start
# chkconfig munge on
# chkconfig pbs_server on
# chkconfig trqauthd on
# chkconfig pbs_sched on
# chkconfig pbs_mom on
```

下記コマンドでキューL0を設定する。
キュー名は別の名前でも良い。

```
# qmgr -c "create queue L0 queue_type=execution"
# qmgr -c "set queue L0 started=true"
# qmgr -c "set queue L0 enabled=true"
# qmgr -c "set queue L0 resources_default.nodes=1"
# qmgr -c "set queue L0 resources_default.walltime=3600"![undefined]()

# qmgr -c "set server default_queue=L0"
# qmgr -c "set server scheduling=true"

# qmgr -c 'p s'
```

で設定内容を確認する。

```
# pbsnodes -a
```

state = free

になっていることを確認。

hostname等設定以降のスクリプト例

```bash

#!/bin/bash

set -x

yum install -y epel-release
yum install -y torque-client torque-mom torque-server torque-scheduler

create-munge-key

pbs_server -t create -f -D &
sleep 10
pbs_server_pid=$!
kill $pbs_server_pid

echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes
hostname > /etc/torque/server_name
echo "nodes=0" > /var/lib/torque/mom_priv/mom.layout
sed -i.bak s/localhost/`hostname`/g /var/lib/torque/mom_priv/config

service munge start
service pbs_server start
service trqauthd start
service pbs_sched start
service pbs_mom start
chkconfig munge on
chkconfig pbs_server on
chkconfig trqauthd on
chkconfig pbs_sched on
chkconfig pbs_mom on

qmgr -c "create queue L0 queue_type=execution"
qmgr -c "set queue L0 started=true"
qmgr -c "set queue L0 enabled=true"
qmgr -c "set queue L0 resources_default.nodes=1"
qmgr -c "set queue L0 resources_default.walltime=3600"
qmgr -c "set server default_queue=L0"
qmgr -c "set server scheduling=true"

qmgr -c 'p s'

pbsnodes -a
```
background-sizeの記載には気を付けよう

androidで、非表示の要素を表示させたときに背景画像設定が消える現象が発生しました。
調べてみたところ、background-sizeの書き方に問題がありました。

**before**

```ruby:css
   background: url(../../hogehoge.jpg) left top repeat-y;
   background-size: 100% auto;
```

100% auto という記載に問題がありました。

**after**

```ruby:css
   background: url(../../hogehoge.jpg) left top repeat-y;
   background-size: 100%;
```

これで直りました。
Nuxt.jsで開発をする場合にまずやるべきこと

# 概要
僕がNuxt.jsで開発をする場合にまずやることを紹介したいと思います。

# インストール
僕はcreate-nuxt-appでインストールします。

```shell
npx create-nuxt-app <my-project>
```

入れる拡張は
1. Use a custom server framework　→ express
2. Choose features to install　→  Linter / Formatter, Prettier, Axios
3. Use a custom UI framework　→  bootstrap
4. Use a custom test framework　→  jest
5. Choose rendering mode　→  Universal

が個人的に好きです。

次にとりあえず入れとけなパッケージもインストールします。
とりあえずsassを入れます。

```shell
npm i -D node-sass sass-loader
```

次にsass変数をグローバルに使うためのパッケージを入れます。

```shell
npm i @nuxtjs/style-resources
```

Font Awesome入れます。[公式のgitにnuxt用の導入方法が載っています](https://github.com/FortAwesome/vue-fontawesome)。

```shell
npm i @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/vue-fontawesome @fortawesome/free-regular-svg-icons @fortawesome/free-brands-svg-icons
```

# 適当に書き換える

package.jsonにnpm scriptを一つ追加します。lintfixは絶対追加したほうがいいです、エラー内容を人力で追っていくのは時間の無駄です。
herokuにデプロイする場合はそれも追記します。

```json:package.json
{
    // lintfixを追加
    "lintfix": "eslint --fix --ext .js,.vue --ignore-path .gitignore .",
　　// herokuデプロイ用
    "heroku-postbuild": "npm run build"
  },
}
```

.eslintrc.jsにルールを追加します。よく分かってないのですがconsole.logしたら時たまエラーになるので、それの回避です。

```js:.eslintrc.js
  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
  }
```

sass変数のあれやこれやの設定は[これ](https://qiita.com/yusuke_ten/items/1d4f26f2abc44271219a)と[これ](https://qiita.com/yusuke_ten/items/946d38ac4e4ac857b3d3)をみたら良いですよ（宣伝）。

# 終わり

毎回苦労して初期設定してた気がするけど、そんな大した作業量でもなっかたです。
半年くらい前はeslintrcをゴニョゴニョ編集してた気がしますが進化してるっぽいですね。
あと最新のnuxt.js ver2.40以降は[ランダムにホットリロードが失敗する](https://github.com/nuxt/nuxt.js/issues/5132)というちょっとムカつくバグがあるので気をつけてください。
LaravelでCSVのダウンロードを実装する

# LaravelでCSVダウンロードを実装したい
Controllerに以下をコピペすれば実装できる。


```php:HogeConroller@csvDownload
# 配列を用意（内容は各自好きな物を）
$csv = [
  ['id', 'name', 'sex'],
  ['1', 'やまだ', 'おとこ'],
];

# ファイルの保存先、public直下のディレクトリなら誰でもあるはず（本来は/csv/などのディレクトリを作りましょう）
$stream = fopen('public/users.csv', 'w');

# 配列の中身をガンガン書き込む
foreach ($csv as $line) {
  fputcsv($stream, $line);
}
fclose($stream);

# PHP.iniの設定を上書きしている。これがないとCSVの情報が画面に表示されるだけでDLされない。
ini_set('output_buffering', 'On');

# 日本語が文字化けしないようにするためのおまじない
$csv = str_replace(PHP_EOL, "\r\n", file_get_contents('public/users.csv'));
$csv = mb_convert_encoding($csv, 'SJIS-win', 'UTF-8');

# file_get_contentsでpublic以下においたファイルを読み込んでる
return response(
    $csv,
    200,
    [
        'Content-Type' => 'text/csv',
        'Content-Disposition' => 'attachment; filename="users.csv"',
    ]
);
```
[ES6] import でディレクトリー内すべてのファイルを読み込む

# 課題
export default しているファイルを読み込むときに以下の書き方をしてたけど`hoge`ディレクトリ全体を一括で読み込みたいと思った。

```js
import hoge1 from './hoge/hoge1.js'
import hoge2 from './hoge/hoge2.js'
```

`hoge/index.js` で import 書いてまとめるのもめんどくさい。

# 方法
これでいいのかわからないけど、以下の方法でやってみたら動いた。

```js
import fs from "fs"
const hoges = {}
fs.readdirSync("./hoge").forEach(async file => {
  const module = await import(`./hoge/${file}`)
  hoges[file] = module.default
})
hoges.hoge1.hogeFunction()
```
ファイル形式を選択したいときはフィルタリングすればいけるし、サブディレクトリ読み込みたいときは再帰的に読めばいいと思う。
プログラミング学習　記録　Railsチュートリアル11,12章

#11、12章終わりました

学習時間は4時間程。一周目なので完全に理解できていない。

##11章
- アカウントの有効化

1. Userモデルに有効化トークンや有効化ステータスを付与する
2. ユーザー登録
3. ユーザー認証
4. アカウント有効化のメールを送信

**覚えたこと**

どうやらActivartionトークンが必要らしい
既存のユーザーモデルにアカウント有効化のコードを追加


```class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token
  before_save   :downcase_email
  before_create :create_activation_digest
  validates :name,  presence: true, length: { maximum: 50 }
```
メソッドも


    # メールアドレスをすべて小文字にする
    def downcase_email
      self.email = email.downcase
    end

    # 有効化トークンとダイジェストを作成および代入する
    def create_activation_digest
      self.activation_token  = User.new_token
      self.activation_digest = User.digest(activation_token)
    end


そしてテストの準備としてサンプルユーザーを最初から有効にしておく
seed.rbに```activated: true, acivated_at: Time.zone.now```を追記

##アカウント有効化のメール送信
送信する為には**Action Mailer**というライブラリをUserのメイラーに追加するらしい
Userメイラーの生成をして
>rails generate mailer UserMailer account_activation password_reset

作られたtextbビューとhtmlビューに表示する内容を書いていく

ちなみに生成されたメイラーのレイアウトは**app/views/layouts**で確認できる

あとは*user_mailer.rb*でアカウント有効化リンクを定義して、developmentで試して終了

authenticated?メソッド等重要な点もあるがあくまで**記録**なので省略

production環境でも出来るらしいが2周目に回します
自分の顔面3Dモデルを作る方法メモ

170201_Meshmixerでの顔面合成　簡易メモ

# やりたいこと

Fuel3D SCANIFYを使って、顔面の3Dデータを得たがさてどうしよう。

この動画みたいに銅像っぽくしてみるか。

[3D Scanning my Face using Fuel3D SCANIFY and Adding it to a Bust \| Tutorials \| Dream 3D \- YouTube](https://www.youtube.com/watch?v=nxol-mAO8-Q)

Meshmixerというツールのどの機能を使えば良いのかのメモ。

## Step-1 ツールのインストール
[Autodesk Meshmixer](http://www.meshmixer.com/)
free software for making awesome stuff

日本語情報が少ないので英語でインストールしたほうがわかりやすい。
## Step0 ポリゴン減らし

３Dスキャンしたモデルはポリゴン数が多いことがある。
処理が重いので場合は多少減らすといい感じになる。

	sculpt -> Reduce

Strengthで効果の強度, Sizeで効果の範囲を調整



## Step1 切り取り、削除


３Dスキャンしたモデルの不要な部分を切り落とす

	select　->　Discard


## Step2 ベースモデルの追加
普通に読み込むと追加されないので下記メニューから。
	import -> Append

ベースとなるモデルはネットから拾ってくる
[Thingiverse \- Digital Designs for Physical Objects](http://www.thingiverse.com/)
[メナンドロス](http://www.thingiverse.com/thing:456219)

## Step3 移動、サイズ変更
位置とサイズを合わせる。

	edit -> transform


## Step4 変形・・・引き出し？凹ませ？
例えばこんなことをする
1. 3dプリントした時に顔の凹凸がよく出るようにz軸？を1.2倍にしておく
2. 目、顎、頬の位置を合わせるように、サイズ、位置を調整
3. ベースモデルの鼻など重ねて出っ張る所を削る
4. 多少もこっとしてもいいのでエッジをすべて覆う


	sculpt ->

	* Inflate 膨らませる

	* Pinch 引っ張る

	* ShrinkSmooth 滑らかに凹ませる

	* RpustSmooth よくわからんが滑らかになる

各動作の詳細はよくわかってない。いろいろ試しながら・・・。


## Step5 合体

予めエッジをすべて覆うこと。

合体したいモデルを選択して

	boolean union

続けて

	Analysis -> inspector (smooth fill)

combineもあるがboolean unionとの違いはよくわかってない。


## Step6 レンダリング
	
やんなくてもいい。人に見せるときに。

	Shaders -> 好きな表面をD&D

## Step7 中空化
3dプリントの前に中空化してフィラメントを節約する。

	edit -> hollow

```offset distance``` 厚みの変更
```Update Hollow``` 変更を反映

FDM系の3Dプリンタなら穴は不要なので、holeの設定は触らなくていい
n0stackを構築する

OpenStackは少し大規模すぎるので、n0stackをビルドして使ってみようと思います

# n0stackとは？

- ICTSCの運営学生が作ったVMオーケストレーションツール、らしい
- 実装はgoで、内部でqemuでKVMを使用している
- 基本的には、VMやネットワークの定義をyamlとして書き、それを読み込ませる

# コンポーネント

### n0proto

n0stackのProtobuf定義

### n0bff

わからんかった

### n0core

n0stackのサーバー実装

### n0cli

n0stackのコマンドラインツール


どうやら、n0protoでgrpc通信の定義を決めて、n0cliからn0coreを操作するらしい。

# ビルド

```
$ make all
```

これで、`bin/`以下に`n0cli` `n0core` `n0bff`が生成される。

# n0stackの実行

```
$ docker-compose up -d api
$ bin/n0core serve agent --location 0/0/0/0/0 --advertise-address 192.168.1.5 --node-api-endpoint 192.168.1.5:20180
```

ipアドレスは自分のマシンのものに読み替えてください。


# ためしてみる

以下の内容のyamlを作ります。

```
FetchISO:
  type: BlockStorage
  action: FetchBlockStorage
  args:
    name: cloudimage-ubuntu-1804
    annotations:
      n0core/provisioning/block_storage/request_node_name: vm-host1
    request_bytes: 1073741824 # 1GiB
    limit_bytes: 10737418240 # 10GiB
    source_url: https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

ApplyImage:
  type: Image
  action: ApplyImage
  args:
    name: cloudimage-ubuntu

RegisterBlockStorage:
  type: Image
  action: RegisterBlockStorage
  args:
    image_name: cloudimage-ubuntu
    block_storage_name: cloudimage-ubuntu-1804
    tags:
      - latest
      - "18.04"
  depends_on:
    - ApplyImage

GenerateBlockStorage:
  type: Image
  action: GenerateBlockStorage
  args:
    image_name: cloudimage-ubuntu
    tag: "18.04"
    block_storage_name: test-blockstorage
    annotations:
      n0core/provisioning/block_storage/request_node_name: vm-host1
    request_bytes: 1073741824
    limit_bytes: 10737418240

ApplyNetwork:
  type: Network
  action: ApplyNetwork
  args:
    name: test-network
    ipv4_cidr: 192.168.200.0/24
    annotations:
      n0core/provisioning/virtual_machine/vlan_id: "100"

CreateVirtualMachine:
  type: VirtualMachine
  action: CreateVirtualMachine
  args:
    name: test-vm
    annotations:
      n0core/provisioning/virtual_machine/request_node_name: vm-host1
    request_cpu_milli_core: 10
    limit_cpu_milli_core: 1000
    request_memory_bytes: 536870912
    limit_memory_bytes: 536870912
    block_storage_names:
      - test-blockstorage
    nics:
      - network_name: test-network
        ipv4_address: 192.168.200.1
    uuid: 056d2ccd-0c4c-44dc-a2c8-39a9d394b51f
    # cloud-config related options:
    login_username: n0user
    ssh_authorized_keys:
      - ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBITowPn2Ol1eCvXN5XV+Lb6jfXzgDbXyEdtayadDUJtFrcN2m2mjC1B20VBAoJcZtSYkmjrllS06Q26Te5sTYvE= testkey
  depends_on:
    - GenerateBlockStorage
    - ApplyNetwork
```

vm-host1を、自分のマシンのホストネームに置き換えてください。また、ssh公開鍵も自分のものを登録します。

最後に、`ssh n0user@192.168.200.1 -i ~/.ssh/hoge.pub`でログインできれば成功です。
EC2へのssh接続を名前でできるようにするためのconfigを作るためのコマンド

UserとIdentityFileは適宜変更してください。

```sh
aws ec2 describe-instances | jq -r '[ .Reservations[].Instances[] | [ .InstanceId, (.Tags[]? | select(.Key == "Name")).Value, .PublicDnsName ]] | sort_by(.[1]) | .[] | "Host \(.[1])\nHostName \(.[2])\nUser hoge\nPort 22\nIdentityFile /path/to/key\n"'
```