OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonコードの逆アセンブラ・逆コンパイル

# 概要
Pythonを勉強している際にバイトコードの生成方法と、バイトコードからバイトコード命令及びソースコードを逆生成する方法を確認したかったのですが、一度にまとまっているページが見つからなかったので備忘録として残しておきます。
今回はCPythonを使用しています。Pythonのバージョンは3.6.8です。

# ソースファイルのコンパイル

ファイルのコンパイルは2つの方法があります。

**1.ソースファイルもしくはディレクトリを一括でコンパイルする場合**

コマンドプロンプトを起動して下記コマンドを実行します。
ファイル単体でのコンパイル及び、ディレクトリ配下一括でのコンパイルが可能です。
[compileall --- Python ライブラリをバイトコンパイル](https://docs.python.org/ja/3/library/compileall.html)

```shell:
python -m compileall 【ファイル名もしくはディレクトリパス】
```

**2.ソースファイルを単体でコンパイルする場合**

Pythonインタプリタを起動して下記コードを実行します。
こちらの場合は下のURLに詳しく記載されていますが、コンパイル時のオプションを指定する事が可能です。
[py_compile --- Python ソースファイルのコンパイル](https://docs.python.org/ja/3/library/py_compile.html)

```python:
import py_compile
py_compile.compile(【ファイル名】)
```

# 逆アセンブラ
コンパイルを実行した場合、通常の方法では確認不可能なバイトコードのファイルとして保存されます。
この時に、インタプリタがどのように実行しているのかを解析したい場合に逆アセンブリを実行してバイトコード命令を確認する事が可能です。

[dis --- Python バイトコードの逆アセンブラ](https://docs.python.org/ja/3/library/dis.html)

**1.関数の逆アセンブラ**

```python:
import dis
dis.dis(【関数名】)
```

**2.バイトコードの逆アセンブラ**
バイトコードを逆アセンブラする場合は、一度Pythonオブジェクトへ整列化をする必要があります。
整列化を実行した後、整列化されたデータを```dis.dis()```へ渡します。
バイトコードの生成時と逆アセンブラ実行時のPythonのバージョンが異なる場合、オブジェクトの整列化が失敗する可能性が高いので必ず生成時と同じPythonのバージョンで実行するようにします。
[marshal --- 内部使用向けの Python オブジェクト整列化](https://docs.python.org/ja/3/library/marshal.html)

__※追記__
ほとんどのサイトと[PEP3147](https://www.python.org/dev/peps/pep-3147/)ではヘッダは32ビット=4バイト × 2 = 8バイトと記載されているのですが、自分の環境では8バイトに設定するとエラーが発生しました。
[stackoverflow](https://stackoverflow.com/questions/25126282/marshal-loads-function-does-not-load-pyc-contents-to-code-object)だと12バイトに変更されているとの記載があったのですが、変更された記述のある公式のドキュメントが確認できていません。

```python:
import dis, marshal
code = open(【ファイル名】, "rb").read()[12:] # ヘッダ以降のデータを読み込む
code = marshal.loads(code)
dis.dis(code)
```

# バイトコードの逆コンパイル
pycからpyファイルに逆コンパイルを実行したい場合はuncompyle6を使用します。Pythonのバージョンが1.3から3.7まで使用可能です。
uncompyle2というライブラリもありますが、こちらはPython2.7までしか使用できません。
逆コンパイルはまだ未実施なので、実行したら追記をします。

[python-uncompyle6](https://github.com/rocky/python-uncompyle6)
railsのキホンvol.7（プロフィール画像表示）

##プロフィール画像の表示
###マイグレーションファイルの作成

```
$ rails g model User image_name:string
```
とすると、モデルも作成されてしまうので、
rails g migrationコマンドを使う。

```
$rails g migration add_image_name_to_users
```
これによりマイグレーションファイルだけが作成される。
###変更内容を保存する
テーブルに反映させるためにはマイグレーションファイルの中のchangeメソッドの中で変更内容を記述する。

 ```20190317121347_add_image_name_to_users.rb
def change
  add_column :users,:image_name,:string
end
```
変更内容を記述したら、migrateコマンドを打つ。

```
$ rails db:migrate
```

これにより、データベースに変更内容が保存される。

###フォームより、画像情報を送信する
フォームの画像の情報をデータベースに送るには以下のようなソースになる。
form_tagメソッドには{multipart: true}、
ファイルを添付するには、<input type="file">が必要となる。

```edit.html.erb
<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %>
          <p>ユーザー名</p>
          <input name="name" value="<%= @user.name %>">
          <p>画像</p>
          <input name="image" type="file">
          <p>メールアドレス</p>
          <input name="email" value="<%= @user.email %>">
          <input type="submit" value="保存">
  <% end %>
 ```

###ファイル名をデータベースに保存する
File.binwriteによりフォームから送信された画像の情報をpublic/user_imagesフォルダ配下に保存する。
以下のソースでは、imageの情報を読み取っている。

```users_controller.rb
def update
  @user = User.find_by(id: params[:id])
  #画像データが送信された場合
  if params[:image]
    #データベースに保存するファイル名はユーザーのid.jpgとする
    @user.image_name = "#{@user.id}.jpg"
    image = params[:image]
    File.binwrite("public/user_images/#{@user.image_name}",image.read)
  end
end
```
###画像の表示
ビューに画像を表示するには、<img src>タグを使う。
ruby部分のコードは<%=%>で囲み、画像のソースの最初には"/"が必要となる。

```show.html.erb
<img src="<%= "/user_images/#{@user.image_name}" %>">
```
続き
https://qiita.com/jonnyjonnyj1397/items/4691d723860a8d927d15
なぜ関数型言語の関数は必ず値を返すのか

まあ文献を参照したわけでもない自己流解釈なので間違ってても責任は持てません。

### きっかけのツイート
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">F#のunitってC#のvoidと同じく戻り値がないことを意味するのかと思ってた。<br><br>けどunitという値が返るから厳密には違うらしい。<br>scalaもunit使うし関数型言語はそういうものなのかな？(*´ω｀*)</p>&mdash; のさ_AWSとFlutter学習中 (@nosa_programmer) <a href="https://twitter.com/nosa_programmer/status/1106915273230045185?ref_src=twsrc%5Etfw">March 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### ユーザー定義関数などなかった時代
初期のFORTRANやBASICではCPUのCall命令などで呼ばれるサブルーチンの扱いは大まかにこんな風に分かれていた。

<dl><dt>ステートメント</dt><dd>ファイルやコンソールの入出力など。組み込み命令で値を返さない。結果を受け取るものは格納先のバッファや変数を引数として渡す</dd>
<dt>ユーザー定義サブルーチン</dt><dd>任意のコード。引数や返り値はないのでデータのやりとりはグローバル変数を経由して行う</dd>
<dt>関数</dt><dd>sin,cosのように数値計算したり、文字列の切り出しなどを行い、その結果を返り値として返す。初期のころは組み込み関数しか存在しなかったと思う</dd></dl>

そしてPascalあたりでユーザー定義関数も作れるようになった。

### 全部関数でいいだろ
これらのサブルーチンコールは引数や返り値の有無による違いはあるけどCPU命令レベルで見ればわりと似たようなもので、ある程度統一したルールを作れば共通化できる。
そこでCではサブルーチンをすべて「関数」として扱うことにした。

ちなみにK&R時代のCは~~引数や返り値の型チェックは一切なく~~、returnで値を返さない関数の返り値は「不定」だったらしい。
その後ANSI Cができるあたりで`void`が導入され、返り値の型をvoidとして宣言した関数の返り値を受け取ろうとするとコンパイル時にエラーとなった。

### 値を返さない関数は困る

話は変わって関数型言語。関数型言語がどういうものかという話はもっとちゃんとした説明を読んでほしいけど、関数型言語というものが新たに作られた理由、何を実現しようとして関数型言語が生まれたのかというと「ある処理の結果を別の処理に渡すというのは"データの流れ"であり、それらはひとつの式として表せる」という発想があった。

```Csharp
//古典的スタイル
var resultA = funcA();
var resultB = funcB(resultA);
var resultC = funcC();
var resultD = funcD(resultB, resultC);
var resultE = funcE();
return resultD + resultE;

//ひとつの式にする
return funcD(funcB(funcA()), funcC()) + funcE();
```

なのでそれ以前の手続き型言語との対比で言えば「式型言語」と名付けてれば誤解は少なかったかもしれない。
このように一連のサブルーチンコールの流れを一つの式としてまとめようとするとき、「値を返さない関数」が混じっているとまとめられない。値を返さない関数を呼ぶ前と呼んだ後の２つの式に分断されてしまう。
Cの型チェックを厳密にしたときの、「値を返さない関数の返り値を受け取ろうとするとエラー」という仕様が足かせになった。

それでも値を返す必要がない、返すべき値がない処理というのはいくらでも存在する。そういう関数をコールすると式が分断されるのは関数型言語が目指したものを破壊してしまう。
そこで「値を返さない関数」を廃止するためにこれを「式を分断させないために形の上だけで値を返す、でも返した値は使わない(使ってもエラーにはしない)」とすることにした。
そのために生まれた「"値なし"を表す値」がLISP系なら`NIL`,javascriptなら`undefined`,その他多くの関数型言語では`unit`と名付けられたもの。

今になって振り返ると「Cにvoidを導入したときにそうしておけばよかったのに」という話になるけど、Cは組み込み機器などでも使うために「バイト単位で命令数をケチりたい」という事情もあって「使いもしない値を返すための命令」でコードが増えるのを嫌ったし、その当時はそんなことをする意味があるとも思えなかったのだろう。
Java で型判定

VB の TypeOf にあたるもの？が欲しかったのですが、なんか無さそうなので作ってみました。

業務の用途はないかもしれませんが学習用に欲しかったのです。[プログラミング言語 Java 第４版](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EJava-Java-%E3%82%B1%E3%83%B3%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%8E%E3%83%AB%E3%83%89/dp/4894717166) の 192 頁にある練習問題とか。

参考：https://stackoverflow.com/questions/3993982/how-to-check-type-of-variable-in-java

```java
class Type {
    static String of(byte x) {
        return (x + " is a byte.");
    }
    static String of(short x) {
        return (x + " is a short.");
    }
    static String of(int x) {
        return (x + " is an int.");
    }
    static String of(float x) {
        return (x + " is a float.");
    }
    static String of(double x) {
        return (x + " is a double.");
    }
    static String of(char x) {
        return (x + " is a char.");
    }
    static String of(boolean x) {
        return (x + " is a boolean.");
    }
    static String of(Object x) {
        final String className = x.getClass().getName();
        return (x + " is instance of " + className);
    }
}
class Main {
    public static void main(String[] args) {
        Type t = new Type();
        System.out.println(Type.of(t));
    }
}

```
php-master-changes 2019-03-16

この日は curl_multi_setopt() で CURLMOPT_PUSHFUNCTION を指定する際のバグ修正、テストの dirname(\_\_FILE\_\_) を \_\_DIR\_\_ にする修正、テストの並列実行対策、クレジット用データ生成スクリプトの修正、ドキュメントの更新、不要コードの削除、bison の最低要求バージョンを 3.0 に引き上げる修正があった！

# 2019-03-16
## nikic: Don't immediately destroy curl pushfunction
- https://github.com/php/php-src/commit/97f9fd6949a52d1eb30c3e1c90f0789b57c29468
- [7.2~]
- ext/curl で、[curl_multi_setopt()](http://php.net/manual/ja/function.curl-multi-setopt.php) に CURLMOPT_PUSHFUNCTION を指定した際のコールバック関数名の破棄をハンドルを閉じる時点まで遅らせるよう修正
- [#77535](https://bugs.php.net/bug.php?id=77535)

## pmmaga: Added test for [#77535](https://bugs.php.net/bug.php?id=77535) fix
- https://github.com/php/php-src/commit/f167b06d4c86c96291c21c027ba3cae22f5b5be8
- [7.2~]
- ↑の修正のテストを追加

## villfa: Replace dirname(\_\_FILE\_\_) by \_\_DIR\_\_ in tests
- https://github.com/php/php-src/commit/26dfce7f36d1c6f737ac241df1315a1b42b932c7
- [7.4~]
- テストの dirname(\_\_FILE\_\_) を \_\_DIR\_\_ に修正

## villfa: Use separate output files in xmlreader tests
- https://github.com/php/php-src/commit/cf8a4b03dce20619df17236d4ae39728b4dba2c2
- [7.4~]
- ext/xmlreader で、テストの出力ファイルをそれぞれ別にするよう修正
- テストの並列実行対策

## petk: Make credits script executable from other paths
- https://github.com/php/php-src/commit/78596973b3f7af2b8514e015d3e60ec717c586de
- [7.4~]
- 拡張/SAPI モジュールの CREDITS から credits_*.h を生成するスクリプトがプロジェクトルート以外から実行できるよう修正

## smalyshev: [ci skip] Add Bishop Bettini as maintainer for phar & imap
- https://github.com/php/php-src/commit/c09b13cb022f3f4f4f77dbe5d3cc3009fa4c3dac
- EXTENSIONS へ、Bishop Bettini さんを phar と imap のメンテナとして追記

## nunoplopes: snmp: remove unused var
- https://github.com/php/php-src/commit/dd84bd4393a4579a20432af8a99e845e87b904c2
- ext/snmp で、使われていない arginfo の記述を削除

## nunoplopes: bump minimum bison version to 3.0 after last parser changes
- https://github.com/php/php-src/commit/39a5f73fd13494f8573ef5814e8261b57bce7e86
- [7.4~]
- bison の最低要求バージョンを 3.0 に引き上げ

## petk: [ci skip] Update changelog
- https://github.com/php/php-src/commit/d7022d2d259ff499797d5077b9274856224b1009
- [7.4~]
- UPGRADING.INTERNALS で、↑の修正を追記
重回帰分析の従属変数の不偏分散(参考: The elements of statistical learning)

#1. 要約
　本記事では$$\widehat{\sigma}^2=\frac{1}{N-p-1}\sum_{i=1}^N(y_i-\widehat{y}_i)^2\tag{1}$$が分散の不偏推定量になること，つまり，$$E[\widehat{\sigma}^2]=\sigma^2$$となることを証明します．
#2. 証明
　さらっと書きましたが，$\widehat{y}_i$は$$\widehat{y}=X\widehat{\beta}=X(X^TX)^{-1}X^Ty$$のi番目の要素で，$$X(X^TX)^{-1}X^T(:=H)$$は一般に射影行列と呼ばれています．
 それでは証明(といっても単純な式変形ですが...)にうつります．(1)の係数部分以外のところは以下のように変形できます．

```math
\begin{eqnarray}
\sum_{i=1}^N(y_i-\widehat{y}_i)^2&=&(y-\widehat{y})^T(y-\widehat{y})\\
&=&(y-Hy)^T(y-Hy)\\
&=&[(I-H)y]^T[(I-H)y]\\
&=&y^T(I-H)^T(I-H)y\\
&=&y^T(I-H^T-H+H^TH)y\\
&=&y^T(I-2H+H)y\\
&&(\because H^T=(X(X^TX)^{-1}X^T)^T=X(X^TX)^{-1}X^T=H,\ H^TH=H)\\
&=&y^T(I-H)y\\
&=&(X\beta+e)^T(I-H)(X\beta+e)\\
&=&\beta^TX^TX\beta+\beta^TX^Te-\beta^TX^THX\beta-\beta^TX^THe\\
&&+e^TX\beta+e^Te-e^THX\beta-e^THe\\
&=&\beta^TX^Te-\beta^TX^THe+e^TX\beta+e^Te-e^THX\beta-e^THe(:=A)\\
&&(\because \beta^TX^THX\beta=\beta^TX^TX(X^TX)^{-1}X^TX\beta=\beta^TX^TX\beta)
\end{eqnarray}
```
ここで，Aに対して期待値を取ると，$E[e]=0_N$であることを利用して，

```math
\begin{eqnarray}
E[A] &=& E[e^Te-e^THe]\\
&=&E[e^Te]-E[e^THe]\\
&=&E[tr(e^Te)]-E[tr(e^THe)]\\
&&(\because e^Te\ and\ e^THe\ are\ scalar.)\\
&=&E[tr(ee^T)]-E[tr(He^Te)]\\
&=&trE[ee^T]-trHE[e^Te]\\
&=&tr\sigma^2I_N-trH\sigma^2I_N\\
&&(\because E[ee^T]=E[(e-0_N)(e-0_N)^T]=Var[e]=\sigma^2I_N)\\
&=&N\sigma^2-\sigma^2trX(X^TX)^{-1}X^T\\
&=&N\sigma^2-\sigma^2tr(X^TX)^{-1}X^TX\\
&=&N\sigma^2-\sigma^2trI_{p+1}\\
&=&(N-(p+1))\sigma^2
\end{eqnarray}
```
よってAを$N-p-1$で割ったもの，つまり，$$\widehat{\sigma}^2=\frac{1}{N-p-1}\sum_{i=1}^N(y_i-\widehat{y}_i)^2$$が分散の不偏推定量となることがわかりました．個体数-1で割るのじゃなくて，**個体数-(変数の数+切片の分)で割る**というのがポイントですね．

# おまけ
 以前の記事(稲垣「数理統計学」定理6.3の証明)のようなのと同様に$(N-p-1)\widehat{\sigma}^2$は，$$(N-p-1)\widehat{\sigma}^2\sim\sigma^2\chi_{N-p-1}^2$$に従います．

# 参考文献
[Hastie, Trevor, Tibshirani, Robert, Friedman, Jerome(2009)._The elements of statistical learning_](https://www.springer.com/jp/book/9780387848570) のp.47あたりの行間を埋めてます．
SpringAOP インターセプタの呼び出し順

##Spring AOPによるアドバイスの呼び出し順についての自分メモ

Spring初心者です。ややこしいなと思ったことをなんとなくメモしていきます。今回はアドバイスの呼び出し順について。
仕様は以下にすべて書いていますが、忘れないように記録。
https://docs.spring.io/spring/docs/5.2.0.BUILD-SNAPSHOT/spring-framework-reference/core.html#aop-ataspectj-advice-ordering

1.同じJoinPointに適用されたAspectは、定義がない場合の呼び出し順は不定である。
2.@Order（もしくは@Priority、JavaDocを見る限りPriorityを使うべきか？）が定義されている場合は、@Orderのvalueが小さいものから順に呼び出される。
3.ただし、同じJoinPointに適用されたAspectが、同じAdviceに実装されている場合、そのアスペクトの実行順は不定になる。

3は、挙動を見る限り同じクラス（=Advice）に複数のAspectメソッドを実装し、同じJoinPointにそれらのメソッドがヒットした場合のこと。

```java:WithinAdvice.java
@Component
@Aspect
public class WithinAdvice {

@Order(3)
    @Before("within(chapter2.g_aop..*)")
    public void logBeforeServieClassAndSubPackages(JoinPoint joinPoint) {
        // 指定したパッケージとそのサブパッケージにインターセプトします。
        // この場合、ServiceとHogeにインターセプトされます。
        System.out.println(String.format("%d logBeforeServieClassAndSubPackages : %s", 3, joinPoint.getSignature()));
    }

    @Before("within(chapter2.g_aop.others.Hoge+)")
    public void logBeforeHogeImplementClass(JoinPoint joinPoint) {
        // Hogeを実装した全メソッドを対象とします。
        System.out.println(String.format("%d logBeforeServieClassAndSubPackages : %s", 5, joinPoint.getSignature()));
    }
}

```

この場合、chapter2.g_aop.others.Hogeの実装クラスである、chapter2.g_aop.others.HogeImplを呼び出した場合、上記で呼び出されるAdviceの順番は、logBeforeServieClassAndSubPackages→logBeforeHogeImplementClassとはならない。

これを避けるためには、logBeforeServieClassAndSubPackages、logBeforeHogeImplementClassを別のクラスに切り出して実装する必要がある。つまり基本的には、１アドバイス（＝クラス）にAspectメソッドを１つだけ実装するルールにした方が堅そう、ということっぽい。
pipenvでエラー "This system lists a couple of UTF-8 supporting locales that you can pick from.  The following suitable locales were" になったときの対処方法

## 解決したいこと

今まで動いていたはずの、`pipenv`を叩くと以下のようなエラーが出たので、エラーが出ないようにして、`pipenv`を動くようにしたいです。
(ググるとPycharmで同じエラーが起こっている人がいて、`pipenv`に限らず起こるエラーかもしれません。)

```
$ pipenv
Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 11, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 696, in main
    _verify_python3_env()
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/_unicodefun.py", line 124, in _verify_python3_env
    ' mitigation steps.' + extra
RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Consult https://click.palletsprojects.com/en/7.x/p
ython3/ for mitigation steps.

This system lists a couple of UTF-8 supporting locales that
you can pick from.  The following suitable locales were
discovered: af_ZA.UTF-8, am_ET.UTF-8, be_BY.UTF-8, bg_BG.UTF-8, ca_ES.UTF-8, cs_CZ.UTF-8, da_DK.UTF-8, de_AT.UTF-8, de_CH.UTF-8, de_DE.UTF-8, el_GR.UTF-8, en_AU.UTF-8, en_CA.UTF
-8, en_GB.UTF-8, en_IE.UTF-8, en_NZ.UTF-8, en_US.UTF-8, es_ES.UTF-8, et_EE.UTF-8, eu_ES.UTF-8, fi_FI.UTF-8, fr_BE.UTF-8, fr_CA.UTF-8, fr_CH.UTF-8, fr_FR.UTF-8, he_IL.UTF-8, hr_H
R.UTF-8, hu_HU.UTF-8, hy_AM.UTF-8, is_IS.UTF-8, it_CH.UTF-8, it_IT.UTF-8, ja_JP.UTF-8, kk_KZ.UTF-8, ko_KR.UTF-8, lt_LT.UTF-8, nl_BE.UTF-8, nl_NL.UTF-8, no_NO.UTF-8, pl_PL.UTF-8,
 pt_BR.UTF-8, pt_PT.UTF-8, ro_RO.UTF-8, ru_RU.UTF-8, sk_SK.UTF-8, sl_SI.UTF-8, sr_YU.UTF-8, sv_SE.UTF-8, tr_TR.UTF-8, uk_UA.UTF-8, zh_CN.UTF-8, zh_HK.UTF-8, zh_TW.UTF-8
```



## 解決するために使った方法

以下のコマンドを打って、`$LC_ALL`を`en_US.UTF-8`にしました。

```
export LC_ALL=en_US.UTF-8
```

無事にエラーはなくなりました。なんで解決したかなどは後ほど調べられたらと思います。

## 参考
* [Q: Why am I getting an error message about ASCII encoding? | Curator Reference [5.6] | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/curator/current/faq_unicode.html)
Android Roomでrailsのcreated_atみたいなことをする（Daoをラップする）

[Room Persistence Library](https://developer.android.com/topic/libraries/architecture/room)を使用してデータを永続化しているのだが、Ruby on Railsのcreated_atのようなタイムスタンプを付ける必要があった。スマートな方法ではないものの、一応実現する方法を考えたのでメモっておく。

# 問題

公式ドキュメント通りに実装すると、DaoとDatabaseは次のような感じで定義することになると思う。

```kotlin:UserDao.kt
@Dao
interface UserDao {
    @Insert
    fun insert(user: User)
}
```

```kotlin:AppDatabase.kt
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
```

`UserDao`の`insert`は実装を定義できないので、このままだとDaoを使用する側でinsertする前にcreated_atを設定してやらなければならない。たぶん次のような感じになるのかな。

```kotlin:Daoを使う側.kt
db.userDao().also { dao ->
    ...
    user.createdAt = LocalDateTime.now()
    dao.insert(user)
}
```

これだとDaoを使う側で毎回タイムスタンプを設定してやらなければならないし、何より設定漏れが発生する可能性がある。できれば、railsみたいに自動で設定してほしいところ。

# 解決方法

`Dao#insert`をフックできれば早いんだけど今の所そういったことはできないみたい・・・。仕方ないのでDaoのラッパーを作ってやって、常にラッパー経由でデータベースにアクセスするようにしてやる。

まずはDatabaseを変更して、自動生成されるDao_Implではなくラッパークラスのインスタンスを返すようにする。

```kotlin:AppDatabase.kt
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    protected abstract fun getUserDao(): UserDao
    fun userDao(): UserDao = UserDao.Wrapper(getUserDao())
}
```

`UserDao`を返すabstractメソッドはprotectedにして外部からのアクセスを禁止する。代わりに`userDao`メソッドを公開して、こいつでWrapperクラスのインスタンスを返すようにする。

続いて、UserDaoの定義は次のような感じ。

```kotlin:UserDao.kt
@Dao
interface UserDao {
    @Insert
    fun insert(user: User)

    class Wrapper(private val dao: UserDao) : UserDao {
        override fun insert(user: User) {
            user.createdAt = LocalDateTime.now()
            dao.insert(user)
        }
    }
}
```

こうしておけば、常にDaoのWrapper経由でデータベースにアクセスすることになるので、createdAtの設定漏れは発生しない。

自動生成Dao_Implをコンポジションするので、タイムスタンプ周りの用件に限らず、色々と使いみちがあると思う。

※ 本記事ではcreatedAtにLocalDateTimeを使用していますが、TypeConverterに関する内容は省略しています
ConoHa VPS(CentOS7)+Flask+Nginx+uWSGIでWEBアプリを作ってみる(1)

# 1. はじめに
WEBアプリ開発初心者の備忘録です。

まずは，VPS上でPython3.6＋Flaskを動かして，Flaskの開発用サーバで公開してみます。
下記を参考にしました。

- [Flask+Nginx+uWSGI+CentOS7でアプリケーションを作る際にやったこと+日記::12/9](https://fgjiutx.hatenablog.com/entry/2018/12/10/013755)
- [CentOS7でポートを開放する方法。](http://senoway.hatenablog.com/entry/2015/02/11/142139)
- [firewalld初心者のメモ](https://qiita.com/T_Shinaji/items/b3ba400feb3c6adebd27)

# 2. VPSについて

ConoHa VPSのプランは下記の通りです。

- メモリ 1GB/CPU 2Core
- SSD 50GB

サーバ構築後，セキュリティ関係の初期設定をしますがここでは省略します。(下記参照)

[ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で！](https://qiita.com/ongaeshi/items/bb17ebfbd4d22057c8fd)

ちなみに，sshのポート番号がデフォの22のときは結構総当たり攻撃がありましたが，
22から変更したらなくなりました。(当然か)

# 3. ライブラリのインストール

Python3.6, Nginx, uWSGIをインストールします。

```
$ sudo yum install -y nginx
$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
$ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip
$ sudo yum groupinstall "Development Tools"
$ sudo yum install -y uwsgi
```

インストール後，必要であれば，/bin/以下にシンボリックリンク(Python3とか)を貼ります。

# 4. Python仮想環境の構築

venvで仮想環境を作ります。Flask関係のファイルはホームディレクトリ以下にappというディレクトリを作って，
まとめておくことにします。

```
$ cd
$ mkdir app
$ cd app
$ python3.6 -m venv env
$ source env/bin/activate
(env) $ pip3 install flask uwsgi
(env) $ deactivate
```

# 5. FlaskでHello World!

app以下にFlaskでHello World!するためのPythonコードを書きます。
コードのファイル名はapp.pyとします。

```
$ touch app.py
$ emacs app.py
```

```app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello! shikao-yuzu page!"

if __name__ == "__main__":
    app.run(host="X.X.X.X" ,port=8080)
```

host="X.X.X.X"にはVPSのグローバルIPを入れます。

# 6. ポート開放

firewalldでTCPポート8080を開放します。

```
$ sudo firewall-cmd --permanent --add-port=8080/tcp
$ sudo firewall-cmd --reload
```

# 7. Flaskの開発用サーバ起動

Flask組み込みの開発用サーバを起動します。

http://X.X.X.X:8080
にアクセスして，"Hello! shikao-yuzu page!"と表示されたら成功です。

```
$ source env/bin/activate
(env) $ python3 app.py
```

なお，サーバは"Ctrl+C"で終了できます。

続く(かも)
Python ユニコード絵文字のインクリメント

メモ

```py
# 1
print('1⃣')
print('2⃣')
print('3⃣')
print('4⃣')

# 2 囲み文字のインクリメント （囲み数字は2文字使ってる）
for i in range(1,5):
    print(f'{i}\N{combining enclosing keycap}')

# 3 アルファベットのインクリメント
for i in range(4):
    print(chr(ord('🇦') + i))

# 2の内包表記
[print(f'{i}\N{combining enclosing keycap}') for i in range(1,5)]

# 3の内包表記
[print(chr(ord('🇦') + i)) for i in range(4)]
```
Travis CIを利用したnpmライブラリの継続的運用

## Travis ログイン
```terminal
$ travis login 
```
GitHubアカウントでログイン

## npmログイン
```terminal
$ npm login
```
npmjs.comのアカウントでログイン

## .travis.yml

```..travis.yml
language: node_js
node_js:
- 9.3.0
script:
- npm run build
deploy:
  provider: npm
  email: test@gmail.com
  on:
    tags: true
  api_key:
    secure: [暗号化された認証トークン]
```
[Building a JavaScript and Node.js project](https://docs.travis-ci.com/user/languages/javascript-with-nodejs/)

### タグのコミットの場合のみデプロイが発火
```yml
  on:
    tags: true
```



## トークンの暗号化
```terminal
$ travis encrypt YOUR_API_KEY --add deploy.api_key
```

```terminal
$ npm version patch
$ git push origin v1.0.1
```
`package.json`の`version`がインクリメントされ同時にコミットもされる。
`push`すればデプロイ完了となる。


## はまったところ
### packaege.json
`packaege.json`の`name`に大文字が含まれていると`publish`されない。
[npm publish failed put 400; is invalid for new packages #15787](https://github.com/npm/npm/issues/15787)
[progate]html&css初級編を終えたのでアウトプット

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている梅原です。
タイトル通りhtml&css初級編を終えたので、なるほどとおもった点を書いてきます。

---
#cssの指定方法
cssはタグ名とクラス名で指定、効果をつける部分を指定します。

```html:sample
<h1 class='red'>赤</h1>
<h1 class='blue'>青</h1>
<h1 class='green'>緑</h1>
```

```css:sample
h1{
  font-family: "ＭＳ ゴシック",sans-serif;
}

.red{
  color:red;
}
```
上のコードだと
h1タグのフォントはゴシックになる。
その中でも、redクラスだけ色が赤色になる。

ちなみに、クラスはスペースでタグに複数つけられたり、タグ、クラスの順番で指定することでcssの効果をかける相手を限定できる。

書いていて思ったのはクラスの種類が増えてきたりするとcssのコード量が増えて見にくくなって、修正とか大変そうだなということ。
と思って調べたら、sassという便利なものがあるそうです。
sassを使うとcssを入れ子構造でかけて、重複する部分のコード量が減らせて、しかも見やすい！今は時間ないですが、余裕ができたら触ってみたいです。

#htmlは箱で考える
初心者なんで「何言ってんだ」って思われるかもしれないですが、道場コース（自分でほぼ1から作る）をやっていて、一見複雑というか、どうやって組み立てたらいいんだろうっていう部分が何個もあって、それを考えるときに、大きな箱（ヘッダーとか）に中ぐらいの箱（div）の中に小さな箱（ul）とかをいれておくんだなって感じました。


以上
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
puppeteerを使って遊びながら学んだメモ


## 開発環境

Docker Composeによる開発環境の構築(TypeScript,Node.js,Redis,Elasticsearch) - なになれ
https://hi1280.hatenablog.com/entry/2018/12/16/105201

ひとまず、こちらをベースに試した

## インフラ

Puppeteerの使い方(スクレイピング, フロントテストで活用) - わくわくBank
https://www.wakuwakubank.com/posts/620-javascript-puppeteer/

lambdaならwebsocketを使う
chroniumを使うなど切り替えできるっぽい

## waitForNavigationが有効なパターンなど理解しないずれる

PuppeteerによるヘッドレスChromeの使い方 evaluate | iwb.jp
https://iwb.jp/puppeteer-headless-chrome-evaluate/

## 特殊文字があるID名の指定が若干ややこしい

page.typeではそのままで使えたが、page.$ではエスケープ（二重にエスケープ）する必要があるっぽい
querySelectorというのを使っていたり、内部的な事情を把握すれば整理できるっぽい

Puppeteerの使い方(スクレイピング, フロントテストで活用) - わくわくBank
https://www.wakuwakubank.com/posts/620-javascript-puppeteer/

## puppeteerに限らないが型の指定で迷って妥協した

puppeteer.Pageやelasticsearch.Clientをインスタンス変数にしてみたが、
インスタンスの保持するプロパティに対してコードをうまく追いかけられなかった

## 一部、importでうまく書けなかった

```
// const launchChrome = require('@serverless-chrome/lambda');
// const CDP = require('chrome-remote-interface');
```

## コンストラクタにasyncを設定しようとして困った

あまりいい解決をしなかった気がする
decoratorとか試してみたけど違った

## いろんな指定方法

puppeteerでの要素の取得方法 - Qiita
https://qiita.com/go_sagawa/items/85f97deab7ccfdce53ea#%E4%B8%80%E3%81%A4%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%AE%E4%B8%80%E3%81%A4%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E3%81%A8%E3%82%8B

## 取得した後でさらに絞り込み

Puppeteerで page.$(selector) で絞り込んだ要素から更に子要素指定を行う - PhpStormと僕
http://vexus2.hatenablog.jp/entry/puppeteer_selector

## HowTo

puppeteerでスクレイピング - Qiita
https://qiita.com/tomi_shinwatec/items/a68cf7840c3da002c6e0

puppeteerでよく使うであろう処理の書き方 - Qiita
https://qiita.com/rh_taro/items/32bb6851303cbc613124#value%E3%81%AE%E5%8F%96%E5%BE%97

Puppeteerメモ ：： Chrome | Refills
https://syon.github.io/refills/rid/1516155/

	ワンステップ高い使い方

## MutationObserverを呼ぶ

Monitor for text change in an element · Issue #2945 · GoogleChrome/puppeteer
https://github.com/GoogleChrome/puppeteer/issues/2945

	ベースにした

JavaScriptのMutationObserverでDOMの変化を監視する方法 - Qiita
https://qiita.com/munieru_jp/items/a6f1433652124a2165e4

	アロー関数でシンプルに。

十七章第一回　MutationObserver — JavaScript初級者から中級者になろう — uhyohyo.net
https://uhyohyo.net/javascript/17_1.html

	MutationObserver自体の説明がよかった

【DOM基礎】要素内容の取得・設定／ノードの作成・挿入・削除 - Qiita
https://qiita.com/KDE_SPACE/items/3c4b52d077b8eabbe670

	domの再学習

## JSHandleってなんだろう

未解決

puppeteer/api.md at master · GoogleChrome/puppeteer
https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#jshandleaselement
23日目の２、Javascriptでクラスの使い方をマスターしました！


２３日目、２つ目のクリアです。
こちらもザクザク進む感じでいけました！

用語や考え方がPHPと共通していたので
ざくざく行けるのかなと思います。

それにしても用語がカタカナばかりで参ります。

２３日目の２
http://appdays.herokuapp.com/Day23/index2.html

#クラスを学ぼう

###オブジェクトの復習
オブジェクトの中に関数を仕込める！

###クラスの定義
`class クラス名 { }`

###インスタンスの生成
`クラス`で設計図を作り、`new クラス名()` でオブジェクトを作る。
クラスから生成したオブジェクトは特別にインスタンスと呼びます。
（またこんがらかりそうな・・・！）

###コンストラクタ
コンストラクタはインスタンスを生成するときに実行したい処理や設定を追加するための機能。
クラスの中で、`constructor() { }`	で設定する。
（PHPでは`__construct()` だった）

###プロパティ
コンストラクタの中で「this.プロパティ = 値」で追加。
「インスタンス.プロパティ」でクラスの外で呼び出せる。

###引数を受け取る
「constructor」の後の括弧「( 引数1,引数2,・・・)」で設定。

###メソッドの定義
クラスの中で「メソッド名() { }」で定義。
インスタンス.メソッド名()で呼び出し。

`定数animalに対して、greetメソッドを呼び出してください。`
ときたら、
`animal.greet();`
と返す。日本語難しい！！！

###メソッド内で値を使う
メソッド内でインスタンスの値を使用するには、「this.プロパティ名」

###メソッド内でのメソッド呼び出し
メソッド内で「this.メソッド名()」
同じクラスの他のメソッドを呼び出せる。

###クラスの継承
「Animalクラス」から「Dogクラス」を継承すると、「Animalクラス」の全ての機能を引き継いで、「Dogクラス」を作成できます。
継承は「extends」
「class Dog extends Animal」のようにする。

###オーバーライド
親クラスと同じ名前のメソッドを子クラスに作ると、子クラスが優先される。
コンストラクタをオーバーライドする場合は、最初に「super()」と記述して、親クラスのコンストラクタを実行する。

###完成！
本日２つ目の完成です！
できたJavascriptのファイルをindex.htmlに追記したのですか
Chromeのコンソールで確認できるのは１つ目のJSファイルだけ・・・？
htmlとJSをもうワンセット作ってアップしました。動いたぞ！
（所要時間 1時間）
Railsで初期データ（seed）を入れてみた

# はじめに

以前書いた、下記の続き。
https://qiita.com/ryosuketter/items/1d9b620fa2508cfda37b

今回は、Railsで初期データ（seed）をサクッと入れてみます。

# seedファイルとは

seedファイルは、簡単に言うと初期データのことです。

具体的に、どういう初期データを、どれくらいDBに入れるかは `db/seeds.rb` に書きます。

# モデルの作成

今回は記事の初期データを作成するとしましょう（データ構造はだいぶ簡易的です）。

記事のモデルを作成して、それをTOPページにリンクをつけて一覧表示させたいとします。

記事モデルの作成してみます。

```bash
$ rails g model Article title:string body:text
```

モデルをgenerateすると、マイグレーションファイルも作成されます。

```rb:[年月日時分秒日付]_create_articles.rb
class CreateArticles < ActiveRecord::Migration[5.2]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end
```

マイグレーションファイルの内容に従って、テーブルを作成したい場合は、以下のコマンド

```bash
$ rails db:migrate
```

すると、`articles`テーブルが作られます（DBは、MySQLを使っています）。

```sql
mysql> describe * from articles;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | YES  |     | NULL    |                |
| body       | text         | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
```

# コントローラの作成

```bash
$ rails g controller articles
```

記事詳細ページ用のアクションを書きます。


```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id])
  end
end
```

paramsですが、これはRailsから送られてくる情報(リクエストパラメータ)を受け取るためのメソッドで、主に２種類あります。

- Getメソッドのクエリパラメータのデータ
- Postメソッドで、主にformから送信されるデータ

今回は、TOPページからGetメソッドのクエリパラメータを送ります。
それを、showアクションにある`params[:id]`でクエリパラメータを受け取っています。
メソッドは、`Article.find`なので、`Article`テーブルの中からidが一致するデータを取得して、記事テンプレートに中にデータを入れて表示させます。

## コントローラの命名について

コントローラ名は複数形で作るのが基本ですが、単数形でも作成可能です。どちらかにするという規約はありません。

アクションが複数になりそうであれば、複数形にするのが基本で、TOPコントローラのように、アクションが1個（今回でいうと`index アクション`）だけになりそうであるならば、単数形でも大丈夫です。

参考: https://qiita.com/EastResident/items/45696af3f1e07e2df311 のコメント欄

# seedファイルの作成

少し脱線したかもですが、seedファイルの作成に戻ります。

```rb:db/seeds.rb
100.times do |i|
  Article.create!(
    title: "Title #{i+1}",
    body: "Body #{i+1}",
  )
end
```

こう書くことで、100回、Articleモデル（articlesテーブル）に、タイトルと本文に仮のテキストに挿入ごとに足されてゆく数字を挿入する。という意味になります。

# seedファイルの内容をDBに反映

seedファイルの作成ができたら、

```bash
$ bundle exec rake db:seed
```
を、実行することで、seedファイルに書かれた内容をDBに反映させることができます。

以上です！

# 参考

- https://qiita.com/takehanKosuke/items/79a66751fe95010ea5ee
- https://qiita.com/ko2ic/items/be96e450a33d631e0059
基本情報処理技術者試験対策（自分用メモ）

#　1章
・1-4補助記憶より
磁気ディスクの記録単位
①データを記録する最小単位が　「セクタ」
②セクタ同士をつないで、ディスクを一周した領域を　「トラック」
③各ディスクの中心から同じ距離にあるトラックを全部まとめた領域を　「シリンダ」

※磁気ディスクのアクセス時間
＝位置決め時間＋回転待ち時間＋データ転送時間(データを読み書きする時間)

(例)回転数が4,200回/分、平均位置決め時間が5ミリ秒の磁気ディスク装置がある。
この磁気ディスクの平均待ち時間は約何ミリ秒か？
ただし、ここでの平均待ち時間は、平均位置決め時間と平均回転待ち時間の合計数である。

>平均回転待ち時間は、目的のデータが磁気ヘッドの下に来るまでの平均時間である。
最小時間はデータが磁気ヘッドの下にある場合で0、最大1回転待たなくてはならない。
したがって、平均回転待ち時間は、1回転の時間の1/2である。
http://www.it-license.com/memory/harddisc_access.html

⇒60÷4,200≒0.014＝14ミリ秒
　14ミリ秒÷2＝**7ミリ秒**
GraalVMのメモリ使用率はすごく少なくて良い。なんとJavaの1/16！

[GraalVMを使う　→　おそい　（というか、Javaが十分早い。Goよりも。）](https://qiita.com/ukiuni@github/items/e85ac46a7e226985bfd4)
という記事を書きました。

記事中、GraalVMについて、「フットプリントの軽さや、起動の速さなどを目指しており」と書いているにもかかわらず、速度についてのみ触れ、フットプリントについて言及していなかったため、フットプリントについても確認してみました。

# 環境
MacBook Pro (Retina, 13-inch, Late 2012)
プロセッサ 2.9 GHz Intel Core i7
メモリ 8 GB 1600 MHz DDR3

# 測定
/usr/bin/time -l コマンドを使用します。
インストールされている各環境の言語バージョン、計測する実装は[前記事](https://qiita.com/ukiuni@github/items/e85ac46a7e226985bfd4)と同じです。

# 結果

| 言語 | maximum resident set size |GraalVMを1とした比率<br/>（小数点1位切り捨て） |
| --- | ---:| ---:|
| Node.js | 21,852,160 |12|
| Java | 28,856,320 |16|
| GraalVM | 1,798,144 |1|
| Golang | 1,974,272 |1|
| C#(dotnet) | 18,505,728 |10|
| Python3 | 6,537,216 |3|

# GraalVMすごい！
なんと、Javaの1/16にフットプリントを抑えることができます。
(今回はフィボナッチ数を計算するという、小さなコマンドラインツールで確認しているので、Webアプリ等、Kubernatesでサービス提供したいアプリケーションでは状況が異なると考えますが、また、コンテナのオーバーヘッド等もあるので、正確ではありませんが、）GraalVMはJavaの1/16のインフラで同一のプロセス数のサービスを提供できるポテンシャルがある、ということです。
素晴らしいですね！
（あと、Pythonが優秀なのがもう一つの驚き。）
無職だけどRailsで音楽クイズジェネレーターをつくってみた。

# 0.自己紹介 #
12月末に大手SIerを退職し、現在転職活動中の者です。実質無職。
プログラミング歴はおよそ半年ほど。主にRuby on Railsを使っています。
今回はiTunes APIを利用して何か面白いことができないかと考え、クイズサービスをつくってみました。

#1.つくったwebサービス#

[musiQ - 問題を自動生成する音楽系クイズサービス](https://musiqqq.herokuapp.com/)
>musiQは、問題を自動生成する音楽系クイズサービスです。
お好みのアーティスト名を入力するだけで、曲当てクイズが5問生成されます。
普段から聴いているアーティストでも、意外と知らない曲があるかも？
クイズは何度でもつくれます。いろんなアーティストのクイズをつくって、友達にシェアしましょう！

MusicとQuizを組みわせて、musiQというサービス名です。
某バンドのアルバム名と同じ名前ですが、気にしない。

# 2.musiQについて #
アーティスト名を入力するだけで、そのアーティストの曲を聴いて曲名を当てるクイズが5問生成されます。
イントロドンを想像してもらうとわかりやすいかもしれません。以下、使い方を記載します。

####①アーティスト名を入力し、クイズを生成####
![“ss” 2019-03-17 午後8.29.15.png](https://qiita-image-store.s3.amazonaws.com/0/299990/33c9a418-ec12-c064-7ce0-545e68f21c16.png)
####②曲を聴いて、曲名を当てる####
![“ss” 2019-03-17 午後8.29.44.png](https://qiita-image-store.s3.amazonaws.com/0/299990/e3cf17d6-c393-3d04-e9e1-f48ecb39c4b8.png)

# 3.使用している技術等 #
- Ruby
- Ruby on Rails
- MySQL
- github
- heroku

heroku卒業したいので、今後AWSを利用するつもりです。
フロントエンドにも興味があります。たまにReactを触ったり。

# 4.iTunes API #
iTunesからデータを取得するメソッドはこんな感じで書いています。
簡単です。

```ruby:post.rb
require 'itunes_search_api'

def self.search_songs(artist)
  ITunesSearchAPI.search(
      :term    => artist,
      :country => "jp",
      :media   => 'music',
      :lang    => 'ja_jp',
      :attribute => "artistTerm",
      :limit  => '200'
      )
end
```

# 5.終わりに
プログラミングを始めて半年ほどですが、自分がつくりたいものをある程度自由につくれるようになったかなと思います。今回は開発期間が2日だったために粗もあるかと思いますが、いずれ追加で機能を実装していきたいです。そして何よりも、はやく転職してたくさん開発したい。
PHP基本２

こんにちは！
**未来電子テクノロジー**でインターンをしている西尾芽衣です。

今回は、私が最近覚えた**if文**、**switch文**についてのアウトプットをします。

#if文

条件を満たしたときだけ、特定の処理をします。条件を満たさなかった時は、さらに別の処理をさせることもできます。

`if(条件)｛
条件を満たしたときの処理
｝`

条件を満たしていない時に、違う処理をさせる場合、if-else文を使います。

`if(条件){
条件を満たしたときの処理
}else{
条件を満たさなかった時の処理
}`


#switch文

switch文は、変数の値によって処理を切り替える条件分岐の構文です。

`switch(変数){
case値1:
値1の時の処理
break;
case値2:
値2の時の処理
break;
case値n:
値nの時の処理
break;
default:
どの値にもあてはまらないときの処理
}`

breakを省略してしまうと、次のcase文が実行されてしまうため、breakの付け忘れには注意が必要です。

#まとめ

今回は、if文とswitch文についてお伝えしました。
このほかに、条件分岐文には繰り返しをするwhile文やfor文があります。
pybulletで扱える凹形状を作成

凹形状のオブジェクトをPybulletで使うための方法をまとめる。

# 環境

- Windows10
- FreeCAD ver.0.17
- Blender ver.2.79

# オブジェクト作成

[FreeCAD](https://www.freecadweb.org/)でオブジェクトを作成し，stlファイルでエクスポートする。

※Ver0.17だとobjファイル作成時にcodecエラー出るのでstl形式で。

# 干渉判定用のオブジェクト作成

## 事前準備

BlenderにV-HACD(Volumetric Hierarchical Approximate Convex Decomposition)のアドオン追加

- [kmammou/v-hacd@Github](https://github.com/kmammou/v-hacd)でリポジトリをダウンロード。
- 上記ページのとおりにInstall(Blenderへアドオン追加)，Blender内でのアドオン設定する。

## 作成手順

- FreeCADで作成したstlファイルを[blender](https://blender.jp/)でインポートする。

- V-HACD buttonをクリックし，凹形状からマルチ凸形状を生成する。
- 凹形状オブジェクト部分を削除して，*-vhacd.objファイルでエクスポートする。

# 使い方

- urdfファイルを作成する。
   - Blenderでstlファイルをobjファイルに変換しただけでエクスポートした`*.obj`を`link`の`visual >> geometory`に`mesh`で読み込む。
   - BlenderでV-HACD化した`*-vhacd.obj`を`link`の`collision >> geometory`に`mesh`で読み込む。
- 作ったurdfファイルをpybulletで読み込む。

# 参考
https://github.com/bulletphysics/bullet3/issues/1507
git submodule : Git リポジトリの下のディレクトリを Git で管理

# 結論
Git リポジトリ main と sub を以下のディレクトリ構造にしたい時は

```
main/ <- Git で管理
|--- sub/ <- Git で管理
     |--- README.md
|--- README.md
```

以下のコマンドを打ちます。

```
$ cd main
$ git submodule add https://github.com/<ユーザ名>/sub.git sub
```

# git submodule を使うことにした経緯
現在、深層学習を用いた自然言語処理に関する研究に取り組んでいます。
Python でコードを書いていて、Git リポジトリ research を以下のディレクトリ構造にしていました。
ちなみに、cookiecutter のデータサイエンス用テンプレート (https://github.com/drivendata/cookiecutter-data-science) を参考にしています。

```
research/
|--- data/
|--- models/
|--- notebooks/
|--- result/
|--- src/
```

ある日、教授から API として使えるようにしてくれとデプロイを頼まれました。
Flask を使おうと思い、以下のディレクトリ構造を考えました。

```
deploy/
|--- config/
|--- flask/
|--- models/
|--- src/
```

deploy/ を Git で管理しようと思うとともに、research/src/ と deploy/src/ を共有したいと思いました。
つまり、Git リポジトリ research の下のディレクトリ src/ を Git で管理したいと思いました。

「git 下 git」 と調べても有効な情報は得られませんでした。(「ディレクトリの下」と言いませんか？)
「git 中 git」 と調べると「Git submodule の基礎」(https://qiita.com/sotarok/items/0d525e568a6088f6f6bb) という記事が見つかりました。
非常に分かりやすい記事でした。

記事を読み、以下の手順を踏みました。
1. research/src/ を Git リポジトリとして登録
2. deploy/src/ を除いた deploy/ を Gitリポジトリとして登録
3. 以下のコマンドを打つ

```
$ cd deploy
$ git submodule add https://github.com/<ユーザ名>/src.git src
```

これで research/src/ と deploy/src/ の一方を編集しても、Git で簡単にもう一方に反映することができるようになりました。
めでたしめでたし。
Django チュートリアル: 地域図書館ウェブサイト　（その５）

こちらで作成したページの続きです。
[Django チュートリアル: 地域図書館ウェブサイト　（その４）](https://qiita.com/ekzemplaro/items/092b012fb4a773fd4948)

login,logout の機能を付け加えます。（パスワードリセットの機能などは省略しています。）

次のページで行っていることの一部になります。
[Django Tutorial Part 8: User authentication and permissions](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Authentication)

1) 開発サーバーを起動し、http://127.0.0.1:8000/admin にアクセスし、ログインして、グループとユーザーを作成します。

グループは、Library Members というグループを作成します。
ユーザーは、albertu というユーザーを作成します。

2) login.html logged_out.html を作成します。

```bash
mkdir templates
mkdir templates/registration
```

フォルダーの構造は次のようになります。

```text
$ tree -L 1
.
├── catalog
├── db.sqlite3
├── locallibrary
├── manage.py
└── templates
```

```html:templates/registration/login.html
{% extends "catalog/base_generic.html" %}

{% block content %}

{% if form.errors %}
  <p>Your username and password didn't match. Please try again.</p>
{% endif %}

{% if next %}
  {% if user.is_authenticated %}
    <p>Your account doesn't have access to this page. To proceed,
    please login with an account that has access.</p>
  {% else %}
    <p>Please login to see this page.</p>
  {% endif %}
{% endif %}

<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>

<tr>
  <td>{{ form.username.label_tag }}</td>
  <td>{{ form.username }}</td>
</tr>

<tr>
  <td>{{ form.password.label_tag }}</td>
  <td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>

{# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url 'password_reset' %}">Lost password?</a></p>

{% endblock %}
```

```html:templates/registration/logged_out.html
{% extends "catalog/base_generic.html" %}

{% block content %}
  <p>Logged out!</p>  
  <a href="{% url 'login'%}">Click here to login again.</a>
{% endblock %}
```

3) catalog/templates/catalog/base_generic.html に追加

```html:catalog/templates/catalog/base_generic.html
<ul class="sidebar-nav">
（省略）
   {% if user.is_authenticated %}
     <li>User: {{ user.get_username }}</li>
     <li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li>   
   {% else %}
     <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>   
   {% endif %} 
  </ul>
```

4) locallibrary/urls.py の最後に追加

```py:locallibrary/urls.py
（省略）
#Add Django site authentication urls (for login, logout, password management)
urlpatterns += [
    path('accounts/', include('django.contrib.auth.urls')),
]
```

5)  開発サーバーを起動

ログイン前　（サイドバーに login が表示されます。）
![login_mar1701.png](https://qiita-image-store.s3.amazonaws.com/0/179446/b09dc8e9-e9b4-f61b-a0b8-c20654d54792.png)

ログイン後　（サイドバーに logout が表示されます。）
![login_mar1702.png](https://qiita-image-store.s3.amazonaws.com/0/179446/c0fea1e5-3aca-fb06-c6a3-fde9c8d3c327.png)
プログラミング学習記録29〜スライドのみの復習が良い〜

##今日やったこと
- Progate rails1~3のお気に入りに追加していたスライドの復習
- Progate rails4,5

railsの1~3については昨日選んだスライドのみ復習しました。

かかった時間は25分程度でしたが、いい復習ができたと思います。

やはり、２、３周してある程度内容が理解できたら、あとは書かずにスライドで見て復習する方がよさそうです。

rails4と5では投稿内容の編集機能、削除機能、バリデーションの機能を追加しました。

これだけでも個人で使うメモアプリとしては、十分使えるものなのではないかと思います。

ただ、まだ１周した程度で理解が甘いので、また明日挑戦します。

ということで、明日からも引き続きプログラミング学習頑張ります。
ダブルコーテーション

EasyLanguageで”の出力はどうするの？
\"
""
とかやってみたけどうまくいかない・・

でググると

```
print(doubleQuote);
```

とか

```
print("objqp.Quote[",DoubleQuote,"last",DoubleQuote,"].doublevalue = ")

```

とかいう書き方に。

ありがとう！！
【Linux】コマンドラインで動画をGIFに変換する方法

・コマンドラインから動画→GIT変換したときのメモ
・[参考](https://qiita.com/wMETAw/items/fdb754022aec1da88e6e)

1．FFmpegをインストール

```
$ brew install ffmpeg
```

2.変換

```
$ ffmpeg -i [変換したい動画] -r 10 [出力ファイル名].gif
```
・-rはオプションで，1秒あたり10枚のフレームってこと
・容量減らしたい場合はもっと小さくにする
・もっとスムーズなかんじにしたいときは大きくする


```
$ ffmpeg -i [変換したい動画] -s 320x640 [出力ファイル名].gif
```
・-sでリサイズできる
・地味に嬉しい
【テンプレート化】<head>タグに書くもの

# 【これだけは書いておけ】　HTMLのheadタグに記載するもの
何度も何度も新しいファイルを作成するごとに、同じものを書くのは面倒くさいのでコピペするためにQiitaに残しとく。
「これ足りてない！」などのものがあったら是非教えていただきたいですー。

```html
<head>
    <title>Title</title>
    <!-- 文字コードの指定 -->
    <meta charset="utf-8">
    <!-- IEで常に標準モードで表示させる -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport(レスポンシブ対応) -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- SEO -->
    <meta name="description" content="">
    <meta name="keywords" content="">
    <meta name="twitter:title" content="">
    <meta name="twitter:description" content="">
    <meta name="twitter：card" content="summary_large_image">
    <meta name="twitter:image" content="">
    <meta name="twitter:site" content="">
    <meta name="twitter:domain" content="">
    <meta property="og:site_name" content="">
    <meta property="og:title" content="">
    <meta property="og:description" content="">
    <meta property="og:type" content="">
    <meta property="og:url" content="">
    <meta property="og:image" content="" />
    <!-- css -->
    <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
    <!-- js -->
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
```
LDAPについて

# はじめに
業務にてLDAPを利用しているのですが、
LDAPの詳しいことまで学ぶ機会がなかったので、まとめてみました。

# LDAPとは
ディレクトリサービスへとアクセスするためのプロトコルです。
詳しい仕様については[RFC4511](https://tools.ietf.org/html/rfc4511)に記載されています。
クライアントはTCPポート番号389を使用してLDAPサーバに接続を行い
**属性(ユーザー名など)**で構成する**関連属性(ユーザー名に紐づく情報)**の検索、追加、削除の操作をします。
LDAPによりディレクトリサービスにアクセスする際に対象を指定する手段としてLDAP識別名を使用します。

## ディレクトリサービス
LDAPについて話す前に**ディレクトリサービスとは**についてを解決していきたいと思います。

ディレクトリサービスとは、ネットワークを利用するユーザ名やマシン名などの様々な情報を管理するためのサービスのことです。

ユーザ名などのキーとなる値から様々な情報を検索することができます。

ディレクトリサービスは閉鎖的(ローカル)な場合とグローバルな場合で利用されます。
グローバルな利用で有名なのは、分散型のディレクトリサービスの**DNS**です。
グローバルな場合には、分散型のディレクトリサービスが用いられることが多いです。

### ディレクトリサービスの特徴
* 読み取りが高速
* 分散型の情報格納モデル
* 高度な検索機能を持つ

かなり読み取りに特化した特徴といえますが、これはかなり理にかなっています。
と言うのも、ディレクトリサービスとして利用されるものは、データベースのように読み取りと書き込みが同じ頻度で発生することはありません。
読み取りは頻繁に発生するが、書き込みはほとんど発生しないことがほとんどであり、こういった思想を元に最適化されているのです。
DNSを例に考えてみると非常にわかりやすいと思います。

## LDAP識別名とは
LDAP識別名は、単に識別名（DN）とも呼ばれます。
LDAP識別名は、複数のLDAP相対識別名（RDN）をカンマで区切って並べたものになります。
```cn=hoge, cn=fuga, dc=poe, dc=piyo```
DNはDistinguished Name、RDNはRelative Distinguished Nameの略です。
LDAP相対識別名は「属性値=値」という構文で定義します。
Active Directoryでは以下の属性値が使えます。

| LDAPの属性値 | 属性表示名 | オブジェクトタイプ |
|:--|:--|:--|
| cn | Common-Name | ユーザー名、グループ名、コンピュータ名、コンテナ名 |
| ou | Organizational-Unit-Name | 組織単位（OU） |
| dc | Domain-Component | ドメイン |

## LDAPによって解決できること
ここまでで、LDAPはディレクトリサービスにアクセスするプロトコルであることがわかりましたが、具体的に何を解決してくれるかについて記していきたいと思います。

LDAPでは主に"LDAP認証"や"LDAP連携"といった仕組みにより様々なことが実現できます。よく使われるものとして以下の機能があります。

### Linuxのシステムアカウント情報の一元化
多数のLinuxクライアントがある場合、1台1台にIDパスワード情報を入れることなく、LDAPサーバ1台だけ登録すれば、どのLinuxクライアントからも同じIDパスワードでログインできるようになります。

### Linuxサーバの各種アプリでのIDパスワード統一化
ログインが必要なWebアプリサーバのIDパスワード情報を統一化することができる

### 社員情報の共有
LDAPサーバに個人についての情報を格納し、別のLinuxサーバにグループウェアサーバをインストールし利用することで登録したユーザー情報を共有することができる
また、グループウェアサーバー側にアカウント設定を行うことなく、LDAPサーバーに登録するのみでアカウントの生成等も行うことができる

## RDBとの違い
RDBでは頻繁に更新が行われ、1レコードを更新した際に、複数のテーブルが更新されることも多く、それらの一連の処理をトランザクションとして一貫性・整合性を管理しているため複雑なテーブル構造の更新処理に適しています。
しかしながら、負荷が大きいです。

一方、LDAPは簡単なツリー構造となっており、データベースのような複雑な構造は取れませんが、負荷が軽いため、システムアカウントの管理には適しています。
【iOS】プッシュ通知のOneSignalで、独自のユーザーID「ExternalUserId」を設定する

# 概要
OneSignalとは**無料で使えるプッシュ通知サービス**です。

特定のユーザーのプッシュ通知を送りたい場合、これまでは`player ID`（OneSignalが個別に割り当てるID）をもとに識別して送る必要がありましたが、
2018年12月にリリースされたver2.9.4からは、**独自のUserIDを使ってプッシュ通知を送り分けることができるようになりました。**それが`ExternalUserId`機能です。
[Release 2.9.4 Release · OneSignal/OneSignal-iOS-SDK · GitHub](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/2.9.4)

初めて使ってみたのでメモを残します。

# 使い方
とても簡単です。
UseIDを登録したい箇所で以下のメソッドを呼びます。

```swift
OneSignal.setExternalUserId(customUserId)
```

ユーザーがログアウトした場合など、登録解除したい箇所では以下のメソッドを呼びます。

```swift
OneSignal.removeExternalUserId()
```
https://documentation.onesignal.com/docs/xamarin-sdk#section--setexternaluserid-

# ダッシュボードで確認する
登録ができたかどうかをどうやったら確認できるのか若干迷ったのですが、USERSページの右上「DISPLAYED COLUMNS」から`EXTERNAL USER ID`にチェックを入れることでデータ一覧に表示させることができました。
<img width="328" alt="スクリーンショット 2019-03-17 19.38.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/112818/1a571d81-e15b-d1fd-9264-dd3d80656962.png">
[Flutter] ML KitのAndroidX問題解決。その２


こんにちは。
今回は以前の記事のつづきです。

以前の話。
[[Flutter] ML KitのAndroidX問題解決。](https://qiita.com/Dreamwalker/items/4e6431e78af626920b62)

Flutterの最新バージョン使うとAndroidX問題あと、

```terminal
Unresolved Reference: FirebaseVisionLabelDetectorOptions
```

などエラー問題があったので、自分が解決した方法を今回を機械で書いてみたいと思います。


#Class


| 変更前       　　 |変化後 |   
|:----------------------|:------------------|
| FirebaseVisionLabelDetectorOptions |            FirebaseVisionOnDeviceImageLabelerOptions| 
| FirebaseVisionCloudDetectorOptions | FirebaseVisionCloudImageLabelerOptions| 
| FirebaseVisionLabelDetector |            FirebaseVisionImageLabeler|     
| FirebaseVisionCloudLabelDetector |              FirebaseVisionImageLabeler|       
| FirebaseVisionLabel   |  FirebaseVisionImageLabel |       
| FirebaseVisionCloudLabel |             FirebaseVisionImageLabel|     

#Method 

| 変更前       　　 |変化後 |   
|:----------------------|:------------------|
| getVisionCloudLabelDetector|  getCloudImageLabeler| 
| getVisionLabelDetector| getOnDeviceImageLabeler| 
| getLabel |            getText|     
| detectInImage|              processImage|       
  

これに変えたあと、Buildしてみると、問題もなかったし、インストールもMLKITも
問題なく使うことができました。

読んでいただきありがとうございます。
また。
PRML演習問題1.4

![1章 序論-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/221435/c5930278-003c-58a2-7203-77a0e3d47504.jpeg)
![1章 序論-9.jpg](https://qiita-image-store.s3.amazonaws.com/0/221435/3c935074-6213-17fe-ff96-e27edff97551.jpeg)
font-weight:900;って何？！

#boldとかlighterなら知ってるけど数値？！

実はfont-weightは数値で管理されていて、100～900まであります。

#ちょっと細かく
||||
|:-----------------:|:------------------:|:------------------:|
| font-weight          |              100 |        一番細い        |
| font-weight|    400(normal)         |       初期値       |
| font-weight        |              700(bold) |        太い        |
| font-weight|900|一番太い|
| font-weight|lighter|相対的に一段階細くなる|
| font-weight|bolder|相対的に一段階太くなる|
#どんな時に使うか

フォントの太さ変えるときに使いましょーー

#使い方

`code`
h1{ font-weight: 900;}
p{ font-weigth: bold;}
a{ font-weigth: lighter;}
Xamarin.Forms.WPFでListViewのViewCellをウインドウ幅に追従させる

現状のXamarin.Forms.WPFのListViewのViewCellは、ウインドウ幅を変えても、大きさが変わりません。そこで、カスタムレンダラーで、ちゃんとウインドウ幅に追従するようにしてみました。

# 実装

### .NET Standard 
```C#
namespace CustomListView.Controls
{
    public class CustomListView : ListView
    {
        public CustomListView() : base()
        {
        }

        public CustomListView(ListViewCachingStrategy cachingStrategy) : base(cachingStrategy)
        {
        }
    }
}
```

### WPF
```C#
[assembly: ExportRenderer(typeof(CustomListView.Controls.CustomListView), typeof(CustomListView.WPF.Renderers.CustomListViewRenderer))]
namespace CustomListView.WPF.Renderers
{
    public class CustomListViewRenderer : ListViewRenderer
    {
        protected override void UpdateWidth()
        {
            base.UpdateWidth();

            if (Control != null && Control.ItemsSource != null)
            {
                foreach (var item in Control.ItemsSource)
                {
                    if (item is ViewCell viewCell)
                    {
                        var element = Platform.GetRenderer(viewCell.View)?.GetNativeElement();
                        if (element != null)
                        {
                            element.Width = Control.Width - 36;
                        }
                    }
                }
            }
        }
    }
}
```
ウインドウ幅が変わった時に、`UpdateWidth`が呼ばれるので、そこで、全`ViewCell`の幅を変更するようにしています。

# 結果
### 通常
![listview.gif](https://qiita-image-store.s3.amazonaws.com/0/236182/fa0ddee2-9776-e0ac-cd1e-f91b218997c8.gif)
### CustomListView
![customlistview.gif](https://qiita-image-store.s3.amazonaws.com/0/236182/0abf5cb0-588d-b35c-130f-b2c034489240.gif)

# ソース
全体のソースは[こちら](https://github.com/f-miyu/CustomListView)です。
Javaみたいなディレクトリ構成のPythonプロジェクトをNoseで一括テストする

# 背景

ある日、PythonのプロジェクトをJenkinsで自動テストしたいという話がありました。

それだけなら別に難しいことはありませんが、問題はそのプロジェクトのディレクトリ構成。

```terminal:ディレクトリ構成（イメージ）
project
├── src
|   ├── common
|   |   └── util.py
|   ├── service1
|   |   └── module1.py
|   └── service2
|       └── module2.py
└── test
    ├── common
    |   └── test_util.py
    ├── service1
    |   └── test_module1.py
    └── service2
        └── test_module2.py
```

**なんかJavaみたいな感じになってるぞ。**Pythonの標準から外れているので工夫が必要そうですが、ひとまずやってみましょうか。

# Noseの普通の使い方

Pythonでは、以下のような構成がスタンダードのようです。

```terminal:Pythonの標準的なプロジェクト（パッケージ）構成
project
├── package
|   └── {ソースコード}
└── tests
    └── {テストケース}
```

`import package`でこのパッケージのモジュールを使用するイメージですね。

一方、`nosetests`のデフォルトの仕様は以下のようです。

- ワーキングディレクトリはコマンドを実行した場所となる（そこから`import`するモジュールを探す）
- 「名前にtestが付いたディレクトリ」を再帰的に探索し、そこにある「名前にtestを含むPythonモジュール」をテストケースと見なして実行する

よって上記の標準的な構成の場合は、`project`直下で`nosetests`と打つだけで全テストケースを実行してくれます。簡単！

# Java風プロジェクトでnosetestsしてみる

まず、結論は以下のようになりました。

```:コマンドプロンプト
set PYTHONPATH=src;src\service1;src\service2
nosetests --tests=test\common,test\service1,test\service2
```

`PYTHONPATH`環境変数にパスを指定しておくと、`nosetests`実行時にそこからもモジュールを探索してくれます。また、`--tests`オプションでテストケースの場所を複数指定できます。

![ディレクトリ構成.png](https://qiita-image-store.s3.amazonaws.com/0/269194/969f0838-ae1a-455e-652b-a3dfdebe8dd1.png)

`PYTHONPATH`で指定しているのは図で四角で囲ったディレクトリです。これは、

- `module1.py`と`module2.py`は、テストケース内で直接`import module1.py`としていた
- `util.py`は、`module1.py`などで`from common import util`としていた

ためです。

```python:module1.py
from common import util

def function1():
    print('module1.function1() is called.')
    util.hello()
```

```python:test_module1.py
import unittest
import module1

class TestModule1(unittest.TestCase):

    def test_function1(self):
        module1.function1()
```

またテストケースは、`test`ディレクトリにさらに`common`や`service1`などのディレクトリを作成してその中に作成していたので、`nosetests`の自動探索の範囲から外れていました。そのため、`--tests`で個別に指定してあげる必要があります。

こう書くと簡単そうですが、元々Pythonにあまり詳しくなかったこともあって、調査にかなり時間がかかりました。やはり標準に沿うのが一番ですね。
コマンド実行結果がエラーであることを確認しやすくする

![smiley.gif](https://qiita-image-store.s3.amazonaws.com/0/285675/593423b4-27e2-93c4-9005-b8800683cb08.gif)

こんな感じでコマンドの終了ステータスが非ゼロの時にだけ泣いて教えてくれます。

以下は上の GIF の設定です。

```sh
smiley() {
    local err=$?
    if [[ ${err} -ne 0 ]]; then
        echo -e "\e[5;31m(T.T) ${err}\e[m "
    fi
}
PROMPT='`smiley`'"%F{yellow}%~
%K{cyan}MBP%k%F{cyan} >%f "
```

Zsh 用なので Bash でも使うためには `PROMPT` の色を書き換える必要があると思います。