OmniAICreator/Qiita-1.07M huggingface dataset:
CUIベースの翻訳スクリプト作ってみた（２）

#はじめに
これは[CUIベースの翻訳スクリプトを作ってみた](https://qiita.com/kaeru_kerokero/items/743f17b306a03de28464)の続編です。
読んでいない方ぜひ読んでください！

---
#今回実装するもの
コマンドラインからオプションで翻訳する言語を指定できるようにします。
ポータビリティを確保するため、googletrans以外は
外部モジュールを使わないで実装します。

#実装内容
前回の実装内容は省略します。

```py

opt = None
text = None

try:
    opt = sys.argv[1]
    text = " ".join(sys.argv[2:]) #複数単語の英文をひとつの文にする（分かち書き)
except:
    logger.critical('書式が正しくありません。')
    exit()
opt = opt.strip("-")　#オプションにつける'-'(ハイフン）を消す
print(convert(text=text, lang=opt))　#conver関数のlangにoptにわたす。
```
#説明
```py
try:
    opt = sys.argv[1]
    text = " ".join(sys.argv[2:])
except:
    logger.critical('書式が正しくありません。')
    exit()
```
`try~except`を使ってもしエラーがあっても正常に終了できるようにします。
また、分かち書きした英文は別々のリストの要素になるので、`str.join()`で１つの文にして`convert()`にわたします。

#まとめ
この記事では、外部のモジュールを使いませんでしたが、clickなどを使って実装しても良いかもしれません。
Vueオブジェクトの値渡し

#今回の問題

vueオブジェクトの代入が参照渡しになっていることによる、影響の問題

```javascript:vue
<div v-for="item in items">
  <button @click="copy(item)">{{ item.title }}</button>
</div>

data(() => {
  items: [],
  copyItem: {} // dataに定義しているのは子コンポーネントで編集した値が欲しいから
}),

methods: {
  copy(item) {
    // 参照渡しになっているので、参照元のデータも変更される
    this.copyItem = item
    /** 以降、this.copyItemをいじる */
  }
}
```


#解決
[公式ドキュメントに書いてた](https://jp.vuejs.org/v2/guide/components-props.html)

>JavaScript のオブジェクトと配列は、参照渡しされることに注意してください。参照として渡されるため、子コンポーネント内で配列やオブジェクトを変更すると、 親の状態へと影響します。


```javascript:js
data(() => {
  items: [],
  copyItem: {} // dataに定義しているのは子コンポーネントで編集した値が欲しいから
}),

methods: {
  copy(item) {
    // 値渡しがされるので、元データに影響は出ない
    this.copyItem = Vue.util.extend({}, item);
  }
}
```
【Unity,Visual Studio Code】VSC拡張機能C#のv1.21.13のエラーについて（2020/03/06）

#結論と解決方法
　現状C#のv1.21.13の状態でUnityからC#スクリプトを開くと、拡張機能の読み込みがかなり遅い。
（読み込まれないわけではないが、普段なら数秒で終わるものが数分待つことになりかなりストレスを感じた）

　結果的に問題はVSCの拡張機能のC#にあった。これのバージョンアップが自動更新でされており、最新版（2020/03/06付け）のv1.21.13を使用すると発生するようだ。
　そのため、バージョンをロールバックする必要があるので、以下に手順を示す。

####1,現在インストールしている拡張機能「C#]をアンインストールする

####2,自動更新を無効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/c74b3e16-bb6f-6170-5b2f-baf2ba635f5a.png)


####3,以下のURLから「csharp-1.21.12.vsix」をDLする
https://github.com/OmniSharp/omnisharp-vscode/releases/tag/v1.21.12
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/d829b25a-839e-5393-81e8-33b075461c3a.png)

####4,「VISXからのインストール」を選択し、先ほどDLしたファイルを選択する
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421073/86ff19c2-7d03-efa5-24d5-5aa87fb4dca8.png)

これでv1.21.12となり、読み込みの遅さが解決される。
GitHubで教えてくれた海外の方に感謝です。
一応[解決の糸口となった元URL](https://github.com/OmniSharp/omnisharp-vscode/issues/3623)も貼っておきます。

#以下余談
　今日急に過去に作成したプロジェクトのスクリプトを弄ろうといつも通りVSCで開くと、
何故か一向に拡張機能の読み込みが終わらない（左下にxxxx.slnがすぐに出ない）。

　おや？と思い、原因を調べてみるが分からず、VSCの再インストール、拡張機能の再インストール、.slnファイルの再生成、その他いろいろ...試してみたが、解消できず。

　新しいプロジェクトでなら何故か遅延が無かったため、もうこれはプロジェクトを移すしかないか...
とあきらめかけていたが、VSCで発生していたエラーをGitHubで報告してみたところ、なんとたったの1時間でコメントが付き、確認したところ問題解決に至ったというのが事の顛末である。

何でも試してみるものだなぁと思いました、さすが海外は情報伝達が速い。
BitriseでMintのキャッシュを使ってビルドを高速化

### Mintのディレクトリを変数に定義
Workflow Editor -> Env Vars
`$MINT_PATH` = `/usr/local/lib/mint`
<img width="602" alt="スクリーンショット 2020-03-06 14.52.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234348/c8f1f0b3-60fc-34ab-28a7-988ab79f998e.png">

参考: https://github.com/yonaskolb/Mint#advanced

### Bitrise.io Cache:Push の Cache paths に Path を追加
Workflow Editor -> Workflows
`Cache_paths` = `$MINT_PATH`
<img width="602" alt="スクリーンショット 2020-03-06 14.52.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234348/3cdefc63-c60f-b68e-1bf8-1c8c6498191d.png">

### ビルド結果
Before
![スクリーンショット 2020-03-05 17.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234348/7afe8ad2-be30-176c-c80f-9c566c17c683.png)

After
![スクリーンショット 2020-03-05 17.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234348/b6319b5a-f323-52de-cc02-1e028d0fc8b1.png)

高速化されました。
pythonで制限付きの多項式フィットを簡単にする方法

# 簡単な多項式フィット

多項式でデータをフィットしたいが、あるデータ点は必ず通過して欲しい場合に、簡単にやれる方法を紹介する。

## コードの概要

`numpy`の`polyfit`を使うときに、`w` というオプションで重みを指定できるので、固定したい点の重みを大きくする。ここでは、データは原点を通ってないが、フィットするときは原点を無理やり通したい場合の例を示します。元データ `x`, `y` に対して、`numpy.append`でデータを追加して、その点の重みを1e3にして、他は1にしてあります。


## サンプルコード

``` python:qiita_polyfit_limited.py

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

x = np.array([-10, -8,-6,-4,-2,0,2,4,6,8,10])
y = np.array([-15,-10,-3,-2,-1,3,1,3,4,8,12])
weight = np.ones(len(x))
npoly=4

x_add = np.append(x,0)
y_add = np.append(y,0)
weight_add = np.append(weight,1e3)

coef=np.polyfit(x, y, npoly, w=weight)
yfit = np.poly1d(coef)(x)         

coef_add=np.polyfit(x_add, y_add, npoly, w=weight_add)
yfit_add = np.poly1d(coef_add)(x)         

F = plt.figure(figsize=(7,7))
ax = plt.subplot(1,1,1)

plt.errorbar(x,y,fmt="o",label="data",alpha=0.8,ms=3)
plt.errorbar(x,yfit,fmt="--",label="fit (no limit), order = "  +str(npoly),alpha=0.8,ms=3)
plt.errorbar(x,yfit_add,fmt="--",label="fit (fixed at 0,0), order = "  +str(npoly),alpha=0.8,ms=3)

plt.grid(linestyle='dotted',alpha=0.5)
plt.legend(numpoints=1, frameon=False, loc="best") 

outfile = "qiita_polyfitlimited.png"
plt.savefig(outfile)
``` 

## フィット結果

何も制限をしないと原点を通過しないが、制限付きだと原点を通過しているのがわかる。

![qiita_polyfitlimited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/b84a527a-a8b6-6395-d14d-db9f33601209.png)

厳密な条件付きのフィットではないので、原点でゼロではなくて、小さい値が残る。もし、厳密に原点で0にしたい場合は、制限付きのフィットの関数を自分で書いて行う必要がある。その場合は、[pythonでパラメータの制限付きでfittingを行う方法](
https://qiita.com/yamadasuzaku/items/c8fb95631956bf36f2a8)
を参照ください。
【MC】KCU待ちがどこではっせいしているかのログを出力する

https://knowledge.bizrobo.com/hc/ja/articles/360028154971-MC%E4%B8%8A%E3%81%A7KCU%E3%81%AE%E5%88%A9%E7%94%A8-%E6%B6%88%E8%B2%BB-%E7%8A%B6%E6%B3%81%E3%82%92%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

上記の内容を設定する

roboserverに登録されているサーバであれば、出力可能。

設定した直後にファイルができる。

<img width="960" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/940c24ee-441a-9126-a34c-1563ee8b1821.png">


<img width="577" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a497cfc0-cdd6-e412-676b-2f626e120f80.png">

<img width="512" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a74dc7fc-8fe4-be80-9f0d-1108701a3b98.png">
セッションを持ち続けるので、チェックを外さないとファイルは削除や上書きできない。
コピーは可能。
もし、ずっとこの情報を取り続けるのはデータがひっ迫する。
【Rails】form_for

#form_for
Railsでフォームタグを作成できるメソッド
似たヘルパーとしてform_tagがあり、こちらはモデルに基づかないformに使用されることが多い。
ユーザの登録や情報の更新機能はform_for、検索機能はform_tag

##form_forの引数
引数にはモデルのインスタンスを指定。
※モデルのインスタンスとは、データベースに保存したいクラスのインスタンス。

```erb

<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>
```
`form_for`では`form_tag`のようにパス先の指定をしない。

```rb

def new
  @user = User.new
end

def edit
  @user = User.find(params[:id])
end
```
コントローラで作成したインスタンスが`newメソッド`で作成され、情報を持っていなければ`createアクション`、すでに情報を持っていれば`updateアクション`等に割り振ってくれる。

##form_forでの投稿フォームの作成の仕方

「f.htmlタグ名：カラム名」という風に記載する。

```erb

<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>
```
上記の例だと`userテーブル`の`nameカラム`に保存される。

##form_forで使用できるhtmlタグ
<img width="742" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/e6291f06-54f0-d185-f8d4-dcbcbe57b507.png">



####・form_tag
検索フォームのようなフォームはデータベースが必要ではないため、form_tagを使用する。

####・urlオプション
<%= form.submit %>を押した時のアクションを指定できる。

```erb

<%= form_for @fruit, url: fruit_bulk_create_path do |form| %>
<%= form.label :name %> <%= form.text_field :name, id: :fruit_name %>
<%= form.label :description %> <%= form.text_area :description, id: :fruit_description %>
<%= form.submit "一括登録" %>
<% end %>
```

上記のコードでは「form.submit」を実行すると、「fruit#fruit_bulk_create」アクションが実行される。
構造化マークアップの覚書

端的に言うと、検索結果で。以下のように目に留まりやすくなる記述の構造化マークアップについて、業務で気になったことや、知っておくと便利な事をメモ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469948/f6b4eb1f-fa09-ab19-8a83-8ccdafa1a164.png)

このように、画像やディスクリプション、コーポレートサイトならパンクズをGoogle検索結果に表示可能。

#Microdataにおける「itemscope」の記述形式について
文法なんかは、公式を参考にするといい。
（参照元）https://schema.org/Product
```
<div itemscope itemtype = "http://schema.org/Product" >
･･･
</div>
```

上記のように、入れ子が無い。
それ自体は問題ないのだけど、業務で使用しているエディタが怒り狂ってしまった。
そんな時は、itemscope="itemscope"でも認識してくれるようであった。

#構造化テスト
構造化が上手く行ったかどうか確認するためのページが用意されている。
https://search.google.com/structured-data/testing-tool
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469948/37176ea7-fc61-6d8d-7334-925f3d4b0cd7.png)

