OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリで証明書の情報を参照する

# 背景

* エンタープライズな現場では定期的にアプリをビルドし直す必要がある
* アプリ配布側ではなく、現場でアプリを使って証明書（プロビジョン）の期限をチェックしたいという要望がある


# 方針

* 実行中のアプリからプロビジョンにアクセスする方法はなさそうなので
* ビルド時にプロビジョンの情報を取り出して設定アプリに埋め込む

# 実装

### 準備

* macOS 10.14.4 / Xcode 10.2 / iOS 12.2
* XcodeプロジェクトのBuild Phasesにスクリプトを追加

### プロビジョンプロファイルの場所は？

* `EXPANDED_PROVISIONING_PROFILE` でUUIDを取得できるので
* `${HOME}/Library/MobileDevice/Provisioning\ Profiles/${EXPANDED_PROVISIONING_PROFILE}.mobileprovision` でアクセスする

### プロビジョンプロファイルの中身をみる

* プロビジョンプロファイルはそのままでは処理できる形式ではないので `security` コマンドを使用する

```shell
$ security cms -D -i xxx.mobileprovision
```
* 余分なデータを取り除いたplist形式のものが標準出力にでてくる（この出力を ```PROVISION_PLIST``` とする）

### 必要な情報を取得

* あとはいつもの ```PlistBuddy``` で必要な情報を取得

```shell
# 作成日
$ PlistBuddy -c 'Print :CreationDate' /dev/stdin <<< ${PROVISION_PLIST}
# 有効期限
$ PlistBuddy -c 'Print :ExpirationDate' /dev/stdin <<< ${PROVISION_PLIST}
# App ID
$ PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< ${PROVISION_PLIST}
```

### 設定アプリに埋め込む

* こちらもいつもどおり

```shell
$ PlistBuddy -c "Set :PreferenceSpecifiers:2:DefaultValue ${CREATION_DATE}" "${SETTING_PLIST_PATH}"
```

# 完成

* スクリプトの全体像（アプリのバージョンやプロビジョンプロファイルのUUIDも出力してます）

```shell
SETTING_PLIST_PATH=${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist
PLIST_BUDDY=/usr/libexec/PlistBuddy

APP_VERSION=$(${PLIST_BUDDY} -c "Print CFBundleShortVersionString" "${PRODUCT_SETTINGS_PATH}")
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:1:DefaultValue v${APP_VERSION}" "${SETTING_PLIST_PATH}"

PROVISION_PATH=${HOME}/Library/MobileDevice/Provisioning\ Profiles/${EXPANDED_PROVISIONING_PROFILE}.mobileprovision
PROVISION_PLIST=$(security cms -D -i "${PROVISION_PATH}")
CREATION_DATE=$(${PLIST_BUDDY} -c 'Print :CreationDate' /dev/stdin <<< ${PROVISION_PLIST})
EXPIRATION_DATE=$(${PLIST_BUDDY} -c 'Print :ExpirationDate' /dev/stdin <<< ${PROVISION_PLIST})
IDENTIFIER=$(${PLIST_BUDDY} -c 'Print :Entitlements:application-identifier' /dev/stdin <<< ${PROVISION_PLIST})

${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:2:DefaultValue ${CREATION_DATE}" "${SETTING_PLIST_PATH}"
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:3:DefaultValue ${EXPIRATION_DATE}" "${SETTING_PLIST_PATH}"
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:4:DefaultValue ${IDENTIFIER}" "${SETTING_PLIST_PATH}"
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:5:DefaultValue ${EXPANDED_PROVISIONING_PROFILE}" "${SETTING_PLIST_PATH}"
```

* 結果
![screen_shot_iphone](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228129/d95bcbd7-33cd-002b-34e3-bc812469102a.png)


* めでたしめでたし
地図はいつから古くなるのか？

#planet.osmから見る地図の変遷とその更新ペース(卒論覚書ってやつ)
最終更新日:2019/04/19
##はじめに
このページは、私がこの一年間で完成させるサービス開発の覚書である。内容の正誤性に保証は持てないし、時系列や開発順通りに並べるつもりもない。ただ、余裕があれば整備するかもしれない。
ただ、こんな端書でも何かの役に立てばいいなと思いここに記す。

##覚書
###osmから得られるchangesetの構造と使い道

```changeset.xml
<osm version="0.6" generator="CGImap 0.6.1 (11419 thorn-02.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/">
<changeset id="69260327" created_at="2019-04-16T07:47:23Z" closed_at="2019-04-16T07:47:24Z" open="false" user="Kouki_T" uid="4089822" min_lat="35.6414530" min_lon="139.7495544" max_lat="35.6418014" max_lon="139.7500988" comments_count="0">
<tag k="changesets_count" v="252"/>
<tag k="imagery_used" v="Bing aerial imagery"/>
<tag k="locale" v="ja"/>
<tag k="host" v="https://www.openstreetmap.org/edit"/>
<tag k="created_by" v="iD 2.14.3"/>
<tag k="comment" v="add TOPPAN SHIBAURA BUIDING"/>
</changeset>
</osm>
```
<b>changeset id</b>はhttps://www.openstreetmap.org/changeset/*** に飛ばすことでその変更セットに飛ぶことができる。
<b>num_changes</b>は変更したノードの数。
<b>user</b>は変更したユーザー。
<b>uid</b>は変更したユーザーのid?
<b>min_lat max_lat</b>編集したノードの緯度値
<b>min_lon max_lon</b>編集したノードの経度値

基本的にはplanet.osmから得られるdiffも同じ。osmタグがないくらい。
lat,lonタグからポイントを取得し地図に表示できればいけそう。
↓
緯度経度からエリアを判別できればいけるか・・・？

changesetは緯度経度データなのでxyz方式に変換する必要がある

平面直角座標への換算
https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2xyf.html
![WS000169.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307125/1c28acae-039e-1216-4c1b-32a336dc5dcd.jpeg)
![WS000170.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307125/11b5b750-cd2b-4daa-22d1-f9713a537df9.jpeg)

max値の方を取ってみたら少しずれてた。まぁ許容範囲か。
さすがに毎回国土地理院に計算させるわけにもいかないので計算式を探す。
・・・？？？なんだこれはたまげたなぁ（数学苦手勢）
~~関数なんてわかるわけないだろ！いい加減にしろ！~~

というわけで先人の知恵をお借りすることに（いつもの）

緯度経度と平面直角座標の相互変換をPythonで実装する
https://qiita.com/sw1227/items/e7a590994ad7dcd0e8ab 

緯度経度原点については、ごめん調べたけどわからなかった。
地理院地図が、

>また、各タイルにはX,Yからなるタイル座標を定義します。
西経180度、北緯約85.0511度の北西端を端点にもつタイルを(0,0)として東方向をX正方向、南方向をY正方向にとります。

と指定してるのでとりあえず従おう。

とりあえずテストとしてinputとprintで緯度経度入力するように書き換えたけど結果を吐き出してくれないから病む。いったん終わり。
レビューお願いしたら、こんなにダメだった話

###スネークケースとキャメルケースとパスカルケース

```php
preferred_job_types //スネークケース
preferredJobTypes  //キャメルケース
PreferredJobTypes  //パスカルケース
```
スネークケース・・・DB、変数、関数
キャメルケース・・・インスタンス化したすべての変数、関数
パスカルケース・・・クラス



###データベースの値を取得時の効率化

```php
$record = Employmentpattern::where('code', $inputValue)->first();
```
より

```php
$record = Employmentpattern::where('code', $inputValue)->select('id')->first();
```
のほうが効率的。
・where()・・・ カラム「name」が「名前1」というデータを取得
・select()・・・カラム「name」だけを取得

他にも
・変数名がイマイチ
・変なところに改行、半角スペース、全角スペース入ってる

全レコードを取得してたが、select()入れることにより、一つのカラムだけ取得できるようになる。

















毎回、レビュー依頼時は確認するようにしよ。
SQLServerで空白を別の文字列に置換する

##この記事について
SQLServerで項目の中身が空白だったときに別の文字列に置換する際、「REPLACEが使えないだと！！！」となったので、置換方法を記載します。

##課題の例
以下のテストテーブルを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/173be815-5ac7-c90d-c534-bf4fc4ff00bf.png)

空白部分を`柏`に置換してSELECTしたいとき、まず思い浮かぶ方法としてREPLACEを使用するやり方が思い浮かびますが、これだとうまくいきません。

