OmniAICreator/Qiita-1.07M huggingface dataset:
【俺得】EC2からS3へのアップロード

#やりたい事
EC2からS3へファイルのアップロード
エンドポイント経由にてセキュアな通信経路でファイルアップロードを実現

#構成図
<img width="675" alt="構成図.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/9a2de0a0-0dfb-093c-3f73-544e1944afcd.png">


#手順
##S3バケット作成
マネージメントコンソールにてS3作成する
1
<img width="1128" alt="s31.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/6b470e06-085f-8ae0-78e5-bc27573380a7.png">

2
<img width="1128" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/409aa15e-e11d-9f31-61ca-66a570128424.png">

3
<img width="1137" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/4cd98db6-526d-9741-f0cb-9a3b7fcab214.png">

4
<img width="1128" alt="4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/626671f0-0b69-6124-3cb6-c9bbe99de656.png">

5
<img width="1128" alt="5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/4dc1a5da-4f7e-5ef8-2bec-66830af79af4.png">

##エンドポイント作成
マネージメントコンソールにてエンドポイント作成する
1
<img width="1137" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/11443a59-d663-b9be-7960-6afe6cad0482.png">

2
<img width="1137" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/a7af880d-deda-b132-8cbd-d469568c6838.png">

3
<img width="1137" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/9393b8e4-b108-6505-6f68-2a2ff2b91e35.png">

4
<img width="1137" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/4782baac-2c0e-45e0-377d-c36b0a7dd131.png">

5
<img width="1137" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/45fd2dc6-1475-b558-b9b3-33d70083e9f9.png">

#結果
EC2側で"gomi"ファイルを作成し、S3へ移動させる。
失敗。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/c4a4f12a-9427-572d-ec1f-6055b6ba6fdc.png)

原因はEC2のロールにS3へPUTするポリシーが付与されていなかった。。。
下記の様な権限を付与。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::oretoku",
                "arn:aws:s3:::oretoku/*"
            ]
        }
    ]
}
```

成功！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498271/014d2d96-5d17-2754-178d-bbb88b5e5513.png)

#総評
シンプルな構成で割と簡単に実現できた。
次はKMS等を利用した場合に取り組みたい。
今回詰まった点は、オブジェクトに対してllコマンドを実施する場合には、
ポリシーのリソース部へバケットを指定する必要がある必要を理解した。

#参考
https://avinton.com/academy/upload-file-from-ec2-to-s3/
C#にpngoutを組み込んでPNGファイルを無劣化で高圧縮

# pngoutとは
Ken Silvermanさんが開発したpng画像を無劣化圧縮するWindowsソフト．
optipngより処理時間は長いが圧縮後のファイルサイズは小さい．筆者の環境ではpngquantは確率2-3 %でファイルが破壊される．よってpngoutが優れていると言える．
GUI版は試用期間のあるシェアウエア．
CUI版は有り難いことにフリーソフトになっている．
商用利用は
http://advsys.net/ken/utils.htm#pngoutkziplicense
によるとDavid Blakeさんに確認してくれとのこと．


### pngout.exeの入手
実行ファイルのあるところにpngout.exeを配置する必要がある．(パスの通っている場所でもいい)
以下から[CUI版をダウンロード](http://advsys.net/ken/util/pngout.exe)する．
http://advsys.net/ken/util/pngout.exe

### 高速化
並列化されていないので処理時間が非常に長い(1枚当たり数分レベル)．
故にファイル毎に並列化して誤魔化す．

#プログラムの説明
ExecutePNGout(...)pngout.exeを呼び出すための引数を作る
in string PathName//pngファイルが入っているフォルダ． ※pngファイルではない．
IEnumerable<string> PNGFiles //フォルダ内のpngファイル群
MaxDegreeOfParallelism//最大並列数
System.Environment.ProcessorCount//コンピュータの論理プロセッサの数を取得(4 cores 8 threadsなら8)．
ExecuteAnotherApp(...)//pngout.exeの呼び出し元

```C#:ExecutePNGout.cs
using System.Threading.Tasks;//setparalle
using System.Linq;
using System.Collections.Generic;
    public static void ExecutePNGout(in string PathName){
        IEnumerable<string> PNGFiles = System.IO.Directory.EnumerateFiles(PathName, "*.png", System.IO.SearchOption.AllDirectories);//Acquire only png files under the path.
        if (PNGFiles.Any()) {//pngファイルがあるか
            Parallel.ForEach(PNGFiles, new ParallelOptions() { MaxDegreeOfParallelism = System.Environment.ProcessorCount }, f => {
                ExecuteAnotherApp("pngout.exe", "\"" + f + "\"", false, true);//PNGOptimize
            });
        }
    }
    public static void ExecuteAnotherApp(in string FileName, in string Arguments, bool UseShellExecute, bool CreateNoWindow){//外部アプリの呼び出し
        System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo {
            FileName = FileName,
            Arguments = Arguments,
            UseShellExecute = UseShellExecute,
            CreateNoWindow = CreateNoWindow    // コンソール・ウィンドウを開かない
        }).WaitForExit();
    }
```

非常に処理が遅いのでasync awaitを使ってGUIのフリーズを抑えたほうがいいと思います．
[async await の使い方](https://qiita.com/niusounds/items/37c1f9b021b62194e077)
webpackの専門用語

#モジュール
部品のこと。単独でも動く機能をまとめたファイルだけど、普通は組み合わせて使う。ライブラリと同じようなもの？？

#エントリーポイント
モジュール間の依存関係の解析を始める地点のこと。
ここに各モジュールのインポート宣言を記述していく。
*インポート構文でモジュールを読み込んで使う。

#バンドル
各モジュールの依存関係を解析し、まとめられたファイルのこと。
『バンドルする』・・・モジュールをまとめる

#ビルド
バンドル結果を出力するまでの一連の処理のこと。

#コンパイル
実行するのに適した形式に変えて、実行可能なファイルに変換すること。
0と1の機械語に変換したり。

#ホットリロード
ファイルを編集すると、自動的にページをリロードすること。
CentOS 7にPHP 5.4をインストール（OS標準）

# はじめに

CentOS7にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y php which
... 略
```



### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 5.4.16
Release     : 46.el7
Size        : 4.4 M
Repo        : installed
From repo   : base
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```
【Jetson-nano】日本語入力ができた♬

Jetson-nanoで日本語入力出来るようになりました。
なかなかできなくて苦労しました。
つまり、参考の通りUbuntuモードで起動することに尽きます。
【参考】
・[第563回　NVIDIA Jetson Nano Developer KitにUbuntuをインストールしよう！](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0563?page=3)
###やったこと
・Ubuntuモードで起動する
・日本語をMOZCにする
・キーボード入力に使うIMシステムをiBusにする
###・Ubuntuモードで起動する
参考より
「Ubuntuセッションでログインするには，ログイン時にパスワード入力画面の右下にある歯車アイコンから「Unity」ではなく「Ubuntu」を選択してください」
Ubuntuなのかtegraなのかはっきりしろと言いたいところですが、これでUbuntuモードで起動できます。
tegraでもなんとなく近い形はできましたが、右上の日本語選択欄に日本語（mozc）が表示されず、日本語入力はできませんでした。
ということで、このUbuntuモードで話を進めます。
起動したときのDesktopのイメージは以下のとおりです。
※ただし、ブラウザと言語サポートはありませんし、右上の言語入力アイコンも当初はjaなどだと思います
![Screenshot from 2019-09-24 22-21-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/f6a88fbd-466f-b5e0-b927-34c35a1bc416.png)

###・日本語をMOZCにする
ちなみに、日本語（mozc）はJetson-nanoのUbuntu18.04ではプリインストールされているとのことです。
※ウワンは何度かインストールしました、。。。
一応、必要な場合もあるかもなので、参考を上げておきます。
【参考】
・[Jetson Nano:日本語入力できるようにする](https://toyo-interest.com/jetson-nano/jetson-nano%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/)
####入力ソースを日本語（MOZC）にする
設定ー地域と言語ー入力ソースの下の＋押下
ー日本語ー日本語（MOZC）選択して追加ボタン
の順に選んでいけば追加できます。
![Screenshot from 2019-09-24 22-19-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/6fec86ed-f254-879a-579a-1a14cb607b0d.png)
追加できたら、以下のように^ボタンを使って一番上にしましょう。
![Screenshot from 2019-09-24 22-27-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/04bcdad1-b37f-e230-1d18-5eb2be306174.png)
###・キーボード入力に使うIMシステムをiBusにする
次に、言語サポートを呼び出して、IMシステムをiBusに変更します。
言語サポートは左のお気に入りバーの下にある「アプリケーションを表示する」を起動して探しましょう。
たぶん、それほどアプリケーションは多くないのですぐ見つかると思います。
※見つからなければ、検索に「言語サポート」と（コピペして）入力すれば出てきます
そして、言語サポートを起動すると、以下のような入力が出てきます。ここで、最下段の「キーボード入力に使うIMシステム」がXIMなどになっているので、iBusに変更します。
![Screenshot from 2019-09-24 21-44-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/8f69680a-28fb-bac3-e956-410cad3ac283.png)
これで、キーボードの半角／全角キーが有効になって、右上の「あ🔻」の記号が「A🔻」と切り替わるようになります。
※ここで切り替わらない場合は、端末開いてから＞sudo rebootしてください。再起動後に有効になっていると思います
###確認
端末開いてください。
半角／全角キーにより、それぞれアルファベットや日本語が入力できるでしょう。
ということで、会話アプリも日本語が使えるようになりました。
![Screenshot from 2019-09-24 22-48-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/16b3903b-86d6-e67e-86d5-0a0e93f201fb.png)

そして、この記事もJetson-nanoで記述しています。
###まとめ
・Jetson-nanoのUbuntuモードで日本語入力出来るようになった
・日本語会話アプリが日本語入力出来るようになった

・記事書くにはペイントのような画像編集がしたい
・Pyaudioや物体検出を利用したアプリを作ってみよう
出張1on1をすると見えてくる、自分のこころのかたち

先日、出張1on1をしてきました。前回のワークショップの経験も踏まえて、ふりかえりをしていこうと思います。

## 状況

- メンター
  - 自分
- メンティー
  - 相手
- きっかけ
  - Twitterのタイムラインに、相手の方が1on1をしたいとつぶやいていたので、「やりませんか？」とリプライした
- 相手との関係
  - 勉強会で何度か顔を合わせたことはある。社外の人。職業はエンジニアで、自分の職とも近い。
- 事前準備
  - 個人的に本を読んで勉強したことはあったが、相手と事前にレジュメを作ってやりとりしたわけではない

イメージは、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/978b2717-923c-b5bd-292b-d872d725ef1b.png)

上記の図だとすこしフォーマルなイメージになりますが、実際の雰囲気はこんな感じでわりとざっくばらんに話しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/ffa8fe4b-b7c8-6d22-2278-62082980444b.png)


自分が、今回の1on1に期待したのは、**「メンティーの思考がクリアになり、次のアクションプランが明確になること」**でしたが、これは達成できませんでした。

なぜ上記の期待を持ったかというと、前回の1on1ワークショップで経験した「1on1のあるべき姿」を、単純に理想像としたからだと思います。

ワークショップでメンティーになったとき、メンターの人に自分の深層意識を引っ張り出してもらい、抱えていた悩みを自分の言葉にでき、次にやるべき行動が明確になり、とても充実感を得られた経験がありました。

**要は、「自分の充実した体験を、相手にも体験してもらいたい」と思っていたわけです**。

現時点で、この考えの是非は問いません。相手にとってプラスになっていたかどうかは、自分では観測できないことだからです。

## 思考実験で深掘り
さて、今回とは別の状況で1on1をしたら何か変わったでしょうか？
もう少し深掘りしていきましょう。

### メンター、メンティーが逆であったら？
自分がメンティーだったらどうだったでしょうか？

場所は、自分が小声でしゃべっても相手に無理なく聞こえるくらいの場所を選びます。言語化に集中できるからです。しゃべる内容も、予めレジュメを作ったかもしれません。お互いが見える場所にゴールが書いてあったら、話の内容に集中できて、次のアクションプランが生まれる可能性が上がったかもしれないからです。

### 自分がお金を頂く立場であったら？
自分がプロのメンターとしてお金をいただく立場だったらどうでしょう？

この場合、メンティーの行動が違ってくるような気がします。事前準備をきっちりやりたくなりそうな気がします。当日に向けてメンティーが自分なりに考えて準備しておくと、メンティーは達成感を感じやすいと思います。なので、当日までのエスコートといえば良いんでしょうか、レジュメもそうだし、準備をきっちりやりたいですね。

## まとめ
今度1on1 をするなら、もっと効果の高い、もっと効率的なやり方でやりたいですが、自分の求める姿を追求していくこととは違った種類のアプローチが必要になりそうな気がします。

相手の時間の感じ方、成長に対するモチベーションは人それぞれなので、相手の満足感を基準にしてゆきたいです。そのためにも、**事前のゴール設定と、1on1をする環境は、事前に認識を合わせたい**ですね。

自分のやりたいことで相手に与えられる価値があり、しかも、それが自分がされて嬉しいことであったなら、言うことないですね。そのようにこれからも努めてゆきたいです。
ssh とは何か

同僚に ssh って簡単に説明すると何？と質問を受けた。
私は、ssh を`ただのサーバーにアクセスするために使うコマンド`くらいとしか認識していなかった。
そこで少し調べてみた。

## ssh とは
ssh は、Secure SHell（セキュアシェル）の略。

> sshとは、主にUNIXコンピュータで利用される、ネットワークを介して別のコンピュータにログインして操作するためのソフトウェアの一つ。通信経路が暗号化されるため、インターネットなどを経由しても安全にアクセスすることができる。
>
> 引用元: http://e-words.jp/w/ssh.html

その昔は、`telnet` というコマンドを使って平文で接続していたが、安全性にかけているため現在では ssh による接続が一般的のようだ。

## なぜセキュアなのか？
ssh といっても接続方法には二種類ある。
1. パスワード認証
2. 公開鍵認証

パスワード認証については、ID/PWさえ分かってしまえば接続できてしまうため、それほど安全ではない。基本的には公開鍵を使った認証による接続が良い。

なぜセキュアかを、超簡単にいうと、公開鍵で暗号化した通信内容はその対になる秘密鍵が無いと暗号を解読できないから。

公開鍵認証の仕組みについて知りたい場合は、以下
[公開鍵暗号について理解が足りていなかったのでメモ](https://kasei-san.hatenadiary.org/entry/20120329/p1)
やその参照先の
[鍵交換方式による認証](http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/ssh_key.html)
を読んでみるといいと思います。

## OpenSSH とは
ssh の仕組みを簡単に使えるようにしたオープンソースのソフトウェア
https://www.openssh.com/

## ssl とは違うのか
ssl は、セキュアソケットレイアーの略。
公開鍵認証を使って、 TCP/IP での暗号化通信を行うプロトコルで、トランスポート層を利用する。（ssh はアプリケーション層）
ssl 3.0 から名称が、TLS に変わったらしい。

参考: http://e-words.jp/w/SSL.html

## ssh についてのその他。

### ssh が22番ポートを使用するようになったのは、学生の提案
https://gigazine.net/news/20170505-ssh-port-number-22/

### randomart
randomart は、`ssh-keygen` で公開鍵を生成した時に表示される AA みたいなやつ。
[SSHなるものをよくわからずに使っている人のための手引書::Q. 「randomart」ってなに？](https://qiita.com/kenju/items/b09199c4b3e7203a2867#q-randomart%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB)

ssh接続する度にこの絵柄を表示して、ローカルの鍵（`~/.ssh/id_rsa`）が書き換えられていないか確認するという考え方はおもしろい。

### scp と sftp
いずれもリモートコンピュータと ssh を使用してファイルやり取りする方法だが、以下のような違いがある。
> ◆SCP
・転送の再開ができない。
・SFTPに比べて高速（と言われている）
・フォルダの送信はできない。（クライアントソフトを用いれば可能）
>
> ◆SFTP
・転送を中断しても、途中から再開できる。
・SCPよりも転送速度が遅い
>
> 引用元: https://www.skyarch.net/blog/?p=379
DB Browser for SQlite でdevelopment.sqlite3が開けないを脱却する方法

タイトルの通り、DB Browser for SQlite でdebvelopment.sqlite3が開けず、死ぬほど苦戦したので、自分の様な方を一人でも減らせたらと思い、Qiitaに初投稿します。少し前置きがあるので、解決策だけ知りたい方は**「解決の手順」**から読んでくださいね！！


※Railsど素人が、かろうじて解決した方法です！参考程度に見ていただき、他にいい方法やご指摘あれば、ガンガンコメントしていただければ嬉しいです！！


#想定する環境
Rails　5.2.3
sqlite3
DB Browser for SQlite3 を使用


#今回の状況を整理
<img width="938" alt="スクリーンショット 2019-09-23 17.15.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442940/851650dd-ee71-f676-9f95-612da7313eb7.png">

おいおい。。。
いつもクリックしてファイルの中身を「DB Browser for SQlite」で確認しとったのに、中身がないどころか開けへんやんけ！！💢:relaxed:


と、、、愛着のあるMac Bookに八つ当たりしそうになり、解決策を模索。
情報もないし、　terateilで聞いても解決できず。。
俺のプログラミング人生はもうおわりなのかーー！！

と諦めたその時、たまたま誤操作で解決してしまう。
神様ありがとう。。




さぁ興奮して前置きが長くなりましたが、ここからその解決策を書いていきます！



#解決のポイント

まずは、原因がどこにあるかを模索する。自分の場合では全てのプロダクトファイルで上記の様な状態になったので、**「ファイルではなく、DB Browser for SQlite」**に問題があると断定。


#解決の手順
①まずは、DB Browser for SQliteで左上の**「Open Project」**をクリック。開きたいファイルを検索し、以下の様な状態にする。
<img width="938" alt="スクリーンショット 2019-09-23 20.41.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442940/f3a1e258-13fd-a971-ad17-7756b8984dd9.png">
②今回開きたいのは「development.sqlite3」なので、その上で右クリック！


<img width="938" alt="スクリーンショット 2019-09-23 20.46.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442940/84587bf2-f878-7485-2739-aac2d928ede6.png">

③そして**「Notes」**で開く！

④そして**「Notes」**で保存したファイルを開く！
(まずは、この時点で一旦開けると思います！ただ、このままでは、その後の変更がDBに反映されません。)

⑤そこで、上の真ん中の方の**「Attach Database」**をクリック！これで、さっき右クリックしたファイルが、やっと開けるはず！！

⑥そして最後は、開くTableを「development.◯◯◯◯」に変更。
（例　**example →　development.example**）

⑦はい解決！！！！！:thumbsup_tone2:

#まとめ
Rails絶賛勉強中なのに、こんなわけのわからない挙動で手こずってしまいました！💢危うく大好きなMacBookちゃんを叩き割ってしまうとこでした。。(^◇^;)
僕みたいなエラーにつまずく人と、皆さんのMacbookの命のために、少しでもこの記事がお役に立てれば幸いです！

最後までお読みいただき、ありがとうございました！！
【Rails】tableのinsert処理でエラーが発生

# 結論
**class名が違った！！**

# 原因
schema.rbのtable名からusers_controller.rbを作成し、エラー

``` :schema.rb
create_table "users_test", force: :cascade do |t|
    t.string "name"
    ・・・
