OmniAICreator/Qiita-1.07M huggingface dataset:
picoCTF 2019 vault-door-4 - Points: 250

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c6caf2bf-c317-6c0c-b4d1-8dd83026d8a8.png)

#解いてみた

問題のjavaファイルを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8d785135-3ffd-bea9-cc29-7f44c09e13e7.png)

checkPassword()と一緒の文字がフラグになってるようです。

見た感じ、33行目は10進数、34行目は16進数、35行目は8進数、36行目はそのまま？ぽいです。
cyberchefを使って変換してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/df2cbf3b-a200-3c43-f311-f39f3f866a8c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a62a837c-1336-d382-170d-711acb1cacee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0cfe36c3-4088-8b3e-6bda-0be88adc9f33.png)

これらをつなげると正解になります。
16進数だけutf16だったのなぜ？
【Python】文字列を反転させる方法

## サンプルコード

```python
# 反転させたい文字列
str = '12345'

# 文字列[::-1]とすれば反転できる
rslt = str[::-1]
print(rslt)
# => '54321'
```

## 参考

- [Python で文字列反転 \- 似非プログラマの覚え書き](https://redcat-prog.hatenadiary.org/entry/20111104/1320395840)
AWS Cloud9でThird-party cookies disabledと出た場合

AWSのCloud9にて以下のエラーが発生
<img width="509" alt="スクリーンショット 2019-11-21 21.45.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530674/83335371-b7a5-c3a9-04cb-b057dea4e51c.png">

調べた結果safariの環境設定から「サイト越えトラッキングを防ぐ」のチェックを外すことで対処可能とあったが結果は変わらず。。。

<img width="828" alt="スクリーンショット 2019-11-21 22.26.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530674/09af4d22-b7cd-aa5e-6e6b-38b744695136.png">

ブラウザの再起動も行なったが駄目だったのでパソコン自体を再起動したら解決。

２時間ぐらいハマったよー
Rails 5 kaminari エラー undefined method `total_pages' の解決方法

#kaminariを使ったときの undefined method `total_pages' の解決方法
before

```films_controller.rb
def search
  @searched_films = Film.search(params[:search])
end
```

after

```films_controller.rb
def search
  @searched_films = Film.search(params[:search])
  @searched_films = @searched_films.page(params[:page])
end
```

#参考
https://teratail.com/questions/63813
rails javascript/jqueryの実装　単語編

railsの使い方の次の段階で
javascriptとjqueryの実装を書いて行きます。

# Ajax(非同期通信)
Ajax（エイジャックス）と呼ばれます。
非同期通信は英語で"Asynchronous JavaScript + XML"と表現され、略された呼び方です。

リクエスト後にレスポンスが帰ってきた際、ブラウザが再読み込みされること無く通信が行われる通信方法です。

## 非同期通信の実装ポイント

### ①　非同期通信ではJavaScriptを利用してリクエストを行う
　　　　リクエストに対してのレスポンスはJSON形式で返してほしい旨をリクエストに含めます。
### ②　コントローラでJSON形式のデータを用意するよう準備
　　　　リクエストにJSON形式で返してほしい旨の情報が含まれているため
　　　　コントローラのアクションに明記する必要があります。
### ③　レスポンスするためのJSON形式のデータを準備

　　　　viewsディレクトリの中にファイルを作っておく必要があります。

　　　　同期通信では
　　　　○○.html.erbという形式でHTMLのファイルを準備して置くことで
　　　　レスポンスとしてHTMLを返すことができました。

　　　　非同期通信の場合
　　　　○○.json.jbuilderという形式になります。
　　　　JSONのデータをレスポンスとして返す必要があるので。

# JSON
Java Script Object Notationの略で、データ交換を行うためのデータ記述形式の一種です。Rubyのハッシュと同様、キーとバリューの組み合わせでデータを表現する形式です。

## 通常の通信
* プラウザ　→　サーバ　これがリクエスト
* プラウザ　←　サーバ　　　これがレスポンス

## Ajaxこみの通信
* プラウザ　→　サーバ　通常と一緒のリクエスト

* htmlのみ場合　プラウザ　←　サーバ　通常レスポンス
* Ajax混みだと　プラウザ　←　javscriptでhtmlに変換　←　必要データのみJson形式で返す　←　サーバ

# デフォルトアクション
HTMLの要素を操作した際に定められている挙動です。
例えばaタグにもデフォルトアクションつまりリンクがあります。
aws-vaultでいらなくなったprofileを消したい時

# 背景
AssumeRoleをprofileに書きすぎたり、不要になったIAMユーザーを整理したい

# コマンド
```
$ aws-vault remove [profile]
```

# 参考
https://www.qualimente.com/2018/10/22/how-to-use-aws-vault-to-managing-credentials-for-an-aws-account/
[Rails]環境変数って何だろう？作る理由と作り方

# 環境変数について

まだRailsを勉強し始めて1ヶ月半くらいなのですが、アプリのデプロイ中に環境変数というものに出会ったので

- 環境変数を作る理由
- 環境変数の作り方

について調べていこうと思います。

##　環境変数を作る理由について

例えばGithubにソースコードをあげた際に秘密鍵などをそのまま書いてしまっていると、第３者が`その鍵を知ることができてしまい`ます。これを防ぐために環境変数をOS上に保存しておき、`<%= ENV["SECRET_KEY"] %>`のようにプログラムから変数として呼び出して使用します。


## 環境変数の作り方

今回は `~/.bash_profile`に書く方法をメモしておきたいと思います。
DOTENVで書く書き方は以下の記事がとてもわかりやすいです！

[[Ruby on Rails]環境変数の設定方法(.bash_profile、Dotenv-rails)](https://qiita.com/yuichir43705457/items/7cfcae6546876086b849)


まず、開発環境でも本番環境でもどちらも`~/.bash_profile`に書いていきます。

```
vi ~/.bash_profile  #bash_profileを編集する
```

vimなので入力は「i」を押して入力です。
秘密にしたいパスワードなどを環境変数に代入していきます。

```
# bash_profileファイルの中に記述していく
...
export SECRET_KEY='piyopiyo'
export SECRET_PASWORD='foobar'
```


入力が終わったら「Esc」を押し、「:wq」を入力して、上書き保存します。

環境変数を書いたら、適用させるために以下のコマンドをターミナル上で打ちます。

```
source ~/.bash_profile
```

これで、環境変数が使えるようになります。

使える環境変数はこれで確認できます。

```
printenv
```


アプリ内のファイルなどで環境変数を呼び出したい時は
rbファイルの場合は、そのまま下のコマンドで大丈夫だと思うのですが

```
ENV["SECRET_KEY"]
ENV["SECRET_PASSWORD"]
```
`database.yml`などのファイルの場合はRubyの記述として、このように書くと変数を使うことができるかと思います！

```
<%= ENV["SECRET_KEY"] %>
```


以上です。:santa:
Vue-cli (Webpack?) のビルド先にdockerのVolumeを指定すると落ちてしまう問題

# 前提

```yml
# docker-compose.yml
version: '3'

services:
  client:
    build: client
    volumes:
      - ./client/src:/app/src:ro
      - www:/app/dist
    depends_on:
      - nginx
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - www:/www/app:ro

volumes:
  www:
```

```conf
# default.conf
server {
  listen 80;
  server_name localhost;

  location / {
    root /www/app;
    index index.html;
    try_files $uri $uri/ /index.html;
  }
}
```

# 結論
clientでは ```dist/``` の親ディレクトリをVolume (www) にマウントした上で

```yml
# docker-compose.yml: services -> client
volumes:
    - ./client/src:/app/src:ro
    - www:/app  # 元 www:/app/dist
```
nginxのrootディレクトリをVolume下の ```dist/``` に設定することで解決

```conf
# default.conf -> server
location / {
  root /www/app/dist;  # 元 root /www/app;
  index index.html;
  try_files $uri $uri/ /index.html;
}
```

# 考察
エラーは以下

```shell
client_1  | yarn run v1.10.1
client_1  | $ vue-cli-service build --watch
client_1  | 
client_1  | -  Building for development...
client_1  |  ERROR  Error: EBUSY: resource busy or locked, rmdir '/app/dist'
client_1  | Error: EBUSY: resource busy or locked, rmdir '/app/dist'
client_1  | error Command failed with exit code 1.
client_1  | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
<project_name>_client_1 exited with code 1
```

不穏な ```rmdir``` の文字

どうやら再ビルドの際に ```dist/``` を消して作り直しているよう

```yml
volumes:
    - ./client/src:/app/src:ro
    - www:/app/dist
```

Volumeを直接 ```dist/``` に当ててしまっていると、このディレクトリの削除はすなわちVolumeをまるごと消す命令になってしまって怒られているのでは…

実際にnginxコンテナに入ってVolumeのあたっているディレクトリを消そうとしてみると同様にbusyのエラーが出る

```shell
$ docker exec -it <project_name>_nginx_1 bash
  root@b0a0e3b107c7:/# cd www
  root@b0a0e3b107c7:/www# rm -r app/
    rm: cannot remove 'app/': Device or resource busy
```

ぷはー
Kotlin DSL 練習：リストを作る

```Kotlin
fun main() {
    list<String> {
        -"A"
        -"B"
    }.also {
        println(it) // > [A, B]
    }
}

fun <T> list(block: ListContext<T>.() -> Unit): List<T> =
    ListContext<T>().apply {
        block()
    }.build()

class ListContext<T> {
    private val mutableList = mutableListOf<T>()

    operator fun T.unaryMinus() {
        mutableList += this
    }

    fun build(): List<T> = mutableList.toList()
}
```
JavaScriptとCSSアニメーションでタイピング風表示を行う

# こんなやつ
[![Image from Gyazo](https://i.gyazo.com/74850273a0678d9448d42fe714676844.gif)](https://gyazo.com/74850273a0678d9448d42fe714676844)
**動作デモ → [https://jsfiddle.net/sr5me9k6/](https://jsfiddle.net/sr5me9k6/)**

# ~~結論~~
~~[iTyped.js](https://github.com/luisvinicius167/ityped)を使う。~~

# 一文字ずつ表示させる処理
```html:HTML
<p id="typing"></p>
```
```JavaScript:JavaScript
const typing = (element, sentence) => {
  [...sentence].forEach((character, index) => {
    setTimeout(() => {
      document.querySelector(element).textContent += character;
    }, 100 * ++index);
  });
}

typing('#typing', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.');
```
特徴としては、第ニ引数で取った文字列をスプレッド演算子を用いて配列化しています。
例えば上記のコードでは文字数が多いので、代わりに`console.log([...'Hello'])`を実行して確認してみると、配列内は以下のようになっています。
[![Image from Gyazo](https://i.gyazo.com/f3997f56710f7f844de48c0132245e16.png)](https://gyazo.com/f3997f56710f7f844de48c0132245e16)
（一文字ずつ配列に格納されている）

これを`forEach`で`100 * (index + 1)`ms後に実行されるタイマーに一文字ずつ追加しています。

また今回はJS側から文字を入力しましたが、HTML内のテキストをタイピング表示にしたい場合は、一度`textContent`を取得した後で何らかの変数に格納し、その後`textContent`を空にして、上記と同じ処理を行うと良いと思います。

# カーソルのアニメーション
```css:css
p::after {
  content: '';
  border-right: 2px solid;
  animation: flashing 0.6s linear infinite;
}

@keyframes flashing {
  0% {
    opacity: 0;
  }
}
```

こちらはとても単純で、疑似要素`::after`でカーソルのようなものを描画し、それの`opacity`を切り替えて点滅を表現しています。

出来ました。(*ﾟ▽ﾟﾉﾉﾞ☆ﾊﾟﾁﾊﾟﾁﾊﾟﾁ

[![Image from Gyazo](https://i.gyazo.com/74850273a0678d9448d42fe714676844.gif)](https://gyazo.com/74850273a0678d9448d42fe714676844)
Kotlin レンジを使用したループ処理の基本表現

Rangesを使用してループを回すときの基本的な表現を、
0~10までの数字を順番（昇順/降順）に並べるという簡単なお題でまとめた。

## 表現上でのルール
数字は`0`と`10`以外は使用できないものとしてみた。
（`10`を含めたくない時に無理やり`9`とか、`10-1`とかで表現しないようにする。）

## 昇順
### 昇順　（〜を含めたい）
```kotlin
    /**
     * 昇順　（10を含めたい）
     */
    /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 */
    for (i in 0..10) println(i) // forループで書いた場合
    (0..10).forEach { println(it) } // forEachで書いた場合
```

### 昇順　（〜を含めたくない）
```kotlin
    /**
     * 昇順　（10を含めたくない）
     * ex) listのindexとかでよく使う
     */
    /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 */
    for (i in 0 until 10) println(i) // forループで書いた場合
    (0 until 10).forEach { println(it) } // forEachで書いた場合
```

## 降順
### 降順　（〜を含めたい）
```kotlin
    /**
     * 降順　（10を含めたい）
     */
    /* 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 */
    for (i in 10 downTo 0) println(i) // forループで書いた場合
    (10 downTo 0).forEach { println(it) } // forEachで書いた場合
    for (i in 10..0) println(i) // forループで書いた場合
    (10..0).forEach { println(it) } // forEachで書いた場合
```

### 降順　（〜を含めたくない）
```kotlin
    /**
     * 降順　（10を含めたくない）
     * ex) listのindexとかでよく使う
     */
    /* 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 */
    for (i in (0 until 10).reversed()) println(i) // forループで書いた場合
    (0 until 10).reversed().forEach { println(it) } // forEachで書いた場合
```

## And more ...
割と組み合わせ方次第でなんとでも書ける感があるので、今回はこの辺で👋

## 参考
[Ranges - Kotlin Programming Language](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/ranges.html)
Gutenbergの投稿画面カスタマイズでremove_meta_box()が効かなかった

wordpres5.3の投稿画面で「文書」の項目を非表示にしようとfunction.phpにremove_meta_box()を書いたら効かなかった。

代わりにremove_post_type_supportを使ったら非表示にできた。

```php:function.php
function remove_post_support() {
  if ( !current_user_can( 'administrator' ) ) {
    remove_post_type_support('post','comments');        // コメント
    remove_post_type_support('post','trackbacks');      // トラックバック
    remove_post_type_support('post','thumbnail');       // アイキャッチ画像
  }
}
add_action('init','remove_post_support');
```
管理者以外は「コメント」「トラックバック」「アイキャッチ画像」の項目を非表示にする。

【参考にさせていただきました。】
[【wordpress】Gutenbergの投稿の編集画面をカスタマイズ](https://twotone.me/web/2398/)
MACでPHPからMailHogにメールを投げてみる設定

ローカル環境で手軽にメールテストをしたい時、windowsだと「smtp4dev」を使っていたけでれど、MACやLinuxでないかなと探したら、MailHogがあった。
mailcatcherだとruby入れないとだけれど、MailHogはバイナリファイルなので便利。

# MailHogインストール
`brew update && brew install mailhog`
実行
`mailhog`

# sendmailの設定
設定ファイルを編集
`sudo vim /etc/postfix/main.cf`

以下の行を追加

```cf:main.cf
relayhost = [0.0.0.0]:1025
```

チェック
`sudo postfix check`

# phpでテスト
以下のテスト用ファイルを作成

```php:mailtest.php
<?php
mail('test@example.com', 'subject', 'body');
```
実行
`php mailtest.php`

#MailHogで確認
http://localhost:8025/
気象×Ruby　〜Mechanizeを使ってRubyスクレイピング〜

#今回の試み
###・　気象データAMeDASの10分ごとの値を一気に取得する
###・　PythonとRubyの両方でスクレイピングしてみる

スクレイピングするデータは[こちら](https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/13bf9771-17c0-c790-a403-251492816bfa.png)

#1.　Pythonによるスクレイピング
```python
# -*- coding: utf-8 -*-
import pandas as pd
import urllib.request
from bs4 import BeautifulSoup

url = 'https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1'
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})

out = []
for ele in element:
  data_list = []
  for e in ele:
    data_list.append(e.text)
  out.append(data_list)

df = pd.DataFrame(data=out, columns=['時分','現地気圧','海面気圧','降水量','気温','相対湿度','平均風速','平均風向','最大瞬間風速','最大瞬間風向','日照時間'])
df.to_csv('tokyo_2019-01-01.csv', index=None,encoding='SJIS')
```
##解説
```python
# ①　指定したHTMLを解析するためのオブジェクト生成
soup = BeautifulSoup(html, 'html.parser')
```
```python
# ②　条件を指定してtrタグを全て取得
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})
```
あとはそこからテキストを抽出してリストに逐一追加していく

**↓出力結果↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/17fd0af5-774f-3fd9-fc8a-9600c53f2671.png)


#2.　Rubyによるスクレイピング
```ruby
require 'csv'
require 'mechanize'

agent = Mechanize.new
url = 'https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1'
page = agent.get(url)
html = page.search('tr')

out = []
html.each do |element|
    if element.get_attribute('style') == 'text-align:right;' then
        data_list=[]
        ele = element.search('td')
        ele.each do |e|
            data_list << e.inner_text
        end
        out << data_list
    end
end

header = ['時分','現地気圧','海面気圧','降水量','気温','相対湿度','平均風速','平均風向','最大瞬間風速','最大瞬間風向','日照時間']
CSV.open('tokyo_2019-01-01.csv','w') do |csv|
    csv << header
    out.each do |val|
        csv << val
    end        
end
```
##解説
```ruby
# ①　Mechanizeクラスのインスタンスを生成し、指定したurlのHTMLを取得
agent = Mechanize.new

page = agent.get(url)
```
```ruby
# ②　searchメソッドでtrタグを検索後、styleタグがtext-align:rightであるとき、inner_textメソッドでテキスト取得
html = page.search('tr')

out = []
html.each do |element|
    if element.get_attribute('style') == 'text-align:right;' then
        data_list=[]
        ele = element.search('td')
        ele.each do |e|
            data_list << e.inner_text
#〜省略〜
```
**↓出力結果↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/bcb5037d-6726-e7fa-aac3-2641532503a1.png)

意外とコード量的にはそこまで差はありませんでした。
Rubyで属性を指定してタグ検索することってできるんですかね。。。

以上！！！
GIS×BigQuery　〜2地点間の距離を算出〜

#BigQueryである2地点間の距離を求める方法

###①BigQueryの地理関数[ST_GEOGPOINT](https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions?hl=ja#st_geogpoint)と[ST_DISTANCE](https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions?hl=ja#st_distance)で求める
※完全な球体として表面上の距離を計算している

###②JavaScriptのユーザー定義関数（UDF）で求める
https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions?hl=ja#javascript-udf-structure


早速、任意の位置情報を2列用意して実践してみた

```sql
CREATE TEMP FUNCTION distance(lon1 FLOAT64, lat1 FLOAT64,  lon2 FLOAT64,  lat2 FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
  lon1 *= Math.PI / 180;
  lat1 *= Math.PI / 180;
  lon2 *= Math.PI / 180;
  lat2 *= Math.PI / 180;
  return 6378.137 * Math.acos(Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1) + Math.sin(lat1) * Math.sin(lat2));
"""; 
 
SELECT
  name1
  ,lat1
  ,lon1
  ,name2
  ,lat2
  ,lon2
  ,(st_distance(st_geogpoint(lon1, lat1), st_geogpoint(lon2, lat2))) / 1000  as distanceA -- ①
  ,distance(lon1,lat1, lon2, lat2) as distanceB -- ②
FROM osako.test
```

２つの方法で求めた距離に多少の誤差はあるものの、計算自体に問題なさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/ee25dcd9-e84f-5051-f710-a40c4b109292.png)

以上！！！
大学生のプログラミング学習日記

## スタート 
今日から日々学んだこと等を書いていこうと思います。
ミス等たくさんあると思いますが、ご指摘頂けると嬉しいです。

自己紹介
・ケンシロウ
・北海道大学２年
2019年8月から2ヶ月間、techacademyにてwebアプリケーションコースを受講し、rubyとrubyonrailsを学習。
受講終了後、簡単なブログ機能を持ったアプリを作成。
12月から、札幌web系スタートアップ会社でインターン予定。

将来はプログラミングスキルだけでなくいろいろなスキルをつけ、自分でサービスを作って提供したい。
さくらレンタルサーバーに鍵認証で入れた

#うまくいかずにハマった事

鍵認証のやり方自体は結構、多くの人が記事にしてくれていましたが、かなり手こずったので失敗した事をメモしておきます。

鍵認証をするにはローカル側で ssh-keygen してできた id_rsa をサーバーに転送して、それを
authorized_keys にmv とかで名前変更する手順になります。

この時、元々 authorized_keysがあった場合は  cat id_rsa.pub >> authorized_keys で
末尾に付け足すそうで、その通りにやったら何故かパスワードを聞かれる上に、鍵のパスフレーズまで聞かれて前よりメンドくさい状態になってしまいました。

私の場合、何らかの原因で元の　authorized_keys が壊れていたのかもしれません。

で、authorized_keysを一旦 cp でバックアップ取ってから消してみました。

その後、一番はじめの手順からやり直して、改めてログインしたらパスワードなしで入れるようになりました。

2019年11月現在、全くのサラから始めれば下の参考ページの通りにキッチリやればできるはずなので、私のようにこけた人は一度、作ったファイルを全部消してやり直したほうが早そうです。
余計なゴミデータがあるとコケるかもしれないので。

（※やり直す時にいきなりrmで消さずにバックアップとっておかないと最悪サーバーに入れなくなるかもしれないので慎重にやったほうが良さそう？）

後、秘密鍵なくすとログインできなくなるかもしれないので特にパソコン買い換える時とか要注意です。

#参考にしたページ

[さくらのレンタルサーバに鍵認証を使ってSSH接続をしてみた](https://q-three.com/archives/661#toc2)
javascript 再入門 1：関数は値です

# 初めに
この記事は、javascriptを始めようと思った人が躓きやすいポイントを整理してお話したいと思います。

# 関数
関数定義は基本的に下に出てくる例のとおりです。

javascriptでは、関数は値という扱いになっています。
なので、変数や定数への割り当てを行えます。

```javascript
const cubic = function (a) {return a**3};
```
そして、関数を別の関数の引数に渡すことも出来ます。

```javascript
const myFunc = function (f) {return f(5)};
myFunc(cubic);
```
さらには、関数の返り値に関数を返すようにも出来ます。

```javascript
const answerFunc = function (a) {
  return function (f) {
    return f(a);
  }
}
```

## 今どきの関数の書き方

### オブジェクトのメソッドとして実装する場合
オブジェクトのメソッドとして実装したい場合は、以下のようにfunctionキーワードを省いて書くことが出来ます。
ついでに「:」も省略可能です。

```javascript
const myPrototype = {
  setFoo (foo) {
    this.foo = `Hello ${foo}`;
    return this;
  },
  //可変長引数を取ってみる
  pipe (...f) {
    f.reduce((p, c) => c(p), this.foo);
    return this;
  },
  //分割代入
  pair ({x, y}) {
    this.foo = [x, y];
  },
  //配列の分割代入
  sum ([x, y]) {
    this.foo = {x, y};
  }
}

const myObj = Object.create(myPrototype, {
  foo: {
    writable: true,
    value: void 0
  }
});

myObj.setFoo('dog');
console.log(myObj.foo);

```
### アロー関数式を使う
注）あるオブジェクトのメソッド内でこの方法を使うと、そのメソッドを呼び出した元のオブジェクトをthisとして、その関数のthisが束縛されます。
なので、あるオブジェクトのメソッドに直接アロー関数を書かないでください。
その場合は上記の略記法を使ってください。

```javascript
//引数が一つの場合は()を省略できる
const f = a => a ** 3;

//可変長引数と分割代入が使える
const g = (...v) => r => r(...v)
```

先程の、関数を返す関数も以下のように書き直すことが出来ます。

```javascript
const aFunc = a => f => f(a);
```

### 分割代入などの略記
新しい書き方の一つですが、今までのコードを踏まえて、改めて説明します。
関数定義や関数実行の　__()__　の中の書き方に特徴があるだけです。

```javascript

// 関数内で引数全てを配列にして扱う。 引数指定の部分に(...引数名)と書く。
const a = ( (...v) => v.map(w => w * 5) )(1, 2, 3, 4, 5);
// [5, 10, 15, 20, 25]

// 配列を引数へ展開して代入する。　関数実行時に(...配列名)と書く。
const b = ( (a, b, ...c) => ({a, b, c}))( ...a );
// {a: 5, b: 10, c:[15, 20, 25]}

// オブジェクトのキー名を引数名として使いたい場合は、
// 引数指定の部分に({キー1, キー2, ...残りを受け取る引数名})と書く。
const c = ( ({a, c, ...o}) => ({d: c.pop(), e: a + o.b, c, ...o}) )( b );
// {a: 5, b: 10, c: [15, 20], d: 25, e: 15}

// 配列の分割代入をする。
const d = ( ([a, b, ...c]) => ({a, b, c}) )( a );
// {a: 5, b: 10, c:[15, 20, 25]}
```
上ではアロー関数だけで書きましたが、オブジェクトのメソッド定義の場合も同じです。

# 遅延評価とコールバック
##遅延評価
例えば、以下のような定義をします。

```javascript
//遅延評価する
const lazying = (...v) => f => f(...v);

//遅延評価出来るので、引数が先に決まって大丈夫。
const runner = lazying('Hello', ' Lazying', ' World');

//なんの関数を入れても引数が先に決まっている！
runner((...v) => alert(v.join('')));
```

## コールバック
ある関数は、関数を引数に取るように最初から設計されています。
javascriptでは、関数がその場で実行されない形式を取ることが出来ます。
つまりは、遅延評価出来るわけです。
普段は正格評価なのですけれども、例えばあるイベント（ボタンがクリックされたなど）では、そのタイミングで渡された関数を実行しようとします。

javascriptでは、そういった非同期な処理を行うことが多いので、関数は自分を実行するための条件（具体的には実行可能な数の引数を渡せる条件）が整った段階で実行されると覚えてみてください。

```javascript
const server = require('http').createServer();
server.on(
  'get',
  (q, s) => s.writeHead(200).end("Hello javascript")
);
server.listen(3000);
```
node.jsでの例です。
上の例の場合は、サーバーがgetメソッドでリクエストを受け取った時に、後ろの関数が実行され、__q__には、__request__ に関するオブジェクトが、__s__には、__response__に関するオブジェクトが自動で代入されます。

# 今回はここまで！
次回は、コールバック関数に他のコールバックの条件が入ったら…
そして、そういった複数に跨る遅延処理の書き方を紹介します。
Slack bolt 入門でnode.js と環境変数でハマったこと

Slack Bolt入門で謎に詰まったことを共有します

[Slack Bolt 入門][1]
[1]:https://slack.dev/bolt/ja-jp/tutorial/getting-started
#Node.js アップデートできない問題

Node.js のバージョンをアップデートするときに
`n`というパッケージを使ったのですが
なぜか普通にアップデートできませんでした

最初にnpm で n をインストールしました

```
npm install -g n
```
最新バージョンへアップデート

```
n latest
```

このアップデート時に表示されるパスと
`which node` で表示されるパスが違いました

インストールされていた Node.js を削除し、
インストールし直すことで解決しました

パス確認

```
which node
```

削除

```
sudo rm -rf 確認したパス
```

削除確認

```
which node
```
私の場合もう一つあったのでそれも同じように消しました

残っていた n を使って再インストール

```
n
```

実行すると以前にダウンロードしていたデータがあった
のでバージョンをEnterで選択するだけでした

#トークンのエラー

入門を進めていくと
アプリのトークンを環境変数として設定する場面があります

```
export SLACK_SIGNING_SECRET=<your-signing-secret>
export SLACK_BOT_TOKEN=xoxb-<your-bot-token>
```

ここで

```
node app.js
```
したときに

```
（前後省略)
Signing secret not found, so could not initialize the default receiver.
```
という感じのエラーをもらいました
これ私は`export`のコマンドを手打ちしていたのですが
コピペしたら消えました
（ただのタイポ...?）


よくタイポするので
ここのコマンドをコピペする際はお気をつけて

お役に立てれば嬉しいです。
Gephiを新しくインストールする方へ。

単純に自分用のメモです。

Gephiを**日本語のサイトからインストールしようとすると、立ち上がりません。**
日本語サイトの情報はかなり古いです。

Gephiをインストールするにはこれから紹介する2つの手順を踏んでください。


#1.最新のGephiを英語サイトからダウンロード

下記のサイトからダウンロードしてください。
###英語公式サイト
https://gephi.org/users/download/
###日本語サイトと英語サイトのバージョンの違い
私の執筆時で、
日本語サイト・・・ver0.8
英語サイト・・・ver0.9.2




#2.Javaの64bit版をダウンロード
###皆さんが普段インストールしているJavaはおそらく32bit版です。

下記のサイトから64bit版をインストールしてください。
https://java.com/ja/download/manual.jsp

リンク先の**オフライン(64ビット)**をインストールしてください。



私がはまったミスなので、どこかの皆さんも同じミスをしないようにシェアさせていただきます。
[deploy]RailsアプリをGCPにデプロイ！③~アプリをgit cloneするまで~

[前回](https://qiita.com/Yukina_28/items/888e8aac44d7bee7142f)の続きです。

ターミナルからssh接続して初めていきます。
まずはrubyやRailsをインストールしておきます。
その後自分の作ったアプリをgit cloneして起動できるようにしていきました。

# 流れ
`1.rubyをインストール`
`2.Railsをインストール`
`3./var/wwwにRailsアプリをgit cloneする`


## 1.rubyをインストール

この方の手順を参考に行っていきました。
[超便利！rbenvを使ってLinuxにRubyをインストールしよう！](https://kitsune.blog/ruby-install)

まずはgitをインストール

```
sudo yum install -y git
```
Complete!と表示されたのを確認してrbenvをインストール


```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```
「~/.bash_profile」に設定を記述


```
 echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```


```
 echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
~/.bash_profileを再読み込み 

```
exec $SHELL -l
```
使えるようになったか確認します。

```
 rbenv -v 
```
この時、私はサイトに乗っていた「rbenv —version 」をそのままコピペしたら`rbenv: no such command '—version'`と出てしまいました。おそらくハイフンが大文字になってしまったのだと思います。

次にrubyをインストールします。

```
rbenv install -v 2.4.1

```


("install"コマンドがないよ！というエラーが出た時はruby-buildをインストールすると良いようです。)

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

この時ファイルがないというエラーが出たので
![ 2019-11-16 12.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532695/5e0642cf-e043-2052-6a87-4f676849955c.png)

rubyのインストールに必要なパッケージをインストールしました。


```
sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel
```
再びrubyをインストールします。

```
rbenv install -v 2.4.1
```

次は、makeのコマンドがないというエラーが出てしまいました。

```
sudo yum -y update
sudo yum -y install make
```
yumをアップデートして、makeをインストールしました。
もう一度、rubyをインストールします

```
rbenv install -v 2.4.1
```

```
rbenv -v
```
インストールできたことが確認できました。

Linux全体で有効にするRubyのバージョンを指定します。

``` 
rbenv global 2.4.1
```

これでrubyのインストールは完了しました！

## 2.Railsをインストール


```
gem install rails -v 5.1.7
```
これを入力します。
`rails -v`でインストールできたか確認できます。


## 3./var/wwwにRailsアプリをgit cloneする
この方の記事を参考に公開鍵・秘密鍵の生成をします。
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

.sshディレクトリに移動し

```
cd ~/.ssh
```
鍵の生成をしていきます。

```
ssh-keygen -t rsa
```
=>途中でwhich to save the keyと聞かれたので =>git_id_rsaと入力しました。

```
vi git_id_rsa.pub
```

を入力し、公開鍵の中身をコピーします。

次にGithubの自分のページへ行き、`Settings`の`SSHandGPG keys`の部分で新たにSSHkeyを作ります。
![ 2019-11-16 16.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532695/c8c4d32c-f686-ebd7-8920-972115b44ef2.png)

ターミナルに戻り、

```
ssh -T git@github.com
```
エラーなく通ればOKです。

```
cd /var
```
/varディレクトリへ移動し、wwwディレクトリを作成します。

```
sudo mkdir www
```

```
cd www
```

wwwディレクトリに移動し、もう１つファイルを作りました。

```
sudo mkdir public
```

```
cd public
```

ここでgit cloneできるか試みます。

```
git clone git@github.com:[ユーザ名]/[アプリ名].git
```

私の場合、権限がないとエラーが出てしまいました。
`clone git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.`(確かこのようなエラーです)
他にも`Bad owner...`のようなエラーが出ていました。

いろいろと調べた結果

```
sudo chown [GCPでのユーザ名] public 
```
で解決し、git cloneすることができました!

続きはこちら→[[deploy]RailsアプリをGCPにデプロイ！④~Rails を起動させるまで~](https://qiita.com/Yukina_28/items/5060f7178af6525d73a2)
【PHP】学習メモ / 多次元配列

#多次元配列
多次元配列は、二次元配列とも呼ばれ配列の中に配列が入れ子になっている形式。

###例１

```php
$menu = array(
  array('coffee', 300),
  array('juice', 200),
  array('cake', 400)
);

echo $menu[0][0].':'.echo $menu[0][1].'円';
echo $menu[1][0].':'.echo $menu[1][1].'円';
echo $menu[2][0].':'.echo $menu[2][1].'円';
```
結果

```
coffee : 300円
juice : 200円
cake : 400円
```
配列の中身

```php
$menu[0] //array('coffee', 300)
```
1つ目の[ ]は、配列のいくつめかを指す（インデックス０は１つ目）

```php
$menu[0][0] //coffee
$menu[0][1] //300
```
２つ目の[ ]は、その配列のいくつ目の値かを指す。

###その他いろんな書き方がある

###例２

```php
$menus = array(
   'coffee' => array(
     'price' => 300,
     'size' => 'S'
 ),
   'juice' => array(
     'price' => 200,
     'size' => 'M'
 ),
   'cake'=> array(
     'price' => 400,
     'size' => 'L'
 )
);

echo 'コーヒー:'.$menus['coffee']['price'].'円';
echo 'ジュース:'.$menus['juice']['size'].'サイズ';
echo 'ケーキ:'.$menus['cake']['price'].'円';
```

結果

```
コーヒー：300円
ジュース：Sサイズ
ケーキ：400円
```

###例３

```php
$menu = array();
$menu[1]['name'] = 'coffee';
$menu[1]['price'] = 300;
$menu[2]['name'] = 'juice';
$menu[2]['price'] = 200;
$menu[3]['name'] = 'cake';
$menu[3]['price'] = 400;

echo $menu[1]['name'].':'.echo $menu[1]['price'].'円'
echo $menu[2]['name'].':'.echo $menu[2]['price'].'円'
echo $menu[3]['name'].':'.echo $menu[3]['price'].'円'
```

結果

```
coffee : 300円
juice : 200円
cake : 400円
```
Slack ワークフロービルダーで匿名フォームを実現する

従来 Slack で匿名フォームを実現するには Google スプレッドシートだの Bot だの必要だったが、ワークフロービルダーを使えばこれ単体で実現できるっぽい。

# 実現可否
Ans: 可能。

アクションメニューを用いて、以下のステップからなるワークフローをつくれば可能。

- 1: 「フォームを作成」ステップ
  - 提出された回答をチャンネルまたは DM で他のメンバーに送信する、は **チェックしない**
- 2: 「メッセージを送信」ステップ
  - メッセージのテキストを変数「送信元: XXXX」をする
  - これで 1 の内容をそのまま送信できる

1 の「フォームを作成」ステップでチェックを入れると出所（～～さんが送信しました）が出てしまうが、上記のように **メッセージを送信ステップをはさんで多段にする** と出ない。

# 匿名性の担保について
Ans: 誰かが **名前が表示されるようにワークフローをこっそり修正したら** 匿名性は崩れる

ワークフローを修正できるのはコラボレーターのみ。

- コラボレーターのデフォ = ワークフロー作成者

ただしワークスペースの管理者 or オーナーは **自分自身を（他のあらゆるワークフローの）コラボレーターに追加できる**（これを行うと全員に通知が行くのでこっそりは行えない）。

参考: [ワークフロービルダーのアクセスと権限を管理する - Slack](https://slack.com/intl/ja-jp/help/articles/360035822734)

# 匿名性に関する疑問

## Q: HTML にこっそり送信者名が埋め込まれてたりしない？
Ans: F12 ツールで覗いてみたが見当たらなかったので、たぶん大丈夫だと思う。

## Q: ワークフロービルダーに実行履歴的なの記録されてない？
Ans: されてないと思う。

当該画面は見当たらないし、[Slack の API](https://api.slack.com/methods) を見ても 2019/10/29 現時点ではそのような機構はない（というかワークフロー絡みのメソッドさえない）。

## Q: ワークフロー作成者本人がこっそり修正したことはわかる？
Ans: ビルダー画面にて「～～時間前に～～が編集」という形で **直近の修正日時** だけはわかる

# その他の疑問

## Q: ワークフロービルダーが使えません
Ans: フリープランには非対応。あと [権限が付与されてない場合はスタンダード以上でもつくれない](https://slack.com/intl/ja-jp/help/articles/360035822734)。

## Q: 動作確認したいんだけど、どうすればいい？
Ans: ワークフローを試す用のパブリックチャンネルをつくって、そこで。

ワークフローは **パブリックチャンネルに対してしか** 設置できないので、何らかのパブリックチャンネルをつくる必要がある。

# まとめ
- 匿名フォームは実現できる
- でも性悪説に従うなら万全ではない
  - 設置者本人 or オーナー・管理者がこっそり「匿名が壊れるような修正」をするかもしれない
- 修正をしたら一応形跡は残る
  - 編集の形跡はビルダーの「～～時間前に～～が編集」でわかる
  - オーナー/管理者の介入時は全員に通知が走るようになっている

# おわりに
まだ実際に運用したわけではなく、ネタの域を出ないかもしれませんが、ワークフロービルダーで匿名フォームを実現できちゃったという話でした。
超シンプルな通知系gem「g」を試す

### はじめに

以前参加した[Tama Ruby会議01](https://tama-rb.github.io/tamarubykaigi01/)のキーノート[「白魔術師への道」](https://tama-rb.github.io/tamarubykaigi01/)というセッションの後半で[「g」](https://github.com/jugyo/g/)というGemが紹介されていたので試してみました。

### 動作環境
| 項目 | 内容 |
|:---------:|:---------:|
| Ruby | 2.6.5 |
|   MacOS    | 10.13.6 |
|g | 1.7.2|
|terminal-notifier |2.0.0 |

### 環境構築
いくつか方法はありますが、Gemを導入するだけなので以下の手順で完了です。
MacOSユーザー向けの通知Gem`terminal-notifier`もinstallします。

```shell
gem install g
gem install terminal-notifier
```

### 動作確認
使い方はデバッグなどで使う `p` と同じです。
実行するとMacの通知領域に `Hello, World!` と表示されます。

```ruby
require 'g'
g 'Hello, World!'
```

![g_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/35936dbb-8646-a2b7-9192-a197e88be8f1.png)

長文が出力される場合も通知ウィンドウにカーソルを合わせて操作すれば全文を表示させることも可能です。
※1〜100の連番を表示させた例
![スクリーンショット 2019-11-21 21.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/2ed48584-2a86-9c61-ac96-d475904571ae.png)



### 何に使う？
まさに`p`と同じで簡易的なデバッグに使うと非常に便利です。
当然RailsのControllerなどに仕込んでも動作するので、(それぞれの環境にもよりますが)画面を行き来することなく内容を確認できるのは非常に便利だと思います。

このGemは2013年のアップデートを最後にメンテナンスされていませんが、Rubyに深く依存するものではないので今後も長く使えることが期待できます。


### 参考リンク
- [jugyo/g: The Kernel.g that works like Kernel.p by using terminal-notifier or growl.](https://github.com/jugyo/g/)
- [Road to white mages](https://speakerdeck.com/igaiga/road-to-white-mages)

### 告知
明日は、@tfactoryさんによる「IntelliJのプロファイラを使ってみた」です。
引き続き、[GMOアドマーケティング Advent Calendar 2019](https://qiita.com/advent-calendar/2019/gmo-am) をお楽しみください！
Grapeで必要最小限 rails 6.0.1

[参考](https://off.tokyo/blog/rails-6%e3%81%a7grape%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab-%e6%9c%80%e5%b0%8f%e6%a7%8b%e6%88%90%e3%82%92%e4%bd%9c%e3%82%8b/)
【Python】文字列中に変数展開する方法

## 条件

Python3.6以上

## サンプルコード

f-stringsを使用する。

```python
first_name = 'Taro'
full_name  = f'Tanaka {first_name}'

print(full_name)
# => 'Tanaka Taro'
```

# 参考
　
- [Python3\.6 から追加された文法機能 \- Qiita](https://qiita.com/shirakiya/items/2767b30fd4f9c05d930b)
マークダウン記法覚え書き

##見出し

```
#見出し
##見出し
###見出し
```

>#見出し
##見出し
###見出し

##インライン表示
```
`インライン表示したいテキスト`
```
>インライン表示したい個所が`このように`表示される

**※バッククォートの入力方法はShift+@**
##箇条書きリスト
```
* リスト1
* リスト2
* リスト3
    * リスト4
        * リスト5
        * リスト6
    * リスト7
```
>* リスト1
* リスト2
* リスト3
    * リスト4
        * リスト5
        * リスト6
    * リスト7

**ネストはタブで表現。*の代わりに+や-でもOK**
##番号付きリスト
```
1. 番号付きリスト1
1. 番号付きリスト2
1. 番号付きリスト3
    1. 番号付きリスト4
        1. 番号付きリスト5
        1. 番号付きリスト6
    1. 番号付きリスト
```
>1. 番号付きリスト1
1. 番号付きリスト2
1. 番号付きリスト3
    1. 番号付きリスト4
        1. 番号付きリスト5
        1. 番号付きリスト6
    1. 番号付きリスト7

**ネストはタブで表現。リストの番号は自動採番されるので全て1でOK。**
##コードの挿入
```
    ```言語:タイトル
    コード
    ```
```
>```言語:タイトル
コード
```

**コードブロック内にコードブロックを書くには半角スペース4つorTABでpre表示することで可能**
##文字装飾
```
*イタリック* 
**ボールド**  
***イタリック＆ボールド***  
~~打消し線~~
<sup>上付き</sup>  
<sub>下付き</sub>
<font color="Red">赤文字</font>
```
>*italic*  
**ボールド**  
***italic＆bold***  
~~打消し線~~
<sup>上付き</sup>  
<sub>下付き</sub>
<font color="Red">赤文字</font>

##テーブル挿入
```
列数x行数
```
>| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |

##引用
```
>引用文
>>引用文
```
>>引用文
>>>引用文

##リンク
```
[Qiitaトップ](http://qiita.com/)
```
>[Qiitaトップ](http://qiita.com/)

##水平線
```
***
```
>***

**\---でも可能**
##まとめ
自分がよく使うマークダウン記法まとめてみました。
公開されているQiita記事の末尾に`.md`をつけるとマークダウンが見れるので、綺麗にまとまってる記事を見つけてマークダウンを見てみるのも面白いですね。
シェルスクリプト if文 書き方（6つの例）

#### [ コマンド（test コマンド）
if の直後のリストには、[ が書かれることが多い。
これは、ifの文法とは関係なく、[ コマンドという独立したコマンド。
別名 test コマンド。
if文は、test コマンドの終了ステータスが真か偽によって条件分岐している。

```bash:if-example1
num=5
if [ ${num} -eq 5 ]; then
  echo "等しいです"
fi
```

#### [ コマンド（test コマンド）以外
終了ステータスが真か偽によって条件分岐ができるのであれば、test コマンド以外でも構わない。
例えば、cmp コマンドであれば、2つのファイルが一致しているか否かで終了ステータスが真(0)か偽(0以外)になるので、if文の条件分岐として利用ができる。
※-sオプションを付けて、不要なメッセージを出さない

```bash:if-example2
if cmp -s file1 file2; then
  echo "等しいです"
fi
```

#### あえて、[ コマンド（test コマンド）も使う
cmp コマンドを使用したとしても、その終了ステータスをあえて test コマンドでチェックする。

```bash:if-example3
if cmp -s file1 file2; [ $? -eq 0 ]; then
  echo "等しいです"
fi
```

#### 否定演算を使う
! をパイプラインの先頭に書くことで、終了ステータスを反転させる。

```bash:if-example4
if ! cmp -s file1 file2; then
  echo "等しくありません"
fi
```

#### ifのリストにパイプを使う
パイプの右側の終了ステータスが条件判定に使用される。
※egrepコマンドの結果が出力されないように、標準出力を /dev/null にリダイレクト
※egrep -q オプションでも可

```bash:if-example5
if cat file1 | egrep -i 'file1' > /dev/null; then
  echo "file1が含まれています"
fi
```

#### &&リストや||リストを使う
```bash:if-example6
if cmp -s file1.txt file2.txt && cmp -s file1.txt file3.txt; then
  echo "すべて等しいです"
fi
```
PHPのoci_bind_by_name()で日付型項目が更新できない

# こんなエラーがでた
`Warning: oci_execute() [function.oci-execute]: ORA-01861: リテラルが書式文字列と一致しません in ～～～`
`INSERT`でも`UPDATE`でも全く同じ。

その時のコードは以下（抜粋）

```php5:PHP
oci_bind_by_name($stid, ":DATE_COLUM", $value, -1, SQLT_CHR);
```

```sql:SQL
INSERT INTO SCHEMA.TABLE(
  DATE_COLUM
)
VALUES(
  :DATE_COLUM
)
```

# [PHP.net - oci_bind_by_name](https://www.php.net/manual/ja/function.oci-bind-by-name.php)を、穴が空くほど見たが
日付型項目のtypeの指定はどうするかがわからず。

おそらく`SQLT_CHR`なんだが

```sql:SQL
VALUES(
  TO_DATE(:DATE_COLUM)
)
```
↑コレもだめ

```sql:SQL
VALUES(
  TO_DATE(:DATE_COLUM, 'YYYY-MM-DD hh24:mi:ss')
)
```
↑コレもだめ

# 結局これで動いた
PHP側は問題なかったので前述のとおり。
SQL側を以下のように変更したら動いた。

```sql:SQL
VALUES(
  TO_TIMESTAMP(:DATE_COLUM)
)
```

# 参考
[ORACLE逆引きノート - [ORAエラー] ORA-01861: リテラルが書式文字列と一致しません](https://oracle.programmer-reference.com/ora-01861/)

# 追記（というか反省）
もっと一生懸命**エラーメッセージでググれ**ってことですね。
傾向スコアを用いた因果推論に関する資料

ガッと調べたときの内容をまとめます。

## Books

- [Causal Inference Book | Miguel Hernan | Harvard T.H. Chan School of Public Health](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/)

## Blog posts

- [傾向スコアを用いた因果推論入門~理論編~ - 下町データサイエンティストの日常](https://pira-nino.hatenablog.com/entry/casual_inference)
- [傾向スコアを用いた因果推論入門~実装編~ - 下町データサイエンティストの日常](https://pira-nino.hatenablog.com/entry/causal_inference_implement)
- [Using Causal Inference to Improve the Uber User Experience | Uber Engineering Blog](https://eng.uber.com/causal-inference-at-uber/)

## Slides

- [統計的因果推論とデータ解析 / causal-inference-and-data-analysis - Speaker Deck](https://speakerdeck.com/tomoshige_n/causal-inference-and-data-analysis)
- [CounterFactual Machine Learningの概要 - Speaker Deck](https://speakerdeck.com/usaito/counterfactual-machine-learningfalsegai-yao)
- [AIで原因と結果を把握する ~機械学習と因果推論の融合 Meta-Learner~｜Tack (Technology)｜note](https://note.mu/tak1/n/nc28b93a07452)
- [傾向スコアの概念とその実践](https://www.slideshare.net/okumurayasuyuki/ss-43780294)
- [「傾向スコア分析」の書き方](https://researchmap.jp/index.php?action=multidatabase_action_main_filedownload&download_flag=1&upload_id=38144&metadata_id=29089)

## Videos

- [潜在反応モデルと交絡調整の方法. 田栗 正隆 (横浜市立大学データサイエンス学部) - YouTube](https://www.youtube.com/watch?v=5hXwoJnCWgA&feature=emb_title)
- [DS Movie – 滋賀大学 データサイエンス学部 / 研究科](https://www.ds.shiga-u.ac.jp/movie/)

## Papers (未読)

- [[1907.07271] Potential Outcome and Directed Acyclic Graph Approaches to Causality: Relevance for Empirical Practice in Economics](https://arxiv.org/abs/1907.07271)
- [[1906.00442] An Evaluation Toolkit to Guide Model Selection and Cohort Definition in Causal Inference](https://arxiv.org/abs/1906.00442)
- [Misuse of Regression Adjustment for Additional Confounders F... : Epidemiology](https://journals.lww.com/epidem/Citation/2019/07000/Misuse_of_Regression_Adjustment_for_Additional.11.aspx)

## Repos

- [microsoft/EconML](https://github.com/microsoft/EconML)
- [uber/causalml](https://github.com/uber/causalml)
- [cdt15/lingam](https://github.com/cdt15/lingam)

## 読まなくてもOK

- [NeurIPS 2018 Workshop on Causal Learning](https://sites.google.com/view/nips2018causallearning/home)
- [ML Platform Meetup: Infra for Contextual Bandits and Reinforcement Learning](https://medium.com/netflix-techblog/ml-platform-meetup-infra-for-contextual-bandits-and-reinforcement-learning-4a90305948ef)
blenderでshape keyにドライバを追加するだけ

以下のページより抽出
https://blender.stackexchange.com/questions/13905/add-driver-for-a-shapekey-via-python

```
import bpy

obj = bpy.context.active_object
driver = obj.data.shape_keys.key_blocks['Key 1'].driver_add("value")
```

自分用メモ
GolangでのRootディレクトリ取得方法


```golang
package projectpath

import (
    "path/filepath"
    "runtime"
)

var (
    _, b, _, _ = runtime.Caller(0)
    Root = filepath.Join(filepath.Dir(b), "../../../")
)

// -----
// projectpath.Root // root dir
```

GolangでRootディレクトリが簡単には取得できなかったのですが、上記方法で取得できます。

テスト実行時などでも機能します。

しかし、トリッキーですね💦

※2020-04-09 追記：buildしたバイナリで使うと、ビルド時の環境のパスになってしまい、この手法はローカルでしか使えないようです。

local環境でのテストなどでは使えると思うので、使うなら割り切って使ってほしいです。
Flutterでデバイスのテーマを取得してアプリのテーマを切り替える

iOS13からダークモードが増え、アプリで対応する必要が出てきたので対応方法を考えてみました。
下記でデバイスのテーマ設定を取得できる

```dart
platformBrightness = MediaQuery.platformBrightnessOf(context);
```

##InheritedWidgetを使用して、アプリのテーマを切り替える

2020年4月30日追記
`inheritFromWidgetOfExactType`は非推奨のAPIになりました
これからは`dependOnInheritedWidgetOfExactType`を使用してください

```dart
class ThemeSwitcher extends InheritedWidget {
  const ThemeSwitcher({
    Key key,
    @required this.data,
    @required Widget child,
  })  : assert(child != null),
        super(key: key, child: child);

  final _ThemeSwitcherWidgetState data;
  static _ThemeSwitcherWidgetState of(BuildContext context) {
    final ThemeSwitcher _themeswitcher =
        context.dependOnInheritedWidgetOfExactType<ThemeSwitcher>();
    return _themeswitcher.data;
  }

  @override
  bool updateShouldNotify(ThemeSwitcher widget) => this != widget;

```

```dart
class ThemeSwitcherWidget extends StatefulWidget {
  const ThemeSwitcherWidget({
    Key key,
    @required this.child,
    @required this.initialThemeMode,
  })  : assert(child != null),
        assert(initialThemeMode != null),
        super(key: key);

  final Widget child;
  final ThemeMode initialThemeMode;

  @override
  _ThemeSwitcherWidgetState createState() => _ThemeSwitcherWidgetState();
}
```

```dart

class _ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
  final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
  ThemeMode themeMode = ThemeMode.light;

  @override
  void initState() {
    super.initState();
    loadAppTheme();
  }

  Future<void> loadAppTheme() async {
    final SharedPreferences prefs = await _prefs;
    if (prefs.getBool('isDark') == null) {
      // 初回起動は端末のテーマ情報を取得しアプリに適用する
      final Brightness platformBrightness =
          MediaQuery.platformBrightnessOf(context);
      switchTheme(platformBrightness == Brightness.dark);
    } else {
      setState(() {
        themeMode = prefs.getBool('isDark') ? ThemeMode.dark : ThemeMode.light;
      });
    }
  }

  Future<void> switchTheme(bool val) async {
    final SharedPreferences prefs = await _prefs;
    prefs.setBool('isDark', val);
    setState(() {
      themeMode = val ? ThemeMode.dark : ThemeMode.light;
    });
  }

  @override
  Widget build(BuildContext context) {
    themeMode = themeMode ?? widget.initialThemeMode;
    return ThemeSwitcher(
      data: this,
      child: widget.child,
    );
  }
}
```


## 使い方
```dart
void main( {
  runApp(
    const ThemeSwitcherWidget(
      initialThemeMode: ThemeMode.light,
      child: App(),
    ),
  );
}
```

```dart
class App extends StatelessWidget {
  const App({key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      thememode: ThemeSwitcher.of(context).themeMode,
      home: home(),
    );
  }
}
```

下記を呼び出してテーマを変更し、アプリ全体に反映する

```dart
ThemeSwitcher.of(context).switchTheme(val);
```
Anacondaに作成したPython2.7の環境にJupyterNotebook6.0.2がインストールできない件

#事象
anaconda上にPython2.7の環境が欲しくなり、
`$ conda create -n py27 python=2.7 anaconda`
とか打ってPython2.7の仮想環境(py27)を作成した。


「さあJupyterNotebookを開くぞ!!!」と意気込んでJupyterNotebookをinstallしたところ、以下のエラーが出た。
![rapture_20191121203514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377578/c29bf5ae-b741-b467-8513-c4e53a8c30cc.jpeg)

エラーを見るに、Python3.5以上じゃないとJupyterNotebook6.0.2はインストールできないとのこと・・・

#解決策
JupyterNotebookのバージョンを落としてインストールする。
![rapture_20191121203739.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377578/973c3adb-6290-efd6-d72f-2ac81e8ad01b.jpeg)

とりあえずJupyter5.6.0を選択したところうまくインストールできました。
入力された数値を素因数分解するコードをRubyでprimeライブラリを用いずに書いてみた

## はじめに

Rubyで、入力された数値を素因数分解するコードを書きました。

[primeライブラリ](https://docs.ruby-lang.org/ja/latest/library/prime.html)というライブラリを用いる方法もあるようですが、このライブラリを用いずに書かれたRubyでの素因数分解に関するコードがググっても案外見当たらなかったので、あえて用いずに書いたコードを下記に示します。

こちらの記事を参考にさせていただきました：[C言語で素因数分解](https://qiita.com/Wakaba_C/items/16d076ef2cc07836a29d)

## 書いたコード

（2019.11.22 @scivola さんから、無駄な記述や、無駄にforループを回してるところについてのご指摘をいただき、コードを修正しました。@scivola さん、ありがとうございます。）

~~~ruby:prime_factorization.rb
prime_list = [] # 算出された素数を格納する配列

while true do
  print "素因数分解したい整数を入力してください："
  num = gets.to_i
  if num < 2
    puts "2以上の整数にしてください!"
  else
    break
  end
end

print "#{num} = "
# 得られた素数を配列prime_listに格納
for i in 2..num
  while num % i == 0
    num /= i
    prime_list << i
  end
  break if num == 1 # 素因数分解が完了したらforループから抜ける
end

puts prime_list.join(" * ")
~~~

## 実行結果
~~~
素因数分解したい整数を入力してください：126
126 = 2 * 3 * 3 * 7
~~~
flask-wtf で SelectField に対し動的に選択肢を追加した時に注意する点

flask-wtf で SelectField に対し動的に選択肢を追加する

```hoge_form.py
from flask_wtf import FlaskForm
from wtforms import SelectField

class HogeForm(FlaskForm):
    select = SelectField('選択肢', coerce=int)
```

```view.py
@app.route('/', methods=['GET', 'POST'])
def hoge():
    form = HogeForm()
    if form.validate_on_submit():
        ...
    form.select.choices = [(d.id, d.name) for d in data]  
    return render_template('hoge_post.html', form=form)
```

そうすると以下のようなエラーがでる

```
TypeError: 'NoneType' object is not iterable
```

この原因は `validate_on_submit()` が choices に対してバリデーションを行なっているため、 `validate_on_submit()` より後に `choices` を追加するとエラーになってしまう
なので以下のように `validate_on_submit()` の前で追加する


```new_view.py
@app.route('/', methods=['GET', 'POST'])
def hoge():
    form = HogeForm()
    form.select.choices = [(d.id, d.name) for d in data]
    if form.validate_on_submit():
        ...
      
    return render_template('hoge_post.html', form=form)
```
Slack の WYSIWYG を無効にしたい

Slack のテキスト入力欄に WYSIWYG エディタが実装され、Markdown のまま編集したい派は悲鳴を上げている人が多数。苦情もたくさん来ているみたいなので、~~そのうち無効にできるようなオプションが付きそうですが。~~（→~~現在開発中とのことです。追記をご確認ください。~~ →正式に実装されました🙌）

## 【追記】 WYSIWIG 無効オプションが正式に実装されたようです🙌

詳細設定から「**マークアップでメッセージを書式設定する**」というオプションを有効にすると、WYSIWYG が無効にできるようになりました！

> <img width="1089" alt="Slack___tdkn___buckmoon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13842/7a509fc0-0738-764c-1407-ec7231e2194c.png">

## やり方

<details><summary>クリックで展開（※ご自身で試される場合、**自己責任**でお願いします）</summary><div>

環境変数でデバッグオプションを有効にした上で、`open` コマンドで Slack.app を開く。

```terminal
$ SLACK_DEVELOPER_MENU=true open -a /Applications/Slack.app
```

ターミナル経由で開いたSlack アプリ上でDevTools を開き (`cmd` + `opt` + `I`)、Console タブで下記のスクリプトを**コピペ**して実行。

```javascript
slackDebug.clientStore.workspaces.getAllWorkspaces().forEach(id => {
  const { redux } = slackDebug[id];

  const {
    wysiwyg_composer,
    wysiwyg_composer_ios,
    wysiwyg_composer_webapp,
    ...payload
  } = redux.getState().experiments;

  redux.dispatch({
    type: "[19] Bulk add experiment assignments to redux",
    payload
  });
});
```

> <img width="885" alt="Screen Shot 2019-11-23 at 13.23.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13842/12f8838e-a31b-ebf7-4971-0fd402252e76.png">
</div></details>

## Aa ボタンがあるじゃん。ちがう、そうじゃない

> **コレジャナイ...**
> <img width="735" alt="Screen Shot 2019-11-23 at 13.31.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13842/43588a59-f49e-4eb5-3461-6f0b2d7e1284.png">

※ 入力欄よこにある `Aa` というボタンを押すと、スタイルを適用するボタンなどは非表示になるけど、プレーンテキストが表示されるようになるわけではなくて、スタイルが適用されたままのテキストが表示されてしまう。これを無効にしたいという話。

> **こうなって欲しい...**
> <img width="735" alt="Screen Shot 2019-11-23 at 13.29.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13842/1b41b674-5a23-ebbd-3290-f4ae92a37070.png">

## そもそも挙動がおかしくバグっている

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">これ、どうやったら改行になってどうやったら送信になってどうやったらブロック抜けるのか分からなくてハマる。というか未だに知らない。 <a href="https://t.co/3GJzXDiMnP">https://t.co/3GJzXDiMnP</a></p>&mdash; dora-gt (@maverick_am_i) <a href="https://twitter.com/maverick_am_i/status/1197448226867015680?ref_src=twsrc%5Etfw">November 21, 2019</a></blockquote>

たとえ WYSIWYG のままでも、快適に編集できれば不満は無いのですが...。[Typora](https://www.typora.io/) の挙動を見習ってほしい。

## 参考

- [kfahy/slack-disable-wysiwyg-bookmarklet](https://github.com/kfahy/slack-disable-wysiwyg-bookmarklet)
    - 参考にしたソースコードはこちらの Bookmarklet 版です。
    - [Issue にコメント](https://github.com/kfahy/slack-disable-wysiwyg-bookmarklet/pull/2#issuecomment-557154630)したところ、提案が取り込まれました。
        - [Disable WYSIWYG in all workspaces - GitHub](https://github.com/kfahy/slack-disable-wysiwyg-bookmarklet/commit/d603c56cafdf336e4f59fcb8466eff26437f169c)

## 追記 :pencil2: 

- [Slack 利用ポリシー](https://slack.com/intl/ja-jp/acceptable-use-policy)をよく確認すると、ユーザーがプログラムの改変等で機能を無効にする行為そのものが**禁止事項**とされていました。上記の方法を試される場合は**自己責任**で行ってください。
- Slack社はたくさんのフィードバック（苦情）が来ている現状を受けて、オプトアウトできるような[無効化オプションを開発中](https://news.ycombinator.com/item?id=21600557)（提供時期は未定だが、数週間以内）とのことです。
初心者によるプログラミング学習ログ 165日目

# 100日チャレンジの165日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

165日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>165日目<br><br>今日も今日とてwebサイトコーディング課題<br><br>というか、みなさんLPとかひとつつくるのにどれくらい時間かかるもんなんだろう？？<br><br>たぶん自分の場合は時間かけすぎなんだろうな・・・<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1197245378690600960?ref_src=twsrc%5Etfw">November 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ServiceからDialogを出す

1.
方法１：Dialogを使わない、自分はWindowManager.addViewの方法でViewを出す。
方法２：どうしてもカスタマイズDialog(AOSP Dialogを継承)を出す場合、
以下の一行のソースを追加したらできます
Dialog.show()を呼ぶ前に
 getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
追加する

2.ServiceでWindowManager.addViewを使う時、以下のエラーが出る。
Can't create handler inside thread that has not called Looper prepare

対応方法：
final Handler handler = new Handler(Looper.getMainLooper());
　　　　　　　handler.post(new Runnable(){
　　　　　　　　　@Override
　　　　　　　　　public void run (){
　　　　　　　　　　//ここは実行したいaddviewソース
　　　　　　　　　}
　　　　　　　});
Excelって名前しか知らないPCに不慣れな感覚派22歳プログラミング完全未経験者がRubyを習得するまでの軌跡。

22歳プログラミング完全未経験者の学習記録と感じたことや疑問点、理解に至った知識をまとめる。
-

目標
-
①プログラミングって何の状態から１つでいいから言語を習得し自分にとって面白いと感じる分野なのかを見極める。
②twitchの拡張機能をつくる
③誰かが必要なプログラムをつくることは難しい、まずは自分に必要なプログラム、こんなのがあれば素敵だなと思うものを実体化させる能力を身につけたい！


取り組む際に感じていること
-
①数学的な知識がないとまったく理解できないのではないか？（数学はニガテな方だ）
②はじめはピアノのバイエルン、武道でいう型のようなものが多く飽きてしまうのではないか？　
③自分が今やってることがなんの役に立つのかイメージがわきづらく感情の波に溺れそうになる。
④自分がこうしたいああしたいという脳内のイメージを実際に実体化させられるのか
⑤プログラミングができたら魔法使いのようでかっこいい。

学習計画
-
プロゲート　→　プロを目指す人のためのRuby入門　→　未定（railsの前にwebの方で勉強しなきゃいけないことがあるらしいからそっちの方）


学習する上で必要なもの
-
①メンター　プログラミングの最大の敵はわからないことがあったときに溜まっていくフラストレーション
②学習時間　時間を削って確保できる。
③モチベーション　はっきり言えばここが難しい。なにがあっても習得したいという固い意志を現状持ちあわせていないのがとても不安だ。

この記事を見た人へ
-
はっきりいって挫折するだろうという見方の方が多いと思う。自分自身も独学でできるのか？モチベは保てるのか？不安で一杯だ。　もし少しでも力を貸してくれるならわからないことがあったときに相談に乗ってほしい。
トランザクションについての例を3つ

##はじめに

トランザクションについての学習をしている中で、例えると何だろうと・・となったので
出てきた3パターンを残しておくことにします。


##トランザクションとは
データを操作する上で、必要な複数の処理のまとまりのことをトランザクションという。
データベースのデータの整合性を担保するために、適切なトランザクション処理が必要。

##例1
Aさんの銀行口座からBさんの銀行口座へ送金する処理、というよく例えに出ているものを
実際のテーブルなどになぞらえてみる。

usersテーブルとprofilesテーブルがあり、
この2つどちらも操作をしないと変更や新規作成ができないとする。

どっちかが失敗したら変更操作をする前に戻るということ(ロールバック)
どっちも成功しないとコミットしない（確定されないということ）

<img width="678" alt="スクリーンショット 2019-11-21 20.08.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498837/f882d70d-b95c-81e2-a197-197dd4df1877.png">






##例2
CSVファイルのインポート
データのあるカラムの数だけINSERTする必要があるため、トランザクションが必ず必要。
途中でうまく行かなかった場合、すでに取り込んだものも無かったことにする。
(まだデータがあるかという部分は、ifやループで回している)

<img width="597" alt="スクリーンショット 2019-11-21 20.20.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498837/34ceae02-a649-7f63-8ed8-50dc9a6376d0.png">



##例3
オークションのとき。
1つのテーブルの1つのカラムを更新していっているイメージ。

Aさんが先に入札をした場合、同タイミングで入札しようとしていたBさんにはロックがかかってしまう。
つまり待ち時間が発生してしまう。
Aさんが入札し終わり、コミットされた時にやっとBさんは現在の商品価格が見れるようになる。

一つのテーブルの1つのカラムをUPDATEしていっているイメージ。
あまりないかも？

<img width="818" alt="スクリーンショット 2019-11-21 19.53.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498837/66012b56-9e80-c7ea-9b5d-68c8a31e56f2.png">