OmniAICreator/Qiita-1.07M huggingface dataset:
Macで.soファイルを試してみる

Macで.soファイルを試してみた。
ほぼ手順通りだが、Linuxでなく、Macが故にうまく行かない部分があったのでメモ。


#その1
https://pasela.hatenablog.com/entry/20071112/so

1. sonameの代わりにinstall_name
 - これはうまく行かない
     - gcc -shared -Wl,-soname,libhello.so libhello.lo -o libhello.so
 - 代わりにこれを実行
     - gcc -shared -Wl,-install_name,libhello.so libhello.lo -o libhello.so

1. ldconfigは不要
 - これはうまく行かない。というより不要
     - ldconfig -n .
     - 不要な理由は以下を参考
         - https://teratail.com/questions/80596


#その2
https://qiita.com/kiida/items/9d26b850194fa1a02e67

1. javahはjdk10や11では使えなさそう
 - java8に切り替えて試した
     - https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2
 - javahが使えないと理解した元の情報
     - https://github.com/JacisNonsense/Pathfinder/issues/51

1. .soでなく、.jnilibを作成
https://stackoverflow.com/questions/761639/why-am-i-getting-this-unsatisfiedlinkerror-with-native-code
 - これだとこの後の手順でエラーが出る
     - gcc -fPIC -shared hello.c -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/darwin/ -o libhello.so
 - こちらに変更
     - gcc -fPIC -shared hello.c -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/darwin/ -o libhello.jnilib
Grand control to major tom from JApan osaka web developer

# My career について思い出しながらスタバで語る実験



# 見てみないふりをされるhidden属性なエンジニアに私はなりたい

存在するが存在しない、それがオレにはちょうど良い
Qiitaでいいねがついてほしい、そう思っていた時期も昔はありました
今では子供のように、世間からうとまれるどころか

そういえば昔はよく詩を書いていたもんです
僕がはじめての仕事を得たのも、詩のサイトでした、夢想詩って言って分かる人はいるでしょうか
あの頃懐かしい四人同盟やらを組んで、それがWeb開発者としての始まりになったものです

詩といえばよく自動書記的にテキストをずらっと書き溜めていったものです
高校生時代の頃からの趣味で、神のノートからキーボードに

そうです世の中に無視されるということは、とてもとても心地が良いことです
負け惜しみで言ってるんじゃありません、これだけ大きな声で叫んでも、誰にも怒られないことが嬉しいのです😁
ちょっとあのひと近寄りがたい、まるで存在しないかのように扱われることが快感です

今では自己承認欲求を振り切る方法が分かってきました
それは自己承認欲求に溺れる暇もないほどに、アウトプットを繰り返すことでしかありません
まるで筋肉少女帯の歌のように、あと80年かけてカルトな人気でも博せたなら、なんだか人生は面白いかも知れませんね

やばいこれは本当のポエム
Qiita荒らしと言われても過言ではない
ええと真面目なことを書かなくちゃ‥

# 人に歴史あり

- 高校生時代、よく詩を書いていた
- それをPCでキーボードに打ち込むようになった
- 詩の出版社に応募して、プロの詩人などになりたいと思っていた

# 挫折とget job

- パソコンがとても嫌いだったけど、詩のサイトの投稿するようになった
- Web黎明期の感動を目の当たりにして、人生が変わった
- 自分で詩のサイトを立ち上げて、それが総合掲示板として発展して、GoogleAdsense で10年自営業で暮らしていられた

# 今ではOsakaWebDeveloper 

- そもそも基礎が出来ていないのでただひたすら勉強の日々
- 社会人経験ゼロから会社づとめを始めたので周りに迷惑をかけてばかり
- まともな社会人とのらりくらりとした子供の間を行ったり来たりする日々

# なにか最後にひとつ教訓でも残したいけれど

- こいつは本当のポエムだから答えなんかない
- 意外なきっかけが今の職業の源泉だったりしないだろうか？そこにresource sourceがあるかもしれない
- もしあなたがここまで幸運にも読み勧めた、人生に迷う survivor だったりしたら、resourceは未来にじゃなく、実は自分の過去にあるかも知れないと思いだしてほしい

# Ground control to major tom

ああお迎えが来たみたいだ

