OmniAICreator/Qiita-1.07M huggingface dataset:
[WIP] Python2 to Python3 の自然言語処理における対応まとめ

# 概要

エラーを吐かれたら直すべきものを追加していく
直した方が良いものがあれば指摘お願いします。


# cPickle

```shell
ImportError: No module named 'cPickle'
```

python2にはcPickleがあるが、Python3にはない。
代わりに_pickleというものを使うと良い。

理由はまだ調べきれていないため、また調べて追記します。

[[参考] - [test.py] Python3でcPickleのエラーを回避する](http://testpy.hatenablog.com/entry/2017/03/17/000626)

# 

[[参考] - [methaneのブログ] Python 2/3 両対応のために `unicode_literals` を使うべきか](https://methane.hatenablog.jp/entry/2014/01/18/Python_2/3_%E4%B8%A1%E5%AF%BE%E5%BF%9C%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB_%60unicode_literals%60_%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B)
plunkerでjor1k

#概要

plunkerでjor1kやってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2cfb5010-ea70-4648-8795-a7b9a1a944f7.png)

#成果物

https://embed.plnkr.co/l820MiCtVzhg8rmNbaxQ/

以上。
データ可視化ツール metabaseでOracleのデータを扱う

# はじめに

データ可視化ツール metabaseでOracleに接続しようとしたら、接続先にOracleがなかったので調べてみました。
以下の公式ドキュメントに、OracleはJDBCドライバを準備する必要があると記載があります。

https://metabase.com/docs/latest/administration-guide/databases/oracle.html

JDBCドライバのライセンス上の問題で同梱できなかったようです。


# 環境

簡単すぎて書くまでもないのですが、以下の環境での設定手順を残しておく。

- Oracle Linux 7.5（他のLinuxでも手順は同じです）
- metabase v0.32.5


# 設定

まずは、以下のOracleのHPからojbdc8.jarをダウンロードします。

https://www.oracle.com/technetwork/database/features/jdbc/jdbc-ucp-122-3110062.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/79216cc2-0004-6cbd-e84e-08f4f37a39c8.png)

metabaseを起動したディレクトリに「plugin」ディレクトリがあるので、そこに先ほどダウンロードした「ojdbc8.jar」を置きます。

metabaseを再起動すれば完了。

次にOracleへ接続するための設定を追加します。

http://[IPアドレス]:3000/setup/

metabaseにアクセスして、「データベースを追加」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/d3233e1d-df4d-85b2-289f-ee66c1ff14c3.png)

すると、Database typeに「Oracle」が追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c38e3929-7d67-6c61-5149-9fd05b2c987e.png)

後はホストとかユーザ名とかの接続先設定を実施するだけです。
[Heroku] `require': Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile (LoadError)

# 問題

```log:log
2019-04-26T21:17:14.759802+00:00 heroku[web.1]: State changed from starting to crashed
2019-04-26T21:17:14.643611+00:00 app[web.1]: /app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:292:in `require': Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile (LoadError)
```

# 解決

production.rbの以下行をコメントアウト

```ruby:config/environments/production.rb
  # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
```
[Heroku] Errno::ECONNREFUSED (Connection refused - connect(2) for "localhost" port 25):

# ■ 問題
Action Mailerを使用しメール送信機能の実装
development環境では成功したが、本番環境(heroku)では上記エラーのため失敗

# ■ 解決(問題が起きた理由)
Mailerの設定をdevelopment.rbだけでなくproduction.rbにも記載する(production.rbの設定し忘れ)
[Heroku] productionの環境変数を.envファイルで設定する方法

# ■ アプリケーション直下に.envファイルを用意する

```console:terminal
$ touch .env
```
# ■ .envファイル内に環境変数をセットする

```.env:.env
ENVIRONMENT_VARIABLE=hogehoge
```

# ■ heroku-config をインストールする

```console:terminal
$ heroku plugins:install heroku-config
Installing plugin heroku-config... installed v1.5.3
```

# ■ .envファイル内の環境変数をherokuに適用する

```console:terminal
$ heroku config:push
Successfully wrote settings to Heroku!
```
redirect_toする前に特定のメソッドを実行したい場合の注意

# ■ 駄目な例

以下の書き方だと、private_methodが`実行される前に`redirect_toが実行される。

```ruby:controllers/users_controller.rb
  def send_report
    private_method
    redirect_to action: :index
  end

  private

  def private_method
  end
```

# ■ 良い例

以下の書き方だとprivate_methodが`実行されてから`redirect_toが実行される。

```ruby:controllers/users_controller.rb
  def send_report
    redirect_to action: :index if private_method
  end

  private

  def private_method
  end
```

<br>
ご参考になりましたら幸いです。
<br>
.
React95で Windows 95をなつかしもう

