OmniAICreator/Qiita-1.07M huggingface dataset:
Oculus GoでローカルのhtmlファイルからVR180のWebViewerを立ち上げる。


## 概要
Oculus Goで同人エロADVを作りたいのだがfacebookが許すわけないのでアプリではなくローカルのWebVRを使いたい。

## テストに使用したGitHubプロジェクト
ft-lab様のプロジェクトを使用させていただいた。
[WebGL_test]
(https://github.com/ft-lab/WebGL_test)

この方はUnityでVR180いじるなら絶対に抑えておくべき人で下記のUnityAssetを公開している。
10ドルはかなり安いので絶対買ったほうがいい。
[Panorama180Render]
(https://assetstore.unity.com/packages/tools/utilities/panorama180-render-141234)

Twitterも参考になるので載せておく。
[@cg_ftLab]
(https://twitter.com/cg_ftlab)

## 前準備
GitHubからZiPをダウンロード。

threejsが入ってないので下記からダウンロード
[threejs]
(https://threejs.org)

r104を使ってるみたいなのでdownloadリンクをクリックすればOK。
バージョン知りたいならpackage.jsonを見て確認。
[もし閲覧時にバージョン変わってたら]
(https://qiita.com/samurairunner/items/7812749493554208aeae)

テストに使うshow_webvr180_sbs.htmlはThree.jsのいくつかのファイルしか使ってないのでThree.jsをスリム化。

```html:show_webvr180_sbs.html
    <script src="../threejs/build/three.min.js"></script>
    <script src="../threejs/vr/WebVR.js"></script>
    <script src="../threejs/loaders/GLTFLoader.js"></script>	
```
今回のテストで必要なのは

* three.min.js
* WebVR.js
* GLTFLoader.js

のみなのでフォルダ構成を整える。

WebVR.jsとGLTFLoader.jsは examples/js/ の中にvrフォルダとloadersフォルダがある。
上記フォルダをルートにもっていき
> threejs/
>      ┣ build/
>      ┣ vr/
>      ┣ loaders/
>

の構成にしてやるといいかもしれない。
（ここまで説明する必要ないかもしれないけどいちよね）

最終的に今回テストのWebGL_test-masterのフォルダ構成は
> WebGL_test-master
>      ┣ Panorama180Viewer
>      ┣ threejs

となる

フォルダ名がWebGL_test-masterだとあとで生URLを打ち込むのでめんどいのでWEBGLにフォルダ名を変えておく。

このフォルダをOculusGoにUSBをつないだルートにコピーする。

## OculusGo内での操作

<h4> Firefox Realityをインストール。</h4>

この次のCORSエラー対策のために設定をいじれるFirefoxで。
[概要記事]
(https://www.moguravr.com/vr-firefox/)

<h4>CORSエラー対策</h4> 
これ以降の**ローカルファイルアクセス**はブラウザからのWebサーバのファイルに対するアクセス（リクエスト）ではなく
Go内に保存しているファイルに対するアクセスを意味する。

OculusGoブラウザからのローカルファイルアクセスは同一オリジンポリシーによりエラー（Same-Origin Policy違反）が発生
するのでabout:configでsecurity.fileuri.strict_origin_policyを外してやる必要がある。

だけどこれはいくらエロゲーのためとはいえすげー危ない設定なので今回のみのテストってことで。

<h6>手順</h6>

URLの欄にabout:configと入力。
![aboutconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41780/da8d88a9-3527-17f9-f717-1ca353ec54c6.png)

security.fileuri.strict_origin_policyをfalseに
![origin_policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41780/bc41ec0f-58c4-3c12-2f9b-e57dd7c5f309.png)

<h4>ローカルのWEBGLを起動。</h4>
URL欄に**file:///sdcard/webgl/panorama180viewer/webvr180.html**と入力する。


![webgl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41780/c80b1f67-26bb-9be4-1cdb-3809cea4c085.png)

この画面が出たらEnterVRボタンを押すとWebGLを再生できる。[^1]

## 最後に
この方法ではローカルにあるWEBGLを再生できることはわかった。
でもエロのためにユーザーにセキュリティー捨てさせるのはちょっと無理なのでいろいろ課題を残してしまった。

WEBサーバーたてればいいのはわかってるけどDMMとかDLsiteとかで売るのを想定しているので
なるべく固定費かかるのをなしにしたい。


[^1]: show_webvr180_sbs.htmlをwebvr180.htmlに変更している。（すいません）
Git Hub の使い方について

##はじめに
なかなかGit Hubの一連の使い方を自信を持って行えないので、メモしておこうと思います。
とっても便利です。ゲームでこまめにセーブしてセーブデータをいっぱい作っておくみたいな感じ。

##Git Hubの使い方
- Branch(リポジトリのコピー)を作成
 
      ```$ git branch "ブランチ名"```
この時、ブランチ名はGit Hubで作成したissueの番号"#○○"にするとわかりやすいです。

- 作業ブランチに移動
　```$git checkout "ブランチ名"```

- 作業を一度セーブ（コミット）する
```$git add .```
   ```$git commit -m "メッセージ"```
メッセージの所にはどこまでやったか、何をしたかなどを記入します。
対応するissue番号を入れるとわかりやすくなります。
こまめにセーブ（コミット）しておくとその後失敗しても前のコミットまで戻れるのでとても便利です。


- このブランチでの作業を終えてリモートリポジトリに保存する
```$git push origin "ブランチ名"```
とコマンドを実行したら、
Git HubでPull request をします。
conflictがあったら解決して、Pull request をmergeすると、リモートリポジトリに保存されます。
issueが完了していれば、Git Hubにあるissueをcloseしておきましょう。

- 最新のリポジトリを取得
 最新のリポジトリは、master branch で取得します。
```$git checkout origin master```
```$git pull origin master```
このコマンドによって最新バージョンのリポジトリを取得することができます。
ここからまた「branchを作成」に戻って作業を続けることができます。

もしもburanchが増えていってしまうのが気に入らなければ、不要になったbranchを
```$git branch -d "ブランチ名"```
のコマンドで削除することができます。もちろん削除せずに再利用も可能です。

##参考文献
- 未経験がWeb系転職成功したいならgithubでissue管理して開発しよう

 - https://qiita.com/fukubaka0825/items/c7710b4e87d478c8ba3b
マッピングテンプレートでGETの可変パラメータに対応する


LambdaとAPI GatewayでAPIを作成していて、GETのパラメータがあったり無かったりする場合にマッピングテンプレートでどう対応するかのメモ。
探すのにだいぶ時間かかったので・・

以下のようなGETメソッドに対応したいのです。
https://www.example.com/api/hoge?user_id=abc
https://www.example.com/api/hoge?user_id=abc&limit=100

# 通常のマッピングテンプレートの指定方法

```
{
    "user_id" : "$input.params('user_id')",
    "limit" : "$input.params('limit')"
}
```

ですが、上記の書き方でlimitの引数を入れない状態でAPIをコールすると、以下のようなエラーが返却されます。

```
"errorMessage": "Unable to marshal response: ClientError('An error occurred (ValidationException) when calling the Query operation: The provided starting key is invalid: One or more parameter values were invalid: An AttributeValue may not contain an empty string') is not JSON serializable", "errorType"
```

# 解決方法

```
#set($limit = $input.params('limit'))
{
    #if($limit && $limit.length() != 0)
        "limit": "$input.params('limit')",
    #end
    "user_id" : "$input.params('user_id')"
}
```

# 参考
https://stackoverflow.com/questions/32511087/aws-api-gateway-how-do-i-make-querystring-parameters-optional-in-mapping-templa
#django のモデルでテーブルのレコード数を調べる `SomeModel.objects.count()`

# 例

```
User.objects.count()
```

# Ref

[QuerySet API reference | Django documentation | Django](https://docs.djangoproject.com/en/2.2/ref/models/querysets/#count)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Webアプリケーション始動時/終了時に呼び出す処理を実装する

#Webアプリケーション始動時に処理を実行したい
Webアプリケーションを実装してアプリケーション始動時に実行した処理があったので方法を調べてみました。以前はWebSphereにはStartUpBeanなるものがあった記憶が、、、、


##ServletContextListnerの実装
どうやらServletContextListnerインターフェースを実装したクラスを作成し、Web.xmlに登録しておけば良いようです。


```SampleListener.java
package test;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class SampleListener implements ServletContextListener {


  @Override
  public void contextDestroyed(ServletContextEvent arg0) {
 //アプリケーション終了時のコードを記述する
  }


  @Override
  public void contextInitialized(ServletContextEvent arg0) {
  //アプリケーション始動時のコードを記述する
  }
}
```

Web.xmlへの記述は以下の通り

```web.xml
<listener>
<listener-class>test.SampleListner</listener-class>
</listener>
```
実際にデプロイしてみたところ、処理が呼ばれていることを確認しました。引数としてServletContextEventが渡されるため、コンテキスト・ルートを取得するなどの処理も書くことができます。

##まとめ
Webアプリケーション始動時・終了時に実行する処理を実装したい場合には、ServletContextListenerインターフェースを実装したクラスを作成し、Web.xmlにリスナー・クラスとして登録すればOKです。
第３回　Raspberry Pi で監視カメラを作ろう！　～ネットワーク編～

Raspberry Piと専用のカメラモジュールを使用し、ONVIF対応の監視カメラを作成する[シリーズ記事](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)です。
本記事は[リンク情報システム株式会社](https://www.lis.co.jp/)の有志が作成しています。

今回はネットワークの設定を行います。

#RaspberryPiをネットワークに繋げる

###ネットワークケーブルを挿す
ネットワークケーブルをRaspberryPiに挿します。
既にインターネットに接続しているご家庭や会社では、ルーターなどでDHCPサーバーが起動しており、IPアドレスが自動で割り振られるかと思います。
ifconfigコマンドを実行して、IPアドレスを確認しましょう。

```
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.101 netmask 255.255.255.0  broadcast 192.168.1.255
                  ：
```
上記の場合、IPアドレス「192.168.1.101」が割り振られています。

###SSHを有効化する
以下のコマンドを実行してraspi-configを起動します。

```
$ sudo raspi-config
```

「5 Interfacing Options」を選択します。 
![20180213173657.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/0a4ca405-85a9-84c6-6a2a-62b3b40fab1e.jpeg)

「P2 SSH」を選択します。
![20180213173903.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/931f3d57-9b98-ea8f-e13c-dd7c87acf80a.jpeg)

「はい」を選択してSSHを有効化します。
![20180213174010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/494904b7-4c19-7995-8d33-671fcc32c0e7.jpeg)

###リモートログインを設定する
PCからアクセスできるようにリモートログインを設定します。
クライアントからのアクセス制限は、/etc/hosts.allow と /etc/hosts.deny に設定します。
これらの設定ファイルは以下のように解釈されます。
1. /etc/hosts.allow に設定されているホストはアクセスを許可する
2. /etc/hosts.allow で許可されたホストを除き、/etc/hosts.deny に設定されているホストを拒否する
3. 両方に設定がないホストはアクセスを許可する

まずは、hosts.allowにアクセスを許可するホストを設定します。

```
$ sudo vi /etc/hosts.allow
sshd: 127.0.0.1
sshd: 192.168.1.
```

今回は、ifconfigコマンドで確認したIPアドレスが「192.168.1.101」だったので「192.168.1.」と設定します。
これでIPドレスが「192.168.1.*」からのアクセスのみを許可します。

このようなサブネット単位でのアクセス許可を止め、個別にIPアドレスを設定することで、アクセス許可を限定的にする事が可能です。
また、監視カメラ映像配信アプリが順調に動作し始めたら、設定を削除しリモートログインを不許可にして良いと思います。

次に、hosts.denyにアクセスを拒否するホストを設定します。

```
$ sudo vi /etc/hosts.deny
sshd: ALL
```

hosts.allowで許可した「192.168.1.*」以外のホストを全て拒否したいので、hosts.denyに「ALL」と設定します。
これでTera Term等の端末ソフトからRaspberryPiにログインする事ができます。

###sambaをインストールする
ファイル転送を行う為に、sambaをインストールします。

```
$ sudo apt-get install samba
```
ファイルを書き込みを可能にしたいのでsambaの設定ファイルを開き、[homes]セクションのread onlyにnoを設定します。

```
$ sudo vi /etc/samba/smb.conf
[homes]
read only = no
```

sambaを再起動。最後にリモートから接続時のパスワードを設定して完了です。

```
$ sudo service smbd restart
$ sudo smbpasswd -a [ユーザ名]
```

これでWindowsのExplorerから \\\\[IPアドレス]\\[ユーザ名] と入力することで、RaspberryPiのファイルにアクセスできます。

###ソフトウェアをアップデートする 
Windows Updateのように、RaspberryPiにもソフトの更新を行うためのコマンドが存在しています。
updateコマンドでパッケージリストを更新し、upgradeコマンドでパッケージをインストール（アップデート）します。

```
$ sudo apt-get update
$ sudo apt-get upgrade
```

セキュリティ対策として、こまめに更新しましょう。

---
[インデックス記事へ](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)
[第２回記事へ](https://qiita.com/lis-hanzomon/items/91df20407d65322d0afb)
[第４回記事へ](https://qiita.com/lis-hanzomon/items/917c199695caba15e144)

---
[リンク情報システム株式会社](https://www.lis.co.jp)では一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)しています！
また、お仕事のご依頼、ビジネスパートナー様も募集しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。
hidden_fieldのわかりやすい例

##hiddenでuser_idを送りたい時

`<%= form.hidden_field :user_id, value:current_user.id %>`

```ruby:new.html.erb
<%= form_with(model: post, local: true) do |form| %>
  <% if post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :comment %>
    <%= form.text_field :comment %>
  </div>

  <%= form.hidden_field :user_id, value:current_user.id %>   //ここ

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
```


ついでに

```ruby:posts_controller.rb

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)

    respond_to do |format|
      if @post.save
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

  private

    def post_params
      params.require(:post).permit(:comment, :user_id)
    end
```

アソシエーション

```ruby:user.rb
has_many :posts
```

```ruby:post.rb
belongs_to :user, optional: true
```
【Ubuntu】rbenvで使えるRubyを最新化するメモ

# メモ

```bash
# 現在ローカルで使用できるRuby Version一覧確認
% rbenv versions

# 現在ローカルにインストールできるRuby Version一覧
% rbenv install -l

# rbenvを最新に
% cd ~/.rbenv
% git pull origin master
% cd plugins/ruby-build
% git pull origin master

# 使いたいバージョンをインストール
% rbenv install x.x.x

# 現在使用できるRuby Version一覧の更新を確認
% rbenv versions

# あるディレクトリで使用するRubyのVersionを指定
% rbenv local 2.6.3

# bundler のインストール
% gem install bundler
```


# 参考

[rbenv]コマンド備忘録 - Qiita https://qiita.com/a_ishidaaa/items/8cc14453289dba1413dd

rbenv / Ruby / Ruby on Rails アップグレードの手順 | Workabroad.jp https://workabroad.jp/posts/2113
MacでFlutterの環境構築をする際にAndroid Studioを「Applications」以外にインストールしていた場合の対応

PCの容量の都合で、外部ストレージにAndroid Studioをインストールしていたら、Flutterの環境構築時に「Android Studioが無いよ！」って怒られました。


```
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.5.4-hotfix.2, on Mac OS X 10.14.4 18E226, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] iOS toolchain - develop for iOS devices (Xcode 10.2.1)
[!] Android Studio (not installed)
[✓] VS Code (version 1.33.1)
[✓] Connected device (1 available)
```

この場合、以下のコマンドで、Android Studioの場所を指定できました。

```
$ flutter config --android-studio-dir=/(path)/Android\ Studio.app/
```

## 参考

* https://github.com/flutter/flutter/issues/9991
意気揚々と本番環境にdeployしたら全くSQLに受け入れられなかった

## ふざけたSQLちゃんだ

Userのcreateは成功する
そのUserに関連する個人情報用テーブルでROLLBACKされる。
なんでや。

AWSなのでログを持ってこないといけない、めんどい（このレベルから始める）

```
$ cd /var/www/貴殿のproduct/shared/log
```
にあった production.log を読む

```
$ less production.log
```
そして開けたら "Shift + F"で最新（下部）に吹っ飛ぶ
固定されるので、もしそこより古い情報を見たい場合は"Ctrl + C"
僕の場合表示されてたのは

```
ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: '\xE7\xBF\x81\xE9\x95\xB7' for column
```
こやつ。カラムがstringで設定されてるのになんでや？と調べてみたらutf8に設定されてないところがあるらしい。
さあ調べよう

```
mysql -u root -p
```
からの

```
show variables like "chara%";
```

value値が"latin1"なっているところをがあるに違いない。
実際あった。

## uft-8に変更するべ
僕の場合は "/etc/my.cnf" を変更すればいいらしい。

```
$ sudo vi /etc/my.cnf
```
を開いて（ i で編集可能やで）

```
[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8
```
これを追加。"ESC => :wq"
そして再起動

```
sudo service mysqld restart
```

上手く行くはず。やったね！！！
VirtualBox（Ubuntu18.04）へのSuiteCRMインストール

#前提

* VirtualBoxにUbuntuがインストール（インストールする際にメディア等不要の最小限？最低限？の構成の方でしておく）
* Ubuntuからインターネットにアクセスできること
* UbuntuにSSHにアクセスできること
* 何故かはわからないが、Ubuntuに既にApache2が入っていたが、この手順ではnginxに変更する

#PHP インストール

```
sudo apt-get -y install wget php php-pear php-cgi php-common php-curl \
php-mbstring php-gd php-mysql php-gettext php-bcmath \
php-imap php-json php-xml php-fpm
```

## php-fpm設定

### php-fpmの設定確認

```
sudo vi /etc/php/7.2/fpm/pool.d/www.conf

listen = /run/php/php7.2-fpm.sock   ←この値をnginxと合わせる必要がある
```

### php-fpmの設定変更

```
sudo vi /etc/php/7.2/fpm/php.ini


upload_max_filesize = 20M
max_execution_time = 120
```

ファイルアップロードサイズは最低6MB必要とのこと。

変更を反映するためにphp-fpmを再起動。

```
systemctl restart php7.2-fpm.service
```

#MariaDB インストール

```
sudo apt -y install mariadb-server mariadb-client
```

本来、DBサーバをインストールした時にrootのパスワード設定を求められるが、私は見逃してしまい、次の手順で再設定した。

```
sudo mysql -u root

use mysql;
update user set password=PASSWORD("新パスワード") where User='root';
update user set plugin="mysql_native_password";
exit

service mysqld restart
```

## DB作成

```
sudo mysql -u root

create database suitecrm;
grant all on suitecrm.* to suitecrm@localhost IDENTIFIED by "DBのパスワード";
flush privileges;
quit
```

よく`mysqld_safe --skip-grant-tables &`を使う手順があるが、それでは変更できなかったので、念のためメモった。

#Nginx インストール

```
sudo apt-get install nginx
```

## Nginx設定

`/etc/nginx/conf.d/suitecrm.conf`を以下の内容で作成する。


```
server {
    server_name ホスト名;
    client_max_body_size 50M;
    root /srv/suitecrm;
    
    location / {
       try_files $uri /index.php;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;  # php-fpmの設定に合わせる
        # fastcgi_pass localhost:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    error_log /var/log/nginx/suitecrm_error.log;
    access_log /var/log/nginx/suitecrm_access.log;
    location ~ /\.ht {
        deny all;
    }
}
```

# SuiteCRMのダウンロードと配置

`VER`は https://github.com/salesagility/SuiteCRM/releases から取得するバージョンを指定。

```
export VER="7.11.4"
wget https://github.com/salesagility/SuiteCRM/archive/v${VER}.tar.gz
tar xvf v${VER}.tar.gz
rm v${VER}.tar.gz
sudo mkdir /srv/suitecrm
sudo rsync -avv SuiteCRM-${VER}/* /srv/suitecrm

sudo chown -R www-data:www-data /srv/suitecrm/
cd /srv/suitecrm/
sudo chmod -R 775 *
```


# Composerのインストール

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer
```


# Composer実行

```
sudo apt install php-zip php7.2-intl
```

Composerの実行の際に、上記が足らないと怒られるのでインストール。

その後、以下を実行。

```
sudo composer install
```

# ブラウザでアクセス

```
http://ホスト名
```

SuiteCRMインストールの画面へリダイレクトされる。
「様々な言語でMap, Filter, Reduceを実現してみた」をRust&Rubyでやってみた

# これは何？

[様々な言語でMap, Filter, Reduceを実現してみた(1)](https://qiita.com/kuroyakov/items/0b2076df3619e20725e6)の記事を見て`Rust`と`Ruby`でやってみたというだけの記事です。

# 環境

- MacBook Pro (2018)
- macOS Mojave 10.14.4
- rustc 1.34.1
- ruby 2.6.2p47

# コード

※制限事項「生成したデータはイテレータオブジェクトではなく、実体データの集合になるようにした」に則ってコードを修正済み

## Rust

```rust
fn main() {
    let a = (0..10_000_000).collect::<Vec<i64>>();
    let res = a
        .iter()
        .map(|a| a * 2)
        .filter(|&a| a % 3 == 0)
        .fold(0, |acc, x| acc + x);
    println!("{}", res);
}
```

## Ruby

```ruby
class Integer
  def twice
    self * 2
  end

  def div3?
    self % 3 == 0
  end
end

a = (0..10_000_000 - 1).to_a
puts a.map(&:twice).select(&:div3?).sum
```

# 計測

`mfr.rs`および`mfr.rb`というファイル名にしました。

## Rustの場合

```shell
$ cargo b --bin mfr --release
$ time ./target/release/mfr
33333336666666

real    0m0.016s
user    0m0.012s
sys     0m0.003s
```

~~環境差異があるとはいえ、[元記事](https://qiita.com/kuroyakov/items/0b2076df3619e20725e6)の`C++`のケースより速いのはなぜでしょう…？~~

（追記）ルール違反してた。

> - 生成したデータはイテレータオブジェクトではなく、実体データの集合になるようにした

というわけで、Rangeオブジェクトのまま`map`/`filter`/`fold`するのではなく、一旦`Vec<i64>`に`collect`してから実行するように修正。Rubyも同様。

```shell
$ time for i in `seq 1 1000`; do ./target/release/mfr ; done
(中略)
33333336666666

real    1m4.037s
user    0m29.641s
sys     0m31.654s
```

~~1回あたりの処理にかかる時間はおよそ12msec。標準出力に吐く処理で3msecぐらい（文字列を出力するプログラムで測った）なので、コンパイル時に計算しているわけではなさそうです。~~

だいたい1処理あたり64msですね。それでも微妙に元記事の`C++`のケースより少し速い。


## Rubyの場合

上記環境での1回の実行で1.9秒ぐらいかかった。

```shell
$ time ruby mfr.rb 
33333336666666

real    0m1.946s
user    0m1.777s
sys     0m0.129s
```
[iOS][Swift] URLRequest と Alamofireを使ったCookiesのセット方法



URLRequestを作成

```swift
var urlRequest = URLRequest(url: requestUrl)
urlRequest.httpMethod = "POST"
```

URLRequestにCookieをセット

```swift
urlRequest.setValue("key=value", forHTTPHeaderField: "Cookie")
urlRequest.httpShouldHandleCookies = true
```

AlamofireでURLRequestを送信

```swift
Alamofire.request(urlRequest).responseData { response in

}
```

[参考](https://stackoverflow.com/a/43530496)
MTの本文でテンプレートタグを使う

HTMLコメントアウトを含めた広範囲のコメントアウトをしたい、なんて時に```<MTIgnore>```が使いたくなると思うんですが、当たり前だと思いますがそのままでは使えないっぽいです。

```
<mt:EntryBody mteval="1">
```

参考：[mteval \- グローバル・モディファイアリファレンス \| CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/appendices/modifiers/mteval.html)

.netのタグリストにはないので、まだ使えないっぽい？

参考：[E \- タグリスト \| MovableType\.net](https://movabletype.net/tags/e/)
React Apolloのhooks対応のベータ版が公開！

## はじめに
[React Apollo](https://github.com/apollographql/react-apollo)のhooks対応は待ち望まれていました。これまで[react-apollo-hooks](https://github.com/trojanowski/react-apollo-hooks)を使っている人も多いと思いますが、公式のサポートに向けてどうなっていくのでしょうか。

## ベータ版
https://www.npmjs.com/package/@apollo/react-hooks
にあること以上のものは分かりません。READMEもなし。ソースもGitHubからたどれるのかよく分からずです。

## コードを眺める
まずはTypeScriptの型を見てみましょう。複数のファイルからまとめます。

```typescript
import { QueryResult } from '@apollo/react-common';
import { DocumentNode } from 'graphql';                   
import { OperationVariables } from '@apollo/react-common';

export declare function useQuery(query: DocumentNode, props?: any): QueryResult<any, any>;

export declare function useMutation(mutation: DocumentNode, props?: any): any;

export declare function useSubscription<TData = any, TVariables = OperationVariables>(subscription: DocumentNode, props?: any): any;      
```

見慣れた感じです。ちなみに、react-apollo-hooksの型と比較するとだいぶシンプルです。anyだらけ。

実態のJSコードはコンパイルされたものなので多少読みにくいですが、読めないことはないです。結局のところ、 `@apollo/react-common` が本体で今までとは構成が変わっているようです。こちらのコードはちょっと読みにくいです。

## サンプルコード
利用例としては、
https://github.com/peggyrayzis/redux-to-graphql
と
https://codesandbox.io/s/5v1ol0nkjx
にあるようです。

後者のコードの一部を抜き出すと、

```jsx
export function RocketInventoryList() {
  const { loading, data } = useQuery(GET_ROCKET_INVENTORY);
  return (
    <Row className="rocket-inventory-list mt-4">
```

のような感じです。直感的です。この例だけの範囲ではreact-apollo-hooksと変わらないのではないでしょうか。

## おわりに
あまりに普通すぎて、特に気になるところもなかったです。README等が整備されればすぐに使えるようになるのではないでしょうか。期待感はありますが、リリースがいつ頃になるかは全く分からない状況です。
ProjectLibre 1.9.1 におけるカレンダーの日付フォーマット変更

#カレンダーの日付フォーマットががDD-MM-YY問題
MS Projectの代替品であるProjectLibreですがカレンダーの日付が日本スタイルではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/e246c93b-5200-b892-44e4-f058dbd93368.png)

YYYY MM DDなら2019 5 26となってまだわかりやすいのだが・・・
https://www.projectlibre.com/comment/1752#comment-1752
昔からある問題で日本人以外も困っている模様。
幸いなことに面倒だが変更する方法はあるので書き換える

#変更すべき箇所
バージョン　:　1.9.1
Jar名　:　projectlibre.jar
Jar内にある変更対象　:　com\projectlibre1\configuration\configuration.xml

##手順
###1.インストール先のフォルダを開く(例:C:\Program Files\ProjectLibre\app)
###2.projectlibre.jarをコピーしてデスクトップ等に貼り付け後、projectlibre.zipにリネームします
###3.projectlibre.jarをリネームします。(例:projectlibre.jar.originにリネーム)
###4.projectlibre.zipを展開します

###5.com\projectlibre1\configuration\configuration.xmlをテキストエディタで開き以下のように書き換えます。(pattern2="d MMM yy"　→　pattern2="yyyy M d")

```xml:configuration.xml内のtimescales変更前
		<timescale calendarField1="7" number1="1" pattern1="E"
			trunc1="1" upperCase1="true" normalMinWidth="15" tableMinWidth="51"
			calendarField2="3" number2="1" pattern2="d MMM yy" />

```

```xml:configuration.xml内のtimescales変更後
		<timescale calendarField1="7" number1="1" pattern1="E"
			trunc1="1" upperCase1="true" normalMinWidth="15" tableMinWidth="51"
			calendarField2="3" number2="1" pattern2="yyyy M d" />
```

###6.projectlibre.zipをExprolerで開いてドラッグ&ドロップで上書きします
左が圧縮ファイルを開いたExproler、右が展開後、書き換えたフォルダを開いたExproler
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/e6483dc7-435f-1c71-f9ff-c293c77a91c6.png)

右でクリックして左へドロップすると
この場所には同じ名前のファイルが既にあります
と問われるので「コピーして置き換える」を選択する。

###7.projectlibre.zipをprojectlibre.jarにリネームして元の場所に設置する.

###8.ProjectLibreを動かしてみる

##結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/6d3ad6d1-188f-88c3-b6c5-748d52b0ae9d.png)

毎回年を入れるのはどうなんだって人は"yyyy M d"を"M d"とかにする。

##備考
configuration.xmlを見ると他にも日本式ではないフォーマットはあるので気になったら同じように修正する。
GASでTwitterのDMを送るには

# はじめに
GASでTwitterのDM送信したいんだけどCode:32が帰ってくる　という事例があり正しい送り方を調べてみました。ググっても正解が出てこない！w

# なぜ送れなかったのか
端的に言うと、2018年夏のDM API新仕様にちゃんと対応できていなかったから、でした。新仕様における必須要件の一つである、Content-Typeが設定できていなかったのです。

# 作ったもの
```
function newDirectMessage(recipient_id, data){
  try{
    var service = twitter.getService();
    var payload = JSON.stringify({
      event: {
        type: 'message_create',
        message_create: {
          target: {
            recipient_id: String(recipient_id)
          },
          message_data: data
        }
      }
    });
    var response = service.fetch('https://api.twitter.com/1.1/direct_messages/events/new.json',{
      method: 'POST',
      contentType: 'application/json',
      payload: payload
    });
    return response;
  }catch(e){
    Logger.log('Exception:'+e);
  }
}
function demoDirectMessage(){
  newDirectMessage(recipient_id,{text:"送りたい文言"});
}
```
肝は以下の2点です。

- payloadは明示的にjsonを作る
- Content-Typeに'application/json'を指定する
    - これのやり方がわからなかった!　Service.gs のコードを追いかけてやっと判明したという。


# おまけ
前提となる環境整備の部分とかは@zensai3805さんの[Google Apps Script(GAS)でスパムと思われるTwitterアカウントを自動的にブロックする](https://qiita.com/zensai3805/items/21110743472217aa8d70)をご覧ください。(他力本願)
vue.jsのv-modelで複数のチェックボックスの状態を管理したい

# やりたいこと
チェックボックスがいくつかあって、そのうちどれがチェックされているのかを知りたい。

# とりあえず完成版コード
```vuejs
<template>
  <section>
    <div v-for="(poke, i) in pokes" :key="i">
      <input
        :id="'poke' + i"
        type="checkbox"
        :value="poke"
        v-model="selectedPokes"
      >
      <label :for="'poke' + i">{{poke}}</label>
    </div>
  </section>
</template>

<script>
export default {
  data() {
    return {
      pokes: [
        'ピカチュウ', 'カイリュー', 'ヤドラン', 'ピジョン', 'コダック', 'コラッタ', 'ズバット', 'ギャロップ'
      ],
      selectedPokes: []
    }
  }
}
</script>
```

![yc0dw-rc5jb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185122/a6ae8d8b-c97d-094e-ef27-24cab148477a.gif)


# 詳しく
以下のように、チェックボックスひとつにつき`v-model`をひとつ使えば実現できることはわかります。

```vuejs
<template>
  <section>
    <input
      id="pika"
      type="checkbox"
      v-model="pika"
    >
    <label for="pika">ピカチュウ</label>

    <input
      id="kai"
      type="checkbox"
      v-model="kai"
    >
    <label for="kai">カイリュー</label>

    <input
      id="yado"
      type="checkbox"
      v-model="yado"
    >
    <label for="yado">ヤドラン</label>
  </section>
</template>

<script>
export default {
  data() {
    return {
      pika: false,
      kai: false,
      yado: false
    }
  }
}
</script>
```

しかしチェックボックスが100個ある場合そうもいきません。
（ただしチェックボックスが実際に100個になるようなら設計を見直した方がよいです。）
また、リストをAPIなどから引っ張ってきて、チェックボックスがいくつになるか確定出来ない場合なども困ります。

## 解決方法

- `checkbox`要素に`:value`を与える
- `v-model`で配列として受け取る。

```vuejs
<div v-for="(poke, i) in pokes" :key="i">
  <input
    :id="'poke' + i"
    type="checkbox"
    :value="poke"
    v-model="selectedPokes"
  >
  <label :for="'poke' + i">{{poke}}</label>
</div>
```
```javascript
selectedPokes: []
```

こうすることで上に貼ったgifのように複数の値を保持することが出来ます。

## 失敗パターン

`v-model`を受け取る`data`の初期値を配列にしておかないと失敗します。

```javascript
selectedPokes: ''
```
![y71zy-0q9et.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185122/307b538e-cafc-4e09-225b-82742e6d1db4.gif)

# おしまい
正直なぜこれでいけるのかよくわかっていません。
詳しい方ぜひ教えてください。

なお僕は「クサイハナ」までしか覚えていません。
DjangoのQuerySetでpythonのnowは使わないほうがいいのではないだろうか

# 起きたこと

https://qiita.com/odoku/items/e9619ad3642d3bfe0289
この方とほぼ同じことが起きました。

Viewの`self.queryset`はキャッシュされてしまうため、
`timezone.timezone.now()` などを使ってもキャッシュされた時点のものになってしまう。

このようなWHERE句が発行されるQuerySetとして、Viewの`self.queryset`にキャッシュされる

```sql
WHERE published_at <= "2019-05-15 05:18:33"
```

# やったこと

発行されるSQLで`CURRENT_TIMESTAMP`が使われるようにする。
https://docs.djangoproject.com/en/2.2/ref/models/database-functions/#now

```py
from django.db.models.functions import Now
class HogeHogeQuerySet(models.QuerySet):
    def published(self):
        return self.filter(published_at__lte = Now())
```

こうするとこののようなWHERE句が発行される。

```sql
WHERE published_at <= CURRENT_TIMESTAMP
```
なので、キャッシュしても問題がなさそう。

# 思ったこと

このやり方が良いかどうか確信がないのですが、これが良いのだとしたらQuerySetのメソッド内で`datetime.now()`は使わないようにしたほうが良いのではないだろうか。
時間を動的に指定したQuerySetを作りたい場合は必ず引数で渡すようにしたほうがよさそう。

何か変なこと書いてたらご指導お願いします。


# おまけ

弊環境では、上記の対応をあんまりスムーズにできていません。
MySQLをDockerの `mysql/mysql-server:5.7` で動かしているのですが、
そこの時間を日本時間に設定できていなかったため別の問題が生じてしましました。。
CURRENT_TIMESTAMPが日本時間でないがアプリの時間は日本時間。。
Google BigQueryを使ったデータ抽出・集計

Google Cloud PlatformのツールのひとつであるBigQuery。これを活用することで、大容量のデータから必要な情報を簡単に抽出・集計できます。この記事では実際にBigQueryにデータをアップロードし、SQLコマンドで集計してみました。

## ①データをダウンロード
今回は、Kaggleのオープンデータから、iOSアプリの価格や評価などをまとめたデータセットをダウンロードしました。

<img width="727" alt="キャプチャ6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/c526cd9d-ddbe-489c-e527-963f15d4af84.png">

Mobile App Store ( 7200 apps)
https://www.kaggle.com/ramamet4/app-store-apple-data-set-10k-apps/downloads/app-store-apple-data-set-10k-apps.zip/7

## ②BigQueryにデータを格納
上記のサイトからCSV形式でデータをダウンロード、BigQueryにアップロードします。BigQueryにアクセス後、プロジェクト配下にデータセットを作成、さらにその配下にテーブルを作成し、データをアップロードします。

<img width="944" alt="キャプチャ1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/6c671700-5227-93d5-e884-fefa100b385b.png">

アップロードする際、「自動検出 スキーマと入力パラメータ」にチェックを入れると、CSVファイルの一行目が自動的にカラム名に変換され、データ型も識別してくれます。

<img width="506" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/45482486-1ed3-331e-3e0f-061aa0dcaa91.png">

アップロードしたデータを確認します。

<img width="372" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/c7102277-39d5-7971-ec82-819316c2a0fb.png">

<img width="675" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/685675d5-53f7-fa36-ab17-fa7db41d4b82.png">

## ③SQLコマンドで抽出・集計
SQLコマンドを使い、アップロードしたデータを分析します。

アプリのタイプについて、何種類あるのかdistinctコマンドで調べてみます。ニュースやゲームなど23種類あることが分かります。

```
select distinct 
  prime_genre 
from 
  `argon-bulwark-240602.da00002.table2`;
```

<img width="461" alt="キャプチャ7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/fb25ff8b-ab67-557e-f5a9-54b3b3cacff9.png">

項目について、アプリ名、通貨、価格、ユーザー評価、ジャンルの5つに絞り込んで表示しました。

```
select
  track_name,
  currency, 
  price, 
  user_rating, 
  prime_genre 
from 
  `argon-bulwark-240602.da00002.table2`;
```

<img width="596" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/81891888-a2d2-cf30-7b09-a3947b63ffe0.png">

さらに、無料のものを選び、評価の高い順に並べてみます。

```
select
  track_name,
  currency, 
  price, 
  user_rating, 
  prime_genre 
from 
  `argon-bulwark-240602.da00002.table2`
where
　price = 0 
order by 
  user_rating desc;
```

<img width="556" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/30ea7c5c-907c-bc2f-d7d9-2f8b774194d0.png">

標準的なSQLのクエリは一通り作成できます。グラフ化も簡単なので便利なツールですね。
Swagger UIでGitLabで管理された定義書を参照する

DockerでSwagger UIを構築し、Swagger UIから常に最新の定義ファイルを確認できるようにする。
GitLabはローカルに構築したものを利用。

## Swagger UI構築

Docker Composeを利用する。
swagger-uiの公式イメージは[こちら](https://hub.docker.com/r/swaggerapi/swagger-ui/)。

```
$ cat docker-compose.yaml
version: "2"
services:
  swagger:
    image: swaggerapi/swagger-ui
    environment:
      API_URL: https://petstore.swagger.io/v2/swagger.json
    ports:
      - "8080:8080"
$ docker-compose up -d
```

初期表示(`API_URL`)は、[公式のデモ](https://petstore.swagger.io/)で利用されているペットショップのAPI仕様が表示されるようにしている。

![swagger-ui-default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/3b729a71-31fd-935d-cecf-0bfcc87d8ab1.png)

ペットショップのAPIが表示された。
この画面上でGitLabにある定義書が確認できるようにしたい。

## Gitリポジトリを表示させる

この状態でExploreのテキストボックスにGitLabで管理された定義ファイルのURLを指定した場合、CORSのエラーが発生してしまう。

![エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/967a91ab-12a0-eed6-8ec7-6bbbfd9c22f5.png)

CORSのエラーを回避するために、swagger-uiを動かしているNginxでリバースプロキシさせる。

### Nginx リバースプロキシ設定

コンテナ内のNginxの設定ファイルを編集する。
serverディレクティブに設定を追記する。
今回は、`http://{swagger-uiのホスト}/swagger/{GitLabでのファイルのURLからホスト名を抜いたもの}`(e.g. http://localhost:8080/sawgger/skkojiko/hogehoge/raw/master/docs/api/swagger.yml )でアクセスできるようにする。

```
$ docker container ls
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                        PORTS                                                      NAMES
d8c85fc008b2        swaggerapi/swagger-ui            "sh /usr/share/ngi..."   33 minutes ago      Up 30 minutes                 80/tcp, 0.0.0.0:8080->8080/tcp
$ docker exec -it d8c85fc008b2 sh
# vi /etc/nginx/nginx.conf
...省略
server {
+    location /swagger/ {
+      proxy_pass      http://gitlab.com/;  # GitLabのURLを指定
+    }
  }
...省略
```

Nginxの設定を変更したら、コンテナを再起動する。

```
$ docker container restart d8c85fc008b2
```

再度、Swagger UIのテキストボックスにURL(e.g. http://localhost:8080/sawgger/skkojiko/hogehoge/raw/master/docs/api/swagger.yml )を入力すれば今度は正常に表示されるようになる。

## 最初からGitLab上の定義ファイルを表示させる

`docker-compose.yaml`の`API_URL`を修正する。

```
$ cat docker-compose.yaml
version: "2"
services:
  swagger:
    image: swaggerapi/swagger-ui
    environment:
      API_URL: http://localhost:8080/sawgger/skkojiko/hogehoge/raw/master/docs/api/swagger.yml
    ports:
      - "8080:8080"
```
Talibで使えるローソク足についての関数まとめ(4)

# はらみ線・はらみ足
CDLHARAMI - Harami Pattern

最初に言っておくと、はらみ線＝はらみ足で同義です。
前日の大きな動き＝母体
当日の小柄なローソク足＝はらんだお腹の子
と見立てた呼び方です。
其れに掛けているのかは分かりませんが相場の流れが変わる前兆と言われています。
では、その事例について紹介します。

## 陰の陽はらみ(買いサイン)
陰の陽はらみとは、大陰線の翌日に出た陽線が、前日の大陰線の中に納まるような形（はらみ線）になる事です。
株価がどんどん下落していったら、みんな売りたくなりますよね？
株価の下落途中、底値圏でセリングクライマックスと呼ばれる現象が起こります。
皆投げ売り状態になるわけです。
下落相場において、大陰線に続いて、その陰線に包み込まれるような陽線が出たら、翌日の動きに注目しましょう。
もし翌日、上寄りの陽線となれば、相場転換する可能性が高くなります。
![image.pig](https://kabu-psychology.com/wp-content/uploads/2009/08/harami0925.png)



## 陽の陰はらみ(売りサイン)
陽の陰はらみとは、大陽線の翌日に出た陰線が、前日の大陽線の中に納まるような形（はらみ線）になる事です。
上昇相場中の大陽線に続いて、その陽線に包み込まれるような陰線が出たら、翌日の動きに注意する必要があります。
翌日も下寄りするようなら売りの転換点と見る事ができます。
ただし、上寄りの陽線で引けるようであれば上昇は続いている可能性も考えられますので、はらみ線となった翌日の動きを冷静に判断しましょう。
![陽の陰はらみ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340650/5130646c-ad03-f35c-3037-57b126249331.gif)

```python
integer = CDLHARAMI(open, high, low, close)
```
[参考サイト](https://www.mql5.com/ja/articles/101)

## 高波
CDLHIGHWAVE - High-Wave Candle

High Waveは実体よりも上下のヒゲが長いような、実体が小さいロウソク足のことです。強気相場や弱気相場の迷いを表しています。
Spinning Topとの違いは、High Waveの方が上下により長いひげを持っているということです。
![High wave](https://bullishbears.com/wp-content/uploads/2019/04/high-wave-candle.png)

```python
integer = CDLHIGHWAVE(open, high, low, close)
```

[参考サイト](https://www.feedroll.com/candlestick-patterns/1205-high-waves-candlestick)
なんかピーンときたので、stimulusを試してみることにした(Railsへの適用)。

【控えめで小さなフレームワーク】という響きに惹かれ、stimulusを勉強してみることにした（Vue.jsが難しすぎて投げ出した、という真実からは目を逸しつつ……）。

#とりあえず、既存railsに適用できるのか試してみる。

###まずはテキトウなrailsアプリを作成

```:ターミナル（環境確認）
ruby -v
→ruby 2.6.3p62
rails -v
→Rails 5.2.3
```

で、

```:ターミナル
rails new test_stimulus2  -d postgresql　※プロジェクト作成
　　↓
cd test_stimulus2　※作成したところに移動
　　↓
rails g scaffold users cd:string name:string　　※簡単に「ユーザーの登録」を作る
　　↓
rails db:create
rails db:migrate
```

……プロジェクト名に「2」が付いているのは気にしない方向で（付けていない「test_stimulus」も作っているが、復習も兼ねて再作成中）。

ちなみにはじめから「stimulus」を導入する場合は、
rails new project_name
　　↓↓↓
rails new project_name --webpack=stimulus
とするらしい？（まだ試していない）


###作ったモノにstimulusを導入
……[https://fuyu.hatenablog.com/entry/2018/11/18/115909](https://fuyu.hatenablog.com/entry/2018/11/18/115909)を参照しつつ。

gemfileに

gem 'webpacker'

を記述。
ついでに『group :development, :test do』部分には

  gem 'pry-rails'
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'pry-byebug'

も書いておく（検証用に）。
保存したらターミナルで、

```:ターミナル
bundle install　※gemをインストール
　　↓
rails webpacker:install 
　　↓
rails webpacker:install:stimulus 
```

これで「app/javascript/packs/application.js」が……
![スクリーンショット 2019-05-15 13.42.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410674/23ab825a-b04e-e6e7-b5f6-4c5aefd67f04.png)
出来ている、のかな？

そうしたら「application.js」と同じフォルダ下、「app/javascript/controllers（ここに、stimulus用ファイルを作ってく）」をビューが読み込むよう、


```rails:app/views/layouts/application.html.erb
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

    <%# ↓これを追記↓ %>
    <%= javascript_pack_tag 'application' %>
    <%# ↑これを追記↑ %>
```
とビュー側に追記する。


###導入……できた？
導入作業はこれで完了のはずだが、、、自身がないのでとりあえず確認。

Handbookの[【Hello, Stimulus】](https://stimulusjs.org/handbook/hello-stimulus)を試してみる。

scaffoldで作成していた一覧に、


```rails:app/views/users/index.html.erb
<p id="notice"><%= notice %></p>

<%# ↓これを追記↓ %>
<div data-controller="hello">
  <input data-target="hello.name" type="text">
  <button data-action="click->hello#gree
t">Greet</button>
</div>
 <%# ↑これを追記↑ %>

<h1>Users</h1>
```

そんでもって、javascript/controllersにhello_controller.jsを……作成しようとしたら、もう出来てたので内容を書き換え(あ、動作確認だけなら自動で作られたやつで足りたのかもしれないけど……まあいいや）。


```rails:app/javascript/controllers/hello_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
  static targets = [ "name" ]

  greet() {
    console.log(`Hello, ${this.name}!`)
  }

  get name() {
    return this.nameTarget.value
  }
}
```

![スクリーンショット 2019-05-15 14.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410674/d6a4b1c0-767f-c19a-138d-6a3f8a709a1f.png)

おお、ちゃんと適用されてる、されてる！
というか、本当にこれだけで環境を整えられるんだ（結構本気で驚いた）。

とりあえずはここまで、具体的な使い方はこれから探っていく予定。
gitlabとredmineをサブディレクトリ運用する（サブドメイン運用からサブディレクトリ運用へ）

# TL;DR

* gitlabとredmineをdocker-composeで運用するとなかなか面倒なので，1つのドメイン（サブドメイン無し）でサブディレクトリ運用できるようにします
    * [Gitlab-CEとRedmineを連携してdockerコンテナで運用する(DBを1コンテナにまとめてHTTPS付き)](https://qiita.com/myoshimi/items/fab6c0a4ad686c7144cc)の続きです

# やりたいこと

* この記事でやりたいことは，以下のことです
    * ```https://gitlab.mydomain```や```https://redmine.mydomain```のようになっている状況を，```https://mydomain/gitlab```や```https://mydomain/redmine```で使えるように変更したい
* **メリット** : SSL証明書をletsencryptで取得している場合，ワイルドカード証明書は更新の都度，DNSの設定を修正する必要があるので面倒ですが，ホストが決まっているように（外部からは）見えるので，通常の更新手続きが使えます
* **デメリット** : サブディレクトリ運用技術が枯れていない(gitlabなど)サービスで，不具合が発生する可能性があります

# やったこと

* gitlab, redmineコンテナに環境変数の追加
* nginxでのリバースプロキシ設定の修正

## gitlab, redmineコンテナの環境変数の追加

* [Gitlab-CEとRedmineを連携してdockerコンテナで運用する](https://qiita.com/myoshimi/items/fab6c0a4ad686c7144cc)の記事で作成した```docker-compose.yml```のコンテナの環境変数設定に，以下のように```RELATIVE_URL_ROOT```に，運用したいサブディレクトリ名を追加します
    * リバースプロキシで振り分けるだけだと，サービス内部でのリクエストのやりとりにより，不具合が発生します

```dockerfile
  redmine:
# .....<snip>.....
    environment:
# .....<snip>.....
      - REDMINE_RELATIVE_URL_ROOT=/redmine
# .....<snip>.....
  gitlab:
# .....<snip>.....
    environment:
# .....<snip>.....
      - GITLAB_RELATIVE_URL_ROOT=/gitlab
```

## リバースプロキシ設定

* nginx.confのサブディレクトリでアクセスするコンテナを，下記のように振り分ける処理を記述します
    * ドメインが1つになるので，```default_server```と```server_name```をデフォルトに設定します
    * サブディレクトリ運用するようになったコンテナにそのままの形でプロキシされるようにします

```nginx
    server {
        listen 443 ssl default_server;
        server_name _;
# ...<snip>...
        location /redmine {
            proxy_pass http://redmine/redmine;
        }
        location /gitlab {
            proxy_pass http://gitlab/gitlab;
        }
    }
```

# 動作確認

* サービスをゼロから立て直したほうが無難です（サブドメインからサブディレクトリに運用が変わるので，既存のデータ内にあるURLは使えなくなります）

```bash
# 不揮発ボリュームを削除する（必要があればバックアップをとっておく）
# sudo rm -rf /srv/docker/{gitlab,redmine,mysql}
docker-compose up -d
Creating network "project_default" with the default driver
Creating project_mysql_1             ... done
Creating project_memcached-redmine_1 ... done
Creating project_redis-gitlab_1      ... done
Creating project_gitlab_1            ... done
Creating project_redmine_1           ... done
Creating project_rev_1               ... done
```
* ```https://<URL>/gitlab```，```https://<URL>/redmine```にアクセスして，サービスが稼働していることを確認します．

# 参考

* [Gitlab-CEとRedmineを連携してdockerコンテナで運用する(DBを1コンテナにまとめてHTTPS付き)](https://qiita.com/myoshimi/items/fab6c0a4ad686c7144cc)
Twinmotionで動画テクスチャを使う。

# 要件
TwinMotionで、動画を貼り付けたい。

# 結果
できた。
https://youtu.be/0MyuWv-1ZsU


# 使用ソフト
* Windows10Pro
* TwinMotion2019


# 方法
1. マテリアルのTexture選択画面を開く
2. ファイル名に、動画ファイルの名前を少し入力
3. 選択候補から、動画を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/db7c493c-c7ce-feb1-6ed1-3feae7c2b98a.png)

#　補足
動画は速度設定無視して最速で再生されるっぽい。
動画速度を1/10ぐらいにした動画だとちょうどいいらしい。（未検証）
動画によっては、正しい速度再生されるっぽい

AnimationGIFは動かない



# 参考文献
https://www.facebook.com/groups/Twinmotion/permalink/964378917095343/
https://youtu.be/e1nkIoA44Vw?t=79
CentOS基本コマンド

初投稿です。
自分用にメモ。

Cent OS 6.8

ファイルの作成

```ruby:qiita.rb
touch ファイル名
```


ファイルの編集

```ruby:qiita.rb
vi ファイル名
```

ファイルの中身を表示

```ruby:qiita.rb
cat ファイル名
```

フォルダーの作成

```ruby:qiita.rb
mkdir フォルダー名
```

ファイルエントリ情報の表示

```ruby:qiita.rb
ls
```

オプション ls ファイルタイプ、パーミッション（権限）なども表示

```ruby:qiita.rb
ls -l
```

ファイルを ディレクトリ へコピー

```ruby:qiita.rb
cp ファイル名 ディレクトリ名/
```

ファイルの削除

```ruby:qiita.rb
rm ファイル名
```

ディレクトリの削除

```ruby:qiita.rb
rm -r ディレクトリ名
```

ディレクトリから　tar.gz形式　圧縮ファイル作成

```ruby:qiita.rb
tar cvzf 生成ファイル名.tar.gz 圧縮元ディレクトリ名
```

tar.gz形式　圧縮ファイル解凍

```ruby:qiita.rb
tar xzvf 圧縮ファイル名
```

ディレクトリの同期
※コピー元ディレクトリ名の後ろに/をつけると、ディレクトリ自体はコピーせず、その中身だけををコピー先に入れることができる

```ruby:qiita.rb
rsync -r コピー元ディレクトリ名/ コピー先ディレクトリ名
```
GASで複数のシートの値を読み込んで、別のシートに組み合わせた文字列を出力するサンプル

## 前提
基本的なGASの使い方やスクリプトエディタの使い方はわかっている方を対象にしています。

## 背景
Webマーケティングに使用するSEO対策用の複合キーワードを作成するために、カテゴリ1,カテゴリ2のそれぞれのキーワードを組み合わせたキーワードを生成する必要があった。

今までPHPで書いてCSVで出力していたが、そもそもGASでかけばいいのでは？と今更思ったので、調べてみた。

## コード

前提としてそれぞれのシートにはA列のみに取得する文字列が並んでいる状態です。

```sample.js
function myFunction() {
  var sheet1 = SpreadsheetApp.getActive().getSheetByName('category1');
  var sheet2 = SpreadsheetApp.getActive().getSheetByName('category2');
  var sheet_output = SpreadsheetApp.getActive().getSheetByName('output');  

  var last_row_sheet1 = sheet1.getLastRow();
  var last_row_sheet2 = sheet2.getLastRow();
  
  var cats1 = sheet1.getRange(1, 1, last_row_sheet1, 1).getValues();
  var cats2 = sheet2.getRange(1, 1, last_row_sheet2, 1).getValues();
  var row_kw = 1;
  for(i = 0; i < last_row_sheet1; i++) {    
    for(j = 0; j < last_row_sheet2; j++) { 
      var kw = cats1[i] + " " + cats2[j]
      sheet_output.getRange(sheet_output, 1).setValue(kw);
      row_kw++;
    }
  }
}
```

はい、めちゃめちゃ簡単でした。

流れとしては

- シートを取得
- シートごとに列の値を取得
- 組み合わせたワードを出力先に書き込み

という基本的な流れです。

シート取得するところが

```
SpreadsheetApp.getActive().getSheetByName(sheet_name);
```

ということさえわかればあとは直感的にかけますね。

## パフォーマンス的にも`getValues()`を使うべし
なお、最初`getRange.getValue()`で値を取得する部分をループしていたら、
行数が数百行あったこともあり、起動時間が長すぎたようで強制終了してしまった。

DBへのアクセスと同様に、ループの中で接続したらダメですね。

`getValues()`先に値を全部とってきてから、その配列をループで回して作りたい文字列を生成するようにしましょう。

パフォーマンスへの影響も顕著で、`getRange.getValue()`のときは1sで5行ずつしか生成されていなかったが、`getRange.getValues()`のときはほぼ一瞬で終わった。

## 参考

https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow-column-numrows-numcolumns

https://developers.google.com/apps-script/reference/spreadsheet/range
SceneKitで拡張子のないSceneファイルは読み込めない

iOS の SceneKit で、ローカルストレージにダウンロードした Scene ファイル (scn) をロードしたら失敗してしまいました。下記の３パターンすべてです。

```swift
// Scene としてロード
let scene = try SCNScene(url: sceneFileURL, options: nil)

// Node としてロード
if let referenceNode = SCNReferenceNode(url: sceneFileURL) {
    referenceNode.load()
}

// Scene Source としてロード
let sceneSource = SCNSceneSource(url: sceneFileURL, options: nil)
```

こちらがコンソールに出力されたエラーログです。

```
[SceneKit] Error: This file cannot be opened (version is too old)
```

**バージョンが古すぎる**

そんなはずはない！

散々悩まされた結果、ファイルに `.scn` 拡張子がついていないとロードできないということがわかりました。（ダウンロードしたファイルを管理上の都合で拡張子なしで保存していたのです。）

下記のように一旦 `Data` として読み込んでそれを入力とすると読み込めるので、拡張子のチェックなんてしなくて良いのに :worried:

```swift
let sceneData = try Data(contentsOf: sceneFileURL)
let sceneSource = SCNSceneSource(data: sceneData, options: nil)
```

(動作確認環境: iOS 12.2)
CSSを弄って生じた疑問について

# 導入

先日、[Water.css](https://watercss.netlify.com/)というCSSについての記事を読んだ。
そして、私でもこういった物を作ってみたいと思った。
世の中には多くのReset CSS等の標準となるCSSが存在するが、私にはそういったレベルの物は作れないのは十分知っていた。
だが、必要な分だけ書き換える程度なら可能だろうと思い開発を始めた。
各要素のborderやmargin等を書き換え、納得できるレベルになったなと思った矢先、事件は発生する。

**buttonとtextareaの大きさが違うのだ。**

あり得ない。
全て同じ値を与えているのだ、同じになると思っていた。
だが、現実として異なる大きさになっている…

# 問題となったCSS

以下が実際に問題が起きたCSSだ。

```css:doc.css
[attr]{
	border: 0;
	display: block;
	font: inherit;
	margin: 1rem;
	max-width: calc(100% - 2rem);
	padding: 0;
}
button[attr],textarea[attr]{
	background: gainsboro;
	border-radius: 0.5rem;
	outline: none;
	padding: 1rem;
	width: 100%;
}
button[attr]:focus,textarea[attr]:focus{
	box-shadow: 0 0 0 0.1rem dimgray inset;
}
textarea[attr]{
	resize: none;
}
```

要素の大きさに関わる値は統一し、marginとpaddingの計2remを加味してmax-widthを与えていた。
違いと言えばtextareaに与えたrerizeだけだ。
要素の大きさには干渉しない。
その上でwidthを100%にすることで、最終的な大きさを100% - 4remにしようとしていた。
私の考え上ではそうなるはずだった。

だが、実際にはそうならなかった。
正確に言うならば、**2rem分だけbuttonが小さい**のである。

# 調べてみた

が、どう調べたものか。
｢textarea button 大きさ｣
欲しい情報が出てこない。
調べても求める答えは得られない。
Chromeの開発者ツールを使ってしまった。
スマホで作業する開発者の限界点だった。

# 開発者ツールで調べた結果

各種値を付けたり消したりしながら変化を見ていると、paddingが影響していることが判明した。
例えば、widthが200pxの状態でpaddingを10pxにすると、textareaのコンテンツ領域は幅200pxのままであった。
コンテンツ領域にはpaddingを含まないので当然である。
しかし、**buttonのコンテンツ領域は幅180pxになっていた。**
paddingを加味することでコンテンツ領域は幅200pxとなった。
つまり、**コンテンツ領域にpaddingを含んでいる**ということだ。
コンテンツ領域はpadding等を加味して指定しないといけないことは知見としてあったが、その様な例外が存在することは知らなかった。

# 結論

textareaはpaddingを含まない、コンテンツ領域の大きさを指定する。
buttonはpaddingを含む大きさを指定する。
その他の要素や値は調べていないから省略。
以上。

# 最後に

今回、私が開発を進めたCSSはDoc.cssと名付け、[Github](https://github.com/re-frain-org/Doc.css/)上に公開した。
特徴としては以下が挙げられる。

- 一部の要素のみが対象である。
- 圧縮版は2kB以下と小型である。(現在1.5kB以下に到達)
- ドキュメントとして読みやすい。(←私的見解)

サンプルは[こちら](https://re-frain-org.github.io/?key=Doc-CSS&page=content)から確認できるので、是非ともご覧頂き、感想や意見、指摘を頂きたい。
php-master-changes 2019-05-14

今日はテストの修正、不要ファイルの削除、ext_skel.php への拡張名検査の追加、7.3 系の開発バージョンの 7.3.7 への引き上げ、opcache でクラッシュする場合がある問題の修正、空配列を返す際に使うマクロ RETURN_EMPTY_ARRAY() / RETVAL_EMPTY_ARRAY() の追加、bcmath で well-formed でない引数に警告を出すようにする修正があった！

# 2019-05-14
## bukka: Add ping to the fpm test for bug [#77934](https://bugs.php.net/bug.php?id=77934)
- https://github.com/php/php-src/commit/ad63bd169bd82347acd24e69fec500589f185272
- [7.3~]
- sapi/fpm で、[先日の修正](https://qiita.com/sj-i/items/b4b7baa033f359aea31a#bukka-fix-bug-77934-php-fpm-kill--usr2-not-working)のテストに ping を送る処理の追加

## petk: Remove example file for pgsql extension
- https://github.com/php/php-src/commit/da293a8ec41871ec890663593e320436becf2e7f
- [7.4~]
- ext/pgsql で、利用例ファイルの削除
- PHP マニュアルの方に統合するよう修正投げてるとのこと

## dstogov: Fixed test on platforms that don't support fastcall calling convention
- https://github.com/php/php-src/commit/9b18afcbca80e027859dab3b58f66dd901564be0
- [7.4~]
- ext/ffi で、テストを fastcall をサポートしていない環境に対応

## petk: Convert CRLF to LF
- https://github.com/php/php-src/commit/63e43e19ea3f47cfbc28b02d0df3f0255d3d2309
- [7.4~]
- テストの CRLF を LF に変更

## petk: Add extensions naming conventions to ext_skel.php
- https://github.com/php/php-src/commit/44952cd9d4e39cb3b0cf58b33e4d860b346cdc91
- [7.4~]
- ext_skel.php で、拡張名の検査を追加

## petk: Use pkg-config for sqlite3 and pdo_sqlite
- https://github.com/php/php-src/commit/47350ba6e7cb7b92fda0ca3f8082247b109226f9
- ext/sqlite3 と ext/pdo_sqlite で、ビルドシステムの pkg-config への移行

## petk: Update changelog
- https://github.com/php/php-src/commit/dcfc2897323dc864a4d75e524f29d146d4c1554a
- [7.4~]
- ↑を UPGRADING へ追記、拡張の並び順が辞書順でなかったのも修正

## cmb69: Prevent test conflicts
- https://github.com/php/php-src/commit/15b394cce982f1511eb4549c4df71c4eb7804836
- [7.4~]
- ext/phar で、テストの並列実行対策

## cmb69: Fix test case
- https://github.com/php/php-src/commit/704a0ab0c9c0dd2e2b2041f3934df61d7b588cc9
- [7.2~]
- Windows 用のテストで stderr が NUL でなく nil というファイルへリダイレクトされていたのを修正

## cmb69: Prepare 7.3.7-dev
- https://github.com/php/php-src/commit/2d93cce03a96ee7b0265e15e2d56acd173dec682
- [7.3~]
- 7.3 系の開発バージョンを 7.3.7 へ引き上げ

## cmb69: Prevent further potential test conflicts
- https://github.com/php/php-src/commit/2244a7d9afe89979b0d33e6665784996a11ad820
- [7.4~]
- ext/pdo_odbc で、テストの並列実行対策

## dstogov: Fixed possible crashes, because of inconsistent PCRE cache and opcache SHM reset
- https://github.com/php/php-src/commit/5c4d125d4c2976236e2ecddd1d8c6e7b113ec482
- [7.2~]
- ext/opcache で、pcre のキャッシュと干渉してクラッシュする場合がある問題の修正、らしいがよく見てない

## dstogov: Moved NEWS entry
- https://github.com/php/php-src/commit/bb7ecb87043c0d1f3def5a56d2e5bd7fff3f77cb
- [7.3~]
- ↑ の NEWS での記述位置を修正

## nikic: Add RETURN_EMPTY_ARRAY() / RETVAL_EMPTY_ARRAY()
- https://github.com/php/php-src/commit/3f19f5112a7be3e4aa7ab1704d25de54645be373
- [7.4~]
- 空配列を返す際に使うマクロ RETURN_EMPTY_ARRAY() / RETVAL_EMPTY_ARRAY() の追加

## vladyslavstartsev: Warn about non well-formed arguments in bcmath
- https://github.com/php/php-src/commit/a07d422ade48e875740a6733543179e7f67a573e
- [7.4~]
- ext/bcmath で、"32foo" のような well-formed でない引数に警告を出すよう修正
historyに履歴を残さずにコマンドを実行する

```
消したいコマンド; history -d $(history | cut -d " " -f 3 | tail -1)
```

* cut のオプションは OS によって変わるかもしれません。maxOS High Sierra で確認しました
* あくまで history に残らないだけで、ターミナルのバッファ等には残りますのでご注意
* もっとよいやり方がありましたら教えてください!
Windows Server 2016でWindows Defenderによりメモリが異常に使用される

表記の事が本番運用環境で発生したので、備忘録がわりに。

##停止の仕方
グループポリシーで制御する。
ローカルグループポリシーエディター(gpedit.msc)を起動し、下記のポリシーを有効化する事で、Windows Defenderを無効化することが可能。

■ Windows Defender 無効化ポリシー (Windows Server 2016)
・ コンピューターの構成
　 - 管理用テンプレート
　 　- Windowsコンポーネント
　 　　- Endpoint Protection
　 　　　- Endpoint Protection を無効にする：有効

##補足
OS のバージョンによりEndpointProtection が存在しない場合、
"WindowsDefender"もしくは"WindowsDefenderウイルス対策"という項目を選択する事で同様の操作が可能である(らしい)
aws ecsコマンドのテンプレートにdeploymentControllerが無い

## 背景

[公式](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service_definition_parameters.html)によるとこのコマンドを叩くと

```
$ aws ecs create-service --generate-cli-skeleton
```

下記が含まれるテンプレートが返却されるはずだが何故かない

```
    "deploymentController": {
        "type": "ECS"
    },
```

## 解決した流れ
バージョンは下記だったが、古かったらしい。

```
$ aws --version
aws-cli/1.15.50 Python/3.7.0 Darwin/18.5.0 botocore/1.10.49
```

brewでインストールしてたのでアップグレード

```
$ brew upgrade awscli
```

aws cliが更新されている事を確認

```
$ aws --version
aws-cli/1.16.150 Python/3.7.3 Darwin/18.5.0 botocore/1.12.140
```

この状態でコマンドを叩くと正しいテンプレートが返却されました。
AzureVMのPrivate IP Addressを出力する

Azure VMの(正確にいうとNICの)プライベートIPを一覧出力したい。
そんな時のAzure Powershell。
(パブリックIPは普通に出るんですが…。)

##コマンド
`$rgName = "リソースグループ名"
$niclist = Get-AzureRmNetworkInterface -ResourceGroupName $rgName
foreach ( $nic in $niclist ){Write-Host $nic.Name,$nic.IpConfigurations.PrivateIpAddress}`