OmniAICreator/Qiita-1.07M huggingface dataset:
[面倒なことはPythonで！]ネットから画像の自動収集

##はじめに
こんにちは。
今回の記事ではネットから必要な画像を自動で収集する方法を紹介しようと思います。

今までの記事で書いたような画像分類をする場合、必要になってくるのが画像収集です。しかも、画像分類となるとAIに学習させるためにできるだけたくさんの画像が必要になってきます。場合によっては1000枚、2000枚になることもあるので、それをいちいち自分の手で検索して保存していくのはめちゃくちゃしんどいです。。。今回紹介するやり方を知るまでの僕はいちいち手動でやっていたのでその作業だけで疲れて勉強どころではなくなっていました（涙）
みなさんにはそんな苦労を味わって欲しくないので、楽してできるだけたくさんの画像を集めちゃいましょう！

##筆者の開発環境
・macOS Mojave バージョン10.14.3
・MacBook Air(11-inch, Early 2015)
・プロセッサ 1.6 GHz Intel Core i5
・Python 3.7.1

これで問題なく動きました！

###手順


①今回使うサイトはFlickrというサイトで、たくさんの画像を共有するサイトになっています。
まずYahooアカウントを取得しましょう。既に持っている人はお持ちのアカウントで構いません。
次に https://www.flickr.com/services/api/ を検索して以下のような画面に飛びます。
![スクリーンショット 2019-05-07 15.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/d77174fc-1f36-60cf-4331-d20b8a0ffffc.png)
この画面の灰色の枠のすぐ下にある API Keys をクリックするとYahooアカウントでのログインを求められるのでそのままログインします。
無事ログインできたら先ほどの画面の「The App Garden」という文字の下にある「Create an App」をクリックします。
するとこのような画面になるので
![スクリーンショット 2019-05-07 15.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/9c15ffdf-86e9-ab1d-216b-e8c9ccbfbc6d.png)
Get Your API Keyのすぐ下のRequest an API Keyをクリックしましょう。
そして次の画面で 「APPLY FOR A NON-COMMERCIAL KEY」をクリックすると![スクリーンショット 2019-05-07 15.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/992c7419-34b4-218c-da63-5296870fa5de.png)
こんな画面に移動するので、What's the name of your app?のところに作りたいアプリの名前、What are you building?のところに目的を書きましょう。

私は画像分類アプリを作りたかったので「Image Classifier」、「To Classify Some Images」と入力しました。内容はなんでも大丈夫なので各自で自由に入力しましょう。
入力してSUBMITをクリックし、このような画面になったら成功です。おめでとうございます！
![スクリーンショット 2019-05-07 16.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/057f271c-4a29-df44-6745-25524bbf4a13.png)
この画面にあるKeyとSecretを写真に撮るなりなんなりして忘れないようにしてください！後で使います！

②次になんでもいいのでテキストエディタを使って以下のようなコードを書きます。

```
from flickrapi import FlickrAPI
from urllib.request import urlretrieve
from pprint import pprint
import os, time, sys
#この辺りのモジュールは各自インストールしておいてください。
pip install 〜でインストールするのが一番簡単です。

# APIキーの情報

key = "先ほどの画面で表示されたKey"
secret = "先ほどの画面で表示されたSecret"
wait_time = 1

#保存フォルダの指定
imagename = sys.argv[1]
savedir = "./" + imagename

flickr = FlickrAPI(key, secret, format='parsed-json')
result = flickr.photos.search(
    text = imagename,
    per_page = 400,#400枚保存するという意味
    media = 'photos',
    sort = 'relevance',
    safe_search = 1,
    extras = 'url_q, licence'
)

photos = result['photos']
# 返り値を表示する
# pprint(photos)

for i, photo in enumerate(photos['photo']):
    url_q = photo['url_q']
    filepath = savedir + '/' + photo['id'] + '.jpg'
    if os.path.exists(filepath): continue
    urlretrieve(url_q,filepath)
    time.sleep(wait_time)
```

このコードをdownload.pyという名前で保存します。
そしてこのdownload.pyが含まれているフォルダに自分が検索したいキーワードを名前として設定したフォルダを新規作成します。ライオンの画像を検索したければ「lion」というフォルダ名で良いです。例えば

Animal
|
|--download.py
|--lion

のような感じで大丈夫です。このlionというフォルダに今から画像が格納されていきます。
このAnimalフォルダをデスクトップに置きましょう。

そしてterminal.appを開いて、
「cd Desktop」→「cd Animal」の順に入力したら、次に「python download.py lion」と入力すると、もう自動でFlickrからライオンの画像が保存されていきます！確認してちゃんと保存されていたら成功です！

##終わりに

いかがだったでしょうか？
こんな感じで面倒な作業が簡単にできちゃうので、画像がどうしてもたくさん必要な場合はぜひ使ってみてください。無駄な労力を使わなくて良くなりますよ！
PHP おみくじメモ

rand()を知った時におみくじ作れるんじゃね？と思って作ってみた。(当たり前ですが、すでにあるものは無視して自分で考えて作ることを意識してます。)
ただ、それだけ。

#入力画面

index.php

```html
    1から9までの数字を入れてGOボタンを押してね！

    <form method="post" action="result.php">
      <input type="text" name="fig">
      <input type="submit" value="GO">
    </form>
```

#結果を表示する

result.php 

```php


    $fig = $_POST['fig']; 
    $result = rand(1,9); 

    if ($fig == $result)
    {
      echo "当たりだよ。おめでとう！";
    } 
    else 
    {
      echo "外れだよ。ごめんね！";
    }

    echo '<br />';
```

一応動作はしたので、メモ程度に載せておきます。

#余談
実務で学ばないとどのようなイレギュラーがあるかわからないし、対処法もわからないのでこんなイレギュラーがあるよって人いたらコメントください。
それについて勉強しますので。
#python の str と repr の違いって何なの？ ( str は非公式のオブジェクト表現 / repr は公式の表現 )

# ref

