OmniAICreator/Qiita-1.07M huggingface dataset:
片対数グラフのスプライン補間

励みになるので、気軽にコメント、いいね、ぜひ。

#片対数グラフでスプライン補間がうまくいかない
例として、ある実験のデータを片対数でプロットしてみる。

```python:data
import numpy as np
np.array([[ 1.00e+03,  2.01e+01],
          [ 1.00e+04,  2.00e+01],
          [ 2.00e+04,  1.97e+01],
          [ 3.00e+04,  1.90e+01],
          [ 4.30e+04,  1.76e+01],
          [ 6.00e+04,  1.55e+01],
          [ 1.00e+05,  1.17e+01],
          [ 3.00e+05,  1.80e+00],
          [ 1.00e+06, -1.12e+01]])

#グラフの設定
plt.xscale('log')
plt.xlabel("Frequency[Hz]")
plt.ylabel("Gain[dB]")
plt.grid(True)

#散布図をプロット
plt.scatter(x, y, marker="x",s=50)

#スプライン補間した関数をプロット
from scipy import interpolate
f = interpolate.interp1d(x, y, kind='quadratic')
xnew = np.logspace(3, 6, num=90)
plt.plot(xnew,f(xnew))
```
▼出力されるグラフ
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304938/9f806cb1-41ea-6b81-8156-88d1066ceeb6.png)
10^5～10^6あたりの補完がおかしい。
これは横軸をlogでとっているにもかかわらず、スプライン補間を元の軸のまま行っていることが原因である。

#正しいスプライン補間をする方法
logをとってからスプライン補間した関数を求めれば良い。
以下に具体的なコードを示す。

```python
#　～　省略　～
#スプライン補間した関数をプロット
from scipy import interpolate
f = interpolate.interp1d(np.log10(x), y, kind='quadratic') #logをとってスプライン補間
xnew = np.logspace(3, 6, num=90)
plt.plot(xnew,f(np.log10(xnew))) #plotするときもlogをとってから渡す
```
▼出力されるグラフ
![index1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304938/581b333f-8821-2a47-3129-bfc37449ae0f.png)
今度はうまく補間されている！めでたい。

#実際に試したい人向けコード
jupyter notebookを使っている人向け。


```python

# coding: utf-8

# In[1]:


import numpy as np
import matplotlib.pyplot as plt

#プロットするデータ。
data = np.array([[ 1.00e+03,  2.01e+01],
                 [ 1.00e+04,  2.00e+01],
                 [ 2.00e+04,  1.97e+01],
                 [ 3.00e+04,  1.90e+01],
                 [ 4.30e+04,  1.76e+01],
                 [ 6.00e+04,  1.55e+01],
                 [ 1.00e+05,  1.17e+01],
                 [ 3.00e+05,  1.80e+00],
                 [ 1.00e+06, -1.12e+01]])

#logのグラフを扱うような人はグラフはグレースケールだろう
plt.style.use('grayscale')
plt.rcParams["axes.facecolor"] = (1,1,1,0)
plt.rcParams["figure.facecolor"] = (1,1,1,0)


# In[2]:


x = data[:,0]
y = data[:,1]

plt.xscale('log')
plt.xlabel("Frequency[Hz]")
plt.ylabel("Gain[dB]")
plt.grid(True)

plt.scatter(x, y, marker="x",s=50)

from scipy import interpolate
f = interpolate.interp1d(x, y, kind='quadratic')
xnew = np.logspace(3, 6, num=90)
plt.plot(xnew,f(xnew))


# In[3]:


x = data[:,0]
y = data[:,1]

plt.xscale('log')
plt.xlabel("Frequency[Hz]")
plt.ylabel("Gain[dB]")
plt.grid(True)

plt.scatter(x, y, marker="x",s=50)

from scipy import interpolate
f = interpolate.interp1d(np.log10(x), y, kind='quadratic')
xnew = np.logspace(3, 6, num=90)
plt.plot(xnew,f(np.log10(xnew)))


```
ruby on rails 用 備忘録

# ruby on Rails 試してみた

## とりあえず重要なの一覧（順不同）
- rails new [アプリ名]
- rails g controller [コントローラ名] [アクション名]
- rails g model [モデル名] [カラム] : [型(stringとか)]
- rails db:migration

## へぇ～って思ったもの
- params[:○○]
    1. URLから得られる値が入る(posts/:id なら:idの値が入る)
    2. ~html.erbで指定したname属性の値が入る(name="content" ならparams[:content]に入る)

## validation関係
- modelに書くvalidation
    1. validates :content, presence: ture, {length: {maximum: 140}}
    
## migration関係
- rails g migration [追加するカラムなど]
    - add_column :users, :password, :string
    - rails db:migrateで追加完了

## before_action
- before_action :[function] ,{only: [:xxx, :yyy]}
    - application_controllerに定義する 
    - before_actionは共通して実行したい処理に使う
    - 使用するアクションはonlyを使えば個別に設定できる

## 20190505勉強中
iTerm2ステータスバーの自作コンポーネントを作成してみた

*自作コンポーネントが作れるらしいので試しに作成してみました！！*

きっかけとしては，iTerm2が好きで何か作れないかなと思っていたところ，beta版ステータスバーが3.3.0で追加されたらしいという情報を今頃知って作成することに決めました。

それで，実際に作ったものはこれです。
https://github.com/takezyou/wifi_status

<img width="206" alt="wifi_status.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152495/8f514136-187d-2411-1d1a-6dcab27dc0e1.png">

wifiの状態を可視化できるものです。
基本的にはb4b4r07さんの[tumx/wifi](https://github.com/b4b4r07/dotfiles/blob/master/.tmux/bin/wifi)を元に作成しました。

status barについての細かい説明は@delphinusさんの[iTerm2 にステータスバーが付いた](https://qiita.com/delphinus/items/1748937aefeb241bdcee)に詳しく載っているで省きますがハマったポイントだけ書きたいと思います。

## ハマったポイント
下記の箇所にどハマりしました。
もともと@delphinusさんの作成したbattery.pyが既にcoroというdeamonの状態で動いており，何も知らずに同じ名前で動かそうとするとエラーがでで動きませんでした。

```
@iterm2.StatusBarRPC 
  async def coro(knobs): 
```
こういう風に変更してあげると動く様になりました。

```
@iterm2.StatusBarRPC 
  async def wifi_status(knobs): 
```

普通に考えると同じ名前のdeamonはエラーになるよなって思います。

## 最後に
バタバタ作成したので改善の余地はたくさんあると思いますが，1日で簡単に作れたのでまた他のものを作成したいと思います。
みなさんも挑戦してみてください！！！
GR-ADZUKIでKXSC7-2050を使おう

GR-ADZUKIは、標準でKXSC7-2050を使用したAE-KXSC7-2050を使用出来るようになっています。

AE-KXSC7-2050のピンヘッダーをはんだ付けしましょう。
GR-ADZUKIのピンソケットにピンヘッダーを取り付けて状態でAE-KXSC7-2050の基板を置いた状態ではんだ付けします

![GR-ADZUKI-GYRO-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5e285159-53df-e289-e8ee-19d441284286.jpeg)
![GR-ADZUKI-GYRO-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dd4c5eef-3ffd-05e7-6eb5-5d82673ee3d6.jpeg)

コードは取り出すだけです。

```
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);//シリアルポートを初期化  
}

void loop() {
  // put your main code here, to run repeatedly: 
    float x = (analogRead(A3));//A3ポートはX軸
    float y = (analogRead(A4));//A4ポートはY軸
    float z = (analogRead(A5));//A5ポートはZ軸
    
    Serial.print("X: ");
    Serial.print(x);
    Serial.print("Y: ");
    Serial.print(y);
    Serial.print("Z: ");
    Serial.print(z);    
 　 Serial.print("\n");
    delay(100);
}
```

後で気づいたのですが、IDE for GRの中にサンプルがありましたw
J-Linkの電源ピン問題

今回nrf52840を使用したデバイス開発を行いました。
しかし、手元に、デバッガー（ICE)が存在しませんでした。
ST-LinkV2やSTM32 NucleoをJ-LinkOB化することが可能なのですが、nRF52840は使用不可でした。
正確には1.27ピッチのものはありましたが、2.54mmピッチのものが存在せず、改めて購入しました。
いざ、接続しようとしたところで、問題が発覚し、把握できたのでここに公開します。

問題とは、3.3vの電力供給が存在しないということです。
AE-LPC11U35-MBなどについている1.27ピッチのDapLinkのコネクタは3.3v出力が存在します。
しかし、J-Linkには存在しないのです。

以下は、その資料です。
![J-Link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c8851dfe-5b2f-ac7d-57b4-4c6c27d6b338.jpeg)
（C)https://www.embitek.co.jp/technote/jlink/EUM_JP_JLink-Adapter.pdf

