OmniAICreator/Qiita-1.07M huggingface dataset:
【Puppeteer】アリババログイン処理メモ[おぞましい]

```js

async function loginToAlibaba(browser: any){
  const loginPage = await browser.newPage();
  await loginPage.setDefaultNavigationTimeout(3000000);
  await loginPage.setDefaultTimeout(3000000);
  await loginPage.goto(
    'https://login.taobao.com/member/login.jhtml'
  );
  await loginPage.screenshot({ path: 'login.png' });
  console.log('ready set user name');
  await loginPage.focus('#TPL_username_1');
  await loginPage.type('#TPL_username_1', ALIBABA_LOGIN_USER_NAME);
  console.log('done input user name');
  console.log('ready set password');
  await loginPage.focus('#TPL_password_1');
  await loginPage.type('#TPL_password_1', ALIBABA_LOGIN_PASSWORD);
  console.log('done input password');
  await loginPage.screenshot({ path: 'login44.png' });
  await loginPage.click('#J_SubmitStatic');
  console.log('done submit login form info');
  await loginPage.screenshot({ path: 'login2.png' });
  console.log('loading identification forms page...');
  await loginPage.waitForSelector('.btn-confirm');
  console.log('ready click submit button2');
  await loginPage.click('.btn-confirm');
  console.log('done submit login2 form info');
  await loginPage.screenshot({ path: 'login3.png' });
  await loginPage.waitForNavigation({waitUntil: "networkidle2"})
  await loginPage.screenshot({ path: 'login_finished.png' });
}
WindowsみたいにMacでもショートカットキーで画面回転したい

#背景
windowsからmacに乗り換えてみて、ショートカットキーによる画面回転ができないことが微妙に不便だったのでなんとかしたいと思いました。

#環境
・MacOS X Mojave 10.14
・Automatorバージョン2.9 (444.42)
・LG モニター 27UK850-W 27インチ

#実装
(一応自己責任でお願いします)
###step1:
次のコマンドを実行してdisplayplacer(CUIでディスプレイ設定を変更できる)を入れます。
```brew tap jakehilborn/jakehilborn && brew install displayplacer```

###step2:
次のコマンドを実行して現在のディスプレイの情報を表示させます。
```displayplacer list```

色々情報が出ますが、必要なのは最後の一行です。
```displayplacer "id:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx res:2560x1440 hz:60 color_depth:8 scaling:on origin:(0,0) degree:0"```

これが現在のディスプレイ設定です。コピペしてそのまま実行しても何も変わらないのですが、例えばdegreeの値を90に変更して実行すると画面が回転します。
(もしかしたらディスプレイによってはうまくいかないかもしれないです。ちなみに私の環境だと半回転した状態からもとの状態に戻すとき何故か“Screen ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx: could not find res:2560x1440x60 color_depth:8 scaling:off”というエラーがでます。でも回転自体はできてるからとりあえずOK)

###step3:
MacのAutomator→クイックアクションでスクリプト登録します。
<img width="1000" alt="スクリーンショット 2019-09-28 17.23.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267592/f4f5c94f-4155-97e8-2517-09b7b5e6cbdc.png">


"スクリプト"等で検索して"シェルスクリプトを実行"を選択します。
"ワークフローが受け取る項目："を"入力なし"に設定して"シェルスクリプトを実行"の欄にdisplayplacerのスクリプトを貼り付けて保存します。私はdegree0という名前で保存しました。
<img width="1000" alt="スクリーンショット 2019-09-28 17.24.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267592/a9a65ec6-48f7-a490-c086-96c585dc55ec.png">


同様にdegree:270にしたスクリプトも登録します。

###step4:
システム環境設定　→　キーボード　→　ショートカット　→　サービスで上記で登録したサービスのショートカットを登録します。(私はcommand+control+←で270°回転、command+control+↑で0°回転になるようにしてます)
<img width="668" alt="スクリーンショット 2019-09-28 17.21.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267592/625bacba-6354-cacb-c699-8a0a42dc3ba0.png">


#実演
![ezgif-3-49b280172492.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267592/73c82d9c-c5bc-c9ae-2f5e-9aa0481c6d38.gif)

#最後に
もっと良い方法あったら教えてね。
NetworkImageでAndroid Emulatorだけ画像が表示されない[Flutter][Mac]

# 状況
以下のサンプルで画面に画像を表示しようとしたところ
`iOS Simulator(iPhone8)`では画像が表示されたが
`Android Emulator(Nexus6)`では画像が表示されない

```Sample.dart
import 'package:flutter/material.dart';

void main() => runApp(
    MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: Text("hogeSample"),
            backgroundColor: Colors.green,
            ),
          backgroundColor: Colors.deepPurple,
          body: Center(
            child: Image(
                    //ここがうまくいかない
                    image: NetworkImage('https://qiita-user-profile-images.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F427937%2Fprofile-images%2F1561490860?ixlib=rb-1.2.2&auto=compress%2Cformat&lossless=0&w=300&s=eafa563fc759df778dafdcd7364c784a'),
              ),
            ),
          ),
      ),
);
```

#### Error Log
```
I/flutter (17431): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
I/flutter (17431): The following SocketException was thrown resolving an image codec:
I/flutter (17431): Failed host lookup: 'qiita-user-profile-images.imgix.net' (OS Error: No address associated with
I/flutter (17431): hostname, errno = 7)
```

# 原因
`iPhone`で表示されて`Android Emulator`で表示されないのは
そもそも**`Android Emulator`だけインターネットに接続できない**のが原因らしい
(Chrome開いてもどこにもアクセスできず、、、)
そりゃネット繋がらないんだからurlから画像取ってこれませんね。。

# 対策
インターネットに頑張って繋げる
→DNSサーバの設定で`8.8.8.8`を使うように`Mac`側で設定しましょう
#### システム環境設定を開く
![スクリーンショット 2019-09-28 18.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/70faaa0f-4279-5554-85f0-f70fdce411d8.png)

#### 8.8.8.8に設定
![スクリーンショット 2019-09-28 18.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/10b51c14-140f-998f-578f-1e1275a41ea0.png)

これで`Android`でもネットにアクセスでき
`NetworkImage`が機能して画像を取ってきてくれるようになりました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/97b61dc7-3f86-004d-b9d9-6aed2887870f.png" width=50%>

**・[emulation - Android emulator not able to access the internet - Stack Overflow](https://stackoverflow.com/questions/42736038/android-emulator-not-able-to-access-the-internet)**

**・[Androidのエミュレータでネットワークにつながらない場合の対処法 - Qiita](https://qiita.com/b_a_a_d_o/items/0df614e460582ac05628)**
→`terminal`側からも設定するやり方もあります
(~~sdk入ってるはずなのに`emulator: command not found`となってしまい、↓の文献も見たのですが理由はよく分からず、、~~)
→**こう修正すればできました(リンク先も修正されています)**

```
cd (SDKの場所)/sdk/emulator
./emulator -list-avds
# この場合は Nexus_5X_API_25 の仮想デバイスでDNSサーバー 8.8.8.8 を利用する
./emulator -avd Nexus_5X_API_25 -dns-server 8.8.8.8
```
**・[android - Emulator command not found on Mac OS 10.7 - Stack Overflow](https://stackoverflow.com/questions/25514409/emulator-command-not-found-on-mac-os-10-7)**

**・[Androidエミュレータがインターネットに繋がらない<AndroidStudio> - Qiita](https://qiita.com/ak-nk/items/813d26f9c6fd75a496f2)**
→DNS以外が原因であるパターンもあるようです
form_with でtextareaタグのサイズ指定

## ruby on rails で form_with内に`textarea`を入れる方法

```ruby
<%= form_with model: @post, url: posts_path, method: :post do |f| %>
  <%= f.text_area :content, size: "30x10" %>
  <input type="submit" value="投稿する">
  <% end %>
```
こんな感じ！ `f.text_area`　っていうのを知らなくて結構時間かかった^^;

参考記事
[text_areaタグのサイズ指定方法](https://review-of-my-life.blogspot.com/2018/01/rails-text-area-tag-size.html)
selenium-webdriverでaタグの集合にループでアクセスする際の注意点

## これは何？

クローラーを作っていると、「特定のaタグの集合から順番にその `href` の値にアクセスしていきたい」場面があると思います。
その際に上手く動かなくてハマったことがあったのでその共有と解決策をまとめます。

## バージョン

- Ruby: 2.6.4
- selenium-webdriver: 3.142.4

## NG例

最初に上手く動かない例です。

```ruby
elements = @driver.find_elements(xpath: 'aタグを取ってくる何か')
elements.each do |element|
  @driver.get(element.attribute('href'))
