OmniAICreator/Qiita-1.07M huggingface dataset:
Type 型の拡張

# System.Type 型のユーティリティ

拡張メソッド用に TypeExtensions クラスを用意


## 指定した型に代入可能か判断する
Type.IsAssignableFrom メソッドがあるが、指定した型「から」なので不便

```C#
public static bool IsAssignableTo(this Type type, Type to)
{
	return to?.IsAssignableFrom(type) ?? false;
}
```


## 指定したインターフェイスを実装するか判断する

```C#
public static bool HasInterface(this Type type, Type interfaceType)
{
	if (type == null) throw new ArgumentNullException(nameof(type));
	if (interfaceType != null)
	{
		foreach (var item in type.GetInterfaces())
		{
			if (item.Equals(interfaceType)) return true;
		}
	}
	return false;
}
```


## 数値型か判断する

```C#
public static bool IsNumeric(this Type type) => numericTypes.Contains(type);
static Type[] numericTypes = new[] { typeof(byte), typeof(sbyte), typeof(int), typeof(uint), typeof(short), typeof(ushort), typeof(long), typeof(ulong), typeof(float), typeof(double), typeof(decimal) };

//public static bool IsNumeric(this Type type)
//{
//	return type.IsPrimitive && (type != typeof(bool)) && (type != //typeof(char));
//}
```


## Null 許容型か判断する

なぜ標準にないのか。。

```C#
public static bool IsNullable(this Type type)
{
	return type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(Nullable<>));
}
```


## Null 許容型の基になる型を取得する

Null 許容型 だと Convert.ChangeType メソッドで型変換できないため、
Null 許容型の場合は基の型、それ以外はその型を使えるように。

```C#
public static Type GetUnderlyingType(this Type nullableType)
{
	return nullableType.IsNullable() ? Nullable.GetUnderlyingType(nullableType) : null;
}

public static Type GetUnderlyingTypeOrSelf(this Type type)
{
	return type.GetUnderlyingType() ?? type;
}
```


# その他ユーティリティ

## 値が範囲内か判断

```C#
public static bool IsWithinRange<T>(this T value, T? lower, T? upper) where T : struct, IComparable<T>
{
	if (lower.HasValue && (value.CompareTo(lower.Value) < 0)) return false;
	if (upper.HasValue && (value.CompareTo(upper.Value) > 0)) return false;
	return true;
}
```
テーブルの値を他のテーブルの値に置き換えて表示する

# 環境
* SQL Server 2014/2017

# 結論

値を参照できるように、両方のテーブルにIDが必要です。

``` sql:example1.sql

select 置き換えたい列名 = (
    select 参照先列名
        from 参照先テーブル名
        where 置き換えたいテーブル名.置き換えたい列名 = 参照先テーブル名.参照先列名)
from 置き換えたいテーブル名

```

# 具体例

StudentsテーブルにはStudentID,Name,FavoriteSubjectIDの3つの列が存在します。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/a734e63b-cb91-a458-8e7d-4081df722ec1.jpeg)



SubjectsテーブルにはSubjectID,SubjectNameの2つの列が存在します。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/75c126f4-a31b-44c5-a20f-fdb5e293ff03.jpeg)


StudentsテーブルのFavoriteSubjectIDをSubjectテーブルのSubjectNameに置き換えて表示したいと思います。つまり、

* これを  
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/c5a576ef-89c1-4ea0-300b-3cce8aacafbe.jpeg)

* こうしたい  
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/d1d883c1-89d8-8b6b-8114-58525a433451.jpeg)



```sql:example2.sql

select StudentID,Name,FavoriteSubjectID =(
	select SubjectName 
		from Subjects 
		where Students.FavoriteSubjectID = Subjects.SubjectID)  
from Students

```
mackerelのインストール後のEC2インスタンスのファイルシステム100%アラートの解消方法


いつもどおり、EC2を立ち上げてmackerelをインストールしたら突然アラートが飛んで来てビビる。

<img width="386" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/14768/c571436a-091a-ea2b-6c74-f6991b0ce8be.png">

dfかけると使用量100%の謎のloopデバイスが...

<img width="461" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/14768/202b76c5-c05a-b266-39d2-d253ecfff042.png">

よくわからないけど、/dev/loopが邪魔な模様。

# 解決方法

以下ように設定しループデバイスを除外する

```:/etc/mackerel-agent/mackerel-agent.conf
[filesystem]
ignore = "/dev/loop.*"
```

```sudo service mackerel-agent restart```で再起動


#参考

以下が参考になりました。ssm-agentが原因だったのですね。

【Mackerel】 snap のループデバイス /dev/loop の filesystem Usage 100% を 無視する
https://djeeeno.blogspot.com/2018/07/20180729-01-mackerel-snap.html
【baserCMS：初心者向け】コンテンツの文字制限

#コンテンツ出力の文字制限

管理画面で登録したコンテンツ(本文)をトップの新着リストなどで表示する際に文字制限したい時があると思います。
そんな時はこのタグを使って見てください。

###記事へのリンクなし (36文字以上を「…」で表示)
~~~php
<?php echo mb_strimwidth($this->Blog->getPostTitle($post, false), 0, 36, '…', 'utf-8') ?> 
~~~

###記事へのリンクあり (36文字以上を「…」で表示)
~~~php
<?php echo $this->Blog->getPostLink($post, mb_strimwidth($this->Blog->getPostTitle($post, false), 0, 36, '…', 'utf-8')) ?>　
~~~
あまりものを考えないキャッシュの作り方

# 要件

ライブラリの選定が面倒だったりで、あまりものを考えたくないけどオブジェクトをキャッシュしたいとき。
キャッシュサイズが小さく、JVMが起動している間はキャッシュクリアする必要ない場合。
ただ、並列処理には対応しなければいけない。
このくらいの要件であれば、ライブラリなど要らず簡単に実装できます。

# 実装方法