end
```

``` :users_controller.rb　エラー
def create
  @users_test = User_test.new
end
```

# 解決
models/user_test.rb内を確認すると下記のようになっていた

```
class UserTest < ApplicationRecord
end
```

``` :users_controller.rb　修正後
def create
  @users_test = UserTest.new
end
```

修正後無事に解決。
python#'is'と'=='

Pythonには'is'と'=='でObjectが同じかどうかを比べるOperatorがあります。
たまたまに実際どんな違いがあるの？と思いませんか？
今回はこの子たちのこと少しみよう。では、まず英語からこの2つの意味をみてみしょう。

*  '=='はEqualityをチェックする、つまり2つの値が同じかどうかをチェックするのです。
*  'is'はIdentityをチェックする、つまり2つのもの完全メモリ上で完全に同じなObjectである。

それでも思いつかないのね。では少しScriptを書きながらを考えましょう。

いま机の上に2つの飲み物があります。ここでビールとお茶にしましょう。
簡単な質問、ビールとお茶は同じですか？答えはもちろんFalseです。

```python
print('beer'=='tea')#False
```
では今度机の上にビールが2つおいておきました。
この2つの飲み物もビールですか？もちろんTrueです。

```python
print('beer'=='beer')#True
```

これだけの比べは足りるでしょうか？それはあなたのプログラムによりますね。机の上にある2つのビール、一つは朝日スーパードライ。もう一つは一番搾り。それでも”同じ”に言えるかどうかはあなた次第です。
今度は2つのリストを作ります。l1とl2は違う値が入っています。それならもちろんFalseです。

```python
l1=[1,2,3,4,5]
l2=[1,2,4,5]
print(l1==l2)#False
```
今度は同じの値が入ってるリストを2つ作ります。あれ？'is'で比較するとFalseになり'=='で比較するとTrueになりましたね。
最初にに言ったが'=='は2つの値が同じかどうかをチエックするのでTrueです。
そして'is'は2つのリストは違うObjectなのでFalseになります。
だから？もしあなたが2つのObjectが同じかどうかを知りたいなら、'is'を使えましょう。

```python
l3=[1,2,3,4,5]
l4=[1,2,3,4,5]

print(l3==l4)#True
print(l3 is l4)#False
```
いまなら返す結果はTrueになります。だってl6はl5と同じだもん。

```python
l5=[1,2,3,4,5]
l6=l5
print(l5 is l6)#True
```
念の為にちょっとチエックしましょうか。l8とl7を作って、そしてl7の1個目の値を変えてみましょう。
うん、同じだねーそれはどんな意味をもっているでしょうか？つまり2つのリストが同じのアドレスを指しててどっちかを変更しても別のObjectの変わることです。

```python
l7=[1,2,3,4,5]
l8=l7
l7[0]=6
print(l7)
print(l8)
#[6, 2, 3, 4, 5]
#[6, 2, 3, 4, 5]
```
最後、2つのObjectのアドレスから見てみましょう。同じですね。

```python
l9=[1,2,3,4,5]
l10=l9
print(id(l9))#4306980040
print(id(l10))#4306980040
print(id(l9)==id(l10))#True
```
データの可視化でよく使うコード

Qiita初投稿です。「とにかく投稿することに意義がある！」というどこかで聞いた言葉を信じて、普段データの可視化分析をする時によく使うコードを備忘録的に書いておこうと思います。


# データの取得

csvファイルの形式でデータファイルが保存されている場合が多いので、それを前提とします。

```python
import pandas as pd

path = "./data.csv"

data_df = pd.read_csv(path, engine="python")
```
データの読み込みは、pandasの`read_csv`を使用しています。引数`engine="python"`は、Windows環境では書いておかないとエラーになります。理由はよくわかりません。

# データの概要をチェック

読み込んだデータの中身をざっと俯瞰します。

```python
import pandas_profiling as pdp

data_df.info()

pdp.ProfilerReport(data_df)
```
`pandas.info()`でデータ型や欠損の有無などを見ます。
また、`pandas_profiling.ProfilerReport()`を使うと、各変数の最大・最小や平均値、ヒストグラム、相関ヒートマップなどを一気にみることができ、非常に便利です。

# 散布図行列の出力
各変数の分布をざっとみるために、散布図行列を使います。

```python

import seaborn as sns

sns.pairplot(data=data_df, hue="target", diag_kind="kde", kind="reg")
```
引数`hue`でカテゴリ変数のカラム名を指定することで、カテゴリごとに自動で色分けしてくれます。ここでは目的変数で色分けしていることを想定しています。
引数`diag_kind`を指定すると、対角成分のグラフを変更することができます。kdeはカーネル密度推定(Kernel Density Estimation)です。


# 線グラフ
時系列データを可視化するときなど。

```python