ここで公開前にテストするといい。

#構文解説
以下では日本語での解説を行っている。
https://support.google.com/merchants/answer/6386198?hl=ja
ECサイトで使えそうな、product配下のデータを網羅しているので、該当する方はこちらを参考に構築し、前述のテストページで最終チェックを行うといいだろう。
ミリねじの規格

プログラムとは全く関係ないけど、個人的なメモをQiitaに書いてしまう。
仕事で物作りをしているとねじの規格をよく調べるので、自分が必要な物をまとめておく。

| 規格(M) | [並目ピッチ](https://www.toishi.info/jis_iso/) | [ボルト・ナットレンチ](http://www.ikekin.co.jp/contents/catalog/standard/bolt/index.html) | [キャップボルトレンチ](http://www.ikekin.co.jp/contents/catalog/standard/cap/index.html) | [SUSアルミフレーム](https://fa.sus.co.jp/products/sf/) | [JIS真空フランジ](https://www.technoflex.co.jp/products/Product/cd/detail/vac_vg_vf.html) | [ICF真空フランジ](http://t-support-co.com/uhv2.html)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| M2.5 | 0.45 |     | 2   | | | |
| M3   | 0.5  | 5.5 | 2.5 | | | |
| M4   | 0.7  | 7   | 3   |                        |           | ICF34 |
| M5   | 0.8  | 8   | 4   | SF20シリーズ 溝幅6mm     |           |
| M6   | 1    | 10  | 5   | SF30シリーズ 溝幅8mm     |           | ICF70 |
| M8   | 1.25 | 13  | 6   | SF40,45シリーズ 溝幅10mm | A10-A50   | ICF114, ICF152, ICF203, ICF253 |
| M10  | 1.5  | 17  | 8   |                        | A60-A150  |
| M12  | 1.75 | 19  | 10  |                        | A200-A350 |
| M14  | 2    | 22  | 12  |                        |           |
| M16  | 2    | 24  | 14  |                        | A400-A500 |
| M18  | 2.5  | 27  | 14  | | | |
| M20  | 2.5  | 30  | 17  | | | |

以下各項目の解説。

## 並目ピッチ

ねじピッチには並目のほか細めというのもあるが、基本的私が使うことはないのと、ネジがまざると悲惨なことになるので使わない。
一周回すとどれくらいネジが入るかという情報なので、必要な強度にもよるが最低でも3回くらいは回しておきたいから板の厚さはいくつ、とか、アジャスターで高さ調整する時に一回回すと何mm持ち上げられる、という時に使う情報。

## ボルト・ナットレンチ

普通のボルトやナットと呼ばれるもので、この規格のボルト・ナットを回す時に必要なレンチの規格。モンキースパナがあればそれで良いだろうという人もいるが、やっぱりそれぞれの大きさのレンチを用意しておいた方が作業効率は良い。とはいえ、配管関係はインチサイズを使うことがよくあるので、インチ用としてモンキースパナも必要になることはある。
一般的な9本組のセットと対応するネジの規格は下記のようになる。

| 6 | 8  | 10 | 12 | 13 | 14 | 15 | 17  | 19  |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| - | M5 | M6 | -  | M8 | -  | -  | M10 | M12 |

見てわかるように、少なくともボルトナットの取り付けで使う分ためにセット品を買うのはあまり効率的でないことがわかる。よく実験室などでセットで購入したものを見かけるが、大抵の場合よく使う物だけが誰かが借りたまま返却せずになくなっていて使えないことが多い。
そのため、レンチに関しては単品で購入するのが良い。真空フランジの取り付けに使う場合は、ほとんどの場合13と17があれば足りる。世の中にはコンビネーションレンチ、というのがあるが、13-17の組み合わせはないので、10-13と17-19の組み合わせがあれば、ほとんどのボルト・ナットに対応できることになる。たまにM16を使うことがあるのでそのために24があると良い。M14を使うことはほとんどないので、装置を作る時にもなるべく使わないようにしている。

とはいえ、ナットはともかくボルトはなるべく使わずに、今から製作する装置には可能な限り下記のキャップボルトを使うようにしている。

## キャップボルト

六角穴月ボルト、とも呼ばれるもので、六角レンチで締め付ける。こちらのほうがネジを舐めることが少ないので、今から製作する装置には可能な限りキャップボルトを使うようにしている。
使用するレンチに関しても、こちらは9本のセット品で大抵の場合はうまくいく。

| 1.5      | 2     | 2.5 | 3  | 4  | 5  | 6  | 8   | 10  |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| M1.6 M2  | M2.5  | M3  | M4 | M5 | M6 | M8 | M10 | M12 |

私はM12以上のキャップボルトは使ったことがないので、普段は9本セットを一つ持っていれはねじ回しで困ることはない。これもあってキャップボルトを推奨してる。M1.6やM2はほとんど使うことはないけど、たまに装置を分解する時に使われているのを見かけることがあるので一応あるといざというときに困らなくて済む。先日もっと小さいM1のイモネジを使っているものがあって、その時は流石に六角レンチを探して回る羽目になったが、そんなことは非常に稀。

## SUSアルミフレーム

最近はアルミフレームで架台を作ることが多く、いくつかの会社が出しているが私はSUSのものを使うことにしている。SUSは3種類規格があってそれぞれM5, M6, M8のネジを使うらしい。基本的に全部キャップボルト。

## JIS真空フランジ

真空フランジもいくつか規格があるが、よく使うのはJISのもので呼び径が100前後なので、ほとんどがM10。

## ICF真空フランジ

ICFの規格は少しネジが小さい代わりに数が多い。M6とM8がほとんど。
unsafeなコードや脆弱性の高いソフトウェアが書きずらく拡張性が高くきれいに書けるxlwings

#MS Office(Excel)で危険なコードを書いたことはありませんか?
回答->この様なときは、Pythonを使いましょう
理由は以下のようなコードを書けないからです。

```vb
Dim A As Variant
Dim B As Variant
A = 1
B = '1'
Private Function C As Variant 
    C=A+B
End Function
```
何故か2が出てきますが、このコードはよくバグを作り出します。Pythonならエラーにしてくれます。
もし、Pythonで2または、'11'を出したいときは、

```excels.py
A = 1
B = '1'
def C_Int():#2
    return A+int(B)

def C_Str():#'11'
    return str(A)+B
```

の様に書かないとなりません、明示的に書くことがバグの温床を打ち止めできるので、非常に良いことです。
また、マクロでとてもあるあるの話だと思いますが、外注していたら見ずらくインシデントを下げてなく機能が追加しずらいといったことがあります。

##代入バグもストップ

```vb
Dim A As Variant
Dim B As Variant
B = 2
A = B = 3

```
この時B = 3の計算結果をAに入れてしまうバグが起こりますPythonなら未然に防止できます。

```excels.py
B = 2
A = B = 3
```
もしB = 3の計算結果が欲しい場合`B = 3`の部分を`B == 3`にすればよいだけです。この仕組みは簡単にバグを減らすことができます。

#Pythonなら出来ることが豊富
PythonならVBAと違って自動化以外に、機械学習、GUIデスクトップアプリケーション、Webアプリケーション、CUIアプリケーション、アニメーションPNGの操作、画像処理、3DCG他多様な事ができます。それどころか、PythonはC#以上にできる分野が多いです(C#はLinuxの操作が苦手だったりする)。唯一難しいと言われているのは組み込み分野ですが、その分野はC++くらいしか活躍ができない厳しい分野なので、実質パソコン(Win,Mac,Linux)で出来る事なら何でもできます。それに対し、VBAは自動化以外は何もできないので、複雑な自動化や他分野まで含む自動化をしようとすると忽ち出来なくなります。何千行以上に及ぶ自動化にはPythonの使用をオススメします。

#PythonはOSS
PythonはOSSなので、問題があれば改善されます。それに対し、VBAは30年近く放置されており、従って、マクロウイルス等の脆弱性の原因になることが多いです。セキュリティを気にしている貴方。今すぐPythonに乗り換えることをオススメします。また、人気言語なので、コードエディタも揃っております生産性向上も行えます。なおVBAは糞過ぎるコードエディタしかありません。
インストール方法はこちら→https://qiita.com/yniji/items/b38bc312e860027108ac

#なおソフトをかえることで生産性と安全性の向上ができます。
|名前|markdown文書|Google スプレッドシート等(JSマクロ6分以内)|MSOffice(Excel)+Python|
|---|---|---|---|
|サイズ|ごく小さいとき|デフォルトで使用|6分以上の巨大な自動化が必要なとき|
この様な役割分担を与えておくのもよいだろう。6分以上の自動化には何やら他分野も含んでいる確率が高いので、Pythonを使うこと自体非常に合理的である。
LinuxのOS起動メニューにWindowsを追加する

# LinuxのOS起動メニューにWindowsを追加する

* 40_customファイルを開く

```
vi /ect/grub.d/40_custom
```

* 40_customファイルに下記内容を記述する

```
menuentry "Windows 7" {
    set root='(hd0,1)'
    chainloader +1
}
```
* 40_customファイルの変更を反映する

```
grub2-mkconfig -o /boot/grub2/grub.cfg
```
---
# LinuxのOS起動メニューでWindowsをデフォルトの起動OSに設定する

* grubファイルを開く

```
vi /etc/default/grub
```
* grubファイルのGRUB_DEFAULTの値を変更する
LinuxのOS起動メニューにWindowsが２番目に表示されている場合は、2から1を引いた値の1を記述する

```
GRUB_DEFAULT=1
```

* grubファイルの変更を反映する

```
grub2-mkconfig -o /boot/grub2/grub.cfg
```

* Linuxを再起動する

```
sudo shutdow -r now
```
Webサーバにリアルタイムにアクセスしてる数を調べる

調べてみると、以下でやる

```
watch -n 1 'netstat -an | grep :80 | grep ESTABLISHED | wc -l'
```

というのを多く見かけたけど、Apacheやnginx以外のWebサーバ以外が80ポート使ってる場合、それまでカウントされちゃう。
例えばApacheだけに絞りたい場合は以下でやる。

```
watch -n 1 'netstat -anp | grep :80 | grep ESTABLISHED | grep httpd | wc -l'
```
C言語　条件式に使う比較演算子と論理演算子まとめ

常に規定された通りの動きをするだけなら、プログラムは単純なことしかできない。
その時の状況に合わせて異なる処理をさせることができれば、プログラムは__柔軟__になり、複雑な動きを実行することができる。

## 比較演算子
ifの条件式で変数の値を調べるには、２つの値を比較する__比較演算子__を用います。
比較演算子による演算の結果は、__正しい(真)か、正しくないか(偽)__の２つに分かれます。
真と偽の二種類しかないデータの形式を論理値と呼びます。

|演算子|機能|
|---|---|
|==|左辺と右辺が等しい|
|>|左辺が右辺より大きい|
|<|左辺が右辺よい小さい|
|>=|左辺が右辺より大きいか等しい|
|<=|左辺が右辺より小さいか等しい|
|!=|左辺と右辺が等しくない|

## 論理演算子
2つの条件式を連続して調べるには、条件式を論理演算子で結びます。__論理演算子__は、左辺と右辺に論理値を返す式を置き、それぞれの関係を判定して真または偽を返す演算子。関係演算子とも呼ぶ。

|演算子|機能|
|---|---|
|&&|左辺式と右辺式が共に真のとき、真を返す ~AND(論理積)|
|&#124;&#124;|左辺式と右辺式のどちらか一方（または両方）が真のとき、真を返す ~OR(論理和)|
|!|続く式の反対(式が真なら偽、偽なら真)を返す ~NOT(否定)|

##参考
式 - cppreference.com
https://ja.cppreference.com/w/c/language/expressions#Operators

C の演算子の優先順位 - cppreference.com
https://ja.cppreference.com/w/c/language/operator_precedence

絶対保存版！ 長谷川裕行氏のロードワークコラム - メールマガジン ｜ GrapeCity Developer Tools
https://www.grapecity.com/developer/support/powernews/column/
vue.jsのpropsを理解する

Vue.jsのpropsの概念がどうしても分からなかったので、何回も自分の中で噛み砕いてみました。



```js

let vm = new Vue({
  el: '#app',
  data: {
   parent:"親から子に値が渡りました"
  }

})
```
Vueインスタンスで、dataオプションでparentプロパティを宣言します。この、parentが子コンポーネントに渡したい値です。



```js

Vue.component('child',{
  template:'<h1>{{saucer}}</h1>',
  props:['saucer']//saucerという仮の受け皿を作る
})
```
childという子コンポーネントを定義します。
ここで、propsオプションで、で、saucerという**仮の受け皿**を定義します。
この、saucer(仮の受け皿)を経由して、子コンポーネントに値を渡します。



```html

<div id="app">
   <child saucer="これは子A"></child>
   <child saucer="これは子B"></child>
<!-- saucerという仮の受け皿に対してデータバインディングする。 -->
   <child v-bind:saucer="parent"></child>
</div>
```
この時点で、childコンポーネント１つ１つがデータを持っている状態です。
v-bindディレクティブを使い、saucer と紐づけることによって、parent から child に値を渡すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/1a069a6a-c7ef-a243-841a-fa34e460f037.png)

