OmniAICreator/Qiita-1.07M huggingface dataset:
seleniumで「Message: session not created: This version of ChromeDriver only supports Chrome version 75」のエラーが表示される場合の対処法

こんにちは。
久々にSeleniumで作ったツールを実行したところ、以下の様なエラーが表示されて少し困ったのでメモです。
最近Selenum関連のモジュールをアップデートした方やインストールした方が主に対象になりそうです。

```
Message: session not created: This version of ChromeDriver only supports Chrome version 75
```

# 利用時の環境
OS: Windows 10
Python: 3.7.0
Selenium: 3.141.0
chromedriver: 2.24.1
chromedriver_binary: 75.0.3770.8

# 原因
`chromedriver-binary`をLatestバージョンでインストールすると
まだベータ版のみしか提供されていない`Chrome 75`向けの`75.0.3770.8`になっていたことにより
バージョンが一致しないことが原因のようです。
`chromedriver-binary`はそれぞれのバージョンごとに提供しているようなので、
メジャーバージョンが一致しないと動作してくれないようです。

# 解決策
Chrome 74を利用している人は、chromedriver-binaryのバージョンを`74.0.3729.6.0`にダウングレードする必要があります。
もしくは残り20日程度(記事作成時点)で安定版がリリースされるみたいなので、そこまで待ってChromeのバージョンを上げるのも解決策の1つかと思います。
後で詳しく手順を記載しますので、これだけで理解できる方は以降は蛇足話です。

## Chromeのバージョンを確認する
chrome://settings/helpをクリックするかもしくは、右上にある丸が3つ縦に並んでいるボタンを押下して、
[ヘルプ(H)] > [Google Chrome について(G)]を押下して確認して下さい。
`75.x.x.x`となってる人はChrome 75です。(偶然このバージョンの方はいないはずですが。ベータ版なので。)
`74.x.x.x`となってる人はChrome 74です。
`73.x.x.x`となってる人はChrome 73です。

## chromedriver-binaryのバージョンを確認します。
下記のコマンドを実行します。

```
pip show chromedriver-binary
```

実行すると以下の情報が表示され、`Version`の項目を確認します。

```
Name: chromedriver-binary
Version: 75.0.3770.8
Summary: Installer for chromedriver.
Home-page: https://github.com/danielkaiser/python-chromedriver-binary
Author: Daniel Kaiser
Author-email: daniel.kaiser94@gmail.com
License: MIT
Location: c:\\{インストールされている場所が記載されています}
Requires:
Required-by:
```

①と②の手順で確認したメジャーバージョンを見比べると一致していないことが確認できると思います。

## chromedriver-binaryのバージョンをあわせる。
`chromedriver-binary`をPythonのパッケージを検索できるサイトでhttps://pypi.org/project/chromedriver-binary/-binary/)

単純に表示してLatestバージョンですとChrome 75向けのパッケージが入ってしまいますので、
① サイドバーにある`Release history`をクリック
② `74.0.3729.6.0`をクリック
③ 上部にあるインストールコマンドをコピー
④ ターミナルやコマンドプロンプトを開いて貼り付けて実行

## もう一度chromedriver-binaryのバージョンを確認します。
以下のようにバージョンが75から74に変わり、ダウングレードできました。

```
Name: chromedriver-binary
Version: 74.0.3729.6.0
Summary: Installer for chromedrihttps://github.com/danielkaiser/python-chromedriver-binaryomedriver-binary
Author: Daniel Kaiser
Author-email: daniel.kaiser94@gmail.com
License: MIT
Location: {インストールされている場所のパス}
Requires:
Required-by:
```

## Chrome 75はいつ出るの？
https://www.chromestatus.com/features/scheduleus.com/features/schedule

`Stable in 20 days ( Jun 4 )`の記載から2019年6月4日みたいですね。

誤記などございましたら、コメントでご指摘頂けると幸いです。
Elastic SearchでString型のカラムが取り込めないエラー

**環境**
- Rails 5.2.1
- Ruby 2.6.1
- Elastic Search 6.3.2

ElasticSearchに企業マスタデータを取り込むため設定

```
module MstCompanySearchable
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model

    # インデックスするフィールドの一覧
    INDEX_FIELDS = %w(name).freeze

    # インデックス名
    index_name "es_mst_company_#{Rails.env}"

    # マッピング情報
    settings do
      mapping dynamic: 'false' do # 動的にマッピングを生成しない
        indexes :name, analyzer: 'kuromoji', type: 'string'
      end
    end

    # インデックスするデータを生成
    # @return [Hash]
    def as_indexed_json(option = {})
      as_json.select {|k, _| INDEX_FIELDS.include?(k)}
    end
  end

  module ClassMethods
    def create_index!(options={})
      client = __elasticsearch__.client
      client.indices.delete index: index_name rescue nil if options[:force]
      client.indices.create(index: index_name,
                            body: {
                                settings: settings.to_hash,
                                mappings: mappings.to_hash
                            })
    end
  end
end
```

`create_index!`を実行するとエラーが発生
```
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"No handler for type [string] declared on field [name]"}]
```
ElasticSearch６系からはkeywordもしくはTextを使うらしい
参照: https://www.elastic.co/jp/blog/strings-are-dead-long-live-strings

`indexes :name, analyzer: 'kuromoji', type: 'string'`を`indexes :name, analyzer: 'kuromoji', type: 'text'`に変更してあげると解決
WordPressで記事コンテンツ内のURLを一括変換するブックマークレットを作った

# キッカケは個人ブログのドメイン変更
きっかけは個人で大学時代からほそぼそと経営している個人ブログのURLを変更した時だった。
http→https対応も行い、いざ自分のブログを開いてみるとChromeから警告がいくつか出ている。

## お前のブログhttpsなのにhttpのコンテンツ入ってるよ
なるほど、DBから取る画像ファイルは特段問題なく表示はされているが、ブラウザから警告が出る。
動くには動くが、古いIEだと警告のポップアップが出るとか、出ないとか。
自分はmacを使っているから特に何も感じなかったが、コレじゃブログとしていかがなものかと思い、あれこれ考えた。
原因は画像ファイルが古いブログURLのままであることまではわかった。
DBは変わっていないので、記事内のコンテンツに問題があるわけだ。