[__str__ vs. __repr__](https://www.pythonforbeginners.com/basics/__str__-vs-__repr)

>__str__ vs. __repr__
>According to the official Python documentation, __repr__ is a built-in function used to compute the "official" string reputation of an object, while __str__ is a built-in function that computes the "informal" string representations of an object. So both __repr__ and __str__ are used to represent objects, but in different ways. The best way to understand the difference between these two functions is to see them in action:


# Google日本語訳

>__str__ vs. __repr__
>公式のPythonドキュメントによると、__repr__はオブジェクトの「公式の」文字列レピュテーションを計算するために使用される組み込み関数ですが、__str__はオブジェクトの「非公式の」文字列表現を計算する組み込み関数です。そのため、__repr__と__str__はどちらもオブジェクトを表すために使用されますが、その使用方法は異なります。これら2つの機能の違いを理解するための最良の方法は、それらが実際に動作していることを確認することです。

# str は非公式で repr は公式らしいです。

まだよくわかりませんが。

# 文字列を書くときってクォーテーションで囲いますよね


```
>>> "some"
'some'
```

# そのまま書いたら未定義ですよって怒られます

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'some' is not defined
```

# 文字列はevalできないけど

```
>>> eval("some")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'some' is not defined
```

# 文字列の repr は eval できるわけですよ

```
>>> eval(repr("some"))
'some'
```

# 文字列は文字列で

```
>>> "some"
'some'
>>> str("some")
'some'
```

# repr はオブジェクトの「フォーマルな表現」みたいですね？

```
>>> repr("some")
"'some'"
```

# つまり repr で得られる文字列は eval できるわけです

```
>>> eval("'some'")
'some'

```

# こんな理解で合ってますでしょうか？

それではごきげんよう。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[oneWEX] 起動停止コマンド

oneWEX on Docker (RHEL7) の起動停止コマンドです。

#1. Dockerの起動

Dockerサービスの起動は`systemctl start docker.service`
起動確認は`systemctl status docker.service`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/b0ba5c96-748f-b43f-2f92-e5a48476a359.png)

#2. oneWEXの起動（再起動）
oneWEXの起動は`<Install Folder:デフォルトは/root/ibm/wex>/bin/wexdocker.sh`（再起動も同じコマンド）
起動確認は`docker ps`または管理画面や分析画面にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/554e1990-1eed-2eb3-9ac3-893cbbc7e14c.png)
*バージョン12.0.1以下の場合は上記のwksml-serviceのエントリは表示されません。

- 管理画面（管理コンソール）
https\://<ホスト名またはIPアドレス>/admin

- 分析画面（コンテンツマイナー）
https\://<ホスト名またはIPアドレス>/miner

#3. oneWEXの停止
oneWEXの停止は`<Install Folder:デフォルトは/root/ibm/wex>/bin/wexdocker.sh stop`
停止確認は`docker ps`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/a69978d1-c328-a60a-06f8-ba1c6983f64c.png)

#4. Dockerの停止
Dockerの停止は`systemctl stop docker.service`
停止確認は`systemctl status docker.service`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/ada683d9-0110-c47e-c30c-bf7ed32cb15d.png)




以上です。
Cloud9からAWSCloud9へ移行する注意点のまとめ_2019年１２月末で旧Cloud9は使用不可

Cloud9はAWSに買収されました

その為旧Coud9(c9.io)ユーザーは
2019年6月30日に新規の環境構築が停止し、2019年12月31日にすべてのサービス利用が停止となります。その為注意点に関して記載したいと思います。いい点はネットで検索してみて下さい。

この買収に置ける注意点、特に改悪部分と思われるものを記載します。
改悪部分に関しては記載があまりみられない点もあるので共有します。

１：旧クラウド９は２０１９年１２月３１日にサービス利用が停止
　すなわち本年度末を持って使えなくなります。
　　今まではサーバーも無料で使えていましたが、今後は一定期間を越えると
　有償になります。金額は微々たるものですが・・・

２：旧cloud9から新cloud9への移行は英語での説明しかありません。
　　AWS曰く「旧環境から、新環境へのマイグレーションにはツールと手順書が
　　用意されていますのでご確認ください。
　　https://docs.c9.io/docs/migration-checklist
　　上記文中のURLでは英文のみのご案内となっており、現在日本語での資料はご用意しておりません。
　　ご希望にそいかねるご案内となり誠に申し訳ございませんが、何卒ご理解いただけますと幸いです。
　　・・・・らしいです。
　　今まで Cloud9で作っていた人、ご注意下さい。

３：AWS無料枠１年で有償になる
　１年間はCloud9 ではEC2インスタンスを利用します
　アカウントサインアップから12か月以上経過しているアカウントでは、EC2インスタンスは
　従量課金にて料金が発生します
　　特に、初めてインスタンスを作ってほっておくと気がつかないままに有償になり請求がきます

対策
可能なかたはCloud9からローカル環境へ移行する方が多い様子です。
金額は少しですが、これなら無料で使用できます
ただし、環境開発はWindowは比較的たいへんなので難しい方もいると思います。
graphql-codegenでComponentが生成されなくてハマった件

# 目的

graphql-codegenのGenerate機能を使って定義したQueryのReact.Componentを生成したい

# 状況

以下、codegen.ymlを一部抜粋

```codegen.yml
documents: './main/graphql/**/*.ts'
generates:
  ./main/generated/apolloComponents.tsx:
    config:
      noNamespaces: true
      scalars:
        BigDecimal: string
    plugins:
      - typescript
      - typescript-operations
      - typescript-react-apollo
  ./main/generated/resolverTypes.tsx:
    config:
      useIndexSignature: true
    plugins:
      - typescript
      - typescript-resolvers
```

`documents: './main/graphql/**/*.ts'`
main/graphql配下のtsファイルがインクルードされる想定

```main/graphql/queries/item.ts
import gql from 'graphql-tag';

export const itemQuery = gql`
  query Item($id: String!) {
    item(id: $id) {
      id
      name
    }
  }
`;

```

Queryを定義して以下コマンドを実行

```
$ gql-gen --config ./codegen.yml

  ✔ Parse configuration
  ✔ Generate outputs
```

これで `apolloComponents.tsx` に `React.Component`が出力される想定だったが出力されない…

# 解決策

```main/graphql/queries/item.ts
import gql from 'graphql-tag';
```

Qureyを定義する際 `graphql-tag` から `gql` をインポートしていたのが原因だった。

正しくは `apollo-boost` からインポートする


```diff:main/graphql/queries/item.ts
- import gql from 'graphql-tag';
+ import { gql } from 'apollo-boost';
```

上記に修正して再度実行

```
$ gql-gen --config ./codegen.yml

  ✔ Parse configuration
  ✔ Generate outputs
```

```apolloComponents.tsx
import gql from 'graphql-tag';
import * as React from 'react';
import * as ReactApollo from 'react-apollo';

export const ItemDocument = gql`
    query Item($id: String!) {
  item(id: $id) {
    id
    name
  }
}
    `;

export class ItemComponent extends React.Component<Partial<ReactApollo.QueryProps<ItemQuery, ItemQueryVariables>>> {
  render() {
      return (
          <ReactApollo.Query<ItemQuery, ItemQueryVariables> query={ItemDocument} {...(this as any)['props'] as any} />
      );
  }
}
export type ItemProps<TChildProps = {}> = Partial<ReactApollo.DataProps<ItemQuery, ItemQueryVariables>> & TChildProps;
export function withItem<TProps, TChildProps = {}>(operationOptions: ReactApollo.OperationOption<
  TProps,
  ItemQuery,
  ItemQueryVariables,
  ItemProps<TChildProps>> | undefined) {
    return ReactApollo.withQuery<TProps, ItemQuery, ItemQueryVariables, ItemProps<TChildProps>>(ItemDocument, operationOptions);
};
```

無事、React.Componentが出力されました！
#プログラミング 情報の英語でのググり方Tips ( 2つの事柄を VS で比較する )

2つの事柄を比べるときは VS という慣用表現がされるみたいです。

![image](https://user-images.githubusercontent.com/13635059/57272200-b5aaff80-70cd-11e9-89da-a5f1e8d61736.png)

他にも Google のサジェストで色々な表現を見つけてみると良いのではないでしょうか？

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MySQL NET Connector で MariaDB 10.3 に接続してみる

MariaDB では Connector/C, Connecotr/J, Connector/ODBC, Connector/Node.js が提供されていますが，現時点では Connector/NET は提供されていません。
MySQL用Connectorで接続可能かテストしてみました。

# テスト環境

* MySQL Connector/NET 8.0.15
* MariaDB Server 10.3.14
* Microsoft .NET Framework 4.6.1 SDK
* Visual Studio Community 2019 

# サンプルコード

```c#
using System;
using System.Data;

using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial2
{
    public static void Main()
    {
        string connStr = "server=localhost;user=root;password=password;database=employees;port=3306;";
        MySqlConnection conn = new MySqlConnection(connStr);
        try
        {
            Console.WriteLine("Connecting to MariaDB...");
            conn.Open();

            string sql = "SELECT * FROM employees.employees LIMIT 10;";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Console.WriteLine(rdr[0] + " -- " + rdr[1]);
            }
            Console.ReadKey();
            rdr.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        conn.Close();
        Console.WriteLine("Done.");
    }
}
```

# テスト結果

MySQL 用のサンプルデータベース

https://github.com/datacharmer/test_db

を MariaDB Server に読み込んで，サンプルコードを実行した結果が以下のとおりです。


```
Connecting to MariaDB...
10001 -- 9/2/1953 12:00:00 AM
10002 -- 6/2/1964 12:00:00 AM
10003 -- 12/3/1959 12:00:00 AM
10004 -- 5/1/1954 12:00:00 AM
10005 -- 1/21/1955 12:00:00 AM
10006 -- 4/20/1953 12:00:00 AM
10007 -- 5/23/1957 12:00:00 AM
10008 -- 2/19/1958 12:00:00 AM
10009 -- 4/19/1952 12:00:00 AM
10010 -- 6/1/1963 12:00:00 AM
```

ビルドの際に，以下のようなエラーが発生する場合は，

```
Severity	Code	Description	Project	File	Line	Suppression State
Error	CS0246	The type or namespace name 'MySql' could not be found
 (are you missing a using directive or an assembly reference?)	
ConsoleApp1	C:\Users\foo\source\repos\ConsoleApp1\ConsoleApp1\Program.cs	3	Active
```

https://www.cryptool.org/trac/CrypTool2/export/2020/trunk/AppReferences/x64/MySql.Data.dll

から，MySql.Data.dll をサウンロードし，Project - Add Reference で MySql.Data.dll を選択します。
Laravelで前回の入力値を表示する方法

Laravelで前回の入力値を表示する方法を紹介します。

#サンプルblade
この状態だと、入力エラーになっても、前回の入力値は表示されません。

```html
<div class="wrapper">
    @if(count($errors) > 0)
        <ul class="bg-danger">
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    @endif

    <form action="{{ route('sample.store') }}" method="post">
        @csrf
        <div class="form-group">
            <label>名称<span class="required">※必須</span></label>
            <input type="text" name="name" class="form-control">
        </div>

        <button type="submit" class="btn btn-success">登録</button>
    </form>
</div>
```
#oldメソッド

ここで活躍するのが、`old`メソッドです！

```html
<input type="text" name="name" class="form-control" value="{{ old('name') }}">
```

`old`の引数に、対象のhtmlのname属性を指定すると、前回の入力値を表示してくれます。 
でも編集のときとか、すでに保存されている値がある場合は、どうしたらいいんや？

実は`old`メソッドは第二引数にデフォルトの値を受け取ることができます。

```html
<input type="text" name="name" class="form-control" value="{{ old('name', 'デフォルトの値') }}">
```

では、実践向きに記述しますね。  
新規登録画面と編集画面は同じbladeファイルを使い回すと思いますので、それに対応したいと思います。  

まずは、bladeのinputのvalueを以下のようにします。

```html
<input type="text" name="name" class="form-control" value="{{ old('name', isset($defaultName) ? $defaultName : '') }}">
```

Controllerのcreateメソッド

```php
public function create()
{
    return view('sample');
}
```

createメソッドのrouteにアクセスすると、入力欄は空欄です。

Controllerのeditメソッド

```php
public function edit($id)
{
    return view('sample')->with([
        'defaultName' => 'デフォルトの名称',
    ]);
}
```
editメソッドのrouteにアクセスすると、入力欄には「デフォルトの名称」が表示されます。

## ちょいと解説
```
value="{{ old('name', isset($defaultName) ? $defaultName : '') }}"
```

第一引数には、htmlのname属性を入れます。こちらは、入力エラーがあった場合に表示されます。  
第二引数は、初期表示の場合に表示されます。 
新規登録時は`$defaultName`の変数が設定されていないので、三項演算子の後半に行って、空になります。
編集時は、`$defaultName`の変数が設定されているので、参考演算子の前半に行って、その値が表示されます。


#まとめ
素phpユーザーから、Laravelを始めて、最初につまづいたのがここだった。。
そのうちチェックボックス・ラジオボタンのoldの値の表示の仕方もまとめたい。
Azure App Serviceのソースを取得する方法

Azure App Serviceにデプロイしているアプリケーションのソースを取得する方法。　


####ダウンロード
高度なツール＞Tools＞Zip Push Deploy＞ダウンロードアイコン押下

####ブラウザで確認
App Service Editor（プレビュー）
Jestで直前にいじったテストファイルの結果だけ見たい

## 概要

Jestを実行するとテストファイルが全部実行されたりして辿るのが大変ですよね。

そう思って公式ドキュメントを見ていた所いい感じのオプションがあったのでご紹介します。

ざっくり２種類あります。

### --watch

[Jest CLI Options · Jest](https://jestjs.io/docs/ja/cli#watch)

>
--watch
Watch files for changes and rerun tests related to changed files. If you want to re-run all tests when a file has changed, use the --watchAll option instead.

>
(Google翻訳)
ファイルの変更を監視し、変更されたファイルに関連するテストを再実行します。ファイルが変更されたときにすべてのテストを再実行したい場合は、代わりに--watchAllオプションを使用してください。

これをつけるとJestが監視状態で待機してくれます。この状態のままテストファイル、またはテスト対象ファイルを弄ると関連するものだけ実行してくれます。

何回も試したい場合はこっちがいいかもですね。

### --onlyChanged

[Jest CLI Options · Jest](https://jestjs.io/docs/ja/cli#onlychanged)

>
--onlyChanged
別名: -o。 現在のリポジトリでそのファイルに変更があったかに基づいて、どのテストを実行するのかを識別しようとします。 git/hgのリポジトリでテストを実行した場合のみ動作し、静的な依存グラフが必要です （言い換えると動的な依存グラフは必要ありません）。

これをつけるといい感じに直前にいじったやつだけ出力してくれます。いいですね。

ちょっとだけ確認したいときはこっちのほうが早いです。

## console.logも見たい場合

```bash
jest --silent=false --verbose false --onlyChanged
```

jestは標準ではconsole.logが出力されないようになってしまっているので、必要であれば`--silent=false --verbose false`も付けるのがおすすめです。

もちろん、--watchにこの引数を付けてもOKです。
今年の言語はRust その５６

# 今年の言語はRust その５６

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 19. 高度な機能

通常なら飛ばして後から考えますが、今回は全写経が目的なので、
理解朧げでもひたすら写経して進んでいきます。


### 19.2 高度なライフタイム


```rust
struct Context(&str);

struct Parser {
    context: &Context,
}

impl Parser {
    fn parse(&self) -> Result<(), &str> {
        Err(&self.context.0[1..])
    }
}

```

ライフタイム情報を付加する

```rust
struct Context<'a>(&'a str);

