OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】QRコード機能ライブラリのZXingを導入する際につまずいた話

#ZXingを使ってQRコードを読み取る
今回は、AndroidStudioでライブラリを導入する際につまづいた話をしていきます。
実装したかったのは上の見出し通りです。
ちなみに自分はまずAndroidStudioをインストールすることから始めた超初心者なんであったかい目でお願いします...。
今回導入するライブラリはかなり有名なライブラリ**zxing**っていうやつです。
Androidアプリ開発でQRコードの機能を追加するぞってなった時は結構な確率でこのライブラリを使用するのではないか、レベルのやつ。
実際に導入手順を説明しながら自分がつまづいた所を説明していきます。
取りあえず自分の環境を公開！

##環境
AndroidStudioversion : 3.6.2
MinSDK : 26
buildtoolversion : 29.0.3
compileversion : 29
language : Koltin

##実装
状態としては新しくプロジェクトを作成して何も触っていない状態から始めます。
こっちの方がわかりやすいし、いかんせんイラン設定してそのせいでエラーとか嫌ですしね。
さて、やっていきます。
###build.gradleに直接書いてライブラリを導入する。

まあ、自分は超初心者だったのでググりまくりました。その結果以下のコードをbuild.gradleに追記すればいいとのことだったので追記してみました。ちなみにこのbuild.gradleはappディレクトリ直下のやつです。

```kotlin:build.gradle(app)
dependencies {
    //他の設定

    implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
　　//↑ライブラリのバージョンはその時々の最新のものを使用してください。
    
}
```

はい。自分がつまづいたのはこの後です。
結構大抵のサイトではこの一文を追加したら大丈夫的なものが多かったけど、ある程度知識がある方ならここであることに気づくはずです。まあ、自分は超初心者だからそんなこと気づくわけがないですが。
このままビルドしてエミュレータで起動してみるとあら不思議、アプリが開かない（厳密にいうと起動瞬間クラッシュする）。

###なにがダメなのか？
では何がダメなのか。注目すべきはこのライブラリを構築している言語です。
そう。このライブラリはJavaで構築されているのです。そのためライブラリを導入したはいいがコンパイルできずにコンピュータが解釈できていなかったみたい。そのためこのライブラリを構築している言語をコンパイルする機能が必要。さて、解決方法がわかったらさっそく試してみましょう。

###build.gradle(app)に追記してエラーを解決する。
ようするにJavaのコンパイラを追加してあげればいいです。
以下のコードを追記します。

```kotlin:build.gradle(app)
android {
      //初期設定とかが書かれている
    compileOptions {
                sourceCompatibility JavaVersion.VERSION_1_8
                targetCompatibility JavaVersion.VERSION_1_8
                //↑これのバージョンも一応最新のものがいいかも
        }


```
これを追記してからもう一回ビルドしてエミュレータで起動してみると....
あら不思議クラッシュしない。どうやらコンパイラが追されコンピュータがライブラリを認識できたみたいです。（できない場合は空白や不要な文字、バージョンを確認してください）
一応これでこのライブラリの導入は成功。
あとは読み取りとかを各自追記していってください。

##最後に
このようにライブラリを導入する際はそのライブラリの構築言語にも注意する必要があるこが学べました。いかんせん自分は大学一回生なのでまだまだ知識が足りません。せっかくですし軽く自己紹介でもします。

筆者は大学生です。はい。バイトでエンジニアしてます。
インスタでは主にios開発やandroid開発、情報発信や記事の投稿通知、役立つ情報、日常を垂れ流したりしてますのでよかったらフォローしてください。多分フォロー返します。沢山の方と繋がれたらなとか思っています。
アカウント→**taaa_kundayo**
URL:https://www.instagram.com/p/B-j3-RJjPWJ/?igshid=poq7k5z6eo3n

では、記事は以上になります。
ありがとうございました！！
Xamarin.Formsで各コントロールに共通のスタイルを適用する方法（2）

# 概要
[(1)](https://qiita.com/sukkyxp/items/d25eee58e634800ad3e1)の続編なので、まずは前編を読んでいない場合は前編を参照して欲しい。
ここでは、共通スタイルをControlTemplateの仕組みを使って実装する。
今回は、ControlTemlateに各コントロールのスタイルを定義することによって、各画面のコントロールのスタイルを共通化する方法を紹介する。

## ControlTemplate用にContentPageを作成する

Controlsフォルダーを右クリックして「追加」「新しい項目...」をクリックして表示されるダイアログで「コンテンツページ」を選択して名前に「MyTemplatePage.xaml」を入力して「追加」をクリック。

作成された「MyTemplatePage.xaml」で次の通り入力する。
下記の入力により「Label」コントロールのデフォルトのスタイルを適用できる。

```xml:MyTemplatePage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="CustomeControlTest.Controls.MyTemplatePage">
    <ContentPage.Resources>
        <Style TargetType="Label">
            <Setter Property="FontSize" Value="26" />
            <Setter Property="TextColor" Value="Black" />
            <Setter Property="BackgroundColor" Value="GreenYellow" />
        </Style>
    </ContentPage.Resources>
</ContentPage>
```

MainPage.xamlは次のように書き換える。
まず、ルート要素をMyTemplatePageを使用するように書き換える。
名前空間は、「xmlns:controls」でMyTemplatePageを参照可能なように指定する。
ルート要素の「controls:MyTemplatePage」を指定することでこのページのテンプレートとしてMyTemplatePageが参照される。

```xml:MainPage.xaml
<?xml version="1.0" encoding="UTF-8"?>
<controls:MyTemplatePage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="clr-namespace:CustomeControlTest.Controls"
             x:Class="CustomeControlTest.MainPage"
             Title="Access template element demo"
             >

    <StackLayout Margin="20, 20, 20, 0" BackgroundColor="LightBlue">
        <StackLayout Orientation="Horizontal">
            <Label x:Name="Label1" Text="222" WidthRequest="200" />
            <Entry Text="入力"/>
        </StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label x:Name="Label2" Text="Test2" WidthRequest="200" />
            <Entry Text="入力"/>
        </StackLayout>

    </StackLayout>

</controls:MyTemplatePage>

```

## 表示結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197947/3dd3be73-77e4-7e73-7e26-59ff10fe710b.png" width="300px">
pythonで型指定。例外も投げる

```
class 型判定でエラー(Exception):
    def __init__(self, 理想, 現実): super(Exception, self).__init__(str(理想)+'型がよかったのに'+str(現実)+'型が渡されました')
class 型が:
    def __init__(self, 型): self.型 = 型
    def か判定(self, インスタンス):
        if isinstance(インスタンス, self.型): return インスタンス
        else: raise 型判定でエラー(self.型.__name__, type(インスタンス).__name__)        
```
を書いて、
`foo = 型が(hoge).か判定(var)`
と書くと、
`var`が`hoge`型か調べてくれる。
`var`が`hoge`型なら何もしないが、
`hoge`型でなければ例外を投げる。



```
class 型判定でエラー(Exception):
    def __init__(self, 理想, 現実): super(Exception, self).__init__(str(理想)+'型がよかったのに'+str(現実)+'型が渡されました')
class 型が:
    def __init__(self, 型): self.型 = 型
    def か判定(self, インスタンス):
        if isinstance(インスタンス, self.型): return インスタンス
        else: raise 型判定でエラー(self.型.__name__, type(インスタンス).__name__)        

class 犬:
    pass
class 猫:
    pass

def 首輪をはめてお外へGO(ワンちゃん):
    型が(犬).か判定(ワンちゃん)
    print('散歩だわんっ！')

print("1匹目");　首輪をはめてお外へGO(犬())
print("2匹目");　首輪をはめてお外へGO(猫())

```

は次のようになる。

```
1匹目
散歩だわんっ！
2匹目
Traceback (most recent call last):
  File "D:\sd_4年前期\4年前期\SUDAP3_-1\cgi-bin\Typer.py", line 19, in <module>
    print("2匹目");首輪をはめてお外へGO(猫())
  File "D:\sd_4年前期\4年前期\SUDAP3_-1\cgi-bin\Typer.py", line 15, in 首輪をはめてお外へGO
    型が(犬).か判定(ワンちゃん)
  File "D:\sd_4年前期\4年前期\SUDAP3_-1\cgi-bin\Typer.py", line 7, in か判定
    else: raise 型判定でエラー(self.型.__name__, type(インスタンス).__name__)
型判定でエラー: 犬型がよかったのに猫型が渡されました
```
ブランド iphone se2(2020新機種)ケース gucci chanel

#人気ブランドアイフォンse 第２世代ケースをはじめ
シャネル、グッチ、ヴィトン、グッチ、モスキーノなどiPhone SE(第2世代)ブランドケースが充実！iPhone SE(第2世代)ケース、スマートフォンカバー・スマホケースならcomkabaへ
![uploading-0](http://www.comkaba.com/image/cache/catalog/product/ME08067/500-1-500x633.jpg)

http://www.comkaba.com/brand-iphone-x-8-xs-case
http://www.comkaba.com/brand-iphone-se-2020-case

line id：kiticase
【WordPress】カスタム投稿タイプ プラグイン Custom Post Type UI　※備忘録

<h2>はじめに</h2>
現在、WordPressの案件を担当しているため、勉強したことをまとめていきたいと思います。

今回は、カスタム投稿について。
<h2>カスタム投稿タイプとは?</h2>

<h3>そもそもの投稿タイプ</h3>

WordPressは、デフォルトで投稿と固定ページという2つの投稿タイプがある。
※厳密には、5つある。(内部で含まれるものを含めると)


<h4>投稿</h4>
blogのようなコンテンツを作成できる
例)お知らせ、ニュース、コラムなど。

★できること
・カテゴリー・タグによる投稿の関連付けができる
・投稿一覧、カテゴリー一覧、タグ一覧から各ページを一覧表示できる
・複数のblogタイプ(カスタム投稿タイプ)を作ることができる

★できないこと
・投稿同士で親子関係を作ることができない
・ページごとにデザインテンプレートを選択することができない


<h4>固定ページ</h4>
ページ単体で完結できるようなコンテンツを作成。
例)トップページ、会社情報、お問い合わせ、アクセスなど。