順序としては、
1. parentを宣言する
2. 子コンポーネントの中で、**parentを受け取るための仮の皿**saucerを定義する。
3. v-bindで、子コンポーネントとsaucerを紐づけ、引数にparent を指定することによって、親コンポーネントから子コンポーネントに値が渡る。

※受け皿と言っていましたが、正確には属性のことです。
API GatewayのCustom AuthorizerのLambda関数が呼ばれない

cdkを使ってREST APIを構築しています。
API Gatewayの認証にLamdba関数をカスタムAuthorizerとして使用していたところ、あるタイミングで突然認証が通らなくなってしまった。

# 現象
- カスタムオーソライザーのテスト機能では正しく動く(Lambda関数も実行される)
- Postmanからのリクエストでは認証のためのLambda関数がそもそも動かない

手動でAPIをマネジメントコンソールからデプロイしたところ動くようになりました。
https://stackoverflow.com/questions/52549538/aws-api-gateway-custom-authorizer-not-invoked

cdkのバグなのかな？
開発初期は上手くデプロイできたと思うんだけど、何かの変更が反映されないのか。。。
謎い。

それにしてもハマった。
初心者から始めるJava、論理演算子・条件演算子

追記　2020/3/6 @shiracamusさんより大幅な編集リクエストをいただきましたので、そちらに差し替えさせていただきます。
（旧記事は本当に自分用の備忘録として、限定投稿の方に残しました）
追記　2020/3/6
条件演算子の末尾にセミコロンが必須と書いた内容について、ご指摘いただいたので訂正。いつもありがとうございます。

#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

#環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#論理演算子
**論理演算子(Logical Operator)**とは、前回挙げた条件や関係演算子を使いつつ、より複雑な条件の記述を行う場合に用いられる演算子。今回は「オペランド(項)をいくつとる演算子なのか」を書く。オペランドを2つとる演算子を**二項演算子**、オペランドを一つしかとらないものを**単項演算子**という。オペランドには式を書く。

* `&&` : `右項 && 左項`  
  論理積。二項演算子。  
  右項と左項の式を評価し、**いずれもtrue**のときtrueを返す。  
  ただし、まず右項を評価してから左項を評価する。右項がfalseのときは左項を評価しない。これを短絡評価という。
* `||` : `右項 || 左項`  
  論理和。二項演算子。  
  右項と左項の式を評価し、**どちらかがtrue**のときtrueを返す。  
  ただし、まず右項を評価してから左項を評価する。右項がtrueのときは左項を評価しない。`&&`同様に短絡評価である。
* `!` : `! 単項`  
  </li>論理否定。単項演算子。  
  **単項の式の評価結果**がfalseのときtrueを返し、trueのときfalseを返す。

