OmniAICreator/Qiita-1.07M huggingface dataset:
vultrでwagtailを使えるようになるまでやったこと

#1. サーバーを借りる
- VultrのUbuntu　x64
- python3


#2. wagtailをinstall

- wagtailサイト参照<br />
[Your first Wagtail site] 
(http://docs.wagtail.io/en/v2.4/getting_started/tutorial.html#)

###installしたのも
#####pip<br />
```
$ apt install python-pip
$ pip install wagtail
```
This version of Wagtail requires Python 3.4 or above - you are running 2.7
python3の環境にpython2.7のpipをインストールしてしまう。

#####[解決策]
- python3用pipをインストール<br />
環境を分ける必要性がなかったのでこちで解決

```
$ sudo apt-get remove python-pip
$ sudo apt-get install python3-pip
```
- virtualenvでpython2.7用環境を分ける


#####wagtail<br />

```
$ pip3 install wagtail

[Error]
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ModuleNotFoundError: No module named 'setuptools'
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-rgabi5yc/django-treebeard/
root@vultr:~# pip3 install --upgrade pip3 setuptools
Collecting pip3
  Could not find a version that satisfies the requirement pip3 (from versions: )
No matching distribution found for pip3
```
#####[解決策]
- setuptoolsを更新する<br />
[参考](https://askubuntu.com/questions/861265/python-3-importerror-no-module-named-setuptools-ubuntu-14-04-lts)

```
$ pip3 install --upgrade setuptools
```

#3. wagtailのサイトを作成

```
$ wagtail start myweb

/* mywebディレクトリ内で行う */
$ python3 manage.py migrate
```
※myweb アプリケーションの名前

#4. サーバー起動

```
$ python3 manage.py runserver サーバーIP
```

#5. ページ確認
<img width="1046" alt="Screen Shot 2019-03-21 at 1.06.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/380832/11299e2d-97e3-b1e5-4b83-622082e1815e.png">
【Unity】IL2CPPの変換結果を見る

#手順
Unity2018.3.11
TargetPlatform (Windows)

1. UnityHubで対象のUnityバージョンを選択し、
  [Add Component] -> **[Windows Build Support(IL2CPP)]** をインストール。

2. Unityを起動し[Player Settings] -> [Other Settings] 項目の
  [Configration] Scripting Backend を**[IL2CPP]**にする。

3. Windowsビルドを行い、出力されたフォルダ内にある
  XXX_BackUpThisFolde～/il2cppOutput/Bulk_Assembly-CSharp_0.cppを確認する。

#結果

元コード（C#）

```
using UnityEngine;

public class Gollira
{
    public static void Say()
    {
        Debug.Log("Uho");
    }
}
```

IL2CPP変換後のコード（C++）

```
// System.Void Gollira::Say()
extern "C" IL2CPP_METHOD_ATTR void Gollira_Say_mC933DB5052E90B62EB374E544884FC6936175850 (const RuntimeMethod* method)
{
	static bool s_Il2CppMethodInitialized;
	if (!s_Il2CppMethodInitialized)
	{
		il2cpp_codegen_initialize_method (Gollira_Say_mC933DB5052E90B62EB374E544884FC6936175850_MetadataUsageId);
		s_Il2CppMethodInitialized = true;
	}
	{
		IL2CPP_RUNTIME_CLASS_INIT(Debug_t7B5FCB117E2FD63B6838BC52821B252E2BFB61C4_il2cpp_TypeInfo_var);
		Debug_Log_m4B7C70BAFD477C6BDB59C88A0934F0B018D03708(_stringLiteral383D29DCCA7388203967636D6ACDA6DB59C7AA7C, /*hidden argument*/NULL);
		return;
	}
}
```
jquery_validate_engine_railsを使ってフォームのバリデーションチェックする

#jquery_validate_engine_railsを使ってフォームのバリデーションチェックする

##手順

１、gem 'jQuery-Validation-Engine-rails'をインストール。

```rb:Gemfile
gem 'jQuery-Validation-Engine-rails'
```

```
$ bundle install
```

２、application.cssとapplication.jsに以下を追記。

```
# application.css.scss
path /app/assets/stylesheets/application.css.scss

下記を追記
*= require validationEngine.jquery
```

エラーメッセージを日本語化にするため、下記URLからフォルダをダウンロード
その中の**jquery.validationEngine-ja.js**というファイルだけ、app/assets/javascriptsの下に置く。(他のファイルは使わない）
https://github.com/posabsolute/jQuery-Validation-Engine

```application.js
// path app/assets/javascripts/application.js

下記を追記
//= require jquery.validationEngine-en
//= require jquery.validationEngine
//= require jquery.validationEngine-ja.js
```

３、application.htmlのbody閉じタグ直前に下記を追記し、jQueryを読み込む。

```rb:application.html
<body>
<script type="text/javascript">
jQuery(document).ready(function(){
  jQuery("#validate_id").validationEngine();
});
</script>
</body>
```

上記、
**jQuery("#xxxxxx")**
この()内のセレクタと、次のform_forに設定するidとを一致させると、フォームの入力を検知してバリデーションが機能するようになる。
idをセレクタに指定する場合は先頭に#をつける。

４、form_forに上記セレクタと同じidを設定。

```rb:show.html.erb
<%= form_for(@sample, url: sample_path(id: id), html: { id: "validate_id" }) do |f| %>
  <%= f.select :decisions, Sample.decisions, { include_blank: true, selected: 0 }, class: "validate[required]" %>
  <%= f.submit '変更を送信する', class: 'btn btn-primary' %>
<% end %>
```

selectのclassに、"validate[required]"を指定すると、必須入力になります。

これで空白のまま送信ボタンを押すと、下記のようにバリデーションがかかるようになります。

<img width="389" alt="スクリーンショット 2019-04-10 0.46.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/287122/1d46cd2a-6180-8e63-9224-62fed8a6ac71.png">


###補足

form_forのオプションに html: { id: XXXXXXX }と渡さないと、動きませんでした。
html: とするのがポイント。
単に { id: XXXXXX }では動かなかった）

https://qiita.com/seri_k/items/cb06d14fbdc4095cfde4

include_blank: trueはプルダウンの先頭に空白を作ります。

selected: 0 は、指定したプルダウン内の要素をデフォルト値にします。

配列の先頭は[0]、そして上記で空白を先頭に追加しているので、このプルダウンは空白がデフォルトになります。

###参考
http://tech-log.hatenablog.jp/entry/2015/12/26/044401

https://remonote.jp/rails-devise-validation-engine

jQuery Validation Engineを利用する - Qiita
https://qiita.com › jQuery
.NET Core 3.0 の目玉の single exe を preview3 で試してみたら出来なかった

# .NET Core 3.0 の目玉の single exe を preview3 で試してみたら出来なかった

.NET Core 3.0 の目玉の single exe がどれくらいのサイズになるのか興味があって、 preview3 で試してみようとしたら、出来なかった話.

~~それはそれとして、.NET Core SDK 3.0.100-preview3-010431 を入れても、Visual Studio 2019 がうんともすんとも .NET Core 3.0 を認識しないのは何故だろう. インストール画面眺めてたときに TargetPack がインストールされているのは確認できたのに…….~~

preview チャネルの VS2019 じゃないと駄目だよとダウンロードページに書かれていることに preview4 をダウンロードに行って気づいた orz. (推奨されないけど、設定で有効にすることもできる [.NET Core tooling update for Visual Studio 2017 version 15.9](https://devblogs.microsoft.com/dotnet/net-core-tooling-update-for-visual-studio-2017-version-15-9/)) 

というわけで、.NET Core 2.1 で ConsoleApp を作成し、.csproj の TargetFramework を手で netcoreapp3.0 に書き換えるところからスタート.

[designs/design.md at master · dotnet/designs](https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md) を見ると

```
# Alias for dotnet publish /p:PublishSingleFile=true
dotnet publish --single-file
```

と書いてあるので実行すると

```
C:\Users\user\source\repos\ConsoleApp1>dotnet publish --single-file
Microsoft (R) Build Engine version 16.0.443+g5775d0d6bb for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

MSBUILD : error MSB1001: Unknown switch.
Switch: --single-file

For switch syntax, type "MSBuild -help"
```

全然駄目.
じゃあエイリアスじゃないほうでやるかーと.

```
C:\Users\user\source\repos\ConsoleApp1>dotnet publish -r win10-x64 --self-contained /p:PublishSingleFile=true
Microsoft (R) Build Engine version 16.0.443+g5775d0d6bb for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

C:\Program Files\dotnet\sdk\3.0.100-preview3-010431\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.TargetingPackResolution.targets(90,33): error MSB4030: "/p:PublishSingleFile=true" is an invalid value for the "SelfContained" parameter of the "ResolveFrameworkReferences" task. The "SelfContained" parameter is of type "System.Boolean".
```

やっぱり駄目.

そもそも

```
C:\Users\user\source\repos\ConsoleApp1>dir "C:\Program Files\dotnet\dotnet.exe" | findstr dotnet.exe
03/03/2019  04:44 PM           324,992 dotnet.exe
```

dotnet.exe はタイムスタンプから .NET Core 2.1 のモノっぽさ?

```xml
<PropertyGroup>
    <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
```

同ページに .csproj で指定できるようなことが書かれているけど、書いて `dotnet publish -r win-x64 -c release --self-contained` してもやっぱり駄目.

ググったところ

[win-x64 publish with Core3 Preview and VS2019 results in ""CheckEmbeddedRootDescriptor" task was not given a value for the required parameter "AssemblyPath"" · Issue #210 · dotnet/winforms](https://github.com/dotnet/winforms/issues/210)

↓

[win-x64 publish with Core3 Preview and VS2019 results in ""CheckEmbeddedRootDescriptor" task was not given a value for the required parameter "AssemblyPath"" · Issue #428 · mono/linker](https://github.com/mono/linker/issues/428)

という感じで、preview2 の頃から動いていないのが分かっていて、preview3 でも直っていないようであった(合掌)

[Brainstorming - Creating a small single self-contained executable out of a .NET Core application - Scott Hanselman](https://www.hanselman.com/blog/BrainstormingCreatingASmallSingleSelfcontainedExecutableOutOfANETCoreApplication.aspx)

ここを見る限りは10MB未満でいけそうで大変期待できる.
docker + scikit-learnのGridSearchCVの並列処理で“No space left on device” が発生した時の回避方法

## Tips

docker + scikit-learnのGridSearchCVで並列処理（n_jobs=-1）を実施しようとした所、“No space left on device” が発生した

```python
grid_search = GridSearchCV(pipe, param_grid , cv=5, n_jobs=-1, verbose=3)
```

## 環境
GCE + nvidia docker2 + jupyter-notebook + scikit-learnの環境で発生

## 原因

共有メモリ(/dev/shm)のアロケーションエラーが原因。df -hでサイズを確認できる。

## 対策
jupyter-notebookでJOBLIB_TEMP_FOLDERを設定する

```python
%env JOBLIB_TEMP_FOLDER=/tmp
```
仕組みを知れば応用力がつく

皆さんはとあるデータやシステムにあったときどうしますか？ほとんどの人が使い方を教えてもらってそれを一生懸命手順をメモして、その通りに間違えないように使うと思います。

　でもこれって大きな問題がありませんかね？そう。**応用が利かないのです。。。**
　なぜ応用がきかないのかそれはつまり、**仕組みを知らないからです。**

　そう！ある意味自分への戒めでもあるのですが、自らの使っているシステムやツールやサービスの仕組みを知る意識を持ちましょう。

　その中でもとりわけ色々なMAツールやWebシステムの肝はやはり**計測の仕組みにあります。**

　いつも新しいものに出会ったら「(システム/ツール名その他)　計測　仕組み」と是非ググってみてください！
　大体の場合偉大なGoogle先生が教えてくれることでしょう。(多分)

　別にGoogle信者じゃないのですがそんな何でも教えてくれるGoogle先生に敬意を表してGA(Google Analytics)を例にして説明するとGAはWebビーコン方式を基に計測されており、このワードで計測すればデータを飛ばす仕組みが大体図解されています。

　このケースだとここで注目意識してほしいのは計測の「タイミング」や「計測内容」そして「計測方法」です。するとどうでしょう何ができて何ができないのかを仕組みから理解することが可能です。そしてCookie計測が分かれば自然と様々なケースに対応できるようになります。

　よって理屈をもってデータの正確性について担保することができますし、以下のような質問にも対応可能です。

　社員「ねぇねぇなんでこのセグメントって売り上げが出ないの？？」
　データ屋さん「それはサンクスページがセグメントにしたときに外れてるからだよ」
　※一般的に売上計測は大体サンクスページで売り上げ金額をパラメータとしてサーバーに送付することで計測しているから
　社員「ねぇねぇなんでこの数字合わないの？？」
　データ屋さん「それはセッション計測が重複してるからだよ＾＾」
　※セッション計測同士を比較すると一部重複部分が発生し、誤計測の恐れがある。

　これだけで、知らない人から見ればこいつやるなとか一目置かれることでしょう。ある程度経験を積むとシステムを見るだけでこれってこういう計測してるのかな？とか予測がつくようになってきます。
　
　是非仕組みを知る！知ろうとする意識を忘れないようにしましょう。

　その場限りの知識ではなく根本を少しでも理解することの積み重ねが自分を大きく成長させます。
Laravel ユニットテスト(実行前後ログを残したい)

## ◆ディレクトリ
Laravelプロジェクトを作成したときにできるディレクトリ(Feature・Unit)
・Feature apiやwebページの検証
・Unit クラスやメソッド

この辺はプロジェクトごとにわかりやすい名前や構造に変えることもありそう。

##◆テストメソッドの指定の仕方

```:ExampleTest 
class ExampleTest extends TestCase
{
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }

    /**
     * @test
     */
    public function sample()
    {
        $this->assertTrue(true);
    }
}
```

2つある(どちらでも好みで)
・メソッド名の先頭にtestをつける
・testアノテーションをつける

testアノテーションを使うと、メソッド名を日本語名にしてもOK

```
/**
 * @test
 */
public function テストします()
{
    $this->assertTrue(true);
}
```

##◆実行方法

```:コマンド
//ファイル内のtestメソッドがすべて実行される
vendor/bin/phpunit tests/Unit/ExampleTest.php

//ファイル内のtestメソッドを指定して、それだけ実行
vendor/bin/phpunit tests/Unit/ExampleTest.php --filter=sample

//ディレクトリのすべてのファイルのすべてのメソッドを実行
vendor/bin/phpunit tests/Unit

//すべてのテスト
vendor/bin/phpunit
```

##◆テスト実行前後ログを残す
基本的にTestCaseクラスを継承しているので、そのクラス内に記述してみる。
もともと用意されている便利メソッドをオーバーライドして使おうと思う。
<b>setUp() メソッド実行前に呼ばれる</b>
<b>teardown() メソッド実行後に呼ばれる</b>

```:TestCase 
abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    public function setUp(): void
    {
        parent::setUp();
        
        //実行開始ログ
        Log::info('start/class：['. get_called_class(). '] method：['. get_class_methods(get_called_class())[0].']');
    }

    public function tearDown(): void
    {
        //実行終了ログ
        Log::info('end/class：['. get_called_class(). '] method：['. get_class_methods(get_called_class())[0].']');

        parent::tearDown();
    }
}
```

今回はdebug_traceを使わないようにしたかった(情報量が多いため)
この方法は、テストを一ファイルに一つしか書かないという条件で、ファイルごとにテストを定義するという決まりなら、使えるが他に万能な方法を考えたい。

[参考記事もともと用意されてるメソッド]https://qiita.com/aozora0000/items/c10676beabb5570accce
【メモ】GitHub　新しいブランチ切ってプルリク立ち上げるまで

GitHubとGitHub Desktopを用いたとき、新しいブランチの切り方が1回ですんなり身につかなかったのでメモとして簡単に方法を残す。

あるブランチを作り終わったら・・・・
1.全てコミットしていることを確認してから

####Web上のGitHub(リモートGitHub)
2.現在のプルリクの下部の `Marge pull request` 押す
3. `Confirm merge`
4. `delete branch`

####GitHub Desktop
5.Current Branchを `master` に戻す
6.右上の `Pull origin`押す
7.新しいブランチを作成
8. `Publish branch`でリモートGitHubに反映
9.少しコード編集して、コミット→push origin

####Web上のGitHub(リモートGitHub)
10.リモートGitHubのTOPに、黄色囲みされているブランチ名の右横の `Compare & pull request`を押す
11.内容入れて、 `Create pull request`

以上でOK！
bashの読み込みについて

#概要
先日作ったばかりのVMを起動していつも通り勉強を始めようとしたところ
$PS1 (プレステと呼んでいる) を編集してプロンプトをイケイケにしたのに
どうやら、再起動後は変更が消えてしまうらしい。。。
再起動しても変更を反映したいので備忘録として残す

#bashの読み込みについて
VMの再起動時に読み込んでくるときいくつか読み込むファイルがあるらしい
・/etc/profile
・~/.bash_profile
・~/.bashrc

##/etc/profile
システム全体で利用するためのディレクトリらしい。。
##~/.bash_profile
各ユーザ単位で設定をするディレクトリ
ログインの時に読み込む
##~/.bashrc
今回設定するディレクトリ
bashを起動するたびに読み込む
非ログインシェルを使う時よみこむディレクトリらしい

#設定
`$ vi ~/.bashrc`
`PS1='\t[\u]\$'`←追記
追記後
`source ./bashrc` を入力し設定反映

#さいごに
記述後は再起動してもプロンプトは自分のお気に入りのままに！
しかし。。。
**設定を変更する前にはしっかりバックアップを！！**
バックアップ取らずに変更してVMおしゃかは勘弁です。。。
Xcode10以降でBuild PhasesのRun ScriptでInfo.plistが加工できない

# Build PhasesでInfo.plistの動的変更
APIやmBaasを環境により向き先変更をする場合、環境ごとにSchemeを用意しScriptで変更する方法はよく用いられる方法だと思います。またInfo.plistに定義するBundle IdentifierやDisplay Nameなどを環境ごとに変えたり、開発環境やモックサーバーへの接続のためのATS設定切り替えにも昔から利用されています。

# Xcode10で期待通り、Info.plist変更用、Scriptが動作しない
Xcode１０で突然２回目以降のbuildでplutil,plistbuddyなどが期待動かなくなりました。
そのため、Clean Build Folder -> Buildというステップを踏む必要が出ていました。

# Preprocessed-Info.plistの挙動
1.Build PhasesのShellScriptは問題なく実行される
2.Preprocessed-Info.plistは変更される
3.Build完了時に、Preprocessed-Info.plistが変更前に戻る
4.変更前の状態でInfo.plistとしてパッケージングされる。

# 対応方法
各RunScriptのInput Filesの項目に
`${TEMP_DIR}/Preprocessed-Info.plist`
を設定。
<img width="726" alt="スクリーンショット 2019-04-10 0.07.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/103494/c1514dd0-79d5-3e2c-d589-dd8d03b5aac1.png">

# その他
- Build　Phase　ScriptでPreprocess Info.plistを利用する場合は Build Settingsで`Preprocess Info.plist File`をYESにする
BitriseでCarthageを使うとAPI rate limit exceeded...

BitriseでCarthageを使うと、バイナリダウンロードに失敗する場合がある

```
*** Skipped downloading XXXXX binary due to the error:
“API rate limit exceeded for 208.52.166.156. (But here’s the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)”
```


**原因は2つある。**

# github Apiの利用制限
ログの通り、Carthageが内部で叩いているgithub apiの利用制限に引っかかっている場合がある。

## 解決法
githubのAccessTokenを発行し、Bitriseの環境変数にセットする。

AccessTokenの取得方法は[こちら](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line)
スコープのチェックボックスは全てOFFで良い。

BitriseではここにAccessTokenをセットする。
Keyは `GITHUB_ACCESS_TOKEN`
<img width="897" alt="スクリーンショット 2019-04-09 23.49.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/14646/47a396e5-b063-d3c0-2ffa-21d27f9213c9.png">

以上で解決する場合がほとんど。

# Cartfileの記述ミス
Cartfileの記述にミスがあると、AccessTokenを設定してもエラーが解決しない。
例えば、[aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) は罠がある。
*(注) 現在は修正されています。*

Organizationは`aws-amplify`
Repositoryは`aws-sdk-ios` であるにも関わらず、
READMEには `github "aws/aws-sdk-ios"` と記述されている。
[参照](https://github.com/aws-amplify/aws-sdk-ios/blob/master/README.md#carthage)
正しくは、Cartfileに `github "aws-amplify/aws-sdk-ios"` と記述しなければならない。

`aws-sdk-ios`の場合は、github apiでリダイレクトされ正しい結果が返されるのだが...
Carthage内部ではURLSessionを利用している。URLSessionは (Delegateを実装しなければ) 自動的にリダイレクトするのだが、リダイレクト時にAccessTokenがRequestに残っておらず、apiの利用制限に引っかかるという訳だった。

リダイレクトが発生する条件をGitHubに問い合わせました。
* アカウント間でリポジトリを移動したとき
* アカウント名を変更したとき
以上の場合にリダイレクトが発生するそうです。

---
2019/4/16 追記
aws-sdk-iosのREADMEは `2.9.5` で修正されました。
https://github.com/aws-amplify/aws-sdk-ios/tree/2.9.5
MeshRendererでSortingLayerIDやOrderInLayerを変更する拡張スクリプト

おそらく既出でしょうけど作ってみました！

Editor フォルダに下記スクリプトをいれる
MyMeshRendererInspector.cs

```csharp
using UnityEngine;
using UnityEditor;     
using System.Linq;


[CustomEditor(typeof(MeshRenderer))]
public class MyMeshRendererInspector : Editor
{
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        EditorGUILayout.BeginHorizontal();

        // sorting order
		SerializedProperty sortOrderProperty = serializedObject.FindProperty("m_SortingOrder");
		sortOrderProperty.intValue = EditorGUILayout.IntField("Sort Order", sortOrderProperty.intValue);

        // sorting layer
		SerializedProperty layerIDProperty = serializedObject.FindProperty("m_SortingLayerID");
        var index = System.Array.FindIndex(SortingLayer.layers, layer => layer.id == layerIDProperty.intValue);
        index = EditorGUILayout.Popup(index, (from layer in SortingLayer.layers select layer.name).ToArray());
        layerIDProperty.intValue = SortingLayer.layers[index].id;

        EditorGUILayout.EndHorizontal();
        serializedObject.ApplyModifiedProperties();

        base.OnInspectorGUI();
	}
}

```

Sorting Layer と Order in Layer が表示されるようになります。

![x.PNG](https://qiita-image-store.s3.amazonaws.com/0/136196/ad35d79c-061c-e399-3e11-4b6ee548c19f.png)

何か問題ありましたら教えてください！
Twilio Pay を使って電話決済を体験する(中級編) 続き

# はじめに
これは、2019/03/21(木・祝)開催 JP_Stripes Connect 2019のワークショップ『「電話でペイ！」(Twilio Pay)を試してみよう！』を行いました。こちらの内容は[Twilio <Pay> を使って電話決済を体験する(中級編)](https://qiita.com/takeshifurusato/items/af96ecc7ce69dec8f42c)で問題点を改善したものです。
なお、ワークショップ資料は以下です。

- [Twilio \<Pay> を使って電話決済を体験する(初級編)](https://qiita.com/takeshifurusato/items/b3e74383113c9723e11c)
- [Twilio \<Pay> を使って電話決済を体験する(中級編)](https://qiita.com/takeshifurusato/items/af96ecc7ce69dec8f42c)
- [Twilio \<Pay> を使って電話決済を体験する(上級編)](https://qiita.com/takeshifurusato/items/a3c4b0e2fdfba63186dd)

# 問題点
「[Twilio <Pay> を使って電話決済を体験する(中級編)](https://qiita.com/takeshifurusato/items/af96ecc7ce69dec8f42c)」では、作成したシステムでは、決済が発生した状況を、TwilioSyncを利用して保持しています。
しかし、この保持をするキーが同一であるため、複数の電話が同時に発生し、同時に決済を行った場合、その状況は、常に上書きされてしまいます。※決済自体は成功します。
今回この問題を改善します。

# 改善方法
まあご存知の通り、キーが同一で１箇所に保存してしまっていることが問題ですので、それを改善すれば良いです。
改善するためには、現在利用しているTwilioSync(Document)をTwilioSync(Map)に切り替え、着信毎にユニークなキー(CallSid)で、情報を保存します。またせっかく複数同時対応できるので、その状態もリストにすることにしました。


# TwilioSyncについて
例えばブラウザ間やアプリ間で情報をリアルタイムでやり取りするとき、自前で仕組みを作ったり、Firebaseなどのサービスを利用したりすると思うのですが、Twilio Syncでもそのようなリアルタイム通信をすることが可能です。しかも簡単に。
TwilioSyncは、いわゆるJSONだけではく、リスト形式やマップ形式のデータ構造を動悸することもできます。[Twilio <Pay> を使って電話決済を体験する(中級編)](https://qiita.com/takeshifurusato/items/af96ecc7ce69dec8f42c)では、Documentを利用し、JSON形式で保存していました。今回はKey-Valueとして取扱ができるMAPを使います。
なお、Syncは従量課金制で使った分だけ課金です。
くわしくは、Twilioエバンジェリストの高橋さんの記事が非常にわかりやすいので、ご参照ください。
[TwilioのRuntime Clientを使ってSyncをデータベースのように扱おう](https://qiita.com/mobilebiz/items/8f07cf5143c3851eb45d)

# こん感じです
改善した状態は以下のような画面になります。
### 一覧画面
<img width="494" alt="スクリーンショット 2019-04-08 11.43.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/110436/f1c9268e-2475-f971-77f0-73e24dd871c9.png">
この画面を開いた状態で決済を行うと、１電話につき１行増え、その行にステータスとCallSidが表示されます。決済を行うたびに行が増えます。

### 詳細画面
<img width="501" alt="スクリーンショット 2019-04-08 11.52.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/110436/dafe435c-b81a-2184-95a4-6eb99b0dbcc8.png">
こちらは、これまでの情報に追加して、CallSid、決済完了時のStripe側のキー、電話番号などが表示されるようにしています。

# ソースコード
取り急ぎ、以下に公開しました。
https://github.com/takeshifurusato/twiliopay_stripe_workshop
「[Twilio <Pay> を使って電話決済を体験する(中級編)](https://qiita.com/takeshifurusato/items/af96ecc7ce69dec8f42c)」を完了した状態であれば、ファイルを追加・置換することで動作します。

# 補足・まとめ

- Sync(Map)に登録するときのKeyは、着信時のCallSid(呼のユニークキー)を使っています。
- 詳細ページはURLParameterでCallSid(MapのKey)を指定させています。
- Sync(Map)を初めて使ってみたが、お手軽で便利です。
- Sync(Map)にはTTLを指定することができるが、消えるタイミングは正確ではないようです。(expiredで指定された日時から数分後〜数時間かかる)
- Syncは従量課金( https://twilio.kddi-web.com/price/sync/ )200時間までは無料です。
- 一覧・詳細画面を表示すると上記課金対象となる。複数ブラウザ・複数回更新毎に課金の対象となるので、URLの公開などに注意が必要です。
- Syncに登録されるタイミングが、カード番号入力後のStatusCallbackのタイミングであるため、電話受話直後にはSyncに登録されません（一覧画面に表示されません）。
- 上記を改善するためには、現状TwiMLBinsでTwiMLを出力しているが、これをFunctionsに切り替え、Syncへの登録とTwiML出力をする必要があります。
C++の共有ライブラリに苦戦。。。

とあるプロジェクトで共有ライブラリを利用してコンパイルを行うことにした。
しかし、作成方法から分かっておらず、初心者なりに試行錯誤して解決したので、それを備忘録として残しておく。

環境
ubuntu18.04
g++ 7.3.0

##1. 共有ライブラリって？
汎用性が効くプログラムの集まり。
共有ライブラリがあれば様々なプログラムから簡単に呼び出せる。
Linuxでは.so
Windowsでは.dll
という拡張子になっている。

##2. 作成方法
簡単な例を用いて説明する。

共有したい関数をhoge()としてプログラムを書くと、

```c++:share.cpp
#include <iostream>

using namespace std;

void hoge(void) {
    cout << "Hello,World!" << endl;
}
```

これを共有ライブラリにコンパイルを行う。

```bash
$ g++ -shared -fPIC -o share.so share.cpp
```
-shared これは共有ライブラリを作成するオプション。
-fPIC これはプログラムの再配置回数を少なくして、実行速度の高速化を行うオプション。
間違ってたら連絡をください。

##3. 使用方法
私が一番苦労したところだ。
私の環境ではネットの文献を写経してもうまく動作しなかった。
この記事のメインはここである。

まずは共有ライブラリを利用するためのヘッダーファイルとプログラム本体を提示する。

```c++:share.h
void hoge();
```

```c++:main.cpp
#include "share.h"

int main() {
    hoge();
    return 0;
}
```

ではコンパイルを共有ライブラリを利用して行う。

```bash
$ g++ -o main main.cpp share.so
```
これを実行するとmainという名前の実行ファイルが出力される。
これを実行すると 
Hello,World! 
と表示される。

##4. まとめ
ネットの文献では

```bash
$ g++ -o main share.so main.cpp
```
と書かれている。これを実行しても
undefined reference to `hoge()'
とエラーを吐かれてしまう。また、

```bash
$ g++ -o main share.so -c main.cpp
```
では
g++: warning: share.so: linker input file unused because linking not done
と吐かれ実行ファイルが出力されない。

g++ 7.X では文法が変わったのか？
詳しい方はご教授お願いします。

ありがとうございました。
#MicrosoftFlow 使いが #LogicApps をつかってシステム構築を行った際に詰まったこと（その１）

# はじめに

私元々Microsoft FlowやPowerApps を嗜みつつ、Logic Appsもその延長線上で使っていたぐらいなのですが、ちょっとしたプロジェクトがありまして

2週間でシステムを構築しなければならないというとんでもないものでして

かつ私はメインの仕事もしながらということで、実質作業時間100時間しかない
という、超タイトなスケジュールと相成りまして
Logic Apps以外取りえる選択肢がない状況でございました。

そして、超短期間ながらもなんとかシステムをこさえた私が
その中で出てきた色々な躓きどころを、全３回に渡ってご紹介しようと思います。

# 注意
題名はあたかもLogic Appに変わったことで云々な感じに捉えられがちですが
実際はMicrosoft Flowでも当てはまることもございますのでご注意ください。


# For each
複数のデータを元に順に処理していく
For Eachコネクタですが
ループ内で変数を使う処理を行った際
Microsoft Flowだと、１件ずつ処理するため問題ないのですが
Logic Appsだと、正しく処理されません。

## フロー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/f9a7f963-bd2d-6517-bb54-506364a75a51.png)

## 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/85f9b76d-851f-45ed-a86c-6263b2aa58cd.png)

## なぜこんなことが起きるのか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/bd6c735f-9f65-25c5-6a33-185a590098b0.png)

Microsoft Flowは既定では、各アクションが順次実行なのに対し
Logic Appsは既定では各アクションが並列実行されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/4f5c2124-8795-5244-99fc-182313d422b2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/20f54e04-0cbc-7b48-e1cc-da2e8c4590ca.png)

## どうすればいいのか？
コンカレンシー制御をオンにし、並列処理の次数を１にすることで対処可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/070da1b7-c456-0ef7-0939-08ad9b5db92f.png)

## ただしデメリットも・・・
並列実行のほうが圧倒的に処理は早いです。
ループ処理させる際は、変数を使わないようにするのが一番良いかと思います。
HTML5 プロフェッショナル試験 レベル1 を6日間で取得したので概要を語る

# 概要

先日、HTML5 プロフェッショナル試験 レベル1 [ver2.0] を受けて合格をしたので、忘れないうちにその内容や対策について書き綴ります。

# 受験当時の筆者のスペック

* サーバサイド寄りのエンジニア
* Web系は未経験
* Java等は最低限書けるし読める
* ApacheやTomcatの構築および設定はできる
* HTML,CSS,JavaScriptは業務で使用したことはほとんどないが、それぞれがどのようなものかは何となく知っている
* HTMLの超基本タグ(bodyタグとかaタグとかbrタグとか)やCSSの超基本(color:red;)くらいは知っている

# なぜHTML5試験を受けようと思ったのか

私は普段はサーバサイド寄りのエンジニアとして働いておりますが、最近フロントエンド系もやってみたいなーと思うようになりました。
ドットインストール等の動画を見たり、書籍を読んだりしてとにかくコードを書いていくというのもアリだとは思いましたが、まずは体系的にフロントエンド系の知識を勉強するのが良いと思いました。
試験を受けるとなれば当然勉強をしないといけません。ある程度の強制力がある中でフロントエンド系のスキル習得の第一歩を踏み出せればと思い、試験を受けるに至りました。

# 試験結果

81%(合格)
でした。
合格ラインは、私が受けたときは70%でした。
多分大丈夫かなーと思いつつ、若干の不安を抱えつつ、試験終了ボタンをクリックしました。
勉強期間は1日3～4h程勉強 * 6日間くらいです。

各セクションごとの正解率は以下となります。

* Webの基礎知識：92%
* CSS：86%
* 要素：66%
* レスポンシブWebデザイン：57%
* APIの基礎知識：100%

# 6日間の試験対策

## 使った参考書
下記の参考書を主に使いました。
[HTML教科書 HTML5プロフェッショナル認定試験 レベル1 スピードマスター問題集 Ver2.0対応](https://www.shoeisha.co.jp/book/detail/9784798154619)
Kindle版もあったのですが、最高効率で勉強を進めるためには電子書籍ではなく、紙の本にした方がよいと思います。
やっぱり吸収スピードが全然違います。

## 1日目、2日目
まずは参考書を1周読みました（最後の模擬問題以外）。
当然知らないことだらけなので、問題は解けなくて当たり前です。
最初から解答も見つつ、とにかくざっくりと読み進めていきました。
ちょっと良くわからなくて理解するのに時間がかかりそうな所は、もう一回読んだときにやればいいやーくらいのスタンスで、とにかく全体像をつかむことを心がけました。

## 3日目、4日目
参考書をもう一周(2周目)読み進めていきました。
今度はわかる問題も多少出てきたこともあり、1周目よりは楽に早く読み進められたと思います。
そして、1周目で曖昧になってしまったところを少し丁寧に読みました。
2周目が完了後、参考書の末尾にある模擬問題を解きました。
出来としては、70%でした。今受けたらギリギリ合格できないくらいかなーという感覚でした。
なお、模擬問題を解く際は、問題のページだけコンビニでコピーして、紙に書き込む形で解きました。
赤ペンで〇×をつけたり、解説の大事なところを書き込んだりもしました。
この紙だけあれば、模擬問題の内容は全部把握できるものを作ったつもりです。

## 5日目、6日目
上記の参考書は、特典として、Web上でダウンロード可能な模擬問題(1回分)がついていたため、この模擬問題を解きました。出来としては、こちらも70%でした。合格できるか微妙なラインだと思います。
こちらも、コンビニでコピーして問題を解き、赤ペンで〇×をつけ、解説の大事なところを書き込みました。
また、LPI-JapanのページでHTML5のサンプル問題も公開されているので、こちらも目を通しました。
[HTML5サンプル問題ページ](https://html5exam.jp/measures/sample.html)
普通に難しかったです。結構解けない問題がありました。
ここまでで、一通りの勉強が完了したので、あとは今までやったことの復習をしました。
以下を試験まで時間の限り復習した感じです。


* スピードマスター問題集
* 問題集巻末の模擬問題
* 問題集特典のWeb模擬問題
* HTML5サンプル問題

ここまでやっても、わかりにくい箇所は、ドットインストールの動画等で補強するのも良いかと思います。

# 試験を受けて思ったこと

## 全体的に思うこと

なめてかかっているとやられると思いました。
僕が受けた感覚としては以下です。

* 問題集やサンプル問題と同じような問題が20%くらい
* 問題集やサンプル問題の問題の背景をまあまあ理解していて解ける問題が 50%くらい
* HTMLやCSSの細かい文法等、重箱の隅をつついてくる問題が30%くらい

細かい部分や背景までそれなりに頭に入れておかないと、足元をすくわれると思います。

## 各分野について思ったこと

### 「Webの基礎知識」分野

私自身は業務でも触れる箇所なので、特別抵抗はなかったですが、下記は特に試験にも出されやすいと思います。

* リクエストメソッドとその内容(特にGETとPOSTは詳しくなっておくとよい)
* 主なステータスコード（404ならNot Foundなど）
* HTTPクッキーの仕様
* キャッシュの仕様
* HTML5で有効なDOCTYPE宣言
* Ajaxの仕組み

### 「CSS」分野

とにかく覚えることがたくさんあります。
プロパティがたくさんあって、100%覚えるのは至難の業であると思います。

* 問題で出てきたプロパティは覚える
* 問題で出てきたプロパティに関連するプロパティを覚える
* 試験までの時間で覚えられそうなプロパティを覚える

くらいが出来ると良いのではないかと思います。

### 「要素」分野(HTML)

この分野も覚えることがたくさんあります。
下記が重要だと感じました。

* 各要素がどんな時に使われる要素なのかを把握する
* 各要素で使える属性、各要素の記述においてやらなくてはならないこと、やってはならないことを把握する


### 「レスポンシブWebデザイン」分野

viewport、メディアクエリ、CSSスプライト、フルードグリッド、フルードイメージ等、各内容を混同しないように頭に入れることが大事だと思います。

### 「APIの基礎知識」分野

こちらもWeb Storage、Indexed Database API、Service Workersなどいろいろな要素が出てきます。
この分野の内容は実際にJavaScript等で動かしてみて初めて理解が深まるものなのだと思います。（たぶんレベル2の試験で出てくるのではないかと思っています）
各要素を混同せずにざっくりと内容および違いを理解しておけば十分だと思います。
CSSやHTMLのように重箱の隅をつついたような問題はあまりなく、素直な問題が多いと思いました。

# まとめ

本ページでは。HTML5 プロフェッショナル試験 レベル1 の概要について書き綴っていきました。
レベル1の知識を忘れないうちにレベル2の試験にもチャレンジしたいと思います！
Google Code Jam 2019予選A問題 問題訳及び回答例



#目的
転職活動も兼ねてGoogle Code Jam 2019の予選問題の簡単な日本語訳と回答例を載せてみます。
今回はとりあえずA問題だけ。B問題は正答できたので今後投稿予定、C問題は例題は通ったのに
テストケース1ではRuntimeErrorが出たので原因を確認中です。
D問題は解説を見ながら実装予定です。

##環境

* エディタ
 * Pycharm Community Edition
* 言語
 * Python 3.6

なお、自分はpython初めて数週間なので、気の利いた実装はしていません。

##問題1 Foregone Solution

<details><summary>大雑把な日本語訳(長いので折りたたみ)</summary><div>

###問題
CodeJam抽選会で当選者が発表された。当選額は**N**Jamコインだ！
だけどどうしよう、当選額の**N**コイン(整数)には少なくとも一回「4」の数字が含まれてるのに、僕のキーボードの「4」は壊れてる！

幸いなことに、方法がないわけではない。当選者に2つのチケットAとBを渡して合計**N**コインになるようにすればいい(要は$A + B = N$を満たせば良い)。ただし、その2つのチケットには「4」が含まれてはいけない。さあ、どうしようか。

###入力
最初の行でテスト件数**T**が与えられる。
各テストの入力は1行で、**N**が与えられる。

###出力
各テストケースごとに`Case #x: A B`の形で出力すること。
xは1から始まるテスト件数の通し番号で、AとBは問題の条件を満たすような正の整数である。
なお、AとBの組み合わせは必ず一つ以上存在する。

###制限
```math
1\leq T \leq 100
```
制限時間：各テストごとに10秒以内
メモリ制限：1GB
**N**の中には必ず一つ4の数値を含む

####セット1
```math
1 < T < 10^5
```

####セット2
```math
1 < T < 10^9
```
この2つの問題で十分だけど、余裕があれば次の問題もやってみてね。(配点はたった1点だよ)

####セット3
```math
1 < T < 10 ^ {100}
```
</div></details>

##自分の場合の考え方
<details><summary>ネタバレのため折りたたみ</summary><div>

+ Bを1からN/2までカウントアップさせ、条件を満たす場合を探していくと、おそらくセット2は間に合わない
 + $ N = 4 \times 10^8 + 9 \times 10^7$とかやられると大変な時間がかかる
+ 探している解答は一つだけなのでどんな数値でも分割できるルーチンを組めば良い

なら、各数字の桁ごとに4を含まないようにAとBに分割すれば解答が得られそう。セット3みたいに100桁あっても大丈夫。
</div></details>

##回答例

<details><summary>上記の考え方を素直にpythonに落とし込む</summary><div>

```python

N = int(input())

for i in range(N):
    S = input() # Sをintではなく文字列として読み込む。
    digitCheck = False # 念の為Bの数字が「0」から始まらないようにする
    AnsA = ""
    AnsB = ""
    for c in S: # 各桁の数値を文字列として取り出して処理する

    # cが2以上なら、Bの数値を1以上にしておく
    # Bに付け加える数値が1以上ならBの頭の数値が0になったときの処理が不要になる
        if int(c) > 1:
            digitCheck = True

    # 上からX桁目の数字を取り出してA,BのX桁目の場所に貼り付ける
        if c == "0":
            AnsA += "0"
            if digitCheck:
                AnsB += "0"
        elif c == "1":
            AnsA += "1"
            if digitCheck:
                AnsB += "0"
        elif c == "2":
            AnsA += "1"
            AnsB += "1"
        elif c == "3":
            AnsA += "2"
            AnsB += "1"
        elif c == "4":
            AnsA += "3"
            AnsB += "1"
        elif c == "5":
            AnsA += "3"
            AnsB += "2"
        elif c == "6":
            AnsA += "3"
            AnsB += "3"
        elif c == "7":
            AnsA += "5"
            AnsB += "2"
        elif c == "8":
            AnsA += "5"
            AnsB += "3"
        elif c == "9":
            AnsA += "8"
            AnsB += "1"
    print("Case #{}: {} {}".format((i+1),AnsA, AnsB))
```

</div></details>
Google CloudのCloud Runを試してみた

# Cloud Runとは
ServerlessにてContainerの実行環境を提供してくれるサービスで、Knativeをベースに構築されているようです。

# Tutorial
どのようなものか感覚をつかむために、一度試してみたいと思います。
## Cloud Runの有効化
Cloud Runサービスにアクセスし、有効化します。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/137264/4058a408-69a1-d77b-3b00-920ee32d556e.png)
## Serviceの作成
Cloud Runのコンソールに移り、Create Serviceをクリックします。
<img width="1382" alt="スクリーンショット 2019-04-09 7.15.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/137264/b3296120-c488-1ed8-bdd2-e0d5b5a52efe.png">

サービスの作成ページでは以下の入力項目が存在します。
・コンテナイメージのURL
・サービス名
・ロケーション
ロケーション（Region）については現在us-central1のみとなっています。
今回はチュートリアルなので、認証なしでデプロイしました。


<img width="782" alt="スクリーンショット 2019-04-09 7.03.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/137264/77b6a3e7-92cc-a674-e7e2-6add12dcff22.png">

その他オプションではメモリやリクエストのリミット、環境変数などを入力する項目がありました。

<img width="690" alt="スクリーンショット 2019-04-09 7.03.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/137264/e7636811-3754-22c5-8e52-350293f87d08.png">

## Deploy
デプロイを行うと、先ほど入力した情報に基づきコンテナデプロイ用のYAMLが発行され、デプロイが行われます。
外部公開用のURLなども自動で払い出されました。

[Deploy中]
<img width="1337" alt="スクリーンショット 2019-04-09 7.04.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/137264/957fb97e-084c-0217-84e0-62b4f0f2c624.png">
[Deploy後]
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/137264/e761a0ef-cc5e-26cb-c9b9-c084691141e7.png)

## 確認
払い出されたURLに対してアクセスをすると、WebSiteにアクセスすることができます。
リソースを管理しなくてもContainerの実行環境が用意されるのは嬉しいですね。

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/137264/9a8370d5-d9f8-f780-da32-4d6dda14104b.png)


# まとめ
Google Cloud Next 2019にて発表予定（？）のCloud Runの簡単なチュートリアルを試しました。
Cloud Run以外にも様々なサービスが出ると思いますので楽しみですね。
IPアドレスの基礎

#はじめました
忘れないために、この記事を書きます。
##IT知識の中でも忘れてしまっていた知識
数字がごちゃごちゃしているものとかが苦手です。
解く方法、解決方法を記す。
##IPアドレスとは？
IPアドレスとは、ネットワークに接続されているパソコンの住所のようなもの。
IPアドレスには、ネットワークアドレスとホストアドレスが含まれている
**IPアドレス=ネットワークアドレス＋ホストアドレス**
1.**ネットワークアドレス**
どのネットワークかを表すアドレス。
繋ぎたいパソコン・目的のパソコンはどこのネットワークにいるのかな？と確認する際にしよう。
2.**ホストアドレス**
ネットワークアドレスにより、関係あるパソコンのネットワークの場所がわかっても、どのパソコンなのかが判別できない。
そこで、ホストアドレスを見ることで、どのパソコンかパソコンを特定できる。
パソコンを繋げられる台数をホストアドレスから求めることができる。
3.**サブネットマスク**
サブネットマスクとは、ネットワークアドレスがどこまでで、ホストアドレスがここまで、という指標を決定するアドレス？
例えば　
192.168.0.2　　・・・IPアドレス
255.255.255.0　・・・サブネットマスク
とする
①それぞれ１０進数を２進数に直す。
11000000 10101000 00000000 00000010　・・・IPアドレス
11111111 11111111 11111111 00000000  ・・・サブネットマスク
②サブネットマスクが1である桁数とIPアドレスの同じ桁数までが、ネットワークアドレスのことを示している。
つまり、サブネットマスクは今回２４桁まであるので、IPアドレスの２４桁までがネットワークアドレスのことを示している。
この際に同じ桁同士で、掛け算(論理積)を行うことで、ネットワークアドレスを求めることができる。
したがって、ネットワークアドレスは
２進数表示 :11000000 10101000 00000000 00000000 ・・・ネットワークアドレス
１０進数表示: 192.168.0.0
が求められる。

※IPアドレスの問題などで、
例えば、192.168.2.0/24の中の「/24」は、左から２４桁までがサブネットマスクですよと示している。
※違っているかも？

※余談
なぜサブネットマスクが必要なのか？
ネットワークを振り分ける際に、**クラスフルアドレス**という考え方で振り分けていた、時がある。
これは、ネットワークアドレスとホストアドレスが固定されており、さらにクラスA、クラスBなどとクラス分けをしていた。
けど、ネットワークをつなぐ台数などがそれぞれのクラスで分けられており、不便な点があった。
そこで**クラスレスアドレス**という考えで、サブネットマスクが考えられた。
サブネットマスクの登場により、ホストアドレスを自分で設定できるため、繋げるパソコンの台数などを自由に変更することができるようになった。
という認識。

##例題
192.168.30.25/22のネットワークアドレスは？
１０進数→２進数
192.168.30.25を直すと→11000000 10101000 00011110 00011001
２２桁までがサブネットマスクだから、111111111 11111111 11111100 00000000これがサブネットマスクになる。
そして、分かりやすいように桁を合わせて、同じ桁同士で掛け算するとネットワークアドレスがまとまる。
11000000  10101000 00011110 00011001
111111111 11111111 11111100 00000000
↓
11000000  10101000 00011100 00000000　
２進数から１０進数に直すと
192.168.28.0　
これがネットワークアドレスである。

##終わりに
初めて書きました。
遅い時間に書きました。
間違ってるかもしれません。
間違っていましたら、コメント等で指摘してくださると幸いです。
(プログラミングに関係ないようなことを書いても良かったのかな？)
WinAppDriver用C#スクリプトの書き方メモ

WinAppDriverを使ってWindowsフォームアプリの自動制御する時の覚え書き。

Windowsフォームだからか日本語環境絡みなのか、Nameプロパティでオブジェクトを特定する場合は、FindElementByName()ではなく、FindElementByAccessibilityId()を使う必要がありました。逆に、FindElementByName()で読まれるのは、AccessibleNameプロパティのようです。FormデザイナーでAccessibleNameに適切な日本語記述がしてある場合、そちらを使うとテストコードが少し見やすくなるかも知れないですね。でもまぁ自分のアプリを評価する分にはコードと同じNameプロパティでWindowsElementオブジェクトを作って使う方が素直かも知れません。

```C#
private static WindowsElement TextBox1;
private static WindowsElement Button1;
private static WindowsElement CheckBox1;

[ClassInitialize]
public static void ClassInitialize(TestContext context) {
            // Create session to launch a Calculator window
            Setup(context);

           //オブジェクトのNameプロパティで選択
           TextBox1= session.FindElementByAccessibilityId("TextBox1"); 
           CheckBox1= session.FindElementByAccessibilityId("CheckBox1"); 

           //AccessibleNameプロパティで選択
           Button1= session.FindElementByName("ボタン1"); 
}

[TestMethod]
public void Test() {
            //ボタンをクリック
            Button1.Click();

            //テキストボックスに文字入力
            TextBox1.SendKeys("あいうえお"); //キー入力

            //スリープ（文字入力後は少し待たないと、.Textプロパティの戻り値が途中経過みたいになってFailするぽい
            Thread.Sleep(TimeSpan.FromSeconds(1));

            //テキストボックスの内容が期待通りか確認
            Assert.AreEqual("あいうえお", TextBox1.Text);

            //チェックボックスの状態は.Selectedプロパティ
            Assert.IsTrue(CheckBox1.Selected); //チェックされてればパス
            CheckBox1.Click(); //クリックして状態を変更
            Assert.IsTrue(CheckBox1.Selected); //ここでフェイル

            //その他、inspect.exeで取得できるプロパティは.GetAttribute()メソッドを使う
            Assert.AreEqual("あいうえお", TextBox1.GetAttribute("Value.Value").ToString());

        }

```
テキストボックスコントールはこれで取得／検証できたんですが、Labelコントロールだと表示内容はinspect.exeの画面ではどこにも出ていませんので、現状お手上げです。結果をLabelで出している場合、チェックができません。どなたか情報をお持ちでしたら是非コメントいただけれると有り難いです。
.begin()よりもstd::begin()を使うと配列とコンテナを同様に扱える

例えば, コンテナの要素に指定した条件を満たす要素が一つでもればtrue, そうでない場合falseを返す関数を作る場合, 以下の様にメンバ関数であるbegin,endを使うと, std::vectorやstd::arrayなど基本的なコンテナクラスには問題なく動きますが通常の配列ではコンパイルエラーとなります.

```c++

#include <algorithm>
// コンテナlist中の要素のうちpredicateを満たすものがあればtrue, そうでない場合はfalseを返す
template<class List, class Predicate>
bool any(List&& list, Predicate&& predicate)
{
  return std::find_if(list.begin(), list.end(), predicate) != list.end();
}

int main()
{
  std::vector<int> vec_list = {1, 2, 3, 4, 5};
  std::array<int, 5> array_list = {1, 2, 3, 4, 5};

  any(vec_list, [](int e) {  return e == 2;} );   //  => true
  any(array_list, [](int e) { return e == 2;});   //  => true

  int c_array[] = { 1, 2, 3, 4, 5};
  any(c_array, [](int e) { return e == 2; });     // => コンパイルエラー. c_arrayにbegin(), end()がない
}
```

というわけで グローバル関数であるstd::begin, std::end関数を使いましょう


```c++

// コンテナlist中の要素のうちpredicateを満たすものがあればtrue, そうでない場合はfalseを返す
template<class List, class Predicate>
bool any(List&& list, Predicate&& predicate)
{
  return std::find_if(std::begin(list), std::end(list), predicate) != std::end(list);
}
```



https://en.cppreference.com/w/cpp/iterator/begin
SpreadsheetからのJSONを出力（GoogleAppsScript無し）

スプレッドシート側の設定
http://creator.aainc.co.jp/archives/6240

久しぶりにPHP書いててみーんな忘れているけど、javascriptより慣れのせいか書きやすい
おかしな書き方や、オススメ等ございましたらご教授ください。

```PHP
$key="1cLaLSB7k7CaEs5e3WlT7x9bR-q2XlPJZ4dMyMSHhl7Q";
$worksheetId="ojpq4gm";
$url = "https://spreadsheets.google.com/feeds/cells/${key}/${worksheetId}/public/values?alt=json";
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); //文字化け防止
$aryObj=json_decode($json,true);

$aryObj	=	array_map( function ($ary) {return $ary['gs$cell'];}, $aryObj["feed"]["entry"] ); 	//gs$cellでフィルタリング
$aryHead=	array_filter( $aryObj, function ($ary) {return ($ary["row"]==1);}); 				//row=1でフィルタリングしてヘッダ取得
$aryCont=	array_filter( $aryObj, function ($ary) {return ($ary["row"]>1);}); 				//row=1以外でtable body取得

foreach($aryCont as $ary){			//本文
	foreach($aryHead as $aryH){		//ヘッダ
		if($aryH['col']==$ary['col']){			//同じX軸のヘッダと本文をマッチ
			$aryContents[ $ary['row']-1 ][ $aryH['$t'] ]	=	$ary['$t'];
		}
	}
}

$aryContents	=	
	array_map( function ($ary) {
		$ary["detail"] = json_decode(
			str_replace("\n", "\\n",							//JSON 改行問題
						str_replace("'",'"',$ary["detail"]))	//
			,true);
		return $ary;
	}, $aryContents );
//var_dump($aryContents);　//全表示

//フィルタリング
//$tarContents=array_filter( $aryContents, function ($ary) {return ($ary["field_name"]=="りんご");}); 

echo "<table class='table'>";
foreach($tarContents as $ary){
	echo "<tr>";
	foreach($ary as $ary_x){
	echo "<td>".$ary_x."</td>";
	}
	echo "</tr>";
}
echo "</table>";
```
競プロでやりがちなC++マクロでfor文を省略するお作法のC#版を考えました

## C++の省略for文

```.cpp
#define rep(i,n) for(int i=(0);i<(n);i++)

int main()
{
    rep(a, 10) rep(b, 10) rep(c, 10){
        if(a + b == c) break;
        cout << a + b + c << endl;
    }
}
```

## 僕が考えたC#の省略for文

```.cs
static void Rep(int n, Action<int> action) { for (var i = 0; i < n; ++i) { action(i); } }

public static void Main()
{
    Rep(10, a => Rep(10, b => Rep(10, c =>
    {
        if(a + b == c) return;
        Console.WriteLine(a + b + c);
    })));
}
```

すごい書きやすいかって言われたらそんなことないんですけど、`for(var i=0;i<N;++i)`って書くとループ用変数の`i`が3回も出てくるのがすごく嫌で、多重ループだと書き間違えてても気が付きにくいんですよね。命名で工夫すればいいという話もありますが、この方法なら記述量も少し減るので意外と悪くないかなーという感じです。

C++のマクロと違うポイントとしては、処理の中身がデリゲートなので`break`や`continue`が使えません。~~`break`は`return`で代替出来ますが、`continue`使いたいような状況だと少し不便そうです。~~

## おわりに

意見とか良い方法とかあったら教えてください。
他に思いついたら追記するかもしれないです。
Unity/Textureサイズメモ

## 画像用意
256x256の画像(ファイル名はsample3)を用意しTextureTypeをSpriteにする。
RGBA Compressed DXT5 64.0KBになった。
DXTC = DirectX Texture Compression
256px*256pxで65,536pxある。
bpp(bit per pixel)は64,000 / 65,536 = 0.9765625byteなので大体8bppなのかな。
<img width="461" alt="スクリーンショット 2019-04-09 22.37.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/f71ca0b6-c18c-83e3-9f3d-7b7321415597.png">


## Memory Profiler サイズチェック
この画像をuGUI/Imageコンポーネントにセットし、Memory Profilerでサイズチェックしてみる。
sample3を見てみると、3.1MB(Owned Size 3,239,604)と書いてある。
inspectorでは64.0KBと書いてあるのになぜ？
<img width="285" alt="スクリーンショット 2019-04-09 22.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/53c4e225-1f46-6f25-a1ab-54379cc2446d.png">

![スクリーンショット 2019-04-09 22.44.25.png](https://qiita-image-store.s3.amazonaws.com/0/278474/e656cd14-64c8-756d-6ba5-ae7baff334e6.png)


bppは3,239,604 / 65,536 = 49.4byteなので大体395bpp ???
圧縮が聞いておらずRGBA 32 bitになっているとしても変な数字だ。

## 実機(mac)で確認してみる。
Development BuildとAutoconnect Profilerにチェックを入れてBuild And Runする。
<img width="631" alt="スクリーンショット 2019-04-09 23.02.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/5f98cb50-5bef-e72b-3a79-cd1dfd5a1ce8.png">

Memory Profilerを見てみると、64.4KBになってた!
64,400 / 65,536 * 8 = 7.86 = 8bppなので無事圧縮が効いてるみたいだ。
<img width="962" alt="スクリーンショット 2019-04-09 23.02.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/2ea19f45-63fd-ca2c-9071-14356253c620.png">


## TextureFormatを見直す
Texture FormatをAutomatic -> RGBA 32bitにすると
メモリ使用率が0.5MB(524,756)になった。
RGBA 32bitなので1pxあたり4byteかかるとすると、4 * 65,536 = 262,144 = 0.2MBくらいになるかと思ったら0.5MB・・・？
<img width="303" alt="スクリーンショット 2019-04-09 23.10.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/6f784fe9-d267-4cf4-0d99-f39fe79b9407.png">

<img width="960" alt="スクリーンショット 2019-04-09 23.09.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/e740deb6-e779-3029-9896-979ba6360886.png">

これも実機(mac)で確認してみる。
64.4KBだった・・・・。
なぜこんなに軽いんだ。。。RGBA Compressed DXT5になっているから・・・？
<img width="968" alt="スクリーンショット 2019-04-09 23.16.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/6ed0b4d8-0491-64a6-248f-9db081ddd132.png">
論文まとめ：複数文書からの重要情報の抽出と表の生成

気になった論文を読み、自分なりにまとめるシリーズです。
# 複数文書からの重要情報の抽出と表の生成（鳥取大学、龍谷大学, 言語処理学会 2018）
http://anlp.jp/proceedings/annual_meeting/2018/pdf_dir/P2-7.pdf

###先行研究
word2Vecを用いて、wikipediaの城関連ページ→単語のみ→ベクトル→クラスタリング→表の生成

###本研究
word2Vecを用いて、wikipediaの城関連ページ→文章全体→ベクトル→(x-means法)クラスタリング→表の生成（各クラスタの重要度スコア算出）

* 単語→文章：単語では情報が不十分
* 整理した表の、列ごとの情報抽出の再現率62％→90％

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253276/dd00a25f-435d-673f-3a1c-d2b5cf6d4296.png)
(出典：上記論文)

###本論文の工夫箇所
* 一文に別の複数の内容が内包されているとき：人口は１０人で、面積は100m2。→「人口は10人」と「面積は100m2」に分解すべき。
    * 構文解析（例：KNP）→文意で、文節で区切る。
    * 格解析（例：KNP）→どうやら、各文章の末尾をうまく文章終了形に変形する。
    * 各文章の格要素ごとに、形態素解析→名詞だけ、品詞分類１が代名詞、数、非自立、副詞可能以外を抽出。
    * 単語ベクトルモデル：fastText(2層NN。隠れ層は単語の分散表現に相当。)。学習データは、wikipedia全記事、単語ベクトルは300次元。
 * 抽出した単語のベクトルの平均値を、その格要素ベクトルとする。
 * 格要素ベクトルの総和を文ベクトルとする。
* クラスタごとの重要度計算(Xmeans法)
    * 密集率の高いクラスタの重要度 ＞ 密集率の低いクラスタの重要度
        * クラスタ内の文章が互いによく似てる→密集してる
    * 多くの文章を含むクラスタの重要度 ＞ 少数の文章を含むクラスタの重要度
        * 100個の文章のうち、20個がk番目のクラスタに分類された→k番目のクラスタの重要度ck=20/100=0.2。
* 情報抽出の評価方法
    * F値使う。
* 以下、本論文が優れている例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253276/7be080f1-d765-d440-e948-6e2e965abf51.png)
(出典：上記論文)
[忘備録]ajaxのonで指定してイベントが２回目に動かない時

#発生した課題

-　```("#指定したID").on("イベント名",fuction())```がページを読み込んで１回目は動作するが、２回目では動作しないことで実装につまづいた

- 実装が汚い気がするが対応が完了したので忘備録として保存

#自称発生時のコード
- table内に配置された```<a>タグボタン```を押したら、押した行が削除される機能をajaxで実装していた
- ページを読み込んで１回目は動作するが、２回目以降```onclick```イベントを含め、発火がしなかった

```erb:問題発生時erbファイル
<% @user_todo_list.each do | todo |  %>
                    <tr>
                        <th><%= format_date(todo.clear_plan) %></th>
                        <th><%= todo.title%></th>
                        <th><%= todo.weight%></th>
                        <th><%= todo.set_count%></th>
                        <th><%= link_to "完了", complete_todo_path(todo), class:"btn btn-sm btn-primary", id:"complete-link", method: :patch, remote: true,data:{confirm: "完了ずみとして登録しますか?"}%></th>
                    </tr>
                <% end%>
```

```javascript:問題のjavascriptファイル
function complete_todo(){
    var completed_td_row = "";

    complete_link.on("click", function(){
        completed_td_row = $(this).parent().parent()[0];
    });

    complete_link.on("ajax:success", function(event){
        var data = event.detail[0].data;
        var flash = event.detail[0].flash;
        console.log(data);
        //table行番号を取得
        completed_td_row.remove();
        //グラフの更新
        show_graph();
    });

    complete_link.on("ajax:error",function(){
        var error_messages = event.detail[0].errors;
        var flash = event.detail[0].flash
    });

   
}
$(document).on('turbolinks:load', complete_todo);
```

#原因
- ```$(ID or 変数 or class).on```を指定した場合htmlが描画される時しか関連づかないらしい
- つまり２回目にボタンを押しても、すでに描画されている要素をクリックしているため発火しない

#解消策
- ```$(body).on(イベント名, "id",function(){}```で解決した
- キャッシュが原因しているっぽい?(GETメソッドではキャッシュする情報を得たがPATCHメソッドもキャッシュする?)
- 
```javascript:修正後javascriptファイル
function complete_todo(){
    var completed_td_row = "";

    $("body").on("click","#complete-link", function(){
        completed_td_row = $(this).parent().parent()[0];
    });

    $("body").on("ajax:success","#complete-link", function(event){
        var data = event.detail[0].data;
        var flash = event.detail[0].flash;
        console.log(data);
        //table行の削除
        completed_td_row.remove();
        //グラフの更新
        show_graph();
    });

    $("body").on("ajax:error","#complete-link",function(){
        var error_messages = event.detail[0].errors;
        var flash = event.detail[0].flash
    });

   
}
$(document).on('turbolinks:load', complete_todo);
```

#まとめ
- railsアプリ作成中に```on```で詰まってしまったので忘備録として記録
- 正確な理由についてまだ調査中のため判明したら追記します。
◆ SpringBoot+gradle REST+JSON形式のAPIを呼び出してみる

# ★ はじめに
環境構築メモにJavaのバージョンを書き忘れました。Java8になります。
こちらの記事も自分用のメモになります。

# ★ HelloWorld
最初なのでまず、画面に「HelloWorld」を表示させることから試してみます。
パッケージ構成は以下のようにしました。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154016/1040d9a8-1959-fe4d-2baa-8dced7a51ab3.png)

SampleProjectApplication.javaと同じ階層にアプリケーション層として`app`を作成。
さらにその下に`controller`を作成しています。

```java:RestApiController.java
package com.example.sample.app.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("api/sample")
public class RestApiController {

    @RequestMapping(value = "/hello")
    public String index() {
        return "Hello World!";
    }
}
```

プロジェクトを右クリック ⇒ `[実行(R)]` ⇒ `[4 Spring Boot アプリケーション]` の順に選択。
コンソールにログが出力されます。

`http://localhost:8080/api/sample/hello`にアクセスします。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/154016/a6212e42-59c8-9e6a-63b5-8a0f758a0f90.jpeg)

無事表示されました。

`@RequestMapping`の()内の記載ですが、`value`を省略したり、`path`と記載してもOKみたいですね。

# ★ HTTPメソッドの実装
HTTPメソッドがGETで、投げると誕生日石（月、名前、色）の情報を返却するメソッドを実装します。
`@RequestMapping`の`RequestMethod`は`GET`を指定します。

```java:RestApiController.java
package com.example.sample.app.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.example.sample.app.resource.BirthStone;

@RestController
@RequestMapping("api/sample")
public class RestApiController {

    @RequestMapping(value = "/getBirthStone", method = RequestMethod.GET)
    @ResponseBody
    public BirthStone getBirthStone() {
        BirthStone birthStone = new BirthStone("2月", "アメジスト", "紫");
        return birthStone;
    }
}
```
`app`の下に`resource`を作成し、誕生日石の情報を返却するために`BirthStoneクラス`を作成します。

```java:BirthStone.java
package com.example.sample.app.resource;

import java.io.Serializable;

public class BirthStone implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 月 */
    private String month;

    /** 名前 */
    private String name;

    /** 色 */
    private String color;

    public BirthStone (String month, String name, String color) {
        this.month = month;
        this.name = name;
        this.color = color;
    }
    
    // getter/setter記載略
}

```
Advanced REST ClientでAPIを呼び出した結果。

![cap_20190409_0001.PNG](https://qiita-image-store.s3.amazonaws.com/0/154016/7404688c-dd60-82d4-d9a1-07f6f8b7a2fb.png)

レスポンスが得られました。

HTTPメソッドが`POST`の場合は、`RequestMethod=POST`と記述します。
Ruby on Rails + Nginx + Unicorn + MySQL環境構築

■ アップデート
sudo yum update

■ 環境構築に必要なパッケージインストール
sudo yum install git make gcc gcc-c++ patch openssl-devel libyaml-devel libffi-devel libicu-devel libxml2 libxslt libxml2-devel libxslt-devel zlib-devel readline-devel mysql mysql-server mysql-devel ImageMagick ImageMagick-devel

■ リポジトリ追加
sudo amazon-linux-extras install epel

■ node.jsのインストール
sudo yum install nodejs npm --enablerepo=epel

■ rbenvインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source .bash_profile
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv rehash

■ Rubyインストール
rbenv install -v 2.6.2
rbenv global 2.6.2
rbenv rehash
ruby -v

■ githubからソースデプロイ

■ Unicornインストール
sudo yum install mysql-devel
gem install bundler
bundle install
vim config/unicorn.conf.rb

■ config/unicorn.conf.rb生成
vim config/unicorn.conf.rb

==
$worker  = 2
$timeout = 30
$app_dir = "/var/www/rails/mumu" #自分のアプリケーション名
$listen  = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir
$pid     = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
$std_log = File.expand_path 'log/unicorn.log', $app_dir

worker_processes  $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen  $listen
pid $pid
preload_app true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      Process.kill "QUIT", File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
==

■ Nginxインストール
sudo yum install nginx
sudo vim /etc/nginx/conf.d/smallmaker.conf
sudo chmod -R 775 /var/lib/nginx

■ MySQLインストール
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y
sudo yum-config-manager --disable mysql80-community
sudo yum-config-manager --enable mysql57-community
sudo yum install mysql-community-server -y

SET GLOBAL validate_password_length=4;
SET GLOBAL validate_password_policy=LOW;
set password for root@localhost=password('root');

■ MySQLユーザー作成
create user smallmaker@'localhost' identified with mysql_native_password by 'smallmaker';
grant all on *.* to smallmaker@'localhost';

■ データベース作成
CREATE DATABASE smallmaker DEFAULT CHARSET 'utf8';

■ unicorn 起動
 #unicorn_rails -c /var/project/smallmaker/application/config/unicorn.conf.rb -D -E production
unicorn -c /var/project/smallmaker/application/config/unicorn.conf.rb -D -E production

■ unicorn 停止
sudo kill -QUIT `cat tmp/pids/unicorn.pid`

■ nginx スタート
sudo service nginx start