OmniAICreator/Qiita-1.07M huggingface dataset:
flutterでTextFieldにヒントやラベルを表示する

Flutterでテキスト入力のWidgetのTextFieldにヒントやラベルを表示する方法を紹介します。

TextFieldのコンストラクタを覗いてみたところ以下のようにそれらしいパラメタが見つかりません。

```dart
  const TextField({
    Key key,
    this.controller,
    this.focusNode,
    this.decoration: const InputDecoration(),
    TextInputType keyboardType: TextInputType.text,
    this.style,
    this.textAlign: TextAlign.start,
    this.autofocus: false,
    this.obscureText: false,
    this.autocorrect: true,
    this.maxLines: 1,
    this.maxLength,
    this.maxLengthEnforced: true,
    this.onChanged,
    this.onSubmitted,
    this.inputFormatters,
    this.enabled,
  })
```

[公式サイト](https://flutter.io/cookbook/forms/text-input/)を調べたところdecorationを指定することで、ヒントやラベルの表示をするようです。
以下のようなコードにすることでマテリアルデザインのフォームらしい動きを実現することができます。

```dart
TextField(
  decoration: InputDecoration(
    labelText: "Category Name",
    hintText: "Some Hint"),
);
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/18273/6640b483-3465-df69-a273-c465ee90e010.gif" width="300px">
Laravel リファレンス

## Collection
### where
- 指定したキー/値ペアでコレクションをフィルタリングする
- Collectionの中で特定のデータ１つほしい時に使用  
→ 5.5から`firstWhere`メソッドでmodelを取得できる  
→ 5.4までなら`where()->first()`でmodelを取得

```php
$collection = User::where('status', 'active')->get();
$model = $collection->where('user_id', 11234)->first();
```
ラズベリーパイ カメラ複数構成システムでの知見共有

ラズベリーパイのカメラモジュールを複数構成にする時に使用した [「Multi Camera Adapter Module(Arducam製)」](http://www.arducam.com/multi-camera-adapter-module-raspberry-pi)の挙動について知見を共有したいと思う。ただし結果から言うと原因特定まではいかなかった。

#自己紹介
現在、沖縄県の沖縄市にある[StartupCafe Koza](http://startup-cafe.okinawa/)という施設でエンジニアとしてシステム開発に関わっています。

# 現在、開発中のシステム
簡単に言うと、３Dモデル作成システム。撮影対象者（人や物）の周りを１５本の柱に取り付けた、ラズベリーパイ３ （60台）(以下ラズパイと表記)から１２０枚の静止画を一斉撮影し、撮影したデータをサーバーにFTPで送信する。その後は、市販の３D作成ソフトにアップロードするだけで３Dモデルが出来上がる。サーバー側を管理するコード「server.py」とラズパイ側を管理するコード「cam.py」はpythonのFlaskを使用している。

#複数カメラ構成
１柱に４台のラズパイが設置されており、下の位置の2台には、複数カメラ構成にするため、 [「Multi Camera Adapter Module」](http://www.arducam.com/multi-camera-adapter-module-raspberry-pi)を使用して３台若しくは4台カメラ構成を考えている。
上の位置の２台はカメラモジュールのみの１台構成である。

#開発中に起きた現象とそれに対する対策
Multi Camera Adapter Module単体では４台カメラ撮影ができたが、柱に設置して一斉撮影すると撮影ができないラズパイとできるラズパイがあり、また起きた現象も下記のように異なっていた。

**1. ラズパイ自体にSSH接続できない**
対策(1)  -> SDが壊れていると仮定して再度SDにデータ上書きして再利用した。
結果(1)　 ->  SSH接続できるようになった。（SDが壊れていた可能性が高い。）

**2. Multi Camera Adapter Moduleでの撮影ができない場合がある**
対策(1) -> カメラモジュールを交換したり、ケーブルの接続を再確認した。
結果(1)　 -> うまく撮影できるのもあれば、変化なしのもあった。
対策(2) -> 撮影する時に４台分の電流が足りなくなっていると仮定してカメラ台数を減らしてみた。
結果(2)　 -> 4台から３台に減らしたらうまくいのもあった。

**3. FTPの送信がうまくいかない場合がある**
対策(1) -> 撮影する写真データの容量を小さくした。（2592px-1944px から ２５９px-194px）
結果(1)　 -> 変化なし。
対策(2) -> ラズパイの処理（撮影やFTP送信）が集中し過ぎてシステムがダウンしていると仮定して、処理分担のために、各撮影処理やFTP送信処理の前段にSLEEP関数を設けて、ランダムな秒数（1-30s）処理を一旦ストップさせる。
結果(2)　 -> うまく撮影できるのもあれば、変化なしのもあった。

上記対策でもまだ、
**2. Multi Camera Adapter Moduleでの撮影ができない場合がある**
**3. FTPの送信がうまくいかない場合がある**
は発生する。


#重要な気づき
**・３台、４台撮影しているカメラのうち、1個だけカメラLEDの光が小さいのに気づいた。**
**・２台撮影なら全台数うまく撮影できた。**

#新たな仮定と対策と結果
現在の、電源アダプター(110V〜240V 2.4A)ではMulti Camera Adapter Moduleに流れる電流供給量が足りていないのではと仮定して下記の給電方法を試す。
**1. 電源アダプター（5V-3A）でマイクロUSB経由の給電**
**２. 電源アダプター（5V-４A）でマイクロUSB経由の給電**
**３. 電源アダプター（5V-４A）でラズパイのピンへの直接給電**

上記対策でも撮影できる場合があったり、撮影できない場合もあり、安定化しない。そもそも、当初の電源アダプターと同じ現象なので、電源供給問題ではないかもしれない。

#重要な気づき２
自分では、どうしようもなく、先輩エンジニアに細かいログ等を調査してもらうと、うまく撮影できていないラズパイでは、撮影中にEthernetの何かがうまくいかなくなっているようだ。キーボードからの入力も受け付けないので、ネット接続ができなくなっているようだ。

#結局
何が原因かはまだ判明しておらず、２台撮影までは安定するので、Multi Camera Adapter Moduleを使用する場合は２台として、ラズベリーパイの台数を増やして開発を続ける事にする。ラズベリーパイやMulti Camera Adapter Moduleの販売店にも質問してみたけど、有効なアドバイスはもらえなかった。
[質問回答のやりとりはこちら参考](https://www.raspberrypi.org/forums/viewtopic.php?t=218856)
今後、新たな発見があれば知見を共有します。
Gmailに着弾したメールをSlackに飛ばす

何らかのメールで飛んできた情報を、全体広報したいみたいな場合がある。例えば僕の場合は、秘書サービスでかかってきた電話の情報がそうだ。
今はこれをメーリングリストで解決しているのだけれど、Slackに流してナウくしたいと思った。Slackならリアクションとかも使えるので応答状態の可視化も楽だ。

# 方針
時間を掛けたくないので、下記のような方針で手軽に作ることにした。

 - Google Apps Scriptで実装する
 - Slackにはwebhookで流す
 - 1分に1回実行する
 - 通知対象のメールはInboxを経由させずに取って、未読のものを通知するようにする。

# ハマったポイント
## GmailのQuotaが少ないのにハマった。
[このドキュメントによると](https://developers.google.com/apps-script/guides/services/quotas)、意外と"Email read/write"のQuotaが5万回。メール1つの既読/未読を判定するだけでもQuotaを消費するので、1日1440回も雑に実行していると、すぐに枯渇する。
そういうわけで適当にコードで判定するんじゃなくて、検索クエリで縛ってやることにした。

 - [Gmailで使える検索演算子](https://support.google.com/mail/answer/7190?hl=ja)

僕は、`検索ワード is:unread` というクエリにして対応した。
(最初、これを知らずにやっていてGASのエラー通知メールがエラいことになった)

## GASとJavaScriptが微妙に違う
何故か`for-in`とか`for-of`が動かない気がした。
多分、GASにはこの文法が無い。僕にはGASの正確な文法についてのドキュメントが見つけられなかったのですが、おそらく無い。 "based on JavaScript"であってJavaScriptではないらしい。

# そういうわけで
作った。僕の場合はこんな感じのコードになりました。Spreadsheetでも、単体Scriptでも動きます。
時間トリガーで1分ごとに動かしています。

```javascript
function Check() {
  var threads = GmailApp.search("ほげほげ is:unread")
  for (var i=0; i<threads.length; i++) {
    var thread = threads[i]
    if (!thread.isUnread()) {
      continue
    }
    var messages = thread.getMessages()
    for (var j=0; j<messages.length; j++) {
      message = messages[j]
      if (!message.isUnread()) {
        continue
      }
      str = message.getBody().match(/ほしい文字の上([\s\S]*)ほしい文字の下/)
      if (str == null || str.length != 2) {
        Logger.log("miss?")
      } else {
        sendToSlack(str[1].trim())
        message.markRead()
      }
    }
  }
}

function sendToSlack(message){
  var url = 'https://hooks.slack.com/services/****************';
  var payload   = {
    'text'       : message,
  };
  var params    = {
    "payload": JSON.stringify(payload),
    "method":  "POST",
  }
  UrlFetchApp.fetch(url, params);
}
```

# 感想
Google Apps Script本当に便利ですね。
こういう感じで便利スクリプト書いていきたい。
Solidityの基本事項まとめ

# Solidity 入門

SolidityはEthereum（イーサリアム）上で実行可能なプログラム言語です。
本記事ではSolidityの基本事項をまとめました👍
初めてSolidityを触る方、Solidityを復習したい方の参考となれば幸いです🤗

（随時更新予定です）


## コントラクト

Solidityのコードはコントラクト内にカプセル化されている。
コントラクトはイーサリアムアプリケーションの基本ブロックのこと。

⬇︎コントラクトの例

```.js

pragma solidity ^0.4.19;

contract BookShop {

    // イベントを設定してフロントエンドに通知できるようにする
    event NewBook(string name);

    struct Book {
        string name;
        uint dna;
    }

    function _getBook(string _name) private {
        NewBook(_name);
    } 
}

```

Solidityでは、関数はデフォルトでpublicです。
別のコントラクトからでも実行できます。

## マッピング
キーバリューストア。

```.js
//ユーザーIdとユーザー名をセットで格納
mapping (uint => string) userIdToName;

```

## アドレス型
銀行の口座番号のようなもの。アカウントに固有な値。

（グローバル変数である、```msg.sender```を使用することで、関数を呼び出したユーザー（またはスマートコントラクト）の addressを参照できる。）

```.js
mapping (address => uint) favoriteBook;

function setMyBook(uint _myBook) public {
  // ユーザーのアドレスにデータを格納
  favoriteBook[msg.sender] = _myBook;
}

```

## 関数

### view修飾子とpure修飾子
view修飾子は読み取り専用であることを示します。

```.js
string greeting = "hello solidity!!";

function sayHello() public view returns (string) {
  return greeting;
}

```

pure修飾子はアプリ内のデータにすらアクセスできない関数であることを示します。

```.js
function _add(uint a, uint b) private pure returns (uint) {
  return a + b;
}

```

## ガス

・ガス
Solidityでは、ユーザーが関数を使用するたびにガスと呼ばれる通貨を支払うことになっている。ユーザーはEtherでガスを買い、関数を実行する。

関数を実行するために必要なガスの量は、その操作を実行するためにどれくらいの計算資源が必要になるのかで決まっている。
➡️　コードの最適化が重要

例えば、structの中において、できる限り小さい単位の uintを使うことで、Solidityが複数の変数をまとめて、ストレージを小さくすることが可能である。

⬇︎ MiniMeを使用した方がガスコストが低い

```.js
struct NormalStruct {
  uint a;
  uint b;
  uint c;
}

struct MiniMe {
  uint32 a;
  uint32 b;
  uint c;
}

```

また、ブロックチェーン上でなにも変更しない=ブロックチェーン上にトランザクションを生成する必要がない、という理由からview関数を外部から呼び出す場合、ガスは一切かからない。


## ストレージとメモリ

### Storageキーワード
ブロックチェーン上に永久に格納される変数。
コントラクトのストレージ上でアドレス（ポインタ）として扱われる。
Solidityでstorageへの操作は高コストである。（ガスコストが高い）
← データを書き込んだり、変更するたびに、それがすべてブロックチェーンに永久に書き込まれるため。永久に、世界中の何千個というノードがすべてそのデータをハードドライブに書き込む必要があり、そのデータ容量はブロックチェーンが成長すればするほど大きくなる。故にどうしてもコストは高くなる。

そこで、コストを抑えるためには絶対に必要な場合を除いてデータをstorageに書き込まないようにする。

### Memoryキーワード
一時的な変数。メモリ上に新たな領域が確保される。

### 例

```.js

contract CookieFactory {
  struct Cookie {
    string name;
    string status;
  }

  Cookie[] Cookies;

  function eatCookie(uint _index) public {
   
    // `storage`で宣言
    Cookie storage myCookie = cookie[_index];
    //...`mySandwich`がstorage内で`cookies[_index]`に
    // ポインタをさす場合...
    myCookie.status = "Eaten!";
    // ...この場合`cookies[_index]`をブロックチェーン上で永久に変更することになる

    // コピーしたいだけなら、`memory`の方が便利
    Cookie memory anotherCookie = cookies[_index + 1];
    // ...この場合`anotherSandwich`は memory内のデータを
    // コピーすることになる...
    anotherCookie.status = "Eaten!";
    // ...一時的な変数を変更するだけで、`sandwiches[_index + 1]`には
    // なんの影響もない 
  }
}


```
プログラミングスキルチェックサービスをスキル向上に活用する方法の紹介

# スキル向上のためにプログラミングスキルチェックサービスを活用しよう！
[paiza](https://paiza.jp/)のようなプログラミングスキルチェックサービスを
効果的にスキル向上へつなげるために、私が実践している方法を紹介します。

# メリット
## 作りたいものが無くてもコードを書くきっかけになる
プログラミング上達の近道は何といっても手を動かすこと！
その過程でいろんなことを調べたりしてスキルアップしていきます。
しかし、これといって作りたいものが思い浮かばなかったり、
作りたいものを一通り作り終えてしまったりして、
なかなか次にステップに行けないこともあるかと思います。

そんな時にスキルチェックサービスを利用することで、
仕様に従って動作するプログラムを書く練習をすることができます。
中には不思議な仕様の問題もありますが、アルゴリズムの勉強や、言語の標準ライブラリの勉強にもなったりします。


## テストケースの見落としが減る
自信を持って提出したコードが全然ダメダメな時が結構あったりします。
個人的な感覚ですが、ここに普段から見落としがちなテストケースが顕在化していると感じます。
間違えた時はしっかりと原因を探って、自分の中のテストケース生成のパターンとして
覚えることでより適切なテストケースを作れるようになっていけます。

## リファクタリングや優れたコードを書くための実践ができる
リファクタリングやいいコードを書くコツは本を読むだけでなく実際に自分で書いたり、適用してみないと身につきません。
課題で書いたコードは制限時間内クリアを目指して急いで書いたのでいろいろとアレなコードになっていることが多いので
リファクタリング実践の絶好の機会です。
バシバシ自分のコードを改善していきましょう。


# 活用手順(paizaの場合)
1. 時間がかかってもいいので普通に問題を解く
   - 自分に合った難易度を選択するようにする。
   - 一番低い難易度からだんだんと上げていく。
   - 最低限、全ての入力例が通るまでやる。
2. コード提出！
   - テスト失敗→3.へ
   - 全問正解！→4.へ
3. コードを追いながら失敗した原因を探り、すぐに再チャレンジして全問正解を目指す
   - paizaでは失敗したテストケースの入力は教えてくれないので、自力でバグにたどり着くしかない。
   - ここの入力が0だったら？こことここがイコールだったら？など怪しいところを一つ一つつぶしていく。
   - 全問正解できたら4.へ進む。
4. リファクタリング
    - 課題で書いたコードをリファクタリングする。
    - [リーダブルコードのルールの適用](https://qiita.com/fkrw/items/7646563a2b238fbcff9a)等をしていく。
        - 私がよく使うのは[誤解されない名前](https://qiita.com/fkrw/items/7646563a2b238fbcff9a#3%E7%AB%A0%E8%AA%A4%E8%A7%A3%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E5%90%8D%E5%89%8D)、[巨大な式を分割する](https://qiita.com/fkrw/items/7646563a2b238fbcff9a#%EF%BC%98%E7%AB%A0%E5%B7%A8%E5%A4%A7%E3%81%AA%E5%BC%8F%E3%82%92%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B)、[一度に一つのことを](https://qiita.com/fkrw/items/7646563a2b238fbcff9a#11%E7%AB%A0%E4%B8%80%E5%BA%A6%E3%81%AB%E4%B8%80%E3%81%A4%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92)、[コードに思いを込める](https://qiita.com/fkrw/items/7646563a2b238fbcff9a#12%E7%AB%A0%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E6%80%9D%E3%81%84%E3%82%92%E8%BE%BC%E3%82%81%E3%82%8B)です。
    - リファクタリングが終わったら再チャレンジでテストをとおして、結果が変わっていないことを確認する。

# 一番のミソはコードを提出した後！
スキルの評価は一番最初の受験でされますが、ボロボロでも大丈夫です。
大切なのは失敗を失敗のままにしないこと、クリアできたから言ってそこで満足しないこと。
私は上記の活用手順を回し始めて、メキメキスキルが上達していることを感じます。
毎日ひとつでもやって、自分のスキルを積み上げていけるといいなと思います。

以上、自分的なスキルチェックサービスの活用法でした。
ここに挙げた以外に活用法を実践されている方がいましたらコメントいただけると嬉しいです。
lazuriteでサーボモータ

#概要
lazuriteでサーボモータ

#写真

![CIMG2668.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/2a19b521-9352-15a9-ab93-2f494d618f3a.jpeg)


#回路図

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/9d79d50e-06d3-b7ec-31b5-7156a0011311.png)

#サンプルコード


```
void setup() 
{
	hsv.init(1, 20000);
	hsv.attach(0, 5);
	hsv.write(0, 800);
	hsv.start();
}
void loop() 
{
}

```

以上。
Softbank pepper robot, how to stop reacting unexpectedly using autonomous feature? #NAOqi #Pepper


I tried disabling all the autonomous ability like below but it still saying "hi", "hey there" etc suddenly 

I don't know what is the trigger of those reactions

![image.png](https://qiita-image-store.s3.amazonaws.com/0/276746/4a4c4d57-5dd5-68c6-525a-9560f75242af.png)


(+) Can you recommend any tutorials site for pepper? 
I have to make a robot assistant for shoe store :-)
Let's Encryptの導入方法

開発環境にもHTTPSを導入したいがドメインが増えると費用も大変なので、無料のサーバ証明書を試してみました。
Let's Encryptの詳しい内容は検索すれば出てきますが簡単に説明します。
公式サイトは「[https://letsencrypt.org/](https://letsencrypt.org/)」で、運営はInternet Security Research Group(ISRG)というアメリカ合衆国カリフォルニア州にある公益法人になります。
寄付で運営しており、Googleなど多くのスポンサーが付いているので安心して利用できると思います。
今回は解説しませんが、ワイルドカード証明書も利用できます。

導入OS：CentOS 7.5
導入手順(Webrootプラグイン)

- Certbotインストール

	1. epel-releaseの確認とインストール

		yum list installed | grep epel-release
		yum install epel-release

	2. certbotとpython2-certbot-apacheの確認とインストール

		yum list installed | grep certbot
		yum list installed | grep python2-certbot-apache
		yum install certbot python2-certbot-apache

- ドメインの設定手順

	1. Certbot実行

		certbot certonly --agree-tos --webroot -w ドキュメントルート -d 設定ドメイン
		--agree-tos
		ACME利用規約に同意します。このオプションを有効にした場合、過去に利用規約の同意を行ったことがない場合であっても、利用規約の同意を求める画面が表示されません。
		--webroot
		ウェブサーバのDocumentRootディレクトリ以下に認証用のファイルを設置することでドメイン使用権者の認証を行って、SSL/TLSサーバ証明書を取得します。デフォルトはfalseになります。
		-wはドキュメントルートディレクトリを指定し、-dはドメインを指定します。

		実行後は英文での対話形式で下記の入力を求められます。
		・緊急及びセキュリティ連絡用のメールアドレス入力。
		・上記で入力したメールアドレスを電子フロンティア財団のメーリングリストに登録するかのYまたはNの入力。

	2. Apacheに設定

		SSLEngine on
		SSLCertificateFile /etc/letsencrypt/live/設定ドメイン/cert.pem
		SSLCertificateChainFile /etc/letsencrypt/live/設定ドメイン/chain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/設定ドメイン/privkey.pem

	3. Certbot自動化

		1. cronの動作確認
			systemctl status crond

		2. vi /etc/crontabで下記を追加する(毎日、01:39 と 13:39 にコマンドが実行されるようにスケジュール、スケジュールの値は任意)
			39 1,13 * * * root certbot renew --webroot-path ドキュメントルート --post-hook "systemctl restart httpd"

			renew
			取得済みの SSL/TLS サーバ証明書のうち、有効期限が近い証明書を自動的に更新します。

			--webroot-path
			ウェブサーバのDocumentRootディレクトリ以下に認証用のファイルを設置することでドメイン使用権者の認証を行って、SSL/TLSサーバ証明書を取得します。

		3. cron デーモンを再起動
			systemctl restart crond

検証用で実行するコマンド
certbot renew --webroot-path ドキュメントルート --post-hook "systemctl reload httpd"

AWSへの導入は[AWS公式ドキュメント - Amazon Linux 2 での Let's Encrypt と Certbot の使用](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-an-instance.html#letsencrypt)が参考になります。
Chef の cookbook を自作する


## はじめに
Opsworks で Rails アプリを管理しており、Redis を導入することになりました。
Rails コード上でもろもろ設定はできるのですが、他の Opsworks で管理している Rails アプリでも導入することになった時に楽になるよう今回は cookbook を作ろうと思います。(個人的にはそこまで工数変わらないかなーと思いつつも AWS がそちらを推奨しているので)
## 実装
### ローカルに chef のインストール
検索すると様々な情報が出てきますが、私は下記記事を参考にしてインストールしました。
https://qiita.com/hamichamp/items/d3ca7c365353285a564b
### cookbook の作成
続いて先程インストールした chef を使って cookbook を作成します。
first_cookbook という名前の cookbook を作成するには以下のコマンドを叩きます。

```
$ chef generate cookbook first_cookbook
Generating cookbook redis_opsworks_cookbook
- Ensuring correct cookbook file content
- Committing cookbook files to git
- Ensuring delivery configuration
- Ensuring correct delivery build cookbook content
- Adding delivery configuration to feature branch
- Adding build cookbook to feature branch
- Merging delivery content feature branch to master
```
すると少し差はあるかもですが以下のような構造の first_cookbook ディレクトリが作成されます。

```
CHNAGELOG.md
LICENSE
README.md
chefignore
metadata.rb
recipes
spec
test
```
* recipes 配下 → 実際の処理を書いていきます
* metadata.rb → 他の cookbook や gem などの依存関係を書きます

パッと必要なのは上記くらいかなと。
私の場合は recipes 内の処理でファイルを生成する必要があったので、first_cookbook ディレクトリ直下に templates ディレクトリを作り生成するファイルの雛形をしまいました。

### Opsworks の設定
Stack の設定からカスタムクックブックとして自作した cookbook を設定します。
私は github に cookbook を上げたので、git の URL とブランチ名を指定しました。

作ったレシピは `cookbookの名前::recipe 名` で実行します。
例えば今回 `recipes/generate.rb` というファイルで処理を書いたとした場合は `first_cookbook::generate` で実行できます。
Opsworks では Layer のレシピの設定から処理を走らせたいタイミングに 'first_cookbook::generate' を追加すれば、
思ったタイミングで処理を実行できます。(私は Deploy に設定しました。)
## さいごに
割と簡単に cookbook を作成できました。
文面だけではわかりにくかった方は、非常に簡単なものですが<a href='https://github.com/hirotaka-sasaki/redis_opsworks_cookbook.git' target='_blank'>私が作ったもの</a>を参考にしてみてください。
コードはほぼ AWS のものですw
OctoberCMSでWeb APIを実装する

## TLTR
* 自前のプラグインに実装する。
* `Backend\Classes\Controller`を拡張してコントローラを実装する。
* Plugin.phpと同じディレクトリにroutes.phpを作成する。

## 概要
ここでは、**RESTfulではない**Web APIの実装を説明する。
RESTful APIの実装にはOctoberCMSの[RESTfulプラグイン](https://octobercms.com/plugin/mohsin-rest)を使うとよい。
また、ビューテンプレートからAjaxで呼び出すエンドポイントが欲しい場合は、[OctoberCMSのAjaxハンドラ](https://octobercms.com/docs/ajax/handlers)としてコンポーネントに実装するのが標準的なやりかただ。

## 背景
わざわざ別途Web APIを実装するようなケースは、DBに保持したデータ（リソース）を作成・取得・変更・削除するのではなく、例えば画像ファイルを生成して`<img>`の`src`に指定したい場合など。
RESTfulプラグインはあくまでRESTful用なので、モデルクラスを介したDBのデータのCRUDにのみ対応しているので、こういったケースには向かない。
また、Web APIの実装は簡単なので、一応把握しておくだけでも理解が深まって良い。

## 実装方法
自前のプラグインの適当なディレクトリにコントローラクラスを作成する。
ディレクトリはどこでも良いが、将来的に[RESTfulプラグイン](https://octobercms.com/plugin/mohsin-rest)を使う可能性を考えたら、これに合わせてプラグインルートに`http`ディレクトリを作成するのが良いかも。

<img width="247" alt="Screen_Shot_2018-07-30_at_11_11_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/821f2a81-7f1c-10fc-da3a-450c7a0430b9.png">

コントローラは`Backend\Classes\Controller`を拡張して実装する。もっと基本的なLaravelのコントローラクラスを使うよりも、こちらの方がプロジェクトの設定などを継承してくれるので遥かに楽。

```php
<?php namespace Cocci\Custom\Http;

use Backend\Classes\Controller;

class Images extends Controller
{
    public function hoge()
    {
        return response()->json([
            'name' => 'pikanji',
            'state' => 'Cebu'
        ]);
    }
}
```

この例は単純にJSONフォーマットでデータを返すだけ。

そして、プラグインルートにroutes.phpファイルを作成して、APIパスとコントローラを紐付ける。

<img width="247" alt="Screen_Shot_2018-07-30_at_11_11_44 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/935fb7dd-4327-5c3c-5b09-a80094567033.png">

```php
<?php

Route::get('images', 'Cocci\Custom\Http\Images@hoge');
```

以上で`/images`エンドポイントの出来上がり。

ルーティングについては[こちらのOctoberCMSのドキュメント](https://octobercms.com/docs/services/router)にも詳しく書かれている。

ちなみに、RESTfulプラグインがやっているように、APIパスにプレフィックスを付けてグルーピングするとエンドポイントが増えたときにきれいに整理される。

```php
<?php

Route::group(['prefix' => 'api/v1'], function () {
    Route::get('images', 'Cocci\Custom\Http\Images@hoge');
});
```
この例では`/api/v1/images`というエンドポイントになる。
wxPythonを使ってみる (7)

こんにちは．これからwxPythonを使ってみる(7)について始めたいと思います．
対象や動作環境などのはじめに必要な情報は[wxPythonを使ってみる(1)](https://qiita.com/Kenta-Han/items/5ac4f38d518e3262905f) と同じになります．
また，今回の内容は前の6回の続きとなります．是非読んで見てください．

## 特徴
前回は，GridSizerの主な概要について学びました．
今回は，GridSizerのitem引数とproportion引数について学んで行きたいと思います．

## item引数

1. wx.Button などwx.Window を継承しているオブジェクト
2. wx.BoxSizer などwx.Sizer を継承しているオブジェクト
3. wx.Sizer オブジェクト

上の3つのオブジェクトの1と2はBoxSizerとそれほど差がないですが，3が少し変わります．GridSizerはコンテナー領域をすべて使用して分割を行うため，マスを1つ飛ばすために利用する，というイメージに近いです．
window_display13.pyはitem引数に関する例のプログラムとなります．

```python3:window_display13.py
import wx

class CustomFrame(wx.Frame):
		def __init__(self,title):
			wx.Frame.__init__(self,None,-1,title,size=(400,400))
			
			panel = wx.Panel(self)
			
			layout = wx.GridSizer(2,2,0,0)
			layout.Add(wx.Button(panel,wx.ID_ANY,'B01'),flag=wx.EXPAND)
			layout.Add(wx.Button(panel,wx.ID_ANY,'B02'),flag=wx.EXPAND)
			layout.Add(wx.Size(0,0))
			layout.Add(wx.Button(panel,wx.ID_ANY,'B03'),flag=wx.EXPAND)
			
			panel.SetSizer(layout)
			
			self.Show()
			
app = wx.App(False)
CustomFrame('GridSizer')
app.MainLoop()
```
window_display13.pyの実行結果は下の図となります．

<img width="400" alt="13.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/af1ac67f-8d01-2639-4f39-0b0da5da306a.png">

このように画面上はマスを1つ(左下のマス)飛ばして配置するような形となります．


## proportion引数

proportionは配置されたアイテムのコンテナー領域内煮しめる割合を制御しますが，BoxSizerおよびBoxSizerから派生したSizerでのみ利用可能な引数です．GridSizerではこの引数を利用しても画面上に変化はありません．

window_display14.pyはproportion引数に関する例のプログラムとなります．

```python3:window_display14.py
import wx

class CustomFrame(wx.Frame):
		def __init__(self,title):
			wx.Frame.__init__(self,None,-1,title,size=(400,400))
			
			panel = wx.Panel(self)
			
			layout = wx.GridSizer(2,2,0,0)
			layout.Add(wx.Button(panel,wx.ID_ANY,'B01'))
			layout.Add(wx.Button(panel,wx.ID_ANY,'B02'),proportion=1)
			layout.Add(wx.Button(panel,wx.ID_ANY,'B03'),flag=wx.EXPAND)
			layout.Add(wx.Button(panel,wx.ID_ANY,'B04'),proportion=1,flag=wx.EXPAND)
			
			panel.SetSizer(layout)
			
			self.Show()
			
app = wx.App(False)
CustomFrame('GridSizer')
app.MainLoop()
```

window_display14.pyの実行結果は下の図となります．

<img width="397" alt="14.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/57fcbd47-e602-9235-dd48-79f2430362ee.png">

このようにproportionを設定してもアイテムに変化がありません．

今回のwxPythonを使ってみる(7)は以上で終わります．
読んでいただいてありがとうございます．

### 「wxpythonを使ってみる」目次
* [wxPythonを使ってみる(1)](https://qiita.com/Kenta-Han/items/5ac4f38d518e3262905f)
* [wxPythonを使ってみる(2)](https://qiita.com/Kenta-Han/items/dfd9764aedd64f9f92be)
* [wxPythonを使ってみる(3)](https://qiita.com/Kenta-Han/items/a7a58ad3cf5ae1f67625)
* [wxPythonを使ってみる(4)](https://qiita.com/Kenta-Han/items/89d11908d49c34976071)
* [wxPythonを使ってみる(5)](https://qiita.com/Kenta-Han/items/9b8025b7accae5fa770d)
* [wxPythonを使ってみる(6)](https://qiita.com/Kenta-Han/items/7704a7f39bee882bfd29)
Pythonで合成関数っぽいもの

## はじめに
Pythonで合成関数っぽいものを作るときの、いわゆるPythonらしいコードの書き方です。どんな気持ちでコードを綴っているかを付記しておきます。

## なにがしたいのか
たとえば

```math
f: A \to B\\
g: B \to C
```
みたいな関数が2つあって、

```math
h = g\circ f:A \to C
```
を作りたい。

## 実装例
2つ実装を載せておきます。

### 再帰を使う
実際に前から一つずつ適用していく方法で、一番直感的にスッキリと書けます。

```python
def composite(*funcs):
    f, *rest = funcs
    return lambda *x: composite(*rest)(f(*x)) if rest else f(*x) 

composite(
    lambda x, y: x * y,
    lambda x: 2 * x,
    lambda x: x + 3
)(5, 7)    # (2 * (5 * 7)) + 3 = 73
```

関数列(`*funcs`)をうけとって、

- head(`f`)とtail(`*rest`)に分解し
- headを適用した値(`f(*x)`)を、tailの合成関数(再帰)に適用する
- tailに中身がなきゃheadを適用する
- ような関数を返す

というようなイメージでコードを書いています。
再帰側から先に書いて、終わる条件をあとから付け足すようなイメージで書くと書きやすい構文になっています。


### `reduce`を使う
関数列を畳み込む方法で、使い捨てで書きやすいです。

```python
from functools import reduce

reduce(
    lambda f, g: lambda *x: g(f(*x)),
    [
        lambda x, y: x * y,
        lambda x: 2 * x,
        lambda x: x + 3,
    ]
)(5, 7)    # (2 * (5 * 7)) + 3 = 73
```

畳み込みの関数さえかければ、あとは関数列を並べるだけですね。左から畳み込みます。

- 関数を2つうけとって
- まるっと適用してくれる関数を返す

## さいごに
Pythonはかゆいところに手が届く構文、組み込みがあってよい。
Laravel シチュエーション別対応方法

## 1対多で1のデータの1カラムを取得したい
- 多のModelでbelongsToを定義してやり、取得する

```php
$model = Sample::find(1);
$userName = $model->account[User::USER_NAME];
```

- リレーション

```php
public function user()
{
    return $this->belongsTo(
        User::class,
        User::USER_ID,
        Sample::USER_ID
    );
}
```
UnityWebGLでダウンロードしたファイルを保存して読み込む

# 環境
- Unity2018.2.0f2
- WebGL
- Firefox61.0.1(x64)
- XAMPP


# 注意

[WebGL のブラウザ間での互換性](https://docs.unity3d.com/ja/current/Manual/webgl-browsercompatibility.html)

Application.persistentDataPathの参照先がIndexedDBから始まるハッシュアドレスになっていたので、未検証ですが上記ページにある表で対応していないブラウザorブラウザバージョンだと動作しない可能性があります。

# 結論

WebRequestでjson取ってきてApplication.persistentDataPathに保存。
保存したjson読み込むだけ。

普通に他プラットフォームと同じ感じでできる模様。

- キモとしては以下の二点。
    1. WebGLでもクライアントブラウザ()側でApplication.persistentDataPathが指定できるところ。
    2. ただしファイルとして保存されるのではなくIndexedDBとして保存される。

使い勝手としてはAndroidビルドのUnityの中でFileIO使うのとあんま変わらないんじゃなかろうか。

``` C#:WebGLFileIOTest
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class WebGLFileIOTest : MonoBehaviour {
	IEnumerator Start()
    {
        UnityWebRequest www = UnityWebRequest.Get("http://localhost/resources/test.json");
        yield return www.SendWebRequest();

        if(www.isNetworkError || www.isHttpError) {
            Debug.Log(www.error);
            yield break;
        }

        string dataPath = Application.persistentDataPath + "/test.json";
        File.WriteAllBytes(dataPath, www.downloadHandler.data);
        string fileData = File.ReadAllText(dataPath);
        Debug.Log(fileData);
    }
}
```

# CORSで弾かれる場合

ただ気を付けないといけないのはCORSによってjsonへのアクセスが弾かれるので、その場合は.htaccessを設定してあげましょう。
↓とりあえず仮サンプル。

``` .htaccess:localhost/resources/.htaccess
<IfModule mod_headers.c>
	Header set Access-Control-Allow-Origin "*"
	Header set Access-Control-Allow-Credentials "true"
	Header set Access-Control-Allow-Headers "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time"
	Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
</IfModule>
```

# 結果
できた。

``` json:localhost/resources/test.json
{"hoge":"fuga"}
```

![WS000083.JPG](https://qiita-image-store.s3.amazonaws.com/0/169520/6089ee8a-ff18-cada-49a5-715a487593d1.jpeg)
ProFTPdが起動しない現象のリカバリ（RHEL6.6）

本記事で起こった件の環境の諸versionは以下の通り

 - OS: Red Hat Enterprise Linux Server release 6.6 (Santiago)
 - ProFTPd: ProFTPD Version 1.3.3g

いつものAWSメンテナンスでEC2 instanceのStop & Startを実施した後にProFTPdをいつもの通り

```
/etc/init.d/proftpd start
```

しても戻ってこなかった。

上記起動スクリプトでは「FAILED」しか返してくれなかったが

```
/usr/sbin/proftpd
```

を打ったところ以下エラーを返してくれた


```
- warning: unable to determine IP address of 'ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal'
 - error: no valid servers configured
 - Fatal: error processing configuration file '/etc/proftpd.conf'
```

どうやら自分をホスト名で検索して見つからずエラーとなっている。（xxx部分は自分のプライベートIP）
AWSで設定されているプライベート DNSの値を見ている模様。（AWSのマネコンで確認可能）
hostsに以下を足して

```
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal
::1 localhost.localdomain localhost ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal
```
再度起動を実行

```
/etc/init.d/proftpd start
proftpd を起動中: [OK]
```

起動に成功した
マイクロフレームワーク Flight の簡単なルーティング　

1) まず、ソースをクローンします。

```bash
git clone https://github.com/mikecao/flight.git
```

2) そのまま動かしてみます。

```bash
cd flight
php -S 0.0.0.0:9000
```

ブラウザーで、http://localhost:9000/　にアクセスします。
![flight_jul3001.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4f4c7b2d-9ddb-b1fa-f00b-249d84318ea1.png)

3) index.php を改造します。

```php:index.php
<?php
// -----------------------------------------------------------------
require 'flight/Flight.php';

require 'application/views/greeting.php';


Flight::route('/',array('Greeting','hello'));
Flight::route('/morning',array('Greeting','morning'));
Flight::route('/afternoon',array('Greeting','afternoon'));
Flight::route('/evening',array('Greeting','evening'));


Flight::start();
// -----------------------------------------------------------------
```

4) フォルダーの作成

```bash
mkdir application
mkdir application/views
```

5) greeting.php の作成

```php:application/views/greeting.php
<?php
// -----------------------------------------------------------------
class Greeting {
    public static function hello() {
        echo '*** Greeting ***<p />';
        echo '*** 挨拶 ***<p />';
        echo '*** Jul/30/2018 *** AM 10:37<p />';
    }

// -----------------------------------------------------------------
    public static function morning() {
        echo '*** Good Morning ***<p />';
        echo '*** おはよう ***<p />';
        echo '*** Jul/30/2018 *** AM 10:40<p />';
    }
// -----------------------------------------------------------------
    public static function afternoon() {
        echo '*** Good Afternoon ***<p />';
        echo '*** こんにちは ***<p />';
        echo '*** Jul/30/2018 *** AM 10:45<p />';
    }
// -----------------------------------------------------------------
    public static function evening() {
        echo '*** Good Evening ***<p />';
        echo '*** 今晩は ***<p />';
        echo '*** Jul/30/2018 *** AM 10:55<p />';
    }
// -----------------------------------------------------------------
}
// -----------------------------------------------------------------
?>
```

6) サーバーを再び起動して、アクセスしてみます。

http://localhost:9000/
![flight_jul3002.png](https://qiita-image-store.s3.amazonaws.com/0/179446/caaefaff-40ff-1567-5123-34b7cf444c80.png)

http://localhost:9000/morning
![flight_jul3003.png](https://qiita-image-store.s3.amazonaws.com/0/179446/64c2fb3c-0b47-3a7e-21cb-71680eacbade.png)

[http://localhost:9000/afternoon](http://localhost:9000/afternoon)
[http://localhost:9000/evening](http://localhost:9000/evening)

次のバージョンで確認しました。

```text
$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )``text
```
gradleのバージョンを上げた時のLogBaseSDK(旧LogPushSDK)で発生した問題メモ

#背景
既存Projectで今更ながらgradleのバージョンを2.2.3 -> 3.1.3へ上げた時の備忘録
その中でもlogPush時代のSDKを使用していたことにより、結構困ったことになったためメモ

#発生した問題
- logPush　→　logBaseにSDKの名前が変わっていた。
- NoSuchMethodError

#解決
- logPush　→　logBaseにSDKの名前が変わっていた。

gradleをアップデートしてプロジェクト内の古い参照を削除

```app/build.gradle
implementation('net.p-lucky:logpush-android-sdk:2.0.0@aar') { transitive = true }
```
↓

```app/build.gradle
implementation('net.p-lucky:logbase-android-sdk:3.1.1@aar') { transitive = true }
```
基本的にLogPushの時のpush通知の実装方法に変更は無かった。

- NoSuchMethodError

[Google play services 依存記述について](https://logbase.jp/knowledgebase/developer/faq/android/android-google-play-services-%E4%BE%9D%E5%AD%98%E8%A8%98%E8%BF%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
 LogPush SDK 2.0.0の時の依存関係については書かれているが、LogBase SDK 3.1.3の依存関係は不明。
案の定、GooglePlayConsoleでβ版をリリースした際にNoSuchMethodErrorが発生したのでLogBaseに問い合わせたところ、
LogBase SDKは以下のライブラリのバージョンに依存していると回答をいただいた。

> LogBase v3.1.1は
>
・com.google.android.gms:play-services-ads:11.6.0
・com.google.android.gms:play-services-gcm:11.6.0
・com.google.code.gson:gson:2.7
> に依存しております。


※ちなみに上記ライブラリのverで再度GooglePlayConsoleのリリース前テストで１０端末中8端末でNoSuchMethodErrorが発生したため未解決 & 再び問い合わせ中

エラー内容は以下内容、手元にある端末&エミュレーターでは一切確認できなかったがGooglePlayConsoleのリリース前テストで10端末中８端末で発生

```
FATAL EXCEPTION: Thread-9
Process: com.best_teacher_inc.android, PID: 10515
java.lang.NoSuchMethodError: No direct method <init>(Lcom/google/gson/Gson;)V in class Lcom/google/gson/Gson$1; or its super classes (declaration of 'com.google.gson.Gson$1' appears in /data/app/com.google.android.apps.mtaas.crawler-1T77G3Bwbj_NvCEDDbl0Vg==/base.apk)
	at com.google.gson.Gson.doubleAdapter(Unknown Source:7)
	at com.google.gson.Gson.<init>(Unknown Source:103)
	at com.google.gson.GsonBuilder.create(Unknown Source:75)
	at net.p_lucky.logpop.MessageRuleDiskDataStore.<init>(Unknown Source:25)
	at net.p_lucky.logpop.Injection.b(Unknown Source:2)
	at net.p_lucky.logpop.MessageRuleUpdateService.handleResult(Unknown Source:4)
	at net.p_lucky.logpop.MessageRuleUpdateService.a(Unknown Source:0)
	at net.p_lucky.logpop.MessageRuleUpdateService$1.run(Unknown Source:23)
	at java.lang.Thread.run(Thread.java:764)

