OmniAICreator/Qiita-1.07M huggingface dataset:
vmware ubuntu18

#はじめに
　vmware player 15にアップグレードしたら、ubuntu 18でなかなかnetが繋がらなくてようやく、わけがわからいまま繋がったご報告

#前提
 とにかく、「動けばいいや」という方針なので、本当に困ってる人のための参考になればいいかと思います

#マシンの状況
　ホスト windows 10
  ゲスト ubuntu 18.4
  vmware player 15(nat接続)

#トラブル内容
　なんらかのタイミングに突然、「設定（コントロールセンタ）」のネットワークにnicが表示されなくなってしまって、ipが全然設定できない。
　ググると /etc/network/interfaces ではnicは書かない方がいいとなっていて
　nmtuiとかでconnectionを作るのだが、まるでactivateしてくれない。
　もう、２日もググって、諦め欠けたときに次ぎの解決策でようやくつながった。

#解決策
　/etc/network/interfacesに次の内容を書き込みreboot
<pre>
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
address 192.168.252.128
network 192.168.0.0
netmask 255.255.0.0
gateway 192.168.252.2
dns-nameserver 192.168.252.2</pre>

#いろんな事が分からないまま解決
　なぜ、192.168.252.xx というのかというのもよくわからない
　vmnet8は192.168.137.1とwindows側の設定になっているのだが、誰が
192.168.252.xxを作っているのかわけがわからない。

　また、相変わらずubuntuの「設定」にはNICが表示されていないものの
 ifcofigだけはまともで、当然nmcli dをやっても「管理なし」のままである。

　まあ、繋がったからよしとするか
AWS Storage Gateway について知ってることをまとめてみた

###前置き
知識の整理用に書きました。間違ってたらご指摘お願いします。

#AWS Storage Gatewayとは
>AWS Storage Gateway は、既存のオンプレミス環境と AWS クラウドを接続するハイブリッドクラウドストレージサービスです。
（公式より）

**・・・って言われてもよくわからん:thinking:**

オンプレ環境にあるデータをいい感じにクラウド上のストレージに置きますよーそのためのゲートウェイですよー、みたいな感じ。オンプレのデータをAWS上に置くことで、AWSの高い可用性を享受でき、バックアップやDR（＝災害復旧）が達成できる。

**ゲートウェイとは**
プロトコルの異なるネットワークとネットワークが通信するときのハードウェアやソフトウェア。異なるプロトコルやデータ形式を自動的に変換する。

##AWS Storage Gatewayの利点
・オンプレのデータをAWSの可用性の高い環境下でバックアップできる
・標準でデータが暗号化される
・AWSのモニタリング、セキュリティ等のツールを活用できる
etc

##データの格納先
・S3
・EBS
・Glacier
ストレージゲートウェイの種類によって格納先が異なる。

##種類
１. ファイルゲートウェイ
２. ボリュームゲートウェイ
　　ーキャッシュ型（Gateway-Cached Volumes）
　　ー保管型（Gateway-Stored Volumes）
３. テープゲートウェイ

###１. ファイルゲートウェイ
オンプレに保存しているファイルをS3のオブジェクトとして保存する。
S3の1オブジェクト＝オンプレの1ファイル
直近に使用されたデータはゲートウェイ上に保存するため、低遅延なアクセスが可能。

###２. ボリュームゲートウェイ
オンプレのディスクデータのスナップショットをS3に保存する。
S3の1オブジェクト=1スナップショット
ボリュームゲートウェイには、キャッシュ型と保管型の２種類の方法がある。

####キャッシュ型
*Gateway-Cached Volumes*
プライマリデータをS3に保存して、頻繁にアクセスされるデータはキャッシュしてローカルに保持する。そのため頻繁にアクセスされるデータへの低遅延アクセスが実現できる。
アプリケーションがデータをリクエストすると、ゲートウェイはまずキャッシュストレージでそのデータを探し、なければS3に探しにいく。

####保管型
*Gateway-Stored Volumes*
メインデータはローカルに保存する一方で、そのデータを非同期にAWSにバックアップする。
データがローカルにあるので、データ全体に対して低遅延でアクセスできる。
EBSへのリストア（＝復元）も可能。

###３. テープゲートウェイ
物理テープライブラリの代替として、ストレージゲートウェイを仮想テープライブラリとして使用する。
バックアップソフトウェアを使用することでS3、Glacierにデータを退避することもできる。

##セキュリティ
AWSと各Gateway間のデータ転送はSSLで暗号化される。
クラウドストレージ側のデータはAES-256を用いて暗号化される。

##さいごに
Storage Gateway、あんまりまとまっている資料とかページが少なくて、概要をつかむのに少し苦労しました。おすすめの資料とかあれば教えてほしいです。