以下のSQLを実行しても

```SQL
SELECT
  PLAYAR_NAME
  ,REPLACE(CLUB_NAME, '', '柏') AS PLAYAR_NAME
FROM PLAYER_LIST
```

SLECT結果は以下のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/732a1fe5-cd25-5800-3ac5-37ca88cb9ebb.png)

##解決方法
REPLACEは使えないのですが、CASE文は使えます。

```SQL
SELECT
  PLAYAR_NAME
  ,CASE CLUB_NAME WHEN '' THEN '柏' ELSE CLUB_NAME END AS CLUB_NAME
FROM PLAYAR_NAME
```

SELECT結果も想定通りの結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/71a1cff6-1f61-32cb-7da2-066d814416b3.png)

##どういうときに使うのか？
今回記事を書こうと思ったきっかけは、REPLACEを使用して置換したSELECT結果を水平タブで区切られたCSVファイルにして、別テーブルに取り込みたいとき、空白が変換されずに水平タブを挿入しようとして取込エラーが発生してしまったからです。
CASE文で空白を半角スペース等に変換してCSVファイルを作成したらきれいに取り込めました。

というわけで、SQLServerで空白を何か別の文字に変換したい際は`CASE文`を使いましょう！
ぎっと　ぷっしゅ

今日は、初めて自分で”ぎっとぷっしゅ”ができたので、メモします。

ls
cd /opt/lampp
ls

で確認しながらプッシュしたいファイルがある場所までおりる。
----------ぬけてたみたい
git add .
git comit
-----------ここ調べないと。
git blanch
git push origin XXXX

で、IDとPASSを入れてOK！
Cognos Analytics でスクロール可能リストを作る

Cognosでリスト表を普通にただ作ると、表示するデータ行数が多い場合はページを送ってデータをみる仕様になってしまいます。そうではなくて、スクロールしてデータを見れるようにしたい、という事もあると思います。その場合の方法を紹介します。

まずこんな感じでサンプルデータを使っていつものようにリスト表を作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/d929a56c-73e1-4a0b-1c20-474e4199b94c.png)

この状態のまま実行するといかのようになります
もっとデータを見るには下のページ送りをしなくてはなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/4d8b1a90-1bb4-fb89-f05d-90744ad4edb3.png)

スクロールでデータを見れるようにするために今回は1ページに表示させるデータ行数を1000に変更して、スクロールできるようにしてみます。
リスト表左上のオレンジ点の三角をクリックしてリスト表を選択し、プロパティを開きます。
データ->ページあたりの行数に、1000
全般-> スクロール可能域の高さ　600
とします。（スクロール可能域の高さは、ピクセル単位になっています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/a5b926b4-0bcc-c86f-6f04-c3c4014e9175.png)

レポートを実行してみると見出しが固定されたままデータ行がスクロールで表示できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/ca514672-7c60-669b-d20d-c68e4f018373.png)

以上


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
cc-rsでCのFFIが付属しているプロジェクトもクロスコンパイルする

