OmniAICreator/Qiita-1.07M huggingface dataset:
【Houdini】選択されたフェイスの外周ポイントのみを取得する

またまたノードではなく vex でやってみようメモシリーズです。
フェイスの選択範囲から外周のポイントを抽出してます。

## 下準備

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/17890acc-64ac-eea7-a561-239a8d354fd7.png)

このように用意したグリッドから `group1` を作成します。説明でわかりやすいように 選択個所は color SOP で色を付けてあります。

## 実処理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/4647986c-586f-46a4-0e6b-9a0bb191b5fa.png)
まず Primitive wrangle SOP を作成し、プリミティブ（フェイス）のグループをポイントのグループに変換します。赤い文字でポイント番号が表示されているのが新たに作られた `around` グループです。まだ、外周だけの状態になってはいません。

```c
if(inprimgroup(0, "group1", @primnum)){
    int points[] = primpoints(0, @primnum);
    foreach(int pt;points) {
        setpointgroup(0, "around", pt, 1);
    }
}
```

プリミティブがグループに含まれているかの判定に `inprimgroup` 関数を使っていますが、ノードの `Group` パラメータ欄に入力した方が簡単です。ここではあえて vex の処理としています。グループの指定も `@group_around` のようなアトリビュート方式はとらず、`setpointgroup` 関数をあえて使っています。これは、それぞれが外部パラメータとして入ってくることをみこしたコード例とするためです。（ハードコードを避けやすくしている。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/40fecd95-cdf7-8003-dfee-8cf22e0cfca5.png)
さらに Point Wrangle SOP を繋ぎ、外周だけを抽出しました。

```c
if(inpointgroup(0, "around", @ptnum)) {
    int prims[] = pointprims(0, @ptnum);
    int same_group_cnt = 0;
    int numprim = len(prims);
    foreach(int prim;prims) {
        if(inprimgroup(0,"group1", prim)) {
            same_group_cnt++;
        }
    }
    if(same_group_cnt > 2 && same_group_cnt == numprim) {
        setpointgroup(0, "around", @ptnum, 0);
    }
}
```
ロジックとしては、まずグループ化された各ポイントに関連している複数フェイス（この例の場合１ポイントに最大４つ）を  `pointprims` 関数で抜き出し 、そのうち元の group1 に属している数をカウント ( `same_group_cnt` ) します。全てのフェイスが group1  に属している場合は選択範囲の内側の点であると判断して `around` グループ方取り除きます。ただし関連フェイス数が１の場合は全体の角のポイント、２の場合は全体の外周のポイントなのでそのまま残しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/8fcc7d48-8810-9eb0-a40b-e6bb6d0f4d20.png)
上記ロジックで複雑な選択状態や、三角ポリゴンを交えて試しましたが処理はうまくいっているようです。（５角形以上のいわゆるｎゴンは利用する予定がないため確認していません。）

## まとめ
なるべく１つの wrangle ノードで対応したかったのですが、２つに分けた方が楽だったのでそうしました。detail あたりで処理を回せばできなくはない気もしますが、SIMDで並列処理させたいのと Compile SOP で囲むこともできたのでこれでいいかなと思います。あと同じことができる SOPノードを探したのですが見つかりませんでした。ご存じの方おれば教えてください。グループノード系の設定次第で軽くできちゃいそうな予感もします。
pythonのzip関数について

#はじめに
普段pythonを使っていて個人的に馴染みがなかったzip関数について知ったことをメモ

#zip関数の挙動
ばらけた要素をまとめたり，別々のリストを同時にループさせたりする時に便利

```python
data_num = [1,2,3,4,5]
data_ch = ["a","b","c","d","e","f"]
for num,ch in zip(data_num,data_chr):
    print(num,ch)
>>> 1 a
    2 b
    3 c
    4 d
    5 e
```

このように別々の変数を同時に回せる．リストの長さが異なる場合は短い方のリストの中身が尽きれば終了する．

#zip関数と逆の挙動
この通常のzip関数の挙動と逆の挙動をやりたいときはどうするのか
例えば

```python
>>> data = [[1,"a"],[2,"b"],[3,"c"],[4,"d"]]
>>> nums,chs = zip(*data)
>>> nums # [1,2,3,4]
>>> chs  # ["a","b","c","d"]
```
とすることで実現できる．
これを用いると行列の回転がすごい楽である
~~まあnumpy使えやって話ですが~~

#行列の回転
以上のことを踏まえて行列を時計回りに90度回転させてみる

```python
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
turned_matrix = zip(*matrix[::-1]) #[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
```
一行でpythonのリストでも行列の回転ができてしまった．(すごい)
Desert safari tours

Dubai desert safari from the surrounding sandy desert is a thrilling and enjoyable experience. ... The desert safari supplies approximately 20 minutes of thrilling dune bashing along with orgasmic camp travel where you are able to enjoy quad biking, horseback holiday and sand skiing. Morning safari can differ based on your package excursion.

Contact:
 Damascus street  Al Qusais plaza office no 215 A
P o box  182956
http://www.desertsafaritour.ae/
 +971502348228
![2014_clutch_5_base.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460539/227e80d5-d37f-150b-433b-de685d3715c4.jpeg)
السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر

السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر

<H3>الذهاب لايف::>> http://tiny.cc/Wimbledon-2019-Semi-Final


<H3>الذهاب لايف::>> http://tiny.cc/Wimbledon-2019-Semi-Final

السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر
السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر
السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر
السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر
السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر
السويسري روجيه فيدرر مقابل رافائيل نادال نصف النهائي 2019 بث مباشر
resizemintpatch.silvrback.com/resize-mint-patch

Remove the package from the patch and stick it on your body especially in the position that you want to be reduced or body fat burned and press it into place.

It may be on the belly, underarms, thighs, etc. the area is dependent on you as an individual.

Leave it for a few minutes to ensure that it well attached to your body.

Then leave for around 6 to 8 hours before removing it carefully.

The Resize Mint Patch works by infusing specific ingredients into the body through the skin that aid in the burning of fat.

This is because the ingredients are quite powerful as they are combined into a single product.

Resize Mint Patch is quite effective and convenient for use in any condition or environment.This is because it worn next to your skin and therefore can be concealed; lose your body fat as you continue with your daily activities.

https://resizemintpatch.silvrback.com/resize-mint-patch
三層架構與 Embedded Framework 分層的切入點

三層架構 (3-tier architecture) 是軟體工程中裡面很常見的分層方式，或者也可以說是最基本的架構方式之一。

在想要透過 Embedded Framework 來分割程式碼時，
由於常見的 Clean Architecture, Redux 等架構的層次和元素非常多、非常難著手，
因此三層架構的概念或許是還滿好的切入點。

## 碰到的問題

碰到以下這一類的問題，就需要透過調整架構改善程式碼的品質

- 不容易分開各個部分的邏輯，商用邏輯會混雜在各個 view 或是 view controller 裡
- 當專案規模需要擴張時，會因為不洽當的相依而導致分層或模組化的成本非常高
- 新增功能或是移除功能時消耗的成本高
- 因為有不當的相依而無法寫出合理的測試

## 三層架構是什麼

如其名，主要分三大部分：

| 層 | 說明 |
|:---:|---|
| **Presentation Tier**<br>表現層 | 提供使用者操作介面，用來顯示資料，以及接收使用者的互動或是輸入的資料，進而將這些資訊傳到商業邏輯層 |
| **Business Logic Tier**<br>商業邏輯層 | 處理由表現層傳來的資料或是事件，以及從資料存取層獲取的資料。也可以說是表現層和資料存取層的中介層 |
| **Data Tier**<br>資料存取層 | 根據商業邏輯層的需求，存取資料庫，或是外部資料 |

## 對應到 iOS 的專案

| 層 | 對應 |
|:---:|---|
| **Presentation Tier**<br>表現層 | View ， view controller 的部分職責|
| **Business Logic Tier**<br>商業邏輯層 | View controller 的部分職責， 和一些 formatter、validator 等等 |
| **Data Tier**<br>資料存取層 | 介接本地資料庫 Core Data, Realm 和介接 API 的部分 |

### 架構的概念

畫成架構圖，概念上就如下圖

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41979/ad548f31-e8f7-fa6b-2cec-ebc785b57eca.png)

## 範例程式碼

有空的話，再以另外的文章配上程式碼說明 :smile: 

以上， Happy coding!!
Watch Mike Wallace Is Here 2019 Free Movie HD 

Watch Now : http://bit.do/eZBCT

