OmniAICreator/Qiita-1.07M huggingface dataset:
rbenvでiOSプロジェクトのruby環境を整える

内容としては、ただrbenvを用いてruby環境を整えている話です。

iOSエンジニアがcocoapodsやfastlaneを用いる上で、
必要最低限のruby環境構築知見を記載しておきます。

## rbenvとは

https://github.com/rbenv/rbenv
ruby開発環境を整えるもの。
rubyのバージョン管理をしてくれるもの。

## rbenvでrubyを管理する意味

macOSでは最初からrubyが入っています。
https://applech2.com/archives/macos-mojave-new-features-ruby-php-python.html
なので、rubyを使うために必ずしもrbenvを使う必要はありません。

rbenvを使う意味は、rubyのバージョン管理が一番の理由です。

## rbenvのインストール

homebrewを使ってインストールします。
※homebrewの利用方法については省略。

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

インストールできたか確認。ついでにバージョンも確認。

```
$ rbenv -v
```

## rbenvでrubyをインストール

インストールできるrubyのversionたちを確認。

```
$ rbenv install -l
```

rubyをインストール。今回は2.6.0をインストールしてみます。

```
$ rbenv install 2.6.0
```

## インストール済みのrubyを確認

2.6.0が正しくインストールできているか確認。

```
$ rbenv versions
```

## インストールしたrubyを適応

```
$ rbenv global 2.6.0
```

これでインストールしたrubyを扱うようになります。
下記コマンドで確認しましょう。

```
$ ruby -v
```

## 特定プロジェクトに特定rubyバージョンを適応

先程のシステム全体のruby環境を適応する方がglobalなら、
こちらはlocalになります。

gitのhomeディレクトリ階層に `.ruby-version` というファイルを作ります。
内容はrubyのバージョン数だけを記載します。

```
2.6.0
```

これで、このディレクトリ内においてrubyバージョンを指定できます。

## 参考

https://qiita.com/Alex_mht_code/items/d2db2eba17830e36a5f1
https://qiita.com/Yinaura/items/0b021984bb21ae77816d
NUXT.jsでSSRする場合の落とし穴

# NUXT.js×REST API×Typescript×SSR
NUXT.jsはSSRの設定自体は` mode: 'universal',` とするだけでいいのですが、SSRとSPAで気を使って実装しないと、データの取得などで、どっちかでは動く、動かない問題が出てきます。
結構ハマったのでメモ。

## :skull: 問題
### SSR時だけAPIレスポンスが取得できない。
SPA時はAPIレスポンスがちゃんと返ってきて問題ないのだが、
SSR時はリクエストはされているのに、APIレスポンスが返ってこないようなエラーが起こった。

## :zap: 原因
SSRする場合、asyncDataのライフサイクルでAPIのリクエストをする必要があると思います。
その時、proxyとかを使っているとSSR時のみAPI取得ができません。
nuxt-linkの遷移ならうまくいくのに、画面リロードしたらエラーでるみたいなケースです。

※SSRのときはproxyを使う必要がありません。

## :tada: 解決

axiosのbaseURLをブラウザ時とSSR時で分けるだけだった
→ `baseURL: process.browser ? '' : ‘https://api.endpoint.com’ `

※ `process.browser` はnuxtならデフォルトで取得できます。

今回は下記モジュールを使っている前提です。
- axios(axios-moduleを使わずaxiosを使いたい)
- @nuxt/proxy

※ axios-moduleを使わない理由は下記記事と同様の理由
[:fire: replace axios-module to axios - axios-moduleをaxiosにreplaceしたはなし](https://slides.com/nakajmg/replace-axios-module#/14)

#### APIクライアント

```typescript:/plugins/api/utils/clinet.ts

import axios from 'axios'

const instance = axios.create({
  baseURL: process.browser ? '' : process.env.API_HOST, //←これを追加。ブラウザのときは 空 もしくは/apiから始まるようにしないとproxyが効かずフロントから取得できないです。
  withCredentials: process.env.NODE_ENV !== 'production',
  headers: {
     'X-Requested-With': 'XMLHttpRequest',
     'Access-Control-Allow-Origin': '*'
  },
  timeout: 20000
})
export const client = instance
```

### :raising_hand:下記は補足

#### @nuxt/proxyの設定

`$ yarn add @nuxt/proxy` でインストールして

```typescript:nuxt.config.ts

const config: NuxtConfiguration = {
  mode: 'universal',

  modules: [
     '@nuxtjs/proxy'
  ],
  proxy: { //  /apiで始まるアクセスを http://docker.for.mac.localhost(APIサーバーのエンドポイント)に置き換える
    '/api': {
      target: ` http://docker.for.mac.localhost`,
      changeOrigin: true,
      pathRewrite: {
        '^/api/': '/api/'
      }
    }
  }
}
```

#### APIメソッド

```typescript:/plugins/api/auth.ts

import { client as httpClient } from '@/plugins/api/utils/client'

// import types
import * as types from '@/types/AuthUser'

/**
 * api/auth_user
 * @param null
 */
export const getAuthUser = () => {
  return httpClient
    .get<types.GetAuthUserResponse>(`/api/auth_user`)
    .then((response) => response)
}
```

#### API型定義

```typescript:/types/AuthUser.ts

export interface AuthUser {
  id: number
  name: string
  token: string
}

export interface GetAuthUserResponse {
  data: {
    authUser: AuthUser
  }
}
```

#### APIの呼び出し

```vuejs:pages/index.vue


<script lang="ts">
import { Component, Vue } from 'nuxt-property-decorator'
import { AuthUser } from '@/types/AuthUser'
import { getAuthUser } from '@/plugins/api/auth'

@Component
export default class Index extends Vue {
  authUser!: AuthUser

  async asyncData({ app, error }) {
    const result = await getAuthUser()
      .then((res) => {
        return { authUser: res.data.auth_user }
      })
      .catch((e) => {
        console.log(e)
        error({
          statusCode: 500,
          message: 'サーバー側でエラーが発生しました'
        })
        return
      })
    return result
  }
}
</script>
```
NuxtでBASIC認証おおおおおおおおおおお

Nuxtでポートフォリオサイトを作った際に、BASIC認証（[nuxt-basic-auth-module](https://www.npmjs.com/package/nuxt-basic-auth-module)）を使ってみました。
その際、[Netlify](https://www.netlify.com/)では、BASIC認証が使えなかったので、
無料でBASIC認証が使える[Heroku](https://jp.heroku.com/)にした事で解決出来た。
忘れてしまいそうなので、記事にします。

#前提
各バージョンは下記の通り

``` bash
# node
v10.15.3

# npm
v6.4.1

# nuxt
v2.7.1
```
Windowsの方は下記も入れておきましょう
[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)


#まずは、インストール

``` bash
npm install nuxt-basic-auth-module # or yarn add nuxt-basic-auth-module
```


#設定方法
インストール後、nuxt.config.jsを開いてmodules内にnuxt-basic-auth-moduleを記述。
あとはbasicの中にnameとpassを設定するだけ。

``` js:nuxt.config.js

  /*
   ** Nuxt.js modules
   */
  modules: [
    'nuxt-basic-auth-module'
  ],
  basic: {
    name: 'dev',
    pass: 'sample123'
  },
```

#設定出来ているか確認
```
npm run dev
```
[http://localhost:3000](http://localhost:3000)で開いた時に、
BASIC認証が動いていれば成功です。

#あとはアップするだけ！

[NetlifyでWebサイトを公開する方法](https://qiita.com/shozzy/items/dadea4181d6219d2d326)
などを参考にしながら、Netlifyでアップしてみる。


#ところが、、、、Netlifyは有料版じゃないとダメ！？
アップロードは出来たけど、BASIC認証動いて無くね？
ということで、[料金プラン](https://www.netlify.com/pricing/)を見てみると、、、

毎月$45から「Basic authentication headers」とあるので、使えないっぽい。
毎月約1,600円は、さすがに高い気がするので、無料でBASIC認証が使える所を探すことに。。。。

#Herokuなら無料でBASIC認証が使える
まずは、[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)でインストールしておく。

##heroku上にアプリを作成する
```
#nuxt.config.jsなどがあるディレクトリで、
heroku create
```
##herokuへデプロイ
```
git push heroku master
```

##Nuxt.jsのデプロイに必要な基本設定
```
heroku config:set NPM_CONFIG_PRODUCTION=false
heroku config:set HOST=0.0.0.0
heroku config:set NODE_ENV=production
```

package.jsonを開き、herokuにnpm run buildを実行させるために
"heroku-postbuild": "npm run build"を追記します。

```json:package.json
{
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "heroku-postbuild": "npm run build" ←これ。
  }