data_df.plot(figsize=(15,4), title="title")
plt.show()
```
pandasのplotメソッドをそのまま使ってしまうことがほとんどです。
クラス別に、同じ図に描画するときは、新しいDataFrameを作ってしまいます。

```python

class_list = list(data_df["target"].unique())
plot_df = pd.DataFrame()

for c in class_list:
    tmp = assign_df[data_df["target"] == c].loc[:, "plot_param"]
    tmp = pd.DataFrame(list(tmp), columns=[c])
    plot_df = pd.concat([plot_df, tmp], axis=1)

plot_df.plot()
plt.show()
```

このコードでは欠損値を考慮していません。


# 終わりに
記事書くのって難しい。。
改めて自分のコード見直すと色々ダメなところが見えてきて勉強になります。
vimでファイルを開く

技術書典7で**vimが好きになる本**を購入したので、**vimが好きになる本**を参考にしながら、
おらなりにいじって、使い方を覚えるために、簡単にまとめたものを、Qiitaに投稿していこうと思う。

# ファイルを開く

下記のディレクトリとファイルがあったとする

```:ディレクトリ
~/
  aiueo.txt
  kakikukeko.txt
  sasisuseso.txt
```

vimでファイルを開くには、
`vim {ファイル名} <ENTER>`とコマンドを打つ

```:sh
$ vim aiueo.txt
```

<img width="1496" alt="スクリーンショット 2019-09-24 21.46.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/9cf286a8-a7b6-adde-e4c2-a079d6ec138a.png">

vimの中で、ファイルを開くときは、
`:e {ファイル名} <ENTER>`とコマンドを打つとファイルが開ける

```:コマンドライン
:e kakikukeko.txt
```

<img width="1496" alt="スクリーンショット 2019-09-24 21.51.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/6ddd0cba-13c2-dfbf-9376-44fc21b669c3.png">

vimには、横にウィンドウを分割して開いたり、縦にウィンドウを分割して開いたりできる。

横にウィンドウを分割するには、
`:new {ファイル名} <ENTER>`とコマンドを打つ

```:コマンドライン
:new sasisuseso.txt
```

<img width="1496" alt="スクリーンショット 2019-09-24 21.58.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/7ba1d35b-3df2-214e-ca7f-9d2b75df61ab.png">

縦にウィンドウを分割するには、
`:vnew {ファイル名} <ENTER>`とコマンドを打つ

```:コマンドライン
:vnew aiueo.txt                                                                                                                                                                                                              
```

<img width="1496" alt="スクリーンショット 2019-09-24 22.02.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/0f50dd06-836b-ae71-3f46-b6eaab070732.png">

ファイルを見比べるときに使うコマンドかな？


## ちなみに

`:vim {ディレクトリ} <ENTER>`や`e: {ディレクトリ} <ENTER>`と入力すると、

ディレクトリの操作ができる画面になる

```:sh
$ vim ./
```

<img width="1496" alt="スクリーンショット 2019-09-24 22.34.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/70387482-6932-7960-cf0c-70c5a512d88e.png">

ディレクトリの操作についてはまた別で調べていじってみよう。

## 終わり

ウィンドウズをさらに便利に使うには**バッファ**を覚えないといけないみたい
もう頭がいっぱいになりそう。
CentOS 6にPHP 5.3をインストール（OS標準）

# はじめに

CentOS6にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 5.3.3
Release     : 49.el6
Size        : 3.5 M
Repo        : installed
From repo   : base
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated webpages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module which adds support for the PHP
            : language to Apache HTTP Server.
```
【Python】ABC - 093 - Small and Large Integers

# 問題
$A以上B以下$の整数の中で、小さい方からK番目以内であるか、大きい方からK番目以内である整数を昇順ですべて出力する問題。

# 方針
$A以上B以下$の整数の数が$2K$以上か、未満かで場合分けする。
$2K$未満の場合は、$A以上B以下$の整数を昇順ですべて出力すればいい。

```python
A, B, K = map(int, input().split())
if B-A+1 >= 2*K: # A以上B以下の整数の数が2K以上
    res_list = [i for i in range(A, A+K)] + [i for i in range(B-K+1, B+1)]
else: # A以上B以下の整数の数が2K未満
    res_list = [i for i in range(A, B+1)]
for i in res_list:
    print(i)
```
【swift】Imageがめっちゃ充実している件

#Xcodeアップデートの変更点

時間がなくてあまり細かいところまで見れてないですが、、、

とりあえず今回からimageがめっちゃ充実しているみたいですね。

<img width="677" alt="スクリーンショット 2019-09-24 22.22.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/614d3cb8-fc9d-4984-3864-7cf8cf37cdbb.png">

ダークモードも視野に入れた塗りつぶし的なimageに加えて、送信だったり英数字など痒いところに
手が届くようになってる感じがします。

10月中頃まで試験勉強でなかなかアプリ開発に時間置けませんが
ちょっとづつ変更点を探していければいいかなと思ってます。


#profile

生まれも育ちも大阪の浪速中の浪速っ子が30才未経験からITエンジニアとして生きるブログもやってます。
よかったらみてください:muscle_tone2:

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
ハッシュのキーが「文字列」の時と「シンボル」の記法について

#はじめに
- ハッシュ式の書き方は、キーのオブジェクトの種類に応じて書き方が変わります。
- 今日はその内容について簡単にまとめました。

#ハッシュの話
####ハッシュについて
- ハッシュは「キー」と「値」をセットで持つオブジェクトです。
- また、キーに応じた値を呼び出すことができます。

#### キーについて
- キーには文字列、数値、シンボル等、様々なオブジェクトを使うことができます。ただ、キーに置いたオブジェクトの種類によって、ハッシュ式の書き方が異なります。


```rb
hash1 = {"name" => "kazuki"}

#この書き方を「ロケット記法」という
#ロケット記法は俗称
*ロケット記法はキーがどんなオブジェクトでも使うことができる

hash2 = {name: "kazuki"}

#この書き方を「コロン記法」
#コロン記法は俗称
*コロン記法は、キーがシンボルの時に限り使うことができる
```

####値の呼び出し
- 生成したキーのオブジェクトを正しく指定することで値を呼び出せます

```rb
#キーが文字列なら文字列で呼び出し

puts hash1["kazuki"]
#出力結果=>kazuki

#キーがシンボルならシンボルで呼び出し

puts hash2[:name]
#出力結果=>kazuki
```

#まとめ
- ハッシュ式は、キーに置くオブジェクトの種類を意識して書き方を決める
- 値の呼び出しは、キーのオブジェクト種類を正しく指定する
【最新】UbuntuでJavaの環境を構築する方法

## 1.事前知識
- [【超簡単】WindowsにVirtualBoxをインストールする方法](https://qiita.com/ryome/items/519fd7e50fb0b951fd7f)
- [【2019年最新】VirtualBoxでUbuntuの仮想環境を作る方法](https://qiita.com/ryome/items/56e8ee3d5e27bf514e60)

事前知識として、上記リンクの内容が必要です。

## 2.Javaとは
- `Java` とは、クラスベースの `オブジェクト指向プログラミング言語` で、汎用的で `OSに依存しない` ことが特徴です。
- `Java` は、 `処理速度が速く` 、セキュリティ面でも `信頼性がある` 言語です。
- `Java` を選ぶメリットは、その信頼性の高さから `幅広い領域` で使用され、 `ライブラリなども豊富` なことです。

## 3.事前準備
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e2064b94-508e-feb3-4bb5-6a59aa073298.png)

```bash
# リポジトリの追加
$ sudo add-apt-repository ppa:webupd8team/java

# リポジトリからパッケージリストを取得
$ sudo apt-get update
```

1. `Oracle VM VirtulaBox` を起動し、 `仮想マシン` を起動する。
2. `コマンドライン` を起動する。
3. 上記のコードを入力する。


## 4.JREのインストール
```bash
# JREのインストール
$ sudo apt-get install openjdk-6-jre
$ sudo apt-get install openjdk-7-jre
$ sudo apt-get install openjdk-8-jre
```

- 上記の中から `バージョンを1つ選び` 、コマンドを入力する。

## 5.JDKをインストール
```bash
# JDKをインストール
$ sudo apt install openjdk-6-jdk
$ sudo apt install openjdk-7-jdk
$ sudo apt install openjdk-8-jdk
```

- `4.JREのインストール` で選択したバージョンと `同じバージョン` のコマンドを入力する。

## 6.Javaの確認

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/1e73ecf5-40f0-67aa-f3fa-dd37b175a759.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/01deb809-a59c-b630-30e7-0c2afa9a3ea9.png)
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/125b9574-dced-31ec-8226-bf392ac1b0c5.png)
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/5e59a47a-6a48-cf27-d8e2-8d69b65826a7.png)
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ded47d1e-bb52-d0dc-81b6-160f9a1f20c0.png)

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