‘Mike Wallace Is Here’ Review: A Shrewd Documentary About TV’s Most Feared Journalist — Sundance

A sharp, propulsive portrait of the hostile, dignified newsman who may have transformed television news into a weapon of mass destruction.

Mike Wallace, perhaps the most feared and influential TV journalist (or “personality”) of the 20th century, lived his entire life in some kind of shame. It started with the acne that he had as a child, and assumed a new form when he entered the brave new world of television as an adult in 1949. Back then, when the medium was still just a public experiment, Wallace seemed happy enough to host game shows and star in the awkwardly sincere commercials that once dominated the airwaves; he even did a little bit of acting (under a pseudonym) on a police drama that invited viewers to call in and guess the identity of the killer. The truth, however, was that Wallace needed to be taken seriously — he needed the validation that he never felt he deserved — and that longing followed him for all of his days as only self-doubt can.

It started as a whisper in his ear, and grew into a roar as he became more respected. By the time his disquiet had bloomed into clinical depression, Wallace was already a household name. His suicide attempt came several decades into his gig as the lead reporter on CBS’ prestigious “60 Minutes,” but, as the late newsman is heard admitting towards the end of Israeli filmmaker Avi Belkin’s propulsive and brilliantly assembled new documentary: “When you’re obsessed with what a fourth-rate individual you are, you contemplate anything to get out of it.”

https://www.pinterest.com/MoviesNowPlaying/
https://www.instagram.com/blray_com/
https://twitter.com/Blray_com
Firebase Admin SDKを使ったサイレントPush通知

# はじめに
iosでは、画面にPUSH通知表示させず、PUSH通知を受信した時に30秒間だけ処理を実行できるサイレント通知(バックグランド通知)があります。ここでは、Firebase Admin SDKを使ってサイレント通知の送信方法を書きます。

# サイレント通知とは
iosでは、[バックグランド通知](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app)(サイレント通知と呼ばれることもある)を利用することで、30秒間だけアプリの処理を実行することができます。
具体的には、以下の`content-available'を指定しているPUSH通知を受信した時に、アプリが起動されます。PUSH通知を受信した時に、アプリは、AppDelegate.swiftのメソッドである[application(_:didReceiveRemoteNotification:fetchCompletionHandler:)](
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application)が呼ばれます。

```
{
   "aps" : {
      "content-available" : 1
   },
}
```



# サイレント通知送信の実装
以下のコードは、サイレント通知の送信コードです。`content_available = True`の部分が、サイレント通知に必要な部分です。他の部分は、Firebase Admin SDKを使ったPUSH通知の基本的な方法は、別の[記事](https://qiita.com/KenNagami/items/f9316b040aed0a5abc22)で書いていますのでそちらを参照ください。

- `YOUR_REGISTRATION_TOKEN`でしていしたスマホへPush通知を送信します。
- path/to/serviceAccountKey.jsonは、ダウンロードした秘密鍵のファイルを指定します。

``` python
import firebase_admin
from firebase_admin import credentials
from firebase_admin import messaging

cred = credentials.Certificate("path/to/serviceAccountKey.json")
firebase_admin.initialize_app(cred)

# This registration token comes from the client FCM SDKs.
registration_token = 'YOUR_REGISTRATION_TOKEN'

# See documentation on defining a message payload.
notification = messaging.Notification(
    title = 'test server',
    body = 'test server message',
)
token = registration_token

apns = messaging.APNSConfig(
   payload = messaging.APNSPayload(
       aps = messaging.Aps( content_available = True ) #　ここがバックグランド通知に必要な部分
   )
)

message = messaging.Message(
    notification=notification,
    apns=apns,
    token=token,
)

# Send a message to the device corresponding to the provided
# registration token.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
```


# 参考文献
- [Firebase Messagingリファレンスマニュアル](https://firebase.google.com/docs/reference/admin/python/firebase_admin.messaging)
- [バックグランド通知(Apple資料)](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app)
- [application(_:didReceiveRemoteNotification:fetchCompletionHandler:)](
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application)
配列の中にあるオブジェクトの値をキーにして新しいオブジェクトを作る

あるAPIを叩いてデータを取得した時に、このような構造の配列が返ってくる事って多いと思います。

```javascript
[
  {id: 1, name: 'hoge'},
  {id: 2, name: 'fuga'},
  {id: 3, name: 'piyo'}
]
```

この構造のままデータを扱うのは結構大変なので、下のようなオブジェクトのidの値をキーにした新しいオブジェクトを作りたい事ってよくありませんか？

```javascript
{
  1: {id: 1, name: 'hoge'},
  2: {id: 2, name: 'fuga'},
  3: {id: 3, name: 'piyo'}
}
```

という訳で、配列の中にあるオブジェクトの値をキーにして新しいオブジェクトを作る

## ES2018 / オブジェクトのスプレッド構文を使う

```javascript
const array = [
  {id: 1, name: 'hoge'},
  {id: 2, name: 'fuga'},
  {id: 3, name: 'piyo'}
];

const result = array.reduce((accumulator, currentValue) => {
  return {...accumulator, [currentValue.id]: currentValue}
},{})

console.log(result) 

// 結果↓
//
// {
//   1: {id: 1, name: "hoge"}
//   2: {id: 2, name: "fuga"}
//   3: {id: 3, name: "piyo"}
// }
```

## lodash / `_.mapKeys()` を使う

```javascript
const array = [
  {id: 1, name: 'hoge'},
  {id: 2, name: 'fuga'},
  {id: 3, name: 'piyo'}
];

const result = _.mapKeys(array, (data) => data.id)

console.log(result)

// 結果↓
//
// {
//   1: {id: 1, name: "hoge"}
//   2: {id: 2, name: "fuga"}
//   3: {id: 3, name: "piyo"}
// }
```

## まとめ

個人的には、lodash の`_.mapKeys()`を使う方がコードがスッキリして好きです。
Watch Mike Wallace Is Here Full Movie Online (2019)

Watch Now : http://bit.do/eZBBV
 
Magnolia Pictures | Release Date: July 26, 2019
	
Starring: Mike Wallace
Summary: Mike Wallace Is Here offers an unflinching look at the legendary reporter, who interrogated the 20th century’s biggest figures in his over fifty years on air, and his aggressive reporting style and showmanship that redefined what America came to expect from broadcasters. Unearthing decades of never-before-seen footage from the 60 Minutes vault, the film explores what drove and plagued Wallace, whose storied career was entwined with the evolution of journalism itself. [Magnolia Pictures] Collapse
Director: Avi Belkin
Genre(s): Documentary
Rating: PG-13
Runtime: 94 min
See All Details and Credits 

WatchMike Wallace Is Here In HD Quality

WatchMike Wallace Is Here HD - 720p 1510 Kb/s WATCH

WatchMike Wallace Is Here HD - 1080p 528 Kb/s WATCH

High-Speed External Downloads

DownloadMike Wallace Is Here - 480p 2524 Kb/s DOWNLOAD
DownloadMike Wallace Is Here HD - 720p 1614 Kb/s DOWNLOAD
HOT! DownloadMike Wallace Is Here HD - 1080p 1737 Kb/s DOWNLOAD

Catch us on Twitter:DewiMike Wallace Is Herendalawan5 Watch Movies Leaked Before Release OnlineMike Wallace Is HereMike Wallace Is Here Fan TheoriesMike Wallace Is Here TheoriesMike Wallace Is Here trailerMike Wallace Is Here trailer release date Avengers DurationMike Wallace Is HereMike Wallace Is Here RuntimeMike Wallace Is Here TeaserMike Wallace Is Here trailerMike Wallace Is Here Trailer ReactionMike Wallace Is Here Trailer Review Avengers Infinity Gauntlet Avengers Infinity War Avengers Infinity War Collection Avengers Time travel black widow captain america Facts filmibeat-hindi Films Infinity Gauntlet Mike Wallace Is Herervel Comics movies Thanos Infinity Gauntlet tv What Culture Címkefelho

https://www.pinterest.com/MoviesNowPlaying/
https://www.instagram.com/blray_com/
https://twitter.com/Blray_com
http://www.ketodietwalmart.com/ketogenasis/

Ketogenasis in case you've these days given beginning, you aren't any doubt elated. If you could watch your favorite television shows even as following the abs ordinary, you could achieve this. If you're like me there are some foods which are simply so delicious I cannot consider in no way having them again.Your body will thanks and praise you on every occasion you do a cleanse. select to eat diets foods which have lesser fat and energy.In nutshell, by ardently following those three easy steps, you may convert your associate advertising software into a 6 parent earnings business possibility. nothing is more motivating than a few short fat weight loss to get you on the right music to making a permanent life-style alternate and That way, you may be capable of establish which weight-loss plan plans are fads and that are providing false hopes to individuals who desires to shed pounds.The most excellent approach in the course of Your Are The proprietor Of weight-lossweight weightweight loss
http://www.ketodietwalmart.com/ketogenasis/
JavaScriptで平仮名と片仮名判定

# 平仮名を片仮名に変換

```javascript
const hiraganaToKatakana = (str) => {
  return str.replace(/[\u3041-\u3096]/g, (match) => {
    const chr = match.charCodeAt(0) + 0x60;
    return String.fromCharCode(chr);
  });
};
```

# 平仮名のみか判定
```javascript
const isHiragana = (str) => {
  const regexp = /^[\u{3000}-\u{301C}\u{3041}-\u{3093}\u{309B}-\u{309E}]+$/mu;
  return regexp.test(str);
};
```

# 片仮名のみか判定
```javascript