★できること
・固定ページ同士で親子関係を作れる
・ページごとにデザインテンプレートを作成・選択できる

★できないこと
・固定ページ一覧、カテゴリー一覧などで各ページを一覧表示できない

カスタム投稿タイプは新たに別の「投稿」を作る機能。

<h2>カスタムタクソノミー(カスタム分類)とは?</h2>
投稿における「カテゴリー」や「タグ」の「カスタム投稿タイプ版」のこと。

WorPressでは、カテゴリーや分類のことを「タクソノミー」と呼ぶ。
カスタム投稿タイプのように、独自い作成した分類のことを
「カスタムタクソノミー(カスタム分類)」と呼ぶ。

<h2>カスタム投稿タイプの作り方</h2>

・「プラグインを利用する」
・「functions.phpにコードを記述する」

<h3>プラグインを利用して作る方法</h3>

～Custom Post Type UIで作る方法～

1.管理画面のプラグインからインストール

2.「CPT UI」という管理画面のメニュー項目から「投稿タイプの追加と編集」をクリック。

・投稿タイプスラッグ
・複数形のラベル
・単数形のラベル

上記3つを入力する。

「投稿タイプスラッグ」
各投稿タイプのURLになる部分。

https://独自ドメイン/投稿タイプスラッグ/各記事のパーマリンク

ラベルは、管理画面の左側メニューに表示されるメニュー名。

「アーカイブあり」
一覧ページを作るかどうかの設定
デフォルトでは、Falseになっている


「サポート」
投稿ページで表示させるパーツを選択する・
例)タイトルやエディター、アイキャッチなど。
なし以外の前部にチェックを入れると通常の投稿ページと同じ入力画面になる。

「利用するタクソノミー」
カテゴリを利用したい場合、チェックを入れる。
(WPコア)が入っているタクソノミー(分類、カテゴリー)を選択すると、通常の投稿ページで利用しているカテゴリーやタグを利用できる。

また、カスタムタクソノミーを別途追加した場合は、それも選択できる。

<h3>function.phpを直接編集する作り方</h3>

function.phpに追記して作成する。
各設定項目を追加する場合は、「ワードプレスCodexの関数リファレンス」を参照する。

function.phpから作成して、カスタム投稿タイプのページが表示されない場合は、
設定＞パーマリンク設定を確認する。

<h2>パーマリンクとは?</h2>
Webページ毎に設定したURLのこと。

例)https://www.test.com/sample/cate1/
パーマリンクは、.com/以降のsample/cate1/

パーマリンクは、Webサイトのカテゴリ構造に沿って決める。

パーマリンクのカテゴリからスラッグの設定が可能。


<h2>参考サイト</h2>
https://webst8.com/blog/wordpress-custom-posts/
https://uruchikara.jp/howto-custom-post-type/
Spring Boot + MyBatis データベース設定ないとこんなエラー出る

```
Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
	If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
	If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
```

Spring Bootだけなら動いたのにdependenciesにmybatis入れると起動時にエラーが出た。
データソースの設定がないからだった。

# 解決

application.propertiesもしくはapplication.ymlにデータベースへの接続情報を指定すると解消した。
https://start.spring.io/ でプロジェクト生成するとsrc/main/resources/application.propertiesが生成されるがapplication.ymlにしてもOK。

MySQLの場合はこんな感じ。

```yml:application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mysql
    username: devusr
    password: devpass
    driver-class-name: com.mysql.cj.jdbc.Driver
```
RustのCopy,Clone,Dropのメモ

# Copyトレイト

変数への代入や関数の引数に渡したりするときに、メモリのビット単位のコピーにより複製が作られる。
基本型、基本型のみのタプルと構造体など、主にサイズが小さい構造体などに使う。

