OmniAICreator/Qiita-1.07M huggingface dataset:
[Vue.js]小数や整数しか入力できないinputタグのカスタムコンポーネント

# 2020/06/01追記
[[今度こそ完全に理解した]vueで数字しか入力できないinputタグのカスタムコンポーネントを作る](https://qiita.com/rh_taro/items/c44d2c6783c27d6bdd03)
の方で諸問題に対応したコードを公開したのでそちらを参照して頂けると。。。

# 以前
[vue.jsで「数字」しか入力できないinput要素を作る](https://qiita.com/rh_taro/items/a8ffd51264d1767dd1d0)
という記事を書いた話の続き(?)で
今回は小数の場合の追加とカスタムコンポーネント化をしました

# おさらい
htmlで

```html
<input type="number">
```
って書くと
「0」「1」「2」「3」「4」「5」「6」「7」「8」「9」
の他に
「e」「.」「+」「-」なども入力できてしまう
都合が悪い時がある

# 答え
```vuejs:InputComponent.vue
<template>
  <div>
    <input
      type="text"
      ref="input"
      :value="innerValue"
      @input="validateInput($event.target.value)"
    >
  </div>
</template>

<script>
export default {
  name: 'InputComponent',
  props: ['value', 'type'],
  computed: {
    innerValue: {
      get() {
        return this.value;
      },
      set(val) {
        this.$refs.input.value = val; // 見た目に反映するため
        this.$emit('input', val);
      },
    },
  },
  methods: {
    validateInput(val) {
      switch (this.type) {
        case 'integer':
          this.innerValue = this.validateInteger(val);
          break;
        case 'decimal':
          this.innerValue = this.validateDecimal(val);
          break;
        default:
          this.innerValue = val;
          break;
      }
    },
    validateInteger(val) {
      // 数字以外を消す
      return val.replace(/\D/g, '');
    },
    validateDecimal(val) {
      // 小数のフォーマットに一致する部分を切り出して一致している部分のみで上書き
      // 末尾ドットは入力途中の過程で必要だから許可する ※1
      const result = val.match(/^(\d+)(\.\d*)?/u);
      return result ? result[0] : '';
    },
  },
  mounted() {
    this.validateInput(this.innerValue);
  },
};
</script>
```

# 使い方
```vuejs:Form.vue
<template>
  <form>
    <!-- 整数のみ -->
    <input-component
      v-model="valInteger"
      :type="`integer`"
    />

    <!-- 整数または小数のみ -->
    <input-component
      v-model="valDecimal"
      :type="`decimal`"
    />
  </form>
</template>
<script>
import InputComponent from '@/components/InputComponent';
export default {
  name: 'Form',
  components: {
    'input-component': InputComponent,
  },
  data() {
    return {
      valInteger: '',
      valDecimal: '',
    };
  },
}
</script>
```

# ※1解説
小数を検知する正規表現はこちらの記事を参考にカスタマイズしました
[【Javascript】正規表現で整数と少数にマッチさせる。](http://note.onichannn.net/archives/1673)

整数部分と小数部分無制限にマッチさせる正規表現が
`^([1-9]\d*|0)(\.\d+)?$`
とありましたが

- 整数部は`\d+`でいい気がするので改変
- 末尾ドットを許可するために小数部は`(\.\d*)`へ改変
- 最後に意図しない文字が入力されても「マッチしない」という結果ではなく「意図しない文字より前の部分が一致する」という結果にしたいので末尾の`$`を外す

結果
`/^(\d+)(\.\d*)?/u`に改変して使っています

`/^(\d+)(\.)?(\d*)/u`
の方が意味がわかりやすいかな

# その他参考記事
https://qiita.com/ktkiyoshi/items/cbbb002a4fb9a0ff9a27
https://joe-noh.hatenablog.com/entry/2017/09/01/235943

# 正規表現の神様へ
だめじゃんこの正規表現って箇所ありましたらご指摘いただけると助かります

正規表現好きですが穴があることが稀によくあるので。。。。
Railsで特定のカラムについて、モデル内での順位を取得する方法

## Railsで特定のカラムについて、モデル内での順位を取得する方法

例えば、Channelモデルについてsubscriver_countカラムで見たときの順位を取得する方法を解説します。

```ruby
@channel = Channel.find(params[:id])
@ranking = Channel.where('subscriber_count >= ?', @channel.subscriber_count).count
```
このように、whereメソッドとcountメソッドを使うことで達成できます。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Chrome の DevTools>Sources>Snippets を backup/restore する

最近は PC 買い替えた際に新環境のブラウザ拡張やブックマークなんかはアカウント同期のおかげでやることほぼ無いし、Tampermonkey や Stylus の設定なんかもちょっと頑張った拡張ではそれぞれでクラウド同期やバックアップ/リストアの機能が用意されてる多いのであまり手間がかからなくて良いですね。

ですがそんな中、DevTools>Sources>Snippets に登録したスクリプト群に関してはアカウント同期の範疇外だし、それっぽい拡張も無いっぽい(そもそも出来るのか？）のでどうすっかなーと軽く調べてみたら何とかなったのでここに手順メモを記す。

# DevTools の DevTools を開く

1. `command + option + i` で1段目のDevToolsを開く
2. 1段目のDevToolsを別ウィンドウ化する（DevToolsの右上の`︙`をクリック>Dock Side で 別ウィンドウ/左/下/右 が選べます）
3. 別ウィンドウ化されたDevTools内でもう一度 `command + option + i` すると2段めのDevToolsが開きます

2段目のDevTools内のコンソールでは `InspectorFrontendHost` というインターフェースが使えてこいつ経由でスニペット設定を取得/設定が出来るのだ。なお1段目のDevTools内では `InspectorFrontendHost` は `not defined` でした。2段目のコンソールのコンテクストでは他にも普段見かけないインターフェースがいろいろあるようなので暇な時に見てみると面白そうです。

# スニペット設定の取得/更新方法
スニペットのバックアップとリストアの事前準備としてまずは前セクションに書いた手順で DevTools の DevTools を開いてそのコンソールでスタンバイしておきます。

おもむろに `InspectorFrontendHost.getPreferences(p => console.log(p))` とかをコピペ実行してみるとコールバック内で `p.scriptSnippets` からスニペット一覧のJSON文字列が取得出来ることがわかります。
設定（リストア)するには逆に `InspectorFrontendHost.setPreference("scriptSnippets", JSON文字列化したscriptsSnippetsの値)` としてやることで丸ごと上書きな形でリストアが出来るようです。

さて旧PCから、新PCへスニペットを移植するだけならぱぱっとコピペで出来ると楽ちんなので、ミスも手間も省けるワンライナーを用意してみました。

## バックアップ側で実行するコード
↓こんな感じです。

```js
cp=copy;InspectorFrontendHost.getPreferences(p=>cp(`InspectorFrontendHost.setPreference("scriptSnippets",${JSON.stringify(p.scriptSnippets)})`))
```

これを実行すると『新PC側コンソールに貼り付け実行するだけでOKなワンライナーなコード』がクリップボードに入ってきます。ちなみにcopyはDevToolsのコンソール内で使える関数ですがコールバック内のコンテキストでは使えません。が、適当な参照変数にぶっこんでおけば良いだけなので特に困りません。

## リストア側で実行するコード

ここに書くべきコードは特にありません。『バックアップ側で実行するコード』を実行すれば目的のリストア用コードは既にクリップボードに入っている筈なので、それをただリストア側コンソールに貼り付け実行すればOKです。
リストア実行したら1段目/2段目のDevToolsをともに一度閉じて、それから再度開けば DevTools>Sources>Snippets に旧PCのスクリプトが全てリストアされているはずです。

ところで今どきは同じAppleIDを設定したMacbook同士ならユニバーサルクリップボードによって片方でコピーした文字列が、即座にもう片方の端末で貼り付けられるので、今回のような作業なんかは朝楽ちんにできて良いですね。
[Java][基礎]用語まとめ

# ソース
```Java:hoge.java
class Car //車
{
    private int num; //メンバ //フィールド(状態・性質)
    private double gas; //メンバ //フィールド(状態・性質)

    public Car() //コンストラクタ１
    {
        num = 0;
        gas = 0.0;
        System.out.println("車を作成しました。");
    }
    public Car(int n,double g) //コンストラクタ２ //オーバーロード
    {
        num = n;
        gas = g;
        System.out.println("ナンバー" + num + "ガソリン量" + gas + "の車を作成しました。");
    }
    public void show() //メンバ //メソッド
    {
        System.out.println("車のナンバーは" + num + "です。");
        System.out.println("ガソリン量は" + gas + "です。");
    }
}

class Hoge
{
    public static void main(String[] args)
    {
        Car car1 = new Car(); //オブジェクト(モノ)
        car1.show();
    }
}
```

# 用語
## クラス
作成するオブジェクトが何か。今回だと車。
## オブジェクト
クラスから作成したモノ。クラスが定義で、そこからオジェクトを作り出すイメージ。
## フィールド
そのオブジェクトの性質を表すもの。車だとガソリンだとか、色とか・・・
### インスタンス変数
オブジェクトに結び付けられると、`インスタンス変数`と呼ばれる。
### クラス変数
`static`にすると、オブジェクトを宣言しなくてもアクセスする事が出来る。
これは`クラス変数`と呼ばれる。
## メソッド
作成したオブジェクトに対して変更や参照を行う処理。
ガソリンの量を設定したり、色を設置したり。
### インスタンスメソッド
オブジェクトに結び付けられると、`インスタンスメソッド`と呼ばれる。
### クラスメソッド
`static`にすると、オブジェクトを宣言しなくてもアクセスする事が出来る。
これは`クラスメソッド`と呼ばれる。
オブジェクトを作成せずに、`Car.show()`で参照できる。
## メンバ
フィールドとメソッドの総称。
### アクセスの制限
`public`にすると、クラス外からメンバへのアクセスが可能。
`private`にすると、クラス外からメンバへのアクセスをする事が出来なくなる。
## コンストラクタ
クラス名と同じ関数があるクラスを宣言した際に、
コンストラクタの処理が行われる。
コンストラクタはメンバではない。
## オーバーロード
コンストラクタ、またはメソッド名が重複して宣言する事。
引数の数は変えなければならない。
`多様性`とも呼び、`Java`が持つ重要な機能の一つらしい。
## アクセス
作成したオブジェクトのメンバを参照をする事。
selenium+pythonを使ってテキストのリンクURLを取得する

取得したいテキストのリンクはこんな感じだとする。

```html
<p id="id_hoge"><a href="https://hogehoge.html" target="_blank">hoogehoge</a></p>
```

コードはこんな感じ。

```py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.binary_location = "Chromeのパス"
driver = webdriver.Chrome(chrome_options=options, executable_path="ChromeDriverのexeのパス")
driver.get('取得したいページのURL')
element = driver.find_element_by_id('id_hoge')
aTag    = element.find_element_by_tag_name("a")
url     = aTag.get_attribute("href")
```

変数urlには見事に
https://hogehoge.html
という値が入る。
ChromebookでFirebase開発

前回の記事

- [ChromebookのLinux（Crostini）の日本語入力をAnthyで構築](https://qiita.com/shin1kt/items/8d6be8e16e309db9cd79)
- [ARM系Chromebook（Crostini）でフロントエンド開発環境をつくる](https://qiita.com/shin1kt/items/74894d681e8f802380b8)

をやってみてChromebookでnpmを使えるようになったので、firebase-toolsをインストールしたらちゃんと動きました。

```
$ npm install -g firebase-tools
```
でインストール。

唯一心配だったのは

```
$ firebase login
```
※ブラウザでGoogleアカウント認証を行うのですが、Crostini上のターミナルで実行したfirebaseコマンドから、ChromeOSのブラウザを呼び出せるのか？
という不安がありましたが、なんのことなく認証できました。すごい。

```
$ firebase serve
```
※ChromeOSからも、`localhost:5000` とかにアクセスしてローカサーバの起動もできます。

その他のコマンドも、いまのところ、ドキュメントどおり。
問題なく動いています。

## StackBlitz

chrmebookでFirebaseの開発するならブラウザIDEもおすすめです。
[StackBlitz](https://stackblitz.com/)

これがすごくいいなと思うのはGitHubのコードをサクッと取り込めるところ。

```
http://stackblitz.com/github/[githubユーザ名]/[リポジトリ名]
```

にアクセスすると、そのコードがインポートされた状態でブラウザIDEが開いてきます。

例えば、GitHubの`stackblitz/angular-cli-template`というリポジトリをcloneして編集したいときは
https://stackblitz.com/github/stackblitz/angular-cli-template
にアクセスするだけ。手軽です。

仕事場などでのメインPCでつくったのをgithubにあげておいて、Chromebookでアクセスするだけ。StackBlitzは、ほぼVS-Codeなエディタがブラウザ上で操作できるのでなかなか良さそうです。

firebaseとの連携は、新規プロジェクトを作成するか、上記GitHubのコードをForkするとアクティビティバーにFirebaseのアイコンが表示されて、ワンクリックでデプロイできるようになります。

そんな感じで、出先とかでもちょこっとコードが書ける「開発マシンとしてのChromebook」が素敵です。
[Rails] cd /path/to/your/repoの意味

#Rails Tutorial[第４版]　第１章にて

Rails Tutorial[第４版]　第１章にてBitbucketでレポジトリを作成し、接続するのだが

Bitbucketでレポジトリを作成すると下記のような表示になる。


`cd /path/to/your/repo`


という記述があり、その後に

`git remote add origin ~~~
git push -u origin master`

を実行し、Bitbucketに接続する。

この
`/path/to/your/repo`
ってどこ？となったのだが、どうやら　フォルダ階層を示しているのではなく
"path to your repository"（あなたのレポジトリへのパス）
という英文を表しているらしい。

つまりAWS Cloud9を使用していれば、Rail Tutorial上では
~/environment/hello_app
となる。

初心者にとっては面食らう表記法だったので記録。
PHP 7.1 RC -> 7.1.26 バージョンアップで引っかかったメモ１

PHPのバージョンを
7.1RCから7.1.26に上げた際に発生。

### 環境
PHP 7.1.26
CAKEPHP 3.3.4
Chronos 1.0.0

### 現象
下記ワーニングが出るようになった

```
Warning Error: Declaration of Cake\Chronos\Traits\FrozenTimeTrait::setTime($hours, $minutes, $seconds = 0) should be compatible with DateTime::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in [~~~~/vendor/cakephp/chronos/src/MutableDate.php, line 24]
```

内容
https://qiita.com/zaramme/items/33c3944c1057c1297b5a

### 対応
CAKEPHPで使用しているライブラリのChronosのバージョンを上げることで解決

下記箇所でPHP7.1対応されていた
https://github.com/cakephp/chronos/commit/38110a8029689e72bb2b8a1d7a908477dde01ad6#diff-1eaff23ec9450a4955844be872867b8f

7.1との互換性追加
https://github.com/cakephp/chronos/releases/tag/1.0.1

余談
Chronos1.0.1にアップデートすることでワーニングは出力されなくなったが、結果的に1.2.3を導入した
Xcode10.1 にしたら react-native のビルドがエラーになった

10.0 にした時もなんかあったよねぇ。

## エラーメッセージ

```
error: /Users/UserName/Projects/ProjectName/ios/build/Build/Products/Debug-appletvsimulator/libReact.a: No such file or directory


** BUILD FAILED **
```

## TL;DR
### 直す
以下のコマンドを叩く

```
mkdir /Users/UserName/Projects/ProjectName/ios/build/Build/Products/Debug-appletvsimulator/
cp /Users/UserName/Projects/ProjectName/ios/build/Build/Products/Debug-iphonesimulator/libReact.a /Users/UserName/Projects/ProjectName/ios/build/Build/Products/Debug-appletvsimulator/
```

### 備考
`/Users/UserName/Projects/ProjectName` は ReactNative のソースを置いてあるところなので、自分の環境に合わせて適宜置き換えること。
どこに置いてあるかわからないなら `pwd` というコマンドを実行するとカレントディレクトリがわかります。

## なんで？
よくわからないけど、ビルドに使うディレクトリが変わったっぽい？
ないと言われるディレクトリ: `Debug-appletvsimulator`
ビルド中にできてるディレクトリ: `Debug-iphonesimulator`

## 環境など

* node: 10.11.0
* react-native: 0.57.8
* react: 16.6.3
* Xcode: 10.1/10B61

### react-native info
```
 React Native Environment Info:
    System:
      OS: macOS High Sierra 10.13.6
      CPU: (4) x64 Intel(R) Core(TM) M-5Y51 CPU @ 1.10GHz
      Memory: 75.34 MB / 8.00 GB
      Shell: 5.6.2 - /usr/local/bin/zsh
    Binaries:
      Node: 10.11.0 - ~/.ndenv/versions/v10.11.0/bin/node
      Yarn: 1.5.1 - /usr/local/bin/yarn
      npm: 6.4.1 - ~/.ndenv/versions/v10.11.0/bin/npm
      Watchman: 4.9.0 - /usr/local/bin/watchman
    SDKs:
      iOS SDK:
        Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
      Android SDK:
        API Levels: 23, 25, 26, 27, 28
        Build Tools: 23.0.1, 25.0.2, 25.0.3, 26.0.1, 26.0.2, 27.0.3, 28.0.3
        System Images: android-26 | Google APIs Intel x86 Atom_64, android-26 | Google Play Intel x86 Atom
    IDEs:
      Android Studio: 3.1 AI-173.4670197
      Xcode: 10.1/10B61 - /usr/bin/xcodebuild
    npmPackages:
      react: 16.6.3 => 16.6.3 
      react-native: 0.57.8 => 0.57.8 
```
インスタンスを表示させる方法とは

未来電子テクノロジー(https://www.miraidenshi-tech.jp/intern-content/program/ )でインターンをしている@hisayamaです。

PHPを勉強していますが、オブジェクト指向についてよくわからないまま進めていたので、調べて理解したことを書きます。

##クラス
実体であるオブジェクトのことを**インスタンス**といい、そのオブジェクトを作る設計図にあたるものが**クラス**です。
クラスがあればいくつものインスタンスが作成できます。

クラスの基礎の書き方は以下のような形です。

```php
<?php class クラス名{     クラスの中身     }  ?>
```


このクラスをインスタンス化させる書き方は以下の形です。
インスタンスは変数に代入して使うため、右側でインスタンス作成し、左側で変数に代入しています。

```php
$変数名= new クラス名();
```
これでインスタンスが表示される！と思ったのですが、残念ながらこの段階では何も表示されません。
きちんと表示させるためには、インスタンスを代入した変数を呼び出したいインスタンスのプロパティやメソッドにアクセスする必要があります。

```php
$変数名-> プロパティorメソッド名;
```
この「->]はアロー演算子と呼びます。
これでやっとインスタンスが表示されます。
React.useMemoの配列にはstate値も必要

React Hooksを元気に使っていたのですが、`useMemo`で必要以上にメモされるというトラブルが起きてしまいました。

## `React.useMemo`とは

Reactの`render`関数内で、その場で作った無名関数を使うと、`render`のたびに関数が再生成されてしまって、不必要に下位コンポーネントの`render`が必要となってしまいます。また、配列の絞り込みなど複雑な操作を毎回行うと、そのコストもかさみます。

そこで使えるHookが、`React.useMemo`です。`useMemo(() => 欲しい値, [依存する変数の配列])`のようにすることで、`依存する変数の配列`が変化したときだけ無名関数を実行して`欲しい値`を生成するようになります。

なお、コールバック関数の場合、通常「コールバック関数を作るコストの削減」より「関数を不必要に再生成しない」ということが求められますので、コールバック関数を直接指定する形の`React.useCallback(() => {...}, [依存する変数の配列])`というバージョンもあります。

## 依存する変数について

最後に「依存する変数の配列」を指定しますが、これらのうちどれかが変更されると、値の再生成が行われます。

* 内部から（直接・間接を問わず）呼び出している、`React.useState`の更新関数
* 内部から（直接・間接を問わず）参照している、`props`の値

などは比較的わかりやすいかと思いますが、実は「内部から（直接・間接を問わず）参照している`React.useState`の値変数」も、ここに入れる必要があります。

### 入れ忘れた失敗

`React.useState`の値変数を書かずに`React.useCallback`を適用したところ、取得する`state`値が最初の値から全く変化しない、という事態に見舞われました。

「実行のたびに`state`値を参照するはずなのに」と思ったのですが、よくよく考えればコールバックから参照する変数が**クロージャ**を生成するために、キャッシュされた関数を使った時にはキャッシュ時の`state`値を参照する結果となって、今の値が取れない、ということになってしまうのでした。

```jsx
function HookComponent(){
  const [value, setValue] = React.useState('');
  
  const handleChange = React.useCallback(
    e => setValue(e.target.value), [setValue]
  );
  
  // valueを書き換え対象に入れていないので、前のvalueを掴んだままとなる 
  const handleClick1 = React.useCallback(
    () => alert(value), []
  );
  
  // valueの変化に追随して、関数も作り直される
  const handleClick2 = React.useCallback(
    () => alert(value), [value]
  );
  
  // Hook定義完了
  
  return(
    <div>
      <input type="text" value={value} 
        onChange={handleChange}
      />
      <br />
      <button type="button"
        onClick={handleClick1}
      >
        valueなし
      </button>
      <button type="button"
        onClick={handleClick2}
      >
        valueあり
      </button>
    </div>
  );
}

```

## CodePenで動かしてみました

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="jkr2255" data-slug-hash="yZxvjv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="yZxvjv">
  <span>See the Pen <a href="https://codepen.io/jkr2255/pen/yZxvjv/">
  yZxvjv</a> by Jkr2255 (<a href="https://codepen.io/jkr2255">@jkr2255</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
bootstrap導入

参考：
[Rails5にBootstrapを導入する]
(https://qiita.com/tqkqt0/items/d9a3f3416c242ba48ba0)

導入：

```Gemfile.
gem 'bootstrap-sass'
gem 'sass-rails'
```

```
$  bundle install
```

```application.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

```application.js
//= require bootstrap-sprockets
```

[ボタン/buttons](https://getbootstrap.com/docs/4.3/components/buttons/#button-tags)

[カード/card]
(https://getbootstrap.com/docs/4.3/components/card/#titles-text-and-links)
ブタさんを出社させたり出荷させたりするやつ作ったよ〜(´・ω・｀)[クソ記事注意]

# 本当にクソ記事注意よ〜(´・ω・｀)

# URLよ〜(´・ω・｀)
https://babu-ch.github.io/shukka/index.html

# repositoryよ〜(´・ω・｀)
https://github.com/babu-ch/shukka
コード自体は数十行なのでもし読みたかったら読んでよ〜(´・ω・｀)

# 概要よ〜(´・ω・｀)
出社させたりしたくなったので作ったよ〜(´・ω・｀)

# 大変だったとこよ〜(´・ω・｀)
いろんな端末で出荷させたかったのでとにかくcssを%指定した
divでテキストを上下真ん中にするのが難しいよ。なんでこの時代になって簡単にできないんよ〜？(´・ω・｀)

# Q.出荷したらブタさん戻ってこないよ〜(´・ω・｀)
出荷したのは君だよ〜(´・ω・｀)

# Q.ブタが勤務できる会社なんか存在しないんだが？はい論破（早口）
かもね〜(´・ω・｀)

# 問題点よ〜(´・ω・｀)
・家と会社が少し浮いている
＝＞　そりゃ浮く時くらいあるよ〜(´・ω・｀)

・豚の向きが一定
＝＞　出社には後ろ向きという意味よ〜(´・ω・｀)（後付け）

・画面のリサイズに対応していない
＝＞　こんなページリサイズするやつはいないよ〜(´・ω・｀)
#2 OpenScope MZ【softAP, I2C, SPI機能の付加】

先ずは、softAP機能を導入から行います。

OpenScope MZの回路構成は以下のようになっています。
Wi-FiモジュールとしてはMicrochip社のMRF24WG0MAが使われているので、先ずはデータシートから動かし方を確認します。
![openscopemz_walk_around.png](https://qiita-image-store.s3.amazonaws.com/0/359111/32f318d7-7422-1f97-ebdb-0c90c31473b8.png)

データシートを見ると、Infrastrcture（子モード）、softAP（親モード）、W-Fi Direct機能付きとのことなので、動作は可能と分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/f85b62f0-785b-4a4f-3c48-9f1243be8304.png)

一応、電波認証を確認するとJapanとあるので、国内で使用しても問題と思われます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/c5854338-bfb5-ae88-04be-4354fb1df4e5.png)


さて、ではさっそくOpenScopeMZのWiFiに関する動作を見ていきます。
ソースコードのリンクはホームページに記載されています。https://reference.digilentinc.com/reference/instrumentation/openscope-mz/start
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/fe73e459-5066-efaa-687e-64b788a36f5a.png)

Githubの「Clone or download」から「Download.zip」を選択して、任意のファイルに解凍する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/02bc01f0-4a6f-b978-af7e-ea0c702633b1.png)


言語はArudionoで作成されていますが、プログラムのフローはmain.ccp、そして WiFiに関する部分はWiFi.ccpの中に記述されています。

main.ccpはstateで状態が管理されていて、stateを更新していくことで状態遷移していきます。

起動してからの流れは、
①　システムの初期化
②　各種電圧の初期化
③　バージョンと情報のUART出力
④　時刻の設定
⑤　キャリブレーション数値の設定
⑥　登録されているWiFiのSSIDの検索と接続
⑦　メイン処理のループの実行
となっているので、⑥番を変更すればよさそうだと中身を見ていきます。

その前に一旦は開発環境を揃えます。
Arduino 1.6.9をダウンロード。https://www.arduino.cc/en/Main/OldSoftwareReleases#previous
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/ecc55d70-be09-4366-16a2-b5fa2b8d7eaa.png)

回答したOpenScope MZ のソフトウェアのファイルの中の.ino拡張子ファイルを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/54d85e36-0a23-8574-b594-f4eaa138f08d.png)

Arduinoが起動するのでファイル→開発環境で下記URLでボードを追加します。
https://s3-us-west-2.amazonaws.com/digilent/Software/Digilent_Core/package_digilent_index.json

![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/529698fb-4919-f0ea-b160-f16f2d63ca2a.png)

ツールのボードの追加を押して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/dba0e010-4e20-075b-3890-2c0bd33c40c3.png)

Digilent Core by Dijilentをインストール。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/4eaa870d-28fb-357c-9fd9-0341298f16ff.png)

インストールが終了したら、ボードをOpenScopeに変更して、OpenScope MZをUSB接続し

OpenScopeMZのBTN_PとBTN_Rのボタンを同時に1秒押してプログラム書き込みモードにした状態で（高速でLEDが赤点滅する）、書き込みして、以下の画面が表示されていれば書き込みに成功しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/a58c6132-06cf-b346-4f36-42fcfa3885c8.png)

とりあえず開発環境は構築できたので、次からプログラムコードを触っていきます。
JDKのインストールで起こるエラーと試した対策のメモ

##前置き

先日プログラミングスクールをインフルエンザで休んでしまいました。
そのため講義の不足分を補うために、自宅のPCにJDKをインストールしてJavaの開発環境を整えようとした闘いの記録です。
※少し前の出来事なので記憶が曖昧なのと、記録としてのスクショなどがないことをご容赦ください。また何も知識がない中でやっていますので、チンプンカンプンな試行錯誤が続きます。

##本文

こちらのサイトを参考に進めていく。
>https://eng-entrance.com/java-install-jdk-windows


OSはWindows7の64bit
インストール後、指示通りに進めていく。

コマンドプロンプトを使いバージョンを確かめる。
**「内部コマンドまたは外部コマンド、操作可能なプログラムまたはパッチファイルとして認識されていません。」**

インストール後は環境変数の設定が必要になります。
「Path」と「JAVA_HOME」の２種類。
Pathはシステム環境変数に;(セミコロン)で他のパスと区切り設定。
JAVA_HOMEは新規なので普通に設定。
**認識されていません。**

とりあえず何でも試してみようと、まずPathの設定位置をシステム環境変数のPathの一番最後(右もしくは下)に設定。ダメ。一番最初(左もしくは上)に設定。ダメ。両方。ダメ。一番最後に戻す。

PathにもJAVA_HOMEを設定。
**認識されていません。**
消さずに放置。
ちなみにこちらのサイトを参考にしました。
>https://techfun.cc/java/windows-jdk-pathset.html


どこかのサイトにユーザー環境変数でもPathを設定できると書いてあったので試す。
ユーザー環境変数から新規で設定。
**認識されていません。**
消さずに放置。

Pathに登録している内容が悪いのかと確認する。
ProgramFilesとなっていたのでProgram Files(x86)に入れ直したり半角スペースを空けたり。
結局これにして一旦諦める。
;C:\Program Files\Java\jdk1.8.0_201\bin\javac.exe\

ここで再起動を挟んでみる。
設定を変える毎に逐一した方がいい可能性も。

うまくいかないと唸っていると、プログラム検索で複数のJava.exeがあることに気づく。
古いversionのアンインストールを試みる。

**バージョンが表示される。**


##【試したこと】
- システム環境変数のPathの設定位置
- PathにJAVA_HOMEを設定
- ユーザー環境変数にPathを設定
- パスのProgramFilesに半角スペースを空けてProgram Filesにする
- 再起動する
- 複数あるJavaファイルの古いversionをアンインストール


##あとがき

正直何が原因で何がキッカケでうまくいったかはわかりません。
ですが自分のメモ用と、誰かがもし悩んで迷い込んできた時用に残しておきます。
Node.jsを使ってDynamoDBからデータを取得する ～scan編～

##はじめに
はじめまして、Qiita初投稿です。これからも不定期に投稿していければと思っています。
私自身エンジニア（３年目）として学習中の身のため、内容に誤り等があればご指摘いただけますと幸いです。

本投稿ではAmazon DynamoDBからデータを取得する方法について書いていきます。

##DynamoDBについて
取得方法について書く前に、そもそもDynamoDBについて簡単に説明します。
DynamoDBはAWSサービスのひとつであるフルマネージド型NoSQLデータベースサービスです[[1]](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html)。
NoSQL(非SQL)なので、OracleやMySQLのようにデータ取得の際に柔軟なクエリを使用することはできません。（SQLのように扱うためのモジュールもあるようです[[2]](https://takamints.hatenablog.jp/entry/operating-the-dynamodb-by-SQL-ish-language)）
テーブル作成時にはパーティションキー、もしくはパーティションキーとソートキーを定義するだけであり、他の属性を事前に定義する必要はなく拡張性に優れるというのも特徴のひとつです。

##取得方法
DynamoDBのテーブルからデータを取得するには、以下の方法があります。

- **scan**
データを全件取得する

- **query**
条件式に一致するデータを取得する

- **batchGetItem**
単一もしくは複数テーブルから複数の項目を取得する

今回は上記*scan*を用いた場合の、Node.jsでの実装方法を記載します。

##実装
AWSのSDKを用いて実装します。
事前にnpmコマンドでSDKをインストールします。

```
 npm install -s aws-sdk
```

以下が、*scan*を用いたデータ取得のサンプルです。
DynamoDBに事前にテーブルを作成しておけば、Lambda上でそのまま実行できます。

```index.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = function (event, context) {
    const TABLE_NAME = 'SampleTable';
    
    // DynamoDB scanで必要なパラメータ
    let params = {
      TableName : TABLE_NAME, // テーブル名
    };
    
    // scanの実行(非同期で実行され、コールバックで結果を受ける)
    docClient.scan(params, function(err, data) {
         if (err) {
           // エラー時の処理を記述
           console.log("エラー = " + err);
         } else {
           // 成功時の処理を記述(取得結果はdataに格納される)
           console.log("成功 = " + JSON.stringify( data ));
           data.Items.forEach(dt => {
                console.log('id : ' + dt.id);
                console.log('name : ' + dt.name);
           });
         }
    });
};
    
```
上記サンプルでは*SampleTable*という名前のテーブルのデータを全件取得して、データをログに出力するというだけの単純なものです。
※*SampleTable*には*id*(パーティションキー)と*name*という項目がある前提です。

###レスポンス
上記コードを実行した際のレスポンスのサンプルです。

```:レスポンス
{
  "Items":[
    {
      "id":"id1",
      "name":"hoge"
    }, 
    { 
      "id":"id2",
      "name":"moge"
    }
  ],
  "Count":2,
  "ScannedCount":2
}
```

*Items*にscanの結果がレコードごとに配列に格納されます。
*Count*に取得件数(フィルタ後)が、*ScannedCount*にscanで取得した件数(全量)が格納されます。

##さいごに
簡単にではありますが、DynamoDBをNode.jsを使ってデータ取得する方法について書いてきました。より詳しく知りたい方はDynamoDBの公式ドキュメントを参照ください。パラメータにフィルタを設定したり、取得件数の上限を指定したりなどもできます。
DynamoDBのまだまだごく一部しか理解できていないので、これからもいろいろ試しながら理解を深めていこうと思います。

##参考サイト
[1]AWS DynamoDB公式ドキュメント
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html

[2]DynamoDBをSQLで操作するNodeモジュール
https://takamints.hatenablog.jp/entry/operating-the-dynamodb-by-SQL-ish-language
Rustでパッケージ(クレート)インストールから使用するまでの軌跡


rustとは以下のようなコンセプトのプログラミング言語です
> Rust言語は速度、並行性、安全性を言語仕様として保証するC言語、C++に代わるシステムプログラミング（英語版）に適したプログラミング言語を目指している。
> **Wikipediaより**

今回はそのrustでパッケージ(クレート)を使用する方法をまとめたいと思います。

時間がない人は**クレートの使い方**の項を見てください。
## 目的
- cargoで作ったプロジェクト内で、外部パッケージ（クレート）を使用する方法がわからなかったのでその備忘録
- 同じことで躓いている人がいればその助けになれば嬉しい
- 同じ環境を用意すれば予備知識無しで再現できるようにすること

## 対象者
- rust触ってみたいけどクレートインポートで躓いたよ:frowning2:って方

## やること
- randというクレートをインストールしてサンプルコードを実行してみる。

## 実行環境
Macbook pro 13-inch 2016
macOSX High Sierra 10.13.6
rustc 1.32.0 (9fda7c223 2019-01-16)
rustup 1.16.0 (beab5ac2b 2018-12-06)
cargo 1.32.0 (8610973aa 2019-01-02)

## 用語解説
- cargo : rustのプロジェクトを管理するソフト。rustのビルド、コードが依存するライブラリのダウンロード、ライブラリのビルドを担当します。
- クレート : パッケージ、ライブラリのrust版(細かく言えば違うと思います)
- rustup : rustのインストーラ
- Cargo.toml : rustのプロジェクト毎の設定ファイル

## クレートインストール方法
rustでは使用したいクレートがあるとき、cargoで作成したプロジェクト内にあるCargo.tomlファイル内の[dependencies]に使用したいパッケージ名とバージョンを記述します。
pythonのパッケージのように、pipなどでインストールする手順は必要ありません。
あとはコード内でインポートしてあげればOKです。

## 実際に使ってみようみよう！！
今回はcargoを使い新しいプロジェクトを作成した後、randというクレートを使って見るところまで進めます。
cargo で新しいプロジェクトを作成(--binはデフォルトのオプションになったのでつけなくてOKです)
terminal上でこのコマンドを実行することで新しいプロジェクトが作成されます。

```bash
cargo new sample_project 
```
  
今回使用するrandというクレートをCargo.tomlの中に記述します。(version 0.3.0でお願いします)
`cargo new`の時点で生成されたコードに１行足します。

``` bash:Cargo.toml
[package]
name = "sample_project"
version = "0.1.0"
authors = ["uemurakaito <kituemr@gmail.com>"]
edition = "2018"

[dependencies]
rand = "0.3.0" # この行を足しました
```

プロジェクトフォルダ内(sample_project）のsrc/main.rsを以下のように変更します(randのドキュメントから引用)

``` rust:main.rs
// 最初は extern crate rand; を書いていましたが、コメントにて２０１８年エディションはこの宣言が不要になり、useから直接モジュールをインポートできることを教えていただきました、ありがとうございます。
//randをインポート
//extern crate rand;

//ローカルスコープ内にRngをインポート
//// genはRng traitに定義されているためこれが必要
use rand::Rng;

fn main(){
    //乱数生成機を初期化
    let mut rng = rand::thread_rng();
    //True or Falseをそれぞれ０．５の確率で生成
    if rng.gen() { // random bool
        //rng.gen<T>のTの部分で型を指定しそれにあった乱数を生成
        println!("i32: {}, u32: {}", rng.gen::<i32>(), rng.gen::<u32>());   
    }
    printlin!("True or False:: {}", rng.gen::<bool>());

}
```

## 出力(乱数生成で`if rng.gen()`でtrueが出た場合)
i32: 848344424, u32: 2127722729
T or F:: false

## まとめ
- クレートのインストールはプロジェクト設定ファイルのCargo.tomlファイルの中に記述する
- `cargo run`を実行した時にcargoがダウンロード、ビルドをしてくれる
- ありがとうございました:grin:


## 参考サイト
[Rustで乱数生成](https://qiita.com/termoshtt/items/6e2ff724e6da86963aa9)
[Generate Random Values](https://rust-lang-nursery.github.io/rust-cookbook/algorithms/randomness.html)
[CrateRand](https://rust-num.github.io/num/rand/index.html)
[Wikipedia(rust)](https://ja.wikipedia.org/wiki/Rust_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))
PHP: privateコンストラクタをClosureを使って呼び出す小技

PHPでprivateなコンストラクタを呼び出す方法として最古のものは[ReflectionClass::newInstance](http://php.net/manual/ja/reflectionclass.newinstance.php)だと思うが、newInstanceはコンストラクタの型宣言をIDEで認識できないデメリットがある。そこで、[Closure::bindTo](http://php.net/manual/ja/closure.bindto.php)を使うと、`new`が使えるのでIDEにも多少やさしい。

```php
class SomeClass
{
	private function __construct()
	{
		echo 'private constructor called', PHP_EOL;
	}
}

$constructor = (function () {
	return new SomeClass();
})->bindTo(null, SomeClass::class);

$constructor(); //=> private constructor called
```
PHP 7.1 RC -> 7.1.26 バージョンアップで引っかかったメモ２

PHPのバージョンを
7.1RCから7.1.26に上げた際に発生。

### 環境
PHP 7.1.26
CAKEPHP 3.3.4
Redis

### 現象
初回表示は正常に表示できるが、
再度同じ画面を表示した際、データが存在しない表示となる

* キャッシュ作成後、キャッシュを読み込んだ際にエラーが起こっているように見える
* キャッシュのdurationを1秒に設定やキャッシュを使用しないようにすると正常に動作しているように見える
* クエリキャッシュ以外のRedisキャッシュは正常動作しているように見える
* クエリキャッシュもRedisに正常に書き込まれているように見える（Redisサーバにアクセスし確認）
* Reidsキャッシュは取得できているがデータが存在しないように見える

※クエリキャッシュ
https://book.cakephp.org/3.0/ja/orm/query-builder.html#caching-query-results
>$query->cache('recent_articles');

### 原因
* Redisからデータ取得後、unserialize時に正常に復元できていない

/vendor/cakephp/cakephp/src/Cache/Engine/RedisEngine.php#L161

```
    public function read($key)
    {

        $key = $this->_key($key);
        $value = $this->_Redis->get($key);
 
        if (preg_match('/^[-]?\d+$/', $value)) {
            return (int)$value;
        }

// Redisから値が取得できた、かつ、文字列判定(問題となっているクエリキャッシュはこの分岐に入る)
        if ($value !== false && is_string($value)) {/ 
// PHP7.1RCの場合、"unserialize($value);"でシリアライズ化されたオブジェクトでも正常に復元できる
// PHP7.1.26の場合、"unserialize($value);"でシリアライズ化されたオブジェクトでも正常に復元できず空配列となる
            return unserialize($value);
        }
        return $value;
    }
```

**PHP7.1.0よりunserialize関数の挙動が変更されている**
http://php.net/manual/ja/function.unserialize.php

### 対応
CAKEPHP3.5.17導入によりキャッシュ読み込みに関しては解決。
https://stackoverflow.com/questions/47058146/cakephp-query-results-caching

注意
CAKEPHP3.3.4で生成したクエリキャッシュをCAKEPHP3.5.17で読み込むとエラーとなっていた。
PythonからJSON形式のファイルを作成する方法

# Introduction

## きっかけ
Pythonのリスト形式からJSON形式へ変換する必要があったので、JSON形式への変換方法について調べてみました。JSON形式のことはよくわかったいないので間違っている点等あればお気軽にご指摘いただければと思います。

## 自己紹介
![smile.jpg](https://qiita-image-store.s3.amazonaws.com/0/262742/38a82ae5-98e6-8d78-b461-3d14024af15d.jpeg)

[自己紹介ページ](https://qiita.com/Senple/items/b47374e68e4d8d26d0cb)

```
環境情報
Python 3.6.5 |Anaconda, Inc.|
Windows10
```

### 対象者
・Python3系を使っているユーザー(Anacondaでインストール)
・Pythonの基本的なことは理解している方
・1を聞いて10を理解できるエンジニア
・**Windows**の人

### 非対象者
・Python2系を使っているユーザー
・Pythonをまるで日本語のように扱える天才エンジニア
・説明下手な筆者を攻撃しようとするエンジニア
・**Mac**の人

Cf.)Python2系とかPython3系の意味が分からない人へ！
Pythonには2系と3系があって、最近始めた人ならほとんどPython3系だと思います。一応バージョンを確認する方法を記載しておきます。
コマンドプロンプトでPythonのインタラクティブ(対話)モードを起動すればバージョン情報が表示されます。

```
$ Python
>Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
インタラクティブモードを辞めるには*exit()*を入力しましょう！



# Let's Start
## Sample Code
`Sample_list = [["a",1],["b",2],["c",3]]`をJSON形式へ変換する方法について述べていきます。
なおここでの想定は自然言語処理などをしているとしばしば直面する、文書の中にどんな単語がいくつ含まれているのかです。サンプルではaが1個、bが2個、cが3個という意味です。
jsonファイルでしか入力できないライブラリがあったのです・・・。


```Python:Sample.py
import json

Sample_list = [["a",1],["b",2],["c",3]]

with open('Sample.json', 'w') as f:
    json.dump(Sample_list, f, ensure_ascii=False)

with open('Sample.json') as f:
    print(f.read())

>>>[["a",1],["b",2],["c",3]]
```

`Sample.json`というファイルを作成して、`Sample_list`の内容を保存してくれます。
`ensure_ascii=False`は日本語を文字化けさせないためのものです。今回はあまり関係ありませんが、日本語の自然言語処理に利用する方々には必須だと思います。

cf) [jsonを日本語版で表示する方法(文字コードを訂正する方法)](https://cortyuming.hateblo.jp/entry/20140920/p2)

ちなみに調べてみたのですが、JSON形式って単に文字列なんですね。
今までは特殊な形式に保存されていると思い込んでいました。
Linuxbrew環境でRust1.32.0以降コンパイルに失敗するとき

# はじめに
Linuxbrewを入れた環境でRust1.32.0以降の場合、proc_macroを使ったクレートのコンパイルに失敗することがあります。
（正確にはPATHが通ったところにシステムのglibcより新しいバージョンのglibcを参照する`cc`コマンドが存在する場合、です。Linuxbrew環境はシステムのglibcバージョンによってはこれに該当します。もしかしたらMac OSのHomebrew環境でも起きるのかもしれません）
この問題が発生した場合の解決策と、詳細な原因を（分かる範囲で）まとめておきます。

# 解決策
以下のようにデフォルトのリンカをシステムのリンカに設定すれば、コンパイルできるようになります。
（同様のファイルは各プロジェクトのルートにも置けますが、ホームに置いておくとデフォルトでこれが適用されます。）

```toml:~/.cargo/config
[target.x86_64-unknown-linux-gnu]
linker = "/usr/bin/cc"
```

# 経緯

Linuxbrewが2.0になったので手元のLinuxbrew環境を再構築したところ、いくつかのRustプロジェクトがコンパイル不能になっていることに気づきました。
当初はLinuxbrewのインストールの仕方が悪かったかと思っていましたが、検索すると以下のIssueがヒットしました。

[wrong libc linked during build](https://github.com/rust-lang/cargo/issues/6582)

これによると1.32.0にアップデートしたらコンパイルが通らなくなったとのことで、手元の環境でも確かに1.31.1に戻すと通ります。
そこで、`git bisect`で問題が発生したリビジョンを確定させて、Issueを立てました。
（元のIssueはcargoの問題として立ててられていたのですが、リビジョン的にrustcだったので立て直しました）

[Wrong glibc linked in building crates using proc_macro with linuxbrew](https://github.com/rust-lang/rust/issues/58394)

ここのコメントのやり取りで、なんとなく発生している現象は分かった気がするので以下にまとめておきます。

# 詳細
Rustにおいてproc_macroを使ったクレート（serde_deriveとか）をコンパイルする手順は以下のようになります。
（この辺り詳しくないので間違っていたら教えて下さい。）

- serde_deriveをrustcがコンパイル。リンカが`libserde_derive.so`を作成
- serdeをrustcがコンパイル。この時に`libc::dlopen`で`libserde_derive.so`をロード

通常このフローでロードに失敗することは多分ありません。

一方、Linuxbrewを入れた環境では（Linuxbrewのコマンドを優先したいので当然ですが）コマンド探索はLinuxbrewを優先するようPATH設定します。
そのためRustがコンパイル時に使用するリンカもLinuxbrewのものになります。
しかし（rustupが配布する公式の）rustcが参照するlibcはシステムのglibcなので

- serde_deriveをrustcがコンパイル。**Linuxbrewリンカ**が`libserde_derive.so`を作成
- serdeをrustcがコンパイル。この時に**システムglibc**の`libc::dlopen`で`libserde_derive.so`をロード

この時、Linuxbrewのglibcがシステムのものより新しいと、`libserde_derive.so`が新しいglibcを参照しているのに、システムglibcの`libc::dlopen`は古いglibcしか見つけられずに以下のようにロードに失敗します。

```
error: /usr/lib64/libc.so.6: version `GLIBC_2.18' not found (required by /tmp/cargo-installkV0c2k/release/deps/libserde_derive-615594b83ebc865a.so)
  --> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/grep-printer-0.1.1/src/lib.rs:81:1
   |
81 | extern crate serde_derive;
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^
```

Rust1.32.0以降というのは、1.31.1-1.32.0の間にproc_macroのリンクをstaticからdynamicに変える変更が入ったためです。
実際`git bisect`して見つかったリビジョンはこれです。

```
188d2dafcdd4d0dbd54315412503fb8011d716b6 is the first bad commit
commit 188d2dafcdd4d0dbd54315412503fb8011d716b6
Author: Eduard-Mihai Burtescu <edy.burt@gmail.com>
Date:   Thu Apr 26 14:11:08 2018 +0300

    Statically link proc_macro into proc macros.

:040000 040000 a218f2092aad86632374db4fc3ba0effe6705d7f b8357a8a11394a8ab0f6e20875802930dd0ecc9f M      src
bisect run success
```

リンカとローダの環境が異なる（Linuxbrewリンカ＋システムローダ）ことが原因なので、どちらかに揃えてやれば解決するはずです。冒頭の解決策はシステムリンカ＋システムローダにする方です。
逆にLinuxbrew側に揃えることも可能なはずですがこちらは未確認です（`brew install rust`でよい？）。
ただこちらはrustupが使えないので実用的には厳しい感じがします。
Unix系システムコール`open`とlibcの`fopen()`の対応関係

#### システムコールの`open`とlibcの`fopen()`の対応をまとめました。
|システムコール|Cライブラリ関数|動作|
|:---|:-----|:-----|
|open("file", O_RDONLY)|fopen("file", "r")|読み込み|
|open("file", O_RDWR)|fopen("file", "r+")|現存読み書き|
|open("file", O_WRONLY&#124;O_CREAT&#124;O_TRUNC, 0666)|fopen("file", "w")|書き込み|
|open("file", O_RDWR&#124;O_CREAT&#124;O_TRUNC, 0666)|fopen("file", "w+")|新規書き込み|
|open("file", O_WRONLY&#124;O_CREAT&#124;O_APPEND, 0666)|fopen("file", "a")|追加書き込み|
|open("file", O_RDWR&#124;O_CREAT&#124;O_APPEND, 0666)|fopen("file", "a+")|追加読み書き|

個人的にはopenの方が柔軟性があるので多用しています。
【Doctrine】AbstractProxyFactoryでクラスが見つからないエラー

Laravel+Doctrine環境で以下のエラーが発生

`Error: Doctrine\Common\Proxy\AbstractProxyFactory::getProxyDefinition(): Failed opening required '***/__CG__***.php' (include_path='***')`

うぅん…？

---

原因は、プロキシクラスが自動生成されない設定になっていたためでした。

```php:config.php
'proxies'    => [
    'namespace'     => false,
    'path'          => storage_path('proxies'),
    'auto_generate' => env('DOCTRINE_PROXY_AUTOGENERATE', false)
],
```

公式ドキュメントの翻訳↓
>開発環境でこれを行う場合、特定のプロキシがまだ生成されていないと、クラス/ファイルが見つからないというエラーが発生する可能性があることに注意してください。まだプロキシクラスに含まれていない新しいメソッドがエンティティクラスに追加された場合も、遅延ロードが失敗する可能性があります。

'DOCTRINE_PROXY_AUTOGENERATE'をtrueにすると自動生成されます。
（本番環境ではオーバーヘッドがかかってしまうため、trueにしちゃダメです）

artisanコマンドで手動生成することもできます。

```
php artisan doctrine:generate:proxies
```

参考ページ↓
https://github.com/laravel-doctrine/orm/issues/32
python入門(5)~タプルと辞書~

#タプルと辞書
##タプル
タプルとはデータ型の一つで，リストと似ていますが，要素の追加，削除，変更は行えません．またタプルは，「,」で区切ります．「()」は無くても作れますが基本は「()」で囲みます．なお，タプル同士を繋げて新しいタプルを作ることはできます．

```python:tap.py
a = ('s', 'w', 'i', 't', 'c', 'h')
print(a)
b = (1, 2)
c = b + a
print(c)
```

```text:実行結果
('s', 'w', 'i', 't', 'c', 'h')
(1, 2, 's', 'w', 'i', 't', 'c', 'h')
```
##辞書
辞書とはデータ型の一つでリストと似ていますが，各要素を値とキーのペアで扱い，それらを「,」で区切って「{}」で囲みます．また，リストと違い順番はありません．ちなみにキーは，文字列だけでなく数値やタプルを使うこともできます．

```python:dic.py
a = {'日本':4, 'アメリカ':1, 'ニュージーランド':8}#海洋の体積
val = a['日本']
b = {('日本', 4):6,('アメリカ', 1):1,('ニュージーランド', 8):7}#海洋の面積
val2 = b[('ニュージーランド', 8)]
print(val, val2)
print(a)
```

```text:実行結果
4 7
{'アメリカ': 1, 'ニュージーランド': 8, '日本': 4}
```
辞書の基本の書き方は上記の通りです．注意すべき点は要素にアクセスするときは「{}」ではなく「[]」を使うところです．また，存在しないキーにアクセスしようとするとエラーが出ます．
余談ですが，上記のデータは「世界の領海およびEEZの体積と面積ランキング」の一部です．
####inまたはnot in演算子
inまたはnot in演算子を使うとキーがあるのかを調べられます．

```python:dic2.py
a = {'日本':4, 'アメリカ':1, 'ニュージーランド':8}#海洋の体積
con1 = '日本' in a
con2 = '日本' not in a
con3 = 'イギリス' in a
print(con1, con2, con3)
```

```text:実行結果
True False False
```
####get()メソッド
get()メソッドを用いると指定したキーが存在するとその値を，指定したキーが存在しない場合はNoneが返されます．

```python:dic3.py
a = {'日本':4, 'アメリカ':1, 'ニュージーランド':8}#海洋の体積
g1 = a.get('日本')
g2 = a.get('イギリス')
print(g1, g2)
```

```text:実行結果
4 None
```
####dict()
dict()を使い直接辞書を作ったり，リストやタプルを辞書に変換できます．なおこの場合は，文字列でも「'」をつけません．

```python:dic4.py
a = dict(日本 = 4, アメリカ = 1, ニュージーランド = 8)
print(a)
```

```text:実行結果
{'日本': 4, 'アメリカ': 1, 'ニュージーランド': 8}
```
#####zip()
zip()を使ってキーのリストと値のリストを合成して辞書を作ることができます．

```python:dic5.py
key = ['日本', 'アメリカ', 'ニュージーランド']
value = [4, 1, 8]
di = dict(zip(key, value))
print(di)
```

```text:実行結果
{'ニュージーランド': 8, '日本': 4, 'アメリカ': 1}
```
#####タプルのリストを利用する

```python:dic6.py
a = dict( [('日本',4), ('アメリカ',1), ('ニュージーランド',8)] )
print(a)
```

```text:実行結果
{'ニュージーランド': 8, '日本': 4, 'アメリカ': 1}
```
##辞書の操作
###要素の追加
辞書の要素の追加の方法は直接定義する方法とsetdefault()を使う方法の二種類あります．

```python:dic7.py
a = {'大化の改新' : 645}
a['関ヶ原の戦い'] = 1600
print(a)
a.setdefault('日清戦争', 1894)
print(a)
```

```text:実行結果
{'大化の改新': 645, '関ヶ原の戦い': 1600}
{'大化の改新': 645, '日清戦争': 1894, '関ヶ原の戦い': 1600}
```
###要素の削除
辞書の要素を削除する方法はdel文とpop()の二つの方法があります．また，要素全てを削除したいときはclear()を使います．

```python:dic8.py
a = {'大化の改新' : 645, '日清戦争' : 1894, '関ヶ原の戦い' : 1600}
del a['日清戦争']
print(a)
a.pop('関ヶ原の戦い')
print(a)
a.clear()
print(a)
```

```text:実行結果
{'関ヶ原の戦い': 1600, '大化の改新': 645}
{'大化の改新': 645}
{}
```
##リストへの変換
###キーのリストを作る
キーの取得にはkeys()を使います．

```python:key1.py
a = {'鷹' : '赤','虎' : '黄', 'バッタ' : '緑'}
key = list(a.keys())
print(key)
```

```text:実行結果
['バッタ', '鷹', '虎']
```
###値のリストを作る
値の取得にはvalues()を使います．

```python:val.py
a = {'鷹' : '赤','虎' : '黄', 'バッタ' : '緑'}
value = list(a.values())
print(value)
```

```text:実行結果
['黄', '緑', '赤']
```
###要素のリストを作る
要素の取得にはitems()を使います．

```python:item.py
a = {'鷹' : '赤','虎' : '黄', 'バッタ' : '緑'}
item = list(a.items())
print(item)
```

```text:実行結果
[('鷹', '赤'), ('虎', '黄'), ('バッタ', '緑')]
```
##最後に
pythonは様々な場面で使われています．自分が何を作りたいかをイメージしながら学んでいきましょう．
Whenever 複数環境で動作させるスケジュールを共存させる

[@koshi_life](https://twitter.com/koshi_life) です。

[Whenever](https://github.com/javan/whenever)　便利で驚きました。
最近関わった案件で `schedule.rb` 内で複数環境でタスクを共存させたいシーンがあり、
情報がなかったので試した内容を備忘します。

（ちなみに、既存バッチが `production` で動作中の環境でログファイルと各種設定を分けたバッチを１本追加したいシーンでした。）

## 前提

- Whenever v0.10.0
- OS: macOS HighSierra

### schedule.rb

`set :environment, :HOGEHOGE` を各タスクのスケジュール設定の手前で宣言するだけでした。

以下スケジュールを設定する例を示します。同じタスク `Tasks::Hoge.execute` を稼働させます。

- 1つ目のスケジュール 毎時０分に `production` 環境
- ２つ目のスケジュール 毎時30分に `tmp` 環境


```config/schedule.rb

set :environment, :production
every :hour, at: 0 do
    runner "Tasks::Hoge.execute"
end

set :environment, :tmp
every :hour, at: 30 do
    runner "Tasks::Hoge.execute"
end
```

crontab 登録

```
$ bundle exec whenever --update-crontab
[write] crontab file updated
```

crontab 確認

```
$ crontab -l
# Begin Whenever generated tasks for: <RAILS_APP_PATH>/config/schedule.rb at: 2019-02-14 20:42:00 +0900
0 * * * * /bin/bash -l -c 'cd <RAILS_APP_PATH> && bundle exec bin/rails runner -e production '\''Tasks::Hoge.execute'\'''

30 * * * * /bin/bash -l -c 'cd <RAILS_APP_PATH> && bundle exec bin/rails runner -e tmp '\''Tasks::Hoge.execute'\'''

# End Whenever generated tasks for: <RAILS_APP_PATH>/config/schedule.rb at: 2019-02-14 20:42:00 +0900
```

### 参考

- Wheneverの導入〜書き方
  - [Railsで定期的にバッチ回す「Whenever」](https://qiita.com/yumiyon/items/388fbb84450f49a6ab0d)
- 環境毎にschedule内容を変更したいシーン
  - [Wheneverで環境ごとにschedule内容を変更する](https://qiita.com/zaru/items/348c126a205a2e48b4d6)
picoCTF 2018 Logon - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5b1fb329-f568-1e44-950f-de693232a180.png)


#解いてみた

パスワードを突破してください的な意味。
リンクに遷移してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/14fc1be0-0b5e-ac2e-f85c-30d5b83f48e0.png)

このようなログイン画面。
何も入力せずにSign inボタンを押してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e106ce2e-6684-fa5a-15a9-e0775f9ecd83.png)

ログイン成功するとここにflagが表示されそうですね。
と思ったらログイン自体は成功しているのか。。。

ソースを見たところログイン処理をしたときに一度/loginに飛んでるようです。
さっきの画面のURLは/flagになってる。
ということでwiresharkで/loginを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/244e8467-5877-4cff-8e39-1ff04d41ed8f.png)

すぐに/flagにリダイレクトしているようです。
Cookieにadmin=Falseと書かれています。
これをTrueにしてみたくなりました。
の前に/flagでこのCookieが使われているか調べてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/4b65e273-62c9-1cd6-891f-14f908889bd0.png)

使われていますね。
Chromeの拡張機能「EditThisCookie」を使ってFalseをTrueに変えて再度ログイン処理をしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/4c90417b-7e37-39b2-703e-44690d879df0.png)

やりました。
FactoryBot でbuildしたとき、関連先がcreateされなくなっていた（デフォルトの挙動として）

https://github.com/thoughtbot/factory_bot_rails/issues/314

上のイシューにある通り、FactoryBotで関連先を作るときの挙動が変更になっていたようです。

factory_bot, factory_bot_rails いずれも 5.0.0 以上。
仕事で（同僚が）ちょうどアップデートしようとしていたところ、テストが大量に失敗してたどり着きました。
手伝ったのでネタちょうだいと言ったらくれるとのこと。

レコードのIDが見当たらないとかのエラーでした（よく覚えてない）。

## 具体的な挙動

[イシュー](https://github.com/thoughtbot/factory_bot_rails/issues/314
)からの例を拝借。

```ruby
FactoryBot.define do
  factory :user do
    association :doggie
  end
end
```

このとき、

```
FactoryBot.build :user
```

のように **build** したとき、

- 4.11 まで : 関連先の doggie を **create** する
- 5.0.0   : 関連先の doggie を **build** する

## どゆこと？
イシューからリンクがありましたが、[公式のGetting Started](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#associations)
> In factory_bot 5, associations default to using the same build strategy as their parent object
> factory_bot 5では、関連先は親オブジェクトと同じbuildストラテジを利用するのがデフォルトです



## 前の挙動が良い場合
可能であれば失敗するテストをひとつずつ修正していくのが一番だとは思いますが、いろんな事情がありますよね。

[さっきのトコ](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#associations)、少し下に

> If you want to continue using the old behavior, you can set the use_parent_strategy configuration option to false.
> 前の挙動がよければ、 use_parent_strategy オプションを false に設定することもできます

```ruby
FactoryBot.use_parent_strategy = false
```

これを失敗するテストの周辺なり `spec/rails_helper.rb` なりに書いておけば大丈夫なはずです。
RasPiでデジタルサイネージ（起動時に静止画/動画自動起動）

#先まとめ
・静止画はfimが便利だよ

#経緯
・展示先でネットワークに入れないのに備え、自動起動にしたかった
・のっぴきならない理由で画面が見れないので、自動起動にしたかった
・サイネージ運用なので動画/静止画をループで流すだけ

#自動起動編
・/etc/rc.localのexit 0の前に実行したいコマンドを追加するだけ
###他の方法には触れません

#動画編
・omxplayer便利。--loopパラ付けてループ再生させるだけ

#静止画編
・fbi使いたかった、けどうまく行かなかった。ぐぐったら世界中で同志がいた。
・omxplayerで静止画出来なかったっけ？→出来なかった
・せや一枚絵を動画にしたろ！！→劣化が酷すぎる上にサイズが大きすぎて再生されなかった

・fimって別の再生アプリ入れました。

```fimのinstall
sudo apt-get install fim
```
画面サイズあってるのに縦横比が何故かズレてたので

```fimの起動
fim -h ファイル名.png
#-h:高さで合わせる　-w:幅に合わせる
```
で、OK。起動までちょっと掛かる。consoleの文字流れるとその部分だけ黒くなってアレ。

#運用結果
・展示イベントは来週

#[シャットダウン用ボタンつけた](https://qiita.com/koukiwf/items/751c4faca2949dfe2e17)
picoCTF 2018 Desrouleaux - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b70643f5-9eae-69c0-3b48-bc796510eafd.png)

#解いてみた

リンクと添付ファイルがあります。
まずリンク行ってみますか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/10517a17-00b7-2689-3a23-4ee1fe06c860.png)

添付ファイルを調べて送信元IPアドレスの多いやつを答えてね。みたいなことでしょうか。
何となしにEnter押したらIncorrect!と言われてしまいました。

ということでファイルを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d29bbdaa-9740-d3a6-38cd-7240c9a61b0c.png)

中身はこんな感じでした。
送信元IPアドレスの中で数が多いやつを答えればいいっぽいので、並び替えてみると以下になりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/1465a031-594d-3d22-1b88-8052f3c05cf3.png)

3回が2つあるので、上の方を答えてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/64878924-a700-22f7-4209-8842ff43d6a5.png)

だそうです。
134.235.172.217の宛先でユニークなものを答える？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5d3c5bcf-a140-1ce7-1e12-691b5635dc9d.png)

まさかの2つだったのでどっちもユニークです。。。
とりあえず上を答えてみます。

接続が切れたので最初からやり直します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/26067cac-ceb7-bcb3-86aa-425ed0938aa7.png)

問題文が変わった！
とりあえず接続先は全部一意だったので一番上のを答えると間違ってた。
あー、IPを答えるんじゃなくて一意のIPアドレスが何個あるかを答えるのか。

接続が切れたので最初からやり直します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3baf4961-3bb9-6c77-fc59-e47d3f3c7cab.png)

接続先IPに送られた回数の平均か。
一瞬では計算できませんね。

接続が切れたので最初からやり直します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d4c0ae9c-e6aa-9c03-443a-7a771cba3255.png)

できたー。
ブラウザでJWT認証が必要なAPIサーバーにアクセスする

Graphqlで作成したJWT認証が必要なAPIサーバーに、ブラウザ(ここではChoromeを利用)を使ってアクセスする方法を解説します。

# JWTを取得
ログイン認証(ユーザIDとパスワード)を行うフォーム、またはAPIを使って、JWTを取得します。
開発中のサイトであれば、ログインフォームを作成して返ってきたJWTを表示するようにしておくと便利です。また、APIを使う場合は、curlが便利です(私は苦手です)

# Chromeの拡張機能「ModHeader」をインストール
JWT認証が必要なAPIサーバーにアクセスするためには、認証用のヘッダを付ける必要があります。
その時に便利なのが、Chromeの拡張機能「ModHeader」です。

![modheader.png](https://qiita-image-store.s3.amazonaws.com/0/334727/bb9128da-3e24-c0cd-0fe3-bf2444451461.png)

# JWT認証に必要なヘッダの設定
ChromeにModHeaderのアイコンが表示されるのでクリックします。

![icon.png](https://qiita-image-store.s3.amazonaws.com/0/334727/1d96e898-b8a3-1718-e7c9-bfd463397547.png)

ヘッダを設定する画面が開きますので、JWT認証に必要なヘッダ情報を設定します。
ヘッダ名は「Authorization」、値には「Beaer <トークン>」を設定します。

![header.png](https://qiita-image-store.s3.amazonaws.com/0/334727/58b896d3-a9f8-c298-fa20-c54ad0132416.png)

# JWT認証が必要なAPIサーバー(Graphql)にアクセス
JWT認証が必要なAPIサーバーにアクセスしてみます。

> http://localhost:3000/graphql

![graphql.png](https://qiita-image-store.s3.amazonaws.com/0/334727/1b447c09-2139-bf92-6117-95bbbdf6f83e.png)

アクセスできました！
laravelでfillでセーブしようとしたらエラーが出たとき

初心者から職人になりたくて、fill使ったらエラーが起きて、エラー文でぐぐってもよくわからず、fillメソッド軽くソース読んだら$fillableに、保存したいcolumn名を入れないといけないみたい。

と思ったところでドキュメント読んだらちゃんと書いてあった。
まず、ドキュメントを読んで、わからなければソースを見るのがいいみたい。

```php
// error
Add [_token] to fillable property to allow mass assignment on 

// このエラーとのときは、fillableを指定する
protected $fillable = ['hoge', 'fuga'];

// error ？？ このときは、columnに足りないのをつけたす。
SQLSTATE[HY000]: General error: 1364 Field

// add
protected $fillable = ['hoge', 'fuga', 'piyo'];

```

```php:

<?php

namespace Illuminate\Database\Eloquent\Concerns;

use Illuminate\Support\Str;

trait GuardsAttributes
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];
```

参考
LaravelのORMで初心者から職人へ
https://qiita.com/henriquebremenkanp/items/cd13944b0281297217a9

laravel/framework
framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php
https://github.com/laravel/framework/blob/5.7/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php


Laravel 5.5 Eloquent：利用の開始
複数代入
https://readouble.com/laravel/5.5/ja/eloquent.html#mass-assignment
f.submit でFontAwesomeのアイコンが表示できない

# submitボタンの中にFontAwesomeを入れたい
下記のコードだとFontAwesomeのアイコンが表示されない。
※FontAwesomeを使う際のヘルパーメソッドは[こちら](https://qiita.com/Uuya/items/dbdd40ba1e753f4a72ec)を見て判断してください

```submit.html.haml
  = f.submit class: "follow-btn" do
    = icon('fa', 'user-plus')
    フォローする
```

# 解決法
button_tagを使って解決することができました。

```submit.html.haml
  = button_tag type: 'submit', class: "follow-btn" do
    = icon('fa', 'user-plus')
    フォローする
```
CentOS7 プロキシ設定備忘

## wget用プロキシ設定

```shell:command
# cat ~/.wgetrc
http_proxy=＜URL＞:＜Port＞
https_proxy=＜URL＞:＜Port＞
proxy_user=＜ユーザ名＞
proxy_password=＜パスワード＞

```

## curl用プロキシ設定

```shell:command
# cat ~/.curlrc
proxy-user=＜ユーザ名＞:＜パスワード＞
proxy=＜URL＞:＜Port＞

```

## yum用プロキシ設定

```shell:command
# cat /etc/yum.conf
＜省略、以下追記＞

proxy=＜URL＞:＜Port＞
proxy_username=＜ユーザ名＞
proxy_password=＜パスワード＞

```
異なるサブドメイン間のLaravelでセッションを維持する

# はじめに
1台のマシン上にバーチャルホストで複数のサイトを運用していたとします。
DBは共通で、同じドメインのサブドメインで運用されたLaravelのサイトだったとします。

sample01.example.jp
sample02.example.jp

ここまでくると、片方でログインしたらもう一方でもログイン状態を維持したい、という要望だって出てくるでしょう。

セッション管理をRedisで行う選択肢が取れる場合、Laravelであれば特別なことは何もせずに達成可能です。

# 解決方法
クッキーのdomain属性を利用します。
ドメイン名が後方一致する場合のみクッキーを送信する、という条件です。

Laravelであれば設定ファイルのsession.phpか.envファイルにてSESSION_DOMAINを設定する事で利用できます。

```config:.env
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_DOMAIN='.example.jp'

REDIS_HOST=xxx.cache.amazonaws.com
REDIS_PASSWORD=null
REDIS_PORT=6379
```

# 注意点
.envファイルで設定したのに、別のサイトへ移動した瞬間にログアウトされる問題に悩まされた事がありました。

原因は、一報ではミドルウェアグループでセッションミドルウェアを呼び出し、
もう一方ではグローバルミドルウェアでセッションミドルウェアを呼び出していたためでした。

```php5:app/Http/Kernel.php
protected $middlewareGroups = [
    'web' => [
        \Illuminate\Session\Middleware\StartSession::class,
    ],
];
```

```php5:app/Http/Kernel.php
protected $middleware = [
    \Illuminate\Session\Middleware\StartSession::class,
];
```

# おわりに
Laravelは大変便利ですが、出来ることが多すぎて些細な？設定ミスで動かなくなる事があり悩まされます。
PhpSpreadsheetに書き込む

phpでExcelを読み書きする時は、PhpSpreadsheetが便利です。

公式ドキュメントは、こちら↓
https://phpspreadsheet.readthedocs.io/en/develop/

#書き込む
##1. 新規ファイルに書き込む

```php
// ①シートの新規作成
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// ②シートへの書き込み 配列を、指定セルから描写することもできます。
$header = [  …  ];
$sheet->fromArray($header, null, 'A1');

// ③スタイルの定義 配列で色や文字フォントを指定します。
$styleArray = [
    'alignment' => [
        'vertical' => Alignment::VERTICAL_CENTER,
        'wrapText' => true
];
$sheet->getStyle($styleRange)->applyFromArray($styleArray);

// ④ファイルセーブ サーバの指定フォルダに保存することもできますし、
// 保存先に 'php://output' を指定しヘッダを追加するとクライアント端末へ送信しダウンロードダイアログを表示させます。
header('Content-Disposition: attachment; filename=' . mb_convert_encoding('案件一覧.xlsx', 'SJIS-win', 'UTF-8'));
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$writer = IOFactory::createWriter($spreadSheet, 'Xlsx');
$writer->save('php://output');
```

##2. テンプレートファイルを使って書き込む
あらかじめサーバに配置したテンプレートを読み込んで、ファイルを作ることもできます。

```php
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx');

$worksheet = $spreadsheet->getActiveSheet();

$worksheet->getCell('A1')->setValue('John');
$worksheet->getCell('A2')->setValue('Smith');

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls');
```
picoCTF 2018 Client Side is Still Bad - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ef970c34-87a2-47bf-bb45-dcf788b81a0f.png)

#解いてみた

リンクをクリックしてみるとログイン画面が出てきました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6e8d9322-05c3-893b-60d2-f6387b5b1523.png)

ソースを表示してみると簡易的なつくりでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a6143a36-4360-4883-9c0f-a93b161d7f9a.png)

このまま答えでした。