end
```

これだと1つ目の `element` はアクセスできますが、2つ目以降にアクセスしようとすると以下のようなエラーが発生します。 

```
stale element reference: element is not attached to the page document (Selenium::WebDriver::Error::StaleElementReferenceError)
```

[ドキュメント](https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Error/StaleElementReferenceError) から現在のページから該当のDOMをアタッチできない（つまり見つけられない？）からエラーになってそうな感じがします。
実際、エラーが起こる時は最初に該当のaタグを取ってきたページと違うページにいるのでそのエラーが起こるのにも納得感があります。

## OK例

なので、ループで回す前に飛ぶためのリンクの配列を作ってそれをループで回してアクセスしてけば解決します。

```ruby
elements = @driver.find_elements(xpath: 'aタグを取ってくる何か')
urls = elements.map {|element| element.attribute('href') }
urls.each do |url|
  @driver.get(url)
end
```
GoogleMap APIでPromiseを使う

ルート検索の際のコールバックをPromise化してみる

```javascript
        /**
         * ルート検索結果をPromiseに包んで返す
         */
        function routePromise(request) {
            return new Promise(function(resolve, reject) {
                var d = new google.maps.DirectionsService();
                d.route(request, function(result, status){
                    if (status == google.maps.DirectionsStatus.OK) {
                        resolve([result, status]);
                    } else {
                        reject([result, status]);
                    }
                });
            });
        }
```

これで、呼び出しの際に以下のように使える。ScalaのOptionみたいなものがあれば、もっとちゃんとできるのだけど。

```javascript
var result, status;
await routePromise(request)
        .then((res) => {
            [result, status] = res; // resolveされたときの返り値
        })
        .catch((err) => {
            [result, status] = err; // rejectされたときの返り値
        });
```

参考: [How to use Promise in Google Map?](https://bytutorial.com/blogs/javascript/how-to-use-promise-in-google-map)
kanban制作　ruby on rails

## 各ページで共通するようなヘッダーやフッターはpertialの中に記述する

```ruby
<%= render 'partial/header' %>
```
 /views/partial/_header.html.erb　のようにpartialの先頭にはアンダースコアをつける。

## devise使用時 deviseをユーザモデルに紐づける場合は 'rails g deivse User'　とする
そうすると、route.rbに自動的にdevise用のルーティングが設定されます。


## deviseを作成した時点で、viewファイルは作られているが見えていない。編集するために `rails g devise views'　をする必要あり

##　deviseを導入することによって使える メソッドが存在する
current_user(現在ログインしているユーザ) など
authenticate_user!などのヘルパーメソッドも含む

## strong parameterを理解したい
```rb
 before_action :authenticate_user!
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
      devise_parameter_sanitizer.permit(:account_update, keys: [:name])
    end
```

## localの言語設定を変更したい時はja.ymlを作成して該当の箇所に追記。

##  resourcesの記法

```rb
resources :list, only: %i(new create)
```

## ストロングパラメータ
```rb
params.require(:list).permit(:title).merge(user: current_user)
```

## link_to記法
 ```rb
link_to(content_tag(:i, '', class: 'fas fa-pen'), edit_list_path(list))
``` 

## deleteメソッド　と　destroyメソッドの違いについて
deleteメソッドは指定した条件に合致するレコードを一件削除する。
destroyメソッドはモデルを通して指定した条件に合致するレコードとそれに関わるレコードも削除する。
関連付けさせたモデルにdependent: :destroyを指定していれば、関連付けされたモデルも削除される。

## 外部キーとは

## ルーティングをネストする

## この時の　@valid？　の使い方が分からない
```rb
def create
    @card = Card.new(card_params)
    if @card.save
      redirect_to :root
    else
      @card.valid?
      render action: :new
    end
  end
```


##select文とは？
```rb
 <%= select :card, :list_id, @lists.map{ |l| [l.title, l.id] }, {}, { class: 'form-control' } %>
```


## form_with について
 [form_withの使い方リンク](https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502)
備忘録：スプレッド構文と分割代入

タイトルの通り、スプレッド構文と分割代入を最近知ったのでQiitaの初使用と
併せて書いてみることにした。

##スプレッド構文
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)
・配列名やオブジェクト名の先頭に__「...」__のスプレッド演算子を付ける。これだけで中身を展開してくれる。

```javascript
const hobbies = ['Sports', 'Cooking'];
console.log(...hobbies);
// Sports Cooking　が出力される
```
・slice( )のようなこともやってくれる。

```javascript
const hobbies = ['Sports', 'Cooking'];
const copiedArray = [...hobbies];

copiedArray.push('soccer');
console.log(hobbies);
// [ 'Sports', 'Cooking' ] hobbiesは元のまま
```

##分割代入
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
他人のGitHubで最初見かけたときは、何やってるのかいまいち理解できなかった。あと分割代入という言葉を
知らなくて、ドキュメントに辿り着くまで少し時間がかかった。Destructuringで検索して見つけることができた。
内容の説明がちと難しいが、配列のインデックスやオブジェクトのプロパティ名に一致するものを対象から
取り出して格納するという流れ。
>配列

```javascript
const hobbies = ['Sports', 'Cooking'];
[first, second] = hobbies;
console.log(first, second);
// Sports Cooking　が出力。配列のインデックスに応じて値が格納されている。
```
>オブジェクト

```javascript
const person = {
  name: 'beya',
  age: 34,
  greet() {
    console.log('Hi I am ' + this.name);
  }
};

const { name, age } = person;
console.log(name, age);
// beya 34 が出力。プロパティ名が一致し、対象の値が格納されている。

const printName = ({ name }) => {
  console.log(name);
}
printName(person);
// beya が出力。使い方を誤らなければ便利そう。

```
##react
>ちょっとかくところがなかったのでここに追記

```react
/* doesShowはboolean型。先頭に「！」をつけることで
   trueならfalse、falseならtrueにセットしてくれる。*/
this.setState({showPersons: !doesShow});
```

と初記事はここまで。ソースコードを書くさなか、無意識にCtrl + S で保存する癖が発動……
慣れが必要だと思いました。
atom packageでkeyEvent

毎度のごとく雑備忘録です。
#問題
atomでキー入力に応じたあれこれをしようと思い、package generatorでパッケージを作りました。
普通の方法でキーイベントを登録しようと試みましたが、どうにもキー入力を受け取っていない様子。

```js
window.addEventListener('keydown', this.onKeyDown);

onKeyDown(e) {
  //ここにあれこれを実装
}
```

#解決
```js
editor = atom.workspace.getActiveTextEditor();
editorView = atom.views.getView(editor);
editorView.addEventListener('keydown', this.onKeyDown.bind(this));

onKeyDown(e) {
  //ここにあれこれを実装
}
```
どこかで止められてるのか`window`からだとkeyEventが取れなかったので、editorのDOM要素に直接イベントを登録しました。
試していませんが、`getView(editor)`のところはatom.workspaceやpaneからでもいけるんじゃないでしょうか。
【Swift入門】ラベルについてまとめてみた

つい数日前からSwiftに触れ始め、わかりにくいなーと思ったので、メモします。

##1.ラベルを使った関数の基本形
__ラベル__とは、関数の呼び出し時に使用する名前のこと。

```swift:ラベルを使った関数の宣言の書式
func <関数名>(<ラベル1> <引数名1>:<型1>, <ラベル2> <引数名2>:<型2>…) {
	<文>
}
```

##2.ラベルを使った関数の例

```swift:ラベルを使った関数の宣言
func areaOfTriangle(withBase base:Int, height:Int) {
	// 引数名(base)は、宣言用
	print(base * height / 2)
}

// ラベル(withBase)は、呼び出し用
areaOfTriangle(withBase: 3, height: 4)
```
上記の例で分かるように、「__ラベルは呼び出し用、引数名は宣言用__」に使用している。


##3. 関数の宣言時にラベルを省略した場合

```swift:ラベルを省略した場合に自動的に補われるラベル
func areaOfTriangle(withBase withBase:Int, height height:Int) {
	print(withBase * height / 2)
}
```
* 関数の宣言時にラベルを省略した場合、Swiftはラベルを自動的に補う。

* 第2引数名であるheightのラベルを省略しても、自動的にheightというラベルが補われるので、関数を呼び出すことができる。

* このように、ラベルが不要な引数名ではラベルを省略でき、省略した場合は引数名と同名のラベルが自動的に補われる。
web3SwiftでEthereum送信時のエラー一覧

# 備忘録
自分用のメモです。
# Ethereum送信時のエラー一覧

1. insufficient funds for gas * price + value
2. exceeds block gas limit 
3. intrinsic gas too low

# エラー内訳

