OmniAICreator/Qiita-1.07M huggingface dataset:
迷路を解くアルゴリズム〜深さ優先探索（Depth First Search)、幅優先探索（Breadth First Search)

# 迷路を解くアルゴリズムをpythonで実装した〜深さ優先探索（Depth First Search）

```python
MAZE = [
    '$$$$$$$$',
    '$  $  G$',
    '$$   $$$',
    '$  $   $',
    '$$$$$$$$',
]
WALL = '$'
GOAL = 'G'

MAZE = [list(i) for i in MAZE]
```

上の値を、' 'を通路、$を壁に見立てた迷路とする。下のプログラムは、迷路のGの地点(goal)を目指し、上下左右への移動を再帰的に繰り返す。いわゆる**深さ優先探索（Depth First Search）**。
どんどん枝分かれして探索を続けていくが、
1. 調べた場所が壁の場合
2. 調べた場所がもうすでに探索済みの場合
の場合は、その分岐は終了する。

そして、いずれかの分岐がgoalに辿り着いた時、全ての探索が終了する。

checkedリストをわざわざ作らなくても、調べた場所を全て壁にするようMAZEに直接書き込んでいけば、「進んだ先が壁なら探索終了」という条件節1個ですむことを知った。以下、改良版（2019.7.10）

```python

def solve(MAZE, y, x):
    if MAZE[y][x] == GOAL:
        return [(y, x)]
    MAZE[y][x] = WALL
    for (next_y, next_x) in [(y+1, x), (y, x+1), (y, x-1), (y-1, x)]:
        if MAZE[next_y][next_x] == WALL:
            continue
        route=solve(MAZE, next_y, next_x)
        if route:
            return [(y, x)] + route


solve(MAZE, 1, 3)
```

以下の結果になる。

```python
[(1, 3), (2, 3), (2, 4), (1, 4), (1, 5), (1, 6)]
```



そして、これはキューを使った**幅優先探索**。経路とともに移動にかかる最短コストを求めている。より短い距離で同じ点にたどり着いたなら、探索を続けている。

以下のコードは、下のリンクのatcoderの問題のコードである。

https://abc007.contest.atcoder.jp/tasks/abc007_3



```python
from collections import deque
import math


def bfs():
    h,w,sy,sx,gy,gx=list(map(int,raw_input.split()[:6]))
    maze=list(map(list,raw_input.split()[6:]))
    for y in range(h):
        for x in range(w):
            if maze[y][x]=='.':
                maze[y][x]=math.inf


    maze[sy-1][sx-1]=0
    que=deque([[sy-1,sx-1]])
    while que:
        y,x=que.popleft()
        for i,j in [(1,0),(0,1),(-1,0),(0,-1)]:
            nexty,nextx=y+i,x+j
            dist=maze[nexty][nextx]
            if dist!='#':
                if dist>maze[y][x]+1:
                    maze[nexty][nextx]=maze[y][x]+1
                    que.append([nexty,nextx])
    print(maze[gy-1][gx-1])
```
Leetcode #832: Flipping an Image

```swift
func flipAndInvertImage(_ A: [[Int]]) -> [[Int]] {
    var A = A
    for i in stride(from: 0, to: A.count, by: 1) {
        var left = 0
        var right = A[i].count - 1
        while left < right {
            A[i].swapAt(left, right)
            A[i][left] ^= 1
            A[i][right] ^= 1
            left += 1
            right -= 1
        }
        if left == right {
            A[i][left] ^= 1
        }
    }
    return A
}
```
スクレイピングの基礎

#スクレイピング
### １．基本

```
import request
# サードパーティライブラリのため注意

url = "https://docs.pyq.jp/_static/assets/scraping/test1.html"

response = requests.get(url)
response.encoding = response.apparent_encoding

print(response.text)
```

### ２．時間をあける

```
import time
time.sleep(1) #1秒まつ
```
【初学者向け】リクエストの送り元によって、当該アクションのリダイレクト先を変更する方法【Ruby on Rails】

ポートフォリオ製作中の初学者です。
インスタグラム風アプリを製作しており、投稿削除機能を実装するに当たって詰まった部分があったので忘備録を兼ねて投稿します。同じ様な状況にいる方の参考になれば幸いですm(._.)m

投稿の削除ボタンを
全投稿一覧ページ(view/pics/index.html.erb)
投稿の詳細ページ(view/pics/show.html.erb)
特定ユーザーの全投稿一覧ページ(view/users/show.html.erb)
に配置しました。
全てのボタンはpics_controller.rbのdeleteアクションにリクエストを送信する様になっています。

```pics_controller.rb
before_action :find_pic, only:[:show, :edit, :update, :destroy]
  
 
  def destroy
    @pic.destroy
    redirect_to root_path
    end
  end
  
  private
    def find_pic
      @pic = Pic.find_by(id: params[:id])
    end
```
しかしこのままだと、どのページのボタンからのリクエストも投稿削除後、一様にルートパスへリダイレクトされてしまいます。
それぞれにふさわしいリダイレクト先を設定したいですよね！
そんな時、こいつが役に立ちます。

```
Rails.application.routes.recognize_path(request.referer)
```
このコードによって、以下の例の様にアクションのリクエスト元ページに関連するコントローラーとアクションをハッシュで習得出来ます。

```
irb> > Rails.application.routes.recognize_path('/')
=> {:controller=>"rails/welcome", :action=>"index"}
```
これを応用してdestroyアクションを以下の様に編集すると

```
def destroy
    @pic.destroy
    lastpath = Rails.application.routes.recognize_path(request.referer)
    if lastpath[:controller] == "users"　
      redirect_to user_path(@pic.user_id)
    else
      redirect_to pics_path
    end
  end
```
それぞれ狙ったパスへリダイレクトすることが出来ます！
MacのAndroid Studioに保存されているキーストアのパスワードを表示する

キーチェーンに以下の名前でアプリケーションパスワードとして保存されていました。
項目をダブルクリックし「パスワードを表示」をチェックすれば表示できます。

```
org.jetbrains.android.exportSignedPackage.KeystoreStep$KeyPasswordRequestor
org.jetbrains.android.exportSignedPackage.KeystoreStep$KeyStorePasswordRequestor
```
Leetcode #419: Battleships in a Board

```swift
func countBattleships(_ board: [[Character]]) -> Int {
    if board.isEmpty || board[0].isEmpty {
        return 0
    }
    var answer = 0
    for i in stride(from: 0, to: board.count, by: 1) {
        for j in stride(from: 0, to: board[0].count, by: 1) {
            if board[i][j] == "." {
                continue
            }
            if i > 0 && board[i-1][j] == "X" {
                continue
            }
            if j > 0 && board[i][j-1] == "X" {
                continue
            }
            answer += 1
        }
    }
    return answer
}
```
Microsoft FlowからGraph APIを叩く際の"@odata.id"の扱い方について

本日会社で指令を受けまして。FlowとGraphを使ってTeamsのチームを自動で作りたいということになり色々やっていました。
その中でチームの、正確にはグループの所有者を追加する必要が出ました。
そこで少しは手間取った割に日本語情報が見当たらなかったので。小ネタですが。