5Vにレギュレーターをかますこと、そして、100Kのプルアップを入れることを推奨されています

・AE-LPC11U35のSWDピンアサイン
![AE-LPC11U35-JLink.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/087f4c1a-6a07-be3b-6458-25f5c978e49c.jpeg)

SIliconLabsのMini Simplicity Connectorは、なぜ専用コネクターなんだろうと思って、改めて見てみると
・Mini Simplicity Connector
https://www.silabs.com/documents/public/application-notes/an958-mcu-stk-wstk-guide-jp.pdf
![mini-connector.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dcf5df2f-b2c6-a1c6-44ff-cce879f08386.jpeg)

比較します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9ecf9a6f-a26a-2582-c416-6c02f3bb0820.png)

![pca10056-JLink.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/17e21c4d-a6e3-4c40-5d21-3354739d9084.jpeg)
pca10056　nrf52840DKのJ-Linkの回路を見てみますと、J-LinkなのにVDDが出力できるようになっています。
もう一つの出力にはその機能がありません。DetectをGndでやるところがすごいですよね。
これだと、VDDを別からとって、GNDをつなげることも可能ですよね。

普通の解決策は、レギュレーターを素直に入れるしかないでしょう。
ということで、入れてみました。
![J-Link-adapter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c2a76a36-6974-5977-c0de-68e22879bf11.jpeg)

ちなみに、Psoc5のCY8CKIT-059　Psoc5 ProtoTypeingKitはPsoc4のJtagとしても使用可能です
が・・こっちも5Vなのでレギュレーターで3.3vに降圧する必要があります。
降圧ボードは、Aliexpress等で5枚で2ドル程度で購入可能です

やはり基準は５Vで必要な電圧は自分で作れということなんでしょうね・・・
現在時刻からの時刻差分の求め方

# 環境
- Ruby 2.6.1
- Ruby on Rails 5.2.3

# 内容
Railsでgenerateしたモデルが持つcreated_atやupdated_atが、
今から何分、何時間前なのか出したい時等、現在時刻からの時刻差分を求めたいことがあると思う。
その場合の方法について。

# 求め方
Time.zone.now - created_at(もしくはupdated_at)で差分（秒）を求められる。
しかし、このままだと小数点以下（ミリ秒）まで含まれるため、
状況に応じて切り捨てるなり、四捨五入するなりしておく必要がある。
分、時間、日を求めたい場合は、ここから計算してあげれば良い。
以下は切り捨ての場合。

```
(Time.zone.now - created_at).floor / 60     # 分
(Time.zone.now - created_at).floor / 3600   # 時間
(Time.zone.now - created_at).floor / 14400  # 日
```
とすることで求めることが出来る。
IKEAの在庫情報をRubyで取り出す

#概要
IKEA在庫管理のURLから取得したXMLを処理して情報を抽出します。簡単。