const isKatakana = (str) => {
  const regexp = /^[\u{3000}-\u{301C}\u{30A1}-\u{30F6}\u{30FB}-\u{30FE}]+$/mu;
  return regexp.test(str);
};
```
ズンとドコをランダムに表示してズンズンズンズンドコだったらき！よ！し！と表示する関数作ってみた

Twitterで今朝、こんな投稿を見つけた

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; ❂てくも❂ 🔥 (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160?ref_src=twsrc%5Etfw">2016年3月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

発想が天才でしかない…

投稿者の方はJavaで書いたみたいだけど、僕はpythonで書いてみることにした。


コード全文

```kiyoshi.py
import random
import time

kakegoe = []
print('きよしのズンドコ節')
for i in range(0,5):
    first_kakegoe = random.choice(['ズン','ドコ'])
    print(first_kakegoe)
    kakegoe.append(first_kakegoe)
    time.sleep(0.5)

while kakegoe != ['ズン','ズン','ズン','ズン','ドコ']:
    del kakegoe[0]
    neo_kakegoe = random.choice(['ズン','ドコ'])
    print(neo_kakegoe)
    kakegoe.append(neo_kakegoe)
    time.sleep(0.5)

print('き！よ！し！')
```

特に難しいものは使っていない。
sleepを使っているのは、最初sleepなしで、早く出てしまい、わくわく感やズンドコ言う時間がなく、あまり楽しめなかったから。

```
kakegoe = []
print('きよしのズンドコ節')
for i in range(0,5):
    first_kakegoe = random.choice(['ズン','ドコ'])
    print(first_kakegoe)
    kakegoe.append(first_kakegoe)
    time.sleep(0.5)
```

まず、ズンドコ節を宣言。
ランダムでズンとドコを生成する。
最新の５個を確かめるので、リストに入れて確認する。
最初の五個を生成するのみ。

```
while kakegoe != ['ズン','ズン','ズン','ズン','ドコ']:
    del kakegoe[0]
    neo_kakegoe = random.choice(['ズン','ドコ'])
    print(neo_kakegoe)
    kakegoe.append(neo_kakegoe)
    time.sleep(0.5)

print('き！よ！し！')
```

ここからが本番。リストを確認し、ズンズンズンズンドコじゃなかったら、リストの一番古い奴を捨てる。
で、新しくランダムでズンorドコを生成。リストに追加し、確かめ…

以下繰り返し…）
ずっと続ける。

ズンズンズンズンドコになったら、き！よ！し！と叫ぶ!!!
わりに使うWindowsコマンド逆引き

Windows10で動作確認済み。
随時更新予定。

## フォルダ 、サブフォルダ内の全ファイル名をフルパスで出力

    dir /b /s /a-d {ディレクトリ}

## フォルダ、ファイルを図式で表示

    tree {ディレクトリ}

## ファイルを削除する

    del (option) {ファイル・ディレクトリ}

## フォルダを削除する

    rmdir (option) {ディレクトリ}

### 使用例

Directoryとその配下を全削除

```
rmdir /s Directory 
```

## コマンドプロンプトの画面をクリア

    cls

## ディレクトリとファイル、階層ごとコピー

    xcopy {source} {taget}
ncatとUNIXドメインソケットで1:Nのプロセス間通信（ストリームのマージ）を行う

https://qiita.com/miminashi/items/f0dd914f3ec515e94927 というのを作ってみたけど、もっと単純にncatでできそうな気がしたので試してみた。

# そもそも何がやりたいか

例えばシリアルポートが2つあったとして、これらの入力をマージしたい。
あるいは複数のプロセスの出力をマージして、ひとつのシリアルポートに出力したい。
ちょうど、`tee file1 file2 ...`と逆のことをやりたい感じ。

# ncとncatの違い

ncとncatって何が違うのか知らなかったんだけど、オリジナルのほうがnc、nmapに付属してるのがncatとのことです。
http://www.intellilink.co.jp/article/column/security-net01.html

今回使うのは`ncat`のほうで、`nc`では複数のコネクションを扱うことができなかった。


# ncatで複数のプロセスの出力をマージしてみる


- `-l` 接続を待ち受ける
- `-k` 複数の接続を許可する
- `-U` UNIXドメインソケットを使用する


**1:Nの1の側**

```sh
ncat -k -U -l /tmp/sock
```

**1:NのNの側**

変数`n`の値を増やしながら、必要なだけ起動する（とりあえず2個）

```sh
n=1; while :; do printf '%s %s\n' "${n}" "$(date)"; sleep 1; done | ncat -U /tmp/sock
```

**結果**

```shell-session
$ ncat -k -U -l /tmp/sock
1 2019年 7月13日 土曜日 00時16分13秒 JST
1 2019年 7月13日 土曜日 00時16分14秒 JST
1 2019年 7月13日 土曜日 00時16分15秒 JST
1 2019年 7月13日 土曜日 00時16分16秒 JST
1 2019年 7月13日 土曜日 00時16分17秒 JST
2 2019年 7月13日 土曜日 00時16分17秒 JST
1 2019年 7月13日 土曜日 00時16分18秒 JST
2 2019年 7月13日 土曜日 00時16分18秒 JST
1 2019年 7月13日 土曜日 00時16分19秒 JST
2 2019年 7月13日 土曜日 00時16分20秒 JST
1 2019年 7月13日 土曜日 00時16分20秒 JST
2 2019年 7月13日 土曜日 00時16分21秒 JST
```


できたできた。
これでいいじゃん。
curlでGraphQLの長いqueryを投げる

## これはなに
curlでGraphQLの長めのqueryコマンドを投げて結果を得るスクリプト

## コマンド

GITHUB_TOKENは[ここ](https://github.com/settings/tokens)から用意してね

ためしにGitHubから `JakeWharton` のリポジトリを取得してみる。

```bash:query.sh
script='query User {
  user(login:\"JakeWharton\") {
    name
    repositories(privacy:PUBLIC,affiliations:OWNER,first:10) {
      edges {
        node {
          name
          description
          createdAt
        }
      }
    }
  }
}'
script="$(echo $script)" #改行を消して1行にする、改行あるとJSON parsingエラーが返ってくる

curl -H "Authorization: bearer GITHUB_TOKEN" \
    -H 'Content-Type: application/json' \
    -X POST -d "{ \"query\": \"$script\"}" https://api.github.com/graphql \
    | jq .