```
解決次第追記予定

~~原因のわかる方がおりましたらご教示いただけると助かります。~~

###原因が判明。
GooglePlayConsoleの新しいバージョンのテストの不具合だとLogBaseの方に問い合わせたところ教えていただきました。
[NoSuchMethodError Lcom/google/gson/Gson; upon retrofit response](https://stackoverflow.com/questions/51557749/nosuchmethoderror-lcom-google-gson-gson-upon-retrofit-response/51566968)
twitterで自分がフォローしている人のつぶやきの中で一定数以上のfav,rtがある呟きを抽出して表示させるものを作りたいのですがどうすればいいでしょうか？

全くのプログラミング初心者なのですが、twitterで自分がフォローしている人のつぶやき(tl上のもの)の中で一定数以上のいいねとrtがあるものを抽出して表示させたいのですが何をどうすればいいのでしょうか？
Twitterがjavaで出来ているということまでは分かったのですが、どういう方向性で勉強をすればいいのかわからないので何か少しでもアドバイスをもらえたら嬉しいです
lazuriteでsd-card

#概要
lazuriteでsd-cardやってみた。

#写真
![CIMG2667.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/da459d5a-efaf-b578-49e4-e708031a26e5.jpeg)


#回路図
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/6462417b-81b0-4e24-3383-3baaad299e2b.png)

#サンプルコード

```
#define SDSPI_SS_PIN 		( 4 )
#define BUF_SIZE		 	( 32 )
#define SECOND 				( 0 )
#define MINUTE 				( 0 )
#define HOUR	 			( 10 )
#define DAY					( 30 )
#define MONTH				( 7 )
#define YEAR	 			( 18 )
void initRTC() 
{
	Serial.println("RTC started.");
	RTC.begin();
	RTC.setTime(HOUR, MINUTE, SECOND);
	RTC.setDate(DAY, MONTH, YEAR);
}
void setup() 
{
	st_File_v myFile;
	static uint8_t writebuf[] = "testing 1, 2, 3.";
	static uint8_t readbuf[BUF_SIZE+1];
	uint16_t remained;
	File.init(&myFile);
	Serial.begin(115200);
	initRTC();
	Serial.println("\nInitializing SD card...");
	if (!SD.begin(SDSPI_SS_PIN)) 
	{
		Serial.println("Initializing failed.");
		return;
	} 
	else 
	{
		Serial.println("\nInitializing successed and card is present.");
	};
	if (SD.open("test.txt", FILE_WRITE_APPEND, &myFile)) 
	{
		Serial.print("Writing to test.txt...");
		File.write(&myFile, writebuf, sizeof(writebuf)-1);
		File.close(&myFile);
		Serial.println("\ndone.");
	} 
	else 
	{
		Serial.println("\nerror opening test.txt");
	}
	if (SD.open("test.txt", FILE_READ, &myFile)) 
	{
		Serial.println("Reading from test.txt:");
		while ((remained = File.available(&myFile)) != 0) 
		{
			if (remained > BUF_SIZE) remained = BUF_SIZE;
			File.read(&myFile, readbuf, remained);
			readbuf[remained] = NULL;
			Serial.print(readbuf);
		}
		File.close(&myFile);
		Serial.println("\ndone.");
	} 
	else 
	{
		Serial.println("\nerror opening test.txt");
	}
}
void loop() 
{
}