##参考
[AWS Storage Gateway の特徴](https://aws.amazon.com/jp/storagegateway/features/)
[AWS Storage Gateway のよくある質問](https://aws.amazon.com/jp/storagegateway/faqs/)
[AWS Black Belt Online Seminar 2017 AWS Storage Gateway](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-aws-storage-gateway)
Python3.8では非同期関数のテストが標準でサポートされる

今までのPythonで非同期関数をテストするときはいい感じにコルーチンをwrapしたりサードパーティのテストライブラリを使うしかなかった。

しかし何気なく[公式ドキュメント](https://docs.python.org/ja/3/library/unittest.html#unittest.IsolatedAsyncioTestCase)を読んでいると……

>class unittest.IsolatedAsyncioTestCase(methodName='runTest')
>This class provides an API similar to TestCase and also accepts coroutines as test functions.
>
>バージョン 3.8 で追加.

……これは結構大きな改善点なのでは？

# 改めて[What's New](https://docs.python.org/ja/3/whatsnew/3.8.html#unittest)を確認する

>unittest module gained support for coroutines to be used as test cases with unittest.IsolatedAsyncioTestCase. (Contributed by Andrew Svetlov in bpo-32972.)

しっかり書いてあった。以下の例も公式から引用する。

```python
import unittest


class TestRequest(unittest.IsolatedAsyncioTestCase):

    async def asyncSetUp(self):
        self.connection = await AsyncConnection()

    async def test_get(self):
        response = await self.connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)

    async def asyncTearDown(self):
        await self.connection.close()


if __name__ == "__main__":
    unittest.main()
```

これで非同期関数をテストするためだけに`asyncio.get_event_loop().run_until_complete(coro)` とか書かなくて済む。まあライブラリの開発だと互換性を気にする必要があるけど……

# 参考
* What's New In Python 3.8 (https://docs.python.org/ja/3/whatsnew/3.8.html)
* unittest (https://docs.python.org/ja/3/library/unittest.html)
[AWS] Route53 ドメイン取得

以下記事でAWS環境にRedmineを立ち上げており、本記事では続きとしてRoute 53サービスを使用しドメインの取得・DNSの設定を行います。

https://qiita.com/Hiro-AGU/items/86446af898334a7dbc23

AWSチュートリアルの内容をまとめているだけなので、詳細は以下ページを参照してください。

https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/

## ドメインの登録

現在立ち上げているRedmineをドメインで検索できるようにするためには、以下手順を踏む必要があります。

* ドメインの購入
* DNSの設定を行う

まず、ドメインの購入から行います。
AWSコンソールから `Route53` サービスを開いてください。
なお、購入には料金が発生するので実際に取得する気がない方はご注意ください。

![スクリーンショット 2019-10-26 16.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/4115124a-c372-3ea5-4f8c-251f95d7a905.png)

サイドバーの`登録済みドメイン`を開き、`ドメインの登録`を押下します。

![スクリーンショット 2019-10-26 16.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/a7858a33-596a-239e-60e4-582d0c05153b.png)

ドメインの選択欄で、ご自身が設定したい名前のドメインとトップレベルドメイン(.comなど)を決め、`チェック`を押下してください。
ここでは例として、ドメイン「example」、トップレベルドメイン「.com」としています。

![スクリーンショット 2019-10-26 16.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/f178d39d-8495-7ef3-acc7-f033120f7dfd.png)

なお、`チェック`を押下した際、以下のように使用不可と出力されることがあります。
ドメインは世界中で重複しないため、貴方が設定しようとしたドメインは既に他の誰かが登録しているということとなります。
チェックが通るまでドメインの変更を行なってください。
ここでは使用不可と出ていますが、例なのでこのまま「example.com」として記述します。

![スクリーンショット 2019-10-26 16.42.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/9f0d3c65-7938-c350-8d1b-099c53feb4d5.png)

チェック完了後、購入者の連絡先詳細画面となるため、ご自身の情報を記入し`続行`を押下してください。

![スクリーンショット 2019-10-26 16.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/ebd97aae-2015-4018-bf35-c929872603c2.png)

購入前確認画面です。記入内容に問題なければ`注文を完了`を押下してください。
注) 注文完了を行うと料金が発生します。問題ないか再確認を行なってください。

![スクリーンショット 2019-10-26 16.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/e0cc2b0b-e23b-b7a5-bc6d-f9ca0f929a7d.png)

注文完了後、数分ほど時間をおいてドメインの登録に成功するはずです。
サイドバーの`登録済みドメイン`から確認を行なってください。

## DNSの設定

上記手順でドメインの購入は完了しましたが、現状ドメインとIPアドレスの紐付けが行われていないため、取得したドメインは意味のないものとなっています。
そこで、DNSの設定を行いドメインからIPアドレスを検索できるよう設定する必要があります。

AWSコンソール Route 53サービスのサイドバー`ホストゾーン`を開き、先ほど取得したドメインを押下してください。

![スクリーンショット 2019-10-26 16.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/62d74890-04bb-d8d1-0e11-6018252604af.png)

次に、`レコードセットの作成`を押下します。

![スクリーンショット 2019-10-26 17.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/04e5338b-bb1b-e5d7-d224-383b1ff1313b.png)

レコードセットの作成を行います。
以下の欄を記入し、`作成`を押下します。

名前: www.
値:   Redmineに紐づいているご自身のPublicIPアドレス 

![スクリーンショット 2019-10-26 17.09.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/635607de-6945-51c3-0dfa-c0c9e0a893cc.png)

作成完了後、`ホストゾーン`に戻りドメインを押下すると、AレコードにPublicIPが値として入っていると思います。
Aレコードとは、ドメインをIPアドレスに置き換えるレコードです。
DNSでは最も基本的なレコードとなるため、名前だけでも覚えておきましょう。

最後に、ご自身が設定したドメインをブラウザから叩いてみましょう。
Redmineに接続できたら無事完了です。

## 終わりに

Aレコードに正常に追加されているか、WHOISでも検索してみましょう。

https://www.cman.jp/network/support/ip.html

ご自身のドメインとIPが紐づいていることが確認できます。
http://localhost:3000/でサーバー立ち上げてもYay! You're on Rails!の画面から動かない

Version: Rails 5.2.3

<b>[結論（解決方法）]</b>
config/routes.rbのファイルにホーム画面（該当viewファイル）へのルート(root 'コントローラー名#viewファイル名')を設定する。

Before

```config/routes.rb
Rails.application.routes.draw do

  get   'tweets'      =>  'tweets#index'     #ツイート一覧画面
  get   'tweets/new'  =>  'tweets#new'       #ツイート投稿画面
  post  'tweets'      =>  'tweets#create'    #ツイート投稿機能
end
```

After

```config/routes.rb
Rails.application.routes.draw do
  root 'tweets#index'
  get   'tweets'      =>  'tweets#index'     #ツイート一覧画面
  get   'tweets/new'  =>  'tweets#new'       #ツイート投稿画面
  post  'tweets'      =>  'tweets#create'    #ツイート投稿機能
end
```




<b>[エラー背景]</b>
Railsのサーバー立ち上げるぞ！ホーム画面見れるかな・・・ドキドキ。
という期待も儚く、下記Yay! You're on Rails!という画面から自分のアプリのホーム画面に移動しない、という経験ありますでしょうか？

ええ、わたくしは結構あります←
そしてその都度、何がYay!だよゴルああああと叫んでおります。

![スクリーンショット 2019-10-26 17.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512974/1433d025-d30f-eb2b-5574-581171e31d50.png)

これはですね、Railsの大元と言えるroutes.rbルートファイルに、どこの画面にいけばいいかのルート（getやpostなどのhttpメソッド含む）を定義していないからなんですね。

なので、単純に
```root 'コントローラー名#viewファイル名'
```
で初期画面として表示させたいviewファイル名＋そのviewファイルへと導いてるコントローラー名を上記の形で記入してあげれば良いのです！

私はツイート一覧画面のビューファイルを表示させたいので、

index.html.erbファイルをホームへのルートとして設定したい。→このindexビューファイルはtweetsコントローラに属しているので、root 'tweets#index'と記載してあげればオーケーとなります！
※シングルクオーテーション（''）でrootの中身を囲うのを忘れずに〜

ではでは、良いプログラミングライフを！アディオス！
【コードでAutoLayout】関連付けた2つのUIViewのtranslatesAutoresizingMaskIntoConstraintsがtrueとfalseの組み合わせの場合の挙動

AutoLayoutを始めたのが最近なので3周遅れぐらいでいろいろ調べている。暖かく見守っていただきたい。
2つのViewに関連をつけるときにtranslatesAutoresizingMaskIntoConstraintsの設定が片方だけtrueのときの挙動はどうなるか。

#前提
ソースで書く。Storyboardは使わない。


#UIViewとUIViewの組み合わせ

viewA : AutoLayoutがオフ
viewB : AutoLayoutがオン
とする。viewAが何かの方法でframeが確定したとき、関連付けられているviewBは意図する設定がされるのか？

####結論
viewAもAnchorの値は有効。
viewAのAnchorが決定するので、関連付けられたviewBのAnchorを決定することができる。

####コード

```swift
//testView1.translatesAutoresizingMaskIntoConstraints = false
testView1.frame = CGRect(x: 30.0, y: 50.0, width: 50.0, height: 50.0)

testView2.translatesAutoresizingMaskIntoConstraints = false
testView2.topAnchor.constraint(equalTo: testView1.topAnchor).isActive = true
testView2.leadingAnchor.constraint(equalTo: testView1.trailingAnchor, constant: 30.0).isActive = true
testView2.heightAnchor.constraint(equalTo: testView1.heightAnchor).isActive = true
testView2.widthAnchor.constraint(equalTo: testView1.widthAnchor).isActive = true
```


#UIScrollViewとUIViewの組み合わせ
今回のメインイベントである。UIScrollViewとその中に入れたUIViewはどうなるか？

##UIScrollViewがAutoLayoutオフ、UIViewがオンのとき

####結論
意図したとおりになる。まあ、意図というのは私自身にしかわからない表現かもしれない。
UIScrollViewのcontentSizeは、中にあるUIViewのサイズに関連してAutoLayoutで指令可能ということである。UIScrollView自身はAutoLayoutオフなのであるが。

####コード
```swift
//scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.frame = CGRect(x: 30.0, y: 200.0, width: 200.0, height: 200.0)
	
testView3.translatesAutoresizingMaskIntoConstraints = false
testView3.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 10.0).isActive = true
testView3.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 10.0).isActive = true
testView3.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: -10.0).isActive = true
testView3.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -10.0).isActive = true
testView3.heightAnchor.constraint(equalToConstant: 400.0).isActive = true
testView3.widthAnchor.constraint(equalToConstant: 400.0).isActive = true
```

##UIScrollViewがAutoLayoutオン、UIViewがオフのとき

####結論
UIScrollViewの外枠はAutoLayoutで指令できるが、contentSizeはAutoLayoutを使えなかった。中のUIViewのサイズが決定すればAutoLayoutでcontentSizeが設定可能かなと思ったのだが。古典的に指定することになる。

####コード
```swift
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200.0).isActive = true
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30.0).isActive = true
scrollView.heightAnchor.constraint(equalToConstant: 200.0).isActive = true
scrollView.widthAnchor.constraint(equalToConstant: 200.0).isActive = true

//testView3.translatesAutoresizingMaskIntoConstraints = false
testView3.frame = CGRect(x: 10.0, y: 10.0, width: 400.0, height: 400.0)
scrollView.contentSize = CGSize(width: 420.0, height: 420.0)
```

何か間違いや、表現の中途半端さがあれば指摘してください。


##追記
少し問題に遭遇したのでこの方法を検討しましたが、問題は別の方法で対応することにしたので、この方法は結局使いませんでした。
HTCのSIMフリー端末でauのモバイルネットワークにつながらなくなった時の対処法

私はHTC U11のsimフリー機（ソーラーレッド）にauのsim(VoLTE)を挿して使用していますが、2019/10/20ごろからモバイルネットワーク（LTE）につながらなくなりました。
悪戦苦闘した結果、先ほど復帰できるようになったので、同じ悩みの方がいれば…と思い解決法をシェアします。乱筆はお許しを。

### 【背景・契約状態】
本機はHTC日本からsimフリー機として発売されており、KDDI契約のSIMで利用する場合「LTE NET(300円)」および「LTE NET for data(500円)」の双方が必要とのことで（キャリアの小銭稼ぎにうんざりしながらも）両方加入していました。

ところが7月ごろから、[au謹製端末以外の契約者にも「LTE NET」のAPNが公開され、公式にfor data契約が不要になりました。](https://www.itmedia.co.jp/mobile/articles/1907/01/news111.html)

このため10月上旬からfor dataオプションを解約、LTE NETのみ契約で、LET NETのAPNを手動追加し、データ通信を問題なく利用していました。ちなみに基本プランはauピタっとプランカケホV
ところが、このLTE NETのAPNによるデータ通信が突如使えなくなったのです

###【経過】
- 10月第3週ごろから、wifiをoffにした後、モバイル回線につながらなくなる　⇒機内モードon/offで対処可でした
- 10/20、上記方法でもモバイルネットワークにつながらなくなる（wifiは可、電話電波もバリ3）
- 10/21、Android OSを8⇒9に更新。改善せず。
- SIMカードの破損を疑い、AUショップで新品と交換するも改善せず

###【症状】
- モバイルネットワークにつながらない。AUの電波は捕まる（通話可能）
- APN設定でLTE NETの設定値を入力し保存し、再度保存した設定の中身を確認するとなぜか「ユーザー名」だけが保存されない。（このためネットワークに繋がらなかったと思われる）「名前」はグレーアウト、パスワードなどは保存時の状態
- APNを初期化し、再度、APN設定を追加しても同じ症状
- 電源を切ってsimを入れなおす、汚れを拭くなど一般的な方法では解決せず
- 手元にあった他社SIMでドコモのLTEにはつながった※のでハードの物理的な破損の可能性は否定された（正確に言うと、4Gの表示が出て↑矢印がでる状態。契約状態でないSIMなので通信↓はできず、ただしSIMのキャリアからSMSが届いた）

###【最終的な解決法】
お手元に必要なもの：au系回線以外のSIMカード
⇒私の場合は海外旅行の時に使ったOrange（フランスのキャリア）の4G SIMがあったので使用しました。
以下、自己責任でお願いします。あくまでも私のケースの成功例です
特に、症状としてAPNのユーザー名が消えていない方は、APN設定の初期化は慎重に。

1. wifiをoff。モバイルネットワークもoff
2. au simカードが入った状態でapnを初期化
3. 電源を落としてからau simを抜き、他社回線のsimを入れる
4. 他社回線のアクセスポイントを選択●する**（※ここ忘れると最初からやり直しです）**
5. APNを＋追加します。[ここの回答NO14を参考。](https://king.mineo.jp/question-answer/端末／各種設定／操作+スマートフォン/19083)公式のLTE NETの設定値を入れるとともに、キャリア番号であるMNCをデフォルトで入っている値からauの51（VoLTEの場合。非VoLTE契約SIMなら50）にします。さらに、この作業で私のように海外SIMを使っている場合は国番号であるMCCを当該国の番号から日本440に変更します。さらにさらに、apnタイプとしてdefault,supl,mms,hipriに加え[**,imsも追加してください。**](https://king.mineo.jp/my/d48830574e1f4ba7/reports/48388)
6. 右上の・・・から保存。保存すると一覧から消えていますがここはこれでOK
7. スマホの電源を切ってauのSIMに差し替えます。起動。
8. 先ほど設定した“LTE NET”のAPNが出てきます。**※まだここでは選択（○⇒●）しちゃダメです。**中を見て設定値を確認するのもたぶんダメ。見たら設定したユーザー名が消えます
9. APNを追加。imsを追加します[値はここを参照。](https://king.mineo.jp/upimages/view/bbs_post_image/243645/fullsize)値を入れたら・・・から保存。APNの一覧に出てきます。
10. APNの一覧から“LTE NET”のAPN設定を選択○⇒●します。
11. 端末を再起動
12. モバイルネットワークをon

これでようやく私は繋がりました。順番を間違えるとうまくいかず、最初からやり直しの羽目になったので、 注意してください。


###【原因は何なのよ？】
で、私みたいなズブの素人がインターネッツの情報を借りながらなんとか解決したのですが、原因は何なんでしょうか？
apnのユーザー名が保存できなくなる問題はOSやシステムのバグなどが原因かもしれないし、imsを登録しないとSIMフリーの非au系端末でAPN設定できないのは既知の問題だったようですし、APNタイプに,imsを追加するのも誰かがすでにやっていました。上記解決法はその組み合わせ（とその順番の試行錯誤）

しかし、なぜ昨日まで使っていたものが急に使えなくなったのか、という根本原因はわからずのままです。

端末の故障やSIMカードの故障というハードの問題はなく、私自身も設定をいじったわけではないので、これはもうネットワーク（あーうーさん）の中で何かが弄られたとしか思えないのですが…症状が出ていたのは私だけでしょうか？

こちら素人なので、偉い人の解説や突っ込みを頂けるとありがたいです。
Pythonでデスクトップアプリ（wxPython）

## Pythonでデスクトップアプリ

最近いろいろなところで流行っているPythonでさくっとデスクトップアプリを作る方法です。
今回は一応メジャーっぽい **wxPython** を使ってみます。

## 準備

pipでインストールします。

```sh
> pip install wxPython
```

## もっとも簡単なサンプル

以下は wxPython のチュートリアルそのものの簡単なサンプルです。

```python:wxpython.py
# First things, first. Import the wxPython package.
import wx

# Next, create an application object.
app = wx.App()

# Then a frame.
frm = wx.Frame(None, title="Hello World")

# Show it.
frm.Show()

# Start the event loop.
app.MainLoop()
```

実行してみます。

```sh
> python wxpython.py
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/0a8c2cc9-3613-24a6-da4d-d7489b8be6af.png)

**Hello World** というタイトルのついたウィンドウが立ち上がったと思います。

ということで動いたことを確認できたのでもう少しインタラクティブなものを作ってみます。

## ボタンとかコントロールを付けてみる

こんな感じのテキストボックスが1つあって、ボタンが1つあるアプリです。
テキストボックスに何か `abcdefg` とか入力して `Upper` ボタンを押すと `ABCDEFG` になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/bc4fd70e-d1f2-7d66-2e59-69376b515892.png)

コードはこれです。

```python:wxpython.py
import wx

app = wx.App()

frame = wx.Frame(None, title="Hello World")

panel = wx.Panel(frame, -1)

text_ctrl = wx.TextCtrl(panel, -1, pos=(10, 10))
btn_ctrl = wx.Button(panel, -1, 'Upper', pos=(10, 40))

def on_click(event):
    text = text_ctrl.GetValue()
    text_ctrl.SetValue(text.upper())

btn_ctrl.Bind(wx.EVT_BUTTON, on_click)

frame.Show()
app.MainLoop()
```

それほど解説はいらないと思いますが、

```python
panel = wx.Panel(frame, -1)
```

でパネルというUI部品を作って、

```python
text_ctrl = wx.TextCtrl(panel, -1, pos=(10, 10))
btn_ctrl = wx.Button(panel, -1, 'Upper', pos=(10, 40))
```

`pos`で指定した位置に `TextCtrl` と `Button` を配置。

```python
def on_click(event):
    text = text_ctrl.GetValue()
    text_ctrl.SetValue(text.upper())

btn_ctrl.Bind(wx.EVT_BUTTON, on_click)
```

ボタンが押されたときに呼び出される関数を作って、それをボタンにバインドしています。
関数の中ではテキストボックスの値を取得して、Upperで大文字にしてテキストボックスに戻しています。

## さらにコントロールを増やしてみる

同じように Upper だけではなく Lower も付けてみたのが以下です。
別に難しいことはありません。

```python
import wx

app = wx.App()

frame = wx.Frame(None, title="Hello World")

panel = wx.Panel(frame, -1)

text_ctrl = wx.TextCtrl(panel, -1, pos=(10, 10))
btn_ctrl_upper = wx.Button(panel, -1, 'Upper', pos=(10, 40))
btn_ctrl_lower = wx.Button(panel, -1, 'Lower', pos=(10, 70))

def on_click_upper(event):
    text = text_ctrl.GetValue()
    text_ctrl.SetValue(text.upper())

def on_click_lower(event):
    text = text_ctrl.GetValue()
    text_ctrl.SetValue(text.lower())

btn_ctrl_upper.Bind(wx.EVT_BUTTON, on_click_upper)
btn_ctrl_lower.Bind(wx.EVT_BUTTON, on_click_lower)

frame.Show()
app.MainLoop()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/00d1f5c1-eb21-e73e-66da-1a68edf67f22.png)

今回はボタンとテキストボックスしか使っていませんが、 https://wxpython.org/Phoenix/docs/html/gallery.html を見るとかなりたくさんコントロールが用意されているようです。

## おわりに

これだけのとっかかりがあればあとは調べながらでもさくっとできると思うので役目は果たしたと思うのでおしまい。
2019 JapanItWeek セミナーReport マイクロソフトTeams

#2019 Japan It Week セミナーレポート
###デジタル変革を加速させる日本マイクロソフトの働き方改革

セミナーメモ

働き方の過去と今を比較、
昔（10年前）は個が主で、こちらを高めるために実施していっていた。
今はチームにて行っている。
必要な時に、必要なデータ、人を用い、プロジェクトを進めていく

TEAMSを利用するような環境となった。
TEAMSではビデオ会議、会議資料の授受、場所を選ばない。

また、勤務環境（コアタイム制をなくしたフレックスタイム）
あらゆる場所で働ける環境（オンライン同行等）

8月は週勤4日等のプログラムを実施、※目標が変わらないため、実務1.3倍くらいになる

現状あった世界と日本との比較
・日本のメールの文面が長い
　※連絡したい内容までの前文や挨拶等ががっつり入っている。
　※平田の実体験からすると、メールでの連絡については当メールにて完結するように書くので
　　用件のみの連絡が根付いていかなかったのかと。何かショートカットの文面や約束事で大安になるのかもしれないですね。

・日本での会議時間が長い
・日本での同行人数が多い

※平田の実体験では、会議時間が長い、同行人数が多い　について、ディスカッション以外の連絡会議が多い気がします。また、お客様の状況もありますが、場所について拘束度が高い状態の会議が多いような気がしています。

実際の事例と効果を合わせて紹介いただいたので、参考になる内容でした
【HTML】まずはこれだけ！HTML　　　　　　「HTMLって要はなに？」

# まずはこれだけ！HTML

　聞いたことはあるけどHTMLってなんなの？
　わかりやすく解説します。

## どなた向けの記事か

- これからプログラミングを勉強しようと思っている方。
- なんとなく知ってはいるけどよくわからない方。
- 書いたことあるけどどう書けばいいかよくわからない方。


## 内容
HTMLの全体像の把握（詳しいコーディングは解説しません）

## Key Word
- 文章の構造化
- HTMLの役割

・「この言葉は重要だから「タイトル」として扱おう」などの役割を決める
・「この文章はこのページのここに配置しよう」と場所を決める

# 目次

1.HTMLとは？
  ・ Hyper Text Markup Language
  ・ HTMLの役割とは？
  ・ HTMLが「Webページ」になる理由
  ・ 実際にどう書くの？
  
2.まとめ


## Contents

### 1.HTMLとは？
####・ Hyper Text Markup Language

　HTMlとは「Hyper　Text　Markup Language」の略でマークアップ言語に分類されます。
そしてマークアップ言語とは「文章を構造化」する言語のことです。

（正直わかりづらいですよね・・・？）

文章を構造化とはなんでしょうか？


####・ HTMLの役割とは？

例えば

新聞を想像してみてください。
新聞は重要なところは「大きな見出し」、次に大事なところは「中見出し、小見出し」、
普通の文章は小さい文字でブロック分けされて書かれていますよね？

「文章の構造化」とはまさにこのことで、
HTMLの役割は以下の２つを決めることと言えます。

・「この言葉は重要だから「タイトル」として扱おう」などの役割を決める
・「この文章はこのページのここに配置しよう」と場所を決める

では実際のHTMLをみてみましょう！

<img width="1333" alt="HTMLサンプル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503867/ce65dde2-cf82-c2a8-f3bf-a4240fcac76d.png">

おなじみのグーグル先生の検索画面です。
なにやら右に難解な文字がいっぱい書いてありますね？

<img width="446" alt="DIVサンプル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503867/3c5509cc-54bc-13e2-2b3b-ca24850dad26.png">

これがHTMLです（一部抜粋）。


#### ・ HTMLが「Webページ」になる理由

ここでは詳しく解説しませんが、「こんな感じか」程度の認識でOKです！

HTMLはそれだけでは普段私たちがみているWebページにはなりません。
ブラウザ(※)が読み込むことで人間にわかりやすい形で
おなじみの「Google」サイトとして見ることができるわけですね。


※ブラウザとは「グーグルクローム」や「safari」、
「internet explorer」のことです。

![ブラウザアイコンサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503867/9549fe3a-122f-8fe6-2943-7d53fd007cdb.png)


実はブラウザの機能の一つに、「HTML言語を人間に見やすいように変換する」
というものがあることで普段私たちは「Webページ」を見れているんです！

もし興味があれば、適当なWebページにアクセスして右クリックして、
「検証」、または「ページのソース」をクリックしてみてください。
そのページのHTMLをみることができますよ！

####・ 実際にどう書くの？

プロのプログラマーHTMLをはじめとするプログラミング言語を書くのに使うツールを
「エディタ」と言います。

プログラミングを書くことに特化させた「メモ帳」のようなものです。

このエディタは基本的に無料でダウンロードして使用することができます。

次回は実際にエディタをダウンロードして、HTMLを書いてみましょう！！



### 2.まとめ
　
HTMLとは

1. Webページを作るためのマークアップ言語
2. マークアップ言語とは文章の構造化をする言語のことで

- 「この言葉は重要だから「タイトル」として扱おう」などの役割を決める
- 「この文章はこのページのここに配置しよう」と場所を決める

今回の記事では簡単にHTMLの概要について触れました。
奥が深い言語の一つなので説明しきれませんが、基本的な概略としては以上の
2点を覚えておいてください。

それでもやっぱりよく言っていることがわからないということもあると思います。
プログラミングで重要なことは「手を動かすこと」です。

次回は実際に手を動かしながらHTMLについての理解を深めていきましょう！



最後までありがとうございました！！
Apple Storeから警告？が来た Missing Push Notification Entitlement の対処方

#はじめに
xcodeのバージョンは11
[ionic](https://ionicframework.com/jp/docs/intro)で開発したアプリです。

#アーカイブ作成＋アップロード後に起きた

[【2019年版】iOSアプリをApp Storeに公開するための全手順まとめ](https://qiita.com/kenny_J_7/items/92378e2a09bee6080677)

上記のページでの**手順8**の後にApp Store Connectからメールが来た。。

>Dear Developer,

>We identified one or more issues with a recent delivery for your app, >"アプリ名" 1.0 (1). Your delivery was successful, but you may wish to >correct the following issues in your next delivery:

>ITMS-90078: Missing Push Notification Entitlement - Your app appears to >register with the Apple Push Notification service, but the app >signature's entitlements do not include the "aps-environment" >entitlement. If your app uses the Apple Push Notification service, make >sure your App ID is enabled for Push Notification in the Provisioning >Portal, and resubmit after signing your app with a Distribution >provisioning profile that includes the "aps-environment" entitlement. >Xcode does not automatically copy the aps-environment entitlement from >provisioning profiles at build time. This behavior is intentional. To >use this entitlement, either enable Push Notifications in the project >editor's Capabilities pane, or manually add the entitlement to your >entitlements file. For more information, see >https://developer.apple.com/library/content/documentation/NetworkingInt>ernet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html>#//apple_ref/doc/uid/TP40008194-CH6-SW1.

>After you’ve corrected the issues, you can use Xcode or Application >Loader to upload a new binary to App Store Connect.

>Best regards,

>The App Store Team

最初は意味不明だった。。

[こちら](https://application.hateblo.jp/entry/2018/09/16/000000)を参考にしたところ、プッシュ通知の設定をしろって事らしい。



#プッシュ通知の設定
・Xcodeを開く
・`TARGETS`を選択
・`signing & capabilities`を選択
・`+Capability`のボタンを押す
・検索枠に`push`と入れて**Push Notifications**を選ぶ

<img width="484" alt="スクリーンショット 2019-10-24 17.40.13.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/45a91d19-6368-b602-05d3-df1200714f33.jpeg">

追加された。

#ビルド番号を変更してもう一度アーカイブを作る
`TARGETS`の中の`General`でビルド番号を変更

<img width="597" alt="スクリーンショット 2019-10-26 20.27.28.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/601f60ca-5afd-ecb4-f58f-ef1627ef6d5e.jpeg">

その後は前にアーカイブを作った通りに
`Product>Archive>Distribute App`で新しいアーカイブを作る。

#App Store Connectでビルドのバージョンを変更
アーカイブのアップロード後、少し時間を置いてからApp Store Connectへ行く。

①**まずは既存のビルドを消す**（赤色のマイナスアイコンを選択）

②またプラスアイコンを押す
<img width="898" alt="スクリーンショット 2019-10-26 20.03.40.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/f6241f5b-7336-d693-c762-3693eb80eda4.jpeg">

③新しいバージョンを選ぶ
<img width="878" alt="スクリーンショット 2019-10-26 20.03.32.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/d3ab7e18-985e-d903-74ea-0d9ec5a8f2ff.jpeg">

今の所同じ警告メールは来ていない。。。


#参考
https://application.hateblo.jp/entry/2018/09/16/000000

再審査に出す方法
https://techa1008.com/rocket-note/2018/03/07/how-to-submit-ios-app-for-reconsideration-on-itunes-connect/
MacのUSキーボードでCapsLockを利用して英字<->かなを切り替える

#CapsLockを利用して簡単に切り替えよう！
<img width="780" alt="スクリーンショット 2019-10-26 16.29.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516139/1ec0ee3e-1768-44aa-864b-9659b2621950.png">
（Catalinaでの状況です。）

画像下部の「Caps LockキーでU.S.入力モードと切り替える」を選択することで、Caps Lockだけで英字とかな文字を切り替えることができます。

ぜひご活用ください。
【Ruby on Rails】rails generate devise:install で terminal が止まる

## 現象

https://qiita.com/Hal_mai/items/350c400e8763ce0487a3

上記の記事を参考にdeviseを導入した際に、以下のコマンドを叩いた時に、 Railsコマンドが動かなくなった。

```
rails generate devise:install
```

## 解決策


Rails application preloader の `spring` を一旦停止させる。

```
bundle exec spring stop
```


## 参考

https://qiita.com/Hal_mai/items/350c400e8763ce0487a3
https://github.com/rails/spring
CSSでブラーアニメーション 円がだんだんにじむ

ページを読み込むとcssで円がにじむメモです

```html:test.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<link rel="stylesheet"  href="style.css">
<title>タイトル</title>
<style type="text/css">
	.r{
		width: 200px;
		height: 250px;
		border-radius: 50%;
		background: orange;
		-ms-filter: blur(1px);
		filter: blur(1px);
		transition: 3s all;
	}
	.blurAnime{
		-ms-filter: blur(10px);
		filter: blur(10px);
	}
</style>
<body>
<main>
<!-- これ円 -->
<div class="r"></div>
</main>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script>
$(function(){
	$('.r').addClass('blurAnime');
});
</script>
</body>
</html>

```
Uncaught TypeError: Cannot read property 'observe' of undefined

Uncaught TypeError: Cannot read property 'observe' of undefined

mutation observerを使用するところでエラーが発生。
解決策：

`$(document).ready(function () {~~~~`の記述を追加する。
readyがないと動きませんでした。

参考：
 https://codeday.me/jp/qa/20190416/639353.html
NameError in Users#edit ユーザー編集画面にならない！

[結論（解決方法）]
viewファイル（views/users/edit.html.haml）のhttpメソッドに：が抜けていたので足すことで解決しました。

before

``` 
= link_to "ログアウト", destroy_user_session_path, method: delete, class: 'btn'
```

after

```
= link_to "ログアウト", destroy_user_session_path, method: :delete, class: 'btn'
```


[エラーが起きた背景]とあるプログラミングスクールでチャット投稿Webアプリを実装中のところ、歯車のアイコンを押すとログアウト編集画面に切り替わるはずが、本エラーが！

![スクリーンショット 2019-10-26 15.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512974/025118de-d6e0-feb2-2c3a-0e00bd3e1035.png)


１：rake routesでちゃんとパスがあるか・Httpメソッド名があってるか確認。

→確認したところ、destroy_user_session_pathもちゃんとあるしメソッドもdeleteメソッドでちゃんと名前あってるぞ。。。むむ・・・・

![スクリーンショット 2019-10-26 15.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512974/d806c17d-1fc9-4f93-e371-eec814282841.png)

２：元のエラーファイルを確認。

```views/users/edit.html.haml
#account-page.account-page
  .account-page__inner.clearfix
    .account-page__inner--left.account-page__header
      %h2 Edit Account
      %h5 アカウントの編集
      = link_to "ログアウト", destroy_user_session_path, method: delete, class: 'btn'
      = link_to "トップページに戻る", :back, class: 'btn'
```

・・・・およ？ httpメソッド（delete）の色がどうやら変だぞ。
・・・あ！コロンが足りないやないか！！！


```
= link_to "ログアウト", destroy_user_session_path, method: :delete, class: 'btn'
```

method: :deleteで修正。→エラー解決しましたああ！！！！

今回の教訓
httpメソッドは：（コロン）で囲むべし！
【Cisco】CiscoルーターでSSH公開鍵認証を設定する

最近ネットワークデバイスに触れておらず、久しぶりに触るためにコンフィグを強制削除したものです。（一応バックアップはありますが、そんなものはないと思い込ませている...)
初期設定からしていく中で、メンテの際にいちいちパスワード認証をするのはめんどくさいのでSSH公開鍵認証を設定しました。これは頻繁に設定するものではなく忘れやすいので設定方法を書いておきます。

# 環境
- Cisco C892FSP-K9
- IOS Version 15.2

# 設定方法

## 鍵ペアを作成
鍵長は最大にしておくことをお勧めします。

```
(config)#enable secret $YOUR_PASSWORD
(config)#ip domain-name $YOUR_DOMAIN
(config)#ip ssh version 2
(config)#crypto key generate rsa
--- omit -----
```

## SSHによる接続許可

```
(config)#line vty 0 4
(config-line)#login local
(config-line)#transport input ssh
```

## 公開鍵認証を設定

```
(config)#ip ssh pubkey-chain
(conf-ssh-pubkey)#username $YOUR_NAME
(conf-ssh-pubkey-user)#key-string
(conf-ssh-pubkey-data)# 自身の公開鍵をペースト
(conf-ssh-pubkey-data)#exit
```


公開鍵をペースト時は数回に渡って分割してください。一度にペーストしすぎると下記のようなエラーが出力されます。

```
%SSH: Failed to decode the Key Value
```

これで設定終了です。自身のマシンからSSHができれば :ok:
:wave_tone1: :wave_tone2: :wave_tone3:
Vue.js と Leaflet で地図を表示するまで

## 概要

地図のためののライブラリであるLeafletとそのVue.js用のラッパーVue2Leafletを使ってVueで地図を表示させます。

## 準備

まず適当なプロジェクトを作成してライブラリをインストールします。
作成にはvue-cliを使っています。

```bash
vue create leaflet-vue && cd leaflet-vue
npm install vue2-leaflet leaflet --save
```

## 地図を表示する

まずはエントリーポイントの`main.js`で以下を追記してcssファイルを読み込ませます。

```javascript:main.js
import 'leaflet/dist/leaflet.css
```

App.vueを以下のように編集します。

ここで注意すべきは`style`の`height`属性です。q
これを指定しなかったり、`height: 100%;`のようにピクセルで指定しないと地図が表示されません。

```vue:App.vue
<template>
  <div id="app">
    <l-map ref="map" style="height: 600px;" :zoom="zoom" :center="center">
      <l-tile-layer :url="url"></l-tile-layer>
    </l-map>
  </div>
</template>

<script>
import { LMap, LTileLayer } from "vue2-leaflet";

export default {
  name: "app",
  components: { LMap, LTileLayer },
  data() {
    return {
      url: "http://{s}.tile.osm.org/{z}/{x}/{y}.png",
      zoom: 8,
      center: [35.693825, 139.703356]
    };
  }
};
</script>

```

## サークルを表示する

地図上にサークルを表示してみます。
サークルを表示するには`LCircle`コンポーネントを使用します。

```vue:App.vue
<template>
  <div id="app">
    <l-map ref="map" style="height: 600px;" :zoom="zoom" :center="center">
      <l-tile-layer :url="url"></l-tile-layer>
      <l-circle :lat-lng="center" :radius="1000" :color="'red'"></l-circle>
    </l-map>
  </div>
</template>
<script>
import { LMap, LTileLayer, LCircle } from "vue2-leaflet";

export default {
  name: "app",
  components: { LMap, LTileLayer, LCircle },
  // ...
  // 以下略
};
</script>
```

## マーカーを表示する

`LMarker`でマーカーを表示できます。
マーカーを使用するにはコンポーネントを読み込むだけでなくもう一手間かける必要があります。
`main.js`に以下を追記します。


```js:main.js
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';

delete L.Icon.Default.prototype._getIconUrl;

L.Icon.Default.mergeOptions({
  iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
  iconUrl: require('leaflet/dist/images/marker-icon.png'),
  shadowUrl: require('leaflet/dist/images/marker-shadow.png'),
});
```

あとはサークルのときと同じです。

```vue:App.vue
<template>
  <div id="app">
    <l-map ref="map" style="height: 600px;" :zoom="zoom" :center="center">
      <l-tile-layer :url="url"></l-tile-layer>
      <l-marker :lat-lng="center"></l-marker>
    </l-map>
  </div>
</template>

<script>
import { LMap, LTileLayer, LMarker } from "vue2-leaflet";

export default {
  name: "app",
  components: { LMap, LTileLayer, LMarker },
  // ...
  // 以下略
};
</script>
```
Visual SLAM ORB_SLAM2 用のカメラキャリブレーションYamlファイルの作成

DJI Tello等ドローンの自律飛行を実現するには、3D環境でナビゲーション経路を計画としてOMPL（Open Motion Planning Library）を試してみます。

# 目次
1. [OMPLのインストール](https://qiita.com/k-koh/items/4f7e441d1225e6580f82)
2. [OMPLの基礎](https://qiita.com/k-koh/items/9933cd29599c859cac45)
3. [OMPL.appの入門](https://qiita.com/k-koh/items/fe1f05313045ed729c8b)
4. [OMPLの使用](https://qiita.com/k-koh/items/3a8b372537aa29e17863)
5. DJI Telloの使用
    1. [DJI Telloのフロントカメラのcamera_calibration](https://qiita.com/k-koh/items/094631646931ea5bc2bb)
    2. [Visual SLAM ORB_SLAM2 用のカメラキャリブレーションYamlファイルの作成](https://qiita.com/k-koh/items/b524fc175198e701bdff)　← いまココ
    3. [DJI Telloのカメラ でVisual-SLAMのORB-SLAM2 を動かしてみた](https://qiita.com/k-koh/items/98b5f079f784b22dcd01)
6. navigationスタックの使い方
    1. [Turtlebot3 NavigationをGazebo Simulationで動かしてみた](https://qiita.com/k-koh/items/1a4fbc175ca37be6206b)
    2. [Turtlebot3 Navigationでmap_fileの代わりにSLAMを使用](https://qiita.com/k-koh/items/1ec9097e4afedd0b43ca)
    3. [ARdroneのシミュレーターをGazeboで動かす](https://qiita.com/k-koh/items/feccbaee7c11c43c3ab4)
    4. [AirSimのシミュレーターを動かす](https://qiita.com/k-koh/items/52122fb5e96336ac8d33)
    5. [octomapのインストール](https://qiita.com/k-koh/items/c9a3a87e043934456842)
    6. [単眼カメラでORB_SLAM2から3D point clouodの生成](https://qiita.com/k-koh/items/1e069c9dda43b85e2fa0)
    7. [point_cloud2から3D octomapの生成](https://qiita.com/k-koh/items/01e34f353487eb8a6e26)
7. OMPLで3D 経路計画
    1. [状態空間環境のセットアップ](https://qiita.com/k-koh/items/e19ac08bb0a16975081e)

## 動作環境
- Ubuntu 18.04
- ROS Melodic
- Tello EDU

# Visual SLAM ORB_SLAM2 用のカメラキャリブレーションYamlファイルの作成

ORB_SLAM2を動かすには、カメラのキャリブレーション設定Yamlファイルがあります。
ORB_SLAM2で使用するYamlファイルのフォーマットがROSのcamera_calibrationの出力Yamlファイルと違いますので、対応関係を説明します。

```console
# rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml
```
TUM1.yamlをコピーして、tello.yamlファイルを作成します。
ROSのcamera_calibrationの出力Yamlファイルから
fx, cx, fy, cy、k1, k2, p1, p2, k3の値を取得してtello.yamlに更新します。

```
ROSのcamera_calibrationの出力Yamlファイル
camera_matrix:
  rows: 3
  cols: 3
  data: [fx , 0, cx, 0, fy, cy, 0, 0, 1]

distortion_coefficients:
  rows: 1
  cols: 5
  data: [k1, k2, p1, p2, k3]
```

```
tello.yaml
# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 921.170702
Camera.fy: 919.018377
Camera.cx: 459.904354
Camera.cy: 351.238301

Camera.k1: -0.033458
Camera.k2: 0.105152
Camera.p1: 0.001256
Camera.p2: -0.006647
Camera.k3: 0.000000
```

Next: 5.3. [DJI Telloのカメラ でVisual-SLAMのORB-SLAM2 を動かしてみた](https://qiita.com/k-koh/items/98b5f079f784b22dcd01)
Prev: 5.1. [DJI Telloのフロントカメラのcamera_calibration](https://qiita.com/k-koh/items/094631646931ea5bc2bb)
【クラス命名に迷わない】HTML、CSSのクラス名を決めるための自分用メモ

##セクション、大きなまとまり
- `hero` -ヒーローイメージ
- `about` -〜についての紹介
- `introduction` -紹介
- `service` -サービス
- `news` -ニュース
- `work` -仕事
- `business` -事業、業務
- `mission` -任務、使命
- `concept` -概要、考え、
- `history` -歴史、沿革
- `event` -イベント、催しのお知らせ
- `person` -人物紹介
- `access` -アクセス、交通手段
- `contact` -コンタクト
- `recommended` -おすすめ
- `recruit` -人材募集


##Block、親要素
- `inner` -インナー
- `container` -コンテナ
- `wrapper` -囲う要素
- `outer` -外側の囲う要素
- `home` -ホーム
- `content` -文章
- `article` -記事
- `post` -投稿
- `entry` -記事


##テキスト関係
- `text` -テキスト
- `description` -説明
- `article` -記事
- `lead` -「導く」という意味で、見出しの補足などに使う
- `summary` -要約
- `title` -タイトル
- `heading` -見出し
- `outline` -概要、概説
- `pickup` -目立たせたい部分に
- `detail` -詳細
- `content` -内容



##画像関係
- `image` -画像
- `picture` -写真
- `thumbnail` -サムネイル
- `figure` -図形、画像


##コンタクトフォーム関係
- `required` - 必須
- `content` -内容
- `country` -国籍
- `mail` -メールアドレス
- `tel` -電話番号
- `address` -住所
- `course` -コース
- `number` -番号、人数
- `students`　-受講者
- `motivation` -動機
- `Preferred-date` -希望日
- `teaching` -指導内容
- `Precautions` -注意事項



随時更新
関節点&橋の検出(low_link)、二重辺連結成分分解

関節点、橋をO(n+m)の計算量で求める、low_linkと呼ばれるアルゴリズム。

関節点の検出。

```python

def articulation_detection(graph, start=0):
    n = len(graph)
    order = [-1] * n
    cnt = -1
    articulation_points = []
    def dfs(u, prev):
        nonlocal cnt
        cnt += 1
        low_pt = order[u] = cnt
        f_cnt = art_flag = 0
        for v in graph[u]:
            if v == prev:
                continue
            if order[v] == -1:
                v_low_pt = dfs(v, u)
                art_flag |= v_low_pt >= order[u]
                low_pt = min(v_low_pt, low_pt)
                f_cnt += 1
            else:
                low_pt = min(low_pt, order[v])
        if len(graph[u]) > 1 and ((prev != -1 and art_flag) or (prev == -1 and f_cnt > 1)):
            articulation_points.append(u)
        return low_pt
    dfs(start, -1)
    return articulation_points

````
橋の検出、縮約グラフの構築(二重辺連結成分分解)。

```python
def bridge_detection(graph, start=0):
    n = len(graph)
    order = [-1] * n
    bridges = []
    cycle_graph = [set() for _ in range(n)]
    cnt = -1
    def dfs(u, prev):
        nonlocal cnt
        cnt += 1
        low_pt = order[u] = cnt
        for v in graph[u]:
            if v == prev:
                continue
            elif order[v] == -1:
                v_low_pt = dfs(v, u)
                if v_low_pt > order[u]:
                    bridges.append((u, v))
                else:
                    cycle_graph[u].add(v)
                    cycle_graph[v].add(u)
                low_pt = min(low_pt, v_low_pt)
            else:
                low_pt = min(low_pt, order[v])
                cycle_graph[u].add(v)
                cycle_graph[v].add(u)
        return low_pt
    dfs(start, -1)
    return bridges, cycle_graph


bridges, cycle_graph = bridge_detection(G, start=0)

def contract(bridges, cycle_graph):
    n = len(cycle_graph)
    cnt = -1
    visited = [0] * n
    group = [-1] * n
    def dfs(u, cnt):
        visited[u] = 1
        for v in cycle_graph[u]:
            if visited[v] == 0:
                group[v] = cnt
                dfs(v, cnt)

    for u in range(n):
        if visited[u] == 0:
            cnt += 1
            group[u] = cnt
            dfs(u, cnt)

    contracted_graph = [[] for _ in range(cnt + 1)]
    for u, v in bridges:
        contracted_graph[group[u]] += [group[v]]
        contracted_graph[group[v]] += [group[u]]
    return contracted_graph

```
橋以外のエッジで繋がっている頂点は縮約グラフでは同じ頂点とみなす。元のグラフにおける橋だけが縮約グラフではエッジとなる。縮約グラフは木構造。
react-native-iapのIapExampleをReactNative0.6x環境で動かす方法

■ダウンロード 

```
git clone https://github.com/dooboolab/react-native-iap.git
```

■移動

``
cd react-native-iap-master/IapExample/
````


■IapExample/metro.config.js を編集

```
/**
 * Metro configuration for React Native
 * https://github.com/facebook/react-native
 *
 * @format
 */

module.exports = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: false,
        inlineRequires: false,
      },
    }),
  },
  resolver: {
    sourceExts: ['jsx', 'js', 'ts'],
  },
};
```

>https://github.com/react-native-community/react-native-image-picker/issues/1165#issuecomment-529216435

■起動

```
npm run start # 不要かも
npm run ios
```
初心者用競技プログラミングの入力方法まとめ（ruby）

#  はじめに

この記事は以下のruby初学者を想定しております
・rubyを使い始めて配列や繰り返し処理、ハッシュなどの概念を理解しているかた。
・paizaやAtcoderなどの競技プログラミングに興味があるけど問題で与えられた数値の適切な取り込み方がわからないかた。

私もはじめ与えられた数値が適切に取得できずに苦労したのでまとめを残しておきます。

##１次元の数値の取り込み
###整数一つの場合
１０

という数値が与えられてそれを取得する場合は

```ruby:
N = gets.to_i
puts N
```

```ruby:コンソール
１０　：入力値

１０　：出力値
```
上記のコンソール画面のように１０を入力して１０が出力されるはずです。

###一列で複数の整数が与えられる場合

１　２　３　…　s

上記のような数値間に半角スペースが数列を入力する場合は数列で取り込むのが簡単なやり方です。

```ruby:
N = gets.chomp.split.map(&:to_i)
puts N
```

```ruby:コンソール
１　２　３　４　５　：入力値

１　　：出力値
２
３
４
５　
```

コードの説明の説明をすると
chompは文字列の末尾の改行文字を取り除いた新しい文字列を返します。（これがないと半角スペースによる改行判定で先頭１文字しか入力できなくなってしまいます。）
splitは文字列を分割し、配列を返すメソッドです。
map(&:to_i)はおなじみの繰り返しメソッドですが末尾に（＆:to_i）を宣言することでinteger 型で入力値を読み込めます。

配列を出力する場合、putsを用いると１文字ごとに改行して出力することに注意してください。

##２次元の数値の取り込み

N　K　Q　　：N　K　Qは全て整数
A1
A2
.
.
.
AQ　：Aの横の数字はQ番目の数値という意味

上記のように一列目を取り込んだ後に、
１行ごとにQ個の数を入力する場合はやり方としては

```ruby:
N, K, Q = gets.chomp.split.map(&:to_i)
A = Q.times.map { gets.to_i }
puts A
```

```ruby:コンソール
6 3 4  ：入力値
3
1
3
2　

3　：出力値
1
3
2
```

これらの組み合わせができればある程度の問題までは対応できました。

文字列に関しても　to_i　を　to_s　に変えれば大丈夫です。


##その他のテクニック（sortを使った並べ替え）

最後に使えると便利な小技として並べ替え（sort）の紹介をしたいと思います。

5 4 7 11 9 2 42 1

入力値として上記の数字の列を与えられて小さい順や大きい順に並べ替えたい時sortのメソッドを使うと便利です。（知らずに苦労してた時期も私にはありました。笑）

```ruby:
N = gets.chomp.split.map(&:to_i)
N.sort!
p N

N..sort! {|a, b| b <=> a }
p N
```



```ruby:コンソール
5 4 7 11 9 2 42 1  :入力値
　
[1, 2, 4, 5, 7, 9, 11, 42]　　：出力値
[42, 11, 9, 7, 5, 4, 2, 1]
```

コンソールを見てみると
1回目の出力で小さい順に並んでいて
2回目の出力で大きい順に並んでいます。

これらのテクを使えば競プロの簡単な問題は解けるようになるはずです。

私も競技プログラミング初心者ですが、一緒に頑張っていきましょう。
ウワサの言語Blawn関連ドキュメントまとめ

これ以外にもありましたら編集リクエストいただけますとありがたいです！

- [リポジトリ](https://github.com/Naotonosato/Blawn)
- [ウワサのBlawnを触ってみた](https://qiita.com/blackenedgold/items/83526b329fe96ee781f5)
- [Blawnビルド・実行などメモ](https://qiita.com/to_obara/items/08a117e89e17fefe408e)
- [Blawn言語をMacでビルドしてみたメモ](https://qiita.com/JunSuzukiJapan/items/502244f10881d6f1dd81)
- [Blawnの文法について](https://gist.github.com/kmizu/dbb12b7be5c7b0339480595dbba1196a)
Mac mini (Mid 2011)にWindows10をインストールする

**色んなエラーが発生して表題の件がどうにもならないという人のためにメモとしてここに残します。**

## 用意するもの
- Mac mini (Mid 2011) - High Sierra 対応している限りの最新OS
- USBフラッシュメモリ - 16GB USB2.0対応USB3.0非対応 ※詳細は後述
- OS - Windows10 Pro Microsoftの公式サイトからダウンロード
- [BootCamp Support Software 5.1.5621](https://support.apple.com/kb/DL1720?locale=ja_JP&viewlocale=ja_JP)

## 注意点
### DVDドライブかUSBフラッシュメモリか、どちらからOSをインストールするかでインストール可能なOSが違う
**DVDドライブからOSをインストールする場合**
対応OS
- Windows7 / Windows8 / ( Windows10 )

**USBフラッシュメモリからOSをインストールする場合**
対応OS
- Windows8 / ( Windows10 )

Windows7はEFI Bootが対応していないため、Windows7を入れたUSBフラッシュメモリを接続しても No bootable devices found というメッセージが出てUSBフラッシュメモリからの起動ができない。

カッコで囲ってある Windows10 に関しては、Mac mini (Mid 2011)が Windows10 には非対応になっているため、公式上はインストールすることが出来ない。


### USBフラッシュメモリの条件
USB3.0対応のUSBフラッシュメモリを使用した場合はOSインストール時にエラーが発生する可能性が高いようです。
私は事前にこの情報を得ていたので、この問題は発生いたしませんでしたが、新規で用意する場合はUSB3.0に対応していないUSBフラッシュメモリで最低8GB必要なので、余裕を持って16GBのものを用意するのが吉。
尚、BootCampでUSBフラッシュメモリのインストールディスクを作成する場合、容量不足のエラーが発生することが多々あったが、容量が足りないためのエラーではない。


### エラーの発生条件と対策
**Q. インストールディスク作成時に上手く行かない、容量不足のエラーが出る**
A. まず、容量不足ではない。イケる時の条件がよく分からないが、止まったと思ってもエラーが数時間放置してればイケてたりする。ちなみに私はこの方法で作成したインストールディスクでOSのインストールを成功していない。

**Q. Windows7をインストールしたいができない**
A. USBフラッシュメモリからは無理、DVDドライブから起動すれば公式のやり方でいける。

**Q. Windows8をインストールしたいができない**
A. HDDのフォーマット次第ではイケると思っています。おそらくGPTフォーマット云々のエラーメッセージが表示されると思いますので、専用のフォーマットの領域を用意すれば良いかと。でも、Windows10の方が良くない？

**Q. Windows10をインストールしたいができない**
A. ここから先に書いてある内容を参考にしてください。

**Q. Windows10のインストール中に画面が真っ暗になる**
A. ここから先に書いてある内容を参考にしてください。


## インストールする上でのポイント
- BootCamp Assistantは使わない
- BootCampは、BootCamp Support Softwareというドライバだけ使う
- Windows10の起動ディスクはWindowsPCで準備する


## Windows10インストールまでの流れ
### □ 準備編(WindowsPCでやること)
#### WindowsPCでUSBフラッシュメモリにWindows10のインストールディスクを作成する
[Windows10のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)から【ツールを今すぐダウンロード】をクリック
ウィザードに従って、Windows10の起動ディスクをUSBフラッシュメモリに作成してください。

#### AppleのサポートサイトからBoot Camp Support Softwareをダウンロードする
Mac mini (Mid 2011)であれば、[こちら](https://support.apple.com/kb/DL1720?locale=ja_JP&viewlocale=ja_JP)ですが、他の機種をお使いであれば、システム要件を参考に対象の機器を探してください。

#### BootCamp Support SoftwareをZip形式から展開し、USBフラッシュメモリのroot(一番上の階層)にコピー&ペーストする


### □ Macでやること
#### ディスクユーティリティーを使って、Windowsをインストールするパーティションの作成
Windowsをインストールするために最低限必要なHDD容量は40GBなので、それ以上に設定。フォーマットはどうせ後でやり直しますが、FAT辺りにしておいてください。

#### 電源を切る

#### USBフラッシュメモリを接続

#### Altキーを押して起動させて、ブートディスク選択画面を開く
なかなか上手くブートディスク選択画面に入れないことも多いですが、他にやりかたはないので、がんばってください。

#### EFIと表示されているディスクを選択してEnter

#### Windowsロゴが表示されてWindowsのインストーラーが起動
ウィザードの通りに進んでいき、Windowsをインストールするディスクを選択する画面になりますが、エラーが発生する場合、Mac OSがインストールされているディスクより下のディスクを削除し、新規を選択してディスクをフォーマットし直してください。

## インストールの途中で画面が真っ暗になってしまった場合
**OSとドライバとハードウェアの相性の関係か知りませんが、画面が表示されなくなることがあります。**
というか、私はありました。
その場合は、そのまま数時間放置していただき、解消しなければ電源長押で強制終了を2回実施すると、Windowsの修復機能が起動します。
修復機能が起動したら、スタートアップ設定から **5) セーフモードとネットワークを有効にする**(F5) で起動すれば画面が点灯した状態でセットアップを進めることができます。

セーフモードでデスクトップ画面までたどり着いたら、USBフラッシュメモリにコピーしたBootCampフォルダ内の setup.exe を起動させて、BootCampのインストール。再起動する前に、スタートボタンを右クリックしてデバイスマネージャを起動させて、ディスプレイアダプター(Mac mini (Mid 2011)の場合は Intel(R) HD Graphics 3000)を削除して再起動。

**これで私のMac mini (Mid 2011)はWindows10で正常に動作しています。**
【Django】Macで0から開発環境構築

#はじめに
この記事では、Mac環境で０からDjangoを用いた開発環境を構築する方法を説明していきます。versionはpythonは３系、Djangoは２系を使っていきます。既にインストール済みのところは飛ばして、必要なところだけ参考にしてください。

#環境
Mac OS Mojave 10.14.5
Homebrew 2.1.15

#pyenvのインストール
pythonのversionを簡単に切り替えることができるようにしてくれるツールです。２系と３系との切り替えに便利で、ディレクトリごとにpythonのversionを切り替えることができます。
既に３系でpythonの環境構築をしている方は、読み飛ばしていただいて構いません。２系と３系を使い分けたい方は参考にしてください。

では早速インストールしていきます。Homebrewを用いて、下記コマンドでpyenvをインストールします。

```
$ brew install pyenv
```

#bash_profileの編集
pyenvにPATHを通すためにbash_profileを編集します。

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

最後にbash_profileの変更内容を適用します。

```
$ source ~/.bash_profile
```

#pyenvでpythonをインストール
version切り替えを体験するために２つほどversionが違うpythonをインストールしてみます。インストールできるか確認をしたければ３つめのコマンドを利用すると一覧が確認できます。

```
$ pyenv install 2.7.12
$ pyenv install 3.7.4
$ pyenv install --list　
```

#pyenvでversionを切り替えてみる
versionの切り替えをしてみます。localの場合は今いるディレクトリに、globalの場合は全体に反映されます。

```
$ pyenv local 2.7.12
$ pyenv global 3.7.4
```

ここできちんと変更が反映されているか確認するためpythonのversionを調べます。

```
$ python --version
Python 3.7.4
```

変更が反映されていれば問題ありません。
反映されていない場合、PATHの通し方によってMacに標準でインストールされているpythonが先に参照されている可能性があります。対処法が下記の記事にまとめられていますので参考にしてください。

- [pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)

#pipのインストール
次にDjangoのインストールに必要なpipをインストールします。pipとはpythonで使われている標準的なパッケージ管理ツールです。python3.4以降では標準でpip3がインストールされていますが、今回はMacに標準でインストールされているpythonではなく、pyenvで管理しているpythonを使用するため、別途インストールが必要です。(この辺りは理解不足のため、もしかしたらインストールの必要はないかもしれません、、、)
インストール後、pipのversionを確認し、以下のようになっていればOK。

```
$ brew install pip
$ pip --version
pip 19.0.3 from /Users/[ユーザ名]/.pyenv/versions/3.7.4/lib/python3.7/site-packages/pip (python 3.7)
```

#pythonの仮想環境を作成
Webアプリケーション開発をする際にいくつもの開発を進めていくとパッケージの依存関係に悩まされることがあります。 そのため、昨今のWeb開発の現場ではプロジェクト毎に仮想環境を構築します。 ここではPythonで予め用意された仮想環境構築ツールを使って仮想環境を構築します。１つ目のコマンドで仮想環境を作成し、２つ目のコマンドで仮想環境をアクティベートします。アクティベートできるとターミナルの左端に([仮想環境名])が表示されます。

```
$ python -m venv [仮想環境名]
$ source [仮想環境名]/bin/activate 
```

これでプロジェクトごとにpipのパッケージを管理できるようになります。ちなみに仮想環境から抜けるには以下のコマンドを実行してください。

```
$ deactivate
```

#Djangoのインストール
やっとDjangoのインストールです。仮想環境をアクティベートした状態で、先ほどインストールしたpipを用いてDjangoの２系をインストールします。

```
$ pip install Django==2.2.6
```

Djangoがインストールできたか確認します。

```
$ python -m django --version
2.2.6
```

#仮想環境内にDjangoプロジェクトを作る
仮想環境内で以下のコマンドを実行することで、Djangoプロジェクトを作成することができます。

```
django-admin startproject [プロジェクト名]
```

#おわりに
これでDjangoの開発環境が構築できました！
実際にDjangoを用いてWebアプリケーションを作っていくにはもう少し準備(DBとの接続など)が必要となりますが、今回はここまでとします。

#参考

- [pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)
- [Mac環境へのPython3系インストール](https://qiita.com/spyc/items/73d1295f8b3dde3b49ca)
MysqlのソートでNULLや0を最後に並べる方法

## 前置き
Mysqlでは、
シンプルにソートを行うと、
`0`や`NULL`は先に並べられてしまいます。


```sql:SQL

SELECT *
FROM tests
ORDER BY
    rank ASC;
```

```sql:NULL->0->1~の順番になってしまう
+----+------+
| id | rank |
+----+------+
|  4 | NULL |
|  3 |    0 |
|  1 |    1 |
|  2 |    2 |
+----+------+
```

以下の方法で、NULLや0を最後に並べられるので、ぜひ使ってみてください！

## NULL を最後に並べたい場合

```sql:SQL

SELECT *
FROM tests
ORDER BY
    rank IS NULL ASC, /* 追加 */
    rank ASC;
```


```sql:0->1~->NULLの順番になる
+----+------+
| id | rank |
+----+------+
|  3 |    0 |
|  1 |    1 |
|  2 |    2 |
|  4 | NULL |
+----+------+
```


## NULL と 0 を最後に並べたい場合

```sql:SQL

SELECT *
FROM tests
ORDER BY
    rank IS NULL ASC, /* 追加 */
    rank = 0 ASC, /* 追加 */
    rank ASC;
```


```sql:1~->0&NULLの順番になる
+----+------+
| id | rank |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    0 |
|  4 | NULL |
+----+------+
```
【Excel 関数】自動項番の付け方

#### Excel関数で項番をつけたいと思ったときに脳死でコピペできる関数を用意しました。

**１：行に連続した項番を付ける場合**
自セル完結型のため、どこにコピペしても使え、循環参照や式エラー、関数自体の修正が一切不要です。

```
=IFERROR(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),-1,0)+1,1)
```

例）関数をB2,B3,B5セルに入力するとこうなる。

|#|A|B|C|
|--:|:-:|:-:|---|
|1|||
|2||1||
|3||2||
|4||||
|5||1||

**２：連続していない行に項番を付ける場合**
たまに縦にセル結合しているがゆえ、連続して項番をつけられないときがありますね。
※そういう表の作り自体が悪いことは置いといて…

行を飛ばしたい場合は、ちょっと長い関数になります。

```
=MAX(INDIRECT(CELL("address",OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),(ROW(INDIRECT(ADDRESS(ROW(),COLUMN())))-1)*-1,0))&":"&CELL("address",OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),-1,0))))+1
```

例）関数をB2,B3,B5セルに入力するとこうなる。

|#|A|B|C|
|--:|:-:|:-:|---|
|1|||
|2||1||
|3||2||
|4||||
|5||3||

IF文を使い、他のセルの状態に合わせた条件を追加すれば、オートフィルなどで手軽に利用できるかと思います。

参考になれば幸いです。
picoCTF 2019 vault-door-1 - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/53831cf6-f686-3270-53e6-d7959092d003.png)

#解いてみた

Javaファイルを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/356b4fdc-6466-44ea-7daf-388a21e3d229.png)

うまく順番を並べ替えればそれが答えでした。
picoCTF 2019 strings it - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/093395fe-36a4-49c7-3793-c62564e48452.png)

#解いてみた

ファイルを開いて「pioc」で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/abec6a1d-9cfa-3668-807c-930b7d4425da.png)

何を問う問題？
picoCTF 2019 logon - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8778be7e-65d1-fcc1-378b-b19b188aa1b4.png)

#解いてみた

リンクをクリックしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9d778855-501b-5b41-215b-0d8507e89ab3.png)

ログイン画面です。
ここを突破するとフラグがもらえるんでしょう。

いろいろボタンを押してみます。
Sign Inボタンを押すと/loginに遷移するはずなのに/flagに遷移しているので、何かリダイレクトしてるのかなとか怪しめだなという印象。

ただhttpsなのでwiresharkを使ってパケットを見ることができない。。。
と思ったら問題文にもう一つURLが書かれていて

```
http://2019shell1.picoctf.com:37907
```

はhttpなのでリンクが見れることが分かった。
wiresharkを使ってパケットを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/65d73785-a1d8-f70f-c6be-43d2671587a6.png)

やはりリダイレクトしていました。
そしてadmin=FalseというCookieがありました。
これをtrueにすれば行けそうです。

ChromeのプラグインEditThisCookieを使ってCookieを書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/82185924-3a8e-4267-49fb-de92dc3e4d98.png)

これで再度アクセスしてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/65b8bb7c-a4f1-b4c0-5726-e162579a162c.png)

できました。