数学の「集合」でよく見かけたベン図を用いると、真理値がどうなっているか分かるだろう。下手で申し訳ないが、一応用意した。（最重要課題：作図能力）
![ベン図（仮）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592063/c9c58bf2-f1ee-e988-68fa-4b34d812a536.png)

緑 && 赤 ：trueは青
緑 || 赤:trueは灰を除いてすべて
!（灰）:赤青緑

となる。
（本当は青はゆがんでいるのではないかなどのご指摘は、すみません）

##論理演算子の間違い実践

```Java:digitForture.java
import java.io.*;
class digitForture
{
    public static void main(String[] args) throws IOException
    {
      System.out.println("好きな一桁の数字を入力してください。");

      BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in));

      String str = br.readLine();
      int digit = Integer.parseInt(str);

      if(digit > 10 && digit <= -1){
          System.out.println("一桁までの数字を入力してください。");
          //ん？
        }
      else{
          System.out.println("あなたの数字は" + digit + "ですね？");
          System.out.println("今から調べますので少々お待ちください...。");
    }
}
...//以降省略。占いに用いる、一桁の数字と紐づいた運勢表を用意したとする。

```
このままだと、せっかく用意した論理演算が有効でないので、ちゃんと**`&&`を`||`に**しなければならない。
自分が論理積を扱っているのか、論理和を扱っているのか。思考を整理するためにもベン図を（見やすく）作る練習がとても必要だと感じた。

#条件演算子
**条件演算子**とは、**オペランドを3つ**とり、**条件式の評価結果**に対して **trueのときの式** と **falseのときの式** を書くことができ、どちらかの式の評価結果を返す。もう一方の式は評価しない。
「条件式」のあとに、「`?`」と「trueのときの式」を書き、そのあとに「`:`」と「falseのときの式」を書く。

```text:条件演算子の基本形
条件式 ? trueのときの式 : falseのときの式 
```

注意点が一つ。引用文では末尾の;（セミコロン）がない。
~~**必ず**入れなければならない。~~

2020/3/6追記：文中で条件として使うこともできるため、かならずしも入れる必要はない。
本当にセミコロンが必要なのは文末。これはこの演算子に限らない。
（コンパイルエラーで弾かれるのでさほど恐れる必要もない。最初の頃はよく弾かれることにいら立っていた。今は「弾いてくれて助かる」と感じている）

#おわりに
パンかケーキかを判別する「pancakeSearch.java」を思いついたが、以下の問題を抱えている。
<ul>
<li>パンかケーキかを判別する根拠として、そのためのリストを作る必要がある。</li>
<li>入力を受け付けたあと、リストをサーチして結果をだす機構について調べる必要がある。</li>
<li>そもそもパンケーキは「パン+ケーキ」ではなく、「pan(英語の鍋)+cake」であり、多分ケーキ。</li>
</ul>

#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)
今からエンジニアを目指すにはRubyよりPHPがおすすめ

#はじめに
今からWEBアプリ開発エンジニアを目指すのであれば、PHPの方がおすすめと感じました。今回はなぜRubyよりPHPの方がおすすめなのか理由を書きたいと思います。

#そもそもRuby/PHPとは？
Ruby
Ruby（ルビー）は、まつもとゆきひろ（通称: Matz）により開発されたオブジェクト指向スクリプト言語。開発者のまつもとゆきひろは、「Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)」と述べている。
ただ個人的な話かもしれないがRubyを学ぶ場合、Ruby on Rails（実アプリケーションの開発の雛形を予め備えた仕組み＝フレームワーク）を学ぶ必要があり、そのフレームワークが初心者には流れが理解しづらいと思う。あくまで楽しめるのは「プログラミング経験のある開発者/エンジニア」であり、初学者は楽しめる領域まで勉強する必要がある。

PHP
名称の PHP は再帰的頭字語として、 "PHP: Hypertext Preprocessor" を意味するとされており、「PHPはHTMLのプリプロセッサである」とPHP自身を再帰的に説明している。一般的にPHPは学習コストの低く、記述の容易とされている。
私自身、本格的にPHPを勉強したことはないものの、RubyとPHPを両方勉強したことある人にお話を聞くと、HTMLに書き方が近くPHPの方が簡単と言われる。

#理由①PHPの方が初心者向け
https://mynavi-agent.jp/it/geekroid/2017/08/php-vs-rubyweb.html
上記サイトを見てみるとRubyとPHPはこう書かれている。

■PHPはこんな方にオススメ！
・まずはスプリクト型プログラミング言語に触れてみたい方
・気軽にWebサービスを作ってみたい方
・デザイン関連は苦手なのでしっかりと分業して作業を行いたい方
■Rubyはこんな方にオススメ！
・他のプログラミング言語から乗り換えたい方
・チームワークで協力しながらサービス開発を目指したい方
・便利なフレームワークであるRuby on Railsを使用してみたい方
・デザインから開発まで一通り経験したい方

PHPは最初学びやすいが、フレームワークが色々あるのである程度勉強するとそこがネック。ただWEBプログラミングの中では、やはりPHPが比較的簡単と言われている。RubyだとWEBアプリ開発エンジニア転職したい場合、最初に色々と覚えるべきことが多かったりして(特にRuby on Railsの設計思考が初心者には難しい)、初心者には挫折しやすいと感じた。PHPの方が言語の習得のしやすさでも軍配上がる気がする。

#理由②プログラミングスクール乱立で、転職市場がレッドオーシャン
最近Ruby向けプログラミングスクールが続々とできている。「tech expert/tech camp」がその筆頭だろう。またスクールに行かずとも、未経験でも独学で学んでいる人が増えてきた。このようなプログラミングスクールや未経験エンジニアの台頭で、もはやRuby on Railsで動くポートフォリオは当たり前になりつつある。（スクールのカリキュラムでポートフォリオ作りは大体どこでもある。）そうなるとポートフォリオでUI/UXにこだわる・プログラミング以外にブログをやってサイトの運用を経験するなど、何かしらの+αがないと厳しい世界になりつつある。