```

#結果

```
RTC started.

Initializing SD card...

Initializing successed and card is present.
Writing to test.txt...
done.
Reading from test.txt:
testing 1, 2, 3.testing 1, 2, 3.testing 1, 2, 3.
done.

```

以上。
iterm(zsh)が立ち上がらなくなった時の対処法

## 現象
以下エラーになってiterm(zsh)が突然立ち上がらなくなった。

```
dyld: Library not loaded: /usr/local/opt/gdbm/lib/libgdbm.4.dylib
  Referenced from: /usr/local/bin/zsh
  Reason: image not found

[プロセスが完了しました]
```

## 対処法：zshをインストールし直した

と言っても全然itermが動かないし、ターミナルも動かないので
一旦zshをbashに戻す必要があった

bashに戻してから以下を実行

```
brew reinstall zsh && brew unlink zsh && brew link zsh
```

これで動くようになりました。

## thanks 
https://qiita.com/Kansei/items/4029a0dff197039c5e78
https://qiita.com/ktnyt/items/3eb7c4c53caf085d28b4
https://stackoverflow.com/questions/24103888/error-loading-library-in-mac-terminal
Centos7｜amazonlinux2の時間がずれた

# 状況
きっかけとしてeb createコマンドがこけて気が付きました。

```error.shell