[cc-rs](https://github.com/alexcrichton/cc-rs)がどうもクロスコンパイルをサポートしているっぽいのでメモ

```rust:build.rs
fn main() {
    cc::Build::new().file("foo.c").compile("foo");
}
```

これでCのコードをビルドしてリンク出来ます。

```c:foo.c
int foo_c(void) {
  return 114514;
}
```

```rust:src/main.rs
extern "C" {
    fn foo_c() -> i32;
}

fn main() {
    println!("Fooo: {}", unsafe { foo_c() });
}
```

実行すると`foo_c`が呼ばれます

```
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/ffi_cross_example`
Fooo: 114514
```

[前回](https://qiita.com/termoshtt/items/12f9dbb5425a94a4e545)紹介したzero-setup cross compile [cross](https://github.com/rust-embedded/cross) を試してみます

```
$ cross run --target aarch64-unknown-linux-gnu
   Compiling ffi_cross_example v0.1.0 (/project)
    Finished dev [unoptimized + debuginfo] target(s) in 0.60s
     Running `qemu-aarch64 /target/aarch64-unknown-linux-gnu/debug/ffi_cross_example`
Fooo: 114514
```

動きます(◎_◎;)

wasmとかも吐けます

```
$ cargo build --target=wasm32-unknown-unknown
$ wasm-nm target/wasm32-unknown-unknown/debug/ffi_cross_example.wasm | grep foo_c
i foo_c
```

wasm-nmはこれ： https://github.com/fitzgen/wasm-nm
ReactコンポーネントのコンポジションとReact hooksのコンポジションの比較

## はじめに

React hooksはコンポジションによるカスタムフックが強みです。本稿では、コンポーネントとhooksのコンポジションを比較する簡単なコードを紹介します。

## Reactコンポーネントの場合

簡単な例を考えてみましょう。

```jsx
const Person = ({ person }) => (
  <div>
    <div className="personFirstName">
      <span>First Name:<span>
      <span>{person.firstName}</span>
    </div>
    <div className="personLastName">
      <span>Last Name:<span>
      <span>{person.lastName}</span>
    </div>
  </div>
);
```

コンポジションにより、このコンポーネントを分割して構成するようにすると例えば次のようになります。

```jsx
const FirstName = ({ name }) => (
  <div className="personFirstName">
    <span>First Name:<span>
    <span>{name}</span>
  </div>
);
```
```jsx
const LastName = ({ name }) => (
  <div className="personLastName">
    <span>Last Name:<span>
    <span>{name}</span>
  </div>
);
```
```jsx
const Person = ({ person }) => (
  <div>
    <FirstName name={person.firstName} />
    <LastName name={person.lastName} />
  </div>
);
```

なぜこのように分割するのでしょうか。再利用性のためです。例えば、この `FirstName` は他のコンポーネントでも使うことができます。

## React hooksの場合

hooksの場合はどうなるでしょうか。例えば、 `usePerson` というフックがあると仮定します。これはpersonオブジェクトを返すものとします。どのように実装されるかは重要ではありませんが、例えば `useContext` で実装されていると考えると分かりやすいでしょう。

```jsx
const Person = () => {
  const person = usePerson();
  const firstName = person.firstName;
  const lastName = person.lastName;
  return <div>{firstName}{' '}{lastName}</div>
};
```

これは極端に単純にしたコード例ですが、これをコンポジションによって分割構成してみましょう。

```javascript
const useFirstName = () => {
  const person = usePerson();
  return person.firstName;
};
```
```javascript
const useLastName = () => {
  const person = usePerson();
  return person.lastName;
};
```
```jsx
const Person = () => {
  const firstName = useFirstName();
  const lastName = useLastName();
  return <div>{firstName}{' '}{lastName}</div>;
};
```

雰囲気はつかめたでしょうか。このように分割することで同じように `useFirstName` を他のコンポーネントやhooksで再利用できるようになります。

## おわりに

コンポジションは重要です。コンポーネント組み合わせて新しいコンポーネントを作れるように、hooksを組み合わせてカスタムフックを作ることができます。

## おまけ

コンポーネントのコンポジションにおいては `children` があります。hooksにおいてこれと同等のものは何になるでしょう。もしかしたら、ファクトリーがそれに該当するかもしれません。

```javascript
const createPersonHooks = (usePerson) => {
  const useFirstName = () => {
    const person = usePerson();
    return person.firstName;
  };
  const useLastName = () => {
    const person = usePerson();
    return person.lastName;
  };
  return { useFirstName, useLastName };
};
```

これが同等のものかは確信はありません。ちなみに、[constate](https://github.com/diegohaz/constate)はこのようなアプローチで作られているようです。
日本初のオープン&フリーなプラットフォーム「Tellus」を使ってみた

# Tellus...ご存知？
以下、[Tellus HP](https://www.tellusxdp.com/ja/)より
>「Tellus（テルース）」は、日本初のオープン&フリーな衛星データプラットフォームです。
今まで扱いの難しかった衛星データを、誰もが簡単に、無償で扱うことができる環境を提供します。
今後Tellusの機能や搭載されるデータは随時更新していきます。

まあ、簡単に言うと人工衛星のデータを無償で使用できるのです。

## なぜ今、衛星データ？日本初プラットフォーム？
最近、はやぶさ2のタッチダウンであったり、ブラックホールだったりが世間をにぎわせている宇宙業界ですが、じわじわと世界規模で大きくなりつつあります。
今までは教育や研究用に打ち上げてきた衛星ちゃんたちも、ついに商業用として開発される時代が来たのです...！！

衛星を打ち上げると、もちろんデータを所得しますよね？
それを解析、分析して研究用途に使用するわけですね。
素晴らしい！どんどん打ち上げて研究、商業利用を進めよう！！！

**ほんとにそれでいいの？**

というのは、衛星を打ち上げて商業・研究利用するのはもちろん良いことだと思うのですが、それって企業単位でしか知見が共有されませんよね？
そんなんじゃ、オープンソースが進んでいる現代において開発速度遅すぎない？というわけなのです。
まあ、たぶん日本が宇宙開発に出遅れているからという理由もあるんでしょうが...笑

ということで、[経済産業省](https://www.meti.go.jp/)が日本の大手企業、[さくらインターネット](https://www.sakura.ad.jp/)に委託して開発されているのが、[Tellus](https://www.tellusxdp.com/ja/)なわけですね！
開発したものを出すマーケットみたいなものも実装予定らしいので、みなさんどんどん使用して、知見を共有していきましょう！


## 使い方
ほかの記事等でも使い方が書いているのですが、私はpythonなど触ったことありません。
そもそも、REST-APIのつなぎ方がわからんのだよ！！！！！と怒り狂って、自力で頑張ってみたので共有します。
よろぴこ。

まず、Tellusのサイトに行き、右上にあるユーザー登録をします。
すると、すぐにTellusOSが使用できるようになりますね！

良き良き。

では、実際にコードを書いて画像を所得したいと思ったときはどうするの？
そういう時は、jupyter notebookを用意してくれているので、その辺は公式の[記事](https://www.tellusxdp.com/ja/tutorial)を読んでみてください。
マイページから開発環境を申し込むみたいですね。

## コード
今回は、landsat8ちゃんのデータをもらいます。

今回読み込むライブラリたちです。
多すぎてダルビッシュですね。

```python:get.ipynb
#coding:utf-8
from PIL import Image
import matplotlib.pyplot as plt
import requests
import numpy as np
from io import BytesIO
from keras.preprocessing.image import load_img, img_to_array
%matplotlib inline
```

次に、REST APIのキーを所得します。
公式でtokenと書いているところはこのキーを代入します。
キーは、[マイページのAPIアクセス設定](https://www.tellusxdp.com/ja/mypage/clients)というところで発行できるみたいです。

まあ、私は知識がないからずっとサーバーを借りたときのtokenをセットしてて、”unauthorized”って帰ってきてめっちゃ腹立ったけどな！！
引っかかったらあかんで！(私だけ？)

```python:get.ipynb
token = "XXXXXXXXXX" #自分で発行したtokenをセットします
url = "https://gisapi.tellusxdp.com/api/v1/landsat8/get_scene/LO81070302015042LGN01" #url

headers = {
    'Authorization': "Bearer" + " " + token
}
```

よし、あとはrequestsを送るだけやな！！
...ということで、requestsを送ります。
そのあと、配列に変換して、imgを表示します。

```python:get.ipynb
# requests
response = requests.get( url, headers=headers)
print(response)

# res to array with numpy
img = img_to_array(load_img(BytesIO(response.content)))
RGB_img = img.astype(np.uint8)

# show
plt.imshow(RGB_img)
plt.show()
```

## コード全部
できましたか？
以下に全部乗せておくので参考にしてみてください
token = "XX"に自分のやつを入れ替えるだけで試せます。

```python:get.ipynb
#coding:utf-8
from PIL import Image
import matplotlib.pyplot as plt
import requests
import numpy as np
from io import BytesIO
from keras.preprocessing.image import load_img, img_to_array
%matplotlib inline  

# prepare 
token = "XX"
url = "https://gisapi.tellusxdp.com/landsat8/9/456/195.png"

print(url)
headers = {
    'Authorization': "Bearer" + " " + token
}

# requests
response = requests.get( url, headers=headers)
print(response)

# res to array with numpy
img = img_to_array(load_img(BytesIO(response.content)))
RGB_img = img.astype(np.uint8)

# show
plt.imshow(RGB_img)
plt.show()

```
#python の #正規表現 で テキストを Twitter のハッシュタグスタイル にする例

- 単語境界 `\b` でマッチさせて replace する

# 単語全て (ざっくり)

```py
>>> re.sub(r'\b([A-Za-z][A-Za-z0-9]+)\b', "#\\1", "A whole new-world under_the_sea")
'A #whole #new-#world under_the_sea'
```

# 指定の単語

`perlpythonruby` という文字列は置換されていないのが分かる

```py

>>> re.sub(r'\b(ruby|perl|python)\b', "#\\1", "Do you like python or ruby? mixed perlpythonruby languate does not exist?")
'Do you like #python or #ruby? mixed perlpythonruby languate does not exist?'
```

# 大文字小文字を気にしないパターン

大文字の Ruby も置換されているのが分かる

```py
>>> pattern = re.compile(r'\b(ruby|perl|python)\b', re.IGNORECASE)
>>> re.sub(pattern, "#\\1", "Do you like python or Ruby? mixed perlpythonruby languate does not exist?")
'Do you like #python or #Ruby? mixed perlpythonruby languate does not exist?'
```

# 元から存在するハッシュタグを無視する例

否定の look back を使う `?<!#`

```py
>>> re.sub(r'\b(?<!#)(ruby|perl|python)\b', "#\\1", "Do you like #python or ruby? mixed perlpythonruby languate does not exist?")
'Do you like #python or #ruby? mixed perlpythonruby languate does not exist?'
```

# 全部込み

```py
>>> pattern = re.compile(r'\b(?<!#)(ruby|perl|python)\b', re.IGNORECASE)
>>> re.sub(pattern, "#\\1", "Do you like #python or ruby or Perl? mixed perlpythonruby languate does not exist?")
'Do you like #python or #ruby or #Perl? mixed perlpythonruby languate does not exist?'
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ubuntuとwindowsをデュアルブートしたPCで、パーティションを変更す方法

今回はWINDOWSの領域を減らして、UBUNTUの方を大きくする。

１．UBUNTUを起動して、適当なソフト（自分はGPartedを使用）によって、Windowsの空き領域を削るなりして、UBUNTUのための領域を確保。

２．Windowsを起動して、適当なソフトを使って、UBUNTUを１．で空けた領域にコピーし、その後UBUNTUのデータ領域をリサイズで大きくする。

３．コピー元のUBUNTUを削除。


自分はこの方法でうまく行きました。多分正攻法ではないので自己責任でよろしくお願いします。
Bash/Zsh 二重括弧で increment する際の注意点

## 検証した環境

- BASH_VERSION='3.2.57(1)-release'
- BASH_VERSION='4.3.48(1)-release'

## Bash/Zsh で increment するには

こんな感じで **二重括弧 (double parentheses)** が使えます。

```shell
COUNT=0
(( COUNT ++ ))
echo $COUNT # 1
```

ただ Bash 環境での、この increment には、注意点がありました...

```shell
COUNT=0
(( COUNT ++ ))
echo $? # 1
echo $COUNT # 1
```

increment は問題なくしてくれるのですが、終了ステータスが `1` として判定されるのです。(何がエラーなのだろうか...)
終了ステータス `1` を常に監視しているような環境では注意したほうがいいかもしれません。。

ちなみに Zsh では正常終了のステータス `0` が返されます。

```
COUNT=0
(( COUNT ++ ))
echo $? # 0
echo $COUNT # 1
```

## 他の書き方ではどうか

`COUNT=0` は省略します。全て Bash で試しました。

```shell
(( COUNT += 1 ))
echo $? # 0
echo $COUNT # 1
```

```shell
(( COUNT = COUNT + 1 ))
echo $? # 0
echo $COUNT # 1
```

```shell
COUNT=$((COUNT ++))
echo $? # 0
echo $COUNT # 1
```

```shell
COUNT=$((COUNT + 1))
echo $? # 0
echo $COUNT # 1
```

### まとめ

`(( COUNT ++ ))` は Bash では `exit 1` が返るのでご注意を！
Puppeteerのなにがし


# 高速化したい時にするなにか

## HTMLが取得できればいい時

[setRequestInterception](https://pptr.dev/#?product=Puppeteer&version=v1.14.0&show=api-pagesetrequestinterceptionvalue)でリクエストをどうするか制御する。
`request.abort`で処理を中断、 `request.continue`で処理を継続させるという制御ができる。
HTMLだけあればいいというときは以下でいう最初のリクエストだけあればいい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126548/91eb20a6-dedf-795a-c788-c701402848bd.png" width="500px">
なのでそれだけを取得してやればOK

```JavaScript
let page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
  if (url === interceptedRequest.url()) {
        interceptedRequest.continue();
    } else {
        interceptedRequest.abort();
    }
});
```


## launchの時にする何か
色々引数を付与してやるといいらしい

```JavaScript
puppeteer.launch({
  headless: true,
  args: [
    '--no-first-run',
    '--no-sandbox',
    '--no-zygote',
    '--single-process'
  ]
})
```



## もはやPuppeteerは関係ない何か
並列で処理するだけ

```JavaScript
(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: []
  });
  const verifyExistParts (browser, url) => {
    ...
    return true or false
  }

  await Promise.all(urls.map(url => verifyExistParts(browser, url))).then((results) => {
    const failures = results.filter(e => e === false).length;
    const msg = `${results.length} examples, ${failures} failures`;
    let status;

    if (results.every(result => result)) {
      status = 'Succeeded.';
    } else {
      status = 'Failed.';
    }
    console.log(`${status} ${msg}`);
  });
  browser.close();
})();
```

# launchするときのいろいろ
## options
| 項目 | 説明 | 備考 ｜
|---|---|---|
| headless | Chromeをクローム（ブラウザUI）なしに実行する。デフォルトで`true` |[参考URL](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)|
| ignoreHTTPSErrors |エラーを無視できる。デフォルトは`false`||
| slowMo |ms単位で遅延実行してくれる||
|args|ブラウザインスタンスに渡す追加の引数||
| timeout |ブラウザインスタンスの起動を待機する最大時間（ms）。デフォルトは`30000ms`。`0`で無効にできる||

### args
ちょっと多すぎて挫折

| 項目 | 説明 | 備考 ｜
|---|---|---|
| --disable-gpu |`GPU hardware acceleration`を無効化する||
| --disable-dev-shm-usage|コンテナで実行するときはメモリの関係上付与した方がいいらしい|[参考URL](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#tips)|
| --no-sandbox|通常sandbox※化されているすべてのプロセスタイプに対してsandboxを無効にする|sandbox:外部から受け取ったプログラムを保護された領域で動作させて、システムが不正に操作されるのを防ぐセキュリティ・システム|
********** NO FILE ********** マイグレーションのこれ

https://joppot.info/2014/10/16/2104

上記をそのまま参考にして削除できた。


`rake db:migrate`でエラー
`Mysql2::Error: Duplicate column name 'hoge': ALTER TABLE `organizations` ADD `hoge` int(11)`

この場合、マイグレーションファイルのchangeメソッドの中身を消してやると実行できる。
そのあとに中身を書いてから再度、rake db:migrateでおｋ
https://qiita.com/niyomong/items/22fa60657ea8ee478647
KustomizeのconfigMapGeneratorをOverlayする方法

地味に迷ったので。

Kustomizeに関しては別のQiitaの素晴らしい記事を参照してください。

* https://qiita.com/aeleniumfor/items/2b01a85ba36ef8a8602d
* https://qiita.com/ryodocx/items/008fdaf5c68678656749

その際、ConfigMapを環境ごとに使い分けたいと思った際に、configMapGeneratorをpatchしようとした際に地味に迷ったので備忘として。

まずbaseを記載。resourceについては省略しております。

```yaml
## base/kustomization.yaml
namespace: flask
  
