OmniAICreator/Qiita-1.07M huggingface dataset:
npmで他のモジュールと依存関係がありますみたいな警告が出て、モジュールが「Cannot find module」になってしまう場合

##環境
仮想環境のOS：Ubuntu
react:16.7.0
webpack:4.28.2

## 状況1
「webpack-cli」をインストールした後、このように出力されました。
以下、エラー内容です。reactやreact-domと依存関係にあります的な警告が出て、
「webpack-cli」モジュールが見つからないというエラーが出てしまいました。

```
npm WARN The package react is included as both a dev and production dependency.
npm WARN The package react-dom is included as both a dev and production dependency.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ webpack-cli@3.2.3
updated 1 package in 12.168s
{ Error: Cannot find module 'webpack-cli'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at runCommand.then (/home/vagrant/.nvm/versions/node/v8.10.0/lib/node_modules/webpack/bin/webpack.js:142:5)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7) code: 'MODULE_NOT_FOUND' }
```

##状況2
何度もyesと入力してインストールしても、
また以下のように表示されてしまう

```
One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
 - webpack-cli (https://github.com/webpack/webpack-cli)
   The original webpack full-featured CLI.
We will use "npm" to install the CLI via "npm install -D".
Do you want to install 'webpack-cli' (yes/no)
```

## 解決方法
「webpack-cli」をグローバルインストールすることにしました。

```
npm install -g webpack-cli
```

その結果、以下のようにwebpackを動かすことに成功しました。

```
Hash: f9c9b485a1a36c8d4c10
Version: webpack 4.28.3
Time: 4263ms
Built at: 2019-02-24 05:57:22
   Asset     Size  Chunks             Chunk Names
test2.js  111 KiB       0  [emitted]  main
Entrypoint main = test2.js
[7] (webpack)/buildin/global.js 878 bytes {0} [built]
[8] ./src/main.js + 1 modules 2.79 KiB {0} [built]
    | ./src/main.js 225 bytes [built]
    | ./src/Hello.js 2.56 KiB [built]
    + 7 hidden modules
```

## 注意
ただ、グローバルインストールはあまり控えるべきらしいです。。。
https://mosapride.com/index.php/2018/02/06/post-681/
上記のサイトのように、「グローバルインストールしたパッケージはpackage.jsonに記載されない。つまりグローバルインストールすることを前提にREADME.mdなどに注意事項を書く必要が出て来るため構築時に作業量が増える。またグローバルインストールのバージョンが管理外になるため同一の環境になる保証がない」

とあります。今回グローバルインストールしたらなんとかエラーが出ず動くようになったので、それ以外の解決方法があれば教えてくただけると幸いです。。。
VisualStudioのXAMLデザイナを拡張する 3.拡張機能をデバッグする

作った拡張機能をデバッグするために、[Walkthrough: Debugging WPF Custom Controls at Design Time](https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/bb514636%28v%3dvs.100%29)を参考にしてみたのですが、シンボルが読み込まれず断念してました。
試行錯誤してみたらなんかできたので、記録しておきます。
# 環境
Visual Studio Community 2017

#1.デバッグ対象のコントロールを配置したプロジェクトを開く
[第一回](https://qiita.com/aya_ceso/items/9174e5a56830aeb54025)の6.で作成したような、デバッグ対象のコントロールを配置したプロジェクトを開きます。
#2.対象のコントロールを配置したXAMLファイルを開き、XAMLデザイナを表示させる
この手順を飛ばすと次の手順がうまくいかないかと思います。
#3.新しくVisual Studioを起動し、1.で開いたプロジェクトを開く
1.で開いているVSはそのままで、新しくVisual Studio(以下新VS)を起動します。
#4.新VSで、[デバッグ] - [プロセスにアタッチ]を選択
アタッチ先のプロセスがずらっと出てくるので、「XDesProc.exe」を選択します。
2つ出てくる場合は、新VSのものも出てきてるのだと思うので、タスクマネージャで新VSの「Microsoft Visual Studio XAML Designer」を終了したり起動時にXAMLファイルが表示されないようにしたりと工夫すればいいかと思います。
もちろんどっちかがデバッグ対象のプロセスだと思うので、うまくいかない場合は別プロセスにアタッチしなおすでもいいかと思います。
#5.新VSでデバッグしたい箇所にブレークポイントを配置
Providerクラスのコンストラクタあたりからはブレークできると思います。
AttributeTableのGetterはブレークしませんでした（多分デザイナが表示されてからだと遅い）
#6.旧VSでブレークポイントを通るような操作を実行
第一回のサンプルコードでいえば、Activateメソッドにブレークポイントを置けば、CustomButtonをクリックしたときにブレークします。
Google ColabでHelloWorld

# はじめに
* TensorFlowで機械学習やりたい！だけど、自分のローカルに環境構築するのめんどくさい。
* １台セットアップしたけど、持ち運びノートで使いたい！
* てかGPU使いたい！それもタダで

こんな要望を叶えてくれる「Google Colaboratory」
使わない手はないだろうということで早速やってみることに。

メリットデメリットなど概要が以下のサイトにまとまっているので参考にしてほしい
https://www.codexa.net/how-to-use-google-colaboratory/

## きっかけ
Twitterの特定のハッシュタグがついたツイートのリツイート数を数えたいという相談を受け、APIでやればいいんでは？と思ったが制限がありイマイチ求める回答にならないこと（件数とか、回数とか）があり別の方法を検討することに。
「Twitter Scraper」を使用すれば実行できそうな感じの記事を見つけたので参考させていただきました。
https://sleepless-se.net/2018/08/29/twitter-scraper-tweetapi/

# Hello World!
使ったことないツールなのでHelloWorldだけ、あとは参考サイトを参照してやりたいスクレイビングは行う。
1. Googleドライブで新しいフォルダを作成し、アプリの追加を行う。
<img width="1060" alt="スクリーンショット 2019-02-24 10.24.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/20aa5e3b-8ddf-10bf-f589-254af7fb7e56.png">
1. Colaboratoryを追加する。　
<img width="746" alt="スクリーンショット 2019-02-24 10.27.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/9ff0f9ee-6761-afcb-4242-605ae2e0a469.png">
1. 作成したフォルダ内で、右クリックし、「Colabpratory」を選択する
<img width="1026" alt="スクリーンショット 2019-02-24 10.30.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/d0649416-2700-6875-8bd4-1ee5b1bb9c87.png">
1. pythonで記載ができるのでそのあとはスクリプトを書いて実行を繰り返す。
<img width="610" alt="スクリーンショット 2019-02-24 14.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/4937eddf-a6e1-7a4b-ffe1-c1d62ba70b14.png">
1. 以下のスクリプトを記入し、実行（SHIFT　+ Enter)!

```python:
print("Hello, World. ")
```

<img width="496" alt="スクリーンショット 2019-02-24 14.55.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/85c0700c-2118-dcb7-3961-1e17634d6c9d.png">

# その他
## GPUを使用する
1. [編集]>[ノートブックの設定]<br>

<img width="479" alt="スクリーンショット 2019-02-24 15.01.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/4454f8a8-5eb0-7dd4-4a25-24d08dbd0227.png">
2. [ハードウェアのアクセラレータ]からGPUを選択<br>
<img width="539" alt="スクリーンショット 2019-02-24 15.01.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/85c7315d-b64b-b7ea-4029-ba00233ca116.png">
<img width="544" alt="スクリーンショット 2019-02-24 15.02.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/232184/cc0717f1-1f79-27de-a94a-81d3276bb72e.png">
忙しい人のためのIntel SGX インストールマニュアル[備忘録]

本記事はWindowsを対象としています。

### 1.下記をインストールしてください。
- Intel SGX SDK
    - Visual Studio Pluginのチェックボックスにチェックを入れる。
- Visual Studio 2017 (communityでok)
    - C++ によるデスクトップ開発のみで良い。
    - 公式では2015が推奨されているが2017でも動くようです
    - 2017をインストールした場合、Remote Attestationをするときにopenssl周りでトラブルがあるかもしれません
    
### 2.新規プロジェクトの作成（コピー）
`C:\Program Files (x86)\Intel\IntelSGXSDK\src\SampleEnclave`からプロジェクトごとコピーしてきます。新規プロジェクト作成もやりましたが、ぶっちゃけ設定面倒なので、試すだけならコピーしたほうが早いです。