$ eb create examplecojp-env --database --timeout 30
ERROR: NotAuthorizedError - Operation Denied. Signature expired: 20180729T223841Z is now earlier than 20180729T225031Z (20180729T225531Z - 5 min.)

```

# 調査
何やらntpというものがあり時間を調整してくれるシステムとのこと
で、Chronyというツールがcentos7の標準デーモンとなったとのことなので
こちらをインストールしてみる。

#chronyインストール

```install.shell

$ yum install -y chrony

```

# 設定
日本の標準時間を作っているNICTという機関があり
そちらに合わせる形でchronyを設定していく。
設定ファイルの場所はこちら
/etc/chrony.conf

```/etc/chrony.conf

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

# 追記するのは以下2行
server ntp.nict.jp iburst
stratumweight 0

```

# chronyの自動起動設定

```autostart.shell

$ systemctl start chronyd


```

# 起動、状態確認

```up.shell

$ systemctl status chronyd

```


# 起動直後は同期されない
ので強制的に同期するようにします。

```sync.shell

$ chronyc -a makestep
#ここで501エラーが出たらsudoを頭につけて実行してみる
$ sudo chronyc -a makestep
#200が帰って来れば成功

```

# 確認
dateコマンドで確認します。

```date.shell

$ date

```

# 原因
つかみかねております。
windows10+virtualbox+vagrantな仮想環境で動かしているのですが
よくわかっておりません。
もし確認ポイントなどご存知でしたらコメントいただければ嬉しいです。

# 追記
amazonlinuxでも適用できたのでタイトルに追記しました。
Tableauにデータを取り込む際の注意点

#はじめに
Tableauはビッグデータを可視化する際、簡単に数表やグラフを作成・可視化することが出来る
便利なツールです。

そんなTableauにビッグデータを取り込み可視化することをよく行っていますが、
データを取り込む際に注意しないとすべてのデータが取り込まれていないことがあります。

特に数十万、数百万件のデータを扱っていると、データが正しく取り込まれていないことに
気づかず集計してしまい、やり直しなんてことがあるので注意が必要です。

#サンプルデータ
**次の10,000件のテキストデータをサンプルとして読み込みます。**

| ID       |    AUTHOR      |        TITLE       |
|:---------|:---------------|:-------------------|
| 1000     |    太宰治      |  人間失格          |
| 2000     |    太宰治      |  走れメロス        |
| 3000     |    太宰治      |  斜陽              |
| 0000     |    ○○○○    |  ××××          |
| 0000     |    ○○○○    |  ××××          |
| ・・・     |    ・・・    |  ・・・          |
| C99998  |    宮沢賢治    | 銀河鉄道の夜       |
| D99999  |    宮沢賢治    | セロ弾きのコ"ーシュ|
| E10000  |    宮沢賢治    | 注文の多い料理店   |

○ 今回のサンプルデータは、ID「D99999」の「セロ弾きのコ"ーシュ」の
　「ゴ」をあえて「コ」+「"」にしてあります。

#ファイル読み込み
**Tableauを開き「テキストファイル」からファイルを読み込んで、そのままシートで取り込んだ値を
確認してみます。**

![1.png](https://qiita-image-store.s3.amazonaws.com/0/270976/ee1013fd-d7b9-77d1-7cf0-7b4591e8419a.png)

#２つのおかしな点
**そうすると、下記の２点がおかしいことに気がつきます。**

 - 1点目はIDにNULL値が存在すること
 - 2点目は総計値が10,000件ではなく、9,999件であること


![2.png](https://qiita-image-store.s3.amazonaws.com/0/270976/7ed59ac2-0707-794b-1771-faed0087ca2e.png)

##1点目：データ型に誤りがある
**Tableauは最初の凡そ数百レコードで型を自動判定してしまうため、
値に数値と文字列が混在し初めに数値のみが並ぶような列は、特に注意が必要です。**

○ データソースシートに戻り、下記赤枠の数値型「#」を文字列型「Abc」に変更することで
　正常に取り込むことが出来ます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/270976/4fb8a13e-6242-1982-79b3-c3cd2c3cec55.png)

**これでID列は無事に取り込むことが出来ました。**

![4.png](https://qiita-image-store.s3.amazonaws.com/0/270976/ed5c0e9f-e396-a56b-a45b-2d8fde10ae87.png)

##２点目：テキスト修飾子に誤りがある
**Tableauは読み込む値の修飾子がデフォルトで「自動」に設定されています。
「自動」の場合、値が「"」(ダブルクォーテーション)で囲まれていると認識されてしまうようです。**

そのため、サンプルで用意した「セロ弾きのコ"ーシュ」の「コ"」以降の行が読み込まれませんでした。
これはなかなか気づきにくいので見落としがちです。

○ データソースシートに戻り、「テキストファイルプロパティ」からテキスト修飾子を「なし」に
　変更することで正常に取り込むことが出来ます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/270976/6d768276-9baf-7d47-625c-8633cff4eb20.png)

**これで10,000件のデータをすべて取り込むことが出来ました！！**

![6.png](https://qiita-image-store.s3.amazonaws.com/0/270976/390bf0d6-fa33-efa4-bb5e-b7b128cd69a1.png)

#おわりに
Tableauは、はじめに述べた通りビッグデータを可視化するのに大変便利なツールです。
設定も自動で色々やってくれるので便利なのですが、ツールをきちんと使うためには、
取り込むデータにはどのような値が入っているのか、
取り込んだ値の型はどうするべきなのか（計算で使用するのか表示値なのか）など、
自分の扱っているデータをちゃんと理解して使うことが大事なのだと思います。
flutterでアプリのバージョンを取得する

Flutterでアプリのバージョン情報を取得するには公式の[package_info](https://github.com/flutter/plugins/tree/master/packages/package_info)プラグインを使用します。


```pubspec.yaml
  # dependencies:に追記
  package_info: 0.3.2