[`ConcurrentHashMap#computeIfAbsent`](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#computeIfAbsent-K-java.util.function.Function-)使う

例えば、特定のクラスからpublicなフィールドを取得したい場合、こんな感じ。

```java
public class PublicFieldCache {
  private static final Map<Class<?>, Field[]> cache = new ConcurrentHashMap<>();

  public static Field[] getFields(Class<?> type) {
    return cache.computeIfAbsent(type, Class::getFields);
  }
}
```
TensorFlow LiteでAndroid Neural Networks APIを(強制的に)利用する

# TensorFlow LiteでAndroid Neural Networks APIを(強制的に)利用する

## TensorFlow Liteとは
[TensorFlow Lite](https://www.tensorflow.org/lite/overview)はTensor Flowのモバイル向けライブラリで、モバイル端末で機械学習モデルを実行するための機能が備わっています。

![](https://www.tensorflow.org/images/tflite-architecture.jpg)
また、AndroidでTensorFlow Liteを利用する場合、Android8.1から提供されているNeural Networks API(以下NNAPI)によるハードウェア高速化が行えます。

しかし、ハードウェア高速化が見込めない場合(エミュレータ等でアプリを実行する場合)、デフォルトでNNAPIをコールせずに、CPUにフォールバックして処理を行ってしまいます。

自分のケースでは、この挙動を把握しておらず、NNAPIを利用する場合としない場合で推論の結果が微妙に変わってしまうことがあったため、今回TensorFlow Liteを用いる場合に、強制的にNNAPIを利用する方法を書こうと思います。

## 強制的に利用する方法
`implementation 'org.tensorflow:tensorflow-lite:1.10.0'`

```Kotlin
val interpreter = Interpreter(modelFile)
interpreter.setUseNNAPI(true) // interpreterの作成時にこの1行を追加
```

`interpreter.setUseNNAPI(true)`を呼ぶことで、強制的にNNAPIを利用することができます。

## 注意点
しかし注意点が1つあり、自分はここでハマってしまいました。

**`setUseNNAPI(true)`を利用する際、`minSdkVersion`を28以降にする必要があります**

Android Neural Networks API自体はAndroid8.1(API Level 27)から追加されたものですが、API Level 27のデバイスで`setUseNNAPI(true)`を有効にした場合、アプリがクラッシュしてしまいました。

## まとめ
TensorFlow LiteでNNAPIを強制的に利用する場合
- `interpreter.setUseNNAPI(true)` を呼ぶ
- `minSdkVersion` は28以降にする
SourceTree3.0.6でエラー：Askpass.exe: No such file or directory

# 環境
OS:Win10
前Ver:2.6.10

# 症状
3.0.6にバージョンアップしたら、プッシュできなくなった。


エラーメッセージ:

``` 
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v origin develop:develop
error: cannot spawn C:\Users\admin\AppData\Local\SourceTree\app-3.0.6\tools\Askpass.exe: No such file or directory
bash: /dev/tty: No such device or address
error: failed to execute prompt script (exit code 1)
fatal: could not read Username for 'https://bitbucket.org': No error
Pushing to https://bitbucket.org/onoche/autotrade.git
エラー終了しました。エラーの内容は上記をご覧ください。
```

# 本家にスレッド立ってました。
Error : Askpass.exe: No such file or directory
https://community.atlassian.com/t5/Sourcetree-questions/Error-Askpass-exe-No-such-file-or-directory/qaq-p/908286

原因：Askpass.exe見つからない。
バグっぽい。
今週(2018/10/22の週)の3.0.8で修正予定。
とのこと。

# 対策
①これで治った！！（治らない人もいるらしい）
前バージョンのSourceTreeから、3ファイルをコピーする。
・Askpass.exe
・Askpass.UI.Wpf.dll
・SourceTreeShared.dll

C:\Users\<username>\AppData\Local\SourceTree\app-2.6.10\tools
↓
C:\Users\<username>\AppData\Local\SourceTree\app-3.0.6\tools

②古いバージョンでも動きました。
前のが残ってた。(アトラシアン、消す自信ないのか？)
C:\Users\admin\AppData\Local\SourceTree\app-2.6.10\SourceTree.exe

③治らない場合は、3.0.8を待て。
Hyperledger Fabric 1.2.1を動かして、ブロックチェーンの動作を確認・検証しよう


ブロックチェーンの基本概念は理解したものの、より実践的な知識を得たい人のために、次の４つの記事をご用意しました。記載された操作を順次行うことにより、Hyperledger Fabricの実際の動きを体感できます。
さらに、ブロックの中身やトランザクションの動作、ログ等を通して、テクノロジーの深い理解や設計・運用について課題解決のヒントを得ることができます。

##■ 各記事の内容
###[第1回 Hyperledger Fabricを動かしてみよう (v1.2.1対応版)](https://qiita.com/miki110/items/7f4ef59b43c63aa7b754)
　次の内容をご紹介します：
 ・Hyperledger Fabricの最新動向、新機能
 ・サンプルのアプリケーションを実行するための環境の構築方法    
###[第2回 Fabcarサンプルで学ぶHyperledger Fabric Node.js SDK (v1.2.1対応版)](https://qiita.com/yoshihiro-nnnn/items/a9db142f59f606977b11)　
 次のような開発・構築を体験します：
　・サンプルのbasic-network を使用して、ネットワーク設定およびチェーンコード開発を実施。
　・クライアントアプリケーションのサンプル"fabcar"を使用して、Node.jsから、スマートコントラクト (チェーンコード) を呼び出す。

###[第3回 Hyperledger Explorer（v0.3.7版）で確認できる情報](https://qiita.com/fhoshi/items/6da01b7aa6f9b0c6b059)
  次の内容を紹介します：
   ・Hyperledger Explorerの目的・機能
   ・Hyperledger Explorerの画面

###[第4回 可視化ツール Hyperledger Explorer で Hyperledger Fabric ブロックチェーンを見てみよう（v1.2.1対応版)](https://qiita.com/hi5san/items/c28b71205534d93be46c)　　　
次の内容を紹介します：
・Hyperledger Explorer のインストール方法とその前提条件
・Hyperledger Fabric の動作を、Hyperledger Explorerで確認するための環境設定
・トランザクションの実行をHyperledger Explorer の画面で確認
##■ 前提知識　
　上記の記事は読者が以下の知識を有するものとして書かれています。
　　・Linuxの基本操作
　　・Dockerの基本操作
　　・Hyperledger Fabricの基本概念　

##■ 参考図書
　Hyperledger Fabricの詳細については、リックテレコム社
　　[ブロックチェーンの革新技術──Hyperledger Fabricによるアプリケーション開発](http://www.ric.co.jp/book/contents/book_1146.html)
などをご参照ください。
AmazonLinux2にphp7.4をamazon-linux-extras & yum repositoryのREMIをINSTALL

#AmazonLinux2のデフォライブラリが古すぎ

```bash
sudo su -
yum update
yum install httpd
yum list php*
#5.4.16-45.amzn2.0.6
#古い
```
#Remiから入れる

```bash
amazon-linux-extras install epel
#install epel and remi
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

amazon-linux-extras install php7.4
yum-config-manager --enable epel,remi-php74,remi-safe,remi
yum install --enablerepo=epel,remi,remi-php74 php php-mbstring php-gd php-pear

```

#以下php7.2のインストールでコケたときの備忘録

```bash
#######以下php7.2のインストールでコケたときの備忘録


yum-config-manager --enable epel,remi-php72,remi-safe,remi
yum install --enablerepo=epel,remi,remi-php72 php php-mbstring php-gd php-soap php-pear php-xml php-pdo php-pgsql php-pecl-zip
#怒られる
#php-pecl-zip-1.15.4-1.el7.remi.7.2.x86_64 (remi-php72)
yum install --disablerepo=amzn2-core --enablerepo=epel,remi,remi-php72 php php-mbstring php-gd php-soap php-pear php-xml php-pdo php-pgsql
#怒られる
#php-cli-7.2.11-1.el7.remi.x86_64 (remi-php72)


```

バグってるらしい
https://forums.aws.amazon.com/thread.jspa?threadID=270790&tstart=0

#php72→remove→php

どうもamzn-coreとremiで競合してるらしいので
php72(amzn-coreのphpに引っかからない)をinstallして依存性解決しつつinstallしたあと
一旦php72をremoveしてamzn-coreを無効化してphpをREMIからinstallする

```bash
yum install php72 php72-php php72-php-mbstring php72-php-gd php72-php-soap php72-php-pear php72-php-xml php72-php-pdo php72-php-pgsql
#とりあえずphp72は入るが

php -v
#-bash: php: 
#phpは使えない

#一旦消して
yum -y remove php72*
#REMIのphp72をphpとしてインストール
yum install --disablerepo=amzn2-core php php-mbstring php-gd php-soap php-pear php-xml php-pdo php-pgsql

php -v
#PHP 7.2.11 (cli) (built: Oct 10 2018 10:00:29) ( NTS )
#Copyright (c) 1997-2018 The PHP Group
#Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

#普段使わない使わないrepositoryは止めておく（有効にしとくべきという理論もある）
yum-config-manager --disable remi-php72,remi-safe,remi

```


#libzipを入れる
どうもこいつが主犯らしい

```bash
#amzn-coreの方を消す
yum remove libzip
#remiの方から依存解決させる
yum install --enablerepo=epel,remi,remi-php72 php-pecl-zip

```
[python]多項式にノイズをのっけてプロット

[sin関数に適当にノイズをのせてプロット](https://qiita.com/u1and0/items/0625f7a1cd9b476270bb#sin%E6%B3%A2)したり、[make_moonに適当にノイズをのせてプロット](http://airoboticsandsoon.hatenablog.jp/entry/2018/03/05/234230)したりといった記事が散見されますが、多項式に適当にノイズをのせてプロットしている記事が見当たらなかったので作りました。

次の例では、$$y=-\frac{1}{2}+\frac{1}{2}x-\frac{1}{2}x^2+\frac{1}{2}x^3$$に適当なノイズを与えてプロットしています。

```python:noise.py
import numpy as np 
import matplotlib.pyplot as plt
import random
import sys

if __name__ == "__main__":
	
	dim  = +3 #dim次元の多項式の
	number_of_points = 250 #プロットしたい点の数
 	xmin = -3 #定義域の最小
	xmax = +3 #定義域の最大
	variance_of_noise = 1 #ノイズの大きさ

	coefficient = [-0.5,0.5,-0.5,0.5] #係数。左から順に0次,1次,2次,3次。

	#多項式の次元の数と、係数の数が一致しない場合は終了。
	if len(coefficient)-1 != dim:
		print("Error.")
		sys.exit()

	x = np.zeros(number_of_points)
	y = np.zeros(number_of_points)
	noised_y = np.zeros(number_of_points)

	for i in range(0,number_of_points):
		x[i] = random.uniform(xmin,xmax)
		
		for j in range(0,dim+1):
			y[i] = y[i] + coefficient[j]*x[i]**j

		noised_y[i] = np.random.normal(loc=y[i],scale=variance_of_noise)

	plt.scatter(x,noised_y)
	plt.xlabel("x")
	plt.ylabel("noised_y")
	plt.show()
```


![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/139546/55a2db41-e65f-8223-209e-2af68fe638aa.png)

###コードの解説

```python
random.uniform(xmin,xmax)
```
で、xminからxmaxまでの小数をランダムに抽出する。

```python
np.random.normal(loc=y[i],scale=variance_of_noise)
```
で、y[i]を中心にvariance_of_noise程度の広がりを持つガウシアンからサンプリングする。

###もっと高次元で試してみると…

係数を格納する配列coefficientに過不足なく係数を与えればより何次元の多項式でもOK

例1 $y=x^4-2x^2+2$ ノイズの大きさ0.1
![Figure_3.png](https://qiita-image-store.s3.amazonaws.com/0/139546/e7d6fb8f-3bcb-c7f7-a7fa-1c45d63bb693.png)


例2 $y=x^5−7x^4+17x^3−17x^2+6x$　ノイズの大きさ0.1
![Figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/139546/0638326d-9f9b-eb62-948a-655a30abd337.png)
Windows10にRuby 2.5 + Rails 5.2.1 環境を作成する。

# はじめに
『完全sier脱出マニュアル』を読んで、さっそくrailsチュートリアルをやろうと思ったので、環境を作成したのですが、railsサーバーが起動しないトラップにはまりました。
参考となるサイトが分散していたり、Windowsの情報が少なかったのでまとめておきます。うまいことピンポイントな記事ってないもんですね。

筆者は普段業務Javaプログラマーなので、自宅のPCもWindowsなのです。MacBook欲しい。  
Rubyの開発経験もなく、Qiitaも初投稿なので、何か記述内容に誤りがありましたらご指摘よろしくお願いします。

# 対象読者
- railsチュートリアルをWindowsでやりたい初心者の方  

# 環境
- OS:Windows10 (64bit OS)
- Ruby 2.5.3
- Ruby on Rails 5.2.1

# 参考
1. 【Ruby on Rails】WindowsでのRuby on Rails環境構築
https://meltingrabbit.com/blog/article/2018081501/  
  
2. WindowsでRailsTutorialするときに気をつけること - Qiita.url
https://qiita.com/jun_moka/items/a83a8149bc97cedc16b5  

# 手順
手順は同バージョンでできそうなサイトを探して、  
<参考1.>の投稿手順に沿って進めました。
1. 【Ruby on Rails】WindowsでのRuby on Rails環境構築
https://meltingrabbit.com/blog/article/2018081501/ 

- ２．Rubyのインストール
- ３．Railsのインストール  
    -    3.3.まで。  

    MySQLは使わないので3.3まで行います。

この手順まで、何も問題が発生しなかったので省略します。  
参考元サイトがしっかりしているので。  
gemのアップデートも行いました。  
  
テキトーなプロジェクトを作成します。  
  
```
rails new helloapp
```
コンソールにログがたくさん出てくるので終わるのを待ちます。  
数分待つとエラーも発生せず、プロジェクトが作成されました。
  
作成したプロジェクトに移動し、サーバーを立ち上げます。

```
cd helloapp
rails s
```

エラー…。立ち上がりません。

```
…
…
cannot load such file -- sqlite3/sqlite3_native (LoadError)
```
  
ググってみるとたくさん出てきてけっこう色々な人が困っているようですね。  
以下リンクの回答によるとruby 2.5にsqliteが未対応らしいです。この質問者の人はruby2.4バージョンに再インストールしたら上手くいったみたい。

>sqlite3 の x64-mingw32 用 gem がまだ ruby 2.5 に対応していないということです。  

https://ja.stackoverflow.com/questions/42982/rails-s-%E3%81%A7-sqlite3%E9%96%A2%E9%80%A3%E3%81%AE-loaderror-%E3%81%8C%E3%81%A7%E3%81%BE%E3%81%99
  
<del>再インストールがめんどくさいので</del>何か方法があるはずだと思って継続調査した結果対応している方がいらっしゃいました！  

<参考2.>がまさに欲しかった記事でした。  
2. WindowsでRailsTutorialするときに気をつけること - Qiita.url
https://qiita.com/jun_moka/items/a83a8149bc97cedc16b5  
  
自分が実施したときは、sqliteのバージョンが変わっていたのと、bcryptが3.1.12になってました。  
  
ソースファイル  
sqlite-amalgamation-3250200.zip

DLL  
sqlite-dll-win64-x64-3250200.zip
  
記事内コマンドのファイル名とバージョンを修正して、実行する。  
終わったら再度サーバーを立ち上げる。

```
rails s

=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.12.0 (ruby 2.5.3-p105), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

```

エラーなく起動した。  

# 確認
ブラウザで以下に接続して確認。  
`localhost:3000`

![hello_rails.png](https://qiita-image-store.s3.amazonaws.com/0/298626/156341fd-cc1c-6ace-1cf9-7581a1a8fcf7.png)


サーバーが立ち上がることが確認できた。  


# おわりに
Rubyはバージョンの依存関係が複雑そうですね。 
チュートリアル頑張ります。
@ConfigurationProperties の prefix でちょっとはまった

例えば、下記のような設定だったとして、

```yml:application-37.yml
file: 
  37: 
    file-name: hoge
```

```yml:application.yml
spring: 
  profiles: 
    active: 37
```

```java:File37Context.java
@ConfigurationProperties(prefix = "file.37")
pulic class File37Context {
  String fileName;
  // setter,getter
}
```

`spring-boot 2.0.6` では `fileName` が取得できたのに、
`spring-boot 1.5.17` では `null` になってしまった。

どうやら `37` の部分が配列の数字？と認識されたような動きで、

```java:File37Context.java
@ConfigurationProperties(prefix = "file[37]")
pulic class File37Context {
  String fileName;
  // setter,getter
}
```

と修正すると `spring-boot 1.5.17` でも値が取得できるようになった。
数字だけってのがダメっぽい。

気持ち悪いので、

```yml:application-37.yml
file: 
  type37: 
    file-name: hoge
```
```java:File37Context.java
@ConfigurationProperties(prefix = "file.type37")
pulic class File37Context {
  String fileName;
  // setter,getter
}
```

って感じで数字以外を付与してあげることで、最終的に解決。

問題がjavaなのかspringなのかtomcatなのかで最初は全然わからなくてちょっと時間かかった。。。

仕事で使わなきゃいけない動作環境がjdk1.6ってことでなんだかわけわかんなくなるような作り方してるけど、なんだかなぁ。。。
こんなので嵌る人って他にいるのかなぁ。。。
Google Apps Scriptとは？①

はじめまして。ららと申します。
今回から、Qiitaを利用して自身の備忘録を投稿していきたいと思います。

#自己紹介
名前　：らら
twitter　：[@raratako16](https://twitter.com/raratako16)(よかったらフォローお願いします。)

やっていること：主に行なっていることは、GoogleAppsScript(GAS)を利用してWEBシステムの提案、構築、導入を行なっています。他にもCOBOLシステムのマイグレーション等を経験しています。

#GoogleAppsScript(GAS)とは？
GASはGoogleが提供しているサーバーサイド言語です。googleが提供しているアプリケーション(Gmailや
Googleカレンダー、Googleスプレッドシート等)のアクセスが容易です。スクリプトの言語は、JavaScriptをベースとなりJavaScriptを触ったことがある方なら抵抗が少ないと思います。[公式サイト](https://developers.google.com/apps-script/)

#GASでHello world
GASの使い方から、「Hello GAS!!」をログに出力するまでのやり方です。

##googleアカウントを用意する。
GASを利用するために最低限必要です。まだgoogleアカウントを持っていない場合はを取得してください。
アカウント作成、ログイン後GoogleDriveにアクセスして下さい。
[![スクリーンショット 2018-10-23 18.44.49.png](https://qiita-image-store.s3.amazonaws.com/0/211927/6e0da9b3-99fc-4f75-8312-7f643103ac25.png)](https://drive.google.com/drive/)

##GoogleAppsScriptアプリ追加
GoogleDrive上で右クリック=>その他=>アプリ追加にアクセス後、検索欄に「GoogleAppsSctipt」と入力し検索してください。
上位にGoogleAppsSctiptのアプリケーションが表示するので追加してください。（画像は既に追加している状態です。）
![スクリーンショット 2018-10-23 18.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/211927/c76e45a1-81a3-4272-ff47-c4e24b877750.png)

##GASを起動
再度、GoogleDrive上で右クリックをすると、アプリケーションの中に先ほど追加したGoogleAppsSctiptがあるので、クリックしてください。
![スクリーンショット 2018-10-23 18.45.53.png](https://qiita-image-store.s3.amazonaws.com/0/211927/c3bc0355-b46d-3544-5d36-8e67b9139aaa.png)

すると、エディタが開きます。これがGASのweb上での開発画面になります。
新規作成するとプロジェクト名が「無題のプロジェクト」になっているので、好きな名称に変更してください。（今回は、HelloWorldとします。）
![スクリーンショット 2018-10-23 18.54.08.png](https://qiita-image-store.s3.amazonaws.com/0/211927/7e5ce626-b4a5-20a5-2ef7-8c2f690144f6.png)

##HelloWorldコード
コード.gsはの中身をすべて削除し、以下の通りに変えてください。

```javascript:コード.gs
function helloworld()
{
  //LoggerはGAS専用のメソッドです。
  Logger.log('Hello GAS!!');
}

```

##実行
書き換え後、コードを保存(mac: command + S)(win: ctrl + S)を行い、実行ボタン(▶︎)をクリックします。
一瞬、上の方に背景黄色の文字が表示されて消えます。（赤い背景が表示されっぱなしになったばい場合は、構文エラーになっていると思います。）
例えば、Logger.log => Logger.lag　間違えた場合。
![スクリーンショット 2018-10-23 19.09.47.png](https://qiita-image-store.s3.amazonaws.com/0/211927/91250249-4df4-f9a9-1e14-0527a803c3d7.png)

無事処理が終了したらログを確認してください。「Hello GAS!!」と表示されています。
ログの確認方法は、表示=>ログ　または(mac: command + ENTER)(win: ctrl + ENTER)
![スクリーンショット 2018-10-23 19.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/211927/b70160eb-6055-0745-c112-9dd50dddd496.png)

以上がGASの起動方法とHello World までの操作方法でした。

#まとめ
+ GASはGoogleが提供するサーバーサイドスクリプト
+ 言語はJavaScriptベースである
+ GASはGoogleアカウントさえあれば直ぐに使用できる
+ 開発環境を用意する必要がない

次回は、GASの使用パターンを紹介します。

なにかご質問や、指摘等がありましたらよろしくお願いします。

#関連記事
[Google Apps Scriptとは？②](https://qiita.com/rarara_x16/items/adb8bf6f017d495361c7)
WindowsでもLinuxでも使えるフォルダ暗号化されたUSBメモリを作成した（Cryptomator）

# 目的
オフラインのWindowsとLinuxの両方でデータをやり取りするリムーバブルディスクのセキュリティのためのソフトウェアとして、Cryptomatorを利用することとした。

[Cryptomatorのホームページ](https://cryptomator.org/)

# 環境
- Windows 10 (64 Bit)
- Linux
    - Ubuntu 14.04 LTS
- USBメモリ
    - ファイルシステム: exFAT

# 手順
### Windows 10での手順
- Windows 10にCryptomator for Windows Version 1.3.4 (64 bit)をインストールした．
- Cryptomatorを開き，「＋（ここをクリックして金庫を追加）」をクリックし，「新しい金庫を作成」を選択した．
- ファイル選択画面でUSBドライブを開き，何も選択していない状態で金庫フォルダの名前を付けて保存した．（アルファベットで名前を付けたが良いかも）
- パスワードを設定し，金庫の作成をクリックした．
- 一度Cryptomatorを閉じた．
 - 今の状態はUSBドライブに金庫フォルダが作成されており，中に暗号化されたよくわからない名前のファイルとフォルダが入っている状態．
- 再びCryptomatorを開き，先程作成した金庫フォルダを選択した．パスワードを入力して，金庫を解錠させた．
- PCのネットワークドライブとして，金庫ファイルの名前が付いた場所が開けるようになった．
- 適当な画像ファイルを入れて，Cryptomatorで金庫の施錠を行った．
 - 金庫フォルダの名前が付いたネットワークドライブはなくなり，暗号化された金庫フォルダだけが残った．
- USBメモリを抜いた。

### Ubuntu 14.04 LTSでの手順
- USBメモリをUbuntu PCに刺した。
- Ubuntu 14.04 LTSにCryptomator for Linux Version 1.3.2 (64 bit)をインストールした。
 1. 下記の上段を端末で実行した。
 2. Cryptomatorのホームページから64bit用の.debパッケージをダウンロードした。（Ubuntu 14.04 LTSが古いため？）
 3. .debがあるディレクトリで下記の下段を端末で実行した。→menuにCryptomatorのショートカットが追加された。

```
 sudo add-apt-repository ppa:sebastian-stenzel/cryptomator
 sudo apt-get update
```

```
 sudo dpkg -i cryptomator-1.3.2-amd64.deb
```
- Cryptomatorを開き，「＋（ここをクリックして金庫を追加）」をクリックし，「既存の金庫を開く」を選択した．
- USBドライブの中の金庫フォルダの中にある、「masterkey.cryptomator」を開いた。
- Windowsで設定したパスワードを入力し、解錠した。
- Windowsと同様に、ネットワーク上の場所に金庫フォルダの名前がついたネットワークドライブが現れ、Windowsで入れた画像ファイルが確認できた。
redux-offlineのexamplesの使い方



[redux-offline/redux-offline: Build Offline-First Apps for Web and React Native](https://github.com/redux-offline/redux-offline)


## APIサーバー側

以下を実行でポート4000でAPIサーバーが起動する

```
cd examples/web
npm i
npm start
```



## クライアント側

以下を実行でポート3000でクライアントが起動する

```
cd examples/web/client
npm i
npm start
```

## APIサーバーの挙動

####  /succeed-always
常にstatus(200)を返す。

####  /succeed-sometimes
50%の確率でstatus(500)とstatus(200)を返す

####  /fail-sometimes
50%の確率でstatus(500)とstatus(400)を返す


## クライアントの挙動

以下のようなあっさりしたクライアントが起動します。
BasicとPromiseを使うバージョに分岐する画面です。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/6da43c3f-45db-c042-7dc0-b3f0fedb3e8b.png)

### Basic

機能ボタンが３と戻るボタン（home）
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/d9161d24-60b5-99c9-9403-97214e5f1b05.png)

* Succeed Always
* Succeed Sometimes
* Fail Sometimes


#### Succeed Always
成功を返すAPIを呼ぶ（status:200を常に返す）
成功：status: 200

#### Succeed Sometimes
時々成功するAPIを呼ぶ。status:200が応答あるまでリトライ続ける
成功：status: 200
失敗：status: 500 (internal server error)

#### Succeed Always
失敗の種類変えるAPIを呼ぶ。status:400が応答あるまでリトライ続ける
失敗A：status: 500 (internal server error)
失敗B：status: 400 (bad request)


## クライアント画面　React構成

### <SyncStatus

現在進行している状況を表示する

busyの場合(Request投げ中)には、
`Waiting on request - Attempt #{attempt}`

次回のRequestまで待機中の場合には、
`Waiting on retry: {timer}s - Attempt #{attempt}`

何もしてない時には`Synced`を表示

Attemptは試行回数
表示はRedux


### <RequestsQueue


### <MakeRequests



### 設定

`import defaultConfig from '@redux-offline/redux-offline/lib/defaults';`

カスタム
```
const config = {
  ...defaultConfig,
  retry(_action, retries) {
    return (retries + 1) * 1000;
  },
  returnPromises: true
};
```
【C++】セグメンテーションフォールトを補足してログを吐く

C++サーバー(Linux)が落ちるバグで悩まされたので、セグメンテーションフォールトを補足してログを吐く機能を作ってみた。



- CrashReporter.hpp

```C++
#pragma	once

class ICrashReporter
{
public:
	virtual void CrashReport() = 0;
};

class CCrashReporter
{
public:
	static void Setup();
	static void AddReporter(ICrashReporter*);
	static void Start();
};
```

- CrashReporter.cpp

```C++
#include "crashreporter.hpp"
#include <signal.h>
#include <unistd.h>
#include <vector>
#include <thread>
#include <csignal>

volatile std::sig_atomic_t _crashed = 0;
std::vector<ICrashReporter*> _reporters;

static void segv_handler(int sig)
{
	_crashed = 1;
}

static void check_crash()
{
	if (_crashed)
	{
		printf("***** CRASH REPORT *****\n");
		for (ICrashReporter* reporter : _reporters)
		{
			reporter->CrashReport();
		}
		printf("************************\n");
		signal(SIGSEGV, SIG_DFL);
		kill(getpid(), SIGSEGV);
	}
}

void CCrashReporter::Setup()
{
	signal(SIGSEGV, segv_handler);
}

void CCrashReporter::AddReporter(ICrashReporter* reporter)
{
	_reporters.push_back(reporter);
}

void CCrashReporter::Start()
{
	std::thread th([]()
	{
		while(true)
		{
			std::this_thread::sleep_for(std::chrono::seconds(1));
			check_crash();
		}
	});
	
	th.detach();
}

```

- 使い方

```C++
class Hoge : public ICrashReporter
{
public:
    virtual void CrashReport() override {
        printf("吐きたいログ\n");
    }
};

int main()
{
    CCrashReporter::Setup();

    auto hoge = new CHoge();
    CCrashReporter::AddReporter(hoge);
    CCrashReporter::Start();

    //hogeを使った処理...
				
    return 0;
}
```
LINQの代わりにSQLを使用する方法

#はじめに
Entity Frameworkで、DBの検索をLINQではなくSQLを使用する方法についてのメモです。LINQ文とSQL文を両方使用する際の、LINQ文に似た方法でSQLを発行させるメモです。
またSELECT文のみの記載です。
間違いや勘違いに関しましてはご指摘いただけると幸いです。

##前提
Entity Frameworkを使用するSQL発行方法について記載します。
DBファーストで「ADO.NET Entity Data Model」で既に作成されているDBを取り込み、DbContextを継承したDefaultConnectionクラスからDBを使用します。


### テーブルのイメージ

| PersonTable       |
|:------------------|
| string PersonID   |
| strijng Name      |
| int Age           |
| string Mail     |

##本文
まず全体を記載します。
### 全体

```csharp:

private DefaultConnection db = new DefaultConnection();
db.Database.Log = sql =>
{
    Debug.Write(sql);
};

StringBuilder sqBuildel = new StringBuilder(
    @"SELECT 
            PersonID
            , Name
            , Age
            , Mail
        FROM PersonTable
        WHERE PersonID = @personID");
string id = "A103";
object[] param  = new object[] {new SqlParameter("@personID", id) };
string sql = sqBuildel.ToString();
var convert = db.Database.SqlQuery<PersonTable>(sql, param);
List<PersonTable> list = convert.ToList();
```

次に上から記載します。


### DB接続の呼び出し

```csharp:
private DefaultConnection db = new DefaultConnection();
db.Database.Log = sql =>
{
    Debug.Write(sql);
};
```

DBに接続するDefaultConnectionクラスを呼び出し、ログをとるようにします。
これは書籍『ASP.NET MVC 5 実践プログラミング』に載っていた方法です。

### SQLを記載

```csharp:
StringBuilder sqBuildel = new StringBuilder(
    @"SELECT 
            PersonID
            , Name
            , Age
            , Mail
        FROM PersonTable
        WHERE PersonID = @personID");
```

発行したいSQLをStringBuilder型で記載しています。
StringBuilder型を使用している理由は、SQLは文字の量が多くなりやすいため、StringBuilder型で文字列処理を速くさせるためです。


**2018/10/24追記**
コメントにてご指摘いただきました通り、記載したようなSQL文の一発書きの場合、StringBuilder型を使用せず、string型で使用するほうが早くなります。
StringBuilder型は文字列操作を行うことに特化したクラスですので、ベースとなるSQLに、条件に応じてSQL文の追加や挿入が発生するという想定で使用したのですが、ここらへんはまだ勉強不足で申し訳ないです。

```csharp:
string sql = @"SELECT 
                PersonID
                , Name
                , Age
                , Mail
            FROM PersonTable
            WHERE PersonID = @personID";
```

### パラメーターの格納

```csharp:
object[] param  = new object[] {new SqlParameter("@personID", id) };
```

この時、SQL文にある``@personID``のように、``@パラメータ名``と記載した箇所に入るパラメーターを用意します。
可変の値をSQL文に追加する方法はいくつかありますが、ここではSqlParameterクラスを使用して、当てはめるパラメーター名を指定し、使用する値をセットしています。

使用したSqlParameterクラスのメソッドの公式ドキュメントは以下です。
[SqlParameter(string parameterName, object value)](https://docs.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqlparameter.-ctor?view=netframework-4.7.2#System_Data_SqlClient_SqlParameter__ctor_System_String_System_Object_)


### SQLの発行

```csharp:
var convert = db.Database.SqlQuery<PersonTable>(sql, param);
List<PersonTable> list = convert.ToList();
```
``Database.SqlQuery<TElement>``メソッドを使用して``DbRawSqlQuery<TElement>``を取得します。

``DbRawSqlQuery<TElement>``ではまだSQLは発行されていません。LINQでいうところの``IQueryable<T>``を想像していただくとわかりやすいかもしれません。

``IQueryable<T>``と同じく``ToList()``や``foreach文``を使用することでSQLが発行されます。
ただ``IQueryable<T>``とは異なり、SQLの発行は一度のみで、遅延評価は行われません。また一度発行した``DbRawSqlQuery<TElement>``を再度発行することはできません。

#終わりに
SQLを発行させる方法はいくつかありますが、ログを取りたいためにEntity Frameworkを使用した形です。もっと良い方法があれば教えていただけると助かります。
Apache Tomcat のインストール

試したメモ

# 手順
1. 必要なパッケージをインストールする

    ```sh
    # yum -y install gcc autoconf
    ```

2. Tomcat の tar ファイルをダウンロードする

    ```sh
    # curl -LkvOf https://ftp.riken.jp/net/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31.tar.gz
    ```

3. 破損がないかチェックする

    ```sh
    # sha512sum apache-tomcat-9.0.31.tar.gz
    ```
    
    ```
  75045ce54ad1b6ea66fd112e8b2ffa32a0740c018ab9392c7217a6dd6b829e8645b6810ab4b28dd186c12ce6045c1eb18ed19743c5d4b22c9e613e76294f22f5  apache-tomcat-9.0.31.tar.gz
    ```

4. ダウンロードした tar ファイルを展開する

    ```sh
    # tar -zxf apache-tomcat-9.0.14.tar.gz
    ```

# 参考
- [Tomcat Setup](https://tomcat.apache.org/tomcat-9.0-doc/setup.html)
rails5へbootstrapを導入する際に発生するExecJS::ProgramErrorの解決方法

#開発環境
ruby '2.4.4'
gem 'rails', '~> 5.2.1'

#過程
https://github.com/twbs/bootstrap-rubygem
新しく作成したアプリへ上記のページを参考にしながらbootstrapを導入していたところExecJS::ProgramErrorが発生。
#解決方法
railsアプリを作成した際にデフォルトでインストールされているgem 'duktape'(gemfileの20行目前後)を削除。
価値は作るしかない。


随分前にこんなこと書きました、[要件が定義できないことの説明の草案](https://qiita.com/567000/items/04ac8c31727d7631423a)。
色々学びなおして、色々と考えが変わってきたので、現段階の整理。

# 観察することが世界に与える影響

観察をすることは世界に影響をあたえることになります。
これは、システム思考で有名な考え方です。

観察、つまりは、リサーチを重ねれば重ねるほど、その世界に影響が出てくるというものです。

観察の結果出来上がったサービスを作って、それを世界にリリースした時、さらにその世界には変化が現れます。

その世界は、もう、観察前の世界、観察していた世界、とは大きく変わっている世界になると思います。

# 要件定義やシステム思考が役に立たない世界

この理屈は、システム開発において要件定義が役に立たないのと一緒です。

デザイン思考でリサーチを重ねても答えが出ないのと一緒です。

新しいサービス未導入の世界、新しいサービスを使うとどうなるかわからない世界、新しいゲームも、新しい音楽もない、そんな状態で、どういうサービスが欲しいか？どんなゲームがやりたいか？どんな曲が聴きたいか？ それを訪ねられても答えを持ってる人（素人）はいません。

> この辺りはAppleやフォードあたりで良く言われる事例ですね

どういうサービスが欲しいかを聞けば聞くほど、その聞かれた人にも変化が出てくるのです。

どういう課題があるか聞けば聞くほど、その聞かれた人にも変化が出てくるのです。

> 経験あると思いますが、改まって聞かれると、あることないこと言ってしまうものです。
> 人間はそれほど言語だけで物事を感じたりしていないので、言語化する時点で考えが変化していきます。

こうなると本当は欲しくもなかった機能まで欲しいと言ってきました。

本当は課題と思ってないことまで課題と言ってきます。

そうやって作られてリリースされたサービスは、本来の課題解決のためのサービスではなく、ただ、"その人が欲しい" と言っただけのサービスになってしまうのだと思います。

## 言語化しない観察は？ なんとかリサーチやえすのぐらふぃーとか？

遠くから、観察対象にばれないようにカメラをまわせば、それは観察対象に影響を与えないのでしょうか？

その人たちと一緒のように暮らせば影響を与えないのでしょうか？

そんなことありません。

最初に言った通り、観察をすることは、その観察対象に影響を与えることなのだと思います。

それには様々な要因が考えられます。

> シュレーディンガーの猫のような理屈もあるでしょう。
> 観察することによってその対象が決まるという理屈です。
> 深淵を覗き込んだ時には、深淵にも覗かれているということを忘れてはいけないのです。

とてもとてもシンプルに言えば、認識している「世界」は自分の中にのみあるからです。

カメラを回せば、カメラで撮れなかった全てが削り落とされます。 音は？ 温度は？ 今のセンサでは捕捉できない第六感的な何かは？ 観察する前は無限にあったはずの情報が観察することで、観察できる情報だけに特定されて、それ以外が削り落とされます。

観察は、取捨選択をすることなのです。

結局、観察してるふりをして、自分に都合の良い欲しい情報を得ているだけです。

# では、どうすればよいのか？

世の中にある優れたプロダクトやサービスは、XX思考やXXプロセスの結果生まれてきたわけではないのです。

後付けで、そんな思考やプロセスを加えることはできますが、そのプロダクトやサービスを作った彼ら・彼女らの絶え間ない努力、知識と経験に裏付けられた勘によって作られたものです。

結局は、とてもシンプルに、自分（自分たち）の専門性を鍛えて、審美眼を鍛えて、その専門性をもって「価値」を作り上げていくしかないのだと思います。

> その鍛錬の過程として、過去のノウハウである XX思考 や XXプロセス を学ぶのは大事なことだとは思います。
> それらを学ぶことによって、学ばない場合に比べて、成功の確率は上がると思いますので。

作り上げた「価値」が本当に誰かの役に立ったかどうかは、それはその「価値」が世の中に受け入れられたかを静かに見守るしかないのだと思います。

ダメだったら、またやり直せばいいのだと思います。

やらなければいけないことは、

- 日々鍛錬すること
- 自分に謙虚に、世の中の批評を受け、失敗に気付き、日々改善を続けること

おそらくはシンプルにそういうことなのだと思いました。
ReactNative Elementsで簡単にUIを作る

React Nativeを入れてまずはUIを作りたい！となったとき、何をどうすればいいのかわかりませんでした…。
色々調べているうちに、ReactNative ElementsとNative Baseという有名なライブラリがあるということが判明。2つを見比べてみて、なんとなく見た目が良かったReactNative Elementsを使ってみることにしたので、導入手順をメモしておきます。

[公式ドキュメント](https://react-native-training.github.io/react-native-elements/docs/0.19.1/getting_started.html)

[ReactNative＆TypeScriptの環境構築手順](https://qiita.com/sabineko/items/db3772dd7cb1596696db)

## インストール

最初にreact-native-vector-iconsをインストールします。コレを入れておくと簡単にアイコンが使えます。アイコンすでに準備してあるからいらない、と思ってインストールしなかったら、ビルドでエラーが出て「react-vector-iconsがない」と言われたので、ReactNative Elementsを使う場合は必須ぽいです。

```
$ npm install react-native-vector-icons --save
$ react-native link react-native-vector-icons
```

で、ReactNative Elements本体をインストールします。

```
$ npm install react-native-elements --save
```

## 使い方

#### 試しにボタンをつけてみる(App.tsx)
```typescript
// 他のimportは省略
import { Button } from 'react-native-elements'

type Props = {};
export default class App extends Component<Props> {
  private tsText: string = "&TypeScript";   // とりあえず型を使ってみる
  // ボタンのクリックイベント
  click(){
    alert('(☝ ՞ਊ ՞)☝ｳｪｰｲ');
  }
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>Welcome to React {this.tsText}!</Text>
        {/* ↓ここから下がReactNative Elements */}
        <Button 
          large
          backgroundColor='#53DCD0'
          icon={{name: 'android'}}// nameにアイコン名を指定
          title='Weeei Button!'
          onPress={this.click}
        />
      </View>
    );
  }
```

stylesの記述は省いてますが、こんなふうにApp.tsxを記述すると、Androidアイコンのボタンが作れます。
AndroidStudioの設定がうまくいかなかったのでiOSシミュレータを使って表示しました。
![スクリーンショット 2018-10-23 13.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/231072/07624dac-15d2-ce28-5768-db8ad97b8731.png)
ボタンをクリックすると…
![スクリーンショット 2018-10-23 13.25.51.png](https://qiita-image-store.s3.amazonaws.com/0/231072/8b39afdc-e594-34aa-fd57-cd24a60479cc.png)
iOSデフォルトのアラートが表示されます。

アイコンは[ここ](https://material.io/tools/icons/?style=baseline)にのってるものなら表示できるようです。これはイチからアプリを作るのに便利かも。ということで導入編でした。

次からはアプリっぽいUIを作っていきます。


### 参考サイト
https://react.keicode.com/native/elements-getting-started.php
pyenvを使ってsystemのpythonを2系のままQGIS3を動かす


## 概要
pyenvを使ってpython3.6系を使ってるのに、QGIS3をインストールしようとしたら、「QGIS requires Python 3.6.」とエラーが出てインストールできない。

<img width="449" alt="ss_ 2018-10-16 19.24.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/d319151f-bbc4-da7e-9d2d-c620453662bb.png">


pyenv環境でQGIS3を動くように記事を書いてる方がいたけれど、なんとなくsystemのpythonのバージョン自体を上げたくないので、別に記事を書きました。

環境はMacデフォルトで入っているpythonのバージョンは2.7.10、
OSはHigh Sierraで作成しましたが、その後 Mojave 10.14 に上げても動いています。

参考記事
https://qiita.com/th1nkd0g/items/3182e210b6a8b0ba0e79

## pyenv で3.6系をインストール

```
env PYTHON_CONFIGURE_OPTS="--enable-framework CC=clang" pyenv install 3.6.3
```

python install時にframeworkモードでビルドするように指定する。
`--enable-framework`をオプションとしてつけると、pythonのインストールしたディレクトリ直下にPython.frameworkというディレクトリができる。
無事インストールできたらpyenvでバージョンを3.6.3にしておく。

`pyenv global 3.6.3`

### pyenvでインストール時にエラーが出る

> BUILD FAILED (OS X 10.13.6 using python-build 1.2.0)
> (中略)
> zipimport.ZipImportError: can't decompress data; zlib not available

みたいにエラーが出てきたら `xcode-select --install` でコマンドライン開発ツールをインストールしてから再度python3.6.3をインストールする。

## Python.frameworkにシンボリックリンクを張る。
この張り方だと乱暴なので`pyenv global system`とかで切り替えた時になにかエラーが出そうな気もするけどとりあえずすすめる。

```
sudo ln -s /Users/{ユーザ名}/.anyenv/envs/pyenv/versions/3.6.3/Python.framework/ /Library/Frameworks/Python.framework
```

## QGIS3をダウンロードする

https://qgis.org/ja/site/forusers/download.html からMac OS X版をダウンロードする。

適当に展開すると、インストールするものが1,2,3とありますが1はこれまでの作業で終わったので、2 GDALと 3 QGIS をインストールする。
GDALはQGIS2の時にインストールしたから要らないかな、とか手を抜くと普通に起動時にエラーが出てくるので、何度目だろうとGDALのインストールをしてからQGISのインストールをします。

GDALのインストール忘れて起動しようとした場合
> Couldn't load plugin 'processing' 

<img width="517" alt="ss_ 2018-10-16 19.42.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/825c57c8-b110-17f3-0d21-e5cb86f7c3a8.png">

### MetaSearchが見つからない
自分の環境だと以下のエラーも出てきたので対処方法です。

> classFactory（）メソッドの呼び出し時にエラーが発生したためプラグイン 'MetaSearch'を読み込めませんでした 
  ModuleNotFoundError: No module named 'owslib' 


<img width="508" alt="ss_ 2018-10-16 19.42.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/6db9bcd8-df6e-af3f-1c96-c8fa32e55512.png">


手動でMetaSearchを以下にコピーします。
/Applications/QGIS3.app/Contents/Resources/python/plugins/MetaSearch

https://docs.qgis.org/2.14/ja/docs/user_manual/plugins/plugins_metasearch.html

なんかキャンバスが狭いけど動くようになりました。

<img width="1279" alt="ss_ 2018-10-17 10.57.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/ae56c5f8-f4ee-1c76-e4e4-e1ef3f73beec.png">

描画部分は事物情報とかコンソールとか表示させた上で調節すると適当なサイズに直ります。
<img width="1189" alt="ss_ 2018-10-23 11.14.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/9239c672-8fab-40ec-2d47-3e03a243d75e.png">

systemのpythonバージョンは2.7.10のままです。
<img width="236" alt="ss_ 2018-10-23 17.49.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/2218d060-297f-6129-4e5b-fd1b173d6f00.png">
Linux（Ubuntu）にリムーバブルディスク（exFAT）を認識させた

# 目的
USBメモリを使って、オフラインのWindowsとLinux（Ubuntu）とでデータをやりとりすること。

# 環境
- USBメモリ（リムーバブルディスク）
 - ファイルシステム: exFAT
- Linux
 - Ubuntu 14.04 LTS

# 手順
- 何も考えずにUbuntu PCにUSBメモリを挿すと、「◯GBボリュームをマウントできません」というエラー画面がデスクトップに出てきた。

> ◯GBボリュームをマウントできません

>Error mounting /dev/sdc1 at /media/◯/◯: Command-line 'mount-t "exfat" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,iocharset=utf8,namecase=0,errors=remount-ro,umask=0077""/dev/sdc1""/media/◯/◯"'exited with non-zero exit status 32: mount: unknown filesystem type 'exfat'

- エラー画面は「OK」を押して閉じ、USBメモリをUbuntu PCから外した。

- 端末で「exfat-fuse」「exfat-utils」のパッケージをインストールした。

　　`sudo apt-get install exfat-fuse exfat-utils`

- 再びUSBメモリをUbuntu PCに挿すと、普通にマウントでき、USBメモリの中身が確認できるようになった。

- WindowsとUbuntuとでデータのやりとりが出きることを確認した。
コマンドラインからAlexaスキルをデプロイするときのLambda関数名を変更する方法

#はじめに
[こちらの記事](https://qiita.com/shuhey/items/f1e6c8b2537ac1b0a9c2)でコマンドラインからAlexaスキルをデプロイする手順について書きました。
その中で、AWS Lambdaにデプロイされる関数名が以下のようにいくつかの情報が付与された形式で作成され、それを変更する方法があると述べました。

今回は、その方法についてです。

#手順紹介

スキルのプロジェクトフォルダに移動してください。

その中に「.ask」というフォルダがあるので、移動してください。

「.ask」フォルダ内の`config`ファイルをテキストエディタで開いてください。

`config`ファイルの中身は、デプロイしたことがあるかないかで変わります。

また、以下の説明はスキル作成時に以下のコマンドで作成したことを前提としています。

```
> ask new --skill-name MyFirstSkill --lambda-name alexa-skill-MyFirstSkill
```

##まだ一度もデプロイしたことがない場合

`config`ファイルの中身は以下のようなJSON形式のデータになっています。

```
{
  "deploy_settings": {
    "default": {
      "skill_id": "",
      "was_cloned": false,
      "merge": {
        "manifest": {
          "apis": {
            "custom": {
              "endpoint": {
                "uri": "ask-custom-alexa-skill-MyFirstSkill-default"
              }
            }
          }
        }
      }
    }
  }
}

```
この中で`"uri"`の項目が、AWS LambdaにLambda関数が配置されるときの名前になります。
ここを希望の名前に変更すればOKです。
例えば以下のように。


```
{
  "deploy_settings": {
    "default": {
      "skill_id": "",
      "was_cloned": false,
      "merge": {
        "manifest": {
          "apis": {
            "custom": {
              "endpoint": {
                "uri": "ask-alexa-skill-MyFirstSkill"
              }
            }
          }
        }
      }
    }
  }
}

```

それではデプロイしてみましょう。

```
> ask deploy
```

AWS Lambdaを確認してみると、関数名が指定したとおりになっていますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/f3d394ab-d130-6a71-2c91-7965e582b30a.png)


注意：
頭に`ask-`をつけたままにしてあるのは、ask cliから利用する際に用いるユーザーのLambdaに関する権限設定において、以下のような制限をかけているからです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/31516a80-527f-62dd-5490-9143b8190531.png)

```
ask-*
```

この辺の権限を緩めればより自由な変更を加えることができます。
しかし、権限の設定は慎重に行ってください。

###デプロイ済みの場合

後ほど。
Vue.jsでスムーススクロールを使う

#Vue.jsでスムーススクロールを実装する
案件でVue.jsでスムーススクロールを実装することがあったのでメモ。

##npmパッケージを調べる
どうやら２種類あるらしい。
https://www.npmjs.com/package/vue-smoothscroll
https://www.npmjs.com/package/vue-smooth-scroll
「-」があるかないか。非常に紛らわしい。

##どっちがいいのか
よくよく調べると「vue-smooth-scroll」は「vue-smoothscroll」をforkして作っているだけっぽい。
どうやら機能が多すぎるからもっとスマートで良くない？という思考のようだ。
なお、「vue-smoothscroll」も元を辿れば
https://github.com/alicelieutier/smoothScroll/blob/master/smoothscroll.js
こちらのプラグインを使用している模様。

##weekly downloads
vue-smoothscroll：425
vue-smooth-scroll：1,087
という結果であった（2018/10/23 現在）
使用数だけで見るとvue-smooth-scrollのが良さそうに見える

##メンテナンス
ただ、「vue-smoothscroll」が3ヶ月前にメンテされてるのに対して「vue-smooth-scroll」は最終更新が1年前となっていた。
fork元がメンテされているのに対して、何も更新がされていないというのは怖いので今回は「vue-smoothscroll」を使うことにした。

##Installation
```
# install dependencies
npm install vue-smoothscroll --save
```
普通にインストールする

##ソースコード
必要な箇所だけ簡単に書くとこんな感じ。

index.js

```
import smoothScroll from 'vue-smoothscroll'
Vue.use(smoothScroll)
```

app.vue

```vue
<template>
  <a href="#" @click="clickSmoothScroll()">飛ばし先</a>
  <div id="hoge">飛び先</div>
</template>

<script>
export default {
  methods: {
    clickSmoothScroll () {
      event.preventDefault()
      this.$SmoothScroll(
        document.querySelector('#hoge'),
        400,
        null,
        null,
        'y'
      )
    }
  }
}
</script>
```

無事うまくスムーススクロールした。パチパチ。

##オプション
公式ドキュメントでは下記の通りになっている。

```
this.$SmoothScroll(target,duration,callback,context，axis);
```

・target：DOMオブジェクト
→どのDOMにスクロールするか。
・duration：Int型（デフォルト：500ms）
→何秒かけてスクロールするか。
・callback：関数
→callbackで実行する関数を指定できる模様。
・context：？？？
→よくわからなかった。デフォルトウィンドウだったりDOMオブジェクトを指定できるよと説明がある。
・axis：'x','y','both'
→どの方向にスクロールするか。

##一言
jQuery使わず簡単に実装ができるのでぜひ。
10/8にリリースされたEgret3D1.2のアップデート内容まとめ

10/8にEgret3D の新バージョン1.2がリリースされました

https://mp.weixin.qq.com/s/mX3rHinedKflz9vm74p1UQ

アップデート内容をまとめてみました

# アップデート概要
1. モジュールの分割によりエンジンサイズ削減
2. 新アニメーションシステム
3. Egret3DインスペクタとEgret3Dエディタによる開発効率アップ

# ３つのモジュールに分割されました
Egret3Dは、「Egret3D エンジンコア」「インスペクタ・ビジュアルエディタ」「3D物理エンジン」に3分割され、バージョン1.1と比較してエンジンのボリュームは20%削減されました。

# アニメーションシステムの新機能
以前のバージョンでは、GPUだけでレンダリングされていたので、高い性能が出せるものの、特定のアニメーションの実装が難しかったですが、新バージョンでは、次のようなことが比較的簡単に実現できます。

1. キャラクターの手のソードを他の武器に変えるようなアニメーション
2. フィルインアニメーション

しかし、CPUでの計算処理が必要なためパフォーマンスは若干落ちます。もしボーンの数が27を超えると、パフォーマンスは著しく落ちます。

# Egret3Dインスペクタの提供
ゲームの実行中にレンダリングのステータスを直感的に確認できるパネルを追加することができます。また、モデル・カメラ・光源やその他のアトリビュートの値を可視化できます。

# その他のアップデート内容
1. Unity Export プラグインにあったいくつかのバグが修正されました
2. Egret3Dの各種ドキュメントがアップデートされました
Excelで絞り込み検索の鬼になる

はじめまして、ShirasuSalaD（もりもー）と申します。<br>
もともと小さい頃パソコンぽちぽちしていて、そこにブラッディマンディが好きが乗じて人並み以上にパソコンをいじいじするようになった人間です。<br>
よろしくお願いします！

# TL;DR
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228396/63e94e25-f599-2dc5-cf14-16356649defa.png)


所属している大学のサークルでの作業の一環として最近触るようになったExcel。<br>
取り扱うデータテーブルが大きめ。（某バカ田大学のシラ○ス）<br>
身内向けにいい感じで検索できるやつがほしいなあということで作ってみました。<br>

これを作るにあたって調べたことを備忘録としてメモしておきます。

# 製作当初

![image.png](https://qiita-image-store.s3.amazonaws.com/0/228396/a5eb83e5-79f5-0dac-9668-1f3657c5545c.png)


Rの方に少し経験があってはじめは**R/Shiny**でやってみようと思いました。<br>
ですが絞り込み検索するにあたって、
<br>
<br>
**ドロップダウンリストから候補を選択し、該当データの行を表示**<br>
→selectInputでごにょごにょ<br>
**「」を含む検索**<br>
→searchInputでわちゃわちゃ

<br>
でやっていたのですがselectInputまわりで選択内容が結果に反映されないエラーに直面し苦戦。。。（現在は解決しました）<br>

[R Shiny　データ 絞り込み検索　selectInputまわりがうまくいかない？？　選択と同時に連携して表を表示させる](https://teratail.com/questions/148826)
<br>
（Teratailでぼかすかに叩かれて泣いた図↑）<br>

加えて他のサークル員に使ってもらいたくてもわざわざこれをサーバーにあげて...というのも面倒なため、Excelへ変更するのでした。。。

# VBAわかんないよう

アルバイト先で今後向き合わないといけないと分かっていながらまともに勉強していなかったVBAへの挑戦。<br>
リボンの「開発」タブから「Visual Basic」への行き方も忘れかけていた醜態。。。

お先真っ暗。。。と思いきや！

## ①スライサー : 候補から選択して絞り込み

[Excelのスライサー。テーブル・ピボットテーブルのデータをタッチで瞬時にフィルタリング](https://www.ex-it-blog.com/Excel-Slicer)
### きたあああああ！！！！
<br>
無知なのが恥ずかしいですがExcelの標準の機能で【スライサー】というものがありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/228396/071f7cb0-55a9-8c49-346b-6d160a439bff.png)

画像の通り、RのselectInputをカンタンクリック操作で実現できちゃいました！<br>
いやー、これが便利機能過ぎて。スライダー要素が今回多いため小さめのサイズで配置していますが、スライダーを大きく設置しておけばモバイル端末向けにはとても操作しやすいパネルになっています。

## ② : 候補から選択して絞り込み

[Excelのオートフィルターを文字列、数値、日付の複数条件で使う](https://vbabeginner.net/%E3%82%AA%E3%83%BC%E3%83%88%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E8%A7%A3%E9%99%A4/)
### すっごーい！！！！


これがRのsearchInputに相当するもの！

```
Sub 講義名()
  If Range("C2").Value = "" Then
    MsgBox "講義名を入力してください(あいまい検索)。"
    Exit Sub
  Else
    Worksheets("data").Range("E8").AutoFilter Field:=2, Criteria1:="*" & Worksheets("data").Range("C2").Value & "*"
    Worksheets("data").Select
  End If
End Sub
```
リンクを参考にいろいろいじくったもの。<br>
といえどIf文は単にセルが空白状態だったらアラートを出すだけだし<br>
Criteria1にて ***** を2つ分はさんでやることで検索結果は「を含む」といった柔軟な検索に対応できる。<br>

あとはこれを「教員名」なり取り出したいテーブルの列に合わせてコピペで増やしまくって各実行ボタンに「マクロの登録」をしてやるだけ！

# できあがり
https://gyazo.com/50c39b534585520641e9423996d802b3<br>
スライダーを動かしている様子




検索の様子<br>

# まとめ
文化祭委員の仕事を中高生時代にしていたときに先輩がExcelで各委員の役割やダンスグループがどれで出演時間がこれで、、というデータ操作を匠に扱っていたファイルを昔触らしてもらったことがあり、そのときのことを思い出しました。（でもたしか機能はVLOOKUP関数のみだったような）<br>
なので未だに高校生でも余裕で実現可能なことなのにこんな喜んでいて少し恥ずかしいですが、【アウトプットは大事】と信じて頑張っていきます

感想やこうしたほうがいいよ的なコメントをお待ちしています！
【Rails】findとfind_byの違い

## findとfind_by

findメソッド　　・・・`id`を元にデータベースから該当のデータをひとつ引っ張ってくる
find_byメソッド・・・`id`以外の項目でもデータベースから該当のデータをひとつ引っ張ってくる

```rails.console
[1] pry(main)> User.find(1)
id:〜
name:〜
email:〜
〜
〜

[2] pry(main)> User.find_by(1)
id:〜
name:〜
email:〜
〜
〜
```

##検索結果が見つからなかった場合の返り値の違い

findメソッド     ・・・エラーが返ってくる
find_byメソッド・・・nilが返ってくる

```rails.console
[3] pry(main)> User.find(3)
  User Load (0.5ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find User with 'id'=3
from /Users/moritasatoshi/.rvm/gems/ruby-2.5.0/gems/activerecord-5.2.1/lib/active_record/core.rb:177:in `find'


[4] pry(main)> User.find_by_id(3)
  User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
=> nil
```


## 条件分岐処理時の`nil`の扱われ方
Railsでは、`nil`が返ってきた際の条件分岐の処理は必ず`false`にて処理されます。
そのため、下記のような記述の際にエラーの見せ方が変わってきます。

@userをfindと、find_byメソッドで探してきて、見つかった場合と見つからなかった場合でエラーメッセージを返す条件分岐を記述しました。

```users_controller.rb
  def show
    @user = User.find(params[:id])
    if @user
    else
      render json: { error: 'Faild find user'}, status: 422
    end
  end
```
findメソッドの場合、`@user = User.find(params[:id]`の返り値でエラーが吐かれてしまうため、
下に記述した`else`の内容が処理されず４０４エラーが返ってしまいます。


```users_controller.rb
  def show
    @user = User.find_by(id: params[:id])
    if @user
    else
      render json: { error: 'Faild find user'}, status: 422
    end
  end
```
処理としては似ている記述ですが、条件分岐の`else`の記述を活かすには、返り値が`nil`となるfind_byメソッドを使用しましょう。


## 検証
ターミナル上で、存在しないidにて検索を試してみました。

```terminal
$ curl http://localhost:3000/api/users/3
{"error":"Failed find user"}
```
`else`に記述したエラーメッセージを確認できました。


今日はこのあたりで失礼します。

## 参考サイト
【Rails初心者必見！】ひたすら丁寧にデータ取得を説明(find, where)
https://qiita.com/mr-myself/items/cfb936dcf63d2c44d2f5
Tableauを利用したUser別表示データTips

業務でTableauを利用した際にちょっとひねった技を使う必要があったのでその備忘録として第二弾

# 役職に応じて見せるデータを変えたい
通常のTableauであればFilterをユーザーに設定してもらって見せるというのが一般的な流れになると思います。ただ、今回の場合は前回と同じくユーザーがログインした段階で見せたいというものになります。
営業の平社員、営業の課長さん、営業の部長さんの関連する値だけを見せたいというのが今回のゴールです。

### 前提条件　組織のマスタ情報がある
組織の階層を持ったマスター情報があるということが前提になります。
データイメージ

~~~
row, 部門, 部署, 役職,  人, 売上 
1   Sales, 第一, 平, 山田, 100
2   Sales, 第一, 平, 田中, 150
3   Sales, 第一, 課長, 中田, 10
4   Sales, 第二, 課長, 佐藤, 20
5   Sales, 第二, 平, 松井, 200
5   Sales, 直, 部長, 長嶋, 0
~~~

### 課題の動き
平は自分の売り上げが見たい
課長は部署の合計が見たい
部長は部門の合計が見たい

### 解決策

#### 部署、部門の合計を算出
まずはFIXED関数を利用して部署、部門の合計の列を追加します。

~~~
//Team_Sales 部署の売上
[Team_Sales]
{FIXED [部署]:SUM([Sales])}
~~~

~~~
//Group_Sales 部署の売上
[Group_Sales]
{FIXED [部門]:SUM([Sales])}
~~~

ここで利用するのがFIXED関数になります。　
[Team_Sales]であれば同じ部署のSUM([Sales])の値が返ってきます。
FIXEDなどのLODについては下記のリンクとかわかりやすいです。
https://ex-ture.com/blog/2017/12/04/%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84lod-fixed%E7%B7%A8/ 

#### Userによって見せる列を変える
表示したい内容をUserの役職に応じて変更する

~~~
//表示したいSales
[Related_Sales]
CASE [役職]
  WHEN "平"
    THEN [Sales]
  WHEN "課長"
    THEN [Team_Sales]
  WHEN "部長"
    THEN [Group_Sales]
END
~~~

表示したい場所に[Related_Sales]を入れて

最後に
人 == USERNAME()
でFilterをかければ必要な人のデータだけを抜き出すことができます。

以上
php 都道府県コードのスクレイピング

いつか使うかもしれない。
phpの都道府県コードリスト

```php
$with_pref_code_as_key_pref_list = array(
  '21' => '岐阜県',
  '22' => '静岡県',
  '23' => '愛知県',
  '24' => '三重県',
  '25' => '滋賀県',
  '26' => '京都府',
  '27' => '大阪府',
  '28' => '兵庫県',
  '29' => '奈良県',
  '30' => '和歌山県',
  '31' => '鳥取県',
  '32' => '島根県',
  '33' => '岡山県',
  '34' => '広島県',
  '35' => '山口県',
  '36' => '徳島県',
  '37' => '香川県',
  '38' => '愛媛県',
  '39' => '高知県',
  '40' => '福岡県',
  '41' => '佐賀県',
  '42' => '長崎県',
  '43' => '熊本県',
  '44' => '大分県',
  '45' => '宮崎県',
  '46' => '鹿児島県',
  '47' => '沖縄県',
);

```

php用に作成します。goo郵便番号検索サービスから取得。

```js
const rp = require('request-promise');
const cheerio = require('cheerio');
const fs = require('fs');

const options = {
  uri: `https://postcode.goo.ne.jp/`,
  transform: function (body) {
    return cheerio.load(body);
  }
};

const get_pref_code_from_href_link = ({
  link_txt
}) => {
  const splited = link_txt.split('/')
  const code_idx = 1
  return splited[code_idx]
}

rp(options)
  .then(($) => {
    const $area_all = $('.area_all')
    const $dt = $area_all.find('dt')
    const $inner_ul = $area_all.find('ul')

    const space_two = '  ';
    const space_four = '    ';
    let result_txt = '$result = [\n';

    $dt.each(function (idx, dt_item) {
      // console.log(`地方区分: ${$(dt_item).text()}`)
      const regional_classification_name = $(dt_item).text()

      result_txt += `${space_two}'${regional_classification_name}' => [\n`
      const $target_ul = $($inner_ul[idx])
      const $li = $target_ul.find('li')
      $li.each(function (idx, li_item) {
        const target_a_href = $(li_item).find('a').attr('href');
        const pref_code = get_pref_code_from_href_link({
          link_txt: target_a_href
        })
        const pref_name = $(li_item).text()
        result_txt += `${space_four}'${pref_code}' => '${pref_name}',\n`
        // console.log(`都道府県コード: ${pref_code}`)
      })
      result_txt += `${space_two}],\n`
    })
    result_txt += '];'

    fs.writeFile('result.txt', result_txt, (err) => {
      // throws an error, you could also catch it here
      if (err) throw err;
    });
  })
  .catch((err) => {
    console.log(err);
  });
```