OmniAICreator/Qiita-1.07M huggingface dataset:
#python でJST=日本時間=現地時刻を現在時刻を文字列で得る例

- python3 
- datetime オブジェクトを pytz で localize する

```python
from pytz import timezone
from datetime import datetime

timezone('Asia/Tokyo').localize(datetime.now()).strftime('%Y-%m-%d %H:%M:%S %Z')

# '2019-04-02 19:50:55 JST'
```

# Ref

[Pythonの UTC ⇔ JST、文字列(UTC) ⇒ JST の変換とかのメモ - Qiita](https://qiita.com/yoppe/items/4260cf4ddde69287a632)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
「react-native run-ios」で「Could not find iPhone X simulator」

## 2019年10月3日追記(krimpedanceさん指摘)

xcode11.0でiPhoneXがリストから消えたようです。
https://github.com/react-native-community/cli/issues/739#issuecomment-533885641

>Workaround solution awaiting fix (is was no able to find where is the default in the cli source code…) :
> - yarn react-native run-ios --simulator "iPhone 11 Pro Max"
> - npx react-native run-ios --simulator "iPhone 11 Pro Max"
> - react-native run-ios --simulator "iPhone 11 Pro Max"
> - ./node_modules/.bin/react-native run-ios --simulator "iPhone 11 Pro Max"

`iPhone 11 Pro Max`なら問題なさそうですね！

## 2019年9月27日追記

この記事は2019年04月03日に書いたものです。
その時はxcodeを**10.2**にアップデートしたことが原因でした。

2019年9月20日にxcodeを**11.0**がリリースされています。
**11.0**でもビルドできないようです。

botいわくReactNativeのバージョンアップで解決らしい

```
 "react": "^16.9.0",
 "react-native": "^0.61.1",
```

詳細はissueをご確認ください。
https://github.com/facebook/react-native/issues/26594

バージョンアップは辛いという方はこちら
https://github.com/facebook/react-native/pull/25146#issuecomment-533995604

## 概要

昨日までsimulatorが立ち上がったのに、急に立ち上がらなくなった。

```terminal
~/r/sample ❯❯❯ react-native run-ios
Found Xcode project sample.xcodeproj

Could not find iPhone X simulator

Error: Could not find iPhone X simulator
```
心当たりは、Xcodeを10.2にアップデートしたこと。

## 環境
xcode 10.2
ReactNative 0.57.4
※多分0.57.4以外でも発生します。

## 解決方法
解決策がすでにありました。
https://github.com/facebook/react-native/issues/21498#issuecomment-476621627

### パターン1 findMatchingSimulator.jsの書き換え
`node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js`

42行目~

```javascript
  if (!version.startsWith('iOS') && !version.startsWith('tvOS')) {
    continue;
  }
```

下記に書き換え

```javascript
  if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS')) {
    continue;
  }
```

### パターン2 ReactNativeのバージョンアップ
0.59.0以上にバージョンアップすると動作します。

ただ、0.59.1にバージョンアップするのに詰まったので、下記を参考にさせていただきました。
https://github.com/saghul/rn-diff/compare/rn-0.57.4...rn-0.59.1

## おまけ
ReactNativeのバージョンを変更したくなかったので、`findMatchingSimulator.js`の書き換えでいこうと思ったが、
node_modulesをインストールする度に書き換えるのは面倒なのでシェルスクリプトを用意しようと考えた。

gnu-sedをインストール

```terminal
brew install gnu-sed
```

```shell
#!/bin/sh

rm -rf node_modules
npm install 

gsed -i -e '42d' ./node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js
gsed -i -e "42i if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS')) {" ./node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js
```

初めてシェルスクリプトを書いたけど置換でいいはず...勉強します。

## 最後に
Android64bit対応も必要ならこれを機にReactNativeのバージョンを更新した方が幸せになれる気がする
#python で unixtimestamp を日付形式の文字列に変換する例

```py
import datetime

datetime.datetime.utcfromtimestamp(1554145208.000100).strftime('%Y-%m-%d %H:%M:%S')

# '2019-04-01 19:00:08'
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#python で JST(日本時間)などの現地時刻で今日の始まりの unixtimstamp を得る例

```py
from datetime import datetime
import pytz, time

tz = pytz.timezone('Asia/Tokyo')

d = datetime.now(tz=tz).replace(hour=0, minute=0, second=0, microsecond=0)
print(d)

unixtimestamp = time.mktime(d.timetuple())

print(unixtimestamp)
```

# e.g

```
$ python3 today.py
2019-04-02 00:00:00+09:00
1554130800.0
```

# ツールで逆変換して正しいかどうか確認してみる

[Unixtime相互変換ツール - konisimple tools](https://tool.konisimple.net/date/unixtime?input=1554130800.0)

![image](https://user-images.githubusercontent.com/13635059/55375172-28144700-5546-11e9-9b6b-7d43ed142bb7.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Boost を Android 向けに bjam ビルドするテクニック(NDK r19c or later)

# 背景

* Boost をどうしても利用しないといけない状況にある(使いたいライブラリが Boost を使っていて, コードを書き換えるにはめんどいなど)
* Boost の機能全部を利用するわけではない
* Android だと NDK の関係でコンパイラ指定が変わるので(r19 から standalone_toolchain.py でコンパイラのセットアップは deprecated になり, コンパイラの直指定に変わった), 明示的にコンパイラ設定をしたい
* 本当は cmake でのビルドにしたいが, bcm https://github.com/boost-cmake/bcm などがあるが, 理想は boost を submodule としてビルドしたいので, bcm は求めているのと違う感じもするのでとりあえず bjam/b2 でビルドする

## 対象

* NDK r19c or later
* Boost 1.69.0

ネットでは古い NDK を対象にする記事が多いので, ここでは NDK r19c or later(clang 限定 + standard_toolchain ではなく, `aarch64-linux-android28-clang++` のようにコンパイラを直指定のバージョン)を扱います.

ちなみに gcc は NDK18 あたりで廃止され, clang のみ(+ libc++)になりました.

## BCP

まず, boost 全部を使う必要はないので, bcp で必要なモジュールだけ抜き出します.
(bjam で `--without-***` という手もがあるがめんどい)

https://www.boost.org/doc/libs/1_69_0/tools/bcp/doc/html/index.html

bcp では, 使いたい機能(+ file?)を指定すると, 指定したターゲットのディレクトリに一式よろしくファイルをコピーします

```
$ bcp <<packages>> /path/to/target
```

ライブラリのコンパイルが不要(header file だけで完結)の場合はここで終了です.
お疲れさまでした. :relaxed:

ライブラリのコンパイルが必要なもの(e.g. `system`, `thread`)では, 

```
build bootstrap.bat bootstrap.sh boostcpp.jam boost-build.jam
```

を bcp の `<<packages>>` に含めておきます.

## ビルドカスタム設定

`user-config.jam` で, コンパイラ指定をします.
`$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin` にコンパイラがあります.

```
# Set path to toolchain
local AndroidToolchainRoot =
/home/syoyo/local/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64
;

using clang
: android
: $(AndroidToolchainRoot)/bin/aarch64-linux-android28-clang++
;
```

など.




`b2` の `--user-config` オプションでファイルのありかを指定し, `toolset=clang` とすることで, `user-config.jam` の `using clang` の設定を見るようになります.


```
$ ./configure
$ ./b2 --reconfigure toolset=clang target-os=android link=static --user-config=user-config.jam
```

などとしてビルドします. デフォルトでは 1 コアしか使わないので, CPU のコア数に応じて `-j8` などを追記ください. 

## 実例

https://github.com/syoyo/openvdb-android


の README と `boost/user-config.jam` を参考ください.

## TODO

* link 周りを改善する(`user-config.jam` で ldflags 指定とか). 現状 .so ビルド(link=dynamic)だと `-lrt` が見つからないなどでエラーが出る. 
* cmake でビルドできるようにしたい(NDK r19c or later で) 
* b2 で lzma などの探索を強制的に disable する
* `./configure` 時にコンパイラ指定とかできるかしらん?
VScodeで.gitを表示する方法

VSCODEでの隠しフォルダの表示の仕方が探してもなかったので記事にしました。
①下記をクリックして「設定」を選択
[![Screenshot from Gyazo](https://gyazo.com/224150880fd489714a965a4809fa3f61/raw)](https://gyazo.com/224150880fd489714a965a4809fa3f61)
②下記の画面でバツアイコンをクリックすれば隠しフォルダが表示される。（ペンのアイコンで編集できる）
[![Screenshot from Gyazo](https://gyazo.com/ad975b53b93b1a21c75f829f4773089a/raw)](https://gyazo.com/ad975b53b93b1a21c75f829f4773089a)

以上で.gitファルダがアプリケーション内に表示されます。
compass使用時にパスに日本語が含まれてるとエラーが出る

ディレクトリ(フォルダ)名をアルファベットにすれば動く

/Users/hoge/Documents/HTML/アーカイブ/html/src
　　　　　　　　↓
/Users/hoge/Documents/HTML/arcv/html/src

zip圧縮した時にファイル名こうなった模様

以下自分が検索しやすいようにエラー貼り付け

DEPRECATION WARNING on line 87 of /Users/username/.rbenv/versions/2.x.x/lib/ruby/gems/2.x.x/gems/compass-core-1.0.3/stylesheets/compass/css3/_deprecated-support.scss:
\#{} interpolation near operators will be simplified in a future version of Sass.
To preserve the current behavior, use quotes:

  unquote('"\$moz-"#{\$experimental-support-for-mozilla} "\$webkit-"#{\$experimental-support-for-webkit} "\$opera-"#{$experimental-support-for-opera} "\$microsoft-"#{\$experimental-support-for-microsoft} "\$khtml-"#{\$experimental-support-for-khtml}')

You can use the sass-convert command to automatically fix most cases.

DEPRECATION WARNING on line 92 of /Users/username/.rbenv/versions/2.x.x/lib/ruby/gems/2.x.x/gems/compass-core-1.0.3/stylesheets/compass/css3/_deprecated-support.scss:
\#{} interpolation near operators will be simplified in a future version of Sass.
To preserve the current behavior, use quotes:

  unquote('"\$ie6-"#{\$legacy-support-for-ie6} "\$ie7-"#{\$legacy-support-for-ie7} "\$ie8-"#{$legacy-support-for-ie8}')

You can use the sass-convert command to automatically fix most cases.
「もう助からない」なんて言わせない

#PCがどうにもおかしい。どうすれば・・・
**PCの不調。**しかし、その症状は実に様々です。ネット上の情報だけでは、自分のPCの不調が改善されないこともあります。でも、諦めないで！まずは落ち着いてください。ログインできないような重症でも、データを救出することは可能かもしれません。(実際、ログイン不能状態から全データを救出しました。) この記事で、1人でも多くの方のデータを救出することができれば幸いです。

今回は説明していませんが、先に[Microsoftが公開している回復オプション](https://support.microsoft.com/ja-jp/help/12415)を試してからにしてください。
とにかく急ぐ方は**[こちら](#じゃあpcのos使わなければいいじゃん)**から。

#そう、あれは1年前ーー
それが、悪夢の始まりでした。Windows April 2018 Update （Ver.1803） がリリースされたおよそ2カ月後のある日、突然PCにログイン不能に。エラーコメントから、アップデートのミスであることは分かりましたが・・・

#大丈夫、再インストールすればいいんだよ!
Windowsは、個人ファイルを残した状態で再インストール可能です。じゃあ、これで解決やん。
ってことで実行。

#(´・ω・`; )
まじかよ・・・オプションが出てこない・・・
データが全部吹っ飛ぶらしい。どうしよう。。。