```
レスポンスをjqで整形して見やすくしている

## レスポンス

超長いの途中で省略、こんな形で取得できる

```json
{
  "data": {
    "user": {
      "name": "Jake Wharton",
      "repositories": {
        "edges": [
          {
            "node": {
              "name": "SMSMorse",
              "description": "An Android service that vibrates incoming SMS messages in Morse code.",
              "createdAt": "2009-03-27T03:26:46Z"
            }
          },
          {
            "node": {
              "name": "mkvdts2ac3",
              "description": "Bash script to convert DTS audio to AC3 within a matroska file.",
              "createdAt": "2009-03-27T03:35:57Z"
            }
          },
...
```

普通ならGraphQL対応のクライアントツールでqueryをなげるものだが、シェルスクリプトの場合はこんな形で使用できる。
Royal Man Technologies

## [ROYAL MAN TECHNOLOGIES] ( http://royalmantech.com ): WEBSITE, MOBILE APP DEVELOPMENT, DIGITAL MARKETING COMPANY##
Royal Man Technologies is the Leading Edge IT service provider. ***Royal Man delivers Mobile App Development, Website Development, Digital Marketing services*** of any complexity to clients Worldwide. Our [ exquisite service ] (http://royalmantech.com/services.html) suite includes much more than Standard Mobility and Web Apps Services, we provide a wonderful blend of IT Solutions that covers Customized and Enterprise Solutions. Royal Man Tech is focused on providing high-quality service and customer satisfaction – we will do everything we can to meet your expectations. With a variety of offerings to choose from, we’re sure you’ll be happy working with us. We hope you can find everything you need.

***Our Mission – Ideas Of Future***
Our Mission is to Turn Your Ideas Into Businesses. Whatever the idea it is, our experts will always be with you to turn your idea into futuristic business setup. Whether it is a Web Application based like website development, website design, e-commerce or Mobile Application based like iPhone App Development or Android App Development or any other custom software development of any complexity. Expertise team of Royal Man Technologies is always ready for new and challenging tasks. We follow the number of steps to get the best from scratch.

###Email us:- royalmantechnologies@gmail.com
### [Contact Us:-][royalmantech.com](http://royalmantech.com)
 we normally reply within 1-2 business hours. Talk soon!
最長増加部分文字列(longest increasing subsequence)をpythonで


# longest increasing subsequence

最長増加部分列とは、与えられた数列 S 

$S = a_1, a_2 , , , a_n $

の増加部分列　（ すべての$i$, $j$ ($i$ < $j$)について $a_i$ < $a_j$ を満たす部分列 ）
の中で長さが最大のものをいいます。

以下、最長増加部分列の長さを求めるプログラムです。

```python
from bisect import bisect_left


def lis(li):
    lis_li = [li[0]]
    for i in li:
        if i > lis_li[-1]:
            lis_li.append(i)
        else:
            lis_li[bisect_left(lis_li, i)] = i
    return lis_li
```
امير خان و بيلي ديب حي

ٔمير-خان-يستعد-جدة-لنزال-الأسترالي...
قبل 3 أيام - يستعد الملاكم البريطاني أمير خان في مدينة جدة السعودية قبل نزاله مع الأسترالي بيلي ديب على لقب دوري الملاكمة العالمي.
المفقودة: حي

LiVE Link==>> http://skylivestreaming.com/boxlive/
----

LiVE Link==>> http://skylivestreaming.com/boxlive/
----
XcodeでOpenCVを使用する


※Homebrewで必要ライブラリを入れている前提で書きます。
メモがてらmacのXcodeでOpenCV使えるように書きます。
#Xcodeの設定
Xcodeを起動し，MacOSを選択し，Command Line Toolを選択する。
①メニューからBuild Settingを選択
②Allをクリックして全部の設定を表示
③Header Search Pathsを見つける
④Header Search Paths右側の空白にてダブルクリック
⑤+ボタンを押してパス入力画面へ
⑥/usr/local/Cellar/opencv/のパスを追加
⑦recursiveへと変更

##ライブラリの追加

finderで，ライブラリのある場所に移動。
/usr/local/Cellar/opencv/VERISON NUMBER/lib
ライブラリ（.dylib）を全て追加。
その後、
①メニューからBuild Phasesを選択
②Link Binary With Librariesを選び，先ほど選択した.dylibをドラッグアンドドロップで追加
##サンプルコード例

```main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;

int main(){
    cv::Mat imMat(256,256, CV_8UC3);

    for(int y = 0 ; y < imMat.rows; y++){
        for(int x = 0 ; x < imMat.cols; x++){
            cv::Vec3b &p = imMat.at<cv::Vec3b>( y, x );
            p[ 0 ] = x;   p[ 1 ] = y;   p[ 2 ] = (int)((x+y)/2);
        }
    }
    imshow("openCVTest",imMat);
    waitKey(0);
    return 0;
}
```
以下の画像が表示されればOKです！！
<img width="256" alt="opencv_test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460462/7762d79a-27b8-72a5-d916-96b83bf8a683.png">
hieのインストールに苦労した（Windows10)

# 概要
すごいH本をずっとやれていなかったので、パソコンも買い替えたことだしhaskellの環境を構築しようと思いました。stackをつかってhie-8.6.5をインストールしようとしたけど思ったより苦労しました。

当方の環境は、
OS：Windows10, stack 2.1.1(Chocolatey), Hie-8.6.5

作業はpower shellを使って行いました。

# Stackのインストール
Chocolateyでインストールしました。パスを通すのも自動でやってくれました。

# hieのインストール
公式？にあるようにgitでダウンロードしました。

```powershell
git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
```


（補足）Windowsの場合の注意点としてファイルパスが長くならないように（or長くなってもいいように）したほうがいいとのことだったので、念のため、haskell-ide-engineのディレクトリはC:\hieに変更しておきました。公式も(optional)としているのでやってなくても大丈夫かもしれません。

C:\hieに移って、

```powershell
stack .\install.hs help
```

とし、hie-8.6.5が利用可能なことを確認し、

```powershell
stack .\install.hs hie-8.6.5
```
としてインストールしようとしました。が、ここでうまくいきませんでした。

#hieのインストールでエラー
処理が進行していっても途中で、invalid characterと言われてしまい、インストールを完了できませんでした。

hieのインストールでこのようなエラーに出会われてる方があまりいらっしゃらないようで、解決に苦労しました。ですが、このエラーはhaskellでよくあるようで、こちらを参考にしました。https://haskell.jp/blog/posts/2017/windows-gotchas.html

# 解決策
インストールを始める前に

```powershell:
chcp 65001
```

として文字コードを変更しました。

つまり、インストールの流れをまとめると、

```powershell
chcp 65001
stack .\install.hs help
stack .\install.hs hie-8.6.5
```

とすることで無事インストールできました。

同じようなエラーに苦しむ人のためになれば幸いです。
herokuデプロイでエラー   Could not detect rake tasks

###エラーが起きました。

とりあえずherokuにデプロイ
ターミナル

```
$ heroku login --interactive
$ heroku keys:add
$ heroku create
$ git push heroku master　　←ここでエラー発生
```

エラーが発生してハマりました。

```
remote:  !     Could not detect rake tasks
remote:  !     ensure you can run `$ bundle exec rake -P` against your app
remote:  !     and using the production group of your Gemfile.
remote:  !     Activating bundler (2.0.1) failed:
remote:  !     Could not find 'bundler' (2.0.1) required by your /tmp/build_fd30c4777777788888990ad7e4/Gemfile.lock.
remote:  !     To update to the latest version installed on your system, run `bundle update --bundler`.
remote:  !     To install the missing version, run `gem install bundler:2.0.1`
remote:  !     Checked in 'GEM_PATH=vendor/bundle/ruby/2.5.0', execute `gem env` for more information
remote:  !     
remote:  !     To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
```

この怒りの文章ｗ


###こちらを参考にしました。

こちらの記事を参考にしました。


https://qiita.com/amuyikam/items/989300248f471020ca18

###対処法


rubyとbundlerのバージョンを上げる

```
$ brew update && brew upgrade ruby-build
$ rbenv install 2.6.3
$ rbenv local 2.6.3
$ gem install bundler -v 2.0.2
$ rm Gemfile.lock
$ bundle install　　　　　　gemfileのrubyの記述を2.6.3に変更しないとエラーになる。

```
githubでコミット、プッシュしてから


```
$ git push heroku
```

で無事デプロイ完了できました。

気をつけます。
Meldを使ってみる(windows7のバッチファイルを使って、比較ファイル名を固定する)

(参考)Meldを使ってみる
https://qiita.com/Kashiwara/items/8e4c9293b34ff9931951

###環境
Windows7
Meld 3.20.0

###Meldのインストール
なぜか、インストール直後の実行で、エラーがでた。
「
Meld.exe - ディスクがありません
ドライブにディスクがありません。 ディスクをドライブ D: に挿入してください。 
キャンセル 再実行(T) 続行(C)
」
windowsの再起動で、エラーがでなくなった。
普通に実行できる。


###実行
実行バッチファイルをつくってみた。
"C:\Program Files (x86)\Meld\Meld.exe" "text1.txt" "text2.txt"

バッチファイルの黒い画面がでるので、ショートカットを作った。
「ショートカット＞実行時の大きさ(R)」について、「通常のウインドウ」→「最小化」とした。
heroku run rails cしないでHerokuの本番DBを確認する方法

## heroku run rails cしないでHerokuの本番DBを確認する方法
`heroku run rails c` を実行し、CLIで本番DBを確認するのは面倒な場合もあります。

その時にはPosticoというGUIデータベースクライアントを使いましょう。
こちらの解説記事を参考に進めると上手くいきます。
https://medium.com/@danielnmai/how-to-set-up-postico-3-to-connect-to-a-remote-postgresql-server-heroku-f9704e1b7643

Posticoを使うようになってからは開発効率が上がりました。この記事が参考になれば幸いです。

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
RailsでAPIにCORSを設定する

## CORSとは

*CORS(Cross-Origin Resource Sharering)* は簡単に言うと、クライアントが自分と違う *オリジン* をもつサーバーからデータを取得する仕組みのことをいいます。
オリジン(ex. `http://www.example.com:3000`)はスキーム`http://`、ホスト`www.example.com`、ポート`3000`の組み合わせからなります。
*同一オリジンポリシー* はセキュリティ保護を目的とし、あるページを開いたときに異なるオリジンのリソースを取得するのをブロックします。（例外になるリソースもあります、詳しくは[こちら](https://aloerina01.github.io/blog/2016-10-13-1)）
そのため、異なるオリジンのリソースを取得するには、そのオリジンのCORSが許可されていなければなりません。

## 環境
* Rails 5.2.3
* ruby 2.5.1
* Chrome

## 実装
便利なgemを使いましょう :cat:

### rack-cors
[cyu/rack\-cors](https://github.com/cyu/rack-cors)

```ruby:Gemfile
# Permit cors
gem 'rack-cors'
```
```ruby:config/application.rb
# Permit cross origin
config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "*"
    resource "*",
      headers: :any,
      methods: [:get, :post, :options, :head]
  end
end
```
`*` はワイルドカードといい不特定の文字を表します。つまり、何が入っても〜という意味になります。

* **origins** *(文字列 or 正規表現)*: どのオリジンを許可するか（APIをうつ側のドメイン）
* **resource** *(文字列 or 正規表現)*: 許可したいリソースファイル
* **methods** *(文字列 or Array or :any)*: 許可したいHTTPメソッド
* **headers** *(文字列 or Array or :any)*: 許可したいHTTPヘッダー



## 確認方法

方法はいろいろですがいくつか挙げます

### ブラウザで確認
GETリクエストの場合、ブラウザでアドレスバーにAPI URLを入力してレスポンスが返ってくるか確認できます。
更にレスポンスヘッダーに `Access-Control-Allow-Origin` がついていることを見るには
Devtool > Network > 該当API > Headers から確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38634/22ec986c-14cb-e71f-8307-cc50fc12b46f.png)

Devtoolのconsoleに↓を入力するのでもよいです（ブラウザはChrome）

```javascript
fetch($API_URL, {
    method: "POST", // ex. GET, POST, PUT, DELETE, etc.
    mode: "cors", 
    body: JSON.stringify($PARAM) // あれば
  })
  .then(res => res.json())
  .then(data => console.log(data)) // レスポンスが返ってくれば成功
```

### curlで確認

```bash
# GET
curl -v -H "Origin: ${APIをたたく側のURL}" ${確認したいAPIのURL}
# POST
curl -v -H "Origin: ${APIをたたく側のURL}" -H "Content-Type:application/json" -X POST -d ${リクエストボディ} ${確認したいAPIのURL}

```
`-H`: オリジンヘッダーを指定。異なるoriginでないと `Access-Control-Allow-Origin` がつきません
`-v`: HTTPリクエストの詳細表示
`Access-Control-Allow-Origin` が含まれていたら成功です :ok_hand: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38634/9ae892d4-49e5-be32-5b51-8c304ebf1da9.png)



### Postmanで確認
GUIでAPIを打ちたいときに便利
[Postman \| API Development Environment](https://www.getpostman.com/)

## 参考
[CORS\(Cross\-Origin Resource Sharing\)について整理してみた ｜ DevelopersIO](https://dev.classmethod.jp/etc/about-cors/)
[CORS \(Cross\-Origin Resource Sharing\) ってなに？](https://aloerina01.github.io/blog/2016-10-13-1)
[PHP] const vs define() matrix

PHPを書いていて、constとdefine()がどうやら等価には扱えないらしい、ということに気づきました。
この二つにはどんな違いがあるのか？気になったので調べてみました。
実行環境はPHP 7.1.23、導入、計算、配列の３項目については https://www.php.net/manual/ja/language.constants.syntax.php と https://www.php.net/manual/ja/function.define.php で調べた結果を載せています。

# const vs define() matrix

|const or define()|導入|計算|配列|クラス外|呼び出し方|クラス直下|呼び出し方|関数内|呼び出し方|
|--------------|---|---|---|------|--------|--------|--------|-----|-------|
|const         |5.3.0以降|5.6以降|5.6以降|書ける|NAME|書ける|self::NAME|書けない| /|
|define()      |4以降|４以降|７以降|書ける |NAME |書けない  | / |書ける |NAME |

~~当然ながら、クラス直下、関数内で定義した場合はスコープ外からは呼べません。~~
constで定義した場合スコープ外から呼べませんが、define()はスコープ外からも呼べるようです。

# まとめ
PHP7以降でしたら、どこでも呼び出せる定数を定義したいのならばクラス外で定義すればよく、constとdefineに大きな差は無いようです。
一方でクラス内定数を作りたいのならばconst ~~、関数内定数を作りたいのならばdefineという使い分けが必要そうです~~ のみが選択肢になりそうです。また、constでクラス内定数を定義した場合、単純な`NAME`だけでは呼び出せないことに注意が必要です。
~~そうした違いがあるのにPHP7以前では両者に性能面での差もあり、きっとカオスだった気がします。~~

なお、ツッコミ大歓迎ですので、どうかよろしくお願いします。
ニートの自然言語処理100本ノック:7

```python

"""
06. 集合
"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を，それぞれ, XとYとして求め，XとYの和集合，積集合，差集合を求めよ．さらに，'se'というbi-gramがXおよびYに含まれるかどうかを調べよ．
"""
import itertools

# bi-gramを作る
def make_str_bigram(text,n=2):
    
    text = list(text)
    iterr = itertools.combinations(text,n)
    lists = []
    for i in iterr:
        lists.append(i)
    return lists
    

def ck_groups(X,Y): # 集合をチェックする
    union = X.union(Y) # 和集合
    diff = X.difference(Y) # 差集合
    product = X.intersection(Y) # 積集合
    print("和集合:{0}\n差集合:{1}\n積集合:{2}\n".format(union,diff,product))

    return union,diff,product


def find_se(X,Y):

    if 'se' in X or 'se' in Y:
        if 'se' in X:
            print('seはXに含まれる')
        else:
            print('seはYに含まれる')
    else:
        print('seは含まれない。')
        


text1 = "paraparaparadise"
text2 = "paragraph"

input_X = set(make_str_bigram(text1,2))
input_Y = set(make_str_bigram(text2,2))

ck_groups(input_X,input_Y)

find_se(input_X,input_Y)
```

```
和集合:{('a', 'g'), ('a', 'h'), ('d', 'i'), ('g', 'a'), ('p', 'h'), ('r', 'h'), ('d', 'e'), ('p', 'd'), ('s', 'e'), ('r', 'a'), ('r', 'd'), ('p', 'g'), ('g', 'h'), ('p', 'a'), ('r', 'g'), ('a', 'i'), ('a', 's'), ('g', 'r'), ('a', 'd'), ('p', 'i'), ('r', 'p'), ('r', 'i'), ('p', 'p'), ('i', 's'), ('p', 'e'), ('i', 'e'), ('r', 'e'), ('g', 'p'), ('a', 'e'), ('p', 'r'), ('r', 's'), ('r', 'r'), ('p', 's'), ('a', 'p'), ('a', 'r'), ('a', 'a'), ('d', 's')}
差集合:{('r', 'i'), ('a', 'e'), ('r', 's'), ('i', 's'), ('p', 'd'), ('s', 'e'), ('p', 's'), ('r', 'd'), ('d', 'i'), ('p', 'e'), ('i', 'e'), ('a', 'i'), ('r', 'e'), ('a', 's'), ('a', 'd'), ('p', 'i'), ('d', 's'), ('d', 'e')}
積集合:{('p', 'r'), ('p', 'p'), ('a', 'a'), ('r', 'r'), ('r', 'a'), ('a', 'p'), ('p', 'a'), ('a', 'r'), ('r', 'p')}
```
クラスメンバに constexpr static 変数はおすすめしない ― 現象と対策

# この記事について

クラスの静的メンバ変数に `constexpr` があると困ることがあるよ、という話と、じゃあどうすればいいかという話。

# 実際に困るパターン

まあまずはソースコード。

```c++:c++11
// -std=c++11 -Wall
#include <iostream>

template <typename type> void foo(type const &v) {
  std::cout << v << std::endl;
}

template <typename type>
struct bar
{
  constexpr static type value = 123;
};

int main() {
  foo(bar<int>::value); // Undefined symbols(略) "bar::value"
  return 0;
}
```

これがエラーになる。
リンクエラー。
エラーになるのは、`bar<int>::value` の**定義**がないから。

`bar` は template なので、`bar<int>::value` の定義なんて書いてられない。困る。

クラスのメンバではない

```c++:c++11
constexpr static int out_of_class_constant = 123;
```
は、宣言が定義を兼ねるのでエラーにならない(対比のために `static` と書いたが、 `static` は不要)が、クラススコープにある

```c++:c++11
  constexpr static type value = 123;
```

は、**宣言**なので、別途定義が必要になる**かもしれない**。

「かもしれない」と書いたのは。
コンパイラが「値がわかればいいや」と思っていれば定義がなくても困らないのでコンパイル→リンクできる。コンパイラが「アドレスほしいなぁ」と思ったら定義を探しに行き、定義がないとリンクエラーになる。つまり、コンパイラの気持ち次第。

上記のソースコードの場合、`const`参照を引数としている関数に渡しているだけなのでアドレスなんて必要そうにないけど、なぜだか `g++-9` も `clang` もアドレスを取りに行くらしく、エラーになる。

コンパイラ様のお気持ちなので、ちょっとした変更でエラーじゃなくなる。
実際、`g++-9` ではコンパイラオプション `-O3` をつけるだけでビルドが通ったりする(`clang++` では依然として通らないんだけど)。

# 邪悪な対策

アドレスを取りに行くのが原因なので、上記のコードの `main`関数を以下のように変えるとビルドが通る。

```c++:c++11
int main() {
  foo(bar<int>::value + 0); // 無駄に0を足すとアドレスを取らなくなる
  return 0;
}
```

偶然なのか必然なのかはよくわからないが、手元のコンパイラではそうなる。

とはいえ、こんな対策いやだよね。

# 邪悪じゃない対策(とりあえず)

値のアドレスを取られなければいいので、関数にすれば良い。
こんな感じ。

```c++:c++11
// -std=c++11 -Wall
#include <iostream>

template <typename type> void foo(type const &v) {
  std::cout << v << std::endl;
}

template <typename type> struct bar {
  constexpr static type value() { return 123; }
};

int main() {
  foo(bar<int>::value());
  return 0;
}
```

整数なら `enum` にするという手もあるけど、そうできないこともある。
関数になんかしたくないんだけど、関数にするしか手がない。

# 邪悪じゃない対策(C++17)

と思っていたら新しい言語機能が。

```c++:c++17
// -std=c++17 -Wall
#include <iostream>

template <typename type> void foo(type const &v) {
  std::cout << v << std::endl;
}

template <typename type>
struct bar
{
  inline constexpr static type value = 123; // inline 変数
};

int main() {
  foo(bar<int>::value);
  return 0;
}
```

という具合。
`inline` 変数にすると、クラスの外にある変数と同じように振る舞う。
なお。 `inline` 変数が使える C++17 以降では

> `constexpr` な静的データメンバは暗黙に `inline`

というスペシャルルールが加わったので、上記のソースに書いた　`inline` は不要。C++17 としてコンパイルするだけでよい。

# というわけで

というわけで、C++17 以降で仕事したいね。

# 環境

動作確認に使った環境は以下の通り：

OS: macOS Mojave 10.14.5
clang: Apple LLVM version 10.0.1 (clang-1001.0.46.4)
gcc: g++-9 (Homebrew GCC 9.1.0) 9.1.0
ニートの自然言語処理100本ノック:6

```python
"""
05. n-gram
与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．
""" 
import itertools


text = "I am an NLPer"


def make_str_bigram(text,n=2):

    # 単語をリスト化する
    # リスト内のspaceをlambdaを使って取り除く
    # textに入れなおす

    text = list(filter(lambda s:s != ' ',list(text)))
    iterr = itertools.combinations(text,n) # テキストと組み合わせの文字数でイテレータ型を作りループし出力する
    for i in iterr:
        print(i)


def make_word_bigram(text,n=2):

    text = text.split(' ') # 外に出してsplitしたらわざわざmake_word_bigramを作る必要がないよね
    iterr = itertools.combinations(text,n)
    for i in iterr:
        print(i)



make_str_bigram(text)
make_word_bigram(text)
```
```
('I', 'a')
('I', 'm')
('I', 'a')
('I', 'n')
('I', 'N')
('I', 'L')
('I', 'P')
('I', 'e')
('I', 'r')
('a', 'm')
('a', 'a')
('a', 'n')
('a', 'N')
('a', 'L')
('a', 'P')
('a', 'e')
('a', 'r')
('m', 'a')
('m', 'n')
('m', 'N')
('m', 'L')
('m', 'P')
('m', 'e')
('m', 'r')
('a', 'n')
('a', 'N')
('a', 'L')
('a', 'P')
('a', 'e')
('a', 'r')
('n', 'N')
('n', 'L')
('n', 'P')
('n', 'e')
('n', 'r')
('N', 'L')
('N', 'P')
('N', 'e')
('N', 'r')
('L', 'P')
('L', 'e')
('L', 'r')
('P', 'e')
('P', 'r')
('e', 'r')
('I', 'am')
('I', 'an')
('I', 'NLPer')
('am', 'an')
('am', 'NLPer')
('an', 'NLPer')
```
ヒトと感覚

## 脳神経系と感覚・運動

脳は大脳、小脳、脳幹に大分される。
バーチャルリアリティで重要な感覚を担うのは大脳。



## 知覚、認知心理学の基礎

人間が立体的な情報を知覚できるのは、いくつかの手がかりを活用しているから。

・単眼手がかり
・両眼手がかり

### 両眼手がかり
左右の目のずれから生じる差を網膜視差と呼びます。
左右の目からの情報を脳で統合することにより立体感を知覚できるようになります。

### 単眼手がかり

陰影、大きさ、遠近法、テクスチャ勾配、空気遠近法など。
片目でも知覚できる情報

## 視覚

目が見える仕組みについて考えましょう。

### 眼球
まず入り口となるのは眼球です。

外からの光は眼球にある様々な箇所を通り、網膜に届きます。
網膜に届いた光は光エネルギーから電気エネルギーに変換されます。

### 視路
視覚の通り道


## 空間の知覚

## 聴覚

耳は入り口の「耳介」に始まり、外耳、中耳、内耳、、蝸牛と続く。
Angular8とIE11対応

Angular8がリリースされてもう一月たちましたね！:sparkles:
Differential Loadのおかげか、アップデートしたらそんなに重くないサイトでも少しメインバンドルが軽くなったので嬉しくなりました。`ng update`のおかげでアップデート自体はかなりさくさくできましたが、IE対応する場合はちょっとだけ追加で作業が必要でした。ほぼ自分用にメモしておくくらいの感じですが、記録しておきます。

## browserslist
```
# For IE 9-11 support, remove 'not'.
```
とbrowserslistに書いてあるので、忘れずに`not IE 9-11`を`IE 9-11`にしておきましょう。これは明示的に書いてあるので比較的わかりやすいと思います。

## IE11用起動コマンドオプションの設定
browserslistの設定はビルド用です。実はこの状態で`ng serve`したものをIEで開くと画面は真っ白で全くロードされません。
調べると[該当のIssue](https://github.com/angular/angular-cli/issues/14455)が出てきます。手っ取り早くどうすればいいかは、[このコメント](https://github.com/angular/angular-cli/issues/14455#issuecomment-493739768)が一番わかりやすいです。
よくまとまっているので特にわざわざ同じことを書きませんが、やってることは`ng serve --configuration es5`とオプションをつけて起動すると、IE11でも開けるes5で出力されるようにする、です。
元Issueにもあるように、Differential Loadingをdisableにすることもできますが、せっかくのv8の恩恵を捨ててしまうのは勿体無いですし、簡単３ステップで設定できるのでこちらをお勧めします。
今日から、プログラミングはじめます！！

#自己紹介
未来電子テクノロジーでインターンをしているkatsukiです。
情報学部に在籍しながら、まともにプログラミングをしたことがなかったのですが、インターンをキッカケにプログラミングを学ぶことを決意しました。
情報学部に入ったキッカケは、ある教授の現代アートを見て感動したからです。その現代アートはプログラムで完全にコントロールされ、計算され尽くした美しさに惹かれました。

これから、プログラミングをはじめとした、さまざまなことを学び自分を表現できるようになりたいと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
##progateでHTME/CSS初級編を学びました。
paddingとmarginについて
内側から順に、padding->border->marginという順番で表されます。
paddingとmarginともに
-top,-right,-left,-bottomとつけることで上、右、左、下を表すことができる。

```css:css
padding:20px;
padding-right:20px;
padding-left:20px;
padding-botton:20px;
margin:20px;
margin-right:20px;
margin-left:20px;
margin-botton:20px;
```
-top,-right,-left,-bottomを付けずに表すこともできる。

```css:css
padding:20px 30px 15px 10px;
     /* 上　　右　　下　　左*/
padding:20px 30px 15px;
     /* 上　　右左　下　*/
padding:20px 40px;
     /* 上下　左右*/
padding:20px;
     /* 上下左右*/

margin:20px 30px 15px 10px;
     /* 上　　右　　下　　左*/
margin:20px 30px 15px;
     /* 上　　右左　下　*/
margin:20px 40px;
     /* 上下　左右*/
margin:20px;
     /* 上下左右*/
```
個人的に理解がしにくく、覚えにくいところだったので、まとめてみました。
Windows10のコマンドプロンプトでカーソルが非表示になる件

とりあえずメモ書き程度に。私の環境だけかもしれないので......

#発生状況
カーソル ＝ 白くて太いアンダーバーみたいな、点滅するもの（語彙力低）

不定期で、消える原因が掴めていない。
一応ローマ字入力中に確定せず未確定部分をすべて消すと再現ができた。

どこにカーソルがあるのかが不明なため、よく明後日の方向の文字を消してしまうことがあった。

#環境
Windows10 1809

#カーソルを出す方法
なんでもいいので、ローマ字入力（IMEオン・日本語入力）で一文字でもいいので適当に入力→確定する。
戻すのに使った適当な文字列は消してしまって構わない。
ニートの自然言語処理100本ノック:5

```python
"""
04. 元素記号
"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．
"""


text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."


def mk_str_array(text):

    lists = text.split(' ')
    mono_list = [1, 5, 6, 7, 8, 9, 15, 16, 19]
    result = {}
    
    # インデックスと値を持ってきて条件にしたがってdict型に代入する。
    for i,l in enumerate(lists):
        if i in mono_list: # 1文字だけのリストにあうか合わないか
            result.update({i:l[:1]})
        else:
            result.update({i:l[:2]})
    else:
        return result


print(mk_str_array(text))
```
```
{0: 'Hi', 1: 'H', 2: 'Li', 3: 'Be', 4: 'Bo', 5: 'C', 6: 'N', 7: 'O', 8: 'F', 9: 'N', 10: 'Na', 11: 'Mi', 12: 'Al', 13: 'Si', 14: 'Pe', 15: 'S', 16: 'C', 17: 'Ar', 18: 'Ki', 19: 'C'}
```
ニートの自然言語処理100本ノック:4

```python
"""
03. 円周率
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．
"""
# アルファベットのリストを作る。
# 大文字、小文字に注意する。
# ヒットした順番から別のリストの中に入れる。


text = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
# upper-case A-Z
ALP = [chr(i) for i in range(65,65+26)]
# lower-case a-z
alp = [chr(i) for i in range(97,97+26)]
lists = []
for t in text:
    if t in alp or t in ALP:
        lists.append(t.lower())

print('順番:')
print(''.join(lists))

```
```
順番:
nowineedadrinkalcoholicofcourseaftertheheavylecturesinvolvingquantummechanics
```
ニートの自然言語処理100本ノック:3

```python
"""
02. 「パトカー」＋「タクシー」＝「パタトクカシーー」
「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．
"""

# 


a = 'パトカー'
b = 'タクシー' # 最初に変数を設定してないとデータが溜まっていくだけ
c = []

for t in range(len(a)):
    c.append(a[t])
    c.append(b[t])

print(''.join(c))
```
ニートの自然言語処理100本ノック:2

```python
"""
01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．
"""
a = 'パタトクカシーー'

def get_odd_word(string):
    return string[0::2]

print(get_odd_word(a))
```
ニートの自然言語処理100本ノック:1

最近あんまり時間がないので、自然言語処理100本ノックをちょこちょこ投稿していきます。

```python
"""
00. 文字列の逆順
文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．
"""

a = 'stressed'

# スライスを使って逆転させる

def reverse_str(text): # 名前をわかりやすくする
    return text[::-1] 


print(reverse_str(a))
```
自動車のソフトウェアで解決できるリコールをIT業界の視点で推測してみる

あるメーカのある車種に乗っていたころの話。

前面に警告灯がつき、エラーコードを見ると、サービスステーションに行ってくださいとのこと。

早速、サービスステーションに行くと、ECUにケーブルを繋いで、データを吸い出している模様。

あ、警告の数がオーバフローしそうな時に出る警告だろうと推測がついた。

吸い出すだけでなく、ECUの新しいソフトも書き込んでいる模様。

リコールするほどではない小さな不具合は、車検時、定期点検時、警告時などに更新することになっているんだなと推測した。

それから何日かあと、山のキャンプ場で泊まった時、朝エンジンがかからなかった。
電話で連絡したら、しばらく置いてから、また掛け直してくださいとのこと。

数時間経って、JAFに引き取りにきてもらうかどうかを迷っていたら、エンジンがかかった。

一応、サービスステーションに行った。
またデータの吸い出しなどをしていただいた。この時は、ソフトの更新をしたかどうか確認し忘れた。

数ヶ月経って、リコールが来た。

ああ、警告が出た現象と、その極値であるエンジンがかからないことがある現象の最終版が出たのだと推測した。

リコール隠しの要素はどこにもない。

不具合があっても、治し方が分からない時点で、死亡事故が起きるのでない限り、リコールのしようがない。

改良したソフトウェアの、メーカ等の試験場で、一定の条件で、何十時間、何百時間と走らせて、ありとあらゆる試験をしてからでないとリコールはできない。

途中で、めぼしい不具合を直した版を、車検時、定期点検時、警告時などに更新しても、それはリコール隠しではない。

まだリコールできる最終版ができない状態の暫定版でしかないと推測する。

IT業界の視点で、ソフトウェアで解決できるリコールを推測してみた。

そんなことは絶対にないという事実、実験記録などをご存知の方がおみえでしたら、ご紹介くださると幸いです。
yield_selfでシンプルなメソッドチェーンを書く方法

## 概要
コードレビューをしていて、自分の知らない記法(`yield_self`)にあって、便利だと思ったので紹介します。

## yield_selfとは

レシーバをブロックパラメータとして取ることができ、返り値としてブロック内の実行の結果を返します。似たような挙動をするものに、`tap`というメソッドがあります。
`tap`はレシーバをブロックパラメータとして取るという点では同じですが、返り値としてはレシーバの値をそのまま返すという点で異なっています。

返り値として、ブロックの実行結果を返すことから、以下のようなコードをシンプルに書くことができます。

例: user_idのリストを複数のメソッドで絞り込んで行きたいケース

```rb
hoge_user_ids = fetch_hoge_user_ids(user_ids)
fuga_user_ids = fetch_fuga_user_ids(hoge_user_ids)
```

`yield_self`を使うことで、以下のようなシンプルなメソッドチェーンで書き直すことができます。

```rb
some_user_ids
  .yield_self{|user_ids| fetch_hoge_user_ids(user_ids) }
  .yield_self{|user_ids| fetch_fuga_user_ids(user_ids) }
```

このようにただ引数として渡すために変数に代入する手間を省くことができます。

## 参考
- [Rubyの#yield_selfの良さを#tapと比較して説明する](https://qiita.com/rnitta/items/c1eee2ff659eb3ef52d0)

`tap`と`yield_self`の違いについてシンプルに紹介されています。
Intellij IDEAでKotlinのAndroidのビルドが失敗したことの考察

# はじめに
個人的な備忘録です。

# 前提
Android StudioではなくIntelliJ IDEAを使用
KotlinでAndroidアプリのエミュでHello,Worldまで持って行きたかった。
自分は今までwebでやってきた人間なので、なんか色々勝手がわかっていません。

# 状況
エミュは立ち上がるし普通にOSが起動するが、色々見ていた記事のように自分が今開発しているアプリ（Hello,worldを出力するだけのもの）がそもそもどこにもいない。

ビルド出力の欄を見てみるとJavaのコンパイルエラーが4つ。他にAndroidErrorとして

```
Default interface methods are only supported starting with Android N (--min-api 
24): android.view.MenuItem androidx.core.internal.view.SupportMenuItem.setContentDescription(java.lang.CharSequence)
```

が出ていた。
正直JavaもAndroidもど素人なので全く何を言われているかわからない。

# 改善策
そこでこんな記事を見つけた。
https://stackoverflow.com/questions/49512629/default-interface-methods-are-only-supported-starting-with-android-n

どうやら

```app/build.gradle
android {
...
  compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
...
}
```
これを追加すれば良いらしい。

喜び勇んでやってみると、なんと今度はビルドまで行かずその前に同期化でエラーが出ていた。
エラーメッセージはJavaのNullPointerExceptionがどうのこうののエラーだった。（メモり忘れました、、）

# 原因
まぁこれ当たり前の話で、僕が追加してるJavaSDKがver12だったからなんですね。
最初の

```
Default interface methods are only supported starting with Android N (--min-api 
24): android.view.MenuItem androidx.core.internal.view.SupportMenuItem.setContentDescription(java.lang.CharSequence)
```

このエラーが出てしまった時点でJava8を使わないとダメってことらしいです。
で、Java8を入れ直してからさっきのを追加したらうまく行きました…

と言いたいところなんですけど、僕はもう一つミスをやらかしてました。

# AndroidSDK

IDEA上で「cmd+;」するとプロジェクト構造が出てきてくれるんですけど、そこでAndroidなりJavaなりのSDKを追加しなければなりません。それ自体はしてたんですけど
そこのJavaSDKの設定を

<img width="1384" alt="スクリーンショット 2019-07-12 22.02.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318201/bc00e607-bb21-96f0-ea93-0b7986ec9ec6.png">

こんな感じでJava8にしたり、

あとモジュールの「app」のSDKはAndroidSDKで↓

<img width="1376" alt="スクリーンショット 2019-07-12 22.06.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318201/925e9878-60b4-376a-fa8e-06126caea838.png">

プロジェクト全体だとJavaのSDKを指定してあげないといけなかったり。↓

<img width="1376" alt="スクリーンショット 2019-07-12 22.08.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318201/ec1a5cb9-832b-8420-ae19-f85f5f3126e1.png">

とにかくこんな感じで設定しないといけなかったのをできていなかったようです。

# 疑問
そもそもKotlinでAndroidの開発をする時にJavaのSDKが必要ってことは、Androidは最終的にJavaのシステムしか動いてくれないからJavaにコンパイルするよってことなんでしょうか。
そんでこれAndroid開発は絶対Java8のSDKとか決まってたりするんでしょうか。
だれか教えてくれると幸いです。。

# まとめ
「Default interface methods are only supported starting with Android N (--min-api 
24): android.view.MenuItem androidx.core.internal.view.SupportMenuItem.setContentDescription(java.lang.CharSequence)
」が出たらJava8を入れて色々切り替えてオプションつける。

結構ネットに落ちてるIntellij IDEAでKotlinでAndroidの環境構築の情報って少ない上に全体的に古くなっちゃってて、例えば今はAndroidSDKはIDEAが勝手に入れてくれますし、Kotlinで「新規プロジェクト作成」ってした時の設定や画面もちょっと変わっちゃってます。
これから開発するのにも英語のドキュメントの方が活躍しそうですね、頑張ろう。
docker-composeで作成したコンテナを別サーバーに移行させる手順のメモ

# はじめに

docker-composeを使用して作成したコンテナを別サーバへ移行させます。

永続化としてホストのフォルダをマウントしている事を想定しています。
永続化にDocker volumeを使用している場合は次の記事などを参照してください。
https://qiita.com/ritukiii/items/c724f09fe66fedf2618b
(本記事の参照元でもあります)

ホスト環境は移行元、移行先共に
AWS上のUbuntu18.04です

# 準備

済んでいる場合は不要です

### docker networkを使用している場合は移行先の環境に同名のnetworkを作成しておく。

```
# 例
# 移行先で
docker network create -d bridge --gateway=192.168.0.1 --subnet=192.168.0.0/16 <ネットワーク名>
```

### 移行元から移行先へssh接続できるようにしておく。

```
# 例
# 移行元で

# なければ.sshフォルダを作成してパーミッションを変更
mkdir ~/.ssh
chmod 700 ~/.ssh

# 接続先にログインするための秘密鍵を配置してパーミッションを変更
~/.ssh/<秘密鍵名>
chmod 600 ~/.ssh/<秘密鍵名>

# ~/.ssh/configに接続情報を追加
vi ~/.ssh/config
----------<追加>----------
Host <移行先サーバ名>
  User <接続ユーザ名>
  Port 22
  HostName <IPアドレス>
  IdentityFile ~/.ssh/<秘密鍵名>
--------------------------

# ~/.ssh/configを新規作成した場合はパーミッションを変更
chmod 600 ~/.ssh/config
```

# 本題

## コンテナイメージの移行

移行元で実行中のコンテナイメージをtarファイルとして保存し、移行先にscpで転送します。
移行先でtarファイルからdockerイメージをロードします。

### 移行元での作業

コンテナをコミットして最新の状態をコンテナイメージに適用。

```
docker commit <コンテナ名> <イメージ名>
```

コンテナイメージをファイルとして書き出す。

```
docker save <イメージ名> > <イメージファイル名.tar>
```

書き出したファイルを移行先に転送

```
scp <イメージファイル名.tar> <移行先サーバ名>:<イメージファイル名.tar>
```

### 移行先での作業

転送したファイルをコンテナイメージとしてロードする

```
docker load < <イメージファイル名.tar>
```

### ロード結果の確認

```
docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
<イメージ名>                                     latest              xxxxxxxxxxxx        About an hour ago   3.02GB
```

## コンポーズファイルの移行

tar圧縮してscpするなどして転送先に移行


```
# 例
# 移行元での作業

# docker-compose.ymlファイルなどが格納されたフォルダをtarで圧縮
tar zcvf <コンポーズファイルなど一式.tar.bz2> <コンポーズファイルのフォルダ>

# scpを使用して移行先に転送
scp <コンポーズファイルなど一式.tar.bz2> <移行先サーバ名>:<コンポーズファイルなど一式.tar.bz2>
```

```
# 例
# 移行先での作業
tar zxvf <コンポーズファイルなど一式.tar.bz2>
```


## 永続化用フォルダの移行

コンポーズファイルと同様に転送し、オーナー／権限を転送元を参考に調整する

```
# -Rオプションを付けてサブフォルダ以下も変更
chown dockeruser:dockergroup <永続化用フォルダ> -R
chmod 元のパーミッション <永続化用フォルダ> -R
```

## コンテナイメージからコンテナを起動

移行したdocker-compose.ymlと同じフォルダに移動し、コンテナを起動する。
もし永続化用フォルダのパスなど、環境に変更がある場合はdocker-compose.ymlを編集しておく。

```
docker-compose up -d
```
開発環境のkubernetesにskaffoldを使って自動デプロイ

# skaffoldとは
googleによって開発されている、kubernetesへの継続的な開発を容易にするコマンドラインツールです。
開発段階では、アプリケーションのソースコードの変更を検知して、
DockerコンテナのBuild→コンテナレジストリーへのPush→kubernetesクラスタへdeploy
を行ってくれます。
本番環境では、CI/CDを担当させる事が可能です。

## メリット
- Google公式なので自作ビルドツールより安心
- 煩雑なimageのtag管理を自動でやってくれる
- 導入が簡単

## デメリット
- VolumeMountに比べると多少遅い
- ビルドするファイルサイズが大きい場合、遅延が顕著になる

## 導入方法
skaffoldのリポジトリにskaffold用の設定サンプルファイルがあるのでそれを編集します。
<a href="https://github.com/GoogleContainerTools/skaffold/blob/master/examples/getting-started/skaffold.yaml" target="_blank">サンプルファイル＞＞</a>

## コマンド
### Skaffold dev
```
$ skaffold dev
```
ソースコード及びコードとdockerイメージの依存関係を監視し、変更を検知するとアプリケーションのビルド/プッシュ/デプロイを実行します。

### Skaffold run
```
$ skaffold run
```
デプロイしたアプリケーションを継続的に更新しますが、エラー発生時に終了します。以下の用途で利用できます。

## 構成ファイル

```yaml:skaffold.yaml
apiVersion: skaffold/v1alpha2
kind: Config
build:
  tagPolicy:
    sha256: {} #コンテナのTagをハッシュ
  artifacts:
  - imageName: k8sdemo/php-apache # apache-phpのコンテナ
    workspace: ./docker/apache-php # apache-phpのworkSpace
  local:
deploy:
  kubectl:
    manifests:
      - ./templates/main.yaml # 監視対象のyamlファイルを指定
```