```

情報の取得は非同期になります。画面に表示するにはFutureBuilderやStatefullWidgetを使うのがよいでしょう。
versionは`1.0.0`のような情報、buildNumberはAndroidでいうVersionCode、iOSでいうCFBundleVersionです。

```dart|使い方
import 'package:package_info/package_info.dart';

PackageInfo packageInfo = await PackageInfo.fromPlatform();

String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;
```
ICOOON MONOの画像が透過画像にならない

超局所的記事ですが、
ICOOON MONOというフリーアイコンを提供してくれている
超便利サイトがあります。
[ICOOON MONO](http://icooon-mono.com)



##透過画像にならない
そちらの画像を利用する際に「透過画像」にならないエラーが出たので対処法をご紹介します。

画像の保存方法を`.jpeg`ではなく`.png`にすればいけます。

オリジナルのアプリを作成する際にはよく使うと思われるので参考にしてください！
QtのQTextCodec::availableCodecs();で取得できる文字コード一覧

思ったよりたくさんあったのでメモ

[00]"UTF-8"
[01]"ISO-8859-1"
[02]"latin1"
[03]"CP819"
[04]"IBM819"
[05]"iso-ir-100"
[06]"csISOLatin1"
[07]"ISO-8859-15"
[08]"latin9"
[09]"UTF-32LE"
[10]"UTF-32BE"
[11]"UTF-32"
[12]"UTF-16LE"
[13]"UTF-16BE"
[14]"UTF-16"
[15]"System"
[16]"roman8"
[17]"hp-roman8"
[18]"csHPRoman8"
[19]"TIS-620"
[20]"ISO 8859-11"
[21]"WINSAMI2"
[22]"WS2"
[23]"Apple Roman"
[24]"macintosh"
[25]"MacRoman"
[26]"windows-1258"
[27]"CP1258"
[28]"windows-1257"
[29]"CP1257"
[30]"windows-1256"
[31]"CP1256"
[32]"windows-1255"
[33]"CP1255"
[34]"windows-1254"
[35]"CP1254"
[36]"windows-1253"
[37]"CP1253"
[38]"windows-1252"
[39]"CP1252"
[40]"windows-1251"
[41]"CP1251"
[42]"windows-1250"
[43]"CP1250"
[44]"IBM866"
[45]"CP866"
[46]"csIBM866"
[47]"IBM874"
[48]"CP874"
[49]"IBM850"
[50]"CP850"
[51]"csPC850Multilingual"
[52]"ISO-8859-16"
[53]"iso-ir-226"
[54]"latin10"
[55]"ISO-8859-14"
[56]"iso-ir-199"
[57]"latin8"
[58]"iso-celtic"
[59]"ISO-8859-13"
[60]"ISO-8859-10"
[61]"iso-ir-157"
[62]"latin6"
[63]"ISO-8859-10:1992"
[64]"csISOLatin6"
[65]"ISO-8859-9"
[66]"iso-ir-148"
[67]"latin5"
[68]"csISOLatin5"
[69]"ISO-8859-8"
[70]"ISO 8859-8-I"
[71]"iso-ir-138"
[72]"hebrew"
[73]"csISOLatinHebrew"
[74]"ISO-8859-7"
[75]"ECMA-118"
[76]"greek"
[77]"iso-ir-126"
[78]"csISOLatinGreek"
[79]"ISO-8859-6"
[80]"ISO-8859-6-I"
[81]"ECMA-114"
[82]"ASMO-708"
[83]"arabic"
[84]"iso-ir-127"
[85]"csISOLatinArabic"
[86]"ISO-8859-5"
[87]"cyrillic"
[88]"iso-ir-144"
[89]"csISOLatinCyrillic"
[90]"ISO-8859-4"
[91]"latin4"
[92]"iso-ir-110"
[93]"csISOLatin4"
[94]"ISO-8859-3"
[95]"latin3"
[96]"iso-ir-109"
[97]"csISOLatin3"
[98]"ISO-8859-2"
[99]"latin2"
[100]"iso-ir-101"
[101]"csISOLatin2"
[102]"KOI8-U"
[103]"KOI8-RU"
[104]"KOI8-R"
[105]"csKOI8R"
[106]"Iscii-Mlm"
[107]"Iscii-Knd"
[108]"Iscii-Tlg"
[109]"Iscii-Tml"
[110]"Iscii-Ori"
[111]"Iscii-Gjr"
[112]"Iscii-Pnj"
[113]"Iscii-Bng"
[114]"Iscii-Dev"
[115]"TSCII"
[116]"GB18030"
[117]"GBK"
[118]"GB2312"
[119]"CP936"
[120]"MS936"
[121]"windows-936"
[122]"EUC-JP"
[123]"ISO-2022-JP"
[124]"Shift_JIS"
[125]"JIS7"
[126]"SJIS"
[127]"MS_Kanji"
[128]"EUC-KR"
[129]"cp949"
[130]"Big5"
[131]"Big5-HKSCS"
[132]"Big5-ETen"
[133]"CP950"
Vue.jsで静的にOGP対応する

とりあえず方法が知りたい人は、[これが結論](#これが結論)まで飛んでください。

# OGPの基礎知識

OGPはサイトをSNSでシェアする時に出てくるサムネイルと概要を設定する機能のことです。
HTMLのヘッダー内にmetaタグを記述することで実現できます。

最低限必要なmetaタグは以下の通りです。

```html
<meta property="og:title" content="The Rock" />
<meta property="og:type" content="video.movie" />
<meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
<meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
```

参照：[ogp.me](http://ogp.me/)

ここで注意するのは、サイトのurlもimageのurlもパスではなくURLで指定するということです。他の人が他のサイトに埋め込むコンテンツなのだから、そういうものなのでしょう。
サイトがOGPに対応しているかどうかを調べるには、以下のページが有用です。
https://cards-dev.twitter.com/validator
https://developers.facebook.com/tools/debug/sharing/

# vue.jsにOGPを追加する際の問題点

まず、vue.jsのデフォルトの機能では``<head>``を書き換える機能がありません。
これについては[vue-head](https://github.com/ktquez/vue-head)というプラグインでなんとかなりますが、根本的な問題としてOGPを読みにくる様々なサーバのbotは、そのほとんどがjavascriptを展開しないという問題があります。
つまり、いくら動的に``<head>``を書き換えてもOGP対応という点においては意味がないのです。

# どのような対応法があるか？

## SSR ( Server Side Rendering ) をする

アクセスが来た時にサーバの側でページをレンダリングしてからユーザに返すという方法です。
しかし、動的にコンテンツを生成できるサーバを用意することが必要で、静的なホスティングサーバにデプロイする予定の時は使えません。

## プリレンダリングする

事前にレンダリングしたページを用意するという方法です。SSRを使う方法と比べるとサーバを用意する必要がなくお手軽です。
参照：[Vue.jsのプリレンダリングで手軽なOGP対応](https://qiita.com/mio3io/items/bd2d91fc2a7785f9022c)
しかし、これをするとそもそもSPAではなくなってしまうという点があります。Vue.jsを効率的に静的なウェブサイトを開発するものというだけの意味で使っているのならばこれを採用してもいいでしょうが、SPAの利点を活用したいのならば採用は難しいと思われます。

これらの点を加味して、私は以下の方法を採用しました。

# テンプレート内に直接OGPを書き込む

最初に問題点を挙げておくと、OGPの内容を動的に変更することはできず、全てのページで同じ内容のOGPになります。でも、トップページのみ正確にOGPに対応していればいいや、という考えのもとこれを採用しました。
この方法でも一応、トップページ以外のURLをシェアされてもちゃんとシェアされたURLに飛ぶことができます。タイトルやdescriptionはトップページと同じものになりますが。
以下、方法です。特殊なプラグインなどは必要ありません。

# これが結論
まず、プロジェクトのルートディレクトリを開きます。そこにindex.htmlというテンプレートファイルがあるので、その``<head>``内にOGPに必要なmetaタグを入れるだけです。
Vue.jsでwebアプリ作ってみた

#序
vue.jsを少し囓ったので何か作りたくなったので、作りました。
サーバーサイドの知識がないので「ぐるなび web service」を利用しています。
<a href='https://jquerystudy.info/test/gps/' target='_blank'>
![0729.png](https://qiita-image-store.s3.amazonaws.com/0/214180/d464cc46-c658-099a-dc2a-6116d390c621.png)
</a>
　
#アプリ概要
作ったのは以下の動画のようなアプリで、スマホのGPS機能を利用して最寄りのランチ店を検索しgoogleの経路検索に繋ぎます。
店のデータはぐるなびapiから取得しています。
<a href='https://youtu.be/ozeZbbSq-ac' target='_blank'>
Youtube動画
![0729_2.png](https://qiita-image-store.s3.amazonaws.com/0/214180/61c6e5a5-e6c5-8205-933e-87125fa7a894.png)
</a>
######※動画のデモはGPSを搭載していないPCで収録しているため現在地は実際とは異なる場所となっています（なぜ綾瀬？）。

　
#アプリへのリンク
<a href='https://jquerystudy.info/test/gps/' target='_blank'>Lunch navi（ランチナビ）</a>

スマホで動作確認していますが、PCでもGPSを搭載していれば、IE以外のブラウザで機能すると思います。


　
#vue.jsの使いどころ
ソースはminifyせずにコメントを付けています興味のある方は色々確認してみてください。メニューの折りたたみやsvgの直書きがあるため複雑そうに見えますが、根幹は以下の部分でシンプルだと思います。

```html:index.html
<template v-for="(data, key) in guruObj">
	<div :id="'card' + key" class="card">
		<h4>{{data.dist}}m</h4>
		<div class="category">{{data.cateSmall}}</div>
	</div>
			
	<div :id="'card' + key + '_out'" class="pf_out">
		<div :id="'card' + key + '_in'" class="pf_in"></div>
		<div :id="'card' + key + '_detail'" class="cardDetail">
			<div class="detailText">{{data.shopName}}<br>
				<span class="price">ランチ平均予算：{{data.lunchPrice}}</span>
			</div>
			<div class="btnArea">
				<a class="btnDetail btnURL" target="_blank" :href="data.mURL">URL</a>
				<a class="btnDetail btnMap" target="_blank" :href="data.googleURL">経路</a>
			</div>
		</div>
	</div>	
