Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
Stream で遊んでみる(ついでに String でも遊んでみる) いやあ、遅延評価は面白い。ということで、はじめてなElixir(2)の続きをやるはずが、ちょっと寄り道して Stream で遊んでみます。備忘録の色彩が強いです。 Haskell: 片っ端から遅延評価 Elixir: 一部が遅延評価 Rust: 全部 Eager Eval ということらしいので、IoT用に時間順序を気にしながら、それでも遅延評価を使いたい向きには… Elixir しかないんじゃないでしょうか?! 無限リストであそぶ @zacky1972 先生のご紹介で [@HirofumiTmamori さんによる「翻訳 Elixirのストリーム」] (https://qiita.com/HirofumiTamori/items/abf9a9478bfc1161000c) を見ながらやってみますね。ただ、これ ver が
static ERL_NIF_TERM asm_1_nif_ii(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { long a, b; if(__builtin_expect((enif_get_int64(env, argv[0], &a) == 0), 0)) { goto error; } if(__builtin_expect((enif_get_int64(env, argv[1], &b) == 0), 0)) { goto error; } if(__builtin_expect((a > LONG_MAX - b), 0)) { return error_atom; } long result = a + b; return enif_make_int64(env, result); error: return
Phoenix で API サーバーを構築すると、基本的に JSON レスポンスに含まれるキーの名前はスネークケースとなります。しかし、JSON レスポンスを扱うクライアント側では言語の都合上キャメルケースを使用したいケースが考えられるでしょう。 これを簡単に実現するのが proper_case です。proper_case は、map のキーをスネークとキャメルの間で相互に変換するライブラリですが、これをPhoenixプロジェクトで使用することで、キャメルとスネークの自動変換を可能とします。 以下の記事では、proper_case を使用した キャメルとスネークに変換方法について説明します。 環境 本記事の内容は、以下の環境で動作確認をしています。 Elixir: 1.7.2 OTP: 21.0.5 API サーバーの用意 説明を簡単にするために、ここでは blogs と comment
Phoenix1.3にはCookieを使ったSession機能が最初から提供されています。ですからPhoenixでマルチユーザのアプリを作るにはSessionを使うのが基本でしょう。前に「Phoenix1.3+Guardian1.0でJWT - Qiita」という記事を書きましたが、順番が逆でした。以下、簡単にマルチユーザシステムのためにSession機能を使って、ユーザ登録やログイン画面を作ってみたいと思います。 1.キャプチャー画面 これから行う設定作業のイメージを明確にするために、出来上がった画面のキャプチャーを貼っておきます。 1-1.User登録画面 パス = /users/new User登録画面です。(yamada userを登録します) 1-2.ログイン画面(未ログイン) パス = /login まだログインしていない状態でログイン画面を表示しています。(yamada us
defmodule Password do def gen(len, l, u, n, s) do if len >= l + u + n + s do base_str() |> Enum.reduce("", & &2<>&1) |> random_stream() |> Stream.reject(&(&1 in ambiguous_chars())) # |> Stream.drop_while(&(&1 in ambiguous_chars())) # 初稿から修正した。こっちではいかんらしい。 |> filter(len, l, u, n, s) |> to_string() else raise ArgumentError, message: "The length must equals to or be greater than the sum of the number
はじめの余談 リアルタイムWebのサーバを構築するために、最初はnode.jsを利用していたのだが、取っつきやすい反面、(一言では言いにくいが)プログラムにどのようなデータがやってくるのかわからない面倒があり、サービスに持ってゆくのに不安があった。そんなこんなで別のものを探った先に Elixir にたどり着いたのだが、これのパターンマッチング最高、自然と想定外のデータが排除されていき、堅牢になるではないか。Erlang だと単一代入の原則で、1回毎に変数名を変えなければならないが、Elixirだと同じ名前でも別の変数だとわかってくれるので、これも最高。関数型プログラミングもこれなら怖くない。 とはいえ、Elixir でのプログラミングにおいて、Hello World 的な簡単な例であれば簡単に情報は得られるが、実際に Web アプリケーションを構築しようとして、Plug を使おうとしても、
はじめに ZACKY こと山崎進です。 前回「ZEAM開発ログ v.0.4.0 型多相かつ型安全なNIFをC言語で書いてみる」から新シリーズということで,型多相で型安全なコード生成について検討しています。今回は生成された LLVM IR のコードを読み解いてみたいと思います。 「ZEAM開発ログ 目次」はこちら LLVM とは LLVM というのは,最近のプログラミング言語処理系のコード生成で広く使われているライブラリです。さまざまな種類のプロセッサのコード生成をすることができます。CPUだけじゃなくて,GPUなんかもできますよ。 LLVM で使われているコードが LLVM IR です。高級言語から LLVM IR に変換するコンパイラを作ってあげれば,LLVM がサポートする様々な種類のプロセッサにコード生成できるようになるので大変ありがたいです。 今回のコードはこちらの GitHub
defmodule Kansuuji do @moduledoc """ Documentation for Kansuuji. """ @units ~w/万 億 兆 京/ @doc """ ## Examples iex> Kansuuji.parse 100 "100" iex> Kansuuji.parse 10000 "1万" iex> Kansuuji.parse 10001 "1万1" iex> Kansuuji.parse 123456789 "1億2345万6789" iex> Kansuuji.parse 100006789 "1億6789" iex> Kansuuji.parse 98765100006789 "98兆7651億6789" iex> Kansuuji.parse 98700100006789 "98兆7001億6789" """ def parse(n
fukuoka.ex代表のpiacereです 今回もご覧いただいて、ありがとうございます ElixirでBDD書けるESpecですが、mix test.watchが効かないため、いちいちコマンド打つのがメンドイのですが、mix test.watchをホンの少しいじれば動くので、deps配下をクイックハックしちゃいます ちなみに、mix test.watchをクイックハックせず、ex_guardを使う方法もあるみたいです お知らせ:Elixirもくもく会(リモート参加OK、入門トラック有)を今月末に開催します 「fukuoka.ex#14:Elixir/Phoenixもくもく会~入門もあるよ」を9/28(金)に開催します 前回は、ゲリラ的に募った「Zoomによるリモート参加」を、今回から正式に受け付けるようになりましたので、福岡以外の都心や地方からでも参加できます(申し込みいただいたら、追っ
# !/usr/bin/env crystal # http://nabetani.sakura.ne.jp/hena/orde27ligmir/ # https://qiita.com/Nabetani/items/0b2f459ec128c89948f4 # x,y D={ '.'=>{ [0,-1]=>[0,-1], #N [1,0]=>[1,0], #E [0,1]=>[0,1], #S [-1,0]=>[-1,0], #W }, '1'=>{ [0,-1]=>[1,0], [1,0]=>[0,-1], [0,1]=>[-1,0], [-1,0]=>[0,1], }, '0'=>{ [0,-1]=>[-1,0], [1,0]=>[0,1], [0,1]=>[1,0], [-1,0]=>[0,-1], }, } H=5;W=5 while line=gets m=line.chomp
(追記)本記事は2022/09/25 に更新しました これまでElixir Ectoについて2本の記事を書いてきましたが、クイックスタート的な記事も書いておきたいと思いました。言葉だけで説明するよりコマンドを打ち込んで説明していきたいと思います。少し離れていると基本的なところを忘れがちなので、自分用の備忘録的な意味合いも強いです。例としてよく使われるであろうコマンドを書きましたが、網羅的な説明はやはり公式サイトを参照するのが良いでしょう。 Ecto.Repo - 公式サイト Ecto.Schema - 公式サイト Ecto.Changeset - 公式サイト Ecto.Query - 公式サイト #0.Ectoの設定 まずはEctoの設定を、実際にプロジェクトを作成しながら行っていきます。mixでpeopleというプロジェクトを作成します。オプションの --sup はこのアプリケーションが
(追記)本記事は2022/10/23 に更新しました Ecto にはテーブル同士を関連付ける Ecto Association の機能があります。関連付けには以下の3つのタイプが考えられます。 one-to-one one-to-many many-to-many Ecto Association は以下の公式サイトで説明されています。今回はこのガイドを実際に実行し、補足説明を加えていきたいと思います。 Ecto Association Guide 0.Ectoの設定 まずは Ecto の設定を、実際にプロジェクトを作成しながら行っていきます。mix で ecto_assoc というプロジェクトを作成します。オプションの --sup はこのアプリケーションが supervision tree を持っていることを示しています。
require "json" def reflect(x) case x when 0+1i; 1+0i when 0-1i; -1+0i when 1+0i; 0+1i when -1+0i; 0-1i end end def solve(map) you = Complex(*map.index("Y").divmod(5+1)) # +1 は「/」の分 light = [you, -1+0i] # 位置と方向のペア visited = [] (5*5*2).times do # 高々 5×5×2 しか進まない visited << light[0] newpos = light[0]+light[1] break unless (0...5)===newpos.real && (0...5)===newpos.imag cell = map[newpos.real*(5+1)+new
これは何? Railsを使って開発をしている人のほとんどが、 おそらく何かしらの認証機能を提供していると思いますが、 その認証機能って初心者の人からすると非常にややこしい。 確かに、Railsが色々やり易くしてくれてるのはわかるけれども、 逆にブラックボックスすぎて全然意味わからんし!みたいなところもあるかと思います。 また、認証はセキュリティを高めるために非常に重要なトピックでもあり、開発者で担当する人が深く理解しておくことが求められると思います。 ただ、認証はアプリやインフラから独立しているものではないため、認証だけよくても他の部分に脆弱性があれば危険であることは変わらない点に注意してください。 そもそも認証ってなんぞ 認証は、アクセス制限機能と思ってもらえれば大丈夫そうです。 アクセスを制御したい場合に認証機能を利用して閲覧ページなどに制限をかける感じです。 認証の種類 Railsで
このように、入力フォームに「javascript」を埋め込む事が、クロスサイトスクリプティング(XSS)の基本的な手法になる。 以上が基本的なXSSの手法になるが、具体的にどういった脅威があるのか。 脅威例 「セッションハイジャック」:訪問者のクッキー(cookie)情報を抜き取ること。結果不正ログインなどを招いてしまう。 例えばECサイトでセッションハイジャックが行われてしまうと、クレジットカード情報など重要な顧客情報が盗まれてしまい、不正に買い物などが行えてしまう。 また広告システムなどのBtoBシステムでも、不正に他社アカウントを乗っ取りログインすることで数値を書き換えるなどができてしまい、大きな被害が出てしまう。 対策(rails) XSSは、ユーザー入力がHTMLのタグやJavascriptとして認識されてしまうことで発生してしまうので、ここへの対策を打っていく事になる。 rai
Capistrano deploy時に発生する SocketError: getaddrinfo: Temporary failure in name resolutionのエラーの原因と解決方法 エラーメッセージの意味 ソケットエラー: 名前解決のために一時的に失敗しました。 エラー原因 ~/.ssh/know_hostsファイルに記載されているリモートサーバーへのsshによる接続情報が古くなっているために、ssh接続できずにエラーになってしまいます。 解決方法 ssh-keygen -R remote_host_name 上記コマンドにより古いssh接続情報を削除する。 (又は手動で vi ~/.ssh/known_hostsでファイルを開いて、対象のリモートサーバーのhostnameが書かれた該当の1行を削除する。) その後再度sshコマンドを実行する。 これにより、新規ssh接続と
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く