[React95](https://github.com/arturbien/React95)を使うと、Windows 95のUIが簡単に作れます！

- githubのreadmeの画像です↓ &nbsp;&nbsp;このようにあの懐かしいUIが簡単に再現できます。

![Screen Shot 2019-04-27 at 3.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/5e75f845-581b-54da-6504-efb078538386.png)

# storybookで簡単に動かせる

```bash
git clone https://github.com/arturbien/React95.git
cd React95/
yarn
yarn storybook
```

このように、簡単に試すことができました。


<img width="1034" alt="Screen Shot 2019-04-27 at 4.16.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/8a06eebe-c3f2-1ea9-55b2-ed82159a4b87.png">


※ ↑と同じサンプルが https://arturbien.github.io/React95/ こちらにもあります。

# webpackで3分で動かせるサンプル

webpackでも動かすことができました

[自分で試したコード](https://github.com/okumurakengo/00019_react95)

```bash
yarn add react95 styled-components react react-dom webpack webpack-cli @babel/core babel-loader @babel/preset-env @babel/preset-react
```

```webpack.config.js
module.exports = {
    mode: "development",
    module: {
        rules: [{
            test: /\.js$/,
            use: {
                loader: "babel-loader",
                options: {
                    presets: ["@babel/preset-env", "@babel/preset-react"]
                }
            }
        }]
    }
}
```

```jsx:src/index.js
import React from "react";
import {render} from "react-dom";
import { createGlobalStyle, ThemeProvider } from "styled-components";
import { reset, themes, List, ListItem, Divider } from "react95";

const ResetStyles = createGlobalStyle`
  ${reset}
`;

render(
    <div className="App">
        <ResetStyles />
        <ThemeProvider theme={themes.default}>
            <List>
                <ListItem>🎤 Sing</ListItem>
                <ListItem>💃🏻 Dance</ListItem>
                <Divider />
                <ListItem disabled>😴 Sleep</ListItem>
            </List>
        </ThemeProvider>
    </div>, 
    document.getElementById("root")
);
```

```index.html
<!DOCTYPE html>
<meta charset=utf-8>
<title>React95 Test</title>
<div id=root></div>
<script src=dist/main.js></script>
```

```bash
yarn run webpack # ./dist/main.jsが出力
```

index.htmlを表示すると、このように簡単に使うことができました

<img width="626" alt="Screen Shot 2019-04-27 at 3.27.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/7da6bcaf-10e1-31e2-4be0-b6a5821c00e5.png">

---

小ネタライブラリ紹介でした :smile:  読んでいただいてありがとうございましたm(_ _)m
TREASURE DATAについて

アウトラインレベルでまとめ

## Treasure Dataとは
企業向け顧客データ活用をコアバリューとしたプラットフォーム

TDと呼んだりする

## 背景
提供当初はデータプラットフォームと銘打っていたが、現在はカスタマーデータプラットフォームと銘打って周知している。という変遷がある。

今までデータプラットフォームと名乗ってた手前、HP上で違いについても詳しく明記している

### データプラットフォーム
いわゆるDMP

- オーディエンス情報を提供するサービス
- 個人識別情報（個人識別情報）を保管することはできない
- 当初の名称はTreasure Data Platform

### カスタマーデータプラットフォーム
いわゆるCDP

- 顧客プロファイル情報を提供するサービス
- 個人識別情報（個人識別情報）を保管することができる
- 現在の名称はArm Treasure Data eCDP

ArmとついているのはArmという会社がTDを買収したから
読売ジャイアンツみたいな感じだと思う
eCDPの「e」はenterpriseで、「企業向けの」という意味合いをニュアンスとして入れたかったと想定

## 特徴
連携せずともTreasure Data単体で、データの活用視点までを含めた環境が整っている
そしてプラットフォームが大きい(TDを利用している企業が多い)のでデータ連携(Data Exchange)もし易い

- データの集計や加工がし易いクエリエンジン(presto・hive)
- GUIによってセグメントの作成を行う機能
- クロスデバイス対応
- Treasure Workflow(マーケティング施策に使用する分析データを取得するために必要な作業を効率的に行える機能)
- 機械学習機能
- 企業間データ連携
- ダッシュボード
- 予測モデル生成
- ユーザー権限管理

## 活用視点記事
データを分析するために必要なノウハウを得られる
https://support.treasuredata.com/hc/ja

## ブログ
アドテク界隈の動向や知識を得られる
https://tug.red/

## 参考URL
https://www.treasuredata.co.jp/learn/

## 雑感
エンジニア側に分析能力を事業視点で持たせるか、マーケター側にSQLのような分析技術を持たせるかで考えると、比較的ペルソナとしては後者の方な気がする
【確率】モンティ・ホール問題を簡潔に説明してみる

googleで検索すると、モンティ・ホール問題の解説がやたら長いので、簡潔に説明してみます。
箱を変える場合、最初にはずれを引けば当たるので、当たる確率は2/3。
箱を変えない場合、当たる確率は1/3。
よって、箱を変える場合の当たる確率は箱を変えない場合の当たる確率の2倍。
Laravel index.php からRoutingできるまで追ってみた

####◆/public/index.php

```php

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

```

####◆/bootsrap/app.php

```php
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

```

####◆Application

```php
namespace Illuminate\Foundation;

class Application extends Container implements ApplicationContract, HttpKernelInterface
{
    public function __construct($basePath = null)
    {
        if ($basePath) {
            $this->setBasePath($basePath);
        }

        $this->registerBaseBindings();

        $this->registerBaseServiceProviders();

        $this->registerCoreContainerAliases();
    }
}

protected function registerBaseServiceProviders()
{
    $this->register(new EventServiceProvider($this));

    $this->register(new LogServiceProvider($this));

    $this->register(new RoutingServiceProvider($this));
}
```

####◆RoutingServiceProvider

```php

namespace Illuminate\Routing;

class RoutingServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->registerRouter();

        ...
    }

    protected function registerRouter()
    {
        $this->app->singleton('router', function ($app) {
            return new Router($app['events'], $app); //★Illuminate\Routing\Router.php
        });
    }

    ...

}

```

####◆Facade\Route

```php

'Route' => Illuminate\Support\Facades\Route::class,

protected static function getFacadeAccessor()
    {
        return 'router';
    }

```

####◆Facade

```php

class Route extends Facade{

public static function __callStatic($method, $args)
{
    $instance = static::getFacadeRoot();

    if (! $instance) {
        throw new RuntimeException('A facade root has not been set.');
    }

    return $instance->$method(...$args);
}
```
【GooglePlay】Unityで作ったAndroidアプリをGooglePlayでリリース（ストア掲載情報）アイコン


↓↓↓↓Unityで作ったAndroidアプリ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">⭐️Androidアプリ⭐️リリース<br>🍒CherryCocktailGlass🍒<br>Blenderで絵を描いてUnityで作成したミニゲームリリースしました😍<br>🍷カクテル🍷グラス🍷に<br>🍒チェリー🍒をのせるシンプルなゲームです。<br>✨（●＾o＾●）✨<br>【Android】<br>Google Play 無料Free<a href="https://t.co/I70R9QEDuq">https://t.co/I70R9QEDuq</a><a href="https://twitter.com/hashtag/CherryCocktailGlass?src=hash&amp;ref_src=twsrc%5Etfw">#CherryCocktailGlass</a> <a href="https://t.co/g8kCM9QVhL">pic.twitter.com/g8kCM9QVhL</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1121818121323433984?ref_src=twsrc%5Etfw">April 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</br>

Google Play Consoleのストアの掲載情報を開く

1.高解像度アイコン512×512を用意する
![s_スクリーンショット 2019-04-27 2.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b3d73146-ce06-401e-53b4-3f328a25f5b6.png)



2.スクリーンショット８枚掲載できる
（アスペクト比2:1）
横７５０×縦１３３４px 
<img width="1176" alt="スクリーンショット 2019-04-27 2.50.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/f2d1bd2c-cebb-09f2-8773-0e2d81603fa4.png">


3.ヘッダー画像
横１０２４×縦５００px 
<img width="1171" alt="スクリーンショット 2019-04-27 2.47.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/1f193d0c-d7b9-3594-7b0b-eb6fa08e5385.png">


#CherryCocktailGlass
↓↓Google Play　無料Free
CherryCocktailGlassチェリーカクテルグラス〜無料簡単ミニゲームFree games
[![googleStoreLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/caab32db-b9f2-0515-4d77-4317112e13e3.png)](https://play.google.com/store/apps/details?id=com.non.CherryCocktailGrass)

</br>
</br>
RSpec on DockerでChromeブラウザテストを行う方法

##docker-composeでブラウザテストを実行すると上手くいかない

```
$ docker-compose run web rspec
```
を実行すると

```ruby
:エラー内容
Selenium::WebDriver::Error::WebDriverError:
  unable to connect to chromedriver 127.0.0.1:9515
```
こんな感じ。
chromedriver 127.0.0.1:9515にconnectできません。
ローカルホストの9515にアクセスしようとしているみたいなので
そこを変更したいが中々上手くいかない。。。。

##結論

https://qiita.com/t-koshi/items/97adab8628d201e85d10
こちらで書いていただいている内容を自分用にカスタマイズして使うと無事動きました。
非常に助かります。
ですが何を設定しているかよく分からなかったので
調べながら進めます。

##Dockerfile変更点

自分の環境では下記のようにDockerfileを書くと上手くいきました。
**dockerコンテナでgoogle chromeおよびchrome driverを
インストールする**コマンドを追加しておくことで解決できました。
また、apt-getコマンドでchromeと依存関係にある各種パッケージを追加しています。

```ruby:Dockerfile

FROM ruby:2.6.1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatspi2.0-0 libgtk-3-0 libnspr4 libnss3 libx11-xcb1 libxss1 libxtst6 xdg-utils
RUN curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb
RUN curl -O https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
                
```

##rails_helper.rb

rails_helper.rbや他の設定ファイルは
先ほどの参考リンクをそのまま使用しています。


##ここからCapybaraクラスメソッド解説
##Ruby Doc
https://www.rubydoc.info/github/jnicklas/capybara/Capybara#configure-class_method
こちらにCapybaraクラスについて説明があります。


##Capybara.server

symbolでテスト環境で使うサーバーを指定します。デフォルトはwebrick。

##Capybara.register_driver

新しいドライバーを登録します。
登録せずにデフォルトで使えるのは
**:rack_test,**
**:selenium,**
**:selenium_headless,** 
**:selenium_chrome,**
**:selenium_chrome_headless,**
**:chrome_headless**
のみとなります。

##Capybara::Selenium::Driver

```ruby

Capybara::Selenium::Driver.new(app, browser: :chrome, options)
```
でドライバーのインスタンスを生成します。
ブラウザのデフォルトはfirefoxです。

##Capybara.javascript_driver

javascript使用時のドライバーを指定できます。
使用する時はspecにjs: trueを指定することで使用できます。
aftereffects テクノロジー的なラインを黄金比を用いてエクスプレッションで描画する

#実際に作成したものはこれ
![コンポ 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/0b605721-1449-bae5-779c-ad7c33f52cab.png)

#デザインに黄金比を取り入れる
見た目は普通
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/82ba79ac-901f-6bbf-4389-14032c2853a2.png)

だけど黄金比を取り入れています
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/c9f504f5-07f1-a354-4387-2ff3bf43ac6d.png)

点から直径100pxの円の黄金比をいくつかだして、その黄金比で出した円の45度でパスを決定しています。

#実際のエクスプレッション内容
シェイプレイヤーのパスに下記のエクスプレッション

```jsx
var Randomize = thisLayer("エフェクト")("Randomize")("スライダー");
seedRandom(Randomize,true)
var pathLength = thisLayer("エフェクト")("PathLength")("スライダー");
var BaseCircle = effect("Base Design Size")("スライダー");
var ratio = effect("Ratio")("スライダー");
var VL = thisLayer("エフェクト")("ValueLength")("スライダー");// value length
var tempkakudo = thisLayer("エフェクト")("Degree")("スライダー");
var kakudo ;
var check = thisLayer("エフェクト")("Start Invert")("チェックボックス");
var pathArray =[];
var tempx = 0;
var tempy =0;

for ( var i = 0 ; i < pathLength ; i++ ){
var temp = Math.pow( ratio,Math.round( random(1,VL) ) )*BaseCircle;
    if (random() > .5 ){
        kakudo = -tempkakudo;
    }else{
        kakudo = tempkakudo;
    }
    
    if ((i%2) == check ){
    	tempx = tempx + (temp/2)*Math.cos(kakudo);
    	tempy = tempy + (temp/2)*Math.sin(kakudo);
        pathArray.push([tempx,tempy])
    }else{
        tempx = tempx + (temp/2)*Math.cos(0);
        pathArray.push([tempx,tempy])
    }
    
}

createPath(points = pathArray, inTangents = [], outTangents = [], is_closed = false)
```

制御エフェクトはこんな感じ

![000.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/8d865c85-0575-d3bb-8a89-8c23d884f407.png)
新しいMacBookProを支給されたら速攻インストールしたいアプリたち


![macbookpro](https://images-na.ssl-images-amazon.com/images/I/61GJPL1hCpL._SL1500_.jpg)

#はじめに
筆者は今日新しいMacBookProが支給されたのでテンション爆上がりしています。
まっさらな新しい端末を自分が使いやすいようにカスタマイズするのはとても楽しいことです。
ということで新しいMacBookProのセットアップがてら自分が普段使っているアプリを紹介します。有名どころが多数なので改めて紹介する必要もないかもしれない。忘備録的な意味合いもあります。

#ユーティリティ系

別に必須ではないが、一度インストールして使ってみると、病み付きになってしまう。そんなイカした便利なアプリ達。

###Karavinar
 キーバインド変更アプリ
 capslockキーをctrlキーにしたり、usキーボードを使う場合はcommandキーに日本語英語切り替えを割り当てたり
  https://pqrs.org/osx/karabiner/
###Alfred
 ランチャーアプリ。強いspotlight。とりあえずAlfredを起動してXcodeを立ち上げたりSlackを立ち上げたりする。`spell "HogeHuga"`と入力すると英単語のスペルチェックができたり、`translate "HogeHuga"`でGoogle翻訳できる。筆者は英語よわよわエンジニアなので大変重宝している。
 https://www.alfredapp.com/

 玄人はShellScriptを実行できるようにしたりするらしい。
 https://blog.foresta.me/posts/run_shell_on_alfred/
###Clipy
 クリップボード履歴、スニペット管理。普段よく使う定型文を登録しておくと効率が上がって大変良い。自分はデバッグ用のコードを複数登録している。
 https://clipy-app.com/

###Spectacle
 ショートカットでウィンドウサイズと位置を変更できる。特に大きいディスプレイを使う時に重宝する。左上にFinder左下にterminal,右側にXcodeとかできる。ショートカットが他のアプリと被ることがあるので要カスタマイズ。
https://www.spectacleapp.com/

#Git

###SourceTree
 Gitクライアント。王道。
 https://www.sourcetreeapp.com/
###Fork
 Gitクライアント。SourceTreeに似てる。こっちの方が使いやすいと思う。たまに動作が不安定。
 https://git-fork.com/

#思考整理

筆者の脳みそに搭載されているメモリはたった8MBでHDDも2GBほどしかないので、こういうツールがないとやっていけない。

###EverNote
 多機能メモツール。思考の流れを文字化して記録して使ってる。
 https://evernote.com/intl/jp
###XmindZEN
 マインドマップ作成ツール。クラスとかデータの設計をする時に使うと良い感じな気がする。無料版が使える。軽量でしかもかっこいい。他に有名なアプリで[MindNode](https://mindnode.com/mindnode/mac)というものがあるがこっちは有料で結構お高い。
 https://www.xmind.net/zen/
###ScrapBox
特に綺麗にまとめる必要もない思いつきのアイディアを雑にメモしてる。メモしてるだけで一度も見返したことがない。いつかきっと役にたつはず。たぶん。
https://scrapbox.io/?lang=ja

#エディタ

###Atom
 矩形選択できるようにしたり、jsonの自動整形ができるようにしたり、カスタマイズして使う。
 https://atom.io/
###VSCode
 Atomと違ってそのまんまでも十分使い勝手が良い。
 https://code.visualstudio.com/
###SublimeText
 軽い
 https://www.sublimetext.com/

#終わりに
便利なツールを使って開発効率をあげて、つよつよエンジニアになって、給料１０倍にしましょう。
EKSハンズオン :  目次

# 目次
1. [EKSハンズオン：クラスター作成](https://qiita.com/asahi0301/items/62f4b7949a7bf8457258)
2. [EKSハンズオン：Pod 作成](https://qiita.com/asahi0301/items/0d2e0da94cd80f4173cf)
『応答なし』にならないアプリ開発 Part.2

#既存処理の『応答なし』対策救世主？
[前回](https://qiita.com/ytkproject/items/311996988131728f1fb4)はDoEvents・Win32API・BackgroundWorkerの説明を上げましたが、本題のTaskを簡単に紹介したいと思います。
TaskはBackgroundWorkerと違い、既存の処理に少し手を加えるだけで実装可能なので、すでに出来上がっているけど『応答なし』や実行中に固まってしまう事を解決したい・・・というときに活用できます。

#まずは比較用に
まずは『応答なし』や実行中はフォームが固まってしまうプログラムです。

・Form1にボタン・プログレスバー・ラベルを一個ずつ配置

```VB:Form1.vb
Imports System.ComponentModel
Public Class Form1
    Private MAX_COUNT = 100

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        ProgressBar1.Hide()
        Label1.Hide()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ProgressBar1.Maximum = MAX_COUNT
        ProgressBar1.Value = 0
        ProgressBar1.Step = 1
        Label1.Text = String.Empty

        '*** 処理実施
        ProgressBar1.Show()
        Label1.Show()
        For i = 1 To MAX_COUNT
            WaitProcess()

            ProgressBar1.PerformStep()
            Label1.Text = String.Format("({0}/{1})", ProgressBar1.Value, MAX_COUNT)
        Next
        ProgressBar1.Hide()
        Label1.Hide()
    End Sub

    Private Sub WaitProcess()
        '*** 重い処理
        Threading.Thread.Sleep(500)
    End Sub
End Class
```

#Task(Async/Await)化
上記プログラムをTaskを使用した形に書き換えます。

```VB:Form1.vb
Imports System.ComponentModel
Public Class Form1
    Private MAX_COUNT = 100

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        ProgressBar1.Hide()
        Label1.Hide()
    End Sub

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ProgressBar1.Maximum = MAX_COUNT
        ProgressBar1.Value = 0
        ProgressBar1.Step = 1
        Label1.Text = String.Empty

        '*** 処理実施
        ProgressBar1.Show()
        Label1.Show()
        For i = 1 To MAX_COUNT
            Await Task.Run(Sub()
                               WaitProcess()
                           End Sub)

            ProgressBar1.PerformStep()
            Label1.Text = String.Format("({0}/{1})", ProgressBar1.Value, MAX_COUNT)
        Next
        ProgressBar1.Hide()
        Label1.Hide()
    End Sub

    Private Sub WaitProcess()
        '*** 重い処理
        Threading.Thread.Sleep(500)
    End Sub
End Class
```

修正点は以下の二点になります。

```VB
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
　　　　　　　↓
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
```

```VB
        For i = 1 To MAX_COUNT
            WaitProcess()
　　　　　　　↓
        For i = 1 To MAX_COUNT
            Await Task.Run(Sub()
                               WaitProcess()
                           End Sub)
```

- [x] Taskを使用するメソッドに『Async』を追加
- [x] 重い処理を『Await Task.Run(Sub() 重い処理 End Sub)』でくくる

上記の書き換えのみで処理実行中の動作が変わったことが実感できます。

#Task利用時の注意点
このように手軽に利用できそうなTaskですが、先のBackgroundWorker同様にマルチスレッドの処理になりますので、Task処理内でコントロールにアクセスする等そのままでは出来ません。
また、BackgroundWorker等と同様、各ボタンの非活性等で同時実行を制御する必要があります。

Taskについてはまた別にまとめていきたいと思います。
自分用勉強メモ7日目

# tips

## ELFバイナリが実行できない

以下のようなエラーメッセージが表示される．

```bash
/bin/bash: ./hoge: そのようなファイルやディレクトリはありません
```

32bitのバイナリを64bitのUbuntu上で実行しようとしていたのが原因だった．
以下の手順で32bit用のライブラリをインストールすれば解決する．

```bash
# dpkg --add-architecture i386
# apt update
# apt install libc6:i386 libncurses5:i386 libstdc++6:i386
```

参考：[bash: コマンドが確かに存在するのに "-bash: COMMAND: No such file or directory" と言われる](https://qiita.com/nakat-t/items/475397820664e2a82d46)

# CpawCTF

## [Q23.[Reversing]またやらかした！](http://ctf.cpaw.site/questions.php?qnum=23)

ELFバイナリが与えられる．
実行しても何も起きないので，デバッグする必要がある．
デバッグの知識が皆無だったので，おとなしく[write-up](https://qiita.com/yacropolisy/items/dccf79b5914fd46ffac7)を見た．
解く手順としては以下のような感じだと思う．
1. 逆アセンブル結果を見ると，文字列を格納している部分と，ループを回している部分があることがわかる．
2. ヒントとして暗号を解くプログラムであることがわかっているので，ループの回数分暗号処理をしていると推測できる．
3. 格納し終わった時点にブレークポイントを指定してそこまで実行し，文字列が格納されている付近のメモリの値を見るが，まだ暗号化前なので意味を持っていない．
4. ループ処理が終わった時点まで実行してメモリを見ると，フラグらしき文字列が確認できる．

## [Q24.[Web]Baby's SQLi - Stage 2-](http://ctf.cpaw.site/questions.php?qnum=24)

[Stage1](http://ctf.cpaw.site/questions.php?qnum=22)を解くと，`next stage url`というカラムに本問のURLが書いてある．
URLを開くと，パスワードを入力するように言われるが，適当な値を入力すると，画面上部にphpのエラーメッセージが出る．
ここから先がわからなかったので，write-upを参考にした．
[SQL injection](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/502.html)を利用すればいいらしい．

## [Q26.[PPC]Remainder theorem](http://ctf.cpaw.site/questions.php?qnum=26)

剰余定理を解く．

```math
x \equiv a \pmod{b}\\
x \equiv c \pmod{d}
```

のとき，

```math
(b \times n + a) \bmod d = c
```

となるようなnを見つければ良い．

# 調べた知識

## [バーナム暗号](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%8A%E3%83%A0%E6%9A%97%E5%8F%B7)

あるビット列に対して，同じ長さのビット列を用意して共通鍵とし，XORをとって暗号文とする．
復元する際はもう一度共通鍵でXORをとれば良い．

以下のサイトの説明がすごくわかりやすくまとまっていた．
参考：[最強の暗号？バーナム暗号](https://kakke18.hatenablog.com/entry/2019/02/22/193223)

## gdbのコマンド

上記のwrite-upで使用していたもの．
- break *[アドレス]
    - アドレスの位置にブレークポイントを張る．
- info registers
    - レジスタの状態を表示する．
- x/[表示する数][メモリサイズ(b,h,w,g)][表示フォーマット(s,i,x)] [先頭メモリアドレス]
    - メモリの状態を表示する．
    - メモリサイズはb(バイト)，h(半ワード，2バイト), w(ワード，4バイト),g(Giantワード，8バイト))の指定が可能．
    - 表示フォーマットはs(文字列)，i(命令)，x(16進数)の指定が可能．
kotlinで関数の戻り値として関数を渡したい

# はじめに
つい先日kotlinを勉強し始めたのですが、関数の引数に関数を渡す例はいっぱいあるからわかる！
けど、関数を戻り値として扱う例は見つからずに、どうしたらいいんだろうと色々探し回ってました・・・

探し方が悪かったのか結構苦労したので、すごいピンポイントですが記事にしました。

## 関数の戻り値として関数を渡す
早速、結論を言うと以下の感じで書けば大丈夫なようです。

```kotlin
fun 関数名(引数): (戻り値として返す関数の引数) -> (戻り値として返す関数の戻り値の型) {
    // なんかの処理
    return 戻り値の関数
}
```

引数として関数を指定する方法と同様の表記を、関数の戻り値型の位置で指定すれば良いようです。

## サンプル
せっかくなので関数の引数に関数を渡す例としてクロージャのサンプルを作ってみました。

```kotlin
fun functionGenerator(outerStr: String) : (innerStr: String) -> Unit {
    val outer = outerStr
    return fun (innerString){
        println("outer value : $outer")
        println("inner value : $innerString")
    }
}

fun main() {
    val funInstance = functionGenerator("this is outer function arg")
    funInstance("this is inner function arg")

    functionGenerator("outer func")("inner func")

}
```

関数の戻り値の型指定は```(innerStr: String) -> Unit```の部分です。
functionGeneratorの戻り値はString型のinnerStrを受け取って、戻り値なしの関数と言う意味ですね。
実際の戻り値は、```return fun(innerString)```で関数を作っています。


main側ではfunctionGeneratorを呼び出して```funInstance```で関数を受け取って実行します。

```kotlin
val funInstance = functionGenerator("this is outer function arg")
    funInstance("this is inner function arg")
```

また、一回しか使わないのであればfunctionGeneratorで戻ってきた関数を即時実行することもできます。

```kotlin
functionGenerator("outer func")("inner func")
```

## 終わりに
関数の戻り値型の指定に、引数として関数を指定する方法と同様の表記```() -> ()```すればいいだけでした・・・
同じところでつまづいた方のお力になれればいいなぁと思います。
hamlでの部分テンプレートの呼び出し方の種類（省略形含む）

# 部分テンプレートとは
ビューファイルの一部を別のファイルに切り出しテンプレート化すること。
これにより、共通パーツや繰り返し表示するパーツを無駄なく作成することができる。

# 部分テンプレートの使い方
```haml:app/views/messages/index.html.haml
  = render partial: 'shared/side_bar'
```

```haml:説明
  = render partial: "部分テンプレート名"
```
この場合、
`shared` の中にある部分テンプレート `_side_bar.html.haml` を呼び出すことができる。

# インスタンスを渡す場合
### 単数形のインスタンスを渡す場合

```haml:index.html.haml
  = render partial: 'groups/group', locals: { group: @group }
```

```haml:説明
  = render partial: '部分テンプレート名', locals: { 変数名: 値 }
```
この場合、 `groups` の中にある部分テンプレート `_group.html.haml` が呼び出され、
`インスタンス変数@group` の値を持った `変数 group` がこのテンプレート内で使用できる。

```haml:省略形
  = render 'groups/group', group: @group
```
`partial` と `local` は省略可。どちらかのみの省略も可。

```haml:さらに省略
  = render @group
```
オブジェクトの `インスタンス変数` と `部分テンプレート` が `同じ名前` のとき。
これだけで上記と同じ処理になる。
※ この場合、`groupsコントローラー` のインスタンスをオブジェクトとしているため、
　読み込むテンプレートは `views/groups` の中に配置する。

### 複数形のインスタンスを渡す場合

「一つの記事項目をテンプレート化し、それを繰り返し表示することで一覧を表示する」
のような**繰り返し処理**に便利な書き方。

```haml:index.html.haml
  = render partial: 'groups/group', collection: @groups
```
`collection`オプションを使うことでeachを使用せずに書くことができる。
この場合、
`@groups` の中の `個別のインスタンス` が `部分テンプレート内` の `変数 group` として使用できる。

```haml:省略形
  = render 'groups/group', groups: @groups
```

```haml:さらに省略
  = render @groups
```
複数形の場合、
コレクションの中の `個別のインスタンス` が `部分テンプレートに呼ばれる変数` となるため、
each文を使用せずに繰り返しの処理ができる。

# 参考
[[Rails] 部分テンプレート使用時のrenderの書き方](https://qiita.com/kojiro3/items/4ce52494a4e69bc443a2)
cypressの環境構築

転職してテストエンジニアになったので、WebシステムのUIテストを自動化できる、cypressについて学んでみます。

## cypressとは
- 無料で使うことのできるUI自動テストツール
- GoogleChromeのみ対応（他ブラウザではテスト不可）
- 動作が軽い
- JavaScriptでテストスクリプトを記述

## cypressインストール環境
- windows 10 home 64bit
- gitbashを使用

## node/npmインストール

nodeのインスール
[ダウンロードはこちらから](https://nodejs.org/en/download/)

端末にあったものをダウンロードし、インストーラを実行し、インストールを完了する。

インストールが完了してから、nodeとnpmのバージョン確認を行ってみるとバージョンが表示され、インストールされていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215529/9b00794d-3a04-c71a-00a9-9f2627b541de.png)


## cypressインストール

- cypressを格納するディレクトリを作成

- cypressのディレクトリに移動したらnpm installでcypressをインストール
 
```
$ npm install cypress --save-dev
```

インストールには5分ほどかかりますので終わるまで待ちましょう。


- cypressを起動する
- 
```
$ ./node_modules/.bin/cypress open
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215529/ea7c5e62-7478-4ef0-345d-3d9862d689f0.png)

- cypressの管理画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215529/393faed4-b39f-0029-9bae-af77b2f92e86.png)



ここまででcypresによる」テスト環境が整いました。
Jetson Nano の消費電流計測してみた

# 概要

JetsonNanoが届いたので、消費電流を計測してみた。
最小分解能は 0.5mA 程度ですが、校正等していないので参考値レベルです。

- 縦軸: 消費電流[A]
- 横軸: 経過時間[秒]

# 起動時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/e991d23e-f53c-6f5b-afa0-dcd54b5fc20d.png)

# CPU演算時

[4x4行列同士の掛算を高速化してみる ～Part2～](https://qiita.com/blue-7/items/6b607e1af48bc25ecb35)
上記実行時の消費電流変化です。
4core フルに使用し、NEON命令等も使っています。

```JetsonNano
clone https://github.com/blue777/NanoPi-NEO
cd NanoPi-NEO
g++ -O3 -pthread -std=c++11 -mfpu=neon PerfTest_Matrix.cpp
./a.out
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/8135f7b1-7fb2-0383-eac4-02e44060c93c.png)

# アイドル時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/12d4ca9c-c427-fcc6-c703-aa59ad98efa3.png)

# まとめ

CPUのみでの実施でしたが、最大1.25A程度電流が必要となるため、電源要件はそこそこ厳しいです。
使用する電源機器・ケーブルによってはブートしないケースがありました。
MacのApachでWordpress更新・プラグインインストールしようとすると、FTP接続画面になる

MacにデフォルトでインストールされているApacheでWordpressを動かそうとしたら、プラグインのインストール時にFTPの接続画面が出てきました。

- [WordPress更新時にFTP情報入力画面が表示される場合の対処方法3つ](https://www.sandalot.com/wordpress%E6%9B%B4%E6%96%B0%E3%81%A7ftp%E5%85%A5%E5%8A%9B%E7%94%BB%E9%9D%A2%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)
- [Wordpressの更新で、FTP経由のアップデートを回避する方法](https://qiita.com/pugiemonn/items/c3f9bca255082a085b6c)

# 実行ユーザーは apache ではない

多くのサイトではWordpressのディレクトリのオーナーを`apache`にしろと書かれています。

```
# chown -R apache:apache (WordPressを設置したディレクトリの名称)
```

しかしMacにデフォルトでインストールされているApacheの実行ユーザーは`apache`ではないので、この方法では上手くいきません。

# 実行ユーザーを調べる

`/etc/apache2/httpd.conf` を適当なエディタで開いて `User` の書かれている行を探します。

```
User _www
Group _www
```

ユーザー `_www`、グループ `_www` となっているのがわかります。


# 解決

今回は自分のホームディレクトリ内 `~/www/hoge/news/wp/` にインストールしたWordpressを使いたいので、下記のコマンドを実行します。

```
# sudo chown -R _www:_www ~/www/hoge/news/wp
Password: ←Macの管理者パスワードを要求される
```

管理者パスワードを要求されるので入力します。
Macを使っているのが自分だけなら、自分のログインパスワードが管理者パスワードです。

Apacheをhomebrewでインストールしてたら、設定ファイルは `/usr/local/etc/apache` あたりだと思います（確認してません）。
sliceの使い方を間違えて失敗した話

# paizaの問題を解いていた時の一幕
※paizaの利用規約を守るために標準関数のsliceにだけ焦点を当てています。
　表示されているコードは実際の問題とは関係ありません。

私「Arrayの必要な範囲だけindexOfで評価したいからsliceで一部だけ一時変数に代入したらよかね」

```js
// 3番目含む2つのデータが必要
var a = 3, b = 2;
var data = ["0","1","0","1","1"];
let tmp = data.slice(a, b);
```

私「よし、こんな感じで処理したらよかろ」
＼提出前動作確認ポチィ！／

paiza「お疲れさま、だが貴様は間違っている( ˘ω˘ )！」

私「(・ω・)！？」

悩み過ぎて頭痛を発症した上時間切れして夕飯とお風呂を済ませた後。

私「処理の流れはこれで大丈夫なはずなのになんで結果が違うんだ！？」
私「冷静に考えてもう一度printfデバッグしてみるか( ˘ω˘ )」
私「ファッ！？なんでtmpの中身が空なんだ！？」
私「sliceって開始位置(a)と取得したいデータの終わり(b)を渡せば良かとやないの？！」
私「何で私はこんな勘違いをしていたのだろう……」（MDNを見直しながら）

```js
// 3番目含む2つのデータが必要
var a = 3, b = 2;
var data = ["0", "1", "0", "1", "1"];
let tmp = data.slice(a, a + b);
```

私「このうっかりミスが無ければきっとこの問題時間内に解けてたよなぁ」

# 結論
使用例はきっちり見た上でちゃんと使いましょう。
（当たり前な話である。）
VBAでExcelシートの行を扱う件

<h3>0．背景</h3>
<p>
Excelシートの行を挿入したり、削除したり、をプライベートで調べちゃったので、<br> 
ココにメモで残しておきます。<br>
</p>

<h3>1．行のアレコレ</h3>
<p>
(1) 挿入
<pre>
Rows(2).Insert　　　　　’2行目に空行を挿入する
</pre>

(2) 削除
<pre>
Rows(3).Delete　　　　　’3行目を削除する
</pre>

(3) コピペ
<pre>
Rows(2).Copy　　　　　　’2行目をコピーする
Rows(3).PasteSpecial　 ’3行目にペーストする
</pre>

(4) クリア
<pre>
Rows(2).Clear　　　　　 ’2行目をクリアする
</pre>

</p>

<h4>ご参考まで</h4>
<p>
● <a href="https://dotinstall.com/lessons/basic_excel_vba">ドットインストール：Excel VBA入門</a>
</p>
pyenv-virtualenvからpipenvに浮気中

タイトル通りですが，私はpythonを使い始めて約2年の間一途に`pyenv-virtualenv`を使ってきました．ですが最近友人からのススメで`pipenv`がとても良いとのことなのでしばらく使ってみることにしました．
今回の記事は環境構築と2週間ほど使ってみた感想を記します．

#環境
- mac OS Mojave バージョン10.14.4
- pyenv 1.2.11
- pipenv, version 2018.11.26
- Homebrew 2.1.1


#前提条件
この記事では`homebrew`と`pyenv`が使えることを前提条件としています．

#pipenvって何者？
さすがにまだ2週間しか使ってないので詳しくわわかりませんが，一言で言うなら「仮想環境でpythonを動かせるツール」です．
詳しくは[こちら](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)の記事が参考になると思います．

#pipenv のインストール
homebrewでインストール可能なので，今回はこちらのやり方のみ紹介します．

```zsh:zsh
$ brew insatll pipenv
```

#使い方
##pythonのバージョン指定
まずは任意のディレクテリ下でpythonのバージョンを指定し，下準備を整えます．

```zsh:zsh
$ pipenv --python 3.7
```

`--python`でpythonのバージョンを指定できるので，細かく指定したい場合は上記のようにしたらいいと思います．
他にも`--three`で3系，`--two`で2系を選択することも可能みたいです．

##パッケージのインストール
続いてパッケージのインストール方法です．

```zsh:zsh
$ pipenv install numpy matplotlib pandas
Installing numpy…
Adding numpy to Pipfile's [packages]…
✔ Installation Succeeded
Installing matplotlib…
Adding matplotlib to Pipfile's [packages]…
✔ Installation Succeeded
Installing pandas…
Adding pandas to Pipfile's [packages]…
✔ Installation Succeeded
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✔ Success!
Updated Pipfile.lock (6e010b)!
Installing dependencies from Pipfile.lock (6e010b)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 9/9 — 00:00:02
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
```

`pipenv install`以降にスペース区切りで並べることで，複数のパケージをインストールすることができます．当然1つしか記述しない場合も同様に動作します．

##実行例
とりあえずpythonをターミナル上で動かしてみましょう．

```zsh:zsh
$ pipenv run python
Python 3.7.3 (default, Mar 27 2019, 09:23:15)
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

pipenvで作成した環境を使用する際は，`pipenv run`コマンドを使用すれば問題ないです．

また，別の方法としては以下のような方法もあります．

```zsh:zsh
$ pipenv shell

(hoge)$ python
Python 3.7.3 (default, Mar 27 2019, 09:23:15)
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

`pipenv shell`でpipenvで用意した仮想環境に入ることができます．
環境から抜ける場合は`exit`を使用します．

```zsh:zsh
(hoge)$ exit
$
```

続いてファイルに記述したコードを使用する場合です．

```python:hoge.py
print("hello")
```

```zsh:zsh
$ pipenv run python hoge.py
hello
```

とりあえずざっとこんな感じですかね．

#感想
使ってる感じ今までpyenvとpyenv-virtualenvを使用してpythonの環境を整えていたので，そこらへんが1つにまとまったような感じですかね．率直な意見としては1つにまとまってわかりやすくなったし，わざわざパッケージのリストを出力する必要がなくなったのは嬉しいですが，ちょっとパッケージのインストールとか時間かかりすぎじゃね？って思う面もありますね．
それとパッケージのインストールは今まで`pip`でやってたので，コマンドが長くなったのは一番しんどいですね(^_^;)

なので少しだけaliasを設定したので，必要な方はそこらへん自分好みにアレンジしてみるのもいいかもしれません！

```zsh
alias ppython='pipenv run python'
alias pprun='pipenv run'
alias ppi='pipenv install'
alias ppl='pipenv run pip list'
```


#参考資料
[Pipenv: 人間のためのPython開発ワークフロー](https://pipenv-ja.readthedocs.io/ja/translate-ja/)
[Pipenvを使ったPython開発まとめ](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)
[pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)
【やらかした】C++でSQLiteを組み込む時、プロジェクトにSQLiteのソースコードを含めてはいけない

これをやらかしてプロジェクトファイルを壊すところだったので当たり前のことかもしれないが備忘録的に書き残しておきます。

# あっ！なんかビルド通らないぞ！

ぼく「SQLiteを組み込むぞ！」

ぼく「えーっと……動かすにはsqlite.cとかshell.cを組み込まないと動かないよな……？」

ぼく「組み込んでみよう」

コンパイラ「構文エラーです。stdが何か変です。予期せぬEOFです」

ぼく「！？」

# 灯台下暗し。

結果的にビルドが通らない原因はsqlite.cとかshell.cとかを組み込まないといけないという勘違いに基づいたものでした。
実際にプロジェクトに組み込む必要があるのは、「sqlite3.dll」「sqlite3.lib」「ヘッダファイル」だけだったのです。

# 結論

**外部ライブラリを組み込む時は余計なファイルまでプロジェクトに組み込まないように気を付けよう！**


~~本当に備忘録的な記事です。お役に立てなかったらごめんね。~~
Xcodeで「linker command failed with exit code 1」が発生した時はDerivedDataを消してみよう

## エラー内容
xcodeでビルド時に下記のエラーが発生しました
上記のエラーで検索するとたくさん記事が出てきましたので、よく発生するエラーのようですね。

```
linker command failed with exit code 1 (use -v to see invocation)
```

この記事で私が対応したことを記載しますが、私自身iOSエンジニアではないため、理解がしていないところが多いです。
タイトルが「消してみよう」とかポップな感じですが問題が起きても責任は取れませんのでご了承ください。

## 対応したこと
### Reveal in Logの確認
まずはこちらの記事を参考に、Reveal in Logを確認しようとしましたが、何も表示がされませんでした。。
そしてログを確認しようとエラー文言のところをダブルクリックをすると、xcode自体が落ちてしまい詳細がわからない状態でした。
[Linker command failed with exit code 1でハマりまくったお話](https://qiita.com/aframeworks-blog/items/db45373e1ccb3c32fae3)

### 「Enable Bitcode」の項目を「YSE」から「NO」に変える
ログの詳細がわからなかったのですが、次に上位に出てきたこちらの記事を参考に対応してみました。
おそらくエラーが出力された原因が違ったのだろうと思うのですが、解決ができませんでした。
> 「PROJECT・TARGETS」の設定画面を開き「PROJECT」>「Build Settings」タブに移動する。「bitcode」と検索したら「Enable Bitcode」の項目を「YSE」から「NO」に変えるだけ！

[【Xcode】エラー「linker command failed with exit code 1」の解決策](https://youtachannel.com/xcode-error-linker-command-failed-with-exit-code-1/)


### DerivedData（中間生成ファイル）の削除
よくわからなかったので最終的にiOSエンジニアの方に聞いてみたところ、DerivedDataディレクトリ以下を削除することで直ることがあるとのこと。

```bash
sudo rm -rf ~/Library/Developer/Xcode/DerivedData/*
```
上記のコマンドを実行後、エラーなくビルドすることができました！

調べると色々と対応している記事がありますが、DevelopersIOさんの[[Xcode][小ネタ] DerivedDataの削除についての備忘録](https://dev.classmethod.jp/smartphone/iphone/remove-xcode-derived-data/)にも
> iOSアプリの開発をしていると、たまにXcodeがおかしくなり、どうにもこうにもよく分からないエラーを吐き出し始めた時、 試しに DerivedData を削除してみるということをよくします。
DerivedData は、プロジェクトごとに生成されるキャッシュデータといいますか、インデックスやログや生成物の等の溜め場といいますか、中間データの類です。 ときにこれが悪さをして不穏な動きをさせてしまっていることもあるようです。

と記載があるので、`linker command failed with exit code 1` のエラーが発生した場合には、一度DerivedDataを削除してみると良さそうです！
[チュートリアル]Alexaスキル開発  Amazon開発者アカウントは必ずamazon.co.jp のアカウント で!!

#チュートリアル

[Alexaスキル開発トレーニングシリーズ](https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill#スキル開発%20基礎トレーニングシリーズ)

#ここだけは注意！
Amazon開発者アカウントは必ずamazon.co.jp のアカウント でログインすること！ ※まず初めに以下を読んでから開発を始めて下さい
[Alexa 開発者アカウント作成時のハマりどころ](https://developer.amazon.com/ja/blogs/alexa/post/9f852a38-3a44-48bd-b78f-22050269d7c7/hamaridokoro)


#チュートリアルから学んだこと

- インテント
  - Alexaスキルで実現したい機能
  - 例: コーヒーを注文する
- サンプル発話
  - ユーザーがAlexaスキルを利用するためのフレーズ
  - 例:“コーヒーをお願い”, “コーヒーをください”, “コーヒーをちょうだい”
- スロット 
  - サンプル発話の中にある用語にバリエーションを持たせる
  - 例: (コーヒーショップのメニュー)
     - コーヒー
     - カフェラテ
     - エスプレッソ
STS+mavenで"Fail to read artifact descriptor for **"

## 環境
- STS4
- windows

## エラー内容
ちゃんとローカルリポジトリにjarあるのにタイトルのエラーが出る。

## 原因
m2リポジトリ内で整合性が取れなくなっている可能性がある。

maven依存関係の更新をオフライン、オンライン併用している(もしくは切り替えた)場合に発生するよう。

## 解決方法
### 一番すっきりする方法
repository配下の全削除。

### jarを削除したくない場合の方法
一時的にオンライン許可されたけどオフラインに戻さないといけない場合、一括削除すると二度とjarが手に入らなくなる。その場合は以下の方法でメタ情報だけ削除する。

1. エクスプローラでリポジトリを開く。
2. 右上の検索欄に「pom.lastupdated」
を入力して検索。
3. 検索結果とSTS上のエラーを比較し、一致するdependencyのlastupdatedファイルのみ削除。

ちなみにこのエラーが出ているとき、「Missing artifact ～」というエラーが関係ないdependencyに対しても出ていたが、上記の操作で解消された。
ABC124 C - Coloring Colorfully (300点)

#問題概要
[問題のリンク](https://atcoder.jp/contests/abc124/tasks/abc124_c)

0か1で構成された長さ$N$の文字列$S$が与えられる。

0を1に変えるあるいは、1を0に変える操作を文字列に加え、0と1が交互に並ぶようにしたい。必要な操作の最小回数は何回か。

#制約条件
- $1≤|S|≤10^5$
- $S_i$ は 0 または 1 である。

#考えたこと
文字列の最終形は0と1が交互に並んでいるものであるため、二通りが想定される。例えば長さ3であれば、$010$か$101$が最終形になる。
よって、この想定される二通りの最終形と初めに与えられる文字列を比較し、異なっている部分の数をそれぞれ数え上げ、小さい方が答えとなる。

なお、実装時の注意点として `string` 型で比較しようとして以下のような実装をすると、TLEする。

```.cs
string s = "";
for(int i = 0; i < n; i ++) {
   if(i%2==0) s += "1";
   else s += "0";
}
```
以下の記事を参照すると `s += "1"` のような+演算子による文字列結合は200000回で2秒以上かかっている。
[文字列処理を高速に行う](https://dobon.net/vb/dotnet/string/stringbuilder.html#performance)

よって +演算子を使って文字列結合をするのではなく、 `char`型の配列を作って比較を行った。この時計算量は$O(N)$となる。

#解答
```c.cs
using System;
using System.Linq;

class Program
{
    static void Main(string[] args) {
        char[] s = Console.ReadLine().ToCharArray();
        Console.WriteLine(solve(s, s.Length));
    }
    static int solve(char[] s, int n) {
        char[] s1 = new char[n];
        char[] s2 = new char[n];
        for(int i = 0; i < n; i ++) {
            if(i%2==0) {
                s1[i] = '1';
                s2[i] = '0';
            }
            else {
                s1[i] = '0';
                s2[i] = '1';
            }
        }
        int count1 = 0;
        int count2 = 0;
        for(int i = 0; i < n; i ++) {
            if(s[i] != s1[i]) count1 ++;
            if(s[i] != s2[i]) count2 ++;
        }
        return Math.Min(count1,count2);
    }
}
```
C#でインスタンスの配列をソートする方法

## C#でインスタンスの配列をソートする方法
C#でインスタンスの配列をソートする方法を調べたので、わかったことをまとめます。

ここでは`Monsters`が、`Monster`クラスのインスタンスの配列だとします。
モンスターのレベルでソートしたい場合は、次のようにソートすることが出来ます。

```C#
Monsters.OrderBy(item => item.level));
```
降順の場合は次のようになります。

```C#
Monsters.OrderByDescending(item => item.level));
```
簡単に書くことが出来ます。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
adonis.jsをつかってみた  #GWアドベントカレンダー 1日目


 #GWアドベントカレンダー[「使いたかったもの使ってみたカレンダー（1人アドベントカレンダー）」](https://gw-advent.9wick.com/calendars/1)の１日目、27日記事です。

ストックが無いままGWを迎えてしまったので、早速ピンチですが、
なんとか頑張っていきたいと思います。


# 本題：adonis.jsをつかってみた

使ってみたアドベントカレンダーなので、どう使ったか、所感として良さそうだったか／微妙だったか　って観点で書いていきたいと思います。構築の仕方とか、そういうのには触れません。

## 何に使ったか

 [GWアドベントカレンダー](https://gw-advent.9wick.com)のシステムを作るのに使いました。

![スクリーンショット 2019-04-26 23.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/9b831676-ee1e-bf6d-2d96-ad94cb57914e.png)


使った機能としては

- 基本機能
 - HTTPルーター
 - コントローラー
 - セッション
 - バリデータ
 - ビュー(Edge)
 - ロガー
 
- セキュリティ
    - 認証
    - CSRF
- データベース
    - ORM
    - マイグレーション
  
- 外部ライブラリ
    - [adonis scheduler](https://www.npmjs.com/package/adonis-scheduler)

## 良さそうなところ/面白かったところ

全体として、MVC全部サポートします！というスタイルはとても良かったです。


**使った機能で良さそうだったところ**

- ORMが入ってるのでモデルをいちいち定義しなくていい
- async/awaitがデフォルトで概念として入っている
- 認証入れるのがかなり楽
- requireの代わりにuseが使えて、プロジェクトルートからのパスでrequireができる
- サービスとしてはよくやる、フォーム入力させてバリデータで弾いたらもとのフォームに戻して、その時入力したデータは引き継いで・・・みたいなのがすごくやりやすい。
- CSRFとか、めんどくさくて忘れがちなところがデフォルトで入っている


**使ってないけど良さそうだったところ**

- mysql, postgresqlだけじゃなくradisも**サポート**
- userモデル作られたら〇〇する　というイベントも**サポート**
- HTTPだけじゃなくてwebsocketもデフォルトで**サポート**（websocket ルーティングができる）
- Twitter認証等のSNSログインも**サポート！**　
- 通常のテストはもちろん、ブラウザテストも**サポート！**
- ファイルストレージもS3とかを**サポート！**


もうほんとに、<font color="red">**これ一つで全部入ってる！！**</font>ってのがすごい売りです。expressインストールして、sequelizeいれて、あ、viewはejsいれてみたいなことがないです。

今回firebase入れてtwitter認証してしまいましたが、それすらもサポートされてるのはもう意表を突かれました。**サポートするはずがないと思いこんでてすみませんでした**


## あんまりイケてないところ

- ドキュメントが読みにくい
[公式サイト](https://adonisjs.com/docs/4.1/)だと使用例が載っていますが、仕様が載ってなくて、どんなコマンド一覧があるの？が全くわかりませんでした

- パーツごとに分割されている
各パーツ(ORMやView,バリデータなど)が結構分割されていて、ドキュメントも詳しくわそっち見てね！になっている。
adonis.js本家のサイトだとほぼ問題が解決できず、そこのリンク先のパーツごとの資料を見る必要がある。でそのパーツも別に他の人が作ってるわけでなくadonisが作ってる

- 日本人で使ってる人を見ない
qiitaとかだと数人が使ってみた程度ですね。なんで日本で人気でないんだろう？

- ジェネレータ
 せっかくMVCオールインワンフレームワークなのに、モデル生成コマンドを使ってもREST APIのコントローラーを自動生成したりしてくれない。railsやfuelPHPとかはしてくれたのに。。。



あとはそれぞれ独立したモジュール(ビュー：Edge、モデル：knex)などはまた別記事で感想書こうと思います。


## 総合評価

とても使いやすいフレームワークでした！
ドキュメントの部分が結構残念でしたが、ユーザー数が増えれば解決する問題なのかなと思います。(本家にも頑張って欲しいですが)
布教活動でもしようかな・・・。


ちなみにExpressとの流行り具合比較はこんな感じ。

![スクリーンショット 2019-04-26 23.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/42ce1865-7e08-dc7e-7cf9-0fa791424d22.png)



うーむ。がんばれ！
PythonからCで書いた関数をctypesで使うためにdllを作成したかったけど苦労した話

#概要
PythonからCで書いた関数を使いたいなと思って調べたところ、今回はctypesというのが便利そうという結論に至ったものの、最初のステップ（dll作成~pythonで読み込み）ではまってしまった時のメモ。

#ctypesする上で参考にしたページ
http://flow-developers.hatenablog.com/entry/2017/12/19/075319

#環境
Windows10 (64bit)
Anaconda 64bit (Python 3.6.4)
#Cygwin
`-gcc -shared hoge.c -o hoge.dll`
で作ったdllファイルを、python側で
`lib=ctype.CDLL("hoge.dll")`
するも、python側ではdllを見つけてくれないエラー。Cygwinはだめもとで試してみたけれど、確かにだめだった。
#MinGW64
dllは見つけてくれるものの
`[WinError 193] %1 is not a valid Win32 application DLL`
というエラー。Pythonは64bitだし、MinGWも64bitだし、なぜ。。ってなってたらmingwのgccが32bitであることが発覚。。。
#Visual Studio 2017
仕方なくVSを使うことに。（x86_x64 Cross Tools Command Prompt for Visual Studio 2017.）

`cl /LD hoge.c`

で難なくdllファイルが生成！
Python側で読み込めるようになった。
めでたしめでたし。
Word操作 備忘録

学祭パンフだったりプロコンパンフだったりのための備忘録．
メモったほうがいいなっておもったやつを随時更新するスタイル．

# 目次
+ 表の位置
+ 文の間隔の操作
+ 同じ位置にオブジェクトを配置する


# 表の位置
表の位置の操作は以下のようにして行える．

1. 位置を操作したい表を右クリック
2. 表のプロパティを表示
3. "表"タブの"文字列の折返し"の下にある「位置」ボタンをクリック
4. テキトーに弄る

<font color="LightGray">(2019/04/26追加)</font>


# 文の間隔の操作
ページ内に文章が収まらない時に超ホプするテクニック．

1. Wordウィンドウのホームタブを開く
2. "段落"のツールボックスの右下に小さくある矢印をクリックして段落ウィンドウを開く
3. 間隔の行間の値を"固定値"にしてあとは適当なptに調節する

<font color="LightGray">(2019/04/26追加)</font>

# 同じ位置にオブジェクトを配置する
これ前のページとおんなじ場所におきたいんよなってときは，たいていコピーアンドペーストでうまくいく． 
ちなみにコピーは Ctrl + C, ペーストは Ctrl + V でできる．
テキストボックスとか画像，図形とかは配置を修正したいオブジェクトを選択して出てくる書式タブから「配置」ボタンを押すか，プルダウンメニューから中央揃えとかするといい． 
表は"表の位置"の手順で頑張るかコピペしかない．

<font color="LightGray">(2019/04/26追加)</font>
OMNeT++のインストール方法(mac)

とある論文を読んでいていて、自分も使いたいって思ってインストールしてみた。
記事にしたのはmacOSにインストールする方法ですが、Linuxに入れたときでも基本変わらな買ったと思います(Windowsはわからないです)。

ダウンロード:(LINUX,WINDOWS,MACOSを選べる)
https://omnetpp.org/software/2018/06/29/omnet-5-4-1-released

公式ドキュメント
https://omnetpp.org/documentation/

#インストール方法
公式ドキュメントの一覧から*Install Guide (pdf)*を選択
Chapter3 からがmacOSへの導入方法(macOS 10.12を対象にしているが、導入環境は10.14.3)

OMNeT++ではシミュレーションをC++で書かくけどJavaのランタイムとかを入れる必要があるらしい(OMNeT++自体はechlipsが元になっているからだと思う)
指示通りJavaRuntimeとJava Runtime Environmentをインストール
またコマンドラインツールもアップルの公式サイトから手に入れた

次にデバッグのためにgdbをbrew installする必要がある(mac以外では普通にapt installだった気がする)
ちょっと面倒くさいけど署名も設定しなければならないみたい　
macなら「lunchpad -> その他 -> キーチェーンアクセス」そして、メニューバーから「キーチェーンアクセス-> 証明書アシスタント ->　証明書作成」を選択

<img width="728" alt="スクリーンショット 2019-04-26 22.16.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/3f408d98-d3e0-4b55-9402-55a62ee9d62b.png">

こんな感じで入力してあとはひたすら「続ける」を連打する(途中はの入力は無視していいの？)

証明書が保存できたらキーチェーンアクセスは閉じてターミナルを起動し以下のコマンドを実行(gdb-certの部分は自分で入力した内容によっては変えてください)

```
$sudo codesign -s gdb-cert /usr/local/bin/gdb
```

下準備が終わったのでいよいよOMNeT++本体をダウンロード
好きなディレクトリでで以下のコマンドを実行(もち、ダウンロードしたファイルも同じディレクトリで)

```
$tar zxvf omnetpp-5.4.1-src-macosx.tgz
```

ここからは環境設定(**毎回この手の環境設定ではPATHを通すけど、実は意味がわかってない.教えて強い人！！**)
以下のコマンドをつらつらと打っていく

```
$ cd omnetpp-5.4.1
$ . setenv
$ touch ~/.bashrc
$ open -e ~/.bashrc
```

.bashcrファイルに次の二行を追加(個人的な感想だけどbash_profileに書き込んでもいいじゃないの？　私はそうしてます)

```bash:.bashrc
export PATH=\$HOME/omnetpp-5.4.1/bin:\$HOME/omnetpp-5.4.1/tools/macosx/bin:\$PATH
export QT_PLUGIN_PATH=\$HOME/omnetpp-5.4.1/tools/macosx/plugins
```

ちなみにこれ、解凍した場所によっては$HOME/*解凍した場所*/omnetpp-X.X.Xにする必要がある。


今度は設定をいじる必要があるみたい
configureスクリプトがインストールされているソフトウェアとシステムの設定を検出してくれるみたい。
結果はMakefile.incファイルに自動で書き込まれる

```
$ ./configure
```

スクリプトが走り終わったら最後にビルドするみたい(今更makeコマンドの意味を知ったけど、CやC++で書かれたプログラムをMakefileの設定通りにコンパイルしてくれる賢い子みたい.三流以下のエンジニア並の知識しかねえ)

```
$ make
```

#サンプル実行

結構長いビルドが終わったら今度はサンプルを動かしてみてってことらしい

```
$ cd samples/aloha
$ ./aloha
```

こんな感じで動いた！(名前的に昔のアロハ通信かな？)
![スクリーンショット 2019-04-26 23.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/025dcb2e-e44a-0eac-b5a7-ecb887df727f.png)


最後はIDEをコマンドで開いて起動することを確認
OMNeT++はEclipse(Javaで書かれているIDE)をベースにしたSimulationIDEみたいで、最初の方でJava RuntimeをインストールしたのはこのIDEを動かすためなのかなぁ

```
$ omnetpp
```

ここで詰んだ,エラー吐いてIDEが起動しない
この記事を見る限り、OMNet++はjava9以上だと相性が悪いのかも
https://stackoverflow.com/questions/47039187/omnet-5-2-mac-installation-error

```
sudo rm -rf /Library/Java/JavaVirtualMachines/*****
```

で最新のJava環境を消してJava8(java10でも可？)にしたらIDEが動いた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/3e7170c8-8ed2-b3bb-3a71-2820b50e2a1b.png)


Workspaceを選べと言われる(デフォルトではsampleが指定されてるはず)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/cd772fe2-ff89-69c5-af81-cd886376cc4a.png)

多分こんな画面を開くことができたらいいみたい。

次回からはチュートリアルをやってみます。

2019/05/14　加筆
どうもOMNeT++はMacとは相性が悪いらしく、gdbデバックがあんまりうまくできない
Rails6 のちょい足しな新機能を試す8（index_with 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第8段。 今回のちょい足し機能は、 `index_with` 編です。
配列などの各要素をキーとするHashを生成します。 `index_by` の逆バージョンみたいなメソッドです。
Rubyの標準ライブラリ `Enumerable` にちょい足しされます。

記載時点では、Rails は 6.0.0.rc1 です。　`gem install rails --prerelease` でインストールできます。

```bash
$ rails --version
Rails 6.0.0.rc1
```

# irb を実行する

rails プロジェクトを作らなくても試せるので、試してみましょう。

```ruby
$ irb -ractive_support/core_ext
```

# `Enumerable#index_with{...}`

ブロックを指定して呼び出すと、各要素をキーとして、ブロックを評価した結果を値とするHashを生成します。

```ruby
irb(main):001:0> %w[a b].index_with{|e| e.upcase}
=> {"a"=>"A", "b"=>"B"
```

# `Enumerable#index_with(xxx)`

引数を指定して呼び出すと、引数を値とするHashを生成します。

```ruby
irb(main):002:0> %w[a b].index_with('')
=> {"a"=>"", "b"=>""}
```

# ブロックと引数を同時に指定したら？

ブロックと引数を同時に指定するとブロックが優先されます。

```ruby
irb(main):003:0> %w[a b].index_with(''){|e| e.upcase}
=> {"a"=>"A", "b"=>"B"}
```

# `index_by` との比較

`index_with` と `index_by` を比較してみると

- `index_with` は各要素をキーとしてブロックの評価結果（または引数）を値とするHashを作る。
- `index_by` はブロックの評価結果をキーとして各要素を値とするHashを作る。

と逆バージョンのような関係にあります。

```ruby
irb(main):004:0> %w[a b].index_with{|e| e.upcase}
=> {"a"=>"A", "b"=>"B"}
irb(main):005:0> %w[a b].index_by{|e| e.upcase}
=> {"A"=>"a", "B"=>"b"}
```

# 参考情報
* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add Enumerable#index_with](https://github.com/rails/rails/pull/32523)
Python3で簡易的なプレイリストを作る


基本的に自分用のメモとして作成。

引数続きPythonの勉強中。
（前回→[Python3でキッチンタイマを作る](https://qiita.com/Rxxx/items/2641e8914753ad76cf43)）

再び旦那に課題を求めたらプレイリスト作ってみてとのこと。
色々機能を付けると難しいのでとりあえず簡単なものを作成。
<br>


今回初めてmutagenモジュールを使用。
インストールはこれでできた。

```
pip install mutagen
```


以下が作成したコード。

```python:PlayList_easy.py
#定数
SONG_LIST = ("僕らのLIVE 君とのLIFE",
             "友情ノーチェンジ",
             "Snow halation",
             "baby maybe 恋のボタン",
             "Love marginal",
             "sweet & sweet holiday",
             "ダイヤモンドプリンセスの憂鬱",
             "ラブノベルス",
             "知らないLove_教えてLove",
             "あ・の・ね・が・ん・ば・れ!",
             "夏色えがおで1, 2, Jump!",
             "Mermaid festa vol. 1",
             "もぎゅっとloveで接近中!",
             "愛してるばんざーい!")

#ユーザー作成のプレイリスト		 
PlayList = []


#曲リスト表示
def PrintSongList():
	for i in range(len(SONG_LIST)):
		print(str(i)+" : "+SONG_LIST[i]) 
		
#プレイリストに入れるか確認
def CheckIntoPlayList(num):
	if 0 <= num <= (len(SONG_LIST) - 1):
		PlayList.append(num)	

	
#音再生処理
def Sound(num):
	song_name = "SongList/" + SONG_LIST[num] + ".mp3"
	pygame.mixer.init() #初期化
	pygame.mixer.music.load(song_name) #読み込み
	song_time = MP3(song_name).info.length #曲の長さ取得
	pygame.mixer.music.play(1) #引数を1にすると1回のみ再生
	time.sleep(song_time) #曲の長さ分待機
	pygame.mixer.music.stop() #終了	
	
#プレイリストの曲を再生する
def PlaySong():
	for i in range(len(PlayList)):
		Sound(PlayList[i])


#曲名表示
print("曲番号を流したい順に入力してください。")
print("曲選択が終了すれば「Z」を入力してください。")
PrintSongList()

#プレイリスト作成
song = ""
error_cnt = 0
while not song == "z":
	song = input()
	if song.isdecimal() == True:
		CheckIntoPlayList(int(song))
	error_cnt = error_cnt + 1
	if error_cnt > 10:
		exit()
		
print("この曲リストを再生します")
print(PlayList)
		
PlaySong()
```

JASRAC曰く曲名に著作権はないようなので実際使ってた曲名リストそのままです。。。
実行したらこんな感じ。


```
pygame 1.9.5
Hello from the pygame community. https://www.pygame.org/contribute.html
曲番号を流したい順に入力してください。
曲選択が終了すれば「Z」を入力してください。
0 : 僕らのLIVE 君とのLIFE
1 : 友情ノーチェンジ
2 : Snow halation
3 : baby maybe 恋のボタン
4 : Love marginal
5 : sweet & sweet holiday
6 : ダイヤモンドプリンセスの憂鬱
7 : ラブノベルス
8 : 知らないLove_教えてLove
9 : あ・の・ね・が・ん・ば・れ!
10 : 夏色えがおで1, 2, Jump!
11 : Mermaid festa vol. 1
12 : もぎゅっとloveで接近中!
13 : 愛してるばんざーい!
```

ここで連続再生したい曲に該当する番号を流したい曲順にタイプする。
今回は「0、s、15、13、13」と順番に入力。
入力が確定すれば「z」を入力。

```
0
s
15
13
13
z
この曲リストを再生します
[0, 13, 13]
```

文字や範囲外の数値は無視されて、入力可能な数値がPlayList配列に順に格納される。

これで
僕らのLIVE 君とのLIFE→愛してるばんざーい!→愛してるばんざーい!
と順番に再生することができた。


<br>
曲を流してる間は曲の再生時間分time.sleepで待っているという仕組み。
（バグ回避のためには曲の再生時間＋α待ったほうがいいかも）


今後は停止ボタンとかつけてみる予定なので、そのときにもっとスマートな造りにできないか検討してみます。