![image](https://user-images.githubusercontent.com/13635059/50571446-72264900-0dee-11e9-8812-338c7a4d4870.png)

# 2019-01-01 18:00

笑えよ‥！ 😁😁😁

![image](https://user-images.githubusercontent.com/13635059/50571471-14dec780-0def-11e9-890e-5c483c1eb056.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AndroidでAdMobの初期化時にクラッシュする

## はじめに
[前回の記事](https://qiita.com/masaibar/items/fdc1a7ee46de0edcd612#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)で大見得を切ったからには年末年始中に何か一つアプリを作ろうとしてハマったのでメモを残しておきます。

## 概要
下記の環境で発生した事象をまとめています。
・ Android Studio 3.2.1
・ Kotlin 1.3.10
・ firebase-ads: 17.1.2

## やったこと
https://firebase.google.com/docs/admob/android/quick-start?hl=ja の手順に従って下記を実行。

### app/build.gradle
依存関係を追加し、促されるままにアップデート

```
// implementation 'com.google.firebase:firebase-ads:16.0.1' ←アップデート前

implementation 'com.google.firebase:firebase-ads:17.1.2'
```

### Application.kt
SDKの初期化

```Application.kt
MobileAds.initialize(this, ADMOB_APP_ID)
```


しかしビルドしようとすると下記のエラーメッセージを吐いて落ちる

```
2019-01-01 17:15:30.332 30306-30306/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.masaibar.sample, PID: 30306
    java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: 
    
    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************
    
    
        at android.app.ActivityThread.installProvider(ActivityThread.java:6445)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5987)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5902)
        at android.app.ActivityThread.access$1100(ActivityThread.java:200)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.IllegalStateException: 
```

## 対処方法
とりあえずエラーメッセージ記載のURLに従ってAndroidManifest.xmlにmeta-dataを追加したら解決しました。
よく見るとFirebaseのAdMobとはそもそもページが違い、よく読んでみるとAdMobを使いたい人のうちFirebaseは使わない人向けとなっているけど大丈夫なんだろうか…

https://developers.google.com/admob/android/quick-start#update_your_androidmanifestxml

```AndroidManifest.xml
<manifest>
    <application>
           :
          (中略)
           :
           <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ADMOB_APP_ID"/>

    </application>
</manifest>
```

とか思ってたら[英語版のドキュメント](https://firebase.google.com/docs/admob/android/quick-start?hl=en)にはバッチリ書いてありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68671/df759667-5a16-e69c-1f6b-8035db4346df.png)

## おわりに
Googleのお家芸である日本語版マニュアル最新版になっていない案件でした、これに懲りて英語版で見る癖つけていきましょう💪
EC2 に LAMP環境 (php7.2) を作る

# EC2 に LAMP環境 (php7.2) を作る

AmazonLinux2 で amazon-linux-extras リポジトリを使って LAMP 環境を作る

```sh
# 素のリポジトリでは PHP 5.4 系しかインストールできないことがわかる
sudo yum list | grep php
```

## LAMP 環境

色々なリポジトリを登録して様々パッケージを個別にインストールしていると、後に依存性エラーでることがあるので一箇所でまとめて入れておきたい

```sh
# 一覧表示
amazon-linux-extras

# 作られる LAMP 環境について表示
amazon-linux-extras info php7.2

# インストール。色々入る
sudo amazon-linux-extras install php7.2

# オプション一覧。なんだかんだ不足しているものを自分でここから探す
sudo yum list | grep amzn2extra-php7.2

# 足りないものを追加。amzn2extra-php7.2 から優先的にに探す
sudo yum install php-common php-gd php-mysqlnd php-mbstring php-pdo php-xml

# この後 php-xml が反映されていないことがあったのでインスタンスを再起動した
```

### EPEL リポジトリ

これで最新の EPEL リポジトリも使える

```sh
sudo amazon-linux-extras install epel
```

### composer インストール

**medium** 位のインスタンス使わないと後に `composer update` で落ちるので注意

```sh
cd

# composer のダウンロード
curl -sS https://getcomposer.org/installer | php

# パスが通っている場所へ移動させる
mv composer.phar /usr/local/bin/composer

# ログアウトして反映
```

### 参考

- [チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)

#### あとがき

AmazonLinux2 上で Let's encrypt が動作する Python 環境をうまく作れなくなったりもしたので、あんまり考えずにリポジトリをぽんぽん登録してパッケージ追加ばかりしない方がよい。依存性こわい
なぜ要件定義は失敗するのか

##はじめに
当方、大したことないエンジニアですので一般論と照らし合わせると、
「そんなわけないでしょ」とか「そんなの間違ってる」等々
様々引っかかる方もいらっしゃるでしょう。
しかし、実際に現場で出くわしたものから得られるものをシェアしてこそ、
Qiitaっていいなと思うのです。

###Q.システム要件定義はどうして失敗するの？
まず、ここで私の言うシステム要件定義とは、所謂基幹業務を対象としています。
つまり、業務ありきのシステムということになります。
基幹業務のシステムに関わる方ならわかって頂けるかと思いますが、
システムが業務に振り回されてデザインを損ねる、というのはよくあるパターンだと思います。

話を戻して、、システム要件定義は往々にして失敗してしまいます。
というか、私は成功した経験がまだありません。

ちょっと自分に区切りが良いタイミングだったので、どうして上手くいかなかったんだろう、
と振り返ってみたのが今回の記事です。

###A.業務とシステムには大きな隔たりがあるのです。
まぁ、そうですよね。と言っても始まらないので、改善点を考えてみます。
そもそも、基幹業務の要件定義、特に大規模となると一体どこから手を付けたらいいの？
って人が大半です。

前述の通り、業務とシステムを見比べることができるものが必要です。
俺たちはコレをシステム化するんだ！という羅針盤が無ければ海難事故間違いなしです。

---
###業務→システム化の必須アイテム
####**　１．業務フロー**
　何はともあれまずはこれです。これがないと始まりません。
　失敗する要件定義は、大概ここで失敗しています。
　業務フローが間違っているとか、業務フローに描かれていない業務があるとか(怒)
　まぁ、私が直近で対応したPJでは業務フローが存在しなかったんですが。
　これでは成功しようがありませんよね。
　まさに前述の羅針盤がない状態です。

####**　２．DFD**
　どんな業務を通してどんなデータフローとなるのか、要件定義時に確認しないといけません。
　ここで、各業務でどのようなデータパターンが存在するのか洗い出すことが、
　システムテストの精度を高める大きな要因となります。
　ほんとに工数が足りないとき、業務フローにデータパターンをぶら下げて、
　どこに画面を用意するか、どこをバッチ処理にするのか検討してみました。
　突貫でしたがなかなか効果がありました。

###足りなくね？
はい、足りないです。
他にも要件定義をする上で必要な、エンジニアが用意しなければならないドキュメントは多々あります。
本記事では「まずこれ絶対必要だよね？」というものに絞っています。
まだまだ未熟者ですので、この記事を見て「もっとこういうの準備した方がいいよ」と感じられた方、
どしどしコメント頂きたいです。
実務から得られる知見に勝るものはないと思っていますので、
様々にご活躍されている方々からの意見、貴重に受け止めさせていただきます。

###忘れがち、次フェーズ準備
要件定義が終わったからと言って、いきなり基本設計は始められません。
間違ってもいきなり機能単位のWBSなんて引いてはいけません。

基本設計では何を成果物とするのか？どこまで書くの？
全体のジョブネット誰が作るんだ？
いやいや、まずは画面とバッチ一覧だ！

とか、基本設計の出だしで大紛糾してしまいます。

###結局、何が必要なの？
IPA等も参考にして、準備すればいいです。
ただ、世の中にはその全てのドキュメントを用意する工数がない、
また業務そのものがとても複雑で整理そのものに工数/期間が掛かるものがあります。
実際、私がそんな状況で一体何をミニマムマストとして仕事を進めればよいのか、
非常に困ってしまいました。
今振り返ってみて、今回は本当に最低限、絶対いるよ！という事象に絞りました。

###基本設計では？
基本設計のお話はまた別の機会として、今回の記事では要件定義に関わる部分を記載してみました。
拙いですが、また基本設計の巻を書いてみます。
git push事故を、気合ではなく、GitHub Branch Protectionで防ぐ

# masterにpushしないよう注意しましょう

昔はそんなことを気にしていました。今でもそういう現場があるかもしれません。

現在はGitHubのブランチプロテクションという素晴らしいものがあります。使いましょう。無料です。人類の注意力には限りがあるので、仕組みで防ぎましょう。

# 公式マニュアル

* [Defining the mergeability of pull requests \- User Documentation](https://help.github.com/articles/defining-the-mergeability-of-pull-requests/)

ブランチプロテクションは、リポジトリのAdmin権限を持っているか、OrganizationのOwnerロールであれば、設定できます。ブランチ毎に設定を組み立てます。

# 設定画面は

リポジトリ -> Settings -> Branches -> Add rule

<img width="1028" alt="スクリーンショット 2019-01-01 18.04.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/22947/0138df17-1eff-283a-e368-3e4e367d3abb.png">

# 設定例

例として、gitflowっぽく、

* プルリクは、developから生やして、developにマージする
* developは、masterから生やして、masterにマージする
* hotfixのプルリクは、
    * masterから生やして、masterにマージする
    * developにもマージする

とかそんな運用をしてるイメージで。

## develop

* レビュー必須。いつでもapproveしてOK。ただし、approve後に更新されたら、再度approveが必要にする。approve後に、対応漏れが発覚して、追加のcommitした、などの場合を想定してます。
* CIの正常終了が必須
* リポジトリにAdmin権限を持ってるメンバーも例外なく適用

で、画像のようにチェックつけていきます。developブランチへのpushがガードされるのと、developブランチ宛てのプルリクに関して、レビューとかCIとかが必須になります。

<img width="750" alt="スクリーンショット 2019-01-01 17.08.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/22947/7e94c847-0068-cbb7-302e-39b553551498.png">

## master

* レビュー必須。いつでもapproveしてOK。ただし、approve後に更新されたら、再度approveが必要にする。approve後に、対応漏れが発覚して、追加のcommitした、などの場合を想定してます。
* hotfixを想定して、CIの終了は待たずともマージして良いことにする
    * 平時は、プルリクでCI必須にして担保しているから良しとする
    * 緊急時は、レビューで担保する。だって緊急でしょ
* リポジトリにAdmin権限を持ってるメンバーも例外なく適用

masterブランチへのpushがガードされるのと、master宛てのプルリクに関して、設定どおりにガードされます。

<img width="750" alt="スクリーンショット 2019-01-01 17.09.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/22947/2cbecd5c-0e08-bdb2-11c9-cddc9eb37675.png">
GASの勉強を始めて1週間でWebAppを作成した話

#概要

正月も近いということで正月に因んだアプリを作成し2019年1月1日に公開することに決めました。

今回、GAS(Google Apps Script)で開発を行った理由は3点あります。
1.新しい言語を扱いたかったため
2.思いついたのが、2018年12月25日であり、1週間で勉強して公開する必要あったため。
→これまでに、JavaScriptとVBAを学習してきたので、短時間で習得が容易だろうと感じた。
3.Google系のサービス（G Suite）と連携できることを知ったため。
→例えば、Gmailでメールの通知が来たものをGoogleスプレッドシートに書き出しDBの様に扱うことができるようにできる。

#作成したもの
「[ポジティブおみくじ](https://script.google.com/macros/s/AKfycbxfkffWR6akSAuUf2-odQUh3KoC3SnOmqSTTin5ZYpf/dev)」→左記URLからおみくじを引くことが可能です！！
正月に因んだアプリは何がいいかと考えた時に、おみくじはいかにも正月っぽい感じがしたのでおみくじアプリを作ることにしました。しかし、ただのおみくじアプリではつまらないのではと感じました、何か付加価値をつけられるものはないかと考えました。そこで、思いついたのがポジティブおみくじです。普通のおみくじだと小凶から大凶までの悪い運勢を引いてしまうことがあり、くじ引きの結果が落ち込んでしまう方もいらっしゃるのではないかと感じました。それで、おみくじについて調べて見たところ京都の伏見稲見神社に一般的な、大吉、中吉、吉、末吉、凶、大凶など以外にも、大大吉、吉凶不分末吉、凶後大吉などの、運勢があることを知り参考にして下記の3つの条件の中で2つ満たされる運勢とメッセージを考え作成しました。

- メッセージがポジティブ
- 運勢が凶、大凶の場合は、将来的にいい運勢になるもの
- ネタになりそうな運勢

下記が実際の流れです。この流れでは一番運勢が良い大大吉を引いています。
![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/299197/207fd16f-546a-0cc7-9751-c32e00a546d8.gif)

#作成に使用したもの
- Googleスプレッドシート
    - おみくじの運勢、解説、メッセージ、各運の数値を格納するDB<img width="1317" alt="スクリーンショット 2019-01-01 17.29.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/299197/b4c3f413-802f-f1e6-cb0a-618211a60482.png">

- GAS
    - Googleスプレッドシートに、DBとして格納した値を取得
    - doget()でHTMLファイルをWeb表示
- HTML
    - 言わずもがな
- CSS
    - Webページのスタイルを指定
- JavaScript
    - 1. GASで取得したスプレッドシートの値を設定
    - 2. 運勢、解説、メッセージ各運の数値をランダム表示
    - 3. 各運の数値はそれぞれの運勢ごとにランダム表示
    - 4. 各運の数値は表示する際、数値　数値分の★を一緒に表示
    - 5. おみくじ終了時にTwitterリンク生成
 
#ざっくりとした流れ
1日目：アイデア出し、おみくじ調査、設計、GAS勉強
2日目：GAS勉強、スプレッドシートのDBを作成　モック作成
3日目：少し寄り道して、おみくじの前にGASで抽選アプリ作成
4日目：GAS、HTML完成。JSは1〜3まで作成完了
5日目：JS完成
6日目：デザイン完成　簡易なテスト

#所感
1月1日に公開できるかは不安でしたが、公開できて一安心です。
製作中は、目立ったエラーに悩まされることがなく、わりかし、スムーズに開発できた印象があります。それと同時に、自分で決めた1月1日に公開できるか焦りもありましたが、開発している最中は楽しかったです。
あとは、今回、公開した時に達成感があって、この感覚を大事にしたいなと改めて思いました。

#最後に
「[ポジティブおみくじ](https://script.google.com/macros/s/AKfycbxfkffWR6akSAuUf2-odQUh3KoC3SnOmqSTTin5ZYpf/dev)」良かったら、2019年の運試しということでよろしければ、引いて見てください。

また、ハッシュタグは[#ポジティブおみくじ](https://twitter.com/search?q=%23ポジティブおみくじ&src=typd)なので、ハッシュタグ付きで呟いてもらえると嬉しいです。

改善案・修正案がありましたら、お気軽にコメントいただけると有難いです。
最後まで読んでくださりありがとうございました。
仕事とプライベートのアイデンティティを1個にしたいアジャイル開発エンジニア

# Twitter Github Medium あたりのプロフ画像を変えたい

# Before private

瞑想的なアイコンだった

![image](https://user-images.githubusercontent.com/13635059/50570943-85321c80-0de0-11e9-8297-db44c48e7271.png)

# Before work


![image](https://user-images.githubusercontent.com/13635059/50570938-5ddb4f80-0de0-11e9-926f-3570b1319066.png)

# NEw combined identity

- これをコンバイン！ SEでもありプライベートでもある‥アジャイル開発感
- 休日でもずっと勉強しているし、日常生活がすべてエンジニアリングやサービスの発想のたねになる、そんな人に私はなりたい
- というわりにプログラミングのコード書くより日本語的なサービス、素人UI/UX論に傾注してる昨今ですが、

![image](https://user-images.githubusercontent.com/13635059/50570930-3be1cd00-0de0-11e9-90eb-65e43a960179.png)

# アイデンティティ大事

- プロフィール画像やアイコンはアイデンティティに深く根ざした問題
- Microsoft とか超グローバルな会社とか、Appleとか、アイコンにすべてのシンボルが含まれている
- 自分のアイデンティティの扱いに敏感になりたい、というか敏感でない人はいない、サービスからランダムに割り振られた画像でさえ、いずれアイデンティティとして「オレだ！」って感じで確立する

# アカウントを一個に統合

- Twitterを統合
- QiitaからもTwitterにリンク
- 昔は勇気が必要なことだった

---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
flashlight  と wav2letter++ をビルドするメモ

C++ 機械学習ライブラリ

https://github.com/facebookresearch/flashlight

のビルドメモです.

## 環境

* Ubuntu 16.04
* CUDA 9.2
  * CUDA 10 ではビルドはできるが arrayfire の cublas テストが失敗するので動かないかも

## Docker ビルドでは動かない...?

flashlight には Docker でのビルドがありますが, こちらの環境ではドライバのバージョンとかが悪いのか, Docker 環境に nvidia-docker で入って flashlight example を動かそうとすると GPU に最初にアクセスするときあたりで止まってしまいました.
 
したがってネイティブ環境でビルドしてみます.

## ネイティブ環境でビルドする.

基本的には Dockerfile に書かれているようにすればコンパイルと動作ができます.

まずは flashlight が依存している arrayfire をビルドします.

## コンパイラの設定

普段 ccache を使うために CXX=`ccache clang++` としていますが, nvcc が ccache をうまく扱えない & clang++ が新しすぎると(2019 年 01 月 01 日時点 7.0.0 とか) nvcc がうまく動かないので, `CXX=g++ cmake ...` などとして gcc を指定しておきます.

### arrayfire + CUDA 10

flashlight は CUDA 9.2 をターゲットにしています. 一応 CUDA 10 でもコンパイルできますが, cublas テストが失敗するのでまだ使えないかもです
(また, deprecated な math_function.h を使っている warning が出ます)

CUDA 10 を利用している場合は, arrayfire のビルド時に cmake が古いと cublas を見つけてくれません.
cmake 3.13.2 以上であれば cublas を見つけてくれます.

cublas は apt で入るものを使いました.

## wav2letter++

オーディオ関連のライブラリを apt で入れます.

```
$ sudo apt install libflac-dev libsndfile1-dev
```

他の依存ライブラリはソースからビルドしないとダメそうです.

`$HOME/local` をインストール先にするものとします(`-DCMAKE_INSTALL_PREFIX=$HOME/local`)

### gtest

Getst は ubuntu で入るのは古いので, ソースからビルド(v1.8.x)します.　

### sndfile

sndio 周りでビルドに失敗するので sndio を off(cmake/SndFileChecks.cmake でコメントアウト)にしてビルドします.

### KenLM

test プログラムのビルドで `isnan` エラーがでるかもしれません. `std::isnan` に書き換えておきます.

KenLM は cmake install では `bin` しかインストールしてくれないので, ビルドしたディレクトリと .a のパスを後述の cmake に設定します.

### MKL

Intel のサイトから落としてインストールします.

### cmake configure

cmake の引数で `GTEST_ROOT=/path/to/gtest` で gtest のディレクトリを指定します.

`INTEL_MKL_DIR` で MKL のインストールディレクトリを指定します.
 
ccache や clang だと nvcc 内部でのコンパイラ呼び出しで失敗したりするので, Ubuntu 標準の g++, gcc を使うようにします.

最終的にこんな感じになりました.

```
rm -rf build
mkdir build

CXX=g++ CC=gcc cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -DCRITERION_BACKEND=CUDA \
  -DINTEL_MKL_DIR=$HOME/intel/mkl \
  -DKENLM_DIR=$HOME/work/kenlm \
  -DKENLM_LIB=$HOME/work/kenlm/build/lib/libkenlm.a \
  -DKENLM_UTIL_LIB=$HOME/work/kenlm/build/lib/libkenlm_util.a \
  -DGTEST_ROOT=$HOME/local
```


## TODO

* CUDA10 で動かす
* なんだかんだで依存ライブラリが多いのでビルドスクリプトを用意する
* Docker で動かない原因を探る
約数を高速で列挙するコード(Python)

約数を高速で列挙するコードです(計算量$O(\sqrt{N})$)
問題の制約が$10^9$でも間に合います。
ほぼ自分用のメモとして投稿

(@yucatioさんの指摘を受け，小さい約数のリストと大きい約数のリストを最後に結合する方法に変えました．)

# コード
```Python
def make_divisors(n):
    lower_divisors , upper_divisors = [], []
    i = 1
    while i*i <= n:
        if n % i == 0:
            lower_divisors.append(i)
            if i != n // i:
                upper_divisors.append(n//i)
        i += 1
    return lower_divisors + upper_divisors[::-1]
```
PythonでcsvファイルをParquet形式に変換

# 背景
大きいデータセットのアドホック分析を AWS Athena で行うにあたり、csv データをApache Parquet 形式に変換することでスキャンデータを小さくすることによりコスト削減ができます。 Parquet 形式への変換はいくつか方法がありますが、今回は Python を使って行います。

>ファイルを圧縮し、さらに Apache Parquet などの列形式に変換した場合、サイズは 3 分の 1 に圧縮され、Amazon S3 でのデータは最終的に 1 TB になります。ただしこの場合、Parquet は列形式なので、Amazon Athena で読み取る必要があるのは、実行されているクエリに関連する列のみです。当該のクエリは 1 つの列のみを参照するものであるため、Athena ではその列のみが読み取られ、ファイルの 3 分の 2 は読み取らなくてよいことになります。Athena で読み取られるのはファイルの 3 分の 1 のみであるため、S3 からスキャンされるデータは 0.33 TB のみになります。

参考：[Amazon Athena の料金](https://aws.amazon.com/jp/athena/pricing/)

## Apache Parquetとは
Apache Parquet とは csv などの行志向のデータフォーマットと違い、列志向のフォーマットで、列単位でデータを取り出す分析用途に向いています。
参考：[カラムナフォーマットのきほん 〜データウェアハウスを支える技術〜](https://engineer.retty.me/entry/columnar-storage-format)


Python における Parquet フォーマットのファイルサイズや読み込み時間の比較は下記の記事がとても参考になります。
参考：[Python: Apache Parquet フォーマットを扱ってみる](https://blog.amedama.jp/entry/2017/10/10/135331)

# 手順
parquet への変換は [pyarrow ](https://arrow.apache.org/docs/python/)を使用します。

```shell
# pyarrow のインストール
$ pip install pyarrow
```

```python
# Parquetフォーマットへの変換
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.read_csv('../data/raw/train.csv')
table = pa.Table.from_pandas(df)
pq.write_table(table, '../data/processed/train.parquet')
```
【備忘録】Progate PHP 道場コースⅠ まとめ

Progateで学習中のPHPについて、すぐにコードを見直せるように『PHP　道場コースⅠ』の11問目をメモしています。

```answer.php
CURRYは900円です
PASTAは1200円です
COFFEEは600円です
合計金額は2700円です
PASTAが最高価格で1200円です
```

```index.php
<?php
$menus = array(
  array('name' => 'CURRY', 'price' => 900),
  array('name' => 'PASTA', 'price' => 1200),
  array('name' => 'COFFEE', 'price' => 600)
);

// この下にコードを書いてください
$totalPrice = 0;
$maxPrice =0;
$maxPriceName = '';
foreach ($menus as $menu){
  echo $menu['name'].'は'.$menu['price'].'円です'.'<br>';
  $totalPrice += $menu['price'];
  if ($menu['price'] > $maxPrice){
    $maxPrice = $menu['price'];
    $maxPriceName = $menu['name'];
  } 
}
echo '合計金額は'.$totalPrice.'円です'.'<br>';
echo $maxPriceName.'が最高価格で'.$maxPrice.'円です';
```

上が問題と正答です。

下が解説です。

```setting.php
$totalPrice = 0;
//数字を一つずつ足していくためにまず元となる変数を設定する。
$maxPrice = 0;
//数字を二つ並べて比較し、大きい方と入れ替えるために、最初の数字を仮に設定する。
$maxPriceName = '';
//$maxPriceのメニュー名を入れるための変数を設定する。
```。

```totalPrice.php
$totalPrice += $menu['price'];
//ループのvalue要素を一つずつ取得し足していく。
```

```maxPrice.php
if ($menu['price'] > $maxPrice){
    $maxPrice = $menu['price'];
    $maxPriceName = $menu['name'];
  } 
//ループ処理の中で$maxPriceよりも大きい['price']が現れたとき、$amxPriceにその['price']を代入（上書き）する。
//同時に['price']を持っているkey要素の名前を上書きする。
FOOBARキーボードを作る 【キーマップ】2019/01/01

あけましておめでとうございます。
さて、空想で良さそうなキーマップはイマイチだったので、ESC/DEL/ENT/SPACEを再検討。

#変更後の配置
ESC/DEL/ENT/SPACEは外側じゃないと使いにくい感じだったので、試しに変更してみた。
ホームポジションが決まらないのが打ちにくい要因かもしれない。小さすぎるのも考えもんかも…
![foobar_keyboard-layout_20190101.png](https://qiita-image-store.s3.amazonaws.com/0/283328/0617afb4-f613-3266-4481-39539f091b28.png)
お正月キャッシュを使ってみた Web UI

[お前らの年賀状は古い - Qiita](https://qiita.com/serinuntius/items/df24fbceffeb7c6f1942)

# URL

https://onenga.cash/#/

# Twitter

![image](https://user-images.githubusercontent.com/13635059/50571166-82d2c100-0de6-11e9-8723-260a03c58231.png)

# Textarea

![image](https://user-images.githubusercontent.com/13635059/50571170-93833700-0de6-11e9-87d5-6b62f7be9718.png)

# Unable to input 入力できない‥

下の方にあった

![image](https://user-images.githubusercontent.com/13635059/50571173-b4e42300-0de6-11e9-8aad-305a4642e26f.png)

# 反映

![image](https://user-images.githubusercontent.com/13635059/50571175-bca3c780-0de6-11e9-8241-74a4e81eff68.png)

# タイトルとメッセージがあるらしい

![image](https://user-images.githubusercontent.com/13635059/50571177-ca594d00-0de6-11e9-95ef-cafa51a72b55.png)

# タイトルどこ？

![image](https://user-images.githubusercontent.com/13635059/50571179-d47b4b80-0de6-11e9-87f9-15c9b156e919.png)

![image](https://user-images.githubusercontent.com/13635059/50571180-db09c300-0de6-11e9-9444-75863df0c441.png)

# まだエラー？

前回分が残ってるだけかも

![image](https://user-images.githubusercontent.com/13635059/50571184-eeb52980-0de6-11e9-854a-064e12b73092.png)

# Tweet可能に

![image](https://user-images.githubusercontent.com/13635059/50571185-f70d6480-0de6-11e9-98e0-9546b00184e9.png)

# 主にスマホ用っぽい

# 受け取りは‥？

unn unable to find ..

tobecontinued

github signed by https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Elasticsearchで覚えておくと便利そうなAPI

# 実行環境
erasticsearchは3ノード1クラスタです。``discovery.zen.minimum_master_nodes: 2``の設定で、マスタノードが2つ、Dataノード、ingestノードが3つに設定しています。



# Cluster関連

## ヘルスチェック

```:GET
$ curl http://localhost:9200/_cat/health?v
```

```:レスポンス
epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1546327889 07:31:29  docker-cluster green           3         3      2   1    0    0        0             0                  -                100.0%
```

このAPIよりも詳しい情報を得るときは以下のAPI

```:GET
$ curl http://localhost:9200/_cluster/health?pretty
```


```:レスポンス
{
  "cluster_name" : "docker-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 1,
  "active_shards" : 2,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
```

## cluster topology

```:GET
$ curl http://localhost:9200/_cat/nodes?v
```

```:レスポンス
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.112.5           30          97   4    0.00    0.12     0.48 mdi       *      node1
192.168.112.2           46          97   4    0.00    0.12     0.48 di        -      node3
192.168.112.6           49          97   4    0.00    0.12     0.48 mdi       -      node2
```

## マスタノード

```:GET
$ curl http://localhost:9200/_cat/master?v
```

```:レスポンス
id                     host          ip            node
4wIo7aA2QnKhZI4LWziIsA 192.168.112.5 192.168.112.5 node1
```

# Index関連

## 一覧

```:GET
$ curl http://localhost:9200/_cat/indices?v
```

```:レスポンス
health status index     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana_1 -rOVd1zWRPmkvUiLZ-lT3Q   1   1          3            0     23.9kb         11.9kb
```

簡易的にJSONで受け取るとき

```:GET
$ curl localhost:9200/_aliases?pretty
```

```:レスポンス
{
  ".kibana_1" : {
    "aliases" : {
      ".kibana" : { }
    }
  }
}
```


## index指定

```:GET
$ curl http://localhost:9200/_cat/indices/$(indexName)?v
```

```:レスポンス
health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   test  oJzlCNeyS_6M-9msye8t-A   5   1          0            0      2.2kb          1.1kb
```
Vim の左右上下移動の HJKL って考慮されて出来たの？ ショートカットは歴史

# いつまで経っても覚えられないんだけど？

- 僕だけでしょうか
- 世界で最もユーザーに適応を求めるショートカットのような気がする
- 歴史的経緯を知ってる偉い人がいたら教えてください‥🙇‍♂️🙇‍♂️🙇‍♂️

# ショートカットは歴史

- いちどつけてしまうと変えられない。
- 時間が経てば経つほど変えられなくなる。
- キーボード配列の成り立ちがそもそもという話も。

# 押しやすい配列、覚えやすいマッピングにしよう

- 左手に集中させる、MAcなどのPC環境向けの場合、重要なアクションを
- あまり使われなさそうなキーは押しにくい場所に割り当てて良い

# そういえばGoogleChromeがMacのタブ切り替えのマッピングを変えたよね

- 今ではすっかりCommand+Option+Arrow keysが身についた
- いちど定着したショートカットを変える時は、慣れ親しんだユーザーには相当な混乱をもたらす
- だけど断固として維持すれば、ユーザー側が勝手に適応するかもしれない

一時的に [ ] のやつが使えなくなっていて‥新しいキーを気に入るようになった

github signed by https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pythonでデフォルト値、環境変数、オプションで値を指定する

# やりたいこと

* python実行時のオプション引数、環境変数、コード中のデフォルト値で、プログラムの実行者が任意の方法で値を指定したい
* 同一の名前に、複数の値を指定された場合、オプション引数が最優先、次が環境変数、その次がコード中のデフォルト値としたい。

# 環境

python2.7

# コード

```python
#!/usr/bin/env python2
# coding: utf-8
import argparse
import os

def get_arg_default(name):
    name_default_map = {
        'foo': os.getenv('FOO', 'in_code_default'),
    }
    return name_default_map.get(name)

parser = argparse.ArgumentParser()
parser.add_argument('--foo', default=get_arg_default('foo'))
args = parser.parse_args()
print(args.foo)
```

# 実行結果

確認するコマンド

```bash
unset FOO
./a.py
FOO=env_value ./a.py
FOO=env_value ./a.py --foo arg_value
```

結果

```Console
# unset FOO
# ./a.py
in_code_default
# FOO=env_value ./a.py
env_value
# FOO=env_value ./a.py --foo arg_value
arg_value
```

# 参考資料

* https://docs.python.org/2.7/library/os.html
* https://speakerdeck.com/tcnksm/komandorainturunituiteyu-rutokinipu-falseyu-rukoto-number-yapcasia?slide=65
* https://stackoverflow.com/questions/10551117/setting-options-from-environment-variables-when-using-argparse
英語でtypoする長い単語には、だいたい省略名、省略表記が用意されている #133

- synchrinizing  -> sync
- kubernetes -> k8s
- internationalization -> i18n

# Conculusion

typoする、打ちにくいと思ったら省略名を探してみよう
英語圏の人も打ちにくいと思っているからたぶん
github signed by https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Curlであけましておめでとうございます！

あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は、libcurl使ってC言語にしようとかと思ったのですが、面倒になりbash+curlになりました。

# Environment

* Windows 10
* git for Windows + curl.exe

# Code

git for Windows 入れるだけで、Bashが使えるのはマジに便利。

```bash
#!/bin/bash

export LANG=C
export LC_ALL=C

send_mail()
{
  _host=$1
  _user=$2
  _password=$3
  _from=$4
  _to=$5
  _subject=$6
  _body=$7

  _msgtxt=`/usr/bin/mktemp`
  _xmailer="Bash+Curl Mailer"

  echo "From: ${_from}"        >> "${_msgtxt}"
  echo "To: ${_to}"            >> "${_msgtxt}"
  echo "Subject: ${_subject}"  >> "${_msgtxt}"
  echo "Date: $(date)"         >> "${_msgtxt}"
  echo "X-Mailer: ${_xmailer}" >> "${_msgtxt}"
  echo ""                      >> "${_msgtxt}"
  cat "${_body}"               >> "${_msgtxt}"

  curl --url "smtp://${_host}"  \
       --mail-from "${_from}" \
       --mail-rcpt "${_to}" \
       --user "${_user}:${_password}" \
       --upload-file ${_msgtxt}
  
   _status=$?
   [ -f "${_msgtxt}" ] && rm -f "${_msgtxt}"
   return $?
}


make_body()
{
  _name=$1
cat << EOD
${_name}さん
2019年01月01日になりました。
あけましておめでとうございます。
今年もよろしくお願いします。
EOD
}

##
## main
##

host=example.co.jp:587
user=dharry
pass=userpassword
from=dharry@example.com
subject="I wish you a Happy new year 2019"

tolist[0]=hoge1@example.com
tolist[1]=foo@example.co.jp
tolist[2]=bar@example.org

for to in ${tolist[*]}
do
  name=$(echo $to | awk -F"@" '{ print $1 }')
  body=$(mktemp)
  make_body $name > "$body"
  send_mail "$host" "$user" "$pass" "$from" "$to" "$subject" "$body" 
  [ -f "${body}" ] && rm -f "${body}"
done


```
Railsで既にあるモデルのscaffoldをadmin以下に作る

## 環境
Rails 5.2.2
Ruby 2.6.0

## 参考
ほぼこのままですが、Rails5でもできたというのと、一部直しが必要だったのでメモ程度に記事にしました。
https://qiita.com/mogya/items/24561a6fddd6cc018536

## 手順
既にあるUserモデルに対してscaffoldを生成したい。ただし、adminというネームスペースを付けたい。
つまり、既にあるモデル`app/models/user.rb`に対して、`admin/users`とか`admin/users/:id/edit`とかのURLで操作できるように、`app/models/admin/users_controller.rb`とか`app/views/admin/users/index.html.erb`とかを生成してほしい。
Userモデルはnameフィールド（文字列型）のみを持っているとします。

参考記事の通りやってみる。

```
$bin/rails g scaffold_controller admin/user name:string --model-name=user
```

一部うまくいかなかったので直しました。

``` edit.html.erb
- <%= link_to 'Show', @user %> |
+ <%= link_to 'Show', [:admin, @user] %> |
```
``` show.html.erb
- <%= link_to 'Edit', edit_user_path(@user) %> |
+ <%= link_to 'Edit', edit_admin_user_path(@user) %> |
```
``` users_controller.rb
- format.html { redirect_to @user, notice: 'User was successfully created.' }
+ format.html { redirect_to [:admin, @user], notice: 'User was successfully created.' }
※#createと#updateの2カ所
```

たぶんこれでOK。
Bash環境でエイリアス(alias)の定義をしよう

# はじめに
Bash環境でエイリアス(alias)を定義、一覧表示、削除してみよう。

# エイリアスの定義
## 一時的にエイリアスを定義する
`alias name='value'`コマンドで、エイリアスを定義します。

```
$ alias pshttpd='ps aux | grep httpd'
```

定義したエイリアス名を入力すると、ジョブが実行されます。

```
$ pshttpd
papapap+  7403  0.0  0.1 112668   976 pts/0    R+   15:43   0:00 grep --color=auto httpd
root     28361  0.0  2.9 433368 14672 ?        Ss    2018   8:02 /usr/sbin/httpd -DFOREGROUND
apache   31824  0.0  1.8 435588  9140 ?        S     2018   0:00 /usr/sbin/httpd -DFOREGROUND
apache   31825  0.0  1.8 435588  9140 ?        S     2018   0:00 /usr/sbin/httpd -DFOREGROUND
apache   31826  0.0  1.7 435588  8912 ?        S     2018   0:00 /usr/sbin/httpd -DFOREGROUND
apache   31827  0.0  1.7 435588  8912 ?        S     2018   0:00 /usr/sbin/httpd -DFOREGROUND
apache   31828  0.0  1.8 435588  9140 ?        S     2018   0:00 /usr/sbin/httpd -DFOREGROUND
apache   32093  0.0  1.8 435588  9136 ?        S     2018   0:00 /usr/sbin/httpd -DFOREGROUND
```

## 恒久的にエイリアスを定義する
`alias`コマンドでエイリアスを定義しただけでは、次回ログイン時にはエイリアスが削除されてしまいます。
恒久的にエイリアスを定義したい場合は、　`~/.bash_profile`ファイルや`~/.bashrc`ファイルに`alias name='value'`を記載します。

```~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
export paper=papapapaper

alias datemin="date '+%y%m%d'"
```

`alias name='value'`を記載した後は、`$ source .bash_profile`コマンドでファイルの読み込みを行います。

```
$ source .bash_profile
```

定義したエイリアス名を入力すると、ジョブが実行されます。

```
$ datemin
190101
```

# エイリアスの一覧表示
`alias`, `alias -p`コマンドでエイリアスの一覧を表示できます。

```
$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias pshttpd='ps aux | grep httpd'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
```

```
$ alias -p
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias pshttpd='ps aux | grep httpd'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
```

# エイリアスの削除
`unalias name`コマンドで、エイリアスを削除します。

```
$ unalias datemin
```

恒久的に定義したエイリアスは、`unalias`コマンドで削除しても次回ログイン時に復活します。
　`~/.bash_profile`ファイルや`~/.bashrc`ファイルに記載した`alias name='value'`を削除してください。
i wanna combine private and work identity at @twitter icon also @Github

# also Github Medium  and other services

# Before private

meditation close eyes

![image](https://user-images.githubusercontent.com/13635059/50570943-85321c80-0de0-11e9-8297-db44c48e7271.png)

# Before work

company color yellow and black

![image](https://user-images.githubusercontent.com/13635059/50570938-5ddb4f80-0de0-11e9-926f-3570b1319066.png)

# NEw combined identity

have a book for engineering ajail

![image](https://user-images.githubusercontent.com/13635059/50570930-3be1cd00-0de0-11e9-90eb-65e43a960179.png)

# Life changing time?

big time changes

![image](https://user-images.githubusercontent.com/13635059/50570955-b7dc1500-0de0-11e9-8ef2-fabb705d57c7.png)

---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
2019年の素数になる日を求めて人生に備える

# はじめに
2019年Qiita初めです。

何番煎じかわかりませんが、日付が素数になる日を求めて表示するプログラムの2019年バージョンです。
言語特有の書き方ができそうだなと思ったのでちょっと書いてみました。

# ルール
- 2019年の日付について、日付を8桁整数として扱い素数かどうかを判定、素数であれば画面表示します。
    - `yyyyMMdd`というやつです。
    - `2019/01/01` は `20190101` です
- 最終的に何日素数になる日があるかを最終行に出力します。

# 結果
- オンラインエディタで出力を見れるようにしました。
    - https://run.dlang.io/is/fqNZDq
- 素数である日
    - 2019-02-21
    - 2019-02-27
    - 2019-03-01
    - 2019-03-19
    - 2019-03-23
    - 2019-04-21
    - 2019-05-23
    - 2019-05-29
    - 2019-06-01
    - 2019-06-13
    - 2019-07-19
    - 2019-08-11
    - 2019-08-23
    - 2019-09-13
    - 2019-10-09
    - 2019-10-27
    - 2019-11-09
    - 2019-11-17
    - 2019-12-31
- 2019年に素数となる日は19日あります。
- なんと2019年の大晦日、`20191231`は素数です！

# 実装
D言語で書きました。

シングルファイル形式なので、そのまま適当なファイルにコピペして `dub run --single app.d` で動きます。

またはオンラインエディターで実行結果のほうでも確認できます。
https://run.dlang.io/is/fqNZDq


## 素朴な書き方
```dlang
/++ dub.sdl: +/
import std.experimental.all;

void main()
{
    auto current = Date(2019, 1, 1);
    auto end = Date(2019, 12, 31);
    size_t total = 0;

    while (current <= end)
    {
        auto n = toNum(current);
        if (isPrime(n))
        {
            total++;
            writeln(current.toISOExtString());
        }

        current += 1.days;
    }

    writeln("Total: ", total);
}

int toNum(Date date)
{
    return date.year * 10000 + date.month * 100 + date.day;
}

bool isPrime(int n)
{
    for (int i = 2; i * i <= n; i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
```

# 日付範囲をRangeで扱うバージョン
D言語では`std.datetime.interval` というモジュールがあり、日付の列挙も簡単で柔軟です。

```dlang
/++ dub.sdl: +/
import std.experimental.all;

void main()
{
    auto interval = Interval!Date(Date(2019, 1, 1), Date(2020, 1, 1)).fwdRange(date => date + 1.days);
    size_t total = 0;

    foreach (current; interval)
    {
        auto n = toNum(current);
        if (isPrime(n))
        {
            total++;
            writeln(current.toISOExtString());
        }
    }

    writeln("Total: ", total);
}

int toNum(Date date)
{
    return date.year * 10000 + date.month * 100 + date.day;
}

bool isPrime(int n)
{
    for (int i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
            return false;
    }
    return true;
}
```

# 最後に
プログラミングたのしい！
誰かワンライナー版書いてくれませんかー
Google Play Publisher Gradle Plugin を1系から2系に更新する

# 概要
Google Play に APK をアップロードできる [Google Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) を1系から2系に更新してみます。

リリースノートを見る限りだと2系に上がったばかりなので、まだ更新する必要はなさそうでしたが、今後は App Bundle でリリースしたいと思ったので、試してみます。1系の導入や、必須となるサービスアカウントの準備等は [過去の記事](https://qiita.com/toastkidjp/items/9c023981324a1ce2bfb7) に書いてあるので、そちらをご覧ください。

## なぜ、この Gradle Plugin を使うのか？
業務でのアプリケーションのリリースでは CI/CD の一連の流れで自動的に APK や App Bundle をアップロードできていると思います。そうした充実したインフラが用意されていない個人でのアプリ開発では、人手で APK をアップロードすることが多くなりがちです。人手での作業はミスが起こりやすいので、可能な限り自動で実施できた方がよいでしょう。

この Gradle Plugin は、基本的なコマンドだけでも以下を自動的に実行してくれます。

1. APK や App Bundle のビルド
2. 1の成果物と mapping.txt を Google Play へアップロード

加えて、リリースノートの更新等も設定を追加すれば可能となります。これらを Gradle Plugin 単独で実現でき、ローカルのPC上で実行できる（CI/CD環境不要）点が強みです。

## なぜ、2系を使うのか？
Android App Bundle をアップロードしたい場合は2系を使う必要があります。

[Gradle Play Publisher 2.0.0 beta 1](https://github.com/Triple-T/gradle-play-publisher/releases/tag/2.0.0-beta1)

# 作業

## キーの差し替え
2系はp12形式のキーでないと認証できないようです。推奨は JSON の方でしたので、p12形式のキーを持っていないことが多いかと思います。その場合は [サービスアカウントのページ](https://console.developers.google.com/iam-admin/serviceaccounts)から取得します。

## build.gradle の修正
まず、プロジェクト root の build.gradle に書かれているプラグインのバージョンを書き換えます。

```diff:build.gradle
buildScript {
-        classpath 'com.github.triplet.gradle:play-publisher:1.2.0'
+        classpath 'com.github.triplet.gradle:play-publisher:2.0.0-rc1'
```

この記事を書いている段階だと、まだ 2.0.0-rc が最新のようでした。
https://mvnrepository.com/artifact/com.github.triplet.gradle/play-publisher

次に、アプリケーションの方を修正します。```android```の中に入っていた ```playAccountConfigs``` ブロックと ```play``` ブロックを消し、 ```android``` ブロックの外側に ```play``` ブロックを新しく書きます。そこに、従来の ```play``` ブロックの記述と ```playAccountConfigs``` ブロックの記述を書きます。

```diff:app/build.gradle
android {
-    playAccountConfigs {
-        defaultAccountConfig {
-            serviceAccountEmail = 'dummy-service-account@api-dummy-dummy.iam.gserviceaccount.com'
-            jsonFile = file('signing/Google Play Android Developer-dummy.json')
-        }
-    }
-
-    play {
-        track = 'beta'
-        untrackOld = true
-    }


+play {
+    track = 'beta'
+    serviceAccountEmail = 'dummy-service-account@api-dummy-dummy.iam.gserviceaccount.com'
+    serviceAccountCredentials = file('signing/api-dummy-dummy-dummy.p12')
+}
```

あとはコマンド1つでリリースできます。

```
$ gradle publishApkRelease
```

# おわりに
[Google Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) の 1系から2系への更新は、以下の2ステップだけで OK でした。

1. キーの差し替え（.json -> .p12）
2. build.gradle の書き換え


Android App Bundle でのリリースを考えている場合は、今後2系への更新を進めていくとよいでしょう。

# おまけ
バージョンコードによっては以下のエラーが出るかもしれません。

```
$ gradle publishApkRelease

* What went wrong:
Execution failed for task ':app:publishReleaseApk'.
> Version code 10000 is too low for variant release.
```

この場合は、現在のリリースバージョンのコードに近いものを指定し直して、再度コマンドを実行してみてください。
Refactoring Ruby リファクタリング おでん 

![image](https://user-images.githubusercontent.com/13635059/50570260-a6860f00-0dc6-11e9-9bfe-6ca559e8c7d7.png)

- コンビニのおでんは健康的だし満足感も満腹感も高いし、大根で栄養もとれるし、ダイエットの味方だから食べたい。
- でも買う時のコストも高くてつい別のものを選んでしまう。プロテインバーとかおにぎりとか。
- コストの一因に食べるときの熱さハフハフ！があると気付いたから、崩してみた。冬の寒空で冷やす。

# 連想

- リファクタリングではメソッドの分割をしたりして、なるべく細かくクラスの振る舞いや役割を砕く。
- 細かすぎてもオデンが冷えるのでだめだけど、だいたいは大きすぎるので、よく噛み砕くと良い。
- おでんはリアルタイムで温度変化する。クラスやドメイン的な要件も全く固定されておらず、どんどん温度が変わっていくので、そのたびにおでんの適切な管理が必要。

![image](https://user-images.githubusercontent.com/13635059/50570268-2c09bf00-0dc7-11e9-956d-47d430458a41.png)

# Google translated

- The oden of a convenience store is healthy, the satisfaction is also full of satiety, I can get nutrition with radish and I want to eat it because it is a friend of a diet.
- But the cost of buying is also high, so I choose another one. Protein bars and rice balls.
- Heat when you eat as part of cost Hough Huff! I noticed there was, so I broke it. Cool in the cold winter.

Association

- In refactoring, divide method and break break down behavior and role of class as finely as possible.
- Even if it is too tiny, Oden gets cold, but it is usually too big, so you better chew it.
- Oden changes temperature in real time. As classes and domain-like requirements are not fixed at all, the temperature changes rapidly, so it is necessary to properly manage oden each time.
Send feedback








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
2019-01-01 お正月元旦 Qiita 落ちた？ 予告メンテ？ Github Issue に記事を書くと良いかも？

![image](https://user-images.githubusercontent.com/13635059/50570366-c53ad480-0dcb-11e9-99f2-114952d24910.png)

# Togetter

https://togetter.com/li/1304120

# 予告メンテだった？

![image](https://user-images.githubusercontent.com/13635059/50570367-ec91a180-0dcb-11e9-864d-1c8e142b1043.png)

# Twitter騒然

![image](https://user-images.githubusercontent.com/13635059/50570372-25ca1180-0dcc-11e9-81c0-6b6fc1294c11.png)

![image](https://user-images.githubusercontent.com/13635059/50570373-2bbff280-0dcc-11e9-8541-b328b536808d.png)

# 仕方ないので Gitbub issue に下書き用記事を書いておく

自分の名前のアカウントの、自分の名前のレポジトリ

https://github.com/YumaInaura/YumaInaura/issues


# 何故こんなことを？

- 同じようにmarkdownで書ける
- 同じように Mac で image upload できる、Ctrl+v で
- そのままQiitaに再利用できる 実はGituhub に upload した image も Qiita で使える、普通に

---

https://github.com/YumaInaura/YumaInaura/









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
メンテンナンス予告はユーザーに分かる場所で告知しよう。アクセス機会 x 掲載期間 x 視覚的面積 #UI #サービス 

# ユーザーの命が失われる

人命問題。

![image](https://user-images.githubusercontent.com/13635059/50570558-7ee97380-0dd3-11e9-9796-bfab48b567c6.png)

# どうすれば良いか

ユーザーが分かる場所に告知しよう。

# さる情報筋によると、Twitterや公式ブログで触れられていたらしい

誰も気付いていなかった。

# Twitterや公式ブログは「誰もが見る場所？」

no

# 誰もが見る場所って何？どこ？

- サイト本体。
- ヘッダに赤い線で「メンテしますから‥！！！！！！！！！！！」って書こう
- Wikipediaで「寄付してください‥！」てきな、うっとうしいぐらいの目立ちぐらいで

![image](https://user-images.githubusercontent.com/13635059/50570673-f53ba500-0dd6-11e9-81ed-0f21906c6dcf.png)

# 気付きやすい場所と提示方法の掛け算

考慮すべき点

- ユーザーのアクセス数、アクセス機会、掲示期間
- ファーストビューに設置、告知の視覚的サイズ、色も目立ちやすく
- 時間、目に映る面積、ユーザーへの接触機会、あらゆる線を最大化して、最大面積を作る

![image](https://user-images.githubusercontent.com/13635059/50570669-ddfcb780-0dd6-11e9-8fc4-42c002da2dc9.png)


# いや、これだけ目立たない場所に告知するということは、何か意図あってのことかもしれない

理由を考えてみよう。
また明日。
わっかるっかな。わっかるっかな‥


---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
HTTP4K を最小構成で動かす

# 概要
Kotlin 製の Web アプリケーションフレームワーク [HTTP4K](https://github.com/http4k/http4k) を使った最小のアプリケーション開発について説明します。

## [HTTP4K](https://github.com/http4k/http4k) とは？
サーバーサイドのアプリケーションを開発するための Kotlin 製フレームワークです。
Kotlin Conf 2018 のセッション資料だとサーバーレス環境向けのフレームワークという触れ込みですが、単にマイクロWebアプリケーションを開発するのにも使えます。
[README](https://github.com/http4k/http4k/blob/master/README.md) を見ると、テストもしやすい設計になっているようです。

## なぜ HTTP4K か？
Kotlin は Java のアプリケーションフレームワークを（ほぼ）そのまま使うことができるため、すでに実績のあるフレームワークを用いるという選択肢もあります。
ただ、その方法だと Java の記法上の制約や NonNull/Nullable の穴による意図しない不具合に注意する必要があり、Kotlin を使うメリットが減少しかねません。
フル Kotlin で開発されたアプリケーションフレームワークを使うことで、その問題は解消されます。

また、フル Kotlin のアプリケーションフレームワークはほかにもありますが、 HTTP4K は純粋にアプリケーション開発にフォーカスして開発されているので、
通常の Web アプリケーション開発のコンテクストで開発をすることができます。

一方で、プロトタイピング目的で小さい Web アプリケーションを Kotlin で開発するのであれば、Spark-Java ＆ Spark-Kotlin という選択肢もあります。
そちらに比べると、HTTP4K は記述量がちょっと多くなると感じました。

----
# 使ってみる

## Hello world
以下のコードで十分です。

```kotlin
import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.routing.bind
import org.http4k.routing.routes
import org.http4k.server.SunHttp
import org.http4k.server.asServer

fun main(args: Array<String>) {
    routes("/hello" bind Method.GET to { _: Request -> Response(OK).body("hello!!") })
            .asServer(SunHttp(8000))
            .start()
}
```

……これで十分ですが、 import が結構多いので手軽感はやや薄いかもしれないです。

# Gradle Application Plugin と組み合わせて使う
Java 用の Gradle Application Plugin を使う場合、また IDE に Kotlin の main メソッドを認識させたい場合、object クラスの main メソッドに @JvmStatic アノテーションを付けるとよいらしいです。

```kotlin
object Main {

    @JvmStatic
    fun main(args: Array<String>) {
```

あとは build.gradle を修正します。具体的には main メソッドのある object クラスの FCDN を mainClassName で指定します。

```groovy:build.gradle
apply plugin: 'application'

mainClassName = "jp.toastkid.http4k.example.Main"

//...
```

これで ```gradle run``` を実行すればアプリケーションが起動するようになります。

### Fat jar
Fat jar を作りたい場合は以下を追記してください。

```groovy:build.gradle
jar {
    manifest {
        attributes 'Main-Class'   : mainClassName
    }
    destinationDir = projectDir
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
```

これで ```$gradle jar``` を実行すると Fat jar が出力されます。 出力された Fat jar を使い、 ```$ java -jar http4k.example-0.0.1.jar``` を実行すれば、アプリケーションが起動します。

# 参考
- [Kotlin Application with Gradle application plugin](https://stackoverflow.com/questions/47766179/kotlin-application-with-gradle-application-plugin)
- [Server as a Function in Kotlin - KotlinConf 2018](https://speakerdeck.com/s4nchez/server-as-a-function-in-kotlin-kotlinconf-2018)
find と where の違い

whereの後に値を取り出せなかったのは、
where は配列を返すので、その中のオブジェクトの中の値を直接取り出すことはできないから。
where に find と同じような動きをさせたい場合には first をつけたりして where 句で返された配列の中からどのオブジェクトにメソッドを繋げるのか明示しましょう


参考：https://qiita.com/7coco/items/b08c842aece4b7f28f55
Web初心者向け。GET と POST の違いって何なの？ URLにどう反映されるの？ざっくり説明。

# 超基本だと思うんだけど、意外と知られてなかったりする

# Web書道を例に勉強

http://web-shodo.com/select.html
![image](https://user-images.githubusercontent.com/13635059/50570157-1a251d80-0dc1-11e9-824d-1f3e023fc345.png)

# ここで横長用紙を選ぶと

http://web-shodo.com/shodo.php に飛ぶ

# 画面更新すると、ダイアログが出る


![image](https://user-images.githubusercontent.com/13635059/50570160-3628bf00-0dc1-11e9-930f-7a9f71f76e10.png)


# 実は移動リンクがpostボタンで実装されている

URLには送信内容が反映されない、それがPOST

# ところでGoogleでWeb書道を検索すると？

![image](https://user-images.githubusercontent.com/13635059/50570162-683a2100-0dc1-11e9-8e36-1815f7eb8fd7.png)


# これがGET な URL

`?` のあとに色々パラメータがついてる

https://www.google.com/search?q=web%E6%9B%B8%E9%81%93&oq=web%E6%9B%B8%E9%81%93&aqs=chrome..69i57j69i61l3j69i60.2711j0j7&sourceid=chrome&ie=UTF-8


# GET な URLは再利用が可能

このURLにアクセスすれば、だいたい誰でも同じ検索結果が参照できる。

ただしあまり長い文字数は使えないので POST 送信との兼ね合いが必要。

4000文字ぐらいだったっけ？もっと多かった？

# これはモダンな世界ではなくWeb黎明期的な話

Webブラウザで確認できる牧歌的なあの頃のように僕らは生きていたいじゃないか…。

# AJAX なURLの説明とかは誰かに任せました

勉強させてください…


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/120








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニア学習にpodcast活用してる？ 「エンジニアリング組織論への招待」 著者の podcast を発見！  @hiroki_daichi @yunon_phys

# きかっけはTwitter

https://twitter.com/hiroki_daichi/status/1079929199538855939



# emfmとは

![image](https://user-images.githubusercontent.com/13635059/50570036-6f5f3000-0dbd-11e9-9427-9b62a6d4d748.png)

**E** ngineer **M** anager の ラジオ **FM** 的なものらしい

# Engineering ManagerによるEngineering ManagerのためのPodcast

people for the people 的な

https://anchor.fm/em-fm

# ところで anchor.fm って何

https://anchor.fm/

podcast を作るベストウェイらしい

![image](https://user-images.githubusercontent.com/13635059/50570039-8a31a480-0dbd-11e9-9a7c-26190100a5e7.png)



# 以上発見報告でした‥それだけです

イヤホンも持っていないので聴けない‥podcast勉强にはそれなりの装備が必要そうです‥


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/119

# ref

[エンジニアリング組織論への招待：リファレンスガイド第１章/第２章 - Qiita](https://qiita.com/hirokidaichi/items/195d42ee056ea85a3150)


[【エンジニアリング組織論への招待】を10~15分で読めるように1万文字程度でまとめてみた - Qiita](https://qiita.com/kamesennin/items/89d479112554a6f9d038)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Expand Github textarea i wanna!!!!! Failed to Ghost text Extension Google Chrome

![image](https://user-images.githubusercontent.com/13635059/50569993-332ad000-0dbb-11e9-8276-3c0b31435553.png)

# Tooo narrrowwww to meeeeeeeeeeeeeee!

![image](https://user-images.githubusercontent.com/13635059/50569994-3d4cce80-0dbb-11e9-96a8-594c2f31e838.png)

Highly stressfull!!!!!!!!!!!!!!!!!!!

# Yes i can expand with Google Chrome feature but ... i wanna it be DEFAULT!!!

![image](https://user-images.githubusercontent.com/13635059/50569997-5786ac80-0dbb-11e9-8c83-7f5332356f33.png)

# HOW ?

# HOW I GET COMFORTABLE INPUTTING OUTPUTTING LIFE AND GET HAPPY FOREVER>?>>>

i wanna found 

# Googling

`google chrome expand textarea extenstion`

# Ummm???

![image](https://user-images.githubusercontent.com/13635059/50570008-d845a880-0dbb-11e9-8770-0b8048ab87be.png)

no

# ummmm??

![image](https://user-images.githubusercontent.com/13635059/50570007-d54ab800-0dbb-11e9-9778-bade5d7d5254.png)

# Why???

![image](https://user-images.githubusercontent.com/13635059/50570012-f6130d80-0dbb-11e9-9c19-fb130f5a2ebf.png)

# Click on the one you want to use.

i clicked....

What does mean "click"...

hey please teach me somebody ... how to use this looks great extension...

https://github.com/YumaInaura/YumaInaura/issues/118

---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->