</template>
```
ぐるなびapiから返されたデータを基にv-forでメニューを作成しているだけです。メニューの折りたたみ機構を実現するため装飾的なdiv要素が多いのですが、構成自体はシンプルなのが確認できると思います。

ちなみにメニューの折りたたみ（css）は過去に記事にしているので興味のある方は見ていってください。
<a href='https://qiita.com/designdrill/items/550aa16fae973a3549b1' target='_blank'>Qiita : cssアニメによる立体的な折り畳み</a>
　


#vue.jsの地味な利点
javascript側で検索件数や検索範囲を変更した際に、html側の説明文を修正し忘れるということは意外とあると思うのです（私だけ？）。

しかしvue.jsを利用すれば以下の様にjavascript側の設定を、そのまま表示できるため修正ミスがありません。
######※下図のnaviRange、listMaxの部分

```html:index.html
<p>
スマホのGPS機能を利用して現在地から約 {{naviRange}} 以内で
ランチ営業している店舗を最大 {{listMax}} 件までリスト表示します。
以下のボタンで条件の絞り込みができます。
</p>
```
　
#遷移アニメについて
vue.jsのアニメ機能には期待してなかったのですが、意外と高機能で不自由しませんでした。アラートを表示するときも「背景を黒くフェード」してから「アラート表示」と多段階の演出にしたのですが、これもvue.js単独で実現できました。

```html:index.html
<div id='modal' v-if='errFlg'>
	<transition name="fadeUp" v-on:after-leave="errWindowOut">
	//中略
	</transition>
