OmniAICreator/Qiita-1.07M huggingface dataset:
toLocaleDateString()の和暦の挙動

# toLocaleDateString

## Mac版Chromeでの平成

`new Date()` して引き算したりとかいろいろしていた西暦・和暦変換ですが、

今現在(2019/04/22)のJavascriptでは `toLocaleDateString("ja-JP-u-ca-japanese", {era:"long", year:"numeric"})` のようにすることで手軽に取得できます。

```JS
new Date().toLocaleDateString("ja-JP-u-ca-japanese", {era:"long", year:"numeric"});
```

```bash
"平成31年"
```

## Mac版Chromeでの令和

…が！

今現在、Mac版Chromeでは新元号「令和」を認識していないみたいです。

```JS
new Date(2020,0,1).toLocaleDateString("ja-JP-u-ca-japanese", {era:"long", year:"numeric"});
```

```bash
"平成32年"
```

↑平成32年になっちゃってる。

MacOSの領分なのかJSなのかChromeなのか分かりませんが、

更新されるまでは使えないようです。

## Node.jsでの令和

…しかも！

`Node.jsではtoLocaleDateString("ja-JP-u-ca-japanese")`は機能しないみたいです。

```index.js
dateString = new Date(2020,0,1).toLocaleDateString("ja-JP-u-ca-japanese", {era:"long", year:"numeric"});
console.log(dateString)
```

```bash
CE 2020
```

ちなみに`npm i -g node`を実行して、バージョンは`v11.14.0`です。

## 懸念

ということはNuxtなどのサーバーサイドレンダリングでも機能しないんでしょうか。

-> 軽く試したら「平成32年」が表示されました。

ReactNativeみたいなJSをバンドルするタイプのアプリも怪しい（試してない）。

引き算タイプのほうが安全なのかも…。
Copy source jar files into directory (Gradle 5 compatible)