#背景
最近、巷で人気(多分今も)の[IKEAのサメ](https://www.ikea.com/jp/ja/catalog/products/10373589/)が欲しかったが、在庫はいつも品切れ・・・今日も在庫確認の為にサイトをポチポチ・・・
ある日手が滑ってたまたまChromeの検証を押してしまいたまたまNetworkを見てたらIKEAの製品の在庫数がわかるURLを発見したので、IKEAのサメの在庫監視サイトを作りました。題して[IKEAの在庫わかる君](https://ikea-stock-finder.herokuapp.com/)

#作ってみる

###事前準備
nokogiriをインストール(rails環境なら既にある)
`$ gem install nokogiri`

###とりあえずサンプル
ここの[IKEAのサメの在庫情報](https://www.ikea.com/jp/ja/iows/catalog/availability/10373589)にアクセスするとこんな感じでXMLが得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304952/a88a15fc-e7f3-e84c-83cd-5e0f8727d46c.png)

CLIで在庫情報や次回入荷日(再補充日？)を抽出します

```ikea.rb
require 'nokogiri'
require 'open-uri'
# url末尾の8桁の数字は商品番号
url = 'https://www.ikea.com/jp/ja/iows/catalog/availability/10373589'

xml = Nokogiri::XML(open(url).read)

STORE_NAME = { "447" => "船橋", "448" => "港北", "887" => "新三郷",
               "486" => "神戸", "392" => "仙台", "509" => "長久手",
               "496" => "鶴浜", "189" => "福岡新宮", "359" => "立川" }

# XMLのルートのノードから探して一致したNodeSetオブジェクトを返す→9店舗分のlocalStoreを取得
item_nodes = xml.xpath('//availability/localStore')

item_nodes.each do |item|
  # attribute('xx')でlocalStoreのxx属性の属性値を取得
  store_code = item.attribute('buCode').text
  puts "店名:#{STORE_NAME[store_code]}(#{store_code})"
  # localStore以下のstockノードを探してNodeSetで返す
  item.xpath('stock').each do |store|
    puts '在庫数:' + store.xpath('availableStock').text
    if store.xpath('restockDate').any?
      puts '次回入荷日:' + store.xpath('restockDate').text
    else
      puts '次回入荷日:不明'
    end
  end
  puts "-------------------------"
end
```

動かしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304952/bb7f2523-a96e-2345-b9d6-03a30083cdd7.png)

できた！！

#簡単に解説
`open(url).read`でurlのレスポンスのボディ部分を文字列で取得

`Nokogiri::XML(open(url).read)`でボディ部分の文字列から
`Nokogiri::XML::Document`オブジェクトを生成

`xml.xpath('//availability/localStore')`で`Nokogiri::XML::NodeSet`という配列のようなオブジェクトを取得。これで処理したい対象のデータ<localStore>達を抽出できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304952/512026fc-e3c5-b5fe-4214-52a21042d44e.png)

また、xpathメソッドの使い方は、今回のように`xpath('//hoge')`で大元からデータを探し、NodeSetオブジェクトに対しさらに`xpath('piyo')`をすると、一段下のpiyo要素が得られる

NodeSetの中には`Nokogiri::XML::Element`オブジェクトが格納されている

```rb
> item_nodes[1].class
=> Nokogiri::XML::Element
```

Elementオブジェクトに対して`attribute('buCode')`で属性名と属性が格納されたAttrオブジェクトを取得し、Attrにtextメソッドを呼び出すと属性値が取り出せる

```rb
> item_nodes[1].attribute('buCode')
=> #(Attr:0x3663e58 { name = "buCode", value = "448" })
> item_nodes[1].attribute('buCode').text
=> "448" #店舗コード
```

同様に、Elementにtextメソッドを呼び出すとタグ内の値を呼び出せる

```rb
> item_nodes[0].xpath('stock')[0].xpath('availableStock').text
=> "73" #執筆時のIKEA船橋店のサメの在庫数
```

#終わりに
後でQiitaで検索してみるとIKEAの在庫確認している記事がけっこう見つかりました。考えることは一緒ですね。
~~そして自分は未だにIKEAのサメをお迎えできていません。。。~~
###### 10/28日追記
この前IKEAのサメちゃんをおうちに迎え入れることができました🦈🎉

#参考サイト
https://dev.classmethod.jp/tool/xmlnokogiri-xml-parse/
http://d.hatena.ne.jp/fre_oik/20110609/1307627018
【Ruby on Rails】 form_forのviewからDBに保存までの流れについて

#目次

+ viewからcontrollder→DBまで保存の流れ(require)
+ 2つのハッシュを結合する(mergeメソッド)

###viewからcontrollder→DBまで保存の流れ
今回は商品レビューをDBに保存するとします。

```:html.erb
<%= form_for(@review) do |f| %>
 <%= f.text_field :title %>
 <%= f.text_area :detail %>
<% end %>
```
コンソールでPryをおこなって確認する

```:ターミナル
params
{ review: { title: "入力された名前", detail: "入力された詳細" } }
```

キーはform_forの引数にあるインスタンスの モデル名(review) になり、バリューはカラム名と入力された値のハッシュです。
paramsからキーがreviewのバリューを取得し、createアクションの引数に渡せるようにストロングパラメーターを定義するには以下のようにします。

```
params
{ review: { review: { title: "入力された名前", detail: "入力された詳細" }
params.require(:review)
=> { review: { title: "入力された名前", detail: "入力された詳細" }
```
※form_tagを使用して入力情報を保存した場合のストロングパラメーターとしてparams.permit(:キー名)という記述をしますが、params.require(:モデル名).permit(:カラム名)と記述します。

```:controller.rb
#ストロングパラメータ
def create_params
   #params.require(:テーブル名).permit(:カラム名, :カラム名)
    params.require(:review).permit(:title, :detail)
end
```
###2つのハッシュを結合する(mergeメソッド)
前回はレビューを保存する流れをご説明しました。レビューは商品などに紐づいていることがほとんどなのでここでは、商品テーブル(products)のidをレビューテーブルに保存する流れについて記述します。

```:html.erb
<%= form_for [@product, @review] do |f| %>
 <%= f.text_field :title %>
 <%= f.text_area :detail %>
<% end %>
```
どのレビューがどの商品の(product_id)に紐づいているのかを明確にするためreviewsテーブルにproductsテーブルから取得したproduct_idも保存します。

```:controller
def new
    @product = Product.find(params[:product_id])
    @review = Review.new
end

def create
    Review.create(create_params)
end

#ストロングパラメータ
private
def create_params
    params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id])
end
```
###mergeメソッド
mergeメソッドは2つのハッシュを統合する時に使うメソッドです。

```
hash1 = {カラム1: "内容"}
hash2 = {カラム2: "内容2", カラム3: "内容3"}
hash1.merge(hash2)
#=> {:カラム1=>"内容", :カラム2=>"内容2", :カラム3=>"内容3"}
```
これでreviewsテーブルにレビューと商品idが同じレコードに保存されるようになります。
言語を問わずにお勧めしたい技術書【GW連投企画】

# 技術書

## [「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか ](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=web&qid=1557000140&s=gateway&sr=8-1)
挑発的な副題のせいで暫く購入を躊躇っていた事を後悔したくらい素晴らしい本です。
Webってそもそもなんだ？インターネット、プログラム、そしてパソコン自体の仕組みを
技術が発展してきた時系列に沿って教えてくれます。

Ruby On Railsや人工知能等をやる前に一読すべきと思っています。

## [リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1HW82A5TA7FMV&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89&qid=1557000215&s=gateway&sprefix=ri-daburu%2Caps%2C254&sr=8-1)
一人で書いてる分だと問題無いのですが複数人数で書くと汚く成りがちなコードをどう管理してくかを教えてくれます。

早期リターンや容易にGet○○○○というメソッド名をつけてはいけない等、現場では必須のテクニックが詰まってます。

この本を読んで意識して綺麗なコードを書くのはマナーのレベルかもしれないです。
S3の静的ウェブサイトホスティングでハマったところ

# 説明

S3の静的ウェブサイトホスティング、[AWS公式のチュートリアル](https://docs.aws.amazon.com/en_us/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html
)を参考にして設定してみたんですが、ハマったところがいくつかあり、なおかつネット上で解決策を見つけられなかったので、ハマりどころとその解決策を共有します。
同じところでハマった方の助けになればと思います。

# ハマりどころ
## ハマりどころ1：S3のバケットをパブリックに公開するバケットポリシーを作成できない
### 現象

下記のスクリーンショットの通り、バケットポリシーが作成できない。

<img width="742" alt="バケットポリシー作成時にAccess Denied" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181176/284adb77-b868-7ffa-96fa-b244f748269b.png">

### 原因と解決策

原因は、「S3ブロックパブリックアクセス」でパブリックなバケットポリシーの作成を制限していたこと。問題の箇所について[AWSの開発者ガイド](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/access-control-block-public-access.html)から引用すると・・・

> BlockPublicPolicy
> このオプションを TRUE 設定すると、指定されたバケットポリシーでパブリックアクセスが許可されている場合、Amazon S3 は PUT Bucket ポリシーへの呼び出しを拒否します。

と言うことで、以下のスクリーンショットの通り、「Block new public bucket policies」をFalseに設定することで、パブリックなバケットポリシーが作成できました。

<img width="701" alt="BlockPublicPolicyの設定箇所.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181176/9055d975-159a-e26f-39f9-2b18b47b94e8.png">

## ハマりどころ2：S3のバケットをパブリックに公開したつもりなのに403 Forbidden
### 現象

バケットポリシーの作成、S3の静的ウェブサイトホスティングの設定を済ませた上でエンドポイントにアクセスしたところ、アクセスが拒否された。

<img width="714" alt="403 Forbidden" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181176/61bbc93f-d2a8-9575-9c51-3f46ba858bf0.png">

### 原因と解決策

ハマりどころ1と同様、S3ブロックパブリックアクセスが原因だった。
また開発者ガイドから引用すると・・・

> RestrictPublicBuckets
> このオプションを TRUE に設定すると、パブリックポリシーを持つバケットへのアクセスは、AWS サービスとバケット所有者のアカウント内の承認されたユーザーのみに制限されます。

今度は「Block public and cross-account access if bucket has public policies」をFalseに設定することで、無事ページが閲覧できるようになった。

<img width="701" alt="RestrictPublicBucketsの設定箇所.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181176/0f6a36b2-3bb5-2f30-70d1-c2ede54d2620.png">

<img width="701" alt="サイトにアクセスできたところ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181176/264e136f-db82-5b41-92f1-d996a4769e7d.png">

## ハマりどころ3：Route53でレコードを作成すると404 Not Found
### 現象

ハマりどころ1, 2を乗り越え、S3のエンドポイントへの直アクセスではページが閲覧できるようになったが、ドメイン名を指定してアクセスすると404 Not Foundになる、と言う現象。

### 原因と解決策

原因はS3のバケット名がドメインと異なったこと。今回の場合、

バケット：example-qiita
ドメイン：example-qiita.com

のように別の名前にしていたため、404のエラーになってしまっていた。

どうやらRoute53はドメイン名のままS3にルーティングするみたいなので、バケットを「example-qiita.com」の名前で作り直すことで、無事サイトが公開できた。

# 感想

「書いてある通りやっても上手く行かない」ことって多いですね！
（英語のチュートリアルを読みながらやったので、書いてある通りできてないかも）
Herokuでphpをデプロイしようとしたときにfailed to pushされた話

## はじめに
同じことをやって時間を消費したりしないようにメモ。
届け、ろくに公式を読んでない人へ

ここの手順通りやったぞ！　という方は本記事の対象外です。
(https://devcenter.heroku.com/articles/getting-started-with-php)

## オチ
わけのわからんググり方をする前に、ちゃんと公式のdocsを読もう！

## やりたかったこと
とにかく簡易APIをデプロイしたい

```.php
<?php
  if ($_GET('golden') === 'tanigaki') {
    echo 'ムッワァァァ';
  } else {
    echo 'kamuy';
  }
?> 
```

## 起きた問題
`heroku create`

したあとに

`git push heroku master`

したら、

```.sh
! [ remote/reject ] master -> master (pre-receive hook declined)
error : failed to push some refs to 'https://git.heroku.com/アプリ名.git'
```

と表示されてpushできない

## 対処方法
これはphpをデプロイしようとしているのに composer が入ってないことが原因。
とりあえず空でもいいから、composer.json を作ってつっこむべし。
で、 heroku君には `composer使うで！` って教えてあげよう

```.sh
$ echo '{}' > composer.json
$ git add composer.json
$ git commit -m "add composer.json for PHP app detection"
$ heroku buildpacks:set heroku/php
```

ここまでできたら、満を持して
`git push heroku master`

してください。
【Ruby on Rails】 ルーティングのネスト (入れ子)

####
```
TechReviewSite::Application.routes.draw do
  resources :products, only: :show do
    resources :reviews, only: [:new, :create]
    collection do
      get 'search'
    end
  end
  root 'products#index'

end
```

```
$ rake routes
```

```
product_reviews POST /products/:product_id/reviews(.:format)                                                  reviews#create
       new_product_review GET  /products/:product_id/reviews/new(.:format)                                              reviews#new
```
このように入れ子になっていることがわかります。
Eloqunetでmongodbを使う 


# 概要
mongodbをDBに使うケースはままあると思います。
LaravelやLumen等と組み合わせて使うのであればEloquentという仕組みで
データの書き込みや取得ができますが、RDBMSのみ。。
そこでmongodbでEqoquentを使えるライブラリを使って、行きたいと思います。後々、
APIサーバーにのっけて行きたいですね。

# 環境構築
## php7のインストール
- php7.3、php7.3-mbstring、php-7.3-pdo

```
yum install --enablerepo=remi,remi-php73 php php-mbstring php-pdo
```

## mongodbのインストール
- mongod


```/etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
```
を作成し、

```
sudo yum install -y mongodb-org
```
でインストール

- php73-php-pecl-mongo
- php.iniに上記を追記

## laravel-mongodbのインストール
- yumでzip、unzip
- composer
- composerでlaravel-mongodbを導入

# 動作手順
## CapsuleManagerで接続する
lavave-mongodbのInstallationを読みながらCapsule manager単体で動作させます。

```db-if.php
<?php

require_once './vendor/autoload.php';
use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => 'mongodb',
    'host'      => 'localhost',
    'port'      => 27017,
    'database'  => 'db',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent();

$capsule->getDatabaseManager()->extend('mongodb', function($config, $name)
{
    $config['name'] = $name;

    return new Jenssegers\Mongodb\Connection($config);
});
```

eqloqunetを使うユーザークラス

```user.php
<?php
require_once './vendor/autoload.php';

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class User extends Eloquent {

    protected $collection = 'users_collection';

}
```
で、これらを使って書き込みをします。

```write-test.php
<?php

require_once 'db-if.php';
require_once 'user.php';

$user = new User;
$user->name = 'John';
$user->save();

```

モデル定義とサンプルコードはチュートリアルそのままですが、これで書き込みができるはず。
確認してみましょう。

```shell

# mongo
> show dbs;
admin   0.000GB
config  0.000GB
db      0.000GB
local   0.000GB
> use db;
switched to db db
> show collections;
users_collection
> db.users_collection.find();
{ "_id" : ObjectId("5ccde0599dc6d668860b1292"), "name" : "John", "updated_at" : ISODate("2019-05-04T18:56:25Z"), "created_at" : ISODate("2019-05-04T18:56:25Z") }
```

できてますね。
では、次はデータをphpから取得します。

``` read-test.php
<?php

require_once 'mongoif.php';
require_once 'user.php';

$users = User::all();
foreach($users as $user) {
    var_dump($user->name);
}
```

実行しましょう。

```shell

# php read-test.php
string(4) "John"
```

無事に取得できました。

NoSQLであるmongodbをEloquentで扱えればAPIサーバーを作成するのも大分楽になるのでは、と思います。
C++で気楽に円周率をつかう

# 精度を深く求めずにC++で気楽に円周率をつかう。

C++
C++11,C++14,C++17
円周率


## 直接入力する。
例

```
const double PI=3.0;
const double PI=3.14;
const double PI=3.14159;
const double PI=3.141592653589;
const double PI=3.141592653589793; #NASA 15桁
const double PI=3.1415926535897932;
const double PI=3.14159265358979323846;
const double PI=3.1415926535897932384626433832795028841971; #宇宙 40桁

```

自分の好きな桁数を設定します。
定数は大文字にする、constをつける、計算しないので一番早いと思います。

NASA（アメリカ航空宇宙局）が軌道計算に使う桁数は15桁です。
これを地球の半径で計算してみると、円周の誤差は分子一個分の差程度に落ち着きます。

気をつけるべき点は「値が正確か」ではなく「円周率の桁数を減らしたことで、どれだけの誤差が生じたか」です。
宇宙全体は半径にして約465億光年となります、円周の誤差が最も単純な原子である水素原子の直径0.1ナノメートルほどの誤差しか生じないよう正確に計算するにはどれだけの円周率の桁を使わないといけないかを逆算すると39～40桁になります。

## #defineを使う

```
# define PI 3.14159265359

```

軽さと使いやすさを兼ねる

## 計算して出す

```
# include <bits/stdc++.h>
const double PI = acos(-1);

```

その他の計算方法もあり

## ライブラリから使う

```
# include <bits/stdc++.h>
M_PI

```

（これが一番安心）

## 数値を固定小数点形式で表示する

倍精度実数型変数に入っている数値を、
小数点以下の桁数を指定して
固定小数点形式で表示するには，
fixedとsetprecision()を使う。

```
# include <iostream>
# include <iomanip>
using namespace std;
int main(){
  cout << fixed << setprecision(5);

  double a=1.23;
  cout << a << endl;
}

```

> 1.23000

## おまけ 1

acosについて
// C++11 から追加
acosのdouble型
`double acos(Integral x);`

// C++17 から追加
acosf
acosのfloat型
`float acosf(float x);`

acosl
acosのlong double型
`long double acosl(long double x);`


acos(-1)をループ内に入れるなどをした場合の計算について。
コンパイル時に計算されて定数化されていると思うので速度は同じかもしれない。



## おまけ 2

表示にprintfを使う

```
printf("%.5f", x);
```

小数点以下5桁を表示する。



## おまけ 3

表示にfixed、setprecisionをつかう。
小数点以下5桁を表示する。
`cout << fixed << setprecision(5);`
これはmainの直下に置いておくことで関数内全体に影響される。
変えたい場合はその直前に置く。

```
# include <iomanip>
# include <iostream>
using namespace std;
int main() {
    cout << fixed << setprecision(5);

    double a = 1.23;
    cout << a << endl;
    cout << a << endl;
    cout << a << endl;
    cout << fixed << setprecision(2);
    cout << a << endl;
}

```

>1.23000
1.23000
1.23000
1.23

良いC++ライフを！

# 参考

[NASAでは円周率を何桁まで使っているのか？ - GIGAZINE](https://gigazine.net/news/20201004-nasa-pi-calculation/)
Kotlinでループ処理

## KotlinのVersion
1.3.31

## forループ
for (変数 in イテレータ)の書式で記述する。イテレータにはIteratorインターフェースを実装したオブジェクトを指定する。このあたりはJava等でも同じ。

```Hello.kt
fun main() {

    // ふつーのループ
    for (i in 1..100) println(i)

    // 上記はJavaっぽくこうも書ける
    for (i in 1..100) {
        println(i)
    }

    // 配列を使った例
    val array = arrayOf("aa", "bb", "cc", "dd", "ee")
    for (i in array) println(i)

    // downToを使えばループ終端（ここでは0）まで減らしながらループを回せる
    for (i in 10 downTo 0 step 1) println(i)

    // Mapもこんな形でループを回せる（mapOfはMapインスタンスを生成）
    var map = mapOf("1" to "Tanaka", "2" to "sasaki")
    for ((k, v) in map) println("$k : $v")
}
```

## whileループ
もちろんwhile、do～whileも可能。

```Hello.kt
fun main() {

    var i = 0
    while (i != 3) {
        println(i)
        i += 1
    }

    do {
        println(i)
        i -= 1
    } while (i != 0)
}
```

## 高階関数を用いたループ
高階関数（repeatやforeach）を用いたループも記述できる。

```Hello.kt
fun main() {

    // repeat関数は、ループ回数を指定するだけでその回数分ループしてくれる。繰り返し回数はitで参照ができる。
    repeat(10) {
        println(it)
    }

    // もちろんこういった書き方も可能
    val array = arrayOf(1, 2, 3, 4, 5)
    repeat(array.size) {
        println(it)
    }

    // 配列やコレクションのループにはforeach関数が利用できる。。繰り返し対象の要素はitで参照ができる。
    array.forEach {
        println(it)
    }
}
```
[Swift] iOSのBackground Fetchとアプリのアイコンの変更を試す

iOS 10.3からアプリのアイコンを動的に変更できるようになったらしい（WatchやCalenderのように）。そこで、アプリを起動せず、アイコンだけで状態を表すをアプリを作りたい。一つの案はBacground Fetch機能と組み合わせ、アプリのアイコンを変更することだと思い、調べた結果をまとめた。

結論からいうと、できなかった！

## 実行環境
- macOS Mojave
- Swift 5
- iOS 12.2


## 簡単なアプリとBackground Fetchサポートを設定する
まず、Xcode使い、簡単アプリのプロジェクトを作成する。このアプリのデフォルトのアイコンが↑の画像で、Alternateボタンを押せば、アプリのアイコンが↓になる。

次に、プロジェクトの設定でBackground Fetchのケイパビリティを有効にする。
![スクリーンショット 2019-05-05 2.22.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/dd7ad815-c459-f495-731b-c22e7893a2e8.png)

## Background Fetchの動作
動的にアイコンを変えるために、参考資料のように２つの画像を準備し、Info.plistを編集する

<img width="873" alt="スクリーンショット 2019-05-05 2.52.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/862b8214-acc2-f5ff-743f-abef0fc78620.png">

AppDelegate.swift を以下のようにBackground Fetchを実装する。その内容はAlternateボタンが押された時と同じ内容である。

```swift:AppDelegate.swift

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        application.setMinimumBackgroundFetchInterval(120)

        return true
    }
    func application(_ application: UIApplication,
                     performFetchWithCompletionHandler completionHandler:
        @escaping (UIBackgroundFetchResult) -> Void) {
        
        print("Background fetch activated")
        // change icon
        application.setAlternateIconName("AlternateIcon"){ error in
            if let error = error {
                print("Error!")
                print("Error:" + error.localizedDescription)
            } else {
                print("Done!")
            }
        }
        completionHandler(.noData)
    }
```

## 実行した結果
### アプリがフォアグランドの場合
アプリが実行する状態で、DebugからBackground Fetchを開始する
![スクリーンショット 2019-05-05 3.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/ed382d8a-ce13-9f92-1327-d25af5408093.png)

アプリおよびログからアイコンが正しく変更されたことが確認できた
![スクリーンショット 2019-05-05 3.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/f43f28d6-d76b-ed88-a231-56378ed2fc15.png)


### アプリがバックグランドの場合（やりたいこと！）
次に、アプリがバックグランドの状態で、同じくBackground Fetchを開始する。今回、アプリのアイコンが変わらず、それに、　`The operation was cancelled`のエラーが出力された。
![スクリーンショット 2019-05-05 3.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/f02cdefb-11ea-612f-104f-6cb21fba05ac.png)

## まとめ
Background Fetchの機能および動的にアプリのアイコンを組み合わせして試したが、残念ながらうまく動かなかった。どうやらWatchやCalendarのようにできず、OSから禁止されたように見える。今後、やりたいことは他の方法で探してみたいと思う。

---
参考する情報
- [動的にアプリのアイコンを変更する](
https://medium.com/ios-os-x-development/dynamically-change-the-app-icon-7d4bece820d2)
- [Appleからの情報](https://developer.apple.com/documentation/uikit/core_app/managing_your_app_s_life_cycle/preparing_your_app_to_run_in_the_background/updating_your_app_with_background_app_refresh)
iflipbの設定を改善：カレントバッファと同じメジャーモードのバッファのみを切り替え対象とする

バッファ切り替えのためのパッケージ、iflipbの記事は色々見つかる。

- [詳説！Alt+Tab感覚で賢くバッファをワンタッチで切り替える](http://emacs.rubikitch.com/iflipb/)
- [Emacs:タブを使わない究極のバッファー移動] (https://qiita.com/minoruGH/items/aa96e92c1434f87940d6)

特定のバッファを切り替え対象から除外する手段は本パッケージにいくつか用意されている。しかしながら、カレントバッファと同じメジャーモードを持つバッファたちに切り替え対象を限定する手段は存在しなかったので、設定を書いたというわけだ。こんな感じだ：

```elisp
(require 'iflipb)
(defun my-iflipb-buffer-list ()
  "Returns list of buffers whose major-mode is the same as current buffer's one."
  (let ((cur-buf-list (buffer-list (selected-frame)))
        (same-major-mode-buflist nil)
        (currbuf-major-mode
         (buffer-local-value 'major-mode (current-buffer))))
     (dolist (buffer cur-buf-list)
      (if (eq (buffer-local-value 'major-mode buffer) currbuf-major-mode)
          (add-to-list 'same-major-mode-buflist buffer)))
     (nreverse same-major-mode-buflist)))
(setq iflipb-buffer-list-function 'my-iflipb-buffer-list)
```
その他は以下の通り。

```elisp
(setq iflipb-wrap-around t)
(setq iflipb-ignore-buffers (list "^[*]"))
(global-set-key (kbd "C-<tab>") 'iflipb-next-buffer)
(global-set-key (kbd "C-S-<tab>") 'iflipb-previous-buffer)
```

キーバインドについては以下も押しやすさの観点からは悪くない選択だと思われる：

```elisp
(global-set-key (kbd "M-]") 'iflipb-next-buffer)
(global-set-key (kbd "M-[") 'iflipb-previous-buffer)
```

追記：
`iflipb-ignore-buffers`で特定のバッファ名を除外しつつ、特定のメジャーモードではそのバッファ名の除外を解除したい場合が存在する。例えば、`eww-mode`ではバッファ名は**\*eww\***や**\*eww\*<2>**のように「アスタリスクから始まるバッファ名」であるから、上記の`iflipb-ignore-buffers`の除外パターン**"^[*]"**にマッチしてしまう。

そこで、特定のメジャーモードではその制約を外すよう、変数`iflipb-except-major-mode`を用意したうえで、キーバインドを以下のように設定する。設定では`eww-mode`のみになっているが、それ以外のメジャーモードもリストに加えることができる。

```elisp
(defvar iflipb-except-major-mode (list 'eww-mode)
  "A list of major modes that ignore even the exclusion
buffers specified by iflipb-ignore-buffers.")

(global-set-key (kbd "C-<tab>")
                #'(lambda ()
                    (interactive)
                    (let ((currbuf-major-mode
                           (buffer-local-value 'major-mode (current-buffer))))
                      (if (memq currbuf-major-mode iflipb-except-major-mode)
                          (iflipb-next-buffer 4)
                        (iflipb-next-buffer 1)))))
```
多対多の関係の設定方法

##Model##

###モデル作成###

多対多の関係を表すために中間テーブルを設置する

```
$ rails g model Relationship user:references follow:references
```

- フォローする側を`:user_id`
- フォローされる側を`:follow_id`(中身は**user_id**と同じ)

###マイグレーションファイル修正###

```rb
def change
  create_table :relationships do |t|
    t.references :user, foreign_key: true
    t.references :follow, foreign_key: {to_table: :users }
    t.timestamp
    t.index [:user_id, :follow_id], unique: true
  end
end
```

- `{ to_table: :users }` によってusersテーブル参照する

- `unique: true`とすることで重複不可とする

```
$ rails db:migrate
```

##Relation Model修正##

```rb
class Relationship < ApplicationRecord
  belongs_to :user
  belongs_to :follow, class_name: "User"
end 
```

- `class_name: "User"`を追加することでUserモデルを参照する


##User Model追加##

```rb
class User < ApplicationRecord
  has_many :relationships
  has_many :followings, through: :relationships, source: :follow
 
  has_many :reverses_of_relationship, :class_name: "Relationship", foreign_key: "follow_id"
  has_many :followers, through: :reverses_of_relationship, source: :user
end

```


`has_many :relationships` => 一対多の関係を指定
`has_many :followings` => 新たな関係を命名
`through: relationships` => relationshipsを中間テーブルとして指定
`source: :follow` => 中間テーブルのどのカラムを参照するか指定
DHH流のルーティングに挑戦（初心者向け）

#　DHH流のルーティングに変更する
師匠にDHH流のルーティングを勧められたので、挑戦したら苦労したのでメモとして残します。


## やりたいこと
Taskモデルの中に評価（evaluation）を書き込みたい。
今までのやり方は Tasksコントローラーの中に evalutaionアクションを追加する方法でしたが、「コントローラーのアクションはCRUDの限るべし」という DHH流のルーティングに変更してみました。

## 今までのやり方（アクションを増やしていく）
このやり方は間違いではないですが、アクションが増えて見通しが悪くなるので好ましくない。DHHが勧める方法に書き換えてみましょう。
### app/controllers/tasks_controller.rb

```
class TasksController < ApplicationController
  def new
  end

  def create
  end

  def update
  end

  def evaluation
  end
end

```

## DHH流のルーティング
### config/routes.rb

```
resources :tasks do
  resource :evaluations, only: [:edit], module: 'tasks'
end
```

module: 'tasks' を記載することで、以下の RESTful なルーティングを得ることができます。

```
edit_task_evaluations GET    /tasks/:task_id/evaluations/edit(.:format)                                               tasks/evaluations#edit
```

### app/controllers/tasks/evaluations_controller.rb
コントローラーは tasksディレクトリの中に作成します（ここで詰まっていた）。クラス名に Tasks:: が追加されている点にも注意。

```
class Tasks::EvaluationsController < ApplicationController
  def edit
    @task_id = params[:task_id]
    @task = Task.find(@task_id)
  end

  def update

  end
end
```

### app/views/tasks/edit.html.erb
同じくビューも tasksディレクトリに入れてやります。（BootStrapを入れている）

```
<div class="row">
  <div class="col-md-6 offset-md-3">
    <h1>評価</h1>
    <%= "タスク番号#{@task_id}" %>
  </div>
</div>
```

以上でDHH流のルーティングは完成です。

### 呼び出し側
評価画面へのリンクはこのようになります。

```
@task = Task.find(params[:id])
redirect_to edit_task_evaluations_path(@task)
```

## 課題
苦労しましたが、DHH流のルーティングで見通しの良いプログラムを書くことができました。これからはなるべくこちらの書き方で統一していこうと思います。

課題としては、簡単なアクションも全て DHH流にするべきかの判定です。
例えば Taskモデルの canceled-> true にするだけのアクションまで別に分ける必要があるのでしょうか？

```
  def cancel
    @task = Task.find(params[:task_id])
    @task.update_attributes(canceled: true)
    redirect_to root_path, flash: { success: "タスクがキャンセルされました。" }
  end
```


間違っているところがあればコメントください。よろしくお願いいたします。

## 参考
ありがとうございます。
[DHH流ルーティングの導入しようとした際にハマったこと](https://qiita.com/hypermkt/items/ad1d2854717f4c25a69d)
[DHH流のルーティングで得られるメリットと、取り入れる上でのポイント](https://stargzr.net/news/9868)
Javacコマンドについて

#Javaのコンパイラコマンドであるjavacコマンドについて
普段何気なく使っているこのコマンド。時々、ファイルエンコーディングのところとか、パッケージを指定したりする場合に単純にコンパイルできない時とかあるので、備忘としてまとめる。

##実行環境について
これから記載していく内容は以下の環境で実行する。
OS：macOS Mojave（バージョン 10.14.4）
javacコマンド：バージョン 1.8.0_151

##javacコマンドの使い方 実行例1
まずは、素直な使い方についてで、以下のようなJavaで書いたサンプルソースをコンパイルする場合について。

```java:Sample.java
public class Sample {
    public static void main(String[] args) {
        System.out.println("Hello, world!!");
    }
}
```

以下の通り、javacコマンドの引数に上記ファイルを指定して実行するだけ。特にエラーがなく正常にコンパイルができたら、プロンプトが表示される。

```shell:実行例1
$ javac Sample.java
```

因みに、Javaの文法が間違っていたりすると、以下のようなエラーになる（main関数の戻り値のvoid綴り間違えの場合)。
意外とメッセージが親切で、ちゃんと読めばだいたい何でエラーになっているかわかると思う。

```shell:実行例1(コンパイルエラー)
$ javac Sample.java
Sample.java:2: エラー: シンボルを見つけられません
    public static viod main(String[] args) {
                  ^
  シンボル:   クラス viod
  場所: クラス Sample
エラー1個
```

##javacコマンドの使い方 実行例2
次はJavaのコードを書いているソースファイルの文字エンコードと、クライアントの環境のシステムの文字エンコードが異なる場合について。例えば、`Windows`だと、基本的に`SJIS`なので、例えば日本語で`こんにちは`とかをソースに記載したファイルを`UTF-8`で保存してコンパイルするとエラーになってしまう。

エラーの例を示すために事前確認。まずは環境のデフォルト？ファイルエンコーディングを取得する。以下のソースを作成して、コンパイル後に実行する。実行すると、ファイルエンコーディングが標準出力に出力される。今回は`UTF-8`と出力されました。

```java:EncodingCheck.java
public class EncodingCheck {
    public static void main(String[] args) {
        System.out.println(System.getProperty("file.encoding"));
    }
}
```

次に、以下の内容を記載したソースファイルを文字エンコーディング`SJIS`で保存してコンパイルしてみる。これは上記で事前に調べたファイルエンコーディングとは別のものにするために`SJIS`としている。

```java:Sample2.java
public class Sample2 {
    public static void main(String[] args) {
        System.out.println("こんにちは");
    }
}
```

実行結果としては、以下の通り。コンパイルエラーとなった。エラー内容をみると、UTF8では正常に表示できない文字コードが使われていたのでエラーとのこと。この場合は、`javac`コマンドのオプションで文字エンコーディングを指定してやれば良い（今回の場合だと、もちろんファイルをUTF8で保存し直すのでも正常にコンパイルできる）。
（これ、なんで７個もエラーが表示されるのかはわからない。気が向いた時にでも調べたい）

```shell:実行例2（コンパイルエラー）
$ javac Sample2.java
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                            ^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                             ^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                              ^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                               ^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                                 ^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                                  ^
Sample2.java:3: エラー: この文字は、エンコーディングUTF8にマップできません
        System.out.println("����ɂ���");
                                   ^
エラー7個
```

以下の通り、`encoding`オプションの引数に、ファイル文字エンコーディングである`SJIS`を指定して実行してあげればコンパイルエラーにならない（因みに、`encoding`オプションはファイル名の後ろに記載してても問題ない）。

```shell:実行例2
$ javac -encoding sjis Sample2.java
```

##あとがき
まだまだ他にも確認しておきたいことあるが、これ以上記載しても盛りだくさんになりすぎるので一旦終わり。あとで、クラスパスとかソースパスとかも確認しておきたいと思う。
PowerShell で Nodist を使えるようにする


# 前提環境

Windows 10
PowerShell5.1<=
[Nodist](https://github.com/nullivex/nodist)

# Nodist をインストール

[Chocolatey](https://chocolatey.org/)を利用して[Nodist](https://github.com/nullivex/nodist)をインストール

```posh:PowerShell
choco install nodist -y
```

# PowerShellでNodistをアクティブにする

<https://github.com/nullivex/nodist> より引用
>エクスプローラで`bin\nodist.ps1`ファイルを右クリックして、そのメニューエントリの中から「ブロックを解除」を選択する必要があるかもしれません。
>エクスプローラで[プロパティ]を右クリックしてもブロック解除オプションが表示されない場合は、次のPowerShellコマンドを使用してブロック解除を実行することもできます。
>`unblock-file -path "C:\Program Files (x86)\Nodist\bin\nodist.ps1"`
>***注意：コマンド実行後、Powershellを再起動してください。***

再起動とあるが`refreshenv`でも問題なさそう。

※2023年7月追記 : 現在筆者は[Volta](https://volta.sh/)を使っているので、Nodistは使っていません。

**Excelsior!**
TweepyでTwitterの検索, いいね, リツイート

#はじめに
tweepyを用いて, 特定のワードを検索する方法について説明します. そして, その検索結果からいいね, リツイートおよびフォローをする方法についても説明します. 

#検索
api.search()を使うことで検索ができるようです. 
引数qで検索したいワードを, 引数countで検索結果の取得数を指定できます. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

#1ツイートずつループ
for status in api.search(q='肉フェス', count=50):
    #見映えのため区切る
    print('-------------------------------------------')
    #ユーザ名表示
    print('name:' + status.user.name)
    #内容表示
    print(status.text)
```

#いいね
create_favorite()を使うことで, ツイートにいいねすることができます. その際, 引数にいいねしたいツイートのidを渡す必要があるようです. 
特定のキーワードを検索して, 最新50件のツイートにいいねしてみましょう. 
ちなみに, 重複していいねをするとエラーが起こるそうなので, 例外処理にしておくとプログラム途中で止まることが無くなります. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

# 1ツイートずつループ
for status in api.search(q='肉フェス', count=50):
    tweet_id = status.id
    # 例外処理をする
    try:
        # いいね実行
        api.create_favorite(tweet_id)
    except:
        print('error')
```

#リツイート
retweet()を使うことでリツイートができます. いいねと同様に, 引数にリツイートしたいツイートのidを渡す必要があります. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

# 1ツイートずつループ
for status in api.search(q='餃子フェス', count=50):
    tweet_id = status.id
    # 例外処理をする
    try:
        # リツイート実行
        api.retweet(tweet_id)
    except:
        print('error')
```

#フォローする
create_friendship()を使うことでフォローすることができます. 引数にフォローしたいユーザーのidを渡す必要があります. 先程までのツイートのidとは異なるので注意してください. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

# 1ツイートずつループ
for status in api.search(q='野球', count=50):
    # ツイートid
    tweet_id = status.id
    # ユーザid
    user_id = status.user.id
    # 例外処理をする
    try:
        # フォロー実行
        api.create_friendship(user_id)
    except:
        print('error')
```
#関連記事
[TweepyでTwitterに投稿する](https://qiita.com/pontyo4/items/da8ba576c6281d67c0c7)
[TweepyでTwitterのタイムラインを取得する](https://qiita.com/pontyo4/items/a7284330cd79ad48589f)

#参考サイト
[PythonとTwitterAPIを用いて自動いいねやリツイート、フォローを行う](https://qiita.com/starcoffee66/items/cd61fd187d26c245e37d)
VS Image LibraryのXAML形式ファイルを画像として使う

# 概要

[Visual Studio Image Library](https://www.microsoft.com/en-us/download/details.aspx?id=35825)に含まれる、XamlファイルをWPFでImageのSourceとして使うためのメモ。

# 手順

1. リソースに、次の内容を追加する。

    ```XML
    <DrawingImage x:Key="">
        <DrawingImage.Drawing>
            <!-- DrawingGroup -->
        </DrawingImage.Drawing>
    </DrawingImage>
    ```
2. 追加したい画像の、DrawingGroup要素を先のコメントの箇所に丸々コピーする
3. Keyに名前を付ける
4. ImageのSourceで、作成したリソースをStaticResourceとして参照する
Laradockでの環境作成と詰まったこと

# 最初に

暇なのでLaradockで簡単に環境を作ってみたくなったが思ったより手こずった話

## Laradockとは

Dockerを使ったLaravel環境を簡単に作れるもの

## 前提

macで自分はやっています。
gitとdockerが入っていること

## 作業

### 最初

作業用ディレクトリの作成

```
mkdir app
cd app
```

laradockを上で作成したディレクトリの入れる

```
git clone https://github.com/LaraDock/laradock.git
```

laradockの.envの内容を整える

```
cd laradock
cp env-example .env
```

起動させたいコンテナを起動させる（phpmyadminやredisとかお好みで）

```
docker-compose up -d nginx mysql redis beanstalkd phpmyadmin workspace
```

workspaceという作業ようコンテナに入る

```
docker exec -it laradock_workspace_1 bash
```

プロジェクトの作成 (sampleappはプロジェクト名でなんでもいいです。)

```
composer create-project "laravel/laravel=5.5.*" sampleapp
```

一旦ローカルのlaradockに戻りenvの修正

```
- APP_CODE_PATH_HOST=../  
+ APP_CODE_PATH_HOST=../sampleapp
```

これで最低限の環境はできたはず

http://localhost/

とかでlaravelの画面が出ればok

## 詰まったこと

migration使ってテーブル操作などしようとして

```
php artisan migrate
```

と打ったら

```
In Connection.php line 664:

  SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = sampleapp and table_name = migrations)


In Connector.php line 67:

  SQLSTATE[HY000] [2002] No such file or directory
```

結論から言うと下記の記事の通りやったら動いた。

[LaradockのMySQLに接続できなくてはまった話](https://qiita.com/dnrsm/items/4bd078c17bb0d6888647)

### やったこと１

mysql5.7に変更（もしかしたらこれはいらなかったかもしれないw）

イメージ、データ削除

```
docker rmi laradock_mysql
docker rm volume laradock_mysql
rm -rf ~/.lardock/data/mysql
```

laradock/.envのバージョンを`5.7`に変更

```
MYSQL_VERSION=5.7
```

再ビルド

```
$ docker-compose build --no-cache mysql
```

### やったこと２

laravelプロジェクトの.envファイルを下記のようにDB_HOST=mysqlとした（パスワード/userは参考のために適当に記述してるのでお好みで）

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sampleapp
DB_USERNAME=root
DB_PASSWORD=root
```

これらをやったら動いた。

## 感想

簡単に環境構築できるのがlaradockの魅力だと思い触ってみたが想定外のとこで
詰まってしまった。
DB_HOSTがローカルホストのままでdockerコンテナのmysqlをさしてなかった。

ただ、それ以外はそんな大変ではなく簡単にdbから他のサービスまで含んで構築できるのでなかなかいいものではありそう。
証明書で暗号化する (PowerShell)

# 証明書で暗号化する (PowerShell)

PKCS#7 をベースに作られた RFC 3852 CMS (Cryptographic Message Syntax) を利用する.

暗号化側のコード.
公開鍵が必要.

```powershell
[void] [Reflection.Assembly]::LoadWithPartialName("System.Security")
$plainText = "secret message"
$content = New-Object Security.Cryptography.Pkcs.ContentInfo (,[Text.Encoding]::UTF8.GetBytes($plainText))
$ai = New-Object Security.Cryptography.Pkcs.AlgorithmIdentifier (New-Object Security.Cryptography.Oid "2.16.840.1.101.3.4.1.2") # aes128-CBC
$env = New-Object Security.Cryptography.Pkcs.EnvelopedCms $content, $ai
$cert = Get-Item Cert:\CurrentUser\My\25653B72F81733249EB18E53D8AF6D9C79485EA4
$env.Encrypt((New-Object Security.Cryptography.Pkcs.CmsRecipient($cert)))
$result = [Convert]::ToBase64String($env.Encode())
```

復号側のコード.
秘密鍵が必要.

```powershell
[void] [Reflection.Assembly]::LoadWithPartialName("System.Security")
$encryptedText = "MIIB9gYJKoZIhvcNAQcDoIIB5zCCAeMCAQAxggGeMIIBmgIBADCBgTBpMQswCQYDVQQGEwJKUDEOMAwGA1UECAwFVG9reW8xDDAKBgNVBAcMA090YTEPMA0GA1UECgwGY3lhbmV0MREwDwYDVQQLDAhQZXJzb25hbDEYMBYGA1UEAwwPZW5jcnlwdGlvbiB0ZXN0AhQsGXvNo7nyxnBGULV65zHPq4MTHjANBgkqhkiG9w0BAQcwAASCAQCKbEgWL4ZfPALJXbvGEOS5nDfEzLRgn08/vEE8Ktg9ZzAfo9g7Eioq9I2q3GjW9E61mZh2iHACPUyFO1qC84yBqt5mQTxpcI/PQTYUuwXLumX2AL50E79Xw48Jzt0FJgMXLWE02tJcJ+chspNOKKOOorq3pmbUz/pWxYlX3Dax7TTvqB99gsOHfxu+sHCYPBtnkCPEzF15tCfwn5xVinaG4wHaLWoZuo1y0G0h+aDVYTdRbzzngm4W9zcZ7LmVKm8THTZr2JZ3sqOGv23cDFMeIndWZYszxj0/HTPApCbuavXRrTeGEJAieCXFqJ6clnUXrEI2PepNMe5LmSrtAnyoMDwGCSqGSIb3DQEHATAdBglghkgBZQMEAQIEEJutl+SI5+4LTblQDMcMHKqAEGjf2nsGD9qVI88m3TKE1D4="
$env = New-Object Security.Cryptography.Pkcs.EnvelopedCms
$env.Decode([Convert]::FromBase64String($encryptedText))
$env.Decrypt()
$result = [Text.Encoding]::UTF8.GetString($env.ContentInfo.Content)
```

電文の中に証明書情報が埋まっているので、復号側は証明書の指定が不要だが、証明書ストアから秘密鍵が取得できないとエラーになる.
(電文の構造は `openssl asn1parse` で確認できる)

一応、以下のように整形してやれば OpenSSL でも復号できた.
S/MIME のヘッダは `$ echo "secret message" | openssl cms -encrypt -recip public.key` で出てきた電文から流用した.
ちなみにボディが1行のままだとエラーになった(笑).

```
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
Content-Transfer-Encoding: base64

MIIB9gYJKoZIhvcNAQcDoIIB5zCCAeMCAQAxggGeMIIBmgIBADCBgTBpMQswCQYD
VQQGEwJKUDEOMAwGA1UECAwFVG9reW8xDDAKBgNVBAcMA090YTEPMA0GA1UECgwG
Y3lhbmV0MREwDwYDVQQLDAhQZXJzb25hbDEYMBYGA1UEAwwPZW5jcnlwdGlvbiB0
ZXN0AhQsGXvNo7nyxnBGULV65zHPq4MTHjANBgkqhkiG9w0BAQcwAASCAQCKbEgW
L4ZfPALJXbvGEOS5nDfEzLRgn08/vEE8Ktg9ZzAfo9g7Eioq9I2q3GjW9E61mZh2
iHACPUyFO1qC84yBqt5mQTxpcI/PQTYUuwXLumX2AL50E79Xw48Jzt0FJgMXLWE0
2tJcJ+chspNOKKOOorq3pmbUz/pWxYlX3Dax7TTvqB99gsOHfxu+sHCYPBtnkCPE
zF15tCfwn5xVinaG4wHaLWoZuo1y0G0h+aDVYTdRbzzngm4W9zcZ7LmVKm8THTZr
2JZ3sqOGv23cDFMeIndWZYszxj0/HTPApCbuavXRrTeGEJAieCXFqJ6clnUXrEI2
PepNMe5LmSrtAnyoMDwGCSqGSIb3DQEHATAdBglghkgBZQMEAQIEEJutl+SI5+4L
TblQDMcMHKqAEGjf2nsGD9qVI88m3TKE1D4=
```

```sh
$ cat encrypted.txt | openssl cms -decrypt -inkey private.key
secret message
```
【Git】ファイルを変更せずにコミットメッセージのみをリモートへpushする

Gitで、ローカルのcommitをリモートへpushしたあとにコミットメッセージが誤っていたことに気づくことってないだろうか。私はよくある。

```shell
$ git commit -m "<誤ったメッセージ>"
$ git push -u origin master
#誤ったコミットメッセージをつけてpushをしてしまった！
```

この場合ローカルで正しいコミットメッセージでcommitして再度pushすればいいのでは？と思うのだが、ローカルでファイルを何も変更せずにcommitをしようとすると、エラーとなりcommitが拒否されてしまう。

```shell
$ git commit -m "<正しいメッセージ>"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
#ファイルが何も変更されていない最新のブランチの場合はcommitが拒否される！
```

ただやはりファイルは変更せずにコミットメッセージのみをpushしたい。
そこで、「git コメント 変更」ググったら`commit --amned`による方法がいくつかヒットした。

例えばこちら https://qiita.com/piruty/items/2fbfd26fd8dcbfed592a

push済みの場合もでもこれで対処できるのか…？やってみる。

```shell
#ファイルは変更していない
$ git commit --amend -m "<正しいメッセージ>"
$ git pull origin master #ここで一回pullする必要がある。
$ git push -u origin master
```

ファイルを変更せずに正しいコミットメッセージをリモートへpushすることができた。
（画像のコミットログでは誤ったコミットメッセージ`close #11`に続けて正しいコミットメッセージ`close #13`がリモート側で記録されている。）

![bd74fb69-da46-47e4-a851-ad4f754cc624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/19ec1ef2-0339-1fca-406e-e23027bf29d3.png)

以上
Dockerを使ってRailsを動かしてみた(【初学者向け】RailsとMySQLをDockerizeしてみよう！の補足)

## このようなnoteを買いました

[ 【初学者向け】RailsとMySQLをDockerizeしてみよう！](https://note.mu/ho_m_ie/n/n9f0a6756446a)

基本的にここに書いてある通りに進めるとMac上でDockerを動かすことができます。
すごくわかりやすくてオススメですが、実践するといくつかよくわからなかい点があったので、忘備録として書いておきます。


## 引っかかった点・気づいたところ

- brew caskはアプリをコマンドラインから操作するコマンド。参照URL：https://qiita.com/guitar_char/items/3aca4950bf0adcdf419d

```bash
$ brew cask install docker
```

- docker-composeコマンドがdockerインストールしただけでは使えなかった。アプリを実行したら使用できるようになった。実行パスとかを通しているのかもしれない。

![アプリケーション 2019-05-04 23-56-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/013c3f76-7e24-8f1e-5bd2-e8478d5cc110.png)

- アプリのポート番号記載ミス？ ポートの指定が下記のようになっているが、これはポートフォワード(ポート転送）の記載なので、4000:4000ではなく、4000:3000が正しいはず。4000はDockerコンテナのポート番号で、3000はDocker内で動くRailsアプリのポート番号。→ noteが修正されました。railsの待ち受けポートの記述が間違っていたそうです。

![【初学者向け】RailsとMySQLをDockerizeしてみよう！｜ウェブ系ウシジマくん｜note 2019-05-05 00-00-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/18cc9b50-54b0-788f-8ae4-89a6fd5cd0ca.png)

- docker-composeコマンド実行時はDockerを起動しておく必要がある。起動してないと下記のようなエラーが表示される。

![File “1. ryotak358x80x103x178 DocumentsGitHubdocker-study-for-railsdocker...” 2019-05-05 00-10-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/94f49ab7-fc1d-33f4-d5b7-ef8d11206ef0.png)

- ディレクトリ構成は下記のようにすること

![GitHub 2019-05-05 00-14-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/898e7f6d-44e5-5268-082b-c1b4e52f465e.png)



## Docker参考書

[Docker/Kubernetes 実践コンテナ開発入門](https://amzn.to/2Jg0HDJ)