```

設定したものをpushして更新。

```
git push heroku master
```

作成したアプリを下記コマンドで開いてみる。

```
heroku open
```

これでBASIC認証がかかっていれば、完了！。

参考
[NetlifyでWebサイトを公開する方法](https://qiita.com/shozzy/items/dadea4181d6219d2d326)
[Herokuが便利になるToolbeltのインストール(Windows用)](https://mseeeen.msen.jp/how-to-install-heroku-toolbelt/)
processingでopencvを使って顔検出して、その顔のみトリミングしてうつす

//OpenCVによる顔検出
import gab.opencv.*;
import processing.video.*;
import java.awt.*;


Capture video;//ビデオキャプチャー
OpenCV opencv;//OpenCV

void setup() {
  
  size(640,480);
  //ビデオキャプチャー初期化
  video = new Capture(this,640,480);
  //OpenCV初期化
  opencv = new OpenCV(this,640,480);
  //顔の学習データを読み込み
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
  video.start();
  
}


void draw() {
  opencv.loadImage(video);
  background(255);
//image(video,0,0);
  Rectangle[] faces = opencv.detect();
  for (int i=0;i<faces.length;i++) {
    image(video.get(faces[i].x,faces[i].y,faces[i].width,faces[i].height),100*i,0);
  }
}

//キャプチャーイベント
void captureEvent(Capture c) {
  c.read();
}
UiPathでのGmailメール受信IAMP　


UiPathでのGmail受信方法。IMAPを使いまーす。
※送信は設定が違います。

①まずはGmailのIMAPを有効にする。

![InkedAwesomeScreenshot-mail-google-mail-u-0--2019-08-01_11_41_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209256/bb2e7953-7c7c-b0ba-ecca-e7995c93b747.jpeg)


②アプリケーションパスワードを作成
https://security.google.com/settings/security/apppasswords にアクセスしてアプリケーションパスワードを生成します。

アプリケーション名はUiPathとか。
この黄色いハイライトのパスワードが③で必要になります。（覚えなくて良いとか書いてあるけど、私は写メった。）

![AwesomeScreenshot-docs-uipath-studio-lang-ja-docs-enabling-gmail-for-email-activities-2019-08-01_11_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209256/c02a44b6-dae1-4de5-1940-2c15b7b015c5.png)



③IMAPメールメッセージを取得のプロパティを設定する。

![Inkedlocal-image-2019-08-01_11_14_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209256/e5a37c2a-da22-b4ed-cbb7-1803cf5d5a0f.jpeg)

大事っぽいとこだけ。書いてない所は初期設定のままでOK！

```
セキュア接続：auto
未読メッセージのみ：□
サーバー："imap.gmail.com"
ポート：993
メールフォルダ："Inbox"
ログオン
パスワード："16桁のアプリケーションパスワード"
メール："自分のメールアドレス"

```

※私みたいに、Gmailのアドレス２つ持ってて、アプリケーションパスワード設定してない方のメールアドレスを入力しないようにご注意を！


下の方はメールの件名を取得するものやけど、その辺はUiPathアカデミーと同じ！（レッスン11_1メールの自動化(受信)）
GPU Gem 2 Chapter34 メモ

# Chapter 34. GPU Flow-Control Idioms

## Flow-Control Challenges

平行结构中两个最常见的机制是单指令流多数据流(single instruction, multiple data, SIMD)和多指令流多数据流(multiple instruction, multiple data, MIMD)。SIMD结构中所有的处理器同时执行同一个指令流。MIMD结构中不同的处理器并行执行不同的指令流。

对于GPU有三种办法进行分支操作：MIMD分支，SIMD分支和状态码。

MIMD分支是理想的方案。GeForce6之后在顶点着色器中支持MIMD分支。

SIMD中因为处理器同时只能执行一个指令流，片元随机选取一个分支时，其他处理器必须等待其运行结束。SIMD在分支条件相当空间连续的情况下很有用，但是在非连续的情况下是非常昂贵的。

控制码被用于旧一点的结果来模拟分支。

## 基础流控制策略(Basic Flow-Control Strategies)

### 预测(Predication)

最简单的方法就是GPU快速预估分支然后抛弃其中一个。缺点就是如果分支里的函数是很庞大的话就会很耗时。所以预测适合小的分支。

### 移至流水线的上游

#### 静态分支解析

尽量避免在循环内使用分支。尽量不要使用嵌套循环。使用独立的循环。

#### 预计算

对于一个范围内值是固定的判断来说，提前将结果预存起来，只要预测结果不变直接就可以使用而不用计算。可以提供巨大的性能提升。

### Z-Cull

可以使用另一项GPU的特性来利用预计算的结果，从而完全跳过不必要的开销。

Z-cull是一种比较输入的深度（depth z）和z缓冲(z-buffer)里的z值的技术（似乎就是Z-test)。如果测试失败，就会在被抛弃掉。

z-cull的伪代码，第一个Pass里进行z-test并踢出不需要的像素。第二个Pass里处理通过z-test的像素。

![image-20190801110906972](http://ww3.sinaimg.cn/large/006tNc79gy1g5jydautbaj31440u0gtd.jpg)

z-culling通常被GPU用来做粗略的解析而不是一个逐片元的操作。GPU只有在缓存中一小片连续区域里的片元全部测试失败的时候才会跳过渲染操作。所以，z-cull只有在分支有一定连贯性的情况下才能提供性能提升。

![image-20190801103431570](http://ww4.sinaimg.cn/large/006tNc79gy1g5jxdct25xj310w0b643w.jpg)

z-cull并不是分支选择的处理，只是他能够让着色器不去执行分支选择。z-cull是一个可以跳过很多无用工作的基于一个静态和预处理的强力的手段。

### 分支指令

现代GPU一般都支持。如果空间比较连续，效率更高。

![image-20190801105008398](http://ww2.sinaimg.cn/large/006tNc79gy1g5jxtkh5zsj311i0ekq6t.jpg)

### 选择合适的分支功能

选择分支功能是基于分支里的代码量以及表现的状态数量。对于短分支（2-4个指令），推荐使用预测。对于嵌套在大程序里的分支，推荐使用分支指令而不是z-cull。使用z-cull需要保存所有的程序状态，在一个单独的Pass中处理分支。然而，如果能够高效地分离程序里的分支元素的话，z-cull能提供最好的效率。

## 自己查的资料

作为初学者，对静态和动态分支的概念不是很理解。稍微谷歌了一下。

找到一个很理想的[概念解答](https://forum.unity.com/threads/branches-how-expensive-are-they.152411/)。 

静态分支(static branching)：是同样的分支在整个draw call始终会被调用。比如基于Shader的属性和非per-vertex/per-pixel数据（常数之类的）。这种分支通常来说没有问题。虽然有些开销，但是GPU可以比较轻松的对所有的vertices/pixels中应用相同的代码。

动态分支(dynamic branching)：是当你对每一个vertex/pixel进行处理的时候条件会不同。GPU处理器会把对顶点用同样的代码进行处理，然后如果其中有的数据是别的分支的话，那么GPU的处理器会再运行对顶点/像素等再用另外一个分支进行处理一边然后抛弃之前的。为了保证效率，最好数据是空间连续的。

一些旧的处理器和Shader Models（比如Unity默认的SM2.0)并不支持动态分支。Unity会内部进行处理。
【CSSのキホン】CSSって何をするの？

<h2>はじめに</h2>

こんにちは。
<a="https://www.miraidenshi-tech.jp/intern-content/program/">未来電子テクノロジー</a>でインターンをしているshinoです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

今回は、CSSとは何なのか？CSSの基本についてまとめます。

<h2>CSSってなに？</h2>

CSSとは、HTMLで作り上げた要素の、色・大きさ・配置を設定する言語です。

HTMLが文章構成を作り上げる言語だとしたら、
CSSはそれを見やすくデザインする言語と言えるでしょう。

<h2>CSSで何ができるの？</h2>

<h3>文字に色をつけられる</h3>

CSSでは、文字に色づけができます。
色を指定するには、colorプロパティを使用します。


```Python:HTML
<h1>おでんはモチきんちゃく</h1>
```

HTMLで構成した要素に

```Python:CSS
h1 {
   color :ff0000;
}
```

CSSで、｛color :ff0000;｝のようにコードで色を指定できます。

<h3>文字の大きさを調整できる</h3>

CSSではfont-sizeプロパティで文字の大きさを調節できます。

```Python:CSS
h1 {
   font-size :30px;
}

```
このように、px(ピクセル)という単位を用いて文字の大きさを細かく調整できます。

<h3>字体を変えられる</h3>

文字のフォントを変更するには、font-familyというプロパティを使用します。

```Python:CSS
h1 {
   font-family :"Avenir Next";
}