commonLabels:
  resource: flask

configMapGenerator:
- name: python-env
  literals:
    - PYTHON_ENV=test

resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml
```

その後、prodでoverlayするときに、configMapGeneratorで上書きすれば良いと思っていましたが、これだと上手くいかない。
`Already Exist`と怒られてしまいます。


```yaml
## prod/kustomization.yaml
bases:
- ../base

configMapGenerator:
- name: python-env
  literals:
    - PYTHON_ENV=production

patches:
- ./deployment.yaml
```

公式の[README.md](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/configGeneration.md)を確認したところ、overlayはconfigmapを書かないといけないようです。

```yaml
## prod/kustomization.yaml
bases:
- ../base

patches:
- ./deployment.yaml
- ./configmap.yaml
```

```yaml
## prod/configmap.yaml
apiVersion: v1
data:
  PYTHON_ENV: production
kind: ConfigMap
metadata:
  name: python-env
```

これでoverlayでprod用に環境変数が書き換えられます。

全てconfigMapGeneratorでできるようになると楽になって良いと思う今日この頃。
Azure PowerShell Azモジュールインストール時のエラー対応

Azure PowerShell Azモジュールインストール時にエラーになったので、解決法をメモしておきます。

以下は公式ページ
[Azure PowerShell モジュールのインストールInstall the Azure PowerShell module](https://docs.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-1.7.0&viewFallbackFrom=azurermps-6.13.0)

# 環境

* Windows 10 Pro
* PowerShell 5.1.17134.590

# Proxy設定

* PowerShellを管理者権限で起動します。

* Proxy環境下の場合は、Proxy設定をしておきます。

```powershell
$password = ConvertTo-SecureString "password" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential "username", $password
[System.Net.WebRequest]::DefaultWebProxy.Credentials = $cred
```

# インストール時にエラー

* 公式ページに従って以下のインストールコマンドを実行します。

```powershell
Install-Module -Name Az -AllowClobber
```

* ここでエラー

```
PackageManagement\Install-Package : 指定された検索条件とパッケージ名 'Az' と一致するものが見つかりませんでした。登録さ
れている使用可能なすべてのパッケージ ソースを確認するには、Get-PSRepository を使用します。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 文字:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Ex
   ception
    + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
```

* ```Get-PSRepository``` コマンドを実行したところ、PSGalleryリポジトリが存在しないことが原因みたい。

```powershell
Get-PSRepository
警告: パッケージ ソースが見つかりません。
```

# 対応

* デフォルトのPSGalleryリポジトリを登録します。

```powershell
Register-PSRepository -Default
```

* ```Get-PSRepository``` コマンドを実行し、PSGalleryリポジトリが登録されたことを確認します。

```powershell
Get-PSRepository

Name                      InstallationPolicy   SourceLocation
----                      ------------------   --------------
PSGallery                 Untrusted            https://www.powershellgallery.com/api/v2
```

* Azモジュールをインストールします。

```powershell
Install-Module -Name Az -AllowClobbe
```
初心者Elm入門（その２：文法）

# はじめに
個人的にちょっと分かりにくかったり、忘れそうだと思った部分を書きます。
cf. [Elm Syntax](https://elm-lang.org/docs/syntax)
間違い等あったら優しく(易しく)教えてください。

# ちょっと試すのにいいところ
[Elm Repl](http://elmrepl.cuberoot.in/)

# 文法
### 文字
シングルクオート`'a'`はChar型
ダブルクオート`"abc"`はString型
`'abc'`はエラーになるけど`"a"`はString型になる。
文字の連結は`"abc" ++ "de"` (+じゃなくて++)。

### リスト
リストは`::`によって左側に要素を足すことができる。
1 :: 2 :: 3 :: 4 :: []
= 1 :: 2 :: 3 :: [4]
= 1 :: 2 :: [3, 4]
= 1 :: [2, 3, 4]
= [1, 2, 3, 4]

### レコード
record = { x = 0, y = 1, z = 2 }  

フィールドへのアクセスは
a = record.x とすると
a = 0 となる。  

{ record | x = 6 }とすると
{ x = 6, y = 1, z = 2 } となる。  
複数書き換えも可能
{ record | x = 5, y = 7 }
{ x = 5, y = 7, z = 2 } となる。  
ここでrecordを見てみると{ x = 0, y = 1, z = 2 }となっており、
元のrecordは書き換わっていなくて別のrecordが作成されるようだ。  

record2 = { record | x = 9, z = 4} とすると
recordは { x = 0, y = 1, z = 2 }
record2は { x = 9, y = 1, z = 4 }  

### case
書き方

```elm
rank = 2
case rank of
    1 -> "Gold Medal"
    2 -> "Silver Medal"
    3 -> "Bronze Medal"
    _ -> "You Lose..."