1. `ファイル` を起動し、 `右クリック` する。
2. `新しいフォルダー` をクリックし、 `フォルダー名` を `Java` にする。
3. フォルダが作成されたことを確認し、 `テキストエディター` を起動する。
4. `テキストエディター` に上記のソースコードを入力し、 `保存ボタン` をクリックする。
5. ファイル名に `Hello.java` と入力し、 `保存ボタン` をクリック。
6. `コマンドライン` を起動し、下記のコードを入力する。

```bash
# Javaフォルダに移動
$ cd Java

# Hello.javaをコンパイル
$ javac Hello.java

# 実行
$ java Hello
```

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/2cdeac0e-d78e-5acc-749f-872b9b862b4e.png)

7.画像のように `Hello World!!` と表示されれば成功。

## 7.知っていると便利なコード

```bash
# javaのバージョンチェック
$ java -version

# javacのバージョンチェック
$ javac -version

# Javaの管理
$ sudo update-alternatives --config java

# Javacの管理
$ sudo update-alternatives --config javac
```
- `java -version` は、 `javaのバージョンの確認` が出来ます。
- `javac -version` は、 `javacのバージョンの確認` が出来ます。
- `sudo update-alternatives --config java` は、`複数のjavaのバージョンを管理` ができます。
- `sudo update-alternatives --config javac` は、 `複数のjavacのバージョンを管理` ができます。
C# ジェネリック型の型名の文字列化（Nullable`→Int32?）

## このドキュメントの内容

デバッグログをテキストファイルに出力したりソースコードを自動生成したりするとき、型名を文字列化したい場合があります。型名は `Type` クラスの Name プロパティで取得できますが、ジェネリック型の場合は "Nullable`1" のような文字列が返されます。型引数は含まれません。

型引数を含む型名を返すメソッドを作成してみます。

* `Nullable<T>` は T? 形式で出力します。
* `ValueTuple<T1, T2, …>` は (T1, T2, …) 形式で出力します。

## ソースコード

```c#

/// <summary>
/// 指定された型のフォーマットされた型名を取得します。
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public string FormatTypeName(Type type)
{
    if (!type.IsGenericType) { return type.Name; }
    return FormatGenericTypeName(type.GetGenericTypeDefinition(), type.GetGenericArguments());
}

/// <summary>
/// 指定されたジェネリック型のフォーマットされた型名を取得します。
/// </summary>
/// <param name="definitionType"></param>
/// <param name="args"></param>
/// <returns></returns>
private string FormatGenericTypeName(Type definitionType, Type[] args)
{
    if (definitionType == typeof(Nullable<>) && args.Length == 1)
    {
        // ex) Int32?
        return FormatTypeName(args[0]) + "?";
    }
    else if (IsValueTuple(definitionType))
    {
        StringBuilder sb = new StringBuilder();

        // ex) (Int32, Boolean)
        sb.Append("(");
        for (int i = 0; i < args.Length; ++i)
        {
            if (i > 0) { sb.Append(", "); }
            sb.Append(FormatTypeName(args[i]));
        }
        sb.Append(")");

        return sb.ToString();
    }
    else
    {
        StringBuilder sb = new StringBuilder();

        // ex) Tuple<Int32, Boolean>
        sb.Append(definitionType.Name.Substring(0, definitionType.Name.IndexOf('`')));
        sb.Append("<");
        for (int i = 0; i < args.Length; ++i)
        {
            if (i > 0) { sb.Append(", "); }
            sb.Append(FormatTypeName(args[i]));
        }
        sb.Append(">");

        return sb.ToString();
    }
}

/// <summary>
/// 指定された型が ValueTuple ジェネリック型であるかどうかを取得します。
/// </summary>
/// <param name="definitionType"></param>
/// <returns></returns>
private bool IsValueTuple(Type definitionType)
{
    if (definitionType == typeof(ValueTuple<,>)) { return true; }
    if (definitionType == typeof(ValueTuple<,,>)) { return true; }
    if (definitionType == typeof(ValueTuple<,,,>)) { return true; }
    if (definitionType == typeof(ValueTuple<,,,,>)) { return true; }
    if (definitionType == typeof(ValueTuple<,,,,,>)) { return true; }
    if (definitionType == typeof(ValueTuple<,,,,,,>)) { return true; }
    if (definitionType == typeof(ValueTuple<,,,,,,,>)) { return true; }
    return false;
}
```
## 実行例

```c#:実行コード
Console.WriteLine(FormatTypeName(typeof(int?)));
Console.WriteLine(FormatTypeName(typeof(Nullable<long>)));
Console.WriteLine(FormatTypeName(typeof(IDictionary<(int, bool)?, Tuple<string, Guid?, DateTime?>>)));
Console.WriteLine(generator.FormatTypeName(typeof(Nullable<>)));
Console.WriteLine(generator.FormatTypeName(typeof(ValueTuple<,,>)));
Console.WriteLine(generator.FormatTypeName(typeof(Tuple<,,>)));
```

```console:実行結果
Int32?
Int64?
IDictionary<(Int32, Boolean)?, Tuple<String, Guid?, DateTime?>>
T?
(T1, T2, T3)
Tuple<T1, T2, T3>
```

## 補足

ソースコードのジェネレーターに使用する場合、名前空間を考慮する必要があります。
GASで記録した自分のツイートを形態素解析するやつ

[GASで自分のツイートを取得してスプレッドシートに記録するやつ](https://qiita.com/yanagiha/items/40c7f0cc140eace11bd8)で記録した自分のツイートを形態素解析してみました。形態素解析にはYahoo!の日本語形態素解析APIを使ってます。

![スクリーンショット 2019-09-24 a21.19.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406061/8b0d6299-b2e5-9257-e137-b7c940a75234.jpeg)
実行すると、このように結果が表示されます。

[Googleスプレッドシートで形態素解析](https://qiita.com/shirayuca/items/f2da6af69c50f38602a3)
こちらの記事を参考にさせていただきました。


```javaScript
function tweetAnalyze() {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var tweetSheet = ss.getSheetByName('ツイートを記録してあるシート');
  var lastRow = tweetSheet.getLastRow();
  var tweetArray = [];
  var j = 0;
  
  //ツイートを配列に格納
  for(i = 2; i <= lastRow; i++){
    tweetArray[j] = tweetSheet.getRange(i,2).getValue();
    j++;
  }
  
  var analyzeSheet = ss.getSheetByName('結果を記録したいシート');
  var analyzeArray;
  lastRow = analyzeSheet.getLastRow() + 1;
  var i = 0;
  
  while(i < tweetArray.length){
    //リプライとURLは除外する
    if(tweetArray[i].indexOf("@") < 0 && tweetArray[i].indexOf("http") < 0){
      analyzeArray = yahooTextSegmentation(tweetArray[i]);
      j = 0;
      while(j < analyzeArray.length){
        analyzeSheet.getRange(lastRow,1).setValue(analyzeArray[j][0]);
        analyzeSheet.getRange(lastRow,2).setValue(analyzeArray[j][1]);
        analyzeSheet.getRange(lastRow,3).setValue(analyzeArray[j][2]); 
        lastRow++;
        j++;
      }
    }
    i++;
  }
}