```
フォント名内にスペースがある場合はクオーテーションマーク（””）を付け忘れないようにしましょう。

<h3>まとめ</h3>

このように、CSSを使用することでサイトのデザイン性を高められます。

以上、CSSのキホン機能をご紹介しました。
[Laravel5.5×PHPStorm]vagrant(Homestead)上でテストケースを動かすススメ

## 概要
せっかくLaravelを使うのだから、Homesteadを立ち上げて開発したい。
PHPStormでHomesteadを連携させると、PHPStormのToolsから操作出来てとても便利だ。
今度はテスト駆動開発をしてみよう。

せっかくだからデータベーステストはHomesteadのmysql（任意のサーバー）でやりたいな！
・・・おや、デフォルトだとできないぞ？

という人向けの記事です。

なお想定環境は
PHP 7.2
Laravel 5.5
PHPStorm 2019.1
となっております。

## とりあえず手順を教えろ

PHPStormの`File`ボタンから
`Settings` `Languages & Frameworks` `PHP` `Test Frameworks`
を順番に押し、`Test Frameworks` の設定画面の左カラムのプラスボタンを押す
`PHPUnit by Remote Interpreter` を選択

`Interpreter` で未設定の場合 `<no interpreter>` になってると思うので、右側の `...` ボタンを押す
`CLI Interpreters` が開く
左カラムのプラスボタンを押す
`From Docker, Vagrant, VM, Remote...` と書かれている場所を選択
`Configure Remote PHP Interpreter` が開く
すでにHomesteadをPHPStormに連携していればvagrantを選択した時点で選択される。それを確認して `OK` を押す
`CLI Interpreters` に `Remote PHP 7.2` が追加されたのを確認し `OK` を押す
`PHPUnit By Remote Interpreter` のダイアルログに戻る。セレクトボックスに先ほど設定した `Remote PHP 7.2` が増えているはずなのでそれを選択し `OK` を押す
`Test Frameworks` の画面に `Remote PHP 7.2` を確認したら `OK` を押す

次に再びFileボタンから
`Settings` `Languages & Frameworks` `PHP`
を順番に押し、PHPの設定画面にある
`CLI Interpreter` で先ほど作成した `Remote PHP 7.2` を選択する

かんりょう！！
全くのゼロから始めるボードゲームのプログラミングと機械学習 [5日目] 

#前回の振り返り
[全くのゼロから始めるボードゲームのプログラミングと機械学習 \[4日目\] \- Qiita](https://qiita.com/Coshian23/items/8bfb41194c42e7313c1f)

- Pygameの歴史について
- Pygameのインストール
- 画面を描画してみる

なんとかかんとかPygameを使用してゲーム制作の入り口へ半歩ぐらい入ってまいりました。入り口に。

#ここまでのあらすじ
なんと前回の更新から9ヶ月が経ってしまいました。
最終的なゴールはPythonでゲームを再現し、機械学習を用いてAIを作成するというところでしたがPygameの導入あたりで家庭の事情により長期間停止しておりました。

若干私生活が落ち着いてきたことと、機械学習の研修を受けたらモチベーションが上がってきたことにより恥ずかしながら当プロジェクトを再開させていただきたいと思います。

#一旦参考書から脱却
[Pythonゲームプログラミング入門 \| Will McGugan, 杉田臣輔, 郷古泰昭 \|本 \| 通販 \| Amazon](https://www.amazon.co.jp/Python%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-Will-McGugan/dp/4048704397/ref=sr_1_14?s=books&ie=UTF8&qid=1540967866&sr=1-14&refinements=p_n_feature_seven_browse-bin%3A3232405051)
ここまでの取り組みでは上記参考書を元に勉強を進めてまいりましたが、一旦本書を離れようと思います。基本的な画面表示と入力について学べたので自分が目標としているレベルのゲームのためには十分だと考えたからです。また、モチベーションを保ち続けるためにも「まずはとりあえず作ってみよう」と思い立ったからです。

#PythonのIDE(統合開発環境)PyCharmを導入
本格的にPythonでプログラムを書き始めるということでIDEを導入致しました。とりあえず評判がよさそうだったPyCharmを選定。下記サイトを参考にいたしました。

[PyCharmのインストール方法（Windows） \| ガンマソフト株式会社](https://gammasoft.jp/python/pycharm-install-on-windows/)

とりあえずはお約束の「Hello World!」表示まで完了。

#今後の予定
1. ボードゲームをプログラミング
    2. Pythonの基礎勉強
    3. Pygameの基礎勉強
    4. ボードゲームの実装　👈
2. ボードゲームのAI作成
3. 機械学習によるAI強化

しばらくはPygameを使ってのグラフィックスの勉強になると思います。

#今回の振り返り
- やったこと
    - 恥ずかしながら再開いたしました
    - とりあえずゲームの実装をはじめてみようと決意
    - PyCharmを導入致しました
- わかったこと
    - モチベーションをどう保つかは重要
    - 意外なきっかけでやる気が復活することもある
    - 何事も最後までやりきることが大切
- つぎにやること
    - PycharmとGithubの連携
    - カルカソンヌの骨子を実装
はじめてのNeoVim（Vim操作徹底編）


[前回](https://qiita.com/hisayuki/items/dec5bb1dbeb2b3785443)はVimからのGit操作をPluginを入れることで出来るようにしました！
これで心置きなく、設定ファイルをイジって動かなくなるようなことがあっても簡単に戻せるようになりました。

さて、ここからはどんどんPluginを入れて便利にして行くのですが・・・
tomlファイルを編集するのも当然Vimでやります。

そうすると・・・Vimを使い始めてすぐだと、どうしても方向キーやBackSpaceなどを使って編集したくなります。
普段使ってると、意識してても癖で使っちゃいますよね。

## 封印

というわけでVimの基本操作以外で使わないキーを**封印**します。

```vim:init.vim

" ------------------------------------------------------------                                    
"  key bind                                    
" ------------------------------------------------------------                                    
" defult nop                                    
vnoremap  <Up>     <nop>                                    
vnoremap  <Down>   <nop>                                    
vnoremap  <Left>   <nop>                                    
vnoremap  <Right>  <nop>                                    
vnoremap  <BS>     <nop>                                    
inoremap  <Up>     <nop>                                    
inoremap  <Down>   <nop>                                    
inoremap  <Left>   <nop>                                    
inoremap  <Right>  <nop>                                    
inoremap  <BS>     <nop>                                    
noremap   <Up>     <nop>                                    
noremap   <Down>   <nop>                                    
noremap   <Left>   <nop>                                    
noremap   <Right>  <nop>                                    
noremap   <BS>     <nop> 

```

これで、NormalMode、InsetMode、VisualModeすべてで方向キーとBackSpaceキーを**封印**できます。
ついつい押してしまっても、何も起きなくなるのでVimでの操作をせざる負えなくなります。

今回は方向キーとBackSpaceキーしか封印してないですが、他にも封印したいキーがあれば同じ要領でできます。

## まとめ
今回はこれだけなのですが、結構大事です。
まだ使い始めて1週間くらいですが、今でもInsertModeで押しちゃいますが何も起きないので**気づく**ことができます。
そうすると、Vimでの操作に切り替えられるので操作徹底が出来るようになりました。

ぜひ、設定することをオススメします！

## ブックマーク
[はじめてのNeoVim（初期設定編）](https://qiita.com/hisayuki/items/99ea1b667de71e908891)
[はじめてのNeoVim（Git導入編）](https://qiita.com/hisayuki/items/dec5bb1dbeb2b3785443)
シェーダー勉強会まとめ

# 第0回

## 画像付きで自分で解説する。

https://glslfan.com/

![スクリーンショット 2019-08-01 10.13.11（3）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199120/ae411a05-77c9-8bc5-bae1-a20f8cc02be4.png)

```glsl
// - glslfan.com --------------------------------------------------------------
// Ctrl + s or Command + s: compile shader
// Ctrl + m or Command + m: toggle visibility for codepane
// ----------------------------------------------------------------------------
precision mediump float;
uniform vec2  resolution;     // resolution (width, height)
uniform vec2  mouse;          // mouse      (0.0 ~ 1.0)
uniform float time;           // time       (1second == 1.0)
uniform sampler2D backbuffer; // previous scene