Thanks to [this article](https://qiita.com/manhole/items/cdf12fd4e7e593572ca7), we can copy source jar files into directory with Gradle 2.x. But the script doesn't work in Gradle 5.1. So that I made Gradle 5.x compatible version.

[この記事](https://qiita.com/manhole/items/cdf12fd4e7e593572ca7)で提供いただいているスクリプトを使うことで Gradle 2 系で source jar を任意のディレクトリにコピーすることができます。しかし当該スクリプトは Gradle 5 系では動作しなかったため、Gradle 5 対応版を作成しました。

```gradle
import org.gradle.api.artifacts.query.ArtifactResolutionQuery
import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier
import org.gradle.jvm.JvmLibrary
import org.gradle.language.base.artifact.SourcesArtifact

// Usage example: collectSourcesJar(configurations.compile, "./my-source-jar-directory")
// Specify configurations.testCompile to copy source jars of test dependencies.
def collectSourcesJar(configuration, directory) {
    DependencyHandler dependencyHandler = project.dependencies

    def componentIdentifiers = configuration.resolvedConfiguration.lenientConfiguration.getArtifacts { Dependency dependency ->
        configuration.dependencies.contains(dependency)
    }.collect { ResolvedArtifact artifact ->
        ModuleVersionIdentifier id = artifact.moduleVersion.id
        DefaultModuleComponentIdentifier.newId(id)
    }

    ArtifactResolutionQuery query = dependencyHandler.createArtifactResolutionQuery()
    query.forComponents(componentIdentifiers)
    query.withArtifacts(JvmLibrary, SourcesArtifact)

    def sourcesJars = []
    ArtifactResolutionResult resolutionResult = query.execute()
    resolutionResult.resolvedComponents.each { ComponentArtifactsResult componentArtifactsResult ->
        componentArtifactsResult.getArtifacts(SourcesArtifact).each { ArtifactResult artifactResult ->
            if (artifactResult instanceof ResolvedArtifactResult) {
                sourcesJars << artifactResult.file
            }
        }
    }

    project.copy {
        from sourcesJars
        into directory
    }
}
```
LambdaからLambdaを呼び出す

LambdaからLambdaを呼び出したい時がある。
その場合はInvokeを使うことで解決できる。

# Invokeとは
[これ](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#invoke-property)
Lambdaクラスのメソッドの一種。

# 使い方
Nodeの場合。
Nodeのバージョンは8.1。

```javascript
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

// ペイロード。呼び出すLambda関数に受け渡す引数的な。
let payload = {
    "number":number,
    "message":"ご来場ありがとうございました"
}

// ペイロードをStringにする。
payload = JSON.stringify(payload);
 
// params           
let params = {
    FunctionName:"SendSMS",
    InvocationType:"RequestResponse",
    Payload:payload
 }
            
try {
    // Lambda関数呼び出し
    let callLambda = await lambda.invoke(params).promise();
                
 } catch (e) {
    console.log("[ERROR]sendSMS/callLambda",e)
 }
```

上はSMS送信するLambda関数を呼び出しているソースコード。

呼び出されるLambdaに渡す引数をString形式にしてpayloadにセットし、
呼びだす関数名（FunctionName）と、どのように呼び出すか（InvocationType）を指定して呼び出す。

# 補足

**InvocationTypeについて**
InvocationTypeはRequestResponse、Event、DryRunがある。
ドキュメントに全部書いてあるが、簡単に要約するとこんな感じ。
・RequestResponse
同期的に他の関数を呼び出す。InvocationTypeを指定しなければこれがデフォルトとなる。
呼び出した関数から何かレスポンスが返ってくるか、タイムアウトになるまで呼び出し元の関数と呼び出し先の関数の間でコネクションを張る。
戻り値として呼び出した関数から値を得ることができる。

・Event
非同期に他の関数を呼び出す。
呼び出した関数からはステータスコードのみ返却される。
試行に失敗したら複数回イベントを送信する（？）

・DryRun
呼び出しパラメーター（ペイロードのこと？）と、関数を呼び出そうとしているユーザーまたはロールについて検証を行う。

呼び出した関数から何か値を得たい場合はRequestResponse、とりあえず実行できればいいだけの場合はEvent、諸々検証したい場合はDryRun？

**payloadについて**
呼び出し先に渡す値はJSON形式で記述するが、引数をセットしたjsonはバッファ、配列、Blob、文字列のいずれかの型に変換する。
普通にオブジェクトでjson作って、json.stringifyでStringに変換するのが一番楽かなと思う。
jQueryのCVE-2019-11358対応版について

# はじめに
jQueryの脆弱性、CVE-2019-11358 が公開されています。なるはやで対策しておいたほうが良いです。

# 対応方法
対策版にあげることのみです。今の所提供された緩和策はなさそうです(もしくはextend自体を差し替える)

## 3.xの場合
3.4.0にあげましょう。

## 2.x,1.x の場合
現在公式に提供されたものはありません。次項で述べる改造版に差し替える必要があります。

# 2.xと1.x用の改造版
2種類あります。一長一短で、Daniel Rufさんのは差分なのでpatchコマンドなどで適用する必要があり、min.map に対応していないのでデバッグができなくなります。私版はmin.mapも同梱していますが、バージョン表記部分にCVE番号が挿入されています。($.fn.jqueryは変わらず)

- [Daniel Rufさんのパッチ](https://github.com/DanielRuf/snyk-js-jquery-174006)
- 私の作った改造版
  - [dist-1.12.4.tar.gz](https://nepgear.ramix.jp/jQuery/CVE-2019-11358/dist-1.12.4.tar.gz)
  - [dist-2.2.4.tar.gz](https://nepgear.ramix.jp/jQuery/CVE-2019-11358/dist-2.2.4.tar.gz)
  - [src.tar.gz](https://nepgear.ramix.jp/jQuery/CVE-2019-11358/src.tar.gz)
  
なお、私の作った改造版を使った上でのトラブルの一切は感知しません。ご自分の責任においてご利用ください。
Vue.jsでWebカメラで撮影した画像を取得する

# はじめに
Vue.jsでWebカメラで撮影した画像を取得するサンプルコードを紹介します
下記のコードをHTMLファイルで保存するだけでサクッと試せます

ググると、色々Vue.js＋Webカメラのサンプルコードが見つかりますが、うまく動かないものが多かったので[こちら](https://x-team.com/blog/webcam-capture-vue/)のサイトのコードを自分で動くように直しました
（動かない原因はVue.jsのバージョンの違いだった気がします）


# 環境

- Vue.js v2.6.10
- Chrome
- Windows 10

# 画面
こんな感じです

- 【画面上】Webカメラの映す映像（PCのカメラを紙で隠してます）
- 【画面下】"Snap photo"ボタン（押すと、写真を撮影します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/250ac4b6-6ef8-4a6d-102e-4c86f3afeded.png)

写真を撮ると、ボタンの下にポンポン追加されていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/765ac1b4-40a9-8070-af34-ac5a07cf6569.png)

写真のデータはBase64で配列に格納されています
これを取り出したりすると、任意の画像をサーバーに送るなりして好きに使えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/ab4bcd8f-3b18-896a-2abe-4fcbd9de349c.png)


# コード

こちらに以下の内容と同じものをアップしています
https://github.com/koinoue0315/vue-camera-sample/tree/master

```html

<!DOCTYPE html>
<html>

<head>
</head>

<body>
  <div id="app">
    <div>
      <video ref="video" id="video" width="500" height="500" autoplay></video>
      <div>
        <button color="info" id="snap" v-on:click="capture()">Snap Photo</button>
      </div>
      <canvas ref="canvas" id="canvas" width="500" height="500"></canvas>
      <ul>
      <li class="capture" v-for="c in captures" v-bind:key="c.d">
        <img v-bind:src="c" height="50" />
      </li>
      </ul>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        video: {},
        canvas: {},
        captures: []
      },
      mounted () {
        this.video = this.$refs.video
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
          navigator.mediaDevices.getUserMedia({ video: true }).then(stream => {
            this.video.srcObject = stream
            this.video.play()
          })
        }
      },
      methods: {
        capture () {
          this.canvas = this.$refs.canvas
          this.canvas.getContext('2d').drawImage(this.video, 0, 0, 500, 500)
          this.captures.push(this.canvas.toDataURL('image/png'))
          console.log(this.captures)
        }
      }
    });
  </script>

</body>
</html>

<style>
#canvas {
  display: none;
}
.capture {
  /* display: inline; */
  padding: 5px;
}
</style>
```

# ちょっと解説

"Snap Photo"ボタンをクリックすると、`capture ()` が呼び出されて
`this.captures.push(this.canvas.toDataURL('image/png'))`
ここに撮った写真を詰めています

`this.canvas.getContext('2d').drawImage(this.video, 0, 0, 500, 500)`
保存する画像のサイズはここで指定できます

# あとがき
この前このコードを使ったアプリを作りましたが、Vueでアプリ書くと楽しいですね
Vuetify使うと、整ったUIが簡単に出来て更に楽しいです

他のUIフレームワークも使ってまた開発したいなーと思ってます
【react-navigation】カスタマイズヘッダー適用時にカックカクする問題

## 起きたこと
1. まるで地震のような揺れ動くページview
2. 戻るボタンを押したら垣間見えるデフォルトbackボタン・・・。
なぜか、スワイプバックでは垣間見えない。

## スクショ
### ゆれる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/9fca9c19-f71a-00fe-d0e6-f032e8c7ab53.gif" width="300">
### みえる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/c11be056-71c7-4aa2-d4e7-1ae6dc374c49.gif" width="300">

## 背景
- ヘッダー部分をreact-navigationのHeaderの仕組みから抜け出してカスタマイズした
- それを適用した。

## 該当コード
```routes/favorite.js
...

const FavoriteBookNavigator = createStackNavigator(
  {
    [PATH.FAVORITE_BOOK]: {
      screen: FavoriteBook,
      navigationOptions: ({ navigation }: $Navigation) => ({
        header: (
          <DefaultHeader navigation={navigation} title={PAGES.FAVORITE_BOOK} />
        ),
      }),
    },
  },
  {
    defaultNavigationOptions: ({ navigation }: $Navigation) => ({
      header: (
        <DefaultHeader navigation={navigation} title={PAGES.BOX_HISTORY} />
      ),
    }),
  },
);

export default FavoriteBookNavigator;
```

- 各ページごとにheaderを設定。
- 共通config部分にも`defaultNavigationOptions`に対して`header`を指定する

## 改善後

```diff:routes/favorite.js
...

const FavoriteBookNavigator = createStackNavigator(
  {
    [PATH.FAVORITE_BOOK]: {
      screen: FavoriteBook,
      navigationOptions: ({ navigation }: $Navigation) => ({
        header: (
          <DefaultHeader navigation={navigation} title={PAGES.FAVORITE_BOOK} />
        ),
      }),
    },
  },
  {
-    defaultNavigationOptions: ({ navigation }: $Navigation) => ({
-      header: (
-        <DefaultHeader navigation={navigation} title={PAGES.BOX_HISTORY} />
-      ),
-    }),
+    headerMode: 'screen',
+    initialRouteName: PATH.MY_STYLE,
  },
);

export default FavoriteBookNavigator;
```

- 共通config部分は`headerMode`と`initialRouteName`に限定
- header設定は各プロパティに委ねる形に修正

### スクショ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/3ea02fcf-bb64-716b-2484-3a73d070180a.gif" width="300">

## 考察
- headerのComponent設定が二重に設定されたことによりレンダリングがおかしくなったか？
    - それを一つに限定したことにより解消された？
- そもそもの設定方法がおかしな設定になってしまったか？
    - でもカスタマイズHeaderじゃないとき（leftとかとか指定するやつ）はうまくいった・・・！
UITabBarItemで改行が効かなかった

### 概要
UITabBarのUITabItemで改行が効きませんでした。
久しぶりにswift触ったので改行コード自体を¥nとか書いちゃったけどw 
.titleに\nで入れても効きませんでした。

### ggr
ググると英語圏で下記の記事
https://stackoverflow.com/questions/46219860/multiple-lines-in-uitabbaritem-label
いちいちUITabBarのsubviewからUILabelを取り出して、設定してあげる必要があるらしい:dizzy_face:

### 結果
下記のようなメソッドを作って設定しました:expressionless:
とりあえずちゃんと設定されたけど、なんか違うような気もするなぁー・・・

```swift
    /**
     * タブアイテムの文字列改行
     */
    func tabItemNewLineText(menu_title: String, tab_number :Int) {
        let viewTabBar = self.tabbar.items![tab_number].value(forKey:"view") as? UIView
        let label = viewTabBar?.subviews[1] as? UILabel
        label?.numberOfLines = 0
        label?.textAlignment = NSTextAlignment.center
        // sizeToFitで上手く横幅が取れなかったため固定値で指定
        label?.frame = CGRect(x: (label?.frame.origin.x)!, y: (label?.frame.origin.y)!, width: 100, height: 30)
//        label?.sizeToFit()
        label?.text = menu_title
    }
```
環境変数系が記述できているのに読めてない＝＞spring疑う、は常套手段

初投稿
レベル低すぎて恥ずかしいけど備忘録はまとめたい
がんばるぞ

#発生
楽天APIを使用したアプリを作成してたらコンソールでうまく動作しなかった。
スクールの先生に助けてもらったところ、
**先生「spring が悪さしていたのでspringを再起動したら治った」**
**僕「どうやてって気づいたんですか？」**
**先生「環境変数系が記述できているのに読めてない＝＞spring疑う、は常套手段
　　　でもカリキュラムには書いてないから気付けなくても仕方ないよ」**
**僕「(´・ω・｀)」**

う～ん先生いなかったらめっちゃハマってそう。。。



#springとは？
###参考記事
https://ruby-rails.hatenadiary.com/entry/20141026/1414289421
http://b0npu.hatenablog.com/entry/2016/04/11/032826

###学んだこと
・springはRails4.1から標準で付属するようになったアプリケーションプリローダー
・railsサーバー再起動では再読み込みはされない
・コンソール起動時に自動で起動される

###つまり
環境変数を書き換えた後はspringを再起動する
$ spring status
$ spring stop
$ rails c
Bitriseで特定の条件のときに指定stepをskipする

## なにこれ
モバイル向けのCIとして有名な[Bitrise](https://www.bitrise.io/)にて
特定の条件下で同じWorkFlowでも特定のstepの処理を除外したいときがありました。

多分本来はWorkFlow自体を別のものを設定すべきなのだと思いますが、
１stepだけ違うWorkFlowをそれぞれメンテする未来がいやだったので、なんとか処理でstep実行を振り分けたかった。

## 結論
**run_if** を使う
[(公式リファレンス)](https://devcenter.bitrise.io/tips-and-tricks/disable-a-step-by-condition/) 

GUIでWorkFlowを作れるのがBitriseのいいところですが、もちろんコード管理などの為にコードベースの **bitrise.yml**が準備されています。

こちらの **run_if** プロパティを指定してstepの実行振り分けを行います。これはその名の通り、設定したstepを実行するか否かを判定するプロパティです。

## 使い方

<img width="975" alt="スクリーンショット 2019-04-22 16.01.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63740/90a141e7-a6b7-b827-e005-25d5a2b7d6fe.png">

WorkFlowEditorのbitrise.ymlを選択します

<img width="419" alt="スクリーンショット 2019-04-22 16.04.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63740/fbe66a82-c403-e667-8289-14841de13eb1.png">

今回は実行に時間のかかるvirtual device testのRoboテストを振り分けています。
コードは環境変数**ROBO TEST**がtrueの場合のみvirtual device testを実行するというものになります。

必須手順は以上。
あとはslackのカスタムコマンドで環境変数を設定したり、script stepを挿入して環境変数を設定するなどの方法があるかと思います。

## [外伝]実用例
今回僕が必要になったパターンをご紹介。

もともと対象のWorkFlowがPullRequestをトリガーとして実行されるものであり、そんなPR毎に毎度毎度Roboテスト実行してもなぁ…というところから始まりました。
検討の結果、ライブラリやgradleのアップデートなどロジックの変更はないけど動作を見ておきたいというようなPRのみRoboテストを実行することにしました

<img width="365" alt="スクリーンショット 2019-04-22 16.13.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63740/a96326cd-5325-13ea-d479-529b9bbb02b9.png">

なので対象のvirtual device testのstepの直前にscriptを設定

<img width="316" alt="スクリーンショット 2019-04-22 16.18.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63740/75a9c3ea-202f-f9d7-ff06-30726c2c580b.png">

Bitriseのデフォルトで利用可能な環境変数たち[Available environment variables](https://devcenter.bitrise.io/builds/available-environment-variables/)にある**BITRISE_GIT_MESSAGE**を利用してGithubPRのタイトルを取得、
その中に[rote test]の文字列がある場合にBitriseの環境変数を追加する [**envman**](https://devcenter.bitrise.io/tips-and-tricks/expose-environment-variable/)を利用してROBO_TEST環境変数を追加しています。

ちょっと運用がローカル運用しすぎて、Androidエンジニアが増えたらちょっと忘れがちなので、もう少し手を加えてbuild.gradleの変更差分があるときに実行するとかにしたほうがいいかなと思っています。
RNotebookで，エディタ上の改行と同じ位置でhtmlでも改行させる方法(HardLineBreaks)


```
---
title: "R Notebook"
output: 
  html_notebook: 
    pandoc_args: ["-f", "markdown+hard_line_breaks"]
---
```

pandocに渡す引数を設定する．
hard_line_breaksというオプションを設定することで，
マークダウンファイル上での改行がhtmlにも反映される．
<br><br><br><br><br>


オプションが無い場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34549/2f84ca50-3253-1f60-27f6-c08a4f8bf600.png)

オプションがある場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34549/f1daa0df-2aca-eb34-51fd-212b172451e8.png)
vuexでのstate監視（watch）

## Vuexでstate監視の仕方

```store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    foo: 1
  },
  getters: {
    getFoo: state => {
      return state.foo;
    }
  },
  mutations: {
    increment (state) {
      state.foo++;
    }
  },
  actions: {
    increment (context) {
      context.commit('increment');
    }
  }
});
```

```foo.vue
<template>
    <div>{{ foo }}</div>
</template>
<script>
  export default {
    ...

    mounted: function () {
      // 1秒ごとにインクリメント
      setInterval(() => {
        this.$store.dispatch('increment')
      }, 1000);
    },

    computed: {
      foo() {
        return this.$store.getters.getFoo;
      },
    },

    watch: {
      foo (val, old) {
        console.log('watch', val);
      }
    }
  }
</script>
```

## `modules`を使った場合

```store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import bar from './modules/bar'

Vue.use(Vuex);

export default new Vuex.Store({
  ...

  modules: {
    bar,
  }
});
```

```modules/bar.js
export default {
  namespaced: true,
  state: {
    foo: 1
  },
  getters: {
    getFoo: state => {
      return state.foo;
    }
  },
  mutations: {
    increment (state) {
      state.foo++;
    }
  },
  actions: {
    increment (context) {
      context.commit('increment');
    }
  },
}
```

```foo.vue
<template>
    <div>{{ foo }}</div>
</template>
<script>
  export default {
    ...

    mounted: function () {
      // 1秒ごとにインクリメント
      setInterval(() => {
        this.$store.dispatch('bar/increment') // namespaceで指定
      }, 1000);
    },

    computed: {
      foo() {
        return this.$store.getters['bar/getFoo']; // namespaceで指定
      },
    },

    watch: {
      foo (val, old) {
        console.log('watch', val);
      }
    }
  }
</script>
```
[iOS][Swift] Objective-C++ の静的ライブラリを導入するとリンクエラーとなる

##解決方法

**"-lstdc++"** をOther Linker Flagsに設定する
iPhone上でlibstdc ++に対して動的にリンクすることを許可します。
<img width="777" alt="Screenshot 2019-04-22 at 16.12.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/f7f98af8-ca94-1635-cb4f-9c24d0a5d7db.png">
参考：
https://stackoverflow.com/a/10241900
【非エンジニアにもオススメ】Visual Studio Code を Markdown エディターとして使う

# はじめに
弊社では開発環境として Visual Studio Code (以下VSCode) を利用しています。
メモ書き等は Markdown で記述する場合が多くVSCode上で記載したいと思いました。
※Markdown エディターは[Boostnote](https://boostnote.io/)等が有名ですよね。

そんな矢先 VSNotes なる拡張機能があることを知り導入してみました。
本記事では導入方法とOneDriveなどのクラウド環境との同期方法を紹介していきます。

# どんな感じか？

タグとディレクトリでファイルを管理することが出来ます。
プレビューもコマンドを使用してすばやく行うことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/dabd6fe9-1483-a7f7-4e96-1c7de8570c8d.png)
多機能ではないですがメモ書きには充分と思っています。


# 実行環境
 - Windows 10
 - Visual Studio Code - 1.33.1
 - VSNotes - 0.7.0

# インストールと環境整備

拡張機能の検索窓から「VSNotes」を検索しインストールを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/381b5297-9c34-cba9-483b-de45aa1f3461.png)

インストールが完了するとタブにアイコンが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/07fc23c1-b166-9418-2c15-acbf8427972b.png)

F1キーを押し VSNotes の Run setup コマンドを実行する 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/03945906-6ed0-b2f0-1c10-7679efd2e69d.png)

右下にポップアップウィンドウが出現するので「Start」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/2626e223-6212-760d-f014-f1112c2105c5.png)

.mdファイルを保存するディレクトリを指定する ( OneDrive等クラウドだと幸せになれる )
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/770ea229-69d7-be0f-0b60-731bf0d56fa6.png)


あとは指定したディレクトリに.mdファイルを入れて運用していくことになります

# 使い方
## Markdownファイルの生成
ファイル生成パターン1 : コマンドから新規のファイルを生成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/36e9ef4c-15fe-3b1c-c85a-9ac6e199e9bb.png)

ファイル生成パターン2 : 対象ディレクトリにmdファイルを入れる

フォルダ構造で入れても大丈夫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/7b8f80b8-3912-75b3-7114-ce600fae3f65.png)