</div>
```

これはtransitionタグのafter-leaveイベントを利用しています。これを設定すると「〜が終わった後に〜する」というのが簡単に実現できます。
　
#まとめ
サーバーと連動したくさんのデータを扱うようなコンテンツではVue.jsは便利だと思いました。
PC-88 フロッピーIPLサンプル

```ipl.asm
; z88dk / PC-8801 mon
; z80asm -b -l ipl.asm

        org     $c000
start:
        ld      hl, msg
        ld      de, $f3c8
        ld      bc, 12
        ldir
.loop
        jr      loop

msg:    defm    "hello, world"
```

ドライブ1にN88-BASICシステムディスクをセットして起動する。ドライブ2にデータディスクを作成する。

`mon`
フィルメモリで領域をクリア
`h]fc000,c0ff,0`
t88ファイルを読み込むかEコマンドなどでIPLを入力する。
CTRL-W（ライトディスク）コマンドでドライブ2、サーフェス0、トラック0、セクタ1にIPLを書き込む。
`h]^w2,0,0,1,c000,c0ff`
![ipl1.png](https://qiita-image-store.s3.amazonaws.com/0/257554/70ee72d2-b12f-cc20-901e-aa4cf284395e.png)

ドライブ1に作成したIPLディスクをセットして起動する。
![ipl2.png](https://qiita-image-store.s3.amazonaws.com/0/257554/77fd5597-0dda-29f9-348a-b3a16628a087.png)
転移学習の数理

## 転移学習
###はじめに
本記事では参考論文を元にして．転移学習の数理を断片的に紹介するものです．
詳しくは元の論文を参考にしてください．
あくまでも転移学習の雰囲気を味わう物だということで過度な期待はしないでください．
数式が分からなければ絵だと思ってお酒を片手に眺めるだけでも良いでしょう．

ではさっそく，用語の説明から．
ドメインには二種類あり．転移する知識を送る側をソースドメイン(source domain)，受け取る側をターゲットドメイン（target domain）と呼びます．

定式化
$\mathcal { D } = \\{ \mathcal { X } , P ( X ) \\}$であり，$\mathcal{X}$は特徴空間です．
$P ( X ) $は周辺確率分布であり，$X = \\{ x _ { 1 } , \dots , x _ { n } \\} \in \mathcal { X }$を満たします．

###教師あり手法の定式化
以下のような最適化問題を解きます．
$argmin _ { A , U } \sum _ { t \in \{ T , S \} } \sum _ { i = 1 } ^ { n _ { t } } L \left( y _ { t _ { i } } , \left\langle a _ { t } , U ^ { T } x _ { t _ { i } } \right\rangle \right) + \gamma \| A \| _ { 2,1 } ^ { 2 }$
$\text { s.t. } \quad U \in \mathbf { O } ^ { d }$
Sはソースドメイン，Tはターゲットドメインです．$U$は元の高次元データを低次元表現にマッピングするための直交行列（マッピング関数）です．
第二項は正則化項です．

###教師なし手法の定式化
次はスパースコーディングを用いた手法です．
このアルゴリズムは2ステップからなっています．

$\min _ { a , b } \sum _ { i } \left\| x _ { S _ { i } } - \sum _ { j } a _ { S _ { i } } ^ { j } b _ { j } \right\| _ { 2 } ^ { 2 } + \beta \left\| a _ { S _ { i } } \right\| _ { 1 }$
$\text { s.t. } \quad \left\| b _ { j } \right\| _ { 2 } \leq 1 , \forall j \in 1 , \ldots , s$

この最適化問題を解くことによって，基底ベクトル$b_j$がソースドメインから学習されます．
次に以下の目的か関数を最小化して終了です．
$a _ { T _ { i } } ^ { * } = \arg \min _ { a _ { T _ { i } } } \min \left\| x _ { T _ { i } } - \sum _ { j } a _ { T _ { i } } ^ { j } b _ { j } \right\| _ { 2 } ^ { 2 } + \beta \left\| a _ { T _ { i } } \right\| _ { 1 }$

### 転移学習の仮定
<img width="680" alt="IMG_0731.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33329/ca5b41fc-5cbd-fb67-b26b-e853b62144bf.jpeg">

ここからは私のトンデモですが．以下のように捉えてもいいかもしれません．
![無題の図形描画 (2).png](https://qiita-image-store.s3.amazonaws.com/0/33329/69530c14-bde4-7813-ad23-e9770d72b176.png)

[追記:2019/06/27]
実際にDiscrepancyMaxmization(DM）アルゴリズムというものが存在します．
ソースドメインの分布Aとターゲットドメインの分布BのDiscrepacyを最小化（最大化）するアルゴリズムです．

参考
[A Survey on Transfer Learning](https://www.cse.ust.hk/~qyang/Docs/2009/tkde_transfer_learning.pdf)
Sinno Jialin Pan and Qiang Yang Fellow, IEEE
[転移学習：神嶌](http://www.kamishima.net/archive/2010-s-jsai_tl.pdf)
[転移学習のサーベイ：神嶌](http://www.kamishima.net/archive/2009-tr-jsai_dmsm1-PR.pdf)
ワイルドカードセグメントを使ってNo route matchesに対応する

## 環境

ruby 2.5.1
Rails 5.0.6

## 方法
どこにも一致しないURLにアクセスされた場合、`ApplicationController#render404`を呼び出すことで、404ページをrenderします。