function yahooTextSegmentation(cell)
{  
  var myAppid = "自分のアプリケーションID";
  var text = encodeURIComponent(cell);
  var myUrl = "http://jlp.yahooapis.jp/MAService/V1/parse?appid="+myAppid+"&results=ma&sentence="+text;

  Utilities.sleep(1000);

  var myXml = UrlFetchApp.fetch(myUrl ,{muteHttpExceptions: true});
  var myDoc = XmlService.parse(myXml.getContentText());
  var namespace = XmlService.getNamespace("urn:yahoo:jp:jlp");
  var root = myDoc.getRootElement();
  var ma_result = root.getChild("ma_result", namespace);
  var word_list = ma_result.getChild("word_list", namespace);
  var word_array = word_list.getChildren("word", namespace);

  var array = [];
  for (var i=0; i < word_array.length; i++) {
    array[i] = [
      word_array[i].getAllContent()[0].asElement().getText(),
      word_array[i].getAllContent()[1].asElement().getText(),
      word_array[i].getAllContent()[2].asElement().getText()
    ];
  }
  return array;
}
```

何かありましたら気軽にコメントください。
StravaのAPIで情報を取得する時に例外が発生してたので対応した

##はじめに
StravaのWebAPIを利用してアスリート情報を取得しようとしたところ、取得できず例外が発生してしまっていました。
単純なことだったんですがハマったので備忘録。

##実装内容
stravaに登録してある自転車情報のbikeidを取得したい。

https://developers.strava.com/docs/reference/#api-Athletes
の中の```bikes```の中に入っている```id```が取得したい。

token取得までの過程はコチラで紹介済み
[StravaのAPIにアクセスしてアカウント情報を取得する](https://qiita.com/satodayo/items/d0077936aa16b6dfd4b7)

ちなみにこのbike情報は以下のような配列の形になっている。

```
"bikes" : [ {
    "id" : "a12345678987655",
    "primary" : true,
    "name" : "IZALCO MAX",
    "resource_state" : 2,
    "distance" : 0
  } ],
 [ {
    "id" : "b12345678987655",
    "primary" : false,
    "name" : "MADON 9",
    "resource_state" : 2,
    "distance" : 0
  } ],
```

そのため取得するためにはまずJSONArrayで配列を取り出してあげる。
通信のところは省略し、```responseData```を受け取ったところから記載する。

```java:getbikeinfo.java
  JSONObject json = new JSONObject(responseData);
  JSONArray BIKE = json.getJSONArray("bikes"); //ここで例外発生

  String bikename[] = new String[BIKE.length()];
  for(int i = 0;i < BIKE.length(); i++) {
    bikename[i] = new String();
    bikename[i] = BIKE.getJSONObject(i).getString("id");
  }
```

これで```getJSONArray("bikes")```のところで例外が発生していた。
でも何度確認してもAPIのDocumentにはbikesって書いてあるし、
間違いなく自転車情報も登録してる。

そもそもresponseDataがうまく受信できてないんじゃないかと思って、
他の情報を取得しようとしたところ```"firstname"```などは正常に取得できた。



なんで？？？ってなって半日くらいハマってた。

##原因
原因は全然違うところにあった。

WebAPIにアクセスするために認証を得る箇所でscopeを指定するのだが、このscopeの範囲が```scope=read```になっていた。
範囲を```scope=read_all```とすることで例外が発生せず、情報を取得できた。

どうやら```read```の範囲だと```bikes```の情報にアクセスできず、例外が発生していたようだ。
```firstname```は取得できていたし、同じ```responseData```のなかでもscopeの範囲が異なるらしい。わかりづらい。
そして少し探したけど各scopeの対象範囲が記載されてなかったので、どこまで取得可能なのかは不明。

##余談 1
もし自転車情報を登録してない人が```bikes```の値を取得しようとしても、それだけでは例外は発生しない。
ただし、取得した情報はnullになってるので、その値を使って何かしようとすると例外が発生する。
そのため自転車情報を取得してない人のためにはこんな感じで弾いてあげるといいと思います。

```java:empty.java
  JSONObject json = new JSONObject(responseData);
  JSONArray BIKE = json.getJSONArray("bikes");
  if(BIKE.isEmpty()){
    hogehoge;
  }
```

##余談 2
認証する時にscopeの値を記載しなくてもtokenが取得でき、この時```bikes```の情報にアクセスできた。
scopeを記載しない場合の取得できる範囲はどこまでなのだろう。


##最後に
もし情報が取得できない！例外が発生する！！
となったら取得部分じゃなくて、認証時のscopeの範囲を見直してみるといいかもしれないです。
【備忘録】確率の重み付け（Python）


- 何かの係を決める際に、自動抽選
- その際に、役職などに応じて当選確率が変動したりすると面白いと思った
- 10人の中から2人を重みを考慮して選出

###### jsonファイルの設定

```json
[
    { "name": "あ", "weight":   5},
    { "name": "い", "weight":   5},
    { "name": "う", "weight":  20},
    { "name": "え", "weight":  30},
    { "name": "お", "weight":  40},
    { "name": "か", "weight":  50},
    { "name": "き", "weight": 100},
    { "name": "く", "weight": 100},
    { "name": "け", "weight": 100},
    { "name": "こ", "weight": 100}
]
```

### 1人を抽選する場合

```python
import bisect
import itertools
import json
import random

#jsonファイル読み込み
with open('member.json', 'r', encoding='utf-8') as f:
    json_data = json.load(f)
    print(json_data)

#リスト化
MEMBER_NAME_LIST = []
MEMBER_WEIGHT_LIST = []
for i in range(len(json_data)):
    MEMBER_NAME_LIST.insert(i, json_data[i]["name"])
    MEMBER_WEIGHT_LIST.insert(i, json_data[i]["weight"])

#抽選用の関数
def lottely_function(weight_list, name_list):
    accmu_add = list(itertools.accumulate(weight_list))
    lottely_num = bisect.bisect(accmu_add, random.random() * accmu_add[-1])
    win = name_list[lottely_num]
    return win

win = lottely_function(MEMBER_WEIGHT_LIST, MEMBER_NAME_LIST)
print(win)


#確認用追加（直上2行は消す）
#重みの合計数試行した場合の各出現数
rom collections import Counter
list_result = []
for i in range(sum(MEMBER_WEIGHT_LIST)):
    win = lottely_function(MEMBER_WEIGHT_LIST, MEMBER_NAME_LIST)
    list_result.insert(i, win)
    print(Counter(list_result))
##結果##
#Counter({'く': 106, 'け': 104, 'こ': 96, 'き': 94, 'お': 49, 'か': 39, 'え': 31, 'う': 18, 'い': 7, 'あ': 6})

```



### 2人抽選する場合

```python
#上記省略
#抽選用の関数
def lottely_function(weight_list, name_list):
    accmu_add = list(itertools.accumulate(weight_list))
    lottely_num = bisect.bisect(accmu_add, random.random() * accmu_add[-1])
    win = name_list[lottely_num]
    return win

win1 = lottely_function(MEMBER_WEIGHT_LIST, MEMBER_NAME_LIST)

while True:
    win2 = lottely_function(MEMBER_WEIGHT_LIST, MEMBER_NAME_LIST)

    if win1 != win2:
        break

win_list = [win1, win2]
print(win_list)

#確認用追加
from collections import Counter
list_result = []
for i in range(sum(MEMBER_WEIGHT_LIST)):
    win1 = lottely_function(MEMBER_WEIGHT_LIST, MEMBER_NAME_LIST)

    while True:
        win2 = lottely_function(MEMBER_WEIGHT_LIST, MEMBER_NAME_LIST)

        if win1 != win2:
            break

    win_list = [win1, win2]
    print(win_list)
    list_result.insert(2*i, win1)
    list_result.insert(2*i+1, win2)