struct Parse <'a> {
  context: &'a Context<'a>,
}

impl<'a> Parser<'a> {

  fn parse(&self) -> Result<(), &str> {
    Err(&self.context.0[1..])
  }
}
```

んんん・・

ちょっと何言ってるかわからない


```rust
struct Context<'s>(&'s str);

struct Parser<'c, 's> {
    context: &'c Context<'s>,
}

impl<'c, 's> Parser<'c, 's> {
    fn parse(&self) -> Result<(), &'s str> {
        Err(&self.context.0[1..])
    }
}

fn parse_context(context: Context) -> Result<(), &str> {
    Parser { context: &context }.parse()
}
````



```rust

trait Red {}

struct Ball<'a> {
  diameter: &'a i32,
}

impl<'a> Red for Ball<'a> {}

fn main() {
  let num = 5;
  let obj = Box::new(Ball { diameter: &num } ) as Box<Red>;
}


```


ライフタイムに関しては、経験がなさすぎて全然分からなかった。
自分で実装を始めたら再度見返そうと思う。





イエス！


あと、5/8にRustの最新本がでるみたいです! (現在5/7)

[実践Rust入門[言語仕様から開発手法まで] 単行本（ソフトカバー） – 2019/5/8](https://amzn.to/2VdAQ6y)

<a href="https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Rust%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%CE%BAeen/dp/4297105594/ref=as_li_ss_il?_encoding=UTF8&psc=1&refRID=KADG0R1CJZD9Y07B3P7E&linkCode=li2&tag=peace098beat-22&linkId=52fef8a307968a1010a3375899274077&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4297105594&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=peace098beat-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=peace098beat-22&language=ja_JP&l=li2&o=9&a=4297105594" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

※アフェっときます
z-indexには使用条件があるのじゃ

# z-indexを使う時についつい忘れること
端から使っていると気にならず使うものなので意識していなかったが、今回保守案件ですでに作られたCSSを触っている時に気づいたことがきっかけです。

## positionがいる
z-indexを使うときはpositionがあって、relativeか、absolut、fixedのどれかではならず、staticでは使えない。

ググると意外と『z-index 使えない』を多く見かける。気をつけよう。記述する際には以下のようになる。

```
.hoge {
  z-index: 50px;
  position: relative;
}
```
RubymineでRailwaysが表示されなくなった時の対処法

# 対処法
rails newする前にrubymineを開いてプロジェクトを作り始めたのが原因

.ideaディレクトリを削除し、Rubymineを再起動するとRailwaysなどが復活する

```
$ rm -rf .idea
```
laravelにVue.jsを入れる前の、5分間の事前学習

##◆コンパイル
ソースコードを機械語に変換する

##◆ビルド
バグがないことを確かめて(静的解析)、問題がなければ実行できる形のファイルに組み立てること
(プリプロセッサ：定数置き換え・コメント削除などコンパイル前の準備)　このあとコンパイル。
コンパイルはビルドの中に含まれる

##◆sass
cssの機能を拡張した言語(効率よくかける)
scssも同様
sassはインデントで分けて、scssはcssと書き方は同じだがこちらもインデントで分ける

##◆node.js[参考記事](https://eng-entrance.com/what-is-nodejs)
サーバーサイドで使えるJavaScriptの代表的なものの一つ
クライアントもサーバーサイドもJavaScriptで書ければ楽ということが利用される最大の理由

##◆npm[参考記事](https://techacademy.jp/magazine/16105)
node.jsのパッケージ管理ツール
node.jsのパッケージは用意された便利機能の集まり

##◆webpack
複数javaScriptのファイルがあり、またそのファイルごとに依存関係がある(なくてももちろんいい)場合でも、それを解決し、
一つのファイルにまとめてくれる機能(ビルド)
laravelのwebpack.mix.jsファイルを見てみると、

```
let mix = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');
```

resources/assets/js/app.jsがビルドしたいファイル
public/jsが出力先
ほかにも指定したいものがあれば、どんどん指定できる。

##◆npm run dev
laravelにvue.jsを導入するときに使うと、思うのですが、これで先ほどwebpack.mix.jsで指定した内容をビルドして、出力してくれる。

##◆laravel mix関数[参考記事](https://readouble.com/laravel/5.4/ja/mix.html)
バージョン付けしたファイルの最新の名前を自動的に解決

```
mix.js('resources/assets/js/app.js', 'public/js')
   .version();
```

npm run devで出力されているため、asset('js/app.js')でも参照できる。バージョン管理がない場合はassetでいいと思います
[参考記事](https://translate.google.com/translate?hl=ja&sl=en&u=https://stackoverflow.com/questions/50926914/laravel-asset-vs-mix&prev=search)

##◆Vue Cli[参考記事](https://scrapbox.io/vue-yawaraka/webpack(vue-cli)%E3%81%AF%E4%BD%95%E3%82%92%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AA%E3%81%AE%E3%81%8B)
webpackをラップして、vueファイルをコンパイルする際に標準デフォルト設定も渡す

##◆導入
[参考記事](https://www.ritolab.com/entry/30)をもとに進めました。
[laravel-vue.js-docker-comose](https://qiita.com/hekizi/items/1ea005af27f94dc50ff6)
#django の基本動作をコンソールで確認するなら $ django-admin shell が良さげ！

- django プロジェクトのスクリプト `./manage.py shell` を打たなくても、どこでも起動できる

# 以上。

すいません。

# デフォルトでは ipython で起動します

- カラーリングされている ( 何らかの拡張や環境によるのかは未調査 )
- クラスの中に関数を書く場合など、1行ずつの入力ではなく、複数行入力のまま、行ったり来たりしつつコードを編集できる
- なんとコマンドの履歴も「複数行」記憶されており、アトミックに履歴をたどることができる ( なんで Ruby にはこんなやつないの？ いやあるの？ )

![image](https://user-images.githubusercontent.com/13635059/57270497-83e26a80-70c6-11e9-8484-33873a4411d5.png)

補完もすごいな！

![image](https://user-images.githubusercontent.com/13635059/57271073-feac8500-70c8-11e9-84d7-5b91a2bf1f00.png)

# 素のpythonでやる場合

`$ ipython`

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
goでs3をいじるまで

## このページについて

golangを使ってs3のapiを叩くためにセットアップを行った際のメモです。

環境: Mac OS

## 手順

### awscliのインストール

```
$ brew install awscli
```

### cliが使う環境変数のセットアップ

```
$ aws configure
AWS Access Key ID [None]: your-key
AWS Secret Access Key [None]: your-token
Default region name [None]: ap-northeast-1
Default output format [None]: 
```

### golang clientのインストール

[こちら](https://github.com/aws/aws-sdk-go)を使う

```
$ go get github.com/aws/aws-sdk-go
```

sdk はデフォルトで `~/.aws/credentials` の設定情報を読みに行くので
`aws configure` でファイルを作りました。([ここ](https://github.com/aws/aws-sdk-go#overview-of-sdks-packages)に書いてあります)

あとはサンプルコードを動かすだけです

```go
package main

import (
	"context"
	"fmt"
	"os"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func main() {

	sess := session.Must(session.NewSession(aws.NewConfig().WithRegion("ap-northeast-1")))
	svc := s3.New(sess)

	ctx := context.Background()
	objects := []string{}
	myBucket := "your-backet"
	err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{
		Bucket: aws.String(myBucket),
	}, func(p *s3.ListObjectsOutput, lastPage bool) bool {
		for _, o := range p.Contents {
			objects = append(objects, aws.StringValue(o.Key))
		}
		return true // continue paging
	})
	if err != nil {
		panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err))
	}

	fmt.Println("Objects in bucket:", objects)
}
```

とりあえず、指定したbuckeｔ内のファイル名をとるスクリプトを[公式](https://docs.aws.amazon.com/sdk-for-go/api/)からもってきました
そのため、動かす前にbucketの作成と中に適当なファイルを突っ込んでみてください

### 参考

自身の環境に入れるcredentialのユーザは権限しぼったもの入れましょう
作り方は[こちら](https://dev.classmethod.jp/cloud/aws/iam_user_with_read_only_access/)を見ました
(続き)Elasticsearch & Kibana on GCP

[こちらの記事](https://qiita.com/kosuke78y/items/f3f1c6d9ec80cb00c9e9)の続き。
# Kibanaをインストールする

```bash
$ sudo apt install kibana
```
あっさりインストールできた。

# KibanaのDashboardを外部から接続可に
GCPインスタンスの外部IPアドレスからアクセス可能にする。
/etc/kibana/kibana.ymlの7行目あたりにある行を以下のように変更。
"0.0.0.0"はバインドできるすべてのIPアドレスの意。

```vim
service.host: "0.0.0.0"
```
このままだとセキュリティ上はサンドバッグ状態なので、自分が使うときだけVMを上げるようにする。

# Kibanaをサービスから起動

```bash
$ sudo -i service kibana start
```
念の為プロセスが起動していることを確認。

```bash
$ ps -ef | grep kibana
$ kibana    2002     1  1 05:41 pts/0    00:00:27 /usr/share/kibana/bin/../node/bin/node --no-warnings --max-http-header-size=65536 /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
```
プロセスが起動していることを確認。

# 自PCからGCP上のKibanaにアクセス
http://[GCPのVMに割り当てられたエフェメラルIPアドレス]:5601へアクセス。
![Screenshot from 2019-05-07 14-58-40_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334790/6750a50e-9129-d57f-8657-9af4dda932a0.png)

繋がった。
これでOK。ここまでで一旦VMを落としておく。
Ruby　IOクラス

##IOクラス
- FileクラスのSuperClass
- 入出力機能を備えたクラス

##IOからの入力
- IO.read / read
- IO.foreach / each / each_lines
 - 指定されたファイルを開き、各行をブロックに渡して実行していく。
- readlines
 - 全てのファイルを読み込んで、配列を返す。
- readline / gets
- each_byte
- getbyte / readbyte
- each_char
- getc / readchar

##IOへの出力
- wrire
- puts
- print
- printf
- putc
- flush

##IOの状態
- stat
- closed?
- eof / eof?
- lineno
 - getsメソッドが呼び出された回数
- sync

##ファイルポインタの移動・設定
- rewind
 - ファイルポインタを先頭に移動し、linenoの値を0に設定。 
- pos
 - ファイルポインタの位置を取得・設定
- seek
Ubuntuのmozcで、キーの割り当てを変更する

## Ubuntuのキーの割り当てについて
Ubuntu 18.04をインストールしたが、初期設定のままだと半角英数字と全角かなの切り替えが慣れていない仕組みになっていたのでキーの割り当てを変更することにした。
## 変更方法
まず、今回はmozcの設定を変更するのでキーボードに日本語(mozc)を追加しておく必要がある。(ディフォルトで追加されている場合もあるが、一応確認する)
1. Ubuntuのアクティビティ→設定→地域と言語→入力ソース
2. ここの入力ソースに日本語(Mozc)を追加。
3. 入力ソースは日本語と日本語(Mozc)の二種類になる。

次にMozcの設定を変更するため、
1. Ubuntuのアクティビティ
2. 「Mozc」と検索して「Mozcの設定」を開く
3. 一般
4. キーの設定

ここを編集すれば思い通りのキー割り当てを実現できる。
僕は今回CapsLockキーを左上の半角/全角キーと同じ挙動をするように変更した。
(※CapsLockキーはEisuと表現されるようだ。)
まだ英語でREADMEを読んでるの？

# Chrome の Google翻訳拡張で日本語翻訳を活用しよう 。

READMEとかドキュメントを読むときに。

いままでなにげに試してなかった方法。

# これ

[Google 翻訳 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja)

# やり方

拡張をダウンロードして右上の翻訳ボタンを押すだけです。

![image](https://user-images.githubusercontent.com/13635059/57269280-cb1a2c80-70c1-11e9-9fc6-e1407405e934.png)

# 結果の例

![image](https://user-images.githubusercontent.com/13635059/57269225-95754380-70c1-11e9-927d-8b4c6efb067f.png)

# 落とし穴

なぜかコードまで翻訳されてしまうパターンもある様子

![image](https://user-images.githubusercontent.com/13635059/57269541-d3269c00-70c2-11e9-9ea6-1aab53535a98.png)

# Stack overflow の例

ざっと見た感じ、どちらが「飛び込んでくる」か感じてみよう。

# 英語

![image](https://user-images.githubusercontent.com/13635059/57269820-dcfccf00-70c3-11e9-8e92-1602b3796a12.png)

# 日本語

![image](https://user-images.githubusercontent.com/13635059/57269785-c48cb480-70c3-11e9-8ba7-9e2c6d6342e6.png)

# NOTE

- 最近はGoogle翻訳の精度も上がっており、雰囲気ぐらいはつかめるような気がした
- 有志の人が翻訳したものよりずっと読みやすくなるケースもある感じ
- 用語の揺れなどはあるだろうが、それは織り込み済みで読めばOK
- 「英語で読まなきゃいけないコンプレックス」を克服してみよう



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
React内に埋め込むhtmlでイベントハンドリングする方法

htmlからreact componentに変換したほうがよい気がするがよいものが見つからなく急ぎだったのでとりあえず下記の方法で対応した。

```jsx

import React, { Component } from 'react'

export default class App extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  componentDidMount() {
    window.handleClick = this.handleClick;
  }

  handleClick() {
    console.log("clicked");
  }

  componentWillUnmount() {
    window.handleClick = null;
  }

  render() {
    let inputhtml = "<a onclick=window.handleClick()>HelloWorld</a>";
    return (
      <div>
        <div dangerouslySetInnerHTML={{ __html: inputhtml }} />
      </div>
    );
  }
}
```

## 参考
[How to parse a String containing HTML to React Components
](https://stackoverflow.com/questions/50420248/how-to-parse-a-string-containing-html-to-react-components)
sqlserver - insert - 一括取込 - bulk,bcp,他1種

### それぞれの利点
bcp  : inとout両方とも書ける
bulk : わかり易い 取込時に置換とかの条件を付けられる

### 書き方
bcp_出力 (windows認証)

```sql:bcp_out.sql
  -- 下３つ必要ない場合もあるけど大体必要だと思う
  EXECUTE sp_configure 'show advanced options', 1;  
  RECONFIGURE;  
  EXECUTE sp_configure 'Ole Automation Procedures', 1;
  RECONFIGURE;
  EXECUTE sp_configure 'xp_cmdshell', 1;
  RECONFIGURE;

  declare @bcpcmd varchar(1000)
  set @bcpcmd =           'BCP DB.dbo.tablename '
  set @bcpcmd = @bcpcmd + 'OUT "C:\Users\oonaa\Desktop\is_output.CSV" '
  set @bcpcmd = @bcpcmd + '-c '
  set @bcpcmd = @bcpcmd + '-S localdb '
  set @bcpcmd = @bcpcmd + '-T '
  exec master..xp_cmdshell @bcpcmd
```
bcp_取込 (windows認証)

```sql:bcp_in.sql
  -- 下３つ必要ない場合もあるけど大体必要だと思う
  EXECUTE sp_configure 'show advanced options', 1;  
  RECONFIGURE;  
  EXECUTE sp_configure 'Ole Automation Procedures', 1;
  RECONFIGURE;
  EXECUTE sp_configure 'xp_cmdshell', 1;
  RECONFIGURE;

  declare @bcpcmd varchar(1000)
  set @bcpcmd =           'BCP DB.dbo.tablename '
  set @bcpcmd = @bcpcmd + 'IN "C:\Users\oonaa\Desktop\is_output.CSV" '
  set @bcpcmd = @bcpcmd + '-c '
  set @bcpcmd = @bcpcmd + '-S localdb '
  set @bcpcmd = @bcpcmd + '-T '
  exec master..xp_cmdshell @bcpcmd
```
bulk_取込

```sql:bulk_insert.sql
begin try
  bulk insert
    tablename
  from
    'C:\Users\oonaa\Desktop\in_torikomi.csv'
  with(
    FIELDTERMINATOR = ',',  -- カンマ区切り:,、タブ区切り：\t
    ROWTERMINATOR = '\n' ,  -- 一行の終わりを示す文字
    KEEPNULLS,
    ERRORFILE = 'C:\Users\oonaa\Desktop\ERR.csv' -- エラー出力ファイル
    --,FIRSTROW = 2,  -- 2行目から読み込み (タイトル行を読まない)
  )
end try
begin catch
  select
    ERROR_NUMBER()    AS ErrorNumber,
    ERROR_SEVERITY()  AS ErrorSeverity,
    ERROR_STATE()     AS ErrorState,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE()      AS ErrorLine,
    ERROR_MESSAGE()   AS ErrorMessage
end catch
```
catch内でエラー取得

後は動作確認できなかったbcp_出力 (sql-server認証)

```sql:bcp_out.sql
  -- 下３つ必要ない場合もあるけど大体必要だと思う
  EXECUTE sp_configure 'show advanced options', 1;  
  RECONFIGURE;  
  EXECUTE sp_configure 'Ole Automation Procedures', 1;
  RECONFIGURE;
  EXECUTE sp_configure 'xp_cmdshell', 1;
  RECONFIGURE;

  declare @bcpcmd varchar(1000)
  set @bcpcmd =           'BCP DB.dbo.tablename '
  set @bcpcmd = @bcpcmd + 'IN "C:\Users\oonaa\Desktop\is_output.CSV" '
  set @bcpcmd = @bcpcmd + '-c '
  set @bcpcmd = @bcpcmd + '-S 192.168.11.2 '
  set @bcpcmd = @bcpcmd + '-U admin '
  set @bcpcmd = @bcpcmd + '-P admin '
  exec master..xp_cmdshell @bcpcmd
```

### 欠点
bcp　:t-sql上ではEXECUTE master..xp_cmdshell @bcpcmd みたいに動的変数を経由しないと使えないのが困る
　　　cmd上で動くのが気になる
　　　bulkより若干遅い（らしい）
bulk : insertのみしかできずoutができない
[AWS Glue]クエリベースでCloudfrontログを parquet & JSTにETL(+パーティション分割)する手順


リマインドとして、下記のユースケースへの対応手順を記載します。
(awsコンソールの使い方等の、細かい部分は割愛)

# ユースケース

・CloudfrontログをAthenaで分析したい
・Cloudfrontログ内の時間はUTCなので、あらかじめJSTに変更しておきたい
・Athenaでフルスキャンが起きないよう、データを日付でパーティション分割したい(分割できるフォーマットに変換したい)
・過去に集計した分も、再度ETLしてパーティションごとに上書きできるようにしたい

# 手順例

## 手順例の前提

・Cloudfrontログのテーブル定義の データベース & テーブル名: cloudfront_access_logs.app_log
・ETL後のparquetの出力先: s3://some-bucket/ETL_cloudfront_logs
・Glue Crawler名: clf_parquet_test
・保存方法: overwrite
・ETLの指針: 極力Spark SQLで済ます(ローカルなどでETLの検証がしやすい)


#### 1. Cloudfrontのログ機能を有効にする
#### 2. Cloudfrontログのテーブル定義を作成

下記あたりを参考に
https://qiita.com/ytanaka3/items/ad5e7d96bc425ff4c843



#### 3. ETL出力後のparquetデータ のテーブル定義を更新するGlue Crawlerを追加


<img width="736" alt="スクリーンショット 2019-05-07 13.23.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157228/4e8b545f-7292-a00c-8b0c-2d92136b3c87.png">



#### 4. 2.をparquet & JST にETL + 最後に3. のCrawlerを呼び出すGlue Jobを作成

[スクリプト]

```python
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.dynamicframe import DynamicFrame

import boto3

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "cloudfront_access_logs", table_name = "app_log", transformation_ctx = "datasource0")

## Transform
df = datasource0.toDF()
df.createOrReplaceTempView('tmp')

# クエリベースでETL (ログ内の時間のUTCをJSTに変換 + パーティション分割用にyyyy-MM-ddのカラムを追加)
df_sql = spark.sql(
'''
SELECT
date_format( from_utc_timestamp(concat( request_date, " ", request_time ), 'JST'), 'yyyy-MM-dd') AS `dt`,
unix_timestamp( from_utc_timestamp(concat( request_date, " ", request_time ), 'JST')) AS `timestamp_JST`,
from_utc_timestamp(concat( request_date, " ", request_time ), 'JST') AS `date_JST`,
  `x_edge_location`,
  `sc_bytes`,
  `client_ip`,
  `cs_method`,
  `cs_host`,
  `cs_uri_stem`,
  `sc_status`,
  `cs_referer`,
  `user_agent`,
  `uri_query`,
  `cookie`,
  `x_edge_result_type`,
  `x_edge_request_id`,
  `x_host_header`,
  `cs_protocol`,
  `cs_bytes`,
  `time_taken`,
  `x_forwarded_for`,
  `ssl_protocol`,
  `ssl_cipher`,
  `x_edge_response_result_type`,
  `cs_protocol_version`
FROM tmp
WHERE
cs_method != '' or cs_method is NOT NULL
''')
#df_sql.show() #確認用

# 追加したカラムでpartition分割し、overwrite
df_sql.repartition(*["dt"]).write.partitionBy(["dt"]).mode("overwrite").parquet("s3://some-bucket/ETL_cloudfront_logs", compression="gzip")

# Crawlerの開始
aws_glue_client = boto3.client('glue', region_name='us-east-1')
aws_glue_client.start_crawler(Name='clf_parquet_test')

job.commit()
```

あとは用途に応じて、S3のログ保存期間の設定・クエリによる取り込み期間の指定などを行う。
Laravelのフラッシュメッセージ表示のメモ

Laravelのフラッシュメッセージ表示のメモです。 
以下のように、保存後などにメッセージを表示したい場合

![スクリーンショット 2019-05-07 14.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/fa447f67-de6e-65ab-4180-f2acc98f8801.png)


## blade側

メッセージを表示したい場所に、以下の通り記載

```html
@if (Session::has('flash_message'))
    <p class="bg-success">{!! Session::get('flash_message') !!}</p>
@endif

@if (Session::has('error_message'))
    <p class="bg-danger">{!! Session::get('error_message') !!}</p>
@endif
```

## Controller側
```php
public function store(Request $request)
{
    //DBへの登録処理など...

    \Session::flash('flash_message', '保存しました。');
    return redirect(route(('sample.create')));
}
```


`Session::flash`の第一引数と、blade側の変数名が対応しています。 
サンプルの場合は、`flash_message`だけ表示しています。  

DBの登録処理を失敗した場合などは、`error_message`を使ってエラーを表示させます。  

`flash_message` , `error_message`は好きな名前を使えます。
php-master-changes 2019-05-06

今日は FFI のバグ修正、テストの修正、不要テストの削除、ドキュメントの修正、JIT の比較処理の生成コードの修正があった！

# 2019-05-06
## cmb69: Properly initialize variable
- https://github.com/php/php-src/commit/30409d6753efc4da50d4a7b1180ff1c442735781
- [7.4~]
- ext/ffi で、変数の初期化を追加

## bukka: Fix OpenSSL online test for ca context
- https://github.com/php/php-src/commit/9977de00284c2b702e4aadfcc66069befa0aaf75
- [7.2~]
- ext/openssl で、http://www.php.net を向いていたテストを（https リダイレクトされるので） http://www.nginx.org に変更
- 「いや example.com でよいのでは」的なツッコミが入ってる

## peter279k: Remove duplicate getimagesize_variation_003 test
- https://github.com/php/php-src/commit/8417142a8fc0a3ccca5c19ab3c8dbde05a737b92
- [7.4~]
- 重複している不要なテストを削除

## petk: Remove duplicate test file
- https://github.com/php/php-src/commit/340c39acfa165990150b68ac52d11dbdc2003eba
- [7.4~]
- ext/oci8 で、重複している不要なテストを削除

## petk: Remove phpextdist
- https://github.com/php/php-src/commit/e58fddf7a3d23b5b7b3cda48c5062ea4c274d5c0
- [7.4~]
- 使われていないスクリプト phpextdist の削除

## petk: [ci skip] Move wddx to dedicated section
- https://github.com/php/php-src/commit/6be6cac6f4c41338c57642e9f6747f7f7711d1d3
- [7.4~]
- UPGRADING で、wddx についての記述を "Other Changes to Extensions" から "Removed Extensions and SAPIs" の節へ移動

## petk: Rename uppercase JPG file to lowercase jpg
- https://github.com/php/php-src/commit/c025cf47c00ed5db086c69ed76dc88ca4238255e
- [7.4~]
- ext/exif で、テスト用 jpg ファイル名の拡張子が大文字だった箇所の修正

## petk: Fix double incremenation in ffi
- https://github.com/php/php-src/commit/426bcdf02120604cc13d9af9f161aec4307a2249
- [7.4~]
- ext/ffi で、誤ったループカウンタ操作の修正

## dstogov: Improved code for unordered comparison
- https://github.com/php/php-src/commit/66a1d821d3092db9cf8923b91361aca66d12f791
- ext/opcache/jit で、比較処理の生成コードを修正
form_forをもう一度理解する

#はじめに
railsの勉強をしていて、避けては通れない`form_for`というヘルパーメソッド。今回はこのなんども使うことになるform_forの使い方をもう一度おさらいしていこうと思い、この記事に着手した。

##form_forとは
form_forは先述した通りrailsのヘルパーメソッドであり、モデルの編集や追加などに使われるメソッドである。つまり、特定のテーブルに対して、レコードの追加やレコードの編集などを行いたい時に、`form_for`を用いると簡単にその記述が書けてしまう優れものであるということ。

##使い方
基本的な使い方は以下の通り。

```
<%= form_for(モデルクラスのインスタンス) do |f| %>
…
<% end %>
```

使いたいモデルのインスタンスを引数として渡すことがポイントとなる。

この時に、渡したインスタンスが情報を持っていなければ`create`アクションを、インスタンスが情報を持っていたら`update`アクションを行うようになっている。この点が非常に便利となっている一つである。
メソッドの使い方は`f.htmlタグ名 :カラム名`と指定することで対応するformの作成をすることができる。詳しくはrailsの[公式ドキュメント](http://railsdoc.com/form)を参照。

##form_tagとの違い
そして勉強しているときによく似たものとして出てくるのが、`form_tag`という存在。この違いを明確にすることで、要所で`form_for`を扱うことができるようになるだろう。
この二つの大きな違いは、モデルを介する操作かどうかというところによる。
例えば、入力データがモデルを持っていれば、モデルにレコードの追加編集ということで`form_for`を扱い、入力データがモデルを持っていなければ、単にデータを特定の要件で扱うだけということで`form_tag`を用いる。

form_tagはモデルにレコードとして追加しないため、検索窓、などを作成する時に用いると効果的に扱うことができる。

#まとめ
今回は`form_for`およびに`form_tag`についてまとめてみた。railsを勉強していたら必ずと言っていいほど扱うことになるため、きちんと用途を抑えて扱えるようにしておきたいところだ。
brewのrequirements.txt的なやつ

pythonでいうところのrequirements.txt的なのはbrewではないのでしょうか？

## brew listだと横になっちゃう... > brew leaves コマンドがあるよ。

brew leavesを使えばＯＫそうです。

```sh
## 書き出し
brew leaves > my_formula.txt
## インストール
xargs brew install < my_formula.txt
```

## caskは？？ > brew list --cask -1 で。

brew leavesではbrew-caskものは表示されません。brew cask leavesというコマンドはありませんでした。

これは```brew list --cask -1 ```で表示できました。
ちなみに```brew leaves```ではなく```brew list```でインストールしたコマンド一覧を出力できますが、依存する為にインストールされたformulaもごっそりでちゃうようです。

```sh
## 書き出し
brew list --cask -1 > my_cask_formula.txt
## インストール
xargs brew cask install < my_cask_formula.txt
```

ですかね。

これで別マシンでも環境構築が楽になりそうです。
CentOS に fcgiwrap をインストール

CentOS 7.6 に fcgiwrap をインストールする方法です。

次のページにあるのと同じです。
[fcgiwrap-1.1.0-9.20181108git99c942c.el7.x86_64.rpm](https://centos.pkgs.org/7/epel-x86_64/fcgiwrap-1.1.0-9.20181108git99c942c.el7.x86_64.rpm.html)

1) 最新の epel をインストール

```bash
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
sudo rpm -Uvh epel-release*rpm
```

2) fcgiwrap のインストール

```bash
sudo yum install fcgiwrap
```

3) インストールの確認

```text
$ which fcgiwrap
/usr/sbin/fcgiwrap
```

4) Systemd の設定

```bash
sudo systemctl start fcgiwrap@@nginx.service
```

動いていることを確認

```text
$ sudo systemctl status fcgiwrap@nginx
● fcgiwrap@nginx.service - Simple CGI Server
   Loaded: loaded (/usr/lib/systemd/system/fcgiwrap@.service; bad; vendor preset: disabled)
   Active: active (running) since Tue 2019-05-07 14:58:34 JST; 1min 39s ago
 Main PID: 9341 (fcgiwrap)
   CGroup: /system.slice/system-fcgiwrap.slice/fcgiwrap@nginx.service
           └─9341 /usr/sbin/fcgiwrap -c

May 07 14:58:34 v157-7-134-246.myvps.jp systemd[1]: Started Simple CGI Server.
```
Windows環境のVSCodeでxdebugでremote_connect_back=1でリモートデバッグを行いたいときの設定(プロキシ環境)

# 概要
ドはまりしてしまったVSCodeのxdebugの設定について記載します。
VSCodeをつかって社内LANでつながっている開発サーバにxdebugをセットアップし、リモートデバッグをしようとしました。

サーバ側の設定(php.ini)やクライアント側の設定(VSCode)の設定は割愛します。
(ページ下部の参考にしてほしいサイトを確認してください)

# ホストを設定してからのリモートでバッグ
```
xdebug.remote_host=172.20.1.30
```

上記であればうまくいきましたが、

```
xdebug.remote_connect_back=1
```

これだとだめでした。デバッグがとまりませんでした。なぜ。

# 結論
結論から言うと、プロキシのせいでした。
プロキシを通って開発サーバにアクセスという経路を通っていたため、remote_connect_backで許可する範囲を超えてしまっており、リモートデバッグができていませんでした。

プロキシを通さずに開発サーバにつなげる設定箇所は下記のとおりです。
（もちろん環境によってはできないこともあります。可能かどうかはネットワークに詳しい人に構成を確認してもらいましょう。だめならremote_hostで設定すればいいだけの話です。めんどくさいですし忘れやすいところですが。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/d54028be-6d60-cdf8-2697-360528411867.png)
ここにチェックをする、もしくは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/ac0fb632-1890-1c16-dc0f-25d35a123557.png)
ここに例外のホスト記述を行います。
(「172.20.*」など)

# 原因がプロキシでなさそうな方へ
下記を確認してみてください。参考にしてほしいサイトです。とても参考になります。

[PHP] Xdebug のリモートデバッグ、理解していますか？
https://qiita.com/castaneai/items/d5fdf577a348012ed8af

【PHP】リモートマシンのデバッグを、「複数人で」やる【Xdebug×DBGpProxy】
https://qiita.com/takudo/items/35d2fd3c6e9846715bf4
Flutter製iOSアプリの審査がリジェクトされた際の対処方法

# 事象
Flutterで作ったiOSアプリをAppleの審査に提出した結果、下記の理由でリジェクトされました。

```
差出人: Apple
2. 3 Performance: Accurate Metadata
Guideline 2.3 - Performance - Accurate Metadata


We were unable to install the app on iPad and iPhone. The UIRequiredDeviceCapabilities key in the Info.plist is set in such a way that the app will not install on an iPhone and iPad .

Next Steps

To resolve this issue, please check the UIRequiredDeviceCapabilities key to verify that it contains only the attributes required for your app features or the attributes that must not be present on the device. Attributes specified by a dictionary should be set to true if they are required and false if they must not be present on the device.

Resources

Please review the Technical Q&A 1397: Understanding the UIRequiredDeviceCapabilities key for information on the UIRequiredDeviceCapabilities key.

You may also wish to review the dictionary keys table in the "Declaring the Required Device Capabilities" section of the App Programming Guide for iOS.
```

この記事では試行錯誤の過程を記載しています。
途中経過よりも最終的な対処方法を知りたい方は、最後の項目[対処その4](https://qiita.com/umechanhika/items/295a90fcf057991b1535#%E5%AF%BE%E5%87%A6%E3%81%9D%E3%81%AE4)まで読み飛ばしてください。

# 対処その1
社内のiOS開発者に伺ったところ、iOSプロジェクトを新規作成するとUIRequiredDeviceCapabilitiesはデフォルトで設定されるとのことでした。
Flutterで新規作成したプロジェクトにはこれが設定されていませんでした。
UIRequiredDeviceCapabilitiesをInfo.plistに追加して、さらにその中のアイテムに`armv7`を追加しました。

armv7を設定した理由は、iOSアプリを新規作成した際にデフォルトで設定される値がarmv7であること、また[こちら](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html)の公式ドキュメントによるとarmv7は一部の機能を包含する形になっていること、この上記2点を参考にしたためです。

# 結果その1
再度同じ理由でリジェクトを受けました。

# 対処その2
>シミュレーター上で問題なく動作することを動画でまとめ添付し、審査に提出したところこの問題は解決しました。
>
>詳しくは[こちら](https://teratail.com/questions/143019)。

この投稿を参考にして、アプリが動作している動画と下記のような文言を添えてレビューチームに返信しました。

```
I can install the my app into emulators and physical devices.
I upload the movie that shows my app is running.
I want you to review my app again.
```

# 結果その2
再度同じ理由でリジェクトを受けました。

# 対処その3
社内の別のiOS開発者から得た情報で、似たような理由でリジェクトを受けた際にInfo.plistの中身をそのまま渡したら無言で承認されたことがあると伺いました。
一説によるとApp Storeのバグではないかと言われているそうです。

私も下記の文言を添えて、Info.plistを添付ファイルとしてアップロードして返信してみました。

```
Hello,

Thank you for your reply.

I checked my app Info.plist.
It has the UIRequiredDeviceCapabilities key in Info.plist.
I upload my Info.plist.
I want you to check it.

Best regards
```

# 結果その3

再度同じ理由でリジェクトを受けました。

# 対処その4
社内のFlutterアプリ開発者に伺ったところ、Flutter製のiOSアプリをストアへアップロードする際は`flutter build ios --release`を実行してからでないと送れなかったことがあるとアドバイスをいただきました。
そこで、アドバイス通り上記コマンドを実行した後にArchiveを選択してバイナリをストアへアップロードして再度審査に提出しました。

# 結果その4
無事に審査を通過しました！

# おわりに
今回の原因はアプリのビルド方法が正規の方法ではなかったことが原因による問題でした。
余談ですが、Flutter製のアプリは`flutter build ios --release`でビルドしないと`pubspec.yaml`で指定したアプリの`versionCode`と`versionName`がバイナリに反映されないようです。
今回は、各プラットフォーム標準のやり方ではなく、FlutterではFlutter独自の方法を用いるべきだということを学びました。
今後も何かしら問題が起きた際にはそこを疑ったほうがよさそうです。
#python の文字列埋め込み・連結を進歩させよう ( .format から f-strings へ ) ( #初心者 向け )

# 連結するやつ
```
first_name = 'Alice'
last_name = 'Liddel'

first_name + ' is ' + last_name
'Alice is Liddel'
```
# なんかちょっとスマートそうな埋め込み
```
"{} is {}".format(first_name, last_name)
'Alice is Liddel'
```
# 辞書で渡して名前付きで埋め込むやつ
可読性が高いよね！たぶん。

```
"{first_name} is {last_name}".format(**{"first_name":"Alice", "last_name":"Liddell"})
'Alice is Liddell'
```

# f-strings

```
first_name = "Alice"
last_name = "Liddell"
f"{first_name} is {last_name}"
'Alice is Liddell'
```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【FileMaker】Gmail APIのサンプルをFileMakerのwebビューワで動かす

お題の通りですが、[Gmail API](https://developers.google.com/gmail/api/?hl=ja)のサンプルが素晴らしくすんなりできたので、FileMakerでも表示させてみました。
今回は、表示させるのみです。

# 諸々準備
これらGmail APIを実行するまでの準備などは色々なサイトで紹介されていますので、APIキーやクライアントIDは取得した状態であることを前提としますが、軽く手順を説明します。


1.Gmailからメールを送受信するので、もちろん、gmailアカウントを持っていることが大前提です。

2.[Google Cloud Platform](https://console.developers.google.com/apis/dashboard)の「IAMと管理＞リソースの管理」でプロジェクトを作成します。
<img width="425" alt="googleAPIPre1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/208c1539-1885-7761-438a-a4de6b913e60.png">
プロジェクトは、複数作成できます。
<img width="655" alt="googleAPIPre2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/513846d7-cefb-5172-a856-e3559626cc37.png">

3.プロジェクトで認証情報を作成します。
<img width="399" alt="googleAPIPre3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b3312d4c-f05e-eff0-3207-5638e8a85947.png">
APIキーとクライアントIDを作成しておきます。
<img width="800" alt="googleAPIPre4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/55a4e8e2-adc1-54de-bdcf-a71b97f39411.png">

Gmail APIは、[OAuth 2.0を使ってアクセス](https://developers.google.com/identity/protocols/OAuth2?hl=ja)しています。
Googleに限らず、大抵の公開されているAPIはOAuth 2.0を利用していますので、どこかでOAuth 2.0で実装をしたことがある方は理解が早いかと思います。
OAuth 2.0では、設定された認証情報（APIキーやクライアントID）を元に発行されたアクセストークンを使って通信の状態を確保します。この通信に必要な認証情報は絶対に他人に公開しないで下さい。（悪用されたら、、、！）

ここまで準備できたら、Gooleの大抵のAPIは利用準備ができたことになります。

4.Gmail APIを有効にします。
[APIライブラリ](https://console.developers.google.com/apis/library)からGmail APIをクリックし、「有効にする」ボタンをクリックします。


# FileMakerで実装する前にテスト
できれば、Google Cloud Platformが提供しているコンソールサービスで一度APIを叩いてみると、どんな風に動くかがわかりますので、ぜひやってみて下さい。
<img width="510" alt="googleAPIPre5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/25a2b4be-ed56-54eb-710d-69f28e39b44c.png">
gmail.users.messages.listとgmail.users.messages.getあたりを実行すると、gmailからのメール受信が実感できます。

#サンプルをブラウザ動かしてみる
やっと、ここからサンプルを動かしてみます。
今回は、Gmail APIサイトに公開されている[pythonのサンプル](https://developers.google.com/gmail/api/quickstart/js?hl=ja)を使います。
実際、この通りやると、ブラウザで動きます。（当たり前だけど）
サンプルで変更するところは、準備で取得したAPIキーとクライアントIDです。
「\<YOUR_CLIENT_ID\>」「\<YOUR_API_KEY\>」の部分です。
pythonのsimplehttpserverを利用しているので、localhostでアクセスできます。

Mac環境ではpython 2.7がインストールされているのでそのまま実行できますが、[windows環境の場合](https://www.python.jp/install/windows/index.html)はインストールが必要かな？
ブラウザで無事確認できましたか？

#FileMakerで表示させてみる
では、FileMakerで表示させてみましょう。
1.Webビューワツールをレイアウトに置き、名前をつけます。
<img width="498" alt="googleAPIPre6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/7c30c8e5-2434-18ed-2393-516fc1f0e2e4.png">

2.webビューワに表示するスクリプトを用意し、ボタンに貼り付けます。
<img width="722" alt="googleAPIPre7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1f6a2622-e974-3a74-6dc0-aac809123019.png">

3.ボタンを実行します。
この時、pythonのsimplehttpserverは起動している状態です。
<img width="430" alt="googleAPIPre8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0056a1eb-d4cf-fc05-aee0-9bb128aaec51.png">
今回のサンプルでは、アクセスしたメールアドレスのラベルを取得しています。

#ここまでだけど、、、
pythonコードを書ける方なら、このサンプルを改良して色々なGmail操作が可能ですが、ここまできたら、実際にwebビューワ経由ではなくFileMakerでGmailのやり取りをしたくなってきましたよね？
次の機会に続きます！