#復元ポイントから復元すればええやん！勝った。(フラグ)
結構時間かかりました。が、、、
エラーを吐いて止まりました。

#どうにかしてログインできれば・・・
ここでOSの仕組みについて適当に説明しておきます。(本当に適当です)
OSは Operating System の略で、PCを動かしているのは、このOSです。
PCは大量のデータを記憶する装置です。そのデータは01の羅列なので、人間に分かるように、OSが人間用に翻訳して、画像として表示したり、動画として再生したりするわけです。
今回は、PC内のOSが上手く動かなくなり、その結果、ログインの段階でエラーを吐いてしまったのです。(OSはPCを動かしていると説明しました。ログインもOSが管理しています。)
ここで重要なポイントがあります。**OS以外の他のデータはたぶん無事**ということです。
つまり、ログインさえできれば、全データアクセス可能、つまり、救出可能になるわけです。

#じゃあ、PCのOS使わなければいいじゃん！
ずばりこれが結論です。外部のOSを読み込んでアクセスします。よく分からないかもしれませんが、下の図を見てもらえれば、そこまで大したことはしていないことが分かってもらえるかと思います。

|![図.png](https://qiita-image-store.s3.amazonaws.com/0/305299/78f866ca-4e74-5fb2-d5cb-631039025447.png)
|:-:|

では、以下やり方です。

#手順と準備
##必要なもの
- バグってないPC1台
- 空のUSB (容量は8GB程度必要かと思われる)
- 救出したいデータが入るだけの容量がある外付けHDD等

##手順
###1. isoファイルを作成
[WinPtchX](https://www.vector.co.jp/soft/dl/winnt/util/se516230.html?a8=OZ2qUZfm4kelDY34mBtVP23TcHY.-29lTB3qHYP1H_pm4k2ePlDQ-GDZSkJTMTD3W_olvN29WZ2qCs00000007693002)を入手します。好きな場所に展開して、isoファイルの作成を開始します。[こちら](http://jisaku-pc.net/hddnavi/winptchx.html)のサイトで詳しく解説されています。ページ中央部に**WinPEイメージの作成に失敗する場合**とありますが、高確率で失敗するので、サイトの指示に従って手動DLしてください。

###2. isoファイルをUSBに書き込む
DVDに焼いてもいいのですが、USBの方が勝手がいいので、USBに書き込む方法を説明します。
[ISO to USB](https://forest.watch.impress.co.jp/library/software/isotousb/)を入手します。手順1で作成したisoファイルを空のUSBに書き込みます。

###3. USBブートで起動
BIOS画面を出し、USBブートを有効にします。メーカーによってやり方が若干違うので、**[使用しているPCのメーカー] BIOS** 等で調べてください。どのメーカーのPCでも、起動させた直後にF1からF12までのいずれかのキーを連打してBIOSを起動させる点は同じです。メニュー名もメーカーにより異なります。注意してください。

USBブートモードを有効にした後、USBをさして、PCを起動させます。これで、USB内に書き込んだisoファイルを使ってPCが起動します。

###4. 頑張る
ここで、必要なデータはすべて救出しましょう。起動後、外付けHDDを差し込んで、F5キーを押して画面を更新すれば、外付けHDDが読み込まれるので、そこへ全部コピーしましょう。

#後は思い切って再インストール
必要なデータをすべて救出した後は、きれいさっぱり再インストールしてしまいましょう。

#注意
今回の方法は、データが消えることを前提として、必要なデータを救出する最終手段です。打つ手がなくなったときだけ使ってください。そもそも、元あったファイルをすべて消して再インストールしなければならない場合以外、使う必要はありません。
はじめてのC++【33日目】

#はじめに
著作権についてのコメントありがとうございました。
気をつけようと思います。
##ロベールのC++
メモリの話は、裏でやっておきます。
###08-03 stringstreamクラス

```stringstream.cpp
#include <iostream>
#include <sstream>

void Add(std::stringstream& sstr, int x, int y){
  sstr.str("");//str関数で文字列を取得しても内部の文字列はそのまま残っているので、いったんクリアにする。
  sstr << x << "+" << y << "=" << (x + y) << std::flush;//文字列を作るだけ

}

int main(){
  std::stringstream sstr;

  Add(sstr, 2, 4);
  std::cout << sstr.str() << std::endl;
  Add(sstr, 4, 8);
  std::cout << sstr.str() << std::endl;
}
```
<img width="486" alt="スクリーンショット 2019-04-03 0.03.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/fc379c4d-a413-9ea9-c663-37d70758b668.png">

```stringstream2.cpp
#include <iostream>
#include <sstream>

int main(){
  std::stringstream sstr("1 2");
  int x;
  int y;

  sstr >> x;//std::cinみたいにsstrからxとyに整数値を取り出している。
  sstr >> y;
  std::cout << x << " + " << y << " = " << (x + y) << std::endl;
}
```
<img width="77" alt="スクリーンショット 2019-04-03 0.13.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/8d6dfbe1-9e82-7e65-070a-d41ceb2bf034.png">

###08-04 ファイルの基本操作
ファイルの操作はゲームの保存するときに使うみたい。

```File1.cpp
#include <iostream>
#include <fstream>
#include <cstdlib>

int main(){
  std::fstream file;//ファイルを扱うためのクラス

  file.open("test.txt", std::ios::out);//ファイルを開くときの関数
  //ファイルを開く操作をしなければファイルを操作できない。
  if(!file.is_open()){//ファイルが正確に開くとtrueが返ってくる。
    return EXIT_FAILURE;
  }

  file << "ファイルに書き込んじゃえ。" << std::endl;//std::coutと同じ感覚で書ける
  file.close();
  //ファイルを開いたら閉じる操作をする。もし閉じ忘れても、fstreamクラスのデストラクタでかってに閉じでくれる。
  //念のために、ファイルは閉じる。
}

```

```test.txt
ファイルに書き込んじゃえ。
```

#終わりに
ファイル操作を行った。
8章はあと50pほどで終わる。9章はtempleteとかいう結構大事そうな単元だ。
おやすみなさい。
istioの設定が各envoyに反映されているかを istioctl proxy-status コマンドを使って確認する

# 概要
`istiio proxy-status` コマンドについて解説します。

## 使いどころ
istioを使っていると、たまに設定が反映されない or 時間がかかる時があります(少なくともv1.0.2までは結構ある)。Istioが悪いのか、それとも自分の設定が間違っているのかわからなくなって頭を抱える方も多いのではないでしょうか？
そこで、本当にPilotから各envoy(istio-proxy)に同期されているんだろうか... という時には、 `istioctl proxy-status` コマンドを使うとxDSが同期されているか確認することができます。

```
$ istioctl proxy-status
PROXY                                                  CDS        LDS        EDS               RDS          PILOT                            VERSION
foo-api-7fffcdggg-7w2ata.foo                           SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-hogehoge             1.0.2
foo-api-7fffcdggg-dc9b4w.foo                           SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-hogehoge             1.0.2
istio-egressgateway-7b46123587-abcde.istio-system      SYNCED     SYNCED     SYNCED (100%)     NOT SENT     istio-pilot-hogehoge             1.0.2
istio-ingressgateway-57f123c456-abcde.istio-system     SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-hogehoge             1.0.2
```

※ proxy-status は `ps` がエイリアスとして設定されていますので、 `istioctl ps` でも同じ結果が返ってきます。
※ xDSはenvoyをコントロールするために必要なDiscovery Serviceのことです。Istioの場合、cluster / listener / endpoint / route のDiscovery Serviceがあります。

## 内部の挙動について

istioctl コマンドのソースコードを読むとわかるのですが、 istio-pilotのdiscoveryコンテナに対して、下記のようなコマンドを実行しています。

```sh
/usr/local/bin/pilot-discovery request GET /debug/syncz
```

`/debug/syncz` というのがistiio-pilotのenvoyのエンドポイントに存在していて、各istio-proxyとxDSがいつ同期したのか、表示してくれます。 `$istioctl proxy-status` はこのエンドポイントのレスポンスを整形・加工して出力しているということです。元の、レスポンスが見たい場合は、下記のようなコマンドを実行するとイメージがしやすいかと思います。

```sh
$ for pilot-pod in `kubectl get po -n istio-system -l istio=pilot -o jsonpath={.items[*].metadata.name}`
> do
> kubectl exec -it ${pilot-pod} -n istio-system -c discovery /usr/local/bin/pilot-discovery request GET /debug/syncz
> done
```

### まとめ

デバッグや監視に利用できそうですね。正直、この辺りのツールまで準備してくれているのはさすがだなと思いました（自分でcontrol plainを作ってこの辺りまで面倒みると思うと果てしないので...）。もし設定が同期されてない場合は、Pilotを再起動してみる等のオペレーションの判断に役立ちそうです。設定がうまくいかない時は使うと幸せになれるかもしれません。
Vue-cli 3 の SPA アプリでサードパーティの API にアクセスするときの webpack と nginx の proxy の設定。

# 前提

* @vue/cli を使って vue-cli 3 で SPA を作ってる。
* サードパーティの API（以下3rd.com/API?a=b）をマッシュアップしたい。
* 3rd.com からキーをもらってアクセスする（以下KEY=HOGE）。

みたいな場合、たまにあると思います。普通に

```javascript
// DANGER
fetch( 'http://3rd.com/API?a=b&KEY=HOGE' )
```

なんてやってしまうと、SPA なのでこの内容は JS にパックされてユーザーの方に渡ってしまいます。ということはもらったキーが世界中に丸見えになってしまいます。
また、CORS でひっかかってしまうことも多いでしょう。

そこで、proxy の出番です。proxy を使ってキーを隠匿して、CORS を回避しましょう。つまり

```javascript
fetch( '/API?a=b' )
```

とすれば OK になるように設定します。



標準的？な開発体制であれば、開発と本番の両方の環境に proxy を設定することになるでしょう。

以下、実際に動くパターンを元に /API を 架空の 3rd.com/API にフォワードするように書き直してて実際にチェックできないので、もしかしたら間違ってる可能性があります。もし間違ってたら教えてください。

# 開発環境

開発時 @vue/cli で作ったアプリは、webpack の devServer の機能を使ってローカルでサービスされます。これに proxy の機能があるので使いましょう。

vue-cli 3 から webpack の設定は、vue.config.js の configureWebpack セクションに書くようになりました。

```vue.config.js
module.exports = {
	configureWebpack	: {
		devServer	: {
			proxy	: {
				'/API'	: {
					target		: 'http://3rd.com'
				,	pathRewrite	: p => p + '&KEY=HOGE'
				}
			}
		}
	}
}
```

```npm run serve``` をやり直すのをお忘れなく！

# 本番環境

本番環境は多種多彩ですが、今回は nginx1.15.10 を nginx.conf で設定する場合を説明します。

http / server セクションに以下の内容を記述します。

```
        location /API {
            set $args $args&KEY=HOGE;
            proxy_pass    http://3rd.com/API;
        }
```

nginx のリロードをお忘れなく！

# 終わりに

架空のサーバーの話になってしまうのが心苦しいのですが、実際に動いてるパラメータを乗せるわけにはいかないのでご容赦ください。
[Amazon WorkSpaces]AmazonLinux2にPostmanインストール

Amazon Linux release 2 (Karoo)

```

# Postmanのインストール
$ sudo wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz
$ sudo tar -xzf postman.tar.gz -C /opt
$ sudo rm postman.tar.gz
$ sudo ln -s /opt/Postman/Postman /usr/bin/postman

# ランチャーに追加(アプリケーションープログラミングーPostMan)
mkdir -p ~/.local/share/applications
cat > ~/.local/share/applications/postman.desktop <<EOL
[Desktop Entry]
Encoding=UTF-8
Name=Postman
Exec=postman
Icon=/opt/Postman/app/resources/app/assets/icon.png
Terminal=false
Type=Application
Categories=Development;
EOL
```

設定後にログオフしてログインし直す必要があります
VBAマクロでファイル移動やリネームができない場合、ファイル名が文字化けしている可能性がある

## 問題

VBAで作ったマクロで以下の処理を行う際にエラーが出る場合、原因としてファイル名が文字化けしていることが考えられます。

- ファイルを移動する
- ファイルをコピーして別のフォルダに保存する
- ファイル名を変更（元のファイル名に文字列を追加する）

## 原因の調査
エクスプローラーでファイル名を確認してみると文字化けはしていないし、ファイル名の変更や移動ができるにも関わらず、マクロによる操作の場合にエラーとなるので原因を探ったところ、どうもVBEでファイル名を取得した際に文字化けが起こり、ファイル操作ができずエラーになっているようでした。

VBEにてDirでファイル名を取得して値を確認すると、文字化けする文字が「?（ハテナマーク）」になっていることがわかります。
ハテナマークはファイル名として使えないので、移動しようとするとエラーになるんですね。

残念ながらOSやExcelに言語パックを追加しても、VBEには適用されないっぽいです。
（確証がないので勘違いかもしれませんが）

## 文字化け回避方法

### そもそも文字化けする可能性のあるファイル名にしない
日本語版Excelであれば、ファイル名が英語or日本語なら問題ないと思います。
私の場合は中国からもエクセルファイルが送られてくる現場だったので、この方法は採用されませんでした。
ならそもそもエクセル申込書をやめｔ（ry）

### コードで回避する
今回は文字化けするファイル数が少なかったので、下記のようなコードで弾いて後で手動でファイル移動することにしました。
なお記載はありませんが、この処理の前にDirでfilenameを取得している前提とします。

```VB
If InStr(filename, "?") < 1 Then
    '文字化けがなければ通常の処理
    
Else
    '文字化けしてた時の処理
    '単にスキップするだけならElse不要

End If
```

すごくシンプルに「filenameに「?」が入っていれば文字化けしているとする」ということにしました。数が少なければこれで良いかなと思います。

数が多ければリネームする処理を入れると思いますが、ファイル名で色々管理している場合はリネームすると面倒なことになるので、やっぱりエクセルを申込書にすｒ（ry）


### 【2019/4/5追記】
いただいたコメントによると、`Scripting.FileSystemObject`を使ってファイル名取得すれば文字化けしなさそうです。
業務を離れてしまってすぐ試せないので確認できていませんが取り急ぎ。


## おわりに
VBEの文字化け対処方法があればご教示ください。
GitLab CE(omnibus)のマイナーバージョンアップ(11.6.2から11.9.4)

# 前置き

自宅サーバのGitLabを最新バージョンにアップデートした時の手順を投稿します。
マイナーバージョンアップなので、特に問題なく終わりました。

- 対象
  - GitLab CE Omunibus
- バージョン
  - アップデート前: 11.6.2
  - アップデート後: 11.9.4(実施日の最新ver)
- マシン環境
  - Ubuntu 16.04.5 LTS
  - 自宅サーバ(利用者1名)

# 実施内容

## GitLabのバックアップ 
マイナーバージョンのアップデートなので、恐らく問題ないだろうと思いつつ、でも念のため実施します。
バックアップ漏れがないように、アップデート直前にバックアップを取ります。

```
gitlab-rake gitlab:backup:create
```

ファイルは`/var/opt/gitlab/backups/`に生成されます。

## パッケージ更新

インストール可能なパッケージ一覧を更新します。

```
apt-get update
```

現在のバージョンと更新可能なバージョンを確認しておきます。

```
## apt-cache policy gitlab-ce
gitlab-ce:
  Installed: 11.6.2-ce.0
  Candidate: 11.9.4-ce.0
```

続いてパッケージを最新に更新します。
自分の場合、「ついでにインストール済みのパッケージも全部更新しよう」と思ったので、upgradeを実施しました(あまりよくないかも)。

```
apt-get upgrade
```

GitLabだけを更新したい場合は以下のように書くことができます。

```
# 最新に更新
apt-get install gitlab-ce

# バージョン指定して更新
apt-get install gitlab-ce=11.9.4-ce.0
```

## GitLabの更新

`/etc/gitlab/gitlab.rb`を表示し、GitLabの設定が間違っていないことを確認します。
今回はマイナーバージョンアップなので全く問題なさそうでした。

続いて以下を実行してGitLab自身を更新します。

```
gitlab-ctl reconfigure
```

reconfigureが完了すると、最後の方に以下の出力がありました。

```
Deprecations:
== Prometheus ==
Detected Prometheus version 1.x. Version 1.x has been deprecated and support will be removed in GitLab version 12.0.
To upgrade to Prometheus 2.x, use `gitlab-ctl prometheus-upgrade` command.
Running this command will migrate all your existing data to format supported by Prometheus 2.x.
This can be a time consuming operation. To skip migrating the data, and instead remove and start fresh, run `gitlab-ctl prometheus-upgrade --skip-data-migration`.
Check https://docs.gitlab.com/omnibus/update/gitlab_11_changes.html#114 for details.
```

Prometheusのバージョンがdeprecated(非推奨)とのことなので、表示された通りにコマンドを実行します。

```
gitlab-ctl prometheus-upgrade
```

## 動作確認

コマンド操作は以上で終了です。
最後にブラウザからGitLabにアクセスし、特に問題ないことが確認できたら更新完了です。

以下はAdmin Areaにアクセスして、バージョンが上がっていることを確認した時のスクリーンショットです。

![gitlab.png](https://qiita-image-store.s3.amazonaws.com/0/231426/876d51d5-d46a-0c64-7b87-c287a73f6e51.png)

# 最後に

とても簡単に作業完了となりました。
OSSで脆弱性の心配とかもあるので、定期的にアップデートするようにしたいですね。
また、まとめてバージョンを上げるよりも、少しずつバージョンを上げていった方がトータルで楽できると思います(以前ver8から10に上げて大変だった経験あり)。
## Clojureでお絵描き~quilの使い方～

Clojureにはquilというプロセッシングをラップしたライブラリーがあります。
quilを使えば、アートを描いたり、関数のグラフを描いたりと、使い方は多様です。

今日は、そんな楽しいライブラリーであるquilをご紹介したいと思います。

### 基本的使い方

quilには

defsketch

というマクロがあり、このマクロ中に必要な情報を書き込むことで
グラフィックスを描画しています。


```Clojure
  (q/defsketch test
    :size [500 500]
    
    :setup (fn  [] (q/background 255)) ;; 背景を白色に設定
    
    :draw (fn [] (q/with-fill [0 0 200]
                   (q/rect 100 100 200 200))　;; (100,100),(200,200)を頂点とする青色の長方形
            ))
```

これで以下のようなグラフィックスが生成されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/328817/a79dec69-607a-b51f-5372-c7038f18268e.png)

### 2D primitives

quilには数多くの関数が用意されていますが、
その中でも二次元の基礎的図形を描画するものを
いくつか紹介します。

|関数　|　アウトプット|
|---|---|
|ellipse |　楕円|
|arc | 円弧|
|line | 直線|

```Clojure
  (q/defsketch test
    :size [500 500 ]
    
    :setup (fn  [] (q/background 255))
    
    :draw (fn []
            (q/with-fill [200 0 0]
              (q/ellipse 100 100 50 50))

            (q/with-fill [0 200 0]
              (q/arc 100 100 300 300  0 1/2))

            ))
````
![ellipse-and-arc.png](https://qiita-image-store.s3.amazonaws.com/0/328817/fbb11c84-ab55-e86c-e8c8-06aeaa582458.png)


適切に関数を作っていくと、全てを一度に
defsketchの中にかくより楽になります。

```Clojure
  (defn draw-circle [x y r fill]
    (q/with-fill fill (q/ellipse x y r r )))

  (defn rand-color [] [(rand-int 255) (rand-int 255) (rand-int 255)])

  (defn rand-circles [] (doseq [i (range 0 500 50)] (draw-circle i i 50 (rand-color))))

  (q/defsketch test
    :size [500 500 ]
    
    :setup (fn  []
             (q/background 255)
             (rand-circles))
```
![rand-circle.png](https://qiita-image-store.s3.amazonaws.com/0/328817/38a3812b-c87a-b64e-1f39-9b242f5c4224.png)


### 図形の移動と回転

with-translation, with-rotationというマクロを使うと、
図形を平行移動・回転させることができます。

translate, rotateという関数もありますが、これらの関数を使うと
直後の図形だけでなく、その後の図形全てを移動させてしまうので
少し使いにくいかもしれません。

以下ではwith-translation, with-rotationを使って図形の移動を
やってみました。

: 長方形を[400 0]だけ平行移動。

```Clojure
  (q/defsketch translation-demo
    :size [500 500]
    :setup (fn []
             (q/rect 0 0 100 100)
             (q/with-translation [400 0] (q/rect 0 0 100 100))))
```

![trans.png](https://qiita-image-store.s3.amazonaws.com/0/328817/0648c0c5-54bf-098d-99a7-c02d71025903.png)


以下では平行移動した長方形を原点中心に少しずつ回転させています。
結果としてトランプのカードを並べたような絵ができました。

```Clojure
  (q/defsketch translation-rotation-demo
    :size [500 500 ]
    
    :setup (fn  []
             (q/background 255)
             
             (doseq [angle (range 0 360 10)]
               (q/with-rotation [(q/radians angle)]
                 (q/with-translation [0 400](q/rect 0 0 100 100))))))

```
![cards.png](https://qiita-image-store.s3.amazonaws.com/0/328817/28d1762b-d1f5-4ea0-0090-26255b7e9504.png)


### まとめ

[quilの公式サイト](http://quil.info/)にはquilで制作された美しいアートが掲載されています。
興味があれば、是非見てみてください。

本日の内容は以上になります。最後までお読みいただきありがとうございました。
ReactとReduxを入門したときに見たリンク集

## React
公式チュートリアル(英語): https://reactjs.org/tutorial/tutorial.html
日本語: https://mae.chab.in/archives/2943

個人的にはローカルに落として実行するのがおすすめ。https://reactjs.org/tutorial/tutorial.html#setup-option-2-local-development-environment

## Redux
オリジナル: https://redux.js.org/basics/basic-tutorial
日本語: https://0-to-1.github.io/redux/

Reactと同じ環境で実行環境できる(https://reactjs.org/tutorial/tutorial.html#setup-option-2-local-development-environment)

BasicとAdvanced両方やる

非同期のあたりが英語が込み入っててわかりずらい。これ見るとわかった。: https://qiita.com/TsutomuNakamura/items/2ded5112ca5ded70e573#redux-promise-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B
TELLOをpythonで動かしてみる

#TELLOとは
![GR004322.jpg](https://qiita-image-store.s3.amazonaws.com/0/353289/77be0c95-2315-c6e1-da18-fff7ae1bd287.jpeg)

Telloとは、手のひらサイズのトイドローンです。
基本的にはスマホのアプリで操作しますが、pythonでも動かすことができるので動かしてみました。

#私の環境
pythonでTELLOを動かしてみる前に、私の環境をご紹介しておきます。

* PC: VAIO Type P(VGN-P50)
* OS: Lubuntu 16.04
* Python 3.6.0
* Terminal: LXTerminal (Lubuntuの標準terminal)
* Tello (Toy Drone)

少々スペックが劣りますが、今後、外などで使う可能性を考慮し、今回はこちらのマシンで動かすことにしてみます。

#公式ドキュメントとpythonファイルのダウンロード
公式の[ドキュメント](https://terra-1-g.djicdn.com/2d4dce68897a46b19fc717f3576b7c6a/Tello%20%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/For%20Tello/Tello%20SDK%20Documentation%20EN_1.3_1122.pdf)と[デモファイル(Tello3.py)](https://terra-1-g.djicdn.com/2d4dce68897a46b19fc717f3576b7c6a/Tello%20%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/Both/Tello3(1).py)をダウンロードします。

#Telloとの接続
TelloとPCの接続はWi-Fi UDP portを介して行います。

> Send Command & Receive Response
> Tello IP: 192.168.10.1 UDP PORT:8889 <<- ->> PC/Mac/Mobile

Telloの電源を入れ、PCからTelloのWifiアクセスポイント(TELLO-XXXX)へ接続します。

接続ができたら、TerminalからTelloにpingを打ってみます。

```
$ ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=255 time=1.17 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=255 time=1.37 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=255 time=4.42 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=255 time=1.22 ms
```

pingが返ってくるようなら接続成功です。

#Telloを操作する

続いて、ダウンロードしたデモファイル(Tello3.py)を実行します。

```
$ python Tello3.py


Tello Python3 Demo.

Tello: command takeoff land flip forward back left right 
       up down cw ccw speed speed?

end -- quit demo.
```

このように表示されたら、操作可能です。

1. `takeoff`と入力すると、`OK`と返ってきてフライトを開始します。
2. `land`と入力すると、`OK`と返ってきて着陸をします。
3. `end`と入力すると、デモを終了します。

その他のコマンドも同様です。
ここまではとっても簡単ですね。

```
takeoff
OK
back
OK
land
OK
end
...
```

#次の展望
デモ用のpythonファイルからTelloを操作できることはわかったので、
次は

* リアルタイム動画をPCに取り込む
* 顔認識させて自動追尾するようにする

とかに挑戦してみたいと思います。
[Ruby] 真偽値を返すメソッドの実装について

Ruby で true / false を返すメソッドの実装について、いくつか書き方があると思ったのでまとめてみた。

## 前提

こんな感じの仕様のメソッドを実装するときのことを考える

```
下記条件を全て満たす場合 "true" を返し、それ以外の場合は "false" を返す、ポイント付与可能かどうかを判定するメソッド
  - ログインユーザーであること
  - ユーザーのステータスコードが "1" であること
```

<条件を整理する>

|logged_in?|user.status_code|結果|
|---|---|---|
|true|1|true|
|true|0|false|
|false|1|false|
|false|0|false|


## 1. 真面目実装

超真面目に実装するとこうなる。こんな書き方をしたのは久しぶりなので、なんだか気持ち悪い。こういう書き方は Ruby だとあまり見ないかも？

```ruby
def pointable?
  if logged_in?
    if user.status_code == '1'
      true
    else
      false
    end
  else
    false
  end
end
```

## 2. 比較演算子

比較演算子を使って実装する。

```ruby
def pointable?
  logged_in? && user.status_code == '1'
end
```

※ Ruby 触り始めは、こんな風に書いていたなー。

```ruby
def pointable?
  (logged_in? && user.status_code == '1') ? true : false
end
```

## 3. ガード節

- 全て満たす場合に "true" なので、ひとつでも "false" になる条件があったらその時点で return する
- 結構よく見る
- ネストが浅くなるので読みやすい
- 正常系とエラー系の処理が別れていて読みやすい
- 最後の "true" を書き忘れることがあるが（実際この前書き忘れた）、テストをちゃんと書いていれば気付けるはず

```ruby
def pointable?
  return false unless logged_in?
  return false if user.status_code != '1'
  true
end
```

※ if 使うか unless 使うかは好みの問題だと思うけど結構迷う。個人的には下記の2択だったら、前者の方が分かりやすくて好き。

```ruby
# false を返す、もし user.status_code が '1' でないならば
return false if user.status_code != '1'

# false を返す、そうじゃないなら user.status_code が '1' である
return false unless user.status_code == '1'
```

## 4. all? メソッドを使う

こんなのも思いついたけど、どうなんでしょう。

```ruby
def pointable?
  [logged_in?, user.status_code == '1'].all?
end
```

## まとめ

同じ仕様のメソッドでも、実装の仕方がいくつもあるので考えてみると楽しいです。
個人的には、`2. 比較演算子` か `3. ガード節` の書き方をよく見るし読みやすくて好きなのですが、どうなんでしょう。
jQueryの便利な使い方①~resize~

今回は、コーディングの強い味方、jQueryの便利な使い方を見ていきます。
jQueryの環境構築は思っているものとさせて頂きます。

#resize
resizeはjQueryのメソッドです。
役目としては、ウィンドウのサイズが変わった時に、そのサイズを取得するというものです。
何のことだか、という感じですよね。

使い方は、


```javascript:hello.html

<script>

jQuery("window").resize(function(){

//widthやheightの値を得る処理
    var h = $('window').height();
    var w = $('window').width();

//上記の変数を代入して、htmlコードやcssコードと連動させる
　　

});

</script>
```

という感じです。
resize()の中身は関数です。
また、取得対象は常に「window」になります。

例えば、position:fixedのleftとtopを調整し、画面の真ん中にモーダルを配置したい時、transformなどを利用すると思いますが、jQueryのresizeでも簡単にできちゃいます。

モーダルのwidthとheightを取得して、windowのwidthとheightからそれらを引き、２で割るとちょうど真ん中に配置されます。

画面がリサイズされるのに連動して、常に真ん中の位置をモーダルがキープできるので便利です。


ぜひ、使ってみてくださいね。
GitHub で fork 元のリポジトリが削除されたり非公開になったりするとどうなるのか

この記事は [What happens to forks when a repository is deleted or changes visibility? - GitHub Help](https://help.github.com/en/articles/what-happens-to-forks-when-a-repository-is-deleted-or-changes-visibility) の日本語訳まとめです。

# TL;DR

#### **パブリックリポジトリ　→　fork 元が削除されても fork は消えない**
#### **プライベートリポジトリ　→　fork 元が削除されると fork はすべて消える**

# パブリックリポジトリについて

パブリックリポジトリが削除されたり、非公開にされた場合：

- fork は削除されない
- 既存の fork のうちどれか1つが新しい fork 元になり、残りのリポジトリからの Pull Request はこの選ばれたリポジトリに行くようになる

# プライベートリポジトリについて

プライベートリポジトリが削除されたり、fork したユーザーが fork 元へのアクセス権限を失った場合：

- fork はすべて削除される
- ただしローカルクローンは保持される

逆にプライベートリポジトリが公開された場合：

- fork は自動的には公開されない
- fork はそれぞれ単独のリポジトリになる

*cf.* fork 権限について
https://help.github.com/en/articles/allowing-people-to-fork-a-private-repository-owned-by-your-organization
https://help.github.com/en/articles/allowing-people-to-fork-private-repositories-in-your-organization
TableViewCellのスタイルについて

Swiftで開発をしていて、いざビルドするとstoryboardでエラーが発生しました。
解決に少し時間がかかったので、まとめたいと思います。

###①事象
ビルドすると失敗していて、エラーをみるとソースコードではないところでエラーが発生しているようでした

<img width="354" alt="スクリーンショット 2019-04-02 23.44.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/239560/72d612fb-3609-f85b-d88c-e13dd533a891.png">

TableView配下のTableViewCellに置いたラベルやボタン、イメージ全てで同様の事象が起こっていました
<img width="275" alt="スクリーンショット 2019-04-02 23.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/239560/be5f6394-d3f6-6b11-6d7d-2b057c56cc14.png">

###②解決法

よく見ると、TableViewのContentがDynamic Prototypesに設定されていました。

<img width="299" alt="スクリーンショット 2019-04-02 23.54.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/239560/aa1740ac-f2b0-1088-ef9f-63b9a5791526.png">

Dynamic Prototypesはセルを動的に作る設定で、ソースコードで設定は可能ですが、**storyboardからは設定できない**ようです。
それが原因で、配下のラベルやボタン、イメージがうまく設定できていませんでした。
storyboardで設定したい場合は、static Cellsに設定を変更しないといけません。

<img width="297" alt="スクリーンショット 2019-04-03 0.01.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/239560/29247942-3a88-efbd-97f6-5760f2e606a7.png">

設定を変更すると配下の資材のエラーが解消されました。

###③まとめ
storyboardで開発すると、原因を突き止めるのに細かな設定を確認しないといけない場合があるので時間がかかる可能性がある一方、動的にセルを作るとその分、実装量が増えます。
場合に合わせて、開発スタイルを選ばないといけないと思いました。
※今回はセルの個数が変わらない想定だったので、storyboardで開発を行いました。
セルの個数が増える場合は動的に作ったほうがいいと思いました。

###参照サイト
Stack Overflow  --  https://stackoverflow.com/questions/26561461/outlets-cannot-be-connected-to-repeating-content-ios
MC/DCのフェイクバージョン

ここで告白しますが、私は私のクライアントを欺いたことあります。

もちろん悪意を持ってだまさではありません。テスト設計技法の中で、MC/ DCが難しく、これはツールを使用して、ほとんど実行することを見せようした心が急みるMC/DCを「実装ふり」するロジックを作りました。



原理は難しくなかったんです。

1.各条件節の部分を抽出する。

2.条件節の構成パターンを分析する。

3.構成パターンに合わせて、MC/DCの結果をパターン別に**事前に保存して**合う結果を探し、変数だけ変えて代入してMC/DCの結果を仕上げる。

4.条件節ごとに見つかったMC/DC結果をOne-Wayの組み合わせで最終仕上げ。



4番は前にある程度の努力して実装されたので、2,3回の実装をすると「実装ふり」することを作ることができるかなとおもいました。

だから、実際に作ったのがpyinstallerを利用したApp（PC、Mac）版であり、これをgithubに上げました。ソースコードははずかしくて除きました。 [^1]



この方法の限界は...皆さんもすぐ予想できるかもしれませんが、さまざまな条件のパターンのすべてのMC/DCの組み合わせの結果を全部保存して持つのは不可能です。制限をかけなければなりません。

だから、私は条件構造から体調3個まで可能なもので制限を置いた。すなわち

> A and B
> A or B

の各MC/DCの結果と

> A and B and C
> A and B or C
> A or B and C
> A or B or C

の各MC/DCの結果を事前に保存していて、このパターンの中のマッチングがされると、MC/DCの結果を返しそうでなければただSkipをする…そんなちゃちなロジックでした。 [^2]



当時には、MC/DCをプログラミングで具現するロジックはないと思って、ほとんどのテスト設計ツールは、このようにMC/DCの計算を行うこと誤判に陥っていました。しかし、これは、次のインド系の人が作ったツールを見ながら間違っていることはすぐにわかりました。



http://aerotools.blogspot.com

こちのツールを実行をさせてみると、logファイルが残るのに、Python + wxPythonで作ったぽいです。このプログラムは、単一の条件のみの分析が可能ですが、条件節内のコンディションの数の制約なしに、MC/DCの結果を計算してくれます。何かプログラミングでこれを具現するロジックがあることを示しています。この時から、プログラミング的にMC/DCを実装するためのロジックの実装に没頭していたようだ。 [^3]



結果を出すために、上記Fake MC/DCアプリを持ってシュード・コードを作成してくることができるMC/DCケースを適用し、結果はどのくらい出てきて終えることができました。私はガイドをするとき、シュード・コードの条件節のコンディションの数は三つ以上しないようにしましたから...

今では、私の結果を書いてくれたクライアントには申し訳ない気持ちだが、当時の無謀でした、このような試みが後に発展を牽引していただろうかと思われます。






[^1]: もちろん、今はすべて削除された状態だ。
[^2]: 括弧がある場合は、順序を変更した。たとえばA and（B or C）はB or C and Aに変更して、パターンを計算した。
[^3]: 後で別の投稿を書きますが、結局はロジックを見つけて完成した。このロジックが反映されたバージョンがanalyzingcontext.comに反映されている。
railsでtwitter api ログイン認証を使おうとしたらエラー400でたのでメモっとく

#はじめに開発環境は
mac os x
ruby '2.5.2'
'rails', '~> 5.2.3' 
#####を使っています。

#何をしたいか
railsでtwitterログイン認証をしたい

#どのgemを使ったか?
gem 'omniauth'
gem 'omniauth-twitter'

#作業したこと


``` /.env
API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
API_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxx"
```

```config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV["API_KEY"], ENV["API_SECRET"]
 end
```

を書いて rails s でrails サーバー起動したら 400が出た

#どうやって直したか
400のエラーはそもそもENVで
#####ENV["API_KEY"], ENV["API_SECRET"]
が取れていないことが問題らしいなのでこれを書いた。

``` /Gemfile.
gem 'omniauth'
gem 'omniauth-twitter'
```
でbundle installしたらenvが正常に動作して、エラーが消えた

#終わり
通知設定の変更を受け取る(Android 9以上)

ユーザーがアプリの通知を許可しているかどうかをサーバーへ伝えておきたいと思ったときに調べたメモ

アプリがフォアグラウンド時には許可しているかわかるけど、バックグラウンドで通知設定を変更したときはわからないためシステムから通知は来ないのかと調べました。

NotificationManagerにそれらしきActionが定義されていましたがAPI Level 28から...


[ACTION_APP_BLOCK_STATE_CHANGED](https://developer.android.com/reference/android/app/NotificationManager.html#ACTION_APP_BLOCK_STATE_CHANGED)

[ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED](https://developer.android.com/reference/android/app/NotificationManager.html#ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED)

実際にBroadcastReceiverを作ってAndroidManifestに追加することで、Actionを受信することができました。
アリババクラウドのBaaS-Hyperledger Fabric(二)

[前回](https://qiita.com/lcj/items/c87352b9f993d7be7cef)は、アリババクラウドのBaaSで構築したHyperledger fabric環境のイメージを共有しました。
今回、環境構築流れと利用制限を説明致します。

## BaaS利用流れ
###### 全ステップ
|ステップ| 項目        |
|:------: |:------------|
| 1       | 組織の作成   |
| 2       | コンソーシアムの作成|
| 3       | 組織の誘い   |
| 4       | チャネルの作成|
| 5       | chaincodeのインストール|
| 6       | ブロックチェーンにアクセス(ユーザの作成とSDKの利用) |
| 7       | ブロックチェーンネットワークの管理 |

###### 環境構築モード
●スピードモード
　ステップ1～4はワンボタンで作ります。
●標準モード
　全ステップを一つずつにします。

###### 作成されたコンソーシアムチェーンのイメージ
●1～7は、上記の各ステップです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/49dd05a9-1427-a555-870e-a82754e63e73.png)

## 制限
###### BaaSの利用制限

|項目| 内容        |
|:------: |:------------|
| クラウドリソースへのアクセス| Baasサービスのセキュリティと安定性を守るため、<br>ユーザーはECS、Kubernetesクラスタ、Dockerコンテナ、<br>NASファイルシステム、クラウドディスクなどの基盤とするクラウドリソースに直接にアクセスすることはできません。   |
| Hyperledger Fabricバージョン | 現在は1.4です。|
| TPS       | Basic バージョン: 最大300TPS <br>Enterprises バージョン         : 最大2000TPS<br>Enterprises safety バージョン: 最大2300TPS<br>   |
| ノード数       | Orderer→三つ   <br> Kafka→四つ <br>   ZooKeeper→三つ<br>※カスタマイズできません|
| オープションの変更| 現在は、ブロック作成時間、ブロックに含まれるトランザクションの数などのオプションの変更ができません。<br>未来は徐々にオープンするようにします。|
| 外部ノードとの連携       | アリババクラウド以外のノードと連携できません。 |

## その他
以下のイベントで詳しく説明を行います
https://internetchamp.connpass.com/event/123995/

以上
console.logを目立たせる方法【色をつけよう】

## console.logを目立たせる方法【色をつけよう】
JavaScriptの`console.log`が多くなってくると、いくつかのログを目立たせたくなる時があると思います。
その時に有効なのが、色をつけるということです。
`console.log('%chello', 'color: #f00')`
<img src="https://toshioakaneya.com/wp-content/uploads/2019/04/Screen-Shot-2019-04-02-at-23.55.08.png">
`%c`を使うことで色をつけることができます。
ぜひ活用して下さい。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
MacOS起動時のPostgres自動起動を停止する

# 開発環境のPostgresコンテナ化に伴い、<br>ポート重複を起こすためOS起動時の自動起動を停止する

Laradockで環境構築していたとき、以下のようなエラーが発生。
どうもポート番号がすでに使われている様子。

```bash:laradock
docker-compose up -d postgres

Starting laradock_postgres_1         ... error

ERROR: for postgres  Cannot start service postgres: driver failed programming external connectivity on endpoint laradock_postgres_1 : 
Error starting userland proxy: Bind for 0.0.0.0:5432 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.

```

自分では起動した覚えがないのでポートの状況を以下のコマンドで確認（postgresのデフォルトは5432）

```bash:laradock
$ sudo lsof -i:5432
Password:
COMMAND  PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres  72 postgres    4u  IPv6 0xe5f7d69b0bace43b      0t0  TCP *:postgresql (LISTEN)
postgres  72 postgres    5u  IPv4 0xe5f7d69b0bad50a3      0t0  TCP *:postgresql (LISTEN)

```

停止しておく。

```bash
# 上で確認したPIDを指定しプロセスをkill
$ sudo kill 72
```
OS起動時の自動起動プロセスを以下のコマンドで検索

```bash
#大量に表示されるのでPIDでgrepする
$ sudo launchctl list | grep 72
72      0       com.edb.launchd.postgresql-11 # これが原因
272     0       com.apple.colorsyncd
```
自動起動ファイルの格納先はいくつかあり今回は以下のパスに格納されていた。
/Library/LaunchDaemons/

以下のコマンドで自動起動されなくなる。
内部的には対象ファイルの中にDisbledの記述を追加している。

```bash
$ sudo launchctl unload -w /Library/LaunchDaemons/com.edb.launchd.postgresql-11.plist
```

再起動してpostgresが立ち上がってなければ完了。

```bash
$ sudo lsof -i:5432
```
IntelliJ IDEAの日本語化

### Pleiades日本語化プラグインのダウンロード
[こちら](http://mergedoc.osdn.jp/#pleiades.html#PLUGIN)からクリックして対象の使用しているOSを選択する

pleiades-win.zipがダウンロードされたら解凍し、中にあるsetup.exeを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/262e5350-4452-dd3d-5db7-8450764bc636.png)

### 日本語化のセットアップ
setup.exeを選択したら以下の画面が表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/51dbda47-1012-ffa3-ec69-04ca15e8f762.png)

「選択...」をクリックして日本語化するIntelliJ IDEAを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/20710d22-5cb9-9ece-453c-96d80425bfb8.png)

日本語化をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/cf64ee1a-ca2e-12e5-2481-dd26f014f37e.png)

以下のメッセージが表示されたら完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/63b436c1-5ee4-9f8b-6cfc-ebad6d4d480f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/519ecab1-8440-9eba-1e45-bf1d16f213e3.png)

### 確認
開いて日本語化されているのを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/1533fc42-1f51-68d6-2344-de005abb372a.png)
文系大学生が1年半プログラミングを独学して新卒エンジニアとして就職するまで~3-6ヶ月目（機械学習）編~

前回、
[文系大学生が1年半プログラミングを独学して新卒エンジニアとして就職するまで~0~3ヶ月目編~](https://qiita.com/wjtnk/items/ec624ddd2b9bb0f03a62)
として、主に独学で勉強したての人に向けて記事を書いたのですが、今回は

**・webサービス作ったけど、次に何をしたらいいかわからない**
**・「機械学習やってます」とドヤりたい（数学できないけど）**

という人へ向けて書きたいと思います。

##webサービス作成の次
一通りwebサービスを作るプロセスを体験した僕は、次にpythonで機械学習をやってみることにしました。

「何か他のことやりたいけどやることないな〜」って人にはおすすめです。

理由は、
・**プログラミング言語間での違いや類似点**
・**webサービス作成以外でできること**
・**ライブラリ*の便利さ**
とかが理解できるからです。
＊pythonには機械学習をやりやすくするために、たくさんのライブラリ(一からコードを実装しなくても、目的を達成させることができるためのツール)が揃っています。
以下のおすすめ教材に出てくるscikit-learnやtensorflowもそんなライブラリの一部です。

 まあ、つまり、

**プログラミングってこんなこともできるんだな**

ってことを知っておこう。ってことです

オススメは、
動画学習サービスudemyの以下2つの動画
・[【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門](https://www.udemy.com/optworks_1/learn/v4/content)

・[Pythonで機械学習：scikit-learnで学ぶ識別入門](https://www.udemy.com/python-scikit-learn/learn/v4/content)

と、以下の本
・[Pythonではじめる機械学習-―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎](https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E2%80%95scikit-learn%E3%81%A7%E5%AD%A6%E3%81%B6%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-Andreas-C-Muller/dp/4873117984)

です。

正直どれで学んでもいいと思うのですが、どの学習教材も

**・難しい数学が出てこない**
**・機械学習に必要なデータの整形（pandasやnumpyというライブラリを使って）から説明しているので、体系的に効率よく学べる**

という点がよくて、逆に、理系で数学（線形代数、微分積分、確率など）バリバリできますって人は確実に物足りないです。
*数学最強！の人は、「AI、機械学習に関する論文読んで、それをコードに落とし込む」みたいなことをやったほうがいいそうです。
詳しくは知りません、すいません

**webサービス作ったけど、次に何をしたらいいかわからない**みたいな人は、「機械学習エンジニアになるんだ！！」って意気込みよりもむしろ、上記で述べた

・**プログラミング言語間での違いや類似点**
・**webサービス以外でできること**
・**ライブラリの便利さ**

を手軽に知り、流行りに少しでも乗っかるつもりで、
「とりあえず機会学習をやってみる」程度でいいと思います。

##いいことあった

pythonのライブラリを使えば機械学習の計算自体は、データを突っ込むだけで、勝手にしてくれるのですが、
計算って機械学習の一部で、大事なのは**「データを綺麗に揃えること」**だそうです。
つまり、

**1,データを綺麗に整えて**
(綺麗に整ったデータ)を
**2,機械学習のモデルに突っ込む**
って形なんですが、

**1,データを綺麗に整える**

は機械学習でなくても役にたちます。

大学時代、統計のゼミだったのですが、論文に使うのデータ作成を
pandas（データの整形に使うライブラリ）を使ったところ、一瞬で終わったので、班のみんなから感謝されました。

たぶん、班のみんなは今頃忘れていますが。

データの整形は、論文、仕事の場面で使うことが多いと思うので、意外と役にたつ場面があると思います。

excel使うより、python使う方がかっこいい気がするし。


##まとめ
以上のようなことは
**webサービス作ったけど、次に何をしたらいいかわからない**みたいな人はやってみて損はないと思います。

ただ、「早くプロになるんだ！！！」「webエンジニアとして力をつけたい」という人は、そんなことやらずに、
インターンでも行って実務経験積んだ方がいいと思います。。。

みてる人多ければ、
webサービス作ったけど、次に何をしたらいいかわからない人向けに、
**「スクレイピング、クローラー作成のススメ編」**
**「就活でどんなことをしたか」**

というのも書こうと思いますんで、いいねでも、コメントでもくれれば嬉しいです！
rust-mode/lsp-mode/rlsでclippyを使いたい

以下のバージョンで確認しています。

- Emacs 26.1
  - rust-mode 20190304.1336
  - lsp-mode 20190328.2018
- Rust stable
  - rls 1.33.0
  - cargo-clippy 0.0.212

## rlsの設定項目

rlsは設定を有効にすることで、診断にclippyを含めることができます。

`clippy_preference`という設定項目があります。
デフォルトの値は`"opt-in"`で、コードに`#![warn(clippy::all)]`など明記している時のみ有効です。
この値を`"on"`に変更することで、常時有効になります。
逆に無効にしたい時は`"off"`を指定します。

`clippy_preference`など設定の項目は、READMEの[configurationの節](https://github.com/rust-lang/rls/blob/master/README.md#configuration)で確認できます。

## 自前のLSPクライアントを定義する

Emacsでrlsの設定を変更するために、`clippy_preference`を有効にしたLSPクライアントを定義、登録しました。

`init.el`には以下のように書きます。

```emacs-lisp
(use-package lsp-mode
  :commands lsp
  :config
  (lsp-register-client
   (make-lsp-client
    :new-connection (lsp-stdio-connection '("rls"))
    :major-modes '(rust-mode)
    :priority 0
    :server-id 'myrls
    :initialized-fn (lambda (workspace)
                      (with-lsp-workspace workspace (lsp--set-configuration `(:rust (:clippy_preference "on")))))
    :notification-handlers (lsp-ht ("window/progress" 'lsp-clients--rust-window-progress)))))

```
[lsp-mode/lsp-clients.el](https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-clients.el)のLSPクライアントの定義を参考にしました。
`:initialized-fn ...`が、rlsと設定のなんやかんやをやってくれる部分です。既存のRust向けLSPクライアントより優先して自前のを使ってもらうよう、`:priority 0`としています。

ちなみにですが、PythonやGo向けにはLSPサーバ設定用の値が定義されており、`custom-set-variables`しておけば、後はよしなにやってくれるようになっています。
他の言語向けも追々同様になるのではないでしょうか……なってくれるといいなあ……

## その他の選択肢

[rustic](https://github.com/brotzeit/rustic)というrust-modeのフォークがあります。
rusticはrustic-clippyというflycheckバックエンドをもっており、吊るしでclippyが使えます。
ローディングをつくってみた　1

##まえがき
コーディングを主で対応するようになって1年ほどの新米コーダーです。
自分なりの勉強や改善を備忘録として記録してます。
##実装
[ローディングをつくってみた　1](https://codepen.io/itamkia/pen/WWvJze)
##使用バージョン
```html:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
[初歩ミス]AWSのデータ作成時にはリージョンに気をつけよう

## 概要
作成時のリージョンには気をつけようという戒め(?)です。
AWSにおいてGUIで作成したデータが、CUI([AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html))で確認するとデータが無くて焦りました。
すごい初歩的なミスですがつまづいたので忘備録として。

## 解決策

それぞれの**リージョン**を確認してください。
※**リージョン**…地域や用途に紐付いたAWSのデータセンターの集合。

#### GUIのリージョン
右上のバーに表示されているリージョンを確認する。
適切でなければプルダウンリストから選択する。
<img width="1143" alt="スクリーンショット 2019-04-02 22.55.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/140953/9566fd08-5d02-23eb-8298-b8be4b21e921.png">

#### CUIのリージョン

```bash
$ aws configure
```

のコマンドを入力して、**Default region name**がGUIのリージョンと一致しているか確認する。
なっていなければ設定する。
東京は**ap-northeast-1**です。
参考：[AWS のリージョンとエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)

<img width="569" alt="スクリーンショット 2019-04-02 22.46.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/140953/facdd1f0-5479-bd9c-5489-909ba432e5a3.png">

以上です。

## 試行錯誤歴

ここから先はあんまり読む価値ないです。笑
[これ](https://dev.classmethod.jp/cloud/aws/kinesis-streams-to-firehose-direct/)をやっててつまづきました。
AWS Kinesis Data Streamでストリームを作成後、AWS cliに移動してリスト表示してみる。

```bash
$ aws kinesis list-streams
{
    "StreamNames": []
}
```

（あれー、なぜ何も無い？とりあえずput-recordしてみよう。。）

```bash
$ aws kinesis put-record --stream-name test-stream  --partition-key 123 --data testdata
An error occurred (ResourceNotFoundException) when calling the PutRecord operation: Stream test-stream under account 204418998910 not found.
```

（怒られた。。）

しばらくググって色々探してみると・・・リージョン怪しい？
でもCLIの設定ちゃんとしたしなぁ。。。ん？


<img width="1145" alt="スクリーンショット 2019-04-02 23.14.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/140953/5eb37f01-7c6d-59f9-9148-68d1bd8b1382.png">

**バージニア北部？？****どこやねんこれ**

再作成するのも面倒なので、AWS CLIのコマンドオプション```--reasion```でバージニア北部を指定して実行。

```bash
$ aws --region us-east-1 kinesis list-streams
{
    "StreamNames": [
        "test-stream"
    ]
}
```

無事表示されました。

おしまい。

## 最後に
全然関係ないけどコマンドラインのキーバインド調べてたらこういうの見つけて便利でした。
[テキスト入力が死ぬほどはかどるMacショートカットキー15個](https://www.find-job.net/startup/mac-shortcut)
メモ帳とかでも使える・・・知らなかった。

記事に間違いや不明点があれば遠慮なくご指摘ください。
pythonでAtCoder -ABC005-

# 対象
- AtCoder初心者（緑よりもランクが下の人）
- pythonがそれなりにかける人
- 数学やプログラミングに対する深い理解を持っていない人
    - Ex) DP, 深さ優先探索, メモ化再帰の実装ができない

# 動機
AtCoderは全ての問題に対して解説スライドが存在するが
解説をみて何となく理論を理解しても独力で実装ができない場合が多かった。

他の提出を見ても親切に解説コメントがついている回答はあまり存在せず、理解を実装に落とすことに苦労したため、簡単にでも解説がある回答はないものかと思い立ったことが動機である。

同様の苦労をしている人のためにも、稚拙なコードではあるが何らかの参考になればと思い
私の回答とそれに対する簡単なコメントを付与したコードをアップロードする。

# 実行環境
- python3



# A
```python
x, y = map(int, input().split(' '))
print(int(y/x))
```
python3の割り算は切り捨てではなくfloatで行われるのでintにキャストする。
あるいは切り捨て除算演算子`//`を使う。

# B
```python
N = int(input())
print(min([int(input()) for _ in range(N)]))
```
pythonのfor文は遅いので高速化のためにリスト内包表記が用いられる場合がある。

# C
```python
T = int(input())
N = int(input())
A = list(map(int, input().split(' ')))
M = int(input())
B = list(map(int, input().split(' ')))

flg = True
# 各お客さんに対し
for b in B:
    valid = []
    # 各たこ焼きに対し
    for i, a in enumerate(A):
        # 有効なたこ焼きがあれば、たこ焼きを取り除く
        if b - T <= a <= b:
            valid.append(a)
            A.pop(i)
            break
    # 有効なたこ焼きがなければ即終了
    if len(valid) == 0:
        flg = False
        break
print('yes' if flg else 'no')
```

# D

```python
# 入力を受け取る
N = int(input())
D = [list(map(int, input().split(' '))) for _ in range(N)]
Q = int(input())
P = [int(input()) for _ in range(Q)]

# 右下まで使う長方形を全通り列挙
S_BR = [[0] * N for _ in range(N)]
for i in range(N):
    for j in range(N):
        # 長方形の美味しさを計算
        for x in range(i, N):
            for y in range(j, N):
                S_BR[i][j] += D[x][y]

# 各長方形を全通り列挙
S = [0] * N * N
for i in range(N):
    for j in range(N):
        for x in range(i+1, N+1):
            for y in range(j+1, N+1):
                # 美味しさを計算
                # 左上起点の四角形 - 右上起点の四角形 - 左下起点の四角形 + 右下起点の四角形
                if y < N and x < N:
                    s = S_BR[i][j]-S_BR[i][y]-S_BR[x][j]+S_BR[x][y]
                elif y >= N and x >= N:
                    s = S_BR[i][j]
                elif y >= N:
                    s = S_BR[i][j]-S_BR[x][j]
                elif x >= N:
                    s = S_BR[i][j]-S_BR[i][y]
                else:
                    raise RuntimeError
                S[(x-i)*(y-j)-1] = max(S[(x-i)*(y-j)-1], s)

# nとn-1の美味しさを比べn-1の方が美味しい場合はnの美味しさを上書き
for i in range(1, len(S)):
    S[i] = max(S[i-1], S[i])

# 出力
[print(S[p-1]) for p in P]

```

素直に計算を行うとfor文のネストがものすごいことになり時間切れになってしまうので、四角形の内部の和を高速に求めるための工夫が必要。

右下を必ず含む長方形さえ計算してしまえばあとは組み合わせで表現ができることが肝。

# 終わりに

ざっくり説明でした。
ABC全問投稿を目指すのでよろしくお願いします。
Salesforceの開発中に良く忘れるコードの備忘録

# 1. Map\<Id, List\<sObject>>の使い方
Mapに入れてるListの取り出し方とかputの仕方とかを良く忘れるのでメモ。

```java:
Map<Id, List<sObject>> map = new Map<Id, List<sObject>>();
for (sObject s : newObjs) {
    String key = s.Id;
    if (!map.containsKey(key)) map.put(key, new List<sObject>());
    map.get(key).add(s);
}​
```

# 2. バッチ実行中にカウントデータを引き継ぎたい
うっかり忘れてインスタンス変数が毎度リセットされてしまってはまることがある。
Database.Statefulを忘れてはいけない（戒め）。

```java:
global class batchName implements Database.Batchable<sObject> , Database.Stateful {
    private Integer errCount;
}
```

# 3. 特定の権限がないユーザで実行してエラー
with sharingでシステム管理者以外のユーザで実行してから不具合に気が付くことがある。
共有設定回りはwith sharingにするかwithout sharingにするかきちんと考える。
Spring'19からは[Inherited Sharing](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm)も使用可能に。

# 4. トリガの中で入力チェックする
Trigger.isBeforeでaddErrorするとエラーにできる。

```java
for (sObject s : Trigger.new) {
    s.addError('errorMessage');
}
```

プロセスビルダーと相性が悪いので設計はきっちりと。


# 5. VFのApexタグを使用している要素のIdの取得
要素の順番で":"区切りでIdが設定されるので後方一致で検索すると取得でききる。

```javascript
$("input[id$='idName']")
```
apex:repeatしている場合、Idの前に項番が付く（0:idName、1:idName、2:idName～）。
覚えておくとjavascriptで処理をするときにたまに役立つ。

# 6. Lightningコンポーネントの表示切替とか
フラグの切り替えとかを手なりでsetCallbackの後ろに書いたりするとCallbackの前に呼ばれて意図しない動きになるので注意が必要。ちゃんと処理の順番を考える。

# 7.クエリに必要な項目の全取得
オブジェクトのスキーマ情報を取得して全項目をクエリに含めてreturnする。
親子やサブクエリが作りたい場合はとりあえず第２引数で渡す形に。

```java
public static String getQueryString(String objectName) {
    return getQueryString(objectName, new List<String> ());
}

public static String getQueryString(String objectName, List<String> addColumns) {
    String fields = '';
    String comma = '';

    // Fieldマップ取得
    Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get(objectName).getDescribe().fields.getMap();
    for(Schema.SObjectField item : fieldMap.values()) {
        fields += comma + item.getDescribe().getName();
        comma = ',';
    }

    // 追加項目を設定
    for (String item : addColumns) { fields += comma + item; }

    return 'SELECT ' + fields + ' FROM ' + objectName;
}
```
権限とか意識するなら[こちら](https://qiita.com/comefigo/items/74e67a3d191ba7f96ff1)の記事がきれいでした。


これからも忘れては調べというのを繰り返す気がするので何度も忘れるようなものはメモしたいところ。