F5でBuild & Runすると、

```
Checksum(*******, 100) = ********
Info: executing thread synchronization, please wait...
Info: SampleEnclave successfully returned.
Enter a character before exit ...
```

以上で完了です。次回はHelloWorldやりたいと思います。


Let's enjoy!
Reactのクラスメソッドをarrow関数で書きたい時

# 概要
reactでクラスでコンポーネントを作成するときにクラスメソッドをarrow関数で書けるとbindとか省略できて楽ですよね。でも@babel/preset-envと@babel/preset-reactだけでバンドルするとエラーが発生してしまいます。
調べてみたら@babel/plugin-proposal-class-propertiesをインストールしてbabelの設定に組み込むと使えるそうなので紹介したいと思います。
ちなみに[このサイト](https://medium.com/@joshblack/writing-a-react-component-in-es2015-a0b27e1ed50a)を参考にしています。リンク先ではbabel-plugin-transform-class-propertiesを使ってますが@babel/plugin-proposal-class-propertiesが最新らしいのでこちらで記述した例で説明しています。

# やりたいこと
Reactでボタンをアクションを行いたいとき以下のようにコンポーネントを書きます。

``` test.jsx
class Test extends React.Component {

  handle() {
    console.log('test')
  }

  render() {
    return (
      <Button onClick={this.handle.bind(this)}>Test</Button>
    );
  }
}
```

または、constructorにbindをひとまとめにして以下のようにすることもできます。

``` test.jsx
class Test extends React.Component {
  constructor(props){
    super(props);
    this.handle = this.handle.bind(this);
  }
  ...
}
```

ボタン一つとかならこれでもいいんですけど複数コールバックができてくるとつけ忘れたり削除忘れたりコード量が増えたり面倒臭いです。

ここでES2015で追加されたarrow関数はthisをデフォルトで引き継いでいるのでこのbindを省略して以下のように書くことができるだろうと思って

``` test_arrow.jsx
class Test extends React.Component {

  handle = () => {
    console.log('test')
  }

  render() {
    return (
      <Button onClick={this.handle}>Test</Button>
    );
  }
}
```

npmで以下をインストールして

```
npm install --save-dev @babel/preset-env @babel/preset-react babel-loader
```

webpack.config.jsのpresetsを以下のように記述して

```webpack.config.js
{
    presets: [[
        "@babel/preset-env", {
            "useBuiltIns": "entry",
            "targets": {
                "esmodules": true
            }
        }],
        "@babel/preset-react"
    ]
}
```

バンドルすると以下のようなエラーが出てしまします。

```
SyntaxError: test_arrow.js: Support for the experimental syntax 'classProperties' isn't currently enabled :
```

これを解消できるのが@babel/plugin-proposal-class-propertiesになります。


# 手順
- @babel/plugin-proposal-class-propertiesをインストールする
- webpackのloaderの設定を行う

まずはnpmで@babel/plugin-proposal-class-propertiesをインストールします。

```
npm install --save-dev @babel/plugin-proposal-class-properties
```

webpack.config.jsのmoduleで以下のようにloaderに追加します

```webpack.config.js
{
    presets: [[
        "@babel/preset-env", {
            "useBuiltIns": "entry",
            "targets": {
                "esmodules": true
            }
        }],
        "@babel/preset-react"],
    plugins: [
        '@babel/plugin-proposal-class-properties',
    ],
}
```

この設定でバンドルすることにより先ほどのエラーはなくなりarrow関数でクラスメソッドを書けるようになります

# まとめ
@babel/plugin-proposal-class-propertiesを使うことでクラスメソッドをarrow関数で書くことができるようになりました。
ちなみにarrow関数ではない関数とも併用して使うこともできます。


# おまけ

ちなみに元記事によるとこの@babel/plugin-proposal-class-propertiesはarrow関数をクラスメソッドで使えるようになるだけではなく以下のような機能も使えるようにしてくれます

## クラスの中にPropsTypeを書ける

```sample.jsx
class Test extends React.Component {
  static propTypes = {
    message: React.PropTypes.string
  }
}
```

## スプレッド演算子でcomponentに値を渡せる

```sample2.jsx
class Warning extends React.Component {
  static propTypes = {
    message: React.PropTypes.shape({
      title: React.PropTypes.string,
      text: React.PropTypes.string
    })
  }
render() {
    return (
      <Message
        {...this.props.message}
        type="error"
      />
    );
  }
}
```

英語は苦手なので詳しいことは読めてないですが参考までに
Atom開発環境の設定(メモ)

#Atom開発環境の設定

#注意事項
説明が書かれていないものは随時追記していきます:v:


##目次
・対象者
・インストール方法
・入っているプラグイン


##対象者
自分....メモなので
あと１つのエディタにまとめるのは文字コードや改行コードなどが変更されないようにするためです。
心のどこかでは誰かの役に立てるといいなと思っています。

##インストール方法
・[File]→[Settings]→[Install]
・Ctrl + ,

##インストール済プラグイン
### <A HREF=https://atom.io/packages/japanese-menu>japanese-menu</A>
日本語化を行う。英語が不得意なので使っています。
1番にインストールしたプラグインです。

### <A HREF=https://atom.io/packages/advanced-open-file>advanced-open-file</A>
・使い方
advanced-open-fileの使い方は簡単で、Windows || Linuxであれば Ctrl + Alt + O、Macなら Cmd + Alt + O でパレットが開くので、ディレクトリ〜フォルダを選択していけば、目的のファイルが簡単に探し出せ & 開くことができます。
階層が深い場合開くのに時間がかかる為実装しました。
![YYX5yxQ.jpg](https://qiita-image-store.s3.amazonaws.com/0/263673/b0f451a4-c8ad-1534-50e9-28ba0f4a34c5.jpeg)

### <A HREF=https://atom.io/packages/file-icons>file-icons</A>
・アイコンに色をつける
・アイコンを表示しないテーマでも強制的に表示する
・ファイルが編集された時のみアイコンに色をつける
・タブペインにもアイコンを表示する
![atom-file-icons-after.jpg](https://qiita-image-store.s3.amazonaws.com/0/263673/584133a5-be59-618c-e8cb-7c0618444b76.jpeg)

### <A HREF=https://atom.io/packages/find-list>find-list</A>

### <A HREF=https://atom.io/packages/linter>linter</A>

### <A HREF=https://atom.io/packages/linter-php>linter-php</A>

### <A HREF=https://atom.io/packages/linter-ui-default>linter-ui-default</A>

### <A HREF=https://atom.io/packages/minimap>minimap</A>
私の勉強用としてまだまだ使えるレベルではありませんが、会社のソースコードは長い為、下の方に行くのにはスクロールでは時間と労力をかけるべきではないことから実装しました。

### <A HREF=https://atom.io/packages/pigments>pigments</A>

### <A HREF=https://atom.io/packages/platformio-ide-terminal>platformio-ide-terminal</A>
ターミナルを使えるようにするプラグインです。
linuxコマンドが使えることが一番のメリットです。
![platformio-ide-terminal.png](https://qiita-image-store.s3.amazonaws.com/0/263673/23350b31-de96-97ec-af65-af4ec56f265b.png)

### <A HREF=https://atom.io/packages/split-difft>split-diff</A>
・使い方
マウスの右クリックを押下し、Split Diffを押下する
これはWinMergeという差分を取るものもありますが、私が文字コードや改行コードを理解していないことや変わっていることに気づかないこともあり、エディターを一つにしたいと思い実装しております。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/263673/43808fbf-b63a-6ea9-bbd4-3c335ec4233a.png)

### <A HREF=https://atom.io/packages/tabs-to-spaces>tabs-to-spaces</A>
Dockerのprivilegedでハマった

# 症状
**ホストOS起動時のコンソールに現れるホスト名にコンテナのIDが表示される症状が現れました。**

## 環境
DockerComposeの利用において以下の環境で症状が発生しました。
ホストOS：CentOS7
コンテナ：CentOS7
この条件においてコンテナ内でsystemdを使用したかったので、Googleで調べるとprivilegedを利用すれば良いということで、docker-compose.yamlに以下を追記しました。

```
privileged: true
```

## 調査
・Dockerが悪いのかを切り分けるために、Dockerのサービスを無効化して起動
　→ 正常動作
　　→ Dockerで問題が発生したことが確定

・どのコンテナが悪いのが切り分けるために、1つずつコンテナを消して起動を繰り返す
　→ privileged オプションを含むコンテナを起動させると症状が再発
　　→ さらに該当コンテナからprivilegedを削除して起動
　　　→ 正常動作
　　→ privileged が原因と判明

## 対策
結論からいくとprivilegedをやめ、以下のオプションに置き換えることで症状が無くなりました。

```
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
```

それぞれのオプションを簡単に説明します。

```
    cap_add:
      - SYS_ADMIN
```
コンテナの capabilities の追加を行います。※指定できる capabilities に関しては[こちら](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)
systemdを利用するためには「SYS_ADMIN」が必要のようです。

```
    security_opt:
      - seccomp:unconfined
```
これはDockerが行うシステムコールを制限するオプションで「unconfined」は無効化する事を意味しています。※詳しい情報は[こちら](https://docs.docker.com/engine/security/seccomp/)

```
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
```
これは、こちらの方の記事を参考にしました。
[systemd in docker container without --privileged](https://qiita.com/shusugmt/items/92ece6874ba5aeff2b41)
ホストOSでsystemdが動いている時にこの設定が有効とのこと。

症状が起きた端末では**「privileged」**の代わりに、これらの3つのオプションに置き換えることで症状が改善しました。
同じような症状に悩む方の参考になればと思います。
yum installで"パッケージは使用できません"と出る際の対応

#はじめに
下記のような、CentOS 7でyum installした際のエラー"パッケージ~は利用できません" の一対応のメモです。
想定環境は、Linux(CentOS7)ですがUbuntuなどでもほぼほぼ同等=yumをapt-getに変えるだけなのかな...?

```
[root@localhost]# yum install dia
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
パッケージ dia は利用できません。
エラー: 何もしません
```

#考えられる原因
yum installでは、レポジトリ（意味のあるまとまりでパッケージを複数格納している場所のことです。）を参照して実行するようで、逆に***リポジトリ内に存在しないパッケージは落とせません。***
>Qiita【パッケージ】Linuxの「パッケージ」と「yum」と「rpm」について勉強したのでまとめてみた。https://qiita.com/sksmnagisa/items/05a6f8a707010b8bea56

上記でいうと、yum install diaができない（パッケージdiaは利用できませんと出る）
のは、diaという名のパッケージがインストールする際に参照する***レポジトリ***の設定がうまくいってない場合があります。

#解決方法 
***パッケージのレポジトリがわからない場合***
rpm <パッケージ名> centos7 で調べると公式が出てきます。
dia以外、試していないですが...

スクロールすると、Downloadの下にInstall Howtoがあるので、おすすめです。
rpm dia centos７で検索した場合、Install Howtoはこのような形で出てきます！！ 
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/89182/9f1a4b88-869b-6eb8-5718-1cde1f66b99d.png)

パッケージ名diaは、epel-release をインストールする必要があることがわかります。


***参照するレポジトリがわかっている場合***

リポジトリがインストール、有効化されていますか?  確認方法は下記です。

```
yum repolist all
```
レポジトリがないのであれば、レポジトリをインストールします。

```
yum install <レポジトリ名>
```
無効であるならば、レポジトリを有効化します。

```
yum-config-manager --enable-repo <リポジトリ名>
```


最後に、yum installを行います。

```
yum install <パッケージ名>
```


ご参考までに。
Angularで、Componentにキーイベントを取得させる

# 概要

Angularでちょっとしたコンポーネントを作ったところ、「ショートカットキー欲しいなー、でもcanvasのaddEventListenerよろしくコンポーネントにキーイベント追加する方法見つからないなー」と思ったのでググったところ、日本語の情報がない。
StackOverflowやら公式のAPIやらをあれこれ参考にしてうまく行ったので備忘に書く。
コンポーネントではなく画面全体のキーイベントを取得させたいならdocument.onkeyup等を使ってください。

# 手順

keyupについては以下の２つの両方をすればOK。多分他のkey系イベントでも使えると思われる。

* Angular特有のkeyupを使ってキーイベントを受け取るにはフォーカス可能でなければならないので、ComponentにTabIndexを付与する
* HostListenerデコレータを使ってkeyupイベントに対応するメソッドをComponentのメンバとして作成する

というわけで出来上がったのが以下のコード

```src/app/example/example.component.ts
import { Component, HostBinding, HostListener } from '@angular/core';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent {

  @HostBinding('tabIndex') tabIndex:string;//tabIndexを付与するため、ComponentにtabIndexをバインドするメンバを用意
  constructor() {
    this.tabIndex="0";//TabIndexを付与。これをしないとフォーカスできないのでコンポーネントに対するキーイベントを取得できない。
  }
  @HostListener('keyup',['$event'])//対応するイベントを第一引数に、その結果を渡す引数名を第二引数に指定
  onKeyUp(event:any) { //イベント取得時の処理を記述。メソッド名は自由。
    console.log(event);
  }
}
```

見えやすくするだけだけども一応cssも

```src/app/example/example.component.css
/*
見やすくするためだけのCSSなので消してもOK
*/
p {
  background-color:#0000ff;
  height:100px;
}
:host {
  display:block;
  background-color:#ff0000;
  height:400px;
}
```

あとはng generate componentしたときのまんま

# バージョン

[前の記事](https://qiita.com/Hayakuchi0/items/cc4c86973cab7770ca3c)を参照

#参考

https://stackoverflow.com/questions/44758299/angular-2-keyup-enter-for-div-tag
https://qiita.com/yasshcy/items/b3147a2415ee390bde4a
https://angular.io/api/core/HostListener
[前の記事](https://qiita.com/Hayakuchi0/items/cc4c86973cab7770ca3c)
IntelliJ IDEAでCan't register given path of type 'SOURCE' because it's out of content rootと出たときの対処法

IntelliJ IDEAは仕様でContent root内にない物を受け付けないようです（よくわかってない）
そこで、シンボリックリンクを無理やりContent root内に作成すれば回避することができました。
Windowsの方は、コマンドプロンプトを管理者で起動して、

```ruby:コマンドプロンプト
mklink /d [Content root内の作りたいパス] [本物のディレクトリのパス]
```

でシンボリックリンクを作成できます。
お試しください。
githubに画像を保存して画像を使う方法

## はじめに
画像を外部サービスで管理するのはダサい！
せっかくgithub pagesで公開したのだから、全てgithub内で完結させたい！

ということで、githubに画像をアップロードして、その画像を参照するようにしたいと思います。


## 空ブランチを切る
まず、空のブランチを切ります

```
git checkout --orphan images
```

元々すべてのファイルがステージングされてしまっているのでリセットします

```
git reset
```

追加したい画像をディレクトリ内に持ってきてpushするだけ

```
git add sample.jpg
git commit -m 'add sample.jpg'
git push origin images
```


## masterブランチに戻れない場合

```
git add .
git stash
git checkout master
```

これでいけるっぽい。


## アクセスURL

```
https://raw.githubusercontent.com/user_name/repository_name/images/sample.jpg
```

これで直接画像にアクセスできます。



## おわりに
ただの備忘録です。
参考までに

ひろたつ
get target time from MSM file

   perl:
use strict;
my $lDEG=1;
my @it;
my $msm_file="Z__C_RJTD_20150408000000_MSM_GPV_Rjp_L-pall_FH00-15_grib2.bin";
##             0123456789a123456789b123456789c
   
   $it[0]=substr($msm_file,10,4);
$it[1]=substr($msm_file,14,2);
$it[2]=substr($msm_file,16,2);
$it[3]=substr($msm_file,18,2);
$it[4]=substr($msm_file,20,2);
print "it:@it\n" if $lDEG;
JQueryで指定したDOM要素の属性の取得・更新

## この記事について
この記事では以下のメソッドを使ってDOM要素の属性の取得と更新を行う

```
attr()
→指定したDOMU要素の取得と更新
data()
→指定したDOM要素の取得と更新
```

## サンプルコード
以下のように取得を行う

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <a href="hogehoge.com">googleリンク</a>
  <script>
    $(function(){
      console.log($('a').attr('href'));
    })
  </script>
</body>
</html>
/aタグのhref属性を取得してコンソールhogehoge.comを表示している
```

取得、および更新は以下のように第２引き数を入れる

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <a href="hogehoge.com">googleリンク</a>
  <script>
    $(function(){
      $('a').attr('href', 'google.com');
      //aタグのhref属性を取得してgoogle.comに書き換え
      console.log($('a').attr('href'));
　　　//aタグのhref属性を取得してコンソールでgoogle.comを表示している
    })
  </script>
</body>
</html>
```
data属性は以下のように引き数を指定することによって取得ができる

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <a href="hogehoge.com" data-sitename="googleのサイト">googleリンク</a>
  <script>
    $(function(){
      $('a').attr('href', 'google.com');
      console.log($('a').attr('href'));
      console.log($('a').data('sitename'));
    })
  </script>
</body>
</html>
//dataメソッドの引き数にsitenameと指定してdata属性を取得・表示　

```
DCモータをTA7291PとソフトウェアPWM（pigpio）で制御する

[「カラー図解 最新 Raspberry Piで学ぶ電子工作」](https://raspibb1.blogspot.com/)で紹介されている、DCモータをモータドライバTA7291Pで制御する例題を、pigpioでPWM制御する方法に作り変えてみました。

##使用機材
書籍に紹介されているのと基本的に同じです。
-  Raspberry pi3 model b+
-  ボリューム抵抗10kΩ
-  12bit ADコンバータ MCP3208
-  モータドライバ TA7291P
-  乾電池4個
TA7291Pを動作させるのに4.5V以上の電源が必要なので、乾電池4個は必要です。

##配線図
配線図は自分で書き起こしましたが、書籍に紹介されているのと基本的に同じです。ボリューム抵抗の脇に抵抗が追加されているのはノイズ対策だそうで、この辺がノウハウなのかなと思います。詳しくは書籍を参考にしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346401/4e46418d-ba9f-f303-0d67-9baaca1e6cb7.png)


##Pythonプログラム
pigpioを使う場合の約束として、最初に`sudo pigpiod`を行う必要があります。

```Python
# -*- coding: utf-8 -*-
import pigpio
import time
import spidev

PWM_PIN = [25,24] #PWM IN1,IN2
FREQ = 100
RANGE = 255

pi = pigpio.pi()


# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可
def readadc_spidev(adcnum):
    if ((adcnum > 7) or (adcnum < 0)):
        return -1
    command1 = 0x6 | (adcnum & 0x4)>>2
    command2 = (adcnum & 0x3)<<6
    ret=spi.xfer2([command1,command2,0])
    adcout = (ret[1]&0xf)<<8 | ret[2]
    return adcout



spi=spidev.SpiDev()
spi.open(0, 0) # bus0, CE0
spi.max_speed_hz = 1000000 # 1MHz

for j in range(2):
    pi.set_mode(PWM_PIN[j], pigpio.OUTPUT)  #pigpioで制御するピンの指定
    pi.set_PWM_frequency(PWM_PIN[j], FREQ)  #PWMの周波数(Hz)を指定。デフォルトは800。
    pi.set_PWM_range(PWM_PIN[j], RANGE)  #PWM値(μs)の最大値を指定。指定可能な値は25〜40000。デフォルトは255。


inputVal = 0
duty = 0

try:
    while True:
        inputVal = readadc_spidev(0)
        
        if inputVal>100 and inputVal<2048:  #正転
            duty = (2048-inputVal)*70/2048
            pi.set_PWM_dutycycle(PWM_PIN[0], duty) #デューティー比変更
            pi.set_PWM_dutycycle(PWM_PIN[1], 0)
        elif inputVal>=2048 and inputVal<4000:  #逆転
            duty = (inputVal-2048)*70/2048
            pi.set_PWM_dutycycle(PWM_PIN[0], 0)
            pi.set_PWM_dutycycle(PWM_PIN[1], duty) #デューティー比変更
        else:
            pass  #ノイズ対策のため100未満と4000以上の値は無視する
        print(inputVal,duty)
        time.sleep(0.5)

except KeyboardInterrupt:
    pass

spi.close()
pi.stop()

```

書籍では`ChangeDutyCycle()`を利用しているところをpigpioに変えました。
なお、書籍ではADコンバータの読み取りをGPIOの制御で実現していますが、こちらもspidevを使う方法に変えてあります。（[前回](https://qiita.com/Zensa55/items/1a2779c24de20ee35af8)の記事参照）
Pythonで関数・メソッドの実行時間を一行で計測するデコレータを作る

# やりたいこと
Pythonで関数やメソッドの実行時間を計算したい。Jupyter Notebookならマジックコマンド`%%timeit`によってセルごとの実行時間を記録することができるが、通常のPythonスクリプトで関数に一行付け足すだけで`print`してくれるようなものが欲しい。

# 実現方法
関数の実行前後に時刻を計測して引き算すれば良い。これはデコレータの考え方とフィットするため、デコレータとして以下のように実装する。

ポイントは以下の通り。

- 通常の関数でもメソッドでも同様に使える
- 計測結果は秒単位で出力するが、目的に応じて小数点以下何桁まで表示するかを`ndigits`という引数で指定できる
- 複数の関数で実行した時に見分けられるよう、`message`という引数を与えられるようにした
    - ネストしているのはデコレータに引数を与えるため
- デコレータを使うとエディタなどで元の関数のdocstringが隠蔽されてしまうことがあるため、`functools.wraps`を使用した

```python
import time
from functools import wraps

def timeit(message, ndigits=2):
    """Print execution time [sec] of function/method
    - message: message to print with time
    - ndigits: precision after the decimal point
    """
    def outer_wrapper(func):
        # @wraps: keep docstring of "func"
        @wraps(func)
        def inner_wrapper(*args, **kwargs):
            start = time.time()
            result = func(*args, **kwargs)
            end = time.time()
            print(" 🥑 Excecution time for '{message}': {sec} [sec]".format(
                message=message,
                sec=round(end-start, ndigits))
            )
            return result
        return inner_wrapper
    return outer_wrapper
```

# 使い方
与えられた秒数だけsleepする関数`sleeper()`の実行時間を計測したいとする。以下のように関数定義の前に先ほど定義したデコレータを記述する。

```python
@timeit("sleeper", ndigits=2)
def sleeper(sec):
    time.sleep(sec)
    return sec
```

この場合、`sleeper()`を実行するたびに以下のようなテキストがprintされる。

```
 🥑 Excecution time for 'sleeper': 1.24 [sec]
```

個人的にはこれで十分だが、print以外の機能を追加したり、時間の単位をmsなどに変更できるようにしても良いと思う。

以上。
AWSを利用した動画配信基盤の構成まとめ

こんにちは。streampackのtsuchiです。

このチームに参加して半年が経ちました。
右も左も分からない状態から、だんだんと動画配信の知識が付いてきたかなと思います。

今回は、配信基盤のインフラにはどのような構成があるのかをまとめてみます。
（私たちはAWSの会社なので、AWSサービスを使用する構成になっています）

## AWS MediaServices
<img width="1365" alt="Image 2019-01-10 17.26.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/d19b4e2d-894f-d4d5-9fae-d75f4385e64d.png">
＜MediaServices群＞
・AWS Elemental MediaConvert
・AWS Elemental MediaLive
・AWS Elemental MediaPackage
・AWS Elemental MediaStore
・AWS Elemental MediaTailor

|      | 説明 |
|:--------|:-----|
| メリット| マネージドサービスのため、構築・メンテナンスが楽 |
| デメリット| 対応していない機能あり |

2018年2月にローンチされたAWSのMediaServices。
フルマネージドサービスのため、構築運用の手間が省けるのが大きなメリットです。

ただ、MediaStoreではスクリプトを使わないとファイル一括削除ができなかったり、
MediaLiveで4K配信は未対応だったりなど、今後のアップデートが望まれる機能が多いのが現状です。

## AWS Elemental Live
<img width="1094" alt="Image 2019-01-10 17.27.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/b149ec5a-3384-987b-cf75-5c3920a4dcaa.png">

|      | 説明 |
|:-----|:-----|
|メリット |映像の冗長化など簡単に設定可能|
|デメリット |日本語の情報が少ない|

Elemental Liveは、AWS Elemental社のライブエンコードサービス。

複数の映像入力を自動で切り替えられたりなど、細かい設定ができます。
また設定内容はXMLファイル出力できるため、再利用する際に簡単に読み込み可能です。

Elementalは日本語の情報があまり見つからないので、情報を得るのに少々苦労します。
（英語ができる人は問題ないですが）

## Wowza Streaming Engine
![teamhub-logo.png](https://qiita-image-store.s3.amazonaws.com/0/277934/81ac5755-2780-794b-53ac-ba38cfca98e5.png)

|      | 説明 |
|:-----|:-----|
| メリット|GUIの管理画面が用意されている|
| デメリット|ライセンスが必要、ライセンス利用料がかかる|

Wowza Streaming Engineは、
Wowza Media Systemsが開発している、動画ストリーミングサーバ。

他の構成と大きく違う点として、商用で利用するにはライセンスを購入が必須になります。
AWSで利用する際はWowzaが組み込まれているEC2を利用すれば、簡単に環境構築が可能です。

管理画面のGUIから設定変更ができたり、ストリームの入出力が確認できるので便利です。

## EC2（nginx, apache）

<img width="669" alt="ScreenShot 2019-02-24 12.39.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/add6cb32-59b5-9ca8-0335-fbc191dd3e3c.png">

＜よく使用するAWS Services＞
・Amazon EC2
・Elastic Load Balancing
・Amazon S3
・Amazon CloudFront

|      | 説明 |
|:-----|:-----|
| メリット|カスタマイズ設定が可能、情報が得やすい|
| デメリット|サーバの構築やメンテナンスが必要|

最も一般的な構成が、オープンソースのミドルウェアを利用する方法になります。

nginxやapacheを使って、映像の入力から配信の部分までを構築します。
Web検索すると構築方法や設定情報も得やすい点でもメリットが多いと思います。

## 最後に

上記の構成から選定して、お客様の要件に合った配信基盤を提供しています。
https://cloudpack.jp/service/option/streampack.html

**「そもそもライブ配信とは？」**
**「Youtubeを使わずにクラウドを使うメリットって？」**
という方は、こちらの[**ライブストリーミングホワイトペーパー**]
(https://cloudpack.jp/whitepaper/live-streaming.html)をご覧ください。
## リンク
・[AWS MediaServices](https://aws.amazon.com/jp/media-services/)
・[AWS Elemental Live](https://www.elemental.com/products/aws-elemental-live)
・[Wowza Streaming Engine](https://www.wowza.com/ja-jp/products)
JSONを楽に生成できるツールを移植してみた

こんにちわ
ゴリラです

先日Twitter上でmattnさんのツイートを見て、
[jo](https://github.com/jpmens/jo)ってツールを知りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/5af39975-caba-73d1-6f24-3b7b3153f217.png)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">curl ... -d &#39;{&quot;foo&quot;: &quot;&#39;$VALUE&#39;&quot;}&#39;<br><br>とか \ エスケープで書くのモヤるのでよく jo を使ってるけど apt で入らないので apt で入る様にするか標準コマンドにしてほしい。<a href="https://t.co/FXMQKnYJKr">https://t.co/FXMQKnYJKr</a></p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/1098757405574291456?ref_src=twsrc%5Etfw">2019年2月22日</a></blockquote>


2019/02/25
本家のREADMEにgjoが追加されました。
https://github.com/jpmens/jo/blob/master/README.md#see-also

2019/02/26
Windowsで`gjo -p status=$(gjo name=gorilla)` というふうにしたい場合は`shellwrap`を使ってください。
詳細は[こちら](https://github.com/skanehira/gjo#windows)をどうぞ。

# joとは
普段curlを使って何かデータをPOSTする時って`"`をエスケープしないといけないのですよね。

```shell
curl -X POST -H "Content-type: application/json" https://localhost/gorilla -d "{\"name\":\"gorilla\",\"age\":26}"
```

エスケープ面倒だし見づらいから、もっと書きやすくしようってのが`jo`っていうツールコンセプトになります。
使い方は簡単で、`key=value`って引数に渡すだけでjson形式に変換して標準出力してくれます。

```shell-session
$ jo -p name=gorilla age=26
{
   "name": "gorilla",
   "age": 26
}
```

これをcurlと組み合わせるとこうなります。

```shell
curl -X POST -H "Content-type: application/json" https://localhost/gorilla -d $(jo name=gorilla age=26)
```

だいぶ楽になりましたね。

# 移植の話
ここからが本題ですが、仕組みはシンプルだったのでGoの勉強のため移植しました。

<a href="https://github.com/skanehira/gjo"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/gjo.png" width="460px"></a>

こちらのツールの使い方も本家とほぼ同じです。

```shell-session
# -pでjsonを整形した状態で標準出力します
# -aで配列を生成することができます（配列の場合はキー不要になります）
$ gjo -p status=(gjo name=gorilla age=26 lang=(gjo -a Go Java PHP))
{
    "status": {
        "age": 26,
        "lang": [
            "Go",
            "Java",
            "PHP"
        ],
        "name": "gorilla"
    }
}
# -vでバージョン情報を標準出力します
$ gjo -v -p
{
    "program": "gjo",
    "description": "This is inspired by jpmens/jo",
    "author": "gorilla0513",
    "repo": "https://github.com/skanehira/gjo",
    "version": "1.0.2"
}
# -hでヘルプを標準出力します
$ gjo -h
Usage of gjo:
  -a    creates an array of words
  -p    pretty-prints
  -v    show version
```

とこんな感じで、本家ほどではないのですが、
最低限のことはできるようになっています。

興味ある方は触ってみてください。
Windowsでも動くと思いますが（動作未確認）動かなかったらPRください。

# おまけ
gjoを作って公開したらmattnさんからPRをいただきました。
Small fixesと書いて有りながら、雑に書いたソースを超きれいに直していただいたので、感謝してます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/317a65a6-d912-6c27-c4f2-467157c5b604.png)

# 移植やってみて思ったこと
移植は難しいけど、やっぱり結構勉強になるなぁと思いました。
移植した分だけ、勉強になるんで今後もいろいろ移植してみます。
プロセスを終了する方法

# Windows10
## 使用しているportを調べる

`netstat -aon | find "8080"`

```
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       15496
  TCP         [::]:8080              [::]:0                 LISTENING       15496
  TCP         [::1]:8080             [::1]:51985            TIME_WAIT       0
  TCP         [::1]:8080             [::1]:52205            ESTABLISHED     15496
  TCP         [::1]:52198            [::1]:8080             TIME_WAIT       0
  TCP         [::1]:52205            [::1]:8080             ESTABLISHED     8796
  TCP         [::1]:52206            [::1]:8080             TIME_WAIT       0
  TCP         [::1]:52223            [::1]:8080             TIME_WAIT       0

```

## プロセスを終了させる
`taskkill /pid 15496 /F`


## 結果
```
成功: PID 15496 のプロセスは強制終了されました。
```

# Linux(Centos)
`lsof -i :8080`


```
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    21746 root  130u  IPv4 320607      0t0  TCP *:webcache (LISTEN)
```

## プロセス終了
`kill 21746`
Mysqlで日本語が登録できない

### utf-8の設定にしているにもかかわらず、日本語がDBにデータが登録できない
```
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

### DBを作成した時のキャラクターセットも確認してみます。(`latin1`となっている)
```
+------------+-----------------------------------------------------------------------+
| Database   | Create Database                                                       |
+------------+-----------------------------------------------------------------------+
| ********** | CREATE DATABASE `**********` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+------------+-----------------------------------------------------------------------+
```
### DB に設定されてしまったキャラクターセットはパラメーターグループを変更しても切り替えることはできないため、以下のように直接再設定を行います。

`ALTER DATABASE ********** default character set utf8;`

```
+------------+---------------------------------------------------------------------+
| Database   | Create Database                                                     |
+------------+---------------------------------------------------------------------+
| ********** | CREATE DATABASE `**********` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+------------+---------------------------------------------------------------------+
```
このように、`utf8`に変更されたことが確認できます。


* テーブルも作成時は`latin1`になっているので再作成しました。
[Rails] ActiveRecord::NoDatabaseError [Docker]

※環境構築時に、間違ってDBを消してしまった結果

Rails DockderでActiveRecord::NoDatabaseErrorでた場合
DBが無いエラーなのでrailsコマンドで作成してからマイグレーションを実行してください。

```commandline.tool
ActiveRecord::NoDatabaseError
```

```commandline.tool
docker-compose exec web rails db:create
docker-compose exec web rails db:migrate
```



!!!!



もしコンテナが起動していない状態であれば、execの部分をrunに置き換えて実行してください。

```commandline.tool
docker-compose run web rails db:create
docker-compose run web rails db:migrate
```
モジュールに定義したメソッドをクラスで利用する

## この記事について
Rubyのクラスに組み込むことができるモジュールについて記載する。

##　モジュールの定義方法
以下のように定義することができる。

```module.rb
module Greeting
    def say_hello()
    	puts "hello world"
    end
end
```

## モジュールメソッドの呼び出し
module_functionと記述することで、関数として定義されたメソッドを呼び出すことができる。　
module_functionと記述しないと、　単体で呼び出すことはできない。

```module.rb
module Greeting
    def say_hello()
    	puts "hello world"
    end

    module_function :say_hello
end

Greeting.say_hello()
```

## Mixin
モジュールに定義したメソッドをクラスに組み込み、クラスメソッドとして呼び出すことができる。
これをMixinという。

```module.rb
module Greeting
    def say_morning()
        puts "good morning! world"
    end
end

class Player
    include Greeting

    def introduce()
        puts "私はテニスがすきです。"
    end
end

player = Player.new()
player.introduce()
player.say_morning()
```
php-master-changes 2019-02-23

今日は大量に偽陽性の結果が出るテストケースを無効化する修正があった！

# 2019-02-23
## nikic: Disable bug77390.phpt
- https://github.com/php/php-src/commit/139492b1ae67efe541f88f8d1f3183e40ad7636d
- [7.4~]
- ext/openssl で、AppVeyor で大量に偽陽性の結果が出るテストケースを無効化
シーンにオブジェクトを作成する練習

Cinema 4DのPython練習がてらシーンにダイナミックにオブジェクトを追加するスクリプトを作成しました．オブジェクトを追加するだけなので特にどうという機能でもないですが，例えばカスタムマテリアル用のプレビューシーンを独自に作成したい場合などに使えます．カスタムマテリアルを作成したら仮想シーン内にこれらのオブジェクトを追加してプレビューに使うなどですね．

```
import c4d
from c4d import gui

def main():


    doc = c4d.documents.GetActiveDocument()
    doc.StartUndo()

    # add plane
    plane = c4d.BaseObject(c4d.Oplane)
    plane.SetName("Object")
    plane[c4d.PRIM_PLANE_WIDTH]  = 100
    plane[c4d.PRIM_PLANE_HEIGHT] = 100
    plane[c4d.PRIM_PLANE_SUBW]   = 20
    plane[c4d.PRIM_PLANE_SUBH]   = 20
    plane[c4d.PRIM_AXIS] = c4d.PRIM_AXIS_YN
    plane[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1
    plane.SetAbsPos(c4d.Vector(0, 140, 0))
    doc.InsertObject(plane)
    plane.MakeTag(c4d.Ttexture)
    doc.AddUndo(c4d.UNDOTYPE_NEW, plane)

    # add hari object and set root object
    hairObj = c4d.BaseObject(c4d.Ohair)
    hairObj.SetName("Object")
    hairObj[c4d.HAIRSTYLE_LINK] = plane
    hairObj[c4d.HAIRSTYLE_HAIR_COUNT] = 100
    hairObj[c4d.HAIRSTYLE_HAIR_SEGMENTS] = 6
    hairObj[c4d.HAIRSTYLE_COUNT] = 10
    hairObj[c4d.HAIRSTYLE_LENGTH] = 230
    hairObj[c4d.HAIRSTYLE_SEGMENTS] = 5
    hairObj[c4d.HAIRSTYLE_ROOT_PLACEMENT] = c4d.HAIRSTYLE_ROOT_PLACEMENT_AREA
    doc.InsertObject(hairObj)
    doc.AddUndo(c4d.UNDOTYPE_NEW, hairObj)

    # hair material
    hairMat = c4d.BaseMaterial(c4d.Mhair)
    hairMat.SetName("Hair mat")
    hairMat[c4d.HAIRMATERIAL_USE_THICKNESS] = True
    hairMat[c4d.HAIRMATERIAL_THICKNESS_ROOT] = 3
    hairMat[c4d.HAIRMATERIAL_THICKNESS_TIP] = 1
    hairMat[c4d.HAIRMATERIAL_USE_BEND] = True
    hairMat[c4d.HAIRMATERIAL_BEND] = 0.4
    doc.InsertMaterial(hairMat)
    doc.AddUndo(c4d.UNDOTYPE_NEW, hairMat)

    # hair material tag
    hairMatTag = c4d.BaseTag(c4d.Thairmaterial)
    hairMatTag[c4d.HAIRMATERIAL_TAG_LINK] = hairMat
    hairObj.InsertTag(hairMatTag)
    hairObj.MakeTag(c4d.Ttexture)

    c4d.EventAdd()
    doc.EndUndo()

# Execute main()
if __name__=='__main__':
    main()
```

各行でやっていることはオブジェクトを作成して，必要なパラメータをセットした後に，ドキュメントに挿入しているだけです．Cinema 4Dではアンドゥの設定の仕方をきちんとしないといけません．アンドゥタイプによっては実行前に記述しなくてはいけないものもあり，いつも迷ってしまいます．

[アンドゥに関するドキュメントはこちら](https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.documents/BaseDocument/index.html?highlight=addundo#BaseDocument.AddUndo "アンドゥに関するドキュメント")

シーン内にオブジェクトやタグ，マテリアルを追加できるので，次のようにカスタムマテリアル専用のプレビューシーンなどをダイナミックに作成できます．単独では何に使うか迷ってしまいそうですが，他のプラグインやスクリプトと組み合わせることができますね．
![20190224-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/195698/05059530-e3c4-efe0-c588-875a8348eb12.jpeg)

また，シーンに挿入しないことも出来るので，スクリプト内で何かオブジェクトが必要になった時など，一時的に作成して使うといったこともできそうです．
Ubuntu 18.0.4 , Virtualbox 6.0.4 , MacOS 解像度の設定 

以下、備忘録
Ubuntu 18.4.2の環境をVirtualBox で動かしたらデスクトップの解像度がうまく設定できず躓いた。以下のURLに記載の方法を探し当て解決した。４つのステップとも必要だった。
<環境>
MacOS Sierra (10.12.6) 
Version 6.0.4 r128413 (Qt5.6.3)
Ubuntu  18.04.2 LTS
<解決>
https://askubuntu.com/questions/452979/resolution-doesnt-change-when-resizing-virtualbox-window
https://askubuntu.com/a/1117549
## Resolution doesn't change when resizing Virtualbox window

I tried all of the suggested solutions:

- In the guest machine (Kubuntu 18.04), I installed 'virtualbox-guest-additions-iso' (thanks to Moshe Beeri)
- Installed 'virtualbox-guest-dkms' (thanks to Dr. Windows for the hint)
- While the guest machine is turned off, I checked if 'Maximum Guest Screen Size' is set to 'Automatic' (saw this suggestion in another post)
- Then I changed the 'Graphics Controller' to 'VBoxVGA'. (thanks to uceieluez)

Only after the 4th step the resolution of the guest machine has been fixed. Now it automatically resize to fit the virtual machine window.

I am not sure if the fix was because of changing the graphics controller or all of the above. Anyway, thank you all.

mohammad.yousef
githubで先にローカルbranchを作ったときのエラー

githubあまりいじってなくてつまずいた。
このあいだはgithubでリポジトリを作ってからcloneしてきてごにょごにょしてpushしたらうまくいったが、今回は先にローカルリポジトリを作ってしまった。

# ローカル
1. ソース書いた
1. git init
1. git add
1. git commit

# リモート（githubのサイト）
リポジトリを新規作成

# 再びローカル
1. git remote add 
1. git push

ここで怒られた。

```
$ git push textfld
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream textfld master
```

提示されたヒントの通りやってみる。

```
$ git push --set-upstream textfld master
Username for 'https://github.com': negiboudu
Password for 'https://negiboudu@github.com': 
To https://github.com/negiboudu/textfld.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/negiboudu/textfld.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

# 結局何をしたのか
githubでリポジトリを作った直後に出る画面。
あそこのサンプル通りのことをやっただけだった。。。

もろに同じようなお悩みが書いてあった。つまり自分が記事を書く必要などなかったのだ。
[【メモ】GitHubでgit clone〜git pushまで]
(https://qiita.com/nt_tn/items/c5ea999a2638e03ee418)

なんとなくこれが近いのかな〜と思った。
[ローカルでgitを使用した後、gitHubに登録する方法](https://qiita.com/koshihikari/items/dcf126fa9c0de2b6fa7e)

これ読めば解決しそう。と思ったけど結局やらなかった。
[git push 時の　error: failed to push some refs to](https://qiita.com/yoshixj/items/6441ab2cd6bc367e607d)

2013年の記事だけれど見てみた。けど結局自分の場合はやらなかった。
[最新のgitだと`git push`した時に警告が出たのでその対策](https://qiita.com/ongaeshi/items/da3538a5bde712fbbcf2)

# 気になったこと

- 結局、githubのサイトでリポジトリを作る必要はどうしてもあるってことだよね・・・？全部ローカル側の操作で完結できないもんかと探っていた

- git checkoutは、cloneとは違うんだろうけど（cloneはコピー作成と捉えた）、そうだとしたら、githubのサイトでリポジトリを作った後にcheckoutするのが自然？まぁやってみりゃいいんだな。

- あと、originという名前を使う慣例を完全に無視してやっていた。でもあんまり気にしていない。どんどんぶっ壊していって覚えよう。
Singleton(シングルトン)パターン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/db0965ff-f01e-08f8-45fd-23d9d71433aa.png)

1つずつデザインパターンをまとめ

## 総論
パターンそのものと使い所を理解する

## Singleton(シングルトン)パターン
唯一のオブジェクト、グローバルアクセスを実現するパターン
あるクラスからは**1つしかインスタンスを生成できない事を保証する**ことでアクセスは**どこからでもできる**ようにするパターン

## Singletonのテンプレート

```ruby:ParentSingleton.rb
require 'singleton'

class ParentSingleton
  attr_reader :settings

  def initialize
    @settings = {property: 'value'}
  end
end
```

```ruby:ParentSingleton.rb
require './SubSingleton'

class SubSingleton < ParentSingleton
  include Singleton
end
```

```ruby:main.rb
require './SubSingleton'

class Main
  object1 = SubSingleton.instance
  puts(object1.settings[:property])

  object2 = SubSingleton.instance
  puts(object2.settings[:property])
end
```

### 使い所
主なのは以下3点

- ログ(logger)
- 設定情報(settings)
- DB接続機構(conection pooling)

### 特徴
- Railsとか使うとあんまり自分自身が実装する所ない(必要そうな箇所は既に提供されている)
- グローバルなのでちゃんと理解しないと使えないといわれがちな為、使いにくい
- Rubyには標準のsingletonモジュールで提供されている
- テストにおいて依存問題が発生し易い
- クラスの結合度が高くなる

### 考え方 
- singletonモジュールの内部ではstaticにインスタンスを保持し、呼び出し側ではその保持されたインスタンスのみを取得することで状態を保持し続けているオブジェクトを取得する
- またコンストラクタしようとするとエラーが発生する(べき)

### ポイント
- Rubyで自身で実装しようとすると、言語特性上の問題もあり、singletonを満す実装自体が大変
- 既存のsingletonメソッドを利用する場合果たしてそれを呼び出して良い場所なのか吟味する必要がある

## 書籍情報
Russ Olsen, Rubyによるデザインパターン
https://amzn.to/2PFKt6m

## 雑感
作る、使えるかは置いといて、ひとまず知っといておくべき系パターンと解釈
Webサイト公開後に最低限やること

## はじめに
Webサイトを制作しても検索エンジンにサイトの存在を知ってもらわないと、
ユーザーはサイトの存在に気づくことができません。

数ヶ月が経てば、検索エンジンが勝手にサイトを認識してくれるのですが、
その認識されない期間はチャンスを失ってしまうことになります。

今回はWebサイト公開後、検索エンジンにより早く認識してもらうようWebサイト公開後、
最低限やるべきことをここでまとめます。

## Googleアナリティクスに登録
### Googleアナリティクスとは
Googleアナリティクスは「どのページにどのぐらいユーザーが流入しているのか」、「サイト内でどのような経路で移動したのか」といったサイトへ流入した後のユーザーのデータを解析するのに有用なサービスです。

[Googleアナリティクス](https://marketingplatform.google.com/about/)

無料ですので、ぜひ登録しておきましょう。

### Googleアナリティクス導入方法
以下のサイトがGoogleアナリティクスの登録〜導入まで分かりやすく説明してくれ、
初心者のボクでもスムーズに導入することができました。

[Googleアナリティクス導入時の設定・設置方法【初心者向け】](https://wacul-ai.com/blog/access-analysis/google-analytics-setting/ga-beginner/)

## Googleサーチコンソールに登録
### Googleサーチコンソールとは
Googleサーチコンソールは「ユーザーがどのようなキーワードで検索して訪れているのか」「自社サイトは検索結果で何番目くらいに表示されているのか」といったサイトへの流入する前のユーザーのデータを解析するのに有用なサービスです。

[Googleサーチコンソール](https://www.google.com/webmasters/tools/home)

無料ですので、ぜひ登録しておきましょう。

### Googleサーチコンソール導入方法
GoogleサーチコンソールはGoogleアナリティクスと連携して使用します。
以下のサイトが初心者にも分かりやすく、おすすめです。

[【5分で完了】サーチコンソールとGoogleアナリティクスを連携する方法](https://wacul-ai.com/blog/access-analysis/google-analytics-setting/googleanalytics-searchconsole/)

## GoogleサーチコンソールにXMLサイトマップ登録
XMLサイトマップをサーチコンソールに登録しておくと、あなたのサイトに優先的に検索エンジンのクローラー(ウェブサイトを巡回して情報収集するプログラム)が来てくれます。

クローラーがサイトを優先的に巡回してくれることで、日ごろのSEO施策の成果が検索順位に反映されやすくなるというメリットがあります。

XMLサイトマップ作成方法やサーチコンソールへの登録方法は以下のサイトが非常に分かりやすかったです。

[サーチコンソール(Search Console)にサイトマップを登録する方法【サイト運営に必須！】](https://wacul-ai.com/blog/access-analysis/google-analytics-setting/googleanalytics-searchconsole/)

## Googleマイビジネスに登録
飲食店や美容院、企業のコーポレートサイトなら、Googleマイビジネスへの登録もしておきましょう。
検索結果画面に企業情報が表示されるようになります。

[Googleマイビジネス](https://www.google.com/intl/ja_jp/business/)

![スクリーンショット 2019-02-24 11.38.26.png](https://qiita-image-store.s3.amazonaws.com/0/298750/84f676df-103a-2c70-7615-ade0dcb7089b.png)

# さいごに
2020年から個人ブログはじめました！

フリーランスエンジニアになって得た知識と経験をもとに、フリーランスエンジニアに関する情報をはじめ、IT技術情報や業界情報、エンジニアライフハック等のコンテンツを配信していく予定です。

まだまだ記事数は少ないのですが、週単位で更新してますので、もしご興味ございましたら、みていただけると嬉しいです。

https://yacchi-engineer.com/
Python: ウェーブレット変換の実装：③CWT改良編

# はじめに
今回は[ウェーブレット変換の実装：②CWT編](https://qiita.com/sai-sui/items/7707b1d96483e1e25b6c)で作ったCWTの改良を行う.
改良点
- ②で作成したrikcer関数をそのまま引数で与えてMother Waveletに設定可能にする.
- Mother Waveletの基本サイズを引数rで調整できるようにする.
- sigmoid関数を追加する.（同様に変換できるかも実験）

# 改良したコード

```sig.py
import numpy as np


def ricker(t, s=1.0):
    a = 2 * np.sqrt(3 * s) * np.pi**0.25
    b = 1 - (t / s)**2
    c = np.e**(-1 * t**2 / (2 * s**2))
    return a * b * c


def sigmoid(t, s=1.0):
    return (np.tanh(s * t / 2) + 1) / 2


def cwt(y, mw, S, r=10.0):
    out = []
    n = len(y) / (2 * r)
    t = np.linspace(-n, n, len(y), endpoint=False)
    for s in S:
        wave = mw(t, s)
        out.append(np.convolve(y, wave, mode='same'))
    return np.array(out)
```

# 実験（遊んでみる）

## 準備
上のsig.pyをとってきてはじめのおまじないを唱える(∩｡･ｏ･｡)っ.ﾟ☆｡'`

```python
import matplotlib.pyplot as plt
import numpy as np

from sig import *
```

## 適当な合成波を作る
[ウェーブレット変換の実装：②CWT編](https://qiita.com/sai-sui/items/7707b1d96483e1e25b6c)で作ったのと同じやつ.

```python
t = np.linspace(-1, 1, 200, endpoint=False)
y  = np.cos(2 * np.pi * 7 * t) + np.sin(np.pi * 6 * t)
plt.plot(t, y)
plt.show()
```

![合成波.png](https://qiita-image-store.s3.amazonaws.com/0/365961/e37f20e5-e42e-7e62-91ec-757fcb639b64.png)

`ricker`関数の引数sを変更しながら色んな波を作り表示してみる.

```python
t = np.linspace(-5, 5, 100, endpoint=False)
S = np.linspace(0.1, 1, 10, endpoint=False)
for s in S:
    plt.plot(t, ricker(t, s))
plt.show()
```

![リッカー.png](https://qiita-image-store.s3.amazonaws.com/0/365961/313d92c4-b685-5e96-9bc5-4813c55736e0.png)

上の`ricker`をMother Waveletに設定してCWTを実行.

```python
sp = 0.1
ep = 3.0
reso = 100
r = 10
mw = ricker
widths = np.linspace(sp, ep, reso, endpoint=False)
cy = cwt(y, mw, widths, r)
print('output')
plt.imshow(cy, extent=[-1, 1, ep*r, sp*r], cmap='PRGn', aspect='auto',
           vmax=abs(cy).max(), vmin=-abs(cy).max())
plt.show()
```

違いはあるが[ウェーブレット変換の実装：②CWT編](https://qiita.com/sai-sui/items/7707b1d96483e1e25b6c)で得られた結果とほぼ同じ.
![リッカーで変換.png](https://qiita-image-store.s3.amazonaws.com/0/365961/012c2906-9eca-dc71-a6ce-3348e9b902d7.png)

続いて`sigmoid`関数の引数sを変更しながら色んな波を作り表示してみる.

```python
t = np.linspace(-10, 10, 100, endpoint=False)
S = np.linspace(-1, 1, 10, endpoint=False)
for s in S:
    plt.plot(t, sigmoid(t, s))
plt.show()
```

![シグモイド.png](https://qiita-image-store.s3.amazonaws.com/0/365961/36cb4fa6-74f8-c5b2-57f5-3543276c17bb.png)

rickerと同じように変換する

```python
sp = 0.1
ep = 3.0
reso = 100
r = 10
widths = np.linspace(sp, ep, reso, endpoint=False)
cy = cwt(y, sigmoid, widths, r)
print('output')
plt.imshow(cy, extent=[-1, 1, ep*r, sp*r], cmap='PRGn', aspect='auto',
           vmax=abs(cy).max(), vmin=-abs(cy).max())
plt.show()
```

出来た！ρ(・ω・、)

![シグモイドで変換.png](https://qiita-image-store.s3.amazonaws.com/0/365961/0fe73f0e-1ef1-183d-4499-6873fd0c9bb0.png)

# まとめ

とりあえず目標の改良は出来た. あとは色んな関数を突っ込めば色んな変換ができる.
railsにvue-chartjsを導入する

[前回の記事](https://qiita.com/_ayk_study/items/4a1e9f4d5f819373a9a0)で散布図がないvue-chartsを選択するという痛恨のミスをしてしまいました・・・

今回は、定番のvue-chartjsに切り替えて使用していきたいと思います。

webpackやnode.jsの導入については、前回の記事を参考にしてください。
前回の記事の「Vue.jsを表示する」までは、やり方は同じです。

[vue-chartjsの公式ドキュメント](https://vue-chartjs.org/)を参考にしていきます。

##vue-chartjsをインストールする

npm経由でインストール

```
$ npm install vue-chartjs chart.js --save
```

javascript/packs/chart.jsには特に追加で記載する必要はありません。ラクですね！

##事前知識（グローバルコンポーネントとローカルコンポーネント）
こちらの記事がコードと一緒に詳しく書いてあります。：[【Vue.js】Vue.jsでChart.jsを使う](http://www.sky-limit-future.com/entry/vue_use_chartjs)

**グローバルコンポーネントとは**、javascript/packs/components/chartを用意し、その直下にchart.vue（仮名）を作成し、グラフをchart.jsからインポート、グラフを描画する記述を行う。そして、index.vueの中でchart.vue（仮名）をコンポーネントとして使用する。

**ローカルコンポーネントとは**、index.vueにchart.jsから直接グラフをインポートし、グラフを描画する記述を行うこと。つまり、コンポーネントを媒介させない方法です。

ざっくりとまとめましたが、今回はコンポーネントを作る必要はないのかなと思いましたので、ローカルコンポーネントで作成していきたいと思います。


##とりあえず棒グラフを表示させてみる


```rb:javascript/packs/components/index.vue
<template>
  <div>
    <h3>棒グラフを描画する</h3>
    <BarChart/>
  </div>
</template>

<script>
// インポート
import { Bar } from 'vue-chartjs'

var BarChart = {
  extends: Bar,
  mounted () {
    this.renderChart({
      //ラベル
      labels:["１月","２月","３月","４月"],
      //データ詳細
      datasets: [{
        //データタイトル
        label:'勉強時間',
        //データ
        data: [20,30,40,50]
      }]
    });
  }
}

export default {
  name: 'Test',
  components: {
    BarChart
  }
} 

</script>

```

こんな感じでいろいろデータを変更することができます。

![スクリーンショット (410).png](https://qiita-image-store.s3.amazonaws.com/0/256858/1de57baa-c84c-3b3a-4293-00ada87b6794.png)


##目的の散布図を描く

さきほどの棒グラフを表示していたindex.vueを以下のとおり書き換えて散布図を書いてみましょう。



```rb:javascript/packs/components/index.vue
<template>
  <div class=container>
    <h3>散布図を描画する</h3>
    <ScatterChart/>
  </div>
</template>

<script>
// インポート
import { Scatter } from 'vue-chartjs'

var ScatterChart = {
  extends: Scatter,
  mounted () {
    this.renderChart({
      datasets: [{
      //ラベル
      label:'重要度',
      fill: false,
      borderColor: '#f87979',
      backgroundColor: '#f87979',
      //データ詳細
      data: [{
        x: 10,
        y: 20
      },{
        x:5,
        y:6
      },{
        x:4,
        y:6
      }]
    },
    {
    label: '緊急度',
    fil: false,
    borderColor: '#7acbf9',
    backgroundColor: '#7acbf9',
    data: [{
        x: 6,
        y: 7
      },{
        x:-4,
        y:3
      },{
        x:1,
        y:-2
      }]
    }]
  },{responsive: true,maintainAspectRatio: false})
}
}        
        

export default {
  name: 'Test',
  components: {
    ScatterChart
  }
} 

</script>
では
<style scoped>
//画面に表示されるサイズを適当に整える
.container{
  width:40%;
  height:40%;
  
}
</style>

```

rails sをするとこんな感じになりました。


![スクリーンショット (413).png](https://qiita-image-store.s3.amazonaws.com/0/256858/5f7befee-389d-5506-9459-2015f44952f9.png)

マイナスの値を入れると自動で軸がマイナスも含まれる感じでしょうか。
ちょっと軸の値にバランスがありませんが、とりあえず表示できました。

#次回：フォームで入力した値をグラフに反映させるようにする

想定しているアプリが、フォームにtodoリストを重要度と緊急度を入力し、グラフに表示させるというものなので、フォームを作成し、グラフに反映させる作業をしていきたいと思います。その時にラベルも表示させる作業も必要です。

todoリスト部分はrailsが大きく絡んでくると思うので、その後にしたいと思います。

では次回の更新まで ^^) _旦~~