void main(){
    vec2 p = gl_FragCoord.xy / resolution;
    vec4 col = vec4(p, mouse.y, 1.1);
    if(length(mouse.xy - p.xy) < abs(sin(time)) / 3.0) {
        col = vec4(0.0, 0.0, 1.0, 1.0);
    }
    gl_FragColor = col;
}
```

`void main` からの解説

### vector

```glsl
vec2 p = gl_FragCoord.xy / resolution;
vec4 col = vec4(p, mouse.y, 1.1);
```

- vec2 Float32[2]のList
- vec3 vec4 -> Float[3-4]
    - 値を取り出す際は x y z w の順番で取り出せる。

こういう感じで作成することも可能

```glsl
vec4 tmp = vec4(vec3(vec2(0.1, 0.1), 0.1), 0.1);
vec4 sample = vec4(tmp.xyzw)
```
### if(length(mouse.xy - p.xy) < abs(sin(time)) / 3.0)

length関数
mouse.xy と p.xyの距離を算出できる。(?)

それを sin(time) で一定期間で変更させる。

![三角関数の推移グラフ](https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Circle_cos_sin.gif/300px-Circle_cos_sin.gif)

それをabs(絶対値表現　マイナスがなくなる形に変換)

### col = vec4(0.0, 0.0, 1.0, 1.0); RGBAの形式

青色だけ表示させるように変更

### gl_FragColor = col;

組み込み関数 `gl_FargColor` へ `4vec` を渡す事によりピクセルの色を確定させる

## 今回の勉強会で出た資料一覧


### sandbox

- [GLSL Sandbox Gallery](http://glslsandbox.com/)

### 入門記事

- [GLSLについてのメモ - Qiita](https://qiita.com/edo_m18/items/71f6064f3355be7e4f45)
- [wgld.org | GLSL |](https://wgld.org/d/glsl/)
- [Inigo Quilez ：： fractals, computer graphics, mathematics, shaders, demoscene and more](http://iquilezles.org/www/articles/distfunctions/distfunctions.htm)
    - なんか物体のレンダリングができるらしい 
- [固定長進行レイマーチングやってみたので簡単なサンプルと解説 - やぎりのブログ](http://yagiri000.hatenablog.com/entry/2018/09/13/190006)
- [［GLSL］ レイマーチング入門 vol.1 - Qiita](https://qiita.com/edo_m18/items/034665d42c562da88cb6)
- [2017年度GLSLお役立ちシート - Qiita](https://qiita.com/7CIT/items/b73ed02569ed402627ad)
- [GLSL で暖を取るための準備をしよう！ GLSL お役立ちマニュアル - Qiita](https://qiita.com/doxas/items/5a7b6dedff4bc2ce1586)
- [Tokyo Demo Fest 2018](http://tokyodemofest.jp/2018/)
- [ComputeShader入門 - Google スライド](https://docs.google.com/presentation/d/1d90NXENGfw4MWD0xkuTp7fYwUEF9LjKrxzpaClSc1vk/edit#slide=id.g184dad75d0_0_246)
PowershelllでAWS定常作業を時短(主にEC2)

http://ruby.kyoto-wu.ac.jp/info-com/Softwares/cygwin.html

##前提

AWSCLI64PY3.msi をインストールする。
awscliのパスを通す※インストーラウィザード経由で、自動に繋がる




```cmd:
aws configure
```
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html
で設定

[2019.8.2追記]

```cmd:
aws s3 ls
```
で「Access Denied」が表示した際、再度 aws configureの設定を入力すると解消した
[設定](https://qiita.com/n0bisuke/items/1ea245318283fa118f4a)


##Tips


※以下、冪等性担保の為に、スクリプト修正予定


configで設定したリージョンにあるEC2の情報をPsCustomObjectに格納

```Powershell:
 $obj = aws ec2 describe-instances | Out-String |ConvertFrom-Json
```



###EC2　PublicDNS取得

実証環境で、ElasticIPなどを設定しておらず、起動毎に変わるPublicIPをメモ帳に書く作業が発生した際

```Powershell:
$obj.Reservations.Instances.PublicDnsName >> ""D:\workspace\note.txt""
```

###EC2 一斉開始
戻り値もJSON、runnningコードが16

```Powershell:
 aws ec2 start-instances --instance-id  $obj.Reservations.Instances.InstanceId
```

###EC2 一斉停止

```Powershell:
 aws ec2 stop-instances --instance-id  $obj.Reservations.Instances.InstanceId
```



##参考
http://acoustic-groove2.hatenablog.com/entry/2017/11/25/020824
Windowsライクな画面分割がMacでできるshiftltが超便利な件

## shiftltとは？
特にMac信者でもなく両刀使いでWindows歴も長かった私ですが
Windows→Macへの移行で困ったことの一つが画面分割でした。

windowsなら「Windowsキー + 矢印」で画面をきれいに分割できますが、
これはMacではできないんだろうかと。

MacOSには仮想デスクトップという概念がありますが、
私はいまいち使いません。
Windowsと一緒で「Command + Tab（Alt + Tab）」でアプリ切り替えでよくね？と思ってしまいます。
（もちろん便利な時もありますが…）

そんな時、画面分割できるアプリがありました！
それが**Shiftlt**！

## ダウンロードはこちら

https://github.com/fikovnik/ShiftIt/releases

zipをDLしてappを起動するだけです。

使ってみて気に入れば、常駐にするといいですね。

## ショートカットは
私はショートカットは
Command + Option + Control（⌃⌥⌘）に矢印で→右寄せ、←左寄せ、↑上寄せ
で使ってます。
一番は右寄せ、左寄せを一番使いますね。


参照：https://iphone-trouble.biz/mac-screen-split-shiftlt-apps
ServerlessFrameworkでLambdaをデプロイした際の環境変数の挙動について調査

- ブラウザ上で環境変数を変えた後にデプロイした場合
    - 環境変数は上書きされず、維持される。
- ブラウザ上で環境変数を削除した場合
    - 元に戻らない。
- ブラウザ上で環境変数を増やした場合
    - 元に戻らない。増やした環境変数も消えない。
- yml上で環境変数を変えた場合
    - 環境変数が増えた。消えた環境変数も復活。
- Lambda「a」の環境変数をブラウザ上で消した後、「b」のLambdaの環境変数をyml上で消した時、「a」のLambdaの環境変数は？
    - aの環境変数は消えたままで、Bの消した環境変数が消える。

## 結論
- yml上の環境変数が変更された時にyml上の環境変数が適用。すべてが上書きされる。
- yml上で環境変数を変えなければ、コード変更のみがデプロイされ、環境変数は維持される。
- 複数のLambdaを単一のymlで管理している場合でも、環境変数が変更されたLambdaのみに変更が影響し、他のLambdaには影響しない。

つまり、環境変数のみをブラウザ上で変更して運用していた場合、次のデプロイでもし1文字でも環境変数が変更されていたらすべてが消え、yml上の環境変数が上書きされる。
なので、環境変数だからといってブラウザ上で変更せず、必ずyml上でデプロイする！
好きなサイトをダークモード化してみる。

# 概要

ダークモードって良いですよね。
[Darkmode.js](https://darkmodejs.learn.uno/)を使って、好きなサイトをダークモード化してみます。

# 使うもの

* [Darkmode.js](https://darkmodejs.learn.uno/)
* Chrome DevTools

# やり方

1. ダークモードにしたいなぁというサイトをChromeで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365084/80d56864-5610-fb4e-74e7-4364b89be8a0.png)
2. `DevTools`を立ち上げます。
3. Consoleタブを開き、以下を2回に分けて入力します。

    ```javascript
(script = document.createElement('script')).src = 'https://cdn.jsdelivr.net/npm/darkmode-js@1.4.0/lib/darkmode-js.min.js';
document.getElementsByTagName('head')[0].appendChild(script);
    ```
    ```javascript
new Darkmode().showWidget();
    ```

4. ダークモード化されます。（結構アレな見た目ですが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365084/8ec0aff5-6230-ecc1-ef75-8a1fabb3b11a.png)

5. 画面右下のダークモード切替え用のウィジェットをポチポチして、通常モードとダークモードを切り替えます。

# 参考
[Chrome開発者ツールのコンソールでJavaScriptライブラリを読み込む - dackdive's blog](https://dackdive.hateblo.jp/entry/2017/10/24/135041)
IoT マイコン系セミナー情報

マイコン関係のセミナー情報です。
#メーカー主体
##・CQエレクトロニクス・セミナー
https://seminar.cqpub.co.jp/sch/all

##・ルネサスエレクトロニクス　半導体セミナー
https://www.renesas.com/jp/ja/support/training/seminar.html

##・STマイクロエレクトロニクス　セミナー情報
https://www.stmcu.jp/event/

##・アナログデバイセズ　セミナー
https://www.analog.com/jp/about-adi/jp_seminar_info.html

##・LT Spice　（セミナーサイトが無いため、トップページ）
https://www.ltspice.jp/

##・ラティスセミコンダクター　オープンセミナー
https://www.latticesemi.com/ja-JP/Support/Training

##・XILINX　ザイリンクス　トレーニングコース
http://www.hdlab.co.jp/web/x500x/

##・日本パルスモーター　パルスコントロールLSI　基礎学習セミナー
https://www.pulsemotor.com/event/seminar.html

##・サイプレス　ワークショップ
*方針転換の為、メーカー主体のワークショップは基本やらないとのこと
販社セミナーを期待
https://japan.cypress.com/workshops

##販社主体

##・マクニカ　セミナー情報
https://www.macnica.co.jp/business/semiconductor/events/

##・富士エレクトロニクス　ワークショップ・セミナー一覧
https://lab.fujiele.co.jp/seminar/

##・Avnet　トレーニング 
https://www.avnet.com/wps/portal/japan/resources/training-and-events/

#コミュニティ系
##・IoT　あるじゃん
https://algyan.connpass.com/event/137379/

##・JellyWareクラゲのIoTイベント
https://jellyware.connpass.com/

#・AWS Loft
https://aws.amazon.com/jp/start-ups/loft/tokyo/events/
現在、マイコン系はありませんが、いつか、AmazonRTOS系のイベントをやりたいところです。

##・JAWS-UG
https://jaws-ug.jp/
同じくAWS系のJAWSのイベントです。
短縮形のカラーコードで表現できる色一覧

# はじめに
カラーコードは`#ffffff`のように、16進数6桁で表現することが多いが、2桁区切りで同じ値が連続する場合は`#fff`のように3桁で表現することもできる。例えば下記は同じ色を表す。