print(Counter(list_result))
##結果
#Counter({'き': 206, 'け': 196, 'く': 196, 'こ': 177, 'か': 93, 'お': 87, 'え': 76, 'う': 47, 'あ': 12, 'い': 10})
```

## まとめ＆今後

- 重み付けできた
- 当選確率を操作できる
- 当選者が複数の場合のレート指定はどうやるか？
- 確率を少し復習

## 参考

http://www.lancarse.co.jp/blog/?p=707
https://qiita.com/arc279/items/c6817011b0155d3ff9d3
https://docs.python.org/ja/3/library/bisect.html
【Python】ABC - 094 - Toll Gates

# 問題
$0, 1, \ldots, N$のマスが左右に一列に存在する。最初与えられた$X$にいて隣り合うマスには自由に移動ができる。移動している中で与えられたマス$A_i$を通る際にコストがかかるという問題設定。マス$0$またはマス$N$のどちらも目指すことができる場合、最小となるコストを求める問題。

# 方針
1. マス$0とN$を目指すときのそれぞれのコストを求める
2. 求めたコストを比較し、最小となるコストを出力する

# 工夫
$A_i$の中でXより小さい場合1となるリストと、Xより大きい場合1となるリストの２つを求め、それぞれ`sum()`を取ることで、コストを算出する。

```python
N, M, X = map(int, input().split())
A = list(map(int, input().split()))
to_zero = sum([1 for a in A if a < X]) # マス０に向かうときのコスト
to_n = sum([1 for a in A if a > X]) # マスNに向かうときのコスト
if to_zero >= to_n:
    print(to_n)
else:
    print(to_zero)

```
【Rails】Twitterのようなサービスで相互フォローを取得する方法

## はじめに
Twitterのようなサービスで、「相互フォロー関係のみDM機能を解放する」などの機能をつける際に必要となる実装を紹介します。

自分はマッチングアプリ政策の際に実装しました。

## User.rb

``` file:user.rb

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
```

Relationモデルでは、user_idとfollower_idを使用してフォローフォロワー関係を作っています。（Railsチュートリアルと実装方法は同じ）
上記のように書くことで、User Classのオブジェクトでfollowingsメソッドとfollowersメソッドを使用できるようになります。
これらを利用して、相互フォローかどうか検証します。

## Controller

自分の場合、トップページに相互関係にあるフォロワーを表示するため、toppages#indexに実装をします。

```file:toppages_controller.rb
class ToppagesController < ApplicationController
  def index 
    @users = current_user.followings & current_user.followers if logged_in?
  end
end
```

単純に自分がフォローしているユーザーと、フォローされているユーザーの積集合をとれば取得できます。

また、user.rbにメソッドとして用意しても良さそうです。

```file:user.rb
def matchers
  followings & followers
end
```

## おまけ
自分がフォローしていないかつ、フォローしてもらっているユーザーの表示方法です。

```
def followers
  @user = User.find(params[:id])
  @followers = @user.followers.where.not(id:@user.followings.ids).page(params[:page])
end
```

何か他に良い実装方法がありましたら教えていただきたいです！
以上です！
iOSのpublic_betaから通常版に戻す

# はじめに
iPadでiPadOS (iOS13) のpublic betaをテストしていました。まもなく正式版がリリースされるようで、13.1になるらしいのですが、諸般の事情により、新バージョンのリリース前に通常版のiOS12に戻すことにしました。あくまでも自分用のメモとして残しておきます。
通常版のiOS13のリリース後には、iOS12には戻せないかもしれません。

# 用意するもの
- iPad本体
- PC
- Lightningのケーブル
- 電気
- 安定したインターネット

iPad本体は、事前にある程度充電しておいたほうが良いと思います。
PCは、iTunesをインストールしたWindows10のノートパソコンを使用しました。
Lightningのケーブルは、純正品を使ったほうが良いようです。
~~純正品でないとダメなんて、いい商売してるww~~

# 手順
[Appleの公式サイト](https://support.apple.com/ja-jp/HT203282)にある、「デバイスを復元してデベロッパ向けのベータ版を削除する」という項目を実行しました。
今回は特に残したいデータはないので、バックアップはしていません。

まず、iTunesを最新バージョンにしておきます。メニューバーの「ヘルプ」にある、「更新プログラムを確認」をクリックします。昨日アップデートしたばかりなので、「このバージョンのiTunes(12.10)は最新バージョンです。」と表示されました。
次に、iPadをパソコンに接続します。
そのあとリカバリーモードにします。なかなかうまくできませんでした。モデルによって操作手順が違うようです。今回はまずつないでからiPadの電源を切り、次にホームボタンを押しながら電源ボタン押し続けるとうまくできました。3秒くらいで黒い画面になり、そのあとだいたい10秒くらい後にまたリンゴマークが出ますが、そのまま2つのボタンを押し続けるとリカバリーモードの画面になりました。
電源を切った後に勝手に起動される場合は、パソコンのUSB端子を変えたり、ケーブルを変えたりすると良いかもしれません。
![リカバリーモード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369431/9fcd9240-fb90-2183-16e5-a8aa1256cbf0.jpeg)


Appleのサイトには「「復元」オプションが表示されたらクリックします。」と書いてありますが、どこをクリックするんですかねぇ。今回は「復元」ボタンをクリックしました。その次の画面では、「復元とアップデート」をクリックすると、iPadソフトウェア更新プログラムというウインドウが出るのでバージョンの確認をし、利用規約に同意します。進捗が分かりにくいですが、右上にある下矢印のようなマークをクリックするとダウンロード状況が表示されます。
![進捗状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369431/b811303a-6202-a403-7d8c-bb24c812b1ce.png)


10分くらいたった後、ダウンロードが完了していませんがiPadが勝手に再起動され、もとのまま起動されました。ダウンロードは続いていたので、ダウンロードが完了したことを確認してからもう一度リカバリーモードにしました。そのあとはだいたい15分くらいでインストールが完了しました。
初期設定の項目はいくつか省略されていたかもしれません。言語がなぜか英語になっていました。

そのあとiPadの画面上ではまだ進行状況バーが出ていましたが、iTunesには「新しいiPadへようこそ」の画面になっていました。ここで設定をしたせいかわかりませんが、iPadの名前が勝手に決められていました。以前にもiTunesで「新しいiPadへようこそ」の画面から進むとiPadの名前が勝手に変わっていた気がします。
Windowsのユーザー名 + のiPad になるようです。例えば、Windowsのユーザー名が「hinata」なら、「hinataのiPad」になるようです。勝手に決められるのは、できればやめてほしいとおもいました。

# 参考
iOS ベータソフトウェアをアンインストールする方法 - Apple サポート
https://support.apple.com/ja-jp/HT203282

iPhone、iPad、iPod touch をアップデート／復元できない場合 - Apple サポート
https://support.apple.com/ja-jp/HT201263

iPhone、iPad、iPod を工場出荷時の状態に戻す (初期化する) - Apple サポート
https://support.apple.com/ja-jp/HT201252

iPhone、iPad、iPod touch の電源が入らない場合やフリーズする場合 - Apple サポート
https://support.apple.com/ja-jp/HT201412

# その他
[ホーム画面1ページ目](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369431/fb5b8499-09e3-5b9b-f86a-9dd15193effe.png)、
[ホーム画面2ページ目](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369431/f35ad2f5-24d5-56b8-e064-f3682a8d5a3a.png)、
[アプリを消せるだけ消して1ページにまとめたホーム画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369431/571dc956-5c66-ba0e-925c-80cf0b2e09f7.png)

Antutuのベンチマークを調べたら、iOS13betaでは91616だったのがiOS12に戻したあとでは88327になりました。iPad mini 4 なので、ちょっと古いですが、iOS13の正式版にアップグレードしたら動作が軽くなることを期待しています。古い機種でも長く使えるのは良いことですね。
初心者によるプログラミング学習ログ　109日目 

# 100日チャレンジの109日目


qiita初投稿です。
よろしくお願いします。



Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。

109日目は、


* UdemyでVue.jsとwebデザインやりました。


* Webデザインは、架空のサイトのヘッダー部分、ロゴ、グローバルナビゲーション作成です。





```vuejs:qiita.vue.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="main.css">
    <title>Document</title>
   
</head>
<body>
    <script src="vue.js"></script>

<div id="app">
<p> {{ message }}</p> 　<!--テンプレート構文　二重中括弧-->
<P v-once>{{message}}</P> <!--一度だけ描写するv-once-->
<p>{{ text() }}</p>

<dv v-html="html"></dv> <!--v-htmlでデータをhtmlとして出力-->
<a v-bind:href="url">google</a> <!--v-bindで属性値をデータと紐付ける-->
<a :href="url">google</a> <!--v-bindの省略形「：」-->
<a :[attribute]="url">google</a:>