1. 残高が足りない時のエラー。
2. ガスリミットの値が不適切な時のエラー。ガスリミットが高過ぎます。
3. ガスリミットが低過ぎる時のエラー。ガスリミットは最低でも21000は必要です。
インフラエンジニアがVue.jsを初めてみた

普段AWSやGCPをいじっているのですが、今回はフロンドエンド業界で有名な、Vue.jsを触ってみたので、そのインストールまでのまとめです。

最終的にはAPI Gateway + Lambda + DynamoDB + S3のようなクラウドネイティブな形にしていければ面白いかなと思いますが、まずはS3にSPA的な形で動くものを置いてみるところから始めます。

#Vue.jsとは？
javascriptのフレームワークの一種です。jQueryの進化版くらいの認識
詳しくは[公式サイト](https://jp.vuejs.org/)を見てください。
最近のフレームワークはPythonの[Django](https://www.djangoproject.com/)に関してもそうですが、とても充実していますね。使う側からしたらありがたい話です。
Vue.jsの特徴として双方向バインディングというのがあります。画面への描画と内部でリンクしているオブジェクトが常時リンクしている形を取っているため、従来だと複雑なことを記載しないといけない部分を比較的簡単に実装することが可能です。
またフレームワーク自体シンプルな構成をしており、かつ学習コストが低いため、私のような普段プログラミングしないインフラエンジニアでも簡単に使うことができます。


#vue-cliのインストール
私の記事投稿時点の環境はMacなので、Homebrewを使いインストールに必要なnodebrewをインストールしています。
また別環境でAWSのCloud9を使ってインストールすることもできました。その際は事前にセキュリティグループで手動で8080ポートを開けておく必要があることに注意しましょう。

バージョンの確認。あまりに古い場合はアップグレードしておきましょう。

```bash:
$ node -v
v12.11.0

$ npm -v
6.11.3
```

vue-cliのインストール

```bash:
$ npm install -g @vue/cli

$ vue -V
3.11.0
```

#プロジェクト作成
プロジェクトを作成します。作業用ディレクトリに移動し、コマンドを実行します。今回はtest-pjとします。
途中作成するモードを選びますが、defaultでOKです。

```bash:
$ mkdir vue-pj #Vueプロジェクト用にディレクトリを作成
$ cd vue-pj
$ vue create test-pj

Vue CLI v3.11.0
? Please pick a preset: default (babel, eslint)

Vue CLI v3.11.0
✨  Creating project in /Users/xxxxx/vue-pj/test-pj.
🗃  Initializing git repository...
⚙  Installing CLI plugins. This might take a while...
```

#サーバの実行
プロジェクトを作成すると、プロジェクトの名前のディレクトリが作成されるので、移動しサーバを起動する。

```bash:
$ cd test-pj
$ npm run serve
```
ブラウザで http://localhost:8080/ か http://127.0.0.1:8080/ でアクセスしてください。
実行環境によりますが、実行端末のプライベートIPやグローバルIPでもアクセス可能な場合があります。
私はなぜかlocalhostでアクセスできなかったので、ループバックアドレスでアクセスしました。

![vue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475010/49fa6bf7-3b25-a0f3-ab09-7391bb424a6b.png)

上記画面が出てくれば完了。

今回はここまで。
Ethereumアカウント アイコン画像取得方法

# 自分への備忘録として展開
**自分用**のメモとして展開します。
# 取得方法
Apiを叩いて末尾にアドレスを指定するとアドレスの画像が帰ってきます。
UserAgentなどは指定しなくて大丈夫です。
# 実際のアイコンを取得するAPI
https://eth.vanity.show/

# 例
https://eth.vanity.show/"アイコンが欲しいアドレス"
vueのメソッドハンドラにおけるhandlerとhandler()の違いについて

# 概要
vue.jsのメソッドハンドラについて、`@click="handler"`と書いても`@click="handler()"`と書いても動くが、記述スタイルの違いだけではなく挙動に違いがあるから注意しよう、という話。

自分が書いているコードに`@click="handler"`と`@click="handler()"`が混在していたので,
`@click="handler()"`に統一してみたところバグったのがきっかけ。

# 結論
イベントオブジェクトの取り扱い方が変わります。前者の場合はvueが用意してくれるので引数として使うことができますが、後者の場合は明示的に渡してあげる必要があります。

# 具体例

```js
methods: {
  handler: function (event) {
    // 何らかの処理
  }
}
```

としてイベントオブジェクトを使いたいとします
## ()なし

```.vue
<div id="example">
  <!-- ()なし -->
  <button @click="handler">Click</button>
</div>

<script>
export default {
  methods: {
    handler: function (event) {
      console.log(event)
    }
  }
}
</script>
```

問題なく動作します。

## ()あり
### bad

```.vue
<div id="example">
  <!-- ()あり -->
  <button @click="handler()">Click</button>
</div>

<script>
export default {
  methods: {
    handler: function (event) {
      // eventがundefinedとなる
      console.log(event)
    }
  }
}
</script>
```

イベントオブジェクトが渡されないのでうまくいきません。
※()をつける記法自体は間違いではありません。イベントオブジェクトが渡されなくなるだけです。

### good

イベントオブジェクトを使いたい場合は特別な変数`$event`を使って明示的に渡してあげる必要があります。

```.vue
<div id="example">
  <!-- $eventを明示的に渡す -->
  <button @click="handler($event)">Click</button>
</div>

<script>
export default {
  methods: {
    handler: function (event) {
      console.log(event)
    }
  }
}
</script>
```

`$event`は何番目の引数でも問題ありません。

```.vue
<div id="example">
  <!-- $eventを明示的に渡す -->
  <button @click="handler(arg1, $event, arg3)">Click</button>
</div>

<script>
export default {
  methods: {
    handler: function (arg1, event, arg3) {
      console.log(event)
    }
  }
}
</script>
```

# 所感
個人的には、イベントオブジェクトを使うときは`@click="handler($event)"`のように明示的に記載する方法に落ち着きました。


# 参考
https://v1-jp.vuejs.org/guide/events.html
go で、name に ダブルクオートがある JSON を扱いたい

```json
{ "double\"quote":123 }
```

のような JSON を go で書き出したくなったんだが、これを `json.Marshal` で構造体から書き出す方法がわからない

## 試行錯誤

まあまずはソースコード:

```go
package main

import (
	"encoding/json"
	"log"
)

type Hoge0 struct {
	Foo int `json:"no-double-quote"`
}

type Hoge1 struct {
	Foo int `json:"double\u0022quote"`
}

type Hoge2 struct {
	Foo int `json:"double\"quote"`
}

type Hoge3 struct {
	Foo int `json:"double\\"quote"`
}

type Hoge4 struct {
	Foo int `json:"double"quote"`
}

type Hoge5 struct {
	Foo int "json:`double\"quote`"
}

type Hoge6 struct {
	Foo int "json:'double\"quote'"
}

func test(name string, o interface{}) {
	j, err := json.Marshal(o)
	if err != nil {
		panic(err)
	}
	log.Println(name, ":", string(j))
}

func main() {
	test("no dq", Hoge0{})
	test("u0022", Hoge1{})
	test("one bs", Hoge2{})
	test("two bs", Hoge3{})
	test("zero bs", Hoge4{})
	test("use bq", Hoge5{})
	test("use sq", Hoge6{})
}
```

そして実行結果:

```text
2019/09/28 17:13:29 no dq : {"no-double-quote":0}
2019/09/28 17:13:29 u0022 : {"Foo":0}
2019/09/28 17:13:29 one bs : {"Foo":0}
2019/09/28 17:13:29 two bs : {"Foo":0}
2019/09/28 17:13:29 zero bs : {"double":0}
2019/09/28 17:13:29 use bq : {"Foo":0}
2019/09/28 17:13:29 use sq : {"Foo":0}
```

全部負け。

じゃあどうしろと。

## 該当部分のソースを見る

あとで見る。
【rails】rails newする時の手順

# はじめに
rails new する時の手順を備忘録として残しておきます。

# 1.rails new

railsのversionを指定したりやオプションをつけてrails newします。

```
$ rails _5.0.7.2_ new beta-mon -d mysql --skip-turbolinks --skip-test
```





# 2.Gemfile編集

必要なGemfileを追加してから、bundle installします。

```
$ bundle install
```

# 3.GitHubでリポジトリ作成

New押下。
<img width="1068" alt="railsnew1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442023/2861025d-8c6d-0f4c-cd2c-ddd6e08af3e0.png">

Repository name を入力し、Create repository押下。
<img width="1440" alt="railsnew2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442023/5aa097d7-d66e-48a6-645a-0f6fbe8dd670.png">

URLをコピーする。
<img width="1440" alt="railsnew3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442023/83531a2d-3b28-2643-a888-9b666b1e6a33.png">


# 4.Git

```
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/username/hoge.git #先ほどコピーしたURL
$ git push -u origin master
```

# 5.DB作成

```
$ rake db:create
```

# 6.rails s
無事に出来ました。
<img width="1440" alt="railsnew4.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442023/52eb9df1-b4be-aa8f-a7a3-e9d1e36c4066.jpeg">
Pythonで中置記法を逆ポーランド記法に変換して計算する

```python

#演算子のための定数
LEFT_ASSOC = 0
RIGHT_ASSOC = 1
 
#対応する演算子
OPERATORS = {
    '+' : (0, LEFT_ASSOC),
    '-' : (0, LEFT_ASSOC),
    '*' : (5, LEFT_ASSOC),
    '/' : (5, LEFT_ASSOC),
    '%' : (5, LEFT_ASSOC),
    '^' : (10, RIGHT_ASSOC)
}
 
#演算子かどうかの確認
def is_operator(token):
    return token in OPERATORS.keys()
 
#結合性の確認
def is_associative(token, assoc):
    if not is_operator(token):
        raise ValueError('Invalid token: %s' % token)
    return OPERATORS[token][1] == assoc
 
#二つの記号の優先順位を確認
def cmp_precedence(token1, token2):
    if not is_operator(token1) or not is_operator(token2):
        raise ValueError('Invalid tokens: %s %s' % (token1, token2))
    return OPERATORS[token1][0] - OPERATORS[token2][0]
 
#中置記法を逆ポーランド記法に変換する
def infix_to_RPN(tokens):
    out = []
    stack = []
    for token in tokens:
        if is_operator(token):
            while len(stack) != 0 and is_operator(stack[-1]):
                if (is_associative(token, LEFT_ASSOC) and
                    cmp_precedence(token, stack[-1]) <= 0) or(
                    is_associative(token, RIGHT_ASSOC) and
                    cmp_precedence(token, stack[-1]) < 0):
                    out.append(stack.pop())
                    continue
                break
            stack.append(token)
        elif token == '(':
            stack.append(token)
        elif token == ')':
            while len(stack) != 0 and stack[-1] != '(':
                out.append(stack.pop())
            stack.pop()
        else:
            out.append(token)
    while len(stack) != 0:
        out.append(stack.pop())
    return out
 
#リストの要素をタブ区切りの文字列にする
def list_to_str_with_space(lst):
  str_w_space = '\t'.join([i for i in lst])
  return str_w_space

ops = {
  "+": (lambda a, b: a + b),
  "-": (lambda a, b: a - b),
  "*": (lambda a, b: a * b),
  "/": (lambda a, b: a / b),
  "^": (lambda a, b: a ** b)
}

#逆ポーランド記法の数式を計算する
def calc_RPN(expression):
  tokens_RPN = expression.split()
  stack = []

  for token in tokens_RPN:
    if token in ops:
      arg2 = stack.pop()
      arg1 = stack.pop()
      result = ops[token](arg1, arg2)
      stack.append(result)
    else:
      stack.append(int(token))

  return stack.pop()

#入力と出力のための関数
def in_and_out(input_equation):
    output = infix_to_RPN(input_equation.split(" "))
    stri = list_to_str_with_space(output)
    print(stri)
    result = calc_RPN(stri)
    print(result)

if __name__ == '__main__':
    in_and_out("( 1 + 2 ) * ( 3 / 4 ) ^ ( 5 + 6 )")
    in_and_out("( 2 + 3 ) * ( 4 / 5 ) ^ ( 6 + 7 )")
    in_and_out("( 7 + 6 ) * ( 5 / 4 ) ^ ( 3 + 2 )")

```

参考：
https://andreinc.net/2010/10/05/converting-infix-to-rpn-shunting-yard-algorithm/
HTML5の構造化タグ

HTML5の構造化タグ一覧

| タグ名 | 概要 |
|:--|:--|
| article | 独立したコンテンツであることを示すタグ |
| section | コンテンツの中の1つの区切りを示すタグ |
| nav | ページのナビゲーションを表示するタグ |
| aside | メインコンテンツとは別にサブで表示するタグ |
| header | ヘッダー（ページの先頭部分） |
| footer | フッター（ページの末尾部分） |
Python+seleniumでひたすらダウンロード（繰り返し処理）

##主旨
Pythonでのスクレイピングで、繰り返し処理をする場合のコード。
業務上、請求書サイトからひたすら請求書をダウンロードする必要があったので書きました。
サイトの性質上、ボタンをクリックするとPDFを生成する仕様なので、繰り返しクリックするコードになってます。

##コード

一覧のページにアクセスした後に、以下を繰り返しています

1.個別ページへいく
2.個別ページのダウンロードボタンを押す
3.一覧ページに戻る

```python
from selenium import webdriver

driver = webdriver.Chrome()
#ここまでで、一覧のページがすでに表示されている前提
for i in range(len(driver.find_elements_by_id("idを指定"))):
    es=driver.find_elements_by_id("idを指定")#指定のidで、一覧のページにある要素を全て取得する
    es[i].click()#上からi番目をクリック→個別ページへいく
    driver.find_element_by_id("idを指定").click()#個別ページのダウンロードボタンを押す
    driver.back()#一覧ページに戻る
```
####うまくいかなかった点
上記のコードで、配列を取得してその各要素でfor回せばいいやん？って当初思っていたのですが
実際に動かすとうまくいきませんでした。多分一覧ページに戻った時に、各要素がリセットされてると思われます。

####余談
ひたすらダウンロードする処理については、当初会社で導入していたRPA使ってやろうと思ったんですが、色々できなくて挫折しました。
両方いじった結果感じたことですが、RPA使うよりpython覚えた方が30倍くらい早いし汎用性があります。
RPAって、何もわかってない会社の偉い人から金をふんだくるために、コンサルが産み出した魔法の言葉だと思いました。
ラズパイもろもろ

# 構成
## 本体
ラズベリーパイ 3B+
## タッチパネルLCD
Quimat 3.5インチタッチスクリーン
https://www.amazon.co.jp/gp/product/B075K56C12/

HDMI接続なのでGPIOがすべて使える。

設定は、amazonのレビューのところを参考にして、
480x320の解像度でタッチパネルを有効にしています。
内蔵のSPI ADS7846 コントローラを使ってタッチパネルを使用できるように。

画面が起動時に上下逆転するのが嫌だったので、以下のWebページを参考にファイルを修正。
https://neuralassembly.blogspot.com/2017/12/raspberry-pigpio.html

```/boot/config.txt
hdmi_driver=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
#hdmi_cvt 480 320 60 6 0 0 0
hdmi_cvt 800 600 60 6 0 0 0

dtparam=spi=on
#display_rotate=2
dtoverlay=ads7846,penirq=25,speed=50000,penirq_pull=2,xohms=150,swapxy=0,cs=1,keep_vref_on=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
```

```/etc/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        Option  "Calibration"   "3936 227 268 3880"
        Option  "SwapAxes"      "1"
        Option  "InvertY"      "1"
EndSection
```

## シリアル-USB 変換ケーブル
USB－TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル 
https://www.amazon.co.jp/gp/product/B00K7YYFNM/

Windows10では、最新のドライバでは動作しないので、*PL2303_Prolific_DriverInstaller_v1.5.0.zip*を検索してダウンロードして使う。

ケーブルとラズパイの繋ぎ方

|ケーブル色|内容|ラズパイ3B 接続ピン|
|:---------:|:----:|:-------:|
|<font color=#ff0000>(赤)</font>|5.0V|未接続|
|(黒)|GND|6番ピン|
|<font color=#00ff00>(緑)</font>|TxD|10番ピン|
|<font color=#cccccc>(白)</font>|RxD|8番ピン|

PC側はTeraTermを使用
https://ja.osdn.net/projects/ttssh2/

シリアル設定

|項目|設定値|
|:--:|:---:|
|スピード|115200|
|データ|8 bit|
|パリティ|none|
|ストップビット|1 bit|
|フロー制御|none|


![___0I8A1584.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/156bf03b-b1df-c38b-bc66-e92ef8fc0364.jpeg)


![___0I8A1585.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/bd5802de-2ea0-e99e-c966-b4cc879f6da2.jpeg)

# やったこと
## ラズパイの再インストール

### SDFormatter
Windowsでフォーマットしてもダメらしいので、SDFormatterを使ってフォーマット。
https://www.sdcard.org/jp/downloads/formatter/

### 最新OSのダウンロード

公式ページ
https://www.raspberrypi.org/downloads/
NOOBSはインストーラ込みで、RasbianはOSのみ？
NooBSにはOSが入っているのでオフラインでインストール可能だけど最初のダウンロードサイズが大きい、NOOBS Liteの場合OSはネットワーク経由でインストールするので最初のダウンロードサイズが小さい。

今回はNOOBSのV 3.2.0をダウンロードしてインストールした。

## シリアルコンソールの設定

raspi-configでシリアルインターフェースを有効にする。

ラズパイ3は、UART0がBluetoothに割り当てられていて、シリアルはUART1に割り当てられている。
またUART1はCPUクロックに依存しているため、CPUクロックを固定しないと通信速度が変わってしま手安定して動作しない。
そのため、/boot/config.txtの最終行に以下の行を追加する。

```/boot/config.txt
core_freq=250
```
Xcodeバージョンをビルド時に厳密にチェックする

複数のプロジェクトでそれぞれ異なるXcodeのバージョンを利用していると、気づいたら想定と異なるバージョンで開発・ビルドしていた、といった**バージョン取り違えの危険性**がある
そのため、想定と異なるXcodeのバージョンでビルドしようとした場合エラーを吐き出し、取り違えを防ぐ方法を取り入れたので、以下にその手順を示す
本方法では、Xcodeの**ベータ版と正式版の違いも検知**できる

# 手順
プロジェクトのトップディレクトリに、`.xcode-version`ファイルを以下のように作成する

```shell:.xcode-version
REQUIRED_XCODE_VERSION='11.0'
REQUIRED_XCODE_PRODUCT_BUILD_VERSION='11A420a'
```

上から順に、プロジェクトで利用するXcodeの**バージョン番号**と**ビルド番号**を記述している
Xcodeのバージョン番号とビルド番号は、メニューの[Xcode] > [About Xcode]から確認できる

次に、XcodeでBuild Phases画面を開き、左上の[+]ボタンから[New Run Script Phase]を選択する

[Run Script]を展開し、スクリプト入力ボックスに以下を入力する

```shell
. $SCRIPT_INPUT_FILE_0

# バージョン表記を4桁左詰めゼロパディング形式に変換
REQUIRED_XCODE_VERSION_ACTUAL=`echo $REQUIRED_XCODE_VERSION | tr -d . | xargs printf '%-4d' | tr ' ' 0`

if [ $REQUIRED_XCODE_VERSION_ACTUAL != $XCODE_VERSION_ACTUAL ]; then
    echo "error: Detected wrong Xcode version. Expected=$REQUIRED_XCODE_VERSION_ACTUAL, actual=$XCODE_VERSION_ACTUAL."
    exit 1
fi

if [ $REQUIRED_XCODE_PRODUCT_BUILD_VERSION != $XCODE_PRODUCT_BUILD_VERSION ]; then
    echo "error: Detected wrong Xcode build version. You might be using beta version. Expected=$REQUIRED_XCODE_PRODUCT_BUILD_VERSION, actual=$XCODE_PRODUCT_BUILD_VERSION."
    exit 2
fi
```

[Input Files]に `$(SRCROOT)/.xcode-version` を追加する

設定完了した画面が以下となる
![Scripts設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/a8ca28bc-b1fc-a0ce-36f3-62225be1580a.png)

# エラー出力例
Xcode 10.3を利用するプロジェクトを11.0でビルドしようとした場合
![バージョン番号違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/b826c9df-8c3b-3f10-f310-141c186c1d22.png)

Xcode 11.0正式版を利用するプロジェクトを11.0 beta-8でビルドしようとした場合
![ビルド番号違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/942abb85-ae0f-6c17-d74a-a8192ae2e29e.png)

# 運用
`.xcode-version`はバージョン管理し、チームで共有するようにする

利用するXcodeのバージョンを上げる際は、`.xcode-version`ファイル内の変数を変更する

# 参考
- https://qiita.com/manicmaniac/items/5294dd16cd6f835ab2d9
- https://dev.digitrick.us/notes/runscriptecho
SiderCIとslack通知の導入

# はじめに
RailsアプリにSideCIを導入してpull requestをだした際に、自動でコード上の問題を解析して、slack上に結果をFeedbackしてくれるように設定してみたかったので、その際のメモとして記述する。

# SiderCIとは
`プルリクエストを自動で解析し、セキュリティバグ、コード規約、文法、重複記述、未使用の変数、複雑度を検知します`

# いざ導入
https://sideci.com/
このurlに進んで、初期設定を行います。githubのアカウントがあれば案内に沿ってsign_upすれば良いし、なければgithubのアカウントをまず作りましょう。

下記の画像のように左上の追加からリポジトリを選択します。
[![Image from Gyazo](https://i.gyazo.com/06e7014a551eb2e0ac71fa6f57b16e83.png)](https://gyazo.com/06e7014a551eb2e0ac71fa6f57b16e83)

次に下記のモーダルが表示されるので
【新しいオーガニゼーションを追加】を行う。
![スクリーンショット 2019-09-28 15.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/29db508f-0cc2-ece8-709f-bc74d40711cb.png)

そして下記画像の
【Only select repositories】から【select repositories】で対象のアプリを選択する。

sider上で自分のアカウント名をクリックすると以下の画像のページ遷移するので【リポジトリを追加】をクリックすると先ほど追加したリポジトリが選択できるので選択し、設定ボタンをクリックする。
![スクリーンショット 2019-09-28 15.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/fa46250c-b782-934f-b490-afcfebe07b75.png)

その後、下記画像にて言語、フレームを選択して、【オープンなpull Request】を選択し、一旦終了する。
![スクリーンショット 2019-09-28 15.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/50ad982c-bebd-8416-2366-b3ab3031b961.png)

# Pull requestを作成してみましょう。
以下の画像のように解析結果が表示されます。
<img width="551" alt="スクリーンショット 2019-09-28 15.48.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/2a67fdf6-b92e-10ed-c4f8-8151473385fe.png">

# Siderにて確認してみよう
IssuesとToolを確認して見ると解析結果が表示されます。
<img width="861" alt="スクリーンショット 2019-09-28 15.50.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/55a42664-acc1-447d-eebb-2302b4ff9413.png">

# Slackと連携してみよう

<img width="829" alt="スクリーンショット 2019-09-28 15.54.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/3a8b55a7-21dd-d05c-75b2-cfb79e1f7617.png">
上記の外部連携ツールをクリック
<img width="579" alt="スクリーンショット 2019-09-28 15.57.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/ea4bcf82-ff78-5f96-c662-3f219cbbe365.png">
上記の【名前】【URL】を入れます。

![スクリーンショット 2019-09-28 16.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/d4004683-a527-cc8b-c1df-66ec891b2d3e.png)
slackでログインし、上記画像の上側のモザイク部がworkspace名になり、それと緑点の右側にある名前を使用して【名前】を記述します。
`【名前】workspace名#緑右側の名前`

そしてURLですが、`Webhook URL`を入力する必要があります。
`https://slack.com/services/new/incoming-webhook`
こちらのurlから自分のslackに連携したいチャンネルを選択します。
<img width="960" alt="スクリーンショット 2019-09-28 16.15.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/427bde62-0da4-44cf-3e11-e6fe6aff2339.png">
上記の画像の【チャンネル選択】をしてチャンネル名を入力します。

すると【インテグレーションの設定】画面に遷移できるので、取得した`Webhook URL`をコピーして【URL】にペーストして設定を完了します。

# 再度pull requestをだしてみよう
![スクリーンショット 2019-09-28 16.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/96e6c069-c2b3-805b-d8cb-4f783bbc45a1.png)
このように`slack`と連携でき、`sider ci`の結果が確認できるようになります

# 終わり
非常に便利で操作も簡単なので、これからアプリを作成するときは是非とも導入したいです。
データ分析試験（β試験）レポート

β試験開催期間が間もなく終了となりますので受験レポートを公開します。
と言っても具体的な問題などの掲載はなく受けた印象を述べるにとどめた内容になっております、予めご了承ください。

---
8月下旬から（ようやく？）始まった「pythonデータ分析試験」（ただしβ試験）を受けて無事合格いたしました。(950点、2問間違えました・・・）

# 試験ガイダンス
詳細は本家をご参照。8月下旬からβ試験開始となりました。
https://www.pythonic-exam.com/exam/analyist
実施期間：8/27-9/30

# 準備：
最近会社でもPython使ってあれこれ業務効率化とかデータ分析をやっているので
NumpyとかPandasあたりの習熟は問題ないかなというところ。
scikit-learnも趣味で使っているので、どのライブラリがどこ所属だっけ？と突っ込まれると若干曖昧だったりするぐらいかと（model_selectionだったかmetricsだったか・・のような）いう状態。
グラフ描画もseabornが中心なのでちょっと不安なれどplotのhistがイマイチなところを再確認すればOKでしょう。
あとは数学全般もOK、統計検定も取得しているのでこの辺で悩むことはないでしょう。

ということで、一通り指定教材に目を通して普段使っていないメソッドなどを手を動かして確認。こんな感じで準備は進みました。

想定としては「Java試験のようにコードがたくさん問われるかな・・・」の予想。


# 申し込み
https://cbt.odyssey-com.co.jp/
odyssey＠有楽町を選んで申し込み。。。
Python熱が高いのか、土日はすでにいっぱい（もちろん他試験も)で、2週見送って9月16日（祝）で申込みとなりました。なぜか祝日はそこそこ試験会場に余裕あり。。。わからん。

# 申し込んでから試験まで
早速受けてスパッと終わらす予定でしたので、この2週間はなんだかもやもや。なので特に試験に限った勉強ではなくごく普通にデータ分析・機械学習の技術習得を継続。

# 試験を終えて
試験問題に対して具体的に述べるのは不味そうなのでざくっと。

- 試験時間

60分40問なのであまりのんびりとはできない。が、試験は25分程度で完了。あとはベータ試験に対する意見を10分ほどで書いて終了。配られた紙に書いてたのですが最後に意見画面が出てきて改めて打ち直し。

- 問題全般

もっとコード（言語仕様・ライブラリ仕様）のことを問われるかなと思っていましたが拍子抜け感。もちろん数問はコードを聞かれる設問がありましたが他の言語系試験に比較すると少ないね、の印象でした。

- 機械学習分野

「正しく理解しているか」「適用局面を適切に判断できるか」といった知識の問題が中心だったように思います（コードもあったかもだけど記憶なし）。

- 数学分野

記憶にナシ。呼吸をするように自然体で回答。CBT方式で数学を問うというのも苦しいか。。。

# 結果
冒頭に書いたとおり、950点。設問数分配からすると2問誤答。
よりによってNumpyと確率統計を1問づつ（何を間違えたのか、、思い当たらない）。
ということで若干不本意ながらも合格となりました。

# まとめ
Pythonを普段使いしている方には特別な準備は不要かな。。。と。

もちろんこの試験合格により「データ分析ががっちりできる」かと問われるとそれはどうでしょう・・・という感は残ります。どの試験もそうですけどね。

まだβ試験・CBT方式ということで意見を述べるにも何かと悩ましい感じなのですが、断片的に習得されている方は体系的に学び直す機会と捉えて知識の再編を行うには良いのではないでしょうか。

9月末でβ試験が終わり、受験者フィードバックがなされて来年初には本試験が始まるかと思います。その際には知識・実装力がバランス良く問われる感じになっていくのかなと予想しています（どうでしょう？）。
Project Euler 030を解いてみる。「各桁の5乗」

# Project Euler 030
[030](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2030)
>驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.
1634 = 1<sup>4</sup> + 6<sup>4</sup> + 3<sup>4</sup> + 4<sup>4</sup>
8208 = 8<sup>4</sup> + 2<sup>4</sup> + 0<sup>4</sup> + 8<sup>4</sup>
9474 = 9<sup>4</sup> + 4<sup>4</sup> + 7<sup>4</sup> + 4<sup>4</sup>
ただし, 1=1<sup>4</sup>は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.
各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.


->[次の問題](https://qiita.com/radiol/items/2119b8e61b593350179a)

## 考え方
総当りばっかりやってますが、今回もそれで行きます。もうダメかもわからんね(^q^)
探索範囲について、各桁の5乗が最も大きくなるのは全ての桁が9の場合(9, 99, 999, 9999,...)です。99999の時、9<sup>5</sup>×5=295245で各桁の5乗のほうが大きく、999999の時、9<sup>5</sup>×6=354294で元の数のほうが大きくなります。元の数は桁が1つ増えるたびに約10倍ずつ増えていきますが、各桁の5乗は9<sup>5</sup>=59049ずつしか増えていかないので7桁以上では必ず元の数のほうが大きくなります。
よって探索範囲は9<sup>5</sup>×5=295245までで良さそうです。
あとは総当りをしていきます。

## コード
```Python:euler030.py
def main():
    answer = 0
    for i in range(2, 9 ** 5 * 5):
        sum_five = sum([int(j) ** 5 for j in str(i)])
        if i == sum_five:
            answer += i
    print(answer)


if __name__ == '__main__':
    from time import time as t
    st = t()
    main()
    print(t() - st, 'sec')
```
[paiza](https://paiza.io/projects/new)にて実行
`結果
443839
0.6426656246185303 sec
`
db tech showcase 2019

#Amazon Aurora Under the Hood
江川さんによるAurora技術情報のセッションを聴かせていただきました。参考になった点を備忘録として残しておきます。

資料は公開されたらリンクを貼りますが、以下のオンラインセミナーが内容としては近いので参考になります。
[Amazon Aurora with PostgreSQL Compatibility](https://www.youtube.com/watch?v=oJqIzHIMh7Q&feature=youtu.be)

##設計思想
- PostgreSQLもしくはMySQLと互換性のあるAWSが開発した（Aurora is not OSS）リレーショナルデータベース
- 商用DB（Oracle・SQLServer）レベルの性能と可用性を1/10のコストで提供する

##高速な理由
- Auroraストレージ
    - 専用のSSDストレージを使用することで高速かつ高可用性を確保
- write log record
    - 4kbなどのページ単位の転送ではなく更新差分のみストレージにデータを流す
- 10GBずつの「Protection Group」にデータを格納する分散ストレージ
    - 2個/1AZ x 3AZ = 計6個（60GB）からスタート
    - 10GB単位のセグメントに分けることでリストアも早い
- 「データプレーン」にAuroraエンジン、「コントロールプレーン」にSWFやDynamoDB使用されているとのこと。

##可用性
- Writeは4/6クォーラム、Readは3/6クォーラムの理由
    - AZ障害が発生すると4/6クォーラムとなり、更に＋1の障害（二重障害）が発生しても3/6なのでReadはできる
- AZ障害時は「デグレードモード」があり、AWS側でWrite3/4クォーラムに変えられる

最後に、タイムリーなセッションを聴かせてくれた江川さんに、Thanks a lot!!
RestfulAPIについて簡単に体感してみる

#RestfulAPIについて簡単に体感してみる

RESTful APIにおいてリソースとは、データ型、関連するデータ、ほかのリソースとの関係を持ち、操作するための一連のメソッドが存在するオブジェクトのこと。
動画を扱うAPIを作っているとすれば、動画がリソースにあたり、このリソースに対してAPIを使ってCRUDを操作できます。


RESTの原則に則って構築されたWebシステムのHTTPでの呼び出しインターフェースのこと
>RESTの4つの設計原則
1.セッションなどの状態管理を行わない。(やり取りされる情報はそれ自体で完結して解釈することができる)
2.情報を操作する命令の体系が予め定義・共有されている。（HTTPのGETやPOSTメソッドなど）
3.すべての情報は汎用的な構文で一意に識別される。（URLやURIなど）
4.情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができる。

HTTPの基本メソッドを指定して、リソースの操作が可能。あくまで処理主体ではなくリソース主体。

#簡単にRestfulAPIを体験
※Linuxサーバ（Amazon Linux2)で実施

事前準備

```ruby:setup
#レポジトリ作成
curl -sL https://rpm.nodesource.com/setup_10.x | bash -

#Node.jsをインストール& Json Serverインストール
yum -y install nodejs
npm install -g json-server
```

テストデータ作成。リソースは[posts]

```ruby:testdata
{
  "profile": {
    "name": "name",
    "email": "test@gmail.com"
  },
  "posts": [
    {
      "id": 1,
      "title": "subject1"
    },
    {
      "id": 2,
      "title": "subject2"
    }
  ]
}
```

Json Server起動

```ruby:jsonserver起動
json-server --watch test.json --port 3000
```
[TypeScript]よりより引数の渡し方について軽く考えたもの

## はじめに
引数が複数あって、同じ型ならNamed Parameter(名前付き引数)を選ぶ方がいいよねって感じの話です。

## オブジェクト渡しの関数のがより良い
[1]順番に依存した引数

```typescript
const calculateHoge = (width: number, height: number, depth: number) => width * height * (depth + 500)


calculateHoge(1, 2, 3)
```

[2]オブジェクト渡しの引数

```typescript
const calculateHoge = ({ width, height, depth }: { width: number, height: number, depth: number }) => width * height * (depth + 500)


calculateHoge({ width: 1, height: 2, depth: 3 })
```

[1]よりも[2]のほうがよりよいと考えています。

## 理由
なぜかというと、オブジェクト渡しのがミスをしにくいからです。
[1]の場合は、順番を誤っていてもコンパイルエラーになりません。関数の利用者側は順番を間違えるだけでバグを生み出します。また、同じような機能で引数の順番が微妙に異なるような関数が他にある場合には余計にバグを生み出しやすいです。
[2]の場合は、明示的にキー名を書く必要があり、[1]に比べて記述量が増える代わりに、間違える可能性は低いです。

下記のような関数が別に存在したらどう思うでしょうか？

```typescript
const calculatteFuga = (height: number, width: number, depth: number) => calculateHoge(width + 500, height, depth)
```

「引数の順番を合わせろ」って思いませんか？
自分は思います。PHPの標準関数で昔よく「引数の順番がー」ってなってたような記憶があります。
ただ、機能的に似ているけども引数の順番が異なる関数が発生することは、チームで開発しているものでは簡単に起こりうると思います。

このようにせっかく型をつけても引数の順番を間違えるだけでバグにつながるのはよろしくないので、引数にオブジェクトを渡すの形のがよりよいと考えています。

## なぜ独自の型を定義して使わないのか
「Width型、Height型、Depth型のような独自の型定義を使えばよいのではないか？」という話もあると思います。
ただ引数の順番があってない似たような関数に関する問題の一部（見た目上の整合性やわかりやすさ）は解決しないので、下記のような感じになるかと思います。
Structural Subtypingなので、ひと手間加えないといけないっていうのとそもそも記述量が大幅に増えるのがネックになると思っています。

```typescript
type Brand<K, T> = K & { __brand: T }

type Depth = Brand<number, "Depth">

type Height = Brand<number, "Heiht">

type Width = Brand<number, "Width">

const width = 10 as Width
const depth = 10 as Depth
const height = 10 as Height

const calculateArea = ({ width, height, depth }: { width: Width, height: Height, depth: Depth }) => width * height * (depth + 500)
```


## 参考
[Approach #4: Intersection types and brands](https://michalzalecki.com/nominal-typing-in-typescript/#approach-4-intersection-types-and-brands)
Vagrant環境でHeroku CLIがインストールできない


Vagrant環境でHerokuを使う際にHeroku CLIのインストールでハマった際の備忘録です

同じようにハマった際に参考になればと思います

# 環境

- macOS Mojave 10.14.6

- VirtualBox 6.0

- Vagrant 2.2.4

- CentOS 6.7

# Heroku CLIとは

Herokuに関してはこちらが参考になります

https://qiita.com/okasir4444/items/b9b1e70fdbbbd5794f1b

Herokuを使用する際のコマンドラインツールが **Heroku CLI** です

# Heroku CLI インストール時のエラー

```
$ curl https://cli-assets.heroku.com/install.sh | sh
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
105  1892  105  1892    0     0   6145      0 --:--:-- --:--:-- --:--:-- 55647
This script requires superuser access.
You will be prompted for your password by sudo.
Your path is missing /usr/local/bin, you need to add this to use this installer.
```

# 原因

1. /usr/local/bin のパスが無いから作れ
2. sudo で実行しろ > rootユーザで実行していない

## 1. /usr/local/binのパス追加

現在のパスを確認

```
$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
```

確かに/usr/local/binがないです

vagrantのデフォルトのパスがどうなっているかは分かりませんが、私の環境では`/usr/local/bin`はありませんでした

/usr/local/binをパスに追加し,再度パスを確認

```
$ export PATH=/usr/local/bin:$PATH
$ echo $PATH
/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
```

パスが追加されました

## 間違ったパスを追加してしまったら

間違ったパスを追加してしまって削除したい場合は`/home/vagrant/.bash_profile`や`/home/vagrant/.bashrc`などのパスを設定しているファイルの中の記述を消せばok

## 2. rootユーザに切り替えてHeroku CLI のインストール

vagrantのユーザー切り替えは以下を参考にしました

https://qiita.com/h6akh/items/0197194b68c5852c7ab0

rootユーザに切り替え

```
$ sudo su
```

プロンプトの表示などに変化があれば正常にrootユーザに切り替えできています

rootユーザに切り替えたので再度実行

```
$ curl https://cli-assets.heroku.com/install.sh | sh
.
.
heroku installed to /usr/local/bin/heroku
heroku/7.30.1 linux-x64 node-v11.14.0
$ heroku --version
heroku/7.30.1 linux-x64 node-v11.14.0
```

Heroku CLI のインストール成功しました

vagrantユーザに戻します

```
$ su vagrat
```

## ユーザ切り替え時の補足

- ユーザ切り替え時に場合によっては管理者パスワードを聞かれる場合もあります

- Vagrantはデフォルトで管理者パスワードは`vagrant`で設定されています

# まとめ

以前Herokuを使った時にはherokuコマンドのパス修正が必要でしたが、今回は必要ありませんでした

当たり前ですが、使うツールはどんどん変化するのでちゃんと対応できるように基本的な知識をちゃんと勉強しておかないといけないなと思いました汗
PowerShellでOffice 365各種サービスに接続する

# はじめに

PowerShellでOffice 365各種サービスに接続する際の手順メモ。
一旦はOffice 365とExOだけ。ほかのサービスはそのうち。

# 前提

- Windows 10（Win8.1以前だと[サインインアシスタント](https://www.microsoft.com/ja-jp/download/details.aspx?id=41950)が別途必要だったりする）
- PowerShellの実行ポリシーが`RemoteSigned`以上に緩和されている（されていなければ`Set-ExecutionPolicy RemoteSigned`を実行しておく）

## Office 365

### モジュールインストール（初回のみ）

```powershell
Install-Module MSOnline
```

### 接続

```powershell
Connect-MsolService
```

## Exchange Online（接続時に多要素認証の利用なし）

### モジュールインストール ＆ 接続

```powershell
Import-PSSession (New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential (Get-Credential) -Authentication Basic -AllowRedirection)
```

## Exchange Online（接続時に多要素認証の利用あり）

### モジュールインストール （初回のみ）

[多要素認証を使用して Exchange Online PowerShell に接続する](https://docs.microsoft.com/ja-jp/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/mfa-connect-to-exchange-online-powershell#what-do-you-need-to-know-before-you-begin)を参考に「Exchange Online リモート PowerShell モジュール」をインストールする。

### 接続

```powershell
Connect-EXOPSSession
```

# 参考

https://docs.microsoft.com/ja-jp/office365/enterprise/powershell/connect-to-office-365-powershell
https://docs.microsoft.com/ja-jp/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/connect-to-exchange-online-powershell
https://docs.microsoft.com/ja-jp/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/mfa-connect-to-exchange-online-powershell

以上
Project Euler 029を解いてみる。「個別のべき乗」

# Project Euler 029
[029](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2029)
>2 ≤ a ≤ 5 と 2 ≤ b ≤ 5について, a<sup>b</sup> を全て考えてみよう:
2<sup>2</sup>=4, 2<sup>3</sup>=8, 2<sup>4</sup>=16, 2<sup>5</sup>=32
3<sup>2</sup>=9, 3<sup>3</sup>=27, 3<sup>4</sup>=81, 3<sup>5</sup>=243
4<sup>2</sup>=16, 4<sup>3</sup>=64, 4<sup>4</sup>=256, 4<sup>5</sup>=1024
5<sup>2</sup>=25, 5<sup>3</sup>=125, 5<sup>4</sup>=625, 5<sup>5</sup>=3125
これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
2 ≤ a ≤ 100, 2 ≤ b ≤ 100 で同じことをしたときいくつの異なる項が存在するか?


->[次の問題](https://qiita.com/radiol/items/d3ee354cda036391e380)

## 考え方
まずは総当りでやってみます。内包表記でa<sup>b</sup>を生成し、set型に入れることで重複を除去します。シンプルに一行で書けますね。

```Python:euler029.py
def main():
    print(len(set(a ** b for a in range(2, 101) for b in range(2, 101))))


if __name__ == '__main__':
    main()
```

つぎに(全体の組み合わせ)-(重複するもの)を考えてみましたが、現状うまく言っておりません…
2<sup>4</sup>=4<sup>2</sup>や2<sup>16</sup>=4<sup>8</sup>=8<sup>4</sup>=16<sup>2</sup>のようにある数xのy乗が上限となる100以下の場合に重複する組み合わせが出そうです。
例えば2と4では以下の項目が重複しています
2: 2<sup>4</sup>, 2<sup>6</sup>,... 2<sup>98</sup>, 2<sup>100</sup>
4: 2<sup>2<sup>2</sup></sup>,2<sup>2<sup>3</sup></sup>,...2<sup>2<sup>49</sup></sup>, 2<sup>2<sup>50</sup></sup>,
4<sup>1</sup>はないので、49個の要素が重複しています。
同様にa=3~10のときに49個の重複が発生するので、これらを全体から引きます。
2と8では2<sup>99</sup>=8<sup>33</sup>までで32個の重複×3(2~4)、2と16では2<sup>100</sup>=16<sup>25</sup>までで24個×2(2~3)…のように重複するものを引いていけば答えが出るかなと思っていました。
うまくいきませんでした。原因としては16<sup>4</sup>=32<sup>2</sup>のように大きな数で発生する重複を除去できていなかったからです。良い方法考え中…
ABC 109-B map::atの使い方

#mapとは？
**map< keyの型,valueの型 > 配列名**というように書く！
それ故、**string型のkey**からもvalueが見つけられる！　
配列の書き方の幅が増えた。（今まではA[1]=5,A[1]=carみたいな感じでどちらも**引数**に**string型を代入することが出来なかった....**）

#map::atとは？
keyの型がstring型だとすると、**～文字目のcharcter**が分かる優れもの！
**文字列1.at(文字列1の～文字目のインデックス番号)**

```c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<n; i++)
using namespace std;

int main(){
    int N; cin >> N;
    map<string,int> A;
    string before,after;
    cin >> before;
    A[before]++;
    
    rep(i,N-1){
        cin >> after;
        if ((before.at(before.size()-1)) == after.at(0) && A[after]==0 ){
            A[after]++;
            before=after;
        }else{
            cout << "No";
            return 0;
        }
    }
    cout << "Yes";
}
```

#まとめ
mapによる配列の書き方の幅も広がって嬉しい！
あと、keyがstring型であることだけでなく、更にインデックス番号にてその文字まで探せるので楽ちん！
VisualStudioでC++プロジェクトが作成できなくなった時のメモ

Visual Studio2019を更新してC++プロジェクトを作成しようとすると`オブジェクト参照がオブジェクトインスタンスに設定されていません`というエラーがでて作成できなくなってしまいました。

修復や再インストールを試してみましたがそれもだめでした。
最終的に以下のことをすれば解決しました。
実行する場合は自己責任でお願いします。

```
1. Visual Studio2019をアンインストールする
2. Program Files(x86)フォルダの下の'Visual Studio'と付くフォルダを全て削除する
3. Program Files(x86)フォルダの下のMSBuildフォルダを削除する
4. 環境変数のVisual Studio関連の変数を削除する
5. PCの再起動
6. Visual Studio2019をインストールする
```
ある時点より昔のツイートを消す

黒歴史を消したいのに、黒歴史クリーナーが最新の3200件しか対応していない。
最新のツイートは消したくないし、消したいツイートは3200件より昔という状況だったのでしぶしぶ書く。

スレッド処理してないので時間かかります。まぁどうせ実行して放置するのでいいかなと思って。
早くやりたいなら年月ごとに1スレッド作って配列をスライスして渡せばいいんじゃないかな（適当）

twitterのアカウント設定からデータの一括DLを要求すると圧縮ファイルがあるので、その中の"tweet.js"を使います。
ファイル先頭が
```window.YTD.tweet = [ {```　又は
```window.YTD.tweet.partN = [ { ...```
となってるので、変数名を消して
```[ { ...```
にします。

ツイート数が多い場合はファイルが"tweet.js", "tweet-part1.js", "tweet-part2.js", ... になってるようです。(1ファイル上限100MBっぽい)それぞれのファイルに対してスクリプトを実行するか、メモリに余裕があれば一気に全部読み込んでください。

ツイート削除APIはリミットがかかってないようなので、スリープは挟まなくていいようです。ただしあまりにも多くのスレッドを生成して削除するとDoS攻撃まがいになるのでエラー返されるかも。のんびりバックグラウンドで実行させるのがいいでしょう。

```python:destroy_tweets.py
#!/usr/bin/env python3

from datetime import datetime
import sys
import json
import tweepy

# https://developer.twitter.com/apps
key = ""
secret_key = ""
token = ""
secret_token = ""

auth = tweepy.OAuthHandler(key, secret_key)
auth.set_access_token(token, secret_token)
api = tweepy.API(auth)

with open('tweet.js', encoding='utf_8') as f:
  tweetsjson = json.load(f)
  for tweet in tweetsjson: # 2018年4月1日以前のツイートを消したい場合
    if datetime.timestamp(datetime(2018, 4, 1, 0, 0, 0)) > ((int(tweet['id']) >> 22) + 1288834974657) / 1000:
      try:
        api.destroy_status(int(tweet['id']))
      except:
        print(tweet['id'], file=sys.stderr)

```
新しいコマンドシェルを開いたときにgitのproxy設定を実行させる

OS側の設定をそのまま反映させる．```~/.bashrc```末尾に以下を追加

```bash:.bashrc
if [ -z "$HTTP_PROXY" ]; then
    git config --global --unset http.proxy
    git config --global --unset https.proxy
    echo "git proxy解除完了"
else
    git config --global http.proxy $HTTP_PROXY
    git config --global https.proxy $HTTPS_PROXY
    echo "git proxy設定完了"
fi
```
OpenOffice CalcでExcel VBAのマクロを組む(2)

#実行イメージ
まずは、月単位での日付と曜日をセルに出力するマクロを組んでみた。
E1セルとE2セルに月単位での期間を入力（例えば2019年7月ならE1セルに「2019/07/01」、E2セルに「2019/07/31」と入力）し、F1セルとF2セルにそれぞれ対応する曜日を入力してマクロを実行すると、
![2019092801.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409430/b3163128-70e9-4f77-e9ab-6b37e8c4454b.jpeg)
A3セル以降に日付、B3セル以降に曜日を出力するという内容。
![2019092802.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409430/bf12c9e0-5c24-aab1-8602-67c662655aa2.jpeg)

#サンプルマクロ
今回組んだマクロは以下の通り。

```OpenOfficeBasic
option vbasupport 1

Sub Main
	
	REM E列2行目に指定した月末日から日部分だけ取り出す
    Dim lastDay As String
    lastDay = Cells(2, 5)
    lastDay = Right(lastDay, 2)
    
    Dim dayNum As Integer
	dayNum = CInt(lastDay)
	
	REM 曜日フラグの設定
	Dim dayFlag  As Integer

    If (StrComp(Cells(1, 6), "月", vbTextCompare ) = 0) Then
        REM 月初日が月曜日
        dayFlag = 1
    ElseIf (StrComp(Cells(1, 6), "火", vbTextCompare ) = 0) Then
        REM 月初日が火曜日
        dayFlag = 2
    ElseIf (StrComp(Cells(1, 6), "水", vbTextCompare ) = 0) Then
        REM 月初日が水曜日
         dayFlag = 3
    ElseIf (StrComp(Cells(1, 6), "木", vbTextCompare ) = 0) Then
        REM 月初日が木曜日
        dayFlag = 4
    ElseIf (StrComp(Cells(1, 6), "金", vbTextCompare ) = 0) Then
        REM 月初日が金曜日
        dayFlag = 5
    ElseIf (StrComp(Cells(1, 6), "土", vbTextCompare ) = 0) Then
        REM 月初日が土曜日
        dayFlag = 6
    Else
        REM 月初日が日曜日
        dayFlag = 7
    End If
	
	Dim dayCnt As Integer
	For dayCnt = 1 To 31
	    If (dayCnt <= dayNum) Then
	        REM 月末日までの日をA列の3行目から順に記入する
	        Cells(dayCnt + 2, 1) = dayCnt
	        
	        REM 曜日を記入する
            Select Case dayFlag
            Case 1
                Cells(dayCnt + 2, 2) = "月"
            Case 2
                Cells(dayCnt + 2, 2) = "火"
            Case 3
                Cells(dayCnt + 2, 2) = "水"
            Case 4
                Cells(dayCnt + 2, 2) = "木"
            Case 5
                Cells(dayCnt + 2, 2) = "金"
            Case 6
                Cells(dayCnt + 2, 2) = "土"
            Case Else
                Cells(dayCnt + 2, 2) = "日"
            End Select
	
            dayFlag = dayFlag + 1
            If (dayFlag > 7) Then
                REM 日曜まで到達したら、曜日フラグをリセット
                dayFlag = 1
            End If
	    Else
	        REM 月末日が31日より前の場合は、月末日の次の日から31日までの範囲を曜日も含めて空欄表示にする
	        Cells(dayCnt + 2, 1) = ""
	        Cells(dayCnt + 2, 2) = ""
	    End If
	Next dayCnt

End Sub
```

なお、VBA互換モードでマクロを組むのであれば、先頭に「option vbasupport 1」の記載が必要になる。

[参考にさせていただいたページ]
OpenOffice Calc　のOpenOfficeBasicをVBA互換モードにする方法
https://toolmania.info/post-2794/
CalcでExcelのVBAマクロを含む表計算シートを使う
http://www.programmingmat.jp/openoffice_macro/ooo_bmvba.html
OpenOffice日本語版
https://www.openoffice.org/ja/