OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptでゼロパディングとゼロサプレス

## ゼロパディングとゼロサプレス

ゼロパディング・ゼロサプレスとは、

[ゼロパディング  【 zero padding 】  ゼロ埋め / ゼロサプライ / 前ゼロ](http://e-words.jp/w/%E3%82%BC%E3%83%AD%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0.html)

>ゼロパディングとは、数値を文字として表現・表示する際に、指定された桁数に足りない分だけ左右に「0」を追加する処理のこと。決まった長さ（固定長）の文字列に変換したいときに行われる。

> ゼロサプレス (zero suppress)
> これとは逆に、「0012.3400」を「12.34」にするといったように、先頭あるいは末尾の余分な「0」を削除したり空白で置き換え、数値としての本来の表記に戻す処理のことは「ゼロサプレス」（zero suppress）という。ゼロパディングと意味を取り違えやすいので注意が必要である。


## JavaScriptでゼロパディング

String.prototype.padStart()を使います。

[String.prototype.padStart()
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)

> `str.padStart(targetLength [, padString])`
> パラメーター
> `targetLength`
> 現在の文字列の延長後の長さ。パラメーターが現在の文字列の長さよりも短い場合、現在の文字列が返される。
> `padString` `Optional`
> 現在の文字列を延長するための文字列。この文字列が長すぎる場合、切り捨てられて、左の部分が適用されます。 このパラメーターの既定値は、" " (U+0020) です。
> 戻り値
> 現在の文字列の先頭に延長が適用された `String`。

```js
// 例：'1234567'をゼロパディング
const padded = '1234567'.padStart(8, '0')
console.log(padded) // '01234567'
```


## JavaScriptでゼロサプレス

様々な方法があると思いますが、今回は簡単なのでLodashのtrimStartを使います。

[Lodash trimStart](https://lodash.com/docs/4.17.11#trimStart)

> `_.trimStart([string=''], [chars=whitespace])`
>
> Removes leading whitespace or specified characters from string.
> 
> Arguments
> [string='']\(string): The string to trim.
> [chars=whitespace]\(string): The characters to trim.
>
> Returns
> (string): Returns the trimmed string.

```js
// 例：'01234567'をLodashのtrimStartでゼロサプレス
const trimmedString = trimStart('01234567', '0');
console.log(trimmedString); // '1234567' 
```


## LodashのpadStartを使ったゼロパディング

ちなみにLodashのpadStartを使ってもゼロパディングができます。

[Lodash padStart](https://lodash.com/docs/4.17.11#padStart)

> `_.padStart([string=''], [length=0], [chars=' '])`
> Pads string on the left side if it's shorter than length. Padding characters are truncated if they exceed length.
>
> Arguments
> [string='']\(string): The string to pad.
> [length=0]\(number): The padding length.
> [chars=' ']\(string): The string used as padding.
>
> Returns
> (string): Returns the padded string.

```js
// 例：'1234567'をLodashのpadStartでゼロパディング
const paddedString = padStart('1234567', 8, '0');
console.log(paddedString); // '01234567'
```
【Blender】UV Texture Atlasを追加する

【Blender】UV Texture Atlasを追加する

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

<img width="794" alt="スクリーンショット 2019-02-07 23.38.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/321ea5c0-83ae-df80-cd34-c2797f58f028.png">


#<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

詳細は、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/02/07/234323)
BitLockerをゆるく使う

# BitLockerすることにした件

― 201902

（悲しい方向への）ライフステージの変化に伴い、内蔵DISKやバックアップ用の外付けUSB-HDD、USBメモリを暗号化しておこうかなと思い立ちました。

## 結論(妥協点)

他のPCにDISKを接続したときに安易にみられないようにできればとりあえずOK、仕組みに手間をかける隙が無い。

- ノートパソコン
 RDP接続以外では利用しにくいロケーションなので、システムドライブの暗号化はあきらめた。（起動時のパスワード入力が困難）
　他の固定ドライブが自動ロック解除できるように、タスクスケジューラで特定のユーザーがログオン時開始のタスクを作成した。

- デスクトップ
 システムドライブを暗号化し、固定ドライブの自動ロック解除を有効化した。

```unlock.bat
バッチファイルの中身
manage-bde -unlock D: -rp 回復キー
```

### 問題点（目をつぶった箇所）

1. サインアウト->別ユーザでサインインすると、別ユーザでもDISKの中身が見えるので、共有PCでは注意が必要
1. 暗号化されていないCドライブに平文の回復キーが保管されているので、勘のいい人はデータサルベージ可能。（アカン）
　そのうちPowershellでせめて平文はやめるようにしよう。
[PowerShellで生成したパスワードを暗号化して保存する@Takeruさん](https://qiita.com/Takeru/items/c8c769f88e8ccb06ffe3)

### システムドライブをBitLockerしなかったのは

1. 暗号化解除用のUSBメモリの運用をきちんとしないのが目に見えている。（どうせさしっぱなしなので)
1. Bitlocker解除用のパスワード入力がしんどい。（ノーパソはメタルラックの奥に格納されていて安易に取り出せない、母艦PCからRDPで使っているため。）

## Environment

おうちの環境は以下の通り

- ADとかはないよ
- Windows10 Proが数台
- PCには大抵バックアップ用のUSBストレージがささっている。
- TPMのある機械は無い


## 暗号化解除の違い（小並感）

暗号化するときに勝手に決まる（？）

- BitLocker　　　　：　固定ドライブ向け
　システムドライブをBitlockerしないと自動ロック解除ができないのでちょっと手間がかかる。
　ロック解除は**PC毎**=再起動までは他のユーザでも有効

- BitLocker To Go ：　リムーバブルドライブ向け
　最初に使うときのパスワード入力で、自動ロック解除にすればそれ以降の手間は特になし。(ユーザごと）


## 暗号化手順（OSがインストールされたドライブを暗号化する場合のみ）

1. グループポリシーでBitlocker後の追加認証を有効にする。（この設定で暗号化解除のパスワード入力をさせる）
![bitlocker-gpedit.png](https://qiita-image-store.s3.amazonaws.com/0/242511/be9e655f-7660-ac7d-b80f-a7aa28fd1f1b.png)

グルプポリシーを反映しましょう。

```
gpupdate /force
```

1. コントロールパネル->BitLockerドライブ暗号化
![ctrl-bitlocker1.png](https://qiita-image-store.s3.amazonaws.com/0/242511/d30181e0-87b4-d895-ac5c-ddad73648a07.png)

## デスクトップのディスク構成
数は刺さっているけどあまり使っていない。。
![diskmg.png](https://qiita-image-store.s3.amazonaws.com/0/242511/e7760d57-413f-9801-4a04-d56b11985b51.png)
SVGアイコンの色をCSSで変更する

先日、同じ形のアイコンを色違いで複数のページに挿入するというタスクがあり、

①色が違うだけのアイコンをpngなどで１つ１つ画像を書き出す
②しかも、それぞれスマートフォンサイト用に＠2xサイズまで作成する

ということが非常に不毛に思えたので、
何とか使いまわし出来ないかと考え、この方法にたどり着きました。

##ゴール
同じ形のアイコンを色違いで表示させる

###ゴールイメージ（デモ画面）
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="yamaki0405" data-slug-hash="BMmXOO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="BMmXOO">
  <span>See the Pen <a href="https://codepen.io/yamaki0405/pen/BMmXOO/">
  BMmXOO</a> by yamaki (<a href="https://codepen.io/yamaki0405">@yamaki0405</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##手順
1.SVGを作成する
2.作成したSVGをHTML内にインラインで指定する
3.CSSで色を指定する

##1.SVGを作成する
作成したアイコンをIllustlatorやPhotoshop（CC以降）で書き出します。
>作成するのが手間という方は、フリーで配布されているSVGもたくさんあるので、そちらを使ってみるのも良いかと思います。
>
>
>・[icooon-mono（無料アイコンサイト）](http://icooon-mono.com/)


##2.作成したSVGをHTML内にインラインで指定する
```html:demo.html
<div class="icon1">
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
  <title>icon</title>
  <g class="path01">
    <path d="M29.996 4c0.001 0.001 0.003 0.002 0.004 0.004v23.993c-0.001 0.001-0.002 0.003-0.004 0.004h-27.993c-0.001-0.001-0.003-0.002-0.004-0.004v-23.993c0.001-0.001 0.002-0.003 0.004-0.004h27.993zM30 2h-28c-1.1 0-2 0.9-2 2v24c0 1.1 0.9 2 2 2h28c1.1 0 2-0.9 2-2v-24c0-1.1-0.9-2-2-2v0z"></path>
  </g>
  <g class="path02">
    <path d="M26 9c0 1.657-1.343 3-3 3s-3-1.343-3-3 1.343-3 3-3 3 1.343 3 3z"></path>
  </g>
  <g class="path03">
    <path d="M28 26h-24v-4l7-12 8 10h2l7-6z"></path>
  </g>
  </svg>
</div>
```


##3.CSSで色を指定する
```css:demo.css
.icon1 {
  fill: #42AFE3;
}
```

SVGの塗りは、`枠線を塗るstroke`と`内部を塗るfill`に分かれるのが特徴です。
色を変えたい箇所に応じて使い分けてください。
<br>


以上です。
最後までお読みいただき、ありがとうございました。



##今回、作業するにあたってお世話になったサイト
・[SVG画像をCSSで色指定してcolorが効かないときの対処法](http://www.02320.net/how-to-fill-svg-by-css/)
・[[CSS]SVGアイコンの色を変更する方法](https://code-schools.com/svg-color-edit/)
JSONSerializationでデシリアイズしたオブジェクトを編集


{
  "id" : 100,
  "type" : "view",
  "x" : 0,
  "y" : 0,
  "width" : 320,
  "height: : 480,
  "sub" : [ {
    "id" : 101,
    "type" : "view",
    "x" : 50,
    "y" : 50,
    "width" : 100,
    "height: : 100,
    "sub" : [ {
      "id" : 102,
      "type" : "label",
      "x" : 10,
      "y" : 10,
      "width" : 30,
      "height: : 20,
      "sub" : []  
  } ]
}

このJSONをセットしたDataオブジェクトをJSONSerializationを使ってデシリアイズする

var jsonObj = (try? JSONSerialization.jsonObject(with: data)) as? [String:Any]

jsonObjはvarで宣言しているのでキーを追加したり削除したりする事はできるが格納されているコレクション自体はimmutableなので編集できない。上の例ではsubの配列

if var sub = jsonObj?["sub"] as? [Any] {
   sub.remove(at: 0)
}

上の例ではコピー配列がセットされたsubから要素を削除したが、元の配列は変わらない。
print(sub.count) ---> 0
print((jsonObj["sub"] as? [Any])?count) ---> 1

オリジナルの配列を編集するためには

var sub = jsonObj?["sub"] as? NSMutableArray

のようにNSMutableArrayとしてとりださなければならない。
しかしこのキャストはこのままではnilになる。
nilをさけるためにはJSONSerialization.ReadingOptions.mutableContainersを指定してデシリアリズしなければならない。

var jsonObj = (try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)) as? [String:Any]

if var sub = jsonObj?["sub"] as? NSMutableArray {
    sub.removeObject(at: 0)
}
Dockerを半年使って感じたメリット6つ+α

# 想定読者
* 「Dockerって流行ってるらしいけどどこが良いの？」な方
* 「いろいろ機能があるのはわかったけど、結局何がうれしいの？」な方

# まえがき
Dockerの本番環境導入を検討するにあたり、Dockerのメリットを開発のステークホルダーに説明する必要がありました。
当方は開発者としてDockerを半年程度利用していましたが、 うちの会社ではでは開発と運用が別部署ということもありDocker導入によるメリットを開発者目線と運用者目線の双方の観点で整理する必要がありました。

そこで本記事では、当方が開発現場においてDockerを半年利用して感じたメリットを簡単に整理するとともに、運用者の観点でのDockerのメリットについても自分で調べた範囲で簡単に書いてみようと思います。

※認識誤り等ありましたらご指摘いただけると幸いです。

# 開発者観点
## 1. 動作が軽量
開発端末上でVM起動してごにょごにょするよりも軽くさくっと動かせる

→単純に開発スピードが向上する
## 2. 環境が独立している
開発端末を汚さずに開発が可能。また、コンテナ間の依存性が低い(ミドルウェア等が干渉しない)ため、環境構築時にトラブルが起きにくい

→本来集中すべきアプリケーションの開発により専念できる
## 3. ライフサイクルが短い
何かおかしくなった時は、コンテナを破棄して新しく作り直せばOK(そうなるようなimageを作るという大前提があるが..)

→環境の再構築や、あれこれ原因究明をする時間・コストを削減できる
## 4. 便利ツール、システムの構築が簡単
dockerhubに繋げば大体ある(Jenkins, GItLab, nginx, apache, 等々)。また、これらのイメージに便利機能を追加してくれている人がいる
(GitLabで言えばsameersbn/gitlabとか。自動バックアップ機能などが利用できる)

→短時間で開発効率向上の仕組みを導入できる
## 5. 複数コンテナの扱いが容易
Docker Compose等を使うことで複数システムの連携を1セットで管理でき、操作がシンプル。また、名前解決を活用することで、環境に応じてホスト名を指定せずに済む。

→環境構築・設定にかかる時間・ミスを削減でき、本来集中すべきアプリケーションの開発により専念できる(2回目)
## 6. 自分でイメージを作成でき、簡単に共有可能
Dockerfileを書けば簡単にプロビジョニングが可能。またイメージは比較的軽量(数十MB〜数百MB程度)なので、複数人開発においては誰か一人が開発環境用イメージを作成してコンテナレジストリにpushし、他の人はそれをpullして利用すればOK。

→本来集中すべきアプリケーションの開発により専念できる(3回目)
# 運用者観点
## 1. 環境差分が出にくい
デプロイの際は基本的にイメージをpullするだけなので、従来の手作業による環境構築の手順差異だったり、ミドルウェアのバージョン差などが発生することがなく、開発環境では動いたが本番では動かないということが起こりにくい。

→環境構築・検証にかかる時間・コストを削減

## 2. アップデートが楽
アプリケーションをアップデートする際、イメージのタグを書き換えるだけで実現が可能。

→環境構築・検証にかかる時間・コストを削減(2回目)
## 3. 死活監視しやすい
Kubernetes等のコンテナオーケストレーションサービス[^1]を利用することで[^2]、コンテナの死活監視や自動復旧が可能。

→運用時のトラブル対応コスト減、システムの安定稼働率向上
## 4. スケーラブル
こちらもKubernetes等を利用することで[^2]、コンテナのスケールが可能。アクセス増などによるCPU使用率等に応じたコンテナ数の増減ができる。

→運用時のトラブル対応コスト減、システムの安定稼働率向上(2回目)

# まとめ
開発者、運用者のそれぞれの観点で考えてみましたが、

1. 開発のスピード・効率の向上
2. システム運用コスト減・安定稼働率増

にまとめられるのかなあという感じです。ざっくりですみません。。

[^1]: GKE等のマネージドサービスを利用する前提です。オンプレ環境だとそっちの管理コストがかかってしまう懸念があるので
[^2]: コンテナのメリットというかKubernetesのメリットかもしれません
rubyをrbenvを使用してmacにインストールする

今回はmacにrubyをインストールしていきたいと思います。macに開発者ツールをいろいろダウンロードするのによく使うツールがHomebrewです。Homebrewはgithubなどと連携して、開発者ツールをダウンロード、管理してくれるツールになります。Homebrewの公式ホームページはこちら

Homebrewのページにいきbrewコマンドを使えるようにするためにはrubyが必要です。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
つまりHomebrewでrubyをダウンロードしたいのにrubyを先にダウンロードしないとHomebrewをmacにインストールできないという、初心者には「ちょっと待って？」と言いたくなるような状態です。

#Homebrewをインストール
Homebrewをダウンロードするためにmacが標準で用意してる開発者ツール全般をダウンロードして、rubyを入れていきましょう。

```
xcode-select --install
```

続いてこちらのコマンドhomebrewをダウンロードしてましょう

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
homebrewがインストールできて、brewコマンドが使用可能になったのでmacが用意していない必要なパッケージをインストールしていきます。

```
brew install wget
```

インストールが完了したら、rubyのダウンロードにうつりましょう。

homebrewでrbenvをインストール
brewで直接rubyをダウンロードすることも可能ですが、rubyはバージョンのアップデートが頻繁だったり、プロジェクトごとにrubyのバージョンが違ったりするので、バージョン管理ツールのrbenvを使用しましょう。ちなみにpythonのバージョン管理ツールはpyenvと言います。envがつくをバージョン管理ツールなんだと覚えておけばいいですね。

```
brew install rbenv
brew install ruby-build
```

rbenvがインストールできたら、パスを通します。パス通すとはコマンドでアプリをインストールできるようにするための設定のことです。

```
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile
```

rbenvがインストールできたら、いよいよrubyのバージョンをインストールしていきます。

```
rbenv install --list 　　 # => インストール可能なバージョン一覧の表示
rbenv install 2.6.1 # => rubyのインストール
rbenv rehash             # => rbenv の再読み込み
rbenv global 2.6.1  # => defaultで使うrubyのバージョン
```

これでrubyの2.6.1のバージョンがダウンロードできたのか確認してみます。

```
ruby -v
```
rubyのバージョンが2.6.1ではなかったら、pashが通っていない可能性があるのでbash_profileを確認してみてください。次にrubyのwebフレームワークであるrailsとgemを管理するためのツールであるbundlerをダウンロードしていきましょう。

```
gem install bundler
gem install rails
```

これでrailsが使用可能になったのでrailsでアプリの作成が可能になりました。rails newでアプリの開発を始めていきましょう。

```
rails new my_app
cd my_app
rails s
```

rails sはrailsでサーバー起動するためのコマンドになります。デフォルトではポート番号が3000に設定されているのでlocalhost:3000にsafariかgoogle chomeでアクセスしましょう。
![FireShot Capture 38 - Ruby on Rails - http___localhost_3000_.png](https://qiita-image-store.s3.amazonaws.com/0/264684/8866ae57-3465-18b6-40fa-92ef338040d1.png)
複数の GeoJSON ファイルをマージ

こんにちは。
複数の GeoJSON ファイルのデータをマージ（合体、連結）させて一つのファイルを作りました（```jq``` コマンドを利用、対象ファイル例は ```*geo.json```）。

```console
$ jq '.features[]' *geo.json | jq -s '{"type":"FeatureCollection", "features":.}' > merged_geo.json
```

* また条件抽出も加えてみました（この例は ```properties.name != ""``` ）。

```
$ jq '.features[]' *geo.json | jq -s -c 'map(select(.properties.name != ""))[] ' | jq -s '{"type":"FeatureCollection", "features":.}' > merged_geo.json 
```

### GeoJSONL（cat コマンド利用）
なお [Newline-delimited GeoJSON](https://stevage.github.io/ndgeojson/) ([GeoJSONL](https://www.interline.io/blog/geojsonl-extracts/)) ファイル[^1]ならば```cat```コマンドを用いてマージできます（対象ファイル例は ```*geo.jsonl```）。

```console
$ cat *geo.jsonl > merged_geo.jsonl
```

* 上記と同様に条件抽出も加えてみました（この例は ```properties.name != ""``` ）。

```
$ cat *geo.jsonl | jq -s -c 'map(select(.properties.name != ""))[] ' > merged_geo.jsonl
```

#### GeoJSONL + gzip 圧縮
gzip 圧縮された GeoJSONL ファイルも、cat コマンドでマージできます。

```console
$ cat *geo.jsonl.gz > merged_geo.jsonl.gz
```

[^1]: 参考：「[GIS データ（ストリーム対応型）をLeaflet地図上に表示](https://qiita.com/kkdd/items/13168810f10643164564)」


#### 他のフォーマットデータ

[ogrmerge.py](https://gdal.org/programs/ogrmerge.html) がマージに使えます。


```console
$ ogrmerge.py -f FlatGeobuf -o merged.fgb *.fgb
```
【Ruby理解力促進①】JavaからRubyへの乗り換えにおいて、まずその違いを把握。

- 「最初にJavaやっておくと良いよ。」「入社してからの最初に学んでもらう研修はJavaです。」との言葉通りに、ただ平坦にその線路を進んできた。
- 経験豊富気取りなJava若輩記述者である私は、とうとう「簡単かつ人気」というRubyに泣きつくことにする、何とも甘え技術者の鏡。
- しかし「簡単かつ人気」とはいえ、「何かとんでもない裏仕掛けがあるのかもしれない。」という、怠慢に満ちた心配性。
- ということで、主目的の「不安解消」と、格好をつけるための「効率的な学習」という、二大目的をかかげて、取り組む。

## 共通点
### ＜共通点＞
- オブジェクト指向

- プラットフォーム非依存

- アクセス指定
→public,protected,privateが使用可能。
※細かな仕様や権限等は、多少違う。

- 単一継承
→１つのクラスは、直接の親クラスを１つしか持てない。
※Mix-inという仕組みで、実装のみクラスの複数継承可能
※属性継承は、不可能。

- すべてのクラスの親クラスがObjectクラス

### ＜相違点＞
- 型付け。  
→Javaでは変数やメソッドの型宣言が必要であることに対し、Rubyでは不要  
→Javaは静的型付け言語であることに対して、Rubyは動的型付け言語である。  
※静的型付けは「実行前の整合性確認」、動的型付けは「実行後の整合性確認」  
※すべてオブジェクトとして扱われるため、Rubyに型は存在する。  

→Javaの場合

```java
String name = "nanashi";
int number = 50;
```
→Rubyの場合

```ruby
name = "nanashi"
number = 50
```

- メソッド呼び出しの括弧は、省略可能。

```java
String message = "hello";
System.out.println(message.length());
```
→Rubyの場合

```ruby
message = "hello"
puts message.length
```

- 定数の変更
→Javaでは定数の変更が不可能に対し、Rubyでは変更可能
※変更可能であるが、変更時の警告は出る。

→Javaの場合

```java
static final String MESSAGE = "Hello";
static final String MESSAGE = "Hello World"; //エラー。変更されない。
```
→Rubyの場合

```ruby
MESSAGE = "Hello"
MESSAGE = "Hello World" # 警告のみ
```

- 基本データ型がない。  
→すべてがオブジェクトとしての表現のため、普通の数値へのメソッド実行可能。

→Javaの場合

```java
String number = new String(100);
```
→Rubyの場合

```ruby
number = 100.to_s
```

- 最低限のクラス定義の有無。  
→Rubyでは、クラス無しでも実行できる。

→Javaの場合

```java
public class Test {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
```
→Rubyの場合

```ruby
puts "Hello World"
```

- メソッド名に記号が使用可能  
→!や?が使える。  
※真偽チェックメソッドの命名は、「?」をつけることが慣習化。  

→Javaの場合

```java
public class Main {
    public static void main(String[] args) throws Exception {
        // エラーになる。
        sayHello!();
    }
    public static void sayHello!(){
        System.out.println("Hello");
    }
}
```
→Rubyの場合

```ruby
class UserNumberCheck
    def userNumber?
         true
     end
end

number = UserNumberCheck.new
if number.userNumber?
    puts "正しいです。"
end
```

- ライブラリの豊富さと開発速度  
→gemという便利なライブラリが豊富  
→バージョン更新の流れが早い。



## まとめ
- 今回は、JavaとRubyの違いということで、今までお世話になったJavaをだしに使って、Rubyの「簡単さ・書きやすさ」を自分に染み込ませるという、信頼関係軽視行動。
- 「ただ、これはRubyではできないのか」という、未練たらたらぶりな「不人気の典型行動」をしている私は、今後すべての言語から距離を置かれるだろう。
- そのような実現確実未来に、希望の光を見出し、朗らかな暮らしをする私は、今日も簡単学習作業にいそしむ。

## 参考
- http://www.atmarkit.co.jp/ait/articles/0803/25/news152.html  
→主にこちらを参考にしました。大変お世話になりました。
- https://tsuchikazu.net/java_ruby_differenc/  
→こちらの記事も非常に参考にしました。大変お世話になりました。
- http://a-auto50.blogspot.com/2015/07/javaruby.html  
→こちらの記事も非常に参考にしました。大変お世話になりました。
easymockを入れようとしたら、Pre-built binaries not found for sqlite3@3.1.10 and node@10.7.0

自分のメモ用。
easymockを入れようとしたら、Pre-built binaries not found for sqlite3@3.1.10 and node@10.7.0というエラーが出てくる。
nodeのバージョンを変更したら直った。npmは入っている前提。

`git clone git://github.com/creationix/nvm.git ~/.nvm`
`source ~/.nvm/nvm.sh`
`nvm install 7.10.1 #7.10.1だと動いた`
`npm install -g easymock`
野良ビルドした Emacs で tccd が暴走するのを防ぐ（Mojave）

# はじめに

Mojave で野良ビルドした Emacs から外部プロセスを呼ぶと `tccd` が暴走してプチフリすることがあります．`M-! open .` や `browse-url` を経由するウェブサイトの訪問などで，数秒固まることがあります．

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Mojave + Emacs(NS) + &quot;open .&quot; が遅いは私だけなのかなー．キャプチャは2回 &quot;open .&quot; を発行していて，前者は iTerms2 から起動した場合．後者は，<a href="https://t.co/Ci5sUvb0RC">https://t.co/Ci5sUvb0RC</a> を直接起動した場合．後者は，Finder 表示に数秒かかる．tccd関連． <a href="https://t.co/EJaGuiZbqV">pic.twitter.com/EJaGuiZbqV</a></p>&mdash; Takaaki Ishikawa (@takaxp) <a href="https://twitter.com/takaxp/status/1055632753121624065?ref_src=twsrc%5Etfw">2018年10月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 対処

野良ビルドした `Emacs.app` を `codesign` で署名すればOKです．

## Keychain Access.app で自己証明を作る

Keychain Access.app を起動して，証明書を作ります．

![Screen Shot 2019-02-07 at 22.37.53.png](https://qiita-image-store.s3.amazonaws.com/0/12232/dbf79d03-956c-b80e-05c1-0135475e1ec8.png)

名前は何でも良いと思いますが，今回は `myApp` にします．

![Screen Shot 2019-02-07 at 22.38.59.png](https://qiita-image-store.s3.amazonaws.com/0/12232/3bd001f0-1e4c-4398-c213-d05ba8ed5f1e.png)

使用した名前は後で使います．

## Emacs.app を署名する

野良ビルドした `Emacs.app` を `/Applications` 以下に移動し，ターミナルで `cd /Applications` します．

自己証明書を使って，`Emacs.app` を署名します．

```sh
codesign --force --deep --sign "myApp" Emacs.app
```

パスワードを入力してしばらく待ちます．

![Screen Shot 2019-02-07 at 22.42.29.png](https://qiita-image-store.s3.amazonaws.com/0/12232/896e271f-f33a-5480-b720-be5082e40d6f.png)

署名が完了したら，確認します．

```sh
codesign -vd Emacs.app
```

何か応答があればOKです（適当...

以上です．これで`Emacs.app`を起動して，`M-! open .` などをしてもプチフリしなくなります．実際のところ致命的だったのは，Org Mode の外部リンクを開く時で，ものすごいストレスでした．このプチフリを解決できてとても幸せです．

# おわりに

とてもニッチな問題ですが，`tccd` の暴走による Emacs のプチフリを`codesign` で解決する方法を紹介しました．

# おまけ

今回の対処方法にたどり着くまで，`browse-url` は，applescript を経由することで回避していました．念のため記録しておきます．

```emacs-lisp
(when (and (boundp 'ns-version-string)
           (< 1600 (string-to-number
                    (let ((str ns-version-string))
                      (string-match "^appkit-\\([0-9\.]+\\) .+$" str)
                      (match-string 1 str)))))
  (defun ad:browse-url (url &rest _args)
    (do-applescript
     (concat "tell application \"Chrome\" to open location \"" url "\"")))
  (advice-add 'browse-url :override #'ad:browse-url))
```

# References

- https://eclecticlight.co/2018/09/06/working-with-mojaves-privacy-protection/
- https://eclecticlight.co/2018/10/03/launching-apps-in-mojave-how-it-has-changed/
- https://github.com/carlashley/tccprofile
- https://github.com/Homebrew/homebrew-cask/issues/22388
- https://discourse.brew.sh/t/code-signing-installed-executables/2131
- https://qiita.com/zeriyoshi/items/78b4c7227217e2eac536
[memo] Ubuntu18.04でRabbitMQを動かしPHPを使ってハロワしてみた

# [memo] Ubuntu18.04でRabbitMQを動かしPHPを使ってハロワしてみた

RabbitMQ + PHPの[公式チュートリアル](http://www.rabbitmq.com/tutorials/tutorial-one-php.html)  
PHPを使ったプロジェクトでRabbitMQを使ってみようと思ったので、とりあえずハローワールドやってみたメモ。

## ubuntu 18.04に必要なものをインストール

    # apt install rabbitmq-server php php-cli php-bcmath php-mbstring
    # curl -sS https://getcomposer.org/installer | php
    # mv composer.phar /usr/local/bin/composer

## プロジェクトにphp-amqplibをインストール
今回は、プロジェクトディレクトリをrabbitmq_learnとして、その中にcomposer.jsonを作成しphp-ampqlibをインストールする。

    # mkdir rabbitmq_learn
    # cd rabbitmq_learn
    cat < EOT > composer.json
    {
        "require": {
            "php-amqplib/php-amqplib": ">=2.6.1"
        }
    }
    EOT
    # composer install



## PHPからメッセージを送ってみる
### 送信

```php:send.php
<?php
// file: send.php
require_once __DIR__'/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use phpAmqpLib\Message\AMQPMessage;

// コネクションの確立
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// helloという名前のqueueを宣言
$channel->queue_declare('hello', false, false, false, false);

// メッセージを作成
$msg = new AMQPMessage('Hello World!');

// helloというqueueに作成したメッセージを送信
$channel->basic_publish($msg, '', 'hello');

echo "[x] Sent 'Hello World!'\n";

// コネクションを閉じる
$channel->close();
$connection->close();
```

### 受信
```php:recv.php
<?php
// file: recv.php
require_once __DIR__'/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('hello', false, false, false, false);

echo "[*] Waiting for messages. To exit press CTRL+C\n";

// メッセージを受信したときに実行するコールバック関数
$callback = function($msg){
    echo '[x] Received ', $msg->body, "\n";
};

$channel->basic_consume('hello', '', false, true, false, false, $callback);

// メッセージを受信するとコールバック関数が呼ばれる
while(count($channel->callbacks)){
    $channel->wait();
}
```

### 実行と確認
rabbitmqctlというコマンドでRabbitMQサーバの管理を行える。

    # rabbitmqctl list_queues
    Listing queues
まだqueueが作られていないことが分かる。
作成したファイルを実行するとqueueが作成される。

    # php recv.php
    [*] Waiting for messages. To exit press CTRL+C
    # rabbitmqctl list_queues
    Listing queues
    hello   0

別のターミナルからsend.phpを実行する。

    # php send.php
    [x] Sent 'Hello World!'

すると、recv.phpでメッセージを受信できる。

    [x] Received Hello World!
Android DataBindingとPicasso

# はじめに
DataBindingを利用しているAndroidアプリで、
PicassoやGlideでImageViewに画像を表示させる機会に出会いませんか？
今回はBindingAdapterを用いてPicassoで画像をロードする方法を紹介します。

- Kotlin 1.3.20
- Picasso 2.71828

# XMLのサンプル
こちらのImageViewにPicassoで画像をロードし表示させます。

```xml:item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="viewModel"
            type="hoge.SelectCompanyItemViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/companyImageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:imageUrl="@{viewModel.imageUrl}" />

    </LinearLayout>

</layout>
```

# Custom Bindingのサンプル
[公式のドキュメント](https://developer.android.com/topic/libraries/data-binding/binding-adapters#custom-logic)で紹介されているようにBindingAdapterを用いてメソッドを定義することにより、
XMLで定義した`app:imageUrl`を紐づけることができます。
今回はKotlinっぽくImageViewに拡張関数でloadImage()を作成しました。

```kotlin:Util.kt
import android.databinding.BindingAdapter
import android.widget.ImageView
import com.squareup.picasso.Picasso

object Util {
    @JvmStatic
    @BindingAdapter("imageUrl")
    fun ImageView.loadImage(url: String?) {
        Picasso.get().load(url).into(this)
    }
}
```

注意点が3つあります。これを守らないとおこられます。
1. `@JvmStatic`を記載すること
2. objectでclassをつくること
3. `@BindingAdapter(app:imageUrl)` ではなく`@BindingAdapter(imageUrl)`
【Blender】重なった箇所を削除する（ブーリアン）

【Blender】重なった箇所を削除する（ブーリアン）
耳と顔をくっつけて、重なった、耳の箇所を削除する。
![s_001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/af8e96ab-4db7-be06-392f-1388fc065d2c.png)

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

続きは、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/02/07/221522)
</br>
</br>
</br>
ユーザーの定期購読情報をGoogle Play Developer APIで取得するためのデータメモ

##〇概要
Android定期購読の情報をGoogle Play Developer APIで取得するためのデータがどこに記載されているのか忘れやすいのでメモ。
OAuthやGoogle Play Developer APIの初期設定方法ではないので、ご了承ください。

##〇流れ
OAuthにてアクセストークン取得
https://developers.google.com/android-publisher/authorization
↓
Google Play Developer APIのPurchases.productsのgetにて定期購読情報取得
https://developers.google.com/android-publisher/api-ref/purchases/subscriptions

##〇アクセストークン取得に必要なデータ
・クライアントID(client_id)
（例）72347・・・apps.googleusercontent.com
Google APIs[https://code.google.com/apis/console]
のプロジェクト選択→左上のナビゲーションメニューから「APIとサービス」を選択→「認証情報」→「OAuth 2.0 クライアント ID」に記載

・クライアントシークレット(client_secret)
（例）gNFim・・・73hJK
「OAuth 2.0 クライアント ID」の名前をクリック→「クライアント シークレット」に記載

・リダイレクトURI(ridirect_uri)
（例）http://xxx.co.jp/oauth2callback
「OAuth 2.0 クライアント ID」の名前をクリック→「承認済みのリダイレクト URI」に記載

・リフレッシュトークン(refresh_token)
（例）1/nAEL-vLKKEWE・・・7yE
クライアントIDとリダイレクトURLでAPIを叩いて取得（一度取得したら使いまわし）
~~curl -F "scope=https://www.googleapis.com/auth/androidpublisher" -F "response_type=code" -F "access_type=offline" -F "redirect_uri=..." -F "client_id=..." "https://accounts.google.com/o/oauth2/auth"~~
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=...&client_id=...
Googleにログインして、付属するパラメータからリダイレクトIDを取得

・アクセストークン
（例）ya15.FekwlCKD・・・8EK
クライアントIDとクライアントシークレットとリフレッシュトークンを利用してAPIを叩いて取得
curl -F "client_id=..." -F "client_secret=..." -F "grant_type=refresh_token" -F "refresh_token=..." "https://accounts.google.com/o/oauth2/token"
（注）1時間で無効になるので注意

##〇Purchases.productsのgetにて定期購読情報取得
・packageName
・subscriptionId(productId)
・token(purchaseToken)
に関してはレシートのJSON情報から抜き出す。

curl "https://www.googleapis.com/androidpublisher/v3/applications/__packageName__/purchases/subscriptions/__subscriptionId__/tokens/__token__?access_token=..."

##〇取得データ
{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean,
  "priceCurrencyCode": string,
  "priceAmountMicros": long,
  "countryCode": string,
  "developerPayload": string,
  "paymentState": integer,
  "cancelReason": integer,
  "userCancellationTimeMillis": long,
  "cancelSurveyResult": {
    "cancelSurveyReason": integer,
    "userInputCancelReason": string
  },
  "orderId": string,
  "linkedPurchaseToken": string,
  "purchaseType": integer,
  "profileName": string,
  "emailAddress": string,
  "givenName": string,
  "familyName": string,
  "profileId": string
}
プログラミングはじめました。

まいにち好きなものを作って暮らしたい！
プログラミングは好きなんだけど、会社勤めは超苦手。
SESで働くのはなるべく避けたい。

そんなわけで、プログラミングを始めようと思いました。
まず、何を目指すか。

これなんか素敵じゃないですか？

私がどのようにして180日で180個のウェブサイトを作り、YC フェローシップ・ファウンダーになったか
https://postd.cc/how-i-built-180-websites-in-180-days-and-became-a-yc-fellowship-founder/

とあるアーティストがプログラマーになる話です。１８０日間毎日アプリをリリースしたそうです。すごい！！！
１日目のぶっとんだセンス。いいわー。
半分くらい真似できたらいいなー。

そんな１日目はこちら。
https://glacial-fortress-78048.herokuapp.com/

しょぼーい！
けど私にとっては偉大な一歩ですよっ！


1.まず、Webサーバーを決めます。
「初心者 無料　簡単」 でググって、Herokuというサーバーがよさそうだと思いました。なんとなく。

２.Herokuの始め方を探します。
「Heroku 初心者　始め方」 でググりました。

これが一番簡単そうと思いました。

HerokuでPHPアプリを作成するまでの手順まとめ
https://qiita.com/n_s_y_m/items/2f60370e7ee407d6a3fb

（追記）
何をやっているか意味不明なのですが、とにかく「動かす」ところまで、最短距離でいける手順だとおもいます。
**Herkuの登録から公開まであーだこーだ悩みながら、３０分でできました。**

3.Herokuに登録する
ここからサインアップ。
https://signup.heroku.com/

4.ダウンロードして、インストールして、ダウンロードして、インストール
サインアップすると、ガイドがはじまるのでその通りに。
Herokuとgitをインストールしました。

5.タップしてインストール
エラーになったので調べたら、タップしてくれいとの事。
`brew tap heroku/brew`
`brew install heroku`
インストールできました！

6.index.htmlをおく

```
touch composer.json
touch index.html
( index.htmlを編集 )
git init
git add .
git commit -m "Add Heroku SampleApp"
heroku create
git push heroku master
heroku open
heroku apps:rename sampleapp-001
```

ふうふう。
今日はここまでかな！

面白サイトを作れるようになりたいです！

###追記
ローカルで作ったアプリをアップしました！
http://appdays.herokuapp.com/Day1/
Windows ネットワークドライブ上のフルパスを取得したい


# 背景

* Windowsでネットワークドライブの割り当てを行います
* ネットワークドライブ上のフォルダやファイルのパスを共有したい場合、エクスプローラのアドレスバーをコピーしても`V:\document`となってしまいます:sob:

# 解決方法

* コマンドプロンプトを開き`net use`でネットワークドライブの一覧を確認します

```
C:\Users\hoge>net use
新しい接続は記憶されます。


ステータス  ローカル名 リモート名                ネットワーク名

-------------------------------------------------------------------------------
OK           V:        \\piyo\puyo           Microsoft Windows Network
コマンドは正常に終了しました。
```

* パスを結合します
  * `\\piyo\puyo\document`

# 後記（別解）

* [ネットワークドライブに割り当てたフルパスを取得する方法](https://qiita.com/yoshida261/items/839ba9b935fb68ef0bfe) にもありました
  * コメント欄 参照
はじめてプログラミングを覚える時のように python を触る。エンジニアのビギナーズマインドに、再会するには別言語。 #ポエム

はじめてプログラミングを覚える時のように python を触る。エンジニアのビギナーズマインドに、再会するには別言語。 #ポエム

# 変数の中に文字列を埋め込むのは、どうやるの？

[Python3 文字列中に変数展開したい - かもメモ](https://chaika.hatenablog.com/entry/2018/08/16/090000)

# そういう初歩的なことの全てが、面白い。新鮮な感動がある。

- 他言語を習得した人にとっては、難易度が低い。
- とりたてて、大きな目的がないのが、むしろ良い。
- とるにたらない、小さな違いに、喜べることが良い。

# ところで、一年に新しい言語を、一種類覚えなさいという教えがある。

達人プログラマという本に書かれていたような。別の本だったような。

新しい言語を覚えるのは、大変なことだと思っていた。だけど、むしろ癒やしになるかもしれない。

ひとつの言語ばかり触っていると、初歩的な文法は全て覚えてしまって、出来ゲーになってしまう。
知らない分野は相変わらず広大だけれど、だいだい、調べればなんでもできるだろうという感覚になってしまう。
ようするに飽きて退屈になってきてしまう。

# 飽きてきたら別言語

でも良いかもしれないな。プログラミングって要するに、暇つぶしだと思うし。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
pandastableでハマったこと

# 環境
OS: Windows7
Python3.6.1
pandas 0.24.1
pandastable 0.11.0

# pandastableとは
Tkinterに表を提供するモジュール。
下記がイメージ
列のラベルクリックでソートしたり、右っかわのボタンポチポチでcsvインポートも出来るみたい。便利そう。


![スクリーンショット 2019-02-07 20.57.50.png](https://qiita-image-store.s3.amazonaws.com/0/92606/4c204bfd-353d-8b13-e9a8-608b90931b92.png)


# importでハマった
次のようにTableというpandastableのコア機能をインポートしようとするとエラーが返される。

```python
from pandastable import Table
In [1]: import pandastable
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-cb580b341da5> in <module>()
----> 1 import pandastable

C:\Python36\site-packages\pandastable\__init__.py
dule>()
      3     import matplotlib
      4     matplotlib.use('TkAgg')
----> 5 from .core import *
      6 from .data import *
      7 __version__ = '0.11.0'

C:\Python36\site-packages\pandastable\core.py 
i>()
     40 from .data import TableModel
     41 from .headers import ColumnHeader, RowHeader, IndexHeader
---> 42 from .plotting import MPLBaseOptions, PlotViewer
     43 from .prefs import Preferences
     44 from .dialogs import ImportDialog

C:\Python36\site-packages\pandastable\plotting.py
dule>()
     31 import numpy as np
     32 import pandas as pd
---> 33 from pandas.tools import plotting
     34 import matplotlib as mpl
     35 #mpl.use("TkAgg")

ModuleNotFoundError: No module named 'pandas.tools'
```

pandas.toolsが無いとのことだけど、私はpandas.toolsを使ったことが無かったのでなんのこっちゃか分からなかったが、pandasの古いバージョンのモジュールのようだ。


# 解決策

pandastableのplotting.pyを直接いじくって下記のようにする

```python
from __future__ import absolute_import, division, print_function
try:
    from tkinter import *
    from tkinter.ttk import *
except:
    from Tkinter import *
    from ttk import *
import types, time
import numpy as np
import pandas as pd
#from pandas.tools import plotting  ← コメントアウトする
from pandas import plotting       # ← 新たに加える
import matplotlib as mpl
```

めでたし
python入門(1)~出力の基本~

#プログラムの作成
##プログラム
プログラム(program)は、目的を達成するために行う処理を事前に書いたものです(pro-:先に/前に/予め、gram:文)事前に書いたプログラムを実行することで目的を達成します。
##式と文
値を作り出す処理を「式」といい、条件分岐(if)や繰り返し処理(for/while)や変数代入などの実行制御処理を「文」といいます。C言語やJava言語では文末に「`;`」を書きますが、Pythonでは文末に「`;`」を書きません。1行内に複数の文を「`;`」で区切って並べて書くこともできますが、並べて書けない文もあります。
##値（データ、オブジェクト）
###数値
123や3.14などの整数データや浮動小数点データを扱うことができます。また、1.23j のような虚数データを扱うこともできます。
###文字列
「`'`」または「`"`」で囲んだものを文字列データとして扱います．「`'''`」または「`"""`」で囲んだものも文字列データとして扱います。こちらは改行を含めて複数行に渡った文字列を書くことができます。
##値の表示/出力
値を表示/出力するにはprint関数を使います.print関数の引数（括弧内）に表示する値を書きます。print関数では、最後に改行が出力されます。最後の改行を出力しないようにしたり、別の文字に変更することもできます。

```python:helloWorld.py
print('Hello')
print('World!')
```

```text:実行結果
Hello
World!
```
値をカンマで区切って並べると、値の間に半角スペースが入って表示されます。半角スペースを入れないようにしたり、別の区切り文字に変更することもできます。

```python:helloWorld2.py
print('Hello', 'World!')
```

```text:実行結果
Hello World!
```
##変数とコメント
式で作り出した値を再利用するために名前を付けて残しておく（記憶しておく）ことができます。値に名前を付けることを「値を変数に代入する」といい、記憶しておく名前のことを「変数名」といいます。変数名の大文字と小文字は区別されます．また，処理の説明などをコメントとして書き残しておくこともでき、下記のように#を付けてコメントを書きます。行末までがコメントになります。


```python:var.py
a = 5
b = 7
#a = 5; b = 7
print(a, b)
a = b
print(a)
```
```text:実行結果
5 7
7
```
pythonでは使用する変数をあらかじめ宣言しておく必要がなく、必要になった時点で変数に代入することができます。なお、変数に記憶する値の型(数値型や文字列型など)を制限することはできず、違う型の値を変数に再代入することができます。
##文字列とtype()関数
type関数とはカッコ内の型名を調べるために使う関数です．

```python:ty.py
a = 'python'
print(a)
print(type(a))
b = "楽しく'python'を学ぼう!"
print(b)
c = '''Hello
World'''
print(c)
```

```text:実行結果
python
<class 'str'>
楽しく'python'を学ぼう!
Hello
World
```
type()関数とはカッコ内の型名を調べるために使う関数です．また，変数内で「"」を表示する場合は「'」で，「'」を表示する場合は「"」で囲みます．さらに，改行のある文字列を代入する時は「'」または「"」を三つ続けて文字列を囲みます．
##エスケープシーケンス
|エスケープシーケンス|       働き       |
|:---------------:|:---------------:|
|       \n        |改行             |
|       \t        |タブ             |
|       \r        |キャリッジリターン  |
|       \"        |「"」を表示       |
|       \'        |「'」を表示       |
|       \\\        |「\」を表示       |
タブとはカーソルや文字の位置を特定の間隔の桁位置（標準では8文字間隔）に移動するための制御文字です。
また，キャリッジリターンを表示するとカーソルが行頭に移動します。
##文字列の連結
文字列は演算子を使ってつなぐことが出来ます．

```python:str.py
print('Hello' 'World')
print('hello' + 'world')
a = 'Hello!'
b = 'Python'
c = a + b
d = a * 3
print(c)
print(d)
```
```text:実行結果
HelloWorld
helloworld
Hello!Python
Hello!Hello!Hello!
```
文字列の連結には「+」や「*」を利用することができる．しかし，`print(a b)`という書き方はできません．
##文字列内の文字の参照
[]を使うと文字列内の任意の文字を取り出せます．

```python:str2.py
a = 'python'
print(a[1])
print(a[-2])
```
```text:実行結果
y
o
```
インデックス番号は下記のようになります．

|0|1|2|3|4|5|
|:-:|:-:|:-:|:-:|:-:|:-:|
|p|y|t|h|o|n|
|-6|-5|-4|-3|-2|-1|
##str()とint()
str()関数とは数値を強制的に数字に変えるもので，int()関数は逆に数字を強制的に数値に変えるものです．

```python:num.py
a = 2; b = 3; c = '4'; d = '5'
print(a + b)
print(str(a) + str(b))
print(c + d)
print(int(c) + int(d))
```

```text;実行結果
5
23
45
9
```
出力する際の変数の型がint型なら計算され，String型なら数字がそのまま表示されます．
##最後に
自分のペースでpythonを学んでいきましょう．
counter_cacheが便利だと思ったはなし

#はじめに
railsでcounter_cacheというものがあるのを知った。

今まで例えばいいね機能を付ける場合

```
rails g model user name:string 
rails g model star user:references
```

みたいにして

userのstarの数を知りたいときは

```
stars_count = Star.where(user_id: params[:id]).count
```

みたいにしていた

だがcounter_cacheを使うとstarが作成されたときに自動的にuserカラムのstars_countにstarの数を入れてくれる

#使い方

models/user.rbに

```ruby:user.rb
class User < ApplicationRecord
    has_many :stars
end
```

models/star.rbに

```ruby:star.rb
class Star < ApplicationRecord
    belongs_to :user, :counter_cache => true
end
```

とする。

これで終わり。

ちなみにあらかじめuserにstars_countというカラムを作成しておく必要があります。

またstars_countではなくほかのカラム名にしたい場合は

```ruby
:counter_cache => true
```

を

```ruby
counter_cache: :sample_count
```

とすればOK


#試しに使う

```
rails g model user name stars_count:integer
rails g model star 
rails db:migrate
```

```ruby 
rails c
user = User.create(name: "counter")
100.times {user.stars.create}

省略

"2019-02-07 12:03:41.796608"], ["updated_at", "2019-02-07 12:03:41.796608"], ["user_id", 2]]
  User Update All (0.2ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (11.3ms)  commit transaction
   (0.1ms)  begin transaction
  Star Create (1.2ms)  INSERT INTO "stars" ("created_at", "updated_at", "user_id") VALUES (?, ?, ?)  [["created_at", "2019-02-07 12:03:41.812850"], ["updated_at", "2019-02-07 12:03:41.812850"], ["user_id", 2]]
  User Update All (0.1ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (12.1ms)  commit transaction
   (0.1ms)  begin transaction
  Star Create (1.2ms)  INSERT INTO "stars" ("created_at", "updated_at", "user_id") VALUES (?, ?, ?)  [["created_at", "2019-02-07 12:03:41.831223"], ["updated_at", "2019-02-07 12:03:41.831223"], ["user_id", 2]]
  User Update All (0.1ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (11.3ms)  commit transaction
   (0.1ms)  begin transaction
  Star Create (1.2ms)  INSERT INTO "stars" ("created_at", "updated_at", "user_id") VALUES (?, ?, ?)  [["created_at", "2019-02-07 12:03:41.847880"], ["updated_at", "2019-02-07 12:03:41.847880"], ["user_id", 2]]
  User Update All (0.1ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (13.2ms)  commit transaction
=> 100

user.stars_count
=> 100
```


みたいにちゃんとできています:sunny:
正規表現学習のためのegrep

# grepとは
**grep**は，*global regular expression print* の略で，文書ファイル中から正規表現を用いて何らかの文やワードを探すためのコマンドです．これに機能拡張したものが**egrep**です．
本ページは，J.E.F.Friedl著「詳説 正規表現 第2版」オライリージャパン
を参考にしました．

# サンプルファイル

まず，検索対象のファイルを用意します．

``` grep_test.txt
apple
abstract
breath
tooth
index
indoor
construction
convolution
03/12/12
03.12.12
03-12-12
From:aaa
Date:1/1
this is an apple.
color
colour
colouur
```

# 基本的な使い方
`egrep '検索内容' 検索対象` として使います．
また，大文字・小文字を無視する場合は，
`egrep -i '検索内容' 検索対象` 
として，オプションをつけます．

``` shell
$ egrep 'a' grep_test.txt
apple
abstract
breath
From:aaa
Date:1/1
this is an apple.

$ egrep -i 'd' grep_test.txt
index
indoor
Date:1/1
```

# 正規表現の導入
**正規表現(regular expression, regex)**は，**メタ文字**と**リテラル**から成ります．
メタ文字は，チート記号みたいなものです(適当).その使い方を書いていきます．

##文頭や文末・文中の単語に注目する
|メタ文字 |用途 |例|意味|
|---     |---  |---  |---  |
|^|文頭が一致するかどうか|^in|inではじまる文|       
|$|文末が一致するかどうか|th$|thでおわる文|
|\<|単語の語頭|\<i|iではじまる語がある文|
|\>|単語の語末|is\>|isでおわる語がある文|

``` shell
$ egrep '^in' grep_test.txt
index
indoor

$ egrep 'th$' grep_test.txt
breath
tooth

$ egrep '\<i' grep_test.txt
index
indoor
this is an apple.

$ egrep 'is\>' grep_test.txt
this is an apple.
```       

##連続した文字
|メタ文字 |用途 |例|
|---     |---  |---  |
|?|メタ文字の前のリテラルが0個または1個|colou?r|       
|*|メタ文字の前のリテラルが0個以上|colou*r|
|+|メタ文字の前のリテラルが1個以上|colou+r|
|{min,max}|メタ文字の前のリテラルの数制限|colou{1,2}r|


``` shell
$ egrep 'colou?r' grep_test.txt
color
colour

$ egrep 'colou*r' grep_test.txt
color
colour
colouur

$ egrep 'colou+r' grep_test.txt
colour
colouur

$ egrep 'colou{1,2}r' grep_test.txt
colour
colouur

```       
 
##複数の単語候補から探す
|メタ文字 |用途 |例|
|---     |---  |---  |
|.|任意の文字|03.12.12|       
|[ ]|[ ]内の文字のどれか|br[ea]ath / br[a-f]ath|
|[^ ]|[ ]内でない文字のどれか|^con[^v]|
|\|後ろのメタ文字をエスケープする|\$|

※`-`はその範囲の文字のどれかを表す．`a-f`はアルファベットのaからfのどれか．

``` shell
$ egrep '03.12.12' grep_test.txt
03/12/12
03.12.12
03-12-12

$ egrep 'br[ea]ath' grep_test.txt
breath // breath かbraathを探す

$ egrep '^con[^v]' grep_test.txt
construction //convolutionは除外されてconstructionのみ

$ egrep '[0-9]*.12.12' grep_test.txt
03/12/12
03.12.12
03-12-12
```
エラー処理について②

#初めに
過去にエラーの処理に関する記事を書きました

それがこれ

[railsでエラー処理](https://qiita.com/sibakenY/items/d86bc93417e718f11c2f)

この記事を書いたところ

> Railsのエラー処理については、たしかにrescue_fromを使うと様々なエラーを処理することができますが、個人的にはあまり多用すべきではないと思っています。

という話を聞き少し調べてみました。

#rails guidesでは

rails guidesにはrescure_fromのところで

> rescue_fromにExceptionやStandardErrorを指定すると、Railsでの正しい例外ハンドリングが阻害されて深刻な副作用が生じる可能性があります。よほどの理由がない限り、この指定はおすすめできません。

のように書いてあった。

#アドバイスでは

もらったアドバイスでは

> 例外処理はかなり奥が深いですし、下手に実装するとかえって発生したエラーを迷宮入りさせてしまうことにもなりかねないので、原則は「エラーが起きても何もしない、フレームワークの共通処理に任せる」だと考えています。

という話だったのですが実際にアプリを作成する場合間違いなくエラーゼロなんていうのも難しいと思うので

　
　
ある程度のエラーハンドルは必要そう。

多用するのが良くないといってもどのくらいなら良いのかわからない…
　
　
そこでgitlabのソースコードを読んでみた。

　
rescue_fromで例外を補足してエラーページを出力しているコードがこちら

```ruby 
rescue_from Encoding::CompatibilityError do |exception|
    log_exception(exception)
    render "errors/encoding", layout: "errors", status: 500
  end

  rescue_from ActiveRecord::RecordNotFound do |exception|
    log_exception(exception)
    render_404
  end

  rescue_from(ActionController::UnknownFormat) do
    render_404
  end

  rescue_from Gitlab::Access::AccessDeniedError do |exception|
    render_403
  end

  rescue_from Gitlab::Auth::TooManyIps do |e|
    head :forbidden, retry_after: Gitlab::Auth::UniqueIpsLimiter.config.unique_ips_limit_time_window
  end

  rescue_from GRPC::Unavailable, Gitlab::Git::CommandError do |exception|
    log_exception(exception)

    headers['Retry-After'] = exception.retry_after if exception.respond_to?(:retry_after)

    render_503
  end
```


上の三つは最初からrailsに搭載されているもので

エンコードのエラー,activerecord,actioncontrollerのエラーを取得している。

下の三つは独自のもので名前的に

権限関係と....よくわかんない（笑）


とりあえずgitlabで例外を補足していたのはテンプレートがなかった時レコードがなかった時エンコードの問題があったときだった。
　
エラーを補足した場合log_exceptionでログを出力していてそれがこのコード

```ruby 
def log_exception(exception)
    Gitlab::Sentry.track_acceptable_exception(exception)

    backtrace_cleaner = request.env["action_dispatch.backtrace_cleaner"]
    application_trace = ActionDispatch::ExceptionWrapper.new(backtrace_cleaner, exception).application_trace
    application_trace.map! { |t| "  #{t}\n" }
    logger.error "\n#{exception.class.name} (#{exception.message}):\n#{application_trace.join}"
  end
```

ActionDispatchとか知らんしなんで単純に


```ruby
logger.error "#{exception.class.name} : #{exception.message}"
```

にしないのかよくわからん


まあとにかく

```
rescue_from exception
```

はしないようにします:cop_tone1:
Fortranの逆三角関数を使って円周率を求める

# 概要
Fortranでは，円周率が定数として定義されていません．そのため，プログラム内で円周率を利用するには，ユーザが定義しなければなりません．
逆三角関数を使って円周率πをプログラム中で定義する方法を調べました．

## 使用環境
|コンパイラ|バージョン|
|:--|:--|
|intel Parallel Studio XE Composer Edition for Fortran| 19.0.0.117|
|PGI Visual Fortran for Windows|18.7|
|gfortran|7.3.0 (for Ubuntu on WSL)|

## 更新履歴
- 2019年2月9日 複数コンパイラでの検証結果を追記

# 方法
円周率は逆三角関数を利用すると，何通りかの方法で求められます．

```math
\begin{eqnarray}
\pi &=& 4 \tan^{-1}1\\
    &=& \cos^{-1}-1\\
    &=& 2\sin^{-1}1
\end{eqnarray}
```

このうち，FORTRANでは第1式がよく使われているようです．

著者は第2式を最初に知り，また他の式と比較してもかけ算がない分簡単だと感じています．

# 数値実験
## プログラム
これら3式の精度に違いがあるのか，次のプログラムを実行して確認してみました．ちなみに，PGI Fortranは`real128`を持っていないので，`real64`のみを用いています．

```Fortran
program main
    use,intrinsic :: iso_fortran_env
    implicit none
    
    real(real128),parameter :: PI = 3.14159265358979323846264338327950288_real128

    print '(2F23.19)', 4.0_real64*atan( 1.0_real64), PI - 4.0_real64*atan( 1.0_real64)
    print '(2F23.19)',            acos(-1.0_real64), PI -            acos(-1.0_real64)
    print '(2F23.19)', 2.0_real64*asin( 1.0_real64), PI - 2.0_real64*asin( 1.0_real64)

    print '(2F40.36)', 4.0_real128*atan( 1.0_real128), PI - 4.0_real128*atan( 1.0_real128)
    print '(2F40.36)',             acos(-1.0_real128), PI -             acos(-1.0_real128)
    print '(2F40.36)', 2.0_real128*asin( 1.0_real128), PI - 2.0_real128*asin( 1.0_real128)
end program main
```

基準となるのは，40桁の円周率を直接`real128`に代入した定数です．ただし，末尾3桁ほどは打ち切られます．

## 実行結果
### Intel Fortran
```console
   3.14159265358979323846264338327950
  3.1415926535897931160  0.0000000000000001225
  3.1415926535897931160  0.0000000000000001225
  3.1415926535897931160  0.0000000000000001225
  3.141592653589793238462643383279502797  0.000000000000000000000000000000000000
  3.141592653589793238462643383279502797  0.000000000000000000000000000000000000
  3.141592653589793238462643383279502797  0.000000000000000000000000000000000000
```

### PGI Fortran
```console
    3.141592653589793
  3.1415926535897931160  0.0000000000000000000
  3.1415926535897931160  0.0000000000000000000
  3.1415926535897931160  0.0000000000000000000
```

### gfortran
```console
   3.14159265358979323846264338327950280
  3.1415926535897931160  0.0000000000000001225
  3.1415926535897931160  0.0000000000000001225
  3.1415926535897931160  0.0000000000000001225
  3.141592653589793238462643383279502797  0.000000000000000000000000000000000000
  3.141592653589793238462643383279502797  0.000000000000000000000000000000000000
  3.141592653589793238462643383279502797  0.000000000000000000000000000000000000
```

### 考察
実行結果を見ると，`real64`の場合は小数点以下15桁まで正確に得られています．そして，3式の結果に違いはありません．これはいずれのコンパイラでも同じです．

PGI Fortranだけは，誤差が0になっています．これはPGIの計算結果の精度が高いわけではなく，定数が`real64`で宣言されているためです．

`real128`のときは，小数点以下32桁まで一致します．そして，`real64`と同様，3式の結果に違いはありません．

# まとめ
逆三角関数を利用して円周率を求める3通りの式を確認しました．得られる値に違いはありませんでした．
Untiy開発で早く知りたかったAttribute(属性)

#Attributeとは？
「UnityのInspector上で特別な挙動を設定することができたりするもの」
ぐらいの感覚でいいと思う最初は。

##[SeriarizeField]
Inspectorにprivateで定義した変数を表示できる。
これが一番使います！

```test.cs
[SeriarizeField]
private int private_int;
```

##[HideInInspector]
Inspectorにpublicで定義した変数でも表示させないことができる。
あまり使った記憶がない、、、

```test.cs
[HideInInspector]
public int public_int;
```

##[DLLImport("")]
自分で作成したdllをunityで使いたい時。
ここは、また別の記事でご紹介できれば考えています！

```test.cs
[DLLImport("dll")]
//dll内の関数
public static extern int Add(int a, int b);
```

##[Tooltip("")]
Inspectorに設定している変数名にマウスオーバーすると("")内の文字が表示されます。

```test.cs
[Tooltip("ツールチップ")]
//dll内の関数
public int tooltip_int;
```

##[Header("")]
Inspectorの変数の上にヘッダーをつけることができます。
変数名でどういう数値か理解しづらい場合に使ってます。

```test.cs
[Header("ヘッダー")]
//dll内の関数
public int header_int;
```

##[Space]
Inspectorで表示される変数と変数の感覚を開けることができる。

```test.cs
private int a;

[Space]

private int b;
```

#合わせて使うこともできる！

上で、紹介したAttributeは複数を同時に使うこともできます！
各Attribute宣言の区切りで,（カンマ）を入れればOK！

```test.cs
[SerializeField,Header("イントだよ"),Tooltip("ツールチップもついてるよ")]
private int test_int;
```

#参考画像
<img width="683" alt="スクリーンショット 2019-02-07 19.56.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/316758/7bd0a472-deae-0415-0870-a3494eb25a3d.png">


#仕事でunityを使うようになってから知ったAttributeを知った
便利なものはどんどん使おう！
他にもAttributeはたくさんありますが、私がよく使うものをご紹介させていただきました！
スタック可能なセンサーモジュール　Infineon XMC 2Go Kit with XMC1100　Shield2Go

某社の方とセンサーのモジュールの話をしました。
何でGroveなの？
と言うことに対する答えですが、とりあえず、簡単に使えるということですが、
それでいいのか？と言う事を言われると
Interruptやアナログ入力の制約等からGroveじゃない方が良いよねと言う話になりました。

解決策としては、Inifinionが出しているモジュールがあります。
XMC 2Go Kit with XMC1100　と言う型番のようです。
Shield2Goと言うシリーズらしいです。
https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc_2go_xmc1100_v1/
ARM Cortex M0を搭載した極小モジュールで、各種センサーを使用可能です。

![IMG_9431.JPG](https://qiita-image-store.s3.amazonaws.com/0/285344/f31353ce-641d-2edb-9fb7-5d266b5f1c0c.jpeg)

今回は、IM69D130とDPS310のモジュールです。
https://www.infineon.com/cms/jp/product/evaluation-boards/s2go-pressure-dps310/
https://www.infineon.com/cms/en/product/evaluation-boards/s2go-memsmic-im69d/
![IMG_9432.JPG](https://qiita-image-store.s3.amazonaws.com/0/285344/671cc51b-9b7a-866a-4a18-1ab2dd846793.jpeg)

各社の汎用で使える小型モジュールがあると最高ですよね・・・
change_columnを使うとrollbackができない！

# migrateしたけど、やっぱり元に戻したい
以下のコマンドで基本的には元に戻せると思います。
`bundle exec rake db:rollback`

# rollbackでエラーが出た
エラー文:
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

change_column_default is only reversible if given a :from and :to option.

# 解決方法

### 元のマイグレーションファイル

```
class AddDefaultToUsers < ActiveRecord::Migration[5.0]
  def change
    change_column_default :users, :name,     ""
  end
```

### 修正後のマイグレーションファイル

upメソッドに元の処理を記述し、downメソッドに元に戻したい処理を記述する。
修正したら
`bundle exec rake db:rollback`をする。
schema.rbに戻した内容が反映されているのを確認したら、
マイグレーションファイルを削除する。

```
class AddDefaultToUsers < ActiveRecord::Migration[5.0]
  def up
    change_column_default :users, :name,     ""
  end

  def down
    change_column_default :users, :name,     nil
  end
```


## リファレンス

http://railsdoc.com/references/rake%20db:rollback
指定期間のなかから条件に一致する日付をリストアップ（F#）

# 概要

F#プログラムの練習として「指定された期間のなかから条件を満たした日をリストアップするプログラム」を書きました。

まずは、条件例として「休日に指定される期間／日を除いた全ての月曜日」を与えるものを作成してみました。月曜授業日をリストアップするプログラムになります。

# プログラム
`DateTime` が何回もでてくるので、`type DT = System.DateTime` によって短縮した別型名`DT`を与えています（`TimeSpan`についても同様です）。

```FSharp:Program.fs
open System

type DT = System.DateTime
type TS = System.TimeSpan

[<EntryPoint>]
let main argv =

  // f:開始日 から t:終了日 までの DateTime シーケンス生成
  let genDatesSeq (f:DT) (t:DT) = 
     { 0 .. (t-f).Days } 
     |> Seq.map (fun d -> f + TS.FromDays(float d)) 

  let y = 2019
  let fromDT = DT(y,4,8)   // 期間開始日
  let toDT   = DT(y,9,30)  // 期間終了日

  // 祝日や夏休みのセット
  let exclusionSet = 
    set [] 
    |> Set.union (Set.ofSeq( genDatesSeq (DT(y,4,27)) (DT(y,5,6) )))
    |> Set.add (DT(y,7,15)) // 海の日
    |> Set.union (Set.ofSeq( genDatesSeq (DT(y,8,8)) (DT(y,9,13) )))
    |> Set.add (DT(y,8,12)) // 山の日（振替休日）
    |> Set.add (DT(y,9,16)) // 敬老の日
    |> Set.add (DT(y,9,23)) // 秋分の日

  // リストアップ対象日を通過させるフィルタ　ここでは休日外の月曜日を選択
  let passFilter (p:DT) = 
    ( p.DayOfWeek = DayOfWeek.Monday ) && not ( exclusionSet.Contains p )

  // 出力フォーマット
  let format = "yyyy/MM/dd (ddd)"

  // 日付の出力
  do genDatesSeq fromDT toDT
    |> Seq.filter passFilter
    |> Seq.map (fun p-> p.ToString(format))
    |> Seq.iter (fun p -> printfn "%s" p)

  Console.ReadKey() |> ignore
  0
```

# 実行結果

```
2019/04/08 (月)
2019/04/15 (月)
2019/04/22 (月)
2019/05/13 (月)
2019/05/20 (月)
2019/05/27 (月)
2019/06/03 (月)
2019/06/10 (月)
2019/06/17 (月)
2019/06/24 (月)
2019/07/01 (月)
2019/07/08 (月)
2019/07/22 (月)
2019/07/29 (月)
2019/08/05 (月)
2019/09/30 (月)
```

## 発展

期間中の第一金曜日をリストアップするためにはフィルタを次のように書き換えます（ここでは`exclusionSet`で設定した休みを考慮していません）。

```FSharp:
let passFilter (p:DT) = 
  ( p.DayOfWeek = DayOfWeek.Friday ) && ( p.Day <= 7 )
```

プレミアムフライデー（月の最終金曜日）をリストアップするためには、フィルタを次のように書き換えます。

```FSharp:
let next m = if m = 12 then 1 else m+1
let passFilter (p:DT) = 
  ( p.DayOfWeek = DayOfWeek.Friday ) 
  && ( (DT(p.Year, next p.Month ,1)-TS.FromDays(8.)).Day < p.Day )
```

F#では、等値比較に`==`ではなく`=`を使用する関係で、慣れるまでは`let next m = if m = 12 then 1 else m+1`なんかは非常に読み取りずらいです。括弧をつけると多少は読み取りやすくなるのかな・・・

```FSharp:
let next m = ( if ( m = 12) then 1 else ( m + 1 ) )
```