OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter で SharedPreference をジェネリクスで扱う

## インストール

`pubspec.yaml`に以下を追加します
バージョンはアップデートに合わせて適宜変更してください
[pub.dev shared_preferences](https://pub.dev/packages/shared_preferences#-installing-tab-)

```
dependencies:
  shared_preferences: ^0.5.7+3
```


## SharedPreferenceをジェネリクスで扱う

SharedPreferenceのラッパーを作ります

```dart
import 'package:shared_preferences/shared_preferences.dart';

// 永続化したい値とマッピングするキーを設定しておく
enum HogeKey {
  HogeID,
  HogeToken
}

class HogeSharedPreferences {

  /// 値を永続化する
  static Future<void> store<T>(T value, HogeKey key) async {
    SharedPreferences preferences = await SharedPreferences.getInstance();

    if (value is String) {
      preferences.setString(key.toString(), value);
    } else if (value is bool) {
      preferences.setBool(key.toString(), value);
    } else if (value is double) {
      preferences.setDouble(key.toString(), value);
    } else if (value is int) {
      preferences.setInt(key.toString(), value);
    } else if (value is List<String>) {
      preferences.setStringList(key.toString(), value);
    } else {
      Exception('Not compatible type');
    }
  }

  /// 永続化した値を取得する
  static Future<T> restore<T>(HogeKey key) async {
    SharedPreferences preferences = await SharedPreferences.getInstance();

    return preferences.get(key.toString()) as T;
  }

  /// 永続化した値を全て削除する
  static Future<void> removeAll() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();

    preferences.remove(HogeKey.HogeID.toString());
    preferences.remove(HogeKey.HogeToken.toString());
  }

}

```

以下のように利用できると思います。

```dart
// 永続化
HogeSharedPreferences.store<String>('fuga', HogeKey.HogeToken);
// 取得
HogeSharedPreferences.restore<String>(HogeKey.HogeToken);
```
## あとがき

もっといい方法があるよとか、リファクタリングできるんじゃないか？などありましたら編集リクエストくださいませ！
PHP MYSQL データ更新 update.php エラー


#エラー対処
以下のエラーが、記載のコードででた。
SQLError:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id=0' at line 1

Googleで調べると、MYSQLの構文（INSERTやSETなど）で、typoがある時に出るとのこと。
結論から言うと、その通りだった。

何度も見直したが、まったく見つからず、エラーが間違ってるのかと思ったが、
下記、３行目のWHEREの前に,が入ってしまっていた。

WHEREの前にカンマは入らない。

間違えがち。

```PHP

//３．データ登録SQL作成
$stmt = $pdo->prepare("UPDATE gs_bm_table SET name=:name, URL=:URL, comment=:comment, WHERE id=:id");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);      //Integer（数値の場合 PDO::PARAM_INT)
$stmt->bindValue(':URL', $URL, PDO::PARAM_STR);    //Integer（数値の場合 PDO::PARAM_INT)
$stmt->bindValue(':comment', $comment, PDO::PARAM_STR);        //Integer（数値の場合 PDO::PARAM_INT)
$stmt->bindValue(':id', $id, PDO::PARAM_INT);        //Integer（数値の場合 PDO::PARAM_INT)
$status = $stmt->execute(); //実行
```
Vueでtree shakingが効くようにFont Awesomeを使用する

# 概要

VueでFont Awesomeを使用する際にtree shakingが効くやり方を調べた。(結果的にvueに限らないやり方になった)

依存ライブラリを増やしたくないので今回は`vue-fontawesome`の使用は見送った。

## やること

基本パッケージのインストール

```sh
yarn add @fortawesome/fontawesome-svg-core
```

必要に応じてアイコンのインストール

```sh
yarn add @fortawesome/free-solid-svg-icons
```

後は以下のように必要なアイコンを都度インポートする

```js
import { dom, library } from "@fortawesome/fontawesome-svg-core";
import { faDog, faCat } from '@fortawesome/free-solid-svg-icons';

library.add(faDog, faCat);

// 動的にタグが生成されても適用されるように
dom.watch();
```

これでtree shakingが効く状態でFont Awesomeが使えるようになる。めでたしめでたし

## ダメな例

以下のように書いてしまうと、tree shakingが効かずにバンドルサイズがどえらいことになる(筆者環境では200kbくらい増えた)

```js
import { library } from "@fortawesome/fontawesome-svg-core"
import { fas } from "@fortawesome/free-solid-svg-icons"

library.add(fas)
```


# 参考

[1年後に差がつくFont Awesome5 ～フロントエンド開発(ES6,Webpack4,Babel7)への導入～ - Qiita](https://qiita.com/riversun/items/4faa56ac40071f638313)
[雑記ブログ：FontAwesomeを軽量化する - Qrac BLOG](https://blog.qrac.jp/posts/react-fontawesome-tree-shaking-for-gatsby-blog/)
Google Tag Manager での YouTube視聴数計測ができない時

#WEBサイトを作った！ YouTubeを埋め込んだ！ 視聴計測、、、できない！
まず結論：**埋め込み方法を統一する。**

誰か（未来の自分含む）の役に立ちますように。

##経緯と結論
クライアントから突如相談がありました。
>YouTube視聴数を計測したいんですが、JSがエラー吐いているのが原因でうまく計測できないんです。
>エラーを解消してもらえませんか？

そもそも広告目的の計測が初めてで、Google Tag Manager すら知らなかった僕。
よく分からないままに、とにかくエラーを解消するために奔走。
エラー内容は、YoutubeAPIから出ているものでした。

```
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://www.youtube.com') does not match the recipient window's origin ...
```

色々ためしたが、解消できず、、、

そんななか、クライアントのエンジニアの方からのご指摘で、
`Google Tag ManagerからもYoutubeのiframe_apiタグが挿入されているね
動画視聴計測のために入ってるんでしょうね。多分。`
とのこと。

となると、このjsエラーは計測できない原因では、なさそう。

とーするとー、なんで計測できないのか？
全く分からない。試行錯誤してみることに。

-Basic認証かかってるかかってない。（関係なかった）
-iframe埋め込みしたものの計測、計測できた！
-jsで埋め込んだもの、計測できた！

あれ、じゃあなんで問題のサイトでは計測できていなんだ？
自分で試したサイトでもYouTubeAPIのエラーは出ているのに、、、

そこで再度、クライアントから指摘が。
`計測はできているけど、計測したい動画じゃない別の動画の情報だけ上がってきてるね`

問題のサイトでは、背景動画をループで再生させていて、その動画だけ計測できていた模様。
しかも自動再生。
スマホにも対応するために、jsから埋め込み。
それ以外はiframe embed。
これ、、、なのか、、、？

試しに分けてみることに。
すべて iframe embed にすると、、、計測できる！
すべて js埋め込み にすると、、、計測できる！

解決できました！
Macストレージのダイエット法

### 何にストレージを消費しているかの診断

[macで容量の無駄を可視化するアプリ](https://qiita.com/pixel/items/bf8dcab99a0030771c48)

ここでは、無料で必要十分な機能のある[GrandPerspective](https://sourceforge.net/projects/grandperspectiv/)を使う。

### 典型的に多くの領域を使用してしまうフォルダやファイル

#### 各開発プロジェクトのファイル
当たり前と言えば当たり前だが多くのプロジェクトを開発しているとだんだんプロジェクトのファイルがローカルに溜まっていく。

Githubなどリモートにアップしているやつは必要ないはずなので、古いものから消していこう。

#### スクリーンショット・録画

開発の証跡のためスクリーンショット・録画を残している場合は、それもどんどん溜まっていく。アップロード済みのものは全て消していいだろう。

#### Xcode

１ファイル10GB以上食うことも多い。特に複数バージョンのXcodeを管理しているとさらに膨れてしまうため適宜要らないバージョンを消すこと。

#### iOS DeviceSupport フォルダ

Xcodeで開発をしていると容量を食いやすいフォルダ。iOSの各マイナーバージョン毎に、クラッシュログ用のデバッグシンボルを保管している。完全に消去したとしても、再びデバイスを接続した時にデバッグシンボルがダウンロードされるので失われることはない。

どの程度最近のiOSバージョンまでクラッシュログを見るかにもよるが、とりあえず最新のiOSのメジャーバージョンのもののみ保管している。

参考 [Xcode and its iOS DeviceSupport directory: can I delete it?](https://www.appsdissected.com/xcode-ios-devicesupport-delete/)

### Developer/CoreSimulator　フォルダ

Xcodeのデバイスのシミュレータのデータが保管されているフォルダ。

所持しているシミュレータの種類は、ターミナルで以下のコマンドを打つことで確認できる。

```
xcrun simctl list devices
```

多くの場合、すでに利用不可能になったシミュレータが無駄に溜まっているのがわかると思われる（unavalableとなっているもの）。これらを消すには、ターミナルで以下のコマンドを打ち込むと良い。

```
xcrun simctl delete unavailable
```

### ~/Library/Developer/CoreSimulator/Caches/
こちらはキャッシュに過ぎないので全削除で良い

```
rm -rf ~/Library/Developer/CoreSimulator/Caches/
```

### ~/Library/Developer/Xcode/Archives

ローカルでビルドしたipaファイルなどが含まれるフォルダ。

何らかの理由で取っておきたいもの以外は、定期的にArchivesフォルダの中身を全削除してしまって良いだろう。

参考 [Xcode - free to clear devices folder?](https://stackoverflow.com/questions/34910383/xcode-free-to-clear-devices-folder/34914591#34914591)

### sudo /Library/Developer/CoreSimulator/Images/...dmg
よくわからないがシミュレータの中に入れた画像、動画ファイルと思われる。

### iOSまとめ

```
rm -rf ~/Library/Developer/CoreSimulator/
rm -rf ~/Library/Developer/Xcode/Archives
rm -rf ~/Library/Caches/com.apple.dt.xcode
rm -rf ~/Library/Developer/Xcode/UserData/Previews
rm -rf ~/Library/Developer/XCPGDevices
rm -rf ~/Library/Developer/Xcode/iOS\ DeviceSupport
```


### ~/Library/Android/sdk/system-images
Androidアプリ開発におけるシステムイメージ。最新のものも入っていると思うので全消しはよくないと思うが、使わなくなった古いものは消していこう。
rubyでインスタンスをcopyしたらインスタンス変数はどうなるのか

# 結論
インスタンス変数もコピーされる

# 検証

こういうクラスがあったとして

```
class Test
  def set_name(name)
    @name = name
  end
  def get_name
    @name
  end
end
```

まずは普通にインスタンス変数を設定

```
origin = Test.new
=> #<Test:0x00007fcebd06e940>

origin.set_name("origin")
=> "origin"

origin.get_name
=> "origin"
```

cloneするとインスタンス変数ごとコピーされる

```
copy = origin.clone
=> #<Test:0x00007fcebd05d7a8 @name="origin">

copy.get_name
=> "origin"
```

copyの方のインスタンス変数を書き換えても元の方には影響しない

```
copy.set_name('copy')
=> "copy"

origin.get_name
=> "origin"
```

# dup 
dupも同様

```
copy2 = origin.dup
=> #<Test:0x00007fcebd054040 @name="origin">

irb(main):030:0> copy2.get_name
=> "origin"
```
PHP-GDのJpeg Support と FreeType Support を有効にする

# はじめに
PHP5系のサーバで、GDがちゃんと動いていないので対応してくれという依頼。

# 環境調査

```shell
# php -r "print_r( gd_info() );"
Array
(
    [GD Version] => bundled (2.0.34 compatible)
    [FreeType Support] =>
    [T1Lib Support] =>
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPG Support] =>
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] =>
    [XBM Support] => 1
    [JIS-mapped Japanese Font Support] =>
)
```
うん、GDは入ってるけどJPEGサポートとFreeTypeサポートが動いてない。

OS: Amazon Linux2
PHP: 5.2.17

PHPはyumで入れたものではなくてソースからビルドして入れた形跡がある。


```shell
# yum list installed | grep php
php-common.x86_64                     5.4.16-46.amzn2.0.2            @amzn2-core
```

PHPが5.4.16の時は動いていたっぽい。すでにライブラリはインストールされている、

```shell
# yum list installed | grep libjpeg*
libjpeg-turbo.x86_64                  1.2.90-5.amzn2.0.3             installed
libjpeg-turbo-devel.x86_64            1.2.90-5.amzn2.0.3             @amzn2-core
# yum list installed | grep freetype-devel
freetype-devel.x86_64                 2.4.11-15.amzn2.0.2            @amzn2-core
```


インストール時のオプションを調査する。

```shell
# php -i | grep configure | sed -e 's/  /\n/g'
'./configure'
'--prefix=/php-5.2.17' ...(略)...'--with-gd=shared' ...(略)...
```

`--with-gd`はあるけど`--with-jpeg-dir`や`--with-freetype-dir`は指定されてない。これを指定するといいんだな。

```shell
# find / -name libfreetype*
/usr/lib64/libfreetype.so.6
/usr/lib64/libfreetype.so.6.10.0
/usr/lib64/libfreetype.so
# find / -name libjpeg*
/usr/lib64/libjpeg.so.62
/usr/lib64/libjpeg.so.62.1.0
/usr/lib64/libjpeg.so
```

指定するのは`/usr/lib64`だな。


# 試行錯誤

Qiitaの記事ですごく簡潔でいい記事を見つけたので、このサイトの通りに実行する
https://qiita.com/sh_cs/items/0f5558d5b95b746d58e2

```
# cd /hoge/php-5.2.17
# ./configure --prefix=/php-5.2.17 (略) --with-gd=shared (略) --with-jpeg-dir=/usr/lib64 --with-freetype-dir=/usr/lib64
# make
# make install
# systemctl restart httpd
```
これで反映されてるはず。

```
# php -r "print_r( gd_info() );"
Array
(
    [GD Version] => bundled (2.0.34 compatible)
    [FreeType Support] =>
    [T1Lib Support] =>
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPG Support] =>
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] =>
    [XBM Support] => 1
    [JIS-mapped Japanese Font Support] =>
)
```

あれ？変わりなし。

# ヒントを見つける

この間、libjpegの再ビルドやパスの見直しなどするも効果なし。諦めかけたところで、以下のStackOverflowのコメントを見つける。

https://stackoverflow.com/a/14911597

これだあ！！！！ `make clean`を実行してもう一度やり直すと

```shell

# php -r "print_r( gd_info() );"
Array
(
    [GD Version] => bundled (2.0.34 compatible)
    [FreeType Support] => 1
    [FreeType Linkage] => with freetype
    [T1Lib Support] =>
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPG Support] => 1
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] =>
    [XBM Support] => 1
    [JIS-mapped Japanese Font Support] =>
)
```
やった！！！


キャッシュが残ってたんですね…。

# まとめ
終わってみたらなんてことなかったですが、随分遠回りしました。私の貴重な1日返せ！

# 参照リンク
- https://qiita.com/sh_cs/items/0f5558d5b95b746d58e2
- https://stackoverflow.com/a/14911597
rsyslogでsecureログの分離

#NLB→OSのヘルチェックでport22利用する場合のヘルスチェックログ退避

#/etc/rsyslog.conf 例

```
if ($programname == 'sshd') and ($msg contains 'from 192.168.1.xxx' or $msg contains 'from 172.16.xxx.xxx') then /var/log/nlbhc.log
&~
authpriv.*                                              /var/log/secure
```
#/var/log/nlbhc.log　のログローテ
/etc/logrotate.d/syslog で設定
centOS7にProphetをインストールしてみた

# やったこと
VirtualBoxで構築したLinuxサーバー(centOS7)にFacebook社の時系列解析ツールであるProphetを入れました
※Pythonは触ったことがありません

# インストール

どうやってinstallするのか、公式のDocumentationを見ます
https://facebook.github.io/prophet/docs/installation.html

なるほど、pipで入れてみようかな、と思い挑戦したのですが、たくさんトラップがあり初心者にはかなり厳しいです

公式Documentation曰く、
` The easiest way to install Prophet is through conda-forge: conda install -c conda-forge fbprophet.`

はい、おとなしくAnaconda使います・・・

## Anacondaをinstall
こちらからinstallします。
https://www.anaconda.com/products/individual

ちなみに当初Python3.6を使用していたのですが、AnacondaのinstallページにPython3.7と書いてあったので、下記リンクを参考に念のためバージョンを上げました。念のため。
https://qiita.com/shiranon/items/889b9d32bea0df4b89dc


## Prophetをinstall
以下のコマンドを実行

```
conda install -c conda-forge fbprophet
conda install -c conda-forge/label/cf202003 fbprophet
```

# 使ってみよう
無事(?)installができたので、動作確認してみましょう

公式のQuick start guideです。
https://facebook.github.io/prophet/docs/quick_start.html#r-api

おや？こちらのコマンドを実行すると
`from fbprophet import Prophet`

```Python:Python
from fbprophet import Prophet
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'fbprophet'
```

うまくinstallできなかったのかな？と思って散々悩んだ挙句、使い始めるときはこのコマンドが必要だとわかりました。

`conda activate`

ほえ～
まだまだPythonのこともAnacondaのこともProphetのことも、全然わかっていないので精進します・・・
学習記録

プログラミング初心者の私が今までやったこと(主にPython)

1 Tech Academy
挫折しました。途中から答えを写経するだけになり、全然理解が追いつかなかった。オンライン上でメンターの方にも質問できたが、それでも驚くほど理解できなかった。知識0からの段階では急ぎすぎたのかもしれない。Tech AcademyではRuby on Railsを学びました。この頃は特に何をやりたいのかわかっておらず、Pythonを学びたいとかもなかった。
2 学校のプログラミング基礎の授業
挫折。Tech Academyちょっとはやったし理解できるのではないかと余裕かまし授業中睡眠してたら途中からびっくりするほどわからなくなり、カウントダウン時計の作り方もわからず、落ち込む。宿題を知り合いにやってもらっていた。プログラミング向いてないのかなと真剣に悩む。
3 Progate 有料コース
とてもわかりやすかった。Tech Academyや授業でわからなかったこととかも理解できた。少し自信がつく。いろんな言語を取り組んだことで、初めわからなかったクラスやオブジェクトなどの概念も段階的に理解することができた。知識0の自分には向いていた。初心者の人にはお勧めしたい。スライド式で自分のペースで進められることも自分にあっていた。
4 Paiza Pythonコース
全部無料でありがたかった。コード量は少ないとはいえ、一から自分でコードを書かないといけないこと、問題数もProgateより豊富なので理解が進んだ。動画なので、せっかちな自分にはもどかしい部分もあったけど、少しProgateの応用編などの課題に取り組めたのはよかったと思っている。
5 Free Interactive Python Tutorial
復習のつもりで手を出してみた。英語なので少しわかりずらかった。ちょっとProgateno
応用編という印象。

今後やること
Progateを一通りやってみたがもっと力を付けたいため他の学習サイトに挑戦します。色々無料のオンライン学習サイトを探索してみたけど、評判のいいPyQに取り組んでみることにします。上達できるといいな。

上記に書かれていること以外に色々手を出してしまった。Code.orgやCode Academyなど色々やってみたけど、やっぱり初学者は背伸びしないで日本語で学習しないとと痛感。もっといいのがあるのかもしれないとたくさん手を出しすぎた。一つに集中して取り組むが吉という原則を忘れるべきでなかった。しかも無料の学習サイトに固執してしまった。素直にちゃんとお金払っていい学習サイトに頼るのが良きである。普通にProgate->PyQ(まだやってないけど)で学習するのが効率的だったのかもしれないけど、それはよしとしてちょっとずつこれからも頑張ろうと思う。
Python超初心者の超初心者のためのPython #型（type）を変換する方法：int、float編

環境
windows7　（Mac Book Pro 16inch欲しい）
Visual Studio Code
chrome
python ver3.8.3

この記事はプログラミング初心者かつPython初心者に向けて記述します。

#1.Pythonの型（type）を変換する方法
##`int`、`float`
数（整数）,小数点（浮動小数点数）の型の変換は、

数（整数）・・・`int(  )`
小数点（浮動小数点数）・・・`float(  )`

で行います。


```style.py
print("123" * 3)
#123123123

print(int("123") * 3)
#369

```
`print("123" * 3)`
↑は文字（文字列）123を3回繰り返して出力してます。

`print(int("123") * 3)`
しかし`int(  )`にすると、計算式の解の`369`と数字同士の計算となります。

```python:type.py
print("3.9" * 3)
# 3.93.93.9

print(float("3.9") * 3)
#11.7
```
`print("3.9" * 3)`
こちらも文字（文字列）を3回繰り返して出力しています。

`print(float("3.9") * 3)`
このように`float(  )`にしてあげると、計算式の解の`11.7`と数字同士の計算となります。

次に浮動小数点数に`int(  )`とするとどうなるでしょうか。

```python:style.py
print(int(3.94649))

print(type(int(3.9)))

```

このように記述してみます。
そうすると

```python:style.py

print(int(3.94649))
#3

print(type(int(3.9)))
#<class 'int'>
```
すると
小数点（浮動小数点数）は、数（整数）になりました。

実際のコーディングでは`str`は時折見ますが、`int`や`float`はまだ見ていません。
実際の現場ではどのように使われていて頻度はどのくらいなんでしょうか？
興味があります。学習してもレアキャラだとテンション下がりますもんね・・・。

以上、型（type）を変換する方法：`int`と'float'編でした。
SASテクニック よく使う関数 memo

SASで自分がよく使う関数のメモ書き


# input/put:数値/文字の変換やフォーマットを使った変換

```sas
新規数値変数 = input( 文字変数 , best. );
新規文字変数 = put( 数値変数 , best. -L );
```

など
数値なのか文字なのかはけっこう大事

```sas
A = put( 12 , z3. -L );
```

でA = "012"などゼロパティングなども可能
(00ABとか文字もできたっけ?)

# substr:範囲抽出

```sas
substr( "zzzzaaaaqqqq" , 1 , 10 )でzzzzaaaaqq
substr( "zzzzaaaaqqqq" , 5 )でaaaaqqqq
```

# cmiss:変数値が欠損値になっている変数をカウント

```sas
X = cmiss( A , B , C );
%* (Aだけ欠損なら1,AとBのみ欠損なら2などとなる) *;
```

# coalesce/coalescec:引数のリストから最初の非欠損値をかえす

```sas
%* coalesceが数値版/coalescecが文字版 *;
A = coalesce( . , 1 , 2 );
```

↑ならA = 1

# cats:変数の両端からブランクを除きながら結合
引数が1個なら両端からブランク削除するだけ

```sas
A = cats( " a " ); %* A = "a" *;
B = cats( " a " , "b " ); %* B = "ab" *;

%* ※数値変数を入れることもできる *;
C = cats( 1 , "2" ); %* C = "12" *;
D = cats( 10 ); %* D = "10" *;
```

# choosen/choosec:後続の引数からの選択結果をかえす(1つめの引数が場所を表す)

```sas
%* choosenが数値版/choosecが文字版 *;
A = choosen( 3 , 10 , 50 , 20 , 40 , 30 ); %* A = 20 *;
B = choosec( 2 , "aaa" , "bbb" , "ccc" , "ddd" , "eee" , "fff" ); %* B = "bbb" *;
```

# whichn/whichc:choose系の逆版(後続の引数と一致した場所を返す)

```sas
A = whichn( 1 , 2 , 4 , 5 , 1 , 2 , 3 ); %* A = 4 *;
B = whichc( "aaa" , "abc" , "aaa" , "bbb" , "grgfwer" , "wfefwewfef" ); %* B = 2 *;
```

コードリストの変換や変換前にするのにchooseやwhich系は便利
また、whichnは以下のような使い方もよくする

```sas
data work.DATA_ALL;
　　set DATA1( in = in1 ) DATA2( in = in2 ) DATA3( in = in3 );
　　DATA_FLG = whichn( 1 , in1 , in2 , in3 );
　　%* of in1 - in3などでも可 *;
run ;
```
とすると、縦結合したとき元のデータセットを判断できる変数DATA_FLGを作れる

# compress:指定した文字の削除/指定した文字のみ残す

```sas
A = compress( XXX ); %* 変数XXXのブランク削除をしたものを格納 *;
B = compress( XXX , "asdfg" ); %* 変数XXXからa,s,d,f,gを削除したものを格納 *;
C = compress( XXX , "qwert" , "K" ); %* 変数XXXからq,w,e,r,tのみ残したものを格納(Kが残すための指定) *;
%* 数値を残すならcompress( XXX , , "KD" )とすることも可能 *;
```

KDだとマイナスの「-」は残らない→compress( XXX , "0123456789.-" , "K" )なら小数点やマイナスも残せる


# 文字列の削除

```sas
A = transtrn( XXX , "文字列" , cats( "" ) ); * catsはcompressでも可 *;
B = transtrn( "aa1a2" , "aa" , cats( "" ) ); %* B = "1a2"(12とはならない) *;
```
※ transtrn( "aa1a2" , "aa" , cats( "" ) ) だと" 1a2"
また、catsやcompress等つけないと、ブランクが残る
SASテクニック ランダム抽出

# surveyselectプロシジャで、ランダム抽出

データセットからn行をランダムにとってくるプログラム
データが大きいとき、テスト用データを作るのにも便利
学校なら、名前のデータ作って、シードに年月日いれて、そこから2,3人掃除当番やクラス委員選んだりするのにいいかもね


# surveyselectプロシジャ

```sas
%let Obs = 10000; %* 抽出する行数 *;
%let Seed = 123; %* シード値 *;

proc SurveySelect data = 入力データセット名 method = srs
  n = &Obs. seed = &Seed. out = 出力データセット名;
run; 
```


https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/stat047.html
https://documentation.sas.com/?docsetId=statug&docsetTarget=statug_surveyselect_syntax.htm&docsetVersion=14.3&locale=en
Atom ver.1.47でMarkdownプレビューの機能が動かない対処

この記事を読んでる頃にはもう対策されているかもしれませんし、
パッケージのgithubに対策が載っているので需要ないかもしれませんが。


## 概要
Atomの ver.1.47で
マークダウンプレビューが真っ白で何も表示されない状況に遭遇。

## 原因
`markdown-preview-enhanced`というパッケージを使用しているのだが、
atomのver1.47との問題らしい。


## 対処法
バージョンを戻せば解決した。

## 手順

https://atom.io/releases

上記のURLから1.46を選択し、
`AtomSetup.exe`をダウンロードし開くと、
バージョンがダウングレードされる。


atomの自動アップデート設定がオンの場合、
atomの最新版が、この問題を解決するまで、
毎回ダウングレードしれないかもしれない。

---

## 教訓

こういうこともあるので、自動アップデートも良し悪しだと実感する。
忙しいときに急に不具合が発生するかもしれないので、
**アップデートは自分の意志でやるのが正解**

アップデートでセキュリティー問題などが解決されたりもするが、
安定版でもこういう事が起きる事があるので、
使用するツールの仕様とアップデート内容を都度確認して。
常に新しいことを知り臨機応変な対応をして行くのが理想なんですけどね、、
html2canvasを使って、文字を画像にすることでツイート文字数の壁を突破する

# なぜやるのか？
好きな場所のスクリーンショットが取れるようになるhtml2canvas。
これを使って、[コラ画像を作ったり](https://qiita.com/igg/items/2d7d290e23704a6fdfc9)、[ラブレターを作ったり](https://qiita.com/ma7ma7pipipi/items/08461145731f1a09ce4a)、[トーナメント票を作ったりできる](https://qiita.com/tonishi/items/91ad735c9fac6e77fd22)。いろいろできるみんなのおもちゃだ。

[2018年のフロントエンドエンジニアならこの程度は知ってて当然だよな？](https://qiita.com/rana_kualu/items/96b303307d6435aedf8b)という記事でも、「表示中の画面のスクリーンショットが撮れるすごいやつ。」という極めて高い評価を受けている。

つまり、html2canvasを使える人は「すごいやつ」ということだな？ゆえにやる。
以上が動機の説明となります。

# できたもの
結論から言うと、[できたのがこちら](https://www.commentmaker.net/images/index)。
![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403027/5aba27e0-4bae-a0f4-4d31-f09c4687d3bc.png)

テキストボックスに入力された文字をブラウザ上に表示させ、html2canvasを使って文字を画像に変換することで、ツイッターに投稿できる文字数制限を突破するという仕組みだ。
各種ボタンは、文字のサイズ変更やデコレーションに使う。html2canvasの解説には、そんなに重要ではないから、今回はスルーしていく。

実際に使ってみると、こんな感じの画像を作ることができるぞ。

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403027/fe87b326-fc88-27b2-6715-07b02676b8b7.png)

一目でツイッターの文字数制限を超えた文章であることがわかる。

あとはこれを画像として、ツイートすればよい。ちょっとしたまとめを作るのに便利だと私はイメージしている。

#html2canvasの具体的な使い方

さて、具体的なやり方を説明していく！
やることはこの二つだけ。
1. html2canvasをインストールする。
2. javascriptからhtml2canvasを使う。

1. html2canvasをインストールする。
[まずはこちらの公式ページから](https://html2canvas.hertzen.com/)html2canvasのソースコードをNPMやYamのどちらでもいいのでダウンロードする。

わたしはrailsのassetsに直接html2canvas.jsをぶち込んだ。

2. javascriptからhtml2canvasを使う。

```ruby:image.rb
    html2canvas($('#ここに取得したい場所を入力').get(0)).then( function (canvas) {
    var picture = canvas.toDataURL();        
    });
```

必要なのは、これだけ。
あとは、変数pictureをimgに入れれば、画像が表示されるし、aにいれればダウンロードもできる。

たったこれだけで、任意の場所のスクリーンショットが取れるのだ。すごい！


#html2canvasの注意点
実はhtml2canvasはスクリーンショットを取っているわけではない。
html2canvasはDOMやcssから読み取った情報をレンダリングすることで、canvas上にスクリーンショットめいた画像を描写している。

また、現時点でいくつかのcssプロパティーは対応できていないため、cssをフル活用したデザインの場合はhtml2canvasがうまく機能しない可能性もある。

詳しい説明は[公式のドキュメント](http://html2canvas.hertzen.com/)をgoogle翻訳を使って読もう！chromeユーザーなら簡単に翻訳してくれるぞ。

また、html2canvasのバージョンによってはうまくいかないときもある。1.0.0-alpha.11ではうまくいったので、バージョンを変えてみるのもよいかもしれない。（半月ロス）

# まとめ

1. html2canvasをインストールする。
[まずはこちらの公式ページから](https://html2canvas.hertzen.com/)html2canvasのソースコードをNPMやYamのどちらでもいいのでダウンロードする。

2. javascriptからhtml2canvasを使う。

```ruby:image.rb
    html2canvas($('#ここに取得したい場所を入力').get(0)).then( function (canvas) {
    var picture = canvas.toDataURL();        
    });
```

たったこれだけで、ブラウザ上の好きな部分を画像化できるので、おもしろい使い方をする人がもっと増えることをお祈り申し上げます。

役に立ったなと思った人はコメントに「すごい」とか書いてくれると嬉しい。

終わり
Larabel Recipes Formファサードのレシピ　その１

#この記事を書くきっかけ
ファサードレシピは日本語版のLaravel Recipedに記述されているが，よく使用しているものについてまとめが欲しいなと思った．ので，自分で作っちゃおう！ついでにファサードについても改めてしっかり理解してしまおうという魂胆．
Formファサードのレシピは下記のリンクから確認できるからぜひみてみて欲しい．
[http://recipes.laravel.jp/category/17]

#そもそもファサードとは
ファサード（Facade）という単語の意味ですが，「建物の入り口」らしい．
ファサードとはクラスメソッドの形式でサービス（クラス）を手軽に利用できる機能である．ファサードを利用するメリットには，複雑な依存関係にあってもシンプルな記述で済むことにある．

#早速レシピをまとめていくよ
##HTMLフォームを作成
Form::open()メソッドを利用する．いくつか利用の方法がある．が，今回はデフォルト値を利用する方法を記述する．
・デフォルト値を利用する方法

```
{{Form::open()}}
```

生成されるHTMLは下記のようになる．

```
<form method="POST" action="http://currenturl" accept-charset="UTF-8">
<input name="_token" type="hidden" value="somelongrandom string">
```

##フォームを閉じる
Form::close()メソッドを利用する．

```
{{ Form::close() }}
```

※注意
これは</form>を生成するだけのメソッドではない．定義されているラベルやフォームモデルを利用している場合は内部でそれらをリセットする．実装しているWEBページで複数のフォームを実装している場合に重要なポイントになる．

##フォームラベルを作成
Form::label()メソッドを利用する．
下記のように２つの引数を利用する（名前と値）．

```
{{Form::label('name', 'Your Name')}}
```

これは下記のように出力される．

```
<label for="name">Your Name</label>
```

第三引数に配列を利用すると属性を追加することができる．

```
{{Form::label('name', 'Your Name', ['class' => 'mylabel'])}}
```

※'値'の引数を省略することも可能．


##テキスト入力フィールドを作成
Form::text()メソッドを利用．
第一引数にフィールド名，第二引数にvalue，第３引数に配列を入れて，利用する．

```
{{Form::text('first_name', 'Chuck', ['class' => 'field'])}}
```

下記のように出力される．

```
<input class="field" name="first_name" type="text" value="Chuck">
```

※
このメソッドはForm::input()に"text"タイプを指定して利用している．
以前のリクエストがこのフォームから送信された場合に，セッションから値を取得し，自動的にユーザが最後に入力した値が利用される．

##hiddenフィールドを作成
Form::hidden()メソッドを利用する．
フィールド名と値をそれぞれ指定する．

```
{{Form::hidden('invisible', 'secret')}}
```

下記のようなシンプルなエレメントが作成される．

```
<input name="invisible" type="hidden" value="secret">
```

属性を追加する場合は，第３引数に配列を利用する．

```
{{Form::hidden('invisible', 'secret', ['id' => 'invisible_id'])}}
```

フィールドにidが追加される．

```
<input id="invisible_id" name="invisible" type="hidden" value="secret">
```
※このメソッドはForm::input()に"hidden"タイプ江尾指定して利用している．


##リセットボタンを作成
Form::reset()メソッドを利用する．
第一引数にはvalue，属性を追加する際には第二引数に配列を利用する．

```
{{Form::reset('Clear form', ['class' => 'form-button'])}}
```

下記のように出力される．

```
<input class="form-button" type="reset" value="Clear form">
```


##Submitボタンを作成
Form::submit()メソッドを利用する．
引数を指定せずに利用可能である．valueを指定する際には第一引数を利用する．また属性を追加する場合は，第二引数に配列を利用する．

```
{{Form::submit('Save', ['class' => 'btn'])}}
```

下記のように出力される．

```
<input class="btn" type="submit" value="Save">
```


##以前の入力値がからかどうかを確認する
以前の入力値があるかどうかを確認したい時は，Form::oldInputIsEmpty()メソッドを利用する．

```
if (!\Form::oldInputIsEmpty()) {
    // フィールドを指定してチェックしてみましょう
}
```


#まとめ
最近Formファサードを利用し始めてから，使ってるなーと思うものをまとめてみました．今後も利用してくことでよく使うことになるなと思うものがあったらまたまとめようかなと思います．
「14日で作る量子コンピュータ」を読んでみる。5日目　量子井戸の改良・障壁の追加

# はじめに
　今回は量子井戸の改良を行います。具体的には量子井戸の中心にポテンシャルの障壁を追加することでより量子ビットとしての役割を果たすようにしていきます。

# 5 量子井戸の改良

## 5.1 障壁の追加
　量子井戸をビットとして扱うためにここでは量子井戸の改良を行う。具体的には量子井戸の中心にポテンシャルの壁を作る。このポテンシャルの高さを$V_b[eV]$、幅を$W$とするとポテンシャルは以下のように表される。

```math
V(x)=\left\{\begin{array}{ll}
V_b & (|x|\leq \frac{W}{2})\\
0 &　(\frac{W}{2} < |x| \leq \frac{L}{2})\\
+\infty & (|x| > \frac{L}{2})
\end{array}
\right.
\quad (5.1)
```

## 5.2 障壁あり量子井戸のプロット
　基底状態と第一励起状態の障壁のサイズ$V_b$を3[eV]少しずつ大きくして行った時の様子をプロットしてみる。

### 5.2.1 基底状態の時
![ep_Stark_Effect_Barriers_0_30_n_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179010/81e82bae-8fdd-bd91-2ec4-e60c6855f13e.png)

### 5.2.2 第一励起状態の時
![ep_Stark_Effect_Barriers_0_30_n_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179010/add23d07-888e-ae84-5ac2-300cf155a944.png)

以上の結果から、$30[eV]$ほどで二つに分けることができるのがわかった。

### 5.3 障壁あり量子井戸に電場を加える
上の結果を利用して、障壁あり量子井戸に電場を加える。障壁がある場合には、量子井戸に加える電場はこれまでよりも遥かに小さくても影響が現れる。前回は1.0e9単位で増やしていたが、今回は1.0e6単位で増やしていくだけで変化が見られる。これを確認してみる。

### 5.3.1 基底状態の時
電場が10e7ほどでほぼ全ての分布が左によっているのが確認できる。
![ep_Stark_Effect_Ex_0_10e7_n_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179010/b3144152-520d-aa73-d878-2359e89be235.png)


### 5.3.2 第一励起状態の時
電場が10e7ほどでほぼ全ての分布が右によっているのが確認できる。
![ep_Stark_Effect_Ex_0_10e7_n_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179010/f1f4419b-9ec2-04d2-2cc8-d487707ba0fa.png)

# 参考
[EMANの物理学](https://eman-physics.net/quantum/expectation.html)

[14日で作る物理コンピュータ](https://www.amazon.co.jp/14%E6%97%A5%E3%81%A7%E4%BD%9C%E3%82%8B%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E2%80%95%E3%82%B7%E3%83%A5%E3%83%AC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%AC%E3%83%BC%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%A7%E9%87%8F%E5%AD%90%E3%83%93%E3%83%83%E3%83%88%E3%83%BB%E9%87%8F%E5%AD%90%E3%82%B2%E3%83%BC%E3%83%88%E3%83%BB%E9%87%8F-%E9%81%A0%E8%97%A4-%E7%90%86%E5%B9%B3/dp/4877834702)
【Laravel 6.0】スピード環境構築！

# 背景
Laravelを使う際に環境構築が必要ですが、１つ１つ確認しながらやるのは面倒だと思うので、速攻で使えるようになるまでの手順を紹介します。

## 手順

1.Xcodeのインストール

```
$ xcode-select --install
```

2.Homebrewのインストール

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

3.PHP7.3のインストール

```
$ brew search php@7

$ brew install php@7.3
```

4.Composerのインストール

```
$ brew search composer

$ brew install composer
```

5.[Node.js](https://nodejs.org/ja/)公式サイトへアクセス

6.「推奨版」をクリック

7.ダウンロードされたファイルを開き、インストールを完了させる

8.Laravelの新規プロジェクトの作成
※必ず今いるディレクトリを確認してください。
(特にこだわりがない方はホームディレクトリ（~/）やデスクトップなどで作業するればいいでしょう。)

```
$ composer create-project laravel/laravel アプリ名 --prefer-dist "6.0.*"
```

9.プロジェクトのディレクトリに移動

```
$ cd アプリ名
```

10.composer installとnpm installをする

```
$ composer install

$ npm install
```

11.jQuery、Bootstrapのインストール

```
$ composer require laravel/ui "^1.0"

$ php artisan ui bootstrap --auth
```

12..envの設定
※デフォルトではこうなっています。これをご自身の開発環境に合わせて設定してください。

```
...

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

...
```

13.初期ページが表示されるか確認
※コマンド実行後、[http://localhost:8000](http://localhost:8000)か、[http://localhost:8000/public](http://localhost:8000/public)に接続して確かめてください。

```
$ npm run dev

$ php artisan serve
```

## 終わりに
これでLaravelを使うことができると思います！
ここまでパッと出来れば結構時短になると思うので活用してください！！！
Jimp の hash はすぐに衝突するので注意する

Node.js の画像処理によく使われる [Jimp](https://github.com/oliver-moran/jimp) だが、思いがけない落とし穴（バグではない）があったのでメモ。

# 全く異なる２つの画像のハッシュ値が同じになってしまう

- 次の２つの画像を Jimp で hash すると、同じハッシュ値 `80000000000` (base64) になる
    - ![](https://img.hackforplay.xyz/u/k8iYlBvaCHXeUQNkuHekaEwzUyO2/80000000000.png)
    - ![](https://img.hackforplay.xyz/u/fvnXbi6IzkWAykuzkTyzzXXXlA82/80000000000.png)
    - [この Codesandbox](https://codesandbox.io/s/loving-ride-eiljq?file=/src/index.js) を開けばブラウザ上で再現可能

- ハッシュ値が衝突してしまうことは「起こりうる事象」なのだが、 Jimp のハッシュは**かなり頻繁に衝突する**ので、なるべくユニークな値が欲しい場合は諦めて別の方法でハッシュした方がいい
- バグなのかとも思ったが、[３年前に Issue が立ったまま放置されている](https://github.com/oliver-moran/jimp/issues/338)
    - 💭 放置されていることで誰かを責める意図はないが、ドキュメントに分かりやすく注意書きをした方がいいかも知れないな、とは思っている
    - 💭 というか、base64 で `80000000000` って２進数だと `1000 0000 .... 0000` なので、やっぱり実装に問題があるのかも？

# Jimp が採用しているハッシュアルゴリズム - pHash

- Jimp は [pHash](http://phash.org/) というアルゴリズムを採用していると [README に書いてある](https://github.com/oliver-moran/jimp/tree/master/packages/jimp#comparing-images)
- pHash とは、ざっくりいうと、視覚的な差とハッシュの差が近くなるように実装されたハッシュらしい
    - つまり MD5 や SHA のように「ほんの少しの違いでハッシュ値が大きく変わる」という特徴を持っていない
    - 💭 [Jimp の pHash 実装を読んでみると](https://github.com/oliver-moran/jimp/blob/master/packages/core/src/modules/phash.js) 、「高周波成分をなくすために 32x32 に縮小します」「画像をグレースケールに変換します」とか書かれていて、目玉が飛び出そうになった
    - 💭 間違っても画像の一致判定、特に暗号学的な用途には使えない

# Jimp.distance() の落とし穴

- Jimp には２つの画像の差を求める関数として `Jimp.distance` と `Jimp.diff` の２つを用意している
- `Jimp.distance()` は pHash で互いのハッシュ値を求めたあと、単に２つのハミング距離を返す関数である
- 前述の説明から分かるとおり、 `Jimp.distance(a, b) === 0` は a と b が**一致していることを意味しない**
    - a と b が一致していれば 0 になるが、そうでなくても 0 になるケースがある（前述の例でもやはり 0 になる）


```javascript
Jimp.distance(image1, image2); // returns a number 0-1, where 0 means the two images are perceived to be identical`
```

💭 [ドキュメント](https://github.com/oliver-moran/jimp/tree/master/packages/jimp#comparing-images)には上のように書かれているので、勘違いする人がいるかも知れない。 単に僕の英語力の問題かも知れないが、 `perceived to be identical` は明らかに間違っているのでは……（自信がない）

参考までに pHash.org は次のように表現している

> perceptual hashes are "close" to one another if the features are similar.
> http://www.phash.org/

💭 ちなみに、 `Jimp.diff` は [PixelMatch](https://github.com/mapbox/pixelmatch) というライブラリでピクセル単位で画像を比較するので、ドキュメントには両者を組み合わせることで "the same image" (意味は下の文を読んでください) を発見出来ると書かれている

> Using a mix of hamming distance and pixel diffing to compare images, the following code has a 99% success rate of detecting the same image from a random sample (with 1% false positives). The test this figure is drawn from attempts to match each image from a sample of 120 PNGs against 120 corresponding JPEGs saved at a quality setting of 60.
> https://github.com/oliver-moran/jimp/tree/master/packages/jimp#comparing-images

# まとめ

- 単に画像のハッシュ値を得るために Jimp の hash を使うべきではない
    - Node.js なら標準の [crypto.createHash](https://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm_options) ないしそのラッパーを使うといい
- `Jimp.distance(a, b) === 0` は a と b が一致していることを意味しない
    - 単に画像の一致を高速に判定したいなら `Jimp.diff` (PixelMatch) を使う
Ubuntu 18.04.4が頻繁にフリーズする

# あらすじ
自作PCにGPUを乗っけてから頻繁にフリーズするようになったので、ためしたことをメモ。

# 状況
起動は普通にできるのだが、しばらく使っていると突然（数日おきくらいに）突然フリーズし、入力を受け付けなくなる。
外部からのSSH接続もできず、電源長押しで強制シャットダウンするしかない。
ログを取って確認したが、CPU温度やメモリ使用量も正常。
sysrq+r+e+i+s+u+bも効かないので、カーネルが死んでいる？どうもカーネルパニックを起こしてるような気がする。
(参考：http://ukituriboku8136.blog.fc2.com/blog-entry-273.html)

# やったこと

- [grub設定を変更する](https://vigintillion.tokyo/ubuntu-18-04-2-lts%E3%80%80/)：Ubuntuの[バグ](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1503731)を踏んで似たような状況に陥っている可能性があるので、設定を変更した。`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"`-->`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_idle.max_cstate=1"`
- [カーネルパニック時に再起動するように設定](https://linux.just4fun.biz/?%e9%80%86%e5%bc%95%e3%81%8dUNIX%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89/Linux%e3%81%a7%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e3%83%91%e3%83%8b%e3%83%83%e3%82%af%e3%82%92%e7%99%ba%e7%94%9f%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95)：`/etc/sysctl.conf`に`kernel.panic = 10`を追記、`sudo sysctl -p`で反映。
- sysrqを有効化：sysrq+r+e+i+s+u+bすら受け付けなかったのだが、もしかしてsysrqが無効になっていたからでは？(一応`/proc/sys/kernel/sysrq`はデフォルトの176に設定されており、sysrq+Bは有効のはずだが)、ということで、`/etc/sysctl.conf`の`kernel.sysrq = 1`のコメントアウトを外す。ついでにこれで`sysrq+c`が有効になるので、意図的にカーネルパニックを起こして正しく再起動されるかテストした。

# その後

うまくいってくれるといいのだが……
ExcelからRunメソッドでAccessのプロシージャを呼ぶと「見つかりません」

# 要点
・Accessを立ち上げているときは、終了させてから再度Runする

##補足
1. AccessのプロシージャをPublicにしておくのは大前提。

2. `Run`の第1引数で指定するプロシージャのストリングは、`"プロジェクト名.プロシージャ名"`にする（参考URL参照。そこに書いてあるように、プロジェクト名はAccessのVBEで「ツール>××のプロパティ」を開いて確認・設定できる[そもそも、その××がプロジェクト名]）。

3. 上記1、2でも「見つかりません」が返るときは、Accessが起動している。画面上に見当たらないときは、タスクマネージャーでバックグラウンドプロセスを探してみる。

##参考URL
Application.Run method (Access)
https://docs.microsoft.com/ja-jp/office/vba/api/access.application.run
(日本語訳はちょっと何言ってるか分からない)
ちょい足しでちょいリッチ！GSAP/TweenMaxを使ってサイトに動きを足してみる1［超初心者向け］

コーディングが終わってブラウザで確認すると「なにか物足りない」「目立ってほしかったコピーが目立たない！」って感じることありませんか？
そんなときにアニメーションをちょっと足していい感じにしませんか？

アニメーションが簡単に実装できるJSライブラリ[GSAP](https://greensock.com/)を使えば
WebGLやCanvasの知識は必要ありません！簡単にアニメーションを追加してちょいリッチなサイトの出来上がりです！

では早速コードを書いていきます！

まず、CDNを貼り付けます。

```ruby:html
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenMax.min.js"></script>
```

あとは、動かすためのコードを書くのみ

```ruby:javascript
// 動かす要素を取得します
const opa = document.querySelector(".op-animation");

// タイムラインを作成する
const timeline_opa = new TimelineMax({ repeat: -1, delay: 1, yoyo: false, paused: false });

// 作成したタイムラインtimeline_opaにアニメーションを記述
timeline_opa
.to(opa, 2.0, {
  opacity: 1
})
```

このメソッド.to()を繰り返すことで連続したアニメーションを付け足していくことができます。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="komisu" data-slug-hash="NWxxmeG" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="animation using gsap">
  <span>See the Pen <a href="https://codepen.io/komisu/pen/NWxxmeG">
  animation using gsap</a> by Kitajima Sumiko (<a href="https://codepen.io/komisu">@komisu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


今回は.to()メソッドのみで記述してますが、他にも代表的なメソッドは以下があります。
fromTo(), call(), set(), staggerTo()
参照：[TimelineMax](https://greensock.com/docs/v2/TimelineMax)

代表的なプロパティは以下があります
opacity:　透明度
rotation:　回転
width:　横幅
height:　高さ
x:　X軸の移動
y:　y軸の移動
scale:　拡大・縮小
backgroundColor:　背景色

組み合わせればもっと表現豊かになりそうですね
参照：[Getting Started with GSAP](https://greensock.com/get-started#loading-gsap)

以上、ちょい足しできるアニメーションの実装方法を紹介しました！
今回紹介したアニメーションはライブラリーのごくごくほんの一部です。
興味がある方はぜひ[GSAP](https://greensock.com/)のサイトをチェックしてみてください！見る価値あり！
neovimで日本語が文字化けする

# TL;DR
これをvimrcに追加(neovimの場合は、.config/neovim/init.vim?

```
set encoding=utf-8
set fileencodings=utf-8
set fileformats=unix,dos,mac

lang en_US.UTF-8
```


# 1.  よくある対処法
set encodeingを変えてねっていうやつ

https://qiita.com/meio/items/08143eacd174ac0f7bd5
https://qiita.com/t_gata/items/e4f72016b47a0d6fc5eb

# 2. 1で治らない場合は、langを変更

```
lang en_US.UTF-8
```

参考にしたページは、2020/6/11時点でこのサイトは動いてなく、Googleのキャッシュで閲覧しました
たどりつきにくいかもなので、本記事作ってます。

http://webcache.googleusercontent.com/search?q=cache:27zh5K9zfVEJ:https://teratail.com/questions/166889&hl=en&gl=jp&strip=1&vwsrc=0
【VSCode】PHPファイルに書かれたHTMLのフォーマットを整える。

#はじめに
もう1年もVSCode愛用しているのに入れてなかったプラグインがありました。でも意外と知らない人が周りにいたんで用途とかインストール方法とか紹介します。

##ターゲット

- VSCode入れたての人
- WordPressの固定ページでインデントを手動で揃えている人。


##phpファイルのほとんどがHTMLの場合

###Format HTML in PHP
####効果
phpファイルには書き込まれたHTMLをフォーマットする
####インストール方法
1. Format HTML in PHPをインストールする。
2. phpファイルが開かれてる状態で右クリックして一番下の**「Format HTML in PHP」**をクリックする。


####補足
-  インストールするだけで使用可。設定は要らない。
seleniumの使い捨て環境をdockerで簡単に構築する

##### 前提
・dockerがインストール済み
・VSCodeのremoteエクステンションがインストール済み
・あまり細かいことを考えないでさくっと使い捨てたい
・local環境は汚れないとhappy

#####手順

Seleniumの方の公式イメージがあるので、ベースに使用します。
とりあえず以下のコマンドを叩いてコンテナを作成。
（なんとなくchromeで動作している画面を見たかったからchromeのdebug版にしていますが、もちろんどのイメージでもOK）

$ docker run -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-chrome-debug

コンテナが起動したら、VSCodeの左側、リモートエクスプローラから立ち上げたコンテナを探し、右側のプラスマークがついたボタン（attach to container）をクリック

vscodeでコンテナが開かれるので、apt-getでrubyやpythonなどの言語やライブラリを導入すればもう完成！

好きな言語スクリプトを書けばこのままスクレイピングが可能です。
debug版ならselenium動作中の画面も、Finderからサーバへ接続を選択し、接続先：vnc://localhost:5900/、パスワード：secretを入力すると見れます。（macの場合）

#####最後に
ベースのイメージの段階でseleniumやchromeなどは導入ずみだしパスも通っているので、selenium周りは一切触る必要ありません。これは楽！
もちろん、dockerfileを落としてきて、imageをbuildする時点で言語やらライブラリも入れてしまう方がいいのだけど、面倒なので今回はしてません。

また、seleniumコンテナと別にrubyコンテナを作るのでもいいのだけど、使う時のコンテナ起動し忘れ問題などの面倒を考え、今回はコンテナ１つの構成にしています。
LaravelでGraphQLサーバーを作成できるLighthouseの解説(導入)

GraphQLサーバーを作成することになり、Lighthoseを利用したので備忘録と簡単な解説。
今回は導入編

## Lighthouse
公式:https://lighthouse-php.com/
LaravelでGraphQLを利用するためのライブラリ。

## 導入
* インストール

```
composer require nuwave/lighthouse
```
* デフォルトスキーマの公開

```
php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" --tag=schema
```
作成されるスキーマファイル

```php:graphql/schema.graphql
"A date string with format `Y-m-d`, e.g. `2011-05-23`."
scalar Date @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\Date")

"A datetime string with format `Y-m-d H:i:s`, e.g. `2018-05-23 13:43:32`."
scalar DateTime @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\DateTime")

"A datetime and timezone string in ISO 8601 format `Y-m-dTH:i:sO`, e.g. `2020-04-20T13:53:12+02:00`."
scalar DateTimeTz @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\DateTimeTz")

type Query {
    users: [User!]! @paginate(defaultCount: 10)
    user(id: ID @eq): User @find
}

type User {
    id: ID!
    name: String!
    email: String!
    created_at: DateTime!
    updated_at: DateTime!
}
```

* configファイルの作成

```
php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" --tag=config
```

上記コマンドで `config/lighthouse.php` にファイルが作成されます。
エンドポイントの変更とか諸々の設定が可能です。


* DevTool GraphQL-PlayGround

GraphQLスキーマの確認、クエリを実行できる便利なTool
ちなみにPostman等クライアントツールもGraphQLに対応しています。

```
composer require --dev mll-lab/laravel-graphql-playground
```
dockerやlaravelのビルドインサーバーを立ち上げて`アプリURL/graphql-playground`にアクセスすることで利用できます。
![スクリーンショット 2020-06-11 15.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432658/04172d7f-da09-9294-588b-b304633b2f73.png)


公式見れば書いてあるすごく薄い内容ですが導入は終わり
次回はlighthouseのディレクティブをまとめたいって思ってます。
Pillowを使用して画像を透過して一部だけ重ねる

# はじめに

業務で画像を一部だけ重ねる必要があり、方法を調べたのでメモとして残しておきます。

最初はopencvを使用して、重ねる予定でしたが、調べているうちにPillowを使用したほうが楽そうだったのでそちらを使用する方法に切り替えました。

使用する画像は以下
<img width="250" alt="test1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540218/8024ee8a-bca7-ff35-ac0d-2aed4d916ee2.png">　<img width="250" alt="test2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540218/51e957b5-d79c-155e-bcde-59af88729356.png">


# 画像を透過する

まずは、画像を透過する。
これは検索すれば結構出てくるのですぐにできると思います。

実装は以下。

```
from PIL import Image

im1 = Image.open("test1.png")
im2 = Image.open("test2.png")

im1.putalpha(128)
im2.putalpha(128)

```

やっていることは、

1. `Image.open("ファイル名")`で画像を読み込む
2. `putalpha(alpha)`で透過している

# 画像を重ねる

次に透過した画像を重ねる。
重ねるときに1枚もとになる画像を作成して、それに透過した画像を張り付ける感じで重ねます。

実装は以下。

```

bg = Image.new("RGBA", (1000, 1000), (255, 255, 255, 0))

bg.paste(im1, (200, 200), im1)
bg.paste(im2, (400, 400), im2)

bg.save("join.png")

```

やっていることは、
1. `Image.new()`で画像を重ねるためのべーずになる画像を作成します。
2. `paste()`でベースの画像に透過した画像を重ねます。
3. `save()`で画像を保存します。

保存された画像が以下。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540218/d687b5ca-2335-bce6-559e-1ec0eef6e1e9.png">

いい感じに透過された画像が重ねっているのが分かりますね！
MacでPlantUMLをつかってシーケンス図を描いてみる(VSCode)

#PlantUMLとは？
PlantUMLを使用するとシーケンス図やクラス図などをコード上で簡単に作成することができます。
またオープンソースなので無料で使うことが可能です。
公式ページURL
[PlantUML 概要](https://plantuml.com/ja/)



#Mac環境への導入
 - VSCodeのをダウンロード
   - 以下のURLからダウンロード
      - [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
   - インストールについては以下の記事を参考にするとスムーズに行えるかと思います
      - [MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)
 - Javaをインストール(PlantUMLの実行に必要)
   - [Java SE Downloads](https://www.oracle.com/java/technologies/javase-downloads.html)
   - 上記リンクに移動しJDK Downloadを選択
   - Java SE Development Kitの中から``macOS Installer``用のkitを選択し、ダウンロード・インストールを行う
 - graphvizをインストール
   - コンソール画面より以下のコマンドを実行してインストールしていきます
     -  ``brew install graphviz``  
      ※今回はbrewを使ってインストールしています  
        [Homebrew](https://brew.sh/index_ja)  
 - VSCodeにPlantUMLを導入
   - VSCodeの拡張機能からPlantUMLをインストール
   　<img width="869" alt="スクリーンショット 2020-06-11 12.02.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/5df85deb-fb50-10ad-24cf-83f8c60bd21c.png">

#実際に描いてみよう
記述時の参考サイト：[PlantUML Cheat Sheet](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)

 - ファイルを作る
   - 拡張子を``.pu``形式で保存するとPlantUMLとして認識してくれます
 - シーケンス図を描いてみる  
  お試しに以下のような内容で記述してみました

```
@startuml

actor アクター

アクター -> クラス1

activate クラス1
クラス1 -> クラス2 : テスト1

activate クラス2
クラス1 <-- クラス2 : テスト1戻り
deactivate クラス2

クラス1 -> クラス1 : テスト結果判定
アクター <-- クラス1 : テスト結果出力
deactivate クラス1

@enduml
```
 - プレビューで見てみる   
   - VSCode上でショットカットキー```Option+D```を押すとプレビュー画面が表示されます
![スクリーンショット 2020-06-11 15.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/d2f78cfb-efab-20f0-2df2-83e8f14c91f5.png)
 - ファイルを出力してみる
    - VSCode上でショットカットキー```cmd+shift+p```を押しコマンドパレットを表示
    - コマンドパレット上で```PlantUML```を入力するとそれぞれの操作が出てくるので```カーソル一のダイアグラムをエクスポート```を選択
     ![スクリーンショット 2020-06-11 15.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/1536275d-380e-e054-9afa-a722b83f98a1.png)
    - 拡張子の選択を行う
    　![スクリーンショット 2020-06-11 15.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/988ee2e3-48d4-d060-2832-bd4c6b2a7989.png)
　　 - 出力が開始されるので無事指定形式のファイルが出来上がっていれば完成です！
　　 　![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/4df976d4-58a2-50af-e7d8-2fba9497e055.png)


#その他導入時に参考にさせてもらった記事
 - [Visual Studio Code で UML を描こう！](https://qiita.com/couzie/items/9dedb834c5aff09ea7b2)
pivot longer, pivot widerのひな型(gather spreadの上位互換)

この記事ではR version 3.6.3、tidyverseパッケージを使っています。

##コード

```{r}
library(tidyverse)
iris %>% 
  pivot_longer(
    cols = c( ###列の選択
      "Sepal.Length", 
      "Sepal.Width",
      "Petal.Length",
      "Petal.Width"
      ),
    names_to = "traits",　#列名を格納する列の名前
    values_to = "value"　#値を格納する列の名前
  )
```
##結果

|Species    |traits       | value|
|:----------|:------------|-----:|
|setosa     |Sepal.Length |   5.1|
|setosa     |Sepal.Width  |   3.5|
|setosa     |Petal.Length |   1.4|
|setosa     |Petal.Width  |   0.2|
|setosa     |Sepal.Length |   4.9|
|setosa     |Sepal.Width  |   3.0|
|setosa     |Petal.Length |   1.4|

## 補足
かなりいろいろできそう。今後も更新予定
Android Studio 4.1 の Layout Editor で便利になった機能

[Android Studio 4.1](https://developer.android.com/studio/preview/features/#4.1) の Layout Editor で地味に便利になった機能をいくつか紹介しようと思います。
⚠️この記事を書いている 2020/6/11 現在、Android Studio 4.1 はベータ版であり、正式版のリリースまでに変更されている可能性があります⚠️

また、Layout Editor 以外の改善点は [What's new in Design Tools](https://youtu.be/ns67AAuDs4s) の動画で紹介されているので、合わせて見てください。  


## Custom View Preview
Code Editor に Custom View のプレビューが表示されるようになりました。
また、プレビューのサイズが可変になっているのでレイアウト崩れの確認もすることができます。

![スクリーンショット 2020-06-11 14.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/cbb602b5-595b-d41d-3e05-70a9cc0f170f.png)


## Visibility の設定方法の改善
Layout Editor で View のツリーから Visibility の設定が簡単に行えるようになりました。
tools の Visibility もここで設定することができます。 

![Settings visibility](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/df34528f-40ed-fb3a-868c-dff9a8114d1e.png)

## tools: の切り替えができるように
新たに `tools:` で指定したものをプレビューに表示・非表示を切り替えるボタンが追加されています。  
`tools:` で設定していたために実際のコードに指定を忘れていないか確認できます。  

![Toggle Tools](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/d855e995-b6e2-2a89-ef36-cf5b831b6c2f.png)

## Constraint Layout Helper が使いやすくなった
Layout Editor の Palette から使える Constraint Layout Helper の種類が増えました。
また、View を選択した状態で Helper を追加すると View へ参照した状態で　Helper を追加してくれます。

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/1f34a052-7403-36d8-5b75-72e44300d5d4.gif)


## アセット周りの改善
コードの行番号付近のすでに設定されている画像リソースからポップアップで画像リソースを選択できるようになりました。

<img width="627" alt="Select image resource" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/329c1741-0b9c-a418-aceb-1641b97c679d.png">

Vector Asset で選択する Material Icon が最新のアイコンが使えるようになったので、新しいアイコンを Web からダウンロードしなくても済むそうです。  


## Accessibility Test Framework integration
アクセシビリティの確認するライブラリの統合が予定されているそうです。



Android Studio 4.1 では他にも Navigation Editor で DeepLink の細かな設定ができるようになったり、Motion Editor で Transition のパラメータ変更や微調整の改善がされているそうで、正式版が楽しみですね。
PHPで作る加算器（足し算しかできない計算機）から学んだこと

毎日、プログラミングで色々と作っているウッタムです。今日は、昨日一応完成した「足し算しかできない計算機」から学んだことを、まとめてみました。近々「すべての機能を備えた計算機」を作りたいと思っているので、頑張ります！誤りがある可能性があるので、ご指摘お願いいたします！

![2020-06-11 6.58のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437473/97300e1f-76e4-bceb-b44a-83e6db232e73.jpeg)


##つまずいた点・気になったこと①【bodyタグ】

```
<form action="calculator.php" method="post">
      <div class="main_point">
        <input type="text" name="number1" value="<?php echo htmlspecialchars($number1); ?>"> +
        <input type="text" name="number2" value="<?php echo htmlspecialchars($number2); ?>"> =
        <?php print $answer; ?>
      </div>
      <input type="submit" name="button_sum" value="計算する！">
</form>
```

###form action="" method="post"

####formタグのaction属性について

フォームにある「送信ボタン」を押して送信されるデータの送信先を指定できるので、action属性の中にURLを入れる。絶対に記載しないといけないもの。

###メソッド属性のpostについて

>フォームデータをサーバに送信する方法をWebブラウザに伝えるもの。POSTの値を指定するなら、ブラウザが処理されるためにデータをウェブサーバに送信してくれる。[参照したWebサイトより](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjs862Uy_jpAhV34zgGHVmOBvAQFjABegQIChAD&url=https%3A%2F%2Fhtml.com%2Fattributes%2Fform-method%2F&usg=AOvVaw3C5xS3HAG10VgrnrHaIrFy)

つまり「サーバーに入力したものの結果を表示してもらうようお願いする」メソッド。

###htmlspecialcharsについて

セキュリティのためにつけたいもの。これを使うと、特殊文字を、特殊な意味を持たない単なる文字列に変換してくれるのです。

##つまずいた点・気になったこと②【PHP内】

```
<?php 
  if (isset($_POST['number1']) && isset($_POST['number2']) ){
    $number1 = $_POST['number1'];
    $number2 = $_POST['number2'];
  }
  $answer = $number1 + $number2;
?>
```

見た感じ、シンプルですね〜。少しずつ分解して理解してみると以下の感じになります。

###issetとは...###

変数が設定されているかを調べるもの。フォームから送信されたデータの値がセットされているかどうか確認したい時に使う。isset(引数)という形で利用し、引数には変数を入れる。変数に値が挿入されていたら、戻り値を返す。

###$_POSTとは###

form（フォーム）からデータを受け取る方法として、GETとPOSTの二つがある。

GETを使うと、フォームに記入したものが、ブラウザーとURLの二つに反映される。パスワードとか個人情報の場合は、危険。

単にデータを受け取りたい場合は、POSTでOK！

###&&とは###

「左右に書かれているものの両方が含まれる」という意味。今回の場合は、**isset($_POST['number1'])** と **isset($_POST['number2'])**の両方が記載されている場合、となる。

###今回のif文###

まとめていると、今回の条件式は以下のことになりますね。

number1とnumber2の両方に値があったら、「$number1にはnumber1」「$number2にはnumber2」を代入する、ということになります！

##もっとできること

何が他にできるか考えてみました。作っただけで終わらせず、向上させたいですものね！

1. リセットボタンを導入
2. 数字ではないものがフォームに書かれた場合、エラー文の表示

とかでしょうか。

##まとめ

![足し算のみできる計算機.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437473/335bb212-4452-f3c4-6397-23625d64574c.gif)


今回は、加算器の復習をしてみました。作っただけでなく、整理してみると理解度が深まりますね。ぜひ、皆さんも色々な計算機を作ってみてくださいね。
GASでGmailにテーブルを作成するコード

最近、Gmailにテーブルを作れると知ったのでコード作成。
このテーブルの色合いが良いとは思っていないが、再度HTML,CSS作るのも嫌だったのでメモ代わりに記事作成。

第二引数にtypeを入れることによって項目有り無しの変更を加えてある。


▼項目なし
<img width="300" alt="2020-06-09_17h35_46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/e66d662e-0bff-72ce-d907-fb077c85ea3e.png">

▼項目あり
<img width="300" alt="2020-06-09_17h35_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/4723002d-a08c-7a93-5561-a82da54b855b.png">


下記コードです。

```javascript:createMaildraft.gs

function createMaildraft() {

  const shtName = 'table';
  const sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(shtName);
  const values = sht.getRange('A2:C5').getValues();
  
  // 本文(html)以外の設定  
  const recipient = '';
  const subject = '件名';
  const body = ''; 
 
    // 本文の設定
  let html = `
  本文作成
  
  ▼テーブルの挿入
  ${makeTable_(values, 1)}
  
  挿入完了
  `;
  
  // 空白は<br>に変換しないと改行にならないので処理
  html = html.replace(/\n/g, '<br>');
  GmailApp.createDraft(recipient, subject, body, {htmlBody :html})
}

```

```javascript:makeTable_.gs
/**
* 二次元配列からtableのHTMLを返すコード
* type:0 項目名なし(デフォルト)
* type:1 項目名あり
* 
* @param {object}  二次元配列のデータ
* @param {number}  テーブル作成の形
* @return {string} tableのHTMLコード
*/

function makeTable_(values, type = 0) {
  
  let table = "<table style = 'width: auto; border-spacing: 0;font-size:14px; border: 1px solid #ddd;'>";
  
  for(let i=0; i<values.length; i++){
    table += '<tr>';
    
    if (i === 0 && type === 1) {
      for(let cell of values[i]){
        table += `<th style = 'padding: 8px 15px; border: 1px solid #fff; background: #888; font-weight: bold; color:white;'>${cell}</th>`;
      }
    } else if (i % 2 === 1) {
      for(let cell of values[i]){
        table += `<td style = 'padding: 8px 15px; border: 1px solid #ddd;'>${cell}</td>`;
      }
    } else {
      for(let cell of values[i]){
        table += `<td style = 'padding: 8px 15px; border: 1px solid #ddd; background: #f5f5f5;'>${cell}</td>`;
      }
    }
    table += '</tr>';
  }
  table += '</table>';
  
  return table;
}
```