Graphから所有者を追加するのはこのAPIです。[グループ所有者の追加](https://docs.microsoft.com/ja-jp/graph/api/group-post-owners?view=graph-rest-1.0&tabs=javascript)

これをFlowから叩くには以下のJSONをバッチのBODYに入れてやる(バッチについての詳細は[過去記事](https://qiita.com/hazigin/items/646d57fe9feefbd24da8)をご覧下さい)。
![コメント 2019-07-02 215917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66198/469c3711-ab0b-2f5f-ec8c-5e49234f5af6.png)

```
{
  "requests": [
    {
      "url": "/groups/@{body('Add_Group').responses[0].body.id}/owners/$ref",
      "method": "POST",
      "id": 2,
      "headers": {
        "Content-Type": "application/json"
      },
      "body": {
        "@odata.id": "https://graph.microsoft.com/v1.0/users/(ユーザーの識別子が入る)"
      }
    }
  ]
}
```

その際上記のまま書いてBodyに入れると
![コメント 2019-07-02 215930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66198/415d627e-b23c-80f9-5e5d-92795db3517d.png)

```
テンプレートの検証に失敗しました: '行 '1'、列 '3323' のテンプレート アクション 'Add_Owner' は無効です: "テンプレート言語式 'odata.id' を解析できません: 必要なトークンは 'LeftParenthesis' で、実際は 'Dot' です。"。'。
```

というエラーが出ます。
何が一体何ならやら…と思って調べていくと  __"@odata.id"__ が問題だった。


調べた結果
![コメント 2019-07-02 215952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66198/0d180857-31d4-de45-5ca6-c81bb3edc05c.png)


```
"@@odata.id": "https://graph.microsoft.com/v1.0/users/(ユーザーの識別子が入る)"
```

という風に@(アットマーク)を重ねて書いてから保存すると上手くいきました。
保存すると重ねたアットマークはまた一つに戻る。でも動作は上手くいきます。
これ、Flowのバグなのでしょうか？元に戻るんだったら最初から一つだけでも許容してくれたらとも思うのですが…

ご参考になれば幸いです。
「ld: framework not found FirebaseInstanceID」というエラーが出る

しばらく利用していなかったFirebaseのプロジェクトをビルドした時に
「ld: framework not found FirebaseInstanceID」というエラーが出ました。
色々探してみたところ、Firebaseライブラリのバージョンが古いままだったみたいです。

```
$pod update
```

で更新すれば問題なくビルドできました。
Manjaroのインストール

家のパソコンをManjaroに変えようと思いついたので、備忘録として書いていく

#まずインストール用USBの作成
##Manjaroのイメージのダウンロード
ダウンロード先：https://manjaro.org/download/
今回はKDEにしました。

#USBに書き込む
USBに書き込みをしないとなので、balenaEtcherを使って書き込む
ダウンロード先：https://www.balena.io/etcher/
イメージの選択をしてUSBの選択をしてFlash！を押せば待つだけ

---------
これでひとまずはインストール用USBの作成は完了

#Manjaroのインストール
##BIOSを開く
最初にすることはBIOSを開く
自分の環境ではデリートキーを連打すると開ける。
その後に、USBからブートから開くように設定後に再起動
少し待てば、いインストール画面が表示される。

##インストール画面について
画面に従って環境を設定していればどうにかなるはず
自分は

* タイムゾーン[tz=UTC]
    * Asia
    * Asia/Tokyo

* キーボード[keytable=us]
    * keytable=jp

* 言語[lang=en_US]
    * 日本語

最後にBoot：manjaro.86_64 xfceを選択すればライブ起動が始まる。

デスクトップ画面の「Install~」アイコンからインストーラーを起動する。
設定はライブ起動時にしているのでそのままでも大丈夫

自分がインストールしたいドライブをお好みで決めたら
ユーザー情報の設定画面になるので自分の設定を決める。

最後に「今すくインストール」をおしてインストール
適当に待てばインストールが終わるので「今すく再起動」にチェックをいれて「実行」をする。

USBは画面が消えたら適当に抜いているけどこれでいいのかわからない
起動したら一段落

ひとまずこれでManjaroのインストールは終了
次に初期設定をやっていく

#Manjaroの初期設定
ターミナルを開いて以下のコマンドをおまじないで打ち込む

```
$ sudo pacman-mirrors --fasttrack && sudo pacman -Syy
```

これはダウンロードが早くなるおまじない
なんか、サーバーミラーリストを早いところに変えてくれるらしい

結構時間かかるので待機
暑かったのでピノを食べた
個人的にはチョコモナカよりもピノ派

次にアップデート

```
# システムアップデート
$ sudo pacman -Syu
```

ひとまずこれで最低限は完了

次は日本語化をする。

#日本語化
流石に英語のままではストレスがたまりまくるので、日本語対応にする。

調べたところFcitxをするらしい

```
$ sudo pacman -S fcitx-im fcitx-mozc

$ sudo pacman -S fcitx-configtool
```
打ち込むと、どれをインストールするか聞かれるので
何も打ち込まずそのままEnterします。

vimになれていないのでgeditをインストールする

```
$ sudo pacman -S gedit
```

次に.xprofileに設定を書きこむ
隠れているかもしれないので隠しファイルを表示するしとくと便利(alt + .)

```
$ sudo gedit ~/.xprofile
```
.xprofileに以下を書き込む

```
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
```

あとは再起動すれば
全角/半角キーで入力切り替えできるはず

#時間設定
なんか時間がずれているので直す

```
$ timedatectl set-ntp true
```
オンライン環境でしか治らないので注意
納得の行かないバリデーション

Webをうろついていれば、多種多様な入力フォームに遭遇しますが、かけられているバリデーションにストレスを募らせる例もあります。

## 入力途中に書き換えられるフォーム

これは[以前にもテーマにしました](https://qiita.com/jkr_2255/items/f1c035fe6dee57518efe)が、ユーザーの入力が続いている途中にデータを変換してしまうと、

* 入力したものがいきなり違うものになると、感覚的によろしくない
* 特に、入力した文字を直後に黙って消してしまうと、「打てていないのかな？」と再度打ち込むけどやっぱり消える、で動いていないんじゃないかと思わせてしまう
* カーソル位置がずれる

など、入力する側にとってストレスとなってしまいます。値を変換するのであれば、入力フォームからフォーカスが外れた`onblur`のタイミングを狙ったほうがいいでしょう。そして、変換する内容についてフォーム周辺に書いておくこともおすすめします。

### `maxlength`の問題

入力中に変更を加えてしまうようなJavaScriptは、あえてそう書かないと発生するものではありませんが、HTML5にある`maxlength`属性は、文字数を超えようとすると**超えた分が打てなくなる**という実装が多いので、この問題が起きます。とりわけ、パスワード入力欄の場合、表示で入力内容がぶった切れていることがわからないので、ユーザーもシステム側も認識しないまま、正常値として[意図しない値が登録されてしまう](https://qiita.com/kawaz/items/d462a05c113b8e063736)結果になります。

`maxlength`をかけていいのは、

* 郵便番号・JANコードなどのように、入力するものの長さが明らかな場合
* 一般的に考えられる入力に対して十分すぎる長さが取ってあるデータベースカラムに入れるデータに対して、カラム長を超えないよう保険として[^1]入れておく場合

ぐらいです。

## 入力途中で出されても嬉しくないバリデーション

こんどは純粋にバリデーションの話題ですが、入力途中でもJavaScriptでチェックしてバリデーションをかけるような仕組みを作っている例もあります。ただ、これもやりすぎると不興を買うかもしれません。

たとえば、メールアドレスの入力欄で`jkr_2255@example.com`のような入力をしたいとします。そして、`jkr_2255@example.c`まで打っているうちに「メールアドレスが正しくありません」と出てきたら、きっとイラッとしかしないことでしょう。

このように、「入力全体で書式チェックをするもの」や「IDなどの重複チェック」は、いま入力として不適当だったとしても、入力を続ければ適切な入力になりうるので、途中チェックはあまり適当ではありません。

逆に、「入力すべきでない文字が入った場合」は、その後入力を続けても不適切な入力が解消されることはないので、入力された瞬間にバリデーションエラーとしても問題はないと考えます。

[^1]: もちろん、サーバサイドでのチェックは必要です。
【Firebase】ReactNativeでプッシュ通知を実装(サーバサイド編)

# はじめに
ReactNativeでアプリ開発をしているわけなんですが、
個人的にはプッシュ通知ってアプリの大きな魅力だと思うわけですよ。
軽く下調べすると、Firebaseを使うと割と簡単に実現できるらしいので今回はそこらへんをやってみた話。
受信側(アプリ)は別記事で書く予定なので、今回は通知する側(有り体に言えばサーバサイド)の実装例を。

# 関連ライブラリ
```
npm install firebase-admin
nom install tunnel2
```
※tunnel2はプロキシ下でなければ不要です。

# 事前準備
- [Firebase](https://firebase.google.com/?hl=ja)から[設定]→[サービスアカウント]→[新しい秘密鍵を生成]に移動して[キーを生成]
- ダウンロードしたJSONを保存(今回はserviceAccountKey.jsonとしました)

# ソース

```sendFb.js
let tunnel = require('tunnel2');
let admin = require('firebase-admin');
let serviceAccount = require('./serviceAccountKey.json');

// プロキシを使わない場合はこの記述は不要
const proxyAgent = tunnel.httpsOverHttp({
  proxy: {
    host: "ホストアドレス"
    , port: ポート番号
    , proxyAuth: "UIDとPASS"
  }
})

let app = admin.initializeApp({
    credential: admin.credential.cert(serviceAccount, proxyAgent),
    databaseURL: "FirebaseのDBUrl",
    httpAgent: proxyAgent
});

// プッシュ通知を受信するデバイストークン
let token = 'hogehoge';

// 通知するメッセージ
let message = {
  // 通知時のポップアップの件名と本文
  notification : {
    title: "00000",
    body: "111111"
  },
  // アプリに渡したいデータ
  data: {
    param1: "aaaaaa",
    param2: "bbbbbb"
  },
  token: token
};

admin.messaging().send(message)
.then((response) => {
  console.log("OK");
  // 通知完了後処理
})
.catch((error) => {
  console.log("NG");
  console.log(error);
  // 通知失敗時処理
});
```

# 実行
```
node sendFb.js
```

# 感想
ほぼ公式のドキュメントを写経しながらで済んだ(プロキシのくだりはちょっとハマった)ので導入は簡単に思えた。
今回はじめてFirebaseに触れたけど、勿論プッシュ通知以外にも色々とできるようなので、引き続き勉強ですな。
railsでテスト駆動のため、Rspecを導入する

アプリ開発で、ユーザーの新規登録とログイン機能を作ったので、単体テストをしようと思います！:ok_woman:
テストをする前にテストコードをかくRSpecの導入をしていこうと思います。

#RSpecの導入

###Gemのインストール

Gemfileに以下の記述を追加し、ターミナルでbundle installを実行する

```Gemfile.

gem 'rspec-rails'

group :development do
  gem 'web-console'
end
```

:helmet_with_cross:web_console (gem)はtest環境で動かすと不具合が起きる可能性があるのでdevelopment環境でのみ動くようにする

###RSpecをインストールする

１、ターミナルで以下を実行する

```ターミナル.
rails g rspec:install
```

:point_down_tone1:このように４つのファイルが作成される:point_down_tone1:
<img width="309" alt="スクリーンショット 2019-07-02 21.36.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400567/7d326a4d-5171-bd7a-8665-36d3b56a98bd.png">

#####:sunny:spec_helper.rb
RailsにおいてのRSpecの共通の設定を書いておくファイル。各テスト用ファイルでこのファイルを読み込んで使う。

#####:sunny:rails_helper.rb
RSpecの共通の設定を書いておくファイル。RSpecをRails無しで利用する際に使う。

２、.rpecに以下を追加する
出力結果を見やすくするため:clap_tone1::relaxed:

```
--format documentation
```

###RSpecがちゃんと動くか確認

ターミナルで以下を実行

```ターミナル.
$ bundle exec rspec
```

:point_down_tone1:こうなればOK！
<img width="401" alt="スクリーンショット 2019-07-02 21.47.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400567/058ab50b-4a4a-2f7b-b9ff-7a69db21747b.png">

##テストファイルを作る

specディレクトリ下にmodelディレクトリを作成
その中にファイル（対応するクラス名_spec.rb）を作る

###テストコードを書いて実行する

実行する時はターミナルで以下のコマンドを使う

```ターミナル.
bundle exec rspec
```
SQLとNoSQLの違い

こんにちは! 私はグウェン([https://twitter.com/gwenskiesHere](https://twitter.com/gwenskiesHere))です。
アプリを開発始める前に、アプリのストラクチャーとかデザインとかデータベースを決めることが必要です。
1つの重要なものはデータベースです。これはすべてアプリの必要なデータを格納するからです。
だからこそ、今日はSQLとNoSQLの違いについて説明したいと思います。

![Untitled presentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300937/41455985-ea32-3893-10b2-386bc1a06e10.png)

# SQLデータベースとは
SQLデータベースは 「リレーショナルデータベース」です。SQLは「Structured Query Language」の略語で、データーベースをアクセスし、管理することという言語です。データベース内のデータを作成とか更新とか削除ができます。
SQLデータベースは制限的です。だから、SQLデータベースを使用する前に、データの構造を決定するために事前定義スキーマを使用する必要があります。

#### データベーススキーマの例画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300937/75f482e1-ff59-8980-44f0-c01b9acf9aac.png)

#### SQLテクノロジ
- MySQL
- PostgreSQL
- Oracle
- Sqlite
- MS-SQL

# NoSQLとは
NoSQLは非構造化データのために動的なスキーマです。
フレキシブルなので、色々な方法でデーターを蔵し、表現することができます。例えば、「column-oriented」や「document-oriented」や「graph-based 」の方法です。

#### NoSQLでのデータ表現
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300937/5f5e4824-639e-8811-7be6-19d1fdb5fe7e.png)

#### NoSQLテクノロジ
- MongoDB
- Redis
- Hbase
- Neo4j
- CouchDb

# SQL vs NoSQL

### スケーラビリティ

スケーラビリティの場合にSQLデータベースでは、CPUやRAMやSSDなどを増やすことで、単一サーバーの負荷を増やすことができます。 
NoSQLは、分割するか、NoSQLデータベースにサーバーを追加することで、より多くのトラフィックを処理します。

### ストラクチャ

SQLデータベースはテーブルベースです。
一方、データベースは「document-based」とか「key-value pairs」とか「graph databases」とか「wide-column stores」です。

### サポート
SQLは業界で長年にわたって知られてきました、それはすでにそのベンダーとコミュニティから優れたサポートを確立しました。 一方、NoSQLにはコミュニティサポートしかなく、限られた専門家しかサポートを受けられません。

### データを照会する性能

SQLは効率的にクエリを実行し、データを早く取得して編集します。 これは非常に軽量で宣言的なので、学ぶのは簡単です。
NoSQLクエリを実行するには、データに対して追加の処理を実行する必要があります。 データベース層で心配するのではなく、多くの開発者が照会機能をアプリケーション層に組み込んでいます。

# まとめ

一つの重要な決定はプライマリデータベースとしてSQLデータベースとNoSQLデータベースのどちらを使用するか、そしてニーズを満たすのために両方を使うする必要があるかどうかです。
SQLデータベースは、構造が頻繁に（またはまったく）変更されず、データの整合性が最優先されるトランザクションデータに大きな利点を提供します。 高速の分析クエリにも最適です。
NoSQLデータベースははるかに高い柔軟性とスケーラビリティを提供し、それは急速な開発と反復に向いています。

読んでくれてありがとうございます。

### ソース:
[https://www.thorntech.com/2019/03/sql-vs-nosql/](https://www.thorntech.com/2019/03/sql-vs-nosql/)
[https://www.xplenty.com/blog/the-sql-vs-nosql-difference/](https://www.xplenty.com/blog/the-sql-vs-nosql-difference/)
[https://www.thegeekstuff.com/2014/01/sql-vs-nosql-db](https://www.thegeekstuff.com/2014/01/sql-vs-nosql-db)
Androidのライブラリ(aar)にライブラリ(aar)を入れて利用できるのか

ライブラリ(aar)を入れたライブラリ(aar)を作ろうとしましたが・・・

#〇結果
・普通にやってもできない！
・コンパイルは通るが依存関係が分からず、プロジェクトで利用するとライブラリ利用時にNoClassDefFoundErrorで落ちる
・android-fat-aarというライブラリを入れれば、依存関係をマージすることが可能だが、開発はすでに行われていなく、２年は更新されていない(https://github.com/adwiv/android-fat-aar)
・Mavenリポジトリに統合したaarと梱包されたaarをアップしてpom.xmlで依存関係を設定すればできるが、あまりスマートじゃない上に面倒
・統合したaarと梱包したaarをlibsに入れて両方にパスを通せば落ちなくなるが、これまたスマートじゃない




#〇参考
Android Studio Create AAR using another AAR file and jar inside(stack overflow)
https://stackoverflow.com/questions/40405465/android-studio-create-aar-using-another-aar-file-and-jar-inside

#〇最後に
妙案ありましたら教えてください
Java開発の基本〜演習③高度なプログラミング〜

# 問題
足し算引き算のみの電卓を作りましょう。
数字と演算子は引数として渡されます。

# 条件

* 引数は好きな数持てるようにしましょう
* 利用する演算子は「+」「-」のみ。それ以外の数が入力された場合には「演算子が無効です」を返す
* 数字はアラビア数字のみの入力を許可する
* エラーでプログラムが終了しないようにする

### ざっくりと下記のような結果を期待しています。

* これ以外の値が入る場合もあるので、テストケースを考えてエラーが出ないようにしましょう。

|入力値|結果|
|---|---|
|1 + 2 + 3|計算結果は6です|
|1 + 2 - 3|計算結果は0です|
|1 たす 2 たす 3|演算子は無効です|
#rails の Activerecord で 連結した where 句の条件をリセットする ( .unscoped )

例

```rb
[197] pry(main)> User.where(id: 1).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`id` = 1"

[198] pry(main)> User.where(id: 1).unscoped.to_sql
=> "SELECT `users`.* FROM `users`"

[199] pry(main)> User.where(id: 1).unscoped.where(id: 2).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`id` = 2"

```

Ref

[ActiveRecordのorクエリをscope化する - Qiita](https://qiita.com/jkr_2255/items/9b08a04b0247fe84a969)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2233








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AWS Lambdaを特定の時間帯だけ、X分毎に定期実行させたい。

# 課題
AWS CloudFormation スタックを作成し、そのスタックステータスをStackの作成（更新）完了までの間ウォッチしたい。

しかし、スタックの作成処理は年に１回or２回しか行われない。
なので、数分に一回スタックステータスをウォッチするLambdaを組んだとしても、
そのLambdaが実質、機能するのは年に１,２回の数分間のみ
残りの約363日間の実行は全て無駄になる。
お金がもったいない（スタックステータスをウォッチするだけだからそんなに高価な処理じゃないけど）

# 要望
AWS CloudFormation スタックを作成（更新）して、作成（更新）が終わるまで動くLambda Functionが欲しい

# 対応
「AWS Step Functions」を使う
https://aws.amazon.com/jp/step-functions/

Step Functionsの説明は他の方の記事を参考に
https://qiita.com/ketancho/items/147a141c9f8a6de86c97

当記事では具体的な使用例を記載したいと思います。

# 具体的にどーやって使うの？
Step Functionsを交えて下記のフローで処理させることで
特定の期間だけLambdaを実行します。

1. スタックを作成する
2. Step Functionsを呼び出す

    １. スタックステータスをウォッチするLambdaを実行する。（discribeStack）
    ２. スタックステータスが継続（PROGRESS）の場合、１分待機（wait_one_min）して処理1（discribeStack）に戻る。
       スタックステータスが完了（COMPLETE）場合、処理を終了（EndCheckStatus）する。

# どーやって実装するの？
Step Functionsは管理コンソールからUIを使用して実装可能です。
しかしながら、SAMファイルにしたかった為
Json形式で書きましたのでそちらを記載します。
※ステータスが０の場合は完了、１の場合は継続としています。

```:AWS_Step_Functions
{
    "StartAt": "discribeStack",
    "States": {
        "discribeStack": {
            "Type": "Task",
            "Resource": "DescribeStackLambdaFunction",
            "Next": "CheckStatus"
        },
        "CheckStatus": {
            "Type" : "Choice",
            "Choices": [
            {
                "Variable": "$.status",
                "NumericEquals": 1,
                "Next": "wait_one_min"
            },
            {
                "Variable": "$.status",
                "NumericEquals": 0,
                "Next": "EndCheckStatus"
            }
            ]
        },
        "EndCheckStatus": {
            "Type": "Pass",
            "End": true
        },
        "wait_one_min": {
            "Type": "Wait",
            "Seconds": 60,
            "Next": "discribeStack"
        }
    }
}
```

スタックステータス をウォッチするLambdaはこちら(Go言語)

```:DescribeStackLambdaFunction.go

//StepFunctionに返す値
type OutEvent struct {
	Status int `json:"status"`
}

//HandleRequest is main process
func HandleRequest() (OutEvent, error) {
	stacName := "hoge"

    //AWSのセッションを作成
	sess, _ := session.NewSession()
	//cloudformationのクライアントを作成
    cfc := cloudformation.New(sess)
	//ステータスを取得したいスタック名のinputを作成
    stack := &cloudformation.DescribeStacksInput{
		StackName: aws.String(stacName),
	}
    //スタック名からスタックステータスを取得 
	DescribeStackResult, _ := cfc.DescribeStacks(stack)
	Stacks := DescribeStackResult.Stacks
	stackStatus := *Stacks[0].StackStatus

    //stackStatusが継続の場合
	if stackStatus == cloudformation.StackStatusCreateInProgress {
		return OutEvent{Status: 1}, nil
	} 
    //stackStatusが完了の場合
    if stackStatus == cloudformation.StackStatusCreateComplete {
		return OutEvent{Status: ０}, nil
    }
}

func main() {
	lambda.Start(HandleRequest)
}
```
LambdaからStep Functionsへの値の受け渡しはJsonで行える為、連携に関しては非常にスムーズです。
一方通行ではなくStep FunctionsからLambdaへの値もJsonで行えます。

# 所感
DynamoDBを使用して状態を管理しても同等の機能が
Step Functionsを使用せずに実装する事ができたかもしれません。

しかし、Step Functionsは気軽に実装が行える事、安価である事がメリットと考えられます。
今後も、特定の条件下のみ実行したいLambdaがある場合はStep Functionsを使用して、実行頻度の軽減したいと思います。

# ちなみに
Step Functionsの実行もAPIを使用して行なっています。
https://docs.aws.amazon.com/sdk-for-go/api/service/sfn/#SFN.StartExecution
非同期で実行されます。
$(docment).ready(...)は非推奨＋必要ない

# 一言でいうと

 - \$(document).ready(...)という書き方は、もう推奨されていません。
 - \<body\>の末尾に\<script\>を配置しているのなら、  
   ほとんどの場合、\$(document).ready(...)を使う必要はありません。


# 推奨されていない

[jQueryの公式ドキュメント](https://api.jquery.com/ready/)には以下のように書かれています：

> jQuery offers several ways to attach a function that will run when the DOM is ready. All of the following syntaxes are equivalent:

> ・\$( handler )
> ・\$( document ).ready( handler )
> ・\$( "document" ).ready( handler )
> ・\$( "img" ).ready( handler )
> ・\$().ready( handler )

> As of jQuery 3.0, only the first syntax is recommended; the other syntaxes still work but are deprecated. 


つまり、jQuery3.0では、DOM要素の構築を待ついくつかの構文のうち、\$(...)という構文のみが推奨されており、\$(document).ready(...)という構文はDeprecatedです。

今まで書いてきた書き方と比較すると以下のようになります。

Bad (推奨されていない書き方):

```javascript

$(document).ready(function() {
  ...
});
```


Good (推奨されている書き方):

```javascript

$(function() {
  ...
});
```

# 使う必要がない

\<body\>の末尾に\<script\>を配置した場合、\<script\>より上にあるDOM要素は、読み込みと解析が完了しており、jQueryからアクセスすることができます。

なので、\<script\>より上にあるDOM要素にアクセスできるのを待つために、\$(document).ready(...)を使おうとしているのであれば、\$(document).ready(...)は必要ありません。


Bad （必要ない処理が含まれている）:

```html
...
<div class="some"></div>
...
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(document).ready(function() {
  var element = $('.some'); //要素にアクセスできる
});
</script>
</body>
</html>
```

Good:

```html
...
<div class="some"></div>
...
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
var element = $('.some'); //ready()を使わなくても要素にアクセスできる
</script>
</body>
</html>
```

もしスコープをつくりたいのであれば、即時関数で包めばOKです。

```javascript
(function() {
  var element = $('.some');
})();
```


## では、どんな時に使う必要がある？

### \<script\>を\<body\>の末尾に配置することができない場合

以下のような状況では、上記の構文\$(...)を使って、DOMの読み込みを待つ必要があります:

 - なんらかの事情で\<script\>を\<body\>の末尾に配置することができない場合
 - 自分が書いたスクリプトがどこでロードされるか予測できない場合

例えば\<script\>を\<head\>内でロードした場合は、\$(...)が必要です。

```html
<head>
...
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(function() {
  var element = $('.some');
});
</script>
</head>
...
```

### DOMContentLoadedイベントを完全に待ちたいとき

\$(...)は、DOMContentLoadedイベントを待ちます。\<body\>末尾の\<script\>を実行したタイミングでは、DOMContentLoadedイベント自体は発火していないので、もしDOMContentLoadedイベントを確実に待ってから処理を行いたい場合は、\$(...)が必要です。（とはいえ、このようなシチュエーションはほぼ無いでしょう）

# 雑感

自分の身近で、jQueryを使った場合に、\$(document).ready(...);を使うことを強制する指導をしている場面がありました。非推奨な書き方は修正すべきとして、なぜこの指導が続けられているのかというと、以下の２点を手軽に実現できるからなのではないかと思います。

 - どこに\<script\>を配置しても、DOMの読み込みを待つことができる
 - これだけでスコープを作り出すことができる

JavaScriptやjQueryの初学者には、この指導をしてもよいかもしれません。でも、もし学んでいる相手にある程度の理解力があって、かつ指導する時間を確保できるのであれば、きちんと使うべき状況を説明すべきなのではないかと思います。

# 参考
- .ready() | jQuery API Document  
https://api.jquery.com/ready/
- Is $(document).ready necessary? (stack overflow)  
https://stackoverflow.com/questions/4643990/is-document-ready-necessary
【Mac OSX】vue-cliのインストールでgyp ERR! configure errorが出てしまう問題を解決


# やりたいこと
vue-cliをmacに入れたい。



# 問題

```terminal
npm install -g @vue/cli
```
と打ったり、
```

```
sudo npm install -g @vue/cli
```
と打ったりしても、こんな感じのエラーが出てうまくインストールできない。

```
/usr/local/bin/vue -> /usr/local/lib/node_modules/@vue/cli/bin/vue.js

> fsevents@1.2.9 install /usr/local/lib/node_modules/@vue/cli/node_modules/fsevents
> node install

node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp WARN Pre-built binaries not installable for fsevents@1.2.9 and node@8.12.0 (node-v57 ABI, unknown) (falling back to source compile with node-gyp)
node-pre-gyp WARN Hit error EACCES: permission denied, mkdir '/usr/local/lib/node_modules/@vue/cli/node_modules/fsevents/lib'
gyp ERR! configure error
gyp ERR! stack Error: Command failed: /Users/keisuke/.pyenv/shims/python -c import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack   File "<string>", line 1
gyp ERR! stack     import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack                                ^
gyp ERR! stack SyntaxError: invalid syntax
gyp ERR! stack
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:276:12)
gyp ERR! stack     at emitTwo (events.js:126:13)
gyp ERR! stack     at ChildProcess.emit (events.js:214:7)
gyp ERR! stack     at maybeClose (internal/child_process.js:915:16)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
gyp ERR! System Darwin 18.6.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/usr/local/lib/node_modules/@vue/cli/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64/fse.node" "--module_name=fse" "--module_path=/usr/local/lib/node_modules/@vue/cli/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64" "--napi_version=3" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v57"
gyp ERR! cwd /usr/local/lib/node_modules/@vue/cli/node_modules/fsevents
```

# 解決策

[Errors during install of vue-cli on Mac OSX](https://github.com/vuejs/vue-cli/issues/3402)

を参考に

```
sudo npm install -g @vue/cli --unsafe-perm
```
と叩いたらいけた☆

# 結果

```
/usr/local/bin/vue -> /usr/local/lib/node_modules/@vue/cli/bin/vue.js

> fsevents@1.2.9 install /usr/local/lib/node_modules/@vue/cli/node_modules/fsevents
> node install

node-pre-gyp WARN Using request for node-pre-gyp https download
[fsevents] Success: "/usr/local/lib/node_modules/@vue/cli/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64/fse.node" is installed via remote
+ @vue/cli@3.8.4
added 68 packages from 33 contributors and updated 1 package in 51.369s
```

いぇい！
Carthageでライブラリを導入した際に「clang: error: linker command failed with exit code 1 (use -v to see invocation)」というエラーが出る問題

Carthageでライブラリを導入した際に嵌ってしまった。
備忘録も兼ねて記します。

#clang: error: linker command failed with exit code 1 (use -v to see invocation)
![スクリーンショット 2019-06-28 15.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/07cdfaba-64b9-8f97-a282-a4ce8c6858d5.png)



下記記事を参考にCarthageでライブラリを導入していたが、コンパイル時に「clang: error: linker command failed with exit code 1 (use -v to see invocation)」という謎のエラーが出て、進めなくなった。
【Swift】Carthage導入手順 - Qiita
https://qiita.com/ShinokiRyosei/items/9b856ebdec5379b6c631

#環境
 - Xcode_10.1

手順通りにやっているはず・・・。😂
以下、手順通りに試したこと。

#Linked Frameworks and Librariesにframeworkを追加
![スクリーンショット 2019-06-28 14.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/22d78b89-7cfa-2b77-3d9a-ba5c3547fb0d.png)




#RunScriptを作成、スクリプトを追記、InputFilesにライブラリのディレクトリを指定
![スクリーンショット 2019-06-28 14.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/b221aaf3-6ad5-e715-66f2-59997ad84cd9.png)

#試したこと
 - Carthageのバージョンを上げて導入し直す。➡︎直らない
 - CleanBuild、再起動➡︎直らない
 - ググって色々試す➡︎直らない
 - 別のXcodeのバージョン(Xcode_10.2.1)でビルドしてみる➡︎成功！？🤔

#解決策
1. Xcode>Preferences>Locations>Command Line Toolsで
利用しているXcodeのバージョンとCommand Line ToolsのXcodeのバージョンを合わせる。
※プルダウンできます。
![スクリーンショット 2019-07-02 20.42.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/cc10c841-edf7-b031-f192-28018a4e72a6.png)

2. プロジェクト名>Carthage>Buildの"Build"ディレクトリを削除する。

3. 「$ carthage update --platform ios --no-use-binaries」でライブラリを入れ直す。

#結果
直った🥳

結局、複数のXcodeのバージョンを保持しているがゆえに、Command Line Toolsのバージョンが合っていなくてCarthageでライブラリを導入していたのが原因？

**教訓: XcodeのバージョンとCommandLineToolsのバージョンは揃える！**

他にいい方法がありましたらアドバイスいただけると嬉しいです🙇🏽‍♀️

#参考記事
・「clang: error: linker command failed with exit code 1」というエラーへの対処 - Action Script書きの日記
https://goodbyegirl1974.hatenadiary.org/entry/20120920/1348106337
・【swiftエラー】clang: error: linker command failed with exit code 1 (use -vto see invocation) - Qiita
https://qiita.com/miyamotok0105/items/8562964e58965f0abe16
・Xcode 8.3 でビルドした時に “The following binaries use incompatible versions of Swift:” のエラーが発生│U2Kの覚え書き
https://u2k772.blog.fc2.com/blog-entry-439.html
仮想環境とは

##仮想環境とは
仮想環境とは、WEBアプリなどをオンラインにアップロードする際に、オンラインにアップロードする必要なファイルをまとめておく環境である。ローカル（ノートパソコンなど）でアプリを開発していると、パソコン自体にインストールされているPythonライブラリを読み取ってしまう。
###仮想環境を構築していないとオンラインにアップロードしたときにアプリが動かない恐れがある
例えばアプリでPillowライブラリ（PIL）を使うことを考えてみる。まずパソコンに```pip install Pillow```でPillowをインストールする。アプリでは```from PIL import Image``` と記述してライブラリからコマンドインポートする。この場合アプリはパソコン上のPillowライブラリ読み取って動くことになる。ローカルのみでアプリを実行する場合には問題ないが、オンラインにアプリをアップロードする場合に問題が発生する。

##オンラインサーバーにはpythonライブラリがインストールされていない
オンラインにアプリをアップロードということは、ローカルで作成したアプリのファイルをオンラインサーバーに移動するということである。ここで問題なのはオンラインサーバーにはpythonライブラが入っていないということである。そのためアプリのフォルダに入っているファイルだけをサーバーにアップロードしても、アプリは必要なpythonライブラリを読み取ることができず動かなくなる。上記の例では```from PIL import Image```で、「PILライブラリが見つかりません」といったエラーが発生することになる。
##仮想環境を構築してアプリに必要なライブラリをアプリと同じフォルダに格納する
仮想環境を構築する目的は、オンラインサーバが必要なライブラリを読み取ってインストールするための「ライブラリリスト」を作成することである。

###仮想環境の作り方

#####1. 「プロジェクトのフォルダ内」でコマンドプロンプトを起動し（[コマンドプロンプトを指定のフォルダで素早く起動][link]を参照）、```python -m venv env``` と入力する。
__プロジェクトのフォルダ内__というのは、Flaskアプリであれば```application.py```と同じレベル、Djangoアプリであれば```manage.py```と同じレベルである。そのため仮想環境を構築する前にプロジェクトフォルダを作成（```django-admin startproject test```など）している必要がある。
一番最後の「env」は任意の文字でいいが、仮想環境には同じ名前を使った方が後々都合がよい。使い回しするファイル（.gitignoreなど）を作成する時に同じ名前であると書き換えしなくてもいいからだ。
そうすると仮想環境のフォルダが作成される。写真の例は「test」フォルダ内でコマンドプロンプトを立ち上げ、上のコマンドを入力したもの。

![スクリーンショット 2019-07-02 21.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/66b4fdc7-31fe-1b54-c78f-1b9a5ef7ba81.png)

#####2. コマンドプロンプト（PowerShellではできない）で```env\Scripts\activate.bat``` と入力する。
写真のように入力する。「円マーク（￥）」は日本語キーボードの「バックスペースキー」の左側隣のキー。
![スクリーンショット 2019-07-02 21.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/a02a659b-4fb8-560e-de5d-74c920d954d8.png)
すると、次のような画面になる。左側（env）とあると現在「env」という仮想環境上にいることを示している。
![スクリーンショット 2019-07-02 21.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/0c80b3cb-a773-c004-6cb9-ba01cb2138fe.png)

#####3. 必要なライブラリをインストールする。
例えば、DjangoアプリのときはDjangoを仮想環境にインストールする必要がある。```pip install django```と入力する。次に別のライブラリもインストールしていく（```pip install Pillow```）など。
###オンラインサーバーが読み取るためのライブラリリストを作成する
オンラインサーバーでは「ライブラリリスト」を読み込んで、記述されているライブラリがインストールされる。このライブラリリストは「requirements.txt」というファイルになる。仮想環境上で、次のコマンドを入力してライブラリリストのファイルを作成する
```pip freeze > requirements.txt```
すると、フォルダ内にファイルが作成される。
![スクリーンショット 2019-07-02 21.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/aae16a92-e727-cf3e-dc05-db8d3d581b55.png)

ファイルを開くと、インストールしたライブラリのリストが記入されている。

```
Django==2.2.3
Pillow==6.0.0
pytz==2019.1
sqlparse==0.3.0
```

後は、仮想環境上で作業を進めていけばいい。新しくライブラリをインストールした場合、上記の方法で```requirements.txt```を上書き修正する。この際、```requirements.txt```を直接編集しないこと。理由はわからないが、オンラインサーバーが読み取ってくれなくなる。

質問はコメント欄でお願いします。できるだけ調べて回答します。
[link]:https://qiita.com/Wanicosan/items/b9380a26af3caa7d7518
Xcode: Application Loader で upload する際に遭遇したエラー ~ iTMSTransporter および proxy の問題 ~

#Application Loader で upload する際に遭遇した2つのエラー
先日iOSアプリを多言語対応にアップデートしてビルドをuploadする際に以下のようなエラーがでました。
## iTMSTransporter に関するエラー
![iTMSTransporter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193431/7991af93-1e1f-2cd7-56d5-834760dbf219.gif)
いろいろ検索した結果、Qiitaに解決策が投稿されていました。
投稿主の Takanori Morita さん、ありがとうございます!

[XcodeやApplication Loaderでエラーが起こる 〜iTMSTransporterの初期化〜](https://qiita.com/UJIPOID/items/4e74196df0d4bf06a509)

これに従ってターミナルから iTMSTransporter を初期化したら「App Store Connect Operation Error Could not find version: latest of iTMSTransporter to download.」というエラーは消えました。

##Could not connect to Apple's web service. ~ proxy 関連のエラー ~
次に別のエラーに遭遇しました。
![connect.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193431/8c6dfffd-03aa-99bf-4072-1d68f9cea669.gif)
Google で検索したところ Wifi の proxy 設定に問題があるようでした。
システム環境設定 > ネットワーク > Wifiの「詳細」 > プロキシ　まで進み、
![proxy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193431/9ec358d4-ad5b-c1af-399a-8a734a571dde.gif)
「SOCKSプロキシ」のチェックを外しました。
これらにより無事に upload に成功しました。
これと関係あるかどうかわかりませんが、iTunes の Apple Music との接続が最近うまくいってなかった問題も解決しました。
以上、情報共有させて頂きます。
2019/07/02 湊川あいの配信メモ

技術書
わからなかったことや知識をまとめられる
名刺がわりになる
　
3Cをまとめておく
（市場、競合、自分）

テスト公開することで反響を観測

ANDの才能

まず自分が好きなものを考える

ORの抑圧から各領域を重ねる

さらに勝ち目を上げるならもう１つ領域を重ねる

現実的で目指せそうな目標

GitHubを使った執筆

まずは個人で書いてみるのも手

技術書は書ける！

コンテンツで集客したい！

いきなり書き始めるのはNG

ざっくり３C　小さくテストマーケティング　Googleサーチコンソールで新規需要を発掘

上手くいくことだけではない

「この切り口ではあんまり手応えないな」というのも十分ね成果

凄腕でも打率は３割

ならばバットを振る回数を増やすのみ！

軌道修正か別の3Cに移る

検索されたワードから次のネタを拾い上げる

コンテンツのブラッシュアップ
３Cの精度向上

市場と対話しまくった

上手くいくパターンはアイコンが思い浮かぶくらい具体的に

マーケティングは人間と人間の間にあることなので１対１が無数にあるという感覚を大切に

叩き台でもいいのでアウトプットしてみる

ターゲットは具体的に設定する

年代は曖昧すぎる

既存の解説を参考に自分なりに解釈してアウトプットすることでハードルを下げる

俺のことだとタイトルを見た瞬間にわかってもらえるような絞り方

アウトプットしたいときにインプットする

詳しい人に思いっ切って聞いてみる
ボタン入力で好きな数字を表示できるコード書きました　初心者なんでなんか間違っててもいじめないでね；；

import UIKit

var counter:Int = 0

class ViewController: UIViewController {
    
    
    
    @IBOutlet weak var num: UILabel!
    @IBOutlet weak var button0: UIButton!
    @IBOutlet weak var button1: UIButton!
    @IBOutlet weak var button2: UIButton!
    @IBOutlet weak var button3: UIButton!
    @IBOutlet weak var button4: UIButton!
    @IBOutlet weak var button5: UIButton!
    @IBOutlet weak var button6: UIButton!
    @IBOutlet weak var button7: UIButton!
    @IBOutlet weak var button8: UIButton!
    @IBOutlet weak var button9: UIButton!
    @IBOutlet weak var buttonReturn: UIButton!
    
    @IBAction func button0(_ sender: Any) {
        num.text = String(counter * 10)
        counter = counter * 10
    }
    @IBAction func button1(_ sender: Any) {
        num.text = String(counter * 10 + 1)
        counter = counter * 10 + 1
    }
    @IBAction func button2(_ sender: Any) {
        num.text = String(counter * 10 + 2)
        counter = counter * 10 + 2
    }
    @IBAction func button3(_ sender: Any) {
        num.text = String(counter * 10 + 3)
        counter = counter * 10 + 3
    }
    @IBAction func button4(_ sender: Any) {
        num.text = String(counter * 10 + 4)
        counter = counter * 10 + 4
    }
    @IBAction func button5(_ sender: Any) {
        num.text = String(counter * 10 + 5)
        counter = counter * 10 + 5
    }
    @IBAction func button6(_ sender: Any) {
        num.text = String(counter * 10 + 6)
        counter = counter * 10 + 6
    }
    @IBAction func button7(_ sender: Any) {
        num.text = String(counter * 10 + 7)
        counter = counter * 10 + 7
    }
    @IBAction func button8(_ sender: Any) {
        num.text = String(counter * 10 + 8)
        counter = counter * 10 + 8
    }
    @IBAction func button9(_ sender: Any) {
        num.text = String(counter * 10 + 9)
        counter = counter * 10 + 9
    }
    @IBAction func buttonReturn(_ sender: Any) {
        num.text = String(counter / 10)
        counter = counter / 10
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        num.text = String(counter)
        button0.setTitle("0",for:UIControl.State.normal)
        button1.setTitle("1",for:UIControl.State.normal)
        button2.setTitle("2",for:UIControl.State.normal)
        button3.setTitle("3",for:UIControl.State.normal)
        button4.setTitle("4",for:UIControl.State.normal)
        button5.setTitle("5",for:UIControl.State.normal)
        button6.setTitle("6",for:UIControl.State.normal)
        button7.setTitle("7",for:UIControl.State.normal)
        button8.setTitle("8",for:UIControl.State.normal)
        button9.setTitle("9",for:UIControl.State.normal)
        buttonReturn.setTitle("←",for:UIControl.State.normal)
    }
    
    
}
機械学習に使うツール①

# Numpy
### 行列の作成
```
x = np.array([[1, 2, 3], [4, 5, 6]]) #行列作成
x = np.arange(25) #1からの連番
x = np.arange(25).reshape(5, 5) #5×5行へ変換
x = np.zero((10, 10)) #ゼロ行列 #タプル型であることに注意
x = np.zeros_like(x) #すべての要素をゼロにする
x = np.ones((5, 5)) #1行列 #タプル型であることに注意
x = np.ones_like(x) #すべての要素をゼロにする
x = np.random.rand(10, 2) #0以上1以下の乱数生成
x = np.random.randn(10, 2) #正規分布に従う乱数生成
x = np.linspace(0, 100, 100) #0から100まで100区切り
```
### 行列の操作
```
x[行, 列]
x = np.vstack([x1, x2]) #垂直結合 #vertical
x = np.hstack([x1, x2]) #水平結合 #horizontal
np.vsplit(x, 2) #縦方向に2個に分割
np.hsplit(x, 2) #横方向に2個に分割
x = np.dot(x1, x2) #内積
```
### 統計量の算出
```
np.min(X) #最小値
np.mean(x) #平均値
np.max(x) #中央値
np.median(x) #最大値
np.std(x) #標準偏差
np.var(x) #分散
```

# Pandas
### DF作成
```
np.random.seed(0)#乱数固定

df = pd.DataFrame([[1, 2], [3, 4]]) #データフレーム作成
df = pd.DataFrame({"姓": ["山田", "佐藤","田中"],
                   "名": ["一郎", "二郎", "三郎"]
                   }, index=["1","2","3"])  #辞書型からDF作成

df = pd.DataFrame([["山田","一郎"],
                   ["佐藤", "二郎"],
                   ["田中","三郎"]],
                   index=["1", "2", "3"],
                   columns=["姓","名"])　　#リストからDF作成
```
### DFへのアクセス
```
df.head() #先頭5行
df.tail() #末尾5行
df.describe() #統計量取得
df.columns
df.index
df["特定の列"]　#列の取得
df[1:10] 
df.loc[1:3, ["日本語"]]
df1.append(df2)
df = pd.concat([df1, df2]) #行の追加
df = pd.concat([df1, df2], axis=1) #列の追加
df = df.drop(1) #行の削除
del df["特定の列"] #列の削除
```
### ファイルの扱い
```
df = pd.read_csv("パス") # 読み込み
df.to_csv("パス") #書き込み
```
[iOS]2019/6 リンク集

# はじめに
2019年6月に参考にさせていただいた記事一覧です。
主にiOS関連となっています。

※注意：古い記事もあります。2019年6月に投稿された記事を集めたものではありません。

## UI
・StackView
[StackViewを賢く使ってらくちんAutoLayout](https://qiita.com/yucovin/items/ff58fcbd60ca81de77cb)

・ScrollView
[UIScrollViewにおけるAutoLayoutについてまとめる](https://qiita.com/malt/items/6468921e57a30594d037)

・TableView
[SwiftでTableViewを使ってみよう](https://qiita.com/TD3P/items/cafa8e20029047993025)

・WebView
[iOSのWKWebViewの3つのつまずきポイントと解決方法](https://qiita.com/shunkitan/items/a23b0b109f434a28ab8b)
[iOS(swift)ガワアプリの作成で色々苦労した話](https://qiita.com/am10/items/23ca5b5c8fbbe7ab2b77)

・TextView
[Swift3 でUITextViewのkeyboardを閉じる方法](https://qiita.com/ryosukehujisawa/items/57a777c25c5b1e391b8c)

・TextField
[【Swift】hogehoge.delegate = self は何をしているのか。](https://qiita.com/jumpyoshim/items/7667e0cc81ad91016f03)

## 文法
・enum
[Swiftの列挙型(enum)おさらい](https://qiita.com/hachinobu/items/392c96820588d1c03b0c)

・protocol
[Swiftのprotocolに付ける : class を理解する](https://qiita.com/shimesaba/items/e0c3ae189ca2b247fa98)

## プロジェクト

・BuildSettings - User-Defined
[DebugとReleaseで定義を切り替える3つ目のベストな方法
](https://qiita.com/ko2ic/items/9035e944c3cdeadfae96)

・OSS
[【Swift】Carthage導入手順](https://qiita.com/ShinokiRyosei/items/9b856ebdec5379b6c631)

## git

・[CocoaPods・Carthageでインストールした成果物はバージョン管理に含めるべきか？](https://qiita.com/mono0926/items/636819c42e96a8c4e12d)

## その他

・アーキテクチャ - MVP
[【Swift】MVCから脱却したいのでMVPの勉強をした](https://qiita.com/hicka04/items/25be38a90fdde29c97c2)

・静的解析ツール
[jenkinsとは](https://cloudbees.techmatrix.jp/jenkins/)
insert, update 両方のテストは面倒

データ更新で、レコードがあれば update,
無ければ insert というロジックは、よくあると思います。

このとき、両方のテストをしなきゃいけないのが面倒です。
insert が正常でも、update にバグがあるかもしれないからです。

```php
//レコードが無ければ insert
if ( $exist == false ) {

    $sql = "insert into 社員マスタ ( ShainNo, Name, Address, Tel ) values ( $ShainNo, '$Name', '$Address', '$Tel' )";

//レコードがあれば update
} else {

    $sql = "update 社員マスタ set Name = '$Name', Address = '$Address', Tel = '$Tel' where ShainNo = $ShainNo";

}

//ホントはプリペアドステートメントにしてね
$dbh->exec($sql);
```

でも、本記事の最後に述べる**「ズボラ方式」**にすると、
テスト工数も減らせるし、楽です。

##正規のコーディングの場合

例えば「社員マスタ」の更新なら、
社員番号 ／ 名前 ／ 住所 ／ 電話番号 ・・・ の項目を、
１個ずつ、問題なく格納されるかをチェックします。

まず insert のテストをします。問題なければ update のテストですが、
同じ値でそのまま update するのはダメです。
insert で登録した値とは 別の値で update します。

例えば、[山田] で insert したら、
[山田２] で update して、確実に update したかをチェックします。

これをしないと、
「しまった！ update で住所だけ更新がモレてた！」
と後になって気付くことも ありえます。

:thinking: :thinking: :thinking:

仮に、テーブル定義から自動でＳＱＬを生成する
O/Rマッパー？（←ゴメン よく知らないの）があれば
コーディングもテストも楽ですが、そんなものも無く、
ＳＱＬを直接ゴリゴリ書く会社も未だあります。

以下は、そんな会社のプログラマーのための、
「ズボラ方式」の紹介です。

##ズボラ方式

insert では、一度に全カラムを登録するのではなく、
主キーのみ登録(insert)して、直後に他のカラムを update します。

「社員マスタ」の場合、名前や住所は空白のまま、
まず主キーの社員番号のみ 値を設定して insert します。
そして直後に、名前や住所に値を設定して update します。

（最初から update の場合は、update の処理のみ おこないます。）

```php

//レコードが無ければ 主キーのみ insert
if ( $exist == false ) {
    $sql = "insert into 社員マスタ ( ShainNo ) values ( $ShainNo )";
    $dbh->exec($sql);
}

//レコードの有無にかかわらず update
$sql = "update 社員マスタ set Name = '$Name', Address = '$Address', Tel = '$Tel' where ShainNo = $ShainNo";
$dbh->exec($sql);

//しつこいけどプリペアドステートメントでね
```

ズボラ方式の利点は、insert のコーディングとテスト工数を
削減できることにあります。
insert と update のロジックが ほぼ同じだからです。

##問題点？

●insert のときは、insert と update で２回アクセスが発生する。

>頻繁に更新するテーブルなら１回のアクセスに抑えるべきですが、
>マスタ登録のように たまに更新する程度なら、
>２回アクセスでも問題ないと思います。

●ほんの一瞬だが、名前や住所が空白のレコードが存在することになる。

>もし気になるなら、insert ～ update をトランザクションにすることで、
>空白のレコードが 他のユーザに見えないようにできます。

●別のズボラ方法として、delete 後 insert してもいい？（ update 省略のため ）

>これは・・・、なるべく やめましょう。
>何となくですが。
Boostnote > Editor Theme が変更できない時の対処

**Prefrences > Interface > Editor > Editor Theme**
上記をたどって Editor Theme を変更しても、文字色や背景色が反映されないことがあります。その場合の対象は以下の通り(2019/07/02の段階での対処法)。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298037/03df24fd-9a8d-50ef-0672-309fcc315958.png)
下記を参考にしています。
[Editor themes aren't working since the new release · Issue #3018 · BoostIO/Boostnote · GitHub](https://github.com/BoostIO/Boostnote/issues/3018)
コードを見る限り、参照とすべきパスに誤りがあるために設定が反映されないようです。

まずは太文字で示している、
\boost\app-0.11.16\resources\app\compiled\main.js
を開きます。

>Octen commented on 24 May
Fix in new release for Windows 7, on the advice of @bwarfson
Edit **\boost\app-0.11.16\resources\app\compiled\main.js**
Find :

main.js は20万行以上の大きなファイルなため、エディターで開くまでに少し時間がかかるかもしれません。main.js が表示されたら、下記コードを見つけてください。
私は **path: path.join(directory.split(/\//g).slice(-3).join('/'), file),** で検索しました。

```javascript
	var themes = paths.map(function (directory) {
	  return fs.readdirSync(directory).map(function (file) {
	    var name = file.substring(0, file.lastIndexOf('.'));

	    return {
	      name: name,
          // ↓ 変更前
	      path: path.join(directory.split(/\//g).slice(-3).join('/'), file),
	      className: 'cm-s-' + name
	    };
	  });
	}).reduce(function (accumulator, value) {
	  return accumulator.concat(value);
	}, []).sort(function (a, b) {
	  return a.name.localeCompare(b.name);
	});
```
該当箇所を見つけたらそこを書き換えます。書きかえると言っても以下の一行のみです。
【変更前】**path: path.join(directory.split(/\//g).slice(-3).join('/'), file),**
【変更後】**path: path.join(CODEMIRROR_THEME_PATH, file),**

```javascript
	var themes = paths.map(function (directory) {
	  return fs.readdirSync(directory).map(function (file) {
	    var name = file.substring(0, file.lastIndexOf('.'));

	    return {
	      name: name,
          // ↓ 変更後
	      path: path.join(CODEMIRROR_THEME_PATH, file),
	      className: 'cm-s-' + name
	    };
	  });
	}).reduce(function (accumulator, value) {
	  return accumulator.concat(value);
	}, []).sort(function (a, b) {
	  return a.name.localeCompare(b.name);
	});
```

これで Editor Theme で設定したテーマが反映されるはずです。確認してみてください。
Laravel初心者が、0から勉強するのに利用したオススメの厳選5サイト！

##  はじめに
最近、ほとんど知識が無い状態からPHP、Laravelを勉強し始めました。
なかなか思うように進まないので、勉強するために本やサイトをたくさん参考にさせていただきました。

サイトごとに特徴があり、すべてを見るには時間がかかってしまいますが、復習になったり、以前学んだことを補いながら新しい知識をつけることが出来ました。
ここではその中から特にお世話になったサイトを5つに絞ってご紹介いたします。

この記事をLaravelの学習に役立てて頂ければ幸いです。

## [1.Laravel学習帳](https://laraweb.net/)
[![Image from Gyazo](https://i.gyazo.com/90f93e446d63e8b3fe0873d208b55596.png)](https://laraweb.net/)

このサイトはLaravelの学習にサイト特化して、Laravel環境構築、基礎知識、周辺知識などが学ぶことが出来るウェブサイトです。

説明がわかりやすく、補足の説明へのリンクも豊富ですので、まずはこのサイトから始めるのがいいかもしれません。
僕はこのサイトのおかげで、Laravelに馴染むことが出来ました。

テキストですので、自分のペースで読みながら勉強を進めることが出来ます。
分からないところを何度も読み返して、理解を深めて行きましょう。

## [2.PHP-Junkie](https://php-junkie.net/)
[![Image from Gyazo](https://i.gyazo.com/02fba14265590575bc8628e5f5b35c11.png)](https://php-junkie.net/)
このブログはフリーランスエンジニア[むちょこ@webエンジニア](https://twitter.com/aya_lachelier)さんが運営しているサイトで、プログラミング初学者のための学習方法やPHPの基礎を学ぶことができます。

実際に働いているエンジニアさんが書いているサイトなので、本気でプログラマーになりたい人はおすすめです。

##[3.ドットインストール](http://dotinstall.com/)
[![Image from Gyazo](https://i.gyazo.com/75de0e9ee92f7bc8080dc9202bf28433.png)](http://dotinstall.com/)
超有名サイトで、ほとんどの人がすでに知っているかもしれませんが、僕の方でも紹介しておきます。

こちらのサイトはレッスンの数がたいへん豊富で、どの言語を学ぶ人にとっても参考になるレッスンが用意されています。

（html,css,JavaScript,Rubyなど）

最新のコンテンツは有料会員限定ですが、多くのレッスンを無料で閲覧することが出来ます。

また、無料の会員登録をすることで、自分の受けたレッスンを記録することが出来ますので、100%目指して進めていくとモチベーションをあげることが出来ます。

知識を身に付けるだけでなく、実際に簡単なサービスを作るような講座も用意されていますので、「このサービスの仕組みはこうなっていたのかぁ～」と、今まで知らなかったサービスの中身を知ることが出来ます。

少しアレンジを加えれば、自分作アプリを簡単に作ることが出来ます。


## [4.Laravel 5.5](https://readouble.com/laravel/5.5/ja/)
[![Image from Gyazo](https://i.gyazo.com/4d37e4d37f10acb87cb331c227fc2c0f.png)](https://readouble.com/laravel/5.5/ja/)

このサイトは最新のフレームワークLaravel5.5について学べることができるサイトです。

Laravelプレームワークの構造理解、セキュリティ、フロントエンドなど深く知ることができます。

※ちなみに設定で背景色を変ることができます
[![Image from Gyazo](https://i.gyazo.com/c8fdbc511b03b479fb80f386304ef660.png)](https://readouble.com/laravel/5.5/ja/)
##[5.LARACASTS](https://laracasts.com/)
[![Image from Gyazo](https://i.gyazo.com/8af903ce7bc940bfc0566613277ef33d.png)](https://laracasts.com/)
このサイトは、6時間半にも及ぶLaravel入門講座全てが無料で、学べるサイトです。

動画としてもクオリティーが高いし、かなり数があるので、おすすめです。

欠点として、全て英語で字幕がないことです。とはいえ基本的に動画内で講師がコーデディングしてくので、コードを追って勉強することはできます。

## 最後に
コーダーに求められるのは、「新しい言語を身に付ける」だけではなく、「キレイなコードを書く」ことも求められます。

勉強し始めていきなりキレイなコードを書くのは難しいので、まずは自分の学んだ知識をフルに使って、汚くてもいいのでどんどんコードを書いていきましょう。

新しい言語に慣れてきたら、今度はきれいなコードを書けるようにしていきましょう。
覚えておきたいSassの基本的な機能８選


CSSの拡張メタ言語である**Sass(Syntactically Awesome StyleSheet)**を学習しているなかで、個人的に覚える必要があると感じた基本的な記法をまとめた。

## Sassの記法の種類
Sassの記法は**SASS記法**と**SCSS記法**に分かれているが、この記事ではCSSとの互換性が高いSCSS記法に沿って記述する。

## Sassの基本的な機能

### １．ネストを使ったスタイルの記述
親要素のなかに子要素のスタイルをネストして書くことができる。同じ要素のセレクタを何度も書く必要がなくなる。

```sample1.scss
.wrapper {
  height:100vh;
  width: 100vw;
  .box {
    height: 20px;
  }
}
```

### ２．コメントアウト

```sample2.scss
.wrapper {
  height:100vh;
  width: 100vw;
}
//Sassファイルのみ反映されるコメント
/*SassとCSS両方で反映されるコメント*/
```
CSSのコメントアウトには`/* */`が用いられるが、Sassでも同様に利用できる。またSassでは、`/ /`を用いてもコメントアウトができる。

### ３．別ファイルへのパーシャル
ファイルを複数に分割（パーシャル）し、それらの内容を別ファイルにインポートすることができる。１つのファイルに記述する内容が少なくなることから、可読性が良くなり、修正・変更が容易になる。

```configs/_reset.scss
* {
  margin:  0;
  padding: 0;
}
body {
  font: 100% Helvetica, sans-serif;
  background-color: #efefef;
}
```

```sample3.scss
//分割したファイルの読み込み
@import "./configs/reset.scss"  
```

分割したファイル名は`アンダースコア（_）`を先頭につける。ファイルを読み込む際には`@import "ファイル名"`と記述するが、その際にはアンダースコアは外すことに注意する。


### ４．値の演算
値を演算して求めることができる。

```sample4.scss
.wrapper {
  height: 1000px - 100px;  //900px
  width: 100px * 2;  //200px
}
```

### ５．&（アンパサンド）を使った要素の参照
`&（アンパサンド）`を用いてセレクタを参照することができる。

```sample5.scss
.box {
  height: 100vh;
  width: 100vw;
  & p {
    height: 20px;
    color: white;
    &:hover {
      color: gray;
    }
  }
}
```
```sample5.css
.box {
  height: 100vh;
  width: 100vw;
}
.box p {
  height: 20px;
  color: white;
}
.box p:hover {
  color: gray;
}
```


### ６．$を使った変数定義
`$変数名: 値`として定義した変数に値を代入することで、以降のプロパティの値として変数を利用できる。


```sample6.scss
$text-color: #f7f7f7;  //変数の定義

p {
  height: 20px;
  color: $text-color;
}
```

### ７．mixin/include
複数のまとまったプロパティと値をmixinで予め定義し、includeで同じスタイルを別のセレクタにも適用することができる。

```sample7-1.scss
@mixin gradation-green {
  background-color: #08AEEA;
  background-image: linear-gradient(0deg, #08AEEA 0%, #2AF598 100%);
}

.box {
  @include gradation-green;
}
  
```

mixinを使って定義する場合は`@mixin mixin名 {}`と記述する。定義したmixinは`@include miｘin名`で呼び出すことができる。

**※引数を使ったmixinの定義(応用)**
mixinでプロパティと値を定義する際、引数を設定することで、includeで呼び出すたびに値を変更できる。

```sample7-2.scss
@mixin position($top, $right, $bottom, $left) {
  position: absolute;
  top: $top;
  right: $right;
  bottom: $bottom;
  left: $left;
}

.box {
  @include position(0, 0, 0, 0);
}
```

### ８．extend
extendを用いて、既に記述されているセレクタのプロパティと値をそのまま適用することができる。

```sample8.scss
.message {
  height: 20px;
  font-size: 20px;
  font-weight: bold;
  color: white;
}

.message1 {
  @extend .message;
  color: blue;
}

.message2 {
  @extend .message;
  color: green;
}
```
`@extend セレクタ名`と記述することで任意のセレクタのスタイルを適用する。


## 参考にした記事
[Sass Basics](https://sass-lang.com/guide)
[Sassを極める！デザイナーがすぐ実践できる基本テクニック12連発](https://liginc.co.jp/web/html-css/css/59325#tq1)
ASP.NET Core で複数の環境を使用するときにハマった話

# 前提

下記のような環境で、Web APIと複数のコンソールアプリを開発していました。

* .NET Core 2.2
* Windows Server 2012 R2/IIS 8.5

さらに本番環境と検証環境でDBの接続先を変更するため、下記のような構成でappsetting.jsonを構成

[設定ファイル]

* appsettings.json
    * appsettings.Development.json
    * appsettings.Staging.json
    * appsettings.Production.json


# 問題

[ASP.NET Core で複数の環境を使用する](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/environments?view=aspnetcore-2.2)

こちらのリンクの[環境を設定する]>[Windows]の項を読んで、システムの環境変数を使えばよいと早合点していました。実際、コンソールアプリに関しては問題なく動いていました。

しかし、IISのアプリケーションプールで実行するアプリでは、**システムの環境変数の値は参照されません。**
もっと悪いことに**未設定の場合、Productionがデフォルト値になるようです。**最悪の場合、気付かずに検証環境から本番環境にデータ更新をかけてしまう危険があります。

# 対策

発行プロファイルにEnvironmentNameを明記することで、自動生成されるweb.configにASPNETCORE_ENVIRONMENTの設定値を明記できます

[ASP.NET Core モジュール>Web.configでの構成>環境変数の設定](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2#setting-environment-variables)

## 追記 2019/07/05

デフォルトでProductionが選択されてしまうという危険性を考えると、本番環境=Productionという選択自体をすべきでないかもしれないですね。