`Clone`トレイトも同時に実装しなければならないが、コピーする際に`clone()`が暗黙的に呼び出されるわけではない ([参考](https://zenn.dev/techlead/articles/2025-01-26-rust-book-effective-rust))。
メンバがすべて`Copy`でないといけない（基本型はすべて`Copy`を実装している）。
`Drop`トレイトとは競合する。
`Drop`トレイトに適合する型を持つ構造体に`Copy`注釈はつけられない。

# Cloneトレイト

基本的にはdeep copyを実装する。
基本型についてはdeep copyとshallow copyに違いがないので、暗黙に`clone`される。

# Dropトレイト

所有権を持つ変数がスコープから抜けるときに`drop`が実行される。
主にヒープに保持される型、もしくは、それらの型をメンバに含む場合に使用される。

`Copy`トレイトとは競合する。

# 関数に引数で渡したり、変数に代入した場合

- `Copy`を実装している場合：メモリのビット単位コピーで複製が作られる。
- `Copy`でない場合：所有権が移動される。
  - 複製(deep copy)を作る場合は明示的に`clone`を呼び出す。
  - ムーブでないshallow copyをしたければ`Rc`を使わなければならない。
netstatで通信の接続状況を定期監視し可視化

# はじめに
以前投稿した「[netstatで通信の接続状況を定期監視](https://qiita.com/curvaceous410/items/f12b86c5464894855938)」では、netstatの結果をファイルに書き出すまででしたが、今回は接続先毎に状況を可視化できるようにしてみました。

# 必要なもの
  - [Git for Windows](https://gitforwindows.org/)(Git Bashを利用します)
  - Microsoft Excel(グラフを描画します)

# 監視スクリプト

```bash:netstat_monitor.sh
#!/bin/bash
output_file=`date '+%Y%m%dT%H%M%S'`.tsv
echo "output: ${output_file}"
echo -e "datetime\tserver\tcount" > ${output_file}

while :
do
  date_now=`date '+%Y%m%dT%H%M%S'`
  netstat -an | egrep "ESTABLISHED|CLOSE_WAIT|TIME_WAIT" | awk '{print $3}' | sort | uniq -c | awk '{printf("%s\t%s\n",$2,$1)'} | sed "s/^/${date_now}\t/g" >> ${output_file}
  echo ${date_now}

  sleep 5
done
```

ポート番号をカットしてサーバー毎にカウントする場合は```awk '{print $3}' | sed "s/:[0-9]\+$//g" | sort |
```のようにすると良いと思います。

Linuxの場合は```awk '{print $3}'```を```awk '{print $5}'```にします。

```:実行例
$ ./netstat_monitor.sh
output: 20200419T141531.tsv
20200419T141531
20200419T141537
20200419T141542
20200419T141547
20200419T141552
20200419T141557
20200419T141603
:

停止するには[CTRL]+[C]
```

# Excelでグラフ化
出力されたtsvファイルをExcelに取り込み、ビボットテーブルで集計し、折れ線グラフで可視化します。

## Excelに取り込み
![tsv.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520304/b3937367-b9dc-aed3-886f-ce53efe80b59.png)

## ビボットテーブルで集計し、折れ線グラフにする
下図のように、ビボットテーブルのフィールドを設定し、集計結果を基にグラフ化します。
![グラフ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520304/949eb713-5631-50df-60ba-9b65971b7b13.png)

今回のサンプル例は、C# HttpClientのマルチスレッド・プログラムで某サイトにアクセスした結果です。一気に600ポート消費しています。その後、プログラムを停止し消費ポート数が減っていくのが分かります。

# 参考文献
  - [TCP/IP通信の状態を調べる「netstat」コマンドを使いこなす (1/2)](https://www.atmarkit.co.jp/ait/articles/0207/20/news003.html)
AWS Cloud9で開発環境を立ててみた

こんにちは！モリタケンタロウです！
今回はAWSのCloud9というサービスを使って、クラウド上に開発環境を構築する方法について紹介します。

# AWS Cloud9 とは？
非常に面倒くさがりの僕は、自分のPCに色んなエディタとかプログラミング言語とかをインストールするのが嫌だったので、コーディングも実行もデバッグも全部ブラウザで済ませたい！と思って見つけたのが、この「**AWS Cloud9**」というサービスです。
AWS Cloud9はブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。[※詳細はコチラ](https://aws.amazon.com/jp/cloud9/)
ちなみに料金ですが、サービス自体の料金は無料！ただし、コードの実行やデータの保存で使うEC2（仮想マシン）やEBS（仮想ディスク）などのリソースには従量課金でお金がかかってしまうので要注意です！
![ec2price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/321c7654-6498-f087-f13d-41f11cc495b6.png)
ですが、AWSには太っ腹な[無料利用枠](https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)があるので、アカウントを新規作成することで、一年間は、派手に使わなければ十分使えます(^^)

# 導入手順
ということで早速Cloud9で開発環境を立ててみます。
まずはAWSの[マネジメントコンソール](https://aws.amazon.com/jp/console/)にログインします。
![awsmc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/28ba9803-e463-8a58-791b-596f49e9c8d1.png)
そして「サービスを検索する」に「Cloud9」と入力してCloud9のページにアクセスします。
![searchcloud9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/5316c547-be72-8312-ffec-1243a05c678e.png)
Cloud9にアクセスするとこんな画面（英語…）が出てくるので「Create environment」をクリックします。
![cloud9home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/49f3fe46-7081-1fac-9c93-92cbd206eaf1.png)
そうすると、これから作る新しい開発環境について、かたくなに英語で色々聞かれるので、適当に入力していきます。
例）Name（開発環境名）: moriken_env
![newenv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/a237989f-0a38-d96d-ff60-2346fb546eef.png)
とりあえず一番簡単そうなやつを選んでいます。
ちなみに、「Cost-saving setting」ってやつは、仮想マシンを一定時間触ってなかったら一旦落とすよ？という従量課金のコストを抑えるための設定みたいです。
![envparam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/7d183d8f-05f8-234e-67de-b2b0694c033c.png)
全部入力して確認したら、「Create environment」をクリックして環境を構築します。
![envconf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/5073a82a-c44e-c5e4-ad10-df865c120d73.png)
そうすると…見事、クラウドに開発環境が構築できました！！
![cloud9dev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/bd142172-d3c1-bb64-86eb-eefad60956b1.png)
めちゃくちゃ簡単でした(笑)
今後はここを使って色々とものづくりしてみようと思います！！
それでは～
DockerでAWScloud9もどきを構築した話


windowsの開発環境を整えるのは難しいし、あんまり汚したくない。でもmacは持っていないという人（私）のためにcloud9環境を整える。
##この記事のメリット
・AWScloud9（ぽい）がタダで使用できるようになる。
・環境構築を０からやるよりはやりやすい。
##環境のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/79c7fd0e-3b07-1b9b-8620-be1e6a7698ff.png)

##Dockerを使える前提で進める
###file構成
```
./
├docker-compose.yml
└Dokcerfile

```
```docker-compose.yml
version: "3"

services:
  cloud9:
    build:
      context: "."
    ports:
      - "8181:8181"
      - "8000:8000"　#必須ではない
    command: "node /c9sdk/server.js -w /c9sdk/workspace --port 8181 --listen 0.0.0.0 --auth usr:passwd"

```

```Dockerfile.
FROM amazonlinux:latest

RUN yum groupinstall -y development　#c

RUN curl -sL https://rpm.nodesource.com/setup_10.x | bash -

RUN yum install -y git development glibc-static which nodejs　#cloud9-sdkを立てるための必要最低限のモジュール
RUN git clone https://github.com/c9/core.git /c9sdk && cd /c9sdk && scripts/install-sdk.sh #cloud9-sdkを立てる

RUN mkdir /c9sdk/workspace

WORKDIR /c9sdk/workspace

EXPOSE 8181

```

###実行コマンド
```
docker-compose up -d --build
```

ブラウザーから[https:(仮想マシンIP):8181](http://...)に接続


##完成図
<img width="960" alt="2020-04-19 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/0aa0c482-3b10-bb3a-5be7-7c6fc3cc0bbc.png">

##感想
使い捨てのlinuxPCが手に入った感じ。満足。vimを使わなくて済む。

##ついでに
djangoの起動を試してみた。いい感じ。
![2020-04-19_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500962/4f6fda43-69ab-8355-5a13-f61d3a5fa725.jpeg)

###参考にした記事
>「cloud9をwindowsにインストールして、幸せになる」https://qiita.com/naniwaKun/items/b7b45a6e6ed33ce81eb9
>「DockerでCloud9」https://qiita.com/fkmt-disk/items/8715e964e1e672b59454
速攻python3で簡単メール送信

# python３でメール送信

## 環境
* モジュールは`smtplib`を使用します。
* SMTPはGメールを使用します。

## ソース
```main.py
import smtplib
from email.mime.text import MIMEText

TO_ADDRESS = "送信先アドレス@gmail.com"
FROM_ADDRESS = "送信元アドレス@gmail.com"
MY_PASSWORD = "送信元アドレスのパスワード"

def send_mail(msg):
    try:
        smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
        smtpobj.ehlo()
        smtpobj.starttls()
        smtpobj.ehlo()
        smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
        smtpobj.sendmail(FROM_ADDRESS, TO_ADDRESS, msg.as_string())
        smtpobj.close()
        return True
    except:
        return False

if __name__ == '__main__':
    msg = MIMEText("テスト本文")
    msg['Subject'] = "テスト"
    msg['From'] = FROM_ADDRESS
    msg['To'] = TO_ADDRESS

    result = send_mail(msg)
    print(result)
```

## 使用方法 
1. モジュールのインストール`pip3 install smtplib`
2. スクリプト実行`python3 main.py`

## 結果
`True`
【UE4】ポストプロセスの作り方【PostProcess】【UnrealEngine】

画面全体の映像に効果(ポストプロセス)を掛けたいけどどうすればいいのか分からないという方に向けて
今回は映像効果が画面に反映されるまでの簡単な実装工程を紹介します。

![blur.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/d6e19244-e14e-5d3d-4a66-0c7092125091.png)
![monokuro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/d34f50e4-d7ad-cbcb-9178-0dd7608b7273.png)
↑こういうことが出来る


1.ポストプロセス用のマテリアルを作成
-----------------------------------------------
####マテリアルを作成し、詳細からマテリアルドメインをPostProcessに変更します。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/223b7d0f-f212-594b-8cc1-e3ceba2b1810.png)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/5cefefe5-2e7e-328c-8155-22610ec27d08.png)

画面のぼかしや縁取りなどの効果はマテリアル内で作れます。今回はシンプルにスクリーンを赤っぽくする効果を作ります。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/1b62c7fd-a3f2-47c8-86f5-99f8c3e26ad8.png)
スクリーンの色の情報があるSceneTextureのIDをPostProcessInputに切り替え、色の出力先となるエミッシブカラーに繋ぎ合わせます。

[IDがSceneColorのままだとエラーになる説明](https://emotion92.blog.fc2.com/blog-entry-329.html)

2.ポストプロセスボリュームを画面に配置
-----------------------------
![PostProcess.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/48e746ce-a274-cdda-c417-b0204101c03f.gif)

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/77ab1db9-5d24-7e0f-c1de-d61312ba6475.png)
ポストプロセスボリュームの詳細から Rendering Features ->Post Process Materialsに自分の作ったポストプロセスマテリアルを入れてボリューム内にカメラを入れれば完成。

結果
-------
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/fb53ca5e-7a37-e73d-13bd-db4a58e136ce.png)
無事に画面全体を赤くすることが出来ました。
後はマテリアルの処理を変えるだけで色々な効果を掛けることが出来そうです。

参考サイト
---------------
https://docs.unrealengine.com/ja/Engine/Rendering/PostProcessEffects/PostProcessMaterials/index.html
【質問】ホームページのオーバービューの消し方について

ワードプレスで作成し、公開したホームページなのですが、画像の上にマウスカーソルを載せるとビューのようなものが表示されてしまいます。
消し方を調べたのですが前例がなく、わかりませんでした。
どなたかご存知の方、教えていただけましたら幸いです。
「ロゴ＋文字(ZZOO)_g-グレー」となっているところです。
<img width="697" alt="スクリーンショット 2020-04-19 15.16.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550517/e10fa2a3-4336-4c6e-914c-9f9f86ec13b9.png">
Macのクリップボードの改行を消すコマンド

# 環境
- macOS Catalina 10.15.4

# コマンド
このコマンドでクリップボードの改行を消すことができる。

```zsh
$ echo `pbpaste` | pbcopy
```

# 自作コマンドにした
`~/bin`に`nn.sh`というファイルを作り、先ほどの一行を書き込んだ。（nnは`No \n`という意味を込めた。）

```nn.sh
echo `pbpaste` | pbcopy
```

`.zshrc`にエイリアスを書き込む。(bashの人は.bashrc)

```zsh
alias nn='sh ~/bin/nn.sh'
```

`.zshrc`をアクティベート。

```zsh
$ source .zshrc
```

これで何かしらをコピーしたときに、`nn`コマンドを実行することでコピーした文章から改行コードが消える。

```zsh
$ nn
```
でんき家計簿 vs おうちモニター

なんと東京電力は、2021年1月31日に突如としてでんき家計簿のサービスを停止して、後継のサービスにアカウントも引継ぎも行っていません。こんな蛮行が許されてよいのでしょうか？

でんき家計簿相当のサービスがWEB検診票についているようのですが、私の契約では見ることができません。

![スクリーンショット 2021-06-29 8.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/72f02b12-c7b4-443e-06c4-97eb2feb6d23.png)


事あるたびに書いているのだが東京電力がAルートで収集しているデータのユーザ閲覧サイト「でんき家計簿」がとってもいけてない。

でんき家計簿

![スクリーンショット 2020-04-19 14.46.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/05627c40-47f6-5107-14d3-1a3f8d0e0b63.png)

30分おきのメーター値の変化をグラフにしているのだが、これ見て分かりますか？30分ごとにデータ取ってるからそのままグラフにしても意味がない。当日のグラフは見ることができず、前日のデータも朝一では反映されていない。

我が家のBルートで収集したデータの「[おうちモニター](https://qiita.com/yamori813/items/776ce00bedb558450490)」のグラフはこんな感じです。

![filename-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/992f65f1-c307-5ea4-ab43-b67a8276ceba.png)

Bルートで10分おきにメーター値をとっていて、もちろん当日分も確認できます。

いろいろ考えてkWhを軸に時間を集計してみました。

![filename-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8fc08d39-1f06-d3c1-ea31-15b1ae97bf56.png)

我が家は消費が少ないのでまとまりの良いグラフになります。

「でんき家計簿」では月ベースのグラフは確認できるが日ごとのグラフがない。「でんき家計簿」の月別のグラフと時間別のグラフのデータはおそらく別のテーブルになっていて、料金確定時に月別のテーブルがアップデートされているのではないかと考えられる。上のページの前日のナビゲーションをクリックしていくと、かなりさかのぼれるようなので、すべてのデータがページサーバからアクセス可能なのではないかと思われるのだが。

我が家の「おうちモニター」はではこんな感じで表示できる。

![filename-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/323639be-c065-668f-cea6-a240be37f37e.png)

Bルートで収集したデータを利用して省エネのアドバイスをするような[サービス](https://nature.global/jp/nature-remo-e)もあるようだが、それほど複雑なことではなく、またすでにあるデータで実現できることだと思う。

「でんき家計簿」と同様のサービスの東北電力の「よりそうｅねっと」には日ごとのグラフはあるが請求済みのデータしか反映されていないため、直近のデータは見れません。どこもかしこもやる気なさ杉。

これは電力会社は実入りが減るから実は節電はして欲しくないわけで、行政がしっかり監督してないからそういうことになってるんだと思う。
find、locateコマンドまとめ

#はじめに
ファイル操作はほとんど`git grep` で行っており、基本的な事をおざなりにしてしまっていたので、
もう一度復習しようと思い調べることにした。

##find

findはその名の通りディレクトリーツリーからファイルを探す方法である。
基本形は下記である。

```
＄ find (検索開始ディレクトリ)（検索条件）（アクション）
```

##検索条件
###-name
```
$ find . -name file-1.txt -print
```

```
./file-1.txt
```

その名の通り名前で検索。ただし、ワイルドカード（*?）を使う場合、Bashの変数展開で読み込まれてしまうので必ずシングルクォートまたはダブルクォートをもちいること。

※検索条件（-name）には(-iname)というものもあるが、こちらは(-name)と違って`大文字小文字を区別しない。`


###-type
```
$ find . -type d -print
```

検索条件の（-type）もその名の通りタイプ名で検索します。
`-type d `の`d`はファイル種別で、上記だと`現在の位置からデレクトリだけを探す`という命令になります。

なお下記のように組み合わせて使うことも可能です。(-aはAND検索で、省略可能。)

```
$ find . -type f -a -name '*.txt' -print
```


####検索できるファイル種別

指定|ファイル種別
---|---
-type f|通常ファイル
-type d|ディレクトリ
-type l|シンボリックリンク
###アクション
現在すべて`-print`で表示させてますが、`-ls`で表示すると「ls」形式で表示されます

```
find . -type f -a -name '*.txt' -ls
```

```
  671143      0 -rw-rw-r--   1 vagrant  vagrant         0 Apr 19 04:29 ./find/file-1.txt
  671215      0 -rw-rw-r--   1 vagrant  vagrant         0 Apr 19 04:29 ./find/file-3.txt
  671213      0 -rw-rw-r--   1 vagrant  vagrant         0 Apr 19 04:29 ./find/file-2.txt
```

##locate
locateはfindとは違ってファイルパスが格納されているDBから検索されるため、findに比べて高速に検索することが出来ます。

###インストール
Linuxに最初から入っている訳ではないので、インストールしなければなりません。

####すでにあるかの確認
```
$ locate --version
```
入ってないのであればインストールしましょう。

#####CentOSでインストール
```
$ sudo yum install mlocate
```
#####Ubuntuでインストール
```
$ sudo apt-get install mlocate
```
###データベースの作成
```
$ updatedb
```

上記、`updatedb`コマンドでデータベースが作成され、一定期間ごとにデータベースが更新されるようになります。
######注意点
データベースの更新は、インストール時に一日一回のペースで更新されるように設定されています。ですので、今作ったファイルが検索に引っかかるようになるのは1日後です。また、今消したファイルも1日後までは検索に引っかかってしまいます。

`locateは作成（削除）してからしばらく経った後のファイルを見つけるのに向いてるといえます。`


##locateで検索
```
$ locate bash
```
これでbashと名の付くファイルがすべて高速に表示されます。

####検索できるファイル種別

オプション|効果
---|---
-i|大文字小文字を無視する
-b|ファイル名のみ検索（ディレクトリは無視）
-A|and検索（通常はor検索）
###参考文献
<a href="https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1">新しいLinuxの教科書</a>
Git2.26.0以下にある深刻な脆弱性を回避する

脆弱性についてはこちらが詳しいです。
[Gitの認証情報を奪い取れるGit 2.26.0以下にある脆弱性について · GitHub](https://gist.github.com/azu/9e0ffcf42a24c7b7ad4b6a0611db073a)

**→Gitのバージョンを`2.26.1`（修正版）にする必要がある。**
**→Gitを内蔵しているツール（Xcode, SourceTree）もアップデートする必要がある。**

# Gitのアップデート
現在のバージョンを確認。

```
$ git --version
git version 2.21.1 // アプデしないといけない
```

（GitをHomebrewで入れたかどうか忘れてしまったのでとりあえず）

```
$ brew upgrade git
Error: git not installed // エラー！
```

Homebrewでインストールしてなかったようなので、素直に最新版のGitをインストール。

```
$ brew install git
$ git --version
git version 2.26.1 // 修正版にアップデート完了
```

# Xcodeのアップデート
修正版のXcode`11.4.1`が出ているのでストアからアップデート。

# SourceTreeのアップデート
> SourceTree は Git を内包していて初期値はそれを参照している
[SourceTree の Git のバージョン | Tagbangers Blog](https://blog.tagbangers.co.jp/2014/12/16/sourcetree-git-version)

環境設定 > Git > Gitのバージョン
<img width="706" alt="スクリーンショット 2020-04-19 14.14.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/10a1c323-7fa7-5524-38fc-cf1bf71c5c11.png">

内蔵している古いバージョンのGitを参照していたので、「システムのGitを使用する」を選択。

<img width="732" alt="スクリーンショット 2020-04-19 14.30.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/74a1e555-9646-0142-03c9-20150c328821.png">

システムのGit`2.26.1`を参照するようになったので完了。
&:って??? 

#はじめに

rubyでmapメソッドを利用する際、

```ruby

number ["1","2","3"]
number.map &:to_i
#=> [1, 2, 3]

もしくは、、、

alphabet = ["a","b","c"]
alphabet.map(&:upcase)
#=> ["A","B","C"]
```

このような処理がなされているのをみたことがないだろうか。

What is "&:" ???

となったので深堀ってみると面白かったのでここに書き留めておく。


#前提として

```ruby

alphabet = ["a","b","c"]
alphabet.map(&:upcase)
#=> ["A","B","C"]
```
とは、

```ruby

alphabet = ["a","b","c"]
alphabet.map{|s| s.upcase}
#=> ["A","B","C"]
```
もっと省略せずに書くと、

```ruby
alphabet = ["a","b","c"]
alphabet.map do |s|
  s.upcase
end
#=> ["A","B","C"]
```

となり、

これら上記3つは同じ処理結果となる。


そしてここからは、なぜ"&:"を利用できるのかということに注目していく。



#Proc(プロック)クラス

"&"のことに触れる前に理解しておかなければならないのが、このProcクラスについてだ。


{}やdo endで書いたブロックをオブジェクト化したものがProcオブジェクト。

つまり、

{|s| s.upcase}のようなブロックをオブジェクト化したもの。

```ruby
alphabet = ["a","b","c"]
p = Proc.new {|s| s.upcase}
alphabet.map(&p) 
#=> ["A","B","C"]
```

#&とは
### &(アンパサンド)演算子

"&"には主に2つの働きがあります。

- メソッド呼び出しで使う"&"はオブジェクトをブロックとして与えるもの。
- メソッド定義で使う"&"はブロックを Proc オブジェクトとして受け取るもの。


上記の例で言えば、メソッド呼び出しに"&"が使われているので、
Procオブジェクト（p）は"&"によって、ブロックとして扱われたということになる。


#Symbol#to_procメソッド

to_procメソッドはその名の通り、
渡されたシンボルをProcオブジェクトとして返すもの。

```ruby
prc = :upcase.to_proc 
puts prc 
#=> #<Proc:0x00007f99d303e458(&:upcase)>
```

これを文字列に呼んでみると、


```ruby
puts prc.call("abc") 
#=> ABC
```

これらの処理をまとめると、

```ruby

:upcase.to_proc.call("abc")
#=> ABC
```


### つまり

```ruby

# array.map(&:メソッド名)の記法
["a","b","c"].map(&:upcase) #=> ["A","B","C"]

# 省略しない記法
alphabet = ["a","b","c"]
alphabet.map do |s|
  :upcase.to_proc.call(s)
end
#=> ["A","B","C"]
```

つまりSymbolである:upcaseはto_procによってProc化されると、**callの第1引数がレシーバー（.の左側）、upcaseがメソッド名（.の右側）**になって実行されるようなProcオブジェクトが自動的に作られる。

よって:upcaseから作成されたProcのcallがmapから呼び出されると、第1引数として与えられる配列の各要素がレシーバーとなり.upcaseが呼び出される。


これがmap &:upcaseで各要素に対して.upcaseが呼ばれる理由なのだ。



#おわりに


"&"と":"にというたった2文字の中にこんなにもたくさんの意味や処理が隠れていたことには驚いた。
同時に、スクールでしっかり学んだと思えていたrubyには、
まだまだ知らない部分があるのだということを実感した。



### 参考記事
【Ruby】array.map(&:method)を理解する
https://qiita.com/k-penguin-sato/items/420d7487b28b5d58cac4

Ruby Procについて学ぶ
https://qiita.com/naotospace/items/0163d4f8803a63f5fb17

&演算子と、procと、Object#method について理解しなおす
https://qiita.com/kasei-san/items/0392097791d3a5998216

Rubyのmap &:to_iとはなんなのか
https://a-records.info/ruby-map-ampersand-colon-to_i/
COBOLをとにかく動かしたい（AWS、opensourceCOBOL）

#概要
こんにちは。とあるIT企業の社員です。
今回は、あるイベントをきっかけに、
とにかくCOBOLプログラムを動かしたい、と思い、やってみました。。

AWSのLinux環境でCOBOL実行環境を導入し、以下のサンプルプログラム（HelloKazuoji.cbl）の動作を確認しました。
（簡単なサンプルを動かしたり、COBOL基礎の勉強できるくらいの簡単な環境です。）

記事を書くを目的は以下であり、正しいかどうかは保証しません。
1. 自分自身の理解
2. 自分自身の達成感
3. 自分自身の備忘
4. 同じ目的をもつ方へのTips

``` cobol:HelloKazuoji.cbl
       IDENTIFICATION                   DIVISION.
       PROGRAM-ID.                      hellokazuoji.
      **************
       ENVIRONMENT                      DIVISION.
      **************
       DATA                             DIVISION.
      **************
       PROCEDURE                        DIVISION.
       MAIN.
          DISPLAY "Hello Kazuojisan!"  UPON CONSOLE.
          STOP RUN.
```

#環境
- MacOS（local）
- Amazon Linux2（remote）
- opensourceCOBOL

#Linux環境準備
AWSでAmazon Linux2のECインスタンスを作成します。
基本的にデフォルトで作成します。（用途に応じてお好みで。）
作成後はElastic IPアドレスを割り当てて、以下でアクセスします。

- key-pairファイルへ権限付与

```
$ chmod 600 XXXXX.pem
```
- sshでLinux環境へアクセス

```
$ ssh -i {XXXXX.pemのPATH} ec2-user@{IP ADDRESS}
```

# 前提環境準備
COBOL環境導入の前にyumで以下のモジュールをインストールします。
こちらをインストールをしないとinstallは上手くいきません。

- gcc

```
$ sudo yum install -y gcc
```

- ncurses-devel

```
$ sudo yum install -y ncurses-devel
```

- gmp-devel

```
$ sudo yum install -y gmp-devel
```

#COBOL実行環境導入
COBOL実行環境としてopensourceCOBOLを導入します。

- opensorceCOBOLファイルの取得

```
$ sudo wget -O opensource-cobol-1.5.2J-utf8.tar.gz ‘https://www.osscons.jp/osscobol/files?action=cabinet_action_main_download&block_id=414&room_id=21&cabinet_id=11&file_id=406&upload_id=911’
```

- .tar.gzファイルの展開

```
$ sudo tar -zxvf opensource-cobol-1.5.2J-utf8.tar.gz
```

- vbisamインストール

```
$ cd opensource-cobol-1.5.2J-utf8/vbisam
$ sudo sh ./configure
$ sudo make
$ sudo make install
```

- opensourceCOBOLインストール

```
(vbisamインストールからそのままコマンドを打つ想定です。)
$ cd ..
$ sudo sh ./configure --with-vbisam
$ sudo make
$ sudo make install
```

#動作確認テスト
冒頭で記載したサンプルプログラムで動作を確認します。

- scpで.cblファイルをローカルから転送

```
$ scp -i XXXXX.pem  hellokazuoji.cbl ec2-user@{IP_ADDRESS}:{DIR_PATH}
```

- コンパイル・実行

```
$ cobc hellokazuoji.cbl
$ cobcrun hellokazuoji
``` 

- 動作結果

```
Hello Kazuojisan!
```

#終わりに
おそらく完全な導入ではないですが、
構文の学習くらいはできる環境はできました。
何かあればコメントください。

# 参考リンク
- [OSS Consortium](https://www.osscons.jp/osscobol/download/)
- [Linux版インストール手順](https://github.com/opensourcecobol/opensource-cobol/wiki/Install_lin)
- [Windows環境におけるopensourceCOBOL環境構築手順](https://qiita.com/Fujiwara775/items/b986d5908445a480a7ee)
【備忘録】MacのLaunchpadをアルファベット順にソート する

# MacのLaunchpadのアプリケーションをアルファベット順に整頓したい

手順は以下の通り

1. ターミナルを開く

2. 下記コマンドを叩く
**defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock**

---
## 参考文献
- Sort icons alphabetically in Mac Launchpad, （最終閲覧日：2020年4月19日）, https://amitabhkant.com/2017/01/13/sort-icons-alphabetically-in-mac-launchpad/
Xamarin.Formsの開発時の共通プロジェクトのフォルダー構成の作り方

# 概要
Xamarin.Formsの情報は少ないが、Microsoftのドキュメントからダウンロード可能なサンプルを使って、実装方法は学ぶ事ができる。
ドキュメント自体は英語の翻訳で何を言いたいのか分かりにくい文章が多いが、サンプルソースと見比べながら読む事でようやく使い方が分かってくる。

# 環境
Visual Studio 2019
NETStandard.Library v2.0.3
Xamarin.Essentials v1.5.2
Xamarin.Forms v4.5.0.617

# フォルダー構成
こちらのフォルダー構成は、Microsoftのドキュメントからダウンロードしたデモプログラムを元にしている。
デモプログラムは下記から入手する。Xamarin.Formsのコントロールテンプレートのデモプログラムである。

[コントロールテンプレートのデモプログラムのダウンロード](https://docs.microsoft.com/ja-jp/samples/xamarin/xamarin-forms-samples/templates-controltemplatedemos/)

|フォルダー名|役割|
|-----------|---------|
|Controls|カスタムコントロールの置き場所|
|Models|画面に直接表示しないモデルクラスの置き場所|
|ViewModels|画面にバインドするモデルクラスの置き場所|
|Views|画面のソース置き場所|


また、このサンプルソースには4つのプロジェクトが含まれているが、それぞれの役割は次の通り。

|プロジェクト名|役割|
|-----------|---------|
|ControlTemplateDemos|共通クラスライブラリ。各プラットフォーム別のプロジェクトから共通で使用するプロジェクト|
|ControlTemplateDemos.Android|Android用プロジェクト。プラットフォーム固有の処理はこのプロジェクトに含める。以下、同様。|
|ControlTemplateDemos.iOS|iOS用のプロジェクト|
|ControlTemplateDemos.UWP|Universal Windows Platform用のプロジェクト|
JavaScriptのオブジェクトについて自分なりに理解できた

N予備校Webアプリ入門や『ふりがなJavaScript』の本を読んでもよくわからなかった「オブジェクト」という概念について、『JavaScip本格入門』を読んだらすっきり分かったので自分なりにまとめる。

●オブジェクトとは配列の親戚！！！！

・配列リテラル

```javascript
var seafood = ['イカ','タコ','エビ'];
console.log(seafood[0]);      //イカ
console.log(seafood[1]);      //タコ
console.log(seafood[2]);      //エビ
```

この場合、seafoodという配列があり、
配列の中の、
「インデックス番号０」の「要素」はイカ
「インデックス番号1」の「要素」はタコ
「インデックス番号２」の「要素」はエビ

となっている。

配列における「キー」は「インデックス番号」なので、
console.log(配列名[インデックス番号]);
をすると、要素が表示される。

・オブジェクトリテラル

```javascript
var animal = { x:dog, y:cat, x:rabbit };
console.log(animal.x);     //dog
console.log(animal.y);     //cat
console.log(animal.z);     //rabbit
```

この場合、animalというオブジェクトリテラルがあり、
配列の中の
「オブジェクトx」の「プロパティ」はdog
「オブジェクトy」の「プロパティ」はcat
「オブジェクトz」の「プロパティ」はrabbit

となっている。

オブジェクト配列における「キー」は「オブジェクト名」なので、
console.log(オブジェクトリテラル名.オブジェクト名);
をすると、プロパティが表示される。


つまり、オブジェクトとは、「インデックス番号」の代わりに「要素」につけている名前のこと！
オブジェクトにおいては、「要素」は「プロパティ」と呼ばれる。

オブジェクトリテラルとは、値に名前をつけて管理している配列のこと。






●おまけ

『ふりがなJavaScript』を読んだ時点での自分の混乱ポイントと、『JavaScript本格入門』との相違点

【学習記録】『スラスラ読める　JavaScriptふりがなプログラミング』読書感想　 5章編 （最終章）　〜N予備校の復習を添えて ( https://qiita.com/Molly95554907/items/89018cdaaf8c56808651 )

上記のQiitaでの混乱ポイント

> 復習と疑問点の整理〜つまりオブジェクトって何〜
・consoleやdocumentのように、予め定められたオブジェクトがあり、logやquerySelectorのように予め定めたれたメソッドがある。（本書の１章、５章より）

>document.querySelectot('h1')
ならば
documentがオブジェクト（機能と変数の集合体）
querySelectorがメソッド（機能）
'h1'がプロパティ（変数）

>・一方で、オブジェクトとなる変数を自作して、その中にプロパティーと値を入れて複数のデータを一つにまとめるものがある。（本書の４章後半より）

>let myfavoritebooks = {title:'関ヶ原'}
ならば
myfavoritebooksがオブジェクト（機能と変数の集合体）（だが「変数」でもある）
titleがメソッド（機能）（だが「プロパティ」でもある）
'関ヶ原'がプロパティ（変数）（だが「値」でもある）

>・プログラムの中で果たしている役割に与えられる言葉が入れ替わってるような……！！ややこしい。そして結局のところ本質の理解に至ってない。いっぱい使って慣れるしかないのかな…！？"



「オブジェクト」のことを「機能と変数の集合体」、「プロパティ」を「変数」と考えるやり方を、『JavaScript本格入門』では取り入れていない（２章読了段階において）

オブジェクトは値につける名前、プロパティは値そのものをさす、という理解で覚えなおした。
【macOS Catalina】rbenvで古いバージョンのrubyがインストール出来ない問題を解決

## 問題
rbenvで2.2.2のrubyをインストール出来ない。

### 実行環境

```
OS: macOS Catalina
Version: 10.15.4
brew version: Homebrew 2.2.13
rbenv: stable 1.1.2
```

### エラーログ

```
$ rbenv install 2.2.2

...

The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Configure options used:
  --prefix=/Users/user_name/.rbenv/versions/2.2.2
  --with-openssl-dir=/usr/local/opt/openssl@1.1
  --with-readline-dir=/usr/local/opt/readline
  CC=clang
  LDFLAGS=-L/Users/user_name/.rbenv/versions/2.2.2/lib
  CPPFLAGS=-I/Users/user_name/.rbenv/versions/2.2.2/include
```

## 解決方法

```
$ brew install rbenv/tap/openssl@1.0
$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.0)" rbenv install 2.2.2
```

## 解説

本問題はrbenvがruby-buildを用いてrubyをインストールしており、以下のリンクの `Ruby < 2.4 is not compatible with OpenSSL 1.1.` の内容の通り、openssl@1.0 をrbenv用にインストールして指定してあげないといけない。

https://github.com/rbenv/ruby-build/wiki
rsync + ssh で同期する

# rsync + ssh で同期する

## rsync + ssh で同期する (最終形)


|項目  |意味  |
|---|---|
| target_host  |リモートのホスト名またはIPアドレス |
| user  |リモートのユーザー名 |
| remote_path  |リモートのファイルパス |
| local_path  |ローカルPCのファイルパス |
| PASSWD  |リモートのパスワードか入った環境変数  |
| PORT  |リモートのSSH のポートが入った環境変数  |

### ローカル → リモートにコピー

```
PASSWD="xxxxxx"
PORT=22
sshpass -p "$PASSWD" rsync  --delete -ave "ssh -p $PORT -o 'StrictHostKeyChecking no'" local_path user@target_host:remote_path
```

### リモート → ローカルにコピー

```
PASSWD="xxxxxx"
PORT=22
sshpass -p "$PASSWD" rsync  --delete -ave "ssh -p $PORT -o 'StrictHostKeyChecking no'" user@target_host:remote_path local_path
```

## 解説

ローカル → リモートにコピーの場合を説明する。
リモート → ローカルは引数を逆にするだけです。

### 初期版

```
rsync  -e ssh local_path user@target_host:remote_path
```
### ディレクトリを転送する場合

ディレクトリを転送する場合は上記コマンドだと以下のようにスキップされます。

```
skipping directory local_path
```

`-r` オプションをつけることでディレクトリも転送できます。

```
rsync  -r -e ssh local_path user@target_host:remote_path
```

### 転送元で削除したファイルを削除する場合

`--delete ` オプションをつけることで転送元で削除したファイルを転送先で削除します。

```
rsync --delete  -r -e ssh local_path user@target_host:remote_path
```

### `cp -a` のように属性を保持して転送する

`-a` オプションをつけることで`cp -a` のように属性を保持して転送します。
`-a` オプションは `-r` を含むので  `-r` は不要です。

```
rsync --delete  -a -e ssh local_path user@target_host:remote_path
```

### 進捗を表示する

`-v` オプションをつけることで進捗を表示します。

```
rsync --delete  -a -v -e ssh local_path user@target_host:remote_path
```

### `sshpass` を使用してパスワードをコマンドラインから指定する

sshpass を使用することでパスワードをコマンドラインから指定します。

`PASSWD` はパスワードを保持する環境変数

```
PASSWD="xxxxxx"
sshpass -p "$PASSWD" rsync --delete  -a -v -e ssh local_path user@target_host:remote_path
```

### 'StrictHostKeyChecking no' を指定して SSHの警告メッセージを出さない

```
PASSWD="xxxxxx"
sshpass -p "$PASSWD" rsync --delete  -a -v -e "ssh -o 'StrictHostKeyChecking no'" local_path user@target_host:remote_path
```

### '-p' オプションを指定して SSH のポート番号を指定する

```
PASSWD="xxxxxx"
PORT=22
sshpass -p "$PASSWD" rsync --delete  -a -v -e "ssh -p $PORT -o 'StrictHostKeyChecking no'" local_path user@target_host:remote_path
```

### rsync のオプションをまとめる

`-a -v -e` は `-ave` とまとめられる。

```
PASSWD="xxxxxx"
PORT=22
sshpass -p "$PASSWD" rsync --delete  -ave "ssh -p $PORT -o 'StrictHostKeyChecking no'" local_path user@target_host:remote_path
```

## リンク

https://www.pistolfly.com/weblog/2008/04/rsync-ssh-1.html
https://devilab.net/archives/1207
Swift：NSColorをドラッグ&ドロップでコピペする

# demo

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/befba872-bc03-3c2b-45b2-dc0423500791.gif)


# ソース

```swift
import Cocoa

extension NSColor {
    var swatch: NSImage {
        let size = NSSize(width: 25.0, height: 25.0)
        let image = NSImage(size: size)
        image.lockFocus()
        self.drawSwatch(in: NSRect(origin: .zero, size: size))
        image.unlockFocus()
        return image
    }
}

class ColorView: NSView {
    
    var color: NSColor = .white
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        registerForDraggedTypes([.color])
    }
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        color.setFill()
        NSBezierPath(rect: dirtyRect).fill()
    }
    
    override func mouseDragged(with event: NSEvent) {
        let draggingItem = NSDraggingItem(pasteboardWriter: color)
        let swatch = color.swatch
        draggingItem.setDraggingFrame(CGRect(origin: .zero, size: swatch.size), contents: swatch)
        beginDraggingSession(with: [draggingItem], event: event, source: self)
    }
    
    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        if let _ = NSColor(from: sender.draggingPasteboard) {
            return .copy
        }
        return []
    }
    
    override func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation {
        if let _ = NSColor(from: sender.draggingPasteboard) {
            return .copy
        }
        return []
    }
    
    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
        guard let newColor = NSColor(from: sender.draggingPasteboard) else {
            return false
        }
        color = newColor
        self.needsDisplay = true
        return true
    }
    
}

extension ColorView: NSDraggingSource {
    func draggingSession(_ session: NSDraggingSession, sourceOperationMaskFor context: NSDraggingContext) -> NSDragOperation {
        return .copy
    }
}
```
ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxxx.local.pid)でMySQLが起動できない時の解決法方

開発しようと思って起動したら、今まで繋がっていたはずのMySQLに繋がっていないというエラーが発生したので、解決した方法を記しておきます。

#発生したエラー
ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxxx.local.pid)
※ xxxxxはホスト名 （$ uname -nで確認可能）

このエラーですが、原因はpidファイルが存在していない、またはpidファイルに権限がないというものなので、これを解決する必要があります。

#ファイルの確認
まずpidファイルが存在しているかを確認します。

```
$ ls -la /usr/local/var/mysql/xxxxx.local.pid
```
※ xxxxxは自分のホスト名を入れてください。基本的に自分のエラー文のPID fileの後に続いている()の中をコピペすればいいです。

```
-rw-rw----  1 _mysql  _mysql  5  4 19 12:20 /usr/local/var/mysql/xxxxx.local.pid
```
のように表示されればpidファイルは存在しているので、権限を追加することでうまくいくと思います。

#pidファイルがない場合
pidファイルがなかった場合はpidファイルを作成する必要があります。

```
$ sudo touch /usr/local/var/mysql/xxxxx.local.pid
```
とコマンドを打ってpidファイルを作成しましょう。

#pidファイルに権限を追加する
pidファイルに権限を追加する場合は、pidファイルの上の階層に権限を追加しましょう。

```
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/
```

#mysqlの起動
権限を追加するところまで終了したらmysqlを起動、再起動しましょう。

```
$ sudo mysql.server start
```
```
$ sudo mysql.server restart
```

#別のエラーが発生した場合
リンクで飛べるようにしてあるので、該当するエラーがあれば確認してみてください。

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
https://qiita.com/owl58ohotsuku/items/850965dd2f645a4d07b3

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
https://qiita.com/owl58ohotsuku/items/2db181832aa5f78dd73b


#解決できなかった場合
解決できなかった場合は
・パソコンを再起動してみる
・MySQLの再インストールをしてみる
という方法をとってみた方がいいかもしれません。

他にも調べると色々な記事あると思うのでエラー文を検索して探してみてください。

#参考にしたサイト
https://qiita.com/jonakp/items/477a18d4a94c01a31583
https://qiita.com/YamKenta/items/a33499a7db7946a43381
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)でMySQLが起動できない時の解決方法

開発しようと思って起動したら、今まで繋がっていたはずのMySQLに繋がっていないというエラーが発生したので、解決した方法を記しておきます。

#発生したエラー
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

このエラーですが、/tmp/mysql.sockは存在しているが、権限がないというものだと推測される（明確に書かれたものを見つけられなかった）ので、/tmpディレクトリに権限を追加する必要があります。

なので、/tmpディレクトリに権限を追加しましょう。

```
$ sudo chowm mysql:mysql /tmp
```

#mysqlの起動
権限を追加することができたらmysqlを起動または再起動しましょう。

```
$ sudo mysql.server start
```
```
$ sudo mysql.server restart
```

#別のエラーが発生した場合
リンクで飛べるようにしてあるので、該当するエラーがあれば確認してみてください。

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
https://qiita.com/owl58ohotsuku/items/850965dd2f645a4d07b3

ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxxx.local.pid)
https://qiita.com/owl58ohotsuku/items/bbb54fba97ad1de7b68d

#解決できなかった場合
解決できなかった場合は
・パソコンを再起動してみる
・MySQLの再インストールをしてみる
という方法をとってみた方がいいかもしれません。

他にも調べると色々な記事あると思うのでエラー文を検索して探してみてください。

#参考にしたサイト
https://qiita.com/carotene4035/items/e00076fe3990b9178cc0
https://feeld-uni.com/entry/2019/10/26/204143
https://medium.com/wado-jp/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8Bmysql%E3%82%A8%E3%83%A9%E3%83%BC%E9%9B%86-a6dc33e77a9a
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)でMySQLが起動できない時の解決方法

開発しようと思って起動したら、今まで繋がっていたはずのMySQLに繋がっていないというエラーが発生したので、解決した方法を記しておきます。

#発生したエラー

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

このエラーですが、原因はmysql.sockファイルが存在していないというものなので、mysql.sockというファイルを作成する必要があります。

エラー文を見ると /tmpというディレクトリの下層にmysql.sockファイルが存在することを求められているので、mysql.sockを /tmpディレクトリの中に作成しましょう。

```
$ sudo touch /tmp/mysql.sock
```
※/tmpディレクトリの中にmysql.sockが作成できればいいので、cd /tmpで階層移動してからsudo touch mysql.sockでもいいです。

#mysqlの起動
作成することができたらmysqlを起動または再起動しましょう。

```
$ sudo mysql.server start
```
```
$ sudo mysql.server restart
```

#別のエラーが発生した場合
リンクで飛べるようにしてあるので、該当するエラーがあれば確認してみてください。

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
https://qiita.com/owl58ohotsuku/items/2db181832aa5f78dd73b

ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxxx.local.pid)
https://qiita.com/owl58ohotsuku/items/bbb54fba97ad1de7b68d

#解決できなかった場合
解決できなかった場合は
・パソコンを再起動してみる
・MySQLの再インストールをしてみる
という方法をとってみた方がいいかもしれません。

他にも調べると色々な記事あると思うのでエラー文を検索して探してみてください。

#参考にしたサイト
https://qiita.com/carotene4035/items/e00076fe3990b9178cc0
https://feeld-uni.com/entry/2019/10/26/204143
https://medium.com/wado-jp/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8Bmysql%E3%82%A8%E3%83%A9%E3%83%BC%E9%9B%86-a6dc33e77a9a
イベント

```py
import logging
import threading
import time

logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s')


def worker1(event):
    event.wait()  #event.set()が呼び出されるまで待機
    logging.debug('start')
    time.sleep(3)
    logging.debug('end')


def worker2(event):
    event.wait()  #event.set()が呼び出されるまで待機
    logging.debug('start')
    time.sleep(3)
    logging.debug('end')


def worker3(event):
    logging.debug('start')
    time.sleep(3)
    logging.debug('end')
    event.set()

if __name__ == '__main__':
    event = threading.Event()
    t1 = threading.Thread(target=worker1, args=(event,))
    t2 = threading.Thread(target=worker2, args=(event,))
    t3 = threading.Thread(target=worker3, args=(event,))
    t1.start()
    t2.start()
    t3.start()
```

```txt
Thread-3: start
Thread-3: end
Thread-1: start
Thread-2: start
Thread-1: end
Thread-2: end
```
PyTorch などで Tensor の結果を numpy.testing で比較するメモ

## 背景

* 自前 C++ 機械学習が, PyTorch などとの結果と一致するかどうか調べたい
  * Tensor データや, 各 function(op)の計算結果(Tensor or array)など
  * データコンバーターで, 正しく weight などがコンバートできているか調べたい.  

PyTorch などのレベルではお手軽に使えるものはなさそうです.

numpy にテスト関数がいくつかあります.

https://docs.scipy.org/doc/numpy/reference/routines.testing.html

## numpy.testing.assert_allclose

onnx-chainer での利用例が参考にし,

https://github.com/chainer/onnx-chainer/blob/fcab3530cea7a1130aa9a43aa7de6683ee354d11/tests/helper.py#L137

`numpy.testing.assert_allclose` を使えばよさそうです!

https://docs.scipy.org/doc/numpy/reference/generated/numpy.testing.assert_allclose.html

## TODO

* [ ] 誤差があるときはテキストではわかりずらいので, matplotlib あたりで可視化できるようにする.
pyenv-virtualenvのセットアップ

# おしながき

Pythonの仮想環境をセットアップします。
いくつものプロジェクトをかけもっているような状態なので、様々な環境が並行して必要です。
pyenv-virtualenvを使用すると、隔離された仮想環境を用意できます。

# インストール

## CentOS8

### 事前準備

```sh
dnf -y install git
dnf -y groupinstall "Development Tools"
dnf -y install readline-devel zlib-devel bzip2-devel sqlite-devel openssl-devel
```

### pyenv

```sh
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
exec $SHELL -l
```

#### pyenv-virtualenv

```sh
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
exec $SHELL -l
```

## Mac

### 事前準備

```sh
$ brew update
$ brew install zlib
```

### Mojave 対応　2019/02/15

```sh
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

### pyenv, pyenv-virtualenv

```sh
$ brew install pyenv
$ brew install pyenv-virtualenv
```

### 環境設定

```sh
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

# 運用

## インストール可能なバージョン一覧

```sh
$ pyenv install --list
```

## Python インストール

```sh
$ pyenv install 3.7.2
```

## 仮想環境の作成

指定したバージョンを元に隔離された仮想環境が作成されます。

```sh
pyenv virtualenv 3.7.2 (プロジェクト名)
```

### 自動切替

プロジェクトディレクトに入ると自動で仮想環境に切り替えられるようになります。

```sh
echo (プロジェクト名) > (プロジェクト名)/.python-version
```


## 仮想環境の削除

```sh
pyenv virtualenv-delete (プロジェクト名)
```
Elmerについて

この記事は[Elmer official homepage](https://www.csc.fi/elmer)の一部を翻訳したものです。

# Elmer

Elmerは、CSC - IT Center for Science (CSC)が中心となって開発したオープンソースのマルチフィジカルシミュレーションソフトウェアです。Elmerの開発は、フィンランドの大学、研究機関、産業界との協力により1995年に開始されました。2005年にオープンソースで公開された後、Elmerの使用と開発は国際的なものとなりました。

Elmerには、たとえば、流体力学、構造力学、電磁気学、熱伝導、音響学の物理モデルを含みます。これらは、Elmerが有限要素法（FEM）で解く偏微分方程式によって記述されています。

これらのページでは、Elmer ソフトウェアの基本的な情報を提供しています。ページの内容はどちらかというと静的なものですが、より多くのコンカレントな情報については http://www.elmerfem.org のディスカッションフォーラムやWikiをご覧ください。

[Video presentation about Elmer.](http://vastaanotin.tv.funet.fi/cgi-bin/tv?mrl=rtmp://salama.tv.funet.fi/simplevideostreaming/fi/csc/viestinta/ohjelmistot/elmer.mp4)

![molten_silicon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/2cbc9723-bba8-8860-e1a6-17db83114765.png)
図1.シリコンのCzochralski成長におけるメルトフローの温度分布.

---

# Binaries

Elmerプロジェクトのコンパイルは最近、cmakeに移されました。
2015年2月以降、古いgbu autotoolsベースのバージョンは開発されていません。
古い説明書や配布物がまだ残っていますが、Elmerのインストールを新しくする必要がある場合は、これらを回避する必要があります。

ここでレビューしているElmerの最新バージョンを入手するには、さまざまな方法があります。

## Windowsインストーラー

mpiの有無にかかわらず、Windowsのナイトリービルドが、こちらで頻繁に更新されています。

https://sourceforge.net/projects/elmerfem/

現在、64ビットバージョンのみがサポートされています。

## Launchpad

Launchpadには、UbuntuやDebianベースのシステムで使用できるLinuxバージョンがあります。

```bash:
$ sudo apt-add-repository ppa:elmer-csc-ubuntu/elmer-csc-ppa
$ sudo apt-get update
$ sudo apt-get install elmerfem-csc
```

## 仮想マシン

Linux Mintベースの仮想マシン（VM）が、こちらから入手できます。
 http://www.nic.funet.fi/pub/sci/physics/elmer/bin/VirtualMachines

VMは巨大なサイズですが、認定されたユーザーエクスペリエンスを提供します。
これは、新しいElmerのバージョンだけでなく、関連ツールの完全なインストールも提供するコースでよく使われます。

## Compile yourself

GitHubのcmakeとソースコードを使用して、ソースファイルから自分でコンパイルします：

https://github.com/elmercsc/elmerfem

これは非常に簡単なことが多いので、コンパイルを恐れる必要はありません。

[コンパイル方法](https://www.csc.fi/web/elmer/sources-and-compilation)は、このとおりです。

---

# 起動方法

## Windowsの場合

Windows10にインストールしたElmerは以下のように起動します。

[スタート]-[Elmer]-[ElmerGUI]

## Linux場合

UbuntuなどのLinuxにインストールしたElmerは
ターミナル上、以下のコマンドで起動します。

```bash:
$ ElmerGUI
```

---

# サンプルファイル

インストールフォルダ内にサンプルファイルが同梱されており、下記のところに置かれています。
サンプルファイルの詳細は公式ドキュメントや[Elmer活用研究会](https://elmer-fem.info/)をご覧ください。

## Windowsの場合

C:\Program Files (x86)\Elmer 8.4-608cbb3d\share\ElmerGUI\samples

## Linux場合

/usr/share/ElmerGUI/samples

---
# 参考文献

[Elmer official homepage](https://www.csc.fi/elmer),(accessed 2020-04-19).
[Elmer活用研究会](https://elmer-fem.info/),(accessed 2020-04-19).
[Overview of Elmerの日本語訳](http://oshima.eng.niigata-u.ac.jp/OpenFOAM/ja/index.html),(accessed 2020-04-19).
[ElmerのTurorialをやってみる](https://qiita.com/waku2011/items/4b23a44a7919b095b094),(accessed 2020-04-19).