更新ボタンを押すと表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/aca1f438-d2e4-70ae-5a45-4186a5cdd486.png)

## プレビュー機能
Markdown ファイルのプレビュー : F1からMarkdown : Open Previewを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/66a418a1-4a26-366e-a8ac-4bf2a3030a84.png)

プレビューウィンドウが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/65c40d06-0386-bd09-ed50-3d349b642d53.png)

他にも機能はありますが使う分にはこれで充分かと思ってます。

# まとめ
VSCode で Markdown のメモを作成するのにオススメな拡張機能「VSNotes」の紹介記事でした。
複数のPCやMacも併用して業務を行う自分としては非常に助かっているツールになります。
VSCOde で出来ることもドンドン増えているので是非触ってもらえれば幸いです。
Safariでvideo.play()したときにAbortErrorと言われたときの対応

※2019年4月22日現在の話です。videoの変更次第ではこの対応では不十分になるかもしれません。
※音声付きの動画を自動再生したいケースには非対応です。（できるかどうかも未検証です）

# 状況
iOS12 の Safari で、video.play() した際に、`Unhandled Promise Rejection: AbortError: The operation was aborted.`が発生する。
この際、動画が再生されることもあればされないこともある。（多分再生されないのが正しい動き）

# 対応
参考サイトにあるとおり、 `video.muted = true` と `playsinline` を設定する。
また、 `autoplay` は使わないようにする。