```
上から順に評価される。この場合は`rank = 2`なので`"Silber Medal"`となる。
1, 2, 3以外の場合は一番下の`"You Lose..."`になる。  

# おわりに
また何かあったら書き足します。

# 初心者Elmシリーズ
- [初心者Elm入門（その１：インストール〜Hello World!）](https://qiita.com/saiwa8951/items/befa0d1683f16a992b67)
- [初心者Elm入門（その３：Elmアーキテクチャ）](https://qiita.com/saiwa8951/items/82dc32334751bcdca213)
- [初心者Elm入門（その４：削除機能付きToDoリスト）](https://qiita.com/saiwa8951/items/41fd03bae89c30c7861c)
VueでCSVファイルをテーブル表示してみた

こちらの記事を参考にさせていただきました。
[JavaScriptでCSVファイルを2次元配列に変換](https://qiita.com/bambuu/items/1902453ca13e4d8662ee)

# サンプル
[こちら](https://kackie.github.io/vue_csvReader/)

Githubは下記です。
https://github.com/Kackie/vue_csvReader

# ソート機能について
入力フィールドをv-modelで双方向バインディングし、csvの行ごとに検索キーワードでソートをかけてから2次元配列に変換しています。

``` js
//ソート
for(var j=0;j<arr.length;j++){
    if(j===0){
        sortArr.push(arr[j]);
    }else if(arr[j].indexOf(this.keyword) !== -1) {
        sortArr.push(arr[j]);
    }
}

//1次元配列を2次元配列に変換
var res = [];
for(var i = 0; i < sortArr.length; i++){
    //空白行が出てきた時点で終了
    if(sortArr[i] == '') break;

    //","ごとに配列化
    res[i] = sortArr[i].split(',');
}
```

# まとめ
最近Vueを勉強中です。双方向バインディングやtransitionが便利で仕事でも早く試してみたいなーと思います。
初めてUdemyを使って勉強しているんですが、いいサービスですね。セールをよくやっているので色々挑戦してみようと思えますし、動画を見ながら手を動かせるのが個人的にとてもやりやすくて、楽しく学習中です。

これを作った経緯としては、もともとSlackのBotを使ってその日のランチ場所をランダムに決めるっていうのをやっていて、Vueの練習用にちょうどいいcsvファイルができたのでソート機能をいれつつ一覧表示してみようと思い作ってみました。
csvの1行目がテーブルのヘッダーになり、項目も自由に増減できるので、対応中の案件の管理なんかにも使いまわしています。

他にも新宿（3丁目、東口周辺）でオススメの飯処あったら教えてください！
Dashboard for Kubernetes のデプロイ

# Dashboard for Kubernetes のデプロイ
(2019/04時点)

## 環境
- Kubernetes
    - OS: CentOS 7.4
    - Kubernetes: v1.12
    - Docker: docker-ce-18.06.1.ce
- Dashboard
    - Dashboard: v1.10.1
    - Heapstar: 1.5.4

## 手順
###1. Dashboardのデプロイ

``` shell:sh
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
```

外部からアクセスするため、Service のTypeを [NodePort] に変更

``` shell:sh
# kubectl edit services/kubernetes-dashboard -n kube-system
---
  type: NodePort
```

https://\<master ip address\>:\<下記で取得したport\> でWebUIにアクセス可能

``` shell:sh
# kubectl get services --all-namespaces
```

WebUIにログインするためには、 [Kubeconfig] または [Token] での認証が必要となる
[Token] は、下記で取得可能

``` shell:sh
# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubernetes-dashboard-token | awk '{print $1}')
```

### 2. Heapstarのデプロイ
[Dashboard] 上で、PODのリソース使用量を表示したい場合には、 [Heapstar] が必要となる
※ PODのリソース使用量を監視するツールは、 [Heapstar] 以外にもあるが、現状 [Dashboard] では [Heapstar] のみ対応となる
※ ただし、 [Heapstar] は、deprecated となっている

``` shell:sh
# git clone https://github.com/kubernetes/heapster/
```

- 以下を修正

``` vim:heapstar/deploy/kube-config/influxdb/heapster.yaml
-- org --
- --source=kubernetes:https://kubernetes.default
-- modified --
- --source=kubernetes.summary_api:''?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true
```

``` vim:heapstar/deploy/kube-config/rbac/heapster-rbac.yaml
-- org --
name: system:heapster
-- modified --
name: heapster
```

- 以下を追加

``` vim:heapstart/deploy/kube-config/rbac/heapster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: heapster
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - deployments
  verbs:
  - get
  - list
  - update
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/stats
  verbs:
  - get
 ```

- デプロイ

``` shell:sh
# kubectl create -f ./deploy/kube-config/rbac/
clusterrolebinding.rbac.authorization.k8s.io/heapster created
clusterrole.rbac.authorization.k8s.io/heapster created
# kubectl create -f ./deploy/kube-config/influxdb/
deployment.extensions/monitoring-grafana created
service/monitoring-grafana created
serviceaccount/heapster created
deployment.extensions/heapster created
service/heapster created
deployment.extensions/monitoring-influxdb created
service/monitoring-influxdb created
```

## 参考
https://brookbach.com/2018/10/28/kubernetes1.11.3_heapster.html
solrの勉強はじめました。Lv.1

書いてあること
1. Solrについて
2. スキーマについて
3. 外部のDBとの接続について

# Solrについて
Solr = 全文検索エンジンで、Luceneをベースに作られている。

一般に検索方法は、
　1. 順次検索方式(grepやLIKEなど)
　2. 転置インデックス方式
の2通りが存在し、solrは後者。

クライアントから検索リクエストをサーチハンドラが受け取り、その中に含まれる検索式をもとにインデックスから検索し、
得られた結果をクライアントまで返す。

# スキーマについて
スキーマ = データベース構造のこと。
Solrにどのようなデータが投入でき、検索できるかを定義することができる。
**スキーマの定義によってSolrの検索挙動も大きく変わる**（らしい）
定義の方法は、Schema APIとSchema.xmlの2通りがある。
* Schema APIはmanaged-schemaディレクトリ内でjson形式で、定義する。

スキーマ定義の構成要素は

|  要素名       |  定義の省略  |SchemaAPIでの編集|
| ------------ | ---------- |----------------
|  FieldType   |  不可       |可能　　　　　　　|
|  Field       |  可能  　　　|可能　　　　　　　|
|Dynamic Field |可能　　　  　|可能　　　　　　　|
|UniqueKeyField|可能         |可能　　　　　　　|
|CopyField    |可能　　　　　　|可能　　　　　　　|
|Similarity    |可能         |可能　　　　　　　|

の6つ。

フィールドタイプにはAnalyzerをもつものともたないものがある。
Analyzarとは、任意のワードで文書を検索するためのインデックスをつくる仕組み

Analyzer = charfilter + tokenizer + filter
処理の順番は、charfilter → tokenizer → filter

tokenizerは、「トークン」を出力する。トークンは、文字列だけでなく他のトークンとの位置関係やドキュメント内でのオフセットをもつ。

#外部DBとの接続について
外部のデータソースに格納されたデータをインポートし、solrにインデックスするにはデータインポートハンドラを使う。

solrconfig.xmlで、リクエストハンドラを定義する。

```
  <requestHandler name="/dataImport" class="org.solr.handler.dataimprt.dataImportHandler">
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
  </requestHandler>
```

db-data-config.xmlで、データインポートハンドラの設定をしている。
データインポートハンドラで、RDBなどの外部のデータベースとのマッピングを行うことができる。


参考文献など
　
http://d.hatena.ne.jp/shinobu_aoki/20110819/1313773180
(ボツ) #python や #ruby で 英単語全てにマッチする #正規表現 を書く例

# コメント欄参照

---

- `\b` が単語境界

# python

```py
>>> import re
>>> re.findall(r'\b\w+\b', 'A whole new-World under_the_sea')
['A', 'whole', 'new', 'World', 'under_the_sea']
```

# ruby

```rb
[4] pry(main)> "A Whole new-world under_the_sea".scan(/\b\w+\b/)
>>> ["A", "Whole", "new", "world", "under_the_sea"]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DockerのDBにローカルのクライアントアプリから接続する方法

DBはPostgreSQLを利用する前提です。