#理由③未経験向けの求人数が多い
Green(特にエンジニア間でよく使われている求人サイト）でシステム開発(WEB/オープン系)で「Ruby　未経験」で検索すると「153企業　348求人」、それに対し「PHP 未経験」だと「273企業　623求人」。Greenに限らず、実務未経験でエンジニア転職されてる方の話を聞くと「RubyよりPHPの方が未経験向け求人が多い」ということをよく耳にする。

https://pg-job.net/work-pg/
また上記サイトを見てもハローワーク求人数でPHPは３位に対して、Rubyは９位。（もちろんハローワークだからというのもあるかもしれないが。）
Rubyは求人が少ない上に競争相手が多く、今後も厳しい戦いになるのが予想される。

#理由④PHPの方が潰しがきく
PHPだとWEB開発の他にもWordPress開発ができるので、初心者でも案件が取りやすい。またWEBエンジニア転職を諦めて、WEBマーケターやデザイナーに転向したとしても、WEBサイト（HPなど）がWordPressで作られているなど、PHP・HTML・CSSの知識が生かせる場合がある。
一方RubyはWEBアプリで使われるのでWEBエンジニアにならない限り、直接その知識が必要になることは少ない。（バックエンドの知識を持っておいて損はないが）
またSESで経験つけてから自社/受託を目指す場合でも、SESで未経験でRubyができる案件はほぼないため、一旦別言語で経験を積む必要が出てくる。


#まとめ
エンジニア転職を希望せず、WEBアプリを純粋に学んでみたいという方でしたら、Rubyは日本語での資料も多く勉強しやすいです。ただWEBアプリ開発エンジニアになりたいという方なら、現状競争が激化していて潰しがききにくいので、本当にRubyがいいのか考えた方がいいと思います。

参考
https://eng-entrance.com/ruby-php
https://memorandumrail.com/php-ruby/
OpenCV-pythonでjpeg圧縮

指定したフォルダ内について、「.jpg」で終わる全てのファイルを圧縮する。

（読み込み、圧縮エラー時の処理など書いておらず粗いです）


```py
import cv2
import glob
import os

Quality = 10

def img_encode(img):
    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), Quality]
    result, encimg = cv2.imencode(".jpg", img, encode_param)　# (bool値,エンコードしたImageオブジェクト)のタプルが返ってくる
    return cv2.imdecode(encimg, cv2.IMREAD_UNCHANGED)

def output_imgs(): 
    path_list = glob.glob(r"<パス>\*.jpg")
    
    for i, path in enumerate(path_list):
        img = cv2.imread(path)
        compressed_img = img_encode(img)
        cv2.imwrite(r"<パス>" + "python-compressed" + "-rate" + str(Quality) + "-" + str(i+1) + ".jpg", compressed_img)

output_imgs()     

```

### ハマった点

* パスに日本語が含まれていると、`cv2.imread`で正しく動作しない（`None`が返ってくる）
JupyterLabでcondaの環境切替

# はじめに
JupyterNotebookを使ってた頃は複数使いたい時は、コンソールを複数立ち上げなきゃいけなかったので、面倒だったが、JupyterLabを使い始めると拡張もできるし、コンソール１つだけ立ち上げれば簡単に使えるから、使いやすすぎて感動した。

### ある日
自分がJupyterLabをよく使っていたので、同期に
「JupyterLab上でconda環境変えられないの？」と言われたので、調べたらできそうなので、やってみた。

# 準備
まずはannacondaの環境ができている前提で進めます。
JupyterLabを立ち上げるためのconda環境を作ります。（他にcondaの環境があれば大丈夫です）

```
conda create -n 環境名 python=3.7
conda activate 環境名
conda install ipykernel
```

`環境名`には自分で決めて入力してください。
あとは実際にJupyterLabで使う予定のconda環境を作っておいてください。

# 方法
コンソールを立ち上げてもらい、先ほど作ったconda環境にactivateしてから以下のコマンドを入力してください。

```
python -m ipykernel install --user --name 環境名 --display-name "表示名"
```

ここでの`環境名`は実際にJupyterLab上で使用したいconda環境を入力してください。表示名はkernelを選択する項目で実際に表示される名前になるので、自分でわかればなんでも大丈夫です。
その後は実際にJupyterLab上でconda環境をkernelから選べるようになります。

![スクリーンショット 2020-03-06 12.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441037/01769291-517b-c3be-2c4a-aa4ad0170476.png)
![スクリーンショット 2020-03-06 12.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441037/2c1eaa6f-1404-73c2-eef0-f0b367a7d58b.png)

# まとめ
これでJupyterLab上からconda環境を自由に変えられます。
xibで設定したUITableViewCell内のUIButtonをタップするとEXC_BAD_ACCESS

## 状況

UITableViewCell(xib)内のUIButtonをタップ範囲を広げたくて
以下を参考に、UIButtonのカスタムクラスを作成
**・[【iOS】UIButtonのタップ領域だけを拡大する - Qiita](https://qiita.com/KokiEnomoto/items/264f26bfa92d06b1996e)**


```ExpandTappedAreaButton.swift
import UIKit
import Foundation

class ExpandTappedAreaButton: UIButton {
    var insets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        var rect = bounds
        rect.origin.x -= insets.left
        rect.origin.y -= insets.top
        rect.size.width += insets.left + insets.right
        rect.size.height += insets.top + insets.bottom

        // 変更したView領域がタップ領域に含まれているかどうか
        return rect.contains(point)
    }
}
```

カスタムクラスのプロパティを参照しようとすると、**Thread1:EXC_BAD_ACCESS**が発生する。

```HogeCell.swift
@IBOutlet weak var favoriteButton: ExpandTappedAreaButton! //ここでカスタムクラスを指定
    
override func awakeFromNib() {
    //UIButtonにも存在するプロパティ
    hugaButton.imageView?.contentMode = .scaleAspectFit
    hugaButton.setImage(UIImage(named: "hoge.png"), for: .normal)
    //カスタムクラスのプロパティを参照 -> Thread1:EXC_BAD_ACCESS
    hugaButton.insets = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0)
}
```

## 解決策
- UITableViewCellの**xibファイルから**該当するボタン(hugaButton)を選択
- Custom Classを`ExpandTappedAreaButton`(今回の例だと)に変更

以上。

## 原因
- おそらくカスタムクラスはIBOutletよりもxibを優先するので、
Custom Classを設定しない場合、UIButtonとして認識する
- `insets`というプロパティはカスタムクラスにしかない(UIButtonにはない)ので**クラッシュ**

※「EXC_BAD_ACCESSは解放済みオブジェクトへのアクセス時に起こるので、どのオブジェクトにアクセスしてエラーを吐いているのかを調べてください。(一番上の参考文献より)」-> **この辺きっちり調べられるようになりたい。**

## 参考
**・[Objective-C - UITableVIewのreloadDataでのエラー（フリーズ）のついて｜teratail](https://teratail.com/questions/15820)**
UITestで色々な高さを取得


## 環境
- Xcode 11.0
- Swift 5.1

## TableViewの高さ

```Swift
XCUIApplication().tables.element(boundBy: 0).frame.height
```

## NavigationBarの高さ

```Swift
XCUIApplication().navigationBars.element(boundBy: 0).frame.height
```
## デバイスの画面のサイズ

```Swift
XCUIApplication().windows.element(boundBy: 0).frame.size
```
【画像連結】画像をタイル状に並べる

# 目的
複数の画像をタイル上に並べて一枚の画像に見せる。

コードと解説は、[こちら](https://www.aiprogrammers.net/entry/2020/03/13/212808)に記載しました。
[【画像連結】画像をタイル状に並べる](https://www.aiprogrammers.net/entry/2020/03/13/212808)
TypeScript: 計算結果をキャッシュする関数

ここで紹介するのは、「計算結果をキャッシュし、二回目以降はキャッシュされた計算結果を返す」といった特性を普通の関数に付与する便利関数です。

```typescript
const none = Symbol()
function cache<T extends (...args: any[]) => any>(
  func: T,
): (...args: Parameters<T>) => ReturnType<T> {
  let ret: ReturnType<T> | typeof none = none
  return (...args) => ret === none ? ret = func(...args) : ret
}
```

使い方

```typescript
// すごく計算に時間を要する関数
function fibonacci(num: number): number {
  if (num <= 1) return 1;
  return fibonacci(num - 1) + fibonacci(num - 2);
}

// キャッシュ機能を付与した関数を作る
const cachedFibonacci = cache(fibonacci)
console.log(cachedFibonacci(40)) // ここで計算して結果を返す
console.log(cachedFibonacci(40)) // キャッシュから計算結果を返す
console.log(cachedFibonacci(40)) // 同上
```

引数をキャッシュするのを忘れてたので、後で直します。
【Nuxt.js】vue-awesome-swiperを導入し、カルーセルを表示させてみる

Nuxt.jsでvuetify.jsを使用しています。今回はスライダーの実装について検討したSwiperについてご紹介します。

VuetifyにはCarouselsのコンポーネントが含まれているのですが、複数の画像を表示させたりする機能がなく別のライブラリを探していました。
https://vuetifyjs.com/en/components/carousels

まず候補にあがったのはvue-carouselですが、アニメーションの機能など少ないこともありvue-awesome-swiperを導入することにしました。
https://github.com/surmon-china/vue-awesome-swiper?ref=kabanoki.net
https://github.surmon.me/vue-awesome-swiper/?ref=madewithvuejs.com

もともとSwiper自体がjQueryに以前せずに使えたこともあり、Vue.jsを使う前からも使用していました。
Githubでも2万超えのスターを押されている人気のライブラリーです。
それをVue.js用に使用できるよう開発されたのがvue-awesome-swiperです。

## vue-awesome-swiperをプロジェクトに追加
まずはvue-awesome-swiperをプロジェクトに追加します。

### yarn
```
yarn add vue-awesome-swiper
```

## pluginsにフォルダに追加
pluginsにフォルダの中にswiper.jsを作成します。
vueをインポートしてVueAwesomeSwiperを使う宣言をします。
swiperのcssもここで読み込む用にします。

```plugins/swiper.js
import Vue from 'vue'
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'

Vue.use(VueAwesomeSwiper)
```

## nuxt.config.jsに追記する

nuxt.config.jsのpluginsに追記します。
SSR対応済みのプラグインであれば、pluginsの ssr:false 記述は不要ですが、非対応のものでここを設定してなかったらエラーがでます。

```nuxt.config.js

  plugins: [
    { src: '~/plugins/swiper.js', ssr: false }
  ],

```

## テンプレートを準備する
swiperが全体を囲い、swiper-slideで各スライドの部分を表示させます。

```index.vue
<template>
  <section>
    <swiper>
      <swiper-slide>スライド１</swiper-slide>
      <swiper-slide>スライド２</swiper-slide>
      <swiper-slide>スライド３</swiper-slide>
    </swiper>
  </section>
</template>
```

## Swiperのオプションを使ってみる
swiperに:options="swiperOption"を追加します。
Swiper.jsのときに使用した機能が使えます。下記を参考にたくさんのオプションが使えます。
[Vue-Awesome-Swiper](https://github.surmon.me/vue-awesome-swiper/)


### オプションの設定
```index.vue
<template>
  <section>
    <swiper :options="swiperOption">
      <swiper-slide>スライド１</swiper-slide>
      <swiper-slide>スライド２</swiper-slide>
      <swiper-slide>スライド３</swiper-slide>
			<div class="swiper-pagination" slot="pagination"></div>
			<div class="swiper-button-prev" slot="button-prev"></div>
			<div class="swiper-button-next" slot="button-next"></div>
    </swiper>
  </section>
</template>

<script>
export default {
	data () {
		return {
			swiperOption: {
				autoplay: {
					delay: 2500,
					disableOnInteraction: false
				},
				pagination: {
          el: '.swiper-pagination',
          clickable: true
        },
				slidesPerView: 2,
				centeredSlides: true,
				spaceBetween: 5,
				loop: true,
				navigation: {
					nextEl: '.swiper-button-next',
					prevEl: '.swiper-button-prev'
				}
			}
		}
	}
}
</script>
```
ページネーションと前後へのナビを追加した形で一般的なナビはこんなところでしょうか。
PostgreSQLで配列を0オリジンにする方法

結論。
`arr := ('[0:'||array_length(arr,1)-1||']='||(arr::text))::int[];`
すべし。


```sql
DO
$do$
DECLARE arr int[] := '{1,2,3,4}'::int[]; 
BEGIN
RAISE NOTICE 'before';
RAISE NOTICE 'arr=%', arr;
RAISE NOTICE 'arr[0]=%', arr[0];
RAISE NOTICE 'arr[1]=%', arr[1];
RAISE NOTICE 'arr[2]=%', arr[2];
RAISE NOTICE 'arr[3]=%', arr[3];
RAISE NOTICE 'arr[4]=%', arr[4];
    arr := ('[0:'||array_length(arr,1)-1||']='||(arr::text))::int[];
RAISE NOTICE 'after';
RAISE NOTICE 'arr=%', arr;
RAISE NOTICE 'arr[0]=%', arr[0];
RAISE NOTICE 'arr[1]=%', arr[1];
RAISE NOTICE 'arr[2]=%', arr[2];
RAISE NOTICE 'arr[3]=%', arr[3];
RAISE NOTICE 'arr[4]=%', arr[4];
END;
$do$;
```
↑実行すると、

```
NOTICE:  before
NOTICE:  arr={1,2,3,4}
NOTICE:  arr[0]=<NULL>
NOTICE:  arr[1]=1
NOTICE:  arr[2]=2
NOTICE:  arr[3]=3
NOTICE:  arr[4]=4
NOTICE:  after
NOTICE:  arr=[0:3]={1,2,3,4}
NOTICE:  arr[0]=1
NOTICE:  arr[1]=2
NOTICE:  arr[2]=3
NOTICE:  arr[3]=4
NOTICE:  arr[4]=<NULL>
DO
```
となる。
C言語　trueとfalseについて。あとNULLの真偽の扱いについて。

##C言語において、bool型はない。

__int型の0__のみが偽となり、それ以外が全て真として扱われる。

- 偽
    - __int型の0__のみ
- 真
    - __偽以外__のすべて


※他の言語でbool型定義されているのはコードの可読性を上げるためです。あくまで__人間のための型__なんですね。c99からは、ライブラリによってtrue, falseが定義されていますが、マクロで置き換えているだけで本質的にintであることに変わりはありません。


##では、NULLはどういう扱いになるのか。
NULLはヘッダファイルによって下記のように定義された定数であり、コンパイル時にマクロによって置き換え処理がされている。

```c
#define NULL    ((void*)0)
```

つまりNULLは__void型__によってキャストされた値0のことである。

文法的には、int型の0ではないので、厳密な意味で偽（=0)として使えるわけではないが、多くコンパイラでは偽としても使える。
(ビットフィールドがすべて0であるから)

NULLというマクロが定義されているのは、以下のヘッダファイル

- stddef.h
- stdio.h
- stdlib.h
- string.h
- time.h
- locale.h
- wchar.h


###参考
C言語関数辞典 - C言語用語集 空ポインタ(null pointer)
http://www.c-tipsref.com/words/null_pointer.html

言語別、if文でtrue（真）／false（偽）になる場合 | kamotora
https://kamotora.net/system/true-of-false/

NULL と '\0' の違い
http://www.kis-lab.com/serikashiki/C/C01.html
CSV::MalformedCSVError: Missing or stray quote in line 2

## 概要

Railsのマイグレーション対応でseedデータがメンテナンスされていないところを対応していたらハマりました。

## 問題

```shell
$ bundle exec rake db:seed
rake aborted!
CSV::MalformedCSVError: Missing or stray quote in line 2
...
```

## 対処方法

文字列内に `\"` を `""` に変更する。

バックアップなどからCSVファイルをエクスポートする際に気をつけるだけで大丈夫です。

　<img width="600" alt="スクリーンショット 2020-03-06 11.53.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/6ff1f348-4fb7-1b8f-7302-fb05c4bd0883.png">



## まとめ

原因が分かったきっかけは前のデータとの比較でした。
バックアップは必須ですねー
誤差逆伝播法　〜機械学習の用語まとめ〜

#勾配法の欠点
[勾配法](https://qiita.com/Becon147/items/8962c85fddf7168e631a)では、微分を用いて勾配を計算し、それらを用いてパラメータを更新を行っていた。しかしながら、実際のニューラルネットワークはかなり複雑であり、微分は数値計算的にはとても時間がかかり非効率である。
そこで、利用されるのが誤差逆伝播法である。

#計算グラフを用いた誤差逆伝播法
誤差逆伝播法を理解するには計算グラフを利用するのが便利である。
例として、１本１００円の鉛筆を２本、１個３０円の消しゴムを３個、消費税が１０％の場合を考える。
この問題の計算を以下のようにグラフで表す。
<img width="466" alt="スクリーンショット 2020-03-06 10.33.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/a5e0cc17-3e26-3e22-140c-627cb7a149ae.png">
グラフを見ると、矢印の流れが２つある。
左から右へと伝わる(**順伝播**)部分の計算は通常の四則演算である。
一方、右から左へ伝わる流れ(**逆伝播**)は、各値を１増加させた時、１番右の値(例では合計金額)がどれだけ増加するかを表している。
つまりこの方法を用いれば、各パラメータの勾配を求めることができる。これが**誤差逆伝播法**である。

#逆伝播の計算方法
まず１番右の逆伝播を１にし、そこから各ノードで逆伝播を計算していく。
以下のように、xを入力とし $y=f(x)$を出力とするノードがあるとする。
<img width="238" alt="スクリーンショット 2020-03-06 10.53.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/a989c049-e293-6296-0fc8-867503f1196a.png">
この時、yでの逆伝播をtとすると、xの逆伝播は$$t(\frac{\partial y}{\partial x})$$
となる。
ここからは各ノードの逆伝播について紹介していく。

###＋ノード
＋ノードは単純に同じ値をそのまま左へ逆伝播させるだけである。
<img width="218" alt="スクリーンショット 2020-03-06 10.50.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/114c8d58-eb4e-0c1b-9f09-5def6f9a7520.png">
z=x+yであるので、zをx,yでそれぞれ微分すると1となる。これが、そのまま左へ逆伝播する所以である。

###×ノード
×ノードは相手の値を逆伝播にかけて伝播させる。
<img width="216" alt="スクリーンショット 2020-03-06 11.01.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/b41c2ee8-8201-e33b-1cef-488e05ed68cf.png">
z=xyなので、zをx,yで微分とすると、y,xとなる。よってxはyを、yはxをかけるのである。

### dotノード
行列の積は、以下のようになる。行列の積の順序に注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/98b4ecf5-8f29-33fd-954a-003ce8b948f7.png)

[活性化関数](https://qiita.com/Becon147/items/eef45f7343476cd5097b)も逆伝播を求めることができる。
###ReLUノード
ReLUの微分は、
$$
\frac{\partial y}{\partial x}= 
\begin{cases}
1 & (x \geq 0)\\\
0 & (x &lt; 0)
\end{cases}
$$
なので、x≥0ではそのまま伝播し、x<0では0となる。
<img width="404" alt="スクリーンショット 2020-03-06 11.08.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/aaa173bd-9968-0968-1fdf-9c46699a95e1.png">

###Sigmoidノード
計算は省略するが、以下のようになる。
<img width="432" alt="スクリーンショット 2020-03-06 11.15.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/dfa23e97-3186-fdf2-0d97-8529800268a4.png">

#Softmaxノード
Softmaxノードは[クロスエントロピー誤差]()と一緒に考えると、便利である。
<img width="484" alt="スクリーンショット 2020-03-06 11.32.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470838/a1612c71-c478-e0a6-c270-4bbd4f9e4483.png">
なお、t1~t3は正解ラベルである。
それぞれの逆伝播はやや複雑だが、組み合わせるとSoftmaxノード前の逆伝播が正解ラベルとSoftmaxの出力との差と、単純な形になっている。
クロスエントロピー誤差は、このように逆伝播が綺麗な形になるように設計された関数なのである。
そのほかの損失関数に関しても、逆伝播が綺麗になるように設計されたものが多い。

#まとめ
誤差逆伝播法は、勾配をより簡単に求めるための手法であり、計算グラフを用いると理解しやすい。
逆伝播は、各パラメータの増加に対する最終的な値の増分を表している。
損失関数の多くは、逆伝播が単純な形になるように設計されている。

###参考
[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/dp/4873117585)
C言語　void型ってなんぞ

## voidってなに？

C言語はデータ型によって情報のサイズや、情報の種類を決めている。
void型はそのデータ型の一つ。char, int, floatなどのデータ型と同じデータ型という概念。

__ただし、void型の変数は作れない__

```c
void i; // NGです
```

##void型とは、型がないことを示す型

0の概念と似ている。無いことを明示的に示す。
そう言えばあんま意識してなかったけど、ここでも使われている。

```c
int main(void)
{
    return 0;
}
```

main(void)は引数を必要としないことを明示している。

```c
void func1() {
}

void func2(void) {
}

int main(int argc, char *argv[]) {
    func1();
    func1("Hello"); // エラーにならない
    func2();
    func2("Hello"); // エラーになる
}
```

## 4通りの関数

関数には４通り考えられる。

- 引数あり、戻り値あり
- 引数あり、戻り値なし(void)
- 引数なし(void)、戻り値あり
- 引数なし(void)、戻り値なし(void)

無いということを示すためのvoidがあることで以下の型の体型がキレイに維持できる。

```c
void func(void){
    // コード
}
```

## voidのポインタ型(汎用ポインタ)
voidも型なので、voidのポインタ型も存在する。

__参照先のデータ型がないポインタ__という意味。
voidのポインタ型を使った参照先への__読み書きはできない__。
数字を0で割れないみたいなもん。ルールを作るための存在だから例外の扱い。

できることは、__アドレスの格納のみ__

__様々な型のアドレスを受け入れることに使える__ほか、意図的に、アドレスだけを使用して、メモリアクセスができないように制限するといった使い方も可能。

この様々な型を受け入れられる性質から、
別名、__汎用ポインタ__と言われる。



## 参考
NULL と '\0' の違い
http://www.kis-lab.com/serikashiki/C/C01.html

C言語関数辞典 - C言語用語集 空ポインタ(null pointer)
http://www.c-tipsref.com/words/null_pointer.html

C言語 void型の意味と使い方【void型ポインタの扱い方も解説】
https://monozukuri-c.com/langc-funclist-void/
仮想環境下でJupyterNotebook起動時のエラー「エントリポイントが見つかりません」

# エラー
[この記事](https://qiita.com/yuj/items/b9e82aeb0e4b2ffd34b9)などを参考に(他情報でも同じなのでこの記事が悪いわけではないです)仮想環境下でJupyterNotebookを起動したら、以下のエラーが発生した。
<img width="311" alt="rapture_20200306111548.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/2ad66be6-2030-07c1-c7b7-b648bdc97b99.jpeg">
```
プロシージャ エントリ ポイント
?PyWinObject_FromULARGE_INTEGER@@YAPEAU_object@@AEBT_ULARGE_INTEGER@@@z がダイナミック リンク ライブラリ (仮想環境のパス)\pythoncom37.dllから見つかりませんでした
```
# 調べて出てきたこと

同じエラーが発生したissuesを見つける。

https://github.com/ContinuumIO/anaconda-issues/issues/11502

これで出ている解決策はSystem下のpythoncom37.dllをAnaconda下のpythoncom37.dllに置き換えろってことらしいです。これで解決するかもしれません。(未検証)

ただこれを読んで試してる途中に別に気になったことが...

# やった解決策
anaconda promptから仮想環境下で以下のコマンドを実行する。

```
conda install conda
```
仮想環境下にcondaが入ってなかったらしい。condaでcondaをインストールすると動くようになります。起動してみましょう。

```
jupyter notebook
```
エラーが発生せず起動すればOK。
# ついでに
そもそもgit bashとかpower shellとかから(anaconda promptを経由せずに)jupyterNotebookを起動すればこのエラーは発生しないとの情報もあり。
sqlalchemy

```py
import sqlalchemy
import sqlalchemy.ext.declarative
import sqlalchemy.orm

#sqliteでメモリ上にデータベースを作成
#engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True)

#sqlite
#engine = sqlalchemy.create_engine('sqlite:///:test_sqlite2.db', echo=True)

#mysql
engine = sqlalchemy.create_engine('mysql+pymysql://root:@localhost/test_mysql_database2')

Base = sqlalchemy.ext.declarative.declarative_base()

class Person(Base):
    __tablename__ = 'persons'
    id = sqlalchemy.Column(
        sqlalchemy.Integer, primary_key=True, autoincrement=True)
    name = sqlalchemy.Column(
        sqlalchemy.String(14)
    )


Base.metadata.create_all(engine)

Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()

p1 = Person(name='Mike')
session.add(p1)
p2 = Person(name='Nancy')
session.add(p2)
p3 = Person(name='Jun')
session.add(p3)
session.commit()

p4 = session.query(Person).filter_by(name='Mike').first()
p4.name = 'michel'
session.add(p4)
session.commit()

p5 = session.query(Person).filter_by(name='Nancy').first()
session.delete(p5)
session.commit()

persons = session.query(Person).all()
for person in persons:
    print(person.id, person.name)
```
出力：

```
1 michel
3 Jun
4 michel
6 Jun
```
RDS for Microsoft SQL Serverに.bakをリストアするとエラーになる

#RDS for Microsoft SQL Serverに.bakをリストアできない

社内DBをRDSへ移行しようとした際に、.bakをそのままリストアする方法として下記を参考にさせて頂きました。

■RDS for SQL Server へのインポート
https://qiita.com/nis_nagaid_1984/items/99870c7a6e9ea5b777a4

■RDS for Microsoft SQL Serverのバックアップ・リストアが簡単にできるようになりました！
https://dev.classmethod.jp/cloud/aws/import-export-mssql-by-s3-bak-file/

■Setting Up for Native Backup and Restore
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html#SQLServer.Procedural.Importing.Native.Enabling

#エラーになるけどどうしたらいいの？
上記で紹介した記事で、下記の手順が紹介されていました。
実際の手順は前述の記事で紹介されているので省略しますが、簡単な流れとしては下記の通りです。
・S3にバケット作成してそこにファイルをアップしておく
・RDSインスタンスにオプショングループ(SQLSERVER_BACKUP_RESTORE)の追加
・SSMSでRDSのストアド[rds_restore_database]を実行する

私の場合、ストアドを実行してもエラーで終了してしまい、対処方法がわかりませんでした。
ステータス確認ストアド[rds_task_status]に表示されるエラーメッセージから、オプショングループ(SQLSERVER_BACKUP_RESTORE)で追加したIAMロールの問題のように思えましたので、下記の確認を行いました。

#IAMロールの確認
![2020-03-06_11h26_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/d6f1c0da-b5af-9777-4f85-416cb5b2dfb8.png)

![2020-03-06_11h28_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359386/bab3babb-8637-e6d5-1c4c-4a0884ebc784.png)

すると、ポリシーに記載されているS3のバケットが.bakの保存先とは別のバケットだけが記載されていました。
ここに.bakの保存先バケットを追加してみました。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::□□□□□□□□□",　← カンマも追加
                "arn:aws:s3:::□□□□□□□□"   ← .bakの保存先追加
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectMetaData",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::□□□□□□□□□/□□□□□/*",　← カンマも追加
                "arn:aws:s3:::□□□□□□□□/□□□/*"  ← .bakの保存先追加
            ]
        }
    ]
}
```
##結果
再度ストアド[rds_restore_database]を実行してステータスを確認すると、見事成功となっておりました。
DBインスタンスにオプショングループを追加した際にどのバケットが初期値として指定されるのか不明ですが、IAMロールからであれば明示的にバケットを指定できました。

どなたかのお役に立つことがあれば幸いです。
Mac アプリケーションのアンインストール

# 目的

- MacのApp storeからインストールしていないアプリを削除する方法をまとめる

# 実施方法

1. アプリケーションフォルダにある消したいアプリのアイコンを右クリックする。
1. 「削除する」をクリックする。
1. Dock(画面下部のバー)にある「ゴミ箱」を右クリックして「ゴミ箱を空にする」をクリックする。

# 備考

- Windowsでのアプリケーション削除はコントロールパネルから「アンインストール」を実施するため、そのギャップに驚きまとめた。
どうしてキャメルケースがキャメルケースなのかふと気になった君へ

## はじめに
ググれば済むことをググるのも億劫なあなたに送ります。
昨今のトイレットペーパーの件よりはある程度正当性こそ担保した上でまとめていますが、
本来諸説あることを調べ散らかして書いているだけなので、
ヤクザに脅されたときに「このQiitaに書いてあったから」と言い訳しても
埋められるのは不可避な旨ご了承ください。


## 命名規則、ふときになったあなたへ

Railsで諸々書いていると、クラス名ってこんな感じで呼び出しますよね

```
HageClass.new
```
単語の先頭だけ大文字にします。

一方でjsでメソッド名を書くとき

```
hageFunction
```
先頭の単語は小文字にしますね。

これってどういう違い何でしょうか？？？

jsの方の先頭小文字は`キャメルケース`と言いますよね。
エンジニアなら知ってて当然です。知らないあなたも今日からエンジニアです。おめでとうございます。

キャメルとはラクダのことです。なんでラクダ？
お前のコードなんて砂漠ぐらい不毛だとかディスられているんでしょうか？

他にも
`my_class`とdbとかでありがちなアンダーバーで繋ぐやり方を`スネークケース`
`my-calss`の様なハイフンで繋ぐやり方は`ケバブケース`と言います。

ケバブって何でしょう、急に食べ物？？
ケバブといえば秋葉原にこれでもかってぐらいケバブ屋さんありますよね、あれどこが一番美味しいんでしょう

## キャメルケースの由来

名前の由来ですが凸凹している感じが**ラクダのコブに見えるから**だそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454065/b6fd8974-fd72-6f5d-40a7-398751f58a5d.png)

見え・・・見えますかね？


キャメルケースには二種類あって

先頭も大文字にするのを`アッパーキャメルケース`
先頭小文字を`ローワーキャメルケース`と言うそう

冒頭のRailsクラス名なんかはこのアッパーキャメルケースに該当しますね。

そういえば`McDonald`もアッパーキャメルですね。

ただ、一般的にキャメルケースといえば`ローワーキャメルケース`が一般的です。

アッパーキャメルケースは`パスカルケース`とも言われます。
なのでこちらの方がメジャー（なのかもしれない）

ではパスカルケースと命名したのは誰か？当然気になりますよね。

アンダース・ヘルスバーグさんです。
(Wikipedia情報)


## ケバブケースの由来
まあキャメルケースがああいう理由ということはケバブケースもなんか察しがつきますね
**串刺しになっているから**だそうです。
他にも繋がっている様子からチェインケースとも言うらしい。


## スネークケースの由来

**もうわかりますよね**

**蛇みたいだから**です。

うん、思った以上にフィーリングでした。

全然この辺好みなのですが

```
my-class_snake_case
```
みたいにケバブケースとスネークケースが混同されるパターンに
ちょっとだけイラっとする人僕と握手

## おわりに

まあだからなんだって話ですが、法則覚えておくと

「ここハイフン繋ぎで」「ここ単語の先頭大文字で！」とかいうより

「ここスネークケースで」「ここはパスカルケースで」と、
共通言語で語れた方がちょっとだけスマートかもしれません。

まあカタカナ使ってしゃらくさい感じは出ちゃいますけど。
ベストフォートでコミットするためには諦めるしかないです。


以上、トイレットペーパーが残り１ロールしかない私がお送りしました。
youtubeで1秒スキップするショートカット

# 概要

youtubeの動画再生中に1秒スキップするショートカットを作成するコードを作りました。先に言っておくと、youtubeではデフォルトで以下の便利なショートカットがあります。ただ、5秒では進み過ぎてしまう場合など、スキップ時間をカスタマイズしたい時に役に立ちます。

※youtubeにデフォルトで備わっているショートカット例
・「→」 ： 5秒進む
・「←」 ： 5秒戻る
・「L」 ： 10秒進む
・「J」 ： 10秒戻る
・pause中に「.」 ： 1フレーム進む
・pause中に「,」 ： 1フレーム戻る

作成にあたって、tampermonkeyというchrome拡張機能を使用しました。※[tampermonkeyの参考](https://www.lisz-works.com/entry/chrome-tampermonkey)
この拡張機能はユーザースクリプトといって、ユーザー独自のスクリプトをwebサイトを閲覧する際にそのユーザーにだけ反映させる事ができます。コードの仕様はjavascrpt同様です。

# コード
```javascript
// ==UserScript==
// @name         youtubeskip1s
// @namespace    test
// @version      0.1
// @description aaaaa
// @author you
// @match https://www.youtube.com/*
// @grant none
// ==/UserScript==
(function() {
var skip1s = function(evt) {
    if (evt.keyCode === 219) {//左カッコ「[」
        var ytPlayer = document.getElementById("movie_player");//前準備
        var currentTime = ytPlayer.getCurrentTime();//現在の再生時間を取得
        ytPlayer.seekTo(currentTime - 1);// 1秒戻る
}
    if (evt.keyCode === 221) {//右カッコ「]」
        ytPlayer = document.getElementById("movie_player");//前準備
        currentTime = ytPlayer.getCurrentTime();//現在の再生時間を取得
        ytPlayer.seekTo(currentTime + 1);// 1秒進む
}
}
document.addEventListener("keydown", skip1s, false);//keydownが起きた時にskip1sを実行
})();
```
最初の方で

```javascript
// @match https://www.youtube.com/*
```
とすることで閲覧しているページアドレスが「https://www.youtube.com/* 」（youtubeの動画アドレス）と一致した時のみスクリプトを実行します。

一番最後の

```javascript
document.addEventListener("keydown", skip1s, false);//keydownが起きた時にskip1sを実行
```
は、何かキーボードが押された時に「skip1s関数」を実行するという意味です。押されたキーが目的のものかどうかの判定はskip1s関数内のifによって行っています。
# 使い方
まずtampermonkeyをインストールします。方法は[こちら](https://www.lisz-works.com/entry/chrome-tampermonkey)の通りです。
その後、アイコンを押して「ダッシュボード」を選択し、新規スクリプトを作成し、先程のコードを貼り付けて実行させることで準備完了です。
使用する時は
・「[」(左カッコキー) ： 1秒戻る
・「]」(右カッコキー) ： 1秒進む
になります。なぜこのキーかというと、youtubeのページでは元々色々なショートカットキーが既に割り当てられており、重複を避けるためにこのようなキー割り当てにしました。
# まとめ
コード自体あまり複雑でないため、工夫次第でさらに汎用的な使い方が可能だと思います。是非参考にしてもらえると嬉しいです。

もしよければこちらの記事もどうぞ。↓
[wordでギリシャ文字を素早く入力する](https://qiita.com/mu_mura/items/82148783a06c043470d9)
[通常マウスでコピー,ペースト,戻るなどができるようにするマクロ](https://qiita.com/mu_mura/items/1a519431143f02698421)
# 参考にしたサイト
https://www.tam-tam.co.jp/tipsnote/javascript/post6217.html
https://stackoverflow.com/questions/6970013/getting-current-youtube-video-time
備忘録（TX４６）レンダーメソット

<div id="main-content" class="col-sm-9">
  <h3 class="page-name"><%= link_to 'Post', posts_path %></h3>
  <div class="row">
    <%= render @posts %>
  </div>
</div>

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<div class="col-sm-3 single-post-card" id=<%= post_path(post.id) %>>
  <div class="card">
    <div class="card-block">
      <h4 class="post-text">
        <%= truncate(post.title, :length => 60) %>
      </h4>
      <div class="post-content">
        <div class="posted-by">Posted by <%= post.user.name %></div>
        <h3><%= post.title %></h3>
        <p><%= post.content %></p>
        <%= link_to "I'm interested", post_path(post.id), class: 'interested' %>
      </div>
    </div>
  </div>
</div>

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー






じょうきがレンダーを使わない場合



https://pikawaka.com/rails/render

https://pikawaka.com/rails/redirect_to


   <div class="card-block">
      <h4 class="post-text">
        <%= truncate(post.title, :length => 60) %>
      </h4>
      <div class="post-content">
        <div class="posted-by">Posted by <%= post.user.name %></div>
        <h3><%= post.title %></h3>
        <p><%= post.content %></p>
        <%= link_to "I'm interested", post_path(post.id), class: 'interested' %>

をコピーしてeach do するだけ！！


回答

<div id="main-content" class="col-sm-9">
  <h3 class="page-name"><%= link_to 'Post', posts_path %></h3>
  <div class="row">
    <% @posts.each do |post| %>
      <div class="col-sm-3 single-post-card" id=<%= post_path(post.id) %>>
        <div class="card">
          <div class="card-block">
            <h4 class="post-text">
              <%= truncate(post.title, :length => 60) %>
            </h4>
           <div class="post-content">
             <div class="posted-by">Posted by <%= post.user.name %></div>
                 <h3><%= post.title %></h3>
                 <p><%= post.content %></p>
                 <%= link_to "I'm interested", post_path(post.id), class: 'interested' %>
            </div>
          </div>
        </div>
      </div>
    <% end %>
  </div>
</div>
【rails】each文で@postsの要素を配列として並べる書き方

どうも、岩城です。

みなさん、each文は好きですか？好きですよね？違いますか？

さて、そんな私が絶賛片思い中のeach文ですが、railsの中ではどのように使われるのでしょうか。見ていきましょう。

###まずはこちらを見てみましょう
```
<div class="single-post-card">
  <div class="card">
    <div class="card-block">
      <h4 class="post-text">
        <%= truncate(post.title, :length => 60) %>
      </h4>
      <div class="post-content">
        <div class="posted-by">Posted by <%= post.user.name %></div>
        <h3><%= post.title %></h3>
        <p><%= post.content %></p>
        <%= link_to "I'm interested", post_path(post.id), class: 'interested' %>
      </div>
    </div>
  </div>
</div>
```

postの中身をpost.titleなどで呼び出しています。

ただ、これだと複数の要素を自動的に配列として並べる際にややこしくなってしまいます。


### railsのeach文をこう書きましょう。



Postscontorollerに

```
@posts=Post.all
```

があると仮定して、each文で呼び出していきましょう！

```
<div id="main-content" class="col-sm-9">
  <h3 class="page-name"><%= link_to 'Post', posts_path %></h3>
  <div class="row">
    <% @posts.each do |post| %>
      <div class="col-sm-3 single-post-card" id=<%= post_path(post.id) %>>
        <div class="card">
          <div class="card-block">
            <h4 class="post-text">
              <%= truncate(post.title, :length => 60) %>
            </h4>
           <div class="post-content">
             <div class="posted-by">Posted by <%= post.user.name %></div>
                 <h3><%= post.title %></h3>
                 <p><%= post.content %></p>
                 <%= link_to "I'm interested", post_path(post.id), class: 'interested' %>
            </div>
          </div>
        </div>
      </div>
    <% end %>
  </div>
</div>
```

上記のように書くことで、@postsの1つ1つのカラムをpost.titleなどの表記で呼び出せるようになります。


以上になります＾＾

each文は配列がある場合に非常に便利なのでマスターしちゃいましょう！
Jupyter Notebook の横幅をブラウザいっぱいにする


Jupyter Notebook の横幅をブラウザいっぱいにする小技です。

```
~/.jupyter/custom/custom.css
```

に下記を加えます。

```css
@media (min-width: 768px) {
  .container {
    width: 98%;
  }
}
@media (min-width: 992px) {
  .container {
    width: 98%;
  }
}
@media (min-width: 1200px) {
  .container {
    width: 98%;
  }
}
```

このようにすると、.../site-packages/notebook/static/style/style.min.css に書かれているピクセル指定の幅設定を上書きできるようです。

変更後に、Jupyter の server を再起動する必要がある点に注意です。