### ルーティングの設定
ワイルドカードセグメントを用いることで、あらゆるルーティングを拾うことができます。

```rb:config/routes.rb
MyApp::Application.routes.draw do

  ...

  get '*unmatched_route' => 'application#render404'
end
```

例えば上記のルーティングだと、`/hoge/fuga`にアクセスした場合のパラメータは以下のようになります。

```sh
Started GET "/hoge/fuga" for ::1 at 2018-07-30 08:04:12 +0900
Processing by ApplicationController#render404 as HTML
  Parameters: {"unmatched_route"=>"hoge/fuga"}
```

#### 参考
- [Rails のルーティング | Rails ガイド](https://railsguides.jp/routing.html#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B0%E3%83%AD%E3%83%96%E3%81%A8%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88)


### render404の設定

`protect_from_forgery`を設定しているので少し注意が必要です。
jsフォーマットの場合はそのまま`text/javascript`としてrenderしてしまうと`InvalidCrossOriginRequest`と怒られてしまうので、以下のように`render404`は`except`してやるか、

```rb
protect_from_forgery with: :exception, except: :render404
```

jsフォーマットのときだけrenderする内容を変更してあげればOKです :ok_woman: 

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception

  ...

  def render_404
    respond_to do |format|
      format.html { render "path/to/error_page", layout: "errors", status: 404 }
      format.js { render json: '', status: :not_found, content_type: 'application/json' }
      format.any { head :not_found }
    end
  end

  ...

end
```

#### 参考
- [rails/request_forgery_protection.rb at v5.0.6 · rails/rails](https://github.com/rails/rails/blob/v5.0.6/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L236-L257)
- [gitlab](https://github.com/gitlabhq/gitlabhq/blob/v11.0.4/app/controllers/application_controller.rb#L164-L171)

以上です :pray:
【読了までは随時更新】コーディングを支える技術を読んでのまとめ

# 概要

良いと聞きつつちゃんと読んでまとめたことがなかったので、まとめる


# 言語を効率よく学ぶには

## 言語に依存しない知識

言語に依存する知識のみを学んでいくとこれから５年１０年後に通用する知識を学んだ方が良い。
言語の歴史や、その文法が作成された経緯などをわかっておけば、このあと生まれてくる言語であっても、すぐに適応することが可能となる。

# プログラミング言語を俯瞰する

## プログラミング言語によって違う「楽さ」

1. プログラミング言語が作られた背景には必ず楽にしたいことがある
2. それが何を楽にしたいのかを把握すると言語の仕様が見えてくる

ex)

1. C++: コードの高速さを重視 => 言語仕様は複雑
2. Scheme: 言語仕様の把握が楽になることを重視 => かっこが多い
3. Python: コードを読むのが楽になることを重視 => あまり早くないし、言語仕様がコンパクトなわけでもない
4. PHP: webサービスを書くのを楽にしたい => 言語処理系を楽になることを目指していない

上記のように言語によって楽なことは違うので目的によってどの言語が適切なのかを見てみると良い。

#文法の誕生 



# 処理の流れをコントロール

# 関数

# エラー処理

# 名前とスコープ

# 型

# コンテナと字文列

# 並行処理

# オブジェクトとクラス

# 継承によるコードの再利用