```css
.myColor {
    color: #112233;
}

.myColor {
    color: #123;
}
```

6桁よりも3桁の方がすっきして見やすくはなるものの、表現できる色の数は減ってしまう。でもぶっちゃけ3桁で表現できる色の数も相当あるはず…そこで、3桁で表せる色一覧を出力するサンプルを作ってみた。

# 3桁のカラーコードで表現できる色一覧

```html:color_list.html
<!doctype html>
<meta charset="utf-8">
<title>短縮系の色一覧</title>

<div id="color_list"></div>
<script>
    (function() {
        "use strict";
        var i, j, k, number, html, color;

        html = "<table><th>number<th>color<th>code";
		number = 1;

        for (i = 0; i < 16; i = i + 1) {
            for (j = 0; j < 16; j = j + 1) {
                for (k = 0; k < 16; k = k + 1) {

                    color = i.toString(16) + j.toString(16) + k.toString(16);

                    html += '<tr><td>' + number + '<td style="background-color:#' + color + '"><td>' + color;
                    number = number + 1;
                }
            }
        }
        html += '</table>';

        document.getElementById('color_list').innerHTML = html;

    }());
</script>
```
全部で4096色！
LinuxでRadeonの周波数／電圧を変更して使う

#なぜに記事にしたか
　英語だと記事があったけど、日本語の情報が無かったので
　自分へのメモ

#環境
　OS: Manjaro Linux (kernel 4.19)
　GPU: Radeon RX480

#やりかた
　※複数カードを刺している人等は適宜パスを変更してください

##カーネルパラメータ変更
　これをしないと電圧などを弄れない

```console
$ sudo vim /etc/default/grub
```
　でGRUB_CMDLINE_LINUX_DEFAULTにamdgpu.ppfeaturemask=0xffffffffを追加
　具体的には

```console
GRUB_CMDLINE_LINUX_DEFAULT="amdgpu.ppfeaturemask=0xffffffff quiet"
```
　みたいにして、

```console
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
```
　で、GRUB設定を反映し再起動

##周波数／電圧制御をマニュアルモードにする
```console
$ sudo sh -c "echo manual > /sys/class/drm/card0/device/power_dpm_force_performance_level"
```

##GPU周波数／電圧を読む
```console
$ cat /sys/class/drm/card0/device/pp_od_clk_voltage
OD_SCLK:
0:        300MHz        800mV
1:        608MHz        818mV
2:        910MHz        824mV
3:       1077MHz        856mV
4:       1135MHz        870mV
5:       1180MHz        880mV
6:       1200MHz        900mV
7:       1250MHz        930mV
OD_MCLK:
0:        300MHz        800mV
1:       2000MHz        930mV
OD_RANGE:
SCLK:     300MHz       2000MHz
MCLK:     300MHz       2250MHz
VDDC:     800mV        1175mV
```
　みたいなのが出てくる。

* OD_SCLK部分がレベル／GPU周波数／GPU電圧
* OD_MCLK部分がレベル／メモリ周波数／メモリ電圧
* その下は変更できる範囲

##周波数、電圧を変更してみる
　変更は
　"変更対象 レベル 周波数 電圧"
　をpp_od_clk_voltageにリダイレクトする。

　GPUの周波数／電圧を変えるならsを

```console
$ sudo sh -c "echo s 7 1250 930 > /sys/class/drm/card0/device/pp_od_clk_voltage"
```
　メモリの周波数／電圧を変えるならmを

```console
$ sudo sh -c "echo m 1 2000 930 > /sys/class/drm/card0/device/pp_od_clk_voltage"
```

##変更した周波数／電圧をコミットする
```console
$ sudo sh -c "echo c > /sys/class/drm/card0/device/pp_od_clk_voltage"
```

##なんなら確認する
```console
$ watch -n 0.5 sensors
```

#んで、何をするか
　低電圧化して消費電力を減らし、ディープラーニングを走らせました。

#参考文献
カーネルパラメータについて
　https://wiki.archlinux.jp/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF#GRUB
GPUオーバークロック
　https://wiki.archlinux.org/index.php/AMDGPU#Overclocking
Linuxカーネルガイド
　https://dri.freedesktop.org/docs/drm/gpu/amdgpu.html#power-dpm-force-performance-level

#まとめ
　ファイルに文字列リダイレクトするだけで色々できるUnixは素晴らしい
HTML/CSSとは

Webページは、HTML/CSSという言語で作成できる

HTMLは、箱やテキストの存在を定義するための言語

CSSは、箱やテキストを装飾するための言語

<img width="789" alt="HTML_CSS.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/cadf3243-18ac-68a8-9adc-325168278e4e.png">
Python でN日前の日時を取得する

# Python でN日前の日時を取得する

pythonで日時を扱うためにはdatetimeモジュールを使う。
PHPなどでサポートされている2 days ago などの文字列からインスタンス化することはできないので、素直に計算して取得する。
日時の加算・減算を扱うためには timedeltaモジュールを使う。

```
>>> import datetime
>>> print (datetime.datetime.now())
2019-08-01 10:06:25.553554
>>> date = datetime.datetime.now() - datetime.timedelta(days=2)
>>> print(date)
2019-07-30 10:06:30.572633
```
Xilinx FPGA UltraScale+ のWindows用MCAPの確認について

XilinxのAR#64761のWindows用MCAP確認用GUIは、UltraScale+でも利用できる。

XilinxのAR#64761のWindows版ドライバーはUltraScale用であり、UltraScale+では使えない。UltraScale+用にソースコードの修正が必要。
window10でchainer,dcganのメモ

####動作環境
Windows10 Home
GTX1080ti

####Anacondaのインストール
https://www.anaconda.com/

####CUDA
https://developer.nvidia.com/cuda-toolkit-archive

####cuDNN
https://developer.nvidia.com/rdp/cudnn-download

####環境作成
Anacondapromptを起動
仮想環境の作成
`conda create -n [仮想環境名] python=3.7 jupyter`
仮想環境の一覧
`conda info --envs`
仮想環境の起動
`cond activate [仮想環境名]`
仮想環境の停止
`conda deactivate`
####chainerをインストール
`pip install chainer,cupy`

```python:バージョン確認
import chainer
chainer.__version__
'6.2.0'
```
####DCGANのexample
git clone https://github.com/chainer/chainer.git
※chainer\examples\dcgan

####dcganのトレーニング、画像出力
`python train_dcgan.py --gpu 0`
cifar-10がダウンロードされたあとに学習が始まります

```
Device: @cupy:0
# Minibatch-size: 50
# n_hidden: 100
# epoch: 1000

Downloading from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz...
```

####学習済みモデルと出力画像
モデル　result
出力画像　result\preview
![image00283000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239978/1415440d-95ca-6faf-f942-b4a743427173.png)
Linuxで 便利に使える ツール集（字余り）

掲題の通りですが、成果をここにも上げていきます。

# シェルスクリプト

## 1. 文字コード・改行コード一括置換

