OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptで型クラスを書いたらどうなるか考えてみた

[PHPで型クラスを書くとどうなるか考えてみた - Qiita](https://qiita.com/suin/items/ccfdfc53b55ebb2539a1)に続いてちゃんとジェネリクスとコンパイルがある言語のTypeScriptで型クラスを書いたらどうなるのか考えてみた。TypeScriptでは3つめの`boolean`なのに`string`を渡している行がコンパイルエラーになった。

```ts
type Show<T> = (f: T) => string
const stringShow: Show<string> = (f: string) => f
const boolShow: Show<boolean> = (f: boolean) => f ? 'true' : 'false'
const quote = <T>(show: Show<T>) => (f: T) => '"' + show(f) + '"'

console.log(quote(stringShow)("hello")) //=> "hello"
console.log(quote(boolShow)(true)) //=> "true"
console.log(quote(boolShow)("hello")) //=> Argument of type '"hello"' is not assignable to parameter of type 'boolean'.
```
噂の萌え絵からモザイクを除去するAI「DeepCreamPy」を使ってみた

## 前提
この記事は，単に機械学習による画像処理の技術を検証するためのものであり，それ以外のあらゆる意図を含みませんしあらゆる行為を推奨しません．

## 必要なもの
- Windows環境
(Mac/LinuxのCLIでもできなくはないが，pipの依存関係に嵌まりやすいで，Pythonの闇に触れたくない人はWindowsを推奨．)
- [DeepCramPy](https://github.com/deeppomf/DeepCreamPy/releases)
- GIMP/Photoshop
- モザイクを除去したい画像[^1] (カラー画像に限る[^2])

## 手順
### 0. DeepCreamPyの入手
上記のリンクから`DeepCreamPy_1.2.1-beta_win64.zip`を入手して展開する．
### 1. 画像の加工
DeepCreamPy(以下CreamPy)でモザイクを除去するには，モザイクのかかった画像と，消したいモザイク部分を緑(R=B=0 G=255)で塗りつぶした画像の2つが必要になる．なので，GIMP/PSで消したいモザイク部分を塗りつぶす. この塗りつぶしはだいたいで構わない.
### 2. 画像の設置
まず、`decensor_input_original`フォルダにオリジナルの画像を設置する．次に，`decensor_input`フォルダに*同名*で緑を塗りつぶしたファイルを設置する．
### 3. CreamPyの実行
```
censor.exe --is_mosaic=True
```
をコマンドラインから実行します．
WindowsのCLIが分からない/触りたくないという人は
```
decensor.exe --is_mosaic=True
pause
```
と書かれたテキストファイル(名前は任意)を作成して，拡張子を.batに変更して，それをダブルクリックしてください．

### 4.モザイクが除去された画像の生成
`decensor_output`フォルダに，モザイクが除去された画像が生成される．

## 感想
- CreamPyはすごい
- CreamPyを作った人はすごい
- Deep Learningはすごい


[^1]: この記事とは何の関係もありませんが，最近名前がFに変わった社のソーシャルDRM対応なフルカラー同人誌は，購入者が書籍のデータを単なる画像ファイルとして扱うことが可能です．
[^2]: ニューラルネットワークにスクリーントーンを認識させるのが難しいので白黒は非対応らしいです．
PHPで型クラスを書くとどうなるか考えてみた

PHPで型クラスを表現するとどうなるか考えてみた。PHPは型宣言できるものの、ジェネリクスが無かったり、型の整合性チェックができるコンパイルの仕組みも無いので、型クラスを用いてもScalaのようなメリットはないが、凝集性の高い設計パターンとしての有益性はあるかもしれない。

```php
<?php

/**
 * 型クラス
 * @template T
 */
interface Show
{
	/**
	 * @param T $value
	 */
	public function show($f): string;
}

/**
 * @inherits Show<string>
 */
class StringShow implements Show
{
	public function show($f): string
	{
		assert(is_string($f));
		return $f;
	}
}

/**
 * @inherits Show<bool>
 */
class BoolShow implements Show
{
	public function show($f): string
	{
		assert(is_bool($f));
		return $f ? 'true' : 'false';
	}
}

/**
 * @template T
 * @inherits Show<T>
 * @return Closure(T):string
 */
function quote(Show $show) {
	/**
	 * @param T $f
	 */
	return function ($f) use ($show) {
		return '"' . $show->show($f) . '"';
	};
}

echo quote(new StringShow())('hello'), PHP_EOL; //=> "hello"
echo quote(new BoolShow())(true), PHP_EOL; //=> "true"
echo quote(new StringShow())(1), PHP_EOL; // assertion failure

```
Amazon Linux -  ApacheにBASIC認証をかけてみる

Amazon Linux に Apache 環境でBasic認証をかけてみた。


---
ここでは、ユーザー名：user1、パスワード：pass で認証設定をする。

`htpasswd -c -b /etc/httpd/conf/.htpasswd user1 pass`
![スクリーンショット 2018-11-01 21.08.42.png](https://qiita-image-store.s3.amazonaws.com/0/280929/329ebb6e-c470-04b6-ab42-1984765665ce.png)

httpd.conf にBASIC認証の設定を追加する。
`vi /etc/httpd/conf/httpd.conf`

```ruby:
<Directory "/var/www/html/">
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /dev/null
AuthName "Basic Auth"
AuthType Basic
Require valid-user
</Directory>
```

![スクリーンショット 2018-11-01 21.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/280929/512b09d7-2dc5-294e-8c58-4573415d0d34.png)
![スクリーンショット 2018-11-01 21.10.50.png](https://qiita-image-store.s3.amazonaws.com/0/280929/5bb5d2a4-93fd-1980-284b-d9c6265f27f5.png)

Apacheを再起動する。
`/etc/init.d/httpd restart`

表示された！
![スクリーンショット 2018-11-01 21.13.18.png](https://qiita-image-store.s3.amazonaws.com/0/280929/8ec19bbd-992b-ba39-f72e-9ecad1eee9db.png)
Javaでシステムプロパティから簡単に整数を取得する

Javaでシステムプロパティ（`-D`から始まるパラメータ）から整数を取得するのはとても簡単です。
[IntegerのgetInteger(String, int)](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#getInteger-java.lang.String-int-)メソッドを使うだけです。

```java:Demo.java
public class Demo {

    // 今回のサンプルでは myapp.loop.count というシステムプロパティとする
    private static final String SYSTEM_PROP_KEY = "myapp.loop.count";

    public static void main(String[] args) {

        // ★ポイント
        Integer count = Integer.getInteger(SYSTEM_PROP_KEY, 10);
        String value = "";
        for (int i = 0; i < count; i++) {
            value = value + "*";
            System.out.println(value);
        }
    }
}
```

**★ポイント**
第一引数はシステムプロパティのキー（文字列）、第二引数はデフォルト値になります。
デフォルト値はシステムプロパティが設定されていない場合や、設定した値がIntegerに変換できない場合に適用されます。

```console:試しに実行してみる
C:\temp>javac Demo.java

C:\temp>java Demo
*
**
***
****
*****
******
*******
********
*********
**********

C:\temp>java -Dmyapp.loop.count=5 Demo
*
**
***
****
*****

C:\temp>java -Dmyapp.loop.count=x Demo
*
**
***
****
*****
******
*******
********
*********
**********

C:\temp>
```

最初はシステムプロパティを設定していない場合です。この場合はデフォルト値の10となります。

二回目はシステムプロパティで5を設定した場合です。この場合はしっかりと5が設定されます。

最後はシステムプロパティにIntegerに変換できない値（例ではx）を設定した場合です。この場合もデフォルト値の10となります。

システムプロパティから整数を取得したい場合、わざわざ[System.getProperty(String)](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#getProperty-java.lang.String-)を使う必要がないので簡単ですね！

以下は新人向けの記事です。参考までに。

* [新人に悲観ロックによる排他制御を体験してもらう](https://qiita.com/5zm/items/cc33fa9f591892222153)
* [新人にPostgreSQLのシーケンスを理解してもらう](https://qiita.com/5zm/items/da82cec73e097d2a97d0)
* [PostgreSQLでは以上、以下（=>、=<）が使えない！？](https://qiita.com/5zm/items/e418e3c17c489bb584b6)
[随時更新]Javaでデザインパターンまとめ

#はじめに
[GoF](https://ja.wikipedia.org/wiki/ギャング・オブ・フォー_(情報工学))のデザインパターンを紹介している[『増補改訂版 Java言語で学ぶデザインパターン入門』](https://www.amazon.co.jp/増補改訂版Java言語で学ぶデザインパターン入門-結城-浩/dp/4797327030/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=2ZE4GPYNN55JGDR5QMHP)を読んで、学んだ内容についてまとめます。
**※随時更新を行っていきます。**

**その他参考**
・https://github.com/iluwatar/java-design-patterns

#パターン一覧
###生成に関するパターン
- **Abstract Factory**
- **Builder**
- **Factory Method**
- **[Prototype](https://qiita.com/mk777/items/d745f3b22eac12989819)**
- **[Singleton](https://qiita.com/mk777/items/08b4a1c51d1833514f87)**

###構造に関するパターン
- **Adapter**
- **Bridge**
- **Composite**
- **[Decorator](https://qiita.com/mk777/items/6f463466027939a4b137)**
- **[Facade](https://qiita.com/mk777/items/071ec30a1f7231029aae)**
- **[Flyweight](https://qiita.com/mk777/items/096d7825443ed7102261)**
- **[Proxy](https://qiita.com/mk777/items/f97e2125c987fb2b0e8f)**

###振る舞いに関するパターン
- **[Chain of Responsibility](https://qiita.com/mk777/items/7a8f23d3e58d77486fe4)**
- **Command**
- **Interpreter**
- **[Iterator](https://qiita.com/mk777/items/398bd26de44eac4f383b)**
- **Mediator**
- **Memento**
- **[Observer](https://qiita.com/mk777/items/126a619c7802bab6164b)**
- **State**
- **Strategy**
- **[Template Method](https://qiita.com/mk777/items/acb39f8f3c3ee2f1c252)**
- **Visitor**
bootstrapのrowで中央寄せにしようとした時の話

# はじめに
先日、bootstrap4で中央寄せをしようとした時に微妙に引っかかった時の話です。

# 何をしたかったか

行を追加して、その中の文字列を中央寄せにしたかったので、

```sample.html
<div class="row text-center">
    sample
</div>
```

とやったらうまく効きませんでした。

<img width="600" alt="真ん中寄せ失敗" src="https://qiita-image-store.s3.amazonaws.com/0/292500/b9a1a9d8-7c12-890f-9eda-c634d3245b87.png">

あれ？divってブロック要素で、text-alignで操作できなかったっけ？と思い、三パターンで比較してみました。

```sample.html
<div class="row text-center">
    row sample
</div>
<div class="text-center">
    non row sample
</div>
<div class="row">
    <div class="col text-center">
        row col sample
    </div>
</div>
```

<img width="529" alt="真ん中寄せ比較" src="https://qiita-image-store.s3.amazonaws.com/0/292500/24637b20-c967-af8e-3ff7-e5896757b1e1.png">
やっぱりrow単体で使うとダメっぽいですね。
開発者ツールで見ると一発でした。
<img width="325" alt="開発者ツール" src="https://qiita-image-store.s3.amazonaws.com/0/292500/8f9df631-ef7b-3c39-f874-4dcc3032d907.png">

「user agent stylesheet」で定義してあるdiv要素のdisplay:blockが、rowでflexに上書きされていました。
考えてみれば、そもそもrowはcolのラッパーとして使われるので、display:blockだとcolが並びません。

なんとなく行を増やしたいという理由でrowを使ってしまいましたが、適切なクラスを選択すべき(というか使わないべき)でした。

# 終わりに
CSSって、見た目は良くても使い方が違うということがあり、間違って使ってることが多そうです。難しい・・・。
iPad12.9インチ3rdモデル(2018)はsafe areaが変更

#あまりに細かすぎて見落としがちなのでちら書きします。
iPad 12.9インチ3rdをシミュレータで試すと、画面の下のほうに例のバーが出てきます。
![例のバー.png](https://qiita-image-store.s3.amazonaws.com/0/46631/d57b4372-567c-2a1e-4224-3713ca349040.png)

これは、safe area考慮しないといけないやつでは？ と思い、次のコードで試します。

```
print("top", view.safeAreaInsets.top)
print("bottom", view.safeAreaInsets.bottom)
print("left", view.safeAreaInsets.left)
print("right", view.safeAreaInsets.right)
```

#iPad 12.9インチ 2ndの結果
```
top 20.0
bottom 0.0
left 0.0
right 0.0
```
デバイスの縦横変えても同じ。topの20.0はstatus barです。

#iPad 12.9インチ 3ndの結果
```
top 24.0
bottom 20.0
left 0.0
right 0.0
```
これもデバイスの縦横変えても同じ。topが24.0になって、bottomが20.0になりました。
bottomに20.0のdanger area(?)が発生してますね。

topも変わっているのでステータスバーの比較をしてみました。
![statusbar.png](https://qiita-image-store.s3.amazonaws.com/0/46631/095e3898-29a0-f955-29c4-efbfc0506c1a.png)
左が2nd、右が3rdです。
3rdの方が多く取られてますね。

#まとめ
iPad12.9インチ3rdはbottomに20.0のdanger area(?)が発生し、ステータスバーも24に太くなった。

#最後に
11インチの方は新規サイズなので見落とすことはないと思いますが、こっちの12.9インチにも注意ですね。特に画面サイズを取得して直接レイアウトしている方は。

#ほかの方
新型iPad Pro (2018) のsafeAreaInsetsの値が気になって夜も眠れない
https://qiita.com/cokaholic/items/cac7434fbe92f89c42ad
気になって気になって１日たったの８時間しか眠れなかったそうです。
「組み込みメーカーならではのAWS Cognitoの使い方」というタイトルで AWS Dev Day 2018 LT大会で登壇しました。

https://aws.amazon.com/jp/aws-devday-tokyo-2018/

<img width="957" alt="スクリーンショット 2018-11-01 20.29.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/92230/d2becff8-f47b-b20b-3d9b-451cffa56f9e.png">

https://www.slideshare.net/shotaueda3/aws-cognito-121308512
## 前置き
LT大会に参加された方ありがとうございました。
いままで、Qiitaには大変お世話になっていたのですが、正しい情報を正しく伝える自信がなく
記事の投稿を躊躇していました。

今回のLT大会を通して少し自分に自身がついたのでこれを皮切りにどんどん記事をあげていこうと思いました。

## 本題
### [組み込みメーカーならではのAWS Cognitoの使い方](https://www.slideshare.net/shotaueda3/aws-cognito-121308512)

というタイトルでslideshareに登壇資料をアップしています。

みなさんのAWSの設計のサポートになればと幸いです。

## 補足

### Lamabda拡張のドキュメントについて

資料の中には

<img width="876" alt="スクリーンショット 2018-11-01 19.59.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/92230/960e4d97-6dfb-f62a-a6ee-0683d71e4cb6.png">

のようなイメージがあるのですが。

- ピンク枠の①の拡張については
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

- ピンク枠の②の拡張については
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

に記載があります。

### SAMでの記載についての注意事項
全てサーバーレスで構築しているため、Serverless Application Model (AWS SAM)で記載できるのですが、ApiGatewayでLambdaオーサーライザーを指定する方法について記載されている記事がなかなかないようなので公開できる範囲で記載します。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/serverless_app.html

`Type: AWS::Serverless::Api`の中で

```yaml

securityDefinitions:
  hoge-authorizer:
    type: apiKey
# AuthorizationにIDTokenを付加することを想定
    name: Authorization
    in: header
    x-amazon-apigateway-authtype: custom
    x-amazon-apigateway-authorizer:
      type: request
      identitySource: method.request.header.Authorization
      authorizerUri:
# Authorizerは認証を行うLambdaを指定
        !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Authorizer.Arn}/invocations
```
のようにsecurityDefinitionsにAWSのswaggerの拡張で指定します。
これを

```yaml
x-amazon-apigateway-integration:
  security:
    - hoge-authorizer: []
```
のように指定してカスタムセキュリティを指定します。

もし、需要があるようであれば`Type: AWS::Serverless::Api`と`Type: AWS::Serverless::Function`でEventを使わないでAPIを定義する方法を記載したいと思います。

記事をご覧になっていただきありがとうございました。


- swaggerの文法については[こちら](https://apihandyman.io/writing-openapi-swagger-specification-tutorial-part-1-introduction/) (英語記事ですがこれ以上良い資料を知らないです...)
- swaggerのAWS拡張については[こちら](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-swagger-extensions.html)を確認ください
FlowでOutlook→Teamsに通知する際に改行が無視されないようにする

##最近
社内でOffice365のTeamsを積極的に利用するようになってきてまして、
メールの確認するの忘れてた！なんてことが良くあるんですよ。

メールもTeamsに通知してしまえと思って
Flow使って設定したんですが、改行が無視されちゃうんですよね。

##Flowの設定

一応設定を載せる

トリガー「新しいメールが届いたとき」をフローに追加

![2018-11-01_19h59_11.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/2f660587-9159-8b37-b843-09cb9efcf048.jpeg)

中身は特に何も設定してません。フォルダーを選択したぐらい。

![2018-11-01_20h00_33.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/2e0fa9de-889d-ec15-c129-cfe8cf7017eb.jpeg)

次、アクション「投稿メッセージ」をフローに追加

![2018-11-01_20h02_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/358c3238-6862-c2c8-e168-8ae8cbfd4acc.jpeg)

中身はこんな感じ
チームID、チャネルIDは自分のアカウントを接続としてちゃんと設定しておけば、
リストボックスから選択できるはず。

![2018-11-01_20h03_24.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/418cef2b-e2e7-b8f2-e291-c9819e8ec161.jpeg)

##メールを受信してみる１

これが、
![2018-11-01_19h33_14.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/0bb9dc03-d775-6da5-7dce-44d048710ee6.jpeg)

こう！
![2018-11-01_19h31_56.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/5fa793d4-64f9-074b-db64-485cbfb67f8f.jpeg)

読みづらい・・・呪文だ・・・
これだと単なる通知としてしか使えない・・・

##Flowを少し変更する

「新しいメールが届いたとき」の出力内容をみてみると、
` "Body": "あああああああああああああああ\r\n\r\nテスト用メール\r\n\r\nあああああああああああああああ\r\n\r\n"`

HtmlTextの改行コードが入ってる（言葉あってるかな）

リッチテキストの改行コード（\<br>）にすればいけるかも（言葉あってるかな）

FlowのForum探したらそれっぽいのありました。
[Replace Newline in Flow Expression](https://powerusers.microsoft.com/t5/Building-Flows/Replace-Newline-in-Flow-Expression/m-p/58873#M5411)

これでいけそう
`uriComponentToString(replace(uriComponent(triggerBody()?['Body']), '%0D%0A', '<br>'))`

必要なところには直接\<br>を書いて、HtmlTextには「式」を使って、変換をかける。

![2018-11-01_20h22_53.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/682af58b-411b-1775-b87d-d6d688bb6e6f.jpeg)

##メールを受信してみる２

![2018-11-01_20h25_15.jpg](https://qiita-image-store.s3.amazonaws.com/0/78572/e5410509-ff2e-d700-1e15-3187a0e341e4.jpeg)


しゃ！

いいですね　Flow×Teams　
Flowも最初の頃よりだいぶ使いやすくなってきたし（更新頻度と速度早くて久々触ると分かんないこと多いけど）

この調子でいろいろ自動化していきたいです。
Foreign key constraint is incorrectly formedのエラーが発生した時 in MySQL 備忘録



# Foreign key constraint is incorrectly formedのエラーが発生した時 in MySQL



### エラー内容

```
Error Code: 1005. Can't create table `test_f`.`product_menbers` (errno: 150 "Foreign key constraint is incorrectly formed")    0.078 sec
```



# 原因

このエラーが起こる大抵の場合は、外部キーの参照先がユニークなカラムでない場合に起こります
どこを参照しようとしているのかテーブルの構造を舐め回す様にチェックすれば良いでしょう

その他の原因としては異なるデータベースエンジンを使用してる場合に起こる場合もあります

外部キーとは他のテーブルの行をユニークに特定する為のものです
参照先のテーブルのカラムが本当にユニーク（重複が発生しない）カラムであるか確認して下さい



## ユニークであるか確認する方法

例えば下記のテーブルでは「id」と「name」はそれぞれユニークなカラムだと言えます

```sql:
CREATE TABLE IF NOT EXISTS (
    id INT AUTO_INCREMENT,
    name VARCHAR(30) UNIQUE,
    PRIMARY KEY (id)
)DEFAULT CHARSET=utf8mb4;
```

`id` は 主キーですので自動でユニークキー制約が付きます。なのでユニークだと言えます
`name` はユニークキー制約が指定されていますのでユニークだと言えます。


- 既に作られたテーブルの構造を確認したい場合は下記のSQLで確認できます

```sql
SHOW CREATE TABLE db_name.table_name;
```





# note

以下は備忘録です



### 実行しようとしたSQL

```sql
CREATE TABLE IF NOT EXISTS `product_menbers` (
`id` INT NOT NULL AUTO_INCREMENT,
`product_id` SMALLINT NOT NULL COMMENT '作品番号',
`student_id` SMALLINT NOT NULL COMMENT '学生ID',
`leader_flg` BOOLEAN,
CONSTRAINT `product_menbers_to_product_id` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`),
CONSTRAINT `product_menbers_to_student_id` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`) ON UPDATE CASCADE ON DELETE CASCADE
)DEFAULT CHARSET=utf8mb4 COMMENT='チーム構成一覧';
```


### 実行結果とエラー内容
- 
```sql
Error Code: 1005. Can't create table `test_f`.`product_menbers` (errno: 150 "Foreign key constraint is incorrectly formed")    0.078 sec
```



# env

検証環境
windows 10
xampp v3.2.2
mysql 8.0
mysql workbench 8.0.13



# tag

mysql
error
エラー
Error Code: 1005
エラー 1005
原因
対処法
直し方
実行できない
方法
window.matchMedia は超便利な件

レスポンシブデザインのサイトを構築していく中で、「この横幅の時はこうで、それ以上はこう・・・」なんて場面があると思います。

それがJavaScriptを利用してスライダーを使用していた場合、
・767px以下の時はスライダーは解除する。
・それ以上の場合はスライダーが動く

なんてのを今までは

```js
$(window).on('resize', function(){
    var myWindowWidth = $(window).width();
    if(myWindowWidth < 767){
       hoge();
    }else{
       hogehoge();
    }
});
```

なんてやってましたが、リサイズするたびイベントが行われるのでスライダーの挙動を制御しきれない場面がありました。
他にもTimerを利用したりとしていましたが綺麗では無い。

そこでこれ。「window.matchMedia」です。
とある点（ブレイクポイント）を通過したときのみ、イベントが発火します。
例えば定番ライブラリ「[slick](http://kenwheeler.github.io/slick/)」を利用した場合、上記の動きを実現させるには

```js
$(document).ready(function(){
  $([selector]).slick();   //とりあえず一回起動
  if(window.matchMedia("(max-width:767px)").matches){
      // 読み込みが完了したときに、767px以下の場合に行いたい処理
      $([selector]).slick('unslick');   //スライダー解除
  }else{
      // 読み込みが完了したときに、767px以上の場合に行いたい処理
  }
  function matchFunc(){
      if(window.matchMedia("(max-width:766px)").matches){
        // windowサイズを変更して、766px以下になったら行うイベント
        $([selector]).slick('unslick');   //スライダー解除
      }
      if(window.matchMedia("(min-width:767px)").matches){
        // windowサイズを変更して、767px以上になったら行うイベント
        $([selector]).slick();   //スライダー起動
      }
  }
  window.matchMedia("(max-width:767px)").addListener(matchFunc);
});
```

とこんな感じです。
スッキリとして見栄えもいいです。
Vue CLI 3でカレントディレクトリにプロジェクトを作成する方法

# 概要

Vue CLIで既存のディレクトリ内にプロジェクトを作成したい

# カレントディレクトリにプロジェクトを作成

["vue create" in current directory ](https://github.com/vuejs/vue-cli/issues/1509)

```bash
$ vue create .

Vue CLI v3.1.0
? Generate project in current directory?
```

`Yes` と答えると、カレントディレクトリにプロジェクトを作成出来る

コードでいうと[このあたり](https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli/lib/create.js#L35)

# 参考

[Creating a Project | Vue CLI 3](https://cli.vuejs.org/guide/creating-a-project.html#vue-create)
["vue create" in current directory ](https://github.com/vuejs/vue-cli/issues/1509)
LaravelでFullCalendarを使おうとしてハマった

# 何が起きたか
とあるチュートリアル記事を参考にし、cdnjs経由で`fullcalendar.js`を読み込もうとした。しかしどうも読み込まない。
試行錯誤の末、原因はわからないが`app.js`を消すと正常に読み込まれ動作することがわかった。

```php:app.blade.php

...
//cdnjs経由でFullCalendarを読み込みたい
<script src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.js'></script>

//これを消すとカレンダーは正常に動作するが...
<script src="/js/app.js"></script>

...

```

しかし、`app.js`を消すとBootstrapなど、Laravelに最低限必要なJavascriptすら読み込まれなくなってしまう。

# 解決
node.js経由でFullCalendarをインストールし、それを`app.js`から参照するようにしたところ、正常に動作した。

```terminal:ターミナル
$ npm install fullcalendar
```

```javascript:resources/js/app.js

...

require('./bootstrap');
// 追記
require('fullcalendar');

...

```

Laravel mixでコンパイルを走らせるとちゃんと動作することが確認できた。

# まとめ

なぜapp.jsと競合するのかよくわからなかったが、一応正統派っぽい解決はできてよかった。
FPGAで加算器つくるとき、何入力にすればいいの？？

# FPGAで加算器つくるとき、何入力にすればいいの？？

と思ってググったら、

* [FPGAで加算器を実装するということ - 3項加算](https://qiita.com/srmfsan/items/bc28156c41e6a26315cb)
* [FPGAで加算器を実装するということ - 多入力加算 1](https://qiita.com/srmfsan/items/1e8f866937f3f41c6f17)

を見つけた。

Altaraでは3入力にするとコスパがいいらしい。
ALMの共有演算モードというのを使うことができるから、とのことだが、こいつはIntel(Altera)のデバイスのプリミティブである。[Arria10の共有演算モード](https://www.intel.co.jp/content/www/jp/ja/programmable/documentation/sam1403483633377/sam1403481105488/sam1403481189146/sam1403481232939.html)に詳細が書いてある。

で、Xilinx(Kintex Ultrascale)はどうなの？？？
と調べたところ、3入力と4入力はあまりかわらず、2入力のFmaxが400MHz越えとかなり良い結果になった。

- [検証用のコード(Github)](https://github.com/nv-h/multiple_input_adder)


Xilinxでは200MHz程度の動作周波数でよければ3入力、400MHz動作が必要な場合は2入力が良さそう。


# Xilinxのデバイスの下調べ

DSPについての話はいくつかあって、公式にも記載されている。

- [7 SeriesのDSP48E1の資料(ug479)](https://japan.xilinx.com/support/documentation/user_guides/j_ug479_7Series_DSP48E1.pdf) → 3入力加算器が構成できるらしい
* [UltrascaleのDSP48E2の資料(ug579)](https://japan.xilinx.com/support/documentation/user_guides/j_ug579-ultrascale-dsp.pdf) → 4入力加算器が構成できるらしい

LUT(CLB?)については[ug574](https://japan.xilinx.com/support/documentation/user_guides/j_ug574-ultrascale-clb.pdf)に書いてあるが、加算器の構成についてはよくわからない。


# Xilinxデバイスでの実験

KCU105のボード設定で、クロック入力を300MHzに制約してVivado 2018.2でインプリしてみた。雑な実験なのでクロックだけ別にして全部まとめてimplしたので、その悪影響はあるかもしれない。LUT/FF使用量は、synthの結果で、WNSはimplの結果を記載している。
(冒頭の記事を参考に、VHDLに書き直したのと雑なシミュレーション環境とかを追加した)

なんか、Fmaxが異常に良いし、素直に2入力加算器使えってことなのかな？
あと、下調べで多入力できることが分かっているDSP使うとどうなるのかな？

|               | Latency | LUT  |  FF  |  WNS[^1]  |  Fmax[^2]  | <font color = "gray">(Altera Fmax[^3])</font> |
|---------------|---------|------|------|-----------|------------|-----------------|
| 256入力加算器 | 1clk    | 4149 |   32 | -4.246ns | 132MHz | <font color = "gray">(70MHz)</font>           |
| 2入力加算器   | 8clk    | 8160 | 8160 | +0.921ns | 415MHz | <font color = "gray">(225MHz)</font>          |
| 3入力加算器   | 6clk    | 4224 | 4224 | -0.380ns | 269MHz | <font color = "gray">(213MHz)</font>          |
| 4入力加算器   | 4clk    | 7735 | 2720 | -0.598ns | 254MHz | <font color = "gray">(159MHz)</font>          |

[^1]: `create_clock -period 3.333`で制約したときのimpl結果
[^2]: 1000 / (3.333 - WNS)で算出([参考URL(AR# 57304)](https://japan.xilinx.com/support/answers/57304.html))
[^3]: Cyclone V / Quartus 17.0.0 Lite Edition / 300 MHz 制約 (元記事から引用)


# Xilinxデバイスでの実験(DSP)

単純に、以下のような記述を追加して同じようにimplを実施してみた。(今[ug901](https://www.xilinx.com/support/documentation/sw_manuals_j/xilinx2018_2/ug901-vivado-synthesis.pdf)見たら`use_dsp`が推奨なのね。。。)

```vhdl
	attribute use_dsp48 : string;
	attribute use_dsp48 of sum_reg : signal is "yes";
```

性能は悪くなった。DSP使用数をみると意図通りにできていないようにも見える。

|                    | Latency | LUT  |  FF  | DSP |  WNS[^1]  | Fmax[^2] |
|--------------------|---------|------|------|-----|-----------|----------|
| 256入力加算器(DSP) | 1clk    |    0 |    0 | 254 | -11.332ns | 68MHz    |
| 2入力加算器(DSP)   | 8clk    | 7936 | 7680 |   7 | +0.751ns  | 387MHz   |
| 3入力加算器(DSP)   | 6clk    | 4220 | 4064 |   2 | -0.681ns  | 249MHz   |
| 4入力加算器(DSP)   | 4clk    | 7574 | 2432 |   4 | -1.008ns  | 230MHz   |
rspec



```
require 'string_analyzer.rb'

describe 'string_analuzer' do
  context "with Vakid input" do
    it "string with vowel" do
      sa = StringAnalizer.new
      expect(sa.has_vowls? "uuu").to be true
    end

    it "string not with vowel" do
      sa = StringAnalizer.new
      expect(sa.has_vowls? "sss").to be false
    end
  end
end
```

テストの対象を読み込み

```
require 'string_analyzer.rb'
```

テストの括りを決める

```
describe 'string_analuzer' do
  context "with Vakid input" do
    it "string with vowel" do
```

インスタンス作成　
expect　再現
true false 期待値

```
  sa = StringAnalizer.new
  expect(sa.has_vowls? "uuu").to be true
    
  sa = StringAnalizer.new
  expect(sa.has_vowls? "sss").to be false
```
文字列 'true'/'false' を boolean 値へ変換

こんにちは。
文字列 ```'true'/'false'``` を boolean 値へ変換してみました。

```javascript
var booleanValue = {'true': true, 'false': false};
booleanValue["true"]  // ==> true
booleanValue["false"] // ==> false
booleanValue["otherwise"] // ==> undefined
```

-------------

* 「[[JavaScript][TypeScript] 文字列("true", "false")をboolean型に変換する](https://qiita.com/rnakayama/items/1a016ef5e813092898cb)」と言う記事も見つけました。
eshellでgitのブランチ名を表示したい時のためのパッケージ

# eshell使っていてgitのブランチ名を表示させたいと思った

bashでログインする時は.bashrに書いていたのだが・・・そこの調整はうまくいかなかった

自分と同じ境遇の人がいたら下記パッケージを用いると幸せになれる。

https://github.com/xuchunyang/eshell-git-prompt
Docker&Laradockの導入手順


ローカル(mac)で開発環境の構築手順

1. <a href="https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac">docker for mac</a>をインストール

※特にこだわりがなければStable版で問題ないです。


2.ターミナルで動作確認
以下コマンドを実行し、正常に動作していることを確認
$ docker --version
$ docker-compose --version
$ docker-machine --version
それぞれバージョンが表示されれば問題ありません。

3.Laradock用ディレクトリ作成
好きなディレクトリにlaradock用ディレクトリ作成。
DockerLaravelディレクトリを作成しました。

ディレクトリ移動します。
$ cd DockerLaravel


4.Dockerをファイル共有を利用する
Laradockのフォルダーをファイル共有する。
Docker メニュー > Preferences > File Sharing
上記より、Laradockのフォルダーが共有されているか確認し、共有されていない場合は追加する。

5.Laradock のインストール

インストール
$ git clone https://github.com/Laradock/laradock.git
laradockディレクトリへ移動
$ cd laradock
テンプレから.envファイルを作成
$ cp env-example .env
APP_CODE_PATH_HOSTはLaradockのwebサーバー上で同期するディレクトリです
初期値だとLaradockの置かれているフォルダーが同期されます。
Laradock本体は別にdocker上になくても大丈夫です

6.docker-composeコマンドを使用してlaradockを立ち上げる
以下コマンドを実行し、laradockを立ち上げます。
$ docker-compose up -d workspace

7.正常にlaradockが立ち上がっているか確認
$ docker-compose ps実行
laradock_workspace_1があれば問題ない。

8.Laravel プロジェクトの作成
ログイン
$ docker-compose exec --user=laradock workspace bash
laradockでログインユーザーを確認
$ whoami
laradock
コンテナの中に入ったら composer create-project でプロジェクトを作成する。testapp という名前のプロジェクトを作成する。

9.プロジェクトの作成
$ composer create-project laravel/laravel testapp

10.dockerから抜け、一度dockerを止める
$ exit
上記でログインしたdockerから抜けられます。
そして以下のコマンドで一度動作中のlaradock_workspace_1を止めます。
$ docker-compose stop


11.ドキュメントルートを修正
Nginxのドキュメントルートの修正

$ vim nginx/sites/default.confで修正します。

     ## 変更前
     #root /var/www/public;
     ## 変更後
     root /var/www/testapp/public;


12.docker-compose up 実行
$ docker-compose up -d php-fpm nginx mysqlを実行。

正常に処理が終了した後、http://localhost/へアクセス。

laravelのトップページが表示されていれば終了です。





参考URL

https://qiita.com/seijimomoto/items/1992d68de8baa7e29bb5

https://qiita.com/kiida510/items/cc31453f8034ceb73487

https://qiita.com/tdkn/items/b8aa24cca0ba2904f8e7

https://qiita.com/niisan-tokyo/items/d4485b8bb4fbfcfcc6be
git commit -mで簡単に３行コメントを残す方法

複数行のコミットメッセージを書く際、viエディタを使用せずに、３行コメント(複数行コメント)を残す方法はないか？と調べていた際の忘備録です。

## gitコマンド
`$ git commit -m"１行目メッセージ" -m"２行目メッセージ" -m"３行目メッセージ"`

これだけです。

## 具体例
今回は下記のようにコミットメッセージを残してみました。

１行目：要約
２行目：空白
３行目：詳細

<img width="1138" alt="Screen Shot 2018-11-01 at 7.19.00 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/277090/e5014a2b-3750-6954-cc2f-c975f29dd880.png">

`$ git log` で確認してみると、↑のように表示されます。

## もしコミットメッセージを間違えて入力してしまった時
`$ git commit --amend -m"１行目の訂正内容" -m"２行目の訂正内容" -m"３行目の訂正内容"`

ただし、これは直前のコミットに対してのものなので注意してください。

---

以上です。
素敵なGit操作をお楽しみください。
[Swift4] AutoLayoutのMultiplierを超簡単に動的に切り替える!

# 概要
こんにちは!
最近iPhoneX, iPhoneXS Maxなどいろんな機種が出てきて, 機種対応なかなかに苦戦してませんか?
特に, iPhoneSEのように解像度の低い端末だけ特別対応しなきゃいけない場面, けっこうあると思うんですよね.

そんなときに表題の通りなんですが, 例えばある要素の横幅をAutolayoutのConstraintでMultiplierを指定して決めている場合
`iPhoneSEだけ縦幅足りなくてパツパツになっちゃうから, 他の端末よりも画面に対する縦幅の比を少し小さくしたい!`
なんてことないです? (僕はわりとあります)

じゃあSwiftの中でMultiplier変えてやるか!
と思っても, 実はMultiplierってgetOnly(取得のみ可, 書き換え不可)なので

```swift:sample.swift
if deviseType = .iPhoneSE { // ここの条件は適当です笑
  sampleHeight.multiplier = 10:21
}
```
みたいな書き方はできないわけですよ...

じゃあNSLayoutConstraintのextention書くかと言われると, そこまでじゃないなー, となることもあるわけですね.
そんなときに, わりとお手軽にできる方法をご紹介いたします.

# まずはAutolayoutの設定をしましょー
まず, メインとなるConstraintを定義します.
![スクリーンショット 2018-11-01 19.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/142392/4d52a9f9-8a93-8d72-3304-e36909d88a4f.png)
次に, iPhoneSEなどの個別対応用Constraintを用意します.
![スクリーンショット 2018-11-01 19.05.22.png](https://qiita-image-store.s3.amazonaws.com/0/142392/897a359d-0807-2229-6b51-b0b3d52352ba.png)
画像の違いは2つあって
**1. Multiplierの中身**
**2. installedのチェック**
です.

installedにチェックが入っていないと, **そのConstraintはアクティブじゃない状態になります**ので, デフォルトでは1枚目の画像のConstraintが使用されるわけです.
あとは, Swift内で2つのConstraintのアクティブ・非アクティブを切り替えるだけですね!

# あとはSwift側で使うConstraintを切り替えよう
NALayoutConstraintは

```
isActive = true
isActive = false
```

でアクティブ・非アクティブを切り替えられるのでこれを使いましょう.

```swift:sample.swift
if deviseType = .iPhoneSE { // ここの条件は適当です笑
  sampleHeight.isActive      = false
  sampleHeightForSE.isActive = true
}
```

これで, デバイスによってMultiplierを切り替えることができるようになります.
2つ以上のConstraintを用意してもっと細かく条件を分けることも可能ですね.

ただ, Multiplierを切り替える機会があまりにも多いようであればextention書いてメソッド使いましょうね笑

不明点や, もっといい方法あればコメントにてよろしくお願いします!
ワードやエクセルに頼らず履歴書・職務経歴書を自作する

# エンジニアと言えば
紙より電子化。
ワード、エクセルよりHTML、Markdown、プレーンテキスト。

ということで、なるべくプレーンなテキストから履歴書と職務経歴書を自作することを目標とします。
GitHubとかに上げれば差分管理できるし、リポジトリはいっそ公開してもおもしろいですね。
履歴書は公開したら色々まずい気がしますが、職務経歴書はオープンにしている人も多いみたいです。

# 履歴書
履歴書はJISで規格が定まっているらしいです。
企業によってはJIS規格にきちんと定まっていないとNGだとか。
なので、なかなかフリーフォーマットとはいきません。

そんな中で、私が着目したのは以下の記事。
[YAMLで履歴書を作る](https://qiita.com/kaityo256/items/e3884d0109223c324baf)

こちらの方が作ってくださったプログラムを使い、YAMLファイルから履歴書PDFファイルが作成できます。
Webブラウザ上で似たようなことをしてくれるサービスなどもありますが、私はこのようなOSSを使ってプログラムも含めて自分で管理できる方が好みです。
必要に応じてカスタマイズもできますしね。

実はどこまでJIS規格に則っているのか私自身では確認していないのですが、ぱっと見では既存の履歴書とほとんど変わらないので大丈夫そうな気がします。
まあ何かあれば自分でカスタマイズすればなんとかなるかと。

顔写真もなるべくデータ化したいですよね。私は
証明写真機で写真を撮る -> コンビニでスキャン
で地道にデータ化しました。

# 職務経歴書
職務経歴書は特に規格とかないらしいです。
フリーフォーマットで自分のアピールしたい要素を多めに取ったりしたいところ。
そうなると、自由度の高い記法が求められます。
こんな時こそMarkdownですね。

私はAtom使いなので、以下のパッケージを利用しました。
[markdown-pdf](https://atom.io/packages/markdown-pdf)

Markdownを元に内部でHTMLを生成し、それをPDFに変換していると思われます。
READMEに書いてある通りにcssファイルを作成することでデザインをカスタマイズできます。
私はMarkdownファイルとcssファイルと出力PDFファイルをセットで差分管理しています。

職務経歴書はフリーフォーマットな代わりに、A4で2〜3枚みたいな慣例はあるみたいです。
PDFファイル上でのページ区切りをちゃんと意識してフォントサイズとかを調整したいところ。

ちなみに改ページは以下の記事に従ったらできました。
VScodeじゃないんですが、まあAtomのやつも大して変わらんってことですね。
[VScodeのMarkdownからPDF変換時に改ページを挿入](https://qiita.com/0xmks/items/4fec4116bb42120f5180)

職務経歴書の項目の洗い出しは、色々な職務経歴書を参照しましたが、まずは以下の記事が参考になりました。
Markdown職務経歴書のテンプレートが置いてあります。
[職務経歴書をGitHubで管理しよう](https://qiita.com/okoysm/items/abcad0b4aefa585bc50b)

あと、私の場合職務経歴書にURLを色々貼りましたが、結局紙で印刷して提出する必要があったので、苦肉の策としてURLの横にQRコードも添えました。

# というわけで
履歴書はYAML -> PDF、職務経歴書はMarkdown -> PDFでできました。

[エンジニアが読みたくなる職務経歴書 - dwango on GitHub](https://dwango.github.io/articles/engineers-resume/)

> 書類のフォーマットはPDFで

> 内容が必要十分であればそれでよいのですが、「PDFで、1ファイルにまとめて」あると、読むときも印刷するときも非常に助かります。

> ときどき「推薦文Word、履歴書Excel、職務経歴書Word」などというエンジニアにとっては非常に厳しい3ファイルが届いたりすると、なかなか厳しい気持ちになります。先日は履歴書Excelにマクロが書かれていてギョッとしたりしました。

とのことです。

おわり。
もう迷わない。Rubyのバージョンを上げる手段メモ(brewでruby-buildがうまくupdateできない問題を添えて)

### はじめに :cat: 
こんばんは。今日もぼちぼち元気にプログラミングを頑張っています。
昨日というか未明に1日いちQiitaをやろうと決めて早18時間ですか。時間というのは流れるのが本当に早いですね。
### 今回の記事で書くこと :pencil:  
- Rubyのバージョンを上げるたびに何をしたらいいのかをググっていた今日までの自分へ捧げるやることリストのようなもの。

### バージョンをあげるということの大切さ :sparkles: 

#### なぜバージョンがあがったのか？を考える :thinking: 
ここは皆さん共通認識であるかと思うのですが、一番はセキュリティ（脆弱性）との戦いを私達はしているということです。
バージョンがあがった背景をコードを読んだり、変更箇所のlogをみたりすると学べることが沢山あります。
#### バージョンがあがるということはよりよいものになろうとしている変化の一つ。その恩恵にあやかりたい。 :pray_tone1:  
さらに、新しい書き方をできるようになったり、自分たちが抱えているプロジェクトを常に綺麗な最善な形に保つための工夫を凝らすためにはバージョンをあげていくということは頑張ってついていきたいところだなぁと思っています。

### Ruby2.5.1からRuby2.5.3へあげる道のり :low_brightness: 

自分はrbenvによってrubyのバージョンを管理してもらっています。
なので、今回も以下のように進めようと思いました。

```bash
$ rbenv install --l
↓ # この流れを期待していた。
$ rbenv install <version>
```

ですが、探しても探してもRuby2.5.3が見つからない。
あれ？どうして？リリースされてるはず。。

rbenvが古いのかな？ruby-buildが古いのかな？
とHomebrewを使ってupdateするも、rbenvは最新ですと言われ、
依然として見つからないまま。

ruby-buildに何かあるはずだ。と公式にすがる。
https://github.com/rbenv/ruby-build#upgrading
そうすると `ruby-build` を直接pullしてくる方法が書いてあるのを発見。
homebrew経由でうまく行かなかっただけで、これならいけるかも、と実行してみる。

```bash
$ cd "$(rbenv root)"/plugins/ruby-build && git pull
```

そうすると、無事2.5.3が見つかり、無事にインストールできた。 :tada:

```bash
$ rbenv install --l
$ rbenv install <version>
```

プロジェクトのrubyバージョンを設定。

```bash
$ rbenv local 2.5.3
```

念の為、version確認。

```bash
$ ruby --version
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin17]
```
:tada:　:tada:

### その後やること

```bash
$ bundle install
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.2.3
  2.3.7
  2.4.2
  2.4.4
  2.5.0
  2.5.1
```

ので、bundlerをいれる。

```bash
$ gem install bundler
```

railsもいません。 :door: 

```bash
$ rails
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.2.3
  2.3.7
  2.4.2
  2.4.4
  2.5.0
  2.5.1

```

ので、railsをいれる。

```bash
$ gem install rails
```

よし、ローカルサーバーを立ち上げてみる。

```bash
$ rails s
Could not find rake-12.3.1 in any of the sources
Run `bundle install` to install missing gems.
```

rakeもバージョンが上がったものはないです。 
gemをinstallしてください。と言われる。

```bash
$ bundle install
```

これで、新しいRubyのバージョンで開発を進めることができます！
Happy coding! ˘ω˘)˘ω˘)˘ω˘) :musical_keyboard: 


### 追記(11月5日更新)

自分がこの記事をかいたときには理解できていなかったのですが、
コメントいただいたみなさんとのやりとりで正しい原因を理解することができたので、
残しておきます。
`homebrew-core` での `ruby-build`のupdateというのは10月20日に完了していました。 (コミットが完了している。)
なのに、今回自分がbrew経由でupdateすることができなかったのは、homebrew自体が最新のものでなかったことが原因ということです。自分がこの事象にあたった日時から見てこれが原因だと思います。
こまめにパッケージマネージャの管理はしていかないとなと強く思いました。
正しい理解になるようとコメントくださった皆さん、本当にありがとうございました。 :bow:
Ruby 2.5 系で CSV.generate のバグ

[ブログ記事](http://secret-garden.hatenablog.com/entry/2018/10/29/100150) からの転載です。

Ruby 2.5 系で `CSV.generate` を使用しようとしたら意図しない動作をして、調べてみたらバグだったのでそのまとめ。  
しかし、これ、結構クリティカルなバグだと思うんですけど、全然話題になってないのが不思議（当時は話題になっていたのかもしれないけど。  


## `CSV.generate` とは

以下のような感じで CSV 形式で文字列を構築する事が出来ます。  

```ruby
# Ruby 2.4 で実行
require "csv"
require "pp"

result = CSV.generate do |csv|
	csv << [1, 2, 3]
	csv << ["homu", "mami", "mado"]
end
pp result
# => "1,2,3\n" + "homu,mami,mado\n"
```

https://wandbox.org/permlink/jL6prEzNrYZ0g9m0


また `CSV.generate` の第一引数で『その CSV の先頭文字列』を指定する事が出来ます。  

```ruby
require "csv"
require "pp"

csv = CSV.generate("prefix") do |csv|
	csv << [1, 2, 3]
end
pp csv
# => "prefix1,2,3\n"

# 既存の csv に対して追記したり
csv = CSV.generate(csv) do |csv|
	csv << ["homu", "mami", "mado"]
end
pp csv
# => "1,2,3\n" + "homu,mami,mado\n"
```

https://wandbox.org/permlink/afzhyZti9dAAyukB

## `CSV.generate` のバグ

で、件のバグなんですが、先ほど説明した『`CSV.generate` の第一引数で『その CSV の先頭文字列』を指定する』が Ruby 2.5 では動作しません。  

```ruby
# Ruby 2.5 で実行した場合
require "csv"

csv = CSV.generate("prefix") do |csv|
	csv << ["homu", "mami", "mado"]
end
pp csv
# => "homu,mami,mado\n"
```

https://wandbox.org/permlink/jWYqvmnnWIRdH2X7

上記のようなコードではすぐに『何かおかしい』とわかるんですが、例えば次のように『CSV データに BOM を追加する』みたいな事をしたい場合はほぼ気づきません。  

```ruby
require "csv"

# BOM 付き CSV データを生成したいが追加されない…
bom = "\uFEFF"
csv = CSV.generate(bom) do |csv|
	csv << ["homu", "mami", "mado"]
end

# 出力先によっては BOM がついているかどうかが視覚的にわからないのでバグを見つけるのがむずかしい…
pp csv
# => "homu,mami,mado\n"
```

わたしも上記のような事をやりたかったんですが、うまく動作しなくて調べてみたら既知のバグでした。  
『Ruby BOM CSV』でググると `CSV.generate` を使ったやり方を書いているブログとかが結構ヒットするんですが、このバグに気づいてない人もいるんじゃないかなあ…。  


## Ruby 2.6 では修正済み

このバグは Ruby 2.6 では修正済みとなっています。  

* [Bug #14253: CSV.generate doesn't wrap a string anymore - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/14253)


## Ruby 2.5 系での対処方法

幸いにも `CSV.generate` は Ruby で実装されているので次のようなモンキーパッチで対処する事が出来ます。  

```ruby
require "csv"

# CSV.generate の実装を上書き
class CSV
	def self.generate(str=nil, **options)
		# add a default empty String, if none was given
		if str
			str = StringIO.new(str)
			str.seek(0, IO::SEEK_END)
		else
			encoding = options[:encoding]
			str      = String.new
			str.force_encoding(encoding) if encoding
		end
		csv = new(str, options) # wrap
		yield csv               # yield for appending
		csv.string              # return final String
	end
end

# これで BOM が追加される
bom = "\uFEFF"
csv = CSV.generate(bom) do |csv|
	csv << ["homu", "mami", "mado"]
end
pp csv
# => "﻿homu,mami,mado\n"
```


## まとめ

Ruby 2.6 はよ〜
単純なjavascriptでページ毎に指定先へリダイレクトする

# 背景
知人から、サイトURLの移転に伴いとあるサイトで全ページに共通なタグを埋め込んで指定された別のサイトへ個別にリダイレクトするようなものがほしいと言われて作りました。
JQueryとかも使えないようなサイトだったので、JQueryが無くてもそれなりに動くようにしました。

# こだわったポイント

1. リダイレクト中に移転前のページが見えないようにした
2. 流入経路がリダイレクト先でも解るように、リクエストパラメータとリファラを引き継ぐ


# 実装

## 以下実施（jsを個別にRailsで読み込むため。Railsでなければ不要）

以下追記
```ruby:config/environments/production.rb
  config.assets.precompile += ['*.js']
```

以下削除
```ruby:app/assets/javascripts/application.js
//= require_tree .
```


## redirectするjs

**この例ではRailsにjsを入れたのでディレクトリ構造がこのようになってます**

```javascript:app/assets/javascripts/redirect.js
// bodyが読み込まれる前にタグを埋め込まれた場合、こだわったポイント1は実現できません
if ( document.body === void 0 || document.body === null ){
}
// こだわったポイント１
else if ( document.body != null ){
  document.body.style = 'visibility:hidden'
}

window.onload = function() {
  try {
    // この例は https://~~~.com/1.html とかを 指定した遷移先1のURL へリダイレクトします
    var url_map = { 1:'遷移先1のURL', 2:'遷移先2のURL'}
    // 1.html だったら 1 にします。拡張子を消す処理
    var keys = location.pathname.match(/.*[/](.*?)$/);
    var key = keys[keys.length-1].replace(/\.[^/.]+$/, "");
    if( url_map[key] === void 0){
      document.body.style = 'visible'
      throw new Error('end');
    }
    // クエリパラメータとreferrerを引き継ぐ（こだわったポイント２）
    var redirect_url = url_map[key] + location.search;
    if (document.referrer) {
      var referrer = "referrer=" + encodeURIComponent(document.referrer);
      redirect_url = redirect_url + (location.search ? '&' : '?') + referrer;
    }
    location.href = redirect_url;
  }catch (e) {

  }
}
```

## 埋め込むタグ(Railsでerbの場合)
```
<%= javascript_include_tag 'redirect.js' %>
```

## 埋め込むタグ(普通のHTMLの場合)

**指定ディレクトリはjs格納先に依存します**

```
<script src="/assets/redirect.js"></script>
```

## 注意

こだわったポイント１の実現の為にも `<script>~</script>` は `<body>`の直後に記載するとよい。



# 参考にさせて頂いたページ
https://qiita.com/aqril_1132/items/9b5e5787e46d8ba13b03
https://qiita.com/Oakbow/items/2e712e05bb4bbf68faf5
LINX LON2 networkのホワイトボックス実装メモ

LINX(https://www.linx.net/) が今年ホワイトボックススイッチによるIXサービスを開始しました。
おもしろいなーといろいろ調べてましたが手元においておくだけじゃもったいないのでメモを晒します。
すべて公開資料からの参照です。詳細は参照元リンクを掘ってみてください。


------
#NANOG74発表
- 知る限りでこれが一番くわしい

https://pc.nanog.org/static/published/meetings/NANOG74/1782/20181002_Heino_Deploying_A_Disaggregated_v1.pdf

https://www.youtube.com/watch?v=zjnWNMmTmCE

* Features
	* MAC ACL
	* 多対1のVLANマッピング
	* VLAN毎のトラヒックポリシー制御on単一ポート
	* VLAN毎のARP・IPv6 ND
	* MAC学習の無効化とMACの静的設定
	* バッググランドトラヒック削減のためのProxyARP・ProxyND
	* トラヒックタイプ毎のトラヒック制限
* 中央のコントローラーを置かない

	* 自動化はすげえほしいのだけど、過剰なのはいらないんだよ
	* コントロールプレーンベースの再収束はコントローラベースのより早いだろ
	* うちのソフトウェアチームがフォーカスしているのは非ミッションクリティカルなインフラだからな!
* EVPN-MPLS vs EVPN-VXLAN

	* 多数のLSPエントリがインターフェーステーブルを消費するのは避けたい
	* VXLANの収束はMPLSより遅いけど許容範囲
	* MPLSのFast Rerouteが<50ｍs以下なのは魅力的
	* VXLANなら再計算とASICの再プログラムが必要
* Leafのみ構成 vs Leaf-Spine構成

	* 前者はメトロ側スイッチ(拠点間Dark Fiber接続)と顧客収容SWを両方Leafとする構成
	* 後者はLeafの間にSpine SWを入れる構成
		* これを採用。収束がシンプルかつ早い


(図は https://pc.nanog.org/static/published/meetings/NANOG74/1782/20181002_Heino_Deploying_A_Disaggregated_v1.pdf より引用)

- Leaf only構成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309536/048f9f4c-2f9e-bd9d-8418-bd1c22c0de63.png)

- Leaf-Spine構成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309536/084c91d3-d3f9-1f52-c29f-a491c75bbbaa.png)



* EVPN+Proxy-ARP
	* MACテーブルをBGPで全エッジSWに広告する
	* ARPリクエストのフラッドを削減→バックグラウンドトラヒックをへらせてgood


* MAC hold-down
	* ポートが落ちたらローカルMAC転送エントリを削除してBGPで広告する
	* BGP収束前のトラヒックは/dev/null行き
	* Unknownトラヒックのレートリミットを実装した

* 再収束の高速化
	* BFDをASICで実行、最大でも4msで検出


-----
#LINX のインタビュー

https://www.youtube.com/watch?v=QDtEK_PPcSM&feature=youtu.be
Richard Petrie

1．マーケット戦略、価格競争力
2．スケーリングのための新しいインフラが必要

* EVPN採用の理由
	* 旧来の技術では2つのSWがトラヒックをスヌーピングしていた
	* EVPNはプログラマブル、SW同士が同期できるので予測可能である。

* EdgecoreとIPIをパートナーに選んだ理由
	* Edgecore、IPIの実績
	* ビジョンの共有:disaggregation のマーケットポテンシャル

* チャレンジ
	* 設定の自動化プラットフォーム


-----
#UKNOF41 プレゼン

https://www.youtube.com/watch?v=6WvETss3Sko

* 3ms failuer detection
* リンクダウンをBFDで検知、迅速な再収束を行う。
* 導入までのフェーズ
	* Demonstrator Phase(2016)
	* Prototyping Phase(late2016-2017)
		* 共同で仕様策定、繰り返し
	* Hardening Phase(late2017-early2018)
		*  bug探し&修正
	*  Deployment Phase(early2018)
		*  hardning と平行して実施
		*  シミュレーションを実環境で実施して最終のバグ修正
		* 4-5月に移行作業を実施
		* 6月にフルオペレーション開始
	* Enhancement Phase(late2018~)
* 自動化をいまも進めている

-----
# LINX公式情報

https://www.linx.net/world-first-as-linx-completes-migration-to-new-disaggregated-lon2-network-model-using-evpn-routing-technology-on-open-network-hardware/

- EVPN over VXLAN, leaf-spine topology
- IP Infusion OcNOS
- Edgecore  Networks hardware


-----
#Wavesplitterさんの記事

https://www.wavesplitter.jp/index.php/portfolio/project-title-2

* 使用SW
   * Edgecore AS7712-32X:100GE x32
   * Edgecore AS5812-54X: 10GE ｘ48

-----
#Access(IP Infusion)のプレスリリース

https://www.access-company.com/news_event/archives/2018/0508/

- Edgecore SWはBroadcom Tomahawk およびTrident II+
emacs26.1にしてorg-to-htmlしたらemacs-htmlizeを入れなさいって

emacs26.1にしてorg-to-htmlしたら

    Please install htmlize from https://github.com/hniksic/emacs-htmlize

とのお達し．

前からcode highlightingが効かんなって思ってたが．．

<https://github.com/hniksic/emacs-htmlize> からhtmlize.elをDL（うまくいかんときはclone）して，~/.emacs.d/site\_lispに入れて，

```el
;; where I have htmlize.el                                                                                              
(add-to-list 'load-path "~/.emacs.d/site_lisp")
(require 'htmlize)
```

を(~/.emacs.d/init.elに)付け足したらできた．pathで悩むんや．emacs-lispはいつも．．．elpa行ったらないって怒られるし．．．


# 追記：batch <span class="timestamp-wrapper"><span class="timestamp">&lt;2019-10-07 月&gt;</span></span>

batchで書くとこのエラーが出たり，出んかったりする．

    > "emacs #{org} --batch -f org-html-export-to-html --kill

&#x2013;batchで呼ばれた時には，personal initialization filesをskipするらしい．pacakge-initializeをしなさいとのお達し．

-   [<https://emacs.stackexchange.com/questions/38437/org-mode-batch-export-missing-syntax-highlighting>]

    > --load ~/.emacs.d/init.el 

を入れたら動いたけど，なんか他のエラーが出てる．

```el
(require 'package)
(setq package-load-list '((htmlize t)))
(package-initialize)
```

なんかもいるかも．init.elは勉強せな．


# つい追記：wsl対応<span class="timestamp-wrapper"><span class="timestamp">&lt;2024-09-30 月&gt;</span></span>

wslでexportするときに失敗．

html化が成功しているので，htmlize.elは入っていると思っていたが，M-x list-packagesで探しても見当たらず．本文の手法で入れるとsyntax-highlightして表示．

ただし，gitからのDLで今は，sshが使えなくて，Web-browserからDLするときは， htmlize.elに入ってcodeの右にあるDownload raw fileを選択．Folderを開いて，explorer間でcopy.



------
 - **source** ~/.emacs.d/htmlize.org
Nextcloud のファイル共有（ユーザ・グループ間の共有）

#はじめに
Nextcloudは、ownCloudから派生したオンラインストレージパッケージです。今回は、基本機能であるファイル共有機能の中でも、ユーザ・グループ間のファイル共有について紹介したいと思います。

#プラグイン
こちらですね。デフォルトでは有効になっているプラグインですが、これを無効にしてしまうと、単純に個人のファイル置き場になってしまいます。
![画像43.png](https://qiita-image-store.s3.amazonaws.com/0/308127/364e1900-c166-88b7-ca74-5296658a7047.png)

#管理者設定画面
プラグインが有効になっていると、管理者画面に全体の共有設定が表示されます。ここで、ユーザが共有設定できる範囲などを決めます。赤枠で囲っているのが、ユーザ・グループ間の共有設定に関係する箇所です。ちなみに、一番上にある「アプリからの共有APIの利用を許可する」のチェックを外してしまうと、共有自体ができなくなります。
![画像44.png](https://qiita-image-store.s3.amazonaws.com/0/308127/fabf6fef-a208-b420-5928-8242b758156d.png)

#ユーザによる共有設定
フォルダやファイルに表示されている共有アイコンをクリックすると、画面右側に共有設定画面が表示されます。ユーザやグループを入力すると、リストが表示され、選択できます。この時点で共有が設定されたことになります。
![画像31.png](https://qiita-image-store.s3.amazonaws.com/0/308127/aace43f2-8023-7e41-8854-21764272e8e5.png)
次に、権限などを設定します。編集可能のチェックを外すと、読み取り（ダウンロード）専用となります。チェックが入った状態で、「・・・」をクリックすると、以下の権限が設定できます。

・再共有可能　共有されたユーザが、更に違うユーザに共有設定できます。
・作成可能　アップロード権限
・変更可能　上書き権限
・削除可能　削除権限
・有効期限を設定　いつまで共有するかを設定
・共有解除　共有を解除
![画像32.png](https://qiita-image-store.s3.amazonaws.com/0/308127/600d07dd-aa3c-630a-f3cc-9e66ce7df4ee.png)


共有されたユーザは、ホームに共有されたフォルダやファイルが表示されます。
![画像33.png](https://qiita-image-store.s3.amazonaws.com/0/308127/8de9ffd7-8afd-d76b-dca8-a67dac667625.png)

#まとめ
ファイル共有は、NextcloudやownCloudの基本機能ですが、ユーザ・グループ間の共有の場合は、長期的な共有で利用されるケースが多いです。社内やプロジェクト等でアカウントを発行するのが多いので、必然的にそうなりますよね。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
Laravelのバリデーションで自分自身の重複は無視したいとき

Laravelのバリデーターで重複を許さないよう定義している状態で、自分自身のデータを書き換えようとしたらバリデーションに引っかかって「ひえ〜」ってなった事はありませんか？

```php
$validatedData = $request->validate([
    'name' => 'required|string|max:255',
    'email' => ['required','string','email','max:255','unique:users'],
    'password' => 'required|string|min:8',
]);
```

無視したい項目をignoreで指定することで解決できます。

```php
$validatedData = $request->validate([
    'name' => 'required|string|max:255',
    'email' => ['required','string','email','max:255', Rule::unique('users')->ignore(Auth::id())],
    'password' => 'required|string|min:8',
]);
```

よくある「マイページで自分のプロフィール情報を変えたい」という時には`Auth::id()`でログイン中のユーザーIDを取り出したら簡単ですね。
Punditでコントローラーごとに権限処理を分ける

こちらのREADMEの通りなのですが
https://github.com/varvet/pundit#policy-namespacing

通常は
`authorize(post)`
って感じで書いて、
`app\policies\post_policy.rb`を作ると思いますが、

コントローラーで
`authorize([:admin, post])`
ってやれば、ネームスペースを分けられるので、
`app\policies\admin\post_policy.rb`を別に作ることができます。
Mac OS mojaveに更新したら、xcode-selectが動かなくなったので解決した。

# Xcode-select installをしても動かなかった。
``Xcode-select --install``と打っても、以下のエラーが起きた
`Can't install the software because it is not currently available from the Software Update server`
<img width="519" alt="Screen Shot 2018-11-01 at 11.42.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/195504/6a1238f3-f0b1-f230-95d1-cdfb944beb41.png">

[ここ https://developer.apple.com/download/more/](https://developer.apple.com/download/more/)
を開いて`command line tools`と検索すると、`dmg`ファイル一覧が表示されるのでDL&インストール。

# 参考文献
[参考](https://qiita.com/akidroid/items/12754cb9efa58977c8a8)
Rubyで作ったプログラムをタスクスケジューラで定期的に実行させる

# はじめに
WindowsのRubyで作ったプログラムを、タスクスケジューラで定期的に実行させる方法です。実行間隔を５秒位に指定すると、実行コマンドを打たなくても、自動的にデバックができるので、コーディングが楽になります。

# バッチファイルの解説

```test.bat
@echo off
rem タスクスケジューラに登録して、５秒毎に「test.rb」を実行する
cd C:\Ruby24-x64\bin
set /a COUNT=0

:loop
powershell sleep 5
set /a COUNT=COUNT+1
echo (%COUNT%)
ruby D:\C\test.rb
goto :loop
```
@echo off
コマンドが表示されると見難いため、非表示にします
cd C:\Ruby24-x64\bin
Rubyが入っているパスに移動します
set /a COUNT=0
カウンターを初期化します
powershell sleep 5
５秒単位でループさせます
set /a COUNT=COUNT+1
ループごとにカウントアップさせます
echo (%COUNT%)
ループ件数を画面表示します
ruby D:\C\test.rb
実行したいRubyのプログラムを指定します
goto :loop
:loopまで飛ばします（処理をループさせます）

# 実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/4470fbbd-6efd-291c-84da-62875cef83be.png)

test.rbで、puts "テスト" しているので、繰り返し表示してくれます。
一時停止する時は、Ctrl+C
再開する時は、N

# タスクスケジューラの登録

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/fd6147b8-4196-ffb1-9ea0-d93480aa3375.png)

タスクスケジューラで、バッチのパスを指定します。実行する時は、登録したタスクを選択して、右クリックで実行するだけ。因みに、タスクスケジューラはコントロールパネルの中にあります。
【自分用メモ】sqliteクエリにおいてテーブル名などを確認する方法


タイトルなど用語の使い方がおかしい場合は指摘してください！

使用できるコマンドの一覧を表示

```
sqlite>.help
```

コンソール上でsqliteクエリを開く

```
$ rails db
```

テーブル名の確認

```
sqlite>.tables
```

カラム名の確認（テーブルの定義の確認）

```
sqlite>.schema テーブル名
```

終了する

```
sqlite>.exit
```
遠足駆動読書会（チームで本屋に遠足に行こう）

最近会社で Qiita の Organization を作ることになった @tetsunosukeito です。

10/31 に開催された [DevLOVE のイベント「組織での読書会の開き方」](https://devlove.doorkeeper.jp/events/81598) にて、当社で開催したことのある「本屋への遠足」がちょっとウケたのでその件についてご紹介します。

ちなみに「遠足駆動読書会」というネーミングは @ex_SOUL さんの当日のコメントから命名され、爆誕しました。

# 本屋に遠足 とは

「欲しい本を買いにチームで本屋に行こう」という内容です。

- 予算は一人15,000円まで（おやつは一人300円まで のノリ）
- ワクワクしそうな感じ
- お昼ご飯はみんなで食べよう

というところから「遠足」とネーミングしました。
遠足の実施は期初の春。チームメンバーの入れ替えなどがあり、それこそクラス替えがあったあとの学校のようにチームの形成期にあたると言っても良い時期に実施しました。

ちなみに、本屋に着いたら自由行動。2人出回ったりしても良し、まあ、修学旅行のお土産を買う、という方がイメージは近いでしょうか。

# やったこと（遠足の内容）

遠足と言っても、当社からは徒歩で10分程度の [ブックファースト 新宿店](http://www.book1st.net/shinjuku/) です。

- 会社から書籍等の自己研鑽費用として与えられた予算から15,000円を各自の裁量で**チームのために**購入すること
    - あとで会社に申請するので、一応理由は説明できるようにしておくように
    - 買った本は会社として所有し、本棚で管理
- 必ずしも**技術書のコーナーから買わなくても良い**
- 朝から出かけてみんなでランチ

## 購入された本の例

- [xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))]( 
http://amzn.to/MaBnwa)
- [達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ [単行本（ソフトカバー）] ]
(http://amzn.to/LEDpmx)
- [顧客が熱狂するネット靴店　ザッポス伝説―アマゾンを震撼させたサービスはいかに生まれたか [ペーパーバック]](http://amzn.to/MaDEHw)
- [プログラマが知るべき97のこと](http://amzn.to/LEDAhJ)
- [詳説 正規表現 第3版 [大型本]](http://amzn.to/Ly7Pmj)
- [詳解UNIXプログラミング [単行本]](http://amzn.to/KGN6wN)
- [パタン・ランゲージ―環境設計の手引 [単行本]](http://amzn.to/Lyxf30)
- [リーン・スタートアップ ―ムダのない起業プロセスでイノベーションを生みだす [単行本] 
](http://amzn.to/NTIKaf)

などです。

# わかったこと

- 5,000 円以上する本、大きい（分厚い）本は会社として買って所有しておくのが良い
    - こういうの種類の本は電子書籍だとどうしても扱いにくい
        - **紙ならではのメリット**を感じられる本を会社では買うのが良さそう
    - そもそも自分で学ぶ人は自分で本を買っているので、大きさ含め手が出しにくい本を選定できるという意味では価値がある
- どういう本を、**いつ、なぜ買ったのか**を記録に残しておくと、チームがどう移り変わってきたか（人も含めて入れ替わりがあったのか）ということや、その時何が流行っていたのか、ということが残る（ちなみに上記のリストは2012年購入）
    - ユニットテストに対しての課題とか、サービスに対しての志向性とか、若手に教えるためにとか、いろいろな目的が感じられる
    - この人はチームに対してこうなってほしいんだなあ、という理想論みたいなことが垣間見える
- 時間がなかなかうまく合わなかったので実はチーム全員でランチに行ったことがなかった
    - メンバーの一人が実はほぼ昼食はあえて食べていなかったことを初めて知るなど
    - どんな本を買うのか、ということを含めて**対話のきっかけ**として有効と言えそう
- こうすべき、というような理想論を口頭やレビューとかで伝えるよりも、本を読んでもらうことで、**なぜそうするのかという背景が省略されずに伝達できる**
- 本屋に行くという行為はやはり偶然の出会いがある
    - 欲しい本だけを求めてしまうとどうしても自分の考えが固まってしまう
    - 技術書以外のコーナーにも触れること、また、**自分のものを自分で買うわけではない良い意味での無責任感**が自分が思っても見なかった本との出会いにつながる

実際にここまでのメリットが完全に享受できたわけではありませんが、チームでのこれからの学び、チームの相互理解につながるような工夫はもっとできるかなと思います。

# これから（駆動読書会に向けて）

「駆動読書会」とあったように、チームが必要としている本、読書会してみたいなと思う本、ということをテーマに遠足してみると面白いかもと思いました。本を選択する時点で目的をちゃんと設定しておけば、読書会を行う動機としては継続していくと思います。

また、この読書会を習慣化することで、チームとして今までこれだけのことを学んできたのか、ということが目に見えて積み上がってくるので、続けていくとそういう面でも良い効果が期待できるのではないかと思っています。

## どんな読書会が良いだろうか？

比較的ボリュームの小さい本は事前に読んできて感想を共有するタイプの読書会、ごっつい本に関しては章ごとに担当していくなどの輪講スタイルなどが向いているのではないかと思います。

自己啓発・思想系のものであれば、こう書いてあったけど自分はこう思う、というようなディスカッションを中心にしても良いかもしれませんね。
Go言語のnewという組み込み関数

## まえがき
[Go言語によるWebアプリケーション開発](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Mat-Ryer/dp/4873117526/ref=sr_1_11?ie=UTF8&qid=1541062253&sr=8-11&keywords=go)を読んでいると、以下のコードがでてきた。

```go
new(client)
```
前提としてclientは自分で定義した構造体型。

自分では実装していない関数だ。
本の中で説明されていたのだろうか。
覚えていない。

出てきたのかもしれないし、自明だということで説明が省かれているのかもしれない。

ということで調べた。

## func new とは
```go
func new(Type) *Type
```
シグネチャを見ると、引数に型を取り、型のポインタを返す関数のようだ。
説明を読むと、受け取った型をゼロ値で初期化したときのポインタを返す組み込み関数のようだった。

## コードの意味
つまり、以下のコードはclient型をゼロ値で初期化して、そのポインタを返すという意味だった。

```go
new(client)
```

おわり

ps
シグネチャの使い方あってますか？？
スタッシュを同じ上流の別のリポジトリに移したい

パッチを作成してあてればよい。
概ね [参考記事: git stashで待避した内容のパッチを作成・反映する](https://qiita.com/gishi_yama/items/0ddb55b8f2fd0d027ae3) の通りでよいが、いちいち適用先を聞かれないように -d オプションでパスを指定するともっと楽だと思われる。
詳細は参考記事を参照してください。

## 操作手順
```sh:operation-flow.sh
# 以前のリポジトリで最新のスタッシュをパッチにする
cd /path/to/old-working-copy
git stash show stash@{0} -p > /path/to/stashed.patch

# 新しいリポジトリでパッチを適用する
cd /path/to/new-working-copy
# -d . で現在のディレクトリを指定して、対象の確認を出さないようにする
patch --dry-run -p1 -d . < /path/to/stashed.patch
```