### 参考記事
[SSL対応でhttpとhttpsが混在したコンテンツが表示できない原因を特定する | FeeeeeLog](https://feel-log.net/seo/ssl-notice-http-https/)

## 対応方法
とりあえず、ブログの全記事を舐めて全記事の特定のURLだけを変更する、というのが一番の根本解決になるが、ものによってはほっとんど誰も読まない記事があるし、まずそのスクリプトを書くのが面倒くさい。
最初はphpで頑張ろうかと思ったが、とりあえず、アクセスの多い記事から順に対応していくことにした。

そこで作ったのがWordPressの管理画面で記事内のURLを一括変換する簡単なブックマークレットをつくった。

まともに役に立つブックマークレット、そういえば作ったことないな、と思いググって下記のものができた。

### 下記が成果物

```JavaScript:wpPostContentReplaceBookmarklet.js
/**
* bookmarklet
*
* compressor:http://refresh-sf.com/
* javascript:!function(){var e="https://wandering-engineer.tech",n=document.getElementById("content"),t=n.value,l=t.replace(/http\:\/\/*******\.***\.jp/g,e);}();
*/
(function(){
  var replaceString = "https://wandering-engineer.tech";// ブログの新URL
  var wpContent = document.getElementById('content');// 記事エリアオブジェクト
  var contentStr = wpContent.value;// 記事エリア文字列取得
  var replacedContent = contentStr.replace(/http\:\/\/*******\.***\.jp/g, replaceString); //旧URLを取得して置換
  wpContent.value = replacedContent;
})();
```

#### 上記を圧縮の上、ブックマークに追加

- [http://refresh-sf.com/](http://refresh-sf.com/)

使う場合は各々URLを編集して、上記にて、圧縮をかけます。そしたらChromeでブックマークを追加し、URLに圧縮されたJavaScriptを入れて適当な名前をつけて保存。(このcompressor,httpだぞ...)

![スクリーンショット 2019-05-17 14.29.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13595/5257ddab-c853-1df7-ed1c-8c345642fdb5.png)
上記はGoogleChromeの例です。
動作確認はGoogleChromeでのみ確認。

## githubにアップしておきました。

- [github.com/shotakeu/wpPostContentReplaceBookmarklet](https://github.com/shotakeu/wpPostContentReplaceBookmarklet)

## 詳しい使い方はこちら

- [WordPressの記事内に貼ったURLを一括置換するブックマークレットを作った | takelab.note](https://wandering-engineer.tech/2018/03/01/change-url-in-post-contents/)

自分のブログです。
最近Qiitaに記事上げてなかったので、適当にあげてみました。
被りがあったらごめんなさい。
Day009 webエンジニアへの道 - rails tutorial 第4章、第5章を完了 -

こんにちは。
webエンジニアを目指す[tomo](https://twitter.com/tomo_tech_)です。

プログラミングの勉強をしている日々の学びを記録しています。更新開いてしまいましたが...笑

私自身の頭の整理と今後迷った時のリファレンスも兼ねて書き連ねていきますが、同じようにエンジニアを目指している方の参考にもなればと考えています。
また、「ここ間違ってる！こっちが正しい！」といったご指摘もあれば頂けると嬉しいです🙏

#Day009のまとめ

*今日の気づき & 今後調べることなど

###turbolinksについて

今の自分にはちょっと内容が高度なので、勉強を進めてから学び直す。

[参考]
[Turbolinks Classic is now deprecated](https://github.com/turbolinks/turbolinks-classic)
[turbolinksチートシート](https://qiita.com/morrr/items/54f4be21032a45fd4fe9)

###curlコマンド

```
$ curl -o app/assets/images/rails.png -OL railstutorial.jp/rails.png
```

`-o [file]`　ファイルに出力
`-O`　取得したデータを標準出力ではなくファイルに出力する
`-L`　要求したページにリダイレクトが掛かっていた場合に追従する


###rails generateコマンド時のエラーについて

rails generateコマンド時に以下のエラーが発生。

```commandline:
$ rails g controller Users newTraceback (most recent call last):
        4: from /home/ec2-user/.rvm/gems/ruby-2.6.0/bin/ruby_executable_hooks:24:in `<main>'
        3: from /home/ec2-user/.rvm/gems/ruby-2.6.0/bin/ruby_executable_hooks:24:in `eval'
        2: from /home/ec2-user/.rvm/gems/ruby-2.6.0/bin/rails:23:in `<main>'
        1: from /home/ec2-user/.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/home/ec2-user/.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': can't find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException)
```

gemがうまく動作していない（？）ようなので以下コマンドでbundlerを更新したところ、問題なく`rails generate`コマンドが動作するようになる。

```commandline:
$ gem install bundler
$ bundle install
```

###DB Browser for SQLiteのインストール

見やすい形でデータベースを閲覧できるアプリケーションのインストール
[DB Browser for SQLite --download](https://sqlitebrowser.org/dl/)

```commandline:
$ brew cask install db-browser-for-sqlite
```

##今日のひとこと

データベースを扱いはじめて少しづつ理解が難しくなってきましたが、1周目なので気負わずにどんどん進めて行きたいと思います。

---

twitterもやっているので、宜しければフォローお願いします！
[@tomo_tech_](https://twitter.com/tomo_tech_)
three.js(r104)でシェーダーエラーのログが出ない！！

# 概要
three.js(r104)から`THREE.WebGLRenderer.debug.checkShaderErrors`というプロパティが追加され、デフォルトが`false`に設定されているためシェーダーのコンパイルエラーのログが出なくなりました。

変なシェーダー書いてもWebGLからのwarningしか出ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280075/8e3f7edb-62b5-f4fa-8b47-bc0785a80e36.png)

# エラーが見たい！
`THREE.WebGLRenderer.debug.checkShaderErrors`を`true`にするだけです。

```javascript
let renderer = new THREE.WebGLRenderer({
    canvas: document.getElementById('canvas')
});

this.renderer.debug.checkShaderErrors = true;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280075/a3f213cd-c133-50d3-6762-fb28e9d1d697.png)

でました。
javaのバーションの切り替え（備忘録）

#この記事を書いた経緯
学校のプログラムが僕のmacに入っているjava10に対応していなかったのでjava8と切り替えられるようにしたかったからです。
また、java8はライセンスの関係で使用できないようです。


#java10
```
$ export JAVA_HOME=`/usr/libexec/java_home -v "10"`
$ PATH=${JAVA_HOME}/bin:${PATH}
```

#java8(AdoptOpenJDK8)
```
$ export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
$ PATH=${JAVA_HOME}/bin:${PATH}
```

#homebrew-cask-versionのインストール
```
$ brew tap homebrew/cask-versions
```

#AdoptOpenJDK8のインストール
```
$ brew cask install adoptopenjdk8
```

#参考
[MacのBrewで複数バージョンのJavaを利用する](https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2)
grepのオプション表

|オプション|説明|
|:---|:---|
|-c|マッチした行数を表示　※count?|
|-h|ファイル名を表示しない　※hide?|
|-i|大文字小文字を区別しない　※case insensitive?|
|-l|マッチした行を持つファイル名だけを表示　※ list?|
|-v|マッチしない行を表示|
|-w|\<と\で囲まれた語を正規表現とみなして検索|
ゼロから始めるPHP ～MacOS XでLaravel5.7開発環境構築～

前回はhomebrewを使ってPHPの環境構築を行いました。
今回はLaravel5.7の環境構築方法です。

<H2>Laravelの開発環境を構築</H2>
HTML/CSSでwebサイトを作っているときに「BootStrap」というFWの存在を知りました。
PHPでもいずれFWを使うようになるだろうと思って、**Laravel**を使おうと決めました。
LaravelはPHPフレームワークの中で今、最も勢いのあるフレームワークです。

homebrewを使って「Composer・Laravel5.7」をインストールしました。
Composerインストール参考URL：
[ComposerをHomebrewでMac OSに導入する方法(@sitmk 様)]()

Laravelインストール参考URL：
[macOSに Laravel 5.6 をインストールする手順をまとめてみる(@igz0 様)](https://qiita.com/igz0/items/bd5ab0aedc75d8476c76)
[mac Laravel環境構築(@homhom99 様)]
(https://qiita.com/homhom99/items/38bc4e4a02a66acead91)
[Mac OSにLaravel 5.7を導入する方法(@sitmk 様)](https://qiita.com/sitmk/items/a62637a6aa173cbb8b09)

<H2>Laravelで開発環境を構築するフロー</H2>
Laravelの開発環境構築に必要なものを再度まとめておきます。
ターミナル・PHP7・Apache・homebrew・データベース(MySQL/PostageSQLなど)


<h3>Composerのインストール</H3>
＊MacOSのターミナルを使用します。

①homebrewを使ってComposerをインストール

```
$ brew install composer
```
②Composerのインストールの確認

```
$ composer -v
```
③インストール成功画面（画面一部のみ表示しています）

 ```______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
```

<h3>Laravelのインストール</H3>
先ほどインストールしたComposerを利用します。
＊MacOSのターミナルを使用します。

①Laravelのインストール

```
$ composer global require "laravel/installer"
```
②LaravelのPASSを通す

```
export PATH="$PATH:~/.composer/vendor/bin"
source ~/.bash_profile
```
③Laravelのパスの確認

```
laravel -v
```
ここまでで、インストールは完了です！

<h3>Laravelのプロジェクト作成からホーム画面表示まで</h3>
インストールが完了してもホーム画面にたどり着くまで安心できません。
もう少し頑張りましょう！

①プロジェクトの作成（プロジェクト名は sample とします）

```
$ laravel new sample
```
②cd（チェンジディレクトリ）コマンドでsampleへ移動

```
$　cd sample
```
③laravelの起動(php artisan serve)

```
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```
④ブラウザのURLバーに http://127.0.0.1:8000 を打ち込む
白い背景にグレーの文字で「Laravel」と表示されていればOKです。
<img width="680" alt="laravelstart.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418206/81dd4131-2651-73e1-347c-7591d6079a76.png">



<h2>まとめ</h2>
今回はターミナル＆homebrewでComposerとLaravelをインストールしました。
Composerはパッケージ管理ツールでPHP関連のファイルを一括管理してくれます。

このボリュームは結構しんどいです。開発環境が整ったら一旦よしとしましょう！
お疲れ様でした！
Vagrant(Ubuntu) + Docker + Djangoで開発用サーバ起動までいく

## 起こった問題

[Djangoの開発環境をDockerで作ってみた](https://qiita.com/homines22/items/2730d26e932554b6fb58)

ここを参考に環境構築していたら詰まったので、補足の記事を作りました。


## 私の環境
- windows10 Home
- Vagrant + Ubuntu
- Docker CE
- python3
- Django 2.2

## 原因と解決方法
[Djangoの開発環境をDockerで作ってみた](https://qiita.com/homines22/items/2730d26e932554b6fb58)

最後の「開発用サーバ起動」までは、こちらの記事のとおりに進めることができました。
最後の最後、開発用サーバ起動の手順

```
docker exec test python3 manage.py runserver 0.0.0.0:8000
```

このあとでブラウザから`localhost:8000`にアクセスすると失敗します。

####原因１：Vagrantfileのguestポートとhostポートの設定がおかしい

```
config.vm.network "forwarded_port", guest: 8000, host: 12345
```

host側（Windows）で12345のポートを使って、guest側（ubunts）の8000につなぐ、ってことだと思います。なので、ブラウザからアクセスするときの **ポート指定は12345** にする必要があります。

####原因２：コンテナ起動時に指定するポートと、WEBサーバ起動時に指定するポートが一致してない

元記事ではこのようにしてコンテナを起動しています。

```
$ docker run -itd -p 127.0.0.1:8000:8000 -v /path/to/src:/code --name test django
```

このときの`-p 127.0.0.1:8000:8000`は、ubuntu側のポート8000とコンテナ側のポート8000をつなぐよ、ってことだと思います。

さきほどの原因１のところで、Vagrantfile内で**guest側（Ubunts）は8000を使うよ**と設定したので、コンテナ起動時の指定にも**Ubuntuは8000を使うよ**とする必要があります。

また、元記事ではこのようにして、Django付属のWEBサーバを起動しています。

```
$ docker exec test python3 manage.py runserver 0.0.0.0:8000
```

上で、コンテナ起動時に**コンテナ側は8000を使うよ**と指定したので、コンテナ側でDjangoのWEBサーバが使うのは8000である必要があります。

図にするとたぶんこういう感じです。

<img width="589" alt="ポートの説明図.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/69002f74-f32d-24bc-254b-c3ced3250665.png">


## アクセスを確認

``` 
http://localhost:12345 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/dd46b7c3-45c6-1d57-d635-99ca85981acb.png)


以上です。ぐったり。
Global変数でレイアウトを管理する時の注意点

#なぜGlobal変数
scrollViewに配置するそれぞれのViewをカスタムクラスとして保持していたため、それぞれのクラス間での変数の値を統一したいから。その際の注意点として、scrollViewにLabelなどを配置し、非同期処理によって文字列をaddする場合などにLabelの高さをそれぞれのクラスで更新することが必要。
#どう使う
これを

```swift:Global.swift
var labelHeight: CGFloat = 0

class ViewController: UIViewController {
    var label: UILabel!
    var profileLabelHeight: CGFloat = labelHeight

    override func viewDidLoad() {
        super.viewDidLoad() 
        setup()           
    }
    func setup() {
        //global変数が更新された時に値が変わらない
        label = UILabel()
        label.frame.size.height = profileLabelHeight  
    }
}
```

こう

```swift:Global.swift
var labelHeight: CGFloat = 0

class ViewController: UIViewController {
    var label: UILabel!
    var profileLabelHeight: CGFloat { 
        //呼ばれるとprofileLabelHeightを更新する
        return labelHeight
    }
    override func viewDidLoad() {
        super.viewDidLoad() 
        setup()           
    }
    func setup() {
        label = UILabel()
        label.frame.size.height = profileLabelHeight  
    }
}
```
終わり
Flutter Android arcore_plugin

## はじめに
FlutterでARやりたかったのでflutter arcore pluginを試してみた手順を書く
https://github.com/khalithartmann/flutter_arcore_plugin
一応アプリ起動したけどちょっと問題が残ってる気がするので後で調べる

## arcore_pluginインストール
### pubspec.yamlに追記
```yaml
dependencies:

  # ARCore 
  arcore_plugin: ^0.1.3
```

### flutter packages get
```
Android Studioでプロジェクトツリーを右クリックかツールから Flutter -> Flutter package get
```


## Android SDKバージョン設定変更
### android/app/build.gradleを編集
```gradle
compileSdkVersion 28
minSdkVersion 24 
```
compileSdkVersionはもともと28だった


## Sample App
```
https://raw.githubusercontent.com/khalithartmann/flutter_arcore_plugin/master/arcore_plugin/example/lib/main.dart
```
これを参考にサンプルアプリを作る
丸っと置き換えたほうが早いかも

### lib/main.dart
```
コピペ
```

### assest
```
assetsをDLしてきて同じPathに配置
```

### gradle.properties
これを追加

```
android.useAndroidX=true
android.enableJetifier=true
```

### pubspec.yaml
これを追加

```
  assets:
    - assets/image_database.imgdb
```

## ADV設定
```
Pixel3 Pie x86_64 Google API で新しく作成
```

## エミュレータ用のARCore APKをインストール
```
https://github.com/google-ar/arcore-android-sdk/releases/tag/v1.8.0
ARCore_1.8.0.x86_for_emulator.apk
をDLしてエミュレータにドラッグアンドドロップ
```

## アプリ起動
```
Android Studioから起動
```
![7DAA7AAA-86FC-40C2-8454-BF673F30FF2C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507/09a474f9-66bb-54e2-e999-637ed8aa73d6.png)


一応起動したけど動かせないような？
51歳からのプログラム　備忘録　A facade root has not been set

１行コード書いて、エラーと格闘。
でも楽しくてやめられない。
時間が掛かりすぎているけれど、楽しいから、まいっか。

色々いじっていたら
`A facade root has not been set`
というエラーが出た。

Facade.php:234が呼び出されたよう。
Handler.php:397

ヘルパーの397行目を参照すると

```php:
$paths=collect(config('view.paths'));
View::replaceNamespace('errors',$paths->map(function($path))
```

configのpaths配列を操作するコレクションインスタンスを生成してエラーチェックしてるよう。

そういえば、config以下に設置した、プログラムで必要な配列を纏め書きしたファイルをいじってたっけ。

でも、エラー内容が正確に分からないので、とりあえず、commandで、
`php artisan serve`
としてみたら

```comand:
laravel>php artisan serve

In param.php line 34:
  syntax error, unexpected ',',expecting ']'
```
と返ってきた。
やっぱり配列を整理して記載したファイル（laravel/config/param.php）の34行目が犯人！
配列の書式を正しく直しておしまい。

またやりそうなので、備忘です。
exeに直接「管理者としてこのプログラムを実行する」を有効化すると右クリックメニューで選択したときにエラーになる

環境はWindows10 proになります。

![exeに直接管理者としてこのプログラムを実行するをつける.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/dde26a9a-47df-4987-d02d-1ccf4c9fc6be.png)


![右クリックから開くとエラー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/7accd874-20d2-6761-f0f7-46e290735e2d.png)
blueqatで量子ゲート その5

#概要

blueqatで量子ゲートやってみた。
3bit加算器作ってみた。

#3bit加算器


![3bit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7aa310d4-30c3-36c4-38e6-b92fea78de26.jpeg)



#サンプルコード

```
c0 = Circuit(18).h[0 : 3].h[3 : 6].cx[2, 17].cx[5, 17].ccx[2, 5, 6].cx[1, 7].cx[4, 7].ccx[1, 4, 8].cx[6, 16].cx[7, 16].ccx[6, 7, 9].ccx[9, 8, 10].cx[9, 10].cx[8, 10].cx[0, 11].cx[3, 11].ccx[0, 3, 12].cx[10, 15].cx[11, 15].ccx[10, 11, 13].ccx[13, 12, 14].cx[13, 14].cx[12, 14].m[:].run(shots = 100)
for cnt in c0:
  print("{} + {} = {}".format(int(cnt[0 : 3], 2), int(cnt[3 : 6], 2), int(cnt[14 : 18], 2)))

```

#結果

```
1 + 7 = 8
0 + 7 = 7
1 + 5 = 6
0 + 0 = 0
1 + 4 = 5
5 + 5 = 10
5 + 7 = 12
5 + 0 = 5
0 + 6 = 6
6 + 6 = 12
4 + 0 = 4
5 + 4 = 9
2 + 2 = 4
2 + 1 = 3
2 + 6 = 8
6 + 3 = 9
7 + 2 = 9
2 + 0 = 2
0 + 4 = 4
4 + 5 = 9
3 + 7 = 10
1 + 3 = 4
2 + 5 = 7
4 + 2 = 6
0 + 3 = 3
3 + 4 = 7
7 + 1 = 8
7 + 4 = 11
5 + 2 = 7
2 + 7 = 9
0 + 5 = 5
1 + 0 = 1
4 + 4 = 8
6 + 0 = 6
0 + 1 = 1
6 + 1 = 7
7 + 7 = 14
3 + 6 = 9
4 + 3 = 7
6 + 4 = 10
2 + 3 = 5
5 + 3 = 8
7 + 6 = 13
3 + 0 = 3
7 + 0 = 7
6 + 5 = 11
1 + 6 = 7
6 + 7 = 13
7 + 5 = 12
4 + 1 = 5
3 + 2 = 5



```

以上。
パッと見でわかるQiitaのマークダウン記法

#〇文頭に#を付けると見出しが作れる
##〇文頭の#を2つ(##)にすると小さい見出しに
###〇文頭の#3つにしたらやっぱり小さくなったわ

[〇リンクの挿入は、[リンクのタイトルを入力]\(URLを入力) 
※ちなみに飛んだ先のページは僕のインターン先](https://www.miraidenshi-tech.jp/)



[〇画像の挿入は、[画像リンクのタイトルを入力]\(画像URLを入力) 
※ちなみに飛んだ先のページは僕のインターン先](IMG_8349.PNG)


>〇引用は > のあとに引用文を入力
>>〇　>> みたいな感じで2つ > を並べるとこんな風に階層構造に、ということは…
>>>〇3つ並べるとこうなるよね


**〇太字は「\**」で太字にしたい文字をはさむ**
**　例えば、「\*\*あいうえお\*\*」みたいに**
C++Builder10.3 へICS V8.59 をインストール＆使用までの手順

C++Builder 10.3.1 RIO Community Edition 版へ　ネットワークライブラリ　Overbyte ICS V8.59　を
インストールして、正常に使用可能にするまでの手順をメモ

※　ちなみに C++Buider 10.2 は、別の手順になります


・ICS V8.59 ダウンロード先 （最新版が更新されているかも）
　http://wiki.overbyte.eu/wiki/index.php/ICS_Download



# インストールの準備

　D:\Lib\RadXe10\ICS_859\　フォルダを作成して、ダウンロードしたZIPファイルを解凍する。

　次に　C++Builder を起動し、下記のインストール用プロジェクトグループをロードする。

　　D:\Lib\RadXe10\ICS_859\Install\	CB103InstallVclFmx.groupproj を使用すること

　　この中には　６つのプロジェクトが　登録されているが、
　　下記３つのプロジェクトのインストールが可能

	・IcsCommonCB103Design.bpl
	・IcsVclCB103Design.bpl
	・IcsFmxCB103Design.bpl

　　問題が無ければ、プロジェクトをコンパイルして、インストール出来るのだが...



# インストール前の修正

　　予め全プロジェクトの「すべてクリーンアップ」を実行しておく

　　まず、コンパイル前に下記ファイルを修正する

　　　・IcsVclCB103Run.bpl　プロジェクト内
　　　　　IcsVclCB103Run.cpp を開き　下記を訂正

　　　　　　訂正前：　#pragma link "IcsCommonCB102Run. ～ " の部分 ２ヵ所
　　　　　　　　　　　　　　↓
　　　　　　訂正後：　#pragma link "IcsCommonCB103Run. ～ "　　　　２ヵ所

　　　・IcsFmxCB103Run.bpl　プロジェクト内
　　　　　IcsFmxCB103Run.cpp を開き　上記と同じ個所を訂正


　　次に ６つのプロジェクト全てにおいて、下記手順を実施する

　　（１）プロジェクトのオプションを表示する
　　（２）ターゲット：	すべての構成－すべてのプラットフォーム　にセット
　　（３）項目：「C++（共有オプション）」　を選択し、下記を変更
　　　　　　　　「BPI/Lib出力」 ： 　　　　　　空欄にセット
　　　　　　　　「最終出力ディレクトリ」：　　空欄にセット
　　（４）項目：「Delphiコンパイラ」　－「出力－C/C++」を選択し、下記を変更
　　　　　　　　「C/C++.bpi出力ディレクトリ（パッケージインポートライブラリ）～ 」:
　　　　　　　　　　　　　　　　　　　　　　　空欄にセット

　　このあと、全プジェクトをビルドした後、前項 ３つのプロジェクトを１つずつインストールして
　　正常に組み込まれるのを確認



# Win32アプリ　開発プロジェクトでの使用方法

　使用するコンポーネント：　TWSocket 

　プロジェクトオプション：
　　　Include パスに下記を追加すること
　　　　　D:\Lib\RadXe10\ICS_859\Source\Include\103\Win32

　　　Library パスに下記を追加すること
　　　　　D:\Lib\RadXe10\ICS_859\Lib\Release\Win32\103


　プロジェクトに　下記２つのファイルを追加
　　crypt32.lib
　　cryptui.lib

　　　↑

　　この２つのファイルは、下記フォルダから探したファイル
　　　C:\Program Files (x86)\Embarcadero\Studio\20.0\lib\win32\release\psdk\ 

　　あとの管理が楽になるので、プロジェクトのフォルダへコピーしてから使うかな


Overbyte ICS は、Delphi、C++Builderでは歴史のあるライブラリなので、参考になれば幸いです
C++Builder10.2 へICS V8.59 をインストール＆使用までの手順

C++Builder 10.2.3 Tokyo Professional版へ　ネットワークライブラリ　Overbyte ICS V8.59　を
インストールして、正常に使用可能にするまでの手順をメモ

※　ちなみに C++Buider 10.3 は、別の手順になります


・ICS V8.59 ダウンロード先 （最新版が更新されているかも）
　http://wiki.overbyte.eu/wiki/index.php/ICS_Download



# インストールの準備

　D:\Lib\RadXe10\ICS_859\　フォルダを作成して、ダウンロードしたZIPファイルを解凍する。

　次に　C++Builder を起動し、下記のインストール用プロジェクトグループをロードする。

　　D:\Lib\RadXe10\ICS_859\ Install\ CB102InstallVclFmx.groupproj 

　　この中には　６つのプロジェクトが　登録されているが、
　　下記３つのプロジェクトのインストールが可能

　　・IcsCommonCB102Design.bpl
　　・IcsVclCB102Design.bpl
　　・IcsFmxCB102Design.bpl

　　問題が無ければ、プロジェクトをコンパイルして、インストール出来るのだが...



# インストール前の修正　（　コンパイルオプション変更　）

　　予め全プロジェクトの「すべてクリーンアップ」を実行しておく

　　次に ６つのプロジェクト全てにおいて、下記手順を実施する

　　（１）プロジェクトのオプションを表示する
　　（２）ターゲット：	すべての構成－すべてのプラットフォーム　にセット
　　（３）項目：「C++（共有オプション）」　を選択し、下記を変更
　　　　　　　　「BPI/Lib出力」 ：　　　　　　空欄にセット
　　　　　　　　「最終出力ディレクトリ」：　　空欄にセット
　　（４）項目：「Delphiコンパイラ」　－「出力－C/C++」を選択し、下記を変更
　　　　　　　　「C/C++.bpi出力ディレクトリ（パッケージインポートライブラリ）～ 」:
　　　　　　　　　　　　　　　　　　　　　　　空欄にセット

　　このあと、全プジェクトをビルドした後、前項 ３つのプロジェクトを１つずつインストールして
　　正常に組み込まれるのを確認



# Win32アプリ　開発プロジェクトでの使用方法

　使用するコンポーネント：　TWSocket 

　プロジェクトオプション：
　　　Include パスに下記を追加すること
　　　　　D:\Lib\RadXe10\ICS_859\Source\Include\102\Win32

　　　Library パスに下記を追加すること
　　　　　D:\Lib\RadXe10\ICS_859\Lib\Release\Win32\102

　プロジェクトに　下記２つのファイルを追加
　　crypt32.lib
　　cryptui.lib

　　　↑

　　この２つのファイルは、下記フォルダから探したファイル
　　　C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\win32\release\psdk\ 

　　あとの管理が楽になるので、プロジェクトのフォルダへコピーしてから使うかな


Overbyte ICS は、Delphi、C++Builderでは歴史のあるライブラリなので、参考になれば幸いです
cordova-plugin-firebase@2.0.5 について

Firebase でプッシュ通知などを行う場合、[cordova-plugin-firebase](https://github.com/arnesson/cordova-plugin-firebase) プラグインがよく利用されています。
この cordova-plugin-firebase プラグインが、2019年5月7日ごろから Android ビルドで問題が発生するようになりました。

cordova-plugin-firebase では、ライブラリーで使用するバージョンが `+` 指定されているため、ライブラリーのバージョンが更新されたことにより、ビルドに問題が発生しているようです。

現在、[New error on android build since 06-05-2019 #1057](https://github.com/arnesson/cordova-plugin-firebase/issues/1057) でも回避策などが報告されていますが、cordova-plugin-firebase プラグインを Monaca で利用する場合には、次のように設定を変更する必要があります。

~~**2019年5月18日現在、正常に Android ビルドができることを確認していますが**、**設定を変更しているため、動作保証はありません。**
**修正を行う場合は、ご自身の判断でお願いします。**~~

~~**2019年6月17日に Firebase ライブラリーが更新されたため、現在は、下記の修正を行っても Android ビルドは失敗します。**~~
詳しくは、[Firebase Android Release Notes / Update - June 17, 2019)](https://firebase.google.com/support/release-notes/android#update_-_june_17_2019) を参照してください。

**2019年6月20日現在、正常に Android ビルドができることを確認していますが**、**設定を変更しているため、動作保証はありません。**
**修正を行う場合は、ご自身の判断でお願いします。**


# plugin.xml の修正

はじめに、`cordova-plugin-firebase@2.0.5` の Zip ファイルをダウンロードして、解凍します。

ルートフォルダーにある plugin.xml の以下の設定

```xml:plugin.xml
<framework src="com.google.android.gms:play-services-tagmanager:+" />
<framework src="com.google.firebase:firebase-core:+" />
<framework src="com.google.firebase:firebase-messaging:+" />
<framework src="com.google.firebase:firebase-config:+" />
<framework src="com.google.firebase:firebase-perf:+" />
```

を

```xml:plugin.xml
<framework src="com.google.android.gms:play-services-tagmanager:16.0.8" />
<framework src="com.google.firebase:firebase-core:16.0.8" />
<framework src="com.google.firebase:firebase-iid:17.1.1" />
<framework src="com.google.firebase:firebase-messaging:17.5.0" />
<framework src="com.google.firebase:firebase-config:16.4.0" />
<framework src="com.google.firebase:firebase-perf:16.2.4" />
```

に変更します。

# helper.js の修正

/scripts/android/helper.js の以下の設定

```javascript:helper.js
var googlePlayDependency = whitespace + 'classpath \'com.google.gms:google-services:4.2.0\' // google-services dependency from cordova-plugin-firebase';
```

 を

```javascript:helper.js
var googlePlayDependency = whitespace + 'classpath \'com.google.gms:google-services:4.1.0\' // google-services dependency from cordova-plugin-firebase';
```

に変更します。

# build.gradle の修正

/src/android/build.gradle の以下の設定

```gradle:build.gradle
compile 'com.google.firebase:firebase-auth:+'
```

 を

```gradle:build.gradle
compile 'com.google.firebase:firebase-auth:16.2.0'
```

に変更します。

plugin.xml と helper.js と build.gradle を修正したら、再び Zip ファイルにすることで、Monaca プロジェクトにインポートすることができます。

# 注意点
今回の修正では、ライブラリーのバージョンが、固定になっています。
そのため、Monaca プロジェクトに複数の Cordova プラグインを追加した場合は、バージョン競合が発生する可能性があります。


# おわりに
これまでビルドできていた `cordova-plugin-firebase@2.0.5` プラグインがビルドできなくなった場合は、一度、試してみてください。
Railsでよく見る arr.map(&:id) の意味

#はじめに
Railsの勉強(Railsチュートリアル)をはじめて、よく目にする`arr.map(&:id)`がいまいち理解できていなかったので簡単にまとめてみました。

##mapメソッド
>mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。

## (&:id)について
`:id` で `id` のシンボル を渡しています。
単に `id` と書くとその名前の変数になってしまうので、メソッドを指定するためにシンボルにしています。
 `&` の方はそのメソッドをブロックとして展開することを意味します。
そのため、`&:id` は `id` メソッドをブロックとして渡すことになります。
この時、メソッドのレシーバー(呼び出すオブジェクト)は各要素です。 

イメージとしては次のような感じです。 
1. `map(& )` はブロック `map{|x|  }` に展開 
2. その中身は `:id` のメソッド `.id`

その結果 `arr.map(&:id)` は以下と同じことになります。 

```
arr.map{|x| x.id}
```

##参考
https://teratail.com/questions/1410
Rails6 のちょい足しな新機能を試す18（options_from_collection_for_select 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第18段。 今回のちょい足し機能は、 `options_from_collection_for_select` 編です。
Rails 6.0 では options_from_collection_for_select などの View helper からプライベートメソッドにアクセスしようとすると DEPRECATION WARNING が出力されるようになりました。
View から Model のプライベートメソッドにアクセスするのはよろしくないということでしょう。

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

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

# Railsプロジェクトを作る

```shell
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# scaffold で CRUD を作る

scaffold で User の CRUD 機能を作ります。

```shell
$ bin/rails g scaffold User name
```

# Language クラスを追加する

`options_from_collection_for_select` を試すためだけに、 Language クラスを作ります。

ここで、 `Language#name` メソッドは `private` にします。
また、 `Language.all` メソッドも定義して、 `Language` オブジェクトの配列を返すようにします。

```ruby:app/models/Language.rb
class Language
  def initialize(name)
    @name = name
  end

  def self.all
    [Language.new('Ruby'), Language.new('Python'), Language.new('Elixir')]
  end

  private

  def name # <= name メソッドは private にする
    @name
  end
end
```

# UsersController#new を修正する

View に Language オブジェクトの配列を渡すように修正します。

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  ...
  def new
    @user = User.new
    @languages = Language.all # <= この行を追加
  end
  ...
end
```

# _form.html.erb を編集する

select タグを追加します。 `options_from_collection_for_select` を使います。

```erb:app/views/users/_form.html.erb
<%= form_with(model: user, local: true) do |form| %>
  ...
    <%= form.text_field :name %>
  </div>

  <div class="field">
    <%= form.label :language %>
    <%= form.select :language, options_from_collection_for_select(@languages, :name, :name) %>
  </div>

  <div class="actions">
  ...
<% end %>
```

# rails server を起動して登録画面を表示する

`rails server` を実行して、 http://localhost:3000/users/new にアクセスします。
コンソールを確認すると `DEPRECATION WARNING` が表示されています。

```
Started GET "/users/new" for 172.19.0.1 at 2019-05-15 12:09:34 +0000
  ...
Processing by UsersController#new as HTML
  Rendering users/new.html.erb within layouts/application
DEPRECATION WARNING: Using private methods from view helpers is deprecated (calling private Language#name) (called from block in _app_views_users__form_html_erb___2291557581626701879_47392442046000 at /app/app/views/users/_form.html.erb:21)
  ...
```

# ソースコード

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try018

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Use public_send in value_for_collection](https://github.com/rails/rails/pull/33547)
初めてマラソンマッチに挑戦してみた感想と反省 [Atcoder 第3回 Asprova プログラミングコンテスト]

#概要

先日Atcoderにて開催されたAtcoder 第3回 Asprova プログラミングコンテストに参加しました。
初めてのマラソンマッチ参加であり、焼きなまし法の実装すら初めてということで結果は23位となかなか残念なことになりました。
点数は7.3億点程度。まだまだパラメータ調整や運次第で上がり目はありそうでしたが、トップが11億点弱とかなり差があり、方針が良くなかったのかなと思いあきらめました。
初参加で思ったことをまとめておきたいと思います。

本コンテストは~~大変残念なことに~~会社側の意向により終了後も他の人のソースコードが見れないのですが、有りがたいことに[1位の方の解説記事](http://lkozima.hatenablog.com/entry/2019/05/11/011341)を発見しましたので、そちらを参考にさせていただいております。これが無いと何も反省できない状況だったので、本当に有りがたいです。

#焼きなまし法かビームサーチか

マラソンマッチというと大体この2つの手法のどちらかが使われるようです。
ビームサーチはまだ実装したことが無いのですが、「ゲームのように時系列があるもの」はビームサーチ、それ以外は焼きなましなのかなあと勝手に思っていたので、今回は焼きなまし法を実装しました。

#焼きなまし法で方針として考えるべき3つのこと
焼きなまし法を始めるに当たり、重要なのは以下の3点だと思いました。

1. 初期解
2. 遷移方法（近傍の取り方）
3. 評価関数

###初期解

初期解とはすなわち焼きなまし法の「スタート地点」のことです。
今回私は特に何も考えず能力追加が無い状態を初期解にしてしまいましたが、これがあまりよくなかったようで、
「とりあえず全オーダーが納期に間に合うよう大量に能力を追加した状態」を初期解にした方がよかったようです。
なぜかと言うと、「納期に間に合わない」→「納期に間に合う」の山登りは勾配が急になるのに対し、
「納期に間に合うが能力が追加されすぎ」→「納期に間に合っていて能力も適正」の山登りは勾配がなだらかになるからです。
実際、私のコードでは、全然納期に間に合う方向に遷移してくれず、かなり無茶なことをして無理やり遷移させていました。（スコアの倍率を高めたり、遷移で追加する能力の上限を上げて一発で納期に間に合わせようとしたり…）
もっとも、この工夫だけでは「納期に間に合うより間に合わない方が得」なオーダーを無理やり納期に間に合うようにさせてしまうことがあるので、その壁を超えるためには後述する評価関数が重要になってきます。

###遷移方法（近傍の取り方）

今回の問題では、パッと見「どの設備・日にどれだけ能力を追加するか」が状態のパラメータであるように思えます。
ただ、これをもとに遷移しようとすると、あるボトルネック工程の日付がずれるような遷移に対処できず、局所解に陥ってしまうのではと考えました。
そこで代わりに「どの工程にどれだけ能力を追加するか」を状態のパラメータとし、これを変えるように遷移させました。
この場合、「どの工程に～」を「どの設備・日に～」に変換する処理が必要となり、実装したのですが、この処理にかなり時間がかかり高速化を阻害していたと思います。（実際practice05のループが数万回程度しか回りません。1位の人は300万回以上回せていたようで、Javaだからというレベルではないくらい遅いことがわかります）
とはいえ、方針としてはたぶん合っていただろうと思います。

###評価関数

勾配をなだらかにするため、実際のスコア関数と別に評価関数を用意するというのは、焼きなまし法を調べればすぐに見つかる手法の一つです。
私も今回「納期に間に合わなくても、近づく」ことに対し一定の点数を得られるような評価関数を組み、それ自体は正しい方針だと思います。
ただ、1位の人は「徐々に評価関数をスコア関数に近づける」という手法を行っており、これは目から鱗でした。
確かに、これなら「納期に間に合わないのに無駄に能力を追加している」という状態を回避できます。

**（上記「初期解」「評価関数」の工夫を行いつつチューニングを試行中です。）**

#感想

- 最初に最適解がどんな感じになるかもっとイメージできると良かったかも。今回は高性能なビジュアライザが提供されたのである程度のイメージはできたが、具体的に「何割くらいが納期に間に合う形を目指せばよいのか」が見えていた方が、初期解や遷移を適切に選べたかもしれない。
- 繰り返しになるが今回は高性能なビジュアライザが提供されたおかげでイメージしやすかったが、そうでないマラソンマッチもあるので、ビジュアライザを作成できるようになっておきたい。Webの勉強やAIの勉強も兼ねJSやpythonの学習を進めておく。
- マラソンマッチはアルゴリズム問題と比べてとっつきにくさがあったが、実際やってみるとなかなか楽しい。賞金ももらえるし、もっとAtcoderでも開催されると嬉しい（訳：賞金が欲しい）。

#ソースコード
(工事中)
Discordのチャットを読み上げるbotの作成

#はじめに
discordで通話つなぎながらゲームしている時にチャットの反応が遅れるため、反応しやすいように作りました。
(windowsはOpen-jtalkの導入が少し面倒かもしれません。)


##環境
- Windows10
- discord.py == 1.0.1
- Python 3.7.x

#事前準備
Botを作ったことがないひとはまず[「Discord bot作成チュートリアル」](https://ikayome.hateblo.jp/entry/2019/07/03/Discord_bot%E4%BD%9C%E6%88%90%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)へ

###環境準備
すでに導入方法の記事は腐るほど存在してると思うため他記事に丸投げさせてもらいます。
>Windowsで音声合成Open JTalk
https://qiita.com/mkgask/items/0bf9c26dc96e7b0b45ac
ffmpegインストール
https://web.plus-idea.net/2015/11/windows-ffmpeg/

僕はここを見ながらやりました。

#bot作成
```python:read_bot.py
import discord
from discord.ext import commands
import subprocess
import ffmpeg
from voice_generator import creat_WAV

client = commands.Bot(command_prefix='.')
voice_client = None


@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')


@client.command()
async def join(ctx):
    #voicechannelを取得
    vc = ctx.author.voice.channel
    #voicechannelに接続
    await vc.connect()

@client.command()
async def bye(ctx):
    #切断
    await ctx.voice_client.disconnect()

@client.event
async def on_message(message):
    if message.content.startswith('.'):
        pass

    else:
        if message.guild.voice_client:
            print(message.content)
            creat_WAV(message.content)
            source = discord.FFmpegPCMAudio("output.wav")
            message.guild.voice_client.play(source)
        else:
            pass


client.run("あなたのTOKEN")
```
次にopen-jtalkで音声ファイルを作るコードを書きます

```python:voice_generator.py
import subprocess

def creat_WAV(inputText):
        #message.contentをテキストファイルに書き込み
	input_file = 'input.txt'

	with open(input_file,'w',encoding='shift_jis') as file:
		file.write(inputText)

	command = 'C:/open_jtalk/bin/open_jtalk -x {x} -m {m} -r {r} -ow {ow} {input_file}'

	#辞書のPath
	x = 'C:/open_jtalk/bin/dic'

	#ボイスファイルのPath
	m = 'C:/open_jtalk/bin/nitech_jp_atr503_m001.htsvoice'

	#発声のスピード
	r = '1.0'

	#出力ファイル名　and　Path
	ow = 'output.wav'

	args= {'x':x, 'm':m, 'r':r, 'ow':ow, 'input_file':input_file}

	cmd= command.format(**args)
	print(cmd)

	subprocess.run(cmd)
	return True

if __name__ == '__main__':
	creat_WAV('テスト')

```
read_bot.pyとvoice_generator.pyは同じ階層、openj-talkはCドライブ直下にあるものとしたコードです。

#最後に
discord.pyをasync版からrewrite版変えてから初めてコマンドを使ってみましたがとても便利ですね！いろいろ用途があって面白そうです。

@maguro869 さんがカスタムEmojiの読み上げをしてしまう不具合の修正をしてくださいました。
よろしければ一緒にどうぞ。
[message.content内のサーバーカスタム絵文字を取り除く方法](https://qiita.com/maguro869/items/281679fb2735560b6a10)

#参考
>OpenJTalk + python で日本語テキストを発話
https://qiita.com/kkoba84/items/b828229c374a249965a9
ntpdate ntp.nict.jp "the NTP socket is in use, exiting" エラー対策 

centos6 系

`the NTP socket is in use, exiting`
一旦`ntpd`サービスを停止する必要です。

```
/etc/init.d/ntpd stop
ntpdate ntp.nict.jp
/etc/init.d/ntpd start

```
【AWS初心者向け】Well-Architected Frameworkをマインドマップに落とし込んでみた 【AWSソリューションアーキテクト】

# 初めに
**[AWS認定ソリューションアーキテクト アソシエイト 試験](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)**。通用SAA。
人気資格なので、学習中の人も多いはず。ただ学習範囲がとても広いので、挫折ぎみ人も多いのではないでしょうか？そんな人に向けて、**[Well-Architected Framework](https://aws.amazon.com/jp/architecture/well-architected/)**を頭に叩き込んどくと学習効率上がるかも、という話をしようと思います。


# Well-Architected Frameworkとは？
W-Aフレームワークとも呼ばれます。下記の通りメインは5本の柱から構成されています。
この通りやれば、いい感じのアーキテクチャを組める、というAWSお墨付きの**チェック項目の集合体**、もしくは、アーキテクチャ設計完了までの**羅針盤**、というイメージでしょうか？
AWSの各サービスは、W-Aフレームワークに準拠して設計されているとのこと。デザインの妙ですね。

![2019-05-17_12h10_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/ca4b9056-ce86-9958-8681-015f99e5cbf2.png)



# どうやって頭に入れる？
ちなみに下記は学習開始直後の私のメモ。

> - 覚える用語多すぎ
- 実態がないからイメージしづらい。
- もっと直感的に把握できないの？

根本的にめんどくさがりなんですね。そこで、

> - 各柱ごとにキーワードを抜き出して
> - マインドマップにプロット


してみることにしました。

# Well-Architected Framework マインドマップ


まずは運用上の信頼性。
![2019-05-17_12h10_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/1686dc28-8576-4c05-32f6-9f51fa0526ab.png)

最重要ポイント、セキュリティ。
![2019-05-17_12h10_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/544412aa-2a39-883f-a37a-2e7190c727a8.png)

運用上の信頼性
![2019-05-17_12h11_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/80ed82a3-56dc-62d8-bd7f-c3fccebbb2da.png)

パフォーマンス効率
![2019-05-17_12h11_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/8defc476-5596-e051-fbb4-917d74d03325.png)

最後はやっぱり気になるコスト最適化。
![2019-05-17_12h11_19.p
ng](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/f128a0d6-dfd3-239d-5dce-7e31769bd91f.png)

全部盛り。
![W-A_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/0ef5afa1-96e8-27f8-af11-1379e43d920e.jpeg)




# メリット
やってみて感じたメリットは以下の通り。

> - いい感じのアーキテクチャを構築する上での基本スタンスを知ることができた
- フレームワークが腑に落ちたので、各サービスの覚えがよくなった (はず)
- 自分なりのやり方でまとめたので、モチベーション上がった。
- W-Aフレームワークの内容は、そのまま顧客への説明材料になり、思考のブレ・ロスが減る



# まとめ
Well-Architectedフレームワーク、ラフでもよいので、視覚的に自分が把握しやすい形でまとめてみると、有機的な理解が進むのでお勧めです！
shとbashでselect構文を使ってみる

shやbashには`select`という便利な構文がある。`select`構文を使うと`in`以降に与えた複数の引数をメニューっぽく表示して選択させてくれる。数字を選択すると、対応する引数の値が指定された変数に代入され`do`以下が実行される。範囲外の数字を入力すると再度入力を促される。Enterだけ入力すると再度メニューが表示される。Ctrl-Dを押下するとselect文は終了する。

# `/bin/sh`の場合

```
➤ env -i /bin/sh
sh-4.1$
sh-4.1$ select x in aa bb cc; do echo $x; done
1) aa
2) bb
3) cc
#? 3
cc
```

`in`の後に複数の引数ではなくセミコロン、コロン、スペースなどで区切った文字列を渡しても気を利かせてくれるわけではない。

```
sh-4.1$ select x in "aa;bb"; do echo $x; done
1) aa;bb
#?
sh-4.1$ select x in "aa:bb"; do echo $x; done
1) aa:bb
#?
sh-4.1$ select x in "aa bb"; do echo $x; done
1) aa bb
#?
```
# `/bin/bash`の場合
shでは変数に型という概念は無く、すべての変数はただの文字列である。
これに対してbashの変数は値として配列もとることができる。
そこで`select`構文において`in`の後に配列を持つ変数を展開すべく
`$m`を書いてみたが、単に`${m[0]}`の代わりにしかならなかった。

```
$ env -i /bin/bash
bash-4.1$ m[0]=item1
bash-4.1$ m[1]=item2
bash-4.1$ m[2]=item3
$ declare -p m
declare -a m='([0]="item1" [1]="item2" [2]="item3")'
bash-4.1$ select x in $m; do echo $x; done
1) item1
#? 1
item1
```

# おまけ）bashにおける配列型変数

bashでは変数が配列を持っている場合 `[0]`や`[1]`というインデックス
を省略すると、それは単に`[0]`を指すだけである。

```
$ declare -p m
declare -a m='([0]="item1" [1]="item2" [2]="item3")'
$ echo $m
item1
$ echo ${m}
item1
$ echo ${m[0]}
item1
$ declare -p m
$ m=hogehoge
$ declare -p m
declare -a m='([0]="hogehoge" [1]="item2" [2]="item3")'
$ echo $m
hogehoge
```

#おまけの続き）

コメントでbashで配列を持っている変数の添え字（？）に@を使うとすべての要素が取り出せるよと @akinomyoga さんに教えていただきました。

```
$ x[0]=aa
$ x[1]=bb
$ echo ${x[@]}
aa bb
$ select y in "${x[@]}"; do echo $y; done
1) aa
2) bb
#? 1
aa
```
正規式メタ文字一覧

|メタ文字|機能|例|当てはまるもの|
|:--------|:-------|:--------:|:---|
|^|行アンカーの先頭|/^love/|loveで始まる全ての行|
|$|行アンカーの最後|/love$/|loveで終わる全ての行|
|.|一文字にマッチ|/l..e/|lに続いて任意の二文字、その次にeが来る文字を含む行|
|*|ゼロ以上からなる前置文字|/s*love/|0以上のsの後にloveをもつ全ての行|
|[]|集合の一つに当てはまる|/[Ll]love/|Loveかlove|
|[x-y]|集合内の範囲で一文字一致|/[A-Z]ove/|AからZまでの一文字の後ろにoveが続く行|
|[^ ]|集合以外の一文字に一致|/[^A-KM-Z]ove/|AからKとMからZ以外の１文字の後ろにoveが続く行|
|\<|語アンカーの先頭|/\<love/|loveで始まる語を含む行|
|\>|語アンカーの末尾|/love\>/|loveで終わる語を含む行|


※検索文字列の中に特殊文字と同じ文字を使いたい場合は、「\」を付けます。例えば、「\w」という文字を探したい場合は「\\w」とします。
s3で特定のディレクトリを公開する

# 概要
aws s3の bucket は、デフォルトで非公開となっている。
通常、署名付きURL（presigned_url）を使用すればよいと思うが、完全にopenなimageを時間制限なく公開するため、特定のディレクトリ配下だけを public にしたいことがあった。
その時のオペレーションの備忘メモ。

- アカウントのブロックパブリック・アクセスを解除する
- バケットのブロックパブリック・アクセスを解除する
- バケットポリシーを定義する
- バケットのブロックパブリック・アクセスを設定する
- アカウントのブロックパブリック・アクセスを設定する

# アカウントのブロックパブリック・アクセスを解除する
ポリシーを編集するため、一時的に解除する。
<img width="1687" alt="スクリーンショット_2019_05_17_12_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86923/8e59c334-b46d-0329-90ad-4dadbb991d53.png">

# バケットのブロックパブリック・アクセスを解除する
これも、ポリシーを編集するため、一時的に解除する。
バケット > アクセス権限 > ブロックパブリック・アクセス を開く。
![S3_Management_Console_と_ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86923/a08cde03-71ad-df7f-d407-9d74f97eb995.png)

# バケットポリシーを定義する
バケット > アクセス権限 > バケットポリシー > ポリシージェネレータ を開く。
<img width="1690" alt="スクリーンショット_2019_05_17_12_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86923/00db6476-0c0d-c3b8-bda0-ef235ec082c2.png">

生成されたポリシーをコピペする。
![S3_Management_Console_と_ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86923/fcf0836f-2362-60bd-2142-11e828ea909f.png)

# バケットのブロックパブリック・アクセスを設定する
バケット > アクセス権限 > ブロックパブリック・アクセス を開く。
「新しい〜」を二箇所、オンにする。
![S3_Management_Console_と_ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86923/26d47ce6-6629-f913-f34e-dd225b6a16e0.png)

# アカウントのブロックパブリック・アクセスを設定する

こちらも、「新しい〜」をオンにする。
<img width="1683" alt="スクリーンショット_2019_05_17_12_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86923/7829cb49-1073-f392-6bf5-a75c3d6192a4.png">
秀丸マクロでCRLFからLFに変換

## 課題
多数ファイルがCRLFですが、LFにしたい。

## 対応
- 以下の秀丸マクロを登録。
- 変換したいフィアルを開いて
- マクロ実行（変換され、同名に保存、ファイルを閉じる）

```java
	setcompatiblemode 0x0F;
	saveas filename, utf8, lf;
	exit;
```

## 制限
- 半自動。これは自分でファイルを開く必要であるし、１ファイル付き１回マクロを実施する操作が必要なので、少量のファイルしか向いてません
- 文字コード固定。saveasの特性上、文字コードを指定が必要でした。

## 参考
- 秀丸コマンド　https://help.maruo.co.jp/hidemac/html/010_Intro.html
- 秀丸内部変数　https://crocro.com/pc/write/hide/chimarl07_02.html
フォーム画面を作った　応用編

#フォーム画面の応用

こんにちは！*未来電子テクノロジー*の西尾です！

前回は、フォーム画面を作る上での形をご紹介したので、今回は、そのフォーム画面を違うリンクに飛ばす方法についてお伝えします！

##formを違うリンクへ

以下のように、違うリンクと連携させます。

```
<form method="post" action="staff_add_check.php">
、、、、<input>
```

postに関しては、違うリンクに飛ばします、という意味合いがあります。
今回の場合、リンクが飛んだ先ではstaff_add_check.php←こちらのリンクに飛びます。

##inputタグを複数付けたい場合
「戻る」「進む」など、一つの画面で複数のinputタグを付けたい場合もありますよね。
そういった場合は、以下のようにinputに名前を付けます。

```
<input name="aiueo" text="text" style="width;100px">
```

textは、枠の種類を指します。

text;テキストボックス
checkbox;チェックボックス
radio；ラジオボタン
password；パスワード

このように、枠の種類を指定でいます。

また、styleで枠の大きさを調整できます。この場合は100ピクセルにせよという意味です。

##まとめ

今回は、フォームボタンを応用させてより実践的な形にしました。
フォーム画面を作る際は、今回の記事をぜひ参考にリンクを飛ばしたり、ボタンをアレンジしてみてくださいね。

また、フォームを完成させるにあたっては、データベースを使うことになるので、
またデータベースの使い方についても説明します。

最後までお読みいただき、ありがとうございました！
フォーム画面の作り方

#フォーム画面を作りました

こんにちは、*未来電子テクノロジー*の西尾芽衣です。

今回、フォーム画面を作ったときに学んだことについてアウトプットしていきます。

##input

まず、入力する際に使うのが、inputです。
一行のみ入力できます。
以下のように使います。

```
<p>input要素</p>
<input>
```
<input>は終了タグが必要ないのが特徴です。


##textarea

数行入力したい場合は、textareaを使います。

```
<p>textarea要素</p>
<textarea></textarea>
```

<textarea>は終了タグが必要なので、混同しないようにする必要がありますね。

##送信ボタン

フォームを作る際に必ず必要になるのが、送信するためのボタンです。
ボタンはinput属性を使います。

以下でボタンの作り方を示します。

```
<input type="submit">
```

上記の表字で、ブラウザの設定が日本語ならば、日本語で「送信ボタン」ができます。

##まとめ

今回は、フォーム画面の作り方をご紹介しました。

ぜひフォームを作る際の参考にしてください。

最後までお読みいただきありがとうございました！
smtp.js使ってみたけど、なんかよくわからなかったので自分で何とか解読して使った話

#はじめに
今回smtp.js( https://www.smtpjs.com/ )を使おうとした際に躓いため、ここに記しておく。
わからない人に届け。

#参考
ちなみにいくつかのサイトは参考にさせていただいたので、以下に載せておく。
[javascriptのみでメール送信](https://qiita.com/tatsuyafukui/items/cbca47c803b3bcada08a)
[【JavaScript】GmailアカウントでSMTP送信するスクリプト](http://saku-saku-pc.com/javascript/%E3%80%90javascript%E3%80%91gmail%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7smtp%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/)

#今回躓いた点について
今回躓いたのは先ほど[はじめに]にリンクを乗せたsmtp.jsの公式サイトに載っているドキュメントを読んでその通りにやったにもかかわらず、動いてくれなかったためである。
実際自分がJsonの使い方がよくわかっていないのかもしれない。もし普通に動いた場合は申し訳ない。
ただ公式ドキュメントとは別に動かす方法を見つけたので、動かない人は試してみてほしい。

##結論から言うと
結論として、以下の関数と引数指定で使用するとうまくいった。  

```javascript
//添付ファイルなしでの送信の場合
Email.send(
    e, //送り元(From) 
    o, //送り先(To)
    t, //副題(Subject)
    n, //本文(body)
    a, //SMTPサーバ(host)
    s, //ユーザ名(Username)=送り元と同じで平気...?
    r  //パスワード/キー(password)
);

//添付ファイルありでの送信の場合
Email.sendWithAttachment(
    e, //送り元(From) 
    o, //送り先(To)
    t, //副題(Subject)
    n, //本文(Body)
    a, //SMTPサーバ(Host)
    s, //ユーザ名(Username)=送り元と同じで平気...?
    r, //パスワード/キー(Password)
    c, //添付ファイルのURL(Url)
    d  //結果(result)
);
```

#終わりに
完結だがこれだけだ。
困っている方に届いてほしい。
間違っている部分があったら、指摘してくれるとありがたい。

#おまけ
ちなみに自分はSMTPサーバとしてgmailを使用しようとしたが、gmailでは二重ファクタリングとやらをやらなければSMTPサーバを使うことができなかった。同じくgmailでメールを送信しようと考えている人は注意。
【JavaScript】論理演算子を使った空チェックについて

# 論理演算子とは

>論理演算子 (Logical operators) は、基本的に真偽（論理）値とともに用いられ真偽値を返します。しかし、&& および || 演算子は真偽値ではない値も使うことができるため、その場合は、真偽値ではない値を返すことがあります。

説明を見るよりもコードを見たほうが早いと思う

## 一般的なif文を用いた空チェック

``` index.js
let hoge; // 判断対象の変数

// nullまたはundefindまたは空文字だったら empty と表示する
if (hoge === null || hoge === undefined || hoge === '') {
   console.log('empty');
}else{
   console.log(hoge);
};
```

よくあるif文での空チェックだと思う

## 三項演算子を用いた空チェック

三項演算子で空チェックを書くとこんな感じ

```index.js
let hoge; // 判断対象の変数

// nullまたはundefindまたは空文字だったら empty と表示する
hoge === null || hoge === undefined || hoge === ''
  ? console.log('empty')
  : console.log(hoge);
```

上記の条件式で使われているパイプ（||）が論理演算子のひとつ
```パイプ　＝　または```
という認識で構わないと思う

## 論理演算子を用いた空チェック

構文の簡略化は賛否両論あると思うが
実はこの空チェック判断処理はもっと簡単に書ける

```index.js
let hoge; // 判断対象の変数
  
// nullまたはundefindまたは空文字だったら empty と表示する
console.log(hoge || 'empty');
```

シンプルすぎてちょっと引く
なんでこうなるかというと、さっきの論理演算子の説明文を思い出してほしい

>論理演算子 (Logical operators) は、基本的に真偽（論理）値とともに用いられ真偽値を返します。しかし、&& および || 演算子は真偽値ではない値も使うことができるため、その場合は、真偽値ではない値を返すことがあります。

そうゆうことである

この式は、左辺値をBoolean型として評価して、 trueなら左辺値を、falseなら右辺値を評価値とする.


空チェックするときは、右辺値にデフォルト値をいれると覚えておくと良い

ちなみに、この最後の式で書くと**判断する値が0の場合もfalse**と判断されるので注意が必要

JSのマニアックな書き方を覚えていく度に、またひとつJSに近づいた感じがしてゾワゾワするよね。
一緒に書くメンバーによってはコードの簡略化より可読性を重視する場合があるので注意するように！
ゼロから始めるPHP ～MacOSXでPHP開発環境構築～

初めての投稿になります。<br>ユーザーネーム「@zeroPro（ぜろぷろ）」です。

<H2>はじめに</H2>
まずは簡単に自己紹介を・・・
四国の病院で臨床工学技士（Clinical Engineer）として働いています。
この度、IT系エンジニアとして転職したいと思いPHPの勉強を始めました。
HTML・CSS・BootStrap・JavaScriptはある程度理解している状態です。

<H2>どの手段で開発環境を構築するか</H2>
結果からいうと・・・
**homebrewで必要パッケージ毎のインストールになりました。**

それまでの過程で色々調べたので備忘録がてら記事にしてみます。
PHPやってみようかなっていう方のお役に立てれば幸いです。

<H3>①MAMPをインストールしてみる</H3>
「MAMP入れたらすぐできそう！」っていう理由でMAMPを選択しました。
確かにめちゃくちゃ簡単でした。すぐできました。

けど、すぐやめました。
理由としては・・・


**「簡単すぎて何が行われているかさっぱりわからない。」**

辞めた理由はこれに尽きます。

後々調べていくとMacにはPHPもApacheも最初からあるじゃん！
ってことにも気づきました。
重複しているものがあること+優秀なソフトすぎて動きを理解できていない。
これだと後々困るのではないか思いました。

<H3>②homebrewに出会う</H3>
先述したようにMacにはPHPもApacheもあるので、足りないものをインストールもしくはアップデートすれば良いなと思い調べているとhomebrewに出会いました。

*homebrewとは・・・MacOSX用のパッケージ管理システムです。
[homebrew 公式サイトはこちら](https://brew.sh/index_ja.html)
*インストール方法はこちらの記事を参考にしました！
[MacにHomebrewを導入する方法(@balius_1064 様)](https://qiita.com/balius_1064/items/ac7dff5ef10eaf69996f)

詳しいインストール方法は上の方の記事で分かりますので、割愛します。

homebrewでいれたものは「MySQL・composer」の2つです。
MAMPと同じ環境を構築するには・・・
**MacOSX　Apache　MySQL　PHP** が必要です。
今回はhomebrewで既存のPHPのUpdateとMySQLのインストールを行いました。

PHPの開発環境で必要な物はこれで揃いました！

<H3>③phpMyadminをインストールする</H3>
データベースをGUIで作成・編集できたら使えたら楽だなということで**「phpMyadmin」**を入れました。

参考URL：
[HomebrewでphpMyAdminをインストールする。(@33yuki 様)](https://qiita.com/33yuki/items/8896a91007cc5a1dfc45)
[HomebrewでMacにphpMyAdminをインストールする](https://sh0e1.com/posts/55)

homebrew経由だとめんどくさそうだったので下記のサイトを参考にフォルダに直接放り込むパワープレイに出ました。

参考URL：
 [Mac Mojave HomebrewでインストールしたphpMyAdminが動かないのでソースからインストール](https://www.lonely-surfer.com/homebrew-phpmyadmin)

<H2>最後に</H2>
というわけで、色々調べまくってhomebrewを使って環境構築をしました。
MAMPは簡単で良かったんですけど、私には合わなかったです。

今の環境を構築するのにパス通したり、エラー解除したりしてたら4日程かかりました。

環境構築ってなんやかんや楽しいですよね。
pandas.DataFrame.apply()で条件分岐しながら複数の返り値を取得する！

#この記事に書いてあること
あるDataFrameに対して、列ごとに、Noneを返すことのありうる処理を適用させる場合の方法についてです。
要点は、「DataFrameの列ごとにapplyして得られる返り値の形は、一列目に対するapplyの返り値の形に引きずられる」ということです。
早速みていきましょう。
## 準備
```python
import pandas as pd

# テーブルの準備
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],
                  index=list('abcd'))
```
dfは、以下のようなテーブルになります。

| |0  |1  |2  |
|---|---|---|---|
|a|1  |2  |3  |
|b |4  |5  |6  |
|c|7  |8  |9  |
|d|10  |11  |12  |

次に、以下のような2つの関数を用意します。違いは、if文の条件のところだけです。

``` python
def func_1(data):
    if np.max(data) <= 6:
        return pd.Series({'max': np.max(data), 'mean': np.mean(data)})
    else:
        return None


def func_2(data):
    if np.max(data) > 6:
        return pd.Series({'max': np.max(data), 'mean': np.mean(data)})
    else:
        return None
```

## apply(axis=1)で列ごとに適用する
### 上手くいく場合
まず、func_1を適用してみます。
返り値がNoneの場合にも、形は崩れず、各要素がNaNであるSeriesが返されているような挙動をします。上手くいきました。

```python
In : df.apply(func_1, axis=1)
Out:
   max  mean
0  3.0   2.0
1  6.0   5.0
2  NaN   NaN
3  NaN   NaN
```
### 上手く行かない場合
次に、func_2を適用してみます。
一列に二つの要素が格納されてしまい、形が崩れてしまいました。
一列目の返り値がNoneであるからだと考えられます。その後の列の返り値も、初めのNoneに引きづられてしまいました。

```py
In : df.apply(func_2, axis=1)
Out:
0            None
1            None
2      [9.0, 8.0]
3    [12.0, 11.0]
```

## 改善案
以下のように、Seriesに格納する要素ごとにnp.nanを返すようにしてあげると大丈夫です。要素数が多い場合に面倒になるので、その場合は要素の総数mに対して`np.array([np.nan for i in range(m)])`を使っても良いでしょう。

```py
def func_2(data):
    if np.max(data) > 6:
        max = np.max(data)
        mean = np.mean(data)
    else:
        max = np.nan
        mean = np.nan
    return pd.Series({'max': np.max(data), 'mean': np.mean(data)})
```