PostgreSQLのクライアントアプリは[psequel](http://www.psequel.com/)がいいらしいです。

docker-compose.ymlのdbの設定にportsを追加します。

```diff
services:
  db:
    image: postgres:9.5
    environment:
      PGDATA: /var/lib/postgres/data/pgdata
      POSTGRES_DB: test
      TZ: "Asia/Tokyo"
    volumes:
      - ./docker/db/data-volume:/var/lib/postgres/data
      - ./docker/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
+    ports:
+      - "5432:5432"
    expose:
      - "5432"

```

ローカルからDockerのDBに接続するための設定は以下↓

```
Host: 127.0.0.1
User: postgres
Databse: test
Port: 5432
```
Windows 10 Home edition で NFSClient を使い NFS をマウントする

## 背景

* 普段は Linux 環境で NFS を使っている(NFS サーバがすでにある. NFS v3)
* Windows 10 で NFS をマウントしたいときもある
* Windows 10 Home edition では NFS client が Windows 標準機能として使えない
  * WSL で mount.nfs もだめでした.

## NFSClient

https://github.com/DeCoRawr/NFSClient

を使い NFS ボリュームにアクセスできるのを確認しました(x64).

ビルドには Visual Studio 2017 + C# が必要です. ビルドしておきます. C# なのでビルドは爆速です.

### マウントした NFS を Explorer からアクセスする.

そのままでは GUI だけからのアクセスになります.

いくつか方法はあるようですが, ここでは `NFSClient` で備わっている Dokan 経由でマウントできるようにします.
現状の NFSClient でサポートしているのは Dokan 0.7.4 です. それより新しい 1.x バージョンでは動作しませんでした(NFSClient のコードをいじればいけるかも)

Dokan 0.7.4 をインストール(必要に応じて VC 2013 dist をインストール)したのち, `NFSClient` で `Z:¥` のボタンを押すと explorer で `z:¥` にマウントされます.

![nfsclient.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/d60a1e1f-00c4-8dbf-f5ae-790de16c64bc.png)

Voala! Explorer でアクセスできるようになりました.

 
## TODO

* WSL でも見れるようにしたい
  * Windows 10 2019 夏のアップデートで WSL から Windows/WSL のファイルシステムが透過的にアクセスできるようになるのでそれで解決かも?
* サービスとして登録して Windows 起動したら自動で NFS マウントしたい
* Dokan の仕組みを極め, Dokan 1.x を使うようにしたい.
* NFS を SMB 経由でアクセスできなかな?
GAE/Python3でNDBを使用することはできない（2019年4月現在）

# 概要
> The ndb ORM library is not available for Python 3.

https://cloud.google.com/appengine/docs/standard/python3/python-differences

以下は補足説明。

# NDBとは

App EngineからDatastoreへの接続をサポートするライブラリ。

ORM風味にデータの読み書きができる。

DjangoのMIDDLEWAREに設定を追加するだけで利用可能。

**しかしこれはGAE/Python2でしか利用できない。**

# Python3での動作

SDKを読みに行ってくれず、以下のようなエラーが発生

```
No module named 'google'
No module named 'google.appengine'
```

`pip installgoogle-api-python-client` や `gcloud components install app-engine-python-extras` などしてもNG。

# 代わりに何を使えばいいのか

## 公式

Cloud Datastoreのライブラリを使えばよい。
https://cloud.google.com/datastore/docs/reference/libraries

## サードパーティ

NDBをPython3で動かすためのプロジェクト
https://github.com/googleapis/python-ndb
構造化データがよく分かる！基本からJSON-LDの書き方まで紹介

# 構造化データとは

構造化データとは、簡単にいうと「コンピュータに文章の意味を伝える」ことです。

HTMLで書かれている情報に何を表しているのか意味付けをして、検索ロボットでもその内容が理解できるようにします。

## 構造化データの具体例
例えば、以下のような文字列があるとします。

```
<div>株式会社イーツー・インフォは横浜市にあります</div>
```

私たちは、この文章を見た時に会社名は、「株式会社イーツー・インフォ」、住所は「横浜市」であることがわかります。

しかし、検索エンジンは人間ではないので、これらの文章が何を表しているのか理解できません。

そこで、HTMLのマークアップを行うことで、検索ロボットにその情報に意味を伝えることが構造化データです。


## 構造化データを使用するメリット

メリットは、リッチスニペットが検索結果に表示されるため、ユーザーの目につきやすくなり、クリックされやすくなります。

リッチスニペットとは、検索結果に表示される通常の説明文（descriptionという概要）以外のリッチな情報のことです。例えば料理の画像やレビューなどがあります。

以下がリッチスニペットの例です。

### リッチスニペットの種類

#### 画像
![スクリーンショット 2019-04-19 12.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/00536d70-c17a-1892-373c-5f6b60543380.png)

#### レビュー
![スクリーンショット 2019-04-19 12.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/66c177bf-dd9f-30ea-c961-933da45093b1.png)


## ボキャブラリーとシンタックスについて

構造化データを理解する上で重要なキーワードが「ボキャブラリー」と「シンタックス」です。

### ボキャブラリー

ボキャブラリーとはマークアップを定義する単語集のようなものです。

ボキャブラリーの代表例は[schema.org](https://schema.org/)です。

### シンタックス

シンタックスとは、文章の意味を検索エンジンに伝えるための書き方のことです。

代表的なものだと次の3つがあります。

- Microdata
- RDFa
- JSON-LD

今回はこの中でJSON-LDを取り上げて紹介します。

# JSON-LDとは

JSON-LDは、スクリプトを用いて記述します。その名前の通り、JSON形式の記述です。

## JSON-LDを利用するメリット

メリットはコードがシンプルで見やすくなることです。
MicrodataやRDFaはHTML上で各文章に直接マークアップしますが、その場合、HTMLが複雑になりやすくなります。
一方、JSON-LDはどこにでも記述ができ、コードを一箇所にまとめることができるので、コードがシンプルで見やすくなります。

## JSON-LDの書き方

JSON-LDで書くには次のような宣言文が必要です。

```
<script type="application/ld+json">
//ここに内容を書いていきます
</script>
```

JSON-LDでは「{}（波かっこ）」の中に「key : value」という形で書いていきます。そして一行書くごとに「,（カンマ）」で区切りをつけていきます。

```
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Organization"
}
</script>
```
@contextでschema.orgで書くことを宣言します。
@typeでschema.orgのどのタイプであるかを示します。Event, Book, Movie, Recipe, Organization, Personといったものがあります。


@typeのvalueで指定したタイプで利用できるプロパティを記述していきます。どんなプロパティが利用できるのかは、[schema.org](https://schema.org/)のサイトで確認できます。

以下が記述例です。

```
<script type="application/ld+json">
{
	"@context": "http://schema.org",
	"@type": "Organization",
	"name": "株式会社イーツー・インフォ",
	"telephone": "03-xxxx-xxxx",
	"email": "info@sample.co.jp"
}
</script>
```

# 構造化データをテストツールでチェックする

完了したら、[構造化テストツール](https://search.google.com/structured-data/testing-tool/u/0/?hl=ja)で確認します。
「エラーなし」「警告なし」と表示されていなければOKです。
【Unity】DOTweenでよく使うもの

##子要素ごとまとめてフェードアウト(CanvasGroup)
親オブジェクトにCanvasGroupコンポーネントを付与する
→alphaをまとめて操作できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/9783700f-b0a1-e292-fe8e-ba4e0ed58205.png)

```C#
//DOTween使用
canvasGroup.DOFade(0, 1.0f); //1.0f秒かけながら、alpha0になっていく
```

##初期Positionに戻す
```C#
//初期位置格納用
private float gameObjInitX;
private float gameObjInitY;

//最初に初期位置の取得
void Awake()
{
   gameObjInitX = gameObj.GetComponent<RectTransform>().anchoredPosition.x;
   gameObjInitY = gameObj.GetComponent<RectTransform>().anchoredPosition.y;
}

//初期位置に戻したいときに呼ぶ
private void Initialize()
{
   gameObj.GetComponent<RectTransform>().anchoredPosition = new Vector2(gameObjInitX, gameObjInitY);
}
```

##現在のwitdhに幅を加える(sizeDelta)
```C#
//幅と高さを取得
float width = rectTransform.sizeDelta.x;
float height = rectTransform.sizeDelta.y;
//今の幅+足したい幅
rectTransform.sizeDelta = new Vector2 (width + 加えたい幅, height);
```
##位置を変える(localPosition)
```C#
rectTransform.localPosition = new Vector3(1f, 0f, 0f);
```


##イージング付きで移動(DOLocalMoveX)
```c#
//指定位置まで移動したいとき
rectTransform.DOLocalMoveX(-361, 0.40f); //0.4f秒かけて-361の位置に移動する

//現在の位置から相対的に移動したいとき
rectTransform.DOLocalMoveX(-100, 0.40f).SetRelative(); //0.4秒かけて現在地からみて-100に移動する

//ちなみに3Dオブジェクトなら　DOMoveを使用する
transform.DOMove(new Vector3(, , ), 1).SetRelative();
```

##スクリプトからスクロール位置変更
```c#
//ダメなやり方
gameObj.GetComponent<ScrollBar>.value = 1.0f;

//正しいやり方
gameObj.GetComponent<ScrollRect>.verticalNormalizedPosition = 1.0f;
gameObj.GetComponent<ScrollRect>.horizontalNormalizedPosition = 1.0f;
```


##Imageの変更(sprite)
```C#
//インスペクタからアタッチ
public Image _image;
public Sprite _sprite;
//_iamgeの画像を_spriteに変更
_image.sprite = _sprite;
```
kubectlで現在のnamespaceを確認する

現在のnamespaceを確認するには、現在のcontextを確認すればよいです。
**`kubectl config get-contexts`**


## 現在のcontext、namespaceを確認する
CURRENT 欄が * となっているのが現在の context です。
NAMESPACE 欄が現在の値です。
NAMESPACE 欄が空欄は、未指定の状態です。この場合の挙動は未確認です。

```
$ kubectl config get-contexts
CURRENT   NAME                    CLUSTER                      AUTHINFO             NAMESPACE
          docker-for-desktop      docker-for-desktop-cluster   docker-for-desktop
          local                   default-cluster              default-admin
          minikube                minikube                     minikube
*         mycluster-context       mycluster                    mycluster-user       default
```

## 参考情報
[Namespaces Walkthrough](https://kubernetes.io/docs/tasks/administer-cluster/namespaces-walkthrough/)
[k8s便利コマンド Namespaceを恒久的に変更する方法](https://qiita.com/MahoTakara/items/a8b204dd183fc662926e)
[kubectlコマンドの使い方(1.4)](https://qiita.com/hana_shin/items/b7a947511a89accea6d4)
apexのdeployにnode_modulesのを含める

AWS Lambdaの管理をするのにはapexがとても便利です。

nodejsのランタイムでlambdaでの処理を書く場合、npmで入れたモジュール群も一緒にziｐしてあげたいことがあると思います。

その場合、functions.jsonに以下の用にビルド時のhookで処理を追加すると良いです。

```json:function.json
{
  "hooks": {
    "build": "cp ../../package.json ./package.json && npm install --production",
    "clean": "rm -rf node_modules && rm ./package.json"
  }
}
```


`apex deploy function-name`

ルートにpackage.jsonがある前提ですが以上のようにするとnode_modulesも一緒にzipされてdeployされます。
Vueのcomponentのテストでのあれこれ

## injectのモックしたい場合

何もしないとこんなエラーになりますね。

```
[Vue warn]: Injection "$validator" not found
```

### 解決方法
-> mountするときに、`provide` を使いましょう。
https://vue-test-utils.vuejs.org/ja/api/options.html#provide

```js

const Component = {
  inject: [ '$validator' ],
  template: '<div>{{this.foo()}}</div>'
}
const $validator = jest.fn();

const wrapper = shallowMount(Component, {
  provide: {
    $validator,
  }
})
```


## カスタムディレクティブをモックしたいとき

こんなエラーが出たとき

```
[Vue warn]: Failed to resolve directive: validate
```

### 解決方法
-> mountするときに `localvue` を使いましょう
https://vue-test-utils.vuejs.org/ja/api/options.html#localvue


```javascript

import { createLocalVue, mount } from '@vue/test-utils';

const localVue = createLocalVue();
localVue.directive('validate', () => {});

const wrapper = mount(Component, {
  localVue,
  propsData: {
    name: 'hogehoge', 
  }
});
```
カレーの、液状部分のことをなんと呼びますか？」言語調査例

「カレーの、液状部分のことをなんと呼びますか？」
に対して、Webで仕事をしている人なら、どう調査するとよいか事例記録。

# ルー
ルー
https://eow.alc.co.jp/search?q=ルー&ref=sa
>roux
Lou

alcは転載禁止。
louとrouxについて調べ中。
フランス語が得意な方のコメントを待つ。
https://translate.google.com/#view=home&op=translate&sl=en&tl=ja&text=roux
>a mixture of fat (especially butter) and flour used in making sauces.
https://translate.google.com/#view=home&op=translate&sl=en&tl=zh-TW&text=lou
>婁
https://translate.google.com/#view=home&op=translate&sl=fr&tl=zh-TW&text=roux
>紅
https://cjjc.weblio.jp/content/娄
音の宛字？
https://translate.google.com/#view=home&op=translate&sl=fr&tl=ko&text=lou
>루
https://translate.google.com/#view=home&op=translate&sl=fr&tl=ko&text=roux
>빨간

# 汁
# 液
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
vbsの作法 その22

#概要

vbsの作法調べてみた。
AM変調やってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0e389741-f9e9-9a1d-34be-5165091dc1dc.png)

#サンプルコード

```
Dim PI
PI = 3.14159265
Dim SRC(300)
Dim AM(300)
Dim I(300)
Dim Q(300)
Dim I2(300)
Dim Q2(300)
Dim O(300)
Dim csv(300)

For t = 0 to 299
	SRC(t) = Sin(t / 8000 * 2 * PI * 220) * 2 - 1
Next
For t = 0 to 299
	AM(t) = (.6 * Sin(t / 8000 * 2 * PI * 220) + 1) * Sin(t / 8000 * 2 * PI * 3000) * 2 - 1
Next
For t = 0 to 299
	I(t) = AM(t) * Cos(t / 8000 * 2 * PI * 2800)
	Q(t) = AM(t) * Sin(t / 8000 * 2 * PI * 2800)
Next
Q0 = 1
OMEGA = 2 * PI * 300 / 8000
ALPHA = Sin(OMEGA) / (2 * Q0)
A0 = 1 + ALPHA
A1 = -2 * Cos(OMEGA)
A2 = 1 - ALPHA
B0 = (1 - Cos(OMEGA)) / 2
B1 = 1 - Cos(OMEGA)
B2 = (1 - Cos(OMEGA)) / 2
IN1 = 0
IN2 = 0
OUt1 = 0
OUt2 = 0
For t = 0 to 299
	I2(t) = B0 / A0 * I(t) + B1 / A0 * IN1 + B2 / A0 * IN2 - A1 / A0 * OUt1 - A2 / A0 * OUt2
	IN2 = IN1
	IN1 = I(t)
	OUt2 = OUt1
	OUt1 = I2(t)
Next
IN1 = 0
IN2 = 0
OUt1 = 0
OUt2 = 0
For t = 0 to 299
	Q2(t) = B0 / A0 * Q(t) + B1 / A0 * IN1 + B2 / A0 * IN2 - A1 / A0 * OUt1 - A2 / A0 * OUt2
	IN2 = IN1
	IN1 = Q(t)
	OUt2 = OUt1
	OUt1 = Q2(t)
Next
For t = 0 to 299
	O(t) = SQR(I2(t) * I2(t) + Q2(t) * Q2(t)) * 4 - 6
	csv(t) = Cstr(O(t))
Next

Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
name2 = cd & "\am2.csv"
msgbox name2
With CreateObject("ADODB.Stream")
	.Type = 2
	.Charset = "Shift_JIS"
	.Open
	.writeText Join(csv, vbCrLf) & vbCrLf
	.saveToFile name2, 2
	.Close
End With

msgbox "ok"



```

以上。
AWS CDKでParameter / Refを使う

AWS CDK単体でもデプロイできますが、CloudFormationの生成にも利用できます。
そうなってくると、ParametersやRefを使いたくなりますね。

`cdk.CfnParameter`を使って定義して、`.ref`パラメタを使えば値を渡してやることができます。

## SAMのハンドラーをParameterで選べるようにした例

```typescript
import * as cdk from '@aws-cdk/cdk';
import sam = require('@aws-cdk/aws-sam')

export class CdkTestStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    const ParamHandler = new cdk.CfnParameter(this, 'handler', {
      type: 'String',
      description: 'Lambda handler',
      default: 'index.handler'
    })
    new sam.CfnFunction(
      this,
      'function',
      {
        handler: ParamHandler.ref,
        runtime: 'nodejs8.10',
        codeUri: 'src'
      }
    )
  }
}
```

## 生成されるCloudFormation

```yaml
Transform: AWS::Serverless-2016-10-31
Parameters:
  handler:
    Type: String
    Default: index.handler
    Description: Lambda handler
Resources:
  function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src
      Handler:
        Ref: handler
      Runtime: nodejs8.10
    Metadata:
      aws:cdk:path: CdkTestStack/function
```
Railsチュートリアル第14章で発生するUnfollowボタン表示問題の対処法について

　Macのローカル環境によりRailsチュートリアルを進めていると，14.2.4 [Follow] ボタン (基本編)において，Unfollowボタンの背景が灰色に表示されない問題が発生しました。

　検索結果としては，Bootstrapの仕様なのか大した問題でも無いのか，報告事例が少なく，原因も解決方法も分かりません。

　ただ，このままでは見栄えが良くないことから，次の通り対処したため，参考情報として記載します。


※追伸
　今後しばらくBootstrapのお世話になると思うので，原因が判明したら更新します。


#＜対処法＞
　Bootstrapの設定を継承した新classである[btn-secondary]を追加する。
　背景の色は「#BBBBBB」の部分を修正することで変更可能である。

```
[app/assets/stylesheets/custom.scss] 
・
・
・
/* button :[btn]の色が動作しないため追加 */
.btn-secondary {
  @include button-variant($btn-default-color,
                          #BBBBBB,
                          $btn-default-border);
}
```

```
[app/views/users/_unfollow.html.erb] 
<%= form_for(current_user.active_relationships.find_by(followed_id: @user.id),
             html: { method: :delete },
             remote: true) do |f| %>
  <%= f.submit "Unfollow", class: "btn btn-secondary" %>
<% end %>
```
#＜参考情報＞
##○ スクリーンショット
４つの画面のうち上の画面から次のClassを適用した。
　1. class: "btn"
　2. class: "btn btn-primary"
　3. class: "btn btn-default"
　4. class: "btn btn-secondary"　※上記対処法で作成
![スクリーンショット 2019-04-19 13.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/bc0d2698-0c76-2d1b-7622-6d8eeae49faa.png)

##○ 動作確認
####＜Unfollowボタンのclass設定を確認＞
・class: "btn"　※Railsチュートリアル通り
　→ボタンのレイアウトにはなる。
　→[hover]による背景の動作無し。
　→色が描画されない。

・class: "btn btn-primary"
　→Followボタンと同じ描画になる。

・class: "btn btn-default"
　→[background-color]は白のまま。
　→[hover]時は灰色になる。

・class: "btn-default"  又は class: "btn-primary"
　→[btn]よりもクリックできる範囲が小さくなる。

####＜本番環境を確認＞
・Chrome[macOS，Windows7]
・Safari[macOS]
　→全てローカル環境と同じ動作である。

####＜その他＞
・IDE(Cloud9)で作成したsample_appをクローン
・Railsチュートリアル公式サイトにある「CODE SAMPLE」をクローン
　→全て今回作成したsample_appと同じ動作である。

##○ 参考サイト
・https://teratail.com/questions/147020
・https://github.com/yasslab/sample_apps/issues/8
　→同問題の報告事例
・https://www.w3schools.com/bootstrap/bootstrap_ref_css_buttons.asp
　→動作確認通りの描画であることを確認
・https://github.com/twbs/bootstrap-sass
　→使用Gemのリポジトリ
UITextViewで特定の文字の表示範囲を取得、ハイライト

`UITextView` の中で、特定の文字が表示されている座標(CGRect)を下記メソッドで取得できます。
https://developer.apple.com/documentation/uikit/nslayoutmanager/1403255-boundingrect

```swift
func boundingRect(forGlyphRange glyphRange: NSRange, in container: NSTextContainer) -> CGRect
```

これで終わるのも何なんで、活用して「Qiita」を緑でハイライトする `UITextView` を用意してみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42826/7f8aa416-f356-0cf9-2738-1b3185017a73.gif" width="300px">

# コード

```swift
class TextView: UITextView, UITextViewDelegate {
    
    // ~~ init() など省略 ~~
    // ~~ delegate に self を ~~
    
    private func set() {
        let range = (self.text as NSString).range(of: "Qiita")
        var rect = self.layoutManager.boundingRect(forGlyphRange: range, in: self.textContainer)
        rect.origin.x += self.textContainerInset.left
        rect.origin.y += self.textContainerInset.top
        
        self.viewWithTag(300)?.removeFromSuperview()
        
        let view = UIView()
        view.backgroundColor = .green
        view.frame = rect
        view.tag = 300
        self.addSubview(view)
        self.sendSubviewToBack(view)
    }
    
    func textViewDidChange(_ textView: UITextView) {
        set()
    }
}
```

# 解説

## NSRange を取得

`Swift.Range<String.Index>` ではなく `NSRange` を取得したいので、 `NSString` にしてから操作します。

```swift
let range = (self.text as NSString).range(of: "Qiita")
```

## 文字列の座標 CGRect を取得

上記で得た `NSRange` の範囲の文字が、 `textContainer` 内のどこにあるかを取得します。

```swift
var rect = self.layoutManager.boundingRect(forGlyphRange: range, in: self.textContainer)
```

## inset 分ずらす

`UITextView` には `textContainerInset` があり、この分ずれているので、その差分を足してあげます。

```swift
rect.origin.x += self.textContainerInset.left
rect.origin.y += self.textContainerInset.top
```

## ハイライト UIView の追加

`UIView` のインスタンスを生成して載っけてますが、この処理は(上記コード内だと)文字を入力するたびに実行されるため、不要になった View も含めどんどん subView が増えていく形になります。
なので下記コードで以前に addSubview した UIView を消しておきます。

```swift
self.viewWithTag(300)?.removeFromSuperview()
```

## その他

適当にちゃちゃっと書いたコードなので、色々工夫してみてください。

- 上記コードで言う `set()` を呼ぶタイミング
- 複数回「Qiita」の文字列が入力されても1つ目しかハイライトされない



# 環境
- Swift: 5
初心者Elm入門（その１：インストール〜Hello World!）

# はじめに  
Python歴１年の人がElmに入門する様子を記す。
情報系の知識はほとんどないため初心者friendlyな記事になる予定。
間違い等あったら優しく教えてください！

# 参考
基礎からわかるElm (ISBN: 9784863542228)
[An Introduction to Elm](https://guide.elm-lang.org/)

# 環境  
MacOS Mojave 10.14.4
エディタ: VSCode

# インストールとエディタの設定
- [公式](https://elm-lang.org/)からインストーラーをダウンロードして来てインストールした。
- VSCodeの左端のExtensionsというアイコンを押す→elmで検索→elmというプラグインがあるのでそれをインストール
- terminalに`npm install -g elm-format`と打って実行
- VSCodeのCode(Macだと画面左上のリンゴマークの隣にある)→Preference→Settings→VSCodeのウィンドウ右上の`{}`マークを押す→  


"[elm]":{
        "editor.formatOnSave": true
    }
と書く。

わたしの場合はこう↓なりました。  

    {
        "python.pythonPath": "pythonのパス",
        "[elm]": {
            "editor.formatOnSave": true
        }
    }

# Hello World!
- 適当な場所に適当な名前のディレクトリを作る（今回はホームディレクトリにelm_beginnerという名前のディレクトリを作った）。
- elm_beginnerに移動する。
- `elm init`を実行すると必要なファイル等が作成される。途中でyes/no聞かれるので元気よく`y`を押そう！
- srcディレクトリが出来ているのでsrc内に、hello.elmを作成する。

```elm:hello.elm
module Main exposing (main)

import Html exposing (text)


main =
    text "Hello, World!"
```

- `elm make src/hello.elm`でコンパイル。
- index.htmlというファイルが出来ている。
- ブラウザで開いてみると「Hello World!」出来ている。
- （ページのソースを検証したらなんかいっぱい書いてある。よく分からないけどHello World!の文字が確認できる。）

# 今回の学び
作業用ディレクトリ新しく作ったときに`elm init`するの忘れそうだから忘れないように気をつけよう！

# 初心者Elmシリーズ
- [初心者Elm入門（その２：文法）](https://qiita.com/saiwa8951/items/cf0067447c1189af1175)
- [初心者Elm入門（その３：Elmアーキテクチャ）](https://qiita.com/saiwa8951/items/82dc32334751bcdca213)
- [初心者Elm入門（その４：削除機能付きToDoリスト）](https://qiita.com/saiwa8951/items/41fd03bae89c30c7861c)