## 修正前
```javascript
const video = document.createElement("video");
video.autoplay = true;
video.srcObject = stream;
video.play();
```
## 修正後
```javascript
const video = document.createElement("video");
video.muted = true;
video.playsinline = true;
video.srcObject = stream;
video.play();
```

# 参考
https://lealog.hateblo.jp/entry/2018/03/27/161141
https://github.com/bbc/VideoContext/issues/66
感謝の機械学習: 目次

# TL;DR
機械学習の素人が最低一日一回何かしら機械学習に取り組んでます。
環境は、基本的にはAWSのSageMakerを利用しています。

# コンテンツ
[感謝の機械学習 : 環境構築編](https://qiita.com/asahi0301/items/5ca2fa20a57d7cf9df90)
[感謝の機械学習 : SageMakerでKerasを使う](https://qiita.com/asahi0301/items/5804b928c6a7fd5bc2d0)
[感謝の機械学習 : SageMaker で Keras の RNN を使ってみる](https://qiita.com/asahi0301/items/4a41ee57418093e68c24)
Atomでlatex環境作る時に色々ありすぎるのですぐに環境を作る方法のまとめ(mac)

色々ありすぎてよくわかんなくなるのでまとめます．
これですぐに構築できるようになるはず．

#Atomのインストール
brewでインストール

#Atomでの拡張機能を使うためのもろもろのpackageインストール
latex
language-latex
pdf-view
script


- Skimをインストールさせる記事があるが今はいらない．必要になったらでいい．



#brewによるmactexのインストール
以下の注意事項に注意する．

- brewだと長くていつ終わるかわからないのでpkgをクリックすることによるインストールをした

- basictexではなくmactexをインストールすること:
```brew cask install mactex```
basictexは使わないほうがいい．


#Atomでのlatexのpathの設定
**/usr/local/texlive/2018/bin/x84_64-darwin**
を設定．

#Atomでのpdfへのビルドを簡単にするための設定
Atom>preferences>packages>latex>settingsの設定でCommand+Sでpdfを表示しない設定にして，Command+Sのときはpdfのタブの変更をAtom内で確認できて，Command+Iのときはpdfの別ウィンドウとしてビルドを表示する．

#日本語入力のため
デフォルトのpdflatexだとarticleならいけるが，jsarticleとかはいけない．
**Atom>preferences>packages>latex>settingsで
pdflatex->platexまたはuplatexにする.**

- ptexの上位互換がuplatexらしい．https://texwiki.texjp.org/?upTeX%2CupLaTeX#redf175b


以上でビルドが通るようになります．

#latex自体のメモ
##jarticle,jsarticleでフォントが結構違う

- jarticleよりもjsarticleを使ったほうがいい．
- 段落の開け方とかがよくないらしい．


##フォントサイズの変更

- 11ptでいいのかも基本．

##usepackageのために

- Macにpackage追加する方法：https://qiita.com/SatoshiTanoue/items/42d1071083ea5f5df4a2
- graphicsのやつは入ってるのでusepackage書けばいいだけ．

##%でコメントアウトできる

- Command+/でコメントアウトできる
【iOS】UITextFieldとUITextViewの入力文字数制限

# 実装してみた

UITextField(10文字まで)

``` swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // 入力を反映させたテキストを取得する
    let resultText: String = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    if resultText.count <= 10 {
        return true
    }
    return false
}
```

UITextView(10文字まで)

``` swift
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    // 入力を反映させたテキストを取得する
    let resultText: String = (textView.text! as NSString).replacingCharacters(in: range, with: text)
    if resultText.count <= 10 {
        return true
    }
    return false
}
```

# 解説
`shouldChangeCharactersIn`、`shouldChangeTextIn`メソッドが呼ばれる時点では、入力したテキストがまだUITextFieldやUITextViewに反映されていません。
なので下記のような判定式だとうまくいきません。

``` swift
if textField.text.count <= 10 {
}
```

そこでreplacingCharactersメソッドで入力した文字を反映したテキストを取得して、そのテキストで判定してやればいいわけですね。
ちなみにコピペでも`shouldChangeCharactersIn`、`shouldChangeTextIn`メソッドが呼ばれるのでうまく判定できます。
react-native-safe-area-viewを使ってiOSのSafeAreaをよしなにする

React Nativeでネイティブアプリを作っていると、Appbar（Toolbar）をセットしたくなりますよね。

ただ、単純に「セットしただけ」だと、SafeAreaと思いっきりかぶってしまいます。
こんな感じ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/701636b4-ecd2-7fb5-a893-d886da6a2cd6.png" width="400">

```typescript:App.tsx
export default class App extends React.Component<Props> {
  render() {
    return (
        <Appbar>
          <Appbar.Content title="MyProfile" />
          <Appbar.Action icon="mail" onPress={this.showAlert} />
          <Appbar.Action icon="call" onPress={this.showAlert} />
        </Appbar>
        <View style={styles.container}>
          <View style={styles.body}>
            <Text style={styles.welcome}>Welcome to React Native!</Text>
            <Text style={styles.instructions}>To get started, edit App.js</Text>
            <Text style={styles.instructions}>{instructions}</Text>
            <Button icon="add-a-photo" mode="contained" onPress={this.showAlert}>Press me</Button>
          </View>
        </View>
    );
  } 
  showAlert() {
    Alert.alert("こんにちは世界！");
  }
```



ここにreact-native-safe-area-viewのSafeAreaViewを使うと、SafeAreaをよしなに避けてくれます。
こうなります。

<img width="400" alt="スクリーンショット 2019-04-22 15.41.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/53dc749d-3681-2b80-f41e-66150bd3e926.png">

```typescript:App.tsx
export default class App extends React.Component<Props> {
  render() {
    return (
      <SafeAreaView style={styles.container}>
        <Appbar>
          <Appbar.Content title="MyProfile" />
          <Appbar.Action icon="mail" onPress={this.showAlert} />
          <Appbar.Action icon="call" onPress={this.showAlert} />
        </Appbar>
        <View style={styles.container}>
          <View style={styles.body}>
            <Text style={styles.welcome}>Welcome to React Native!</Text>
            <Text style={styles.instructions}>To get started, edit App.js</Text>
            <Text style={styles.instructions}>{instructions}</Text>
            <Button icon="add-a-photo" mode="contained" onPress={this.showAlert}>Press me</Button>
          </View>
        </View>
      </SafeAreaView>
    );
  } 
  showAlert() {
    Alert.alert("こんにちは世界！");
  }
}
```


React Native楽しい！！！！！！！！
PowerShellで、ps1スクリプトを実行するノート

# この記事は
PowerShellで、ps1スクリプトを実行する方法をノートします。

# まずはやってみる
たまたまproxy設定したかったので、そんな内容の```set_proxy.ps1```を実行したい！

```powershell
PS C:\git\nnabla.git> .\set_proxy.ps1
.\set_proxy.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\git\nnabla.git\set_proxy.ps1 を読
み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を
参照してください。
発生場所 行:1 文字:1
+ .\set_proxy.ps1
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

=> ***冷たくない？？***

# 実行権限を設定する
```Set-ExecutionPolicy RemoteSigned```する


> tips:
TABで入力補完を使いながらコマンド入力すれば、
タイプミス、コマンド忘れ、などあっても大丈夫！


```powershell
PS C:\git\nnabla.git> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
' へのアクセスが拒否されました。 既定 (LocalMachine) のスコープの実行ポリシーを変更するには、[管理者として実行] オプシ
ョンを使用して Windows PowerShell を起動してください。現在のユーザーの実行ポリシーを変更するには、"Set-ExecutionPolicy
-Scope CurrentUser" を実行してください。
発生場所 行:1 文字:1
+ Set-ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyComma
   nd
```

=> ***固すぎるでしょ***

# CurrentUserへ実行権限を与える

```Set-ExecutionPolicy -Scope CurrentUser```して、```RemoteSigned```を付与する

```powershell
PS C:\git\nnabla.git> Set-ExecutionPolicy -Scope CurrentUser

コマンド パイプライン位置 1 のコマンドレット Set-ExecutionPolicy
次のパラメーターに値を指定してください:
ExecutionPolicy: RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
```

そしたら、

```powershell
PS C:\git\nnabla.git> .\set_proxy.ps1
PS C:\git\nnabla.git>
```

エラーが返ってこなくなったので、
```Get-Item -Path Env:http_proxy```
でvalueを読み出してみる。

```powershell
PS C:\git\nnabla.git> Get-Item -Path Env:http_proxy

Name                           Value
----                           -----
http_proxy                     <proxy address>
```

=> ***おっけ！***

# おまけ
拡張子をまちがえて "ps" で保存したら、adobe系が反応した。ぽｓｔｓｃりｐｔ
スクリーンショットが原因でiOSアプリの審査がリジェクトされた際の対処方法

# 事象
iOSアプリをAppleの審査に提出した結果、下記の理由でリジェクトされました。

```
Guideline 2.3.3 - Performance - Accurate Metadata


We noticed that your screenshots do not sufficiently reflect your app in use.

Specifically, your 6.5-inch iPhone screenshots do not display the app in the correct device frame.

Next Steps

To resolve this issue, please revise your screenshots to ensure that they accurately reflect the app in use on the supported devices. For example, a gaming app should feature screenshots that capture actual gameplay from within the app. Marketing or promotional materials that do not reflect the UI of the app are not appropriate for screenshots.

For iPhone, screenshots for 6.5-inch iPhone Xs Max and 5.5-inch devices (iPhone 6s Plus, iPhone 7 Plus, iPhone 8 Plus) are required. These screenshots will scale down for smaller device sizes.

For iPad, screenshots for 12.9-inch iPad Pro (2nd generation) and 12.9-inch iPad Pro (3rd generation) are required. These screenshots will scale down for smaller device sizes.

App Store screenshots should accurately communicate your app’s value and functionality. Use text and overlay images to highlight your app’s user experience, not obscure it. Make sure app UI and product images match the corresponding device type in App Store Connect. This helps users understand your app and makes for a positive App Store experience.

Resources

For resources on creating great screenshots for the App Store, you may want to review the App Store Product Page information available on the Apple Developer website. 

Please ensure you have made any screenshot modifications using Media Manager. You should confirm your app looks and behaves identically in all languages and on all supported devices. Learn more about uploading app previews and screenshots in App Store Connect Help.
```

# 原因
原因は下記の2つです。

- アプリ利用中の画面をスクリーンショットに反映していなかった
- 6.5インチ端末用のスクリーンショットを6.5インチ端末で撮っていなかった

この審査に提出したスクリーンショットには、スプラッシュ画面とアプリトップ画面の2種類のスクリーンショットしか提出していませんでした。
これが1つ目のリジェクト理由です。

さらに全てのスクリーンショットを5.5インチ端末で撮っていました。
これが2つ目のリジェクト理由です。

# 対処
まず1つ目のリジェクト理由に対処するために、既に提出済みのスクリーンショット以外にアプリ使用中の画面のスクリーンショットを撮って提出しました。
そして2つ目のリジェクトへ対処するために、iPhone X Maxを用いて6.5インチ用のスクリーンショットを撮り直しました。

# 結果
無事審査を通過することができました。
Craft CMS で前後のエントリを取得する（チャンネルの場合）

[前回](https://qiita.com/BUN/items/42e011ba5b3ea97c6899)に引き続き、Craft CMS の詳細ページテンプレートで前後のエントリへのリンクを出力する方法について。

今回は `チャンネル` の場合のサンプルコード。
`チャンネル` セクションの場合、エントリの並び順を整数値で DB に保持している訳ではないため、投稿日を利用して絞り込みを行う。

## 直前のエントリへのリンクを出力

```twig
{% set prevEntry = craft.entries
  .section('news')
  .id('not ' ~ entry.id)
  .postDate('<= ' ~ entry.postDate.timestamp)
  .orderBy('postDate desc')
  .one() %}

{% if prevEntry %}
  <a href="{{ prevEntry.url }}">{{ prevEntry.title }}</a>
{% endif %}
```

直前のセントリの取得にあたり

- `.id('not ' ~ entry.id)` で現在のエントリを除外
- `.postDate('<= ' ~ entry.postDate.timestamp)` で投稿日のタイムスタンプ以前のものだけに絞り込み
- `.orderBy('postDate desc')`で投稿日の降順にソート

を行なった上で、最後に `.one()` で最初の1件だけを取得している。

## 直後のエントリへのリンクを出力

```twig
{% set nextEntry = craft.entries
  .section('news')
  .id('not ' ~ entry.id)
  .postDate('>= ' ~ entry.postDate.timestamp)
  .orderBy('postDate asc')
  .one() %}

{% if nextEntry %}
  <a href="{{ nextEntry.url }}">{{ nextEntry.title }}</a>
{% endif %}
```

こちらも「直前のエントリ」と考え方は同じだが

- `.postDate('>= ' ~ entry.postDate.timestamp)` で投稿日のタイムスタンプ以降のものだけに絞り込み
- `.orderBy('postDate asc')`で投稿日の昇順にソート

の調整を行なっている。

## 参考：カテゴリを絞り込む場合

```twig
{% set category = entry.category_news.one() %}

{% set prevEntry = craft.entries
  .section('news')
  .relatedTo({
    targetElement: category_news,
    field: 'category_news'
  })
  .id('not ' ~ entry.id)
  .postDate('<= ' ~ entry.postDate.timestamp)
  .orderBy('postDate desc')
  .one() %}
```

エントリに紐づいている最初のカテゴリと同じカテゴリに属するものだけに絞り込む場合の例。リレーションに関する絞り込みは `.relatedTo` を利用する。

## 参考：エレメントクエリを共通化する場合

```twig
{# 共通のエレメントクエリをセット #}
{% set entryQuery = craft.entries
  .section('news')
  .id('not ' ~ entry.id)
  .limit(1) %}

{# 「直前のエントリ」を取得 #}
{% set prevEntry = clone(entryQuery)
  .postDate('<= ' ~ entry.postDate.timestamp)
  .orderBy('postDate desc')
  .one() %}

{# 「直後のエントリ」を取得 #}
{% set nextEntry = clone(entryQuery)
  .postDate('>= ' ~ entry.postDate.timestamp)
  .orderBy('postDate asc')
  .one() %}
```

エレメントクエリを使い回すため、`clone(query)` で複製したものを利用している。詳細は下記参照。

**Craft 3 の変更点 > エレメントクエリの複製**
https://docs.craftcms.com/v3/ja/changes-in-craft-3.html#エレメントクエリの複製
Raspberry Piを使って自動走行するラジコンカーを作ってみた

## はじめに
端から端まで説明しようとすると大変長い記事になってしまうと思ったので、今回は全体を大まかに紹介します。細かいところについては別の記事に分けて書いていきます。また、記事を書くのもIoTに関しても初心者同然ですのでぜひアドバイス・ご意見をお聞かせください。


## 概要
Raspbeey Piに学習させたモデルを搭載して、道路の左車線を自動で走行するラジコンカーです。今回は直線のみを対象にし、道路からはみ出さないように設計しました。見た目が戦車だったので停止時に物体検出して自作砲台(3Dプリンターで作成)から輪ゴムを発射するオプションも加えてみました。

[完成形]
<img width="600" alt="rcar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/eb6020e6-685e-81e6-2869-67035af726da.png">
　　

[全体の流れのイメージ]
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/e8b58b5c-0f0d-c529-f95e-013815508e5e.png">

##開発環境

* Raspberry Pi 3B raspbian 9.4
* Jupyter Notebook 4.4.0
* Python 3.5.3
* TensorFlow 1.11.0
* OpenCV 3.4.4

##行ったこと

* ラジコンの製作
  * [これ](https://www.amazon.co.jp/gp/product/B014L1CF1K/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)の組み立て
* OSのインストール
* Raspberry Piの環境構築
  * SSHの設定やIPアドレスの固定、その他必要なフレームワークのインストールなど
* 3Dプリンタの使用
  * 砲台やモータドライバを固定するための土台づくり
* プログラミング(Python)
  * ラジコンの制御(サーボモータ、DCモータ)
  * CNNによる画像の分類
  * 物体検出(Tiny-YOLOv3) 
* データセットの収集
  * 前進、右折、左折の3クラスの画像取集
* モデルの作成

## 全体の流れ(フローチャート)

 <img width="834" alt="flowchart.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/3cd09493-d86b-4e6c-f03c-6880af229d0b.png">
今回、停止は手動で行っています。何かしらをトリガーにして停止の処理も自動でできるようにしたいですね。

## アーキテクチャ
[内部]
<img width="807" alt="architecture1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/41b18981-2035-1d80-5fcc-122279fffbbf.png">
  
[外部]
<img width="836" alt="architecture2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/14f25ef9-2c7a-4b12-c75e-ec4dcea68397.png">
内部と外部の2段構想になっています。ラズパイは内部と外部で同様のものです。カメラは道路を撮影する用と物体を検出する用の2つに分けてました。サーボモータは片方を砲台の向きを変えるための、もう片方を輪ゴムを発射させるように分けました。

## 学習モデルの作成

[NVIDIA DIGITS](https://developer.nvidia.com/digits)を使ってモデルを作成しました。道路からはみ出さないようにする進むには、前進と右折と左折の3パターンが必要なので、その時の状況に合わせてコースからそれぞれデータを取得します。画像は全体で1300枚程用意して、トレーニング画像とバリデーション画像の割合を8:2としました。ネットワークはラズパイに搭載するということもありLeNetを採用しています。

![dataset.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/5d3349a6-d114-c493-f2d5-b66735d78908.jpeg)

## 結果
[https://youtu.be/1bVmcZxtD7E](https://youtu.be/1bVmcZxtD7E)
<img width="1271" alt="detection.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402261/e519c64a-5fcc-d7d8-0e9b-90470bb221f1.png">


## 最後に
皆さんのご意見をぜひ聞かせてください!
あと、[Twitter](https://twitter.com/kagua1010)始めました。
フォローよろしくお願いします!!

## 追記
ブログの方でも紹介しています。
こちらもぜひよろしくお願いします。
[Raspberry Pi と深層学習で作る自動走行ラジコンカー - Revel Tech Blog](https://reveltb.com/ikath/r-car/)
会社で使ってるPCの起動がクソ遅いのでコンパクトOSを試してみる

## 目次


- [HDD機の起動が遅い](#hdd機の起動が遅い)
- [デフラグで早くなる？](#デフラグで早くなる)
- [OSのファイルを圧縮してファイルの読み込み量を少なくする](#osのファイルを圧縮してファイルの読み込み量を少なくする)
- [メリット、デメリット](#メリットデメリット)
    - [メリット](#メリット)
    - [デメリット](#デメリット)
- [Windows10のコンパクトOS化](#windows10のコンパクトos化)
    - [システムの圧縮状態を調べるコマンド](#システムの圧縮状態を調べるコマンド)
    - [システムを圧縮するコマンド](#システムを圧縮するコマンド)
    - [システムの圧縮を解除するコマンド](#システムの圧縮を解除するコマンド)
- [実行結果](#実行結果)
- [結局早くなったの？](#結局早くなったの)
- [でもまだ遅い](#でもまだ遅い)

## HDD機の起動が遅い

会社のPCがHDDで起動がクソ遅い。

できればSSDに換装したいところだけど、自腹はなんか負けた気がするので、HDDのままで高速化する方法を探してみる。

## デフラグで早くなる？

XPの頃はデフラグすればそれなりに早くなったけど、Win10ではあんまり効果ない気がする。

というかそもそも断片化自体起こりにくいっぽい。

そもそも、毎週勝手にデフラグされてるっぽい。

## OSのファイルを圧縮してファイルの読み込み量を少なくする

Windows8.1ぐらいから似たような機能があったらしい？

(Windows 8.1の頃はリカバリ領域からファイルを読むようにすることでシステムが入ってるディスクの空き容量を空けることが出来るものだったっぽい)

Windows 10から新たに追加された「コンパクトOS」って機能が良さげ。

OSのファイル群を圧縮してファイルの読み込み量を少なくすることで、高速化出来るみたい。

OSのサイズが小さくなるから、ストレージが少ない時とか、HDDで起動が遅い時とかに使える便利機能らしい。

## メリット、デメリット

### メリット
- OSのサイズが減るので、使用可能な容量が増える。
- ファイルの読み込み量が減るので、ディスクへの負荷が下がる。
- ファイルの読み込み量が減るので、ディスクが遅くても比較的早く起動可能になる。

### デメリット
- システムを圧縮するので、起動時に解凍するためにCPUリソースを使用する。
- 読み込み速度が早いストレージを使っている場合、CPUで解凍処理をするほうが遅くなることもある。
- CPUの性能が悪いと逆に遅くなる可能性もある。

## Windows10のコンパクトOS化

コマンドプロンプトから可能。

管理者権限で起動したコマンドプロンプトで以下のコマンドを実行する。

### システムの圧縮状態を調べるコマンド

```
compact /compactos:query
```

このコマンドでシステムが圧縮されているかどうかを確認できる。
また、圧縮されていない場合は、圧縮可能かも表示される。

### システムを圧縮するコマンド

```
compact /compactos:always
```

システムを圧縮するためのコマンド。
圧縮にはそこそこ時間がかかるので、ノートPCの場合は電源に接続した状態で実行したほうが良い。

以下の環境で大体1時間くらいかかった。

CPU Intel Core i5 7500
RAM 8GB
OS Windows 10 Pro
HDD Seagate製 3.5インチ 500GB

### システムの圧縮を解除するコマンド

```
compact /compactos:never
```

圧縮済みのシステムの圧縮を解除するコマンド。
圧縮と同じく、そこそこ時間がかかるので、ノートPCの場合は電源に接続してからやったほうが良い。

## 実行結果

![CompactOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397389/8f11c373-d8cf-8d75-d3c4-808a4cd19fff.png)

## 結局早くなったの？

正確な起動時間を測ったわけではないけど、早くなった。

体感的には起動時間が3~5割くらい早くなった気がする。

とりあえずは満足。

## でもまだ遅い

OSの起動は早くなったけど、起動してからもHDDがカリカリなんかを読み書きしてる。

どうやら会社のルールとして入れないといけないマカフィーが起動時になんかしてるっぽい・・・

結果「SSDを自腹で買ってきたほうが早そう」という結論に。
git commitした際のエラー(Please tell me who you are)について

表題のようなエラーが発生した場合の対処方法です。

# 現象

```
$ git commit

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'XXX@XXX.(none)')
```

# 解決方法

あなたは誰ですかと聞かれているので、


```
$  git config --global user.email 自分のメールアドレス
$  git config --global user.name 自分の名前
```

上記のコマンドで登録してあげれば、
git commit出来るようになりました。
IntelliJ IDEAで「... are not supported by current JavaScript version」と出る場合


例えば、`let v = 1;`と書いたとき、下記のエラーが出る。

```
Let definitions are not supported by current JavaScript version
```

構文チェックの基準となるJavaScriptのバージョンが古いかもしれない。

「Preferences -> Languages and Frameworks -> JavaScript」と進み、「JavaScript language version」を変更する。

今回は、「ECMAScript 6」に変更した。
Semantic UIに日本語フォントを設定する

# はじめに
最近UIフレームワークにSemantic UIを使っていますが、サイト全体に日本語フォントを
適用するやり方に少し手間取ったので備忘録的に残します。

公式はこちら
[Semantic UI](https://semantic-ui.com/)

# Semantic UI日本語フォント設定
サイトのグローバル設定ファイルはここにあります。
`semantic/src/site/globals/site.variables`

このファイルに下記のように日本語フォントを設定します。

```css:site.variables
/*******************************
     User Global Variables
*******************************/
@headerFont        : 'Hiragino Kaku Gothic Pro W3','Hiragino Kaku Gothic ProN',Meiryo,sans-serif;
@pageFont          : 'Hiragino Kaku Gothic Pro W3','Hiragino Kaku Gothic ProN',Meiryo,sans-serif;
```
※上記例ではヒラギノ角ゴ、メイリオを優先で設定しています。

修正後にビルドします。

```sh
gulp build
```

`dist`以下に最終的なCSSが出来上がります。

# おわりに
以前はBootstrapを使っていましたが、どうしてもBootstrap色が強いデザインに
なってしまうため、最近は比較的クセの薄いSemantic UIを使っています。
Semantic UIは機能的にもかなり充実している印象で、個人的には使いやすいと思うのですが
ドキュメントが読みにくいのが、いろいろと調べていく中で厳しいなぁと感じるところです。
VSCodeのPowerShell Integrated Consoleがフリーズする

# はじめに
PowerShellスクリプトの開発や、djangoでの開発にVSCodeを使用しています。
VSCodeのPowerShell拡張を入れた際に追加される、PowerShell Integrated Consoleが、起動直後にフリーズしてしまい、使い物にならなくなってしまいました。
その対処法についてです。

# 環境
Windows10
VSCode + powershell extention
(VSCodeは英語のまま使用しています。…このせいじゃないですよね？)

# 症状
VSCodeを起動し、Shift+Ctrl+@でTERMINALを起動したところ、以下のようになってしまいます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369361/bc170a80-db1e-1ae4-013b-c49fbdf00c74.png)

このまま何も操作ができず、右上のごみ箱ボタンで捨てることしかできません。
新規に起動しても同じ状態になり、何もできない…。
PowerShell Integrated Consoleが使えないと、breakpointを挿入しても無視されてしまい、デバッグ環境として劣悪なものになってしまいます。

# 解決方法
以下のファイルを作成することで解決できました。

```powershell:C\Users\user\Documents\WindowsPowerShell\Microsoft.VSCode_profile.ps1
[System.Console]::OutputEncoding = [System.Text.Encoding]::Shift_JIS
```

これでbreakpointも動くようになり、まともに使えるようになりました！

# 参考
参考にさせて頂いたURLはこちらになります。

[github issues](https://github.com/PowerShell/vscode-powershell/issues/742)

コミュニティの皆さんに感謝です。
iOS アプリの多言語化（ローカリゼーション）まとめ（AppStore編）

iOS アプリを多言語化する機会があったので App Store Connect 上での設定の対応をまとめてみました。

- 公式ドキュメント
  - https://help.apple.com/app-store-connect/?lang=ja-jp#/deve6f78a8e2
- アプリの対応についてはこちら
  - [iOS アプリの多言語化（ローカリゼーション）まとめ（アプリ編）](https://qiita.com/de_kichi/items/b7b12a03871c3f3bb73f)

## App Store 上の言語欄に表示される言語
これはアプリのプロジェクト設定の `Localizetions` に設定されている言語が自動的に表示されます

## メタデータのローカライズ
- App情報画面の右上部に言語を選択するコントロールがあるので、そこから必要な言語を追加していきます
- それぞれの言語で必要な情報を入力していきましょう

### プライマリ言語とは
- 設定されたアプリの配信先に対応する言語のローカライズがされていない場合、プライマリに設定されている言語がストア上で表示されます
  - アプリ内の Localized.sring ファイルの Base と同じようなものです

> 例えば、ストア上のローカライズが日本語と英語のみだった場合、フランス語圏でストアを表示した場合にプライマリが日本語に設定してあれば日本語で、プライマリが英語なら英語で表示されます

## アプリ内課金情報のローカライズ
- 各プロダクトの設定画面に `ローカリゼーション` という項目があるのでそこの `+` ボタンから言語を追加し必要な情報を入力します
- 登録グループも同様です

## おまけ
### テリトリ（配信先）の設定
アプリを配信する地域をここから設定することができます。
変更は24時間以内に反映されるようなので、アプリのバージョンアップと配信先の変更を絡めたい場合は審査完了後に配信を開始するタイミングで変更すると良いと思います。
https://help.apple.com/app-store-connect/?lang=ja-jp#/devcdda55918
iOS アプリの多言語化（ローカリゼーション）まとめ（アプリ編）

iOS アプリを多言語化する機会があったのでアプリ内での対応をまとめてみました。
- ストアの対応についてはこちら
    - [iOS アプリの多言語化（ローカリゼーション）まとめ（AppStore編）](https://qiita.com/de_kichi/items/859124c1169c058dc843)

## アプリ内の文言を言語によって切り替える
### 辞書ファイルの準備
- PROJECT の設定 Info タブ内の Localizetions の `+` ボタンから必要な言語を追加する
- Localizable.strings ファイルを追加する
- Localizable.strings を選択し、ウインドウ右の File inspector の `Localize…` ボタンをクリックして表示を切り替えたい言語にチェックを入れる
- 先ほど追加した Localizable.strings の下に言語毎のファイルがツリー表示される

> `Localizable.strings(Base)` は端末の言語設定に対応する言語が追加されていない場合に参照されるファイルです。その場合に日本語で表示させたい場合はこの中身も日本語で記述します。

- 追加された言語毎の Localizable.strings に、参照キーと表示させたいテキストを `"キー名" = "テキスト";` の形で追加する

```swift:Localizable.strings(Base)
"exampleTextKey" = "テキスト";
```
```swift:Localizable.strings(Japanese)
"exampleTextKey" = "テキスト";
```
```swift:Localizable.strings(English)
"exampleTextKey" = "text";
```

### コード
```swift:swift
exampleLabel.text = NSLocalizedString("exampleTextKey", comment: "")
```
のように書けば端末の言語設定によって切り替えることができますが、この場合は端末の言語設定による切り替えしかできず、端末の言語設定≠アプリの言語設定の場合に対応できません。
また全てに `NSLocalizedString(~` を書くのは面倒なので、 後述のように `String` クラスを拡張して `"キー名".localized` で参照できるようにするのが見た目もスッキリするのでおすすめです。

```swift:swift
exampleLabel.text = "exampleTextKey".localized
```

### String クラスの拡張
#### 端末の言語設定によって切り替える場合
```swift:StringExtension.swift
import Foundation

extension String {
  var localized: String {
    return NSLocalizedString(self, comment: "")
  }
}
```

#### アプリ内の設定によって切り替える場合
ローカライズのリソースが英語の場合は `en.lproj` フォルダに格納されることから、下記サンプルコードの `lang` に相当する文字列は、日本語なら `ja` 、英語なら `en` など、ISO 639-1 に準拠している必要があります。不安であればローカライズを追加した時にできるフォルダ名で判断するといいでしょう。

```swift:StringExtension.swift
import Foundation

extension String {
  var localized: String {
    let lang = {アプリ内で設定している言語の文字列を取得するコード}
    // lang からリソースのパスを取得して bundle を取得
    guard let path = Bundle.main.path(forResource: lang, ofType: "lproj"),
      let bundle = Bundle(path: path) else {  
        // bundle が取得できなかった場合は端末の言語設定を元に切り替える
        return NSLocalizedString(self, comment: "")
    }
    // 取得した bundle でキーを参照して切り替える
    return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
  }
}
```

## 言語によってプライバシーデータアクセス許可の文言を変更する
- これは端末の言語設定による変更のみです

1. InfoPlist.strings ファイルを追加する（すでに存在していれば手順4のみ）
2. InfoPlist.strings を選択し、ウインドウ右の File inspector の `Localize…` ボタンをクリック
3. アプリ名を切り替えたい言語にチェックを入れる
4. 追加された InfoPlist.strings(言語名) にアクセス許可の種類に対応するキーと文言を追加する

```swift:InfoPlist.strings(言語名)
// フォトライブラリへ書き込みのアクセス許可の場合
NSPhotoLibraryAddUsageDescription = "言語名したい言語での文言";
```

## 言語によってアイコンのアプリ名表示を切り替える
- これも端末の言語設定による変更のみです

1. InfoPlist.strings ファイルを追加する（すでに存在していれば手順4のみ）
2. InfoPlist.strings を選択し、ウインドウ右の File inspector の `Localize…` ボタンをクリック
3. アプリ名を切り替えたい言語にチェックを入れる
4. 追加された InfoPlist.strings(言語名) に以下を追加する

```swift:InfoPlist.strings(言語名)
CFBundleDisplayName = "表示したいアプリ名";
```
bashで終了ステータスが100を越える時、とは？

# TL;DR

* Linux環境で、たまに終了ステータスが100を越えるような数字を見ることがある
* これはシグナルを受けて終了した場合で、どのようなシグナルを受け取ったかは128を引いてみればよい


# お題

Ubuntu Linux 18.04 LTSで試してみます。

```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.2 LTS
Release:	18.04
Codename:	bionic
```

例えば、以下のようなJavaプログラムを書いてみます。

App.java

```java
import java.util.concurrent.TimeUnit;

public class App {
    public static void main(String... args) throws InterruptedException {
        while (true) {
            TimeUnit.SECONDS.sleep(3L);
            System.out.println("waiting...");
        }
    }
}
```

終了しないプログラムですね。

これをコンパイルして

```shell
$ javac App.java
```

実行。

```shell
$ java App 
waiting...
waiting...
```

適当なところで、Ctrl-cで止めます。

```shell
^C
```

この時の終了ステータスを見ると、"130"となります。

```shell
$ echo $?
130
```

130ってなんでしょう？

[終了ステータス#bash](https://ja.wikipedia.org/wiki/%E7%B5%82%E4%BA%86%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9#bash)

この部分を見てみます。

> | 128+n | シグナル n で終了 |

というわけで、シグナルを送って強制終了したプログラムなので、実際にどのようなシグナルが送られたかは128を引けばわかるというわけです。

シグナルの一覧を見てみましょう。

```shell
$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
```

130 - 128 = 2（SIGINT）、つまり割り込み（interrupt）です。

Ctrl-Cで割り込んだので、一致しますね。

というわけで、こういうケースは128を引けばよい、と知っておくとよいでしょう。
感謝の機械学習 : 環境構築編

# 目次はこちら
[感謝の機械学習](https://qiita.com/asahi0301/items/46e7da4518417cfe0eb5)

# TL;DR
機械学習の素人が最低一日一回何かしら機械学習に取り組んでます。
環境は、基本的にはAWSのSageMakerを利用しています。

# 環境構築
## SageMakerノートブック作成
こちらを参考にすれば作れるかと思います
https://dev.classmethod.jp/machine-learning/getting-started-with-amazon-sagemaker/#toc--2-amazon-sagemaker-

## 基本的な使い方
基本的な使い方も上のリンクのStep3に書いています。
Xcodeを完全にアンインストールする

XcodeはAppをゴミ箱に捨てるだけでは、関連ファイルが残ったまま。
関連ファイルを含めて完全にアンインストールするには、以下を削除する。

/Applications/Xcode.app
/Library/Preferences/com.apple.dt.Xcode.plist
~/Library/Preferences/com.apple.dt.Xcode.plist
~/Library/Caches/com.apple.dt.Xcode
~/Library/Application Support/Xcode
~/Library/Developer/Xcode
~/Library/Developer/CoreSimulator
JSON 関連の新機能を試す（Oracle Database 19c）

Oracle Database 18c/19cではJSON関連の新機能が増えています。Oracle 19cで増えたJSON関連関数と構文を使ってみました。非Exadata環境用のオンプレミス版Oracle Database 19cはまだ提供されていないため、LiveSQLを使って検証しています。

# JSON_OBJECT関数
指定したデータをJSON型に変換して返す関数です。マニュアルは[こちら](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_OBJECT.html)です。
関数に渡すデータは非常に柔軟に指定できます。Oracle Database 19cでは、行データをすべてJSONに変換するためにJSON_OBJECT関数に'*'を指定できるようになりました。JSONオブジェクトのプロパティは列名がそのまま使われます。

![json_object(*)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/02ba367b-8bff-3a6c-201b-ae1f29ebab43.png)


特定の列を指定することもできます。列名の大文字／小文字指定がJSONオブジェクトのプロパティに使われます。下記の図では、first_nameが小文字に、LAST_NAMEが大文字として出力されています。

![json_object(first_name, LAST_NAME)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/c494f564-bc3f-9f3b-7ba6-55adc3cac548.png)

JSONデータの名前部分に任意の文字列を指定する場合は、 「KEY '名前' VALUE 列名」の形式で記述します。または「'名前' : 列名」の形式で指定することができます。

![json_object('id' : employee_id)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/ee6dc732-1be5-e614-baba-a51d2377aa63.png)


# NESTED COLUMNS構文
JSONデータの中から、特定のプロパティ値のみ取り出す NESTED COLUMNS構文が追加されました。JSON_TABLE関数よりも簡単に使うことができます。マニュアルは[こちら](https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/function-JSON_TABLE.html)です。

## データの作成
CREATE TABLE文と、INSERT INTO文でHR.EMPLOYEESテーブルから新しいテーブルを作成します。
![create data](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/77ebed26-0d9c-d862-4522-a5d03eaa27d7.png)

## NESTED COLUMN構文
NESTED COLUMNS構文で、jsonCol列に格納されたJSONデータからFIRST_NAMEとLAST_NAMEのみを取り出しています。

![NESTED COLUMN](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/62886ac5-4a70-4154-18d2-e9f6363e6176.png)
XcodeやApplication Loaderでエラーが起こる 〜iTMSTransporterの初期化〜

XcodeやApplication Loaderからビルドをアップロードする際、なんかしらのエラーが起きた際、
原因や解決方法はいろいろあると思うが、最終手段としてiTMSTransporterの初期化がある。
iTMSTransporterはiTuneStoreにアップロードするツール。

```
rm -rf ~/.itmstransporter/

/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter
```