[TOPPERS](https://www.toppers.jp/)の過去の成果物がまさしくそれなのですが。

成果物をダウンロードして展開してみたら、文字コードがUTF-8でない（例えばShift_JIS）、改行コードがCR+LFだった、などということはよくあります。

このままだとLinuxで使い辛くてしょうがないので、

* ディレクトリを再帰的に検索
* テキストファイルならUTF-8/LFに置換

するスクリプトを用意しました。
2番目の「テキストファイルなら」がなければ、すっきりとワンライナーで書けそうですが・・・。

```sh
#!/bin/sh

#テキストファイルならUTF-8/LFに置換する
ConvTextFile() {
  a=$(file --mime "$1" | grep "charset=binary")
  if [ -z "$a" ]; then
    echo $1
    nkf -w --overwrite -Lu $1
  fi
}

#変換対象のディレクトリをパラメータ指定
#指定なしなら、カレントディレクトリが対象
TOPDIR=.
if [ $# -gt 0 ]; then
  TOPDIR=$1
fi

#再帰的にサーチして変換していく
for f in `\find $TOPDIR`; do
  ConvTextFile $f
done
```

特に解説は不要ですね（雑）。

また、同じものは[GitHub](https://github.com/imagou/QiitaSource/blob/master/tools/conv_char_code.sh)に置いてあります。

# おわりに

今後も粛々と更新予定。

# 参考

感謝申し上げます！

**ファイルがバイナリ形式かどうか判別する - Qiita**
https://qiita.com/kozy4324/items/8c327c6aad64cd820d29
【メモ】Linuxでよく使うコマンドメモ（随時更新）


## 概要

Linuxでこんなコマンドあるかな？って疑問に思って調べた結果を備忘録の目的で貼り付けて行きます。

※主にCentos系のコマンドですので注意


## ファイルの検索

ファイルの中身に◯◯が含まれるファイル名（path付き)を抽出


```shell
find ./ -type f -print | xargs grep '検索したい文字列'
```


## 同名のファイルがいくつあるか検索
同じファイル名を検索してそのファイルの利用度を調べたい時に必要になった

```shell
find ./  -name ファイル名  | wc -l
```

## ログに特定の文字列が含まれる更新だけ表示
tailコマンドでログの更新を監視する際に、監視対象を除外する目的で使用

```shell
tail -f ファイル名 | grep '文字列'
```

## ディスク容量を調べる

ディスクの空き容量を調べる

```shell
df -h
```

## コマンド履歴を検索

あれ？さっきやったコマンド何だっけ？

```shell
history | grep '覚えてるワード'
```

## コマンドの場所を調べるには
このコマンドはどこの実行ファイルが動いてるの？

```shell
$ which git
/usr/local/bin/git
```
Nuxt.jsでthis.oooが呼べなかった

## 背景
Nuxtをいじっていて、特定のメソッドで`this.ooo`が呼べない問題に遭遇して、しばらく原因がわからず悩んでいた。

## 結論
以下のようにアロー関数で記述していたが、

```javascript
methods: {
            funcName: () => {
                 // ~ logic ~
            },
            funcName2: () => {...
```

こうしないと駄目だった。

```javascript
methods: {
            funcName: function() {
                 // ~ logic ~
            },
            funcName2: function() {...
```

## 原因
アロー関数はthisの値を束縛しない(レキシカルに束縛する)ので、Vueインスタンス内のメソッドにアクセスできないことが原因でした。

※アロー関数
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

## 補足
ちゃんとVueのドキュメントなどに書いてある。
> メソッド(例 plus: () => this.a++) を定義するためにアロー関数を使用すべきではないことに注意してください。アロー関数は、this が期待する Vue インスタンスではなく、this.a が undefined になるため、親コンテキストに束縛できないことが理由です。

https://jp.vuejs.org/v2/api/#methods

ちゃんとドキュメント読もうな俺＾＾
Java(JVM)でスネークケースのJSONをキャメルケースのフィールドに対応させる

`@JsonNaming`を利用すればOK

```java
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Hoge {
    private String hogeHoge; // hoge_hoge
    private String fooFoo; // foo_foo
    private String piyoPiyo; // piyo_piyo
}
```
digコマンドでELBのIPを調べる

# IPを知りたかった
virtualhostで切ったサイトに対してELBをかませてあるので、hostsに書くのは、ELBのIPを書かない限り、ローカルでみることができない。どうしたらいいのか・・・

## digコマンドを使う
awsのコンソールから自身の作成したELBをクリックすると、DNS名をみることができます。これを引数にして、digコマンドを使えばみることができます。


```
$ dig A ELBのDNS名
```
Windows8.1環境でOpenProjectを動かす

# [環境]
Windows 8.1 Pro 64ビット
Docker ToolBox 18.09.3
openproject/community:8(Docker版)
※最新版は9だが、一度コンテナをstopすると動作しなくなるため、8を使用
# [手順]
### 1)DockerTookBoxのインストール
DockerToolbox-18.09.3.exe
### 2)ホストOS用イメージのダウンロード
#### 2-1)プロキシ環境下の場合、HTTPS_PROXY,HTTP_PROXYを設定
HTTP_PROXY=http://username:password@proxy.xxx.com:8080
HTTPS_PROXY=http://username:password@proxy.xxx.com:8080
※認証なしPROXYの場合、「username:password@」は不要
　なお、ユーザ名、パスワードはURLエンコードする事
　例：ueki005@gmail.com ⇒ ueki005%40gmail.com
#### 2-2)Docker Quickstart Terminalを起動
### 3)コンテナの作成
#### 3-1)docker-compose.ymlの作成
version: '3'
services:
  openproject:
    image: openproject/community:8
    ports:
      - "30080:80"
    environment:
      SECRET_KEY_BASE: secret
    container_name:
      opnprj01
    restart: always
※ボリュームのマウントはうまくいかなかったので(とりあえず)削除
  起動時にpgdataへの書き込みでエラーが出るので、ファイルシステムの違い（Windows）が原因かも
  別コンテナからのマウントで、再チャレンジ予定
#### 3-2)docker-composeコマンド発行
docker-compose up -d
### 4)動作確認
chromeまたはedge、firefoxにて以下のURLにアクセス
http://192.168.99.100:30080
### 5)外部からアクセスする場合
サービスを外部に公開する場合、NAT+ホストオンリーアダプターで構成し、
NAT側で高度⇒ポートフォワードの設定を行なう。
例：
物理マシンのLANポート   ：10. 81.38.14/255.255.252.0
NAT                    ：192.168.56.1/255.255.255.0 ←ココにポートフォワード設定
ホストオンリーアダプター：192.168.99.100/255.255.255.0

ポートフォワード 10. 81.38.14:30080 <-> 192.168.99.100:30080
JanusGraphことはじめ

# JanusGraphとは
グラフデータベースで一番使われているのはNeo4jで環境が充実しているのですが、デフォルトのクエリ言語はCypherです。これは別に悪くないのですが、汎用的という意味ではApache Tinkerpopフレームワークを使ったGremlinが使いたいなと思うことがあります。OSSのグラフデータベースでは、[Titan](https://titan.thinkaurelius.com/)が有名かなと思っていたのですが、開発が止まっているようで、Forkされた[JanusGraph](https://janusgraph.org/)を使うのが筋がよさそうです。

JanusGraphでは、バックエンドのデータベースとしてcassandra, HBASE, Berkeley DBが使えるようです。今回はJunusGraphをサーバ（Gremlin Server)として公開するための手順を試してみます。ちなみに、Berkeley DBをバックエンドで指定したコンテナはDocker HUBで[公開](https://hub.docker.com/r/janusgraph/janusgraph)されています。

# 準備
[ここ](https://github.com/JanusGraph/janusgraph/releases)から最新版をダウンロードします。動作にはJVM1.8が必要です。展開したら、デフォルト設定（cassandra)であればすぐに起動できます。以下の例は、その後にすぐに停止をしています。

```
$ cd janusgraph-0.4.0-hadoop2
$ ./bin/janusgraph.sh start
Forking Cassandra...
Running `nodetool statusthrift`... OK (returned exit status 0 and printed string "running").
Forking Elasticsearch...
Connecting to Elasticsearch (127.0.0.1:9200).. OK (connected to 127.0.0.1:9200).
Forking Gremlin-Server...
Connecting to Gremlin-Server (127.0.0.1:8182)..... OK (connected to 127.0.0.1:8182).
Run gremlin.sh to connect.

$ ./bin/janusgraph.sh stop
Killing Gremlin-Server (pid 926)...
Killing Elasticsearch (pid 709)...
Killing Cassandra (pid 273)...
$ ./bin/janusgraph.sh clean
Are you sure you want to delete all stored data and logs? [y/N] y
Deleted data in /mnt/e/Works/Tinkerpop/janusgraph-0.4.0-hadoop2/db
```

## 設定ファイル
バックエンドの変更や、エンドポイント（Websocket、HTTP）、認証などの設定は、コンフィグファイルを変更して、`gremlin-server.sh`への引数で指定します。上記のjanusgraphはデフォルトのコンフィグファイルを自動的に読み込むものです。

`conf`フォルダにはサンプルの設定がすでに設定されています。ここではバックエンドの変更をしたいので、インメモリのデータベースを使う設定を作ってみます。これは、主としてテスト用に使うものです。`/conf/gremlin-server`内の`gremlin-server.yaml`をコピーして、以下の部分を書き換えます。参照するバックエンドのプロパティファイルを指定しています。

```gremlin-server-inmemory.yaml
graphs: {
  graph: conf/gremlin-server/janusgraph-inmemory.properties
}
```

参照先のプロパティファイルは以下のようにします。

```gremlin-server-inmemory.properties
gremlin.graph=org.janusgraph.core.JanusGraphFactory
storage.backend=inmemory
```

## 起動
準備が終えたら、スクリプトで起動するだけです。以下のコマンドで起動できます。SLF4Jをきちんと設定していないせいか、ログがたくさん出ます。

```
./bin/gremlin-server.sh conf/gremlin-server/gremlin-server-inmemory.yaml
```

## 接続
付属のGremlin Consoleで接続してみます。まず、:remoteで接続先を指定しています。
接続先にコマンドを送るためには、**:>**という記号が必要となります。

```
./bin/gremlin.sh

         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.hadoop
plugin activated: tinkerpop.spark
plugin activated: tinkerpop.utilities
plugin activated: janusgraph.imports
gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Configured localhost/127.0.0.1:8182
gremlin> :> graph.addVertex("name", "stephen")
==>v[4288]
gremlin> :> graph.addVertex("name", "stephen")
==>v[4200]
```

# 終わりに
Berkeley DBなどについても、同様にコンフィグ、プロパティファイルを記述すれば大丈夫ですが、接続先のElasticsearch（Indexを管理）やBerkeley DBの情報を追記しないとダメっぽいです。ここは先に紹介した[Docker](https://hub.docker.com/r/janusgraph/janusgraph)で起動するのが楽そうです。


# 参考
- [JanusGraph Documentation](https://docs.janusgraph.org/0.4.0/)
VRMMO:リアルタイム通信part2

##始めに
今回の記事は完全に理論段階です。
あしからず。

## json utilityの問題点
 json utilityによる圧縮、解凍を行うと、それだけで90fpsを維持出来なくなります。
(  json utilityによるjsonシリアライズ速度を参照)
そこで、伝送する情報を最小限に抑えた上で、シリアライズせずに伝送する手段を考えました。
削れるのは、ゲームオブジェクトそのものに関する情報、と考えました。
コンポーネント及びスクリプトの幾らかも削れるやもしれません。

##リアルタイム性
リアルタイム性を以下のように定義します。
「Aクライアント上で、アバター PがXというアクションをした時、Bクライアント上でも、アバター PがXというアクションをする。」
シリアライズは行いません。

##どのように達成するか
あらかじめ、アクションを記号化します。
つまり、文字aをアクションXに割り当てます。
(aという信号を受け取ったならば、アバター KはXというアクションを行う。)
そして、文字列のみネットワーク送信します。
これにより、伝送された文字列を元に、自クライアントにおいて、他ユーザのアクションを再現出来ます。
(文字列の配列から、アクションの順番の正しさが保証されます。)
前段階として、生成されたユーザn人に番号を振っておき、識別可能とします。
これにより、 jsonの利用はアバター 読み込み時のみとなります。
必要に応じ、アバター 識別番号とアクション文字列をバイナリなどに加工します。

##課題
・nクライアントのnアバター への対応
・ボイスチャットなど、単純なアクションに置換することが難しいものについて、いかにリアルタイム性を保証するか
・文字とアクションの紐付け
・自クライアントにおける他ユーザアバター のアクション制御
・クライアント接続数の把握
・「ポート接続を維持しつつ自分以外の全てのクライアントに文字列を送信」の実現
・gRPCの解析
・magic onionの解析
・nクライアントの状態の取得更新

以上です。

お読み頂きありがとうございました。
【EC-CUBE4】②EC-CUBE本体の開発環境を整える（GitHub Flow編）

EC-CUBE4の環境構築続きです。
[【EC-CUBE4】①EC-CUBE本体の開発環境を整える（インストール編）](https://qiita.com/junpeko5/items/199af36a31a335a73d38)

## 前提条件

- Mac
- PHP7.2がMacローカル環境にインストール済み
- gitがインストール済み
- EC-CUBE4がローカル環境にインストール済み（<a href="https://qiita.com/junpeko5/items/199af36a31a335a73d38">【EC-CUBE4】EC-CUBE本体の開発環境を整える（インストール編）</a>の続きです）

## 方針

- データベースはsqlite3を利用
- webサーバーはビルドインウェブサーバーを利用。



## 構築手順

EC-CUBEがインストールされたディレクトリに移動する。

```
$ cd path/to/EC-CUBEがインストールされたディレクトリ
```

現在のブランチを確認します。EC-CUBEでは4.0ブランチがmasterブランチに相当します。

```
$ git branch -a
* 4.0
  remotes/origin/3.0
  remotes/origin/3.1
  remotes/origin/4.0
  remotes/origin/HEAD -> origin/4.0
  remotes/origin/co/master
```

リモートリポジトリを確認します。
cloneしてきたリポジトリのURLが表示されています。

```
$ git remote -v
origin	https://github.com/[GitHubUser(ご自身のアカウント)/ec-cube.git (fetch)
origin	https://github.com/[GitHubUser(ご自身のアカウント)/ec-cube.git (push)
```

EC-CUBE本家のリモートリポジトリをリモートに追加します。
https://github.com/EC-CUBE/ec-cube

```
$ git remote add upstream https://github.com/EC-CUBE/ec-cube.git
```

upstreamという名前で登録していますが、お好きな名前でOK
です。

登録されているかの確認をします。

```
$ git remote -v
origin	https://github.com/junpeko5/ec-cube.git (fetch)
origin	https://github.com/junpeko5/ec-cube.git (push)
upstream	https://github.com/EC-CUBE/ec-cube.git (fetch)
upstream	https://github.com/EC-CUBE/ec-cube.git (push)
```

4.0ブランチを本家からfetchします。

```
$ git fetch upstream 4.0
From https://github.com/EC-CUBE/ec-cube
 * branch                4.0        -> FETCH_HEAD
 * [new branch]          4.0        -> upstream/4.0
```

upstream/4.0のリモート追跡ブランチが作成されます。

最後に開発用の作業ブランチを本家のリモート追跡ブランチ（upstream/4.0）から切ります。

```
$ git checkout -b test-branch upstream/4.0
Branch 'test-branch' set up to track remote branch '4.0' from 'upstream'.
Switched to a new branch 'test-branch'
```


開発が終わったら、commitとpushをoriginにプッシュします。

```
$ git add /path/to/file
$ git commit -m "コメント"
$ git push origin test-branch
```

あとは、Githubの自分のリポジトリからプルリクエストを送れば完了です。
プルリクエストが送られた時点で、Travis CIのテストが自動的に実行されます。

下記URLは公式ドキュメントですが、わかりやすい図が載っていますので参考にしてみてください。
http://doc4.ec-cube.net/collaboration_githubflow

## その他よく使用するgitコマンド

### ローカルの4.0ブランチを最新にしたい場合
ローカルの4.0ブランチで

```
$ git pull upstream 4.0
```
を実行します。

### 不要になったローカルブランチを削除

```
$ git branch -D <削除したいbranch名>
```

### 不要になったリモートブランチを削除

```
$ git push --delete origin <削除したいリモートbranch名>
```

### プルリクエストのブランチをチェックアウトする。
```
$ hub checkout <pullリクエストのURL>
```
例：`$ hub checkout https://github.com/EC-CUBE/ec-cube/pull/4223`

## 最後に

これでGitHub FlowでのEC-CUBE開発環境が整いました。
次回は[【EC-CUBE4】③EC-CUBE本体の開発環境を整える（MYSQL,MailCatcher編）](https://qiita.com/junpeko5/items/3316b654b4b80ee59376)をお送りします。
【UiPath】ライセンスのアクティベーション

# 目的
商用版UiPathにて、ライセンスをアクティベーションする。

# UiPath Studioの場合
初めてインストール＆起動した場合、Community Editionと同じようなアクティベーションを促す画面が表示されるので、指示に従ってアクティベーションを行えばよい。

Studio ライセンスのアクティブ化
https://studio.uipath.com/lang-ja/docs/activating-your-studio-license

# UiPath Robotの場合
Studioのような画面は表示されないので、コマンドラインによるアクティベーションを行う。

## コマンドラインによるアクティベーション

```
<Installation Folder>\UiPath\regutil.exe activate /email=documentation@uipath.com /code=1234567890
```

コマンドラインを使用したライセンスのアクティベーション
https://docs.uipath.com/studio/lang-ja/docs/activating-your-studio-license#section-activating-your-license-using-the-command-line

# プロキシ設定
もしUiPathを利用するPCがプロキシ環境内にあり、アクティベーションに問題があるようなら、プロキシ設定を確認する。

オンラインアクティベーション用のプロキシ設定を構成する
https://robot.uipath.com/lang-ja/docs/configuring-proxy-settings-for-online-activation

# ライセンスの切替
試用版を使っていて製品版へ切り替える場合など、ライセンスキーが変更になる場合は、コマンドラインからライセンスキーを変更する。

# ライセンスの確認
Studioの場合は、画面を見れば分かる。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/84c851b9-4762-e7a9-957b-fd57db48f8b3.png)

Robotの場合は、コマンドラインで確認する。

```
<Installation Folder>\UiPath\regutil.exe get-info
```
↓実行結果のサンプル(？)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/9b37577b-9c8b-4893-5fe0-a04fa043a50d.png)
GCP アップデート (7/26-8/1 2019)

### Load-Balancer: [July 26, 2019](https://cloud.google.com/load-balancing/docs/release-notes#july_26_2019)
- LBとバックエンド間のHTTP/2がベータになったよ。
- ヘルスチェックでHTTP/2がベータになったよ。

### Cloud TPU: [July 29, 2019](https://cloud.google.com/tpu/docs/release-notes#july_29_2019)
- Cloud TPUがTensorFlow 1.14をサポートするよ。1.11はサポート外に。
  - エラーメッセージが分かりやすくなったよ。
  - オブジェクトディテクションコードベースを最適化したよ。

### GKE: [July 29, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#july_29_2019)
- gcloud v256.0.0からVPC-nativeはデフォルトじゃなくなったよ。代わりにroutes-basedモードが使われます。
  - VPC-native使う場合はオプション設定してください。
  - VPC-nativeはgcloud251~255とコンソールから、routes-basedはREST使った場合のデフォルトになってます。

### Load Balancer: [July 30, 2019](https://cloud.google.com/load-balancing/docs/release-notes#july_30_2019)
- Internal HTTPロードバランサがベータになったよ。
  - リージョナル、プロキシベースのL7ロードバランサ。

### Spanner: [July 31, 2019](https://cloud.google.com/spanner/docs/release-notes#2019-07-31)
- regionalインスタンスがsouthamerica-east1に来たよ。

### Compute: [July 31, 2019](https://cloud.google.com/compute/docs/release-notes#july_31_2019)
- CPU最適化インスタンスがGAになったよ。
  - C2いまはus-central1(b/c)とeurope-west4(b/c)のみ。

### stackdriver: [July 31, 2019](https://cloud.google.com/stackdriver/docs/release-notes#july_31_2019)
- stackdriver debuggerがCloud Run、Cloud Run on GKEに対応したよ。
  - 対応しているのはnode.js、python、java

### AI Platform: [Aug 1, 2019](https://cloud.google.com/ml-engine/docs/release-notes#august_1_2019)
- AI Platformのトレーニング/プレディクションのドキュメント改定したよ。
  - 元々フレームワークごとに別の章に書かれていたのを統合した。

### dataflow: [Aug 1, 2019](https://cloud.google.com/dataflow/docs/resources/release-notes-service#may_16_2019)
- Apache bean 2.14.0以上でpython3がベータになったよ。
  - 3.5、3.6、3.7が対象。
  - 2.7でDirectRunnerやDataflowRunnerで実行していたパイプラインは利用可能(python3への書き直しは必要)
  - python3で開始された一部の構文はまだ[未サポート](https://issues.apache.org/jira/browse/BEAM-1251)なので注意。

### GKE: [Aug 1, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#august_1_2019)
- マスタとノードの自動アップグレードが一時的に止まっているので注意。
  - 結果、ヨーロッパとUSの一部のゾーンのみでアップデートされてます。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Ubuntu MATEを載せたRaspberry PiからデジタルマイクSPH0645LM4HとI2S通信する。

RaspbianからI2Sを行う方法については記事が見つかりますが、Ubuntu MATEを使ったものは見当たらなかったのでまとめました。

目標
====
Raspberry Pi 3 model BにUbuntu MATEを入れ、デジタルマイク[SPH0645LM4H](https://www.switch-science.com/catalog/3207/)とI2S通信する。

インストール手順
================
- 公式ページ(https://ubuntu-mate.org/download/ )からUbuntu MATEをダウンロードし、Raspberry Pi 3 model Bに書き込む。今回使用したのは、ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img。

- /boot/config.txtに以下を追加で書き込む。

```
dtparam=i2s=on
```

- /etc/modulesに以下を追加で書き込む。

```
snd-bcm2835
```

- リブートする。

```bash
sudo reboot
```

- snd\_bcm2835などのモジュールがロードされていることを確認。

``` bash
lsmod | grep snd # snd_bcm2835 などが表示されるはず。
```

- linux imageのアップデートおよびlinux headerのインストール。

```bash
sudo apt update
sudo apt install linux-image-raspi2 # 今回インストールしたバージョン：linux-image-raspi2/bionic-updates,bionic-security,now 4.15.0.1041.39 armhf
sudo apt install linux-headers-raspi2 # 今回インストールしたバージョン：linux-headers-raspi2/bionic-updates,bionic-security,now 4.15.0.1041.39 armhf
```

- リブートする。

```bash
sudo reboot
```

- i2sをコンパイルする準備ができていることを確認。

```bash
sudo mount -t debugfs debugs /sys/kernel/debug # mount: debugs already mounted or mount point busy. などと表示されるはず。
```

- カーネルモジュールをmakeするためのパッケージをインストール。

```bash
git clone https://github.com/PaulCreaser/rpi-i2s-audio
cd rpi-i2s-audio
```

- カーネルモジュールをmakeして作成し、カーネル本体にロードする。

```bash
sudo apt install make gcc git bc libncurses5-dev bison flex libssl-dev
make -C /lib/modules/$(uname -r )/build M=$(pwd) modules
sudo insmod my_loader.ko
```

- audioグループに自分のユーザを追加する。

```bash
sudo adduser $USER audio
```

- ユーザの追加を反映させるため、ログアウトしてログインする。

- Raspberry Piをブートするたびに、今回作成したカーネルモジュールを自動でロードできるようにする。

```bash
cd rpi-i2s-audio
sudo cp my_loader.ko /lib/modules/$(uname -r)
echo 'my_loader' | sudo tee --append /etc/modules > /dev/null # 先ほど書いたsnd-bcm2835と改行されて書かれているか確認する。
sudo depmod -a
sudo modprobe my_loader
```

- リブートして設定完了。

```bash
sudo reboot
```

- SPH0645LM4HとRaspberry Piを配線でつなぐ。ピン接続は以下のようにする。

| SPH0645LM4H |   Raspberry Pi  |
| ----------- | --------------- |
|     3V      |   pin1 (3.3V)   |
|     GND     |   pin6 (GND)    |
|    BCLK     | pin12 (PCM\_CLK)|
|    DOUT     | pin38 (PCM\_DIN)|
|    LRCL     |  pin35 (PCM\_FS)|
|     SEL     |  Not connected  |


テスト
======
・マイクデバイスの一覧を表示し、「snd\_rpi\_simple\_card」があることを確認。

```bash
arecord -l
```

・arecordというコマンドから音声を保存する。ノートPCなどで再生できればテスト成功！

```bash
arecord -D plughw:1 -c2 -r 48000 -f S32_LE -t wav -V stereo -v file_stereo.wav
```

・pyaudioからも読める。

```python
import pyaudio
p = pyaudio.PyAudio()
for index in range(p.get_device_count()):
    print(p.get_device_info_by_index(index)['name'])
    print('')
```


参考
====
- https://tomosoft.jp/design/?p=11471
- https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-and-test

（これらのサイトの環境はRaspbianだが自分の環境はUbuntu MATEなので、細かい違いがある）
Railsでスクレイピング Mechanizeの基礎

#はじめに
スクレイピングを補助するgemであるMechanizeを使って、
要素・タグ内のテキスト・タグの属性値を取得するまでをまとめていこうと思います。
#事前準備
gemのインストールを行います。
GemfileにGemを追記します。

```
gem 'mechanize'
```
ターミナルでGemをインストールします。

```
$bundle install
```
#要素などを取得するまでの流れ

1. Mechanizeクラスをインスタンス化する
2. HTML情報を取得
3. HTML情報から要素を取得
4. 要素からテキストや属性値を取得

ざっくりとした流れはこのような感じです。
次は一つ一つの流れを具体的にまとめていきます。
##Mechanizeクラスをインスタンス化する
まずはMechanizeクラスをインスタンス化します

```ruby:
agent = Mechanize.new
```
##HTML情報を取得
Mechanizeクラスのgetメソッドを使ってHTML情報を取得します。

```ruby:
agent = Mechanize.new
page = agent.get("http://hogehoge.com")
```
getメソッドの戻り値はMechanize::Pageオブジェクトです。
Mechanize::Pageオブジェクトは、HTML構造を解析した結果とスクレイピングを行うためのメソッドを持ちます。
##HTML情報から要素を取得する
###searchメソッド
HTML情報の中から指定したHTML要素を取得します。

```ruby:
agent = Mechanize.new
page = agent.get("http://hogehoge.com")
elements = page.search('h2 a')
```
引数に'h2 a'を渡していますが、これはh2要素とa要素を取得するという意味ではありません。
CSSのセレクタのように、h2要素の下のa要素を取得するという意味になります。
また、'.hoge'のようにクラス名で取得することも可能です。

戻り値は配列となります。
取得する対象となる要素が1つしかない場合でも配列で返ってきますので注意しましょう。
###atメソッド
使い方はserachメソッドと同じですが、戻り値が異なります。
取得する対象となる要素が複数あってもすべては取得せずに、最初の要素だけを取得します。

```ruby:
agent = Mechanize.new
page = agent.get("http://hogehoge.com")
element = page.at('h2 a')
```
##要素から、テキストや属性値を取得する
###inner_textメソッド
タグ内のテキストを取得する際に使用します。

```ruby:
agent = Mechanize.new
page = agent.get("http://hogehoge.com")
element = page.at('h2 a')
element.inner_text
```
###get_attributeメソッド
タグの持つ属性値を取得する際に使用します。

```ruby:
agent = Mechanize.new
page = agent.get("http://hogehoge.com")
element = page.at('h2 a')
element.get_attribute('href') # element[:href]でも可
```
#終わりに
Mechanizeの基礎的な使い方をまとめてみました。
今回は要素・タグ内のテキスト・タグの属性値を取得する方法をまとめましたが、
他にもリンクをクリックしたり、フォームに入力して送信するなど、色々なことが可能だそうです。
また機会があったらそのあたりもまとめようと思います。