</div>

<script>
  new Vue({   //テンプレート構文
    el: "#app",   //テンプレート構文
   data: {    //テンプレート構文
     message: "vue.js",
     html: '<h1>h1です</h1>',
     url:'https://google.com',
     attribute: 'href'
   },
   methods:{    //methods:コードの処理分けやイベントハンドラ実装
     text() {
       this.message = 'vue.JS'
       return 'Hello';
     }
   }
  })
  
</script>
</body>
</html>

````

Vue.jsの基本的なテンプレート構文を学習。


## Webデザイン

Photoshopを用いて、架空のwebサイトの、

* ヘッダー部分のロゴ
* グローバルナビゲーション
* 架空のwebサイトを観ながらの初期レイアウトの作成方法

を学習しました。
日本人が間違えて覚えていそうな英語の発音（母音編）

[Wikipedia](https://ja.wikipedia.org/wiki/%E8%8B%B1%E8%AA%9E%E5%AD%A6#%E9%9F%B3%E5%A3%B0%E3%83%BB%E9%9F%B3%E9%9F%BB%E5%AD%A6)を読んでわからない人向けのざっくり解説！（来週には加筆するよ！）
必要なとこだけつまみ食いしつつ、日本人にとって発音しやすく、聞き取りやすいやろ！って流れにするんや！

#短母音は英米交えていくと楽！
どちらに寄せても難しい！絶対伝わるやろっていう感じでいいとこ取りしよ！
でも２つだけ！これだけ押さえとけばだいぶ楽！

###A:米国発音のA[æ]
「エ」と「ア」の中間！
まずはCanadaを「ケアナダ」と言ってみましょう。


###O英国発音のO[]



#長母音は米国発音重視！
米国発音で慣れておくと、r、特に子音としてのrの発音がきれいになりやすいと個人的に感じます。
イギリス発音だとね、あいまい母音やらないといけないんですよ。これが結構難しい。
中国語でいうと「我飢了。（自分めっちゃ腹減ったわ）」の「飢」の発音がめちゃくちゃこれなんですけど、結構難しいんですわ。

###caught / coat / court
###dough / door

###dirt / dart
【Docker】Docker+Railsコンテナ構築時のMYSQLエラー

こんばんは！ポートフォリオの作成にあたり、`Docker+Railsコンテナ構築時にUnknown MySQL server host ‘mysql’エラー`が発生してなかなか解決しなかったので備忘として。

## 参考

>DOCKER+RAILSコンテナ構築時のUNKNOWN MYSQL SERVER HOST ‘MYSQL’エラー
https://www.somuriengineer.com/2019/02/12/dockerrails%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E6%A7%8B%E7%AF%89%E6%99%82%E3%81%AEunknown-mysql-server-host-mysql%E3%82%A8%E3%83%A9%E3%83%BC/

>丁寧すぎるDocker-composeによるrails + MySQL on Dockerの環境構築(Docker for Mac)
https://qiita.com/azul915/items/5b7063cbc80192343fc0

####上記のQittaですごく丁寧にDocker for Macの環境構築は記載されていますので割愛。

## ハマったエラー

```terminal
$ docker-compose run web rails db:create
```
しようとしたら、

![スクリーンショット 2019-09-24 21.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428016/90843641-7896-fdce-29b0-b3e2f37846bd.png)

#### or

```terminal
Access denied for user ‘hoge’@’localhost’ to database ‘mysql’
```

## 原因追求

どちらかのファイルが悪いはず...

```terminal:作業ディレクトリ/docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ****** <=　任意のパスワード
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    links:
      - db
```

```terminal:作業ディレクトリ/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # docker-compose.ymlのMYSQL_ROOT_PASSWORD
  host: db # docker-compose.ymlのservice名
```

`links:`を`database:mysql`としてみたり、`root`にしてみたり、`db`に戻したり、host:も同様に変更してみたり、結局は**Unknown MySQL server host ‘mysql’**もしくは **Access denied for user ‘hoge’@’localhost’ to database ‘’**

以前にawsで本番環境構築していた時にもmysqlに苦しめられたので苦い思い出...

その時は確かroot権限からアクセス許可を行ったはず。ただそんな難しいエラーじゃないような気がする...

## 解決方法

参考にした記事に`恐らくですが、Dockerの古いイメージが残ってしまい、そちらを参照し続けてしまったことなどが原因かと思います。`と。チームメンバーがこれと似たような事を言っていた事を思い出す（dockerの環境構築ではなく、aws設定時にmysqlでエラーしていた際の話）

以下コマンドでは、可動していないものも含め全てのDockerイメージを削除します。

```terminal:作業ディレクトリ
$ docker stop $(docker ps -q)
$ docker rm $(docker ps -aq)
$ docker rmi $(docker images -q)
```

「これで、もう一度挑戦！」

**Docker起動**

```terminal:作業ディレクトリ
$ docker-compose build # コンテナをビルド
$ docker-compose up # コンテナの一斉起動
```

**DB作成**

```terminal
$ docker-compose run web rails db:create
Starting portfolio_db_1 ... done
Created database 'app_name_development'
Created database 'app_name_test'
```

「お、怒られないぞ！いけたかも！」

**ブラウザでlocalhost:300にアクセスしてサーバーの起動を確認する**

![スクリーンショット 2019-09-24 21.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428016/85d4c76b-9350-5e34-727a-83023bf4052e.png)

「いけたー！」

## まとめ

2019年10月中旬から開始する転職活動へ向けてポートフォリオの作成を開始したので、その都度ハマった部分を備忘録として記事にまとめていこうと思います。次は本番環境へデプロイします。

**終わり**
日本人が間違えて覚えていそうな発音（子音編）

[Wikipedia](https://ja.wikipedia.org/wiki/%E8%8B%B1%E8%AA%9E%E5%AD%A6#%E9%9F%B3%E5%A3%B0%E3%83%BB%E9%9F%B3%E9%9F%BB%E5%AD%A6)を読んでわからない人向けのざっくり解説！（来週には加筆するよ！）

#発音できるようになっておかないと勘違いされやすいもの
###L/R [l/ɹ]
minimal pairの例
light / right (光/権利)←全部名詞
lock / rock (錠/岩)←全部名詞
lake / rake (湖/熊手)←全部名詞

まず発音記号が普段見ているものと違うことに気づきましたか？
"r"じゃないですよね？ひっくり返ってますよね？筆者的にはブラケットで囲っているのも割と本気度高めです。

###S/TH/T [s/θ/t]
minimal pairの例
sin / thin / tin
sick / thick / tick
sought / thought / taught ←全部動詞の過去形なので結構やばい

###Z/TH/D [z/ð/d]
minimal pairの例
their / dare
theirs / dares
though / dough

###B/V [b/v]
minimal pairの例
bet / vet
ban / van
boat / vote

###S / SH
sin / shin
sit / shit
seat / sheet


#やけにこだわってる英語教師いるけど対して問題なくね？なもの

###f [f]
minimal pairの例
food / hood
foo / who
実践的なのこれ以外にない。。。なくない？

#全然光当たってないし難しいけどfより重要じゃね？
これを説明・実践・指導できる学校英語教師に当たったらマジすごいと思う。少なくとも筆者は２つ目をめっちゃざっくりとしか指導できない
###cars / cards, as / adds

###east / yeast, ear / year
react-native-elements: inputフォームの下線を消す

```js
import { Input } from 'react-native-elements';
```
react-native-elementsの**Input**において、個人的に少しハマった点を共有します。

このInputフォームには、デフォルトで下線が引かれています。
<img width="284" alt="スクリーンショット 2019-09-24 21.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297271/d3621d0e-2f5c-e59a-c148-fe1131298c59.png">

この下線を消そうとしたのですが、propsの[containerStyle]や[inputStyle]をいじって、 
{ borderBottomWidth: 0 }}などとしてみたものの、反映されませんでした。

正しいやり方としては

```react
 <Input
   inputContainerStyle={{ borderBottomWidth: 0 }}
```
のようにprops **inputContainerStyle={{borderBottomWidth: 0}}**とすることで、下線を消すことができました。

**お試しあれ！!**

react-native-elements:inputForm:underLine